explico 0.13.0 → 0.14.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 (239) hide show
  1. package/CHANGELOG.md +894 -1
  2. package/README.md +200 -30
  3. package/dist/compiler/astro.d.ts +15 -2
  4. package/dist/compiler/astro.js +40 -11
  5. package/dist/compiler/cli-main.d.ts +43 -0
  6. package/dist/compiler/cli-main.js +392 -0
  7. package/dist/compiler/cli.d.ts +424 -9
  8. package/dist/compiler/cli.js +1289 -8
  9. package/dist/compiler/collections.d.ts +88 -1
  10. package/dist/compiler/collections.js +170 -25
  11. package/dist/compiler/course-config.d.ts +1 -1
  12. package/dist/compiler/course-config.js +105 -1
  13. package/dist/compiler/decks.d.ts +161 -0
  14. package/dist/compiler/decks.js +235 -0
  15. package/dist/compiler/exports/combined-html.d.ts +5 -1
  16. package/dist/compiler/exports/deck-fit.d.ts +55 -0
  17. package/dist/compiler/exports/deck-fit.js +90 -0
  18. package/dist/compiler/exports/export-chapters.d.ts +37 -6
  19. package/dist/compiler/exports/export-chapters.js +64 -5
  20. package/dist/compiler/exports/export-pages.d.ts +30 -3
  21. package/dist/compiler/exports/export-pages.js +24 -1
  22. package/dist/compiler/exports/latex/beamerthemeexplico.sty +124 -0
  23. package/dist/compiler/exports/latex/cache.d.ts +78 -0
  24. package/dist/compiler/exports/latex/cache.js +129 -0
  25. package/dist/compiler/exports/latex/capture.d.ts +10 -1
  26. package/dist/compiler/exports/latex/capture.js +3 -1
  27. package/dist/compiler/exports/latex/compile.d.ts +13 -2
  28. package/dist/compiler/exports/latex/compile.js +12 -1
  29. package/dist/compiler/exports/latex/deck.d.ts +92 -0
  30. package/dist/compiler/exports/latex/deck.js +349 -0
  31. package/dist/compiler/exports/latex/document.d.ts +51 -6
  32. package/dist/compiler/exports/latex/document.js +71 -12
  33. package/dist/compiler/exports/latex/explico-common.sty +198 -0
  34. package/dist/compiler/exports/latex/explico.cls +13 -183
  35. package/dist/compiler/exports/latex/serialize.d.ts +60 -4
  36. package/dist/compiler/exports/latex/serialize.js +4 -2
  37. package/dist/compiler/exports/latex-export.d.ts +24 -2
  38. package/dist/compiler/exports/latex-export.js +107 -26
  39. package/dist/compiler/exports/markdown/serialize.d.ts +24 -4
  40. package/dist/compiler/exports/markdown/serialize.js +85 -8
  41. package/dist/compiler/exports/markdown-export.d.ts +6 -1
  42. package/dist/compiler/exports/markdown-export.js +50 -11
  43. package/dist/compiler/exports/standalone-html.d.ts +10 -5
  44. package/dist/compiler/exports/standalone-html.js +3 -3
  45. package/dist/compiler/exports/static-tree.d.ts +38 -1
  46. package/dist/compiler/exports/static-tree.js +120 -4
  47. package/dist/compiler/knowledge-version.d.ts +26 -2
  48. package/dist/compiler/knowledge-version.js +27 -17
  49. package/dist/compiler/lesson-derivation.d.ts +143 -6
  50. package/dist/compiler/lesson-derivation.js +145 -13
  51. package/dist/compiler/manifest.d.ts +133 -4
  52. package/dist/compiler/manifest.js +359 -58
  53. package/dist/compiler/page-versions.d.ts +160 -0
  54. package/dist/compiler/page-versions.js +198 -0
  55. package/dist/compiler/render-diagnostics.d.ts +5 -1
  56. package/dist/compiler/resolution-report.d.ts +24 -6
  57. package/dist/compiler/resolution-report.js +22 -4
  58. package/dist/compiler/validate-content.d.ts +7 -0
  59. package/dist/compiler/validate-content.js +160 -0
  60. package/dist/{course-config-rRtME5UV.d.ts → course-config-BLtIdkei.d.ts} +164 -1
  61. package/dist/curriculum/competency-graph.d.ts +54 -0
  62. package/dist/curriculum/competency-graph.js +41 -0
  63. package/dist/reference/base-library.d.mts +8 -0
  64. package/dist/reference/base-library.mjs +19 -0
  65. package/dist/reference/consistency.d.ts +8 -4
  66. package/dist/reference/consistency.js +76 -26
  67. package/dist/reference/deck-remark.d.mts +123 -0
  68. package/dist/reference/deck-remark.mjs +600 -0
  69. package/dist/reference/deck-source.d.ts +107 -0
  70. package/dist/reference/deck-source.js +140 -0
  71. package/dist/reference/decks-validate.d.ts +133 -0
  72. package/dist/reference/decks-validate.js +359 -0
  73. package/dist/reference/derived-entries.d.ts +5 -1
  74. package/dist/reference/diagram-fit.d.ts +1 -1
  75. package/dist/reference/figure-symbols.d.ts +23 -6
  76. package/dist/reference/figure-symbols.js +51 -15
  77. package/dist/reference/float-name.d.ts +43 -0
  78. package/dist/reference/float-name.js +58 -0
  79. package/dist/reference/folds-validate.d.ts +1 -1
  80. package/dist/reference/gate-abbreviations.d.ts +1 -1
  81. package/dist/reference/gate-indices.js +5 -4
  82. package/dist/reference/gate-math.d.ts +29 -2
  83. package/dist/reference/gate-math.js +99 -18
  84. package/dist/reference/gate-part-pages.d.ts +1 -1
  85. package/dist/reference/lab-katex-validate.d.ts +10 -6
  86. package/dist/reference/lab-katex-validate.js +17 -9
  87. package/dist/reference/lab-math-scope.js +29 -4
  88. package/dist/reference/math-glyphs.d.mts +25 -0
  89. package/dist/reference/math-glyphs.mjs +189 -25
  90. package/dist/reference/page-notation.d.ts +22 -3
  91. package/dist/reference/page-notation.js +32 -10
  92. package/dist/reference/references.d.ts +14 -1
  93. package/dist/reference/references.js +13 -0
  94. package/dist/reference/registry-scope.d.mts +33 -0
  95. package/dist/reference/registry-scope.mjs +34 -0
  96. package/dist/reference/registry.js +29 -10
  97. package/dist/reference/rehype-deck.d.mts +6 -0
  98. package/dist/reference/rehype-deck.mjs +286 -0
  99. package/dist/reference/rehype-heading-anchors.d.mts +20 -0
  100. package/dist/reference/rehype-heading-anchors.mjs +48 -6
  101. package/dist/reference/remark-notation.mjs +249 -40
  102. package/dist/reference/source-lines.d.mts +12 -0
  103. package/dist/reference/source-lines.mjs +65 -0
  104. package/dist/reference/types.d.ts +28 -0
  105. package/dist/rules/catalog.d.ts +21 -4
  106. package/dist/rules/catalog.js +221 -2
  107. package/dist/rules/course-rules.d.ts +5 -1
  108. package/dist/rules/course-rules.js +17 -3
  109. package/dist/rules/course-rules.schema.json +12 -0
  110. package/dist/rules/in-effect.d.ts +13 -3
  111. package/dist/rules/in-effect.js +30 -7
  112. package/dist/rules/rules.schema.json +259 -1
  113. package/dist/rules/settings.d.ts +1 -1
  114. package/dist/session/PreferenceStore.d.ts +6 -0
  115. package/dist/session/PreferenceStore.js +18 -1
  116. package/dist/session/deck-memory.d.ts +116 -0
  117. package/dist/session/deck-memory.js +143 -0
  118. package/dist/session/reading-memory.d.ts +96 -0
  119. package/dist/session/reading-memory.js +133 -0
  120. package/docs/VERSIONING.md +21 -18
  121. package/docs/authoring/README.md +29 -9
  122. package/docs/authoring/agents.md +63 -16
  123. package/docs/authoring/components.md +15 -0
  124. package/docs/authoring/deck.md +588 -0
  125. package/docs/authoring/migrating.md +1087 -14
  126. package/docs/authoring/notation.md +49 -6
  127. package/docs/authoring/structure.md +80 -1
  128. package/docs/authoring/versioning.md +54 -2
  129. package/docs/authoring/visualizations.md +7 -2
  130. package/docs/course-agent/AGENTS.md +37 -0
  131. package/docs/course-agent/agents/rules-reviewer.md +33 -0
  132. package/docs/course-agent/skills/draft-lesson/SKILL.md +37 -0
  133. package/docs/course-agent/skills/migrate-course/SKILL.md +31 -0
  134. package/docs/course-agent/skills/release-content/SKILL.md +24 -0
  135. package/docs/diagram-scaling.md +148 -0
  136. package/docs/privacy.md +59 -0
  137. package/package.json +8 -2
  138. package/src/compiler/astro.ts +60 -21
  139. package/src/compiler/cli-main.ts +469 -0
  140. package/src/compiler/cli.ts +1905 -16
  141. package/src/compiler/collections.ts +284 -25
  142. package/src/compiler/course-config.ts +267 -0
  143. package/src/compiler/decks.ts +455 -0
  144. package/src/compiler/exports/deck-fit.ts +127 -0
  145. package/src/compiler/exports/export-chapters.ts +105 -6
  146. package/src/compiler/exports/export-pages.ts +46 -2
  147. package/src/compiler/exports/latex/beamerthemeexplico.sty +124 -0
  148. package/src/compiler/exports/latex/cache.ts +183 -0
  149. package/src/compiler/exports/latex/capture.ts +5 -2
  150. package/src/compiler/exports/latex/compile.ts +18 -0
  151. package/src/compiler/exports/latex/deck.ts +419 -0
  152. package/src/compiler/exports/latex/document.ts +117 -21
  153. package/src/compiler/exports/latex/explico-common.sty +198 -0
  154. package/src/compiler/exports/latex/explico.cls +13 -183
  155. package/src/compiler/exports/latex/serialize.ts +25 -21
  156. package/src/compiler/exports/latex/texlive-packages.txt +6 -2
  157. package/src/compiler/exports/latex-export.ts +187 -45
  158. package/src/compiler/exports/markdown/serialize.ts +118 -9
  159. package/src/compiler/exports/markdown-export.ts +56 -11
  160. package/src/compiler/exports/standalone-html.ts +8 -7
  161. package/src/compiler/exports/static-tree.ts +175 -3
  162. package/src/compiler/knowledge-version.ts +56 -21
  163. package/src/compiler/lesson-derivation.ts +282 -16
  164. package/src/compiler/manifest.ts +558 -63
  165. package/src/compiler/page-versions.ts +359 -0
  166. package/src/compiler/resolution-report.ts +38 -7
  167. package/src/compiler/validate-content.ts +212 -0
  168. package/src/components/CourseContents.astro +124 -6
  169. package/src/components/CurriculumMap.astro +49 -1
  170. package/src/components/FloatIndex.astro +1 -1
  171. package/src/components/PartOverview.astro +51 -5
  172. package/src/components/assessments/AssessmentSet.astro +41 -15
  173. package/src/components/block-heading.ts +15 -6
  174. package/src/components/card-carry.ts +7 -4
  175. package/src/components/card-manager.ts +14 -2
  176. package/src/components/card-memory.ts +13 -9
  177. package/src/components/deck/DeckEnhancer.astro +13 -0
  178. package/src/components/deck/deck-context.ts +104 -0
  179. package/src/components/deck/deck-controller.ts +1287 -0
  180. package/src/components/deck/deck-map.ts +91 -0
  181. package/src/components/deck-lane.ts +163 -0
  182. package/src/components/diagram/Diagram.astro +131 -86
  183. package/src/components/disclosure/persisted-disclosure.ts +9 -1
  184. package/src/components/figure/Figure.astro +7 -2
  185. package/src/components/figure/FloatCaption.astro +5 -3
  186. package/src/components/fold/Fold.astro +2 -2
  187. package/src/components/notation/NotationFormula.astro +81 -11
  188. package/src/components/notation/NotationGlossary.astro +132 -1
  189. package/src/components/notation/NotationLayer.astro +29 -0
  190. package/src/components/starlight/AboutPanel.astro +186 -3
  191. package/src/components/starlight/CollapsibleSections.astro +24 -3
  192. package/src/components/starlight/DiagramEnhancer.astro +5 -1
  193. package/src/components/starlight/HeadingAnchorEnhancer.astro +1 -1
  194. package/src/components/starlight/LayoutHeader.astro +17 -0
  195. package/src/components/starlight/LayoutPageTitle.astro +110 -0
  196. package/src/components/starlight/LayoutSidebar.astro +807 -21
  197. package/src/components/starlight/LayoutSocialIcons.astro +62 -6
  198. package/src/components/starlight/LessonExportActions.astro +27 -9
  199. package/src/components/starlight/LessonFooter.astro +59 -0
  200. package/src/components/starlight/ReadingMemoryNotice.astro +114 -0
  201. package/src/components/starlight/TextSizeControl.astro +24 -13
  202. package/src/components/starlight/page-marks.ts +139 -0
  203. package/src/components/starlight/section-summary.ts +1 -1
  204. package/src/components/starlight/sidebar-editions.ts +245 -0
  205. package/src/components/table/Table.astro +15 -7
  206. package/src/content-config.ts +87 -1
  207. package/src/curriculum/competency-graph.ts +95 -0
  208. package/src/reference/base-library.mjs +19 -0
  209. package/src/reference/consistency.ts +126 -39
  210. package/src/reference/deck-remark.mjs +600 -0
  211. package/src/reference/deck-source.ts +273 -0
  212. package/src/reference/decks-validate.ts +604 -0
  213. package/src/reference/diagram-layout.ts +3 -1
  214. package/src/reference/figure-symbols.ts +108 -31
  215. package/src/reference/folds-validate.ts +1 -1
  216. package/src/reference/gate-indices.ts +5 -3
  217. package/src/reference/gate-math.ts +169 -25
  218. package/src/reference/lab-katex-validate.ts +30 -15
  219. package/src/reference/lab-math-scope.ts +34 -3
  220. package/src/reference/math-glyphs.mjs +189 -25
  221. package/src/reference/page-notation.ts +69 -15
  222. package/src/reference/references.ts +28 -0
  223. package/src/reference/registry-scope.mjs +34 -0
  224. package/src/reference/registry.ts +41 -11
  225. package/src/reference/rehype-deck.mjs +286 -0
  226. package/src/reference/rehype-heading-anchors.mjs +48 -6
  227. package/src/reference/remark-notation.mjs +249 -40
  228. package/src/reference/source-lines.mjs +65 -0
  229. package/src/reference/types.ts +28 -0
  230. package/src/rules/catalog.ts +257 -4
  231. package/src/rules/course-rules.ts +21 -1
  232. package/src/rules/in-effect.ts +54 -8
  233. package/src/session/PreferenceStore.ts +23 -0
  234. package/src/session/deck-memory.ts +263 -0
  235. package/src/session/reading-memory.ts +243 -0
  236. package/src/styles/deck.css +1150 -0
  237. package/src/styles/global.css +958 -27
  238. package/src/styles/zones.css +277 -0
  239. /package/src/{components → reference}/float-name.ts +0 -0
