@opensite/ui 3.4.3 → 3.4.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.
@@ -766,25 +766,6 @@ var slideVariants = {
766
766
  }
767
767
  }
768
768
  };
769
- var fadeVariants = {
770
- initial: {
771
- opacity: 0
772
- },
773
- visible: {
774
- opacity: 1,
775
- transition: {
776
- duration: 0.8,
777
- ease: [0.4, 0, 0.2, 1]
778
- }
779
- },
780
- fadeExit: {
781
- opacity: 0,
782
- transition: {
783
- duration: 0.8,
784
- ease: [0.4, 0, 0.2, 1]
785
- }
786
- }
787
- };
788
769
  var normalizeIndex = (index, length) => {
789
770
  if (!length) return 0;
790
771
  const safeIndex = index % length;
@@ -872,38 +853,55 @@ var ImageSlider = ({
872
853
  perspective: "1000px"
873
854
  },
874
855
  children: [
875
- /* @__PURE__ */ jsxRuntime.jsx(
876
- react.AnimatePresence,
856
+ transition === "fade" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0", children: images.map((image, index) => /* @__PURE__ */ jsxRuntime.jsx(
857
+ "div",
877
858
  {
878
- mode: transition === "fade" ? "sync" : "wait",
879
- initial: false,
880
- children: activeImage ? /* @__PURE__ */ jsxRuntime.jsx(
881
- react.motion.div,
859
+ "aria-hidden": index !== currentIndex,
860
+ className: cn(
861
+ "absolute inset-0 opacity-0 transition-opacity duration-1000 ease-in-out motion-reduce:transition-none",
862
+ index === currentIndex && "opacity-100"
863
+ ),
864
+ children: /* @__PURE__ */ jsxRuntime.jsx(
865
+ img.Img,
882
866
  {
883
- initial: "initial",
884
- animate: "visible",
885
- exit: transition === "fade" ? "fadeExit" : direction === "up" ? "upExit" : "downExit",
886
- variants: transition === "fade" ? fadeVariants : slideVariants,
887
- className: "absolute inset-0",
888
- children: /* @__PURE__ */ jsxRuntime.jsx(
889
- img.Img,
890
- {
891
- src: activeImage.src,
892
- alt: activeImage.alt,
893
- className: cn(
894
- "h-full w-full object-cover object-center",
895
- imageClassName,
896
- activeImage.className
897
- ),
898
- optixFlowConfig: activeImage.optixFlowConfig ?? optixFlowConfig,
899
- loading: "eager"
900
- }
901
- )
902
- },
903
- `${currentIndex}-${activeImage.src ?? "image"}`
904
- ) : null
905
- }
906
- ),
867
+ src: image.src,
868
+ alt: image.alt,
869
+ className: cn(
870
+ "h-full w-full object-cover object-center",
871
+ imageClassName,
872
+ image.className
873
+ ),
874
+ optixFlowConfig: image.optixFlowConfig ?? optixFlowConfig,
875
+ loading: "eager"
876
+ }
877
+ )
878
+ },
879
+ `${image.src ?? "image"}-${index}`
880
+ )) }) : /* @__PURE__ */ jsxRuntime.jsx(react.AnimatePresence, { mode: "wait", initial: false, children: activeImage ? /* @__PURE__ */ jsxRuntime.jsx(
881
+ react.motion.div,
882
+ {
883
+ initial: "initial",
884
+ animate: "visible",
885
+ exit: direction === "up" ? "upExit" : "downExit",
886
+ variants: slideVariants,
887
+ className: "absolute inset-0",
888
+ children: /* @__PURE__ */ jsxRuntime.jsx(
889
+ img.Img,
890
+ {
891
+ src: activeImage.src,
892
+ alt: activeImage.alt,
893
+ className: cn(
894
+ "h-full w-full object-cover object-center",
895
+ imageClassName,
896
+ activeImage.className
897
+ ),
898
+ optixFlowConfig: activeImage.optixFlowConfig ?? optixFlowConfig,
899
+ loading: "eager"
900
+ }
901
+ )
902
+ },
903
+ `${currentIndex}-${activeImage.src ?? "image"}`
904
+ ) : null }),
907
905
  overlayContent,
908
906
  children ? /* @__PURE__ */ jsxRuntime.jsx(
909
907
  "div",
@@ -743,25 +743,6 @@ var slideVariants = {
743
743
  }
744
744
  }
