bookish-press 0.4.46 → 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 -59
  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} +110 -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
@@ -1,44 +1,51 @@
1
- <script>import Header from './Header.svelte';
2
- import Outline from './Outline.svelte';
3
- import Page from './Page.svelte';
4
- import Instructions from './Instructions.svelte';
5
- import ChapterIDs from '../../models/book/ChapterID';
6
- import Link from '../Link.svelte';
7
- import { getBase, getEdition, isEditionEditable } from './Contexts';
8
- import { page } from '$app/stores';
9
- import Muted from './Muted.svelte';
10
- import ChapterTitle from './ChapterTitle.svelte';
11
- import ChapterNumber from './ChapterNumber.svelte';
12
- import PageHeader from './PageHeader.svelte';
13
- import Rows from './Rows.svelte';
14
- let editable = isEditionEditable();
15
- let edition = getEdition();
16
- let base = getBase();
17
- // What letter are we matching?
18
- $: letter = $page.params.letter;
19
- $: bookIndex = $edition?.getBookIndex() ?? {};
20
- let letters = {};
21
- // Figure out what letters have words
22
- $: {
23
- for (const word of Object.keys(bookIndex).sort((a, b) => a.localeCompare(b)))
24
- letters[word.charAt(0).toLocaleLowerCase()] = true;
25
- }
26
- let words = [];
27
- $: {
28
- words = [];
29
- let count = 0;
30
- Object.keys(bookIndex)
31
- .sort((a, b) => a.localeCompare(b))
32
- .forEach((word) => {
33
- const firstLetter = word.charAt(0).toLowerCase();
34
- if (letter === firstLetter) {
35
- count++;
36
- if (count % 20 === 0)
37
- words.push(true);
38
- words.push(word);
39
- }
40
- });
41
- }
1
+ <script lang="ts">
2
+ import Header from '$lib/components/page/Header.svelte';
3
+ import Outline from '$lib/components/page/Outline.svelte';
4
+ import Page from '$lib/components/page/Page.svelte';
5
+ import Instructions from '$lib/components/page/Instructions.svelte';
6
+ import ChapterIDs from '$lib/models/book/ChapterID';
7
+ import Link from '$lib/components/Link.svelte';
8
+ import { getBase, getEdition, isEditionEditable } from './Contexts';
9
+ import { page } from '$app/stores';
10
+ import Muted from './Muted.svelte';
11
+ import ChapterTitle from './ChapterTitle.svelte';
12
+ import ChapterNumber from './ChapterNumber.svelte';
13
+ import PageHeader from './PageHeader.svelte';
14
+ import Rows from './Rows.svelte';
15
+
16
+ let editable = isEditionEditable();
17
+ let edition = getEdition();
18
+ let base = getBase();
19
+
20
+ // What letter are we matching?
21
+ $: letter = $page.params.letter;
22
+
23
+ $: bookIndex = $edition?.getBookIndex() ?? {};
24
+
25
+ let letters: Record<string, boolean> = {};
26
+ // Figure out what letters have words
27
+ $: {
28
+ for (const word of Object.keys(bookIndex).sort((a, b) =>
29
+ a.localeCompare(b)
30
+ ))
31
+ letters[word.charAt(0).toLocaleLowerCase()] = true;
32
+ }
33
+
34
+ let words: (string | true)[] = [];
35
+ $: {
36
+ words = [];
37
+ let count = 0;
38
+ Object.keys(bookIndex)
39
+ .sort((a, b) => a.localeCompare(b))
40
+ .forEach((word) => {
41
+ const firstLetter = word.charAt(0).toLowerCase();
42
+ if (letter === firstLetter) {
43
+ count++;
44
+ if (count % 20 === 0) words.push(true);
45
+ words.push(word);
46
+ }
47
+ });
48
+ }
42
49
  </script>
43
50
 
