bookish-press 0.7.4 → 0.9.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 (276) hide show
  1. package/README.md +56 -9
  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 +44 -45
  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/DownloadEPUB.svelte +234 -0
  169. package/dist/components/page/DownloadEPUB.svelte.d.ts +3 -0
  170. package/dist/components/page/EditableHeader.svelte +4 -6
  171. package/dist/components/page/EditableHeader.svelte.d.ts +7 -18
  172. package/dist/components/page/Edition.svelte +57 -71
  173. package/dist/components/page/Edition.svelte.d.ts +7 -20
  174. package/dist/components/page/EditionLoader.svelte +119 -82
  175. package/dist/components/page/EditionLoader.svelte.d.ts +6 -19
  176. package/dist/components/page/Editions.svelte +26 -31
  177. package/dist/components/page/Editions.svelte.d.ts +5 -17
  178. package/dist/components/page/Glossary.svelte +31 -35
  179. package/dist/components/page/Glossary.svelte.d.ts +3 -16
  180. package/dist/components/page/Header.svelte +43 -49
  181. package/dist/components/page/Header.svelte.d.ts +19 -30
  182. package/dist/components/page/Index.svelte +46 -46
  183. package/dist/components/page/Index.svelte.d.ts +3 -16
  184. package/dist/components/page/Instructions.svelte +2 -2
  185. package/dist/components/page/Instructions.svelte.d.ts +6 -19
  186. package/dist/components/page/License.svelte +13 -7
  187. package/dist/components/page/License.svelte.d.ts +16 -14
  188. package/dist/components/page/Loading.svelte +9 -9
  189. package/dist/components/page/Loading.svelte.d.ts +22 -21
  190. package/dist/components/page/Media.svelte +36 -27
  191. package/dist/components/page/Media.svelte.d.ts +3 -16
  192. package/dist/components/page/MediaPreview.svelte +22 -19
  193. package/dist/components/page/MediaPreview.svelte.d.ts +8 -21
  194. package/dist/components/page/Muted.svelte +4 -1
  195. package/dist/components/page/Muted.svelte.d.ts +5 -28
  196. package/dist/components/page/Outline.svelte +75 -97
  197. package/dist/components/page/Outline.svelte.d.ts +8 -20
  198. package/dist/components/page/Page.svelte +23 -33
  199. package/dist/components/page/Page.svelte.d.ts +7 -20
  200. package/dist/components/page/PageHeader.svelte +2 -2
  201. package/dist/components/page/PageHeader.svelte.d.ts +6 -19
  202. package/dist/components/page/PageParagraph.svelte +4 -1
  203. package/dist/components/page/PageParagraph.svelte.d.ts +5 -28
  204. package/dist/components/page/PossibleChapter.svelte +7 -7
  205. package/dist/components/page/PossibleChapter.svelte.d.ts +3 -16
  206. package/dist/components/page/PossibleReference.svelte +4 -5
  207. package/dist/components/page/PossibleReference.svelte.d.ts +6 -18
  208. package/dist/components/page/Print.svelte +11 -12
  209. package/dist/components/page/Print.svelte.d.ts +3 -16
  210. package/dist/components/page/Publish.svelte +47 -47
  211. package/dist/components/page/Publish.svelte.d.ts +3 -16
  212. package/dist/components/page/Reference.svelte +24 -35
  213. package/dist/components/page/Reference.svelte.d.ts +6 -18
  214. package/dist/components/page/References.svelte +21 -22
  215. package/dist/components/page/References.svelte.d.ts +3 -16
  216. package/dist/components/page/Rows.svelte +5 -2
  217. package/dist/components/page/Rows.svelte.d.ts +5 -28
  218. package/dist/components/page/Search.svelte +59 -61
  219. package/dist/components/page/Search.svelte.d.ts +3 -16
  220. package/dist/components/page/Status.svelte +2 -2
  221. package/dist/components/page/Status.svelte.d.ts +16 -14
  222. package/dist/components/page/SubdomainEditor.svelte +11 -11
  223. package/dist/components/page/SubdomainEditor.svelte.d.ts +16 -14
  224. package/dist/components/page/TableOfContents.svelte +157 -124
  225. package/dist/components/page/TableOfContents.svelte.d.ts +3 -16
  226. package/dist/components/page/TableOfContentsImage.svelte +6 -7
  227. package/dist/components/page/TableOfContentsImage.svelte.d.ts +6 -18
  228. package/dist/components/page/TableOfContentsRow.svelte +32 -32
  229. package/dist/components/page/TableOfContentsRow.svelte.d.ts +10 -22
  230. package/dist/components/page/ThemeEditor.svelte +35 -28
  231. package/dist/components/page/ThemeEditor.svelte.d.ts +3 -16
  232. package/dist/components/page/ThemeEditorPreview.svelte +11 -13
  233. package/dist/components/page/ThemeEditorPreview.svelte.d.ts +5 -17
  234. package/dist/components/page/ThemeSetEditor.svelte +4 -6
  235. package/dist/components/page/ThemeSetEditor.svelte.d.ts +7 -19
  236. package/dist/components/page/ThemeVariableEditor.svelte +9 -11
  237. package/dist/components/page/ThemeVariableEditor.svelte.d.ts +7 -19
  238. package/dist/components/page/Title.svelte +4 -1
  239. package/dist/components/page/Title.svelte.d.ts +5 -28
  240. package/dist/components/page/Unknown.svelte +11 -8
  241. package/dist/components/page/Unknown.svelte.d.ts +5 -17
  242. package/dist/epub/build.d.ts +39 -0
  243. package/dist/epub/build.js +143 -0
  244. package/dist/epub/build.test.d.ts +1 -0
  245. package/dist/epub/build.test.js +411 -0
  246. package/dist/epub/images.d.ts +79 -0
  247. package/dist/epub/images.js +260 -0
  248. package/dist/epub/images.test.d.ts +1 -0
  249. package/dist/epub/images.test.js +129 -0
  250. package/dist/epub/package.d.ts +75 -0
  251. package/dist/epub/package.js +392 -0
  252. package/dist/epub/stylesheet.test.d.ts +1 -0
  253. package/dist/epub/stylesheet.test.js +243 -0
  254. package/dist/epub/xhtml.d.ts +69 -0
  255. package/dist/epub/xhtml.js +367 -0
  256. package/dist/epub/xhtml.test.d.ts +1 -0
  257. package/dist/epub/xhtml.test.js +283 -0
  258. package/dist/epub/zip.d.ts +35 -0
  259. package/dist/epub/zip.js +202 -0
  260. package/dist/epub/zip.test.d.ts +1 -0
  261. package/dist/epub/zip.test.js +171 -0
  262. package/dist/index.d.ts +1 -0
  263. package/dist/index.js +1 -0
  264. package/dist/models/Firebase.js +18 -4
  265. package/dist/models/book/Book.js +2 -1
  266. package/dist/models/book/BookMedia.js +1 -2
  267. package/dist/models/book/Chapter.js +3 -2
  268. package/dist/models/book/ChapterID.d.ts +1 -1
  269. package/dist/models/book/Edition.d.ts +1 -1
  270. package/dist/models/book/Edition.js +6 -1
  271. package/dist/models/chapter/BlocksNode.js +3 -1
  272. package/dist/models/chapter/BlocksNode.test.js +5 -1
  273. package/dist/models/chapter/Node.test.js +2 -2
  274. package/dist/models/chapter/TextNode.js +8 -5
  275. package/dist/models/chapter/TextNode.test.js +8 -0
  276. package/package.json +36 -22
