@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
@@ -0,0 +1,152 @@
1
+ /**
2
+ * ValidationErrorDisplay Component Tests
3
+ *
4
+ * Tests for the ValidationErrorDisplay component that integrates with ErrorInfoNote.
5
+ */
6
+
7
+ import React from 'react';
8
+ import { render, screen } from '@testing-library/react';
9
+ import '@testing-library/jest-dom';
10
+ import ValidationErrorDisplay from '../index';
11
+
12
+ // Mock ErrorInfoNote component
13
+ jest.mock('../../../../ErrorInfoNote', () => {
14
+ return function MockErrorInfoNote({ errorMessages }) {
15
+ const liquidErrors = errorMessages?.LIQUID_ERROR_MSG || [];
16
+ const standardErrors = errorMessages?.STANDARD_ERROR_MSG || [];
17
+ const hasErrors = liquidErrors.length > 0 || standardErrors.length > 0;
18
+
19
+ if (!hasErrors) return null;
20
+
21
+ return (
22
+ <div data-testid="error-info-note">
23
+ {liquidErrors.map((msg, index) => (
24
+ <div key={`liquid-${index}`} data-testid="error-message">
25
+ {msg}
26
+ </div>
27
+ ))}
28
+ {standardErrors.map((msg, index) => (
29
+ <div key={`standard-${index}`} data-testid="error-message">
30
+ {msg}
31
+ </div>
32
+ ))}
33
+ </div>
34
+ );
35
+ };
36
+ });
37
+
38
+ describe('ValidationErrorDisplay', () => {
39
+ it('renders standard errors when validation has issues', () => {
40
+ const mockValidation = {
41
+ getAllIssues: () => [
42
+ { message: 'Missing closing tag', severity: 'error', line: 5, column: 10 },
43
+ { message: 'Invalid attribute', severity: 'error', line: 7 }
44
+ ],
45
+ isClean: () => false,
46
+ isValidating: false
47
+ };
48
+
49
+ render(<ValidationErrorDisplay validation={mockValidation} />);
50
+
51
+ expect(screen.getByTestId('error-info-note')).toBeInTheDocument();
52
+ const errorMessages = screen.getAllByTestId('error-message');
53
+ expect(errorMessages).toHaveLength(2);
54
+ expect(errorMessages[0]).toHaveTextContent('Missing closing tag Line 5, Char 10.');
55
+ expect(errorMessages[1]).toHaveTextContent('Invalid attribute Line 7.');
56
+ });
57
+
58
+ it('renders liquid errors separately', () => {
59
+ const mockValidation = {
60
+ getAllIssues: () => [
61
+ { message: 'Invalid liquid syntax', severity: 'error', source: 'liquid-validator', line: 3 },
62
+ { message: 'HTML error', severity: 'error', source: 'htmlhint', line: 10 }
63
+ ],
64
+ isClean: () => false,
65
+ isValidating: false
66
+ };
67
+
68
+ render(<ValidationErrorDisplay validation={mockValidation} />);
69
+
70
+ expect(screen.getByTestId('error-info-note')).toBeInTheDocument();
71
+ const errorMessages = screen.getAllByTestId('error-message');
72
+ expect(errorMessages).toHaveLength(2);
73
+ // First should be liquid error, second should be standard error
74
+ expect(errorMessages[0]).toHaveTextContent('Invalid liquid syntax Line 3.');
75
+ expect(errorMessages[1]).toHaveTextContent('HTML error Line 10.');
76
+ });
77
+
78
+ it('does not render when validation has no errors', () => {
79
+ const mockValidation = {
80
+ getAllIssues: () => [],
81
+ isClean: () => true,
82
+ isValidating: false
83
+ };
84
+
85
+ const { container } = render(<ValidationErrorDisplay validation={mockValidation} />);
86
+
87
+ expect(screen.queryByTestId('error-info-note')).not.toBeInTheDocument();
88
+ expect(container.firstChild).toBeNull();
89
+ });
90
+
91
+ it('does not render when validation is null', () => {
92
+ const { container } = render(<ValidationErrorDisplay validation={null} />);
93
+
94
+ expect(screen.queryByTestId('error-info-note')).not.toBeInTheDocument();
95
+ expect(container.firstChild).toBeNull();
96
+ });
97
+
98
+ it('does not render when validation is in progress', () => {
99
+ const mockValidation = {
100
+ getAllIssues: () => [],
101
+ isClean: () => false,
102
+ isValidating: true
103
+ };
104
+
105
+ const { container } = render(<ValidationErrorDisplay validation={mockValidation} />);
106
+
107
+ expect(screen.queryByTestId('error-info-note')).not.toBeInTheDocument();
108
+ expect(container.firstChild).toBeNull();
109
+ });
110
+
111
+ it('applies custom className', () => {
112
+ const mockValidation = {
113
+ getAllIssues: () => [{ message: 'Error', severity: 'error' }],
114
+ isClean: () => false,
115
+ isValidating: false
116
+ };
117
+
118
+ const { container } = render(
119
+ <ValidationErrorDisplay validation={mockValidation} className="custom-class" />
120
+ );
121
+
122
+ const wrapper = container.querySelector('.validation-error-display');
123
+ expect(wrapper).toHaveClass('custom-class');
124
+ });
125
+
126
+ it('handles inapp variant correctly', () => {
127
+ const mockValidation = {
128
+ getAllIssues: () => [{ message: 'Mobile error', severity: 'error' }],
129
+ isClean: () => false,
130
+ isValidating: false
131
+ };
132
+
133
+ render(<ValidationErrorDisplay validation={mockValidation} variant="inapp" />);
134
+
135
+ expect(screen.getByTestId('error-info-note')).toBeInTheDocument();
136
+ expect(screen.getByTestId('error-message')).toHaveTextContent('Mobile error');
137
+ });
138
+
139
+ it('includes rule information in error messages when available', () => {
140
+ const mockValidation = {
141
+ getAllIssues: () => [
142
+ { message: 'Alt attribute required', severity: 'error', rule: 'alt-require', line: 5 }
143
+ ],
144
+ isClean: () => false,
145
+ isValidating: false
146
+ };
147
+
148
+ render(<ValidationErrorDisplay validation={mockValidation} />);
149
+
150
+ expect(screen.getByTestId('error-message')).toHaveTextContent('Alt attribute required Line 5. • alt-require');
151
+ });
152
+ });
@@ -1,15 +1,18 @@
1
1
  /**
2
- * ValidationErrorDisplay - HTML Editor validation display
2
+ * ValidationErrorDisplay - HTML Editor validation using ErrorInfoNote
3
3
  *
4
- * This component displays validation errors using the new ValidationTabs component
5
- * with tabbed interface for HTML, Label, and Liquid issues.
4
+ * This component integrates the existing ErrorInfoNote component with the HTML Editor's
5
+ * validation system, providing a consistent error display that matches the Figma design.
6
6
  */
