bookish-press 0.4.232 → 0.5.1

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 (433) hide show
  1. package/{components → package/components}/Auth.svelte +11 -13
  2. package/{components → package/components}/Auth.svelte.d.ts +0 -0
  3. package/{components → package/components}/Authentication.d.ts +0 -0
  4. package/{components → package/components}/Authentication.js +0 -0
  5. package/{components → package/components}/BookPreview.svelte +13 -17
  6. package/{components → package/components}/BookPreview.svelte.d.ts +0 -0
  7. package/{components → package/components}/Link.svelte +2 -1
  8. package/{components → package/components}/Link.svelte.d.ts +1 -0
  9. package/{components → package/components}/app/BookList.svelte +0 -0
  10. package/{components → package/components}/app/BookList.svelte.d.ts +0 -0
  11. package/{components → package/components}/app/Button.svelte +5 -2
  12. package/{components → package/components}/app/Button.svelte.d.ts +0 -0
  13. package/{components → package/components}/app/Feedback.svelte +4 -9
  14. package/{components → package/components}/app/Feedback.svelte.d.ts +0 -0
  15. package/{components → package/components}/app/Head.svelte +4 -1
  16. package/{components → package/components}/app/Head.svelte.d.ts +6 -15
  17. package/{components → package/components}/app/Large.svelte +0 -0
  18. package/{components → package/components}/app/Large.svelte.d.ts +0 -0
  19. package/{components → package/components}/app/Lead.svelte +0 -0
  20. package/{components → package/components}/app/Lead.svelte.d.ts +0 -0
  21. package/package/components/app/Link.svelte +36 -0
  22. package/{components → package/components}/app/Link.svelte.d.ts +1 -0
  23. package/{components → package/components}/app/Options.svelte +0 -0
  24. package/{components → package/components}/app/Options.svelte.d.ts +0 -0
  25. package/{components → package/components}/app/Paragraph.svelte +1 -0
  26. package/{components → package/components}/app/Paragraph.svelte.d.ts +0 -0
  27. package/{components/app/Writing.svelte → package/components/app/Section.svelte} +0 -1
  28. package/package/components/app/Section.svelte.d.ts +27 -0
  29. package/{components → package/components}/app/Table.svelte +0 -0
  30. package/{components → package/components}/app/Table.svelte.d.ts +0 -0
  31. package/{components → package/components}/app/TextInput.svelte +2 -0
  32. package/{components → package/components}/app/TextInput.svelte.d.ts +0 -0
  33. package/{components → package/components}/chapter/Atom.svelte +1 -8
  34. package/{components → package/components}/chapter/Atom.svelte.d.ts +0 -0
  35. package/{components → package/components}/chapter/Block.svelte +3 -1
  36. package/{components → package/components}/chapter/Block.svelte.d.ts +0 -0
  37. package/{components → package/components}/chapter/Callout.svelte +0 -0
  38. package/{components → package/components}/chapter/Callout.svelte.d.ts +0 -0
  39. package/{components → package/components}/chapter/CaptionedCode.svelte +2 -2
  40. package/{components → package/components}/chapter/CaptionedCode.svelte.d.ts +0 -0
  41. package/{components → package/components}/chapter/ChapterBody.svelte +9 -16
  42. package/{components → package/components}/chapter/ChapterBody.svelte.d.ts +1 -0
  43. package/{components → package/components}/chapter/Citations.svelte +13 -11
  44. package/{components → package/components}/chapter/Citations.svelte.d.ts +0 -0
  45. package/{components → package/components}/chapter/Code.svelte +3 -2
  46. package/{components → package/components}/chapter/Code.svelte.d.ts +0 -0
  47. package/{components → package/components}/chapter/Comment.svelte +7 -13
  48. package/{components → package/components}/chapter/Comment.svelte.d.ts +0 -0
  49. package/{components → package/components}/chapter/Definition.svelte +8 -3
  50. package/{components → package/components}/chapter/Definition.svelte.d.ts +0 -0
  51. package/{components → package/components}/chapter/Embed.svelte +6 -5
  52. package/{components → package/components}/chapter/Embed.svelte.d.ts +1 -0
  53. package/{components → package/components}/chapter/ErrorMessage.svelte +0 -0
  54. package/{components → package/components}/chapter/ErrorMessage.svelte.d.ts +0 -0
  55. package/{components → package/components}/chapter/ExtendedPrism.d.ts +0 -0
  56. package/{components → package/components}/chapter/ExtendedPrism.js +0 -0
  57. package/{components → package/components}/chapter/Figure.svelte +8 -8
  58. package/{components → package/components}/chapter/Figure.svelte.d.ts +0 -0
  59. package/{components → package/components}/chapter/Footnote.svelte +13 -24
  60. package/{components → package/components}/chapter/Footnote.svelte.d.ts +0 -2
  61. package/{components → package/components}/chapter/Format.svelte +5 -4
  62. package/{components → package/components}/chapter/Format.svelte.d.ts +0 -0
  63. package/{components → package/components}/chapter/InlineCode.svelte +2 -2
  64. package/{components → package/components}/chapter/InlineCode.svelte.d.ts +0 -0
  65. package/{components → package/components}/chapter/Label.svelte +5 -7
  66. package/{components → package/components}/chapter/Label.svelte.d.ts +0 -0
  67. package/{components → package/components}/chapter/Link.svelte +8 -6
  68. package/{components → package/components}/chapter/Link.svelte.d.ts +0 -0
  69. package/{components → package/components}/chapter/List.svelte +5 -0
  70. package/{components → package/components}/chapter/List.svelte.d.ts +0 -0
  71. package/{components → package/components}/chapter/Marginal.svelte +30 -12
  72. package/{components → package/components}/chapter/Marginal.svelte.d.ts +0 -0
  73. package/{components → package/components}/chapter/Paragraph.svelte +23 -10
  74. package/{components → package/components}/chapter/Paragraph.svelte.d.ts +0 -0
  75. package/{components → package/components}/chapter/Positioned.svelte +0 -0
  76. package/{components → package/components}/chapter/Positioned.svelte.d.ts +0 -0
  77. package/{components → package/components}/chapter/Problem.svelte +0 -0
  78. package/{components → package/components}/chapter/Problem.svelte.d.ts +0 -0
  79. package/{components → package/components}/chapter/Python.svelte +0 -0
  80. package/{components → package/components}/chapter/Python.svelte.d.ts +0 -0
  81. package/{components → package/components}/chapter/Quote.svelte +20 -10
  82. package/{components → package/components}/chapter/Quote.svelte.d.ts +0 -0
  83. package/{components → package/components}/chapter/Rule.svelte +0 -0
  84. package/{components → package/components}/chapter/Rule.svelte.d.ts +0 -0
  85. package/{components → package/components}/chapter/Table.svelte +2 -2
  86. package/{components → package/components}/chapter/Table.svelte.d.ts +0 -0
  87. package/{components → package/components}/chapter/Text.svelte +2 -2
  88. package/{components → package/components}/chapter/Text.svelte.d.ts +0 -0
  89. package/package/components/controls/DarkToggle.svelte +38 -0
  90. package/package/components/controls/DarkToggle.svelte.d.ts +17 -0
  91. package/{components → package/components}/editor/BookishEditor.svelte +57 -32
  92. package/{components → package/components}/editor/BookishEditor.svelte.d.ts +4 -1
  93. package/{components → package/components}/editor/CalloutEditor.svelte +0 -0
  94. package/{components → package/components}/editor/CalloutEditor.svelte.d.ts +0 -0
  95. package/{components → package/components}/editor/CaptionedCodeEditor.svelte +0 -0
  96. package/{components → package/components}/editor/CaptionedCodeEditor.svelte.d.ts +0 -0
  97. package/{components → package/components}/editor/CaretContext.d.ts +0 -0
  98. package/{components → package/components}/editor/CaretContext.js +0 -0
  99. package/{components → package/components}/editor/CaretState.d.ts +0 -0
  100. package/{components → package/components}/editor/CaretState.js +0 -0
  101. package/{components → package/components}/editor/CaretUtilities.d.ts +0 -0
  102. package/{components → package/components}/editor/CaretUtilities.js +0 -0
  103. package/{components → package/components}/editor/CaretView.svelte +4 -2
  104. package/{components → package/components}/editor/CaretView.svelte.d.ts +1 -0
  105. package/{components → package/components}/editor/CitationsEditor.svelte +0 -0
  106. package/{components → package/components}/editor/CitationsEditor.svelte.d.ts +0 -0
  107. package/{components → package/components}/editor/Clipboard.d.ts +0 -0
  108. package/{components → package/components}/editor/Clipboard.js +0 -0
  109. package/{components → package/components}/editor/Command.d.ts +0 -0
  110. package/{components → package/components}/editor/Command.js +0 -0
  111. package/{components → package/components}/editor/Commands.d.ts +0 -0
  112. package/{components → package/components}/editor/Commands.js +0 -0
  113. package/package/components/editor/ConfirmButton.svelte +23 -0
  114. package/{components → package/components}/editor/ConfirmButton.svelte.d.ts +4 -3
  115. package/{components → package/components}/editor/DefinitionEditor.svelte +0 -0
  116. package/{components → package/components}/editor/DefinitionEditor.svelte.d.ts +0 -0
  117. package/{components → package/components}/editor/EmbedEditor.svelte +1 -1
  118. package/{components → package/components}/editor/EmbedEditor.svelte.d.ts +0 -0
  119. package/{components → package/components}/editor/Icon.svelte +0 -0
  120. package/{components → package/components}/editor/Icon.svelte.d.ts +0 -0
  121. package/{components → package/components}/editor/ImageChooser.svelte +0 -0
  122. package/{components → package/components}/editor/ImageChooser.svelte.d.ts +0 -0
  123. package/{components → package/components}/editor/InlineCodeEditor.svelte +0 -0
  124. package/{components → package/components}/editor/InlineCodeEditor.svelte.d.ts +0 -0
  125. package/{components → package/components}/editor/LabelEditor.svelte +0 -0
  126. package/{components → package/components}/editor/LabelEditor.svelte.d.ts +0 -0
  127. package/{components → package/components}/editor/LanguageEditor.svelte +0 -0
  128. package/{components → package/components}/editor/LanguageEditor.svelte.d.ts +0 -0
  129. package/{components → package/components}/editor/LinkEditor.svelte +4 -3
  130. package/{components → package/components}/editor/LinkEditor.svelte.d.ts +0 -0
  131. package/{components → package/components}/editor/Note.svelte +1 -0
  132. package/{components → package/components}/editor/Note.svelte.d.ts +0 -0
  133. package/package/components/editor/Permissions.svelte +93 -0
  134. package/package/components/editor/Permissions.svelte.d.ts +20 -0
  135. package/{components → package/components}/editor/PositionEditor.svelte +0 -0
  136. package/{components → package/components}/editor/PositionEditor.svelte.d.ts +0 -0
  137. package/{components → package/components}/editor/QuoteEditor.svelte +0 -0
  138. package/{components → package/components}/editor/QuoteEditor.svelte.d.ts +0 -0
  139. package/{components → package/components}/editor/Switch.svelte +0 -0
  140. package/{components → package/components}/editor/Switch.svelte.d.ts +0 -0
  141. package/{components → package/components}/editor/TableEditor.svelte +0 -0
  142. package/{components → package/components}/editor/TableEditor.svelte.d.ts +0 -0
  143. package/{components → package/components}/editor/TextEditor.svelte +2 -3
  144. package/{components → package/components}/editor/TextEditor.svelte.d.ts +0 -0
  145. package/{components → package/components}/editor/Toggle.svelte +0 -0
  146. package/{components → package/components}/editor/Toggle.svelte.d.ts +0 -0
  147. package/{components → package/components}/editor/Toolbar.svelte +8 -3
  148. package/{components → package/components}/editor/Toolbar.svelte.d.ts +0 -0
  149. package/{components → package/components}/editor/ToolbarGroup.svelte +0 -1
  150. package/{components → package/components}/editor/ToolbarGroup.svelte.d.ts +0 -0
  151. package/{components → package/components}/editor/ToolbarSpacer.svelte +0 -0
  152. package/{components → package/components}/editor/ToolbarSpacer.svelte.d.ts +0 -0
  153. package/{components → package/components}/editor/URLEditor.svelte +2 -0
  154. package/{components → package/components}/editor/URLEditor.svelte.d.ts +0 -0
  155. package/{components → package/components}/editor/UndoState.d.ts +0 -0
  156. package/{components → package/components}/editor/UndoState.js +0 -0
  157. package/{components → package/components}/editor/icons/annotate.svg +0 -0
  158. package/{components → package/components}/editor/icons/block.svg +0 -0
  159. package/{components → package/components}/editor/icons/bold.svg +0 -0
  160. package/{components → package/components}/editor/icons/bullets.svg +0 -0
  161. package/{components → package/components}/editor/icons/callout.svg +0 -0
  162. package/{components → package/components}/editor/icons/citation.svg +0 -0
  163. package/{components → package/components}/editor/icons/clear.svg +0 -0
  164. package/{components → package/components}/editor/icons/clipboard.svg +0 -0
  165. package/{components → package/components}/editor/icons/code.svg +0 -0
  166. package/{components → package/components}/editor/icons/columnafter.svg +0 -0
  167. package/{components → package/components}/editor/icons/columnbefore.svg +0 -0
  168. package/{components → package/components}/editor/icons/comment.svg +0 -0
  169. package/{components → package/components}/editor/icons/copy.svg +0 -0
  170. package/{components → package/components}/editor/icons/cut.svg +0 -0
  171. package/{components → package/components}/editor/icons/define.svg +0 -0
  172. package/{components → package/components}/editor/icons/deletecolumn.svg +0 -0
  173. package/{components → package/components}/editor/icons/deleterow.svg +0 -0
  174. package/{components → package/components}/editor/icons/footnote.svg +0 -0
  175. package/{components → package/components}/editor/icons/header1.svg +0 -0
  176. package/{components → package/components}/editor/icons/header2.svg +0 -0
  177. package/{components → package/components}/editor/icons/header3.svg +0 -0
  178. package/{components → package/components}/editor/icons/home.svg +0 -0
  179. package/{components → package/components}/editor/icons/indent.svg +0 -0
  180. package/{components → package/components}/editor/icons/italic.svg +0 -0
  181. package/{components → package/components}/editor/icons/label.svg +0 -0
  182. package/{components → package/components}/editor/icons/left.svg +0 -0
  183. package/{components → package/components}/editor/icons/level.svg +0 -0
  184. package/{components → package/components}/editor/icons/link.svg +0 -0
  185. package/{components → package/components}/editor/icons/list.svg +0 -0
  186. package/{components → package/components}/editor/icons/media.svg +0 -0
  187. package/{components → package/components}/editor/icons/middle.svg +0 -0
  188. package/{components → package/components}/editor/icons/numbers.svg +0 -0
  189. package/{components → package/components}/editor/icons/paragraph.svg +0 -0
  190. package/{components → package/components}/editor/icons/paste.svg +0 -0
  191. package/{components → package/components}/editor/icons/quote.svg +0 -0
  192. package/{components → package/components}/editor/icons/redo.svg +0 -0
  193. package/{components → package/components}/editor/icons/right.svg +0 -0
  194. package/{components → package/components}/editor/icons/rowabove.svg +0 -0
  195. package/{components → package/components}/editor/icons/rowbelow.svg +0 -0
  196. package/{components → package/components}/editor/icons/rule.svg +0 -0
  197. package/{components → package/components}/editor/icons/sub.svg +0 -0
  198. package/{components → package/components}/editor/icons/super.svg +0 -0
  199. package/{components → package/components}/editor/icons/table.svg +0 -0
  200. package/{components → package/components}/editor/icons/text.svg +0 -0
  201. package/{components → package/components}/editor/icons/time.svg +0 -0
  202. package/{components → package/components}/editor/icons/undo.svg +0 -0
  203. package/{components → package/components}/editor/icons/unindent.svg +0 -0
  204. package/{components → package/components}/editor/icons/unlink.svg +0 -0
  205. package/{components → package/components}/page/Acknowledgements.svelte +13 -11
  206. package/{components → package/components}/page/Acknowledgements.svelte.d.ts +0 -0
  207. package/package/components/page/Authors.svelte +86 -0
  208. package/{components → package/components}/page/Authors.svelte.d.ts +1 -0
  209. package/package/components/page/BookLoader.svelte +59 -0
  210. package/package/components/page/BookLoader.svelte.d.ts +16 -0
  211. package/{components → package/components}/page/BulkReferenceEditor.svelte +8 -8
  212. package/{components → package/components}/page/BulkReferenceEditor.svelte.d.ts +0 -0
  213. package/{components → package/components}/page/Chapter.svelte +69 -30
  214. package/{components → package/components}/page/Chapter.svelte.d.ts +0 -0
  215. package/{components → package/components}/page/ChapterContext.d.ts +0 -0
  216. package/{components → package/components}/page/ChapterContext.js +0 -0
  217. package/{components → package/components}/page/ChapterNumber.svelte +0 -0
  218. package/{components → package/components}/page/ChapterNumber.svelte.d.ts +0 -0
  219. package/{components → package/components}/page/ChapterTitle.svelte +0 -0
  220. package/{components → package/components}/page/ChapterTitle.svelte.d.ts +0 -0
  221. package/{components → package/components}/page/Contexts.d.ts +21 -5
  222. package/package/components/page/Contexts.js +144 -0
  223. package/{components → package/components}/page/DefinitionView.svelte +23 -14
  224. package/{components → package/components}/page/DefinitionView.svelte.d.ts +0 -0
  225. package/{components → package/components}/page/Description.svelte +12 -9
  226. package/{components → package/components}/page/Description.svelte.d.ts +0 -0
  227. package/{components → package/components}/page/Edition.svelte +9 -23
  228. package/{components → package/components}/page/Edition.svelte.d.ts +1 -2
  229. package/package/components/page/EditionLoader.svelte +99 -0
  230. package/package/components/page/EditionLoader.svelte.d.ts +18 -0
  231. package/package/components/page/Editions.svelte +109 -0
  232. package/{components → package/components}/page/Editions.svelte.d.ts +3 -1
  233. package/{components → package/components}/page/Glossary.svelte +13 -6
  234. package/{components → package/components}/page/Glossary.svelte.d.ts +0 -0
  235. package/{components → package/components}/page/Header.svelte +26 -21
  236. package/{components → package/components}/page/Header.svelte.d.ts +2 -0
  237. package/{components → package/components}/page/Index.svelte +14 -8
  238. package/{components → package/components}/page/Index.svelte.d.ts +0 -0
  239. package/{components → package/components}/page/Instructions.svelte +1 -2
  240. package/{components → package/components}/page/Instructions.svelte.d.ts +3 -1
  241. package/package/components/page/License.svelte +45 -0
  242. package/{components → package/components}/page/License.svelte.d.ts +0 -0
  243. package/{components → package/components}/page/Loading.svelte +0 -0
  244. package/{components → package/components}/page/Loading.svelte.d.ts +0 -0
  245. package/{components → package/components}/page/Media.svelte +40 -36
  246. package/{components → package/components}/page/Media.svelte.d.ts +0 -0
  247. package/package/components/page/MediaPreview.svelte +55 -0
  248. package/{components → package/components}/page/MediaPreview.svelte.d.ts +0 -0
  249. package/{components → package/components}/page/Muted.svelte +0 -0
  250. package/{components → package/components}/page/Muted.svelte.d.ts +0 -0
  251. package/{components → package/components}/page/Outline.svelte +69 -96
  252. package/{components → package/components}/page/Outline.svelte.d.ts +0 -0
  253. package/{components → package/components}/page/Page.svelte +4 -4
  254. package/{components → package/components}/page/Page.svelte.d.ts +0 -0
  255. package/{components → package/components}/page/PageHeader.svelte +5 -0
  256. package/{components → package/components}/page/PageHeader.svelte.d.ts +0 -0
  257. package/{components → package/components}/page/PageParagraph.svelte +0 -0
  258. package/{components → package/components}/page/PageParagraph.svelte.d.ts +0 -0
  259. package/{components → package/components}/page/PossibleChapter.svelte +0 -0
  260. package/{components → package/components}/page/PossibleChapter.svelte.d.ts +0 -0
  261. package/{components → package/components}/page/PossibleReference.svelte +2 -1
  262. package/{components → package/components}/page/PossibleReference.svelte.d.ts +1 -0
  263. package/{components → package/components}/page/Print.svelte +0 -0
  264. package/{components → package/components}/page/Print.svelte.d.ts +0 -0
  265. package/package/components/page/Publish.svelte +135 -0
  266. package/package/components/page/Publish.svelte.d.ts +14 -0
  267. package/{components → package/components}/page/Reference.svelte +54 -51
  268. package/{components → package/components}/page/Reference.svelte.d.ts +1 -0
  269. package/{components → package/components}/page/References.svelte +9 -4
  270. package/{components → package/components}/page/References.svelte.d.ts +0 -0
  271. package/{components → package/components}/page/Rows.svelte +0 -0
  272. package/{components → package/components}/page/Rows.svelte.d.ts +0 -0
  273. package/{components → package/components}/page/Search.svelte +27 -10
  274. package/{components → package/components}/page/Search.svelte.d.ts +0 -0
  275. package/package/components/page/Status.svelte +58 -0
  276. package/{components → package/components}/page/Status.svelte.d.ts +0 -0
  277. package/{components → package/components}/page/SubdomainEditor.svelte +5 -3
  278. package/{components → package/components}/page/SubdomainEditor.svelte.d.ts +0 -0
  279. package/{components → package/components}/page/TableOfContents.svelte +83 -37
  280. package/{components → package/components}/page/TableOfContents.svelte.d.ts +0 -0
  281. package/package/components/page/TableOfContentsImage.svelte +27 -0
  282. package/{components → package/components}/page/TableOfContentsImage.svelte.d.ts +1 -0
  283. package/{components → package/components}/page/TableOfContentsRow.svelte +11 -12
  284. package/{components → package/components}/page/TableOfContentsRow.svelte.d.ts +0 -0
  285. package/{components → package/components}/page/ThemeEditor.svelte +12 -10
  286. package/{components → package/components}/page/ThemeEditor.svelte.d.ts +0 -0
  287. package/{components → package/components}/page/ThemeEditorPreview.svelte +0 -0
  288. package/{components → package/components}/page/ThemeEditorPreview.svelte.d.ts +0 -0
  289. package/{components → package/components}/page/ThemeSetEditor.svelte +0 -0
  290. package/{components → package/components}/page/ThemeSetEditor.svelte.d.ts +0 -0
  291. package/{components → package/components}/page/ThemeVariableEditor.svelte +0 -0
  292. package/{components → package/components}/page/ThemeVariableEditor.svelte.d.ts +0 -0
  293. package/{components → package/components}/page/Title.svelte +0 -0
  294. package/{components → package/components}/page/Title.svelte.d.ts +0 -0
  295. package/{components → package/components}/page/Unknown.svelte +5 -2
  296. package/{components → package/components}/page/Unknown.svelte.d.ts +0 -0
  297. package/{components → package/components}/page/margins.d.ts +0 -0
  298. package/{components → package/components}/page/margins.js +0 -0
  299. package/{index.d.ts → package/index.d.ts} +3 -3
  300. package/{index.js → package/index.js} +3 -3
  301. package/package/models/CRUD.d.ts +28 -0
  302. package/package/models/CRUD.js +263 -0
  303. package/{models → package/models}/Firebase.d.ts +0 -0
  304. package/package/models/Firebase.js +36 -0
  305. package/{models → package/models}/book/Book.d.ts +23 -18
  306. package/package/models/book/Book.js +135 -0
  307. package/{models → package/models}/book/BookMedia.d.ts +1 -1
  308. package/{models → package/models}/book/BookMedia.js +9 -10
  309. package/{models → package/models}/book/BookSaveStatus.d.ts +0 -0
  310. package/{models → package/models}/book/BookSaveStatus.js +0 -0
  311. package/{models → package/models}/book/Chapter.d.ts +5 -1
  312. package/{models → package/models}/book/Chapter.js +24 -15
  313. package/{models → package/models}/book/ChapterID.d.ts +0 -0
  314. package/{models → package/models}/book/ChapterID.js +0 -0
  315. package/{models → package/models}/book/Definition.d.ts +0 -0
  316. package/{models → package/models}/book/Definition.js +0 -0
  317. package/{models → package/models}/book/Edition.d.ts +33 -7
  318. package/{models → package/models}/book/Edition.js +104 -32
  319. package/{models → package/models}/book/Reference.d.ts +0 -0
  320. package/{models → package/models}/book/Reference.js +0 -0
  321. package/{models → package/models}/book/Schema.d.ts +20 -15
  322. package/{models → package/models}/book/Schema.js +17 -16
  323. package/{models → package/models}/book/Theme.d.ts +0 -0
  324. package/{models → package/models}/book/Theme.js +7 -6
  325. package/{models → package/models}/book/ThemeColors.d.ts +0 -0
  326. package/{models → package/models}/book/ThemeColors.js +0 -0
  327. package/{models → package/models}/book/Words.d.ts +0 -0
  328. package/{models → package/models}/book/Words.js +0 -0
  329. package/{models → package/models}/chapter/AtomNode.d.ts +0 -0
  330. package/{models → package/models}/chapter/AtomNode.js +0 -0
  331. package/{models → package/models}/chapter/BlockNode.d.ts +0 -0
  332. package/{models → package/models}/chapter/BlockNode.js +0 -0
  333. package/{models → package/models}/chapter/BlocksNode.d.ts +0 -0
  334. package/{models → package/models}/chapter/BlocksNode.js +0 -0
  335. package/{models → package/models}/chapter/BlocksNode.test.d.ts +0 -0
  336. package/{models → package/models}/chapter/BlocksNode.test.js +0 -0
  337. package/{models → package/models}/chapter/Bookkeeping.d.ts +0 -0
  338. package/{models → package/models}/chapter/Bookkeeping.js +0 -0
  339. package/{models → package/models}/chapter/CalloutNode.d.ts +0 -0
  340. package/{models → package/models}/chapter/CalloutNode.js +0 -0
  341. package/{models → package/models}/chapter/Caret.d.ts +0 -0
  342. package/{models → package/models}/chapter/Caret.js +0 -0
  343. package/{models → package/models}/chapter/ChapterNode.d.ts +0 -0
  344. package/{models → package/models}/chapter/ChapterNode.js +0 -0
  345. package/{models → package/models}/chapter/CitationsNode.d.ts +0 -0
  346. package/{models → package/models}/chapter/CitationsNode.js +0 -0
  347. package/{models → package/models}/chapter/CodeNode.d.ts +0 -0
  348. package/{models → package/models}/chapter/CodeNode.js +0 -0
  349. package/{models → package/models}/chapter/CommentNode.d.ts +0 -0
  350. package/{models → package/models}/chapter/CommentNode.js +13 -3
  351. package/{models → package/models}/chapter/DefinitionNode.d.ts +0 -0
  352. package/{models → package/models}/chapter/DefinitionNode.js +0 -0
  353. package/{models → package/models}/chapter/Edit.d.ts +0 -0
  354. package/{models → package/models}/chapter/Edit.js +0 -0
  355. package/{models → package/models}/chapter/EmbedNode.d.ts +1 -0
  356. package/{models → package/models}/chapter/EmbedNode.js +6 -0
  357. package/{models → package/models}/chapter/ErrorNode.d.ts +0 -0
  358. package/{models → package/models}/chapter/ErrorNode.js +0 -0
  359. package/{models → package/models}/chapter/FootnoteNode.d.ts +0 -0
  360. package/{models → package/models}/chapter/FootnoteNode.js +0 -0
  361. package/{models → package/models}/chapter/FormatNode.d.ts +0 -0
  362. package/{models → package/models}/chapter/FormatNode.js +1 -6
  363. package/{models → package/models}/chapter/FormatNode.test.d.ts +0 -0
  364. package/{models → package/models}/chapter/FormatNode.test.js +0 -0
  365. package/{models → package/models}/chapter/InlineCodeNode.d.ts +0 -0
  366. package/{models → package/models}/chapter/InlineCodeNode.js +0 -0
  367. package/{models → package/models}/chapter/LabelNode.d.ts +0 -0
  368. package/{models → package/models}/chapter/LabelNode.js +0 -0
  369. package/{models → package/models}/chapter/LinkNode.d.ts +0 -0
  370. package/{models → package/models}/chapter/LinkNode.js +0 -0
  371. package/{models → package/models}/chapter/ListNode.d.ts +0 -0
  372. package/{models → package/models}/chapter/ListNode.js +0 -0
  373. package/{models → package/models}/chapter/ListNode.test.d.ts +0 -0
  374. package/{models → package/models}/chapter/ListNode.test.js +0 -0
  375. package/{models → package/models}/chapter/MetadataNode.d.ts +0 -0
  376. package/{models → package/models}/chapter/MetadataNode.js +0 -0
  377. package/{models → package/models}/chapter/Node.d.ts +0 -0
  378. package/{models → package/models}/chapter/Node.js +0 -0
  379. package/{models → package/models}/chapter/Node.test.d.ts +0 -0
  380. package/{models → package/models}/chapter/Node.test.js +0 -0
  381. package/{models → package/models}/chapter/ParagraphNode.d.ts +0 -0
  382. package/{models → package/models}/chapter/ParagraphNode.js +0 -0
  383. package/{models → package/models}/chapter/ParagraphNode.test.d.ts +0 -0
  384. package/{models → package/models}/chapter/ParagraphNode.test.js +0 -0
  385. package/{models → package/models}/chapter/Parser.d.ts +2 -2
  386. package/{models → package/models}/chapter/Parser.js +26 -24
  387. package/{models → package/models}/chapter/Parser.test.d.ts +0 -0
  388. package/{models → package/models}/chapter/Parser.test.js +0 -0
  389. package/{models → package/models}/chapter/Position.d.ts +0 -0
  390. package/{models → package/models}/chapter/Position.js +0 -0
  391. package/{models → package/models}/chapter/QuoteNode.d.ts +0 -0
  392. package/{models → package/models}/chapter/QuoteNode.js +0 -0
  393. package/{models → package/models}/chapter/RootNode.d.ts +0 -0
  394. package/{models → package/models}/chapter/RootNode.js +0 -0
  395. package/{models → package/models}/chapter/RuleNode.d.ts +0 -0
  396. package/{models → package/models}/chapter/RuleNode.js +0 -0
  397. package/{models → package/models}/chapter/TableNode.d.ts +0 -0
  398. package/{models → package/models}/chapter/TableNode.js +0 -0
  399. package/{models → package/models}/chapter/TableNode.test.d.ts +0 -0
  400. package/{models → package/models}/chapter/TableNode.test.js +0 -0
  401. package/{models → package/models}/chapter/TextNode.d.ts +0 -0
  402. package/{models → package/models}/chapter/TextNode.js +0 -0
  403. package/{models → package/models}/chapter/TextNode.test.d.ts +0 -0
  404. package/{models → package/models}/chapter/TextNode.test.js +0 -0
  405. package/package/util/dark.d.ts +2 -0
  406. package/package/util/dark.js +16 -0
  407. package/{util → package/util}/getSubdomain.d.ts +0 -0
  408. package/{util → package/util}/getSubdomain.js +0 -0
  409. package/{util → package/util}/isMobile.d.ts +0 -0
  410. package/{util → package/util}/isMobile.js +0 -0
  411. package/{util → package/util}/mineReference.d.ts +0 -0
  412. package/{util → package/util}/mineReference.js +0 -0
  413. package/{util → package/util}/scrollToEyeLevel.d.ts +0 -0
  414. package/{util → package/util}/scrollToEyeLevel.js +0 -0
  415. package/package.json +131 -267
  416. package/components/External.svelte +0 -4
  417. package/components/External.svelte.d.ts +0 -18
  418. package/components/app/Link.svelte +0 -24
  419. package/components/app/Writing.svelte.d.ts +0 -27
  420. package/components/editor/ConfirmButton.svelte +0 -49
  421. package/components/page/Authors.svelte +0 -82
  422. package/components/page/Contexts.js +0 -51
  423. package/components/page/Editions.svelte +0 -158
  424. package/components/page/License.svelte +0 -37
  425. package/components/page/MediaPreview.svelte +0 -29
  426. package/components/page/Status.svelte +0 -57
  427. package/components/page/TableOfContentsImage.svelte +0 -15
  428. package/models/CRUD.d.ts +0 -17
  429. package/models/CRUD.js +0 -207
  430. package/models/Firebase.js +0 -32
  431. package/models/book/Book.js +0 -142
  432. package/models/loadEdition.d.ts +0 -5
  433. package/models/loadEdition.js +0 -20
