@opensite/ui 3.5.0 → 3.5.3

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/registry.js CHANGED
@@ -51198,105 +51198,220 @@ function HeroAnnouncementBadge({
51198
51198
  }
51199
51199
  );
51200
51200
  }
51201
+ var HERO_TECH_CAROUSEL_MAX_ITEMS = 4;
51202
+ function resolveLogoSrc(logo) {
51203
+ if (typeof logo.src === "string") return logo.src;
51204
+ return logo.src?.light;
51205
+ }
51206
+ function HeroPanel({
51207
+ item,
51208
+ defaultAutoplayIntervalMs,
51209
+ optixFlowConfig,
51210
+ panelContentClassName
51211
+ }) {
51212
+ const {
51213
+ logo,
51214
+ logoSlot,
51215
+ title,
51216
+ content,
51217
+ actions,
51218
+ backgroundMedia,
51219
+ backgroundAutoplayIntervalMs,
51220
+ id,
51221
+ className,
51222
+ contentClassName,
51223
+ logoClassName,
51224
+ titleClassName,
51225
+ textClassName,
51226
+ actionsClassName,
51227
+ overlayClassName,
51228
+ optixFlowConfig: itemOptixFlowConfig
51229
+ } = item;
51230
+ const resolvedOptixFlow = itemOptixFlowConfig ?? optixFlowConfig;
51231
+ const renderBackground = useMemo(() => {
51232
+ if (!backgroundMedia || backgroundMedia.length === 0) return null;
51233
+ if (backgroundMedia.length === 1) {
51234
+ const image = backgroundMedia[0];
51235
+ if (!image?.src) return null;
51236
+ return /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 z-0", children: [
51237
+ /* @__PURE__ */ jsx(
51238
+ Img,
51239
+ {
51240
+ src: image.src,
51241
+ alt: image.alt ?? "",
51242
+ className: cn(
51243
+ "h-full w-full object-cover object-center",
51244
+ image.className
51245
+ ),
51246
+ optixFlowConfig: image.optixFlowConfig ?? resolvedOptixFlow,
51247
+ loading: "eager"
51248
+ }
51249
+ ),
51250
+ /* @__PURE__ */ jsx(
51251
+ "div",
51252
+ {
51253
+ className: cn(
51254
+ "absolute inset-0 bg-linear-to-b from-black/55 via-black/45 to-black/65",
51255
+ overlayClassName
51256
+ )
51257
+ }
51258
+ )
51259
+ ] });
51260
+ }
51261
+ return /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 z-0", children: [
51262
+ /* @__PURE__ */ jsx(
51263
+ ImageSlider,
51264
+ {
51265
+ images: backgroundMedia,
51266
+ className: "h-full w-full rounded-none border-0 shadow-none",
51267
+ imageClassName: "object-cover object-center",
51268
+ transition: "fade",
51269
+ autoplay: true,
51270
+ autoplayIntervalMs: backgroundAutoplayIntervalMs ?? defaultAutoplayIntervalMs,
51271
+ enableKeyboard: false,
51272
+ overlay: false,
51273
+ optixFlowConfig: resolvedOptixFlow
51274
+ }
51275
+ ),
51276
+ /* @__PURE__ */ jsx(
51277
+ "div",
51278
+ {
51279
+ className: cn(
51280
+ "absolute inset-0 bg-linear-to-b from-black/55 via-black/45 to-black/65",
51281
+ overlayClassName
51282
+ )
51283
+ }
51284
+ )
51285
+ ] });
51286
+ }, [
51287
+ backgroundMedia,
51288
+ backgroundAutoplayIntervalMs,
51289
+ defaultAutoplayIntervalMs,
51290
+ resolvedOptixFlow,
51291
+ overlayClassName
51292
+ ]);
51293
+ const hasBackground = !!backgroundMedia && backgroundMedia.length > 0;
51294
+ const renderLogo = useMemo(() => {
51295
+ if (logoSlot) return logoSlot;
51296
+ if (!logo) return null;
51297
+ const src = resolveLogoSrc(logo);
51298
+ if (!src) return null;
51299
+ return /* @__PURE__ */ jsx(
51300
+ Img,
51301
+ {
51302
+ src,
51303
+ alt: logo.alt,
51304
+ className: cn(
51305
+ "h-10 md:h-12 lg:h-14 w-auto max-w-[70%] object-contain",
51306
+ logo.imgClassName,
51307
+ logoClassName
51308
+ ),
51309
+ optixFlowConfig: resolvedOptixFlow
51310
+ }
51311
+ );
51312
+ }, [logoSlot, logo, logoClassName, resolvedOptixFlow]);
51313
+ const renderTitle = useMemo(() => {
51314
+ if (title === void 0 || title === null || title === "") return null;
51315
+ if (typeof title === "string") {
51316
+ return /* @__PURE__ */ jsx(
51317
+ "h2",
51318
+ {
51319
+ className: cn(
51320
+ "text-2xl md:text-3xl lg:text-4xl font-semibold text-balance",
51321
+ hasBackground && "text-white text-shadow-lg",
51322
+ titleClassName
51323
+ ),
51324
+ children: title
51325
+ }
51326
+ );
51327
+ }
51328
+ return /* @__PURE__ */ jsx("div", { className: titleClassName, children: title });
51329
+ }, [title, titleClassName, hasBackground]);
51330
+ const renderContent = useMemo(() => {
51331
+ if (content === void 0 || content === null || content === "")
51332
+ return null;
51333
+ if (typeof content === "string") {
51334
+ return /* @__PURE__ */ jsx(
51335
+ "p",
51336
+ {
51337
+ className: cn(
51338
+ "text-sm md:text-base leading-snug text-balance",
51339
+ hasBackground ? "text-white text-shadow-lg" : "",
51340
+ textClassName
51341
+ ),
51342
+ children: content
51343
+ }
51344
+ );
51345
+ }
51346
+ return /* @__PURE__ */ jsx("div", { className: textClassName, children: content });
51347
+ }, [content, textClassName, hasBackground]);
51348
+ return /* @__PURE__ */ jsxs(
51349
+ "div",
51350
+ {
51351
+ id,
51352
+ "data-slot": "hero-tech-carousel-panel",
51353
+ className: cn(
51354
+ // Mobile: stack vertically with content-fit height + padding.
51355
+ "relative w-full overflow-hidden",
51356
+ // Desktop: flex children share the row equally and fill height.
51357
+ "md:h-full md:flex-1 md:basis-0 md:min-w-0",
51358
+ // Provide a default panel background when no media is supplied so
51359
+ // separators between panels remain visible.
51360
+ !hasBackground && "bg-muted/30",
51361
+ className
51362
+ ),
51363
+ children: [
51364
+ renderBackground,
51365
+ /* @__PURE__ */ jsxs(
51366
+ "div",
51367
+ {
51368
+ className: cn(
51369
+ "relative z-10 flex h-full w-full flex-col items-center justify-center gap-4 md:gap-6",
51370
+ // Mobile padding keeps content readable when stacked.
51371
+ "px-6 py-12 md:px-8 md:py-12 lg:px-10",
51372
+ // Center content vertically; on desktop columns can be quite tall.
51373
+ "text-center",
51374
+ panelContentClassName,
51375
+ contentClassName
51376
+ ),
51377
+ children: [
51378
+ renderLogo,
51379
+ renderTitle,
51380
+ renderContent,
51381
+ /* @__PURE__ */ jsx(
51382
+ BlockActions,
51383
+ {
51384
+ actions,
51385
+ actionsClassName,
51386
+ verticalSpacing: "mt-2 md:mt-4",
51387
+ mobileConfig: { width: "fit", position: "center" }
51388
+ }
51389
+ )
51390
+ ]
51391
+ }
51392
+ )
51393
+ ]
51394
+ }
51395
+ );
51396
+ }
51201
51397
  function HeroTechCarousel({
51202
51398
  sectionId = "hero-tech-carousel",
51203
- heading,
51204
- description,
51205
- technologies,
51206
- carouselSlot,
51207
- autoplayDelay = 5e3,
51399
+ items,
51400
+ backgroundAutoplayIntervalMs = 5e3,
51208
51401
  background,
51402
+ spacing = "none",
51209
51403
  pattern,
51210
51404
  patternOpacity,
51211
51405
  className,
51212
- containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
51213
- spacing = "py-32",
51214
- headingClassName,
51215
- descriptionClassName,
51406
+ containerClassName = "px-0 sm:px-0 lg:px-0 max-w-full relative z-10 h-auto md:h-dvh w-screen flex items-stretch",
51407
+ panelsClassName,
51408
+ panelContentClassName,
51216
51409
  optixFlowConfig
51217
51410
  }) {
51218
- const plugin = useRef(
51219
- Autoplay({ delay: autoplayDelay, stopOnInteraction: false })
51220
- );
51221
- const [api, setApi] = useState();
51222
- const [current, setCurrent] = useState(0);
51223
- const [fadeIn, setFadeIn] = useState(true);
51224
- useEffect(() => {
51225
- if (!api) return;
51226
- setCurrent(api.selectedScrollSnap());
51227
- const updateCurrent = () => {
51228
- setFadeIn(false);
51229
- setTimeout(() => {
51230
- setCurrent(api.selectedScrollSnap());
51231
- setFadeIn(true);
51232
- }, 200);
51233
- };
51234
- api.on("select", updateCurrent);
51235
- api.on("settle", updateCurrent);
51236
- return () => {
51237
- api.off("select", updateCurrent);
51238
- api.off("settle", updateCurrent);
51239
- };
51240
- }, [api]);
51241
- const selectTechnology = (index) => {
51242
- if (api) {
51243
- api.scrollTo(index);
51244
- }
51245
- };
51246
- const renderCarousel = useMemo(() => {
51247
- if (carouselSlot) return carouselSlot;
51248
- if (!technologies || technologies.length === 0) return null;
51249
- return /* @__PURE__ */ jsx(
51250
- Carousel,
51251
- {
51252
- setApi,
51253
- plugins: [plugin.current],
51254
- opts: {
51255
- loop: true
51256
- },
51257
- className: "relative mx-auto w-full max-w-3xl before:absolute before:top-0 before:bottom-0 before:left-0 before:z-10 before:w-36 before:bg-linear-to-r before:from-background before:to-transparent after:absolute after:top-0 after:right-0 after:bottom-0 after:z-10 after:w-36 after:bg-linear-to-l after:from-background after:to-transparent",
51258
- onMouseEnter: plugin.current.stop,
51259
- onMouseLeave: plugin.current.reset,
51260
- children: /* @__PURE__ */ jsx(CarouselContent, { children: technologies.map((technology, idx) => /* @__PURE__ */ jsx(
51261
- CarouselItem,
51262
- {
51263
- className: "basis-1/3 select-none sm:basis-1/4 md:basis-1/6",
51264
- children: /* @__PURE__ */ jsxs(
51265
- "div",
51266
- {
51267
- className: cn(
51268
- "flex cursor-pointer items-center justify-center gap-2 rounded-md border px-4 py-2",
51269
- idx === current ? "border-input" : "border-transparent"
51270
- ),
51271
- onClick: () => selectTechnology(idx),
51272
- children: [
51273
- technology.logo && /* @__PURE__ */ jsx(
51274
- Img,
51275
- {
51276
- className: "h-4 shrink-0 md:h-7",
51277
- src: technology.logo,
51278
- alt: technology.name,
51279
- optixFlowConfig
51280
- }
51281
- ),
51282
- /* @__PURE__ */ jsx("p", { className: "text-nowrap", children: technology.name })
51283
- ]
51284
- }
51285
- )
51286
- },
51287
- idx
51288
- )) })
51289
- }
51290
- );
51291
- }, [
51292
- carouselSlot,
51293
- technologies,
51294
- setApi,
51295
- plugin,
51296
- current,
51297
- selectTechnology,
51298
- optixFlowConfig
51299
- ]);
51411
+ const visibleItems = useMemo(() => {
51412
+ if (!items || items.length === 0) return [];
51413
+ return items.slice(0, HERO_TECH_CAROUSEL_MAX_ITEMS);
51414
+ }, [items]);
51300
51415
  return /* @__PURE__ */ jsx(
51301
51416
  Section,
51302
51417
  {
@@ -51305,80 +51420,37 @@ function HeroTechCarousel({
51305
51420
  spacing,
51306
51421
  pattern,
51307
51422
  patternOpacity,
51308
- className,
51423
+ className: cn(
51424
+ "relative w-screen overflow-hidden",
51425
+ // Desktop fills the viewport; on mobile content drives the height.
51426
+ "h-auto md:h-dvh",
51427
+ "px-0 pt-0 pb-0",
51428
+ className
51429
+ ),
51309
51430
  containerClassName,
51310
- children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
51311
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col justify-center", children: [
51312
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
51313
- "h1",
51314
- {
51315
- className: cn(
51316
- "mx-auto mb-4 max-w-2xl text-center text-4xl font-bold md:text-6xl text-balance",
51317
- headingClassName
51318
- ),
51319
- children: heading
51320
- }
51321
- ) : /* @__PURE__ */ jsx(
51322
- "h1",
51323
- {
51324
- className: cn(
51325
- "mx-auto mb-4 max-w-2xl text-center text-4xl font-bold md:text-6xl text-balance",
51326
- headingClassName
51327
- ),
51328
- children: heading
51329
- }
51330
- )),
51331
- description && (typeof description === "string" ? /* @__PURE__ */ jsx(
51332
- "p",
51333
- {
51334
- className: cn(
51335
- "mx-auto mt-4 max-w-xl text-center text-lg text-balance",
51336
- descriptionClassName
51337
- ),
51338
- children: description
51339
- }
51340
- ) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description })),
51341
- technologies && technologies.length > 0 && /* @__PURE__ */ jsx(
51342
- "div",
51431
+ children: visibleItems.length === 0 ? null : /* @__PURE__ */ jsx(
51432
+ "div",
51433
+ {
51434
+ "data-slot": "hero-tech-carousel-panels",
51435
+ className: cn(
51436
+ // Mobile: vertical stack with auto height per panel.
51437
+ "flex w-full flex-col",
51438
+ // Desktop: equal-width row that fills section height.
51439
+ "md:h-full md:flex-row md:items-stretch",
51440
+ panelsClassName
51441
+ ),
51442
+ children: visibleItems.map((item, idx) => /* @__PURE__ */ jsx(
51443
+ HeroPanel,
51343
51444
  {
51344
- className: cn(
51345
- "mx-auto bg-muted mt-8 mb-12 flex h-[60px] w-fit items-center gap-2 rounded-md px-4 py-2 text-center"
51346
- ),
51347
- children: /* @__PURE__ */ jsxs(
51348
- "div",
51349
- {
51350
- className: cn(
51351
- "flex items-center gap-2 transition-opacity duration-300",
51352
- fadeIn ? "opacity-100" : "opacity-0"
51353
- ),
51354
- children: [
51355
- technologies && current && technologies[current] && technologies[current].logo ? /* @__PURE__ */ jsx(
51356
- Img,
51357
- {
51358
- src: technologies[current]?.logo,
51359
- alt: technologies[current]?.name,
51360
- className: "h-4 md:h-7",
51361
- optixFlowConfig
51362
- }
51363
- ) : null,
51364
- /* @__PURE__ */ jsx(
51365
- "p",
51366
- {
51367
- className: cn(
51368
- "px-2 font-mono text-sm",
51369
- technologies && technologies[current] && technologies[current].logo ? "border-l" : ""
51370
- ),
51371
- children: technologies[current]?.command
51372
- }
51373
- )
51374
- ]
51375
- }
51376
- )
51377
- }
51378
- )
51379
- ] }),
51380
- renderCarousel
51381
- ] })
51445
+ item,
51446
+ defaultAutoplayIntervalMs: backgroundAutoplayIntervalMs,
51447
+ optixFlowConfig,
51448
+ panelContentClassName
51449
+ },
51450
+ item.id ?? idx
51451
+ ))
51452
+ }
51453
+ )
51382
51454
  }
