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,20 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ options: string[];
5
+ value: string;
6
+ position: string;
7
+ enabled?: boolean | undefined;
8
+ edit: (newValue: string) => void;
9
+ };
10
+ events: {
11
+ [evt: string]: CustomEvent<any>;
12
+ };
13
+ slots: {};
14
+ };
15
+ export declare type SwitchProps = typeof __propDef.props;
16
+ export declare type SwitchEvents = typeof __propDef.events;
17
+ export declare type SwitchSlots = typeof __propDef.slots;
18
+ export default class Switch extends SvelteComponentTyped<SwitchProps, SwitchEvents, SwitchSlots> {
19
+ }
20
+ export {};
@@ -0,0 +1,193 @@
1
+ <script>var Status;
2
+ (function (Status) {
3
+ Status[Status["Viewing"] = 0] = "Viewing";
4
+ Status[Status["Editing"] = 1] = "Editing";
5
+ })(Status || (Status = {}));
6
+ export let startText;
7
+ export let label;
8
+ export let placeholder;
9
+ export let valid;
10
+ export let save;
11
+ export let saveOnExit = false;
12
+ export let width = undefined;
13
+ export let clip = false;
14
+ let text = startText;
15
+ let status = Status.Viewing;
16
+ let error = valid(text);
17
+ let field = null;
18
+ let sizer = null;
19
+ // Grow the sizer when text or status changes.
20
+ $: {
21
+ if (sizer) {
22
+ // Set the invisible sizer to the text to set the container's width.
23
+ // The browser strips trailing spaces, causing jitter after a space, so we replace
24
+ // them with non-breaking spaces.
25
+ const sizedText = showPlaceholder() ? placeholder : text.replace(/\s/g, "\u00a0");
26
+ // Clip the text to prevent this editor from getting too long when editing or when asked to.. If it goes past one line,
27
+ // the measurements and layout are way off.
28
+ const trimmedText = width !== undefined && (clip === true || status === Status.Editing) ? sizedText.substring(0, width) + "…" : sizedText;
29
+ sizer.innerHTML = trimmedText;
30
+ }
31
+ }
32
+ // When status changes, focus or blur.
33
+ $: {
34
+ if (field) {
35
+ if (status === Status.Editing) {
36
+ field.focus();
37
+ }
38
+ else {
39
+ field.blur();
40
+ }
41
+ }
42
+ }
43
+ // When text changes, save, unless we only save on exit.
44
+ $: {
45
+ if (!saveOnExit)
46
+ saveText(text);
47
+ }
48
+ function showPlaceholder() {
49
+ return text === "";
50
+ }
51
+ function startEditing() {
52
+ status = Status.Editing;
53
+ }
54
+ function stopEditing() {
55
+ status = Status.Viewing;
56
+ if (saveOnExit)
57
+ saveText(text);
58
+ }
59
+ function edit() {
60
+ if (field) {
61
+ text = field.value;
62
+ if (saveOnExit === false)
63
+ saveText(text);
64
+ }
65
+ }
66
+ function saveText(newText) {
67
+ if (validate(newText) === undefined) {
68
+ const revisedText = save(newText);
69
+ if (typeof revisedText === "string") {
70
+ text = revisedText;
71
+ }
72
+ if (revisedText instanceof Promise)
73
+ revisedText.catch((err) => error = err.message);
74
+ }
75
+ }
76
+ function validate(value) {
77
+ return valid(value);
78
+ }
79
+ function handleKeyPress(event) {
80
+ if (event.key === "Enter")
81
+ status = Status.Viewing;
82
+ }
83
+ </script>
84
+
85
+ <span class={`bookish-text-editor ${showPlaceholder() ? "bookish-text-editor-placeholder" : ""} ${status === Status.Viewing ? "bookish-text-editor-viewing" : ""}`}>
86
+ <span class="bookish-text-editor-sizer" aria-hidden={true} bind:this={sizer} on:click={startEditing}></span>
87
+ <input
88
+ type="text"
89
+ bind:this={field}
90
+ bind:value={text}
91
+ required
92
+ role="textbox"
93
+ aria-invalid={error !== undefined}
94
+ aria-label={label}
95
+ placeholder={placeholder}
96
+ on:change={edit}
97
+ on:keypress={handleKeyPress}
98
+ on:blur={stopEditing}
99
+ on:focus={startEditing}
100
+ />
101
+ {#if error }
102
+ <span
103
+ aria-live="polite"
104
+ class={`bookish-text-editor-error ${status === Status.Editing ? "bookish-text-editor-error-focused" : ""}`}
105
+ >
106
+ {status === Status.Viewing ? "\u2715" : error}
107
+ </span>
108
+ {/if}
109
+ </span>
110
+
111
+ <style>
112
+ .bookish-text-editor {
113
+ position: relative;
114
+ }
115
+
116
+ .bookish-text-editor input[type="text"] {
117
+ cursor: pointer;
118
+ position: absolute;
119
+ left: 0;
120
+ margin-top: -2px; /* Matches the outline offset */
121
+ width: 100%;
122
+ min-width: 0.5em;
123
+ }
124
+
125
+ /* Match the parent's styling as much as possible. */
126
+ .bookish-text-editor input[type="text"], .bookish-text-editor-sizer {
127
+ background-color: inherit;
128
+ font-family: inherit;
129
+ font-size: inherit;
130
+ font-weight: inherit;
131
+ font-style: inherit;
132
+ line-height: inherit;
133
+ color: inherit;
134
+ border: none;
135
+ box-sizing: content-box;
136
+ padding: 0;
137
+ margin: 0;
138
+ display: inline;
139
+ cursor: text;
140
+ }
141
+
142
+ /* This ensures the error message always appears below empty text editors */
143
+ .bookish-text-editor-sizer {
144
+ min-height: 1em;
145
+ opacity: 0;
146
+ }
147
+
148
+ .bookish-text-editor-viewing .bookish-text-editor-sizer {
149
+ opacity: 1;
150
+ }
151
+
152
+ /* This ensures that the sizer doesn't end up with zero width and height. */
153
+ .bookish-text-editor-sizer:empty:before {
154
+ content: "\200b";
155
+ }
156
+
157
+ /* Override the inherited color of the text is a placeholder */
158
+ .bookish-text-editor-placeholder .bookish-text-editor-sizer {
159
+ color: var(--bookish-app-chrome-muted);
160
+ }
161
+
162
+ /* Hide the text field when its being viewed so we can let the sizer display the full value, in case it's long. */
163
+ .bookish-text-editor.bookish-text-editor-viewing input {
164
+ opacity: 0;
165
+ }
166
+
167
+ .bookish-text-editor .bookish-text-editor-error {
168
+ position: absolute;
169
+ left: 0;
170
+ top: 100%;
171
+ width: max-content;
172
+ z-index: 3;
173
+ line-height: 1em;
174
+ margin-left: -0.5em;
175
+ padding: 0.5em 0.5em;
176
+ }
177
+
178
+ .bookish-text-editor .bookish-text-editor-error.bookish-text-editor-error-focused {
179
+ /* Put this above other errors nearby. */
180
+ z-index: 4;
181
+ }
182
+
183
+ .bookish-editor-error, .bookish-text-editor-error {
184
+ font-family: var(--bookish-app-chrome-font-family);
185
+ font-size: var(--bookish-small-font-size);
186
+ font-weight: normal;
187
+ font-style: normal;
188
+ color: var(--bookish-app-error-color);
189
+ background: var(--bookish-background-color);
190
+ animation: failure 100ms 10;
191
+ }
192
+
193
+ </style>
@@ -0,0 +1,23 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ startText: string;
5
+ label: string;
6
+ placeholder: string;
7
+ valid: (text: string) => string | undefined;
8
+ save: (text: string) => Promise<void> | undefined | void | string;
9
+ saveOnExit?: boolean | undefined;
10
+ width?: number | undefined;
11
+ clip?: boolean | undefined;
12
+ };
13
+ events: {
14
+ [evt: string]: CustomEvent<any>;
15
+ };
16
+ slots: {};
17
+ };
18
+ export declare type TextEditorProps = typeof __propDef.props;
19
+ export declare type TextEditorEvents = typeof __propDef.events;
20
+ export declare type TextEditorSlots = typeof __propDef.slots;
21
+ export default class TextEditor extends SvelteComponentTyped<TextEditorProps, TextEditorEvents, TextEditorSlots> {
22
+ }
23
+ export {};
@@ -0,0 +1,38 @@
1
+ <script>var Status;
2
+ (function (Status) {
3
+ Status[Status["Viewing"] = 0] = "Viewing";
4
+ Status[Status["Saving"] = 1] = "Saving";
5
+ Status[Status["Error"] = 2] = "Error";
6
+ })(Status || (Status = {}));
7
+ export let on;
8
+ export let save;
9
+ let saving = Status.Viewing;
10
+ function toggle() {
11
+ saving = Status.Saving;
12
+ const promise = save(!on);
13
+ if (promise === undefined) {
14
+ saving = Status.Viewing;
15
+ return;
16
+ }
17
+ promise
18
+ .then(() => saving = Status.Viewing)
19
+ .catch(() => saving = Status.Error);
20
+ }
21
+ </script>
22
+
23
+ <div
24
+ class={`bookish-app-interactive ${saving === Status.Saving ? " bookish-text-editor-saving" : ""} ${saving === Status.Error ? " bookish-text-editor-error" : ""}`}
25
+ tabIndex=0
26
+ role="switch"
27
+ aria-checked={on}
28
+ on:keydown|preventDefault={event => event.key === "Enter" || event.key === "Space" ? toggle() : undefined }
29
+ on:click={toggle}
30
+ >
31
+ <slot></slot>
32
+ </div>
33
+
34
+ <style>
35
+ .bookish-app-interactive {
36
+ cursor: pointer;
37
+ }
38
+ </style>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ on: boolean;
5
+ save: (set: boolean) => Promise<void> | undefined;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ default: {};
12
+ };
13
+ };
14
+ export declare type ToggleProps = typeof __propDef.props;
15
+ export declare type ToggleEvents = typeof __propDef.events;
16
+ export declare type ToggleSlots = typeof __propDef.slots;
17
+ export default class Toggle extends SvelteComponentTyped<ToggleProps, ToggleEvents, ToggleSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,202 @@
1
+ <script>import commands from "./Commands";
2
+ import TextNode from "../../models/chapter/TextNode";
3
+ import AtomNode from "../../models/chapter/AtomNode";
4
+ import LinkNode from "../../models/chapter/LinkNode";
5
+ import LabelNode from "../../models/chapter/LabelNode";
6
+ import InlineCodeNode from "../../models/chapter/InlineCodeNode";
7
+ import CitationsNode from "../../models/chapter/CitationsNode";
8
+ import DefinitionNode from "../../models/chapter/DefinitionNode";
9
+ import CodeNode from "../../models/chapter/CodeNode";
10
+ import CalloutNode from "../../models/chapter/CalloutNode";
11
+ import EmbedNode from "../../models/chapter/EmbedNode";
12
+ import QuoteNode from "../../models/chapter/QuoteNode";
13
+ import LabelEditor from "./LabelEditor.svelte";
14
+ import InlineCodeEditor from "./InlineCodeEditor.svelte";
15
+ import CitationsEditor from "./CitationsEditor.svelte";
16
+ import LinkEditor from "./LinkEditor.svelte";
17
+ import DefinitionEditor from "./DefinitionEditor.svelte";
18
+ import CaptionedCodeEditor from "./CaptionedCodeEditor.svelte";
19
+ import CalloutEditor from "./CalloutEditor.svelte";
20
+ import QuoteEditor from "./QuoteEditor.svelte";
21
+ import EmbedEditor from "./EmbedEditor.svelte";
22
+ import ToolbarGroup from "./ToolbarGroup.svelte";
23
+ import ToolbarIcon from "./ToolbarIcon.svelte";
24
+ import { onMount } from "svelte";
25
+ const keyLabels = {
26
+ "Digit0": "0",
27
+ "Digit1": "1",
28
+ "Digit2": "2",
29
+ "Digit3": "3",
30
+ "ArrowDown": "↓",
31
+ "ArrowUp": "↑",
32
+ "ArrowLeft": "←",
33
+ "ArrowRight": "→",
34
+ "Backspace": "\u232B",
35
+ };
36
+ const categoryOrder = {
37
+ "navigation": 1,
38
+ "selection": 2,
39
+ "text": 3,
40
+ "clipboard": 4,
41
+ "annotation": 5,
42
+ "paragraph": 6,
43
+ "level": 7,
44
+ "list": 8,
45
+ "table": 9,
46
+ "block": 10,
47
+ };
48
+ const categoryIcons = {
49
+ "text": "text.svg",
50
+ "clipboard": "scissors.svg",
51
+ "annotation": "hash.svg",
52
+ "level": "level.svg",
53
+ "block": "block.svg",
54
+ "list": "list.svg",
55
+ "table": "▦",
56
+ "history": "\u2026"
57
+ };
58
+ export let context = undefined;
59
+ export let executor = undefined;
60
+ export let visible = false;
61
+ $: chapter = context?.root;
62
+ let element = null;
63
+ let categories = undefined;
64
+ let commandsByCategory = {};
65
+ let metaNode = undefined;
66
+ let calloutNode = undefined;
67
+ let quoteNode = undefined;
68
+ let embedNode = undefined;
69
+ $: isVisible = visible || containsFocus();
70
+ // Listen to focus changes to decide whether the toolbar is visible.
71
+ onMount(() => {
72
+ window.addEventListener("focus", updateVisible);
73
+ window.addEventListener("blur", updateVisible);
74
+ return () => {
75
+ window.removeEventListener("focus", updateVisible);
76
+ window.removeEventListener("blur", updateVisible);
77
+ };
78
+ });
79
+ function containsFocus() { return element !== null && element.contains(document.activeElement); }
80
+ function updateVisible() {
81
+ isVisible = visible || containsFocus();
82
+ }
83
+ function getShortcutDescription(command) {
84
+ const macOS = navigator.platform.indexOf('Mac') > -1;
85
+ const controlSymbol = macOS ? "\u2318" : "Ctrl+";
86
+ const altSymbol = macOS ? "\u2325" : "Alt+";
87
+ const key = command.key ? (Array.isArray(command.key) ? command.key.join("/") : command.key) : command.code ? command.code : "any";
88
+ const keyLabel = (key in keyLabels ? keyLabels[key] : key).toLocaleUpperCase();
89
+ return `${command.control ? controlSymbol : ""}${command.alt ? altSymbol : ""}${command.shift ? "\u21E7" : ""}${keyLabel}`;
90
+ }
91
+ // Update the above when the dependencies below change.
92
+ $: {
93
+ if (context !== undefined && chapter) {
94
+ // Filter the commands by those interactive with a mouse and active.
95
+ const visible = commands.filter(command => command.visible === true || (context && command.visible instanceof Function && command.visible(context)));
96
+ // Extract the active categories and sort them
97
+ categories =
98
+ Array.from(new Set(commands.map(command => command.category)))
99
+ .sort((a, b) => a in categoryOrder && b in categoryOrder ? categoryOrder[a] - categoryOrder[b] : 0);
100
+ // Make a list for each category of commands
101
+ commandsByCategory = {};
102
+ categories.forEach(cat => {
103
+ if (commandsByCategory)
104
+ commandsByCategory[cat] = visible.filter(command => command.category === cat);
105
+ });
106
+ const caretNode = context.start.node;
107
+ metaNode =
108
+ caretNode instanceof AtomNode ? caretNode :
109
+ caretNode instanceof TextNode ? caretNode.getParent(chapter) :
110
+ undefined;
111
+ calloutNode = caretNode.getClosestParentMatching(chapter, p => p instanceof CalloutNode);
112
+ quoteNode = caretNode.getClosestParentMatching(chapter, p => p instanceof QuoteNode);
113
+ embedNode = caretNode.getClosestParentMatching(chapter, p => p instanceof EmbedNode);
114
+ }
115
+ }
116
+ function handleKeyPress(event) {
117
+ // Return focus to the editor if someone presses an unhandled enter
118
+ if (event.key === "Enter" && element) {
119
+ const editor = element.closest(".bookish-editor");
120
+ if (editor instanceof HTMLElement) {
121
+ event.stopPropagation();
122
+ editor.focus();
123
+ }
124
+ return true;
125
+ }
126
+ }
127
+ </script>
128
+
129
+ {#if chapter}
130
+ <section
131
+ class="bookish-editor-toolbar"
132
+ on:keypress={handleKeyPress}
133
+ style={`margin: ${isVisible ? "0px" : "-20em"};`}
134
+ bind:this={element}
135
+ on:mousedown|stopPropagation={ () => element?.focus() }
136
+ tabIndex=0
137
+ >
138
+ {#if context && categories && executor}
139
+ {#each categories as cat }
140
+ {#if commandsByCategory[cat].length > 0 }
141
+ <ToolbarGroup linebreak={false} icon={ cat in categoryIcons ? categoryIcons[cat] : cat.charAt(0).toUpperCase() + cat.slice(1) }>
142
+ {#each commandsByCategory[cat] as command }
143
+ <button
144
+ disabled={command.active === false || (command.active instanceof Function && command.active.call(undefined, context) === false)}
145
+ title={command.description + " " + getShortcutDescription(command)}
146
+ tabIndex=0
147
+ on:click|stopPropagation|preventDefault={() => executor?.call(undefined, command, "")}
148
+ on:keypress={event => event.key === " " || event.key === "Enter" ? executor?.call(undefined, command, "") : undefined }
149
+ >
150
+ {#if command.icon }
151
+ <ToolbarIcon name={command.icon}/>
152
+ {:else if command.label }
153
+ {command.label}
154
+ {:else}
155
+ {command.description }
156
+ {/if}
157
+ </button>
158
+ {/each}
159
+ </ToolbarGroup>
160
+ {/if}
161
+ {/each}
162
+ {/if}
163
+ {#if metaNode instanceof LinkNode}<ToolbarGroup icon="link.svg"><LinkEditor link={metaNode}/></ToolbarGroup>{/if}
164
+ {#if metaNode instanceof LabelNode}<ToolbarGroup icon="•"><LabelEditor label={metaNode}/></ToolbarGroup>{/if}
165
+ {#if metaNode instanceof InlineCodeNode}<ToolbarGroup icon="code.svg"><InlineCodeEditor code={metaNode}/></ToolbarGroup>{/if}
166
+ {#if metaNode instanceof CitationsNode}<ToolbarGroup icon="¹"><CitationsEditor citations={metaNode}/></ToolbarGroup>{/if}
167
+ {#if metaNode instanceof DefinitionNode}<ToolbarGroup icon="Aa"><DefinitionEditor definition={metaNode}/></ToolbarGroup>{/if}
168
+ {#if metaNode instanceof CodeNode && context}<ToolbarGroup icon="code.svg"><CaptionedCodeEditor code={metaNode}/></ToolbarGroup>{/if}
169
+ {#if calloutNode}<ToolbarGroup icon="🄰"><CalloutEditor callout={calloutNode} /></ToolbarGroup>{/if}
170
+ {#if quoteNode}<ToolbarGroup icon="quote.svg"><QuoteEditor quote={quoteNode} /></ToolbarGroup>{/if}
171
+ {#if embedNode}<ToolbarGroup linebreak icon="media.svg"><EmbedEditor embed={embedNode} /></ToolbarGroup>{/if}
172
+ </section>
173
+ {/if}
174
+
175
+ <style>
176
+
177
+ .bookish-editor-toolbar {
178
+ position: fixed;
179
+ top: 0;
180
+ left: 0;
181
+ right: 0;
182
+ background: var(--bookish-background-color);
183
+ border: var(--bookish-app-chrome-border-width) solid var(--bookish-app-chrome-border-color);
184
+ padding: var(--bookish-app-chrome-padding);
185
+ font-family: var(--bookish-app-chrome-font-family);
186
+ font-size: var(--bookish-app-chrome-font-size);
187
+ z-index: 2;
188
+ transition: top 1s;
189
+ }
190
+
191
+ .bookish-editor-toolbar :global(img) {
192
+ width: 1em;
193
+ height: 1em;
194
+ }
195
+
196
+ .bookish-editor-toolbar :global(hr) {
197
+ margin-top: var(--bookish-app-chrome-padding);
198
+ margin-bottom: var(--bookish-app-chrome-padding);
199
+ line-height: 1em;
200
+ }
201
+
202
+ </style>
@@ -0,0 +1,20 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type Command from "./Command";
3
+ import type CaretState from "./CaretState";
4
+ declare const __propDef: {
5
+ props: {
6
+ context?: CaretState | undefined;
7
+ executor?: ((command: Command, key: string) => void) | undefined;
8
+ visible?: boolean | undefined;
9
+ };
10
+ events: {
11
+ [evt: string]: CustomEvent<any>;
12
+ };
13
+ slots: {};
14
+ };
15
+ export declare type ToolbarProps = typeof __propDef.props;
16
+ export declare type ToolbarEvents = typeof __propDef.events;
17
+ export declare type ToolbarSlots = typeof __propDef.slots;
18
+ export default class Toolbar extends SvelteComponentTyped<ToolbarProps, ToolbarEvents, ToolbarSlots> {
19
+ }
20
+ export {};
@@ -0,0 +1,41 @@
1
+ <script>import ToolbarIcon from "./ToolbarIcon.svelte";
2
+ export let linebreak = false;
3
+ export let icon;
4
+ </script>
5
+
6
+ {#if linebreak }<br/>{/if}
7
+ <span class="bookish-editor-toolbar-group">
8
+ <ToolbarIcon name={icon}/><slot></slot>
9
+ </span>
10
+
11
+ <style>
12
+ .bookish-editor-toolbar-group {
13
+ display: inline-block;
14
+ margin-right: calc(2 * var(--bookish-app-chrome-padding));
15
+ margin-bottom: var(--bookish-app-chrome-padding);
16
+ }
17
+
18
+ .bookish-editor-toolbar-group :global(button) {
19
+ vertical-align: middle;
20
+ height: 2.25em;
21
+ }
22
+
23
+ .bookish-editor-toolbar-group :global(button:first-of-type) {
24
+ border-top-right-radius: 0;
25
+ }
26
+
27
+ .bookish-editor-toolbar-group :global(button:last-child) {
28
+ border-bottom-left-radius: 0;
29
+ }
30
+
31
+ .bookish-editor-toolbar-group :global(button:not(:first-of-type):not(:last-child)) {
32
+ border-radius: 0;
33
+ }
34
+
35
+ .bookish-editor-toolbar-group :global(input),
36
+ .bookish-editor-toolbar-group :global(select) {
37
+ margin-left: var(--bookish-app-chrome-padding);
38
+ margin-right: var(--bookish-app-chrome-padding);
39
+ }
40
+
41
+ </style>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ linebreak?: boolean | undefined;
5
+ icon: string;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ default: {};
12
+ };
13
+ };
14
+ export declare type ToolbarGroupProps = typeof __propDef.props;
15
+ export declare type ToolbarGroupEvents = typeof __propDef.events;
16
+ export declare type ToolbarGroupSlots = typeof __propDef.slots;
17
+ export default class ToolbarGroup extends SvelteComponentTyped<ToolbarGroupProps, ToolbarGroupEvents, ToolbarGroupSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,22 @@
1
+ <script>// If ends with .svg, its mapped to an asset in /svg/, otherwise just the text is displayed.
2
+ export let name;
3
+ </script>
4
+
5
+ <span>
6
+ {#if name.endsWith(".svg")}
7
+ <img alt={`${name.replace(".svg", "")} icon`} src="/svg/{name}"/>
8
+ {:else}
9
+ {name}
10
+ {/if}
11
+ </span>
12
+
13
+ <style>
14
+ span {
15
+ margin-right: var(--bookish-app-chrome-padding);
16
+ }
17
+
18
+ img {
19
+ width: 1em;
20
+ height: 1em;
21
+ }
22
+ </style>
@@ -0,0 +1,16 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ name: string;
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {};
10
+ };
11
+ export declare type ToolbarIconProps = typeof __propDef.props;
12
+ export declare type ToolbarIconEvents = typeof __propDef.events;
13
+ export declare type ToolbarIconSlots = typeof __propDef.slots;
14
+ export default class ToolbarIcon extends SvelteComponentTyped<ToolbarIconProps, ToolbarIconEvents, ToolbarIconSlots> {
15
+ }
16
+ export {};
@@ -0,0 +1 @@
1
+ <span style="display: inline-block, width: 1em"></span>
@@ -0,0 +1,19 @@
1
+ /** @typedef {typeof __propDef.props} ToolbarSpacerProps */
2
+ /** @typedef {typeof __propDef.events} ToolbarSpacerEvents */
3
+ /** @typedef {typeof __propDef.slots} ToolbarSpacerSlots */
4
+ export default class ToolbarSpacer extends SvelteComponentTyped<{}, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> {
7
+ }
8
+ export type ToolbarSpacerProps = typeof __propDef.props;
9
+ export type ToolbarSpacerEvents = typeof __propDef.events;
10
+ export type ToolbarSpacerSlots = typeof __propDef.slots;
11
+ import { SvelteComponentTyped } from "svelte";
12
+ declare const __propDef: {
13
+ props: {};
14
+ events: {
15
+ [evt: string]: CustomEvent<any>;
16
+ };
17
+ slots: {};
18
+ };
19
+ export {};
@@ -0,0 +1,15 @@
1
+ <script>import TextEditor from "./TextEditor.svelte";
2
+ export let url;
3
+ export let validator;
4
+ export let edit;
5
+ </script>
6
+
7
+ <TextEditor
8
+ placeholder="url"
9
+ startText={url}
10
+ label="URL editor"
11
+ valid={ url => validator(url) }
12
+ save={ url => edit(url) }
13
+ width={20}
14
+ clip={true}
15
+ />
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ url: string;
5
+ validator: (text: string) => undefined | string;
6
+ edit: (newURL: string) => string | undefined;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export declare type UrlEditorProps = typeof __propDef.props;
14
+ export declare type UrlEditorEvents = typeof __propDef.events;
15
+ export declare type UrlEditorSlots = typeof __propDef.slots;
16
+ export default class UrlEditor extends SvelteComponentTyped<UrlEditorProps, UrlEditorEvents, UrlEditorSlots> {
17
+ }
18
+ export {};