bookish-press 0.4.0

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 (309) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/components/Auth.svelte +52 -0
  4. package/components/Auth.svelte.d.ts +16 -0
  5. package/components/Authentication.d.ts +8 -0
  6. package/components/Authentication.js +1 -0
  7. package/components/BookPreview.svelte +87 -0
  8. package/components/BookPreview.svelte.d.ts +18 -0
  9. package/components/External.svelte +4 -0
  10. package/components/External.svelte.d.ts +18 -0
  11. package/components/Link.svelte +5 -0
  12. package/components/Link.svelte.d.ts +19 -0
  13. package/components/chapter/Atom.svelte +36 -0
  14. package/components/chapter/Atom.svelte.d.ts +19 -0
  15. package/components/chapter/Block.svelte +32 -0
  16. package/components/chapter/Block.svelte.d.ts +17 -0
  17. package/components/chapter/Callout.svelte +10 -0
  18. package/components/chapter/Callout.svelte.d.ts +17 -0
  19. package/components/chapter/CaptionedCode.svelte +34 -0
  20. package/components/chapter/CaptionedCode.svelte.d.ts +17 -0
  21. package/components/chapter/ChapterBody.svelte +23 -0
  22. package/components/chapter/ChapterBody.svelte.d.ts +18 -0
  23. package/components/chapter/Citations.svelte +66 -0
  24. package/components/chapter/Citations.svelte.d.ts +17 -0
  25. package/components/chapter/Code.svelte +35 -0
  26. package/components/chapter/Code.svelte.d.ts +22 -0
  27. package/components/chapter/Comment.svelte +46 -0
  28. package/components/chapter/Comment.svelte.d.ts +17 -0
  29. package/components/chapter/Definition.svelte +38 -0
  30. package/components/chapter/Definition.svelte.d.ts +20 -0
  31. package/components/chapter/Embed.svelte +122 -0
  32. package/components/chapter/Embed.svelte.d.ts +18 -0
  33. package/components/chapter/ErrorMessage.svelte +4 -0
  34. package/components/chapter/ErrorMessage.svelte.d.ts +17 -0
  35. package/components/chapter/Footnote.svelte +37 -0
  36. package/components/chapter/Footnote.svelte.d.ts +19 -0
  37. package/components/chapter/Format.svelte +57 -0
  38. package/components/chapter/Format.svelte.d.ts +18 -0
  39. package/components/chapter/InlineCode.svelte +12 -0
  40. package/components/chapter/InlineCode.svelte.d.ts +17 -0
  41. package/components/chapter/Label.svelte +20 -0
  42. package/components/chapter/Label.svelte.d.ts +17 -0
  43. package/components/chapter/Link.svelte +51 -0
  44. package/components/chapter/Link.svelte.d.ts +17 -0
  45. package/components/chapter/List.svelte +14 -0
  46. package/components/chapter/List.svelte.d.ts +17 -0
  47. package/components/chapter/Marginal.svelte +48 -0
  48. package/components/chapter/Marginal.svelte.d.ts +19 -0
  49. package/components/chapter/Paragraph.svelte +15 -0
  50. package/components/chapter/Paragraph.svelte.d.ts +18 -0
  51. package/components/chapter/Python.svelte +81 -0
  52. package/components/chapter/Python.svelte.d.ts +18 -0
  53. package/components/chapter/Quote.svelte +16 -0
  54. package/components/chapter/Quote.svelte.d.ts +17 -0
  55. package/components/chapter/Rule.svelte +4 -0
  56. package/components/chapter/Rule.svelte.d.ts +17 -0
  57. package/components/chapter/Table.svelte +29 -0
  58. package/components/chapter/Table.svelte.d.ts +17 -0
  59. package/components/chapter/Text.svelte +62 -0
  60. package/components/chapter/Text.svelte.d.ts +17 -0
  61. package/components/chapter/renderPosition.d.ts +3 -0
  62. package/components/chapter/renderPosition.js +4 -0
  63. package/components/editor/BookishEditor.svelte +755 -0
  64. package/components/editor/BookishEditor.svelte.d.ts +22 -0
  65. package/components/editor/CalloutEditor.svelte +10 -0
  66. package/components/editor/CalloutEditor.svelte.d.ts +17 -0
  67. package/components/editor/CaptionedCodeEditor.svelte +22 -0
  68. package/components/editor/CaptionedCodeEditor.svelte.d.ts +17 -0
  69. package/components/editor/CaretContext.d.ts +18 -0
  70. package/components/editor/CaretContext.js +1 -0
  71. package/components/editor/CaretState.d.ts +47 -0
  72. package/components/editor/CaretState.js +1 -0
  73. package/components/editor/CaretUtilities.d.ts +5 -0
  74. package/components/editor/CaretUtilities.js +1 -0
  75. package/components/editor/CitationsEditor.svelte +42 -0
  76. package/components/editor/CitationsEditor.svelte.d.ts +17 -0
  77. package/components/editor/Clipboard.d.ts +3 -0
  78. package/components/editor/Clipboard.js +1 -0
  79. package/components/editor/Command.d.ts +18 -0
  80. package/components/editor/Command.js +1 -0
  81. package/components/editor/Commands.d.ts +3 -0
  82. package/components/editor/Commands.js +951 -0
  83. package/components/editor/ConfirmButton.svelte +43 -0
  84. package/components/editor/ConfirmButton.svelte.d.ts +18 -0
  85. package/components/editor/DefinitionEditor.svelte +28 -0
  86. package/components/editor/DefinitionEditor.svelte.d.ts +17 -0
  87. package/components/editor/EmbedEditor.svelte +87 -0
  88. package/components/editor/EmbedEditor.svelte.d.ts +17 -0
  89. package/components/editor/ImageChooser.svelte +70 -0
  90. package/components/editor/ImageChooser.svelte.d.ts +18 -0
  91. package/components/editor/InlineCodeEditor.svelte +9 -0
  92. package/components/editor/InlineCodeEditor.svelte.d.ts +17 -0
  93. package/components/editor/LabelEditor.svelte +23 -0
  94. package/components/editor/LabelEditor.svelte.d.ts +17 -0
  95. package/components/editor/LanguageEditor.svelte +11 -0
  96. package/components/editor/LanguageEditor.svelte.d.ts +17 -0
  97. package/components/editor/LinkEditor.svelte +75 -0
  98. package/components/editor/LinkEditor.svelte.d.ts +17 -0
  99. package/components/editor/Note.svelte +9 -0
  100. package/components/editor/Note.svelte.d.ts +23 -0
  101. package/components/editor/PositionEditor.svelte +14 -0
  102. package/components/editor/PositionEditor.svelte.d.ts +18 -0
  103. package/components/editor/QuoteEditor.svelte +5 -0
  104. package/components/editor/QuoteEditor.svelte.d.ts +17 -0
  105. package/components/editor/Switch.svelte +56 -0
  106. package/components/editor/Switch.svelte.d.ts +20 -0
  107. package/components/editor/TextEditor.svelte +193 -0
  108. package/components/editor/TextEditor.svelte.d.ts +23 -0
  109. package/components/editor/Toggle.svelte +38 -0
  110. package/components/editor/Toggle.svelte.d.ts +19 -0
  111. package/components/editor/Toolbar.svelte +202 -0
  112. package/components/editor/Toolbar.svelte.d.ts +20 -0
  113. package/components/editor/ToolbarGroup.svelte +41 -0
  114. package/components/editor/ToolbarGroup.svelte.d.ts +19 -0
  115. package/components/editor/ToolbarIcon.svelte +22 -0
  116. package/components/editor/ToolbarIcon.svelte.d.ts +16 -0
  117. package/components/editor/ToolbarSpacer.svelte +1 -0
  118. package/components/editor/ToolbarSpacer.svelte.d.ts +19 -0
  119. package/components/editor/URLEditor.svelte +15 -0
  120. package/components/editor/URLEditor.svelte.d.ts +18 -0
  121. package/components/editor/UndoState.d.ts +8 -0
  122. package/components/editor/UndoState.js +1 -0
  123. package/components/page/Acknowledgements.svelte +29 -0
  124. package/components/page/Acknowledgements.svelte.d.ts +14 -0
  125. package/components/page/Alert.svelte +11 -0
  126. package/components/page/Alert.svelte.d.ts +23 -0
  127. package/components/page/Authors.svelte +62 -0
  128. package/components/page/Authors.svelte.d.ts +20 -0
  129. package/components/page/BulkReferenceEditor.svelte +32 -0
  130. package/components/page/BulkReferenceEditor.svelte.d.ts +14 -0
  131. package/components/page/Chapter.svelte +301 -0
  132. package/components/page/Chapter.svelte.d.ts +18 -0
  133. package/components/page/ChapterContext.d.ts +10 -0
  134. package/components/page/ChapterContext.js +1 -0
  135. package/components/page/Contexts.d.ts +27 -0
  136. package/components/page/Contexts.js +21 -0
  137. package/components/page/DefinitionView.svelte +129 -0
  138. package/components/page/DefinitionView.svelte.d.ts +18 -0
  139. package/components/page/Description.svelte +22 -0
  140. package/components/page/Description.svelte.d.ts +14 -0
  141. package/components/page/Edition.svelte +106 -0
  142. package/components/page/Edition.svelte.d.ts +21 -0
  143. package/components/page/Glossary.svelte +61 -0
  144. package/components/page/Glossary.svelte.d.ts +14 -0
  145. package/components/page/Header.svelte +105 -0
  146. package/components/page/Header.svelte.d.ts +27 -0
  147. package/components/page/Index.svelte +117 -0
  148. package/components/page/Index.svelte.d.ts +14 -0
  149. package/components/page/Instructions.svelte +30 -0
  150. package/components/page/Instructions.svelte.d.ts +16 -0
  151. package/components/page/License.svelte +29 -0
  152. package/components/page/License.svelte.d.ts +14 -0
  153. package/components/page/Loading.svelte +13 -0
  154. package/components/page/Loading.svelte.d.ts +19 -0
  155. package/components/page/Media.svelte +76 -0
  156. package/components/page/Media.svelte.d.ts +14 -0
  157. package/components/page/MediaPreview.svelte +11 -0
  158. package/components/page/MediaPreview.svelte.d.ts +19 -0
  159. package/components/page/Outline.svelte +173 -0
  160. package/components/page/Outline.svelte.d.ts +19 -0
  161. package/components/page/Page.svelte +53 -0
  162. package/components/page/Page.svelte.d.ts +19 -0
  163. package/components/page/PossibleChapter.svelte +14 -0
  164. package/components/page/PossibleChapter.svelte.d.ts +14 -0
  165. package/components/page/PossibleReference.svelte +16 -0
  166. package/components/page/PossibleReference.svelte.d.ts +19 -0
  167. package/components/page/Print.svelte +8 -0
  168. package/components/page/Print.svelte.d.ts +14 -0
  169. package/components/page/Reference.svelte +145 -0
  170. package/components/page/Reference.svelte.d.ts +17 -0
  171. package/components/page/References.svelte +58 -0
  172. package/components/page/References.svelte.d.ts +14 -0
  173. package/components/page/Revisions.svelte +124 -0
  174. package/components/page/Revisions.svelte.d.ts +14 -0
  175. package/components/page/Search.svelte +108 -0
  176. package/components/page/Search.svelte.d.ts +14 -0
  177. package/components/page/Status.svelte +49 -0
  178. package/components/page/Status.svelte.d.ts +19 -0
  179. package/components/page/SubdomainEditor.svelte +30 -0
  180. package/components/page/SubdomainEditor.svelte.d.ts +14 -0
  181. package/components/page/TableOfContents.svelte +234 -0
  182. package/components/page/TableOfContents.svelte.d.ts +14 -0
  183. package/components/page/TableOfContentsImage.svelte +15 -0
  184. package/components/page/TableOfContentsImage.svelte.d.ts +16 -0
  185. package/components/page/TableOfContentsRow.svelte +57 -0
  186. package/components/page/TableOfContentsRow.svelte.d.ts +24 -0
  187. package/components/page/ThemeEditor.svelte +52 -0
  188. package/components/page/ThemeEditor.svelte.d.ts +14 -0
  189. package/components/page/ThemeEditorPreview.svelte +37 -0
  190. package/components/page/ThemeEditorPreview.svelte.d.ts +17 -0
  191. package/components/page/ThemeSetEditor.svelte +17 -0
  192. package/components/page/ThemeSetEditor.svelte.d.ts +18 -0
  193. package/components/page/ThemeVariableEditor.svelte +28 -0
  194. package/components/page/ThemeVariableEditor.svelte.d.ts +18 -0
  195. package/components/page/Unknown.svelte +29 -0
  196. package/components/page/Unknown.svelte.d.ts +16 -0
  197. package/components/page/margins.d.ts +2 -0
  198. package/components/page/margins.js +132 -0
  199. package/models/BookLoader.d.ts +2 -0
  200. package/models/BookLoader.js +67 -0
  201. package/models/Firebase.d.ts +4 -0
  202. package/models/Firebase.js +26 -0
  203. package/models/Firestore.d.ts +22 -0
  204. package/models/Firestore.js +194 -0
  205. package/models/book/Book.d.ts +60 -0
  206. package/models/book/Book.js +135 -0
  207. package/models/book/BookMedia.d.ts +23 -0
  208. package/models/book/BookMedia.js +102 -0
  209. package/models/book/Chapter.d.ts +70 -0
  210. package/models/book/Chapter.js +221 -0
  211. package/models/book/ChapterID.d.ts +10 -0
  212. package/models/book/ChapterID.js +10 -0
  213. package/models/book/Definition.d.ts +6 -0
  214. package/models/book/Definition.js +1 -0
  215. package/models/book/Edition.d.ts +111 -0
  216. package/models/book/Edition.js +466 -0
  217. package/models/book/Theme.d.ts +106 -0
  218. package/models/book/Theme.js +76 -0
  219. package/models/book/ThemeColors.d.ts +15 -0
  220. package/models/book/ThemeColors.js +1 -0
  221. package/models/chapter/AtomNode.d.ts +18 -0
  222. package/models/chapter/AtomNode.js +31 -0
  223. package/models/chapter/BlockNode.d.ts +21 -0
  224. package/models/chapter/BlockNode.js +117 -0
  225. package/models/chapter/BlocksNode.d.ts +50 -0
  226. package/models/chapter/BlocksNode.js +709 -0
  227. package/models/chapter/BlocksNode.test.d.ts +1 -0
  228. package/models/chapter/BlocksNode.test.js +302 -0
  229. package/models/chapter/Bookkeeping.d.ts +4 -0
  230. package/models/chapter/Bookkeeping.js +1 -0
  231. package/models/chapter/CalloutNode.d.ts +17 -0
  232. package/models/chapter/CalloutNode.js +36 -0
  233. package/models/chapter/Caret.d.ts +21 -0
  234. package/models/chapter/Caret.js +69 -0
  235. package/models/chapter/ChapterNode.d.ts +34 -0
  236. package/models/chapter/ChapterNode.js +80 -0
  237. package/models/chapter/CitationsNode.d.ts +16 -0
  238. package/models/chapter/CitationsNode.js +17 -0
  239. package/models/chapter/CodeNode.d.ts +30 -0
  240. package/models/chapter/CodeNode.js +64 -0
  241. package/models/chapter/CommentNode.d.ts +18 -0
  242. package/models/chapter/CommentNode.js +32 -0
  243. package/models/chapter/DefinitionNode.d.ts +12 -0
  244. package/models/chapter/DefinitionNode.js +20 -0
  245. package/models/chapter/Edit.d.ts +7 -0
  246. package/models/chapter/Edit.js +1 -0
  247. package/models/chapter/EmbedNode.d.ts +40 -0
  248. package/models/chapter/EmbedNode.js +89 -0
  249. package/models/chapter/ErrorNode.d.ts +17 -0
  250. package/models/chapter/ErrorNode.js +21 -0
  251. package/models/chapter/FootnoteNode.d.ts +18 -0
  252. package/models/chapter/FootnoteNode.js +29 -0
  253. package/models/chapter/FormatNode.d.ts +60 -0
  254. package/models/chapter/FormatNode.js +614 -0
  255. package/models/chapter/FormatNode.test.d.ts +1 -0
  256. package/models/chapter/FormatNode.test.js +54 -0
  257. package/models/chapter/InlineCodeNode.d.ts +12 -0
  258. package/models/chapter/InlineCodeNode.js +18 -0
  259. package/models/chapter/LabelNode.d.ts +17 -0
  260. package/models/chapter/LabelNode.js +22 -0
  261. package/models/chapter/LinkNode.d.ts +12 -0
  262. package/models/chapter/LinkNode.js +16 -0
  263. package/models/chapter/ListNode.d.ts +51 -0
  264. package/models/chapter/ListNode.js +370 -0
  265. package/models/chapter/ListNode.test.d.ts +1 -0
  266. package/models/chapter/ListNode.test.js +49 -0
  267. package/models/chapter/MetadataNode.d.ts +17 -0
  268. package/models/chapter/MetadataNode.js +24 -0
  269. package/models/chapter/Node.d.ts +36 -0
  270. package/models/chapter/Node.js +173 -0
  271. package/models/chapter/Node.test.d.ts +1 -0
  272. package/models/chapter/Node.test.js +27 -0
  273. package/models/chapter/ParagraphNode.d.ts +33 -0
  274. package/models/chapter/ParagraphNode.js +93 -0
  275. package/models/chapter/ParagraphNode.test.d.ts +1 -0
  276. package/models/chapter/ParagraphNode.test.js +21 -0
  277. package/models/chapter/Parser.d.ts +75 -0
  278. package/models/chapter/Parser.js +824 -0
  279. package/models/chapter/Parser.test.d.ts +1 -0
  280. package/models/chapter/Parser.test.js +25 -0
  281. package/models/chapter/Position.d.ts +2 -0
  282. package/models/chapter/Position.js +1 -0
  283. package/models/chapter/QuoteNode.d.ts +25 -0
  284. package/models/chapter/QuoteNode.js +61 -0
  285. package/models/chapter/ReferenceNode.d.ts +29 -0
  286. package/models/chapter/ReferenceNode.js +48 -0
  287. package/models/chapter/RootNode.d.ts +5 -0
  288. package/models/chapter/RootNode.js +1 -0
  289. package/models/chapter/RuleNode.d.ts +15 -0
  290. package/models/chapter/RuleNode.js +16 -0
  291. package/models/chapter/TableNode.d.ts +35 -0
  292. package/models/chapter/TableNode.js +176 -0
  293. package/models/chapter/TableNode.test.d.ts +1 -0
  294. package/models/chapter/TableNode.test.js +31 -0
  295. package/models/chapter/TextNode.d.ts +36 -0
  296. package/models/chapter/TextNode.js +136 -0
  297. package/models/chapter/TextNode.test.d.ts +1 -0
  298. package/models/chapter/TextNode.test.js +6 -0
  299. package/models/loadEdition.d.ts +5 -0
  300. package/models/loadEdition.js +16 -0
  301. package/package.json +189 -0
  302. package/util/getSubdomain.d.ts +3 -0
  303. package/util/getSubdomain.js +22 -0
  304. package/util/isMobile.d.ts +2 -0
  305. package/util/isMobile.js +6 -0
  306. package/util/mineReference.d.ts +3 -0
  307. package/util/mineReference.js +62 -0
  308. package/util/scrollToEyeLevel.d.ts +2 -0
  309. package/util/scrollToEyeLevel.js +5 -0
