@lapis-notes/lapis-plugin-docs 0.0.0-stage → 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 (196) hide show
  1. package/README.md +188 -2
  2. package/dist/docs/DocsBlockMarkdownEditor.svelte +37 -0
  3. package/dist/docs/DocsBlockMarkdownEditor.svelte.d.ts +13 -0
  4. package/dist/docs/DocsBlockRefPicker.svelte +75 -0
  5. package/dist/docs/DocsBlockRefPicker.svelte.d.ts +11 -0
  6. package/dist/docs/DocsBookEditor.svelte +141 -0
  7. package/dist/docs/DocsBookEditor.svelte.d.ts +10 -0
  8. package/dist/docs/DocsBookNavigation.svelte +838 -0
  9. package/dist/docs/DocsBookNavigation.svelte.d.ts +11 -0
  10. package/dist/docs/DocsBooksColumn.svelte +82 -0
  11. package/dist/docs/DocsBooksColumn.svelte.d.ts +10 -0
  12. package/dist/docs/DocsCardBackMatter.svelte +32 -0
  13. package/dist/docs/DocsCardBackMatter.svelte.d.ts +10 -0
  14. package/dist/docs/DocsCardBlockExtra.svelte +43 -0
  15. package/dist/docs/DocsCardBlockExtra.svelte.d.ts +9 -0
  16. package/dist/docs/DocsCardPreviewFlip.svelte +143 -0
  17. package/dist/docs/DocsCardPreviewFlip.svelte.d.ts +17 -0
  18. package/dist/docs/DocsCardPreviewStack.svelte +135 -0
  19. package/dist/docs/DocsCardPreviewStack.svelte.d.ts +13 -0
  20. package/dist/docs/DocsCardPrompt.svelte +33 -0
  21. package/dist/docs/DocsCardPrompt.svelte.d.ts +8 -0
  22. package/dist/docs/DocsCardReviewAnswer.svelte +45 -0
  23. package/dist/docs/DocsCardReviewAnswer.svelte.d.ts +8 -0
  24. package/dist/docs/DocsCardTagChips.svelte +19 -0
  25. package/dist/docs/DocsCardTagChips.svelte.d.ts +7 -0
  26. package/dist/docs/DocsCardsPanel.svelte +232 -0
  27. package/dist/docs/DocsCardsPanel.svelte.d.ts +17 -0
  28. package/dist/docs/DocsCardsReview.css +1050 -0
  29. package/dist/docs/DocsChapterFooter.svelte +248 -0
  30. package/dist/docs/DocsChapterFooter.svelte.d.ts +11 -0
  31. package/dist/docs/DocsChapterScrollRing.svelte +101 -0
  32. package/dist/docs/DocsChapterScrollRing.svelte.d.ts +6 -0
  33. package/dist/docs/DocsDisplayPanel.css +627 -0
  34. package/dist/docs/DocsDisplayPanel.svelte +78 -0
  35. package/dist/docs/DocsDisplayPanel.svelte.d.ts +16 -0
  36. package/dist/docs/DocsEditorPanel.css +325 -0
  37. package/dist/docs/DocsEditorPanel.svelte +570 -0
  38. package/dist/docs/DocsEditorPanel.svelte.d.ts +22 -0
  39. package/dist/docs/DocsFlipCard.svelte +68 -0
  40. package/dist/docs/DocsFlipCard.svelte.d.ts +8 -0
  41. package/dist/docs/DocsFolderDirectoryList.svelte +206 -0
  42. package/dist/docs/DocsFolderDirectoryList.svelte.d.ts +14 -0
  43. package/dist/docs/DocsFolderPanel.css +357 -0
  44. package/dist/docs/DocsFolderPanel.svelte +102 -0
  45. package/dist/docs/DocsFolderPanel.svelte.d.ts +17 -0
  46. package/dist/docs/DocsLinksPanel.css +61 -0
  47. package/dist/docs/DocsLinksPanel.svelte +55 -0
  48. package/dist/docs/DocsLinksPanel.svelte.d.ts +11 -0
  49. package/dist/docs/DocsMarkdownField.svelte +93 -0
  50. package/dist/docs/DocsMarkdownField.svelte.d.ts +11 -0
  51. package/dist/docs/DocsMarkdownPreview.svelte +278 -0
  52. package/dist/docs/DocsMarkdownPreview.svelte.d.ts +17 -0
  53. package/dist/docs/DocsReviewPanel.svelte +63 -0
  54. package/dist/docs/DocsReviewPanel.svelte.d.ts +11 -0
  55. package/dist/docs/DocsRichBlock.svelte +291 -0
  56. package/dist/docs/DocsRichBlock.svelte.d.ts +13 -0
  57. package/dist/docs/DocsRichDisplay.svelte +316 -0
  58. package/dist/docs/DocsRichDisplay.svelte.d.ts +14 -0
  59. package/dist/docs/DocsSlidesPreview.css +243 -0
  60. package/dist/docs/DocsSlidesPreview.svelte +206 -0
  61. package/dist/docs/DocsSlidesPreview.svelte.d.ts +10 -0
  62. package/dist/docs/DocsWorkspace.css +570 -0
  63. package/dist/docs/DocsWorkspace.svelte +831 -0
  64. package/dist/docs/DocsWorkspace.svelte.d.ts +48 -0
  65. package/dist/docs/DocsWorkspaceToolbar.svelte +211 -0
  66. package/dist/docs/DocsWorkspaceToolbar.svelte.d.ts +27 -0
  67. package/dist/docs/candidates/ChoiceMenu.svelte +114 -0
  68. package/dist/docs/candidates/ChoiceMenu.svelte.d.ts +10 -0
  69. package/dist/docs/candidates/FlipCardDeck.svelte +800 -0
  70. package/dist/docs/candidates/FlipCardDeck.svelte.d.ts +36 -0
  71. package/dist/docs/candidates/MarkdownFloatingToc.svelte +313 -0
  72. package/dist/docs/candidates/MarkdownFloatingToc.svelte.d.ts +14 -0
  73. package/dist/docs/candidates/SearchableChoicePicker.css +161 -0
  74. package/dist/docs/candidates/SearchableChoicePicker.svelte +208 -0
  75. package/dist/docs/candidates/SearchableChoicePicker.svelte.d.ts +19 -0
  76. package/dist/docs/candidates/StructuredTable.svelte +98 -0
  77. package/dist/docs/candidates/StructuredTable.svelte.d.ts +8 -0
  78. package/dist/docs/candidates/StructuredTableEditor.svelte +374 -0
  79. package/dist/docs/candidates/StructuredTableEditor.svelte.d.ts +12 -0
  80. package/dist/docs/candidates/TagEditor.svelte +31 -0
  81. package/dist/docs/candidates/TagEditor.svelte.d.ts +14 -0
  82. package/dist/docs/candidates/WorkspaceHistoryControls.svelte +112 -0
  83. package/dist/docs/candidates/WorkspaceHistoryControls.svelte.d.ts +8 -0
  84. package/dist/docs/candidates/markdown-floating-toc.css +151 -0
  85. package/dist/docs/candidates/markdown-floating-toc.d.ts +1 -0
  86. package/dist/docs/candidates/markdown-floating-toc.js +1 -0
  87. package/dist/docs/docs-anki-import.d.ts +34 -0
  88. package/dist/docs/docs-anki-import.js +516 -0
  89. package/dist/docs/docs-book-view-model.d.ts +9 -0
  90. package/dist/docs/docs-book-view-model.js +71 -0
  91. package/dist/docs/docs-card-answer-markdown.d.ts +1 -0
  92. package/dist/docs/docs-card-answer-markdown.js +63 -0
  93. package/dist/docs/docs-card-display.d.ts +10 -0
  94. package/dist/docs/docs-card-display.js +18 -0
  95. package/dist/docs/docs-display-focus.d.ts +7 -0
  96. package/dist/docs/docs-display-focus.js +42 -0
  97. package/dist/docs/docs-document-surface.d.ts +7 -0
  98. package/dist/docs/docs-document-surface.js +25 -0
  99. package/dist/docs/docs-folder-directory.d.ts +21 -0
  100. package/dist/docs/docs-folder-directory.js +56 -0
  101. package/dist/docs/docs-link-mode.d.ts +16 -0
  102. package/dist/docs/docs-link-mode.js +94 -0
  103. package/dist/docs/docs-workspace-helpers.d.ts +25 -0
  104. package/dist/docs/docs-workspace-helpers.js +195 -0
  105. package/dist/docs/docs.tokens.css +13 -0
  106. package/dist/docs/import-anki-package.d.ts +10 -0
  107. package/dist/docs/import-anki-package.js +30 -0
  108. package/dist/docs/lapis-markdown-extensions.d.ts +9 -0
  109. package/dist/docs/lapis-markdown-extensions.js +128 -0
  110. package/dist/docs/pin-reading-chrome.d.ts +4 -0
  111. package/dist/docs/pin-reading-chrome.js +32 -0
  112. package/dist/docs/sidebar/DocsFoldersSidebar.svelte +134 -0
  113. package/dist/docs/sidebar/DocsFoldersSidebar.svelte.d.ts +15 -0
  114. package/dist/docs/sidebar/DocsLinksSidebar.svelte +105 -0
  115. package/dist/docs/sidebar/DocsLinksSidebar.svelte.d.ts +11 -0
  116. package/dist/docs/sidebar/DocsSidebar.css +346 -0
  117. package/dist/docs/sidebar/DocsSidebar.svelte +430 -0
  118. package/dist/docs/sidebar/DocsSidebar.svelte.d.ts +18 -0
  119. package/dist/docs/sidebar/DocsSidebarHost.svelte +139 -0
  120. package/dist/docs/sidebar/DocsSidebarHost.svelte.d.ts +12 -0
  121. package/dist/docs/sidebar/DocsTagsSidebar.svelte +176 -0
  122. package/dist/docs/sidebar/DocsTagsSidebar.svelte.d.ts +12 -0
  123. package/dist/docs/sidebar/docs-book-note-tree.d.ts +23 -0
  124. package/dist/docs/sidebar/docs-book-note-tree.js +88 -0
  125. package/dist/docs/sidebar/docs-note-sort.d.ts +26 -0
  126. package/dist/docs/sidebar/docs-note-sort.js +54 -0
  127. package/dist/docs/sidebar/docs-sidebar-filters.d.ts +17 -0
  128. package/dist/docs/sidebar/docs-sidebar-filters.js +74 -0
  129. package/dist/docs/sidebar/docs-sidebar-ui-storage.d.ts +24 -0
  130. package/dist/docs/sidebar/docs-sidebar-ui-storage.js +87 -0
  131. package/dist/docs/sidebar/docs-source-folder-tree.d.ts +16 -0
  132. package/dist/docs/sidebar/docs-source-folder-tree.js +143 -0
  133. package/dist/docs/sidebar/docs-tag-tree.d.ts +17 -0
  134. package/dist/docs/sidebar/docs-tag-tree.js +84 -0
  135. package/dist/docs-cards-view.d.ts +18 -0
  136. package/dist/docs-cards-view.js +52 -0
  137. package/dist/docs-document-view.d.ts +24 -0
  138. package/dist/docs-document-view.js +127 -0
  139. package/dist/docs-document-workspace.svelte +215 -0
  140. package/dist/docs-document-workspace.svelte.d.ts +16 -0
  141. package/dist/docs-index.d.ts +5 -0
  142. package/dist/docs-index.js +49 -0
  143. package/dist/docs-path.d.ts +6 -0
  144. package/dist/docs-path.js +10 -0
  145. package/dist/docs-plugin.d.ts +21 -0
  146. package/dist/docs-plugin.js +140 -0
  147. package/dist/docs-repository.d.ts +15 -0
  148. package/dist/docs-repository.js +75 -0
  149. package/dist/docs-review-view.d.ts +18 -0
  150. package/dist/docs-review-view.js +52 -0
  151. package/dist/docs-settings-tab.d.ts +8 -0
  152. package/dist/docs-settings-tab.js +25 -0
  153. package/dist/docs-settings.d.ts +17 -0
  154. package/dist/docs-settings.js +38 -0
  155. package/dist/docs-view.d.ts +22 -0
  156. package/dist/docs-view.js +51 -0
  157. package/dist/docs-workspace.svelte +394 -0
  158. package/dist/docs-workspace.svelte.d.ts +15 -0
  159. package/dist/index.d.ts +12 -0
  160. package/dist/index.js +12 -0
  161. package/dist/model/book.d.ts +6 -0
  162. package/dist/model/book.js +101 -0
  163. package/dist/model/coding-runtime.d.ts +4 -0
  164. package/dist/model/coding-runtime.js +9 -0
  165. package/dist/model/docs-card-context.d.ts +32 -0
  166. package/dist/model/docs-card-context.js +89 -0
  167. package/dist/model/docs-card-preview-stack-motion.d.ts +51 -0
  168. package/dist/model/docs-card-preview-stack-motion.js +94 -0
  169. package/dist/model/docs-media-context.d.ts +9 -0
  170. package/dist/model/docs-media-context.js +18 -0
  171. package/dist/model/docs-note-list.d.ts +8 -0
  172. package/dist/model/docs-note-list.js +25 -0
  173. package/dist/model/docs-relative-media.d.ts +30 -0
  174. package/dist/model/docs-relative-media.js +116 -0
  175. package/dist/model/docs-review-constants.d.ts +4 -0
  176. package/dist/model/docs-review-constants.js +13 -0
  177. package/dist/model/fsrs.d.ts +14 -0
  178. package/dist/model/fsrs.js +153 -0
  179. package/dist/model/graph.d.ts +12 -0
  180. package/dist/model/graph.js +169 -0
  181. package/dist/model/index.d.ts +14 -0
  182. package/dist/model/index.js +14 -0
  183. package/dist/model/markdown-normalize.d.ts +11 -0
  184. package/dist/model/markdown-normalize.js +755 -0
  185. package/dist/model/markdown.d.ts +167 -0
  186. package/dist/model/markdown.js +365 -0
  187. package/dist/model/sample.d.ts +7 -0
  188. package/dist/model/sample.js +524 -0
  189. package/dist/model/types.d.ts +328 -0
  190. package/dist/model/types.js +1 -0
  191. package/dist/model/workspace.d.ts +6 -0
  192. package/dist/model/workspace.js +81 -0
  193. package/dist/storybook.css +52 -0
  194. package/dist/styles.css +1 -0
  195. package/manifest.json +11 -0
  196. package/package.json +147 -4
