@opensite/ui 3.5.0 → 3.5.1

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,219 @@ 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-3xl md:text-4xl lg:text-5xl 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 === "") return null;
51332
+ if (typeof content === "string") {
51333
+ return /* @__PURE__ */ jsx(
51334
+ "p",
51335
+ {
51336
+ className: cn(
51337
+ "text-base md:text-lg leading-relaxed text-balance",
51338
+ hasBackground ? "text-white/90 text-shadow" : "text-muted-foreground",
51339
+ textClassName
51340
+ ),
51341
+ children: content
51342
+ }
51343
+ );
51344
+ }
51345
+ return /* @__PURE__ */ jsx("div", { className: textClassName, children: content });
51346
+ }, [content, textClassName, hasBackground]);
51347
+ return /* @__PURE__ */ jsxs(
51348
+ "div",
51349
+ {
51350
+ id,
51351
+ "data-slot": "hero-tech-carousel-panel",
51352
+ className: cn(
51353
+ // Mobile: stack vertically with content-fit height + padding.
51354
+ "relative w-full overflow-hidden",
51355
+ // Desktop: flex children share the row equally and fill height.
51356
+ "md:h-full md:flex-1 md:basis-0 md:min-w-0",
51357
+ // Provide a default panel background when no media is supplied so
51358
+ // separators between panels remain visible.
51359
+ !hasBackground && "bg-muted/30",
51360
+ className
51361
+ ),
51362
+ children: [
51363
+ renderBackground,
51364
+ /* @__PURE__ */ jsxs(
51365
+ "div",
51366
+ {
51367
+ className: cn(
51368
+ "relative z-10 flex h-full w-full flex-col items-center justify-center gap-4 md:gap-6",
51369
+ // Mobile padding keeps content readable when stacked.
51370
+ "px-6 py-12 md:px-8 md:py-12 lg:px-10",
51371
+ // Center content vertically; on desktop columns can be quite tall.
51372
+ "text-center",
51373
+ panelContentClassName,
51374
+ contentClassName
51375
+ ),
51376
+ children: [
51377
+ renderLogo,
51378
+ renderTitle,
51379
+ renderContent,
51380
+ /* @__PURE__ */ jsx(
51381
+ BlockActions,
51382
+ {
51383
+ actions,
51384
+ actionsClassName,
51385
+ verticalSpacing: "mt-2 md:mt-4",
51386
+ mobileConfig: { width: "fit", position: "center" }
51387
+ }
51388
+ )
51389
+ ]
51390
+ }
51391
+ )
51392
+ ]
51393
+ }
51394
+ );
51395
+ }
51201
51396
  function HeroTechCarousel({
51202
51397
  sectionId = "hero-tech-carousel",
51203
- heading,
51204
- description,
51205
- technologies,
51206
- carouselSlot,
51207
- autoplayDelay = 5e3,
51398
+ items,
51399
+ backgroundAutoplayIntervalMs = 5e3,
51208
51400
  background,
51401
+ spacing = "none",
51209
51402
  pattern,
51210
51403
  patternOpacity,
51211
51404
  className,
51212
- containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
51213
- spacing = "py-32",
51214
- headingClassName,
51215
- descriptionClassName,
51405
+ 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",
51406
+ panelsClassName,
51407
+ panelContentClassName,
51216
51408
  optixFlowConfig
51217
51409
  }) {
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
- ]);
51410
+ const visibleItems = useMemo(() => {
51411
+ if (!items || items.length === 0) return [];
51412
+ return items.slice(0, HERO_TECH_CAROUSEL_MAX_ITEMS);
51413
+ }, [items]);
51300
51414
  return /* @__PURE__ */ jsx(
51301
51415
  Section,
51302
51416
  {
@@ -51305,80 +51419,37 @@ function HeroTechCarousel({
51305
51419
  spacing,
51306
51420
  pattern,
51307
51421
  patternOpacity,
51308
- className,
51422
+ className: cn(
51423
+ "relative w-screen overflow-hidden",
51424
+ // Desktop fills the viewport; on mobile content drives the height.
51425
+ "h-auto md:h-dvh",
51426
+ "px-0 pt-0 pb-0",
51427
+ className
51428
+ ),
51309
51429
  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",
51430
+ children: visibleItems.length === 0 ? null : /* @__PURE__ */ jsx(
51431
+ "div",
51432
+ {
51433
+ "data-slot": "hero-tech-carousel-panels",
51434
+ className: cn(
51435
+ // Mobile: vertical stack with auto height per panel.
51436
+ "flex w-full flex-col",
51437
+ // Desktop: equal-width row that fills section height.
51438
+ "md:h-full md:flex-row md:items-stretch",
51439
+ panelsClassName
51440
+ ),
51441
+ children: visibleItems.map((item, idx) => /* @__PURE__ */ jsx(
51442
+ HeroPanel,
51343
51443
  {
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
- ] })
51444
+ item,
51445
+ defaultAutoplayIntervalMs: backgroundAutoplayIntervalMs,
51446
+ optixFlowConfig,
51447
+ panelContentClassName
51448
+ },
51449
+ item.id ?? idx
51450
+ ))
51451
+ }
51452
+ )
51382
51453
  }
