@fullstackdatasolutions/articles 0.2.1 → 0.3.0

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.js CHANGED
@@ -58,37 +58,26 @@ function ArticleCategoryGrid({ categories, pageSize = 8 }) {
58
58
  /* @__PURE__ */ jsx("h2", { className: "text-3xl font-bold text-foreground mb-4", children: "Browse by Category" }),
59
59
  /* @__PURE__ */ jsx("p", { className: "text-lg text-muted-foreground", children: "Explore our articles by topic to find the insights most relevant to your interests." })
60
60
  ] }),
61
- /* @__PURE__ */ jsx(
62
- "div",
63
- {
64
- className: "sm:grid-cols-4",
65
- style: {
66
- display: "grid",
67
- gridTemplateColumns: "repeat(1, minmax(0, 1fr))",
68
- gap: "1.5rem"
69
- },
70
- children: visible.map((cat) => /* @__PURE__ */ jsx(Link, { href: `/articles/category/${cat.slug}`, children: /* @__PURE__ */ jsxs("div", { className: "group overflow-hidden rounded-xl border border-border shadow-sm hover:shadow-lg transition-all duration-300 cursor-pointer bg-card", children: [
71
- /* @__PURE__ */ jsx("div", { className: "overflow-hidden", style: { position: "relative", height: "13rem" }, children: /* @__PURE__ */ jsx(
72
- Image,
73
- {
74
- src: cat.featuredImage,
75
- alt: cat.name,
76
- fill: true,
77
- sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
78
- className: "object-cover group-hover:scale-105 transition-transform duration-300"
79
- }
80
- ) }),
81
- /* @__PURE__ */ jsxs("div", { className: "p-4 text-center", children: [
82
- /* @__PURE__ */ jsx("h3", { className: "font-semibold text-foreground text-base", children: cat.name }),
83
- /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground mt-1", children: [
84
- cat.count,
85
- " ",
86
- cat.count === 1 ? "article" : "articles"
87
- ] })
88
- ] })
89
- ] }) }, cat.slug))
90
- }
91
- ),
61
+ /* @__PURE__ */ jsx("div", { className: "grid md:grid-cols-2 lg:grid-cols-3 gap-6", children: visible.map((cat) => /* @__PURE__ */ jsx(Link, { href: `/articles/category/${cat.slug}`, children: /* @__PURE__ */ jsxs("div", { className: "group overflow-hidden rounded-xl border border-border shadow-sm hover:shadow-lg transition-all duration-300 cursor-pointer bg-card", children: [
62
+ /* @__PURE__ */ jsx("div", { className: "overflow-hidden", style: { position: "relative", height: "13rem" }, children: /* @__PURE__ */ jsx(
63
+ Image,
64
+ {
65
+ src: cat.featuredImage,
66
+ alt: cat.name,
67
+ fill: true,
68
+ sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
69
+ className: "object-cover group-hover:scale-105 transition-transform duration-300"
70
+ }
71
+ ) }),
72
+ /* @__PURE__ */ jsxs("div", { className: "p-4 text-center", children: [
73
+ /* @__PURE__ */ jsx("h3", { className: "font-semibold text-foreground text-base", children: cat.name }),
74
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground mt-1", children: [
75
+ cat.count,
76
+ " ",
77
+ cat.count === 1 ? "article" : "articles"
78
+ ] })
79
+ ] })
80
+ ] }) }, cat.slug)) }),
92
81
  hasMore && /* @__PURE__ */ jsx("div", { className: "mt-10 text-center", children: /* @__PURE__ */ jsx(
93
82
  "button",
94
83
  {
@@ -618,10 +607,110 @@ function ArticlesPage({ config }) {
618
607
  ] });
619
608
  }
620
609
 
621
- // src/CategoryArticlesPage.tsx
610
+ // src/ArticleDetailHero.tsx
622
611
  import Image4 from "next/image";
623
612
  import Link5 from "next/link";
613
+ import { Calendar as Calendar3, Clock as Clock3, User as User2 } from "lucide-react";
624
614
  import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
615
+ function toSlug(cat) {
616
+ return cat.toLowerCase().replaceAll(/\s+/g, "-").replaceAll(/[^a-z0-9-]/g, "");
617
+ }
618
+ function ArticleDetailHero({ article, categoryBasePath }) {
619
+ return /* @__PURE__ */ jsxs9(
620
+ "section",
621
+ {
622
+ style: {
623
+ position: "relative",
624
+ height: "18rem",
625
+ display: "flex",
626
+ alignItems: "center",
627
+ justifyContent: "center",
628
+ overflow: "hidden"
629
+ },
630
+ children: [
631
+ /* @__PURE__ */ jsx10(
632
+ Image4,
633
+ {
634
+ src: article.featuredImage,
635
+ alt: article.title,
636
+ fill: true,
637
+ sizes: "100vw",
638
+ className: "object-cover",
639
+ priority: true
640
+ }
641
+ ),
642
+ /* @__PURE__ */ jsx10(
643
+ "div",
644
+ {
645
+ style: {
646
+ position: "absolute",
647
+ inset: 0,
648
+ backgroundColor: "rgba(0,0,0,0.6)"
649
+ }
650
+ }
651
+ ),
652
+ /* @__PURE__ */ jsxs9(
653
+ "div",
654
+ {
655
+ style: {
656
+ position: "relative",
657
+ zIndex: 10,
658
+ textAlign: "center",
659
+ color: "white",
660
+ padding: "0 1rem",
661
+ maxWidth: "56rem",
662
+ margin: "0 auto",
663
+ width: "100%"
664
+ },
665
+ children: [
666
+ article.categories && article.categories.length > 0 && /* @__PURE__ */ jsx10("div", { style: { display: "flex", flexWrap: "wrap", justifyContent: "center", gap: "0.5rem", marginBottom: "1rem" }, children: article.categories.slice(0, 4).map(
667
+ (cat) => categoryBasePath ? /* @__PURE__ */ jsx10(
668
+ Link5,
669
+ {
670
+ href: `${categoryBasePath}/${toSlug(cat)}`,
671
+ className: "inline-block bg-white/20 text-white text-sm font-medium px-3 py-1 rounded-full hover:bg-white/30 transition-colors",
672
+ children: cat
673
+ },
674
+ cat
675
+ ) : /* @__PURE__ */ jsx10(
676
+ "span",
677
+ {
678
+ className: "inline-block bg-white/20 text-white text-sm font-medium px-3 py-1 rounded-full",
679
+ children: cat
680
+ },
681
+ cat
682
+ )
683
+ ) }),
684
+ /* @__PURE__ */ jsx10("h1", { className: "text-4xl md:text-5xl font-bold mb-4", children: article.title }),
685
+ /* @__PURE__ */ jsxs9("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", gap: "1.5rem", fontSize: "0.875rem", color: "rgba(255,255,255,0.8)" }, children: [
686
+ article.date && /* @__PURE__ */ jsxs9("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [
687
+ /* @__PURE__ */ jsx10(Calendar3, { className: "h-4 w-4" }),
688
+ /* @__PURE__ */ jsx10("span", { children: article.date })
689
+ ] }),
690
+ /* @__PURE__ */ jsxs9("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [
691
+ /* @__PURE__ */ jsx10(Clock3, { className: "h-4 w-4" }),
692
+ /* @__PURE__ */ jsx10("span", { children: article.readTime })
693
+ ] }),
694
+ /* @__PURE__ */ jsxs9("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [
695
+ /* @__PURE__ */ jsx10(User2, { className: "h-4 w-4" }),
696
+ /* @__PURE__ */ jsxs9("span", { children: [
697
+ "By ",
698
+ article.author
699
+ ] })
700
+ ] })
701
+ ] })
702
+ ]
703
+ }
704
+ )
705
+ ]
706
+ }
707
+ );
708
+ }
709
+
710
+ // src/CategoryArticlesPage.tsx
711
+ import Image5 from "next/image";
712
+ import Link6 from "next/link";
713
+ import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
625
714
  function getCategoryDescription(config, slug, categoryName) {
626
715
  var _a;
627
716
  const raw = (_a = config.categoryDescriptions) == null ? void 0 : _a[slug];
@@ -637,8 +726,8 @@ function CategoryArticlesPage({ category, articles, config }) {
637
726
  const description = getCategoryDescription(config, category, categoryName);
638
727
  const pageSize = (_a = config.pageSize) != null ? _a : DEFAULT_PAGE_SIZE;
639
728
  const siteUrl = config.siteUrl.replace(/\/$/, "");
640
- return /* @__PURE__ */ jsxs9("div", { children: [
641
- /* @__PURE__ */ jsx10(
729
+ return /* @__PURE__ */ jsxs10("div", { children: [
730
+ /* @__PURE__ */ jsx11(
642
731
  BreadcrumbSchema,
643
732
  {
644
733
  items: [
@@ -648,9 +737,9 @@ function CategoryArticlesPage({ category, articles, config }) {
648
737
  ]
649
738
  }
650
739
  ),
651
- /* @__PURE__ */ jsxs9("section", { className: "relative h-72 md:h-96 flex items-center justify-center overflow-hidden", children: [
652
- /* @__PURE__ */ jsx10(
653
- Image4,
740
+ /* @__PURE__ */ jsxs10("section", { className: "relative h-72 md:h-96 flex items-center justify-center overflow-hidden", children: [
741
+ /* @__PURE__ */ jsx11(
742
+ Image5,
654
743
  {
655
744
  src: heroImage,
656
745
  alt: categoryName,
@@ -660,24 +749,24 @@ function CategoryArticlesPage({ category, articles, config }) {
660
749
  priority: true
661
750
  }
662
751
  ),
663
- /* @__PURE__ */ jsx10("div", { className: "absolute inset-0 bg-black/60" }),
664
- /* @__PURE__ */ jsxs9("div", { className: "relative z-10 text-center text-white px-4", children: [
665
- /* @__PURE__ */ jsx10("p", { className: "text-sm font-semibold uppercase tracking-widest mb-3 opacity-80", children: "Category" }),
666
- /* @__PURE__ */ jsx10("h1", { className: "text-4xl md:text-5xl font-bold mb-3", children: categoryName }),
667
- description.long && /* @__PURE__ */ jsx10("p", { className: "text-lg opacity-90 max-w-2xl mx-auto mt-2", children: description.long }),
668
- /* @__PURE__ */ jsxs9("p", { className: "text-lg opacity-70 mt-2", children: [
752
+ /* @__PURE__ */ jsx11("div", { className: "absolute inset-0 bg-black/60" }),
753
+ /* @__PURE__ */ jsxs10("div", { className: "relative z-10 text-center text-white px-4", children: [
754
+ /* @__PURE__ */ jsx11("p", { className: "text-sm font-semibold uppercase tracking-widest mb-3 opacity-80", children: "Category" }),
755
+ /* @__PURE__ */ jsx11("h1", { className: "text-4xl md:text-5xl font-bold mb-3", children: categoryName }),
756
+ description.long && /* @__PURE__ */ jsx11("p", { className: "text-lg opacity-90 max-w-2xl mx-auto mt-2", children: description.long }),
757
+ /* @__PURE__ */ jsxs10("p", { className: "text-lg opacity-70 mt-2", children: [
669
758
  articles.length,
670
759
  " article",
671
760
  articles.length === 1 ? "" : "s"
672
761
  ] })
673
762
  ] })
674
763
  ] }),
675
- /* @__PURE__ */ jsx10("section", { className: "py-16 bg-muted/50 flex-1", children: /* @__PURE__ */ jsxs9("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
676
- /* @__PURE__ */ jsxs9("div", { className: "mb-8 flex items-center justify-between", children: [
677
- /* @__PURE__ */ jsx10(Link5, { href: "/articles", className: "text-sm text-primary hover:underline", children: "\u2190 All Articles" }),
678
- /* @__PURE__ */ jsx10("p", { className: "text-sm text-muted-foreground", children: description.short })
764
+ /* @__PURE__ */ jsx11("section", { className: "py-16 bg-muted/50 flex-1", children: /* @__PURE__ */ jsxs10("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
765
+ /* @__PURE__ */ jsxs10("div", { className: "mb-8 flex items-center justify-between", children: [
766
+ /* @__PURE__ */ jsx11(Link6, { href: "/articles", className: "text-sm text-primary hover:underline", children: "\u2190 All Articles" }),
767
+ /* @__PURE__ */ jsx11("p", { className: "text-sm text-muted-foreground", children: description.short })
679
768
  ] }),
680
- /* @__PURE__ */ jsx10(LatestArticles, { articles, pageSize })
769
+ /* @__PURE__ */ jsx11(LatestArticles, { articles, pageSize })
681
770
  ] }) })
682
771
  ] });
683
772
  }
@@ -688,7 +777,7 @@ import { useCallback as useCallback2, useEffect as useEffect4, useState as useSt
688
777
 
689
778
  // src/CommentForm.tsx
690
779
  import { useState as useState4 } from "react";
691
- import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
780
+ import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
692
781
  var MAX_LENGTH = 2e3;
693
782
  var WARN_THRESHOLD = 1800;
694
783
  function submitLabel(submitting, parentId) {
@@ -727,8 +816,8 @@ function CommentForm({ articleSlug, parentId, onSuccess, onCancel }) {
727
816
  }
728
817
  });
729
818
  }
730
- return /* @__PURE__ */ jsxs10("form", { onSubmit: handleSubmit, className: "space-y-2", children: [
731
- /* @__PURE__ */ jsx11(
819
+ return /* @__PURE__ */ jsxs11("form", { onSubmit: handleSubmit, className: "space-y-2", children: [
820
+ /* @__PURE__ */ jsx12(
732
821
  "textarea",
733
822
  {
734
823
  value: body,
@@ -741,13 +830,13 @@ function CommentForm({ articleSlug, parentId, onSuccess, onCancel }) {
741
830
  "aria-label": parentId ? "Reply text" : "Comment text"
742
831
  }
743
832
  ),
744
- remaining <= MAX_LENGTH - WARN_THRESHOLD && /* @__PURE__ */ jsxs10("p", { className: `text-xs ${remaining < 0 ? "text-destructive" : "text-muted-foreground"}`, children: [
833
+ remaining <= MAX_LENGTH - WARN_THRESHOLD && /* @__PURE__ */ jsxs11("p", { className: `text-xs ${remaining < 0 ? "text-destructive" : "text-muted-foreground"}`, children: [
745
834
  remaining,
746
835
  " characters remaining"
747
836
  ] }),
748
- error && /* @__PURE__ */ jsx11("p", { className: "text-xs text-destructive", children: error }),
749
- /* @__PURE__ */ jsxs10("div", { className: "flex gap-2", children: [
750
- /* @__PURE__ */ jsx11(
837
+ error && /* @__PURE__ */ jsx12("p", { className: "text-xs text-destructive", children: error }),
838
+ /* @__PURE__ */ jsxs11("div", { className: "flex gap-2", children: [
839
+ /* @__PURE__ */ jsx12(
751
840
  "button",
752
841
  {
753
842
  type: "submit",
@@ -756,7 +845,7 @@ function CommentForm({ articleSlug, parentId, onSuccess, onCancel }) {
756
845
  children: submitLabel(submitting, parentId)
757
846
  }
758
847
  ),
759
- onCancel && /* @__PURE__ */ jsx11(
848
+ onCancel && /* @__PURE__ */ jsx12(
760
849
  "button",
761
850
  {
762
851
  type: "button",
@@ -771,7 +860,7 @@ function CommentForm({ articleSlug, parentId, onSuccess, onCancel }) {
771
860
 
772
861
  // src/CommentItem.tsx
773
862
  import { useState as useState5 } from "react";
774
- import { Fragment, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
863
+ import { Fragment, jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
775
864
  function relativeTime(iso) {
776
865
  const diff = Date.now() - new Date(iso).getTime();
777
866
  const minutes = Math.floor(diff / 6e4);
@@ -809,15 +898,15 @@ function CommentItem({
809
898
  }
810
899
  });
811
900
  }
812
- return /* @__PURE__ */ jsxs11("div", { className: `${isReply ? "ml-8 border-l-2 border-border pl-4" : ""}`, children: [
813
- /* @__PURE__ */ jsx12("div", { className: "rounded-lg bg-muted/40 p-3 space-y-1", children: comment.isDeleted ? /* @__PURE__ */ jsx12("p", { className: "text-sm italic text-muted-foreground", children: "Comment removed" }) : /* @__PURE__ */ jsxs11(Fragment, { children: [
814
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center justify-between gap-2", children: [
815
- /* @__PURE__ */ jsx12("span", { className: "text-sm font-medium text-foreground", children: comment.authorName }),
816
- /* @__PURE__ */ jsx12("span", { className: "text-xs text-muted-foreground", children: relativeTime(comment.createdAt) })
901
+ return /* @__PURE__ */ jsxs12("div", { className: `${isReply ? "ml-8 border-l-2 border-border pl-4" : ""}`, children: [
902
+ /* @__PURE__ */ jsx13("div", { className: "rounded-lg bg-muted/40 p-3 space-y-1", children: comment.isDeleted ? /* @__PURE__ */ jsx13("p", { className: "text-sm italic text-muted-foreground", children: "Comment removed" }) : /* @__PURE__ */ jsxs12(Fragment, { children: [
903
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-center justify-between gap-2", children: [
904
+ /* @__PURE__ */ jsx13("span", { className: "text-sm font-medium text-foreground", children: comment.authorName }),
905
+ /* @__PURE__ */ jsx13("span", { className: "text-xs text-muted-foreground", children: relativeTime(comment.createdAt) })
817
906
  ] }),
818
- /* @__PURE__ */ jsx12("p", { className: "text-sm text-foreground whitespace-pre-wrap break-words", children: comment.body }),
819
- /* @__PURE__ */ jsxs11("div", { className: "flex gap-3 pt-1", children: [
820
- canReply && /* @__PURE__ */ jsx12(
907
+ /* @__PURE__ */ jsx13("p", { className: "text-sm text-foreground whitespace-pre-wrap break-words", children: comment.body }),
908
+ /* @__PURE__ */ jsxs12("div", { className: "flex gap-3 pt-1", children: [
909
+ canReply && /* @__PURE__ */ jsx13(
821
910
  "button",
822
911
  {
823
912
  onClick: () => setShowReplyForm((v) => !v),
@@ -825,7 +914,7 @@ function CommentItem({
825
914
  children: showReplyForm ? "Cancel" : "Reply"
826
915
  }
827
916
  ),
828
- canDelete && /* @__PURE__ */ jsx12(
917
+ canDelete && /* @__PURE__ */ jsx13(
829
918
  "button",
830
919
  {
831
920
  onClick: handleDelete,
@@ -836,7 +925,7 @@ function CommentItem({
836
925
  )
837
926
  ] })
838
927
  ] }) }),
839
- showReplyForm && /* @__PURE__ */ jsx12("div", { className: "mt-2 ml-2", children: /* @__PURE__ */ jsx12(
928
+ showReplyForm && /* @__PURE__ */ jsx13("div", { className: "mt-2 ml-2", children: /* @__PURE__ */ jsx13(
840
929
  CommentForm,
841
930
  {
842
931
  articleSlug,
@@ -848,7 +937,7 @@ function CommentItem({
848
937
  onCancel: () => setShowReplyForm(false)
849
938
  }
850
939
  ) }),
851
- replies.length > 0 && /* @__PURE__ */ jsx12("div", { className: "mt-2 space-y-2", children: replies.map((reply) => /* @__PURE__ */ jsx12(
940
+ replies.length > 0 && /* @__PURE__ */ jsx13("div", { className: "mt-2 space-y-2", children: replies.map((reply) => /* @__PURE__ */ jsx13(
852
941
  CommentItem,
853
942
  {
854
943
  comment: __spreadProps(__spreadValues({}, reply), { replies: [] }),
@@ -863,7 +952,7 @@ function CommentItem({
863
952
  }
864
953
 
865
954
  // src/CommentThread.tsx
866
- import { jsx as jsx13 } from "react/jsx-runtime";
955
+ import { jsx as jsx14 } from "react/jsx-runtime";
867
956
  function CommentThread({
868
957
  comments,
869
958
  articleSlug,
@@ -871,9 +960,9 @@ function CommentThread({
871
960
  onRefresh
872
961
  }) {
873
962
  if (comments.length === 0) {
874
- return /* @__PURE__ */ jsx13("p", { className: "text-sm text-muted-foreground text-center py-6", children: "No comments yet. Be the first to share your thoughts." });
963
+ return /* @__PURE__ */ jsx14("p", { className: "text-sm text-muted-foreground text-center py-6", children: "No comments yet. Be the first to share your thoughts." });
875
964
  }
876
- return /* @__PURE__ */ jsx13("div", { className: "space-y-4", children: comments.map((comment) => /* @__PURE__ */ jsx13(
965
+ return /* @__PURE__ */ jsx14("div", { className: "space-y-4", children: comments.map((comment) => /* @__PURE__ */ jsx14(
877
966
  CommentItem,
878
967
  {
879
968
  comment,
@@ -886,7 +975,7 @@ function CommentThread({
886
975
  }
887
976
 
888
977
  // src/CommentsSection.tsx
889
- import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
978
+ import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
890
979
  function CommentsSection({ articleSlug, config }) {
891
980
  var _a, _b, _c, _d, _e, _f;
892
981
  const { data: session, status } = useSession();
@@ -918,10 +1007,10 @@ function CommentsSection({ articleSlug, config }) {
918
1007
  if (!enabled) return null;
919
1008
  const count = comments.length;
920
1009
  const label = count === 1 ? "1 comment" : `${count} comments`;
921
- return /* @__PURE__ */ jsxs12("section", { "aria-label": "Comments", className: "mt-12 pt-8 border-t border-border space-y-6", children: [
922
- /* @__PURE__ */ jsx14("h2", { className: "text-xl font-semibold text-foreground", children: loading ? "Comments" : label }),
923
- status === "authenticated" ? /* @__PURE__ */ jsx14(CommentForm, { articleSlug, onSuccess: fetchComments }) : /* @__PURE__ */ jsxs12("p", { className: "text-sm text-muted-foreground", children: [
924
- /* @__PURE__ */ jsx14(
1010
+ return /* @__PURE__ */ jsxs13("section", { "aria-label": "Comments", className: "mt-12 pt-8 border-t border-border space-y-6", children: [
1011
+ /* @__PURE__ */ jsx15("h2", { className: "text-xl font-semibold text-foreground", children: loading ? "Comments" : label }),
1012
+ status === "authenticated" ? /* @__PURE__ */ jsx15(CommentForm, { articleSlug, onSuccess: fetchComments }) : /* @__PURE__ */ jsxs13("p", { className: "text-sm text-muted-foreground", children: [
1013
+ /* @__PURE__ */ jsx15(
925
1014
  "button",
926
1015
  {
927
1016
  onClick: () => signIn(),
@@ -932,8 +1021,8 @@ function CommentsSection({ articleSlug, config }) {
932
1021
  " ",
933
1022
  "to join the discussion."
934
1023
  ] }),
935
- fetchError && /* @__PURE__ */ jsx14("p", { className: "text-sm text-destructive", children: fetchError }),
936
- loading ? /* @__PURE__ */ jsx14("p", { className: "text-sm text-muted-foreground", children: "Loading comments\u2026" }) : /* @__PURE__ */ jsx14(
1024
+ fetchError && /* @__PURE__ */ jsx15("p", { className: "text-sm text-destructive", children: fetchError }),
1025
+ loading ? /* @__PURE__ */ jsx15("p", { className: "text-sm text-muted-foreground", children: "Loading comments\u2026" }) : /* @__PURE__ */ jsx15(
937
1026
  CommentThread,
938
1027
  {
939
1028
  comments,
@@ -947,6 +1036,7 @@ function CommentsSection({ articleSlug, config }) {
947
1036
  export {
948
1037
  ArticleCard,
949
1038
  ArticleCategoryGrid,
1039
+ ArticleDetailHero,
950
1040
  ArticleSchema,
951
1041
  ArticleSearchBar,
952
1042
  ArticlesHero,