@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.
Files changed (99) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +145 -0
  3. package/dist/blocks/registry.d.ts +17 -0
  4. package/dist/blocks/registry.d.ts.map +1 -0
  5. package/dist/blocks/registry.js +65 -0
  6. package/dist/blocks/registry.js.map +1 -0
  7. package/dist/blocks/schemas.d.ts +137 -0
  8. package/dist/blocks/schemas.d.ts.map +1 -0
  9. package/dist/blocks/schemas.js +113 -0
  10. package/dist/blocks/schemas.js.map +1 -0
  11. package/dist/blocks/types.d.ts +16 -0
  12. package/dist/blocks/types.d.ts.map +1 -0
  13. package/dist/blocks/types.js +2 -0
  14. package/dist/blocks/types.js.map +1 -0
  15. package/dist/editorKit.d.ts +12 -0
  16. package/dist/editorKit.d.ts.map +1 -0
  17. package/dist/editorKit.js +94 -0
  18. package/dist/editorKit.js.map +1 -0
  19. package/dist/extensions/buildStep.d.ts +16 -0
  20. package/dist/extensions/buildStep.d.ts.map +1 -0
  21. package/dist/extensions/buildStep.js +45 -0
  22. package/dist/extensions/buildStep.js.map +1 -0
  23. package/dist/extensions/callout.d.ts +19 -0
  24. package/dist/extensions/callout.d.ts.map +1 -0
  25. package/dist/extensions/callout.js +52 -0
  26. package/dist/extensions/callout.js.map +1 -0
  27. package/dist/extensions/checkpoint.d.ts +12 -0
  28. package/dist/extensions/checkpoint.d.ts.map +1 -0
  29. package/dist/extensions/checkpoint.js +27 -0
  30. package/dist/extensions/checkpoint.js.map +1 -0
  31. package/dist/extensions/code.d.ts +18 -0
  32. package/dist/extensions/code.d.ts.map +1 -0
  33. package/dist/extensions/code.js +75 -0
  34. package/dist/extensions/code.js.map +1 -0
  35. package/dist/extensions/downloads.d.ts +17 -0
  36. package/dist/extensions/downloads.d.ts.map +1 -0
  37. package/dist/extensions/downloads.js +38 -0
  38. package/dist/extensions/downloads.js.map +1 -0
  39. package/dist/extensions/embed.d.ts +14 -0
  40. package/dist/extensions/embed.d.ts.map +1 -0
  41. package/dist/extensions/embed.js +27 -0
  42. package/dist/extensions/embed.js.map +1 -0
  43. package/dist/extensions/gallery.d.ts +19 -0
  44. package/dist/extensions/gallery.d.ts.map +1 -0
  45. package/dist/extensions/gallery.js +43 -0
  46. package/dist/extensions/gallery.js.map +1 -0
  47. package/dist/extensions/heading.d.ts +18 -0
  48. package/dist/extensions/heading.d.ts.map +1 -0
  49. package/dist/extensions/heading.js +57 -0
  50. package/dist/extensions/heading.js.map +1 -0
  51. package/dist/extensions/image.d.ts +17 -0
  52. package/dist/extensions/image.d.ts.map +1 -0
  53. package/dist/extensions/image.js +49 -0
  54. package/dist/extensions/image.js.map +1 -0
  55. package/dist/extensions/interactiveSlider.d.ts +21 -0
  56. package/dist/extensions/interactiveSlider.d.ts.map +1 -0
  57. package/dist/extensions/interactiveSlider.js +45 -0
  58. package/dist/extensions/interactiveSlider.js.map +1 -0
  59. package/dist/extensions/markdown.d.ts +12 -0
  60. package/dist/extensions/markdown.d.ts.map +1 -0
  61. package/dist/extensions/markdown.js +25 -0
  62. package/dist/extensions/markdown.js.map +1 -0
  63. package/dist/extensions/mathNotation.d.ts +13 -0
  64. package/dist/extensions/mathNotation.d.ts.map +1 -0
  65. package/dist/extensions/mathNotation.js +28 -0
  66. package/dist/extensions/mathNotation.js.map +1 -0
  67. package/dist/extensions/partsList.d.ts +19 -0
  68. package/dist/extensions/partsList.d.ts.map +1 -0
  69. package/dist/extensions/partsList.js +38 -0
  70. package/dist/extensions/partsList.js.map +1 -0
  71. package/dist/extensions/quiz.d.ts +17 -0
  72. package/dist/extensions/quiz.d.ts.map +1 -0
  73. package/dist/extensions/quiz.js +42 -0
  74. package/dist/extensions/quiz.js.map +1 -0
  75. package/dist/extensions/quote.d.ts +11 -0
  76. package/dist/extensions/quote.d.ts.map +1 -0
  77. package/dist/extensions/quote.js +42 -0
  78. package/dist/extensions/quote.js.map +1 -0
  79. package/dist/extensions/text.d.ts +3 -0
  80. package/dist/extensions/text.d.ts.map +1 -0
  81. package/dist/extensions/text.js +13 -0
  82. package/dist/extensions/text.js.map +1 -0
  83. package/dist/extensions/toolList.d.ts +16 -0
  84. package/dist/extensions/toolList.d.ts.map +1 -0
  85. package/dist/extensions/toolList.js +38 -0
  86. package/dist/extensions/toolList.js.map +1 -0
  87. package/dist/extensions/video.d.ts +17 -0
  88. package/dist/extensions/video.d.ts.map +1 -0
  89. package/dist/extensions/video.js +32 -0
  90. package/dist/extensions/video.js.map +1 -0
  91. package/dist/index.d.ts +26 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +27 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/serialization.d.ts +16 -0
  96. package/dist/serialization.d.ts.map +1 -0
  97. package/dist/serialization.js +530 -0
  98. package/dist/serialization.js.map +1 -0
  99. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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"}