@lapis-notes/lapis-plugin-docs 0.0.0-stage → 0.2.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 (197) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +188 -2
  3. package/dist/docs/DocsBlockMarkdownEditor.svelte +37 -0
  4. package/dist/docs/DocsBlockMarkdownEditor.svelte.d.ts +13 -0
  5. package/dist/docs/DocsBlockRefPicker.svelte +75 -0
  6. package/dist/docs/DocsBlockRefPicker.svelte.d.ts +11 -0
  7. package/dist/docs/DocsBookEditor.svelte +141 -0
  8. package/dist/docs/DocsBookEditor.svelte.d.ts +10 -0
  9. package/dist/docs/DocsBookNavigation.svelte +838 -0
  10. package/dist/docs/DocsBookNavigation.svelte.d.ts +11 -0
  11. package/dist/docs/DocsBooksColumn.svelte +82 -0
  12. package/dist/docs/DocsBooksColumn.svelte.d.ts +10 -0
  13. package/dist/docs/DocsCardBackMatter.svelte +32 -0
  14. package/dist/docs/DocsCardBackMatter.svelte.d.ts +10 -0
  15. package/dist/docs/DocsCardBlockExtra.svelte +43 -0
  16. package/dist/docs/DocsCardBlockExtra.svelte.d.ts +9 -0
  17. package/dist/docs/DocsCardPreviewFlip.svelte +143 -0
  18. package/dist/docs/DocsCardPreviewFlip.svelte.d.ts +17 -0
  19. package/dist/docs/DocsCardPreviewStack.svelte +139 -0
  20. package/dist/docs/DocsCardPreviewStack.svelte.d.ts +13 -0
  21. package/dist/docs/DocsCardPrompt.svelte +33 -0
  22. package/dist/docs/DocsCardPrompt.svelte.d.ts +8 -0
  23. package/dist/docs/DocsCardReviewAnswer.svelte +45 -0
  24. package/dist/docs/DocsCardReviewAnswer.svelte.d.ts +8 -0
  25. package/dist/docs/DocsCardTagChips.svelte +19 -0
  26. package/dist/docs/DocsCardTagChips.svelte.d.ts +7 -0
  27. package/dist/docs/DocsCardsPanel.svelte +232 -0
  28. package/dist/docs/DocsCardsPanel.svelte.d.ts +17 -0
  29. package/dist/docs/DocsCardsReview.css +1050 -0
  30. package/dist/docs/DocsChapterFooter.svelte +248 -0
  31. package/dist/docs/DocsChapterFooter.svelte.d.ts +11 -0
  32. package/dist/docs/DocsChapterScrollRing.svelte +101 -0
  33. package/dist/docs/DocsChapterScrollRing.svelte.d.ts +6 -0
  34. package/dist/docs/DocsDisplayPanel.css +627 -0
  35. package/dist/docs/DocsDisplayPanel.svelte +78 -0
  36. package/dist/docs/DocsDisplayPanel.svelte.d.ts +16 -0
  37. package/dist/docs/DocsEditorPanel.css +325 -0
  38. package/dist/docs/DocsEditorPanel.svelte +570 -0
  39. package/dist/docs/DocsEditorPanel.svelte.d.ts +22 -0
  40. package/dist/docs/DocsFlipCard.svelte +68 -0
  41. package/dist/docs/DocsFlipCard.svelte.d.ts +8 -0
  42. package/dist/docs/DocsFolderDirectoryList.svelte +206 -0
  43. package/dist/docs/DocsFolderDirectoryList.svelte.d.ts +14 -0
  44. package/dist/docs/DocsFolderPanel.css +357 -0
  45. package/dist/docs/DocsFolderPanel.svelte +102 -0
  46. package/dist/docs/DocsFolderPanel.svelte.d.ts +17 -0
  47. package/dist/docs/DocsLinksPanel.css +61 -0
  48. package/dist/docs/DocsLinksPanel.svelte +55 -0
  49. package/dist/docs/DocsLinksPanel.svelte.d.ts +11 -0
  50. package/dist/docs/DocsMarkdownField.svelte +93 -0
  51. package/dist/docs/DocsMarkdownField.svelte.d.ts +11 -0
  52. package/dist/docs/DocsMarkdownPreview.svelte +278 -0
  53. package/dist/docs/DocsMarkdownPreview.svelte.d.ts +17 -0
  54. package/dist/docs/DocsReviewPanel.svelte +63 -0
  55. package/dist/docs/DocsReviewPanel.svelte.d.ts +11 -0
  56. package/dist/docs/DocsRichBlock.svelte +291 -0
  57. package/dist/docs/DocsRichBlock.svelte.d.ts +13 -0
  58. package/dist/docs/DocsRichDisplay.svelte +316 -0
  59. package/dist/docs/DocsRichDisplay.svelte.d.ts +14 -0
  60. package/dist/docs/DocsSlidesPreview.css +243 -0
  61. package/dist/docs/DocsSlidesPreview.svelte +206 -0
  62. package/dist/docs/DocsSlidesPreview.svelte.d.ts +10 -0
  63. package/dist/docs/DocsWorkspace.css +570 -0
  64. package/dist/docs/DocsWorkspace.svelte +831 -0
  65. package/dist/docs/DocsWorkspace.svelte.d.ts +48 -0
  66. package/dist/docs/DocsWorkspaceToolbar.svelte +211 -0
  67. package/dist/docs/DocsWorkspaceToolbar.svelte.d.ts +27 -0
  68. package/dist/docs/candidates/ChoiceMenu.svelte +114 -0
  69. package/dist/docs/candidates/ChoiceMenu.svelte.d.ts +10 -0
  70. package/dist/docs/candidates/FlipCardDeck.svelte +817 -0
  71. package/dist/docs/candidates/FlipCardDeck.svelte.d.ts +37 -0
  72. package/dist/docs/candidates/MarkdownFloatingToc.svelte +313 -0
  73. package/dist/docs/candidates/MarkdownFloatingToc.svelte.d.ts +14 -0
  74. package/dist/docs/candidates/SearchableChoicePicker.css +161 -0
  75. package/dist/docs/candidates/SearchableChoicePicker.svelte +208 -0
  76. package/dist/docs/candidates/SearchableChoicePicker.svelte.d.ts +19 -0
  77. package/dist/docs/candidates/StructuredTable.svelte +98 -0
  78. package/dist/docs/candidates/StructuredTable.svelte.d.ts +8 -0
  79. package/dist/docs/candidates/StructuredTableEditor.svelte +374 -0
  80. package/dist/docs/candidates/StructuredTableEditor.svelte.d.ts +12 -0
  81. package/dist/docs/candidates/TagEditor.svelte +31 -0
  82. package/dist/docs/candidates/TagEditor.svelte.d.ts +14 -0
  83. package/dist/docs/candidates/WorkspaceHistoryControls.svelte +112 -0
  84. package/dist/docs/candidates/WorkspaceHistoryControls.svelte.d.ts +8 -0
  85. package/dist/docs/candidates/markdown-floating-toc.css +151 -0
  86. package/dist/docs/candidates/markdown-floating-toc.d.ts +1 -0
  87. package/dist/docs/candidates/markdown-floating-toc.js +1 -0
  88. package/dist/docs/docs-anki-import.d.ts +34 -0
  89. package/dist/docs/docs-anki-import.js +516 -0
  90. package/dist/docs/docs-book-view-model.d.ts +9 -0
  91. package/dist/docs/docs-book-view-model.js +71 -0
  92. package/dist/docs/docs-card-answer-markdown.d.ts +1 -0
  93. package/dist/docs/docs-card-answer-markdown.js +63 -0
  94. package/dist/docs/docs-card-display.d.ts +10 -0
  95. package/dist/docs/docs-card-display.js +18 -0
  96. package/dist/docs/docs-display-focus.d.ts +7 -0
  97. package/dist/docs/docs-display-focus.js +42 -0
  98. package/dist/docs/docs-document-surface.d.ts +7 -0
  99. package/dist/docs/docs-document-surface.js +25 -0
  100. package/dist/docs/docs-folder-directory.d.ts +21 -0
  101. package/dist/docs/docs-folder-directory.js +56 -0
  102. package/dist/docs/docs-link-mode.d.ts +16 -0
  103. package/dist/docs/docs-link-mode.js +94 -0
  104. package/dist/docs/docs-workspace-helpers.d.ts +25 -0
  105. package/dist/docs/docs-workspace-helpers.js +195 -0
  106. package/dist/docs/docs.tokens.css +13 -0
  107. package/dist/docs/import-anki-package.d.ts +10 -0
  108. package/dist/docs/import-anki-package.js +30 -0
  109. package/dist/docs/lapis-markdown-extensions.d.ts +9 -0
  110. package/dist/docs/lapis-markdown-extensions.js +128 -0
  111. package/dist/docs/pin-reading-chrome.d.ts +4 -0
  112. package/dist/docs/pin-reading-chrome.js +32 -0
  113. package/dist/docs/sidebar/DocsFoldersSidebar.svelte +134 -0
  114. package/dist/docs/sidebar/DocsFoldersSidebar.svelte.d.ts +15 -0
  115. package/dist/docs/sidebar/DocsLinksSidebar.svelte +105 -0
  116. package/dist/docs/sidebar/DocsLinksSidebar.svelte.d.ts +11 -0
  117. package/dist/docs/sidebar/DocsSidebar.css +346 -0
  118. package/dist/docs/sidebar/DocsSidebar.svelte +430 -0
  119. package/dist/docs/sidebar/DocsSidebar.svelte.d.ts +18 -0
  120. package/dist/docs/sidebar/DocsSidebarHost.svelte +139 -0
  121. package/dist/docs/sidebar/DocsSidebarHost.svelte.d.ts +12 -0
  122. package/dist/docs/sidebar/DocsTagsSidebar.svelte +176 -0
  123. package/dist/docs/sidebar/DocsTagsSidebar.svelte.d.ts +12 -0
  124. package/dist/docs/sidebar/docs-book-note-tree.d.ts +23 -0
  125. package/dist/docs/sidebar/docs-book-note-tree.js +88 -0
  126. package/dist/docs/sidebar/docs-note-sort.d.ts +26 -0
  127. package/dist/docs/sidebar/docs-note-sort.js +54 -0
  128. package/dist/docs/sidebar/docs-sidebar-filters.d.ts +17 -0
  129. package/dist/docs/sidebar/docs-sidebar-filters.js +74 -0
  130. package/dist/docs/sidebar/docs-sidebar-ui-storage.d.ts +24 -0
  131. package/dist/docs/sidebar/docs-sidebar-ui-storage.js +87 -0
  132. package/dist/docs/sidebar/docs-source-folder-tree.d.ts +16 -0
  133. package/dist/docs/sidebar/docs-source-folder-tree.js +143 -0
  134. package/dist/docs/sidebar/docs-tag-tree.d.ts +17 -0
  135. package/dist/docs/sidebar/docs-tag-tree.js +84 -0
  136. package/dist/docs-cards-view.d.ts +18 -0
  137. package/dist/docs-cards-view.js +52 -0
  138. package/dist/docs-document-view.d.ts +24 -0
  139. package/dist/docs-document-view.js +127 -0
  140. package/dist/docs-document-workspace.svelte +215 -0
  141. package/dist/docs-document-workspace.svelte.d.ts +16 -0
  142. package/dist/docs-index.d.ts +5 -0
  143. package/dist/docs-index.js +49 -0
  144. package/dist/docs-path.d.ts +6 -0
  145. package/dist/docs-path.js +10 -0
  146. package/dist/docs-plugin.d.ts +21 -0
  147. package/dist/docs-plugin.js +140 -0
  148. package/dist/docs-repository.d.ts +15 -0
  149. package/dist/docs-repository.js +75 -0
  150. package/dist/docs-review-view.d.ts +18 -0
  151. package/dist/docs-review-view.js +52 -0
  152. package/dist/docs-settings-tab.d.ts +8 -0
  153. package/dist/docs-settings-tab.js +25 -0
  154. package/dist/docs-settings.d.ts +17 -0
  155. package/dist/docs-settings.js +38 -0
  156. package/dist/docs-view.d.ts +22 -0
  157. package/dist/docs-view.js +51 -0
  158. package/dist/docs-workspace.svelte +394 -0
  159. package/dist/docs-workspace.svelte.d.ts +15 -0
  160. package/dist/index.d.ts +12 -0
  161. package/dist/index.js +12 -0
  162. package/dist/model/book.d.ts +6 -0
  163. package/dist/model/book.js +101 -0
  164. package/dist/model/coding-runtime.d.ts +4 -0
  165. package/dist/model/coding-runtime.js +9 -0
  166. package/dist/model/docs-card-context.d.ts +32 -0
  167. package/dist/model/docs-card-context.js +89 -0
  168. package/dist/model/docs-card-preview-stack-motion.d.ts +51 -0
  169. package/dist/model/docs-card-preview-stack-motion.js +94 -0
  170. package/dist/model/docs-media-context.d.ts +9 -0
  171. package/dist/model/docs-media-context.js +18 -0
  172. package/dist/model/docs-note-list.d.ts +8 -0
  173. package/dist/model/docs-note-list.js +25 -0
  174. package/dist/model/docs-relative-media.d.ts +30 -0
  175. package/dist/model/docs-relative-media.js +116 -0
  176. package/dist/model/docs-review-constants.d.ts +4 -0
  177. package/dist/model/docs-review-constants.js +13 -0
  178. package/dist/model/fsrs.d.ts +14 -0
  179. package/dist/model/fsrs.js +153 -0
  180. package/dist/model/graph.d.ts +12 -0
  181. package/dist/model/graph.js +169 -0
  182. package/dist/model/index.d.ts +14 -0
  183. package/dist/model/index.js +14 -0
  184. package/dist/model/markdown-normalize.d.ts +11 -0
  185. package/dist/model/markdown-normalize.js +755 -0
  186. package/dist/model/markdown.d.ts +167 -0
  187. package/dist/model/markdown.js +365 -0
  188. package/dist/model/sample.d.ts +7 -0
  189. package/dist/model/sample.js +524 -0
  190. package/dist/model/types.d.ts +328 -0
  191. package/dist/model/types.js +1 -0
  192. package/dist/model/workspace.d.ts +6 -0
  193. package/dist/model/workspace.js +81 -0
  194. package/dist/storybook.css +52 -0
  195. package/dist/styles.css +1 -0
  196. package/manifest.json +11 -0
  197. package/package.json +147 -4
