@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.
- package/dist/components/author-page/_helpers/json-ld.cjs +42 -0
- package/dist/components/author-page/_helpers/json-ld.cjs.map +1 -1
- package/dist/components/author-page/_helpers/json-ld.d.cts +7 -1
- package/dist/components/author-page/_helpers/json-ld.d.ts +7 -1
- package/dist/components/author-page/_helpers/json-ld.js +19 -0
- package/dist/components/author-page/_helpers/json-ld.js.map +1 -1
- package/dist/components/author-page/index.cjs +9 -15
- package/dist/components/author-page/index.cjs.map +1 -1
- package/dist/components/author-page/index.js +9 -15
- package/dist/components/author-page/index.js.map +1 -1
- package/dist/components/authors-page/_helpers/json-ld.cjs +53 -0
- package/dist/components/authors-page/_helpers/json-ld.cjs.map +1 -0
- package/dist/components/authors-page/_helpers/json-ld.d.cts +8 -0
- package/dist/components/authors-page/_helpers/json-ld.d.ts +8 -0
- package/dist/components/authors-page/_helpers/json-ld.js +29 -0
- package/dist/components/authors-page/_helpers/json-ld.js.map +1 -0
- package/dist/components/authors-page/index.cjs +61 -45
- package/dist/components/authors-page/index.cjs.map +1 -1
- package/dist/components/authors-page/index.js +62 -46
- package/dist/components/authors-page/index.js.map +1 -1
- package/dist/components/blog-post/index.cjs +15 -34
- package/dist/components/blog-post/index.cjs.map +1 -1
- package/dist/components/blog-post/index.js +16 -39
- package/dist/components/blog-post/index.js.map +1 -1
- package/dist/components/folder-page/_helpers/json-ld.cjs +43 -0
- package/dist/components/folder-page/_helpers/json-ld.cjs.map +1 -0
- package/dist/components/folder-page/_helpers/json-ld.d.cts +8 -0
- package/dist/components/folder-page/_helpers/json-ld.d.ts +8 -0
- package/dist/components/folder-page/_helpers/json-ld.js +19 -0
- package/dist/components/folder-page/_helpers/json-ld.js.map +1 -0
- package/dist/components/folder-page/index.cjs +5 -17
- package/dist/components/folder-page/index.cjs.map +1 -1
- package/dist/components/folder-page/index.js +5 -17
- package/dist/components/folder-page/index.js.map +1 -1
- package/dist/components/home-page/_helpers/json-ld.cjs +43 -0
- package/dist/components/home-page/_helpers/json-ld.cjs.map +1 -0
- package/dist/components/home-page/_helpers/json-ld.d.cts +3 -0
- package/dist/components/home-page/_helpers/json-ld.d.ts +3 -0
- package/dist/components/home-page/_helpers/json-ld.js +19 -0
- package/dist/components/home-page/_helpers/json-ld.js.map +1 -0
- package/dist/components/home-page/index.cjs +9 -4
- package/dist/components/home-page/index.cjs.map +1 -1
- package/dist/components/home-page/index.js +10 -5
- package/dist/components/home-page/index.js.map +1 -1
- package/dist/components/json-ld.cjs +92 -0
- package/dist/components/json-ld.cjs.map +1 -0
- package/dist/components/json-ld.d.cts +13 -0
- package/dist/components/json-ld.d.ts +13 -0
- package/dist/components/json-ld.js +57 -0
- package/dist/components/json-ld.js.map +1 -0
- package/dist/utils/json-ld.cjs +2 -0
- package/dist/utils/json-ld.cjs.map +1 -0
- package/dist/utils/json-ld.d.cts +2 -0
- package/dist/utils/json-ld.d.ts +2 -0
- package/dist/utils/json-ld.js +1 -0
- package/dist/utils/json-ld.js.map +1 -0
- 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(
|
|
12
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
13
|
+
/* @__PURE__ */ jsx(OpinlyJSONLD, { content: authorCollectionJSONLD(authors) }),
|
|
11
14
|
/* @__PURE__ */ jsx(
|
|
12
|
-
|
|
15
|
+
OpinlyBreadCrumbJsonLd,
|
|
13
16
|
{
|
|
14
|
-
|
|
17
|
+
items: [
|
|
15
18
|
{
|
|
19
|
+
slugNoPrefixSlash: "authors",
|
|
16
20
|
name: "Authors"
|
|
17
21
|
}
|
|
18
22
|
]
|
|
19
23
|
}
|
|
20
24
|
),
|
|
21
|
-
/* @__PURE__ */
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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(
|
|
42
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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,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
|
-
|
|
34
|
+
import_json_ld.OpinlyBreadCrumbJsonLd,
|
|
35
35
|
{
|
|
36
|
-
|
|
37
|
-
itemListElements: [
|
|
36
|
+
items: [
|
|
38
37
|
{
|
|
39
|
-
|
|
40
|
-
name:
|
|
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 <
|
|
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
|
-
|
|
11
|
+
OpinlyBreadCrumbJsonLd,
|
|
12
12
|
{
|
|
13
|
-
|
|
14
|
-
itemListElements: [
|
|
13
|
+
items: [
|
|
15
14
|
{
|
|
16
|
-
|
|
17
|
-
name:
|
|
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 <
|
|
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":[]}
|