@burdenoff/website-sdk 2026.719.4 → 2026.719.6

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.
@@ -800,6 +800,18 @@ function BlogPostPage(props) {
800
800
  ] });
801
801
  }
802
802
  var CASE_STUDY_TAG = "case-study";
803
+ var ANIMATION_STYLES = `
804
+ @keyframes csFadeUp { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } }
805
+ @keyframes csFloat { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-14px); } }
806
+ .cs-fade-up { animation: csFadeUp 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; }
807
+ .cs-float { animation: csFloat 7s ease-in-out infinite; }
808
+ @media (prefers-reduced-motion: reduce) {
809
+ .cs-fade-up, .cs-float { animation: none !important; }
810
+ }
811
+ `;
812
+ function AnimationStyles() {
813
+ return /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: ANIMATION_STYLES } });
814
+ }
803
815
  var CASE_STUDIES_QUERY = `
804
816
  query CaseStudies($productId: String!, $limit: Int, $offset: Int) {
805
817
  publicContentPages(productId: $productId, limit: $limit, offset: $offset) {
@@ -846,91 +858,355 @@ var CASE_STUDY_QUERY = `
846
858
  }
847
859
  }
848
860
  `;
849
- function CaseStudyCard({
850
- post,
851
- basePath = "/case-studies"
852
- }) {
853
- const date = post.publishedAt || post.lastUpdated;
854
- const formattedDate = date ? new Date(date).toLocaleDateString("en-US", {
861
+ function formatDate(value) {
862
+ if (!value) return "";
863
+ const d = new Date(value);
864
+ if (Number.isNaN(d.getTime())) return "";
865
+ return d.toLocaleDateString("en-US", {
855
866
  year: "numeric",
856
867
  month: "long",
857
868
  day: "numeric"
858
- }) : "";
869
+ });
870
+ }
871
+ function Thumbnail({
872
+ src,
873
+ alt,
874
+ className = ""
875
+ }) {
859
876
  const [imgError, setImgError] = React.useState(false);
877
+ if (src && !imgError) {
878
+ return /* @__PURE__ */ jsxRuntime.jsx(
879
+ "img",
880
+ {
881
+ src,
882
+ alt,
883
+ className,
884
+ loading: "lazy",
885
+ onError: () => setImgError(true)
886
+ }
887
+ );
888
+ }
889
+ return /* @__PURE__ */ jsxRuntime.jsx(
890
+ "div",
891
+ {
892
+ className: `flex items-center justify-center bg-gradient-to-br from-muted/60 to-muted ${className}`,
893
+ "aria-hidden": "true",
894
+ children: /* @__PURE__ */ jsxRuntime.jsx(
895
+ "svg",
896
+ {
897
+ className: "w-12 h-12 text-muted-foreground/25",
898
+ fill: "none",
899
+ viewBox: "0 0 24 24",
900
+ stroke: "currentColor",
901
+ children: /* @__PURE__ */ jsxRuntime.jsx(
902
+ "path",
903
+ {
904
+ strokeLinecap: "round",
905
+ strokeLinejoin: "round",
906
+ strokeWidth: 1.5,
907
+ d: "M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"
908
+ }
909
+ )
910
+ }
911
+ )
912
+ }
913
+ );
914
+ }
915
+ function MetaRow({
916
+ post,
917
+ className = ""
918
+ }) {
919
+ const formattedDate = formatDate(post.publishedAt || post.lastUpdated);
920
+ return /* @__PURE__ */ jsxRuntime.jsxs(
921
+ "div",
922
+ {
923
+ className: `flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground ${className}`,
924
+ children: [
925
+ post.author && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: post.author }),
926
+ post.author && formattedDate && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
927
+ formattedDate && /* @__PURE__ */ jsxRuntime.jsx("span", { children: formattedDate }),
928
+ post.readingTime ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
929
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
930
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
931
+ post.readingTime,
932
+ " min read"
933
+ ] })
934
+ ] }) : null
935
+ ]
936
+ }
937
+ );
938
+ }
939
+ function FeaturedCard({
940
+ post,
941
+ basePath
942
+ }) {
860
943
  return /* @__PURE__ */ jsxRuntime.jsxs(
861
944
  "a",
862
945
  {
863
946
  href: `${basePath}/${post.slug}`,
864
- className: "group block bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300",
947
+ className: "group relative grid md:grid-cols-2 gap-0 overflow-hidden rounded-2xl border bg-card shadow-sm transition-all duration-300 hover:-translate-y-1 hover:shadow-xl hover:border-primary/40",
865
948
  children: [
866
- post.thumbnail && !imgError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[16/9] overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
867
- "img",
949
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative aspect-[16/10] md:aspect-auto md:h-full overflow-hidden", children: [
950
+ /* @__PURE__ */ jsxRuntime.jsx(
951
+ Thumbnail,
952
+ {
953
+ src: post.thumbnail,
954
+ alt: post.title,
955
+ className: "w-full h-full min-h-[220px] object-cover transition-transform duration-500 group-hover:scale-[1.04]"
956
+ }
957
+ ),
958
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "absolute top-4 left-4 inline-flex items-center gap-1 rounded-full bg-primary px-2.5 py-1 text-xs font-semibold text-primary-foreground shadow-sm", children: [
959
+ /* @__PURE__ */ jsxRuntime.jsx(
960
+ "svg",
961
+ {
962
+ className: "h-3 w-3",
963
+ viewBox: "0 0 20 20",
964
+ fill: "currentColor",
965
+ "aria-hidden": "true",
966
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.286 3.957a1 1 0 00.95.69h4.162c.969 0 1.371 1.24.588 1.81l-3.368 2.447a1 1 0 00-.364 1.118l1.287 3.957c.3.921-.755 1.688-1.54 1.118l-3.367-2.447a1 1 0 00-1.176 0l-3.367 2.447c-.784.57-1.838-.197-1.539-1.118l1.286-3.957a1 1 0 00-.363-1.118L2.98 9.384c-.783-.57-.38-1.81.588-1.81h4.162a1 1 0 00.95-.69l1.286-3.957z" })
967
+ }
968
+ ),
969
+ "Featured"
970
+ ] })
971
+ ] }),
972
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col justify-center p-6 sm:p-8", children: [
973
+ post.category && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-3 inline-block w-fit rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary", children: post.category }),
974
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-xl sm:text-2xl font-bold text-foreground transition-colors group-hover:text-primary line-clamp-3", children: post.title }),
975
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-3 text-sm sm:text-base text-muted-foreground line-clamp-3", children: post.excerpt || post.seoDescription || "" }),
976
+ /* @__PURE__ */ jsxRuntime.jsx(MetaRow, { post, className: "mt-5" }),
977
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-5 inline-flex items-center gap-1 text-sm font-semibold text-primary", children: [
978
+ "Read the story",
979
+ /* @__PURE__ */ jsxRuntime.jsx(
980
+ "svg",
981
+ {
982
+ className: "h-4 w-4 transition-transform duration-300 group-hover:translate-x-1",
983
+ viewBox: "0 0 20 20",
984
+ fill: "currentColor",
985
+ "aria-hidden": "true",
986
+ children: /* @__PURE__ */ jsxRuntime.jsx(
987
+ "path",
988
+ {
989
+ fillRule: "evenodd",
990
+ d: "M7.293 4.293a1 1 0 011.414 0l5 5a1 1 0 010 1.414l-5 5a1 1 0 01-1.414-1.414L11.586 10 7.293 5.707a1 1 0 010-1.414z",
991
+ clipRule: "evenodd"
992
+ }
993
+ )
994
+ }
995
+ )
996
+ ] })
997
+ ] })
998
+ ]
999
+ }
1000
+ );
1001
+ }
1002
+ function CaseStudyCard({
1003
+ post,
1004
+ basePath = "/case-studies"
1005
+ }) {
1006
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1007
+ "a",
1008
+ {
1009
+ href: `${basePath}/${post.slug}`,
1010
+ className: "group flex flex-col overflow-hidden rounded-xl border bg-card transition-all duration-300 hover:-translate-y-1 hover:shadow-lg hover:border-primary/40",
1011
+ children: [
1012
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[16/9] overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
1013
+ Thumbnail,
868
1014
  {
869
1015
  src: post.thumbnail,
870
1016
  alt: post.title,
871
- className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300",
872
- loading: "lazy",
873
- onError: () => setImgError(true)
1017
+ className: "w-full h-full object-cover transition-transform duration-500 group-hover:scale-105"
874
1018
  }
875
- ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[16/9] bg-muted/50 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
1019
+ ) }),
1020
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col p-5 sm:p-6", children: [
1021
+ post.category && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-3 inline-block w-fit rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary", children: post.category }),
1022
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mb-2 text-lg font-semibold text-foreground transition-colors group-hover:text-primary line-clamp-2", children: post.title }),
1023
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-4 text-sm text-muted-foreground line-clamp-3", children: post.excerpt || post.seoDescription || "" }),
1024
+ /* @__PURE__ */ jsxRuntime.jsx(MetaRow, { post, className: "mt-auto" })
1025
+ ] })
1026
+ ]
1027
+ }
1028
+ );
1029
+ }
1030
+ function EmptyState({
1031
+ productLabel,
1032
+ title,
1033
+ subtitle,
1034
+ contactHref,
1035
+ contactLabel,
1036
+ exploreHref,
1037
+ exploreLabel
1038
+ }) {
1039
+ const highlights = [
1040
+ {
1041
+ title: "Real outcomes, real teams",
1042
+ body: `We're partnering with our earliest adopters right now. As they ship results with ${productLabel}, their stories will land here \u2014 measured and unembellished.`,
1043
+ icon: /* @__PURE__ */ jsxRuntime.jsx(
1044
+ "path",
1045
+ {
1046
+ strokeLinecap: "round",
1047
+ strokeLinejoin: "round",
1048
+ strokeWidth: 1.5,
1049
+ d: "M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z"
1050
+ }
1051
+ )
1052
+ },
1053
+ {
1054
+ title: "See it on your use case",
1055
+ body: `Want to know how ${productLabel} would work for your team? We'll walk you through exactly what to expect \u2014 no pitch, just specifics.`,
1056
+ icon: /* @__PURE__ */ jsxRuntime.jsx(
1057
+ "path",
1058
+ {
1059
+ strokeLinecap: "round",
1060
+ strokeLinejoin: "round",
1061
+ strokeWidth: 1.5,
1062
+ d: "M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z M15 12a3 3 0 11-6 0 3 3 0 016 0z"
1063
+ }
1064
+ )
1065
+ },
1066
+ {
1067
+ title: "Be the first story",
1068
+ body: `Building something with ${productLabel} worth talking about? Tell us \u2014 the best early stories become the case studies featured on this page.`,
1069
+ icon: /* @__PURE__ */ jsxRuntime.jsx(
1070
+ "path",
1071
+ {
1072
+ strokeLinecap: "round",
1073
+ strokeLinejoin: "round",
1074
+ strokeWidth: 1.5,
1075
+ d: "M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.562.562 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.562.562 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z"
1076
+ }
1077
+ )
1078
+ }
1079
+ ];
1080
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cs-fade-up mx-auto max-w-4xl", children: [
1081
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative overflow-hidden rounded-3xl border bg-card px-6 py-14 text-center sm:px-12 sm:py-16", children: [
1082
+ /* @__PURE__ */ jsxRuntime.jsx(
1083
+ "div",
1084
+ {
1085
+ className: "pointer-events-none absolute -top-24 -right-16 h-64 w-64 rounded-full bg-primary/10 blur-3xl",
1086
+ "aria-hidden": "true"
1087
+ }
1088
+ ),
1089
+ /* @__PURE__ */ jsxRuntime.jsx(
1090
+ "div",
1091
+ {
1092
+ className: "pointer-events-none absolute -bottom-24 -left-16 h-64 w-64 rounded-full bg-primary/5 blur-3xl",
1093
+ "aria-hidden": "true"
1094
+ }
1095
+ ),
1096
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
1097
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cs-float mx-auto flex h-20 w-20 items-center justify-center rounded-2xl bg-primary/10 text-primary ring-1 ring-primary/20", children: /* @__PURE__ */ jsxRuntime.jsx(
876
1098
  "svg",
