bookish-press 0.7.4 → 0.8.2

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 (249) hide show
  1. package/README.md +8 -0
  2. package/dist/components/Auth.svelte +29 -39
  3. package/dist/components/Auth.svelte.d.ts +5 -17
  4. package/dist/components/BookPreview.svelte +14 -20
  5. package/dist/components/BookPreview.svelte.d.ts +6 -18
  6. package/dist/components/Link.svelte +19 -30
  7. package/dist/components/Link.svelte.d.ts +7 -20
  8. package/dist/components/app/BookList.svelte +2 -3
  9. package/dist/components/app/BookList.svelte.d.ts +6 -18
  10. package/dist/components/app/Button.svelte +12 -8
  11. package/dist/components/app/Button.svelte.d.ts +10 -23
  12. package/dist/components/app/Feedback.svelte +4 -4
  13. package/dist/components/app/Feedback.svelte.d.ts +6 -19
  14. package/dist/components/app/Head.svelte +2 -2
  15. package/dist/components/app/Head.svelte.d.ts +6 -19
  16. package/dist/components/app/Large.svelte +4 -1
  17. package/dist/components/app/Large.svelte.d.ts +5 -28
  18. package/dist/components/app/Lead.svelte +4 -1
  19. package/dist/components/app/Lead.svelte.d.ts +5 -28
  20. package/dist/components/app/Link.svelte +12 -9
  21. package/dist/components/app/Link.svelte.d.ts +9 -22
  22. package/dist/components/app/Options.svelte +8 -6
  23. package/dist/components/app/Options.svelte.d.ts +8 -20
  24. package/dist/components/app/Paragraph.svelte +2 -2
  25. package/dist/components/app/Paragraph.svelte.d.ts +6 -19
  26. package/dist/components/app/Section.svelte +4 -1
  27. package/dist/components/app/Section.svelte.d.ts +5 -28
  28. package/dist/components/app/Table.svelte +4 -1
  29. package/dist/components/app/Table.svelte.d.ts +5 -28
  30. package/dist/components/app/TextInput.svelte +10 -8
  31. package/dist/components/app/TextInput.svelte.d.ts +12 -23
  32. package/dist/components/chapter/Atom.svelte +4 -7
  33. package/dist/components/chapter/Atom.svelte.d.ts +6 -19
  34. package/dist/components/chapter/Block.svelte +21 -23
  35. package/dist/components/chapter/Block.svelte.d.ts +5 -17
  36. package/dist/components/chapter/Callout.svelte +3 -5
  37. package/dist/components/chapter/Callout.svelte.d.ts +5 -17
  38. package/dist/components/chapter/CaptionedCode.svelte +12 -14
  39. package/dist/components/chapter/CaptionedCode.svelte.d.ts +5 -17
  40. package/dist/components/chapter/ChapterBody.svelte +14 -17
  41. package/dist/components/chapter/ChapterBody.svelte.d.ts +7 -19
  42. package/dist/components/chapter/ChapterBody.test.d.ts +1 -0
  43. package/dist/components/chapter/ChapterBody.test.js +85 -0
  44. package/dist/components/chapter/Citations.svelte +39 -45
  45. package/dist/components/chapter/Citations.svelte.d.ts +5 -17
  46. package/dist/components/chapter/Code.svelte +158 -155
  47. package/dist/components/chapter/Code.svelte.d.ts +10 -23
  48. package/dist/components/chapter/Comment.svelte +30 -23
  49. package/dist/components/chapter/Comment.svelte.d.ts +5 -17
  50. package/dist/components/chapter/Definition.svelte +36 -34
  51. package/dist/components/chapter/Definition.svelte.d.ts +5 -17
  52. package/dist/components/chapter/Embed.svelte +78 -72
  53. package/dist/components/chapter/Embed.svelte.d.ts +8 -20
  54. package/dist/components/chapter/ErrorMessage.svelte +2 -4
  55. package/dist/components/chapter/ErrorMessage.svelte.d.ts +5 -17
  56. package/dist/components/chapter/Figure.svelte +22 -29
  57. package/dist/components/chapter/Figure.svelte.d.ts +9 -22
  58. package/dist/components/chapter/Footnote.svelte +40 -32
  59. package/dist/components/chapter/Footnote.svelte.d.ts +5 -17
  60. package/dist/components/chapter/Format.svelte +26 -41
  61. package/dist/components/chapter/Format.svelte.d.ts +7 -18
  62. package/dist/components/chapter/InlineCode.svelte +7 -8
  63. package/dist/components/chapter/InlineCode.svelte.d.ts +5 -17
  64. package/dist/components/chapter/Label.svelte +5 -11
  65. package/dist/components/chapter/Label.svelte.d.ts +5 -17
  66. package/dist/components/chapter/LineBreak.svelte +1 -3
  67. package/dist/components/chapter/LineBreak.svelte.d.ts +5 -17
  68. package/dist/components/chapter/Link.svelte +17 -23
  69. package/dist/components/chapter/Link.svelte.d.ts +5 -17
  70. package/dist/components/chapter/List.svelte +9 -9
  71. package/dist/components/chapter/List.svelte.d.ts +6 -17
  72. package/dist/components/chapter/Marginal.svelte +59 -60
  73. package/dist/components/chapter/Marginal.svelte.d.ts +10 -22
  74. package/dist/components/chapter/Paragraph.svelte +8 -23
  75. package/dist/components/chapter/Paragraph.svelte.d.ts +6 -18
  76. package/dist/components/chapter/Positioned.svelte +2 -4
  77. package/dist/components/chapter/Positioned.svelte.d.ts +6 -19
  78. package/dist/components/chapter/Problem.svelte +3 -2
  79. package/dist/components/chapter/Problem.svelte.d.ts +5 -28
  80. package/dist/components/chapter/Python.svelte +45 -58
  81. package/dist/components/chapter/Python.svelte.d.ts +6 -18
  82. package/dist/components/chapter/Quote.svelte +5 -7
  83. package/dist/components/chapter/Quote.svelte.d.ts +5 -17
  84. package/dist/components/chapter/Rule.svelte +1 -3
  85. package/dist/components/chapter/Rule.svelte.d.ts +5 -17
  86. package/dist/components/chapter/Table.svelte +6 -8
  87. package/dist/components/chapter/Table.svelte.d.ts +5 -17
  88. package/dist/components/chapter/Text.svelte +54 -69
  89. package/dist/components/chapter/Text.svelte.d.ts +6 -18
  90. package/dist/components/controls/DarkToggle.svelte +7 -8
  91. package/dist/components/controls/DarkToggle.svelte.d.ts +6 -18
  92. package/dist/components/editor/BookishEditor.svelte +583 -761
  93. package/dist/components/editor/BookishEditor.svelte.d.ts +14 -26
  94. package/dist/components/editor/CalloutEditor.svelte +3 -3
  95. package/dist/components/editor/CalloutEditor.svelte.d.ts +5 -17
  96. package/dist/components/editor/CaptionedCodeEditor.svelte +5 -5
  97. package/dist/components/editor/CaptionedCodeEditor.svelte.d.ts +5 -17
  98. package/dist/components/editor/CaretView.svelte +23 -25
  99. package/dist/components/editor/CaretView.svelte.d.ts +15 -27
  100. package/dist/components/editor/CitationsEditor.svelte +25 -28
  101. package/dist/components/editor/CitationsEditor.svelte.d.ts +5 -17
  102. package/dist/components/editor/ConfirmButton.svelte +9 -6
  103. package/dist/components/editor/ConfirmButton.svelte.d.ts +8 -21
  104. package/dist/components/editor/DefinitionEditor.svelte +11 -15
  105. package/dist/components/editor/DefinitionEditor.svelte.d.ts +5 -17
  106. package/dist/components/editor/EmbedEditor.svelte +43 -44
  107. package/dist/components/editor/EmbedEditor.svelte.d.ts +5 -17
  108. package/dist/components/editor/Icon.svelte +1 -1
  109. package/dist/components/editor/Icon.svelte.d.ts +5 -17
  110. package/dist/components/editor/ImageChooser.svelte +15 -18
  111. package/dist/components/editor/ImageChooser.svelte.d.ts +6 -18
  112. package/dist/components/editor/ImageThumbnail.svelte +29 -24
  113. package/dist/components/editor/ImageThumbnail.svelte.d.ts +7 -19
  114. package/dist/components/editor/InlineCodeEditor.svelte +3 -3
  115. package/dist/components/editor/InlineCodeEditor.svelte.d.ts +5 -17
  116. package/dist/components/editor/LabelEditor.svelte +5 -6
  117. package/dist/components/editor/LabelEditor.svelte.d.ts +5 -17
  118. package/dist/components/editor/LanguageEditor.svelte +4 -5
  119. package/dist/components/editor/LanguageEditor.svelte.d.ts +6 -18
  120. package/dist/components/editor/LinkEditor.svelte +52 -68
  121. package/dist/components/editor/LinkEditor.svelte.d.ts +5 -17
  122. package/dist/components/editor/Note.svelte +4 -1
  123. package/dist/components/editor/Note.svelte.d.ts +5 -28
  124. package/dist/components/editor/Permissions.svelte +36 -34
  125. package/dist/components/editor/Permissions.svelte.d.ts +9 -21
  126. package/dist/components/editor/PositionEditor.svelte +6 -7
  127. package/dist/components/editor/PositionEditor.svelte.d.ts +6 -18
  128. package/dist/components/editor/QuoteEditor.svelte +3 -3
  129. package/dist/components/editor/QuoteEditor.svelte.d.ts +5 -17
  130. package/dist/components/editor/Switch.svelte +16 -11
  131. package/dist/components/editor/Switch.svelte.d.ts +9 -21
  132. package/dist/components/editor/TableEditor.svelte +3 -3
  133. package/dist/components/editor/TableEditor.svelte.d.ts +5 -17
  134. package/dist/components/editor/TextEditor.svelte +74 -87
  135. package/dist/components/editor/TextEditor.svelte.d.ts +13 -25
  136. package/dist/components/editor/Toggle.svelte +18 -21
  137. package/dist/components/editor/Toggle.svelte.d.ts +7 -20
  138. package/dist/components/editor/Toolbar.svelte +140 -145
  139. package/dist/components/editor/Toolbar.svelte.d.ts +5 -17
  140. package/dist/components/editor/ToolbarGroup.svelte +4 -4
  141. package/dist/components/editor/ToolbarGroup.svelte.d.ts +6 -19
  142. package/dist/components/editor/ToolbarSpacer.svelte +1 -1
  143. package/dist/components/editor/ToolbarSpacer.svelte.d.ts +22 -21
  144. package/dist/components/editor/URLEditor.svelte +3 -5
  145. package/dist/components/editor/URLEditor.svelte.d.ts +7 -19
  146. package/dist/components/page/Acknowledgements.svelte +14 -8
  147. package/dist/components/page/Acknowledgements.svelte.d.ts +3 -16
  148. package/dist/components/page/Analytics.svelte +2 -3
  149. package/dist/components/page/Analytics.svelte.d.ts +6 -17
  150. package/dist/components/page/Authors.svelte +29 -29
  151. package/dist/components/page/Authors.svelte.d.ts +11 -23
  152. package/dist/components/page/BookLoader.svelte +47 -43
  153. package/dist/components/page/BookLoader.svelte.d.ts +5 -17
  154. package/dist/components/page/BulkReferenceEditor.svelte +43 -26
  155. package/dist/components/page/BulkReferenceEditor.svelte.d.ts +3 -16
  156. package/dist/components/page/Chapter.svelte +224 -249
  157. package/dist/components/page/Chapter.svelte.d.ts +6 -18
  158. package/dist/components/page/ChapterContext.d.ts +3 -1
  159. package/dist/components/page/ChapterNumber.svelte +4 -1
  160. package/dist/components/page/ChapterNumber.svelte.d.ts +5 -28
  161. package/dist/components/page/ChapterTitle.svelte +4 -4
  162. package/dist/components/page/ChapterTitle.svelte.d.ts +6 -19
  163. package/dist/components/page/Contexts.js +2 -2
  164. package/dist/components/page/DefinitionView.svelte +51 -44
  165. package/dist/components/page/DefinitionView.svelte.d.ts +6 -18
  166. package/dist/components/page/Description.svelte +10 -4
  167. package/dist/components/page/Description.svelte.d.ts +16 -14
  168. package/dist/components/page/EditableHeader.svelte +4 -6
  169. package/dist/components/page/EditableHeader.svelte.d.ts +7 -18
  170. package/dist/components/page/Edition.svelte +57 -71
  171. package/dist/components/page/Edition.svelte.d.ts +7 -20
  172. package/dist/components/page/EditionLoader.svelte +119 -82
  173. package/dist/components/page/EditionLoader.svelte.d.ts +6 -19
  174. package/dist/components/page/Editions.svelte +26 -31
  175. package/dist/components/page/Editions.svelte.d.ts +5 -17
  176. package/dist/components/page/Glossary.svelte +31 -35
  177. package/dist/components/page/Glossary.svelte.d.ts +3 -16
  178. package/dist/components/page/Header.svelte +43 -49
  179. package/dist/components/page/Header.svelte.d.ts +19 -30
  180. package/dist/components/page/Index.svelte +46 -46
  181. package/dist/components/page/Index.svelte.d.ts +3 -16
  182. package/dist/components/page/Instructions.svelte +2 -2
  183. package/dist/components/page/Instructions.svelte.d.ts +6 -19
  184. package/dist/components/page/License.svelte +13 -7
  185. package/dist/components/page/License.svelte.d.ts +16 -14
  186. package/dist/components/page/Loading.svelte +9 -9
  187. package/dist/components/page/Loading.svelte.d.ts +22 -21
  188. package/dist/components/page/Media.svelte +36 -27
  189. package/dist/components/page/Media.svelte.d.ts +3 -16
  190. package/dist/components/page/MediaPreview.svelte +22 -19
  191. package/dist/components/page/MediaPreview.svelte.d.ts +8 -21
  192. package/dist/components/page/Muted.svelte +4 -1
  193. package/dist/components/page/Muted.svelte.d.ts +5 -28
  194. package/dist/components/page/Outline.svelte +75 -97
  195. package/dist/components/page/Outline.svelte.d.ts +8 -20
  196. package/dist/components/page/Page.svelte +23 -33
  197. package/dist/components/page/Page.svelte.d.ts +7 -20
  198. package/dist/components/page/PageHeader.svelte +2 -2
  199. package/dist/components/page/PageHeader.svelte.d.ts +6 -19
  200. package/dist/components/page/PageParagraph.svelte +4 -1
  201. package/dist/components/page/PageParagraph.svelte.d.ts +5 -28
  202. package/dist/components/page/PossibleChapter.svelte +7 -7
  203. package/dist/components/page/PossibleChapter.svelte.d.ts +3 -16
  204. package/dist/components/page/PossibleReference.svelte +4 -5
  205. package/dist/components/page/PossibleReference.svelte.d.ts +6 -18
  206. package/dist/components/page/Print.svelte +11 -12
  207. package/dist/components/page/Print.svelte.d.ts +3 -16
  208. package/dist/components/page/Publish.svelte +47 -47
  209. package/dist/components/page/Publish.svelte.d.ts +3 -16
  210. package/dist/components/page/Reference.svelte +24 -35
  211. package/dist/components/page/Reference.svelte.d.ts +6 -18
  212. package/dist/components/page/References.svelte +21 -22
  213. package/dist/components/page/References.svelte.d.ts +3 -16
  214. package/dist/components/page/Rows.svelte +4 -1
  215. package/dist/components/page/Rows.svelte.d.ts +5 -28
  216. package/dist/components/page/Search.svelte +58 -60
  217. package/dist/components/page/Search.svelte.d.ts +3 -16
  218. package/dist/components/page/Status.svelte +2 -2
  219. package/dist/components/page/Status.svelte.d.ts +16 -14
  220. package/dist/components/page/SubdomainEditor.svelte +11 -11
  221. package/dist/components/page/SubdomainEditor.svelte.d.ts +16 -14
  222. package/dist/components/page/TableOfContents.svelte +143 -125
  223. package/dist/components/page/TableOfContents.svelte.d.ts +3 -16
  224. package/dist/components/page/TableOfContentsImage.svelte +6 -7
  225. package/dist/components/page/TableOfContentsImage.svelte.d.ts +6 -18
  226. package/dist/components/page/TableOfContentsRow.svelte +32 -32
  227. package/dist/components/page/TableOfContentsRow.svelte.d.ts +10 -22
  228. package/dist/components/page/ThemeEditor.svelte +35 -28
  229. package/dist/components/page/ThemeEditor.svelte.d.ts +3 -16
  230. package/dist/components/page/ThemeEditorPreview.svelte +11 -13
  231. package/dist/components/page/ThemeEditorPreview.svelte.d.ts +5 -17
  232. package/dist/components/page/ThemeSetEditor.svelte +4 -6
  233. package/dist/components/page/ThemeSetEditor.svelte.d.ts +7 -19
  234. package/dist/components/page/ThemeVariableEditor.svelte +9 -11
  235. package/dist/components/page/ThemeVariableEditor.svelte.d.ts +7 -19
  236. package/dist/components/page/Title.svelte +4 -1
  237. package/dist/components/page/Title.svelte.d.ts +5 -28
  238. package/dist/components/page/Unknown.svelte +11 -8
  239. package/dist/components/page/Unknown.svelte.d.ts +5 -17
  240. package/dist/models/Firebase.js +18 -4
  241. package/dist/models/book/Book.js +2 -1
  242. package/dist/models/book/BookMedia.js +1 -2
  243. package/dist/models/book/Chapter.js +3 -2
  244. package/dist/models/book/Edition.d.ts +1 -1
  245. package/dist/models/book/Edition.js +5 -1
  246. package/dist/models/chapter/BlocksNode.js +3 -1
  247. package/dist/models/chapter/BlocksNode.test.js +5 -1
  248. package/dist/models/chapter/Node.test.js +2 -2
  249. package/package.json +34 -22
