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,707 @@
1
+ /* ============================================================================
2
+ SCORM Framework — Global Design Tokens
3
+ ============================================================================
4
+
5
+ These are the default design tokens used across the framework. Override any
6
+ of these values in `../course/theme.css` to brand an individual
7
+ course without modifying framework files.
8
+
9
+ ========================================================================= */
10
+
11
+ :root {
12
+
13
+ /* ========================================================================
14
+ PALETTE - Core Brand Colors
15
+ ========================================================================
16
+
17
+ These 5 colors form the foundation of the entire color system.
18
+ Change these to rebrand the framework. All other colors derive from these.
19
+
20
+ ======================================================================== */
21
+
22
+ --palette-white: #ffffff; /* White */
23
+ --palette-black: #000000; /* Black */
24
+ --palette-gray: #808080; /* Gray */
25
+ --palette-charcoal: #23272e; /* Charcoal (premium neutral ink) */
26
+ --palette-blue: #14213d; /* Prussian Blue */
27
+ --palette-blue-light: #4a6fa5; /* Light blue (info) */
28
+ --palette-green: #1d7648; /* Pine Green */
29
+ --palette-yellow: #f7b801; /* Yellow (accent) */
30
+ --palette-amber: #f18701; /* Tiger Orange */
31
+ --palette-orange: #f35b04; /* Cayenne (brand vibrant) */
32
+ --palette-red: #c7322b; /* Red (danger) */
33
+
34
+ /* ========================================================================
35
+ BRAND COLORS - Derived from Palette via color-mix()
36
+ ========================================================================
37
+
38
+ These semantic brand tokens derive from palette colors automatically.
39
+ Light variants mix with white, dark variants mix with black.
40
+
41
+ ======================================================================== */
42
+
43
+ --color-primary: var(--palette-blue);
44
+ --color-primary-light: color-mix(in srgb, var(--palette-blue) 8%, var(--palette-white));
45
+ --color-primary-dark: color-mix(in srgb, var(--palette-blue) 70%, var(--palette-black));
46
+ --color-primary-hover: var(--color-primary-dark);
47
+
48
+ --color-secondary: var(--palette-orange);
49
+ --color-secondary-light: color-mix(in srgb, var(--palette-orange) 6%, var(--palette-white));
50
+ --color-secondary-dark: color-mix(in srgb, var(--palette-orange) 80%, var(--palette-black));
51
+ --color-secondary-hover: var(--color-secondary-dark);
52
+ --color-secondary-text: var(--color-gray-900); /* Dark text for contrast on orange */
53
+
54
+ --color-accent: var(--palette-yellow);
55
+ --color-accent-light: color-mix(in srgb, var(--palette-yellow) 5%, var(--palette-white));
56
+ --color-accent-dark: color-mix(in srgb, var(--palette-yellow) 80%, var(--palette-black));
57
+ --color-accent-hover: var(--color-accent-dark);
58
+ --color-accent-text: var(--color-gray-900); /* Dark text for contrast on amber */
59
+
60
+ /* Vibrant variant for special emphasis */
61
+ --color-secondary-vibrant: var(--palette-amber);
62
+
63
+ /* ========================================================================
64
+ NEUTRAL COLORS - Grey Scale Derived from Palette
65
+ ========================================================================
66
+
67
+ Built by mixing --palette-gray with white (lighter) or black (darker).
68
+ Gray-500 is the midpoint, anchored to --palette-gray.
69
+
70
+ ======================================================================== */
71
+
72
+ --color-white: var(--palette-white);
73
+ --color-gray-50: color-mix(in srgb, var(--palette-gray) 3%, var(--palette-white));
74
+ --color-gray-100: color-mix(in srgb, var(--palette-gray) 6%, var(--palette-white));
75
+ --color-gray-200: color-mix(in srgb, var(--palette-gray) 12%, var(--palette-white));
76
+ --color-gray-300: color-mix(in srgb, var(--palette-gray) 25%, var(--palette-white));
77
+ --color-gray-400: color-mix(in srgb, var(--palette-gray) 60%, var(--palette-white));
78
+ --color-gray-500: var(--palette-gray); /* Midpoint - secondary text */
79
+ --color-gray-600: color-mix(in srgb, var(--palette-gray) 75%, var(--palette-black));
80
+ --color-gray-700: color-mix(in srgb, var(--palette-gray) 50%, var(--palette-black));
81
+ --color-gray-800: color-mix(in srgb, var(--palette-gray) 38%, var(--palette-black));
82
+ --color-gray-900: color-mix(in srgb, var(--palette-gray) 20%, var(--palette-black));
83
+
84
+ /* Text Colors
85
+ - Gray scale handles system/body hierarchy
86
+ - Charcoal is reserved for brand "ink" emphasis
87
+ */
88
+ --text-ink: var(--palette-charcoal);
89
+ --text-primary: var(--color-gray-900);
90
+ --text-body: var(--color-gray-900);
91
+ --text-muted: var(--color-gray-600);
92
+ --text-secondary: var(--color-gray-600);
93
+
94
+ /* ========================================================================
95
+ SEMANTIC BACKGROUNDS
96
+ ========================================================================
97
+
98
+ Use these tokens instead of raw gray values for backgrounds.
99
+ This enables easy theming and proper dark mode support.
100
+
101
+ --bg-page: Main page/body background
102
+ --bg-surface: Cards, modals, elevated elements (typically white)
103
+ --bg-subtle: Very light emphasis areas
104
+ --bg-muted: Subtle emphasis areas (slightly stronger than subtle)
105
+ --bg-inset: Recessed/inset areas like inputs, wells, code blocks
106
+ --bg-elevated: Elevated surfaces (same as surface, but semantically distinct)
107
+ --bg-overlay: Modal/dialog overlays
108
+
109
+ ======================================================================== */
110
+
111
+ --bg-page: var(--color-gray-50);
112
+ --bg-surface: var(--color-white);
113
+ --bg-surface-hover: var(--color-gray-50);
114
+ --bg-surface-active: var(--color-gray-100);
115
+ --bg-subtle: var(--color-gray-50);
116
+ --bg-muted: var(--color-gray-100);
117
+ --bg-inset: var(--color-gray-200);
118
+ --bg-elevated: var(--color-white);
119
+ --bg-overlay: rgba(0, 0, 0, 0.5);
120
+
121
+ /* Semantic borders */
122
+ --border-default: var(--color-gray-200);
123
+ --border-subtle: var(--color-gray-100);
124
+ --border-strong: var(--color-gray-300);
125
+
126
+ /* ========================================================================
127
+ SEMANTIC COLORS - Derived from Palette via color-mix()
128
+ ========================================================================
129
+
130
+ Status and feedback colors mapped to the brand palette.
131
+ Light/hover/text variants all derive automatically from palette colors.
132
+
133
+ ======================================================================== */
134
+
135
+ --color-danger: var(--palette-red);
136
+ --color-danger-light: color-mix(in srgb, var(--palette-red) 4%, var(--palette-white));
137
+ --color-danger-hover: color-mix(in srgb, var(--palette-red) 90%, var(--palette-black));
138
+ --color-danger-text: color-mix(in srgb, var(--palette-red) 80%, var(--palette-black));
139
+ --color-on-danger: #ffffff; /* Text/icon color on danger-filled backgrounds */
140
+
141
+ --color-warning: var(--palette-amber);
142
+ --color-warning-light: color-mix(in srgb, var(--palette-amber) 6%, var(--palette-white));
143
+ --color-warning-hover: var(--color-secondary-dark);
144
+ --color-warning-text: color-mix(in srgb, var(--palette-amber) 70%, var(--palette-black));
145
+ --color-on-warning: var(--palette-charcoal); /* Text/icon color on warning-filled backgrounds */
146
+
147
+ --color-info: var(--palette-blue-light);
148
+ --color-info-light: color-mix(in srgb, var(--palette-blue-light) 6%, var(--palette-white));
149
+ --color-info-hover: color-mix(in srgb, var(--palette-blue-light) 80%, var(--palette-black));
150
+ --color-info-text: color-mix(in srgb, var(--palette-blue-light) 75%, var(--palette-black));
151
+
152
+ --color-success: var(--palette-green);
153
+ --color-success-light: color-mix(in srgb, var(--palette-green) 4%, var(--palette-white));
154
+ --color-success-hover: color-mix(in srgb, var(--palette-green) 80%, var(--palette-black));
155
+ --color-success-text: color-mix(in srgb, var(--palette-green) 85%, var(--palette-black));
156
+
157
+ --color-partial: var(--palette-amber); /* Partial credit feedback */
158
+
159
+ /* ========================================================================
160
+ LINKS & INTERACTIVE STATES
161
+ ======================================================================== */
162
+
163
+ --color-link: var(--color-primary);
164
+ --color-link-hover: var(--color-primary-dark);
165
+ --color-link-visited: var(--color-gray-700);
166
+ --color-link-active: var(--color-primary-dark);
167
+
168
+ --color-disabled-bg: var(--color-gray-100);
169
+ --color-disabled-text: var(--color-gray-500);
170
+ --color-disabled-border: var(--color-gray-300);
171
+
172
+ --focus-ring-color: var(--color-primary);
173
+ --focus-ring-width: 3px;
174
+ --focus-ring-offset: 2px;
175
+
176
+ /* ========================================================================
177
+ ALPHA VARIATIONS - Derived via color-mix() with transparent
178
+ ======================================================================== */
179
+
180
+ /* Primary */
181
+ --color-primary-alpha-10: color-mix(in srgb, var(--color-primary) 10%, transparent);
182
+ --color-primary-alpha-20: color-mix(in srgb, var(--color-primary) 20%, transparent);
183
+ --color-primary-alpha-30: color-mix(in srgb, var(--color-primary) 30%, transparent);
184
+
185
+ /* Secondary */
186
+ --color-secondary-alpha-05: color-mix(in srgb, var(--color-secondary) 5%, transparent);
187
+ --color-secondary-alpha-10: color-mix(in srgb, var(--color-secondary) 10%, transparent);
188
+ --color-secondary-alpha-15: color-mix(in srgb, var(--color-secondary) 15%, transparent);
189
+ --color-secondary-alpha-20: color-mix(in srgb, var(--color-secondary) 20%, transparent);
190
+ --color-secondary-alpha-30: color-mix(in srgb, var(--color-secondary) 30%, transparent);
191
+
192
+ /* Accent */
193
+ --color-accent-alpha-10: color-mix(in srgb, var(--color-accent) 10%, transparent);
194
+ --color-accent-alpha-30: color-mix(in srgb, var(--color-accent) 30%, transparent);
195
+
196
+ /* Success */
197
+ --color-success-alpha-10: color-mix(in srgb, var(--color-success) 10%, transparent);
198
+ --color-success-alpha-20: color-mix(in srgb, var(--color-success) 20%, transparent);
199
+ --color-success-alpha-30: color-mix(in srgb, var(--color-success) 30%, transparent);
200
+
201
+ /* Info */
202
+ --color-info-alpha-10: color-mix(in srgb, var(--color-info) 10%, transparent);
203
+ --color-info-alpha-20: color-mix(in srgb, var(--color-info) 20%, transparent);
204
+ --color-info-alpha-30: color-mix(in srgb, var(--color-info) 30%, transparent);
205
+
206
+ /* Error */
207
+ --color-danger-alpha-10: color-mix(in srgb, var(--color-danger) 10%, transparent);
208
+ --color-danger-alpha-20: color-mix(in srgb, var(--color-danger) 20%, transparent);
209
+ --color-danger-alpha-30: color-mix(in srgb, var(--color-danger) 30%, transparent);
210
+ --color-danger-alpha-50: color-mix(in srgb, var(--color-danger) 50%, transparent);
211
+
212
+ /* White */
213
+ --color-white-alpha-15: color-mix(in srgb, var(--color-white) 15%, transparent);
214
+ --color-white-alpha-25: color-mix(in srgb, var(--color-white) 25%, transparent);
215
+ --color-white-alpha-30: color-mix(in srgb, var(--color-white) 30%, transparent);
216
+ --color-white-alpha-35: color-mix(in srgb, var(--color-white) 35%, transparent);
217
+ --color-white-alpha-50: color-mix(in srgb, var(--color-white) 50%, transparent);
218
+ --color-white-alpha-80: color-mix(in srgb, var(--color-white) 80%, transparent);
219
+ --color-white-alpha-95: color-mix(in srgb, var(--color-white) 95%, transparent);
220
+
221
+ /* ========================================================================
222
+ SPACING SCALE - 4px System
223
+ ========================================================================
224
+
225
+ ✅ Safe to adjust for tighter/looser layouts
226
+
227
+ Uses a 4px base unit for perfect pixel alignment.
228
+ Adjust these if you need more/less whitespace throughout the course.
229
+
230
+ Common uses:
231
+ - space-2/3: Small gaps between related items
232
+ - space-4/6: Standard spacing for most elements
233
+ - space-8/10: Large spacing between sections
234
+
235
+ ======================================================================== */
236
+
237
+ /* Base spacing (immutable source of truth) */
238
+ --space-1-base: 0.25rem; /* 4px - Tiny gaps */
239
+ --space-2-base: 0.5rem; /* 8px - Small gaps */
240
+ --space-3-base: 0.75rem; /* 12px - Medium-small gaps */
241
+ --space-4-base: 1rem; /* 16px - Standard gaps (most common) */
242
+ --space-5-base: 1.25rem; /* 20px - Medium gaps */
243
+ --space-6-base: 1.5rem; /* 24px - Large gaps */
244
+ --space-8-base: 2rem; /* 32px - Extra large gaps */
245
+ --space-10-base: 2.5rem; /* 40px - Section spacing */
246
+ --space-12-base: 3rem; /* 48px - Major section spacing */
247
+ --space-16-base: 4rem; /* 64px - Very large spacing */
248
+ --space-20-base: 5rem; /* 80px - Huge spacing */
249
+ --space-24-base: 6rem; /* 96px - Maximum spacing */
250
+
251
+ /* Normal mode: Spacing references base (updated when base changes) */
252
+ --space-1: var(--space-1-base);
253
+ --space-2: var(--space-2-base);
254
+ --space-3: var(--space-3-base);
255
+ --space-4: var(--space-4-base);
256
+ --space-5: var(--space-5-base);
257
+ --space-6: var(--space-6-base);
258
+ --space-8: var(--space-8-base);
259
+ --space-10: var(--space-10-base);
260
+ --space-12: var(--space-12-base);
261
+ --space-16: var(--space-16-base);
262
+ --space-20: var(--space-20-base);
263
+ --space-24: var(--space-24-base);
264
+
265
+ /* ========================================================================
266
+ FONT FAMILIES
267
+ ========================================================================
268
+
269
+ ⭐ CUSTOMIZE THESE FOR YOUR BRAND
270
+
271
+ Override these tokens in theme.css to use custom fonts.
272
+
273
+ Tips:
274
+ - Load custom fonts via @import or @font-face in theme.css
275
+ - Always include fallback system fonts
276
+ - Use --font-family-display for hero/impact text
277
+ - Use --font-family-mono for code/technical content
278
+
279
+ Example in theme.css:
280
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
281
+ :root {
282
+ --font-family-sans: 'Inter', sans-serif;
283
+ --font-family-display: 'Inter', sans-serif;
284
+ }
285
+
286
+ ======================================================================== */
287
+
288
+ /* Canonical font-family tokens */
289
+ --font-family-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
290
+ --font-family-display: var(--font-family-sans); /* Defaults to sans for minimal visual drift */
291
+ --font-family-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
292
+
293
+ /* ========================================================================
294
+ TYPOGRAPHY SCALE
295
+ ========================================================================
296
+
297
+ ✅ Adjust these to match your brand's typography
298
+
299
+ Font sizes use a modular scale for visual hierarchy.
300
+ Adjust these if your brand requires larger/smaller text.
301
+
302
+ Common uses:
303
+ - font-size-base: Body text (default 16px)
304
+ - font-size-lg: Emphasized text
305
+ - font-size-2xl: Section headings
306
+ - font-size-4xl: Main page headings
307
+
308
+ ⚠️ Maintain accessibility: Don't go below 14px for body text
309
+
310
+ ======================================================================== */
311
+
312
+ /* Display/Hero font sizes - for impact text */
313
+ --font-size-6xl: 3.75rem; /* 60px - Display/hero text */
314
+ --font-size-7xl: 4.5rem; /* 72px - Large display text */
315
+
316
+ /* Base font sizes (immutable source of truth) */
317
+ --font-size-xs-base: 0.75rem; /* 12px - Small labels, captions */
318
+ --font-size-sm-base: 0.875rem; /* 14px - Secondary text */
319
+ --font-size-base-base: 1rem; /* 16px - Body text (default) */
320
+ --font-size-lg-base: 1.125rem; /* 18px - Emphasized text */
321
+ --font-size-xl-base: 1.25rem; /* 20px - Subheadings */
322
+ --font-size-2xl-base: 1.5rem; /* 24px - Section headings */
323
+ --font-size-3xl-base: 1.875rem; /* 30px - Large headings */
324
+ --font-size-4xl-base: 2.25rem; /* 36px - Main headings */
325
+ --font-size-5xl-base: 3rem; /* 48px - Hero text */
326
+
327
+ /* Normal mode: Font sizes reference base (updated when base changes) */
328
+ --font-size-xs: var(--font-size-xs-base);
329
+ --font-size-sm: var(--font-size-sm-base);
330
+ --font-size-base: var(--font-size-base-base);
331
+ --font-size-lg: var(--font-size-lg-base);
332
+ --font-size-xl: var(--font-size-xl-base);
333
+ --font-size-2xl: var(--font-size-2xl-base);
334
+ --font-size-3xl: var(--font-size-3xl-base);
335
+ --font-size-4xl: var(--font-size-4xl-base);
336
+ --font-size-5xl: var(--font-size-5xl-base);
337
+
338
+ /* Line Heights - Optimized for Readability */
339
+ --line-height-tight: 1.25; /* Headings */
340
+ --line-height-snug: 1.375; /* Subheadings */
341
+ --line-height-normal: 1.5; /* Body text (default) */
342
+ --line-height-relaxed: 1.625; /* Comfortable reading */
343
+ --line-height-loose: 2; /* Very spacious */
344
+
345
+ /* Font Weights */
346
+ --font-weight-normal: 400; /* Regular text */
347
+ --font-weight-medium: 500; /* Slightly emphasized */
348
+ --font-weight-semibold: 600; /* Headings, buttons */
349
+ --font-weight-bold: 700; /* Strong emphasis */
350
+
351
+ /* Large Font Mode Multipliers - Accessibility Feature */
352
+ --font-scale-multiplier: 1.25; /* Scale for small text */
353
+ --font-scale-body: 1.25; /* Scale for body text */
354
+ --font-scale-heading: 1.25; /* Scale for headings */
355
+ --spacing-scale-multiplier: 1.1; /* Scale for spacing */
356
+ --touch-target-scale-multiplier: 1.15; /* Scale for touch targets */
357
+
358
+ /* Border Radius Scale */
359
+ --radius-sm: 0.25rem; /* 4px */
360
+ --radius-md: 0.375rem; /* 6px */
361
+ --radius-lg: 0.5rem; /* 8px */
362
+ --radius-xl: 0.75rem; /* 12px */
363
+ --radius-2xl: 1rem; /* 16px */
364
+ --radius-full: 9999px; /* Fully rounded */
365
+
366
+ /* Border Width System - Frequently used values */
367
+ --border-width-thin: 1px; /* Subtle borders */
368
+ --border-width-sm: 1.5px; /* In-between outlines (buttons, chips) */
369
+ --border-width-md: 2px; /* Standard borders, input focus */
370
+ --border-width-thick: 3px; /* Accents, header bottom */
371
+ --border-width-accent: 4px; /* Strong accents, callout left border */
372
+
373
+ /* Size Tokens - Touch targets and component dimensions */
374
+ --size-touch-target: 44px; /* Minimum touch/click target size (accessibility) */
375
+ --size-icon-button: 48px; /* Icon-only button size */
376
+ --size-card-min-height: 280px; /* Flip card and similar component heights */
377
+ --size-carousel-height: 400px; /* Carousel minimum height */
378
+ --size-modal-default: 600px; /* Standard modal width */
379
+ --size-modal-large: 800px; /* Large modal width */
380
+ --size-dropdown-max-height: 200px; /* Dropdown menu max height */
381
+ --size-collapse-max-height: 150rem; /* Accordion/collapse max height for overflow */
382
+
383
+ /* Shadows - Subtle and Professional */
384
+ --shadow-xs: 0 1px 2px rgba(17, 24, 39, 0.04), 0 2px 6px rgba(17, 24, 39, 0.03);
385
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
386
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
387
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
388
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
389
+
390
+ /* Gradients - Reusable gradient patterns */
391
+ --gradient-subtle: linear-gradient(135deg, var(--color-gray-50) 0%, var(--color-gray-100) 100%);
392
+ --gradient-header: linear-gradient(135deg, var(--color-primary) 0%, var(--color-gray-700) 100%);
393
+ --gradient-primary: linear-gradient(135deg, var(--color-secondary) 0%, var(--color-secondary-vibrant) 100%);
394
+ --gradient-success: linear-gradient(135deg, var(--color-success) 0%, var(--color-success-hover) 100%);
395
+ --gradient-progress: linear-gradient(90deg, var(--color-primary) 0%, var(--color-secondary) 100%);
396
+ --gradient-shimmer: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.3) 50%, transparent 100%);
397
+ --gradient-celebration: linear-gradient(135deg, var(--color-accent-alpha-10), var(--color-accent-alpha-30));
398
+
399
+ /* ========================================================================
400
+ SEMANTIC UI TOKENS - Header, Sidebar, Footer
401
+ ========================================================================
402
+
403
+ ⭐ CUSTOMIZE THESE FOR QUICK UI THEMING
404
+
405
+ These high-level tokens control specific UI areas. Override these in
406
+ theme.css to customize the header, sidebar, or footer appearance
407
+ without understanding the entire color inheritance chain.
408
+
409
+ ======================================================================== */
410
+
411
+ /* Header Tokens */
412
+ --header-bg: var(--gradient-header); /* Header background (gradient or solid color) */
413
+ --header-text: var(--color-white); /* Header text color */
414
+ --header-border: var(--color-secondary); /* Header bottom border color */
415
+ --header-border-width: 3px; /* Header bottom border width */
416
+ --header-shadow: var(--shadow-md); /* Header shadow */
417
+ --header-title-size: var(--font-size-lg); /* Header course title font size */
418
+ --header-title-weight: var(--font-weight-bold); /* Header course title font weight */
419
+ --header-title-letter-spacing: -0.01em; /* Header course title letter spacing */
420
+ --header-control-bg: color-mix(in srgb, var(--header-text) 10%, transparent); /* Header icon button bg */
421
+ --header-control-bg-hover: color-mix(in srgb, var(--header-text) 16%, transparent); /* Header icon hover bg */
422
+ --header-control-bg-active: color-mix(in srgb, var(--header-text) 24%, transparent); /* Header icon active bg */
423
+ --header-control-text: var(--header-text); /* Header icon button text/icon color */
424
+ --header-control-focus: var(--header-text); /* Header icon button focus ring */
425
+ --header-progress-track: color-mix(in srgb, var(--header-text) 25%, transparent); /* Header progress track */
426
+ --header-progress-fill: var(--header-text); /* Header progress fill */
427
+ --header-dark-bg: linear-gradient(135deg, var(--color-gray-800) 0%, var(--color-gray-900) 100%); /* Dark header variant background */
428
+ --header-dark-text: var(--color-gray-50); /* Dark header variant text */
429
+ --header-dark-border: var(--color-gray-700); /* Dark header variant border */
430
+
431
+ /* Sidebar Tokens */
432
+ --sidebar-bg: var(--bg-surface); /* Sidebar background */
433
+ --sidebar-text: var(--color-gray-700); /* Sidebar text color */
434
+ --sidebar-border: var(--border-default); /* Sidebar border color */
435
+ --sidebar-active-bg: var(--color-primary-alpha-10); /* Active nav item background */
436
+ --sidebar-active-text: var(--color-primary); /* Active nav item text color */
437
+ --sidebar-hover-bg: var(--color-primary-alpha-10); /* Hover nav item background */
438
+ --sidebar-hover-text: var(--color-primary); /* Hover nav item text color */
439
+ --sidebar-muted-text: var(--text-muted); /* Disabled/muted sidebar text */
440
+ --sidebar-scrollbar-thumb: var(--color-gray-300); /* Sidebar scrollbar thumb */
441
+ --sidebar-scrollbar-thumb-hover: var(--color-gray-400); /* Sidebar scrollbar thumb (hover) */
442
+ --sidebar-backdrop: var(--bg-overlay); /* Sidebar overlay backdrop color */
443
+
444
+ /* Footer Tokens */
445
+ --footer-bg: var(--bg-surface); /* Footer background */
446
+ --footer-text: var(--text-primary); /* Footer text color */
447
+ --footer-border: var(--border-default); /* Footer top border color */
448
+ --footer-floating-bg: var(--bg-surface); /* Floating footer background */
449
+ --footer-floating-border: var(--border-default); /* Floating footer border */
450
+ --footer-floating-shadow: var(--shadow-lg); /* Floating footer shadow */
451
+ --nav-btn-bg: var(--bg-surface); /* Footer nav button background */
452
+ --nav-btn-text: var(--text-ink); /* Footer nav button text/icon */
453
+ --nav-btn-border: var(--border-strong); /* Footer nav button border */
454
+ --nav-btn-hover-bg: var(--bg-subtle); /* Footer nav button hover background */
455
+ --nav-btn-hover-text: var(--text-ink); /* Footer nav button hover text/icon */
456
+ --nav-btn-hover-border: color-mix(in srgb, var(--color-secondary) 35%, var(--bg-surface)); /* Footer nav hover border */
457
+ --nav-btn-disabled-bg: color-mix(in srgb, var(--bg-muted) 78%, var(--bg-surface)); /* Footer nav button disabled background */
458
+ --nav-btn-disabled-text: color-mix(in srgb, var(--text-muted) 90%, var(--bg-surface)); /* Footer nav button disabled text/icon */
459
+ --nav-btn-disabled-border: color-mix(in srgb, var(--border-strong) 70%, var(--bg-surface)); /* Footer nav button disabled border */
460
+ --nav-btn-edge-opacity: 0.62; /* Presentation edge nav idle opacity */
461
+ --nav-btn-edge-opacity-disabled: 0.24; /* Presentation edge nav disabled opacity */
462
+
463
+ /* Transitions - Unified premium interaction profile */
464
+ --transition-fast: 180ms cubic-bezier(0.22, 1, 0.36, 1);
465
+ --transition-normal: 240ms cubic-bezier(0.22, 1, 0.36, 1);
466
+ --transition-slow: 340ms cubic-bezier(0.22, 1, 0.36, 1);
467
+ --transition-interactive: 220ms cubic-bezier(0.22, 1, 0.36, 1);
468
+ --motion-lift-sm: -1px;
469
+ --motion-lift-md: -2px;
470
+ --motion-press-scale: 0.985;
471
+
472
+ /* Animation Tokens - Configurable animation timing */
473
+ --animation-duration-fast: 200ms;
474
+ --animation-duration-normal: 400ms;
475
+ --animation-duration-slow: 600ms;
476
+ --animation-easing-default: cubic-bezier(0.4, 0, 0.2, 1);
477
+ --animation-easing-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
478
+ --animation-easing-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275);
479
+
480
+ /* Button System - Unified styling */
481
+ --btn-padding-y: var(--space-3);
482
+ --btn-padding-x: var(--space-5);
483
+ --btn-min-height: 44px;
484
+ --btn-border-radius: var(--radius-lg);
485
+ --btn-font-size: var(--font-size-base);
486
+ --btn-font-weight: var(--font-weight-medium);
487
+ --btn-transition: background-color var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast), box-shadow var(--transition-interactive), transform var(--transition-interactive), opacity var(--transition-fast), filter var(--transition-fast);
488
+ --btn-hover-translate-y: var(--motion-lift-sm); /* Shared hover lift for button variants */
489
+
490
+ /* Layout spacing defaults - overridden by responsive breakpoint classes */
491
+ --content-padding: var(--space-10);
492
+ --section-padding: var(--space-8);
493
+ --header-padding-x: var(--space-6);
494
+ --header-padding-y: var(--space-3);
495
+ --header-height: 72px;
496
+ --footer-padding-x: var(--space-6);
497
+ --footer-padding-y: var(--space-3);
498
+ --nav-padding-x: var(--space-6);
499
+ --nav-padding-y: var(--space-2);
500
+
501
+ /* Input System - Unified styling */
502
+ --input-padding-y: var(--space-3);
503
+ --input-padding-x: var(--space-4);
504
+ --input-border-width: 2px;
505
+ --input-border-color: var(--color-gray-300);
506
+ --input-border-radius: var(--radius-lg);
507
+ --input-font-size: var(--font-size-base);
508
+ --input-min-height: 44px;
509
+ --input-focus-color: var(--color-primary);
510
+ --input-focus-shadow: 0 0 0 3px var(--color-primary-alpha-10);
511
+
512
+ /* Feedback System - Unified styling */
513
+ --feedback-padding: var(--space-2) var(--space-5);
514
+ --feedback-border-radius: var(--radius-md);
515
+ --feedback-font-size: var(--font-size-sm);
516
+ --feedback-font-weight: var(--font-weight-medium);
517
+
518
+ /* Navigation/FAB controls (presentation + focused) */
519
+ --nav-edge-control-size: 56px;
520
+ --nav-edge-icon-size: 28px;
521
+ --nav-edge-bg: color-mix(in srgb, var(--bg-surface) 94%, transparent);
522
+ --nav-edge-bg-hover: var(--bg-surface-hover);
523
+ --nav-edge-border: color-mix(in srgb, var(--text-primary) 14%, transparent);
524
+ --nav-edge-shadow: var(--shadow-md);
525
+ --nav-edge-shadow-hover: var(--shadow-lg);
526
+ --nav-edge-hover-scale: 1.04;
527
+ --nav-edge-active-scale: 0.98;
528
+
529
+ /* Carousel controls */
530
+ --carousel-control-size: var(--size-icon-button);
531
+ --carousel-control-offset: var(--space-4);
532
+ --carousel-control-bg: var(--color-white-alpha-95);
533
+ --carousel-control-bg-hover: var(--color-white);
534
+ --carousel-control-border: color-mix(in srgb, var(--palette-black) 10%, transparent);
535
+ --carousel-control-text: var(--text-primary);
536
+ --carousel-control-text-hover: var(--color-primary);
537
+ --carousel-control-focus: var(--focus-ring-color);
538
+ --carousel-dots-bottom: var(--space-5);
539
+ --carousel-dots-gap: var(--space-2);
540
+ --carousel-dots-padding-y: var(--space-2);
541
+ --carousel-dots-padding-x: var(--space-3);
542
+ --carousel-dots-bg: color-mix(in srgb, var(--palette-black) 30%, transparent);
543
+ --carousel-dot-size: 10px;
544
+ --carousel-dot-active-width: 24px;
545
+ --carousel-dot-bg: var(--color-white-alpha-50);
546
+ --carousel-dot-bg-hover: var(--color-white-alpha-80);
547
+ --carousel-dot-bg-active: var(--color-white);
548
+ --carousel-dot-focus: var(--color-white);
549
+ --carousel-caption-padding-top: 60px;
550
+ --carousel-caption-padding-x: 20px;
551
+ --carousel-caption-padding-bottom: 20px;
552
+ --carousel-caption-overlay: linear-gradient(to top, color-mix(in srgb, var(--palette-black) 80%, transparent), transparent);
553
+
554
+ /* Z-Index Scale */
555
+ --z-dropdown: 1000;
556
+ --z-sticky: 1020;
557
+ --z-fixed: 1030;
558
+ --z-overlay: 1035;
559
+ --z-modal-backdrop: 1040;
560
+ --z-modal: 1050;
561
+ --z-popover: 1060;
562
+ --z-tooltip: 1070;
563
+
564
+ /* Breakpoints (reference values for JS/utilities) */
565
+ --bp-desktop-xl: 1440px;
566
+ --bp-desktop: 1200px;
567
+ --bp-tablet-landscape: 1024px;
568
+ --bp-tablet-portrait: 768px;
569
+ --bp-mobile-landscape: 480px;
570
+ --bp-mobile-portrait: 320px;
571
+
572
+ /* Additional spacing aliases for consistency */
573
+ --space-sm: var(--space-2);
574
+ --space-md: var(--space-4);
575
+ --space-lg: var(--space-6);
576
+
577
+ /* Color text aliases for consistency */
578
+ --color-text: var(--text-primary);
579
+ --color-text-secondary: var(--text-secondary);
580
+
581
+ /* Font weight alias */
582
+ --font-weight-light: 300;
583
+ }
584
+
585
+ /* ============================================================================
586
+ DARK MODE THEME OVERRIDES
587
+ ============================================================================
588
+
589
+ When [data-theme="dark"] is set on :root, these CSS variables override
590
+ the light mode defaults. Components automatically adapt because they use
591
+ CSS variables. No individual selectors needed - just swap the tokens!
592
+
593
+ ========================================================================= */
594
+
595
+ [data-theme="dark"] {
596
+ /* ========================================================================
597
+ DARK PALETTE - Override palette for dark mode
598
+ ========================================================================
599
+
600
+ These brighter versions of palette colors work on dark backgrounds.
601
+ All other tokens derive from these automatically via color-mix().
602
+
603
+ ======================================================================== */
604
+
605
+ --palette-white: #0f172a; /* Inverted: deep dark becomes "white" */
606
+ --palette-black: #f9fafb; /* Inverted: near-white becomes "black" */
607
+ --palette-gray: #6b7280; /* Shifted gray midpoint for dark mode */
608
+ --palette-charcoal: #d1d5db; /* Charcoal (dark-mode counterpart) */
609
+ --palette-blue: #6b8ec4; /* Lightened Prussian Blue — visible on dark surfaces */
610
+ --palette-blue-light: #7da2d4; /* Lightened info blue */
611
+ --palette-green: #4ca67a; /* Lightened Pine Green */
612
+ --palette-yellow: #f7b801; /* Yellow (accent) — already bright, unchanged */
613
+ --palette-amber: #f18701; /* Tiger Orange — already bright, unchanged */
614
+ --palette-orange: #f35b04; /* Cayenne — already bright, unchanged */
615
+ --palette-red: #e05550; /* Brightened Red — visible on dark surfaces */
616
+
617
+ /* Keep semantic on-color tokens legible while preserving derived model.
618
+ In dark mode, UI still derives from palette values, but "white" for
619
+ foreground use should resolve to the light endpoint. */
620
+ --color-white: var(--palette-black);
621
+ --color-black: var(--palette-white);
622
+
623
+ /* Text Colors - derived from inverted gray scale */
624
+ --text-primary: var(--color-gray-900);
625
+ --text-body: var(--color-gray-900);
626
+ --text-muted: var(--color-gray-400);
627
+ --text-secondary: var(--color-gray-600);
628
+
629
+ /* Semantic Backgrounds - Dark Mode surfaces */
630
+ --bg-page: #0f172a;
631
+ --bg-surface: #1e293b;
632
+ --bg-surface-hover: #334155;
633
+ --bg-surface-active: #475569;
634
+ --bg-subtle: #1e293b;
635
+ --bg-muted: #334155;
636
+ --bg-inset: #0f172a;
637
+ --bg-elevated: #334155;
638
+ --bg-overlay: color-mix(in srgb, var(--palette-black) 30%, transparent);
639
+
640
+ /* Links - derived from primary */
641
+ --color-link: var(--color-primary);
642
+ --color-link-hover: var(--color-primary-dark);
643
+ --color-link-visited: color-mix(in srgb, var(--color-primary) 80%, var(--palette-black));
644
+ --color-link-active: var(--color-primary-dark);
645
+
646
+ /* Focus states */
647
+ --focus-ring-color: var(--color-primary);
648
+
649
+ /* Shadows - Dark Mode (deeper for contrast) */
650
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.28), 0 2px 6px rgba(0, 0, 0, 0.2);
651
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
652
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
653
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -2px rgba(0, 0, 0, 0.3);
654
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 10px 10px -5px rgba(0, 0, 0, 0.3);
655
+
656
+ /* Gradients - Dark Mode (derive from semantic colors) */
657
+ --gradient-subtle: linear-gradient(135deg, var(--bg-surface) 0%, var(--bg-page) 100%);
658
+ --gradient-header: linear-gradient(135deg, var(--color-primary) 0%, var(--color-gray-500) 100%);
659
+
660
+ /* Semantic UI Tokens - Dark Mode (derive from semantic tokens) */
661
+ --header-text: var(--text-primary);
662
+ --header-control-text: var(--header-text);
663
+ --header-control-focus: var(--header-text);
664
+ --header-control-bg: color-mix(in srgb, var(--header-text) 14%, transparent);
665
+ --header-control-bg-hover: color-mix(in srgb, var(--header-text) 22%, transparent);
666
+ --header-control-bg-active: color-mix(in srgb, var(--header-text) 30%, transparent);
667
+ --header-progress-track: color-mix(in srgb, var(--header-text) 32%, transparent);
668
+ --header-progress-fill: var(--header-text);
669
+ --header-dark-bg: linear-gradient(135deg, var(--bg-surface) 0%, var(--bg-page) 100%);
670
+ --header-dark-text: var(--color-gray-100);
671
+ --header-dark-border: var(--border-strong);
672
+ --color-on-warning: #111827;
673
+ --color-on-danger: #ffffff;
674
+ --sidebar-bg: var(--bg-surface);
675
+ --sidebar-text: var(--text-body);
676
+ --sidebar-border: var(--border-default);
677
+ --sidebar-muted-text: var(--text-muted);
678
+ --sidebar-scrollbar-thumb: var(--color-gray-500);
679
+ --sidebar-scrollbar-thumb-hover: var(--color-gray-400);
680
+ --sidebar-backdrop: color-mix(in srgb, var(--palette-black) 38%, transparent);
681
+ --footer-bg: var(--bg-surface);
682
+ --footer-text: var(--text-primary);
683
+ --footer-border: var(--border-default);
684
+ --footer-floating-bg: var(--bg-elevated);
685
+ --footer-floating-border: var(--border-strong);
686
+ --footer-floating-shadow: var(--shadow-xl);
687
+ --nav-btn-bg: var(--bg-surface);
688
+ --nav-btn-text: var(--text-primary);
689
+ --nav-btn-border: var(--border-strong);
690
+ --nav-btn-hover-bg: var(--bg-surface-hover);
691
+ --nav-btn-hover-text: var(--text-primary);
692
+ --nav-btn-hover-border: color-mix(in srgb, var(--color-secondary) 45%, var(--bg-surface));
693
+ --nav-btn-disabled-bg: color-mix(in srgb, var(--bg-surface-active) 74%, var(--bg-surface));
694
+ --nav-btn-disabled-text: color-mix(in srgb, var(--text-muted) 86%, var(--bg-surface));
695
+ --nav-btn-disabled-border: color-mix(in srgb, var(--border-strong) 72%, var(--bg-surface));
696
+ --nav-edge-bg: color-mix(in srgb, var(--bg-surface) 88%, transparent);
697
+ --nav-edge-bg-hover: var(--bg-surface-hover);
698
+ --nav-edge-border: color-mix(in srgb, var(--text-primary) 26%, transparent);
699
+ --nav-edge-shadow: var(--shadow-lg);
700
+ --nav-edge-shadow-hover: var(--shadow-xl);
701
+ --nav-btn-edge-opacity: 0.6;
702
+ --nav-btn-edge-opacity-disabled: 0.24;
703
+ }
704
+
705
+ /* ============================================================================
706
+ END GLOBAL DESIGN TOKENS
707
+ ============================================================================ */