@@ -11,7 +11,7 @@ import ChapterBody from '../chapter/ChapterBody.svelte';
11
11
  import PossibleReference from './PossibleReference.svelte';
12
12
  import ChapterNumber from './ChapterNumber.svelte';
13
13
  import Problem from '../chapter/Problem.svelte';
14
- import { CHAPTER, getBook, getEdition, isEditable, setChapter, } from './Contexts';
14
+ import { CHAPTER, getUser, getBook, getEdition, isBookEditable, isChapterEditable, isEditionPartiallyEditable, getLeasee, lease, setChapter, isEditionEditable, } from './Contexts';
15
15
  import { writable } from 'svelte/store';
16
16
  import { onMount, setContext } from 'svelte';
17
17
  import { hideOutlineIfObscured, layoutMarginals } from './margins';
@@ -20,20 +20,17 @@ import { goto } from '$app/navigation';
20
20
  import ChapterNode from '../../models/chapter/ChapterNode';
21
21
  import Muted from './Muted.svelte';
22
22
  import Title from './Title.svelte';
23
+ import PageHeader from './PageHeader.svelte';
24
+ import Permissions from '../editor/Permissions.svelte';
23
25
  export let chapter;
24
26
  export let print = false;
25
27
  let book = getBook();
26
28
  let edition = getEdition();
