@opensite/ui 0.7.3 → 0.7.5

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
@@ -18240,6 +18240,7 @@ function CarouselFullscreenScrollFx({
18240
18240
  slides,
18241
18241
  slidesSlot,
18242
18242
  className,
18243
+ containerClassName = "h-full flex flex-col justify-center",
18243
18244
  navigationClassName,
18244
18245
  contentClassName,
18245
18246
  subtitleClassName,
@@ -18255,40 +18256,44 @@ function CarouselFullscreenScrollFx({
18255
18256
  patternOpacity = 0.033
18256
18257
  }) {
18257
18258
  const containerRef = React52.useRef(null);
18259
+ const scrollContainerRef = React52.useRef(null);
18258
18260
  const [activeIndex, setActiveIndex] = React52.useState(0);
18259
18261
  React52.useEffect(() => {
18260
- const observers = [];
18261
- slides?.forEach((slide, index) => {
18262
- const element = document.getElementById(`fullscreen-${slide.id}`);
18263
- if (element) {
18264
- const observer = new IntersectionObserver(
18265
- (entries) => {
18266
- entries.forEach((entry) => {
18267
- if (entry.isIntersecting && entry.intersectionRatio > 0.5) {
18268
- setActiveIndex(index);
18269
- }
18270
- });
18271
- },
18272
- { threshold: 0.5 }
18273
- );
18274
- observer.observe(element);
18275
- observers.push(observer);
18276
- }
18277
- });
18278
- return () => {
18279
- observers.forEach((observer) => observer.disconnect());
18262
+ const scrollContainer = scrollContainerRef.current;
18263
+ if (!scrollContainer || !slides?.length) return;
18264
+ const handleScroll = () => {
18265
+ const scrollLeft = scrollContainer.scrollLeft;
18266
+ const slideWidth = scrollContainer.clientWidth;
18267
+ const newIndex = Math.round(scrollLeft / slideWidth);
18268
+ setActiveIndex(newIndex);
18280
18269
  };
18270
+ scrollContainer.addEventListener("scroll", handleScroll);
18271
+ return () => scrollContainer.removeEventListener("scroll", handleScroll);
18281
18272
  }, [slides]);
18273
+ const scrollToSlide = React52.useCallback((index) => {
18274
+ const scrollContainer = scrollContainerRef.current;
18275
+ if (!scrollContainer) return;
18276
+ const slideWidth = scrollContainer.clientWidth;
18277
+ if (typeof scrollContainer.scrollTo === "function") {
18278
+ scrollContainer.scrollTo({
18279
+ left: slideWidth * index,
18280
+ behavior: "smooth"
18281
+ });
18282
+ } else {
18283
+ scrollContainer.scrollLeft = slideWidth * index;
18284
+ }
18285
+ }, []);
18282
18286
  return /* @__PURE__ */ jsxs(
18283
18287
  Section,
18284
18288
  {
18285
18289
  ref: containerRef,
18286
18290
  background,
18287
18291
  spacing,
18288
- className: cn(className),
18292
+ className: cn("relative overflow-hidden", className),
18289
18293
  pattern,
18290
18294
  patternOpacity,
18291
18295
  containerMaxWidth,
18296
+ containerClassName: "p-0",
18292
18297
  children: [
18293
18298
  /* @__PURE__ */ jsx(
18294
18299
  "div",
@@ -18300,10 +18305,7 @@ function CarouselFullscreenScrollFx({
18300
18305
  children: slides?.map((slide, index) => /* @__PURE__ */ jsx(
18301
18306
  "button",
18302
18307
  {
18303
- onClick: () => {
18304
- const element = document.getElementById(`fullscreen-${slide.id}`);
18305
- element?.scrollIntoView({ behavior: "smooth" });
18306
- },
18308
+ onClick: () => scrollToSlide(index),
18307
18309
  className: cn(
18308
18310
  "h-3 w-3 rounded-full border-2 transition-all",
18309
18311
  activeIndex === index ? "scale-125 border-white bg-white" : "border-white/50 bg-transparent hover:border-white"
@@ -18314,76 +18316,115 @@ function CarouselFullscreenScrollFx({
18314
18316
  ))
18315
18317
  }
18316
18318
  ),
18317
- slidesSlot ? slidesSlot : slides?.map((slide, index) => /* @__PURE__ */ jsxs(
18319
+ /* @__PURE__ */ jsx(
18318
18320
  "div",
18319
18321
  {
18320
- id: `fullscreen-${slide.id}`,
18321
- className: cn(
18322
- "relative flex h-screen w-full items-center justify-center overflow-hidden",
18323
- slide.className
18324
- ),
18325
- children: [
18326
- /* @__PURE__ */ jsxs("div", { className: "absolute inset-0", children: [
18327
- /* @__PURE__ */ jsx(
18328
- Img,
18329
- {
18330
- src: slide.image,
18331
- alt: typeof slide.title === "string" ? slide.title : `Slide ${index + 1}`,
18332
- className: cn(
18333
- "h-full w-full object-cover",
18334
- slide.imageClassName
18335
- ),
18336
- optixFlowConfig
18337
- }
18338
- ),
18339
- /* @__PURE__ */ jsx(
18340
- "div",
18341
- {
18342
- className: "absolute inset-0",
18343
- style: {
18344
- backgroundColor: slide.overlayColor || "rgba(0, 0, 0, 0.5)"
18345
- }
18346
- }
18347
- )
18348
- ] }),
18349
- /* @__PURE__ */ jsxs(
18322
+ ref: scrollContainerRef,
18323
+ className: "flex h-screen snap-x snap-mandatory overflow-x-auto overflow-y-hidden scroll-smooth",
18324
+ style: { scrollbarWidth: "none", msOverflowStyle: "none" },
18325
+ children: slidesSlot ? slidesSlot : slides?.map((slide, index) => {
18326
+ const renderActions = React52.useMemo(() => {
18327
+ if (!slide.actions || slide.actions.length === 0) return null;
18328
+ return slide.actions.map((action, actionIndex) => {
18329
+ const {
18330
+ label,
18331
+ icon,
18332
+ iconAfter,
18333
+ children,
18334
+ className: actionClassName,
18335
+ asButton,
18336
+ ...pressableProps
18337
+ } = action;
18338
+ return /* @__PURE__ */ jsx(
18339
+ Pressable,
18340
+ {
18341
+ asButton: asButton ?? true,
18342
+ className: actionClassName,
18343
+ ...pressableProps,
18344
+ children: children ?? /* @__PURE__ */ jsxs(Fragment$1, { children: [
18345
+ icon,
18346
+ label,
18347
+ iconAfter
18348
+ ] })
18349
+ },
18350
+ actionIndex
18351
+ );
18352
+ });
18353
+ }, [slide.actions]);
18354
+ return /* @__PURE__ */ jsxs(
18350
18355
  "div",
18351
18356
  {
18357
+ id: `fullscreen-${slide.id}`,
18352
18358
  className: cn(
18353
- "relative z-10 mx-auto max-w-4xl px-6 text-center text-white",
18354
- contentClassName
18359
+ "relative flex h-screen min-w-full snap-start items-center justify-center overflow-hidden",
18360
+ slide.className
18355
18361
  ),
18356
18362
  children: [
18357
- slide.subtitle && (typeof slide.subtitle === "string" ? /* @__PURE__ */ jsx(
18358
- "p",
18359
- {
18360
- className: cn(
18361
- "mb-4 text-sm font-medium uppercase tracking-widest text-white/70",
18362
- subtitleClassName
18363
- ),
18364
- children: slide.subtitle
18365
- }
18366
- ) : /* @__PURE__ */ jsx("div", { className: subtitleClassName, children: slide.subtitle })),
18367
- slide.title && (typeof slide.title === "string" ? /* @__PURE__ */ jsx(
18368
- "h2",
18369
- {
18370
- className: cn(
18371
- "mb-6 text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl",
18372
- titleClassName
18373
- ),
18374
- children: slide.title
18375
- }
18376
- ) : /* @__PURE__ */ jsx("div", { className: titleClassName, children: slide.title })),
18377
- slide.description && (typeof slide.description === "string" ? /* @__PURE__ */ jsx(
18378
- "p",
18363
+ /* @__PURE__ */ jsxs("div", { className: "absolute inset-0", children: [
18364
+ /* @__PURE__ */ jsx(
18365
+ Img,
18366
+ {
18367
+ src: slide.image,
18368
+ alt: typeof slide.title === "string" ? slide.title : `Slide ${index + 1}`,
18369
+ className: cn(
18370
+ "h-full w-full object-cover",
18371
+ slide.imageClassName
18372
+ ),
18373
+ optixFlowConfig
18374
+ }
18375
+ ),
18376
+ /* @__PURE__ */ jsx(
18377
+ "div",
18378
+ {
18379
+ className: "absolute inset-0",
18380
+ style: {
18381
+ backgroundColor: slide.overlayColor || "rgba(0, 0, 0, 0.5)"
18382
+ }
18383
+ }
18384
+ )
18385
+ ] }),
18386
+ /* @__PURE__ */ jsxs(
18387
+ "div",
18379
18388
  {
18380
18389
  className: cn(
18381
- "mx-auto max-w-2xl text-lg text-white/80 md:text-xl",
18382
- descriptionClassName
18390
+ "relative z-10 mx-auto max-w-4xl md:max-w-2xl px-6 text-center text-white text-shadow",
18391
+ contentClassName
18383
18392
  ),
18384
- children: slide.description
18393
+ children: [
18394
+ slide.subtitle && (typeof slide.subtitle === "string" ? /* @__PURE__ */ jsx(
18395
+ "p",
18396
+ {
18397
+ className: cn(
18398
+ "mb-4 text-sm font-medium uppercase tracking-widest text-white/70",
18399
+ subtitleClassName
18400
+ ),
18401
+ children: slide.subtitle
18402
+ }
18403
+ ) : /* @__PURE__ */ jsx("div", { className: subtitleClassName, children: slide.subtitle })),
18404
+ slide.title && (typeof slide.title === "string" ? /* @__PURE__ */ jsx(
18405
+ "h2",
18406
+ {
18407
+ className: cn(
18408
+ "mb-6 text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl",
18409
+ titleClassName
18410
+ ),
18411
+ children: slide.title
18412
+ }
18413
+ ) : /* @__PURE__ */ jsx("div", { className: titleClassName, children: slide.title })),
18414
+ slide.description && (typeof slide.description === "string" ? /* @__PURE__ */ jsx(
18415
+ "p",
18416
+ {
18417
+ className: cn(
18418
+ "mx-auto text-lg text-white/80 md:text-xl text-balance",
18419
+ descriptionClassName
18420
+ ),
18421
+ children: slide.description
18422
+ }
18423
+ ) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: slide.description })),
18424
+ renderActions && /* @__PURE__ */ jsx("div", { className: "mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row", children: renderActions })
18425
+ ]
18385
18426
  }
18386
- ) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: slide.description })),
18427
+ ),
18387
18428
  index < (slides?.length ?? 0) - 1 && /* @__PURE__ */ jsx(
18388
18429
  "div",
18389
18430
  {
@@ -18393,32 +18434,32 @@ function CarouselFullscreenScrollFx({
18393
18434
  ),
18394
18435
  children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2", children: [
18395
18436
  /* @__PURE__ */ jsx("span", { className: "text-xs uppercase tracking-widest text-white/50", children: "Scroll" }),
18396
- /* @__PURE__ */ jsx("div", { className: "h-12 w-px animate-pulse bg-gradient-to-b from-white/50 to-transparent" })
18437
+ /* @__PURE__ */ jsx("div", { className: "h-12 w-px animate-pulse bg-linear-to-b from-white/50 to-transparent" })
18397
18438
  ] })
18398
18439
  }
18440
+ ),
18441
+ /* @__PURE__ */ jsxs(
18442
+ "div",
18443
+ {
18444
+ className: cn(
18445
+ "absolute bottom-8 right-8 text-sm text-white/50",
18446
+ counterClassName
18447
+ ),
18448
+ children: [
18449
+ String(index + 1).padStart(2, "0"),
18450
+ " /",
18451
+ " ",
18452
+ String(slides?.length ?? 0).padStart(2, "0")
18453
+ ]
18454
+ }
18399
18455
  )
18400
18456
  ]
18401
- }
18402
- ),
18403
- /* @__PURE__ */ jsxs(
18404
- "div",
18405
- {
18406
- className: cn(
18407
- "absolute bottom-8 right-8 text-sm text-white/50",
18408
- counterClassName
18409
- ),
18410
- children: [
18411
- String(index + 1).padStart(2, "0"),
18412
- " /",
18413
- " ",
18414
- String(slides?.length ?? 0).padStart(2, "0")
18415
- ]
18416
- }
18417
- )
18418
- ]
18419
- },
18420
- slide.id
18421
- ))
18457
+ },
18458
+ slide.id
18459
+ );
18460
+ })
18461
+ }
18462
+ )
18422
18463
  ]
18423
18464
  }
18424
18465
  );
@@ -76900,7 +76941,7 @@ function ListSearchableGrid({
76900
76941
  }
76901
76942
  );
76902
76943
  }