51383
51455
  );
51384
51456
  }
@@ -65311,8 +65383,8 @@ var NavbarPlatformResources = ({
65311
65383
  }
65312
65384
  ) }),
65313
65385
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 overflow-hidden", children: [
65314
- /* @__PURE__ */ jsx("div", { className: "break-words text-sm font-medium text-foreground", children: item.label }),
65315
- item.description && /* @__PURE__ */ jsx("div", { className: "break-words text-sm font-normal text-muted-foreground", children: item.description })
65386
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-medium truncate", children: item.label }),
65387
+ item.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: item.description })
65316
65388
  ] })
65317
65389
  ]
65318
65390
  },
@@ -65339,8 +65411,8 @@ var NavbarPlatformResources = ({
65339
65411
  }
65340
65412
  ) }),
65341
65413
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
65342
- /* @__PURE__ */ jsx("div", { className: "text-sm font-medium", children: item.label }),
65343
- item.description && /* @__PURE__ */ jsx("div", { className: "break-words text-xs text-muted-foreground group-hover/link:text-foreground", children: item.description })
65414
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-medium truncate", children: item.label }),
65415
+ item.description && /* @__PURE__ */ jsx("div", { className: "truncate text-xs text-muted-foreground group-hover/link:text-foreground", children: item.description })
65344
65416
  ] })
