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,834 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
ACCESSIBILITY - WCAG 2.1 AA compliant accessibility features
|
|
3
|
+
============================================================================
|
|
4
|
+
|
|
5
|
+
PURPOSE: Enhanced accessibility features for all users
|
|
6
|
+
|
|
7
|
+
INCLUDES:
|
|
8
|
+
- Enhanced focus states
|
|
9
|
+
- Skip links
|
|
10
|
+
- Screen reader only content
|
|
11
|
+
- High contrast mode support
|
|
12
|
+
- Reduced motion support
|
|
13
|
+
- Print styles
|
|
14
|
+
- Keyboard navigation enhancements
|
|
15
|
+
|
|
16
|
+
DEPENDENCIES:
|
|
17
|
+
- Requires: design-tokens.css (for CSS variables)
|
|
18
|
+
|
|
19
|
+
USED BY: All components - accessibility throughout the course
|
|
20
|
+
|
|
21
|
+
AI DEBUGGING TIPS:
|
|
22
|
+
- Focus ring not visible? Check if :focus-visible is supported
|
|
23
|
+
- Skip link not appearing? Verify :focus state on .skip-link
|
|
24
|
+
- Screen reader text showing? Check .sr-only styles are applied
|
|
25
|
+
- High contrast not working? Test with @media (prefers-contrast: high)
|
|
26
|
+
- Animations still running? Check @media (prefers-reduced-motion)
|
|
27
|
+
|
|
28
|
+
STRUCTURE:
|
|
29
|
+
1. Enhanced focus states (45-80)
|
|
30
|
+
2. Skip link (85-100)
|
|
31
|
+
3. Screen reader only content (105-120)
|
|
32
|
+
4. High contrast mode (125-140)
|
|
33
|
+
5. Reduced motion (145-170)
|
|
34
|
+
6. Print styles (175-210)
|
|
35
|
+
7. Micro-interactions (215-270)
|
|
36
|
+
8. Tooltips and notifications (275-350)
|
|
37
|
+
|
|
38
|
+
COMMON CLASSES:
|
|
39
|
+
.skip-link - Skip to main content link
|
|
40
|
+
.sr-only - Screen reader only text
|
|
41
|
+
:focus-visible - Enhanced keyboard focus
|
|
42
|
+
.btn-loading - Loading state animation
|
|
43
|
+
.tooltip - Accessible tooltip
|
|
44
|
+
.notification - Notification message
|
|
45
|
+
|
|
46
|
+
LAST UPDATED: 2024-11-17
|
|
47
|
+
============================================================================ */
|
|
48
|
+
|
|
49
|
+
/* ============================================================================
|
|
50
|
+
ENHANCED FOCUS STATES - WCAG 2.1 AA Compliant
|
|
51
|
+
============================================================================ */
|
|
52
|
+
|
|
53
|
+
button:focus-visible,
|
|
54
|
+
.btn:focus-visible,
|
|
55
|
+
input:focus-visible,
|
|
56
|
+
textarea:focus-visible,
|
|
57
|
+
select:focus-visible {
|
|
58
|
+
outline: 3px solid var(--color-primary);
|
|
59
|
+
outline-offset: 2px;
|
|
60
|
+
border-radius: var(--radius-md);
|
|
61
|
+
box-shadow: 0 0 0 1px var(--color-white), 0 0 0 4px var(--color-primary-alpha-20);
|
|
62
|
+
transition: transform var(--transition-fast);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
a:focus-visible {
|
|
66
|
+
outline: 3px solid var(--color-primary);
|
|
67
|
+
outline-offset: 2px;
|
|
68
|
+
border-radius: var(--radius-sm);
|
|
69
|
+
text-decoration: underline;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* ============================================================================
|
|
73
|
+
SKIP LINK ENHANCEMENT
|
|
74
|
+
============================================================================ */
|
|
75
|
+
|
|
76
|
+
.skip-link {
|
|
77
|
+
position: absolute;
|
|
78
|
+
top: -40px;
|
|
79
|
+
left: 6px;
|
|
80
|
+
background: var(--color-primary);
|
|
81
|
+
color: var(--color-white);
|
|
82
|
+
padding: var(--space-2) var(--space-4);
|
|
83
|
+
border-radius: var(--radius-md);
|
|
84
|
+
text-decoration: none;
|
|
85
|
+
font-weight: var(--font-weight-semibold);
|
|
86
|
+
z-index: var(--z-tooltip);
|
|
87
|
+
transition: top var(--transition-normal);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.skip-link:focus {
|
|
91
|
+
top: 6px;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* ============================================================================
|
|
95
|
+
SCREEN READER ONLY CONTENT
|
|
96
|
+
============================================================================ */
|
|
97
|
+
|
|
98
|
+
.sr-only {
|
|
99
|
+
position: absolute;
|
|
100
|
+
width: 1px;
|
|
101
|
+
height: 1px;
|
|
102
|
+
padding: 0;
|
|
103
|
+
margin: -1px;
|
|
104
|
+
overflow: hidden;
|
|
105
|
+
clip: rect(0, 0, 0, 0);
|
|
106
|
+
clip-path: inset(50%);
|
|
107
|
+
white-space: nowrap;
|
|
108
|
+
border: 0;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* ============================================================================
|
|
112
|
+
HIGH CONTRAST MODE SUPPORT
|
|
113
|
+
============================================================================
|
|
114
|
+
|
|
115
|
+
PURPOSE: Accessibility feature for users with low vision or color blindness
|
|
116
|
+
|
|
117
|
+
MECHANISM: Uses CSS custom property tokens to enhance contrast throughout
|
|
118
|
+
the framework without needing component-specific selectors.
|
|
119
|
+
|
|
120
|
+
TRIGGERED BY:
|
|
121
|
+
- User toggle in accessibility menu: [data-high-contrast="true"]
|
|
122
|
+
- System OS preference: @media (prefers-contrast: high)
|
|
123
|
+
|
|
124
|
+
INCLUDES:
|
|
125
|
+
- Darker text colors (#000 instead of #111827)
|
|
126
|
+
- Enhanced borders (2px+ width with stronger colors)
|
|
127
|
+
- Stronger outlines on focus states
|
|
128
|
+
- Bold font weights for better distinction
|
|
129
|
+
- Increased opacity on semi-transparent elements
|
|
130
|
+
- Enhanced shadows for better element separation
|
|
131
|
+
|
|
132
|
+
WCAG COMPLIANCE: WCAG 2.1 AAA - Enhanced contrast for accessibility
|
|
133
|
+
|
|
134
|
+
========================================================================= */
|
|
135
|
+
|
|
136
|
+
/* System OS preference for high contrast */
|
|
137
|
+
@media (prefers-contrast: high) {
|
|
138
|
+
:root {
|
|
139
|
+
--text-body: #000;
|
|
140
|
+
--text-muted: #333;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
button:focus-visible {
|
|
144
|
+
outline: 3px solid #000;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* User-selected high contrast mode - applies via data attribute */
|
|
149
|
+
[data-high-contrast="true"] {
|
|
150
|
+
/* Text: Use pure black for primary text instead of dark gray */
|
|
151
|
+
--text-body: #000;
|
|
152
|
+
--text-primary: #000;
|
|
153
|
+
--text-secondary: #000;
|
|
154
|
+
--text-muted: #333;
|
|
155
|
+
|
|
156
|
+
/* Focus & interactive states: Thicker, darker outlines */
|
|
157
|
+
--focus-ring-width: 4px;
|
|
158
|
+
--focus-ring-color: #000;
|
|
159
|
+
|
|
160
|
+
/* Borders & dividers: Stronger, darker borders */
|
|
161
|
+
--border-default: #000;
|
|
162
|
+
--border-subtle: #333;
|
|
163
|
+
--border-strong: #000;
|
|
164
|
+
|
|
165
|
+
/* Semantic colors: Ensure WCAG AAA contrast ratios */
|
|
166
|
+
--color-success: #004620;
|
|
167
|
+
/* Darker green for high contrast */
|
|
168
|
+
--color-danger: #7a0a0a;
|
|
169
|
+
/* Darker red for high contrast */
|
|
170
|
+
--color-warning: #b85a00;
|
|
171
|
+
/* Darker orange for high contrast */
|
|
172
|
+
--color-info: #0d2a66;
|
|
173
|
+
/* Darker blue for high contrast */
|
|
174
|
+
--color-partial: #8b5000;
|
|
175
|
+
/* Darker amber for high contrast */
|
|
176
|
+
|
|
177
|
+
/* Button & input states: Darker disabled states */
|
|
178
|
+
--color-disabled-text: #666;
|
|
179
|
+
--color-disabled-border: #333;
|
|
180
|
+
|
|
181
|
+
/* Shadows: More pronounced for depth separation */
|
|
182
|
+
--shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.5);
|
|
183
|
+
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -1px rgba(0, 0, 0, 0.5);
|
|
184
|
+
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.7), 0 4px 6px -2px rgba(0, 0, 0, 0.6);
|
|
185
|
+
|
|
186
|
+
/* Alpha transparency: Reduce transparency for clarity (halfway between normal and solid) */
|
|
187
|
+
--bg-overlay: rgba(0, 0, 0, 0.65);
|
|
188
|
+
--color-primary-alpha-10: rgba(36, 2, 80, 0.15);
|
|
189
|
+
--color-primary-alpha-20: rgba(36, 2, 80, 0.25);
|
|
190
|
+
--color-secondary-alpha-10: rgba(88, 28, 135, 0.15);
|
|
191
|
+
--color-secondary-alpha-20: rgba(88, 28, 135, 0.25);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* Component-level enhancements for high contrast mode */
|
|
195
|
+
[data-high-contrast="true"] {
|
|
196
|
+
|
|
197
|
+
/* Enhanced focus states: Thicker outlines and stronger rings */
|
|
198
|
+
button:focus-visible,
|
|
199
|
+
.btn:focus-visible,
|
|
200
|
+
input:focus-visible,
|
|
201
|
+
textarea:focus-visible,
|
|
202
|
+
select:focus-visible {
|
|
203
|
+
outline: 4px solid #000;
|
|
204
|
+
outline-offset: 3px;
|
|
205
|
+
box-shadow: 0 0 0 2px #fff, 0 0 0 6px #000;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
a:focus-visible {
|
|
209
|
+
outline: 4px solid #000;
|
|
210
|
+
outline-offset: 2px;
|
|
211
|
+
text-decoration: underline;
|
|
212
|
+
text-decoration-thickness: 2px;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* Button enhancements: Thicker borders and bold text */
|
|
216
|
+
button,
|
|
217
|
+
.btn {
|
|
218
|
+
border: 2px solid #000;
|
|
219
|
+
font-weight: var(--font-weight-semibold);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* Button variant enhancements: Ensure black borders on all button types */
|
|
223
|
+
.btn-primary,
|
|
224
|
+
.btn-secondary,
|
|
225
|
+
.btn-success,
|
|
226
|
+
.btn-warning,
|
|
227
|
+
.btn-danger,
|
|
228
|
+
.btn-info,
|
|
229
|
+
.btn-outline-primary,
|
|
230
|
+
.btn-outline-secondary {
|
|
231
|
+
border: 2px solid #000;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* Disabled button enhancements: Black text and outlines */
|
|
235
|
+
button:disabled,
|
|
236
|
+
.btn:disabled {
|
|
237
|
+
color: #000;
|
|
238
|
+
border-color: #000;
|
|
239
|
+
background: #e6e6e6;
|
|
240
|
+
opacity: 1;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* Input field enhancements: Darker borders */
|
|
244
|
+
input,
|
|
245
|
+
textarea,
|
|
246
|
+
select {
|
|
247
|
+
border-width: 2px;
|
|
248
|
+
border-color: #000;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
input:focus,
|
|
252
|
+
textarea:focus,
|
|
253
|
+
select:focus {
|
|
254
|
+
border-color: #000;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* Card & component borders: Stronger borders */
|
|
258
|
+
.card,
|
|
259
|
+
.callout,
|
|
260
|
+
.modal-content {
|
|
261
|
+
border-width: 2px;
|
|
262
|
+
border-color: #000;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.card:hover,
|
|
266
|
+
.callout:hover {
|
|
267
|
+
border-color: #000;
|
|
268
|
+
border-width: 2px;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* Input disabled state enhancements */
|
|
272
|
+
input:disabled,
|
|
273
|
+
select:disabled {
|
|
274
|
+
opacity: 0.6;
|
|
275
|
+
border-color: #666;
|
|
276
|
+
background: #e6e6e6;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* Link enhancements: Underlines and bold for clarity */
|
|
280
|
+
a {
|
|
281
|
+
text-decoration: underline;
|
|
282
|
+
font-weight: var(--font-weight-semibold);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/* Sidebar links exception: No underlines for navigation links */
|
|
286
|
+
.sidebar a,
|
|
287
|
+
.nav a {
|
|
288
|
+
text-decoration: none;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/* Notification enhancements: Stronger borders and text */
|
|
292
|
+
.notification {
|
|
293
|
+
border-left-width: 6px;
|
|
294
|
+
border-width: 2px;
|
|
295
|
+
background: #fff;
|
|
296
|
+
color: #000;
|
|
297
|
+
font-weight: var(--font-weight-medium);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/* Tab & accordion enhancements: Stronger appearance */
|
|
301
|
+
.tab-button,
|
|
302
|
+
.accordion-header {
|
|
303
|
+
border-width: 2px;
|
|
304
|
+
font-weight: var(--font-weight-semibold);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.tab-button.active,
|
|
308
|
+
.accordion-header.active {
|
|
309
|
+
border-color: #000;
|
|
310
|
+
background: #f0f0f0;
|
|
311
|
+
color: #000;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/* ============================================================================
|
|
316
|
+
LARGE FONT MODE SUPPORT
|
|
317
|
+
============================================================================
|
|
318
|
+
|
|
319
|
+
PURPOSE: Accessibility feature for users with low vision
|
|
320
|
+
|
|
321
|
+
MECHANISM: Uses CSS custom property tokens to scale typography and spacing
|
|
322
|
+
without needing media queries or complex selectors. All components
|
|
323
|
+
automatically adapt because they use the design tokens.
|
|
324
|
+
|
|
325
|
+
TOKEN MULTIPLIERS (defined in design-tokens.css):
|
|
326
|
+
- --font-scale-multiplier: Main scale for general fonts
|
|
327
|
+
- --font-scale-body: Body text specific scaling
|
|
328
|
+
- --font-scale-heading: Heading specific scaling
|
|
329
|
+
- --spacing-scale-multiplier: Spacing adjustment
|
|
330
|
+
- --touch-target-scale-multiplier: Touch target scaling
|
|
331
|
+
|
|
332
|
+
When [data-font-size="large"], these tokens are activated to their
|
|
333
|
+
configured values, causing all dependent properties to scale automatically.
|
|
334
|
+
|
|
335
|
+
WCAG COMPLIANCE: WCAG 2.1 AA - Ensures minimum 14px body text in large mode
|
|
336
|
+
|
|
337
|
+
========================================================================= */
|
|
338
|
+
|
|
339
|
+
[data-font-size="large"] {
|
|
340
|
+
/* Typography: Scale body text and labels using base tokens × multipliers */
|
|
341
|
+
--font-size-xs: calc(var(--font-size-xs-base) * var(--font-scale-multiplier));
|
|
342
|
+
--font-size-sm: calc(var(--font-size-sm-base) * var(--font-scale-multiplier));
|
|
343
|
+
--font-size-base: calc(var(--font-size-base-base) * var(--font-scale-body));
|
|
344
|
+
--font-size-lg: calc(var(--font-size-lg-base) * var(--font-scale-body));
|
|
345
|
+
--font-size-xl: calc(var(--font-size-xl-base) * var(--font-scale-heading));
|
|
346
|
+
--font-size-2xl: calc(var(--font-size-2xl-base) * var(--font-scale-heading));
|
|
347
|
+
--font-size-3xl: calc(var(--font-size-3xl-base) * var(--font-scale-heading));
|
|
348
|
+
--font-size-4xl: calc(var(--font-size-4xl-base) * var(--font-scale-heading));
|
|
349
|
+
--font-size-5xl: calc(var(--font-size-5xl-base) * var(--font-scale-heading));
|
|
350
|
+
|
|
351
|
+
/* Touch targets & interactive elements: Scale using token */
|
|
352
|
+
--btn-min-height: calc(44px * var(--touch-target-scale-multiplier));
|
|
353
|
+
--size-touch-target: calc(44px * var(--touch-target-scale-multiplier));
|
|
354
|
+
--size-icon-button: calc(48px * var(--touch-target-scale-multiplier));
|
|
355
|
+
|
|
356
|
+
/* Input fields: Scale using token */
|
|
357
|
+
--input-min-height: calc(44px * var(--touch-target-scale-multiplier));
|
|
358
|
+
--input-padding-y: calc(var(--space-3-base) * var(--spacing-scale-multiplier));
|
|
359
|
+
--input-padding-x: calc(var(--space-4-base) * var(--spacing-scale-multiplier));
|
|
360
|
+
|
|
361
|
+
/* Feedback system: Scale using token */
|
|
362
|
+
--feedback-padding: calc(var(--space-3-base) * var(--spacing-scale-multiplier));
|
|
363
|
+
--feedback-font-size: calc(var(--font-size-sm-base) * var(--spacing-scale-multiplier));
|
|
364
|
+
|
|
365
|
+
/* Spacing: Increase using token for visual separation */
|
|
366
|
+
--space-1: calc(var(--space-1-base) * var(--spacing-scale-multiplier));
|
|
367
|
+
--space-2: calc(var(--space-2-base) * var(--spacing-scale-multiplier));
|
|
368
|
+
--space-3: calc(var(--space-3-base) * var(--spacing-scale-multiplier));
|
|
369
|
+
--space-4: calc(var(--space-4-base) * var(--spacing-scale-multiplier));
|
|
370
|
+
--space-5: calc(var(--space-5-base) * var(--spacing-scale-multiplier));
|
|
371
|
+
--space-6: calc(var(--space-6-base) * var(--spacing-scale-multiplier));
|
|
372
|
+
--space-8: calc(var(--space-8-base) * var(--spacing-scale-multiplier));
|
|
373
|
+
--space-10: calc(var(--space-10-base) * var(--spacing-scale-multiplier));
|
|
374
|
+
--space-12: calc(var(--space-12-base) * var(--spacing-scale-multiplier));
|
|
375
|
+
|
|
376
|
+
/* Button system: Increase padding using token */
|
|
377
|
+
--btn-padding-y: calc(var(--space-3-base) * var(--spacing-scale-multiplier));
|
|
378
|
+
--btn-padding-x: calc(var(--space-5-base) * var(--spacing-scale-multiplier));
|
|
379
|
+
|
|
380
|
+
/* Form elements: Scale padding using token */
|
|
381
|
+
--content-padding: calc(var(--space-10-base) * var(--spacing-scale-multiplier));
|
|
382
|
+
--section-padding: calc(var(--space-8-base) * var(--spacing-scale-multiplier));
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/* ============================================================================
|
|
386
|
+
REDUCED MOTION SUPPORT
|
|
387
|
+
============================================================================
|
|
388
|
+
|
|
389
|
+
PURPOSE: Accessibility feature for users sensitive to animations
|
|
390
|
+
|
|
391
|
+
MECHANISM: Disables all animations and transitions via two methods:
|
|
392
|
+
1. OS-level: @media (prefers-reduced-motion: reduce) - respects system setting
|
|
393
|
+
2. User toggle: [data-reduced-motion="true"] - user can override system preference
|
|
394
|
+
|
|
395
|
+
TRIGGERED BY:
|
|
396
|
+
- System OS preference: @media (prefers-reduced-motion: reduce)
|
|
397
|
+
- User toggle in accessibility menu: [data-reduced-motion="true"]
|
|
398
|
+
|
|
399
|
+
INCLUDES:
|
|
400
|
+
- All CSS animations (spin, fadeIn, shimmer, etc.)
|
|
401
|
+
- All CSS transitions (hover, focus, state changes)
|
|
402
|
+
- All transform effects (scale, translate, rotate)
|
|
403
|
+
- Scroll behavior (smooth scroll → auto scroll)
|
|
404
|
+
|
|
405
|
+
WCAG COMPLIANCE: WCAG 2.1 AA - Respects user motion sensitivity
|
|
406
|
+
|
|
407
|
+
========================================================================= */
|
|
408
|
+
|
|
409
|
+
/* System OS preference for reduced motion */
|
|
410
|
+
@media (prefers-reduced-motion: reduce) {
|
|
411
|
+
* {
|
|
412
|
+
animation-duration: 0.01ms !important;
|
|
413
|
+
animation-iteration-count: 1 !important;
|
|
414
|
+
transition-duration: 0.01ms !important;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
html {
|
|
418
|
+
scroll-behavior: auto !important;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/* User-selected reduced motion mode - applies via data attribute */
|
|
423
|
+
[data-reduced-motion="true"] {
|
|
424
|
+
|
|
425
|
+
/* Disable all animations globally */
|
|
426
|
+
* {
|
|
427
|
+
animation: none !important;
|
|
428
|
+
animation-duration: 0.01ms !important;
|
|
429
|
+
animation-iteration-count: 1 !important;
|
|
430
|
+
transition: none !important;
|
|
431
|
+
transition-duration: 0.01ms !important;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
html {
|
|
435
|
+
scroll-behavior: auto !important;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/* Remove transform effects from interactive elements */
|
|
439
|
+
button:hover,
|
|
440
|
+
button:active,
|
|
441
|
+
.btn:hover,
|
|
442
|
+
.btn:active,
|
|
443
|
+
a:hover,
|
|
444
|
+
input:hover,
|
|
445
|
+
textarea:hover,
|
|
446
|
+
select:hover {
|
|
447
|
+
transform: none !important;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/* Disable component animations */
|
|
451
|
+
.notification,
|
|
452
|
+
.modal,
|
|
453
|
+
.modal-overlay,
|
|
454
|
+
.sidebar,
|
|
455
|
+
.sidebar-overlay,
|
|
456
|
+
.tooltip,
|
|
457
|
+
.tooltip::after,
|
|
458
|
+
.tooltip::before,
|
|
459
|
+
.tab-content,
|
|
460
|
+
.accordion-content,
|
|
461
|
+
.collapse-content,
|
|
462
|
+
.carousel-item,
|
|
463
|
+
.flip-card,
|
|
464
|
+
.dropdown-menu {
|
|
465
|
+
animation: none !important;
|
|
466
|
+
transition: none !important;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/* Disable interaction animations */
|
|
470
|
+
.matching-item,
|
|
471
|
+
.matching-target,
|
|
472
|
+
.drag-item,
|
|
473
|
+
.drop-zone,
|
|
474
|
+
.hotspot-area,
|
|
475
|
+
.fill-blank-input,
|
|
476
|
+
.checkbox-custom,
|
|
477
|
+
.radio-custom,
|
|
478
|
+
.toggle-switch,
|
|
479
|
+
.true-false-option {
|
|
480
|
+
animation: none !important;
|
|
481
|
+
transition: none !important;
|
|
482
|
+
transform: none !important;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.matching-item:hover,
|
|
486
|
+
.matching-target:hover,
|
|
487
|
+
.drag-item:hover,
|
|
488
|
+
.drag-item:active,
|
|
489
|
+
.hotspot-area:hover,
|
|
490
|
+
.true-false-option:hover {
|
|
491
|
+
transform: none !important;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/* Disable loading animations */
|
|
495
|
+
.btn-loading::after,
|
|
496
|
+
.spinner,
|
|
497
|
+
.progress-fill::after {
|
|
498
|
+
animation: none !important;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/* Disable feedback animations */
|
|
502
|
+
.btn-success-feedback,
|
|
503
|
+
.success-checkmark {
|
|
504
|
+
animation: none !important;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
/* Disable visibility transitions */
|
|
508
|
+
[data-hidden],
|
|
509
|
+
[data-show],
|
|
510
|
+
.hidden,
|
|
511
|
+
.visible {
|
|
512
|
+
transition: none !important;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/* Disable all keyframe animations - override any @keyframes definitions */
|
|
516
|
+
@keyframes spin {
|
|
517
|
+
from {
|
|
518
|
+
transform: rotate(0deg);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
to {
|
|
522
|
+
transform: rotate(360deg);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
@keyframes fadeIn {
|
|
527
|
+
from {
|
|
528
|
+
opacity: 1;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
to {
|
|
532
|
+
opacity: 1;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
@keyframes fadeOut {
|
|
537
|
+
from {
|
|
538
|
+
opacity: 1;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
to {
|
|
542
|
+
opacity: 1;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
@keyframes shimmer {
|
|
547
|
+
0% {
|
|
548
|
+
transform: none;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
100% {
|
|
552
|
+
transform: none;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
@keyframes successPulse {
|
|
557
|
+
|
|
558
|
+
0%,
|
|
559
|
+
100% {
|
|
560
|
+
transform: scale(1);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
50% {
|
|
564
|
+
transform: scale(1);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
@keyframes checkmarkPop {
|
|
569
|
+
|
|
570
|
+
0%,
|
|
571
|
+
100% {
|
|
572
|
+
transform: scale(1);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
@keyframes flash-incorrect {
|
|
577
|
+
|
|
578
|
+
0%,
|
|
579
|
+
100% {
|
|
580
|
+
transform: none;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
@keyframes notificationSlideIn {
|
|
585
|
+
from {
|
|
586
|
+
opacity: 1;
|
|
587
|
+
transform: none;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
to {
|
|
591
|
+
opacity: 1;
|
|
592
|
+
transform: none;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
@keyframes notificationSlideOut {
|
|
597
|
+
from {
|
|
598
|
+
opacity: 1;
|
|
599
|
+
transform: none;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
to {
|
|
603
|
+
opacity: 1;
|
|
604
|
+
transform: none;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/* ============================================================================
|
|
610
|
+
PRINT STYLES
|
|
611
|
+
============================================================================ */
|
|
612
|
+
|
|
613
|
+
@media print {
|
|
614
|
+
|
|
615
|
+
#accessibility-button,
|
|
616
|
+
#accessibility-menu,
|
|
617
|
+
.interaction-controls,
|
|
618
|
+
.final-actions,
|
|
619
|
+
.nav-controls {
|
|
620
|
+
display: none !important;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
.interaction {
|
|
624
|
+
page-break-inside: avoid;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
* {
|
|
628
|
+
animation: none !important;
|
|
629
|
+
transition: none !important;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
button {
|
|
633
|
+
border: 2px solid #000 !important;
|
|
634
|
+
background: #fff !important;
|
|
635
|
+
color: #000 !important;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
.notification {
|
|
639
|
+
border: 2px solid #000 !important;
|
|
640
|
+
background: #fff !important;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/* ============================================================================
|
|
645
|
+
MICRO-INTERACTIONS FOR BETTER UX
|
|
646
|
+
============================================================================ */
|
|
647
|
+
|
|
648
|
+
/* Loading States */
|
|
649
|
+
.btn-loading {
|
|
650
|
+
position: relative;
|
|
651
|
+
color: transparent;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
.btn-loading::after {
|
|
655
|
+
content: '';
|
|
656
|
+
position: absolute;
|
|
657
|
+
width: 16px;
|
|
658
|
+
height: 16px;
|
|
659
|
+
top: 50%;
|
|
660
|
+
left: 50%;
|
|
661
|
+
margin-left: -8px;
|
|
662
|
+
margin-top: -8px;
|
|
663
|
+
border: 2px solid transparent;
|
|
664
|
+
border-top: 2px solid currentColor;
|
|
665
|
+
border-radius: 50%;
|
|
666
|
+
animation: spin var(--transition-slow) linear infinite;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
@keyframes spin {
|
|
670
|
+
0% {
|
|
671
|
+
transform: rotate(0deg);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
100% {
|
|
675
|
+
transform: rotate(360deg);
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/* Success Feedback Animation */
|
|
680
|
+
@keyframes successPulse {
|
|
681
|
+
0% {
|
|
682
|
+
transform: scale(1);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
50% {
|
|
686
|
+
transform: scale(1.05);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
100% {
|
|
690
|
+
transform: scale(1);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
.btn-success-feedback {
|
|
695
|
+
animation: successPulse 0.6s ease-out;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/* Progress Bar Enhancement */
|
|
699
|
+
.progress-bar {
|
|
700
|
+
width: 100%;
|
|
701
|
+
height: 8px;
|
|
702
|
+
background: var(--bg-inset);
|
|
703
|
+
border-radius: var(--radius-sm);
|
|
704
|
+
overflow: hidden;
|
|
705
|
+
position: relative;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
.progress-fill {
|
|
709
|
+
height: 100%;
|
|
710
|
+
background: var(--gradient-progress);
|
|
711
|
+
border-radius: var(--radius-sm);
|
|
712
|
+
transition: width var(--transition-slow);
|
|
713
|
+
position: relative;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
.progress-fill::after {
|
|
717
|
+
content: '';
|
|
718
|
+
position: absolute;
|
|
719
|
+
top: 0;
|
|
720
|
+
left: 0;
|
|
721
|
+
right: 0;
|
|
722
|
+
bottom: 0;
|
|
723
|
+
background: var(--gradient-shimmer);
|
|
724
|
+
animation: shimmer 2s infinite;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
@keyframes shimmer {
|
|
728
|
+
0% {
|
|
729
|
+
transform: translateX(-100%);
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
100% {
|
|
733
|
+
transform: translateX(100%);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
/* ============================================================================
|
|
739
|
+
ENHANCED NOTIFICATION STYLES
|
|
740
|
+
============================================================================ */
|
|
741
|
+
|
|
742
|
+
.notification {
|
|
743
|
+
padding: var(--space-4);
|
|
744
|
+
border-radius: var(--radius-lg);
|
|
745
|
+
margin: var(--space-4) 0;
|
|
746
|
+
border-left: 4px solid;
|
|
747
|
+
position: relative;
|
|
748
|
+
overflow: hidden;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
.notification::before {
|
|
752
|
+
content: '';
|
|
753
|
+
position: absolute;
|
|
754
|
+
top: 0;
|
|
755
|
+
left: 0;
|
|
756
|
+
right: 0;
|
|
757
|
+
bottom: 0;
|
|
758
|
+
opacity: 0.05;
|
|
759
|
+
z-index: -1;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
.notification-info {
|
|
763
|
+
background: var(--color-info-light);
|
|
764
|
+
border-left-color: var(--color-info);
|
|
765
|
+
color: var(--color-gray-800);
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
.notification-info::before {
|
|
769
|
+
background: var(--color-info);
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
.notification-success {
|
|
773
|
+
background: var(--color-success-light);
|
|
774
|
+
border-left-color: var(--color-success);
|
|
775
|
+
color: var(--color-gray-800);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
.notification-success::before {
|
|
779
|
+
background: var(--color-success);
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
.notification-warning {
|
|
783
|
+
background: var(--color-warning-light);
|
|
784
|
+
border-left-color: var(--color-warning);
|
|
785
|
+
color: var(--color-gray-800);
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
.notification-warning::before {
|
|
789
|
+
background: var(--color-warning);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
.notification-danger {
|
|
793
|
+
background: var(--color-danger-light);
|
|
794
|
+
border-left-color: var(--color-danger);
|
|
795
|
+
color: var(--color-gray-800);
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
.notification-danger::before {
|
|
799
|
+
background: var(--color-danger);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/* ============================================================================
|
|
803
|
+
MODERN ACCESSIBILITY FEATURES
|
|
804
|
+
============================================================================ */
|
|
805
|
+
|
|
806
|
+
/* Missing alt text warning (development only) */
|
|
807
|
+
img[alt=""] {
|
|
808
|
+
outline: 2px dashed var(--color-warning);
|
|
809
|
+
position: relative;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
img[alt=""]::after {
|
|
813
|
+
content: '⚠️ Missing alt text';
|
|
814
|
+
position: absolute;
|
|
815
|
+
top: 5px;
|
|
816
|
+
right: 5px;
|
|
817
|
+
background: var(--color-warning);
|
|
818
|
+
color: var(--text-primary);
|
|
819
|
+
padding: var(--space-1) var(--space-2);
|
|
820
|
+
border-radius: var(--radius-sm);
|
|
821
|
+
font-size: var(--font-size-xs);
|
|
822
|
+
font-weight: var(--font-weight-semibold);
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/* Dark mode support - see design-tokens.css for comprehensive dark theme overrides */
|
|
826
|
+
|
|
827
|
+
/* Enhanced visual hierarchy with better spacing */
|
|
828
|
+
section>*:first-child {
|
|
829
|
+
margin-top: 0;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
section>*:last-child {
|
|
833
|
+
margin-bottom: 0;
|
|
834
|
+
}
|