bookish-press 0.4.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 (309) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/components/Auth.svelte +52 -0
  4. package/components/Auth.svelte.d.ts +16 -0
  5. package/components/Authentication.d.ts +8 -0
  6. package/components/Authentication.js +1 -0
  7. package/components/BookPreview.svelte +87 -0
  8. package/components/BookPreview.svelte.d.ts +18 -0
  9. package/components/External.svelte +4 -0
  10. package/components/External.svelte.d.ts +18 -0
  11. package/components/Link.svelte +5 -0
  12. package/components/Link.svelte.d.ts +19 -0
  13. package/components/chapter/Atom.svelte +36 -0
  14. package/components/chapter/Atom.svelte.d.ts +19 -0
  15. package/components/chapter/Block.svelte +32 -0
  16. package/components/chapter/Block.svelte.d.ts +17 -0
  17. package/components/chapter/Callout.svelte +10 -0
  18. package/components/chapter/Callout.svelte.d.ts +17 -0
  19. package/components/chapter/CaptionedCode.svelte +34 -0
  20. package/components/chapter/CaptionedCode.svelte.d.ts +17 -0
  21. package/components/chapter/ChapterBody.svelte +23 -0
  22. package/components/chapter/ChapterBody.svelte.d.ts +18 -0
  23. package/components/chapter/Citations.svelte +66 -0
  24. package/components/chapter/Citations.svelte.d.ts +17 -0
  25. package/components/chapter/Code.svelte +35 -0
  26. package/components/chapter/Code.svelte.d.ts +22 -0
  27. package/components/chapter/Comment.svelte +46 -0
  28. package/components/chapter/Comment.svelte.d.ts +17 -0
  29. package/components/chapter/Definition.svelte +38 -0
  30. package/components/chapter/Definition.svelte.d.ts +20 -0
  31. package/components/chapter/Embed.svelte +122 -0
  32. package/components/chapter/Embed.svelte.d.ts +18 -0
  33. package/components/chapter/ErrorMessage.svelte +4 -0
  34. package/components/chapter/ErrorMessage.svelte.d.ts +17 -0
  35. package/components/chapter/Footnote.svelte +37 -0
  36. package/components/chapter/Footnote.svelte.d.ts +19 -0
  37. package/components/chapter/Format.svelte +57 -0
  38. package/components/chapter/Format.svelte.d.ts +18 -0
  39. package/components/chapter/InlineCode.svelte +12 -0
  40. package/components/chapter/InlineCode.svelte.d.ts +17 -0
  41. package/components/chapter/Label.svelte +20 -0
  42. package/components/chapter/Label.svelte.d.ts +17 -0
  43. package/components/chapter/Link.svelte +51 -0
  44. package/components/chapter/Link.svelte.d.ts +17 -0
  45. package/components/chapter/List.svelte +14 -0
  46. package/components/chapter/List.svelte.d.ts +17 -0
  47. package/components/chapter/Marginal.svelte +48 -0
  48. package/components/chapter/Marginal.svelte.d.ts +19 -0
  49. package/components/chapter/Paragraph.svelte +15 -0
  50. package/components/chapter/Paragraph.svelte.d.ts +18 -0
  51. package/components/chapter/Python.svelte +81 -0
  52. package/components/chapter/Python.svelte.d.ts +18 -0
  53. package/components/chapter/Quote.svelte +16 -0
  54. package/components/chapter/Quote.svelte.d.ts +17 -0
  55. package/components/chapter/Rule.svelte +4 -0
  56. package/components/chapter/Rule.svelte.d.ts +17 -0
  57. package/components/chapter/Table.svelte +29 -0
  58. package/components/chapter/Table.svelte.d.ts +17 -0
  59. package/components/chapter/Text.svelte +62 -0
  60. package/components/chapter/Text.svelte.d.ts +17 -0
  61. package/components/chapter/renderPosition.d.ts +3 -0
  62. package/components/chapter/renderPosition.js +4 -0
  63. package/components/editor/BookishEditor.svelte +755 -0
  64. package/components/editor/BookishEditor.svelte.d.ts +22 -0
  65. package/components/editor/CalloutEditor.svelte +10 -0
  66. package/components/editor/CalloutEditor.svelte.d.ts +17 -0
  67. package/components/editor/CaptionedCodeEditor.svelte +22 -0
  68. package/components/editor/CaptionedCodeEditor.svelte.d.ts +17 -0
  69. package/components/editor/CaretContext.d.ts +18 -0
  70. package/components/editor/CaretContext.js +1 -0
  71. package/components/editor/CaretState.d.ts +47 -0
  72. package/components/editor/CaretState.js +1 -0
  73. package/components/editor/CaretUtilities.d.ts +5 -0
  74. package/components/editor/CaretUtilities.js +1 -0
  75. package/components/editor/CitationsEditor.svelte +42 -0
  76. package/components/editor/CitationsEditor.svelte.d.ts +17 -0
  77. package/components/editor/Clipboard.d.ts +3 -0
  78. package/components/editor/Clipboard.js +1 -0
  79. package/components/editor/Command.d.ts +18 -0
  80. package/components/editor/Command.js +1 -0
  81. package/components/editor/Commands.d.ts +3 -0
  82. package/components/editor/Commands.js +951 -0
  83. package/components/editor/ConfirmButton.svelte +43 -0
  84. package/components/editor/ConfirmButton.svelte.d.ts +18 -0
  85. package/components/editor/DefinitionEditor.svelte +28 -0
  86. package/components/editor/DefinitionEditor.svelte.d.ts +17 -0
  87. package/components/editor/EmbedEditor.svelte +87 -0
  88. package/components/editor/EmbedEditor.svelte.d.ts +17 -0
  89. package/components/editor/ImageChooser.svelte +70 -0
  90. package/components/editor/ImageChooser.svelte.d.ts +18 -0
  91. package/components/editor/InlineCodeEditor.svelte +9 -0
  92. package/components/editor/InlineCodeEditor.svelte.d.ts +17 -0
  93. package/components/editor/LabelEditor.svelte +23 -0
  94. package/components/editor/LabelEditor.svelte.d.ts +17 -0
  95. package/components/editor/LanguageEditor.svelte +11 -0
  96. package/components/editor/LanguageEditor.svelte.d.ts +17 -0
  97. package/components/editor/LinkEditor.svelte +75 -0
  98. package/components/editor/LinkEditor.svelte.d.ts +17 -0
  99. package/components/editor/Note.svelte +9 -0
  100. package/components/editor/Note.svelte.d.ts +23 -0
  101. package/components/editor/PositionEditor.svelte +14 -0
  102. package/components/editor/PositionEditor.svelte.d.ts +18 -0
  103. package/components/editor/QuoteEditor.svelte +5 -0
  104. package/components/editor/QuoteEditor.svelte.d.ts +17 -0
  105. package/components/editor/Switch.svelte +56 -0
  106. package/components/editor/Switch.svelte.d.ts +20 -0
  107. package/components/editor/TextEditor.svelte +193 -0
  108. package/components/editor/TextEditor.svelte.d.ts +23 -0
  109. package/components/editor/Toggle.svelte +38 -0
  110. package/components/editor/Toggle.svelte.d.ts +19 -0
  111. package/components/editor/Toolbar.svelte +202 -0
  112. package/components/editor/Toolbar.svelte.d.ts +20 -0
  113. package/components/editor/ToolbarGroup.svelte +41 -0
  114. package/components/editor/ToolbarGroup.svelte.d.ts +19 -0
  115. package/components/editor/ToolbarIcon.svelte +22 -0
  116. package/components/editor/ToolbarIcon.svelte.d.ts +16 -0
  117. package/components/editor/ToolbarSpacer.svelte +1 -0
  118. package/components/editor/ToolbarSpacer.svelte.d.ts +19 -0
  119. package/components/editor/URLEditor.svelte +15 -0
  120. package/components/editor/URLEditor.svelte.d.ts +18 -0
  121. package/components/editor/UndoState.d.ts +8 -0
  122. package/components/editor/UndoState.js +1 -0
  123. package/components/page/Acknowledgements.svelte +29 -0
  124. package/components/page/Acknowledgements.svelte.d.ts +14 -0
  125. package/components/page/Alert.svelte +11 -0
  126. package/components/page/Alert.svelte.d.ts +23 -0
  127. package/components/page/Authors.svelte +62 -0
  128. package/components/page/Authors.svelte.d.ts +20 -0
  129. package/components/page/BulkReferenceEditor.svelte +32 -0
  130. package/components/page/BulkReferenceEditor.svelte.d.ts +14 -0
  131. package/components/page/Chapter.svelte +301 -0
  132. package/components/page/Chapter.svelte.d.ts +18 -0
  133. package/components/page/ChapterContext.d.ts +10 -0
  134. package/components/page/ChapterContext.js +1 -0
  135. package/components/page/Contexts.d.ts +27 -0
  136. package/components/page/Contexts.js +21 -0
  137. package/components/page/DefinitionView.svelte +129 -0
  138. package/components/page/DefinitionView.svelte.d.ts +18 -0
  139. package/components/page/Description.svelte +22 -0
  140. package/components/page/Description.svelte.d.ts +14 -0
  141. package/components/page/Edition.svelte +106 -0
  142. package/components/page/Edition.svelte.d.ts +21 -0
  143. package/components/page/Glossary.svelte +61 -0
  144. package/components/page/Glossary.svelte.d.ts +14 -0
  145. package/components/page/Header.svelte +105 -0
  146. package/components/page/Header.svelte.d.ts +27 -0
  147. package/components/page/Index.svelte +117 -0
  148. package/components/page/Index.svelte.d.ts +14 -0
  149. package/components/page/Instructions.svelte +30 -0
  150. package/components/page/Instructions.svelte.d.ts +16 -0
  151. package/components/page/License.svelte +29 -0
  152. package/components/page/License.svelte.d.ts +14 -0
  153. package/components/page/Loading.svelte +13 -0
  154. package/components/page/Loading.svelte.d.ts +19 -0
  155. package/components/page/Media.svelte +76 -0
  156. package/components/page/Media.svelte.d.ts +14 -0
  157. package/components/page/MediaPreview.svelte +11 -0
  158. package/components/page/MediaPreview.svelte.d.ts +19 -0
  159. package/components/page/Outline.svelte +173 -0
  160. package/components/page/Outline.svelte.d.ts +19 -0
  161. package/components/page/Page.svelte +53 -0
  162. package/components/page/Page.svelte.d.ts +19 -0
  163. package/components/page/PossibleChapter.svelte +14 -0
  164. package/components/page/PossibleChapter.svelte.d.ts +14 -0
  165. package/components/page/PossibleReference.svelte +16 -0
  166. package/components/page/PossibleReference.svelte.d.ts +19 -0
  167. package/components/page/Print.svelte +8 -0
  168. package/components/page/Print.svelte.d.ts +14 -0
  169. package/components/page/Reference.svelte +145 -0
  170. package/components/page/Reference.svelte.d.ts +17 -0
  171. package/components/page/References.svelte +58 -0
  172. package/components/page/References.svelte.d.ts +14 -0
  173. package/components/page/Revisions.svelte +124 -0
  174. package/components/page/Revisions.svelte.d.ts +14 -0
  175. package/components/page/Search.svelte +108 -0
  176. package/components/page/Search.svelte.d.ts +14 -0
  177. package/components/page/Status.svelte +49 -0
  178. package/components/page/Status.svelte.d.ts +19 -0
  179. package/components/page/SubdomainEditor.svelte +30 -0
  180. package/components/page/SubdomainEditor.svelte.d.ts +14 -0
  181. package/components/page/TableOfContents.svelte +234 -0
  182. package/components/page/TableOfContents.svelte.d.ts +14 -0
  183. package/components/page/TableOfContentsImage.svelte +15 -0
  184. package/components/page/TableOfContentsImage.svelte.d.ts +16 -0
  185. package/components/page/TableOfContentsRow.svelte +57 -0
  186. package/components/page/TableOfContentsRow.svelte.d.ts +24 -0
  187. package/components/page/ThemeEditor.svelte +52 -0
  188. package/components/page/ThemeEditor.svelte.d.ts +14 -0
  189. package/components/page/ThemeEditorPreview.svelte +37 -0
  190. package/components/page/ThemeEditorPreview.svelte.d.ts +17 -0
  191. package/components/page/ThemeSetEditor.svelte +17 -0
  192. package/components/page/ThemeSetEditor.svelte.d.ts +18 -0
  193. package/components/page/ThemeVariableEditor.svelte +28 -0
  194. package/components/page/ThemeVariableEditor.svelte.d.ts +18 -0
  195. package/components/page/Unknown.svelte +29 -0
  196. package/components/page/Unknown.svelte.d.ts +16 -0
  197. package/components/page/margins.d.ts +2 -0
  198. package/components/page/margins.js +132 -0
  199. package/models/BookLoader.d.ts +2 -0
  200. package/models/BookLoader.js +67 -0
  201. package/models/Firebase.d.ts +4 -0
  202. package/models/Firebase.js +26 -0
  203. package/models/Firestore.d.ts +22 -0
  204. package/models/Firestore.js +194 -0
  205. package/models/book/Book.d.ts +60 -0
  206. package/models/book/Book.js +135 -0
  207. package/models/book/BookMedia.d.ts +23 -0
  208. package/models/book/BookMedia.js +102 -0
  209. package/models/book/Chapter.d.ts +70 -0
  210. package/models/book/Chapter.js +221 -0
  211. package/models/book/ChapterID.d.ts +10 -0
  212. package/models/book/ChapterID.js +10 -0
  213. package/models/book/Definition.d.ts +6 -0
  214. package/models/book/Definition.js +1 -0
  215. package/models/book/Edition.d.ts +111 -0
  216. package/models/book/Edition.js +466 -0
  217. package/models/book/Theme.d.ts +106 -0
  218. package/models/book/Theme.js +76 -0
  219. package/models/book/ThemeColors.d.ts +15 -0
  220. package/models/book/ThemeColors.js +1 -0
  221. package/models/chapter/AtomNode.d.ts +18 -0
  222. package/models/chapter/AtomNode.js +31 -0
  223. package/models/chapter/BlockNode.d.ts +21 -0
  224. package/models/chapter/BlockNode.js +117 -0
  225. package/models/chapter/BlocksNode.d.ts +50 -0
  226. package/models/chapter/BlocksNode.js +709 -0
  227. package/models/chapter/BlocksNode.test.d.ts +1 -0
  228. package/models/chapter/BlocksNode.test.js +302 -0
  229. package/models/chapter/Bookkeeping.d.ts +4 -0
  230. package/models/chapter/Bookkeeping.js +1 -0
  231. package/models/chapter/CalloutNode.d.ts +17 -0
  232. package/models/chapter/CalloutNode.js +36 -0
  233. package/models/chapter/Caret.d.ts +21 -0
  234. package/models/chapter/Caret.js +69 -0
  235. package/models/chapter/ChapterNode.d.ts +34 -0
  236. package/models/chapter/ChapterNode.js +80 -0
  237. package/models/chapter/CitationsNode.d.ts +16 -0
  238. package/models/chapter/CitationsNode.js +17 -0
  239. package/models/chapter/CodeNode.d.ts +30 -0
  240. package/models/chapter/CodeNode.js +64 -0
  241. package/models/chapter/CommentNode.d.ts +18 -0
  242. package/models/chapter/CommentNode.js +32 -0
  243. package/models/chapter/DefinitionNode.d.ts +12 -0
  244. package/models/chapter/DefinitionNode.js +20 -0
  245. package/models/chapter/Edit.d.ts +7 -0
  246. package/models/chapter/Edit.js +1 -0
  247. package/models/chapter/EmbedNode.d.ts +40 -0
  248. package/models/chapter/EmbedNode.js +89 -0
  249. package/models/chapter/ErrorNode.d.ts +17 -0
  250. package/models/chapter/ErrorNode.js +21 -0
  251. package/models/chapter/FootnoteNode.d.ts +18 -0
  252. package/models/chapter/FootnoteNode.js +29 -0
  253. package/models/chapter/FormatNode.d.ts +60 -0
  254. package/models/chapter/FormatNode.js +614 -0
  255. package/models/chapter/FormatNode.test.d.ts +1 -0
  256. package/models/chapter/FormatNode.test.js +54 -0
  257. package/models/chapter/InlineCodeNode.d.ts +12 -0
  258. package/models/chapter/InlineCodeNode.js +18 -0
  259. package/models/chapter/LabelNode.d.ts +17 -0
  260. package/models/chapter/LabelNode.js +22 -0
  261. package/models/chapter/LinkNode.d.ts +12 -0
  262. package/models/chapter/LinkNode.js +16 -0
  263. package/models/chapter/ListNode.d.ts +51 -0
  264. package/models/chapter/ListNode.js +370 -0
  265. package/models/chapter/ListNode.test.d.ts +1 -0
  266. package/models/chapter/ListNode.test.js +49 -0
  267. package/models/chapter/MetadataNode.d.ts +17 -0
  268. package/models/chapter/MetadataNode.js +24 -0
  269. package/models/chapter/Node.d.ts +36 -0
  270. package/models/chapter/Node.js +173 -0
  271. package/models/chapter/Node.test.d.ts +1 -0
  272. package/models/chapter/Node.test.js +27 -0
  273. package/models/chapter/ParagraphNode.d.ts +33 -0
  274. package/models/chapter/ParagraphNode.js +93 -0
  275. package/models/chapter/ParagraphNode.test.d.ts +1 -0
  276. package/models/chapter/ParagraphNode.test.js +21 -0
  277. package/models/chapter/Parser.d.ts +75 -0
  278. package/models/chapter/Parser.js +824 -0
  279. package/models/chapter/Parser.test.d.ts +1 -0
  280. package/models/chapter/Parser.test.js +25 -0
  281. package/models/chapter/Position.d.ts +2 -0
  282. package/models/chapter/Position.js +1 -0
  283. package/models/chapter/QuoteNode.d.ts +25 -0
  284. package/models/chapter/QuoteNode.js +61 -0
  285. package/models/chapter/ReferenceNode.d.ts +29 -0
  286. package/models/chapter/ReferenceNode.js +48 -0
  287. package/models/chapter/RootNode.d.ts +5 -0
  288. package/models/chapter/RootNode.js +1 -0
  289. package/models/chapter/RuleNode.d.ts +15 -0
  290. package/models/chapter/RuleNode.js +16 -0
  291. package/models/chapter/TableNode.d.ts +35 -0
  292. package/models/chapter/TableNode.js +176 -0
  293. package/models/chapter/TableNode.test.d.ts +1 -0
  294. package/models/chapter/TableNode.test.js +31 -0
  295. package/models/chapter/TextNode.d.ts +36 -0
  296. package/models/chapter/TextNode.js +136 -0
  297. package/models/chapter/TextNode.test.d.ts +1 -0
  298. package/models/chapter/TextNode.test.js +6 -0
  299. package/models/loadEdition.d.ts +5 -0
  300. package/models/loadEdition.js +16 -0
  301. package/package.json +189 -0
  302. package/util/getSubdomain.d.ts +3 -0
  303. package/util/getSubdomain.js +22 -0
  304. package/util/isMobile.d.ts +2 -0
  305. package/util/isMobile.js +6 -0
  306. package/util/mineReference.d.ts +3 -0
  307. package/util/mineReference.js +62 -0
  308. package/util/scrollToEyeLevel.d.ts +2 -0
  309. package/util/scrollToEyeLevel.js +5 -0
