@contentful/experiences-core 1.42.0-dev-20250625T1537-8a20b16.0 → 1.42.0-dev-20250626T1429-8019b38.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/exports.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { ASSEMBLY_BLOCK_NODE_TYPE, ASSEMBLY_DEFAULT_CATEGORY, ASSEMBLY_NODE_TYPE, ASSEMBLY_NODE_TYPES, CF_STYLE_ATTRIBUTES, CONTENTFUL_COMPONENTS, CONTENTFUL_COMPONENT_CATEGORY, CONTENTFUL_DEFAULT_CATEGORY, DEFAULT_IMAGE_WIDTH, EMPTY_CONTAINER_HEIGHT, HYPERLINK_DEFAULT_PATTERN, INCOMING_EVENTS, INTERNAL_EVENTS, LATEST_SCHEMA_VERSION, OUTGOING_EVENTS, PATTERN_PROPERTY_DIVIDER, PostMessageMethods, SCROLL_STATES, SUPPORTED_IMAGE_FORMATS, StudioCanvasMode, VISUAL_EDITOR_CONTAINER_ID, VISUAL_EDITOR_EVENTS } from './constants.js';
2
2
  export { AssembliesAddedPayload, AssembliesRegisteredPayload, BackgroundImageAlignmentOption, BackgroundImageOptions, BackgroundImageScalingOption, Binding, BindingMap, BindingMapByBlockId, BoundComponentPropertyTypes, CSSProperties, CanvasErrorPayload, CanvasReloadPayload, CanvasResizedPayload, CanvasScrollPayload, ComponentBinding, ComponentDefinition, ComponentDefinitionVariable, ComponentDefinitionVariableBase, ComponentDefinitionVariableTypeMap, ComponentDefinitionVariableValidation, ComponentDragCanceledPayload, ComponentDragEndedPayload, ComponentDragStartedPayload, ComponentDraggingChangedPayload, ComponentDroppedPayload, ComponentMoveEndedPayload, ComponentMoveStartedPayload, ComponentMovedPayload, ComponentRegistration, ComponentRegistrationOptions, ComponentSelectedPayload, ConnectedPayload, ContainerStyleVariableName, Coordinates, DataSourceEntryValueType, DesignTokensDefinition, DesignTokensPayload, DesignVariableMap, DesignVariableTypes, DragWrapperProps, Experience, ExperienceEntry, ExperienceFields, ExperienceTree, ExperienceTreeNode, ExperienceUpdatedPayload, HoverComponentPayload, HoveredElement, ImageLoadingOption, ImageObjectFitOption, ImageObjectPositionOption, ImageOptions, IncomingComponentDragCanceledPayload, IncomingComponentMoveEndedPayload, IncomingEvent, IncomingMessage, IncomingMouseMovePayload, InternalEvent, Link, ManagementEntity, MouseMovePayload, NewHoveredElementPayload, OptimizedBackgroundImageAsset, OptimizedImageAsset, OutgoingEvent, OutgoingMessage, OutsideCanvasClickPayload, RawCoordinates, RecursiveDesignTokenDefinition, RegisteredBreakpointsPayload, RegisteredComponentsPayload, RequestComponentTreeUpdatePayload, RequestEditorModePayload, RequestEntitiesMessage, RequestEntitiesPayload, RequestReadOnlyModePayload, RequestedEntitiesMessage, RequestedEntitiesPayload, ResolveDesignValueType, SDKFeaturesPayload, ScrollState, SelectComponentPayload, SendMessageParams, StyleProps, UpdateSelectedComponentCoordinatesPayload, UpdatedEntityPayload, ValidationOption, VariableFormats, WrapperTags } from './types.js';
3
- export { BoundValue, Breakpoint, ComponentDefinitionPropertyType as ComponentDefinitionVariableType, ComponentPropertyValue, ComponentTreeNode, ComponentValue, DesignValue, ExperienceComponentSettings, ExperienceDataSource, ExperienceUnboundValues, NoValue, PatternProperty, PatternPropertyDefinition, PrimitiveValue, SchemaVersions, UnboundValue, ValuesByBreakpoint, VariableMapping } from '@contentful/experiences-validators';
3
+ export { BoundValue, Breakpoint, ComponentDefinitionPropertyType as ComponentDefinitionVariableType, ComponentPropertyValue, ComponentTreeNode, ComponentValue, DesignValue, ExperienceComponentSettings, ExperienceDataSource, ExperienceUnboundValues, NoValue, Parameter, ParameterDefinition, PrimitiveValue, SchemaVersions, UnboundValue, ValuesByBreakpoint, VariableMapping } from '@contentful/experiences-validators';
package/dist/index.js CHANGED
@@ -950,11 +950,11 @@ const ComponentPropertyValueSchema = z.discriminatedUnion('type', [
950
950
  ]);