44
51
  {#if $edition}
@@ -1,4 +1,5 @@
1
- <script>export let editable;
1
+ <script lang="ts">
2
+ export let editable: boolean;
2
3
  </script>
3
4
 
4
5
  {#if editable}
@@ -1,12 +1,20 @@
1
- <script>import Parser from '../../models/chapter/Parser';
2
- import BookishEditor from '../editor/BookishEditor.svelte';
3
- import Instructions from './Instructions.svelte';
4
- import Format from '../chapter/Format.svelte';
5
- import { getUser, getEdition, getLeasee, isEditionEditable, lease, } from './Contexts';
6
- import PageHeader from './PageHeader.svelte';
7
- let auth = getUser();
8
- let edition = getEdition();
9
- let editable = isEditionEditable();
1
+ <script lang="ts">
2
+ import Parser from '$lib/models/chapter/Parser';
3
+ import BookishEditor from '$lib/components/editor/BookishEditor.svelte';
4
+ import Instructions from '$lib/components/page/Instructions.svelte';
5
+ import Format from '$lib/components/chapter/Format.svelte';
6
+ import {
7
+ getUser,
8
+ getEdition,
9
+ getLeasee,
10
+ isEditionEditable,
11
+ lease,
12
+ } from './Contexts';
13
+ import PageHeader from './PageHeader.svelte';
14
+
15
+ let auth = getUser();
16
+ let edition = getEdition();
17
+ let editable = isEditionEditable();
10
18
  </script>
11
19
 
12
20
  <PageHeader id="license">License</PageHeader>
@@ -1,30 +1,47 @@
1
- <script>import Header from './Header.svelte';
2
- import Outline from './Outline.svelte';
3
- import Page from './Page.svelte';
4
- import Instructions from './Instructions.svelte';
5
- import ChapterIDs from '../../models/book/ChapterID';
6
- import Format from '../chapter/Format.svelte';
7
- import MediaPreview from './MediaPreview.svelte';
8
- import { onMount } from 'svelte';
9
- import { getBase, getBook, getEdition, isBookEditable, isEditionEditable, } from './Contexts';
10
- import Button from '../app/Button.svelte';
11
- import PageHeader from './PageHeader.svelte';
12
- let book = getBook();
13
- let edition = getEdition();
14
- let editable = isBookEditable();
15
- let base = getBase();
16
- let images = [];
17
- $: embeds = $edition?.getEmbeds() ?? [];
18
- $: media = $book?.getMedia();
19
- function updateImages(newImages) {
20
- images = newImages;
21
- }
22
- onMount(() => {
23
- // Listen to image changes.
24
- media?.notify(updateImages);
25
- return () => media?.stopNotifying(updateImages);
26
- });
27
- $: unused = images?.filter((image) => embeds.find((embed) => embed.getURL() === image.url) === undefined);
1
+ <script lang="ts">
2
+ import Header from '$lib/components/page/Header.svelte';
3
+ import Outline from '$lib/components/page/Outline.svelte';
4
+ import type { Image } from '$lib/models/book/BookMedia';
5
+ import Page from '$lib/components/page/Page.svelte';
6
+ import Instructions from '$lib/components/page/Instructions.svelte';
7
+ import ChapterIDs from '$lib/models/book/ChapterID';
8
+ import Format from '$lib/components/chapter/Format.svelte';
9
+ import MediaPreview from './MediaPreview.svelte';
10
+ import { onMount } from 'svelte';
11
+ import {
12
+ getBase,
13
+ getBook,
14
+ getEdition,
15
+ isBookEditable,
16
+ isEditionEditable,
17
+ } from './Contexts';
18
+ import Button from '../app/Button.svelte';
19
+ import PageHeader from './PageHeader.svelte';
20
+
21
+ let book = getBook();
22
+ let edition = getEdition();
23
+ let editable = isBookEditable();
24
+ let base = getBase();
25
+
26
+ let images: Image[] | undefined = [];
27
+
28
+ $: embeds = $edition?.getEmbeds() ?? [];
29
+ $: media = $book?.getMedia();
30
+
31
+ function updateImages(newImages: Image[] | undefined) {
32
+ images = newImages;
33
+ }
34
+
35
+ onMount(() => {
36
+ // Listen to image changes.
37
+ media?.notify(updateImages);
38
+ return () => media?.stopNotifying(updateImages);
39
+ });
40
+
41
+ $: unused = images?.filter(
42
+ (image) =>
43
+ embeds.find((embed) => embed.getURL() === image.url) === undefined
44
+ );
28
45
  </script>
29
46
 
30
47
  {#if $edition}
@@ -1,5 +1,6 @@
1
- <script>export let url;
2
- export let alt;
1
+ <script lang="ts">
2
+ export let url: string;
3
+ export let alt: string;
3
4
  </script>
4
5
 
5
6
  <figure class={'media-preview'}>
@@ -1,119 +1,149 @@
1
- <script>import { isMobile } from '../../util/isMobile';
2
- import { onMount } from 'svelte';
3
- import Link from '../Link.svelte';
4
- import { getBase, getDarkMode } from './Contexts';
5
- export let previous;
6
- export let next;
7
- export let collapse = false;
8
- export let listener = undefined;
9
- let headerString = null;
10
- let headerIndex = -1;
11
- let expanded = false;
12
- let dark = getDarkMode();
13
- let base = getBase();
14
- let outline = null;
15
- let headers = [];
16
- function toggleExpanded() {
17
- // Don't toggle when in margin mode.
18
- if (!isMobile())
19
- return;
20
- const newExpanded = !expanded;
21
- // Toggle expanded state
22
- expanded = newExpanded;
23
- if (listener)
24
- listener(newExpanded, layout);
25
- }
26
- function toggleReadingMode() {
27
- dark.set(!$dark);
28
- }
29
- function layout() {
30
- position();
31
- highlight();
32
- updateHeaders();
33
- }
34
- function updateHeaders() {
35
- // When the outline updates (due to the page its on updating), generate a unique string for the current header outline.
36
- // If it's different from the last rendered state, refresh.
37
- headers = Array.from(document.getElementsByClassName('page-header'));
38
- let newHeaderString = headers.reduce((sum, el) => sum + el.outerHTML, '');
39
- // If the headers change, update the outline.
40
- if (headerString !== newHeaderString)
41
- headerString = newHeaderString;
42
- }
43
- function getHighlightThreshold() {
44
- return window.innerHeight / 3;
45
- }
46
- function position() {
47
- // Left align the floating outline with the left margin of the chapter
48
- // and the top of the title, unless we're past it.
49
- let title = document.getElementsByClassName('bookish-chapter-header-text')[0];
50
- // If we found them both...
51
- if (outline && title) {
52
- // If so, remove the inline position so the footer CSS applies.
53
- if (isMobile()) {
54
- outline.style.removeProperty('margin-top');
55
- }
56
- // If not, set the position of the outline.
57
- else {
58
- let titleY = title.getBoundingClientRect().top + window.scrollY;
59
- // If the title is off screen, anchor it to the top of the window. (CSS is set to do this).
60
- if (titleY - 50 < window.scrollY) {
61
- outline.classList.add('outline-fixed-left');
62
- outline.classList.remove('outline-title-left');
1
+ <script lang="ts">
2
+ import { isMobile } from '$lib/util/isMobile';
3
+ import { onMount } from 'svelte';
4
+ import Link from '$lib/components/Link.svelte';
5
+ import { getBase, getDarkMode } from './Contexts';
6
+
7
+ export let previous: string | null;
8
+ export let next: string | null;
9
+ export let collapse = false;
10
+ export let listener:
11
+ | ((expanded: boolean, layout: Function) => void)
12
+ | undefined = undefined;
13
+
14
+ let headerString: string | null = null;
15
+ let headerIndex = -1;
16
+ let expanded = false;
17
+ let dark = getDarkMode();
18
+ let base = getBase();
19
+ let outline: HTMLElement | null = null;
20
+ let headers: Element[] = [];
21
+
22
+ function toggleExpanded() {
23
+ // Don't toggle when in margin mode.
24
+ if (!isMobile()) return;
25
+
26
+ const newExpanded = !expanded;
27
+
28
+ // Toggle expanded state
29
+ expanded = newExpanded;
30
+
31
+ if (listener) listener(newExpanded, layout);
32
+ }
33
+
34
+ function toggleReadingMode() {
35
+ dark.set(!$dark);
36
+ }
37
+
38
+ function layout() {
39
+ position();
40
+ highlight();
41
+ updateHeaders();
42
+ }
43
+
44
+ function updateHeaders() {
45
+ // When the outline updates (due to the page its on updating), generate a unique string for the current header outline.
46
+ // If it's different from the last rendered state, refresh.
47
+ headers = Array.from(document.getElementsByClassName('page-header'));
48
+ let newHeaderString = headers.reduce(
49
+ (sum, el) => sum + el.outerHTML,
50
+ ''
51
+ );
52
+
53
+ // If the headers change, update the outline.
54
+ if (headerString !== newHeaderString) headerString = newHeaderString;
55
+ }
56
+
57
+ function getHighlightThreshold() {
58
+ return window.innerHeight / 3;
59
+ }
60
+
61
+ function position() {
62
+ // Left align the floating outline with the left margin of the chapter
63
+ // and the top of the title, unless we're past it.
64
+ let title = document.getElementsByClassName(
65
+ 'bookish-chapter-header-text'
66
+ )[0];
67
+
68
+ // If we found them both...
69
+ if (outline && title) {
70
+ // If so, remove the inline position so the footer CSS applies.
71
+ if (isMobile()) {
72
+ outline.style.removeProperty('margin-top');
63
73
  }
64
- // Otherwise, anchor it to the title position.
74
+ // If not, set the position of the outline.
65
75
  else {
66
- outline.classList.remove('outline-fixed-left');
67
- outline.classList.add('outline-title-left');
76
+ let titleY = title.getBoundingClientRect().top + window.scrollY;
77
+ // If the title is off screen, anchor it to the top of the window. (CSS is set to do this).
78
+ if (titleY - 50 < window.scrollY) {
79
+ outline.classList.add('outline-fixed-left');
80
+ outline.classList.remove('outline-title-left');
81
+ }
82
+ // Otherwise, anchor it to the title position.
83
+ else {
84
+ outline.classList.remove('outline-fixed-left');
85
+ outline.classList.add('outline-title-left');
86
+ }
87
+
88
+ // Tell any listeners about the repositioning.
89
+ if (listener) listener(false, layout);
68
90
  }
69
- // Tell any listeners about the repositioning.
70
- if (listener)
71
- listener(false, layout);
72
91
  }
73
92
  }
74
- }
75
- function highlight() {
76
- const top = window.scrollY;
77
- const threshold = getHighlightThreshold();
78
- // Find the header that we're past so we can update the outline.
79
- let indexOfNearestHeaderAbove = -1; // -1 represents the title
80
- Array.from(document.getElementsByClassName('page-header')).forEach((header, index) => {
81
- // Is this a header we care about?
82
- if (header.tagName === 'H1' ||
83
- header.tagName === 'H2' ||
84
- header.tagName === 'H3') {
85
- let rect = header.getBoundingClientRect();
86
- let headerTop = rect.y + top - rect.height;
87
- // Are we past this header?
88
- if (top > headerTop - threshold)
89
- indexOfNearestHeaderAbove = index;
90
- }
93
+
94
+ function highlight() {
95
+ const top = window.scrollY;
96
+ const threshold = getHighlightThreshold();
97
+
98
+ // Find the header that we're past so we can update the outline.
99
+ let indexOfNearestHeaderAbove = -1; // -1 represents the title
100
+ Array.from(document.getElementsByClassName('page-header')).forEach(
101
+ (header, index) => {
102
+ // Is this a header we care about?
103
+ if (
104
+ header.tagName === 'H1' ||
105
+ header.tagName === 'H2' ||
106
+ header.tagName === 'H3'
107
+ ) {
108
+ let rect = header.getBoundingClientRect();
109
+ let headerTop = rect.y + top - rect.height;
110
+ // Are we past this header?
111
+ if (top > headerTop - threshold)
112
+ indexOfNearestHeaderAbove = index;
113
+ }
114
+ }
115
+ );
116
+
117
+ // Update the outline and progress bar.
118
+ headerIndex = indexOfNearestHeaderAbove;
119
+ }
120
+
121
+ onMount(() => {
122
+ window.addEventListener('resize', layout);
123
+ window.addEventListener('scroll', layout);
124
+
125
+ // This is a bit hacky: we update the headers on every selection change so we
126
+ // can detect any header changes during editing. This isn't necessary during
127
+ // reading, and is only necessary when a header is created, updated, or removed,
128
+ // but we don't have a precise mechanism to listen to chapter changes, so we do this instead.
129
+ document.addEventListener('selectionchange', updateHeaders);
130
+
131
+ // Position outline after first render.
132
+ layout();
133
+
134
+ // Stop listening!
135
+ return () => {
136
+ window.removeEventListener('scroll', layout);
137
+ window.removeEventListener('resize', layout);
138
+ document.removeEventListener('selectionchange', updateHeaders);
139
+ };
91
140
  });
92
- // Update the outline and progress bar.
93
- headerIndex = indexOfNearestHeaderAbove;
94
- }
95
- onMount(() => {
96
- window.addEventListener('resize', layout);
97
- window.addEventListener('scroll', layout);
98
- // This is a bit hacky: we update the headers on every selection change so we
99
- // can detect any header changes during editing. This isn't necessary during
100
- // reading, and is only necessary when a header is created, updated, or removed,
101
- // but we don't have a precise mechanism to listen to chapter changes, so we do this instead.
102
- document.addEventListener('selectionchange', updateHeaders);
103
- // Position outline after first render.
104
- layout();
105
- // Stop listening!
106
- return () => {
107
- window.removeEventListener('scroll', layout);
108
- window.removeEventListener('resize', layout);
109
- document.removeEventListener('selectionchange', updateHeaders);
110
- };
111
- });
112
- let previousLabel = '\u25C0\uFE0E';
113
- let nextLabel = '\u25B6\uFE0E';
114
- let expandLabel = '\u2630';
115
- let lightLabel = '\u263C';
116
- let darkLabel = '\u263E';
141
+
142
+ let previousLabel = '\u25C0\uFE0E';
143
+ let nextLabel = '\u25B6\uFE0E';
144
+ let expandLabel = '\u2630';
145
+ let lightLabel = '\u263C';
146
+ let darkLabel = '\u263E';
117
147
  </script>
118
148
 
119
149
  <nav
@@ -0,0 +1,94 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import Loading from '$lib/components/page/Loading.svelte';
4
+
5
+ export let title: string;
6
+ export let afterLoaded: Function | undefined = undefined;
7
+
8
+ let loaded = false;
9
+ let lastHeight = 0;
10
+ let intervalID: NodeJS.Timer | null = null;
11
+ let mountTime = Date.now();
12
+
13
+ function watchLoading() {
14
+ const bodyHeight = document.body.clientHeight;
15
+
16
+ // If the height hasn't changed and images are loaded OR it's been 2 seconds, load.
17
+ if (
18
+ (lastHeight === bodyHeight && imagesAreLoaded()) ||
19
+ Date.now() - mountTime > 2000
20
+ ) {
21
+ // Stop watching the images
22
+ stopWatching();
23
+ // Set to loaded to hide the overlay and notify callback if there is one.
24
+ loaded = true;
25
+ if (afterLoaded) afterLoaded();
26
+ }
27
+
28
+ // Remember the last height
29
+ lastHeight = bodyHeight;
30
+ }
31
+
32
+ function stopWatching() {
33
+ if (intervalID) clearInterval(intervalID);
34
+ }
35
+
36
+ onMount(() => {
37
+ // Watch the height of the document and wait until it's been stable for a while before scrolling
38
+ // to any targets. We use the data below to monitor the document height over time.
39
+ intervalID = setInterval(() => watchLoading(), 50);
40
+
41
+ return () => stopWatching();
42
+ });
43
+
44
+ function imagesAreLoaded() {
45
+ let done = true;
46
+ Array.from(document.getElementsByTagName('img')).forEach((el) => {
47
+ done = done && el.complete;
48
+ });
49
+ return done;
50
+ }
51
+ </script>
52
+
53
+ <svelte:head>
54
+ <title>{title}</title>
55
+ <meta name="description" content={title} />
56
+ </svelte:head>
57
+
58
+ <section class={'bookish-page' + (loaded ? ' loaded' : '')}>
59
+ <slot />
60
+ </section>
61
+ <!-- Overlay loading feedback if loading, but still render the page. -->
62
+ {#if loaded === false}
63
+ <Loading />
64
+ {/if}
65
+
66
+ <style>
67
+ /* A page, such as table of contents, chapter, or references */
68
+ .bookish-page {
69
+ max-width: 720px;
70
+
71
+ /* This helps marginals relative to the page */
72
+ position: relative;
73
+
74
+ /* To make room for navigation footer. Without this, the page is too short to show it. */
75
+ padding-left: var(--bookish-block-padding);
76
+ padding-right: var(--bookish-block-padding);
77
+ padding-bottom: 5em;
78
+
79
+ /* Center the application in the viewport */
80
+ margin-top: 0;
81
+ margin-left: auto;
82
+ margin-right: auto;
83
+
84
+ /* Hidden by default until tagged as loaded */
85
+ opacity: 0;
86
+ transition: opacity 0.25s ease-in;
87
+
88
+ z-index: 1;
89
+ }
90
+
91
+ .loaded {
92
+ opacity: 1;
93
+ }
94
+ </style>
@@ -1,4 +1,5 @@
1
- <script>export let id = null;
1
+ <script lang="ts">
2
+ export let id: string | null = null;
2
3
  </script>
3
4
 
4
5
  <h2 class="page-header" {id}><slot /></h2>
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import Chapter from '$lib/components/page/Chapter.svelte';
3
+ import { page } from '$app/stores';
4
+ import { getEdition } from '$lib/components/page/Contexts';
5
+ import Unknown from '$lib/components/page/Unknown.svelte';
6
+
7
+ $: edition = getEdition();
8
+ $: chapterID = $page.params.chapterid;
9
+ $: chapter = $edition?.getChapter(chapterID);
10
+ </script>
11
+
12
+ {#if chapter}
13
+ <Chapter {chapter} />
14
+ {:else}
15
+ <Unknown>This chapter doesn't exist...</Unknown>
16
+ {/if}
@@ -0,0 +1,14 @@
1
+ <script lang="ts">
2
+ import FormatNode from '$lib/models/chapter/FormatNode';
3
+ import type Ref from '$lib/models/book/Reference';
4
+ import Format from '../chapter/Format.svelte';
5
+ import Reference from './Reference.svelte';
6
+
7
+ export let node: FormatNode | Ref;
8
+ </script>
9
+
10
+ {#if node instanceof FormatNode}
11
+ <Format {node} />
12
+ {:else}
13
+ <Reference reference={node} />
14
+ {/if}
@@ -1,6 +1,8 @@
1
- <script>import Chapter from './Chapter.svelte';
2
- import { getEdition } from './Contexts';
3
- let edition = getEdition();
1
+ <script lang="ts">
2
+ import Chapter from './Chapter.svelte';
3
+ import { getEdition } from './Contexts';
4
+
5
+ let edition = getEdition();
4
6
  </script>
5
7
 
6
8
  {#if $edition}