877
1099
  {
878
- className: "w-12 h-12 text-muted-foreground/20",
1100
+ className: "h-10 w-10",
879
1101
  fill: "none",
880
1102
  viewBox: "0 0 24 24",
881
1103
  stroke: "currentColor",
1104
+ "aria-hidden": "true",
882
1105
  children: /* @__PURE__ */ jsxRuntime.jsx(
883
1106
  "path",
884
1107
  {
885
1108
  strokeLinecap: "round",
886
1109
  strokeLinejoin: "round",
887
1110
  strokeWidth: 1.5,
888
- d: "M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"
1111
+ d: "M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z"
889
1112
  }
890
1113
  )
891
1114
  }
892
1115
  ) }),
893
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 sm:p-6", children: [
894
- post.category && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-3", children: post.category }),
895
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2", children: post.title }),
896
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-4 line-clamp-3", children: post.excerpt || post.seoDescription || "" }),
897
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 text-xs text-muted-foreground", children: [
898
- post.author && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: post.author }),
899
- post.author && formattedDate && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
900
- formattedDate && /* @__PURE__ */ jsxRuntime.jsx("span", { children: formattedDate }),
901
- post.readingTime && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
902
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
903
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
904
- post.readingTime,
905
- " min read"
906
- ] })
907
- ] })
908
- ] })
1116
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "mt-8 text-2xl font-bold tracking-tight text-foreground sm:text-3xl", children: title }),
1117
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mx-auto mt-4 max-w-2xl text-base leading-relaxed text-muted-foreground sm:text-lg", children: subtitle }),
1118
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row", children: [
1119
+ /* @__PURE__ */ jsxRuntime.jsxs(
1120
+ "a",
1121
+ {
1122
+ href: contactHref,
1123
+ className: "inline-flex w-full items-center justify-center gap-2 rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md sm:w-auto",
1124
+ children: [
1125
+ contactLabel,
1126
+ /* @__PURE__ */ jsxRuntime.jsx(
1127
+ "svg",
1128
+ {
1129
+ className: "h-4 w-4",
1130
+ viewBox: "0 0 20 20",
1131
+ fill: "currentColor",
1132
+ "aria-hidden": "true",
1133
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1134
+ "path",
1135
+ {
1136
+ fillRule: "evenodd",
1137
+ d: "M7.293 4.293a1 1 0 011.414 0l5 5a1 1 0 010 1.414l-5 5a1 1 0 01-1.414-1.414L11.586 10 7.293 5.707a1 1 0 010-1.414z",
1138
+ clipRule: "evenodd"
1139
+ }
1140
+ )
1141
+ }
1142
+ )
1143
+ ]
1144
+ }
1145
+ ),
1146
+ /* @__PURE__ */ jsxRuntime.jsx(
1147
+ "a",
1148
+ {
1149
+ href: exploreHref,
1150
+ className: "inline-flex w-full items-center justify-center gap-2 rounded-lg border border-border bg-background px-6 py-3 text-sm font-semibold text-foreground transition-colors hover:bg-muted sm:w-auto",
1151
+ children: exploreLabel
1152
+ }
1153
+ )
909
1154
  ] })
