@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.
package/dist/index.mjs CHANGED
@@ -4289,6 +4289,566 @@ function BlogPostPage(props) {
4289
4289
  ] })
4290
4290
  ] });
4291
4291
  }
4292
+ var CASE_STUDY_TAG = "case-study";
4293
+ var CASE_STUDIES_QUERY = `
4294
+ query CaseStudies($productId: String!, $limit: Int, $offset: Int) {
4295
+ publicContentPages(productId: $productId, limit: $limit, offset: $offset) {
4296
+ items {
4297
+ id
4298
+ title
4299
+ slug
4300
+ lastUpdated
4301
+ tags
4302
+ seoDescription
4303
+ excerpt
4304
+ thumbnail
4305
+ author
4306
+ publishedAt
4307
+ readingTime
4308
+ featured
4309
+ category
4310
+ }
4311
+ total
4312
+ hasMore
4313
+ }
4314
+ }
4315
+ `;
4316
+ var CASE_STUDY_QUERY = `
4317
+ query CaseStudy($slug: String!, $productId: String) {
4318
+ publicContentPage(slug: $slug, productId: $productId) {
4319
+ id
4320
+ title
4321
+ slug
4322
+ content
4323
+ contentFormat
4324
+ seoTitle
4325
+ seoDescription
4326
+ seoKeywords
4327
+ lastUpdated
4328
+ tags
4329
+ excerpt
4330
+ thumbnail
4331
+ author
4332
+ publishedAt
4333
+ readingTime
4334
+ featured
4335
+ category
4336
+ }
4337
+ }
4338
+ `;
4339
+ function CaseStudyCard({
4340
+ post,
4341
+ basePath = "/case-studies"
4342
+ }) {
4343
+ const date = post.publishedAt || post.lastUpdated;
4344
+ const formattedDate = date ? new Date(date).toLocaleDateString("en-US", {
4345
+ year: "numeric",
4346
+ month: "long",
4347
+ day: "numeric"
4348
+ }) : "";
4349
+ const [imgError, setImgError] = useState(false);
4350
+ return /* @__PURE__ */ jsxs(
4351
+ "a",
4352
+ {
4353
+ href: `${basePath}/${post.slug}`,
4354
+ className: "group block bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300",
4355
+ children: [
4356
+ post.thumbnail && !imgError ? /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] overflow-hidden", children: /* @__PURE__ */ jsx(
4357
+ "img",
4358
+ {
4359
+ src: post.thumbnail,
4360
+ alt: post.title,
4361
+ className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300",
4362
+ loading: "lazy",
4363
+ onError: () => setImgError(true)
4364
+ }
4365
+ ) }) : /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] bg-muted/50 flex items-center justify-center", children: /* @__PURE__ */ jsx(
4366
+ "svg",
4367
+ {
4368
+ className: "w-12 h-12 text-muted-foreground/20",
4369
+ fill: "none",
4370
+ viewBox: "0 0 24 24",
4371
+ stroke: "currentColor",
4372
+ children: /* @__PURE__ */ jsx(
4373
+ "path",
4374
+ {
4375
+ strokeLinecap: "round",
4376
+ strokeLinejoin: "round",
4377
+ strokeWidth: 1.5,
4378
+ 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"
4379
+ }
4380
+ )
4381
+ }
4382
+ ) }),
4383
+ /* @__PURE__ */ jsxs("div", { className: "p-5 sm:p-6", children: [
4384
+ 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 }),
4385
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2", children: post.title }),
4386
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mb-4 line-clamp-3", children: post.excerpt || post.seoDescription || "" }),
4387
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-xs text-muted-foreground", children: [
4388
+ post.author && /* @__PURE__ */ jsx("span", { className: "font-medium", children: post.author }),
4389
+ post.author && formattedDate && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
4390
+ formattedDate && /* @__PURE__ */ jsx("span", { children: formattedDate }),
4391
+ post.readingTime && /* @__PURE__ */ jsxs(Fragment, { children: [
4392
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
4393
+ /* @__PURE__ */ jsxs("span", { children: [
4394
+ post.readingTime,
4395
+ " min read"
4396
+ ] })
4397
+ ] })
4398
+ ] })
4399
+ ] })
4400
+ ]
4401
+ }
4402
+ );
4403
+ }
4404
+ function CaseStudiesListPage(props) {
4405
+ const {
4406
+ productName,
4407
+ heroTitle = "Case Studies",
4408
+ heroSubtitle = "Real-world stories of teams building with our platform",
4409
+ caseStudyBasePath = "/case-studies",
4410
+ className = "",
4411
+ seoTitle,
4412
+ seoDescription,
4413
+ seoKeywords
4414
+ } = props;
4415
+ const client = useWebSDK();
4416
+ const config = useWebSDKConfig();
4417
+ const { product } = useProduct();
4418
+ const resolvedProductId = product?.id || config.productId;
4419
+ const [posts, setPosts] = useState([]);
4420
+ const [total, setTotal] = useState(0);
4421
+ const [loading, setLoading] = useState(true);
4422
+ const [error, setError] = useState(null);
4423
+ const [offset, setOffset] = useState(0);
4424
+ const limit = 12;
4425
+ const fetchPosts = useCallback(async () => {
4426
+ if (!resolvedProductId) return;
4427
+ setLoading(true);
4428
+ try {
4429
+ const result = await client.query(CASE_STUDIES_QUERY, {
4430
+ productId: resolvedProductId,
4431
+ limit,
4432
+ offset
4433
+ });
4434
+ if (result.errors?.length) {
4435
+ setError(result.errors[0]?.message ?? "Failed to load case studies");
4436
+ return;
4437
+ }
4438
+ const caseStudies = (result.data?.publicContentPages?.items || []).filter(
4439
+ (p) => p.tags?.includes(CASE_STUDY_TAG)
4440
+ );
4441
+ setPosts(caseStudies);
4442
+ setTotal(result.data?.publicContentPages?.total || 0);
4443
+ setError(null);
4444
+ } catch {
4445
+ setError("Failed to load case studies");
4446
+ } finally {
4447
+ setLoading(false);
4448
+ }
4449
+ }, [client, resolvedProductId, offset]);
4450
+ useEffect(() => {
4451
+ fetchPosts();
4452
+ }, [fetchPosts]);
4453
+ const featuredPosts = posts.filter((p) => p.featured);
4454
+ const regularPosts = posts.filter((p) => !p.featured);
4455
+ return /* @__PURE__ */ jsxs("div", { className: `w-full ${className}`, children: [
4456
+ seoTitle && /* @__PURE__ */ jsx(
4457
+ PageHead,
4458
+ {
4459
+ title: seoTitle,
4460
+ description: seoDescription || heroSubtitle,
4461
+ productName,
4462
+ keywords: seoKeywords
4463
+ }
4464
+ ),
4465
+ /* @__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: [
4466
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground", children: heroTitle }),
4467
+ /* @__PURE__ */ jsx("p", { className: "mt-4 text-lg text-muted-foreground", children: heroSubtitle })
4468
+ ] }) }) }),
4469
+ /* @__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(
4470
+ "div",
4471
+ {
4472
+ className: "bg-card border rounded-xl overflow-hidden animate-pulse",
4473
+ children: [
4474
+ /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] bg-muted" }),
4475
+ /* @__PURE__ */ jsxs("div", { className: "p-6 space-y-3", children: [
4476
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-1/4" }),
4477
+ /* @__PURE__ */ jsx("div", { className: "h-6 bg-muted rounded w-3/4" }),
4478
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded" }),
4479
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-1/2" })
4480
+ ] })
4481
+ ]
4482
+ },
4483
+ i
4484
+ )) }) : 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: [
4485
+ 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(
4486
+ CaseStudyCard,
4487
+ {
4488
+ post,
4489
+ basePath: caseStudyBasePath
4490
+ },
4491
+ post.id
4492
+ )) }),
4493
+ /* @__PURE__ */ jsx("div", { className: "grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8", children: regularPosts.map((post) => /* @__PURE__ */ jsx(
4494
+ CaseStudyCard,
4495
+ {
4496
+ post,
4497
+ basePath: caseStudyBasePath
4498
+ },
4499
+ post.id
4500
+ )) }),
4501
+ total > limit && /* @__PURE__ */ jsxs("div", { className: "flex justify-center gap-4 mt-12", children: [
4502
+ /* @__PURE__ */ jsx(
4503
+ "button",
4504
+ {
4505
+ onClick: () => setOffset(Math.max(0, offset - limit)),
4506
+ disabled: offset === 0,
4507
+ className: "px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors",
4508
+ children: "Previous"
4509
+ }
4510
+ ),
4511
+ /* @__PURE__ */ jsx(
4512
+ "button",
4513
+ {
4514
+ onClick: () => setOffset(offset + limit),
4515
+ disabled: offset + limit >= total,
4516
+ className: "px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors",
4517
+ children: "Next"
4518
+ }
4519
+ )
4520
+ ] })
4521
+ ] }) }) })
4522
+ ] });
4523
+ }
4524
+ function CaseStudyPage(props) {
4525
+ const {
4526
+ productName,
4527
+ caseStudiesListUrl = "/case-studies",
4528
+ backLabel = "Back to Case Studies",
4529
+ className = ""
4530
+ } = props;
4531
+ const client = useWebSDK();
4532
+ const config = useWebSDKConfig();
4533
+ const { product } = useProduct();
4534
+ const resolvedProductId = product?.id || config.productId;
4535
+ const [post, setPost] = useState(null);
4536
+ const [loading, setLoading] = useState(true);
4537
+ const [error, setError] = useState(null);
4538
+ const slug = typeof window !== "undefined" ? window.location.pathname.split("/").pop() || "" : "";
4539
+ useEffect(() => {
4540
+ if (!slug || !resolvedProductId) return;
4541
+ async function fetchPost() {
4542
+ setLoading(true);
4543
+ try {
4544
+ const result = await client.query(CASE_STUDY_QUERY, {
4545
+ slug,
4546
+ productId: resolvedProductId
4547
+ });
4548
+ if (result.errors?.length) {
4549
+ setError(result.errors[0]?.message ?? "Failed to load case study");
4550
+ return;
4551
+ }
4552
+ setPost(result.data?.publicContentPage ?? null);
4553
+ setError(null);
4554
+ } catch {
4555
+ setError("Failed to load case study");
4556
+ } finally {
4557
+ setLoading(false);
4558
+ }
4559
+ }
4560
+ fetchPost();
4561
+ }, [client, slug, resolvedProductId]);
4562
+ if (loading) {
4563
+ 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: [
4564
+ /* @__PURE__ */ jsx("div", { className: "h-8 bg-muted rounded w-2/3" }),
4565
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-1/3" }),
4566
+ /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] bg-muted rounded-xl" }),
4567
+ /* @__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)) })
4568
+ ] }) }) });
4569
+ }
4570
+ if (error || !post) {
4571
+ 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: [
4572
+ /* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold mb-4", children: "Case study not found" }),
4573
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-6", children: error || "This case study doesn't exist or has been removed." }),
4574
+ /* @__PURE__ */ jsxs(
4575
+ "a",
4576
+ {
4577
+ href: caseStudiesListUrl,
4578
+ className: "text-primary hover:underline font-medium",
4579
+ children: [
4580
+ "\u2190 ",
4581
+ backLabel
4582
+ ]
4583
+ }
4584
+ )
4585
+ ] }) });
4586
+ }
4587
+ const date = post.publishedAt || post.lastUpdated;
4588
+ const formattedDate = date ? new Date(date).toLocaleDateString("en-US", {
4589
+ year: "numeric",
4590
+ month: "long",
4591
+ day: "numeric"
4592
+ }) : "";
4593
+ return /* @__PURE__ */ jsxs("div", { className: `w-full ${className}`, children: [
4594
+ /* @__PURE__ */ jsx(
4595
+ PageHead,
4596
+ {
4597
+ title: post.seoTitle || post.title,
4598
+ description: post.seoDescription || post.excerpt || "",
4599
+ productName,
4600
+ keywords: post.seoKeywords || ""
4601
+ }
4602
+ ),
4603
+ /* @__PURE__ */ jsxs("article", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-16 sm:py-20", children: [
4604
+ /* @__PURE__ */ jsxs(
4605
+ "a",
4606
+ {
4607
+ href: caseStudiesListUrl,
4608
+ className: "inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground mb-8 transition-colors",
4609
+ children: [
4610
+ "\u2190 ",
4611
+ backLabel
4612
+ ]
4613
+ }
4614
+ ),
4615
+ 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 }),
4616
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground mb-4", children: post.title }),
4617
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 text-sm text-muted-foreground mb-8", children: [
4618
+ post.author && /* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: post.author }),
4619
+ post.author && formattedDate && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
4620
+ formattedDate && /* @__PURE__ */ jsx("span", { children: formattedDate }),
4621
+ post.readingTime && /* @__PURE__ */ jsxs(Fragment, { children: [
4622
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground/40", children: "\xB7" }),
4623
+ /* @__PURE__ */ jsxs("span", { children: [
4624
+ post.readingTime,
4625
+ " min read"
4626
+ ] })
4627
+ ] })
4628
+ ] }),
4629
+ post.thumbnail && /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] rounded-xl overflow-hidden mb-10", children: /* @__PURE__ */ jsx(
4630
+ "img",
4631
+ {
4632
+ src: post.thumbnail,
4633
+ alt: post.title,
4634
+ className: "w-full h-full object-cover"
4635
+ }
4636
+ ) }),
4637
+ /* @__PURE__ */ jsx("div", { className: "prose prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsx(ContentRenderer, { content: post.content, format: post.contentFormat }) })
4638
+ ] })
4639
+ ] });
4640
+ }
4641
+ var CHANGELOG_TAG = "changelog";
4642
+ var CHANGELOG_LIST_QUERY = `
4643
+ query ChangelogList($productId: String!, $limit: Int, $offset: Int) {
4644
+ publicContentPages(productId: $productId, limit: $limit, offset: $offset) {
4645
+ items {
4646
+ id
4647
+ title
4648
+ slug
4649
+ lastUpdated
4650
+ tags
4651
+ excerpt
4652
+ seoDescription
4653
+ thumbnail
4654
+ author
4655
+ publishedAt
4656
+ readingTime
4657
+ featured
4658
+ category
4659
+ }
4660
+ total
4661
+ hasMore
4662
+ }
4663
+ }
4664
+ `;
4665
+ var CHANGELOG_ENTRY_QUERY = `
4666
+ query ChangelogEntry($slug: String!, $productId: String) {
4667
+ publicContentPage(slug: $slug, productId: $productId) {
4668
+ content
4669
+ contentFormat
4670
+ }
4671
+ }
4672
+ `;
4673
+ function formatDate(value) {
4674
+ if (!value) return "";
4675
+ return new Date(value).toLocaleDateString("en-US", {
4676
+ year: "numeric",
4677
+ month: "long",
4678
+ day: "numeric"
4679
+ });
4680
+ }
4681
+ function sortByDateDesc(a, b) {
4682
+ const da = new Date(a.publishedAt || a.lastUpdated || 0).getTime();
4683
+ const db = new Date(b.publishedAt || b.lastUpdated || 0).getTime();
4684
+ return db - da;
4685
+ }
4686
+ function ChangelogPage(props) {
4687
+ const {
4688
+ productName,
4689
+ heroEyebrow = "What's new",
4690
+ heroTitle = "Changelog",
4691
+ heroSubtitle = "Platform updates, improvements, and announcements \u2014 newest first.",
4692
+ ctaTitle,
4693
+ ctaSubtitle,
4694
+ ctaHref,
4695
+ ctaLabel,
4696
+ className = "",
4697
+ seoTitle,
4698
+ seoDescription,
4699
+ seoKeywords
4700
+ } = props;
4701
+ const client = useWebSDK();
4702
+ const config = useWebSDKConfig();
4703
+ const { product } = useProduct();
4704
+ const resolvedProductId = product?.id || config.productId;
4705
+ const [entries, setEntries] = useState([]);
4706
+ const [loading, setLoading] = useState(true);
4707
+ const [error, setError] = useState(null);
4708
+ const fetchEntries = useCallback(async () => {
4709
+ if (!resolvedProductId) return;
4710
+ setLoading(true);
4711
+ try {
4712
+ const listResult = await client.query(CHANGELOG_LIST_QUERY, {
4713
+ productId: resolvedProductId,
4714
+ limit: 50,
4715
+ offset: 0
4716
+ });
4717
+ if (listResult.errors?.length) {
4718
+ setError(listResult.errors[0]?.message ?? "Failed to load changelog");
4719
+ return;
4720
+ }
4721
+ const changelogItems = (listResult.data?.publicContentPages?.items || []).filter((p) => p.tags?.includes(CHANGELOG_TAG)).sort(sortByDateDesc);
4722
+ const resolved = await Promise.all(
4723
+ changelogItems.map(async (item) => {
4724
+ try {
4725
+ const detail = await client.query(CHANGELOG_ENTRY_QUERY, {
4726
+ slug: item.slug,
4727
+ productId: resolvedProductId
4728
+ });
4729
+ const page = detail.data?.publicContentPage;
4730
+ return {
4731
+ ...item,
4732
+ content: page?.content,
4733
+ contentFormat: page?.contentFormat
4734
+ };
4735
+ } catch {
4736
+ return { ...item };
4737
+ }
4738
+ })
4739
+ );
4740
+ setEntries(resolved);
4741
+ setError(null);
4742
+ } catch {
4743
+ setError("Failed to load changelog");
4744
+ } finally {
4745
+ setLoading(false);
4746
+ }
4747
+ }, [client, resolvedProductId]);
4748
+ useEffect(() => {
4749
+ fetchEntries();
4750
+ }, [fetchEntries]);
4751
+ const showCta = Boolean(ctaHref && ctaLabel);
4752
+ return /* @__PURE__ */ jsxs("div", { className: `w-full ${className}`, children: [
4753
+ seoTitle && /* @__PURE__ */ jsx(
4754
+ PageHead,
4755
+ {
4756
+ title: seoTitle,
4757
+ description: seoDescription || heroSubtitle,
4758
+ productName,
4759
+ keywords: seoKeywords
4760
+ }
4761
+ ),
4762
+ /* @__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: [
4763
+ /* @__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: [
4764
+ /* @__PURE__ */ jsx(
4765
+ "svg",
4766
+ {
4767
+ className: "h-3.5 w-3.5",
4768
+ fill: "none",
4769
+ viewBox: "0 0 24 24",
4770
+ stroke: "currentColor",
4771
+ children: /* @__PURE__ */ jsx(
4772
+ "path",
4773
+ {
4774
+ strokeLinecap: "round",
4775
+ strokeLinejoin: "round",
4776
+ strokeWidth: 2,
4777
+ d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
4778
+ }
4779
+ )
4780
+ }
4781
+ ),
4782
+ heroEyebrow
4783
+ ] }),
4784
+ /* @__PURE__ */ jsx("h1", { className: "text-4xl sm:text-5xl font-bold text-foreground mb-4", children: heroTitle }),
4785
+ /* @__PURE__ */ jsx("p", { className: "text-lg text-muted-foreground", children: heroSubtitle })
4786
+ ] }) }),
4787
+ /* @__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(
4788
+ "div",
4789
+ {
4790
+ className: "rounded-2xl border border-border/40 bg-card overflow-hidden animate-pulse",
4791
+ children: /* @__PURE__ */ jsxs("div", { className: "p-6 sm:p-8 space-y-4", children: [
4792
+ /* @__PURE__ */ jsx("div", { className: "h-3 bg-muted rounded w-1/3" }),
4793
+ /* @__PURE__ */ jsx("div", { className: "h-6 bg-muted rounded w-2/3" }),
4794
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded" }),
4795
+ /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-5/6" })
4796
+ ] })
4797
+ },
4798
+ i
4799
+ )) : 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(
4800
+ "article",
4801
+ {
4802
+ id: entry.slug,
4803
+ className: "rounded-2xl border border-border/40 bg-card overflow-hidden scroll-mt-24",
4804
+ children: [
4805
+ entry.thumbnail && /* @__PURE__ */ jsx(
4806
+ "img",
4807
+ {
4808
+ src: entry.thumbnail,
4809
+ alt: "",
4810
+ width: 1024,
4811
+ height: 576,
4812
+ loading: "lazy",
4813
+ decoding: "async",
4814
+ className: "w-full aspect-video object-cover border-b border-border/40"
4815
+ }
4816
+ ),
4817
+ /* @__PURE__ */ jsxs("div", { className: "p-6 sm:p-8", children: [
4818
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground mb-2", children: [
4819
+ entry.publishedAt && /* @__PURE__ */ jsx("time", { dateTime: entry.publishedAt, children: formatDate(entry.publishedAt || entry.lastUpdated) }),
4820
+ entry.author && /* @__PURE__ */ jsxs(Fragment, { children: [
4821
+ " \xB7 ",
4822
+ entry.author
4823
+ ] })
4824
+ ] }),
4825
+ /* @__PURE__ */ jsx("h2", { className: "text-xl sm:text-2xl font-bold text-foreground mb-4", children: entry.title }),
4826
+ entry.content ? /* @__PURE__ */ jsx("div", { className: "prose prose-sm prose-gray dark:prose-invert max-w-none", children: /* @__PURE__ */ jsx(
4827
+ ContentRenderer,
4828
+ {
4829
+ content: entry.content,
4830
+ format: entry.contentFormat
4831
+ }
4832
+ ) }) : entry.excerpt && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: entry.excerpt })
4833
+ ] })
4834
+ ]
4835
+ },
4836
+ entry.id
4837
+ )) }) }),
4838
+ 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: [
4839
+ ctaTitle && /* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-foreground mb-3", children: ctaTitle }),
4840
+ ctaSubtitle && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-7", children: ctaSubtitle }),
4841
+ /* @__PURE__ */ jsx(
4842
+ "a",
4843
+ {
4844
+ href: ctaHref,
4845
+ 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",
4846
+ children: ctaLabel
4847
+ }
4848
+ )
4849
+ ] }) })
4850
+ ] });
4851
+ }
4292
4852
 