@@ -0,0 +1,85 @@
1
+ import { beforeAll, expect, test, vi } from 'vitest';
2
+ import { render } from '@testing-library/svelte';
3
+ import { tick } from 'svelte';
4
+ import { writable } from 'svelte/store';
5
+ import Parser from '../../models/chapter/Parser';
6
+ import Chapter from '../../models/book/Chapter';
7
+ import ChapterBody from './ChapterBody.svelte';
8
+ import { CARET, CHAPTER, EDITION } from '../page/Contexts';
9
+ // The page state only exists inside a running SvelteKit app; Contexts.ts
10
+ // reads it to decide whether a route is editable.
11
+ vi.mock('$app/state', () => ({
12
+ page: {
13
+ route: { id: '/(reader)/[bookid]' },
14
+ params: {},
15
+ url: new URL('http://localhost/'),
16
+ },
17
+ }));
18
+ beforeAll(() => {
19
+ // jsdom doesn't implement matchMedia, which Marginal uses for mobile layout.
20
+ window.matchMedia = (query) => ({
21
+ matches: false,
22
+ media: query,
23
+ onchange: null,
24
+ addListener: () => undefined,
25
+ removeListener: () => undefined,
26
+ addEventListener: () => undefined,
27
+ removeEventListener: () => undefined,
28
+ dispatchEvent: () => false,
29
+ });
30
+ });
31
+ function makeChapterContext(requestLayout) {
32
+ const context = {
33
+ chapter: Chapter.fromJSON({
34
+ id: 'test',
35
+ title: 'Test Chapter',
36
+ authors: [],
37
+ image: null,
38
+ numbered: true,
39
+ forthcoming: false,
40
+ text: '',
41
+ uids: [],
42
+ }),
43
+ marginal: writable(undefined),
44
+ requestLayout,
45
+ };
46
+ return context;
47
+ }
48
+ function renderChapter(markup, requestLayout = () => undefined) {
49
+ return render(ChapterBody, {
50
+ props: { node: Parser.parseChapter(undefined, markup) },
51
+ context: new Map([
52
+ [CHAPTER, writable(makeChapterContext(requestLayout))],
53
+ [EDITION, writable(undefined)],
54
+ [CARET, writable(undefined)],
55
+ ]),
56
+ });
57
+ }
58
+ test('renders paragraphs and code blocks', () => {
59
+ const { container } = renderChapter("Hello world, this is a paragraph.\n\n`\nconsole.log('hi');\n`\n");
60
+ expect(container.textContent).toContain('Hello world, this is a paragraph.');
61
+ expect(container.querySelector('code.bookish-code')).not.toBeNull();
62
+ });
63
+ test('renders footnote content in a marginal', () => {
64
+ const { container } = renderChapter('This is a claim.{And this is the footnote that supports it.}');
65
+ expect(container.textContent).toContain('This is a claim.');
66
+ const footnote = container.querySelector('.bookish-footnote');
67
+ expect(footnote).not.toBeNull();
68
+ expect(footnote?.textContent).toContain('And this is the footnote that supports it.');
69
+ });
70
+ // This guards the marginal layout contract: every render of a marginal
71
+ // component must request a chapter-wide layout pass, including re-renders
72
+ // caused by content changes. (Marginal components do this in an $effect
73
+ // that tracks their rendered inputs; see Footnote.svelte and friends.)
74
+ test('lays out marginals on render and again when content changes', async () => {
75
+ const layout = vi.fn();
76
+ const { rerender } = renderChapter('A fact.{A footnote.}', layout);
77
+ await tick();
78
+ expect(layout).toHaveBeenCalled();
79
+ const initialCalls = layout.mock.calls.length;
80
+ await rerender({
81
+ node: Parser.parseChapter(undefined, 'A revised fact.{A revised footnote.}'),
82
+ });
83
+ await tick();
84
+ expect(layout.mock.calls.length).toBeGreaterThan(initialCalls);
85
+ });
@@ -1,36 +1,30 @@
1
- <svelte:options immutable={true} />
2
-
3
- <script>import Marginal from './Marginal.svelte';
4
- import Problem from './Problem.svelte';
5
- import Atom from './Atom.svelte';
6
- import { getChapter, getEdition, getRoot } from '../page/Contexts';
7
- import PossibleReference from '../page/PossibleReference.svelte';
8
- import { afterUpdate } from 'svelte';
9
- export let node;
1
+ <script lang="ts">import Marginal from "./Marginal.svelte";
2
+ import Problem from "./Problem.svelte";
3
+ import Atom from "./Atom.svelte";
4
+ import { getChapter, getEdition, getRoot } from "../page/Contexts";
5
+ import PossibleReference from "../page/PossibleReference.svelte";
6
+ let { node } = $props();
10
7
  let chapter = getChapter();
