@opinly/next 0.1.21 → 0.1.23

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 (57) 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/index.cjs +15 -34
  22. package/dist/components/blog-post/index.cjs.map +1 -1
  23. package/dist/components/blog-post/index.js +16 -39
  24. package/dist/components/blog-post/index.js.map +1 -1
  25. package/dist/components/folder-page/_helpers/json-ld.cjs +43 -0
  26. package/dist/components/folder-page/_helpers/json-ld.cjs.map +1 -0
  27. package/dist/components/folder-page/_helpers/json-ld.d.cts +8 -0
  28. package/dist/components/folder-page/_helpers/json-ld.d.ts +8 -0
  29. package/dist/components/folder-page/_helpers/json-ld.js +19 -0
  30. package/dist/components/folder-page/_helpers/json-ld.js.map +1 -0
  31. package/dist/components/folder-page/index.cjs +5 -17
  32. package/dist/components/folder-page/index.cjs.map +1 -1
  33. package/dist/components/folder-page/index.js +5 -17
  34. package/dist/components/folder-page/index.js.map +1 -1
  35. package/dist/components/home-page/_helpers/json-ld.cjs +43 -0
  36. package/dist/components/home-page/_helpers/json-ld.cjs.map +1 -0
  37. package/dist/components/home-page/_helpers/json-ld.d.cts +3 -0
  38. package/dist/components/home-page/_helpers/json-ld.d.ts +3 -0
  39. package/dist/components/home-page/_helpers/json-ld.js +19 -0
  40. package/dist/components/home-page/_helpers/json-ld.js.map +1 -0
  41. package/dist/components/home-page/index.cjs +9 -4
  42. package/dist/components/home-page/index.cjs.map +1 -1
  43. package/dist/components/home-page/index.js +10 -5
  44. package/dist/components/home-page/index.js.map +1 -1
  45. package/dist/components/json-ld.cjs +92 -0
  46. package/dist/components/json-ld.cjs.map +1 -0
  47. package/dist/components/json-ld.d.cts +13 -0
  48. package/dist/components/json-ld.d.ts +13 -0
  49. package/dist/components/json-ld.js +57 -0
  50. package/dist/components/json-ld.js.map +1 -0
  51. package/dist/utils/json-ld.cjs +2 -0
  52. package/dist/utils/json-ld.cjs.map +1 -0
  53. package/dist/utils/json-ld.d.cts +2 -0
  54. package/dist/utils/json-ld.d.ts +2 -0
  55. package/dist/utils/json-ld.js +1 -0
  56. package/dist/utils/json-ld.js.map +1 -0
  57. 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":[]}
@@ -42,46 +42,27 @@ 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
48
  classNames = {}