910
- ]
911
- }
912
- );
1155
+ ] })
1156
+ ] }),
1157
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 grid gap-4 sm:grid-cols-3", children: highlights.map((h) => /* @__PURE__ */ jsxRuntime.jsxs(
1158
+ "div",
1159
+ {
1160
+ className: "rounded-2xl border bg-card/60 p-5 text-left transition-colors hover:border-primary/30",
1161
+ children: [
1162
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-primary", children: /* @__PURE__ */ jsxRuntime.jsx(
1163
+ "svg",
1164
+ {
1165
+ className: "h-5 w-5",
1166
+ fill: "none",
1167
+ viewBox: "0 0 24 24",
1168
+ stroke: "currentColor",
1169
+ "aria-hidden": "true",
1170
+ children: h.icon
1171
+ }
1172
+ ) }),
1173
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mt-4 text-sm font-semibold text-foreground", children: h.title }),
1174
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-sm leading-relaxed text-muted-foreground", children: h.body })
1175
+ ]
1176
+ },
1177
+ h.title
1178
+ )) })
1179
+ ] });
913
1180
  }
914
1181
  function CaseStudiesListPage(props) {
915
1182
  const {
916
1183
  productName,
1184
+ eyebrow = "Customer Stories",
917
1185
  heroTitle = "Case Studies",
918
- heroSubtitle = "Real-world stories of teams building with our platform",
1186
+ heroSubtitle = "Real-world stories of teams building with our platform.",
919
1187
  caseStudyBasePath = "/case-studies",
920
1188
  className = "",
921
1189
  seoTitle,
922
1190
  seoDescription,
923
- seoKeywords
1191
+ seoKeywords,
1192
+ contactHref = "/contact",
1193
+ contactLabel = "Get in touch",
1194
+ exploreHref = "/features",
1195
+ exploreLabel = "Explore the product",
1196
+ emptyTitle,
1197
+ emptySubtitle
924
1198
  } = props;
925
1199
  const client = useWebSDK();
926
1200
  const config = useWebSDKConfig();
927
1201
  const { product } = useProduct();
928
1202
  const resolvedProductId = product?.id || config.productId;
1203
+ const productLabel = product?.name || productName || "our platform";
929
1204
  const [posts, setPosts] = React.useState([]);
930
1205
  const [total, setTotal] = React.useState(0);
931
1206
  const [loading, setLoading] = React.useState(true);
932
1207
  const [error, setError] = React.useState(null);
933
1208
  const [offset, setOffset] = React.useState(0);
1209
+ const [activeCategory, setActiveCategory] = React.useState("All");
934
1210
  const limit = 12;
935
1211
  const fetchPosts = React.useCallback(async () => {
936
1212
  if (!resolvedProductId) return;
@@ -943,6 +1219,7 @@ function CaseStudiesListPage(props) {
943
1219
  });
944
1220
  if (result.errors?.length) {
945
1221
  setError(result.errors[0]?.message ?? "Failed to load case studies");
1222
+ setPosts([]);
946
1223
  return;
947
1224
  }
948
1225
  const caseStudies = (result.data?.publicContentPages?.items || []).filter(
@@ -952,7 +1229,8 @@ function CaseStudiesListPage(props) {
952
1229
  setTotal(result.data?.publicContentPages?.total || 0);
953
1230
  setError(null);
954
1231
  } catch {
955
- setError("Failed to load case studies");
1232
+ setError("load-failed");
1233
+ setPosts([]);
956
1234
  } finally {
957
1235
  setLoading(false);
958
1236
  }
@@ -960,9 +1238,25 @@ function CaseStudiesListPage(props) {
960
1238
  React.useEffect(() => {
961
1239
  fetchPosts();
962
1240
  }, [fetchPosts]);
963
- const featuredPosts = posts.filter((p) => p.featured);
964
- const regularPosts = posts.filter((p) => !p.featured);
965
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `w-full ${className}`, children: [
1241
+ const categories = React.useMemo(() => {
1242
+ const set = /* @__PURE__ */ new Set();
1243
+ posts.forEach((p) => {
1244
+ if (p.category) set.add(p.category);
1245
+ });
1246
+ return ["All", ...Array.from(set)];
1247
+ }, [posts]);
1248
+ const visiblePosts = React.useMemo(() => {
1249
+ if (activeCategory === "All") return posts;
1250
+ return posts.filter((p) => p.category === activeCategory);
1251
+ }, [posts, activeCategory]);
1252
+ const featuredPosts = visiblePosts.filter((p) => p.featured);
1253
+ const regularPosts = visiblePosts.filter((p) => !p.featured);
1254
+ const hasContent = !loading && !error && posts.length > 0;
1255
+ const showEmpty = !loading && (error !== null || posts.length === 0);
1256
+ const resolvedEmptyTitle = emptyTitle ?? "Case studies are on the way";
1257
+ const resolvedEmptySubtitle = emptySubtitle ?? `${productLabel} is early in its journey, and we'd rather show you real, measurable results than filler. We're working closely with our first teams now \u2014 their stories will be published here soon. In the meantime, we'd love to show you what's possible.`;
1258
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `w-full ${className}`, "data-cs": "case-studies-v2", children: [
1259
+ /* @__PURE__ */ jsxRuntime.jsx(AnimationStyles, {}),
966
1260
  seoTitle && /* @__PURE__ */ jsxRuntime.jsx(
967
1261
  PageHead,
968
1262
  {
@@ -972,35 +1266,69 @@ function CaseStudiesListPage(props) {
972
1266
  keywords: seoKeywords
973
1267
  }
974
1268
  ),
975
- /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-16 sm:py-20 md:py-24", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center max-w-3xl mx-auto", children: [
976
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground", children: heroTitle }),
977
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-4 text-lg text-muted-foreground", children: heroSubtitle })
978
- ] }) }) }),
979
- /* @__PURE__ */ jsxRuntime.jsx("section", { className: "pb-16 sm:pb-20", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsxRuntime.jsxs(
1269
+ /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "relative overflow-hidden", children: [
1270
+ /* @__PURE__ */ jsxRuntime.jsx(
1271
+ "div",
1272
+ {
1273
+ className: "pointer-events-none absolute inset-x-0 -top-32 mx-auto h-72 max-w-3xl rounded-full bg-primary/10 blur-3xl",
1274
+ "aria-hidden": "true"
1275
+ }
1276
+ ),
1277
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative mx-auto max-w-7xl px-4 py-16 sm:px-6 sm:py-20 md:py-24 lg:px-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-3xl text-center", children: [
1278
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-2 rounded-full border border-primary/20 bg-primary/10 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-primary", children: [
1279
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-primary" }),
1280
+ eyebrow
1281
+ ] }),
1282
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "mt-5 text-3xl font-bold tracking-tight text-foreground sm:text-4xl md:text-5xl", children: heroTitle }),
1283
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-4 text-lg text-muted-foreground", children: heroSubtitle })
1284
+ ] }) })
1285
+ ] }),
1286
+ /* @__PURE__ */ jsxRuntime.jsx("section", { className: "pb-20 sm:pb-24", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid gap-6 sm:gap-8 md:grid-cols-2 lg:grid-cols-3", children: [1, 2, 3, 4, 5, 6].map((i) => /* @__PURE__ */ jsxRuntime.jsxs(
980
1287
  "div",
981
1288
  {
982
- className: "bg-card border rounded-xl overflow-hidden animate-pulse",
1289
+ className: "overflow-hidden rounded-xl border bg-card animate-pulse",
983
1290
  children: [
984
1291
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[16/9] bg-muted" }),
985
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 space-y-3", children: [
986
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 bg-muted rounded w-1/4" }),
987
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-6 bg-muted rounded w-3/4" }),
988
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 bg-muted rounded" }),
989
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 bg-muted rounded w-1/2" })
1292
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3 p-6", children: [
1293
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-1/4 rounded bg-muted" }),
1294
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-6 w-3/4 rounded bg-muted" }),
1295
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 rounded bg-muted" }),
1296
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-1/2 rounded bg-muted" })
990
1297
  ] })
991
1298
  ]
