@jhits/plugin-newsletter 0.0.4 → 0.0.6

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 (173) hide show
  1. package/dist/api/handler.d.ts +51 -0
  2. package/dist/api/handler.d.ts.map +1 -0
  3. package/dist/api/handler.js +526 -0
  4. package/dist/api/router.d.ts +11 -0
  5. package/dist/api/router.d.ts.map +1 -0
  6. package/dist/api/router.js +82 -0
  7. package/dist/index.d.ts +46 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +222 -0
  10. package/dist/index.server.d.ts +10 -0
  11. package/dist/index.server.d.ts.map +1 -0
  12. package/dist/index.server.js +8 -0
  13. package/dist/init.d.ts +49 -0
  14. package/dist/init.d.ts.map +1 -0
  15. package/dist/init.js +42 -0
  16. package/dist/lib/blocks/BlockRenderer.d.ts +43 -0
  17. package/dist/lib/blocks/BlockRenderer.d.ts.map +1 -0
  18. package/dist/lib/blocks/BlockRenderer.js +48 -0
  19. package/dist/lib/email/EmailRenderer.d.ts +47 -0
  20. package/dist/lib/email/EmailRenderer.d.ts.map +1 -0
  21. package/dist/lib/email/EmailRenderer.js +359 -0
  22. package/dist/lib/email/index.d.ts +6 -0
  23. package/dist/lib/email/index.d.ts.map +1 -0
  24. package/dist/lib/email/index.js +4 -0
  25. package/dist/lib/mappers/apiMapper.d.ts +30 -0
  26. package/dist/lib/mappers/apiMapper.d.ts.map +1 -0
  27. package/dist/lib/mappers/apiMapper.js +36 -0
  28. package/dist/lib/utils/blockHelpers.d.ts +23 -0
  29. package/dist/lib/utils/blockHelpers.d.ts.map +1 -0
  30. package/dist/lib/utils/blockHelpers.js +65 -0
  31. package/dist/lib/utils/slugify.d.ts +14 -0
  32. package/dist/lib/utils/slugify.d.ts.map +1 -0
  33. package/dist/lib/utils/slugify.js +37 -0
  34. package/dist/registry/BlockRegistry.d.ts +31 -0
  35. package/dist/registry/BlockRegistry.d.ts.map +1 -0
  36. package/dist/registry/BlockRegistry.js +34 -0
  37. package/dist/registry/index.d.ts +5 -0
  38. package/dist/registry/index.d.ts.map +1 -0
  39. package/dist/registry/index.js +4 -0
  40. package/dist/state/EditorContext.d.ts +44 -0
  41. package/dist/state/EditorContext.d.ts.map +1 -0
  42. package/dist/state/EditorContext.js +212 -0
  43. package/dist/state/index.d.ts +10 -0
  44. package/dist/state/index.d.ts.map +1 -0
  45. package/dist/state/index.js +6 -0
  46. package/dist/state/reducer.d.ts +11 -0
  47. package/dist/state/reducer.d.ts.map +1 -0
  48. package/dist/state/reducer.js +488 -0
  49. package/dist/state/types.d.ts +157 -0
  50. package/dist/state/types.d.ts.map +1 -0
  51. package/dist/state/types.js +26 -0
  52. package/dist/types/block.d.ts +230 -0
  53. package/dist/types/block.d.ts.map +1 -0
  54. package/dist/types/block.js +8 -0
  55. package/dist/types/newsletter.d.ts +129 -0
  56. package/dist/types/newsletter.d.ts.map +1 -0
  57. package/dist/types/newsletter.js +4 -0
  58. package/dist/types/registry.d.ts +13 -0
  59. package/dist/types/registry.d.ts.map +1 -0
  60. package/dist/types/registry.js +4 -0
  61. package/dist/views/CanvasEditor/BlockWrapper.d.ts +23 -0
  62. package/dist/views/CanvasEditor/BlockWrapper.d.ts.map +1 -0
  63. package/dist/views/CanvasEditor/BlockWrapper.js +44 -0
  64. package/dist/views/CanvasEditor/CanvasEditorView.d.ts +14 -0
  65. package/dist/views/CanvasEditor/CanvasEditorView.d.ts.map +1 -0
  66. package/dist/views/CanvasEditor/CanvasEditorView.js +139 -0
  67. package/dist/views/CanvasEditor/EditorBody.d.ts +24 -0
  68. package/dist/views/CanvasEditor/EditorBody.d.ts.map +1 -0
  69. package/dist/views/CanvasEditor/EditorBody.js +21 -0
  70. package/dist/views/CanvasEditor/EditorHeader.d.ts +12 -0
  71. package/dist/views/CanvasEditor/EditorHeader.d.ts.map +1 -0
  72. package/dist/views/CanvasEditor/EditorHeader.js +47 -0
  73. package/dist/views/CanvasEditor/components/CustomBlockItem.d.ts +10 -0
  74. package/dist/views/CanvasEditor/components/CustomBlockItem.d.ts.map +1 -0
  75. package/dist/views/CanvasEditor/components/CustomBlockItem.js +36 -0
  76. package/dist/views/CanvasEditor/components/EditorCanvas.d.ts +25 -0
  77. package/dist/views/CanvasEditor/components/EditorCanvas.d.ts.map +1 -0
  78. package/dist/views/CanvasEditor/components/EditorCanvas.js +397 -0
  79. package/dist/views/CanvasEditor/components/EditorLibrary.d.ts +7 -0
  80. package/dist/views/CanvasEditor/components/EditorLibrary.d.ts.map +1 -0
  81. package/dist/views/CanvasEditor/components/EditorLibrary.js +25 -0
  82. package/dist/views/CanvasEditor/components/EditorSidebar.d.ts +9 -0
  83. package/dist/views/CanvasEditor/components/EditorSidebar.d.ts.map +1 -0
  84. package/dist/views/CanvasEditor/components/EditorSidebar.js +16 -0
  85. package/dist/views/CanvasEditor/components/ErrorBanner.d.ts +6 -0
  86. package/dist/views/CanvasEditor/components/ErrorBanner.d.ts.map +1 -0
  87. package/dist/views/CanvasEditor/components/ErrorBanner.js +8 -0
  88. package/dist/views/CanvasEditor/components/LibraryItem.d.ts +10 -0
  89. package/dist/views/CanvasEditor/components/LibraryItem.d.ts.map +1 -0
  90. package/dist/views/CanvasEditor/components/LibraryItem.js +35 -0
  91. package/dist/views/CanvasEditor/components/SlashCommandDetector.d.ts +18 -0
  92. package/dist/views/CanvasEditor/components/SlashCommandDetector.d.ts.map +1 -0
  93. package/dist/views/CanvasEditor/components/SlashCommandDetector.js +164 -0
  94. package/dist/views/CanvasEditor/components/SlashCommandMenu.d.ts +22 -0
  95. package/dist/views/CanvasEditor/components/SlashCommandMenu.d.ts.map +1 -0
  96. package/dist/views/CanvasEditor/components/SlashCommandMenu.js +57 -0
  97. package/dist/views/CanvasEditor/components/index.d.ts +16 -0
  98. package/dist/views/CanvasEditor/components/index.d.ts.map +1 -0
  99. package/dist/views/CanvasEditor/components/index.js +9 -0
  100. package/dist/views/CanvasEditor/hooks/index.d.ts +7 -0
  101. package/dist/views/CanvasEditor/hooks/index.d.ts.map +1 -0
  102. package/dist/views/CanvasEditor/hooks/index.js +6 -0
  103. package/dist/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts +3 -0
  104. package/dist/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  105. package/dist/views/CanvasEditor/hooks/useKeyboardShortcuts.js +114 -0
  106. package/dist/views/CanvasEditor/hooks/useNewsletterLoader.d.ts +5 -0
  107. package/dist/views/CanvasEditor/hooks/useNewsletterLoader.d.ts.map +1 -0
  108. package/dist/views/CanvasEditor/hooks/useNewsletterLoader.js +28 -0
  109. package/dist/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts +2 -0
  110. package/dist/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts.map +1 -0
  111. package/dist/views/CanvasEditor/hooks/useRegisteredBlocks.js +46 -0
  112. package/dist/views/CanvasEditor/hooks/useSlashCommand.d.ts +31 -0
  113. package/dist/views/CanvasEditor/hooks/useSlashCommand.d.ts.map +1 -0
  114. package/dist/views/CanvasEditor/hooks/useSlashCommand.js +87 -0
  115. package/dist/views/CanvasEditor/index.d.ts +12 -0
  116. package/dist/views/CanvasEditor/index.d.ts.map +1 -0
  117. package/dist/views/CanvasEditor/index.js +7 -0
  118. package/dist/views/NewsletterEditor.d.ts +16 -0
  119. package/dist/views/NewsletterEditor.d.ts.map +1 -0
  120. package/dist/views/NewsletterEditor.js +10 -0
  121. package/dist/views/NewsletterManager.d.ts +10 -0
  122. package/dist/views/NewsletterManager.d.ts.map +1 -0
  123. package/dist/views/NewsletterManager.js +95 -0
  124. package/dist/views/SettingsView.d.ts +10 -0
  125. package/dist/views/SettingsView.d.ts.map +1 -0
  126. package/dist/views/SettingsView.js +103 -0
  127. package/dist/views/SubscribersView.d.ts +10 -0
  128. package/dist/views/SubscribersView.d.ts.map +1 -0
  129. package/dist/views/SubscribersView.js +94 -0
  130. package/package.json +24 -23
  131. package/src/api/handler.ts +340 -1
  132. package/src/api/router.ts +35 -0
  133. package/src/index.tsx +284 -4
  134. package/src/index.tsx.patch +98 -0
  135. package/src/init.tsx +72 -0
  136. package/src/lib/blocks/BlockRenderer.tsx +125 -0
  137. package/src/lib/email/EmailRenderer.tsx +425 -0
  138. package/src/lib/email/index.ts +6 -0
  139. package/src/lib/mappers/apiMapper.ts +57 -0
  140. package/src/lib/utils/blockHelpers.ts +71 -0
  141. package/src/lib/utils/slugify.ts +43 -0
  142. package/src/registry/BlockRegistry.ts +53 -0
  143. package/src/registry/index.ts +5 -0
  144. package/src/state/EditorContext.tsx +279 -0
  145. package/src/state/index.ts +10 -0
  146. package/src/state/reducer.ts +561 -0
  147. package/src/state/types.ts +154 -0
  148. package/src/types/block.ts +275 -0
  149. package/src/types/newsletter.ts +114 -1
  150. package/src/types/registry.ts +14 -0
  151. package/src/views/CanvasEditor/BlockWrapper.tsx +143 -0
  152. package/src/views/CanvasEditor/CanvasEditorView.tsx +249 -0
  153. package/src/views/CanvasEditor/EditorBody.tsx +95 -0
  154. package/src/views/CanvasEditor/EditorHeader.tsx +139 -0
  155. package/src/views/CanvasEditor/components/CustomBlockItem.tsx +83 -0
  156. package/src/views/CanvasEditor/components/EditorCanvas.tsx +674 -0
  157. package/src/views/CanvasEditor/components/EditorLibrary.tsx +120 -0
  158. package/src/views/CanvasEditor/components/EditorSidebar.tsx +156 -0
  159. package/src/views/CanvasEditor/components/ErrorBanner.tsx +31 -0
  160. package/src/views/CanvasEditor/components/LibraryItem.tsx +71 -0
  161. package/src/views/CanvasEditor/components/SlashCommandDetector.tsx +196 -0
  162. package/src/views/CanvasEditor/components/SlashCommandMenu.tsx +131 -0
  163. package/src/views/CanvasEditor/components/index.ts +16 -0
  164. package/src/views/CanvasEditor/hooks/index.ts +7 -0
  165. package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.ts +136 -0
  166. package/src/views/CanvasEditor/hooks/useNewsletterLoader.ts +34 -0
  167. package/src/views/CanvasEditor/hooks/useRegisteredBlocks.ts +54 -0
  168. package/src/views/CanvasEditor/hooks/useSlashCommand.ts +106 -0
  169. package/src/views/CanvasEditor/index.ts +12 -0
  170. package/src/views/NewsletterEditor.tsx +38 -0
  171. package/src/views/NewsletterManager.tsx +240 -0
  172. package/src/views/SettingsView.tsx +14 -14
  173. package/src/views/SubscribersView.tsx +20 -20
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Registry Exports
3
+ */
4
+ export { blockRegistry } from './BlockRegistry';
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Newsletter Editor Context
3
+ * React Context for managing newsletter editor state
4
+ * Multi-Tenant: Accepts custom blocks from client applications
5
+ */
6
+ import React from 'react';
7
+ import { EditorState, EditorContextValue } from './types';
8
+ import { ClientBlockDefinition } from '../types/block';
9
+ /**
10
+ * Editor Provider Props
11
+ */
12
+ export interface EditorProviderProps {
13
+ children: React.ReactNode;
14
+ /** Initial state (optional) */
15
+ initialState?: Partial<EditorState>;
16
+ /** Callback when save is triggered */
17
+ onSave?: (state: EditorState) => Promise<void>;
18
+ /**
19
+ * Custom blocks from client application
20
+ * These blocks will be registered in the BlockRegistry on mount
21
+ */
22
+ customBlocks?: ClientBlockDefinition[];
23
+ /** Enable dark mode for content area and wrappers (default: true) */
24
+ darkMode?: boolean;
25
+ /** Background colors for the editor */
26
+ backgroundColors?: {
27
+ /** Background color for light mode (REQUIRED) */
28
+ light: string;
29
+ /** Background color for dark mode (optional) */
30
+ dark?: string;
31
+ };
32
+ }
33
+ /**
34
+ * Editor Provider
35
+ * Provides editor state and actions to child components
36
+ * Automatically registers client-provided blocks on mount
37
+ */
38
+ export declare function EditorProvider({ children, initialState, onSave, customBlocks, darkMode, backgroundColors }: EditorProviderProps): import("react/jsx-runtime").JSX.Element;
39
+ /**
40
+ * Hook to access editor context
41
+ * @throws Error if used outside EditorProvider
42
+ */
43
+ export declare function useEditor(): EditorContextValue;
44
+ //# sourceMappingURL=EditorContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorContext.d.ts","sourceRoot":"","sources":["../../src/state/EditorContext.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAmG,MAAM,OAAO,CAAC;AAExH,OAAO,EAAE,WAAW,EAAoC,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAG5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAMvD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,+BAA+B;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACpC,sCAAsC;IACtC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C;;;OAGG;IACH,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACvC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,gBAAgB,CAAC,EAAE;QACf,iDAAiD;QACjD,KAAK,EAAE,MAAM,CAAC;QACd,gDAAgD;QAChD,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACL;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,YAAiB,EACjB,QAAe,EACf,gBAAgB,EACnB,EAAE,mBAAmB,2CAkNrB;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,kBAAkB,CAM9C"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Newsletter Editor Context
3
+ * React Context for managing newsletter editor state
4
+ * Multi-Tenant: Accepts custom blocks from client applications
5
+ */
6
+ 'use client';
7
+ import { jsx as _jsx } from "react/jsx-runtime";
8
+ import { createContext, useContext, useReducer, useCallback, useMemo, useEffect, useRef, useState } from 'react';
9
+ import { editorReducer } from './reducer';
10
+ import { initialEditorState } from './types';
11
+ import { BlockRegistry } from '../registry/BlockRegistry';
12
+ // Create the context
13
+ const EditorContext = createContext(null);
14
+ /**
15
+ * Editor Provider
16
+ * Provides editor state and actions to child components
17
+ * Automatically registers client-provided blocks on mount
18
+ */
19
+ export function EditorProvider({ children, initialState, onSave, customBlocks = [], darkMode = true, backgroundColors }) {
20
+ // Register client blocks on mount
21
+ useEffect(() => {
22
+ if (customBlocks && customBlocks.length > 0) {
23
+ try {
24
+ customBlocks.forEach(block => BlockRegistry.register(block));
25
+ }
26
+ catch (error) {
27
+ console.error('[NewsletterEditorContext] Failed to register custom blocks:', error);
28
+ }
29
+ }
30
+ }, [customBlocks]);
31
+ const [state, dispatch] = useReducer(editorReducer, { ...initialEditorState, ...initialState });
32
+ // Use a ref to always have access to the latest state in callbacks
33
+ const stateRef = useRef(state);
34
+ stateRef.current = state;
35
+ // History state for undo/redo
36
+ const [history, setHistory] = useState([]);
37
+ const [historyIndex, setHistoryIndex] = useState(-1);
38
+ const isRestoringRef = useRef(false);
39
+ const MAX_HISTORY = 50; // Limit history to prevent memory issues
40
+ // Save current state to history after state changes (but not during undo/redo)
41
+ // Debounce history updates to avoid excessive re-renders
42
+ const historyTimeoutRef = useRef(null);
43
+ useEffect(() => {
44
+ if (isRestoringRef.current) {
45
+ isRestoringRef.current = false;
46
+ return;
47
+ }
48
+ // Clear existing timeout
49
+ if (historyTimeoutRef.current) {
50
+ clearTimeout(historyTimeoutRef.current);
51
+ }
52
+ // Debounce history updates to reduce re-renders
53
+ historyTimeoutRef.current = setTimeout(() => {
54
+ // Save current state to history
55
+ setHistory(prev => {
56
+ const newHistory = [...prev];
57
+ // Remove any future history if we're not at the end
58
+ if (historyIndex < newHistory.length - 1) {
59
+ newHistory.splice(historyIndex + 1);
60
+ }
61
+ // Add current state
62
+ newHistory.push({ ...state });
63
+ // Limit history size
64
+ if (newHistory.length > MAX_HISTORY) {
65
+ newHistory.shift();
66
+ return newHistory;
67
+ }
68
+ return newHistory;
69
+ });
70
+ setHistoryIndex(prev => {
71
+ const newIndex = prev + 1;
72
+ return newIndex >= MAX_HISTORY ? MAX_HISTORY - 1 : newIndex;
73
+ });
74
+ }, 300); // Debounce by 300ms
75
+ return () => {
76
+ if (historyTimeoutRef.current) {
77
+ clearTimeout(historyTimeoutRef.current);
78
+ }
79
+ };
80
+ }, [state.blocks, state.title, state.slug, state.metadata, state.status, historyIndex]);
81
+ // Helper: Add a new block (supports nested containers)
82
+ const addBlock = useCallback((type, index, containerId) => {
83
+ const blockDefinition = BlockRegistry.get(type);
84
+ if (!blockDefinition) {
85
+ console.warn(`Block type "${type}" not found in registry. Available types:`, BlockRegistry.getAll().map((b) => b.type).join(', '));
86
+ return;
87
+ }
88
+ const newBlock = {
89
+ id: `block-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
90
+ type,
91
+ data: { ...blockDefinition.defaultData },
92
+ };
93
+ dispatch({ type: 'ADD_BLOCK', payload: { block: newBlock, index, containerId } });
94
+ }, []);
95
+ // Helper: Update a block
96
+ const updateBlock = useCallback((id, data) => {
97
+ dispatch({ type: 'UPDATE_BLOCK', payload: { id, data } });
98
+ }, []);
99
+ // Helper: Delete a block
100
+ const deleteBlock = useCallback((id) => {
101
+ dispatch({ type: 'DELETE_BLOCK', payload: { id } });
102
+ }, []);
103
+ // Helper: Duplicate a block
104
+ const duplicateBlock = useCallback((id) => {
105
+ dispatch({ type: 'DUPLICATE_BLOCK', payload: { id } });
106
+ }, []);
107
+ // Helper: Move a block (supports nested containers)
108
+ const moveBlock = useCallback((id, newIndex, containerId) => {
109
+ dispatch({ type: 'MOVE_BLOCK', payload: { id, newIndex, containerId } });
110
+ }, []);
111
+ // Helper: Load a newsletter
112
+ const loadNewsletter = useCallback((newsletter) => {
113
+ dispatch({ type: 'LOAD_NEWSLETTER', payload: newsletter });
114
+ }, []);
115
+ // Helper: Reset editor
116
+ const resetEditor = useCallback(() => {
117
+ dispatch({ type: 'RESET_EDITOR' });
118
+ }, []);
119
+ // Helper: Save
120
+ // Uses stateRef to always get the latest state, avoiding stale closure issues
121
+ const save = useCallback(async () => {
122
+ if (onSave) {
123
+ // Use stateRef.current to get the absolute latest state
124
+ // This ensures we don't have stale closure issues with React state updates
125
+ await onSave(stateRef.current);
126
+ dispatch({ type: 'MARK_CLEAN' });
127
+ }
128
+ }, [onSave]);
129
+ // Helper: Undo
130
+ const undo = useCallback(() => {
131
+ if (historyIndex > 0 && history.length > 0) {
132
+ const previousState = history[historyIndex - 1];
133
+ if (previousState) {
134
+ isRestoringRef.current = true;
135
+ setHistoryIndex(prev => prev - 1);
136
+ dispatch({
137
+ type: 'LOAD_NEWSLETTER', payload: {
138
+ id: previousState.newsletterId || '',
139
+ title: previousState.title,
140
+ slug: previousState.slug,
141
+ blocks: previousState.blocks,
142
+ publication: {
143
+ status: previousState.status,
144
+ authorId: undefined,
145
+ },
146
+ metadata: previousState.metadata,
147
+ createdAt: new Date().toISOString(),
148
+ updatedAt: new Date().toISOString(),
149
+ }
150
+ });
151
+ }
152
+ }
153
+ }, [history, historyIndex, dispatch]);
154
+ // Helper: Redo
155
+ const redo = useCallback(() => {
156
+ if (historyIndex < history.length - 1) {
157
+ const nextState = history[historyIndex + 1];
158
+ if (nextState) {
159
+ isRestoringRef.current = true;
160
+ setHistoryIndex(prev => prev + 1);
161
+ dispatch({
162
+ type: 'LOAD_NEWSLETTER', payload: {
163
+ id: nextState.newsletterId || '',
164
+ title: nextState.title,
165
+ slug: nextState.slug,
166
+ blocks: nextState.blocks,
167
+ publication: {
168
+ status: nextState.status,
169
+ authorId: undefined,
170
+ },
171
+ metadata: nextState.metadata,
172
+ createdAt: new Date().toISOString(),
173
+ updatedAt: new Date().toISOString(),
174
+ }
175
+ });
176
+ }
177
+ }
178
+ }, [history, historyIndex, dispatch]);
179
+ // Memoize the context value
180
+ const value = useMemo(() => ({
181
+ state,
182
+ dispatch,
183
+ darkMode,
184
+ backgroundColors,
185
+ helpers: {
186
+ addBlock,
187
+ updateBlock,
188
+ deleteBlock,
189
+ duplicateBlock,
190
+ moveBlock,
191
+ loadNewsletter,
192
+ resetEditor,
193
+ save,
194
+ undo,
195
+ redo,
196
+ },
197
+ canUndo: historyIndex > 0 && history.length > 0,
198
+ canRedo: historyIndex < history.length - 1,
199
+ }), [state, dispatch, darkMode, backgroundColors, addBlock, updateBlock, deleteBlock, duplicateBlock, moveBlock, loadNewsletter, resetEditor, save, undo, redo, historyIndex, history.length]);
200
+ return _jsx(EditorContext.Provider, { value: value, children: children });
201
+ }
202
+ /**
203
+ * Hook to access editor context
204
+ * @throws Error if used outside EditorProvider
205
+ */
206
+ export function useEditor() {
207
+ const context = useContext(EditorContext);
208
+ if (!context) {
209
+ throw new Error('useEditor must be used within an EditorProvider');
210
+ }
211
+ return context;
212
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * State Exports
3
+ */
4
+ export { EditorProvider, useEditor } from './EditorContext';
5
+ export type { EditorProviderProps } from './EditorContext';
6
+ export type { EditorContextValue } from './types';
7
+ export { editorReducer } from './reducer';
8
+ export type { EditorState, EditorAction } from './types';
9
+ export { initialEditorState } from './types';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5D,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * State Exports
3
+ */
4
+ export { EditorProvider, useEditor } from './EditorContext';
5
+ export { editorReducer } from './reducer';
6
+ export { initialEditorState } from './types';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Newsletter Editor Reducer
3
+ * Pure function that handles state transitions
4
+ */
5
+ import { EditorState, EditorAction } from './types';
6
+ /**
7
+ * Editor Reducer
8
+ * Handles all state transitions for the editor
9
+ */
10
+ export declare function editorReducer(state: EditorState, action: EditorAction): EditorState;
11
+ //# sourceMappingURL=reducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../src/state/reducer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAsB,MAAM,SAAS,CAAC;AAgQxE;;;GAGG;AACH,wBAAgB,aAAa,CACzB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,GACrB,WAAW,CAoSb"}