@@ -1,8 +1,25 @@
1
1
  ---
2
2
  import DefaultHeader from '@astrojs/starlight/components/Header.astro';
3
+ import { loadManifest } from '../../compiler/manifest';
4
+ import { APPEARANCE_DEFAULTS } from '../../compiler/course-config';
5
+ import ReadingMemoryNotice from './ReadingMemoryNotice.astro';
6
+
7
+ // The course's `appearance` (zones, slide edges): `zones.css` and
8
+ // `deck.css` read it as `:root:has([data-explico-zones='…'])`, so the first
9
+ // painted frame already has it. Without the element (a page with no
10
+ // header) the defaults apply.
11
+ const { appearance = APPEARANCE_DEFAULTS } = await loadManifest();
3
12
  ---
4
13
 
5
14
  <DefaultHeader />
15
+ <div
16
+ data-explico-appearance
17
+ data-explico-zones={appearance.zones}
18
+ data-explico-slides={appearance.slides}
19
+ hidden
20
+ >
21
+ </div>
22
+ <ReadingMemoryNotice />
6
23
 
7
24
  <script>
8
25
  import { createBrowserPreferenceStore } from '../../session/PreferenceStore';
@@ -15,6 +15,7 @@
15
15
  import DefaultPageTitle from '@astrojs/starlight/components/PageTitle.astro';