4293
4853
  // src/content/utils.ts
4294
4854
  function formatBytes(bytes) {
@@ -5089,6 +5649,6 @@ function ContractsPage(props) {
5089
5649
  ] });
5090
5650
  }
5091
5651
 
5092
- export { BlogListPage, BlogPostPage, Button, CareersApplyForm, ContactPage, ContentRenderer, ContractsPage, DEFAULT_CONTACT_CATEGORIES, Input, Label, NewsletterForm, NewsletterPage, PageHead, PartnersPage, PressKitPage, PricingPage, PricingSection, ProductProvider, ResourceLinks, RybbitAnalytics, Select, SocialLinks, Textarea, UnsubscribePage, WaitlistForm, WaitlistPage, WebSDKClient, WebSDKProvider, buttonVariants, cn, useContentPage, useContentPages, useProduct, useProductConfig, useWebSDK, useWebSDKConfig };
5652
+ export { BlogListPage, BlogPostPage, Button, CareersApplyForm, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ContactPage, ContentRenderer, ContractsPage, DEFAULT_CONTACT_CATEGORIES, Input, Label, NewsletterForm, NewsletterPage, PageHead, PartnersPage, PressKitPage, PricingPage, PricingSection, ProductProvider, ResourceLinks, RybbitAnalytics, Select, SocialLinks, Textarea, UnsubscribePage, WaitlistForm, WaitlistPage, WebSDKClient, WebSDKProvider, buttonVariants, cn, useContentPage, useContentPages, useProduct, useProductConfig, useWebSDK, useWebSDKConfig };
5093
5653
  //# sourceMappingURL=index.mjs.map
5094
5654
  //# sourceMappingURL=index.mjs.map