bookish-press 0.4.232 → 0.5.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.
- package/{components → package/components}/Auth.svelte +11 -13
- package/{components → package/components}/Auth.svelte.d.ts +0 -0
- package/{components → package/components}/Authentication.d.ts +0 -0
- package/{components → package/components}/Authentication.js +0 -0
- package/{components → package/components}/BookPreview.svelte +13 -17
- package/{components → package/components}/BookPreview.svelte.d.ts +0 -0
- package/{components → package/components}/Link.svelte +2 -1
- package/{components → package/components}/Link.svelte.d.ts +1 -0
- package/{components → package/components}/app/BookList.svelte +0 -0
- package/{components → package/components}/app/BookList.svelte.d.ts +0 -0
- package/{components → package/components}/app/Button.svelte +5 -2
- package/{components → package/components}/app/Button.svelte.d.ts +0 -0
- package/{components → package/components}/app/Feedback.svelte +4 -9
- package/{components → package/components}/app/Feedback.svelte.d.ts +0 -0
- package/{components → package/components}/app/Head.svelte +4 -1
- package/{components → package/components}/app/Head.svelte.d.ts +6 -15
- package/{components → package/components}/app/Large.svelte +0 -0
- package/{components → package/components}/app/Large.svelte.d.ts +0 -0
- package/{components → package/components}/app/Lead.svelte +0 -0
- package/{components → package/components}/app/Lead.svelte.d.ts +0 -0
- package/package/components/app/Link.svelte +36 -0
- package/{components → package/components}/app/Link.svelte.d.ts +1 -0
- package/{components → package/components}/app/Options.svelte +0 -0
- package/{components → package/components}/app/Options.svelte.d.ts +0 -0
- package/{components → package/components}/app/Paragraph.svelte +1 -0
- package/{components → package/components}/app/Paragraph.svelte.d.ts +0 -0
- package/{components/app/Writing.svelte → package/components/app/Section.svelte} +0 -1
- package/package/components/app/Section.svelte.d.ts +27 -0
- package/{components → package/components}/app/Table.svelte +0 -0
- package/{components → package/components}/app/Table.svelte.d.ts +0 -0
- package/{components → package/components}/app/TextInput.svelte +2 -0
- package/{components → package/components}/app/TextInput.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Atom.svelte +1 -8
- package/{components → package/components}/chapter/Atom.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Block.svelte +3 -1
- package/{components → package/components}/chapter/Block.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Callout.svelte +0 -0
- package/{components → package/components}/chapter/Callout.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/CaptionedCode.svelte +2 -2
- package/{components → package/components}/chapter/CaptionedCode.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/ChapterBody.svelte +9 -16
- package/{components → package/components}/chapter/ChapterBody.svelte.d.ts +1 -0
- package/{components → package/components}/chapter/Citations.svelte +13 -11
- package/{components → package/components}/chapter/Citations.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Code.svelte +3 -2
- package/{components → package/components}/chapter/Code.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Comment.svelte +7 -13
- package/{components → package/components}/chapter/Comment.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Definition.svelte +8 -3
- package/{components → package/components}/chapter/Definition.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Embed.svelte +6 -5
- package/{components → package/components}/chapter/Embed.svelte.d.ts +1 -0
- package/{components → package/components}/chapter/ErrorMessage.svelte +0 -0
- package/{components → package/components}/chapter/ErrorMessage.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/ExtendedPrism.d.ts +0 -0
- package/{components → package/components}/chapter/ExtendedPrism.js +0 -0
- package/{components → package/components}/chapter/Figure.svelte +8 -8
- package/{components → package/components}/chapter/Figure.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Footnote.svelte +13 -24
- package/{components → package/components}/chapter/Footnote.svelte.d.ts +0 -2
- package/{components → package/components}/chapter/Format.svelte +5 -4
- package/{components → package/components}/chapter/Format.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/InlineCode.svelte +2 -2
- package/{components → package/components}/chapter/InlineCode.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Label.svelte +5 -7
- package/{components → package/components}/chapter/Label.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Link.svelte +8 -6
- package/{components → package/components}/chapter/Link.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/List.svelte +5 -0
- package/{components → package/components}/chapter/List.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Marginal.svelte +30 -12
- package/{components → package/components}/chapter/Marginal.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Paragraph.svelte +23 -10
- package/{components → package/components}/chapter/Paragraph.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Positioned.svelte +0 -0
- package/{components → package/components}/chapter/Positioned.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Problem.svelte +0 -0
- package/{components → package/components}/chapter/Problem.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Python.svelte +0 -0
- package/{components → package/components}/chapter/Python.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Quote.svelte +20 -10
- package/{components → package/components}/chapter/Quote.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Rule.svelte +0 -0
- package/{components → package/components}/chapter/Rule.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Table.svelte +2 -2
- package/{components → package/components}/chapter/Table.svelte.d.ts +0 -0
- package/{components → package/components}/chapter/Text.svelte +2 -2
- package/{components → package/components}/chapter/Text.svelte.d.ts +0 -0
- package/package/components/controls/DarkToggle.svelte +38 -0
- package/package/components/controls/DarkToggle.svelte.d.ts +17 -0
- package/{components → package/components}/editor/BookishEditor.svelte +57 -32
- package/{components → package/components}/editor/BookishEditor.svelte.d.ts +4 -1
- package/{components → package/components}/editor/CalloutEditor.svelte +0 -0
- package/{components → package/components}/editor/CalloutEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/CaptionedCodeEditor.svelte +0 -0
- package/{components → package/components}/editor/CaptionedCodeEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/CaretContext.d.ts +0 -0
- package/{components → package/components}/editor/CaretContext.js +0 -0
- package/{components → package/components}/editor/CaretState.d.ts +0 -0
- package/{components → package/components}/editor/CaretState.js +0 -0
- package/{components → package/components}/editor/CaretUtilities.d.ts +0 -0
- package/{components → package/components}/editor/CaretUtilities.js +0 -0
- package/{components → package/components}/editor/CaretView.svelte +4 -2
- package/{components → package/components}/editor/CaretView.svelte.d.ts +1 -0
- package/{components → package/components}/editor/CitationsEditor.svelte +0 -0
- package/{components → package/components}/editor/CitationsEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/Clipboard.d.ts +0 -0
- package/{components → package/components}/editor/Clipboard.js +0 -0
- package/{components → package/components}/editor/Command.d.ts +0 -0
- package/{components → package/components}/editor/Command.js +0 -0
- package/{components → package/components}/editor/Commands.d.ts +0 -0
- package/{components → package/components}/editor/Commands.js +0 -0
- package/package/components/editor/ConfirmButton.svelte +23 -0
- package/{components → package/components}/editor/ConfirmButton.svelte.d.ts +4 -3
- package/{components → package/components}/editor/DefinitionEditor.svelte +0 -0
- package/{components → package/components}/editor/DefinitionEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/EmbedEditor.svelte +1 -1
- package/{components → package/components}/editor/EmbedEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/Icon.svelte +0 -0
- package/{components → package/components}/editor/Icon.svelte.d.ts +0 -0
- package/{components → package/components}/editor/ImageChooser.svelte +0 -0
- package/{components → package/components}/editor/ImageChooser.svelte.d.ts +0 -0
- package/{components → package/components}/editor/InlineCodeEditor.svelte +0 -0
- package/{components → package/components}/editor/InlineCodeEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/LabelEditor.svelte +0 -0
- package/{components → package/components}/editor/LabelEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/LanguageEditor.svelte +0 -0
- package/{components → package/components}/editor/LanguageEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/LinkEditor.svelte +4 -3
- package/{components → package/components}/editor/LinkEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/Note.svelte +1 -0
- package/{components → package/components}/editor/Note.svelte.d.ts +0 -0
- package/package/components/editor/Permissions.svelte +93 -0
- package/package/components/editor/Permissions.svelte.d.ts +20 -0
- package/{components → package/components}/editor/PositionEditor.svelte +0 -0
- package/{components → package/components}/editor/PositionEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/QuoteEditor.svelte +0 -0
- package/{components → package/components}/editor/QuoteEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/Switch.svelte +0 -0
- package/{components → package/components}/editor/Switch.svelte.d.ts +0 -0
- package/{components → package/components}/editor/TableEditor.svelte +0 -0
- package/{components → package/components}/editor/TableEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/TextEditor.svelte +2 -3
- package/{components → package/components}/editor/TextEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/Toggle.svelte +0 -0
- package/{components → package/components}/editor/Toggle.svelte.d.ts +0 -0
- package/{components → package/components}/editor/Toolbar.svelte +8 -3
- package/{components → package/components}/editor/Toolbar.svelte.d.ts +0 -0
- package/{components → package/components}/editor/ToolbarGroup.svelte +0 -1
- package/{components → package/components}/editor/ToolbarGroup.svelte.d.ts +0 -0
- package/{components → package/components}/editor/ToolbarSpacer.svelte +0 -0
- package/{components → package/components}/editor/ToolbarSpacer.svelte.d.ts +0 -0
- package/{components → package/components}/editor/URLEditor.svelte +2 -0
- package/{components → package/components}/editor/URLEditor.svelte.d.ts +0 -0
- package/{components → package/components}/editor/UndoState.d.ts +0 -0
- package/{components → package/components}/editor/UndoState.js +0 -0
- package/{components → package/components}/editor/icons/annotate.svg +0 -0
- package/{components → package/components}/editor/icons/block.svg +0 -0
- package/{components → package/components}/editor/icons/bold.svg +0 -0
- package/{components → package/components}/editor/icons/bullets.svg +0 -0
- package/{components → package/components}/editor/icons/callout.svg +0 -0
- package/{components → package/components}/editor/icons/citation.svg +0 -0
- package/{components → package/components}/editor/icons/clear.svg +0 -0
- package/{components → package/components}/editor/icons/clipboard.svg +0 -0
- package/{components → package/components}/editor/icons/code.svg +0 -0
- package/{components → package/components}/editor/icons/columnafter.svg +0 -0
- package/{components → package/components}/editor/icons/columnbefore.svg +0 -0
- package/{components → package/components}/editor/icons/comment.svg +0 -0
- package/{components → package/components}/editor/icons/copy.svg +0 -0
- package/{components → package/components}/editor/icons/cut.svg +0 -0
- package/{components → package/components}/editor/icons/define.svg +0 -0
- package/{components → package/components}/editor/icons/deletecolumn.svg +0 -0
- package/{components → package/components}/editor/icons/deleterow.svg +0 -0
- package/{components → package/components}/editor/icons/footnote.svg +0 -0
- package/{components → package/components}/editor/icons/header1.svg +0 -0
- package/{components → package/components}/editor/icons/header2.svg +0 -0
- package/{components → package/components}/editor/icons/header3.svg +0 -0
- package/{components → package/components}/editor/icons/home.svg +0 -0
- package/{components → package/components}/editor/icons/indent.svg +0 -0
- package/{components → package/components}/editor/icons/italic.svg +0 -0
- package/{components → package/components}/editor/icons/label.svg +0 -0
- package/{components → package/components}/editor/icons/left.svg +0 -0
- package/{components → package/components}/editor/icons/level.svg +0 -0
- package/{components → package/components}/editor/icons/link.svg +0 -0
- package/{components → package/components}/editor/icons/list.svg +0 -0
- package/{components → package/components}/editor/icons/media.svg +0 -0
- package/{components → package/components}/editor/icons/middle.svg +0 -0
- package/{components → package/components}/editor/icons/numbers.svg +0 -0
- package/{components → package/components}/editor/icons/paragraph.svg +0 -0
- package/{components → package/components}/editor/icons/paste.svg +0 -0
- package/{components → package/components}/editor/icons/quote.svg +0 -0
- package/{components → package/components}/editor/icons/redo.svg +0 -0
- package/{components → package/components}/editor/icons/right.svg +0 -0
- package/{components → package/components}/editor/icons/rowabove.svg +0 -0
- package/{components → package/components}/editor/icons/rowbelow.svg +0 -0
- package/{components → package/components}/editor/icons/rule.svg +0 -0
- package/{components → package/components}/editor/icons/sub.svg +0 -0
- package/{components → package/components}/editor/icons/super.svg +0 -0
- package/{components → package/components}/editor/icons/table.svg +0 -0
- package/{components → package/components}/editor/icons/text.svg +0 -0
- package/{components → package/components}/editor/icons/time.svg +0 -0
- package/{components → package/components}/editor/icons/undo.svg +0 -0
- package/{components → package/components}/editor/icons/unindent.svg +0 -0
- package/{components → package/components}/editor/icons/unlink.svg +0 -0
- package/{components → package/components}/page/Acknowledgements.svelte +13 -11
- package/{components → package/components}/page/Acknowledgements.svelte.d.ts +0 -0
- package/package/components/page/Authors.svelte +86 -0
- package/{components → package/components}/page/Authors.svelte.d.ts +1 -0
- package/package/components/page/BookLoader.svelte +59 -0
- package/package/components/page/BookLoader.svelte.d.ts +16 -0
- package/{components → package/components}/page/BulkReferenceEditor.svelte +8 -8
- package/{components → package/components}/page/BulkReferenceEditor.svelte.d.ts +0 -0
- package/{components → package/components}/page/Chapter.svelte +69 -30
- package/{components → package/components}/page/Chapter.svelte.d.ts +0 -0
- package/{components → package/components}/page/ChapterContext.d.ts +0 -0
- package/{components → package/components}/page/ChapterContext.js +0 -0
- package/{components → package/components}/page/ChapterNumber.svelte +0 -0
- package/{components → package/components}/page/ChapterNumber.svelte.d.ts +0 -0
- package/{components → package/components}/page/ChapterTitle.svelte +0 -0
- package/{components → package/components}/page/ChapterTitle.svelte.d.ts +0 -0
- package/{components → package/components}/page/Contexts.d.ts +21 -5
- package/package/components/page/Contexts.js +144 -0
- package/{components → package/components}/page/DefinitionView.svelte +23 -14
- package/{components → package/components}/page/DefinitionView.svelte.d.ts +0 -0
- package/{components → package/components}/page/Description.svelte +12 -9
- package/{components → package/components}/page/Description.svelte.d.ts +0 -0
- package/{components → package/components}/page/Edition.svelte +9 -23
- package/{components → package/components}/page/Edition.svelte.d.ts +1 -2
- package/package/components/page/EditionLoader.svelte +99 -0
- package/package/components/page/EditionLoader.svelte.d.ts +18 -0
- package/package/components/page/Editions.svelte +109 -0
- package/{components → package/components}/page/Editions.svelte.d.ts +3 -1
- package/{components → package/components}/page/Glossary.svelte +13 -6
- package/{components → package/components}/page/Glossary.svelte.d.ts +0 -0
- package/{components → package/components}/page/Header.svelte +26 -21
- package/{components → package/components}/page/Header.svelte.d.ts +2 -0
- package/{components → package/components}/page/Index.svelte +14 -8
- package/{components → package/components}/page/Index.svelte.d.ts +0 -0
- package/{components → package/components}/page/Instructions.svelte +1 -2
- package/{components → package/components}/page/Instructions.svelte.d.ts +3 -1
- package/package/components/page/License.svelte +45 -0
- package/{components → package/components}/page/License.svelte.d.ts +0 -0
- package/{components → package/components}/page/Loading.svelte +0 -0
- package/{components → package/components}/page/Loading.svelte.d.ts +0 -0
- package/{components → package/components}/page/Media.svelte +40 -36
- package/{components → package/components}/page/Media.svelte.d.ts +0 -0
- package/package/components/page/MediaPreview.svelte +55 -0
- package/{components → package/components}/page/MediaPreview.svelte.d.ts +0 -0
- package/{components → package/components}/page/Muted.svelte +0 -0
- package/{components → package/components}/page/Muted.svelte.d.ts +0 -0
- package/{components → package/components}/page/Outline.svelte +69 -96
- package/{components → package/components}/page/Outline.svelte.d.ts +0 -0
- package/{components → package/components}/page/Page.svelte +4 -4
- package/{components → package/components}/page/Page.svelte.d.ts +0 -0
- package/{components → package/components}/page/PageHeader.svelte +5 -0
- package/{components → package/components}/page/PageHeader.svelte.d.ts +0 -0
- package/{components → package/components}/page/PageParagraph.svelte +0 -0
- package/{components → package/components}/page/PageParagraph.svelte.d.ts +0 -0
- package/{components → package/components}/page/PossibleChapter.svelte +0 -0
- package/{components → package/components}/page/PossibleChapter.svelte.d.ts +0 -0
- package/{components → package/components}/page/PossibleReference.svelte +2 -1
- package/{components → package/components}/page/PossibleReference.svelte.d.ts +1 -0
- package/{components → package/components}/page/Print.svelte +0 -0
- package/{components → package/components}/page/Print.svelte.d.ts +0 -0
- package/package/components/page/Publish.svelte +135 -0
- package/package/components/page/Publish.svelte.d.ts +14 -0
- package/{components → package/components}/page/Reference.svelte +54 -51
- package/{components → package/components}/page/Reference.svelte.d.ts +1 -0
- package/{components → package/components}/page/References.svelte +9 -4
- package/{components → package/components}/page/References.svelte.d.ts +0 -0
- package/{components → package/components}/page/Rows.svelte +0 -0
- package/{components → package/components}/page/Rows.svelte.d.ts +0 -0
- package/{components → package/components}/page/Search.svelte +27 -10
- package/{components → package/components}/page/Search.svelte.d.ts +0 -0
- package/package/components/page/Status.svelte +58 -0
- package/{components → package/components}/page/Status.svelte.d.ts +0 -0
- package/{components → package/components}/page/SubdomainEditor.svelte +5 -3
- package/{components → package/components}/page/SubdomainEditor.svelte.d.ts +0 -0
- package/{components → package/components}/page/TableOfContents.svelte +83 -37
- package/{components → package/components}/page/TableOfContents.svelte.d.ts +0 -0
- package/package/components/page/TableOfContentsImage.svelte +27 -0
- package/{components → package/components}/page/TableOfContentsImage.svelte.d.ts +1 -0
- package/{components → package/components}/page/TableOfContentsRow.svelte +11 -12
- package/{components → package/components}/page/TableOfContentsRow.svelte.d.ts +0 -0
- package/{components → package/components}/page/ThemeEditor.svelte +12 -10
- package/{components → package/components}/page/ThemeEditor.svelte.d.ts +0 -0
- package/{components → package/components}/page/ThemeEditorPreview.svelte +0 -0
- package/{components → package/components}/page/ThemeEditorPreview.svelte.d.ts +0 -0
- package/{components → package/components}/page/ThemeSetEditor.svelte +0 -0
- package/{components → package/components}/page/ThemeSetEditor.svelte.d.ts +0 -0
- package/{components → package/components}/page/ThemeVariableEditor.svelte +0 -0
- package/{components → package/components}/page/ThemeVariableEditor.svelte.d.ts +0 -0
- package/{components → package/components}/page/Title.svelte +0 -0
- package/{components → package/components}/page/Title.svelte.d.ts +0 -0
- package/{components → package/components}/page/Unknown.svelte +5 -2
- package/{components → package/components}/page/Unknown.svelte.d.ts +0 -0
- package/{components → package/components}/page/margins.d.ts +0 -0
- package/{components → package/components}/page/margins.js +0 -0
- package/{index.d.ts → package/index.d.ts} +3 -1
- package/{index.js → package/index.js} +3 -1
- package/package/models/CRUD.d.ts +28 -0
- package/package/models/CRUD.js +263 -0
- package/{models → package/models}/Firebase.d.ts +0 -0
- package/package/models/Firebase.js +36 -0
- package/{models → package/models}/book/Book.d.ts +23 -18
- package/package/models/book/Book.js +135 -0
- package/{models → package/models}/book/BookMedia.d.ts +1 -1
- package/{models → package/models}/book/BookMedia.js +9 -10
- package/{models → package/models}/book/BookSaveStatus.d.ts +0 -0
- package/{models → package/models}/book/BookSaveStatus.js +0 -0
- package/{models → package/models}/book/Chapter.d.ts +5 -1
- package/{models → package/models}/book/Chapter.js +24 -15
- package/{models → package/models}/book/ChapterID.d.ts +0 -0
- package/{models → package/models}/book/ChapterID.js +0 -0
- package/{models → package/models}/book/Definition.d.ts +0 -0
- package/{models → package/models}/book/Definition.js +0 -0
- package/{models → package/models}/book/Edition.d.ts +33 -7
- package/{models → package/models}/book/Edition.js +104 -32
- package/{models → package/models}/book/Reference.d.ts +0 -0
- package/{models → package/models}/book/Reference.js +0 -0
- package/{models → package/models}/book/Schema.d.ts +20 -15
- package/{models → package/models}/book/Schema.js +17 -16
- package/{models → package/models}/book/Theme.d.ts +0 -0
- package/{models → package/models}/book/Theme.js +7 -6
- package/{models → package/models}/book/ThemeColors.d.ts +0 -0
- package/{models → package/models}/book/ThemeColors.js +0 -0
- package/{models → package/models}/book/Words.d.ts +0 -0
- package/{models → package/models}/book/Words.js +0 -0
- package/{models → package/models}/chapter/AtomNode.d.ts +0 -0
- package/{models → package/models}/chapter/AtomNode.js +0 -0
- package/{models → package/models}/chapter/BlockNode.d.ts +0 -0
- package/{models → package/models}/chapter/BlockNode.js +0 -0
- package/{models → package/models}/chapter/BlocksNode.d.ts +0 -0
- package/{models → package/models}/chapter/BlocksNode.js +0 -0
- package/{models → package/models}/chapter/BlocksNode.test.d.ts +0 -0
- package/{models → package/models}/chapter/BlocksNode.test.js +0 -0
- package/{models → package/models}/chapter/Bookkeeping.d.ts +0 -0
- package/{models → package/models}/chapter/Bookkeeping.js +0 -0
- package/{models → package/models}/chapter/CalloutNode.d.ts +0 -0
- package/{models → package/models}/chapter/CalloutNode.js +0 -0
- package/{models → package/models}/chapter/Caret.d.ts +0 -0
- package/{models → package/models}/chapter/Caret.js +0 -0
- package/{models → package/models}/chapter/ChapterNode.d.ts +0 -0
- package/{models → package/models}/chapter/ChapterNode.js +0 -0
- package/{models → package/models}/chapter/CitationsNode.d.ts +0 -0
- package/{models → package/models}/chapter/CitationsNode.js +0 -0
- package/{models → package/models}/chapter/CodeNode.d.ts +0 -0
- package/{models → package/models}/chapter/CodeNode.js +0 -0
- package/{models → package/models}/chapter/CommentNode.d.ts +0 -0
- package/{models → package/models}/chapter/CommentNode.js +13 -3
- package/{models → package/models}/chapter/DefinitionNode.d.ts +0 -0
- package/{models → package/models}/chapter/DefinitionNode.js +0 -0
- package/{models → package/models}/chapter/Edit.d.ts +0 -0
- package/{models → package/models}/chapter/Edit.js +0 -0
- package/{models → package/models}/chapter/EmbedNode.d.ts +1 -0
- package/{models → package/models}/chapter/EmbedNode.js +6 -0
- package/{models → package/models}/chapter/ErrorNode.d.ts +0 -0
- package/{models → package/models}/chapter/ErrorNode.js +0 -0
- package/{models → package/models}/chapter/FootnoteNode.d.ts +0 -0
- package/{models → package/models}/chapter/FootnoteNode.js +0 -0
- package/{models → package/models}/chapter/FormatNode.d.ts +0 -0
- package/{models → package/models}/chapter/FormatNode.js +1 -6
- package/{models → package/models}/chapter/FormatNode.test.d.ts +0 -0
- package/{models → package/models}/chapter/FormatNode.test.js +0 -0
- package/{models → package/models}/chapter/InlineCodeNode.d.ts +0 -0
- package/{models → package/models}/chapter/InlineCodeNode.js +0 -0
- package/{models → package/models}/chapter/LabelNode.d.ts +0 -0
- package/{models → package/models}/chapter/LabelNode.js +0 -0
- package/{models → package/models}/chapter/LinkNode.d.ts +0 -0
- package/{models → package/models}/chapter/LinkNode.js +0 -0
- package/{models → package/models}/chapter/ListNode.d.ts +0 -0
- package/{models → package/models}/chapter/ListNode.js +0 -0
- package/{models → package/models}/chapter/ListNode.test.d.ts +0 -0
- package/{models → package/models}/chapter/ListNode.test.js +0 -0
- package/{models → package/models}/chapter/MetadataNode.d.ts +0 -0
- package/{models → package/models}/chapter/MetadataNode.js +0 -0
- package/{models → package/models}/chapter/Node.d.ts +0 -0
- package/{models → package/models}/chapter/Node.js +0 -0
- package/{models → package/models}/chapter/Node.test.d.ts +0 -0
- package/{models → package/models}/chapter/Node.test.js +0 -0
- package/{models → package/models}/chapter/ParagraphNode.d.ts +0 -0
- package/{models → package/models}/chapter/ParagraphNode.js +0 -0
- package/{models → package/models}/chapter/ParagraphNode.test.d.ts +0 -0
- package/{models → package/models}/chapter/ParagraphNode.test.js +0 -0
- package/{models → package/models}/chapter/Parser.d.ts +2 -2
- package/{models → package/models}/chapter/Parser.js +26 -24
- package/{models → package/models}/chapter/Parser.test.d.ts +0 -0
- package/{models → package/models}/chapter/Parser.test.js +0 -0
- package/{models → package/models}/chapter/Position.d.ts +0 -0
- package/{models → package/models}/chapter/Position.js +0 -0
- package/{models → package/models}/chapter/QuoteNode.d.ts +0 -0
- package/{models → package/models}/chapter/QuoteNode.js +0 -0
- package/{models → package/models}/chapter/RootNode.d.ts +0 -0
- package/{models → package/models}/chapter/RootNode.js +0 -0
- package/{models → package/models}/chapter/RuleNode.d.ts +0 -0
- package/{models → package/models}/chapter/RuleNode.js +0 -0
- package/{models → package/models}/chapter/TableNode.d.ts +0 -0
- package/{models → package/models}/chapter/TableNode.js +0 -0
- package/{models → package/models}/chapter/TableNode.test.d.ts +0 -0
- package/{models → package/models}/chapter/TableNode.test.js +0 -0
- package/{models → package/models}/chapter/TextNode.d.ts +0 -0
- package/{models → package/models}/chapter/TextNode.js +0 -0
- package/{models → package/models}/chapter/TextNode.test.d.ts +0 -0
- package/{models → package/models}/chapter/TextNode.test.js +0 -0
- package/package/util/dark.d.ts +2 -0
- package/package/util/dark.js +16 -0
- package/{util → package/util}/getSubdomain.d.ts +0 -0
- package/{util → package/util}/getSubdomain.js +0 -0
- package/{util → package/util}/isMobile.d.ts +0 -0
- package/{util → package/util}/isMobile.js +0 -0
- package/{util → package/util}/mineReference.d.ts +0 -0
- package/{util → package/util}/mineReference.js +0 -0
- package/{util → package/util}/scrollToEyeLevel.d.ts +0 -0
- package/{util → package/util}/scrollToEyeLevel.js +0 -0
- package/package.json +955 -267
- package/components/External.svelte +0 -4
- package/components/External.svelte.d.ts +0 -18
- package/components/app/Link.svelte +0 -24
- package/components/app/Writing.svelte.d.ts +0 -27
- package/components/editor/ConfirmButton.svelte +0 -49
- package/components/page/Authors.svelte +0 -82
- package/components/page/Contexts.js +0 -51
- package/components/page/Editions.svelte +0 -158
- package/components/page/License.svelte +0 -37
- package/components/page/MediaPreview.svelte +0 -29
- package/components/page/Status.svelte +0 -57
- package/components/page/TableOfContentsImage.svelte +0 -15
- package/models/CRUD.d.ts +0 -17
- package/models/CRUD.js +0 -207
- package/models/Firebase.js +0 -32
- package/models/book/Book.js +0 -142
- package/models/loadEdition.d.ts +0 -5
- 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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
164
|
+
return getLocation()?.search.split('&')[0]?.split('=')[1] ?? undefined;
|
|
161
165
|
}
|
|
162
166
|
function getHighlightedNumber() {
|
|
163
|
-
const number =
|
|
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
|
|
180
|
+
chapter,
|
|
178
181
|
highlightedWord: getHighlightedWord(),
|
|
179
|
-
highlightedID
|
|
180
|
-
marginal
|
|
181
|
-
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
|
-
|
|
236
|
+
setChapter(
|
|
237
|
+
edition,
|
|
238
|
+
chapter,
|
|
239
|
+
chapter.withChapterID(newChapterID)
|
|
240
|
+
);
|
|
226
241
|
// Navigate to the new ID
|
|
227
242
|
goto(
|
|
228
|
-
`/write/${$book.
|
|
243
|
+
`/write/${$book.getID()}/${editionNumber}/${newChapterID}`
|
|
229
244
|
);
|
|
230
245
|
}
|
|
231
246
|
}}
|
|
232
|
-
placeholder="chapter
|
|
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
|
|
287
|
-
your chapter text below,
|
|
288
|
-
toolbar above to
|
|
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
|
|
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
|
-
|
|
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="
|
|
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;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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
|
|
13
|
-
export declare const
|
|
14
|
-
export declare function
|
|
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
|
|
30
|
-
export declare function
|
|
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,
|
|
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 =
|
|
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="
|
|
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
|
|
70
|
-
|
|
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
|
-
|
|
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="
|
|
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
|
|
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="
|
|
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-
|
|
161
|
+
margin-bottom: var(--bookish-paragraph-spacing);
|
|
153
162
|
}
|
|
154
163
|
|
|
155
164
|
dt {
|
|
File without changes
|
|
@@ -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,
|
|
5
|
-
let
|
|
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
|
|
10
|
+
{#if $edition}
|
|
13
11
|
<section class="bookish-description">
|
|
14
12
|
{#if editable}
|
|
15
13
|
<BookishEditor
|
|
16
|
-
|
|
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="
|
|
24
|
+
placeholder="description"
|
|
25
|
+
leasee={getLeasee(auth, edition, `description`)}
|
|
26
|
+
lease={(lock) => lease(auth, edition, `description`, lock)}
|
|
26
27
|
/>
|
|
27
28
|
{:else}
|
|
28
|
-
<ChapterBody
|
|
29
|
+
<ChapterBody
|
|
30
|
+
node={Parser.parseChapter($edition, $edition.getDescription())}
|
|
31
|
+
/>
|
|
29
32
|
{/if}
|
|
30
33
|
</section>
|
|
31
34
|
{/if}
|
|
File without changes
|
|
@@ -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,
|
|
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
|
-
//
|
|
10
|
-
export let
|
|
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(
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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>;
|