7
7
 
8
- import React, { useState } from 'react';
8
+ import React from 'react';
9
9
  import PropTypes from 'prop-types';
10
10
 
11
- import { hasValidationErrors } from '../../utils/validationAdapter';
12
- import ValidationTabs from '../ValidationTabs';
11
+ import CapRow from '@capillarytech/cap-ui-library/CapRow';
12
+ import ErrorInfoNote from '../../../ErrorInfoNote';
13
+
14
+ import { transformValidationToErrorInfo, hasValidationErrors } from '../../utils/validationAdapter';
15
+ import { HTML_EDITOR_VARIANTS } from '../../constants';
13
16
 
14
17
  // Styles
15
18
  import './_validationErrorDisplay.scss';
@@ -17,72 +20,51 @@ import './_validationErrorDisplay.scss';
17
20
  /**
18
21
  * ValidationErrorDisplay Component
19
22
  *
20
- * Displays validation errors using the ValidationTabs component
23
+ * Displays validation errors using the existing ErrorInfoNote component
21
24
  */
22
25
  const ValidationErrorDisplay = ({
23
26
  validation,
27
+ variant = HTML_EDITOR_VARIANTS.EMAIL,
24
28
  onErrorClick,
25
- onClose,
26
- isLiquidEnabled = false,
27
- className = '',
29
+ className = ''
28
30
  }) => {
29
- // Track if panel is dismissed
30
- const [isDismissed, setIsDismissed] = useState(false);
31
-
32
- // Handle close - dismiss temporarily
33
- const handleClose = () => {
34
- setIsDismissed(true);
35
- if (onClose) {
36
- onClose();
37
- }
38
- };
39
-
40
- // Reset dismissed state when validation changes (new errors appear)
41
- React.useEffect(() => {
42
- if (hasValidationErrors(validation)) {
43
- setIsDismissed(false);
44
- }
45
- }, [validation]);
46
-
47
- // Don't render if no validation, no errors, or dismissed
48
- if (!hasValidationErrors(validation) || isDismissed) {
31
+ // Don't render if no validation or no errors
32
+ if (!hasValidationErrors(validation)) {
49
33
  return null;
50
34
  }
51
35
 
36
+ // Transform validation data to ErrorInfoNote format
37
+ const errorData = transformValidationToErrorInfo(validation, variant);
38
+ const { errorMessages } = errorData || {};
39
+
40
+ // Handle error click if provided
41
+ const handleErrorClick = (error) => {
42
+ onErrorClick?.(error);
43
+ };
44
+
52
45
  return (
53
- <div
46
+ <CapRow
54
47
  className={`validation-error-display ${className}`}
55
48
  role="alert"
56
49
  aria-live="polite"
57
50
  aria-label="Validation errors"
58
51
  >
59
- <ValidationTabs
60
- validation={validation}
61
- onErrorClick={onErrorClick}
62
- onClose={handleClose}
63
- isLiquidEnabled={isLiquidEnabled}
52
+ <ErrorInfoNote
53
+ errorMessages={errorMessages}
54
+ onErrorClick={handleErrorClick}
64
55
  />
65
- </div>
56
+ </CapRow>
66
57
  );
67
58
  };
68
59
 
69
60
  ValidationErrorDisplay.propTypes = {
70
61
  validation: PropTypes.shape({
71
62
  isValidating: PropTypes.bool,
72
- getAllIssues: PropTypes.func,
63
+ getAllIssues: PropTypes.func
73
64
  }),
65
+ variant: PropTypes.oneOf(Object.values(HTML_EDITOR_VARIANTS)),
74
66
  onErrorClick: PropTypes.func,
75
- onClose: PropTypes.func,
76
- isLiquidEnabled: PropTypes.bool,
77
- className: PropTypes.string,
78
- };
79
-
80
- ValidationErrorDisplay.defaultProps = {
81
- validation: null,
82
- onErrorClick: null,
83
- onClose: null,
84
- isLiquidEnabled: false,
85
- className: '',
67
+ className: PropTypes.string
86
68
  };
87
69
 
88
70
  export default ValidationErrorDisplay;
@@ -7,26 +7,26 @@
7
7
  // HTML Editor Variants
8
8
  export const HTML_EDITOR_VARIANTS = {
9
9
  EMAIL: 'email',
10
- INAPP: 'inapp',
10
+ INAPP: 'inapp'
11
11
  };
12
12
 
13
13
  // Device Types (for InApp variant)
14
14
  export const DEVICE_TYPES = {
15
15
  ANDROID: 'android',
16
- IOS: 'ios',
16
+ IOS: 'ios'
17
17
  };
18
18
 
19
19
  // Editor languages
20
20
  export const EDITOR_LANGUAGES = {
21
21
  HTML: 'html',
22
22
  CSS: 'css',
23
- JAVASCRIPT: 'javascript',
23
+ JAVASCRIPT: 'javascript'
24
24
  };
25
25
 
26
26
  // Preview modes
27
27
  export const PREVIEW_MODES = {
28
28
  DESKTOP: 'desktop',
29
- MOBILE: 'mobile',
29
+ MOBILE: 'mobile'
30
30
  };
31
31
 
32
32
  // Device specifications for mobile preview
@@ -38,7 +38,7 @@ export const DEVICE_PRESETS = {
38
38
  devicePixelRatio: 2.75,
39
39
  userAgent: 'Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36',
40
40
  platform: 'android',
41
- model: 'Pixel 7',
41
+ model: 'Pixel 7'
42
42
  },
43
43
  IPHONE: {
44
44
  key: 'iphone',
@@ -47,15 +47,15 @@ export const DEVICE_PRESETS = {
47
47
  devicePixelRatio: 3,
48
48
  userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)',
49
49
  platform: 'ios',
50
- model: 'iPhone 15',
51
- },
50
+ model: 'iPhone 15'
51
+ }
52
52
  };
