bookish-press 0.4.1 → 0.4.3

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 (403) hide show
  1. package/README.md +3 -1
  2. package/components/Auth.svelte +27 -24
  3. package/components/Auth.svelte.d.ts +4 -4
  4. package/components/Authentication.d.ts +2 -2
  5. package/components/BookPreview.svelte +75 -59
  6. package/components/BookPreview.svelte.d.ts +5 -5
  7. package/components/External.svelte +1 -1
  8. package/components/External.svelte.d.ts +3 -3
  9. package/components/Link.svelte +49 -3
  10. package/components/Link.svelte.d.ts +3 -4
  11. package/components/app/BookList.svelte +19 -0
  12. package/components/app/BookList.svelte.d.ts +18 -0
  13. package/components/app/Button.svelte +49 -0
  14. package/components/app/Button.svelte.d.ts +22 -0
  15. package/components/app/Feedback.svelte +47 -0
  16. package/components/app/Feedback.svelte.d.ts +18 -0
  17. package/components/app/Head.svelte +15 -0
  18. package/components/app/Head.svelte.d.ts +18 -0
  19. package/components/app/Large.svelte +8 -0
  20. package/components/app/Large.svelte.d.ts +27 -0
  21. package/components/app/Lead.svelte +12 -0
  22. package/components/app/Lead.svelte.d.ts +27 -0
  23. package/components/app/Link.svelte +24 -0
  24. package/components/app/Link.svelte.d.ts +20 -0
  25. package/components/app/Options.svelte +24 -0
  26. package/components/app/Options.svelte.d.ts +19 -0
  27. package/components/app/Paragraph.svelte +20 -0
  28. package/components/app/Paragraph.svelte.d.ts +18 -0
  29. package/components/app/Section.svelte +12 -0
  30. package/components/app/Section.svelte.d.ts +27 -0
  31. package/components/app/Table.svelte +32 -0
  32. package/components/app/Table.svelte.d.ts +27 -0
  33. package/components/app/TextInput.svelte +38 -0
  34. package/components/app/TextInput.svelte.d.ts +22 -0
  35. package/components/chapter/Atom.svelte +20 -6
  36. package/components/chapter/Atom.svelte.d.ts +3 -3
  37. package/components/chapter/Block.svelte +26 -21
  38. package/components/chapter/Block.svelte.d.ts +4 -4
  39. package/components/chapter/Callout.svelte +38 -7
  40. package/components/chapter/Callout.svelte.d.ts +4 -4
  41. package/components/chapter/CaptionedCode.svelte +67 -24
  42. package/components/chapter/CaptionedCode.svelte.d.ts +4 -4
  43. package/components/chapter/ChapterBody.svelte +62 -9
  44. package/components/chapter/ChapterBody.svelte.d.ts +5 -4
  45. package/components/chapter/Citations.svelte +86 -20
  46. package/components/chapter/Citations.svelte.d.ts +4 -4
  47. package/components/chapter/Code.svelte +152 -21
  48. package/components/chapter/Code.svelte.d.ts +3 -3
  49. package/components/chapter/Comment.svelte +39 -17
  50. package/components/chapter/Comment.svelte.d.ts +3 -3
  51. package/components/chapter/Definition.svelte +52 -18
  52. package/components/chapter/Definition.svelte.d.ts +5 -8
  53. package/components/chapter/Embed.svelte +155 -67
  54. package/components/chapter/Embed.svelte.d.ts +6 -4
  55. package/components/chapter/ErrorMessage.svelte +7 -2
  56. package/components/chapter/ErrorMessage.svelte.d.ts +4 -4
  57. package/components/chapter/ExtendedPrism.d.ts +2 -0
  58. package/components/chapter/ExtendedPrism.js +69 -0
  59. package/components/chapter/Figure.svelte +90 -0
  60. package/components/chapter/Figure.svelte.d.ts +24 -0
  61. package/components/chapter/Footnote.svelte +75 -12
  62. package/components/chapter/Footnote.svelte.d.ts +4 -4
  63. package/components/chapter/Format.svelte +63 -38
  64. package/components/chapter/Format.svelte.d.ts +5 -4
  65. package/components/chapter/InlineCode.svelte +16 -6
  66. package/components/chapter/InlineCode.svelte.d.ts +4 -4
  67. package/components/chapter/Label.svelte +38 -9
  68. package/components/chapter/Label.svelte.d.ts +4 -4
  69. package/components/chapter/Link.svelte +24 -19
  70. package/components/chapter/Link.svelte.d.ts +4 -4
  71. package/components/chapter/List.svelte +75 -8
  72. package/components/chapter/List.svelte.d.ts +4 -4
  73. package/components/chapter/Marginal.svelte +169 -27
  74. package/components/chapter/Marginal.svelte.d.ts +6 -3
  75. package/components/chapter/Paragraph.svelte +79 -6
  76. package/components/chapter/Paragraph.svelte.d.ts +4 -4
  77. package/components/chapter/Positioned.svelte +33 -0
  78. package/components/chapter/Positioned.svelte.d.ts +19 -0
  79. package/components/chapter/Problem.svelte +15 -0
  80. package/components/chapter/Problem.svelte.d.ts +27 -0
  81. package/components/chapter/Python.svelte +68 -21
  82. package/components/chapter/Python.svelte.d.ts +4 -4
  83. package/components/chapter/Quote.svelte +64 -11
  84. package/components/chapter/Quote.svelte.d.ts +4 -4
  85. package/components/chapter/Rule.svelte +12 -1
  86. package/components/chapter/Rule.svelte.d.ts +4 -4
  87. package/components/chapter/Table.svelte +36 -25
  88. package/components/chapter/Table.svelte.d.ts +4 -4
  89. package/components/chapter/Text.svelte +61 -36
  90. package/components/chapter/Text.svelte.d.ts +5 -4
  91. package/components/editor/BookishEditor.svelte +373 -244
  92. package/components/editor/BookishEditor.svelte.d.ts +9 -6
  93. package/components/editor/CalloutEditor.svelte +5 -5
  94. package/components/editor/CalloutEditor.svelte.d.ts +4 -4
  95. package/components/editor/CaptionedCodeEditor.svelte +16 -12
  96. package/components/editor/CaptionedCodeEditor.svelte.d.ts +4 -4
  97. package/components/editor/CaretContext.d.ts +48 -16
  98. package/components/editor/CaretState.d.ts +16 -44
  99. package/components/editor/CaretUtilities.d.ts +2 -2
  100. package/components/editor/CaretView.svelte +82 -0
  101. package/components/editor/CaretView.svelte.d.ts +25 -0
  102. package/components/editor/CitationsEditor.svelte +36 -25
  103. package/components/editor/CitationsEditor.svelte.d.ts +4 -4
  104. package/components/editor/Clipboard.d.ts +2 -2
  105. package/components/editor/Command.d.ts +13 -12
  106. package/components/editor/Commands.d.ts +1 -1
  107. package/components/editor/Commands.js +1114 -571
  108. package/components/editor/ConfirmButton.svelte +18 -12
  109. package/components/editor/ConfirmButton.svelte.d.ts +5 -4
  110. package/components/editor/DefinitionEditor.svelte +29 -21
  111. package/components/editor/DefinitionEditor.svelte.d.ts +4 -4
  112. package/components/editor/EmbedEditor.svelte +93 -43
  113. package/components/editor/EmbedEditor.svelte.d.ts +3 -3
  114. package/components/editor/Icon.svelte +17 -0
  115. package/components/editor/Icon.svelte.d.ts +16 -0
  116. package/components/editor/ImageChooser.svelte +53 -34
  117. package/components/editor/ImageChooser.svelte.d.ts +3 -3
  118. package/components/editor/InlineCodeEditor.svelte +7 -4
  119. package/components/editor/InlineCodeEditor.svelte.d.ts +4 -4
  120. package/components/editor/LabelEditor.svelte +20 -11
  121. package/components/editor/LabelEditor.svelte.d.ts +4 -4
  122. package/components/editor/LanguageEditor.svelte +10 -7
  123. package/components/editor/LanguageEditor.svelte.d.ts +3 -3
  124. package/components/editor/LinkEditor.svelte +64 -39
  125. package/components/editor/LinkEditor.svelte.d.ts +4 -4
  126. package/components/editor/Note.svelte +4 -3
  127. package/components/editor/Note.svelte.d.ts +6 -2
  128. package/components/editor/Permissions.svelte +95 -0
  129. package/components/editor/Permissions.svelte.d.ts +20 -0
  130. package/components/editor/PositionEditor.svelte +9 -6
  131. package/components/editor/PositionEditor.svelte.d.ts +4 -4
  132. package/components/editor/QuoteEditor.svelte +7 -2
  133. package/components/editor/QuoteEditor.svelte.d.ts +4 -4
  134. package/components/editor/Switch.svelte +55 -28
  135. package/components/editor/Switch.svelte.d.ts +4 -4
  136. package/components/editor/TableEditor.svelte +10 -0
  137. package/components/editor/TableEditor.svelte.d.ts +17 -0
  138. package/components/editor/TextEditor.svelte +83 -45
  139. package/components/editor/TextEditor.svelte.d.ts +5 -4
  140. package/components/editor/Toggle.svelte +11 -8
  141. package/components/editor/Toggle.svelte.d.ts +4 -4
  142. package/components/editor/Toolbar.svelte +191 -144
  143. package/components/editor/Toolbar.svelte.d.ts +5 -8
  144. package/components/editor/ToolbarGroup.svelte +17 -23
  145. package/components/editor/ToolbarGroup.svelte.d.ts +3 -4
  146. package/components/editor/ToolbarSpacer.svelte +8 -1
  147. package/components/editor/ToolbarSpacer.svelte.d.ts +6 -2
  148. package/components/editor/URLEditor.svelte +6 -8
  149. package/components/editor/URLEditor.svelte.d.ts +3 -3
  150. package/components/editor/UndoState.d.ts +3 -3
  151. package/components/editor/icons/annotate.svg +1 -0
  152. package/components/editor/icons/block.svg +1 -0
  153. package/components/editor/icons/bold.svg +1 -0
  154. package/components/editor/icons/bullets.svg +1 -0
  155. package/components/editor/icons/callout.svg +1 -0
  156. package/components/editor/icons/citation.svg +8 -0
  157. package/components/editor/icons/clear.svg +1 -0
  158. package/components/editor/icons/clipboard.svg +1 -0
  159. package/components/editor/icons/code.svg +1 -0
  160. package/components/editor/icons/columnafter.svg +1 -0
  161. package/components/editor/icons/columnbefore.svg +1 -0
  162. package/components/editor/icons/comment.svg +1 -0
  163. package/components/editor/icons/copy.svg +1 -0
  164. package/components/editor/icons/cut.svg +1 -0
  165. package/components/editor/icons/define.svg +7 -0
  166. package/components/editor/icons/deletecolumn.svg +1 -0
  167. package/components/editor/icons/deleterow.svg +1 -0
  168. package/components/editor/icons/footnote.svg +8 -0
  169. package/components/editor/icons/header1.svg +7 -0
  170. package/components/editor/icons/header2.svg +7 -0
  171. package/components/editor/icons/header3.svg +7 -0
  172. package/components/editor/icons/home.svg +1 -0
  173. package/components/editor/icons/indent.svg +1 -0
  174. package/components/editor/icons/italic.svg +1 -0
  175. package/components/editor/icons/label.svg +1 -0
  176. package/components/editor/icons/left.svg +1 -0
  177. package/components/editor/icons/level.svg +1 -0
  178. package/components/editor/icons/link.svg +1 -0
  179. package/components/editor/icons/list.svg +1 -0
  180. package/components/editor/icons/media.svg +1 -0
  181. package/components/editor/icons/middle.svg +1 -0
  182. package/components/editor/icons/numbers.svg +10 -0
  183. package/components/editor/icons/paragraph.svg +1 -0
  184. package/components/editor/icons/paste.svg +10 -0
  185. package/components/editor/icons/quote.svg +1 -0
  186. package/components/editor/icons/redo.svg +1 -0
  187. package/components/editor/icons/right.svg +1 -0
  188. package/components/editor/icons/rowabove.svg +1 -0
  189. package/components/editor/icons/rowbelow.svg +1 -0
  190. package/components/editor/icons/rule.svg +1 -0
  191. package/components/editor/icons/sub.svg +1 -0
  192. package/components/editor/icons/super.svg +1 -0
  193. package/components/editor/icons/table.svg +1 -0
  194. package/components/editor/icons/text.svg +1 -0
  195. package/components/editor/icons/time.svg +1 -0
  196. package/components/editor/icons/undo.svg +1 -0
  197. package/components/editor/icons/unindent.svg +1 -0
  198. package/components/editor/icons/unlink.svg +1 -0
  199. package/components/page/Acknowledgements.svelte +35 -24
  200. package/components/page/Acknowledgements.svelte.d.ts +4 -4
  201. package/components/page/Authors.svelte +34 -17
  202. package/components/page/Authors.svelte.d.ts +7 -6
  203. package/components/page/BookLoader.svelte +59 -0
  204. package/components/page/BookLoader.svelte.d.ts +16 -0
  205. package/components/page/BulkReferenceEditor.svelte +54 -23
  206. package/components/page/BulkReferenceEditor.svelte.d.ts +4 -4
  207. package/components/page/Chapter.svelte +234 -143
  208. package/components/page/Chapter.svelte.d.ts +3 -3
  209. package/components/page/ChapterContext.d.ts +4 -4
  210. package/components/page/ChapterNumber.svelte +9 -0
  211. package/components/page/ChapterNumber.svelte.d.ts +27 -0
  212. package/components/page/ChapterTitle.svelte +16 -0
  213. package/components/page/ChapterTitle.svelte.d.ts +18 -0
  214. package/components/page/Contexts.d.ts +42 -22
  215. package/components/page/Contexts.js +129 -17
  216. package/components/page/DefinitionView.svelte +129 -90
  217. package/components/page/DefinitionView.svelte.d.ts +3 -3
  218. package/components/page/Description.svelte +31 -19
  219. package/components/page/Description.svelte.d.ts +4 -4
  220. package/components/page/Edition.svelte +135 -81
  221. package/components/page/Edition.svelte.d.ts +5 -6
  222. package/components/page/EditionLoader.svelte +99 -0
  223. package/components/page/EditionLoader.svelte.d.ts +18 -0
  224. package/components/page/Editions.svelte +106 -0
  225. package/components/page/Editions.svelte.d.ts +14 -0
  226. package/components/page/Glossary.svelte +65 -49
  227. package/components/page/Glossary.svelte.d.ts +4 -4
  228. package/components/page/Header.svelte +143 -56
  229. package/components/page/Header.svelte.d.ts +8 -6
  230. package/components/page/Index.svelte +116 -80
  231. package/components/page/Index.svelte.d.ts +4 -4
  232. package/components/page/Instructions.svelte +18 -17
  233. package/components/page/Instructions.svelte.d.ts +6 -4
  234. package/components/page/License.svelte +39 -23
  235. package/components/page/License.svelte.d.ts +4 -4
  236. package/components/page/Loading.svelte +102 -12
  237. package/components/page/Loading.svelte.d.ts +6 -2
  238. package/components/page/Media.svelte +81 -53
  239. package/components/page/Media.svelte.d.ts +4 -4
  240. package/components/page/MediaPreview.svelte +26 -8
  241. package/components/page/MediaPreview.svelte.d.ts +3 -3
  242. package/components/page/Muted.svelte +10 -0
  243. package/components/page/Muted.svelte.d.ts +27 -0
  244. package/components/page/Outline.svelte +279 -59
  245. package/components/page/Outline.svelte.d.ts +3 -3
  246. package/components/page/Page.svelte +40 -9
  247. package/components/page/Page.svelte.d.ts +3 -3
  248. package/components/page/PageHeader.svelte +14 -0
  249. package/components/page/PageHeader.svelte.d.ts +18 -0
  250. package/components/page/PageParagraph.svelte +18 -0
  251. package/components/page/PageParagraph.svelte.d.ts +27 -0
  252. package/components/page/PossibleChapter.svelte +7 -7
  253. package/components/page/PossibleChapter.svelte.d.ts +4 -4
  254. package/components/page/PossibleReference.svelte +6 -11
  255. package/components/page/PossibleReference.svelte.d.ts +6 -7
  256. package/components/page/Print.svelte +27 -3
  257. package/components/page/Print.svelte.d.ts +4 -4
  258. package/components/page/Publish.svelte +134 -0
  259. package/components/page/Publish.svelte.d.ts +14 -0
  260. package/components/page/Reference.svelte +259 -117
  261. package/components/page/Reference.svelte.d.ts +5 -5
  262. package/components/page/References.svelte +45 -48
  263. package/components/page/References.svelte.d.ts +4 -4
  264. package/components/page/Rows.svelte +54 -0
  265. package/components/page/Rows.svelte.d.ts +27 -0
  266. package/components/page/Search.svelte +88 -63
  267. package/components/page/Search.svelte.d.ts +4 -4
  268. package/components/page/Status.svelte +46 -39
  269. package/components/page/Status.svelte.d.ts +4 -9
  270. package/components/page/SubdomainEditor.svelte +41 -27
  271. package/components/page/SubdomainEditor.svelte.d.ts +4 -4
  272. package/components/page/TableOfContents.svelte +264 -191
  273. package/components/page/TableOfContents.svelte.d.ts +4 -4
  274. package/components/page/TableOfContentsImage.svelte +8 -8
  275. package/components/page/TableOfContentsImage.svelte.d.ts +3 -3
  276. package/components/page/TableOfContentsRow.svelte +97 -34
  277. package/components/page/TableOfContentsRow.svelte.d.ts +4 -4
  278. package/components/page/ThemeEditor.svelte +177 -39
  279. package/components/page/ThemeEditor.svelte.d.ts +4 -4
  280. package/components/page/ThemeEditorPreview.svelte +35 -23
  281. package/components/page/ThemeEditorPreview.svelte.d.ts +5 -5
  282. package/components/page/ThemeSetEditor.svelte +15 -13
  283. package/components/page/ThemeSetEditor.svelte.d.ts +4 -4
  284. package/components/page/ThemeVariableEditor.svelte +24 -15
  285. package/components/page/ThemeVariableEditor.svelte.d.ts +3 -3
  286. package/components/page/Title.svelte +12 -0
  287. package/components/page/Title.svelte.d.ts +27 -0
  288. package/components/page/Unknown.svelte +28 -21
  289. package/components/page/Unknown.svelte.d.ts +4 -4
  290. package/components/page/margins.js +50 -33
  291. package/index.d.ts +13 -0
  292. package/index.js +14 -0
  293. package/models/CRUD.d.ts +27 -0
  294. package/models/CRUD.js +262 -0
  295. package/models/Firebase.d.ts +1 -0
  296. package/models/Firebase.js +26 -16
  297. package/models/book/Book.d.ts +40 -39
  298. package/models/book/Book.js +121 -121
  299. package/models/book/BookMedia.d.ts +3 -3
  300. package/models/book/BookMedia.js +22 -16
  301. package/models/book/BookSaveStatus.d.ts +7 -0
  302. package/models/book/BookSaveStatus.js +8 -0
  303. package/models/book/Chapter.d.ts +50 -39
  304. package/models/book/Chapter.js +189 -198
  305. package/models/book/ChapterID.js +7 -7
  306. package/models/book/Definition.d.ts +1 -1
  307. package/models/book/Edition.d.ts +87 -61
  308. package/models/book/Edition.js +460 -309
  309. package/models/book/Reference.d.ts +24 -0
  310. package/models/book/Reference.js +78 -0
  311. package/models/book/Schema.d.ts +168 -0
  312. package/models/book/Schema.js +115 -0
  313. package/models/book/Theme.d.ts +44 -37
  314. package/models/book/Theme.js +452 -52
  315. package/models/book/ThemeColors.d.ts +1 -1
  316. package/models/book/Words.d.ts +2 -0
  317. package/models/book/Words.js +110 -0
  318. package/models/chapter/AtomNode.d.ts +4 -4
  319. package/models/chapter/AtomNode.js +20 -13
  320. package/models/chapter/BlockNode.d.ts +9 -10
  321. package/models/chapter/BlockNode.js +32 -13
  322. package/models/chapter/BlocksNode.d.ts +10 -10
  323. package/models/chapter/BlocksNode.js +315 -120
  324. package/models/chapter/BlocksNode.test.js +494 -228
  325. package/models/chapter/Bookkeeping.d.ts +1 -1
  326. package/models/chapter/CalloutNode.d.ts +3 -3
  327. package/models/chapter/CalloutNode.js +34 -12
  328. package/models/chapter/Caret.d.ts +9 -7
  329. package/models/chapter/Caret.js +11 -6
  330. package/models/chapter/ChapterNode.d.ts +11 -11
  331. package/models/chapter/ChapterNode.js +70 -33
  332. package/models/chapter/CitationsNode.d.ts +3 -3
  333. package/models/chapter/CitationsNode.js +31 -12
  334. package/models/chapter/CodeNode.d.ts +11 -6
  335. package/models/chapter/CodeNode.js +143 -34
  336. package/models/chapter/CommentNode.d.ts +5 -5
  337. package/models/chapter/CommentNode.js +29 -13
  338. package/models/chapter/DefinitionNode.d.ts +2 -2
  339. package/models/chapter/DefinitionNode.js +15 -7
  340. package/models/chapter/Edit.d.ts +3 -3
  341. package/models/chapter/EmbedNode.d.ts +9 -5
  342. package/models/chapter/EmbedNode.js +108 -35
  343. package/models/chapter/ErrorNode.d.ts +2 -2
  344. package/models/chapter/ErrorNode.js +34 -12
  345. package/models/chapter/FootnoteNode.d.ts +5 -5
  346. package/models/chapter/FootnoteNode.js +34 -16
  347. package/models/chapter/FormatNode.d.ts +10 -10
  348. package/models/chapter/FormatNode.js +237 -106
  349. package/models/chapter/FormatNode.test.js +87 -45
  350. package/models/chapter/InlineCodeNode.d.ts +2 -2
  351. package/models/chapter/InlineCodeNode.js +22 -9
  352. package/models/chapter/LabelNode.d.ts +4 -4
  353. package/models/chapter/LabelNode.js +31 -13
  354. package/models/chapter/LinkNode.d.ts +2 -2
  355. package/models/chapter/LinkNode.js +21 -9
  356. package/models/chapter/ListNode.d.ts +8 -8
  357. package/models/chapter/ListNode.js +99 -38
  358. package/models/chapter/ListNode.test.js +29 -24
  359. package/models/chapter/MetadataNode.d.ts +3 -3
  360. package/models/chapter/MetadataNode.js +13 -5
  361. package/models/chapter/Node.d.ts +5 -3
  362. package/models/chapter/Node.js +76 -29
  363. package/models/chapter/Node.test.js +20 -18
  364. package/models/chapter/ParagraphNode.d.ts +6 -6
  365. package/models/chapter/ParagraphNode.js +84 -29
  366. package/models/chapter/ParagraphNode.test.js +22 -13
  367. package/models/chapter/Parser.d.ts +27 -27
  368. package/models/chapter/Parser.js +220 -206
  369. package/models/chapter/Parser.test.js +16 -16
  370. package/models/chapter/Position.d.ts +1 -1
  371. package/models/chapter/QuoteNode.d.ts +6 -6
  372. package/models/chapter/QuoteNode.js +61 -23
  373. package/models/chapter/RootNode.d.ts +4 -4
  374. package/models/chapter/RuleNode.d.ts +2 -2
  375. package/models/chapter/RuleNode.js +31 -11
  376. package/models/chapter/TableNode.d.ts +8 -6
  377. package/models/chapter/TableNode.js +89 -34
  378. package/models/chapter/TableNode.test.js +22 -24
  379. package/models/chapter/TextNode.d.ts +6 -6
  380. package/models/chapter/TextNode.js +72 -32
  381. package/models/chapter/TextNode.test.js +4 -4
  382. package/package.json +108 -26
  383. package/util/getSubdomain.js +8 -6
  384. package/util/isMobile.js +1 -1
  385. package/util/mineReference.d.ts +3 -2
  386. package/util/mineReference.js +67 -29
  387. package/util/scrollToEyeLevel.js +6 -1
  388. package/components/chapter/renderPosition.d.ts +0 -3
  389. package/components/chapter/renderPosition.js +0 -4
  390. package/components/editor/ToolbarIcon.svelte +0 -22
  391. package/components/editor/ToolbarIcon.svelte.d.ts +0 -16
  392. package/components/page/Alert.svelte +0 -11
  393. package/components/page/Alert.svelte.d.ts +0 -23
  394. package/components/page/Revisions.svelte +0 -124
  395. package/components/page/Revisions.svelte.d.ts +0 -14
  396. package/models/BookLoader.d.ts +0 -2
  397. package/models/BookLoader.js +0 -67
  398. package/models/Firestore.d.ts +0 -22
  399. package/models/Firestore.js +0 -194
  400. package/models/chapter/ReferenceNode.d.ts +0 -29
  401. package/models/chapter/ReferenceNode.js +0 -48
  402. package/models/loadEdition.d.ts +0 -5
  403. package/models/loadEdition.js +0 -16
