@opensite/ui 2.8.6 → 2.8.8

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.
Files changed (143) hide show
  1. package/dist/about-developer-profile.cjs +17 -10
  2. package/dist/about-developer-profile.js +17 -10
  3. package/dist/article-chapters-author.cjs +17 -10
  4. package/dist/article-chapters-author.js +17 -10
  5. package/dist/carousel-animated-sections.cjs +79 -25
  6. package/dist/carousel-animated-sections.d.cts +7 -2
  7. package/dist/carousel-animated-sections.d.ts +7 -2
  8. package/dist/carousel-animated-sections.js +79 -25
  9. package/dist/carousel-gallery-thumbnails.cjs +79 -25
  10. package/dist/carousel-gallery-thumbnails.d.cts +7 -2
  11. package/dist/carousel-gallery-thumbnails.d.ts +7 -2
  12. package/dist/carousel-gallery-thumbnails.js +79 -25
  13. package/dist/carousel-icon-sidebar.cjs +5 -4
  14. package/dist/carousel-icon-sidebar.js +5 -4
  15. package/dist/carousel-portfolio-hero.cjs +79 -25
  16. package/dist/carousel-portfolio-hero.d.cts +7 -2
  17. package/dist/carousel-portfolio-hero.d.ts +7 -2
  18. package/dist/carousel-portfolio-hero.js +79 -25
  19. package/dist/components.cjs +81 -42
  20. package/dist/components.d.cts +29 -2
  21. package/dist/components.d.ts +29 -2
  22. package/dist/components.js +81 -43
  23. package/dist/contact-map.cjs +46 -32
  24. package/dist/contact-map.js +46 -32
  25. package/dist/footer-accordion-social.cjs +17 -10
  26. package/dist/footer-accordion-social.js +17 -10
  27. package/dist/footer-animated-social.cjs +17 -10
  28. package/dist/footer-animated-social.js +17 -10
  29. package/dist/footer-brand-description.cjs +17 -10
  30. package/dist/footer-brand-description.js +17 -10
  31. package/dist/footer-brand-links-contact.cjs +17 -10
  32. package/dist/footer-brand-links-contact.js +17 -10
  33. package/dist/footer-comprehensive-links.cjs +17 -10
  34. package/dist/footer-comprehensive-links.js +17 -10
  35. package/dist/footer-contact-card.cjs +17 -10
  36. package/dist/footer-contact-card.js +17 -10
  37. package/dist/footer-cta-banner.cjs +17 -10
  38. package/dist/footer-cta-banner.js +17 -10
  39. package/dist/footer-cta-social.cjs +17 -10
  40. package/dist/footer-cta-social.js +17 -10
  41. package/dist/footer-info-cards-accordion.cjs +17 -10
  42. package/dist/footer-info-cards-accordion.js +17 -10
  43. package/dist/footer-nav-social.cjs +17 -10
  44. package/dist/footer-nav-social.js +17 -10
  45. package/dist/footer-newsletter-contact.cjs +17 -10
  46. package/dist/footer-newsletter-contact.js +17 -10
  47. package/dist/footer-newsletter-grid.cjs +17 -10
  48. package/dist/footer-newsletter-grid.js +17 -10
  49. package/dist/footer-newsletter-minimal.cjs +17 -10
  50. package/dist/footer-newsletter-minimal.js +17 -10
  51. package/dist/footer-social-apps.cjs +17 -10
  52. package/dist/footer-social-apps.js +17 -10
  53. package/dist/footer-social-newsletter.cjs +17 -10
  54. package/dist/footer-social-newsletter.js +17 -10
  55. package/dist/footer-split-image-accordion.cjs +17 -10
  56. package/dist/footer-split-image-accordion.js +17 -10
  57. package/dist/geo-map.cjs +46 -32
  58. package/dist/geo-map.js +46 -32
  59. package/dist/hero-coming-soon-countdown.cjs +17 -10
  60. package/dist/hero-coming-soon-countdown.js +17 -10
  61. package/dist/hero-video-background-dark.cjs +78 -16
  62. package/dist/hero-video-background-dark.d.cts +7 -2
  63. package/dist/hero-video-background-dark.d.ts +7 -2
  64. package/dist/hero-video-background-dark.js +78 -16
  65. package/dist/index.cjs +81 -42
  66. package/dist/index.d.cts +1 -0
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.js +81 -43
  69. package/dist/link-page-bento-layout.cjs +17 -10
  70. package/dist/link-page-bento-layout.js +17 -10
  71. package/dist/link-page-grid-cards.cjs +17 -10
  72. package/dist/link-page-grid-cards.js +17 -10
  73. package/dist/link-page-minimal-profile.cjs +17 -10
  74. package/dist/link-page-minimal-profile.js +17 -10
  75. package/dist/link-page-newsletter-social.cjs +17 -10
  76. package/dist/link-page-newsletter-social.js +17 -10
  77. package/dist/link-tree-block.cjs +17 -10
  78. package/dist/link-tree-block.js +17 -10
  79. package/dist/navbar-fullscreen-menu.cjs +17 -10
  80. package/dist/navbar-fullscreen-menu.js +17 -10
  81. package/dist/navbar-transparent-overlay.cjs +17 -10
  82. package/dist/navbar-transparent-overlay.js +17 -10
  83. package/dist/registry.cjs +967 -620
  84. package/dist/registry.js +967 -620
  85. package/dist/social-link-icon.cjs +17 -10
  86. package/dist/social-link-icon.d.cts +5 -0
  87. package/dist/social-link-icon.d.ts +5 -0
  88. package/dist/social-link-icon.js +17 -10
  89. package/dist/testimonials-bento-grid.cjs +1 -1
  90. package/dist/testimonials-bento-grid.js +1 -1
  91. package/dist/testimonials-carousel-image.cjs +16 -2
  92. package/dist/testimonials-carousel-image.d.cts +5 -1
  93. package/dist/testimonials-carousel-image.d.ts +5 -1
  94. package/dist/testimonials-carousel-image.js +16 -2
  95. package/dist/testimonials-centered-avatars.cjs +1 -1
  96. package/dist/testimonials-centered-avatars.js +1 -1
  97. package/dist/testimonials-grid-add-review.cjs +51 -29
  98. package/dist/testimonials-grid-add-review.js +51 -29
  99. package/dist/testimonials-images-helpful.cjs +181 -160
  100. package/dist/testimonials-images-helpful.d.cts +9 -1
  101. package/dist/testimonials-images-helpful.d.ts +9 -1
  102. package/dist/testimonials-images-helpful.js +181 -159
  103. package/dist/testimonials-large-quote.cjs +74 -43
  104. package/dist/testimonials-large-quote.d.cts +5 -1
  105. package/dist/testimonials-large-quote.d.ts +5 -1
  106. package/dist/testimonials-large-quote.js +74 -43
  107. package/dist/testimonials-list-verified.cjs +63 -44
  108. package/dist/testimonials-list-verified.d.cts +5 -1
  109. package/dist/testimonials-list-verified.d.ts +5 -1
  110. package/dist/testimonials-list-verified.js +64 -45
  111. package/dist/testimonials-logo-cards.cjs +55 -25
  112. package/dist/testimonials-logo-cards.d.cts +5 -1
  113. package/dist/testimonials-logo-cards.d.ts +5 -1
  114. package/dist/testimonials-logo-cards.js +55 -25
  115. package/dist/testimonials-marquee.cjs +440 -28
  116. package/dist/testimonials-marquee.js +441 -26
  117. package/dist/testimonials-masonry-grid.cjs +486 -69
  118. package/dist/testimonials-masonry-grid.d.cts +5 -1
  119. package/dist/testimonials-masonry-grid.d.ts +5 -1
  120. package/dist/testimonials-masonry-grid.js +483 -63
  121. package/dist/testimonials-mini-dividers.cjs +119 -83
  122. package/dist/testimonials-mini-dividers.d.cts +10 -6
  123. package/dist/testimonials-mini-dividers.d.ts +10 -6
  124. package/dist/testimonials-mini-dividers.js +119 -83
  125. package/dist/testimonials-minimal-numbered.cjs +9 -7
  126. package/dist/testimonials-minimal-numbered.d.cts +5 -1
  127. package/dist/testimonials-minimal-numbered.d.ts +5 -1
  128. package/dist/testimonials-minimal-numbered.js +9 -7
  129. package/dist/testimonials-parallax-number.cjs +14 -9
  130. package/dist/testimonials-parallax-number.js +14 -9
  131. package/dist/testimonials-scrolling-columns.cjs +100 -21
  132. package/dist/testimonials-scrolling-columns.js +100 -21
  133. package/dist/testimonials-simple-grid.cjs +22 -5
  134. package/dist/testimonials-simple-grid.js +22 -5
  135. package/dist/testimonials-slider-minimal.cjs +1 -1
  136. package/dist/testimonials-slider-minimal.js +1 -1
  137. package/dist/testimonials-stats-header.cjs +528 -87
  138. package/dist/testimonials-stats-header.d.cts +39 -3
  139. package/dist/testimonials-stats-header.d.ts +39 -3
  140. package/dist/testimonials-stats-header.js +523 -82
  141. package/dist/testimonials-twitter-cards.cjs +20 -12
  142. package/dist/testimonials-twitter-cards.js +20 -12
  143. package/package.json +11 -1
