bookish-press 0.4.45 → 0.4.47

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 (533) hide show
  1. package/.env.example +8 -0
  2. package/.firebaserc +8 -0
  3. package/.prettierignore +8 -0
  4. package/.prettierrc.json +5 -0
  5. package/_update-notifier-last-checked +0 -0
  6. package/firebase.json +46 -0
  7. package/firestore.indexes.json +4 -0
  8. package/firestore.rules +59 -0
  9. package/functions/.eslintrc.js +28 -0
  10. package/functions/package-lock.json +12595 -0
  11. package/functions/package.json +43 -0
  12. package/functions/src/index.ts +345 -0
  13. package/functions/tsconfig.dev.json +3 -0
  14. package/functions/tsconfig.json +15 -0
  15. package/package.json +53 -270
  16. package/scripts/claims.cjs +99 -0
  17. package/src/app.d.ts +9 -0
  18. package/src/app.html +24 -0
  19. package/src/lib/components/Auth.svelte +65 -0
  20. package/{components/Authentication.d.ts → src/lib/components/Authentication.ts} +2 -0
  21. package/{components → src/lib/components}/BookPreview.svelte +27 -22
  22. package/{components → src/lib/components}/External.svelte +2 -1
  23. package/src/lib/components/Link.svelte +58 -0
  24. package/{components → src/lib/components}/app/BookList.svelte +6 -3
  25. package/{components → src/lib/components}/app/Button.svelte +5 -4
  26. package/{components → src/lib/components}/app/Feedback.svelte +11 -7
  27. package/{components → src/lib/components}/app/Head.svelte +2 -1
  28. package/{components → src/lib/components}/app/Large.svelte +0 -0
  29. package/{components → src/lib/components}/app/Lead.svelte +0 -0
  30. package/{components → src/lib/components}/app/Link.svelte +4 -3
  31. package/{components → src/lib/components}/app/Options.svelte +5 -4
  32. package/{components → src/lib/components}/app/Paragraph.svelte +2 -1
  33. package/{components → src/lib/components}/app/Section.svelte +0 -0
  34. package/{components → src/lib/components}/app/Table.svelte +0 -0
  35. package/{components → src/lib/components}/app/TextInput.svelte +12 -9
  36. package/{components → src/lib/components}/chapter/Atom.svelte +18 -12
  37. package/src/lib/components/chapter/Block.svelte +42 -0
  38. package/{components → src/lib/components}/chapter/Callout.svelte +6 -3
  39. package/{components → src/lib/components}/chapter/CaptionedCode.svelte +21 -13
  40. package/{components → src/lib/components}/chapter/ChapterBody.svelte +13 -9
  41. package/{components → src/lib/components}/chapter/Citations.svelte +34 -33
  42. package/{components → src/lib/components}/chapter/Code.svelte +63 -58
  43. package/{components → src/lib/components}/chapter/Comment.svelte +30 -18
  44. package/{components → src/lib/components}/chapter/Definition.svelte +23 -17
  45. package/{components → src/lib/components}/chapter/Embed.svelte +97 -77
  46. package/src/lib/components/chapter/ErrorMessage.svelte +12 -0
  47. package/{components → src/lib/components}/chapter/ExtendedPrism.js +0 -0
  48. package/{components → src/lib/components}/chapter/Figure.svelte +34 -26
  49. package/{components → src/lib/components}/chapter/Footnote.svelte +32 -20
  50. package/{components → src/lib/components}/chapter/Format.svelte +39 -34
  51. package/{components → src/lib/components}/chapter/InlineCode.svelte +9 -5
  52. package/{components → src/lib/components}/chapter/Label.svelte +23 -14
  53. package/{components → src/lib/components}/chapter/Link.svelte +27 -21
  54. package/{components → src/lib/components}/chapter/List.svelte +5 -3
  55. package/{components → src/lib/components}/chapter/Marginal.svelte +54 -41
  56. package/{components → src/lib/components}/chapter/Paragraph.svelte +25 -20
  57. package/{components → src/lib/components}/chapter/Positioned.svelte +4 -1
  58. package/{components → src/lib/components}/chapter/Problem.svelte +0 -0
  59. package/src/lib/components/chapter/Python.svelte +144 -0
  60. package/{components → src/lib/components}/chapter/Quote.svelte +9 -5
  61. package/{components → src/lib/components}/chapter/Rule.svelte +4 -1
  62. package/{components → src/lib/components}/chapter/Table.svelte +11 -7
  63. package/src/lib/components/chapter/Text.svelte +109 -0
  64. package/src/lib/components/editor/BookishEditor.svelte +1101 -0
  65. package/src/lib/components/editor/CalloutEditor.svelte +14 -0
  66. package/{components → src/lib/components}/editor/CaptionedCodeEditor.svelte +10 -6
  67. package/src/lib/components/editor/CaretContext.ts +55 -0
  68. package/{components/editor/CaretState.d.ts → src/lib/components/editor/CaretState.ts} +6 -7
  69. package/{components/editor/CaretUtilities.d.ts → src/lib/components/editor/CaretUtilities.ts} +1 -0
  70. package/{components → src/lib/components}/editor/CaretView.svelte +25 -20
  71. package/src/lib/components/editor/CitationsEditor.svelte +64 -0
  72. package/{components/editor/Clipboard.d.ts → src/lib/components/editor/Clipboard.ts} +2 -1
  73. package/{components/editor/Command.d.ts → src/lib/components/editor/Command.ts} +8 -2
  74. package/{components/editor/Commands.js → src/lib/components/editor/Commands.ts} +730 -315
  75. package/src/lib/components/editor/ConfirmButton.svelte +51 -0
  76. package/src/lib/components/editor/DefinitionEditor.svelte +44 -0
  77. package/src/lib/components/editor/EmbedEditor.svelte +152 -0
  78. package/{components → src/lib/components}/editor/Icon.svelte +2 -1
  79. package/{components → src/lib/components}/editor/ImageChooser.svelte +24 -19
  80. package/src/lib/components/editor/InlineCodeEditor.svelte +16 -0
  81. package/{components → src/lib/components}/editor/LabelEditor.svelte +14 -9
  82. package/{components → src/lib/components}/editor/LanguageEditor.svelte +8 -5
  83. package/src/lib/components/editor/LinkEditor.svelte +110 -0
  84. package/{components → src/lib/components}/editor/Note.svelte +0 -0
  85. package/{components → src/lib/components}/editor/Permissions.svelte +43 -36
  86. package/src/lib/components/editor/PositionEditor.svelte +21 -0
  87. package/src/lib/components/editor/QuoteEditor.svelte +14 -0
  88. package/{components → src/lib/components}/editor/Switch.svelte +14 -11
  89. package/src/lib/components/editor/TableEditor.svelte +14 -0
  90. package/{components → src/lib/components}/editor/TextEditor.svelte +101 -89
  91. package/src/lib/components/editor/Toggle.svelte +47 -0
  92. package/src/lib/components/editor/Toolbar.svelte +297 -0
  93. package/{components → src/lib/components}/editor/ToolbarGroup.svelte +5 -3
  94. package/{components → src/lib/components}/editor/ToolbarSpacer.svelte +0 -0
  95. package/src/lib/components/editor/URLEditor.svelte +15 -0
  96. package/{components/editor/UndoState.d.ts → src/lib/components/editor/UndoState.ts} +3 -2
  97. package/{components → src/lib/components}/editor/icons/annotate.svg +0 -0
  98. package/{components → src/lib/components}/editor/icons/block.svg +0 -0
  99. package/{components → src/lib/components}/editor/icons/bold.svg +0 -0
  100. package/{components → src/lib/components}/editor/icons/bullets.svg +0 -0
  101. package/{components → src/lib/components}/editor/icons/callout.svg +0 -0
  102. package/{components → src/lib/components}/editor/icons/citation.svg +0 -0
  103. package/{components → src/lib/components}/editor/icons/clear.svg +0 -0
  104. package/{components → src/lib/components}/editor/icons/clipboard.svg +0 -0
  105. package/{components → src/lib/components}/editor/icons/code.svg +0 -0
  106. package/{components → src/lib/components}/editor/icons/columnafter.svg +0 -0
  107. package/{components → src/lib/components}/editor/icons/columnbefore.svg +0 -0
  108. package/{components → src/lib/components}/editor/icons/comment.svg +0 -0
  109. package/{components → src/lib/components}/editor/icons/copy.svg +0 -0
  110. package/{components → src/lib/components}/editor/icons/cut.svg +0 -0
  111. package/{components → src/lib/components}/editor/icons/define.svg +0 -0
  112. package/{components → src/lib/components}/editor/icons/deletecolumn.svg +0 -0
  113. package/{components → src/lib/components}/editor/icons/deleterow.svg +0 -0
  114. package/{components → src/lib/components}/editor/icons/footnote.svg +0 -0
  115. package/{components → src/lib/components}/editor/icons/header1.svg +0 -0
  116. package/{components → src/lib/components}/editor/icons/header2.svg +0 -0
  117. package/{components → src/lib/components}/editor/icons/header3.svg +0 -0
  118. package/{components → src/lib/components}/editor/icons/home.svg +0 -0
  119. package/{components → src/lib/components}/editor/icons/indent.svg +0 -0
  120. package/{components → src/lib/components}/editor/icons/italic.svg +0 -0
  121. package/{components → src/lib/components}/editor/icons/label.svg +0 -0
  122. package/{components → src/lib/components}/editor/icons/left.svg +0 -0
  123. package/{components → src/lib/components}/editor/icons/level.svg +0 -0
  124. package/{components → src/lib/components}/editor/icons/link.svg +0 -0
  125. package/{components → src/lib/components}/editor/icons/list.svg +0 -0
  126. package/{components → src/lib/components}/editor/icons/media.svg +0 -0
  127. package/{components → src/lib/components}/editor/icons/middle.svg +0 -0
  128. package/{components → src/lib/components}/editor/icons/numbers.svg +0 -0
  129. package/{components → src/lib/components}/editor/icons/paragraph.svg +0 -0
  130. package/{components → src/lib/components}/editor/icons/paste.svg +0 -0
  131. package/{components → src/lib/components}/editor/icons/quote.svg +0 -0
  132. package/{components → src/lib/components}/editor/icons/redo.svg +0 -0
  133. package/{components → src/lib/components}/editor/icons/right.svg +0 -0
  134. package/{components → src/lib/components}/editor/icons/rowabove.svg +0 -0
  135. package/{components → src/lib/components}/editor/icons/rowbelow.svg +0 -0
  136. package/{components → src/lib/components}/editor/icons/rule.svg +0 -0
  137. package/{components → src/lib/components}/editor/icons/sub.svg +0 -0
  138. package/{components → src/lib/components}/editor/icons/super.svg +0 -0
  139. package/{components → src/lib/components}/editor/icons/table.svg +0 -0
  140. package/{components → src/lib/components}/editor/icons/text.svg +0 -0
  141. package/{components → src/lib/components}/editor/icons/time.svg +0 -0
  142. package/{components → src/lib/components}/editor/icons/undo.svg +0 -0
  143. package/{components → src/lib/components}/editor/icons/unindent.svg +0 -0
  144. package/{components → src/lib/components}/editor/icons/unlink.svg +0 -0
  145. package/{components → src/lib/components}/page/Acknowledgements.svelte +19 -10
  146. package/src/lib/components/page/Authors.svelte +92 -0
  147. package/src/lib/components/page/BookLoader.svelte +77 -0
  148. package/src/lib/components/page/BulkReferenceEditor.svelte +86 -0
  149. package/src/lib/components/page/Chapter.svelte +449 -0
  150. package/src/lib/components/page/ChapterContext.ts +13 -0
  151. package/{components → src/lib/components}/page/ChapterNumber.svelte +0 -0
  152. package/{components → src/lib/components}/page/ChapterTitle.svelte +4 -2
  153. package/src/lib/components/page/Contexts.ts +176 -0
  154. package/{components → src/lib/components}/page/DefinitionView.svelte +52 -37
  155. package/{components → src/lib/components}/page/Description.svelte +15 -7
  156. package/src/lib/components/page/Edition.svelte +189 -0
  157. package/src/lib/components/page/EditionLoader.svelte +123 -0
  158. package/{components → src/lib/components}/page/Editions.svelte +22 -18
  159. package/{components → src/lib/components}/page/Glossary.svelte +33 -28
  160. package/{components → src/lib/components}/page/Header.svelte +59 -52
  161. package/{components → src/lib/components}/page/Index.svelte +48 -41
  162. package/{components → src/lib/components}/page/Instructions.svelte +2 -1
  163. package/{components → src/lib/components}/page/License.svelte +17 -9
  164. package/{components → src/lib/components}/page/Loading.svelte +0 -0
  165. package/{components → src/lib/components}/page/Media.svelte +44 -27
  166. package/{components → src/lib/components}/page/MediaPreview.svelte +3 -2
  167. package/{components → src/lib/components}/page/Muted.svelte +0 -0
  168. package/{components → src/lib/components}/page/Outline.svelte +140 -110
  169. package/src/lib/components/page/Page.svelte +94 -0
  170. package/{components → src/lib/components}/page/PageHeader.svelte +2 -1
  171. package/{components → src/lib/components}/page/PageParagraph.svelte +0 -0
  172. package/src/lib/components/page/PossibleChapter.svelte +16 -0
  173. package/src/lib/components/page/PossibleReference.svelte +14 -0
  174. package/{components → src/lib/components}/page/Print.svelte +5 -3
  175. package/{components → src/lib/components}/page/Publish.svelte +59 -52
  176. package/{components → src/lib/components}/page/Reference.svelte +39 -30
  177. package/{components → src/lib/components}/page/References.svelte +18 -14
  178. package/{components → src/lib/components}/page/Rows.svelte +0 -0
  179. package/src/lib/components/page/Search.svelte +153 -0
  180. package/{components → src/lib/components}/page/Status.svelte +5 -3
  181. package/{components → src/lib/components}/page/SubdomainEditor.svelte +16 -13
  182. package/{components → src/lib/components}/page/TableOfContents.svelte +79 -68
  183. package/src/lib/components/page/TableOfContentsImage.svelte +22 -0
  184. package/{components → src/lib/components}/page/TableOfContentsRow.svelte +34 -24
  185. package/{components → src/lib/components}/page/ThemeEditor.svelte +44 -33
  186. package/{components → src/lib/components}/page/ThemeEditorPreview.svelte +21 -12
  187. package/src/lib/components/page/ThemeSetEditor.svelte +21 -0
  188. package/{components → src/lib/components}/page/ThemeVariableEditor.svelte +18 -14
  189. package/{components → src/lib/components}/page/Title.svelte +0 -0
  190. package/{components → src/lib/components}/page/Unknown.svelte +10 -8
  191. package/{components/page/margins.js → src/lib/components/page/margins.ts} +79 -46
  192. package/{index.js → src/lib/index.js} +0 -0
  193. package/src/lib/models/CRUD.ts +469 -0
  194. package/{models/Firebase.js → src/lib/models/Firebase.ts} +26 -16
  195. package/src/lib/models/book/Book.ts +283 -0
  196. package/src/lib/models/book/BookMedia.ts +182 -0
  197. package/src/lib/models/book/BookSaveStatus.ts +8 -0
  198. package/src/lib/models/book/Chapter.ts +462 -0
  199. package/{models/book/ChapterID.js → src/lib/models/book/ChapterID.ts} +1 -0
  200. package/src/lib/models/book/Definition.ts +2 -0
  201. package/src/lib/models/book/Edition.ts +1216 -0
  202. package/src/lib/models/book/Reference.ts +171 -0
  203. package/{models/book/Schema.js → src/lib/models/book/Schema.ts} +1 -0
  204. package/{models/book/Theme.js → src/lib/models/book/Theme.ts} +111 -6
  205. package/{models/book/ThemeColors.d.ts → src/lib/models/book/ThemeColors.ts} +6 -0
  206. package/{models/book/Words.js → src/lib/models/book/Words.ts} +1 -0
  207. package/{models/chapter/AtomNode.js → src/lib/models/chapter/AtomNode.ts} +30 -10
  208. package/{models/chapter/BlockNode.js → src/lib/models/chapter/BlockNode.ts} +80 -47
  209. package/src/lib/models/chapter/BlocksNode.test.ts +867 -0
  210. package/{models/chapter/BlocksNode.js → src/lib/models/chapter/BlocksNode.ts} +571 -359
  211. package/{models/chapter/Bookkeeping.d.ts → src/lib/models/chapter/Bookkeeping.ts} +0 -0
  212. package/src/lib/models/chapter/CalloutNode.ts +79 -0
  213. package/{models/chapter/Caret.js → src/lib/models/chapter/Caret.ts} +50 -26
  214. package/src/lib/models/chapter/ChapterNode.ts +169 -0
  215. package/{models/chapter/CitationsNode.js → src/lib/models/chapter/CitationsNode.ts} +17 -10
  216. package/{models/chapter/CodeNode.js → src/lib/models/chapter/CodeNode.ts} +125 -62
  217. package/src/lib/models/chapter/CommentNode.ts +61 -0
  218. package/{models/chapter/DefinitionNode.js → src/lib/models/chapter/DefinitionNode.ts} +14 -8
  219. package/src/lib/models/chapter/Edit.ts +6 -0
  220. package/src/lib/models/chapter/EmbedNode.ts +257 -0
  221. package/{models/chapter/ErrorNode.js → src/lib/models/chapter/ErrorNode.ts} +15 -8
  222. package/src/lib/models/chapter/FootnoteNode.ts +59 -0
  223. package/src/lib/models/chapter/FormatNode.test.ts +137 -0
  224. package/{models/chapter/FormatNode.js → src/lib/models/chapter/FormatNode.ts} +443 -262
  225. package/{models/chapter/InlineCodeNode.js → src/lib/models/chapter/InlineCodeNode.ts} +17 -9
  226. package/{models/chapter/LabelNode.js → src/lib/models/chapter/LabelNode.ts} +26 -10
  227. package/{models/chapter/LinkNode.js → src/lib/models/chapter/LinkNode.ts} +12 -7
  228. package/{models/chapter/ListNode.test.js → src/lib/models/chapter/ListNode.test.ts} +57 -20
  229. package/{models/chapter/ListNode.js → src/lib/models/chapter/ListNode.ts} +277 -200
  230. package/src/lib/models/chapter/MetadataNode.ts +44 -0
  231. package/{models → src/lib/models}/chapter/Node.test.js +0 -0
  232. package/{models/chapter/Node.js → src/lib/models/chapter/Node.ts} +155 -71
  233. package/src/lib/models/chapter/ParagraphNode.test.ts +54 -0
  234. package/{models/chapter/ParagraphNode.js → src/lib/models/chapter/ParagraphNode.ts} +95 -58
  235. package/{models/chapter/Parser.test.js → src/lib/models/chapter/Parser.test.ts} +7 -0
  236. package/{models/chapter/Parser.js → src/lib/models/chapter/Parser.ts} +369 -184
  237. package/{models/chapter/Position.d.ts → src/lib/models/chapter/Position.ts} +0 -0
  238. package/src/lib/models/chapter/QuoteNode.ts +135 -0
  239. package/{models/chapter/RootNode.d.ts → src/lib/models/chapter/RootNode.ts} +2 -0
  240. package/{models/chapter/RuleNode.js → src/lib/models/chapter/RuleNode.ts} +9 -6
  241. package/{models/chapter/TableNode.test.js → src/lib/models/chapter/TableNode.test.ts} +27 -10
  242. package/{models/chapter/TableNode.js → src/lib/models/chapter/TableNode.ts} +141 -82
  243. package/{models/chapter/TextNode.test.js → src/lib/models/chapter/TextNode.test.ts} +2 -0
  244. package/{models/chapter/TextNode.js → src/lib/models/chapter/TextNode.ts} +117 -65
  245. package/{util/getSubdomain.js → src/lib/util/getSubdomain.ts} +14 -8
  246. package/{util/isMobile.js → src/lib/util/isMobile.ts} +1 -0
  247. package/{util/mineReference.js → src/lib/util/mineReference.ts} +45 -25
  248. package/{util/scrollToEyeLevel.js → src/lib/util/scrollToEyeLevel.ts} +4 -2
  249. package/src/params/edition.ts +3 -0
  250. package/src/routes/+error.svelte +12 -0
  251. package/src/routes/+layout.svelte +241 -0
  252. package/src/routes/+page.svelte +43 -0
  253. package/src/routes/Footer.svelte +0 -0
  254. package/src/routes/Header.svelte +112 -0
  255. package/src/routes/[bookid]/+layout.svelte +5 -0
  256. package/src/routes/[bookid]/[[editionid=edition]]/+error.svelte +14 -0
  257. package/src/routes/[bookid]/[[editionid=edition]]/+layout.svelte +7 -0
  258. package/src/routes/[bookid]/[[editionid=edition]]/+page.svelte +5 -0
  259. package/src/routes/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +5 -0
  260. package/src/routes/[bookid]/[[editionid=edition]]/glossary/+page.svelte +5 -0
  261. package/src/routes/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +5 -0
  262. package/src/routes/[bookid]/[[editionid=edition]]/media/+page.svelte +5 -0
  263. package/src/routes/[bookid]/[[editionid=edition]]/print/+page.svelte +5 -0
  264. package/src/routes/[bookid]/[[editionid=edition]]/references/+page.svelte +5 -0
  265. package/src/routes/[bookid]/[[editionid=edition]]/search/+page.svelte +5 -0
  266. package/src/routes/[bookid]/editions/+page.svelte +20 -0
  267. package/src/routes/about/+page.svelte +102 -0
  268. package/src/routes/confirm/+page.svelte +62 -0
  269. package/src/routes/email/+page.svelte +99 -0
  270. package/src/routes/login/+page.svelte +66 -0
  271. package/src/routes/read/+page.svelte +38 -0
  272. package/src/routes/write/+error.svelte +10 -0
  273. package/src/routes/write/+layout.svelte +11 -0
  274. package/src/routes/write/+page.svelte +114 -0
  275. package/src/routes/write/[bookid]/+layout.svelte +5 -0
  276. package/src/routes/write/[bookid]/[[editionid=edition]]/+layout.svelte +7 -0
  277. package/src/routes/write/[bookid]/[[editionid=edition]]/+page.svelte +5 -0
  278. package/src/routes/write/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +5 -0
  279. package/src/routes/write/[bookid]/[[editionid=edition]]/glossary/+page.svelte +5 -0
  280. package/src/routes/write/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +5 -0
  281. package/src/routes/write/[bookid]/[[editionid=edition]]/media/+page.svelte +5 -0
  282. package/src/routes/write/[bookid]/[[editionid=edition]]/print/+page.svelte +5 -0
  283. package/src/routes/write/[bookid]/[[editionid=edition]]/references/+page.svelte +5 -0
  284. package/src/routes/write/[bookid]/[[editionid=edition]]/search/+page.svelte +5 -0
  285. package/src/routes/write/[bookid]/[[editionid=edition]]/theme/+page.svelte +5 -0
  286. package/src/routes/write/[bookid]/[[editionid=edition]]/unknown/+page.svelte +5 -0
  287. package/src/routes/write/[bookid]/editions/+page.svelte +20 -0
  288. package/src/vite-env.d.ts +1 -0
  289. package/static/icons/favicon.png +0 -0
  290. package/static/icons/icon.png +0 -0
  291. package/static/icons/ios-icon.png +0 -0
  292. package/storage.rules +9 -0
  293. package/svelte.config.js +19 -0
  294. package/tsconfig.json +18 -0
  295. package/tsconfig.node.json +9 -0
  296. package/vite.config.ts +8 -0
  297. package/vite.reader.config.ts +32 -0
  298. package/components/Auth.svelte +0 -55
  299. package/components/Auth.svelte.d.ts +0 -16
  300. package/components/Authentication.js +0 -1
  301. package/components/BookPreview.svelte.d.ts +0 -18
  302. package/components/External.svelte.d.ts +0 -18
  303. package/components/Link.svelte +0 -51
  304. package/components/Link.svelte.d.ts +0 -18
  305. package/components/app/BookList.svelte.d.ts +0 -18
  306. package/components/app/Button.svelte.d.ts +0 -22
  307. package/components/app/Feedback.svelte.d.ts +0 -18
  308. package/components/app/Head.svelte.d.ts +0 -18
  309. package/components/app/Large.svelte.d.ts +0 -27
  310. package/components/app/Lead.svelte.d.ts +0 -27
  311. package/components/app/Link.svelte.d.ts +0 -20
  312. package/components/app/Options.svelte.d.ts +0 -19
  313. package/components/app/Paragraph.svelte.d.ts +0 -18
  314. package/components/app/Section.svelte.d.ts +0 -27
  315. package/components/app/Table.svelte.d.ts +0 -27
  316. package/components/app/TextInput.svelte.d.ts +0 -22
  317. package/components/chapter/Atom.svelte.d.ts +0 -19
  318. package/components/chapter/Block.svelte +0 -37
  319. package/components/chapter/Block.svelte.d.ts +0 -17
  320. package/components/chapter/Callout.svelte.d.ts +0 -17
  321. package/components/chapter/CaptionedCode.svelte.d.ts +0 -17
  322. package/components/chapter/ChapterBody.svelte.d.ts +0 -19
  323. package/components/chapter/Citations.svelte.d.ts +0 -17
  324. package/components/chapter/Code.svelte.d.ts +0 -22
  325. package/components/chapter/Comment.svelte.d.ts +0 -17
  326. package/components/chapter/Definition.svelte.d.ts +0 -17
  327. package/components/chapter/Embed.svelte.d.ts +0 -20
  328. package/components/chapter/ErrorMessage.svelte +0 -9
  329. package/components/chapter/ErrorMessage.svelte.d.ts +0 -17
  330. package/components/chapter/ExtendedPrism.d.ts +0 -2
  331. package/components/chapter/Figure.svelte.d.ts +0 -24
  332. package/components/chapter/Footnote.svelte.d.ts +0 -19
  333. package/components/chapter/Format.svelte.d.ts +0 -19
  334. package/components/chapter/InlineCode.svelte.d.ts +0 -17
  335. package/components/chapter/Label.svelte.d.ts +0 -17
  336. package/components/chapter/Link.svelte.d.ts +0 -17
  337. package/components/chapter/List.svelte.d.ts +0 -17
  338. package/components/chapter/Marginal.svelte.d.ts +0 -22
  339. package/components/chapter/Paragraph.svelte.d.ts +0 -18
  340. package/components/chapter/Positioned.svelte.d.ts +0 -19
  341. package/components/chapter/Problem.svelte.d.ts +0 -27
  342. package/components/chapter/Python.svelte +0 -128
  343. package/components/chapter/Python.svelte.d.ts +0 -18
  344. package/components/chapter/Quote.svelte.d.ts +0 -17
  345. package/components/chapter/Rule.svelte.d.ts +0 -17
  346. package/components/chapter/Table.svelte.d.ts +0 -17
  347. package/components/chapter/Text.svelte +0 -87
  348. package/components/chapter/Text.svelte.d.ts +0 -18
  349. package/components/editor/BookishEditor.svelte +0 -884
  350. package/components/editor/BookishEditor.svelte.d.ts +0 -25
  351. package/components/editor/CalloutEditor.svelte +0 -10
  352. package/components/editor/CalloutEditor.svelte.d.ts +0 -17
  353. package/components/editor/CaptionedCodeEditor.svelte.d.ts +0 -17
  354. package/components/editor/CaretContext.d.ts +0 -50
  355. package/components/editor/CaretContext.js +0 -1
  356. package/components/editor/CaretState.js +0 -1
  357. package/components/editor/CaretUtilities.js +0 -1
  358. package/components/editor/CaretView.svelte.d.ts +0 -25
  359. package/components/editor/CitationsEditor.svelte +0 -53
  360. package/components/editor/CitationsEditor.svelte.d.ts +0 -17
  361. package/components/editor/Clipboard.js +0 -1
  362. package/components/editor/Command.js +0 -1
  363. package/components/editor/Commands.d.ts +0 -3
  364. package/components/editor/ConfirmButton.svelte +0 -49
  365. package/components/editor/ConfirmButton.svelte.d.ts +0 -19
  366. package/components/editor/DefinitionEditor.svelte +0 -36
  367. package/components/editor/DefinitionEditor.svelte.d.ts +0 -17
  368. package/components/editor/EmbedEditor.svelte +0 -137
  369. package/components/editor/EmbedEditor.svelte.d.ts +0 -17
  370. package/components/editor/Icon.svelte.d.ts +0 -16
  371. package/components/editor/ImageChooser.svelte.d.ts +0 -18
  372. package/components/editor/InlineCodeEditor.svelte +0 -12
  373. package/components/editor/InlineCodeEditor.svelte.d.ts +0 -17
  374. package/components/editor/LabelEditor.svelte.d.ts +0 -17
  375. package/components/editor/LanguageEditor.svelte.d.ts +0 -17
  376. package/components/editor/LinkEditor.svelte +0 -100
  377. package/components/editor/LinkEditor.svelte.d.ts +0 -17
  378. package/components/editor/Note.svelte.d.ts +0 -27
  379. package/components/editor/Permissions.svelte.d.ts +0 -20
  380. package/components/editor/PositionEditor.svelte +0 -17
  381. package/components/editor/PositionEditor.svelte.d.ts +0 -18
  382. package/components/editor/QuoteEditor.svelte +0 -10
  383. package/components/editor/QuoteEditor.svelte.d.ts +0 -17
  384. package/components/editor/Switch.svelte.d.ts +0 -20
  385. package/components/editor/TableEditor.svelte +0 -10
  386. package/components/editor/TableEditor.svelte.d.ts +0 -17
  387. package/components/editor/TextEditor.svelte.d.ts +0 -24
  388. package/components/editor/Toggle.svelte +0 -41
  389. package/components/editor/Toggle.svelte.d.ts +0 -19
  390. package/components/editor/Toolbar.svelte +0 -249
  391. package/components/editor/Toolbar.svelte.d.ts +0 -17
  392. package/components/editor/ToolbarGroup.svelte.d.ts +0 -18
  393. package/components/editor/ToolbarSpacer.svelte.d.ts +0 -23
  394. package/components/editor/URLEditor.svelte +0 -13
  395. package/components/editor/URLEditor.svelte.d.ts +0 -18
  396. package/components/editor/UndoState.js +0 -1
  397. package/components/page/Acknowledgements.svelte.d.ts +0 -14
  398. package/components/page/Authors.svelte +0 -85
  399. package/components/page/Authors.svelte.d.ts +0 -21
  400. package/components/page/BookLoader.svelte +0 -59
  401. package/components/page/BookLoader.svelte.d.ts +0 -16
  402. package/components/page/BulkReferenceEditor.svelte +0 -63
  403. package/components/page/BulkReferenceEditor.svelte.d.ts +0 -14
  404. package/components/page/Chapter.svelte +0 -392
  405. package/components/page/Chapter.svelte.d.ts +0 -18
  406. package/components/page/ChapterContext.d.ts +0 -10
  407. package/components/page/ChapterContext.js +0 -1
  408. package/components/page/ChapterNumber.svelte.d.ts +0 -27
  409. package/components/page/ChapterTitle.svelte.d.ts +0 -18
  410. package/components/page/Contexts.d.ts +0 -47
  411. package/components/page/Contexts.js +0 -133
  412. package/components/page/DefinitionView.svelte.d.ts +0 -18
  413. package/components/page/Description.svelte.d.ts +0 -14
  414. package/components/page/Edition.svelte +0 -161
  415. package/components/page/Edition.svelte.d.ts +0 -20
  416. package/components/page/EditionLoader.svelte +0 -99
  417. package/components/page/EditionLoader.svelte.d.ts +0 -18
  418. package/components/page/Editions.svelte.d.ts +0 -14
  419. package/components/page/Glossary.svelte.d.ts +0 -14
  420. package/components/page/Header.svelte.d.ts +0 -29
  421. package/components/page/Index.svelte.d.ts +0 -14
  422. package/components/page/Instructions.svelte.d.ts +0 -18
  423. package/components/page/License.svelte.d.ts +0 -14
  424. package/components/page/Loading.svelte.d.ts +0 -23
  425. package/components/page/Media.svelte.d.ts +0 -14
  426. package/components/page/MediaPreview.svelte.d.ts +0 -19
  427. package/components/page/Muted.svelte.d.ts +0 -27
  428. package/components/page/Outline.svelte.d.ts +0 -19
  429. package/components/page/Page.svelte +0 -84
  430. package/components/page/Page.svelte.d.ts +0 -19
  431. package/components/page/PageHeader.svelte.d.ts +0 -18
  432. package/components/page/PageParagraph.svelte.d.ts +0 -27
  433. package/components/page/PossibleChapter.svelte +0 -14
  434. package/components/page/PossibleChapter.svelte.d.ts +0 -14
  435. package/components/page/PossibleReference.svelte +0 -11
  436. package/components/page/PossibleReference.svelte.d.ts +0 -18
  437. package/components/page/Print.svelte.d.ts +0 -14
  438. package/components/page/Publish.svelte.d.ts +0 -14
  439. package/components/page/Reference.svelte.d.ts +0 -17
  440. package/components/page/References.svelte.d.ts +0 -14
  441. package/components/page/Rows.svelte.d.ts +0 -27
  442. package/components/page/Search.svelte +0 -133
  443. package/components/page/Search.svelte.d.ts +0 -14
  444. package/components/page/Status.svelte.d.ts +0 -14
  445. package/components/page/SubdomainEditor.svelte.d.ts +0 -14
  446. package/components/page/TableOfContents.svelte.d.ts +0 -14
  447. package/components/page/TableOfContentsImage.svelte +0 -18
  448. package/components/page/TableOfContentsImage.svelte.d.ts +0 -16
  449. package/components/page/TableOfContentsRow.svelte.d.ts +0 -24
  450. package/components/page/ThemeEditor.svelte.d.ts +0 -14
  451. package/components/page/ThemeEditorPreview.svelte.d.ts +0 -17
  452. package/components/page/ThemeSetEditor.svelte +0 -19
  453. package/components/page/ThemeSetEditor.svelte.d.ts +0 -18
  454. package/components/page/ThemeVariableEditor.svelte.d.ts +0 -18
  455. package/components/page/Title.svelte.d.ts +0 -27
  456. package/components/page/Unknown.svelte.d.ts +0 -16
  457. package/components/page/margins.d.ts +0 -2
  458. package/index.d.ts +0 -15
  459. package/models/CRUD.d.ts +0 -27
  460. package/models/CRUD.js +0 -262
  461. package/models/Firebase.d.ts +0 -5
  462. package/models/book/Book.d.ts +0 -61
  463. package/models/book/Book.js +0 -135
  464. package/models/book/BookMedia.d.ts +0 -23
  465. package/models/book/BookMedia.js +0 -108
  466. package/models/book/BookSaveStatus.d.ts +0 -7
  467. package/models/book/BookSaveStatus.js +0 -8
  468. package/models/book/Chapter.d.ts +0 -81
  469. package/models/book/Chapter.js +0 -212
  470. package/models/book/ChapterID.d.ts +0 -10
  471. package/models/book/Definition.d.ts +0 -6
  472. package/models/book/Definition.js +0 -1
  473. package/models/book/Edition.d.ts +0 -139
  474. package/models/book/Edition.js +0 -620
  475. package/models/book/Reference.d.ts +0 -24
  476. package/models/book/Reference.js +0 -78
  477. package/models/book/Schema.d.ts +0 -174
  478. package/models/book/Theme.d.ts +0 -113
  479. package/models/book/ThemeColors.js +0 -1
  480. package/models/book/Words.d.ts +0 -2
  481. package/models/chapter/AtomNode.d.ts +0 -18
  482. package/models/chapter/BlockNode.d.ts +0 -20
  483. package/models/chapter/BlocksNode.d.ts +0 -50
  484. package/models/chapter/BlocksNode.test.d.ts +0 -1
  485. package/models/chapter/BlocksNode.test.js +0 -568
  486. package/models/chapter/Bookkeeping.js +0 -1
  487. package/models/chapter/CalloutNode.d.ts +0 -17
  488. package/models/chapter/CalloutNode.js +0 -58
  489. package/models/chapter/Caret.d.ts +0 -23
  490. package/models/chapter/ChapterNode.d.ts +0 -34
  491. package/models/chapter/ChapterNode.js +0 -117
  492. package/models/chapter/CitationsNode.d.ts +0 -16
  493. package/models/chapter/CodeNode.d.ts +0 -35
  494. package/models/chapter/CommentNode.d.ts +0 -18
  495. package/models/chapter/CommentNode.js +0 -48
  496. package/models/chapter/DefinitionNode.d.ts +0 -12
  497. package/models/chapter/Edit.d.ts +0 -7
  498. package/models/chapter/Edit.js +0 -1
  499. package/models/chapter/EmbedNode.d.ts +0 -45
  500. package/models/chapter/EmbedNode.js +0 -168
  501. package/models/chapter/ErrorNode.d.ts +0 -17
  502. package/models/chapter/FootnoteNode.d.ts +0 -18
  503. package/models/chapter/FootnoteNode.js +0 -47
  504. package/models/chapter/FormatNode.d.ts +0 -60
  505. package/models/chapter/FormatNode.test.d.ts +0 -1
  506. package/models/chapter/FormatNode.test.js +0 -96
  507. package/models/chapter/InlineCodeNode.d.ts +0 -12
  508. package/models/chapter/LabelNode.d.ts +0 -17
  509. package/models/chapter/LinkNode.d.ts +0 -12
  510. package/models/chapter/ListNode.d.ts +0 -51
  511. package/models/chapter/ListNode.test.d.ts +0 -1
  512. package/models/chapter/MetadataNode.d.ts +0 -17
  513. package/models/chapter/MetadataNode.js +0 -32
  514. package/models/chapter/Node.d.ts +0 -38
  515. package/models/chapter/Node.test.d.ts +0 -1
  516. package/models/chapter/ParagraphNode.d.ts +0 -33
  517. package/models/chapter/ParagraphNode.test.d.ts +0 -1
  518. package/models/chapter/ParagraphNode.test.js +0 -30
  519. package/models/chapter/Parser.d.ts +0 -75
  520. package/models/chapter/Parser.test.d.ts +0 -1
  521. package/models/chapter/Position.js +0 -1
  522. package/models/chapter/QuoteNode.d.ts +0 -25
  523. package/models/chapter/QuoteNode.js +0 -99
  524. package/models/chapter/RootNode.js +0 -1
  525. package/models/chapter/RuleNode.d.ts +0 -15
  526. package/models/chapter/TableNode.d.ts +0 -37
  527. package/models/chapter/TableNode.test.d.ts +0 -1
  528. package/models/chapter/TextNode.d.ts +0 -36
  529. package/models/chapter/TextNode.test.d.ts +0 -1
  530. package/util/getSubdomain.d.ts +0 -3
  531. package/util/isMobile.d.ts +0 -2
  532. package/util/mineReference.d.ts +0 -4
  533. package/util/scrollToEyeLevel.d.ts +0 -2