992
1299
  },
993
1300
  i
994
- )) }) : error ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: error }) }) : posts.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "No case studies yet. Check back soon!" }) }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
995
- featuredPosts.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid md:grid-cols-2 gap-6 sm:gap-8 mb-8", children: featuredPosts.map((post) => /* @__PURE__ */ jsxRuntime.jsx(
996
- CaseStudyCard,
1301
+ )) }) : showEmpty ? /* @__PURE__ */ jsxRuntime.jsx(
1302
+ EmptyState,
1303
+ {
1304
+ productLabel,
1305
+ title: resolvedEmptyTitle,
1306
+ subtitle: resolvedEmptySubtitle,
1307
+ contactHref,
1308
+ contactLabel,
1309
+ exploreHref,
1310
+ exploreLabel
1311
+ }
1312
+ ) : hasContent ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1313
+ categories.length > 2 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-10 flex flex-wrap justify-center gap-2", children: categories.map((cat) => /* @__PURE__ */ jsxRuntime.jsx(
1314
+ "button",
1315
+ {
1316
+ type: "button",
1317
+ onClick: () => setActiveCategory(cat),
1318
+ className: `rounded-full border px-4 py-1.5 text-sm font-medium transition-colors ${activeCategory === cat ? "border-primary bg-primary text-primary-foreground" : "border-border bg-background text-muted-foreground hover:border-primary/40 hover:text-foreground"}`,
1319
+ children: cat
1320
+ },
1321
+ cat
1322
+ )) }),
1323
+ featuredPosts.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-10 grid gap-6 sm:gap-8 lg:grid-cols-2", children: featuredPosts.map((post) => /* @__PURE__ */ jsxRuntime.jsx(
1324
+ FeaturedCard,
997
1325
  {
998
1326
  post,
999
1327
  basePath: caseStudyBasePath
1000
1328
  },
