coursecode 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +322 -0
- package/THIRD_PARTY_NOTICES.md +22 -0
- package/bin/cli.js +331 -0
- package/framework/assets/logo-coursecode-black.svg +14 -0
- package/framework/assets/logo-coursecode-white.svg +14 -0
- package/framework/assets/logo-coursecode.svg +14 -0
- package/framework/css/01-base.css +160 -0
- package/framework/css/02-layout.css +499 -0
- package/framework/css/accessibility.css +834 -0
- package/framework/css/components/accordions.css +710 -0
- package/framework/css/components/assessments.css +520 -0
- package/framework/css/components/audio-player.css +570 -0
- package/framework/css/components/badges.css +80 -0
- package/framework/css/components/breadcrumbs.css +87 -0
- package/framework/css/components/buttons.css +707 -0
- package/framework/css/components/callouts.css +1280 -0
- package/framework/css/components/cards.css +475 -0
- package/framework/css/components/carousel.css +193 -0
- package/framework/css/components/checkbox-group.css +123 -0
- package/framework/css/components/checklist.css +203 -0
- package/framework/css/components/collapse.css +96 -0
- package/framework/css/components/comparison.css +33 -0
- package/framework/css/components/content-image.css +36 -0
- package/framework/css/components/document-gallery.css +425 -0
- package/framework/css/components/dropdown.css +115 -0
- package/framework/css/components/embed-frame.css +142 -0
- package/framework/css/components/engagement.css +412 -0
- package/framework/css/components/features.css +35 -0
- package/framework/css/components/flip-cards.css +253 -0
- package/framework/css/components/footer.css +353 -0
- package/framework/css/components/forms.css +294 -0
- package/framework/css/components/hero.css +216 -0
- package/framework/css/components/images.css +528 -0
- package/framework/css/components/interactive-timeline.css +274 -0
- package/framework/css/components/intro-cards.css +30 -0
- package/framework/css/components/lightbox.css +666 -0
- package/framework/css/components/loading.css +65 -0
- package/framework/css/components/modals.css +235 -0
- package/framework/css/components/notifications.css +107 -0
- package/framework/css/components/quote.css +150 -0
- package/framework/css/components/sidebar.css +684 -0
- package/framework/css/components/slide-header.css +52 -0
- package/framework/css/components/spinner.css +62 -0
- package/framework/css/components/stats.css +44 -0
- package/framework/css/components/steps.css +232 -0
- package/framework/css/components/tables.css +90 -0
- package/framework/css/components/tabs.css +347 -0
- package/framework/css/components/timeline.css +154 -0
- package/framework/css/components/toggle.css +95 -0
- package/framework/css/components/tooltip.css +226 -0
- package/framework/css/components/video-player.css +438 -0
- package/framework/css/design-tokens.css +707 -0
- package/framework/css/framework.css +86 -0
- package/framework/css/interactions/accessibility.css +75 -0
- package/framework/css/interactions/base.css +92 -0
- package/framework/css/interactions/drag-drop.css +295 -0
- package/framework/css/interactions/fill-in-the-blank.css +236 -0
- package/framework/css/interactions/hotspots.css +69 -0
- package/framework/css/interactions/index.css +45 -0
- package/framework/css/interactions/interactive-image.css +359 -0
- package/framework/css/interactions/likert.css +126 -0
- package/framework/css/interactions/matching.css +354 -0
- package/framework/css/interactions/numeric-input.css +78 -0
- package/framework/css/interactions/sequencing.css +378 -0
- package/framework/css/interactions/true-false.css +177 -0
- package/framework/css/layouts/article.css +258 -0
- package/framework/css/layouts/base.css +30 -0
- package/framework/css/layouts/canvas.css +38 -0
- package/framework/css/layouts/focused.css +236 -0
- package/framework/css/layouts/index.css +29 -0
- package/framework/css/layouts/presentation.css +191 -0
- package/framework/css/layouts/traditional.css +52 -0
- package/framework/css/responsive.css +439 -0
- package/framework/css/utilities/accessibility-utils.css +59 -0
- package/framework/css/utilities/animations.css +419 -0
- package/framework/css/utilities/borders.css +72 -0
- package/framework/css/utilities/colors.css +76 -0
- package/framework/css/utilities/container.css +46 -0
- package/framework/css/utilities/decorative.css +442 -0
- package/framework/css/utilities/display.css +257 -0
- package/framework/css/utilities/flexbox.css +80 -0
- package/framework/css/utilities/grid.css +69 -0
- package/framework/css/utilities/icons.css +534 -0
- package/framework/css/utilities/lists.css +190 -0
- package/framework/css/utilities/spacing.css +167 -0
- package/framework/css/utilities/tables.css +81 -0
- package/framework/css/utilities/typography.css +159 -0
- package/framework/css/utilities/visibility.css +117 -0
- package/framework/docs/COURSE_AUTHORING_GUIDE.md +1773 -0
- package/framework/docs/COURSE_OUTLINE_GUIDE.md +725 -0
- package/framework/docs/COURSE_OUTLINE_TEMPLATE.md +161 -0
- package/framework/docs/DATA_MODEL.md +409 -0
- package/framework/docs/FRAMEWORK_GUIDE.md +1088 -0
- package/framework/docs/USER_GUIDE.md +583 -0
- package/framework/docs/examples/cloudflare-channel-relay.js +169 -0
- package/framework/docs/examples/cloudflare-data-worker.js +102 -0
- package/framework/docs/examples/cloudflare-error-worker.js +228 -0
- package/framework/index.html +175 -0
- package/framework/js/app/AppActions.js +410 -0
- package/framework/js/app/AppState.js +225 -0
- package/framework/js/app/AppUI.js +616 -0
- package/framework/js/assessment/AssessmentActions.js +615 -0
- package/framework/js/assessment/AssessmentFactory.js +471 -0
- package/framework/js/assessment/AssessmentState.js +322 -0
- package/framework/js/assessment/AssessmentUI.js +451 -0
- package/framework/js/automation/api-engagement.js +196 -0
- package/framework/js/automation/api-interactions.js +167 -0
- package/framework/js/automation/api.js +242 -0
- package/framework/js/automation/index.js +41 -0
- package/framework/js/components/interactions/drag-drop.js +884 -0
- package/framework/js/components/interactions/fill-in.js +535 -0
- package/framework/js/components/interactions/hotspot.js +702 -0
- package/framework/js/components/interactions/interaction-base.js +511 -0
- package/framework/js/components/interactions/likert.js +301 -0
- package/framework/js/components/interactions/matching.js +699 -0
- package/framework/js/components/interactions/multiple-choice.js +377 -0
- package/framework/js/components/interactions/numeric.js +271 -0
- package/framework/js/components/interactions/sequencing.js +423 -0
- package/framework/js/components/interactions/true-false.js +241 -0
- package/framework/js/components/ui-components/accordion.js +442 -0
- package/framework/js/components/ui-components/alert.js +88 -0
- package/framework/js/components/ui-components/audio-player.js +1193 -0
- package/framework/js/components/ui-components/callout.js +121 -0
- package/framework/js/components/ui-components/carousel.js +145 -0
- package/framework/js/components/ui-components/checkbox-group.js +87 -0
- package/framework/js/components/ui-components/checklist.js +40 -0
- package/framework/js/components/ui-components/collapse.js +114 -0
- package/framework/js/components/ui-components/comparison.js +30 -0
- package/framework/js/components/ui-components/conditional-display.js +150 -0
- package/framework/js/components/ui-components/content-image.js +41 -0
- package/framework/js/components/ui-components/dropdown.js +262 -0
- package/framework/js/components/ui-components/embed-frame.js +274 -0
- package/framework/js/components/ui-components/features.js +33 -0
- package/framework/js/components/ui-components/flip-card.js +230 -0
- package/framework/js/components/ui-components/form-validator.js +76 -0
- package/framework/js/components/ui-components/hero.js +49 -0
- package/framework/js/components/ui-components/index.js +12 -0
- package/framework/js/components/ui-components/interactive-image.js +235 -0
- package/framework/js/components/ui-components/interactive-timeline.js +285 -0
- package/framework/js/components/ui-components/intro-cards.js +35 -0
- package/framework/js/components/ui-components/lightbox.js +652 -0
- package/framework/js/components/ui-components/modal.js +386 -0
- package/framework/js/components/ui-components/notifications.js +145 -0
- package/framework/js/components/ui-components/progress.js +88 -0
- package/framework/js/components/ui-components/quote.js +41 -0
- package/framework/js/components/ui-components/stats.js +33 -0
- package/framework/js/components/ui-components/steps.js +41 -0
- package/framework/js/components/ui-components/tabs.js +255 -0
- package/framework/js/components/ui-components/timeline.js +42 -0
- package/framework/js/components/ui-components/toggle-group.js +73 -0
- package/framework/js/components/ui-components/tooltip.js +458 -0
- package/framework/js/components/ui-components/value-display.js +133 -0
- package/framework/js/components/ui-components/video-player.js +686 -0
- package/framework/js/core/component-catalog.js +121 -0
- package/framework/js/core/event-bus.js +178 -0
- package/framework/js/core/interaction-catalog.js +149 -0
- package/framework/js/dev/runtime-linter.js +1725 -0
- package/framework/js/drivers/cmi5-driver.js +768 -0
- package/framework/js/drivers/driver-factory.js +77 -0
- package/framework/js/drivers/driver-interface.js +110 -0
- package/framework/js/drivers/http-driver-base.js +241 -0
- package/framework/js/drivers/lti-driver.js +508 -0
- package/framework/js/drivers/proxy-driver.js +444 -0
- package/framework/js/drivers/scorm-12-driver.js +560 -0
- package/framework/js/drivers/scorm-2004-driver.js +775 -0
- package/framework/js/drivers/scorm-driver-base.js +112 -0
- package/framework/js/engagement/engagement-manager.js +404 -0
- package/framework/js/engagement/engagement-progress.js +191 -0
- package/framework/js/engagement/engagement-trackers.js +215 -0
- package/framework/js/engagement/requirement-strategies.js +268 -0
- package/framework/js/main.js +727 -0
- package/framework/js/managers/accessibility-manager.js +499 -0
- package/framework/js/managers/assessment-manager.js +230 -0
- package/framework/js/managers/audio-manager.js +944 -0
- package/framework/js/managers/comment-manager.js +88 -0
- package/framework/js/managers/flag-manager.js +86 -0
- package/framework/js/managers/interaction-manager.js +254 -0
- package/framework/js/managers/interaction-registry.js +96 -0
- package/framework/js/managers/objective-manager.js +423 -0
- package/framework/js/managers/score-manager.js +441 -0
- package/framework/js/managers/video-manager.js +536 -0
- package/framework/js/navigation/Breadcrumbs.js +234 -0
- package/framework/js/navigation/NavigationActions.js +1132 -0
- package/framework/js/navigation/NavigationState.js +276 -0
- package/framework/js/navigation/NavigationUI.js +574 -0
- package/framework/js/navigation/document-gallery.js +357 -0
- package/framework/js/navigation/navigation-helpers.js +175 -0
- package/framework/js/navigation/navigation-validators.js +174 -0
- package/framework/js/state/index.js +8 -0
- package/framework/js/state/lms-connection.js +482 -0
- package/framework/js/state/lms-error-utils.js +58 -0
- package/framework/js/state/state-commits.js +200 -0
- package/framework/js/state/state-domains.js +86 -0
- package/framework/js/state/state-manager.js +502 -0
- package/framework/js/state/state-validation.js +311 -0
- package/framework/js/state/transaction-log.js +41 -0
- package/framework/js/state/xapi-statement-service.js +325 -0
- package/framework/js/utilities/access-control.js +99 -0
- package/framework/js/utilities/breakpoint-manager.js +315 -0
- package/framework/js/utilities/canvas-slide.js +35 -0
- package/framework/js/utilities/conditional-display.js +388 -0
- package/framework/js/utilities/course-channel.js +214 -0
- package/framework/js/utilities/course-helpers.js +420 -0
- package/framework/js/utilities/data-reporter.js +273 -0
- package/framework/js/utilities/error-reporter.js +313 -0
- package/framework/js/utilities/hotspot-helper.js +341 -0
- package/framework/js/utilities/icons.js +348 -0
- package/framework/js/utilities/logger.js +92 -0
- package/framework/js/utilities/markdown-renderer.js +45 -0
- package/framework/js/utilities/scroll-tracker.js +68 -0
- package/framework/js/utilities/ui-initializer.js +146 -0
- package/framework/js/utilities/utilities.js +293 -0
- package/framework/js/utilities/view-manager.js +227 -0
- package/framework/js/validation/html-validators.js +422 -0
- package/framework/js/validation/scorm-validators.js +438 -0
- package/framework/js/vendor/pipwerks.js +931 -0
- package/framework/scripts/generate-narration.js +629 -0
- package/framework/scripts/tts-providers/azure-provider.js +178 -0
- package/framework/scripts/tts-providers/base-provider.js +81 -0
- package/framework/scripts/tts-providers/deepgram-provider.js +135 -0
- package/framework/scripts/tts-providers/elevenlabs-provider.js +148 -0
- package/framework/scripts/tts-providers/google-provider.js +272 -0
- package/framework/scripts/tts-providers/index.js +158 -0
- package/framework/scripts/tts-providers/openai-provider.js +143 -0
- package/framework/version.json +63 -0
- package/lib/authoring-api.js +919 -0
- package/lib/build-linter.js +450 -0
- package/lib/build-packaging.js +186 -0
- package/lib/build.js +88 -0
- package/lib/cloud.js +691 -0
- package/lib/convert.js +341 -0
- package/lib/course-parser.js +936 -0
- package/lib/course-writer.js +258 -0
- package/lib/create.js +248 -0
- package/lib/css-index.js +237 -0
- package/lib/dev.js +51 -0
- package/lib/export-content.js +1246 -0
- package/lib/headless-browser.js +413 -0
- package/lib/import.js +377 -0
- package/lib/index.js +80 -0
- package/lib/info.js +79 -0
- package/lib/interaction-formatters.js +568 -0
- package/lib/manifest/cmi5-manifest.js +63 -0
- package/lib/manifest/lti-tool-config.js +53 -0
- package/lib/manifest/manifest-factory.js +99 -0
- package/lib/manifest/scorm-12-manifest.js +61 -0
- package/lib/manifest/scorm-2004-manifest.js +94 -0
- package/lib/manifest/scorm-proxy-manifest.js +104 -0
- package/lib/manifest-parser.js +96 -0
- package/lib/mcp-prompts.js +753 -0
- package/lib/mcp-server.js +316 -0
- package/lib/narration.js +53 -0
- package/lib/pdf-structure.js +142 -0
- package/lib/preview-export.js +231 -0
- package/lib/preview-routes-api.js +662 -0
- package/lib/preview-routes-editing.js +159 -0
- package/lib/preview-routes-lms.js +230 -0
- package/lib/preview-server.js +564 -0
- package/lib/project-utils.js +269 -0
- package/lib/proxy-templates/proxy.html +68 -0
- package/lib/proxy-templates/scorm-bridge.js +112 -0
- package/lib/scaffold.js +193 -0
- package/lib/schema-extractor.js +361 -0
- package/lib/slide-source-editor.js +586 -0
- package/lib/stub-player/app-viewer.js +195 -0
- package/lib/stub-player/app.js +370 -0
- package/lib/stub-player/catalog-panel.js +312 -0
- package/lib/stub-player/config-panel.js +1303 -0
- package/lib/stub-player/content-generator.js +586 -0
- package/lib/stub-player/content-viewer.js +173 -0
- package/lib/stub-player/debug-panel.js +420 -0
- package/lib/stub-player/edit-mode.js +922 -0
- package/lib/stub-player/edit-utils.js +400 -0
- package/lib/stub-player/header-bar.js +354 -0
- package/lib/stub-player/interaction-editor.js +210 -0
- package/lib/stub-player/interactions-panel.js +565 -0
- package/lib/stub-player/lms-api.js +1094 -0
- package/lib/stub-player/login-screen.js +74 -0
- package/lib/stub-player/outline-mode.js +689 -0
- package/lib/stub-player/styles/_assessments-panel.css +245 -0
- package/lib/stub-player/styles/_base.css +89 -0
- package/lib/stub-player/styles/_catalog-icons.css +96 -0
- package/lib/stub-player/styles/_catalog-panel.css +291 -0
- package/lib/stub-player/styles/_config-panel.css +636 -0
- package/lib/stub-player/styles/_content-viewer.css +834 -0
- package/lib/stub-player/styles/_debug-panel.css +576 -0
- package/lib/stub-player/styles/_edit-mode.css +128 -0
- package/lib/stub-player/styles/_header-bar.css +343 -0
- package/lib/stub-player/styles/_interaction-editor.css +140 -0
- package/lib/stub-player/styles/_interactions-panel.css +1038 -0
- package/lib/stub-player/styles/_login-screen.css +102 -0
- package/lib/stub-player/styles/_outline-mode.css +752 -0
- package/lib/stub-player/styles.css +15 -0
- package/lib/stub-player.js +160 -0
- package/lib/test-data-reporting.js +176 -0
- package/lib/test-error-reporting.js +146 -0
- package/lib/token.js +86 -0
- package/lib/upgrade.js +257 -0
- package/lib/validation-rules.js +517 -0
- package/lib/vite-plugin-content-discovery.js +296 -0
- package/package.json +108 -0
- package/schemas/XMLSchema.dtd +402 -0
- package/schemas/adlcp_v1p3.xsd +111 -0
- package/schemas/adlnav_v1p3.xsd +61 -0
- package/schemas/adlseq_v1p3.xsd +93 -0
- package/schemas/common/anyElement.xsd +27 -0
- package/schemas/common/dataTypes.xsd +138 -0
- package/schemas/common/elementNames.xsd +767 -0
- package/schemas/common/elementTypes.xsd +786 -0
- package/schemas/common/rootElement.xsd +31 -0
- package/schemas/common/vocabTypes.xsd +345 -0
- package/schemas/common/vocabValues.xsd +257 -0
- package/schemas/datatypes.dtd +203 -0
- package/schemas/ims_xml.xsd +35 -0
- package/schemas/imscp_v1p1.xsd +368 -0
- package/schemas/imsss_v1p0.xsd +67 -0
- package/schemas/imsss_v1p0auxresource.xsd +19 -0
- package/schemas/imsss_v1p0control.xsd +20 -0
- package/schemas/imsss_v1p0delivery.xsd +17 -0
- package/schemas/imsss_v1p0limit.xsd +47 -0
- package/schemas/imsss_v1p0objective.xsd +67 -0
- package/schemas/imsss_v1p0random.xsd +16 -0
- package/schemas/imsss_v1p0rollup.xsd +46 -0
- package/schemas/imsss_v1p0seqrule.xsd +108 -0
- package/schemas/imsss_v1p0util.xsd +94 -0
- package/schemas/license.txt +17 -0
- package/schemas/lom.xsd +102 -0
- package/schemas/lomCustom.xsd +62 -0
- package/schemas/lomLoose.xsd +62 -0
- package/schemas/lomStrict.xsd +62 -0
- package/schemas/xml.xsd +81 -0
- package/template/.env.example +92 -0
- package/template/course/assets/audio/example-intro.mp3 +0 -0
- package/template/course/assets/audio/example-ui-demo--compact-player.mp3 +0 -0
- package/template/course/assets/audio/example-ui-demo--demo-modal.mp3 +0 -0
- package/template/course/assets/audio/example-ui-demo--full-player.mp3 +0 -0
- package/template/course/assets/docs/example_md_1.md +39 -0
- package/template/course/assets/docs/example_md_2.md +41 -0
- package/template/course/assets/docs/example_pdf_1_thumbnail.png +0 -0
- package/template/course/assets/docs/example_pdf_2.pdf +0 -0
- package/template/course/assets/images/course-architecture.svg +36 -0
- package/template/course/assets/images/logo.svg +14 -0
- package/template/course/assets/widgets/counter-demo.html +190 -0
- package/template/course/assets/widgets/gravity-painter.html +384 -0
- package/template/course/course-config.js +539 -0
- package/template/course/icons.js +19 -0
- package/template/course/interactions/PLUGIN_GUIDE.md +97 -0
- package/template/course/slides/example-course-structure.js +138 -0
- package/template/course/slides/example-final-exam.js +144 -0
- package/template/course/slides/example-finishing.js +127 -0
- package/template/course/slides/example-interactions-showcase.js +615 -0
- package/template/course/slides/example-preview-tour.js +129 -0
- package/template/course/slides/example-remedial.js +143 -0
- package/template/course/slides/example-summary.js +103 -0
- package/template/course/slides/example-ui-showcase.js +1805 -0
- package/template/course/slides/example-welcome.js +123 -0
- package/template/course/slides/example-workflow.js +140 -0
- package/template/course/theme.css +165 -0
- package/template/eslint.config.js +47 -0
- package/template/package.json +28 -0
- package/template/vite.config.js +339 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preview Tour slide - Guide to using the preview server and its tools
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const { iconManager } = CourseCode;
|
|
6
|
+
|
|
7
|
+
export const slide = {
|
|
8
|
+
render(_root, _context) {
|
|
9
|
+
const container = document.createElement('div');
|
|
10
|
+
container.innerHTML = `
|
|
11
|
+
<div class="stack-lg">
|
|
12
|
+
|
|
13
|
+
<!-- Header -->
|
|
14
|
+
<header class="slide-header">
|
|
15
|
+
<h1>Using the Preview</h1>
|
|
16
|
+
<p>Your course preview simulates a real LMS and includes powerful authoring tools.</p>
|
|
17
|
+
</header>
|
|
18
|
+
|
|
19
|
+
<!-- Starting the Preview -->
|
|
20
|
+
<section class="card no-hover">
|
|
21
|
+
<h2 class="text-lg font-bold border-bottom pb-2 mb-4">${iconManager.getIcon('play')} Starting the Preview</h2>
|
|
22
|
+
<div class="cols-2 gap-6">
|
|
23
|
+
<div class="stack-sm">
|
|
24
|
+
<p>In your project folder, run:</p>
|
|
25
|
+
<pre class="bg-gray-100 p-3 rounded"><code>coursecode preview</code></pre>
|
|
26
|
+
<p>Then open <code>http://localhost:4173</code> in your browser.</p>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="callout callout--success callout--compact">
|
|
29
|
+
<strong>${iconManager.getIcon('refresh-cw')} Live Reload:</strong> The preview automatically refreshes when you save changes. No need to manually reload.
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</section>
|
|
33
|
+
|
|
34
|
+
<!-- Header Bar Tools -->
|
|
35
|
+
<section class="card no-hover">
|
|
36
|
+
<h2 class="text-lg font-bold border-bottom pb-2 mb-4">${iconManager.getIcon('settings')} Header Bar Tools</h2>
|
|
37
|
+
<p class="mb-4">The header bar at the top of the preview gives you access to these tools:</p>
|
|
38
|
+
|
|
39
|
+
<div class="cols-3 gap-4">
|
|
40
|
+
<div class="card card-outlined h-full">
|
|
41
|
+
<h3 class="font-bold mb-2">📊 Status</h3>
|
|
42
|
+
<p class="text-sm">Dashboard showing course health: build status, slide count, engagement summary, and errors at a glance.</p>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="card card-outlined h-full">
|
|
45
|
+
<h3 class="font-bold mb-2">✏️ Edit</h3>
|
|
46
|
+
<p class="text-sm">Click any text in your course to edit it directly. Changes save to your source files automatically.</p>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="card card-outlined h-full">
|
|
49
|
+
<h3 class="font-bold mb-2">📄 Review</h3>
|
|
50
|
+
<p class="text-sm">See all your course content in one scrollable view. Useful for reviewing the full learner experience.</p>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="card card-outlined h-full">
|
|
53
|
+
<h3 class="font-bold mb-2">📋 Config</h3>
|
|
54
|
+
<p class="text-sm">View and modify course settings, slide properties, and engagement configurations through a visual interface.</p>
|
|
55
|
+
</div>
|
|
56
|
+
<div class="card card-outlined h-full">
|
|
57
|
+
<h3 class="font-bold mb-2">📝 Interactions</h3>
|
|
58
|
+
<p class="text-sm">Browse and test all interactions on the current slide. See response data and evaluation results.</p>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="card card-outlined h-full">
|
|
61
|
+
<h3 class="font-bold mb-2">🧩 Catalog</h3>
|
|
62
|
+
<p class="text-sm">Browse all available UI components and CSS patterns with live previews. A visual reference for what's possible.</p>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</section>
|
|
66
|
+
|
|
67
|
+
<!-- Testing Features -->
|
|
68
|
+
<section class="card no-hover">
|
|
69
|
+
<h2 class="text-lg font-bold border-bottom pb-2 mb-4">${iconManager.getIcon('check-circle')} Testing Your Course</h2>
|
|
70
|
+
<div class="stack-md">
|
|
71
|
+
<div class="cols-3 gap-4">
|
|
72
|
+
<div class="callout callout--info callout--compact">
|
|
73
|
+
<strong>🔍 Debug:</strong> Inspect SCORM state, view every LMS API call, and see validation warnings.
|
|
74
|
+
</div>
|
|
75
|
+
<div class="callout callout--info callout--compact">
|
|
76
|
+
<strong>${iconManager.getIcon('rotate-ccw')} Reset:</strong> Start fresh with a clean slate. Clears all progress and saved state.
|
|
77
|
+
</div>
|
|
78
|
+
<div class="callout callout--warning callout--compact">
|
|
79
|
+
<strong>${iconManager.getIcon('unlock')} Skip Gating:</strong> Toggle in the Config panel to bypass navigation locks during testing.
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
<p class="text-sm text-muted">Your progress is saved automatically, just like in a real LMS. Refresh the page and you'll be right where you left off.</p>
|
|
83
|
+
</div>
|
|
84
|
+
</section>
|
|
85
|
+
|
|
86
|
+
<!-- URL Parameters -->
|
|
87
|
+
<section class="card no-hover">
|
|
88
|
+
<h2 class="text-lg font-bold border-bottom pb-2 mb-4">${iconManager.getIcon('link')} Quick Access URLs</h2>
|
|
89
|
+
<p class="mb-3">Add these to your URL to enable features automatically:</p>
|
|
90
|
+
<table class="table table-striped">
|
|
91
|
+
<thead>
|
|
92
|
+
<tr>
|
|
93
|
+
<th>URL</th>
|
|
94
|
+
<th>Effect</th>
|
|
95
|
+
</tr>
|
|
96
|
+
</thead>
|
|
97
|
+
<tbody>
|
|
98
|
+
<tr>
|
|
99
|
+
<td><code>#example-welcome</code></td>
|
|
100
|
+
<td>Navigate to any slide by its ID</td>
|
|
101
|
+
</tr>
|
|
102
|
+
<tr>
|
|
103
|
+
<td><code>?skipGating=true</code></td>
|
|
104
|
+
<td>Bypass all navigation locks</td>
|
|
105
|
+
</tr>
|
|
106
|
+
<tr>
|
|
107
|
+
<td><code>?debug=true</code></td>
|
|
108
|
+
<td>Open debug panel on load</td>
|
|
109
|
+
</tr>
|
|
110
|
+
<tr>
|
|
111
|
+
<td><code>?dashboard</code></td>
|
|
112
|
+
<td>Open the status dashboard on load</td>
|
|
113
|
+
</tr>
|
|
114
|
+
</tbody>
|
|
115
|
+
</table>
|
|
116
|
+
</section>
|
|
117
|
+
|
|
118
|
+
<!-- MCP Note -->
|
|
119
|
+
<div class="callout callout--success">
|
|
120
|
+
<h3 class="font-bold">${iconManager.getIcon('cpu')} AI-Powered Preview with MCP</h3>
|
|
121
|
+
<p>When your AI is connected via MCP, it can navigate slides, take screenshots, test interactions, and inspect course state directly. You don't need to describe what you see; the AI sees it too.</p>
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
</div>
|
|
125
|
+
`;
|
|
126
|
+
|
|
127
|
+
return container;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FRAMEWORK EXAMPLE SLIDE
|
|
3
|
+
* This is a template example demonstrating remedial content patterns. You can keep it as a reference or delete it.
|
|
4
|
+
* See COURSE_AUTHORING_GUIDE.md for full documentation.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { createDragDropQuestion, announceToScreenReader, AppActions, iconManager } = CourseCode;
|
|
8
|
+
export const slide = {
|
|
9
|
+
render(_root, _context) {
|
|
10
|
+
const container = document.createElement('div');
|
|
11
|
+
container.innerHTML = `
|
|
12
|
+
<div class="stack-lg">
|
|
13
|
+
|
|
14
|
+
<header class="slide-header">
|
|
15
|
+
<h1>🔄 Review & Practice</h1>
|
|
16
|
+
</header>
|
|
17
|
+
|
|
18
|
+
<div class="callout callout--info">
|
|
19
|
+
<h2 class="text-lg font-bold">🚀 Let's Review the Basics</h2>
|
|
20
|
+
<p>Learning takes practice! Let's strengthen your understanding of CourseCode
|
|
21
|
+
with a quick review of the key concepts and hands-on exercises.</p>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<section>
|
|
25
|
+
<h2 class="text-xl font-bold mb-4 border-bottom pb-2">${iconManager.getIcon('target')} CourseCode Key Concepts</h2>
|
|
26
|
+
|
|
27
|
+
<div class="cols-3 gap-4">
|
|
28
|
+
<div class="card no-hover h-full stack-sm">
|
|
29
|
+
<h3 class="text-lg font-bold">${iconManager.getIcon('folder')} Project Structure</h3>
|
|
30
|
+
<div class="text-sm">
|
|
31
|
+
<p class="mb-1"><strong>course-config.js</strong> - Course metadata and slide order</p>
|
|
32
|
+
<p class="mb-1"><strong>slides/</strong> - Individual slide modules</p>
|
|
33
|
+
<p class="mb-1"><strong>theme.css</strong> - Custom color variables</p>
|
|
34
|
+
<p><strong>assets/</strong> - Images, videos, and media</p>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<div class="card no-hover h-full stack-sm">
|
|
39
|
+
<h3 class="text-lg font-bold">${iconManager.getIcon('refresh-cw')} Development Workflow</h3>
|
|
40
|
+
<ol class="list-numbered text-sm pl-4">
|
|
41
|
+
<li><strong>Create</strong> - <code>coursecode create</code></li>
|
|
42
|
+
<li><strong>Develop</strong> - <code>coursecode dev</code></li>
|
|
43
|
+
<li><strong>Preview</strong> - Test in browser with hot reload</li>
|
|
44
|
+
<li><strong>Build</strong> - <code>coursecode build</code></li>
|
|
45
|
+
</ol>
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<div class="card no-hover h-full stack-sm">
|
|
49
|
+
<h3 class="text-lg font-bold">${iconManager.getIcon('target')} LMS Integration</h3>
|
|
50
|
+
<div class="text-sm">
|
|
51
|
+
<p class="mb-1"><strong>SCORM 1.2</strong> - Widest LMS compatibility</p>
|
|
52
|
+
<p class="mb-1"><strong>SCORM 2004</strong> - Enhanced tracking features</p>
|
|
53
|
+
<p class="mb-1"><strong>cmi5</strong> - Modern xAPI-based standard</p>
|
|
54
|
+
<p><strong>Scoring</strong> - Automatic score reporting</p>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</section>
|
|
59
|
+
|
|
60
|
+
<section class="card no-hover stack-md">
|
|
61
|
+
<div>
|
|
62
|
+
<h2 class="text-xl font-bold">${iconManager.getIcon('settings')} Practice Exercise</h2>
|
|
63
|
+
<p>Organize the course development workflow steps:</p>
|
|
64
|
+
</div>
|
|
65
|
+
<div id="remedial-practice"></div>
|
|
66
|
+
</section>
|
|
67
|
+
|
|
68
|
+
<section class="resources">
|
|
69
|
+
<h2 class="text-xl font-bold mb-4">${iconManager.getIcon('book-open')} Helpful Resources</h2>
|
|
70
|
+
<div class="stack-sm">
|
|
71
|
+
<button data-resource="authoring-guide" class="btn btn-sm btn-outline-primary w-full justify-start">Course Authoring Guide</button>
|
|
72
|
+
<button data-resource="components" class="btn btn-sm btn-outline-primary w-full justify-start">Component Reference</button>
|
|
73
|
+
<button data-resource="cli" class="btn btn-sm btn-outline-primary w-full justify-start">CLI Commands</button>
|
|
74
|
+
</div>
|
|
75
|
+
</section>
|
|
76
|
+
|
|
77
|
+
<div class="flex justify-center mt-4">
|
|
78
|
+
<button class="btn btn-success btn-lg complete-remedial-btn">
|
|
79
|
+
${iconManager.getIcon('check-circle')} Complete Review
|
|
80
|
+
</button>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
</div>
|
|
84
|
+
`;
|
|
85
|
+
|
|
86
|
+
setupRemedialContent(container);
|
|
87
|
+
|
|
88
|
+
return container;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Sets up and initializes remedial content including practice exercises and resource handlers
|
|
94
|
+
* @param {HTMLElement} container - The container element containing remedial content
|
|
95
|
+
*/
|
|
96
|
+
function setupRemedialContent(container) {
|
|
97
|
+
// CourseCode workflow practice
|
|
98
|
+
const remedialConfig = {
|
|
99
|
+
id: 'remedial-coursecode-workflow',
|
|
100
|
+
prompt: 'Organize the course development workflow steps',
|
|
101
|
+
items: [
|
|
102
|
+
{ id: 'create', content: 'Create Project' },
|
|
103
|
+
{ id: 'develop', content: 'Write Slides' },
|
|
104
|
+
{ id: 'test', content: 'Test in Browser' },
|
|
105
|
+
{ id: 'build', content: 'Build Package' }
|
|
106
|
+
],
|
|
107
|
+
dropZones: [
|
|
108
|
+
{ id: 'setup', label: 'Setup Phase', accepts: ['create'] },
|
|
109
|
+
{ id: 'authoring', label: 'Authoring Phase', accepts: ['develop', 'test'] },
|
|
110
|
+
{ id: 'deploy', label: 'Deployment Phase', accepts: ['build'] }
|
|
111
|
+
]
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const remedialQuestion = createDragDropQuestion(remedialConfig);
|
|
115
|
+
const practiceContainer = container.querySelector('#remedial-practice');
|
|
116
|
+
if (practiceContainer) {
|
|
117
|
+
remedialQuestion.render(practiceContainer);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async function completeRemedial() {
|
|
121
|
+
announceToScreenReader('Review completed successfully!');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function showResource(resourceType) {
|
|
125
|
+
const resources = {
|
|
126
|
+
'authoring-guide': 'The Course Authoring Guide covers slide creation, interactions, assessments, accessibility, and theming. Find it at docs/COURSE_AUTHORING_GUIDE.md',
|
|
127
|
+
'components': 'CourseCode includes drag-drop, fill-in-the-blank, numeric input, multiple choice, interactive images, tabs, accordions, and more.',
|
|
128
|
+
'cli': 'Key commands: coursecode create (new project), coursecode dev (development server), coursecode build (production package), coursecode info (project details)'
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const message = resources[resourceType] || 'Resource not found';
|
|
132
|
+
AppActions.showNotification(message, 'info', 8000);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
container.querySelector('.complete-remedial-btn').addEventListener('click', completeRemedial);
|
|
136
|
+
container.querySelectorAll('.resources button').forEach(link => {
|
|
137
|
+
link.addEventListener('click', (e) => {
|
|
138
|
+
e.preventDefault();
|
|
139
|
+
showResource(link.dataset.resource);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FRAMEWORK EXAMPLE SLIDE
|
|
3
|
+
* This is a template example demonstrating summary/completion patterns. You can keep it as a reference or delete it.
|
|
4
|
+
* See COURSE_AUTHORING_GUIDE.md for full documentation.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { interactionManager, AppActions, iconManager } = CourseCode;
|
|
8
|
+
export const slide = {
|
|
9
|
+
render(_root, _context) {
|
|
10
|
+
const interactions = interactionManager.getAllInteractions();
|
|
11
|
+
const sessionDurationMs = AppActions.getSessionDuration();
|
|
12
|
+
const interactionCount = interactions.length;
|
|
13
|
+
const averageScore = interactionCount > 0
|
|
14
|
+
? Math.round((interactions.reduce((sum, i) => sum + (i.score || 0), 0) / interactionCount) * 100)
|
|
15
|
+
: 0;
|
|
16
|
+
const sessionDurationMinutes = Math.floor(sessionDurationMs / 60000);
|
|
17
|
+
const sessionDurationDisplay = sessionDurationMinutes > 0
|
|
18
|
+
? `${sessionDurationMinutes} minutes`
|
|
19
|
+
: 'Less than a minute';
|
|
20
|
+
|
|
21
|
+
const container = document.createElement('div');
|
|
22
|
+
container.innerHTML = `
|
|
23
|
+
<div class="stack-lg">
|
|
24
|
+
|
|
25
|
+
<header class="slide-header">
|
|
26
|
+
<h1>Template Complete!</h1>
|
|
27
|
+
</header>
|
|
28
|
+
|
|
29
|
+
<div class="callout callout--success">
|
|
30
|
+
<h2 class="text-xl font-bold">You've explored CourseCode!</h2>
|
|
31
|
+
<p>You've seen the key features of the CourseCode framework. Now you're ready to build
|
|
32
|
+
your own interactive e-learning courses with full LMS compatibility.</p>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<section class="card no-hover">
|
|
36
|
+
<h2 class="text-lg font-bold border-bottom pb-2 mb-4">${iconManager.getIcon('bar-chart')} Session Summary</h2>
|
|
37
|
+
<div class="cols-3 gap-4">
|
|
38
|
+
<div class="p-4 bg-gray-50 rounded text-center">
|
|
39
|
+
<h3 class="text-sm font-bold text-muted uppercase">Time Spent</h3>
|
|
40
|
+
<p class="text-xl font-bold text-primary">${sessionDurationDisplay}</p>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="p-4 bg-gray-50 rounded text-center">
|
|
43
|
+
<h3 class="text-sm font-bold text-muted uppercase">Interactions</h3>
|
|
44
|
+
<p class="text-xl font-bold text-primary">${interactionCount} completed</p>
|
|
45
|
+
</div>
|
|
46
|
+
<div class="p-4 bg-gray-50 rounded text-center">
|
|
47
|
+
<h3 class="text-sm font-bold text-muted uppercase">Average Score</h3>
|
|
48
|
+
<p class="text-xl font-bold text-primary">${averageScore}%</p>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</section>
|
|
52
|
+
|
|
53
|
+
<section>
|
|
54
|
+
<h2 class="text-xl font-bold mb-4">Features Demonstrated</h2>
|
|
55
|
+
<div class="cols-2 gap-4">
|
|
56
|
+
<div class="flex gap-2 items-start">
|
|
57
|
+
<span class="text-success">${iconManager.getIcon('check-circle')}</span>
|
|
58
|
+
<div><strong>Drag & Drop:</strong> Interactive sorting and categorization</div>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="flex gap-2 items-start">
|
|
61
|
+
<span class="text-success">${iconManager.getIcon('check-circle')}</span>
|
|
62
|
+
<div><strong>Fill in the Blank:</strong> Text input with flexible matching</div>
|
|
63
|
+
</div>
|
|
64
|
+
<div class="flex gap-2 items-start">
|
|
65
|
+
<span class="text-success">${iconManager.getIcon('check-circle')}</span>
|
|
66
|
+
<div><strong>Numeric Input:</strong> Number entry with tolerance</div>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="flex gap-2 items-start">
|
|
69
|
+
<span class="text-success">${iconManager.getIcon('check-circle')}</span>
|
|
70
|
+
<div><strong>Interactive Images:</strong> Hotspots linked to content</div>
|
|
71
|
+
</div>
|
|
72
|
+
<div class="flex gap-2 items-start">
|
|
73
|
+
<span class="text-success">${iconManager.getIcon('check-circle')}</span>
|
|
74
|
+
<div><strong>Assessments:</strong> Graded quizzes with feedback</div>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="flex gap-2 items-start">
|
|
77
|
+
<span class="text-success">${iconManager.getIcon('check-circle')}</span>
|
|
78
|
+
<div><strong>Accessibility:</strong> Dark mode, fonts, contrast, motion</div>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="flex gap-2 items-start">
|
|
81
|
+
<span class="text-success">${iconManager.getIcon('check-circle')}</span>
|
|
82
|
+
<div><strong>Navigation:</strong> Sidebar, gating, progress tracking</div>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</section>
|
|
86
|
+
|
|
87
|
+
<section class="card no-hover bg-gray-50">
|
|
88
|
+
<h2 class="text-lg font-bold mb-4">🚀 Next Steps</h2>
|
|
89
|
+
<p class="mb-4">Ready to build your own course? Here's how to get started:</p>
|
|
90
|
+
<ul class="list-styled">
|
|
91
|
+
<li><strong>Read the Docs:</strong> Check out COURSE_AUTHORING_GUIDE.md for detailed instructions</li>
|
|
92
|
+
<li><strong>Customize Theme:</strong> Edit theme.css to match your brand colors</li>
|
|
93
|
+
<li><strong>Add Slides:</strong> Create new slide files in the slides/ folder</li>
|
|
94
|
+
<li><strong>Configure Structure:</strong> Update course-config.js with your content</li>
|
|
95
|
+
<li><strong>Build & Deploy:</strong> Run <code>coursecode build</code> to create your LMS package</li>
|
|
96
|
+
</ul>
|
|
97
|
+
</section>
|
|
98
|
+
</div>
|
|
99
|
+
`;
|
|
100
|
+
|
|
101
|
+
return container;
|
|
102
|
+
}
|
|
103
|
+
};
|