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
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Bookish
2
2
 
3
- Bookish is a simple framework and platforem for publishing online books. I originally created it to make it easier to maintain the many online books on my website (amyjko.com), while adding more sophisticated features to support reading. I'm slowly evolving it to be a simple free online service for authoring and reading online books.
3
+ Bookish is a framework and platform for writing and publishing web-based books. I originally created it to make it easier to maintain the many online books on my website (amyjko.com), while adding more sophisticated features to support reading. I'm slowly evolving it to be a simple free online service for authoring and reading online books.
4
4
 
5
- ## Project Status
5
+ ## Status
6
6
 
7
- This is very much an alpha that I use for my own book publishing. I have aspirations to make it usable for others in the future. Expect slow progress while I sneak in programming time on evenings and weekends. You can see where I'm headed by reading the issues and Backend project, which are somewhat organized.
7
+ I'm working on a beta launch of the platform at [bookish.press](https://bookish.press) and expect to maintain the platform for the foreseeable future. Let me know if you'd like to help!
@@ -60,6 +60,7 @@ $: url =
60
60
  text-align: left;
61
61
  flex-wrap: wrap;
62
62
  height: 12em;
63
+ overflow-y: hidden;
63
64
  }
64
65
 
65
66
  .cover {
@@ -25,7 +25,6 @@ export let node;
25
25
  padding-bottom: var(--bookish-paragraph-spacing);
26
26
  line-height: var(--bookish-paragraph-line-height-tight);
27
27
  clear: both;
28
- position: relative;
29
28
  }
30
29
 
31
30
  .bookish-callout :global(h2),
@@ -110,8 +110,6 @@ afterUpdate(() => $chapter?.layoutMarginals());
110
110
  .bookish-references .bookish-reference {
111
111
  display: block;
112
112
  line-height: var(--bookish-paragraph-line-height-tight);
113
- margin-left: 1rem;
114
- margin-bottom: 1rem;
115
113
  text-align: left;
116
114
  }
117
115
 
