@opensite/ui 1.2.0 → 1.2.2

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 (33) hide show
  1. package/dist/auto-scroll-carousel.cjs +7 -9
  2. package/dist/auto-scroll-carousel.js +7 -9
  3. package/dist/blur-vignette-grid.cjs +19 -27
  4. package/dist/blur-vignette-grid.js +19 -27
  5. package/dist/carousel-badge-cards.cjs +1 -1
  6. package/dist/carousel-badge-cards.js +1 -1
  7. package/dist/carousel-gradient-overlay.cjs +1 -1
  8. package/dist/carousel-gradient-overlay.js +1 -1
  9. package/dist/carousel-gradient-text.cjs +6 -17
  10. package/dist/carousel-gradient-text.d.cts +4 -0
  11. package/dist/carousel-gradient-text.d.ts +4 -0
  12. package/dist/carousel-gradient-text.js +6 -17
  13. package/dist/carousel-icon-sidebar.cjs +49 -6
  14. package/dist/carousel-icon-sidebar.d.cts +19 -3
  15. package/dist/carousel-icon-sidebar.d.ts +19 -3
  16. package/dist/carousel-icon-sidebar.js +49 -6
  17. package/dist/carousel-icon-tabs.cjs +20 -6
  18. package/dist/carousel-icon-tabs.js +20 -6
  19. package/dist/carousel-scale-focus.cjs +4 -10
  20. package/dist/carousel-scale-focus.js +4 -10
  21. package/dist/carousel-tabs-content.cjs +6 -18
  22. package/dist/carousel-tabs-content.js +6 -18
  23. package/dist/expandable-case-study-cards.cjs +39 -80
  24. package/dist/expandable-case-study-cards.js +39 -80
  25. package/dist/interior-carousel.cjs +9 -12
  26. package/dist/interior-carousel.js +9 -12
  27. package/dist/masonry-motion-grid.cjs +5 -16
  28. package/dist/masonry-motion-grid.js +5 -16
  29. package/dist/registry.cjs +7660 -7687
  30. package/dist/registry.js +7658 -7685
  31. package/dist/testimonial-carousel-cards.cjs +10 -63
  32. package/dist/testimonial-carousel-cards.js +10 -63
  33. package/package.json +1 -1
@@ -1129,10 +1129,14 @@ var Section = React4__default.forwardRef(
1129
1129
  );
1130
1130
  Section.displayName = "Section";
