@capillarytech/creatives-library 8.0.246-alpha.0 → 8.0.246

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 (133) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +1 -2
  4. package/initialReducer.js +0 -2
  5. package/package.json +1 -1
  6. package/services/api.js +0 -10
  7. package/services/tests/api.test.js +0 -18
  8. package/utils/common.js +0 -5
  9. package/utils/commonUtils.js +5 -28
  10. package/utils/tests/commonUtil.test.js +0 -224
  11. package/utils/transformTemplateConfig.js +10 -0
  12. package/v2Components/CapDeviceContent/index.js +56 -61
  13. package/v2Components/CapTagList/index.js +1 -6
  14. package/v2Components/CapTagListWithInput/index.js +1 -5
  15. package/v2Components/CapTagListWithInput/messages.js +1 -1
  16. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  17. package/v2Components/ErrorInfoNote/index.js +72 -447
  18. package/v2Components/ErrorInfoNote/messages.js +0 -22
  19. package/v2Components/ErrorInfoNote/style.scss +4 -280
  20. package/v2Components/FormBuilder/tests/index.test.js +4 -13
  21. package/v2Components/HtmlEditor/HTMLEditor.js +94 -642
  22. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1135
  23. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
  24. package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
  25. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  26. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +101 -13
  27. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +139 -148
  28. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  29. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  30. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +0 -9
  31. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  32. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
  33. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  34. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  35. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  36. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  37. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  38. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
  39. package/v2Components/HtmlEditor/components/PreviewPane/index.js +13 -11
  40. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  41. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
  42. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
  43. package/v2Components/HtmlEditor/constants.js +20 -29
  44. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  45. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  46. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  47. package/v2Components/HtmlEditor/hooks/useValidation.js +45 -150
  48. package/v2Components/HtmlEditor/index.js +1 -1
  49. package/v2Components/HtmlEditor/messages.js +85 -95
  50. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +102 -134
  51. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  52. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
  53. package/v2Components/MobilePushPreviewV2/index.js +7 -32
  54. package/v2Components/TemplatePreview/_templatePreview.scss +24 -44
  55. package/v2Components/TemplatePreview/index.js +32 -47
  56. package/v2Components/TemplatePreview/messages.js +0 -4
  57. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
  58. package/v2Components/TestAndPreviewSlidebox/index.js +25 -31
  59. package/v2Containers/BeeEditor/index.js +90 -172
  60. package/v2Containers/CreativesContainer/SlideBoxContent.js +51 -128
  61. package/v2Containers/CreativesContainer/SlideBoxFooter.js +12 -113
  62. package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -2
  63. package/v2Containers/CreativesContainer/constants.js +0 -1
  64. package/v2Containers/CreativesContainer/index.js +46 -238
  65. package/v2Containers/CreativesContainer/messages.js +0 -8
  66. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
  67. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +50 -38
  68. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -91
  69. package/v2Containers/Email/actions.js +0 -7
  70. package/v2Containers/Email/constants.js +1 -5
  71. package/v2Containers/Email/index.js +30 -229
  72. package/v2Containers/Email/messages.js +0 -32
  73. package/v2Containers/Email/reducer.js +1 -12
  74. package/v2Containers/Email/sagas.js +7 -61
  75. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  76. package/v2Containers/Email/tests/sagas.test.js +1 -1
  77. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +15 -210
  78. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  79. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  80. package/v2Containers/EmailWrapper/constants.js +0 -2
  81. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
  82. package/v2Containers/EmailWrapper/index.js +23 -103
  83. package/v2Containers/EmailWrapper/messages.js +1 -61
  84. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
  85. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -509
  86. package/v2Containers/InApp/actions.js +0 -7
  87. package/v2Containers/InApp/constants.js +4 -20
  88. package/v2Containers/InApp/index.js +357 -801
  89. package/v2Containers/InApp/index.scss +3 -4
  90. package/v2Containers/InApp/messages.js +3 -7
  91. package/v2Containers/InApp/reducer.js +3 -21
  92. package/v2Containers/InApp/sagas.js +9 -29
  93. package/v2Containers/InApp/selectors.js +5 -25
  94. package/v2Containers/InApp/tests/index.test.js +50 -154
  95. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  96. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  97. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +0 -3
  98. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +0 -2
  99. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +0 -2
  100. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +0 -9
  101. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -12
  102. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +0 -4
  103. package/v2Containers/TagList/index.js +19 -62
  104. package/v2Containers/Templates/_templates.scss +1 -60
  105. package/v2Containers/Templates/index.js +4 -89
  106. package/v2Containers/Templates/messages.js +0 -4
  107. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +0 -35
  108. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -874
  109. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -254
  110. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -363
  111. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  112. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.apiErrors.test.js +0 -630
  113. package/v2Containers/BeePopupEditor/constants.js +0 -10
  114. package/v2Containers/BeePopupEditor/index.js +0 -193
  115. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  116. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1317
  117. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -1605
  118. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
  119. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -643
  120. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  121. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  122. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  123. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -162
  124. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  125. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -9
  126. package/v2Containers/InAppWrapper/constants.js +0 -16
  127. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  128. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  129. package/v2Containers/InAppWrapper/index.js +0 -148
  130. package/v2Containers/InAppWrapper/messages.js +0 -49
  131. package/v2Containers/InappAdvance/index.js +0 -1099
  132. package/v2Containers/InappAdvance/index.scss +0 -10
  133. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
