@contentful/experiences-visual-editor-react 1.42.0-dev-20250630T1149-4da2e67.0 → 1.42.0-prerelease-20250620T0958-8e54295.0

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/dist/index.js CHANGED
@@ -12,8 +12,8 @@ import { v4 } from 'uuid';
12
12
  import { createPortal } from 'react-dom';
13
13
  import classNames from 'classnames';
14
14
 
15
- var css_248z$4 = "html,\nbody {\n margin: 0;\n padding: 0;\n}\n\n/*\n * All of these variables are tokens from Forma-36 and should not be adjusted as these\n * are global variables that may affect multiple places.\n * As our customers may use other design libraries, we try to avoid overlapping global\n * variables by always using the prefix `--exp-builder-` inside this SDK.\n */\n\n:root {\n /* Color tokens from Forma 36: https://f36.contentful.com/tokens/color-system */\n --exp-builder-blue100: #e8f5ff;\n --exp-builder-blue200: #ceecff;\n --exp-builder-blue300: #98cbff;\n --exp-builder-blue400: #40a0ff;\n --exp-builder-blue500: #036fe3;\n --exp-builder-blue600: #0059c8;\n --exp-builder-blue700: #0041ab;\n --exp-builder-blue800: #003298;\n --exp-builder-blue900: #002a8e;\n --exp-builder-gray100: #f7f9fa;\n --exp-builder-gray200: #e7ebee;\n --exp-builder-gray300: #cfd9e0;\n --exp-builder-gray400: #aec1cc;\n --exp-builder-gray500: #67728a;\n --exp-builder-gray600: #5a657c;\n --exp-builder-gray700: #414d63;\n --exp-builder-gray800: #1b273a;\n --exp-builder-gray900: #111b2b;\n --exp-builder-purple600: #6c3ecf;\n --exp-builder-red200: #ffe0e0;\n --exp-builder-red800: #7f0010;\n --exp-builder-color-white: #ffffff;\n --exp-builder-glow-primary: 0px 0px 0px 3px #e8f5ff;\n\n /* RGB colors for applying opacity */\n --exp-builder-blue100-rgb: 232, 245, 255;\n --exp-builder-blue300-rgb: 152, 203, 255;\n\n /* Spacing tokens from Forma 36: https://f36.contentful.com/tokens/spacing */\n --exp-builder-spacing-s: 0.75rem;\n --exp-builder-spacing-2xs: 0.25rem;\n\n /* Typography tokens from Forma 36: https://f36.contentful.com/tokens/typography */\n --exp-builder-font-size-l: 1rem;\n --exp-builder-font-size-m: 0.875rem;\n --exp-builder-font-stack-primary: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;\n --exp-builder-line-height-condensed: 1.25;\n}\n";
16
- styleInject(css_248z$4);
15
+ var css_248z$b = "html,\nbody {\n margin: 0;\n padding: 0;\n}\n\n/*\n * All of these variables are tokens from Forma-36 and should not be adjusted as these\n * are global variables that may affect multiple places.\n * As our customers may use other design libraries, we try to avoid overlapping global\n * variables by always using the prefix `--exp-builder-` inside this SDK.\n */\n\n:root {\n /* Color tokens from Forma 36: https://f36.contentful.com/tokens/color-system */\n --exp-builder-blue100: #e8f5ff;\n --exp-builder-blue200: #ceecff;\n --exp-builder-blue300: #98cbff;\n --exp-builder-blue400: #40a0ff;\n --exp-builder-blue500: #036fe3;\n --exp-builder-blue600: #0059c8;\n --exp-builder-blue700: #0041ab;\n --exp-builder-blue800: #003298;\n --exp-builder-blue900: #002a8e;\n --exp-builder-gray100: #f7f9fa;\n --exp-builder-gray200: #e7ebee;\n --exp-builder-gray300: #cfd9e0;\n --exp-builder-gray400: #aec1cc;\n --exp-builder-gray500: #67728a;\n --exp-builder-gray600: #5a657c;\n --exp-builder-gray700: #414d63;\n --exp-builder-gray800: #1b273a;\n --exp-builder-gray900: #111b2b;\n --exp-builder-purple600: #6c3ecf;\n --exp-builder-red200: #ffe0e0;\n --exp-builder-red800: #7f0010;\n --exp-builder-color-white: #ffffff;\n --exp-builder-glow-primary: 0px 0px 0px 3px #e8f5ff;\n\n /* RGB colors for applying opacity */\n --exp-builder-blue100-rgb: 232, 245, 255;\n --exp-builder-blue300-rgb: 152, 203, 255;\n\n /* Spacing tokens from Forma 36: https://f36.contentful.com/tokens/spacing */\n --exp-builder-spacing-s: 0.75rem;\n --exp-builder-spacing-2xs: 0.25rem;\n\n /* Typography tokens from Forma 36: https://f36.contentful.com/tokens/typography */\n --exp-builder-font-size-l: 1rem;\n --exp-builder-font-size-m: 0.875rem;\n --exp-builder-font-stack-primary: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;\n --exp-builder-line-height-condensed: 1.25;\n}\n";
16
+ styleInject(css_248z$b);
17
17
 
