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,62 @@
|
|
|
1
|
+
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/LOM"
|
|
2
|
+
xmlns="http://ltsc.ieee.org/xsd/LOM"
|
|
3
|
+
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
|
4
|
+
elementFormDefault="qualified"
|
|
5
|
+
version="IEEE LTSC LOM XML 1.0">
|
|
6
|
+
|
|
7
|
+
<xs:annotation>
|
|
8
|
+
<xs:documentation>
|
|
9
|
+
This work is licensed under the Creative Commons Attribution-ShareAlike
|
|
10
|
+
License. To view a copy of this license, see the file license.txt,
|
|
11
|
+
visit http://creativecommons.org/licenses/by-sa/1.0 or send a letter to
|
|
12
|
+
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
|
|
13
|
+
</xs:documentation>
|
|
14
|
+
<xs:documentation>
|
|
15
|
+
This file represents a composite schema for validation of the following:
|
|
16
|
+
1) No validation of vocabularies
|
|
17
|
+
2) Uniqueness constraints defined by 1484.12.1-2002
|
|
18
|
+
3) The use of custom extensions to the LOM Base Schema
|
|
19
|
+
</xs:documentation>
|
|
20
|
+
<xs:documentation>
|
|
21
|
+
****************************************************************************
|
|
22
|
+
** CHANGE HISTORY **
|
|
23
|
+
****************************************************************************
|
|
24
|
+
** 09/22/2003: - Updated comment describing vocab/strict.xsd. Indicated **
|
|
25
|
+
** that the strict.xsd is used to validate vocabularies **
|
|
26
|
+
** defined in the LOM V1.0 Base Schema. **
|
|
27
|
+
** - Moved included schema elementNames.xsd just before **
|
|
28
|
+
** elementTypes.xsd. **
|
|
29
|
+
** - Moved the element declaration for the top-level lom **
|
|
30
|
+
** metadata element to a separate file (rootElement.xsd) **
|
|
31
|
+
** and included this file just after elementTypes.xsd. **
|
|
32
|
+
** - Moved the XML Schema import statements before the XML **
|
|
33
|
+
** Schema include statements. **
|
|
34
|
+
** - Moved the element group declaration named **
|
|
35
|
+
** lom:customElements to a separate file (anyElement.xsd) **
|
|
36
|
+
** and included this new file just before the XML Schema **
|
|
37
|
+
** import statments. **
|
|
38
|
+
****************************************************************************
|
|
39
|
+
</xs:documentation>
|
|
40
|
+
</xs:annotation>
|
|
41
|
+
|
|
42
|
+
<!-- Learning Object Metadata -->
|
|
43
|
+
|
|
44
|
+
<xs:include schemaLocation="common/anyElement.xsd"/>
|
|
45
|
+
|
|
46
|
+
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/unique"
|
|
47
|
+
schemaLocation="unique/strict.xsd"/>
|
|
48
|
+
|
|
49
|
+
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/vocab"
|
|
50
|
+
schemaLocation="vocab/loose.xsd"/>
|
|
51
|
+
|
|
52
|
+
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/extend"
|
|
53
|
+
schemaLocation="extend/custom.xsd"/>
|
|
54
|
+
|
|
55
|
+
<xs:include schemaLocation="common/dataTypes.xsd"/>
|
|
56
|
+
<xs:include schemaLocation="common/elementNames.xsd"/>
|
|
57
|
+
<xs:include schemaLocation="common/elementTypes.xsd"/>
|
|
58
|
+
<xs:include schemaLocation="common/rootElement.xsd"/>
|
|
59
|
+
<xs:include schemaLocation="common/vocabValues.xsd"/>
|
|
60
|
+
<xs:include schemaLocation="common/vocabTypes.xsd"/>
|
|
61
|
+
|
|
62
|
+
</xs:schema>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<xs:schema targetNamespace="http://ltsc.ieee.org/xsd/LOM"
|
|
2
|
+
xmlns="http://ltsc.ieee.org/xsd/LOM"
|
|
3
|
+
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
|
4
|
+
elementFormDefault="qualified"
|
|
5
|
+
version="IEEE LTSC LOM XML 1.0">
|
|
6
|
+
|
|
7
|
+
<xs:annotation>
|
|
8
|
+
<xs:documentation>
|
|
9
|
+
This work is licensed under the Creative Commons Attribution-ShareAlike
|
|
10
|
+
License. To view a copy of this license, see the file license.txt,
|
|
11
|
+
visit http://creativecommons.org/licenses/by-sa/1.0 or send a letter to
|
|
12
|
+
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
|
|
13
|
+
</xs:documentation>
|
|
14
|
+
<xs:documentation>
|
|
15
|
+
This file represents a composite schema for validation of the following:
|
|
16
|
+
1) The use of LOM Base Schema vocabulary source/value pairs only
|
|
17
|
+
2) Uniqueness constraints defined by 1484.12.1-2002
|
|
18
|
+
3) No existenace of any defined extensions
|
|
19
|
+
</xs:documentation>
|
|
20
|
+
<xs:documentation>
|
|
21
|
+
****************************************************************************
|
|
22
|
+
** CHANGE HISTORY **
|
|
23
|
+
****************************************************************************
|
|
24
|
+
** 09/22/2003: - Updated comment describing vocab/strict.xsd. Indicated **
|
|
25
|
+
** that the strict.xsd is used to validate vocabularies **
|
|
26
|
+
** defined in the LOM V1.0 Base Schema. **
|
|
27
|
+
** - Moved included schema elementNames.xsd just before **
|
|
28
|
+
** elementTypes.xsd. **
|
|
29
|
+
** - Moved the element declaration for the top-level lom **
|
|
30
|
+
** metadata element to a separate file (rootElement.xsd) **
|
|
31
|
+
** and included this file just after elementTypes.xsd. **
|
|
32
|
+
** - Moved the XML Schema import statements before the XML **
|
|
33
|
+
** Schema include statements. **
|
|
34
|
+
** - Moved the element group declaration named **
|
|
35
|
+
** lom:customElements to a separate file (anyElement.xsd) **
|
|
36
|
+
** and included this new file just before the XML Schema **
|
|
37
|
+
** import statments. **
|
|
38
|
+
****************************************************************************
|
|
39
|
+
</xs:documentation>
|
|
40
|
+
</xs:annotation>
|
|
41
|
+
|
|
42
|
+
<!-- Learning Object Metadata -->
|
|
43
|
+
|
|
44
|
+
<xs:include schemaLocation="common/anyElement.xsd"/>
|
|
45
|
+
|
|
46
|
+
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/unique"
|
|
47
|
+
schemaLocation="unique/strict.xsd"/>
|
|
48
|
+
|
|
49
|
+
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/vocab"
|
|
50
|
+
schemaLocation="vocab/strict.xsd"/>
|
|
51
|
+
|
|
52
|
+
<xs:import namespace="http://ltsc.ieee.org/xsd/LOM/extend"
|
|
53
|
+
schemaLocation="extend/strict.xsd"/>
|
|
54
|
+
|
|
55
|
+
<xs:include schemaLocation="common/dataTypes.xsd"/>
|
|
56
|
+
<xs:include schemaLocation="common/elementNames.xsd"/>
|
|
57
|
+
<xs:include schemaLocation="common/elementTypes.xsd"/>
|
|
58
|
+
<xs:include schemaLocation="common/rootElement.xsd"/>
|
|
59
|
+
<xs:include schemaLocation="common/vocabValues.xsd"/>
|
|
60
|
+
<xs:include schemaLocation="common/vocabTypes.xsd"/>
|
|
61
|
+
|
|
62
|
+
</xs:schema>
|
package/schemas/xml.xsd
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
<?xml version='1.0'?>
|
|
2
|
+
<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" >
|
|
3
|
+
<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
|
|
4
|
+
|
|
5
|
+
<xs:annotation>
|
|
6
|
+
<xs:documentation>
|
|
7
|
+
See http://www.w3.org/XML/1998/namespace.html and
|
|
8
|
+
http://www.w3.org/TR/REC-xml for information about this namespace.
|
|
9
|
+
</xs:documentation>
|
|
10
|
+
</xs:annotation>
|
|
11
|
+
|
|
12
|
+
<xs:annotation>
|
|
13
|
+
<xs:documentation>This schema defines attributes and an attribute group
|
|
14
|
+
suitable for use by
|
|
15
|
+
schemas wishing to allow xml:base, xml:lang or xml:space attributes
|
|
16
|
+
on elements they define.
|
|
17
|
+
|
|
18
|
+
To enable this, such a schema must import this schema
|
|
19
|
+
for the XML namespace, e.g. as follows:
|
|
20
|
+
<schema . . .>
|
|
21
|
+
. . .
|
|
22
|
+
<import namespace="http://www.w3.org/XML/1998/namespace"
|
|
23
|
+
schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
|
|
24
|
+
|
|
25
|
+
Subsequently, qualified reference to any of the attributes
|
|
26
|
+
or the group defined below will have the desired effect, e.g.
|
|
27
|
+
|
|
28
|
+
<type . . .>
|
|
29
|
+
. . .
|
|
30
|
+
<attributeGroup ref="xml:specialAttrs"/>
|
|
31
|
+
|
|
32
|
+
will define a type which will schema-validate an instance
|
|
33
|
+
element with any of those attributes</xs:documentation>
|
|
34
|
+
</xs:annotation>
|
|
35
|
+
|
|
36
|
+
<xs:annotation>
|
|
37
|
+
<xs:documentation>In keeping with the XML Schema WG's standard versioning
|
|
38
|
+
policy, this schema document will persist at
|
|
39
|
+
http://www.w3.org/2001/03/xml.xsd.
|
|
40
|
+
At the date of issue it can also be found at
|
|
41
|
+
http://www.w3.org/2001/xml.xsd.
|
|
42
|
+
The schema document at that URI may however change in the future,
|
|
43
|
+
in order to remain compatible with the latest version of XML Schema
|
|
44
|
+
itself. In other words, if the XML Schema namespace changes, the version
|
|
45
|
+
of this document at
|
|
46
|
+
http://www.w3.org/2001/xml.xsd will change
|
|
47
|
+
accordingly; the version at
|
|
48
|
+
http://www.w3.org/2001/03/xml.xsd will not change.
|
|
49
|
+
</xs:documentation>
|
|
50
|
+
</xs:annotation>
|
|
51
|
+
|
|
52
|
+
<xs:attribute name="lang" type="xs:language">
|
|
53
|
+
<xs:annotation>
|
|
54
|
+
<xs:documentation>In due course, we should install the relevant ISO 2- and 3-letter
|
|
55
|
+
codes as the enumerated possible values . . .</xs:documentation>
|
|
56
|
+
</xs:annotation>
|
|
57
|
+
</xs:attribute>
|
|
58
|
+
|
|
59
|
+
<xs:attribute name="space" default="preserve">
|
|
60
|
+
<xs:simpleType>
|
|
61
|
+
<xs:restriction base="xs:NCName">
|
|
62
|
+
<xs:enumeration value="default"/>
|
|
63
|
+
<xs:enumeration value="preserve"/>
|
|
64
|
+
</xs:restriction>
|
|
65
|
+
</xs:simpleType>
|
|
66
|
+
</xs:attribute>
|
|
67
|
+
|
|
68
|
+
<xs:attribute name="base" type="xs:anyURI">
|
|
69
|
+
<xs:annotation>
|
|
70
|
+
<xs:documentation>See http://www.w3.org/TR/xmlbase/ for
|
|
71
|
+
information about this attribute.</xs:documentation>
|
|
72
|
+
</xs:annotation>
|
|
73
|
+
</xs:attribute>
|
|
74
|
+
|
|
75
|
+
<xs:attributeGroup name="specialAttrs">
|
|
76
|
+
<xs:attribute ref="xml:base"/>
|
|
77
|
+
<xs:attribute ref="xml:lang"/>
|
|
78
|
+
<xs:attribute ref="xml:space"/>
|
|
79
|
+
</xs:attributeGroup>
|
|
80
|
+
|
|
81
|
+
</xs:schema>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# ============================================
|
|
2
|
+
# TTS Provider Selection
|
|
3
|
+
# ============================================
|
|
4
|
+
# Explicitly choose a provider: elevenlabs, openai, google, azure, deepgram
|
|
5
|
+
# If not set, auto-detects based on available API keys (default: deepgram)
|
|
6
|
+
# TTS_PROVIDER=deepgram
|
|
7
|
+
|
|
8
|
+
# ============================================
|
|
9
|
+
# ElevenLabs (Default)
|
|
10
|
+
# ============================================
|
|
11
|
+
# Get your key at: https://elevenlabs.io/
|
|
12
|
+
ELEVENLABS_API_KEY=
|
|
13
|
+
|
|
14
|
+
# Optional: Default voice ID
|
|
15
|
+
# ELEVENLABS_VOICE_ID=S9UjcNYIwfBOtZiDnIQT
|
|
16
|
+
|
|
17
|
+
# Optional: Model ID (default: eleven_v3)
|
|
18
|
+
# Options: eleven_v3, eleven_turbo_v2_5, eleven_turbo_v2, eleven_multilingual_v2, eleven_flash_v2_5, eleven_flash_v2
|
|
19
|
+
# ELEVENLABS_MODEL_ID=eleven_v3
|
|
20
|
+
|
|
21
|
+
# ============================================
|
|
22
|
+
# OpenAI TTS
|
|
23
|
+
# ============================================
|
|
24
|
+
# Get your key at: https://platform.openai.com/api-keys
|
|
25
|
+
# OPENAI_API_KEY=sk-...
|
|
26
|
+
|
|
27
|
+
# Optional: Voice (default: alloy)
|
|
28
|
+
# Options: alloy, echo, fable, onyx, nova, shimmer
|
|
29
|
+
# OPENAI_VOICE=alloy
|
|
30
|
+
|
|
31
|
+
# Optional: Model (default: tts-1)
|
|
32
|
+
# Options: tts-1 (faster), tts-1-hd (higher quality)
|
|
33
|
+
# OPENAI_MODEL=tts-1
|
|
34
|
+
|
|
35
|
+
# ============================================
|
|
36
|
+
# Google Cloud TTS (Chirp)
|
|
37
|
+
# ============================================
|
|
38
|
+
# Setup:
|
|
39
|
+
# 1. Go to: https://console.cloud.google.com/iam-admin/serviceaccounts
|
|
40
|
+
# 2. Create a service account with "Cloud Text-to-Speech API User" role
|
|
41
|
+
# 3. Create a JSON key and download it to your project root
|
|
42
|
+
# 4. Set the path below (file is auto-ignored by .gitignore)
|
|
43
|
+
# GOOGLE_APPLICATION_CREDENTIALS=google-service-account.json
|
|
44
|
+
|
|
45
|
+
# Optional: Voice (default: en-US-Neural2-J)
|
|
46
|
+
# Voice types: Neural2, Chirp3-HD, Wavenet, Standard
|
|
47
|
+
#
|
|
48
|
+
# Examples:
|
|
49
|
+
# en-US-Neural2-J - Male, natural (default)
|
|
50
|
+
# en-US-Neural2-F - Female, natural
|
|
51
|
+
# en-US-Chirp3-HD-Leda - Female, professional
|
|
52
|
+
# en-US-Chirp3-HD-Orion - Male, authoritative
|
|
53
|
+
#
|
|
54
|
+
# GOOGLE_VOICE=en-US-Neural2-J
|
|
55
|
+
|
|
56
|
+
# Optional: Language code (default: en-US)
|
|
57
|
+
# GOOGLE_LANGUAGE=en-US
|
|
58
|
+
|
|
59
|
+
# ============================================
|
|
60
|
+
# Azure Cognitive Services TTS
|
|
61
|
+
# ============================================
|
|
62
|
+
# Get credentials at: https://portal.azure.com/ (Create a Speech resource)
|
|
63
|
+
# AZURE_SPEECH_KEY=
|
|
64
|
+
# AZURE_SPEECH_REGION=eastus
|
|
65
|
+
|
|
66
|
+
# Optional: Voice (default: en-US-JennyNeural)
|
|
67
|
+
# AZURE_VOICE=en-US-JennyNeural
|
|
68
|
+
|
|
69
|
+
# ============================================
|
|
70
|
+
# Deepgram TTS (Aura)
|
|
71
|
+
# ============================================
|
|
72
|
+
# Get your key at: https://console.deepgram.com/
|
|
73
|
+
# DEEPGRAM_API_KEY=
|
|
74
|
+
|
|
75
|
+
# Optional: Voice (default: aura-2-hermes-en)
|
|
76
|
+
# Aura 2 voices:
|
|
77
|
+
# aura-2-asteria-en - Female, American - warm and conversational
|
|
78
|
+
# aura-2-luna-en - Female, American - soft and calm
|
|
79
|
+
# aura-2-athena-en - Female, British - refined
|
|
80
|
+
# aura-2-hermes-en - Male, American - conversational (default)
|
|
81
|
+
# aura-2-orion-en - Male, American - deep and steady
|
|
82
|
+
# aura-2-perseus-en - Male, American - warm and friendly
|
|
83
|
+
# aura-2-helios-en - Male, British - refined
|
|
84
|
+
#
|
|
85
|
+
# DEEPGRAM_VOICE=aura-2-hermes-en
|
|
86
|
+
|
|
87
|
+
# ============================================
|
|
88
|
+
# Network Settings
|
|
89
|
+
# ============================================
|
|
90
|
+
# Optional: Disable SSL certificate verification (for corporate proxies with SSL inspection)
|
|
91
|
+
# WARNING: Only use this if you trust your network. Set to "true" to disable.
|
|
92
|
+
# NODE_TLS_REJECT_UNAUTHORIZED=0
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Sample Document
|
|
2
|
+
|
|
3
|
+
This demonstrates **markdown rendering** in the lightbox component.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Features](#features)
|
|
8
|
+
- [Quick Reference](#quick-reference)
|
|
9
|
+
- [Code Examples](#code-examples)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- Bold and *italic* text
|
|
16
|
+
- Bullet lists
|
|
17
|
+
- Code blocks
|
|
18
|
+
- Tables with borders
|
|
19
|
+
|
|
20
|
+
## Quick Reference
|
|
21
|
+
|
|
22
|
+
| Feature | Supported |
|
|
23
|
+
|---------|-----------|
|
|
24
|
+
| Headers | ✅ |
|
|
25
|
+
| Lists | ✅ |
|
|
26
|
+
| Tables | ✅ |
|
|
27
|
+
| Code | ✅ |
|
|
28
|
+
| Links | ✅ |
|
|
29
|
+
| Blockquotes | ✅ |
|
|
30
|
+
|
|
31
|
+
## Code Examples
|
|
32
|
+
|
|
33
|
+
```javascript
|
|
34
|
+
// Syntax highlighting works too!
|
|
35
|
+
const greeting = "Hello, CourseCode!";
|
|
36
|
+
console.log(greeting);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
> **Tip:** You can click anywhere outside the lightbox to close it, or press the Escape key.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Reference Table
|
|
2
|
+
|
|
3
|
+
A sample table demonstrating markdown table rendering.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Comparison Table](#comparison-table)
|
|
8
|
+
- [Pricing Example](#pricing-example)
|
|
9
|
+
- [Status Legend](#status-legend)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Comparison Table
|
|
14
|
+
|
|
15
|
+
| Component | Description | Status |
|
|
16
|
+
|-----------|-------------|--------|
|
|
17
|
+
| Accordion | Expandable content sections | Active |
|
|
18
|
+
| Tabs | Tabbed navigation panels | Active |
|
|
19
|
+
| Lightbox | Click-to-enlarge media viewer | Active |
|
|
20
|
+
| Carousel | Image slideshow | Active |
|
|
21
|
+
| Modal | Overlay dialogs | Active |
|
|
22
|
+
|
|
23
|
+
## Pricing Example
|
|
24
|
+
|
|
25
|
+
| Plan | Monthly | Annual | Features |
|
|
26
|
+
|------|---------|--------|----------|
|
|
27
|
+
| Basic | $9 | $99 | 5 courses |
|
|
28
|
+
| Pro | $29 | $299 | Unlimited |
|
|
29
|
+
| Enterprise | Custom | Custom | White-label |
|
|
30
|
+
|
|
31
|
+
## Status Legend
|
|
32
|
+
|
|
33
|
+
| Symbol | Meaning |
|
|
34
|
+
|--------|---------|
|
|
35
|
+
| ✅ | Fully supported |
|
|
36
|
+
| ⚠️ | Partial support |
|
|
37
|
+
| ❌ | Not available |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
*Tables render beautifully in the lightbox!*
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 400">
|
|
2
|
+
<!-- Background -->
|
|
3
|
+
<rect width="800" height="400" fill="#f8f9fa" />
|
|
4
|
+
|
|
5
|
+
<!-- Connections -->
|
|
6
|
+
<path d="M200 200 L400 200" stroke="#adb5bd" stroke-width="4" />
|
|
7
|
+
<path d="M400 200 L600 200" stroke="#adb5bd" stroke-width="4" />
|
|
8
|
+
|
|
9
|
+
<!-- Slides (Left) -->
|
|
10
|
+
<g id="slides">
|
|
11
|
+
<rect x="50" y="100" width="150" height="200" rx="10" fill="#e2e8f0" stroke="#475569" stroke-width="4" />
|
|
12
|
+
<text x="125" y="180" font-family="Arial" font-size="16" text-anchor="middle" fill="#475569">SLIDES</text>
|
|
13
|
+
<text x="125" y="200" font-family="Arial" font-size="16" text-anchor="middle" fill="#475569">& CONTENT</text>
|
|
14
|
+
<path d="M100 230 L150 230" stroke="#f7b801" stroke-width="4" />
|
|
15
|
+
<circle cx="125" cy="140" r="15" fill="#f7b801" />
|
|
16
|
+
</g>
|
|
17
|
+
|
|
18
|
+
<!-- Framework (Center) -->
|
|
19
|
+
<g id="framework">
|
|
20
|
+
<rect x="325" y="125" width="150" height="150" rx="10" fill="#e2e8f0" stroke="#475569" stroke-width="4" />
|
|
21
|
+
<text x="400" y="190" font-family="Arial" font-size="16" text-anchor="middle" fill="#475569">COURSECODE</text>
|
|
22
|
+
<text x="400" y="210" font-family="Arial" font-size="16" text-anchor="middle" fill="#475569">FRAMEWORK</text>
|
|
23
|
+
<rect x="350" y="230" width="100" height="20" fill="#14213d" />
|
|
24
|
+
<circle cx="400" cy="150" r="10" fill="#14213d" />
|
|
25
|
+
</g>
|
|
26
|
+
|
|
27
|
+
<!-- LMS Package (Right) -->
|
|
28
|
+
<g id="lms-package">
|
|
29
|
+
<rect x="600" y="100" width="150" height="200" rx="10" fill="#e2e8f0" stroke="#475569" stroke-width="4" />
|
|
30
|
+
<text x="675" y="180" font-family="Arial" font-size="16" text-anchor="middle" fill="#475569">LMS</text>
|
|
31
|
+
<text x="675" y="200" font-family="Arial" font-size="16" text-anchor="middle" fill="#475569">PACKAGE</text>
|
|
32
|
+
<circle cx="640" cy="240" r="8" fill="#22c55e" />
|
|
33
|
+
<circle cx="675" cy="240" r="8" fill="#22c55e" />
|
|
34
|
+
<circle cx="710" cy="240" r="8" fill="#22c55e" />
|
|
35
|
+
</g>
|
|
36
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 18 100 64" width="64" height="41" fill="none" stroke="currentColor" stroke-width="5" stroke-linecap="round" stroke-linejoin="round">
|
|
2
|
+
<!-- Left angle bracket < -->
|
|
3
|
+
<polyline points="25,22 5,50 25,78" />
|
|
4
|
+
|
|
5
|
+
<!-- Right angle bracket > -->
|
|
6
|
+
<polyline points="75,22 95,50 75,78" />
|
|
7
|
+
|
|
8
|
+
<!-- Lightbulb: rounded top -->
|
|
9
|
+
<path d="M50,28 C40,28 33,36 33,45 C33,52 38,56 42,60 L42,65 L58,65 L58,60 C62,56 67,52 67,45 C67,36 60,28 50,28" stroke-width="4" />
|
|
10
|
+
|
|
11
|
+
<!-- Lightbulb: base lines -->
|
|
12
|
+
<line x1="44" y1="70" x2="56" y2="70" stroke-width="4" />
|
|
13
|
+
<line x1="46" y1="75" x2="54" y2="75" stroke-width="4" />
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Counter Widget Demo</title>
|
|
7
|
+
<style>
|
|
8
|
+
* {
|
|
9
|
+
margin: 0;
|
|
10
|
+
padding: 0;
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
body {
|
|
15
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
16
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
17
|
+
min-height: 100vh;
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
justify-content: center;
|
|
21
|
+
padding: 20px;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.widget {
|
|
25
|
+
background: white;
|
|
26
|
+
border-radius: 16px;
|
|
27
|
+
padding: 32px;
|
|
28
|
+
text-align: center;
|
|
29
|
+
box-shadow: 0 10px 40px rgba(0,0,0,0.2);
|
|
30
|
+
max-width: 300px;
|
|
31
|
+
width: 100%;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
h1 {
|
|
35
|
+
font-size: 1.25rem;
|
|
36
|
+
color: #333;
|
|
37
|
+
margin-bottom: 16px;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.counter-display {
|
|
41
|
+
font-size: 4rem;
|
|
42
|
+
font-weight: bold;
|
|
43
|
+
color: #667eea;
|
|
44
|
+
margin: 24px 0;
|
|
45
|
+
font-variant-numeric: tabular-nums;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.controls {
|
|
49
|
+
display: flex;
|
|
50
|
+
gap: 12px;
|
|
51
|
+
justify-content: center;
|
|
52
|
+
margin-bottom: 24px;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
button {
|
|
56
|
+
width: 48px;
|
|
57
|
+
height: 48px;
|
|
58
|
+
border: none;
|
|
59
|
+
border-radius: 50%;
|
|
60
|
+
font-size: 1.5rem;
|
|
61
|
+
cursor: pointer;
|
|
62
|
+
transition: transform 0.1s, box-shadow 0.1s;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
button:active {
|
|
66
|
+
transform: scale(0.95);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.btn-decrement {
|
|
70
|
+
background: #ff6b6b;
|
|
71
|
+
color: white;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.btn-increment {
|
|
75
|
+
background: #51cf66;
|
|
76
|
+
color: white;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.btn-complete {
|
|
80
|
+
background: #667eea;
|
|
81
|
+
color: white;
|
|
82
|
+
width: 100%;
|
|
83
|
+
height: auto;
|
|
84
|
+
padding: 12px 24px;
|
|
85
|
+
border-radius: 8px;
|
|
86
|
+
font-size: 1rem;
|
|
87
|
+
font-weight: 500;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.btn-complete:disabled {
|
|
91
|
+
background: #ccc;
|
|
92
|
+
cursor: not-allowed;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.status {
|
|
96
|
+
margin-top: 16px;
|
|
97
|
+
padding: 8px 16px;
|
|
98
|
+
border-radius: 8px;
|
|
99
|
+
font-size: 0.875rem;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.status.success {
|
|
103
|
+
background: #d3f9d8;
|
|
104
|
+
color: #2b8a3e;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.status.info {
|
|
108
|
+
background: #e7f5ff;
|
|
109
|
+
color: #1971c2;
|
|
110
|
+
}
|
|
111
|
+
</style>
|
|
112
|
+
</head>
|
|
113
|
+
<body>
|
|
114
|
+
<div class="widget">
|
|
115
|
+
<h1>Interactive Counter Widget</h1>
|
|
116
|
+
<div class="counter-display" id="counter">0</div>
|
|
117
|
+
<div class="controls">
|
|
118
|
+
<button class="btn-decrement" onclick="decrement()">−</button>
|
|
119
|
+
<button class="btn-increment" onclick="increment()">+</button>
|
|
120
|
+
</div>
|
|
121
|
+
<button class="btn-complete" id="complete-btn" onclick="markComplete()">
|
|
122
|
+
Mark Complete (requires 5+)
|
|
123
|
+
</button>
|
|
124
|
+
<div class="status info" id="status">
|
|
125
|
+
Reach 5 to unlock completion
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<script>
|
|
130
|
+
let count = 0;
|
|
131
|
+
let isComplete = false;
|
|
132
|
+
|
|
133
|
+
function updateDisplay() {
|
|
134
|
+
document.getElementById('counter').textContent = count;
|
|
135
|
+
const btn = document.getElementById('complete-btn');
|
|
136
|
+
const status = document.getElementById('status');
|
|
137
|
+
|
|
138
|
+
if (isComplete) {
|
|
139
|
+
btn.disabled = true;
|
|
140
|
+
btn.textContent = '✓ Completed';
|
|
141
|
+
status.className = 'status success';
|
|
142
|
+
status.textContent = 'Widget interaction complete!';
|
|
143
|
+
} else if (count >= 5) {
|
|
144
|
+
btn.disabled = false;
|
|
145
|
+
status.className = 'status info';
|
|
146
|
+
status.textContent = 'Ready to complete!';
|
|
147
|
+
} else {
|
|
148
|
+
btn.disabled = true;
|
|
149
|
+
status.className = 'status info';
|
|
150
|
+
status.textContent = `Reach 5 to unlock (${5 - count} more)`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function increment() {
|
|
155
|
+
count++;
|
|
156
|
+
updateDisplay();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function decrement() {
|
|
160
|
+
if (count > 0) {
|
|
161
|
+
count--;
|
|
162
|
+
updateDisplay();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function markComplete() {
|
|
167
|
+
if (count >= 5 && !isComplete) {
|
|
168
|
+
isComplete = true;
|
|
169
|
+
updateDisplay();
|
|
170
|
+
|
|
171
|
+
// Communicate completion to CourseCode framework
|
|
172
|
+
parent.postMessage({
|
|
173
|
+
type: 'coursecode:flag',
|
|
174
|
+
key: 'counter-widget-complete',
|
|
175
|
+
value: true
|
|
176
|
+
}, '*');
|
|
177
|
+
|
|
178
|
+
parent.postMessage({
|
|
179
|
+
type: 'coursecode:log',
|
|
180
|
+
level: 'info',
|
|
181
|
+
message: 'Counter widget completed with value: ' + count
|
|
182
|
+
}, '*');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Signal ready state to parent
|
|
187
|
+
parent.postMessage({ type: 'coursecode:ready' }, '*');
|
|
188
|
+
</script>
|
|
189
|
+
</body>
|
|
190
|
+
</html>
|