51383
51454
  );
51384
51455
  }
@@ -65311,8 +65382,8 @@ var NavbarPlatformResources = ({
65311
65382
  }
65312
65383
  ) }),
65313
65384
  /* @__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 })
65385
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-medium truncate", children: item.label }),
65386
+ item.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: item.description })
65316
65387
  ] })
65317
65388
  ]
65318
65389
  },
@@ -65339,8 +65410,8 @@ var NavbarPlatformResources = ({
65339
65410
  }
65340
65411
  ) }),
65341
65412
  /* @__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 })
65413
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-medium truncate", children: item.label }),
65414
+ item.description && /* @__PURE__ */ jsx("div", { className: "truncate text-xs text-muted-foreground group-hover/link:text-foreground", children: item.description })
65344
65415
  ] })
65345
65416
  ]
65346
65417
  }
@@ -65369,8 +65440,8 @@ var NavbarPlatformResources = ({
65369
65440
  }
65370
65441
  ) }),
65371
65442
  /* @__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 })
65443
+ /* @__PURE__ */ jsx("div", { className: "mb-2 text-base truncate", children: featuredItem.label }),
65444
+ featuredItem.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: featuredItem.description })
65374
65445
  ] })
65375
65446
  ] })
65376
65447
  }
@@ -65390,8 +65461,8 @@ var NavbarPlatformResources = ({
65390
65461
  size: 20
65391
65462
  }
65392
65463
  ) }),
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 })
65464
+ /* @__PURE__ */ jsx("div", { className: "mb-1 truncate text-base", children: item.label }),
65465
+ item.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: item.description })
65395
65466
  ]
65396
65467
  },
65397
65468
  `${typeof item.label === "string" ? item.label : "item"}-${itemIndex}`
@@ -65417,7 +65488,7 @@ var NavbarPlatformResources = ({
65417
65488
  size: 16
65418
65489
  }
65419
65490
  ) }),
65420
- /* @__PURE__ */ jsx("div", { className: "min-w-0 break-words text-base", children: item.label })
65491
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 truncate text-base", children: item.label })
65421
65492
  ]
65422
65493
  },
65423
65494
  `${typeof item.label === "string" ? item.label : "item"}-${itemIndex}`
@@ -65441,8 +65512,8 @@ var NavbarPlatformResources = ({
65441
65512
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col p-5 xl:p-8", children: [
65442
65513
  ctaItem.background && /* @__PURE__ */ jsx("div", { className: "mb-8 text-xs tracking-widest text-muted-foreground uppercase", children: ctaItem.background }),
65443
65514
  /* @__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 })
65515
+ /* @__PURE__ */ jsx("div", { className: "mb-4 truncate text-xl", children: ctaItem.label }),
65516
+ ctaItem.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: ctaItem.description })
65446
65517
  ] })
65447
65518
  ] })
65448
65519
  ] })
@@ -65470,7 +65541,7 @@ var NavbarPlatformResources = ({
65470
65541
  size: 16
65471
65542
  }
65472
65543
  ),
65473
- /* @__PURE__ */ jsx("div", { className: "min-w-0 break-words text-base", children: item.label })
65544
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 truncate text-base", children: item.label })
65474
65545
  ]
65475
65546
  },
65476
65547
  `${typeof item.label === "string" ? item.label : "item"}-${itemIndex}`
@@ -65483,8 +65554,8 @@ var NavbarPlatformResources = ({
65483
65554
  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
65555
  children: [
65485
65556
  /* @__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 })
65557
+ /* @__PURE__ */ jsx("div", { className: "mb-2 truncate text-base", children: showcase.label }),
65558
+ showcase.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: showcase.description })
65488
65559
  ] }),
65489
65560
  /* @__PURE__ */ jsx("div", { className: "h-[154px] max-w-[264px] shrink-0", children: /* @__PURE__ */ jsx(
65490
65561
  Img,
@@ -65516,8 +65587,8 @@ var NavbarPlatformResources = ({
65516
65587
  href: getLinkUrl(item),
65517
65588
  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
65589
  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 })
65590
+ /* @__PURE__ */ jsx("div", { className: "mb-2 truncate text-base", children: item.label }),
65591
+ item.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: item.description })
65521
65592
  ] })
65522
65593
  },
65523
65594
  `${typeof item.label === "string" ? item.label : "item"}-${itemIndex}`
@@ -65534,8 +65605,8 @@ var NavbarPlatformResources = ({
65534
65605
  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
65606
  children: [
65536
65607
  /* @__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 })
65608
+ /* @__PURE__ */ jsx("div", { className: "mb-2 truncate text-base", children: ctaItem.label }),
65609
+ ctaItem.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: ctaItem.description })
65539
65610
  ] }),
