@opinly/next 0.1.22 → 0.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/components/author-page/_helpers/json-ld.cjs +42 -0
  2. package/dist/components/author-page/_helpers/json-ld.cjs.map +1 -1
  3. package/dist/components/author-page/_helpers/json-ld.d.cts +7 -1
  4. package/dist/components/author-page/_helpers/json-ld.d.ts +7 -1
  5. package/dist/components/author-page/_helpers/json-ld.js +19 -0
  6. package/dist/components/author-page/_helpers/json-ld.js.map +1 -1
  7. package/dist/components/author-page/index.cjs +9 -15
  8. package/dist/components/author-page/index.cjs.map +1 -1
  9. package/dist/components/author-page/index.js +9 -15
  10. package/dist/components/author-page/index.js.map +1 -1
  11. package/dist/components/authors-page/_helpers/json-ld.cjs +53 -0
  12. package/dist/components/authors-page/_helpers/json-ld.cjs.map +1 -0
  13. package/dist/components/authors-page/_helpers/json-ld.d.cts +8 -0
  14. package/dist/components/authors-page/_helpers/json-ld.d.ts +8 -0
  15. package/dist/components/authors-page/_helpers/json-ld.js +29 -0
  16. package/dist/components/authors-page/_helpers/json-ld.js.map +1 -0
  17. package/dist/components/authors-page/index.cjs +61 -45
  18. package/dist/components/authors-page/index.cjs.map +1 -1
  19. package/dist/components/authors-page/index.js +62 -46
  20. package/dist/components/authors-page/index.js.map +1 -1
  21. package/dist/components/blog-post/_components/table-of-contents.cjs +4 -2
  22. package/dist/components/blog-post/_components/table-of-contents.cjs.map +1 -1
  23. package/dist/components/blog-post/_components/table-of-contents.d.cts +2 -1
  24. package/dist/components/blog-post/_components/table-of-contents.d.ts +2 -1
  25. package/dist/components/blog-post/_components/table-of-contents.js +4 -2
  26. package/dist/components/blog-post/_components/table-of-contents.js.map +1 -1
  27. package/dist/components/blog-post/index.cjs +19 -36
  28. package/dist/components/blog-post/index.cjs.map +1 -1
  29. package/dist/components/blog-post/index.d.cts +6 -4
  30. package/dist/components/blog-post/index.d.ts +6 -4
  31. package/dist/components/blog-post/index.js +20 -41
  32. package/dist/components/blog-post/index.js.map +1 -1
  33. package/dist/components/folder-page/_helpers/json-ld.cjs +43 -0
  34. package/dist/components/folder-page/_helpers/json-ld.cjs.map +1 -0
  35. package/dist/components/folder-page/_helpers/json-ld.d.cts +8 -0
  36. package/dist/components/folder-page/_helpers/json-ld.d.ts +8 -0
  37. package/dist/components/folder-page/_helpers/json-ld.js +19 -0
  38. package/dist/components/folder-page/_helpers/json-ld.js.map +1 -0
  39. package/dist/components/folder-page/index.cjs +5 -17
  40. package/dist/components/folder-page/index.cjs.map +1 -1
  41. package/dist/components/folder-page/index.js +5 -17
  42. package/dist/components/folder-page/index.js.map +1 -1
  43. package/dist/components/home-page/_helpers/json-ld.cjs +43 -0
  44. package/dist/components/home-page/_helpers/json-ld.cjs.map +1 -0
  45. package/dist/components/home-page/_helpers/json-ld.d.cts +3 -0
  46. package/dist/components/home-page/_helpers/json-ld.d.ts +3 -0
  47. package/dist/components/home-page/_helpers/json-ld.js +19 -0
  48. package/dist/components/home-page/_helpers/json-ld.js.map +1 -0
  49. package/dist/components/home-page/index.cjs +14 -5
  50. package/dist/components/home-page/index.cjs.map +1 -1
  51. package/dist/components/home-page/index.d.cts +7 -3
  52. package/dist/components/home-page/index.d.ts +7 -3
  53. package/dist/components/home-page/index.js +15 -6
  54. package/dist/components/home-page/index.js.map +1 -1
  55. package/dist/components/json-ld.cjs +92 -0
  56. package/dist/components/json-ld.cjs.map +1 -0
  57. package/dist/components/json-ld.d.cts +13 -0
  58. package/dist/components/json-ld.d.ts +13 -0
  59. package/dist/components/json-ld.js +57 -0
  60. package/dist/components/json-ld.js.map +1 -0
  61. package/dist/components/opinly-blog.cjs +5 -3
  62. package/dist/components/opinly-blog.cjs.map +1 -1
  63. package/dist/components/opinly-blog.d.cts +8 -1
  64. package/dist/components/opinly-blog.d.ts +8 -1
  65. package/dist/components/opinly-blog.js +5 -3
  66. package/dist/components/opinly-blog.js.map +1 -1
  67. package/dist/index.d.cts +5 -0
  68. package/dist/index.d.ts +5 -0
  69. package/dist/utils/json-ld.cjs +2 -0
  70. package/dist/utils/json-ld.cjs.map +1 -0
  71. package/dist/utils/json-ld.d.cts +2 -0
  72. package/dist/utils/json-ld.d.ts +2 -0
  73. package/dist/utils/json-ld.js +1 -0
  74. package/dist/utils/json-ld.js.map +1 -0
  75. package/dist/utils/sdk-config.cjs +1 -1
  76. package/dist/utils/sdk-config.cjs.map +1 -1
  77. package/dist/utils/sdk-config.js +1 -1
  78. package/dist/utils/sdk-config.js.map +1 -1
  79. package/package.json +2 -2
@@ -1,68 +1,84 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
2
  import Image from "next/image";
3
3
  import { opinlyConfig } from "../../utils/sdk-config";
4
4
  import { PostPreview } from "../post-preview";
5
5
  import { BreadCrumbs } from "../bread-crumbs";
6
6
  import Link from "next/link";
