{"_id":"@ae-studio/qti-renderer","_rev":"4-cdef86f63a1077ead57372cf7df767a0","name":"@ae-studio/qti-renderer","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@ae-studio/qti-renderer","version":"0.1.0","keywords":["qti","qti-3","qti-3.0","qti-renderer","qti-validator","qti-validation","qti-schema","assessment","renderer","validator","validation","xml-validation","wasm","webassembly","ims-qti","question-test-interoperability"],"author":{"name":"AE Studio"},"license":"MIT","_id":"@ae-studio/qti-renderer@0.1.0","maintainers":[{"name":"caiodoneda","email":"caiodoneda@gmail.com"},{"name":"danielcamargo","email":"daniel@ae.studio"},{"name":"daniel.agency","email":"daniel.cruz@ae.studio"},{"name":"aestudio","email":"it-services@ae.studio"},{"name":"wgrisa","email":"grisa.william@gmail.com"},{"name":"gustavo.higuchi","email":"gghiguchi@gmail.com"},{"name":"etchen99","email":"ed@ae.studio"},{"name":"efrainesquivel","email":"efrainesquivel@gmail.com"},{"name":"william.sanches.ae","email":"william.sanches@ae.studio"},{"name":"gfpacheco","email":"guilherme.f.pacheco@gmail.com"}],"homepage":"https://github.com/agencyenterprise/qti-3-player#readme","bugs":{"url":"https://github.com/agencyenterprise/qti-3-player/issues"},"dist":{"shasum":"a7d857074011c1b51ef5eb9cc33fbc612c10f364","tarball":"https://registry.npmjs.org/@ae-studio/qti-renderer/-/qti-renderer-0.1.0.tgz","fileCount":84,"integrity":"sha512-eqomsto+rrzp/E2/9KKQAkFBssYlGDuDs7agjXgBRmcpkD4vRyUNHIub1XcEObmA6Zn45yB+u8YG8TEsZ4xGPQ==","signatures":[{"sig":"MEUCIGu+anKSK8XXykWExe/FZohifrBguCFn0FX3kRFRlS7EAiEAnPECI/XlRd3x60/xc5bGh9rxhAcNTLUf8HAUGkvkp1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1347887},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dist/qti-base.css":"./dist/qti-base.css","./dist/qti-custom.css":"./dist/qti-custom.css"},"gitHead":"ed1b0b219c44a8a0fe13e13287b107183ca876a5","scripts":{"dev":"tsc --watch","test":"vitest","build":"tsc && cp -r assets/* dist/","test:run":"vitest run","update-schemas":"tsx scripts/update-schemas.ts","test-validation":"tsx scripts/test-validation.ts"},"_npmUser":{"name":"caiodoneda","email":"caiodoneda@gmail.com"},"repository":{"url":"git+https://github.com/agencyenterprise/qti-3-player.git","type":"git"},"_npmVersion":"11.7.0","description":"Framework-agnostic QTI 3.x renderer and validator with WASM-powered client-side XML schema validation","directories":{},"_nodeVersion":"25.4.0","dependencies":{"xmllint-wasm":"^5.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","jsdom":"^27.4.0","vitest":"^4.0.17","@vitest/ui":"^4.0.17","typescript":"^5.0.0","@xmldom/xmldom":"^0.8.10"},"_npmOperationalInternal":{"tmp":"tmp/qti-renderer_0.1.0_1769204214854_0.16561631885214534","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@ae-studio/qti-renderer","version":"0.1.1","keywords":["qti","qti-3","qti-3.0","qti-renderer","qti-validator","qti-validation","qti-schema","assessment","renderer","validator","validation","xml-validation","wasm","webassembly","ims-qti","question-test-interoperability"],"author":{"name":"AE Studio"},"license":"MIT","_id":"@ae-studio/qti-renderer@0.1.1","maintainers":[{"name":"caiodoneda","email":"caiodoneda@gmail.com"},{"name":"danielcamargo","email":"daniel@ae.studio"},{"name":"daniel.agency","email":"daniel.cruz@ae.studio"},{"name":"aestudio","email":"it-services@ae.studio"},{"name":"wgrisa","email":"grisa.william@gmail.com"},{"name":"gustavo.higuchi","email":"gghiguchi@gmail.com"},{"name":"etchen99","email":"ed@ae.studio"},{"name":"efrainesquivel","email":"efrainesquivel@gmail.com"},{"name":"william.sanches.ae","email":"william.sanches@ae.studio"},{"name":"gfpacheco","email":"guilherme.f.pacheco@gmail.com"}],"homepage":"https://github.com/agencyenterprise/qti-3-player#readme","bugs":{"url":"https://github.com/agencyenterprise/qti-3-player/issues"},"dist":{"shasum":"8b5ab6b92533304ef846691ed7638cfb2c6c343d","tarball":"https://registry.npmjs.org/@ae-studio/qti-renderer/-/qti-renderer-0.1.1.tgz","fileCount":94,"integrity":"sha512-Bn3r7orv89AZAry/xO91CII/imjzLEk86nygijeBsna+beveVp0231A6MsByYRm4tW0sYy5i7fzg/Bm9sCEeQg==","signatures":[{"sig":"MEUCIC2HvK9HSY6/WH769L3f2ztr+qfZ9++0FV+yt1nP4N3oAiEA9MuwgdvkucupRgtm+aDLJOrK6HVP8XgUCcnRuN2Vcq0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1365800},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dist/qti-base.css":"./dist/qti-base.css","./dist/qti-custom.css":"./dist/qti-custom.css"},"gitHead":"053e920817b9ed5a09910927cd341476825460fb","scripts":{"dev":"tsc --watch","test":"vitest","build":"tsc && cp -r assets/* dist/","test:run":"vitest run","update-schemas":"tsx scripts/update-schemas.ts","test-validation":"tsx scripts/test-validation.ts"},"_npmUser":{"name":"caiodoneda","email":"caiodoneda@gmail.com"},"repository":{"url":"git+https://github.com/agencyenterprise/qti-3-player.git","type":"git"},"_npmVersion":"11.7.0","description":"Framework-agnostic QTI 3.x renderer and validator with WASM-powered client-side XML schema validation","directories":{},"_nodeVersion":"25.4.0","dependencies":{"xmllint-wasm":"^5.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","jsdom":"^27.4.0","vitest":"^4.0.17","@vitest/ui":"^4.0.17","typescript":"^5.0.0","@xmldom/xmldom":"^0.8.10"},"_npmOperationalInternal":{"tmp":"tmp/qti-renderer_0.1.1_1769547409073_0.7552180735416647","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@ae-studio/qti-renderer","version":"0.1.2","keywords":["qti","qti-3","qti-3.0","qti-renderer","qti-validator","qti-validation","qti-schema","assessment","renderer","validator","validation","xml-validation","wasm","webassembly","ims-qti","question-test-interoperability"],"author":{"name":"AE Studio"},"license":"MIT","_id":"@ae-studio/qti-renderer@0.1.2","maintainers":[{"name":"caiodoneda","email":"caiodoneda@gmail.com"},{"name":"danielcamargo","email":"daniel@ae.studio"},{"name":"daniel.agency","email":"daniel.cruz@ae.studio"},{"name":"aestudio","email":"it-services@ae.studio"},{"name":"wgrisa","email":"grisa.william@gmail.com"},{"name":"gustavo.higuchi","email":"gghiguchi@gmail.com"},{"name":"etchen99","email":"ed@ae.studio"},{"name":"efrainesquivel","email":"efrainesquivel@gmail.com"},{"name":"william.sanches.ae","email":"william.sanches@ae.studio"},{"name":"gfpacheco","email":"guilherme.f.pacheco@gmail.com"}],"homepage":"https://github.com/agencyenterprise/qti-3-player#readme","bugs":{"url":"https://github.com/agencyenterprise/qti-3-player/issues"},"dist":{"shasum":"927f4fe55023dc28743bbf247f3b36fe922919c0","tarball":"https://registry.npmjs.org/@ae-studio/qti-renderer/-/qti-renderer-0.1.2.tgz","fileCount":85,"integrity":"sha512-D+3/Z5f/gsxvP+RL73K1u+9OLXH+ctg4xNigGGoI2vonEB0x8EVchcLFnOl5sraEXY8kUYOdDty2Rt2C60Jqxg==","signatures":[{"sig":"MEYCIQC6TCk9f1wcp0U1amGxOojbpRiOWQQMWgmqonT5lJOibgIhAISG3GG23PlzRt/bwIWQXaHEhjQ5nCuBkJxvF4OXblwu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1422540},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./dist/qti-base.css":"./dist/qti-base.css","./dist/qti-custom.css":"./dist/qti-custom.css"},"gitHead":"c5e926260e2ecd8157c608a4a06c45545fdcd1e9","scripts":{"dev":"tsc --watch","test":"vitest","build":"npm run generate-schemas && tsc && cp assets/*.css dist/","test:run":"vitest run","update-schemas":"tsx scripts/update-schemas.ts","test-validation":"tsx scripts/test-validation.ts","generate-schemas":"tsx scripts/generate-schemas.ts"},"_npmUser":{"name":"caiodoneda","email":"caiodoneda@gmail.com"},"repository":{"url":"git+https://github.com/agencyenterprise/qti-3-player.git","type":"git"},"_npmVersion":"11.7.0","description":"Framework-agnostic QTI 3.x renderer and validator with WASM-powered client-side XML schema validation","directories":{},"_nodeVersion":"25.4.0","dependencies":{"xmllint-wasm":"^5.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","jsdom":"^27.4.0","vitest":"^4.0.17","@vitest/ui":"^4.0.17","typescript":"^5.0.0","@xmldom/xmldom":"^0.8.10"},"_npmOperationalInternal":{"tmp":"tmp/qti-renderer_0.1.2_1769703444566_0.031173951513018272","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@ae-studio/qti-renderer","version":"0.1.3","description":"Framework-agnostic QTI 3.x renderer and validator with WASM-powered client-side XML schema validation","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"},"./dist/qti-base.css":"./dist/qti-base.css","./dist/qti-custom.css":"./dist/qti-custom.css"},"scripts":{"generate-schemas":"tsx scripts/generate-schemas.ts","build:assets":"mkdir -p dist && rsync -a --exclude='*.css' assets/ dist/","build:css":"mkdir -p dist && postcss assets/qti-base.css -o dist/qti-base.css && postcss assets/qti-custom.css -o dist/qti-custom.css","build":"npm run generate-schemas && tsc && npm run build:assets && npm run build:css","dev":"tsc --watch","test":"vitest","test:run":"vitest run","update-schemas":"tsx scripts/update-schemas.ts","test-validation":"tsx scripts/test-validation.ts"},"keywords":["qti","qti-3","qti-3.0","qti-renderer","qti-validator","qti-validation","qti-schema","assessment","renderer","validator","validation","xml-validation","wasm","webassembly","ims-qti","question-test-interoperability"],"author":{"name":"AE Studio"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/agencyenterprise/qti-3-player.git"},"homepage":"https://github.com/agencyenterprise/qti-3-player#readme","bugs":{"url":"https://github.com/agencyenterprise/qti-3-player/issues"},"publishConfig":{"access":"public"},"devDependencies":{"postcss":"^8.5.6","postcss-cli":"^11.0.1","postcss-nested":"^7.0.2","@vitest/ui":"^4.0.17","@xmldom/xmldom":"^0.8.10","jsdom":"^27.4.0","tsx":"^4.19.2","typescript":"^5.0.0","vitest":"^4.0.17"},"dependencies":{"xmllint-wasm":"^5.1.0"},"_id":"@ae-studio/qti-renderer@0.1.3","gitHead":"07d9a570a39551d1d9d23e700e0afc9d6209dacd","_nodeVersion":"22.13.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-7puyTJH8A3/efMSTRfK65bvS8OvEHuU2gVJ2NNEh/pqB7lS4Se6IBDFsl1hQdo/m+HhN1VviL7ESuVT4HQKYbw==","shasum":"cb49c4e0fcef6a0a8f2882278f5d61bc668d874c","tarball":"https://registry.npmjs.org/@ae-studio/qti-renderer/-/qti-renderer-0.1.3.tgz","fileCount":114,"unpackedSize":2616852,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHBRffApExazWLmbfQ6KSgFFL0L7VXWnWCua89tsxSo9AiAUGTxLOpjqo+whgIEsLDouJqQ+WwxD77tJkXlakqOUUg=="}]},"_npmUser":{"name":"allangirao","email":"allan.girao@gmail.com"},"directories":{},"maintainers":[{"name":"caiodoneda","email":"caiodoneda@gmail.com"},{"name":"danielcamargo","email":"daniel@ae.studio"},{"name":"daniel.agency","email":"daniel.cruz@ae.studio"},{"name":"aestudio","email":"it-services@ae.studio"},{"name":"wgrisa","email":"grisa.william@gmail.com"},{"name":"gustavo.higuchi","email":"gghiguchi@gmail.com"},{"name":"etchen99","email":"ed@ae.studio"},{"name":"allangirao","email":"allan.girao@gmail.com"},{"name":"william.sanches.ae","email":"william.sanches@ae.studio"},{"name":"gfpacheco","email":"guilherme.f.pacheco@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/qti-renderer_0.1.3_1770931588773_0.6406022383490151"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-23T21:36:54.765Z","modified":"2026-02-12T21:26:29.116Z","0.1.0":"2026-01-23T21:36:55.030Z","0.1.1":"2026-01-27T20:56:49.271Z","0.1.2":"2026-01-29T16:17:24.783Z","0.1.3":"2026-02-12T21:26:28.918Z"},"bugs":{"url":"https://github.com/agencyenterprise/qti-3-player/issues"},"author":{"name":"AE Studio"},"license":"MIT","homepage":"https://github.com/agencyenterprise/qti-3-player#readme","keywords":["qti","qti-3","qti-3.0","qti-renderer","qti-validator","qti-validation","qti-schema","assessment","renderer","validator","validation","xml-validation","wasm","webassembly","ims-qti","question-test-interoperability"],"repository":{"type":"git","url":"git+https://github.com/agencyenterprise/qti-3-player.git"},"description":"Framework-agnostic QTI 3.x renderer and validator with WASM-powered client-side XML schema validation","maintainers":[{"name":"caiodoneda","email":"caiodoneda@gmail.com"},{"name":"danielcamargo","email":"daniel@ae.studio"},{"name":"daniel.agency","email":"daniel.cruz@ae.studio"},{"name":"aestudio","email":"it-services@ae.studio"},{"name":"wgrisa","email":"grisa.william@gmail.com"},{"name":"gustavo.higuchi","email":"gghiguchi@gmail.com"},{"name":"etchen99","email":"ed@ae.studio"},{"name":"allangirao","email":"allan.girao@gmail.com"},{"name":"william.sanches.ae","email":"william.sanches@ae.studio"},{"name":"gfpacheco","email":"guilherme.f.pacheco@gmail.com"}],"readme":"# @ae-studio/qti-renderer\n\nFramework-agnostic QTI 3.x renderer and validator library for rendering and validating QTI (Question and Test Interoperability) assessment items in web applications. Features **WASM-powered client-side XML schema validation** - validate QTI XML directly in the browser without backend dependencies.\n\n## Installation\n\n```bash\nnpm install @ae-studio/qti-renderer\n```\n\n## Quick Start\n\n### Minimal Working Example\n\nHere's a complete minimal example based on a real-world implementation:\n\n**1. HTML Setup (`index.html`):**\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>QTI Renderer Example</title>\n</head>\n<body>\n  <div id=\"qti-container\"></div>\n  <script type=\"module\" src=\"./main.js\"></script>\n</body>\n</html>\n```\n\n**2. TypeScript/JavaScript (`main.ts` or `main.js`):**\n\n```typescript\nimport { QtiRenderer } from '@ae-studio/qti-renderer';\n// Import required CSS styles - these are essential for proper styling\nimport '@ae-studio/qti-renderer/dist/qti-base.css';\nimport '@ae-studio/qti-renderer/dist/qti-custom.css';\n\nconst qtiXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<qti-assessment-item\n  xmlns=\"http://www.imsglobal.org/xsd/imsqtiasi_v3p0\" \n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://www.imsglobal.org/xsd/imsqtiasi_v3p0 https://purl.imsglobal.org/spec/qti/v3p0/schema/xsd/imsqti_asiv3p0_v1p0.xsd\"\n  identifier=\"SC_MAX_ZERO\"\n  title=\"Choice Interaction (Max Choices 0)\"\n  adaptive=\"false\"\n  time-dependent=\"false\">\n  <qti-response-declaration identifier=\"RESPONSE\" cardinality=\"multiple\" base-type=\"identifier\" />\n  <qti-item-body>\n    <qti-choice-interaction\n      response-identifier=\"RESPONSE\"\n      max-choices=\"0\"\n      orientation=\"vertical\">\n      <qti-prompt>Which of the following are greenhouse gases?</qti-prompt>\n      <qti-simple-choice identifier=\"CHOICE_A\">Carbon dioxide (CO2)</qti-simple-choice>\n      <qti-simple-choice identifier=\"CHOICE_B\">Methane (CH4)</qti-simple-choice>\n      <qti-simple-choice identifier=\"CHOICE_C\">Nitrous oxide (N2O)</qti-simple-choice>\n      <qti-simple-choice identifier=\"CHOICE_D\">Oxygen (O2)</qti-simple-choice>\n      <qti-simple-choice identifier=\"CHOICE_E\">Water vapor (H2O)</qti-simple-choice>\n    </qti-choice-interaction>\n  </qti-item-body>\n</qti-assessment-item>`;\n\nconst container = document.getElementById('qti-container')!;\n\n// Create renderer instance with options\nconst renderer = new QtiRenderer(qtiXml, {\n  showFeedback: true,\n  validateXml: true,\n  debug: false\n});\n\n// Render to container (async - returns Promise)\nrenderer.render(container).catch((error) => {\n  console.error('Error rendering QTI:', error);\n  container.innerHTML = `<div style=\"color: red; padding: 1rem;\">\n    Error rendering QTI: ${error instanceof Error ? error.message : 'Unknown error'}\n  </div>`;\n});\n```\n\n**3. Build Configuration (if using a bundler like Vite):**\n\nFor Vite projects, ensure your `vite.config.ts` handles CSS imports:\n\n```typescript\nimport { defineConfig } from 'vite';\n\nexport default defineConfig({\n  // Your config...\n});\n```\n\n**Important Configuration Notes:**\n\n- **CSS Imports**: The CSS files (`qti-base.css` and `qti-custom.css`) **must** be imported for proper styling. Without them, the rendered QTI items will not display correctly.\n- **Module Type**: This package uses ES modules. Ensure your project is configured to handle ES modules (use `type: \"module\"` in package.json or a bundler that supports ES modules).\n- **Async Rendering**: The `render()` method is asynchronous and returns a Promise. Always handle potential errors.\n\n## 🚀 Frontend XML Schema Validation (Powered by WASM)\n\n**One of the standout features of this library is client-side XML schema validation** - something that's typically only possible on the backend!\n\n### What Makes This Special?\n\nTraditional QTI validation requires:\n- ❌ Backend infrastructure\n- ❌ Server-side XML processing\n- ❌ Network round-trips for validation\n- ❌ Complex deployment pipelines\n\n**This library brings validation to the frontend** using WebAssembly (WASM), enabling:\n\n- ✅ **Instant validation** - No server round-trips needed\n- ✅ **Offline-capable** - Works without backend connectivity\n- ✅ **Zero backend dependencies** - Pure client-side validation\n- ✅ **Full schema compliance** - Validates against the official QTI 3.0 XSD schema\n\n### How It Works\n\nThe library uses [`xmllint-wasm`](https://github.com/kripken/xml.js), a WebAssembly port of the industry-standard `xmllint` XML validator. This allows us to run native XML schema validation directly in the browser:\n\n```typescript\nimport { QtiRenderer, validateXml } from '@ae-studio/qti-renderer';\n\n// Validate QTI XML before rendering\nconst qtiXml = `<?xml version=\"1.0\"?>\n<qti-assessment-item xmlns=\"...\">\n  <!-- Your QTI content -->\n</qti-assessment-item>`;\n\n// Standalone validation\nconst result = await validateXml(qtiXml);\nif (!result.valid) {\n  console.error('Validation errors:', result.errors);\n  // Errors include line numbers, column numbers, and detailed messages\n}\n\n// Or let the renderer validate automatically (default)\nconst renderer = new QtiRenderer(qtiXml, {\n  validateXml: true  // Enabled by default!\n});\n\n// Validation happens automatically during render()\nawait renderer.render(container);\n```\n\n### Validation Features\n\n- **Bundled QTI 3.0 Schema**: The official QTI 3.0 XSD schema is bundled with the package, so validation works offline\n- **Detailed Error Reporting**: Get precise error locations (line/column numbers) and descriptive messages\n- **Custom Schema Support**: Use your own XSD schema if needed\n- **Performance**: WASM provides near-native performance for XML validation\n\n### Example: Handling Validation Errors\n\n```typescript\nconst renderer = new QtiRenderer(qtiXml, {\n  validateXml: true\n});\n\ntry {\n  await renderer.render(container);\n  console.log('✅ QTI XML is valid and rendered successfully!');\n} catch (error) {\n  // Validation errors are thrown if XML is invalid\n  if (error instanceof Error) {\n    console.error('Validation failed:', error.message);\n  }\n}\n\n// Or validate separately for better error handling\nconst validationResult = await renderer.validateXml();\nif (!validationResult.valid) {\n  validationResult.errors.forEach(error => {\n    console.error(`Line ${error.line}: ${error.message}`);\n  });\n}\n```\n\nThis feature makes it perfect for:\n- **QTI Authoring Tools** - Validate content as authors create it\n- **Content Management Systems** - Real-time validation feedback\n- **Educational Platforms** - Ensure QTI content quality before publishing\n- **Development Tools** - Catch errors early in the development process\n\n## Configuration Options\n\nThe `QtiRenderer` constructor accepts an optional `QtiRendererOptions` object:\n\n```typescript\ninterface QtiRendererOptions {\n  /**\n   * Whether to enable debug logging\n   * @default false\n   */\n  debug?: boolean;\n\n  /**\n   * Whether to show feedback immediately after response\n   * @default true\n   */\n  showFeedback?: boolean;\n\n  /**\n   * Whether to validate XML against QTI schema\n   * @default true\n   */\n  validateXml?: boolean;\n\n  /**\n   * Custom validation options (schema URL, custom schema string, etc.)\n   * Only used if validateXml is true\n   */\n  validationOptions?: ValidationOptions;\n}\n```\n\n### Example with Custom Options\n\n```typescript\nconst renderer = new QtiRenderer(qtiXml, {\n  showFeedback: true,\n  validateXml: true,\n  debug: false,\n  validationOptions: {\n    // Use custom schema string\n    customSchema: '<xs:schema>...</xs:schema>',\n    // Or preload additional schema files for imports/includes\n    preloadSchemas: [\n      { fileName: 'custom.xsd', contents: '<xs:schema>...</xs:schema>' }\n    ]\n  }\n});\n```\n\n## API Reference\n\n### `QtiRenderer`\n\nThe main renderer class for QTI assessment items.\n\n#### Constructor\n\n```typescript\nnew QtiRenderer(qtiXml: string, options?: QtiRendererOptions)\n```\n\nCreates a new QTI renderer instance.\n\n- `qtiXml`: The QTI XML string to render\n- `options`: Optional configuration object\n\n#### Methods\n\n##### `render(container: HTMLElement): Promise<void>`\n\nRenders the QTI item into the specified container element.\n\n- `container`: The HTML element to render into\n- Returns: Promise that resolves when rendering is complete\n\n**Example:**\n\n```typescript\nconst container = document.getElementById('qti-container')!;\nawait renderer.render(container);\n```\n\n##### `validateXml(): Promise<ValidationResult>`\n\nValidates the QTI XML against the QTI schema. This is called automatically during `render()` if `validateXml` is enabled.\n\n- Returns: Promise resolving to validation result\n\n**Example:**\n\n```typescript\nconst result = await renderer.validateXml();\nif (!result.valid) {\n  console.error('Validation errors:', result.errors);\n}\n```\n\n### Types\n\n#### `QtiRendererOptions`\n\nConfiguration options for the QTI renderer.\n\n#### `ValidationResult`\n\n```typescript\ninterface ValidationResult {\n  valid: boolean;\n  errors: ValidationError[];\n}\n```\n\n#### `ValidationError`\n\n```typescript\ninterface ValidationError {\n  message: string;\n  rawMessage?: string;\n  line?: number;\n  column?: number;\n  fileName?: string;\n}\n```\n\n#### `ValidationOptions`\n\n```typescript\ninterface ValidationOptions {\n  /**\n   * Custom schema string to use instead of default local schema\n   */\n  customSchema?: string;\n  /**\n   * Additional schema files to preload (for imports/includes)\n   */\n  preloadSchemas?: Array<{ fileName: string; contents: string }>;\n}\n```\n\n## Features\n\n- 🎯 **Frontend XML Schema Validation** - WASM-powered client-side validation against QTI 3.0 schema (no backend needed!)\n- ✅ Response processing with conditional logic\n- ✅ Outcome variable management\n- ✅ Feedback display (inline and modal)\n- ✅ Response state management\n- ✅ Framework-agnostic (works with React, Vue, vanilla JS, etc.)\n- ✅ TypeScript support with full type definitions\n\n## Supported QTI Elements\n\nThe renderer supports a subset of QTI 3.x elements:\n\n- `qti-assessment-item`\n- `qti-item-body`\n- `qti-choice-interaction`\n- `qti-simple-choice`\n- `qti-prompt`\n- `qti-response-declaration`\n- `qti-outcome-declaration`\n- `qti-response-processing`\n- `qti-response-condition`\n- `qti-response-if`\n- `qti-response-else`\n- `qti-set-outcome-value`\n- `qti-correct-response`\n- `qti-feedback-inline`\n- `qti-modal-feedback`\n- `qti-match`\n- `qti-correct`\n- And more...\n\nSee the [QTI Support Documentation](https://github.com/agencyenterprise/qti-3-player/tree/main/docs/qti_support) for a complete checklist.\n\n\n## Framework Wrappers\n\nThis is the core renderer library. Framework-specific wrappers are available:\n\n- **React**: `@qti-renderer/react` (coming soon)\n- **Vue**: `@qti-renderer/vue` (coming soon)\n- **Vanilla JS**: `@qti-renderer/vanilla` (coming soon)\n\n## Publishing\n\nTo publish a new version of this package to npm:\n\n1. **Update the version** in `package.json`:\n   ```bash\n   npm version patch  # for 0.1.1 -> 0.1.2\n   # or\n   npm version minor  # for 0.1.1 -> 0.2.0\n   # or\n   npm version major  # for 0.1.1 -> 1.0.0\n   ```\n   Or manually edit the `version` field in `package.json`.\n\n2. **Build the package**:\n   ```bash\n   npm run build\n   ```\n\n3. **Ensure you're logged into npm**:\n   ```bash\n   npm login\n   ```\n\n4. **Publish to npm**:\n   ```bash\n   npm publish\n   ```\n\nThe package is configured with `\"access\": \"public\"` in `publishConfig`, so the scoped package `@ae-studio/qti-renderer` will be published publicly to npm.\n\n**Note:** Make sure you've run `npm run build` before publishing to ensure the `dist/` folder contains the latest compiled code and assets.\n\n## Contributing\n\nContributions are welcome! Please see the [main repository](https://github.com/agencyenterprise/qti-3-player) for contribution guidelines.\n\n## License\n\nMIT License - see [LICENSE](./LICENSE) file for details.\n\n## Links\n\n- [GitHub Repository](https://github.com/agencyenterprise/qti-3-player)\n- [Live Sandbox Demo](https://agencyenterprise.github.io/qti-3-player/)\n- [QTI Specification](https://www.imsglobal.org/question/)\n","readmeFilename":"README.md"}