745
745
  };
746
- var fadeVariants = {
747
- initial: {
748
- opacity: 0
749
- },
750
- visible: {
751
- opacity: 1,
752
- transition: {
753
- duration: 0.8,
754
- ease: [0.4, 0, 0.2, 1]
755
- }
756
- },
757
- fadeExit: {
758
- opacity: 0,
759
- transition: {
760
- duration: 0.8,
761
- ease: [0.4, 0, 0.2, 1]
762
- }
763
- }
764
- };
765
746
  var normalizeIndex = (index, length) => {
766
747
  if (!length) return 0;
767
748
  const safeIndex = index % length;
@@ -849,38 +830,55 @@ var ImageSlider = ({
849
830
  perspective: "1000px"
850
831
  },
851
832
  children: [
852
- /* @__PURE__ */ jsx(
853
- AnimatePresence$1,
833
+ transition === "fade" ? /* @__PURE__ */ jsx("div", { className: "absolute inset-0", children: images.map((image, index) => /* @__PURE__ */ jsx(
834
+ "div",
854
835
  {
855
- mode: transition === "fade" ? "sync" : "wait",
856
- initial: false,
857
- children: activeImage ? /* @__PURE__ */ jsx(
858
- motion$1.div,
836
+ "aria-hidden": index !== currentIndex,
837
+ className: cn(
838
+ "absolute inset-0 opacity-0 transition-opacity duration-1000 ease-in-out motion-reduce:transition-none",
839
+ index === currentIndex && "opacity-100"
840
+ ),
841
+ children: /* @__PURE__ */ jsx(
842
+ Img,
859
843
  {
860
- initial: "initial",
861
- animate: "visible",
862
- exit: transition === "fade" ? "fadeExit" : direction === "up" ? "upExit" : "downExit",
863
- variants: transition === "fade" ? fadeVariants : slideVariants,
864
- className: "absolute inset-0",
865
- children: /* @__PURE__ */ jsx(
866
- Img,
867
- {
868
- src: activeImage.src,
869
- alt: activeImage.alt,
870
- className: cn(
871
- "h-full w-full object-cover object-center",
872
- imageClassName,
873
- activeImage.className
874
- ),
875
- optixFlowConfig: activeImage.optixFlowConfig ?? optixFlowConfig,
876
- loading: "eager"
877
- }
878
- )
879
- },
880
- `${currentIndex}-${activeImage.src ?? "image"}`
881
- ) : null
882
- }
883
- ),
844
+ src: image.src,
845
+ alt: image.alt,
846
+ className: cn(
847
+ "h-full w-full object-cover object-center",
848
+ imageClassName,
849
+ image.className
850
+ ),
851
+ optixFlowConfig: image.optixFlowConfig ?? optixFlowConfig,
852
+ loading: "eager"
853
+ }
854
+ )
855
+ },
856
+ `${image.src ?? "image"}-${index}`
857
+ )) }) : /* @__PURE__ */ jsx(AnimatePresence$1, { mode: "wait", initial: false, children: activeImage ? /* @__PURE__ */ jsx(
858
+ motion$1.div,
859
+ {
860
+ initial: "initial",
861
+ animate: "visible",
862
+ exit: direction === "up" ? "upExit" : "downExit",
863
+ variants: slideVariants,
864
+ className: "absolute inset-0",
865
+ children: /* @__PURE__ */ jsx(
866
+ Img,
867
+ {
868
+ src: activeImage.src,
869
+ alt: activeImage.alt,
870
+ className: cn(
871
+ "h-full w-full object-cover object-center",
872
+ imageClassName,
873
+ activeImage.className
874
+ ),
875
+ optixFlowConfig: activeImage.optixFlowConfig ?? optixFlowConfig,
876
+ loading: "eager"
877
+ }
878
+ )
879
+ },
880
+ `${currentIndex}-${activeImage.src ?? "image"}`
881
+ ) : null }),
884
882
  overlayContent,
885
883
  children ? /* @__PURE__ */ jsx(
886
884
  "div",
@@ -422,6 +422,12 @@ var Section = React__namespace.default.forwardRef(
422
422
  }
423
423
  );
424
424
  Section.displayName = "Section";
425
+ function isRenderableNode(value) {
426
+ return value !== null && value !== void 0 && typeof value !== "boolean" && !(typeof value === "string" && value.trim().length === 0);
427
+ }
428
+ function firstRenderableNode(...values) {
429
+ return values.find(isRenderableNode);
430
+ }
425
431
  function FeatureChecklistImage({
426
432
  sectionId = "feature-checklist-image",
427
433
  title,
@@ -434,9 +440,10 @@ function FeatureChecklistImage({
434
440
  actions,
435
441
  actionsSlot,
436
442
  checklistItems,
443
+ benefits,
437
444
  checklistSlot,
438
445
  className,
439
- containerClassName = "px-6 sm:px-6 md:px-6 lg:px-8",
446
+ containerClassName = "max-w-screen-2xl px-6 sm:px-6 md:px-6 lg:px-8",
440
447
  contentWrapperClassName,
441
448
  imageClassName,
442
449
  contentClassName,
@@ -493,33 +500,69 @@ function FeatureChecklistImage({
493
500
  if (imageSlot) return imageSlot;
494
501
  if (!imageSrc) return null;
495
502
  return /* @__PURE__ */ jsxRuntime.jsx(
496
- img.Img,
503
+ "div",
497
504
  {
498
- src: imageSrc,
499
- alt: imageAlt || "Feature illustration",
500
505
  className: cn(
501
- "max-h-96 w-full rounded-lg object-cover md:max-h-[500px] md:w-1/2 shadow-xl",
506
+ "relative aspect-[3/2] w-full overflow-hidden rounded-lg shadow-xl",
502
507
  imageClassName
503
508
  ),
504
- loading: "lazy",
505
- optixFlowConfig
509
+ children: /* @__PURE__ */ jsxRuntime.jsx(
510
+ img.Img,
511
+ {
512
+ src: imageSrc,
513
+ alt: imageAlt || "Feature illustration",
514
+ className: cn(
515
+ "block h-full w-full object-cover object-center",
516
+ imageClassName
517
+ ),
518
+ loading: "lazy",
519
+ optixFlowConfig
520
+ }
521
+ )
506
522
  }
507
523
  );
508
524
  }, [imageSlot, imageSrc, imageAlt, imageClassName, optixFlowConfig]);
509
525
  const checklistContent = React.useMemo(() => {
510
526
  if (checklistSlot) return checklistSlot;
511
- if (!checklistItems || checklistItems.length === 0) return null;
512
- return checklistItems.map((item, index) => {
527
+ const items = checklistItems ?? benefits;
528
+ if (!items || items.length === 0) return null;
529
+ const renderedItems = [];
530
+ items.forEach((item, index) => {
513
531
  const isString = typeof item === "string";
514
- const content = isString ? item : item.content;
515
- const iconElement = isString ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/circle-check-big", size: 16 }) : item.icon ?? (item.iconName ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: item.iconName, size: 16 }) : /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/circle-check-big", size: 16 }));
532
+ const content = isString ? item : firstRenderableNode(item.content, item.text, item.label);
533
+ const title2 = isString ? void 0 : item.title;
534
+ const description2 = isString ? void 0 : item.description;
535
+ if (!isRenderableNode(content) && !isRenderableNode(title2) && !isRenderableNode(description2)) {
536
+ return;
537
+ }
538
+ const iconElement = isString ? /* @__PURE__ */ jsxRuntime.jsx(
539
+ DynamicIcon,
540
+ {
541
+ name: "lucide/circle-check-big",
542
+ size: 20,
543
+ className: "h-5 w-5"
544
+ }
545
+ ) : item.icon ?? (item.iconName ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: item.iconName, size: 20, className: "h-5 w-5" }) : /* @__PURE__ */ jsxRuntime.jsx(
546
+ DynamicIcon,
547
+ {
548
+ name: "lucide/circle-check-big",
549
+ size: 20,
550
+ className: "h-5 w-5"
551
+ }
552
+ ));
516
553
  const itemClassName = isString ? void 0 : item.className;
517
- return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("flex items-start gap-3", itemClassName), children: [
518
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1", children: iconElement }),
519
- content
520
- ] }, index);
554
+ renderedItems.push(
555
+ /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("flex items-start gap-3", itemClassName), children: [
556
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 flex h-5 w-5 shrink-0 items-center justify-center", children: iconElement }),
557
+ isRenderableNode(content) ? typeof content === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-base font-medium leading-relaxed md:text-lg", children: content }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 text-base font-medium leading-relaxed md:text-lg", children: content }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
558
+ isRenderableNode(title2) && (typeof title2 === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-semibold leading-snug md:text-lg", children: title2 }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-semibold leading-snug md:text-lg", children: title2 })),
559
+ isRenderableNode(description2) && (typeof description2 === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm leading-relaxed text-current/75 md:text-base", children: description2 }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-sm leading-relaxed text-current/75 md:text-base", children: description2 }))
560
+ ] })
561
+ ] }, index)
562
+ );
521
563
  });
