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,442 @@
1
+ /* ============================================================================
2
+ DECORATIVE UTILITIES - Dividers, background patterns, and visual elements
3
+ ============================================================================
4
+
5
+ PURPOSE: Utility classes for adding visual polish and breaking up content
6
+
7
+ INCLUDES:
8
+ - Decorative dividers (dotted, dashed, gradient, etc.)
9
+ - Background pattern utilities
10
+ - Border decorations
11
+ - Section decorations
12
+
13
+ DEPENDENCIES:
14
+ - Requires: design-tokens.css (for color and spacing variables)
15
+
16
+ USAGE:
17
+ <hr class="divider divider-gradient">
18
+ <section class="bg-dots">...</section>
19
+
20
+ ============================================================================ */
21
+
22
+ /* ============================================================================
23
+ DECORATIVE DIVIDERS
24
+ ============================================================================ */
25
+
26
+ /* Base divider - horizontal rule reset */
27
+ .divider {
28
+ border: none;
29
+ height: 1px;
30
+ background: var(--bg-inset);
31
+ }
32
+
33
+ /* Dotted divider */
34
+ .divider-dotted {
35
+ height: 0;
36
+ border: none;
37
+ border-top: 2px dotted var(--color-gray-300);
38
+ background: transparent;
39
+ }
40
+
41
+ /* Dashed divider */
42
+ .divider-dashed {
43
+ height: 0;
44
+ border: none;
45
+ border-top: 2px dashed var(--color-gray-300);
46
+ background: transparent;
47
+ }
48
+
49
+ /* Gradient fade divider */
50
+ .divider-gradient {
51
+ height: 2px;
52
+ background: linear-gradient(
53
+ to right,
54
+ transparent,
55
+ var(--color-gray-300) 20%,
56
+ var(--color-gray-300) 80%,
57
+ transparent
58
+ );
59
+ }
60
+
61
+ /* Accent gradient divider */
62
+ .divider-accent {
63
+ height: 3px;
64
+ background: var(--gradient-primary);
65
+ }
66
+
67
+ /* Thick decorative divider */
68
+ .divider-thick {
69
+ height: 4px;
70
+ background: var(--bg-inset);
71
+ border-radius: var(--radius-full);
72
+ }
73
+
74
+ /* Icon divider - centered icon with lines */
75
+ .divider-icon {
76
+ display: flex;
77
+ align-items: center;
78
+ text-align: center;
79
+ color: var(--color-gray-400);
80
+ }
81
+
82
+ .divider-icon::before,
83
+ .divider-icon::after {
84
+ content: '';
85
+ flex: 1;
86
+ height: 1px;
87
+ background: var(--bg-inset);
88
+ }
89
+
90
+ .divider-icon::before {
91
+ margin-right: var(--space-4);
92
+ }
93
+
94
+ .divider-icon::after {
95
+ margin-left: var(--space-4);
96
+ }
97
+
98
+ /* ============================================================================
99
+ BACKGROUND PATTERN UTILITIES
100
+ ============================================================================
101
+ Subtle background patterns for sections.
102
+ Note: These use CSS-only patterns for performance.
103
+ ============================================================================ */
104
+
105
+ /* Subtle dot pattern */
106
+ .bg-dots {
107
+ background-image: radial-gradient(
108
+ circle,
109
+ var(--color-gray-200) 1px,
110
+ transparent 1px
111
+ );
112
+ background-size: 20px 20px;
113
+ }
114
+
115
+ /* Grid line pattern */
116
+ .bg-grid {
117
+ background-image:
118
+ linear-gradient(var(--color-gray-100) 1px, transparent 1px),
119
+ linear-gradient(90deg, var(--color-gray-100) 1px, transparent 1px);
120
+ background-size: 24px 24px;
121
+ }
122
+
123
+ /* Diagonal lines pattern */
124
+ .bg-diagonal {
125
+ background-image: repeating-linear-gradient(
126
+ 45deg,
127
+ transparent,
128
+ transparent 10px,
129
+ var(--color-gray-50) 10px,
130
+ var(--color-gray-50) 20px
131
+ );
132
+ }
133
+
134
+ /* Soft gradient wash */
135
+ .bg-gradient-subtle {
136
+ background: linear-gradient(
137
+ 180deg,
138
+ var(--color-gray-50) 0%,
139
+ transparent 100%
140
+ );
141
+ }
142
+
143
+ /* Primary color gradient wash */
144
+ .bg-gradient-primary {
145
+ background: linear-gradient(
146
+ 135deg,
147
+ var(--color-primary-alpha-10) 0%,
148
+ transparent 100%
149
+ );
150
+ }
151
+
152
+ /* Dark gradient backgrounds - designed for white text */
153
+ .bg-gradient-dark {
154
+ background: var(--gradient-header);
155
+ color: var(--color-white);
156
+ }
157
+
158
+ .bg-gradient-dark-primary {
159
+ background: linear-gradient(135deg, var(--color-primary), var(--color-primary-dark));
160
+ color: var(--color-white);
161
+ }
162
+
163
+ .bg-gradient-dark-secondary {
164
+ background: linear-gradient(135deg, var(--color-secondary), var(--color-secondary-dark));
165
+ color: var(--color-gray-900);
166
+ }
167
+
168
+ .bg-gradient-dark-accent {
169
+ background: linear-gradient(135deg, var(--color-accent), var(--color-accent-dark));
170
+ color: var(--color-gray-900);
171
+ }
172
+
173
+ /* Gradient token utilities - apply predefined gradient tokens directly */
174
+ .gradient-header {
175
+ background: var(--gradient-header);
176
+ color: var(--color-white);
177
+ }
178
+
179
+ .gradient-success {
180
+ background: var(--gradient-success);
181
+ color: var(--color-white);
182
+ }
183
+
184
+ .gradient-progress {
185
+ background: var(--gradient-progress);
186
+ color: var(--color-white);
187
+ }
188
+
189
+ .gradient-subtle {
190
+ background: var(--gradient-subtle);
191
+ }
192
+
193
+ /* ============================================================================
194
+ CUSTOM GRADIENT UTILITY
195
+ ============================================================================
196
+
197
+ Flexible gradient builder using CSS custom properties.
198
+ Set --gradient-from and --gradient-to to any color token.
199
+
200
+ Usage:
201
+ <div class="gradient" style="--gradient-from: var(--color-primary); --gradient-to: var(--color-secondary);">
202
+
203
+ Or with data attributes for common patterns:
204
+ <div class="gradient" data-gradient="primary-secondary">
205
+ <div class="gradient" data-gradient="primary-dark">
206
+ <div class="gradient" data-gradient="secondary-accent">
207
+
208
+ ============================================================================ */
209
+
210
+ .gradient {
211
+ --gradient-from: var(--color-primary);
212
+ --gradient-to: var(--color-primary-dark);
213
+ --gradient-angle: 135deg;
214
+ background: linear-gradient(var(--gradient-angle), var(--gradient-from), var(--gradient-to));
215
+ color: var(--color-white);
216
+ }
217
+
218
+ /* Ensure text inside gradients inherits white color (overrides heading defaults) */
219
+ .gradient h1, .gradient h2, .gradient h3, .gradient h4, .gradient h5, .gradient h6,
220
+ .gradient p, .gradient span, .gradient a, .gradient li {
221
+ color: inherit;
222
+ }
223
+
224
+ /* Common gradient presets via data attribute */
225
+ .gradient[data-gradient="primary-secondary"] {
226
+ --gradient-from: var(--color-primary);
227
+ --gradient-to: var(--color-secondary);
228
+ }
229
+
230
+ .gradient[data-gradient="primary-dark"] {
231
+ --gradient-from: var(--color-primary);
232
+ --gradient-to: var(--color-primary-dark);
233
+ }
234
+
235
+ .gradient[data-gradient="secondary-dark"] {
236
+ --gradient-from: var(--color-secondary);
237
+ --gradient-to: var(--color-secondary-dark);
238
+ }
239
+
240
+ .gradient[data-gradient="secondary-accent"] {
241
+ --gradient-from: var(--color-secondary);
242
+ --gradient-to: var(--color-accent);
243
+ }
244
+
245
+ .gradient[data-gradient="accent-dark"] {
246
+ --gradient-from: var(--color-accent);
247
+ --gradient-to: var(--color-accent-dark);
248
+ }
249
+
250
+ .gradient[data-gradient="success"] {
251
+ --gradient-from: var(--color-success);
252
+ --gradient-to: var(--color-accent-dark);
253
+ }
254
+
255
+ .gradient[data-gradient="info"] {
256
+ --gradient-from: var(--color-info);
257
+ --gradient-to: var(--color-primary);
258
+ }
259
+
260
+ .gradient[data-gradient="warning"] {
261
+ --gradient-from: var(--color-warning);
262
+ --gradient-to: var(--color-warning-hover);
263
+ }
264
+
265
+ .gradient[data-gradient="error"] {
266
+ --gradient-from: var(--color-danger);
267
+ --gradient-to: var(--color-danger-hover);
268
+ }
269
+
270
+ /* Light gradient variant (for light backgrounds, dark text) */
271
+ .gradient-light {
272
+ --gradient-from: var(--color-primary-light);
273
+ --gradient-to: var(--color-secondary-light);
274
+ --gradient-angle: 135deg;
275
+ background: linear-gradient(var(--gradient-angle), var(--gradient-from), var(--gradient-to));
276
+ color: var(--text-primary);
277
+ }
278
+
279
+ /* Ensure text inside light gradients inherits dark color */
280
+ .gradient-light h1, .gradient-light h2, .gradient-light h3, .gradient-light h4, .gradient-light h5, .gradient-light h6,
281
+ .gradient-light p, .gradient-light span, .gradient-light a, .gradient-light li {
282
+ color: inherit;
283
+ }
284
+
285
+ /* Gradient angle modifiers */
286
+ .gradient-horizontal, .gradient-light.gradient-horizontal {
287
+ --gradient-angle: 90deg;
288
+ }
289
+
290
+ .gradient-vertical, .gradient-light.gradient-vertical {
291
+ --gradient-angle: 180deg;
292
+ }
293
+
294
+ .gradient-diagonal, .gradient-light.gradient-diagonal {
295
+ --gradient-angle: 135deg;
296
+ }
297
+
298
+ .gradient-radial {
299
+ background: radial-gradient(circle, var(--gradient-from), var(--gradient-to));
300
+ }
301
+
302
+ /* ============================================================================
303
+ BORDER DECORATIONS
304
+ ============================================================================ */
305
+
306
+ /* Gradient border effect using pseudo-element */
307
+ .border-gradient {
308
+ position: relative;
309
+ border: none;
310
+ }
311
+
312
+ .border-gradient::before {
313
+ content: '';
314
+ position: absolute;
315
+ inset: 0;
316
+ padding: 2px;
317
+ background: var(--gradient-primary);
318
+ -webkit-mask:
319
+ linear-gradient(#fff 0 0) content-box,
320
+ linear-gradient(#fff 0 0);
321
+ -webkit-mask-composite: xor;
322
+ mask-composite: exclude;
323
+ border-radius: inherit;
324
+ pointer-events: none;
325
+ }
326
+
327
+ /* Double line border */
328
+ .border-double {
329
+ border: 4px double var(--color-gray-300);
330
+ }
331
+
332
+ /* Dashed border */
333
+ .border-dashed {
334
+ border: 2px dashed var(--color-gray-300);
335
+ }
336
+
337
+ /* ============================================================================
338
+ SECTION DECORATIONS
339
+ ============================================================================ */
340
+
341
+ /* Decorative corner elements */
342
+ .section-decorated {
343
+ position: relative;
344
+ }
345
+
346
+ .section-decorated::before,
347
+ .section-decorated::after {
348
+ content: '';
349
+ position: absolute;
350
+ width: 40px;
351
+ height: 40px;
352
+ border-color: var(--color-primary-alpha-30);
353
+ border-style: solid;
354
+ }
355
+
356
+ .section-decorated::before {
357
+ top: 0;
358
+ left: 0;
359
+ border-width: 3px 0 0 3px;
360
+ border-radius: var(--radius-lg) 0 0 0;
361
+ }
362
+
363
+ .section-decorated::after {
364
+ bottom: 0;
365
+ right: 0;
366
+ border-width: 0 3px 3px 0;
367
+ border-radius: 0 0 var(--radius-lg) 0;
368
+ }
369
+
370
+ /* Wave pattern at top (using SVG data URI) */
371
+ .section-wave-top {
372
+ position: relative;
373
+ padding-top: 40px;
374
+ }
375
+
376
+ .section-wave-top::before {
377
+ content: '';
378
+ position: absolute;
379
+ top: 0;
380
+ left: 0;
381
+ right: 0;
382
+ height: 40px;
383
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1200 40' preserveAspectRatio='none'%3E%3Cpath fill='%23f3f4f6' d='M0,40 L0,20 Q300,0 600,20 T1200,20 L1200,40 Z'/%3E%3C/svg%3E");
384
+ background-size: 100% 100%;
385
+ }
386
+
387
+ /* Wave pattern at bottom */
388
+ .section-wave-bottom {
389
+ position: relative;
390
+ padding-bottom: 40px;
391
+ }
392
+
393
+ .section-wave-bottom::after {
394
+ content: '';
395
+ position: absolute;
396
+ bottom: 0;
397
+ left: 0;
398
+ right: 0;
399
+ height: 40px;
400
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1200 40' preserveAspectRatio='none'%3E%3Cpath fill='%23f3f4f6' d='M0,0 L0,20 Q300,40 600,20 T1200,20 L1200,0 Z'/%3E%3C/svg%3E");
401
+ background-size: 100% 100%;
402
+ }
403
+
404
+ /* Angled top edge */
405
+ .section-angle-top {
406
+ position: relative;
407
+ margin-top: 40px;
408
+ }
409
+
410
+ .section-angle-top::before {
411
+ content: '';
412
+ position: absolute;
413
+ top: -40px;
414
+ left: 0;
415
+ right: 0;
416
+ height: 40px;
417
+ background: linear-gradient(
418
+ to bottom right,
419
+ transparent 49.5%,
420
+ var(--color-gray-50) 50%
421
+ );
422
+ }
423
+
424
+ /* Angled bottom edge */
425
+ .section-angle-bottom {
426
+ position: relative;
427
+ margin-bottom: 40px;
428
+ }
429
+
430
+ .section-angle-bottom::after {
431
+ content: '';
432
+ position: absolute;
433
+ bottom: -40px;
434
+ left: 0;
435
+ right: 0;
436
+ height: 40px;
437
+ background: linear-gradient(
438
+ to top right,
439
+ var(--color-gray-50) 49.5%,
440
+ transparent 50%
441
+ );
442
+ }
@@ -0,0 +1,257 @@
1
+ /* ============================================================================
2
+ DISPLAY UTILITIES - Display, visibility, overflow, position, width/height
3
+ ============================================================================
4
+
5
+ PURPOSE: Utility classes for controlling element display and positioning
6
+
7
+ INCLUDES:
8
+ - Display utilities (block, inline, flex, grid, none)
9
+ - Visibility utilities (visible, invisible)
10
+ - Overflow utilities (auto, hidden, scroll)
11
+ - Position utilities (relative, absolute, fixed, sticky)
12
+ - Width & height utilities (full, auto)
13
+ - Responsive visibility utilities (hide/show per breakpoint)
14
+
15
+ DEPENDENCIES:
16
+ - Responsive utilities require breakpoint classes on <html> element
17
+ - Breakpoint classes are added by JavaScript
18
+
19
+ USAGE: Apply classes directly to elements for layout control
20
+
21
+ BREAKPOINTS:
22
+ - Mobile: bp-max-mobile-landscape (<=767px)
23
+ - Tablet: bp-max-tablet-portrait (<=1023px)
24
+ - Desktop: bp-min-large-desktop (>=1440px)
25
+
26
+ ============================================================================ */
27
+
28
+ /* Display Utilities */
29
+ .block { display: block; }
30
+ .inline { display: inline; }
31
+ .inline-block { display: inline-block; }
32
+ .hidden { display: none; }
33
+
34
+ /* Visibility */
35
+ .visible { visibility: visible; }
36
+ .invisible { visibility: hidden; }
37
+
38
+ /* Overflow */
39
+ .overflow-auto { overflow: auto; }
40
+ .overflow-hidden { overflow: hidden; }
41
+ .overflow-scroll { overflow: scroll; }
42
+ .overflow-x-auto { overflow-x: auto; }
43
+ .overflow-y-auto { overflow-y: auto; }
44
+
45
+ /* Position */
46
+ .relative { position: relative; }
47
+ .absolute { position: absolute; }
48
+
49
+ /* NOTE: position:fixed and position:sticky are NOT available in SCORM iframes */
50
+ /* Reason: These can escape iframe boundaries and break parent window UI */
51
+ /* Alternative: Use position:absolute within positioned parent container */
52
+
53
+ /* Width & Height */
54
+ .w-full { width: 100%; }
55
+ .w-auto { width: auto; }
56
+ .h-full { height: 100%; }
57
+ .h-auto { height: auto; }
58
+
59
+ /* Min-Height Utilities */
60
+ .min-h-sm { min-height: 150px; }
61
+ .min-h-md { min-height: 250px; }
62
+ .min-h-lg { min-height: 400px; }
63
+ .min-h-xl { min-height: 600px; }
64
+
65
+ /* Cursor Utilities */
66
+ .cursor-auto { cursor: auto; }
67
+ .cursor-default { cursor: default; }
68
+ .cursor-pointer { cursor: pointer; }
69
+ .cursor-not-allowed { cursor: not-allowed; }
70
+ .cursor-text { cursor: text; }
71
+ .cursor-move { cursor: move; }
72
+ .cursor-grab { cursor: grab; }
73
+
74
+ /* Pointer Events Utilities */
75
+ .pointer-events-none { pointer-events: none; }
76
+ .pointer-events-auto { pointer-events: auto; }
77
+
78
+ /* User Select Utilities */
79
+ .select-none { user-select: none; }
80
+ .select-text { user-select: text; }
81
+ .select-all { user-select: all; }
82
+ .select-auto { user-select: auto; }
83
+
84
+ /* Opacity */
85
+ .opacity-0 { opacity: 0; }
86
+ .opacity-25 { opacity: 0.25; }
87
+ .opacity-50 { opacity: 0.5; }
88
+ .opacity-75 { opacity: 0.75; }
89
+ .opacity-100 { opacity: 1; }
90
+
91
+
92
+ /* ============================================================================
93
+ RESPONSIVE VISIBILITY UTILITIES
94
+ Hide/show elements based on breakpoint classes
95
+ ============================================================================ */
96
+
97
+ /* ----------------------------------------
98
+ Hide on specific device types
99
+ ---------------------------------------- */
100
+
101
+ /* Hide on mobile (<=767px) */
102
+ html.bp-max-mobile-landscape .hide-mobile {
103
+ display: none !important;
104
+ }
105
+
106
+ /* Hide on tablet (768px - 1023px) */
107
+ html.bp-max-tablet-portrait:not(.bp-max-mobile-landscape) .hide-tablet {
108
+ display: none !important;
109
+ }
110
+
111
+ /* Hide on desktop (>=1024px) - when NOT on tablet or mobile */
112
+ html:not(.bp-max-tablet-portrait) .hide-desktop {
113
+ display: none !important;
114
+ }
115
+
116
+
117
+ /* ----------------------------------------
118
+ Show ONLY on specific device types
119
+ ---------------------------------------- */
120
+
121
+ /* Show only on mobile - hidden by default, shown on mobile */
122
+ .show-mobile-only {
123
+ display: none !important;
124
+ }
125
+
126
+ html.bp-max-mobile-landscape .show-mobile-only {
127
+ display: block !important;
128
+ }
129
+
130
+ html.bp-max-mobile-landscape .show-mobile-only.flex,
131
+ html.bp-max-mobile-landscape span.show-mobile-only,
132
+ html.bp-max-mobile-landscape a.show-mobile-only {
133
+ display: flex !important;
134
+ }
135
+
136
+ html.bp-max-mobile-landscape span.show-mobile-only,
137
+ html.bp-max-mobile-landscape a.show-mobile-only {
138
+ display: inline !important;
139
+ }
140
+
141
+ /* Show only on tablet - hidden by default, shown on tablet */
142
+ .show-tablet-only {
143
+ display: none !important;
144
+ }
145
+
146
+ html.bp-max-tablet-portrait:not(.bp-max-mobile-landscape) .show-tablet-only {
147
+ display: block !important;
148
+ }
149
+
150
+ html.bp-max-tablet-portrait:not(.bp-max-mobile-landscape) .show-tablet-only.flex {
151
+ display: flex !important;
152
+ }
153
+
154
+ /* Show only on desktop - hidden by default, shown on desktop */
155
+ .show-desktop-only {
156
+ display: none !important;
157
+ }
158
+
159
+ html:not(.bp-max-tablet-portrait) .show-desktop-only {
160
+ display: block !important;
161
+ }
162
+
163
+ html:not(.bp-max-tablet-portrait) .show-desktop-only.flex {
164
+ display: flex !important;
165
+ }
166
+
167
+
168
+ /* ----------------------------------------
169
+ Responsive alignment utilities
170
+ ---------------------------------------- */
171
+
172
+ /* Center text on mobile, left-aligned on larger screens */
173
+ html.bp-max-mobile-landscape .text-center-mobile {
174
+ text-align: center !important;
175
+ }
176
+
177
+ /* Left align on mobile */
178
+ html.bp-max-mobile-landscape .text-left-mobile {
179
+ text-align: left !important;
180
+ }
181
+
182
+ /* Right align on mobile */
183
+ html.bp-max-mobile-landscape .text-right-mobile {
184
+ text-align: right !important;
185
+ }
186
+
187
+
188
+ /* ----------------------------------------
189
+ Responsive stacking utilities
190
+ ---------------------------------------- */
191
+
192
+ /* Stack flex items vertically on mobile */
193
+ html.bp-max-mobile-landscape .stack-mobile {
194
+ flex-direction: column !important;
195
+ }
196
+
197
+ /* Stack flex items vertically on tablet and below */
198
+ html.bp-max-tablet-portrait .stack-tablet {
199
+ flex-direction: column !important;
200
+ }
201
+
202
+ /* Reverse stack order on mobile */
203
+ html.bp-max-mobile-landscape .stack-mobile-reverse {
204
+ flex-direction: column-reverse !important;
205
+ }
206
+
207
+
208
+ /* ----------------------------------------
209
+ CSS Media Query Fallbacks
210
+ In case JavaScript breakpoint classes fail to load
211
+ ---------------------------------------- */
212
+
213
+ @media (max-width: 767px) {
214
+ /* Fallback for hide-mobile */
215
+ .hide-mobile-fallback {
216
+ display: none !important;
217
+ }
218
+
219
+ /* Fallback for show-mobile-only */
220
+ .show-mobile-only-fallback {
221
+ display: block !important;
222
+ }
223
+
224
+ /* Fallback text alignment */
225
+ .text-center-mobile-fallback {
226
+ text-align: center !important;
227
+ }
228
+
229
+ /* Fallback stacking */
230
+ .stack-mobile-fallback {
231
+ flex-direction: column !important;
232
+ }
233
+ }
234
+
235
+ @media (min-width: 768px) and (max-width: 1023px) {
236
+ /* Fallback for hide-tablet */
237
+ .hide-tablet-fallback {
238
+ display: none !important;
239
+ }
240
+
241
+ /* Fallback for show-tablet-only */
242
+ .show-tablet-only-fallback {
243
+ display: block !important;
244
+ }
245
+ }
246
+
247
+ @media (min-width: 1024px) {
248
+ /* Fallback for hide-desktop */
249
+ .hide-desktop-fallback {
250
+ display: none !important;
251
+ }
252
+
253
+ /* Fallback for show-desktop-only */
254
+ .show-desktop-only-fallback {
255
+ display: block !important;
256
+ }
257
+ }