@@ -1,107 +1,161 @@
1
1
  <script>import smoothscroll from 'smoothscroll-polyfill';
2
2
  import { goto } from '$app/navigation';
3
- import Status from "./Status.svelte";
4
3
  import { onMount, setContext } from 'svelte';
5
- import { writable } from "svelte/store";
6
- import { BASE, BOOK, DARK_MODE, EDITABLE, EDITION } from "./Contexts";
4
+ import { writable } from 'svelte/store';
5
+ import { BASE, DARK_MODE, } from './Contexts';
6
+ import { BookishTheme } from '../../models/book/Theme';
7
7
  // Poly fill smooth scrolling for Safari.
8
- smoothscroll.polyfill();
9
- // True if the edition should be editable. Distributed as context.
10
- export let editable = false;
11
- // When editable changes, update the context.
12
- $: setContext(EDITABLE, editable);
8
+ onMount(() => smoothscroll.polyfill());
9
+ // The book edition to render.
10
+ export let edition;
13
11
  // The base path allows links to adjust to different routing contexts in which a book is placed.
14
- // For example, when the book is hosted alone, all routes might start with the bare root "/",
12
+ // For example, when the book is hosted alone, all routes might start with the bare root "/",
15
13
  // but when the book is being viewed or edited in the Bookish app, it needs a prefix for the
