@capillarytech/creatives-library 8.0.263 → 8.0.265
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/Android.png +0 -0
- package/assets/iOS.png +0 -0
- package/constants/unified.js +1 -3
- package/initialReducer.js +0 -2
- package/package.json +1 -1
- package/services/api.js +0 -15
- package/services/tests/api.test.js +0 -34
- package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +35 -17
- package/tests/integration/TemplateCreation/api-response.js +1 -31
- package/tests/integration/TemplateCreation/msw-handler.js +0 -2
- package/utils/common.js +0 -11
- package/utils/commonUtils.js +5 -28
- package/utils/tests/commonUtil.test.js +0 -224
- package/utils/tests/transformerUtils.test.js +0 -297
- package/utils/transformTemplateConfig.js +10 -0
- package/utils/transformerUtils.js +0 -40
- package/v2Components/CapDeviceContent/index.js +56 -61
- package/v2Components/CapImageUpload/constants.js +0 -2
- package/v2Components/CapImageUpload/index.js +16 -65
- package/v2Components/CapImageUpload/index.scss +1 -4
- package/v2Components/CapImageUpload/messages.js +1 -5
- package/v2Components/CapTagList/index.js +1 -6
- package/v2Components/CapTagListWithInput/index.js +1 -5
- package/v2Components/CapTagListWithInput/messages.js +1 -1
- package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
- package/v2Components/ErrorInfoNote/index.js +72 -402
- package/v2Components/ErrorInfoNote/messages.js +6 -32
- package/v2Components/ErrorInfoNote/style.scss +6 -278
- package/v2Components/FormBuilder/tests/index.test.js +4 -13
- package/v2Components/HtmlEditor/HTMLEditor.js +99 -418
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1882
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
- package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
- package/v2Components/HtmlEditor/_index.lazy.scss +1 -0
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +102 -23
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +140 -148
- package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
- package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
- package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +1 -9
- package/v2Components/HtmlEditor/components/EditorToolbar/index.js +6 -31
- package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
- package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
- package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
- package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
- package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
- package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
- package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +10 -7
- package/v2Components/HtmlEditor/components/PreviewPane/index.js +43 -22
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +0 -18
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -36
- package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +34 -46
- package/v2Components/HtmlEditor/components/ValidationPanel/index.js +46 -52
- package/v2Components/HtmlEditor/constants.js +20 -45
- package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
- package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +16 -351
- package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
- package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
- package/v2Components/HtmlEditor/hooks/useValidation.js +56 -213
- package/v2Components/HtmlEditor/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +94 -102
- package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +45 -214
- package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +0 -134
- package/v2Components/HtmlEditor/utils/contentSanitizer.js +41 -40
- package/v2Components/HtmlEditor/utils/htmlValidator.js +72 -71
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +124 -158
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
- package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
- package/v2Components/MobilePushPreviewV2/index.js +7 -33
- package/v2Components/TemplatePreview/_templatePreview.scss +24 -55
- package/v2Components/TemplatePreview/index.js +32 -47
- package/v2Components/TemplatePreview/messages.js +0 -4
- package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
- package/v2Containers/App/constants.js +0 -5
- package/v2Containers/BeeEditor/index.js +90 -172
- package/v2Containers/CreativesContainer/SlideBoxContent.js +53 -184
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +13 -163
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -3
- package/v2Containers/CreativesContainer/constants.js +0 -4
- package/v2Containers/CreativesContainer/index.js +46 -408
- package/v2Containers/CreativesContainer/messages.js +0 -12
- package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +0 -210
- package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +50 -342
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -103
- package/v2Containers/Email/actions.js +0 -7
- package/v2Containers/Email/constants.js +1 -5
- package/v2Containers/Email/index.js +36 -237
- package/v2Containers/Email/messages.js +0 -32
- package/v2Containers/Email/reducer.js +1 -12
- package/v2Containers/Email/sagas.js +7 -61
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
- package/v2Containers/Email/tests/reducer.test.js +0 -46
- package/v2Containers/Email/tests/sagas.test.js +29 -320
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +21 -211
- package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
- package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
- package/v2Containers/EmailWrapper/constants.js +0 -2
- package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
- package/v2Containers/EmailWrapper/index.js +23 -103
- package/v2Containers/EmailWrapper/messages.js +1 -65
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -594
- package/v2Containers/InApp/actions.js +0 -7
- package/v2Containers/InApp/constants.js +4 -20
- package/v2Containers/InApp/index.js +359 -802
- package/v2Containers/InApp/index.scss +3 -4
- package/v2Containers/InApp/messages.js +3 -7
- package/v2Containers/InApp/reducer.js +3 -21
- package/v2Containers/InApp/sagas.js +9 -29
- package/v2Containers/InApp/selectors.js +5 -25
- package/v2Containers/InApp/tests/index.test.js +50 -154
- package/v2Containers/InApp/tests/reducer.test.js +0 -34
- package/v2Containers/InApp/tests/sagas.test.js +9 -61
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +0 -3
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +0 -2
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +0 -2
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +0 -9
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -12
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +0 -4
- package/v2Containers/TagList/index.js +19 -62
- package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
- package/v2Containers/Templates/_templates.scss +1 -265
- package/v2Containers/Templates/actions.js +1 -2
- package/v2Containers/Templates/constants.js +0 -1
- package/v2Containers/Templates/index.js +38 -363
- package/v2Containers/Templates/messages.js +0 -28
- package/v2Containers/Templates/reducer.js +0 -2
- package/v2Containers/Templates/tests/index.test.js +0 -10
- package/v2Containers/TemplatesV2/TemplatesV2.style.js +2 -4
- package/v2Containers/TemplatesV2/index.js +7 -15
- package/v2Containers/TemplatesV2/messages.js +0 -4
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +0 -34
- package/utils/imageUrlUpload.js +0 -141
- package/v2Components/CapImageUrlUpload/constants.js +0 -26
- package/v2Components/CapImageUrlUpload/index.js +0 -365
- package/v2Components/CapImageUrlUpload/index.scss +0 -35
- package/v2Components/CapImageUrlUpload/messages.js +0 -47
- package/v2Components/ErrorInfoNote/constants.js +0 -1
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -870
- package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +0 -6
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -281
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -295
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
- package/v2Components/HtmlEditor/utils/validationConstants.js +0 -38
- package/v2Components/MobilePushPreviewV2/constants.js +0 -6
- package/v2Containers/BeePopupEditor/_beePopupEditor.scss +0 -14
- package/v2Containers/BeePopupEditor/constants.js +0 -10
- package/v2Containers/BeePopupEditor/index.js +0 -194
- package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1246
- package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -2472
- package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -956
- package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
- package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
- package/v2Containers/InApp/tests/selectors.test.js +0 -612
- package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -151
- package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
- package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -23
- package/v2Containers/InAppWrapper/constants.js +0 -16
- package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
- package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
- package/v2Containers/InAppWrapper/index.js +0 -148
- package/v2Containers/InAppWrapper/messages.js +0 -49
- package/v2Containers/InappAdvance/index.js +0 -1099
- package/v2Containers/InappAdvance/index.scss +0 -10
- package/v2Containers/InappAdvance/tests/index.test.js +0 -448
- package/v2Containers/WebPush/Create/components/BrandIconSection.js +0 -108
- package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -172
- package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
- package/v2Containers/WebPush/Create/components/ButtonList.js +0 -145
- package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +0 -164
- package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +0 -463
- package/v2Containers/WebPush/Create/components/FormActions.js +0 -54
- package/v2Containers/WebPush/Create/components/FormActions.test.js +0 -163
- package/v2Containers/WebPush/Create/components/MediaSection.js +0 -142
- package/v2Containers/WebPush/Create/components/MediaSection.test.js +0 -341
- package/v2Containers/WebPush/Create/components/MessageSection.js +0 -103
- package/v2Containers/WebPush/Create/components/MessageSection.test.js +0 -268
- package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +0 -87
- package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +0 -210
- package/v2Containers/WebPush/Create/components/TemplateNameSection.js +0 -54
- package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +0 -143
- package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +0 -86
- package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +0 -16
- package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +0 -41
- package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +0 -54
- package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +0 -37
- package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +0 -21
- package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
- package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
- package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
- package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -78
- package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +0 -138
- package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +0 -406
- package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +0 -30
- package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +0 -151
- package/v2Containers/WebPush/Create/hooks/useImageUpload.js +0 -104
- package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +0 -538
- package/v2Containers/WebPush/Create/hooks/useTagManagement.js +0 -122
- package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +0 -633
- package/v2Containers/WebPush/Create/index.js +0 -1148
- package/v2Containers/WebPush/Create/index.scss +0 -134
- package/v2Containers/WebPush/Create/messages.js +0 -211
- package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -228
- package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -294
- package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -90
- package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -305
- package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -25
- package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -155
- package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
- package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
- package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +0 -9
- package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +0 -9
- package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
- package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
- package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +0 -9
- package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +0 -9
- package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
- package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
- package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +0 -9
- package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +0 -9
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -51
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -145
- package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
- package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -68
- package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -61
- package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -99
- package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -733
- package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +0 -571
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -85
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +0 -81
- package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -50
- package/v2Containers/WebPush/Create/preview/constants.js +0 -637
- package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -79
- package/v2Containers/WebPush/Create/preview/preview.scss +0 -358
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -370
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -47
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -207
- package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -153
- package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
- package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -101
- package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -229
- package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
- package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1081
- package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
- package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -1327
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -131
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -112
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -129
- package/v2Containers/WebPush/Create/utils/payloadBuilder.js +0 -96
- package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +0 -396
- package/v2Containers/WebPush/Create/utils/previewUtils.js +0 -89
- package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -115
- package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
- package/v2Containers/WebPush/Create/utils/validation.js +0 -75
- package/v2Containers/WebPush/Create/utils/validation.test.js +0 -283
- package/v2Containers/WebPush/actions.js +0 -60
- package/v2Containers/WebPush/constants.js +0 -132
- package/v2Containers/WebPush/index.js +0 -2
- package/v2Containers/WebPush/reducer.js +0 -104
- package/v2Containers/WebPush/sagas.js +0 -119
- package/v2Containers/WebPush/selectors.js +0 -65
- package/v2Containers/WebPush/tests/reducer.test.js +0 -863
- package/v2Containers/WebPush/tests/sagas.test.js +0 -566
- package/v2Containers/WebPush/tests/selectors.test.js +0 -960
|
@@ -7,8 +7,6 @@ import { html } from '@codemirror/lang-html';
|
|
|
7
7
|
import { syntaxHighlighting, HighlightStyle } from '@codemirror/language';
|
|
8
8
|
import { tags } from '@lezer/highlight';
|
|
9
9
|
import { EditorView } from '@codemirror/view';
|
|
10
|
-
import { VALIDATION_SEVERITY } from '../constants';
|
|
11
|
-
import { ISSUE_SOURCES } from './validationConstants';
|
|
12
10
|
|
|
13
11
|
/**
|
|
14
12
|
* Liquid Template Syntax Patterns
|
|
@@ -36,7 +34,7 @@ export const LIQUID_PATTERNS = {
|
|
|
36
34
|
OPERATORS: /\b(and|or|not|contains|in|==|!=|<|>|<=|>=)\b/g,
|
|
37
35
|
|
|
38
36
|
// String literals in Liquid
|
|
39
|
-
STRING_LITERALS: /(["'])((?:\\.|(?!\1)[^\\])*?)\1/g
|
|
37
|
+
STRING_LITERALS: /(["'])((?:\\.|(?!\1)[^\\])*?)\1/g
|
|
40
38
|
};
|
|
41
39
|
|
|
42
40
|
/**
|
|
@@ -70,7 +68,7 @@ export const liquidVSCodeTheme = HighlightStyle.define([
|
|
|
70
68
|
{ tag: tags.atom, color: '#4ec9b0' }, // Liquid filters
|
|
71
69
|
{ tag: tags.punctuation, color: '#d4d4d4' },
|
|
72
70
|
{ tag: tags.bracket, color: '#ffd700' },
|
|
73
|
-
{ tag: tags.brace, color: '#ffd700' }
|
|
71
|
+
{ tag: tags.brace, color: '#ffd700' }
|
|
74
72
|
]);
|
|
75
73
|
|
|
76
74
|
/**
|
|
@@ -147,13 +145,13 @@ export class LiquidValidator {
|
|
|
147
145
|
} else {
|
|
148
146
|
// Stray closing brace - no matching opening brace
|
|
149
147
|
this.errors.push({
|
|
150
|
-
type:
|
|
148
|
+
type: 'error',
|
|
151
149
|
message: 'Stray closing }} without matching opening {{',
|
|
152
150
|
line: this.getLineNumber(html, position),
|
|
153
151
|
column: 1,
|
|
154
152
|
rule: 'liquid-stray-closing-output',
|
|
155
|
-
severity:
|
|
156
|
-
source:
|
|
153
|
+
severity: 'error',
|
|
154
|
+
source: 'liquid-validator'
|
|
157
155
|
});
|
|
158
156
|
}
|
|
159
157
|
}
|
|
@@ -162,15 +160,15 @@ export class LiquidValidator {
|
|
|
162
160
|
// After scan, any remaining entries on stack are unclosed opening braces
|
|
163
161
|
if (stack.length > 0) {
|
|
164
162
|
// Report each unclosed opening brace
|
|
165
|
-
stack.forEach(
|
|
163
|
+
stack.forEach(position => {
|
|
166
164
|
this.errors.push({
|
|
167
|
-
type:
|
|
165
|
+
type: 'error',
|
|
168
166
|
message: 'unclosed Liquid output tag - missing }}',
|
|
169
167
|
line: this.getLineNumber(html, position),
|
|
170
168
|
column: 1,
|
|
171
169
|
rule: 'liquid-unclosed-output',
|
|
172
|
-
severity:
|
|
173
|
-
source:
|
|
170
|
+
severity: 'error',
|
|
171
|
+
source: 'liquid-validator'
|
|
174
172
|
});
|
|
175
173
|
});
|
|
176
174
|
}
|
|
@@ -199,13 +197,13 @@ export class LiquidValidator {
|
|
|
199
197
|
if (openTags.length > closeTags.length) {
|
|
200
198
|
const unmatchedCount = openTags.length - closeTags.length;
|
|
201
199
|
this.errors.push({
|
|
202
|
-
type:
|
|
200
|
+
type: 'error',
|
|
203
201
|
message: `${unmatchedCount} unclosed Liquid logic tag(s) - missing %}`,
|
|
204
202
|
line: this.getLineNumber(html, openTags[openTags.length - 1]),
|
|
205
203
|
column: 1,
|
|
206
204
|
rule: 'liquid-unclosed-logic',
|
|
207
|
-
severity:
|
|
208
|
-
source:
|
|
205
|
+
severity: 'error',
|
|
206
|
+
source: 'liquid-validator'
|
|
209
207
|
});
|
|
210
208
|
}
|
|
211
209
|
}
|
|
@@ -218,15 +216,15 @@ export class LiquidValidator {
|
|
|
218
216
|
const nestedOutputPattern = /\{\{[^}]*\{\{[^}]*\}\}/g;
|
|
219
217
|
const nestedOutput = html.match(nestedOutputPattern);
|
|
220
218
|
if (nestedOutput) {
|
|
221
|
-
nestedOutput.forEach(
|
|
219
|
+
nestedOutput.forEach(match => {
|
|
222
220
|
this.errors.push({
|
|
223
|
-
type:
|
|
221
|
+
type: 'error',
|
|
224
222
|
message: `Nested braces in Liquid output tag: ${match}`,
|
|
225
223
|
line: this.getLineNumber(html, html.indexOf(match)),
|
|
226
224
|
column: 1,
|
|
227
225
|
rule: 'liquid-nested-braces',
|
|
228
|
-
severity:
|
|
229
|
-
source:
|
|
226
|
+
severity: 'error',
|
|
227
|
+
source: 'liquid-validator'
|
|
230
228
|
});
|
|
231
229
|
});
|
|
232
230
|
}
|
|
@@ -235,15 +233,15 @@ export class LiquidValidator {
|
|
|
235
233
|
const nestedLogicPattern = /\{%[^%]*\{%[^%]*%\}/g;
|
|
236
234
|
const nestedLogic = html.match(nestedLogicPattern);
|
|
237
235
|
if (nestedLogic) {
|
|
238
|
-
nestedLogic.forEach(
|
|
236
|
+
nestedLogic.forEach(match => {
|
|
239
237
|
this.errors.push({
|
|
240
|
-
type:
|
|
238
|
+
type: 'error',
|
|
241
239
|
message: `Nested braces in Liquid logic tag: ${match}`,
|
|
242
240
|
line: this.getLineNumber(html, html.indexOf(match)),
|
|
243
241
|
column: 1,
|
|
244
242
|
rule: 'liquid-nested-braces',
|
|
245
|
-
severity:
|
|
246
|
-
source:
|
|
243
|
+
severity: 'error',
|
|
244
|
+
source: 'liquid-validator'
|
|
247
245
|
});
|
|
248
246
|
});
|
|
249
247
|
}
|
|
@@ -264,10 +262,10 @@ export class LiquidValidator {
|
|
|
264
262
|
|
|
265
263
|
logicTags.push({
|
|
266
264
|
full: match[0],
|
|
267
|
-
content,
|
|
268
|
-
keyword,
|
|
265
|
+
content: content,
|
|
266
|
+
keyword: keyword,
|
|
269
267
|
position: match.index,
|
|
270
|
-
line: this.getLineNumber(html, match.index)
|
|
268
|
+
line: this.getLineNumber(html, match.index)
|
|
271
269
|
});
|
|
272
270
|
}
|
|
273
271
|
|
|
@@ -281,78 +279,61 @@ export class LiquidValidator {
|
|
|
281
279
|
validateBalancedTags(logicTags) {
|
|
282
280
|
const stack = [];
|
|
283
281
|
const pairs = {
|
|
284
|
-
if: 'endif',
|
|
285
|
-
unless: 'endunless',
|
|
286
|
-
for: 'endfor',
|
|
287
|
-
case: 'endcase',
|
|
288
|
-
capture: 'endcapture',
|
|
289
|
-
comment: 'endcomment',
|
|
290
|
-
tablerow: 'endtablerow',
|
|
291
|
-
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'
|
|
292
290
|
};
|
|
293
291
|
|
|
294
|
-
logicTags.forEach(
|
|
295
|
-
const
|
|
292
|
+
logicTags.forEach(tag => {
|
|
293
|
+
const keyword = tag.keyword;
|
|
296
294
|
|
|
297
295
|
if (pairs[keyword]) {
|
|
298
296
|
// Opening tag
|
|
299
297
|
stack.push({ keyword, tag });
|
|
300
298
|
} else if (Object.values(pairs).includes(keyword)) {
|
|
301
299
|
// Closing tag
|
|
302
|
-
const expectedOpening = Object.keys(pairs).find(
|
|
300
|
+
const expectedOpening = Object.keys(pairs).find(key => pairs[key] === keyword);
|
|
303
301
|
const lastOpening = stack.pop();
|
|
304
302
|
|
|
305
303
|
if (!lastOpening) {
|
|
306
304
|
this.errors.push({
|
|
307
|
-
type:
|
|
305
|
+
type: 'error',
|
|
308
306
|
message: `Unexpected closing tag: {% ${keyword} %}`,
|
|
309
307
|
line: tag.line,
|
|
310
308
|
column: 1,
|
|
311
309
|
rule: 'liquid-unexpected-closing',
|
|
312
|
-
severity:
|
|
313
|
-
source:
|
|
310
|
+
severity: 'error',
|
|
311
|
+
source: 'liquid-validator'
|
|
314
312
|
});
|
|
315
313
|
} else if (lastOpening.keyword !== expectedOpening) {
|
|
316
314
|
this.errors.push({
|
|
317
|
-
type:
|
|
315
|
+
type: 'error',
|
|
318
316
|
message: `Mismatched Liquid tags: {% ${lastOpening.keyword} %} ... {% ${keyword} %}`,
|
|
319
317
|
line: tag.line,
|
|
320
318
|
column: 1,
|
|
321
319
|
rule: 'liquid-mismatched-tags',
|
|
322
|
-
severity:
|
|
323
|
-
source:
|
|
320
|
+
severity: 'error',
|
|
321
|
+
source: 'liquid-validator'
|
|
324
322
|
});
|
|
325
323
|
}
|
|
326
324
|
}
|
|
327
325
|
});
|
|
328
326
|
|
|
329
327
|
// Check for unclosed opening tags
|
|
330
|
-
|
|
331
|
-
stack.forEach(({ keyword, tag }) => {
|
|
332
|
-
const expectedClosing = pairs[keyword];
|
|
333
|
-
const error = {
|
|
334
|
-
type: VALIDATION_SEVERITY.ERROR,
|
|
335
|
-
message: `Unclosed Liquid tag: {% ${keyword} %} - missing {% ${expectedClosing} %}`,
|
|
336
|
-
line: tag.line,
|
|
337
|
-
column: 1,
|
|
338
|
-
rule: 'liquid-unclosed-tag',
|
|
339
|
-
severity: VALIDATION_SEVERITY.ERROR,
|
|
340
|
-
source: ISSUE_SOURCES.LIQUID,
|
|
341
|
-
};
|
|
342
|
-
this.errors.push(error);
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
// Check for unclosed opening tags
|
|
347
|
-
stack.forEach((unclosed) => {
|
|
328
|
+
stack.forEach(unclosed => {
|
|
348
329
|
this.errors.push({
|
|
349
|
-
type:
|
|
330
|
+
type: 'error',
|
|
350
331
|
message: `Unclosed Liquid tag: {% ${unclosed.keyword} %}`,
|
|
351
332
|
line: unclosed.tag.line,
|
|
352
333
|
column: 1,
|
|
353
334
|
rule: 'liquid-unclosed-tag',
|
|
354
|
-
severity:
|
|
355
|
-
source:
|
|
335
|
+
severity: 'error',
|
|
336
|
+
source: 'liquid-validator'
|
|
356
337
|
});
|
|
357
338
|
});
|
|
358
339
|
}
|
|
@@ -364,52 +345,35 @@ export class LiquidValidator {
|
|
|
364
345
|
// Check for malformed filters
|
|
365
346
|
const malformedFilters = html.match(/\|\s*\||\|\s*$/gm);
|
|
366
347
|
if (malformedFilters) {
|
|
367
|
-
malformedFilters.forEach(
|
|
348
|
+
malformedFilters.forEach(match => {
|
|
368
349
|
this.warnings.push({
|
|
369
|
-
type:
|
|
350
|
+
type: 'warning',
|
|
370
351
|
message: `Malformed Liquid filter: ${match.trim()}`,
|
|
371
352
|
line: this.getLineNumber(html, html.indexOf(match)),
|
|
372
353
|
column: 1,
|
|
373
354
|
rule: 'liquid-malformed-filter',
|
|
374
|
-
severity:
|
|
375
|
-
source:
|
|
355
|
+
severity: 'warning',
|
|
356
|
+
source: 'liquid-validator'
|
|
376
357
|
});
|
|
377
358
|
});
|
|
378
359
|
}
|
|
379
360
|
|
|
380
361
|
// Check for common filter usage
|
|
381
|
-
|
|
382
|
-
// This list includes standard Liquid filters to avoid false positives
|
|
383
|
-
const commonFilters = [
|
|
384
|
-
// String filters
|
|
385
|
-
'capitalize', 'upcase', 'downcase', 'strip', 'lstrip', 'rstrip', 'strip_html', 'strip_newlines',
|
|
386
|
-
'truncate', 'truncatewords', 'prepend', 'append', 'remove', 'remove_first', 'replace', 'replace_first',
|
|
387
|
-
'split', 'join', 'concat', 'escape', 'escape_once', 'newline_to_br',
|
|
388
|
-
// Array filters
|
|
389
|
-
'first', 'last', 'size', 'slice', 'sort', 'sort_natural', 'map', 'where', 'uniq', 'compact', 'reverse',
|
|
390
|
-
// Number filters
|
|
391
|
-
'abs', 'ceil', 'floor', 'round', 'times', 'divided_by', 'modulo', 'minus', 'plus', 'at_least', 'at_most',
|
|
392
|
-
// Date filters
|
|
393
|
-
'date',
|
|
394
|
-
// Other common filters
|
|
395
|
-
'default', 'url_encode', 'url_decode',
|
|
396
|
-
];
|
|
362
|
+
const commonFilters = ['date', 'capitalize', 'upcase', 'downcase', 'strip', 'truncate', 'default'];
|
|
397
363
|
const filterPattern = /\|\s*([a-zA-Z_][a-zA-Z0-9_]*)/g;
|
|
398
364
|
let filterMatch;
|
|
399
365
|
|
|
400
366
|
while ((filterMatch = filterPattern.exec(html)) !== null) {
|
|
401
367
|
const filterName = filterMatch[1];
|
|
402
368
|
if (!commonFilters.includes(filterName)) {
|
|
403
|
-
// Only show info for truly custom/unknown filters
|
|
404
|
-
// Standard Liquid filters are now included in commonFilters list
|
|
405
369
|
this.info.push({
|
|
406
|
-
type:
|
|
370
|
+
type: 'info',
|
|
407
371
|
message: `Using filter: ${filterName}`,
|
|
408
372
|
line: this.getLineNumber(html, filterMatch.index),
|
|
409
373
|
column: 1,
|
|
410
374
|
rule: 'liquid-filter-usage',
|
|
411
|
-
severity:
|
|
412
|
-
source:
|
|
375
|
+
severity: 'info',
|
|
376
|
+
source: 'liquid-validator'
|
|
413
377
|
});
|
|
414
378
|
}
|
|
415
379
|
}
|
|
@@ -422,15 +386,15 @@ export class LiquidValidator {
|
|
|
422
386
|
// Check for undefined variable patterns (basic check)
|
|
423
387
|
const suspiciousVariables = html.match(/\{\{\s*[^}]*undefined[^}]*\s*\}\}/g);
|
|
424
388
|
if (suspiciousVariables) {
|
|
425
|
-
suspiciousVariables.forEach(
|
|
389
|
+
suspiciousVariables.forEach(match => {
|
|
426
390
|
this.warnings.push({
|
|
427
|
-
type:
|
|
391
|
+
type: 'warning',
|
|
428
392
|
message: `Potentially undefined variable: ${match}`,
|
|
429
393
|
line: this.getLineNumber(html, html.indexOf(match)),
|
|
430
394
|
column: 1,
|
|
431
395
|
rule: 'liquid-undefined-variable',
|
|
432
|
-
severity:
|
|
433
|
-
source:
|
|
396
|
+
severity: 'warning',
|
|
397
|
+
source: 'liquid-validator'
|
|
434
398
|
});
|
|
435
399
|
});
|
|
436
400
|
}
|
|
@@ -453,7 +417,7 @@ export class LiquidValidator {
|
|
|
453
417
|
isValid: this.errors.length === 0,
|
|
454
418
|
errors: this.errors,
|
|
455
419
|
warnings: this.warnings,
|
|
456
|
-
info: this.info
|
|
420
|
+
info: this.info
|
|
457
421
|
};
|
|
458
422
|
}
|
|
459
423
|
}
|
|
@@ -461,58 +425,60 @@ export class LiquidValidator {
|
|
|
461
425
|
/**
|
|
462
426
|
* Enhanced CodeMirror extensions with Liquid support
|
|
463
427
|
*/
|
|
464
|
-
export const createLiquidExtensions = () =>
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
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
|
+
};
|
|
516
482
|
|
|
517
483
|
/**
|
|
518
484
|
* Validates HTML content with Liquid template support
|
|
@@ -530,22 +496,22 @@ export const validateLiquidHTML = (html, variant = 'email') => {
|
|
|
530
496
|
*/
|
|
531
497
|
export const LIQUID_SNIPPETS = {
|
|
532
498
|
// Output tags
|
|
533
|
-
customer_name: '{{ customer.first_name }} {{ customer.last_name }}',
|
|
534
|
-
customer_email: '{{ customer.email }}',
|
|
535
|
-
current_date: '{{ "now" | date: "%B %d, %Y" }}',
|
|
536
|
-
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 }}',
|
|
537
503
|
|
|
538
504
|
// Logic tags
|
|
539
|
-
if_statement: '{% if condition %}\n <!-- content -->\n{% endif %}',
|
|
540
|
-
for_loop: '{% for item in collection %}\n {{ item.name }}\n{% endfor %}',
|
|
541
|
-
unless_statement: '{% unless condition %}\n <!-- content -->\n{% endunless %}',
|
|
542
|
-
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 %}',
|
|
543
509
|
|
|
544
510
|
// Common filters
|
|
545
|
-
date_filter: '{{ date_variable | date: "%B %d, %Y" }}',
|
|
546
|
-
capitalize_filter: '{{ text | capitalize }}',
|
|
547
|
-
truncate_filter: '{{ text | truncate: 50 }}',
|
|
548
|
-
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" }}'
|
|
549
515
|
};
|
|
550
516
|
|
|
551
517
|
export default {
|
|
@@ -554,5 +520,5 @@ export default {
|
|
|
554
520
|
LiquidValidator,
|
|
555
521
|
createLiquidExtensions,
|
|
556
522
|
validateLiquidHTML,
|
|
557
|
-
LIQUID_SNIPPETS
|
|
523
|
+
LIQUID_SNIPPETS
|
|
558
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"
|
|
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
|
-
|
|
147
|
-
|
|
145
|
+
export const createRobustExtensions = () => {
|
|
146
|
+
return [
|
|
147
|
+
// 1. HTML language support with proper parsing
|
|
148
|
+
html(),
|
|
148
149
|
|
|
149
|
-
|
|
150
|
-
|
|
150
|
+
// 2. SAFE syntax highlighting (using only confirmed tags)
|
|
151
|
+
syntaxHighlighting(comprehensiveVSCodeTheme),
|
|
151
152
|
|
|
152
|
-
|
|
153
|
-
|
|
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
|
+
};
|