53
53
 
54
54
  // Validation severity levels
55
55
  export const VALIDATION_SEVERITY = {
56
56
  ERROR: 'error',
57
57
  WARNING: 'warning',
58
- INFO: 'info',
58
+ INFO: 'info'
59
59
  };
60
60
 
61
61
  // Validation types
@@ -63,14 +63,14 @@ export const VALIDATION_TYPES = {
63
63
  HTML: 'html',
64
64
  CSS: 'css',
65
65
  JAVASCRIPT: 'javascript',
66
- SECURITY: 'security',
66
+ SECURITY: 'security'
67
67
  };
68
68
 
69
69
  // Error types for preview
70
70
  export const PREVIEW_ERROR_TYPES = {
71
71
  RUNTIME: 'runtime',
72
72
  RENDER: 'render',
73
- SECURITY: 'security',
73
+ SECURITY: 'security'
74
74
  };
75
75
 
76
76
  // Performance thresholds
@@ -79,7 +79,7 @@ export const PERFORMANCE = {
79
79
  VALIDATION_DEBOUNCE: 500, // ms
80
80
  AUTO_SAVE_INTERVAL: 30000, // ms
81
81
  MAX_CONTENT_LENGTH: 100000, // characters
82
- PERFORMANCE_WARNING_THRESHOLD: 50000, // characters
82
+ PERFORMANCE_WARNING_THRESHOLD: 50000 // characters
83
83
  };
