@capillarytech/creatives-library 8.0.208 → 8.0.209

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 (77) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/config/app.js +1 -2
  4. package/package.json +16 -2
  5. package/services/api.js +0 -2
  6. package/v2Components/HtmlEditor/HTMLEditor.js +508 -0
  7. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1809 -0
  8. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +532 -0
  9. package/v2Components/HtmlEditor/_htmlEditor.scss +304 -0
  10. package/v2Components/HtmlEditor/_index.lazy.scss +26 -0
  11. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +376 -0
  12. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +331 -0
  13. package/v2Components/HtmlEditor/components/DeviceToggle/__tests__/index.test.js +314 -0
  14. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +244 -0
  15. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +111 -0
  16. package/v2Components/HtmlEditor/components/EditorToolbar/PreviewModeGroup.js +72 -0
  17. package/v2Components/HtmlEditor/components/EditorToolbar/__tests__/PreviewModeGroup.test.js +1594 -0
  18. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +113 -0
  19. package/v2Components/HtmlEditor/components/EditorToolbar/_previewModeGroup.scss +82 -0
  20. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +115 -0
  21. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +57 -0
  22. package/v2Components/HtmlEditor/components/InAppPreviewPane/ContentOverlay.js +90 -0
  23. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +60 -0
  24. package/v2Components/HtmlEditor/components/InAppPreviewPane/LayoutSelector.js +58 -0
  25. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/ContentOverlay.test.js +389 -0
  26. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +424 -0
  27. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/LayoutSelector.test.js +248 -0
  28. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +253 -0
  29. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +104 -0
  30. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +179 -0
  31. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +220 -0
  32. package/v2Components/HtmlEditor/components/PreviewPane/index.js +229 -0
  33. package/v2Components/HtmlEditor/components/SplitContainer/SplitContainer.js +276 -0
  34. package/v2Components/HtmlEditor/components/SplitContainer/__tests__/SplitContainer.test.js +295 -0
  35. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +257 -0
  36. package/v2Components/HtmlEditor/components/SplitContainer/index.js +7 -0
  37. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
  38. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +31 -0
  39. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +70 -0
  40. package/v2Components/HtmlEditor/components/ValidationPanel/__tests__/index.test.js +98 -0
  41. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +311 -0
  42. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +297 -0
  43. package/v2Components/HtmlEditor/components/ValidationPanel/messages.js +57 -0
  44. package/v2Components/HtmlEditor/components/common/EditorContext.js +84 -0
  45. package/v2Components/HtmlEditor/components/common/__tests__/EditorContext.test.js +660 -0
  46. package/v2Components/HtmlEditor/constants.js +241 -0
  47. package/v2Components/HtmlEditor/hooks/__tests__/useEditorContent.test.js +450 -0
  48. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +785 -0
  49. package/v2Components/HtmlEditor/hooks/__tests__/useLayoutState.test.js +580 -0
  50. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.enhanced.test.js +768 -0
  51. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +590 -0
  52. package/v2Components/HtmlEditor/hooks/useEditorContent.js +274 -0
  53. package/v2Components/HtmlEditor/hooks/useInAppContent.js +407 -0
  54. package/v2Components/HtmlEditor/hooks/useLayoutState.js +247 -0
  55. package/v2Components/HtmlEditor/hooks/useValidation.js +325 -0
  56. package/v2Components/HtmlEditor/index.js +29 -0
  57. package/v2Components/HtmlEditor/index.lazy.js +114 -0
  58. package/v2Components/HtmlEditor/messages.js +389 -0
  59. package/v2Components/HtmlEditor/utils/__tests__/contentSanitizer.test.js +741 -0
  60. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +1042 -0
  61. package/v2Components/HtmlEditor/utils/__tests__/liquidTemplateSupport.test.js +515 -0
  62. package/v2Components/HtmlEditor/utils/__tests__/properSyntaxHighlighting.test.js +473 -0
  63. package/v2Components/HtmlEditor/utils/__tests__/simplePerformance.test.js +1109 -0
  64. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +240 -0
  65. package/v2Components/HtmlEditor/utils/contentSanitizer.js +433 -0
  66. package/v2Components/HtmlEditor/utils/htmlValidator.js +508 -0
  67. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +524 -0
  68. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +163 -0
  69. package/v2Components/HtmlEditor/utils/simplePerformance.js +145 -0
  70. package/v2Components/HtmlEditor/utils/validationAdapter.js +130 -0
  71. package/v2Containers/CreativesContainer/SlideBoxContent.js +0 -2
  72. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +200 -0
  73. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +545 -0
  74. package/v2Containers/EmailWrapper/index.js +8 -1
  75. package/v2Containers/Templates/constants.js +8 -0
  76. package/v2Containers/Templates/index.js +56 -28
  77. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +5 -14