1001
1329
  post.id
1002
1330
  )) }),
1003
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8", children: regularPosts.map((post) => /* @__PURE__ */ jsxRuntime.jsx(
1331
+ regularPosts.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid gap-6 sm:gap-8 md:grid-cols-2 lg:grid-cols-3", children: regularPosts.map((post) => /* @__PURE__ */ jsxRuntime.jsx(
1004
1332
  CaseStudyCard,
1005
1333
  {
1006
1334
  post,
@@ -1008,13 +1336,13 @@ function CaseStudiesListPage(props) {
1008
1336
  },
1009
1337
  post.id
1010
1338
  )) }),
1011
- total > limit && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-center gap-4 mt-12", children: [
1339
+ activeCategory === "All" && total > limit && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-14 flex justify-center gap-4", children: [
1012
1340
  /* @__PURE__ */ jsxRuntime.jsx(
1013
1341
  "button",
1014
1342
  {
1015
1343
  onClick: () => setOffset(Math.max(0, offset - limit)),
1016
1344
  disabled: offset === 0,
1017
- className: "px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors",
1345
+ className: "rounded-lg border px-5 py-2.5 text-sm font-medium transition-colors hover:bg-muted disabled:opacity-40",
1018
1346
  children: "Previous"
1019
1347
  }
1020
1348
  ),
