@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,232 @@
1
+ <script lang="ts">
2
+ import PlusIcon from "@lucide/svelte/icons/plus";
3
+ import { DatePicker } from "@lapismd/design-core/forms";
4
+ import TagEditor from "./candidates/TagEditor.svelte";
5
+ import * as ScrollArea from "@lapismd/design-core/shadcn/scroll-area";
6
+ import DocsBlockRefPicker from "./DocsBlockRefPicker.svelte";
7
+ import DocsCardPreviewStack from "./DocsCardPreviewStack.svelte";
8
+ import DocsMarkdownField from "./DocsMarkdownField.svelte";
9
+ import {
10
+ FormField,
11
+ FormSectionHeader,
12
+ SegmentedControl
13
+ } from "@lapismd/design-core/forms";
14
+ import { slugifyDocsId } from '../model/markdown';
15
+ import type { DocsCard, DocsCardStatus, DocsCardType, DocsNote } from '../model';
16
+
17
+ let {
18
+ draftNote,
19
+ previewMode = false,
20
+ cardOpenById = $bindable({}),
21
+ cardBlockAddOpenById = $bindable({}),
22
+ tagSuggestions,
23
+ cardDueAt,
24
+ updateCardDue,
25
+ updateCard,
26
+ moveCard,
27
+ removeCard,
28
+ addCard
29
+ }: {
30
+ draftNote: DocsNote;
31
+ previewMode?: boolean;
32
+ cardOpenById: Record<string, boolean>;
33
+ cardBlockAddOpenById: Record<string, boolean>;
34
+ tagSuggestions: string[];
35
+ cardDueAt: (card: DocsCard) => string | undefined;
36
+ updateCardDue: (cardId: string, dateOnly: string | undefined) => void;
37
+ updateCard: (cardId: string, updater: (card: DocsCard) => DocsCard) => void;
38
+ moveCard: (cardId: string, direction: -1 | 1) => void;
39
+ removeCard: (cardId: string) => void;
40
+ addCard: () => void;
41
+ } = $props();
42
+
43
+ let previewAnswerOpenById = $state<Record<string, boolean>>({});
44
+ let previewTargetCardId = $state(readPreviewTargetCardId());
45
+
46
+ const previewStackItems = $derived(
47
+ draftNote.cards.map((card) => ({
48
+ key: card.id,
49
+ card,
50
+ noteId: draftNote.id,
51
+ noteTitle: draftNote.title,
52
+ noteSourcePath: draftNote.sourcePath,
53
+ noteBlocks: draftNote.blocks,
54
+ dueAt: cardDueAt(card)
55
+ }))
56
+ );
57
+ const previewInitialIndex = $derived.by(() => {
58
+ if (!previewTargetCardId) return 0;
59
+ const index = draftNote.cards.findIndex((card) => card.id === previewTargetCardId);
60
+ return index < 0 ? 0 : index;
61
+ });
62
+
63
+ $effect(() => {
64
+ if (!previewMode || typeof window === 'undefined') return;
65
+ const syncPreviewTarget = () => {
66
+ previewTargetCardId = readPreviewTargetCardId();
67
+ };
68
+ syncPreviewTarget();
69
+ window.addEventListener('hashchange', syncPreviewTarget);
70
+ return () => {
71
+ window.removeEventListener('hashchange', syncPreviewTarget);
72
+ };
73
+ });
74
+
75
+ function readPreviewTargetCardId() {
76
+ if (typeof window === 'undefined') return '';
77
+ const prefix = `#docs-card-${draftNote.id}-`;
78
+ const hash = window.location.hash;
79
+ if (!hash.startsWith(prefix)) return '';
80
+ try {
81
+ return decodeURIComponent(hash.slice(prefix.length));
82
+ } catch {
83
+ return hash.slice(prefix.length);
84
+ }
85
+ }
86
+ </script>
87
+
88
+ <ScrollArea.Root class="docs-note-tab-panel">
89
+ <section class="docs-note-tab-panel__content docs-note-tab-panel--cards">
90
+ {#if previewMode}
91
+ <DocsCardPreviewStack
92
+ items={previewStackItems}
93
+ mode="browse"
94
+ initialIndex={previewInitialIndex}
95
+ bind:previewAnswerOpenById
96
+ />
97
+ {:else}
98
+ <div class="docs-card-list">
99
+ {#each draftNote.cards as card, index (card.id)}
100
+ <article
101
+ class="docs-card-editor"
102
+ data-card-type={card.type}
103
+ data-card-status={card.status}
104
+ >
105
+ <FormSectionHeader
106
+ title={card.prompt}
107
+ titleLabel="Card prompt"
108
+ titlePlaceholder="Add Prompt"
109
+ {index}
110
+ total={draftNote.cards.length}
111
+ open={cardOpenById[card.id] !== false}
112
+ editable={cardOpenById[card.id] !== false}
113
+ titleToggleable={cardOpenById[card.id] === false}
114
+ removeLabel={`Remove card ${card.id}`}
115
+ onTitleChange={(prompt) =>
116
+ updateCard(card.id, (item) => ({ ...item, prompt }))}
117
+ onToggle={() =>
118
+ (cardOpenById = {
119
+ ...cardOpenById,
120
+ [card.id]: cardOpenById[card.id] === false,
121
+ })}
122
+ onMove={(direction) => moveCard(card.id, direction)}
123
+ onRemove={() => removeCard(card.id)}
124
+ />
125
+ {#if cardOpenById[card.id] !== false}
126
+ <div class="docs-card-fields">
127
+ <FormField label="Id">
128
+ <input
129
+ value={card.id}
130
+ disabled={card.reviews.length > 0}
131
+ oninput={(event) =>
132
+ updateCard(card.id, (item) => ({
133
+ ...item,
134
+ id: slugifyDocsId(
135
+ event.currentTarget.value,
136
+ item.id,
137
+ ),
138
+ }))}
139
+ />
140
+ </FormField>
141
+ <FormField label="Type" align="center" as="div">
142
+ <SegmentedControl
143
+ value={card.type}
144
+ options={["basic", "cloze"]}
145
+ labels={{ basic: "Basic", cloze: "Cloze" }}
146
+ ariaLabel="Card type"
147
+ onChange={(value) =>
148
+ updateCard(card.id, (item) => ({
149
+ ...item,
150
+ type: value as DocsCardType,
151
+ }))}
152
+ />
153
+ </FormField>
154
+ <FormField label="Status" align="center" as="div">
155
+ <SegmentedControl
156
+ value={card.status}
157
+ options={["active", "suspended"]}
158
+ labels={{ active: "Active", suspended: "Suspended" }}
159
+ ariaLabel="Card status"
160
+ onChange={(value) =>
161
+ updateCard(card.id, (item) => ({
162
+ ...item,
163
+ status: value as DocsCardStatus,
164
+ }))}
165
+ />
166
+ </FormField>
167
+ <DocsMarkdownField
168
+ label="Answer"
169
+ value={card.answer}
170
+ placeholder="Add Answer"
171
+ onChange={(value) =>
172
+ updateCard(card.id, (item) => ({
173
+ ...item,
174
+ answer: value,
175
+ }))}
176
+ />
177
+ <FormField label="Tags" as="div">
178
+ <TagEditor
179
+ id={`docs-card-tags-${draftNote.id}-${card.id}`}
180
+ showLabel={false}
181
+ embedded
182
+ value={card.tags}
183
+ suggestions={tagSuggestions}
184
+ placeholder="Add tag..."
185
+ onChange={(tags) =>
186
+ updateCard(card.id, (item) => ({ ...item, tags }))}
187
+ />
188
+ </FormField>
189
+ <FormField label="Block refs" as="div">
190
+ <p class="docs-card-field-help">
191
+ Note blocks rendered on the card back after you reveal the answer.
192
+ </p>
193
+ <DocsBlockRefPicker
194
+ blocks={draftNote.blocks}
195
+ refs={card.blockRefs}
196
+ addOpen={cardBlockAddOpenById[card.id] === true}
197
+ onAddOpenChange={(open) =>
198
+ (cardBlockAddOpenById = {
199
+ ...cardBlockAddOpenById,
200
+ [card.id]: open,
201
+ })}
202
+ onChange={(blockRefs) =>
203
+ updateCard(card.id, (item) => ({
204
+ ...item,
205
+ blockRefs,
206
+ }))}
207
+ />
208
+ </FormField>
209
+ <FormField label="Due" align="center" as="div">
210
+ <DatePicker
211
+ value={cardDueAt(card)?.slice(0, 10)}
212
+ onValueChange={(date) =>
213
+ updateCardDue(card.id, date ?? undefined)
214
+ }
215
+ />
216
+ </FormField>
217
+ </div>
218
+ {/if}
219
+ </article>
220
+ {/each}
221
+ <button
222
+ type="button"
223
+ class="docs-cards-add-bottom"
224
+ onclick={addCard}
225
+ >
226
+ <PlusIcon />
227
+ Add Card
228
+ </button>
229
+ </div>
230
+ {/if}
231
+ </section>
232
+ </ScrollArea.Root>
@@ -0,0 +1,17 @@
1
+ import type { DocsCard, DocsNote } from '../model';
2
+ type $$ComponentProps = {
3
+ draftNote: DocsNote;
4
+ previewMode?: boolean;
5
+ cardOpenById: Record<string, boolean>;
6
+ cardBlockAddOpenById: Record<string, boolean>;
7
+ tagSuggestions: string[];
8
+ cardDueAt: (card: DocsCard) => string | undefined;
9
+ updateCardDue: (cardId: string, dateOnly: string | undefined) => void;
10
+ updateCard: (cardId: string, updater: (card: DocsCard) => DocsCard) => void;
11
+ moveCard: (cardId: string, direction: -1 | 1) => void;
12
+ removeCard: (cardId: string) => void;
13
+ addCard: () => void;
14
+ };
15
+ declare const DocsCardsPanel: import("svelte").Component<$$ComponentProps, {}, "cardOpenById" | "cardBlockAddOpenById">;
16
+ type DocsCardsPanel = ReturnType<typeof DocsCardsPanel>;
17
+ export default DocsCardsPanel;