@@ -0,0 +1,99 @@
1
+ <script lang="ts">
2
+ import { updateEmail } from 'firebase/auth';
3
+ import { getUser } from '../../lib/components/page/Contexts';
4
+ import Feedback from '$lib/components/app/Feedback.svelte';
5
+ import Button from '../../lib/components/app/Button.svelte';
6
+ import Lead from '../../lib/components/app/Lead.svelte';
7
+ import Large from '../../lib/components/app/Large.svelte';
8
+ import Paragraph from '../../lib/components/app/Paragraph.svelte';
9
+ import TextInput from '../../lib/components/app/TextInput.svelte';
10
+ import { goto } from '$app/navigation';
11
+
12
+ let email: string;
13
+ let auth = getUser();
14
+
15
+ let loading = false;
16
+ let feedback = '';
17
+ let error = '';
18
+ let changed = false;
19
+
20
+ const errors: Record<string, string> = {
21
+ 'auth/invalid-mail': "This wasn't a valid email.",
22
+ 'auth/email-already-in-use':
23
+ 'This email is already associated with an account.',
24
+ 'auto/requires-recent-login':
25
+ "You haven't logged in recently enough. Log out, log in again, then try again.",
26
+ };
27
+
28
+ async function handleSubmit() {
29
+ if ($auth === undefined) return;
30
+
31
+ // Enter loading state, try to login and wait for it to complete, and then leave loading state.
32
+ if ($auth.user !== null && email) {
33
+ // Give some feedback when loading.
34
+ loading = true;
35
+ const previousEmail = $auth.user.email;
36
+ feedback = `Sending email update confirmation to ${previousEmail}...`;
37
+ updateEmail($auth.user, email)
38
+ .then(() => {
39
+ feedback = `Check your original email address, ${previousEmail}, for a confirmation link.`;
40
+ changed = true;
41
+ })
42
+ .catch((error: any) => {
43
+ if (typeof error.code === 'string')
44
+ error =
45
+ errors[error.code] ??
46
+ "Couldn't update email for an unknown reason.";
47
+ })
48
+ .finally(() => {
49
+ loading = false;
50
+ });
51
+ }
52
+ }
53
+
54
+ // Ask the auth context to logout, and provided an error if it fails.
55
+ function handleLogout() {
56
+ $auth?.logout();
57
+ goto('/login');
58
+ }
59
+ </script>
60
+
61
+ <Lead><Large>You</Large>.</Lead>
62
+
63
+ <Paragraph>
64
+ To change your login email, type your new email address below.
65
+ </Paragraph>
66
+
67
+ <Paragraph>
68
+ <form on:submit|preventDefault={handleSubmit}>
69
+ <TextInput
70
+ autocomplete="username"
71
+ type="email"
72
+ placeholder="email"
73
+ bind:text={email}
74
+ disabled={loading}
75
+ />
76
+ <Button
77
+ tooltip="submit new email address"
78
+ command={handleSubmit}
79
+ type="submit"
80
+ disabled={loading ||
81
+ email == undefined ||
82
+ email.length === 0 ||
83
+ changed}>update email</Button
84
+ >
85
+ </form>
86
+ </Paragraph>
87
+
88
+ <Paragraph>
89
+ Or, <Button tooltip="logout of your account" command={handleLogout}
90
+ >logout</Button
91
+ >
92
+ </Paragraph>
93
+
94
+ {#if feedback}
95
+ <Feedback>{feedback}</Feedback>
96
+ {/if}
97
+ {#if error}
98
+ <Feedback error>{error}</Feedback>
99
+ {/if}
@@ -0,0 +1,66 @@
1
+ <script lang="ts">
2
+ import { getUser } from '$lib/components/page/Contexts';
3
+ import Feedback from '$lib/components/app/Feedback.svelte';
4
+ import Lead from '$lib/components/app/Lead.svelte';
5
+ import Large from '$lib/components/app/Large.svelte';
6
+ import Paragraph from '$lib/components/app/Paragraph.svelte';
7
+ import TextInput from '$lib/components/app/TextInput.svelte';
8
+ import Button from '$lib/components/app/Button.svelte';
9
+
10
+ let auth = getUser();
11
+
12
+ let email: string = '';
13
+ let loading = false;
14
+ let feedback = '';
15
+ let error = '';
16
+
17
+ async function handleSubmit() {
18
+ if ($auth === undefined) return;
19
+ // Enter loading state, try to login and wait for it to complete, and then leave loading state.
20
+ try {
21
+ // Give some feedback when loading.
22
+ feedback = 'Logging in...';
23
+ loading = true;
24
+ await $auth.login(email);
25
+ feedback = 'Check your email for a login link.';
26
+ } catch (err) {
27
+ feedback = '';
28
+ error = "Couldn't connect to the server.";
29
+ } finally {
30
+ loading = false;
31
+ }
32
+ }
33
+ </script>
34
+
35
+ <Lead><Large>Login</Large> to write.</Lead>
36
+
37
+ <Paragraph>
38
+ We'll send you an email each time to login, no password required.
39
+ </Paragraph>
40
+
41
+ <form on:submit|preventDefault={handleSubmit}>
42
+ <TextInput
43
+ bind:text={email}
44
+ autocomplete="username"
45
+ type="email"
46
+ placeholder="email"
47
+ disabled={auth === undefined || loading}
48
+ />
49
+ <Button
50
+ tooltip="login into your account"
51
+ command={handleSubmit}
52
+ type="submit"
53
+ disabled={auth === undefined ||
54
+ loading ||
55
+ !/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(email)}
56
+ >
57
+ login
58
+ </Button>
59
+ </form>
60
+
61
+ {#if feedback}
62
+ <Feedback>{feedback}</Feedback>
63
+ {/if}
64
+ {#if error}
65
+ <Feedback error>{error}</Feedback>
66
+ {/if}
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ import { listenToPublishedBooks } from '$lib/models/CRUD';
3
+ import type Book from '$lib/models/book/Book';
4
+ import { onMount } from 'svelte';
5
+ import Feedback from '$lib/components/app/Feedback.svelte';
6
+ import Lead from '$lib/components/app/Lead.svelte';
7
+ import Paragraph from '$lib/components/app/Paragraph.svelte';
8
+ import Large from '$lib/components/app/Large.svelte';
9
+ import BookList from '$lib/components/app/BookList.svelte';
10
+
11
+ let books: Book[] | undefined = undefined;
12
+ let error: string | undefined = undefined;
13
+
14
+ function updateBooks(latestBooks: Book[]) {
15
+ books = latestBooks;
16
+ }
17
+
18
+ // Get the books when the component loads, stop listening on unmount.
19
+ onMount(() => {
20
+ try {
21
+ return listenToPublishedBooks(updateBooks);
22
+ } catch (err) {
23
+ error = '' + err;
24
+ }
25
+ });
26
+ </script>
27
+
28
+ <Lead><Large>Read</Large> something.</Lead>
29
+
30
+ {#if error !== undefined}
31
+ <Feedback error>{error}</Feedback>
32
+ {:else if books === undefined}
33
+ <Feedback>Loading books...</Feedback>
34
+ {:else if books.length === 0}
35
+ <Paragraph>There are no published books.</Paragraph>
36
+ {:else}
37
+ <BookList {books} write={false} />
38
+ {/if}
@@ -0,0 +1,10 @@
1
+ <script lang="ts">
2
+ import Feedback from '$lib/components/app/Feedback.svelte';
3
+ import Link from '$lib/components/Link.svelte';
4
+ </script>
5
+
6
+ <Feedback>
7
+ This book doesn't exist. Want to go to your <Link to="/write"
8
+ >dashboard</Link
9
+ >?
10
+ </Feedback>
@@ -0,0 +1,11 @@
1
+ <script lang="ts">
2
+ import { goto } from '$app/navigation';
3
+ import { getUser } from '$lib/components/page/Contexts';
4
+
5
+ let auth = getUser();
6
+
7
+ // Redirect to the login page if not authenticated.
8
+ if ($auth === undefined || $auth.user === null) goto('/login');
9
+ </script>
10
+
11
+ <slot />
@@ -0,0 +1,114 @@
1
+ <script lang="ts">
2
+ import {
3
+ createBook,
4
+ listenToEditableBooks,
5
+ listenToPartiallyEditableBooks,
6
+ } from '$lib/models/CRUD';
7
+ import type Book from '$lib/models/book/Book';
8
+ import { goto } from '$app/navigation';
9
+ import { onMount } from 'svelte';
10
+ import { getUser } from '$lib/components/page/Contexts';
11
+ import Feedback from '$lib/components/app/Feedback.svelte';
12
+ import Lead from '$lib/components/app/Lead.svelte';
13
+ import Large from '$lib/components/app/Large.svelte';
14
+ import Paragraph from '$lib/components/app/Paragraph.svelte';
15
+ import Button from '$lib/components/app/Button.svelte';
16
+ import BookList from '$lib/components/app/BookList.svelte';
17
+ import Section from '$lib/components/app/Section.svelte';
18
+ import Link from '$lib/components/app/Link.svelte';
19
+
20
+ let editableBooks: Book[] | undefined = undefined;
21
+ let partiallyEditableBooks: Book[] | undefined = undefined;
22
+ let error: string | undefined = undefined;
23
+ let auth = getUser();
24
+
25
+ // Merge and deduplicate the books
26
+ $: books =
27
+ editableBooks === undefined || partiallyEditableBooks === undefined
28
+ ? undefined
29
+ : [...editableBooks, ...partiallyEditableBooks].filter(
30
+ (book1, index1, bookList) =>
31
+ !bookList.some(
32
+ (book2, index2) =>
33
+ index2 > index1 && book1.ref.id === book2.ref.id
34
+ )
35
+ );
36
+
37
+ // Get the books when the component loads.
38
+ onMount(() => {
39
+ if ($auth !== undefined && $auth.user !== null) {
40
+ try {
41
+ const editableUnsub = listenToEditableBooks(
42
+ $auth.user.uid,
43
+ (books) => (editableBooks = books)
44
+ );
45
+ const partiallyEditableUnsub = listenToPartiallyEditableBooks(
46
+ $auth.user.uid,
47
+ (books) => (partiallyEditableBooks = books)
48
+ );
49
+ return () => {
50
+ editableUnsub();
51
+ partiallyEditableUnsub();
52
+ };
53
+ } catch (err) {
54
+ error = '' + err;
55
+ }
56
+ } else error = "You're not logged in.";
57
+ });
58
+
59
+ let creating = false;
60
+ let timeSinceCreation = 0;
61
+ let creationFeedback = '';
62
+
63
+ function newBook() {
64
+ creating = true;
65
+ creationFeedback = 'Creating book...';
66
+ timeSinceCreation = Date.now();
67
+ const timerID = setInterval(() => {
68
+ const delta = Date.now() - timeSinceCreation;
69
+ creationFeedback =
70
+ delta < 3000
71
+ ? 'Creating book...'
72
+ : delta < 6000
73
+ ? 'Still trying to create book...'
74
+ : delta < 9000
75
+ ? 'Internet is slow or offline, but will keep trying...'
76
+ : 'Sorry this is taking so long! If the internet connection comes back, we will create the book.';
77
+ }, 1000);
78
+ // Make the book, then go to its page
79
+ if ($auth?.user)
80
+ createBook($auth.user.uid)
81
+ .then((bookID) => goto('/write/' + bookID))
82
+ .catch((err) => {
83
+ creating = false;
84
+ console.log(err);
85
+ error = "Couldn't create a book: " + error;
86
+ })
87
+ .finally(() => clearInterval(timerID));
88
+ }
89
+ </script>
90
+
91
+ <Lead><Large>Write</Large> something.</Lead>
92
+
93
+ <Paragraph
94
+ >Publishing is currently <Link to="about#editing">invitation only</Link
95
+ >.</Paragraph
96
+ >
97
+
98
+ <Paragraph>
99
+ <Button tooltip="create new book" command={newBook} disabled={creating}
100
+ >+ book</Button
101
+ >
102
+ </Paragraph>
103
+
104
+ {#if creating}
105
+ <Feedback>{creationFeedback}</Feedback>
106
+ {:else if error}
107
+ <Feedback error>{error}</Feedback>
108
+ {:else if books === undefined}
109
+ <Feedback>Loading books...</Feedback>
110
+ {:else if books.length === 0}
111
+ <Paragraph>You don't have have any books.</Paragraph>
112
+ {:else}
113
+ <BookList {books} write />
114
+ {/if}
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import BookLoader from '$lib/components/page/BookLoader.svelte';
3
+ </script>
4
+
5
+ <BookLoader><slot /></BookLoader>
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import EditionLoader from '$lib/components/page/EditionLoader.svelte';
3
+ </script>
4
+
5
+ <EditionLoader write={true}>
6
+ <slot />
7
+ </EditionLoader>
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import TableOfContents from '$lib/components/page/TableOfContents.svelte';
3
+ </script>
4
+
5
+ <TableOfContents />
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import PossibleChapter from '$lib/components/page/PossibleChapter.svelte';
3
+ </script>
4
+
5
+ <PossibleChapter />
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import Glossary from '$lib/components/page/Glossary.svelte';
3
+ </script>
4
+
5
+ <Glossary />
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import Index from '$lib/components/page/Index.svelte';
3
+ </script>
4
+
5
+ <Index />
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import Media from '$lib/components/page/Media.svelte';
3
+ </script>
4
+
5
+ <Media />
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import Print from '$lib/components/page/Print.svelte';
3
+ </script>
4
+
5
+ <Print />
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import References from '$lib/components/page/References.svelte';
3
+ </script>
4
+
5
+ <References />
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import Search from '$lib/components/page/Search.svelte';
3
+ </script>
4
+
5
+ <Search />
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import ThemeEditor from '$lib/components/page/ThemeEditor.svelte';
3
+ </script>
4
+
5
+ <ThemeEditor />
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import Unknown from '$lib/components/page/Unknown.svelte';
3
+ </script>
4
+
5
+ <Unknown />
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import Editions from '$lib/components/page/Editions.svelte';
3
+ import { getBook } from '$lib/components/page/Contexts';
4
+ import Feedback from '$lib/components/app/Feedback.svelte';
5
+ import Section from '$lib/components/app/Section.svelte';
6
+ import Lead from '$lib/components/app/Lead.svelte';
7
+ import Large from '$lib/components/app/Large.svelte';
8
+
9
+ let book = getBook();
10
+ </script>
11
+
12
+ {#if $book}
13
+ <Section>
14
+ <Lead><Large>Editions</Large><br />{$book.title}</Lead>
15
+
16
+ <Editions />
17
+ </Section>
18
+ {:else}
19
+ <Feedback error>This book couldn't be found.</Feedback>
20
+ {/if}
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
Binary file
Binary file
Binary file
package/storage.rules ADDED
@@ -0,0 +1,9 @@
1
+ rules_version = '2';
2
+ service firebase.storage {
3
+ match /b/{bucket}/o {
4
+ match /{allPaths=**} {
5
+ allow read: if true;
6
+ allow write: if request.auth != null;
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,19 @@
1
+ import adapter from '@sveltejs/adapter-static';
2
+ import preprocess from 'svelte-preprocess';
3
+
4
+ /** @type {import('@sveltejs/kit').Config} */
5
+ const config = {
6
+ // Consult https://github.com/sveltejs/svelte-preprocess
7
+ // for more information about preprocessors
8
+ preprocess: preprocess(),
9
+
10
+ kit: {
11
+ adapter: adapter({
12
+ pages: 'dist',
13
+ assets: 'dist',
14
+ fallback: 'index.html',
15
+ }),
16
+ },
17
+ };
18
+
19
+ export default config;
package/tsconfig.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "extends": "./.svelte-kit/tsconfig.json",
3
+ "compilerOptions": {
4
+ // "allowJs": true,
5
+ "checkJs": true,
6
+ "esModuleInterop": true,
7
+ "forceConsistentCasingInFileNames": true,
8
+ "resolveJsonModule": true,
9
+ "skipLibCheck": true,
10
+ "sourceMap": true,
11
+ "strict": true,
12
+ "types": ["vitest/globals"]
13
+ }
14
+ // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
15
+ //
16
+ // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
17
+ // from the referenced tsconfig.json - TypeScript does not merge them in
18
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "module": "ESNext",
5
+ "moduleResolution": "Node",
6
+ "allowSyntheticDefaultImports": true
7
+ },
8
+ "include": ["vite.config.ts"]
9
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { sveltekit } from '@sveltejs/kit/vite';
2
+ import type { UserConfig } from 'vite';
3
+
4
+ const config: UserConfig = {
5
+ plugins: [sveltekit()],
6
+ };
7
+
8
+ export default config;
@@ -0,0 +1,32 @@
1
+ import { defineConfig } from 'vite';
2
+ import { resolve } from 'path';
3
+ import react from '@vitejs/plugin-react';
4
+
5
+ // https://vitejs.dev/config/
6
+ export default defineConfig({
7
+ plugins: [react()],
8
+ define: { 'process.env.NODE_ENV': '"production"' },
9
+ build: {
10
+ // We always run this build after the app build, so we don't want to destroy it.
11
+ emptyOutDir: false,
12
+ lib: {
13
+ entry: resolve(__dirname, 'reader/Reader.tsx'),
14
+ name: 'Bookish',
15
+ fileName: 'bookish',
16
+ // Make an immediately evaluated function suitable for script import by books.
17
+ formats: ['iife'],
18
+ },
19
+ rollupOptions: {
20
+ output: {
21
+ entryFileNames: (assetInfo) =>
22
+ assetInfo.name === 'Reader'
23
+ ? 'bookish.js'
24
+ : assetInfo.name ?? '',
25
+ assetFileNames: (assetInfo) =>
26
+ assetInfo.name === 'style.css'
27
+ ? 'bookish.css'
28
+ : assetInfo.name ?? '',
29
+ },
30
+ },
31
+ },
32
+ });
@@ -1,55 +0,0 @@
1
- <script>import { sendSignInLinkToEmail } from 'firebase/auth';
2
- import { onDestroy, setContext } from 'svelte';
3
- import { writable } from 'svelte/store';
4
- import { auth } from '../models/Firebase';
5
- import { USER } from './page/Contexts';
6
- // Track the user and user loading status in state
7
- let loading = true;
8
- // The store that tracks the auth context.
9
- const authentication = writable({
10
- user: null,
11
- loading: loading,
12
- login,
13
- logout,
14
- });
15
- // Login using Firebase's password-less email verification
16
- async function login(email) {
17
- // If connected to firebase...
18
- if (auth) {
19
- const actionCodeSettings = {
20
- url: location.origin + '/confirm',
21
- handleCodeInApp: true,
22
- };
23
- // Ask Firebase to log in with the given email
24
- await sendSignInLinkToEmail(auth, email, actionCodeSettings);
25
- // Remember the email in local storage so we don't have to ask for it again
26
- // after returning to the link above.
27
- window.localStorage.setItem('email', email);
28
- }
29
- }
30
- function updateAuth(user) {
31
- authentication.set({ user, loading: loading, login, logout });
32
- }
33
- // Logout using Firebase's authentication framework.
34
- function logout() {
35
- if (auth) {
36
- return auth.signOut().then(() => updateAuth(null));
37
- }
38
- }
39
- // On mount, subscribe to authentication changes.
40
- if (auth) {
41
- const unsubscribe = auth.onAuthStateChanged((user) => {
42
- loading = false;
43
- updateAuth(user);
44
- });
45
- // On unmount, stop subscribing.
46
- onDestroy(unsubscribe);
47
- }
48
- // Expose the state and the login/logout functionality.
49
- setContext(USER, authentication);
50
- </script>
51
-
52
- <!-- Wrap whatever children are given in this context. -->
53
- {#if loading === false}
54
- <slot />
55
- {/if}
@@ -1,16 +0,0 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare const __propDef: {
3
- props: Record<string, never>;
4
- events: {
5
- [evt: string]: CustomEvent<any>;
6
- };
7
- slots: {
8
- default: {};
9
- };
10
- };
11
- export type AuthProps = typeof __propDef.props;
12
- export type AuthEvents = typeof __propDef.events;
13
- export type AuthSlots = typeof __propDef.slots;
14
- export default class Auth extends SvelteComponentTyped<AuthProps, AuthEvents, AuthSlots> {
15
- }
16
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,18 +0,0 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- import type Book from '../models/book/Book';
3
- declare const __propDef: {
4
- props: {
5
- book: Book;
6
- write?: boolean | undefined;
7
- };
8
- events: {
9
- [evt: string]: CustomEvent<any>;
10
- };
11
- slots: {};
12
- };
13
- export type BookPreviewProps = typeof __propDef.props;
14
- export type BookPreviewEvents = typeof __propDef.events;
15
- export type BookPreviewSlots = typeof __propDef.slots;
16
- export default class BookPreview extends SvelteComponentTyped<BookPreviewProps, BookPreviewEvents, BookPreviewSlots> {
17
- }
18
- export {};