27
- let editable = isEditable();
29
+ let auth = getUser();
28
30
  // Keep track of the scroll position to facilitate reading during reloads.
29
31
  function rememberPosition() {
30
32
  localStorage.setItem('scrollposition', '' + window.scrollY);
31
33
  }
32
- // When the window resizes, the responsive layout might cause the marginals to move to the footer.
33
- // when this happens, we want to immediately remove all of the explicit positioning.
34
- function handleResize() {
35
- layoutMarginals();
36
- }
37
34
  // The currently selected marginal; we only do one at a time.
38
35
  let marginal = writable(undefined);
39
36
  // Keep track of which hash mark is scrolled to
@@ -69,7 +66,10 @@ onMount(() => {
69
66
  };
70
67
  // Lay things out when the window or scroll changes.
71
68
  window.addEventListener('scroll', handleScroll);
72
- window.addEventListener('resize', handleResize);
69
+ // When the chapter view resizes, the responsive layout might cause the marginals to move to the footer.
70
+ // when this happens, we want to immediately remove all of the explicit positioning.
71
+ const resize = new ResizeObserver(() => layoutMarginals());
72
+ resize.observe(document.body);
73
73
  // Remember the scroll position before a refresh.
74
74
  // We have to do all of these because browser support varies.
75
75
  window.addEventListener('beforeunload', rememberPosition);
@@ -99,7 +99,7 @@ onMount(() => {
99
99
  // On cleanup, unsubscribe from everything above.
100
100
  return () => {
101
101
  window.removeEventListener('scroll', handleScroll);
102
- window.removeEventListener('resize', handleResize);
102
+ resize.unobserve(document.body);
103
103
  // Stop listening to page visibility changes.
104
104
  window.removeEventListener('beforeunload', rememberPosition);
105
105
  window.removeEventListener('visibilitychange', rememberPosition);
@@ -156,11 +156,15 @@ function scrollToLastLocation() {
156
156
  }
157
157
  }
158
158
  }
159
+ /** Account for static builds, where location isn't defined */
160
+ function getLocation() {
161
+ return typeof location === 'undefined' ? undefined : location;
162
+ }
159
163
  function getHighlightedWord() {
160
- return location.search.split('&')[0]?.split('=')[1] ?? undefined;
164
+ return getLocation()?.search.split('&')[0]?.split('=')[1] ?? undefined;
161
165
  }
162
166
  function getHighlightedNumber() {
163
- const number = location.search.split('&')[1]?.split('=')[1];
167
+ const number = getLocation()?.search.split('&')[1]?.split('=')[1];
164
168
  return number === undefined ? undefined : parseInt(number);
165
169
  }
166
170
  // Prepare to render the chapter by getting some data from the chapter and book.
@@ -169,17 +173,22 @@ $: chapterNumber = $edition?.getChapterNumber(chapterID);
169
173
  $: chapterSection = $edition?.getChapterSection(chapterID);
170
174
  $: chapterAST = $edition ? chapter.getAST($edition) : undefined;
171
175
  $: citations = chapterAST ? chapterAST.getCitations() : undefined;
172
- $: editionNumber =
173
- $book && $edition ? $edition.getEditionNumber($book) : undefined;
176
+ $: editionNumber = $edition ? $edition.getEditionNumber() : undefined;
174
177
  let chapterStore = writable();
175
178
  setContext(CHAPTER, chapterStore);
176
179
  $: chapterStore.set({
177
- chapter: chapter,
180
+ chapter,
178
181
  highlightedWord: getHighlightedWord(),
179
- highlightedID: highlightedID,
180
- marginal: marginal,
181
- layoutMarginals: layoutMarginals,
182
+ highlightedID,
183
+ marginal,
184
+ layoutMarginals,
182
185
  });
186
+ let editable = isBookEditable() ||
187
+ isEditionEditable() ||
188
+ isChapterEditable() ||
189
+ ($auth !== undefined &&
190
+ $auth.user !== null &&
191
+ chapter.isEditor($auth.user.uid));
183
192
  </script>
184
193
 
185
194
  {#if $edition}
@@ -188,6 +197,8 @@ $: chapterStore.set({
188
197
  title={`${$edition.getTitle()} - ${chapter.getTitle()}`}
189
198
  >
190
199
  <Header
200
+ editable={isChapterEditable()}
201
+ id={chapter.id}
191
202
  header={chapter.getTitle()}
192
203
  label="Chapter title"
193
204
  tags={$edition.getTags()}
@@ -201,7 +212,7 @@ $: chapterStore.set({
201
212
  <!-- Collapse the outline if a marginal is selected. -->
202
213
  <Outline
203
214
  slot="outline"
204
- collapse={marginal !== undefined}
215
+ collapse={$marginal !== undefined}
205
216
  previous={$edition.getPreviousChapterID(chapterID)}
206
217
  next={$edition.getNextChapterID(chapterID)}
207
218
  listener={(expanded) => {
@@ -216,20 +227,24 @@ $: chapterStore.set({
216
227
  <svelte:fragment slot="before">
217
228
  {#if editable && $book}
218
229
  <Muted>
219
- <TextEditor
230
+ <em>bookish.press/book/</em><TextEditor
220
231
  text={chapter.getID()}
221
232
  label="Chapter URL ID editor"
222
233
  save={// After the ID is edited, reload the page with the new URL.
223
234
  (newChapterID) => {
224
235
  if ($book) {
225
- chapter.withChapterID(newChapterID);
236
+ setChapter(
237
+ edition,
238
+ chapter,
239
+ chapter.withChapterID(newChapterID)
240
+ );
226
241
  // Navigate to the new ID
227
242
  goto(
228
- `/write/${$book.ref.id}/${editionNumber}/${newChapterID}`
243
+ `/write/${$book.getID()}/${editionNumber}/${newChapterID}`
229
244
  );
230
245
  }
231
246
  }}
232
- placeholder="chapter ID"
247
+ placeholder="chapter name"
233
248
  valid={(newChapterID) =>
234
249
  !/^[a-zA-Z0-9]+$/.test(newChapterID)
235
250
  ? 'Chapter IDs must be one or more letters or numbers'
@@ -266,6 +281,7 @@ $: chapterStore.set({
266
281
  </svelte:fragment>
267
282
  <!-- If there are chapter authors, render those, otherwise use the book authors -->
268
283
  <Authors
284
+ editable={isChapterEditable()}
269
285
  slot="after"
270
286
  authors={chapter.getAuthors()}
271
287
  inheritedAuthors={$edition.getAuthors()}
@@ -281,13 +297,13 @@ $: chapterStore.set({
281
297
  />
282
298
  </Header>
283
299
 
284
- <Instructions>
300
+ <Instructions {editable}>
285
301
  Edit your chapter's title, authors, and cover image above. You can
286
- also change the ID of the chapter, which appears in it's URL. Write
287
- your chapter text below, using the many formatting options in the
288
- toolbar above to format text, add headers, lists, tables, comments,
302
+ also change the ID of the chapter, which is the text that appears in
303
+ the chapter URL. Write your chapter text below, formatting options
304
+ in the toolbar above to add headers, lists, tables, comments,
289
305
  citations, footnotes, and more. It's okay to try things, you can
290
- always undo! Saves are automatic, each time you stop typing.
306
+ always undo. Saves are automatic.
291
307
  </Instructions>
292
308
 
293
309
  <!-- Render the chapter body, passing some context -->
@@ -295,7 +311,8 @@ $: chapterStore.set({
295
311
  {#if chapterAST}
296
312
  {#if editable}
297
313
  <BookishEditor
298
- ast={chapterAST}
314
+ text={chapterAST.toBookdown()}
315
+ parser={(text) => Parser.parseChapter($edition, text)}
299
316
  save={(ast) =>
300
317
  ast instanceof ChapterNode
301
318
  ? setChapter(
@@ -307,7 +324,9 @@ $: chapterStore.set({
307
324
  chapter={true}
308
325
  autofocus
309
326
  component={ChapterBody}
310
- placeholder="Type here"
327
+ placeholder="write here"
328
+ leasee={getLeasee(auth, edition, chapter.id)}
329
+ lease={(lock) => lease(auth, edition, chapter.id, lock)}
311
330
  />
312
331
  {:else}
313
332
  <ChapterBody node={chapterAST} />
@@ -327,7 +346,7 @@ $: chapterStore.set({
327
346
  class={'bookish-reference'}
328
347
  id={'ref-' + citationID}
329
348
  >
330
- <PossibleReference node={refs[citationID]} />
349
+ <PossibleReference node={refs[citationID]} edit />
331
350
  </li>
332
351
  {:else}
333
352
  <li
@@ -340,12 +359,32 @@ $: chapterStore.set({
340
359
  {/each}
341
360
  </ol>
342
361
  {/if}
362
+
363
+ {#if editable || isEditionPartiallyEditable()}
364
+ <PageHeader>Editors</PageHeader>
365
+ <Instructions {editable}
366
+ >These authors can edit this chapter. Add an email here to
367
+ provide chapter-level edit permissions.</Instructions
368
+ >
369
+
370
+ <Permissions
371
+ uids={chapter.uids}
372
+ inheriteduids={Array.from(
373
+ new Set([...$edition.uids, ...($book ? $book.uids : [])])
374
+ )}
375
+ atleastone={false}
376
+ writable={isChapterEditable()}
377
+ change={(uids) =>
378
+ setChapter(edition, chapter, chapter.withEditors(uids))}
379
+ />
380
+ {/if}
343
381
  </Page>
344
382
  {/if}
345
383
 
346
384
  <style>
347
385
  .section-name {
348
386
  display: inline-block;
387
+ margin-left: 0.5em;
349
388
  font-family: var(--bookish-paragraph-font-family);
350
389
  font-size: var(--bookish-small-font-size);
351
390
  font-weight: normal;
@@ -6,28 +6,39 @@ import type Edition from '../../models/book/Edition';
6
6
  import type Authentication from '../Authentication';
7
7
  import type CaretState from '../editor/CaretState';
8
8
  import type ChapterContext from './ChapterContext';
9
+ import type { DocumentReference } from 'firebase/firestore';
10
+ import type ChapterNode from '../../models/chapter/ChapterNode';
9
11
  export type DarkModeStore = Writable<boolean>;
10
12
  export declare const DARK_MODE: unique symbol;
11
13
  export declare function getDarkMode(): DarkModeStore;
12
- export type AuthStore = Writable<Authentication | undefined>;
13
- export declare const AUTH: unique symbol;
14
- export declare function getAuth(): AuthStore;
14
+ export type UserStore = Writable<Authentication | undefined>;
15
+ export declare const USER: unique symbol;
16
+ export declare function getUser(): UserStore;
15
17
  export type BookStore = Writable<Book | undefined>;
16
18
  export declare const BOOK: unique symbol;
17
19
  export declare function getBook(): BookStore;
18
20
  export type EditionStore = Writable<Edition | undefined>;
19
21
  export declare const EDITION: unique symbol;
20
22
  export declare function getEdition(): EditionStore;
23
+ export type ChapterText = [DocumentReference, string][];
24
+ export type ChapterTextStore = Writable<ChapterText | undefined>;
25
+ export declare const CHAPTERTEXT: unique symbol;
26
+ export declare function getChapterText(): ChapterTextStore;
21
27
  export type ChapterStore = Writable<ChapterContext>;
22
28
  export declare const CHAPTER: unique symbol;
23
29
  export declare function getChapter(): ChapterStore;
30
+ export type RootStore = Writable<ChapterNode>;
31
+ export declare const ROOT: unique symbol;
32
+ export declare function getRoot(): RootStore;
24
33
  /**
25
34
  * Update the edition that contains the chapter, then update the
26
35
  * global edition store with the new edition, propogating the changes everywhere.
27
36
  */
28
37
  export declare function setChapter(store: EditionStore, previous: Chapter, chapter: Chapter): void;
29
- export declare const EDITABLE: unique symbol;
30
- export declare function isEditable(): boolean;
38
+ export declare function isChapterEditable(): boolean;
39
+ export declare function isEditionEditable(): boolean;
40
+ export declare function isEditionPartiallyEditable(): boolean;
41
+ export declare function isBookEditable(): boolean;
31
42
  export declare const BASE: unique symbol;
32
43
  export type BaseStore = Writable<string>;
33
44
  export declare function getBase(): BaseStore;
@@ -36,3 +47,8 @@ export declare function getCaret(): Writable<CaretState | undefined>;
36
47
  export declare const STATUS: unique symbol;
37
48
  export type StatusStore = Writable<BookSaveStatus>;
38
49
  export declare function getStatus(): StatusStore;
50
+ export declare const EDITORS: unique symbol;
51
+ export type EditorsStore = Writable<Map<string, string>>;
52
+ export declare function getEditors(): EditorsStore;
53
+ export declare function lease(authStore: UserStore, editionStore: EditionStore, contentID: string, lock: boolean): Promise<boolean>;
54
+ export declare function getLeasee(authStore: UserStore, editionStore: EditionStore, contentID: string): string | boolean;
@@ -0,0 +1,144 @@
1
+ // We use these unique objects as keys in Svelte context in order
2
+ // to avoid key collisions and prevent typos. This is partly
3
+ // future-proofing, but also because getContext<Type>() isn't type safe,
4
+ // as the resulting value is coerced to Type even if it's not that value.
5
+ import { getContext } from 'svelte';
6
+ import { get } from 'svelte/store';
7
+ import { page } from '$app/stores';
8
+ import { updateLock } from '../../models/CRUD';
9
+ export const DARK_MODE = Symbol('dark');
10
+ export function getDarkMode() {
11
+ return getContext(DARK_MODE);
12
+ }
13
+ export const USER = Symbol('user');
14
+ export function getUser() {
15
+ return getContext(USER);
16
+ }
17
+ export const BOOK = Symbol('book');
18
+ export function getBook() {
19
+ return getContext(BOOK);
20
+ }
21
+ export const EDITION = Symbol('edition');
22
+ export function getEdition() {
23
+ return getContext(EDITION);
24
+ }
25
+ export const CHAPTERTEXT = Symbol('chaptertext');
26
+ export function getChapterText() {
27
+ return getContext(CHAPTERTEXT);
28
+ }
29
+ export const CHAPTER = Symbol('chapter');
30
+ export function getChapter() {
31
+ return getContext(CHAPTER);
32
+ }
33
+ export const ROOT = Symbol('root');
34
+ export function getRoot() {
35
+ return getContext(ROOT);
36
+ }
37
+ /**
38
+ * Update the edition that contains the chapter, then update the
39
+ * global edition store with the new edition, propogating the changes everywhere.
40
+ */
41
+ export function setChapter(store, previous, chapter) {
42
+ const edition = get(store);
43
+ if (edition)
44
+ store.set(edition.withRevisedChapter(previous, chapter));
45
+ }
46
+ function isRouteWrite() {
47
+ return get(page).route.id?.startsWith('/(app)/write') ?? false;
48
+ }
49
+ export function isChapterEditable() {
50
+ if (!isRouteWrite())
51
+ return false;
52
+ const auth = get(getUser());
53
+ const chapter = get(getChapter());
54
+ const edition = get(getEdition());
55
+ const book = get(getBook());
56
+ return (chapter !== undefined &&
57
+ edition !== undefined &&
58
+ book !== undefined &&
59
+ auth !== undefined &&
60
+ auth.user !== null &&
61
+ (chapter.chapter.isEditor(auth.user.uid) ||
62
+ edition.isEditor(auth.user.uid) ||
63
+ book.isEditor(auth.user.uid)));
64
+ }
65
+ export function isEditionEditable() {
66
+ if (!isRouteWrite())
67
+ return false;
68
+ const auth = get(getUser());
69
+ const edition = get(getEdition());
70
+ const book = get(getBook());
71
+ return (edition !== undefined &&
72
+ book !== undefined &&
73
+ auth !== undefined &&
74
+ auth.user !== null &&
75
+ (edition.isEditor(auth.user.uid) || book.isEditor(auth.user.uid)));
76
+ }
77
+ export function isEditionPartiallyEditable() {
78
+ if (!isRouteWrite())
79
+ return false;
80
+ const auth = get(getUser());
81
+ const edition = get(getEdition());
82
+ return (edition !== undefined &&
83
+ auth !== undefined &&
84
+ auth.user !== null &&
85
+ edition.isChapterEditor(auth.user.uid));
86
+ }
87
+ export function isBookEditable() {
88
+ if (!isRouteWrite())
89
+ return false;
90
+ const auth = get(getUser());
91
+ const book = get(getBook());
92
+ return (book !== undefined &&
93
+ auth !== undefined &&
94
+ auth.user !== null &&
95
+ book.isEditor(auth.user.uid));
96
+ }
97
+ export const BASE = Symbol('base');
98
+ export function getBase() {
99
+ return getContext(BASE);
100
+ }
101
+ export const CARET = Symbol('caret');
102
+ export function getCaret() {
103
+ return getContext(CARET);
104
+ }
105
+ export const STATUS = Symbol('status');
106
+ export function getStatus() {
107
+ return getContext(STATUS);
108
+ }
109
+ export const EDITORS = Symbol('editors');
110
+ export function getEditors() {
111
+ return getContext(EDITORS);
112
+ }
113
+ export async function lease(authStore, editionStore, contentID, lock) {
114
+ const edition = get(editionStore);
115
+ const auth = get(authStore);
116
+ if (edition && auth && auth.user) {
117
+ await updateLock(edition, auth.user.uid, contentID, lock);
118
+ const latestEdition = get(editionStore);
119
+ const latestAuth = get(authStore);
120
+ if (latestEdition && latestAuth && latestAuth.user) {
121
+ editionStore.set(latestEdition.withLock(latestAuth.user.uid, contentID, lock));
122
+ return true;
123
+ }
124
+ else
125
+ return false;
126
+ }
127
+ else
128
+ return false;
129
+ }
130
+ export function getLeasee(authStore, editionStore, contentID) {
131
+ const edition = get(editionStore);
132
+ const auth = get(authStore);
133
+ if (edition !== undefined && auth !== undefined && auth.user !== null) {
134
+ const leasee = edition.getLeasee(contentID);
135
+ if (leasee === undefined)
136
+ return false;
137
+ else if (leasee === auth.user.uid)
138
+ return true;
139
+ else
140
+ return leasee;
141
+ }
142
+ else
143
+ return false;
144
+ }
@@ -5,12 +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 { getEdition, isEditable } from './Contexts';
8
+ import { getUser, getEdition, getLeasee, isChapterEditable, lease, } from './Contexts';
9
9
  import Button from '../app/Button.svelte';
10
10
  export let id;
11
11
  export let definition;
12
+ let auth = getUser();
12
13
  let edition = getEdition();
13
- let editable = isEditable();
14
+ let editable = isChapterEditable();
14
15
  // Focus after adding a new synonym.
15
16
  let newSynonym = false;
16
17
  let synonymsEditor = null;
@@ -25,7 +26,6 @@ afterUpdate(() => {
25
26
  newSynonym = false;
26
27
  }
27
28
  });
28
- $: format = Parser.parseFormat(undefined, definition.definition).withTextIfEmpty();
29
29
  function addSynonym() {
30
30
  if ($edition) {
31
31
  edition.set($edition.withEditedDefinition(id, {
@@ -46,7 +46,7 @@ $: syns = definition.synonyms || [];
46
46
  <TextEditor
47
47
  text={definition.phrase}
48
48
  label={'Glossary phrase editor.'}
49
- placeholder="Phrase"
49
+ placeholder="phrase"
50
50
  valid={(text) => {
51
51
  if (text.length === 0) return "phrase can't be empty";
52
52
  }}
@@ -66,21 +66,22 @@ $: syns = definition.synonyms || [];
66
66
  >{/if}
67
67
  {#if editable}
68
68
  <ConfirmButton
69
- tooltip="delete entry {definition.phrase}"
70
- commandLabel="- definition"
71
- confirmLabel="confirm"
69
+ tooltip="delete definition of {definition.phrase}"
70
+ confirm="remove definition?"
72
71
  command={() =>
73
72
  $edition
74
73
  ? edition.set($edition.withoutDefinition(id))
75
- : undefined}
76
- />
74
+ : undefined}>- definition</ConfirmButton
75
+ >
77
76
  {/if}
78
77
  </dt>
79
78
 
80
79
  <dd class="term">
81
80
  {#if editable && edition}
82
81
  <BookishEditor
83
- ast={format}
82
+ text={definition.definition}
83
+ parser={(text) =>
84
+ Parser.parseFormat(undefined, text).withTextIfEmpty()}
84
85
  save={(node) =>
85
86
  $edition
86
87
  ? edition.set(
@@ -93,12 +94,20 @@ $: syns = definition.synonyms || [];
93
94
  : undefined}
94
95
  chapter={false}
95
96
  component={Format}
96
- placeholder="write a definition"
97
+ placeholder="definition"
98
+ leasee={getLeasee(auth, edition, `definition-${id}`)}
99
+ lease={(lock) =>
100
+ lease(auth, edition, `definition-${id}`, lock)}
97
101
  />
98
102
  {:else if definition.definition === ''}
99
103
  <em>Definition</em>
100
104
  {:else}
101
- <Format node={format} />
105
+ <Format
106
+ node={Parser.parseFormat(
107
+ undefined,
108
+ definition.definition
109
+ ).withTextIfEmpty()}
110
+ />
102
111
  {/if}
103
112
  {#if edition && editable}
104
113
  <span bind:this={synonymsEditor}>
@@ -110,7 +119,7 @@ $: syns = definition.synonyms || [];
110
119
  <TextEditor
111
120
  text={syn}
112
121
  label={'Synonym editor.'}
113
- placeholder="Synonym"
122
+ placeholder="synonym"
114
123
  valid={() => undefined}
115
124
  save={(text) => {
116
125
  const newSyns = [...syns];
@@ -149,7 +158,7 @@ $: syns = definition.synonyms || [];
149
158
  <style>
150
159
  dd {
151
160
  margin: 0;
152
- margin-top: var(--bookish-paragraph-spacing);
161
+ margin-bottom: var(--bookish-paragraph-spacing);
153
162
  }
154
163
 
155
164
  dt {
@@ -1,19 +1,18 @@
1
1
  <script>import Parser from '../../models/chapter/Parser';
2
2
  import ChapterBody from '../chapter/ChapterBody.svelte';
3
3
  import BookishEditor from '../editor/BookishEditor.svelte';
4
- import { getEdition, isEditable } from './Contexts';
5
- let editable = isEditable();
4
+ import { getUser, getEdition, getLeasee, isEditionEditable, lease, } from './Contexts';
5
+ let auth = getUser();
6
+ let editable = isEditionEditable();
6
7
  let edition = getEdition();
7
- $: descriptionNode = $edition
8
- ? Parser.parseChapter($edition, $edition.getDescription())
9
- : undefined;
10
8
  </script>
11
9
 
12
- {#if descriptionNode}
10
+ {#if $edition}
13
11
  <section class="bookish-description">
14
12
  {#if editable}
15
13
  <BookishEditor
16
- ast={descriptionNode}
14
+ text={$edition.getDescription()}
15
+ parser={(text) => Parser.parseChapter($edition, text)}
17
16
  save={(node) =>
18
17
  $edition
19
18
  ? edition.set(
@@ -22,10 +21,14 @@ $: descriptionNode = $edition
22
21
  : undefined}
23
22
  chapter={false}
24
23
  component={ChapterBody}
25
- placeholder="What is this book about?"
24
+ placeholder="description"
25
+ leasee={getLeasee(auth, edition, `description`)}
26
+ lease={(lock) => lease(auth, edition, `description`, lock)}
26
27
  />
27
28
  {:else}
28
- <ChapterBody node={descriptionNode} />
29
+ <ChapterBody
30
+ node={Parser.parseChapter($edition, $edition.getDescription())}
31
+ />
29
32
  {/if}
30
33
  </section>
31
34
  {/if}
@@ -2,46 +2,32 @@
2
2
  import { goto } from '$app/navigation';
3
3
  import { onMount, setContext } from 'svelte';
4
4
  import { writable } from 'svelte/store';
5
- import { BASE, DARK_MODE, EDITABLE, } from './Contexts';
5
+ import { BASE, DARK_MODE, } from './Contexts';
6
6
  import { BookishTheme } from '../../models/book/Theme';
7
+ import { isDark, setDark } from '../../util/dark';
7
8
  // Poly fill smooth scrolling for Safari.
8
9
  onMount(() => smoothscroll.polyfill());
9
- // True if the edition should be editable. Distributed as context.
10
- export let editable = false;
11
- // When editable changes, update the context.
12
- $: setContext(EDITABLE, editable);
10
+ // The book edition to render.
11
+ export let edition;
13
12
  // The base path allows links to adjust to different routing contexts in which a book is placed.
14
13
  // For example, when the book is hosted alone, all routes might start with the bare root "/",
15
14
  // but when the book is being viewed or edited in the Bookish app, it needs a prefix for the
16
15
  // route in the app.
17
- export let base = '/';
16
+ export let base = '';
18
17
  // When the base changes, update the context.
19
18
  let baseStore = writable(base);
20
19
  $: setContext(BASE, baseStore);
21
20
  $: baseStore.set(base);
22
- // The book edition to render.
23
- export let edition;
24
21
  // Default dark mode to whatever's stored in local storage, if anything.
25
22
  // respect user choice on the website despite the system theme
26
- let darkMode = writable(typeof localStorage !== 'undefined' &&
27
- localStorage.getItem('dark') !== 'false' &&
28
- (localStorage.getItem('dark') === 'true' || // A previous setting
29
- window.matchMedia('(prefers-color-scheme: dark)').matches) // Operating system is set to dark
30
- );
23
+ let darkMode = writable(isDark());
31
24
  // Expose dark mode to descendants
32
25
  setContext(DARK_MODE, darkMode);
33
26
  // When dark mode changes, update the body's class list.
34
27
  $: {
35
- if (typeof document !== 'undefined') {
36
- if ($darkMode)
37
- document.body.classList.add('dark');
38
- else
39
- document.body.classList.remove('dark');
40
- if (typeof localStorage !== 'undefined')
41
- localStorage.setItem('dark', $darkMode ? 'true' : 'false');
42
- // Set the theme, whatever it is, and change it when the edition changes
43
- setTheme(edition.getTheme() ?? BookishTheme);
44
- }
28
+ setDark($darkMode);
29
+ // Set the theme, whatever it is, and change it when the edition changes
30
+ setTheme(edition.getTheme() ?? BookishTheme);
45
31
  }
46
32
  // Set the theme on mount.
47
33
  onMount(() => {
@@ -2,9 +2,8 @@ import { SvelteComponentTyped } from "svelte";
2
2
  import type EditionModel from '../../models/book/Edition';
3
3
  declare const __propDef: {
4
4
  props: {
5
- editable?: boolean | undefined;
6
- base?: string | undefined;
7
5
  edition: EditionModel;
6
+ base?: string | undefined;
8
7
  };
9
8
  events: {
10
9
  [evt: string]: CustomEvent<any>;