76903
- var { useMemo: useMemo440 } = React52;
76944
+ var { useMemo: useMemo441 } = React52;
76904
76945
  function OfferModalNewsletterDiscount({
76905
76946
  title,
76906
76947
  emailPlaceholder,
@@ -76967,7 +77008,7 @@ function OfferModalNewsletterDiscount({
76967
77008
  });
76968
77009
  const formMethod = formConfig?.method?.toLowerCase() === "get" ? "get" : "post";
76969
77010
  const dialogProps = open !== void 0 ? { open, onOpenChange } : { defaultOpen };
76970
- const renderCloseButton = useMemo440(() => {
77011
+ const renderCloseButton = useMemo441(() => {
76971
77012
  if (closeButtonSlot) return closeButtonSlot;
76972
77013
  if (!closeButtonText) return null;
76973
77014
  return /* @__PURE__ */ jsx("div", { className: "absolute end-1.5 top-1.5", children: /* @__PURE__ */ jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx(
@@ -76981,12 +77022,12 @@ function OfferModalNewsletterDiscount({
76981
77022
  }
76982
77023
  ) }) });
76983
77024
  }, [closeButtonSlot, closeButtonText, closeClassName]);
76984
- const renderHeader = useMemo440(() => {
77025
+ const renderHeader = useMemo441(() => {
76985
77026
  if (headerSlot) return headerSlot;
76986
77027
  if (!title) return null;
76987
77028
  return /* @__PURE__ */ jsx(DialogHeader, { className: headerClassName, children: typeof title === "string" ? /* @__PURE__ */ jsx(DialogTitle, { className: cn("text-start font-serif text-2xl font-normal leading-snug", titleClassName), children: title }) : /* @__PURE__ */ jsx(DialogTitle, { className: cn("text-start font-serif text-2xl font-normal leading-snug", titleClassName), children: title }) });
76988
77029
  }, [headerSlot, title, headerClassName, titleClassName]);
76989
- const renderForm = useMemo440(() => {
77030
+ const renderForm = useMemo441(() => {
76990
77031
  if (formSlot) return formSlot;
76991
77032
  return /* @__PURE__ */ jsxs(
76992
77033
  Form,
@@ -77048,7 +77089,7 @@ function OfferModalNewsletterDiscount({
77048
77089
  }
77049
77090
  ) });
77050
77091
  }
77051
- var { useMemo: useMemo441 } = React52;
77092
+ var { useMemo: useMemo442 } = React52;
77052
77093
  function OfferModalMembershipImage({
77053
77094
  overline,
77054
77095
  title,
@@ -77124,7 +77165,7 @@ function OfferModalMembershipImage({
77124
77165
  });
77125
77166
  const formMethod = formConfig?.method?.toLowerCase() === "get" ? "get" : "post";
77126
77167
  const dialogProps = open !== void 0 ? { open, onOpenChange } : { defaultOpen };
77127
- const renderImage = useMemo441(() => {
77168
+ const renderImage = useMemo442(() => {
77128
77169
  if (imageSlot) return imageSlot;
77129
77170
  if (!image) return null;
77130
77171
  return /* @__PURE__ */ jsx("div", { className: cn("max-h-[290px] h-full overflow-hidden max-lg:hidden", imageWrapperClassName), children: /* @__PURE__ */ jsx(
@@ -77137,7 +77178,7 @@ function OfferModalMembershipImage({
77137
77178
  }
77138
77179
  ) });
77139
77180
  }, [imageSlot, image, imageWrapperClassName, imageClassName, optixFlowConfig]);
77140
- const renderCloseButton = useMemo441(() => {
77181
+ const renderCloseButton = useMemo442(() => {
77141
77182
  if (closeButtonSlot) return closeButtonSlot;
77142
77183
  return /* @__PURE__ */ jsx("div", { className: "absolute -end-px -top-px z-10", children: /* @__PURE__ */ jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx(
77143
77184
  Pressable,
@@ -77153,7 +77194,7 @@ function OfferModalMembershipImage({
77153
77194
  }
77154
77195
  ) }) });
77155
77196
  }, [closeButtonSlot, closeClassName]);
77156
- const renderForm = useMemo441(() => {
77197
+ const renderForm = useMemo442(() => {
77157
77198
  if (formSlot) return formSlot;
77158
77199
  return /* @__PURE__ */ jsxs(
77159
77200
  Form,
@@ -77216,7 +77257,7 @@ function OfferModalMembershipImage({
77216
77257
  }
77217
77258
  );
77218
77259
  }, [formSlot, form, formConfig, formMethod, emailPlaceholder, inputClassName, submitClassName, buttonText, formClassName]);
77219
- const renderFooter = useMemo441(() => {
77260
+ const renderFooter = useMemo442(() => {
77220
77261
  if (footerSlot) return footerSlot;
77221
77262
  if (!description) return null;
77222
77263
  return /* @__PURE__ */ jsx(DialogFooter, { className: footerClassName, children: /* @__PURE__ */ jsx(DialogDescription, { className: cn("text-muted-foreground text-center text-xs leading-relaxed", descriptionClassName), children: description }) });
@@ -77244,7 +77285,7 @@ function OfferModalMembershipImage({
77244
77285
  }
77245
77286
  ) });
77246
77287
  }
77247
- var { useMemo: useMemo442 } = React52;
77288
+ var { useMemo: useMemo443 } = React52;
77248
77289
  function OfferModalSheetNewsletter({
77249
77290
  logo,
77250
77291
  logoSlot,
@@ -77326,7 +77367,7 @@ function OfferModalSheetNewsletter({
77326
77367
  });
77327
77368
  const formMethod = formConfig?.method?.toLowerCase() === "get" ? "get" : "post";
77328
77369
  const sheetProps = open !== void 0 ? { open, onOpenChange } : { defaultOpen };
77329
- const renderLogo = useMemo442(() => {
77370
+ const renderLogo = useMemo443(() => {
77330
77371
  if (logoSlot) return logoSlot;
77331
77372
  if (!logo) return null;
77332
77373
  const logoSrc = typeof logo.src === "string" ? logo.src : logo.src.light;
@@ -77340,7 +77381,7 @@ function OfferModalSheetNewsletter({
77340
77381
  }
77341
77382
  );
77342
77383
  }, [logoSlot, logo, logoClassName, optixFlowConfig]);
77343
- const renderHeader = useMemo442(() => {
77384
+ const renderHeader = useMemo443(() => {
77344
77385
  if (headerSlot) return headerSlot;
77345
77386
  return /* @__PURE__ */ jsxs(SheetHeader, { className: cn("gap-8 p-0", headerClassName), children: [
77346
77387
  renderLogo,
@@ -77350,7 +77391,7 @@ function OfferModalSheetNewsletter({
77350
77391
  ] })
77351
77392
  ] });
77352
77393
  }, [headerSlot, renderLogo, headerClassName, title, titleClassName, description, descriptionClassName]);
77353
- const renderForm = useMemo442(() => {
77394
+ const renderForm = useMemo443(() => {
77354
77395
  if (formSlot) return formSlot;
77355
77396
  return /* @__PURE__ */ jsx(
77356
77397
  Form,
@@ -77398,7 +77439,7 @@ function OfferModalSheetNewsletter({
77398
77439
  }
77399
77440
  );
77400
77441
  }, [formSlot, form, formConfig, formMethod, emailPlaceholder, inputClassName, submitClassName, buttonText, formClassName]);
77401
- const renderLegal = useMemo442(() => {
77442
+ const renderLegal = useMemo443(() => {
77402
77443
  if (legalSlot) return legalSlot;
77403
77444
  if (!termsUrl || !termsText || !privacyUrl || !privacyText) return null;
77404
77445
  return /* @__PURE__ */ jsxs("p", { className: cn("text-muted-foreground text-xs", legalClassName), children: [
@@ -77412,7 +77453,7 @@ function OfferModalSheetNewsletter({
77412
77453
  "."
77413
77454
  ] });
77414
77455
  }, [legalSlot, termsUrl, termsText, privacyUrl, privacyText, legalClassName]);
77415
- const renderImage = useMemo442(() => {
77456
+ const renderImage = useMemo443(() => {
77416
77457
  if (imageSlot) return imageSlot;
77417
77458
  if (!image) return null;
77418
77459
  return /* @__PURE__ */ jsx("div", { className: cn("h-1/2 basis-1/2", imageWrapperClassName), children: /* @__PURE__ */ jsx(AspectRatio, { ratio: 1, className: "overflow-hidden", children: /* @__PURE__ */ jsx(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensite/ui",
3
- "version": "0.7.3",
3
+ "version": "0.7.5",
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",