84
84
 
85
85
  // Layout constraints
@@ -89,7 +89,7 @@ export const LAYOUT = {
89
89
  DEFAULT_SPLIT_SIZES: [50, 50], // [left, right] percentages
90
90
  GUTTER_SIZE: 8, // pixels
91
91
  MOBILE_BREAKPOINT: 768, // pixels
92
- MOBILE_WIDTH_DEFAULT: 375, // pixels
92
+ MOBILE_WIDTH_DEFAULT: 375 // pixels
93
93
  };
94
94
 
95
95
 
@@ -105,7 +105,7 @@ export const CODEMIRROR_CONFIG = {
105
105
  FOLD_GUTTER: true,
106
106
  SEARCH_ENABLED: true,
107
107
  AUTOCOMPLETE_ENABLED: true,
108
- LINT_ENABLED: true,
108
+ LINT_ENABLED: true
109
109
  };
110
110
 
111
111
  // HTML validation rules (HTMLHint)
@@ -126,7 +126,7 @@ export const HTML_VALIDATION_RULES = {
126
126
  'inline-style-disabled': false,
127
127
  'inline-script-disabled': false,
128
128
  'space-tab-mixed-disabled': 'space',
129
- 'spec-char-escape': true,
129
+ 'spec-char-escape': true
130
130
  };
131
131
 
132
132
  // CSS validation rules
@@ -137,7 +137,7 @@ export const CSS_VALIDATION_RULES = {
137
137
  'declaration-colon-space-after': 'always',
138
138
  'declaration-colon-space-before': 'never',
139
139
  'block-closing-brace-newline-after': 'always',
140
- 'block-opening-brace-space-before': 'always',
140
+ 'block-opening-brace-space-before': 'always'
141
141
  };
142
142
 
143
143
  // JavaScript validation rules (ESLint-style)
@@ -148,7 +148,7 @@ export const JS_VALIDATION_RULES = {
148
148
  'no-console': 'warn',
149
149
  'semi': ['error', 'always'],
150
150
  'quotes': ['error', 'single'],
151
- 'indent': ['error', 2],
151
+ 'indent': ['error', 2]
152
152
  };
153
153
 
154
154
  // Keyboard shortcuts
@@ -163,7 +163,7 @@ export const KEYBOARD_SHORTCUTS = {
163
163
  FIND: 'Ctrl+F',
164
164
  FIND_MAC: 'Cmd+F',
165
165
  REPLACE: 'Ctrl+H',
166
- REPLACE_MAC: 'Cmd+Option+F',
166
+ REPLACE_MAC: 'Cmd+Option+F'
167
167
  };
168
168
 
169
169
  // Feature flags
@@ -176,7 +176,7 @@ export const FEATURES = {
176
176
  KEYBOARD_SHORTCUTS: true,
177
177
  ERROR_RECOVERY: true,
178
178
  PERFORMANCE_MONITORING: true,
179
- ACCESSIBILITY_FEATURES: true,
179
+ ACCESSIBILITY_FEATURES: true
180
180
  };
181
181
 
182
182
  // Animation durations (ms)
@@ -186,7 +186,7 @@ export const ANIMATIONS = {
186
186
  SLOW: 500,
187
187
  PANEL_RESIZE: 200,
188
188
  FADE_IN: 300,
189
- SLIDE_IN: 250,
189
+ SLIDE_IN: 250
190
190
  };
191
191
 
192
192
  // Z-index layers
@@ -195,7 +195,7 @@ export const Z_INDEX = {
195
195
  OVERLAY: 1000,
196
196
  MODAL: 1050,
197
197
  FULLSCREEN: 9999,
198
- TOOLTIP: 10000,
198
+ TOOLTIP: 10000
199
199
  };
200
200
 
201
201
  // Default HTML content template
@@ -239,12 +239,3 @@ export const DEFAULT_HTML_CONTENT = `<!DOCTYPE html>
239
239
  </script>
240
240
  </body>
241
241
  </html>`;
242
-
243
- // Constants for tag API calls
244
- export const TAG = 'TAG';
245
- export const EMBEDDED = 'embedded';
246
- export const DEFAULT = 'default';
247
- export const FULL = 'full';
248
- export const ALL = 'all';
249
- export const SMS = 'SMS';
250
- export const EMAIL = 'EMAIL';