@citolab/qti-components 7.27.3 → 7.27.4

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 (48) hide show
  1. package/cdn/index.global.js +1 -1
  2. package/cdn/index.js +164 -160
  3. package/custom-elements.json +4214 -1176
  4. package/dist/base.d.ts +3 -2
  5. package/dist/base.js +1 -1
  6. package/dist/{chunk-D6EHVZG2.js → chunk-3HJE3KRM.js} +6 -8
  7. package/dist/chunk-3HJE3KRM.js.map +1 -0
  8. package/dist/{chunk-WMPG7ULB.js → chunk-424AWLRU.js} +4 -4
  9. package/dist/{chunk-3XXXAWMZ.js → chunk-FFESMKSD.js} +263 -7
  10. package/dist/chunk-FFESMKSD.js.map +1 -0
  11. package/dist/{chunk-CVB5ISWF.js → chunk-LQZCSHN5.js} +2 -2
  12. package/dist/{chunk-DGIXWHK3.js → chunk-N7S3GNUP.js} +2 -2
  13. package/dist/{chunk-RXRKP6P7.js → chunk-SX63OCDZ.js} +2 -2
  14. package/dist/{chunk-K7HR6ZAY.js → chunk-UKPCQKPF.js} +2 -2
  15. package/dist/chunk-UKPCQKPF.js.map +1 -0
  16. package/dist/{chunk-CSYOTHK2.js → chunk-XYTJOQRZ.js} +23 -16
  17. package/dist/chunk-XYTJOQRZ.js.map +1 -0
  18. package/dist/{chunk-PHCCFYNE.js → chunk-YLIYPNMK.js} +994 -2
  19. package/dist/chunk-YLIYPNMK.js.map +1 -0
  20. package/dist/{chunk-A7HX4462.js → chunk-Z2SUBRH5.js} +14 -2
  21. package/dist/{chunk-A7HX4462.js.map → chunk-Z2SUBRH5.js.map} +1 -1
  22. package/dist/elements.d.ts +67 -2
  23. package/dist/elements.js +10 -6
  24. package/dist/index.d.ts +5 -4
  25. package/dist/index.js +55 -11
  26. package/dist/interactions.js +3 -3
  27. package/dist/item.js +4 -4
  28. package/dist/loader.d.ts +2 -1
  29. package/dist/loader.js +2 -2
  30. package/dist/processing.d.ts +374 -17
  31. package/dist/processing.js +42 -2
  32. package/dist/qti-components-jsx.d.ts +1446 -389
  33. package/dist/{qti-rule-base-DGhWN-as.d.ts → qti-condition-expression-B1BYmCcq.d.ts} +1 -14
  34. package/dist/{qti-feedback-BZjWNyxP.d.ts → qti-feedback-ChmXhZuf.d.ts} +1 -1
  35. package/dist/qti-rule-base-ajOnfGXY.d.ts +16 -0
  36. package/dist/test.d.ts +2 -1
  37. package/dist/test.js +6 -6
  38. package/dist/transformers.js +1 -1
  39. package/package.json +10 -10
  40. package/dist/chunk-3XXXAWMZ.js.map +0 -1
  41. package/dist/chunk-CSYOTHK2.js.map +0 -1
  42. package/dist/chunk-D6EHVZG2.js.map +0 -1
  43. package/dist/chunk-K7HR6ZAY.js.map +0 -1
  44. package/dist/chunk-PHCCFYNE.js.map +0 -1
  45. /package/dist/{chunk-WMPG7ULB.js.map → chunk-424AWLRU.js.map} +0 -0
  46. /package/dist/{chunk-CVB5ISWF.js.map → chunk-LQZCSHN5.js.map} +0 -0
  47. /package/dist/{chunk-DGIXWHK3.js.map → chunk-N7S3GNUP.js.map} +0 -0
  48. /package/dist/{chunk-RXRKP6P7.js.map → chunk-SX63OCDZ.js.map} +0 -0
@@ -2,7 +2,7 @@ import {
2
2
  qtiTransformItem,
3
3
  qtiTransformManifest,
4
4
  qtiTransformTest
5
- } from "./chunk-K7HR6ZAY.js";
5
+ } from "./chunk-UKPCQKPF.js";
6
6
 