951
951
  // TODO: finalize schema structure before release
952
952
  // https://contentful.atlassian.net/browse/LUMOS-523
953
- const PatternPropertySchema = z.object({
953
+ const ParameterSchema = z.object({
954
954
  type: z.literal('BoundValue'),
955
955
  path: z.string(),
956
956
  });
957
- const PatternPropertiesSchema = z.record(propertyKeySchema, PatternPropertySchema);
957
+ const ParametersSchema = z.record(propertyKeySchema, ParameterSchema);
958
958
  const BreakpointSchema = z
959
959
  .object({
960
960
  id: propertyKeySchema,
@@ -971,7 +971,7 @@ const BaseComponentTreeNodeSchema = z.object({
971
971
  displayName: z.string().optional(),
972
972
  slotId: z.string().optional(),
973
973
  variables: z.record(propertyKeySchema, ComponentPropertyValueSchema),
974
- patternProperties: PatternPropertiesSchema.optional(),
974
+ parameters: ParametersSchema.optional(),
975
975
  });
976
976
  const ComponentVariableSchema = z.object({
977
977
  displayName: z.string().optional(),
@@ -1040,13 +1040,13 @@ const THUMBNAIL_IDS = [
1040
1040
  // TODO: finalize schema structure before release
1041
1041
  // https://contentful.atlassian.net/browse/LUMOS-523
1042
1042
  const VariableMappingSchema = z.object({
1043
- patternPropertyDefinitionId: propertyKeySchema,
1043
+ parameterId: propertyKeySchema,
1044
1044
  type: z.literal('ContentTypeMapping'),
1045
1045
  pathsByContentType: z.record(z.string(), z.object({ path: z.string() })),
1046
1046
  });
1047
1047
  // TODO: finalize schema structure before release
1048
1048
  // https://contentful.atlassian.net/browse/LUMOS-523
1049
- const PatternPropertyDefinitionSchema = z.object({
1049
+ const ParameterDefinitionSchema = z.object({
1050
1050
  defaultValue: z
1051
1051
  .record(z.string(), z.object({
1052
1052
  sys: z.object({
@@ -1064,7 +1064,7 @@ const PatternPropertyDefinitionSchema = z.object({
1064
1064
  }),
1065
1065
  })),
1066
1066
  });
1067
- const PatternPropertyDefinitionsSchema = z.record(propertyKeySchema, PatternPropertyDefinitionSchema);
1067
+ const ParameterDefinitionsSchema = z.record(propertyKeySchema, ParameterDefinitionSchema);
1068
1068
  const VariableMappingsSchema = z.record(propertyKeySchema, VariableMappingSchema);
1069
1069
  const ComponentVariablesSchema = z.record(z.string().regex(/^[a-zA-Z0-9-_]{1,54}$/), // Here the key is <variableName>_<nanoidId> so we need to allow for a longer length
1070
1070
  ComponentVariableSchema);
@@ -1073,7 +1073,7 @@ const ComponentSettingsSchema = z.object({
1073
1073
  thumbnailId: z.enum(THUMBNAIL_IDS).optional(),
1074
1074
  category: z.string().max(50, 'Category must contain at most 50 characters').optional(),
1075
1075
  variableMappings: VariableMappingsSchema.optional(),
1076
- patternPropertyDefinitions: PatternPropertyDefinitionsSchema.optional(),
1076
+ parameterDefinitions: ParameterDefinitionsSchema.optional(),
1077
1077
  });
1078
1078
  z.object({
1079
1079
  componentTree: localeWrapper(ComponentTreeSchema),
@@ -2101,55 +2101,6 @@ const getOptimizedBackgroundImageAsset = (file, widthStyle, quality = '100%', fo
2101
2101
  }
2102
2102
  };
2103
2103
 
2104
- /**
2105
- * Turns a condition like `<768px` or `>1024px` into a media query rule.
2106
- * For example, `<768px` becomes `max-width:768px` and `>1024px` becomes `min-width:1024px`.
2107
- */
2108
- const toMediaQueryRule = (condition) => {
2109
- const [evaluation, pixelValue] = [condition[0], condition.substring(1)];
2110
- const mediaQueryRule = evaluation === '<' ? 'max-width' : 'min-width';
2111
- return `(${mediaQueryRule}:${pixelValue})`;
2112
- };
2113
- /**
2114
- * Converts a map of class names to CSS strings into a single CSS string.
2115
- *
2116
- * @param cssByClassName map of class names to CSS strings containing all rules for each class
2117
- * @returns joined string of all CSS class definitions
2118
- */
2119
- const toCompoundCss = (cssByClassName) => {
2120
- return Object.entries(cssByClassName).reduce((acc, [className, css]) => {
2121
- if (css === '')
2122
- return acc;
2123
- return `${acc}.${className}{${css}}`;
2124
- }, ``);
2125
- };
2126
- /**
2127
- * Create a single CSS string containing all class definitions for a given media query.
2128
- *
2129
- * @param cssByClassName map of class names to CSS strings containing all rules for each class
2130
- * @param condition e.g. "*", "<520px", ">520px"
2131
- * @param nextCondition optional next condition to create a disjunct media query that doesn't affect the next breakpoint
2132
- * @returns joined string of all CSS class definitions wrapped into media queries
2133
- */
2134
- const toMediaQuery = ({ cssByClassName, condition, nextCondition, }) => {
2135
- const compoundCss = toCompoundCss(cssByClassName);
2136
- if (compoundCss === '') {
2137
- return '';
2138
- }
2139
- const queryRule = toMediaQueryRule(condition);
2140
- if (!nextCondition) {
2141
- if (condition === '*') {
2142
- return compoundCss;
2143
- }
2144
- return `@media${queryRule}{${compoundCss}}`;
2145
- }
2146
- const nextRule = toMediaQueryRule(nextCondition);
2147
- if (condition === '*') {
2148
- return `@media not ${nextRule}{${compoundCss}}`;
2149
- }
2150
- return `@media${queryRule} and (not ${nextRule}){${compoundCss}}`;
2151
- };
2152
-
2153
2104
  const detachExperienceStyles = (experience) => {
2154
2105
  const experienceTreeRoot = experience.entityStore?.experienceEntryFields
2155
2106
  ?.componentTree;
@@ -2246,7 +2197,7 @@ const detachExperienceStyles = (experience) => {
2246
2197
  const isAnyVisibilityValueHidden = Object.values(propsByBreakpoint).some((designProperties) => designProperties.cfVisibility === false);
2247
2198
  // We always need an explicit value when using disjunct media queries
2248
2199
  // Example: desktop uses "false" and tablet is undefined -> we need to set `display: none` for tablet as well.
2249
- let previousVisibilityValue;
2200
+ let previousVisibilityValue = undefined;
2250
2201
  /* [Data format] `propsByBreakpoint` is a map of "breakpointId > propertyName > plainValue":
2251
2202
  * {
2252
2203
  * desktop: {
@@ -2260,7 +2211,7 @@ const detachExperienceStyles = (experience) => {
2260
2211
  const currentNodeClassNames = [];
2261
2212
  // Chain IDs to avoid overwriting styles across multiple instances of the same pattern
2262
2213
  // e.g. `{outerPatternNodeId}{innerPatternNodeId}-{currentNodeId}`
2263
- // (!) Notice that the chain of patterns (before the dash) follows the format of prebinding/ patternProperties
2214
+ // (!) Notice that the chain of patterns (before the dash) follows the format of prebinding/ parameters
2264
2215
  const currentNodeIdsChain = `${wrappingPatternNodeIds.join('')}-${currentNode.id}`;
2265
2216
  // For each breakpoint, resolve design tokens, create the CSS and generate a unique className.
2266
2217
  for (const breakpointId of breakpointIds) {
@@ -2357,7 +2308,7 @@ const detachExperienceStyles = (experience) => {
2357
2308
  });
2358
2309
  // once the whole tree was traversed, for each breakpoint, I aggregate the styles
2359
2310
  // for each generated className into one css string
2360
- const stylesheet = Object.values(mediaQueryDataByBreakpoint).reduce((acc, { condition, cssByClassName, visibilityCssByClassName }, index) => {
2311
+ return Object.values(mediaQueryDataByBreakpoint).reduce((acc, { condition, cssByClassName, visibilityCssByClassName }, index) => {
2361
2312
  const mediaQueryCss = toMediaQuery({ cssByClassName, condition });
2362
2313
  // Handle visibility separately to use disjunct media queries ("if desktop but not tablet ...")
2363
2314
  // Enables to hide on one breakpoint but render any unknown custom `display` value on another breakpoint.
@@ -2369,7 +2320,6 @@ const detachExperienceStyles = (experience) => {
2369
2320
  });
2370
2321
  return `${acc}${mediaQueryCss}${visibilityMediaQueryCss}`;
2371
2322
  }, '');
2372
- return stylesheet;
2373
2323
  };
2374
2324
  /**
2375
2325
  * Rendering pattern nodes inside pattern entry by injecting default values from the top:
@@ -2378,7 +2328,7 @@ const detachExperienceStyles = (experience) => {
2378
2328
  */
2379
2329
  const injectDefaultValuesForComponentValues = ({ patternNode, wrapperComponentSettings, }) => {
2380
2330
  const propertyDefinitions = wrapperComponentSettings?.variableDefinitions;
2381
- const resolvedProperties = Object.entries(patternNode.variables).reduce((resolvedProperties, [propertyName, propertyValue]) => {
2331
+ return Object.entries(patternNode.variables).reduce((resolvedProperties, [propertyName, propertyValue]) => {
2382
2332
  if (propertyValue.type === 'ComponentValue') {
2383
2333
  const componentValueKey = propertyValue.key;
2384
2334
  const componentDefaultValue = propertyDefinitions?.[componentValueKey].defaultValue;
@@ -2393,7 +2343,6 @@ const injectDefaultValuesForComponentValues = ({ patternNode, wrapperComponentSe
2393
2343
  }
2394
2344
  return resolvedProperties;
2395
2345
  }, {});
2396
- return resolvedProperties;
2397
2346
  };
2398
2347
  /**
2399
2348
  * In case of nested patterns, we need to resolve the ComponentValue properties and overwrite them with the value
@@ -2407,17 +2356,16 @@ const resolveComponentVariablesOverwrites = ({ patternNode, wrapperComponentVari
2407
2356
  // In case of rendering a pattern entry, there are no custom ComponentValues.
2408
2357
  // So we pass down the default values from this pattern node down to each deeper pattern level.
2409
2358
  if (!wrapperComponentVariablesOverwrites) {
2410
- const nextComponentVariablesOverwrites = injectDefaultValuesForComponentValues({
2359
+ return injectDefaultValuesForComponentValues({
2411
2360
  patternNode,
2412
2361
  wrapperComponentSettings,
2413
2362
  });
2414
- return nextComponentVariablesOverwrites;
2415
2363
  }
2416
2364
  // Rendering (nested) pattern node inside another pattern node (for both experience & pattern entry):
2417
2365
  // The `wrapperComponentVariablesOverwrites` from the top-most pattern node is passed through to each child
2418
2366
  // node (and nested pattern nodes). It replaces each ComponentValue in the subtree with either the overwrite
2419
2367
  // or the default value.
2420
- const nextComponentVariablesOverwrites = Object.entries(patternNode?.variables).reduce((resolvedValues, [propertyName, propertyValue]) => {
2368
+ return Object.entries(patternNode?.variables).reduce((resolvedValues, [propertyName, propertyValue]) => {
2421
2369
  if (propertyValue.type === 'ComponentValue') {
2422
2370
  // Copying the values from the parent node
2423
2371
  const overwritingValue = wrapperComponentVariablesOverwrites?.[propertyValue.key];
@@ -2433,7 +2381,6 @@ const resolveComponentVariablesOverwrites = ({ patternNode, wrapperComponentVari
2433
2381
  }
2434
2382
  return resolvedValues;
2435
2383
  }, {});
2436
- return nextComponentVariablesOverwrites;
2437
2384
  };
2438
2385
  const isCfStyleAttribute = (variableName) => {
2439
2386
  return CF_STYLE_ATTRIBUTES.includes(variableName);
@@ -2491,8 +2438,7 @@ const transformMedia$1 = (boundAsset, width, options) => {
2491
2438
  const targetValue = targetWidthObject ? getTargetValueInPixels(targetWidthObject) : assetWidth;
2492
2439
  if (targetValue < assetWidth)
2493
2440
  width = `${targetValue}px`;
2494
- const value = getOptimizedBackgroundImageAsset(asset.fields.file, width, options.quality, options.format);
2495
- return value;
2441
+ return getOptimizedBackgroundImageAsset(asset.fields.file, width, options.quality, options.format);
2496
2442
  }
2497
2443
  catch (error) {
2498
2444
  console.error('Error transforming image asset', error);
@@ -2713,6 +2659,55 @@ const flattenDesignTokenRegistry = (designTokenRegistry) => {
2713
2659
  }, {});
2714
2660
  };
2715
2661
 
2662
+ /**
2663
+ * Turns a condition like `<768px` or `>1024px` into a media query rule.
2664
+ * For example, `<768px` becomes `max-width:768px` and `>1024px` becomes `min-width:1024px`.
2665
+ */
2666
+ const toMediaQueryRule = (condition) => {
2667
+ const [evaluation, pixelValue] = [condition[0], condition.substring(1)];
2668
+ const mediaQueryRule = evaluation === '<' ? 'max-width' : 'min-width';
2669
+ return `(${mediaQueryRule}:${pixelValue})`;
2670
+ };
2671
+ /**
2672
+ * Converts a map of class names to CSS strings into a single CSS string.
2673
+ *
2674
+ * @param cssByClassName map of class names to CSS strings containing all rules for each class
2675
+ * @returns joined string of all CSS class definitions
2676
+ */
2677
+ const toCompoundCss = (cssByClassName) => {
2678
+ return Object.entries(cssByClassName).reduce((acc, [className, css]) => {
2679
+ if (css === '')
2680
+ return acc;
2681
+ return `${acc}.${className}{${css}}`;
2682
+ }, ``);
2683
+ };
2684
+ /**
2685
+ * Create a single CSS string containing all class definitions for a given media query.
2686
+ *
2687
+ * @param cssByClassName map of class names to CSS strings containing all rules for each class
2688
+ * @param condition e.g. "*", "<520px", ">520px"
2689
+ * @param nextCondition optional next condition to create a disjunct media query that doesn't affect the next breakpoint
2690
+ * @returns joined string of all CSS class definitions wrapped into media queries
2691
+ */
2692
+ const toMediaQuery = ({ cssByClassName, condition, nextCondition, }) => {
2693
+ const compoundCss = toCompoundCss(cssByClassName);
2694
+ if (compoundCss === '') {
2695
+ return '';
2696
+ }
2697
+ const queryRule = toMediaQueryRule(condition);
2698
+ if (!nextCondition) {
2699
+ if (condition === '*') {
2700
+ return compoundCss;
2701
+ }
2702
+ return `@media${queryRule}{${compoundCss}}`;
2703
+ }
2704
+ const nextRule = toMediaQueryRule(nextCondition);
2705
+ if (condition === '*') {
2706
+ return `@media not ${nextRule}{${compoundCss}}`;
2707
+ }
2708
+ return `@media${queryRule} and (not ${nextRule}){${compoundCss}}`;
2709
+ };
2710
+
2716
2711
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2717
2712
  function get(obj, path) {
2718
2713
  if (!path.length) {
@@ -4157,7 +4152,7 @@ const attachPrebindingDefaultValueAsDataSource = (experienceEntry) => {
4157
4152
  // Only supported for pattern entries since experience entries don't define pattern properties.
4158
4153
  return;
4159
4154
  }
4160
- const patternDefs = experienceEntry.fields.componentSettings?.patternPropertyDefinitions ?? {};
4155
+ const patternDefs = experienceEntry.fields.componentSettings?.parameterDefinitions ?? {};
4161
4156
  const defaultPrebinding = Object.values(patternDefs).find((def) => def.defaultValue)?.defaultValue;
4162
4157
  const [value] = Object.values(defaultPrebinding ?? {});
4163
4158
  const id = value?.sys?.id;