@citolab/qti-components 7.0.1 → 7.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/cdn/index.global.js +1 -1
  2. package/cdn/{index.min.js → index.js} +378 -186
  3. package/dist/custom-elements.json +27088 -0
  4. package/dist/{qti-test/index.d.ts → index.d.ts} +163 -2
  5. package/dist/index.js +13601 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/item.css +223 -32
  8. package/dist/{qti-loader → loader}/index.d.ts +1 -1
  9. package/dist/qti-components-jsx.d.ts +29 -25
  10. package/dist/{qti-simple-choice-CynLWb8d.d.cts → qti-simple-choice-DG8ImdPz.d.ts} +2 -2
  11. package/dist/vscode.html-custom-data.json +12 -9
  12. package/package.json +40 -59
  13. package/cdn/index.min.cjs +0 -4489
  14. package/dist/qti-components/index.cjs +0 -6704
  15. package/dist/qti-components/index.cjs.map +0 -1
  16. package/dist/qti-components/index.d.cts +0 -150
  17. package/dist/qti-components/index.d.ts +0 -150
  18. package/dist/qti-components/index.js +0 -6593
  19. package/dist/qti-components/index.js.map +0 -1
  20. package/dist/qti-item/index.cjs +0 -89
  21. package/dist/qti-item/index.cjs.map +0 -1
  22. package/dist/qti-item/index.d.cts +0 -24
  23. package/dist/qti-item/index.d.ts +0 -24
  24. package/dist/qti-item/index.js +0 -65
  25. package/dist/qti-item/index.js.map +0 -1
  26. package/dist/qti-loader/index.cjs +0 -332
  27. package/dist/qti-loader/index.cjs.map +0 -1
  28. package/dist/qti-loader/index.d.cts +0 -20
  29. package/dist/qti-simple-choice-CynLWb8d.d.ts +0 -1185
  30. package/dist/qti-test/index.cjs +0 -4632
  31. package/dist/qti-test/index.cjs.map +0 -1
  32. package/dist/qti-test/index.d.cts +0 -304
  33. package/dist/qti-test/index.js +0 -4599
  34. package/dist/qti-test/index.js.map +0 -1
  35. package/dist/qti-transformers/index.cjs +0 -316
  36. package/dist/qti-transformers/index.cjs.map +0 -1
  37. package/dist/qti-transformers/index.d.cts +0 -75
  38. /package/dist/{qti-loader → loader}/index.js +0 -0
  39. /package/dist/{qti-loader → loader}/index.js.map +0 -0
  40. /package/dist/{qti-transformers → transformers}/index.d.ts +0 -0
  41. /package/dist/{qti-transformers → transformers}/index.js +0 -0
  42. /package/dist/{qti-transformers → transformers}/index.js.map +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/lib/qti-components/index.ts","../../src/lib/qti-components/qti-assessment-item/qti-assessment-item.ts","../../src/lib/decorators/watch.ts","../../src/lib/qti-components/qti-assessment-item/qti-assessment-item.context.ts","../../src/lib/qti-components/qti-assessment-stimulus-ref/qti-assessment-stimulus-ref.ts","../../src/lib/qti-transformers/qti-transformers.ts","../../src/lib/qti-transformers/qti-transform-item.ts","../../src/lib/qti-components/qti-interaction/internal/active-element/active-element.mixin.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-prompt/qti-prompt.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","../../src/lib/qti-components/qti-companion-materials-info/qti-companion-materials-info.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-feedback/qti-feedback-block/qti-feedback-block.ts","../../src/lib/qti-components/qti-feedback/qti-feedback.ts","../../src/lib/qti-components/internal/utils.ts","../../src/lib/qti-components/qti-feedback/qti-feedback-inline/qti-feedback-inline.ts","../../src/lib/qti-components/qti-feedback/qti-modal-feedback/qti-modal-feedback.ts","../../src/lib/qti-components/qti-interaction/qti-extended-text-interaction/qti-extended-text-interaction.ts","../../src/lib/qti-components/qti-interaction/internal/interaction/interaction.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-hottext-interaction/qti-hottext-interaction.ts","../../src/lib/qti-components/qti-interaction/internal/choices/choices.mixin.ts","../../src/lib/qti-components/qti-interaction/qti-inline-choice-interaction/qti-inline-choice-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-choice-interaction/qti-choice-interaction.ts","../../src/lib/qti-components/qti-interaction/internal/shuffle/shuffle-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-outcome-processing/qti-outcome-processing.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-expression.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-condition-expression.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-and/index.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-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-equal-rounded/qti-equal-rounded.ts","../../src/lib/qti-components/qti-response-processing/qti-expression/qti-equal/qti-equal.ts","../../src/lib/qti-components/qti-response-processing/utilities/scoring-helper.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-is-null/qti-is-null.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-mapping/qti-mapping.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-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-interaction/qti-portable-custom-interaction/qti-portable-custom-interaction.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-api.ts","../../src/lib/qti-components/qti-interaction/internal/drag-drop/droppables-mixin.ts","../../src/lib/qti-components/qti-interaction/internal/drag-drop/flippables-mixin.ts","../../src/lib/qti-components/qti-interaction/internal/drag-drop/drag-drop-interaction-mixin.ts","../../src/lib/decorators/live-query.ts","../../src/lib/qti-components/qti-interaction/qti-associate-interaction/qti-associate-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-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-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-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-hotspot-interaction/qti-hotspot-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-match-interaction/qti-match-interaction.ts","../../src/lib/qti-components/qti-interaction/qti-simple-associable-choice.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-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-interaction/qti-slider-interaction/qti-slider-interaction.ts","../../src/lib/qti-components/qti-custom-operator/qti-custom-operator.ts","../../src/lib/qti-components/qti-interaction/qti-associable-hotspot.ts","../../src/lib/qti-components/qti-interaction/qti-gap.ts","../../src/lib/qti-components/qti-interaction/qti-gap-img.ts","../../src/lib/qti-components/qti-interaction/qti-gap-text.ts","../../src/lib/qti-components/qti-interaction/qti-hotspot-choice.ts","../../src/lib/qti-components/qti-interaction/qti-hottext.ts","../../src/lib/qti-components/qti-interaction/qti-inline-choice.ts","../../src/lib/qti-components/qti-interaction/qti-simple-choice.ts"],"sourcesContent":["/* only exported to override or extend for specific purposes */\nexport * from './internal/event-types';\nexport * from './internal/events';\nexport * from './internal/expression-result';\nexport * from './internal/variables';\n/* only exported to override or extend for specific purposes */\nexport * from './qti-assessment-item/qti-assessment-item';\nexport * from './qti-assessment-stimulus-ref/qti-assessment-stimulus-ref';\nexport * from './qti-interaction/internal/active-element/active-element.mixin';\nexport * from './qti-item-body/qti-item-body';\nexport * from './qti-prompt/qti-prompt';\nexport * from './qti-stylesheet/qti-stylesheet';\n/* start response and outcome */\nexport * from './qti-variable-declaration/qti-outcome-declaration/qti-outcome-declaration';\nexport * from './qti-variable-declaration/qti-response-declaration/qti-response-declaration';\n/* end response and outcome */\nexport * from './qti-companion-materials-info/qti-companion-materials-info';\nexport * from './qti-rubric-block/qti-content-body';\nexport * from './qti-rubric-block/qti-rubric-block';\n/* start feedback */\nexport * from './qti-feedback/qti-feedback-block/qti-feedback-block';\nexport * from './qti-feedback/qti-feedback-inline/qti-feedback-inline';\nexport * from './qti-feedback/qti-modal-feedback/qti-modal-feedback';\n/* end feedback */\n/* start textentryinteraction */\nexport * from './qti-interaction/qti-extended-text-interaction/qti-extended-text-interaction';\nexport * from './qti-interaction/qti-text-entry-interaction/qti-text-entry-interaction';\n/* end textentryinteraction */\n/* start hottext */\nexport * from './qti-interaction/qti-hottext-interaction/qti-hottext-interaction';\n/* end hottext */\n/* start inlinechoice */\nexport * from './qti-interaction/qti-inline-choice-interaction/qti-inline-choice-interaction';\n/* end inlinechoice */\n/* start choiceinteraction */\nexport * from './qti-interaction/qti-choice-interaction/qti-choice-interaction';\n/* end choiceinteraction */\nexport * from './qti-outcome-processing/qti-outcome-processing';\nexport * from './qti-response-processing';\n/* start custom interactions */\nexport * from './qti-interaction/qti-portable-custom-interaction/qti-portable-custom-interaction';\n/* end custom interactions */\n/* start only preview items */\nexport * from './qti-interaction/qti-associate-interaction/qti-associate-interaction';\nexport * from './qti-interaction/qti-custom-interaction/qti-custom-interaction';\nexport * from './qti-interaction/qti-end-attempt-interaction/qti-end-attempt-interaction';\nexport * from './qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction';\nexport * from './qti-interaction/qti-graphic-associate-interaction/qti-graphic-associate-interaction';\nexport * from './qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction';\nexport * from './qti-interaction/qti-graphic-order-interaction/qti-graphic-order-interaction';\nexport * from './qti-interaction/qti-hotspot-interaction/qti-hotspot-interaction';\nexport * from './qti-interaction/qti-match-interaction/qti-match-interaction';\nexport * from './qti-interaction/qti-media-interaction/qti-media-interaction';\nexport * from './qti-interaction/qti-order-interaction/qti-order-interaction';\nexport * from './qti-interaction/qti-position-object-interaction/qti-position-object-interaction';\nexport * from './qti-interaction/qti-position-object-interaction/qti-position-object-stage';\nexport * from './qti-interaction/qti-select-point-interaction/qti-select-point-interaction';\nexport * from './qti-interaction/qti-slider-interaction/qti-slider-interaction';\n/* end only preview items */\nexport * from './qti-assessment-item/qti-assessment-item.context';\nexport * from './qti-custom-operator/qti-custom-operator';\nexport * from './qti-interaction/internal/interaction/interaction';\nexport * from './qti-interaction/qti-associable-hotspot';\nexport * from './qti-interaction/qti-gap';\nexport * from './qti-interaction/qti-gap-img';\nexport * from './qti-interaction/qti-gap-text';\nexport * from './qti-interaction/qti-hotspot-choice';\nexport * from './qti-interaction/qti-hottext';\nexport * from './qti-interaction/qti-inline-choice';\nexport * from './qti-interaction/qti-simple-associable-choice';\nexport * from './qti-interaction/qti-simple-choice';\n\nconsole.log(\n '%cC¿TO%cLab%c: qti-components loaded',\n 'font-weight:bold; color:green',\n 'font-family: \"PT Sans\", font-weight:bold; color:green; font-size: smaller;vertical-align: sub',\n 'font-weight:unset'\n);\n\n// css for font pt-sans and subscript and green\n","import { provide } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { watch } from '../../decorators/watch';\nimport type { InteractionChangedDetails, OutcomeChangedDetails } from '../internal/event-types';\nimport type { ResponseInteraction } from '../internal/expression-result';\nimport type { VariableDeclaration, VariableValue } from '../internal/variables';\nimport { OutcomeVariable, ResponseVariable } from '../internal/variables';\nimport type { QtiFeedback } from '../qti-feedback/qti-feedback';\nimport type { Interaction } from '../qti-interaction/internal/interaction/interaction';\nimport type { QtiResponseProcessing } from '../qti-response-processing';\nimport { ItemContext, itemContext, itemContextVariables } from './qti-assessment-item.context';\nimport QtiRegisterVariable from '../internal/events/qti-register-variable';\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 * @status stable\n * @since 4.0\n *\n * @dependency qti-feedback\n * @dependency qti-responseprocessing\n *\n * @slot - The default slot where all the other QTI 3 item structures go.\n *\n * @event qti-interaction-changed - Emitted when an interaction is changed.\n * @event qti-outcome-changed - Emitted when an outcome has changed.\n * @event qti-response-processing - Emitted when response-processing is called.\n *\n */\n@customElement('qti-assessment-item')\nexport class QtiAssessmentItem extends LitElement {\n @property({ type: String }) title: string;\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: Boolean }) disabled: boolean;\n @watch('disabled', { waitUntilFirstUpdate: true })\n _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 _handleReadonlyChange = (_: boolean, readonly: boolean) =>\n this._interactionElements.forEach(ch => (ch.readonly = readonly));\n\n @provide({ context: itemContext })\n private _context: ItemContext = {\n identifier: this.getAttribute('identifier'),\n variables: itemContextVariables\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 { ...variable, ...matchingValue };\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.value = variable.value as string | string[];\n }\n }\n\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 async connectedCallback(): Promise<void> {\n super.connectedCallback();\n await this.updateComplete;\n this._emit<{ detail: QtiAssessmentItem }>('qti-assessment-item-connected', this);\n }\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.value = response.response;\n }\n }\n }\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n\n constructor() {\n super();\n this.addEventListener('qti-register-variable', (e: QtiRegisterVariable) => {\n this._context = { ...this._context, variables: [...this._context.variables, e.detail.variable] };\n this._initialContext = this._context;\n e.stopPropagation();\n });\n this.addEventListener('qti-register-feedback', (e: CustomEvent<QtiFeedback>) => {\n e.stopPropagation();\n const feedbackElement = e.detail;\n this._feedbackElements.push(feedbackElement);\n feedbackElement.checkShowFeedback(feedbackElement.outcomeIdentifier);\n });\n this.addEventListener('qti-register-interaction', (e: CustomEvent<null>) => {\n e.stopPropagation();\n this._interactionElements.push(e.target as Interaction);\n });\n this.addEventListener('end-attempt', (e: CustomEvent<{ responseIdentifier: string; countAttempt: boolean }>) => {\n const { responseIdentifier, countAttempt } = e.detail;\n this.validate();\n this.updateResponseVariable(responseIdentifier, 'true');\n this.processResponse(countAttempt);\n });\n\n this.addEventListener(\n // wordt aangeroepen vanuit de processingtemplate\n 'qti-set-outcome-value',\n (e: CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>) => {\n const { outcomeIdentifier, value } = e.detail;\n this.updateOutcomeVariable(outcomeIdentifier, value);\n e.stopPropagation();\n }\n );\n\n this.addEventListener('qti-interaction-response', this.handleUpdateResponseVariable);\n }\n\n public showCorrectResponse(show: boolean) {\n const responseVariables = this._context.variables.filter(\n (vari: ResponseVariable | OutcomeVariable) => 'correctResponse' in vari && vari.correctResponse\n ) as ResponseVariable[];\n const responses = responseVariables.map(cr => {\n return {\n responseIdentifier: cr.identifier,\n response: cr.correctResponse\n };\n });\n for (const response of responses) {\n const interaction: Interaction | undefined = this._interactionElements.find(\n i => i.getAttribute('response-identifier') === response.responseIdentifier\n );\n if (interaction) {\n interaction.correctResponse = show ? response.response : '';\n }\n }\n }\n\n public processResponse(countNumAttempts: boolean = true): boolean {\n this.validate();\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 if (countNumAttempts) {\n this.updateOutcomeVariable(\n 'numAttempts',\n (+this._context.variables.find(v => v.identifier === 'numAttempts')?.value + 1).toString()\n );\n }\n\n this._emit('qti-response-processed');\n return true;\n }\n\n public resetResponses() {\n this._context = this._initialContext;\n }\n\n public getResponse(identifier: string): Readonly<ResponseVariable> {\n return this.getVariable(identifier) as ResponseVariable;\n }\n\n public getOutcome(identifier: string): Readonly<OutcomeVariable> {\n return this.getVariable(identifier) as OutcomeVariable;\n }\n\n public 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 private handleUpdateResponseVariable(event: CustomEvent<ResponseInteraction>) {\n const { responseIdentifier, response } = event.detail;\n this.updateResponseVariable(responseIdentifier, response);\n }\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 this._emit<InteractionChangedDetails>('qti-interaction-changed', {\n item: this.identifier,\n responseIdentifier: identifier,\n response: Array.isArray(value) ? [...value] : value\n });\n\n if (this.adaptive === 'false') {\n // if adapative, completionStatus is set by the processing template\n this.updateOutcomeVariable('completionStatus', this._getCompletionStatus());\n }\n }\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 : [...v.value, value as string]\n };\n })\n };\n this._feedbackElements.forEach(fe => fe.checkShowFeedback(identifier));\n\n this._emit<OutcomeChangedDetails>('qti-outcome-changed', {\n item: this.identifier,\n outcomeIdentifier: identifier,\n value: this._context.variables.find(v => v.identifier === identifier)?.value\n });\n }\n\n public validate(): boolean | null {\n if (this._interactionElements.every(interactionElement => interactionElement.validate())) return true;\n if (this._interactionElements.some(interactionElement => interactionElement.validate())) return false;\n return null;\n }\n\n private _getCompletionStatus(): 'completed' | 'incomplete' | 'not_attempted' | 'unknown' {\n const valid = this.validate();\n if (valid === true) return 'completed';\n if (valid === false) return 'incomplete';\n return 'not_attempted';\n }\n\n private _emit<T>(name, detail = null) {\n this.dispatchEvent(\n new CustomEvent<T>(name, {\n bubbles: true,\n composed: true,\n detail\n })\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-item': QtiAssessmentItem;\n }\n}\n","import type { LitElement } from 'lit';\n\ntype UpdateHandler = (prev?: unknown, next?: unknown) => void;\n\ntype NonUndefined<A> = A extends undefined ? never : A;\n\nexport type UpdateHandlerFunctionKeys<T extends object> = {\n [K in keyof T]-?: NonUndefined<T[K]> extends UpdateHandler ? K : never;\n}[keyof T];\n\ninterface WatchOptions {\n /**\n * If true, will only start watching after the initial update/render\n */\n waitUntilFirstUpdate?: boolean;\n}\n\n/**\n * Runs when observed properties change, e.g. @property or @state, but before the component updates. To wait for an\n * update to complete after a change occurs, use `await this.updateComplete` in the handler. To start watching after the\n * initial update/render, use `{ waitUntilFirstUpdate: true }` or `this.hasUpdated` in the handler.\n *\n * Usage:\n *\n * @watch('propName')\n * handlePropChange(oldValue, newValue) {\n * ...\n * }\n */\nexport function watch(propertyName: string | string[], options?: WatchOptions) {\n const resolvedOptions: Required<WatchOptions> = {\n waitUntilFirstUpdate: false,\n ...options\n };\n return <ElemClass extends LitElement>(\n proto: ElemClass,\n decoratedFnName: UpdateHandlerFunctionKeys<ElemClass> | any\n ) => {\n // @ts-expect-error - update is a protected property\n const { update } = proto;\n const watchedProperties = Array.isArray(propertyName) ? propertyName : [propertyName];\n\n // @ts-expect-error - update is a protected property\n proto.update = function (this: ElemClass, changedProps: Map<keyof ElemClass, ElemClass[keyof ElemClass]>) {\n watchedProperties.forEach(property => {\n const key = property as keyof ElemClass;\n if (changedProps.has(key)) {\n const oldValue = changedProps.get(key);\n const newValue = this[key];\n\n if (oldValue !== newValue) {\n if (!resolvedOptions.waitUntilFirstUpdate || this.hasUpdated) {\n (this[decoratedFnName] as unknown as UpdateHandler)(oldValue, newValue);\n }\n }\n }\n });\n\n update.call(this, changedProps);\n };\n };\n}\n","import { createContext } from '@lit/context';\nimport { VariableDeclaration } from '../internal/variables';\n\nexport interface ItemContext {\n href?: string;\n identifier: string;\n variables: ReadonlyArray<VariableDeclaration<string | string[]>>;\n}\n\nexport const itemContextVariables = [\n {\n identifier: 'completionStatus',\n cardinality: 'single',\n baseType: 'string',\n value: 'unknown',\n type: 'outcome'\n },\n {\n identifier: 'numAttempts',\n cardinality: 'single',\n baseType: 'integer',\n value: '0',\n type: 'response'\n }\n] as VariableDeclaration<string | string[]>[];\n\nexport const itemContext = createContext<ItemContext>(Symbol('item'));\n","import { LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { qtiTransformItem } from '../../qti-transformers';\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 /**\n * The identifier of the stimulus.\n */\n @property({ type: String }) identifier = '';\n\n /**\n * The href of the stimulus.\n */\n @property({ type: String }) href = '';\n\n /**\n * Lifecycle method called when the element is connected to the DOM.\n * Loads and appends the stimulus if the 'qti-assessment-stimulus-ref-connected' event is not prevented.\n */\n public async connectedCallback(): Promise<void> {\n super.connectedCallback();\n\n const event = new Event('qti-assessment-stimulus-ref-connected', { cancelable: true, bubbles: true });\n const isPrevented = this.dispatchEvent(event);\n\n if (isPrevented) {\n const item = this.closest('qti-assessment-item');\n\n const stimulusRef = item.querySelector(`[data-stimulus-idref=${this.identifier}]`);\n if (stimulusRef) {\n await this.updateStimulusRef(stimulusRef);\n } else {\n console.warn(`Stimulus with data-stimulus-idref ${this.identifier} not found`);\n }\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","const xml = String.raw;\n\n/* <!-- convert CDATA to comments -->\n <xsl:template match=\"text()[contains(., 'CDATA')]\">\n <xsl:comment>\n <xsl:value-of select=\".\"/>\n </xsl:comment>\n</xsl:template>\n*/\n\n/*\n <!-- remove xml comments -->\n <xsl:template match=\"comment()\" />\n */\n\nconst xmlToHTML = xml`<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n<xsl:output method=\"html\" version=\"5.0\" encoding=\"UTF-8\" indent=\"yes\" />\n <xsl:template match=\"@*|node()\">\n <xsl:copy>\n <xsl:apply-templates select=\"@*|node()\"/>\n </xsl:copy>\n </xsl:template>\n\n <!-- remove existing namespaces -->\n <xsl:template match=\"*\">\n <!-- remove element prefix -->\n <xsl:element name=\"{local-name()}\">\n <!-- process attributes -->\n <xsl:for-each select=\"@*\">\n <!-- remove attribute prefix -->\n <xsl:attribute name=\"{local-name()}\">\n <xsl:value-of select=\".\"/>\n </xsl:attribute>\n </xsl:for-each>\n <xsl:apply-templates/>\n </xsl:element>\n</xsl:template>\n</xsl:stylesheet>`;\n\n// Function to extend elements with a specific tag name by adding an extension suffix\nexport function extendElementName(xmlFragment: XMLDocument, tagName: string, extension: string) {\n xmlFragment.querySelectorAll(tagName).forEach(element => {\n const newTagName = `${tagName}-${extension}`;\n const newElement = createElementWithNewTagName(element, newTagName);\n element.replaceWith(newElement);\n });\n}\n\n// Function to extend any element with a specific class pattern (e.g., \"extend:suffix\")\nexport function extendElementsWithClass(xmlFragment: XMLDocument, classNamePattern: string) {\n xmlFragment.querySelectorAll('*').forEach(element => {\n const classList = element.classList;\n if (classList) {\n classList.forEach(className => {\n if (className.startsWith(`${classNamePattern}:`)) {\n const suffix = className.slice(`${classNamePattern}:`.length);\n const newTagName = `${element.nodeName}-${suffix}`;\n const newElement = createElementWithNewTagName(element, newTagName);\n element.replaceWith(newElement);\n }\n });\n }\n });\n}\n\n// Helper function to create a new element with a new tag name and copy attributes and children\nfunction createElementWithNewTagName(element, newTagName) {\n const newElement = document.createElement(newTagName);\n // Copy attributes\n for (const attr of element.attributes) {\n newElement.setAttribute(attr.name, attr.value);\n }\n // Copy child nodes\n while (element.firstChild) {\n newElement.appendChild(element.firstChild);\n }\n return newElement;\n}\n\nexport function itemsFromTest(xmlFragment: DocumentFragment) {\n const items: { identifier: string; href: string; category: string }[] = [];\n xmlFragment.querySelectorAll('qti-assessment-item-ref').forEach(el => {\n const identifier = el.getAttribute('identifier');\n const href = el.getAttribute('href');\n const category = el.getAttribute('category');\n items.push({ identifier, href, category });\n });\n return items;\n}\n\nlet currentRequest: XMLHttpRequest | null = null;\n\nexport function loadXML(url, cancelPreviousRequest = false) {\n if (cancelPreviousRequest && currentRequest !== null) {\n currentRequest.abort(); // Abort the ongoing request if there is one\n }\n\n return new Promise<XMLDocument | null>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n currentRequest = xhr; // Store the current request\n\n xhr.open('GET', url, true);\n xhr.responseType = 'document';\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseXML);\n } else {\n reject(xhr.statusText);\n }\n };\n\n xhr.onerror = () => {\n reject(xhr.statusText);\n };\n\n xhr.send();\n });\n}\n\nexport function parseXML(xmlDocument: string) {\n const parser = new DOMParser();\n const xmlFragment = parser.parseFromString(xmlDocument, 'text/xml');\n return xmlFragment;\n}\n\nexport function toHTML(xmlFragment: Document): DocumentFragment {\n const processor = new XSLTProcessor();\n const xsltDocument = new DOMParser().parseFromString(xmlToHTML, 'text/xml');\n processor.importStylesheet(xsltDocument);\n const itemHTMLFragment = processor.transformToFragment(xmlFragment, document);\n return itemHTMLFragment;\n}\n\nexport function setLocation(xmlFragment: DocumentFragment, location: string) {\n if (!location.endsWith('/')) {\n location += '/';\n }\n\n xmlFragment.querySelectorAll('[src],[href],[primary-path]').forEach(elWithSrc => {\n let attr: 'src' | 'href' | 'primary-path' | '' = '';\n\n if (elWithSrc.getAttribute('src')) {\n attr = 'src';\n }\n if (elWithSrc.getAttribute('href')) {\n attr = 'href';\n }\n if (elWithSrc.getAttribute('primary-path')) {\n attr = 'primary-path';\n }\n const attrValue = elWithSrc.getAttribute(attr)?.trim();\n\n if (!attrValue.startsWith('data:') && !attrValue.startsWith('http')) {\n const newSrcValue = location + encodeURI(attrValue);\n elWithSrc.setAttribute(attr, newSrcValue);\n }\n });\n}\n\nexport function convertCDATAtoComment(xmlFragment: DocumentFragment) {\n const cdataElements = xmlFragment.querySelectorAll('qti-custom-operator[class=\"js.org\"] > qti-base-value');\n cdataElements.forEach(element => {\n const commentText = document.createComment(element.textContent);\n element.replaceChild(commentText, element.firstChild);\n });\n}\n\nexport function stripStyleSheets(xmlFragment: DocumentFragment) {\n // remove qti-stylesheet tag\n xmlFragment.querySelectorAll('qti-stylesheet').forEach(stylesheet => stylesheet.remove());\n}\n","/**\n * Browser based QTI-XML to HTML transformer.\n * Returns an object with methods to load, parse, transform and serialize QTI XML items.\n * @returns An object with methods to load, parse, transform and serialize QTI XML items.\n * @example\n * const qtiTransformer = qtiTransformItem();\n * await qtiTransformer.load('path/to/xml/file.xml');\n * qtiTransformer.path('/assessmentItem/itemBody');\n * const html = qtiTransformer.html();\n * const xml = qtiTransformer.xml();\n * const htmldoc = qtiTransformer.htmldoc();\n * const xmldoc = qtiTransformer.xmldoc();\n *\n * qtiTransformItem().parse(storyXML).html()\n */\n\nimport {\n convertCDATAtoComment,\n extendElementName,\n extendElementsWithClass,\n loadXML,\n parseXML,\n setLocation,\n stripStyleSheets,\n toHTML\n} from './qti-transformers';\n\nexport type transformItemApi = {\n load: (uri: string, cancelPreviousRequest?: boolean) => Promise<transformItemApi>;\n parse: (xmlString: string) => transformItemApi;\n path: (location: string) => transformItemApi;\n fn: (fn: (xmlFragment: XMLDocument) => void) => transformItemApi;\n pciHooks: (uri: string) => transformItemApi;\n extendElementName: (elementName: string, extend: string) => transformItemApi;\n extendElementsWithClass: (param?: string) => transformItemApi;\n customInteraction: (baseRef: string, baseItem: string) => transformItemApi;\n convertCDATAtoComment: () => transformItemApi;\n stripStyleSheets: () => transformItemApi;\n html: () => string;\n xml: () => string;\n htmlDoc: () => DocumentFragment;\n xmlDoc: () => XMLDocument;\n};\n\nexport const qtiTransformItem = () => {\n let xmlFragment: XMLDocument;\n\n const api: transformItemApi = {\n async load(uri: string, cancelPreviousRequest = false): Promise<typeof api> {\n return new Promise<typeof api>(resolve => {\n loadXML(uri, cancelPreviousRequest).then(xml => {\n xmlFragment = xml;\n // set the base path for images and other resources,\n // you probably want to set the base path to the document root else you can use the path method to set it\n api.path(uri.substring(0, uri.lastIndexOf('/')));\n return resolve(api);\n });\n });\n },\n parse(xmlString: string): typeof api {\n xmlFragment = parseXML(xmlString);\n return api;\n },\n path: (location: string): typeof api => {\n setLocation(xmlFragment, location);\n return api;\n },\n fn(fn: (xmlFragment: XMLDocument) => void): typeof api {\n fn(xmlFragment);\n return api;\n },\n pciHooks(uri: string): typeof api {\n const attributes = ['hook', 'module'];\n const documentPath = uri.substring(0, uri.lastIndexOf('/'));\n for (const attribute of attributes) {\n const srcAttributes = xmlFragment.querySelectorAll('[' + attribute + ']');\n srcAttributes.forEach(node => {\n const srcValue = node.getAttribute(attribute)!;\n if (!srcValue.startsWith('data:') && !srcValue.startsWith('http')) {\n // Just paste the relative path of the src location after the documentrootPath\n // old pcis can have a .js, new pci's don't\n node.setAttribute('base-url', uri);\n node.setAttribute(\n 'module',\n documentPath + '/' + encodeURI(srcValue + (srcValue.endsWith('.js') ? '' : '.js'))\n );\n }\n });\n }\n return api;\n },\n extendElementName: (tagName: string, extension: string): typeof api => {\n extendElementName(xmlFragment, tagName, extension);\n return api;\n },\n extendElementsWithClass: (param: string = 'extend'): typeof api => {\n extendElementsWithClass(xmlFragment, param);\n return api;\n },\n customInteraction(baseRef: string, baseItem: string): typeof api {\n const qtiCustomInteraction = xmlFragment.querySelector('qti-custom-interaction');\n const qtiCustomInteractionObject = qtiCustomInteraction.querySelector('object');\n\n qtiCustomInteraction.setAttribute('data-base-ref', baseRef);\n qtiCustomInteraction.setAttribute('data-base-item', baseRef + baseItem);\n qtiCustomInteraction.setAttribute('data', qtiCustomInteractionObject.getAttribute('data'));\n qtiCustomInteraction.setAttribute('width', qtiCustomInteractionObject.getAttribute('width'));\n qtiCustomInteraction.setAttribute('height', qtiCustomInteractionObject.getAttribute('height'));\n\n qtiCustomInteraction.removeChild(qtiCustomInteractionObject);\n return api;\n },\n convertCDATAtoComment(): typeof api {\n convertCDATAtoComment(xmlFragment);\n return api;\n },\n stripStyleSheets(): typeof api {\n stripStyleSheets(xmlFragment);\n return api;\n },\n html() {\n return new XMLSerializer().serializeToString(toHTML(xmlFragment));\n },\n xml(): string {\n return new XMLSerializer().serializeToString(xmlFragment);\n },\n htmlDoc() {\n return toHTML(xmlFragment);\n },\n xmlDoc(): XMLDocument {\n return xmlFragment; // new XMLSerializer().serializeToString(xmlFragment);\n }\n };\n return api;\n};\n","import { ComplexAttributeConverter, LitElement, html } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { watch } from '../../../../decorators/watch';\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 { customElement } from 'lit/decorators.js';\nimport { html, LitElement } from 'lit';\nimport styles from './qti-item-body.styles';\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 *\n */\n@customElement('qti-item-body')\nexport class QtiItemBody extends LitElement {\n static styles: CSSResultGroup = styles;\n\n override render() {\n return html`<slot 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 { 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 { LitElement, PropertyValueMap } from 'lit';\nimport { customElement } from 'lit/decorators.js';\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';\nimport { BaseType, Cardinality } from '../../internal/expression-result';\nimport { OutcomeVariable } from '../../internal/variables';\nimport { ItemContext, itemContext } from '../../qti-assessment-item/qti-assessment-item.context';\nimport { QtiVariableDeclaration } from '../qti-variable-declaration';\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 = parseInt(entry.getAttribute('source-value'));\n const targetValue = parseInt(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 const outcomeVariable: OutcomeVariable = {\n identifier: this.identifier,\n cardinality: this.cardinality,\n baseType: this.baseType,\n type: 'outcome',\n value: null,\n interpolationTable: this.interpolationTable,\n externalScored: this.externalScored\n };\n outcomeVariable.value = this.defaultValues(outcomeVariable);\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';\nimport { VariableDeclaration } from '../internal/variables';\n\n@customElement('qti-variabledeclaration')\nexport class QtiVariableDeclaration extends LitElement {\n override render() {\n return html`<slot></slot>`;\n }\n\n protected defaultValues(variable: VariableDeclaration<string | string[] | null>) {\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 || variable.cardinality === 'multiple' || variable.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';\nimport { BaseType, Cardinality } from '../../internal/expression-result';\nimport { ResponseVariable } from '../../internal/variables';\nimport { ItemContext, itemContext } from '../../qti-assessment-item/qti-assessment-item.context';\nimport { QtiMapping } from '../../qti-response-processing/qti-expression/qti-mapping/qti-mapping';\nimport { QtiVariableDeclaration } from '../qti-variable-declaration';\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\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 value: null,\n type: 'response',\n candidateResponse: null\n };\n responseVariable.value = this.defaultValues(responseVariable);\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;\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);\n values[i].remove();\n }\n }\n }\n return result;\n }\n\n private get mapping() {\n return this.querySelector('qti-mapping') as QtiMapping;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-response-declaration': QtiResponseDeclaration;\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 { 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';\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 this.setAttribute('slot', 'qti-rubric-block');\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 override connectedCallback(): void {\n super.connectedCallback();\n // by default put this in a slot in the item-body\n this.setAttribute('slot', 'qti-rubric-block');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-rubric-block': QtiRubricBlock;\n }\n}\n","import { PropertyValueMap, css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\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 protected firstUpdated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n this.checkShowFeedback(this.outcomeIdentifier);\n }\n}\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-feedback-block': QtiFeedbackBlock;\n }\n}\n","import { consume } from '@lit/context';\nimport { LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { IsNullOrUndefined } from '../internal/utils';\nimport { itemContext, ItemContext } from '../qti-assessment-item/qti-assessment-item.context';\n\nexport abstract class QtiFeedback extends LitElement {\n @property({ type: String, attribute: 'show-hide' })\n protected showHide: string;\n\n @property({ type: String, attribute: 'outcome-identifier' })\n public outcomeIdentifier: string;\n\n @property({ type: String })\n protected identifier: string;\n\n @property({ type: String, attribute: false })\n public showStatus: string;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n private _context?: ItemContext;\n\n public override connectedCallback() {\n super.connectedCallback();\n this.dispatchEvent(\n new CustomEvent<QtiFeedback>('qti-register-feedback', {\n bubbles: true,\n composed: true,\n detail: this\n })\n );\n }\n\n public checkShowFeedback(outcomeIdentifier: string) { \n const outcomeVariable = this._context.variables.find(v => v.identifier === outcomeIdentifier) || null;;\n\n if (this.outcomeIdentifier !== outcomeIdentifier || !outcomeVariable) return;\n let isFound = false;\n if (Array.isArray(outcomeVariable.value)) {\n isFound = outcomeVariable.value.includes(this.identifier);\n } else {\n isFound =\n (!IsNullOrUndefined(this.identifier) &&\n !IsNullOrUndefined(outcomeVariable?.value) &&\n this.identifier === outcomeVariable.value) ||\n false;\n }\n\n this.showFeedback(isFound);\n }\n\n private showFeedback(value: boolean) { \n this.showStatus = (value && this.showHide === 'show') || (!value && this.showHide === 'hide') ? 'on' : 'off'; \n }\n}\n","export const decimalSeparator = () => {\n return new Intl.NumberFormat().format(0.1).replace(/\\d/g, '');\n};\n\nexport const convertNumberToUniveralFormat = (number: number | string) => {\n // check if type is string\n if (typeof number === 'string') {\n return number;\n }\n const dSep = decimalSeparator();\n if (dSep === '.') {\n return number.toLocaleString();\n } else {\n return number.toString().replace('.', '').replace(dSep, '.');\n }\n};\n\nexport function IsNullOrUndefined(value: unknown) {\n return value === null || value === undefined;\n}\n\nexport function 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","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\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=\"${this.showStatus}\"></slot> `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-feedback-inline': QtiFeedbackInline;\n }\n}\n","import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { QtiFeedback } from '../qti-feedback';\n\n@customElement('qti-modal-feedback')\nexport class QtiModalFeedback 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=\"${this.showStatus}\"></slot> `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-modal-feedback': QtiModalFeedback;\n }\n}\n","import { css, html } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { Interaction } from '../internal/interaction/interaction';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { watch } from '../../../decorators/watch';\n\n@customElement('qti-extended-text-interaction')\nexport class QtiExtendedTextInteraction extends Interaction {\n @state()\n private _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-nteraction 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 @state()\n private _value = '';\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 get value(): string | string[] {\n return this._value;\n }\n set value(val: string | string[]) {\n if (typeof val === 'string') {\n this._value = val;\n const formData = new FormData();\n formData.append(this.responseIdentifier, val);\n this._internals.setFormValue(formData);\n this.validate();\n } else {\n throw new Error('Value must be a string');\n }\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._value !== '' && textarea.checkValidity();\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 static override get styles() {\n return [\n 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 ];\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._value}\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._value !== input.value) {\n this.value = input.value;\n this.saveResponse(input.value);\n }\n }\n\n private 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 { property, state } from 'lit/decorators.js';\nimport { LitElement } from 'lit';\nimport { IInteraction } from './interaction.interface';\n\nexport abstract class Interaction extends LitElement implements IInteraction {\n static formAssociated = true;\n\n @property({ type: String, attribute: 'response-identifier' }) responseIdentifier;\n\n @property({ reflect: true, type: Boolean }) disabled = false;\n\n @property({ reflect: true, type: Boolean }) readonly = false;\n\n @state()\n protected _correctResponse: string | string[];\n protected _internals: ElementInternals;\n\n constructor() {\n super();\n this._internals = this.attachInternals();\n }\n\n abstract validate(): boolean;\n\n public reportValidity(): boolean {\n return this._internals.reportValidity();\n }\n\n public reset(): void {\n this.value = '';\n }\n\n abstract get value(): string | string[];\n abstract set value(val: string | string[]);\n\n public get correctResponse(): string | string[] {\n return this._correctResponse;\n }\n set correctResponse(value: string | string[]) {\n this._correctResponse = value;\n }\n\n public override connectedCallback() {\n super.connectedCallback();\n\n this.dispatchEvent(\n new CustomEvent('qti-register-interaction', {\n bubbles: true,\n composed: true,\n cancelable: false\n })\n );\n }\n\n public saveResponse(value: string | string[]) {\n this.dispatchEvent(\n new CustomEvent('qti-interaction-response', {\n bubbles: true,\n composed: true,\n cancelable: false,\n detail: {\n responseIdentifier: this.responseIdentifier,\n response: Array.isArray(value) ? [...value] : value\n }\n })\n );\n }\n}\n","import { CSSResultGroup, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef } from 'lit/directives/ref.js';\nimport { Interaction } from '../internal/interaction/interaction';\nimport styles from './qti-text-entry-interaction.styles';\n@customElement('qti-text-entry-interaction')\nexport class QtiTextEntryInteraction extends Interaction {\n static styles: CSSResultGroup = styles;\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 private _value = '';\n\n inputRef = createRef<HTMLInputElement>();\n\n get value(): string | string[] {\n return this._value;\n }\n set value(val: string | string[]) {\n if (typeof val === 'string') {\n this._value = val;\n const formData = new FormData();\n formData.append(this.responseIdentifier, val);\n this._internals.setFormValue(formData);\n this.validate();\n } else {\n throw new Error('Value must be a string');\n }\n }\n\n public override validate() {\n const input = this.shadowRoot.querySelector('input');\n if (!input) return false;\n if (this.patternMask && this.dataPatternmaskMessage) {\n // Clear any custom error if the input is valid\n this._internals.setValidity({});\n input.setCustomValidity(''); // Clear the custom message\n const isValid = input.checkValidity();\n if (!isValid) {\n // Set custom error if invalid\n this._internals.setValidity({ customError: true }, this.dataPatternmaskMessage);\n input.setCustomValidity(this.dataPatternmaskMessage); // Set custom message only if invalid\n }\n } else {\n const isValid = input.checkValidity();\n this._internals.setValidity(isValid ? {} : { customError: false });\n }\n return this._value !== '' && input.checkValidity();\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._value}\"\n pattern=\"${ifDefined(this.patternMask ? this.patternMask : undefined)}\"\n maxlength=${1000}\n ?disabled=\"${this.disabled}\"\n ?readonly=\"${this.readonly}\"\n />\n <div part=\"correct\">${this._correctResponse}</div>\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._value !== input.value) {\n this.value = input.value;\n this.saveResponse(input.value);\n }\n }\n\n override reportValidity() {\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._value = '';\n }\n\n private setEmptyAttribute(text: string) {\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 [part='correct'] {\n position: absolute;\n width: 100%;\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","import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { Interaction } from '../internal/interaction/interaction';\n\n@customElement('qti-hottext-interaction')\nexport class QtiHottextInteraction extends ChoicesMixin(Interaction, 'qti-hottext') {\n override connectedCallback() {\n super.connectedCallback();\n this.setAttribute('qti-hottext-interaction', '');\n }\n\n override render = () => html`<slot></slot>`;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-hottext-interaction': QtiHottextInteraction;\n }\n}\n","import { property, query } from 'lit/decorators.js';\nimport { watch } from '../../../../decorators/watch';\n\nimport { ChoiceInterface } from '../active-element/active-element.mixin';\nimport { Interaction } from '../interaction/interaction';\nimport { IInteraction } from '../interaction/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 correctResponse: string | string[];\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('#validationMessage')\n private _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 private _value: string | string[] = '';\n\n get value(): string | string[] {\n return Array.isArray(this._value) ? this._value.join(',') : this._value;\n }\n\n set value(val: string | string[]) {\n if (this.maxChoices > 1 && typeof val === 'string') {\n this._value = val.split(',');\n } else {\n this._value = val;\n }\n // Assuming this.value is an array of strings\n if (Array.isArray(this._value)) {\n const formData = new FormData();\n this._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(this._value);\n }\n this._updateChoiceSelection();\n }\n\n public get correctResponse(): string | string[] {\n return this._correctResponse;\n }\n\n public set correctResponse(value: string | string[]) {\n this._correctResponse = value;\n const responseArray = Array.isArray(value) ? value : [value];\n this._choiceElements.forEach(choice => {\n choice.internals.states.delete('correct-response');\n choice.internals.states.delete('incorrect-response');\n if (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 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 = this.dataset.maxSelectionsMessage || `You can select at most ${this.maxChoices} choices.`;\n } else if (selectedCount < this.minChoices) {\n isValid = false;\n validityMessage = this.dataset.minSelectionsMessage || `You must select at least ${this.minChoices} choices.`;\n }\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 this.reportValidity();\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 this._validationMessageElement.style.display = 'block';\n } else {\n this._validationMessageElement.textContent = '';\n this._validationMessageElement.style.display = 'none';\n }\n }\n return this._internals.validity.valid;\n }\n\n private _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 private _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 private _determineInputType() {\n this._choiceElements.forEach(choice => {\n this._setInputType(choice);\n });\n }\n\n private _setInputType(choiceElement: Choice) {\n this._internals.ariaLabel = this.maxChoices === 1 ? 'radio-group' : 'checkbox-group';\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 }\n this._handleChoiceSelection();\n }\n\n private _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 private _getChoiceChecked(choice: Choice): boolean {\n return choice.internals.states.has('--checked');\n }\n\n private _toggleChoiceChecked(choice: Choice) {\n const checked = this._getChoiceChecked(choice);\n this._setChoiceChecked(choice, !checked);\n }\n\n private _handleChoiceSelection() {\n const selectedChoices = this._choiceElements.filter(choice => this._getChoiceChecked(choice));\n const selectedIdentifiers = selectedChoices.map(choice => choice.identifier);\n\n this.value = this.maxChoices === 1 ? selectedIdentifiers[0] || '' : selectedIdentifiers;\n this.validate();\n this.saveResponse(this._value);\n }\n\n /**\n * Updates the selection state of each choice element based on the current response.\n */\n private _updateChoiceSelection() {\n const responseArray = Array.isArray(this._value) ? this._value : [this._value];\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 { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { Interaction } from '../internal/interaction/interaction';\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 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() options: OptionType[] = [];\n\n @state() correctOption: string = '';\n\n @property({ attribute: 'data-prompt', type: String })\n dataPrompt: string = 'select';\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 const choices = Array.from(this.querySelectorAll('qti-inline-choice'));\n this.options = [\n {\n textContent: this.dataPrompt,\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 }\n\n disconnectedCallback() {\n this.removeEventListener('on-dropdown-selected', this.choiceSelected);\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 value(value: string) {\n this.options = this.options.map(option => {\n if (value === option.value) {\n option.selected = true;\n }\n return option;\n });\n }\n get value(): string {\n return this.options.find(option => option.selected).value;\n }\n\n set correctResponse(value: string | string[]) {\n if (value === '') {\n this.correctOption = '';\n return;\n }\n this.correctOption = `<span part=\"correct-option\">${\n this.options.find(option => value === option.value).textContent\n }</span>`;\n }\n\n public 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 type { CSSResultGroup } from 'lit';\nimport { html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { ChoicesInterface, ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { ShuffleMixin } from '../internal/shuffle/shuffle-mixin';\nimport { VocabularyMixin } from '../internal/vocabulary/vocabulary-mixin';\nimport styles from './qti-choice-interaction.styles';\nimport { Interaction } from '../internal/interaction/interaction';\n\nexport type Orientation = 'horizontal' | 'vertical' | undefined;\n\n/**\n * An sample element.\n *\n * @slot - default slot of the choices\n * @slot prompt - slot of the prompt\n *\n * @csspart slot - The choice elements\n * @csspart prompt - The prompt\n * @csspart message - The validation message\n *\n * @cssprop [--qti-bg-active=#ffecec] - The active background color\n * @cssprop [--qti-border-active=#f86d70] - The active border color\n * @cssprop [--qti-padding-horizontal=1px] - The option horizontal padding\n * @cssprop [--qti-padding-vertical=solid] - The option vertical padding\n * @cssprop [--qti-border-radius=8px] - The option border radius\n */\n@customElement('qti-choice-interaction')\nexport class QtiChoiceInteraction\n extends VocabularyMixin(\n ShuffleMixin(ChoicesMixin(Interaction, 'qti-simple-choice'), 'qti-simple-choice'),\n 'qti-simple-choice'\n )\n implements ChoicesInterface\n{\n static styles: CSSResultGroup = styles;\n\n constructor() {\n super();\n this._internals.role = 'group';\n }\n\n /** @deprecated, use 'qti-orientation-horizontal' or 'qti-orientation-vertical' instead */\n @property({ type: String })\n public orientation: Orientation;\n\n render() {\n return html`\n <slot part=\"prompt\" name=\"prompt\"></slot><slot part=\"slot\"></slot>\n <div part=\"message\" role=\"alert\" id=\"validationMessage\"></div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-choice-interaction': QtiChoiceInteraction;\n }\n}\n","/**\n * Mixin that provides shuffling functionality for a LitElement.\n * @template T - The type of the LitElement subclass.\n * @param {T} superClass - The superclass to extend.\n * @param {string} selector - The CSS selector for the elements to shuffle.\n * @returns {Constructor<ShuffleInterface> & T} - The extended class with shuffling functionality.\n *\n * adds a shuffle property to the class with an attribute converter\n *\n * qti-inline-choice-interaction\n * qti-choice-interaction\n * qti-match-interaction\n */\nimport { property } from 'lit/decorators.js';\nimport { Interaction } from '../interaction/interaction';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ndeclare class ShuffleInterface {}\nexport const ShuffleMixin = <T extends Constructor<Interaction>>(superClass: T, selector: string) => {\n abstract class ShuffleElement extends superClass {\n /** <span style=\"color:blue\">some *blue* text</span>. Does not work in storybook */\n @property({ type: String, reflect: true })\n shuffle: 'true' | 'false' = 'false'; // Defaults to 'false'\n\n connectedCallback() {\n super.connectedCallback();\n this._applyShuffle();\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has('shuffle')) {\n this._applyShuffle();\n }\n }\n\n private _applyShuffle() {\n if (this.shuffle === 'true') {\n this._shuffleChoices();\n } else {\n this._resetShuffleChoices();\n }\n }\n\n private _shuffleChoices() {\n const choices = Array.from(this.querySelectorAll<HTMLElement>(selector));\n const fixedChoices = choices.filter(choice => choice.hasAttribute('fixed'));\n const nonFixedChoices = choices.filter(choice => !choice.hasAttribute('fixed'));\n\n if (nonFixedChoices.length <= 1) {\n console.warn('Shuffling is not possible with fewer than 2 non-fixed elements.');\n return;\n }\n\n const originalOrder = [...nonFixedChoices];\n let shuffled = false;\n let attempts = 0;\n\n // Shuffle until the result is different or attempts are exceeded\n while (!shuffled && attempts < 10) {\n attempts++;\n for (let i = nonFixedChoices.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [nonFixedChoices[i], nonFixedChoices[j]] = [nonFixedChoices[j], nonFixedChoices[i]];\n }\n shuffled = !nonFixedChoices.every((choice, index) => choice === originalOrder[index]);\n }\n\n if (!shuffled) {\n console.warn('Failed to shuffle the choices after multiple attempts.');\n }\n\n // Apply order styles\n let order = 1;\n [...fixedChoices, ...nonFixedChoices].forEach(choice => {\n choice.style.setProperty('order', String(order++));\n });\n }\n\n private _resetShuffleChoices() {\n this.querySelectorAll<HTMLElement>(selector).forEach(choice => {\n choice.style.setProperty('order', 'initial');\n });\n }\n }\n\n return ShuffleElement as Constructor<ShuffleInterface> & T;\n};\n","/**\n * Mixin that provides shuffling functionality for a LitElement.\n * @template T - The type of the LitElement subclass.\n * @param {T} superClass - The superclass to extend.\n * @param {string} selector - The CSS selector for the elements to shuffle.\n * @returns {Constructor<ShuffleInterface> & T} - The extended class with shuffling functionality.\n *\n * adds a shuffle property to the class with an attribute converter\n *\n * qti-inline-choice-interaction\n * qti-choice-interaction\n * qti-match-interaction\n */\nimport { PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { QtiSimpleChoice } from '../../qti-simple-choice';\nimport { Interaction } from '../interaction/interaction';\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 [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","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { QtiRule, QtiRuleBase } from '..';\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 { css, html, LitElement, PropertyValueMap } 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\n@customElement('qti-response-processing')\nexport default 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 { OutcomeVariable } from '@citolab/qti-components/qti-components';\nimport { property } from 'lit/decorators.js';\nimport { convertNumberToUniveralFormat } from '../../../internal/utils';\nimport { QtiExpression } from '../../qti-expression/qti-expression';\nimport { QtiRule } from '../qti-rule';\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 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 const outcomeVariable = this.closest('qti-assessment-item').getVariable(identifier) as OutcomeVariable;\n let value;\n if (outcomeVariable.interpolationTable) {\n value = outcomeVariable.interpolationTable.get(parseInt(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: convertNumberToUniveralFormat(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';\nimport { QtiExpression } from '../../qti-expression/qti-expression';\nimport { QtiRule } from '../qti-rule';\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 { convertNumberToUniveralFormat } from '../../../internal/utils';\nimport { QtiExpression, QtiExpressionBase } from '../../qti-expression/qti-expression';\nimport { QtiRule, QtiRuleBase } from '../qti-rule';\n\nexport class QtiSetOutcomeValue extends QtiRule {\n public override process() {\n const outcomeIdentifier = this.getAttribute('identifier');\n\n const expression = this.firstElementChild as QtiExpression<string>;\n\n const rule = new QtiSetOutcomeValueRule(expression);\n const value = rule.process();\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: Array.isArray(value)\n ? value.map((v: string) => convertNumberToUniveralFormat(v))\n : convertNumberToUniveralFormat(value)\n }\n })\n );\n }\n}\n\nexport class QtiSetOutcomeValueRule<T> implements QtiRuleBase {\n constructor(private expression: QtiExpressionBase<T>) {}\n\n process(): any {\n const value = this.expression ? this.expression.calculate() : null;\n\n if (value === null || value === undefined) {\n console.warn('setOutcomeValue: value is null or undefined');\n return;\n }\n return value;\n }\n}\n\ncustomElements.define('qti-set-outcome-value', QtiSetOutcomeValue);\n","import { LitElement, html } from 'lit';\nimport { 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';\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 { QtiExpression } from '../../qti-expression/qti-expression';\nimport { QtiRule } from '../../qti-rule/qti-rule';\nimport { QtiResponseElse } from '../qti-response-else';\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 { consume } from '@lit/context';\nimport { css, html, LitElement } from 'lit';\nimport { state } from 'lit/decorators.js';\nimport { ResponseVariable, VariableDeclaration } from '../../internal/variables';\nimport { itemContext, ItemContext } from '../../qti-assessment-item/qti-assessment-item.context';\nimport { QtiMultiple } from './qti-multiple/qti-multiple';\n\nexport interface QtiExpressionBase<T> {\n // get assessmentItem(): QtiAssessmentItem;\n\n // getVariables(): VariableDeclaration<number | string | (number | string)[] | null>[];\n calculate(): Readonly<T>;\n}\n\nexport abstract class QtiExpression<T> extends LitElement implements QtiExpressionBase<T> {\n @state()\n protected result: any;\n\n // hide the slot with css\n static styles = css`\n slot {\n display: none;\n }\n `;\n\n override render() {\n return html`<pre>${JSON.stringify(this.result, null, 2)}</pre>\n <slot></slot>`;\n }\n\n public calculate(): Readonly<T> {\n this.result = this.getResult();\n return this.result;\n }\n\n protected getResult(): Readonly<T> {\n throw new Error('Not implemented');\n }\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n getVariables = (): VariableDeclaration<number | string | (number | string)[] | null>[] =>\n // FIXME: if this itself is multiple, this will never enter the qti-multiple switch\n // See this example here: https://github.com/1EdTech/qti-examples/blob/master/qtiv3-examples/packaging/items/Example05-feedbackBlock-adaptive.xml\n\n Array.from(this.children)\n .map((e: Element) => {\n switch (e.tagName.toLowerCase()) {\n case 'qti-base-value': {\n return {\n baseType: e.getAttribute('base-type'),\n value: e.textContent.trim(),\n cardinality: 'single'\n } as ResponseVariable;\n }\n case 'qti-variable': {\n const identifier = e.getAttribute('identifier') || '';\n const variable = this.context.variables.find(v => v.identifier === identifier) || null;\n return variable;\n }\n case 'qti-multiple': {\n const multiple = e as QtiMultiple;\n const values = multiple.getResult();\n if (values.length > 0) {\n return {\n identifier: '',\n baseType: values[0].baseType,\n value: values.map(v => v.value),\n cardinality: 'multiple',\n type: 'response'\n } as ResponseVariable;\n }\n return null;\n }\n case 'qti-correct': {\n const identifier = e.getAttribute('identifier') || '';\n const responseVariable: ResponseVariable = this.context.variables.find(v => v.identifier === identifier) || null;\n return {\n baseType: responseVariable.baseType,\n value: responseVariable.correctResponse,\n cardinality: responseVariable.cardinality\n } as ResponseVariable;\n }\n default: {\n // added for use of qti-equal-rounded\n try {\n const expression = e as QtiExpression<number>;\n const value = expression.getResult();\n return {\n baseType: 'integer',\n value: value.toString(),\n cardinality: 'single'\n } as ResponseVariable;\n } catch (error) {\n console.warn('default not sufficient');\n }\n return null;\n }\n }\n })\n .filter(v => v !== null);\n}\n","import { QtiExpression } from './qti-expression';\n\nexport abstract class QtiConditionExpression extends QtiExpression<boolean> {\n public calculate(): Readonly<boolean> {\n this.result = this.getResult();\n return this.result;\n }\n\n public getResult(): Readonly<boolean> {\n throw new Error('Not implemented');\n }\n}\n","import { QtiConditionExpression } from '../qti-condition-expression';\nimport { QtiExpression } from '../qti-expression';\n\ntype Constructor<T> = new (...args: any[]) => T;\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 { QtiAnd } from './qti-and';\ncustomElements.define('qti-and', QtiAnd);\n\nexport * from './qti-and';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-and': QtiAnd;\n }\n}\n","import { property } from 'lit/decorators.js';\nimport { BaseType } from '../../../internal/expression-result';\nimport { QtiExpression } from '../qti-expression';\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 { ResponseVariable } from '../../../internal/variables';\nimport { QtiConditionExpression } from '../qti-condition-expression';\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 { ResponseVariable } from 'src/lib/qti-components/internal/variables';\nimport { QtiExpression } from '../qti-expression';\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 } from 'lit/decorators.js';\nimport { ResponseVariable } from '../../../internal/variables';\nimport { QtiExpression } from '../qti-expression';\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 { property } from 'lit/decorators.js';\nimport { ResponseVariable } from '../../../internal/variables';\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../qti-expression';\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 { BaseType } from '../..';\n\nexport class ScoringHelper {\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 { ResponseVariable } from '../../../internal/variables';\nimport { QtiExpression } from '../qti-expression';\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 { ResponseVariable } from '../../../internal/variables';\nimport { QtiConditionExpression } from '../qti-condition-expression';\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 { ResponseVariable } from '../../../internal/variables';\nimport { QtiExpression } from '../qti-expression';\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 { ResponseVariable } from '../../../internal/variables';\nimport { QtiExpression } from '../qti-expression';\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 { ResponseVariable } from '../../../internal/variables';\nimport { QtiConditionExpression } from '../qti-condition-expression';\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';\nimport { ResponseVariable } from 'src/lib/qti-components/internal/variables';\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../qti-expression';\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) {\n console.warn(`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 mappedValue = mapping.mapEntries.find(entry => {\n return ScoringHelper.compareSingleValues(entry.mapKey, candidateResponse, response.baseType);\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) {\n result = Math.max(mapping.lowerBound, result);\n }\n if (mapping.upperBound != null) {\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';\nimport { LitElement } from 'lit';\n\nexport class QtiMapping extends LitElement {\n @property({ attribute: 'default-value', type: Number }) defaultValue: number = 0;\n @property({ attribute: 'lower-bound', type: Number }) lowerBound: number;\n @property({ attribute: 'upper-bound', type: Number }) upperBound: number;\n\n public get mapEntries() {\n return Array.from(this.querySelectorAll('qti-map-entry')).map(el => {\n return {\n mapKey: el.getAttribute('map-key'),\n mappedValue: +el.getAttribute('mapped-value')\n };\n });\n }\n}\n\ncustomElements.define('qti-mapping', QtiMapping);\n","import { ResponseVariable } from '../../../internal/variables';\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../qti-expression';\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 switch (correctValueInfo.cardinality) {\n case 'single': {\n if (valueToMap.value === null) return false;\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 { ResponseVariable } from '../../../internal/variables';\nimport { QtiExpression } from '../qti-expression';\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 { ResponseVariable, VariableDeclaration } from '../../../internal/variables';\nimport { QtiExpression } from '../qti-expression';\nexport class QtiMultiple extends QtiExpression<VariableDeclaration<string | string[]>[]> {\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 !== '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';\nimport { QtiExpression } from '../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 '../qti-condition-expression';\nimport { QtiExpression } from '../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 { ResponseVariable } from '../../../internal/variables';\nimport { QtiExpression } from '../qti-expression';\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 { consume } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { property, state } from 'lit/decorators.js';\n\nimport { VariableDeclaration } from 'src/lib/qti-components/internal/variables';\nimport { ItemContext, itemContext } from '../../../qti-assessment-item/qti-assessment-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 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 { ResponseVariable } from '../../../internal/variables';\nimport { QtiExpression } from '../qti-expression';\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 * parseInt(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 '../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';\nimport { ResponseVariable } from '../../../internal/variables';\nimport { ScoringHelper } from '../../utilities/scoring-helper';\nimport { QtiExpression } from '../qti-expression';\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, QtiExpressionBase } from '../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 values = this.expressions.map(c => {\n if (!c.calculate) {\n console.error(\"Element doesn't implement QtiConditionExpression\");\n return null;\n }\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 '../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 { html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { Interaction } from '../internal/interaction/interaction';\nimport { IMSpci, ModuleResolutionConfig, QtiVariableJSON } 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 intervalId: any;\n private rawResponse: string;\n\n private pci: IMSpci<unknown>;\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 @state()\n private _errorMessage: string = null;\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 private startChecking(): void {\n // because the pci doesn't have a method to check for changes we'll use an interval\n // to check if the response has changed. If changed we'll save the response\n this.intervalId = setInterval(() => {\n const response = this.pci.getResponse();\n const newResponse = this.pci.getResponse();\n const stringified = JSON.stringify(response);\n if (stringified !== this.rawResponse) {\n this.rawResponse = stringified;\n const value = this.convertQtiVariableJSON(newResponse);\n this.value = value;\n this.saveResponse(value);\n }\n }, 200);\n }\n\n private stopChecking(): void {\n if (this.intervalId !== undefined) {\n clearInterval(this.intervalId);\n }\n }\n\n validate(): boolean {\n return true; // FOR NOW\n }\n set value(_: string | string[]) {\n // Only set state is supported in a PCI\n }\n get value(): string | string[] {\n return this.rawResponse;\n }\n\n getTAOConfig(node) {\n const a = node.querySelectorAll('properties');\n let config = {};\n\n const getPropertyValue = el => {\n const property = {};\n const key = el.getAttribute('key');\n if (key) {\n const children = Array.from(el.children);\n const allKey = children.map((c: HTMLElement) => c.getAttribute('key'));\n const isArray = allKey.length > 0 && !allKey.find(k => !Number.isInteger(+k));\n if (isArray) {\n property[key] = children.map(c => getChildProperties(c));\n } else {\n property[key] = el.textContent;\n }\n }\n return property;\n };\n\n const getChildProperties = (el): {} | void => {\n if (el) {\n let properties = {};\n for (const child of el.children) {\n properties = { ...properties, ...getPropertyValue(child) };\n }\n return properties;\n }\n };\n\n for (const properties of a) {\n const key = properties.getAttribute('key');\n if (!key) {\n config = { ...config, ...getChildProperties(properties) };\n }\n return config;\n }\n console.log('Can not find qti-custom-interaction config');\n return null;\n }\n\n register(pci: IMSpci<unknown>) {\n this.pci = pci;\n\n const type = this.parentElement.tagName === 'QTI-CUSTOM-INTERACTION' ? 'TAO' : 'IMS';\n const dom: HTMLElement =\n type == 'IMS' ? this.querySelector('qti-interaction-markup') : this.querySelector('markup');\n dom.classList.add('qti-customInteraction');\n\n if (type == 'TAO' && this.querySelector('properties')) {\n (this.querySelector('properties') as HTMLElement).style.display = 'none';\n }\n\n const config: any =\n type == 'IMS'\n ? {\n properties: this.dataset,\n onready: () => {\n console.log('onready');\n }\n }\n : this.getTAOConfig(this);\n if (type == 'IMS') {\n pci.getInstance(dom, config, undefined);\n } else {\n (pci as any).initialize(this.customInteractionTypeIdentifier, dom.firstElementChild, config);\n }\n if (type == 'TAO') {\n const links = Array.from(this.querySelectorAll('link')).map(acc => acc.getAttribute('href'));\n links.forEach(link => {\n const styles = document.createElement('link');\n styles.rel = 'stylesheet';\n styles.type = 'text/css';\n styles.media = 'screen';\n styles.href = link;\n dom.appendChild(styles);\n });\n }\n this.startChecking();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\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 const requirePCI = requirejs.config(config);\n requirePCI(['require'], require => {\n // eslint-disable-next-line import/no-dynamic-require\n require([this.module]);\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n requirejs.undef(this.customInteractionTypeIdentifier);\n // Clear the modules in the context\n const context = requirejs.s.contexts;\n delete context[this.customInteractionTypeIdentifier];\n this.stopChecking();\n }\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: window['requirePaths'] || {},\n shim: 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 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);\n }\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 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 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 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 override render() {\n return html`<slot></slot>${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-portable-custom-interaction': QtiPortableCustomInteraction;\n }\n}\n","import { CSSResultGroup, html } from 'lit';\n\nimport { customElement, state } from 'lit/decorators.js';\nimport { DragDropInteractionMixin } from '../internal/drag-drop';\nimport { QtiSimpleAssociableChoice } from '../qti-simple-associable-choice';\nimport styles from './qti-associate-interaction.styles';\nimport { Interaction } from '../internal/interaction/interaction';\n@customElement('qti-associate-interaction')\nexport class QtiAssociateInteraction extends DragDropInteractionMixin(\n Interaction,\n 'qti-simple-associable-choice',\n true,\n '.dl'\n) {\n @state() private _childrenMap: Element[] = [];\n\n static styles: CSSResultGroup = styles;\n // dragDropApi: TouchDragAndDrop;\n\n private _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 private _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 <div role=\"alert\" id=\"validationMessage\"></div>`\n )}\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","type Point = { x: number; y: number };\n\nexport class TouchDragAndDrop {\n private touchStartTime = 0; // Timestamp of the first touch\n private touchStartPoint = null; // Point of the first touch\n private lastClickTime = 0; // Timestamp of the previous click\n private isDraggable = false; // Whether a draggable element is active\n private dragSource: HTMLElement = null; // The source element being dragged\n private dragClone: HTMLElement = null; // Clone of drag source for visual feedback\n private touchEndTriggered = false; // Flag for touchEnd event\n private isDragging = false; // Whether a drag operation is ongoing\n private initialTransform = ''; // Original transform style\n private hasDispatchedDragStart = false; // Flag to ensure dragstart event is dispatched once\n private rootNode: Node = null; // Root node for boundary calculations\n\n private allDropzones: HTMLElement[] = []; // All dropzones for keyboard navigation\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 private cloneOffset = { x: 0, y: 0 }; // Offset for positioning the drag clone\n\n private lastTarget = null; // Last touch target\n private currentDropTarget = null; // Current droppable element\n private allowClick = true; // Flag to allow or prevent click\n private static instance: TouchDragAndDrop;\n\n copyStylesForDragClone = true;\n dragOnClickEnabled = false;\n useDragClone = false; // Set to true to drag with a clone; set to false to drag the original element\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 initialTransition: string;\n // droppables: Element[];\n\n constructor() {\n if (TouchDragAndDrop.instance) {\n return TouchDragAndDrop.instance;\n }\n TouchDragAndDrop.instance = this;\n\n // Add event listeners for touch and mouse interactions\n document.addEventListener('touchmove', this.handleTouchMove.bind(this), { passive: false });\n document.addEventListener('mousemove', this.handleTouchMove.bind(this), { passive: false });\n document.addEventListener('touchend', this.handleTouchEnd.bind(this), { passive: false });\n document.addEventListener('mouseup', this.handleTouchEnd.bind(this), { passive: false });\n document.addEventListener('touchcancel', this.handleTouchCancel.bind(this), { passive: false });\n }\n\n addDraggableElements(draggables: Element[]) {\n draggables.forEach(el => {\n el.setAttribute('tabindex', '0'); // Make draggable elements focusable\n // el.addEventListener('focus', () => (this.focusedElement = el as HTMLElement));\n // el.addEventListener('blur', () => (this.focusedElement = null));\n\n el.addEventListener('touchstart', this.handleTouchStart.bind(this), { passive: false });\n el.addEventListener('mousedown', this.handleTouchStart.bind(this), { passive: false });\n });\n }\n\n private getInteraction(el: HTMLElement) {\n // Find the closest parent where the tagname ends with '-interaction'\n let parent = el;\n while (parent && !parent.tagName.toLocaleLowerCase().endsWith('-interaction')) {\n parent = parent.parentElement;\n }\n return parent;\n }\n\n private handleTouchStart(e) {\n this.touchStartTime = Date.now();\n const { x, y } = this.getEventCoordinates(e);\n this.touchStartPoint = { x, y };\n this.dragSource = e.currentTarget;\n this.isDraggable = true;\n\n // Get the root node\n this.rootNode = this.dragSource.getRootNode();\n\n if (this.dragOnClickEnabled) {\n this.isDragging = true;\n this.createDragClone(e, { clientX: x, clientY: y });\n }\n\n if (!this.useDragClone) {\n // Save initial transform\n const computedStyle = window.getComputedStyle(this.dragSource);\n this.initialTransform = computedStyle.transform === 'none' ? '' : computedStyle.transform;\n\n // Save the original transition style\n this.initialTransition = computedStyle.transition || '';\n\n // Disable transitions\n this.dragSource.style.transition = 'none';\n\n // Calculate clone offset\n const rect = this.dragSource.getBoundingClientRect();\n this.cloneOffset.x = x - rect.left;\n this.cloneOffset.y = y - rect.top;\n\n // Set higher z-index to bring it on top\n this.dragSource.style.zIndex = '9999';\n // this.dragSource.style.pointerEvents = 'none'; // So it doesn't block events\n this.dragSource.focus();\n }\n\n e.preventDefault();\n }\n\n private handleTouchMove(e) {\n if (this.isDraggable && this.dragSource) {\n const interaction = this.getInteraction(this.dragSource);\n this.allDropzones = [\n ...(Array.from(interaction.querySelectorAll('[dropzone]')) as HTMLElement[]),\n ...(Array.from(interaction.shadowRoot?.querySelectorAll('[dropzone]')) as HTMLElement[])\n ];\n const { x, y } = this.getEventCoordinates(e);\n const currentTouch = { clientX: x, clientY: y };\n\n if (this.calculateDragDistance(currentTouch) >= this.MIN_DRAG_DISTANCE) {\n this.dragSource.style.pointerEvents = 'none'; // So it doesn't block events\n this.isDragging = true;\n }\n\n this.createDragClone(e, currentTouch);\n e.preventDefault();\n\n // Determine the closest dropzone using the closest corners algorithm\n const closestDropzone = this.findClosestDropzone();\n this.currentDropTarget = closestDropzone;\n if (closestDropzone !== this.lastTarget) {\n if (this.lastTarget) {\n this.dispatchCustomEvent(this.lastTarget, 'dragleave');\n }\n if (closestDropzone) {\n this.dispatchCustomEvent(closestDropzone, 'dragenter');\n }\n this.lastTarget = closestDropzone;\n }\n\n if (this.lastTarget) {\n this.dispatchCustomEvent(this.lastTarget, 'dragover');\n }\n }\n }\n\n private createDragClone(e, currentTouch: { clientX: number; clientY: number }) {\n if (!this.isDragging) return;\n\n if (this.useDragClone) {\n // Existing code for creating and handling the drag clone\n if (!this.dragClone) {\n this.dragSource.style.opacity = this.DRAG_CLONE_OPACITY.toString();\n this.dragClone = this.dragSource.cloneNode(true) as HTMLElement;\n\n if (this.copyStylesForDragClone) {\n const computedStyles = window.getComputedStyle(this.dragSource);\n for (const style of computedStyles) {\n this.dragClone.style[style] = computedStyles.getPropertyValue(style);\n }\n }\n\n // Move the drag clone to the root node\n if (this.rootNode instanceof ShadowRoot) {\n // Append to the host of the shadow root\n this.rootNode.host.appendChild(this.dragClone);\n } else if (this.rootNode instanceof Document) {\n document.body.appendChild(this.dragClone);\n }\n\n this.calculateClonePosition(currentTouch);\n this.setDragCloneStyles(currentTouch);\n this.dispatchCustomEvent(this.dragSource, 'dragstart');\n }\n\n this.updateDragClonePosition(currentTouch);\n } else {\n // Handle dragging the original element using CSS transforms\n if (this.touchStartPoint) {\n const deltaX = currentTouch.clientX - this.touchStartPoint.x;\n const deltaY = currentTouch.clientY - this.touchStartPoint.y;\n\n // Apply boundaries\n // const { boundedDeltaX, boundedDeltaY } = this.applyTransformBoundaries(deltaX, deltaY);\n // this.dragSource.style.transform = `${this.initialTransform} translate(${boundedDeltaX}px, ${boundedDeltaY}px)`;\n\n this.dragSource.style.transform = `${this.initialTransform} translate(${deltaX}px, ${deltaY}px)`;\n\n if (!this.hasDispatchedDragStart) {\n this.dispatchCustomEvent(this.dragSource, 'dragstart');\n this.hasDispatchedDragStart = true;\n }\n }\n }\n\n const dropTarget = this.currentDropTarget;\n\n if (dropTarget !== this.lastTarget) {\n this.dispatchCustomEvent(dropTarget, 'dragenter');\n this.dispatchCustomEvent(this.lastTarget, 'dragleave');\n this.lastTarget = dropTarget;\n }\n\n this.currentDropTarget = dropTarget;\n if (this.currentDropTarget) this.dispatchCustomEvent(dropTarget, 'dragover');\n }\n\n private handleTouchEnd(e) {\n this.allDropzones = [];\n this.touchEndTriggered = true;\n this.isDraggable = false;\n let dropFound = false;\n\n // console.log('dropFound', dropFound);\n\n if (this.currentDropTarget) {\n this.dispatchCustomEvent(this.currentDropTarget, 'drop');\n this.dispatchCustomEvent(this.dragSource, 'dragend');\n dropFound = true;\n } else if (this.isDragging) {\n const dragEndEvent = new CustomEvent('dragend', { bubbles: true, cancelable: true });\n dragEndEvent['dataTransfer'] = { dropEffect: 'none' };\n this.dragSource?.dispatchEvent(dragEndEvent);\n }\n\n this.resetDragState(dropFound);\n }\n\n private handleTouchCancel(e) {\n this.resetDragState();\n }\n\n private findClosestDropzone(): HTMLElement | null {\n if (!this.dragSource || this.allDropzones.length === 0) return null;\n\n const dragRect = this.dragSource.getBoundingClientRect();\n const dragCorners = this.getCorners(dragRect);\n const dragCenter = this.getCenter(dragRect);\n\n let closestDropzone: HTMLElement | null = null;\n let minDistance = Infinity;\n\n for (const dropzone of this.allDropzones) {\n const dropRect = dropzone.getBoundingClientRect();\n const dropCorners = this.getCorners(dropRect);\n const dropCenter = this.getCenter(dropRect);\n\n // Calculate normalized corner distances\n const cornerDistance =\n this.calculateTotalCornerDistance(dragCorners, dropCorners) / this.getRectDiagonal(dropRect);\n\n // Calculate center-to-center distance\n const centerDistance = this.calculateDistance(dragCenter, dropCenter);\n\n // Combine distances with weights\n const totalDistance = cornerDistance * 0.5 + centerDistance * 0.5;\n\n if (totalDistance < minDistance) {\n minDistance = totalDistance;\n closestDropzone = dropzone;\n }\n }\n\n return closestDropzone;\n }\n\n private getCenter(rect: DOMRect): Point {\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2\n };\n }\n\n private getRectDiagonal(rect: DOMRect): number {\n return Math.sqrt(rect.width ** 2 + rect.height ** 2);\n }\n\n private getCorners(rect: DOMRect): { topLeft: Point; topRight: Point; bottomLeft: Point; bottomRight: Point } {\n return {\n topLeft: { x: rect.left, y: rect.top },\n topRight: { x: rect.right, y: rect.top },\n bottomLeft: { x: rect.left, y: rect.bottom },\n bottomRight: { x: rect.right, y: rect.bottom }\n };\n }\n\n private calculateTotalCornerDistance(cornersA, cornersB): number {\n return (\n this.calculateDistance(cornersA.topLeft, cornersB.topLeft) +\n this.calculateDistance(cornersA.topRight, cornersB.topRight) +\n this.calculateDistance(cornersA.bottomLeft, cornersB.bottomLeft) +\n this.calculateDistance(cornersA.bottomRight, cornersB.bottomRight)\n );\n }\n\n private calculateDistance(pointA: Point, pointB: Point): number {\n const dx = pointA.x - pointB.x;\n const dy = pointA.y - pointB.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n private findDropTarget(event) {\n const { x, y } = this.getEventCoordinates(event);\n return this.getDropTargetAtPoint(document, x, y);\n }\n\n private getDropTargetAtPoint(root: DocumentOrShadowRoot, x: number, y: number, depth: number = 0): Element | null {\n // Limit the recursion depth\n const MAX_DEPTH = 2;\n if (depth > MAX_DEPTH) {\n return null;\n }\n\n const element = root.elementFromPoint(x, y) as HTMLElement;\n\n if (!element) {\n return null;\n }\n\n if (element.hasAttribute('dropzone')) {\n return element;\n }\n\n // Traverse up the DOM tree to find an ancestor with 'dropzone' attribute\n let currentElement = element.parentElement;\n while (currentElement) {\n if (currentElement.hasAttribute('dropzone')) {\n return currentElement;\n }\n currentElement = currentElement.parentElement;\n }\n\n // If the element has a Shadow DOM and depth limit not reached, traverse it\n if (element.shadowRoot && depth < MAX_DEPTH) {\n const shadowElement = this.getDropTargetAtPoint(element.shadowRoot, x, y, depth + 1);\n if (shadowElement) {\n return shadowElement;\n }\n }\n\n // No element with 'dropzone' found\n return null;\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 calculateClonePosition(touch) {\n const rect = this.dragSource.getBoundingClientRect();\n this.cloneOffset.x = touch.clientX - rect.left;\n this.cloneOffset.y = touch.clientY - rect.top;\n }\n\n private setDragCloneStyles(touch) {\n this.dragClone.style.position = 'fixed';\n this.dragClone.style.top = `${touch.clientY - this.cloneOffset.y}px`;\n this.dragClone.style.left = `${touch.clientX - this.cloneOffset.x}px`;\n this.dragClone.style.pointerEvents = 'none';\n this.dragClone.style.zIndex = '999999';\n }\n\n private updateDragClonePosition(touch) {\n requestAnimationFrame(() => {\n if (this.touchEndTriggered || !this.dragClone) return;\n\n const newLeft = touch.clientX - this.cloneOffset.x;\n const newTop = touch.clientY - this.cloneOffset.y;\n\n // Apply boundaries\n const { newLeft: boundedLeft, newTop: boundedTop } = this.applyBoundaries(newLeft, newTop, this.dragClone);\n\n this.dragClone.style.left = `${boundedLeft}px`;\n this.dragClone.style.top = `${boundedTop}px`;\n });\n }\n\n private applyBoundaries(newLeft: number, newTop: number, element: HTMLElement) {\n // Get the boundaries of the root node\n let boundaryRect: DOMRect;\n if (this.rootNode instanceof ShadowRoot) {\n boundaryRect = this.rootNode.host.getBoundingClientRect();\n } else if (this.rootNode instanceof Document) {\n boundaryRect = document.documentElement.getBoundingClientRect();\n } else {\n // Default to viewport\n boundaryRect = new DOMRect(0, 0, window.innerWidth, window.innerHeight);\n }\n\n // Get the dimensions of the element\n const elementRect = element.getBoundingClientRect();\n const elementWidth = elementRect.width;\n const elementHeight = elementRect.height;\n\n // Limit the newLeft and newTop within the boundaries\n const boundedLeft = Math.max(boundaryRect.left, Math.min(newLeft, boundaryRect.right - elementWidth));\n const boundedTop = Math.max(boundaryRect.top, Math.min(newTop, boundaryRect.bottom - elementHeight));\n\n return { newLeft: boundedLeft, newTop: boundedTop };\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 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 resetDragState(dropFound: boolean = false) {\n if (this.isDragging) {\n if (this.useDragClone) {\n this.dragSource.style.opacity = '1.0';\n this.dragClone?.parentElement.removeChild(this.dragClone);\n } else {\n // Restore original styles\n if (!dropFound) this.dragSource.style.transform = 'translate(0, 0)';\n this.dragSource.style.zIndex = '';\n this.dragSource.style.pointerEvents = '';\n // Restore the original transition style\n this.dragSource.style.transition = this.initialTransition;\n\n // Reset the original transition property\n this.initialTransition = '';\n }\n }\n\n this.isDragging = false;\n this.dragSource = null;\n this.dragClone = null;\n this.isDraggable = false;\n this.touchStartTime = 0;\n this.touchStartPoint = null;\n this.touchEndTriggered = false;\n this.allDropzones = [];\n this.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 this.cloneOffset = { x: 0, y: 0 };\n this.lastTarget = null;\n this.currentDropTarget = null;\n this.allowClick = true;\n this.initialTransform = '';\n this.hasDispatchedDragStart = false;\n\n this.rootNode = null;\n }\n}\n","import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { Interaction } from '../interaction/interaction';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ndeclare class DroppablesInterface {}\n\nexport const DroppablesMixin = <T extends Constructor<Interaction>>(\n superClass: T,\n useShadowRoot: boolean,\n droppablesSelector: string\n) => {\n abstract class DroppablesElement extends superClass {\n private observer: MutationObserver;\n\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n override firstUpdated(changedProps): void {\n if (this.isMatchTabular()) return;\n super.firstUpdated(changedProps);\n\n const droppables = this.getDroppableElements();\n this.initializeEventHandlers();\n droppables.forEach(droppable => {\n this.prepareDroppable(droppable);\n this.observeDroppableAttributes(droppable);\n });\n }\n\n private isMatchTabular(): boolean {\n return this.classList.contains('qti-match-tabular');\n }\n\n private getDroppableElements(): Element[] {\n return Array.from(\n useShadowRoot ? this.shadowRoot.querySelectorAll(droppablesSelector) : this.querySelectorAll(droppablesSelector)\n );\n }\n\n private initializeEventHandlers(): void {\n this.dragoverHandler = this.dragoverHandler.bind(this);\n this.dragleaveHandler = this.dragleaveHandler.bind(this);\n this.dragenterHandler = this.dragenterHandler.bind(this);\n this.dropHandler = this.dropHandler.bind(this);\n }\n\n private prepareDroppable(droppable: Element): void {\n droppable.setAttribute('dropzone', 'move');\n droppable.addEventListener('dragleave', this.dragleaveHandler);\n this.attachEventListeners(droppable);\n }\n\n private observeDroppableAttributes(droppable: Element): void {\n this.observer = new MutationObserver(mutations => {\n mutations.forEach(({ attributeName }) => {\n if (attributeName === 'disabled') {\n this.toggleDroppableHandlers(droppable);\n }\n });\n });\n this.observer.observe(droppable, { attributes: true });\n }\n\n private toggleDroppableHandlers(droppable: Element): void {\n const disabled = droppable.hasAttribute('disabled');\n if (disabled) {\n this.removeEventListeners(droppable);\n } else {\n this.attachEventListeners(droppable);\n }\n }\n\n private attachEventListeners(droppable: Element): void {\n droppable.addEventListener('dragover', this.dragoverHandler);\n droppable.addEventListener('dragenter', this.dragenterHandler);\n droppable.addEventListener('drop', this.dropHandler);\n }\n\n private removeEventListeners(droppable: Element): void {\n droppable.removeEventListener('dragover', this.dragoverHandler);\n droppable.removeEventListener('dragenter', this.dragenterHandler);\n droppable.removeEventListener('drop', this.dropHandler);\n }\n\n override disconnectedCallback(): void {\n if (this.isMatchTabular()) return;\n super.disconnectedCallback();\n this.observer?.disconnect();\n }\n\n private dragenterHandler(ev: DragEvent): void {\n ev.preventDefault();\n }\n\n private dragoverHandler(ev: DragEvent): boolean {\n const responseIdentifierDraggable = ev.dataTransfer.getData('responseIdentifier');\n ev.preventDefault();\n if (responseIdentifierDraggable === this.responseIdentifier) {\n this.activateDroppable(ev.currentTarget as HTMLElement);\n ev.dataTransfer.dropEffect = 'move';\n }\n return false;\n }\n\n private activateDroppable(droppable: HTMLElement): void {\n this._internals.states.delete('--dragzone-active');\n droppable.setAttribute('active', '');\n }\n\n private async dropHandler(ev: DragEvent): Promise<boolean> {\n ev.preventDefault();\n const droppable = ev.currentTarget as HTMLElement;\n const identifier = ev.dataTransfer.getData('text');\n const responseIdentifierDraggable = ev.dataTransfer.getData('responseIdentifier');\n const draggable = this.findDraggable(responseIdentifierDraggable, identifier);\n\n if (!draggable) return false;\n if (draggable && !this.isValidDrop(droppable, draggable, responseIdentifierDraggable)) {\n draggable.style.transform = 'translate(0, 0)';\n return false;\n }\n await this.moveDraggableToDroppable(draggable, droppable);\n this.deactivateDroppable(droppable, false);\n return false;\n }\n\n private findDraggable(responseIdentifier: string, identifier: string): HTMLElement | null {\n if (!identifier) return null;\n if (responseIdentifier === this.responseIdentifier) {\n return (\n this.querySelector(`[identifier=${identifier}]`) ||\n this.shadowRoot.querySelector(`[identifier=${identifier}]`)\n );\n } else {\n const assessmentItem = this.closest('qti-assessment-item');\n const interaction = assessmentItem.querySelector(`[response-identifier=${responseIdentifier}]`);\n return interaction.querySelector(`[identifier=${identifier}]`);\n }\n }\n\n private isValidDrop(droppable: HTMLElement, draggable: HTMLElement, responseIdentifierDraggable: string): boolean {\n return (\n this.responseIdentifier === responseIdentifierDraggable\n // && draggable.parentElement.getAttribute('identifier') !== droppable.getAttribute('identifier')\n );\n }\n\n private async moveDraggableToDroppable(draggable: HTMLElement, droppable: HTMLElement): Promise<void> {\n const moveElement = (): void => {\n draggable.style.transform = 'translate(0, 0)';\n droppable.appendChild(draggable);\n // checkMaxAssociations and saveResponse are defined/overridden in a mixin\n this['checkMaxAssociations']();\n this['saveResponse'](null); //\n };\n\n if (!document.startViewTransition) {\n moveElement();\n return;\n }\n\n const transition = document.startViewTransition(moveElement);\n await transition.finished;\n\n // this['checkMaxAssociations']();\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 private dragleaveHandler(ev: DragEvent): boolean {\n ev.preventDefault();\n this.deactivateDroppable(ev.currentTarget as HTMLElement);\n ev.dataTransfer.dropEffect = 'none';\n return false;\n }\n }\n return DroppablesElement as Constructor<DroppablesInterface> & 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 { LitElement } from 'lit';\nimport { Interaction } from '../interaction/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 { LitElement } from 'lit';\nimport { IInteraction } from '../interaction/interaction.interface';\nimport { DroppablesMixin } from './droppables-mixin';\nimport { FlippablesMixin } from './flippables-mixin';\n\nimport { property } from 'lit/decorators.js';\nimport { liveQuery } from '../../../../decorators/live-query';\nimport { TouchDragAndDrop } from './drag-drop-api';\nimport { Interaction } from '../interaction/interaction';\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 useShadowRootForDroppables: boolean,\n droppablesSelector: string\n) => {\n abstract class DragDropInteractionElement extends FlippablesMixin(\n DroppablesMixin(superClass, useShadowRootForDroppables, droppablesSelector),\n droppablesSelector,\n draggablesSelector\n ) {\n protected draggables = new Map<HTMLElement, { parent: HTMLElement; index: number }>();\n protected droppables: HTMLElement[] = [];\n dragDropApi: TouchDragAndDrop;\n\n @property({ attribute: false, type: Object }) 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 = 1;\n\n @liveQuery(draggablesSelector)\n handleDraggablesChange(dragsAdded: HTMLElement[], dragsRemoved: Element[]) {\n if (this.isMatchTabular()) return;\n const newDraggables = this.filterExistingDraggables(dragsAdded);\n\n if (newDraggables.length > 0) {\n this.addNewDraggables(newDraggables);\n }\n }\n\n override firstUpdated(changedProps): void {\n super.firstUpdated(changedProps);\n this.initializeDroppables();\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.initializeDragDropApi();\n }\n\n private initializeDragDropApi() {\n this.dragDropApi = new TouchDragAndDrop();\n this.dispatchEvent(\n new CustomEvent<DragDropInteractionElement>('qti-register-interaction', {\n bubbles: true,\n composed: true,\n detail: this\n })\n );\n }\n\n private isMatchTabular(): boolean {\n return this.classList.contains('qti-match-tabular');\n }\n\n private filterExistingDraggables(draggables: HTMLElement[]): HTMLElement[] {\n return draggables.filter(d => !this.draggables.has(d));\n }\n\n private addNewDraggables(draggables: HTMLElement[]): void {\n this.dragDropApi.addDraggableElements(draggables);\n draggables.forEach(draggable => this.storeDraggable(draggable));\n }\n\n private storeDraggable(draggable: HTMLElement): void {\n const index = Array.from(draggable.parentNode.children).indexOf(draggable);\n this.draggables.set(draggable, {\n parent: draggable.parentElement,\n index\n });\n draggable.style.viewTransitionName = `drag-${index}-${this.getAttribute('identifier') || crypto.randomUUID()}`;\n draggable.setAttribute('qti-draggable', 'true');\n draggable.addEventListener('dragstart', this.handleDragStart);\n draggable.addEventListener('dragend', this.handleDragEnd);\n }\n\n private initializeDroppables(): void {\n this.droppables = Array.from(\n useShadowRootForDroppables\n ? this.shadowRoot.querySelectorAll(droppablesSelector)\n : this.querySelectorAll(droppablesSelector)\n );\n // get data attribue data-choices-container-width\n const choicesContainerWidth = this.dataset.choicesContainerWidth;\n if (choicesContainerWidth) {\n this.droppables.forEach(d => {\n d.style.width = `${choicesContainerWidth}px`;\n d.style.boxSizing = `border-box`;\n });\n }\n }\n\n private handleDragStart = (ev: DragEvent) => {\n const target = ev.currentTarget as HTMLElement;\n ev.dataTransfer.setData('text', target.getAttribute('identifier'));\n if (this.responseIdentifier) {\n ev.dataTransfer.setData('responseIdentifier', this.responseIdentifier);\n }\n this._internals.states.add('--dragzone-enabled');\n target.setAttribute('dragging', '');\n this.activateDragLocation();\n this.activateDroppables(target);\n };\n\n private handleDragEnd = async (ev: DragEvent) => {\n ev.preventDefault();\n this._internals.states.delete('--dragzone-enabled');\n this._internals.states.delete('--dragzone-active');\n this.deactivateDragLocation();\n this.deactivateDroppables();\n const draggable = ev.currentTarget as HTMLElement;\n draggable.removeAttribute('dragging');\n const wasDropped = await this.wasDropped(ev);\n if (!wasDropped) {\n if (this.configuration.dragCanBePlacedBack) {\n this.restoreInitialDraggablePosition(draggable);\n }\n }\n };\n\n private getDragContainers() {\n const draggleble = Array.from(this.querySelectorAll(`[part='drags']`) || []);\n const dragglebleShadow = this.shadowRoot\n ? Array.from(this.shadowRoot.querySelectorAll(`[part='drags']`) || [])\n : [];\n return draggleble.concat(dragglebleShadow);\n }\n\n private activateDroppables(target: HTMLElement): void {\n const dragContainers = this.getDragContainers();\n dragContainers.forEach(d => {\n d.setAttribute('enabled', '');\n d.setAttribute('dropzone', 'move');\n if (d.hasAttribute('disabled')) {\n if (d.contains(target) || (d.shadowRoot && d.shadowRoot.contains(target))) {\n d.removeAttribute('disabled');\n d.setAttribute('dropzone', 'move');\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 d.setAttribute('dropzone', 'move');\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.getDragContainers();\n dragContainers.forEach(d => {\n d.removeAttribute('enabled');\n });\n this.droppables.forEach(d => d.removeAttribute('enabled'));\n }\n\n private async wasDropped(ev: DragEvent): Promise<boolean> {\n // const hasMoveTestItem = await this.checkForMoveTestItem(ev);\n return ev.dataTransfer.dropEffect !== 'none';\n }\n\n private wasMoved(ev: DragEvent): boolean {\n return ev.dataTransfer.dropEffect === 'move';\n }\n\n private async restoreInitialDraggablePosition(draggable: HTMLElement): Promise<void> {\n const { parent, index } = this.draggables.get(draggable);\n const targetIndex = Math.min(index, parent.children.length);\n\n const moveDraggable = (draggable: HTMLElement, parent: HTMLElement, index: number) => {\n const targetIndex = Math.min(index, parent.children.length);\n parent.insertBefore(draggable, parent.children[targetIndex]);\n draggable.style.transform = 'translate(0, 0)';\n this.checkMaxAssociations();\n };\n\n // Fallback if view transitions are not supported\n if (!document.startViewTransition) {\n moveDraggable(draggable, parent, index);\n return;\n }\n\n // Use view transitions if supported\n const transition = document.startViewTransition(() => {\n draggable.style.transform = '';\n moveDraggable(draggable, parent, index);\n });\n // transition.finished.then(() => {\n // draggable.style.transition = '';\n // });\n }\n\n validate(): boolean {\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\n this.reportValidity();\n return isValid;\n }\n\n override reportValidity(): boolean {\n const validationMessageElement = this.shadowRoot.querySelector('#validationMessage') as HTMLElement;\n if (validationMessageElement) {\n if (!this._internals.validity.valid) {\n validationMessageElement.textContent = this._internals.validationMessage;\n validationMessageElement.style.display = 'block';\n } else {\n validationMessageElement.textContent = '';\n validationMessageElement.style.display = 'none';\n }\n }\n return this._internals.validity.valid;\n }\n\n protected checkMaxAssociations(): void {\n this.droppables.forEach((d, index) => {\n const maxMatch = +(d.getAttribute('match-max') || 1);\n const currentAssociations = d.querySelectorAll('[qti-draggable=\"true\"]').length;\n const disableDroppable = currentAssociations >= maxMatch;\n if (disableDroppable) {\n this.disableDroppable(d);\n } else {\n this.enableDroppable(d);\n }\n });\n }\n\n private disableDroppable(droppable: Element): void {\n droppable.setAttribute('disabled', '');\n droppable.removeAttribute('dropzone');\n }\n\n private enableDroppable(droppable: Element): void {\n droppable.removeAttribute('disabled');\n droppable.setAttribute('dropzone', 'move');\n }\n\n get value(): string[] {\n return this.collectResponseData();\n }\n\n set value(value: string[]) {\n if (this.isMatchTabular()) return;\n this.resetDroppables();\n value?.forEach(entry => this.placeResponse(entry));\n\n // Assuming this.value is an array of strings\n if (Array.isArray(value)) {\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 const droppable = this.findDroppableById(dropId);\n dragIds.forEach(dragId => this.placeDraggableInDroppable(dragId, droppable));\n }\n\n private findDroppableById(identifier: string): Element | undefined {\n return this.droppables.find(drop => drop.getAttribute('identifier') === identifier);\n }\n\n private async placeDraggableInDroppable(dragId: string, droppable: Element): Promise<void> {\n const draggable = this.querySelector<HTMLElement>(`[identifier=${dragId}]`);\n if (!droppable || !draggable) {\n console.error(`Cannot find draggable or droppable with the given identifier: ${dragId}`);\n return;\n }\n const moveElement = (): void => {\n draggable.style.transform = 'translate(0, 0)';\n droppable.appendChild(draggable);\n this.checkMaxAssociations();\n };\n\n if (!document.startViewTransition) {\n moveElement();\n } else {\n const transition = document.startViewTransition(moveElement);\n await transition.finished;\n }\n }\n\n private getValidAssociations(): number {\n return this.droppables.filter(d => d.childElementCount > 0).length;\n }\n\n public saveResponse(): void {\n this.validate();\n const response = this.collectResponseData();\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 = droppable.querySelectorAll('[qti-draggable=\"true\"]');\n const identifiers = Array.from(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 reset(save = true): void {\n this.resetDroppables();\n if (save) this.saveResponse();\n }\n\n private async resetDroppables(): Promise<void> {\n const moveDraggable = (draggable: HTMLElement, parent: HTMLElement, index: number) => {\n draggable.style.transform = 'translate(0, 0)';\n const targetIndex = Math.min(index, parent.children.length);\n parent.insertBefore(draggable, parent.children[targetIndex]);\n };\n\n if (!document.startViewTransition) {\n // Fallback if view transitions are not supported\n this.draggables.forEach(({ parent, index }, draggable) => {\n moveDraggable(draggable, parent, index);\n });\n return;\n }\n\n // Use view transitions if supported\n const transition = document.startViewTransition(() => {\n this.draggables.forEach(({ parent, index }, draggable) => {\n moveDraggable(draggable, parent, index);\n });\n });\n\n await transition.finished;\n }\n }\n\n return DragDropInteractionElement as Constructor<IInteraction> & T;\n};\n","// @watch decorator\n//\n// Runs when an observed property changes, e.g. @property or @state, but before the component updates.\n//\n// To wait for an update to complete after a change occurs, use `await this.updateComplete` in the handler. To start\n// watching after the initial update/render, use `{ waitUntilFirstUpdate: true }` or `this.hasUpdated` in the handler.\n//\n// Usage:\n//\n// @watch('propName')\n// handlePropChange(oldValue, newValue) {\n// ...\n// }\n\nimport type { LitElement } from 'lit';\n\ntype UpdateHandler = (prev?: unknown, next?: unknown) => void;\n\ntype NonUndefined<A> = A extends undefined ? never : A;\n\ntype UpdateHandlerFunctionKeys<T extends object> = {\n [K in keyof T]-?: NonUndefined<T[K]> extends UpdateHandler ? K : never;\n}[keyof T];\n\ninterface LiveQueryOptions {\n /**\n * If true, will only start watching after the initial update/render\n */\n}\n\nexport function liveQuery(querySelector: string, options?: LiveQueryOptions) {\n let observer: MutationObserver;\n const resolvedOptions: Required<LiveQueryOptions> = {\n ...options\n };\n return <ElemClass extends LitElement>(\n proto: ElemClass,\n decoratedFnName: UpdateHandlerFunctionKeys<ElemClass>\n ): void => {\n const { connectedCallback, disconnectedCallback } = proto;\n\n proto.connectedCallback = function (this: ElemClass) {\n connectedCallback.call(this);\n const callback = (mutationList: MutationRecord[]) => {\n const elementsToWatch = Array.from(this.querySelectorAll(querySelector));\n for (const mutation of mutationList) {\n const addedNodes = Array.from(mutation.addedNodes).map(e => e as Element);\n const removedNodes = Array.from(mutation.addedNodes).map(e => e as Element);\n if (mutation.type === 'childList' && addedNodes.find(n => elementsToWatch.includes(n))) {\n (this[decoratedFnName] as unknown as UpdateHandler)(addedNodes, removedNodes);\n }\n }\n };\n observer = new MutationObserver(callback);\n observer.observe(this, { childList: true, subtree: true });\n\n const elementsAdded = this.querySelectorAll(querySelector) ?? [];\n (this[decoratedFnName] as unknown as UpdateHandler)(Array.from(elementsAdded), []);\n };\n\n proto.disconnectedCallback = function (this: ElemClass) {\n disconnectedCallback.call(this);\n observer.disconnect();\n };\n };\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 flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n :host::part(associables-container) {\n display: flex;\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, state } from 'lit/decorators.js';\nimport { Interaction } from '../internal/interaction/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;\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\n const uriToManifest = this.data.startsWith('http')\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 => response.json())\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 iframeDoc = iframe.contentDocument;\n\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='${removeDoubleSlashes(`${this.baseRefUrl}/${this.manifest.style[0]}`)}' rel=\"stylesheet\" />\n <script src='${removeDoubleSlashes(`${this.baseRefUrl}/${this.manifest.script[0]}`)}'></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 this.rawResponse = data;\n this.saveResponse(data);\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 = media.startsWith('http') ? media : 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 return this.rawResponse !== '';\n }\n\n get value(): string | string[] {\n return this.rawResponse;\n }\n\n set value(val: string | string[]) {\n if (typeof val === 'string') {\n this.rawResponse = val;\n this.saveResponse(val);\n } else {\n throw new Error('Value must be a string');\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 } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Interaction } from '../internal/interaction/interaction';\n@customElement('qti-end-attempt-interaction')\nexport class QtiEndAttemptInteraction extends Interaction {\n @property({ type: String, attribute: 'count-attempt' })\n public countAttempt: string = 'true';\n\n @property({ type: String })\n public title: 'end attempt';\n\n validate(): boolean {\n // not implemented by design\n return true;\n }\n\n get value(): string | string[] {\n // throw new Error('Method not implemented.');\n return '';\n }\n\n set value(_: string | string[]) {\n // not implemented by design\n }\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 { CSSResultGroup, html, PropertyValues } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { DragDropInteractionMixin } from '../internal/drag-drop/drag-drop-interaction-mixin';\nimport { Interaction } from '../internal/interaction/interaction';\nimport styles from './qti-gap-match-interaction.styles';\n@customElement('qti-gap-match-interaction')\nexport class QtiGapMatchInteraction extends DragDropInteractionMixin(Interaction, 'qti-gap-text', false, 'qti-gap') {\n private observer: MutationObserver | null = null;\n private resizeObserver: ResizeObserver | null = null;\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\" id=\"validationMessage\"></div>`;\n }\n\n override firstUpdated(_changedProperties: PropertyValues) {\n super.firstUpdated(_changedProperties);\n this.updateMinDimensionsForDrowZones();\n\n // MutationObserver to observe changes in child elements\n this.observer = new MutationObserver(() => this.updateMinDimensionsForDrowZones());\n this.observer.observe(this, { childList: true, subtree: true });\n\n // ResizeObserver to monitor size changes of `gapTexts`\n this.resizeObserver = new ResizeObserver(() => this.updateMinDimensionsForDrowZones());\n const gapTexts = this.querySelectorAll('qti-gap-text');\n gapTexts.forEach(gapText => this.resizeObserver?.observe(gapText));\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 // Cleanup ResizeObserver\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n private updateMinDimensionsForDrowZones() {\n const gapTexts = this.querySelectorAll('qti-gap-text');\n const gaps = this.querySelectorAll('qti-gap');\n let maxHeight = 0;\n let maxWidth = 0;\n gapTexts.forEach(gapText => {\n const rect = gapText.getBoundingClientRect();\n maxHeight = Math.max(maxHeight, rect.height);\n maxWidth = Math.max(maxWidth, rect.width);\n });\n\n const dragSlot = this.shadowRoot?.querySelector('[part=\"drags\"]') as HTMLElement;\n if (dragSlot) {\n dragSlot.style.minHeight = `${maxHeight}px`;\n dragSlot.style.minWidth = `${maxWidth}px`;\n }\n for (const gap of gaps) {\n gap.style.minHeight = `${maxHeight}px`;\n gap.style.minWidth = `${maxWidth}px`;\n }\n }\n\n set correctResponse(value: string | string[]) {\n let matches: { text: string; gap: string }[] = [];\n const response = Array.isArray(value) ? value : [value];\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 gap.insertAdjacentElement('afterend', textSpan);\n }\n } else if (gap.nextElementSibling?.classList.contains('correct-option')) {\n gap.nextElementSibling.remove();\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, svg } from 'lit';\nimport { customElement, query, queryAssignedElements, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { positionHotspots } from '../internal/hotspots/hotspot';\nimport { Interaction } from '../internal/interaction/interaction';\nimport { QtiHotspotChoice } from '../qti-hotspot-choice';\n\n@customElement('qti-graphic-associate-interaction')\nexport class QtiGraphicAssociateInteraction extends Interaction {\n choiceOrdering: boolean;\n hotspots;\n startPoint = null;\n endPoint = null;\n @state() _lines = [];\n @state() startCoord: { x: any; y: any };\n @state() mouseCoord: { x: number; y: number };\n @query('svg') svgContainer;\n @queryAssignedElements({ selector: 'img' }) grImage;\n\n // target the main slot make it relative and fit with the conten\n static override styles = [\n 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 }\n svg {\n position: absolute;\n top: 0px;\n left: 0px;\n }\n `\n ];\n svg: SVGSVGElement;\n\n constructor() {\n super();\n this.addEventListener('qti-register-hotspot', this.positionHotspotOnRegister);\n }\n\n reset(): void {\n this._lines = [];\n }\n validate(): boolean {\n return this._lines.length > 0;\n }\n set value(val: string | string[]) {\n if (Array.isArray(val)) {\n this._lines = val;\n }\n }\n get value(): string | string[] {\n return this._lines;\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._lines,\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._lines = this._lines.filter((_, i) => i !== index);\n this.saveResponse(this._lines);\n }}\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=\"red\"\n stroke-width=\"3\"\n />`}\n </svg>\n <slot></slot>\n </line-container>\n <div role=\"alert\" id=\"validationMessage\"></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 positionHotspots(shape, coordsNumber, img, hotspot);\n }\n\n override firstUpdated(e): void {\n super.firstUpdated(e);\n\n this.hotspots = this.querySelectorAll('qti-associable-hotspot');\n\n document.addEventListener('mousemove', event => {\n this.mouseCoord = {\n x: event.clientX - this.grImage[0].getBoundingClientRect().left,\n y: event.clientY - this.grImage[0].getBoundingClientRect().top\n };\n });\n\n this.hotspots.forEach(hotspot => {\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: this.startPoint.getAttribute('coords').split(',')[0],\n y: this.startPoint.getAttribute('coords').split(',')[1]\n };\n } else if (!this.endPoint) {\n this.endPoint = event.target;\n\n this._lines = [\n ...this._lines,\n this.startPoint.getAttribute('identifier') + ' ' + this.endPoint.getAttribute('identifier')\n ];\n this.saveResponse(this._lines);\n this.startPoint = null;\n this.endPoint = null;\n }\n });\n });\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-associate-interaction': QtiGraphicAssociateInteraction;\n }\n}\n","import { QtiHotspotChoice } from '../../qti-hotspot-choice';\n\nexport function positionHotspots(\n shape: string,\n coordsNumber: number[],\n img: HTMLImageElement,\n hotspot: QtiHotspotChoice\n) {\n switch (shape) {\n case 'circle':\n {\n const [centerX, centerY, radius] = coordsNumber;\n const centerXPer = (centerX / img.width) * 100;\n const centerYPer = (centerY / img.height) * 100;\n const radiusPer = (radius / img.width) * 100;\n hotspot.style.left = centerXPer - radiusPer + '%';\n hotspot.style.top = centerYPer - radiusPer + '%';\n hotspot.style.width = hotspot.style.height = 4 * radiusPer + 'px';\n hotspot.style.borderRadius = `9999px`;\n }\n break;\n\n case 'rect':\n {\n const [leftX, topY, rightX, bottomY] = coordsNumber;\n const leftXPer = (leftX / img.width) * 100;\n const topYPer = (topY / img.height) * 100;\n const rightXPer = (rightX / img.width) * 100;\n const bottomYPer = (bottomY / img.height) * 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\n case 'poly':\n {\n // from a,b,c,d,e,f => [{x:a, y:b},{x:c, y:d},{x:e, y:f}]\n const polycoords = coordsNumber.reduce((acc, currentValue, currentIndex, polyC) => {\n if (currentIndex % 2 === 1) {\n const lastVal = acc.pop();\n acc[acc.length] = { x: lastVal, y: polyC[currentIndex] };\n } else {\n acc.push(currentValue);\n }\n return acc;\n }, []);\n\n // calculate bounding box by finding the max ax min coordinates of x and y\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 // calculate the relative distance cause we want to use percentages\n const leftXPer = (leftX / img.width) * 100;\n const topYPer = (topY / img.height) * 100;\n const rightXPer = (rightX / img.width) * 100;\n const bottomYPer = (bottomY / img.height) * 100;\n\n // set the hotspot on x,y and set the width and height in percentages\n hotspot.style.left = (leftX / img.width) * 100 + '%';\n hotspot.style.top = (topY / img.height) * 100 + '%';\n hotspot.style.width = rightXPer - leftXPer + '%';\n hotspot.style.height = bottomYPer - topYPer + '%';\n\n // all the polygon points should be corrected caused they are from\n // image 0,0 point, and should be from the hotspot point which already\n // has been offsetted from the image in the previous few lines of code\n // also the points have a relative distance to the image, but now have\n // to have a relative distance from the width of the hotspot\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 // create clip path coordinate style in percentages\n const polyD = polygonData.map(p => Math.round(p.x) + '% ' + Math.round(p.y) + '%').join(',');\n\n // 50% 0%, 100% 50%, 50% 100%, 0% 50%\n hotspot.style.clipPath = `polygon(${polyD})`;\n }\n break;\n\n default:\n break;\n }\n}\n","import { CSSResultGroup, html, PropertyValues } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { DragDropInteractionMixin } from '../internal/drag-drop/drag-drop-interaction-mixin';\nimport { QtiHotspotChoice } from '../qti-hotspot-choice';\nimport { Interaction } from '../internal/interaction/interaction';\nimport styles from './qti-graphic-gap-match-interaction.styles';\n@customElement('qti-graphic-gap-match-interaction')\nexport class QtiGraphicGapMatchInteraction extends DragDropInteractionMixin(\n Interaction,\n 'qti-gap-img, qti-gap-text',\n false,\n 'qti-associable-hotspot'\n) {\n static styles: CSSResultGroup = styles;\n\n private observer: MutationObserver | null = null;\n private resizeObserver: ResizeObserver | null = null;\n\n override render() {\n return html` <slot name=\"prompt\"></slot>\n <slot part=\"image\"></slot>\n <slot part=\"drags\" name=\"drags\"></slot>\n <div role=\"alert\" id=\"validationMessage\"></div>`;\n }\n\n override firstUpdated(_changedProperties: PropertyValues) {\n super.firstUpdated(_changedProperties);\n this.updateMinDimensionsForDrowZones();\n\n // MutationObserver to observe changes in child elements\n this.observer = new MutationObserver(() => this.updateMinDimensionsForDrowZones());\n this.observer.observe(this, { childList: true, subtree: true });\n\n // ResizeObserver to monitor size changes of `gapTexts`\n this.resizeObserver = new ResizeObserver(() => this.updateMinDimensionsForDrowZones());\n const draggableGaps = this.querySelectorAll('qti-gap-img, qti-gap-text');\n draggableGaps.forEach(gapText => this.resizeObserver?.observe(gapText));\n }\n\n private updateMinDimensionsForDrowZones() {\n const draggableGaps = this.querySelectorAll('qti-gap-img, qti-gap-text');\n const gaps = this.querySelectorAll('qti-associable-hotspot');\n let maxHeight = 0;\n let maxWidth = 0;\n draggableGaps.forEach(gapText => {\n const rect = gapText.getBoundingClientRect();\n maxHeight = Math.max(maxHeight, rect.height);\n maxWidth = Math.max(maxWidth, rect.width);\n });\n const slots = this.shadowRoot.querySelectorAll('slot');\n const dragSlot = Array.from(slots).find(slot => slot.name === 'drags') as HTMLElement;\n if (dragSlot) {\n dragSlot.style.minHeight = `${maxHeight}px`;\n dragSlot.style.minWidth = `${maxWidth}px`;\n }\n for (const gap of gaps) {\n gap.style.minHeight = `${maxHeight}px`;\n gap.style.minWidth = `${maxWidth}px`;\n }\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// 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-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 { css, html } from 'lit';\nimport { Choice, ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { QtiHotspotChoice } from '../qti-hotspot-choice';\n\nimport { customElement } from 'lit/decorators.js';\nimport { positionHotspots } from '../internal/hotspots/hotspot';\nimport { Interaction } from '../internal/interaction/interaction';\n\ntype HotspotChoice = Choice & { order: number };\n\n@customElement('qti-graphic-order-interaction')\nexport class QtiGraphicOrderInteraction extends ChoicesMixin(Interaction, 'qti-hotspot-choice') {\n choiceOrdering: boolean;\n\n protected _choiceElements: Choice[] = [];\n\n // do not select ( highlight blue, the image)\n // target the main slot make it relative and fit with the conten\n static override styles = [\n 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 ];\n\n override render() {\n return html`\n <slot name=\"prompt\"></slot>\n <!-- slot for the prompt -->\n <slot></slot>\n <!-- slot for the image and hotspots -->\n <div role=\"alert\" id=\"validationMessage\"></div>\n `;\n }\n\n private setHotspotOrder(e: CustomEvent<{ identifier: string; checked: boolean }>): void {\n const { identifier } = e.detail;\n\n const hotspot = this._choiceElements.find(el => el.getAttribute('identifier') === identifier) as HotspotChoice;\n\n const maxSelection = this._choiceElements.length;\n if (!this.choiceOrdering) {\n this.choiceOrdering = true;\n if (hotspot.order == null) {\n if ((this._choiceElements as HotspotChoice[]).filter(i => i.order > 0).length >= maxSelection) {\n this.choiceOrdering = false;\n return; // don't do anything if user already selected 5 images.\n }\n hotspot.order = (this._choiceElements as HotspotChoice[]).filter(i => !!i.order).length + 1;\n this.choiceOrdering = false;\n return;\n } else {\n (this._choiceElements as HotspotChoice[]).forEach(hotspot => {\n if (hotspot.order > hotspot.order) {\n hotspot.order--;\n }\n return hotspot;\n });\n hotspot.order = null;\n }\n this.choiceOrdering = false;\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 positionHotspots(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, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { ChoicesMixin } from '../internal/choices/choices.mixin';\nimport { positionHotspots } from '../internal/hotspots/hotspot';\nimport { QtiHotspotChoice } from '../qti-hotspot-choice';\nimport { Interaction } from '../internal/interaction/interaction';\n\n@customElement('qti-hotspot-interaction')\nexport class QtiHotspotInteraction extends ChoicesMixin(Interaction, 'qti-hotspot-choice') {\n // do not select ( highlight blue, the image)\n // target the main slot make it relative and fit with the conten\n static override styles = [\n 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 /* width:100%; */\n }\n `\n ];\n override render() {\n return html`\n <slot name=\"prompt\"></slot>\n <!-- slot for the prompt -->\n <slot></slot>\n <!-- slot for the image and hotspots -->\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 positionHotspots(shape, coordsNumber, img, 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 { CSSResultGroup, html } from 'lit';\nimport { DragDropInteractionMixin } from '../internal/drag-drop/drag-drop-interaction-mixin';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { ResponseInteraction } from '../../internal/expression-result';\nimport '../qti-simple-associable-choice';\nimport { QtiSimpleAssociableChoice } from '../qti-simple-associable-choice';\nimport styles from './qti-match-interaction.styles';\nimport { Interaction } from '../internal/interaction/interaction';\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',\n false,\n 'qti-simple-match-set:last-of-type qti-simple-associable-choice'\n) {\n static styles: CSSResultGroup = styles;\n\n rows: QtiSimpleAssociableChoice[];\n cols: QtiSimpleAssociableChoice[];\n lastCheckedRadio: HTMLInputElement | null = null;\n\n @state() _response: string | string[] = [];\n // dragDropApi: TouchDragAndDrop;\n get value(): string[] {\n if (!this.classList.contains('qti-match-tabular')) return super.value as string[];\n else return this._response as string[];\n }\n set value(val: string[]) {\n if (!this.classList.contains('qti-match-tabular')) super.value = val;\n else this._response = val;\n }\n @state() correctOptions: string[] = [];\n @property({ type: String, attribute: 'response-identifier' }) responseIdentifier: string = '';\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n // await this.updateComplete;\n // this.dragDropApi = new TouchDragAndDrop();\n // this.dragDropApi.addDraggableElements(\n // this.querySelectorAll('qti-simple-match-set:first-of-type qti-simple-associable-choice')\n // );\n // this.dragDropApi.addDroppableElements(\n // this.querySelectorAll('qti-simple-match-set:last-of-type qti-simple-associable-choice')\n // );\n this.rows = Array.from<QtiSimpleAssociableChoice>(\n this.querySelectorAll('qti-simple-match-set:first-of-type qti-simple-associable-choice')\n );\n this.cols = Array.from<QtiSimpleAssociableChoice>(\n this.querySelectorAll('qti-simple-match-set:last-of-type qti-simple-associable-choice')\n );\n\n this.value = [];\n }\n\n 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 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.value) {\n this.value = [value];\n } else if (this.value.indexOf(value) === -1) {\n if (type === 'radio') {\n this.value = this.value.filter(v => v.indexOf(name) === -1);\n }\n this.value = [...this.value, value];\n }\n this.lastCheckedRadio = checkbox;\n } else {\n this.value = this.value.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.value) ? [...this.value] : this.value\n }\n })\n );\n };\n\n set correctResponse(responseValue: string | string[]) {\n if (responseValue === '') {\n this.correctOptions = [];\n return;\n } else if (Array.isArray(responseValue)) {\n this.correctOptions = responseValue;\n }\n }\n\n override render() {\n if (!this.classList.contains('qti-match-tabular')) {\n return html`<slot name=\"prompt\"></slot> <slot></slot>\n <div role=\"alert\" id=\"validationMessage\"></div>`;\n }\n return html`\n <slot name=\"prompt\"></slot>\n <table>\n <tr>\n <td></td>\n ${this.cols.map(col => html`<th part=\"r-header\">${unsafeHTML(col.innerHTML)}</th>`)}\n </tr>\n\n ${this.rows.map(\n row =>\n html`<tr>\n <td part=\"c-header\">${unsafeHTML(row.innerHTML)}</td>\n ${this.cols.map(col => {\n const rowId = row.getAttribute('identifier');\n const colId = col.getAttribute('identifier');\n const value = `${rowId} ${colId}`;\n const selectedInRowCount = this.value.filter(v => v.split(' ')[0] === rowId).length || 0;\n const checked = this.value.includes(value);\n const part = `rb ${checked ? 'rb-checked' : ''} ${this.correctOptions.includes(value) ? 'rb-correct' : ''}`;\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 : selectedInRowCount >= row.matchMax && !checked;\n return html`<td>\n <input\n type=${row.matchMax === 1 ? 'radio' : `checkbox`}\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 </td>`;\n })}\n </tr>`\n )}\n </table>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-match-interaction': QtiMatchInteraction;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\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: 100%;\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: Boolean,\n attribute: 'fixed'\n })\n public fixed = 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 { css } from 'lit';\n// import componentStyles from '../../utilities/styles/component.styles';\n\n/* ${componentStyles} */\nexport default css`\n slot {\n /* slot where the */\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n align-items: flex-start; /* prevents the drag and drop container slots having the same height */\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';\nimport { Interaction } from '../internal/interaction/interaction';\n\n@customElement('qti-media-interaction')\nexport class QtiMediaInteraction extends Interaction {\n private _value = 0;\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 value(): string | string[] {\n return this._value.toString();\n }\n\n set value(val: string | string[]) {\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');\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 { css, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { DragDropInteractionMixin } from '../internal/drag-drop/drag-drop-interaction-mixin';\nimport { ShuffleMixin } from '../internal/shuffle/shuffle-mixin'; // Import the mixin\nimport { QtiSimpleChoice } from '../qti-simple-choice';\nimport { Interaction } from '../internal/interaction/interaction';\n\n@customElement('qti-order-interaction')\nexport class QtiOrderInteraction extends ShuffleMixin(\n DragDropInteractionMixin(Interaction, `qti-simple-choice`, true, 'drop-list'),\n 'qti-simple-choice'\n) {\n childrenMap: Element[];\n\n @state() 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 static override styles = [\n css`\n [part='drags'] {\n display: flex;\n align-items: flex-start;\n flex: 1;\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='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 ];\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.from(Array(this.nrChoices)).map(\n (_, i) =>\n html`<drop-list part=\"drop-list\" identifier=\"droplist${i}\"></drop-list>${this.showCorrectResponses &&\n this.correctResponses.length > i\n ? unsafeHTML(`<span part='correct-response'>${this.correctResponses[i]}</span>`)\n : ''}`\n )}\n </div>\n </div>`;\n }\n\n set correctResponse(value: string | string[]) {\n if (value === '') {\n this.showCorrectResponses = false;\n return;\n }\n\n if (this.correctResponses.length === 0) {\n const responses = Array.isArray(value) ? value : [value];\n\n responses.forEach(response => {\n let simpleChoice = this.querySelector(`qti-simple-choice[identifier=\"${response}\"]`);\n if (!simpleChoice) {\n simpleChoice = this.shadowRoot.querySelector(`qti-simple-choice[identifier=\"${response}\"]`);\n }\n\n const text = simpleChoice?.textContent.trim();\n this.correctResponses = [...this.correctResponses, text];\n });\n }\n\n this.showCorrectResponses = true;\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 { 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';\nimport { Interaction } from '../internal/interaction/interaction';\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 }\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()\n private _points: string[] = [];\n\n // Reference to the image element\n private _imgElement: HTMLImageElement | null = null;\n\n // Extracted click handler method\n private _onImageClick = (event: MouseEvent) => {\n if (this._points.length < this.maxChoices) {\n const x = event.offsetX;\n const y = event.offsetY;\n\n this._points = [...this._points, `${x} ${y}`];\n this.saveResponse(this._points);\n }\n };\n\n override render() {\n return html` <slot name=\"prompt\"></slot>\n <point-container>\n ${repeat(\n this._points,\n point => point,\n (point, index) => html`\n <button\n part=\"point\"\n style=${styleMap({\n position: 'absolute',\n transform: 'translate(-50%, -50%)',\n left: `${point.split(' ')[0]}px`,\n top: `${point.split(' ')[1]}px`\n })}\n aria-label=\"Remove point at ${point}\"\n @click=${(e: Event) => {\n e.stopPropagation();\n this._points = this._points.filter((_, i) => i !== index);\n this.saveResponse(this._points);\n }}\n ></button>\n `\n )}\n <slot></slot>\n </point-container>`;\n }\n\n reset(): void {\n this._points = [];\n }\n\n validate(): boolean {\n return this._points.length >= this.minChoices && this._points.length <= this.maxChoices;\n }\n\n set value(val: string | string[]) {\n this._points = Array.isArray(val) ? val : [val];\n }\n get value(): string | string[] {\n return this._points;\n }\n\n override firstUpdated(): void {\n this._imgElement = this.querySelector('img');\n\n if (this._imgElement) {\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 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 { css, html, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\n\nimport { watch } from '../../../decorators/watch';\nimport { Interaction } from '../internal/interaction/interaction';\n\n/**\n * @summary The SliderInteraction.Type (qti-slider-interaction) presents the candidate with a control for selecting a numerical value between a lower and upper bound.\n * @documentation https://www.imsglobal.org/spec/qti/v3p0/impl#h.s61xcrj4qcyj\n * @status stable\n * @since 6.0\n *\n * @event qti-register-interaction - emitted when the interaction wants to register itself\n * @event qti-interaction-response - emitted when the interaction changes\n *\n * @cssprop --show-value - shows the current value while sliding\n * @cssprop --show-ticks - shows the ticks according to steps\n * @cssprop --show-bounds - shows value for lower and upper boundary\n *\n * @csspart slider -- slider inluding, bounds and ticks and value, use it for paddings and margins\n * @csspart bounds -- div for bounds, containing two divs for with min, and max bounds value\n * @csspart ticks -- div for ticks, use lineair gradient and exposed css variables for styling\n * @csspart rail -- div for rail, style according to needs\n * @csspart knob -- div, should be relative or absolute\n * @csspart value -- div, containing value\n *\n * @slot - The default slot where <qti-simple-choice> must be placed.\n * @slot prompt - slot where the prompt is placed.\n */\n\n@customElement('qti-slider-interaction')\nexport class QtiSliderInteraction extends Interaction {\n private _value = 0;\n csLive: CSSStyleDeclaration;\n\n // @query('#knob')\n // private _knob: HTMLElement;\n\n @query('#rail')\n private _rail: HTMLElement;\n\n @property({ type: Boolean, attribute: 'step-label' }) stepLabel = false;\n\n @property({ type: Boolean }) reverse = false;\n\n private _min: number;\n @property({ type: Number, attribute: 'lower-bound' }) set min(value: number) {\n this._min = value;\n this._value = value;\n this.style.setProperty('--min', `${this._min}`);\n }\n get min(): number {\n return this._min;\n }\n\n private _max: number;\n @property({ type: Number, attribute: 'upper-bound' }) set max(value: number) {\n this._max = value;\n this.style.setProperty('--max', `${this._max}`);\n }\n get max(): number {\n return this._max;\n }\n\n private _step: number;\n @property({ type: Number, attribute: 'step' }) set step(value: number) {\n this._step = value;\n this.style.setProperty('--step', `${this._step}`);\n }\n get step(): number {\n return this._step;\n }\n\n @watch('disabled', { waitUntilFirstUpdate: true })\n _handleDisabledChange = () => {};\n\n @watch('readonly', { waitUntilFirstUpdate: true })\n _handleReadonlyChange = () => {};\n\n reset() {\n // throw new Error('Method not implemented.');\n }\n validate(): boolean {\n return true;\n }\n\n get value(): string | string[] {\n return this._value.toString();\n }\n\n set value(val: string | string[]) {\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');\n }\n }\n\n // static shadowRootOptions: ShadowRootInit = { ...LitElement.shadowRootOptions, delegatesFocus: true, mode: 'open' };\n\n constructor() {\n super();\n /* the computed style is a live property, we use this to get css variables\n see render template */\n this.csLive = getComputedStyle(this);\n }\n\n set response(myResponse: string | string[]) {\n if (Array.isArray(myResponse)) {\n console.error('QtiSliderInteraction: response is an array, but should be a single value');\n return;\n }\n const value = parseInt(myResponse);\n if (Number.isNaN(value)) {\n console.error('QtiSliderInteraction: response is not a number');\n return;\n }\n this._value = value;\n }\n\n static override styles = [css``];\n\n override render() {\n // convert the value, which is the real slider value to a percentage for the dom.\n if (this._value < this.min) {\n this._value = this.min;\n }\n if (this._value > this.max) {\n this._value = this.max;\n }\n const valuePercentage = ((this._value - this.min) / (this.max - this.min)) * 100;\n this.style.setProperty('--value-percentage', `${valuePercentage}%`);\n this.setAttribute('aria-valuenow', this.value.toString());\n\n return html`<slot name=\"prompt\"></slot>\n <div id=\"slider\" part=\"slider\">\n ${this.csLive.getPropertyValue('--show-bounds') == 'true'\n ? html`<div id=\"bounds\" part=\"bounds\">\n <div>${this._min}</div>\n <div>${this._max}</div>\n </div>`\n : nothing}\n ${this.csLive.getPropertyValue('--show-ticks') == 'true' ? html`<div id=\"ticks\" part=\"ticks\"></div>` : nothing}\n <div id=\"rail\" part=\"rail\" @mousedown=${this._onMouseDown} @touchstart=${this._onTouchMove}>\n <div id=\"knob\" part=\"knob\">\n ${this.csLive.getPropertyValue('--show-value') == 'true'\n ? html`<div id=\"value\" part=\"value\">${this.value}</div>`\n : nothing}\n </div>\n </div>\n </div>`;\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.step = 1;\n this.setAttribute('tabindex', '0');\n this.setAttribute('role', 'slider');\n }\n\n private _onTouchMove(event) {\n const handleTouchMove = event => {\n const { x } = this.getPositionFromEvent(event);\n const diffX = x - this._rail.getBoundingClientRect().left - document.documentElement.scrollLeft;\n this.calculateValue(diffX);\n event.stopPropagation();\n };\n\n const handleTouchEnd = () => {\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleTouchEnd);\n\n this.saveResponse(this.value.toString());\n };\n\n document.addEventListener('touchmove', handleTouchMove);\n document.addEventListener('touchend', handleTouchEnd);\n\n const { x } = this.getPositionFromEvent(event);\n const diffX = x - this._rail.getBoundingClientRect().left - document.documentElement.scrollLeft;\n this.calculateValue(diffX);\n event.stopPropagation();\n }\n\n private _onMouseDown(event) {\n const handleMouseMove = (event: MouseEvent) => {\n // if the qti-slider-interaction has an absolute left position and body is scrolled a bit, take account for that\n const diffX = event.pageX - this._rail.getBoundingClientRect().left - document.documentElement.scrollLeft;\n\n this.calculateValue(diffX);\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleMouseUp = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n\n this.saveResponse(this.value.toString());\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n // if the qti-slider-interaction has an absolute left position and body is scrolled a bit, take account for that\n const diffX = event.pageX - this._rail.getBoundingClientRect().left - document.documentElement.scrollLeft;\n\n this.calculateValue(diffX);\n event.preventDefault();\n event.stopPropagation();\n }\n\n /** calculateValue gets x position and compares this with the total width in pixels */\n private calculateValue(diffX: number) {\n const valueNow = this.min + ((this.max - this.min) * diffX) / this._rail.getBoundingClientRect().width;\n const roundedStepValue = this.min + Math.round((valueNow - this.min) / this._step) * this._step;\n this._value = roundedStepValue;\n }\n\n private getPositionFromEvent(e: any): {\n x: number;\n y: number;\n } {\n let _touchMove;\n if (e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel') {\n const evt = typeof e.originalEvent === 'undefined' ? e : e.originalEvent;\n const touch = evt.touches[0] || evt.changedTouches[0];\n _touchMove = {\n x: touch.pageX,\n y: touch.pageY\n };\n } else if (\n e.type == 'mousedown' ||\n e.type == 'mouseup' ||\n e.type == 'mousemove' ||\n e.type == 'mouseover' ||\n e.type == 'mouseout' ||\n e.type == 'mouseenter' ||\n e.type == 'mouseleave'\n ) {\n _touchMove = {\n x: e.clientX,\n y: e.clientY\n };\n }\n return _touchMove;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-slider-interaction': QtiSliderInteraction;\n }\n}\n","import { consume } from '@lit/context';\nimport { LitElement, html } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { Calculate } from '../internal/expression-result';\nimport { ResponseVariable } from '../internal/variables';\nimport { ItemContext, itemContext } from '../qti-assessment-item/qti-assessment-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 { 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 { 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 { 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 { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\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 { css, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\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}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-hotspot-choice': QtiHotspotChoice;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\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, 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, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\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 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\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"],"mappings":"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","names":["import_context","property","import_lit","import_decorators","xml","import_lit","import_decorators","import_decorators","import_lit","import_lit","import_lit","import_decorators","import_lit","import_decorators","import_context","import_lit","import_decorators","import_lit","import_decorators","import_context","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_context","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_if_defined","import_lit","import_lit","import_decorators","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_decorators","import_decorators","import_lit","import_lit","import_decorators","import_lit","import_decorators","import_decorators","import_decorators","import_lit","import_lit","import_lit","import_lit","import_context","import_lit","import_decorators","import_decorators","import_decorators","import_decorators","import_decorators","import_decorators","import_lit","import_lit","import_context","import_lit","import_decorators","import_decorators","import_lit","import_decorators","property","require","module","import_lit","import_decorators","import_decorators","import_decorators","draggable","parent","index","targetIndex","import_lit","import_lit","import_decorators","iframe","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_lit","import_decorators","import_if_defined","import_lit","import_decorators","import_lit","import_lit","import_decorators","hotspot","import_lit","import_decorators","import_lit","import_decorators","import_unsafe_html","import_lit","import_decorators","import_lit","import_lit","import_decorators","import_lit","import_decorators","import_unsafe_html","import_lit","import_lit","import_decorators","import_lit","import_decorators","import_repeat","import_lit","import_decorators","event","x","diffX","import_context","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators"]}