bookish-press 0.4.47 → 0.4.48

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/components/Auth.svelte +55 -0
  2. package/components/Auth.svelte.d.ts +16 -0
  3. package/{src/lib/components/Authentication.ts → components/Authentication.d.ts} +0 -2
  4. package/components/Authentication.js +1 -0
  5. package/{src/lib/components → components}/BookPreview.svelte +22 -27
  6. package/components/BookPreview.svelte.d.ts +18 -0
  7. package/{src/lib/components → components}/External.svelte +1 -2
  8. package/components/External.svelte.d.ts +18 -0
  9. package/components/Link.svelte +51 -0
  10. package/components/Link.svelte.d.ts +18 -0
  11. package/{src/lib/components → components}/app/BookList.svelte +3 -6
  12. package/components/app/BookList.svelte.d.ts +18 -0
  13. package/{src/lib/components → components}/app/Button.svelte +4 -5
  14. package/components/app/Button.svelte.d.ts +22 -0
  15. package/{src/lib/components → components}/app/Feedback.svelte +7 -11
  16. package/components/app/Feedback.svelte.d.ts +18 -0
  17. package/{src/lib/components → components}/app/Head.svelte +1 -2
  18. package/components/app/Head.svelte.d.ts +18 -0
  19. package/{src/lib/components → components}/app/Large.svelte +0 -0
  20. package/components/app/Large.svelte.d.ts +27 -0
  21. package/{src/lib/components → components}/app/Lead.svelte +0 -0
  22. package/components/app/Lead.svelte.d.ts +27 -0
  23. package/{src/lib/components → components}/app/Link.svelte +3 -4
  24. package/components/app/Link.svelte.d.ts +20 -0
  25. package/{src/lib/components → components}/app/Options.svelte +4 -5
  26. package/components/app/Options.svelte.d.ts +19 -0
  27. package/{src/lib/components → components}/app/Paragraph.svelte +1 -2
  28. package/components/app/Paragraph.svelte.d.ts +18 -0
  29. package/{src/lib/components → components}/app/Section.svelte +0 -0
  30. package/components/app/Section.svelte.d.ts +27 -0
  31. package/{src/lib/components → components}/app/Table.svelte +0 -0
  32. package/components/app/Table.svelte.d.ts +27 -0
  33. package/{src/lib/components → components}/app/TextInput.svelte +9 -12
  34. package/components/app/TextInput.svelte.d.ts +22 -0
  35. package/{src/lib/components → components}/chapter/Atom.svelte +12 -18
  36. package/components/chapter/Atom.svelte.d.ts +19 -0
  37. package/components/chapter/Block.svelte +37 -0
  38. package/components/chapter/Block.svelte.d.ts +17 -0
  39. package/{src/lib/components → components}/chapter/Callout.svelte +3 -6
  40. package/components/chapter/Callout.svelte.d.ts +17 -0
  41. package/{src/lib/components → components}/chapter/CaptionedCode.svelte +13 -21
  42. package/components/chapter/CaptionedCode.svelte.d.ts +17 -0
  43. package/{src/lib/components → components}/chapter/ChapterBody.svelte +9 -13
  44. package/components/chapter/ChapterBody.svelte.d.ts +19 -0
  45. package/{src/lib/components → components}/chapter/Citations.svelte +33 -34
  46. package/components/chapter/Citations.svelte.d.ts +17 -0
  47. package/{src/lib/components → components}/chapter/Code.svelte +58 -62
  48. package/components/chapter/Code.svelte.d.ts +22 -0
  49. package/{src/lib/components → components}/chapter/Comment.svelte +18 -30
  50. package/components/chapter/Comment.svelte.d.ts +17 -0
  51. package/{src/lib/components → components}/chapter/Definition.svelte +17 -23
  52. package/components/chapter/Definition.svelte.d.ts +17 -0
  53. package/{src/lib/components → components}/chapter/Embed.svelte +77 -97
  54. package/components/chapter/Embed.svelte.d.ts +20 -0
  55. package/components/chapter/ErrorMessage.svelte +9 -0
  56. package/components/chapter/ErrorMessage.svelte.d.ts +17 -0
  57. package/components/chapter/ExtendedPrism.d.ts +2 -0
  58. package/{src/lib/components → components}/chapter/ExtendedPrism.js +0 -0
  59. package/{src/lib/components → components}/chapter/Figure.svelte +26 -34
  60. package/components/chapter/Figure.svelte.d.ts +24 -0
  61. package/{src/lib/components → components}/chapter/Footnote.svelte +20 -32
  62. package/components/chapter/Footnote.svelte.d.ts +19 -0
  63. package/{src/lib/components → components}/chapter/Format.svelte +34 -39
  64. package/components/chapter/Format.svelte.d.ts +19 -0
  65. package/{src/lib/components → components}/chapter/InlineCode.svelte +5 -9
  66. package/components/chapter/InlineCode.svelte.d.ts +17 -0
  67. package/{src/lib/components → components}/chapter/Label.svelte +14 -23
  68. package/components/chapter/Label.svelte.d.ts +17 -0
  69. package/{src/lib/components → components}/chapter/Link.svelte +21 -27
  70. package/components/chapter/Link.svelte.d.ts +17 -0
  71. package/{src/lib/components → components}/chapter/List.svelte +3 -5
  72. package/components/chapter/List.svelte.d.ts +17 -0
  73. package/{src/lib/components → components}/chapter/Marginal.svelte +41 -54
  74. package/components/chapter/Marginal.svelte.d.ts +22 -0
  75. package/{src/lib/components → components}/chapter/Paragraph.svelte +20 -25
  76. package/components/chapter/Paragraph.svelte.d.ts +18 -0
  77. package/{src/lib/components → components}/chapter/Positioned.svelte +1 -4
  78. package/components/chapter/Positioned.svelte.d.ts +19 -0
  79. package/{src/lib/components → components}/chapter/Problem.svelte +0 -0
  80. package/components/chapter/Problem.svelte.d.ts +27 -0
  81. package/components/chapter/Python.svelte +128 -0
  82. package/components/chapter/Python.svelte.d.ts +18 -0
  83. package/{src/lib/components → components}/chapter/Quote.svelte +5 -9
  84. package/components/chapter/Quote.svelte.d.ts +17 -0
  85. package/{src/lib/components → components}/chapter/Rule.svelte +1 -4
  86. package/components/chapter/Rule.svelte.d.ts +17 -0
  87. package/{src/lib/components → components}/chapter/Table.svelte +7 -11
  88. package/components/chapter/Table.svelte.d.ts +17 -0
  89. package/components/chapter/Text.svelte +87 -0
  90. package/components/chapter/Text.svelte.d.ts +18 -0
  91. package/components/editor/BookishEditor.svelte +884 -0
  92. package/components/editor/BookishEditor.svelte.d.ts +25 -0
  93. package/components/editor/CalloutEditor.svelte +10 -0
  94. package/components/editor/CalloutEditor.svelte.d.ts +17 -0
  95. package/{src/lib/components → components}/editor/CaptionedCodeEditor.svelte +6 -10
  96. package/components/editor/CaptionedCodeEditor.svelte.d.ts +17 -0
  97. package/components/editor/CaretContext.d.ts +50 -0
  98. package/components/editor/CaretContext.js +1 -0
  99. package/{src/lib/components/editor/CaretState.ts → components/editor/CaretState.d.ts} +7 -6
  100. package/components/editor/CaretState.js +1 -0
  101. package/{src/lib/components/editor/CaretUtilities.ts → components/editor/CaretUtilities.d.ts} +0 -1
  102. package/components/editor/CaretUtilities.js +1 -0
  103. package/{src/lib/components → components}/editor/CaretView.svelte +20 -25
  104. package/components/editor/CaretView.svelte.d.ts +25 -0
  105. package/components/editor/CitationsEditor.svelte +53 -0
  106. package/components/editor/CitationsEditor.svelte.d.ts +17 -0
  107. package/{src/lib/components/editor/Clipboard.ts → components/editor/Clipboard.d.ts} +1 -2
  108. package/components/editor/Clipboard.js +1 -0
  109. package/{src/lib/components/editor/Command.ts → components/editor/Command.d.ts} +2 -8
  110. package/components/editor/Command.js +1 -0
  111. package/components/editor/Commands.d.ts +3 -0
  112. package/{src/lib/components/editor/Commands.ts → components/editor/Commands.js} +315 -730
  113. package/components/editor/ConfirmButton.svelte +49 -0
  114. package/components/editor/ConfirmButton.svelte.d.ts +19 -0
  115. package/components/editor/DefinitionEditor.svelte +36 -0
  116. package/components/editor/DefinitionEditor.svelte.d.ts +17 -0
  117. package/components/editor/EmbedEditor.svelte +137 -0
  118. package/components/editor/EmbedEditor.svelte.d.ts +17 -0
  119. package/{src/lib/components → components}/editor/Icon.svelte +1 -2
  120. package/components/editor/Icon.svelte.d.ts +16 -0
  121. package/{src/lib/components → components}/editor/ImageChooser.svelte +19 -24
  122. package/components/editor/ImageChooser.svelte.d.ts +18 -0
  123. package/components/editor/InlineCodeEditor.svelte +12 -0
  124. package/components/editor/InlineCodeEditor.svelte.d.ts +17 -0
  125. package/{src/lib/components → components}/editor/LabelEditor.svelte +9 -14
  126. package/components/editor/LabelEditor.svelte.d.ts +17 -0
  127. package/{src/lib/components → components}/editor/LanguageEditor.svelte +5 -8
  128. package/components/editor/LanguageEditor.svelte.d.ts +17 -0
  129. package/components/editor/LinkEditor.svelte +100 -0
  130. package/components/editor/LinkEditor.svelte.d.ts +17 -0
  131. package/{src/lib/components → components}/editor/Note.svelte +0 -0
  132. package/components/editor/Note.svelte.d.ts +27 -0
  133. package/{src/lib/components → components}/editor/Permissions.svelte +36 -43
  134. package/components/editor/Permissions.svelte.d.ts +20 -0
  135. package/components/editor/PositionEditor.svelte +17 -0
  136. package/components/editor/PositionEditor.svelte.d.ts +18 -0
  137. package/components/editor/QuoteEditor.svelte +10 -0
  138. package/components/editor/QuoteEditor.svelte.d.ts +17 -0
  139. package/{src/lib/components → components}/editor/Switch.svelte +11 -14
  140. package/components/editor/Switch.svelte.d.ts +20 -0
  141. package/components/editor/TableEditor.svelte +10 -0
  142. package/components/editor/TableEditor.svelte.d.ts +17 -0
  143. package/{src/lib/components → components}/editor/TextEditor.svelte +89 -101
  144. package/components/editor/TextEditor.svelte.d.ts +24 -0
  145. package/components/editor/Toggle.svelte +41 -0
  146. package/components/editor/Toggle.svelte.d.ts +19 -0
  147. package/components/editor/Toolbar.svelte +249 -0
  148. package/components/editor/Toolbar.svelte.d.ts +17 -0
  149. package/{src/lib/components → components}/editor/ToolbarGroup.svelte +3 -5
  150. package/components/editor/ToolbarGroup.svelte.d.ts +18 -0
  151. package/{src/lib/components → components}/editor/ToolbarSpacer.svelte +0 -0
  152. package/components/editor/ToolbarSpacer.svelte.d.ts +23 -0
  153. package/components/editor/URLEditor.svelte +13 -0
  154. package/components/editor/URLEditor.svelte.d.ts +18 -0
  155. package/{src/lib/components/editor/UndoState.ts → components/editor/UndoState.d.ts} +2 -3
  156. package/components/editor/UndoState.js +1 -0
  157. package/{src/lib/components → components}/editor/icons/annotate.svg +0 -0
  158. package/{src/lib/components → components}/editor/icons/block.svg +0 -0
  159. package/{src/lib/components → components}/editor/icons/bold.svg +0 -0
  160. package/{src/lib/components → components}/editor/icons/bullets.svg +0 -0
  161. package/{src/lib/components → components}/editor/icons/callout.svg +0 -0
  162. package/{src/lib/components → components}/editor/icons/citation.svg +0 -0
  163. package/{src/lib/components → components}/editor/icons/clear.svg +0 -0
  164. package/{src/lib/components → components}/editor/icons/clipboard.svg +0 -0
  165. package/{src/lib/components → components}/editor/icons/code.svg +0 -0
  166. package/{src/lib/components → components}/editor/icons/columnafter.svg +0 -0
  167. package/{src/lib/components → components}/editor/icons/columnbefore.svg +0 -0
  168. package/{src/lib/components → components}/editor/icons/comment.svg +0 -0
  169. package/{src/lib/components → components}/editor/icons/copy.svg +0 -0
  170. package/{src/lib/components → components}/editor/icons/cut.svg +0 -0
  171. package/{src/lib/components → components}/editor/icons/define.svg +0 -0
  172. package/{src/lib/components → components}/editor/icons/deletecolumn.svg +0 -0
  173. package/{src/lib/components → components}/editor/icons/deleterow.svg +0 -0
  174. package/{src/lib/components → components}/editor/icons/footnote.svg +0 -0
  175. package/{src/lib/components → components}/editor/icons/header1.svg +0 -0
  176. package/{src/lib/components → components}/editor/icons/header2.svg +0 -0
  177. package/{src/lib/components → components}/editor/icons/header3.svg +0 -0
  178. package/{src/lib/components → components}/editor/icons/home.svg +0 -0
  179. package/{src/lib/components → components}/editor/icons/indent.svg +0 -0
  180. package/{src/lib/components → components}/editor/icons/italic.svg +0 -0
  181. package/{src/lib/components → components}/editor/icons/label.svg +0 -0
  182. package/{src/lib/components → components}/editor/icons/left.svg +0 -0
  183. package/{src/lib/components → components}/editor/icons/level.svg +0 -0
  184. package/{src/lib/components → components}/editor/icons/link.svg +0 -0
  185. package/{src/lib/components → components}/editor/icons/list.svg +0 -0
  186. package/{src/lib/components → components}/editor/icons/media.svg +0 -0
  187. package/{src/lib/components → components}/editor/icons/middle.svg +0 -0
  188. package/{src/lib/components → components}/editor/icons/numbers.svg +0 -0
  189. package/{src/lib/components → components}/editor/icons/paragraph.svg +0 -0
  190. package/{src/lib/components → components}/editor/icons/paste.svg +0 -0
  191. package/{src/lib/components → components}/editor/icons/quote.svg +0 -0
  192. package/{src/lib/components → components}/editor/icons/redo.svg +0 -0
  193. package/{src/lib/components → components}/editor/icons/right.svg +0 -0
  194. package/{src/lib/components → components}/editor/icons/rowabove.svg +0 -0
  195. package/{src/lib/components → components}/editor/icons/rowbelow.svg +0 -0
  196. package/{src/lib/components → components}/editor/icons/rule.svg +0 -0
  197. package/{src/lib/components → components}/editor/icons/sub.svg +0 -0
  198. package/{src/lib/components → components}/editor/icons/super.svg +0 -0
  199. package/{src/lib/components → components}/editor/icons/table.svg +0 -0
  200. package/{src/lib/components → components}/editor/icons/text.svg +0 -0
  201. package/{src/lib/components → components}/editor/icons/time.svg +0 -0
  202. package/{src/lib/components → components}/editor/icons/undo.svg +0 -0
  203. package/{src/lib/components → components}/editor/icons/unindent.svg +0 -0
  204. package/{src/lib/components → components}/editor/icons/unlink.svg +0 -0
  205. package/{src/lib/components → components}/page/Acknowledgements.svelte +10 -19
  206. package/components/page/Acknowledgements.svelte.d.ts +14 -0
  207. package/components/page/Authors.svelte +85 -0
  208. package/components/page/Authors.svelte.d.ts +21 -0
  209. package/components/page/BookLoader.svelte +59 -0
  210. package/components/page/BookLoader.svelte.d.ts +16 -0
  211. package/components/page/BulkReferenceEditor.svelte +63 -0
  212. package/components/page/BulkReferenceEditor.svelte.d.ts +14 -0
  213. package/components/page/Chapter.svelte +392 -0
  214. package/components/page/Chapter.svelte.d.ts +18 -0
  215. package/components/page/ChapterContext.d.ts +10 -0
  216. package/components/page/ChapterContext.js +1 -0
  217. package/{src/lib/components → components}/page/ChapterNumber.svelte +0 -0
  218. package/components/page/ChapterNumber.svelte.d.ts +27 -0
  219. package/{src/lib/components → components}/page/ChapterTitle.svelte +2 -4
  220. package/components/page/ChapterTitle.svelte.d.ts +18 -0
  221. package/components/page/Contexts.d.ts +47 -0
  222. package/components/page/Contexts.js +133 -0
  223. package/{src/lib/components → components}/page/DefinitionView.svelte +37 -52
  224. package/components/page/DefinitionView.svelte.d.ts +18 -0
  225. package/{src/lib/components → components}/page/Description.svelte +7 -15
  226. package/components/page/Description.svelte.d.ts +14 -0
  227. package/components/page/Edition.svelte +161 -0
  228. package/components/page/Edition.svelte.d.ts +20 -0
  229. package/components/page/EditionLoader.svelte +99 -0
  230. package/components/page/EditionLoader.svelte.d.ts +18 -0
  231. package/{src/lib/components → components}/page/Editions.svelte +18 -22
  232. package/components/page/Editions.svelte.d.ts +14 -0
  233. package/{src/lib/components → components}/page/Glossary.svelte +28 -33
  234. package/components/page/Glossary.svelte.d.ts +14 -0
  235. package/{src/lib/components → components}/page/Header.svelte +52 -59
  236. package/components/page/Header.svelte.d.ts +29 -0
  237. package/{src/lib/components → components}/page/Index.svelte +41 -48
  238. package/components/page/Index.svelte.d.ts +14 -0
  239. package/{src/lib/components → components}/page/Instructions.svelte +1 -2
  240. package/components/page/Instructions.svelte.d.ts +18 -0
  241. package/{src/lib/components → components}/page/License.svelte +9 -17
  242. package/components/page/License.svelte.d.ts +14 -0
  243. package/{src/lib/components → components}/page/Loading.svelte +0 -0
  244. package/components/page/Loading.svelte.d.ts +23 -0
  245. package/{src/lib/components → components}/page/Media.svelte +27 -44
  246. package/components/page/Media.svelte.d.ts +14 -0
  247. package/{src/lib/components → components}/page/MediaPreview.svelte +2 -3
  248. package/components/page/MediaPreview.svelte.d.ts +19 -0
  249. package/{src/lib/components → components}/page/Muted.svelte +0 -0
  250. package/components/page/Muted.svelte.d.ts +27 -0
  251. package/{src/lib/components → components}/page/Outline.svelte +110 -140
  252. package/components/page/Outline.svelte.d.ts +19 -0
  253. package/components/page/Page.svelte +84 -0
  254. package/components/page/Page.svelte.d.ts +19 -0
  255. package/{src/lib/components → components}/page/PageHeader.svelte +1 -2
  256. package/components/page/PageHeader.svelte.d.ts +18 -0
  257. package/{src/lib/components → components}/page/PageParagraph.svelte +0 -0
  258. package/components/page/PageParagraph.svelte.d.ts +27 -0
  259. package/components/page/PossibleChapter.svelte +14 -0
  260. package/components/page/PossibleChapter.svelte.d.ts +14 -0
  261. package/components/page/PossibleReference.svelte +11 -0
  262. package/components/page/PossibleReference.svelte.d.ts +18 -0
  263. package/{src/lib/components → components}/page/Print.svelte +3 -5
  264. package/components/page/Print.svelte.d.ts +14 -0
  265. package/{src/lib/components → components}/page/Publish.svelte +52 -59
  266. package/components/page/Publish.svelte.d.ts +14 -0
  267. package/{src/lib/components → components}/page/Reference.svelte +30 -39
  268. package/components/page/Reference.svelte.d.ts +17 -0
  269. package/{src/lib/components → components}/page/References.svelte +14 -18
  270. package/components/page/References.svelte.d.ts +14 -0
  271. package/{src/lib/components → components}/page/Rows.svelte +0 -0
  272. package/components/page/Rows.svelte.d.ts +27 -0
  273. package/components/page/Search.svelte +133 -0
  274. package/components/page/Search.svelte.d.ts +14 -0
  275. package/{src/lib/components → components}/page/Status.svelte +3 -5
  276. package/components/page/Status.svelte.d.ts +14 -0
  277. package/{src/lib/components → components}/page/SubdomainEditor.svelte +13 -16
  278. package/components/page/SubdomainEditor.svelte.d.ts +14 -0
  279. package/{src/lib/components → components}/page/TableOfContents.svelte +68 -79
  280. package/components/page/TableOfContents.svelte.d.ts +14 -0
  281. package/components/page/TableOfContentsImage.svelte +18 -0
  282. package/components/page/TableOfContentsImage.svelte.d.ts +16 -0
  283. package/{src/lib/components → components}/page/TableOfContentsRow.svelte +24 -34
  284. package/components/page/TableOfContentsRow.svelte.d.ts +24 -0
  285. package/{src/lib/components → components}/page/ThemeEditor.svelte +33 -44
  286. package/components/page/ThemeEditor.svelte.d.ts +14 -0
  287. package/{src/lib/components → components}/page/ThemeEditorPreview.svelte +12 -21
  288. package/components/page/ThemeEditorPreview.svelte.d.ts +17 -0
  289. package/components/page/ThemeSetEditor.svelte +19 -0
  290. package/components/page/ThemeSetEditor.svelte.d.ts +18 -0
  291. package/{src/lib/components → components}/page/ThemeVariableEditor.svelte +14 -18
  292. package/components/page/ThemeVariableEditor.svelte.d.ts +18 -0
  293. package/{src/lib/components → components}/page/Title.svelte +0 -0
  294. package/components/page/Title.svelte.d.ts +27 -0
  295. package/{src/lib/components → components}/page/Unknown.svelte +8 -10
  296. package/components/page/Unknown.svelte.d.ts +16 -0
  297. package/components/page/margins.d.ts +2 -0
  298. package/{src/lib/components/page/margins.ts → components/page/margins.js} +46 -79
  299. package/index.d.ts +15 -0
  300. package/{src/lib/index.js → index.js} +0 -0
  301. package/models/CRUD.d.ts +27 -0
  302. package/models/CRUD.js +262 -0
  303. package/models/Firebase.d.ts +5 -0
  304. package/{src/lib/models/Firebase.ts → models/Firebase.js} +16 -26
  305. package/models/book/Book.d.ts +61 -0
  306. package/models/book/Book.js +135 -0
  307. package/models/book/BookMedia.d.ts +23 -0
  308. package/models/book/BookMedia.js +108 -0
  309. package/models/book/BookSaveStatus.d.ts +7 -0
  310. package/models/book/BookSaveStatus.js +8 -0
  311. package/models/book/Chapter.d.ts +81 -0
  312. package/models/book/Chapter.js +212 -0
  313. package/models/book/ChapterID.d.ts +10 -0
  314. package/{src/lib/models/book/ChapterID.ts → models/book/ChapterID.js} +0 -1
  315. package/models/book/Definition.d.ts +6 -0
  316. package/models/book/Definition.js +1 -0
  317. package/models/book/Edition.d.ts +139 -0
  318. package/models/book/Edition.js +620 -0
  319. package/models/book/Reference.d.ts +24 -0
  320. package/models/book/Reference.js +78 -0
  321. package/models/book/Schema.d.ts +174 -0
  322. package/{src/lib/models/book/Schema.ts → models/book/Schema.js} +0 -1
  323. package/models/book/Theme.d.ts +113 -0
  324. package/{src/lib/models/book/Theme.ts → models/book/Theme.js} +5 -109
  325. package/{src/lib/models/book/ThemeColors.ts → models/book/ThemeColors.d.ts} +0 -6
  326. package/models/book/ThemeColors.js +1 -0
  327. package/models/book/Words.d.ts +2 -0
  328. package/{src/lib/models/book/Words.ts → models/book/Words.js} +0 -1
  329. package/models/chapter/AtomNode.d.ts +18 -0
  330. package/{src/lib/models/chapter/AtomNode.ts → models/chapter/AtomNode.js} +10 -30
  331. package/models/chapter/BlockNode.d.ts +20 -0
  332. package/{src/lib/models/chapter/BlockNode.ts → models/chapter/BlockNode.js} +47 -80
  333. package/models/chapter/BlocksNode.d.ts +50 -0
  334. package/{src/lib/models/chapter/BlocksNode.ts → models/chapter/BlocksNode.js} +359 -571
  335. package/models/chapter/BlocksNode.test.d.ts +1 -0
  336. package/models/chapter/BlocksNode.test.js +568 -0
  337. package/{src/lib/models/chapter/Bookkeeping.ts → models/chapter/Bookkeeping.d.ts} +0 -0
  338. package/models/chapter/Bookkeeping.js +1 -0
  339. package/models/chapter/CalloutNode.d.ts +17 -0
  340. package/models/chapter/CalloutNode.js +58 -0
  341. package/models/chapter/Caret.d.ts +23 -0
  342. package/{src/lib/models/chapter/Caret.ts → models/chapter/Caret.js} +26 -50
  343. package/models/chapter/ChapterNode.d.ts +34 -0
  344. package/models/chapter/ChapterNode.js +117 -0
  345. package/models/chapter/CitationsNode.d.ts +16 -0
  346. package/{src/lib/models/chapter/CitationsNode.ts → models/chapter/CitationsNode.js} +10 -17
  347. package/models/chapter/CodeNode.d.ts +35 -0
  348. package/{src/lib/models/chapter/CodeNode.ts → models/chapter/CodeNode.js} +62 -125
  349. package/models/chapter/CommentNode.d.ts +18 -0
  350. package/models/chapter/CommentNode.js +48 -0
  351. package/models/chapter/DefinitionNode.d.ts +12 -0
  352. package/{src/lib/models/chapter/DefinitionNode.ts → models/chapter/DefinitionNode.js} +8 -14
  353. package/models/chapter/Edit.d.ts +7 -0
  354. package/models/chapter/Edit.js +1 -0
  355. package/models/chapter/EmbedNode.d.ts +45 -0
  356. package/models/chapter/EmbedNode.js +168 -0
  357. package/models/chapter/ErrorNode.d.ts +17 -0
  358. package/{src/lib/models/chapter/ErrorNode.ts → models/chapter/ErrorNode.js} +8 -15
  359. package/models/chapter/FootnoteNode.d.ts +18 -0
  360. package/models/chapter/FootnoteNode.js +47 -0
  361. package/models/chapter/FormatNode.d.ts +60 -0
  362. package/{src/lib/models/chapter/FormatNode.ts → models/chapter/FormatNode.js} +262 -443
  363. package/models/chapter/FormatNode.test.d.ts +1 -0
  364. package/models/chapter/FormatNode.test.js +96 -0
  365. package/models/chapter/InlineCodeNode.d.ts +12 -0
  366. package/{src/lib/models/chapter/InlineCodeNode.ts → models/chapter/InlineCodeNode.js} +9 -17
  367. package/models/chapter/LabelNode.d.ts +17 -0
  368. package/{src/lib/models/chapter/LabelNode.ts → models/chapter/LabelNode.js} +10 -26
  369. package/models/chapter/LinkNode.d.ts +12 -0
  370. package/{src/lib/models/chapter/LinkNode.ts → models/chapter/LinkNode.js} +7 -12
  371. package/models/chapter/ListNode.d.ts +51 -0
  372. package/{src/lib/models/chapter/ListNode.ts → models/chapter/ListNode.js} +200 -277
  373. package/models/chapter/ListNode.test.d.ts +1 -0
  374. package/{src/lib/models/chapter/ListNode.test.ts → models/chapter/ListNode.test.js} +20 -57
  375. package/models/chapter/MetadataNode.d.ts +17 -0
  376. package/models/chapter/MetadataNode.js +32 -0
  377. package/models/chapter/Node.d.ts +38 -0
  378. package/{src/lib/models/chapter/Node.ts → models/chapter/Node.js} +71 -155
  379. package/models/chapter/Node.test.d.ts +1 -0
  380. package/{src/lib/models → models}/chapter/Node.test.js +0 -0
  381. package/models/chapter/ParagraphNode.d.ts +33 -0
  382. package/{src/lib/models/chapter/ParagraphNode.ts → models/chapter/ParagraphNode.js} +58 -95
  383. package/models/chapter/ParagraphNode.test.d.ts +1 -0
  384. package/models/chapter/ParagraphNode.test.js +30 -0
  385. package/models/chapter/Parser.d.ts +75 -0
  386. package/{src/lib/models/chapter/Parser.ts → models/chapter/Parser.js} +184 -369
  387. package/models/chapter/Parser.test.d.ts +1 -0
  388. package/{src/lib/models/chapter/Parser.test.ts → models/chapter/Parser.test.js} +0 -7
  389. package/{src/lib/models/chapter/Position.ts → models/chapter/Position.d.ts} +0 -0
  390. package/models/chapter/Position.js +1 -0
  391. package/models/chapter/QuoteNode.d.ts +25 -0
  392. package/models/chapter/QuoteNode.js +99 -0
  393. package/{src/lib/models/chapter/RootNode.ts → models/chapter/RootNode.d.ts} +0 -2
  394. package/models/chapter/RootNode.js +1 -0
  395. package/models/chapter/RuleNode.d.ts +15 -0
  396. package/{src/lib/models/chapter/RuleNode.ts → models/chapter/RuleNode.js} +6 -9
  397. package/models/chapter/TableNode.d.ts +37 -0
  398. package/{src/lib/models/chapter/TableNode.ts → models/chapter/TableNode.js} +82 -141
  399. package/models/chapter/TableNode.test.d.ts +1 -0
  400. package/{src/lib/models/chapter/TableNode.test.ts → models/chapter/TableNode.test.js} +10 -27
  401. package/models/chapter/TextNode.d.ts +36 -0
  402. package/{src/lib/models/chapter/TextNode.ts → models/chapter/TextNode.js} +65 -117
  403. package/models/chapter/TextNode.test.d.ts +1 -0
  404. package/{src/lib/models/chapter/TextNode.test.ts → models/chapter/TextNode.test.js} +0 -2
  405. package/package.json +270 -53
  406. package/util/getSubdomain.d.ts +3 -0
  407. package/{src/lib/util/getSubdomain.ts → util/getSubdomain.js} +8 -14
  408. package/util/isMobile.d.ts +2 -0
  409. package/{src/lib/util/isMobile.ts → util/isMobile.js} +0 -1
  410. package/util/mineReference.d.ts +4 -0
  411. package/{src/lib/util/mineReference.ts → util/mineReference.js} +25 -45
  412. package/util/scrollToEyeLevel.d.ts +2 -0
  413. package/{src/lib/util/scrollToEyeLevel.ts → util/scrollToEyeLevel.js} +2 -4
  414. package/.env.example +0 -8
  415. package/.firebaserc +0 -8
  416. package/.prettierignore +0 -8
  417. package/.prettierrc.json +0 -5
  418. package/_update-notifier-last-checked +0 -0
  419. package/firebase.json +0 -46
  420. package/firestore.indexes.json +0 -4
  421. package/firestore.rules +0 -59
  422. package/functions/.eslintrc.js +0 -28
  423. package/functions/package-lock.json +0 -12595
  424. package/functions/package.json +0 -43
  425. package/functions/src/index.ts +0 -345
  426. package/functions/tsconfig.dev.json +0 -3
  427. package/functions/tsconfig.json +0 -15
  428. package/scripts/claims.cjs +0 -99
  429. package/src/app.d.ts +0 -9
  430. package/src/app.html +0 -24
  431. package/src/lib/components/Auth.svelte +0 -65
  432. package/src/lib/components/Link.svelte +0 -58
  433. package/src/lib/components/chapter/Block.svelte +0 -42
  434. package/src/lib/components/chapter/ErrorMessage.svelte +0 -12
  435. package/src/lib/components/chapter/Python.svelte +0 -144
  436. package/src/lib/components/chapter/Text.svelte +0 -109
  437. package/src/lib/components/editor/BookishEditor.svelte +0 -1101
  438. package/src/lib/components/editor/CalloutEditor.svelte +0 -14
  439. package/src/lib/components/editor/CaretContext.ts +0 -55
  440. package/src/lib/components/editor/CitationsEditor.svelte +0 -64
  441. package/src/lib/components/editor/ConfirmButton.svelte +0 -51
  442. package/src/lib/components/editor/DefinitionEditor.svelte +0 -44
  443. package/src/lib/components/editor/EmbedEditor.svelte +0 -152
  444. package/src/lib/components/editor/InlineCodeEditor.svelte +0 -16
  445. package/src/lib/components/editor/LinkEditor.svelte +0 -110
  446. package/src/lib/components/editor/PositionEditor.svelte +0 -21
  447. package/src/lib/components/editor/QuoteEditor.svelte +0 -14
  448. package/src/lib/components/editor/TableEditor.svelte +0 -14
  449. package/src/lib/components/editor/Toggle.svelte +0 -47
  450. package/src/lib/components/editor/Toolbar.svelte +0 -297
  451. package/src/lib/components/editor/URLEditor.svelte +0 -15
  452. package/src/lib/components/page/Authors.svelte +0 -92
  453. package/src/lib/components/page/BookLoader.svelte +0 -77
  454. package/src/lib/components/page/BulkReferenceEditor.svelte +0 -86
  455. package/src/lib/components/page/Chapter.svelte +0 -449
  456. package/src/lib/components/page/ChapterContext.ts +0 -13
  457. package/src/lib/components/page/Contexts.ts +0 -176
  458. package/src/lib/components/page/Edition.svelte +0 -189
  459. package/src/lib/components/page/EditionLoader.svelte +0 -123
  460. package/src/lib/components/page/Page.svelte +0 -94
  461. package/src/lib/components/page/PossibleChapter.svelte +0 -16
  462. package/src/lib/components/page/PossibleReference.svelte +0 -14
  463. package/src/lib/components/page/Search.svelte +0 -153
  464. package/src/lib/components/page/TableOfContentsImage.svelte +0 -22
  465. package/src/lib/components/page/ThemeSetEditor.svelte +0 -21
  466. package/src/lib/models/CRUD.ts +0 -469
  467. package/src/lib/models/book/Book.ts +0 -283
  468. package/src/lib/models/book/BookMedia.ts +0 -182
  469. package/src/lib/models/book/BookSaveStatus.ts +0 -8
  470. package/src/lib/models/book/Chapter.ts +0 -462
  471. package/src/lib/models/book/Definition.ts +0 -2
  472. package/src/lib/models/book/Edition.ts +0 -1216
  473. package/src/lib/models/book/Reference.ts +0 -171
  474. package/src/lib/models/chapter/BlocksNode.test.ts +0 -867
  475. package/src/lib/models/chapter/CalloutNode.ts +0 -79
  476. package/src/lib/models/chapter/ChapterNode.ts +0 -169
  477. package/src/lib/models/chapter/CommentNode.ts +0 -61
  478. package/src/lib/models/chapter/Edit.ts +0 -6
  479. package/src/lib/models/chapter/EmbedNode.ts +0 -257
  480. package/src/lib/models/chapter/FootnoteNode.ts +0 -59
  481. package/src/lib/models/chapter/FormatNode.test.ts +0 -137
  482. package/src/lib/models/chapter/MetadataNode.ts +0 -44
  483. package/src/lib/models/chapter/ParagraphNode.test.ts +0 -54
  484. package/src/lib/models/chapter/QuoteNode.ts +0 -135
  485. package/src/params/edition.ts +0 -3
  486. package/src/routes/+error.svelte +0 -12
  487. package/src/routes/+layout.svelte +0 -241
  488. package/src/routes/+page.svelte +0 -43
  489. package/src/routes/Footer.svelte +0 -0
  490. package/src/routes/Header.svelte +0 -112
  491. package/src/routes/[bookid]/+layout.svelte +0 -5
  492. package/src/routes/[bookid]/[[editionid=edition]]/+error.svelte +0 -14
  493. package/src/routes/[bookid]/[[editionid=edition]]/+layout.svelte +0 -7
  494. package/src/routes/[bookid]/[[editionid=edition]]/+page.svelte +0 -5
  495. package/src/routes/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +0 -5
  496. package/src/routes/[bookid]/[[editionid=edition]]/glossary/+page.svelte +0 -5
  497. package/src/routes/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +0 -5
  498. package/src/routes/[bookid]/[[editionid=edition]]/media/+page.svelte +0 -5
  499. package/src/routes/[bookid]/[[editionid=edition]]/print/+page.svelte +0 -5
  500. package/src/routes/[bookid]/[[editionid=edition]]/references/+page.svelte +0 -5
  501. package/src/routes/[bookid]/[[editionid=edition]]/search/+page.svelte +0 -5
  502. package/src/routes/[bookid]/editions/+page.svelte +0 -20
  503. package/src/routes/about/+page.svelte +0 -102
  504. package/src/routes/confirm/+page.svelte +0 -62
  505. package/src/routes/email/+page.svelte +0 -99
  506. package/src/routes/login/+page.svelte +0 -66
  507. package/src/routes/read/+page.svelte +0 -38
  508. package/src/routes/write/+error.svelte +0 -10
  509. package/src/routes/write/+layout.svelte +0 -11
  510. package/src/routes/write/+page.svelte +0 -114
  511. package/src/routes/write/[bookid]/+layout.svelte +0 -5
  512. package/src/routes/write/[bookid]/[[editionid=edition]]/+layout.svelte +0 -7
  513. package/src/routes/write/[bookid]/[[editionid=edition]]/+page.svelte +0 -5
  514. package/src/routes/write/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +0 -5
  515. package/src/routes/write/[bookid]/[[editionid=edition]]/glossary/+page.svelte +0 -5
  516. package/src/routes/write/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +0 -5
  517. package/src/routes/write/[bookid]/[[editionid=edition]]/media/+page.svelte +0 -5
  518. package/src/routes/write/[bookid]/[[editionid=edition]]/print/+page.svelte +0 -5
  519. package/src/routes/write/[bookid]/[[editionid=edition]]/references/+page.svelte +0 -5
  520. package/src/routes/write/[bookid]/[[editionid=edition]]/search/+page.svelte +0 -5
  521. package/src/routes/write/[bookid]/[[editionid=edition]]/theme/+page.svelte +0 -5
  522. package/src/routes/write/[bookid]/[[editionid=edition]]/unknown/+page.svelte +0 -5
  523. package/src/routes/write/[bookid]/editions/+page.svelte +0 -20
  524. package/src/vite-env.d.ts +0 -1
  525. package/static/icons/favicon.png +0 -0
  526. package/static/icons/icon.png +0 -0
  527. package/static/icons/ios-icon.png +0 -0
  528. package/storage.rules +0 -9
  529. package/svelte.config.js +0 -19
  530. package/tsconfig.json +0 -18
  531. package/tsconfig.node.json +0 -9
  532. package/vite.config.ts +0 -8
  533. package/vite.reader.config.ts +0 -32