@@ -0,0 +1,46 @@
1
+ <script>import Atom from './Atom.svelte';
2
+ import Marginal from './Marginal.svelte';
3
+ import Format from './Format.svelte';
4
+ import { getChapter, isEditable } from '../page/Contexts';
5
+ import { getCaret } from '../page/Contexts';
6
+ import { afterUpdate } from 'svelte';
7
+ import ToolbarIcon from '../editor/ToolbarIcon.svelte';
8
+ export let node;
9
+ let chapter = getChapter();
10
+ let editable = isEditable();
11
+ let caret = getCaret();
12
+ $: chapterNode = $chapter?.chapter.getAST();
13
+ $: focused = $caret && $caret.range && node.contains($caret.range.start.node);
14
+ // Position the marginals on every render.
15
+ afterUpdate(() => $chapter?.layoutMarginals());
16
+ </script>
17
+
18
+ <Atom {node}>
19
+ {#if editable}
20
+ <Marginal id={"comment-" + (chapterNode === undefined ? "?" : chapterNode.getComments().indexOf(node))}>
21
+ <span slot="interactor" class="bookish-comment-symbol">
22
+ <ToolbarIcon name="comment.svg"/>
23
+ </span>
24
+ <span slot="content" class={`bookish-app-comment ${focused ? "bookish-app-comment-focused" : ""}`}>
25
+ <Format node={node.getMeta()} placeholder="comment"/>
26
+ </span>
27
+ </Marginal>
28
+ {/if}
29
+ </Atom>
30
+
31
+ <style>
32
+ .bookish-app-comment {
33
+ background: var(--bookish-app-chrome-background);
34
+ border: var(--bookish-app-chrome-border-width) solid var(--bookish-app-chrome-border-color);
35
+ border-radius: 0 var(--bookish-app-chrome-padding) var(--bookish-app-chrome-padding) var(--bookish-app-chrome-padding);
36
+ padding: var(--bookish-app-chrome-padding);
37
+ font-size: var(--bookish-app-chrome-font-size);
38
+ display: inline-block;
39
+ line-height: 1.5em;
40
+ }
41
+
42
+ .bookish-app-comment-focused, .bookish-footnote-focused {
43
+ outline: 2px solid var(--bookish-highlight-color);
44
+ }
45
+
46
+ </style>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ 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
+ };
12
+ export declare type CommentProps = typeof __propDef.props;
13
+ export declare type CommentEvents = typeof __propDef.events;
14
+ export declare type CommentSlots = typeof __propDef.slots;
15
+ export default class Comment extends SvelteComponentTyped<CommentProps, CommentEvents, CommentSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,38 @@
1
+ <script>import Parser from '../../models/chapter/Parser';
2
+ import Text from './Text.svelte';
3
+ import Format from './Format.svelte';
4
+ import Marginal from './Marginal.svelte';
5
+ import { getChapter, getEdition } from '../page/Contexts';
6
+ import { afterUpdate } from 'svelte';
7
+ export let node;
8
+ let edition = getEdition();
9
+ let chapter = getChapter();
10
+ // Find the definition.
11
+ $: glossaryID = node.getMeta();
12
+ $: phrase = node.getText();
13
+ $: glossary = $edition.getGlossary();
14
+ $: entry = glossary[glossaryID];
15
+ // Position the marginals on every render.
16
+ afterUpdate(() => $chapter?.layoutMarginals());
17
+ </script>
18
+
19
+ <!-- Error if there's no corresponding entry. -->
20
+ <span class={`bookish-definition ${entry === undefined ? "bookish-error" : ""}`} data-nodeid={node.nodeID}>
21
+ <Marginal
22
+ id={"glossary-" + glossaryID}
23
+ >
24
+ <slot name="interactor">
25
+ <Text node={phrase}/>
26
+ </slot>
27
+ <slot name="content">
28
+ <span class="bookish-definition-entry">
29
+ {#if entry === undefined }
30
+ <span class="bookish-error">Unknown glossary entry "{ glossaryID }"</span>
31
+ {:else}
32
+ <strong class="bookish-definition-entry-phrase">{entry.phrase}</strong>: <Format node={Parser.parseFormat($edition, entry.definition)}/>
33
+ {#if entry.synonyms && entry.synonyms.length > 0}<span class="bookish-definition-entry-synonyms"><br/><br/>{entry.synonyms.join(", ")}</span>{/if}
34
+ {/if}
35
+ </span>
36
+ </slot>
37
+ </Marginal>
38
+ </span>
@@ -0,0 +1,20 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type DefinitionNode from "../../models/chapter/DefinitionNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: DefinitionNode;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ interactor: {};
12
+ content: {};
13
+ };
14
+ };
15
+ export declare type DefinitionProps = typeof __propDef.props;
16
+ export declare type DefinitionEvents = typeof __propDef.events;
17
+ export declare type DefinitionSlots = typeof __propDef.slots;
18
+ export default class Definition extends SvelteComponentTyped<DefinitionProps, DefinitionEvents, DefinitionSlots> {
19
+ }
20
+ export {};
@@ -0,0 +1,122 @@
1
+ <script>import renderPosition from './renderPosition';
2
+ import { storage } from '../../models/Firebase';
3
+ import Format from './Format.svelte';
4
+ import { getCaret, getEdition, isEditable } from "../page/Contexts";
5
+ export let node;
6
+ export let placeholder = undefined;
7
+ $: url = node.getURL();
8
+ $: position = node.getPosition();
9
+ $: description = node.getDescription();
10
+ $: credit = node.getCredit();
11
+ $: caption = node.getCaption();
12
+ let caret = getCaret();
13
+ let editable = isEditable();
14
+ let edition = getEdition();
15
+ let dragging = false;
16
+ let dragFeedback = undefined;
17
+ let imageError = false;
18
+ function handleDrop(event) {
19
+ event.preventDefault();
20
+ if (event.dataTransfer?.items) {
21
+ // Get the files and convert them to file opens, then filter by allowed file extensions
22
+ const imageFiles = [...event.dataTransfer.items]
23
+ .filter(item => item.kind === 'file')
24
+ .map(item => item.getAsFile())
25
+ .filter(file => file !== null && /.*\.(jpg|jpeg|png)/i.test(file.name));
26
+ if (imageFiles.length === 0)
27
+ dragFeedback = "Only JPEG or PNG images are allowed.";
28
+ else if (imageFiles.length > 1)
29
+ dragFeedback = "Only one image at a time please!";
30
+ else {
31
+ dragFeedback = "Uploading…";
32
+ const file = imageFiles[0];
33
+ const media = $edition.getBook()?.getMedia();
34
+ if (file === null)
35
+ return;
36
+ if (storage === undefined)
37
+ return;
38
+ if (media === undefined)
39
+ return;
40
+ media.upload(file, (progress) => dragFeedback = `${progress}% done`, (error) => { dragFeedback = error; dragging = false; }, (url, thumbnails) => {
41
+ // Upload completed successfully, now we can get the download URL
42
+ $caret?.edit(node, node.withURLs(url, thumbnails).withDescription(""));
43
+ dragging = false;
44
+ dragFeedback = undefined;
45
+ });
46
+ }
47
+ }
48
+ }
49
+ function handleDrag(event) {
50
+ event?.preventDefault();
51
+ dragging = true;
52
+ dragFeedback = "Drop to upload…";
53
+ }
54
+ function handleDragLeave(event) {
55
+ if (event.target !== event.currentTarget)
56
+ return;
57
+ event?.preventDefault();
58
+ dragging = false;
59
+ dragFeedback = undefined;
60
+ }
61
+ function handleLoad() {
62
+ imageError = false;
63
+ }
64
+ function handleError() {
65
+ imageError = true;
66
+ }
67
+ </script>
68
+
69
+ <div class={"bookish-figure " + renderPosition(position)} data-nodeid={node.nodeID}>
70
+ {#if url.trim().length === 0 }
71
+ {#if editable }
72
+ <div
73
+ class={`bookish-figure-unspecified ${dragging ? "bookish-figure-dragging" : ""}`}
74
+ on:drop|preventDefault={handleDrop}
75
+ on:dragover={handleDrag}
76
+ on:dragleave={handleDragLeave}
77
+ >{
78
+ dragFeedback !== undefined ? dragFeedback :
79
+ placeholder !== undefined ? placeholder :
80
+ "Click or drag to choose or upload an image, or enter an image or video URL."
81
+ }
82
+ </div>
83
+ {:else}
84
+ <div class="bookish-figure-unspecified">No image or video specified</div>
85
+ {/if}
86
+ {:else}
87
+ {#if url.includes("https://www.youtube.com") ||
88
+ url.includes("https://youtu.be") ||
89
+ url.includes("https://www.tiktok.com") ||
90
+ url.includes("vimeo.com") }
91
+ <div class="bookish-figure-embed">
92
+ <iframe
93
+ class="bookish-figure-frame"
94
+ title="Embedded video content from streaming service"
95
+ src={url}
96
+ frameBorder="0"
97
+ allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
98
+ allowFullScreen>
99
+ </iframe>
100
+ </div>
101
+ {:else}
102
+ <img
103
+ class={"bookish-figure-image"}
104
+ src={url.startsWith("http") ? url : "images/" + url}
105
+ srcset={node.hasSmallURL() ? `${node.getSmallURL()} 320w, ${url} 1024w` : undefined }
106
+ sizes={node.hasSmallURL() ? "(min-width: 1024px) 1024px, 320px" : undefined }
107
+ alt={description}
108
+ on:load={handleLoad}
109
+ on:error={handleError}
110
+ />
111
+ {/if}
112
+ {/if}
113
+ <div class="bookish-figure-caption">
114
+ <div class="bookish-figure-credit">
115
+ <Format node={credit} placeholder="credit" />
116
+ </div>
117
+ <Format node={caption} placeholder="caption" />
118
+ </div>
119
+ {#if imageError }
120
+ <div class="bookish-figure-unspecified">{ editable ? "Unable to load image. Is the URL correct? Are you offline?" : "Unable to load image" }</div>
121
+ {/if}
122
+ </div>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type EmbedNode from "../../models/chapter/EmbedNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: EmbedNode;
6
+ placeholder?: string | undefined;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export declare type EmbedProps = typeof __propDef.props;
14
+ export declare type EmbedEvents = typeof __propDef.events;
15
+ export declare type EmbedSlots = typeof __propDef.slots;
16
+ export default class Embed extends SvelteComponentTyped<EmbedProps, EmbedEvents, EmbedSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,4 @@
1
+ <script>export let node;
2
+ </script>
3
+
4
+ <span class="bookish-error" data-nodeid={node.nodeID}>Error: {node.getError()}</span>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type ErrorNode from "../../models/chapter/ErrorNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: ErrorNode;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type ErrorMessageProps = typeof __propDef.props;
13
+ export declare type ErrorMessageEvents = typeof __propDef.events;
14
+ export declare type ErrorMessageSlots = typeof __propDef.slots;
15
+ export default class ErrorMessage extends SvelteComponentTyped<ErrorMessageProps, ErrorMessageEvents, ErrorMessageSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,37 @@
1
+ <script>import Atom from './Atom.svelte';
2
+ import Marginal from './Marginal.svelte';
3
+ import Format from './Format.svelte';
4
+ import { getCaret, getChapter, getEdition } from "../page/Contexts";
5
+ import { afterUpdate } from "svelte";
6
+ export let node;
7
+ $: content = node.getMeta();
8
+ let caret = getCaret();
9
+ let chapter = getChapter();
10
+ let edition = getEdition();
11
+ // What footnote number is this?
12
+ $: chapterNode = $chapter?.chapter?.getAST();
13
+ $: number = chapterNode?.getFootnotes().indexOf(node);
14
+ $: letter = number === undefined ? undefined : $edition.getFootnoteSymbol(number);
15
+ $: focused = chapterNode && $caret && $caret.range && $caret.range.start.node.hasAncestor(chapterNode, node);
16
+ // Position the marginals on every render.
17
+ afterUpdate(() => $chapter?.layoutMarginals());
18
+ </script>
19
+
20
+ <Atom node={node}>
21
+ <span class={`bookish-footnote-link`} data-nodeid={node.nodeID}>
22
+ <Marginal id={"footnote-" + number}>
23
+ <sup slot="interactor" class="bookish-footnote-symbol">{letter}</sup>
24
+ <!-- We prevent default on the span to prevent mouse events from bubbling up to the footnote symbol. This is key for two reasons:
25
+ 1) clicks on the footnote select the footnote atom node itself
26
+ 2) we want to be able to click on footnote text and we can't do that if the footnote sets the caret to the atom after clicks. -->
27
+ <span slot="content" class={`bookish-footnote ${focused ? "bookish-footnote-focused" : ""}`} on:mousedown|preventDefault>
28
+ <sup class="bookish-footnote-symbol">{letter}</sup><Format node={content} placeholder="footnote"/></span>
29
+ </Marginal>
30
+ </span>
31
+ </Atom>
32
+
33
+ <style>
34
+ .bookish-footnote-focused {
35
+ outline: 2px solid var(--bookish-highlight-color);
36
+ }
37
+ </style>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type FootnoteNode from "../../models/chapter/FootnoteNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: FootnoteNode;
6
+ };
7
+ events: {
8
+ mousedown: MouseEvent;
9
+ } & {
10
+ [evt: string]: CustomEvent<any>;
11
+ };
12
+ slots: {};
13
+ };
14
+ export declare type FootnoteProps = typeof __propDef.props;
15
+ export declare type FootnoteEvents = typeof __propDef.events;
16
+ export declare type FootnoteSlots = typeof __propDef.slots;
17
+ export default class Footnote extends SvelteComponentTyped<FootnoteProps, FootnoteEvents, FootnoteSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,57 @@
1
+ <script>import FormatNode from "../../models/chapter/FormatNode";
2
+ import CitationsNode from "../../models/chapter/CitationsNode";
3
+ import CommentNode from "../../models/chapter/CommentNode";
4
+ import DefinitionNode from "../../models/chapter/DefinitionNode";
5
+ import FootnoteNode from "../../models/chapter/FootnoteNode";
6
+ import InlineCodeNode from "../../models/chapter/InlineCodeNode";
7
+ import LabelNode from "../../models/chapter/LabelNode";
8
+ import LinkNode from "../../models/chapter/LinkNode";
9
+ import TextNode from "../../models/chapter/TextNode";
10
+ import Citations from "./Citations.svelte";
11
+ import Definition from "./Definition.svelte";
12
+ import Footnote from "./Footnote.svelte";
13
+ import InlineCode from "./InlineCode.svelte";
14
+ import Label from "./Label.svelte";
15
+ import Link from "./Link.svelte";
16
+ import Comment from "./Comment.svelte";
17
+ import Text from "./Text.svelte";
18
+ import Format from "./Format.svelte";
19
+ import { isEditable } from "../page/Contexts";
20
+ export let node;
21
+ export let placeholder = undefined;
22
+ let editable = isEditable();
23
+ $: format = node.getFormat();
24
+ $: tag =
25
+ format === "*" ? "strong" :
26
+ format === "_" ? "em" :
27
+ format === "^" ? "sup" :
28
+ format === "v" ? "sub" :
29
+ "span";
30
+ $: showPlaceholder = node.isEmptyText() && placeholder !== undefined && editable;
31
+ </script>
32
+
33
+ <svelte:element this={tag} data-nodeid={node.nodeID} class={showPlaceholder ? "bookish-editor-placeholder" : ""}>
34
+ {#each node.getSegments() as segment}
35
+ {#if segment instanceof TextNode}<Text node={segment} />
36
+ {:else if segment instanceof InlineCodeNode}<InlineCode node={segment} />
37
+ {:else if segment instanceof LinkNode}<Link node={segment} />
38
+ {:else if segment instanceof CitationsNode}<Citations node={segment} />
39
+ {:else if segment instanceof DefinitionNode}<Definition node={segment} />
40
+ {:else if segment instanceof FootnoteNode}<Footnote node={segment} />
41
+ {:else if segment instanceof LabelNode}<Label node={segment} />
42
+ {:else if segment instanceof CommentNode}<Comment node={segment} />
43
+ {:else if segment instanceof FormatNode}<Format node={segment} />
44
+ {:else}<span class="bookish-error">Unknown segment type node={segment}</span>
45
+ {/if}
46
+ {/each}
47
+ {#if showPlaceholder }
48
+ { placeholder }
49
+ {/if}
50
+ </svelte:element>
51
+
52
+ <style>
53
+ .bookish-editor-placeholder {
54
+ color: var(--bookish-app-chrome-muted);
55
+ font-style: italic;
56
+ }
57
+ </style>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import FormatNode from "../../models/chapter/FormatNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: FormatNode;
6
+ placeholder?: string | undefined;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export declare type FormatProps = typeof __propDef.props;
14
+ export declare type FormatEvents = typeof __propDef.events;
15
+ export declare type FormatSlots = typeof __propDef.slots;
16
+ export default class Format extends SvelteComponentTyped<FormatProps, FormatEvents, FormatSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,12 @@
1
+ <script>import { isEditable } from "../page/Contexts";
2
+ import Code from './Code.svelte';
3
+ import Text from './Text.svelte';
4
+ export let node;
5
+ let editable = isEditable();
6
+ </script>
7
+
8
+ {#if editable }
9
+ <span class="bookish-code bookish-code-inline hljs" data-nodeid={node.nodeID}><Text node={node.getText()}/></span>
10
+ {:else}
11
+ <Code editable={false} inline={true} language={node.getMeta()} nodeID={node.getText().nodeID}>{node.getText().getText()}</Code>
12
+ {/if}
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type InlineCodeNode from "../../models/chapter/InlineCodeNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: InlineCodeNode;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type InlineCodeProps = typeof __propDef.props;
13
+ export declare type InlineCodeEvents = typeof __propDef.events;
14
+ export declare type InlineCodeSlots = typeof __propDef.slots;
15
+ export default class InlineCode extends SvelteComponentTyped<InlineCodeProps, InlineCodeEvents, InlineCodeSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,20 @@
1
+ <script>import Atom from './Atom.svelte';
2
+ import { getChapter, isEditable } from "../page/Contexts";
3
+ export let node;
4
+ let editable = isEditable();
5
+ let chapter = getChapter();
6
+ $: ast = $chapter?.chapter.getAST();
7
+ $: duplicate = ast === undefined ? false : ast.getLabels().filter(l => l.getMeta() === node.getMeta()).length > 1;
8
+ </script>
9
+
10
+ <Atom node={node}>
11
+ <span
12
+ class={"bookish-label" + ($chapter?.highlightedID === node.getMeta() ? " bookish-content-highlight" : "")}
13
+ id={node.getMeta()}
14
+ data-nodeid={node.nodeID}
15
+ >
16
+ {#if editable}
17
+ <span class={`${duplicate ? "bookish-error" : ""}`}>•<code>{node.getMeta()}</code></span>
18
+ {/if}
19
+ </span>
20
+ </Atom>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type LabelNode from "../../models/chapter/LabelNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: LabelNode;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type LabelProps = typeof __propDef.props;
13
+ export declare type LabelEvents = typeof __propDef.events;
14
+ export declare type LabelSlots = typeof __propDef.slots;
15
+ export default class Label extends SvelteComponentTyped<LabelProps, LabelEvents, LabelSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,51 @@
1
+ <script>import { getBase, getEdition, isEditable } from "../page/Contexts";
2
+ import Text from './Text.svelte';
3
+ export let node;
4
+ let base = getBase();
5
+ let editable = isEditable();
6
+ let edition = getEdition();
7
+ $: url = node.getMeta();
8
+ $: content = node.getText();
9
+ function isInvalidChapterLink() {
10
+ // If it's internal, validate it.
11
+ if (!url.startsWith("http")) {
12
+ // Pull out any labels and just get the chapter name.
13
+ let chapter = url;
14
+ if (url.indexOf(":") >= 0) {
15
+ let parts = chapter.split(":");
16
+ chapter = parts[0];
17
+ }
18
+ if (chapter !== "" && !$edition.hasChapter(chapter))
19
+ return true;
20
+ }
21
+ return false;
22
+ }
23
+ </script>
24
+
25
+ {#if editable}
26
+ <span class="bookish-editor-link"><Text node={content} /></span>
27
+ <!-- If this is an invalid chapter link, say so -->
28
+ {:else if isInvalidChapterLink()}
29
+ <span class="bookish-error">Unknown chapter name reference '{url}'</span>
30
+ <!-- If this is external link, make an anchor that opens a new window. -->
31
+ {:else if url.startsWith("http")}
32
+ <a href={url} target="_blank" rel="noreferrer"><Text node={content} /></a>
33
+ <!-- If's a chapter link with a label -->
34
+ {:else if url.indexOf(":") >= 0}
35
+ <!-- If the chapter isn't specified, set to the current chapter's id. -->
36
+ {#if url.split(":")[0] === ""}
37
+ <a href={"#" + url.split(":")[1]}><Text node={content} /></a>
38
+ {:else}
39
+ <a href={"/" + url.split(":")[0] + "#" + url.split(":")[1]}><Text node={content} /></a>
40
+ {/if}
41
+ <!-- If this is internal link, make a route link to the chapter. -->
42
+ {:else}
43
+ <a href={base + "/" + url}><Text node={content} /></a>
44
+ {/if}
45
+
46
+ <style>
47
+ .bookish-editor-link {
48
+ color: var(--bookish-link-color);
49
+ font-weight: var(--bookish-link-font-weight);
50
+ }
51
+ </style>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type LinkNode from "../../models/chapter/LinkNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: LinkNode;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type LinkProps = typeof __propDef.props;
13
+ export declare type LinkEvents = typeof __propDef.events;
14
+ export declare type LinkSlots = typeof __propDef.slots;
15
+ export default class Link extends SvelteComponentTyped<LinkProps, LinkEvents, LinkSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,14 @@
1
+ <script>import ListNode from "../../models/chapter/ListNode";
2
+ import Format from "./Format.svelte";
3
+ export let node;
4
+ </script>
5
+
6
+ <svelte:element this={node.isNumbered() ? "ol" : "ul"} data-nodeid={node.nodeID}>
7
+ {#each node.getItems() as item }
8
+ {#if item instanceof ListNode }
9
+ <svelte:self node={item}/>
10
+ {:else}
11
+ <li><Format node={item}/></li>
12
+ {/if}
13
+ {/each}
14
+ </svelte:element>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import ListNode from "../../models/chapter/ListNode";
3
+ declare const __propDef: {
4
+ props: {
5
+ node: ListNode;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type ListProps = typeof __propDef.props;
13
+ export declare type ListEvents = typeof __propDef.events;
14
+ export declare type ListSlots = typeof __propDef.slots;
15
+ export default class List extends SvelteComponentTyped<ListProps, ListEvents, ListSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,48 @@
1
+ <script>import { isMobile, watchMobile } from '../../util/isMobile';
2
+ import { onMount } from 'svelte';
3
+ import { getChapter } from '../page/Contexts';
4
+ export let id;
5
+ let hovered = false;
6
+ let chapter = getChapter();
7
+ // If there's no marginal selected or this is different from the current selection, this is hidden.
8
+ function isHidden() {
9
+ return $chapter?.marginalID === null || $chapter?.marginalID !== id;
10
+ }
11
+ function toggle() {
12
+ if ($chapter) {
13
+ if (isMobile() && isHidden())
14
+ $chapter.setMarginal(id);
15
+ // Otherwise, deselect.
16
+ else
17
+ $chapter.setMarginal(undefined);
18
+ }
19
+ }
20
+ function handleEnter() { hovered = true; }
21
+ function handleExit() { hovered = false; }
22
+ onMount(() => {
23
+ const mediaWatch = watchMobile();
24
+ mediaWatch.addEventListener("change", toggle);
25
+ return () => mediaWatch.removeEventListener("change", toggle);
26
+ });
27
+ </script>
28
+
29
+ <span
30
+ class={"bookish-marginal-interactor" + (hovered ? " bookish-marginal-hovered" : "") + (isHidden() ? "" : " bookish-marginal-selected")}
31
+ tabIndex=0
32
+ on:mousedown={toggle}
33
+ on:keydown={event => event.key === "Enter" || event.key === " " ? toggle() : undefined }
34
+ on:mouseenter={handleEnter}
35
+ on:mouseleave={handleExit}
36
+ >
37
+ <slot name="interactor"></slot>
38
+ </span>
39
+ <span
40
+ class={"bookish-marginal" + (isHidden() ? " bookish-marginal-hidden" : "") + (hovered ? " bookish-marginal-hovered" : "")}
41
+ tabIndex=0
42
+ on:mousedown|stopPropagation={toggle}
43
+ on:keydown={event => event.key === "Enter" || event.key === " " ? toggle() : undefined }
44
+ on:mouseenter={handleEnter}
45
+ on:mouseleave={handleExit}
46
+ >
47
+ <slot name="content"></slot>
48
+ </span>