49
49
  }) => {
50
50
  const content = post.content;
51
+ const breadcrumbItems = [];
52
+ if (post.folder) {
53
+ breadcrumbItems.push({
54
+ slugNoPrefixSlash: post.folder.slug,
55
+ name: post.folder.name
56
+ });
57
+ }
58
+ breadcrumbItems.push({
59
+ slugNoPrefixSlash: post.slug,
60
+ name: post.title
61
+ });
51
62
  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
- ),
63
+ post.faqs && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_json_ld2.OpinlyJSONLD, { content: JSON.stringify((0, import_json_ld.genFaqJSONLD)(post.faqs)) }),
64
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_json_ld2.OpinlyJSONLD, { content: JSON.stringify((0, import_json_ld.genBlogPostingJSONLD)(post)) }),
65
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_json_ld2.OpinlyBreadCrumbJsonLd, { items: breadcrumbItems }),
85
66
  /* @__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
67
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
87
68
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -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 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 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 />\n </div>\n </div>\n </div>\n </div>\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4CQ;AA1CR,kBAAiB;AACjB,mBAAmB;AACnB,wBAA6B;AAE7B,qBAAmD;AAEnD,iBAAqB;AACrB,0BAAqC;AACrC,qBAAwB;AACxB,+BAAgC;AAChC,0BAA4B;AAC5B,mBAA2B;AAE3B,IAAAA,kBAAqD;AAE9C,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,aAAa,CAAC;AAChB,MAIM;AACJ,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;AAAA,YACF,GACF;AAAA;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":["import_json_ld","Link"]}
@@ -2,57 +2,34 @@ 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
15
  classNames = {}
20
16
  }) => {
21
17
  const content = post.content;
18
+ const breadcrumbItems = [];
19
+ if (post.folder) {
20
+ breadcrumbItems.push({
21
+ slugNoPrefixSlash: post.folder.slug,
22
+ name: post.folder.name
23
+ });
24
+ }
25
+ breadcrumbItems.push({
26
+ slugNoPrefixSlash: post.slug,
27
+ name: post.title
28
+ });
22
29
  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
- ),
30
+ post.faqs && /* @__PURE__ */ jsx(OpinlyJSONLD, { content: JSON.stringify(genFaqJSONLD(post.faqs)) }),
31
+ /* @__PURE__ */ jsx(OpinlyJSONLD, { content: JSON.stringify(genBlogPostingJSONLD(post)) }),
32
+ /* @__PURE__ */ jsx(OpinlyBreadCrumbJsonLd, { items: breadcrumbItems }),
56
33
  /* @__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
34
  /* @__PURE__ */ jsxs("div", { children: [
58
35
  /* @__PURE__ */ jsx(
@@ -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 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 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 />\n </div>\n </div>\n </div>\n </div>\n </>\n );\n};\n"],"mappings":"AA4CQ,SAqBQ,UArBR,KAqBQ,YArBR;AA1CR,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;AAE9C,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,aAAa,CAAC;AAChB,MAIM;AACJ,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;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 };
@@ -0,0 +1,19 @@
1
+ import { opinlyConfig } from "../../../utils/sdk-config";
2
+ const folderCollectionJSONLD = (folder) => {
3
+ const jsonLD = {
4
+ "@context": "https://schema.org",
5
+ "@type": "CollectionPage",
6
+ name: folder.name,
7
+ description: folder.description || `Explore articles in ${folder.name}.`,
8
+ url: `${opinlyConfig.blogUrl}/${folder.slug}`,
9
+ publisher: {
10
+ "@type": "Organization",
11
+ name: opinlyConfig.siteName
12
+ }
13
+ };
14
+ return JSON.stringify(jsonLD);
15
+ };
16
+ export {
17
+ folderCollectionJSONLD
18
+ };
19
+ //# sourceMappingURL=json-ld.js.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":"AAEA,SAAS,oBAAoB;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,aAAa,OAAO,IAAI,OAAO,IAAI;AAAA,IAC3C,WAAW;AAAA,MACT,SAAS;AAAA,MACT,MAAM,aAAa;AAAA,IACrB;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,MAAM;AAC9B;","names":[]}
@@ -24,31 +24,19 @@ module.exports = __toCommonJS(folder_page_exports);
24
24
  var import_jsx_runtime = require("react/jsx-runtime");
25
25
  var import_post_preview = require("../post-preview");
26
26
  var import_bread_crumbs = require("../bread-crumbs");
27
- var import_next_seo = require("next-seo");
28
27
  var import_sdk_config = require("../../utils/sdk-config");
28
+ var import_json_ld = require("../json-ld");
29
29
  const FolderPage = ({
30
30
  folder
31
31
  }) => {
32
32
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
33
33
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
34
- import_next_seo.BreadcrumbJsonLd,
34
+ import_json_ld.OpinlyBreadCrumbJsonLd,
35
35
  {
36
- useAppDir: !import_sdk_config.opinlyConfig.pagesRouter,
37
- itemListElements: [
36
+ items: [
38
37
  {
39
- position: 1,
40
- name: import_sdk_config.opinlyConfig.siteName,
41
- item: `${import_sdk_config.opinlyConfig.siteUrl}`
42
- },
43
- {
44
- position: 2,
45
- name: "Blog",
46
- item: import_sdk_config.opinlyConfig.blogUrl
47
- },
48
- {
49
- position: 3,
50
- name: folder.name,
51
- item: `${import_sdk_config.opinlyConfig.blogUrl}/${folder.slug}`
38
+ slugNoPrefixSlash: folder.slug,
39
+ name: folder.name
52
40
  }
53
41
  ]
54
42
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/folder-page/index.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport { PostPreview } from \"../post-preview\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport { BreadcrumbJsonLd } from \"next-seo\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\n\nexport const FolderPage = ({\n folder,\n}: {\n folder: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"folder\" }\n >[\"data\"];\n}) => {\n return (\n <>\n <BreadcrumbJsonLd\n useAppDir={!opinlyConfig.pagesRouter}\n itemListElements={[\n {\n position: 1,\n name: opinlyConfig.siteName,\n item: `${opinlyConfig.siteUrl}`,\n },\n {\n position: 2,\n name: \"Blog\",\n item: opinlyConfig.blogUrl,\n },\n {\n position: 3,\n name: folder.name,\n item: `${opinlyConfig.blogUrl}/${folder.slug}`,\n },\n ]}\n />\n\n <div className=\"max-w-6xl mx-auto px-4 py-10\">\n <BreadCrumbs\n breadcrumbs={[\n {\n name: folder.name,\n url: `${opinlyConfig.blogUrl}/${folder.slug}`,\n },\n ]}\n />\n\n <h1 className=\"text-4xl font-bold mb-2\">{folder.name}</h1>\n <p className=\"text-muted-foreground max-w-2xl mb-8\">\n {folder.description || `Explore articles about ${folder.name}.`}\n </p>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8\">\n {folder.posts.length === 0 && (\n <div className=\"text-muted-foreground\">No posts added yet</div>\n )}\n {folder.posts.map((post) => {\n return <PostPreview key={post.slug} post={post} />;\n })}\n </div>\n </div>\n </>\n );\n};\n\nfunction formatDate(dateStr: string) {\n return new Date(dateStr).toLocaleDateString(\"en-GB\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n });\n}\n\nfunction formatMinutes(description: string | null) {\n // Fake estimate based on length of description\n if (!description) return \"5 min read\";\n const words = description.split(\" \").length;\n const mins = Math.ceil(words / 200);\n return `${mins} min read`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAeI;AAdJ,0BAA4B;AAC5B,0BAA4B;AAC5B,sBAAiC;AACjC,wBAA6B;AAEtB,MAAM,aAAa,CAAC;AAAA,EACzB;AACF,MAKM;AACJ,SACE,4EACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,CAAC,+BAAa;AAAA,QACzB,kBAAkB;AAAA,UAChB;AAAA,YACE,UAAU;AAAA,YACV,MAAM,+BAAa;AAAA,YACnB,MAAM,GAAG,+BAAa,OAAO;AAAA,UAC/B;AAAA,UACA;AAAA,YACE,UAAU;AAAA,YACV,MAAM;AAAA,YACN,MAAM,+BAAa;AAAA,UACrB;AAAA,UACA;AAAA,YACE,UAAU;AAAA,YACV,MAAM,OAAO;AAAA,YACb,MAAM,GAAG,+BAAa,OAAO,IAAI,OAAO,IAAI;AAAA,UAC9C;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEA,6CAAC,SAAI,WAAU,gCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAa;AAAA,YACX;AAAA,cACE,MAAM,OAAO;AAAA,cACb,KAAK,GAAG,+BAAa,OAAO,IAAI,OAAO,IAAI;AAAA,YAC7C;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MAEA,4CAAC,QAAG,WAAU,2BAA2B,iBAAO,MAAK;AAAA,MACrD,4CAAC,OAAE,WAAU,wCACV,iBAAO,eAAe,0BAA0B,OAAO,IAAI,KAC9D;AAAA,MAEA,6CAAC,SAAI,WAAU,wDACZ;AAAA,eAAO,MAAM,WAAW,KACvB,4CAAC,SAAI,WAAU,yBAAwB,gCAAkB;AAAA,QAE1D,OAAO,MAAM,IAAI,CAAC,SAAS;AAC1B,iBAAO,4CAAC,mCAA4B,QAAX,KAAK,IAAkB;AAAA,QAClD,CAAC;AAAA,SACH;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW,SAAiB;AACnC,SAAO,IAAI,KAAK,OAAO,EAAE,mBAAmB,SAAS;AAAA,IACnD,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACH;AAEA,SAAS,cAAc,aAA4B;AAEjD,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,QAAQ,YAAY,MAAM,GAAG,EAAE;AACrC,QAAM,OAAO,KAAK,KAAK,QAAQ,GAAG;AAClC,SAAO,GAAG,IAAI;AAChB;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/folder-page/index.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport { PostPreview } from \"../post-preview\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport { BreadcrumbJsonLd } from \"next-seo\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\nimport { OpinlyBreadCrumbJsonLd } from \"../json-ld\";\n\nexport const FolderPage = ({\n folder,\n}: {\n folder: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"folder\" }\n >[\"data\"];\n}) => {\n return (\n <>\n <OpinlyBreadCrumbJsonLd\n items={[\n {\n slugNoPrefixSlash: folder.slug,\n name: folder.name,\n },\n ]}\n />\n\n <div className=\"max-w-6xl mx-auto px-4 py-10\">\n <BreadCrumbs\n breadcrumbs={[\n {\n name: folder.name,\n url: `${opinlyConfig.blogUrl}/${folder.slug}`,\n },\n ]}\n />\n\n <h1 className=\"text-4xl font-bold mb-2\">{folder.name}</h1>\n <p className=\"text-muted-foreground max-w-2xl mb-8\">\n {folder.description || `Explore articles about ${folder.name}.`}\n </p>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8\">\n {folder.posts.length === 0 && (\n <div className=\"text-muted-foreground\">No posts added yet</div>\n )}\n {folder.posts.map((post) => {\n return <PostPreview key={post.slug} post={post} />;\n })}\n </div>\n </div>\n </>\n );\n};\n\nfunction formatDate(dateStr: string) {\n return new Date(dateStr).toLocaleDateString(\"en-GB\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n });\n}\n\nfunction formatMinutes(description: string | null) {\n // Fake estimate based on length of description\n if (!description) return \"5 min read\";\n const words = description.split(\" \").length;\n const mins = Math.ceil(words / 200);\n return `${mins} min read`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBI;AAfJ,0BAA4B;AAC5B,0BAA4B;AAE5B,wBAA6B;AAC7B,qBAAuC;AAEhC,MAAM,aAAa,CAAC;AAAA,EACzB;AACF,MAKM;AACJ,SACE,4EACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL;AAAA,YACE,mBAAmB,OAAO;AAAA,YAC1B,MAAM,OAAO;AAAA,UACf;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEA,6CAAC,SAAI,WAAU,gCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAa;AAAA,YACX;AAAA,cACE,MAAM,OAAO;AAAA,cACb,KAAK,GAAG,+BAAa,OAAO,IAAI,OAAO,IAAI;AAAA,YAC7C;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MAEA,4CAAC,QAAG,WAAU,2BAA2B,iBAAO,MAAK;AAAA,MACrD,4CAAC,OAAE,WAAU,wCACV,iBAAO,eAAe,0BAA0B,OAAO,IAAI,KAC9D;AAAA,MAEA,6CAAC,SAAI,WAAU,wDACZ;AAAA,eAAO,MAAM,WAAW,KACvB,4CAAC,SAAI,WAAU,yBAAwB,gCAAkB;AAAA,QAE1D,OAAO,MAAM,IAAI,CAAC,SAAS;AAC1B,iBAAO,4CAAC,mCAA4B,QAAX,KAAK,IAAkB;AAAA,QAClD,CAAC;AAAA,SACH;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW,SAAiB;AACnC,SAAO,IAAI,KAAK,OAAO,EAAE,mBAAmB,SAAS;AAAA,IACnD,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACH;AAEA,SAAS,cAAc,aAA4B;AAEjD,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,QAAQ,YAAY,MAAM,GAAG,EAAE;AACrC,QAAM,OAAO,KAAK,KAAK,QAAQ,GAAG;AAClC,SAAO,GAAG,IAAI;AAChB;","names":[]}
@@ -1,31 +1,19 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
2
  import { PostPreview } from "../post-preview";
3
3
  import { BreadCrumbs } from "../bread-crumbs";
4
- import { BreadcrumbJsonLd } from "next-seo";
5
4
  import { opinlyConfig } from "../../utils/sdk-config";
5
+ import { OpinlyBreadCrumbJsonLd } from "../json-ld";
6
6
  const FolderPage = ({
7
7
  folder
8
8
  }) => {
9
9
  return /* @__PURE__ */ jsxs(Fragment, { children: [
10
10
  /* @__PURE__ */ jsx(
11
- BreadcrumbJsonLd,
11
+ OpinlyBreadCrumbJsonLd,
12
12
  {
13
- useAppDir: !opinlyConfig.pagesRouter,
14
- itemListElements: [
13
+ items: [
15
14
  {
16
- position: 1,
17
- name: opinlyConfig.siteName,
18
- item: `${opinlyConfig.siteUrl}`
19
- },
20
- {
21
- position: 2,
22
- name: "Blog",
23
- item: opinlyConfig.blogUrl
24
- },
25
- {
26
- position: 3,
27
- name: folder.name,
28
- item: `${opinlyConfig.blogUrl}/${folder.slug}`
15
+ slugNoPrefixSlash: folder.slug,
16
+ name: folder.name
29
17
  }
30
18
  ]
31
19
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/folder-page/index.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport { PostPreview } from \"../post-preview\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport { BreadcrumbJsonLd } from \"next-seo\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\n\nexport const FolderPage = ({\n folder,\n}: {\n folder: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"folder\" }\n >[\"data\"];\n}) => {\n return (\n <>\n <BreadcrumbJsonLd\n useAppDir={!opinlyConfig.pagesRouter}\n itemListElements={[\n {\n position: 1,\n name: opinlyConfig.siteName,\n item: `${opinlyConfig.siteUrl}`,\n },\n {\n position: 2,\n name: \"Blog\",\n item: opinlyConfig.blogUrl,\n },\n {\n position: 3,\n name: folder.name,\n item: `${opinlyConfig.blogUrl}/${folder.slug}`,\n },\n ]}\n />\n\n <div className=\"max-w-6xl mx-auto px-4 py-10\">\n <BreadCrumbs\n breadcrumbs={[\n {\n name: folder.name,\n url: `${opinlyConfig.blogUrl}/${folder.slug}`,\n },\n ]}\n />\n\n <h1 className=\"text-4xl font-bold mb-2\">{folder.name}</h1>\n <p className=\"text-muted-foreground max-w-2xl mb-8\">\n {folder.description || `Explore articles about ${folder.name}.`}\n </p>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8\">\n {folder.posts.length === 0 && (\n <div className=\"text-muted-foreground\">No posts added yet</div>\n )}\n {folder.posts.map((post) => {\n return <PostPreview key={post.slug} post={post} />;\n })}\n </div>\n </div>\n </>\n );\n};\n\nfunction formatDate(dateStr: string) {\n return new Date(dateStr).toLocaleDateString(\"en-GB\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n });\n}\n\nfunction formatMinutes(description: string | null) {\n // Fake estimate based on length of description\n if (!description) return \"5 min read\";\n const words = description.split(\" \").length;\n const mins = Math.ceil(words / 200);\n return `${mins} min read`;\n}\n"],"mappings":"AAeI,mBACE,KAoCE,YArCJ;AAdJ,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAEtB,MAAM,aAAa,CAAC;AAAA,EACzB;AACF,MAKM;AACJ,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,CAAC,aAAa;AAAA,QACzB,kBAAkB;AAAA,UAChB;AAAA,YACE,UAAU;AAAA,YACV,MAAM,aAAa;AAAA,YACnB,MAAM,GAAG,aAAa,OAAO;AAAA,UAC/B;AAAA,UACA;AAAA,YACE,UAAU;AAAA,YACV,MAAM;AAAA,YACN,MAAM,aAAa;AAAA,UACrB;AAAA,UACA;AAAA,YACE,UAAU;AAAA,YACV,MAAM,OAAO;AAAA,YACb,MAAM,GAAG,aAAa,OAAO,IAAI,OAAO,IAAI;AAAA,UAC9C;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEA,qBAAC,SAAI,WAAU,gCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAa;AAAA,YACX;AAAA,cACE,MAAM,OAAO;AAAA,cACb,KAAK,GAAG,aAAa,OAAO,IAAI,OAAO,IAAI;AAAA,YAC7C;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MAEA,oBAAC,QAAG,WAAU,2BAA2B,iBAAO,MAAK;AAAA,MACrD,oBAAC,OAAE,WAAU,wCACV,iBAAO,eAAe,0BAA0B,OAAO,IAAI,KAC9D;AAAA,MAEA,qBAAC,SAAI,WAAU,wDACZ;AAAA,eAAO,MAAM,WAAW,KACvB,oBAAC,SAAI,WAAU,yBAAwB,gCAAkB;AAAA,QAE1D,OAAO,MAAM,IAAI,CAAC,SAAS;AAC1B,iBAAO,oBAAC,eAA4B,QAAX,KAAK,IAAkB;AAAA,QAClD,CAAC;AAAA,SACH;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW,SAAiB;AACnC,SAAO,IAAI,KAAK,OAAO,EAAE,mBAAmB,SAAS;AAAA,IACnD,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACH;AAEA,SAAS,cAAc,aAA4B;AAEjD,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,QAAQ,YAAY,MAAM,GAAG,EAAE;AACrC,QAAM,OAAO,KAAK,KAAK,QAAQ,GAAG;AAClC,SAAO,GAAG,IAAI;AAChB;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/folder-page/index.tsx"],"sourcesContent":["import { Opinly } from \"@opinly/backend\";\nimport { PostPreview } from \"../post-preview\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport { BreadcrumbJsonLd } from \"next-seo\";\nimport { opinlyConfig } from \"../../utils/sdk-config\";\nimport { OpinlyBreadCrumbJsonLd } from \"../json-ld\";\n\nexport const FolderPage = ({\n folder,\n}: {\n folder: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"folder\" }\n >[\"data\"];\n}) => {\n return (\n <>\n <OpinlyBreadCrumbJsonLd\n items={[\n {\n slugNoPrefixSlash: folder.slug,\n name: folder.name,\n },\n ]}\n />\n\n <div className=\"max-w-6xl mx-auto px-4 py-10\">\n <BreadCrumbs\n breadcrumbs={[\n {\n name: folder.name,\n url: `${opinlyConfig.blogUrl}/${folder.slug}`,\n },\n ]}\n />\n\n <h1 className=\"text-4xl font-bold mb-2\">{folder.name}</h1>\n <p className=\"text-muted-foreground max-w-2xl mb-8\">\n {folder.description || `Explore articles about ${folder.name}.`}\n </p>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8\">\n {folder.posts.length === 0 && (\n <div className=\"text-muted-foreground\">No posts added yet</div>\n )}\n {folder.posts.map((post) => {\n return <PostPreview key={post.slug} post={post} />;\n })}\n </div>\n </div>\n </>\n );\n};\n\nfunction formatDate(dateStr: string) {\n return new Date(dateStr).toLocaleDateString(\"en-GB\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n });\n}\n\nfunction formatMinutes(description: string | null) {\n // Fake estimate based on length of description\n if (!description) return \"5 min read\";\n const words = description.split(\" \").length;\n const mins = Math.ceil(words / 200);\n return `${mins} min read`;\n}\n"],"mappings":"AAgBI,mBACE,KAwBE,YAzBJ;AAfJ,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAE5B,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AAEhC,MAAM,aAAa,CAAC;AAAA,EACzB;AACF,MAKM;AACJ,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL;AAAA,YACE,mBAAmB,OAAO;AAAA,YAC1B,MAAM,OAAO;AAAA,UACf;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEA,qBAAC,SAAI,WAAU,gCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAa;AAAA,YACX;AAAA,cACE,MAAM,OAAO;AAAA,cACb,KAAK,GAAG,aAAa,OAAO,IAAI,OAAO,IAAI;AAAA,YAC7C;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MAEA,oBAAC,QAAG,WAAU,2BAA2B,iBAAO,MAAK;AAAA,MACrD,oBAAC,OAAE,WAAU,wCACV,iBAAO,eAAe,0BAA0B,OAAO,IAAI,KAC9D;AAAA,MAEA,qBAAC,SAAI,WAAU,wDACZ;AAAA,eAAO,MAAM,WAAW,KACvB,oBAAC,SAAI,WAAU,yBAAwB,gCAAkB;AAAA,QAE1D,OAAO,MAAM,IAAI,CAAC,SAAS;AAC1B,iBAAO,oBAAC,eAA4B,QAAX,KAAK,IAAkB;AAAA,QAClD,CAAC;AAAA,SACH;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW,SAAiB;AACnC,SAAO,IAAI,KAAK,OAAO,EAAE,mBAAmB,SAAS;AAAA,IACnD,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACH;AAEA,SAAS,cAAc,aAA4B;AAEjD,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,QAAQ,YAAY,MAAM,GAAG,EAAE;AACrC,QAAM,OAAO,KAAK,KAAK,QAAQ,GAAG;AAClC,SAAO,GAAG,IAAI;AAChB;","names":[]}