@@ -1,98 +1,135 @@
1
- <script>import Loading from './Loading.svelte';
2
- import Edition from './Edition.svelte';
3
- import Feedback from '../app/Feedback.svelte';
4
- import { getBook, getEdition, getUser, getChapterText, } from './Contexts';
5
- import { onDestroy } from 'svelte';
6
- import { page } from '$app/stores';
7
- import { listenToChapters, listenToEdition } from '../../models/CRUD';
8
- export let write;
9
- let currentEditionID;
1
+ <script lang="ts">import Loading from "./Loading.svelte";
2
+ import Edition from "./Edition.svelte";
3
+ import Feedback from "../app/Feedback.svelte";
4
+ import {
5
+ getBook,
6
+ getEdition,
7
+ getStatus,
8
+ getUser,
9
+ getChapterText
10
+ } from "./Contexts";
11
+ import BookSaveStatus from "../../models/book/BookSaveStatus";
12
+ import { get } from "svelte/store";
13
+ import { onDestroy, untrack } from "svelte";
14
+ import { page } from "$app/state";
15
+ import { listenToChapters, listenToEdition } from "../../models/CRUD";
16
+ let { write, children } = $props();
17
+ let currentEditionID = $state();
10
18
  let auth = getUser();
11
19
  let book = getBook();