@@ -2,56 +2,46 @@
2
2
  // This operates on the DOM directly, as scroll position isn't easily managed in React.
3
3
  export function hideOutlineIfObscured() {
4
4
  // Get the outline's bounds.
5
- let outline = document.getElementsByClassName('outline')[0] as HTMLElement;
6
-
5
+ let outline = document.getElementsByClassName('outline')[0];
7
6
  // If there's no outline, don't bother.
8
- if (!outline) return;
9
-
7
+ if (!outline)
8
+ return;
10
9
  // Set a threshold for hiding
11
10
  let threshold = 100;
12
-
13
11
  // If the outline isn't affixed to the footer
14
12
  if (window.getComputedStyle(outline).getPropertyValue('left') !== '0px') {
15
13
  let outlineRect = outline.getBoundingClientRect();
16
- let overlapRect: DOMRect | undefined = undefined;
17
-
14
+ let overlapRect = undefined;
18
15
  // Find the bottom-most left inset marginal within threshold of the outline.
19
- Array.from(document.getElementsByClassName('inset-left')).forEach(
20
- (el) => {
21
- let insetRect: DOMRect = el.getBoundingClientRect();
22
- if (
23
- !(
24
- outlineRect.bottom < insetRect.top - threshold ||
25
- outlineRect.top > insetRect.bottom + threshold
26
- )
27
- )
28
- overlapRect = insetRect;
29
- }
30
- );
31
-
16
+ Array.from(document.getElementsByClassName('inset-left')).forEach((el) => {
17
+ let insetRect = el.getBoundingClientRect();
18
+ if (!(outlineRect.bottom < insetRect.top - threshold ||
19
+ outlineRect.top > insetRect.bottom + threshold))
20
+ overlapRect = insetRect;
21
+ });
32
22
  // If it overlaps, reduce opacity by the proportion of the vertical distance between two rectangles and the height of the marginal.
33
23
  if (overlapRect) {
34
- let overlap: DOMRect = overlapRect;
35
- let distance =
36
- outlineRect.bottom < overlap.top
37
- ? threshold
38
- : outlineRect.bottom < overlap.top + threshold
24
+ let overlap = overlapRect;
25
+ let distance = outlineRect.bottom < overlap.top
26
+ ? threshold
27
+ : outlineRect.bottom < overlap.top + threshold
39
28
  ? threshold - (outlineRect.bottom - overlap.top)
40
29
  : outlineRect.top > overlap.bottom - threshold
41
- ? threshold - (overlap.bottom - outlineRect.top)
42
- : outlineRect.top > overlap.bottom
43
- ? threshold
44
- : 0;
30
+ ? threshold - (overlap.bottom - outlineRect.top)
31
+ : outlineRect.top > overlap.bottom
32
+ ? threshold
33
+ : 0;
45
34
  let proportion = distance / threshold;
46
35
  outline.style.opacity = '' + proportion * proportion;
47
36
  }
48
37
  // Otherwise, remove the dimming.
49
- else outline.style.removeProperty('opacity');
38
+ else
39
+ outline.style.removeProperty('opacity');
50
40
  }
51
41
  // If it is, it's always visible.
52
- else outline.style.removeProperty('opacity');
42
+ else
43
+ outline.style.removeProperty('opacity');
53
44
  }