7
+ import { OpinlyBreadCrumbJsonLd, OpinlyJSONLD } from "../json-ld";
8
+ import { authorCollectionJSONLD } from "./_helpers/json-ld";
7
9
  const AuthorsPage = ({
8
10
  authors
9
11
  }) => {
10
- return /* @__PURE__ */ jsxs("div", { className: "max-w-5xl mx-auto px-4 py-10", children: [
12
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
13
+ /* @__PURE__ */ jsx(OpinlyJSONLD, { content: authorCollectionJSONLD(authors) }),
11
14
  /* @__PURE__ */ jsx(
12
- BreadCrumbs,
15
+ OpinlyBreadCrumbJsonLd,
13
16
  {
14
- breadcrumbs: [
17
+ items: [
15
18
  {
19
+ slugNoPrefixSlash: "authors",
16
20
  name: "Authors"
17
21
  }
18
22
  ]
19
23
  }
20
24
  ),
21
- /* @__PURE__ */ jsx("h1", { className: "text-3xl font-bold mb-10", children: "Authors" }),
22
- /* @__PURE__ */ jsx("div", { className: "space-y-16", children: authors.map((author, idx) => {
23
- const authorSlug = `${opinlyConfig.blogPrefix}/authors/${author.slug}`;
24
- return /* @__PURE__ */ jsxs(
25
- "div",
25
+ /* @__PURE__ */ jsxs("div", { className: "max-w-5xl mx-auto px-4 py-10", children: [
26
+ /* @__PURE__ */ jsx(
27
+ BreadCrumbs,
26
28
  {
27
- className: "rounded-lg p-6 flex flex-col gap-6",
28
- children: [
29
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-6 mb-4", children: [
30
- author.image?.fileKey && /* @__PURE__ */ jsx(Link, { href: authorSlug, children: /* @__PURE__ */ jsx(
31
- Image,
32
- {
33
- src: `${opinlyConfig.imagesPrefix}/${author.image.fileKey}`,
34
- alt: author.image.alt || author.name,
35
- width: 100,
36
- height: 100,
37
- className: "rounded-full border"
38
- }
39
- ) }),
29
+ breadcrumbs: [
30
+ {
31
+ name: "Authors"
32
+ }
33
+ ]
34
+ }
35
+ ),
36
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl font-bold mb-10", children: "Authors" }),
37
+ /* @__PURE__ */ jsx("div", { className: "space-y-16", children: authors.map((author, idx) => {
38
+ const authorSlug = `${opinlyConfig.blogPrefix}/authors/${author.slug}`;
39
+ return /* @__PURE__ */ jsxs(
40
+ "div",
41
+ {
42
+ className: "rounded-lg p-6 flex flex-col gap-6",
43
+ children: [
44
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-6 mb-4", children: [
45
+ author.image?.fileKey && /* @__PURE__ */ jsx(Link, { href: authorSlug, children: /* @__PURE__ */ jsx(
46
+ Image,
47
+ {
48
+ src: `${opinlyConfig.imagesPrefix}/${author.image.fileKey}`,
49
+ alt: author.image.alt || author.name,
50
+ width: 100,
51
+ height: 100,
52
+ className: "rounded-full border"
53
+ }
54
+ ) }),
55
+ /* @__PURE__ */ jsxs("div", { children: [
56
+ /* @__PURE__ */ jsx(Link, { href: authorSlug, children: /* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold mb-1", children: author.name }) }),
57
+ author.bio && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-base max-w-2xl", children: author.bio })
58
+ ] })
59
+ ] }),
40
60
  /* @__PURE__ */ jsxs("div", { children: [
41
- /* @__PURE__ */ jsx(Link, { href: authorSlug, children: /* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold mb-1", children: author.name }) }),
42
- author.bio && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-base max-w-2xl", children: author.bio })
61
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-4", children: author.posts && author.posts.length > 0 ? author.posts.map(
62
+ (post) => post && /* @__PURE__ */ jsx(PostPreview, { post }, post.slug)
63
+ ) : /* @__PURE__ */ jsx("div", { className: "text-muted-foreground col-span-full", children: "No posts yet." }) }),
64
+ /* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxs(
65
+ Link,
66
+ {
67
+ href: `${opinlyConfig.blogPrefix}/authors/${author.slug}`,
68
+ className: "text-bold",
69
+ children: [
70
+ "View more posts from ",
71
+ author.name
72
+ ]
73
+ }
74
+ ) })
43
75
  ] })
44
- ] }),
45
- /* @__PURE__ */ jsxs("div", { children: [
46
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-4", children: author.posts && author.posts.length > 0 ? author.posts.map(
47
- (post) => post && /* @__PURE__ */ jsx(PostPreview, { post }, post.slug)
48
- ) : /* @__PURE__ */ jsx("div", { className: "text-muted-foreground col-span-full", children: "No posts yet." }) }),
49
- /* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxs(
50
- Link,
51
- {
52
- href: `${opinlyConfig.blogPrefix}/authors/${author.slug}`,
53
- className: "text-bold",
54
- children: [
55
- "View more posts from ",
56
- author.name
57
- ]
58
- }
59
- ) })
60
- ] })
61
- ]
62
- },
63
- author.name + idx
64
- );
65
- }) })
76
+ ]
77
+ },
78
+ author.name + idx
79
+ );
80
+ }) })
81
+ ] })
66
82
  ] });
67
83
  };
68
84
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/authors-page/index.tsx"],"sourcesContent":["import type { Opinly } from \"@opinly/backend\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\n\nimport { PostPreview } from \"../post-preview\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport Link from \"next/link\";\n\nexport const AuthorsPage = ({\n authors,\n}: {\n authors: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"authors\" }\n >[\"data\"];\n}) => {\n return (\n <div className=\"max-w-5xl mx-auto px-4 py-10\">\n <BreadCrumbs\n breadcrumbs={[\n {\n name: \"Authors\",\n },\n ]}\n />\n <h1 className=\"text-3xl font-bold mb-10\">Authors</h1>\n <div className=\"space-y-16\">\n {authors.map((author, idx) => {\n const authorSlug = `${opinlyConfig.blogPrefix}/authors/${author.slug}`;\n\n return (\n <div\n key={author.name + idx}\n className=\"rounded-lg p-6 flex flex-col gap-6\"\n >\n <div className=\"flex items-center gap-6 mb-4\">\n {author.image?.fileKey && (\n <Link href={authorSlug}>\n <Image\n src={`${opinlyConfig.imagesPrefix}/${author.image.fileKey}`}\n alt={author.image.alt || author.name}\n width={100}\n height={100}\n className=\"rounded-full border\"\n />\n </Link>\n )}\n <div>\n <Link href={authorSlug}>\n <h2 className=\"text-2xl font-semibold mb-1\">\n {author.name}\n </h2>\n </Link>\n\n {author.bio && (\n <p className=\"text-muted-foreground text-base max-w-2xl\">\n {author.bio}\n </p>\n )}\n </div>\n </div>\n <div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-4\">\n {author.posts && author.posts.length > 0 ? (\n author.posts.map(\n (post) =>\n post && <PostPreview key={post.slug} post={post} />\n )\n ) : (\n <div className=\"text-muted-foreground col-span-full\">\n No posts yet.\n </div>\n )}\n </div>\n <div className=\"flex justify-end\">\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-bold\"\n >\n View more posts from {author.name}\n </Link>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n"],"mappings":"AAkBM,cA6BU,YA7BV;AAjBN,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAE7B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,OAAO,UAAU;AAEV,MAAM,cAAc,CAAC;AAAA,EAC1B;AACF,MAKM;AACJ,SACE,qBAAC,SAAI,WAAU,gCACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa;AAAA,UACX;AAAA,YACE,MAAM;AAAA,UACR;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACA,oBAAC,QAAG,WAAU,4BAA2B,qBAAO;AAAA,IAChD,oBAAC,SAAI,WAAU,cACZ,kBAAQ,IAAI,CAAC,QAAQ,QAAQ;AAC5B,YAAM,aAAa,GAAG,aAAa,UAAU,YAAY,OAAO,IAAI;AAEpE,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV;AAAA,iCAAC,SAAI,WAAU,gCACZ;AAAA,qBAAO,OAAO,WACb,oBAAC,QAAK,MAAM,YACV;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK,GAAG,aAAa,YAAY,IAAI,OAAO,MAAM,OAAO;AAAA,kBACzD,KAAK,OAAO,MAAM,OAAO,OAAO;AAAA,kBAChC,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,WAAU;AAAA;AAAA,cACZ,GACF;AAAA,cAEF,qBAAC,SACC;AAAA,oCAAC,QAAK,MAAM,YACV,8BAAC,QAAG,WAAU,+BACX,iBAAO,MACV,GACF;AAAA,gBAEC,OAAO,OACN,oBAAC,OAAE,WAAU,6CACV,iBAAO,KACV;AAAA,iBAEJ;AAAA,eACF;AAAA,YACA,qBAAC,SACC;AAAA,kCAAC,SAAI,WAAU,6DACZ,iBAAO,SAAS,OAAO,MAAM,SAAS,IACrC,OAAO,MAAM;AAAA,gBACX,CAAC,SACC,QAAQ,oBAAC,eAA4B,QAAX,KAAK,IAAkB;AAAA,cACrD,IAEA,oBAAC,SAAI,WAAU,uCAAsC,2BAErD,GAEJ;AAAA,cACA,oBAAC,SAAI,WAAU,oBACb;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM,GAAG,aAAa,UAAU,YAAY,OAAO,IAAI;AAAA,kBACvD,WAAU;AAAA,kBACX;AAAA;AAAA,oBACuB,OAAO;AAAA;AAAA;AAAA,cAC/B,GACF;AAAA,eACF;AAAA;AAAA;AAAA,QAlDK,OAAO,OAAO;AAAA,MAmDrB;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/authors-page/index.tsx"],"sourcesContent":["import type { Opinly } from \"@opinly/backend\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\n\nimport { PostPreview } from \"../post-preview\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport Link from \"next/link\";\nimport { OpinlyBreadCrumbJsonLd, OpinlyJSONLD } from \"../json-ld\";\nimport { authorCollectionJSONLD } from \"./_helpers/json-ld\";\n\nexport const AuthorsPage = ({\n authors,\n}: {\n authors: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"authors\" }\n >[\"data\"];\n}) => {\n return (\n <>\n <OpinlyJSONLD content={authorCollectionJSONLD(authors)} />\n <OpinlyBreadCrumbJsonLd\n items={[\n {\n slugNoPrefixSlash: \"authors\",\n name: \"Authors\",\n },\n ]}\n />\n <div className=\"max-w-5xl mx-auto px-4 py-10\">\n <BreadCrumbs\n breadcrumbs={[\n {\n name: \"Authors\",\n },\n ]}\n />\n <h1 className=\"text-3xl font-bold mb-10\">Authors</h1>\n <div className=\"space-y-16\">\n {authors.map((author, idx) => {\n const authorSlug = `${opinlyConfig.blogPrefix}/authors/${author.slug}`;\n\n return (\n <div\n key={author.name + idx}\n className=\"rounded-lg p-6 flex flex-col gap-6\"\n >\n <div className=\"flex items-center gap-6 mb-4\">\n {author.image?.fileKey && (\n <Link href={authorSlug}>\n <Image\n src={`${opinlyConfig.imagesPrefix}/${author.image.fileKey}`}\n alt={author.image.alt || author.name}\n width={100}\n height={100}\n className=\"rounded-full border\"\n />\n </Link>\n )}\n <div>\n <Link href={authorSlug}>\n <h2 className=\"text-2xl font-semibold mb-1\">\n {author.name}\n </h2>\n </Link>\n\n {author.bio && (\n <p className=\"text-muted-foreground text-base max-w-2xl\">\n {author.bio}\n </p>\n )}\n </div>\n </div>\n <div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-4\">\n {author.posts && author.posts.length > 0 ? (\n author.posts.map(\n (post) =>\n post && <PostPreview key={post.slug} post={post} />\n )\n ) : (\n <div className=\"text-muted-foreground col-span-full\">\n No posts yet.\n </div>\n )}\n </div>\n <div className=\"flex justify-end\">\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-bold\"\n >\n View more posts from {author.name}\n </Link>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </>\n );\n};\n"],"mappings":"AAmBI,mBACE,KAuCY,YAxCd;AAlBJ,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAE7B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,OAAO,UAAU;AACjB,SAAS,wBAAwB,oBAAoB;AACrD,SAAS,8BAA8B;AAEhC,MAAM,cAAc,CAAC;AAAA,EAC1B;AACF,MAKM;AACJ,SACE,iCACE;AAAA,wBAAC,gBAAa,SAAS,uBAAuB,OAAO,GAAG;AAAA,IACxD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL;AAAA,YACE,mBAAmB;AAAA,YACnB,MAAM;AAAA,UACR;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACA,qBAAC,SAAI,WAAU,gCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAa;AAAA,YACX;AAAA,cACE,MAAM;AAAA,YACR;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACA,oBAAC,QAAG,WAAU,4BAA2B,qBAAO;AAAA,MAChD,oBAAC,SAAI,WAAU,cACZ,kBAAQ,IAAI,CAAC,QAAQ,QAAQ;AAC5B,cAAM,aAAa,GAAG,aAAa,UAAU,YAAY,OAAO,IAAI;AAEpE,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YAEV;AAAA,mCAAC,SAAI,WAAU,gCACZ;AAAA,uBAAO,OAAO,WACb,oBAAC,QAAK,MAAM,YACV;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK,GAAG,aAAa,YAAY,IAAI,OAAO,MAAM,OAAO;AAAA,oBACzD,KAAK,OAAO,MAAM,OAAO,OAAO;AAAA,oBAChC,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,WAAU;AAAA;AAAA,gBACZ,GACF;AAAA,gBAEF,qBAAC,SACC;AAAA,sCAAC,QAAK,MAAM,YACV,8BAAC,QAAG,WAAU,+BACX,iBAAO,MACV,GACF;AAAA,kBAEC,OAAO,OACN,oBAAC,OAAE,WAAU,6CACV,iBAAO,KACV;AAAA,mBAEJ;AAAA,iBACF;AAAA,cACA,qBAAC,SACC;AAAA,oCAAC,SAAI,WAAU,6DACZ,iBAAO,SAAS,OAAO,MAAM,SAAS,IACrC,OAAO,MAAM;AAAA,kBACX,CAAC,SACC,QAAQ,oBAAC,eAA4B,QAAX,KAAK,IAAkB;AAAA,gBACrD,IAEA,oBAAC,SAAI,WAAU,uCAAsC,2BAErD,GAEJ;AAAA,gBACA,oBAAC,SAAI,WAAU,oBACb;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,GAAG,aAAa,UAAU,YAAY,OAAO,IAAI;AAAA,oBACvD,WAAU;AAAA,oBACX;AAAA;AAAA,sBACuB,OAAO;AAAA;AAAA;AAAA,gBAC/B,GACF;AAAA,iBACF;AAAA;AAAA;AAAA,UAlDK,OAAO,OAAO;AAAA,QAmDrB;AAAA,MAEJ,CAAC,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -45,7 +45,8 @@ const headingColorMap = {
45
45
  const TableOfContents = ({
46
46
  content,
47
47
  author,
48
- post
48
+ post,
49
+ cta
49
50
  }) => {
50
51
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: (0, import_merge.cn)("w-full flex flex-col space-y-4"), children: [
51
52
  author && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "w-full flex flex-col space-y-2 mb-6 border p-4 rounded-md text-sm", children: [
@@ -99,7 +100,8 @@ const TableOfContents = ({
99
100
  },
100
101
  heading.slug
101
102
  )) })
102
- ] })
103
+ ] }),
104
+ cta
103
105
  ] });
104
106
  };
105
107
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/blog-post/_components/table-of-contents.tsx"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { cn } from \"../../../utils/merge\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { extractHeadings } from \"../_helpers/extract-headings\";\nimport { Share } from \"./share\";\nimport Link from \"next/link\";\n\ntype TableOfContentsProps = {\n content: JSONContent;\n author: BlogPostRes[\"author\"] | null;\n post: BlogPostRes;\n};\n\nconst headingColorMap = {\n 2: \"text-op-heading\",\n 3: \"text-op-body\",\n};\n\nexport const TableOfContents = ({\n content,\n author,\n post,\n}: TableOfContentsProps) => {\n return (\n <div className={cn(\"w-full flex flex-col space-y-4\")}>\n {author && (\n <div className=\"w-full flex flex-col space-y-2 mb-6 border p-4 rounded-md text-sm\">\n {author.fileKey && (\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${author.fileKey}`}\n alt={author.name}\n width={48}\n height={48}\n className=\"rounded-full\"\n />\n )}\n <div className=\"w-full flex flex-col space-y-2\">\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-lg text-op-heading font-bold\"\n >\n {author.name}\n </Link>\n <div className=\"w-48 \">\n {/* Mobile: show truncated bio */}\n <span className=\"text-op-muted text-sm w-56 break-words block md:hidden\">\n {author.bio && author.bio.length > 40\n ? author.bio.slice(0, 40) + \"...\"\n : author.bio}\n </span>\n {/* Desktop: show full bio */}\n <p className=\"text-op-muted text-sm w-48 hidden md:block\">\n {author.bio}\n </p>\n </div>\n </div>\n </div>\n )}\n <Share post={post} />\n <div className=\"border-l-4 border-op-accent pl-4 mb-4\">\n <h2 className=\"text-lg font-semibold mb-2\">Table of Contents</h2>\n <ul className=\"text-sm space-y-1\">\n {(extractHeadings(content) || []).map((heading) => (\n <li\n key={heading.slug}\n className={cn(heading.level === 3 && \"ml-2\")}\n >\n <a\n href={`#${heading.slug}`}\n className={cn(\n headingColorMap[heading.level as keyof typeof headingColorMap]\n )}\n >\n {heading.level === 3 && \"-\"} {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BY;AA5BZ,mBAAmB;AACnB,mBAAkB;AAClB,wBAA6B;AAC7B,8BAAgC;AAChC,mBAAsB;AACtB,kBAAiB;AAQjB,MAAM,kBAAkB;AAAA,EACtB,GAAG;AAAA,EACH,GAAG;AACL;AAEO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,SACE,6CAAC,SAAI,eAAW,iBAAG,gCAAgC,GAChD;AAAA,cACC,6CAAC,SAAI,WAAU,qEACZ;AAAA,aAAO,WACN;AAAA,QAAC,aAAAA;AAAA,QAAA;AAAA,UACC,aAAa,+BAAa;AAAA,UAC1B,KAAK,GAAG,+BAAa,YAAY,IAAI,OAAO,OAAO;AAAA,UACnD,KAAK,OAAO;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,6CAAC,SAAI,WAAU,kCACb;AAAA;AAAA,UAAC,YAAAC;AAAA,UAAA;AAAA,YACC,MAAM,GAAG,+BAAa,UAAU,YAAY,OAAO,IAAI;AAAA,YACvD,WAAU;AAAA,YAET,iBAAO;AAAA;AAAA,QACV;AAAA,QACA,6CAAC,SAAI,WAAU,SAEb;AAAA,sDAAC,UAAK,WAAU,0DACb,iBAAO,OAAO,OAAO,IAAI,SAAS,KAC/B,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,QAC1B,OAAO,KACb;AAAA,UAEA,4CAAC,OAAE,WAAU,+CACV,iBAAO,KACV;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,IAEF,4CAAC,sBAAM,MAAY;AAAA,IACnB,6CAAC,SAAI,WAAU,yCACb;AAAA,kDAAC,QAAG,WAAU,8BAA6B,+BAAiB;AAAA,MAC5D,4CAAC,QAAG,WAAU,qBACV,wDAAgB,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,YACrC;AAAA,QAAC;AAAA;AAAA,UAEC,eAAW,iBAAG,QAAQ,UAAU,KAAK,MAAM;AAAA,UAE3C;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,IAAI,QAAQ,IAAI;AAAA,cACtB,eAAW;AAAA,gBACT,gBAAgB,QAAQ,KAAqC;AAAA,cAC/D;AAAA,cAEC;AAAA,wBAAQ,UAAU,KAAK;AAAA,gBAAI;AAAA,gBAAE,QAAQ;AAAA;AAAA;AAAA,UACxC;AAAA;AAAA,QAVK,QAAQ;AAAA,MAWf,CACD,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":["Image","Link"]}
1
+ {"version":3,"sources":["../../../../src/components/blog-post/_components/table-of-contents.tsx"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { cn } from \"../../../utils/merge\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { extractHeadings } from \"../_helpers/extract-headings\";\nimport { Share } from \"./share\";\nimport Link from \"next/link\";\n\ntype TableOfContentsProps = {\n content: JSONContent;\n author: BlogPostRes[\"author\"] | null;\n post: BlogPostRes;\n cta?: React.ReactNode;\n};\n\nconst headingColorMap = {\n 2: \"text-op-heading\",\n 3: \"text-op-body\",\n};\n\nexport const TableOfContents = ({\n content,\n author,\n post,\n cta,\n}: TableOfContentsProps) => {\n return (\n <div className={cn(\"w-full flex flex-col space-y-4\")}>\n {author && (\n <div className=\"w-full flex flex-col space-y-2 mb-6 border p-4 rounded-md text-sm\">\n {author.fileKey && (\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${author.fileKey}`}\n alt={author.name}\n width={48}\n height={48}\n className=\"rounded-full\"\n />\n )}\n <div className=\"w-full flex flex-col space-y-2\">\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-lg text-op-heading font-bold\"\n >\n {author.name}\n </Link>\n <div className=\"w-48 \">\n {/* Mobile: show truncated bio */}\n <span className=\"text-op-muted text-sm w-56 break-words block md:hidden\">\n {author.bio && author.bio.length > 40\n ? author.bio.slice(0, 40) + \"...\"\n : author.bio}\n </span>\n {/* Desktop: show full bio */}\n <p className=\"text-op-muted text-sm w-48 hidden md:block\">\n {author.bio}\n </p>\n </div>\n </div>\n </div>\n )}\n <Share post={post} />\n <div className=\"border-l-4 border-op-accent pl-4 mb-4\">\n <h2 className=\"text-lg font-semibold mb-2\">Table of Contents</h2>\n <ul className=\"text-sm space-y-1\">\n {(extractHeadings(content) || []).map((heading) => (\n <li\n key={heading.slug}\n className={cn(heading.level === 3 && \"ml-2\")}\n >\n <a\n href={`#${heading.slug}`}\n className={cn(\n headingColorMap[heading.level as keyof typeof headingColorMap]\n )}\n >\n {heading.level === 3 && \"-\"} {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </div>\n {cta}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCY;AA9BZ,mBAAmB;AACnB,mBAAkB;AAClB,wBAA6B;AAC7B,8BAAgC;AAChC,mBAAsB;AACtB,kBAAiB;AASjB,MAAM,kBAAkB;AAAA,EACtB,GAAG;AAAA,EACH,GAAG;AACL;AAEO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,SACE,6CAAC,SAAI,eAAW,iBAAG,gCAAgC,GAChD;AAAA,cACC,6CAAC,SAAI,WAAU,qEACZ;AAAA,aAAO,WACN;AAAA,QAAC,aAAAA;AAAA,QAAA;AAAA,UACC,aAAa,+BAAa;AAAA,UAC1B,KAAK,GAAG,+BAAa,YAAY,IAAI,OAAO,OAAO;AAAA,UACnD,KAAK,OAAO;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,6CAAC,SAAI,WAAU,kCACb;AAAA;AAAA,UAAC,YAAAC;AAAA,UAAA;AAAA,YACC,MAAM,GAAG,+BAAa,UAAU,YAAY,OAAO,IAAI;AAAA,YACvD,WAAU;AAAA,YAET,iBAAO;AAAA;AAAA,QACV;AAAA,QACA,6CAAC,SAAI,WAAU,SAEb;AAAA,sDAAC,UAAK,WAAU,0DACb,iBAAO,OAAO,OAAO,IAAI,SAAS,KAC/B,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,QAC1B,OAAO,KACb;AAAA,UAEA,4CAAC,OAAE,WAAU,+CACV,iBAAO,KACV;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,IAEF,4CAAC,sBAAM,MAAY;AAAA,IACnB,6CAAC,SAAI,WAAU,yCACb;AAAA,kDAAC,QAAG,WAAU,8BAA6B,+BAAiB;AAAA,MAC5D,4CAAC,QAAG,WAAU,qBACV,wDAAgB,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,YACrC;AAAA,QAAC;AAAA;AAAA,UAEC,eAAW,iBAAG,QAAQ,UAAU,KAAK,MAAM;AAAA,UAE3C;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,IAAI,QAAQ,IAAI;AAAA,cACtB,eAAW;AAAA,gBACT,gBAAgB,QAAQ,KAAqC;AAAA,cAC/D;AAAA,cAEC;AAAA,wBAAQ,UAAU,KAAK;AAAA,gBAAI;AAAA,gBAAE,QAAQ;AAAA;AAAA;AAAA,UACxC;AAAA;AAAA,QAVK,QAAQ;AAAA,MAWf,CACD,GACH;AAAA,OACF;AAAA,IACC;AAAA,KACH;AAEJ;","names":["Image","Link"]}
@@ -7,7 +7,8 @@ type TableOfContentsProps = {
7
7
  content: JSONContent;
8
8
  author: BlogPostRes["author"] | null;
9
9
  post: BlogPostRes;
10
+ cta?: React.ReactNode;
10
11
  };
11
- declare const TableOfContents: ({ content, author, post, }: TableOfContentsProps) => react_jsx_runtime.JSX.Element;
12
+ declare const TableOfContents: ({ content, author, post, cta, }: TableOfContentsProps) => react_jsx_runtime.JSX.Element;
12
13
 
13
14
  export { TableOfContents };
@@ -7,7 +7,8 @@ type TableOfContentsProps = {
7
7
  content: JSONContent;
8
8
  author: BlogPostRes["author"] | null;
9
9
  post: BlogPostRes;
10
+ cta?: React.ReactNode;
10
11
  };
11
- declare const TableOfContents: ({ content, author, post, }: TableOfContentsProps) => react_jsx_runtime.JSX.Element;
12
+ declare const TableOfContents: ({ content, author, post, cta, }: TableOfContentsProps) => react_jsx_runtime.JSX.Element;
12
13
 
13
14
  export { TableOfContents };
@@ -12,7 +12,8 @@ const headingColorMap = {
12
12
  const TableOfContents = ({
13
13
  content,
14
14
  author,
15
- post
15
+ post,
16
+ cta
16
17
  }) => {
17
18
  return /* @__PURE__ */ jsxs("div", { className: cn("w-full flex flex-col space-y-4"), children: [
18
19
  author && /* @__PURE__ */ jsxs("div", { className: "w-full flex flex-col space-y-2 mb-6 border p-4 rounded-md text-sm", children: [
@@ -66,7 +67,8 @@ const TableOfContents = ({
66
67
  },
67
68
  heading.slug
68
69
  )) })
69
- ] })
70
+ ] }),
71
+ cta
70
72
  ] });
71
73
  };
72
74
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/blog-post/_components/table-of-contents.tsx"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { cn } from \"../../../utils/merge\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { extractHeadings } from \"../_helpers/extract-headings\";\nimport { Share } from \"./share\";\nimport Link from \"next/link\";\n\ntype TableOfContentsProps = {\n content: JSONContent;\n author: BlogPostRes[\"author\"] | null;\n post: BlogPostRes;\n};\n\nconst headingColorMap = {\n 2: \"text-op-heading\",\n 3: \"text-op-body\",\n};\n\nexport const TableOfContents = ({\n content,\n author,\n post,\n}: TableOfContentsProps) => {\n return (\n <div className={cn(\"w-full flex flex-col space-y-4\")}>\n {author && (\n <div className=\"w-full flex flex-col space-y-2 mb-6 border p-4 rounded-md text-sm\">\n {author.fileKey && (\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${author.fileKey}`}\n alt={author.name}\n width={48}\n height={48}\n className=\"rounded-full\"\n />\n )}\n <div className=\"w-full flex flex-col space-y-2\">\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-lg text-op-heading font-bold\"\n >\n {author.name}\n </Link>\n <div className=\"w-48 \">\n {/* Mobile: show truncated bio */}\n <span className=\"text-op-muted text-sm w-56 break-words block md:hidden\">\n {author.bio && author.bio.length > 40\n ? author.bio.slice(0, 40) + \"...\"\n : author.bio}\n </span>\n {/* Desktop: show full bio */}\n <p className=\"text-op-muted text-sm w-48 hidden md:block\">\n {author.bio}\n </p>\n </div>\n </div>\n </div>\n )}\n <Share post={post} />\n <div className=\"border-l-4 border-op-accent pl-4 mb-4\">\n <h2 className=\"text-lg font-semibold mb-2\">Table of Contents</h2>\n <ul className=\"text-sm space-y-1\">\n {(extractHeadings(content) || []).map((heading) => (\n <li\n key={heading.slug}\n className={cn(heading.level === 3 && \"ml-2\")}\n >\n <a\n href={`#${heading.slug}`}\n className={cn(\n headingColorMap[heading.level as keyof typeof headingColorMap]\n )}\n >\n {heading.level === 3 && \"-\"} {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n};\n"],"mappings":"AA8BY,cAgBA,YAhBA;AA5BZ,SAAS,UAAU;AACnB,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,aAAa;AACtB,OAAO,UAAU;AAQjB,MAAM,kBAAkB;AAAA,EACtB,GAAG;AAAA,EACH,GAAG;AACL;AAEO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,SACE,qBAAC,SAAI,WAAW,GAAG,gCAAgC,GAChD;AAAA,cACC,qBAAC,SAAI,WAAU,qEACZ;AAAA,aAAO,WACN;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,aAAa;AAAA,UAC1B,KAAK,GAAG,aAAa,YAAY,IAAI,OAAO,OAAO;AAAA,UACnD,KAAK,OAAO;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,qBAAC,SAAI,WAAU,kCACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,aAAa,UAAU,YAAY,OAAO,IAAI;AAAA,YACvD,WAAU;AAAA,YAET,iBAAO;AAAA;AAAA,QACV;AAAA,QACA,qBAAC,SAAI,WAAU,SAEb;AAAA,8BAAC,UAAK,WAAU,0DACb,iBAAO,OAAO,OAAO,IAAI,SAAS,KAC/B,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,QAC1B,OAAO,KACb;AAAA,UAEA,oBAAC,OAAE,WAAU,+CACV,iBAAO,KACV;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,IAEF,oBAAC,SAAM,MAAY;AAAA,IACnB,qBAAC,SAAI,WAAU,yCACb;AAAA,0BAAC,QAAG,WAAU,8BAA6B,+BAAiB;AAAA,MAC5D,oBAAC,QAAG,WAAU,qBACV,2BAAgB,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,YACrC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,GAAG,QAAQ,UAAU,KAAK,MAAM;AAAA,UAE3C;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,IAAI,QAAQ,IAAI;AAAA,cACtB,WAAW;AAAA,gBACT,gBAAgB,QAAQ,KAAqC;AAAA,cAC/D;AAAA,cAEC;AAAA,wBAAQ,UAAU,KAAK;AAAA,gBAAI;AAAA,gBAAE,QAAQ;AAAA;AAAA;AAAA,UACxC;AAAA;AAAA,QAVK,QAAQ;AAAA,MAWf,CACD,GACH;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/blog-post/_components/table-of-contents.tsx"],"sourcesContent":["import { JSONContent } from \"@tiptap/core\";\nimport { BlogPostRes } from \"../_types/blog-post\";\nimport { cn } from \"../../../utils/merge\";\nimport Image from \"next/image\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\nimport { extractHeadings } from \"../_helpers/extract-headings\";\nimport { Share } from \"./share\";\nimport Link from \"next/link\";\n\ntype TableOfContentsProps = {\n content: JSONContent;\n author: BlogPostRes[\"author\"] | null;\n post: BlogPostRes;\n cta?: React.ReactNode;\n};\n\nconst headingColorMap = {\n 2: \"text-op-heading\",\n 3: \"text-op-body\",\n};\n\nexport const TableOfContents = ({\n content,\n author,\n post,\n cta,\n}: TableOfContentsProps) => {\n return (\n <div className={cn(\"w-full flex flex-col space-y-4\")}>\n {author && (\n <div className=\"w-full flex flex-col space-y-2 mb-6 border p-4 rounded-md text-sm\">\n {author.fileKey && (\n <Image\n unoptimized={opinlyConfig.unoptimizedImages}\n src={`${opinlyConfig.imagesPrefix}/${author.fileKey}`}\n alt={author.name}\n width={48}\n height={48}\n className=\"rounded-full\"\n />\n )}\n <div className=\"w-full flex flex-col space-y-2\">\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${author.slug}`}\n className=\"text-lg text-op-heading font-bold\"\n >\n {author.name}\n </Link>\n <div className=\"w-48 \">\n {/* Mobile: show truncated bio */}\n <span className=\"text-op-muted text-sm w-56 break-words block md:hidden\">\n {author.bio && author.bio.length > 40\n ? author.bio.slice(0, 40) + \"...\"\n : author.bio}\n </span>\n {/* Desktop: show full bio */}\n <p className=\"text-op-muted text-sm w-48 hidden md:block\">\n {author.bio}\n </p>\n </div>\n </div>\n </div>\n )}\n <Share post={post} />\n <div className=\"border-l-4 border-op-accent pl-4 mb-4\">\n <h2 className=\"text-lg font-semibold mb-2\">Table of Contents</h2>\n <ul className=\"text-sm space-y-1\">\n {(extractHeadings(content) || []).map((heading) => (\n <li\n key={heading.slug}\n className={cn(heading.level === 3 && \"ml-2\")}\n >\n <a\n href={`#${heading.slug}`}\n className={cn(\n headingColorMap[heading.level as keyof typeof headingColorMap]\n )}\n >\n {heading.level === 3 && \"-\"} {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </div>\n {cta}\n </div>\n );\n};\n"],"mappings":"AAgCY,cAgBA,YAhBA;AA9BZ,SAAS,UAAU;AACnB,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,aAAa;AACtB,OAAO,UAAU;AASjB,MAAM,kBAAkB;AAAA,EACtB,GAAG;AAAA,EACH,GAAG;AACL;AAEO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AAC1B,SACE,qBAAC,SAAI,WAAW,GAAG,gCAAgC,GAChD;AAAA,cACC,qBAAC,SAAI,WAAU,qEACZ;AAAA,aAAO,WACN;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,aAAa;AAAA,UAC1B,KAAK,GAAG,aAAa,YAAY,IAAI,OAAO,OAAO;AAAA,UACnD,KAAK,OAAO;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ;AAAA,MAEF,qBAAC,SAAI,WAAU,kCACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,GAAG,aAAa,UAAU,YAAY,OAAO,IAAI;AAAA,YACvD,WAAU;AAAA,YAET,iBAAO;AAAA;AAAA,QACV;AAAA,QACA,qBAAC,SAAI,WAAU,SAEb;AAAA,8BAAC,UAAK,WAAU,0DACb,iBAAO,OAAO,OAAO,IAAI,SAAS,KAC/B,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,QAC1B,OAAO,KACb;AAAA,UAEA,oBAAC,OAAE,WAAU,+CACV,iBAAO,KACV;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,IAEF,oBAAC,SAAM,MAAY;AAAA,IACnB,qBAAC,SAAI,WAAU,yCACb;AAAA,0BAAC,QAAG,WAAU,8BAA6B,+BAAiB;AAAA,MAC5D,oBAAC,QAAG,WAAU,qBACV,2BAAgB,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,YACrC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,GAAG,QAAQ,UAAU,KAAK,MAAM;AAAA,UAE3C;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,IAAI,QAAQ,IAAI;AAAA,cACtB,WAAW;AAAA,gBACT,gBAAgB,QAAQ,KAAqC;AAAA,cAC/D;AAAA,cAEC;AAAA,wBAAQ,UAAU,KAAK;AAAA,gBAAI;AAAA,gBAAE,QAAQ;AAAA;AAAA;AAAA,UACxC;AAAA;AAAA,QAVK,QAAQ;AAAA,MAWf,CACD,GACH;AAAA,OACF;AAAA,IACC;AAAA,KACH;AAEJ;","names":[]}
@@ -42,46 +42,28 @@ var import_content = require("./_components/content");
42
42
  var import_table_of_contents = require("./_components/table-of-contents");
43
43
  var import_bread_crumbs = require("../bread-crumbs");
44
44
  var import_dates = require("../../utils/dates");
45
- var import_script = __toESM(require("next/script"), 1);
45
+ var import_json_ld2 = require("../json-ld");
46
46
  const BlogPost = ({
47
47
  post,
48
- classNames = {}
48
+ classNames = {},
49
+ cta
49
50
  }) => {
50
51
  const content = post.content;
52
+ const breadcrumbItems = [];
53
+ if (post.folder) {
54
+ breadcrumbItems.push({
55
+ slugNoPrefixSlash: post.folder.slug,
56
+ name: post.folder.name
57
+ });
58
+ }
59
+ breadcrumbItems.push({
60
+ slugNoPrefixSlash: post.slug,
61
+ name: post.title
62
+ });
51
63
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
52
- post.faqs && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
53
- import_script.default,
54
- {
55
- strategy: "beforeInteractive",
56
- type: "application/ld+json",
57
- dangerouslySetInnerHTML: {
58
- __html: JSON.stringify((0, import_json_ld.genFaqJSONLD)(post.faqs)).replace(
59
- /</g,
60
- "\\u003c"
61
- )
62
- }
63
- }
64
- ),
65
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
66
- import_script.default,
67
- {
68
- strategy: "beforeInteractive",
69
- type: "application/ld+json",
70
- dangerouslySetInnerHTML: {
71
- __html: JSON.stringify((0, import_json_ld.genBlogPostingJSONLD)(post))
72
- }
73
- }
74
- ),
75
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
76
- import_script.default,
77
- {
78
- strategy: "beforeInteractive",
79
- type: "application/ld+json",
80
- dangerouslySetInnerHTML: {
81
- __html: JSON.stringify((0, import_json_ld.genBreadcrumbJSONLD)(post))
82
- }
83
- }
84
- ),
64
+ post.faqs && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_json_ld2.OpinlyJSONLD, { content: JSON.stringify((0, import_json_ld.genFaqJSONLD)(post.faqs)) }),
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_json_ld2.OpinlyJSONLD, { content: JSON.stringify((0, import_json_ld.genBlogPostingJSONLD)(post)) }),
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_json_ld2.OpinlyBreadCrumbJsonLd, { items: breadcrumbItems }),
85
67
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "max-w-7xl mx-auto px-4 py-24 flex items-start space-x-8", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-12 w-full", children: [
86
68
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
87
69
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -135,7 +117,8 @@ const BlogPost = ({
135
117
  {
136
118
  content,
137
119
  author: post.author,
138
- post
120
+ post,
121
+ cta
139
122
  }
140
123
  ) })
141
124
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/blog-post/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { JSONContent } from \"@tiptap/core\";\nimport Link from \"next/link\";\nimport { cn } from \"../../utils/merge\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\nimport { BlogPostRes } from \"./_types/blog-post\";\nimport {\n genBlogPostingJSONLD,\n genBreadcrumbJSONLD,\n genFaqJSONLD,\n} from \"./_helpers/json-ld\";\nimport { BlogComponentClassNames } from \"./_types/class-names\";\nimport { FAQS } from \"./_components/faq\";\nimport { calculateReadingTime } from \"./_helpers/reading-time\";\nimport { Content } from \"./_components/content\";\nimport { TableOfContents } from \"./_components/table-of-contents\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport { formatDate } from \"../../utils/dates\";\nimport Script from \"next/script\";\n\nexport const BlogPost = ({\n post,\n classNames = {},\n}: {\n post: BlogPostRes;\n classNames?: BlogComponentClassNames;\n notFoundComponent?: React.ReactNode;\n}) => {\n const content = post.content as JSONContent;\n\n return (\n <>\n {post.faqs && (\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genFaqJSONLD(post.faqs)).replace(\n /</g,\n \"\\\\u003c\"\n ),\n }}\n />\n )}\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genBlogPostingJSONLD(post)),\n }}\n />\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genBreadcrumbJSONLD(post)),\n }}\n />\n <div className=\"max-w-7xl mx-auto px-4 py-24 flex items-start space-x-8\">\n <div className=\"flex flex-col gap-12 w-full\">\n <div>\n <BreadCrumbs\n breadcrumbs={[\n post.folder && {\n url: `${opinlyConfig.blogPrefix}/${post.folder.slug}`,\n name: post.folder.name,\n },\n ]}\n />\n\n <h1 className=\"text-op-heading text-4xl font-bold mb-2 leading-tight\">\n {post.title}\n </h1>\n <div className=\"text-sm mb-4 text-op-muted space-x-1\">\n {post.author && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${post.author?.slug}`}\n className=\"font-medium\"\n >\n {post.author?.name}\n </Link>{\" \"}\n <span className=\"text-op-muted\">·</span>\n </>\n )}\n <span>\n {calculateReadingTime(content)} min read <span>·</span>\n </span>\n <span>\n {formatDate(post.firstPublishedAt as string) || \"Today\"}\n </span>\n </div>\n </div>\n\n <div\n className={cn(\n \"flex md:space-x-12 flex-col mx-auto w-full\",\n \"md:flex-row-reverse\",\n classNames.container\n )}\n >\n <article className=\"w-full md:w-3/4 order-2 md:order-1 flex items-start\">\n <div className=\"prose w-full \">\n <Content content={content} classNames={classNames} />\n <FAQS faqs={post.faqs} />\n </div>\n </article>\n <div className=\"flex md:w-1/4 md:sticky md:top-20\">\n <TableOfContents\n content={content}\n author={post.author}\n post={post}\n />\n </div>\n </div>\n </div>\n </div>\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCQ;AA/BR,kBAAiB;AACjB,mBAAmB;AACnB,wBAA6B;AAE7B,qBAIO;AAEP,iBAAqB;AACrB,0BAAqC;AACrC,qBAAwB;AACxB,+BAAgC;AAChC,0BAA4B;AAC5B,mBAA2B;AAC3B,oBAAmB;AAEZ,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,aAAa,CAAC;AAChB,MAIM;AACJ,QAAM,UAAU,KAAK;AAErB,SACE,4EACG;AAAA,SAAK,QACJ;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,cAAU,6BAAa,KAAK,IAAI,CAAC,EAAE;AAAA,YAC9C;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEF;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,cAAU,qCAAqB,IAAI,CAAC;AAAA,QACnD;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,cAAU,oCAAoB,IAAI,CAAC;AAAA,QAClD;AAAA;AAAA,IACF;AAAA,IACA,4CAAC,SAAI,WAAU,2DACb,uDAAC,SAAI,WAAU,+BACb;AAAA,mDAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa;AAAA,cACX,KAAK,UAAU;AAAA,gBACb,KAAK,GAAG,+BAAa,UAAU,IAAI,KAAK,OAAO,IAAI;AAAA,gBACnD,MAAM,KAAK,OAAO;AAAA,cACpB;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEA,4CAAC,QAAG,WAAU,yDACX,eAAK,OACR;AAAA,QACA,6CAAC,SAAI,WAAU,wCACZ;AAAA,eAAK,UACJ,4EACE;AAAA;AAAA,cAAC,YAAAC;AAAA,cAAA;AAAA,gBACC,MAAM,GAAG,+BAAa,UAAU,YAAY,KAAK,QAAQ,IAAI;AAAA,gBAC7D,WAAU;AAAA,gBAET,eAAK,QAAQ;AAAA;AAAA,YAChB;AAAA,YAAQ;AAAA,YACR,4CAAC,UAAK,WAAU,iBAAgB,kBAAC;AAAA,aACnC;AAAA,UAEF,6CAAC,UACE;AAAA,0DAAqB,OAAO;AAAA,YAAE;AAAA,YAAU,4CAAC,UAAK,kBAAC;AAAA,aAClD;AAAA,UACA,4CAAC,UACE,uCAAW,KAAK,gBAA0B,KAAK,SAClD;AAAA,WACF;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UACb;AAAA,UAEA;AAAA,wDAAC,aAAQ,WAAU,uDACjB,uDAAC,SAAI,WAAU,iBACb;AAAA,0DAAC,0BAAQ,SAAkB,YAAwB;AAAA,cACnD,4CAAC,mBAAK,MAAM,KAAK,MAAM;AAAA,eACzB,GACF;AAAA,YACA,4CAAC,SAAI,WAAU,qCACb;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,QAAQ,KAAK;AAAA,gBACb;AAAA;AAAA,YACF,GACF;AAAA;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":["Script","Link"]}
1
+ {"version":3,"sources":["../../../src/components/blog-post/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { JSONContent } from \"@tiptap/core\";\nimport Link from \"next/link\";\nimport { cn } from \"../../utils/merge\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\nimport { BlogPostRes } from \"./_types/blog-post\";\nimport { genBlogPostingJSONLD, genFaqJSONLD } from \"./_helpers/json-ld\";\nimport { BlogComponentClassNames } from \"./_types/class-names\";\nimport { FAQS } from \"./_components/faq\";\nimport { calculateReadingTime } from \"./_helpers/reading-time\";\nimport { Content } from \"./_components/content\";\nimport { TableOfContents } from \"./_components/table-of-contents\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport { formatDate } from \"../../utils/dates\";\nimport Script from \"next/script\";\nimport { OpinlyBreadCrumbJsonLd, OpinlyJSONLD } from \"../json-ld\";\n\nexport type BlogPostProps = {\n cta?: React.ReactNode;\n};\n\nexport const BlogPost = ({\n post,\n classNames = {},\n cta,\n}: {\n post: BlogPostRes;\n classNames?: BlogComponentClassNames;\n} & BlogPostProps) => {\n const content = post.content as JSONContent;\n\n const breadcrumbItems = [];\n\n if (post.folder) {\n breadcrumbItems.push({\n slugNoPrefixSlash: post.folder.slug,\n name: post.folder.name,\n });\n }\n\n breadcrumbItems.push({\n slugNoPrefixSlash: post.slug,\n name: post.title,\n });\n\n return (\n <>\n {post.faqs && (\n <OpinlyJSONLD content={JSON.stringify(genFaqJSONLD(post.faqs))} />\n )}\n <OpinlyJSONLD content={JSON.stringify(genBlogPostingJSONLD(post))} />\n <OpinlyBreadCrumbJsonLd items={breadcrumbItems} />\n <div className=\"max-w-7xl mx-auto px-4 py-24 flex items-start space-x-8\">\n <div className=\"flex flex-col gap-12 w-full\">\n <div>\n <BreadCrumbs\n breadcrumbs={[\n post.folder && {\n url: `${opinlyConfig.blogPrefix}/${post.folder.slug}`,\n name: post.folder.name,\n },\n ]}\n />\n\n <h1 className=\"text-op-heading text-4xl font-bold mb-2 leading-tight\">\n {post.title}\n </h1>\n <div className=\"text-sm mb-4 text-op-muted space-x-1\">\n {post.author && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${post.author?.slug}`}\n className=\"font-medium\"\n >\n {post.author?.name}\n </Link>{\" \"}\n <span className=\"text-op-muted\">·</span>\n </>\n )}\n <span>\n {calculateReadingTime(content)} min read <span>·</span>\n </span>\n <span>\n {formatDate(post.firstPublishedAt as string) || \"Today\"}\n </span>\n </div>\n </div>\n\n <div\n className={cn(\n \"flex md:space-x-12 flex-col mx-auto w-full\",\n \"md:flex-row-reverse\",\n classNames.container\n )}\n >\n <article className=\"w-full md:w-3/4 order-2 md:order-1 flex items-start\">\n <div className=\"prose w-full \">\n <Content content={content} classNames={classNames} />\n <FAQS faqs={post.faqs} />\n </div>\n </article>\n <div className=\"flex md:w-1/4 md:sticky md:top-20\">\n <TableOfContents\n content={content}\n author={post.author}\n post={post}\n cta={cta}\n />\n </div>\n </div>\n </div>\n </div>\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDQ;AA9CR,kBAAiB;AACjB,mBAAmB;AACnB,wBAA6B;AAE7B,qBAAmD;AAEnD,iBAAqB;AACrB,0BAAqC;AACrC,qBAAwB;AACxB,+BAAgC;AAChC,0BAA4B;AAC5B,mBAA2B;AAE3B,IAAAA,kBAAqD;AAM9C,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,aAAa,CAAC;AAAA,EACd;AACF,MAGsB;AACpB,QAAM,UAAU,KAAK;AAErB,QAAM,kBAAkB,CAAC;AAEzB,MAAI,KAAK,QAAQ;AACf,oBAAgB,KAAK;AAAA,MACnB,mBAAmB,KAAK,OAAO;AAAA,MAC/B,MAAM,KAAK,OAAO;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,kBAAgB,KAAK;AAAA,IACnB,mBAAmB,KAAK;AAAA,IACxB,MAAM,KAAK;AAAA,EACb,CAAC;AAED,SACE,4EACG;AAAA,SAAK,QACJ,4CAAC,gCAAa,SAAS,KAAK,cAAU,6BAAa,KAAK,IAAI,CAAC,GAAG;AAAA,IAElE,4CAAC,gCAAa,SAAS,KAAK,cAAU,qCAAqB,IAAI,CAAC,GAAG;AAAA,IACnE,4CAAC,0CAAuB,OAAO,iBAAiB;AAAA,IAChD,4CAAC,SAAI,WAAU,2DACb,uDAAC,SAAI,WAAU,+BACb;AAAA,mDAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa;AAAA,cACX,KAAK,UAAU;AAAA,gBACb,KAAK,GAAG,+BAAa,UAAU,IAAI,KAAK,OAAO,IAAI;AAAA,gBACnD,MAAM,KAAK,OAAO;AAAA,cACpB;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEA,4CAAC,QAAG,WAAU,yDACX,eAAK,OACR;AAAA,QACA,6CAAC,SAAI,WAAU,wCACZ;AAAA,eAAK,UACJ,4EACE;AAAA;AAAA,cAAC,YAAAC;AAAA,cAAA;AAAA,gBACC,MAAM,GAAG,+BAAa,UAAU,YAAY,KAAK,QAAQ,IAAI;AAAA,gBAC7D,WAAU;AAAA,gBAET,eAAK,QAAQ;AAAA;AAAA,YAChB;AAAA,YAAQ;AAAA,YACR,4CAAC,UAAK,WAAU,iBAAgB,kBAAC;AAAA,aACnC;AAAA,UAEF,6CAAC,UACE;AAAA,0DAAqB,OAAO;AAAA,YAAE;AAAA,YAAU,4CAAC,UAAK,kBAAC;AAAA,aAClD;AAAA,UACA,4CAAC,UACE,uCAAW,KAAK,gBAA0B,KAAK,SAClD;AAAA,WACF;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UACb;AAAA,UAEA;AAAA,wDAAC,aAAQ,WAAU,uDACjB,uDAAC,SAAI,WAAU,iBACb;AAAA,0DAAC,0BAAQ,SAAkB,YAAwB;AAAA,cACnD,4CAAC,mBAAK,MAAM,KAAK,MAAM;AAAA,eACzB,GACF;AAAA,YACA,4CAAC,SAAI,WAAU,qCACb;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,QAAQ,KAAK;AAAA,gBACb;AAAA,gBACA;AAAA;AAAA,YACF,GACF;AAAA;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":["import_json_ld","Link"]}
@@ -4,10 +4,12 @@ import { BlogPostRes } from './_types/blog-post.cjs';
4
4
  import { BlogComponentClassNames } from './_types/class-names.cjs';
5
5
  import '@opinly/backend';
6
6
 
7
- declare const BlogPost: ({ post, classNames, }: {
7
+ type BlogPostProps = {
8
+ cta?: React.ReactNode;
9
+ };
10
+ declare const BlogPost: ({ post, classNames, cta, }: {
8
11
  post: BlogPostRes;
9
12
  classNames?: BlogComponentClassNames;
10
- notFoundComponent?: React.ReactNode;
11
- }) => react_jsx_runtime.JSX.Element;
13
+ } & BlogPostProps) => react_jsx_runtime.JSX.Element;
12
14
 
13
- export { BlogPost };
15
+ export { BlogPost, type BlogPostProps };
@@ -4,10 +4,12 @@ import { BlogPostRes } from './_types/blog-post.js';
4
4
  import { BlogComponentClassNames } from './_types/class-names.js';
5
5
  import '@opinly/backend';
6
6
 
7
- declare const BlogPost: ({ post, classNames, }: {
7
+ type BlogPostProps = {
8
+ cta?: React.ReactNode;
9
+ };
10
+ declare const BlogPost: ({ post, classNames, cta, }: {
8
11
  post: BlogPostRes;
9
12
  classNames?: BlogComponentClassNames;
10
- notFoundComponent?: React.ReactNode;
11
- }) => react_jsx_runtime.JSX.Element;
13
+ } & BlogPostProps) => react_jsx_runtime.JSX.Element;
12
14
 
13
- export { BlogPost };
15
+ export { BlogPost, type BlogPostProps };
@@ -2,57 +2,35 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
2
  import Link from "next/link";
3
3
  import { cn } from "../../utils/merge";
4
4
  import { opinlyConfig } from "../../utils/sdk-config";
5
- import {
6
- genBlogPostingJSONLD,
7
- genBreadcrumbJSONLD,
8
- genFaqJSONLD
9
- } from "./_helpers/json-ld";
5
+ import { genBlogPostingJSONLD, genFaqJSONLD } from "./_helpers/json-ld";
10
6
  import { FAQS } from "./_components/faq";
11
7
  import { calculateReadingTime } from "./_helpers/reading-time";
12
8
  import { Content } from "./_components/content";
13
9
  import { TableOfContents } from "./_components/table-of-contents";
14
10
  import { BreadCrumbs } from "../bread-crumbs";
15
11
  import { formatDate } from "../../utils/dates";
16
- import Script from "next/script";
12
+ import { OpinlyBreadCrumbJsonLd, OpinlyJSONLD } from "../json-ld";
17
13
  const BlogPost = ({
18
14
  post,
19
- classNames = {}
15
+ classNames = {},
16
+ cta
20
17
  }) => {
21
18
  const content = post.content;
19
+ const breadcrumbItems = [];
20
+ if (post.folder) {
21
+ breadcrumbItems.push({
22
+ slugNoPrefixSlash: post.folder.slug,
23
+ name: post.folder.name
24
+ });
25
+ }
26
+ breadcrumbItems.push({
27
+ slugNoPrefixSlash: post.slug,
28
+ name: post.title
29
+ });
22
30
  return /* @__PURE__ */ jsxs(Fragment, { children: [
23
- post.faqs && /* @__PURE__ */ jsx(
24
- Script,
25
- {
26
- strategy: "beforeInteractive",
27
- type: "application/ld+json",
28
- dangerouslySetInnerHTML: {
29
- __html: JSON.stringify(genFaqJSONLD(post.faqs)).replace(
30
- /</g,
31
- "\\u003c"
32
- )
33
- }
34
- }
35
- ),
36
- /* @__PURE__ */ jsx(
37
- Script,
38
- {
39
- strategy: "beforeInteractive",
40
- type: "application/ld+json",
41
- dangerouslySetInnerHTML: {
42
- __html: JSON.stringify(genBlogPostingJSONLD(post))
43
- }
44
- }
45
- ),
46
- /* @__PURE__ */ jsx(
47
- Script,
48
- {
49
- strategy: "beforeInteractive",
50
- type: "application/ld+json",
51
- dangerouslySetInnerHTML: {
52
- __html: JSON.stringify(genBreadcrumbJSONLD(post))
53
- }
54
- }
55
- ),
31
+ post.faqs && /* @__PURE__ */ jsx(OpinlyJSONLD, { content: JSON.stringify(genFaqJSONLD(post.faqs)) }),
32
+ /* @__PURE__ */ jsx(OpinlyJSONLD, { content: JSON.stringify(genBlogPostingJSONLD(post)) }),
33
+ /* @__PURE__ */ jsx(OpinlyBreadCrumbJsonLd, { items: breadcrumbItems }),
56
34
  /* @__PURE__ */ jsx("div", { className: "max-w-7xl mx-auto px-4 py-24 flex items-start space-x-8", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-12 w-full", children: [
57
35
  /* @__PURE__ */ jsxs("div", { children: [
58
36
  /* @__PURE__ */ jsx(
@@ -106,7 +84,8 @@ const BlogPost = ({
106
84
  {
107
85
  content,
108
86
  author: post.author,
109
- post
87
+ post,
88
+ cta
110
89
  }
111
90
  ) })
112
91
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/blog-post/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { JSONContent } from \"@tiptap/core\";\nimport Link from \"next/link\";\nimport { cn } from \"../../utils/merge\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\nimport { BlogPostRes } from \"./_types/blog-post\";\nimport {\n genBlogPostingJSONLD,\n genBreadcrumbJSONLD,\n genFaqJSONLD,\n} from \"./_helpers/json-ld\";\nimport { BlogComponentClassNames } from \"./_types/class-names\";\nimport { FAQS } from \"./_components/faq\";\nimport { calculateReadingTime } from \"./_helpers/reading-time\";\nimport { Content } from \"./_components/content\";\nimport { TableOfContents } from \"./_components/table-of-contents\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport { formatDate } from \"../../utils/dates\";\nimport Script from \"next/script\";\n\nexport const BlogPost = ({\n post,\n classNames = {},\n}: {\n post: BlogPostRes;\n classNames?: BlogComponentClassNames;\n notFoundComponent?: React.ReactNode;\n}) => {\n const content = post.content as JSONContent;\n\n return (\n <>\n {post.faqs && (\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genFaqJSONLD(post.faqs)).replace(\n /</g,\n \"\\\\u003c\"\n ),\n }}\n />\n )}\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genBlogPostingJSONLD(post)),\n }}\n />\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genBreadcrumbJSONLD(post)),\n }}\n />\n <div className=\"max-w-7xl mx-auto px-4 py-24 flex items-start space-x-8\">\n <div className=\"flex flex-col gap-12 w-full\">\n <div>\n <BreadCrumbs\n breadcrumbs={[\n post.folder && {\n url: `${opinlyConfig.blogPrefix}/${post.folder.slug}`,\n name: post.folder.name,\n },\n ]}\n />\n\n <h1 className=\"text-op-heading text-4xl font-bold mb-2 leading-tight\">\n {post.title}\n </h1>\n <div className=\"text-sm mb-4 text-op-muted space-x-1\">\n {post.author && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${post.author?.slug}`}\n className=\"font-medium\"\n >\n {post.author?.name}\n </Link>{\" \"}\n <span className=\"text-op-muted\">·</span>\n </>\n )}\n <span>\n {calculateReadingTime(content)} min read <span>·</span>\n </span>\n <span>\n {formatDate(post.firstPublishedAt as string) || \"Today\"}\n </span>\n </div>\n </div>\n\n <div\n className={cn(\n \"flex md:space-x-12 flex-col mx-auto w-full\",\n \"md:flex-row-reverse\",\n classNames.container\n )}\n >\n <article className=\"w-full md:w-3/4 order-2 md:order-1 flex items-start\">\n <div className=\"prose w-full \">\n <Content content={content} classNames={classNames} />\n <FAQS faqs={post.faqs} />\n </div>\n </article>\n <div className=\"flex md:w-1/4 md:sticky md:top-20\">\n <TableOfContents\n content={content}\n author={post.author}\n post={post}\n />\n </div>\n </div>\n </div>\n </div>\n </>\n );\n};\n"],"mappings":"AAiCQ,SA0CQ,UA1CR,KA0CQ,YA1CR;AA/BR,OAAO,UAAU;AACjB,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAE7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,YAAY;AACrB,SAAS,4BAA4B;AACrC,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,OAAO,YAAY;AAEZ,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,aAAa,CAAC;AAChB,MAIM;AACJ,QAAM,UAAU,KAAK;AAErB,SACE,iCACG;AAAA,SAAK,QACJ;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,UAAU,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,YAC9C;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,UAAU,qBAAqB,IAAI,CAAC;AAAA,QACnD;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,UAAU,oBAAoB,IAAI,CAAC;AAAA,QAClD;AAAA;AAAA,IACF;AAAA,IACA,oBAAC,SAAI,WAAU,2DACb,+BAAC,SAAI,WAAU,+BACb;AAAA,2BAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa;AAAA,cACX,KAAK,UAAU;AAAA,gBACb,KAAK,GAAG,aAAa,UAAU,IAAI,KAAK,OAAO,IAAI;AAAA,gBACnD,MAAM,KAAK,OAAO;AAAA,cACpB;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEA,oBAAC,QAAG,WAAU,yDACX,eAAK,OACR;AAAA,QACA,qBAAC,SAAI,WAAU,wCACZ;AAAA,eAAK,UACJ,iCACE;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,GAAG,aAAa,UAAU,YAAY,KAAK,QAAQ,IAAI;AAAA,gBAC7D,WAAU;AAAA,gBAET,eAAK,QAAQ;AAAA;AAAA,YAChB;AAAA,YAAQ;AAAA,YACR,oBAAC,UAAK,WAAU,iBAAgB,kBAAC;AAAA,aACnC;AAAA,UAEF,qBAAC,UACE;AAAA,iCAAqB,OAAO;AAAA,YAAE;AAAA,YAAU,oBAAC,UAAK,kBAAC;AAAA,aAClD;AAAA,UACA,oBAAC,UACE,qBAAW,KAAK,gBAA0B,KAAK,SAClD;AAAA,WACF;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UACb;AAAA,UAEA;AAAA,gCAAC,aAAQ,WAAU,uDACjB,+BAAC,SAAI,WAAU,iBACb;AAAA,kCAAC,WAAQ,SAAkB,YAAwB;AAAA,cACnD,oBAAC,QAAK,MAAM,KAAK,MAAM;AAAA,eACzB,GACF;AAAA,YACA,oBAAC,SAAI,WAAU,qCACb;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,QAAQ,KAAK;AAAA,gBACb;AAAA;AAAA,YACF,GACF;AAAA;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/blog-post/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { JSONContent } from \"@tiptap/core\";\nimport Link from \"next/link\";\nimport { cn } from \"../../utils/merge\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\nimport { BlogPostRes } from \"./_types/blog-post\";\nimport { genBlogPostingJSONLD, genFaqJSONLD } from \"./_helpers/json-ld\";\nimport { BlogComponentClassNames } from \"./_types/class-names\";\nimport { FAQS } from \"./_components/faq\";\nimport { calculateReadingTime } from \"./_helpers/reading-time\";\nimport { Content } from \"./_components/content\";\nimport { TableOfContents } from \"./_components/table-of-contents\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport { formatDate } from \"../../utils/dates\";\nimport Script from \"next/script\";\nimport { OpinlyBreadCrumbJsonLd, OpinlyJSONLD } from \"../json-ld\";\n\nexport type BlogPostProps = {\n cta?: React.ReactNode;\n};\n\nexport const BlogPost = ({\n post,\n classNames = {},\n cta,\n}: {\n post: BlogPostRes;\n classNames?: BlogComponentClassNames;\n} & BlogPostProps) => {\n const content = post.content as JSONContent;\n\n const breadcrumbItems = [];\n\n if (post.folder) {\n breadcrumbItems.push({\n slugNoPrefixSlash: post.folder.slug,\n name: post.folder.name,\n });\n }\n\n breadcrumbItems.push({\n slugNoPrefixSlash: post.slug,\n name: post.title,\n });\n\n return (\n <>\n {post.faqs && (\n <OpinlyJSONLD content={JSON.stringify(genFaqJSONLD(post.faqs))} />\n )}\n <OpinlyJSONLD content={JSON.stringify(genBlogPostingJSONLD(post))} />\n <OpinlyBreadCrumbJsonLd items={breadcrumbItems} />\n <div className=\"max-w-7xl mx-auto px-4 py-24 flex items-start space-x-8\">\n <div className=\"flex flex-col gap-12 w-full\">\n <div>\n <BreadCrumbs\n breadcrumbs={[\n post.folder && {\n url: `${opinlyConfig.blogPrefix}/${post.folder.slug}`,\n name: post.folder.name,\n },\n ]}\n />\n\n <h1 className=\"text-op-heading text-4xl font-bold mb-2 leading-tight\">\n {post.title}\n </h1>\n <div className=\"text-sm mb-4 text-op-muted space-x-1\">\n {post.author && (\n <>\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${post.author?.slug}`}\n className=\"font-medium\"\n >\n {post.author?.name}\n </Link>{\" \"}\n <span className=\"text-op-muted\">·</span>\n </>\n )}\n <span>\n {calculateReadingTime(content)} min read <span>·</span>\n </span>\n <span>\n {formatDate(post.firstPublishedAt as string) || \"Today\"}\n </span>\n </div>\n </div>\n\n <div\n className={cn(\n \"flex md:space-x-12 flex-col mx-auto w-full\",\n \"md:flex-row-reverse\",\n classNames.container\n )}\n >\n <article className=\"w-full md:w-3/4 order-2 md:order-1 flex items-start\">\n <div className=\"prose w-full \">\n <Content content={content} classNames={classNames} />\n <FAQS faqs={post.faqs} />\n </div>\n </article>\n <div className=\"flex md:w-1/4 md:sticky md:top-20\">\n <TableOfContents\n content={content}\n author={post.author}\n post={post}\n cta={cta}\n />\n </div>\n </div>\n </div>\n </div>\n </>\n );\n};\n"],"mappings":"AAgDQ,SAqBQ,UArBR,KAqBQ,YArBR;AA9CR,OAAO,UAAU;AACjB,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAE7B,SAAS,sBAAsB,oBAAoB;AAEnD,SAAS,YAAY;AACrB,SAAS,4BAA4B;AACrC,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAE3B,SAAS,wBAAwB,oBAAoB;AAM9C,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,aAAa,CAAC;AAAA,EACd;AACF,MAGsB;AACpB,QAAM,UAAU,KAAK;AAErB,QAAM,kBAAkB,CAAC;AAEzB,MAAI,KAAK,QAAQ;AACf,oBAAgB,KAAK;AAAA,MACnB,mBAAmB,KAAK,OAAO;AAAA,MAC/B,MAAM,KAAK,OAAO;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,kBAAgB,KAAK;AAAA,IACnB,mBAAmB,KAAK;AAAA,IACxB,MAAM,KAAK;AAAA,EACb,CAAC;AAED,SACE,iCACG;AAAA,SAAK,QACJ,oBAAC,gBAAa,SAAS,KAAK,UAAU,aAAa,KAAK,IAAI,CAAC,GAAG;AAAA,IAElE,oBAAC,gBAAa,SAAS,KAAK,UAAU,qBAAqB,IAAI,CAAC,GAAG;AAAA,IACnE,oBAAC,0BAAuB,OAAO,iBAAiB;AAAA,IAChD,oBAAC,SAAI,WAAU,2DACb,+BAAC,SAAI,WAAU,+BACb;AAAA,2BAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa;AAAA,cACX,KAAK,UAAU;AAAA,gBACb,KAAK,GAAG,aAAa,UAAU,IAAI,KAAK,OAAO,IAAI;AAAA,gBACnD,MAAM,KAAK,OAAO;AAAA,cACpB;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEA,oBAAC,QAAG,WAAU,yDACX,eAAK,OACR;AAAA,QACA,qBAAC,SAAI,WAAU,wCACZ;AAAA,eAAK,UACJ,iCACE;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,GAAG,aAAa,UAAU,YAAY,KAAK,QAAQ,IAAI;AAAA,gBAC7D,WAAU;AAAA,gBAET,eAAK,QAAQ;AAAA;AAAA,YAChB;AAAA,YAAQ;AAAA,YACR,oBAAC,UAAK,WAAU,iBAAgB,kBAAC;AAAA,aACnC;AAAA,UAEF,qBAAC,UACE;AAAA,iCAAqB,OAAO;AAAA,YAAE;AAAA,YAAU,oBAAC,UAAK,kBAAC;AAAA,aAClD;AAAA,UACA,oBAAC,UACE,qBAAW,KAAK,gBAA0B,KAAK,SAClD;AAAA,WACF;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UACb;AAAA,UAEA;AAAA,gCAAC,aAAQ,WAAU,uDACjB,+BAAC,SAAI,WAAU,iBACb;AAAA,kCAAC,WAAQ,SAAkB,YAAwB;AAAA,cACnD,oBAAC,QAAK,MAAM,KAAK,MAAM;AAAA,eACzB,GACF;AAAA,YACA,oBAAC,SAAI,WAAU,qCACb;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,QAAQ,KAAK;AAAA,gBACb;AAAA,gBACA;AAAA;AAAA,YACF,GACF;AAAA;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var json_ld_exports = {};
20
+ __export(json_ld_exports, {
21
+ folderCollectionJSONLD: () => folderCollectionJSONLD
22
+ });
23
+ module.exports = __toCommonJS(json_ld_exports);
24
+ var import_sdk_config = require("../../../utils/sdk-config");
25
+ const folderCollectionJSONLD = (folder) => {
26
+ const jsonLD = {
27
+ "@context": "https://schema.org",
28
+ "@type": "CollectionPage",
29
+ name: folder.name,
30
+ description: folder.description || `Explore articles in ${folder.name}.`,
31
+ url: `${import_sdk_config.opinlyConfig.blogUrl}/${folder.slug}`,
32
+ publisher: {
33
+ "@type": "Organization",
34
+ name: import_sdk_config.opinlyConfig.siteName
35
+ }
36
+ };
37
+ return JSON.stringify(jsonLD);
38
+ };
39
+ // Annotate the CommonJS export names for ESM import in node:
40
+ 0 && (module.exports = {
41
+ folderCollectionJSONLD
42
+ });
43
+ //# sourceMappingURL=json-ld.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/folder-page/_helpers/json-ld.ts"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport { CollectionPage, WithContext } from \"schema-dts\";\nimport { opinlyConfig } from \"../../../utils/sdk-config\";\n\ntype FolderRes = Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"folder\" }\n>[\"data\"];\n\nexport const folderCollectionJSONLD = (folder: FolderRes) => {\n const jsonLD: WithContext<CollectionPage> = {\n \"@context\": \"https://schema.org\",\n \"@type\": \"CollectionPage\",\n name: folder.name,\n description: folder.description || `Explore articles in ${folder.name}.`,\n url: `${opinlyConfig.blogUrl}/${folder.slug}`,\n publisher: {\n \"@type\": \"Organization\",\n name: opinlyConfig.siteName,\n },\n };\n\n return JSON.stringify(jsonLD);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,wBAA6B;AAOtB,MAAM,yBAAyB,CAAC,WAAsB;AAC3D,QAAM,SAAsC;AAAA,IAC1C,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,MAAM,OAAO;AAAA,IACb,aAAa,OAAO,eAAe,uBAAuB,OAAO,IAAI;AAAA,IACrE,KAAK,GAAG,+BAAa,OAAO,IAAI,OAAO,IAAI;AAAA,IAC3C,WAAW;AAAA,MACT,SAAS;AAAA,MACT,MAAM,+BAAa;AAAA,IACrB;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,MAAM;AAC9B;","names":[]}
@@ -0,0 +1,8 @@
1
+ import { Opinly } from '@opinly/backend';
2
+
3
+ type FolderRes = Extract<Awaited<ReturnType<Opinly["content"]["blog"]>>, {
4
+ type: "folder";
5
+ }>["data"];
6
+ declare const folderCollectionJSONLD: (folder: FolderRes) => string;
7
+
8
+ export { folderCollectionJSONLD };
@@ -0,0 +1,8 @@
1
+ import { Opinly } from '@opinly/backend';
2
+
3
+ type FolderRes = Extract<Awaited<ReturnType<Opinly["content"]["blog"]>>, {
4
+ type: "folder";
5
+ }>["data"];
6
+ declare const folderCollectionJSONLD: (folder: FolderRes) => string;
7
+
8
+ export { folderCollectionJSONLD };