16
16
  import { loadManifest } from '../../compiler/manifest';
17
17
  import { isLessonSlug } from '../../compiler/lesson-derivation';
18
+ import { chapterSlides, deckOfRoute, partDeckOf } from '../deck/deck-context';
18
19
 
19
20
  const route = Astro.locals.starlightRoute;
20
21
  const routeSlug = route.entry.id;
@@ -31,9 +32,42 @@ const part = manifest.parts.find((entry) => entry.dir === partDir);
31
32
  const isPartPage = part !== undefined && !isLessonSlug(routeSlug);
32
33
 
33
34
  const base = import.meta.env.BASE_URL.replace(/\/$/, '');
35
+ // A deck's page (docs/authoring/deck.md) opens on its Present button; a
36
+ // chapter links to its slides — its own deck, or its section of its part's
37
+ // deck — and a part's page to the part's deck.
38
+ const deck = deckOfRoute(manifest, routeSlug);
39
+ const chapterDeck = deck || isPartPage ? undefined : chapterSlides(manifest, routeSlug);
40
+ const deckChapter = deck?.chapter
41
+ ? manifest.lessons.find((lesson) => lesson.slug === deck.chapter)
42
+ : undefined;
43
+ const partDeck = isPartPage ? partDeckOf(manifest, partDir) : undefined;
44
+ // A part's deck goes back to its part's page, when the part has one.
45
+ const deckPart = deck?.part === undefined ? undefined : manifest.parts.find((entry) => entry.dir === deck.part);
34
46
  // A part is only a link when there is a page behind its directory URL.
