{"_id":"@superbuilders/incept-renderer","_rev":"36-4d3e986fa85dfa32a4c673f1b16e4ba4","name":"@superbuilders/incept-renderer","dist-tags":{"latest":"0.1.30"},"versions":{"0.1.0":{"name":"@superbuilders/incept-renderer","version":"0.1.0","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.0","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"3eaf5ee9766956acb42ae7d9137c4081c06846d2","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.0.tgz","fileCount":13,"integrity":"sha512-62PYDBd4OriPWsP52h90rpbS0tqhgQcuxQKgFxatdKv33jj8ORdXxXC4r+6RtaE8UBgc49SBTtQClBSh6SCYrw==","signatures":[{"sig":"MEUCIGjg4Nh1Z45n2yt1tCj/dPX+K1zGB4XbMUhPuS9XhfgRAiEAmOy17VD6G6sC577qlZxUKFqKJOp1c6IAVYhvJw2ncTQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1040350},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"}},"gitHead":"d230d87790c758c3c69a7ef72719c0ebfba22053","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@radix-ui/react-label":"^2.1.7","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.0_1768519394841_0.8473634232475884","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@superbuilders/incept-renderer","version":"0.1.2","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.2","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"cfe43cd922adfc72ad2645159ca32014ee1f59de","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.2.tgz","fileCount":13,"integrity":"sha512-n0+EBPVNAMuQeW99SyHYezDzlcNefIq69CD0X1e8X4ma4cYGx0fsmiFh/2zBOlZXgV6Aw2DCOsg+Kx7YXs9t5g==","signatures":[{"sig":"MEYCIQCRrKTznyDNA3DUaDoQwWiOjkCM6yRbugU/ARLc6/pfLgIhALs1afVVXjlplHcHqkqvKaD/AXulXWFmQ0U7PI5McBs+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":982774},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"}},"gitHead":"d230d87790c758c3c69a7ef72719c0ebfba22053","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.2_1768525210004_0.5419331401062055","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@superbuilders/incept-renderer","version":"0.1.3","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.3","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"d9225195929fc4ef3091bd32c74b812eb78fdad2","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.3.tgz","fileCount":16,"integrity":"sha512-5meWa/7THscugzPPUa/pOeko/gdj0Ir7B7l+YdUfmwEyTD0z2KS7xwKm2N/hzu5ioOyNJdqz4xa+aSBGOusG1g==","signatures":[{"sig":"MEQCIHdz9KMzNKfNAc3RS71s6EJV2Sk497tjdRVU1Hc5xCT9AiBzFaGmkerbdjfdRMo5M5hSGnN1LoPAqazLlqj2xOVjvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":985340},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"}},"gitHead":"d230d87790c758c3c69a7ef72719c0ebfba22053","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.3_1768526644953_0.7126830076064772","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@superbuilders/incept-renderer","version":"0.1.4","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.4","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"3c292cc4f7fbd3611d39d5971c98cd0c0216a764","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.4.tgz","fileCount":16,"integrity":"sha512-OAvdQ8iIfLJFWGHVlfaNS2cOUZTCSJfEphEsY9RC0Jx6oboxXaD0rTPcZ5ukl/GQSc6rkEFO1v8IXsHZs46FGQ==","signatures":[{"sig":"MEUCIAfuZRqVKlTBdHW5jID1Q+6rYEYsErIefHmYxDUdan6aAiEAgaFU764CPXZlqyLhxB2m5ikiyGZbDSSiTWYKmnOJrXA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":984884},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"}},"gitHead":"d230d87790c758c3c69a7ef72719c0ebfba22053","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.4_1768527065108_0.8739930352891527","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@superbuilders/incept-renderer","version":"0.1.5","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.5","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"6b17a99ae298e09dac10704cb81b7f386fff2168","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.5.tgz","fileCount":19,"integrity":"sha512-zJHNcSJCO1lPhhEMeHY9FNhXW8vG9tSOwvg0RazPJ4PsbA/Icji/GDr10qNAtliC3DUkDrrL315kq512E6JqvQ==","signatures":[{"sig":"MEYCIQDuzwzIbAf0oDRsLXVshlqOgICpPltQaY2TBcgLsRuxVwIhALVGqrS5GfMgrqA6su+cdMLHi3ysuwEkhBWKLHO1GUyW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1021093},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":"./dist/styles/themes.css"},"gitHead":"d230d87790c758c3c69a7ef72719c0ebfba22053","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.5_1768527715118_0.5645936261489426","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@superbuilders/incept-renderer","version":"0.1.7","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.7","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"8f0639eafc27cbd5aba4569c74ef81e2b276139e","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.7.tgz","fileCount":19,"integrity":"sha512-vVENiDWpuuTQ07FuTJa8gKpuAoq4QXySe4Zxcql9QmBCyAfKL5aCRHwQaO5tN2tQ2Hgo4diy19R9n28s1ZgXEg==","signatures":[{"sig":"MEUCIDM06k/Mb9osTWbYBeJun1SK//WhR/LEDWkj91GG8olNAiEApyOky/WR04hwJEYdaOBmtt3r1SDI8731JuDNhkKXVW8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1020933},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"}},"gitHead":"d230d87790c758c3c69a7ef72719c0ebfba22053","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.7_1768528109865_0.3166270899111243","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@superbuilders/incept-renderer","version":"0.1.8","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.8","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"2f72dc30e84f93ed6859d7d49ac79e7e341c25e4","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.8.tgz","fileCount":19,"integrity":"sha512-+7ovbe9LT0R+4zCbNqLGbssF7lC3JeMR/57+kUE/yJXjoIVAt+bhDJK0R3qZ6Mbtkn40dC8IyJOpV4rNCOCSqQ==","signatures":[{"sig":"MEYCIQDkIWYkCboIw6kc1nY80FUjoXOz+vRkwbtR+eOTPOlR2wIhANfuiyHgcR435cBur+2nyVQFadPoUWV00AqNoconRSHI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1023216},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"}},"gitHead":"d230d87790c758c3c69a7ef72719c0ebfba22053","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.8_1768529471749_0.4345757253810487","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@superbuilders/incept-renderer","version":"0.1.11","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.11","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"1883e9772293baee61d8f2ab09b5e5939fab7c17","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.11.tgz","fileCount":22,"integrity":"sha512-mhsrGLJGOvCCZDSD0eQWVu8TwYDlDVRyo9/skMThOos0o99/wp8nANj7qYug/b64YWTpoCrwwhTa6/aR47XCFQ==","signatures":[{"sig":"MEUCIQDJ1Abgr/1T9WZT6SwmDp4KT/2awLkt3ohGbbHVseAejgIgIxrMoJyjWtAItPoUfgsRAUayaXbX6FxY++jnrTO8qYU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1094777},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"d230d87790c758c3c69a7ef72719c0ebfba22053","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.11_1768605179478_0.5862312236190197","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@superbuilders/incept-renderer","version":"0.1.12","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.12","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"878710c14d4732588fd004a17274e8090a14a5d6","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.12.tgz","fileCount":23,"integrity":"sha512-7F78A0rlYGHvnMRDyq/W6sHocWRcn1eGHrB0XkuOOB/sHQmL3/BpIo8WgWf1ceRvFi8Gevi4wdisCL6Iznjp/g==","signatures":[{"sig":"MEUCIFZKmNGeVLZ/GVM4sVKilC9dYA/PgrmjnrBsO8py8dbmAiEAwHHn+CTjE0LpXZQ8m9E7AyzuTZQCfPnxHocAGvhBOv0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1139853},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"821c03644cadcf7a411fab3b70d5d24e0697155f","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.12_1768801231076_0.016571441846743085","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"@superbuilders/incept-renderer","version":"0.1.13","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.13","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"b8e2aa0e8e8ff6fe568884c49bf8e9b4d8b92f0a","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.13.tgz","fileCount":23,"integrity":"sha512-g7BT+OyB9kjzIaAVoqfEenXO7TuGJhcAyBBN/+vBpbNl9i3cuA7UdETaYN+Wbrv0Z/h9WIINrFAzXgAGhOm3tw==","signatures":[{"sig":"MEUCIQDrFYRR13WMP7jYMOhvIU0zADH67MZCMSeoKgwWKSo+lgIgUX1FpvKgiyCbHHqiRfaiRnRucQw4HhHPbVnAq4eisdc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1142714},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"7a62d146c72ef72cabafc4e7900736d040d28baf","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.13_1769796745425_0.32309496227996926","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@superbuilders/incept-renderer","version":"0.1.14","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.14","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"93a792203cc681afaf39dd54e8cf0789da5cb010","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.14.tgz","fileCount":23,"integrity":"sha512-mrsUEzPOZWFPHq/b5zZcN+FGAn9yRSQIWSaog8DkF0Wn9FxtHRzC6c1fysDXD4csm4MY/D6dLcTJMgsVAZ448w==","signatures":[{"sig":"MEUCIQCM4vTi4H8+QeKIF6a6mrDZq3XPkAqfNnQoYLaBJgYKUgIgA8b8zf1/OcIk1TnYoJ1HfRyoKdDtP/OxKpb6EIePGXk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1143108},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"6b4948d68304b5017243ba9e3bead3d1eecb61a3","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.14_1769797130112_0.5047523394682514","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@superbuilders/incept-renderer","version":"0.1.15","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.15","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"b6a9e6fb01b5cc331988f9e6b68f87ca45ccce0d","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.15.tgz","fileCount":23,"integrity":"sha512-xDUISX8Pybuep7qV65eHJC9MP5OewtPrG7epSbJ+86nc9+dgTSqGJL42NG6PGZnVC7bwjAKPbUxrpJuSVEKanw==","signatures":[{"sig":"MEQCIBmATHkXF43MPKX20O571lCUPcm3utCtBfz1PCWxf/PjAiA3eed6gJNdoDQWroP98B8QwqoTNZ2gXphaaB2aZEvzKA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1095920},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"478c826f275ecf95e25fb4a123b2dec5d7f740ea","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.15_1770056842289_0.27837504276554936","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@superbuilders/incept-renderer","version":"0.1.16","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.16","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"68113ad87219d77204dbbcd4e5a789f45b5a06b6","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.16.tgz","fileCount":23,"integrity":"sha512-vzv04UHzVIqRjSIZBvVvkoOe902n3N7agRW/J19Sd6YZmuk/jI0cW/53wNRrtkepzlf4y7NvUaS85aNuObnl1A==","signatures":[{"sig":"MEQCIBdwQz/tPP3og7z2l16HMuocEmOujPw3pWKHDkEk/iajAiBV6zzPcYytNWU24B/9GTnEYfeyrv4HJnGSEbmfxamryA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1109081},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"d3c782269d1059aa3064d3788cc33f150e090db4","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.16_1770058929514_0.6276541280145551","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"@superbuilders/incept-renderer","version":"0.1.17","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.17","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"c542a83e9781c8f15b3da33ad4f3e33ba7a06a94","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.17.tgz","fileCount":23,"integrity":"sha512-vtHqpGeJT4hdIq1wOYcHW3s7WbIMHN3KBNGjILL8MABlyKe/rTWabLSWv/j9iVij0KqJ1reAI8c2rHWnonfmUg==","signatures":[{"sig":"MEYCIQCA0NWVflT6ZLQFtu8j/Ef7zuGSVYIcqAQu7h4vYYB84wIhAJBPRtmXS1pz+lfnXHjrl1USiis2TDQFtNDeO1YMKHxF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1109461},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"934e09d8df28b599399b4ffe16ff57fe7f0ca67c","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.17_1770832705728_0.26388479032856327","host":"s3://npm-registry-packages-npm-production"}},"0.1.18":{"name":"@superbuilders/incept-renderer","version":"0.1.18","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.18","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"b16c23ea4be026b3235833cb580c656467d774a7","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.18.tgz","fileCount":23,"integrity":"sha512-L5KOZjP0TuDW0oF++8XwuSzyskpDM5bMC+FIc8MyVcsoFJ4gKIvKAvC5nPi3BXxpk9TZP7w8iBCnqOJfDB26dw==","signatures":[{"sig":"MEQCIFTYeGMA4uFKAG6tCMc4lWiLwwdCxq3TJquLu6TD/BwiAiB8vOFHltCFgkvplLXCFfFiCDuwhzSsblB19ylNj8K3PQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1110829},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"6ecd34151d3d6fd544df9b11aed510b60d2f0d4b","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.18_1771443200062_0.8617398256171132","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"@superbuilders/incept-renderer","version":"0.1.19","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.19","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"b9de2e378981abccab7c1e719dc6a8eafd959b11","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.19.tgz","fileCount":23,"integrity":"sha512-J5q5jvYYqdX7ce7dcyrm7fQ2jZ6CSXQas7eNtplxHA4ALJaqQJZi8P/FhX7BGapgnj/1WXnl9mAVVEZF3QXKxw==","signatures":[{"sig":"MEYCIQD7xkERpLTCugxzL3VCgt6sQ0me50Cz0Cjrc71GoPlZ+wIhAKCYUtlbHP7DZytoJOFcQZHzwh7MrzAVfrtW7SzgfcsZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1110829},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"34cdde9d2cc0034baf8a5e70d61258b42b751f46","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.19_1771445999696_0.9059302183876714","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"@superbuilders/incept-renderer","version":"0.1.20","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.20","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"4d27941be57779c2c87de90aa6e223f75cfab33f","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.20.tgz","fileCount":23,"integrity":"sha512-b4LCoXtFk6GsaTuQH0QlV5DyYb2lI3SmzTbQEjzA+XaZCTKPtFqBwhEHnqKxREjYPVFztAqFsORP1OE0N3roIg==","signatures":[{"sig":"MEUCIEORjLpxBdCDhxLL6gqxUzhje4AMr0bREp8SRCrYyQZ0AiEA4sfjuNdwHaoBkkT8YDbgVNoyKANYLADFaxp2BPS1ITY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1110783},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"34cdde9d2cc0034baf8a5e70d61258b42b751f46","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.20_1771446701377_0.16129311864227303","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"@superbuilders/incept-renderer","version":"0.1.21","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.21","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"274037b1b4f56e4576fb5e4573b35a4d43ac69a4","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.21.tgz","fileCount":23,"integrity":"sha512-IbFdBzrr3ZVBJ7HYYoZCRIxE5NqfynqbXDKcuBb9f0lDV3EslBUS4c+5N332Y1Y7nvpLdB9ml4Y8EGtQf149mw==","signatures":[{"sig":"MEYCIQDHJ/dCCUjSCYzMuEP0ttvfr326hKdn1ByCjMksRQY/aAIhAMXhy2dQ5AbYZyQhTrjsRLf9icWC31Az0f+e/EiK8Ckz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1111843},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"34cdde9d2cc0034baf8a5e70d61258b42b751f46","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.21_1771527623394_0.6965342598426738","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"@superbuilders/incept-renderer","version":"0.1.22","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.22","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"a5e0cc0444f0fac2c8cacd3ec64d52feefc68aba","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.22.tgz","fileCount":23,"integrity":"sha512-xwfHDf/6Be/fuq2sZ6E1xf6cDVEohwTGzaGdpIFn/WRs2+bAdE3Elj+3UOnWZZ3bZfbZmHLJfdCqW1BjMhYyoQ==","signatures":[{"sig":"MEUCIH8Ss9oa6k3but9rdWgpr2kTB91h6wJ56nTc2+3KWEMyAiEAsjaJn5siLHCMzNJ0/6f49LjppT2I56XTgSqkjq31h18=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1113316},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"2c7ca6da1ac71889c6014d985d29ef8acaade32f","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.22_1771530358893_0.5708036048972094","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"@superbuilders/incept-renderer","version":"0.1.23","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.23","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"2462883bf493d9dfa19c1eecb87ad2a9c4b0253e","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.23.tgz","fileCount":23,"integrity":"sha512-hTwYl1Ez1m/ME712ORfVITuUnE7D5FYQ3Lo8mIWHeQ0cUEv16Owm7U3as44ZD2x30HTWhBhQwDtcNvyvS7GGUA==","signatures":[{"sig":"MEYCIQDJojFJuj2k8rme7FSQgkCh10hg/vLnrGXlJWWY/qssbAIhAJTX2VHJIs3NL1+t2B17of+8VFULB9NiytstqqdIrvcA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1113316},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"493825f6f1ae86e9befc74a070ec4fb3a23aece3","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"deprecated":"stranded publishes from a non-origin gitHead; use 0.1.29 or higher","repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.23_1775685965894_0.47225216521043056","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"@superbuilders/incept-renderer","version":"0.1.24","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.24","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"4d88c4e1efeeaac6063b1de7b1cec597bee64f74","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.24.tgz","fileCount":23,"integrity":"sha512-E1ABlqIrdnHbkA9hDySj1Y12HBXqujbVe1YtXca4tDHx7xwUJgvE2jmJRemcaqYwma0dUUdJaZj7fDj240pe2A==","signatures":[{"sig":"MEQCICL/wAGXk6XgVOD0O3e7NDIcvL156vRGhqgW3mtdzWgXAiBnqeIsR2Oy7W7wa+IKuXEzWDmdmj56NjwqFiR8I8VXiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1131235},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"493825f6f1ae86e9befc74a070ec4fb3a23aece3","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"deprecated":"stranded publishes from a non-origin gitHead; use 0.1.29 or higher","repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.24_1775691360134_0.12754933577858374","host":"s3://npm-registry-packages-npm-production"}},"0.1.25":{"name":"@superbuilders/incept-renderer","version":"0.1.25","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.25","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"0f229c3106b0c27da00a9118dc434f9d6a015696","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.25.tgz","fileCount":23,"integrity":"sha512-QTQ0W0yElozwnsLsP0R7HI08b5Z8bkflUkItX5fAq3451FFvo/ZzXP9buXVi4Zzn/OSEMbOlGnXmMahUOy9jgA==","signatures":[{"sig":"MEYCIQDSfNVAJ+osQcAS8V4tjVXSFe5uftjf0w6GLWwkK3EJ5AIhAIw/IbbIsFVNEaTee2qjGXXx492vKlOTH/oHQoMT/5P2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1129735},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"854eb5ff9323b6729188dc919b76b5452b18e5ec","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"deprecated":"stranded publishes from a non-origin gitHead; use 0.1.29 or higher","repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.25_1775760375742_0.8514370793354524","host":"s3://npm-registry-packages-npm-production"}},"0.1.26":{"name":"@superbuilders/incept-renderer","version":"0.1.26","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.26","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"c97e239ea6c4c09d616a487c1b546caccdff46cc","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.26.tgz","fileCount":23,"integrity":"sha512-NzeBXIa4ZNWHNK1Gk1eqQdcmPISSQYGpNJjOMvCYOqbCDiqxrDKNHMfy9rF1ACC5kK3rzMGyur6U4mJ5IPaqTw==","signatures":[{"sig":"MEUCIA6t9MMnIOseVBCe+sGM0nrpq1D+O4iNI9aju6NTfrbGAiEA0o1j7R8nsPGeD3CXGuLEYfhW4rADSG/siGVVkjg76PA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1140464},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"854eb5ff9323b6729188dc919b76b5452b18e5ec","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"deprecated":"stranded publishes from a non-origin gitHead; use 0.1.29 or higher","repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.26_1775763724822_0.41350193689194215","host":"s3://npm-registry-packages-npm-production"}},"0.1.27":{"name":"@superbuilders/incept-renderer","version":"0.1.27","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.27","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"f390896c285c030fcd13a5175db6877e44e4ec27","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.27.tgz","fileCount":23,"integrity":"sha512-JusoAaL6JtSK7ZPj8M+yUsMsYUhrPN7ehM3tyg3fru8Qe6LGM43LhHfjk6PiGN/MiEm6GhO26ALajvQy57sMHg==","signatures":[{"sig":"MEUCIQCMN+RXjHXLIw8pWDAtPVBM3I1uZeW1EH1BGcN9AvJqZQIgbajS5eyPU02IZYrAdPgKJLXVcBmYALaapqyiC+8En64=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1139798},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"67f448bd193fbbf384fd4d4b33c5814fe5dedc5d","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"deprecated":"stranded publishes from a non-origin gitHead; use 0.1.29 or higher","repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.27_1775765000576_0.13157291514842417","host":"s3://npm-registry-packages-npm-production"}},"0.1.28":{"name":"@superbuilders/incept-renderer","version":"0.1.28","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.28","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"a2ebf4b11bb345e636530171aea9e0ce4a2b96eb","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.28.tgz","fileCount":23,"integrity":"sha512-o3FG9R6ThFx0LxYIrr2cRwwtUmbo96FYuyivt/2FfCvCOlKvu+HTgAu9HwM72hy/RhSAomSbvfIi/OyWvickrg==","signatures":[{"sig":"MEQCIGC/i/55B6RnMeNchTamHVquweyfmvCEesdaWzYuJFBJAiAtlseEUfr2aIeurO/utBas9yaIra6MKRZc+qFiWcCIvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1140861},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"c68226d0a1c49ec57172b451ef76f59b1b4fd418","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"deprecated":"stranded publishes from a non-origin gitHead; use 0.1.29 or higher","repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.8.2","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"20.18.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.28_1775766472780_0.061093217783875664","host":"s3://npm-registry-packages-npm-production"}},"0.1.29":{"name":"@superbuilders/incept-renderer","version":"0.1.29","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","_id":"@superbuilders/incept-renderer@0.1.29","maintainers":[{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"homepage":"https://github.com/superbuilders/duolingo#readme","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"dist":{"shasum":"dab9061a4ed39fc814e798336f32383d60d18c1f","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.29.tgz","fileCount":23,"integrity":"sha512-6OW+d3G2aj6+yA22v9LPOhUdhn1GVfW+nQGhBdP9tacUFvfmeYuvFNg/uX1l1U3b1zK5tP5fGgvj+RlUV1FfLA==","signatures":[{"sig":"MEUCIGPDDNOg0sEvpZlyhl5DvlJAtepmP012AG4K7BNoBBfaAiEArSyXZuVb8i0WElMPQPdep2vWwVqRn9OQKSBpGwViYfE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1132913},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"gitHead":"2eb25ac41537ce6aeb020d211375ca5caf636b21","scripts":{"dev":"tsup --watch","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},"repository":{"url":"git+https://github.com/superbuilders/duolingo.git","type":"git"},"_npmVersion":"10.9.3","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","directories":{},"_nodeVersion":"22.19.0","dependencies":{"zod":"^4.1.12","clsx":"^2.1.1","lucide-react":"^0.548.0","@dnd-kit/core":"^6.3.1","tailwind-merge":"^3.3.1","fast-xml-parser":"^5.3.0","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@superbuilders/slog":"^4.0.0","@radix-ui/react-label":"^2.1.7","@superbuilders/errors":"^3.0.2","@radix-ui/react-select":"^2.2.6","@radix-ui/react-checkbox":"^1.3.3","class-variance-authority":"^0.7.1","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-radio-group":"^1.3.8"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.8.3","@types/react":"^19.1.8","@types/react-dom":"^19.1.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"_npmOperationalInternal":{"tmp":"tmp/incept-renderer_0.1.29_1777340351790_0.03556752238700467","host":"s3://npm-registry-packages-npm-production"}},"0.1.30":{"name":"@superbuilders/incept-renderer","version":"0.1.30","description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./actions":{"types":"./dist/actions/index.d.ts","import":"./dist/actions/index.js"},"./components":{"types":"./dist/components/index.d.ts","import":"./dist/components/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./styles/themes.css":{"style":"./dist/styles/themes.css","default":"./dist/styles/themes.css"},"./styles/duolingo.css":{"style":"./dist/styles/duolingo.css","default":"./dist/styles/duolingo.css"}},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"dependencies":{"@superbuilders/errors":"^3.0.2","@superbuilders/slog":"^4.0.0","@dnd-kit/core":"^6.3.1","@dnd-kit/sortable":"^10.0.0","@dnd-kit/utilities":"^3.2.2","@radix-ui/react-checkbox":"^1.3.3","@radix-ui/react-label":"^2.1.7","@radix-ui/react-radio-group":"^1.3.8","@radix-ui/react-select":"^2.2.6","@radix-ui/react-separator":"^1.1.7","class-variance-authority":"^0.7.1","clsx":"^2.1.1","fast-xml-parser":"^5.3.0","lucide-react":"^0.548.0","tailwind-merge":"^3.3.1","zod":"^4.1.12"},"devDependencies":{"@types/react":"^19.1.8","@types/react-dom":"^19.1.6","tsup":"^8.0.0","typescript":"^5.8.3"},"keywords":["qti","assessment","quiz","testing","education","renderer","react"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/superbuilders/duolingo.git"},"_id":"@superbuilders/incept-renderer@0.1.30","gitHead":"2eb25ac41537ce6aeb020d211375ca5caf636b21","bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"homepage":"https://github.com/superbuilders/duolingo#readme","_nodeVersion":"20.18.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-lzN360tycQ16ep0O+yaBxfa7TA1ifFJizcvpV80kbwDDo9HvovAJqnR8+TXMbmV8klgiOeE2CPR4jLjXXW2sfg==","shasum":"c4ce4736a30d97d088b01b66613e371e56b1dab8","tarball":"https://registry.npmjs.org/@superbuilders/incept-renderer/-/incept-renderer-0.1.30.tgz","fileCount":23,"unpackedSize":1133783,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGml/vjb9msw+hONSz4/BP0kX2fPtbwEsg9JWOo2zGhVAiADMEb5rjCDxfcPvPbmaUCZnA7nddb+8/uV7qm2cy0ToQ=="}]},"_npmUser":{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"},"directories":{},"maintainers":[{"name":"abhi-superbuilders","email":"abhi.balagurusamy@superbuilders.school"},{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/incept-renderer_0.1.30_1783966552990_0.1159918871586112"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-15T23:23:14.755Z","modified":"2026-07-13T18:15:53.342Z","0.1.0":"2026-01-15T23:23:15.028Z","0.1.2":"2026-01-16T01:00:10.159Z","0.1.3":"2026-01-16T01:24:05.112Z","0.1.4":"2026-01-16T01:31:05.282Z","0.1.5":"2026-01-16T01:41:55.316Z","0.1.7":"2026-01-16T01:48:30.068Z","0.1.8":"2026-01-16T02:11:11.984Z","0.1.11":"2026-01-16T23:12:59.635Z","0.1.12":"2026-01-19T05:40:31.224Z","0.1.13":"2026-01-30T18:12:25.639Z","0.1.14":"2026-01-30T18:18:50.324Z","0.1.15":"2026-02-02T18:27:22.493Z","0.1.16":"2026-02-02T19:02:09.749Z","0.1.17":"2026-02-11T17:58:25.975Z","0.1.18":"2026-02-18T19:33:20.265Z","0.1.19":"2026-02-18T20:19:59.900Z","0.1.20":"2026-02-18T20:31:41.580Z","0.1.21":"2026-02-19T19:00:23.563Z","0.1.22":"2026-02-19T19:45:59.062Z","0.1.23":"2026-04-08T22:06:06.073Z","0.1.24":"2026-04-08T23:36:00.296Z","0.1.25":"2026-04-09T18:46:15.964Z","0.1.26":"2026-04-09T19:42:04.968Z","0.1.27":"2026-04-09T20:03:20.768Z","0.1.28":"2026-04-09T20:27:52.967Z","0.1.29":"2026-04-28T01:39:11.944Z","0.1.30":"2026-07-13T18:15:53.167Z"},"bugs":{"url":"https://github.com/superbuilders/duolingo/issues"},"license":"MIT","homepage":"https://github.com/superbuilders/duolingo#readme","keywords":["qti","assessment","quiz","testing","education","renderer","react"],"repository":{"type":"git","url":"git+https://github.com/superbuilders/duolingo.git"},"description":"QTI 3.0 Assessment Renderer - Parse, validate, and render QTI XML with customizable themes","maintainers":[{"name":"abhi-superbuilders","email":"abhi.balagurusamy@superbuilders.school"},{"name":"hbauer","email":"handlebauer@protonmail.com"},{"name":"bjornpagen","email":"ngi7tihz@bjornpagen.com"},{"name":"supersterling","email":"aiden.zepp@superbuilders.school"},{"name":"ameeralns","email":"ameer.alnseirat@superbuilders.school"}],"readme":"# @superbuilders/incept-renderer\n\nA secure, server-driven QTI 3.0 assessment renderer for React/Next.js applications. Renders interactive questions with built-in validation while keeping correct answers secure on the server.\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Core Concepts](#core-concepts)\n- [Quick Start](#quick-start)\n- [Architecture](#architecture)\n- [API Reference](#api-reference)\n  - [Server Functions](#server-functions)\n  - [Client Components](#client-components)\n  - [Types](#types)\n- [Rendering Stimuli](#rendering-stimuli)\n- [Theming](#theming)\n- [Complete Examples](#complete-examples)\n- [Supported Interactions](#supported-interactions)\n- [FAQ](#faq)\n\n---\n\n## Installation\n\n```bash\nnpm install @superbuilders/incept-renderer\n# or\nbun add @superbuilders/incept-renderer\n# or\nyarn add @superbuilders/incept-renderer\n```\n\n### Peer Dependencies\n\nThis package requires:\n- `react` >= 18.0.0\n- `react-dom` >= 18.0.0\n\nFor full functionality with Tailwind CSS theming, ensure your app has Tailwind configured.\n\n---\n\n## Core Concepts\n\n### Security Model\n\n**Correct answers NEVER leave the server.** This package uses a secure architecture where:\n\n1. **Server parses XML** → Extracts only display data (questions, choices, prompts)\n2. **Client renders UI** → Users interact with questions\n3. **Server validates** → Checks answers against the original XML\n4. **Client shows feedback** → Displays correctness and feedback messages\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│  XML Source (your database/API)                                 │\n│  Contains: questions, choices, AND correct answers              │\n└─────────────────────────────────────────────────────────────────┘\n                              │\n                              ▼\n┌─────────────────────────────────────────────────────────────────┐\n│  SERVER: buildDisplayModel(xml)                                 │\n│  Extracts: questions, choices, prompts                          │\n│  EXCLUDES: correct answers, response processing rules           │\n└─────────────────────────────────────────────────────────────────┘\n                              │\n                              ▼\n┌─────────────────────────────────────────────────────────────────┐\n│  CLIENT: QTIRenderer                                            │\n│  Shows: questions, choices, user can select answers             │\n│  Cannot see: correct answers (never sent to browser)            │\n└─────────────────────────────────────────────────────────────────┘\n                              │\n                              ▼ User clicks \"Check\"\n┌─────────────────────────────────────────────────────────────────┐\n│  SERVER: validateResponsesSecure(xml, userResponses)            │\n│  Compares: user answers against correct answers                 │\n│  Returns: isCorrect, feedback HTML, per-choice correctness      │\n└─────────────────────────────────────────────────────────────────┘\n                              │\n                              ▼\n┌─────────────────────────────────────────────────────────────────┐\n│  CLIENT: Shows feedback                                         │\n│  Green/red highlights, feedback messages, scores                │\n└─────────────────────────────────────────────────────────────────┘\n```\n\n---\n\n## Quick Start\n\n### 1. Create the Server Component (page.tsx)\n\n```tsx\n// app/quiz/[id]/page.tsx\nimport * as React from \"react\"\nimport { buildDisplayModel, validateResponsesSecure } from \"@superbuilders/incept-renderer/actions\"\nimport { QuizClient } from \"./client\"\n\nexport default function QuizPage({ params }: { params: Promise<{ id: string }> }) {\n  // Fetch your QTI XML and build the display model\n  const displayPromise = params.then(async (p) => {\n    const xml = await getQtiXmlFromYourDatabase(p.id)\n    return buildDisplayModel(xml)\n  })\n\n  // Create a server action for validation\n  async function validateAnswers(responses: Record<string, string | string[]>) {\n    \"use server\"\n    const { id } = await params\n    const xml = await getQtiXmlFromYourDatabase(id)\n    return validateResponsesSecure(xml, responses)\n  }\n\n  return (\n    <React.Suspense fallback={<div>Loading question...</div>}>\n      <QuizClient displayPromise={displayPromise} onValidate={validateAnswers} />\n    </React.Suspense>\n  )\n}\n\n// Your function to get QTI XML from wherever you store it\nasync function getQtiXmlFromYourDatabase(id: string): Promise<string> {\n  // Examples:\n  // - Database: await db.query.questions.findFirst({ where: eq(id, questionId) })\n  // - REST API: await fetch(`https://api.example.com/questions/${id}`).then(r => r.text())\n  // - File system: await fs.readFile(`./questions/${id}.xml`, 'utf-8')\n  throw new Error(\"Implement this function\")\n}\n```\n\n### 2. Create the Client Component (client.tsx)\n\n```tsx\n// app/quiz/[id]/client.tsx\n\"use client\"\n\nimport * as React from \"react\"\nimport { QTIRenderer } from \"@superbuilders/incept-renderer\"\nimport type { DisplayItem, FormShape, ValidateResult } from \"@superbuilders/incept-renderer\"\n\ninterface QuizClientProps {\n  displayPromise: Promise<{ item: DisplayItem; shape: FormShape; itemKey: string }>\n  onValidate: (responses: Record<string, string | string[]>) => Promise<ValidateResult>\n}\n\nexport function QuizClient({ displayPromise, onValidate }: QuizClientProps) {\n  // Unwrap the promise from the server\n  const { item, shape, itemKey } = React.use(displayPromise)\n\n  // State management\n  const [responses, setResponses] = React.useState<Record<string, string | string[]>>({})\n  const [result, setResult] = React.useState<ValidateResult | undefined>()\n  const [showFeedback, setShowFeedback] = React.useState(false)\n  const [isChecking, setIsChecking] = React.useState(false)\n\n  // Handle user selecting/changing answers\n  const handleResponseChange = (responseId: string, value: string | string[]) => {\n    setResponses(prev => ({ ...prev, [responseId]: value }))\n  }\n\n  // Handle \"Check Answer\" click\n  const handleCheck = async () => {\n    setIsChecking(true)\n    const validation = await onValidate(responses)\n    setResult(validation)\n    setShowFeedback(true)\n    setIsChecking(false)\n  }\n\n  // Handle \"Try Again\" click\n  const handleTryAgain = () => {\n    setShowFeedback(false)\n    setResult(undefined)\n  }\n\n  return (\n    <div className=\"max-w-2xl mx-auto p-4\">\n      {/* The QTI Renderer */}\n      <QTIRenderer\n        item={item}\n        responses={responses}\n        onResponseChange={handleResponseChange}\n        showFeedback={showFeedback}\n        disabled={showFeedback}\n        overallFeedback={result ? {\n          isCorrect: result.overallCorrect,\n          messageHtml: result.feedbackHtml\n        } : undefined}\n        choiceCorrectness={result?.selectedChoicesByResponse}\n        responseFeedback={result?.perResponse}\n      />\n\n      {/* Your app's buttons */}\n      <div className=\"mt-6 flex gap-4\">\n        {!showFeedback ? (\n          <button\n            onClick={handleCheck}\n            disabled={isChecking || Object.keys(responses).length === 0}\n            className=\"bg-green-500 text-white px-6 py-3 rounded-lg font-bold disabled:opacity-50\"\n          >\n            {isChecking ? \"Checking...\" : \"Check Answer\"}\n          </button>\n        ) : result?.overallCorrect ? (\n          <button\n            onClick={() => window.location.href = \"/next-question\"}\n            className=\"bg-green-500 text-white px-6 py-3 rounded-lg font-bold\"\n          >\n            Continue →\n          </button>\n        ) : (\n          <button\n            onClick={handleTryAgain}\n            className=\"bg-blue-500 text-white px-6 py-3 rounded-lg font-bold\"\n          >\n            Try Again\n          </button>\n        )}\n      </div>\n    </div>\n  )\n}\n```\n\n---\n\n## Architecture\n\n### File Structure Pattern\n\n```\napp/quiz/[id]/\n├── page.tsx      # Server Component: fetches XML, creates validation action\n└── client.tsx    # Client Component: renders QTIRenderer, manages state\n```\n\n### Data Flow\n\n```\n1. User visits /quiz/123\n       │\n       ▼\n2. page.tsx (Server)\n   - Fetches QTI XML from your data source\n   - Calls buildDisplayModel(xml)\n   - Passes display data to client\n       │\n       ▼\n3. client.tsx (Client)\n   - Renders QTIRenderer with display data\n   - User interacts with choices\n       │\n       ▼\n4. User clicks \"Check Answer\"\n   - Client calls onValidate(responses)\n   - Server action validates against original XML\n   - Returns { overallCorrect, feedbackHtml, selectedChoicesByResponse }\n       │\n       ▼\n5. Client shows feedback\n   - QTIRenderer shows green/red highlights\n   - Feedback message displayed\n```\n\n---\n\n## API Reference\n\n### Server Functions\n\nImport from `@superbuilders/incept-renderer/actions`:\n\n#### `buildDisplayModel(xml: string)`\n\nParses QTI XML and extracts display-safe data.\n\n```tsx\nimport { buildDisplayModel } from \"@superbuilders/incept-renderer/actions\"\n\nconst { item, shape, itemKey } = await buildDisplayModel(qtiXmlString)\n```\n\n**Parameters:**\n- `xml` (string) - Raw QTI 3.0 XML string\n\n**Returns:**\n```tsx\n{\n  itemKey: string          // Unique identifier for caching\n  item: DisplayItem        // Parsed question data for rendering\n  shape: FormShape         // Schema describing expected response structure\n}\n```\n\n#### `validateResponsesSecure(xml: string, responses: Record<string, string | string[]>)`\n\nValidates user responses against the QTI XML.\n\n```tsx\nimport { validateResponsesSecure } from \"@superbuilders/incept-renderer/actions\"\n\nconst result = await validateResponsesSecure(qtiXmlString, {\n  RESPONSE: \"choice_A\"\n})\n```\n\n**Parameters:**\n- `xml` (string) - Raw QTI 3.0 XML string (same as used for buildDisplayModel)\n- `responses` (Record<string, string | string[]>) - User's selected answers\n\n**Returns:**\n```tsx\n{\n  overallCorrect: boolean   // true if all responses are correct\n  feedbackHtml: string      // Combined HTML feedback message\n  selectedChoicesByResponse: Record<string, Array<{ id: string; isCorrect: boolean }>>\n  perResponse: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}\n```\n\n#### `parseAssessmentStimulusXml(xml: string)`\n\nParses QTI Assessment Stimulus XML (reading materials, passages).\n\n```tsx\nimport { parseAssessmentStimulusXml } from \"@superbuilders/incept-renderer\"\n\nconst stimulus = parseAssessmentStimulusXml(stimulusXmlString)\n```\n\n**Parameters:**\n- `xml` (string) - Raw QTI 3.0 Assessment Stimulus XML string\n\n**Returns:**\n```tsx\n{\n  identifier: string   // Unique identifier from the XML\n  title: string        // Human-readable title\n  xmlLang: string      // Language code (e.g., \"en\")\n  bodyHtml: string     // Sanitized HTML content ready for rendering\n}\n```\n\n---\n\n### Client Components\n\nImport from `@superbuilders/incept-renderer`:\n\n#### `<QTIRenderer />`\n\nThe main component for rendering QTI questions.\n\n```tsx\nimport { QTIRenderer } from \"@superbuilders/incept-renderer\"\n\n<QTIRenderer\n  item={displayItem}\n  responses={responses}\n  onResponseChange={handleChange}\n  showFeedback={showFeedback}\n  disabled={isDisabled}\n  overallFeedback={feedbackData}\n  choiceCorrectness={correctnessMap}\n  responseFeedback={perResponseFeedback}\n  theme=\"duolingo\"\n/>\n```\n\n**Props:**\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `item` | `DisplayItem` | ✅ | Parsed question data from `buildDisplayModel` |\n| `responses` | `Record<string, string \\| string[]>` | ✅ | Current user responses |\n| `onResponseChange` | `(id: string, value: string \\| string[]) => void` | ✅ | Called when user selects/changes an answer |\n| `showFeedback` | `boolean` | ❌ | Whether to show correct/incorrect feedback |\n| `disabled` | `boolean` | ❌ | Disable all interactions |\n| `overallFeedback` | `{ isCorrect: boolean; messageHtml?: string }` | ❌ | Overall feedback after validation |\n| `choiceCorrectness` | `Record<string, Array<{ id: string; isCorrect: boolean }>>` | ❌ | Per-choice correctness for highlighting |\n| `responseFeedback` | `Record<string, { isCorrect: boolean; messageHtml?: string }>` | ❌ | Per-response feedback messages |\n| `theme` | `\"duolingo\" \\| \"neobrutalist\" \\| string` | ❌ | Visual theme (default: `\"duolingo\"`) |\n\n#### `<QTIStimulusRenderer />`\n\nRenders QTI Assessment Stimuli (reading materials, passages).\n\n```tsx\nimport { QTIStimulusRenderer } from \"@superbuilders/incept-renderer\"\n\n<QTIStimulusRenderer\n  stimulus={parsedStimulus}\n  className=\"my-8\"\n/>\n```\n\n**Props:**\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `stimulus` | `AssessmentStimulus` | ✅ | Parsed stimulus from `parseAssessmentStimulusXml` |\n| `className` | `string` | ❌ | Additional CSS classes for the container |\n\n---\n\n### Types\n\nImport from `@superbuilders/incept-renderer`:\n\n```tsx\nimport type {\n  // Assessment Items (questions)\n  DisplayItem,\n  DisplayBlock,\n  DisplayChoice,\n  DisplayChoiceInteraction,\n  FormShape,\n  ValidateResult,\n  // Assessment Stimuli (reading materials)\n  AssessmentStimulus\n} from \"@superbuilders/incept-renderer\"\n```\n\n#### `DisplayItem`\n\n```tsx\ninterface DisplayItem {\n  identifier: string\n  title: string\n  blocks: DisplayBlock[]\n}\n```\n\n#### `DisplayBlock`\n\n```tsx\ntype DisplayBlock =\n  | { type: \"html\"; html: string }\n  | { type: \"interaction\"; interaction: DisplayChoiceInteraction }\n```\n\n#### `DisplayChoiceInteraction`\n\n```tsx\ninterface DisplayChoiceInteraction {\n  responseIdentifier: string\n  type: \"choice\"\n  maxChoices: number\n  prompt?: string\n  choices: DisplayChoice[]\n}\n```\n\n#### `DisplayChoice`\n\n```tsx\ninterface DisplayChoice {\n  identifier: string\n  contentHtml: string\n}\n```\n\n#### `FormShape`\n\n```tsx\ninterface FormShape {\n  responses: Record<string, {\n    cardinality: \"single\" | \"multiple\"\n    baseType: string\n  }>\n}\n```\n\n#### `ValidateResult`\n\n```tsx\ninterface ValidateResult {\n  overallCorrect: boolean\n  feedbackHtml: string\n  selectedChoicesByResponse: Record<string, Array<{ id: string; isCorrect: boolean }>>\n  perResponse: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}\n```\n\n#### `AssessmentStimulus`\n\n```tsx\ninterface AssessmentStimulus {\n  identifier: string   // Unique identifier from the XML\n  title: string        // Human-readable title  \n  xmlLang: string      // Language code (e.g., \"en\", \"es\")\n  bodyHtml: string     // Sanitized HTML content\n}\n```\n\n---\n\n## Rendering Stimuli\n\nIn addition to assessment items (questions), the package supports rendering **Assessment Stimuli** — reading materials, passages, or articles that provide context for questions.\n\n### What are Stimuli?\n\nQTI Assessment Stimuli (`qti-assessment-stimulus`) are standalone content blocks that contain:\n- Reading passages\n- Articles with images\n- Reference materials\n- Any HTML content that accompanies questions\n\nUnlike assessment items, stimuli have no interactions or correct answers — they're purely display content.\n\n### Parsing Stimulus XML\n\nUse `parseAssessmentStimulusXml` to parse stimulus XML:\n\n```tsx\nimport { parseAssessmentStimulusXml } from \"@superbuilders/incept-renderer\"\n\nconst stimulusXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<qti-assessment-stimulus \n  xmlns=\"http://www.imsglobal.org/xsd/imsqtiasi_v3p0\"\n  identifier=\"stimulus-1\" \n  xml:lang=\"en\" \n  title=\"Biodiversity and Ecosystem Health\">\n  <qti-stimulus-body>\n    <h2>Biodiversity and ecosystem health</h2>\n    <p><strong>Biodiversity</strong> is the variety of species in an ecosystem.</p>\n    <figure>\n      <img src=\"coral-reef.jpg\" alt=\"A coral reef\" />\n      <figcaption>Coral reef ecosystems have high biodiversity.</figcaption>\n    </figure>\n  </qti-stimulus-body>\n</qti-assessment-stimulus>`\n\nconst stimulus = parseAssessmentStimulusXml(stimulusXml)\n// Returns: { identifier, title, xmlLang, bodyHtml }\n```\n\n### Rendering Stimuli\n\nUse the `QTIStimulusRenderer` component to render parsed stimuli:\n\n```tsx\nimport { QTIStimulusRenderer, parseAssessmentStimulusXml } from \"@superbuilders/incept-renderer\"\n\nfunction ReadingPassage({ xml }: { xml: string }) {\n  const stimulus = parseAssessmentStimulusXml(xml)\n  \n  return (\n    <QTIStimulusRenderer \n      stimulus={stimulus} \n      className=\"my-8\"\n    />\n  )\n}\n```\n\n### Server Action Pattern\n\nFor Next.js apps, create a server action to parse stimuli:\n\n```tsx\n// lib/qti-actions.ts\n\"use server\"\n\nimport { parseAssessmentStimulusXml } from \"@superbuilders/incept-renderer\"\n\nexport async function parseStimulus(xml: string) {\n  return parseAssessmentStimulusXml(xml)\n}\n```\n\n```tsx\n// app/reading/[id]/page.tsx\nimport { parseStimulus } from \"@/lib/qti-actions\"\nimport { QTIStimulusRenderer } from \"@superbuilders/incept-renderer\"\n\nexport default async function ReadingPage({ params }: { params: Promise<{ id: string }> }) {\n  const { id } = await params\n  const xml = await fetchStimulusXml(id) // Your data fetching\n  const stimulus = await parseStimulus(xml)\n  \n  return <QTIStimulusRenderer stimulus={stimulus} />\n}\n```\n\n### Stimulus with Questions\n\nA common pattern is showing a stimulus alongside related questions:\n\n```tsx\nimport { QTIStimulusRenderer, QTIRenderer } from \"@superbuilders/incept-renderer\"\n\nfunction QuestionWithPassage({ stimulus, item, ...props }) {\n  return (\n    <div className=\"grid grid-cols-2 gap-8\">\n      {/* Reading passage on the left */}\n      <div className=\"overflow-y-auto max-h-[80vh]\">\n        <QTIStimulusRenderer stimulus={stimulus} />\n      </div>\n      \n      {/* Question on the right */}\n      <div>\n        <QTIRenderer item={item} {...props} />\n      </div>\n    </div>\n  )\n}\n```\n\n### AssessmentStimulus Type\n\n```tsx\ninterface AssessmentStimulus {\n  identifier: string    // Unique ID from the XML\n  title: string         // Human-readable title\n  xmlLang: string       // Language code (e.g., \"en\")\n  bodyHtml: string      // Sanitized HTML content\n}\n```\n\n### Supported Content\n\nThe stimulus renderer supports:\n- **Headings** (`h1`–`h6`)\n- **Text formatting** (`p`, `strong`, `em`, `b`, `i`, `u`, `sub`, `sup`)\n- **Lists** (`ul`, `ol`, `li`)\n- **Images** (`img`, `figure`, `figcaption`)\n- **Tables** (`table`, `thead`, `tbody`, `tr`, `th`, `td`)\n- **Links** (`a`)\n- **MathML** (mathematical expressions)\n- **Collapsible sections** (`details`, `summary`)\n- **Semantic elements** (`article`, `section`, `blockquote`, `cite`)\n\nAll content is sanitized to prevent XSS attacks while preserving safe HTML structure.\n\n---\n\n## Theming\n\nThe package includes two built-in themes and supports custom themes via CSS variables. **You are not required to use the built-in styles** — you can fully customize the appearance to match your application's design system.\n\n### Required CSS Imports\n\nImport the base theme CSS in your app's root layout or global styles:\n\n```tsx\n// In your layout.tsx or globals.css\nimport \"@superbuilders/incept-renderer/styles/themes.css\"\n```\n\n### Built-in Themes\n\n#### Duolingo (Default)\n\nClean, friendly design inspired by Duolingo's learning interface with a vibrant color palette.\n\n**For the complete Duolingo experience**, import the Duolingo theme CSS which includes:\n- Full Duolingo color palette (owl green, macaw blue, cardinal red, etc.)\n- Rounded square choice indicators (A, B, C, D)\n- Filled checkboxes with inset gap effect\n- HTML content styling (lists, typography)\n- Dark mode support\n\n```tsx\n// In your layout.tsx or globals.css\nimport \"@superbuilders/incept-renderer/styles/themes.css\"\nimport \"@superbuilders/incept-renderer/styles/duolingo.css\"  // Full Duolingo styling\n```\n\n```tsx\n<QTIRenderer theme=\"duolingo\" ... />\n```\n\n#### Neobrutalist\n\nBold, high-contrast design with thick borders and sharp shadows.\n\n```tsx\n<QTIRenderer theme=\"neobrutalist\" ... />\n```\n\n### Custom Themes\n\nCreate your own theme by defining CSS variables for `[data-qti-theme=\"your-theme-name\"]` in your stylesheet, then pass that theme name to the `QTIRenderer` component.\n\n```tsx\n<QTIRenderer theme=\"my-custom-theme\" ... />\n```\n\n### CSS Variables Reference\n\nBelow is the **complete list of CSS variables** you can override when creating a custom theme. All variables are optional — any variable you don't define will fall back to the default value.\n\n#### Container Variables\n\nControls the main question container/card appearance.\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-container-bg` | Background color of the container | `var(--background, #ffffff)` |\n| `--qti-container-border` | Border color of the container | `var(--border, #e5e5e5)` |\n| `--qti-container-border-width` | Border thickness | `2px` |\n| `--qti-container-radius` | Border radius (rounded corners) | `var(--radius, 0.5rem)` |\n| `--qti-container-shadow` | Box shadow | `none` |\n\n#### Typography Variables\n\nControls fonts and text styling throughout the renderer.\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-font-family` | Font family for all QTI text | `inherit` |\n| `--qti-font-weight` | Base font weight | `500` |\n| `--qti-tracking` | Letter spacing | `normal` |\n\n#### Choice Variables\n\nControls the appearance of answer choices (radio buttons, checkboxes).\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-choice-bg` | Default background of choices | `var(--background, #ffffff)` |\n| `--qti-choice-border` | Default border color of choices | `var(--accent, #f4f4f5)` |\n| `--qti-choice-hover-bg` | Background on hover | `var(--muted, #f4f4f5)` |\n| `--qti-choice-selected-bg` | Background when selected | `oklch(0.9 0.1 220 / 0.3)` |\n| `--qti-choice-selected-border` | Border when selected | `oklch(0.6 0.2 250)` |\n| `--qti-choice-correct-bg` | Background for correct answers | `oklch(0.9 0.15 140 / 0.3)` |\n| `--qti-choice-correct-border` | Border for correct answers | `#22c55e` |\n| `--qti-choice-incorrect-bg` | Background for incorrect answers | `oklch(0.9 0.1 25 / 0.3)` |\n| `--qti-choice-incorrect-border` | Border for incorrect answers | `#ef4444` |\n\n#### Button Variables\n\nControls the appearance of buttons (if using the QTI button classes).\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-button-bg` | Button background color | `var(--primary, #18181b)` |\n| `--qti-button-text` | Button text color | `var(--primary-foreground, #ffffff)` |\n| `--qti-button-border` | Button border color | `var(--primary, #18181b)` |\n| `--qti-button-shadow` | Button box shadow | `none` |\n| `--qti-button-radius` | Button border radius | `var(--radius, 0.5rem)` |\n| `--qti-button-font-weight` | Button font weight | `700` |\n\n#### Feedback Variables\n\nControls the appearance of feedback messages shown after validation.\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-feedback-bg` | Feedback container background | `var(--background, #ffffff)` |\n| `--qti-feedback-border` | Feedback container border | `var(--border, #e5e5e5)` |\n| `--qti-feedback-correct-text` | Text color for correct feedback | `#22c55e` |\n| `--qti-feedback-correct-icon-bg` | Icon background for correct | `#22c55e` |\n| `--qti-feedback-incorrect-text` | Text color for incorrect feedback | `#ef4444` |\n| `--qti-feedback-incorrect-icon-bg` | Icon background for incorrect | `#ef4444` |\n\n#### Input Variables (Text Entry, Textarea, Dropdowns)\n\nControls the appearance of text input fields, textareas, and select/dropdown elements.\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-input-bg` | Input background color | `var(--background, #ffffff)` |\n| `--qti-input-border` | Input border color | `var(--border, #e5e5e5)` |\n| `--qti-input-border-width` | Input border thickness | `2px` |\n| `--qti-input-radius` | Input border radius | `var(--radius, 0.5rem)` |\n| `--qti-input-shadow` | Input box shadow | `none` |\n| `--qti-input-focus-border` | Border color when focused | `var(--ring, #2563eb)` |\n| `--qti-input-focus-shadow` | Box shadow when focused | `0 0 0 2px rgba(37, 99, 235, 0.2)` |\n| `--qti-input-correct-border` | Border for correct text answers | `#22c55e` |\n| `--qti-input-incorrect-border` | Border for incorrect text answers | `#ef4444` |\n\n#### Choice Indicator Variables (Radio/Checkbox Circles)\n\nControls the appearance of the radio button and checkbox indicators.\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-indicator-size` | Size of the indicator | `1.5rem` |\n| `--qti-indicator-bg` | Default background | `var(--background, #ffffff)` |\n| `--qti-indicator-border` | Default border color | `var(--border, #d4d4d8)` |\n| `--qti-indicator-border-width` | Border thickness | `2px` |\n| `--qti-indicator-radius` | Border radius (use `9999px` for circles, `0` for squares) | `9999px` |\n| `--qti-indicator-checked-bg` | Background when checked | `var(--primary, #18181b)` |\n| `--qti-indicator-checked-border` | Border when checked | `var(--primary, #18181b)` |\n| `--qti-indicator-checked-text` | Checkmark/dot color | `var(--primary-foreground, #ffffff)` |\n\n#### Progress Bar Variables\n\nControls the appearance of progress indicators.\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-progress-bg` | Progress bar background (empty part) | `var(--muted, #f4f4f5)` |\n| `--qti-progress-fill` | Progress bar fill color | `var(--primary, #18181b)` |\n| `--qti-progress-height` | Height of the progress bar | `0.5rem` |\n| `--qti-progress-radius` | Border radius | `var(--radius, 0.5rem)` |\n| `--qti-progress-border` | Border color | `transparent` |\n| `--qti-progress-border-width` | Border thickness | `0px` |\n\n#### Content Variables (Question Text, Prompts)\n\nControls the appearance of HTML content (question text, prompts, instructions).\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-content-font-size` | Font size for content | `1.125rem` |\n| `--qti-content-line-height` | Line height for content | `1.625` |\n| `--qti-content-font-weight` | Font weight for content | `500` |\n\n#### Image Grid Variables\n\nControls the layout of image-based choice interactions.\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-grid-gap` | Gap between grid items | `1rem` |\n| `--qti-image-card-min-height` | Minimum height of image cards | `180px` |\n| `--qti-image-card-padding` | Padding inside image cards | `1rem` |\n| `--qti-image-max-height` | Maximum height of images | `160px` |\n\n#### Order Interaction Variables (Drag-and-Drop Sorting)\n\nControls the appearance of the order interaction container that holds draggable items.\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-order-container-bg` | Container background | `var(--muted, #f4f4f5)` |\n| `--qti-order-container-border` | Container border color | `transparent` |\n| `--qti-order-container-border-width` | Container border thickness | `2px` |\n| `--qti-order-container-radius` | Container border radius | `0.75rem` |\n| `--qti-order-container-padding` | Container padding | `1rem` |\n| `--qti-order-container-gap` | Gap between drag items | `0.5rem` |\n| `--qti-order-container-correct-bg` | Background when correct | `oklch(0.9 0.15 140 / 0.2)` |\n| `--qti-order-container-correct-border` | Border when correct | `#22c55e` |\n| `--qti-order-container-incorrect-bg` | Background when incorrect | `oklch(0.9 0.1 25 / 0.2)` |\n| `--qti-order-container-incorrect-border` | Border when incorrect | `#ef4444` |\n\n#### Order Item Variables (Drag Tokens)\n\nControls the appearance of individual draggable items/tokens.\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `--qti-order-item-bg` | Item background | `var(--background, #ffffff)` |\n| `--qti-order-item-border` | Item border color | `var(--border, #e5e5e5)` |\n| `--qti-order-item-border-width` | Item border thickness | `1px` |\n| `--qti-order-item-radius` | Item border radius | `0.5rem` |\n| `--qti-order-item-padding` | Item padding | `1rem` |\n| `--qti-order-item-shadow` | Item box shadow | `0 1px 2px rgba(0, 0, 0, 0.05)` |\n| `--qti-order-item-hover-border` | Border on hover | `oklch(0.6 0.2 250)` |\n| `--qti-order-item-hover-shadow` | Shadow on hover | `0 4px 6px rgba(0, 0, 0, 0.1)` |\n| `--qti-order-item-dragging-border` | Border while dragging | `oklch(0.6 0.2 250)` |\n| `--qti-order-item-dragging-shadow` | Shadow while dragging | `0 8px 16px rgba(0, 0, 0, 0.15)` |\n| `--qti-order-item-handle-color` | Drag handle icon color | `var(--muted-foreground, #71717a)` |\n\n### Complete Custom Theme Example\n\nHere's a complete example defining all variables for a custom theme:\n\n```css\n/* In your globals.css or styles file */\n[data-qti-theme=\"my-custom-theme\"] {\n  /* ========== Container ========== */\n  --qti-container-bg: #ffffff;\n  --qti-container-border: #e0e0e0;\n  --qti-container-border-width: 1px;\n  --qti-container-radius: 12px;\n  --qti-container-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n\n  /* ========== Typography ========== */\n  --qti-font-family: \"Inter\", system-ui, sans-serif;\n  --qti-font-weight: 400;\n  --qti-tracking: normal;\n\n  /* ========== Choices (Radio/Checkbox Cards) ========== */\n  --qti-choice-bg: #f8f8f8;\n  --qti-choice-border: #d0d0d0;\n  --qti-choice-hover-bg: #f0f0f0;\n  --qti-choice-selected-bg: #e8f4fd;\n  --qti-choice-selected-border: #2196f3;\n  --qti-choice-correct-bg: #e8f5e9;\n  --qti-choice-correct-border: #4caf50;\n  --qti-choice-incorrect-bg: #ffebee;\n  --qti-choice-incorrect-border: #f44336;\n\n  /* ========== Buttons ========== */\n  --qti-button-bg: #2196f3;\n  --qti-button-text: #ffffff;\n  --qti-button-border: transparent;\n  --qti-button-shadow: none;\n  --qti-button-radius: 8px;\n  --qti-button-font-weight: 600;\n\n  /* ========== Feedback Messages ========== */\n  --qti-feedback-bg: #ffffff;\n  --qti-feedback-border: #e0e0e0;\n  --qti-feedback-correct-text: #2e7d32;\n  --qti-feedback-correct-icon-bg: #4caf50;\n  --qti-feedback-incorrect-text: #c62828;\n  --qti-feedback-incorrect-icon-bg: #f44336;\n\n  /* ========== Text Inputs / Textareas / Dropdowns ========== */\n  --qti-input-bg: #ffffff;\n  --qti-input-border: #d0d0d0;\n  --qti-input-border-width: 1px;\n  --qti-input-radius: 8px;\n  --qti-input-shadow: none;\n  --qti-input-focus-border: #2196f3;\n  --qti-input-focus-shadow: 0 0 0 3px rgba(33, 150, 243, 0.2);\n  --qti-input-correct-border: #4caf50;\n  --qti-input-incorrect-border: #f44336;\n\n  /* ========== Choice Indicators (Radio/Checkbox Circles) ========== */\n  --qti-indicator-size: 1.5rem;\n  --qti-indicator-bg: #ffffff;\n  --qti-indicator-border: #d0d0d0;\n  --qti-indicator-border-width: 2px;\n  --qti-indicator-radius: 9999px; /* Use 0 for square checkboxes */\n  --qti-indicator-checked-bg: #2196f3;\n  --qti-indicator-checked-border: #2196f3;\n  --qti-indicator-checked-text: #ffffff;\n\n  /* ========== Progress Bar ========== */\n  --qti-progress-bg: #e0e0e0;\n  --qti-progress-fill: #2196f3;\n  --qti-progress-height: 8px;\n  --qti-progress-radius: 4px;\n  --qti-progress-border: transparent;\n  --qti-progress-border-width: 0;\n\n  /* ========== Content (Question Text) ========== */\n  --qti-content-font-size: 1.125rem;\n  --qti-content-line-height: 1.6;\n  --qti-content-font-weight: 400;\n\n  /* ========== Image Grids ========== */\n  --qti-grid-gap: 1rem;\n  --qti-image-card-min-height: 180px;\n  --qti-image-card-padding: 1rem;\n  --qti-image-max-height: 160px;\n\n  /* ========== Order Interaction (Drag-and-Drop Container) ========== */\n  --qti-order-container-bg: #f5f5f5;\n  --qti-order-container-border: #e0e0e0;\n  --qti-order-container-border-width: 1px;\n  --qti-order-container-radius: 12px;\n  --qti-order-container-padding: 1rem;\n  --qti-order-container-gap: 0.75rem;\n  --qti-order-container-correct-bg: rgba(76, 175, 80, 0.15);\n  --qti-order-container-correct-border: #4caf50;\n  --qti-order-container-incorrect-bg: rgba(244, 67, 54, 0.15);\n  --qti-order-container-incorrect-border: #f44336;\n\n  /* ========== Order Items (Drag Tokens) ========== */\n  --qti-order-item-bg: #ffffff;\n  --qti-order-item-border: #e0e0e0;\n  --qti-order-item-border-width: 1px;\n  --qti-order-item-radius: 8px;\n  --qti-order-item-padding: 1rem;\n  --qti-order-item-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n  --qti-order-item-hover-border: #2196f3;\n  --qti-order-item-hover-shadow: 0 4px 8px rgba(0, 0, 0, 0.12);\n  --qti-order-item-dragging-border: #2196f3;\n  --qti-order-item-dragging-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);\n  --qti-order-item-handle-color: #9e9e9e;\n}\n\n/* Optional: Dark mode support for your custom theme */\n.dark[data-qti-theme=\"my-custom-theme\"],\n[data-qti-theme=\"my-custom-theme\"] .dark {\n  /* Container */\n  --qti-container-bg: #1a1a1a;\n  --qti-container-border: #333333;\n  \n  /* Choices */\n  --qti-choice-bg: #252525;\n  --qti-choice-border: #444444;\n  --qti-choice-hover-bg: #333333;\n  --qti-choice-selected-bg: rgba(33, 150, 243, 0.2);\n  --qti-choice-selected-border: #2196f3;\n  --qti-choice-correct-bg: rgba(76, 175, 80, 0.2);\n  --qti-choice-incorrect-bg: rgba(244, 67, 54, 0.2);\n  \n  /* Feedback */\n  --qti-feedback-bg: #1a1a1a;\n  --qti-feedback-border: #333333;\n  \n  /* Inputs */\n  --qti-input-bg: #252525;\n  --qti-input-border: #444444;\n  \n  /* Indicators */\n  --qti-indicator-bg: #252525;\n  --qti-indicator-border: #444444;\n  \n  /* Progress */\n  --qti-progress-bg: #333333;\n\n  /* Order Interaction */\n  --qti-order-container-bg: #252525;\n  --qti-order-container-border: #444444;\n  --qti-order-container-correct-bg: rgba(76, 175, 80, 0.2);\n  --qti-order-container-incorrect-bg: rgba(244, 67, 54, 0.2);\n  \n  /* Order Items */\n  --qti-order-item-bg: #1a1a1a;\n  --qti-order-item-border: #444444;\n  --qti-order-item-handle-color: #888888;\n}\n```\n\nThen use your custom theme:\n\n```tsx\n<QTIRenderer theme=\"my-custom-theme\" ... />\n```\n\n### Partial Overrides\n\nYou don't need to define all variables. You can create a theme that only overrides specific values:\n\n```css\n/* Minimal custom theme - only changes colors */\n[data-qti-theme=\"brand-colors\"] {\n  --qti-choice-selected-bg: #your-brand-color-light;\n  --qti-choice-selected-border: #your-brand-color;\n  --qti-button-bg: #your-brand-color;\n}\n```\n\n---\n\n## Complete Examples\n\n### Example 1: Simple Quiz Page\n\n```tsx\n// app/quiz/[id]/page.tsx\nimport * as React from \"react\"\nimport { buildDisplayModel, validateResponsesSecure } from \"@superbuilders/incept-renderer/actions\"\nimport { db } from \"@/db\"\nimport { questions } from \"@/db/schema\"\nimport { eq } from \"drizzle-orm\"\nimport { QuizClient } from \"./client\"\n\nexport default function QuizPage({ params }: { params: Promise<{ id: string }> }) {\n  const displayPromise = params.then(async (p) => {\n    const question = await db.query.questions.findFirst({\n      where: eq(questions.id, p.id)\n    })\n    if (!question) throw new Error(\"Question not found\")\n    return buildDisplayModel(question.xml)\n  })\n\n  async function validate(responses: Record<string, string | string[]>) {\n    \"use server\"\n    const { id } = await params\n    const question = await db.query.questions.findFirst({\n      where: eq(questions.id, id)\n    })\n    if (!question) throw new Error(\"Question not found\")\n    return validateResponsesSecure(question.xml, responses)\n  }\n\n  return (\n    <React.Suspense fallback={<LoadingSkeleton />}>\n      <QuizClient displayPromise={displayPromise} onValidate={validate} />\n    </React.Suspense>\n  )\n}\n```\n\n### Example 2: Multi-Question Assessment\n\n```tsx\n// app/assessment/[id]/page.tsx\nimport * as React from \"react\"\nimport { buildDisplayModel, validateResponsesSecure } from \"@superbuilders/incept-renderer/actions\"\nimport { AssessmentClient } from \"./client\"\n\nexport default function AssessmentPage({ params }: { params: Promise<{ id: string }> }) {\n  // Fetch all questions for this assessment\n  const questionsPromise = params.then(async (p) => {\n    const assessment = await fetchAssessment(p.id)\n    return Promise.all(\n      assessment.questionIds.map(async (qId) => {\n        const xml = await fetchQuestionXml(qId)\n        const display = await buildDisplayModel(xml)\n        return { id: qId, xml, ...display }\n      })\n    )\n  })\n\n  // Generic validator that works for any question\n  async function validateQuestion(questionId: string, responses: Record<string, string | string[]>) {\n    \"use server\"\n    const xml = await fetchQuestionXml(questionId)\n    return validateResponsesSecure(xml, responses)\n  }\n\n  return (\n    <React.Suspense fallback={<div>Loading assessment...</div>}>\n      <AssessmentClient \n        questionsPromise={questionsPromise} \n        onValidate={validateQuestion} \n      />\n    </React.Suspense>\n  )\n}\n```\n\n### Example 3: With Theming Toggle\n\n```tsx\n// app/quiz/[id]/client.tsx\n\"use client\"\n\nimport * as React from \"react\"\nimport { QTIRenderer } from \"@superbuilders/incept-renderer\"\nimport type { DisplayItem, FormShape, ValidateResult } from \"@superbuilders/incept-renderer\"\n\nconst THEMES = [\n  { value: \"duolingo\", label: \"Duolingo\" },\n  { value: \"neobrutalist\", label: \"Neobrutalist\" },\n] as const\n\ntype Theme = typeof THEMES[number][\"value\"]\n\nexport function QuizClient({ displayPromise, onValidate }: {\n  displayPromise: Promise<{ item: DisplayItem; shape: FormShape; itemKey: string }>\n  onValidate: (r: Record<string, string | string[]>) => Promise<ValidateResult>\n}) {\n  const { item } = React.use(displayPromise)\n  \n  const [responses, setResponses] = React.useState<Record<string, string | string[]>>({})\n  const [result, setResult] = React.useState<ValidateResult | undefined>()\n  const [showFeedback, setShowFeedback] = React.useState(false)\n  const [theme, setTheme] = React.useState<Theme>(\"duolingo\")\n\n  return (\n    <div>\n      {/* Theme Selector */}\n      <div className=\"mb-4 flex justify-end\">\n        <select\n          value={theme}\n          onChange={(e) => setTheme(e.target.value as Theme)}\n          className=\"border rounded px-2 py-1\"\n        >\n          {THEMES.map((t) => (\n            <option key={t.value} value={t.value}>{t.label}</option>\n          ))}\n        </select>\n      </div>\n\n      {/* Question Renderer */}\n      <QTIRenderer\n        item={item}\n        responses={responses}\n        onResponseChange={(id, val) => setResponses(prev => ({ ...prev, [id]: val }))}\n        showFeedback={showFeedback}\n        theme={theme}\n        overallFeedback={result ? {\n          isCorrect: result.overallCorrect,\n          messageHtml: result.feedbackHtml\n        } : undefined}\n        choiceCorrectness={result?.selectedChoicesByResponse}\n      />\n\n      {/* Check Button */}\n      <button\n        onClick={async () => {\n          const validation = await onValidate(responses)\n          setResult(validation)\n          setShowFeedback(true)\n        }}\n        disabled={showFeedback}\n        className=\"mt-4 bg-blue-500 text-white px-4 py-2 rounded\"\n      >\n        Check Answer\n      </button>\n    </div>\n  )\n}\n```\n\n---\n\n## Supported Interactions\n\n| Interaction Type | Support | Description |\n|------------------|---------|-------------|\n| `choiceInteraction` | ✅ Full | Single/multiple choice questions |\n| `inlineChoiceInteraction` | ✅ Full | Dropdown selections within text |\n| `textEntryInteraction` | ✅ Full | Free-text input fields |\n| `orderInteraction` | 🔶 Basic | Drag-and-drop ordering |\n| `matchInteraction` | 🔶 Basic | Matching pairs |\n| `gapMatchInteraction` | 🔶 Basic | Fill-in-the-blank with draggable options |\n\n---\n\n## FAQ\n\n### How do I store QTI XML?\n\nStore it however works best for your app:\n- **Database:** Store as a TEXT/VARCHAR column\n- **File system:** Store as `.xml` files\n- **External API:** Fetch from a QTI content server\n\nThe package doesn't care where the XML comes from—it just needs a string.\n\n### Can users cheat by inspecting the browser?\n\nNo! Correct answers are **never sent to the browser**. The `buildDisplayModel` function only extracts display data. Validation happens on the server with the original XML.\n\n### How do I add custom styling?\n\nUse the `theme` prop with a custom theme name, then define CSS variables for `[data-qti-theme=\"your-theme\"]` in your stylesheet.\n\n### Can I use this without Next.js?\n\nThe package is designed for Next.js server components and server actions. For other frameworks, you'd need to:\n1. Create your own server endpoint for `buildDisplayModel` and `validateResponsesSecure`\n2. Call those endpoints from your client\n\n### How do I handle MathML/LaTeX?\n\nThe package preserves MathML in the HTML output. Ensure your app has MathML rendering support (modern browsers handle it natively, or use MathJax/KaTeX for broader support).\n\n---\n\n## License\n\nMIT © Superbuilders\n","readmeFilename":"README.md"}