@@ -980,41 +980,55 @@ function MarkerMediaCarousel({
980
980
  React6__namespace.useEffect(() => {
981
981
  setActiveIndex(0);
982
982
  }, [mediaResetKey]);
983
- const activeMediaItem = mediaItems[activeItemIndex];
984
- const mediaType = resolveMediaType(activeMediaItem);
985
983
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative border-b border-border/60 bg-muted/40", children: [
986
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-44 w-full overflow-hidden", children: mediaType === "video" ? /* @__PURE__ */ jsxRuntime.jsx(
987
- "video",
988
- {
989
- className: "h-full w-full object-cover",
990
- controls: true,
991
- preload: "metadata",
992
- poster: activeMediaItem.poster,
993
- children: /* @__PURE__ */ jsxRuntime.jsx("source", { src: activeMediaItem.src })
994
- }
995
- ) : /* @__PURE__ */ jsxRuntime.jsx(
996
- img.Img,
997
- {
998
- src: activeMediaItem.src,
999
- alt: activeMediaItem.alt ?? "Map marker media",
1000
- className: "h-full w-full object-cover",
1001
- loading: "eager",
1002
- optixFlowConfig
1003
- }
1004
- ) }),
984
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative aspect-video w-full overflow-hidden", children: mediaItems.map((item, index) => {
985
+ const isActive = index === activeItemIndex;
986
+ const mediaType = resolveMediaType(item);
987
+ return /* @__PURE__ */ jsxRuntime.jsx(
988
+ "div",
989
+ {
990
+ "aria-hidden": !isActive,
991
+ className: cn(
992
+ "absolute inset-0 transition-opacity duration-500 ease-in-out",
993
+ isActive ? "opacity-100 z-[1]" : "opacity-0 z-0 pointer-events-none"
994
+ ),
995
+ children: mediaType === "video" ? /* @__PURE__ */ jsxRuntime.jsx(
996
+ "video",
997
+ {
998
+ className: "h-full w-full object-cover",
999
+ controls: isActive,
1000
+ preload: "metadata",
1001
+ poster: item.poster,
1002
+ tabIndex: isActive ? 0 : -1,
1003
+ children: /* @__PURE__ */ jsxRuntime.jsx("source", { src: item.src })
1004
+ }
1005
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1006
+ img.Img,
1007
+ {
1008
+ src: item.src,
1009
+ alt: item.alt ?? "Map marker media",
1010
+ className: "h-full w-full object-cover",
1011
+ loading: "eager",
1012
+ optixFlowConfig
1013
+ }
1014
+ )
1015
+ },
1016
+ normalizeId(item.id, `media-slide-${index}`)
1017
+ );
1018
+ }) }),
1005
1019
  totalItems > 1 ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1006
