@pexelize/react-editor 1.0.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/README.md ADDED
@@ -0,0 +1,206 @@
1
+ # @pexelize/react-editor
2
+
3
+ React wrapper component for the **Pexelize Email Editor**. The SDK is automatically loaded from jsDelivr CDN - no npm SDK dependency required.
4
+
5
+ ## 🚀 Installation
6
+
7
+ ```bash
8
+ npm install @pexelize/react-editor
9
+ ```
10
+
11
+ ## 📖 Usage
12
+
13
+ ```tsx
14
+ import { PexelizeEditor, PexelizeEditorRef } from '@pexelize/react-editor';
15
+ import { useRef } from 'react';
16
+
17
+ function EmailBuilder() {
18
+ const editorRef = useRef<PexelizeEditorRef>(null);
19
+
20
+ const handleSave = () => {
21
+ editorRef.current?.saveDesign((design) => {
22
+ console.log('Saved:', design);
23
+ });
24
+ };
25
+
26
+ const handleExport = () => {
27
+ editorRef.current?.exportHtml((data) => {
28
+ console.log('HTML:', data.html);
29
+ });
30
+ };
31
+
32
+ return (
33
+ <div>
34
+ <div style={{ marginBottom: '10px' }}>
35
+ <button onClick={handleSave}>Save</button>
36
+ <button onClick={handleExport}>Export HTML</button>
37
+ </div>
38
+
39
+ <PexelizeEditor
40
+ ref={editorRef}
41
+ editorMode="email"
42
+ height="600px"
43
+ onReady={() => console.log('Editor ready!')}
44
+ onChange={({ design }) => console.log('Changed:', design)}
45
+ />
46
+ </div>
47
+ );
48
+ }
49
+ ```
50
+
51
+ ## 🔧 Props
52
+
53
+ | Prop | Type | Default | Description |
54
+ |------|------|---------|-------------|
55
+ | `editorMode` | `'email' \| 'web' \| 'popup'` | `'email'` | Editor mode |
56
+ | `height` | `string \| number` | `'600px'` | Editor height |
57
+ | `design` | `DesignJson` | - | Initial design to load |
58
+ | `mergeTags` | `MergeTag[]` | - | Merge tags for personalization |
59
+ | `appearance` | `AppearanceConfig` | - | Visual customization |
60
+ | `onReady` | `() => void` | - | Called when editor is ready |
61
+ | `onChange` | `(data) => void` | - | Called when design changes |
62
+ | `onLoad` | `(data) => void` | - | Called when design is loaded |
63
+ | `onImage` | `ImageUploadCallback` | - | Image upload handler |
64
+ | `onSave` | `SaveCallback` | - | Save handler |
65
+
66
+ ## 📚 Ref Methods
67
+
68
+ Access editor methods via ref:
69
+
70
+ ```tsx
71
+ const editorRef = useRef<PexelizeEditorRef>(null);
72
+
73
+ // Load a design
74
+ editorRef.current?.loadDesign(myDesign);
75
+
76
+ // Load blank
77
+ editorRef.current?.loadBlank();
78
+
79
+ // Get design
80
+ const design = await editorRef.current?.getDesign();
81
+
82
+ // Save design (callback)
83
+ editorRef.current?.saveDesign((design) => console.log(design));
84
+
85
+ // Export HTML
86
+ editorRef.current?.exportHtml((data) => console.log(data.html));
87
+
88
+ // Export HTML (async)
89
+ const { html, design } = await editorRef.current?.exportHtmlAsync();
90
+
91
+ // Undo/Redo
92
+ editorRef.current?.undo();
93
+ editorRef.current?.redo();
94
+
95
+ // Check if ready
96
+ const ready = editorRef.current?.isReady();
97
+ ```
98
+
99
+ ## 🪝 Hook: usePexelizeSDK
100
+
101
+ For more control, use the hook directly:
102
+
103
+ ```tsx
104
+ import { usePexelizeSDK } from '@pexelize/react-editor';
105
+
106
+ function MyComponent() {
107
+ const { sdk, isReady, isLoading, error } = usePexelizeSDK({
108
+ containerId: 'my-editor',
109
+ editorMode: 'email',
110
+ });
111
+
112
+ if (isLoading) return <div>Loading...</div>;
113
+ if (error) return <div>Error: {error}</div>;
114
+
115
+ return (
116
+ <div>
117
+ <div id="my-editor" style={{ height: '600px' }} />
118
+ <button
119
+ disabled={!isReady}
120
+ onClick={() => sdk?.exportHtml((d) => console.log(d.html))}
121
+ >
122
+ Export
123
+ </button>
124
+ </div>
125
+ );
126
+ }
127
+ ```
128
+
129
+ ## 🌐 CDN Architecture
130
+
131
+ This package automatically loads the Pexelize SDK from jsDelivr CDN:
132
+
133
+ ```
134
+ https://cdn.jsdelivr.net/gh/Zaman-Meer/pexelize-sdk@dev/dist/pexelize-sdk.min.js
135
+ ```
136
+
137
+ **Benefits:**
138
+ - ✅ Smaller bundle size (SDK loaded separately)
139
+ - ✅ SDK cached by browser across sites
140
+ - ✅ Always get latest SDK updates
141
+ - ✅ No npm dependency conflicts
142
+
143
+ ## 📦 Publishing to npm
144
+
145
+ ### 1. Setup npm account
146
+
147
+ ```bash
148
+ # Login to npm (create account at npmjs.com if needed)
149
+ npm login
150
+ ```
151
+
152
+ ### 2. Build the package
153
+
154
+ ```bash
155
+ cd pexelize-react
156
+ npm install
157
+ npm run build
158
+ ```
159
+
160
+ ### 3. Publish
161
+
162
+ ```bash
163
+ # For scoped package (@pexelize/react-editor)
164
+ npm publish --access public
165
+
166
+ # For unscoped package
167
+ npm publish
168
+ ```
169
+
170
+ ### 4. Update version for future releases
171
+
172
+ ```bash
173
+ # Patch version (1.0.0 -> 1.0.1)
174
+ npm version patch
175
+
176
+ # Minor version (1.0.0 -> 1.1.0)
177
+ npm version minor
178
+
179
+ # Major version (1.0.0 -> 2.0.0)
180
+ npm version major
181
+
182
+ # Then publish
183
+ npm publish --access public
184
+ ```
185
+
186
+ ## ❓ FAQ
187
+
188
+ ### Is the CDN publicly available?
189
+
190
+ **Yes!** The SDK is hosted on jsDelivr which serves files directly from our public GitHub repository. Anyone can access it:
191
+
192
+ ```html
193
+ <script src="https://cdn.jsdelivr.net/gh/Zaman-Meer/pexelize-sdk@dev/dist/pexelize-sdk.min.js"></script>
194
+ ```
195
+
196
+ ### Can I use a different SDK version?
197
+
198
+ Yes, change the CDN URL by forking and modifying `SDK_CDN_URL` in the source, or use the hook to initialize manually.
199
+
200
+ ### Does this work with SSR (Next.js)?
201
+
202
+ Yes! The SDK is loaded client-side only using `useEffect`. The component shows a loading state until the SDK is ready.
203
+
204
+ ## 📄 License
205
+
206
+ MIT
@@ -0,0 +1,264 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * Pexelize Editor React Component
5
+ *
6
+ * A React wrapper for the Pexelize Editor SDK.
7
+ * SDK is loaded from jsDelivr CDN automatically.
8
+ */
9
+
10
+ interface DesignJson {
11
+ body: {
12
+ rows: any[];
13
+ values: Record<string, any>;
14
+ };
15
+ schemaVersion?: number;
16
+ }
17
+ interface ExportHtmlData {
18
+ html: string;
19
+ design: DesignJson;
20
+ chunks?: {
21
+ css: string;
22
+ js: string;
23
+ body: string;
24
+ };
25
+ }
26
+ interface MergeTag {
27
+ name: string;
28
+ value: string;
29
+ sample?: string;
30
+ }
31
+ interface DisplayCondition {
32
+ id: string;
33
+ label: string;
34
+ description?: string;
35
+ condition: Record<string, any>;
36
+ }
37
+ interface AppearanceConfig {
38
+ theme?: 'light' | 'dark' | 'pexelize-light' | 'pexelize-dark';
39
+ panels?: {
40
+ tools?: {
41
+ dock?: 'left' | 'right';
42
+ collapsible?: boolean;
43
+ };
44
+ properties?: {
45
+ dock?: 'left' | 'right';
46
+ collapsible?: boolean;
47
+ };
48
+ };
49
+ features?: Record<string, boolean>;
50
+ }
51
+ interface ToolsConfig {
52
+ enabled?: string[];
53
+ disabled?: string[];
54
+ }
55
+ interface FeaturesConfig {
56
+ preview?: boolean;
57
+ undoRedo?: boolean;
58
+ imageEditor?: boolean;
59
+ userUploads?: boolean;
60
+ stockImages?: boolean;
61
+ }
62
+ interface UserInfo {
63
+ id?: string;
64
+ name?: string;
65
+ email?: string;
66
+ }
67
+ interface SecurityConfig {
68
+ allowedOrigins?: string[];
69
+ }
70
+ interface EditorState {
71
+ isReady: boolean;
72
+ isDirty: boolean;
73
+ canUndo: boolean;
74
+ canRedo: boolean;
75
+ }
76
+ type DisplayMode = 'email' | 'web' | 'popup' | 'document';
77
+ type ThemeMode = 'light' | 'dark' | 'pexelize-light' | 'pexelize-dark';
78
+ type ImageUploadCallback = (file: File, done: (result: {
79
+ progress: number;
80
+ url?: string;
81
+ }) => void) => void;
82
+ type LinkClickCallback = (data: {
83
+ link: string;
84
+ type: string;
85
+ }, done: (result: {
86
+ link: string;
87
+ }) => void) => void;
88
+ type SaveCallback = (design: DesignJson, done: (result: {
89
+ success: boolean;
90
+ }) => void) => void;
91
+ /**
92
+ * Props for the PexelizeEditor component
93
+ */
94
+ interface PexelizeEditorProps {
95
+ /** Editor display mode */
96
+ displayMode?: DisplayMode;
97
+ /** Also accepts editorMode for compatibility */
98
+ editorMode?: DisplayMode;
99
+ /** Project identifier */
100
+ projectId?: number | string;
101
+ /** UI language */
102
+ locale?: string;
103
+ /** Visual customization */
104
+ appearance?: AppearanceConfig;
105
+ /** Enable/disable tools */
106
+ tools?: ToolsConfig;
107
+ /** Feature toggles */
108
+ features?: FeaturesConfig;
109
+ /** User information */
110
+ user?: UserInfo;
111
+ /** Security settings */
112
+ security?: SecurityConfig;
113
+ /** Editor source URL (overrides CDN default) */
114
+ editorUrl?: string;
115
+ /** SDK CDN URL (overrides default) */
116
+ sdkUrl?: string;
117
+ /** Minimum height for the editor */
118
+ minHeight?: string | number;
119
+ /** Initial design to load */
120
+ design?: DesignJson;
121
+ /** Merge tags for personalization */
122
+ mergeTags?: MergeTag[];
123
+ /** Display conditions for dynamic content */
124
+ displayConditions?: DisplayCondition[];
125
+ /** Custom CSS class name */
126
+ className?: string;
127
+ /** Inline styles */
128
+ style?: React.CSSProperties;
129
+ /** Height of the editor */
130
+ height?: string | number;
131
+ /** Called when the editor is ready */
132
+ onReady?: () => void;
133
+ /** Called when the design is loaded */
134
+ onLoad?: (data: {
135
+ design: DesignJson;
136
+ }) => void;
137
+ /** Called when the design changes */
138
+ onChange?: (data: {
139
+ design: DesignJson;
140
+ changes?: unknown;
141
+ }) => void;
142
+ /** Called when content is modified */
143
+ onContentModified?: (data: {
144
+ type: string;
145
+ value: unknown;
146
+ element: unknown;
147
+ }) => void;
148
+ /** Called when an element is selected */
149
+ onSelect?: (data: {
150
+ element: unknown;
151
+ type: string;
152
+ }) => void;
153
+ /** Called when an element is deselected */
154
+ onDeselect?: () => void;
155
+ /** Image upload handler */
156
+ onImage?: ImageUploadCallback;
157
+ /** Link click handler */
158
+ onLinkClick?: LinkClickCallback;
159
+ /** Save handler */
160
+ onSave?: SaveCallback;
161
+ }
162
+ /**
163
+ * Ref handle for the PexelizeEditor component
164
+ */
165
+ interface PexelizeEditorRef {
166
+ /** Load a design */
167
+ loadDesign: (design: DesignJson) => void;
168
+ /** Load a blank design */
169
+ loadBlank: () => void;
170
+ /** Save/get the current design */
171
+ saveDesign: (callback: (design: DesignJson) => void) => void;
172
+ /** Get the current design (Promise-based) */
173
+ getDesign: () => Promise<DesignJson>;
174
+ /** Export as HTML */
175
+ exportHtml: (callback: (data: ExportHtmlData) => void) => void;
176
+ /** Export as HTML (Promise-based) */
177
+ exportHtmlAsync: () => Promise<ExportHtmlData>;
178
+ /** Trigger save */
179
+ save: () => void;
180
+ /** Perform undo */
181
+ undo: () => void;
182
+ /** Perform redo */
183
+ redo: () => void;
184
+ /** Get editor state */
185
+ getState: () => Promise<EditorState>;
186
+ /** Check if editor is ready */
187
+ isReady: () => boolean;
188
+ /** Access the raw SDK instance */
189
+ getSdk: () => any;
190
+ }
191
+ /**
192
+ * PexelizeEditor React Component
193
+ *
194
+ * @example
195
+ * ```tsx
196
+ * import { PexelizeEditor, PexelizeEditorRef } from '@pexelize/react-editor';
197
+ *
198
+ * function MyEditor() {
199
+ * const editorRef = useRef<PexelizeEditorRef>(null);
200
+ *
201
+ * const handleSave = () => {
202
+ * editorRef.current?.saveDesign((design) => {
203
+ * console.log('Design:', design);
204
+ * });
205
+ * };
206
+ *
207
+ * return (
208
+ * <div>
209
+ * <button onClick={handleSave}>Save</button>
210
+ * <PexelizeEditor
211
+ * ref={editorRef}
212
+ * editorMode="email"
213
+ * onReady={() => console.log('Ready!')}
214
+ * onChange={({ design }) => console.log('Changed:', design)}
215
+ * />
216
+ * </div>
217
+ * );
218
+ * }
219
+ * ```
220
+ */
221
+ declare const PexelizeEditor: React.ForwardRefExoticComponent<PexelizeEditorProps & React.RefAttributes<PexelizeEditorRef>>;
222
+ interface UsePexelizeSDKConfig {
223
+ containerId: string;
224
+ editorMode?: DisplayMode;
225
+ displayMode?: DisplayMode;
226
+ [key: string]: any;
227
+ }
228
+ /**
229
+ * Hook to use the Pexelize SDK directly
230
+ *
231
+ * @example
232
+ * ```tsx
233
+ * function MyComponent() {
234
+ * const { sdk, isReady, error } = usePexelizeSDK({
235
+ * containerId: 'my-editor',
236
+ * editorMode: 'email',
237
+ * });
238
+ *
239
+ * const handleExport = () => {
240
+ * if (isReady && sdk) {
241
+ * sdk.exportHtml((data) => console.log(data.html));
242
+ * }
243
+ * };
244
+ *
245
+ * return (
246
+ * <div>
247
+ * <div id="my-editor" style={{ height: '600px' }} />
248
+ * <button onClick={handleExport} disabled={!isReady}>Export</button>
249
+ * </div>
250
+ * );
251
+ * }
252
+ * ```
253
+ */
254
+ declare function usePexelizeSDK(config: UsePexelizeSDKConfig): {
255
+ sdk: any;
256
+ isReady: boolean;
257
+ isLoading: boolean;
258
+ error: string | null;
259
+ };
260
+
261
+ declare const PEXELIZE_SDK_CDN = "https://cdn.jsdelivr.net/gh/Zaman-Meer/pexelize-sdk@dev/dist/pexelize-sdk.min.js";
262
+
263
+ export { PEXELIZE_SDK_CDN, PexelizeEditor, PexelizeEditor as default, usePexelizeSDK };
264
+ export type { AppearanceConfig, DesignJson, DisplayCondition, DisplayMode, EditorState, ExportHtmlData, FeaturesConfig, ImageUploadCallback, LinkClickCallback, MergeTag, PexelizeEditorProps, PexelizeEditorRef, SaveCallback, SecurityConfig, ThemeMode, ToolsConfig, UsePexelizeSDKConfig, UserInfo };
@@ -0,0 +1,311 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { forwardRef, useRef, useState, useEffect, useImperativeHandle } from 'react';
3
+
4
+ // ============================================================================
5
+ // SDK CDN Configuration
6
+ // ============================================================================
7
+ const SDK_CDN_URL = 'https://cdn.jsdelivr.net/gh/Zaman-Meer/pexelize-sdk@dev/dist/pexelize-sdk.min.js';
8
+ // Global SDK reference (loaded from CDN)
9
+ let sdkLoadPromise = null;
10
+ /**
11
+ * Load SDK from CDN (singleton pattern - loads only once)
12
+ */
13
+ function loadSDKFromCDN() {
14
+ if (sdkLoadPromise) {
15
+ return sdkLoadPromise;
16
+ }
17
+ // Check if already loaded
18
+ if (window.pexelize) {
19
+ return Promise.resolve();
20
+ }
21
+ sdkLoadPromise = new Promise((resolve, reject) => {
22
+ const script = document.createElement('script');
23
+ script.src = SDK_CDN_URL;
24
+ script.async = true;
25
+ script.onload = () => {
26
+ if (window.pexelize) {
27
+ console.log('[Pexelize React] SDK loaded from CDN');
28
+ resolve();
29
+ }
30
+ else {
31
+ reject(new Error('SDK loaded but pexelize global not found'));
32
+ }
33
+ };
34
+ script.onerror = () => {
35
+ sdkLoadPromise = null;
36
+ reject(new Error(`Failed to load Pexelize SDK from ${SDK_CDN_URL}`));
37
+ };
38
+ document.head.appendChild(script);
39
+ });
40
+ return sdkLoadPromise;
41
+ }
42
+ /**
43
+ * Get SDK instance from global
44
+ */
45
+ function getSDK() {
46
+ return window.pexelize;
47
+ }
48
+ // ============================================================================
49
+ // Component
50
+ // ============================================================================
51
+ /**
52
+ * PexelizeEditor React Component
53
+ *
54
+ * @example
55
+ * ```tsx
56
+ * import { PexelizeEditor, PexelizeEditorRef } from '@pexelize/react-editor';
57
+ *
58
+ * function MyEditor() {
59
+ * const editorRef = useRef<PexelizeEditorRef>(null);
60
+ *
61
+ * const handleSave = () => {
62
+ * editorRef.current?.saveDesign((design) => {
63
+ * console.log('Design:', design);
64
+ * });
65
+ * };
66
+ *
67
+ * return (
68
+ * <div>
69
+ * <button onClick={handleSave}>Save</button>
70
+ * <PexelizeEditor
71
+ * ref={editorRef}
72
+ * editorMode="email"
73
+ * onReady={() => console.log('Ready!')}
74
+ * onChange={({ design }) => console.log('Changed:', design)}
75
+ * />
76
+ * </div>
77
+ * );
78
+ * }
79
+ * ```
80
+ */
81
+ const PexelizeEditor = forwardRef((props, ref) => {
82
+ const { design, mergeTags, displayConditions, className, style, height = '600px', displayMode, editorMode, onReady, onLoad, onChange, onContentModified, onSelect, onDeselect, onImage, onLinkClick, onSave, ...config } = props;
83
+ const containerRef = useRef(null);
84
+ const sdkRef = useRef(null);
85
+ const containerId = useRef(`pexelize-editor-${Math.random().toString(36).substr(2, 9)}`);
86
+ const [isEditorReady, setIsEditorReady] = useState(false);
87
+ const [sdkLoaded, setSdkLoaded] = useState(false);
88
+ const [error, setError] = useState(null);
89
+ // Load SDK from CDN
90
+ useEffect(() => {
91
+ loadSDKFromCDN()
92
+ .then(() => setSdkLoaded(true))
93
+ .catch((err) => setError(err.message));
94
+ }, []);
95
+ // Initialize SDK once loaded
96
+ useEffect(() => {
97
+ if (!sdkLoaded || !containerRef.current)
98
+ return;
99
+ const pexelize = getSDK();
100
+ if (!pexelize) {
101
+ setError('Pexelize SDK not found after loading');
102
+ return;
103
+ }
104
+ // Store SDK reference
105
+ sdkRef.current = pexelize;
106
+ // Initialize
107
+ pexelize.init({
108
+ id: containerId.current,
109
+ editorMode: editorMode || displayMode || 'email',
110
+ ...config,
111
+ });
112
+ // Clean up on unmount
113
+ return () => {
114
+ pexelize.destroy();
115
+ sdkRef.current = null;
116
+ setIsEditorReady(false);
117
+ };
118
+ }, [sdkLoaded]);
119
+ // Handle ready event
120
+ useEffect(() => {
121
+ const sdk = sdkRef.current;
122
+ if (!sdk)
123
+ return;
124
+ const handleReady = () => {
125
+ setIsEditorReady(true);
126
+ // Set merge tags if provided
127
+ if (mergeTags) {
128
+ sdk.setMergeTags(mergeTags);
129
+ }
130
+ // Set display conditions if provided
131
+ if (displayConditions) {
132
+ sdk.setDisplayConditions(displayConditions);
133
+ }
134
+ // Load initial design if provided
135
+ if (design) {
136
+ sdk.loadDesign(design);
137
+ }
138
+ // Call onReady callback
139
+ onReady?.();
140
+ };
141
+ const unsubscribe = sdk.addEventListener('editor:ready', handleReady);
142
+ return unsubscribe;
143
+ }, [sdkLoaded, design, mergeTags, displayConditions, onReady]);
144
+ // Handle design loaded event
145
+ useEffect(() => {
146
+ const sdk = sdkRef.current;
147
+ if (!sdk || !onLoad)
148
+ return;
149
+ const unsubscribe = sdk.addEventListener('design:loaded', onLoad);
150
+ return unsubscribe;
151
+ }, [sdkLoaded, onLoad]);
152
+ // Handle design updated event
153
+ useEffect(() => {
154
+ const sdk = sdkRef.current;
155
+ if (!sdk || !onChange)
156
+ return;
157
+ const unsubscribe = sdk.addEventListener('design:updated', onChange);
158
+ return unsubscribe;
159
+ }, [sdkLoaded, onChange]);
160
+ // Handle content modified event
161
+ useEffect(() => {
162
+ const sdk = sdkRef.current;
163
+ if (!sdk || !onContentModified)
164
+ return;
165
+ const unsubscribe = sdk.addEventListener('content:modified', onContentModified);
166
+ return unsubscribe;
167
+ }, [sdkLoaded, onContentModified]);
168
+ // Handle element selected event
169
+ useEffect(() => {
170
+ const sdk = sdkRef.current;
171
+ if (!sdk || !onSelect)
172
+ return;
173
+ const unsubscribe = sdk.addEventListener('element:selected', onSelect);
174
+ return unsubscribe;
175
+ }, [sdkLoaded, onSelect]);
176
+ // Handle element deselected event
177
+ useEffect(() => {
178
+ const sdk = sdkRef.current;
179
+ if (!sdk || !onDeselect)
180
+ return;
181
+ const unsubscribe = sdk.addEventListener('element:deselected', onDeselect);
182
+ return unsubscribe;
183
+ }, [sdkLoaded, onDeselect]);
184
+ // Register callbacks
185
+ useEffect(() => {
186
+ const sdk = sdkRef.current;
187
+ if (!sdk)
188
+ return;
189
+ if (onImage) {
190
+ sdk.registerCallback('image', onImage);
191
+ }
192
+ if (onLinkClick) {
193
+ sdk.registerCallback('linkClick', onLinkClick);
194
+ }
195
+ if (onSave) {
196
+ sdk.registerCallback('save', onSave);
197
+ }
198
+ return () => {
199
+ if (sdk.unregisterCallback) {
200
+ sdk.unregisterCallback('image');
201
+ sdk.unregisterCallback('linkClick');
202
+ sdk.unregisterCallback('save');
203
+ }
204
+ };
205
+ }, [sdkLoaded, onImage, onLinkClick, onSave]);
206
+ // Expose SDK methods via ref
207
+ useImperativeHandle(ref, () => ({
208
+ loadDesign: (design) => sdkRef.current?.loadDesign(design),
209
+ loadBlank: () => sdkRef.current?.loadBlank(),
210
+ saveDesign: (callback) => sdkRef.current?.saveDesign(callback),
211
+ getDesign: () => sdkRef.current?.getDesign(),
212
+ exportHtml: (callback) => sdkRef.current?.exportHtml(callback),
213
+ exportHtmlAsync: () => sdkRef.current?.exportHtmlAsync(),
214
+ save: () => sdkRef.current?.save(),
215
+ undo: () => sdkRef.current?.undo(),
216
+ redo: () => sdkRef.current?.redo(),
217
+ getState: () => sdkRef.current?.getState(),
218
+ isReady: () => isEditorReady,
219
+ getSdk: () => sdkRef.current,
220
+ }), [isEditorReady, sdkLoaded]);
221
+ // Compute styles
222
+ const containerStyle = {
223
+ width: '100%',
224
+ height: typeof height === 'number' ? `${height}px` : height,
225
+ ...style,
226
+ };
227
+ // Show error state
228
+ if (error) {
229
+ return (jsx("div", { style: { ...containerStyle, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#fee', color: '#c00' }, children: jsxs("div", { style: { textAlign: 'center' }, children: [jsx("div", { style: { fontSize: '24px', marginBottom: '8px' }, children: "\u26A0\uFE0F" }), jsx("div", { children: "Failed to load Pexelize Editor" }), jsx("div", { style: { fontSize: '12px', marginTop: '4px' }, children: error })] }) }));
230
+ }
231
+ // Show loading state
232
+ if (!sdkLoaded) {
233
+ return (jsx("div", { style: { ...containerStyle, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#f5f5f5' }, children: jsxs("div", { style: { textAlign: 'center' }, children: [jsx("div", { style: { fontSize: '24px', marginBottom: '8px' }, children: "\u23F3" }), jsx("div", { children: "Loading Pexelize Editor..." })] }) }));
234
+ }
235
+ return (jsx("div", { id: containerId.current, ref: containerRef, className: className, style: containerStyle }));
236
+ });
237
+ PexelizeEditor.displayName = 'PexelizeEditor';
238
+ /**
239
+ * Hook to use the Pexelize SDK directly
240
+ *
241
+ * @example
242
+ * ```tsx
243
+ * function MyComponent() {
244
+ * const { sdk, isReady, error } = usePexelizeSDK({
245
+ * containerId: 'my-editor',
246
+ * editorMode: 'email',
247
+ * });
248
+ *
249
+ * const handleExport = () => {
250
+ * if (isReady && sdk) {
251
+ * sdk.exportHtml((data) => console.log(data.html));
252
+ * }
253
+ * };
254
+ *
255
+ * return (
256
+ * <div>
257
+ * <div id="my-editor" style={{ height: '600px' }} />
258
+ * <button onClick={handleExport} disabled={!isReady}>Export</button>
259
+ * </div>
260
+ * );
261
+ * }
262
+ * ```
263
+ */
264
+ function usePexelizeSDK(config) {
265
+ const sdkRef = useRef(null);
266
+ const [isReady, setIsReady] = useState(false);
267
+ const [sdkLoaded, setSdkLoaded] = useState(false);
268
+ const [error, setError] = useState(null);
269
+ // Load SDK from CDN
270
+ useEffect(() => {
271
+ loadSDKFromCDN()
272
+ .then(() => setSdkLoaded(true))
273
+ .catch((err) => setError(err.message));
274
+ }, []);
275
+ // Initialize SDK
276
+ useEffect(() => {
277
+ if (!sdkLoaded)
278
+ return;
279
+ const pexelize = getSDK();
280
+ if (!pexelize) {
281
+ setError('Pexelize SDK not found');
282
+ return;
283
+ }
284
+ sdkRef.current = pexelize;
285
+ pexelize.init({
286
+ id: config.containerId,
287
+ editorMode: config.editorMode || config.displayMode || 'email',
288
+ ...config,
289
+ });
290
+ const unsubscribe = pexelize.addEventListener('editor:ready', () => {
291
+ setIsReady(true);
292
+ });
293
+ return () => {
294
+ unsubscribe();
295
+ pexelize.destroy();
296
+ sdkRef.current = null;
297
+ setIsReady(false);
298
+ };
299
+ }, [sdkLoaded, config.containerId]);
300
+ return {
301
+ sdk: sdkRef.current,
302
+ isReady,
303
+ isLoading: !sdkLoaded && !error,
304
+ error,
305
+ };
306
+ }
307
+ // Export SDK CDN URL for reference
308
+ const PEXELIZE_SDK_CDN = SDK_CDN_URL;
309
+
310
+ export { PEXELIZE_SDK_CDN, PexelizeEditor, PexelizeEditor as default, usePexelizeSDK };
311
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/index.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,318 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var react = require('react');
7
+
8
+ // ============================================================================
9
+ // SDK CDN Configuration
10
+ // ============================================================================
11
+ const SDK_CDN_URL = 'https://cdn.jsdelivr.net/gh/Zaman-Meer/pexelize-sdk@dev/dist/pexelize-sdk.min.js';
12
+ // Global SDK reference (loaded from CDN)
13
+ let sdkLoadPromise = null;
14
+ /**
15
+ * Load SDK from CDN (singleton pattern - loads only once)
16
+ */
17
+ function loadSDKFromCDN() {
18
+ if (sdkLoadPromise) {
19
+ return sdkLoadPromise;
20
+ }
21
+ // Check if already loaded
22
+ if (window.pexelize) {
23
+ return Promise.resolve();
24
+ }
25
+ sdkLoadPromise = new Promise((resolve, reject) => {
26
+ const script = document.createElement('script');
27
+ script.src = SDK_CDN_URL;
28
+ script.async = true;
29
+ script.onload = () => {
30
+ if (window.pexelize) {
31
+ console.log('[Pexelize React] SDK loaded from CDN');
32
+ resolve();
33
+ }
34
+ else {
35
+ reject(new Error('SDK loaded but pexelize global not found'));
36
+ }
37
+ };
38
+ script.onerror = () => {
39
+ sdkLoadPromise = null;
40
+ reject(new Error(`Failed to load Pexelize SDK from ${SDK_CDN_URL}`));
41
+ };
42
+ document.head.appendChild(script);
43
+ });
44
+ return sdkLoadPromise;
45
+ }
46
+ /**
47
+ * Get SDK instance from global
48
+ */
49
+ function getSDK() {
50
+ return window.pexelize;
51
+ }
52
+ // ============================================================================
53
+ // Component
54
+ // ============================================================================
55
+ /**
56
+ * PexelizeEditor React Component
57
+ *
58
+ * @example
59
+ * ```tsx
60
+ * import { PexelizeEditor, PexelizeEditorRef } from '@pexelize/react-editor';
61
+ *
62
+ * function MyEditor() {
63
+ * const editorRef = useRef<PexelizeEditorRef>(null);
64
+ *
65
+ * const handleSave = () => {
66
+ * editorRef.current?.saveDesign((design) => {
67
+ * console.log('Design:', design);
68
+ * });
69
+ * };
70
+ *
71
+ * return (
72
+ * <div>
73
+ * <button onClick={handleSave}>Save</button>
74
+ * <PexelizeEditor
75
+ * ref={editorRef}
76
+ * editorMode="email"
77
+ * onReady={() => console.log('Ready!')}
78
+ * onChange={({ design }) => console.log('Changed:', design)}
79
+ * />
80
+ * </div>
81
+ * );
82
+ * }
83
+ * ```
84
+ */
85
+ const PexelizeEditor = react.forwardRef((props, ref) => {
86
+ const { design, mergeTags, displayConditions, className, style, height = '600px', displayMode, editorMode, onReady, onLoad, onChange, onContentModified, onSelect, onDeselect, onImage, onLinkClick, onSave, ...config } = props;
87
+ const containerRef = react.useRef(null);
88
+ const sdkRef = react.useRef(null);
89
+ const containerId = react.useRef(`pexelize-editor-${Math.random().toString(36).substr(2, 9)}`);
90
+ const [isEditorReady, setIsEditorReady] = react.useState(false);
91
+ const [sdkLoaded, setSdkLoaded] = react.useState(false);
92
+ const [error, setError] = react.useState(null);
93
+ // Load SDK from CDN
94
+ react.useEffect(() => {
95
+ loadSDKFromCDN()
96
+ .then(() => setSdkLoaded(true))
97
+ .catch((err) => setError(err.message));
98
+ }, []);
99
+ // Initialize SDK once loaded
100
+ react.useEffect(() => {
101
+ if (!sdkLoaded || !containerRef.current)
102
+ return;
103
+ const pexelize = getSDK();
104
+ if (!pexelize) {
105
+ setError('Pexelize SDK not found after loading');
106
+ return;
107
+ }
108
+ // Store SDK reference
109
+ sdkRef.current = pexelize;
110
+ // Initialize
111
+ pexelize.init({
112
+ id: containerId.current,
113
+ editorMode: editorMode || displayMode || 'email',
114
+ ...config,
115
+ });
116
+ // Clean up on unmount
117
+ return () => {
118
+ pexelize.destroy();
119
+ sdkRef.current = null;
120
+ setIsEditorReady(false);
121
+ };
122
+ }, [sdkLoaded]);
123
+ // Handle ready event
124
+ react.useEffect(() => {
125
+ const sdk = sdkRef.current;
126
+ if (!sdk)
127
+ return;
128
+ const handleReady = () => {
129
+ setIsEditorReady(true);
130
+ // Set merge tags if provided
131
+ if (mergeTags) {
132
+ sdk.setMergeTags(mergeTags);
133
+ }
134
+ // Set display conditions if provided
135
+ if (displayConditions) {
136
+ sdk.setDisplayConditions(displayConditions);
137
+ }
138
+ // Load initial design if provided
139
+ if (design) {
140
+ sdk.loadDesign(design);
141
+ }
142
+ // Call onReady callback
143
+ onReady?.();
144
+ };
145
+ const unsubscribe = sdk.addEventListener('editor:ready', handleReady);
146
+ return unsubscribe;
147
+ }, [sdkLoaded, design, mergeTags, displayConditions, onReady]);
148
+ // Handle design loaded event
149
+ react.useEffect(() => {
150
+ const sdk = sdkRef.current;
151
+ if (!sdk || !onLoad)
152
+ return;
153
+ const unsubscribe = sdk.addEventListener('design:loaded', onLoad);
154
+ return unsubscribe;
155
+ }, [sdkLoaded, onLoad]);
156
+ // Handle design updated event
157
+ react.useEffect(() => {
158
+ const sdk = sdkRef.current;
159
+ if (!sdk || !onChange)
160
+ return;
161
+ const unsubscribe = sdk.addEventListener('design:updated', onChange);
162
+ return unsubscribe;
163
+ }, [sdkLoaded, onChange]);
164
+ // Handle content modified event
165
+ react.useEffect(() => {
166
+ const sdk = sdkRef.current;
167
+ if (!sdk || !onContentModified)
168
+ return;
169
+ const unsubscribe = sdk.addEventListener('content:modified', onContentModified);
170
+ return unsubscribe;
171
+ }, [sdkLoaded, onContentModified]);
172
+ // Handle element selected event
173
+ react.useEffect(() => {
174
+ const sdk = sdkRef.current;
175
+ if (!sdk || !onSelect)
176
+ return;
177
+ const unsubscribe = sdk.addEventListener('element:selected', onSelect);
178
+ return unsubscribe;
179
+ }, [sdkLoaded, onSelect]);
180
+ // Handle element deselected event
181
+ react.useEffect(() => {
182
+ const sdk = sdkRef.current;
183
+ if (!sdk || !onDeselect)
184
+ return;
185
+ const unsubscribe = sdk.addEventListener('element:deselected', onDeselect);
186
+ return unsubscribe;
187
+ }, [sdkLoaded, onDeselect]);
188
+ // Register callbacks
189
+ react.useEffect(() => {
190
+ const sdk = sdkRef.current;
191
+ if (!sdk)
192
+ return;
193
+ if (onImage) {
194
+ sdk.registerCallback('image', onImage);
195
+ }
196
+ if (onLinkClick) {
197
+ sdk.registerCallback('linkClick', onLinkClick);
198
+ }
199
+ if (onSave) {
200
+ sdk.registerCallback('save', onSave);
201
+ }
202
+ return () => {
203
+ if (sdk.unregisterCallback) {
204
+ sdk.unregisterCallback('image');
205
+ sdk.unregisterCallback('linkClick');
206
+ sdk.unregisterCallback('save');
207
+ }
208
+ };
209
+ }, [sdkLoaded, onImage, onLinkClick, onSave]);
210
+ // Expose SDK methods via ref
211
+ react.useImperativeHandle(ref, () => ({
212
+ loadDesign: (design) => sdkRef.current?.loadDesign(design),
213
+ loadBlank: () => sdkRef.current?.loadBlank(),
214
+ saveDesign: (callback) => sdkRef.current?.saveDesign(callback),
215
+ getDesign: () => sdkRef.current?.getDesign(),
216
+ exportHtml: (callback) => sdkRef.current?.exportHtml(callback),
217
+ exportHtmlAsync: () => sdkRef.current?.exportHtmlAsync(),
218
+ save: () => sdkRef.current?.save(),
219
+ undo: () => sdkRef.current?.undo(),
220
+ redo: () => sdkRef.current?.redo(),
221
+ getState: () => sdkRef.current?.getState(),
222
+ isReady: () => isEditorReady,
223
+ getSdk: () => sdkRef.current,
224
+ }), [isEditorReady, sdkLoaded]);
225
+ // Compute styles
226
+ const containerStyle = {
227
+ width: '100%',
228
+ height: typeof height === 'number' ? `${height}px` : height,
229
+ ...style,
230
+ };
231
+ // Show error state
232
+ if (error) {
233
+ return (jsxRuntime.jsx("div", { style: { ...containerStyle, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#fee', color: '#c00' }, children: jsxRuntime.jsxs("div", { style: { textAlign: 'center' }, children: [jsxRuntime.jsx("div", { style: { fontSize: '24px', marginBottom: '8px' }, children: "\u26A0\uFE0F" }), jsxRuntime.jsx("div", { children: "Failed to load Pexelize Editor" }), jsxRuntime.jsx("div", { style: { fontSize: '12px', marginTop: '4px' }, children: error })] }) }));
234
+ }
235
+ // Show loading state
236
+ if (!sdkLoaded) {
237
+ return (jsxRuntime.jsx("div", { style: { ...containerStyle, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#f5f5f5' }, children: jsxRuntime.jsxs("div", { style: { textAlign: 'center' }, children: [jsxRuntime.jsx("div", { style: { fontSize: '24px', marginBottom: '8px' }, children: "\u23F3" }), jsxRuntime.jsx("div", { children: "Loading Pexelize Editor..." })] }) }));
238
+ }
239
+ return (jsxRuntime.jsx("div", { id: containerId.current, ref: containerRef, className: className, style: containerStyle }));
240
+ });
241
+ PexelizeEditor.displayName = 'PexelizeEditor';
242
+ /**
243
+ * Hook to use the Pexelize SDK directly
244
+ *
245
+ * @example
246
+ * ```tsx
247
+ * function MyComponent() {
248
+ * const { sdk, isReady, error } = usePexelizeSDK({
249
+ * containerId: 'my-editor',
250
+ * editorMode: 'email',
251
+ * });
252
+ *
253
+ * const handleExport = () => {
254
+ * if (isReady && sdk) {
255
+ * sdk.exportHtml((data) => console.log(data.html));
256
+ * }
257
+ * };
258
+ *
259
+ * return (
260
+ * <div>
261
+ * <div id="my-editor" style={{ height: '600px' }} />
262
+ * <button onClick={handleExport} disabled={!isReady}>Export</button>
263
+ * </div>
264
+ * );
265
+ * }
266
+ * ```
267
+ */
268
+ function usePexelizeSDK(config) {
269
+ const sdkRef = react.useRef(null);
270
+ const [isReady, setIsReady] = react.useState(false);
271
+ const [sdkLoaded, setSdkLoaded] = react.useState(false);
272
+ const [error, setError] = react.useState(null);
273
+ // Load SDK from CDN
274
+ react.useEffect(() => {
275
+ loadSDKFromCDN()
276
+ .then(() => setSdkLoaded(true))
277
+ .catch((err) => setError(err.message));
278
+ }, []);
279
+ // Initialize SDK
280
+ react.useEffect(() => {
281
+ if (!sdkLoaded)
282
+ return;
283
+ const pexelize = getSDK();
284
+ if (!pexelize) {
285
+ setError('Pexelize SDK not found');
286
+ return;
287
+ }
288
+ sdkRef.current = pexelize;
289
+ pexelize.init({
290
+ id: config.containerId,
291
+ editorMode: config.editorMode || config.displayMode || 'email',
292
+ ...config,
293
+ });
294
+ const unsubscribe = pexelize.addEventListener('editor:ready', () => {
295
+ setIsReady(true);
296
+ });
297
+ return () => {
298
+ unsubscribe();
299
+ pexelize.destroy();
300
+ sdkRef.current = null;
301
+ setIsReady(false);
302
+ };
303
+ }, [sdkLoaded, config.containerId]);
304
+ return {
305
+ sdk: sdkRef.current,
306
+ isReady,
307
+ isLoading: !sdkLoaded && !error,
308
+ error,
309
+ };
310
+ }
311
+ // Export SDK CDN URL for reference
312
+ const PEXELIZE_SDK_CDN = SDK_CDN_URL;
313
+
314
+ exports.PEXELIZE_SDK_CDN = PEXELIZE_SDK_CDN;
315
+ exports.PexelizeEditor = PexelizeEditor;
316
+ exports.default = PexelizeEditor;
317
+ exports.usePexelizeSDK = usePexelizeSDK;
318
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/index.tsx"],"sourcesContent":[null],"names":["forwardRef","useRef","useState","useEffect","useImperativeHandle","_jsx","_jsxs"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@pexelize/react-editor",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "React wrapper component for the Pexelize Editor - SDK loaded via CDN",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.esm.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.esm.js",
12
+ "require": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "scripts": {
22
+ "build": "rollup -c",
23
+ "build:watch": "rollup -c -w",
24
+ "dev": "rollup -c -w",
25
+ "test": "vitest",
26
+ "lint": "eslint src --ext .ts,.tsx",
27
+ "typecheck": "tsc --noEmit",
28
+ "clean": "rimraf dist",
29
+ "prepublishOnly": "npm run build"
30
+ },
31
+ "keywords": [
32
+ "pexelize",
33
+ "editor",
34
+ "email-editor",
35
+ "react",
36
+ "react-component",
37
+ "template-editor",
38
+ "wysiwyg",
39
+ "cdn"
40
+ ],
41
+ "author": "Pexelize",
42
+ "license": "MIT",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/Zaman-Meer/pexelize-react.git"
46
+ },
47
+ "bugs": {
48
+ "url": "https://github.com/Zaman-Meer/pexelize-react/issues"
49
+ },
50
+ "homepage": "https://github.com/Zaman-Meer/pexelize-react#readme",
51
+ "peerDependencies": {
52
+ "react": ">=17.0.0",
53
+ "react-dom": ">=17.0.0"
54
+ },
55
+ "peerDependenciesMeta": {
56
+ "react": {
57
+ "optional": false
58
+ },
59
+ "react-dom": {
60
+ "optional": false
61
+ }
62
+ },
63
+ "devDependencies": {
64
+ "@rollup/plugin-commonjs": "^25.0.7",
65
+ "@rollup/plugin-node-resolve": "^15.2.3",
66
+ "@rollup/plugin-typescript": "^11.1.5",
67
+ "@types/node": "^20.10.4",
68
+ "@types/react": "^18.2.43",
69
+ "@types/react-dom": "^18.2.17",
70
+ "@typescript-eslint/eslint-plugin": "^6.13.2",
71
+ "@typescript-eslint/parser": "^6.13.2",
72
+ "eslint": "^8.55.0",
73
+ "react": "^18.2.0",
74
+ "react-dom": "^18.2.0",
75
+ "rollup": "^4.9.0",
76
+ "rollup-plugin-dts": "^6.1.0",
77
+ "rollup-plugin-peer-deps-external": "^2.2.4",
78
+ "tslib": "^2.8.1",
79
+ "typescript": "^5.3.3",
80
+ "vitest": "^1.0.4"
81
+ },
82
+ "engines": {
83
+ "node": ">=16.0.0"
84
+ }
85
+ }