65540
65611
  ctaItem.image && /* @__PURE__ */ jsx("div", { className: "w-1/3 max-w-[130px] shrink-0", children: /* @__PURE__ */ jsx(
65541
65612
  Img,
@@ -65551,7 +65622,7 @@ var NavbarPlatformResources = ({
65551
65622
  ),
65552
65623
  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
65624
  /* @__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 })
65625
+ ctaItem.description && /* @__PURE__ */ jsx("span", { className: "truncate text-sm text-secondary-foreground", children: ctaItem.description })
65555
65626
  ] })
65556
65627
  ] })
65557
65628
  ] }) });
@@ -65573,8 +65644,8 @@ var NavbarPlatformResources = ({
65573
65644
  ) }),
65574
65645
  !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
65646
  /* @__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 })
65647
+ /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-medium text-foreground", children: item.label }),
65648
+ item.description && /* @__PURE__ */ jsx("div", { className: "truncate text-sm font-normal text-muted-foreground", children: item.description })
65578
65649
  ] })
65579
65650
  ]
65580
65651
  },
@@ -110969,22 +111040,59 @@ var BLOCK_REGISTRY = {
110969
111040
  },
110970
111041
  "hero-tech-carousel": {
110971
111042
  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.",
111043
+ name: "Multi-Panel Hero",
111044
+ 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
111045
  semanticTags: [
110975
111046
  "hero",
110976
- "carousel",
110977
- "tech",
110978
- "logos",
110979
- "partners",
110980
- "integrations",
111047
+ "multi-panel",
111048
+ "split",
111049
+ "full-bleed",
111050
+ "fullscreen",
111051
+ "background-image",
111052
+ "image-carousel",
110981
111053
  "brands",
110982
- "auto-scroll"
111054
+ "showcase",
111055
+ "cta"
110983
111056
  ],
110984
111057
  category: "hero",
110985
111058
  component: HeroTechCarousel,
110986
111059
  props: "HeroTechCarouselProps",
110987
- exampleUsage: `<HeroTechCarousel />`.trim()
111060
+ exampleUsage: `
111061
+ <HeroTechCarousel
111062
+ items={[
111063
+ {
111064
+ logo: { src: "/logos/insurance.svg", alt: "InsuranceSite" },
111065
+ title: "InsuranceSite",
111066
+ content: "Built for modern brokers",
111067
+ actions: [{ label: "Get Started", href: "/insurance" }],
111068
+ backgroundMedia: [
111069
+ { src: "/img/insurance-1.jpg", alt: "" },
111070
+ { src: "/img/insurance-2.jpg", alt: "" },
111071
+ ],
111072
+ },
111073
+ {
111074
+ logo: { src: "/logos/realtor.svg", alt: "RealtorSite" },
111075
+ title: "RealtorSite",
111076
+ content: "For high-volume listing agents",
111077
+ actions: [{ label: "Get Started", href: "/realtor" }],
111078
+ backgroundMedia: [{ src: "/img/realtor.jpg", alt: "" }],
111079
+ },
111080
+ {
111081
+ logo: { src: "/logos/castkit.svg", alt: "CastKit" },
111082
+ title: "CastKit",
111083
+ content: "AI-powered podcast production",
111084
+ actions: [{ label: "Get Started", href: "/castkit" }],
111085
+ },
111086
+ {
111087
+ logo: { src: "/logos/opensite.svg", alt: "OpenSite" },
111088
+ title: "OpenSite",
111089
+ content: "The platform behind it all",
111090
+ actions: [{ label: "Get Started", href: "/opensite" }],
111091
+ backgroundMedia: [{ src: "/img/opensite.jpg", alt: "" }],
111092
+ },
111093
+ ]}
111094
+ />
111095
+ `.trim()
110988
111096
  },
110989
111097
  "hero-simple-centered-image": {
110990
111098
  id: "hero-simple-centered-image",
@@ -77,6 +77,6 @@ interface SocialLinkIconProps extends Omit<PressableProps, "children">, SocialLi
77
77
  * />
78
78
  * ```
79
79
  */
80
- declare const SocialLinkIcon: React.ForwardRefExoticComponent<SocialLinkIconProps & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement | HTMLSpanElement>>;
80
+ declare const SocialLinkIcon: React.ForwardRefExoticComponent<SocialLinkIconProps & React.RefAttributes<HTMLButtonElement | HTMLAnchorElement | HTMLSpanElement>>;
81
81
 
82
82
  export { SocialLinkIcon, type SocialLinkIconDynamicIconProps, type SocialLinkIconProps };
@@ -77,6 +77,6 @@ interface SocialLinkIconProps extends Omit<PressableProps, "children">, SocialLi
77
77
  * />
78
78
  * ```
79
79
  */
80
- declare const SocialLinkIcon: React.ForwardRefExoticComponent<SocialLinkIconProps & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement | HTMLSpanElement>>;
80
+ declare const SocialLinkIcon: React.ForwardRefExoticComponent<SocialLinkIconProps & React.RefAttributes<HTMLButtonElement | HTMLAnchorElement | HTMLSpanElement>>;
81
81
 
82
82
  export { SocialLinkIcon, type SocialLinkIconDynamicIconProps, type SocialLinkIconProps };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensite/ui",
3
- "version": "3.5.0",
3
+ "version": "3.5.1",
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",