bookish-press 0.5.1 → 0.5.4

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 (420) hide show
  1. package/README.md +3 -3
  2. package/{package → dist}/components/BookPreview.svelte +1 -0
  3. package/{package → dist}/components/chapter/Callout.svelte +0 -1
  4. package/{package → dist}/components/chapter/Citations.svelte +0 -3
  5. package/{package → dist}/components/chapter/Embed.svelte +8 -6
  6. package/dist/components/chapter/ExtendedPrism.d.ts +2 -0
  7. package/{package → dist}/components/chapter/Figure.svelte +2 -1
  8. package/{package → dist}/components/chapter/Footnote.svelte +1 -0
  9. package/{package → dist}/components/chapter/List.svelte +16 -33
  10. package/{package → dist}/components/chapter/Marginal.svelte +4 -1
  11. package/{package → dist}/components/chapter/Paragraph.svelte +7 -2
  12. package/{package → dist}/components/chapter/Python.svelte +2 -2
  13. package/{package → dist}/components/chapter/Quote.svelte +6 -6
  14. package/{package → dist}/components/chapter/Table.svelte +7 -1
  15. package/{package → dist}/components/controls/DarkToggle.svelte +1 -1
  16. package/{package → dist}/components/controls/DarkToggle.svelte.d.ts +1 -1
  17. package/{package → dist}/components/editor/BookishEditor.svelte +21 -26
  18. package/{package → dist}/components/editor/Commands.js +14 -14
  19. package/{package → dist}/components/editor/ConfirmButton.svelte +8 -2
  20. package/{package → dist}/components/editor/EmbedEditor.svelte +3 -3
  21. package/{package → dist}/components/editor/ImageChooser.svelte +8 -27
  22. package/dist/components/editor/ImageThumbnail.svelte +65 -0
  23. package/dist/components/editor/ImageThumbnail.svelte.d.ts +19 -0
  24. package/{package → dist}/components/editor/Permissions.svelte +2 -0
  25. package/{package → dist}/components/editor/TextEditor.svelte +5 -2
  26. package/{package → dist}/components/editor/Toggle.svelte +1 -1
  27. package/{package → dist}/components/editor/Toolbar.svelte +2 -1
  28. package/{package → dist}/components/page/Chapter.svelte +1 -1
  29. package/{package → dist}/components/page/ChapterTitle.svelte +2 -0
  30. package/{package → dist}/components/page/DefinitionView.svelte +43 -38
  31. package/dist/components/page/Edition.svelte +127 -0
  32. package/{package → dist}/components/page/EditionLoader.svelte +12 -3
  33. package/{package → dist}/components/page/Editions.svelte +1 -1
  34. package/{package → dist}/components/page/Header.svelte +73 -69
  35. package/{package → dist}/components/page/Media.svelte +5 -4
  36. package/{package → dist}/components/page/MediaPreview.svelte +9 -3
  37. package/{package → dist}/components/page/MediaPreview.svelte.d.ts +1 -0
  38. package/{package → dist}/components/page/Outline.svelte +1 -1
  39. package/{package → dist}/components/page/Page.svelte +6 -3
  40. package/{package → dist}/components/page/Reference.svelte +2 -1
  41. package/{package → dist}/components/page/Search.svelte +1 -1
  42. package/{package → dist}/components/page/TableOfContents.svelte +3 -6
  43. package/{package → dist}/components/page/TableOfContentsRow.svelte +1 -1
  44. package/{package → dist}/components/page/ThemeEditor.svelte +1 -1
  45. package/{package → dist}/index.d.ts +5 -3
  46. package/{package → dist}/index.js +5 -3
  47. package/{package → dist}/models/CRUD.d.ts +2 -1
  48. package/{package → dist}/models/CRUD.js +18 -5
  49. package/{package → dist}/models/book/BookMedia.d.ts +3 -0
  50. package/{package → dist}/models/book/BookMedia.js +23 -6
  51. package/{package → dist}/models/book/Chapter.d.ts +9 -7
  52. package/{package → dist}/models/book/Chapter.js +16 -6
  53. package/{package → dist}/models/book/Edition.d.ts +6 -1
  54. package/{package → dist}/models/book/Edition.js +22 -10
  55. package/{package → dist}/models/book/Theme.js +1 -1
  56. package/{package → dist}/models/book/Words.js +0 -1
  57. package/{package → dist}/models/chapter/ChapterNode.d.ts +1 -0
  58. package/{package → dist}/models/chapter/ChapterNode.js +3 -0
  59. package/{package → dist}/models/chapter/DefinitionNode.js +1 -1
  60. package/{package → dist}/models/chapter/FormatNode.js +4 -1
  61. package/{package → dist}/models/chapter/InlineCodeNode.js +1 -1
  62. package/{package → dist}/models/chapter/LinkNode.js +1 -1
  63. package/{package → dist}/models/chapter/ListNode.js +1 -1
  64. package/{package → dist}/models/chapter/Parser.js +3 -6
  65. package/package.json +39 -91
  66. package/package/components/chapter/ExtendedPrism.d.ts +0 -2
  67. package/package/components/page/Edition.svelte +0 -151
  68. /package/{package → dist}/components/Auth.svelte +0 -0
  69. /package/{package → dist}/components/Auth.svelte.d.ts +0 -0
  70. /package/{package → dist}/components/Authentication.d.ts +0 -0
  71. /package/{package → dist}/components/Authentication.js +0 -0
  72. /package/{package → dist}/components/BookPreview.svelte.d.ts +0 -0
  73. /package/{package → dist}/components/Link.svelte +0 -0
  74. /package/{package → dist}/components/Link.svelte.d.ts +0 -0
  75. /package/{package → dist}/components/app/BookList.svelte +0 -0
  76. /package/{package → dist}/components/app/BookList.svelte.d.ts +0 -0
  77. /package/{package → dist}/components/app/Button.svelte +0 -0
  78. /package/{package → dist}/components/app/Button.svelte.d.ts +0 -0
  79. /package/{package → dist}/components/app/Feedback.svelte +0 -0
  80. /package/{package → dist}/components/app/Feedback.svelte.d.ts +0 -0
  81. /package/{package → dist}/components/app/Head.svelte +0 -0
  82. /package/{package → dist}/components/app/Head.svelte.d.ts +0 -0
  83. /package/{package → dist}/components/app/Large.svelte +0 -0
  84. /package/{package → dist}/components/app/Large.svelte.d.ts +0 -0
  85. /package/{package → dist}/components/app/Lead.svelte +0 -0
  86. /package/{package → dist}/components/app/Lead.svelte.d.ts +0 -0
  87. /package/{package → dist}/components/app/Link.svelte +0 -0
  88. /package/{package → dist}/components/app/Link.svelte.d.ts +0 -0
  89. /package/{package → dist}/components/app/Options.svelte +0 -0
  90. /package/{package → dist}/components/app/Options.svelte.d.ts +0 -0
  91. /package/{package → dist}/components/app/Paragraph.svelte +0 -0
  92. /package/{package → dist}/components/app/Paragraph.svelte.d.ts +0 -0
  93. /package/{package → dist}/components/app/Section.svelte +0 -0
  94. /package/{package → dist}/components/app/Section.svelte.d.ts +0 -0
  95. /package/{package → dist}/components/app/Table.svelte +0 -0
  96. /package/{package → dist}/components/app/Table.svelte.d.ts +0 -0
  97. /package/{package → dist}/components/app/TextInput.svelte +0 -0
  98. /package/{package → dist}/components/app/TextInput.svelte.d.ts +0 -0
  99. /package/{package → dist}/components/chapter/Atom.svelte +0 -0
  100. /package/{package → dist}/components/chapter/Atom.svelte.d.ts +0 -0
  101. /package/{package → dist}/components/chapter/Block.svelte +0 -0
  102. /package/{package → dist}/components/chapter/Block.svelte.d.ts +0 -0
  103. /package/{package → dist}/components/chapter/Callout.svelte.d.ts +0 -0
  104. /package/{package → dist}/components/chapter/CaptionedCode.svelte +0 -0
  105. /package/{package → dist}/components/chapter/CaptionedCode.svelte.d.ts +0 -0
  106. /package/{package → dist}/components/chapter/ChapterBody.svelte +0 -0
  107. /package/{package → dist}/components/chapter/ChapterBody.svelte.d.ts +0 -0
  108. /package/{package → dist}/components/chapter/Citations.svelte.d.ts +0 -0
  109. /package/{package → dist}/components/chapter/Code.svelte +0 -0
  110. /package/{package → dist}/components/chapter/Code.svelte.d.ts +0 -0
  111. /package/{package → dist}/components/chapter/Comment.svelte +0 -0
  112. /package/{package → dist}/components/chapter/Comment.svelte.d.ts +0 -0
  113. /package/{package → dist}/components/chapter/Definition.svelte +0 -0
  114. /package/{package → dist}/components/chapter/Definition.svelte.d.ts +0 -0
  115. /package/{package → dist}/components/chapter/Embed.svelte.d.ts +0 -0
  116. /package/{package → dist}/components/chapter/ErrorMessage.svelte +0 -0
  117. /package/{package → dist}/components/chapter/ErrorMessage.svelte.d.ts +0 -0
  118. /package/{package → dist}/components/chapter/ExtendedPrism.js +0 -0
  119. /package/{package → dist}/components/chapter/Figure.svelte.d.ts +0 -0
  120. /package/{package → dist}/components/chapter/Footnote.svelte.d.ts +0 -0
  121. /package/{package → dist}/components/chapter/Format.svelte +0 -0
  122. /package/{package → dist}/components/chapter/Format.svelte.d.ts +0 -0
  123. /package/{package → dist}/components/chapter/InlineCode.svelte +0 -0
  124. /package/{package → dist}/components/chapter/InlineCode.svelte.d.ts +0 -0
  125. /package/{package → dist}/components/chapter/Label.svelte +0 -0
  126. /package/{package → dist}/components/chapter/Label.svelte.d.ts +0 -0
  127. /package/{package → dist}/components/chapter/Link.svelte +0 -0
  128. /package/{package → dist}/components/chapter/Link.svelte.d.ts +0 -0
  129. /package/{package → dist}/components/chapter/List.svelte.d.ts +0 -0
  130. /package/{package → dist}/components/chapter/Marginal.svelte.d.ts +0 -0
  131. /package/{package → dist}/components/chapter/Paragraph.svelte.d.ts +0 -0
  132. /package/{package → dist}/components/chapter/Positioned.svelte +0 -0
  133. /package/{package → dist}/components/chapter/Positioned.svelte.d.ts +0 -0
  134. /package/{package → dist}/components/chapter/Problem.svelte +0 -0
  135. /package/{package → dist}/components/chapter/Problem.svelte.d.ts +0 -0
  136. /package/{package → dist}/components/chapter/Python.svelte.d.ts +0 -0
  137. /package/{package → dist}/components/chapter/Quote.svelte.d.ts +0 -0
  138. /package/{package → dist}/components/chapter/Rule.svelte +0 -0
  139. /package/{package → dist}/components/chapter/Rule.svelte.d.ts +0 -0
  140. /package/{package → dist}/components/chapter/Table.svelte.d.ts +0 -0
  141. /package/{package → dist}/components/chapter/Text.svelte +0 -0
  142. /package/{package → dist}/components/chapter/Text.svelte.d.ts +0 -0
  143. /package/{package → dist}/components/editor/BookishEditor.svelte.d.ts +0 -0
  144. /package/{package → dist}/components/editor/CalloutEditor.svelte +0 -0
  145. /package/{package → dist}/components/editor/CalloutEditor.svelte.d.ts +0 -0
  146. /package/{package → dist}/components/editor/CaptionedCodeEditor.svelte +0 -0
  147. /package/{package → dist}/components/editor/CaptionedCodeEditor.svelte.d.ts +0 -0
  148. /package/{package → dist}/components/editor/CaretContext.d.ts +0 -0
  149. /package/{package → dist}/components/editor/CaretContext.js +0 -0
  150. /package/{package → dist}/components/editor/CaretState.d.ts +0 -0
  151. /package/{package → dist}/components/editor/CaretState.js +0 -0
  152. /package/{package → dist}/components/editor/CaretUtilities.d.ts +0 -0
  153. /package/{package → dist}/components/editor/CaretUtilities.js +0 -0
  154. /package/{package → dist}/components/editor/CaretView.svelte +0 -0
  155. /package/{package → dist}/components/editor/CaretView.svelte.d.ts +0 -0
  156. /package/{package → dist}/components/editor/CitationsEditor.svelte +0 -0
  157. /package/{package → dist}/components/editor/CitationsEditor.svelte.d.ts +0 -0
  158. /package/{package → dist}/components/editor/Clipboard.d.ts +0 -0
  159. /package/{package → dist}/components/editor/Clipboard.js +0 -0
  160. /package/{package → dist}/components/editor/Command.d.ts +0 -0
  161. /package/{package → dist}/components/editor/Command.js +0 -0
  162. /package/{package → dist}/components/editor/Commands.d.ts +0 -0
  163. /package/{package → dist}/components/editor/ConfirmButton.svelte.d.ts +0 -0
  164. /package/{package → dist}/components/editor/DefinitionEditor.svelte +0 -0
  165. /package/{package → dist}/components/editor/DefinitionEditor.svelte.d.ts +0 -0
  166. /package/{package → dist}/components/editor/EmbedEditor.svelte.d.ts +0 -0
  167. /package/{package → dist}/components/editor/Icon.svelte +0 -0
  168. /package/{package → dist}/components/editor/Icon.svelte.d.ts +0 -0
  169. /package/{package → dist}/components/editor/ImageChooser.svelte.d.ts +0 -0
  170. /package/{package → dist}/components/editor/InlineCodeEditor.svelte +0 -0
  171. /package/{package → dist}/components/editor/InlineCodeEditor.svelte.d.ts +0 -0
  172. /package/{package → dist}/components/editor/LabelEditor.svelte +0 -0
  173. /package/{package → dist}/components/editor/LabelEditor.svelte.d.ts +0 -0
  174. /package/{package → dist}/components/editor/LanguageEditor.svelte +0 -0
  175. /package/{package → dist}/components/editor/LanguageEditor.svelte.d.ts +0 -0
  176. /package/{package → dist}/components/editor/LinkEditor.svelte +0 -0
  177. /package/{package → dist}/components/editor/LinkEditor.svelte.d.ts +0 -0
  178. /package/{package → dist}/components/editor/Note.svelte +0 -0
  179. /package/{package → dist}/components/editor/Note.svelte.d.ts +0 -0
  180. /package/{package → dist}/components/editor/Permissions.svelte.d.ts +0 -0
  181. /package/{package → dist}/components/editor/PositionEditor.svelte +0 -0
  182. /package/{package → dist}/components/editor/PositionEditor.svelte.d.ts +0 -0
  183. /package/{package → dist}/components/editor/QuoteEditor.svelte +0 -0
  184. /package/{package → dist}/components/editor/QuoteEditor.svelte.d.ts +0 -0
  185. /package/{package → dist}/components/editor/Switch.svelte +0 -0
  186. /package/{package → dist}/components/editor/Switch.svelte.d.ts +0 -0
  187. /package/{package → dist}/components/editor/TableEditor.svelte +0 -0
  188. /package/{package → dist}/components/editor/TableEditor.svelte.d.ts +0 -0
  189. /package/{package → dist}/components/editor/TextEditor.svelte.d.ts +0 -0
  190. /package/{package → dist}/components/editor/Toggle.svelte.d.ts +0 -0
  191. /package/{package → dist}/components/editor/Toolbar.svelte.d.ts +0 -0
  192. /package/{package → dist}/components/editor/ToolbarGroup.svelte +0 -0
  193. /package/{package → dist}/components/editor/ToolbarGroup.svelte.d.ts +0 -0
  194. /package/{package → dist}/components/editor/ToolbarSpacer.svelte +0 -0
  195. /package/{package → dist}/components/editor/ToolbarSpacer.svelte.d.ts +0 -0
  196. /package/{package → dist}/components/editor/URLEditor.svelte +0 -0
  197. /package/{package → dist}/components/editor/URLEditor.svelte.d.ts +0 -0
  198. /package/{package → dist}/components/editor/UndoState.d.ts +0 -0
  199. /package/{package → dist}/components/editor/UndoState.js +0 -0
  200. /package/{package → dist}/components/editor/icons/annotate.svg +0 -0
  201. /package/{package → dist}/components/editor/icons/block.svg +0 -0
  202. /package/{package → dist}/components/editor/icons/bold.svg +0 -0
  203. /package/{package → dist}/components/editor/icons/bullets.svg +0 -0
  204. /package/{package → dist}/components/editor/icons/callout.svg +0 -0
  205. /package/{package → dist}/components/editor/icons/citation.svg +0 -0
  206. /package/{package → dist}/components/editor/icons/clear.svg +0 -0
  207. /package/{package → dist}/components/editor/icons/clipboard.svg +0 -0
  208. /package/{package → dist}/components/editor/icons/code.svg +0 -0
  209. /package/{package → dist}/components/editor/icons/columnafter.svg +0 -0
  210. /package/{package → dist}/components/editor/icons/columnbefore.svg +0 -0
  211. /package/{package → dist}/components/editor/icons/comment.svg +0 -0
  212. /package/{package → dist}/components/editor/icons/copy.svg +0 -0
  213. /package/{package → dist}/components/editor/icons/cut.svg +0 -0
  214. /package/{package → dist}/components/editor/icons/define.svg +0 -0
  215. /package/{package → dist}/components/editor/icons/deletecolumn.svg +0 -0
  216. /package/{package → dist}/components/editor/icons/deleterow.svg +0 -0
  217. /package/{package → dist}/components/editor/icons/footnote.svg +0 -0
  218. /package/{package → dist}/components/editor/icons/header1.svg +0 -0
  219. /package/{package → dist}/components/editor/icons/header2.svg +0 -0
  220. /package/{package → dist}/components/editor/icons/header3.svg +0 -0
  221. /package/{package → dist}/components/editor/icons/home.svg +0 -0
  222. /package/{package → dist}/components/editor/icons/indent.svg +0 -0
  223. /package/{package → dist}/components/editor/icons/italic.svg +0 -0
  224. /package/{package → dist}/components/editor/icons/label.svg +0 -0
  225. /package/{package → dist}/components/editor/icons/left.svg +0 -0
  226. /package/{package → dist}/components/editor/icons/level.svg +0 -0
  227. /package/{package → dist}/components/editor/icons/link.svg +0 -0
  228. /package/{package → dist}/components/editor/icons/list.svg +0 -0
  229. /package/{package → dist}/components/editor/icons/media.svg +0 -0
  230. /package/{package → dist}/components/editor/icons/middle.svg +0 -0
  231. /package/{package → dist}/components/editor/icons/numbers.svg +0 -0
  232. /package/{package → dist}/components/editor/icons/paragraph.svg +0 -0
  233. /package/{package → dist}/components/editor/icons/paste.svg +0 -0
  234. /package/{package → dist}/components/editor/icons/quote.svg +0 -0
  235. /package/{package → dist}/components/editor/icons/redo.svg +0 -0
  236. /package/{package → dist}/components/editor/icons/right.svg +0 -0
  237. /package/{package → dist}/components/editor/icons/rowabove.svg +0 -0
  238. /package/{package → dist}/components/editor/icons/rowbelow.svg +0 -0
  239. /package/{package → dist}/components/editor/icons/rule.svg +0 -0
  240. /package/{package → dist}/components/editor/icons/sub.svg +0 -0
  241. /package/{package → dist}/components/editor/icons/super.svg +0 -0
  242. /package/{package → dist}/components/editor/icons/table.svg +0 -0
  243. /package/{package → dist}/components/editor/icons/text.svg +0 -0
  244. /package/{package → dist}/components/editor/icons/time.svg +0 -0
  245. /package/{package → dist}/components/editor/icons/undo.svg +0 -0
  246. /package/{package → dist}/components/editor/icons/unindent.svg +0 -0
  247. /package/{package → dist}/components/editor/icons/unlink.svg +0 -0
  248. /package/{package → dist}/components/page/Acknowledgements.svelte +0 -0
  249. /package/{package → dist}/components/page/Acknowledgements.svelte.d.ts +0 -0
  250. /package/{package → dist}/components/page/Authors.svelte +0 -0
  251. /package/{package → dist}/components/page/Authors.svelte.d.ts +0 -0
  252. /package/{package → dist}/components/page/BookLoader.svelte +0 -0
  253. /package/{package → dist}/components/page/BookLoader.svelte.d.ts +0 -0
  254. /package/{package → dist}/components/page/BulkReferenceEditor.svelte +0 -0
  255. /package/{package → dist}/components/page/BulkReferenceEditor.svelte.d.ts +0 -0
  256. /package/{package → dist}/components/page/Chapter.svelte.d.ts +0 -0
  257. /package/{package → dist}/components/page/ChapterContext.d.ts +0 -0
  258. /package/{package → dist}/components/page/ChapterContext.js +0 -0
  259. /package/{package → dist}/components/page/ChapterNumber.svelte +0 -0
  260. /package/{package → dist}/components/page/ChapterNumber.svelte.d.ts +0 -0
  261. /package/{package → dist}/components/page/ChapterTitle.svelte.d.ts +0 -0
  262. /package/{package → dist}/components/page/Contexts.d.ts +0 -0
  263. /package/{package → dist}/components/page/Contexts.js +0 -0
  264. /package/{package → dist}/components/page/DefinitionView.svelte.d.ts +0 -0
  265. /package/{package → dist}/components/page/Description.svelte +0 -0
  266. /package/{package → dist}/components/page/Description.svelte.d.ts +0 -0
  267. /package/{package → dist}/components/page/Edition.svelte.d.ts +0 -0
  268. /package/{package → dist}/components/page/EditionLoader.svelte.d.ts +0 -0
  269. /package/{package → dist}/components/page/Editions.svelte.d.ts +0 -0
  270. /package/{package → dist}/components/page/Glossary.svelte +0 -0
  271. /package/{package → dist}/components/page/Glossary.svelte.d.ts +0 -0
  272. /package/{package → dist}/components/page/Header.svelte.d.ts +0 -0
  273. /package/{package → dist}/components/page/Index.svelte +0 -0
  274. /package/{package → dist}/components/page/Index.svelte.d.ts +0 -0
  275. /package/{package → dist}/components/page/Instructions.svelte +0 -0
  276. /package/{package → dist}/components/page/Instructions.svelte.d.ts +0 -0
  277. /package/{package → dist}/components/page/License.svelte +0 -0
  278. /package/{package → dist}/components/page/License.svelte.d.ts +0 -0
  279. /package/{package → dist}/components/page/Loading.svelte +0 -0
  280. /package/{package → dist}/components/page/Loading.svelte.d.ts +0 -0
  281. /package/{package → dist}/components/page/Media.svelte.d.ts +0 -0
  282. /package/{package → dist}/components/page/Muted.svelte +0 -0
  283. /package/{package → dist}/components/page/Muted.svelte.d.ts +0 -0
  284. /package/{package → dist}/components/page/Outline.svelte.d.ts +0 -0
  285. /package/{package → dist}/components/page/Page.svelte.d.ts +0 -0
  286. /package/{package → dist}/components/page/PageHeader.svelte +0 -0
  287. /package/{package → dist}/components/page/PageHeader.svelte.d.ts +0 -0
  288. /package/{package → dist}/components/page/PageParagraph.svelte +0 -0
  289. /package/{package → dist}/components/page/PageParagraph.svelte.d.ts +0 -0
  290. /package/{package → dist}/components/page/PossibleChapter.svelte +0 -0
  291. /package/{package → dist}/components/page/PossibleChapter.svelte.d.ts +0 -0
  292. /package/{package → dist}/components/page/PossibleReference.svelte +0 -0
  293. /package/{package → dist}/components/page/PossibleReference.svelte.d.ts +0 -0
  294. /package/{package → dist}/components/page/Print.svelte +0 -0
  295. /package/{package → dist}/components/page/Print.svelte.d.ts +0 -0
  296. /package/{package → dist}/components/page/Publish.svelte +0 -0
  297. /package/{package → dist}/components/page/Publish.svelte.d.ts +0 -0
  298. /package/{package → dist}/components/page/Reference.svelte.d.ts +0 -0
  299. /package/{package → dist}/components/page/References.svelte +0 -0
  300. /package/{package → dist}/components/page/References.svelte.d.ts +0 -0
  301. /package/{package → dist}/components/page/Rows.svelte +0 -0
  302. /package/{package → dist}/components/page/Rows.svelte.d.ts +0 -0
  303. /package/{package → dist}/components/page/Search.svelte.d.ts +0 -0
  304. /package/{package → dist}/components/page/Status.svelte +0 -0
  305. /package/{package → dist}/components/page/Status.svelte.d.ts +0 -0
  306. /package/{package → dist}/components/page/SubdomainEditor.svelte +0 -0
  307. /package/{package → dist}/components/page/SubdomainEditor.svelte.d.ts +0 -0
  308. /package/{package → dist}/components/page/TableOfContents.svelte.d.ts +0 -0
  309. /package/{package → dist}/components/page/TableOfContentsImage.svelte +0 -0
  310. /package/{package → dist}/components/page/TableOfContentsImage.svelte.d.ts +0 -0
  311. /package/{package → dist}/components/page/TableOfContentsRow.svelte.d.ts +0 -0
  312. /package/{package → dist}/components/page/ThemeEditor.svelte.d.ts +0 -0
  313. /package/{package → dist}/components/page/ThemeEditorPreview.svelte +0 -0
  314. /package/{package → dist}/components/page/ThemeEditorPreview.svelte.d.ts +0 -0
  315. /package/{package → dist}/components/page/ThemeSetEditor.svelte +0 -0
  316. /package/{package → dist}/components/page/ThemeSetEditor.svelte.d.ts +0 -0
  317. /package/{package → dist}/components/page/ThemeVariableEditor.svelte +0 -0
  318. /package/{package → dist}/components/page/ThemeVariableEditor.svelte.d.ts +0 -0
  319. /package/{package → dist}/components/page/Title.svelte +0 -0
  320. /package/{package → dist}/components/page/Title.svelte.d.ts +0 -0
  321. /package/{package → dist}/components/page/Unknown.svelte +0 -0
  322. /package/{package → dist}/components/page/Unknown.svelte.d.ts +0 -0
  323. /package/{package → dist}/components/page/margins.d.ts +0 -0
  324. /package/{package → dist}/components/page/margins.js +0 -0
  325. /package/{package → dist}/models/Firebase.d.ts +0 -0
  326. /package/{package → dist}/models/Firebase.js +0 -0
  327. /package/{package → dist}/models/book/Book.d.ts +0 -0
  328. /package/{package → dist}/models/book/Book.js +0 -0
  329. /package/{package → dist}/models/book/BookSaveStatus.d.ts +0 -0
  330. /package/{package → dist}/models/book/BookSaveStatus.js +0 -0
  331. /package/{package → dist}/models/book/ChapterID.d.ts +0 -0
  332. /package/{package → dist}/models/book/ChapterID.js +0 -0
  333. /package/{package → dist}/models/book/Definition.d.ts +0 -0
  334. /package/{package → dist}/models/book/Definition.js +0 -0
  335. /package/{package → dist}/models/book/Reference.d.ts +0 -0
  336. /package/{package → dist}/models/book/Reference.js +0 -0
  337. /package/{package → dist}/models/book/Schema.d.ts +0 -0
  338. /package/{package → dist}/models/book/Schema.js +0 -0
  339. /package/{package → dist}/models/book/Theme.d.ts +0 -0
  340. /package/{package → dist}/models/book/ThemeColors.d.ts +0 -0
  341. /package/{package → dist}/models/book/ThemeColors.js +0 -0
  342. /package/{package → dist}/models/book/Words.d.ts +0 -0
  343. /package/{package → dist}/models/chapter/AtomNode.d.ts +0 -0
  344. /package/{package → dist}/models/chapter/AtomNode.js +0 -0
  345. /package/{package → dist}/models/chapter/BlockNode.d.ts +0 -0
  346. /package/{package → dist}/models/chapter/BlockNode.js +0 -0
  347. /package/{package → dist}/models/chapter/BlocksNode.d.ts +0 -0
  348. /package/{package → dist}/models/chapter/BlocksNode.js +0 -0
  349. /package/{package → dist}/models/chapter/BlocksNode.test.d.ts +0 -0
  350. /package/{package → dist}/models/chapter/BlocksNode.test.js +0 -0
  351. /package/{package → dist}/models/chapter/Bookkeeping.d.ts +0 -0
  352. /package/{package → dist}/models/chapter/Bookkeeping.js +0 -0
  353. /package/{package → dist}/models/chapter/CalloutNode.d.ts +0 -0
  354. /package/{package → dist}/models/chapter/CalloutNode.js +0 -0
  355. /package/{package → dist}/models/chapter/Caret.d.ts +0 -0
  356. /package/{package → dist}/models/chapter/Caret.js +0 -0
  357. /package/{package → dist}/models/chapter/CitationsNode.d.ts +0 -0
  358. /package/{package → dist}/models/chapter/CitationsNode.js +0 -0
  359. /package/{package → dist}/models/chapter/CodeNode.d.ts +0 -0
  360. /package/{package → dist}/models/chapter/CodeNode.js +0 -0
  361. /package/{package → dist}/models/chapter/CommentNode.d.ts +0 -0
  362. /package/{package → dist}/models/chapter/CommentNode.js +0 -0
  363. /package/{package → dist}/models/chapter/DefinitionNode.d.ts +0 -0
  364. /package/{package → dist}/models/chapter/Edit.d.ts +0 -0
  365. /package/{package → dist}/models/chapter/Edit.js +0 -0
  366. /package/{package → dist}/models/chapter/EmbedNode.d.ts +0 -0
  367. /package/{package → dist}/models/chapter/EmbedNode.js +0 -0
  368. /package/{package → dist}/models/chapter/ErrorNode.d.ts +0 -0
  369. /package/{package → dist}/models/chapter/ErrorNode.js +0 -0
  370. /package/{package → dist}/models/chapter/FootnoteNode.d.ts +0 -0
  371. /package/{package → dist}/models/chapter/FootnoteNode.js +0 -0
  372. /package/{package → dist}/models/chapter/FormatNode.d.ts +0 -0
  373. /package/{package → dist}/models/chapter/FormatNode.test.d.ts +0 -0
  374. /package/{package → dist}/models/chapter/FormatNode.test.js +0 -0
  375. /package/{package → dist}/models/chapter/InlineCodeNode.d.ts +0 -0
  376. /package/{package → dist}/models/chapter/LabelNode.d.ts +0 -0
  377. /package/{package → dist}/models/chapter/LabelNode.js +0 -0
  378. /package/{package → dist}/models/chapter/LinkNode.d.ts +0 -0
  379. /package/{package → dist}/models/chapter/ListNode.d.ts +0 -0
  380. /package/{package → dist}/models/chapter/ListNode.test.d.ts +0 -0
  381. /package/{package → dist}/models/chapter/ListNode.test.js +0 -0
  382. /package/{package → dist}/models/chapter/MetadataNode.d.ts +0 -0
  383. /package/{package → dist}/models/chapter/MetadataNode.js +0 -0
  384. /package/{package → dist}/models/chapter/Node.d.ts +0 -0
  385. /package/{package → dist}/models/chapter/Node.js +0 -0
  386. /package/{package → dist}/models/chapter/Node.test.d.ts +0 -0
  387. /package/{package → dist}/models/chapter/Node.test.js +0 -0
  388. /package/{package → dist}/models/chapter/ParagraphNode.d.ts +0 -0
  389. /package/{package → dist}/models/chapter/ParagraphNode.js +0 -0
  390. /package/{package → dist}/models/chapter/ParagraphNode.test.d.ts +0 -0
  391. /package/{package → dist}/models/chapter/ParagraphNode.test.js +0 -0
  392. /package/{package → dist}/models/chapter/Parser.d.ts +0 -0
  393. /package/{package → dist}/models/chapter/Parser.test.d.ts +0 -0
  394. /package/{package → dist}/models/chapter/Parser.test.js +0 -0
  395. /package/{package → dist}/models/chapter/Position.d.ts +0 -0
  396. /package/{package → dist}/models/chapter/Position.js +0 -0
  397. /package/{package → dist}/models/chapter/QuoteNode.d.ts +0 -0
  398. /package/{package → dist}/models/chapter/QuoteNode.js +0 -0
  399. /package/{package → dist}/models/chapter/RootNode.d.ts +0 -0
  400. /package/{package → dist}/models/chapter/RootNode.js +0 -0
  401. /package/{package → dist}/models/chapter/RuleNode.d.ts +0 -0
  402. /package/{package → dist}/models/chapter/RuleNode.js +0 -0
  403. /package/{package → dist}/models/chapter/TableNode.d.ts +0 -0
  404. /package/{package → dist}/models/chapter/TableNode.js +0 -0
  405. /package/{package → dist}/models/chapter/TableNode.test.d.ts +0 -0
  406. /package/{package → dist}/models/chapter/TableNode.test.js +0 -0
  407. /package/{package → dist}/models/chapter/TextNode.d.ts +0 -0
  408. /package/{package → dist}/models/chapter/TextNode.js +0 -0
  409. /package/{package → dist}/models/chapter/TextNode.test.d.ts +0 -0
  410. /package/{package → dist}/models/chapter/TextNode.test.js +0 -0
  411. /package/{package → dist}/util/dark.d.ts +0 -0
  412. /package/{package → dist}/util/dark.js +0 -0
  413. /package/{package → dist}/util/getSubdomain.d.ts +0 -0
  414. /package/{package → dist}/util/getSubdomain.js +0 -0
  415. /package/{package → dist}/util/isMobile.d.ts +0 -0
  416. /package/{package → dist}/util/isMobile.js +0 -0
  417. /package/{package → dist}/util/mineReference.d.ts +0 -0
  418. /package/{package → dist}/util/mineReference.js +0 -0
  419. /package/{package → dist}/util/scrollToEyeLevel.d.ts +0 -0
  420. /package/{package → dist}/util/scrollToEyeLevel.js +0 -0