1020
  /* @__PURE__ */ jsxRuntime.jsx(
1007
1021
  "button",
1008
1022
  {
1009
1023
  type: "button",
1010
1024
  "aria-label": "Show previous media",
1011
- className: "absolute left-2 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-full bg-card text-card-foreground shadow-sm transition hover:bg-muted hover:text-muted-foreground",
1025
+ className: "absolute left-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-[2]",
1012
1026
  onClick: () => {
1013
1027
  setActiveIndex(
1014
1028
  (current) => (current - 1 + totalItems) % totalItems
1015
1029
  );
1016
1030
  },
1017
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-left", size: 16 })
1031
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-left", size: 18 })
1018
1032
  }
1019
1033
  ),
1020
1034
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1022,20 +1036,20 @@ function MarkerMediaCarousel({
1022
1036
  {
1023
1037
  type: "button",
1024
1038
  "aria-label": "Show next media",
1025
- className: "absolute right-2 top-1/2 inline-flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-full bg-card text-card-foreground shadow-sm transition hover:bg-muted hover:text-muted-foreground",
1039
+ className: "absolute right-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-[2]",
1026
1040
  onClick: () => {
1027
1041
  setActiveIndex((current) => (current + 1) % totalItems);
1028
1042
  },
1029
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
1043
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 18 })
1030
1044
  }
1031
1045
  ),
1032
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-2 left-1/2 flex -translate-x-1/2 items-center gap-1.5", children: mediaItems.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx(
1046
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-2 left-1/2 flex -translate-x-1/2 items-center gap-1.5 z-[2]", children: mediaItems.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx(
1033
1047
  "button",