@@ -0,0 +1,234 @@
1
+ <script>import Instructions from "./Instructions.svelte";
2
+ import Parser from "../../models/chapter/Parser";
3
+ import TableOfContentsRow from "./TableOfContentsRow.svelte";
4
+ import ChapterIDs from "../../models/book/ChapterID";
5
+ import Page from "./Page.svelte";
6
+ import Header from "./Header.svelte";
7
+ import Outline from "./Outline.svelte";
8
+ import Link from "../Link.svelte";
9
+ import SubdomainEditor from "./SubdomainEditor.svelte";
10
+ import Description from "./Description.svelte";
11
+ import Acknowledgements from "./Acknowledgements.svelte";
12
+ import License from "./License.svelte";
13
+ import Revisions from "./Revisions.svelte";
14
+ import Authors from "./Authors.svelte";
15
+ import TextEditor from "../editor/TextEditor.svelte";
16
+ import Toggle from "../editor/Toggle.svelte";
17
+ import { getBase, getEdition, isEditable } from "./Contexts";
18
+ let edition = getEdition();
19
+ let base = getBase();
20
+ let editable = isEditable();
21
+ function getProgressDescription(progress) {
22
+ if (progress === null)
23
+ return "";
24
+ else if (progress === 0)
25
+ return "";
26
+ else if (progress < 30)
27
+ return "; just started";
28
+ else if (progress < 70)
29
+ return "; halfway";
30
+ else if (progress < 95)
31
+ return "; almost done";
32
+ else
33
+ return "; done";
34
+ }
35
+ // Get the chapter progress
36
+ let progressStorage = localStorage.getItem("chapterProgress");
37
+ let progress = progressStorage === null ?
38
+ {} :
39
+ JSON.parse(progressStorage);
40
+ // Is there a colon? Let's make a subtitle
41
+ $: title = $edition.getTitle();
42
+ let subtitle = undefined;
43
+ $: {
44
+ let colon = title.indexOf(":");
45
+ if (colon >= 0) {
46
+ subtitle = title.substring(colon + 1).trim();
47
+ title = title.substring(0, colon).trim();
48
+ }
49
+ }
50
+ let waitingForChapter = false;
51
+ function addChapter() {
52
+ waitingForChapter = true;
53
+ $edition.addChapter().then(() => waitingForChapter = false);
54
+ }
55
+ </script>
56
+
57
+ <svelte:head>
58
+ <title>{$edition.getTitle()}</title>
59
+ <meta name="description" content={$edition.getTitle()}>
60
+ </svelte:head>
61
+
62
+ <Page title={$edition.getTitle()}>
63
+ <Header
64
+ label="Book title"
65
+ getImage={() => $edition.getImage("cover")}
66
+ setImage={embed => $edition.setImage("cover", embed)}
67
+ header={title}
68
+ subtitle={subtitle}
69
+ tags={$edition.getTags()}
70
+ save={text => $edition.setTitle(text)}
71
+ >
72
+ <svelte:fragment slot="before">
73
+ {#if editable}
74
+ <SubdomainEditor slot="before"/>
75
+ {/if}
76
+ </svelte:fragment>
77
+ <Outline slot="outline"
78
+ previous={null}
79
+ next={$edition.getNextChapterID("")}
80
+ />
81
+ <Authors slot="after"
82
+ authors={$edition.getAuthors()}
83
+ add={ () => $edition.addAuthor("")}
84
+ edit={(index, text) => $edition.setAuthor(index, text) }
85
+ remove={index => $edition.removeAuthor(index)}
86
+ />
87
+ </Header>
88
+
89
+ <Instructions>
90
+ Above you can edit your book's authors, title, and cover image.
91
+ </Instructions>
92
+
93
+ <Description/>
94
+
95
+ <Instructions>
96
+ This will appear on the <Link to={base + "/read"}>book browsing</Link> page and in your table of contents.
97
+ Write an informative description of what your book is about.
98
+ </Instructions>
99
+
100
+ <h2 class="bookish-header" id="chapters">Chapters {#if editable}<button disabled={waitingForChapter} on:click={addChapter}>+</button>{/if}</h2>
101
+
102
+ <Instructions>
103
+ Add, remove, and reorder chapters here.
104
+ You can add optional book sections to each chapter, toggle chapters as numbered/unnumbered or published/forthcoming.
105
+ Click the title to edit the chapter.
106
+ </Instructions>
107
+
108
+ <div class="bookish-table">
109
+ <table id="toc">
110
+ <tbody>
111
+ {#each $edition.getChapters() as chapter }
112
+ {@const chapterID = chapter.getChapterID() }
113
+ {@const readingTime = chapter.getReadingTime() }
114
+ {@const readingEstimate =
115
+ readingTime === undefined ? "Forthcoming" :
116
+ readingTime < 5 ? "<5 min read" :
117
+ readingTime < 60 ? "~" + Math.floor(readingTime / 5) * 5 + " min read" :
118
+ "~" + Math.floor(readingTime / 60) + " hour read" }
119
+ {@const section = chapter.getSection() }
120
+ {@const etc = readingEstimate + (!chapter.isForthcoming() ? getProgressDescription(chapterID in progress ? progress[chapterID] : null) : "") }
121
+
122
+ <TableOfContentsRow
123
+ chapter={chapter}
124
+ chapterID={chapterID}
125
+ number={$edition.getChapterNumber(chapterID)}
126
+ title={chapter.getTitle()}
127
+ forthcoming={chapter.isForthcoming()}
128
+ >
129
+ <span slot="annotation">
130
+ {#if editable }
131
+ <TextEditor
132
+ label={"Chapter section editor"}
133
+ startText={section ? section : ""}
134
+ placeholder="Section"
135
+ valid={ () => undefined }
136
+ save={text => chapter.setSection(text) }
137
+ />
138
+ {:else}
139
+ {#if section }{section}{/if}
140
+ {/if}
141
+ </span>
142
+ <span slot="etc">
143
+ {#if editable}
144
+ <Toggle on={chapter.isForthcoming()} save={on => chapter.setForthcoming(on)}>
145
+ {etc}
146
+ </Toggle>
147
+ {:else}
148
+ { etc }
149
+ {/if}
150
+ </span>
151
+ </TableOfContentsRow>
152
+ {/each}
153
+ {#if $edition.hasReferences() || editable }
154
+ <TableOfContentsRow
155
+ chapterID={ChapterIDs.ReferencesID}
156
+ title="References"
157
+ >
158
+ <span slot="annotation">Everything cited</span>
159
+ </TableOfContentsRow>
160
+ {/if}
161
+ {#if $edition.getGlossary() && Object.keys($edition.getGlossary()).length > 0 || editable }
162
+ <TableOfContentsRow
163
+ chapterID={ChapterIDs.GlossaryID}
164
+ title="Glossary"
165
+ >
166
+ <span slot="annotation">Definitions</span>
167
+ </TableOfContentsRow>
168
+ {/if}
169
+ <TableOfContentsRow
170
+ chapterID={ChapterIDs.IndexID}
171
+ title="Index"
172
+ >
173
+ <span slot="annotation">Common words and where they are</span>
174
+ </TableOfContentsRow>
175
+ <TableOfContentsRow
176
+ chapterID={ChapterIDs.SearchID}
177
+ title="Search"
178
+ >
179
+ <span slot="annotation">Find where words occur</span>
180
+ </TableOfContentsRow>
181
+
182
+ <TableOfContentsRow
183
+ chapterID={ChapterIDs.MediaID}
184
+ title="Media"
185
+ >
186
+ <span slot="annotation">Images and video in the book</span>
187
+ </TableOfContentsRow>
188
+ {#if editable }
189
+ <TableOfContentsRow
190
+ chapterID="theme"
191
+ title="Theme"
192
+ >
193
+ <span slot="annotation">Style the book</span>
194
+ </TableOfContentsRow>
195
+ <TableOfContentsRow
196
+ chapterID="unknown"
197
+ title="Unknown"
198
+ >
199
+ <span slot="annotation">Customize bad links</span>
200
+ </TableOfContentsRow>
201
+ {/if}
202
+ </tbody>
203
+ </table>
204
+ </div>
205
+
206
+ <Acknowledgements />
207
+ <License />
208
+
209
+ <h2 class="bookish-header" id="print">Print</h2>
210
+
211
+ <Instructions>
212
+ This offers a way for readers to print the entire book as a single page.
213
+ </Instructions>
214
+
215
+ <p>
216
+ Want to print this book or generate a PDF?
217
+ See <Link to={base + "print"}>all chapters on a single page</Link> and then print or export.
218
+ Long books can take some time to render.
219
+ </p>
220
+
221
+ <h2 class="bookish-header" id="citation">Citation</h2>
222
+
223
+ <Instructions>
224
+ This citation is dynamically created from the current authors, title, and date.
225
+ </Instructions>
226
+
227
+ <!-- Book citation -->
228
+ <p>
229
+ { $edition.getAuthors().map(author => Parser.parseFormat($edition, author).toText()).join(", ") } ({(new Date()).getFullYear() }). <em>{$edition.getTitle()}</em>. { location.protocol+'//'+location.host+location.pathname }, <em>retrieved { (new Date()).toLocaleDateString("en-US")}</em>.
230
+ </p>
231
+
232
+ <Revisions />
233
+
234
+ </Page>
@@ -0,0 +1,14 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {};
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {};
8
+ };
9
+ export declare type TableOfContentsProps = typeof __propDef.props;
10
+ export declare type TableOfContentsEvents = typeof __propDef.events;
11
+ export declare type TableOfContentsSlots = typeof __propDef.slots;
12
+ export default class TableOfContents extends SvelteComponentTyped<TableOfContentsProps, TableOfContentsEvents, TableOfContentsSlots> {
13
+ }
14
+ export {};
@@ -0,0 +1,15 @@
1
+ <script>import EmbedNode from "../../models/chapter/EmbedNode";
2
+ import Parser from "../../models/chapter/Parser";
3
+ import { getEdition } from "./Contexts";
4
+ export let embed;
5
+ let edition = getEdition();
6
+ $: embedNode = embed === null ? null : Parser.parseEmbed($edition, embed);
7
+ </script>
8
+
9
+ {#if embedNode instanceof EmbedNode }
10
+ <img
11
+ style="width: 5em"
12
+ src={embedNode.getSmallURL() }
13
+ alt={embedNode.getDescription() }
14
+ />
15
+ {/if}
@@ -0,0 +1,16 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ embed: string | null;
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {};
10
+ };
11
+ export declare type TableOfContentsImageProps = typeof __propDef.props;
12
+ export declare type TableOfContentsImageEvents = typeof __propDef.events;
13
+ export declare type TableOfContentsImageSlots = typeof __propDef.slots;
14
+ export default class TableOfContentsImage extends SvelteComponentTyped<TableOfContentsImageProps, TableOfContentsImageEvents, TableOfContentsImageSlots> {
15
+ }
16
+ export {};
@@ -0,0 +1,57 @@
1
+ <script>import Link from "../Link.svelte";
2
+ import TableOfContentsImage from "./TableOfContentsImage.svelte";
3
+ import Toggle from "../editor/Toggle.svelte";
4
+ import ConfirmButton from "../editor/ConfirmButton.svelte";
5
+ import { getBase, getEdition, isEditable } from "./Contexts";
6
+ export let chapterID;
7
+ export let chapter = undefined;
8
+ export let title;
9
+ export let number = undefined;
10
+ export let forthcoming = false;
11
+ let edition = getEdition();
12
+ let base = getBase();
13
+ let editable = isEditable();
14
+ function moveUp() { chapter?.move(-1); }
15
+ function moveDown() { chapter?.move(1); }
16
+ </script>
17
+
18
+ <tr class={forthcoming ? "bookish-forthcoming" : ""}>
19
+ <td><TableOfContentsImage embed={$edition.getImage(chapterID)} /></td>
20
+ <td>
21
+ {#if editable && chapter}
22
+ <Toggle on={number !== undefined} save={ on => chapter && chapter.setNumbered(on) }>
23
+ <div class="bookish-chapter-number">
24
+ {#if number !== undefined}
25
+ Chapter {number}
26
+ {:else}
27
+ <span class="bookish-muted">Unnumbered</span>
28
+ {/if}
29
+ </div>
30
+ </Toggle>
31
+ {:else if number !== undefined }
32
+ <div class="bookish-chapter-number">{"Chapter " + number}</div>
33
+ {/if}
34
+ {#if forthcoming && !editable}
35
+ <span>{title}</span>
36
+ {:else}
37
+ <Link to={`${base}/${chapterID}`}>{title}</Link>
38
+ {/if}
39
+ <small class="bookish-muted"><br/><em><slot name="annotation"></slot></em></small>
40
+ </td>
41
+ <td><slot name="etc"></slot></td>
42
+ {#if editable }
43
+ <td>
44
+ {#if chapter }
45
+ <button disabled={chapter.getPosition() === 0} on:click={moveUp}>{"↑"}</button>
46
+ &nbsp;
47
+ <button disabled={chapter.getPosition() === chapter.getBook().getChapterCount() - 1} on:click={moveDown}>{"↓"}</button>
48
+ &nbsp;
49
+ <ConfirmButton
50
+ commandLabel="x"
51
+ confirmLabel="Confirm"
52
+ command={() => chapter && chapter.delete()}
53
+ />
54
+ {/if}
55
+ </td>
56
+ {/if}
57
+ </tr>
@@ -0,0 +1,24 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type Chapter from "../../models/book/Chapter";
3
+ declare const __propDef: {
4
+ props: {
5
+ chapterID: string;
6
+ chapter?: Chapter | undefined;
7
+ title: string;
8
+ number?: number | undefined;
9
+ forthcoming?: boolean | undefined;
10
+ };
11
+ events: {
12
+ [evt: string]: CustomEvent<any>;
13
+ };
14
+ slots: {
15
+ annotation: {};
16
+ etc: {};
17
+ };
18
+ };
19
+ export declare type TableOfContentsRowProps = typeof __propDef.props;
20
+ export declare type TableOfContentsRowEvents = typeof __propDef.events;
21
+ export declare type TableOfContentsRowSlots = typeof __propDef.slots;
22
+ export default class TableOfContentsRow extends SvelteComponentTyped<TableOfContentsRowProps, TableOfContentsRowEvents, TableOfContentsRowSlots> {
23
+ }
24
+ export {};
@@ -0,0 +1,52 @@
1
+ <script>import Header from "./Header.svelte";
2
+ import Outline from './Outline.svelte';
3
+ import Page from './Page.svelte';
4
+ import { defaultTheme } from '../../models/book/Theme';
5
+ import ConfirmButton from '../editor/ConfirmButton.svelte';
6
+ import Instructions from './Instructions.svelte';
7
+ import ThemeSetEditor from './ThemeSetEditor.svelte';
8
+ import ThemeEditorPreview from './ThemeEditorPreview.svelte';
9
+ import External from "../External.svelte";
10
+ import { getEdition } from "./Contexts";
11
+ let edition = getEdition();
12
+ $: theme = $edition.getTheme();
13
+ </script>
14
+
15
+ <Page title={`${$edition.getTitle()} - Theme`}>
16
+ <Header
17
+ label="Theme"
18
+ getImage={() => null}
19
+ setImage={ () => undefined}
20
+ header="Theme"
21
+ >
22
+ <Outline
23
+ slot="outline"
24
+ previous={null}
25
+ next={null}
26
+ />
27
+ </Header>
28
+
29
+ <Instructions>
30
+ This is the theme editor.
31
+ You can use it to choose from existing themes or create a custom theme for your book's appearance.
32
+ To use it, you'll need to know a bit about how to format CSS <External to="https://developer.mozilla.org/en-US/docs/Web/CSS/color">colors</External>, <External to="https://developer.mozilla.org/en-US/docs/Web/CSS/font-size">fonts</External>, and <External to="https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units">sizes</External>.
33
+ </Instructions>
34
+
35
+ {#if theme === null }
36
+ <button on:click={() => $edition.setTheme(defaultTheme)}>Customize</button>
37
+ {:else}
38
+ <ConfirmButton
39
+ commandLabel="Revert to default"
40
+ confirmLabel="Delete your theme?"
41
+ command={() => $edition.setTheme(null)}
42
+ />
43
+ <ThemeEditorPreview theme={theme}/>
44
+ <ThemeSetEditor header={"Light mode colors"} group="light" theme={theme} />
45
+ <ThemeSetEditor header={"Dark mode colors"} group="dark" theme={theme} />
46
+ <ThemeSetEditor header={"Fonts"} group="fonts" theme={theme} />
47
+ <ThemeSetEditor header={"Font sizes"} group="sizes" theme={theme} />
48
+ <ThemeSetEditor header={"Font weights"} group="weights" theme={theme} />
49
+ <ThemeSetEditor header={"Spacing"} group="spacing" theme={theme} />
50
+ {/if}
51
+
52
+ </Page>
@@ -0,0 +1,14 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {};
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {};
8
+ };
9
+ export declare type ThemeEditorProps = typeof __propDef.props;
10
+ export declare type ThemeEditorEvents = typeof __propDef.events;
11
+ export declare type ThemeEditorSlots = typeof __propDef.slots;
12
+ export default class ThemeEditor extends SvelteComponentTyped<ThemeEditorProps, ThemeEditorEvents, ThemeEditorSlots> {
13
+ }
14
+ export {};
@@ -0,0 +1,37 @@
1
+ <script>import ChapterBody from "../chapter/ChapterBody.svelte";
2
+ import Parser from "../../models/chapter/Parser";
3
+ import { getDarkMode } from "./Contexts";
4
+ export let theme;
5
+ let darkMode = getDarkMode();
6
+ $: preview = Parser.parseChapter(undefined, `
7
+ # Header 1
8
+ ## Header 2
9
+ ### Header 3
10
+
11
+ This is how a sentence with _various_ *formatting* ^will^ look.
12
+
13
+ * How does it look?
14
+ * Would you change anything?
15
+ `);
16
+ </script>
17
+
18
+ <div class="bookish-theme-preview" style={`background-color: ${$darkMode ? theme.dark.backgroundColor : theme.light.backgroundColor };`}>
19
+ <ChapterBody node={preview}/>
20
+ </div>
21
+
22
+ <style>
23
+ .bookish-theme-preview {
24
+ padding: 1em;
25
+ border: var(--bookish-app-chrome-border-width) solid black;
26
+ transform: translate(-25%, -25%) scale(0.5);
27
+ position: sticky;
28
+ margin-top: 2em;
29
+ top: 2em;
30
+ z-index: 3;
31
+ }
32
+
33
+ :global(.bookish-dark .bookish-theme-preview) {
34
+ border-color: white;
35
+ }
36
+
37
+ </style>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type Theme from "../../models/book/Theme";
3
+ declare const __propDef: {
4
+ props: {
5
+ theme: Theme;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type ThemeEditorPreviewProps = typeof __propDef.props;
13
+ export declare type ThemeEditorPreviewEvents = typeof __propDef.events;
14
+ export declare type ThemeEditorPreviewSlots = typeof __propDef.slots;
15
+ export default class ThemeEditorPreview extends SvelteComponentTyped<ThemeEditorPreviewProps, ThemeEditorPreviewEvents, ThemeEditorPreviewSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,17 @@
1
+ <script>import ThemeVariableEditor from "./ThemeVariableEditor.svelte";
2
+ export let header;
3
+ export let group;
4
+ export let theme;
5
+ $: set = theme[group];
6
+ </script>
7
+
8
+ <h2>{header}</h2>
9
+ <div class="bookish-table">
10
+ <table>
11
+ <tbody>
12
+ {#each Object.keys(set).sort() as name }
13
+ <ThemeVariableEditor group={group} name={name} value={set[name]} />
14
+ {/each}
15
+ </tbody>
16
+ </table>
17
+ </div>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ header: string;
5
+ group: string;
6
+ theme: Record<string, Record<string, string>>;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export declare type ThemeSetEditorProps = typeof __propDef.props;
14
+ export declare type ThemeSetEditorEvents = typeof __propDef.events;
15
+ export declare type ThemeSetEditorSlots = typeof __propDef.slots;
16
+ export default class ThemeSetEditor extends SvelteComponentTyped<ThemeSetEditorProps, ThemeSetEditorEvents, ThemeSetEditorSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,28 @@
1
+ <script>import TextEditor from "../editor/TextEditor.svelte";
2
+ import { getEdition } from "./Contexts";
3
+ const placeholders = {
4
+ light: "CSS color",
5
+ dark: "CSS color",
6
+ fonts: "CSS font name",
7
+ sizes: "CSS font size",
8
+ weights: "CSS font weights",
9
+ spacing: "CSS length"
10
+ };
11
+ export let group;
12
+ export let name;
13
+ export let value;
14
+ let edition = getEdition();
15
+ </script>
16
+
17
+ <tr>
18
+ <td>{name.replace(/([a-z])([A-Z])/g, "$1 $2").split(" ").map(s => s.charAt(0).toUpperCase() + s.substring(1)).join(" ")}</td>
19
+ <td style="text-align: right">
20
+ <TextEditor
21
+ startText={value}
22
+ label={`${name} editor`}
23
+ placeholder={group in placeholders ? placeholders[group] : "value"}
24
+ valid={ () => undefined }
25
+ save={text => $edition.setThemeValue(group, name, text)}
26
+ />
27
+ </td>
28
+ </tr>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ group: string;
5
+ name: string;
6
+ value: string;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export declare type ThemeVariableEditorProps = typeof __propDef.props;
14
+ export declare type ThemeVariableEditorEvents = typeof __propDef.events;
15
+ export declare type ThemeVariableEditorSlots = typeof __propDef.slots;
16
+ export default class ThemeVariableEditor extends SvelteComponentTyped<ThemeVariableEditorProps, ThemeVariableEditorEvents, ThemeVariableEditorSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,29 @@
1
+ <script>import Header from "./Header.svelte";
2
+ import Outline from './Outline.svelte';
3
+ import Page from './Page.svelte';
4
+ import Instructions from './Instructions.svelte';
5
+ import ChapterIDs from '../../models/book/ChapterID';
6
+ import { getEdition } from "./Contexts";
7
+ let edition = getEdition();
8
+ </script>
9
+ <Page title={`${$edition.getTitle()} - Unknown Page`}>
10
+ <Header
11
+ label="Unknown page title"
12
+ getImage={() => $edition.getImage(ChapterIDs.UnknownID)}
13
+ setImage={embed => $edition.setImage(ChapterIDs.UnknownID, embed)}
14
+ header="Oops."
15
+ >
16
+ <Outline
17
+ slot="outline"
18
+ previous={null}
19
+ next={null}
20
+ />
21
+ </Header>
22
+
23
+ <Instructions>
24
+ This page will be shown if the reader somehow ends up on a page that doesn't exist.
25
+ You can customize the image shown.
26
+ </Instructions>
27
+
28
+ <slot></slot>
29
+ </Page>
@@ -0,0 +1,16 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {};
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {
8
+ default: {};
9
+ };
10
+ };
11
+ export declare type UnknownProps = typeof __propDef.props;
12
+ export declare type UnknownEvents = typeof __propDef.events;
13
+ export declare type UnknownSlots = typeof __propDef.slots;
14
+ export default class Unknown extends SvelteComponentTyped<UnknownProps, UnknownEvents, UnknownSlots> {
15
+ }
16
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare function hideOutlineIfObscured(): void;
2
+ export declare function layoutMarginals(): void;