@@ -1023,12 +1351,29 @@ function CaseStudiesListPage(props) {
1023
1351
  {
1024
1352
  onClick: () => setOffset(offset + limit),
1025
1353
  disabled: offset + limit >= total,
1026
- className: "px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors",
1354
+ className: "rounded-lg border px-5 py-2.5 text-sm font-medium transition-colors hover:bg-muted disabled:opacity-40",
1027
1355
  children: "Next"
1028
1356
  }
1029
1357
  )
1358
+ ] }),
1359
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-16 overflow-hidden rounded-2xl border bg-gradient-to-br from-primary/10 via-card to-card p-8 text-center sm:p-10", children: [
1360
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-foreground sm:text-2xl", children: "Want results like these?" }),
1361
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mx-auto mt-2 max-w-xl text-sm text-muted-foreground sm:text-base", children: [
1362
+ "Tell us about your goals and we\u2019ll show you exactly how",
1363
+ " ",
1364
+ productLabel,
1365
+ " can help."
1366
+ ] }),
1367
+ /* @__PURE__ */ jsxRuntime.jsx(
1368
+ "a",
1369
+ {
1370
+ href: contactHref,
1371
+ className: "mt-6 inline-flex items-center justify-center gap-2 rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md",
1372
+ children: contactLabel
1373
+ }
1374
+ )
1030
1375
  ] })
1031
- ] }) }) })
1376
+ ] }) : null }) })
1032
1377
  ] });
1033
1378
  }
1034
1379
  function CaseStudyPage(props) {
@@ -1036,12 +1381,15 @@ function CaseStudyPage(props) {
1036
1381
  productName,
1037
1382
  caseStudiesListUrl = "/case-studies",
1038
1383
  backLabel = "Back to Case Studies",
1384
+ contactHref = "/contact",
1385
+ contactLabel = "Get in touch",
1039
1386
  className = ""
1040
1387
  } = props;
1041
1388
  const client = useWebSDK();
1042
1389
  const config = useWebSDKConfig();
1043
1390
  const { product } = useProduct();
1044
1391
  const resolvedProductId = product?.id || config.productId;
1392
+ const productLabel = product?.name || productName || "our team";
1045
1393
  const [post, setPost] = React.useState(null);
1046
1394
  const [loading, setLoading] = React.useState(true);
1047
1395
  const [error, setError] = React.useState(null);
@@ -1070,36 +1418,64 @@ function CaseStudyPage(props) {
1070
1418
  fetchPost();
1071
1419
  }, [client, slug, resolvedProductId]);