1034
1048
  {
1035
1049
  type: "button",
1036
1050
  "aria-label": `Show media item ${index + 1}`,
1037
1051
  className: cn(
1038
- "h-2 rounded-full transition-all",
1052
+ "h-2 rounded-full transition-all duration-300",
1039
1053
  index === activeItemIndex ? "w-6 bg-card" : "w-2 bg-card opacity-50 hover:opacity-100"
1040
1054
  ),
1041
1055
  onClick: () => setActiveIndex(index)
@@ -1366,9 +1380,9 @@ function GeoMap({
1366
1380
  {
1367
1381
  type: "button",
1368
1382
  "aria-label": "Close marker details",
1369
- className: "flex size-8 items-center justify-center rounded-full border border-border bg-card text-card-foreground transition hover:bg-muted hover:text-foreground absolute top-2 right-2 z-10",
1383
+ className: "\n flex size-12 items-center justify-center rounded-bl-lg rounded-br-0 rounded-t-0 bg-black text-white transition-all duration-500 absolute top-0 right-0 z-10 cursor-pointer ring-4 ring-white\n",
1370
1384
  onClick: clearSelection,
1371
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", size: 16 })
1385
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", size: 20 })
1372
1386
  }
1373
1387
  ),
1374
1388
  markerMediaItems.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -1390,7 +1404,7 @@ function GeoMap({
1390
1404
  {
1391
1405
  name: "lucide:map-pin",
1392
1406
  className: "opacity-50",
1393
- size: 14
1407
+ size: 18
1394
1408
  }
1395
1409
  ),
1396
1410
  typeof selectedMarker.locationLine === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -1412,7 +1426,7 @@ function GeoMap({
1412
1426
  {
1413
1427
  name: "lucide:clock",
1414
1428
  className: "opacity-50",
1415
- size: 14
1429
+ size: 18
1416
1430
  }
1417
1431
  ),
1418
1432
  typeof selectedMarker.hoursLine === "string" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: selectedMarker.hoursLine }) : selectedMarker.hoursLine
@@ -1440,7 +1454,7 @@ function GeoMap({
1440
1454
  "aria-label": "Close cluster details",
1441
1455
  className: "flex size-8 items-center justify-center rounded-full border border-border bg-card text-card-foreground transition hover:bg-muted hover:text-foreground absolute top-2 right-2 z-10",
1442
1456
  onClick: clearSelection,
1443
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", size: 16 })
1457
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", size: 20 })
1444
1458
  }
1445
1459
  ),
1446
1460
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-start justify-between gap-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
@@ -2129,6 +2143,23 @@ function PopoverContent({
2129
2143
  }
2130
2144
  ) });
2131
2145
  }
2146
+ function StarRating({
2147
+ rating,
2148
+ size = 18,
2149
+ className
2150
+ }) {
2151
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex items-center gap-0.5", className), children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsxRuntime.jsx(
2152
+ DynamicIcon,
2153
+ {
2154
+ name: "icon-park-solid/star",
2155
+ size,
2156
+ className: cn(
2157
+ star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
2158
+ )
2159
+ },
2160
+ star
2161
+ )) });
2162
+ }
2132
2163
  var BUTTON_SIZES = {
2133
2164
  sm: { buttonSize: "size-8", iconSize: 16 },
2134
2165
  md: { buttonSize: "size-10", iconSize: 20 },
@@ -2230,6 +2261,7 @@ var SocialLinkIcon = React6__namespace.forwardRef(
2230
2261
  iconClassName,
2231
2262
  className,
2232
2263
  iconNameOverride,
2264
+ iconOnly = false,
2233
2265
  ...pressableProps
2234
2266
  }, ref) => {
2235
2267
  const platform = usePlatformFromUrl.usePlatformFromUrl(href);
@@ -2242,6 +2274,21 @@ var SocialLinkIcon = React6__namespace.forwardRef(
2242
2274
  const accessibleLabel = React6__namespace.useMemo(() => {
2243
2275
  return label || platformName;
2244
2276
  }, [label, platformName]);
2277
+ const icon = React6__namespace.useMemo(() => {
2278
+ return /* @__PURE__ */ jsxRuntime.jsx(
2279
+ DynamicIcon,
2280
+ {
2281
+ name: iconName,
2282
+ size: iconSize,
2283
+ color: iconColor,
2284
+ className: iconClassName,
2285
+ alt: accessibleLabel
2286
+ }
2287
+ );
2288
+ }, [iconName, iconSize, iconColor, iconClassName, accessibleLabel]);
2289
+ if (iconOnly) {
2290
+ return icon;
2291
+ }
2245
2292
  return /* @__PURE__ */ jsxRuntime.jsx(
2246
2293
  Pressable,
2247
2294
  {
@@ -2253,16 +2300,7 @@ var SocialLinkIcon = React6__namespace.forwardRef(
2253
2300
  className
2254
2301
  ),
2255
2302
  ...pressableProps,
2256
- children: /* @__PURE__ */ jsxRuntime.jsx(
2257
- DynamicIcon,
2258
- {
2259
- name: iconName,
2260
- size: iconSize,
2261
- color: iconColor,
2262
- className: iconClassName,
2263
- alt: accessibleLabel
2264
- }
2265
- )
2303
+ children: icon
2266
2304
  }
2267
2305
  );
2268
2306
  }
@@ -7563,3 +7601,4 @@ exports.PopoverTrigger = PopoverTrigger;
7563
7601
  exports.Pressable = Pressable;
7564
7602
  exports.Section = Section;
7565
7603
  exports.SocialLinkIcon = SocialLinkIcon;
7604
+ exports.StarRating = StarRating;
@@ -9,6 +9,7 @@ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }
9
9
  export { Badge } from './badge.cjs';
