@commonpub/editor 0.1.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/LICENSE +661 -0
- package/README.md +145 -0
- package/dist/blocks/registry.d.ts +17 -0
- package/dist/blocks/registry.d.ts.map +1 -0
- package/dist/blocks/registry.js +65 -0
- package/dist/blocks/registry.js.map +1 -0
- package/dist/blocks/schemas.d.ts +137 -0
- package/dist/blocks/schemas.d.ts.map +1 -0
- package/dist/blocks/schemas.js +113 -0
- package/dist/blocks/schemas.js.map +1 -0
- package/dist/blocks/types.d.ts +16 -0
- package/dist/blocks/types.d.ts.map +1 -0
- package/dist/blocks/types.js +2 -0
- package/dist/blocks/types.js.map +1 -0
- package/dist/editorKit.d.ts +12 -0
- package/dist/editorKit.d.ts.map +1 -0
- package/dist/editorKit.js +94 -0
- package/dist/editorKit.js.map +1 -0
- package/dist/extensions/buildStep.d.ts +16 -0
- package/dist/extensions/buildStep.d.ts.map +1 -0
- package/dist/extensions/buildStep.js +45 -0
- package/dist/extensions/buildStep.js.map +1 -0
- package/dist/extensions/callout.d.ts +19 -0
- package/dist/extensions/callout.d.ts.map +1 -0
- package/dist/extensions/callout.js +52 -0
- package/dist/extensions/callout.js.map +1 -0
- package/dist/extensions/checkpoint.d.ts +12 -0
- package/dist/extensions/checkpoint.d.ts.map +1 -0
- package/dist/extensions/checkpoint.js +27 -0
- package/dist/extensions/checkpoint.js.map +1 -0
- package/dist/extensions/code.d.ts +18 -0
- package/dist/extensions/code.d.ts.map +1 -0
- package/dist/extensions/code.js +75 -0
- package/dist/extensions/code.js.map +1 -0
- package/dist/extensions/downloads.d.ts +17 -0
- package/dist/extensions/downloads.d.ts.map +1 -0
- package/dist/extensions/downloads.js +38 -0
- package/dist/extensions/downloads.js.map +1 -0
- package/dist/extensions/embed.d.ts +14 -0
- package/dist/extensions/embed.d.ts.map +1 -0
- package/dist/extensions/embed.js +27 -0
- package/dist/extensions/embed.js.map +1 -0
- package/dist/extensions/gallery.d.ts +19 -0
- package/dist/extensions/gallery.d.ts.map +1 -0
- package/dist/extensions/gallery.js +43 -0
- package/dist/extensions/gallery.js.map +1 -0
- package/dist/extensions/heading.d.ts +18 -0
- package/dist/extensions/heading.d.ts.map +1 -0
- package/dist/extensions/heading.js +57 -0
- package/dist/extensions/heading.js.map +1 -0
- package/dist/extensions/image.d.ts +17 -0
- package/dist/extensions/image.d.ts.map +1 -0
- package/dist/extensions/image.js +49 -0
- package/dist/extensions/image.js.map +1 -0
- package/dist/extensions/interactiveSlider.d.ts +21 -0
- package/dist/extensions/interactiveSlider.d.ts.map +1 -0
- package/dist/extensions/interactiveSlider.js +45 -0
- package/dist/extensions/interactiveSlider.js.map +1 -0
- package/dist/extensions/markdown.d.ts +12 -0
- package/dist/extensions/markdown.d.ts.map +1 -0
- package/dist/extensions/markdown.js +25 -0
- package/dist/extensions/markdown.js.map +1 -0
- package/dist/extensions/mathNotation.d.ts +13 -0
- package/dist/extensions/mathNotation.d.ts.map +1 -0
- package/dist/extensions/mathNotation.js +28 -0
- package/dist/extensions/mathNotation.js.map +1 -0
- package/dist/extensions/partsList.d.ts +19 -0
- package/dist/extensions/partsList.d.ts.map +1 -0
- package/dist/extensions/partsList.js +38 -0
- package/dist/extensions/partsList.js.map +1 -0
- package/dist/extensions/quiz.d.ts +17 -0
- package/dist/extensions/quiz.d.ts.map +1 -0
- package/dist/extensions/quiz.js +42 -0
- package/dist/extensions/quiz.js.map +1 -0
- package/dist/extensions/quote.d.ts +11 -0
- package/dist/extensions/quote.d.ts.map +1 -0
- package/dist/extensions/quote.js +42 -0
- package/dist/extensions/quote.js.map +1 -0
- package/dist/extensions/text.d.ts +3 -0
- package/dist/extensions/text.d.ts.map +1 -0
- package/dist/extensions/text.js +13 -0
- package/dist/extensions/text.js.map +1 -0
- package/dist/extensions/toolList.d.ts +16 -0
- package/dist/extensions/toolList.d.ts.map +1 -0
- package/dist/extensions/toolList.js +38 -0
- package/dist/extensions/toolList.js.map +1 -0
- package/dist/extensions/video.d.ts +17 -0
- package/dist/extensions/video.d.ts.map +1 -0
- package/dist/extensions/video.js +32 -0
- package/dist/extensions/video.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/serialization.d.ts +16 -0
- package/dist/serialization.d.ts.map +1 -0
- package/dist/serialization.js +530 -0
- package/dist/serialization.js.map +1 -0
- package/package.json +80 -0
package/README.md
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# @commonpub/editor
|
|
2
|
+
|
|
3
|
+
TipTap block editor extensions and serialization for CommonPub.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Block-based content editor built on [TipTap](https://tiptap.dev/). Content is stored as `BlockTuple` arrays, a compact serialization format that maps bidirectionally to TipTap's ProseMirror document structure. Each block type has a Zod schema, a TipTap extension, and a registry entry.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pnpm add @commonpub/editor
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
### Creating an Editor
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { createCommonPubEditor } from '@commonpub/editor';
|
|
21
|
+
|
|
22
|
+
const editor = createCommonPubEditor({
|
|
23
|
+
content: existingBlockTuples, // optional
|
|
24
|
+
onUpdate: (tuples) => {
|
|
25
|
+
// Save block tuples
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Block Types
|
|
31
|
+
|
|
32
|
+
| Type | Extension | Description |
|
|
33
|
+
| ---------- | ------------------- | ----------------------------------- |
|
|
34
|
+
| `text` | `CommonPubText` | Rich text paragraph |
|
|
35
|
+
| `heading` | `CommonPubHeading` | Heading (h1-h6) |
|
|
36
|
+
| `code` | `CommonPubCodeBlock` | Syntax-highlighted code block |
|
|
37
|
+
| `image` | `CommonPubImage` | Image with alt text and caption |
|
|
38
|
+
| `quote` | `CommonPubQuote` | Block quote with attribution |
|
|
39
|
+
| `callout` | `CommonPubCallout` | Callout box (info, warning, tip) |
|
|
40
|
+
|
|
41
|
+
### BlockTuple Format
|
|
42
|
+
|
|
43
|
+
Content is serialized as an array of `[type, content]` tuples:
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
type BlockTuple = [string, Record<string, unknown>];
|
|
47
|
+
|
|
48
|
+
// Example
|
|
49
|
+
const blocks: BlockTuple[] = [
|
|
50
|
+
['heading', { level: 1, text: 'Getting Started' }],
|
|
51
|
+
['text', { html: '<p>Welcome to the tutorial.</p>' }],
|
|
52
|
+
['code', { language: 'typescript', code: 'const x = 1;' }],
|
|
53
|
+
['image', { src: '/uploads/photo.jpg', alt: 'A circuit board' }],
|
|
54
|
+
];
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Serialization
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import { blockTuplesToDoc, docToBlockTuples, validateBlockTuples } from '@commonpub/editor';
|
|
61
|
+
|
|
62
|
+
// BlockTuples -> ProseMirror document (for TipTap)
|
|
63
|
+
const doc = blockTuplesToDoc(tuples, schema);
|
|
64
|
+
|
|
65
|
+
// ProseMirror document -> BlockTuples (for storage)
|
|
66
|
+
const tuples = docToBlockTuples(doc);
|
|
67
|
+
|
|
68
|
+
// Validate block tuples against registered schemas
|
|
69
|
+
const errors = validateBlockTuples(tuples);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Block Registry
|
|
73
|
+
|
|
74
|
+
Register custom block types or use the built-in ones:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
import { registerBlock, lookupBlock, listBlocks, registerCoreBlocks } from '@commonpub/editor';
|
|
78
|
+
|
|
79
|
+
// Register all 6 core block types
|
|
80
|
+
registerCoreBlocks();
|
|
81
|
+
|
|
82
|
+
// Register a custom block type
|
|
83
|
+
registerBlock({
|
|
84
|
+
type: 'embed',
|
|
85
|
+
schema: embedContentSchema,
|
|
86
|
+
extension: CommonPubEmbed,
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// Look up a registered block
|
|
90
|
+
const block = lookupBlock('heading');
|
|
91
|
+
|
|
92
|
+
// List all registered block types
|
|
93
|
+
const types = listBlocks(); // ['text', 'heading', 'code', ...]
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Individual Extensions
|
|
97
|
+
|
|
98
|
+
Use extensions directly for custom editor setups:
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import { CommonPubText, CommonPubHeading, CommonPubCodeBlock } from '@commonpub/editor';
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Content Schemas
|
|
105
|
+
|
|
106
|
+
Zod schemas for validating block content:
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
import {
|
|
110
|
+
textContentSchema,
|
|
111
|
+
headingContentSchema,
|
|
112
|
+
codeContentSchema,
|
|
113
|
+
imageContentSchema,
|
|
114
|
+
quoteContentSchema,
|
|
115
|
+
calloutContentSchema,
|
|
116
|
+
} from '@commonpub/editor';
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Architecture
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
Editor Factory (createCommonPubEditor)
|
|
123
|
+
-> TipTap Core
|
|
124
|
+
-> Extensions (one per block type)
|
|
125
|
+
-> ProseMirror Schema
|
|
126
|
+
-> Serialization (BlockTuple <-> Doc)
|
|
127
|
+
-> Block Registry + Zod Schemas
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Development
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
pnpm build # Compile TypeScript
|
|
134
|
+
pnpm test # Run 69 tests
|
|
135
|
+
pnpm typecheck # Type-check without emitting
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Dependencies
|
|
139
|
+
|
|
140
|
+
- `@tiptap/core` + extensions: Editor framework
|
|
141
|
+
- `@tiptap/pm`: ProseMirror bindings
|
|
142
|
+
- `lowlight`: Syntax highlighting for code blocks
|
|
143
|
+
- `zod`: Block content validation
|
|
144
|
+
- `@commonpub/config`: Feature flags
|
|
145
|
+
- `@commonpub/schema`: Content type definitions
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BlockDefinition, BlockTuple } from './types.js';
|
|
2
|
+
/** Register a block definition */
|
|
3
|
+
export declare function registerBlock(definition: BlockDefinition): void;
|
|
4
|
+
/** Look up a block definition by type */
|
|
5
|
+
export declare function lookupBlock(type: string): BlockDefinition | undefined;
|
|
6
|
+
/** List all registered block definitions */
|
|
7
|
+
export declare function listBlocks(): BlockDefinition[];
|
|
8
|
+
/** Validate a single block tuple against its registered schema */
|
|
9
|
+
export declare function validateBlock(tuple: BlockTuple): {
|
|
10
|
+
success: boolean;
|
|
11
|
+
error?: string;
|
|
12
|
+
};
|
|
13
|
+
/** Clear the registry (for testing) */
|
|
14
|
+
export declare function clearRegistry(): void;
|
|
15
|
+
/** Register all core block types */
|
|
16
|
+
export declare function registerCoreBlocks(): void;
|
|
17
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/blocks/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA0B9D,kCAAkC;AAClC,wBAAgB,aAAa,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAK/D;AAED,yCAAyC;AACzC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAErE;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,IAAI,eAAe,EAAE,CAE9C;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAWrF;AAED,uCAAuC;AACvC,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,oCAAoC;AACpC,wBAAgB,kBAAkB,IAAI,IAAI,CA6BzC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { textContentSchema, headingContentSchema, codeContentSchema, imageContentSchema, quoteContentSchema, calloutContentSchema, galleryContentSchema, videoContentSchema, embedContentSchema, markdownContentSchema, dividerContentSchema, partsListContentSchema, buildStepContentSchema, toolListContentSchema, downloadsContentSchema, quizContentSchema, interactiveSliderContentSchema, checkpointContentSchema, mathNotationContentSchema, sectionHeaderContentSchema, } from './schemas.js';
|
|
2
|
+
const registry = new Map();
|
|
3
|
+
/** Register a block definition */
|
|
4
|
+
export function registerBlock(definition) {
|
|
5
|
+
if (registry.has(definition.type)) {
|
|
6
|
+
throw new Error(`Block type "${definition.type}" is already registered`);
|
|
7
|
+
}
|
|
8
|
+
registry.set(definition.type, definition);
|
|
9
|
+
}
|
|
10
|
+
/** Look up a block definition by type */
|
|
11
|
+
export function lookupBlock(type) {
|
|
12
|
+
return registry.get(type);
|
|
13
|
+
}
|
|
14
|
+
/** List all registered block definitions */
|
|
15
|
+
export function listBlocks() {
|
|
16
|
+
return Array.from(registry.values());
|
|
17
|
+
}
|
|
18
|
+
/** Validate a single block tuple against its registered schema */
|
|
19
|
+
export function validateBlock(tuple) {
|
|
20
|
+
const [type, content] = tuple;
|
|
21
|
+
const definition = registry.get(type);
|
|
22
|
+
if (!definition) {
|
|
23
|
+
return { success: false, error: `Unknown block type: "${type}"` };
|
|
24
|
+
}
|
|
25
|
+
const result = definition.schema.safeParse(content);
|
|
26
|
+
if (!result.success) {
|
|
27
|
+
return { success: false, error: result.error.message };
|
|
28
|
+
}
|
|
29
|
+
return { success: true };
|
|
30
|
+
}
|
|
31
|
+
/** Clear the registry (for testing) */
|
|
32
|
+
export function clearRegistry() {
|
|
33
|
+
registry.clear();
|
|
34
|
+
}
|
|
35
|
+
/** Register all core block types */
|
|
36
|
+
export function registerCoreBlocks() {
|
|
37
|
+
const coreBlocks = [
|
|
38
|
+
{ type: 'text', schema: textContentSchema, label: 'Text' },
|
|
39
|
+
{ type: 'heading', schema: headingContentSchema, label: 'Heading' },
|
|
40
|
+
{ type: 'code', schema: codeContentSchema, label: 'Code' },
|
|
41
|
+
{ type: 'image', schema: imageContentSchema, label: 'Image' },
|
|
42
|
+
{ type: 'quote', schema: quoteContentSchema, label: 'Quote' },
|
|
43
|
+
{ type: 'callout', schema: calloutContentSchema, label: 'Callout' },
|
|
44
|
+
{ type: 'gallery', schema: galleryContentSchema, label: 'Gallery' },
|
|
45
|
+
{ type: 'video', schema: videoContentSchema, label: 'Video' },
|
|
46
|
+
{ type: 'embed', schema: embedContentSchema, label: 'Embed' },
|
|
47
|
+
{ type: 'markdown', schema: markdownContentSchema, label: 'Markdown' },
|
|
48
|
+
{ type: 'divider', schema: dividerContentSchema, label: 'Divider' },
|
|
49
|
+
{ type: 'partsList', schema: partsListContentSchema, label: 'Parts List' },
|
|
50
|
+
{ type: 'buildStep', schema: buildStepContentSchema, label: 'Build Step' },
|
|
51
|
+
{ type: 'toolList', schema: toolListContentSchema, label: 'Tool List' },
|
|
52
|
+
{ type: 'downloads', schema: downloadsContentSchema, label: 'Downloads' },
|
|
53
|
+
{ type: 'quiz', schema: quizContentSchema, label: 'Quiz' },
|
|
54
|
+
{ type: 'interactiveSlider', schema: interactiveSliderContentSchema, label: 'Interactive Slider' },
|
|
55
|
+
{ type: 'checkpoint', schema: checkpointContentSchema, label: 'Checkpoint' },
|
|
56
|
+
{ type: 'mathNotation', schema: mathNotationContentSchema, label: 'Math Notation' },
|
|
57
|
+
{ type: 'sectionHeader', schema: sectionHeaderContentSchema, label: 'Section Header' },
|
|
58
|
+
];
|
|
59
|
+
for (const block of coreBlocks) {
|
|
60
|
+
if (!registry.has(block.type)) {
|
|
61
|
+
registerBlock(block);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/blocks/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const textContentSchema: z.ZodObject<{
|
|
3
|
+
html: z.ZodString;
|
|
4
|
+
}, z.core.$strip>;
|
|
5
|
+
export type TextContent = z.infer<typeof textContentSchema>;
|
|
6
|
+
export declare const headingContentSchema: z.ZodObject<{
|
|
7
|
+
text: z.ZodString;
|
|
8
|
+
level: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type HeadingContent = z.infer<typeof headingContentSchema>;
|
|
11
|
+
export declare const codeContentSchema: z.ZodObject<{
|
|
12
|
+
code: z.ZodString;
|
|
13
|
+
language: z.ZodString;
|
|
14
|
+
filename: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
export type CodeContent = z.infer<typeof codeContentSchema>;
|
|
17
|
+
export declare const imageContentSchema: z.ZodObject<{
|
|
18
|
+
src: z.ZodString;
|
|
19
|
+
alt: z.ZodString;
|
|
20
|
+
caption: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
export type ImageContent = z.infer<typeof imageContentSchema>;
|
|
23
|
+
export declare const quoteContentSchema: z.ZodObject<{
|
|
24
|
+
html: z.ZodString;
|
|
25
|
+
attribution: z.ZodOptional<z.ZodString>;
|
|
26
|
+
}, z.core.$strip>;
|
|
27
|
+
export type QuoteContent = z.infer<typeof quoteContentSchema>;
|
|
28
|
+
export declare const calloutContentSchema: z.ZodObject<{
|
|
29
|
+
html: z.ZodString;
|
|
30
|
+
variant: z.ZodEnum<{
|
|
31
|
+
info: "info";
|
|
32
|
+
tip: "tip";
|
|
33
|
+
warning: "warning";
|
|
34
|
+
danger: "danger";
|
|
35
|
+
}>;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
export type CalloutContent = z.infer<typeof calloutContentSchema>;
|
|
38
|
+
export declare const galleryContentSchema: z.ZodObject<{
|
|
39
|
+
images: z.ZodArray<z.ZodObject<{
|
|
40
|
+
src: z.ZodString;
|
|
41
|
+
alt: z.ZodString;
|
|
42
|
+
caption: z.ZodOptional<z.ZodString>;
|
|
43
|
+
}, z.core.$strip>>;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
export type GalleryContent = z.infer<typeof galleryContentSchema>;
|
|
46
|
+
export declare const videoContentSchema: z.ZodObject<{
|
|
47
|
+
url: z.ZodString;
|
|
48
|
+
platform: z.ZodString;
|
|
49
|
+
caption: z.ZodOptional<z.ZodString>;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
export type VideoContent = z.infer<typeof videoContentSchema>;
|
|
52
|
+
export declare const embedContentSchema: z.ZodObject<{
|
|
53
|
+
url: z.ZodString;
|
|
54
|
+
type: z.ZodString;
|
|
55
|
+
html: z.ZodOptional<z.ZodString>;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
export type EmbedContent = z.infer<typeof embedContentSchema>;
|
|
58
|
+
export declare const markdownContentSchema: z.ZodObject<{
|
|
59
|
+
source: z.ZodString;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
export type MarkdownContent = z.infer<typeof markdownContentSchema>;
|
|
62
|
+
export declare const dividerContentSchema: z.ZodObject<{}, z.core.$strip>;
|
|
63
|
+
export type DividerContent = z.infer<typeof dividerContentSchema>;
|
|
64
|
+
export declare const partsListContentSchema: z.ZodObject<{
|
|
65
|
+
parts: z.ZodArray<z.ZodObject<{
|
|
66
|
+
name: z.ZodString;
|
|
67
|
+
qty: z.ZodNumber;
|
|
68
|
+
price: z.ZodOptional<z.ZodNumber>;
|
|
69
|
+
url: z.ZodOptional<z.ZodString>;
|
|
70
|
+
category: z.ZodOptional<z.ZodString>;
|
|
71
|
+
required: z.ZodOptional<z.ZodBoolean>;
|
|
72
|
+
}, z.core.$strip>>;
|
|
73
|
+
}, z.core.$strip>;
|
|
74
|
+
export type PartsListContent = z.infer<typeof partsListContentSchema>;
|
|
75
|
+
export declare const buildStepContentSchema: z.ZodObject<{
|
|
76
|
+
stepNumber: z.ZodNumber;
|
|
77
|
+
image: z.ZodOptional<z.ZodString>;
|
|
78
|
+
instructions: z.ZodString;
|
|
79
|
+
time: z.ZodOptional<z.ZodString>;
|
|
80
|
+
partsUsed: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
81
|
+
}, z.core.$strip>;
|
|
82
|
+
export type BuildStepContent = z.infer<typeof buildStepContentSchema>;
|
|
83
|
+
export declare const toolListContentSchema: z.ZodObject<{
|
|
84
|
+
tools: z.ZodArray<z.ZodObject<{
|
|
85
|
+
name: z.ZodString;
|
|
86
|
+
url: z.ZodOptional<z.ZodString>;
|
|
87
|
+
required: z.ZodOptional<z.ZodBoolean>;
|
|
88
|
+
}, z.core.$strip>>;
|
|
89
|
+
}, z.core.$strip>;
|
|
90
|
+
export type ToolListContent = z.infer<typeof toolListContentSchema>;
|
|
91
|
+
export declare const downloadsContentSchema: z.ZodObject<{
|
|
92
|
+
files: z.ZodArray<z.ZodObject<{
|
|
93
|
+
name: z.ZodString;
|
|
94
|
+
url: z.ZodString;
|
|
95
|
+
size: z.ZodOptional<z.ZodString>;
|
|
96
|
+
type: z.ZodOptional<z.ZodString>;
|
|
97
|
+
}, z.core.$strip>>;
|
|
98
|
+
}, z.core.$strip>;
|
|
99
|
+
export type DownloadsContent = z.infer<typeof downloadsContentSchema>;
|
|
100
|
+
export declare const quizContentSchema: z.ZodObject<{
|
|
101
|
+
question: z.ZodString;
|
|
102
|
+
options: z.ZodArray<z.ZodObject<{
|
|
103
|
+
text: z.ZodString;
|
|
104
|
+
correct: z.ZodBoolean;
|
|
105
|
+
}, z.core.$strip>>;
|
|
106
|
+
feedback: z.ZodOptional<z.ZodString>;
|
|
107
|
+
}, z.core.$strip>;
|
|
108
|
+
export type QuizContent = z.infer<typeof quizContentSchema>;
|
|
109
|
+
export declare const interactiveSliderContentSchema: z.ZodObject<{
|
|
110
|
+
label: z.ZodString;
|
|
111
|
+
min: z.ZodNumber;
|
|
112
|
+
max: z.ZodNumber;
|
|
113
|
+
step: z.ZodNumber;
|
|
114
|
+
defaultValue: z.ZodNumber;
|
|
115
|
+
states: z.ZodArray<z.ZodObject<{
|
|
116
|
+
range: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
|
|
117
|
+
label: z.ZodString;
|
|
118
|
+
color: z.ZodOptional<z.ZodString>;
|
|
119
|
+
}, z.core.$strip>>;
|
|
120
|
+
}, z.core.$strip>;
|
|
121
|
+
export type InteractiveSliderContent = z.infer<typeof interactiveSliderContentSchema>;
|
|
122
|
+
export declare const checkpointContentSchema: z.ZodObject<{
|
|
123
|
+
message: z.ZodString;
|
|
124
|
+
}, z.core.$strip>;
|
|
125
|
+
export type CheckpointContent = z.infer<typeof checkpointContentSchema>;
|
|
126
|
+
export declare const mathNotationContentSchema: z.ZodObject<{
|
|
127
|
+
expression: z.ZodString;
|
|
128
|
+
display: z.ZodOptional<z.ZodBoolean>;
|
|
129
|
+
}, z.core.$strip>;
|
|
130
|
+
export type MathNotationContent = z.infer<typeof mathNotationContentSchema>;
|
|
131
|
+
export declare const sectionHeaderContentSchema: z.ZodObject<{
|
|
132
|
+
tag: z.ZodString;
|
|
133
|
+
title: z.ZodString;
|
|
134
|
+
body: z.ZodOptional<z.ZodString>;
|
|
135
|
+
}, z.core.$strip>;
|
|
136
|
+
export type SectionHeaderContent = z.infer<typeof sectionHeaderContentSchema>;
|
|
137
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/blocks/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const textContentSchema = z.object({
|
|
3
|
+
html: z.string(),
|
|
4
|
+
});
|
|
5
|
+
export const headingContentSchema = z.object({
|
|
6
|
+
text: z.string(),
|
|
7
|
+
level: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]),
|
|
8
|
+
});
|
|
9
|
+
export const codeContentSchema = z.object({
|
|
10
|
+
code: z.string(),
|
|
11
|
+
language: z.string(),
|
|
12
|
+
filename: z.string().optional(),
|
|
13
|
+
});
|
|
14
|
+
export const imageContentSchema = z.object({
|
|
15
|
+
src: z.string().url(),
|
|
16
|
+
alt: z.string(),
|
|
17
|
+
caption: z.string().optional(),
|
|
18
|
+
});
|
|
19
|
+
export const quoteContentSchema = z.object({
|
|
20
|
+
html: z.string(),
|
|
21
|
+
attribution: z.string().optional(),
|
|
22
|
+
});
|
|
23
|
+
export const calloutContentSchema = z.object({
|
|
24
|
+
html: z.string(),
|
|
25
|
+
variant: z.enum(['info', 'tip', 'warning', 'danger']),
|
|
26
|
+
});
|
|
27
|
+
// === New block types ===
|
|
28
|
+
export const galleryContentSchema = z.object({
|
|
29
|
+
images: z.array(z.object({
|
|
30
|
+
src: z.string().url(),
|
|
31
|
+
alt: z.string(),
|
|
32
|
+
caption: z.string().optional(),
|
|
33
|
+
})),
|
|
34
|
+
});
|
|
35
|
+
export const videoContentSchema = z.object({
|
|
36
|
+
url: z.string().url(),
|
|
37
|
+
platform: z.string(),
|
|
38
|
+
caption: z.string().optional(),
|
|
39
|
+
});
|
|
40
|
+
export const embedContentSchema = z.object({
|
|
41
|
+
url: z.string().url(),
|
|
42
|
+
type: z.string(),
|
|
43
|
+
html: z.string().optional(),
|
|
44
|
+
});
|
|
45
|
+
export const markdownContentSchema = z.object({
|
|
46
|
+
source: z.string(),
|
|
47
|
+
});
|
|
48
|
+
export const dividerContentSchema = z.object({});
|
|
49
|
+
export const partsListContentSchema = z.object({
|
|
50
|
+
parts: z.array(z.object({
|
|
51
|
+
name: z.string(),
|
|
52
|
+
qty: z.number(),
|
|
53
|
+
price: z.number().optional(),
|
|
54
|
+
url: z.string().optional(),
|
|
55
|
+
category: z.string().optional(),
|
|
56
|
+
required: z.boolean().optional(),
|
|
57
|
+
})),
|
|
58
|
+
});
|
|
59
|
+
export const buildStepContentSchema = z.object({
|
|
60
|
+
stepNumber: z.number(),
|
|
61
|
+
image: z.string().optional(),
|
|
62
|
+
instructions: z.string(),
|
|
63
|
+
time: z.string().optional(),
|
|
64
|
+
partsUsed: z.array(z.string()).optional(),
|
|
65
|
+
});
|
|
66
|
+
export const toolListContentSchema = z.object({
|
|
67
|
+
tools: z.array(z.object({
|
|
68
|
+
name: z.string(),
|
|
69
|
+
url: z.string().optional(),
|
|
70
|
+
required: z.boolean().optional(),
|
|
71
|
+
})),
|
|
72
|
+
});
|
|
73
|
+
export const downloadsContentSchema = z.object({
|
|
74
|
+
files: z.array(z.object({
|
|
75
|
+
name: z.string(),
|
|
76
|
+
url: z.string().url(),
|
|
77
|
+
size: z.string().optional(),
|
|
78
|
+
type: z.string().optional(),
|
|
79
|
+
})),
|
|
80
|
+
});
|
|
81
|
+
export const quizContentSchema = z.object({
|
|
82
|
+
question: z.string(),
|
|
83
|
+
options: z.array(z.object({
|
|
84
|
+
text: z.string(),
|
|
85
|
+
correct: z.boolean(),
|
|
86
|
+
})),
|
|
87
|
+
feedback: z.string().optional(),
|
|
88
|
+
});
|
|
89
|
+
export const interactiveSliderContentSchema = z.object({
|
|
90
|
+
label: z.string(),
|
|
91
|
+
min: z.number(),
|
|
92
|
+
max: z.number(),
|
|
93
|
+
step: z.number().positive(),
|
|
94
|
+
defaultValue: z.number(),
|
|
95
|
+
states: z.array(z.object({
|
|
96
|
+
range: z.tuple([z.number(), z.number()]).refine(([lo, hi]) => lo <= hi, { message: 'range[0] must be <= range[1]' }),
|
|
97
|
+
label: z.string(),
|
|
98
|
+
color: z.string().optional(),
|
|
99
|
+
})),
|
|
100
|
+
}).refine((data) => data.min < data.max, { message: 'min must be less than max' }).refine((data) => data.defaultValue >= data.min && data.defaultValue <= data.max, { message: 'defaultValue must be within [min, max]' });
|
|
101
|
+
export const checkpointContentSchema = z.object({
|
|
102
|
+
message: z.string(),
|
|
103
|
+
});
|
|
104
|
+
export const mathNotationContentSchema = z.object({
|
|
105
|
+
expression: z.string(),
|
|
106
|
+
display: z.boolean().optional(),
|
|
107
|
+
});
|
|
108
|
+
export const sectionHeaderContentSchema = z.object({
|
|
109
|
+
tag: z.string(),
|
|
110
|
+
title: z.string(),
|
|
111
|
+
body: z.string().optional(),
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/blocks/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ZodType } from 'zod';
|
|
2
|
+
import type { TextContent, HeadingContent, CodeContent, ImageContent, QuoteContent, CalloutContent, GalleryContent, VideoContent, EmbedContent, MarkdownContent, DividerContent, PartsListContent, BuildStepContent, ToolListContent, DownloadsContent, QuizContent, InteractiveSliderContent, CheckpointContent, MathNotationContent, SectionHeaderContent } from './schemas.js';
|
|
3
|
+
/** Discriminated union of all known block types */
|
|
4
|
+
export type TypedBlockTuple = ['text', TextContent] | ['heading', HeadingContent] | ['code', CodeContent] | ['image', ImageContent] | ['quote', QuoteContent] | ['callout', CalloutContent] | ['gallery', GalleryContent] | ['video', VideoContent] | ['embed', EmbedContent] | ['markdown', MarkdownContent] | ['divider', DividerContent] | ['partsList', PartsListContent] | ['buildStep', BuildStepContent] | ['toolList', ToolListContent] | ['downloads', DownloadsContent] | ['quiz', QuizContent] | ['interactiveSlider', InteractiveSliderContent] | ['checkpoint', CheckpointContent] | ['mathNotation', MathNotationContent] | ['sectionHeader', SectionHeaderContent];
|
|
5
|
+
/** A block is a [type, content] tuple — accepts both typed and unknown block types for extensibility */
|
|
6
|
+
export type BlockTuple = TypedBlockTuple | [string, Record<string, unknown>];
|
|
7
|
+
/** Definition for a registered block type */
|
|
8
|
+
export interface BlockDefinition<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
9
|
+
/** Unique block type identifier (e.g., 'text', 'heading', 'code') */
|
|
10
|
+
type: string;
|
|
11
|
+
/** Zod schema for validating block content */
|
|
12
|
+
schema: ZodType<T>;
|
|
13
|
+
/** Human-readable label for the block type */
|
|
14
|
+
label: string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/blocks/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAEtB,mDAAmD;AACnD,MAAM,MAAM,eAAe,GACvB,CAAC,MAAM,EAAE,WAAW,CAAC,GACrB,CAAC,SAAS,EAAE,cAAc,CAAC,GAC3B,CAAC,MAAM,EAAE,WAAW,CAAC,GACrB,CAAC,OAAO,EAAE,YAAY,CAAC,GACvB,CAAC,OAAO,EAAE,YAAY,CAAC,GACvB,CAAC,SAAS,EAAE,cAAc,CAAC,GAC3B,CAAC,SAAS,EAAE,cAAc,CAAC,GAC3B,CAAC,OAAO,EAAE,YAAY,CAAC,GACvB,CAAC,OAAO,EAAE,YAAY,CAAC,GACvB,CAAC,UAAU,EAAE,eAAe,CAAC,GAC7B,CAAC,SAAS,EAAE,cAAc,CAAC,GAC3B,CAAC,WAAW,EAAE,gBAAgB,CAAC,GAC/B,CAAC,WAAW,EAAE,gBAAgB,CAAC,GAC/B,CAAC,UAAU,EAAE,eAAe,CAAC,GAC7B,CAAC,WAAW,EAAE,gBAAgB,CAAC,GAC/B,CAAC,MAAM,EAAE,WAAW,CAAC,GACrB,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,GAC/C,CAAC,YAAY,EAAE,iBAAiB,CAAC,GACjC,CAAC,cAAc,EAAE,mBAAmB,CAAC,GACrC,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;AAE5C,wGAAwG;AACxG,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE7E,6CAA6C;AAC7C,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1F,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/blocks/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Editor, type AnyExtension } from '@tiptap/core';
|
|
2
|
+
import type { BlockTuple } from './blocks/types.js';
|
|
3
|
+
export interface CreateCommonPubEditorOptions {
|
|
4
|
+
content?: BlockTuple[];
|
|
5
|
+
editable?: boolean;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
onUpdate?: (blocks: BlockTuple[]) => void;
|
|
8
|
+
extensions?: AnyExtension[];
|
|
9
|
+
element?: HTMLElement;
|
|
10
|
+
}
|
|
11
|
+
export declare function createCommonPubEditor(options?: CreateCommonPubEditorOptions): Editor;
|
|
12
|
+
//# sourceMappingURL=editorKit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorKit.d.ts","sourceRoot":"","sources":["../src/editorKit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAkCzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,4BAA4B;IAC3C,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC1C,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,MAAM,CAqExF"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Editor } from '@tiptap/core';
|
|
2
|
+
import { Document } from '@tiptap/extension-document';
|
|
3
|
+
import { Text } from '@tiptap/extension-text';
|
|
4
|
+
import { Bold } from '@tiptap/extension-bold';
|
|
5
|
+
import { Italic } from '@tiptap/extension-italic';
|
|
6
|
+
import { Code } from '@tiptap/extension-code';
|
|
7
|
+
import { Strike } from '@tiptap/extension-strike';
|
|
8
|
+
import { BulletList } from '@tiptap/extension-bullet-list';
|
|
9
|
+
import { OrderedList } from '@tiptap/extension-ordered-list';
|
|
10
|
+
import { ListItem } from '@tiptap/extension-list-item';
|
|
11
|
+
import { HorizontalRule } from '@tiptap/extension-horizontal-rule';
|
|
12
|
+
import { Link } from '@tiptap/extension-link';
|
|
13
|
+
import { History } from '@tiptap/extension-history';
|
|
14
|
+
import { Placeholder } from '@tiptap/extension-placeholder';
|
|
15
|
+
import { DOMSerializer } from '@tiptap/pm/model';
|
|
16
|
+
import { CommonPubText } from './extensions/text.js';
|
|
17
|
+
import { CommonPubHeading } from './extensions/heading.js';
|
|
18
|
+
import { CommonPubCodeBlock } from './extensions/code.js';
|
|
19
|
+
import { CommonPubImage } from './extensions/image.js';
|
|
20
|
+
import { CommonPubQuote } from './extensions/quote.js';
|
|
21
|
+
import { CommonPubCallout } from './extensions/callout.js';
|
|
22
|
+
import { CommonPubGallery } from './extensions/gallery.js';
|
|
23
|
+
import { CommonPubVideo } from './extensions/video.js';
|
|
24
|
+
import { CommonPubEmbed } from './extensions/embed.js';
|
|
25
|
+
import { CommonPubMarkdown } from './extensions/markdown.js';
|
|
26
|
+
import { CommonPubPartsList } from './extensions/partsList.js';
|
|
27
|
+
import { CommonPubBuildStep } from './extensions/buildStep.js';
|
|
28
|
+
import { CommonPubToolList } from './extensions/toolList.js';
|
|
29
|
+
import { CommonPubDownloads } from './extensions/downloads.js';
|
|
30
|
+
import { CommonPubQuiz } from './extensions/quiz.js';
|
|
31
|
+
import { CommonPubInteractiveSlider } from './extensions/interactiveSlider.js';
|
|
32
|
+
import { CommonPubCheckpoint } from './extensions/checkpoint.js';
|
|
33
|
+
import { CommonPubMathNotation } from './extensions/mathNotation.js';
|
|
34
|
+
import { blockTuplesToDoc, docToBlockTuples, buildEditorSchema } from './serialization.js';
|
|
35
|
+
export function createCommonPubEditor(options = {}) {
|
|
36
|
+
const { content, editable = true, placeholder = 'Start writing...', onUpdate, extensions = [], element, } = options;
|
|
37
|
+
// Build initial HTML content from BlockTuples if provided
|
|
38
|
+
let htmlContent;
|
|
39
|
+
if (content && content.length > 0) {
|
|
40
|
+
const schema = buildEditorSchema();
|
|
41
|
+
const doc = blockTuplesToDoc(content, schema);
|
|
42
|
+
const fragment = DOMSerializer.fromSchema(schema).serializeFragment(doc.content);
|
|
43
|
+
const wrapper = document.createElement('div');
|
|
44
|
+
wrapper.appendChild(fragment);
|
|
45
|
+
htmlContent = wrapper.innerHTML;
|
|
46
|
+
}
|
|
47
|
+
const coreExtensions = [
|
|
48
|
+
Document,
|
|
49
|
+
Text,
|
|
50
|
+
CommonPubText,
|
|
51
|
+
CommonPubHeading,
|
|
52
|
+
CommonPubCodeBlock,
|
|
53
|
+
CommonPubImage,
|
|
54
|
+
CommonPubQuote,
|
|
55
|
+
CommonPubCallout,
|
|
56
|
+
CommonPubGallery,
|
|
57
|
+
CommonPubVideo,
|
|
58
|
+
CommonPubEmbed,
|
|
59
|
+
CommonPubMarkdown,
|
|
60
|
+
CommonPubPartsList,
|
|
61
|
+
CommonPubBuildStep,
|
|
62
|
+
CommonPubToolList,
|
|
63
|
+
CommonPubDownloads,
|
|
64
|
+
CommonPubQuiz,
|
|
65
|
+
CommonPubInteractiveSlider,
|
|
66
|
+
CommonPubCheckpoint,
|
|
67
|
+
CommonPubMathNotation,
|
|
68
|
+
Bold,
|
|
69
|
+
Italic,
|
|
70
|
+
Code,
|
|
71
|
+
Strike,
|
|
72
|
+
BulletList,
|
|
73
|
+
OrderedList,
|
|
74
|
+
ListItem,
|
|
75
|
+
HorizontalRule,
|
|
76
|
+
Link.configure({ openOnClick: false }),
|
|
77
|
+
History,
|
|
78
|
+
Placeholder.configure({ placeholder }),
|
|
79
|
+
];
|
|
80
|
+
const editor = new Editor({
|
|
81
|
+
extensions: [...coreExtensions, ...extensions],
|
|
82
|
+
content: htmlContent ?? '<p></p>',
|
|
83
|
+
editable,
|
|
84
|
+
element: element ?? document.createElement('div'),
|
|
85
|
+
onUpdate: onUpdate
|
|
86
|
+
? ({ editor: e }) => {
|
|
87
|
+
const blocks = docToBlockTuples(e.state.doc);
|
|
88
|
+
onUpdate(blocks);
|
|
89
|
+
}
|
|
90
|
+
: undefined,
|
|
91
|
+
});
|
|
92
|
+
return editor;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=editorKit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editorKit.js","sourceRoot":"","sources":["../src/editorKit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAY3F,MAAM,UAAU,qBAAqB,CAAC,UAAwC,EAAE;IAC9E,MAAM,EACJ,OAAO,EACP,QAAQ,GAAG,IAAI,EACf,WAAW,GAAG,kBAAkB,EAChC,QAAQ,EACR,UAAU,GAAG,EAAE,EACf,OAAO,GACR,GAAG,OAAO,CAAC;IAEZ,0DAA0D;IAC1D,IAAI,WAA+B,CAAC;IACpC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9B,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC;IAClC,CAAC;IAED,MAAM,cAAc,GAAmB;QACrC,QAAQ;QACR,IAAI;QACJ,aAAa;QACb,gBAAgB;QAChB,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,gBAAgB;QAChB,gBAAgB;QAChB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,kBAAkB;QAClB,kBAAkB;QAClB,iBAAiB;QACjB,kBAAkB;QAClB,aAAa;QACb,0BAA0B;QAC1B,mBAAmB;QACnB,qBAAqB;QACrB,IAAI;QACJ,MAAM;QACN,IAAI;QACJ,MAAM;QACN,UAAU;QACV,WAAW;QACX,QAAQ;QACR,cAAc;QACd,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACtC,OAAO;QACP,WAAW,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;KACvC,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,UAAU,EAAE,CAAC,GAAG,cAAc,EAAE,GAAG,UAAU,CAAC;QAC9C,OAAO,EAAE,WAAW,IAAI,SAAS;QACjC,QAAQ;QACR,OAAO,EAAE,OAAO,IAAI,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QACjD,QAAQ,EAAE,QAAQ;YAChB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE;gBAChB,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7C,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;YACH,CAAC,CAAC,SAAS;KACd,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|