@@ -34,7 +34,7 @@ export const LIQUID_PATTERNS = {
34
34
  OPERATORS: /\b(and|or|not|contains|in|==|!=|<|>|<=|>=)\b/g,
35
35
 
36
36
  // String literals in Liquid
37
- STRING_LITERALS: /(["'])((?:\\.|(?!\1)[^\\])*?)\1/g,
37
+ STRING_LITERALS: /(["'])((?:\\.|(?!\1)[^\\])*?)\1/g
38
38
  };
39
39
 
40
40
  /**
@@ -68,7 +68,7 @@ export const liquidVSCodeTheme = HighlightStyle.define([
68
68
  { tag: tags.atom, color: '#4ec9b0' }, // Liquid filters
69
69
  { tag: tags.punctuation, color: '#d4d4d4' },
70
70
  { tag: tags.bracket, color: '#ffd700' },
71
- { tag: tags.brace, color: '#ffd700' },
71
+ { tag: tags.brace, color: '#ffd700' }
72
72
  ]);
73
73
 
74
74
  /**
@@ -151,7 +151,7 @@ export class LiquidValidator {
151
151
  column: 1,
152
152
  rule: 'liquid-stray-closing-output',
153
153
  severity: 'error',
154
- source: 'liquid-validator',
154
+ source: 'liquid-validator'
155
155
  });
156
156
  }
157
157
  }
@@ -160,7 +160,7 @@ export class LiquidValidator {
160
160
  // After scan, any remaining entries on stack are unclosed opening braces
161
161
  if (stack.length > 0) {
162
162
  // Report each unclosed opening brace
163
- stack.forEach((position) => {
163
+ stack.forEach(position => {
164
164
  this.errors.push({
165
165
  type: 'error',
166
166
  message: 'unclosed Liquid output tag - missing }}',
@@ -168,7 +168,7 @@ export class LiquidValidator {
168
168
  column: 1,
169
169
  rule: 'liquid-unclosed-output',
170
170
  severity: 'error',
171
- source: 'liquid-validator',
171
+ source: 'liquid-validator'
172
172
  });
173
173
  });
174
174
  }
@@ -203,7 +203,7 @@ export class LiquidValidator {
203
203
  column: 1,
204
204
  rule: 'liquid-unclosed-logic',
205
205
  severity: 'error',
206
- source: 'liquid-validator',
206
+ source: 'liquid-validator'
207
207
  });
208
208
  }
209
209
  }
@@ -216,7 +216,7 @@ export class LiquidValidator {
216
216
  const nestedOutputPattern = /\{\{[^}]*\{\{[^}]*\}\}/g;
217
217
  const nestedOutput = html.match(nestedOutputPattern);
218
218
  if (nestedOutput) {
219
- nestedOutput.forEach((match) => {
219
+ nestedOutput.forEach(match => {
220
220
  this.errors.push({
221
221
  type: 'error',
222
222
  message: `Nested braces in Liquid output tag: ${match}`,
@@ -224,7 +224,7 @@ export class LiquidValidator {
224
224
  column: 1,
225
225
  rule: 'liquid-nested-braces',
226
226
  severity: 'error',
227
- source: 'liquid-validator',
227
+ source: 'liquid-validator'
228
228
  });
229
229
  });
230
230
  }
@@ -233,7 +233,7 @@ export class LiquidValidator {
233
233
  const nestedLogicPattern = /\{%[^%]*\{%[^%]*%\}/g;
234
234
  const nestedLogic = html.match(nestedLogicPattern);
235
235
  if (nestedLogic) {
236
- nestedLogic.forEach((match) => {
236
+ nestedLogic.forEach(match => {
237
237
  this.errors.push({
238
238
  type: 'error',
239
239
  message: `Nested braces in Liquid logic tag: ${match}`,
@@ -241,7 +241,7 @@ export class LiquidValidator {
241
241
  column: 1,
242
242
  rule: 'liquid-nested-braces',
243
243
  severity: 'error',
244
- source: 'liquid-validator',
244
+ source: 'liquid-validator'
245
245
  });
246
246
  });
247
247
  }
@@ -262,10 +262,10 @@ export class LiquidValidator {
262
262
 
263
263
  logicTags.push({
264
264
  full: match[0],
265
- content,
266
- keyword,
265
+ content: content,
266
+ keyword: keyword,
267
267
  position: match.index,
268
- line: this.getLineNumber(html, match.index),
268
+ line: this.getLineNumber(html, match.index)
269
269
  });
270
270
  }
271
271
 
@@ -279,25 +279,25 @@ export class LiquidValidator {
279
279
  validateBalancedTags(logicTags) {
280
280
  const stack = [];
281
281
  const pairs = {
282
- if: 'endif',
283
- unless: 'endunless',
284
- for: 'endfor',
285
- case: 'endcase',
286
- capture: 'endcapture',
287
- comment: 'endcomment',
288
- tablerow: 'endtablerow',
289
- raw: 'endraw',
282
+ 'if': 'endif',
283
+ 'unless': 'endunless',
284
+ 'for': 'endfor',
285
+ 'case': 'endcase',
286
+ 'capture': 'endcapture',
287
+ 'comment': 'endcomment',
288
+ 'tablerow': 'endtablerow',
289
+ 'raw': 'endraw'
290
290
  };
291
291
 
292
- logicTags.forEach((tag) => {
293
- const {keyword} = tag;
292
+ logicTags.forEach(tag => {
293
+ const keyword = tag.keyword;
294
294
 
295
295
  if (pairs[keyword]) {
296
296
  // Opening tag
297
297
  stack.push({ keyword, tag });
298
298
  } else if (Object.values(pairs).includes(keyword)) {
299
299
  // Closing tag
300
- const expectedOpening = Object.keys(pairs).find((key) => pairs[key] === keyword);
300
+ const expectedOpening = Object.keys(pairs).find(key => pairs[key] === keyword);
301
301
  const lastOpening = stack.pop();
302
302
 
303
303
  if (!lastOpening) {
@@ -308,7 +308,7 @@ export class LiquidValidator {
308
308
  column: 1,
309
309
  rule: 'liquid-unexpected-closing',
310
310
  severity: 'error',
311
- source: 'liquid-validator',
311
+ source: 'liquid-validator'
312
312
  });
313
313
  } else if (lastOpening.keyword !== expectedOpening) {
314
314
  this.errors.push({
@@ -318,31 +318,14 @@ export class LiquidValidator {
318
318
  column: 1,
319
319
  rule: 'liquid-mismatched-tags',
320
320
  severity: 'error',
321
- source: 'liquid-validator',
321
+ source: 'liquid-validator'
322
322
  });
323
323
  }
324
324
  }
325
325
  });
326
326
 
327
327
  // Check for unclosed opening tags
328
- if (stack.length > 0) {
329
- stack.forEach(({ keyword, tag }) => {
330
- const expectedClosing = pairs[keyword];
331
- const error = {
332
- type: 'error',
333
- message: `Unclosed Liquid tag: {% ${keyword} %} - missing {% ${expectedClosing} %}`,
334
- line: tag.line,
335
- column: 1,
336
- rule: 'liquid-unclosed-tag',
337
- severity: 'error',
338
- source: 'liquid-validator',
339
- };
340
- this.errors.push(error);
341
- });
342
- }
343
-
344
- // Check for unclosed opening tags
345
- stack.forEach((unclosed) => {
328
+ stack.forEach(unclosed => {
346
329
  this.errors.push({
347
330
  type: 'error',
348
331
  message: `Unclosed Liquid tag: {% ${unclosed.keyword} %}`,
@@ -350,7 +333,7 @@ export class LiquidValidator {
350
333
  column: 1,
351
334
  rule: 'liquid-unclosed-tag',
352
335
  severity: 'error',
353
- source: 'liquid-validator',
336
+ source: 'liquid-validator'
354
337
  });
355
338
  });
356
339
  }
@@ -362,7 +345,7 @@ export class LiquidValidator {
362
345
  // Check for malformed filters
363
346
  const malformedFilters = html.match(/\|\s*\||\|\s*$/gm);
364
347
  if (malformedFilters) {
365
- malformedFilters.forEach((match) => {
348
+ malformedFilters.forEach(match => {
366
349
  this.warnings.push({
367
350
  type: 'warning',
368
351
  message: `Malformed Liquid filter: ${match.trim()}`,
@@ -370,36 +353,19 @@ export class LiquidValidator {
370
353
  column: 1,
371
354
  rule: 'liquid-malformed-filter',
372
355
  severity: 'warning',
373
- source: 'liquid-validator',
356
+ source: 'liquid-validator'
374
357
  });
375
358
  });
376
359
  }
377
360
 
378
361
  // Check for common filter usage
379
- // Standard Liquid filters that are commonly used and shouldn't trigger info messages
380
- // This list includes standard Liquid filters to avoid false positives
381
- const commonFilters = [
382
- // String filters
383
- 'capitalize', 'upcase', 'downcase', 'strip', 'lstrip', 'rstrip', 'strip_html', 'strip_newlines',
384
- 'truncate', 'truncatewords', 'prepend', 'append', 'remove', 'remove_first', 'replace', 'replace_first',
385
- 'split', 'join', 'concat', 'escape', 'escape_once', 'newline_to_br',
386
- // Array filters
387
- 'first', 'last', 'size', 'slice', 'sort', 'sort_natural', 'map', 'where', 'uniq', 'compact', 'reverse',
388
- // Number filters
389
- 'abs', 'ceil', 'floor', 'round', 'times', 'divided_by', 'modulo', 'minus', 'plus', 'at_least', 'at_most',
390
- // Date filters
391
- 'date',
392
- // Other common filters
393
- 'default', 'url_encode', 'url_decode',
394
- ];
362
+ const commonFilters = ['date', 'capitalize', 'upcase', 'downcase', 'strip', 'truncate', 'default'];
395
363
  const filterPattern = /\|\s*([a-zA-Z_][a-zA-Z0-9_]*)/g;
396
364
  let filterMatch;
397
365
 
398
366
  while ((filterMatch = filterPattern.exec(html)) !== null) {
399
367
  const filterName = filterMatch[1];
400
368
  if (!commonFilters.includes(filterName)) {
401
- // Only show info for truly custom/unknown filters
402
- // Standard Liquid filters are now included in commonFilters list
403
369
  this.info.push({
404
370
  type: 'info',
405
371
  message: `Using filter: ${filterName}`,
@@ -407,7 +373,7 @@ export class LiquidValidator {
407
373
  column: 1,
408
374
  rule: 'liquid-filter-usage',
409
375
  severity: 'info',
410
- source: 'liquid-validator',
376
+ source: 'liquid-validator'
411
377
  });
412
378
  }
413
379
  }
@@ -420,7 +386,7 @@ export class LiquidValidator {
420
386
  // Check for undefined variable patterns (basic check)
421
387
  const suspiciousVariables = html.match(/\{\{\s*[^}]*undefined[^}]*\s*\}\}/g);
422
388
  if (suspiciousVariables) {
423
- suspiciousVariables.forEach((match) => {
389
+ suspiciousVariables.forEach(match => {
424
390
  this.warnings.push({
425
391
  type: 'warning',
426
392
  message: `Potentially undefined variable: ${match}`,
@@ -428,7 +394,7 @@ export class LiquidValidator {
428
394
  column: 1,
429
395
  rule: 'liquid-undefined-variable',
430
396
  severity: 'warning',
431
- source: 'liquid-validator',
397
+ source: 'liquid-validator'
432
398
  });
433
399
  });
434
400
  }
@@ -451,7 +417,7 @@ export class LiquidValidator {
451
417
  isValid: this.errors.length === 0,
452
418
  errors: this.errors,
453
419
  warnings: this.warnings,
454
- info: this.info,
420
+ info: this.info
455
421
  };
456
422
  }
457
423
  }
@@ -459,58 +425,60 @@ export class LiquidValidator {
459
425
  /**
460
426
  * Enhanced CodeMirror extensions with Liquid support
461
427
  */
462
- export const createLiquidExtensions = () => [
463
- // HTML language support (base)
464
- html(),
465
-
466
- // Enhanced syntax highlighting with Liquid support
467
- syntaxHighlighting(liquidVSCodeTheme),
468
-
469
- // Editor theme
470
- EditorView.theme({
471
- "&": {
472
- height: "500px",
473
- backgroundColor: "#1e1e1e",
474
- fontSize: "14px",
475
- fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
476
- },
477
- ".cm-content": {
478
- padding: "12px",
479
- backgroundColor: "#1e1e1e",
480
- fontSize: "14px",
481
- lineHeight: "20px",
482
- fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
483
- color: "#d4d4d4",
484
- },
485
- ".cm-focused": {
486
- outline: "none",
487
- },
488
- ".cm-lineNumbers": {
489
- fontSize: "14px",
490
- lineHeight: "20px",
491
- color: "#858585",
492
- backgroundColor: "#1e1e1e",
493
- paddingRight: "8px",
494
- paddingLeft: "8px",
495
- borderRight: "1px solid #3e3e3e",
496
- minWidth: "45px",
497
- textAlign: "right",
498
- },
499
- ".cm-gutters": {
500
- backgroundColor: "#1e1e1e",
501
- borderRight: "1px solid #3e3e3e",
502
- },
503
- ".cm-activeLine": {
504
- backgroundColor: "#2a2d2e",
505
- },
506
- ".cm-selection": {
507
- backgroundColor: "#264f78",
508
- },
509
- ".cm-cursor": {
510
- borderLeft: "2px solid #ffffff",
511
- },
512
- }),
513
- ];
428
+ export const createLiquidExtensions = () => {
429
+ return [
430
+ // HTML language support (base)
431
+ html(),
432
+
433
+ // Enhanced syntax highlighting with Liquid support
434
+ syntaxHighlighting(liquidVSCodeTheme),
435
+
436
+ // Editor theme
437
+ EditorView.theme({
438
+ "&": {
439
+ height: "500px",
440
+ backgroundColor: "#1e1e1e",
441
+ fontSize: "14px",
442
+ fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace"
443
+ },
444
+ ".cm-content": {
445
+ padding: "12px",
446
+ backgroundColor: "#1e1e1e",
447
+ fontSize: "14px",
448
+ lineHeight: "20px",
449
+ fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
450
+ color: "#d4d4d4"
451
+ },
452
+ ".cm-focused": {
453
+ outline: "none"
454
+ },
455
+ ".cm-lineNumbers": {
456
+ fontSize: "14px",
457
+ lineHeight: "20px",
458
+ color: "#858585",
459
+ backgroundColor: "#1e1e1e",
460
+ paddingRight: "8px",
461
+ paddingLeft: "8px",
462
+ borderRight: "1px solid #3e3e3e",
463
+ minWidth: "45px",
464
+ textAlign: "right"
465
+ },
466
+ ".cm-gutters": {
467
+ backgroundColor: "#1e1e1e",
468
+ borderRight: "1px solid #3e3e3e"
469
+ },
470
+ ".cm-activeLine": {
471
+ backgroundColor: "#2a2d2e"
472
+ },
473
+ ".cm-selection": {
474
+ backgroundColor: "#264f78"
475
+ },
476
+ ".cm-cursor": {
477
+ borderLeft: "2px solid #ffffff"
478
+ }
479
+ })
480
+ ];
481
+ };
514
482
 
515
483
  /**
516
484
  * Validates HTML content with Liquid template support
@@ -528,22 +496,22 @@ export const validateLiquidHTML = (html, variant = 'email') => {
528
496
  */
529
497
  export const LIQUID_SNIPPETS = {
530
498
  // Output tags
531
- customer_name: '{{ customer.first_name }} {{ customer.last_name }}',
532
- customer_email: '{{ customer.email }}',
533
- current_date: '{{ "now" | date: "%B %d, %Y" }}',
534
- organization_name: '{{ organization.name }}',
499
+ 'customer_name': '{{ customer.first_name }} {{ customer.last_name }}',
500
+ 'customer_email': '{{ customer.email }}',
501
+ 'current_date': '{{ "now" | date: "%B %d, %Y" }}',
502
+ 'organization_name': '{{ organization.name }}',
535
503
 
536
504
  // Logic tags
537
- if_statement: '{% if condition %}\n <!-- content -->\n{% endif %}',
538
- for_loop: '{% for item in collection %}\n {{ item.name }}\n{% endfor %}',
539
- unless_statement: '{% unless condition %}\n <!-- content -->\n{% endunless %}',
540
- case_statement: '{% case variable %}\n {% when "value1" %}\n <!-- content -->\n {% when "value2" %}\n <!-- content -->\n {% else %}\n <!-- default content -->\n{% endcase %}',
505
+ 'if_statement': '{% if condition %}\n <!-- content -->\n{% endif %}',
506
+ 'for_loop': '{% for item in collection %}\n {{ item.name }}\n{% endfor %}',
507
+ 'unless_statement': '{% unless condition %}\n <!-- content -->\n{% endunless %}',
508
+ 'case_statement': '{% case variable %}\n {% when "value1" %}\n <!-- content -->\n {% when "value2" %}\n <!-- content -->\n {% else %}\n <!-- default content -->\n{% endcase %}',
541
509
 
542
510
  // Common filters
543
- date_filter: '{{ date_variable | date: "%B %d, %Y" }}',
544
- capitalize_filter: '{{ text | capitalize }}',
545
- truncate_filter: '{{ text | truncate: 50 }}',
546
- default_filter: '{{ variable | default: "Default Value" }}',
511
+ 'date_filter': '{{ date_variable | date: "%B %d, %Y" }}',
512
+ 'capitalize_filter': '{{ text | capitalize }}',
513
+ 'truncate_filter': '{{ text | truncate: 50 }}',
514
+ 'default_filter': '{{ variable | default: "Default Value" }}'
547
515
  };
548
516
 
549
517
  export default {
@@ -552,5 +520,5 @@ export default {
552
520
  LiquidValidator,
553
521
  createLiquidExtensions,
554
522
  validateLiquidHTML,
555
- LIQUID_SNIPPETS,
523
+ LIQUID_SNIPPETS
556
524
  };
@@ -76,7 +76,7 @@ export const comprehensiveVSCodeTheme = HighlightStyle.define([
76
76
  { tag: tags.link, color: '#4fc1ff', textDecoration: 'underline' },
77
77
  { tag: tags.heading, color: '#9cdcfe', fontWeight: 'bold' },
78
78
  { tag: tags.emphasis, fontStyle: 'italic' },
79
- { tag: tags.strong, fontWeight: 'bold' },
79
+ { tag: tags.strong, fontWeight: 'bold' }
80
80
  ]);
81
81
 
82
82
  /**
@@ -88,7 +88,7 @@ export const cleanEditorTheme = EditorView.theme({
88
88
  height: "500px",
89
89
  backgroundColor: "#1e1e1e",
90
90
  fontSize: "14px",
91
- fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
91
+ fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace"
92
92
  },
93
93
  ".cm-content": {
94
94
  padding: "12px",
@@ -96,17 +96,17 @@ export const cleanEditorTheme = EditorView.theme({
96
96
  fontSize: "14px",
97
97
  lineHeight: "20px",
98
98
  fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
99
- color: "#d4d4d4", // Base text color for all content
99
+ color: "#d4d4d4" // Base text color for all content
100
100
  },
101
101
  ".cm-focused": {
102
- outline: "none",
102
+ outline: "none"
103
103
  },
104
104
  ".cm-editor": {
105
105
  borderRadius: "0",
106
- border: "none",
106
+ border: "none"
107
107
  },
108
108
  ".cm-scroller": {
109
- fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace",
109
+ fontFamily: "'DM Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace"
110
110
  },
111
111
  ".cm-lineNumbers": {
112
112
  fontSize: "14px",
@@ -117,45 +117,47 @@ export const cleanEditorTheme = EditorView.theme({
117
117
  paddingLeft: "8px",
118
118
  borderRight: "1px solid #3e3e3e",
119
119
  minWidth: "45px",
120
- textAlign: "right",
120
+ textAlign: "right"
121
121
  },
122
122
  ".cm-gutters": {
123
123
  backgroundColor: "#1e1e1e",
124
- borderRight: "1px solid #3e3e3e",
124
+ borderRight: "1px solid #3e3e3e"
125
125
  },
126
126
  ".cm-activeLine": {
127
- backgroundColor: "#2a2d2e",
127
+ backgroundColor: "#2a2d2e"
128
128
  },
129
129
  ".cm-selection": {
130
- backgroundColor: "#264f78",
130
+ backgroundColor: "#264f78"
131
131
  },
132
132
  ".cm-cursor": {
133
- borderLeft: "2px solid #ffffff",
133
+ borderLeft: "2px solid #ffffff"
134
134
  },
135
135
  // Additional fallback for text nodes
136
136
  ".cm-line": {
137
- color: "#d4d4d4",
138
- },
137
+ color: "#d4d4d4"
138
+ }
139
139
  });
140
140
 
141
141
  /**
142
142
  * ROBUST Extension Creator - Single, clean implementation
143
143
  * Uses only verified tags to avoid undefined errors
144
144
  */
145
- export const createRobustExtensions = () => [
146
- // 1. HTML language support with proper parsing
147
- html(),
145
+ export const createRobustExtensions = () => {
146
+ return [
147
+ // 1. HTML language support with proper parsing
148
+ html(),
148
149
 
149
- // 2. SAFE syntax highlighting (using only confirmed tags)
150
- syntaxHighlighting(comprehensiveVSCodeTheme),
150
+ // 2. SAFE syntax highlighting (using only confirmed tags)
151
+ syntaxHighlighting(comprehensiveVSCodeTheme),
151
152
 
152
- // 3. Clean theme (structure only, no color conflicts)
153
- cleanEditorTheme,
154
- ];
153
+ // 3. Clean theme (structure only, no color conflicts)
154
+ cleanEditorTheme
155
+ ];
156
+ };
155
157
 
156
158
  // Export the main function
157
159
  export default {
158
160
  comprehensiveVSCodeTheme,
159
161
  cleanEditorTheme,
160
- createRobustExtensions,
161
- };
162
+ createRobustExtensions
163
+ };