10
10
  export { Popover, PopoverContent, PopoverTrigger } from './popover.cjs';
11
11
  export { DynamicIcon } from './dynamic-icon.cjs';
12
+ import * as React from 'react';
12
13
  export { CarouselPagination, CarouselPaginationProps } from './carousel-pagination.cjs';
13
14
  export { SocialLinkIcon, SocialLinkIconDynamicIconProps, SocialLinkIconProps } from './social-link-icon.cjs';
14
15
  export { PaymentPlatformIcon, PaymentPlatformIconProps, PaymentPlatformName } from './payment-platform-icon.cjs';
@@ -40,14 +41,40 @@ export { FooterNewsletterMinimal } from './footer-newsletter-minimal.cjs';
40
41
  export { FooterCtaSocial } from './footer-cta-social.cjs';
41
42
  export { FooterNavSocial } from './footer-nav-social.cjs';
42
43
  export { SocialPlatformName } from '@opensite/hooks/usePlatformFromUrl';
43
- import 'react';
44
- import '@page-speed/maps';
45
44
  import './blocks-BtDAbw8d.cjs';
46
45
  import 'class-variance-authority';
47
46
  import './button-variants-8mtEHxev.cjs';
48
47
  import 'class-variance-authority/types';
49
48
  import 'react/jsx-runtime';
49
+ import '@page-speed/maps';
50
50
  import '@radix-ui/react-popover';
51
51
  import '@page-speed/icon';
52
52
  import './types-Cs1jk79n.cjs';
53
53
  import '@page-speed/forms/integration';
54
+
55
+ interface StarRatingProps {
56
+ /**
57
+ * Star rating value (1-5)
58
+ */
59
+ rating: number;
60
+ /**
61
+ * Icon size in pixels
62
+ */
63
+ size?: number;
64
+ /**
65
+ * Additional CSS classes for the container
66
+ */
67
+ className?: string;
68
+ }
69
+ /**
70
+ * StarRating - Displays a 1-5 star rating using filled/muted star icons.
71
+ * Uses CSS variable-based colors (primary/muted) for theme compatibility.
72
+ *
73
+ * @example
74
+ * ```tsx
75
+ * <StarRating rating={4} size={18} />
76
+ * ```
77
+ */
78
+ declare function StarRating({ rating, size, className, }: StarRatingProps): React.JSX.Element;
79
+
80
+ export { StarRating, type StarRatingProps };
@@ -9,6 +9,7 @@ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }
9
9
  export { Badge } from './badge.js';
10
10
  export { Popover, PopoverContent, PopoverTrigger } from './popover.js';
11
11
  export { DynamicIcon } from './dynamic-icon.js';
12
+ import * as React from 'react';
12
13
  export { CarouselPagination, CarouselPaginationProps } from './carousel-pagination.js';
13
14
  export { SocialLinkIcon, SocialLinkIconDynamicIconProps, SocialLinkIconProps } from './social-link-icon.js';
14
15
  export { PaymentPlatformIcon, PaymentPlatformIconProps, PaymentPlatformName } from './payment-platform-icon.js';
@@ -40,14 +41,40 @@ export { FooterNewsletterMinimal } from './footer-newsletter-minimal.js';
40
41
  export { FooterCtaSocial } from './footer-cta-social.js';
41
42
  export { FooterNavSocial } from './footer-nav-social.js';
42
43
  export { SocialPlatformName } from '@opensite/hooks/usePlatformFromUrl';
43
- import 'react';
44
- import '@page-speed/maps';
45
44
  import './blocks-BlWXj9GI.js';