35
47
  const partHref =
36
48
  part?.overview && !isPartPage ? `${base}${part.link}` : undefined;
49
+
50
+ // Under the title of a chapter or a part's page, a line the sidebar's script
51
+ // shows when the page changed since this reader last opened it
52
+ // (`page-marks.ts`); hidden in the markup, and never shown without the
53
+ // reader's yes to the course remembering their reading.
54
+ const pageSlug = isPartPage ? `${partDir}/index` : routeSlug;
55
+ const changelogHref = manifest.about.changelogHref;
56
+ const tracked =
57
+ manifest.pageVersions?.record.pages[pageSlug] !== undefined &&
58
+ (manifest.readingMemory ?? 'ask') === 'ask' &&
59
+ (manifest.sidebarMarks?.changed ?? true);
60
+
61
+ // The marks a deck's page puts on its frames for a reader
62
+ // (`session/deck-memory.ts`): the sidebar's two (`sidebarMarks`), a frame not shown
63
+ // yet as a page not opened yet, and none without reading memory.
64
+ const deckMarks =
65
+ (manifest.readingMemory ?? 'ask') === 'ask'
66
+ ? [
67
+ ...((manifest.sidebarMarks?.unopened ?? true) ? ['unseen'] : []),
68
+ ...((manifest.sidebarMarks?.changed ?? true) ? ['changed'] : []),
69
+ ].join(' ')
70
+ : '';
37
71
  ---
