@opensite/ui 3.5.7 → 3.5.9

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.
@@ -1132,16 +1132,22 @@ var FeaturedCardsGridDropdown = ({
1132
1132
  optixFlowConfig
1133
1133
  }) => {
1134
1134
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1135
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-4 pb-8", children: featuredLinks?.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx(
1135
+ featuredLinks && featuredLinks?.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-4 pb-8", children: featuredLinks?.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx(
1136
1136
  FeaturedLink,
1137
1137
  {
1138
1138
  link,
1139
1139
  optixFlowConfig
1140
1140
  },
1141
1141
  `desktop-featured-link-${index}`
1142
- )) }),
1143
- /* @__PURE__ */ jsxRuntime.jsx(Separator, {}),
1144
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-4 pt-8", children: links?.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx(NavLink, { link }, `default-nav-link-${index}`)) })
1142
+ )) }) : null,
1143
+ featuredLinks && featuredLinks?.length > 0 && links && links?.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Separator, {}) : null,
1144
+ links && links?.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
1145
+ "div",
1146
+ {
1147
+ className: `grid grid-cols-4 pt-${featuredLinks && featuredLinks?.length > 0 ? 8 : 0} gap-4`,
1148
+ children: links?.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx(NavLink, { link }, `default-nav-link-${index}`))
1149
+ }
1150
+ ) : null
1145
1151
  ] });
1146
1152
  };
1147
1153
  var GroupedLinksImageDropdown = ({
@@ -39,16 +39,16 @@ interface IMenuLink {
39
39
  */
40
40
  interface NavbarAnimatedPreviewProps {
41
41
  /**
42
- * Logo configuration
43
- */
42
+ * Logo configuration
43
+ */
44
44
  logo?: LogoConfig;
45
45
  /**
46
- * Navigation menu links with optional dropdown groups
47
- */
46
+ * Navigation menu links with optional dropdown groups
47
+ */
48
48
  menuLinks?: IMenuLink[];
49
49
  /**
50
- * Action configurations (e.g., Sign In, Get Started buttons)
51
- */
50
+ * Action configurations (e.g., Sign In, Get Started buttons)
51
+ */
52
52
  actions?: ActionConfig[];
53
53
  }
54
54
  interface NavbarAnimatedPreviewRuntimeProps {
@@ -39,16 +39,16 @@ interface IMenuLink {
39
39
  */
40
40
  interface NavbarAnimatedPreviewProps {
41
41
  /**
42
- * Logo configuration
43
- */
42
+ * Logo configuration
43
+ */
44
44
  logo?: LogoConfig;
45
45
  /**
46
- * Navigation menu links with optional dropdown groups
47
- */
46
+ * Navigation menu links with optional dropdown groups
47
+ */
48
48
  menuLinks?: IMenuLink[];
49
49
  /**
50
- * Action configurations (e.g., Sign In, Get Started buttons)
51
- */
50
+ * Action configurations (e.g., Sign In, Get Started buttons)
51
+ */
52
52
  actions?: ActionConfig[];
53
53
  }
54
54
  interface NavbarAnimatedPreviewRuntimeProps {
@@ -1107,16 +1107,22 @@ var FeaturedCardsGridDropdown = ({
1107
1107
  optixFlowConfig
1108
1108
  }) => {
1109
1109
  return /* @__PURE__ */ jsxs("div", { children: [
1110
- /* @__PURE__ */ jsx("div", { className: "flex gap-4 pb-8", children: featuredLinks?.map((link, index) => /* @__PURE__ */ jsx(
1110
+ featuredLinks && featuredLinks?.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex gap-4 pb-8", children: featuredLinks?.map((link, index) => /* @__PURE__ */ jsx(
1111
1111
  FeaturedLink,
1112
1112
  {
1113
1113
  link,
1114
1114
  optixFlowConfig
1115
1115
  },
1116
1116
  `desktop-featured-link-${index}`
1117
- )) }),
1118
- /* @__PURE__ */ jsx(Separator, {}),
1119
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-4 pt-8", children: links?.map((link, index) => /* @__PURE__ */ jsx(NavLink, { link }, `default-nav-link-${index}`)) })
1117
+ )) }) : null,
1118
+ featuredLinks && featuredLinks?.length > 0 && links && links?.length > 0 ? /* @__PURE__ */ jsx(Separator, {}) : null,
1119
+ links && links?.length > 0 ? /* @__PURE__ */ jsx(
1120
+ "div",
1121
+ {
1122
+ className: `grid grid-cols-4 pt-${featuredLinks && featuredLinks?.length > 0 ? 8 : 0} gap-4`,
1123
+ children: links?.map((link, index) => /* @__PURE__ */ jsx(NavLink, { link }, `default-nav-link-${index}`))
1124
+ }
1125
+ ) : null
1120
1126
  ] });
1121
1127
  };
1122
1128
  var GroupedLinksImageDropdown = ({
package/dist/registry.cjs CHANGED
@@ -66975,16 +66975,22 @@ var FeaturedCardsGridDropdown = ({
66975
66975
  optixFlowConfig
66976
66976
  }) => {
66977
66977
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
66978
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-4 pb-8", children: featuredLinks?.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx(
66978
+ featuredLinks && featuredLinks?.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-4 pb-8", children: featuredLinks?.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx(
66979
66979
  FeaturedLink,
66980
66980
  {
66981
66981
  link,
66982
66982
  optixFlowConfig
66983
66983
  },
66984
66984
  `desktop-featured-link-${index}`
66985
- )) }),
66986
- /* @__PURE__ */ jsxRuntime.jsx(Separator, {}),
66987
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-4 pt-8", children: links?.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx(NavLink, { link }, `default-nav-link-${index}`)) })
66985
+ )) }) : null,
66986
+ featuredLinks && featuredLinks?.length > 0 && links && links?.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(Separator, {}) : null,
66987
+ links && links?.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
66988
+ "div",
66989
+ {
66990
+ className: `grid grid-cols-4 pt-${featuredLinks && featuredLinks?.length > 0 ? 8 : 0} gap-4`,
66991
+ children: links?.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx(NavLink, { link }, `default-nav-link-${index}`))
66992
+ }
66993
+ ) : null
66988
66994
  ] });