65345
65417
  ]
65346
65418
  }
@@ -65369,8 +65441,8 @@ var NavbarPlatformResources = ({
65369
65441
  }
65370
65442
  ) }),
65371
65443
  /* @__PURE__ */ jsxs("div", { className: "p-5 xl:p-8", children: [
65372
- /* @__PURE__ */ jsx("div", { className: "mb-2 text-base", children: featuredItem.label }),
65373
- featuredItem.description && /* @__PURE__ */ jsx("div", { className: "text-sm font-normal text-muted-foreground", children: featuredItem.description })
65444
+ /* @__PURE__ */ jsx("div", { className: "mb-2 text-base truncate", children: featuredItem.label }),
65445
+ featuredItem.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: featuredItem.description })
65374
65446
  ] })
65375
65447
  ] })
65376
65448
  }
@@ -65390,8 +65462,8 @@ var NavbarPlatformResources = ({
65390
65462
  size: 20
65391
65463
  }
65392
65464
  ) }),
65393
- /* @__PURE__ */ jsx("div", { className: "mb-1 break-words text-base", children: item.label }),
65394
- item.description && /* @__PURE__ */ jsx("div", { className: "break-words text-sm font-normal text-muted-foreground", children: item.description })
65465
+ /* @__PURE__ */ jsx("div", { className: "mb-1 truncate text-base", children: item.label }),
65466
+ item.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: item.description })
65395
65467
  ]