16
14
  // route in the app.
17
- export let base = "";
15
+ export let base = '/';
18
16
  // When the base changes, update the context.
19
- $: setContext(BASE, base);
20
- // The book edition to render.
21
- export let edition;
22
- // Expose the edition to descendents in a store and update the context when the edition changes.
23
- let currentEdition = writable(edition);
24
- setContext(EDITION, currentEdition);
25
- // Expose the book to descendents in a store and update the context when the edition changes.
26
- $: setContext(BOOK, edition.getBook());
27
- // When edition changes, unsubscribe to the previous edition and subscribe to the new one.
28
- // We use a simple assignment to tell Svelte about the change.
29
- let editionChanged = () => currentEdition.set(edition);
30
- $: {
31
- // Remove the listeners from the old edition
32
- $currentEdition.removeListener(editionChanged);
33
- $currentEdition.getBook()?.removeListener(editionChanged);
34
- // Update the current edition.
35
- currentEdition.set(edition);
36
- // Listen to the new edition
37
- $currentEdition.getBook()?.addListener(editionChanged);
38
- $currentEdition.addListener(editionChanged);
39
- }
40
- // Create a timer that saves the current edition periodically and stops when unmounted.
41
- onMount(() => {
42
- const saveListener = setInterval(() => {
43
- $currentEdition.saveEdits();
44
- $currentEdition.getBook()?.saveEdits();
45
- }, 500);
46
- // On unmount, stop listening.
47
- return () => clearInterval(saveListener);
48
- });
17
+ let baseStore = writable(base);
18
+ $: setContext(BASE, baseStore);
19
+ $: baseStore.set(base);
49
20
  // Default dark mode to whatever's stored in local storage, if anything.