11
8
  let edition = getEdition();
12
9
  let root = getRoot();
13
- // Sort citations numerically, however they're numbered.
14
- $: citations = node.getMeta().sort((a, b) => {
15
- if ($root === undefined)
16
- return 0;
10
+ let citations = $derived(
11
+ node.getMeta().sort((a, b) => {
12
+ if ($root === void 0) return 0;
17
13
  let aNumber = $root.getCitationNumber(a);
18
14
  let bNumber = $root.getCitationNumber(b);
19
15
  if (aNumber === null) {
20
- if (bNumber === null)
21
- return 0;
22
- else
23
- return 1;
24
- }
25
- else {
26
- if (bNumber === null)
27
- return -1;
28
- else
29
- return aNumber - bNumber;
16
+ if (bNumber === null) return 0;
17
+ else return 1;
18
+ } else {
19
+ if (bNumber === null) return -1;
20
+ else return aNumber - bNumber;
30
21
  }
22
+ })
23
+ );
24
+ $effect(() => {
25
+ void citations;
26
+ $chapter?.requestLayout();
31
27
  });
32
- // Position the marginals on every render.
33
- afterUpdate(() => $chapter?.layoutMarginals());
34
28
  </script>
35
29
 
36
30
  <Atom {node}
@@ -41,7 +35,7 @@ afterUpdate(() => $chapter?.layoutMarginals());
41
35
  label="reference {citations
42
36
  .map((c) => $root.getCitationNumber(c))
43
37
  .join(', ')}"
44
- ><svelte:fragment slot="interactor">
38
+ >{#snippet interactor()}
45
39
  {#each citations as citationID, index}{@const citationNumber =
46
40
  $root.getCitationNumber(
47
41
  citationID,
@@ -55,26 +49,26 @@ afterUpdate(() => $chapter?.layoutMarginals());
55
49
  >,</sup
56
50
  >{/if}{:else}<sup class="bookish-citation-symbol"
57
51
  >{'\u2014'}</sup
58
- >{/each}</svelte:fragment
59
- ><span slot="content" class="bookish-references"
60
- >{#each citations as citationID}
61
- {@const citationNumber =
62
- $root.getCitationNumber(citationID)}
63
- {@const ref = $edition?.getReference(citationID)}
64
- {#if citationNumber && ref && $edition}<span
65
- class="bookish-reference"
66
- aria-hidden="true"
67
- >
68
- <sup class="bookish-citation-symbol"
69
- >{citationNumber}</sup
52
+ >{/each}{/snippet}{#snippet content()}<span
53
+ class="bookish-references"
54
+ >{#each citations as citationID}
55
+ {@const citationNumber =
56
+ $root.getCitationNumber(citationID)}
57
+ {@const ref = $edition?.getReference(citationID)}
58
+ {#if citationNumber && ref && $edition}<span
59
+ class="bookish-reference"
60
+ aria-hidden="true"
70
61
  >
71
- <PossibleReference
72
- node={ref}
73
- edit={false}
74
- /></span
75
- >{/if}
76
- {/each}</span
77
- ></Marginal
62
+ <sup class="bookish-citation-symbol"
63
+ >{citationNumber}</sup
64
+ >
65
+ <PossibleReference
66
+ node={ref}
67
+ edit={false}
68
+ /></span
69
+ >{/if}
70
+ {/each}</span
71
+ >{/snippet}</Marginal
78
72
  ></span
79
73
  >{/if}</Atom
80
74
  >
@@ -1,19 +1,7 @@
1
- import { SvelteComponent } from "svelte";
2
1
  import type CitationsNode from '../../models/chapter/CitationsNode';
3
- declare const __propDef: {
4
- props: {
5
- node: CitationsNode;
6
- };
7
- events: {
8
- [evt: string]: CustomEvent<any>;
9
- };
10
- slots: {};
11
- exports?: {} | undefined;
12
- bindings?: string | undefined;
13
- };
14
- export type CitationsProps = typeof __propDef.props;
15
- export type CitationsEvents = typeof __propDef.events;
16
- export type CitationsSlots = typeof __propDef.slots;
17
- export default class Citations extends SvelteComponent<CitationsProps, CitationsEvents, CitationsSlots> {
2
+ interface Props {
3
+ node: CitationsNode;
18
4
  }
19
- export {};
5
+ declare const Citations: import("svelte").Component<Props, {}, "">;
6
+ type Citations = ReturnType<typeof Citations>;
7
+ export default Citations;
@@ -1,22 +1,22 @@
1
- <svelte:options immutable={true} />
2
-
3
- <script>import { afterUpdate } from 'svelte';
4
- import Prism from './ExtendedPrism';
5
- export let editable;
6
- export let inline;
7
- export let nodeID;
8
- export let edited = undefined;
9
- export let language = undefined;
10
- let element = null;
11
- // When the component mounts or updates, highlight the code inside.
12
- afterUpdate(() => {
13
- if (element) {
14
- Prism.highlightElement(element);
15
- }
1
+ <script lang="ts">import Prism from "./ExtendedPrism";
2
+ let {
3
+ editable,
4
+ inline,
5
+ nodeID,
6
+ edited = void 0,
7
+ language = void 0,
8
+ code
9
+ } = $props();
10
+ let element = $state(null);
11
+ $effect(() => {
12
+ void code;
13
+ void language;
14
+ if (element) {
15
+ Prism.highlightElement(element);
16
+ }
16
17
  });
17
18
  function handleChange() {
18
- if (element && edited)
19
- edited(element.innerText);
19
+ if (element && edited) edited(element.innerText);
20
20
  }
21
21
  </script>
22
22
 
@@ -27,145 +27,148 @@ function handleChange() {
27
27
  class={`bookish-code ${
28
28
  inline ? 'bookish-code-inline' : 'bookish-code-block'
29
29
  } ${language ? `language-${language}` : ''}`}
30
- on:blur={handleChange}
30
+ onblur={handleChange}>{code}</code
31
31
  >
32
- <slot />
33
- </code>
34
-
35
- <style global>
36
- :global(.bookish-code) {
37
- font-family: var(--bookish-code-font-family);
38
- font-weight: var(--bookish-code-font-weight);
39
- font-size: var(--bookish-code-font-size);
40
- border: 1px solid var(--bookish-border-color-light);
41
- color: var(--bookish-muted-color);
42
- background-color: var(--bookish-block-background-color);
43
- clear: both;
44
- overflow-x: scroll;
45
- }
46
-
47
- :global(code) {
48
- font-family: var(--bookish-code-font-family);
49
- font-weight: var(--bookish-code-font-weight);
50
- font-size: var(--bookish-code-font-size);
51
- }
52
-
53
- :global(.bookish-code-block) {
54
- display: block;
55
- padding: var(--bookish-block-padding);
56
- line-height: var(--bookish-paragraph-line-height-tight);
57
- border-radius: var(--bookish-roundedness);
58
- }
59
-
60
- :global(.bookish-code-block.wrap) {
61
- white-space: pre-wrap !important;
62
- }
63
-
64
- :global(.bookish-code-inline) {
65
- display: inline;
66
- padding: calc(1.5 * var(--bookish-inline-padding))
67
- var(--bookish-inline-padding);
68
- white-space: pre-line !important;
69
- }
70
-
71
- :global(.bookish-code-inline) :global(code) {
72
- display: inline;
73
- padding: 0em;
74
- }
75
-
76
- /* PrismJS 1.29.0
77
- https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+python */
78
- /**
79
- * prism.js default theme for JavaScript, CSS and HTML
80
- * Based on dabblet (http://dabblet.com)
81
- * @author Lea Verou
82
- */
83
-
84
- :global(code[class*='language-']) {
85
- color: var(--bookish-paragraph-color);
86
- background: none;
87
- font-family: var(--bookish-code-font-family);
88
- font-size: var(--bookish-code-font-size);
89
- text-align: left;
90
- white-space: pre;
91
- word-spacing: normal;
92
- word-break: normal;
93
- word-wrap: normal;
94
- line-height: 1.5;
95
-
96
- -moz-tab-size: 4;
97
- -o-tab-size: 4;
98
- tab-size: 4;
99
-
100
- -webkit-hyphens: none;
101
- -moz-hyphens: none;
102
- -ms-hyphens: none;
103
- hyphens: none;
104
- }
105
-
106
- :global(.token.comment),
107
- :global(.token.prolog),
108
- :global(.token.doctype),
109
- :global(.token.cdata) {
110
- color: var(--bookish-comment-color);
111
- }
112
-
113
- :global(.token.punctuation) {
114
- color: var(--bookish-muted-color);
115
- }
116
-
117
- :global(.token.namespace) {
118
- opacity: 0.7;
119
- }
120
-
121
- :global(.token.property),
122
- :global(.token.tag),
123
- :global(.token.boolean),
124
- :global(.token.number),
125
- :global(.token.constant),
126
- :global(.token.symbol),
127
- :global(.token.deleted) {
128
- color: var(--bookish-error-color);
129
- }
130
-
131
- :global(.token.selector),
132
- :global(.token.attr-name),
133
- :global(.token.string),
134
- :global(.token.char),
135
- :global(.token.builtin),
136
- :global(.token.inserted) {
137
- color: var(--bookish-pragraph-color);
138
- }
139
-
140
- :global(.token.operator),
141
- :global(.token.entity),
142
- :global(.token.url) {
143
- color: var(--bookish-bullet-color);
144
- }
145
-
146
- :global(.token.atrule),
147
- :global(.token.attr-value),
148
- :global(.token.keyword) {
149
- color: var(--bookish-link-color);
150
- }
151
-
152
- :global(.token.regex),
153
- :global(.token.important),
154
- :global(.token.variable),
155
- :global(.token.function),
156
- :global(.token.class-name) {
157
- color: var(--bookish-highlight-color);
158
- }
159
-
160
- :global(.token.important),
161
- :global(.token.bold) {
162
- font-weight: bold;
163
- }
164
- :global(.token.italic) {
165
- font-style: italic;
166
- }
167
32
 
168
- :global(.token.entity) {
169
- cursor: help;
33
+ <!-- These styles are global because Prism inserts token elements at runtime
34
+ that the compiler cannot see, and because other components render
35
+ bookish-code elements of their own. -->
36
+ <style>
37
+ :global {
38
+ .bookish-code {
39
+ font-family: var(--bookish-code-font-family);
40
+ font-weight: var(--bookish-code-font-weight);
41
+ font-size: var(--bookish-code-font-size);
42
+ border: 1px solid var(--bookish-border-color-light);
43
+ color: var(--bookish-muted-color);
44
+ background-color: var(--bookish-block-background-color);
45
+ clear: both;
46
+ overflow-x: scroll;
47
+ }
48
+
49
+ code {
50
+ font-family: var(--bookish-code-font-family);
51
+ font-weight: var(--bookish-code-font-weight);
52
+ font-size: var(--bookish-code-font-size);
53
+ }
54
+
55
+ .bookish-code-block {
56
+ display: block;
57
+ padding: var(--bookish-block-padding);
58
+ line-height: var(--bookish-paragraph-line-height-tight);
59
+ border-radius: var(--bookish-roundedness);
60
+ }
61
+
62
+ .bookish-code-block.wrap {
63
+ white-space: pre-wrap !important;
64
+ }
65
+
66
+ .bookish-code-inline {
67
+ display: inline;
68
+ padding: calc(1.5 * var(--bookish-inline-padding))
69
+ var(--bookish-inline-padding);
70
+ white-space: pre-line !important;
71
+ }
72
+
73
+ .bookish-code-inline code {
74
+ display: inline;
75
+ padding: 0em;
76
+ }
77
+
78
+ /* PrismJS 1.29.0
79
+ https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+python */
80
+ /**
81
+ * prism.js default theme for JavaScript, CSS and HTML
82
+ * Based on dabblet (http://dabblet.com)
83
+ * @author Lea Verou
84
+ */
85
+
86
+ code[class*='language-'] {
87
+ color: var(--bookish-paragraph-color);
88
+ background: none;
89
+ font-family: var(--bookish-code-font-family);
90
+ font-size: var(--bookish-code-font-size);
91
+ text-align: left;
92
+ white-space: pre;
93
+ word-spacing: normal;
94
+ word-break: normal;
95
+ word-wrap: normal;
96
+ line-height: 1.5;
97
+
98
+ -moz-tab-size: 4;
99
+ -o-tab-size: 4;
100
+ tab-size: 4;
101
+
102
+ -webkit-hyphens: none;
103
+ -moz-hyphens: none;
104
+ -ms-hyphens: none;
105
+ hyphens: none;
106
+ }
107
+
108
+ .token.comment,
109
+ .token.prolog,
110
+ .token.doctype,
111
+ .token.cdata {
112
+ color: var(--bookish-comment-color);
113
+ }
114
+
115
+ .token.punctuation {
116
+ color: var(--bookish-muted-color);
117
+ }
118
+
119
+ .token.namespace {
120
+ opacity: 0.7;
121
+ }
122
+
123
+ .token.property,
124
+ .token.tag,
125
+ .token.boolean,
126
+ .token.number,
127
+ .token.constant,
128
+ .token.symbol,
129
+ .token.deleted {
130
+ color: var(--bookish-error-color);
131
+ }
132
+
133
+ .token.selector,
134
+ .token.attr-name,
135
+ .token.string,
136
+ .token.char,
137
+ .token.builtin,
138
+ .token.inserted {
139
+ color: var(--bookish-paragraph-color);
140
+ }
141
+
142
+ .token.operator,
143
+ .token.entity,
144
+ .token.url {
145
+ color: var(--bookish-bullet-color);
146
+ }
147
+
148
+ .token.atrule,
149
+ .token.attr-value,
150
+ .token.keyword {
151
+ color: var(--bookish-link-color);
152
+ }
153
+
154
+ .token.regex,
155
+ .token.important,
156
+ .token.variable,
157
+ .token.function,
158
+ .token.class-name {
159
+ color: var(--bookish-highlight-color);
160
+ }
161
+
162
+ .token.important,
163
+ .token.bold {
164
+ font-weight: bold;
165
+ }
166
+ .token.italic {
167
+ font-style: italic;
168
+ }
169
+
170
+ .token.entity {
171
+ cursor: help;
172
+ }
170
173
  }
171
174
  </style>
@@ -1,24 +1,11 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- editable: boolean;
5
- inline: boolean;
6
- nodeID: number | undefined;
7
- edited?: ((text: string) => void) | undefined;
8
- language?: string | undefined;
9
- };
10
- events: {
11
- [evt: string]: CustomEvent<any>;
12
- };
13
- slots: {
14
- default: {};
15
- };
16
- exports?: {} | undefined;
17
- bindings?: string | undefined;
18
- };
19
- export type CodeProps = typeof __propDef.props;
20
- export type CodeEvents = typeof __propDef.events;
21
- export type CodeSlots = typeof __propDef.slots;
22
- export default class Code extends SvelteComponent<CodeProps, CodeEvents, CodeSlots> {
1
+ interface Props {
2
+ editable: boolean;
3
+ inline: boolean;
4
+ nodeID: number | undefined;
5
+ edited?: ((text: string) => void) | undefined;
6
+ language?: string | undefined;
7
+ code: string;
23
8
  }
24
- export {};
9
+ declare const Code: import("svelte").Component<Props, {}, "">;
10
+ type Code = ReturnType<typeof Code>;
11
+ export default Code;
@@ -1,21 +1,27 @@
1
- <svelte:options immutable={true} />
2
-
3
- <script>import Atom from './Atom.svelte';
4
- import Marginal from './Marginal.svelte';
5
- import Format from './Format.svelte';
6
- import { getChapter, isChapterEditable, getCaret, getEdition, getRoot, } from '../page/Contexts';
7
- import { afterUpdate } from 'svelte';
8
- import Icon from '../editor/Icon.svelte';
9
- import CommentIcon from '../editor/icons/comment.svg?raw';
10
- export let node;
1
+ <script lang="ts">import Atom from "./Atom.svelte";
2
+ import Marginal from "./Marginal.svelte";
3
+ import Format from "./Format.svelte";
4
+ import {
5
+ getChapter,
6
+ isChapterEditable,
7
+ getCaret,
8
+ getRoot
9
+ } from "../page/Contexts";
10
+ import Icon from "../editor/Icon.svelte";
11
+ import CommentIcon from "../editor/icons/comment.svg?raw";
12
+ let { node } = $props();
11
13
  let chapter = getChapter();
12
14
  let editable = isChapterEditable();
13
15
  let root = getRoot();
14
16
  let caret = getCaret();
15
- $: focused =
16
- $caret && $caret.range && node.contains($caret.range.start.node);
17
- // Position the marginals on every render.
18
- afterUpdate(() => $chapter?.layoutMarginals());
17
+ let focused = $derived(
18
+ $caret && $caret.range && node.contains($caret.range.start.node)
19
+ );
20
+ $effect(() => {
21
+ void node;
22
+ void focused;
23
+ $chapter?.requestLayout();
24
+ });
19
25
  </script>
20
26
 
21
27
  <Atom {node}>
@@ -26,15 +32,16 @@ afterUpdate(() => $chapter?.layoutMarginals());
26
32
  ($root === undefined ? '?' : $root.getComments().indexOf(node))}
27
33
  label="comment, escape to edit"
28
34
  >
29
- <span slot="interactor" class="bookish-comment-symbol">
30
- <Icon icon={CommentIcon} />
31
- </span>
32
- <span
33
- slot="content"
34
- class={`comment ${focused ? 'comment-focused' : ''}`}
35
- >
36
- <Format node={node.getMeta()} placeholder="comment" />
37
- </span>
35
+ {#snippet interactor()}
36
+ <span class="bookish-comment-symbol">
37
+ <Icon icon={CommentIcon} />
38
+ </span>
39
+ {/snippet}
40
+ {#snippet content()}
41
+ <span class={`comment ${focused ? 'comment-focused' : ''}`}>
42
+ <Format node={node.getMeta()} placeholder="comment" />
43
+ </span>
44
+ {/snippet}
38
45
  </Marginal>
39
46
  {/if}
40
47
  </Atom>
@@ -1,19 +1,7 @@
1
- import { SvelteComponent } from "svelte";
2
1
  import type CommentNode from '../../models/chapter/CommentNode';
3
- declare const __propDef: {
4
- props: {
5
- node: CommentNode;
6
- };
7
- events: {
8
- [evt: string]: CustomEvent<any>;
9
- };
10
- slots: {};
11
- exports?: {} | undefined;
12
- bindings?: string | undefined;
13
- };
14
- export type CommentProps = typeof __propDef.props;
15
- export type CommentEvents = typeof __propDef.events;
16
- export type CommentSlots = typeof __propDef.slots;
17
- export default class Comment extends SvelteComponent<CommentProps, CommentEvents, CommentSlots> {
2
+ interface Props {
3
+ node: CommentNode;
18
4
  }
19
- export {};
5
+ declare const Comment: import("svelte").Component<Props, {}, "">;
6
+ type Comment = ReturnType<typeof Comment>;
7
+ export default Comment;