1131
1131
  function CarouselIconSidebar({
1132
+ title,
1133
+ description,
1132
1134
  items,
1133
1135
  itemsSlot,
1134
1136
  sidebarSlot,
1135
1137
  className,
1138
+ sectionTitleClassName,
1139
+ sectionDescriptionClassName,
1136
1140
  sidebarClassName,
1137
1141
  iconClassName,
1138
1142
  titleClassName,
@@ -1192,7 +1196,7 @@ function CarouselIconSidebar({
1192
1196
  "div",
1193
1197
  {
1194
1198
  className: cn(
1195
- "flex h-full flex-col gap-8 rounded-lg px-8 py-16",
1199
+ "flex h-full flex-col gap-8 rounded-lg p-8",
1196
1200
  getNestedCardBg(background),
1197
1201
  getNestedCardTextColor(background),
1198
1202
  sidebarClassName
@@ -1250,13 +1254,13 @@ function CarouselIconSidebar({
1250
1254
  const itemsContent = useMemo(() => {
1251
1255
  if (itemsSlot) return itemsSlot;
1252
1256
  if (!items || items.length === 0) return null;
1253
- return items.map((image, index) => /* @__PURE__ */ jsx(CarouselItem, { className: cn("h-full", itemClassName), children: /* @__PURE__ */ jsx("div", { className: cn("aspect-2/1 h-full w-full", image.className), children: /* @__PURE__ */ jsx(
1257
+ return items.map((image, index) => /* @__PURE__ */ jsx(CarouselItem, { className: cn("h-full", itemClassName), children: /* @__PURE__ */ jsx("div", { className: cn("h-full w-full", image.className), children: /* @__PURE__ */ jsx(
1254
1258
  Img,
1255
1259
  {
1256
1260
  src: image.src,
1257
1261
  alt: typeof image.title === "string" ? image.title : image.alt || "Carousel image",
1258
1262
  className: cn(
1259
- "h-full w-full rounded-lg object-cover cursor-pointer transition-transform hover:scale-[1.02]",
1263
+ "h-full w-full rounded-lg object-cover cursor-pointer",
1260
1264
  imageClassName
1261
1265
  ),
1262
1266
  loading: "lazy",
@@ -1272,7 +1276,14 @@ function CarouselIconSidebar({
1272
1276
  }
1273
1277
  }
1274
1278
  ) }) }, index));
1275
- }, [itemsSlot, items, itemClassName, imageClassName, optixFlowConfig, handleImageClick]);
1279
+ }, [
1280
+ itemsSlot,
1281
+ items,
1282
+ itemClassName,
1283
+ imageClassName,
1284
+ optixFlowConfig,
1285
+ handleImageClick
1286
+ ]);
1276
1287
  return /* @__PURE__ */ jsxs(
1277
1288
  Section,
1278
1289
  {
@@ -1283,9 +1294,41 @@ function CarouselIconSidebar({
1283
1294
  patternClassName,
1284
1295
  className,
1285
1296
  children: [
1297
+ title || description ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 mb-6 md:mb-16", children: [
1298
+ title && (typeof title === "string" ? /* @__PURE__ */ jsx(
1299
+ "h2",
1300
+ {
1301
+ className: cn(
1302
+ "text-xl font-medium tracking-tight md:text-2xl lg:text-3xl text-balance",
1303
+ sectionTitleClassName
1304
+ ),
1305
+ children: title
1306
+ }
1307
+ ) : /* @__PURE__ */ jsx("div", { className: sectionTitleClassName, children: title })),
1308
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx(
1309
+ "p",
1310
+ {
1311
+ className: cn(
1312
+ "max-w-lg text-balance",
1313
+ sectionDescriptionClassName
1314
+ ),
1315
+ children: description
1316
+ }
1317
+ ) : /* @__PURE__ */ jsx(
1318
+ "div",
1319
+ {
1320
+ className: cn(
1321
+ "max-w-lg text-balance",
1322
+ sectionDescriptionClassName
1323
+ ),
1324
+ children: description
1325
+ }
1326
+ ))
1327
+ ] }) : null,
1286
1328
  /* @__PURE__ */ jsx(Carousel, { setApi, className: cn("w-full", carouselClassName), children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-5", children: [
1287
- /* @__PURE__ */ jsx("div", { className: "md:col-span-2", children: sidebarContent }),
1288
- /* @__PURE__ */ jsx("div", { className: "h-full md:col-span-3", children: /* @__PURE__ */ jsx(CarouselContent, { className: carouselContentClassName, children: itemsContent }) })
1329
+ /* @__PURE__ */ jsx("div", { className: "hidden md:visible md:col-span-2", children: sidebarContent }),
1330
+ /* @__PURE__ */ jsx("div", { className: "h-full md:col-span-3", children: /* @__PURE__ */ jsx(CarouselContent, { className: carouselContentClassName, children: itemsContent }) }),
1331
+ /* @__PURE__ */ jsx("div", { className: "visible md:hidden md:col-span-2", children: sidebarContent })
1289
1332
  ] }) }),
1290
1333
  lightboxOpen && /* @__PURE__ */ jsx(
1291
1334
  Lightbox,
@@ -1222,11 +1222,11 @@ function CarouselIconTabs({
1222
1222
  "div",
1223
1223
  {
1224
1224
  className: cn(
1225
- "mb-20 flex flex-col items-center justify-center gap-8",
1225
+ "mb-8 md:mb-20 flex flex-col items-center justify-center gap-8",
1226
1226
  headerClassName
1227
1227
  ),
1228
1228
  children: [
1229
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("text-4xl", headingClassName), children: heading }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-4xl", headingClassName), children: heading })),
1229
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("text-4xl", headingClassName), children: heading }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-4xl", headingClassName), children: heading })),
1230
1230
  badge && /* @__PURE__ */ jsxRuntime.jsx(
1231
1231
  Badge,
1232
1232
  {
@@ -1238,7 +1238,14 @@ function CarouselIconTabs({
1238
1238
  ]
1239
1239
  }
1240
1240
  );
1241
- }, [headerSlot, headerClassName, heading, headingClassName, badge, badgeClassName]);
1241
+ }, [
1242
+ headerSlot,
1243
+ headerClassName,
1244
+ heading,
1245
+ headingClassName,
1246
+ badge,
1247
+ badgeClassName
1248
+ ]);
1242
1249
  const sectionsContent = React4.useMemo(() => {
1243
1250
  if (sectionsSlot) return sectionsSlot;
1244
1251
  if (!sections || sections.length === 0) return null;
@@ -1253,7 +1260,7 @@ function CarouselIconTabs({
1253
1260
  src: item.img,
1254
1261
  alt: typeof item.title === "string" ? item.title : item.alt || "Tab image",
1255
1262
  className: cn(
1256
- "aspect-square h-full w-full object-cover md:aspect-2/1 cursor-pointer transition-transform hover:scale-[1.02]",
1263
+ "aspect-square h-full w-full object-cover md:aspect-2/1 cursor-pointer rounded-xl shadow-xl",
1257
1264
  imageClassName
1258
1265
  ),
1259
1266
  loading: "lazy",
@@ -1278,7 +1285,14 @@ function CarouselIconTabs({
1278
1285
  },
1279
1286
  index
1280
1287
  ));
1281
- }, [sectionsSlot, sections, itemClassName, imageClassName, optixFlowConfig, handleImageClick]);
1288
+ }, [
1289
+ sectionsSlot,
1290
+ sections,
1291
+ itemClassName,
1292
+ imageClassName,
1293
+ optixFlowConfig,
1294
+ handleImageClick
1295
+ ]);
1282
1296
  const tabsContent = React4.useMemo(() => {
1283
1297
  if (!sections || sections.length === 0) return null;
1284
1298
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -1328,7 +1342,7 @@ function CarouselIconTabs({
1328
1342
  Carousel,
1329
1343
  {
1330
1344
  setApi,
1331
- className: cn("flex flex-col gap-10", carouselClassName),
1345
+ className: cn("flex flex-col gap-4 md:gap-10", carouselClassName),
1332
1346
  children: [
1333
1347
  /* @__PURE__ */ jsxRuntime.jsx(CarouselContent, { className: carouselContentClassName, children: sectionsContent }),
1334
1348
  tabsContent,
@@ -1198,11 +1198,11 @@ function CarouselIconTabs({
1198
1198
  "div",
1199
1199
  {
1200
1200
  className: cn(
1201
- "mb-20 flex flex-col items-center justify-center gap-8",
1201
+ "mb-8 md:mb-20 flex flex-col items-center justify-center gap-8",
1202
1202
  headerClassName
1203
1203
  ),
1204
1204
  children: [
1205
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsx("h1", { className: cn("text-4xl", headingClassName), children: heading }) : /* @__PURE__ */ jsx("div", { className: cn("text-4xl", headingClassName), children: heading })),
1205
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsx("h2", { className: cn("text-4xl", headingClassName), children: heading }) : /* @__PURE__ */ jsx("div", { className: cn("text-4xl", headingClassName), children: heading })),
1206
1206
  badge && /* @__PURE__ */ jsx(
1207
1207
  Badge,
1208
1208
  {
@@ -1214,7 +1214,14 @@ function CarouselIconTabs({
1214
1214
  ]
1215
1215
  }
1216
1216
  );
1217
- }, [headerSlot, headerClassName, heading, headingClassName, badge, badgeClassName]);
1217
+ }, [
1218
+ headerSlot,
1219
+ headerClassName,
1220
+ heading,
1221
+ headingClassName,
1222
+ badge,
1223
+ badgeClassName
1224
+ ]);
1218
1225
  const sectionsContent = useMemo(() => {
1219
1226
  if (sectionsSlot) return sectionsSlot;
1220
1227
  if (!sections || sections.length === 0) return null;
@@ -1229,7 +1236,7 @@ function CarouselIconTabs({
1229
1236
  src: item.img,
1230
1237
  alt: typeof item.title === "string" ? item.title : item.alt || "Tab image",
1231
1238
  className: cn(
1232
- "aspect-square h-full w-full object-cover md:aspect-2/1 cursor-pointer transition-transform hover:scale-[1.02]",
1239
+ "aspect-square h-full w-full object-cover md:aspect-2/1 cursor-pointer rounded-xl shadow-xl",
1233
1240
  imageClassName
1234
1241
  ),
1235
1242
  loading: "lazy",
@@ -1254,7 +1261,14 @@ function CarouselIconTabs({
1254
1261
  },
1255
1262
  index
1256
1263
  ));
1257
- }, [sectionsSlot, sections, itemClassName, imageClassName, optixFlowConfig, handleImageClick]);
1264
+ }, [
1265
+ sectionsSlot,
1266
+ sections,
1267
+ itemClassName,
1268
+ imageClassName,
1269
+ optixFlowConfig,
1270
+ handleImageClick
1271
+ ]);
1258
1272
  const tabsContent = useMemo(() => {
1259
1273
  if (!sections || sections.length === 0) return null;
1260
1274
  return /* @__PURE__ */ jsx(
@@ -1304,7 +1318,7 @@ function CarouselIconTabs({
1304
1318
  Carousel,
1305
1319
  {
1306
1320
  setApi,
1307
- className: cn("flex flex-col gap-10", carouselClassName),
1321
+ className: cn("flex flex-col gap-4 md:gap-10", carouselClassName),
1308
1322
  children: [
1309
1323
  /* @__PURE__ */ jsx(CarouselContent, { className: carouselContentClassName, children: sectionsContent }),
1310
1324
  tabsContent,
@@ -1237,12 +1237,12 @@ function CarouselScaleFocus({
1237
1237
  className: cn("overflow-hidden", className),
1238
1238
  children: [
1239
1239
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "md:px-45", children: [
1240
- title || description ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [
1240
+ title || description ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 mb-6 md:mb-16 text-center", children: [
1241
1241
  title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1242
1242
  "h2",
1243
1243
  {
1244
1244
  className: cn(
1245
- "text-xl font-medium tracking-tight md:text-2xl lg:text-3xl",
1245
+ "text-xl font-medium tracking-tight md:text-2xl lg:text-3xl text-balance",
1246
1246
  titleClassName
1247
1247
  ),
1248
1248
  children: title
@@ -1251,19 +1251,13 @@ function CarouselScaleFocus({
1251
1251
  description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1252
1252
  "p",
1253
1253
  {
1254
- className: cn(
1255
- "max-w-lg text-muted-foreground",
1256
- descriptionClassName
1257
- ),
1254
+ className: cn("max-w-lg text-balance", descriptionClassName),
1258
1255
  children: description
1259
1256
  }
1260
1257
  ) : /* @__PURE__ */ jsxRuntime.jsx(
1261
1258
  "div",
1262
1259
  {
1263
- className: cn(
1264
- "max-w-lg text-muted-foreground",
1265
- descriptionClassName
1266
- ),
1260
+ className: cn("max-w-lg text-balance", descriptionClassName),
1267
1261
  children: description
1268
1262
  }
1269
1263
  ))
@@ -1213,12 +1213,12 @@ function CarouselScaleFocus({
1213
1213
  className: cn("overflow-hidden", className),
1214
1214
  children: [
1215
1215
  /* @__PURE__ */ jsxs("div", { className: "md:px-45", children: [
1216
- title || description ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
1216
+ title || description ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 mb-6 md:mb-16 text-center", children: [
1217
1217
  title && (typeof title === "string" ? /* @__PURE__ */ jsx(
1218
1218
  "h2",
1219
1219
  {
1220
1220
  className: cn(
1221
- "text-xl font-medium tracking-tight md:text-2xl lg:text-3xl",
1221
+ "text-xl font-medium tracking-tight md:text-2xl lg:text-3xl text-balance",
1222
1222
  titleClassName
1223
1223
  ),
1224
1224
  children: title
@@ -1227,19 +1227,13 @@ function CarouselScaleFocus({
1227
1227
  description && (typeof description === "string" ? /* @__PURE__ */ jsx(
1228
1228
  "p",
1229
1229
  {
1230
- className: cn(
1231
- "max-w-lg text-muted-foreground",
1232
- descriptionClassName
1233
- ),
1230
+ className: cn("max-w-lg text-balance", descriptionClassName),
1234
1231
  children: description
1235
1232
  }
1236
1233
  ) : /* @__PURE__ */ jsx(
1237
1234
  "div",
1238
1235
  {
1239
- className: cn(
1240
- "max-w-lg text-muted-foreground",
1241
- descriptionClassName
1242
- ),
1236
+ className: cn("max-w-lg text-balance", descriptionClassName),
1243
1237
  children: description
1244
1238
  }
1245
1239
  ))
@@ -1202,7 +1202,7 @@ function CarouselTabsContent({
1202
1202
  }, []);
1203
1203
  const tabsContent = React4.useMemo(() => {
1204
1204
  if (tabsSlot) return tabsSlot;
1205
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("relative flex", tabsClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex h-auto gap-2 md:gap-4", children: [
1205
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("relative flex min-w-0 flex-1 overflow-x-auto scrollbar-hide", tabsClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex h-auto flex-nowrap gap-2 md:gap-4", children: [
1206
1206
  items?.map((item, idx) => /* @__PURE__ */ jsxRuntime.jsx(
1207
1207
  "button",
1208
1208
  {
@@ -1211,7 +1211,7 @@ function CarouselTabsContent({
1211
1211
  },
1212
1212
  onClick: () => setCurrent(item.category),
1213
1213
  className: cn(
1214
- "text-base transition-all duration-700 ease-out px-3 py-1.5 rounded-sm",
1214
+ "text-base transition-all duration-700 ease-out px-3 py-1.5 rounded-sm whitespace-nowrap flex-shrink-0",
1215
1215
  current === item.category ? "text-foreground" : "text-muted-foreground hover:text-foreground",
1216
1216
  tabClassName
1217
1217
  ),
@@ -1317,33 +1317,21 @@ function CarouselTabsContent({
1317
1317
  patternClassName,
1318
1318
  className: cn("overflow-hidden", className),
1319
1319
  children: [
1320
- title || description ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [
1320
+ title || description ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 mb-6 md:mb-16", children: [
1321
1321
  title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1322
1322
  "h2",
1323
1323
  {
1324
1324
  className: cn(
1325
- "text-xl font-medium tracking-tight md:text-2xl lg:text-3xl",
1325
+ "text-xl font-medium tracking-tight md:text-2xl lg:text-3xl text-balance",
1326
1326
  titleClassName
1327
1327
  ),
1328
1328
  children: title
1329
1329
  }
1330
1330
  ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: titleClassName, children: title })),
1331
- description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1332
- "p",
1333
- {
1334
- className: cn(
1335
- "max-w-lg text-muted-foreground",
1336
- descriptionClassName
1337
- ),
1338
- children: description
1339
- }
1340
- ) : /* @__PURE__ */ jsxRuntime.jsx(
1331
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("max-w-lg text-balance", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx(
1341
1332
  "div",
1342
1333
  {
1343
- className: cn(
1344
- "max-w-lg text-muted-foreground",
1345
- descriptionClassName
1346
- ),
1334
+ className: cn("max-w-lg text-balance", descriptionClassName),
1347
1335
  children: description
1348
1336
  }
1349
1337
  ))
@@ -1178,7 +1178,7 @@ function CarouselTabsContent({
1178
1178
  }, []);
1179
1179
  const tabsContent = useMemo(() => {
1180
1180
  if (tabsSlot) return tabsSlot;
1181
- return /* @__PURE__ */ jsx("div", { className: cn("relative flex", tabsClassName), children: /* @__PURE__ */ jsxs("div", { className: "relative flex h-auto gap-2 md:gap-4", children: [
1181
+ return /* @__PURE__ */ jsx("div", { className: cn("relative flex min-w-0 flex-1 overflow-x-auto scrollbar-hide", tabsClassName), children: /* @__PURE__ */ jsxs("div", { className: "relative flex h-auto flex-nowrap gap-2 md:gap-4", children: [
1182
1182
  items?.map((item, idx) => /* @__PURE__ */ jsx(
1183
1183
  "button",
1184
1184
  {
@@ -1187,7 +1187,7 @@ function CarouselTabsContent({
1187
1187
  },
1188
1188
  onClick: () => setCurrent(item.category),
1189
1189
  className: cn(
1190
- "text-base transition-all duration-700 ease-out px-3 py-1.5 rounded-sm",
1190
+ "text-base transition-all duration-700 ease-out px-3 py-1.5 rounded-sm whitespace-nowrap flex-shrink-0",
1191
1191
  current === item.category ? "text-foreground" : "text-muted-foreground hover:text-foreground",
1192
1192
  tabClassName
1193
1193
  ),
@@ -1293,33 +1293,21 @@ function CarouselTabsContent({
1293
1293
  patternClassName,
1294
1294
  className: cn("overflow-hidden", className),
1295
1295
  children: [
1296
- title || description ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
1296
+ title || description ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 mb-6 md:mb-16", children: [
1297
1297
  title && (typeof title === "string" ? /* @__PURE__ */ jsx(
1298
1298
  "h2",
1299
1299
  {
1300
1300
  className: cn(
1301
- "text-xl font-medium tracking-tight md:text-2xl lg:text-3xl",
1301
+ "text-xl font-medium tracking-tight md:text-2xl lg:text-3xl text-balance",
1302
1302
  titleClassName
1303
1303
  ),
1304
1304
  children: title
1305
1305
  }
1306
1306
  ) : /* @__PURE__ */ jsx("div", { className: titleClassName, children: title })),
1307
- description && (typeof description === "string" ? /* @__PURE__ */ jsx(
1308
- "p",
1309
- {
1310
- className: cn(
1311
- "max-w-lg text-muted-foreground",
1312
- descriptionClassName
1313
- ),
1314
- children: description
1315
- }
1316
- ) : /* @__PURE__ */ jsx(
1307
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("max-w-lg text-balance", descriptionClassName), children: description }) : /* @__PURE__ */ jsx(
1317
1308
  "div",
1318
1309
  {
1319
- className: cn(
1320
- "max-w-lg text-muted-foreground",
1321
- descriptionClassName
1322
- ),
1310
+ className: cn("max-w-lg text-balance", descriptionClassName),
1323
1311
  children: description
1324
1312
  }
1325
1313
  ))
@@ -33,36 +33,6 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
33
33
  function cn(...inputs) {
34
34
  return tailwindMerge.twMerge(clsx.clsx(inputs));
35
35
  }
36
- function getNestedCardBg(parentBg, variant = "muted", options) {
37
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
38
- if (isDark) {
39
- switch (variant) {
40
- case "muted":
41
- return "bg-background";
42
- case "card":
43
- return "bg-card";
44
- case "accent":
45
- return "bg-accent";
46
- case "subtle":
47
- return "bg-background/50";
48
- }
49
- } else {
50
- switch (variant) {
51
- case "muted":
52
- return "bg-muted";
53
- case "card":
54
- return "bg-card";
55
- case "accent":
56
- return "bg-accent";
57
- case "subtle":
58
- return "bg-muted/50";
59
- }
60
- }
61
- }
62
- function getNestedCardTextColor(parentBg, options) {
63
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
64
- return isDark ? "text-foreground" : "";
65
- }
66
36
  var badgeVariants = classVarianceAuthority.cva(
67
37
  "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
68
38
  {
@@ -603,7 +573,7 @@ function ExpandableCaseStudyCards({
603
573
  {
604
574
  "data-state": selection === item.id ? "open" : "closed",
605
575
  className: cn(
606
- 'group max-lg:w-full max-lg:flex-1 max-md:h-[200px] md:max-lg:aspect-1336/420 lg:transform-gpu lg:transition-all lg:data-[state="closed"]:w-[20%] lg:data-[state="closed"]:duration-500 lg:data-[state="open"]:w-[60%] lg:data-[state="open"]:duration-400',
576
+ "group h-[280px] w-full lg:h-auto lg:w-auto lg:transform-gpu lg:transition-all lg:data-[state=closed]:w-[20%] lg:data-[state=closed]:duration-500 lg:data-[state=open]:w-[60%] lg:data-[state=open]:duration-400",
607
577
  item.className,
608
578
  cardClassName
609
579
  ),
@@ -614,72 +584,61 @@ function ExpandableCaseStudyCards({
614
584
  "a",
615
585
  {
616
586
  href: item.href,
617
- className: "relative block h-full w-full overflow-hidden rounded-xl bg-primary text-primary-foreground dark:bg-card",
587
+ className: "relative block h-full w-full overflow-hidden rounded-xl",
618
588
  children: [
619
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: 'absolute -inset-[50%] hidden h-[200%] w-[200%] md:block lg:group-data-[state="closed"]:blur-sm', children: [
620
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-[calc(25%+40px)] aspect-square h-[calc(50%+40px)] max-lg:right-[calc(50%+40px)] lg:right-[50%]", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full w-full overflow-clip rounded-xl", children: /* @__PURE__ */ jsxRuntime.jsx(
621
- img.Img,
622
- {
623
- src: item.image,
624
- alt: typeof item.title === "string" ? item.title : item.imageAlt || "Case study image",
625
- className: cn(
626
- "h-full w-full object-cover object-center",
627
- imageClassName
628
- ),
629
- loading: "lazy",
630
- optixFlowConfig
631
- }
632
- ) }) }),
633
- /* @__PURE__ */ jsxRuntime.jsx(
589
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 lg:group-data-[state=closed]:blur-xs lg:transition-[filter] lg:duration-500", children: /* @__PURE__ */ jsxRuntime.jsx(
590
+ img.Img,
591
+ {
592
+ src: item.image,
593
+ alt: typeof item.title === "string" ? item.title : item.imageAlt || "Case study image",
594
+ className: cn(
595
+ "h-full w-full object-cover object-center",
596
+ imageClassName
597
+ ),
598
+ loading: "lazy",
599
+ optixFlowConfig
600
+ }
601
+ ) }),
602
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0 h-[70%] bg-linear-to-t from-black/90 from-30% to-transparent" }),
603
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 flex flex-col justify-end p-4 pb-5 lg:transition-opacity lg:delay-200 lg:duration-500 lg:group-data-[state=closed]:opacity-0", children: [
604
+ item.badges && item.badges.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
634
605
  "div",
635
606
  {
636
607
  className: cn(
637
- "absolute top-[50%] left-[50%] flex size-16 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full max-lg:hidden",
638
- getNestedCardBg(background, "accent"),
639
- getNestedCardTextColor(background)
608
+ "mb-3 flex flex-wrap items-center gap-2",
609
+ badgesClassName
640
610
  ),
641
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/plus", size: 32 })
611
+ children: item.badges.map((badge, idx) => /* @__PURE__ */ jsxRuntime.jsx(
612
+ Badge,
613
+ {
614
+ variant: "secondary",
615
+ className: badgeClassName,
616
+ children: badge
617
+ },
618
+ idx
619
+ ))
642
620
  }
643
621
  ),
644
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0 hidden h-[50%] bg-linear-to-t from-primary from-50% to-transparent lg:block" })
645
- ] }),
646
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex flex-col justify-between gap-4 md:absolute md:inset-0 md:max-lg:inset-x-[50%] md:max-lg:w-[50%]", children: [
647
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: 'flex flex-col gap-3 p-4 pt-6 transition-all delay-200 duration-500 lg:group-data-[state="closed"]:opacity-0', children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-2", children: [
648
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
622
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end justify-between gap-3", children: [
623
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1.5", children: [
649
624
  item.logo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-1", children: /* @__PURE__ */ jsxRuntime.jsx(
650
625
  img.Img,
651
626
  {
652
627
  src: item.logo,
653
628
  alt: item.logoAlt || item.company || "Logo",
654
- className: cn("h-6 max-w-[120px] object-contain object-left lg:h-8 lg:max-w-[150px]", logoClassName),
629
+ className: cn(
630
+ "h-6 max-w-[120px] object-contain object-left invert lg:h-8 lg:max-w-[150px]",
631
+ logoClassName
632
+ ),
655
633
  loading: "lazy",
656
634
  optixFlowConfig
657
635
  }
658
636
  ) }),
659
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-medium lg:text-lg", children: item.title }),
660
- item.description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-primary-foreground/70", children: item.description })
637
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-medium text-white lg:text-lg", children: item.title }),
638
+ item.description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-white/80", children: item.description })
661
639
  ] }),
662
- /* @__PURE__ */ jsxRuntime.jsx(
663
- "div",
664
- {
665
- className: cn(
666
- "flex size-8 shrink-0 items-center justify-center rounded-full text-foreground transition-transform group-hover:translate-x-1 group-hover:-translate-y-1 lg:size-10",
667
- getNestedCardBg(background, "card")
668
- ),
669
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-up-right", size: 20 })
670
- }
671
- )
672
- ] }) }),
673
- /* @__PURE__ */ jsxRuntime.jsx(
674
- "div",
675
- {
676
- className: cn(
677
- 'flex h-20 items-center gap-2 px-4 pb-4 transition-opacity delay-200 duration-500 lg:group-data-[state="closed"]:opacity-0',
678
- badgesClassName
679
- ),
680
- children: item.badges?.map((badge, idx) => /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "secondary", className: badgeClassName, children: badge }, idx))
681
- }
682
- )
640
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex size-8 shrink-0 items-center justify-center rounded-full bg-white/20 text-white backdrop-blur-sm transition-transform group-hover:translate-x-1 group-hover:-translate-y-1 lg:size-10", children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-up-right", size: 20 }) })
641
+ ] })
683
642
  ] })
684
643
  ]
685
644
  }