@@ -0,0 +1,389 @@
1
+ /**
2
+ * HTML Editor Messages
3
+ *
4
+ * Internationalization messages for the HTML Editor component
5
+ * Following project conventions for message structure
6
+ */
7
+
8
+ import { defineMessages } from 'react-intl';
9
+
10
+ export const scope = 'app.components.HtmlEditor';
11
+
12
+ export default defineMessages({
13
+ // Main component messages
14
+ initializing: {
15
+ id: `${scope}.initializing`,
16
+ defaultMessage: 'Initializing HTML Editor...'
17
+ },
18
+
19
+ // Label insertion messages
20
+ addLabel: {
21
+ id: `${scope}.addLabel`,
22
+ defaultMessage: 'Add label'
23
+ },
24
+ labelInserted: {
25
+ id: `${scope}.labelInserted`,
26
+ defaultMessage: 'Label inserted successfully'
27
+ },
28
+ labelInsertedDescription: {
29
+ id: `${scope}.labelInsertedDescription`,
30
+ defaultMessage: 'The label "{label}" has been inserted at the cursor position'
31
+ },
32
+ labelInsertError: {
33
+ id: `${scope}.labelInsertError`,
34
+ defaultMessage: 'Failed to insert label'
35
+ },
36
+ editorNotReady: {
37
+ id: `${scope}.editorNotReady`,
38
+ defaultMessage: 'Editor is not ready. Please try again.'
39
+ },
40
+ editorMethodNotAvailable: {
41
+ id: `${scope}.editorMethodNotAvailable`,
42
+ defaultMessage: 'Editor method not available. Please refresh and try again.'
43
+ },
44
+
45
+ // Save messages
46
+ contentSaved: {
47
+ id: `${scope}.contentSaved`,
48
+ defaultMessage: 'Content saved successfully'
49
+ },
50
+ saveError: {
51
+ id: `${scope}.saveError`,
52
+ defaultMessage: 'Failed to save content'
53
+ },
54
+ autoSaveEnabled: {
55
+ id: `${scope}.autoSaveEnabled`,
56
+ defaultMessage: 'Auto-save is enabled'
57
+ },
58
+ autoSaveDisabled: {
59
+ id: `${scope}.autoSaveDisabled`,
60
+ defaultMessage: 'Auto-save is disabled'
61
+ },
62
+
63
+ // Editor toolbar messages
64
+ htmlEditor: {
65
+ id: `${scope}.htmlEditor`,
66
+ defaultMessage: 'Email content'
67
+ },
68
+ desktop: {
69
+ id: `${scope}.desktop`,
70
+ defaultMessage: 'Desktop'
71
+ },
72
+ mobile: {
73
+ id: `${scope}.mobile`,
74
+ defaultMessage: 'Mobile'
75
+ },
76
+ mobileDevice: {
77
+ id: `${scope}.mobileDevice`,
78
+ defaultMessage: 'Mobile Device'
79
+ },
80
+ htmlPreview: {
81
+ id: `${scope}.htmlPreview`,
82
+ defaultMessage: 'HTML Preview'
83
+ },
84
+ startTypingHtml: {
85
+ id: `${scope}.startTypingHtml`,
86
+ defaultMessage: 'Start typing HTML to see the preview'
87
+ },
88
+ previewMode: {
89
+ id: `${scope}.previewMode`,
90
+ defaultMessage: 'Preview Mode'
91
+ },
92
+ fullscreen: {
93
+ id: `${scope}.fullscreen`,
94
+ defaultMessage: 'Fullscreen'
95
+ },
96
+ enterFullscreen: {
97
+ id: `${scope}.enterFullscreen`,
98
+ defaultMessage: 'Enter Fullscreen'
99
+ },
100
+ exitFullscreen: {
101
+ id: `${scope}.exitFullscreen`,
102
+ defaultMessage: 'Exit Fullscreen'
103
+ },
104
+ save: {
105
+ id: `${scope}.save`,
106
+ defaultMessage: 'Save'
107
+ },
108
+
109
+ // Editor tabs messages
110
+ htmlTab: {
111
+ id: `${scope}.htmlTab`,
112
+ defaultMessage: 'HTML'
113
+ },
114
+ cssTab: {
115
+ id: `${scope}.cssTab`,
116
+ defaultMessage: 'CSS'
117
+ },
118
+ javascriptTab: {
119
+ id: `${scope}.javascriptTab`,
120
+ defaultMessage: 'JavaScript'
121
+ },
122
+
123
+ // Preview messages
124
+ previewTitle: {
125
+ id: `${scope}.previewTitle`,
126
+ defaultMessage: 'Preview'
127
+ },
128
+ previewLoading: {
129
+ id: `${scope}.previewLoading`,
130
+ defaultMessage: 'Loading preview...'
131
+ },
132
+ previewError: {
133
+ id: `${scope}.previewError`,
134
+ defaultMessage: 'Preview error'
135
+ },
136
+ previewEmpty: {
137
+ id: `${scope}.previewEmpty`,
138
+ defaultMessage: 'Start typing HTML to see the preview'
139
+ },
140
+ refreshPreview: {
141
+ id: `${scope}.refreshPreview`,
142
+ defaultMessage: 'Refresh Preview'
143
+ },
144
+
145
+ // Mobile device preview messages
146
+ android: {
147
+ id: `${scope}.android`,
148
+ defaultMessage: 'Android'
149
+ },
150
+ ios: {
151
+ id: `${scope}.ios`,
152
+ defaultMessage: 'iOS'
153
+ },
154
+ devicePreview: {
155
+ id: `${scope}.devicePreview`,
156
+ defaultMessage: 'Device Preview'
157
+ },
158
+
159
+ // InApp variant messages
160
+ inAppEditor: {
161
+ id: `${scope}.inAppEditor`,
162
+ defaultMessage: 'In-app content'
163
+ },
164
+ keepContentSameForBoth: {
165
+ id: `${scope}.keepContentSameForBoth`,
166
+ defaultMessage: 'Keep content same for both'
167
+ },
168
+
169
+ // Validation messages
170
+ validationErrors: {
171
+ id: `${scope}.validationErrors`,
172
+ defaultMessage: '{count} validation {count, plural, one {error} other {errors}}'
173
+ },
174
+ validationWarnings: {
175
+ id: `${scope}.validationWarnings`,
176
+ defaultMessage: '{count} validation {count, plural, one {warning} other {warnings}}'
177
+ },
178
+ noValidationIssues: {
179
+ id: `${scope}.noValidationIssues`,
180
+ defaultMessage: 'No validation issues'
181
+ },
182
+ showProblems: {
183
+ id: `${scope}.showProblems`,
184
+ defaultMessage: 'Show Problems'
185
+ },
186
+ hideProblems: {
187
+ id: `${scope}.hideProblems`,
188
+ defaultMessage: 'Hide Problems'
189
+ },
190
+
191
+ // Error messages
192
+ securityError: {
193
+ id: `${scope}.securityError`,
194
+ defaultMessage: 'Security Error'
195
+ },
196
+ runtimeError: {
197
+ id: `${scope}.runtimeError`,
198
+ defaultMessage: 'Runtime Error'
199
+ },
200
+ renderError: {
201
+ id: `${scope}.renderError`,
202
+ defaultMessage: 'Render Error'
203
+ },
204
+ clearErrors: {
205
+ id: `${scope}.clearErrors`,
206
+ defaultMessage: 'Clear Errors'
207
+ },
208
+ copyError: {
209
+ id: `${scope}.copyError`,
210
+ defaultMessage: 'Copy Error Details'
211
+ },
212
+ errorCopied: {
213
+ id: `${scope}.errorCopied`,
214
+ defaultMessage: 'Error details copied to clipboard'
215
+ },
216
+
217
+ // Accessibility messages
218
+ codeEditor: {
219
+ id: `${scope}.codeEditor`,
220
+ defaultMessage: 'Email Editor'
221
+ },
222
+ previewPanel: {
223
+ id: `${scope}.previewPanel`,
224
+ defaultMessage: 'Preview Panel'
225
+ },
226
+ resizeHandle: {
227
+ id: `${scope}.resizeHandle`,
228
+ defaultMessage: 'Drag to resize panels'
229
+ },
230
+ splitPanels: {
231
+ id: `${scope}.splitPanels`,
232
+ defaultMessage: 'Split panels - code editor and preview'
233
+ },
234
+
235
+ // Performance messages
236
+ optimizing: {
237
+ id: `${scope}.optimizing`,
238
+ defaultMessage: 'Optimizing performance...'
239
+ },
240
+ performanceWarning: {
241
+ id: `${scope}.performanceWarning`,
242
+ defaultMessage: 'Large content detected. Performance may be affected.'
243
+ },
244
+
245
+ // Feature messages
246
+ autoSave: {
247
+ id: `${scope}.autoSave`,
248
+ defaultMessage: 'Auto-save'
249
+ },
250
+ lastSaved: {
251
+ id: `${scope}.lastSaved`,
252
+ defaultMessage: 'Last saved: {time}'
253
+ },
254
+ unsavedChanges: {
255
+ id: `${scope}.unsavedChanges`,
256
+ defaultMessage: 'You have unsaved changes'
257
+ },
258
+
259
+ // Content Sanitizer messages
260
+ sanitizer: {
261
+ invalidInput: {
262
+ id: `${scope}.sanitizer.invalidInput`,
263
+ defaultMessage: 'Invalid input: HTML content must be a string'
264
+ },
265
+ invalidInputNonEmpty: {
266
+ id: `${scope}.sanitizer.invalidInputNonEmpty`,
267
+ defaultMessage: 'Invalid input: HTML content must be a non-empty string'
268
+ },
269
+ sanitizationFailed: {
270
+ id: `${scope}.sanitizer.sanitizationFailed`,
271
+ defaultMessage: 'Sanitization failed: {error}'
272
+ },
273
+ dangerousProtocolDetected: {
274
+ id: `${scope}.sanitizer.dangerousProtocolDetected`,
275
+ defaultMessage: 'Dangerous protocol detected'
276
+ },
277
+
278
+ // Email compatibility warnings
279
+ emailMultimediaNotSupported: {
280
+ id: `${scope}.sanitizer.emailMultimediaNotSupported`,
281
+ defaultMessage: 'Video/audio/canvas elements may not be supported in email clients'
282
+ },
283
+ emailPositioningNotSupported: {
284
+ id: `${scope}.sanitizer.emailPositioningNotSupported`,
285
+ defaultMessage: 'Fixed/sticky positioning may not work in email clients'
286
+ },
287
+ emailModernCssLimited: {
288
+ id: `${scope}.sanitizer.emailModernCssLimited`,
289
+ defaultMessage: 'CSS Grid and Flexbox have limited support in email clients'
290
+ },
291
+ emailViewportUnitsNotSupported: {
292
+ id: `${scope}.sanitizer.emailViewportUnitsNotSupported`,
293
+ defaultMessage: 'Viewport units and rem may not be supported in all email clients'
294
+ },
295
+
296
+ // Mobile optimization warnings
297
+ mobileTablesNotFriendly: {
298
+ id: `${scope}.sanitizer.mobileTablesNotFriendly`,
299
+ defaultMessage: 'Tables may not be mobile-friendly - consider using flexbox or grid'
300
+ },
301
+ mobileRelativeFontSizes: {
302
+ id: `${scope}.sanitizer.mobileRelativeFontSizes`,
303
+ defaultMessage: 'Consider using relative font sizes (em, rem, %) for better mobile scaling'
304
+ },
305
+ mobileFixedWidthsProblematic: {
306
+ id: `${scope}.sanitizer.mobileFixedWidthsProblematic`,
307
+ defaultMessage: 'Large fixed widths may not work well on mobile devices'
308
+ },
309
+ mobileRelativeUnits: {
310
+ id: `${scope}.sanitizer.mobileRelativeUnits`,
311
+ defaultMessage: 'Consider using relative units (rem, em, %) for better mobile responsiveness'
312
+ },
313
+
314
+ // Production recommendations
315
+ productionValidHtml: {
316
+ id: `${scope}.sanitizer.productionValidHtml`,
317
+ defaultMessage: 'Provide valid HTML content before deploying to production'
318
+ },
319
+ productionSanitized: {
320
+ id: `${scope}.sanitizer.productionSanitized`,
321
+ defaultMessage: 'Content has been sanitized for security - review changes before deploying'
322
+ },
323
+ productionInlineCss: {
324
+ id: `${scope}.sanitizer.productionInlineCss`,
325
+ defaultMessage: 'Consider inlining CSS for better email client compatibility'
326
+ },
327
+ productionLargeContent: {
328
+ id: `${scope}.sanitizer.productionLargeContent`,
329
+ defaultMessage: 'Content is large ({size} characters) - consider optimizing for mobile performance'
330
+ }
331
+ },
332
+
333
+ // HTML Validator messages
334
+ validator: {
335
+ // General validation messages
336
+ validationFailed: {
337
+ id: `${scope}.validator.validationFailed`,
338
+ defaultMessage: 'Validation failed: {error}'
339
+ },
340
+ liquidValidationFailed: {
341
+ id: `${scope}.validator.liquidValidationFailed`,
342
+ defaultMessage: 'Liquid validation failed'
343
+ },
344
+
345
+ // Security validation messages
346
+ unsafeProtocolDetected: {
347
+ id: `${scope}.validator.unsafeProtocolDetected`,
348
+ defaultMessage: 'Potentially unsafe protocol detected: {protocol}'
349
+ },
350
+ scriptTagsDetected: {
351
+ id: `${scope}.validator.scriptTagsDetected`,
352
+ defaultMessage: 'Script tags detected - may be filtered in production'
353
+ },
354
+
355
+ // Email-specific validation messages
356
+ outlookIncompatible: {
357
+ id: `${scope}.validator.outlookIncompatible`,
358
+ defaultMessage: 'Element may not be supported in Outlook: {element}'
359
+ },
360
+ emailCssUnsupported: {
361
+ id: `${scope}.validator.emailCssUnsupported`,
362
+ defaultMessage: 'CSS feature may not be supported in email clients'
363
+ },
364
+
365
+ // Mobile/InApp validation messages
366
+ mobileIncompatible: {
367
+ id: `${scope}.validator.mobileIncompatible`,
368
+ defaultMessage: 'Element may not be supported on mobile: {element}'
369
+ },
370
+ largeImageDetected: {
371
+ id: `${scope}.validator.largeImageDetected`,
372
+ defaultMessage: 'Large image dimensions detected - consider mobile optimization'
373
+ },
374
+
375
+ // CSS validation messages
376
+ unclosedCssRule: {
377
+ id: `${scope}.validator.unclosedCssRule`,
378
+ defaultMessage: 'Unclosed CSS rule detected'
379
+ },
380
+ emptyCssRule: {
381
+ id: `${scope}.validator.emptyCssRule`,
382
+ defaultMessage: 'Empty CSS rule detected'
383
+ },
384
+ cssValidationFailed: {
385
+ id: `${scope}.validator.cssValidationFailed`,
386
+ defaultMessage: 'CSS validation failed: {error}'
387
+ }
388
+ }
389
+ });