12
20
  let edition = getEdition();
13
- /** Mapping from Firestore docuemnt IDs to chapter text */
14
- let chapterText = new Map();
15
- let editionUnsub = undefined;
16
- let chaptersUnsub = undefined;
17
- let error = undefined;
21
+ let status = getStatus();
22
+ let locallyEdited = false;
23
+ let applyingSnapshot = false;
24
+ const localEditWatch = edition.subscribe(() => {
25
+ if (!applyingSnapshot) locallyEdited = true;
26
+ });
27
+ const statusWatch = status?.subscribe((current) => {
28
+ if (current === BookSaveStatus.Saved) locallyEdited = false;
29
+ });
30
+ function skipStaleSnapshot() {
31
+ const current = status ? get(status) : void 0;
32
+ return locallyEdited && (current === BookSaveStatus.Changed || current === BookSaveStatus.Saving);
33
+ }
34
+ function applySnapshot(apply) {
35
+ applyingSnapshot = true;
36
+ try {
37
+ apply();
38
+ } finally {
39
+ applyingSnapshot = false;
40
+ }
41
+ }
42
+ let chapterText = /* @__PURE__ */ new Map();
43
+ let editionUnsub = void 0;
44
+ let chaptersUnsub = void 0;
45
+ let error = $state(void 0);
18
46
  function unsub() {
19
- // Unsubscribe to the old edition document if we were listening to one.
20
- if (editionUnsub)
21
- editionUnsub();
22
- if (chaptersUnsub)
23
- chaptersUnsub();
47
+ if (editionUnsub) editionUnsub();
48
+ if (chaptersUnsub) chaptersUnsub();
24
49
  }
