react-tailwind-email-editor 0.0.5 → 0.0.7

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # React Email Editor
2
2
 
3
- A professional, fully customizable drag-and-drop email template editor built with React, Craft.js, Tailwind CSS, and shadcn/ui.
3
+ A professional, fully customizable drag-and-drop email template editor built with React, Craft.js, Tailwind CSS.
4
4
 
5
5
  <p align="center">
6
6
  <img src="https://github.com/hemanth-user13/Email-Editor-Npm/blob/master/src/assets/emailEditor1.png" width="900"/>
@@ -23,11 +23,8 @@ A professional, fully customizable drag-and-drop email template editor built wit
23
23
 
24
24
  ## Installation
25
25
 
26
- ```bash
27
- # Copy the src/components/editor directory into your project
28
- cp -r src/components/editor your-project/src/components/editor
29
- cp src/lib/htmlExporter.ts your-project/src/lib/htmlExporter.ts
30
- ```
26
+ ````bash
27
+
31
28
 
32
29
  ### Peer Dependencies
33
30
 
@@ -35,7 +32,7 @@ Ensure your project has these installed:
35
32
 
36
33
  ```bash
37
34
  npm install @craftjs/core react react-dom lucide-react tailwindcss tailwind-merge clsx class-variance-authority
38
- ```
35
+ ````
39
36
 