1072
1420
  if (loading) {
1073
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-full ${className}`, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-24", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "animate-pulse space-y-6", children: [
1074
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-8 bg-muted rounded w-2/3" }),
1075
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 bg-muted rounded w-1/3" }),
1076
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[16/9] bg-muted rounded-xl" }),
1077
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: [1, 2, 3, 4, 5].map((i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 bg-muted rounded" }, i)) })
1421
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-full ${className}`, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto max-w-4xl px-4 py-24 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "animate-pulse space-y-6", children: [
1422
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-8 w-2/3 rounded bg-muted" }),
1423
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-1/3 rounded bg-muted" }),
1424
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[16/9] rounded-xl bg-muted" }),
1425
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: [1, 2, 3, 4, 5].map((i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 rounded bg-muted" }, i)) })
1078
1426
  ] }) }) });
1079
1427
  }
1080
1428
  if (error || !post) {
1081
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-full ${className}`, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-24 text-center", children: [
1082
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold mb-4", children: "Case study not found" }),
1083
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mb-6", children: error || "This case study doesn't exist or has been removed." }),
1084
- /* @__PURE__ */ jsxRuntime.jsxs(
1085
- "a",
1429
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-full ${className}`, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-2xl px-4 py-24 text-center sm:px-6 lg:px-8", children: [
1430
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex h-16 w-16 items-center justify-center rounded-2xl bg-primary/10 text-primary", children: /* @__PURE__ */ jsxRuntime.jsx(
1431
+ "svg",
1086
1432
  {
1087
- href: caseStudiesListUrl,
1088
- className: "text-primary hover:underline font-medium",
1089
- children: [
1090
- "\u2190 ",
1091
- backLabel
1092
- ]
1433
+ className: "h-8 w-8",
1434
+ fill: "none",
1435
+ viewBox: "0 0 24 24",
1436
+ stroke: "currentColor",
1437
+ "aria-hidden": "true",
1438
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1439
+ "path",
1440
+ {
1441
+ strokeLinecap: "round",
1442
+ strokeLinejoin: "round",
1443
+ strokeWidth: 1.5,
1444
+ d: "M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z"
1445
+ }
1446
+ )
1093
1447
  }
1094
- )
1448
+ ) }),
1449
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "mt-6 text-2xl font-bold text-foreground", children: "Case study not found" }),
1450
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mx-auto mt-3 max-w-md text-muted-foreground", children: [
1451
+ "This story isn\u2019t available yet \u2014 but there\u2019s plenty more to explore, and we\u2019re always happy to talk through what ",
1452
+ productLabel,
1453
+ " can do."
1454
+ ] }),
1455
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row", children: [
1456
+ /* @__PURE__ */ jsxRuntime.jsxs(
1457
+ "a",
1458
+ {
1459
+ href: caseStudiesListUrl,
1460
+ className: "inline-flex items-center justify-center rounded-lg border px-5 py-2.5 text-sm font-semibold text-foreground transition-colors hover:bg-muted",
1461
+ children: [
1462
+ "\u2190 ",
1463
+ backLabel
1464
+ ]
1465
+ }
1466
+ ),
1467
+ /* @__PURE__ */ jsxRuntime.jsx(
1468
+ "a",
1469
+ {
1470
+ href: contactHref,
1471
+ className: "inline-flex items-center justify-center rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition-all hover:opacity-90",
1472
+ children: contactLabel
1473
+ }
1474
+ )
1475
+ ] })
1095
1476
  ] }) });
1096
1477
  }