65396
65468
  },
65397
65469
  `${typeof item.label === "string" ? item.label : "item"}-${itemIndex}`
@@ -65417,7 +65489,7 @@ var NavbarPlatformResources = ({
65417
65489
  size: 16
65418
65490
  }
65419
65491
  ) }),
65420
- /* @__PURE__ */ jsx("div", { className: "min-w-0 break-words text-base", children: item.label })
65492
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 truncate text-base", children: item.label })
65421
65493
  ]
65422
65494
  },
65423
65495
  `${typeof item.label === "string" ? item.label : "item"}-${itemIndex}`
@@ -65441,8 +65513,8 @@ var NavbarPlatformResources = ({
65441
65513
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col p-5 xl:p-8", children: [
65442
65514
  ctaItem.background && /* @__PURE__ */ jsx("div", { className: "mb-8 text-xs tracking-widest text-muted-foreground uppercase", children: ctaItem.background }),
65443
65515
  /* @__PURE__ */ jsxs("div", { className: "mt-auto", children: [
65444
- /* @__PURE__ */ jsx("div", { className: "mb-4 break-words text-xl", children: ctaItem.label }),
65445
- ctaItem.description && /* @__PURE__ */ jsx("div", { className: "break-words text-sm font-normal text-muted-foreground", children: ctaItem.description })
65516
+ /* @__PURE__ */ jsx("div", { className: "mb-4 truncate text-xl", children: ctaItem.label }),
65517
+ ctaItem.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: ctaItem.description })
65446
65518
  ] })
