@burdenoff/website-sdk 2026.529.4 → 2026.610.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.
@@ -772,6 +772,566 @@ function BlogPostPage(props) {
772
772
  ] })
773
773
  ] });
774
774
  }
775
+ var CASE_STUDY_TAG = "case-study";
776
+ var CASE_STUDIES_QUERY = `
777
+ query CaseStudies($productId: String!, $limit: Int, $offset: Int) {
778
+ publicContentPages(productId: $productId, limit: $limit, offset: $offset) {
779
+ items {
780
+ id
781
+ title
782
+ slug
783
+ lastUpdated
784
+ tags
785
+ seoDescription
786
+ excerpt
787
+ thumbnail
788
+ author
789
+ publishedAt
790
+ readingTime
791
+ featured
792
+ category
793
+ }
794
+ total
795
+ hasMore
796
+ }
797
+ }
798
+ `;
799
+ var CASE_STUDY_QUERY = `
800
+ query CaseStudy($slug: String!, $productId: String) {
801
+ publicContentPage(slug: $slug, productId: $productId) {
802
+ id
803
+ title
804
+ slug
805
+ content
806
+ contentFormat
807
+ seoTitle
808
+ seoDescription
809
+ seoKeywords
810
+ lastUpdated
811
+ tags
812
+ excerpt
813
+ thumbnail
814
+ author
815
+ publishedAt
816
+ readingTime
817
+ featured
818
+ category
819
+ }
820
+ }
821
+ `;
822
+ function CaseStudyCard({
823
+ post,
824
+ basePath = "/case-studies"
825
+ }) {
826
+ const date = post.publishedAt || post.lastUpdated;
827
+ const formattedDate = date ? new Date(date).toLocaleDateString("en-US", {
828
+ year: "numeric",
829
+ month: "long",
830
+ day: "numeric"
831
+ }) : "";
832
+ const [imgError, setImgError] = useState(false);
833
+ return /* @__PURE__ */ jsxs(
834
+ "a",
835
+ {
836
+ href: `${basePath}/${post.slug}`,
837
+ className: "group block bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300",
838
+ children: [
839
+ post.thumbnail && !imgError ? /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] overflow-hidden", children: /* @__PURE__ */ jsx(
840
+ "img",
841
+ {
842
+ src: post.thumbnail,
843
+ alt: post.title,
844
+ className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300",
845
+ loading: "lazy",
846
+ onError: () => setImgError(true)
847
+ }
848
+ ) }) : /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] bg-muted/50 flex items-center justify-center", children: /* @__PURE__ */ jsx(
849
+ "svg",
850
+ {
851
+ className: "w-12 h-12 text-muted-foreground/20",
852
+ fill: "none",
853
+ viewBox: "0 0 24 24",
854
+ stroke: "currentColor",
855
+ children: /* @__PURE__ */ jsx(
856
+ "path",
857
+ {
858
+ strokeLinecap: "round",
859
+ strokeLinejoin: "round",
860
+ strokeWidth: 1.5,
861
+ 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"
862
+ }
863
+ )
864
+ }
865
+ ) }),
866
+ /* @__PURE__ */ jsxs("div", { className: "p-5 sm:p-6", children: [
867
+ post.category && /* @__PURE__ */ 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 }),
868
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2", children: post.title }),
869
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-4 line-clamp-3", children: post.excerpt || post.seoDescription || "" }),
870
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-xs text-muted-foreground", children: [
871
+ post.author && /* @__PURE__ */ jsx("span", { className: "font-medium", children: post.author }),
872
+ post.author && formattedDate && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
873
+ formattedDate && /* @__PURE__ */ jsx("span", { children: formattedDate }),
874
+ post.readingTime && /* @__PURE__ */ jsxs(Fragment, { children: [
875
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
876
+ /* @__PURE__ */ jsxs("span", { children: [
877
+ post.readingTime,
878
+ " min read"
879
+ ] })
880
+ ] })
881
+ ] })
882
+ ] })
883
+ ]
884
+ }
885
+ );
886
+ }
887
+ function CaseStudiesListPage(props) {
888
+ const {
889
+ productName,
890
+ heroTitle = "Case Studies",
891
+ heroSubtitle = "Real-world stories of teams building with our platform",
892
+ caseStudyBasePath = "/case-studies",
893
+ className = "",
894
+ seoTitle,
895
+ seoDescription,
896
+ seoKeywords
897
+ } = props;
898
+ const client = useWebSDK();
899
+ const config = useWebSDKConfig();
900
+ const { product } = useProduct();
901
+ const resolvedProductId = product?.id || config.productId;
902
+ const [posts, setPosts] = useState([]);
903
+ const [total, setTotal] = useState(0);
904
+ const [loading, setLoading] = useState(true);
905
+ const [error, setError] = useState(null);
906
+ const [offset, setOffset] = useState(0);
907
+ const limit = 12;
908
+ const fetchPosts = useCallback(async () => {
909
+ if (!resolvedProductId) return;
910
+ setLoading(true);
911
+ try {
912
+ const result = await client.query(CASE_STUDIES_QUERY, {
913
+ productId: resolvedProductId,
914
+ limit,
915
+ offset
916
+ });
917
+ if (result.errors?.length) {
918
+ setError(result.errors[0]?.message ?? "Failed to load case studies");
919
+ return;
920
+ }
921
+ const caseStudies = (result.data?.publicContentPages?.items || []).filter(
922
+ (p) => p.tags?.includes(CASE_STUDY_TAG)
923
+ );
924
+ setPosts(caseStudies);
925
+ setTotal(result.data?.publicContentPages?.total || 0);
926
+ setError(null);
927
+ } catch {
928
+ setError("Failed to load case studies");
929
+ } finally {
930
+ setLoading(false);
931
+ }
932
+ }, [client, resolvedProductId, offset]);
933
+ useEffect(() => {
934
+ fetchPosts();
935
+ }, [fetchPosts]);
936
+ const featuredPosts = posts.filter((p) => p.featured);
937
+ const regularPosts = posts.filter((p) => !p.featured);
938
+ return /* @__PURE__ */ jsxs("div", { className: `w-full ${className}`, children: [
939
+ seoTitle && /* @__PURE__ */ jsx(
940
+ PageHead,
941
+ {
942
+ title: seoTitle,
943
+ description: seoDescription || heroSubtitle,
944
+ productName,
945
+ keywords: seoKeywords
946
+ }
947
+ ),
948
+ /* @__PURE__ */ jsx("section", { className: "py-16 sm:py-20 md:py-24", children: /* @__PURE__ */ jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxs("div", { className: "text-center max-w-3xl mx-auto", children: [
949
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground", children: heroTitle }),
950
+ /* @__PURE__ */ jsx("p", { className: "mt-4 text-lg text-muted-foreground", children: heroSubtitle })
951
+ ] }) }) }),
952
+ /* @__PURE__ */ jsx("section", { className: "pb-16 sm:pb-20", children: /* @__PURE__ */ jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: loading ? /* @__PURE__ */ jsx("div", { className: "grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8", children: [1, 2, 3].map((i) => /* @__PURE__ */ jsxs(
953
+ "div",
954
+ {
955
+ className: "bg-card border rounded-xl overflow-hidden animate-pulse",
956
+ children: [
957
+ /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] bg-muted" }),
958
+ /* @__PURE__ */ jsxs("div", { className: "p-6 space-y-3", children: [
959
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-1/4" }),
960
+ /* @__PURE__ */ jsx("div", { className: "h-6 bg-muted rounded w-3/4" }),
961
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded" }),
962
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-1/2" })
963
+ ] })
964
+ ]
965
+ },
966
+ i
967
+ )) }) : error ? /* @__PURE__ */ jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: error }) }) : posts.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No case studies yet. Check back soon!" }) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
968
+ featuredPosts.length > 0 && /* @__PURE__ */ jsx("div", { className: "grid md:grid-cols-2 gap-6 sm:gap-8 mb-8", children: featuredPosts.map((post) => /* @__PURE__ */ jsx(
969
+ CaseStudyCard,
970
+ {
971
+ post,
972
+ basePath: caseStudyBasePath
973
+ },
974
+ post.id
975
+ )) }),
976
+ /* @__PURE__ */ jsx("div", { className: "grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8", children: regularPosts.map((post) => /* @__PURE__ */ jsx(
977
+ CaseStudyCard,
978
+ {
979
+ post,
980
+ basePath: caseStudyBasePath
981
+ },
982
+ post.id
983
+ )) }),
984
+ total > limit && /* @__PURE__ */ jsxs("div", { className: "flex justify-center gap-4 mt-12", children: [
985
+ /* @__PURE__ */ jsx(
986
+ "button",
987
+ {
988
+ onClick: () => setOffset(Math.max(0, offset - limit)),
989
+ disabled: offset === 0,
990
+ className: "px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors",
991
+ children: "Previous"
992
+ }
993
+ ),
994
+ /* @__PURE__ */ jsx(
995
+ "button",
996
+ {
997
+ onClick: () => setOffset(offset + limit),
998
+ disabled: offset + limit >= total,
999
+ className: "px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors",
1000
+ children: "Next"
1001
+ }
1002
+ )
1003
+ ] })
1004
+ ] }) }) })
1005
+ ] });
1006
+ }
1007
+ function CaseStudyPage(props) {
1008
+ const {
1009
+ productName,
1010
+ caseStudiesListUrl = "/case-studies",
1011
+ backLabel = "Back to Case Studies",
1012
+ className = ""
1013
+ } = props;
1014
+ const client = useWebSDK();
1015
+ const config = useWebSDKConfig();
1016
+ const { product } = useProduct();
1017
+ const resolvedProductId = product?.id || config.productId;
1018
+ const [post, setPost] = useState(null);
1019
+ const [loading, setLoading] = useState(true);
1020
+ const [error, setError] = useState(null);
1021
+ const slug = typeof window !== "undefined" ? window.location.pathname.split("/").pop() || "" : "";
1022
+ useEffect(() => {
1023
+ if (!slug || !resolvedProductId) return;
1024
+ async function fetchPost() {
1025
+ setLoading(true);
1026
+ try {
1027
+ const result = await client.query(CASE_STUDY_QUERY, {
1028
+ slug,
1029
+ productId: resolvedProductId
1030
+ });
1031
+ if (result.errors?.length) {
1032
+ setError(result.errors[0]?.message ?? "Failed to load case study");
1033
+ return;
1034
+ }
1035
+ setPost(result.data?.publicContentPage ?? null);
1036
+ setError(null);
1037
+ } catch {
1038
+ setError("Failed to load case study");
1039
+ } finally {
1040
+ setLoading(false);
1041
+ }
1042
+ }
1043
+ fetchPost();
1044
+ }, [client, slug, resolvedProductId]);
1045
+ if (loading) {
1046
+ return /* @__PURE__ */ jsx("div", { className: `w-full ${className}`, children: /* @__PURE__ */ jsx("div", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-24", children: /* @__PURE__ */ jsxs("div", { className: "animate-pulse space-y-6", children: [
1047
+ /* @__PURE__ */ jsx("div", { className: "h-8 bg-muted rounded w-2/3" }),
1048
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-1/3" }),
1049
+ /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] bg-muted rounded-xl" }),
1050
+ /* @__PURE__ */ jsx("div", { className: "space-y-3", children: [1, 2, 3, 4, 5].map((i) => /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded" }, i)) })
1051
+ ] }) }) });
1052
+ }
1053
+ if (error || !post) {
1054
+ return /* @__PURE__ */ jsx("div", { className: `w-full ${className}`, children: /* @__PURE__ */ jsxs("div", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-24 text-center", children: [
1055
+ /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold mb-4", children: "Case study not found" }),
1056
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-6", children: error || "This case study doesn't exist or has been removed." }),
1057
+ /* @__PURE__ */ jsxs(
1058
+ "a",
1059
+ {
1060
+ href: caseStudiesListUrl,
1061
+ className: "text-primary hover:underline font-medium",
1062
+ children: [
1063
+ "\u2190 ",
1064
+ backLabel
1065
+ ]
1066
+ }
1067
+ )
1068
+ ] }) });
1069
+ }
1070
+ const date = post.publishedAt || post.lastUpdated;
1071
+ const formattedDate = date ? new Date(date).toLocaleDateString("en-US", {
1072
+ year: "numeric",
1073
+ month: "long",
1074
+ day: "numeric"
1075
+ }) : "";
1076
+ return /* @__PURE__ */ jsxs("div", { className: `w-full ${className}`, children: [
1077
+ /* @__PURE__ */ jsx(
1078
+ PageHead,
1079
+ {
1080
+ title: post.seoTitle || post.title,
1081
+ description: post.seoDescription || post.excerpt || "",
1082
+ productName,
1083
+ keywords: post.seoKeywords || ""
1084
+ }
1085
+ ),
1086
+ /* @__PURE__ */ jsxs("article", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-16 sm:py-20", children: [
1087
+ /* @__PURE__ */ jsxs(
1088
+ "a",
1089
+ {
1090
+ href: caseStudiesListUrl,
1091
+ className: "inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground mb-8 transition-colors",
1092
+ children: [
1093
+ "\u2190 ",
1094
+ backLabel
1095
+ ]
1096
+ }
1097
+ ),
1098
+ post.category && /* @__PURE__ */ 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 }),
1099
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground mb-4", children: post.title }),
1100
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-sm text-muted-foreground mb-8", children: [
1101
+ post.author && /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: post.author }),
1102
+ post.author && formattedDate && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
1103
+ formattedDate && /* @__PURE__ */ jsx("span", { children: formattedDate }),
1104
+ post.readingTime && /* @__PURE__ */ jsxs(Fragment, { children: [
1105
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
1106
+ /* @__PURE__ */ jsxs("span", { children: [
1107
+ post.readingTime,
1108
+ " min read"
1109
+ ] })
1110
+ ] })
1111
+ ] }),
1112
+ post.thumbnail && /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] rounded-xl overflow-hidden mb-10", children: /* @__PURE__ */ jsx(
1113
+ "img",
1114
+ {
1115
+ src: post.thumbnail,
1116
+ alt: post.title,
1117
+ className: "w-full h-full object-cover"
1118
+ }
1119
+ ) }),
1120
+ /* @__PURE__ */ jsx("div", { className: "prose prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsx(ContentRenderer, { content: post.content, format: post.contentFormat }) })
1121
+ ] })
1122
+ ] });
1123
+ }
1124
+ var CHANGELOG_TAG = "changelog";
1125
+ var CHANGELOG_LIST_QUERY = `
1126
+ query ChangelogList($productId: String!, $limit: Int, $offset: Int) {
1127
+ publicContentPages(productId: $productId, limit: $limit, offset: $offset) {
1128
+ items {
1129
+ id
1130
+ title
1131
+ slug
1132
+ lastUpdated
1133
+ tags
1134
+ excerpt
1135
+ seoDescription
1136
+ thumbnail
1137
+ author
1138
+ publishedAt
1139
+ readingTime
1140
+ featured
1141
+ category
1142
+ }
1143
+ total
1144
+ hasMore
1145
+ }
1146
+ }
1147
+ `;
1148
+ var CHANGELOG_ENTRY_QUERY = `
1149
+ query ChangelogEntry($slug: String!, $productId: String) {
1150
+ publicContentPage(slug: $slug, productId: $productId) {
1151
+ content
1152
+ contentFormat
1153
+ }
1154
+ }
1155
+ `;
1156
+ function formatDate(value) {
1157
+ if (!value) return "";
1158
+ return new Date(value).toLocaleDateString("en-US", {
1159
+ year: "numeric",
1160
+ month: "long",
1161
+ day: "numeric"
1162
+ });
1163
+ }
1164
+ function sortByDateDesc(a, b) {
1165
+ const da = new Date(a.publishedAt || a.lastUpdated || 0).getTime();
1166
+ const db = new Date(b.publishedAt || b.lastUpdated || 0).getTime();
1167
+ return db - da;
1168
+ }
1169
+ function ChangelogPage(props) {
1170
+ const {
1171
+ productName,
1172
+ heroEyebrow = "What's new",
1173
+ heroTitle = "Changelog",
1174
+ heroSubtitle = "Platform updates, improvements, and announcements \u2014 newest first.",
1175
+ ctaTitle,
1176
+ ctaSubtitle,
1177
+ ctaHref,
1178
+ ctaLabel,
1179
+ className = "",
1180
+ seoTitle,
1181
+ seoDescription,
1182
+ seoKeywords
1183
+ } = props;
1184
+ const client = useWebSDK();
1185
+ const config = useWebSDKConfig();
1186
+ const { product } = useProduct();
1187
+ const resolvedProductId = product?.id || config.productId;
1188
+ const [entries, setEntries] = useState([]);
1189
+ const [loading, setLoading] = useState(true);
1190
+ const [error, setError] = useState(null);
1191
+ const fetchEntries = useCallback(async () => {
1192
+ if (!resolvedProductId) return;
1193
+ setLoading(true);
1194
+ try {
1195
+ const listResult = await client.query(CHANGELOG_LIST_QUERY, {
1196
+ productId: resolvedProductId,
1197
+ limit: 50,
1198
+ offset: 0
1199
+ });
1200
+ if (listResult.errors?.length) {
1201
+ setError(listResult.errors[0]?.message ?? "Failed to load changelog");
1202
+ return;
1203
+ }
1204
+ const changelogItems = (listResult.data?.publicContentPages?.items || []).filter((p) => p.tags?.includes(CHANGELOG_TAG)).sort(sortByDateDesc);
1205
+ const resolved = await Promise.all(
1206
+ changelogItems.map(async (item) => {
1207
+ try {
1208
+ const detail = await client.query(CHANGELOG_ENTRY_QUERY, {
1209
+ slug: item.slug,
1210
+ productId: resolvedProductId
1211
+ });
1212
+ const page = detail.data?.publicContentPage;
1213
+ return {
1214
+ ...item,
1215
+ content: page?.content,
1216
+ contentFormat: page?.contentFormat
1217
+ };
1218
+ } catch {
1219
+ return { ...item };
1220
+ }
1221
+ })
1222
+ );
1223
+ setEntries(resolved);
1224
+ setError(null);
1225
+ } catch {
1226
+ setError("Failed to load changelog");
1227
+ } finally {
1228
+ setLoading(false);
1229
+ }
1230
+ }, [client, resolvedProductId]);
1231
+ useEffect(() => {
1232
+ fetchEntries();
1233
+ }, [fetchEntries]);
1234
+ const showCta = Boolean(ctaHref && ctaLabel);
1235
+ return /* @__PURE__ */ jsxs("div", { className: `w-full ${className}`, children: [
1236
+ seoTitle && /* @__PURE__ */ jsx(
1237
+ PageHead,
1238
+ {
1239
+ title: seoTitle,
1240
+ description: seoDescription || heroSubtitle,
1241
+ productName,
1242
+ keywords: seoKeywords
1243
+ }
1244
+ ),
1245
+ /* @__PURE__ */ jsx("section", { className: "py-16 md:py-20 px-4 sm:px-6 lg:px-8 text-center", children: /* @__PURE__ */ jsxs("div", { className: "max-w-3xl mx-auto", children: [
1246
+ /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary/10 border border-primary/20 text-xs font-medium text-primary mb-6", children: [
1247
+ /* @__PURE__ */ jsx(
1248
+ "svg",
1249
+ {
1250
+ className: "h-3.5 w-3.5",
1251
+ fill: "none",
1252
+ viewBox: "0 0 24 24",
1253
+ stroke: "currentColor",
1254
+ children: /* @__PURE__ */ jsx(
1255
+ "path",
1256
+ {
1257
+ strokeLinecap: "round",
1258
+ strokeLinejoin: "round",
1259
+ strokeWidth: 2,
1260
+ d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
1261
+ }
1262
+ )
1263
+ }
1264
+ ),
1265
+ heroEyebrow
1266
+ ] }),
1267
+ /* @__PURE__ */ jsx("h1", { className: "text-4xl sm:text-5xl font-bold text-foreground mb-4", children: heroTitle }),
1268
+ /* @__PURE__ */ jsx("p", { className: "text-lg text-muted-foreground", children: heroSubtitle })
1269
+ ] }) }),
1270
+ /* @__PURE__ */ jsx("section", { className: "px-4 sm:px-6 lg:px-8 pb-20", children: /* @__PURE__ */ jsx("div", { className: "max-w-3xl mx-auto space-y-12", children: loading ? [1, 2, 3].map((i) => /* @__PURE__ */ jsx(
1271
+ "div",
1272
+ {
1273
+ className: "rounded-2xl border border-border/40 bg-card overflow-hidden animate-pulse",
1274
+ children: /* @__PURE__ */ jsxs("div", { className: "p-6 sm:p-8 space-y-4", children: [
1275
+ /* @__PURE__ */ jsx("div", { className: "h-3 bg-muted rounded w-1/3" }),
1276
+ /* @__PURE__ */ jsx("div", { className: "h-6 bg-muted rounded w-2/3" }),
1277
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded" }),
1278
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-5/6" })
1279
+ ] })
1280
+ },
1281
+ i
1282
+ )) : error ? /* @__PURE__ */ jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: error }) }) : entries.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No changelog entries yet. Check back soon!" }) }) : entries.map((entry) => /* @__PURE__ */ jsxs(
1283
+ "article",
1284
+ {
1285
+ id: entry.slug,
1286
+ className: "rounded-2xl border border-border/40 bg-card overflow-hidden scroll-mt-24",
1287
+ children: [
1288
+ entry.thumbnail && /* @__PURE__ */ jsx(
1289
+ "img",
1290
+ {
1291
+ src: entry.thumbnail,
1292
+ alt: "",
1293
+ width: 1024,
1294
+ height: 576,
1295
+ loading: "lazy",
1296
+ decoding: "async",
1297
+ className: "w-full aspect-video object-cover border-b border-border/40"
1298
+ }
1299
+ ),
1300
+ /* @__PURE__ */ jsxs("div", { className: "p-6 sm:p-8", children: [
1301
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground mb-2", children: [
1302
+ entry.publishedAt && /* @__PURE__ */ jsx("time", { dateTime: entry.publishedAt, children: formatDate(entry.publishedAt || entry.lastUpdated) }),
1303
+ entry.author && /* @__PURE__ */ jsxs(Fragment, { children: [
1304
+ " \xB7 ",
1305
+ entry.author
1306
+ ] })
1307
+ ] }),
1308
+ /* @__PURE__ */ jsx("h2", { className: "text-xl sm:text-2xl font-bold text-foreground mb-4", children: entry.title }),
1309
+ entry.content ? /* @__PURE__ */ jsx("div", { className: "prose prose-sm prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsx(
1310
+ ContentRenderer,
1311
+ {
1312
+ content: entry.content,
1313
+ format: entry.contentFormat
1314
+ }
1315
+ ) }) : entry.excerpt && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: entry.excerpt })
1316
+ ] })
1317
+ ]
1318
+ },
1319
+ entry.id
1320
+ )) }) }),
1321
+ showCta && /* @__PURE__ */ jsx("section", { className: "py-14 px-4 sm:px-6 lg:px-8 bg-primary/5 border-t border-border/40", children: /* @__PURE__ */ jsxs("div", { className: "max-w-2xl mx-auto text-center", children: [
1322
+ ctaTitle && /* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-foreground mb-3", children: ctaTitle }),
1323
+ ctaSubtitle && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-7", children: ctaSubtitle }),
1324
+ /* @__PURE__ */ jsx(
1325
+ "a",
1326
+ {
1327
+ href: ctaHref,
1328
+ className: "inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:opacity-90 transition-opacity",
1329
+ children: ctaLabel
1330
+ }
1331
+ )
1332
+ ] }) })
1333
+ ] });
1334
+ }
775
1335
 
776
1336
  // src/content/utils.ts
777
1337
  function formatBytes(bytes) {
@@ -1572,6 +2132,6 @@ function ContractsPage(props) {
1572
2132
  ] });
1573
2133
  }
1574
2134
 
1575
- export { BlogListPage, BlogPostPage, ContentRenderer, ContractsPage, PressKitPage, useContentPage, useContentPages };
2135
+ export { BlogListPage, BlogPostPage, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ContentRenderer, ContractsPage, PressKitPage, useContentPage, useContentPages };
1576
2136
  //# sourceMappingURL=index.mjs.map
1577
2137
  //# sourceMappingURL=index.mjs.map