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.
Files changed (362) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +322 -0
  3. package/THIRD_PARTY_NOTICES.md +22 -0
  4. package/bin/cli.js +331 -0
  5. package/framework/assets/logo-coursecode-black.svg +14 -0
  6. package/framework/assets/logo-coursecode-white.svg +14 -0
  7. package/framework/assets/logo-coursecode.svg +14 -0
  8. package/framework/css/01-base.css +160 -0
  9. package/framework/css/02-layout.css +499 -0
  10. package/framework/css/accessibility.css +834 -0
  11. package/framework/css/components/accordions.css +710 -0
  12. package/framework/css/components/assessments.css +520 -0
  13. package/framework/css/components/audio-player.css +570 -0
  14. package/framework/css/components/badges.css +80 -0
  15. package/framework/css/components/breadcrumbs.css +87 -0
  16. package/framework/css/components/buttons.css +707 -0
  17. package/framework/css/components/callouts.css +1280 -0
  18. package/framework/css/components/cards.css +475 -0
  19. package/framework/css/components/carousel.css +193 -0
  20. package/framework/css/components/checkbox-group.css +123 -0
  21. package/framework/css/components/checklist.css +203 -0
  22. package/framework/css/components/collapse.css +96 -0
  23. package/framework/css/components/comparison.css +33 -0
  24. package/framework/css/components/content-image.css +36 -0
  25. package/framework/css/components/document-gallery.css +425 -0
  26. package/framework/css/components/dropdown.css +115 -0
  27. package/framework/css/components/embed-frame.css +142 -0
  28. package/framework/css/components/engagement.css +412 -0
  29. package/framework/css/components/features.css +35 -0
  30. package/framework/css/components/flip-cards.css +253 -0
  31. package/framework/css/components/footer.css +353 -0
  32. package/framework/css/components/forms.css +294 -0
  33. package/framework/css/components/hero.css +216 -0
  34. package/framework/css/components/images.css +528 -0
  35. package/framework/css/components/interactive-timeline.css +274 -0
  36. package/framework/css/components/intro-cards.css +30 -0
  37. package/framework/css/components/lightbox.css +666 -0
  38. package/framework/css/components/loading.css +65 -0
  39. package/framework/css/components/modals.css +235 -0
  40. package/framework/css/components/notifications.css +107 -0
  41. package/framework/css/components/quote.css +150 -0
  42. package/framework/css/components/sidebar.css +684 -0
  43. package/framework/css/components/slide-header.css +52 -0
  44. package/framework/css/components/spinner.css +62 -0
  45. package/framework/css/components/stats.css +44 -0
  46. package/framework/css/components/steps.css +232 -0
  47. package/framework/css/components/tables.css +90 -0
  48. package/framework/css/components/tabs.css +347 -0
  49. package/framework/css/components/timeline.css +154 -0
  50. package/framework/css/components/toggle.css +95 -0
  51. package/framework/css/components/tooltip.css +226 -0
  52. package/framework/css/components/video-player.css +438 -0
  53. package/framework/css/design-tokens.css +707 -0
  54. package/framework/css/framework.css +86 -0
  55. package/framework/css/interactions/accessibility.css +75 -0
  56. package/framework/css/interactions/base.css +92 -0
  57. package/framework/css/interactions/drag-drop.css +295 -0
  58. package/framework/css/interactions/fill-in-the-blank.css +236 -0
  59. package/framework/css/interactions/hotspots.css +69 -0
  60. package/framework/css/interactions/index.css +45 -0
  61. package/framework/css/interactions/interactive-image.css +359 -0
  62. package/framework/css/interactions/likert.css +126 -0
  63. package/framework/css/interactions/matching.css +354 -0
  64. package/framework/css/interactions/numeric-input.css +78 -0
  65. package/framework/css/interactions/sequencing.css +378 -0
  66. package/framework/css/interactions/true-false.css +177 -0
  67. package/framework/css/layouts/article.css +258 -0
  68. package/framework/css/layouts/base.css +30 -0
  69. package/framework/css/layouts/canvas.css +38 -0
  70. package/framework/css/layouts/focused.css +236 -0
  71. package/framework/css/layouts/index.css +29 -0
  72. package/framework/css/layouts/presentation.css +191 -0
  73. package/framework/css/layouts/traditional.css +52 -0
  74. package/framework/css/responsive.css +439 -0
  75. package/framework/css/utilities/accessibility-utils.css +59 -0
  76. package/framework/css/utilities/animations.css +419 -0
  77. package/framework/css/utilities/borders.css +72 -0
  78. package/framework/css/utilities/colors.css +76 -0
  79. package/framework/css/utilities/container.css +46 -0
  80. package/framework/css/utilities/decorative.css +442 -0
  81. package/framework/css/utilities/display.css +257 -0
  82. package/framework/css/utilities/flexbox.css +80 -0
  83. package/framework/css/utilities/grid.css +69 -0
  84. package/framework/css/utilities/icons.css +534 -0
  85. package/framework/css/utilities/lists.css +190 -0
  86. package/framework/css/utilities/spacing.css +167 -0
  87. package/framework/css/utilities/tables.css +81 -0
  88. package/framework/css/utilities/typography.css +159 -0
  89. package/framework/css/utilities/visibility.css +117 -0
  90. package/framework/docs/COURSE_AUTHORING_GUIDE.md +1773 -0
  91. package/framework/docs/COURSE_OUTLINE_GUIDE.md +725 -0
  92. package/framework/docs/COURSE_OUTLINE_TEMPLATE.md +161 -0
  93. package/framework/docs/DATA_MODEL.md +409 -0
  94. package/framework/docs/FRAMEWORK_GUIDE.md +1088 -0
  95. package/framework/docs/USER_GUIDE.md +583 -0
  96. package/framework/docs/examples/cloudflare-channel-relay.js +169 -0
  97. package/framework/docs/examples/cloudflare-data-worker.js +102 -0
  98. package/framework/docs/examples/cloudflare-error-worker.js +228 -0
  99. package/framework/index.html +175 -0
  100. package/framework/js/app/AppActions.js +410 -0
  101. package/framework/js/app/AppState.js +225 -0
  102. package/framework/js/app/AppUI.js +616 -0
  103. package/framework/js/assessment/AssessmentActions.js +615 -0
  104. package/framework/js/assessment/AssessmentFactory.js +471 -0
  105. package/framework/js/assessment/AssessmentState.js +322 -0
  106. package/framework/js/assessment/AssessmentUI.js +451 -0
  107. package/framework/js/automation/api-engagement.js +196 -0
  108. package/framework/js/automation/api-interactions.js +167 -0
  109. package/framework/js/automation/api.js +242 -0
  110. package/framework/js/automation/index.js +41 -0
  111. package/framework/js/components/interactions/drag-drop.js +884 -0
  112. package/framework/js/components/interactions/fill-in.js +535 -0
  113. package/framework/js/components/interactions/hotspot.js +702 -0
  114. package/framework/js/components/interactions/interaction-base.js +511 -0
  115. package/framework/js/components/interactions/likert.js +301 -0
  116. package/framework/js/components/interactions/matching.js +699 -0
  117. package/framework/js/components/interactions/multiple-choice.js +377 -0
  118. package/framework/js/components/interactions/numeric.js +271 -0
  119. package/framework/js/components/interactions/sequencing.js +423 -0
  120. package/framework/js/components/interactions/true-false.js +241 -0
  121. package/framework/js/components/ui-components/accordion.js +442 -0
  122. package/framework/js/components/ui-components/alert.js +88 -0
  123. package/framework/js/components/ui-components/audio-player.js +1193 -0
  124. package/framework/js/components/ui-components/callout.js +121 -0
  125. package/framework/js/components/ui-components/carousel.js +145 -0
  126. package/framework/js/components/ui-components/checkbox-group.js +87 -0
  127. package/framework/js/components/ui-components/checklist.js +40 -0
  128. package/framework/js/components/ui-components/collapse.js +114 -0
  129. package/framework/js/components/ui-components/comparison.js +30 -0
  130. package/framework/js/components/ui-components/conditional-display.js +150 -0
  131. package/framework/js/components/ui-components/content-image.js +41 -0
  132. package/framework/js/components/ui-components/dropdown.js +262 -0
  133. package/framework/js/components/ui-components/embed-frame.js +274 -0
  134. package/framework/js/components/ui-components/features.js +33 -0
  135. package/framework/js/components/ui-components/flip-card.js +230 -0
  136. package/framework/js/components/ui-components/form-validator.js +76 -0
  137. package/framework/js/components/ui-components/hero.js +49 -0
  138. package/framework/js/components/ui-components/index.js +12 -0
  139. package/framework/js/components/ui-components/interactive-image.js +235 -0
  140. package/framework/js/components/ui-components/interactive-timeline.js +285 -0
  141. package/framework/js/components/ui-components/intro-cards.js +35 -0
  142. package/framework/js/components/ui-components/lightbox.js +652 -0
  143. package/framework/js/components/ui-components/modal.js +386 -0
  144. package/framework/js/components/ui-components/notifications.js +145 -0
  145. package/framework/js/components/ui-components/progress.js +88 -0
  146. package/framework/js/components/ui-components/quote.js +41 -0
  147. package/framework/js/components/ui-components/stats.js +33 -0
  148. package/framework/js/components/ui-components/steps.js +41 -0
  149. package/framework/js/components/ui-components/tabs.js +255 -0
  150. package/framework/js/components/ui-components/timeline.js +42 -0
  151. package/framework/js/components/ui-components/toggle-group.js +73 -0
  152. package/framework/js/components/ui-components/tooltip.js +458 -0
  153. package/framework/js/components/ui-components/value-display.js +133 -0
  154. package/framework/js/components/ui-components/video-player.js +686 -0
  155. package/framework/js/core/component-catalog.js +121 -0
  156. package/framework/js/core/event-bus.js +178 -0
  157. package/framework/js/core/interaction-catalog.js +149 -0
  158. package/framework/js/dev/runtime-linter.js +1725 -0
  159. package/framework/js/drivers/cmi5-driver.js +768 -0
  160. package/framework/js/drivers/driver-factory.js +77 -0
  161. package/framework/js/drivers/driver-interface.js +110 -0
  162. package/framework/js/drivers/http-driver-base.js +241 -0
  163. package/framework/js/drivers/lti-driver.js +508 -0
  164. package/framework/js/drivers/proxy-driver.js +444 -0
  165. package/framework/js/drivers/scorm-12-driver.js +560 -0
  166. package/framework/js/drivers/scorm-2004-driver.js +775 -0
  167. package/framework/js/drivers/scorm-driver-base.js +112 -0
  168. package/framework/js/engagement/engagement-manager.js +404 -0
  169. package/framework/js/engagement/engagement-progress.js +191 -0
  170. package/framework/js/engagement/engagement-trackers.js +215 -0
  171. package/framework/js/engagement/requirement-strategies.js +268 -0
  172. package/framework/js/main.js +727 -0
  173. package/framework/js/managers/accessibility-manager.js +499 -0
  174. package/framework/js/managers/assessment-manager.js +230 -0
  175. package/framework/js/managers/audio-manager.js +944 -0
  176. package/framework/js/managers/comment-manager.js +88 -0
  177. package/framework/js/managers/flag-manager.js +86 -0
  178. package/framework/js/managers/interaction-manager.js +254 -0
  179. package/framework/js/managers/interaction-registry.js +96 -0
  180. package/framework/js/managers/objective-manager.js +423 -0
  181. package/framework/js/managers/score-manager.js +441 -0
  182. package/framework/js/managers/video-manager.js +536 -0
  183. package/framework/js/navigation/Breadcrumbs.js +234 -0
  184. package/framework/js/navigation/NavigationActions.js +1132 -0
  185. package/framework/js/navigation/NavigationState.js +276 -0
  186. package/framework/js/navigation/NavigationUI.js +574 -0
  187. package/framework/js/navigation/document-gallery.js +357 -0
  188. package/framework/js/navigation/navigation-helpers.js +175 -0
  189. package/framework/js/navigation/navigation-validators.js +174 -0
  190. package/framework/js/state/index.js +8 -0
  191. package/framework/js/state/lms-connection.js +482 -0
  192. package/framework/js/state/lms-error-utils.js +58 -0
  193. package/framework/js/state/state-commits.js +200 -0
  194. package/framework/js/state/state-domains.js +86 -0
  195. package/framework/js/state/state-manager.js +502 -0
  196. package/framework/js/state/state-validation.js +311 -0
  197. package/framework/js/state/transaction-log.js +41 -0
  198. package/framework/js/state/xapi-statement-service.js +325 -0
  199. package/framework/js/utilities/access-control.js +99 -0
  200. package/framework/js/utilities/breakpoint-manager.js +315 -0
  201. package/framework/js/utilities/canvas-slide.js +35 -0
  202. package/framework/js/utilities/conditional-display.js +388 -0
  203. package/framework/js/utilities/course-channel.js +214 -0
  204. package/framework/js/utilities/course-helpers.js +420 -0
  205. package/framework/js/utilities/data-reporter.js +273 -0
  206. package/framework/js/utilities/error-reporter.js +313 -0
  207. package/framework/js/utilities/hotspot-helper.js +341 -0
  208. package/framework/js/utilities/icons.js +348 -0
  209. package/framework/js/utilities/logger.js +92 -0
  210. package/framework/js/utilities/markdown-renderer.js +45 -0
  211. package/framework/js/utilities/scroll-tracker.js +68 -0
  212. package/framework/js/utilities/ui-initializer.js +146 -0
  213. package/framework/js/utilities/utilities.js +293 -0
  214. package/framework/js/utilities/view-manager.js +227 -0
  215. package/framework/js/validation/html-validators.js +422 -0
  216. package/framework/js/validation/scorm-validators.js +438 -0
  217. package/framework/js/vendor/pipwerks.js +931 -0
  218. package/framework/scripts/generate-narration.js +629 -0
  219. package/framework/scripts/tts-providers/azure-provider.js +178 -0
  220. package/framework/scripts/tts-providers/base-provider.js +81 -0
  221. package/framework/scripts/tts-providers/deepgram-provider.js +135 -0
  222. package/framework/scripts/tts-providers/elevenlabs-provider.js +148 -0
  223. package/framework/scripts/tts-providers/google-provider.js +272 -0
  224. package/framework/scripts/tts-providers/index.js +158 -0
  225. package/framework/scripts/tts-providers/openai-provider.js +143 -0
  226. package/framework/version.json +63 -0
  227. package/lib/authoring-api.js +919 -0
  228. package/lib/build-linter.js +450 -0
  229. package/lib/build-packaging.js +186 -0
  230. package/lib/build.js +88 -0
  231. package/lib/cloud.js +691 -0
  232. package/lib/convert.js +341 -0
  233. package/lib/course-parser.js +936 -0
  234. package/lib/course-writer.js +258 -0
  235. package/lib/create.js +248 -0
  236. package/lib/css-index.js +237 -0
  237. package/lib/dev.js +51 -0
  238. package/lib/export-content.js +1246 -0
  239. package/lib/headless-browser.js +413 -0
  240. package/lib/import.js +377 -0
  241. package/lib/index.js +80 -0
  242. package/lib/info.js +79 -0
  243. package/lib/interaction-formatters.js +568 -0
  244. package/lib/manifest/cmi5-manifest.js +63 -0
  245. package/lib/manifest/lti-tool-config.js +53 -0
  246. package/lib/manifest/manifest-factory.js +99 -0
  247. package/lib/manifest/scorm-12-manifest.js +61 -0
  248. package/lib/manifest/scorm-2004-manifest.js +94 -0
  249. package/lib/manifest/scorm-proxy-manifest.js +104 -0
  250. package/lib/manifest-parser.js +96 -0
  251. package/lib/mcp-prompts.js +753 -0
  252. package/lib/mcp-server.js +316 -0
  253. package/lib/narration.js +53 -0
  254. package/lib/pdf-structure.js +142 -0
  255. package/lib/preview-export.js +231 -0
  256. package/lib/preview-routes-api.js +662 -0
  257. package/lib/preview-routes-editing.js +159 -0
  258. package/lib/preview-routes-lms.js +230 -0
  259. package/lib/preview-server.js +564 -0
  260. package/lib/project-utils.js +269 -0
  261. package/lib/proxy-templates/proxy.html +68 -0
  262. package/lib/proxy-templates/scorm-bridge.js +112 -0
  263. package/lib/scaffold.js +193 -0
  264. package/lib/schema-extractor.js +361 -0
  265. package/lib/slide-source-editor.js +586 -0
  266. package/lib/stub-player/app-viewer.js +195 -0
  267. package/lib/stub-player/app.js +370 -0
  268. package/lib/stub-player/catalog-panel.js +312 -0
  269. package/lib/stub-player/config-panel.js +1303 -0
  270. package/lib/stub-player/content-generator.js +586 -0
  271. package/lib/stub-player/content-viewer.js +173 -0
  272. package/lib/stub-player/debug-panel.js +420 -0
  273. package/lib/stub-player/edit-mode.js +922 -0
  274. package/lib/stub-player/edit-utils.js +400 -0
  275. package/lib/stub-player/header-bar.js +354 -0
  276. package/lib/stub-player/interaction-editor.js +210 -0
  277. package/lib/stub-player/interactions-panel.js +565 -0
  278. package/lib/stub-player/lms-api.js +1094 -0
  279. package/lib/stub-player/login-screen.js +74 -0
  280. package/lib/stub-player/outline-mode.js +689 -0
  281. package/lib/stub-player/styles/_assessments-panel.css +245 -0
  282. package/lib/stub-player/styles/_base.css +89 -0
  283. package/lib/stub-player/styles/_catalog-icons.css +96 -0
  284. package/lib/stub-player/styles/_catalog-panel.css +291 -0
  285. package/lib/stub-player/styles/_config-panel.css +636 -0
  286. package/lib/stub-player/styles/_content-viewer.css +834 -0
  287. package/lib/stub-player/styles/_debug-panel.css +576 -0
  288. package/lib/stub-player/styles/_edit-mode.css +128 -0
  289. package/lib/stub-player/styles/_header-bar.css +343 -0
  290. package/lib/stub-player/styles/_interaction-editor.css +140 -0
  291. package/lib/stub-player/styles/_interactions-panel.css +1038 -0
  292. package/lib/stub-player/styles/_login-screen.css +102 -0
  293. package/lib/stub-player/styles/_outline-mode.css +752 -0
  294. package/lib/stub-player/styles.css +15 -0
  295. package/lib/stub-player.js +160 -0
  296. package/lib/test-data-reporting.js +176 -0
  297. package/lib/test-error-reporting.js +146 -0
  298. package/lib/token.js +86 -0
  299. package/lib/upgrade.js +257 -0
  300. package/lib/validation-rules.js +517 -0
  301. package/lib/vite-plugin-content-discovery.js +296 -0
  302. package/package.json +108 -0
  303. package/schemas/XMLSchema.dtd +402 -0
  304. package/schemas/adlcp_v1p3.xsd +111 -0
  305. package/schemas/adlnav_v1p3.xsd +61 -0
  306. package/schemas/adlseq_v1p3.xsd +93 -0
  307. package/schemas/common/anyElement.xsd +27 -0
  308. package/schemas/common/dataTypes.xsd +138 -0
  309. package/schemas/common/elementNames.xsd +767 -0
  310. package/schemas/common/elementTypes.xsd +786 -0
  311. package/schemas/common/rootElement.xsd +31 -0
  312. package/schemas/common/vocabTypes.xsd +345 -0
  313. package/schemas/common/vocabValues.xsd +257 -0
  314. package/schemas/datatypes.dtd +203 -0
  315. package/schemas/ims_xml.xsd +35 -0
  316. package/schemas/imscp_v1p1.xsd +368 -0
  317. package/schemas/imsss_v1p0.xsd +67 -0
  318. package/schemas/imsss_v1p0auxresource.xsd +19 -0
  319. package/schemas/imsss_v1p0control.xsd +20 -0
  320. package/schemas/imsss_v1p0delivery.xsd +17 -0
  321. package/schemas/imsss_v1p0limit.xsd +47 -0
  322. package/schemas/imsss_v1p0objective.xsd +67 -0
  323. package/schemas/imsss_v1p0random.xsd +16 -0
  324. package/schemas/imsss_v1p0rollup.xsd +46 -0
  325. package/schemas/imsss_v1p0seqrule.xsd +108 -0
  326. package/schemas/imsss_v1p0util.xsd +94 -0
  327. package/schemas/license.txt +17 -0
  328. package/schemas/lom.xsd +102 -0
  329. package/schemas/lomCustom.xsd +62 -0
  330. package/schemas/lomLoose.xsd +62 -0
  331. package/schemas/lomStrict.xsd +62 -0
  332. package/schemas/xml.xsd +81 -0
  333. package/template/.env.example +92 -0
  334. package/template/course/assets/audio/example-intro.mp3 +0 -0
  335. package/template/course/assets/audio/example-ui-demo--compact-player.mp3 +0 -0
  336. package/template/course/assets/audio/example-ui-demo--demo-modal.mp3 +0 -0
  337. package/template/course/assets/audio/example-ui-demo--full-player.mp3 +0 -0
  338. package/template/course/assets/docs/example_md_1.md +39 -0
  339. package/template/course/assets/docs/example_md_2.md +41 -0
  340. package/template/course/assets/docs/example_pdf_1_thumbnail.png +0 -0
  341. package/template/course/assets/docs/example_pdf_2.pdf +0 -0
  342. package/template/course/assets/images/course-architecture.svg +36 -0
  343. package/template/course/assets/images/logo.svg +14 -0
  344. package/template/course/assets/widgets/counter-demo.html +190 -0
  345. package/template/course/assets/widgets/gravity-painter.html +384 -0
  346. package/template/course/course-config.js +539 -0
  347. package/template/course/icons.js +19 -0
  348. package/template/course/interactions/PLUGIN_GUIDE.md +97 -0
  349. package/template/course/slides/example-course-structure.js +138 -0
  350. package/template/course/slides/example-final-exam.js +144 -0
  351. package/template/course/slides/example-finishing.js +127 -0
  352. package/template/course/slides/example-interactions-showcase.js +615 -0
  353. package/template/course/slides/example-preview-tour.js +129 -0
  354. package/template/course/slides/example-remedial.js +143 -0
  355. package/template/course/slides/example-summary.js +103 -0
  356. package/template/course/slides/example-ui-showcase.js +1805 -0
  357. package/template/course/slides/example-welcome.js +123 -0
  358. package/template/course/slides/example-workflow.js +140 -0
  359. package/template/course/theme.css +165 -0
  360. package/template/eslint.config.js +47 -0
  361. package/template/package.json +28 -0
  362. 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
+ }