@@ -125,7 +123,6 @@ afterUpdate(() => $chapter?.layoutMarginals());
125
123
  .bookish-reference .bookish-citation-symbol {
126
124
  display: block;
127
125
  float: left;
128
- margin-top: -0.5em;
129
126
  position: absolute;
130
127
  left: -1.75em;
131
128
  text-align: right;
@@ -1,11 +1,11 @@
1
1
  <svelte:options immutable={true} />
2
2
 
3
3
  <script>import { storage } from '../../models/Firebase';
4
- import { getCaret, getBook, getBase } from '../page/Contexts';
4
+ import { getCaret, getBook, getBase, isEditionEditable, } from '../page/Contexts';
5
5
  import Figure from './Figure.svelte';
6
6
  import { getContext } from 'svelte';
7
7
  export let node;
8
- export let editable = false;
8
+ export let editable = true;
9
9
  export let placeholder = '';
10
10
  export let imageOnly = false;
11
11
  $: url = node.getURL();
@@ -13,6 +13,7 @@ $: description = node.getDescription();
13
13
  let caret = getCaret();
14
14
  let book = getBook();
15
15
  let base = getBase();
16
+ let editionEditable = isEditionEditable();
16
17
  // Bookish editor should have passed down a way to set the active editor.
17
18
  let claimCaret = getContext('claimeditor');
18
19
  let dragging = false;
@@ -94,13 +95,14 @@ function handleClick() {
94
95
  credit={imageOnly ? undefined : node.getCredit()}
95
96
  >
96
97
  {#if url.trim().length === 0}
97
- {#if editable}
98
- <p
98
+ {#if editable && editionEditable}
99
+ <div
100
+ role="button"
99
101
  class={`bookish-figure-unspecified ${
100
102
  dragging ? 'bookish-figure-dragging' : ''
101
103
  }`}
102
104
  on:click|preventDefault={handleClick}
103
- tabIndex="0"
105
+ tabindex="0"
104
106
  on:keydown={(event) =>
105
107
  event.key === ' ' || event.key === 'Enter'
106
108
  ? handleClick()
@@ -113,7 +115,7 @@ function handleClick() {
113
115
  : placeholder.length > 0
114
116
  ? placeholder
115
117
  : 'Click or drag to choose or upload an image, or enter an image or video URL.'}
116
- </p>
118
+ </div>
117
119
  {:else}
118
120
  <p class="bookish-figure-unspecified">No image or video</p>
119
121
  {/if}
@@ -0,0 +1,2 @@
1
+ export default Prism;
2
+ import Prism from 'prismjs';
@@ -32,6 +32,8 @@ function focusFigure() {
32
32
  <figure class="bookish-figure" data-nodeid={node.nodeID}>
33
33
  <div
34
34
  class:selected
35
+ role="button"
36
+ tabindex="0"
35
37
  on:mousedown={focusFigure}
36
38
  on:keydown={(event) =>
37
39
  event.key === ' ' || event.key === 'Enter'
@@ -70,7 +72,6 @@ function focusFigure() {
70
72
 
71
73
  .caption {
72
74
  text-align: center;
73
- position: relative;
74
75
  color: var(--bookish-muted-color);
75
76
  line-height: var(--bookish-paragraph-line-height-tight);
76
77
  font-size: var(--bookish-block-font-size);
@@ -67,6 +67,7 @@ afterUpdate(() => $chapter?.layoutMarginals());
67
67
  font-weight: 300;
68
68
  font-size: var(--bookish-small-font-size);
69
69
  /* line-height: 1.5em; */
70
+ text-align: left;
70
71
  }
71
72
 
72
73
  .bookish-footnote-symbol {
@@ -24,50 +24,33 @@ export let node;
24
24
  line-height: var(--bookish-paragraph-line-height-tight);
25
25
  }
26
26
 
27
- ol {
28
- list-style: none;
29
- counter-reset: item;
27
+ li {
28
+ margin-bottom: calc(0.5 * var(--bookish-paragraph-spacing));
30
29
  }
31
30
 
32
- ol > li {
33
- counter-increment: item;
31
+ /* Lists are decimal numbered */
32
+ ol {
33
+ list-style: decimal;
34
34
  }
35
35
 
36
- ol > li {
37
- list-style-type: none;
36
+ /* First level is decimal */
37
+ ol li {
38
+ counter-increment: list-item;
39
+ list-style-type: decimal;
38
40
  }
39
41
 
40
- ol > :global(ol > li) {
41
- list-style-type: none;
42
+ /* Second level is lowercase alpha */
43
+ ol ol li {
44
+ list-style-type: lower-alpha;
42
45
  }
43
46
 
44
- ol > :global(ol > ol > li) {
45
- list-style-type: none;
47
+ /* Third level is uppercase alpha */
48
+ ol ol ol li {
49
+ list-style-type: upper-alpha;
46
50
  }
47
51
 
48
- ol > :global(li::before),
49
- ul > :global(ol > li::before),
50
- ul > :global(ul > ol > li::before) {
51
- content: counter(item) '. ';
52
+ ol li::marker {
52
53
  color: var(--bookish-bullet-color);
53
- display: inline-block;
54
- width: 1em;
55
- margin-left: -1.5rem;
56
- margin-right: 0.5rem;
57
- text-align: right;
58
- }
59
-
60
- ol > :global(ol > li::before),
61
- ul > :global(ol > ol > li::before) {
62
- content: counter(item, lower-alpha) '. ';
63
- }
64
-
65
- ol > :global(ol > ol > li:before) {
66
- content: counter(item, upper-alpha) '. ';
67
- }
68
-
69
- li {
70
- margin-bottom: calc(0.5 * var(--bookish-paragraph-spacing));
71
54
  }
72
55
 
73
56
  ul li {
@@ -66,6 +66,8 @@ onMount(() => {
66
66
  editable ? '' : 'interactive'
67
67
  }`}
68
68
  aria-label={label}
69
+ role="button"
70
+ tabindex="0"
69
71
  on:mousedown={(event) => toggle(event, true)}
70
72
  on:keydown={(event) =>
71
73
  event.key === 'Enter' || event.key === ' '
@@ -77,7 +79,8 @@ onMount(() => {
77
79
  class={'bookish-marginal' +
78
80
  (isHidden ? ' bookish-marginal-hidden' : '') +
79
81
  (hovered ? ' bookish-marginal-hovered' : '')}
80
- tabIndex={editable ? null : 0}
82
+ role="button"
83
+ tabindex={editable ? null : 0}
81
84
  on:mousedown={() => toggle(undefined, false)}
82
85
  on:keydown={(event) =>
83
86
  event.key === 'Enter' || event.key === ' '
@@ -19,10 +19,15 @@ $: classes =
19
19
  ($chapter && $chapter.highlightedID === id
20
20
  ? ' bookish-content-highlight'
21
21
  : '');
22
+ $: firstParagraph = $root.getFirstParagraph();
23
+ $: dropcap =
24
+ placeholder === undefined &&
25
+ node === firstParagraph &&
26
+ /^[a-zA-Z]/.test(firstParagraph.getFirstTextNode().getText());
22
27
  </script>
23
28
 
24
29
  {#if level === 0}
25
- <p data-nodeid={node.nodeID} class:placeholder
30
+ <p data-nodeid={node.nodeID} class:placeholder class:dropcap
26
31
  ><Format node={node.getFormat()} placeholder={placeholder ?? '¶'} /></p
27
32
  >
28
33
  {:else}
@@ -54,7 +59,7 @@ $: classes =
54
59
  }
55
60
 
56
61
  /* This implements a drop cap in the first letter of the first text in the first format of the first paragraph of a chapter (but only chapters). */
57
- :global(.chapter-content) p:first-of-type:not(.placeholder)::first-letter {
62
+ p.dropcap::first-letter {
58
63
  padding: 0 0.25rem;
59
64
  margin: 0 0.25rem 0 0;
60
65
  font-size: 4rem;
@@ -34,7 +34,7 @@ afterUpdate(() => {
34
34
  }
35
35
  });
36
36
  function skulptLoaded() {
37
- return window.hasOwnProperty('Sk');
37
+ return typeof window !== 'undefined' && window.hasOwnProperty('Sk');
38
38
  }
39
39
  function reset() {
40
40
  code = startCode;
@@ -116,7 +116,7 @@ $: lines = output.split('\n');
116
116
  flex: 1;
117
117
  border: 1px solid lightGray;
118
118
  padding: 0.5rem;
119
- height: 3rem;
119
+ height: 2rem;
120
120
  overflow-y: scroll;
121
121
  display: inline-block;
122
122
  vertical-align: top;
@@ -37,12 +37,11 @@ $: credit = node.getCredit();
37
37
  font-family: var(--bookish-header-font-family);
38
38
  font-weight: 400;
39
39
  font-style: italic;
40
- padding: 0;
41
- margin-top: var(--bookish-paragraph-spacing);
42
- margin-bottom: var(--bookish-paragraph-spacing);
43
- margin-left: var(--bookish-indent);
44
- margin-right: var(--bookish-indent);
45
- position: relative;
40
+ margin: 0;
41
+ padding-top: 0;
42
+ padding-bottom: var(--bookish-paragraph-spacing);
43
+ padding-left: var(--bookish-indent);
44
+ padding-right: var(--bookish-indent);
46
45
  }
47
46
 
48
47
  .quote > :global(p) {
@@ -52,6 +51,7 @@ $: credit = node.getCredit();
52
51
 
53
52
  .caption {
54
53
  margin-top: 0.5em;
54
+ margin-right: var(--bookish-indent);
55
55
  text-align: right;
56
56
  font-family: var(--bookish-header-font-family);
57
57
  font-style: italic;
@@ -14,7 +14,8 @@ $: rows = node.getRows();
14
14
  {#each rows as row, index}
15
15
  <tr class={editable ? 'editable' : null}>
16
16
  {#if row.length === 1}
17
- <svelte:element this={index === 0 ? 'th' : 'td'}>
17
+ <svelte:element
18
+ this={index === 0 ? 'th' : 'td'}
18
19
  colspan={rows.reduce(
19
20
  (max, row) => Math.max(row.length, max),
20
21
  0
@@ -37,4 +38,9 @@ $: rows = node.getRows();
37
38
  tr.editable th {
38
39
  border: 1px dotted var(--app-border-color);
39
40
  }
41
+
42
+ td,
43
+ th {
44
+ vertical-align: baseline;
45
+ }
40
46
  </style>
@@ -13,7 +13,7 @@ function change() {
13
13
  class="dark-toggle"
14
14
  role="button"
15
15
  aria-label={dark === true ? 'Switch to light mode' : 'Switch to dark mode'}
16
- tabIndex="0"
16
+ tabindex="0"
17
17
  on:click={change}
18
18
  on:keydown={(event) => {
19
19
  if (event.key === 'Enter' || event.key === ' ') {
@@ -1,7 +1,7 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
- dark: Boolean;
4
+ dark: boolean;
5
5
  toggle: () => void;
6
6
  };
7
7
  events: {
@@ -16,9 +16,8 @@ import ErrorNode from '../../models/chapter/ErrorNode';
16
16
  import { caretRangeToIndexRange, indexRangeToCaretRange, } from '../../models/chapter/Caret';
17
17
  import commands from './Commands';
18
18
  import { afterUpdate, onMount, setContext } from 'svelte';
19
- import { getCaret, getRoot } from '../page/Contexts';
19
+ import { getCaret } from '../page/Contexts';
20
20
  import CaretView from './CaretView.svelte';
21
- import { writable } from 'svelte/store';
22
21
  const IDLE_TIME = 500;
23
22
  export let text;
24
23
  export let parser;
@@ -159,25 +158,18 @@ afterUpdate(() => {
159
158
  const lineHeight = lineHeightString.endsWith('px')
160
159
  ? parseInt(lineHeightString.substring(0, lineHeightString.length - 2))
161
160
  : undefined;
162
- // Is the caret in relatively positioned ancestors above the editor? Undo their offsets.
163
- let caretAncestor = startNode.parentElement;
161
+ // Figure out the relative position of this editor.
162
+ let editorAncestor = element;
164
163
  let relativeX = 0;
165
164
  let relativeY = 0;
166
- let fixedX = undefined;
167
- let fixedY = undefined;
168
- while (caretAncestor != null) {
169
- const style = window.getComputedStyle(caretAncestor);
165
+ while (editorAncestor != null) {
166
+ const style = window.getComputedStyle(editorAncestor);
170
167
  if (style.position === 'relative') {
171
- relativeX += caretAncestor.offsetLeft;
172
- relativeY += caretAncestor.offsetTop;
168
+ relativeX += editorAncestor.offsetLeft;
169
+ relativeY += editorAncestor.offsetTop;
173
170
  }
174
- else if (style.position === 'fixed') {
175
- fixedX = caretAncestor.offsetLeft;
176
- fixedY = caretAncestor.offsetTop;
177
- }
178
- caretAncestor = caretAncestor.parentElement;
171
+ editorAncestor = editorAncestor.parentElement;
179
172
  }
180
- // Is the caret in a fixed position marginal? Get it's position.
181
173
  // If we're after a new line, calculate the correct position, since selections don't actually render to the next line.
182
174
  const left = afterNewLine
183
175
  ? textRect.left
@@ -185,6 +177,7 @@ afterUpdate(() => {
185
177
  const top = afterNewLine && lineHeight
186
178
  ? rangeRect.top + lineHeight
187
179
  : rangeRect.top;
180
+ // Compute the final position of the caret.
188
181
  const position = {
189
182
  x: left + window.scrollX - relativeX,
190
183
  y: top + window.scrollY - relativeY,
@@ -491,8 +484,8 @@ function handleKey(event, press = false) {
491
484
  const context = getCaretContext();
492
485
  if (context === undefined)
493
486
  return;
494
- // Loop through the commands to see if there's a match.
495
- const unmatched = commands.every((command) => {
487
+ // Find a command that handles the event.
488
+ const command = commands.find((command) => {
496
489
  // If the keystroke and caret position matches the command signature, execute the command and update the caret range.
497
490
  if ((command.press === undefined || command.press === press) &&
498
491
  (command.shift === undefined ||
@@ -510,19 +503,20 @@ function handleKey(event, press = false) {
510
503
  (command.active === true ||
511
504
  (command.active instanceof Function &&
512
505
  command.active.call(undefined, context, event.key)))) {
513
- // Execute the command
514
- const handled = executeCommand(command, event.key);
515
- if (handled) {
506
+ // See if the command is handled
507
+ if (executeCommand(command, event.key)) {
516
508
  event.preventDefault();
517
509
  event.stopPropagation();
510
+ return true;
518
511
  }
519
- // Stop searching for a matching command.
520
- return handled;
512
+ // If not, this is not it.
513
+ else
514
+ return false;
521
515
  }
522
516
  // Continue searching for a matching command.
523
- return true;
517
+ return false;
524
518
  });
525
- if (unmatched) {
519
+ if (command === undefined) {
526
520
  // Toolbar navigation
527
521
  if (event.key === 'Escape') {
528
522
  // If we've selected a FootnoteNode or Comment, navigate to the footnote or comment text to edit it.
@@ -813,13 +807,14 @@ setContext('claimeditor', claimActiveEditor);
813
807
  class={`bookish-editor ${inAtom ? 'bookish-editor-atom-focused' : ''}`}
814
808
  class:locked
815
809
  aria-disabled={locked}
810
+ role="textbox"
816
811
  bind:this={element}
817
812
  on:keydown={handleKey}
818
813
  on:keypress={handlePress}
819
814
  on:mousedown|stopPropagation={handleMouseDown}
820
815
  on:focus={handleFocus}
821
816
  on:blur={handleBlur}
822
- tabIndex="0"
817
+ tabindex="0"
823
818
  >
824
819
  <!-- A view of the root -->
825
820
  <svelte:component this={component} node={editedNode} {placeholder} />
@@ -835,19 +835,6 @@ const commands = [
835
835
  return rootWithNode(context, context.blocks, edit.root, () => edit.range.start);
836
836
  },
837
837
  },
838
- {
839
- icon: IndentIcon,
840
- description: 'indent list item',
841
- category: 'list',
842
- mutates: true,
843
- control: false,
844
- alt: false,
845
- shift: false,
846
- key: 'Tab',
847
- visible: (context) => context.list !== undefined,
848
- active: (context) => context.list !== undefined,
849
- handler: (context) => rootWithNode(context, context.blocks, context.blocks?.withListsIndented(context.range, true)),
850
- },
851
838
  {
852
839
  icon: UnindentIcon,
853
840
  description: 'unindent list item',
@@ -862,6 +849,19 @@ const commands = [
862
849
  context.list.isInside(context.root, ListNode),
863
850
  handler: (context) => rootWithNode(context, context.blocks, context.blocks?.withListsIndented(context.range, false)),
864
851
  },
852
+ {
853
+ icon: IndentIcon,
854
+ description: 'indent list item',
855
+ category: 'list',
856
+ mutates: true,
857
+ control: false,
858
+ alt: false,
859
+ shift: false,
860
+ key: 'Tab',
861
+ visible: (context) => context.list !== undefined,
862
+ active: (context) => context.list !== undefined,
863
+ handler: (context) => rootWithNode(context, context.blocks, context.blocks?.withListsIndented(context.range, true)),
864
+ },
865
865
  {
866
866
  icon: ClearIcon,
867
867
  description: 'clear formatting',
@@ -1222,7 +1222,7 @@ const commands = [
1222
1222
  const newTable = new TableNode(newRows, '|', new FormatNode('', [new TextNode()]));
1223
1223
  return rootWithNode(context, context.blocks, context.blocks.withBlockInsertedBefore(context.paragraph, newTable), () => {
1224
1224
  return {
1225
- node: newTable.getRows()[0][0].getTextNodes()[0],
1225
+ node: newTable.getRows()[0][0].getFirstTextNode(),
1226
1226
  index: 0,
1227
1227
  };
1228
1228
  });
@@ -9,8 +9,14 @@ let confirming = false;
9
9
  {#if !confirming}
10
10
  <Button {tooltip} command={() => (confirming = true)}><slot /></Button>
11
11
  {:else}
12
- <Button tooltip="no" command={() => (confirming = false)}>no</Button
13
- >&nbsp;<Button tooltip="yes" {command}>{confirm}</Button>
12
+ <Button tooltip="no" command={() => (confirming = false)}>cancel</Button
13
+ >&nbsp;<Button
14
+ tooltip="yes"
15
+ command={() => {
16
+ confirming = false;
17
+ command();
18
+ }}>{confirm}</Button
19
+ >
14
20
  {/if}
15
21
  </div>
16
22
 
@@ -43,10 +43,10 @@ function handleImageChange(event) {
43
43
  });
44
44
  }
45
45
  function handleImageSelection(image) {
46
- // Toggle the embed
47
46
  $caret?.edit(embed, embed.getURL() === image.url
48
- ? embed.withURL('').withDescription('')
49
- : embed.withURL(image.url));
47
+ ? // Toggle the embed if choosing the same image
48
+ embed.withURL('').withDescription('')
49
+ : embed.withURLs(image.url, image.thumb));
50
50
  }
51
51
  </script>
52
52
 
@@ -1,8 +1,8 @@
1
1
  <script>import { onMount } from 'svelte';
2
- import { getBook, getCaret } from '../page/Contexts';
2
+ import { getBook } from '../page/Contexts';
3
+ import ImageThumbnail from './ImageThumbnail.svelte';
3
4
  export let select;
4
5
  export let selection;
5
- let editor = getCaret();
6
6
  let book = getBook();
7
7
  let images = undefined;
8
8
  let expanded = false;
@@ -21,7 +21,8 @@ onMount(() => {
21
21
 
22
22
  <div
23
23
  class={`bookish-image-chooser ${expanded ? 'expanded' : ''}`}
24
- tabIndex="0"
24
+ tabindex="0"
25
+ role="button"
25
26
  on:click={() => (expanded = !expanded)}
26
27
  on:keydown={(event) =>
27
28
  event.key === 'Enter' || event.key === ' '
@@ -37,18 +38,10 @@ onMount(() => {
37
38
  <!-- Sort the images by their URL. There's probably a more meaningful sort,
38
39
  such as placing unused images at the front of the list. -->
39
40
  {#each images.sort((a, b) => a.url.localeCompare(b.url)) as image}
40
- <img
41
- class={`bookish-image-chooser-image ${
42
- image.url === selection ? 'selected' : ''
43
- }`}
44
- src={image.url}
45
- alt={`Image named ${image.url}`}
46
- tabIndex="0"
47
- on:click|stopPropagation={() => select(image)}
48
- on:keydown={(event) =>
49
- event.key === 'Enter' || event.key === ' '
50
- ? select(image)
51
- : undefined}
41
+ <ImageThumbnail
42
+ {image}
43
+ selected={image.url === selection}
44
+ {select}
52
45
  />
53
46
  {:else}
54
47
  No images uploaded
@@ -74,16 +67,4 @@ onMount(() => {
74
67
  height: auto;
75
68
  overflow-y: auto;
76
69
  }
77
-
78
- .bookish-image-chooser-image {
79
- display: inline-block;
80
- height: 2em;
81
- cursor: pointer;
82
- }
83
-
84
- .bookish-image-chooser-image.selected {
85
- outline: var(--app-chrome-border-size) solid
86
- var(--app-interactive-color);
87
- outline-offset: calc(-1 * var(--app-chrome-border-size));
88
- }
89
70
  </style>
@@ -0,0 +1,65 @@
1
+ <script>export let image;
2
+ export let selected;
3
+ export let select;
4
+ let retries = 3;
5
+ let error = false;
6
+ let loading = true;
7
+ function loadImage(url) {
8
+ retries--;
9
+ let img = new Image();
10
+ img.onerror = () => {
11
+ if (retries > 0) {
12
+ setTimeout(() => loadImage(url), 1000);
13
+ }
14
+ else {
15
+ loading = false;
16
+ error = true;
17
+ }
18
+ };
19
+ img.onload = () => {
20
+ loading = false;
21
+ };
22
+ img.src = url;
23
+ }
24
+ loadImage(image.thumb);
25
+ </script>
26
+
27
+ {#if loading}
28
+ <div class="thumbnail loading" />
29
+ {:else}
30
+ <div
31
+ tabindex="0"
32
+ role="button"
33
+ on:click|stopPropagation={() => select(image)}
34
+ on:keydown={(event) =>
35
+ event.key === 'Enter' || event.key === ' '
36
+ ? select(image)
37
+ : undefined}
38
+ >
39
+ <img
40
+ class="thumbnail"
41
+ class:selected
42
+ src={error ? image.url : image.thumb}
43
+ alt={`Image named ${image.url}`}
44
+ />
45
+ </div>
46
+ {/if}
47
+
48
+ <style>
49
+ .thumbnail {
50
+ display: inline-block;
51
+ height: 2em;
52
+ cursor: pointer;
53
+ }
54
+
55
+ .thumbnail.selected {
56
+ outline: var(--app-chrome-border-size) solid
57
+ var(--app-interactive-color);
58
+ outline-offset: calc(-1 * var(--app-chrome-border-size));
59
+ }
60
+
61
+ .loading {
62
+ width: 2.5em;
63
+ background: var(--app-chrome-background);
64
+ }
65
+ </style>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { Image } from '../../models/book/BookMedia';
3
+ declare const __propDef: {
4
+ props: {
5
+ image: Image;
6
+ selected: boolean;
7
+ select: (image: Image) => void;
8
+ };
9
+ events: {
10
+ [evt: string]: CustomEvent<any>;
11
+ };
12
+ slots: {};
13
+ };
14
+ export type ImageThumbnailProps = typeof __propDef.props;
15
+ export type ImageThumbnailEvents = typeof __propDef.events;
16
+ export type ImageThumbnailSlots = typeof __propDef.slots;
17
+ export default class ImageThumbnail extends SvelteComponentTyped<ImageThumbnailProps, ImageThumbnailEvents, ImageThumbnailSlots> {
18
+ }
19
+ export {};