1097
- const date = post.publishedAt || post.lastUpdated;
1098
- const formattedDate = date ? new Date(date).toLocaleDateString("en-US", {
1099
- year: "numeric",
1100
- month: "long",
1101
- day: "numeric"
1102
- }) : "";
1478
+ const formattedDate = formatDate(post.publishedAt || post.lastUpdated);
1103
1479
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `w-full ${className}`, children: [
1104
1480
  /* @__PURE__ */ jsxRuntime.jsx(
1105
1481
  PageHead,
@@ -1110,41 +1486,57 @@ function CaseStudyPage(props) {
1110
1486
  keywords: post.seoKeywords || ""
1111
1487
  }
1112
1488
  ),
1113
- /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-16 sm:py-20", children: [
1489
+ /* @__PURE__ */ jsxRuntime.jsxs("article", { className: "mx-auto max-w-4xl px-4 py-16 sm:px-6 sm:py-20 lg:px-8", children: [
1114
1490
  /* @__PURE__ */ jsxRuntime.jsxs(
1115
1491
  "a",
1116
1492
  {
1117
1493
  href: caseStudiesListUrl,
1118
- className: "inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground mb-8 transition-colors",
1494
+ className: "mb-8 inline-flex items-center gap-1 text-sm text-muted-foreground transition-colors hover:text-foreground",
1119
1495
  children: [
1120
1496
  "\u2190 ",
1121
1497
  backLabel
1122
1498
  ]
1123
1499
  }
1124
1500
  ),
1125
- post.category && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-4", children: post.category }),
1126
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground mb-4", children: post.title }),
1127
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 text-sm text-muted-foreground mb-8", children: [
1501
+ post.category && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-4 inline-block rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary", children: post.category }),
1502
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "mb-4 text-3xl font-bold tracking-tight text-foreground sm:text-4xl md:text-5xl", children: post.title }),
1503
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-8 flex flex-wrap items-center gap-3 text-sm text-muted-foreground", children: [
1128
1504
  post.author && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium text-foreground", children: post.author }),
1129
1505
  post.author && formattedDate && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
1130
1506
  formattedDate && /* @__PURE__ */ jsxRuntime.jsx("span", { children: formattedDate }),
1131
- post.readingTime && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1507
+ post.readingTime ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1132
1508
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
1133
1509
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1134
1510
  post.readingTime,
1135
1511
  " min read"
1136
1512
  ] })
1137
- ] })
1513
+ ] }) : null
1138
1514
  ] }),
1139
- post.thumbnail && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[16/9] rounded-xl overflow-hidden mb-10", children: /* @__PURE__ */ jsxRuntime.jsx(
1515
+ post.thumbnail && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-10 aspect-[16/9] overflow-hidden rounded-xl", children: /* @__PURE__ */ jsxRuntime.jsx(
1140
1516
  "img",
1141
1517
  {
1142
1518
  src: post.thumbnail,
1143
1519
  alt: post.title,
1144
- className: "w-full h-full object-cover"
1520
+ className: "h-full w-full object-cover"
1145
1521
  }
1146
1522
  ) }),
1147
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "prose prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsxRuntime.jsx(ContentRenderer, { content: post.content, format: post.contentFormat }) })
1523
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "prose prose-gray max-w-none dark:prose-invert", children: /* @__PURE__ */ jsxRuntime.jsx(ContentRenderer, { content: post.content, format: post.contentFormat }) }),
1524
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-14 rounded-2xl border bg-gradient-to-br from-primary/10 via-card to-card p-8 text-center", children: [
1525
+ /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "text-xl font-bold text-foreground", children: [
1526
+ "Curious what ",
1527
+ productLabel,
1528
+ " could do for you?"
1529
+ ] }),
1530
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mx-auto mt-2 max-w-lg text-sm text-muted-foreground", children: "We\u2019re happy to walk you through it \u2014 no pressure, just a conversation about your goals." }),
1531
+ /* @__PURE__ */ jsxRuntime.jsx(
1532
+ "a",
1533
+ {
1534
+ href: contactHref,
1535
+ className: "mt-6 inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md",
1536
+ children: contactLabel
1537
+ }
1538
+ )
1539
+ ] })
1148
1540
  ] })
1149
1541
  ] });
1150
1542
  }
@@ -1239,7 +1631,7 @@ var CHANGELOG_ENTRY_QUERY = `
1239
1631
  }
1240
1632
  }
1241
1633
  `;
1242
- function formatDate(value) {
1634
+ function formatDate2(value) {
1243
1635
  if (!value) return "";
1244
1636
  return new Date(value).toLocaleDateString("en-US", {
1245
1637
  year: "numeric",
@@ -1361,7 +1753,7 @@ function CmsTimeline(props) {
1361
1753
  ),
1362
1754
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 sm:p-8", children: [
1363
1755
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground mb-2", children: [
1364
- entry.publishedAt && /* @__PURE__ */ jsxRuntime.jsx("time", { dateTime: entry.publishedAt, children: formatDate(entry.publishedAt || entry.lastUpdated) }),
1756
+ entry.publishedAt && /* @__PURE__ */ jsxRuntime.jsx("time", { dateTime: entry.publishedAt, children: formatDate2(entry.publishedAt || entry.lastUpdated) }),
1365
1757
  entry.author && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1366
1758
  " \xB7 ",
1367
1759
  entry.author
@@ -1505,7 +1897,7 @@ function EntriesTimeline(props) {
1505
1897
  {
1506
1898
  className: "text-xs text-muted-foreground",
1507
1899
  dateTime: entry.date,
1508
- children: formatDate(entry.date)
1900
+ children: formatDate2(entry.date)
1509
1901
  }
1510
1902
  )
1511
1903
  ] }),