65447
65519
  ] })
65448
65520
  ] })
@@ -65470,7 +65542,7 @@ var NavbarPlatformResources = ({
65470
65542
  size: 16
65471
65543
  }
65472
65544
  ),
65473
- /* @__PURE__ */ jsx("div", { className: "min-w-0 break-words text-base", children: item.label })
65545
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 truncate text-base", children: item.label })
65474
65546
  ]
65475
65547
  },
65476
65548
  `${typeof item.label === "string" ? item.label : "item"}-${itemIndex}`
@@ -65483,8 +65555,8 @@ var NavbarPlatformResources = ({
65483
65555
  className: "!flex !w-full min-w-0 flex-row items-center overflow-clip rounded-lg border border-input bg-background p-0 hover:bg-transparent",
65484
65556
  children: [
65485
65557
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 p-5 xl:p-8", children: [
65486
- /* @__PURE__ */ jsx("div", { className: "mb-2 break-words text-base", children: showcase.label }),
65487
- showcase.description && /* @__PURE__ */ jsx("div", { className: "break-words text-sm font-normal text-muted-foreground", children: showcase.description })
65558
+ /* @__PURE__ */ jsx("div", { className: "mb-2 truncate text-base", children: showcase.label }),
65559
+ showcase.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: showcase.description })
65488
65560
  ] }),
