bookish-press 0.4.1 → 0.4.21
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/README.md +3 -1
- package/components/Auth.svelte +19 -14
- package/components/Auth.svelte.d.ts +4 -4
- package/components/Authentication.d.ts +2 -2
- package/components/BookPreview.svelte +77 -59
- package/components/BookPreview.svelte.d.ts +5 -5
- package/components/External.svelte +1 -1
- package/components/External.svelte.d.ts +3 -3
- package/components/Link.svelte +49 -3
- package/components/Link.svelte.d.ts +3 -4
- package/components/app/BookList.svelte +19 -0
- package/components/app/BookList.svelte.d.ts +18 -0
- package/components/app/Button.svelte +49 -0
- package/components/app/Button.svelte.d.ts +22 -0
- package/components/app/Feedback.svelte +45 -0
- package/components/app/Feedback.svelte.d.ts +18 -0
- package/components/app/Head.svelte +12 -0
- package/components/app/Head.svelte.d.ts +27 -0
- package/components/app/Large.svelte +8 -0
- package/components/app/Large.svelte.d.ts +27 -0
- package/components/app/Lead.svelte +12 -0
- package/components/app/Lead.svelte.d.ts +27 -0
- package/components/app/Link.svelte +24 -0
- package/components/app/Link.svelte.d.ts +20 -0
- package/components/app/Options.svelte +24 -0
- package/components/app/Options.svelte.d.ts +19 -0
- package/components/app/Paragraph.svelte +19 -0
- package/components/app/Paragraph.svelte.d.ts +18 -0
- package/components/app/Table.svelte +32 -0
- package/components/app/Table.svelte.d.ts +27 -0
- package/components/app/TextInput.svelte +37 -0
- package/components/app/TextInput.svelte.d.ts +22 -0
- package/components/app/Writing.svelte +13 -0
- package/components/app/Writing.svelte.d.ts +27 -0
- package/components/chapter/Atom.svelte +20 -6
- package/components/chapter/Atom.svelte.d.ts +3 -3
- package/components/chapter/Block.svelte +23 -20
- package/components/chapter/Block.svelte.d.ts +4 -4
- package/components/chapter/Callout.svelte +38 -7
- package/components/chapter/Callout.svelte.d.ts +4 -4
- package/components/chapter/CaptionedCode.svelte +66 -23
- package/components/chapter/CaptionedCode.svelte.d.ts +4 -4
- package/components/chapter/ChapterBody.svelte +61 -9
- package/components/chapter/ChapterBody.svelte.d.ts +4 -4
- package/components/chapter/Citations.svelte +86 -20
- package/components/chapter/Citations.svelte.d.ts +4 -4
- package/components/chapter/Code.svelte +152 -21
- package/components/chapter/Code.svelte.d.ts +3 -3
- package/components/chapter/Comment.svelte +38 -16
- package/components/chapter/Comment.svelte.d.ts +3 -3
- package/components/chapter/Definition.svelte +52 -18
- package/components/chapter/Definition.svelte.d.ts +5 -8
- package/components/chapter/Embed.svelte +154 -66
- package/components/chapter/Embed.svelte.d.ts +5 -4
- package/components/chapter/ErrorMessage.svelte +7 -2
- package/components/chapter/ErrorMessage.svelte.d.ts +4 -4
- package/components/chapter/ExtendedPrism.d.ts +2 -0
- package/components/chapter/ExtendedPrism.js +69 -0
- package/components/chapter/Figure.svelte +90 -0
- package/components/chapter/Figure.svelte.d.ts +24 -0
- package/components/chapter/Footnote.svelte +75 -12
- package/components/chapter/Footnote.svelte.d.ts +4 -4
- package/components/chapter/Format.svelte +60 -37
- package/components/chapter/Format.svelte.d.ts +4 -4
- package/components/chapter/InlineCode.svelte +15 -5
- package/components/chapter/InlineCode.svelte.d.ts +4 -4
- package/components/chapter/Label.svelte +37 -8
- package/components/chapter/Label.svelte.d.ts +4 -4
- package/components/chapter/Link.svelte +23 -18
- package/components/chapter/Link.svelte.d.ts +4 -4
- package/components/chapter/List.svelte +75 -8
- package/components/chapter/List.svelte.d.ts +4 -4
- package/components/chapter/Marginal.svelte +169 -27
- package/components/chapter/Marginal.svelte.d.ts +6 -3
- package/components/chapter/Paragraph.svelte +74 -6
- package/components/chapter/Paragraph.svelte.d.ts +4 -4
- package/components/chapter/Positioned.svelte +33 -0
- package/components/chapter/Positioned.svelte.d.ts +19 -0
- package/components/chapter/Problem.svelte +15 -0
- package/components/chapter/Problem.svelte.d.ts +27 -0
- package/components/chapter/Python.svelte +68 -21
- package/components/chapter/Python.svelte.d.ts +4 -4
- package/components/chapter/Quote.svelte +64 -11
- package/components/chapter/Quote.svelte.d.ts +4 -4
- package/components/chapter/Rule.svelte +12 -1
- package/components/chapter/Rule.svelte.d.ts +4 -4
- package/components/chapter/Table.svelte +36 -25
- package/components/chapter/Table.svelte.d.ts +4 -4
- package/components/chapter/Text.svelte +61 -36
- package/components/chapter/Text.svelte.d.ts +5 -4
- package/components/editor/BookishEditor.svelte +343 -237
- package/components/editor/BookishEditor.svelte.d.ts +5 -5
- package/components/editor/CalloutEditor.svelte +5 -5
- package/components/editor/CalloutEditor.svelte.d.ts +4 -4
- package/components/editor/CaptionedCodeEditor.svelte +16 -12
- package/components/editor/CaptionedCodeEditor.svelte.d.ts +4 -4
- package/components/editor/CaretContext.d.ts +48 -16
- package/components/editor/CaretState.d.ts +16 -44
- package/components/editor/CaretUtilities.d.ts +2 -2
- package/components/editor/CaretView.svelte +80 -0
- package/components/editor/CaretView.svelte.d.ts +24 -0
- package/components/editor/CitationsEditor.svelte +36 -25
- package/components/editor/CitationsEditor.svelte.d.ts +4 -4
- package/components/editor/Clipboard.d.ts +2 -2
- package/components/editor/Command.d.ts +13 -12
- package/components/editor/Commands.d.ts +1 -1
- package/components/editor/Commands.js +1114 -571
- package/components/editor/ConfirmButton.svelte +18 -12
- package/components/editor/ConfirmButton.svelte.d.ts +5 -4
- package/components/editor/DefinitionEditor.svelte +29 -21
- package/components/editor/DefinitionEditor.svelte.d.ts +4 -4
- package/components/editor/EmbedEditor.svelte +93 -43
- package/components/editor/EmbedEditor.svelte.d.ts +3 -3
- package/components/editor/Icon.svelte +17 -0
- package/components/editor/Icon.svelte.d.ts +16 -0
- package/components/editor/ImageChooser.svelte +53 -34
- package/components/editor/ImageChooser.svelte.d.ts +3 -3
- package/components/editor/InlineCodeEditor.svelte +7 -4
- package/components/editor/InlineCodeEditor.svelte.d.ts +4 -4
- package/components/editor/LabelEditor.svelte +20 -11
- package/components/editor/LabelEditor.svelte.d.ts +4 -4
- package/components/editor/LanguageEditor.svelte +10 -7
- package/components/editor/LanguageEditor.svelte.d.ts +3 -3
- package/components/editor/LinkEditor.svelte +64 -39
- package/components/editor/LinkEditor.svelte.d.ts +4 -4
- package/components/editor/Note.svelte +3 -3
- package/components/editor/Note.svelte.d.ts +6 -2
- package/components/editor/PositionEditor.svelte +9 -6
- package/components/editor/PositionEditor.svelte.d.ts +4 -4
- package/components/editor/QuoteEditor.svelte +7 -2
- package/components/editor/QuoteEditor.svelte.d.ts +4 -4
- package/components/editor/Switch.svelte +55 -28
- package/components/editor/Switch.svelte.d.ts +4 -4
- package/components/editor/TableEditor.svelte +10 -0
- package/components/editor/TableEditor.svelte.d.ts +17 -0
- package/components/editor/TextEditor.svelte +83 -45
- package/components/editor/TextEditor.svelte.d.ts +5 -4
- package/components/editor/Toggle.svelte +11 -8
- package/components/editor/Toggle.svelte.d.ts +4 -4
- package/components/editor/Toolbar.svelte +192 -144
- package/components/editor/Toolbar.svelte.d.ts +5 -8
- package/components/editor/ToolbarGroup.svelte +18 -23
- package/components/editor/ToolbarGroup.svelte.d.ts +3 -4
- package/components/editor/ToolbarSpacer.svelte +8 -1
- package/components/editor/ToolbarSpacer.svelte.d.ts +6 -2
- package/components/editor/URLEditor.svelte +6 -8
- package/components/editor/URLEditor.svelte.d.ts +3 -3
- package/components/editor/UndoState.d.ts +3 -3
- package/components/editor/icons/annotate.svg +1 -0
- package/components/editor/icons/block.svg +1 -0
- package/components/editor/icons/bold.svg +1 -0
- package/components/editor/icons/bullets.svg +1 -0
- package/components/editor/icons/callout.svg +1 -0
- package/components/editor/icons/citation.svg +8 -0
- package/components/editor/icons/clear.svg +1 -0
- package/components/editor/icons/clipboard.svg +1 -0
- package/components/editor/icons/code.svg +1 -0
- package/components/editor/icons/columnafter.svg +1 -0
- package/components/editor/icons/columnbefore.svg +1 -0
- package/components/editor/icons/comment.svg +1 -0
- package/components/editor/icons/copy.svg +1 -0
- package/components/editor/icons/cut.svg +1 -0
- package/components/editor/icons/define.svg +7 -0
- package/components/editor/icons/deletecolumn.svg +1 -0
- package/components/editor/icons/deleterow.svg +1 -0
- package/components/editor/icons/footnote.svg +8 -0
- package/components/editor/icons/header1.svg +7 -0
- package/components/editor/icons/header2.svg +7 -0
- package/components/editor/icons/header3.svg +7 -0
- package/components/editor/icons/home.svg +1 -0
- package/components/editor/icons/indent.svg +1 -0
- package/components/editor/icons/italic.svg +1 -0
- package/components/editor/icons/label.svg +1 -0
- package/components/editor/icons/left.svg +1 -0
- package/components/editor/icons/level.svg +1 -0
- package/components/editor/icons/link.svg +1 -0
- package/components/editor/icons/list.svg +1 -0
- package/components/editor/icons/media.svg +1 -0
- package/components/editor/icons/middle.svg +1 -0
- package/components/editor/icons/numbers.svg +10 -0
- package/components/editor/icons/paragraph.svg +1 -0
- package/components/editor/icons/paste.svg +10 -0
- package/components/editor/icons/quote.svg +1 -0
- package/components/editor/icons/redo.svg +1 -0
- package/components/editor/icons/right.svg +1 -0
- package/components/editor/icons/rowabove.svg +1 -0
- package/components/editor/icons/rowbelow.svg +1 -0
- package/components/editor/icons/rule.svg +1 -0
- package/components/editor/icons/sub.svg +1 -0
- package/components/editor/icons/super.svg +1 -0
- package/components/editor/icons/table.svg +1 -0
- package/components/editor/icons/text.svg +1 -0
- package/components/editor/icons/time.svg +1 -0
- package/components/editor/icons/undo.svg +1 -0
- package/components/editor/icons/unindent.svg +1 -0
- package/components/editor/icons/unlink.svg +1 -0
- package/components/page/Acknowledgements.svelte +31 -22
- package/components/page/Acknowledgements.svelte.d.ts +4 -4
- package/components/page/Authors.svelte +34 -14
- package/components/page/Authors.svelte.d.ts +6 -6
- package/components/page/BulkReferenceEditor.svelte +53 -22
- package/components/page/BulkReferenceEditor.svelte.d.ts +4 -4
- package/components/page/Chapter.svelte +196 -141
- package/components/page/Chapter.svelte.d.ts +3 -3
- package/components/page/ChapterContext.d.ts +4 -4
- package/components/page/ChapterNumber.svelte +9 -0
- package/components/page/ChapterNumber.svelte.d.ts +27 -0
- package/components/page/ChapterTitle.svelte +16 -0
- package/components/page/ChapterTitle.svelte.d.ts +18 -0
- package/components/page/Contexts.d.ts +31 -20
- package/components/page/Contexts.js +47 -17
- package/components/page/DefinitionView.svelte +115 -86
- package/components/page/DefinitionView.svelte.d.ts +3 -3
- package/components/page/Description.svelte +27 -18
- package/components/page/Description.svelte.d.ts +4 -4
- package/components/page/Edition.svelte +127 -75
- package/components/page/Edition.svelte.d.ts +4 -4
- package/components/page/Editions.svelte +158 -0
- package/components/page/Editions.svelte.d.ts +14 -0
- package/components/page/Glossary.svelte +57 -48
- package/components/page/Glossary.svelte.d.ts +4 -4
- package/components/page/Header.svelte +129 -44
- package/components/page/Header.svelte.d.ts +6 -6
- package/components/page/Index.svelte +114 -80
- package/components/page/Index.svelte.d.ts +4 -4
- package/components/page/Instructions.svelte +18 -16
- package/components/page/Instructions.svelte.d.ts +4 -4
- package/components/page/License.svelte +29 -21
- package/components/page/License.svelte.d.ts +4 -4
- package/components/page/Loading.svelte +102 -12
- package/components/page/Loading.svelte.d.ts +6 -2
- package/components/page/Media.svelte +77 -51
- package/components/page/Media.svelte.d.ts +4 -4
- package/components/page/MediaPreview.svelte +26 -8
- package/components/page/MediaPreview.svelte.d.ts +3 -3
- package/components/page/Muted.svelte +10 -0
- package/components/page/Muted.svelte.d.ts +27 -0
- package/components/page/Outline.svelte +279 -59
- package/components/page/Outline.svelte.d.ts +3 -3
- package/components/page/Page.svelte +40 -9
- package/components/page/Page.svelte.d.ts +3 -3
- package/components/page/PageHeader.svelte +14 -0
- package/components/page/PageHeader.svelte.d.ts +18 -0
- package/components/page/PageParagraph.svelte +18 -0
- package/components/page/PageParagraph.svelte.d.ts +27 -0
- package/components/page/PossibleChapter.svelte +7 -7
- package/components/page/PossibleChapter.svelte.d.ts +4 -4
- package/components/page/PossibleReference.svelte +6 -11
- package/components/page/PossibleReference.svelte.d.ts +6 -7
- package/components/page/Print.svelte +27 -3
- package/components/page/Print.svelte.d.ts +4 -4
- package/components/page/Reference.svelte +256 -113
- package/components/page/Reference.svelte.d.ts +5 -5
- package/components/page/References.svelte +39 -47
- package/components/page/References.svelte.d.ts +4 -4
- package/components/page/Rows.svelte +54 -0
- package/components/page/Rows.svelte.d.ts +27 -0
- package/components/page/Search.svelte +86 -63
- package/components/page/Search.svelte.d.ts +4 -4
- package/components/page/Status.svelte +43 -35
- package/components/page/Status.svelte.d.ts +4 -9
- package/components/page/SubdomainEditor.svelte +40 -27
- package/components/page/SubdomainEditor.svelte.d.ts +4 -4
- package/components/page/TableOfContents.svelte +225 -190
- package/components/page/TableOfContents.svelte.d.ts +4 -4
- package/components/page/TableOfContentsImage.svelte +8 -8
- package/components/page/TableOfContentsImage.svelte.d.ts +3 -3
- package/components/page/TableOfContentsRow.svelte +96 -33
- package/components/page/TableOfContentsRow.svelte.d.ts +4 -4
- package/components/page/ThemeEditor.svelte +174 -39
- package/components/page/ThemeEditor.svelte.d.ts +4 -4
- package/components/page/ThemeEditorPreview.svelte +35 -23
- package/components/page/ThemeEditorPreview.svelte.d.ts +5 -5
- package/components/page/ThemeSetEditor.svelte +15 -13
- package/components/page/ThemeSetEditor.svelte.d.ts +4 -4
- package/components/page/ThemeVariableEditor.svelte +24 -15
- package/components/page/ThemeVariableEditor.svelte.d.ts +3 -3
- package/components/page/Title.svelte +12 -0
- package/components/page/Title.svelte.d.ts +27 -0
- package/components/page/Unknown.svelte +25 -21
- package/components/page/Unknown.svelte.d.ts +4 -4
- package/components/page/margins.js +50 -33
- package/index.d.ts +14 -0
- package/index.js +14 -0
- package/models/CRUD.d.ts +17 -0
- package/models/CRUD.js +207 -0
- package/models/Firebase.d.ts +1 -0
- package/models/Firebase.js +21 -15
- package/models/book/Book.d.ts +26 -30
- package/models/book/Book.js +120 -113
- package/models/book/BookMedia.d.ts +3 -3
- package/models/book/BookMedia.js +22 -16
- package/models/book/BookSaveStatus.d.ts +7 -0
- package/models/book/BookSaveStatus.js +8 -0
- package/models/book/Chapter.d.ts +46 -39
- package/models/book/Chapter.js +180 -198
- package/models/book/ChapterID.js +7 -7
- package/models/book/Definition.d.ts +1 -1
- package/models/book/Edition.d.ts +62 -60
- package/models/book/Edition.js +385 -303
- package/models/book/Reference.d.ts +24 -0
- package/models/book/Reference.js +78 -0
- package/models/book/Schema.d.ts +169 -0
- package/models/book/Schema.js +114 -0
- package/models/book/Theme.d.ts +44 -37
- package/models/book/Theme.js +452 -52
- package/models/book/ThemeColors.d.ts +1 -1
- package/models/book/Words.d.ts +2 -0
- package/models/book/Words.js +110 -0
- package/models/chapter/AtomNode.d.ts +4 -4
- package/models/chapter/AtomNode.js +20 -13
- package/models/chapter/BlockNode.d.ts +9 -10
- package/models/chapter/BlockNode.js +32 -13
- package/models/chapter/BlocksNode.d.ts +10 -10
- package/models/chapter/BlocksNode.js +315 -120
- package/models/chapter/BlocksNode.test.js +494 -228
- package/models/chapter/Bookkeeping.d.ts +1 -1
- package/models/chapter/CalloutNode.d.ts +3 -3
- package/models/chapter/CalloutNode.js +34 -12
- package/models/chapter/Caret.d.ts +9 -7
- package/models/chapter/Caret.js +11 -6
- package/models/chapter/ChapterNode.d.ts +11 -11
- package/models/chapter/ChapterNode.js +70 -33
- package/models/chapter/CitationsNode.d.ts +3 -3
- package/models/chapter/CitationsNode.js +31 -12
- package/models/chapter/CodeNode.d.ts +11 -6
- package/models/chapter/CodeNode.js +143 -34
- package/models/chapter/CommentNode.d.ts +5 -5
- package/models/chapter/CommentNode.js +29 -13
- package/models/chapter/DefinitionNode.d.ts +2 -2
- package/models/chapter/DefinitionNode.js +15 -7
- package/models/chapter/Edit.d.ts +3 -3
- package/models/chapter/EmbedNode.d.ts +9 -5
- package/models/chapter/EmbedNode.js +108 -35
- package/models/chapter/ErrorNode.d.ts +2 -2
- package/models/chapter/ErrorNode.js +34 -12
- package/models/chapter/FootnoteNode.d.ts +5 -5
- package/models/chapter/FootnoteNode.js +34 -16
- package/models/chapter/FormatNode.d.ts +10 -10
- package/models/chapter/FormatNode.js +237 -106
- package/models/chapter/FormatNode.test.js +87 -45
- package/models/chapter/InlineCodeNode.d.ts +2 -2
- package/models/chapter/InlineCodeNode.js +22 -9
- package/models/chapter/LabelNode.d.ts +4 -4
- package/models/chapter/LabelNode.js +31 -13
- package/models/chapter/LinkNode.d.ts +2 -2
- package/models/chapter/LinkNode.js +21 -9
- package/models/chapter/ListNode.d.ts +8 -8
- package/models/chapter/ListNode.js +99 -38
- package/models/chapter/ListNode.test.js +29 -24
- package/models/chapter/MetadataNode.d.ts +3 -3
- package/models/chapter/MetadataNode.js +13 -5
- package/models/chapter/Node.d.ts +5 -3
- package/models/chapter/Node.js +76 -29
- package/models/chapter/Node.test.js +20 -18
- package/models/chapter/ParagraphNode.d.ts +6 -6
- package/models/chapter/ParagraphNode.js +84 -29
- package/models/chapter/ParagraphNode.test.js +22 -13
- package/models/chapter/Parser.d.ts +25 -25
- package/models/chapter/Parser.js +201 -189
- package/models/chapter/Parser.test.js +16 -16
- package/models/chapter/Position.d.ts +1 -1
- package/models/chapter/QuoteNode.d.ts +6 -6
- package/models/chapter/QuoteNode.js +61 -23
- package/models/chapter/RootNode.d.ts +4 -4
- package/models/chapter/RuleNode.d.ts +2 -2
- package/models/chapter/RuleNode.js +31 -11
- package/models/chapter/TableNode.d.ts +8 -6
- package/models/chapter/TableNode.js +89 -34
- package/models/chapter/TableNode.test.js +22 -24
- package/models/chapter/TextNode.d.ts +6 -6
- package/models/chapter/TextNode.js +72 -32
- package/models/chapter/TextNode.test.js +4 -4
- package/models/loadEdition.d.ts +1 -1
- package/models/loadEdition.js +10 -6
- package/package.json +104 -25
- package/util/getSubdomain.js +8 -6
- package/util/isMobile.js +1 -1
- package/util/mineReference.d.ts +3 -2
- package/util/mineReference.js +67 -29
- package/util/scrollToEyeLevel.js +6 -1
- package/components/chapter/renderPosition.d.ts +0 -3
- package/components/chapter/renderPosition.js +0 -4
- package/components/editor/ToolbarIcon.svelte +0 -22
- package/components/editor/ToolbarIcon.svelte.d.ts +0 -16
- package/components/page/Alert.svelte +0 -11
- package/components/page/Alert.svelte.d.ts +0 -23
- package/components/page/Revisions.svelte +0 -124
- package/components/page/Revisions.svelte.d.ts +0 -14
- package/models/BookLoader.d.ts +0 -2
- package/models/BookLoader.js +0 -67
- package/models/Firestore.d.ts +0 -22
- package/models/Firestore.js +0 -194
- package/models/chapter/ReferenceNode.d.ts +0 -29
- package/models/chapter/ReferenceNode.js +0 -48
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
<script>import { onMount } from
|
|
1
|
+
<script>import { onMount } from 'svelte';
|
|
2
|
+
import Button from '../app/Button.svelte';
|
|
2
3
|
export let commandLabel;
|
|
4
|
+
export let tooltip;
|
|
3
5
|
export let confirmLabel;
|
|
4
6
|
export let command;
|
|
5
7
|
let confirming = false;
|
|
@@ -8,13 +10,15 @@ let timeoutID = undefined;
|
|
|
8
10
|
let isMounted = false;
|
|
9
11
|
onMount(() => {
|
|
10
12
|
isMounted = true;
|
|
11
|
-
return () => isMounted = false;
|
|
13
|
+
return () => (isMounted = false);
|
|
12
14
|
});
|
|
13
15
|
function execute() {
|
|
14
16
|
if (!confirming && !executing) {
|
|
15
17
|
confirming = true;
|
|
16
|
-
timeoutID = setTimeout(() => {
|
|
17
|
-
|
|
18
|
+
timeoutID = setTimeout(() => {
|
|
19
|
+
if (isMounted)
|
|
20
|
+
confirming = false;
|
|
21
|
+
}, 2000);
|
|
18
22
|
}
|
|
19
23
|
else if (confirming) {
|
|
20
24
|
command()?.finally(() => {
|
|
@@ -29,15 +33,17 @@ function execute() {
|
|
|
29
33
|
}
|
|
30
34
|
</script>
|
|
31
35
|
|
|
32
|
-
<
|
|
33
|
-
disabled={executing}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
<Button
|
|
37
|
+
disabled={executing}
|
|
38
|
+
{tooltip}
|
|
39
|
+
command={execute}
|
|
40
|
+
class={confirming ? 'bookish-editor-confirm' : ''}
|
|
41
|
+
>
|
|
42
|
+
{confirming ? confirmLabel : commandLabel}
|
|
43
|
+
</Button>
|
|
38
44
|
|
|
39
45
|
<style>
|
|
40
|
-
button.bookish-editor-confirm {
|
|
46
|
+
:global(button.bookish-editor-confirm) {
|
|
41
47
|
animation: failure 100ms infinite;
|
|
42
48
|
}
|
|
43
|
-
</style>
|
|
49
|
+
</style>
|
|
@@ -2,17 +2,18 @@ import { SvelteComponentTyped } from "svelte";
|
|
|
2
2
|
declare const __propDef: {
|
|
3
3
|
props: {
|
|
4
4
|
commandLabel: string;
|
|
5
|
+
tooltip: string;
|
|
5
6
|
confirmLabel: string;
|
|
6
|
-
command: () => Promise<void> |
|
|
7
|
+
command: () => Promise<void> | void;
|
|
7
8
|
};
|
|
8
9
|
events: {
|
|
9
10
|
[evt: string]: CustomEvent<any>;
|
|
10
11
|
};
|
|
11
12
|
slots: {};
|
|
12
13
|
};
|
|
13
|
-
export
|
|
14
|
-
export
|
|
15
|
-
export
|
|
14
|
+
export type ConfirmButtonProps = typeof __propDef.props;
|
|
15
|
+
export type ConfirmButtonEvents = typeof __propDef.events;
|
|
16
|
+
export type ConfirmButtonSlots = typeof __propDef.slots;
|
|
16
17
|
export default class ConfirmButton extends SvelteComponentTyped<ConfirmButtonProps, ConfirmButtonEvents, ConfirmButtonSlots> {
|
|
17
18
|
}
|
|
18
19
|
export {};
|
|
@@ -1,28 +1,36 @@
|
|
|
1
|
-
<script>import
|
|
1
|
+
<script>import Options from '../app/Options.svelte';
|
|
2
|
+
import Note from './Note.svelte';
|
|
3
|
+
import { getCaret, getEdition } from '../page/Contexts';
|
|
2
4
|
export let definition;
|
|
3
|
-
let edition = getEdition();
|
|
4
5
|
let caret = getCaret();
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
$caret?.edit(definition, definition.withMeta(
|
|
6
|
+
let edition = getEdition();
|
|
7
|
+
$: glossary = $edition?.getGlossary();
|
|
8
|
+
function handleChange(glossaryID) {
|
|
9
|
+
$caret?.edit(definition, definition.withMeta(glossaryID));
|
|
9
10
|
}
|
|
10
11
|
// Sort the glossary entries by phrase
|
|
11
|
-
$: entries =
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
$: entries =
|
|
13
|
+
glossary === undefined
|
|
14
|
+
? undefined
|
|
15
|
+
: Object.entries(glossary)
|
|
16
|
+
.map(([key, value]) => {
|
|
17
|
+
return { glossaryID: key, phrase: value.phrase };
|
|
18
|
+
})
|
|
19
|
+
.sort((a, b) => a && b ? a.phrase.localeCompare(b.phrase) : 0);
|
|
14
20
|
</script>
|
|
15
21
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
{#if entries !== undefined && glossary !== undefined}
|
|
23
|
+
{#if entries.length === 0}
|
|
24
|
+
<Note>No glossary entries to add</Note>
|
|
25
|
+
{:else}
|
|
26
|
+
<Options
|
|
27
|
+
options={entries.map((entry) => [entry.phrase, entry.glossaryID])}
|
|
28
|
+
value={definition.getMeta()}
|
|
29
|
+
changed={handleChange}
|
|
30
|
+
label="choose definition"
|
|
31
|
+
/>
|
|
32
|
+
{#if !(definition.getMeta() in glossary)}
|
|
33
|
+
<Note>Choose a glossary entry.</Note>
|
|
34
|
+
{/if}
|
|
27
35
|
{/if}
|
|
28
|
-
|
|
36
|
+
{/if}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import type DefinitionNode from
|
|
2
|
+
import type DefinitionNode from '../../models/chapter/DefinitionNode';
|
|
3
3
|
declare const __propDef: {
|
|
4
4
|
props: {
|
|
5
5
|
definition: DefinitionNode;
|
|
@@ -9,9 +9,9 @@ declare const __propDef: {
|
|
|
9
9
|
};
|
|
10
10
|
slots: {};
|
|
11
11
|
};
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
12
|
+
export type DefinitionEditorProps = typeof __propDef.props;
|
|
13
|
+
export type DefinitionEditorEvents = typeof __propDef.events;
|
|
14
|
+
export type DefinitionEditorSlots = typeof __propDef.slots;
|
|
15
15
|
export default class DefinitionEditor extends SvelteComponentTyped<DefinitionEditorProps, DefinitionEditorEvents, DefinitionEditorSlots> {
|
|
16
16
|
}
|
|
17
17
|
export {};
|
|
@@ -2,86 +2,136 @@
|
|
|
2
2
|
import EmbedNode from '../../models/chapter/EmbedNode';
|
|
3
3
|
import TextEditor from './TextEditor.svelte';
|
|
4
4
|
import { storage } from '../../models/Firebase';
|
|
5
|
-
import { getBook, getCaret } from '../page/Contexts';
|
|
6
5
|
import ToolbarSpacer from './ToolbarSpacer.svelte';
|
|
7
6
|
import ImageChooser from './ImageChooser.svelte';
|
|
8
7
|
import URLEditor from './URLEditor.svelte';
|
|
8
|
+
import Note from './Note.svelte';
|
|
9
|
+
import { getBook, getCaret } from '../page/Contexts';
|
|
9
10
|
export let embed;
|
|
10
|
-
let book = getBook();
|
|
11
11
|
let caret = getCaret();
|
|
12
12
|
let upload = undefined;
|
|
13
13
|
$: description = embed.getDescription();
|
|
14
|
-
|
|
14
|
+
let book = getBook();
|
|
15
15
|
function isValidURL(url) {
|
|
16
16
|
// Is it a valid URL?
|
|
17
17
|
try {
|
|
18
18
|
let test = new URL(url);
|
|
19
|
-
if (test.protocol ===
|
|
19
|
+
if (test.protocol === 'http:' || test.protocol === 'https:')
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
22
|
catch (_) { }
|
|
23
23
|
return "URL doesn't seem valid";
|
|
24
24
|
}
|
|
25
25
|
function handleImageChange(event) {
|
|
26
|
+
if ($book === undefined)
|
|
27
|
+
return;
|
|
28
|
+
if ($caret === undefined)
|
|
29
|
+
return;
|
|
26
30
|
const target = event.target;
|
|
27
31
|
const file = target.files === null ? undefined : target.files[0];
|
|
28
|
-
const media = book.getMedia();
|
|
32
|
+
const media = $book.getMedia();
|
|
29
33
|
if (file === undefined)
|
|
30
34
|
return;
|
|
31
35
|
if (storage === undefined)
|
|
32
36
|
return;
|
|
33
37
|
if (media === undefined)
|
|
34
38
|
return;
|
|
35
|
-
media.upload(file, (progress) => upload = `${progress}% done
|
|
39
|
+
media.upload(file, (progress) => (upload = `${progress}% done`), (error) => (upload = error), (url, thumbnail) => {
|
|
36
40
|
// Upload completed successfully, now we can get the download URL
|
|
37
|
-
$caret?.edit(embed, embed.withURLs(url, thumbnail).withDescription(
|
|
41
|
+
$caret?.edit(embed, embed.withURLs(url, thumbnail).withDescription(''));
|
|
38
42
|
upload = undefined;
|
|
39
43
|
});
|
|
40
44
|
}
|
|
41
45
|
function handleImageSelection(image) {
|
|
42
46
|
// Toggle the embed
|
|
43
|
-
$caret?.edit(embed, embed.getURL() === image.url
|
|
44
|
-
embed.withURL(
|
|
45
|
-
embed.withURL(image.url));
|
|
47
|
+
$caret?.edit(embed, embed.getURL() === image.url
|
|
48
|
+
? embed.withURL('').withDescription('')
|
|
49
|
+
: embed.withURL(image.url));
|
|
46
50
|
}
|
|
47
51
|
</script>
|
|
48
52
|
|
|
49
53
|
{#if $caret?.root instanceof EmbedNode}
|
|
50
|
-
<ToolbarSpacer/>
|
|
54
|
+
<ToolbarSpacer />
|
|
51
55
|
{:else}
|
|
52
|
-
Position <PositionEditor
|
|
56
|
+
Position <PositionEditor
|
|
57
|
+
value={embed.getPosition()}
|
|
58
|
+
edit={(position) => $caret?.edit(embed, embed.withPosition(position))}
|
|
59
|
+
/>
|
|
53
60
|
{/if}
|
|
54
|
-
<label class="
|
|
55
|
-
<input
|
|
61
|
+
<label class="file-upload" tabIndex="0">
|
|
62
|
+
<input
|
|
63
|
+
type="file"
|
|
64
|
+
on:input={handleImageChange}
|
|
65
|
+
accept=".jpg,.jpeg,.png,.gif,image/jpeg,image/png,image/gif"
|
|
66
|
+
/>
|
|
56
67
|
Upload
|
|
57
68
|
</label>
|
|
58
|
-
<ToolbarSpacer/>
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}}
|
|
70
|
-
/>
|
|
71
|
-
{/if}
|
|
72
|
-
</code>
|
|
73
|
-
<ToolbarSpacer/>
|
|
74
|
-
<code>
|
|
75
|
-
<TextEditor
|
|
76
|
-
startText={description}
|
|
77
|
-
label={'Image description'}
|
|
78
|
-
placeholder={'description'}
|
|
79
|
-
valid={ alt => alt.length === 0 ? "Image description required" : undefined }
|
|
80
|
-
save={ alt => { $caret?.edit(embed, embed.withDescription(alt)); } }
|
|
81
|
-
width={20}
|
|
82
|
-
clip={true}
|
|
69
|
+
<ToolbarSpacer />
|
|
70
|
+
{#if !embed.isHosted()}
|
|
71
|
+
<URLEditor
|
|
72
|
+
url={embed.getURL()}
|
|
73
|
+
validator={isValidURL}
|
|
74
|
+
edit={(url) => {
|
|
75
|
+
const revisedEmbed = embed.withURL(url);
|
|
76
|
+
const revisedURL = revisedEmbed.getURL();
|
|
77
|
+
$caret?.edit(embed, revisedEmbed);
|
|
78
|
+
return revisedURL;
|
|
79
|
+
}}
|
|
83
80
|
/>
|
|
84
|
-
|
|
85
|
-
<
|
|
86
|
-
{
|
|
87
|
-
<
|
|
81
|
+
{:else}
|
|
82
|
+
<Note>(Hosted)</Note>
|
|
83
|
+
{/if}
|
|
84
|
+
<ToolbarSpacer />
|
|
85
|
+
<TextEditor
|
|
86
|
+
text={description}
|
|
87
|
+
label={'Image description'}
|
|
88
|
+
placeholder={'description'}
|
|
89
|
+
valid={(alt) =>
|
|
90
|
+
alt.length === 0 ? 'Image description required' : undefined}
|
|
91
|
+
save={(alt) => {
|
|
92
|
+
$caret?.edit(embed, embed.withDescription(alt));
|
|
93
|
+
}}
|
|
94
|
+
width={20}
|
|
95
|
+
clip={true}
|
|
96
|
+
/>
|
|
97
|
+
<ToolbarSpacer />
|
|
98
|
+
{#if upload}
|
|
99
|
+
{upload}
|
|
100
|
+
{/if}
|
|
101
|
+
<ImageChooser select={handleImageSelection} selection={embed.getURL()} />
|
|
102
|
+
|
|
103
|
+
<style>
|
|
104
|
+
.file-upload {
|
|
105
|
+
background-color: var(--app-chrome-background);
|
|
106
|
+
padding: var(--app-chrome-padding);
|
|
107
|
+
border-radius: var(--app-chrome-roundedness);
|
|
108
|
+
border: none;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.file-upload:hover {
|
|
112
|
+
background-color: var(--app-interactive-color);
|
|
113
|
+
color: var(--app-font-color-inverted);
|
|
114
|
+
cursor: pointer;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.file-upload input:disabled {
|
|
118
|
+
opacity: 0.3;
|
|
119
|
+
cursor: auto;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.file-upload {
|
|
123
|
+
font-family: var(--bookish-app-font);
|
|
124
|
+
font-size: var(--app-chrome-font-size);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.file-upload input[type='file'] {
|
|
128
|
+
display: none;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.file-upload:focus-within {
|
|
132
|
+
position: relative;
|
|
133
|
+
z-index: 2;
|
|
134
|
+
outline: var(--app-chrome-border-size) solid
|
|
135
|
+
var(--app-interactive-color);
|
|
136
|
+
}
|
|
137
|
+
</style>
|
|
@@ -9,9 +9,9 @@ declare const __propDef: {
|
|
|
9
9
|
};
|
|
10
10
|
slots: {};
|
|
11
11
|
};
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
12
|
+
export type EmbedEditorProps = typeof __propDef.props;
|
|
13
|
+
export type EmbedEditorEvents = typeof __propDef.events;
|
|
14
|
+
export type EmbedEditorSlots = typeof __propDef.slots;
|
|
15
15
|
export default class EmbedEditor extends SvelteComponentTyped<EmbedEditorProps, EmbedEditorEvents, EmbedEditorSlots> {
|
|
16
16
|
}
|
|
17
17
|
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
icon: string;
|
|
5
|
+
};
|
|
6
|
+
events: {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
};
|
|
9
|
+
slots: {};
|
|
10
|
+
};
|
|
11
|
+
export type IconProps = typeof __propDef.props;
|
|
12
|
+
export type IconEvents = typeof __propDef.events;
|
|
13
|
+
export type IconSlots = typeof __propDef.slots;
|
|
14
|
+
export default class Icon extends SvelteComponentTyped<IconProps, IconEvents, IconSlots> {
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<script>import { onMount } from 'svelte';
|
|
2
|
-
import { getBook } from '../page/Contexts';
|
|
2
|
+
import { getBook, getCaret } from '../page/Contexts';
|
|
3
3
|
export let select;
|
|
4
4
|
export let selection;
|
|
5
|
+
let editor = getCaret();
|
|
5
6
|
let book = getBook();
|
|
6
7
|
let images = undefined;
|
|
7
8
|
let expanded = false;
|
|
@@ -10,45 +11,63 @@ function updateImages(newImages) {
|
|
|
10
11
|
}
|
|
11
12
|
// Load the latest images in the book, and keep them updated as they change.
|
|
12
13
|
onMount(() => {
|
|
13
|
-
|
|
14
|
+
if ($book === undefined)
|
|
15
|
+
return;
|
|
16
|
+
const media = $book.getMedia();
|
|
14
17
|
media.notify(updateImages);
|
|
15
18
|
return () => media.stopNotifying(updateImages);
|
|
16
19
|
});
|
|
17
20
|
</script>
|
|
18
21
|
|
|
19
|
-
<div
|
|
20
|
-
class={`bookish-image-chooser ${expanded ?
|
|
21
|
-
tabIndex=0
|
|
22
|
-
on:click={() => expanded = !expanded}
|
|
23
|
-
on:keydown={event =>
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
<div
|
|
23
|
+
class={`bookish-image-chooser ${expanded ? 'expanded' : ''}`}
|
|
24
|
+
tabIndex="0"
|
|
25
|
+
on:click={() => (expanded = !expanded)}
|
|
26
|
+
on:keydown={(event) =>
|
|
27
|
+
event.key === 'Enter' || event.key === ' '
|
|
28
|
+
? (expanded = !expanded)
|
|
29
|
+
: undefined}
|
|
30
|
+
on:mouseenter={() => (expanded = true)}
|
|
31
|
+
on:mouseleave={() => (expanded = false)}
|
|
26
32
|
>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
<!-- Sort the images by their URL. There's probably a more meaningful sort,
|
|
31
|
-
such as placing unused images at the front of the list. -->
|
|
32
|
-
{#each images.sort((a, b) => a.url.localeCompare(b.url)) as image }
|
|
33
|
-
<img
|
|
34
|
-
class={`bookish-image-chooser-image ${image.url === selection ? "selected" : ""}`}
|
|
35
|
-
src={image.url}
|
|
36
|
-
alt={`Image named ${image.url}`}
|
|
37
|
-
tabIndex=0
|
|
38
|
-
on:click|stopPropagation={() => select(image)}
|
|
39
|
-
on:keydown={event => event.key === "Enter" || event.key === " " ? select(image) : undefined }
|
|
40
|
-
/>
|
|
33
|
+
<div class="images">
|
|
34
|
+
{#if images === undefined}
|
|
35
|
+
Loading images
|
|
41
36
|
{:else}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
37
|
+
<!-- Sort the images by their URL. There's probably a more meaningful sort,
|
|
38
|
+
such as placing unused images at the front of the list. -->
|
|
39
|
+
{#each images.sort((a, b) => a.url.localeCompare(b.url)) as image}
|
|
40
|
+
<img
|
|
41
|
+
class={`bookish-image-chooser-image ${
|
|
42
|
+
image.url === selection ? 'selected' : ''
|
|
43
|
+
}`}
|
|
44
|
+
src={image.url}
|
|
45
|
+
alt={`Image named ${image.url}`}
|
|
46
|
+
tabIndex="0"
|
|
47
|
+
on:click|stopPropagation={() => select(image)}
|
|
48
|
+
on:keydown={(event) =>
|
|
49
|
+
event.key === 'Enter' || event.key === ' '
|
|
50
|
+
? select(image)
|
|
51
|
+
: undefined}
|
|
52
|
+
/>
|
|
53
|
+
{:else}
|
|
54
|
+
No images uploaded
|
|
55
|
+
{/each}
|
|
56
|
+
{/if}
|
|
57
|
+
</div>
|
|
45
58
|
</div>
|
|
46
59
|
|
|
47
60
|
<style>
|
|
48
61
|
.bookish-image-chooser {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
62
|
+
display: inline-block;
|
|
63
|
+
vertical-align: middle;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.images {
|
|
67
|
+
display: flex;
|
|
68
|
+
flex-direction: row;
|
|
69
|
+
flex-wrap: nowrap;
|
|
70
|
+
overflow-x: scroll;
|
|
52
71
|
}
|
|
53
72
|
|
|
54
73
|
.bookish-image-chooser.expanded {
|
|
@@ -58,13 +77,13 @@ onMount(() => {
|
|
|
58
77
|
|
|
59
78
|
.bookish-image-chooser-image {
|
|
60
79
|
display: inline-block;
|
|
61
|
-
height:
|
|
62
|
-
margin-right: var(--bookish-app-chrome-padding);
|
|
80
|
+
height: 2em;
|
|
63
81
|
cursor: pointer;
|
|
64
82
|
}
|
|
65
83
|
|
|
66
84
|
.bookish-image-chooser-image.selected {
|
|
67
|
-
outline: var(--
|
|
68
|
-
|
|
85
|
+
outline: var(--app-chrome-border-size) solid
|
|
86
|
+
var(--app-interactive-color);
|
|
87
|
+
outline-offset: calc(-1 * var(--app-chrome-border-size));
|
|
69
88
|
}
|
|
70
|
-
</style>
|
|
89
|
+
</style>
|
|
@@ -10,9 +10,9 @@ declare const __propDef: {
|
|
|
10
10
|
};
|
|
11
11
|
slots: {};
|
|
12
12
|
};
|
|
13
|
-
export
|
|
14
|
-
export
|
|
15
|
-
export
|
|
13
|
+
export type ImageChooserProps = typeof __propDef.props;
|
|
14
|
+
export type ImageChooserEvents = typeof __propDef.events;
|
|
15
|
+
export type ImageChooserSlots = typeof __propDef.slots;
|
|
16
16
|
export default class ImageChooser extends SvelteComponentTyped<ImageChooserProps, ImageChooserEvents, ImageChooserSlots> {
|
|
17
17
|
}
|
|
18
18
|
export {};
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
<script>import LanguageEditor from
|
|
2
|
-
import { getCaret } from
|
|
1
|
+
<script>import LanguageEditor from './LanguageEditor.svelte';
|
|
2
|
+
import { getCaret } from '../page/Contexts';
|
|
3
3
|
export let code;
|
|
4
4
|
let caret = getCaret();
|
|
5
5
|
</script>
|
|
6
6
|
|
|
7
7
|
<span>
|
|
8
|
-
<LanguageEditor
|
|
9
|
-
|
|
8
|
+
<LanguageEditor
|
|
9
|
+
language={code.getMeta()}
|
|
10
|
+
edit={(lang) => $caret?.edit(code, code.withMeta(lang))}
|
|
11
|
+
/>
|
|
12
|
+
</span>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import type InlineCodeNode from
|
|
2
|
+
import type InlineCodeNode from '../../models/chapter/InlineCodeNode';
|
|
3
3
|
declare const __propDef: {
|
|
4
4
|
props: {
|
|
5
5
|
code: InlineCodeNode;
|
|
@@ -9,9 +9,9 @@ declare const __propDef: {
|
|
|
9
9
|
};
|
|
10
10
|
slots: {};
|
|
11
11
|
};
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
12
|
+
export type InlineCodeEditorProps = typeof __propDef.props;
|
|
13
|
+
export type InlineCodeEditorEvents = typeof __propDef.events;
|
|
14
|
+
export type InlineCodeEditorSlots = typeof __propDef.slots;
|
|
15
15
|
export default class InlineCodeEditor extends SvelteComponentTyped<InlineCodeEditorProps, InlineCodeEditorEvents, InlineCodeEditorSlots> {
|
|
16
16
|
}
|
|
17
17
|
export {};
|
|
@@ -1,23 +1,32 @@
|
|
|
1
|
-
<script>import TextEditor from
|
|
2
|
-
import {
|
|
1
|
+
<script>import TextEditor from './TextEditor.svelte';
|
|
2
|
+
import { getChapter, getEdition } from '../page/Contexts';
|
|
3
|
+
import { getCaret } from '../page/Contexts';
|
|
3
4
|
export let label;
|
|
5
|
+
let edition = getEdition();
|
|
4
6
|
let chapter = getChapter();
|
|
5
7
|
let caret = getCaret();
|
|
6
|
-
$: ast =
|
|
8
|
+
$: ast =
|
|
9
|
+
$edition && $chapter ? $chapter.chapter.getAST($edition) : undefined;
|
|
7
10
|
</script>
|
|
8
11
|
|
|
9
12
|
<code>
|
|
10
|
-
<TextEditor
|
|
11
|
-
|
|
13
|
+
<TextEditor
|
|
14
|
+
text={label.getMeta()}
|
|
12
15
|
label="Chapter label ID"
|
|
13
16
|
placeholder="label ID"
|
|
14
|
-
valid={
|
|
15
|
-
if(id.length === 0) return "
|
|
16
|
-
if(!/^[a-z]+$/.test(id))
|
|
17
|
+
valid={(id) => {
|
|
18
|
+
if (id.length === 0) return "label ID can't be empty";
|
|
19
|
+
if (!/^[a-z]+$/.test(id))
|
|
20
|
+
return 'lable ID can only be a-z characters';
|
|
17
21
|
// If it's different than what it is and there's already one, then error.
|
|
18
|
-
if
|
|
22
|
+
if (
|
|
23
|
+
ast &&
|
|
24
|
+
ast.getLabels().filter((l) => l.getMeta() === id).length >
|
|
25
|
+
(label.getMeta() === id ? 1 : 0)
|
|
26
|
+
)
|
|
27
|
+
return 'label ID is already used';
|
|
19
28
|
}}
|
|
20
|
-
save={labelID => $caret?.edit(label, label.withMeta(labelID))
|
|
29
|
+
save={(labelID) => $caret?.edit(label, label.withMeta(labelID))}
|
|
21
30
|
saveOnExit
|
|
22
31
|
/>
|
|
23
|
-
</code>
|
|
32
|
+
</code>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import type LabelNode from
|
|
2
|
+
import type LabelNode from '../../models/chapter/LabelNode';
|
|
3
3
|
declare const __propDef: {
|
|
4
4
|
props: {
|
|
5
5
|
label: LabelNode;
|
|
@@ -9,9 +9,9 @@ declare const __propDef: {
|
|
|
9
9
|
};
|
|
10
10
|
slots: {};
|
|
11
11
|
};
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
12
|
+
export type LabelEditorProps = typeof __propDef.props;
|
|
13
|
+
export type LabelEditorEvents = typeof __propDef.events;
|
|
14
|
+
export type LabelEditorSlots = typeof __propDef.slots;
|
|
15
15
|
export default class LabelEditor extends SvelteComponentTyped<LabelEditorProps, LabelEditorEvents, LabelEditorSlots> {
|
|
16
16
|
}
|
|
17
17
|
export {};
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
<script>import
|
|
1
|
+
<script>import Options from '../app/Options.svelte';
|
|
2
|
+
import Note from './Note.svelte';
|
|
2
3
|
export let language;
|
|
3
4
|
export let edit;
|
|
4
|
-
|
|
5
|
-
const languages = ["C", "C++", "CSS", "Go", "HTML", "Java", "JavaScript", "Markdown", "Plaintext", "Python", "TypeScript"];
|
|
5
|
+
const languages = ['', 'html', 'css', 'javascript', 'python'];
|
|
6
6
|
</script>
|
|
7
7
|
|
|
8
|
-
<
|
|
9
|
-
{
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
<Options
|
|
9
|
+
options={languages.map((lang) => [lang === '' ? 'plaintext' : lang, lang])}
|
|
10
|
+
value={language}
|
|
11
|
+
changed={(lang) => edit(lang)}
|
|
12
|
+
label="choose language"
|
|
13
|
+
/>
|
|
14
|
+
<Note>Choose a programming language to enable syntax highlighting.</Note>
|
|
@@ -9,9 +9,9 @@ declare const __propDef: {
|
|
|
9
9
|
};
|
|
10
10
|
slots: {};
|
|
11
11
|
};
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
12
|
+
export type LanguageEditorProps = typeof __propDef.props;
|
|
13
|
+
export type LanguageEditorEvents = typeof __propDef.events;
|
|
14
|
+
export type LanguageEditorSlots = typeof __propDef.slots;
|
|
15
15
|
export default class LanguageEditor extends SvelteComponentTyped<LanguageEditorProps, LanguageEditorEvents, LanguageEditorSlots> {
|
|
16
16
|
}
|
|
17
17
|
export {};
|