@@ -28,6 +28,8 @@ async function addEditor() {
28
28
  }
29
29
  }
30
30
  function hasEditor(email) {
31
+ if (email.length === 0)
32
+ return false;
31
33
  const match = Array.from($emails.entries()).find(([, e]) => e === email);
32
34
  if (match === undefined)
33
35
  return false;
@@ -24,7 +24,7 @@ $: {
24
24
  // them with non-breaking spaces.
25
25
  const sizedText = showPlaceholder()
26
26
  ? placeholder
27
- : text.replace(/\s/g, '\u00a0');
27
+ : text.replace(/\s$/g, '\u00a0');
28
28
  // Clip the text to prevent this editor from getting too long when editing. If it goes past one line,
29
29
  // the measurements and layout are way off.
30
30
  const trimmedText = width !== undefined &&
@@ -111,7 +111,6 @@ function handleKeyPress(event) {
111
111
  bind:this={field}
112
112
  bind:value={text}
113
113
  required
114
- role="textbox"
115
114
  aria-invalid={error !== undefined}
116
115
  aria-label={label}
117
116
  aria-placeholder={label}
@@ -136,6 +135,8 @@ function handleKeyPress(event) {
136
135
  <style>
137
136
  .text-editor {
138
137
  position: relative;
138
+ display: inline-block;
139
+ max-width: 100%;
139
140
  }
140
141
 
141
142
  input[type='text'] {
@@ -175,6 +176,8 @@ function handleKeyPress(event) {
175
176
 
176
177
  /* This ensures the error message always appears below empty text editors */
177
178
  .sizer {
179
+ display: inline-block;
180
+ max-width: 100%;
178
181
  min-height: 1em;
179
182
  opacity: 0;
180
183
  border: none;
@@ -24,7 +24,7 @@ function toggle() {
24
24
  class={`bookish-app-interactive ${
25
25
  saving === Status.Saving ? ' bookish-text-editor-saving' : ''
26
26
  } ${saving === Status.Error ? ' bookish-text-editor-error' : ''}`}
27
- tabIndex="0"
27
+ tabindex="0"
28
28
  role="switch"
29
29
  aria-checked={on}
30
30
  on:keydown={(event) =>
@@ -154,10 +154,11 @@ function handleKeyPress(event) {
154
154
  <section
155
155
  class="bookish-editor-toolbar"
156
156
  bind:this={element}
157
+ role="button"
157
158
  on:keypress={handleKeyPress}
158
159
  on:keydown={handleKeyPress}
159
160
  on:mousedown|stopPropagation={() => element?.focus()}
160
- tabIndex="0"
161
+ tabindex="0"
161
162
  transition:slide={{ duration: 200 }}
162
163
  >
163
164
  {#if context && categories}
@@ -361,7 +361,7 @@ let editable = isBookEditable() ||
361
361
  {/if}
362
362
 
363
363
  {#if editable || isEditionPartiallyEditable()}
364
- <PageHeader>Editors</PageHeader>
364
+ <PageHeader id="editors">Editors</PageHeader>
365
365
  <Instructions {editable}
366
366
  >These authors can edit this chapter. Add an email here to
367
367
  provide chapter-level edit permissions.</Instructions
@@ -11,6 +11,8 @@ export let link = undefined;
11
11
  <style>
12
12
  h3 {
13
13
  font-family: var(--bookish-header-font-family);
14
+ /* Disable heavy weight in this context. */
15
+ font-weight: normal;
14
16
  margin: 0;
15
17
  }
16
18
  </style>
@@ -5,13 +5,13 @@ import BookishEditor from '../editor/BookishEditor.svelte';
5
5
  import Format from '../chapter/Format.svelte';
6
6
  import Note from '../editor/Note.svelte';
7
7
  import { afterUpdate } from 'svelte';
8
- import { getUser, getEdition, getLeasee, isChapterEditable, lease, } from './Contexts';
8
+ import { getUser, getEdition, getLeasee, isChapterEditable, lease, isEditionEditable, } from './Contexts';
9
9
  import Button from '../app/Button.svelte';
10
10
  export let id;
11
11
  export let definition;
12
12
  let auth = getUser();
13
13
  let edition = getEdition();
14
- let editable = isChapterEditable();
14
+ let editable = isEditionEditable();
15
15
  // Focus after adding a new synonym.
16
16
  let newSynonym = false;
17
17
  let synonymsEditor = null;
@@ -36,6 +36,23 @@ function addSynonym() {
36
36
  }
37
37
  newSynonym = true;
38
38
  }
39
+ function removeSynonym(index) {
40
+ if (definition.synonyms &&
41
+ index >= 0 &&
42
+ index < definition.synonyms.length)
43
+ updateSynonyms([
44
+ ...definition.synonyms.slice(0, index),
45
+ ...definition.synonyms.slice(index + 1),
46
+ ]);
47
+ }
48
+ function updateSynonyms(synonyms) {
49
+ if ($edition)
50
+ edition.set($edition.withEditedDefinition(id, {
51
+ phrase: definition.phrase,
52
+ definition: definition.definition,
53
+ synonyms: synonyms,
54
+ }));
55
+ }
39
56
  $: syns = definition.synonyms || [];
40
57
  </script>
41
58
 
@@ -67,11 +84,11 @@ $: syns = definition.synonyms || [];
67
84
  {#if editable}
68
85
  <ConfirmButton
69
86
  tooltip="delete definition of {definition.phrase}"
70
- confirm="remove definition?"
87
+ confirm="delete entry"
71
88
  command={() =>
72
89
  $edition
73
90
  ? edition.set($edition.withoutDefinition(id))
74
- : undefined}>- definition</ConfirmButton
91
+ : undefined}>⨉</ConfirmButton
75
92
  >
76
93
  {/if}
77
94
  </dt>
@@ -111,40 +128,26 @@ $: syns = definition.synonyms || [];
111
128
  {/if}
112
129
  {#if edition && editable}
113
130
  <span bind:this={synonymsEditor}>
114
- {#if syns.length === 0}
115
- <Note>no synonyms</Note>
116
- {:else}
117
- {#each syns as syn, index}
118
- <Note>
119
- <TextEditor
120
- text={syn}
121
- label={'Synonym editor.'}
122
- placeholder="synonym"
123
- valid={() => undefined}
124
- save={(text) => {
125
- const newSyns = [...syns];
126
- // Remove the synonym if it's empty but wasn't before
127
- if (syn.length > 0 && text.length === 0)
128
- newSyns.splice(index, 1);
129
- else newSyns[index] = text;
130
- if ($edition)
131
- edition.set(
132
- $edition.withEditedDefinition(
133
- id,
134
- {
135
- phrase: definition.phrase,
136
- definition:
137
- definition.definition,
138
- synonyms: newSyns,
139
- }
140
- )
141
- );
142
- }}
143
- />
144
- </Note>
145
- {#if syns.length > 1 && index < syns.length - 1},&nbsp;{/if}
146
- {/each}
147
- {/if}
131
+ {#each syns as syn, index}
132
+ <Note>
133
+ <TextEditor
134
+ text={syn}
135
+ label={'Synonym editor.'}
136
+ placeholder="synonym"
137
+ valid={() => undefined}
138
+ save={(text) => {
139
+ const newSyns = [...syns];
140
+ newSyns[index] = text;
141
+ updateSynonyms(newSyns);
142
+ }}
143
+ />
144
+ <Button
145
+ tooltip="delete synonym"
146
+ command={() => removeSynonym(index)}>x</Button
147
+ >
148
+ </Note>
149
+ {#if syns.length > 1 && index < syns.length - 1},&nbsp;{/if}
150
+ {/each}
148
151
  </span>&nbsp;<Button tooltip="add synonym" command={addSynonym}
149
152
  >+ synonym</Button
150
153
  >
@@ -162,6 +165,8 @@ $: syns = definition.synonyms || [];
162
165
  }
163
166
 
164
167
  dt {
168
+ font-family: var(--bookish-header-font-family);
165
169
  font-weight: bold;
170
+ vertical-align: baseline;
166
171
  }
167
172
  </style>
@@ -0,0 +1,127 @@
1
+ <script>import smoothscroll from 'smoothscroll-polyfill';
2
+ import { goto } from '$app/navigation';
3
+ import { onMount, setContext, tick } from 'svelte';
4
+ import { writable } from 'svelte/store';
5
+ import { BASE, DARK_MODE, getBook, } from './Contexts';
6
+ import { BookishTheme } from '../../models/book/Theme';
7
+ import { isDark, setDark } from '../../util/dark';
8
+ import { page } from '$app/stores';
9
+ // Poly fill smooth scrolling for Safari.
10
+ onMount(() => smoothscroll.polyfill());
11
+ // The book edition to render.
12
+ export let edition;
13
+ // 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 "/",
15
+ // but when the book is being viewed or edited in the Bookish app, it needs a prefix for the
16
+ // route in the app.
17
+ export let base = '';
18
+ let book = getBook();
19
+ // When the base changes, update the context.
20
+ let baseStore = writable(base);
21
+ $: setContext(BASE, baseStore);
22
+ $: baseStore.set(base);
23
+ // Default dark mode to whatever's stored in local storage, if anything.
24
+ // respect user choice on the website despite the system theme
25
+ let darkMode = writable(isDark());
26
+ // Expose dark mode to descendants
27
+ setContext(DARK_MODE, darkMode);
28
+ // When dark mode changes, update the body's class list.
29
+ $: {
30
+ setDark($darkMode);
31
+ // Set the theme, whatever it is, and change it when the edition changes
32
+ setTheme(edition.getTheme() ?? BookishTheme);
33
+ }
34
+ // The CSS to set on the edition.
35
+ let themeCSS;
36
+ // Set the theme on mount.
37
+ onMount(() => {
38
+ setTheme(edition.getTheme() ?? BookishTheme);
39
+ });
40
+ // Redirect old hash routes by simply replacing their hash before routing.
41
+ if (typeof window !== 'undefined' && window.location.hash.startsWith('#/'))
42
+ goto(location.hash.replace('#', ''));
43
+ /** Given a theme, sets the appropriate CSS rules in the browser to apply the theme. */
44
+ function setTheme(theme) {
45
+ if (theme === null)
46
+ theme = BookishTheme;
47
+ themeCSS = `
48
+ ${(theme.imports ?? [])
49
+ .map((url) => `@import url(${url});`)
50
+ .join('\n')}
51
+ .bookish {
52
+ ${theme.light ? toRules(theme.light) : ''}
53
+ ${theme.fonts ? toRules(theme.fonts) : ''}
54
+ ${theme.sizes ? toRules(theme.sizes) : ''}
55
+ ${theme.weights ? toRules(theme.weights) : ''}
56
+ ${theme.spacing ? toRules(theme.spacing) : ''}
57
+ }
58
+ .dark {
59
+ ${theme.dark ? toRules(theme.dark) : ''}
60
+ }
61
+ `;
62
+ }
63
+ function toRules(set) {
64
+ return Object.keys(set)
65
+ .map((name) => {
66
+ const value = set[name];
67
+ if (value.length > 0) {
68
+ const cssVariable = '--bookish-' +
69
+ name
70
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
71
+ .split(' ')
72
+ .map((s) => s.toLowerCase())
73
+ .join('-')
74
+ .replace(/([0-9])/g, '-$1-');
75
+ return `${cssVariable}: ${value};`;
76
+ }
77
+ })
78
+ .join('\n\t\t');
79
+ }
80
+ </script>
81
+
82
+ <!-- Keep the imports up to date -->
83
+ <svelte:head>
84
+ {@html '<' + `style>${themeCSS}</style>`}
85
+
86
+ <meta property="og:title" content={edition.getTitle()} />
87
+ <meta property="og:image" content={edition.getImage('cover')} />
88
+ <meta property="og:description" content={edition.getDescription()} />
89
+ <meta property="og:type" content="book" />
90
+ <meta property="og:author" content={edition.getAuthorsText()} />
91
+ <meta
92
+ property="og:url"
93
+ content={edition.base ??
94
+ `https://bookish.press/${
95
+ $book && $book.domain ? $book.domain : $page.params.bookid
96
+ }`}
97
+ />
98
+ </svelte:head>
99
+
100
+ <main class="bookish {$darkMode ? ' dark' : ''}">
101
+ <slot />
102
+ </main>
103
+
104
+ <style>
105
+ * {
106
+ box-sizing: border-box;
107
+ }
108
+
109
+ /* WINDOW AND PAGES */
110
+ :global(body) {
111
+ margin: 0;
112
+ padding: 0;
113
+ background-color: var(--bookish-background-color);
114
+ }
115
+
116
+ /* The root container for a book */
117
+ .bookish {
118
+ font-weight: var(--bookish-paragraph-font-weight);
119
+ font-family: var(--bookish-paragraph-font-family);
120
+ font-size: var(--bookish-paragraph-font-size);
121
+ background-color: var(--bookish-background-color);
122
+ color: var(--bookish-paragraph-color);
123
+ width: 100%;
124
+ z-index: 0;
125
+ text-align: left;
126
+ }
127
+ </style>
@@ -4,7 +4,7 @@ import Feedback from '../app/Feedback.svelte';
4
4
  import { getBook, getEdition, getUser, getChapterText, } from './Contexts';
5
5
  import { onDestroy } from 'svelte';
6
6
  import { page } from '$app/stores';
7
- import { listenToChapters, listenToEdition } from '../../models/CRUD';
7
+ import { deleteChapterText, listenToChapters, listenToEdition, } from '../../models/CRUD';
8
8
  export let write;
9
9
  let auth = getUser();
10
10
  let book = getBook();
@@ -67,8 +67,17 @@ function listen() {
67
67
  // Update the chapter text store.
68
68
  chapterText.set(chapters);
69
69
  // Update the chapter text in the current edition.
70
- if ($edition)
71
- edition.set($edition.withChapterText(chapters));
70
+ if ($edition) {
71
+ const newEdition = $edition.withChapterText(chapters);
72
+ if (newEdition !== $edition)
73
+ edition.set(newEdition);
74
+ // Get all the chapters in the updated chapter list and
75
+ // delete the ones not referenced by the edition.
76
+ chapters
77
+ .filter(([ref]) => $edition &&
78
+ !$edition.hasChapterRefID(ref.id))
79
+ .forEach(([ref]) => deleteChapterText(ref));
80
+ }
72
81
  });
73
82
  }
74
83
  }
@@ -84,7 +84,7 @@ async function handleDraftEdition() {
84
84
  undefined,
85
85
  edition.summary
86
86
  )}
87
- />{:else}&mdash{/if}</p
87
+ />{:else}&mdash;{/if}</p
88
88
  >
89
89
  </section>
90
90
  {/if}
@@ -54,80 +54,84 @@ let embed;
54
54
  $: embed = getImage();
55
55
  </script>
56
56
 
57
- <header class="bookish-chapter-header">
58
- {#if embed}
59
- <div class="bookish-figure-full">
60
- {#if $edition && editable}
61
- <BookishEditor
62
- text={embed}
63
- parser={(text) => Parser.parseEmbed($edition, text)}
64
- save={(node) =>
65
- setImage ? setImage(node.toBookdown()) : undefined}
66
- chapter={false}
67
- component={Embed}
68
- placeholder=""
69
- leasee={getLeasee(auth, edition, `embed-${id}`)}
70
- lease={(lock) => lease(auth, edition, `embed-${id}`, lock)}
71
- />
72
- {:else}
73
- <Embed
74
- node={Parser.parseEmbed($edition, embed)}
75
- editable={false}
76
- />
77
- {/if}
78
- {#if !print && showReminder}
79
- <div class="bookish-scroll-reminder" />
80
- {/if}
81
- </div>
82
- {:else}
83
- <!-- Add a bit of space to account for the lack of an image. -->
84
- <p>&nbsp;</p>
85
- {/if}
86
- {#if !print}
87
- <slot name="outline" />
88
- {/if}
89
- {#if editable}
90
- {#if embed === null}
91
- <Button tooltip="add cover image" command={addCover}
92
- >+ cover image</Button
93
- >
57
+ <!-- We key on the chapter ID to avoid laggy updates from image loading -->
58
+ {#key id}
59
+ <header class="bookish-chapter-header">
60
+ {#if embed}
61
+ <div class="bookish-figure-full">
62
+ {#if $edition && editable}
63
+ <BookishEditor
64
+ text={embed}
65
+ parser={(text) => Parser.parseEmbed($edition, text)}
66
+ save={(node) =>
67
+ setImage ? setImage(node.toBookdown()) : undefined}
68
+ chapter={false}
69
+ component={Embed}
70
+ placeholder=""
71
+ leasee={getLeasee(auth, edition, `embed-${id}`)}
72
+ lease={(lock) =>
73
+ lease(auth, edition, `embed-${id}`, lock)}
74
+ />
75
+ {:else}
76
+ <Embed
77
+ node={Parser.parseEmbed($edition, embed)}
78
+ editable={false}
79
+ />
80
+ {/if}
81
+ {#if !print && showReminder}
82
+ <div class="bookish-scroll-reminder" />
83
+ {/if}
84
+ </div>
94
85
  {:else}
95
- <ConfirmButton
96
- confirm="remove image?"
97
- tooltip="remove cover image"
98
- command={removeCover}>- cover image</ConfirmButton
99
- >
86
+ <!-- Add a bit of space to account for the lack of an image. -->
87
+ <p>&nbsp;</p>
100
88
  {/if}
101
- {/if}
102
- <div bind:this={title} class="bookish-chapter-header-text">
103
- <slot name="before" />
104
- <Title>
105
- {#if editable && save}
106
- <TextEditor
107
- {label}
108
- text={header + (subtitle ? ': ' + subtitle : '')}
109
- placeholder="title"
110
- valid={(text) =>
111
- text.length === 0
112
- ? 'Titles have to be at least one character long.'
113
- : undefined}
114
- {save}
115
- />
89
+ {#if !print}
90
+ <slot name="outline" />
91
+ {/if}
92
+ {#if editable}
93
+ {#if embed === null}
94
+ <Button tooltip="add cover image" command={addCover}
95
+ >+ cover image</Button
96
+ >
116
97
  {:else}
117
- {header}
118
- {#if subtitle}<div class="bookish-subtitle">{subtitle}</div
119
- >{/if}
98
+ <ConfirmButton
99
+ confirm="delete image"
100
+ tooltip="delete cover image"
101
+ command={removeCover}>- cover image</ConfirmButton
102
+ >
120
103
  {/if}
121
- </Title>
122
- <slot name="after" />
123
- {#if tags}
124
- <div
125
- >{#each tags as tag}<span class="bookish-tag">{tag}</span
126
- >{/each}</div
127
- >
128
104
  {/if}
129
- </div>
130
- </header>
105
+ <div bind:this={title} class="bookish-chapter-header-text">
106
+ <slot name="before" />
107
+ <Title>
108
+ {#if editable && save}
109
+ <TextEditor
110
+ {label}
111
+ text={header + (subtitle ? ': ' + subtitle : '')}
112
+ placeholder="title"
113
+ valid={(text) =>
114
+ text.length === 0
115
+ ? 'Titles have to be at least one character long.'
116
+ : undefined}
117
+ {save}
118
+ />
119
+ {:else}
120
+ {header}
121
+ {#if subtitle}<div class="bookish-subtitle">{subtitle}</div
122
+ >{/if}
123
+ {/if}
124
+ </Title>
125
+ <slot name="after" />
126
+ {#if tags}
127
+ <div
128
+ >{#each tags as tag}<span class="bookish-tag">{tag}</span
129
+ >{/each}</div
130
+ >
131
+ {/if}
132
+ </div>
133
+ </header>
134
+ {/key}
131
135
 
132
136
  <style>
133
137
  .bookish-subtitle {
@@ -24,7 +24,7 @@ onMount(() => {
24
24
  media?.notify(updateImages);
25
25
  return () => media?.stopNotifying(updateImages);
26
26
  });
27
- $: unused = images?.filter((image) => embeds.find((embed) => embed.getURL() === image.url) === undefined);
27
+ $: unused = images?.filter((image) => !embeds.some((embed) => image.url.includes(embed.embed.getURL())));
28
28
  </script>
29
29
 
30
30
  {#if $edition}
@@ -59,9 +59,10 @@ $: unused = images?.filter((image) => embeds.find((embed) => embed.getURL() ===
59
59
  {:else}
60
60
  <p>These are the images in the book:</p>
61
61
  {/if}
62
- {#each embeds as embed}
62
+ {#each embeds as { embed, chapterID }}
63
63
  {#if !embed.isVideo()}
64
64
  <MediaPreview
65
+ {chapterID}
65
66
  url={embed.isLocal()
66
67
  ? `${$base}/${embed.getSmallURL()}`
67
68
  : embed.getSmallURL()}
@@ -89,10 +90,10 @@ $: unused = images?.filter((image) => embeds.find((embed) => embed.getURL() ===
89
90
  be used in other editions of this book.
90
91
  </Instructions>
91
92
  {#each unused as image}
92
- <MediaPreview url={image.url} alt={''}>
93
+ <MediaPreview chapterID={undefined} url={image.url} alt={''}>
93
94
  <ConfirmButton
94
95
  tooltip="delete unused image"
95
- confirm="delete image?"
96
+ confirm="delete image"
96
97
  command={() =>
97
98
  media
98
99
  ?.remove(image)
@@ -1,9 +1,13 @@
1
- <script>export let url;
1
+ <script>import Link from '../Link.svelte';
2
+ import { getBase } from './Contexts';
3
+ export let url;
2
4
  export let alt;
5
+ export let chapterID;
6
+ let base = getBase();
3
7
  let loaded;
4
8
  let urlChecked;
5
9
  $: {
6
- if (urlChecked !== url) {
10
+ if (urlChecked !== url && typeof Image !== 'undefined') {
7
11
  urlChecked = url;
8
12
  let image = new Image();
9
13
  image.src = url;
@@ -18,7 +22,9 @@ $: {
18
22
 
19
23
  <figure class={'media-preview'}>
20
24
  {#if loaded}
21
- <img src={url.startsWith('http') ? url : `${url}`} {alt} />
25
+ <Link to={`${$base}/${chapterID}`} linked={chapterID !== undefined}
26
+ ><img src={url.startsWith('http') ? url : `${url}`} {alt} /></Link
27
+ >
22
28
  {:else if loaded === null}
23
29
  <div class="missing">missing image</div>
24
30
  {/if}
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  url: string;
5
5
  alt: string;
6
+ chapterID: string | undefined;
6
7
  };
7
8
  events: {
8
9
  [evt: string]: CustomEvent<any>;
@@ -129,7 +129,7 @@ let expandLabel = '\u2630';
129
129
  aria-label={expanded
130
130
  ? 'Collapse navigation menu'
131
131
  : 'Expand navigation menu'}
132
- tabIndex="0"
132
+ tabindex="0"
133
133
  on:click={headers.length > 0 ? toggleExpanded : undefined}
134
134
  on:keydown={(event) => {
135
135
  if (event.key === 'Enter' || event.key === ' ')
@@ -2,10 +2,12 @@
2
2
  import Loading from './Loading.svelte';
3
3
  export let title;
4
4
  export let afterLoaded = undefined;
5
- let loaded = false;
5
+ let fontsLoaded = false;
6
+ let imagesLoaded = false;
6
7
  let lastHeight = 0;
7
8
  let intervalID = null;
8
9
  let mountTime = Date.now();
10
+ $: loaded = fontsLoaded && imagesLoaded;
9
11
  function watchLoading() {
10
12
  const bodyHeight = document.body.clientHeight;
11
13
  // If the height hasn't changed and images are loaded OR it's been 2 seconds, load.
@@ -14,7 +16,7 @@ function watchLoading() {
14
16
  // Stop watching the images
15
17
  stopWatching();
16
18
  // Set to loaded to hide the overlay and notify callback if there is one.
17
- loaded = true;
19
+ imagesLoaded = true;
18
20
  if (afterLoaded)
19
21
  afterLoaded();
20
22
  }
@@ -29,6 +31,7 @@ onMount(() => {
29
31
  // Watch the height of the document and wait until it's been stable for a while before scrolling
30
32
  // to any targets. We use the data below to monitor the document height over time.
31
33
  intervalID = setInterval(() => watchLoading(), 50);
34
+ document.fonts.ready.then(() => (fontsLoaded = true));
32
35
  return () => stopWatching();
33
36
  });
34
37
  function imagesAreLoaded() {
@@ -45,7 +48,7 @@ function imagesAreLoaded() {
45
48
  <meta name="description" content={title} />
46
49
  </svelte:head>
47
50
 
48
- <section class={'bookish-page' + (loaded ? ' loaded' : '')}>
51
+ <section class={'bookish-page' + (imagesLoaded ? ' loaded' : '')}>
49
52
  <slot />
50
53
  </section>
51
54
  <!-- Overlay loading feedback if loading, but still render the page. -->