65489
65561
  /* @__PURE__ */ jsx("div", { className: "h-[154px] max-w-[264px] shrink-0", children: /* @__PURE__ */ jsx(
65490
65562
  Img,
@@ -65516,8 +65588,8 @@ var NavbarPlatformResources = ({
65516
65588
  href: getLinkUrl(item),
65517
65589
  className: "!flex h-full w-full min-w-0 flex-col overflow-clip rounded-lg border border-input bg-background p-5 hover:bg-accent hover:text-accent-foreground xl:p-8",
65518
65590
  children: /* @__PURE__ */ jsxs("div", { className: "mt-auto", children: [
65519
- /* @__PURE__ */ jsx("div", { className: "mb-2 break-words text-base", children: item.label }),
65520
- item.description && /* @__PURE__ */ jsx("div", { className: "break-words text-sm font-normal text-muted-foreground", children: item.description })
65591
+ /* @__PURE__ */ jsx("div", { className: "mb-2 truncate text-base", children: item.label }),
65592
+ item.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: item.description })
65521
65593
  ] })
65522
65594
  },
65523
65595
  `${typeof item.label === "string" ? item.label : "item"}-${itemIndex}`
@@ -65534,8 +65606,8 @@ var NavbarPlatformResources = ({
65534
65606
  className: "mb-6 !flex !w-full min-w-0 flex-row overflow-clip rounded-lg border border-input bg-background p-0 hover:bg-transparent",
65535
65607
  children: [
65536
65608
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 p-5 xl:p-8", children: [
65537
- /* @__PURE__ */ jsx("div", { className: "mb-2 break-words text-base", children: ctaItem.label }),
65538
- ctaItem.description && /* @__PURE__ */ jsx("div", { className: "break-words text-sm font-normal text-muted-foreground", children: ctaItem.description })
65609
+ /* @__PURE__ */ jsx("div", { className: "mb-2 truncate text-base", children: ctaItem.label }),
65610
+ ctaItem.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: ctaItem.description })
65539
65611
  ] }),
65540
65612
  ctaItem.image && /* @__PURE__ */ jsx("div", { className: "w-1/3 max-w-[130px] shrink-0", children: /* @__PURE__ */ jsx(
65541
65613
  Img,
@@ -65551,7 +65623,7 @@ var NavbarPlatformResources = ({
65551
65623
  ),
65552
65624
  ctaItem.background && /* @__PURE__ */ jsxs("div", { className: "flex flex-row items-center gap-3 rounded-lg bg-secondary/30 p-3 hover:bg-secondary/80 focus:bg-secondary/80", children: [
65553
65625
  /* @__PURE__ */ jsx("span", { className: "rounded-md bg-secondary px-2 py-1 text-xs font-semibold text-secondary-foreground", children: ctaItem.background }),
65554
- ctaItem.description && /* @__PURE__ */ jsx("span", { className: "text-sm text-ellipsis text-secondary-foreground", children: ctaItem.description })
65626
+ ctaItem.description && /* @__PURE__ */ jsx("span", { className: "truncate text-sm text-secondary-foreground", children: ctaItem.description })
65555
65627
  ] })
65556
65628
  ] })
65557
65629
  ] }) });
@@ -65573,8 +65645,8 @@ var NavbarPlatformResources = ({
65573
65645
  ) }),