38
72
 
39
73
  {
@@ -57,8 +91,84 @@ const partHref =
57
91
  )
58
92
  }
59
93
  <DefaultPageTitle />
94
+ {
95
+ deck && (
96
+ // Not export chrome: the deck's standalone HTML presents offline.
97
+ <div class="deck-actions not-content" data-deck-actions data-deck-marks={deckMarks || undefined}>
98
+ <button type="button" class="deck-actions__present" data-deck-present>
99
+ <svg viewBox="0 0 24 24" width="14" height="14" aria-hidden="true"><path d="M7 4l13 8-13 8z" fill="currentColor" /></svg>
100
+ Present
101
+ </button>
102
+ {deckChapter && <a href={`${base}/${deckChapter.slug}/`}>Read the chapter</a>}
103
+ {deckPart?.overview && <a href={`${base}${deckPart.link}`}>Open the part</a>}
104
+ <span class="deck-actions__count">{deck.frames.length} slides</span>
105
+ </div>
106
+ )
107
+ }
108
+ {
109
+ chapterDeck && (
110
+ <div class="deck-actions not-content" data-explico-export-chrome="deck-actions">
111
+ <a href={`${base}/${chapterDeck.path}`}>Slides for this chapter</a>
112
+ </div>
113
+ )
114
+ }
115
+ {
116
+ partDeck && (
117
+ <div class="deck-actions not-content" data-explico-export-chrome="deck-actions">
118
+ <a href={`${base}/${partDeck.slug}/`}>Slides for this part</a>
119
+ </div>
120
+ )
121
+ }
122
+ {
123
+ tracked && (
124
+ <p class="page-changed not-content" data-explico-page-changed hidden>
125
+ <span class="page-changed__mark" aria-hidden="true" />
126
+ This page changed since you last opened it.
127
+ {changelogHref && (
128
+ <>
129
+ {' '}
130
+ <a href={changelogHref}>What changed</a>
131
+ </>
132
+ )}
133
+ </p>
134
+ )
135
+ }
60
136
 
61
137
  <style>
138
+ .page-changed {
139
+ display: flex;
140
+ flex-wrap: wrap;
141
+ align-items: baseline;
142
+ gap: 0.25rem 0.45rem;
143
+ margin: 0.5rem 0 0;
144
+ color: var(--sl-color-gray-2);
145
+ font-size: var(--sl-text-sm);
146
+ line-height: 1.4;
147
+ }
148
+
149
+ .page-changed[hidden] {
150
+ display: none;
151
+ }
152
+
153
+ .page-changed__mark {
154
+ flex: none;
155
+ width: 0.4375rem;
156
+ height: 0.4375rem;
157
+ border-radius: 50%;
158
+ background: var(--sl-color-text-accent);
159
+ transform: translateY(-0.05em);
160
+ }
161
+
162
+ .page-changed a {
163
+ color: var(--sl-color-text-accent);
164
+ }
165
+
166
+ @media print {
167
+ .page-changed {
168
+ display: none;
169
+ }
170
+ }
171
+
62
172
  .lesson-breadcrumb {
63
173
  margin-block-start: 1rem;
64
174
  /* The title's own `margin-top: 1rem` would otherwise open a second gap of