54
-
55
45
  // After each render of the chapter, we need to adjust the layout of marginals, which by default are floating from
56
46
  // their little spans within the body of the text.
57
47
  //
@@ -64,60 +54,45 @@ export function hideOutlineIfObscured() {
64
54
  // fixed in a fixed position.
65
55
  export function layoutMarginals() {
66
56
  // Get the chapter DOM node, so we can calculate margins.
67
- let chapter = document.getElementsByClassName(
68
- 'bookish-chapter-body'
69
- )[0] as HTMLElement;
70
-
57
+ let chapter = document.getElementsByClassName('bookish-chapter-body')[0];
71
58
  // If there's no chapter rendered yet, stop.
72
- if (chapter === undefined) return;
73
-
74
- let book = document.getElementsByClassName('bookish')[0] as HTMLElement;
75
-
59
+ if (chapter === undefined)
60
+ return;
61
+ let book = document.getElementsByClassName('bookish')[0];
76
62
  // This is the grid line we'll aline all marginals too horizontally.
77
63
  let margin = chapter.getBoundingClientRect().width;
78
-
79
64
  // This will track the current leading bottom edge for laying out marginals.
80
- let currentBottom: number | null = null;
81
-
65
+ let currentBottom = null;
82
66
  // Are there any marginal right inset images that might overlap?
83
67
  let rightInsets = document.getElementsByClassName('inset-right');
84
-
85
68
  const marginals = document.getElementsByClassName('bookish-marginal');
86
-
87
69
  // Layout all of the marginals vertically to prevent overlaps.
88
- Array.from(marginals).forEach((element: Element) => {
89
- const el = element as HTMLElement;
90
-
91
- if (el === null) return;
92
-
93
- if (
94
- window.getComputedStyle(el).getPropertyValue('position') !== 'fixed'
95
- ) {
70
+ Array.from(marginals).forEach((element) => {
71
+ const el = element;
72
+ if (el === null)
73
+ return;
74
+ if (window.getComputedStyle(el).getPropertyValue('position') !== 'fixed') {
96
75
  if (el.parentElement) {
97
- let containingMarginal =
98
- el.parentElement.closest('.bookish-marginal');
99
-
76
+ let containingMarginal = el.parentElement.closest('.bookish-marginal');
100
77
  // Get the bounds of this marginal so we know it's size.
101
78
  let elementBounds = el.getBoundingClientRect();
102
-
103
79
  // Get the bounds of this marginal's parent so we know it's vertical position.
104
80
  let parentBounds = el.parentElement.getBoundingClientRect();
105
- let parentTop =
106
- parentBounds.top +
81
+ let parentTop = parentBounds.top +
107
82
  window.scrollY -
108
83
  (book.getBoundingClientRect().top + window.scrollY);
109
-
110
84
  // If it's inside a marginal, position it below the marginal.
111
85
  if (containingMarginal !== null && currentBottom) {
112
86
  el.style.left = '0';
113
87
  el.style.top =
114
88
  '' +
115
- (currentBottom -
116
- (containingMarginal.getBoundingClientRect().top +
117
- window.scrollY)) +
118
- 'px';
89
+ (currentBottom -
90
+ (containingMarginal.getBoundingClientRect().top +
91
+ window.scrollY)) +
92
+ 'px';
119
93
  currentBottom = currentBottom + elementBounds.height;
120
- } else {
94
+ }
95
+ else {
121
96
  // If we don't have a bottom yet, or the current above is above the parent's top,
122
97
  // then set the current bottom to the bottom of the parent.
123
98
  if (currentBottom === null || currentBottom < parentTop) {
@@ -129,7 +104,6 @@ export function layoutMarginals() {
129
104
  el.style.top = currentBottom + 'px';
130
105
  currentBottom = currentBottom + elementBounds.height;
131
106
  }
132
-
133
107
  // If there are any right insets, do any intersect with this marginal?
134
108
  // If so, move the marginal below them.
135
109
  if (rightInsets.length > 0) {
@@ -138,24 +112,18 @@ export function layoutMarginals() {
138
112
  let insetBounds = inset.getBoundingClientRect();
139
113
  let insetTop = insetBounds.top + window.scrollY;
140
114
  let insetBottom = insetTop + insetBounds.height;
141
- let elementTop =
142
- el.getBoundingClientRect().top + window.scrollY;
143
- let elementBottom =
144
- elementTop + elementBounds.height;
145
-
115
+ let elementTop = el.getBoundingClientRect().top + window.scrollY;
116
+ let elementBottom = elementTop + elementBounds.height;
146
117
  // If they overlap...
147
118
  if (currentBottom !== null) {
148
- if (
149
- (elementTop <= insetTop &&
150
- elementBottom >= insetTop) ||
119
+ if ((elementTop <= insetTop &&
120
+ elementBottom >= insetTop) ||
151
121
  (elementTop <= insetBottom &&
152
122
  elementBottom >= insetBottom) ||
153
123
  (elementTop >= insetTop &&
154
- elementBottom <= insetBottom)
155
- ) {
124
+ elementBottom <= insetBottom)) {
156
125
  // Calculate the new position based on the preferred position, minus the element's height (which was added above), plus the overlap between the inset and the marginal.
157
- let newTop =
158
- currentBottom -
126
+ let newTop = currentBottom -
159
127
  elementBounds.height +
160
128
  (insetBottom - elementTop);
161
129
  // Reposition the marginal.
@@ -167,7 +135,6 @@ export function layoutMarginals() {
167
135
  }
168
136
  });
169
137
  }
170
-
171
138
  // Reposition the marginal horizontally.
172
139
  el.style.left = 'calc(2rem + ' + margin + 'px)';
173
140
  }
package/index.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ export { default as TableOfContents } from "./components/page/TableOfContents.svelte";
2
+ export { default as Search } from "./components/page/Search.svelte";
3
+ export { default as Index } from "./components/page/Index.svelte";
4
+ export { default as References } from "./components/page/References.svelte";
5
+ export { default as PossibleChapter } from "./components/page/PossibleChapter.svelte";
6
+ export { default as Media } from "./components/page/Media.svelte";
7
+ export { default as Print } from "./components/page/Print.svelte";
8
+ export { default as Unknown } from "./components/page/Unknown.svelte";
9
+ export { default as Glossary } from "./components/page/Glossary.svelte";
10
+ export { default as Edition } from "./components/page/Edition.svelte";
11
+ export { default as Feedback } from "./components/app/Feedback.svelte";
12
+ export { default as Loading } from "./components/page/Loading.svelte";
13
+ export { default as EditionModel } from "./models/book/Edition";
14
+ export { EDITION } from "./components/page/Contexts";
15
+ export { default as Schema } from "./models/book/Schema";
File without changes
@@ -0,0 +1,27 @@
1
+ import { DocumentReference } from 'firebase/firestore';
2
+ import Edition from './book/Edition';
3
+ import Book from './book/Book';
4
+ import type { Unsubscribe } from 'firebase/auth';
5
+ export declare function listenToPublishedBooks(react: (books: Book[]) => void): Unsubscribe;
6
+ export declare function listenToEditableBooks(userID: string, react: (books: Book[]) => void): Unsubscribe;
7
+ export declare function listenToPartiallyEditableBooks(userID: string, react: (books: Book[]) => void): Unsubscribe;
8
+ export declare function listenToBooksByName(name: string, react: (book: Book[]) => void): Unsubscribe;
9
+ export declare function listenToBookWithID(id: string, react: (book: Book | null) => void): Unsubscribe;
10
+ export declare function listenToEdition(bookID: string, editionID: string, react: (edition: Edition | null) => void): Unsubscribe;
11
+ export declare function listenToChapters(bookID: string, editionID: string, react: (chapters: [DocumentReference, string][]) => void): Unsubscribe;
12
+ /** Hit the authentication database to get user emails. */
13
+ export declare function getUserEmails(uids: string[]): Promise<Map<string, string> | null>;
14
+ export declare function createUser(email: string): Promise<string | null>;
15
+ export declare function createBook(userID: string): Promise<string>;
16
+ export declare function createNewEdition(book: Book): Promise<Book>;
17
+ export declare function updateLock(edition: Edition, uid: string, content: string, lock: boolean): Promise<boolean>;
18
+ /**
19
+ * Persists the edition in the database, creating and deleting chapters as necessary.
20
+ * returns a map of DocumentReferences for new chapters so they can be persisted client side.
21
+ */
22
+ export declare function updateEdition(previousEdition: Edition | undefined, newEdition: Edition): Promise<Map<string, DocumentReference>>;
23
+ export declare function updateBook(book: Book): Promise<void>;
24
+ export declare function isSubdomainAvailable(subdomain: string, book: Book): Promise<boolean>;
25
+ export declare function publish(edition: Edition): Promise<string | {
26
+ url: string;
27
+ }>;
package/models/CRUD.js ADDED
@@ -0,0 +1,262 @@
1
+ import { db, functions } from './Firebase';
2
+ import { collection, getDocs, getDoc, setDoc, doc, addDoc, query, where, deleteDoc, DocumentReference, onSnapshot, QueryFieldFilterConstraint, } from 'firebase/firestore';
3
+ import { httpsCallable } from 'firebase/functions';
4
+ import Edition from './book/Edition';
5
+ import Book, {} from './book/Book';
6
+ function editionPath(bookID, editionID) {
7
+ return `books/${bookID}/editions/${editionID}`;
8
+ }
9
+ const NO_DATABASE_CONNECTION = 'Not connected to database';
10
+ ///////////////
11
+ //// READ BOOKS
12
+ ///////////////
13
+ function listenToBooks(constraint, react) {
14
+ if (!db)
15
+ throw NO_DATABASE_CONNECTION;
16
+ try {
17
+ return onSnapshot(query(collection(db, 'books'), constraint), (snapshot) => react(snapshot.empty
18
+ ? []
19
+ : snapshot.docs.map((doc) => Book.fromJSON(doc.ref, doc.data()))));
20
+ }
21
+ catch (err) {
22
+ throw 'Issue querying database';
23
+ }
24
+ }
25
+ export function listenToPublishedBooks(react) {
26
+ return listenToBooks(where('published', '==', true), react);
27
+ }
28
+ export function listenToEditableBooks(userID, react) {
29
+ return listenToBooks(where('uids', 'array-contains', userID), react);
30
+ }
31
+ export function listenToPartiallyEditableBooks(userID, react) {
32
+ return listenToBooks(where('readuids', 'array-contains', userID), react);
33
+ }
34
+ export function listenToBooksByName(name, react) {
35
+ return listenToBooks(where('domain', '==', name), react);
36
+ }
37
+ export function listenToBookWithID(id, react) {
38
+ if (!db)
39
+ throw NO_DATABASE_CONNECTION;
40
+ const ref = doc(db, 'books', id);
41
+ return onSnapshot(doc(db, 'books', id), (doc) => {
42
+ if (!doc.metadata.hasPendingWrites)
43
+ react(doc.exists()
44
+ ? Book.fromJSON(ref, doc.data())
45
+ : null);
46
+ });
47
+ }
48
+ export function listenToEdition(bookID, editionID, react) {
49
+ if (!db)
50
+ throw NO_DATABASE_CONNECTION;
51
+ return onSnapshot(doc(db, 'books', bookID, 'editions', editionID), (doc) => {
52
+ if (!doc.metadata.hasPendingWrites)
53
+ react(doc.exists()
54
+ ? Edition.fromJSON(doc.ref, doc.data())
55
+ : null);
56
+ });
57
+ }
58
+ export function listenToChapters(bookID, editionID, react) {
59
+ if (!db)
60
+ throw NO_DATABASE_CONNECTION;
61
+ return onSnapshot(collection(db, 'books', bookID, 'editions', editionID, 'chapters'), (docs) => {
62
+ const chapters = [];
63
+ docs.forEach((doc) => {
64
+ chapters.push([doc.ref, doc.data().text]);
65
+ });
66
+ react(chapters);
67
+ });
68
+ }
69
+ /////////////////
70
+ //// MANAGE USERS
71
+ /////////////////
72
+ /** Hit the authentication database to get user emails. */
73
+ export async function getUserEmails(uids) {
74
+ if (!functions)
75
+ throw Error("Can't publish, no connection to Firebase functions.");
76
+ const getUserEmails = httpsCallable(functions, 'getUserEmails');
77
+ const result = await getUserEmails({
78
+ uids,
79
+ });
80
+ return new Map(Object.entries(result.data));
81
+ }
82
+ export async function createUser(email) {
83
+ if (!functions)
84
+ throw Error("Can't publish, no connection to Firebase functions.");
85
+ const createUserWithEmail = httpsCallable(functions, 'createUserWithEmail');
86
+ const result = await createUserWithEmail({
87
+ email,
88
+ });
89
+ return result.data;
90
+ }
91
+ export async function createBook(userID) {
92
+ if (!db)
93
+ throw Error("Can't create book, not connected to Firebase.");
94
+ // Create a new book
95
+ const newBookData = {
96
+ title: 'Untitled',
97
+ authors: [],
98
+ description: '',
99
+ cover: null,
100
+ published: false,
101
+ domain: null,
102
+ editions: [],
103
+ uids: [userID],
104
+ readuids: [],
105
+ };
106
+ // Create the book
107
+ const bookRef = await addDoc(collection(db, 'books'), newBookData);
108
+ // Create a model to store it.
109
+ let book = Book.fromJSON(bookRef, newBookData);
110
+ // Make a new default edition with a single chapter with this user id.
111
+ let newEdition = new Edition(bookRef, undefined, [], 'Untitled', [], 1, '', null, {}, '', [], 'All rights reserved.', '', [], {}, {}, {}, {}, null, null, {}).withNewChapter();
112
+ // Add the edition to the editions collection in the database so we can get an edition ref.
113
+ const editionRef = await addDoc(collection(db, 'books', bookRef.id, 'editions'), newEdition.toObject());
114
+ // Remember the ref.
115
+ newEdition = newEdition.withRef(editionRef);
116
+ // Now replicate the edition info in the book. We dodge type checking here because we know with certainty
117
+ // that the ref was just added the line before.
118
+ const info = newEdition.getInfo();
119
+ if (info)
120
+ book = book.withEditions([info]);
121
+ // Update the book with the edition info.
122
+ await updateBook(book);
123
+ // Update all of the changes to the edition in Firestore, persisting the refs and chapter text.
124
+ await updateEdition(undefined, newEdition);
125
+ // Return the book id
126
+ return bookRef.id;
127
+ }
128
+ export async function createNewEdition(book) {
129
+ if (!db)
130
+ throw Error("Can't publish draft, no Firebase connection.");
131
+ // Get the latest draft.
132
+ const latestEditionID = book.getLatestEditionID();
133
+ if (latestEditionID === undefined)
134
+ throw 'No editions on this book';
135
+ const latestDraftDoc = await getDoc(doc(db, 'books', book.ref.id, 'editions', latestEditionID));
136
+ const latestDraft = latestDraftDoc.exists()
137
+ ? latestDraftDoc.data()
138
+ : undefined;
139
+ if (latestDraft === undefined)
140
+ return book;
141
+ // Make a copy without chapter and edition refs, because we want to create new ones,
142
+ // and with an incremented edition number.
143
+ const newEdition = latestDraft.withoutRefs();
144
+ // Create a copy of the existing draft as a new edition.
145
+ const newEditionRef = await addDoc(collection(db, 'editions'), newEdition.toObject());
146
+ // Create the edition, creating chapter text as necessary, using the edition sync function.
147
+ updateEdition(undefined, newEdition.withRef(newEditionRef));
148
+ // Put the new edition in the book.
149
+ book = book.withEditions([
150
+ newEdition.getInfo(),
151
+ ...book.getEditions(),
152
+ ]);
153
+ // Update the book.
154
+ updateBook(book);
155
+ return book;
156
+ }
157
+ export async function updateLock(edition, uid, content, lock) {
158
+ if (!db)
159
+ throw NO_DATABASE_CONNECTION;
160
+ if (edition.editionRef === undefined)
161
+ return false;
162
+ if (lock && edition.hasLease(uid, content))
163
+ return true;
164
+ if (!lock && !edition.hasLease(uid, content))
165
+ return true;
166
+ await setDoc(doc(db, editionPath(edition.bookRef.id, edition.editionRef.id)), edition.withLock(uid, content, lock).toObject());
167
+ return lock;
168
+ }
169
+ /**
170
+ * Persists the edition in the database, creating and deleting chapters as necessary.
171
+ * returns a map of DocumentReferences for new chapters so they can be persisted client side.
172
+ */
173
+ export async function updateEdition(previousEdition, newEdition) {
174
+ if (!db)
175
+ throw Error("Can't update edition, not connected to Firebase.");
176
+ // Get the reference to the edition, fail if we don't have one.
177
+ const editionRef = newEdition.getEditionRef();
178
+ if (!editionRef)
179
+ throw Error('Book given has no ID');
180
+ const newChapterRefs = new Map();
181
+ // Create any new chapters that aren't in the current edition, and update text if it changed.
182
+ for (const newChapter of newEdition.chapters) {
183
+ if (newChapter.ref === undefined) {
184
+ // Make the new chapter's text.
185
+ const newChapterRef = await addDoc(collection(db, editionPath(newEdition.bookRef.id, editionRef.id), 'chapters'), { text: newChapter.text });
186
+ // Add the ref of the new chapter to the revised chapter.
187
+ newEdition = newEdition.withRevisedChapter(newChapter, newChapter.withRef(newChapterRef));
188
+ // Map the chapter ref to it's id.
189
+ newChapterRefs.set(newChapter.id, newChapterRef);
190
+ }
191
+ // If we have a previous version, did the text change? If so, update it.
192
+ else {
193
+ const previousChapter = previousEdition === undefined
194
+ ? undefined
195
+ : previousEdition.getChapterByRef(newChapter.ref);
196
+ if (previousChapter === undefined ||
197
+ newChapter.text !== previousChapter.text) {
198
+ await setDoc(doc(db, editionPath(newEdition.bookRef.id, editionRef.id), 'chapters', newChapter.ref.id), { text: newChapter.text });
199
+ }
200
+ }
201
+ }
202
+ // Remove any chapters from Firebase that are removed.
203
+ if (previousEdition) {
204
+ for (const previousChapter of previousEdition.chapters) {
205
+ if (previousChapter.ref &&
206
+ newEdition.getChapterByRef(previousChapter.ref) === undefined) {
207
+ await deleteDoc(previousChapter.ref);
208
+ }
209
+ }
210
+ }
211
+ // If the edition's summary info changed, update it.
212
+ if (previousEdition !== undefined) {
213
+ const previousInfo = previousEdition.getInfo();
214
+ const newInfo = newEdition.getInfo();
215
+ if (previousInfo && newInfo) {
216
+ const previousKeys = Object.keys(previousInfo);
217
+ const newKeys = Object.keys(newInfo);
218
+ if (previousKeys.length !== newKeys.length ||
219
+ !previousKeys.every((key) => previousInfo[key] === newInfo[key])) {
220
+ const bookDoc = await getDoc(doc(db, 'books', newEdition.bookRef.id));
221
+ if (!bookDoc.exists())
222
+ throw Error('Book does not exist');
223
+ const book = Book.fromJSON(newEdition.bookRef, bookDoc.data());
224
+ updateBook(book.withRevisedEdition(previousEdition, newEdition));
225
+ }
226
+ }
227
+ }
228
+ // Finally, update the edition's document.
229
+ await setDoc(doc(db, editionPath(newEdition.bookRef.id, editionRef.id)), newEdition.toObject());
230
+ return newChapterRefs;
231
+ }
232
+ export async function updateBook(book) {
233
+ if (!db)
234
+ throw Error("Can't update book, not connected to Firebase.");
235
+ await setDoc(doc(db, 'books', book.getRefID()), book.toJSON());
236
+ }
237
+ export async function isSubdomainAvailable(subdomain, book) {
238
+ if (!db)
239
+ throw Error('Not connected to Firebase.');
240
+ const matches = await getDocs(query(collection(db, 'books'), where('domain', '==', subdomain)));
241
+ return matches.empty || matches.docs[0].id === book.getRefID();
242
+ }
243
+ export async function publish(edition) {
244
+ if (!db)
245
+ throw Error('Cannot publish, no database connection');
246
+ if (!functions)
247
+ throw Error('Cannot publish, no cloud connection');
248
+ const editionRef = edition.getEditionRef();
249
+ const bookRef = edition.getBookRef();
250
+ if (editionRef === undefined)
251
+ return `Cannot publish, no edition ID`;
252
+ // Get a reference to the publishing function
253
+ const publishEdition = httpsCallable(functions, 'publishEdition');
254
+ // Call the function, passing
255
+ const result = await publishEdition({
256
+ bookID: bookRef.id,
257
+ editionID: editionRef.id,
258
+ });
259
+ return result.data;
260
+ // Update the edition's published status in the book.
261
+ // await updateBook(book.withEditionAsPublished(true, index));
262
+ }
@@ -0,0 +1,5 @@
1
+ export declare const app: import("@firebase/app").FirebaseApp | undefined;
2
+ export declare const auth: import("@firebase/auth").Auth | undefined;
3
+ export declare const db: import("@firebase/firestore").Firestore | undefined;
4
+ export declare const storage: import("@firebase/storage").FirebaseStorage | undefined;
5
+ export declare const functions: import("@firebase/functions").Functions | undefined;
@@ -3,44 +3,34 @@ import { connectAuthEmulator, getAuth } from 'firebase/auth';
3
3
  import { connectFirestoreEmulator, getFirestore } from 'firebase/firestore';
4
4
  import { connectFunctionsEmulator, getFunctions } from 'firebase/functions';
5
5
  import { connectStorageEmulator, getStorage } from 'firebase/storage';
6
- import {
7
- PUBLIC_READER,
8
- PUBLIC_CONTEXT,
9
- PUBLIC_FIREBASE_API_KEY,
10
- PUBLIC_FIREBASE_AUTH_DOMAIN,
11
- PUBLIC_FIREBASE_PROJECT_ID,
12
- PUBLIC_FIREBASE_STORAGE_BUCKET,
13
- PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
14
- PUBLIC_FIREBASE_APP_ID,
15
- } from '$env/static/public';
16
-
6
+ import { PUBLIC_READER, PUBLIC_CONTEXT, PUBLIC_FIREBASE_API_KEY, PUBLIC_FIREBASE_AUTH_DOMAIN, PUBLIC_FIREBASE_PROJECT_ID, PUBLIC_FIREBASE_STORAGE_BUCKET, PUBLIC_FIREBASE_MESSAGING_SENDER_ID, PUBLIC_FIREBASE_APP_ID, } from '$env/static/public';
17
7
  const isReader = PUBLIC_READER === 'true';
18
-
19
8
  // Some feedback about context
20
9
  if (!isReader && PUBLIC_CONTEXT !== 'prod')
21
10
  console.log(`*** ${PUBLIC_CONTEXT.toLocaleUpperCase()} ***`);
22
-
23
11
  // Initialize Firebase using the environment variables provided at build time.
24
12
  // Only do this if we have environment variables defined. (We won't in the standalone Reader).
25
13
  export const app = isReader
26
14
  ? undefined
27
15
  : initializeApp({
28
- apiKey: PUBLIC_FIREBASE_API_KEY,
29
- authDomain: PUBLIC_FIREBASE_AUTH_DOMAIN,
30
- projectId: PUBLIC_FIREBASE_PROJECT_ID,
31
- storageBucket: PUBLIC_FIREBASE_STORAGE_BUCKET,
32
- messagingSenderId: PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
33
- appId: PUBLIC_FIREBASE_APP_ID,
34
- });
35
-
16
+ apiKey: PUBLIC_FIREBASE_API_KEY,
17
+ authDomain: PUBLIC_FIREBASE_AUTH_DOMAIN,
18
+ projectId: PUBLIC_FIREBASE_PROJECT_ID,
19
+ storageBucket: PUBLIC_FIREBASE_STORAGE_BUCKET,
20
+ messagingSenderId: PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
21
+ appId: PUBLIC_FIREBASE_APP_ID,
22
+ });
36
23
  export const auth = isReader ? undefined : getAuth();
37
24
  export const db = isReader ? undefined : getFirestore();
38
25
  export const storage = isReader ? undefined : getStorage();
39
26
  export const functions = isReader ? undefined : getFunctions();
40
-
41
27
  if (!isReader && PUBLIC_CONTEXT === 'local') {
42
- if (db) connectFirestoreEmulator(db, 'localhost', 8080);
43
- if (auth) connectAuthEmulator(auth, 'http://localhost:9099');
44
- if (storage) connectStorageEmulator(storage, 'localhost', 9199);
45
- if (functions) connectFunctionsEmulator(functions, 'localhost', 5001);
28
+ if (db)
29
+ connectFirestoreEmulator(db, 'localhost', 8080);
30
+ if (auth)
31
+ connectAuthEmulator(auth, 'http://localhost:9099');
32
+ if (storage)
33
+ connectStorageEmulator(storage, 'localhost', 9199);
34
+ if (functions)
35
+ connectFunctionsEmulator(functions, 'localhost', 5001);
46
36
  }
@@ -0,0 +1,61 @@
1
+ import type { DocumentReference } from 'firebase/firestore';
2
+ import BookMedia from './BookMedia';
3
+ import type Edition from './Edition';
4
+ /** A replication of edition info */
5
+ export type EditionInfo = {
6
+ ref: DocumentReference;
7
+ summary: string;
8
+ number: number;
9
+ published: number | null;
10
+ editionuids: string[];
11
+ chapteruids: string[];
12
+ };
13
+ export type BookSpecification = {
14
+ title: string;
15
+ authors: string[];
16
+ description: string;
17
+ cover: string | null;
18
+ published: boolean;
19
+ editions: EditionInfo[];
20
+ domain: string | null;
21
+ uids: string[];
22
+ readuids: string[];
23
+ };
24
+ export default class Book {
25
+ readonly ref: DocumentReference;
26
+ readonly title: string;
27
+ readonly authors: string[];
28
+ readonly description: string;
29
+ readonly cover: string | null;
30
+ readonly published: boolean;
31
+ readonly editions: EditionInfo[];
32
+ readonly domain: string | null;
33
+ readonly uids: string[];
34
+ media: BookMedia;
35
+ constructor(ref: DocumentReference, title: string, authors: string[], description: string, cover: string | null, editions: EditionInfo[], domain: string | null, uids: string[]);
36
+ getMedia(): BookMedia;
37
+ static fromJSON(ref: DocumentReference, book: BookSpecification): Book;
38
+ toJSON(): BookSpecification;
39
+ getSubdomain(): string | null;
40
+ withSubdomain(domain: string): Book;
41
+ getTitle(): string;
42
+ withTitle(title: string): Book;
43
+ getDescription(): string;
44
+ withDescription(description: string): Book;
45
+ getCover(): string | null;
46
+ withCover(cover: string | null): Book;
47
+ getAuthors(): string[];
48
+ withAuthors(authors: string[]): Book;
49
+ getRef(): DocumentReference<import("@firebase/firestore").DocumentData>;
50
+ getRefID(): string;
51
+ getEditionNumberID(number: number): string | undefined;
52
+ getLatestPublishedEditionID(): string;
53
+ getLatestEditionID(): string | undefined;
54
+ getEditions(): EditionInfo[];
55
+ getPublishedEditionCount(): number;
56
+ isEditor(uid: string): boolean;
57
+ withEditors(uids: string[]): Book;
58
+ withEditions(revisions: EditionInfo[]): Book;
59
+ withRevisedEdition(previous: Edition, revised: Edition): Book;
60
+ hasPublishedEdition(): boolean;
61
+ }