7
7
  // ../qti-loader/src/qti-loader.ts
8
8
  var getManifestInfo = async (manifestURL) => {
@@ -28,4 +28,4 @@ export {
28
28
  getManifestInfo,
29
29
  getItemByUri
30
30
  };
31
- //# sourceMappingURL=chunk-RXRKP6P7.js.map
31
+ //# sourceMappingURL=chunk-SX63OCDZ.js.map
@@ -94,7 +94,7 @@ function setLocation(xmlFragment, location) {
94
94
  }
95
95
  const allElements = xmlFragment.querySelectorAll("*");
96
96
  allElements.forEach((el) => {
97
- for (const attr of ["src", "href"]) {
97
+ for (const attr of ["src", "href", "srcset", "poster"]) {
98
98
  const attrValue = el.getAttribute(attr)?.trim();
99
99
  if (attrValue && !/^(data:|https?:|blob:)/.test(attrValue)) {
100
100
  const newValue = location + encodeURI(attrValue);
@@ -497,4 +497,4 @@ export {
497
497
  qtiTransformManifest,
498
498
  qtiTransformTest
499
499
  };
500
- //# sourceMappingURL=chunk-K7HR6ZAY.js.map
500
+ //# sourceMappingURL=chunk-UKPCQKPF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../qti-transformers/src/qti-transformers.ts","../../qti-transformers/src/qti-transform-item.ts","../../qti-transformers/src/qti-transform-manifest.ts","../../qti-transformers/src/qti-transform-test.ts"],"sourcesContent":["// Function to extend elements with a specific tag name by adding an extension suffix\n// Uses localName matching to handle namespaced XML documents where querySelectorAll may not work\nexport function extendElementName(xmlFragment: XMLDocument, tagName: string, extension: string) {\n // Use getElementsByTagName with '*' to find all elements, then filter by localName\n // This works correctly for both namespaced and non-namespaced XML documents\n const allElements = Array.from(xmlFragment.getElementsByTagName('*'));\n const matchingElements = allElements.filter(\n element => element.localName === tagName || element.localName?.toLowerCase() === tagName.toLowerCase()\n );\n\n matchingElements.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: Element, newTagName: string) {\n // create Elements on the ownerDocument which is usually the XMLDocument\n const newElement = element.ownerDocument.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\n// let currentRequest: XMLHttpRequest | null = null;\n\nexport function loadXML(url: string, signal?: AbortSignal): Promise<XMLDocument | null> {\n return fetch(url, { signal })\n .then(response => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.text();\n })\n .then(text => {\n const parser = new DOMParser();\n return parser.parseFromString(text, 'text/xml');\n })\n .catch(error => {\n if (error.name === 'AbortError') {\n throw error;\n }\n throw new Error(`Failed to load XML: ${error.message}`);\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\nfunction stripNamespaces(node: Node, doc: Document): Node {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n const newEl = doc.createElement(el.localName);\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i];\n newEl.setAttribute(attr.localName, attr.value);\n }\n for (let i = 0; i < el.childNodes.length; i++) {\n newEl.appendChild(stripNamespaces(el.childNodes[i], doc));\n }\n return newEl;\n }\n return node.cloneNode(false);\n}\n\nexport function toHTML(xmlFragment: Document): DocumentFragment {\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < xmlFragment.childNodes.length; i++) {\n fragment.appendChild(stripNamespaces(xmlFragment.childNodes[i], document));\n }\n return fragment;\n}\n\n// Updates src and href attributes with the base location\n// Uses querySelectorAll('*') to find all elements, then checks attributes manually\n// This handles namespaced XML documents where attribute selectors like [href] may not work\n// Note: primary-path is NOT processed here because it is resolved separately\n// by the PCI component using data-base-url in the iframe's module resolution\nexport function setLocation(xmlFragment: DocumentFragment, location: string) {\n if (!location.endsWith('/')) {\n location += '/';\n }\n\n // querySelectorAll('*') finds all descendant elements regardless of namespace\n const allElements = xmlFragment.querySelectorAll('*');\n\n allElements.forEach(el => {\n // Check each attribute we care about\n // src, srcset and poster are URLDType or xs:anyURI everywhere they're used, so we care about them\n // Note: primary-path is excluded - PCI handles module path resolution via data-base-url\n for (const attr of ['src', 'href', 'srcset', 'poster'] as const) {\n const attrValue = el.getAttribute(attr)?.trim();\n\n if (attrValue && !/^(data:|https?:|blob:)/.test(attrValue)) {\n const newValue = location + encodeURI(attrValue);\n el.setAttribute(attr, newValue);\n }\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\nexport function getShuffleQuerySelectorByTagName(tagName: string): string | string[] | null {\n switch (tagName) {\n case 'qti-choice-interaction':\n case 'qti-order-interaction':\n return 'qti-simple-choice';\n case 'qti-inline-choice-interaction':\n return 'qti-inline-choice';\n case 'qti-match-interaction':\n return [\n 'qti-simple-match-set:first-of-type qti-simple-associable-choice',\n 'qti-simple-match-set:last-of-type > qti-simple-associable-choice'\n ];\n case 'qti-gap-match-interaction':\n return 'qti-gap-text';\n case 'qti-associate-interaction':\n return 'qti-simple-associable-choice';\n default:\n return null;\n }\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 */\nimport {\n convertCDATAtoComment,\n extendElementName,\n extendElementsWithClass,\n getShuffleQuerySelectorByTagName,\n loadXML,\n parseXML,\n setLocation,\n stripStyleSheets,\n toHTML\n} from './qti-transformers';\n\n// Type definition for module resolution config\nexport interface ModuleResolutionConfig {\n waitSeconds?: number;\n context?: string;\n catchError?: boolean;\n urlArgs?: string;\n paths: {\n [key: string]: string | string[];\n };\n shim?: {\n [key: string]: {\n deps?: string[]; // Array of dependencies\n exports?: string; // The global variable to use as the module's value\n };\n };\n}\n\nexport type transformItemApi = {\n load: (uri: string, signal?: AbortSignal) => 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 configurePci: (\n baseUrl: string,\n getModuleResolutionConfig: (baseUrl: string, fileUrl: string) => Promise<ModuleResolutionConfig>,\n selector?: string\n ) => Promise<transformItemApi>;\n extendElementName: (elementName: string, extend: string) => transformItemApi;\n extendElementsWithClass: (param?: string) => transformItemApi;\n customInteraction: (baseRef: string, baseItem: string) => transformItemApi;\n convertCDATAtoComment: () => transformItemApi;\n shuffleInteractions: () => transformItemApi;\n stripStyleSheets: () => transformItemApi;\n html: () => string;\n xml: () => string;\n htmlDoc: () => DocumentFragment;\n xmlDoc: () => XMLDocument;\n};\n\nexport const qtiTransformItem = (cache: boolean = false) => {\n let xmlFragment: XMLDocument;\n let xmlUri = '';\n\n const api: transformItemApi = {\n load(uri: string, signal?: AbortSignal) {\n xmlUri = uri;\n const fullKey = encodeURI(uri);\n if (cache) {\n if (sessionStorage.getItem(fullKey)) {\n return Promise.resolve(api.parse(sessionStorage.getItem(fullKey)!));\n }\n }\n return loadXML(uri, signal).then(xml => {\n xmlFragment = xml;\n api.shuffleInteractions();\n if (cache) sessionStorage.setItem(fullKey, new XMLSerializer().serializeToString(xmlFragment));\n return api;\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 xmlUri = null;\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 async configurePci(\n baseUrl: string,\n getModuleResolutionConfig: (baseUrl: string, fileUrl: string) => Promise<ModuleResolutionConfig>,\n selector = 'qti-portable-custom-interaction'\n ): Promise<typeof api> {\n const customInteractionTypeIdentifiers: string[] = [];\n const portableCustomInteractions = xmlFragment.querySelectorAll(selector);\n\n // Avoid fetching module resolution configs for items that do not contain any PCIs.\n // This prevents unnecessary network requests when configurePci() is called for every item.\n if (portableCustomInteractions.length === 0) {\n return api;\n }\n\n // Lazily load (and cache) the default module resolution configs.\n let moduleResolutionConfig: ModuleResolutionConfig | null = null;\n let moduleResolutionFallbackConfig: ModuleResolutionConfig | null = null;\n const ensureDefaultModuleResolutionConfigs = async () => {\n if (moduleResolutionConfig === null) {\n try {\n moduleResolutionConfig = await getModuleResolutionConfig(baseUrl, '/modules/module_resolution.js');\n } catch {\n moduleResolutionConfig = null;\n }\n }\n if (moduleResolutionFallbackConfig === null) {\n try {\n moduleResolutionFallbackConfig = await getModuleResolutionConfig(\n baseUrl,\n '/modules/fallback_module_resolution.js'\n );\n } catch {\n moduleResolutionFallbackConfig = null;\n }\n }\n };\n\n for (const interaction of Array.from(portableCustomInteractions)) {\n // set data-base-url\n interaction.setAttribute('data-base-url', baseUrl);\n\n let customInteractionTypeIdentifier = interaction.getAttribute('custom-interaction-type-identifier');\n if (\n customInteractionTypeIdentifier &&\n customInteractionTypeIdentifiers.includes(customInteractionTypeIdentifier)\n ) {\n customInteractionTypeIdentifier = customInteractionTypeIdentifier + customInteractionTypeIdentifiers.length;\n interaction.setAttribute('custom-interaction-type-identifier', customInteractionTypeIdentifier);\n customInteractionTypeIdentifiers.push(customInteractionTypeIdentifier);\n }\n if (customInteractionTypeIdentifier) {\n customInteractionTypeIdentifiers.push(customInteractionTypeIdentifier);\n }\n\n // Check if qti-interaction-modules already exists\n let modulesElement = interaction.querySelector('qti-interaction-modules');\n\n // If it exists and has primary-configuration, handle that format\n if (modulesElement && modulesElement.getAttribute('primary-configuration')) {\n await ensureDefaultModuleResolutionConfigs();\n const primaryConfigPath = modulesElement.getAttribute('primary-configuration');\n if (primaryConfigPath) {\n try {\n // Load the primary configuration\n const primaryConfig = await getModuleResolutionConfig(baseUrl, `/${primaryConfigPath}`);\n\n // Get existing module elements that only have id attributes\n const existingModules = Array.from(modulesElement.querySelectorAll('qti-interaction-module'));\n\n // Update existing modules with paths from config\n for (const moduleEl of existingModules) {\n const moduleId = moduleEl.getAttribute('id');\n if (moduleId && primaryConfig.paths && primaryConfig.paths[moduleId]) {\n const primaryPath = primaryConfig.paths[moduleId];\n const primaryPathString = Array.isArray(primaryPath) ? primaryPath[0] : primaryPath;\n moduleEl.setAttribute('primary-path', primaryPathString);\n\n // Check for fallback path\n if (\n moduleResolutionFallbackConfig &&\n moduleResolutionFallbackConfig.paths &&\n moduleResolutionFallbackConfig.paths[moduleId]\n ) {\n const fallbackPath = moduleResolutionFallbackConfig.paths[moduleId];\n if (Array.isArray(fallbackPath)) {\n moduleEl.setAttribute('fallback-path', fallbackPath[0]);\n } else {\n moduleEl.setAttribute('fallback-path', fallbackPath);\n }\n }\n }\n }\n\n // Add any additional modules from primary config that aren't already present\n if (primaryConfig.paths) {\n for (const moduleId in primaryConfig.paths) {\n const existingModule = modulesElement.querySelector(`qti-interaction-module[id=\"${moduleId}\"]`);\n if (!existingModule) {\n const newModuleElement = xmlFragment.createElement('qti-interaction-module');\n newModuleElement.setAttribute('id', moduleId);\n const primaryPathString = Array.isArray(primaryConfig.paths[moduleId])\n ? primaryConfig.paths[moduleId][0]\n : primaryConfig.paths[moduleId];\n newModuleElement.setAttribute('primary-path', primaryPathString);\n\n // Check for fallback path\n if (\n moduleResolutionFallbackConfig &&\n moduleResolutionFallbackConfig.paths &&\n moduleResolutionFallbackConfig.paths[moduleId]\n ) {\n const fallbackPath = moduleResolutionFallbackConfig.paths[moduleId];\n if (Array.isArray(fallbackPath)) {\n newModuleElement.setAttribute('fallback-path', fallbackPath[0]);\n } else {\n newModuleElement.setAttribute('fallback-path', fallbackPath);\n }\n }\n\n modulesElement.appendChild(newModuleElement);\n }\n }\n }\n\n // Apply urlArgs if present in config\n if (primaryConfig.urlArgs) {\n modulesElement.setAttribute('url-args', primaryConfig.urlArgs);\n }\n } catch (error) {\n console.warn(`Failed to load primary configuration: ${primaryConfigPath}`, error);\n }\n }\n } else {\n // Original logic for when there's no existing qti-interaction-modules or no primary-configuration\n await ensureDefaultModuleResolutionConfigs();\n if (moduleResolutionConfig) {\n // Create qti-interaction-modules if it doesn't exist\n if (interaction.querySelector('qti-interaction-modules') === null) {\n modulesElement = xmlFragment.createElement('qti-interaction-modules');\n interaction.appendChild(modulesElement);\n } else {\n modulesElement = interaction.querySelector('qti-interaction-modules');\n }\n\n for (const module in moduleResolutionConfig.paths) {\n const path = moduleResolutionConfig.paths[module];\n let fallbackPath: string | string[] = '';\n\n if (\n moduleResolutionFallbackConfig &&\n moduleResolutionFallbackConfig.paths &&\n moduleResolutionFallbackConfig.paths[module]\n ) {\n fallbackPath = moduleResolutionFallbackConfig.paths[module];\n }\n\n const primaryArray = Array.isArray(path) ? path : [path];\n const fallbackPathArray = Array.isArray(fallbackPath) ? fallbackPath : [fallbackPath];\n\n // create an array with primary and fallback paths.\n const paths = primaryArray.map((primaryPath, i) => {\n const fallbackPath = fallbackPathArray.length > i ? fallbackPathArray[i] : '';\n return {\n primaryPath,\n fallbackPath\n };\n });\n\n // check if all fallbackPath elements are in the array: paths, otherwise add\n for (const fallbackPath of fallbackPathArray) {\n if (!paths.some(p => p.fallbackPath === fallbackPath)) {\n paths.push({\n primaryPath: primaryArray.length > 0 ? primaryArray[0] : fallbackPath,\n fallbackPath\n });\n }\n }\n\n // add the paths to the qti-interaction-modules\n for (const path of paths) {\n const moduleElement = xmlFragment.createElement('qti-interaction-module');\n if (path.fallbackPath) {\n moduleElement.setAttribute('fallback-path', path.fallbackPath);\n }\n moduleElement.setAttribute('id', module);\n moduleElement.setAttribute('primary-path', path.primaryPath);\n\n if (modulesElement) {\n modulesElement.appendChild(moduleElement);\n }\n }\n }\n }\n }\n }\n\n return api;\n },\n shuffleInteractions(): typeof api {\n const shuffleElements = xmlFragment.querySelectorAll(`[shuffle=\"true\"]`);\n const shuffleInteractions = Array.from(shuffleElements).filter(e =>\n e.tagName?.toLowerCase().endsWith('-interaction')\n );\n\n for (const shuffleInteraction of shuffleInteractions) {\n const query = getShuffleQuerySelectorByTagName(shuffleInteraction.tagName.toLowerCase());\n const queries = Array.isArray(query) ? query : [query];\n\n for (const q of queries) {\n const choices = Array.from(shuffleInteraction.querySelectorAll(q)) as HTMLElement[];\n\n const fixedChoices = choices\n .map((choice, originalOrder) => ({\n element: choice,\n fixed: choice.hasAttribute('fixed') && choice.getAttribute('fixed') === 'true',\n originalOrder\n }))\n .filter(choice => choice.fixed);\n\n const nonFixedChoices = choices.filter(\n choice => !choice.hasAttribute('fixed') || choice.getAttribute('fixed') !== 'true'\n );\n\n if (nonFixedChoices.length <= 1) {\n console.warn('Shuffling is not possible with fewer than 2 non-fixed elements.');\n return api;\n }\n\n const originalOrder = [...nonFixedChoices];\n let shuffled = false;\n let attempts = 0;\n\n while (!shuffled && attempts < 20) {\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 return null;\n }\n\n // Remove the shuffle attribute\n shuffleInteraction.removeAttribute('shuffle');\n\n // Reorder the elements in the DOM\n let nonFixedIndex = 0;\n for (const nonFixedChoice of nonFixedChoices) {\n nonFixedChoice.parentElement.insertBefore(nonFixedChoice, fixedChoices[nonFixedIndex]?.element);\n nonFixedIndex++;\n }\n for (const fixedChoice of fixedChoices) {\n fixedChoice.element.parentElement.insertBefore(\n fixedChoice.element,\n nonFixedChoices[fixedChoice.originalOrder]\n );\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 if (xmlUri !== null) {\n setLocation(xmlFragment, xmlUri.substring(0, xmlUri.lastIndexOf('/')));\n }\n return new XMLSerializer().serializeToString(toHTML(xmlFragment));\n },\n xml(): string {\n return new XMLSerializer().serializeToString(xmlFragment);\n },\n htmlDoc() {\n if (xmlUri !== null) {\n setLocation(xmlFragment, xmlUri.substring(0, xmlUri.lastIndexOf('/')));\n }\n return toHTML(xmlFragment);\n },\n xmlDoc(): XMLDocument {\n return xmlFragment; // new XMLSerializer().serializeToString(xmlFragment);\n }\n };\n return api;\n};\n","import { loadXML, parseXML } from './qti-transformers';\n\nexport const qtiTransformManifest = (): {\n load: (uri: string, signal?: AbortSignal) => Promise<typeof api>;\n assessmentTest: () => { href: string; identifier: string };\n} => {\n let xmlFragment: XMLDocument;\n\n const api = {\n async load(uri: string, signal: AbortSignal) {\n return new Promise<typeof api>(resolve => {\n loadXML(uri, signal).then(xml => {\n xmlFragment = xml;\n return resolve(api);\n });\n });\n },\n parse(xmlString: string) {\n xmlFragment = parseXML(xmlString);\n },\n assessmentTest() {\n const el = xmlFragment.querySelector('resource[type=\"imsqti_test_xmlv3p0\"]');\n return { href: el.getAttribute('href'), identifier: el.getAttribute('identifier') };\n }\n };\n return api;\n};\n","/**\n * Returns an object with methods to load, parse and transform QTI tests.\n * @returns An object with methods to load, parse and transform QTI tests.\n * @example\n * const qtiTransformer = qtiTransformTest();\n * await qtiTransformer.load('https://example.com/test.xml');\n * const items = qtiTransformer.items();\n * const html = qtiTransformer.html();\n * const xml = qtiTransformer.xml();\n */\n\nimport { itemsFromTest, loadXML, parseXML, setLocation, toHTML } from './qti-transformers';\n\nexport type transformTestApi = {\n load: (uri: string, signal?: AbortSignal) => Promise<transformTestApi>;\n parse: (xmlString: string) => transformTestApi;\n path: (location: string) => transformTestApi;\n fn: (fn: (xmlFragment: XMLDocument) => void) => transformTestApi;\n items: () => { identifier: string; href: string; category: string }[];\n html: () => string;\n xml: () => string;\n htmlDoc: () => DocumentFragment;\n xmlDoc: () => XMLDocument;\n};\n\nexport const qtiTransformTest = (): transformTestApi => {\n let xmlFragment: XMLDocument;\n\n const api: transformTestApi = {\n async load(uri, signal) {\n return new Promise<transformTestApi>((resolve, _) => {\n loadXML(uri, signal).then(xml => {\n xmlFragment = xml;\n\n api.path(uri.substring(0, uri.lastIndexOf('/')));\n return resolve(api);\n });\n });\n },\n parse(xmlString: string) {\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) {\n fn(xmlFragment);\n return api;\n },\n items() {\n return itemsFromTest(xmlFragment);\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;\n }\n };\n return api;\n};\n"],"mappings":"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","names":["fallbackPath","path","originalOrder"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  o as o2
3
- } from "./chunk-DGIXWHK3.js";
3
+ } from "./chunk-N7S3GNUP.js";
4
4
  import {
5
5
  A,
6
6
  E,
@@ -29,7 +29,7 @@ import {
29
29
  u,
30
30
  v,
31
31
  watch
32
- } from "./chunk-A7HX4462.js";
32
+ } from "./chunk-Z2SUBRH5.js";
33
33
  import {
34
34
  __decorateClass
35
35
  } from "./chunk-QXBXORM3.js";
@@ -2155,7 +2155,15 @@ var DragDropCoreMixin = (superClass, draggablesSelector, droppablesSelector, dra
2155
2155
  return;
2156
2156
  }
2157
2157
  downEvent.preventDefault();
2158
- this.initiateDrag(dragTarget, downEvent.clientX, downEvent.clientY, "mouse", "mouse", void 0, downEvent.isTrusted);
2158
+ this.initiateDrag(
2159
+ dragTarget,
2160
+ downEvent.clientX,
2161
+ downEvent.clientY,
2162
+ "mouse",
2163
+ "mouse",
2164
+ void 0,
2165
+ downEvent.isTrusted
2166
+ );
2159
2167
  });
2160
2168
  const touchDragSub = shadowRoot.when("touchstart").filter((e5) => {
2161
2169
  const target = findDraggableTarget(e5, draggablesSelector);
@@ -2173,7 +2181,15 @@ var DragDropCoreMixin = (superClass, draggablesSelector, droppablesSelector, dra
2173
2181
  this.lastTouchStartAt = Date.now();
2174
2182
  startEvent.preventDefault();
2175
2183
  startEvent.stopPropagation();
2176
- this.initiateDrag(dragTarget, touch.clientX, touch.clientY, "touch", "touch", void 0, startEvent.isTrusted);
2184
+ this.initiateDrag(
2185
+ dragTarget,
2186
+ touch.clientX,
2187
+ touch.clientY,
2188
+ "touch",
2189
+ "touch",
2190
+ void 0,
2191
+ startEvent.isTrusted
2192
+ );
2177
2193
  });
2178
2194
  let keyboardState = {
2179
2195
  dragging: false,
@@ -3302,11 +3318,7 @@ var DragDropSlottedSortableMixin = (superClass, sortableItemSelector = '[qti-dra
3302
3318
  this.#sourceSlot = containingDroppable;
3303
3319
  this.#sortableContext.sortContainer = containingDroppable;
3304
3320
  const rect = dragElement.getBoundingClientRect();
3305
- this.#sortableContext.placeholder = createDropPlaceholder(
3306
- dragElement,
3307
- rect,
3308
- this.sortablePlaceholderConfig
3309
- );
3321
+ this.#sortableContext.placeholder = createDropPlaceholder(dragElement, rect, this.sortablePlaceholderConfig);
3310
3322
  const slotAttr = dragElement.getAttribute("slot");
3311
3323
  if (slotAttr) {
3312
3324
  this.#sortableContext.placeholder.setAttribute("slot", slotAttr);
@@ -4729,12 +4741,7 @@ var qti_gap_match_interaction_styles_default = i`
4729
4741
  `;
4730
4742
 
4731
4743
  // ../interactions/gap-match-interaction/src/qti-gap-match-interaction.ts
4732
- var SlottedBase2 = DragDropSlottedMixin(
4733
- Interaction,
4734
- "qti-gap-text",
4735
- "qti-gap",
4736
- `slot[part='drags']`
4737
- );
4744
+ var SlottedBase2 = DragDropSlottedMixin(Interaction, "qti-gap-text", "qti-gap", `slot[part='drags']`);
4738
4745
  var QtiGapMatchInteraction = class extends DragDropSlottedSortableMixin(SlottedBase2, '[qti-draggable="true"]') {
4739
4746
  static {
4740
4747
  this.styles = qti_gap_match_interaction_styles_default;
@@ -9749,4 +9756,4 @@ lit-html/node/directives/ref.js:
9749
9756
  * SPDX-License-Identifier: BSD-3-Clause
9750
9757
  *)
9751
9758
  */
9752
- //# sourceMappingURL=chunk-CSYOTHK2.js.map
9759
+ //# sourceMappingURL=chunk-XYTJOQRZ.js.map