65574
65646
  !item.image && (item.icon || item.iconName) && /* @__PURE__ */ jsx("div", { className: "flex h-12 w-12 shrink-0 items-center justify-center rounded-md border border-border bg-muted/40 text-muted-foreground", children: /* @__PURE__ */ jsx(DynamicIcon, { name: item.icon || item.iconName, size: 18 }) }),
65575
65647
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
65576
- /* @__PURE__ */ jsx("div", { className: "break-words text-sm font-medium text-foreground", children: item.label }),
65577
- item.description && /* @__PURE__ */ jsx("div", { className: "break-words text-sm font-normal text-muted-foreground", children: item.description })
65648
+ /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-medium text-foreground", children: item.label }),
65649
+ item.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: item.description })
65578
65650
  ] })
65579
65651
  ]
65580
65652
  },
@@ -110969,22 +111041,59 @@ var BLOCK_REGISTRY = {
110969
111041
  },
110970
111042
  "hero-tech-carousel": {
110971
111043
  id: "hero-tech-carousel",
110972
- name: "Tech Carousel Hero",
110973
- description: "A hero section with a carousel of technology logos or partner brands. Features headline, description, and auto-scrolling logo carousel. Perfect for showcasing integrations.",
111044
+ name: "Multi-Panel Hero",
111045
+ description: "A full-bleed hero with up to four side-by-side panels on desktop that stack vertically on mobile. Each panel supports an optional logo, title, content, action buttons, and an optional background image or autoplaying image carousel.",
110974
111046
  semanticTags: [
110975
111047
  "hero",
110976
- "carousel",
110977
- "tech",
110978
- "logos",
110979
- "partners",
110980
- "integrations",
111048
+ "multi-panel",
111049
+ "split",
111050
+ "full-bleed",
111051
+ "fullscreen",
111052
+ "background-image",
111053
+ "image-carousel",
110981
111054
  "brands",
110982
- "auto-scroll"
111055
+ "showcase",
111056
+ "cta"
110983
111057
  ],
110984
111058
  category: "hero",
110985
111059
  component: HeroTechCarousel,
110986
111060
  props: "HeroTechCarouselProps",
110987
- exampleUsage: `<HeroTechCarousel />`.trim()
111061
+ exampleUsage: `
111062
+ <HeroTechCarousel
111063
+ items={[
111064
+ {
111065
+ logo: { src: "/logos/insurance.svg", alt: "InsuranceSite" },
111066
+ title: "InsuranceSite",
111067
+ content: "Built for modern brokers",
111068
+ actions: [{ label: "Get Started", href: "/insurance" }],
111069
+ backgroundMedia: [
111070
+ { src: "/img/insurance-1.jpg", alt: "" },
111071
+ { src: "/img/insurance-2.jpg", alt: "" },
111072
+ ],
111073
+ },
111074
+ {
111075
+ logo: { src: "/logos/realtor.svg", alt: "RealtorSite" },
111076
+ title: "RealtorSite",
111077
+ content: "For high-volume listing agents",
111078
+ actions: [{ label: "Get Started", href: "/realtor" }],
111079
+ backgroundMedia: [{ src: "/img/realtor.jpg", alt: "" }],
111080
+ },
111081
+ {
111082
+ logo: { src: "/logos/castkit.svg", alt: "CastKit" },
111083
+ title: "CastKit",
111084
+ content: "AI-powered podcast production",
111085
+ actions: [{ label: "Get Started", href: "/castkit" }],
111086
+ },
111087
+ {
111088
+ logo: { src: "/logos/opensite.svg", alt: "OpenSite" },
111089
+ title: "OpenSite",
111090
+ content: "The platform behind it all",
111091
+ actions: [{ label: "Get Started", href: "/opensite" }],
111092
+ backgroundMedia: [{ src: "/img/opensite.jpg", alt: "" }],
111093
+ },
111094
+ ]}
111095
+ />
111096
+ `.trim()
110988
111097
  },
110989
111098
  "hero-simple-centered-image": {
110990
111099
  id: "hero-simple-centered-image",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensite/ui",
3
- "version": "3.5.0",
3
+ "version": "3.5.3",
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",