50
21
  // respect user choice on the website despite the system theme
51
- let darkMode = writable(typeof localStorage !== "undefined" &&
52
- localStorage.getItem("bookish-dark") !== "false" && (localStorage.getItem("bookish-dark") === "true" || // A previous setting
53
- window.matchMedia("(prefers-color-scheme: dark)").matches // Operating system is set to dark
54
- ));
22
+ let darkMode = writable(typeof localStorage !== 'undefined' &&
23
+ localStorage.getItem('dark') !== 'false' &&
24
+ (localStorage.getItem('dark') === 'true' || // A previous setting
25
+ window.matchMedia('(prefers-color-scheme: dark)').matches) // Operating system is set to dark
26
+ );
55
27
  // Expose dark mode to descendants
56
28
  setContext(DARK_MODE, darkMode);
57
29
  // When dark mode changes, update the body's class list.
58
30
  $: {
59
- if ($darkMode) {
60
- document.body.classList.add("bookish-dark");
61
- }
62
- else {
63
- document.body.classList.remove("bookish-dark");
64
- if (typeof localStorage !== "undefined")
65
- localStorage.setItem("bookish-dark", $darkMode ? "true" : "false");
31
+ if (typeof document !== 'undefined') {
32
+ if ($darkMode)
33
+ document.body.classList.add('dark');
34
+ else
35
+ document.body.classList.remove('dark');
36
+ if (typeof localStorage !== 'undefined')
37
+ localStorage.setItem('dark', $darkMode ? 'true' : 'false');
38
+ // Set the theme, whatever it is, and change it when the edition changes
39
+ setTheme(edition.getTheme() ?? BookishTheme);
66
40
  }
67
41
  }
42
+ // Set the theme on mount.
43
+ onMount(() => {
44
+ setTheme(edition.getTheme() ?? BookishTheme);
45
+ });
68
46
  // Redirect old hash routes by simply replacing their hash before routing.
69
- if (typeof window !== "undefined" && window.location.hash.startsWith('#/'))
47
+ if (typeof window !== 'undefined' && window.location.hash.startsWith('#/'))
70
48
  goto(location.hash.replace('#', ''));
71
- // Set the theme, whatever it is, and change it when the edition changes.
72
- $: setTheme(edition.getTheme());
49
+ /** Given a theme, sets the appropriate CSS rules in the browser to apply the theme.*/
73
50
  function setTheme(theme) {
74
- // Remove any existing theme.
75
- document.getElementById("bookish-theme")?.remove();
76
51
  // If the theme is being unset, make sure we've removed any overrding style declaration.
77
52
  // This let's the default theme kick in.
78
- if (theme === null)
79
- return;
80
- // If it's being set, create a new style tag.
81
- const themeTag = document.createElement("style");
82
- themeTag.setAttribute("id", "bookish-theme");
83
- const css = `:root {
84
- ${toRules(theme.light)}
85
- ${toRules(theme.fonts)}
86
- ${toRules(theme.sizes)}
87
- ${toRules(theme.weights)}
88
- ${toRules(theme.spacing)}
89
- }
90
- .bookish-dark {
91
- ${toRules(theme.dark)}
92
- }`;
93
- themeTag.appendChild(document.createTextNode(css));
94
- document.head.appendChild(themeTag);
53
+ let themeTagImports = document.getElementById('bookish-theme-imports');
54
+ let themeTagCSS = document.getElementById('bookish-theme');
55
+ // We only want to set it if it's actually different than what's currently set.
56
+ // Otherwise during editing we get lots of jittery changes on each edit, because the
57
+ // whole edition is rerendering. To check this, we set a data attribute on the style tag containing
58
+ // a stringify of the theme set. We do this separately for the imports, since they can have more
59
+ // major changes than the spacing and color sizes, changing fonts especially.
60
+ const themeTagCSSValue = themeTagCSS?.dataset.css;
61
+ const themeTagImportsValue = themeTagImports?.dataset.imports;
62
+ const newThemeTagCSSValue = JSON.stringify(theme);
63
+ const newThemeTagImportsValue = JSON.stringify(theme?.imports);
64
+ if (theme !== null) {
65
+ // If the imports changed, update theme.
66
+ if (themeTagImportsValue !== newThemeTagImportsValue) {
67
+ // If it's being set, create a new style tag.
68
+ const newThemeImportsTag = document.createElement('style');
69
+ // Give it an ID so we can remove it later.
70
+ newThemeImportsTag.setAttribute('id', 'bookish-theme-imports');
71
+ newThemeImportsTag.dataset.imports = newThemeTagImportsValue;
72
+ // Insert any import statements, then any rules.
73
+ const css = `${(theme.imports ?? [])
74
+ .map((url) => `@import url(${url});`)
75
+ .join('\n')}`;
76
+ newThemeImportsTag.appendChild(document.createTextNode(css));
77
+ document.head.appendChild(newThemeImportsTag);
78
+ // Remove the old tag
79
+ themeTagImports?.remove();
80
+ }
81
+ // If the rules changed, update them.
82
+ if (themeTagCSSValue !== newThemeTagCSSValue) {
83
+ // If it's being set, create a new style tag.
84
+ const newThemeCSSTag = document.createElement('style');
85
+ // Give it an ID so we can remove it later.
86
+ newThemeCSSTag.setAttribute('id', 'bookish-theme');
87
+ newThemeCSSTag.dataset.css = newThemeTagCSSValue;
88
+ // Insert any import statements, then any rules.
89
+ const css = `
90
+ ${(theme.imports ?? [])
91
+ .map((url) => `@import url(${url});`)
92
+ .join('\n')}
93
+ .bookish {
94
+ ${theme.light ? toRules(theme.light) : ''}
95
+ ${theme.fonts ? toRules(theme.fonts) : ''}
96
+ ${theme.sizes ? toRules(theme.sizes) : ''}
97
+ ${theme.weights ? toRules(theme.weights) : ''}
98
+ ${theme.spacing ? toRules(theme.spacing) : ''}
99
+ }
100
+ .dark {
101
+ ${theme.dark ? toRules(theme.dark) : ''}
102
+ }`;
103
+ newThemeCSSTag.appendChild(document.createTextNode(css));
104
+ document.head.appendChild(newThemeCSSTag);
105
+ // Remove the old tag
106
+ themeTagCSS?.remove();
107
+ }
108
+ }
109
+ else {
110
+ // Remove the old tags, unsetting the theme.
111
+ themeTagImports?.remove();
112
+ themeTagCSS?.remove();
113
+ }
95
114
  }
96
115
  function toRules(set) {
97
- return Object.keys(set).map(name => {
98
- const cssVariable = "--bookish-" + name.replace(/([a-z])([A-Z])/g, "$1 $2").split(" ").map(s => s.toLowerCase()).join("-");
99
- return `${cssVariable}: ${set[name]};`;
100
- }).join("\n\t\t");
116
+ return Object.keys(set)
117
+ .map((name) => {
118
+ const value = set[name];
119
+ if (value.length > 0) {
120
+ const cssVariable = '--bookish-' +
121
+ name
122
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
123
+ .split(' ')
124
+ .map((s) => s.toLowerCase())
125
+ .join('-')
126
+ .replace(/([0-9])/g, '-$1-');
127
+ return `${cssVariable}: ${value};`;
128
+ }
129
+ })
130
+ .join('\n\t\t');
101
131
  }
102
132
  </script>
103
133
 
104
- <div class={"bookish" + ($darkMode ? " bookish-dark" : "")}>
105
- <slot></slot>
106
- <Status book={edition.getBook()} edition={edition}/>
107
- </div>
134
+ <main class="bookish {$darkMode ? ' dark' : ''}">
135
+ <slot />
136
+ </main>
137
+
138
+ <style>
139
+ * {
140
+ box-sizing: border-box;
141
+ }
142
+
143
+ /* WINDOW AND PAGES */
144
+ :global(body) {
145
+ margin: 0;
146
+ padding: 0;
147
+ background-color: var(--bookish-background-color);
148
+ }
149
+
150
+ /* The root container for a book */
151
+ .bookish {
152
+ font-weight: var(--bookish-paragraph-font-weight);
153
+ font-family: var(--bookish-paragraph-font-family);
154
+ font-size: var(--bookish-paragraph-font-size);
155
+ background-color: var(--bookish-background-color);
156
+ color: var(--bookish-paragraph-color);
157
+ width: 100%;
158
+ z-index: 0;
159
+ text-align: left;
160
+ }
161
+ </style>
@@ -1,10 +1,9 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
- import type EditionModel from "../../models/book/Edition";
2
+ import type EditionModel from '../../models/book/Edition';
3
3
  declare const __propDef: {
4
4
  props: {
5
- editable?: boolean | undefined;
6
- base?: string | undefined;
7
5
  edition: EditionModel;
6
+ base?: string | undefined;
8
7
  };
9
8
  events: {
10
9
  [evt: string]: CustomEvent<any>;
@@ -13,9 +12,9 @@ declare const __propDef: {
13
12
  default: {};
14
13
  };
15
14
  };
16
- export declare type EditionProps = typeof __propDef.props;
17
- export declare type EditionEvents = typeof __propDef.events;
18
- export declare type EditionSlots = typeof __propDef.slots;
15
+ export type EditionProps = typeof __propDef.props;
16
+ export type EditionEvents = typeof __propDef.events;
17
+ export type EditionSlots = typeof __propDef.slots;
19
18
  export default class Edition extends SvelteComponentTyped<EditionProps, EditionEvents, EditionSlots> {
20
19
  }
21
20
  export {};
@@ -0,0 +1,99 @@
1
+ <script>import Loading from './Loading.svelte';
2
+ import Edition from './Edition.svelte';
3
+ import Feedback from '../app/Feedback.svelte';
4
+ import { getBook, getEdition, getUser, CHAPTERTEXT, getChapterText, } from './Contexts';
5
+ import { onDestroy } from 'svelte';
6
+ import { page } from '$app/stores';
7
+ import { listenToChapters, listenToEdition } from '../../models/CRUD';
8
+ export let write;
9
+ let auth = getUser();
10
+ let book = getBook();
11
+ let edition = getEdition();
12
+ let chapterText = getChapterText();
13
+ let editionUnsub = undefined;
14
+ let chaptersUnsub = undefined;
15
+ let error = undefined;
16
+ function unsub() {
17
+ // Unsubscribe to the old edition document if we were listening to one.
18
+ if (editionUnsub)
19
+ editionUnsub();
20
+ if (chaptersUnsub)
21
+ chaptersUnsub();
22
+ }
23
+ function listen() {
24
+ unsub();
25
+ error = undefined;
26
+ // If we no longer have a book, we can't get an edition.
27
+ if ($book === undefined) {
28
+ edition.set(undefined);
29
+ error = 'Unknown book.';
30
+ return;
31
+ }
32
+ else {
33
+ const editionNumber = $page.params.editionid;
34
+ const latestPublished = !write;
35
+ // Figure out which edition to load.
36
+ let editionID;
37
+ if (editionNumber === undefined) {
38
+ if (latestPublished) {
39
+ editionID = $book.getLatestPublishedEditionID();
40
+ if (editionID === undefined)
41
+ error = 'There is no published edition of this book.';
42
+ }
43
+ else {
44
+ editionID = $book.getLatestEditionID();
45
+ }
46
+ }
47
+ else {
48
+ editionID = $book.getEditionNumberID(parseFloat(editionNumber));
49
+ if (editionID === undefined)
50
+ error = `There is no ${editionNumber} edition of this book`;
51
+ }
52
+ // Listen to the doc for changes and listen to all of its chapters.
53
+ if (editionID !== undefined) {
54
+ editionUnsub = listenToEdition($book.ref.id, editionID, (ed) => {
55
+ if (ed) {
56
+ // Before setting the new edition, augmented it with the chapter text.
57
+ edition.set($chapterText
58
+ ? ed.withChapterText($chapterText)
59
+ : ed);
60
+ }
61
+ else {
62
+ edition.set(undefined);
63
+ error = 'Unable to load edition';
64
+ }
65
+ });
66
+ chaptersUnsub = listenToChapters($book.ref.id, editionID, (chapters) => {
67
+ // Update the chapter text store.
68
+ chapterText.set(chapters);
69
+ // Update the chapter text in the current edition.
70
+ if ($edition)
71
+ edition.set($edition.withChapterText(chapters));
72
+ });
73
+ }
74
+ }
75
+ }
76
+ // Whenever the book or page changes, change the listener.
77
+ $: if ($page && $auth && $auth.user !== null)
78
+ listen();
79
+ // When unmounted, unset the stores — no longer viewing a book.
80
+ onDestroy(() => {
81
+ edition.set(undefined);
82
+ unsub();
83
+ });
84
+ </script>
85
+
86
+ {#if $book === undefined || error}
87
+ <Feedback error>Unable to load edition.</Feedback>
88
+ {:else if $edition === undefined}
89
+ <Loading />
90
+ {:else}
91
+ <Edition
92
+ edition={$edition}
93
+ base={write
94
+ ? `/write/${$book.getRefID()}/${$edition.getEditionNumber()}/`
95
+ : `/${$book.getSubdomain() ?? $book.getRefID()}/`}
96
+ >
97
+ <slot />
98
+ </Edition>
99
+ {/if}
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ write: boolean;
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {
10
+ default: {};
11
+ };
12
+ };
13
+ export type EditionLoaderProps = typeof __propDef.props;
14
+ export type EditionLoaderEvents = typeof __propDef.events;
15
+ export type EditionLoaderSlots = typeof __propDef.slots;
16
+ export default class EditionLoader extends SvelteComponentTyped<EditionLoaderProps, EditionLoaderEvents, EditionLoaderSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,106 @@
1
+ <script>import { createNewEdition } from '../../models/CRUD';
2
+ import Instructions from './Instructions.svelte';
3
+ import Note from '../editor/Note.svelte';
4
+ import { getUser, getBook, isBookEditable } from './Contexts';
5
+ import Button from '../app/Button.svelte';
6
+ import Link from '../app/Link.svelte';
7
+ import Format from '../chapter/Format.svelte';
8
+ import Parser from '../../models/chapter/Parser';
9
+ import Permissions from '../editor/Permissions.svelte';
10
+ let book = getBook();
11
+ let editable = isBookEditable();
12
+ $: editions = $book?.getEditions();
13
+ $: latestPublishedID = $book?.getLatestPublishedEditionID();
14
+ async function handleDraftEdition() {
15
+ if ($book === undefined)
16
+ return;
17
+ book.set(await createNewEdition($book));
18
+ }
19
+ </script>
20
+
21
+ {#if $book && editions}
22
+ {#if editable}
23
+ <p>
24
+ <Button tooltip="create new edition" command={handleDraftEdition}
25
+ >+ edition</Button
26
+ >
27
+ </p>
28
+ {/if}
29
+ <Instructions {editable}>
30
+ Each book has one or more editions, allowing you to track revisions and
31
+ ensure previous versions remain available. When you're ready to revise,
32
+ add a new edition here; it will copy the latest edition, which you can
33
+ then edit. When you're ready to publish an edition, write a summary here
34
+ and then publish. By default, readers will see the latest published
35
+ edition, but they can access older editions here.
36
+ </Instructions>
37
+ {#each editions as bookEdition, index (bookEdition.ref)}
38
+ {@const editionNumber =
39
+ editions === undefined ? -1 : editions.length - index}
40
+ {@const editionLabel =
41
+ editionNumber +
42
+ (editionNumber === 1
43
+ ? 'st'
44
+ : editionNumber === 2
45
+ ? 'nd'
46
+ : editionNumber === 3
47
+ ? 'rd'
48
+ : 'th')}
49
+
50
+ {#if $book && (editable || bookEdition.published)}
51
+ <section class="edition">
52
+ <h3
53
+ >{editionLabel}
54
+ <Note
55
+ >{#if bookEdition.published}{new Date(
56
+ bookEdition.published
57
+ ).toLocaleDateString(
58
+ 'en-us'
59
+ )}{:else}unpublished{/if}
60
+ &nbsp;
61
+ <Link
62
+ to={latestPublishedID === bookEdition.ref.id &&
63
+ $book.getSubdomain() !== undefined
64
+ ? `/${$book.getSubdomain()}`
65
+ : `/${$book.ref.id}/${editions.length - index}`}
66
+ >read</Link
67
+ >
68
+ {#if editable}
69
+ &nbsp;
70
+ <Link
71
+ to={`/write/${$book.ref.id}/${
72
+ editions.length - index
73
+ }`}>edit</Link
74
+ >
75
+ {/if}
76
+ </Note>
77
+ </h3>
78
+ <p
79
+ >{#if bookEdition.summary !== ''}<Format
80
+ node={Parser.parseFormat(
81
+ undefined,
82
+ bookEdition.summary
83
+ )}
84
+ />{:else}&mdash{/if}</p
85
+ >
86
+ </section>
87
+ {/if}
88
+ {/each}
89
+
90
+ {#if editable}
91
+ <h2>Editors</h2>
92
+ <Instructions {editable}>
93
+ These authors can edit any aspect of the book and any of its
94
+ editions.
95
+ </Instructions>
96
+
97
+ <Permissions
98
+ uids={$book.uids}
99
+ inheriteduids={[]}
100
+ atleastone={true}
101
+ writable={editable}
102
+ change={(uids) =>
103
+ $book ? book.set($book.withEditors(uids)) : undefined}
104
+ />
105
+ {/if}
106
+ {/if}
@@ -0,0 +1,14 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: Record<string, never>;
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {};
8
+ };
9
+ export type EditionsProps = typeof __propDef.props;
10
+ export type EditionsEvents = typeof __propDef.events;
11
+ export type EditionsSlots = typeof __propDef.slots;
12
+ export default class Editions extends SvelteComponentTyped<EditionsProps, EditionsEvents, EditionsSlots> {
13
+ }
14
+ export {};
@@ -1,61 +1,77 @@
1
- <script>import Header from "./Header.svelte";
1
+ <script>import Header from './Header.svelte';
2
2
  import Outline from './Outline.svelte';
3
3
  import Page from './Page.svelte';
4
4
  import ChapterIDs from '../../models/book/ChapterID';
5
- import DefinitionView from "./DefinitionView.svelte";
6
- import { getEdition, isEditable } from "./Contexts";
7
- import Instructions from "./Instructions.svelte";
5
+ import DefinitionView from './DefinitionView.svelte';
6
+ import { getUser, getEdition, isEditionEditable } from './Contexts';
7
+ import Instructions from './Instructions.svelte';
8
+ import Button from '../app/Button.svelte';
9
+ let auth = getUser();
8
10
  let edition = getEdition();
9
- let editable = isEditable();
10
- $: glossary = $edition.getGlossary();
11
+ let editable = isEditionEditable();
12
+ $: glossary = $edition?.getGlossary() ?? {};
11
13
  // Sort by canonical phrases
12
- $: keys = glossary === undefined || Object.keys(glossary).length === 0 ? null : Object.keys(glossary).sort((a, b) => glossary[a].phrase.localeCompare(glossary[b].phrase));
14
+ $: keys =
15
+ $edition === undefined
16
+ ? []
17
+ : glossary === undefined || Object.keys(glossary).length === 0
18
+ ? null
19
+ : Object.keys(glossary).sort((a, b) => glossary[a].phrase.localeCompare(glossary[b].phrase));
13
20
  function addEmptyDefinition() {
21
+ if ($edition === undefined)
22
+ return;
14
23
  // Generate an ID.
15
- const letters = "abcdefghijklmnopqrstuvwxyz".split("");
16
- let id = "";
24
+ const letters = 'abcdefghijklmnopqrstuvwxyz'.split('');
25
+ let id = '';
17
26
  while (id.length < 4 || $edition.hasDefinition(id))
18
27
  id = id + letters[Math.round(Math.random() * 26)];
19
- $edition.addDefinition(id, "", "", []);
28
+ edition.set($edition.withDefinition(id, '', '', []));
20
29
  }
21
30
  </script>
22
31
 
23
- <Page title={`${$edition.getTitle()} - Glossary`}>
24
- <Header
25
- label="Glossary title"
26
- getImage={() => $edition.getImage(ChapterIDs.GlossaryID)}
27
- setImage={(embed) => $edition.setImage(ChapterIDs.GlossaryID, embed)}
28
- header="Glossary"
29
- tags={$edition.getTags()}
30
- >
31
- <Outline
32
- slot="outline"
33
- previous={$edition.getPreviousChapterID(ChapterIDs.GlossaryID)}
34
- next={$edition.getNextChapterID(ChapterIDs.GlossaryID)}
35
- />
36
- </Header>
37
- {#if editable }
38
- <Instructions>
39
- Add definitions and then link to them in a chapter's text.
40
- </Instructions>
41
- <p><button on:click={addEmptyDefinition}>+</button></p>
42
- {/if}
43
- {#if keys === null }
44
- <p>This book has no glossary.</p>
45
- {:else}
46
- <div>
47
- <br/>
48
- <div class="bookish-table">
49
- <table>
50
- <colgroup>
51
- <col style="width: 40%" />
52
- <col style="width: 60%" />
53
- </colgroup>
54
- <tbody>
55
- {#each keys as id }<DefinitionView id={id} definition={glossary[id]} />{/each}
56
- </tbody>
57
- </table>
58
- </div>
59
- </div>
60
- {/if}
61
- </Page>
32
+ {#if $edition}
33
+ <Page title={`${$edition.getTitle()} - Glossary`}>
34
+ <Header
35
+ editable={isEditionEditable() ||
36
+ ($auth !== undefined &&
37
+ $auth.user !== null &&
38
+ $edition.isChapterEditor($auth.user.uid))}
39
+ label="Glossary title"
40
+ id="glossary"
41
+ getImage={() => $edition?.getImage(ChapterIDs.GlossaryID) ?? null}
42
+ setImage={(embed) =>
43
+ $edition
44
+ ? edition.set(
45
+ $edition.withImage(ChapterIDs.GlossaryID, embed)
46
+ )
47
+ : undefined}
48
+ header="Glossary"
49
+ tags={$edition.getTags()}
50
+ >
51
+ <Outline
52
+ slot="outline"
53
+ previous={$edition.getPreviousChapterID(ChapterIDs.GlossaryID)}
54
+ next={$edition.getNextChapterID(ChapterIDs.GlossaryID)}
55
+ />
56
+ </Header>
57
+ {#if editable}
58
+ <Instructions {editable}>
59
+ Build a glossary here, adding terms, phrases, definitions, and
60
+ synonyms. Then, in a chapter, you can select any text and link
61
+ it to a definition.
62
+ </Instructions>
63
+ <Button tooltip="add glossary entry" command={addEmptyDefinition}
64
+ >+ definition</Button
65
+ >
66
+ {/if}
67
+ {#if keys === null}
68
+ <p>This book has no glossary.</p>
69
+ {:else}
70
+ <dl>
71
+ {#each keys as id (id)}
72
+ <DefinitionView {id} definition={glossary[id]} />
73
+ {/each}
74
+ </dl>
75
+ {/if}
76
+ </Page>
77
+ {/if}
@@ -1,14 +1,14 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
- props: {};
3
+ props: Record<string, never>;
4
4
  events: {
5
5
  [evt: string]: CustomEvent<any>;
6
6
  };
7
7
  slots: {};
8
8
  };
9
- export declare type GlossaryProps = typeof __propDef.props;
10
- export declare type GlossaryEvents = typeof __propDef.events;
11
- export declare type GlossarySlots = typeof __propDef.slots;
9
+ export type GlossaryProps = typeof __propDef.props;
10
+ export type GlossaryEvents = typeof __propDef.events;
11
+ export type GlossarySlots = typeof __propDef.slots;
12
12
  export default class Glossary extends SvelteComponentTyped<GlossaryProps, GlossaryEvents, GlossarySlots> {
13
13
  }
14
14
  export {};