46
45
  import 'class-variance-authority';
47
46
  import './button-variants-8mtEHxev.js';
48
47
  import 'class-variance-authority/types';
49
48
  import 'react/jsx-runtime';
49
+ import '@page-speed/maps';
50
50
  import '@radix-ui/react-popover';
51
51
  import '@page-speed/icon';
52
52
  import './types-Cs1jk79n.js';
53
53
  import '@page-speed/forms/integration';
54
+
55
+ interface StarRatingProps {
56
+ /**
57
+ * Star rating value (1-5)
58
+ */
59
+ rating: number;
60
+ /**
61
+ * Icon size in pixels
62
+ */
63
+ size?: number;
64
+ /**
65
+ * Additional CSS classes for the container
66
+ */
67
+ className?: string;
68
+ }
69
+ /**
70
+ * StarRating - Displays a 1-5 star rating using filled/muted star icons.
71
+ * Uses CSS variable-based colors (primary/muted) for theme compatibility.
72
+ *
73
+ * @example
74
+ * ```tsx
75
+ * <StarRating rating={4} size={18} />
76
+ * ```
77
+ */
78
+ declare function StarRating({ rating, size, className, }: StarRatingProps): React.JSX.Element;
79
+
80
+ export { StarRating, type StarRatingProps };
@@ -957,41 +957,55 @@ function MarkerMediaCarousel({
957
957
  React6.useEffect(() => {
958
958
  setActiveIndex(0);
959
959
  }, [mediaResetKey]);
960
- const activeMediaItem = mediaItems[activeItemIndex];
961
- const mediaType = resolveMediaType(activeMediaItem);
962
960
  return /* @__PURE__ */ jsxs("div", { className: "relative border-b border-border/60 bg-muted/40", children: [
963
- /* @__PURE__ */ jsx("div", { className: "relative h-44 w-full overflow-hidden", children: mediaType === "video" ? /* @__PURE__ */ jsx(
964
- "video",
965
- {
966
- className: "h-full w-full object-cover",
967
- controls: true,
968
- preload: "metadata",
969
- poster: activeMediaItem.poster,
970
- children: /* @__PURE__ */ jsx("source", { src: activeMediaItem.src })
971
- }
972
- ) : /* @__PURE__ */ jsx(
973
- Img,
974
- {
975
- src: activeMediaItem.src,
976
- alt: activeMediaItem.alt ?? "Map marker media",
977
- className: "h-full w-full object-cover",
978
- loading: "eager",
979
- optixFlowConfig
980
- }
981
- ) }),
961
+ /* @__PURE__ */ jsx("div", { className: "relative aspect-video w-full overflow-hidden", children: mediaItems.map((item, index) => {
962
+ const isActive = index === activeItemIndex;
963
+ const mediaType = resolveMediaType(item);
964
+ return /* @__PURE__ */ jsx(
965
+ "div",
966
+ {
967
+ "aria-hidden": !isActive,
968
+ className: cn(
969
+ "absolute inset-0 transition-opacity duration-500 ease-in-out",
970
+ isActive ? "opacity-100 z-[1]" : "opacity-0 z-0 pointer-events-none"
971
+ ),
972
+ children: mediaType === "video" ? /* @__PURE__ */ jsx(
973
+ "video",
974
+ {
975
+ className: "h-full w-full object-cover",
976
+ controls: isActive,
977
+ preload: "metadata",
978
+ poster: item.poster,
979
+ tabIndex: isActive ? 0 : -1,
980
+ children: /* @__PURE__ */ jsx("source", { src: item.src })
981
+ }
982
+ ) : /* @__PURE__ */ jsx(
983
+ Img,
984
+ {
985
+ src: item.src,
986
+ alt: item.alt ?? "Map marker media",
987
+ className: "h-full w-full object-cover",
988
+ loading: "eager",
989
+ optixFlowConfig
990
+ }
991
+ )
992
+ },
993
+ normalizeId(item.id, `media-slide-${index}`)
994
+ );
995
+ }) }),
982
996
  totalItems > 1 ? /* @__PURE__ */ jsxs(Fragment, { children: [
983
997
  /* @__PURE__ */ jsx(
984
998
  "button",
985
999
  {
986
1000
  type: "button",
987
1001
  "aria-label": "Show previous media",
988
- className: "absolute left-2 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-full bg-card text-card-foreground shadow-sm transition hover:bg-muted hover:text-muted-foreground",
1002
+ className: "absolute left-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-[2]",
989
1003
  onClick: () => {
990
1004
  setActiveIndex(
991
1005
  (current) => (current - 1 + totalItems) % totalItems
992
1006
  );
993
1007
  },
994
- children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/arrow-left", size: 16 })
1008
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/arrow-left", size: 18 })
995
1009
  }
996
1010
  ),
997
1011
  /* @__PURE__ */ jsx(
@@ -999,20 +1013,20 @@ function MarkerMediaCarousel({
999
1013
  {
1000
1014
  type: "button",
1001
1015
  "aria-label": "Show next media",
1002
- className: "absolute right-2 top-1/2 inline-flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-full bg-card text-card-foreground shadow-sm transition hover:bg-muted hover:text-muted-foreground",
1016
+ className: "absolute right-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-[2]",
1003
1017
  onClick: () => {
1004
1018
  setActiveIndex((current) => (current + 1) % totalItems);
1005
1019
  },
1006
- children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
1020
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/arrow-right", size: 18 })
1007
1021
  }
1008
1022
  ),
1009
- /* @__PURE__ */ jsx("div", { className: "absolute bottom-2 left-1/2 flex -translate-x-1/2 items-center gap-1.5", children: mediaItems.map((item, index) => /* @__PURE__ */ jsx(
1023
+ /* @__PURE__ */ jsx("div", { className: "absolute bottom-2 left-1/2 flex -translate-x-1/2 items-center gap-1.5 z-[2]", children: mediaItems.map((item, index) => /* @__PURE__ */ jsx(
1010
1024
  "button",
1011
1025
  {
1012
1026
  type: "button",
1013
1027
  "aria-label": `Show media item ${index + 1}`,
1014
1028
  className: cn(
1015
- "h-2 rounded-full transition-all",
1029
+ "h-2 rounded-full transition-all duration-300",
1016
1030
  index === activeItemIndex ? "w-6 bg-card" : "w-2 bg-card opacity-50 hover:opacity-100"
1017
1031
  ),
1018
1032
  onClick: () => setActiveIndex(index)
@@ -1343,9 +1357,9 @@ function GeoMap({
1343
1357
  {
1344
1358
  type: "button",
1345
1359
  "aria-label": "Close marker details",
1346
- className: "flex size-8 items-center justify-center rounded-full border border-border bg-card text-card-foreground transition hover:bg-muted hover:text-foreground absolute top-2 right-2 z-10",
1360
+ className: "\n flex size-12 items-center justify-center rounded-bl-lg rounded-br-0 rounded-t-0 bg-black text-white transition-all duration-500 absolute top-0 right-0 z-10 cursor-pointer ring-4 ring-white\n",
1347
1361
  onClick: clearSelection,
1348
- children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/x", size: 16 })
1362
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/x", size: 20 })
1349
1363
  }
1350
1364
  ),
1351
1365
  markerMediaItems.length > 0 ? /* @__PURE__ */ jsx(
@@ -1367,7 +1381,7 @@ function GeoMap({
1367
1381
  {
1368
1382
  name: "lucide:map-pin",
1369
1383
  className: "opacity-50",
1370
- size: 14
1384
+ size: 18
1371
1385
  }
1372
1386
  ),
1373
1387
  typeof selectedMarker.locationLine === "string" ? /* @__PURE__ */ jsx(
@@ -1389,7 +1403,7 @@ function GeoMap({
1389
1403
  {
1390
1404
  name: "lucide:clock",
1391
1405
  className: "opacity-50",
1392
- size: 14
1406
+ size: 18
1393
1407
  }
1394
1408
  ),
1395
1409
  typeof selectedMarker.hoursLine === "string" ? /* @__PURE__ */ jsx("div", { className: "font-medium", children: selectedMarker.hoursLine }) : selectedMarker.hoursLine
@@ -1417,7 +1431,7 @@ function GeoMap({
1417
1431
  "aria-label": "Close cluster details",
1418
1432
  className: "flex size-8 items-center justify-center rounded-full border border-border bg-card text-card-foreground transition hover:bg-muted hover:text-foreground absolute top-2 right-2 z-10",
1419
1433
  onClick: clearSelection,
1420
- children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/x", size: 16 })
1434
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/x", size: 20 })
1421
1435
  }
1422
1436
  ),
1423
1437
  /* @__PURE__ */ jsx("div", { className: "mb-3 flex items-start justify-between gap-3", children: /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
@@ -2106,6 +2120,23 @@ function PopoverContent({
2106
2120
  }
2107
2121
  ) });
2108
2122
  }
2123
+ function StarRating({
2124
+ rating,
2125
+ size = 18,
2126
+ className
2127
+ }) {
2128
+ return /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-0.5", className), children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx(
2129
+ DynamicIcon,
2130
+ {
2131
+ name: "icon-park-solid/star",
2132
+ size,
2133
+ className: cn(
2134
+ star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
2135
+ )
2136
+ },
2137
+ star
2138
+ )) });
2139
+ }
2109
2140
  var BUTTON_SIZES = {
2110
2141
  sm: { buttonSize: "size-8", iconSize: 16 },
2111
2142
  md: { buttonSize: "size-10", iconSize: 20 },
@@ -2207,6 +2238,7 @@ var SocialLinkIcon = React6.forwardRef(
2207
2238
  iconClassName,
2208
2239
  className,
2209
2240
  iconNameOverride,
2241
+ iconOnly = false,
2210
2242
  ...pressableProps
2211
2243
  }, ref) => {
2212
2244
  const platform = usePlatformFromUrl(href);
@@ -2219,6 +2251,21 @@ var SocialLinkIcon = React6.forwardRef(
2219
2251
  const accessibleLabel = React6.useMemo(() => {
2220
2252
  return label || platformName;
2221
2253
  }, [label, platformName]);
2254
+ const icon = React6.useMemo(() => {
2255
+ return /* @__PURE__ */ jsx(
2256
+ DynamicIcon,
2257
+ {
2258
+ name: iconName,
2259
+ size: iconSize,
2260
+ color: iconColor,
2261
+ className: iconClassName,
2262
+ alt: accessibleLabel
2263
+ }
2264
+ );
2265
+ }, [iconName, iconSize, iconColor, iconClassName, accessibleLabel]);
2266
+ if (iconOnly) {
2267
+ return icon;
2268
+ }
2222
2269
  return /* @__PURE__ */ jsx(
2223
2270
  Pressable,
2224
2271
  {
@@ -2230,16 +2277,7 @@ var SocialLinkIcon = React6.forwardRef(
2230
2277
  className
2231
2278
  ),
2232
2279
  ...pressableProps,
2233
- children: /* @__PURE__ */ jsx(
2234
- DynamicIcon,
2235
- {
2236
- name: iconName,
2237
- size: iconSize,
2238
- color: iconColor,
2239
- className: iconClassName,
2240
- alt: accessibleLabel
2241
- }
2242
- )
2280
+ children: icon
2243
2281
  }
2244
2282
  );
2245
2283
  }
@@ -7488,4 +7526,4 @@ function FooterNavSocial({
7488
7526
  );
7489
7527
  }
7490
7528
 
7491
- export { AboutCultureTabs, AboutExpandableValues, AboutMissionPrinciples, AboutSplitHero, AlternatingBlocks, AnimatedDialog, Badge, BannerAnnouncementDismissible, BannerCountdownSale, BannerDeliveryCountdown, BannerEventPromo, BannerFloatingOffer, BannerGdprRights, BannerPrivacyNotice, BannerPromoCta, BannerSocialFollow, BannerSurveyIncentive, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CarouselPagination, CommunityInitiatives, Container, DynamicIcon, FooterAnimatedSocial, FooterBackgroundCard, FooterBrandDescription, FooterContactCard, FooterCtaBanner, FooterCtaSocial, FooterLinksGrid, FooterNavSocial, FooterNewsletterGrid, FooterNewsletterMinimal, FooterSimpleCentered, FooterSocialApps, FooterSocialNewsletter, GeoMap, ImageSlider, MediaHoverCtas, PageHeroBanner, PaymentPlatformIcon, Popover, PopoverContent, PopoverTrigger, Pressable, Section, SocialLinkIcon };
7529
+ export { AboutCultureTabs, AboutExpandableValues, AboutMissionPrinciples, AboutSplitHero, AlternatingBlocks, AnimatedDialog, Badge, BannerAnnouncementDismissible, BannerCountdownSale, BannerDeliveryCountdown, BannerEventPromo, BannerFloatingOffer, BannerGdprRights, BannerPrivacyNotice, BannerPromoCta, BannerSocialFollow, BannerSurveyIncentive, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CarouselPagination, CommunityInitiatives, Container, DynamicIcon, FooterAnimatedSocial, FooterBackgroundCard, FooterBrandDescription, FooterContactCard, FooterCtaBanner, FooterCtaSocial, FooterLinksGrid, FooterNavSocial, FooterNewsletterGrid, FooterNewsletterMinimal, FooterSimpleCentered, FooterSocialApps, FooterSocialNewsletter, GeoMap, ImageSlider, MediaHoverCtas, PageHeroBanner, PaymentPlatformIcon, Popover, PopoverContent, PopoverTrigger, Pressable, Section, SocialLinkIcon, StarRating };