@@ -0,0 +1,243 @@
1
+ .docs-slides-preview {
2
+ display: grid;
3
+ grid-template-rows: auto minmax(0, 1fr) auto;
4
+ gap: 1rem;
5
+ min-height: 0;
6
+ width: 100%;
7
+ flex: 1 1 auto;
8
+ }
9
+
10
+ .docs-slides-preview:focus-visible {
11
+ outline: 0;
12
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--docs-accent) 18%, transparent);
13
+ }
14
+
15
+ .docs-slides-preview button:hover,
16
+ .docs-slides-preview button:focus-visible {
17
+ outline: 0;
18
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--docs-accent) 18%, transparent);
19
+ }
20
+
21
+ .docs-slides-preview__toolbar,
22
+ .docs-slides-preview__toolbar > div,
23
+ .docs-slides-preview__controls,
24
+ .docs-slide-dots {
25
+ display: flex;
26
+ align-items: center;
27
+ }
28
+
29
+ .docs-slides-preview__toolbar {
30
+ justify-content: space-between;
31
+ gap: 1rem;
32
+ }
33
+
34
+ .docs-slides-preview__toolbar > div {
35
+ gap: 0.5rem;
36
+ }
37
+
38
+ .docs-slides-preview__toolbar svg {
39
+ width: 1rem;
40
+ height: 1rem;
41
+ flex: none;
42
+ }
43
+
44
+ .docs-slides-preview__toolbar span,
45
+ .docs-slide-frame--stacked > span {
46
+ color: var(--docs-muted);
47
+ font-size: 0.72rem;
48
+ font-weight: 800;
49
+ letter-spacing: 0.04em;
50
+ text-transform: uppercase;
51
+ }
52
+
53
+ .docs-slides-preview__toolbar span {
54
+ font-size: 0.82rem;
55
+ letter-spacing: 0;
56
+ text-transform: none;
57
+ }
58
+
59
+ .docs-slides-preview__controls button,
60
+ .docs-slide-dots button {
61
+ display: grid;
62
+ min-width: 2rem;
63
+ min-height: 2rem;
64
+ place-items: center;
65
+ border: 1px solid color-mix(in srgb, var(--docs-border) 82%, transparent);
66
+ border-radius: 0.5rem;
67
+ background: color-mix(in srgb, var(--docs-surface) 92%, transparent);
68
+ color: inherit;
69
+ cursor: pointer;
70
+ }
71
+
72
+ .docs-slides-preview__controls button:disabled {
73
+ cursor: default;
74
+ opacity: 0.42;
75
+ }
76
+
77
+ .docs-slide-stage {
78
+ display: grid;
79
+ min-height: 0;
80
+ place-items: center;
81
+ }
82
+
83
+ .docs-slide-frame {
84
+ aspect-ratio: 16 / 9;
85
+ box-sizing: border-box;
86
+ width: min(100%, 86rem);
87
+ max-height: 100%;
88
+ overflow: auto;
89
+ border: 1px solid color-mix(in srgb, var(--docs-border) 82%, transparent);
90
+ border-radius: 0.75rem;
91
+ background: color-mix(in srgb, var(--docs-surface) 94%, transparent);
92
+ box-shadow: 0 18px 45px color-mix(in srgb, #000 7%, transparent);
93
+ padding: clamp(1.5rem, 4.5vw, 3.25rem);
94
+ padding-top: clamp(2rem, 5.5vw, 3.75rem);
95
+ }
96
+
97
+ @supports (height: 100%) {
98
+ .docs-slide-frame {
99
+ width: auto;
100
+ min-width: min(100%, 28rem);
101
+ max-width: 100%;
102
+ height: 100%;
103
+ }
104
+ }
105
+
106
+ .docs-slide-frame--rich {
107
+ --block-accent: var(--docs-accent);
108
+ display: grid;
109
+ align-content: stretch;
110
+ border-color: color-mix(in srgb, var(--block-accent) 24%, var(--docs-border));
111
+ background:
112
+ linear-gradient(
113
+ 135deg,
114
+ color-mix(in srgb, var(--block-accent) 11%, transparent),
115
+ transparent 58%
116
+ ),
117
+ linear-gradient(
118
+ 315deg,
119
+ color-mix(in srgb, #10b981 7%, transparent),
120
+ transparent 52%
121
+ ),
122
+ color-mix(in srgb, var(--docs-surface) 95%, transparent);
123
+ }
124
+
125
+ .docs-slide-frame--concept,
126
+ .docs-slide-frame--story {
127
+ --block-accent: #7c3aed;
128
+ }
129
+
130
+ .docs-slide-frame--procedure,
131
+ .docs-slide-frame--resources {
132
+ --block-accent: #0891b2;
133
+ }
134
+
135
+ .docs-slide-frame--prompt,
136
+ .docs-slide-frame--callout {
137
+ --block-accent: #dc2626;
138
+ }
139
+
140
+ .docs-slide-frame--code,
141
+ .docs-slide-frame--table {
142
+ --block-accent: #059669;
143
+ }
144
+
145
+ .docs-slide-frame--rich .docs-rich-hero,
146
+ .docs-slide-frame--rich .docs-rich-block {
147
+ min-height: 100%;
148
+ align-content: safe center;
149
+ border: 0;
150
+ background: transparent;
151
+ box-shadow: none;
152
+ padding: 0;
153
+ }
154
+
155
+ .docs-slide-frame--rich .docs-rich-block {
156
+ overflow: visible;
157
+ }
158
+
159
+ .docs-slide-frame--rich .docs-rich-hero h1 {
160
+ max-width: 14ch;
161
+ font-size: clamp(2.2rem, 4.5vw, 4.2rem);
162
+ }
163
+
164
+ .docs-slide-frame--rich .docs-rich-block h2 {
165
+ font-size: clamp(1.55rem, 3vw, 2.65rem);
166
+ }
167
+
168
+ .docs-slide-frame--rich .docs-rich-lede,
169
+ .docs-slide-frame--rich .docs-rich-hero__summary {
170
+ font-size: clamp(1rem, 1.5vw, 1.25rem);
171
+ }
172
+
173
+ .docs-slide-frame .application-markdown-preview :is(.carta-renderer, .carta-viewer) {
174
+ min-height: 100%;
175
+ align-content: safe center;
176
+ gap: 0.85rem;
177
+ line-height: 1.65;
178
+ }
179
+
180
+ .docs-slide-frame .application-markdown-preview :is(h1, h2, h3) {
181
+ text-wrap: balance;
182
+ }
183
+
184
+ .docs-slide-frame .application-markdown-preview h1 {
185
+ font-size: clamp(2rem, 4vw, 3.6rem);
186
+ line-height: 1;
187
+ }
188
+
189
+ .docs-slide-frame .application-markdown-preview h2 {
190
+ font-size: clamp(1.45rem, 3vw, 2.4rem);
191
+ }
192
+
193
+ .docs-slide-dots {
194
+ justify-content: center;
195
+ flex-wrap: wrap;
196
+ gap: 0.4rem;
197
+ }
198
+
199
+ .docs-slide-dots button {
200
+ min-width: 1.75rem;
201
+ min-height: 1.75rem;
202
+ border-radius: 999px;
203
+ font-size: 0.72rem;
204
+ font-weight: 850;
205
+ }
206
+
207
+ .docs-slide-dots button[aria-current='true'] {
208
+ border-color: color-mix(in srgb, var(--docs-accent) 42%, var(--docs-border));
209
+ background: color-mix(in srgb, var(--docs-accent) 12%, transparent);
210
+ color: var(--docs-accent);
211
+ }
212
+
213
+ .docs-slides-stack {
214
+ display: none;
215
+ }
216
+
217
+ .docs-slide-frame--stacked {
218
+ aspect-ratio: auto;
219
+ width: 100%;
220
+ padding: 1rem;
221
+ }
222
+
223
+ @media (max-width: 720px) {
224
+ .docs-slide-stage,
225
+ .docs-slide-dots {
226
+ display: none;
227
+ }
228
+
229
+ .docs-slides-stack {
230
+ display: grid;
231
+ gap: 0.75rem;
232
+ }
233
+
234
+ .docs-slides-preview {
235
+ display: block;
236
+ }
237
+
238
+ .docs-slide-frame {
239
+ width: 100%;
240
+ height: auto;
241
+ min-width: 0;
242
+ }
243
+ }
@@ -0,0 +1,206 @@
1
+ <script lang="ts">
2
+ import ChevronLeftIcon from '@lucide/svelte/icons/chevron-left';
3
+ import ChevronRightIcon from '@lucide/svelte/icons/chevron-right';
4
+ import BookOpenIcon from '@lucide/svelte/icons/book-open';
5
+ import LayersIcon from '@lucide/svelte/icons/layers';
6
+ import Rows3Icon from '@lucide/svelte/icons/rows-3';
7
+ import TargetIcon from '@lucide/svelte/icons/target';
8
+ import type { DocsNote, DocsRevisionBlock } from '../model';
9
+ import DocsMarkdownPreview from './DocsMarkdownPreview.svelte';
10
+ import DocsRichBlock from './DocsRichBlock.svelte';
11
+ import './DocsSlidesPreview.css';
12
+ import { DOC_TYPE_LABELS } from './docs-workspace-helpers';
13
+
14
+ type RichSlide =
15
+ | { kind: 'intro'; id: string }
16
+ | { kind: 'block'; id: string; block: DocsRevisionBlock; index: number }
17
+ | { kind: 'body'; id: string };
18
+
19
+ let {
20
+ markdown,
21
+ note = null,
22
+ activeSlide = $bindable(0)
23
+ }: {
24
+ markdown: string;
25
+ note?: DocsNote | null;
26
+ activeSlide?: number;
27
+ } = $props();
28
+
29
+ const markdownSlides = $derived(splitSlides(markdown));
30
+ const richSlides = $derived(note ? buildRichSlides(note) : []);
31
+ const slideCount = $derived(note ? richSlides.length : markdownSlides.length);
32
+ const currentMarkdownSlide = $derived(markdownSlides[activeSlide] ?? '');
33
+ const currentRichSlide = $derived(richSlides[activeSlide]);
34
+
35
+ $effect(() => {
36
+ if (activeSlide >= slideCount) activeSlide = Math.max(0, slideCount - 1);
37
+ });
38
+
39
+ function stripFrontmatter(value: string) {
40
+ const trimmed = value.trim();
41
+ if (!trimmed.startsWith('---')) return trimmed;
42
+ const match = /^---\s*\n[\s\S]*?\n---\s*(?:\n|$)/.exec(trimmed);
43
+ return match ? trimmed.slice(match[0].length).trim() : trimmed;
44
+ }
45
+
46
+ function splitSlides(value: string) {
47
+ return stripFrontmatter(value)
48
+ .split(/\n\s*---\s*\n/g)
49
+ .map((slide) => slide.trim())
50
+ .filter(Boolean);
51
+ }
52
+
53
+ function selectSlide(index: number) {
54
+ activeSlide = Math.max(0, Math.min(index, slideCount - 1));
55
+ }
56
+
57
+ function buildRichSlides(value: DocsNote): RichSlide[] {
58
+ return [
59
+ { kind: 'intro', id: `${value.id}-intro` },
60
+ ...value.blocks.map((block, index) => ({
61
+ kind: 'block' as const,
62
+ id: block.id,
63
+ block,
64
+ index
65
+ })),
66
+ ...(value.body ? [{ kind: 'body' as const, id: `${value.id}-body` }] : [])
67
+ ];
68
+ }
69
+
70
+ function slideFrameClass(slide?: RichSlide) {
71
+ const kind = slide?.kind ?? 'markdown';
72
+ const blockType = slide?.kind === 'block' ? slide.block.type : kind;
73
+ return `docs-slide-frame docs-slide-frame--rich docs-slide-frame--${blockType}`;
74
+ }
75
+
76
+ </script>
77
+
78
+ {#snippet richSlide(slide: RichSlide, stacked = false)}
79
+ {#if note}
80
+ {#if slide.kind === 'intro'}
81
+ <article class="docs-rich-hero docs-rich-slide-hero">
82
+ <div class="docs-rich-hero__eyebrow">
83
+ <BookOpenIcon aria-hidden="true" />
84
+ <span>{DOC_TYPE_LABELS[note.docType] ?? note.docType}</span>
85
+ </div>
86
+ <h1>{note.title}</h1>
87
+ {#if note.summary}
88
+ <p class="docs-rich-hero__summary">{note.summary}</p>
89
+ {/if}
90
+ {#if note.learningGoal}
91
+ <div class="docs-rich-goal">
92
+ <TargetIcon aria-hidden="true" />
93
+ <div>
94
+ <span>Learning Goal</span>
95
+ <p>{note.learningGoal}</p>
96
+ </div>
97
+ </div>
98
+ {/if}
99
+ {#if note.tags.length}
100
+ <div class="docs-rich-tags" aria-label="Tags">
101
+ {#each note.tags as tag (tag)}
102
+ <span>#{tag}</span>
103
+ {/each}
104
+ </div>
105
+ {/if}
106
+ </article>
107
+ {:else if slide.kind === 'block'}
108
+ <DocsRichBlock
109
+ block={slide.block}
110
+ index={slide.index}
111
+ sectionId={`${stacked ? 'slide-stack' : 'slide'}-${slide.block.id}`}
112
+ headingIdPrefix={stacked ? 'docs-slide-stack-heading' : 'docs-slide-heading'}
113
+ extraClass="docs-rich-slide-block"
114
+ sourcePath={note.sourcePath}
115
+ />
116
+ {:else if slide.kind === 'body'}
117
+ <section class="docs-rich-block docs-rich-block--text docs-rich-additional docs-rich-slide-block">
118
+ <div class="docs-rich-block__header">
119
+ <div class="docs-rich-block__icon"><Rows3Icon aria-hidden="true" /></div>
120
+ <div>
121
+ <p>Appendix</p>
122
+ <h2>Additional Notes</h2>
123
+ </div>
124
+ </div>
125
+ <DocsMarkdownPreview value={note.body} floatingToc="off" sourcePath={note.sourcePath} />
126
+ </section>
127
+ {/if}
128
+ {/if}
129
+ {/snippet}
130
+
131
+ {#if slideCount}
132
+ <section class="docs-slides-preview" aria-label="Slides preview">
133
+ <div class="docs-slides-preview__toolbar">
134
+ <div>
135
+ <LayersIcon aria-hidden="true" />
136
+ <span>Slide {activeSlide} of {Math.max(slideCount - 1, 0)}</span>
137
+ </div>
138
+ <div class="docs-slides-preview__controls">
139
+ <button
140
+ type="button"
141
+ aria-label="Previous slide"
142
+ disabled={activeSlide === 0}
143
+ onclick={() => selectSlide(activeSlide - 1)}
144
+ >
145
+ <ChevronLeftIcon aria-hidden="true" />
146
+ </button>
147
+ <button
148
+ type="button"
149
+ aria-label="Next slide"
150
+ disabled={activeSlide === slideCount - 1}
151
+ onclick={() => selectSlide(activeSlide + 1)}
152
+ >
153
+ <ChevronRightIcon aria-hidden="true" />
154
+ </button>
155
+ </div>
156
+ </div>
157
+
158
+ <div class="docs-slide-stage">
159
+ <div class={note ? slideFrameClass(currentRichSlide) : 'docs-slide-frame'}>
160
+ {#if note && currentRichSlide}
161
+ {@render richSlide(currentRichSlide)}
162
+ {:else}
163
+ {#key `${activeSlide}:${currentMarkdownSlide}`}
164
+ <DocsMarkdownPreview
165
+ value={currentMarkdownSlide}
166
+ floatingToc="off"
167
+ sourcePath={note?.sourcePath ?? ''}
168
+ />
169
+ {/key}
170
+ {/if}
171
+ </div>
172
+ </div>
173
+
174
+ <nav class="docs-slide-dots" aria-label="Select slide">
175
+ {#each Array.from({ length: slideCount }) as _, index (index)}
176
+ <button
177
+ type="button"
178
+ aria-label={`Show slide ${index}`}
179
+ aria-current={activeSlide === index ? 'true' : undefined}
180
+ onclick={() => selectSlide(index)}
181
+ >
182
+ {index}
183
+ </button>
184
+ {/each}
185
+ </nav>
186
+
187
+ <div class="docs-slides-stack" aria-label="All slides">
188
+ {#each note ? richSlides : markdownSlides as slide, index (index)}
189
+ <article class={note ? `${slideFrameClass(slide as RichSlide)} docs-slide-frame--stacked` : 'docs-slide-frame docs-slide-frame--stacked'}>
190
+ <span>Slide {index}</span>
191
+ {#if note}
192
+ {@render richSlide(slide as RichSlide, true)}
193
+ {:else}
194
+ <DocsMarkdownPreview
195
+ value={slide as string}
196
+ floatingToc="off"
197
+ sourcePath=""
198
+ />
199
+ {/if}
200
+ </article>
201
+ {/each}
202
+ </div>
203
+ </section>
204
+ {:else}
205
+ <p class="docs-muted">No slide content yet.</p>
206
+ {/if}
@@ -0,0 +1,10 @@
1
+ import type { DocsNote } from '../model';
2
+ import './DocsSlidesPreview.css';
3
+ type $$ComponentProps = {
4
+ markdown: string;
5
+ note?: DocsNote | null;
6
+ activeSlide?: number;
7
+ };
8
+ declare const DocsSlidesPreview: import("svelte").Component<$$ComponentProps, {}, "activeSlide">;
9
+ type DocsSlidesPreview = ReturnType<typeof DocsSlidesPreview>;
10
+ export default DocsSlidesPreview;