40
37
  Also requires [shadcn/ui](https://ui.shadcn.com/) components: `button`, `scroll-area`, `tabs`, `accordion`, `dialog`, `dropdown-menu`, `popover`, `label`, `separator`.
41
38
 
@@ -59,7 +56,7 @@ export default {
59
56
  ### Basic
60
57
 
61
58
  ```tsx
62
- import { EmailEditor } from "@/components/editor";
59
+ import { EmailEditor } from "react-tailwind-email-editor";
63
60
 
64
61
  function App() {
65
62
  return <EmailEditor />;
@@ -69,7 +66,7 @@ function App() {
69
66
  ### With Custom Components
70
67
 
71
68
  ```tsx
72
- import { EmailEditor } from "@/components/editor";
69
+ import { EmailEditor } from "react-tailwind-email-editor";
73
70
  import { MyCustomBlock } from "./MyCustomBlock";
74
71
  import { Puzzle } from "lucide-react";
75
72
 
@@ -93,7 +90,7 @@ function App() {
93
90
  ### Full Customization
94
91
 
95
92
  ```tsx
96
- import { EmailEditor } from "@/components/editor";
93
+ import { EmailEditor } from "react-tailwind-email-editor";
97
94
 
98
95
  function App() {
99
96
  return (
package/dist/index.d.cts CHANGED
@@ -4,74 +4,45 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { SerializedNodes } from '@craftjs/core';
5
5
 
6
6
  interface EditorComponentConfig {
7
- /** The React component to render in the editor canvas */
8
7
  component: React.ComponentType<any>;
9
- /** Display name in the toolbox */
10
8
  label: string;
11
- /** Short description shown below the label */
12
9
  description?: string;
13
- /** Lucide icon or custom icon component */
14
10
  icon?: LucideIcon | React.ComponentType<{
15
11
  className?: string;
16
12
  }>;
17
- /** Category grouping in the toolbox */
18
13
  category?: string;
19
- /** Default element to create when dragged (JSX element). If not provided, creates <Component /> */
20
14
  createElement?: () => React.ReactElement;
21
15
  }
22
16
  type ComponentRegistry = Record<string, EditorComponentConfig>;
23
17
  interface EditorThemeColors {
24
- /** Primary accent color */
25
18
  primary?: string;
26
- /** Primary foreground (text on primary) */
27
19
  primaryForeground?: string;
28
- /** Background color of sidebars and panels */
29
20
  panelBackground?: string;
30
- /** Canvas/workspace background */
31
21
  canvasBackground?: string;
32
- /** Border color for panels and components */
33
22
  border?: string;
34
- /** Muted background for inactive elements */
35
23
  muted?: string;
36
- /** Text color for muted/secondary text */
37
24
  mutedForeground?: string;
38
- /** Destructive/delete action color */
39
25
  destructive?: string;
40
- /** Foreground/text color */
41
26
  foreground?: string;
42
- /** Background color */
43
27
  background?: string;
44
28
  }
45
29
  interface EditorTheme {
46
- /** Custom color overrides */
47
30
  colors?: EditorThemeColors;
48
- /** Border radius for UI elements */
49
31
  borderRadius?: number;
50
- /** Font family for editor UI */
51
32
  fontFamily?: string;
52
- /** Paper/canvas width in pixels */
53
33
  paperWidth?: number;
54
- /** Paper minimum height in pixels */
55
34
  paperMinHeight?: number;
56
- /** Paper default background */
57
35
  paperBackground?: string;
58
36
  }
59
37
  interface EditorSlots {
60
- /** Custom toolbar component (replaces the entire top bar) */
61
38
  toolbar?: React.ComponentType<ToolbarSlotProps>;
62
- /** Custom toolbox/sidebar component */
63
39
  toolbox?: React.ComponentType<ToolboxSlotProps>;
64
- /** Custom settings panel component */
65
40
  settingsPanel?: React.ComponentType<SettingsPanelSlotProps>;
66
- /** Custom empty state for settings panel when nothing is selected */
67
41
  settingsEmptyState?: React.ComponentType;
68
- /** Custom render node wrapper */
69
42
  renderNode?: React.ComponentType<{
70
43
  render: React.ReactNode;
71
44
  }>;
72
- /** Custom export dialog content */
73
45
  exportDialog?: React.ComponentType<ExportDialogSlotProps>;
74
- /** Custom preview dialog content */
75
46
  previewDialog?: React.ComponentType<PreviewDialogSlotProps>;
76
47
  }
77
48
  interface ToolbarSlotProps {
@@ -103,60 +74,38 @@ interface PreviewDialogSlotProps {
103
74
  onClose: () => void;
104
75
  }
105
76
  interface EmailTemplate {
106
- /** Unique template identifier */
107
77
  id: string;
108
- /** Display name */
109
78
  name: string;
110
- /** Template description */
111
79
  description?: string;
112
- /** Lucide icon */
113
80
  icon?: LucideIcon;
114
- /** Serialized Craft.js JSON state */
115
81
  data: string;
116
82
  }
117
83
  interface EditorCallbacks {
118
- /** Called when HTML is exported */
119
84
  onExport?: (html: string) => void;
120
- /** Called when the editor state changes */
121
85
  onChange?: (serializedState: string) => void;
122
- /** Called when a template is loaded */
123
86
  onTemplateLoad?: (templateId: string) => void;
124
- /** Called when canvas is cleared */
125
87
  onClear?: () => void;
88
+ /** Called when theme color changes via the built-in color picker */
89
+ onColorChange?: (primaryHsl: string) => void;
126
90
  }
127
91
  type HtmlRenderer = (typeName: string, props: Record<string, unknown>, childrenHtml: string, linkedNodes?: Record<string, string>) => string | null;
128
92
  interface EmailEditorProps {
129
- /** Additional components to register (merged with built-ins) */
130
93
  components?: ComponentRegistry;
131
- /** Replace ALL built-in components (use only your own) */
132
94
  replaceBuiltins?: boolean;
133
- /** Theme customization */
134
95
  theme?: EditorTheme;
135
- /** Slot overrides for UI sections */
136
96
  slots?: EditorSlots;
137
- /** Pre-defined templates */
138
97
  templates?: EmailTemplate[];
139
- /** Event callbacks */
140
98
  callbacks?: EditorCallbacks;
141
- /** Initial serialized state to load */
142
99
  initialState?: string;
143
- /** Default content to show (JSX children for the Frame) */
144
100
  defaultContent?: React.ReactNode;
145
- /** Editor title displayed in the toolbar */
146
101
  title?: string;
147
- /** Logo element for the toolbar */
148
102
  logo?: React.ReactNode;
149
- /** Custom HTML renderers for export (keyed by component resolved name) */
150
103
  htmlRenderers?: Record<string, HtmlRenderer>;
151
- /** Whether to show the toolbar */
152
104
  showToolbar?: boolean;
153
- /** Whether to show the left toolbox sidebar */
154
105
  showToolbox?: boolean;
155
- /** Whether to show the right settings panel */
156
- showSettingsPanel?: boolean;
157
- /** Custom class name for the editor root */
106
+ /** Enable dark mode (applies `dark` class to editor root). Default: true */
107
+ darkMode?: boolean;
158
108
  className?: string;
159
- /** Custom inline styles for the editor root */
160
109
  style?: React.CSSProperties;
161
110
  }
162
111
 
@@ -173,12 +122,12 @@ interface EditorContextValue {
173
122
  logo?: React.ReactNode;
174
123
  showToolbar: boolean;
175
124
  showToolbox: boolean;
176
- showSettingsPanel: boolean;
125
+ showSettingsPanel?: boolean;
177
126
  }
178
127
  declare const useEditorConfig: () => EditorContextValue;
179
128
  interface EditorProviderProps {
180
129
  children: React.ReactNode;
181
- value: Omit<EditorContextValue, 'theme'> & {
130
+ value: Omit<EditorContextValue, "theme"> & {
182
131
  theme: EditorTheme;
183
132
  };
184
133
  }
package/dist/index.d.ts CHANGED
@@ -4,74 +4,45 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { SerializedNodes } from '@craftjs/core';
5
5
 
6
6
  interface EditorComponentConfig {
7
- /** The React component to render in the editor canvas */
8
7
  component: React.ComponentType<any>;
9
- /** Display name in the toolbox */
10
8
  label: string;
11
- /** Short description shown below the label */
12
9
  description?: string;
13
- /** Lucide icon or custom icon component */
14
10
  icon?: LucideIcon | React.ComponentType<{
15
11
  className?: string;
16
12
  }>;
17
- /** Category grouping in the toolbox */
18
13
  category?: string;
19
- /** Default element to create when dragged (JSX element). If not provided, creates <Component /> */
20
14
  createElement?: () => React.ReactElement;
21
15
  }
22
16
  type ComponentRegistry = Record<string, EditorComponentConfig>;
23
17
  interface EditorThemeColors {
24
- /** Primary accent color */
25
18
  primary?: string;
26
- /** Primary foreground (text on primary) */
27
19
  primaryForeground?: string;
28
- /** Background color of sidebars and panels */
29
20
  panelBackground?: string;
30
- /** Canvas/workspace background */
31
21
  canvasBackground?: string;
32
- /** Border color for panels and components */
33
22
  border?: string;
34
- /** Muted background for inactive elements */
35
23
  muted?: string;
36
- /** Text color for muted/secondary text */
37
24
  mutedForeground?: string;
38
- /** Destructive/delete action color */
39
25
  destructive?: string;
40
- /** Foreground/text color */
41
26
  foreground?: string;
42
- /** Background color */
43
27
  background?: string;
44
28
  }
45
29
  interface EditorTheme {
46
- /** Custom color overrides */
47
30
  colors?: EditorThemeColors;
48
- /** Border radius for UI elements */
49
31
  borderRadius?: number;
50
- /** Font family for editor UI */
51
32
  fontFamily?: string;
52
- /** Paper/canvas width in pixels */
53
33
  paperWidth?: number;
54
- /** Paper minimum height in pixels */
55
34
  paperMinHeight?: number;
56
- /** Paper default background */
57
35
  paperBackground?: string;
58
36
  }
59
37
  interface EditorSlots {
60
- /** Custom toolbar component (replaces the entire top bar) */
61
38
  toolbar?: React.ComponentType<ToolbarSlotProps>;
62
- /** Custom toolbox/sidebar component */
63
39
  toolbox?: React.ComponentType<ToolboxSlotProps>;
64
- /** Custom settings panel component */
65
40
  settingsPanel?: React.ComponentType<SettingsPanelSlotProps>;
66
- /** Custom empty state for settings panel when nothing is selected */
67
41
  settingsEmptyState?: React.ComponentType;
68
- /** Custom render node wrapper */
69
42
  renderNode?: React.ComponentType<{
70
43
  render: React.ReactNode;
71
44
  }>;
72
- /** Custom export dialog content */
73
45
  exportDialog?: React.ComponentType<ExportDialogSlotProps>;
74
- /** Custom preview dialog content */
75
46
  previewDialog?: React.ComponentType<PreviewDialogSlotProps>;
76
47
  }
77
48
  interface ToolbarSlotProps {
@@ -103,60 +74,38 @@ interface PreviewDialogSlotProps {
103
74
  onClose: () => void;
104
75
  }
105
76
  interface EmailTemplate {
106
- /** Unique template identifier */
107
77
  id: string;
108
- /** Display name */
109
78
  name: string;
110
- /** Template description */
111
79
  description?: string;
112
- /** Lucide icon */
113
80
  icon?: LucideIcon;
114
- /** Serialized Craft.js JSON state */
115
81
  data: string;
116
82
  }
117
83
  interface EditorCallbacks {
118
- /** Called when HTML is exported */
119
84
  onExport?: (html: string) => void;
120
- /** Called when the editor state changes */
121
85
  onChange?: (serializedState: string) => void;
122
- /** Called when a template is loaded */
123
86
  onTemplateLoad?: (templateId: string) => void;
124
- /** Called when canvas is cleared */
125
87
  onClear?: () => void;
88
+ /** Called when theme color changes via the built-in color picker */
89
+ onColorChange?: (primaryHsl: string) => void;
126
90
  }
127
91
  type HtmlRenderer = (typeName: string, props: Record<string, unknown>, childrenHtml: string, linkedNodes?: Record<string, string>) => string | null;
128
92
  interface EmailEditorProps {
129
- /** Additional components to register (merged with built-ins) */
130
93
  components?: ComponentRegistry;
131
- /** Replace ALL built-in components (use only your own) */
132
94
  replaceBuiltins?: boolean;
133
- /** Theme customization */
134
95
  theme?: EditorTheme;
135
- /** Slot overrides for UI sections */
136
96
  slots?: EditorSlots;
137
- /** Pre-defined templates */
138
97
  templates?: EmailTemplate[];
139
- /** Event callbacks */
140
98
  callbacks?: EditorCallbacks;
141
- /** Initial serialized state to load */
142
99
  initialState?: string;
143
- /** Default content to show (JSX children for the Frame) */
144
100
  defaultContent?: React.ReactNode;
145
- /** Editor title displayed in the toolbar */
146
101
  title?: string;
147
- /** Logo element for the toolbar */
148
102
  logo?: React.ReactNode;
149
- /** Custom HTML renderers for export (keyed by component resolved name) */
150
103
  htmlRenderers?: Record<string, HtmlRenderer>;
151
- /** Whether to show the toolbar */
152
104
  showToolbar?: boolean;
153
- /** Whether to show the left toolbox sidebar */
154
105
  showToolbox?: boolean;
155
- /** Whether to show the right settings panel */
156
- showSettingsPanel?: boolean;
157
- /** Custom class name for the editor root */
106
+ /** Enable dark mode (applies `dark` class to editor root). Default: true */
107
+ darkMode?: boolean;
158
108
  className?: string;
159
- /** Custom inline styles for the editor root */
160
109
  style?: React.CSSProperties;
161
110
  }
162
111
 
@@ -173,12 +122,12 @@ interface EditorContextValue {
173
122
  logo?: React.ReactNode;
174
123
  showToolbar: boolean;
175
124
  showToolbox: boolean;
176
- showSettingsPanel: boolean;
125
+ showSettingsPanel?: boolean;
177
126
  }
178
127
  declare const useEditorConfig: () => EditorContextValue;
179
128
  interface EditorProviderProps {
180
129
  children: React.ReactNode;
181
- value: Omit<EditorContextValue, 'theme'> & {
130
+ value: Omit<EditorContextValue, "theme"> & {
182
131
  theme: EditorTheme;
183
132
  };
184
133
  }