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