@contentful/experiences-core 1.42.0-prerelease-20250620T1340-2128bcf.0 → 1.42.0-prerelease-20250625T0902-d9db401.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, ParameterDefinition, PatternProperty, PrimitiveValue, SchemaVersions, UnboundValue, ValuesByBreakpoint, VariableMapping } from '@contentful/experiences-validators';
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';
package/dist/index.js CHANGED
@@ -954,7 +954,7 @@ const PatternPropertySchema = z.object({
954
954
  type: z.literal('BoundValue'),
955
955
  path: z.string(),
956
956
  });
957
- const ParametersSchema = z.record(propertyKeySchema, PatternPropertySchema);
957
+ const PatternPropertiesSchema = z.record(propertyKeySchema, PatternPropertySchema);
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
- parameters: ParametersSchema.optional(),
974
+ patternProperties: PatternPropertiesSchema.optional(),
975
975
  });
976
976
  const ComponentVariableSchema = z.object({
977
977
  displayName: z.string().optional(),
@@ -1040,21 +1040,25 @@ 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
- parameterDefinitionId: propertyKeySchema,
1043
+ patternPropertyDefinitionId: 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 ParameterDefinitionSchema = z.object({
1050
- defaultValue: z
1051
- .record(z.string(), z.object({
1052
- sys: z.object({
1053
- type: z.literal('Link'),
1054
- id: z.string(),
1055
- linkType: z.enum(['Entry']),
1049
+ const PatternPropertyDefinitionSchema = z.object({
1050
+ defaultSource: z
1051
+ .strictObject({
1052
+ type: z.enum(['Entry']),
1053
+ contentTypeId: z.string(),
1054
+ link: z.strictObject({
1055
+ sys: z.strictObject({
1056
+ type: z.literal('Link'),
1057
+ id: z.string(),
1058
+ linkType: z.enum(['Entry']),
1059
+ }),
1056
1060
  }),
1057
- }))
1061
+ })
1058
1062
  .optional(),
1059
1063
  contentTypes: z.record(z.string(), z.object({
1060
1064
  sys: z.object({
@@ -1064,7 +1068,7 @@ const ParameterDefinitionSchema = z.object({
1064
1068
  }),
1065
1069
  })),
1066
1070
  });
1067
- const ParameterDefinitionsSchema = z.record(propertyKeySchema, ParameterDefinitionSchema);
1071
+ const PatternPropertyDefinitionsSchema = z.record(propertyKeySchema, PatternPropertyDefinitionSchema);
1068
1072
  const VariableMappingsSchema = z.record(propertyKeySchema, VariableMappingSchema);
1069
1073
  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
1074
  ComponentVariableSchema);
@@ -1073,7 +1077,7 @@ const ComponentSettingsSchema = z.object({
1073
1077
  thumbnailId: z.enum(THUMBNAIL_IDS).optional(),
1074
1078
  category: z.string().max(50, 'Category must contain at most 50 characters').optional(),
1075
1079
  variableMappings: VariableMappingsSchema.optional(),
1076
- parameterDefinitions: ParameterDefinitionsSchema.optional(),
1080
+ patternPropertyDefinitions: PatternPropertyDefinitionsSchema.optional(),
1077
1081
  });
1078
1082
  z.object({
1079
1083
  componentTree: localeWrapper(ComponentTreeSchema),
@@ -2101,6 +2105,55 @@ const getOptimizedBackgroundImageAsset = (file, widthStyle, quality = '100%', fo
2101
2105
  }
2102
2106
  };
2103
2107
 
2108
+ /**
2109
+ * Turns a condition like `<768px` or `>1024px` into a media query rule.
2110
+ * For example, `<768px` becomes `max-width:768px` and `>1024px` becomes `min-width:1024px`.
2111
+ */
2112
+ const toMediaQueryRule = (condition) => {
2113
+ const [evaluation, pixelValue] = [condition[0], condition.substring(1)];
2114
+ const mediaQueryRule = evaluation === '<' ? 'max-width' : 'min-width';
2115
+ return `(${mediaQueryRule}:${pixelValue})`;
2116
+ };
2117
+ /**
2118
+ * Converts a map of class names to CSS strings into a single CSS string.
2119
+ *
2120
+ * @param cssByClassName map of class names to CSS strings containing all rules for each class
2121
+ * @returns joined string of all CSS class definitions
2122
+ */
2123
+ const toCompoundCss = (cssByClassName) => {
2124
+ return Object.entries(cssByClassName).reduce((acc, [className, css]) => {
2125
+ if (css === '')
2126
+ return acc;
2127
+ return `${acc}.${className}{${css}}`;
2128
+ }, ``);
2129
+ };
2130
+ /**
2131
+ * Create a single CSS string containing all class definitions for a given media query.
2132
+ *
2133
+ * @param cssByClassName map of class names to CSS strings containing all rules for each class
2134
+ * @param condition e.g. "*", "<520px", ">520px"
2135
+ * @param nextCondition optional next condition to create a disjunct media query that doesn't affect the next breakpoint
2136
+ * @returns joined string of all CSS class definitions wrapped into media queries
2137
+ */
2138
+ const toMediaQuery = ({ cssByClassName, condition, nextCondition, }) => {
2139
+ const compoundCss = toCompoundCss(cssByClassName);
2140
+ if (compoundCss === '') {
2141
+ return '';
2142
+ }
2143
+ const queryRule = toMediaQueryRule(condition);
2144
+ if (!nextCondition) {
2145
+ if (condition === '*') {
2146
+ return compoundCss;
2147
+ }
2148
+ return `@media${queryRule}{${compoundCss}}`;
2149
+ }
2150
+ const nextRule = toMediaQueryRule(nextCondition);
2151
+ if (condition === '*') {
2152
+ return `@media not ${nextRule}{${compoundCss}}`;
2153
+ }
2154
+ return `@media${queryRule} and (not ${nextRule}){${compoundCss}}`;
2155
+ };
2156
+
2104
2157
  const detachExperienceStyles = (experience) => {
2105
2158
  const experienceTreeRoot = experience.entityStore?.experienceEntryFields
2106
2159
  ?.componentTree;
@@ -2197,7 +2250,7 @@ const detachExperienceStyles = (experience) => {
2197
2250
  const isAnyVisibilityValueHidden = Object.values(propsByBreakpoint).some((designProperties) => designProperties.cfVisibility === false);
2198
2251
  // We always need an explicit value when using disjunct media queries
2199
2252
  // Example: desktop uses "false" and tablet is undefined -> we need to set `display: none` for tablet as well.
2200
- let previousVisibilityValue = undefined;
2253
+ let previousVisibilityValue;
2201
2254
  /* [Data format] `propsByBreakpoint` is a map of "breakpointId > propertyName > plainValue":
2202
2255
  * {
2203
2256
  * desktop: {
@@ -2211,7 +2264,7 @@ const detachExperienceStyles = (experience) => {
2211
2264
  const currentNodeClassNames = [];
2212
2265
  // Chain IDs to avoid overwriting styles across multiple instances of the same pattern
2213
2266
  // e.g. `{outerPatternNodeId}{innerPatternNodeId}-{currentNodeId}`
2214
- // (!) Notice that the chain of patterns (before the dash) follows the format of prebinding/ parameters
2267
+ // (!) Notice that the chain of patterns (before the dash) follows the format of prebinding/ patternProperties
2215
2268
  const currentNodeIdsChain = `${wrappingPatternNodeIds.join('')}-${currentNode.id}`;
2216
2269
  // For each breakpoint, resolve design tokens, create the CSS and generate a unique className.
2217
2270
  for (const breakpointId of breakpointIds) {
@@ -2308,7 +2361,7 @@ const detachExperienceStyles = (experience) => {
2308
2361
  });
2309
2362
  // once the whole tree was traversed, for each breakpoint, I aggregate the styles
2310
2363
  // for each generated className into one css string
2311
- return Object.values(mediaQueryDataByBreakpoint).reduce((acc, { condition, cssByClassName, visibilityCssByClassName }, index) => {
2364
+ const stylesheet = Object.values(mediaQueryDataByBreakpoint).reduce((acc, { condition, cssByClassName, visibilityCssByClassName }, index) => {
2312
2365
  const mediaQueryCss = toMediaQuery({ cssByClassName, condition });
2313
2366
  // Handle visibility separately to use disjunct media queries ("if desktop but not tablet ...")
2314
2367
  // Enables to hide on one breakpoint but render any unknown custom `display` value on another breakpoint.
@@ -2320,6 +2373,7 @@ const detachExperienceStyles = (experience) => {
2320
2373
  });
2321
2374
  return `${acc}${mediaQueryCss}${visibilityMediaQueryCss}`;
2322
2375
  }, '');
2376
+ return stylesheet;
2323
2377
  };
2324
2378
  /**
2325
2379
  * Rendering pattern nodes inside pattern entry by injecting default values from the top:
@@ -2328,7 +2382,7 @@ const detachExperienceStyles = (experience) => {
2328
2382
  */
2329
2383
  const injectDefaultValuesForComponentValues = ({ patternNode, wrapperComponentSettings, }) => {
2330
2384
  const propertyDefinitions = wrapperComponentSettings?.variableDefinitions;
2331
- return Object.entries(patternNode.variables).reduce((resolvedProperties, [propertyName, propertyValue]) => {
2385
+ const resolvedProperties = Object.entries(patternNode.variables).reduce((resolvedProperties, [propertyName, propertyValue]) => {
2332
2386
  if (propertyValue.type === 'ComponentValue') {
2333
2387
  const componentValueKey = propertyValue.key;
2334
2388
  const componentDefaultValue = propertyDefinitions?.[componentValueKey].defaultValue;
@@ -2343,6 +2397,7 @@ const injectDefaultValuesForComponentValues = ({ patternNode, wrapperComponentSe
2343
2397
  }
2344
2398
  return resolvedProperties;
2345
2399
  }, {});
2400
+ return resolvedProperties;
2346
2401
  };
2347
2402
  /**
2348
2403
  * In case of nested patterns, we need to resolve the ComponentValue properties and overwrite them with the value
@@ -2356,16 +2411,17 @@ const resolveComponentVariablesOverwrites = ({ patternNode, wrapperComponentVari
2356
2411
  // In case of rendering a pattern entry, there are no custom ComponentValues.
2357
2412
  // So we pass down the default values from this pattern node down to each deeper pattern level.
2358
2413
  if (!wrapperComponentVariablesOverwrites) {
2359
- return injectDefaultValuesForComponentValues({
2414
+ const nextComponentVariablesOverwrites = injectDefaultValuesForComponentValues({
2360
2415
  patternNode,
2361
2416
  wrapperComponentSettings,
2362
2417
  });
2418
+ return nextComponentVariablesOverwrites;
2363
2419
  }
2364
2420
  // Rendering (nested) pattern node inside another pattern node (for both experience & pattern entry):
2365
2421
  // The `wrapperComponentVariablesOverwrites` from the top-most pattern node is passed through to each child
2366
2422
  // node (and nested pattern nodes). It replaces each ComponentValue in the subtree with either the overwrite
2367
2423
  // or the default value.
2368
- return Object.entries(patternNode?.variables).reduce((resolvedValues, [propertyName, propertyValue]) => {
2424
+ const nextComponentVariablesOverwrites = Object.entries(patternNode?.variables).reduce((resolvedValues, [propertyName, propertyValue]) => {
2369
2425
  if (propertyValue.type === 'ComponentValue') {
2370
2426
  // Copying the values from the parent node
2371
2427
  const overwritingValue = wrapperComponentVariablesOverwrites?.[propertyValue.key];
@@ -2381,6 +2437,7 @@ const resolveComponentVariablesOverwrites = ({ patternNode, wrapperComponentVari
2381
2437
  }
2382
2438
  return resolvedValues;
2383
2439
  }, {});
2440
+ return nextComponentVariablesOverwrites;
2384
2441
  };
2385
2442
  const isCfStyleAttribute = (variableName) => {
2386
2443
  return CF_STYLE_ATTRIBUTES.includes(variableName);
@@ -2438,7 +2495,8 @@ const transformMedia$1 = (boundAsset, width, options) => {
2438
2495
  const targetValue = targetWidthObject ? getTargetValueInPixels(targetWidthObject) : assetWidth;
2439
2496
  if (targetValue < assetWidth)
2440
2497
  width = `${targetValue}px`;
2441
- return getOptimizedBackgroundImageAsset(asset.fields.file, width, options.quality, options.format);
2498
+ const value = getOptimizedBackgroundImageAsset(asset.fields.file, width, options.quality, options.format);
2499
+ return value;
2442
2500
  }
2443
2501
  catch (error) {
2444
2502
  console.error('Error transforming image asset', error);
@@ -2659,55 +2717,6 @@ const flattenDesignTokenRegistry = (designTokenRegistry) => {
2659
2717
  }, {});
2660
2718
  };
2661
2719
 
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
-
2711
2720
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2712
2721
  function get(obj, path) {
2713
2722
  if (!path.length) {
@@ -4152,10 +4161,12 @@ const attachPrebindingDefaultValueAsDataSource = (experienceEntry) => {
4152
4161
  // Only supported for pattern entries since experience entries don't define pattern properties.
4153
4162
  return;
4154
4163
  }
4155
- const patternDefs = experienceEntry.fields.componentSettings?.parameterDefinitions ?? {};
4156
- const defaultPrebinding = Object.values(patternDefs).find((def) => def.defaultValue)?.defaultValue;
4157
- const [value] = Object.values(defaultPrebinding ?? {});
4158
- const id = value?.sys?.id;
4164
+ const patternDefs = experienceEntry.fields.componentSettings?.patternPropertyDefinitions ?? {};
4165
+ const defaultPrebinding = Object.values(patternDefs).find((def) => def?.defaultSource)?.defaultSource;
4166
+ const { link, type } = defaultPrebinding ?? {};
4167
+ if (!link || !type)
4168
+ return;
4169
+ const id = link.sys?.id;
4159
4170
  if (!id)
4160
4171
  return;
4161
4172
  experienceEntry.fields.dataSource = {
@@ -4163,7 +4174,7 @@ const attachPrebindingDefaultValueAsDataSource = (experienceEntry) => {
4163
4174
  [id]: {
4164
4175
  sys: {
4165
4176
  type: 'Link',
4166
- linkType: 'Entry',
4177
+ linkType: type,
4167
4178
  id,
4168
4179
  },
4169
4180
  },