18
18
  const INCOMING_EVENTS$1 = {
19
19
  RequestEditorMode: 'requestEditorMode',
@@ -721,11 +721,11 @@ const ComponentPropertyValueSchema$1 = z.discriminatedUnion('type', [
721
721
  ]);
722
722
  // TODO: finalize schema structure before release
723
723
  // https://contentful.atlassian.net/browse/LUMOS-523
724
- const ParameterSchema$1 = z.object({
724
+ const PatternPropertySchema$1 = z.object({
725
725
  type: z.literal('BoundValue'),
726
726
  path: z.string(),
727
727
  });
728
- const ParametersSchema$1 = z.record(propertyKeySchema$1, ParameterSchema$1);
728
+ const ParametersSchema$1 = z.record(propertyKeySchema$1, PatternPropertySchema$1);
729
729
  const BreakpointSchema$1 = z
730
730
  .object({
731
731
  id: propertyKeySchema$1,
@@ -811,25 +811,21 @@ const THUMBNAIL_IDS$1 = [
811
811
  // TODO: finalize schema structure before release
812
812
  // https://contentful.atlassian.net/browse/LUMOS-523
813
813
  const VariableMappingSchema$1 = z.object({
814
- parameterId: propertyKeySchema$1,
814
+ parameterDefinitionId: propertyKeySchema$1,
815
815
  type: z.literal('ContentTypeMapping'),
816
816
  pathsByContentType: z.record(z.string(), z.object({ path: z.string() })),
817
817
  });
818
818
  // TODO: finalize schema structure before release
819
819
  // https://contentful.atlassian.net/browse/LUMOS-523
820
820
  const ParameterDefinitionSchema$1 = z.object({
821
- defaultSource: z
822
- .strictObject({
823
- type: z.enum(['Entry']),
824
- contentTypeId: z.string(),
825
- link: z.strictObject({
826
- sys: z.strictObject({
827
- type: z.literal('Link'),
828
- id: z.string(),
829
- linkType: z.enum(['Entry']),
830
- }),
821
+ defaultValue: z
822
+ .record(z.string(), z.object({
823
+ sys: z.object({
824
+ type: z.literal('Link'),
825
+ id: z.string(),
826
+ linkType: z.enum(['Entry']),
831
827
  }),
832
- })
828
+ }))
833
829
  .optional(),
834
830
  contentTypes: z.record(z.string(), z.object({
835
831
  sys: z.object({
@@ -3166,9 +3162,9 @@ const cloneDeepAsPOJO = (obj) => {
3166
3162
  return JSON.parse(JSON.stringify(obj));
3167
3163
  };
3168
3164
 
3169
- var css_248z$3 = ".render-module_hitbox__l4ysJ {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 10px;\n z-index: 1000000;\n}\n\n.render-module_hitboxLower__tgsA1 {\n position: absolute;\n bottom: -20px;\n left: 0;\n width: 100%;\n height: 20px;\n z-index: 1000000;\n}\n\n.render-module_canvasBottomSpacer__JuxVh {\n position: absolute;\n width: 100%;\n height: 50px;\n}\n\n.render-module_container__-C3d7 {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\nbody {\n margin: 0;\n}\n\nhtml {\n -ms-overflow-style: none; /* Internet Explorer 10+ */\n scrollbar-width: none; /* Firefox */\n}\n\nhtml::-webkit-scrollbar {\n display: none;\n}\n";
3165
+ var css_248z$a = ".render-module_hitbox__l4ysJ {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 10px;\n z-index: 1000000;\n}\n\n.render-module_hitboxLower__tgsA1 {\n position: absolute;\n bottom: -20px;\n left: 0;\n width: 100%;\n height: 20px;\n z-index: 1000000;\n}\n\n.render-module_canvasBottomSpacer__JuxVh {\n position: absolute;\n width: 100%;\n height: 50px;\n}\n\n.render-module_container__-C3d7 {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\nbody {\n margin: 0;\n}\n\nhtml {\n -ms-overflow-style: none; /* Internet Explorer 10+ */\n scrollbar-width: none; /* Firefox */\n}\n\nhtml::-webkit-scrollbar {\n display: none;\n}\n";
3170
3166
  var styles$3 = {"hitbox":"render-module_hitbox__l4ysJ","hitboxLower":"render-module_hitboxLower__tgsA1","canvasBottomSpacer":"render-module_canvasBottomSpacer__JuxVh","container":"render-module_container__-C3d7"};
3171
- styleInject(css_248z$3);
3167
+ styleInject(css_248z$a);
3172
3168
 
3173
3169
  // TODO: In order to support integrations without React, we should extract this heavy logic into simple
3174
3170
  // functions that we can reuse in other frameworks.
@@ -3335,6 +3331,9 @@ const useEditorStore = create((set, get) => ({
3335
3331
  },
3336
3332
  }));
3337
3333
 
3334
+ var css_248z$8 = "/* Initially added with PR #253 for each component, this is now a global setting\n * It is recommended on MDN to use this as a default for layouting.\n*/\n* {\n box-sizing: border-box;\n}\n";
3335
+ styleInject(css_248z$8);
3336
+
3338
3337
  /**
3339
3338
  * These modes are ONLY intended to be internally used within the context of
3340
3339
  * editing an experience inside of Contentful Studio. i.e. these modes
@@ -3352,6 +3351,21 @@ var PostMessageMethods$1;
3352
3351
  PostMessageMethods["REQUESTED_ENTITIES"] = "REQUESTED_ENTITIES";
3353
3352
  })(PostMessageMethods$1 || (PostMessageMethods$1 = {}));
3354
3353
 
3354
+ var css_248z$7 = "/* If the label is empty, still render the normal height by adding this pseudo element */\n.cf-button:empty::before {\n content: '';\n display: inline-block;\n}\n";
3355
+ styleInject(css_248z$7);
3356
+
3357
+ var css_248z$6 = ".cf-heading {\n white-space: pre-line;\n}\n";
3358
+ styleInject(css_248z$6);
3359
+
3360
+ var css_248z$5 = ".cf-richtext {\n white-space: pre-line;\n}\n\n.cf-richtext > *:first-child {\n margin-top: 0;\n}\n\n.cf-richtext > *:last-child {\n margin-bottom: 0;\n}\n";
3361
+ styleInject(css_248z$5);
3362
+
3363
+ var css_248z$4 = ".cf-text {\n white-space: pre-line;\n}\n\n.cf-text-link .cf-text {\n margin: 0;\n}\n";
3364
+ styleInject(css_248z$4);
3365
+
3366
+ var css_248z$3 = "@import url(https://fonts.googleapis.com/css2?family=Archivo:ital,wght@0,400;0,500;0,600;1,400;1,600&display=swap);\n\n:root {\n /* All sizing comments based of 16px base body font size */\n\n /* color */\n --cf-color-white: #fff;\n --cf-color-black: #000;\n --cf-color-gray100: #f7f9fa;\n --cf-color-gray400: #aec1cc;\n --cf-color-gray400-rgb: 174, 193, 204;\n\n /* spacing */\n --cf-spacing-0: 0rem; /* 0px */\n --cf-spacing-1: 0.125rem; /* 2px */\n --cf-spacing-2: 0.25rem; /* 4px */\n --cf-spacing-3: 0.375rem; /* 6px */\n --cf-spacing-4: 0.5rem; /* 8px */\n --cf-spacing-5: 0.625rem; /* 10px */\n --cf-spacing-6: 0.75rem; /* 12px */\n --cf-spacing-7: 0.875rem; /* 14px */\n --cf-spacing-8: 1rem; /* 16px */\n --cf-spacing-9: 1.25rem; /* 20px */\n --cf-spacing-10: 1.5rem; /* 24px */\n --cf-spacing-11: 1.75rem; /* 28px */\n --cf-spacing-12: 2rem; /* 32px */\n --cf-spacing-13: 2.25rem; /* 36px */\n\n /* font-size */\n --cf-text-xs: 0.75rem; /* 12px */\n --cf-text-sm: 0.875rem; /* 14px */\n --cf-text-base: 1rem; /* 16px */\n --cf-text-lg: 1.125rem; /* 18px */\n --cf-text-xl: 1.25rem; /* 20px */\n --cf-text-2xl: 1.5rem; /* 24px */\n --cf-text-3xl: 2rem; /* 32px */\n --cf-text-4xl: 2.75rem; /* 44px */\n\n /* font-weight */\n --cf-font-light: 300;\n --cf-font-normal: 400;\n --cf-font-medium: 500;\n --cf-font-semibold: 600;\n --cf-font-bold: 700;\n --cf-font-extra-bold: 800;\n --cf-font-black: 900;\n\n /* border-radius */\n --cf-border-radius-none: 0px; /* none */\n --cf-border-radius-sm: 0.125rem; /* 2px */\n --cf-border-radius: 0.25rem; /* 4px */\n --cf-border-radius-md: 0.375rem; /* 6px */\n --cf-border-radius-lg: 0.5rem; /* 8px */\n --cf-border-radius-xl: 0.75rem; /* 12px */\n --cf-border-radius-2xl: 1rem; /* 16px */\n --cf-border-radius-3xl: 1.5rem; /* 24px */\n --cf-border-radius-full: 9999px; /* full */\n\n /* font-family */\n --cf-font-family-sans: Archivo, Helvetica, Arial, sans-serif;\n --cf-font-family-serif: Georgia, Cambria, Times New Roman, Times, serif;\n\n /* max widths */\n --cf-max-width-full: 100%;\n\n /* component specific colors */\n --cf-button-bg: var(--cf-color-black);\n --cf-button-color: var(--cf-color-white);\n --cf-text-color: var(--cf-color-black);\n}\n\ndiv.cf-placeholder-wrapper {\n /* Required for the absolute positioned icon to render in the center */\n position: relative;\n}\n\nimg.cf-placeholder-image {\n background-color: var(--cf-color-gray100);\n outline-offset: -2px;\n outline: 2px solid rgba(var(--cf-color-gray400-rgb), 0.5);\n width: 100%;\n height: 100%;\n}\n\nsvg.cf-placeholder-icon {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n height: var(--cf-text-3xl);\n width: var(--cf-text-3xl);\n max-height: 100%;\n max-width: 100%;\n}\n\nsvg.cf-placeholder-icon path {\n fill: var(--cf-color-gray400);\n}\n";
3367
+ styleInject(css_248z$3);
3368
+
3355
3369
  /**
3356
3370
  * These modes are ONLY intended to be internally used within the context of
3357
3371
  * editing an experience inside of Contentful Studio. i.e. these modes
@@ -3564,11 +3578,11 @@ const ComponentPropertyValueSchema = z.discriminatedUnion('type', [
3564
3578
  ]);
3565
3579
  // TODO: finalize schema structure before release
3566
3580
  // https://contentful.atlassian.net/browse/LUMOS-523
3567
- const ParameterSchema = z.object({
3581
+ const PatternPropertySchema = z.object({
3568
3582
  type: z.literal('BoundValue'),
3569
3583
  path: z.string(),
3570
3584
  });
3571
- const ParametersSchema = z.record(propertyKeySchema, ParameterSchema);
3585
+ const ParametersSchema = z.record(propertyKeySchema, PatternPropertySchema);
3572
3586
  const BreakpointSchema = z
3573
3587
  .object({
3574
3588
  id: propertyKeySchema,
@@ -3654,25 +3668,21 @@ const THUMBNAIL_IDS = [
3654
3668
  // TODO: finalize schema structure before release
3655
3669
  // https://contentful.atlassian.net/browse/LUMOS-523
3656
3670
  const VariableMappingSchema = z.object({
3657
- parameterId: propertyKeySchema,
3671
+ parameterDefinitionId: propertyKeySchema,
3658
3672
  type: z.literal('ContentTypeMapping'),
3659
3673
  pathsByContentType: z.record(z.string(), z.object({ path: z.string() })),
3660
3674
  });
3661
3675
  // TODO: finalize schema structure before release
3662
3676
  // https://contentful.atlassian.net/browse/LUMOS-523
3663
3677
  const ParameterDefinitionSchema = z.object({
3664
- defaultSource: z
3665
- .strictObject({
3666
- type: z.enum(['Entry']),
3667
- contentTypeId: z.string(),
3668
- link: z.strictObject({
3669
- sys: z.strictObject({
3670
- type: z.literal('Link'),
3671
- id: z.string(),
3672
- linkType: z.enum(['Entry']),
3673
- }),
3678
+ defaultValue: z
3679
+ .record(z.string(), z.object({
3680
+ sys: z.object({
3681
+ type: z.literal('Link'),
3682
+ id: z.string(),
3683
+ linkType: z.enum(['Entry']),
3674
3684
  }),
3675
- })
3685
+ }))
3676
3686
  .optional(),
3677
3687
  contentTypes: z.record(z.string(), z.object({
3678
3688
  sys: z.object({
@@ -3902,6 +3912,9 @@ var VisualEditorMode;
3902
3912
  VisualEditorMode["InjectScript"] = "injectScript";
3903
3913
  })(VisualEditorMode || (VisualEditorMode = {}));
3904
3914
 
3915
+ var css_248z$2$1 = ".contentful-container {\n position: relative;\n display: flex;\n pointer-events: all;\n}\n\n.contentful-container::-webkit-scrollbar {\n display: none; /* Safari and Chrome */\n}\n\n.cf-single-column-wrapper {\n position: relative;\n}\n\n.cf-container-wrapper {\n position: relative;\n width: 100%;\n}\n\n.contentful-container:after {\n content: '';\n display: block;\n position: absolute;\n pointer-events: none;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n overflow-x: clip;\n font-family: var(--exp-builder-font-stack-primary);\n font-size: 12px;\n color: var(--exp-builder-gray400);\n z-index: 1;\n}\n\n.contentful-section-label:after {\n content: 'Section';\n}\n\n.contentful-container-label:after {\n content: 'Container';\n}\n\n/* used by ContentfulSectionAsHyperlink.tsx */\n\n.contentful-container-link,\n.contentful-container-link:active,\n.contentful-container-link:visited,\n.contentful-container-link:hover,\n.contentful-container-link:read-write,\n.contentful-container-link:focus-visible {\n color: inherit;\n text-decoration: unset;\n outline: unset;\n}\n";
3916
+ styleInject(css_248z$2$1);
3917
+
3905
3918
  const Flex = forwardRef(({ id, children, onMouseEnter, onMouseUp, onMouseLeave, onMouseDown, onClick, flex, flexBasis, flexShrink, flexDirection, gap, justifyContent, justifyItems, justifySelf, alignItems, alignSelf, alignContent, order, flexWrap, flexGrow, className, cssStyles, ...props }, ref) => {
3906
3919
  return (React.createElement("div", { id: id, ref: ref, style: {
3907
3920
  display: 'flex',
@@ -3924,6 +3937,12 @@ const Flex = forwardRef(({ id, children, onMouseEnter, onMouseUp, onMouseLeave,
3924
3937
  });
3925
3938
  Flex.displayName = 'Flex';
3926
3939
 
3940
+ var css_248z$1$1 = ".cf-divider {\n display: contents;\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.cf-divider hr {\n border: none;\n}\n\n/* For the editor mode add this 10px tolerance to make it easier picking up the divider component.\n * Using the DND zone as precondition makes sure that we don't render this pseudo element in delivery. */\n\n[data-ctfl-zone-id='root'] .cf-divider::before {\n content: \"\";\n position: absolute;\n top: -5px;\n left: -5px;\n bottom: -5px;\n right: -5px;\n pointer-events: all;\n}\n";
3941
+ styleInject(css_248z$1$1);
3942
+
3943
+ var css_248z$9 = ".cf-columns {\n display: flex;\n gap: 24px;\n grid-template-columns: repeat(12, 1fr);\n flex-direction: column;\n min-height: 0; /* NEW */\n min-width: 0; /* NEW; needed for Firefox */\n}\n\n@media (min-width: 768px) {\n .cf-columns {\n display: grid;\n }\n}\n\n.cf-single-column-wrapper {\n position: relative;\n display: flex;\n}\n\n.cf-single-column {\n pointer-events: all;\n}\n\n.cf-single-column-wrapper:after {\n content: '';\n display: block;\n position: absolute;\n pointer-events: none;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n overflow-x: clip;\n font-family: var(--exp-builder-font-stack-primary);\n font-size: 12px;\n color: var(--exp-builder-gray400);\n z-index: 1;\n}\n\n.cf-single-column-label:after {\n content: 'Column';\n}\n";
3944
+ styleInject(css_248z$9);
3945
+
3927
3946
  const ColumnWrapper = forwardRef((props, ref) => {
3928
3947
  return (React.createElement("div", { ref: ref, ...props, style: {
3929
3948
  ...(props.style || {}),