25
50
  function listen() {
26
- unsub();
27
- error = undefined;
28
- // If we no longer have a book, we can't get an edition.
29
- if ($book === undefined) {
30
- edition.set(undefined);
31
- error = 'Unknown book.';
32
- return;
51
+ unsub();
52
+ error = void 0;
53
+ if ($book === void 0) {
54
+ edition.set(void 0);
55
+ error = "Unknown book.";
56
+ return;
57
+ } else {
58
+ currentEditionID = page.params.editionid;
59
+ const latestPublished = !write;
60
+ let editionID;
61
+ if (currentEditionID === void 0) {
62
+ if (latestPublished) {
63
+ editionID = $book.getLatestPublishedEditionID();
64
+ if (editionID === void 0)
65
+ error = "There is no published edition of this book.";
66
+ } else {
67
+ editionID = $book.getLatestEditionID();
68
+ }
69
+ } else {
70
+ editionID = $book.getEditionNumberID(
71
+ parseFloat(currentEditionID)
72
+ );
73
+ if (editionID === void 0)
74
+ error = `There is no ${currentEditionID} edition of this book`;
33
75
  }
34
- else {
35
- currentEditionID = $page.params.editionid;
36
- const latestPublished = !write;
37
- // Figure out which edition to load.
38
- let editionID;
39
- if (currentEditionID === undefined) {
40
- if (latestPublished) {
41
- editionID = $book.getLatestPublishedEditionID();
42
- if (editionID === undefined)
43
- error = 'There is no published edition of this book.';
44
- }
45
- else {
46
- editionID = $book.getLatestEditionID();
47
- }
76
+ if (editionID !== void 0) {
77
+ editionUnsub = listenToEdition(
78
+ $book.getID(),
79
+ editionID,
80
+ (ed) => {
81
+ if (skipStaleSnapshot()) return;
82
+ if (ed) {
83
+ applySnapshot(
84
+ () => edition.set(ed.withChapterText(chapterText))
85
+ );
86
+ } else {
87
+ applySnapshot(() => edition.set(void 0));
88
+ error = "Unable to load edition";
89
+ }
48
90
  }
49
- else {
50
- editionID = $book.getEditionNumberID(parseFloat(currentEditionID));
51
- if (editionID === undefined)
52
- error = `There is no ${currentEditionID} edition of this book`;
53
- }
54
- // Listen to the doc for changes and listen to all of its chapters.
55
- if (editionID !== undefined) {
56
- editionUnsub = listenToEdition($book.getID(), editionID, (ed) => {
57
- if (ed) {
58
- // Before setting the new edition, augmented it with the chapter text.
59
- edition.set(ed.withChapterText(chapterText));
60
- }
61
- else {
62
- edition.set(undefined);
63
- error = 'Unable to load edition';
64
- }
65
- });
66
- chaptersUnsub = listenToChapters($book.getID(), editionID, (chapters) => {
67
- // Update the text of the chapters we received.
68
- for (const [ref, text] of chapters)
69
- chapterText.set(ref.id, text);
70
- // Update the chapter text in the current edition.
71
- if ($edition) {
72
- edition.set($edition.withChapterText(chapterText));
73
- }
74
- });
91
+ );
92
+ chaptersUnsub = listenToChapters(
93
+ $book.getID(),
94
+ editionID,
95
+ (chapters) => {
96
+ const stale = skipStaleSnapshot();
97
+ for (const [ref, text] of chapters)
98
+ if (!stale || !chapterText.has(ref.id))
99
+ chapterText.set(ref.id, text);
100
+ if ($edition) {
101
+ applySnapshot(
102
+ () => edition.set(
103
+ $edition.withChapterText(chapterText)
104
+ )
105
+ );
106
+ }
75
107
  }
108
+ );
76
109
  }
110
+ }
77
111
  }
78
- // Remember the chapter text whenever the edition changes, so we don't overwrite stale text.
79
- // when other things change.
80
- $: if ($edition) {
112
+ $effect.pre(() => {
113
+ if ($edition) {
81
114
  for (const chapter of $edition.chapters) {
82
- if (chapter.ref && chapter.text !== null)
83
- chapterText.set(chapter.ref.id, chapter.text);
115
+ if (chapter.ref && chapter.text !== null)
116
+ chapterText.set(chapter.ref.id, chapter.text);
84
117
  }
85
- }
86
- // Whenever the book changes, change the listener.
87
- $: if ((currentEditionID === undefined ||
88
- $page.params.editionid !== currentEditionID) &&
89
- $auth &&
90
- $auth.user !== null)
91
- listen();
92
- // When unmounted, unset the stores — no longer viewing a book.
118
+ }
119
+ });
120
+ $effect(() => {
121
+ const requestedEditionID = page.params.editionid;
122
+ const user = $auth?.user;
123
+ untrack(() => {
124
+ if ((currentEditionID === void 0 || requestedEditionID !== currentEditionID) && user !== null && user !== void 0)
125
+ listen();
126
+ });
127
+ });
93
128
  onDestroy(() => {
94
- edition.set(undefined);
95
- unsub();
129
+ localEditWatch();
130
+ statusWatch?.();
131
+ edition.set(void 0);
132
+ unsub();
96
133
  });
97
134
  </script>
98
135
 
@@ -107,6 +144,6 @@ onDestroy(() => {
107
144
  ? `/write/${$book.getID()}/${$edition.getEditionNumber()}`
108
145
  : `/${$book.getSubdomain() ?? $book.getID()}`}
109
146
  >
110
- <slot />
147
+ {@render children?.()}
111
148
  </Edition>
112
149
  {/if}
@@ -1,20 +1,7 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- write: boolean;
5
- };
6
- events: {
7
- [evt: string]: CustomEvent<any>;
8
- };
9
- slots: {
10
- default: {};
11
- };
12
- exports?: {} | undefined;
13
- bindings?: string | undefined;
14
- };
15
- export type EditionLoaderProps = typeof __propDef.props;
16
- export type EditionLoaderEvents = typeof __propDef.events;
17
- export type EditionLoaderSlots = typeof __propDef.slots;
18
- export default class EditionLoader extends SvelteComponent<EditionLoaderProps, EditionLoaderEvents, EditionLoaderSlots> {
1
+ interface Props {
2
+ write: boolean;
3
+ children?: import('svelte').Snippet;
19
4
  }
20
- export {};
5
+ declare const EditionLoader: import("svelte").Component<Props, {}, "">;
6
+ type EditionLoader = ReturnType<typeof EditionLoader>;
7
+ export default EditionLoader;
@@ -1,41 +1,36 @@
1
- <script>import { createNewEdition } from '../../models/CRUD';
2
- import Instructions from './Instructions.svelte';
3
- import Note from '../editor/Note.svelte';
4
- import { getBook, getUser, isBookEditable } from './Contexts';
5
- import Button from '../app/Button.svelte';
6
- import Link from '../app/Link.svelte';
7
- import Format from '../chapter/Format.svelte';
8
- import Parser from '../../models/chapter/Parser';
9
- import Permissions from '../editor/Permissions.svelte';
10
- export let editors = true;
1
+ <script lang="ts">import { createNewEdition } from "../../models/CRUD";
2
+ import Instructions from "./Instructions.svelte";
3
+ import Note from "../editor/Note.svelte";
4
+ import { getBook, getUser, isBookEditable } from "./Contexts";
5
+ import Button from "../app/Button.svelte";
6
+ import Link from "../app/Link.svelte";
7
+ import Format from "../chapter/Format.svelte";
8
+ import Parser from "../../models/chapter/Parser";
9
+ import Permissions from "../editor/Permissions.svelte";
10
+ let { editors = true } = $props();
11
11
  let book = getBook();
12
12
  let editable = isBookEditable();
13
13
  let user = getUser();
14
- $: editions = $book?.getEditions();
15
- $: latestPublishedID = $book?.getLatestPublishedEditionID();
16
- let publisher = false;
17
- $: {
18
- if ($user && $user.user)
19
- updateUserClaims();
20
- }
14
+ let publisher = $state(false);
21
15
  async function updateUserClaims() {
22
- if ($user === undefined || $user.user === null)
23
- return;
24
- const token = await $user.user.getIdTokenResult();
25
- publisher =
26
- 'publisher' in token.claims && token.claims.publisher === true;
16
+ if ($user === void 0 || $user.user === null) return;
17
+ const token = await $user.user.getIdTokenResult();
18
+ publisher = "publisher" in token.claims && token.claims.publisher === true;
27
19
  }
28
20
  async function createEdition() {
29
- if ($book === undefined)
30
- return;
31
- try {
32
- const revisedBook = await createNewEdition($book);
33
- book.set(revisedBook);
34
- }
35
- catch (err) {
36
- console.error('Error creating new edition:', err);
37
- }
21
+ if ($book === void 0) return;
22
+ try {
23
+ const revisedBook = await createNewEdition($book);
24
+ book.set(revisedBook);
25
+ } catch (err) {
26
+ console.error("Error creating new edition:", err);
27
+ }
38
28
  }
29
+ let editions = $derived($book?.getEditions());
30
+ let latestPublishedID = $derived($book?.getLatestPublishedEditionID());
31
+ $effect(() => {
32
+ if ($user && $user.user) updateUserClaims();
33
+ });
39
34
  </script>
40
35
 
41
36
  {#if $book && editions}
@@ -1,18 +1,6 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- editors?: boolean;
5
- };
6
- events: {
7
- [evt: string]: CustomEvent<any>;
8
- };
9
- slots: {};
10
- exports?: {} | undefined;
11
- bindings?: string | undefined;
12
- };
13
- export type EditionsProps = typeof __propDef.props;
14
- export type EditionsEvents = typeof __propDef.events;
15
- export type EditionsSlots = typeof __propDef.slots;
16
- export default class Editions extends SvelteComponent<EditionsProps, EditionsEvents, EditionsSlots> {
1
+ interface Props {
2
+ editors?: boolean;
17
3
  }
18
- export {};
4
+ declare const Editions: import("svelte").Component<Props, {}, "">;
5
+ type Editions = ReturnType<typeof Editions>;
6
+ export default Editions;
@@ -1,31 +1,25 @@
1
- <script>import Header from './Header.svelte';
2
- import Outline from './Outline.svelte';
3
- import Page from './Page.svelte';
4
- import ChapterIDs from '../../models/book/ChapterID';
5
- import DefinitionView from './DefinitionView.svelte';
6
- import { getUser, getEdition, isEditionEditable } from './Contexts';
7
- import Instructions from './Instructions.svelte';
8
- import Button from '../app/Button.svelte';
1
+ <script lang="ts">import Header from "./Header.svelte";
2
+ import Outline from "./Outline.svelte";
3
+ import Page from "./Page.svelte";
4
+ import ChapterIDs from "../../models/book/ChapterID";
5
+ import DefinitionView from "./DefinitionView.svelte";
6
+ import { getUser, getEdition, isEditionEditable } from "./Contexts";
7
+ import Instructions from "./Instructions.svelte";
8
+ import Button from "../app/Button.svelte";
9
9
  let auth = getUser();
10
10
  let edition = getEdition();
11
11
  let editable = isEditionEditable();
12
- $: glossary = $edition?.getGlossary() ?? {};
13
- // Sort by canonical phrases
14
- $: keys =
15
- $edition === undefined
16
- ? []
17
- : glossary === undefined || Object.keys(glossary).length === 0
18
- ? null
19
- : Object.keys(glossary).sort((a, b) => glossary[a].phrase.localeCompare(glossary[b].phrase));
12
+ let glossary = $derived($edition?.getGlossary() ?? {});
13
+ let keys = $derived($edition === void 0 ? [] : glossary === void 0 || Object.keys(glossary).length === 0 ? null : Object.keys(glossary).sort(
14
+ (a, b) => glossary[a].phrase.localeCompare(glossary[b].phrase)
15
+ ));
20
16
  function addEmptyDefinition() {
21
- if ($edition === undefined)
22
- return;
23
- // Generate an ID.
24
- const letters = 'abcdefghijklmnopqrstuvwxyz'.split('');
25
- let id = '';
26
- while (id.length < 4 || $edition.hasDefinition(id))
27
- id = id + letters[Math.round(Math.random() * 26)];
28
- edition.set($edition.withDefinition(id, '', '', []));
17
+ if ($edition === void 0) return;
18
+ const letters = "abcdefghijklmnopqrstuvwxyz".split("");
19
+ let id = "";
20
+ while (id.length < 4 || $edition.hasDefinition(id))
21
+ id = id + letters[Math.round(Math.random() * 26)];
22
+ edition.set($edition.withDefinition(id, "", "", []));
29
23
  }
30
24
  </script>
31
25
 
@@ -54,17 +48,19 @@ function addEmptyDefinition() {
54
48
  )
55
49
  : undefined}
56
50
  >
57
- <Outline
58
- slot="outline"
59
- previous={$edition.getPreviousChapterID(
60
- ChapterIDs.GlossaryID,
61
- editable,
62
- )}
63
- next={$edition.getNextChapterID(
64
- ChapterIDs.GlossaryID,
65
- editable,
66
- )}
67
- />
51
+ {#snippet outline()}
52
+ <Outline
53
+
54
+ previous={$edition.getPreviousChapterID(
55
+ ChapterIDs.GlossaryID,
56
+ editable,
57
+ )}
58
+ next={$edition.getNextChapterID(
59
+ ChapterIDs.GlossaryID,
60
+ editable,
61
+ )}
62
+ />
63
+ {/snippet}
68
64
  </Header>
69
65
  {#if editable}
70
66
  <Instructions {editable}>
@@ -1,16 +1,3 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: Record<string, never>;
4
- events: {
5
- [evt: string]: CustomEvent<any>;
6
- };
7
- slots: {};
8
- exports?: {} | undefined;
9
- bindings?: string | undefined;
10
- };
11
- export type GlossaryProps = typeof __propDef.props;
12
- export type GlossaryEvents = typeof __propDef.events;
13
- export type GlossarySlots = typeof __propDef.slots;
14
- export default class Glossary extends SvelteComponent<GlossaryProps, GlossaryEvents, GlossarySlots> {
15
- }
16
- export {};
1
+ declare const Glossary: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type Glossary = ReturnType<typeof Glossary>;
3
+ export default Glossary;
@@ -1,58 +1,52 @@
1
- <script>import Parser from '../../models/chapter/Parser';
2
- import Embed from '../chapter/Embed.svelte';
3
- import BookishEditor from '../editor/BookishEditor.svelte';
4
- import Title from './Title.svelte';
5
- import { onMount } from 'svelte';
6
- import TextEditor from '../editor/TextEditor.svelte';
7
- import { getUser, getEdition, getLeasee, lease } from './Contexts';
8
- import Button from '../app/Button.svelte';
9
- import ConfirmButton from '../editor/ConfirmButton.svelte';
10
- /** True if an author should be able to edit this header. */
11
- export let editable;
12
- export let label;
13
- export let header;
14
- export let id;
15
- export let subtitle = undefined;
16
- export let print = false;
17
- export let tags = undefined;
18
- export let getImage = undefined;
19
- export let setImage = undefined;
20
- /** For saving the revised chapter title*/
21
- export let save = null;
22
- let title = null;
23
- let showReminder = true;
1
+ <script lang="ts">import Parser from "../../models/chapter/Parser";
2
+ import Embed from "../chapter/Embed.svelte";
3
+ import BookishEditor from "../editor/BookishEditor.svelte";
4
+ import Title from "./Title.svelte";
5
+ import { onMount } from "svelte";
6
+ import TextEditor from "../editor/TextEditor.svelte";
7
+ import { getUser, getEdition, getLeasee, lease } from "./Contexts";
8
+ import Button from "../app/Button.svelte";
9
+ import ConfirmButton from "../editor/ConfirmButton.svelte";
10
+ let {
11
+ editable,
12
+ label,
13
+ header,
14
+ id,
15
+ subtitle = void 0,
16
+ print = false,
17
+ tags = void 0,
18
+ getImage = void 0,
19
+ setImage = void 0,
20
+ save = null,
21
+ outline,
22
+ before,
23
+ after
24
+ } = $props();
25
+ let title = $state(null);
26
+ let showReminder = $state(true);
24
27
  let auth = getUser();
25
28
  let edition = getEdition();
26
29
  function updateScrollReminder() {
27
- // If the bottom of the window is below the top of the title, hide the reminder.
28
- if (title)
29
- showReminder =
30
- window.scrollY + window.innerHeight <=
31
- title.getBoundingClientRect().top + window.scrollY;
30
+ if (title)
31
+ showReminder = window.scrollY + window.innerHeight <= title.getBoundingClientRect().top + window.scrollY;
32
32
  }
33
33
  function addCover() {
34
- if (setImage)
35
- setImage('|||||');
34
+ if (setImage) setImage("|||||");
36
35
  }
37
36
  function removeCover() {
38
- if (setImage)
39
- setImage(null);
37
+ if (setImage) setImage(null);
40
38
  }
41
- // When the title becomes visible or hidden, update the scroll reminder.
42
39
  onMount(() => {
43
- const intersectionObserver = new IntersectionObserver(() => updateScrollReminder());
44
- if (title)
45
- intersectionObserver.observe(title);
46
- updateScrollReminder();
47
- // Stop observing when unmounted.
48
- return () => {
49
- if (title)
50
- intersectionObserver.unobserve(title);
51
- };
40
+ const intersectionObserver = new IntersectionObserver(
41
+ () => updateScrollReminder()
42
+ );
43
+ if (title) intersectionObserver.observe(title);
44
+ updateScrollReminder();
45
+ return () => {
46
+ if (title) intersectionObserver.unobserve(title);
47
+ };
52
48
  });
53
- // Get the embed, update when getImage function prop changes.
54
- let embed;
55
- $: embed = getImage ? getImage() : null;
49
+ let embed = $derived(getImage ? getImage() : null);
56
50
  </script>
57
51
 
58
52
  <!-- We key on the chapter ID to avoid laggy updates from image loading -->
@@ -80,7 +74,7 @@ $: embed = getImage ? getImage() : null;
80
74
  />
81
75
  {/if}
82
76
  {#if !print && showReminder}
83
- <div class="bookish-scroll-reminder" />
77
+ <div class="bookish-scroll-reminder"></div>
84
78
  {/if}
85
79
  </div>
86
80
  {:else}
@@ -88,7 +82,7 @@ $: embed = getImage ? getImage() : null;
88
82
  <p>&nbsp;</p>
89
83
  {/if}
90
84
  {#if !print}
91
- <slot name="outline" />
85
+ {@render outline?.()}
92
86
  {/if}
93
87
  {#if editable && getImage && setImage}
94
88
  {#if embed === null}
@@ -104,7 +98,7 @@ $: embed = getImage ? getImage() : null;
104
98
  {/if}
105
99
  {/if}
106
100
  <div bind:this={title} class="bookish-chapter-header-text">
107
- <slot name="before" />
101
+ {@render before?.()}
108
102
  <Title>
109
103
  {#if editable && save}
110
104
  <TextEditor
@@ -123,7 +117,7 @@ $: embed = getImage ? getImage() : null;
123
117
  >{/if}
124
118
  {/if}
125
119
  </Title>
126
- <slot name="after" />
120
+ {@render after?.()}
127
121
  {#if tags}
128
122
  <div
129
123
  >{#each tags as tag}<span class="bookish-tag">{tag}</span
@@ -1,31 +1,20 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- /** True if an author should be able to edit this header. */ editable: boolean;
5
- label: string;
6
- header: string;
7
- id: string;
8
- subtitle?: string | undefined;
9
- print?: boolean;
10
- tags?: string[] | undefined;
11
- getImage?: undefined | (() => string | null);
12
- setImage?: undefined | ((embed: string | null) => Promise<void> | void);
13
- /** For saving the revised chapter title*/ save?: ((text: string) => Promise<void> | void) | null;
14
- };
15
- events: {
16
- [evt: string]: CustomEvent<any>;
17
- };
18
- slots: {
19
- outline: {};
20
- before: {};
21
- after: {};
22
- };
23
- exports?: {} | undefined;
24
- bindings?: string | undefined;
25
- };
26
- export type HeaderProps = typeof __propDef.props;
27
- export type HeaderEvents = typeof __propDef.events;
28
- export type HeaderSlots = typeof __propDef.slots;
29
- export default class Header extends SvelteComponent<HeaderProps, HeaderEvents, HeaderSlots> {
1
+ interface Props {
2
+ /** True if an author should be able to edit this header. */
3
+ editable: boolean;
4
+ label: string;
5
+ header: string;
6
+ id: string;
7
+ subtitle?: string | undefined;
8
+ print?: boolean;
9
+ tags?: string[] | undefined;
10
+ getImage?: undefined | (() => string | null);
11
+ setImage?: undefined | ((embed: string | null) => Promise<void> | void);
12
+ /** For saving the revised chapter title*/
13
+ save?: ((text: string) => Promise<void> | void) | null;
14
+ outline?: import('svelte').Snippet;
15
+ before?: import('svelte').Snippet;
16
+ after?: import('svelte').Snippet;
30
17
  }
31
- export {};
18
+ declare const Header: import("svelte").Component<Props, {}, "">;
19
+ type Header = ReturnType<typeof Header>;
20
+ export default Header;