66989
66995
  };
66990
66996
  var GroupedLinksImageDropdown = ({
@@ -112065,17 +112071,27 @@ var BLOCK_REGISTRY = {
112065
112071
  heading="Compassionate care for your mental wellbeing"
112066
112072
  description="Our team of experienced mental health professionals is dedicated to providing compassionate care and support to individuals in need."
112067
112073
  smallImages={[
112068
- { src: "/images/team-1.jpg", alt: "Dr. Smith" },
112069
- { src: "/images/team-2.jpg", alt: "Dr. Johnson" },
112074
+ {
112075
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112076
+ alt: "Dr. Smith",
112077
+ },
112078
+ {
112079
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112080
+ alt: "Dr. Johnson",
112081
+ },
112070
112082
  ]}
112071
112083
  testimonial={{
112072
112084
  quote:
112073
112085
  "The support I received changed my life. I'm so grateful for the compassionate care.",
112074
112086
  author: "Sarah M.",
112075
112087
  role: "Client",
112076
- avatarSrc: "/images/avatar.jpg",
112088
+ avatarSrc:
112089
+ "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112090
+ }}
112091
+ featureImage={{
112092
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112093
+ alt: "Mental health support",
112077
112094
  }}
112078
- featureImage={{ src: "/images/feature.jpg", alt: "Mental health support" }}
112079
112095
  actions={[
112080
112096
  { label: "Get Started", href: "#", variant: "default" },
112081
112097
  { label: "Talk to Sales", href: "#", variant: "outline" },
@@ -112083,7 +112099,7 @@ var BLOCK_REGISTRY = {
112083
112099
  background="gray"
112084
112100
  />
112085
112101
  `.trim(),
112086
- importantUsageNotes: "Only use if you have a valid testimonial - DO NOT MAKE UP A TESTIMONIAL/REVIEW. Supply exactly 2 images to the 'smallImages' prop and ensure you supply a 'featureImage' prop object. Do not exceed 40 characters for the 'heading' prop. Do not exceed 130 characters for the 'description' prop. If you supply multiple 'actions', ensure to use a variant of 'default' for the first action, and 'outline' for the second action to ensure proper visual distinction between the two CTAs. Follow the example props closely for this block.",
112102
+ importantUsageNotes: "Only use if you have a valid testimonial - DO NOT MAKE UP A TESTIMONIAL/REVIEW. Supply exactly 2 images to the 'smallImages' prop and ensure you supply a 'featureImage' prop object. Do not exceed 40 characters for the 'heading' prop. Do not exceed 130 characters for the 'description' prop. If you supply multiple 'actions', ensure to use a variant of 'default' for the first action, and 'outline' for the second action to ensure proper visual distinction between the two CTAs. All media src values must be absolute URLs to real CDN assets \u2014 never relative paths (e.g. '/images/...') or placeholder strings. Follow the example props closely for this block.",
112087
112103
  usageRequirements: {
112088
112104
  requiredProps: ["heading", "smallImages", "featureImage", "testimonial"],
112089
112105
  propConstraints: {
@@ -112131,20 +112147,29 @@ var BLOCK_REGISTRY = {
112131
112147
  },
112132
112148
  requiresSiteCapabilities: ["reviews_or_testimonials", "media_library"]
112133
112149
  },
112134
- defaultProps: {
112150
+ exampleProps: {
112135
112151
  heading: "Compassionate care for your mental wellbeing",
112136
112152
  description: "Our team of experienced mental health professionals is dedicated to providing compassionate care and support to individuals in need.",
112137
112153
  smallImages: [
112138
- { src: "/images/team-1.jpg", alt: "Dr. Smith" },
112139
- { src: "/images/team-2.jpg", alt: "Dr. Johnson" }
112154
+ {
112155
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112156
+ alt: "Dr. Smith"
112157
+ },
112158
+ {
112159
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112160
+ alt: "Dr. Johnson"
112161
+ }
112140
112162
  ],
112141
112163
  testimonial: {
112142
112164
  quote: "The support I received changed my life. I'm so grateful for the compassionate care.",
112143
112165
  author: "Sarah M.",
112144
112166
  role: "Client",
112145
- avatarSrc: "/images/avatar.jpg"
112167
+ avatarSrc: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp"
112168
+ },
112169
+ featureImage: {
112170
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112171
+ alt: "Mental health support"
112146
112172
  },
112147
- featureImage: { src: "/images/feature.jpg", alt: "Mental health support" },
112148
112173
  actions: [
112149
112174
  { label: "Get Started", href: "#", variant: "default" },
112150
112175
  { label: "Talk to Sales", href: "#", variant: "outline" }
@@ -112169,7 +112194,101 @@ var BLOCK_REGISTRY = {
112169
112194
  category: "hero",
112170
112195
  component: HeroMentorshipVideoSplit,
112171
112196
  props: "HeroMentorshipVideoSplitProps",
112172
- exampleUsage: `<HeroMentorshipVideoSplit />`.trim()
112197
+ exampleUsage: `
112198
+ <HeroMentorshipVideoSplit
112199
+ heading="Reclaim Your Peace. Scale Sustainably."
112200
+ description="Somatic mindset coaching for high-achieving entrepreneurs ready to lead from strength \u2014 not survival mode."
112201
+ action={{ label: "Book Your Discovery Call", href: "/contact", variant: "default", size: "lg" }}
112202
+ videoLabel="Watch the Overview"
112203
+ videoTitle="Coaching Overview"
112204
+ modalVideo={{
112205
+ image: {
112206
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112207
+ alt: "Coaching overview poster",
112208
+ },
112209
+ video: {
112210
+ src: "https://toastability-production.s3.amazonaws.com/4kox2ux0ye1wlqkdwg03s08a67i1",
112211
+ },
112212
+ }}
112213
+ image={{
112214
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112215
+ alt: "Coach portrait",
112216
+ }}
112217
+ background="dark"
112218
+ />
112219
+ `.trim(),
112220
+ importantUsageNotes: "The 'image' prop is the main hero image and MUST be an image asset (poster/photo). The 'modalVideo' prop's nested 'video.src' MUST be a video asset (HLS playlist or MP4) and 'modalVideo.image.src' MUST be an image asset (video poster). NEVER swap these: do not put a video URL into the 'image' prop and do not put an image URL into 'modalVideo.video.src'. All media src values must be absolute URLs to real CDN assets \u2014 never relative paths or placeholder strings. Keep 'heading' concise (under 60 characters) for visual balance.",
112221
+ usageRequirements: {
112222
+ requiredProps: ["heading", "image"],
112223
+ propConstraints: {
112224
+ heading: { required: true, maxLength: 60 },
112225
+ description: { maxLength: 220 },
112226
+ image: {
112227
+ required: true,
112228
+ note: "Main hero image. Must be an image asset (jpg/png/webp), NOT a video URL."
112229
+ },
112230
+ "modalVideo.video.src": {
112231
+ note: "Must be a video asset URL (HLS .m3u8 master playlist or .mp4). Must NOT be an image URL."
112232
+ },
112233
+ "modalVideo.image.src": {
112234
+ note: "Video poster image. Must be an image asset, NOT a video URL."
112235
+ }
112236
+ },
112237
+ mediaSlots: {
112238
+ image: {
112239
+ path: "image",
112240
+ roles: ["hero", "feature", "profile"],
112241
+ disallowedRoles: ["logo", "favicon", "video-thumbnail"],
112242
+ minPixelClass: "large",
112243
+ required: true,
112244
+ note: "Main hero image slot. IMAGE MEDIA ONLY. Do not assign a video URL here."
112245
+ },
112246
+ "modalVideo.video.src": {
112247
+ path: "modalVideo.video.src",
112248
+ roles: [],
112249
+ disallowedRoles: ["logo", "favicon", "hero", "feature", "profile"],
112250
+ note: "VIDEO MEDIA ONLY (HLS master playlist or MP4). Do not assign an image URL here."
112251
+ },
112252
+ "modalVideo.image.src": {
112253
+ path: "modalVideo.image.src",
112254
+ roles: ["video-thumbnail", "hero", "feature"],
112255
+ disallowedRoles: ["logo", "favicon"],
112256
+ minPixelClass: "medium",
112257
+ note: "Poster image shown before the video plays. IMAGE MEDIA ONLY."
112258
+ }
112259
+ },
112260
+ requiresSiteCapabilities: ["media_library"],
112261
+ notes: [
112262
+ "Image and video media must never be swapped between the 'image' prop and the 'modalVideo' prop.",
112263
+ "All media src values must be absolute URLs to real assets; relative paths are not allowed."
112264
+ ]
112265
+ },
112266
+ exampleProps: {
112267
+ heading: "Reclaim Your Peace. Scale Sustainably.",
112268
+ description: "Somatic mindset coaching for high-achieving entrepreneurs ready to lead from strength \u2014 not survival mode.",
112269
+ action: {
112270
+ label: "Book Your Discovery Call",
112271
+ href: "/contact",
112272
+ variant: "default",
112273
+ size: "lg"
112274
+ },
112275
+ videoLabel: "Watch the Overview",
112276
+ videoTitle: "Coaching Overview",
112277
+ modalVideo: {
112278
+ image: {
112279
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112280
+ alt: "Coaching overview poster"
112281
+ },
112282
+ video: {
112283
+ src: "https://toastability-production.s3.amazonaws.com/4kox2ux0ye1wlqkdwg03s08a67i1"
112284
+ }
112285
+ },
112286
+ image: {
112287
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112288
+ alt: "Coach portrait"
112289
+ },
112290
+ background: "dark"
112291
+ }
112173
112292
  },
112174
112293
  "hero-business-operations-mosaic": {
112175
112294
  id: "hero-business-operations-mosaic",
@@ -120450,7 +120569,7 @@ function normalizeBlock(block, source) {
120450
120569
  },
120451
120570
  examples: {
120452
120571
  exampleUsage: block.exampleUsage || null,
120453
- defaultData: block.defaultProps ? JSON.parse(JSON.stringify(block.defaultProps)) : null
120572
+ exampleProps: block.exampleProps ? JSON.parse(JSON.stringify(block.exampleProps)) : null
120454
120573
  },
120455
120574
  source: source ?? null,
120456
120575
  importantUsageNotes: block.importantUsageNotes ?? null,
@@ -108,11 +108,18 @@ interface BlockContractFields {
108
108
  /** Structured, machine-readable usage requirements. */
109
109
  usageRequirements?: BlockUsageRequirements;
110
110
  /**
111
- * Canonical default / example payload for the block, matching the prop
112
- * shape. Optional. When supplied, consumers should prefer this over
113
- * parsing `exampleUsage` JSX.
111
+ * Canonical example payload for the block, matching the prop shape.
112
+ * Optional. When supplied, consumers should prefer this over parsing
113
+ * `exampleUsage` JSX.
114
+ *
115
+ * IMPORTANT: These are reference examples for AI prompting / preview
116
+ * tooling only. They are NOT runtime defaults — consumers MUST NOT
117
+ * substitute these values as fallback content on a real client site.
118
+ * The previous name (`defaultProps`) was renamed to make this explicit:
119
+ * AI agents had begun treating "default" values as safe runtime
120
+ * fallbacks for missing client data, which is incorrect.
114
121
  */
115
- defaultProps?: Record<string, unknown>;
122
+ exampleProps?: Record<string, unknown>;
116
123
  }
117
124
  /**
118
125
  * Metadata-only block registry entry (no component import)
@@ -164,12 +171,16 @@ interface BuilderContractPropsContract {
164
171
  interface BuilderContractExamples {
165
172
  exampleUsage: string | null;
166
173
  /**
167
- * Canonical default / example props payload. Populated from
168
- * BlockRegistryEntry.defaultProps when declared, otherwise null.
169
- * Older consumers that expected this to always be null should treat
170
- * an object value as advisory example data, not as a schema.
174
+ * Canonical example props payload. Populated from
175
+ * BlockRegistryEntry.exampleProps when declared, otherwise null.
176
+ *
177
+ * IMPORTANT: This is reference example data only, not a runtime
178
+ * fallback. Consumers MUST NOT substitute these values for missing
179
+ * client content. The previous name (`defaultData`) was renamed
180
+ * because downstream AI agents were treating it as safe runtime
181
+ * default content.
171
182
  */
172
- defaultData: Record<string, unknown> | null;
183
+ exampleProps: Record<string, unknown> | null;
173
184
  }
174
185
  interface BuilderContractBlock {
175
186
  componentId: string;
@@ -108,11 +108,18 @@ interface BlockContractFields {
108
108
  /** Structured, machine-readable usage requirements. */
109
109
  usageRequirements?: BlockUsageRequirements;
110
110
  /**
111
- * Canonical default / example payload for the block, matching the prop
112
- * shape. Optional. When supplied, consumers should prefer this over
113
- * parsing `exampleUsage` JSX.
111
+ * Canonical example payload for the block, matching the prop shape.
112
+ * Optional. When supplied, consumers should prefer this over parsing
113
+ * `exampleUsage` JSX.
114
+ *
115
+ * IMPORTANT: These are reference examples for AI prompting / preview
116
+ * tooling only. They are NOT runtime defaults — consumers MUST NOT
117
+ * substitute these values as fallback content on a real client site.
118
+ * The previous name (`defaultProps`) was renamed to make this explicit:
119
+ * AI agents had begun treating "default" values as safe runtime
120
+ * fallbacks for missing client data, which is incorrect.
114
121
  */
115
- defaultProps?: Record<string, unknown>;
122
+ exampleProps?: Record<string, unknown>;
116
123
  }
117
124
  /**
118
125
  * Metadata-only block registry entry (no component import)
@@ -164,12 +171,16 @@ interface BuilderContractPropsContract {
164
171
  interface BuilderContractExamples {
165
172
  exampleUsage: string | null;
166
173
  /**
167
- * Canonical default / example props payload. Populated from
168
- * BlockRegistryEntry.defaultProps when declared, otherwise null.
169
- * Older consumers that expected this to always be null should treat
170
- * an object value as advisory example data, not as a schema.
174
+ * Canonical example props payload. Populated from
175
+ * BlockRegistryEntry.exampleProps when declared, otherwise null.
176
+ *
177
+ * IMPORTANT: This is reference example data only, not a runtime
178
+ * fallback. Consumers MUST NOT substitute these values for missing
179
+ * client content. The previous name (`defaultData`) was renamed
180
+ * because downstream AI agents were treating it as safe runtime
181
+ * default content.
171
182
  */
172
- defaultData: Record<string, unknown> | null;
183
+ exampleProps: Record<string, unknown> | null;
173
184
  }
174
185
  interface BuilderContractBlock {
175
186
  componentId: string;
package/dist/registry.js CHANGED
@@ -66935,16 +66935,22 @@ var FeaturedCardsGridDropdown = ({
66935
66935
  optixFlowConfig
66936
66936
  }) => {
66937
66937
  return /* @__PURE__ */ jsxs("div", { children: [
66938
- /* @__PURE__ */ jsx("div", { className: "flex gap-4 pb-8", children: featuredLinks?.map((link, index) => /* @__PURE__ */ jsx(
66938
+ featuredLinks && featuredLinks?.length > 0 ? /* @__PURE__ */ jsx("div", { className: "flex gap-4 pb-8", children: featuredLinks?.map((link, index) => /* @__PURE__ */ jsx(
66939
66939
  FeaturedLink,
66940
66940
  {
66941
66941
  link,
66942
66942
  optixFlowConfig
66943
66943
  },
66944
66944
  `desktop-featured-link-${index}`
66945
- )) }),
66946
- /* @__PURE__ */ jsx(Separator, {}),
66947
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-4 pt-8", children: links?.map((link, index) => /* @__PURE__ */ jsx(NavLink, { link }, `default-nav-link-${index}`)) })
66945
+ )) }) : null,
66946
+ featuredLinks && featuredLinks?.length > 0 && links && links?.length > 0 ? /* @__PURE__ */ jsx(Separator, {}) : null,
66947
+ links && links?.length > 0 ? /* @__PURE__ */ jsx(
66948
+ "div",
66949
+ {
66950
+ className: `grid grid-cols-4 pt-${featuredLinks && featuredLinks?.length > 0 ? 8 : 0} gap-4`,
66951
+ children: links?.map((link, index) => /* @__PURE__ */ jsx(NavLink, { link }, `default-nav-link-${index}`))
66952
+ }
66953
+ ) : null
66948
66954
  ] });
66949
66955
  };
66950
66956
  var GroupedLinksImageDropdown = ({
@@ -112025,17 +112031,27 @@ var BLOCK_REGISTRY = {
112025
112031
  heading="Compassionate care for your mental wellbeing"
112026
112032
  description="Our team of experienced mental health professionals is dedicated to providing compassionate care and support to individuals in need."
112027
112033
  smallImages={[
112028
- { src: "/images/team-1.jpg", alt: "Dr. Smith" },
112029
- { src: "/images/team-2.jpg", alt: "Dr. Johnson" },
112034
+ {
112035
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112036
+ alt: "Dr. Smith",
112037
+ },
112038
+ {
112039
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112040
+ alt: "Dr. Johnson",
112041
+ },
112030
112042
  ]}
112031
112043
  testimonial={{
112032
112044
  quote:
112033
112045
  "The support I received changed my life. I'm so grateful for the compassionate care.",
112034
112046
  author: "Sarah M.",
112035
112047
  role: "Client",
112036
- avatarSrc: "/images/avatar.jpg",
112048
+ avatarSrc:
112049
+ "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112050
+ }}
112051
+ featureImage={{
112052
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112053
+ alt: "Mental health support",
112037
112054
  }}
112038
- featureImage={{ src: "/images/feature.jpg", alt: "Mental health support" }}
112039
112055
  actions={[
112040
112056
  { label: "Get Started", href: "#", variant: "default" },
112041
112057
  { label: "Talk to Sales", href: "#", variant: "outline" },
@@ -112043,7 +112059,7 @@ var BLOCK_REGISTRY = {
112043
112059
  background="gray"
112044
112060
  />
112045
112061
  `.trim(),
112046
- importantUsageNotes: "Only use if you have a valid testimonial - DO NOT MAKE UP A TESTIMONIAL/REVIEW. Supply exactly 2 images to the 'smallImages' prop and ensure you supply a 'featureImage' prop object. Do not exceed 40 characters for the 'heading' prop. Do not exceed 130 characters for the 'description' prop. If you supply multiple 'actions', ensure to use a variant of 'default' for the first action, and 'outline' for the second action to ensure proper visual distinction between the two CTAs. Follow the example props closely for this block.",
112062
+ importantUsageNotes: "Only use if you have a valid testimonial - DO NOT MAKE UP A TESTIMONIAL/REVIEW. Supply exactly 2 images to the 'smallImages' prop and ensure you supply a 'featureImage' prop object. Do not exceed 40 characters for the 'heading' prop. Do not exceed 130 characters for the 'description' prop. If you supply multiple 'actions', ensure to use a variant of 'default' for the first action, and 'outline' for the second action to ensure proper visual distinction between the two CTAs. All media src values must be absolute URLs to real CDN assets \u2014 never relative paths (e.g. '/images/...') or placeholder strings. Follow the example props closely for this block.",
112047
112063
  usageRequirements: {
112048
112064
  requiredProps: ["heading", "smallImages", "featureImage", "testimonial"],
112049
112065
  propConstraints: {
@@ -112091,20 +112107,29 @@ var BLOCK_REGISTRY = {
112091
112107
  },
112092
112108
  requiresSiteCapabilities: ["reviews_or_testimonials", "media_library"]
112093
112109
  },
112094
- defaultProps: {
112110
+ exampleProps: {
112095
112111
  heading: "Compassionate care for your mental wellbeing",
112096
112112
  description: "Our team of experienced mental health professionals is dedicated to providing compassionate care and support to individuals in need.",
112097
112113
  smallImages: [
112098
- { src: "/images/team-1.jpg", alt: "Dr. Smith" },
112099
- { src: "/images/team-2.jpg", alt: "Dr. Johnson" }
112114
+ {
112115
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112116
+ alt: "Dr. Smith"
112117
+ },
112118
+ {
112119
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112120
+ alt: "Dr. Johnson"
112121
+ }
112100
112122
  ],
112101
112123
  testimonial: {
112102
112124
  quote: "The support I received changed my life. I'm so grateful for the compassionate care.",
112103
112125
  author: "Sarah M.",
112104
112126
  role: "Client",
112105
- avatarSrc: "/images/avatar.jpg"
112127
+ avatarSrc: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp"
112128
+ },
112129
+ featureImage: {
112130
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112131
+ alt: "Mental health support"
112106
112132
  },
112107
- featureImage: { src: "/images/feature.jpg", alt: "Mental health support" },
112108
112133
  actions: [
112109
112134
  { label: "Get Started", href: "#", variant: "default" },
112110
112135
  { label: "Talk to Sales", href: "#", variant: "outline" }
@@ -112129,7 +112154,101 @@ var BLOCK_REGISTRY = {
112129
112154
  category: "hero",
112130
112155
  component: HeroMentorshipVideoSplit,
112131
112156
  props: "HeroMentorshipVideoSplitProps",
112132
- exampleUsage: `<HeroMentorshipVideoSplit />`.trim()
112157
+ exampleUsage: `
112158
+ <HeroMentorshipVideoSplit
112159
+ heading="Reclaim Your Peace. Scale Sustainably."
112160
+ description="Somatic mindset coaching for high-achieving entrepreneurs ready to lead from strength \u2014 not survival mode."
112161
+ action={{ label: "Book Your Discovery Call", href: "/contact", variant: "default", size: "lg" }}
112162
+ videoLabel="Watch the Overview"
112163
+ videoTitle="Coaching Overview"
112164
+ modalVideo={{
112165
+ image: {
112166
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112167
+ alt: "Coaching overview poster",
112168
+ },
112169
+ video: {
112170
+ src: "https://toastability-production.s3.amazonaws.com/4kox2ux0ye1wlqkdwg03s08a67i1",
112171
+ },
112172
+ }}
112173
+ image={{
112174
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112175
+ alt: "Coach portrait",
112176
+ }}
112177
+ background="dark"
112178
+ />
112179
+ `.trim(),
112180
+ importantUsageNotes: "The 'image' prop is the main hero image and MUST be an image asset (poster/photo). The 'modalVideo' prop's nested 'video.src' MUST be a video asset (HLS playlist or MP4) and 'modalVideo.image.src' MUST be an image asset (video poster). NEVER swap these: do not put a video URL into the 'image' prop and do not put an image URL into 'modalVideo.video.src'. All media src values must be absolute URLs to real CDN assets \u2014 never relative paths or placeholder strings. Keep 'heading' concise (under 60 characters) for visual balance.",
112181
+ usageRequirements: {
112182
+ requiredProps: ["heading", "image"],
112183
+ propConstraints: {
112184
+ heading: { required: true, maxLength: 60 },
112185
+ description: { maxLength: 220 },
112186
+ image: {
112187
+ required: true,
112188
+ note: "Main hero image. Must be an image asset (jpg/png/webp), NOT a video URL."
112189
+ },
112190
+ "modalVideo.video.src": {
112191
+ note: "Must be a video asset URL (HLS .m3u8 master playlist or .mp4). Must NOT be an image URL."
112192
+ },
112193
+ "modalVideo.image.src": {
112194
+ note: "Video poster image. Must be an image asset, NOT a video URL."
112195
+ }
112196
+ },
112197
+ mediaSlots: {
112198
+ image: {
112199
+ path: "image",
112200
+ roles: ["hero", "feature", "profile"],
112201
+ disallowedRoles: ["logo", "favicon", "video-thumbnail"],
112202
+ minPixelClass: "large",
112203
+ required: true,
112204
+ note: "Main hero image slot. IMAGE MEDIA ONLY. Do not assign a video URL here."
112205
+ },
112206
+ "modalVideo.video.src": {
112207
+ path: "modalVideo.video.src",
112208
+ roles: [],
112209
+ disallowedRoles: ["logo", "favicon", "hero", "feature", "profile"],
112210
+ note: "VIDEO MEDIA ONLY (HLS master playlist or MP4). Do not assign an image URL here."
112211
+ },
112212
+ "modalVideo.image.src": {
112213
+ path: "modalVideo.image.src",
112214
+ roles: ["video-thumbnail", "hero", "feature"],
112215
+ disallowedRoles: ["logo", "favicon"],
112216
+ minPixelClass: "medium",
112217
+ note: "Poster image shown before the video plays. IMAGE MEDIA ONLY."
112218
+ }
112219
+ },
112220
+ requiresSiteCapabilities: ["media_library"],
112221
+ notes: [
112222
+ "Image and video media must never be swapped between the 'image' prop and the 'modalVideo' prop.",
112223
+ "All media src values must be absolute URLs to real assets; relative paths are not allowed."
112224
+ ]
112225
+ },
112226
+ exampleProps: {
112227
+ heading: "Reclaim Your Peace. Scale Sustainably.",
112228
+ description: "Somatic mindset coaching for high-achieving entrepreneurs ready to lead from strength \u2014 not survival mode.",
112229
+ action: {
112230
+ label: "Book Your Discovery Call",
112231
+ href: "/contact",
112232
+ variant: "default",
112233
+ size: "lg"
112234
+ },
112235
+ videoLabel: "Watch the Overview",
112236
+ videoTitle: "Coaching Overview",
112237
+ modalVideo: {
112238
+ image: {
112239
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112240
+ alt: "Coaching overview poster"
112241
+ },
112242
+ video: {
112243
+ src: "https://toastability-production.s3.amazonaws.com/4kox2ux0ye1wlqkdwg03s08a67i1"
112244
+ }
112245
+ },
112246
+ image: {
112247
+ src: "https://cdn.ing/assets/i/r/308196/g6bbn73f7gxal82uu49m9prfd0u8/workplace-in-cafe.webp",
112248
+ alt: "Coach portrait"
112249
+ },
112250
+ background: "dark"
112251
+ }
112133
112252
  },
112134
112253
  "hero-business-operations-mosaic": {
112135
112254
  id: "hero-business-operations-mosaic",
@@ -120410,7 +120529,7 @@ function normalizeBlock(block, source) {
120410
120529
  },
120411
120530
  examples: {
120412
120531
  exampleUsage: block.exampleUsage || null,
120413
- defaultData: block.defaultProps ? JSON.parse(JSON.stringify(block.defaultProps)) : null
120532
+ exampleProps: block.exampleProps ? JSON.parse(JSON.stringify(block.exampleProps)) : null
120414
120533
  },
120415
120534
  source: source ?? null,
120416
120535
  importantUsageNotes: block.importantUsageNotes ?? null,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensite/ui",
3
- "version": "3.5.7",
3
+ "version": "3.5.9",
4
4
  "description": "Foundational UI component library for OpenSite Semantic Site Builder with tree-shakable exports and abstract styling",
5
5
  "keywords": [
6
6
  "react",