522
- }, [checklistSlot, checklistItems]);
564
+ return renderedItems.length > 0 ? renderedItems : null;
565
+ }, [checklistSlot, checklistItems, benefits]);
523
566
  return /* @__PURE__ */ jsxRuntime.jsx(
524
567
  Section,
525
568
  {
@@ -535,7 +578,8 @@ function FeatureChecklistImage({
535
578
  "div",
536
579
  {
537
580
  className: cn(
538
- "flex flex-col gap-6 md:gap-12 md:flex-row",
581
+ "grid gap-8 md:gap-12 lg:items-center",
582
+ imageContent ? "lg:grid-cols-2" : "lg:grid-cols-1",
539
583
  contentWrapperClassName
540
584
  ),
541
585
  children: [
@@ -544,7 +588,8 @@ function FeatureChecklistImage({
544
588
  "div",
545
589
  {
546
590
  className: cn(
547
- "px-0 md:px-6 lg:px-10 py-4 md:py-0 flex flex-col gap-6 md:gap-10",
591
+ "flex min-w-0 flex-col gap-6 py-2 md:gap-8 md:py-0 lg:gap-10",
592
+ imageContent && "lg:pl-8",
548
593
  contentClassName
549
594
  ),
550
595
  children: [
@@ -552,7 +597,7 @@ function FeatureChecklistImage({
552
597
  "h2",
553
598
  {
554
599
  className: cn(
555
- "text-xl font-semibold text-balance md:text-2xl lg:text-3xl",
600
+ "text-2xl font-semibold text-balance sm:text-3xl lg:text-4xl",
556
601
  titleClassName
557
602
  ),
558
603
  children: title
@@ -561,18 +606,36 @@ function FeatureChecklistImage({
561
606
  "div",
562
607
  {
563
608
  className: cn(
564
- "text-xl font-semibold text-balance md:text-2xl lg:text-3xl",
609
+ "text-2xl font-semibold text-balance sm:text-3xl lg:text-4xl",
565
610
  titleClassName
566
611
  ),
567
612
  children: title
568
613
  }
569
614
  )),
570
- description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("relative", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("relative", descriptionClassName), children: description })),
615
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
616
+ "p",
617
+ {
618
+ className: cn(
619
+ "relative text-base leading-relaxed md:text-lg",
620
+ descriptionClassName
621
+ ),
622
+ children: description
623
+ }
624
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
625
+ "div",
626
+ {
627
+ className: cn(
628
+ "relative text-base leading-relaxed md:text-lg",
629
+ descriptionClassName
630
+ ),
631
+ children: description
632
+ }
633
+ )),
571
634
  actionsContent && /* @__PURE__ */ jsxRuntime.jsx(
572
635
  "div",
573
636
  {
574
637
  className: cn(
575
- "flex flex-wrap items-center gap-4",
638
+ "flex flex-col items-start gap-4 sm:flex-row sm:flex-wrap sm:items-center",
576
639
  actionsClassName
577
640
  ),
578
641
  children: actionsContent
@@ -582,7 +645,7 @@ function FeatureChecklistImage({
582
645
  "ul",
583
646
  {
584
647
  className: cn(
585
- "flex-wrap items-center space-y-2 md:flex",
648
+ "flex flex-col space-y-3 md:space-y-4",
586
649
  checklistClassName
587
650
  ),
588
651
  children: checklistContent
@@ -11,6 +11,22 @@ interface FeatureChecklistItem {
11
11
  * Checklist item content
12
12
  */
13
13
  content?: React.ReactNode;
14
+ /**
15
+ * Text content alias used by some generated payloads
16
+ */
17
+ text?: React.ReactNode;
18
+ /**
19
+ * Label content alias used by some generated payloads
20
+ */
21
+ label?: React.ReactNode;
22
+ /**
23
+ * Checklist item title
24
+ */
25
+ title?: React.ReactNode;
26
+ /**
27
+ * Checklist item description
28
+ */
29
+ description?: React.ReactNode;
14
30
  /**
15
31
  * Icon element (overrides default check icon)
16
32
  */
@@ -57,6 +73,10 @@ interface FeatureChecklistImageProps {
57
73
  * Array of checklist items (can be strings or FeatureChecklistItem objects)
58
74
  */
59
75
  checklistItems?: (string | FeatureChecklistItem)[];
76
+ /**
77
+ * Alias for checklistItems used by registry examples and builder payloads
78
+ */
79
+ benefits?: (string | FeatureChecklistItem)[];
60
80
  /**
61
81
  * Custom slot for rendering checklist (overrides checklistItems array)
62
82
  */
@@ -143,6 +163,6 @@ interface FeatureChecklistImageProps {
143
163
  * />
144
164
  * ```
145
165
  */
146
- declare function FeatureChecklistImage({ sectionId, title, description, titleClassName, descriptionClassName, imageSrc, imageAlt, imageSlot, actions, actionsSlot, checklistItems, checklistSlot, className, containerClassName, contentWrapperClassName, imageClassName, contentClassName, actionsClassName, checklistClassName, optixFlowConfig, background, spacing, pattern, patternOpacity, patternClassName, }: FeatureChecklistImageProps): React.JSX.Element;
166
+ declare function FeatureChecklistImage({ sectionId, title, description, titleClassName, descriptionClassName, imageSrc, imageAlt, imageSlot, actions, actionsSlot, checklistItems, benefits, checklistSlot, className, containerClassName, contentWrapperClassName, imageClassName, contentClassName, actionsClassName, checklistClassName, optixFlowConfig, background, spacing, pattern, patternOpacity, patternClassName, }: FeatureChecklistImageProps): React.JSX.Element;
147
167
 
148
168
  export { FeatureChecklistImage, type FeatureChecklistImageProps };
@@ -11,6 +11,22 @@ interface FeatureChecklistItem {
11
11
  * Checklist item content
12
12
  */
13
13
  content?: React.ReactNode;
14
+ /**
15
+ * Text content alias used by some generated payloads
16
+ */
17
+ text?: React.ReactNode;
18
+ /**
19
+ * Label content alias used by some generated payloads
20
+ */
21
+ label?: React.ReactNode;
22
+ /**
23
+ * Checklist item title
24
+ */
25
+ title?: React.ReactNode;
26
+ /**
27
+ * Checklist item description
28
+ */
29
+ description?: React.ReactNode;
14
30
  /**
15
31
  * Icon element (overrides default check icon)
16
32
  */
@@ -57,6 +73,10 @@ interface FeatureChecklistImageProps {
57
73
  * Array of checklist items (can be strings or FeatureChecklistItem objects)
58
74
  */
59
75
  checklistItems?: (string | FeatureChecklistItem)[];
76
+ /**
77
+ * Alias for checklistItems used by registry examples and builder payloads
78
+ */
79
+ benefits?: (string | FeatureChecklistItem)[];
60
80
  /**
61
81
  * Custom slot for rendering checklist (overrides checklistItems array)
62
82
  */
@@ -143,6 +163,6 @@ interface FeatureChecklistImageProps {
143
163
  * />
144
164
  * ```
145
165
  */
146
- declare function FeatureChecklistImage({ sectionId, title, description, titleClassName, descriptionClassName, imageSrc, imageAlt, imageSlot, actions, actionsSlot, checklistItems, checklistSlot, className, containerClassName, contentWrapperClassName, imageClassName, contentClassName, actionsClassName, checklistClassName, optixFlowConfig, background, spacing, pattern, patternOpacity, patternClassName, }: FeatureChecklistImageProps): React.JSX.Element;
166
+ declare function FeatureChecklistImage({ sectionId, title, description, titleClassName, descriptionClassName, imageSrc, imageAlt, imageSlot, actions, actionsSlot, checklistItems, benefits, checklistSlot, className, containerClassName, contentWrapperClassName, imageClassName, contentClassName, actionsClassName, checklistClassName, optixFlowConfig, background, spacing, pattern, patternOpacity, patternClassName, }: FeatureChecklistImageProps): React.JSX.Element;
147
167
 
148
168
  export { FeatureChecklistImage, type FeatureChecklistImageProps };