@@ -0,0 +1,248 @@
1
+ <script lang="ts">
2
+ import ArrowLeftIcon from '@lucide/svelte/icons/arrow-left';
3
+ import ArrowRightIcon from '@lucide/svelte/icons/arrow-right';
4
+ import CheckIcon from '@lucide/svelte/icons/check';
5
+ import HomeIcon from '@lucide/svelte/icons/home';
6
+ import SquareCheckIcon from '@lucide/svelte/icons/square-check';
7
+ import SquareIcon from '@lucide/svelte/icons/square';
8
+ import type { DocsBookChapterNavigation, DocsNote } from '../model';
9
+
10
+ let {
11
+ note,
12
+ chapterNavigation,
13
+ saving = false,
14
+ onToggleComplete = () => {},
15
+ onOpenNote = () => {}
16
+ }: {
17
+ note: DocsNote;
18
+ chapterNavigation: DocsBookChapterNavigation;
19
+ saving?: boolean;
20
+ onToggleComplete?: (completed: boolean) => void | Promise<void>;
21
+ onOpenNote?: (noteId: string) => void;
22
+ } = $props();
23
+
24
+ const completed = $derived(Boolean(note.completedAt));
25
+ const previousChapter = $derived(chapterNavigation.previousChapter);
26
+ const nextChapter = $derived(chapterNavigation.nextChapter);
27
+ const homeAriaLabel = $derived(
28
+ chapterNavigation.bookTitle
29
+ ? `${chapterNavigation.bookTitle} home`
30
+ : 'Book home'
31
+ );
32
+
33
+ function toggleComplete() {
34
+ if (saving) return;
35
+ void onToggleComplete(!completed);
36
+ }
37
+ </script>
38
+
39
+ <footer class="docs-chapter-footer" aria-label="Chapter navigation">
40
+ <div class="docs-chapter-footer__complete" class:is-complete={completed}>
41
+ {#if completed}
42
+ <span class="docs-chapter-footer__badge" aria-hidden="true">
43
+ <CheckIcon />
44
+ </span>
45
+ {/if}
46
+ </div>
47
+
48
+ <div class="docs-chapter-footer__nav">
49
+ <div class="docs-chapter-footer__side docs-chapter-footer__side--prev">
50
+ <div class="docs-chapter-footer__actions">
51
+ {#if previousChapter}
52
+ <button
53
+ type="button"
54
+ class="docs-chapter-footer__button"
55
+ onclick={() => onOpenNote(previousChapter.noteId)}
56
+ >
57
+ <ArrowLeftIcon aria-hidden="true" />
58
+ <span>Back lesson</span>
59
+ </button>
60
+ {:else}
61
+ <span class="docs-chapter-footer__button is-disabled" aria-disabled="true">
62
+ <ArrowLeftIcon aria-hidden="true" />
63
+ <span>Back lesson</span>
64
+ </span>
65
+ {/if}
66
+ <button
67
+ type="button"
68
+ class="docs-chapter-footer__button"
69
+ aria-label={homeAriaLabel}
70
+ onclick={() => onOpenNote(chapterNavigation.bookIndexNoteId)}
71
+ >
72
+ <HomeIcon aria-hidden="true" />
73
+ <span>Home</span>
74
+ </button>
75
+ </div>
76
+ {#if previousChapter}
77
+ <small>{previousChapter.title}</small>
78
+ {/if}
79
+ </div>
80
+
81
+ <div class="docs-chapter-footer__side docs-chapter-footer__side--next">
82
+ <div class="docs-chapter-footer__actions">
83
+ <button
84
+ type="button"
85
+ class="docs-chapter-footer__button docs-chapter-footer__complete-button"
86
+ class:is-complete={completed}
87
+ disabled={saving}
88
+ aria-pressed={completed}
89
+ onclick={toggleComplete}
90
+ >
91
+ {#if completed}
92
+ <SquareCheckIcon aria-hidden="true" />
93
+ <span>Completed</span>
94
+ {:else}
95
+ <SquareIcon aria-hidden="true" />
96
+ <span>Mark As Completed</span>
97
+ {/if}
98
+ </button>
99
+ {#if nextChapter}
100
+ <button
101
+ type="button"
102
+ class="docs-chapter-footer__button"
103
+ onclick={() => onOpenNote(nextChapter.noteId)}
104
+ >
105
+ <span>Next</span>
106
+ <ArrowRightIcon aria-hidden="true" />
107
+ </button>
108
+ {:else}
109
+ <span class="docs-chapter-footer__button is-disabled" aria-disabled="true">
110
+ <span>Next</span>
111
+ <ArrowRightIcon aria-hidden="true" />
112
+ </span>
113
+ {/if}
114
+ </div>
115
+ {#if nextChapter}
116
+ <small>{nextChapter.title}</small>
117
+ {/if}
118
+ </div>
119
+ </div>
120
+ </footer>
121
+
122
+ <style>
123
+ .docs-chapter-footer {
124
+ display: grid;
125
+ gap: 1rem;
126
+ margin-top: 1.5rem;
127
+ padding-top: 1.25rem;
128
+ border-top: 1px solid color-mix(in srgb, var(--docs-border, var(--border)) 78%, transparent);
129
+ }
130
+
131
+ .docs-chapter-footer__complete {
132
+ display: flex;
133
+ justify-content: flex-end;
134
+ min-height: 1.75rem;
135
+ }
136
+
137
+ .docs-chapter-footer__badge {
138
+ display: grid;
139
+ place-items: center;
140
+ width: 1.85rem;
141
+ height: 1.85rem;
142
+ border-radius: 999px;
143
+ background: #22c55e;
144
+ color: white;
145
+ box-shadow: 0 0.35rem 0.9rem color-mix(in srgb, #22c55e 35%, transparent);
146
+ }
147
+
148
+ .docs-chapter-footer__badge :global(svg) {
149
+ width: 1rem;
150
+ height: 1rem;
151
+ }
152
+
153
+ .docs-chapter-footer__nav {
154
+ display: flex;
155
+ flex-wrap: wrap;
156
+ align-items: flex-start;
157
+ justify-content: space-between;
158
+ gap: 1rem;
159
+ }
160
+
161
+ .docs-chapter-footer__side {
162
+ display: grid;
163
+ gap: 0.35rem;
164
+ min-width: 0;
165
+ }
166
+
167
+ .docs-chapter-footer__side--next {
168
+ margin-left: auto;
169
+ justify-items: end;
170
+ text-align: right;
171
+ }
172
+
173
+ .docs-chapter-footer__actions {
174
+ display: flex;
175
+ flex-wrap: wrap;
176
+ align-items: flex-start;
177
+ gap: 0.55rem;
178
+ }
179
+
180
+ .docs-chapter-footer__side--next .docs-chapter-footer__actions {
181
+ justify-content: flex-end;
182
+ }
183
+
184
+ .docs-chapter-footer__button {
185
+ display: inline-flex;
186
+ align-items: center;
187
+ align-self: start;
188
+ width: fit-content;
189
+ gap: 0.4rem;
190
+ padding: 0.45rem 0.75rem;
191
+ border: 1px solid color-mix(in srgb, #6366f1 45%, var(--docs-border, var(--border)));
192
+ border-radius: 0.45rem;
193
+ background: color-mix(in srgb, var(--docs-surface, var(--background)) 94%, transparent);
194
+ color: #4f46e5;
195
+ font: inherit;
196
+ font-size: 0.9rem;
197
+ font-weight: 600;
198
+ line-height: 1.2;
199
+ text-decoration: none;
200
+ cursor: pointer;
201
+ }
202
+
203
+ .docs-chapter-footer__button :global(svg) {
204
+ width: 0.95rem;
205
+ height: 0.95rem;
206
+ }
207
+
208
+ .docs-chapter-footer__button:hover,
209
+ .docs-chapter-footer__button:focus-visible {
210
+ border-color: #4f46e5;
211
+ outline: 0;
212
+ box-shadow: 0 0 0 3px color-mix(in srgb, #4f46e5 16%, transparent);
213
+ }
214
+
215
+ .docs-chapter-footer__button.is-disabled {
216
+ opacity: 0.45;
217
+ cursor: not-allowed;
218
+ pointer-events: none;
219
+ }
220
+
221
+ .docs-chapter-footer__complete-button.is-complete {
222
+ border-color: color-mix(in srgb, #22c55e 55%, var(--docs-border, var(--border)));
223
+ color: #15803d;
224
+ }
225
+
226
+ .docs-chapter-footer__side small {
227
+ color: var(--docs-muted, var(--muted-foreground));
228
+ font-size: 0.78rem;
229
+ line-height: 1.35;
230
+ }
231
+
232
+ @media (max-width: 640px) {
233
+ .docs-chapter-footer__nav {
234
+ flex-direction: column;
235
+ }
236
+
237
+ .docs-chapter-footer__side--next {
238
+ margin-left: 0;
239
+ justify-items: start;
240
+ text-align: left;
241
+ width: 100%;
242
+ }
243
+
244
+ .docs-chapter-footer__side--next .docs-chapter-footer__actions {
245
+ justify-content: flex-start;
246
+ }
247
+ }
248
+ </style>
@@ -0,0 +1,11 @@
1
+ import type { DocsBookChapterNavigation, DocsNote } from '../model';
2
+ type $$ComponentProps = {
3
+ note: DocsNote;
4
+ chapterNavigation: DocsBookChapterNavigation;
5
+ saving?: boolean;
6
+ onToggleComplete?: (completed: boolean) => void | Promise<void>;
7
+ onOpenNote?: (noteId: string) => void;
8
+ };
9
+ declare const DocsChapterFooter: import("svelte").Component<$$ComponentProps, {}, "">;
10
+ type DocsChapterFooter = ReturnType<typeof DocsChapterFooter>;
11
+ export default DocsChapterFooter;
@@ -0,0 +1,101 @@
1
+ <script lang="ts">
2
+ import CheckIcon from '@lucide/svelte/icons/check';
3
+
4
+ let {
5
+ chapterScrollPercent = 0
6
+ }: {
7
+ chapterScrollPercent?: number;
8
+ } = $props();
9
+
10
+ const chapterPercent = $derived(Math.max(0, Math.min(100, Math.round(chapterScrollPercent))));
11
+ const ringRadius = 15.5;
12
+ const ringCircumference = 2 * Math.PI * ringRadius;
13
+ const chapterRingOffset = $derived(ringCircumference * (1 - chapterPercent / 100));
14
+ </script>
15
+
16
+ <div
17
+ class="docs-chapter-scroll-ring"
18
+ role="progressbar"
19
+ aria-label="Chapter scroll progress"
20
+ aria-valuemin={0}
21
+ aria-valuemax={100}
22
+ aria-valuenow={chapterPercent}
23
+ >
24
+ <svg viewBox="0 0 36 36" aria-hidden="true">
25
+ <circle class="docs-chapter-scroll-ring__track" cx="18" cy="18" r={ringRadius}></circle>
26
+ <circle
27
+ class="docs-chapter-scroll-ring__fill"
28
+ cx="18"
29
+ cy="18"
30
+ r={ringRadius}
31
+ stroke-dasharray={ringCircumference}
32
+ stroke-dashoffset={chapterRingOffset}
33
+ ></circle>
34
+ </svg>
35
+ {#if chapterPercent >= 100}
36
+ <span class="docs-chapter-scroll-ring__check"><CheckIcon /></span>
37
+ {:else}
38
+ <span class="docs-chapter-scroll-ring__label">{chapterPercent}%</span>
39
+ {/if}
40
+ </div>
41
+
42
+ <style>
43
+ .docs-chapter-scroll-ring {
44
+ position: relative;
45
+ z-index: 36;
46
+ display: grid;
47
+ width: 2.35rem;
48
+ height: 2.35rem;
49
+ place-items: center;
50
+ border-radius: 999px;
51
+ background: color-mix(in srgb, var(--background) 95%, transparent);
52
+ box-shadow: 0 0.55rem 1.2rem color-mix(in srgb, var(--foreground) 10%, transparent);
53
+ backdrop-filter: blur(10px);
54
+ pointer-events: none;
55
+ }
56
+
57
+ .docs-chapter-scroll-ring svg {
58
+ position: absolute;
59
+ inset: 0;
60
+ width: 100%;
61
+ height: 100%;
62
+ transform: rotate(-90deg);
63
+ }
64
+
65
+ .docs-chapter-scroll-ring__track,
66
+ .docs-chapter-scroll-ring__fill {
67
+ fill: none;
68
+ stroke-width: 3;
69
+ }
70
+
71
+ .docs-chapter-scroll-ring__track {
72
+ stroke: color-mix(in srgb, var(--border) 85%, transparent);
73
+ }
74
+
75
+ .docs-chapter-scroll-ring__fill {
76
+ stroke: color-mix(in srgb, var(--primary) 72%, #22c55e);
77
+ stroke-linecap: round;
78
+ transition: stroke-dashoffset 80ms linear;
79
+ }
80
+
81
+ .docs-chapter-scroll-ring__label,
82
+ .docs-chapter-scroll-ring__check {
83
+ position: relative;
84
+ z-index: 1;
85
+ color: var(--foreground);
86
+ font-size: 0.58rem;
87
+ font-weight: 700;
88
+ font-variant-numeric: tabular-nums;
89
+ }
90
+
91
+ .docs-chapter-scroll-ring__check {
92
+ display: grid;
93
+ place-items: center;
94
+ color: #16a34a;
95
+ }
96
+
97
+ .docs-chapter-scroll-ring__check :global(svg) {
98
+ width: 0.85rem;
99
+ height: 0.85rem;
100
+ }
101
+ </style>
@@ -0,0 +1,6 @@
1
+ type $$ComponentProps = {
2
+ chapterScrollPercent?: number;
3
+ };
4
+ declare const DocsChapterScrollRing: import("svelte").Component<$$ComponentProps, {}, "">;
5
+ type DocsChapterScrollRing = ReturnType<typeof DocsChapterScrollRing>;
6
+ export default DocsChapterScrollRing;