@opinly/next 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/components/author-page/_helpers/json-ld.cjs +2 -0
  2. package/dist/components/author-page/_helpers/json-ld.cjs.map +1 -0
  3. package/dist/components/author-page/_helpers/json-ld.d.cts +2 -0
  4. package/dist/components/author-page/_helpers/json-ld.d.ts +2 -0
  5. package/dist/components/author-page/_helpers/json-ld.js +1 -0
  6. package/dist/components/author-page/_helpers/json-ld.js.map +1 -0
  7. package/dist/components/author-page/index.cjs +84 -0
  8. package/dist/components/author-page/index.cjs.map +1 -0
  9. package/dist/components/author-page/index.d.cts +10 -0
  10. package/dist/components/author-page/index.d.ts +10 -0
  11. package/dist/components/author-page/index.js +50 -0
  12. package/dist/components/author-page/index.js.map +1 -0
  13. package/dist/components/authors-page/index.cjs +106 -0
  14. package/dist/components/authors-page/index.cjs.map +1 -0
  15. package/dist/components/authors-page/index.d.cts +10 -0
  16. package/dist/components/authors-page/index.d.ts +10 -0
  17. package/dist/components/authors-page/index.js +72 -0
  18. package/dist/components/authors-page/index.js.map +1 -0
  19. package/dist/components/blog-post/_components/content.cjs +130 -0
  20. package/dist/components/blog-post/_components/content.cjs.map +1 -0
  21. package/dist/components/blog-post/_components/content.d.cts +10 -0
  22. package/dist/components/blog-post/_components/content.d.ts +10 -0
  23. package/dist/components/blog-post/_components/content.js +96 -0
  24. package/dist/components/blog-post/_components/content.js.map +1 -0
  25. package/dist/components/blog-post/_components/faq.cjs +39 -0
  26. package/dist/components/blog-post/_components/faq.cjs.map +1 -0
  27. package/dist/components/blog-post/_components/faq.d.cts +9 -0
  28. package/dist/components/blog-post/_components/faq.d.ts +9 -0
  29. package/dist/components/blog-post/_components/faq.js +15 -0
  30. package/dist/components/blog-post/_components/faq.js.map +1 -0
  31. package/dist/components/blog-post/_components/share.cjs +100 -0
  32. package/dist/components/blog-post/_components/share.cjs.map +1 -0
  33. package/dist/components/blog-post/_components/share.d.cts +9 -0
  34. package/dist/components/blog-post/_components/share.d.ts +9 -0
  35. package/dist/components/blog-post/_components/share.js +66 -0
  36. package/dist/components/blog-post/_components/share.js.map +1 -0
  37. package/dist/components/blog-post/_components/table-of-contents.cjs +82 -0
  38. package/dist/components/blog-post/_components/table-of-contents.cjs.map +1 -0
  39. package/dist/components/blog-post/_components/table-of-contents.d.cts +13 -0
  40. package/dist/components/blog-post/_components/table-of-contents.d.ts +13 -0
  41. package/dist/components/blog-post/_components/table-of-contents.js +48 -0
  42. package/dist/components/blog-post/_components/table-of-contents.js.map +1 -0
  43. package/dist/components/blog-post/_helpers/calc-reading-time.cjs +2 -0
  44. package/dist/components/blog-post/_helpers/calc-reading-time.cjs.map +1 -0
  45. package/dist/components/blog-post/_helpers/calc-reading-time.d.cts +2 -0
  46. package/dist/components/blog-post/_helpers/calc-reading-time.d.ts +2 -0
  47. package/dist/components/blog-post/_helpers/calc-reading-time.js +1 -0
  48. package/dist/components/blog-post/_helpers/calc-reading-time.js.map +1 -0
  49. package/dist/components/blog-post/_helpers/extract-headings.cjs +44 -0
  50. package/dist/components/blog-post/_helpers/extract-headings.cjs.map +1 -0
  51. package/dist/components/blog-post/_helpers/extract-headings.d.cts +8 -0
  52. package/dist/components/blog-post/_helpers/extract-headings.d.ts +8 -0
  53. package/dist/components/blog-post/_helpers/extract-headings.js +20 -0
  54. package/dist/components/blog-post/_helpers/extract-headings.js.map +1 -0
  55. package/dist/components/blog-post/_helpers/json-ld.cjs +170 -0
  56. package/dist/components/blog-post/_helpers/json-ld.cjs.map +1 -0
  57. package/dist/components/blog-post/_helpers/json-ld.d.cts +11 -0
  58. package/dist/components/blog-post/_helpers/json-ld.d.ts +11 -0
  59. package/dist/components/blog-post/_helpers/json-ld.js +143 -0
  60. package/dist/components/blog-post/_helpers/json-ld.js.map +1 -0
  61. package/dist/components/blog-post/_helpers/reading-time.cjs +50 -0
  62. package/dist/components/blog-post/_helpers/reading-time.cjs.map +1 -0
  63. package/dist/components/blog-post/_helpers/reading-time.d.cts +6 -0
  64. package/dist/components/blog-post/_helpers/reading-time.d.ts +6 -0
  65. package/dist/components/blog-post/_helpers/reading-time.js +25 -0
  66. package/dist/components/blog-post/_helpers/reading-time.js.map +1 -0
  67. package/dist/components/blog-post/_types/blog-post.cjs +17 -0
  68. package/dist/components/blog-post/_types/blog-post.cjs.map +1 -0
  69. package/dist/components/blog-post/_types/blog-post.d.cts +7 -0
  70. package/dist/components/blog-post/_types/blog-post.d.ts +7 -0
  71. package/dist/components/blog-post/_types/blog-post.js +1 -0
  72. package/dist/components/blog-post/_types/blog-post.js.map +1 -0
  73. package/dist/components/blog-post/_types/class-names.cjs +17 -0
  74. package/dist/components/blog-post/_types/class-names.cjs.map +1 -0
  75. package/dist/components/blog-post/_types/class-names.d.cts +12 -0
  76. package/dist/components/blog-post/_types/class-names.d.ts +12 -0
  77. package/dist/components/blog-post/_types/class-names.js +1 -0
  78. package/dist/components/blog-post/_types/class-names.js.map +1 -0
  79. package/dist/components/blog-post/index.cjs +149 -0
  80. package/dist/components/blog-post/index.cjs.map +1 -0
  81. package/dist/components/blog-post/index.d.cts +13 -0
  82. package/dist/components/blog-post/index.d.ts +13 -0
  83. package/dist/components/blog-post/index.js +119 -0
  84. package/dist/components/blog-post/index.js.map +1 -0
  85. package/dist/components/bread-crumbs.cjs +60 -0
  86. package/dist/components/bread-crumbs.cjs.map +1 -0
  87. package/dist/components/bread-crumbs.d.cts +10 -0
  88. package/dist/components/bread-crumbs.d.ts +10 -0
  89. package/dist/components/bread-crumbs.js +26 -0
  90. package/dist/components/bread-crumbs.js.map +1 -0
  91. package/dist/components/folder-page/index.cjs +61 -0
  92. package/dist/components/folder-page/index.cjs.map +1 -0
  93. package/dist/components/folder-page/index.d.cts +10 -0
  94. package/dist/components/folder-page/index.d.ts +10 -0
  95. package/dist/components/folder-page/index.js +37 -0
  96. package/dist/components/folder-page/index.js.map +1 -0
  97. package/dist/components/home-page.cjs +71 -0
  98. package/dist/components/home-page.cjs.map +1 -0
  99. package/dist/components/home-page.d.cts +12 -0
  100. package/dist/components/home-page.d.ts +12 -0
  101. package/dist/components/home-page.js +37 -0
  102. package/dist/components/home-page.js.map +1 -0
  103. package/dist/components/not-found.cjs +60 -0
  104. package/dist/components/not-found.cjs.map +1 -0
  105. package/dist/components/not-found.d.cts +5 -0
  106. package/dist/components/not-found.d.ts +5 -0
  107. package/dist/components/not-found.js +26 -0
  108. package/dist/components/not-found.js.map +1 -0
  109. package/dist/components/opinly-blog.cjs +56 -0
  110. package/dist/components/opinly-blog.cjs.map +1 -0
  111. package/dist/components/opinly-blog.d.cts +9 -0
  112. package/dist/components/opinly-blog.d.ts +9 -0
  113. package/dist/components/opinly-blog.js +32 -0
  114. package/dist/components/opinly-blog.js.map +1 -0
  115. package/dist/components/post-preview.cjs +93 -0
  116. package/dist/components/post-preview.cjs.map +1 -0
  117. package/dist/components/post-preview.d.cts +10 -0
  118. package/dist/components/post-preview.d.ts +10 -0
  119. package/dist/components/post-preview.js +59 -0
  120. package/dist/components/post-preview.js.map +1 -0
  121. package/dist/index.d.cts +4 -17
  122. package/dist/index.d.ts +4 -17
  123. package/package.json +21 -2
@@ -0,0 +1,12 @@
1
+ type BlogComponentClassNames = {
2
+ paragraph?: string;
3
+ heading?: string;
4
+ image?: string;
5
+ bulletList?: string;
6
+ orderedList?: string;
7
+ listItem?: string;
8
+ link?: string;
9
+ container?: string;
10
+ };
11
+
12
+ export type { BlogComponentClassNames };
@@ -0,0 +1,12 @@
1
+ type BlogComponentClassNames = {
2
+ paragraph?: string;
3
+ heading?: string;
4
+ image?: string;
5
+ bulletList?: string;
6
+ orderedList?: string;
7
+ listItem?: string;
8
+ link?: string;
9
+ container?: string;
10
+ };
11
+
12
+ export type { BlogComponentClassNames };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=class-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var blog_post_exports = {};
30
+ __export(blog_post_exports, {
31
+ BlogPost: () => BlogPost
32
+ });
33
+ module.exports = __toCommonJS(blog_post_exports);
34
+ var import_jsx_runtime = require("react/jsx-runtime");
35
+ var import_link = __toESM(require("next/link"), 1);
36
+ var import_merge = require("../../utils/merge");
37
+ var import_sdk_config = require("../../sdk-config");
38
+ var import_json_ld = require("./_helpers/json-ld");
39
+ var import_faq = require("./_components/faq");
40
+ var import_reading_time = require("./_helpers/reading-time");
41
+ var import_content = require("./_components/content");
42
+ var import_table_of_contents = require("./_components/table-of-contents");
43
+ var import_bread_crumbs = require("../bread-crumbs");
44
+ var import_dates = require("../../utils/dates");
45
+ var import_script = __toESM(require("next/script"), 1);
46
+ const BlogPost = ({
47
+ post,
48
+ classNames = {}
49
+ }) => {
50
+ const content = post.content;
51
+ console.log("content", content);
52
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
53
+ post.faqs && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
54
+ import_script.default,
55
+ {
56
+ strategy: "beforeInteractive",
57
+ type: "application/ld+json",
58
+ dangerouslySetInnerHTML: {
59
+ __html: JSON.stringify((0, import_json_ld.genFaqJSONLD)(post.faqs)).replace(
60
+ /</g,
61
+ "\\u003c"
62
+ )
63
+ }
64
+ }
65
+ ),
66
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
67
+ import_script.default,
68
+ {
69
+ strategy: "beforeInteractive",
70
+ type: "application/ld+json",
71
+ dangerouslySetInnerHTML: {
72
+ __html: JSON.stringify((0, import_json_ld.genBlogPostingJSONLD)(post))
73
+ }
74
+ }
75
+ ),
76
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
77
+ import_script.default,
78
+ {
79
+ strategy: "beforeInteractive",
80
+ type: "application/ld+json",
81
+ dangerouslySetInnerHTML: {
82
+ __html: JSON.stringify((0, import_json_ld.genBreadcrumbJSONLD)(post))
83
+ }
84
+ }
85
+ ),
86
+ /* @__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: [
87
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "bg-orange-600", children: [
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
89
+ import_bread_crumbs.BreadCrumbs,
90
+ {
91
+ breadcrumbs: [
92
+ post.folder && {
93
+ url: `${import_sdk_config.opinlyConfig.blogPrefix}/${post.folder.slug}`,
94
+ name: post.folder.name
95
+ }
96
+ ]
97
+ }
98
+ ),
99
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { className: "text-4xl font-bold mb-2 leading-tight", children: post.title }),
100
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "text-sm mb-4", children: [
101
+ "Author:",
102
+ " ",
103
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
104
+ import_link.default,
105
+ {
106
+ href: `${import_sdk_config.opinlyConfig.blogPrefix}/authors/${post.author?.slug}`,
107
+ className: "font-medium",
108
+ children: post.author?.name
109
+ }
110
+ ),
111
+ " ",
112
+ "\xB7 ",
113
+ (0, import_reading_time.calculateReadingTime)(content),
114
+ " min read \xB7",
115
+ " ",
116
+ (0, import_dates.formatDate)(post.firstPublishedAt) || "Today"
117
+ ] })
118
+ ] }),
119
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
120
+ "div",
121
+ {
122
+ className: (0, import_merge.cn)(
123
+ "flex flex-col-reverse md:flex-row mx-auto mt-10 gap-12 relative w-full ",
124
+ classNames.container
125
+ ),
126
+ children: [
127
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("article", { className: "w-full lg:w-2/3 order-2 lg:order-1 flex items-start space-x-4", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "prose w-full", children: [
128
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_content.Content, { content, classNames }),
129
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_faq.FAQS, { faqs: post.faqs })
130
+ ] }) }),
131
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "block md:min-w-72 md:sticky md:top-20 md:self-start", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
132
+ import_table_of_contents.TableOfContents,
133
+ {
134
+ content,
135
+ author: post.author,
136
+ post
137
+ }
138
+ ) })
139
+ ]
140
+ }
141
+ )
142
+ ] }) })
143
+ ] });
144
+ };
145
+ // Annotate the CommonJS export names for ESM import in node:
146
+ 0 && (module.exports = {
147
+ BlogPost
148
+ });
149
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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 \"../../sdk-config\";\nimport { BlogPostRes } from \"./_types/blog-post\";\nimport {\n genBlogPostingJSONLD,\n genBreadcrumbJSONLD,\n genFaqJSONLD,\n} from \"./_helpers/json-ld\";\nimport { BlogComponentClassNames } from \"./_types/class-names\";\nimport { FAQS } from \"./_components/faq\";\nimport { calculateReadingTime } from \"./_helpers/reading-time\";\nimport { Content } from \"./_components/content\";\nimport { TableOfContents } from \"./_components/table-of-contents\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport { formatDate } from \"../../utils/dates\";\nimport Head from \"next/head\";\nimport Script from \"next/script\";\n\nexport const BlogPost = ({\n post,\n classNames = {},\n}: {\n post: BlogPostRes;\n classNames?: BlogComponentClassNames;\n notFoundComponent?: React.ReactNode;\n}) => {\n const content = post.content as JSONContent;\n\n console.log(\"content\", content);\n\n return (\n <>\n {/* <Head>\n <> */}\n {post.faqs && (\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genFaqJSONLD(post.faqs)).replace(\n /</g,\n \"\\\\u003c\"\n ),\n }}\n />\n )}\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genBlogPostingJSONLD(post)),\n }}\n />\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genBreadcrumbJSONLD(post)),\n }}\n />\n {/* </>\n </Head> */}\n\n <div className=\"max-w-7xl mx-auto px-4 py-24 flex items-start space-x-8\">\n <div className=\"flex flex-col gap-12 w-full\">\n <div className=\"bg-orange-600\">\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-4xl font-bold mb-2 leading-tight\">\n {post.title}\n </h1>\n <div className=\"text-sm mb-4\">\n Author:{\" \"}\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${post.author?.slug}`}\n className=\"font-medium\"\n >\n {post.author?.name}\n </Link>{\" \"}\n · {calculateReadingTime(content)} min read ·{\" \"}\n {formatDate(post.firstPublishedAt as string) || \"Today\"}\n </div>\n </div>\n\n <div\n className={cn(\n \"flex flex-col-reverse md:flex-row mx-auto mt-10 gap-12 relative w-full \",\n classNames.container\n )}\n >\n <article className=\"w-full lg:w-2/3 order-2 lg:order-1 flex items-start space-x-4\">\n <div className=\"prose w-full\">\n <Content content={content} classNames={classNames} />\n <FAQS faqs={post.faqs} />\n </div>\n </article>\n <div className=\"block md:min-w-72 md:sticky md:top-20 md:self-start\">\n <TableOfContents\n content={content}\n author={post.author}\n post={post}\n />\n </div>\n </div>\n </div>\n {/* <div className=\"hidden md:block \">\n <TableOfContents\n content={content}\n author={post.post.author}\n post={post}\n />\n </div> */}\n </div>\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCI;AAhCJ,kBAAiB;AACjB,mBAAmB;AACnB,wBAA6B;AAE7B,qBAIO;AAEP,iBAAqB;AACrB,0BAAqC;AACrC,qBAAwB;AACxB,+BAAgC;AAChC,0BAA4B;AAC5B,mBAA2B;AAE3B,oBAAmB;AAEZ,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,aAAa,CAAC;AAChB,MAIM;AACJ,QAAM,UAAU,KAAK;AAErB,UAAQ,IAAI,WAAW,OAAO;AAE9B,SACE,4EAGG;AAAA,SAAK,QACJ;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,cAAU,6BAAa,KAAK,IAAI,CAAC,EAAE;AAAA,YAC9C;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEF;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,cAAU,qCAAqB,IAAI,CAAC;AAAA,QACnD;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,cAAU,oCAAoB,IAAI,CAAC;AAAA,QAClD;AAAA;AAAA,IACF;AAAA,IAIA,4CAAC,SAAI,WAAU,2DACb,uDAAC,SAAI,WAAU,+BACb;AAAA,mDAAC,SAAI,WAAU,iBACb;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,yCACX,eAAK,OACR;AAAA,QACA,6CAAC,SAAI,WAAU,gBAAe;AAAA;AAAA,UACpB;AAAA,UACR;AAAA,YAAC,YAAAC;AAAA,YAAA;AAAA,cACC,MAAM,GAAG,+BAAa,UAAU,YAAY,KAAK,QAAQ,IAAI;AAAA,cAC7D,WAAU;AAAA,cAET,eAAK,QAAQ;AAAA;AAAA,UAChB;AAAA,UAAQ;AAAA,UAAI;AAAA,cACT,0CAAqB,OAAO;AAAA,UAAE;AAAA,UAAY;AAAA,cAC5C,yBAAW,KAAK,gBAA0B,KAAK;AAAA,WAClD;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW;AAAA,YACT;AAAA,YACA,WAAW;AAAA,UACb;AAAA,UAEA;AAAA,wDAAC,aAAQ,WAAU,iEACjB,uDAAC,SAAI,WAAU,gBACb;AAAA,0DAAC,0BAAQ,SAAkB,YAAwB;AAAA,cACnD,4CAAC,mBAAK,MAAM,KAAK,MAAM;AAAA,eACzB,GACF;AAAA,YACA,4CAAC,SAAI,WAAU,uDACb;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,QAAQ,KAAK;AAAA,gBACb;AAAA;AAAA,YACF,GACF;AAAA;AAAA;AAAA,MACF;AAAA,OACF,GAQF;AAAA,KACF;AAEJ;","names":["Script","Link"]}
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { BlogPostRes } from './_types/blog-post.cjs';
4
+ import { BlogComponentClassNames } from './_types/class-names.cjs';
5
+ import '@opinly/backend';
6
+
7
+ declare const BlogPost: ({ post, classNames, }: {
8
+ post: BlogPostRes;
9
+ classNames?: BlogComponentClassNames;
10
+ notFoundComponent?: React.ReactNode;
11
+ }) => react_jsx_runtime.JSX.Element;
12
+
13
+ export { BlogPost };
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import { BlogPostRes } from './_types/blog-post.js';
4
+ import { BlogComponentClassNames } from './_types/class-names.js';
5
+ import '@opinly/backend';
6
+
7
+ declare const BlogPost: ({ post, classNames, }: {
8
+ post: BlogPostRes;
9
+ classNames?: BlogComponentClassNames;
10
+ notFoundComponent?: React.ReactNode;
11
+ }) => react_jsx_runtime.JSX.Element;
12
+
13
+ export { BlogPost };
@@ -0,0 +1,119 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import Link from "next/link";
3
+ import { cn } from "../../utils/merge";
4
+ import { opinlyConfig } from "../../sdk-config";
5
+ import {
6
+ genBlogPostingJSONLD,
7
+ genBreadcrumbJSONLD,
8
+ genFaqJSONLD
9
+ } from "./_helpers/json-ld";
10
+ import { FAQS } from "./_components/faq";
11
+ import { calculateReadingTime } from "./_helpers/reading-time";
12
+ import { Content } from "./_components/content";
13
+ import { TableOfContents } from "./_components/table-of-contents";
14
+ import { BreadCrumbs } from "../bread-crumbs";
15
+ import { formatDate } from "../../utils/dates";
16
+ import Script from "next/script";
17
+ const BlogPost = ({
18
+ post,
19
+ classNames = {}
20
+ }) => {
21
+ const content = post.content;
22
+ console.log("content", content);
23
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ post.faqs && /* @__PURE__ */ jsx(
25
+ Script,
26
+ {
27
+ strategy: "beforeInteractive",
28
+ type: "application/ld+json",
29
+ dangerouslySetInnerHTML: {
30
+ __html: JSON.stringify(genFaqJSONLD(post.faqs)).replace(
31
+ /</g,
32
+ "\\u003c"
33
+ )
34
+ }
35
+ }
36
+ ),
37
+ /* @__PURE__ */ jsx(
38
+ Script,
39
+ {
40
+ strategy: "beforeInteractive",
41
+ type: "application/ld+json",
42
+ dangerouslySetInnerHTML: {
43
+ __html: JSON.stringify(genBlogPostingJSONLD(post))
44
+ }
45
+ }
46
+ ),
47
+ /* @__PURE__ */ jsx(
48
+ Script,
49
+ {
50
+ strategy: "beforeInteractive",
51
+ type: "application/ld+json",
52
+ dangerouslySetInnerHTML: {
53
+ __html: JSON.stringify(genBreadcrumbJSONLD(post))
54
+ }
55
+ }
56
+ ),
57
+ /* @__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: [
58
+ /* @__PURE__ */ jsxs("div", { className: "bg-orange-600", children: [
59
+ /* @__PURE__ */ jsx(
60
+ BreadCrumbs,
61
+ {
62
+ breadcrumbs: [
63
+ post.folder && {
64
+ url: `${opinlyConfig.blogPrefix}/${post.folder.slug}`,
65
+ name: post.folder.name
66
+ }
67
+ ]
68
+ }
69
+ ),
70
+ /* @__PURE__ */ jsx("h1", { className: "text-4xl font-bold mb-2 leading-tight", children: post.title }),
71
+ /* @__PURE__ */ jsxs("div", { className: "text-sm mb-4", children: [
72
+ "Author:",
73
+ " ",
74
+ /* @__PURE__ */ jsx(
75
+ Link,
76
+ {
77
+ href: `${opinlyConfig.blogPrefix}/authors/${post.author?.slug}`,
78
+ className: "font-medium",
79
+ children: post.author?.name
80
+ }
81
+ ),
82
+ " ",
83
+ "\xB7 ",
84
+ calculateReadingTime(content),
85
+ " min read \xB7",
86
+ " ",
87
+ formatDate(post.firstPublishedAt) || "Today"
88
+ ] })
89
+ ] }),
90
+ /* @__PURE__ */ jsxs(
91
+ "div",
92
+ {
93
+ className: cn(
94
+ "flex flex-col-reverse md:flex-row mx-auto mt-10 gap-12 relative w-full ",
95
+ classNames.container
96
+ ),
97
+ children: [
98
+ /* @__PURE__ */ jsx("article", { className: "w-full lg:w-2/3 order-2 lg:order-1 flex items-start space-x-4", children: /* @__PURE__ */ jsxs("div", { className: "prose w-full", children: [
99
+ /* @__PURE__ */ jsx(Content, { content, classNames }),
100
+ /* @__PURE__ */ jsx(FAQS, { faqs: post.faqs })
101
+ ] }) }),
102
+ /* @__PURE__ */ jsx("div", { className: "block md:min-w-72 md:sticky md:top-20 md:self-start", children: /* @__PURE__ */ jsx(
103
+ TableOfContents,
104
+ {
105
+ content,
106
+ author: post.author,
107
+ post
108
+ }
109
+ ) })
110
+ ]
111
+ }
112
+ )
113
+ ] }) })
114
+ ] });
115
+ };
116
+ export {
117
+ BlogPost
118
+ };
119
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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 \"../../sdk-config\";\nimport { BlogPostRes } from \"./_types/blog-post\";\nimport {\n genBlogPostingJSONLD,\n genBreadcrumbJSONLD,\n genFaqJSONLD,\n} from \"./_helpers/json-ld\";\nimport { BlogComponentClassNames } from \"./_types/class-names\";\nimport { FAQS } from \"./_components/faq\";\nimport { calculateReadingTime } from \"./_helpers/reading-time\";\nimport { Content } from \"./_components/content\";\nimport { TableOfContents } from \"./_components/table-of-contents\";\nimport { BreadCrumbs } from \"../bread-crumbs\";\nimport { formatDate } from \"../../utils/dates\";\nimport Head from \"next/head\";\nimport Script from \"next/script\";\n\nexport const BlogPost = ({\n post,\n classNames = {},\n}: {\n post: BlogPostRes;\n classNames?: BlogComponentClassNames;\n notFoundComponent?: React.ReactNode;\n}) => {\n const content = post.content as JSONContent;\n\n console.log(\"content\", content);\n\n return (\n <>\n {/* <Head>\n <> */}\n {post.faqs && (\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genFaqJSONLD(post.faqs)).replace(\n /</g,\n \"\\\\u003c\"\n ),\n }}\n />\n )}\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genBlogPostingJSONLD(post)),\n }}\n />\n <Script\n strategy=\"beforeInteractive\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(genBreadcrumbJSONLD(post)),\n }}\n />\n {/* </>\n </Head> */}\n\n <div className=\"max-w-7xl mx-auto px-4 py-24 flex items-start space-x-8\">\n <div className=\"flex flex-col gap-12 w-full\">\n <div className=\"bg-orange-600\">\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-4xl font-bold mb-2 leading-tight\">\n {post.title}\n </h1>\n <div className=\"text-sm mb-4\">\n Author:{\" \"}\n <Link\n href={`${opinlyConfig.blogPrefix}/authors/${post.author?.slug}`}\n className=\"font-medium\"\n >\n {post.author?.name}\n </Link>{\" \"}\n · {calculateReadingTime(content)} min read ·{\" \"}\n {formatDate(post.firstPublishedAt as string) || \"Today\"}\n </div>\n </div>\n\n <div\n className={cn(\n \"flex flex-col-reverse md:flex-row mx-auto mt-10 gap-12 relative w-full \",\n classNames.container\n )}\n >\n <article className=\"w-full lg:w-2/3 order-2 lg:order-1 flex items-start space-x-4\">\n <div className=\"prose w-full\">\n <Content content={content} classNames={classNames} />\n <FAQS faqs={post.faqs} />\n </div>\n </article>\n <div className=\"block md:min-w-72 md:sticky md:top-20 md:self-start\">\n <TableOfContents\n content={content}\n author={post.author}\n post={post}\n />\n </div>\n </div>\n </div>\n {/* <div className=\"hidden md:block \">\n <TableOfContents\n content={content}\n author={post.post.author}\n post={post}\n />\n </div> */}\n </div>\n </>\n );\n};\n"],"mappings":"AAkCI,mBAII,KA2CI,YA/CR;AAhCJ,OAAO,UAAU;AACjB,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAE7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,YAAY;AACrB,SAAS,4BAA4B;AACrC,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAE3B,OAAO,YAAY;AAEZ,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,aAAa,CAAC;AAChB,MAIM;AACJ,QAAM,UAAU,KAAK;AAErB,UAAQ,IAAI,WAAW,OAAO;AAE9B,SACE,iCAGG;AAAA,SAAK,QACJ;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,UAAU,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,YAC9C;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,UAAU,qBAAqB,IAAI,CAAC;AAAA,QACnD;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ,KAAK,UAAU,oBAAoB,IAAI,CAAC;AAAA,QAClD;AAAA;AAAA,IACF;AAAA,IAIA,oBAAC,SAAI,WAAU,2DACb,+BAAC,SAAI,WAAU,+BACb;AAAA,2BAAC,SAAI,WAAU,iBACb;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,yCACX,eAAK,OACR;AAAA,QACA,qBAAC,SAAI,WAAU,gBAAe;AAAA;AAAA,UACpB;AAAA,UACR;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,GAAG,aAAa,UAAU,YAAY,KAAK,QAAQ,IAAI;AAAA,cAC7D,WAAU;AAAA,cAET,eAAK,QAAQ;AAAA;AAAA,UAChB;AAAA,UAAQ;AAAA,UAAI;AAAA,UACT,qBAAqB,OAAO;AAAA,UAAE;AAAA,UAAY;AAAA,UAC5C,WAAW,KAAK,gBAA0B,KAAK;AAAA,WAClD;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,WAAW;AAAA,UACb;AAAA,UAEA;AAAA,gCAAC,aAAQ,WAAU,iEACjB,+BAAC,SAAI,WAAU,gBACb;AAAA,kCAAC,WAAQ,SAAkB,YAAwB;AAAA,cACnD,oBAAC,QAAK,MAAM,KAAK,MAAM;AAAA,eACzB,GACF;AAAA,YACA,oBAAC,SAAI,WAAU,uDACb;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,QAAQ,KAAK;AAAA,gBACb;AAAA;AAAA,YACF,GACF;AAAA;AAAA;AAAA,MACF;AAAA,OACF,GAQF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var bread_crumbs_exports = {};
30
+ __export(bread_crumbs_exports, {
31
+ BreadCrumbs: () => BreadCrumbs
32
+ });
33
+ module.exports = __toCommonJS(bread_crumbs_exports);
34
+ var import_jsx_runtime = require("react/jsx-runtime");
35
+ var import_link = __toESM(require("next/link"), 1);
36
+ var import_react = require("react");
37
+ var import_sdk_config = require("../sdk-config");
38
+ const BreadCrumbs = ({
39
+ breadcrumbs
40
+ }) => {
41
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("nav", { className: "text-sm text-orange-100 text-muted-foreground mb-4", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("ol", { className: "list-reset flex space-x-2", children: [
42
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/", className: "font-bold", children: import_sdk_config.opinlyConfig.siteName }),
43
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "/" }),
44
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: import_sdk_config.opinlyConfig.blogPrefix, className: "font-bold", children: "Blog" }),
45
+ breadcrumbs?.map((breadcrumb, index) => {
46
+ if (!breadcrumb) {
47
+ return null;
48
+ }
49
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react.Fragment, { children: [
50
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "/" }),
51
+ breadcrumb.url ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: breadcrumb.url, className: "font-bold", children: breadcrumb.name }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "font-bold", children: breadcrumb.name })
52
+ ] }, index);
53
+ })
54
+ ] }) });
55
+ };
56
+ // Annotate the CommonJS export names for ESM import in node:
57
+ 0 && (module.exports = {
58
+ BreadCrumbs
59
+ });
60
+ //# sourceMappingURL=bread-crumbs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/bread-crumbs.tsx"],"sourcesContent":["import Link from \"next/link\";\nimport { Fragment } from \"react\";\nimport { opinlyConfig } from \"../sdk-config\";\n\nexport const BreadCrumbs = ({\n breadcrumbs,\n}: {\n breadcrumbs?: (\n | {\n name: string;\n url?: string;\n }\n | null\n | undefined\n )[];\n}) => {\n return (\n <nav className=\"text-sm text-orange-100 text-muted-foreground mb-4\">\n <ol className=\"list-reset flex space-x-2\">\n <Link href=\"/\" className=\"font-bold\">\n {opinlyConfig.siteName}\n </Link>\n <span>/</span>\n <Link href={opinlyConfig.blogPrefix} className=\"font-bold\">\n Blog\n </Link>\n {breadcrumbs?.map((breadcrumb, index) => {\n if (!breadcrumb) {\n return null;\n }\n\n return (\n <Fragment key={index}>\n <span>/</span>\n {breadcrumb.url ? (\n <Link href={breadcrumb.url} className=\"font-bold\">\n {breadcrumb.name}\n </Link>\n ) : (\n <span className=\"font-bold\">{breadcrumb.name}</span>\n )}\n </Fragment>\n );\n })}\n </ol>\n </nav>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBQ;AAnBR,kBAAiB;AACjB,mBAAyB;AACzB,wBAA6B;AAEtB,MAAM,cAAc,CAAC;AAAA,EAC1B;AACF,MASM;AACJ,SACE,4CAAC,SAAI,WAAU,sDACb,uDAAC,QAAG,WAAU,6BACZ;AAAA,gDAAC,YAAAA,SAAA,EAAK,MAAK,KAAI,WAAU,aACtB,yCAAa,UAChB;AAAA,IACA,4CAAC,UAAK,eAAC;AAAA,IACP,4CAAC,YAAAA,SAAA,EAAK,MAAM,+BAAa,YAAY,WAAU,aAAY,kBAE3D;AAAA,IACC,aAAa,IAAI,CAAC,YAAY,UAAU;AACvC,UAAI,CAAC,YAAY;AACf,eAAO;AAAA,MACT;AAEA,aACE,6CAAC,yBACC;AAAA,oDAAC,UAAK,eAAC;AAAA,QACN,WAAW,MACV,4CAAC,YAAAA,SAAA,EAAK,MAAM,WAAW,KAAK,WAAU,aACnC,qBAAW,MACd,IAEA,4CAAC,UAAK,WAAU,aAAa,qBAAW,MAAK;AAAA,WAPlC,KASf;AAAA,IAEJ,CAAC;AAAA,KACH,GACF;AAEJ;","names":["Link"]}
@@ -0,0 +1,10 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare const BreadCrumbs: ({ breadcrumbs, }: {
4
+ breadcrumbs?: ({
5
+ name: string;
6
+ url?: string;
7
+ } | null | undefined)[];
8
+ }) => react_jsx_runtime.JSX.Element;
9
+
10
+ export { BreadCrumbs };
@@ -0,0 +1,10 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare const BreadCrumbs: ({ breadcrumbs, }: {
4
+ breadcrumbs?: ({
5
+ name: string;
6
+ url?: string;
7
+ } | null | undefined)[];
8
+ }) => react_jsx_runtime.JSX.Element;
9
+
10
+ export { BreadCrumbs };
@@ -0,0 +1,26 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import Link from "next/link";
3
+ import { Fragment } from "react";
4
+ import { opinlyConfig } from "../sdk-config";
5
+ const BreadCrumbs = ({
6
+ breadcrumbs
7
+ }) => {
8
+ return /* @__PURE__ */ jsx("nav", { className: "text-sm text-orange-100 text-muted-foreground mb-4", children: /* @__PURE__ */ jsxs("ol", { className: "list-reset flex space-x-2", children: [
9
+ /* @__PURE__ */ jsx(Link, { href: "/", className: "font-bold", children: opinlyConfig.siteName }),
10
+ /* @__PURE__ */ jsx("span", { children: "/" }),
11
+ /* @__PURE__ */ jsx(Link, { href: opinlyConfig.blogPrefix, className: "font-bold", children: "Blog" }),
12
+ breadcrumbs?.map((breadcrumb, index) => {
13
+ if (!breadcrumb) {
14
+ return null;
15
+ }
16
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
17
+ /* @__PURE__ */ jsx("span", { children: "/" }),
18
+ breadcrumb.url ? /* @__PURE__ */ jsx(Link, { href: breadcrumb.url, className: "font-bold", children: breadcrumb.name }) : /* @__PURE__ */ jsx("span", { className: "font-bold", children: breadcrumb.name })
19
+ ] }, index);
20
+ })
21
+ ] }) });
22
+ };
23
+ export {
24
+ BreadCrumbs
25
+ };
26
+ //# sourceMappingURL=bread-crumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/bread-crumbs.tsx"],"sourcesContent":["import Link from \"next/link\";\nimport { Fragment } from \"react\";\nimport { opinlyConfig } from \"../sdk-config\";\n\nexport const BreadCrumbs = ({\n breadcrumbs,\n}: {\n breadcrumbs?: (\n | {\n name: string;\n url?: string;\n }\n | null\n | undefined\n )[];\n}) => {\n return (\n <nav className=\"text-sm text-orange-100 text-muted-foreground mb-4\">\n <ol className=\"list-reset flex space-x-2\">\n <Link href=\"/\" className=\"font-bold\">\n {opinlyConfig.siteName}\n </Link>\n <span>/</span>\n <Link href={opinlyConfig.blogPrefix} className=\"font-bold\">\n Blog\n </Link>\n {breadcrumbs?.map((breadcrumb, index) => {\n if (!breadcrumb) {\n return null;\n }\n\n return (\n <Fragment key={index}>\n <span>/</span>\n {breadcrumb.url ? (\n <Link href={breadcrumb.url} className=\"font-bold\">\n {breadcrumb.name}\n </Link>\n ) : (\n <span className=\"font-bold\">{breadcrumb.name}</span>\n )}\n </Fragment>\n );\n })}\n </ol>\n </nav>\n );\n};\n"],"mappings":"AAmBQ,cAaI,YAbJ;AAnBR,OAAO,UAAU;AACjB,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAEtB,MAAM,cAAc,CAAC;AAAA,EAC1B;AACF,MASM;AACJ,SACE,oBAAC,SAAI,WAAU,sDACb,+BAAC,QAAG,WAAU,6BACZ;AAAA,wBAAC,QAAK,MAAK,KAAI,WAAU,aACtB,uBAAa,UAChB;AAAA,IACA,oBAAC,UAAK,eAAC;AAAA,IACP,oBAAC,QAAK,MAAM,aAAa,YAAY,WAAU,aAAY,kBAE3D;AAAA,IACC,aAAa,IAAI,CAAC,YAAY,UAAU;AACvC,UAAI,CAAC,YAAY;AACf,eAAO;AAAA,MACT;AAEA,aACE,qBAAC,YACC;AAAA,4BAAC,UAAK,eAAC;AAAA,QACN,WAAW,MACV,oBAAC,QAAK,MAAM,WAAW,KAAK,WAAU,aACnC,qBAAW,MACd,IAEA,oBAAC,UAAK,WAAU,aAAa,qBAAW,MAAK;AAAA,WAPlC,KASf;AAAA,IAEJ,CAAC;AAAA,KACH,GACF;AAEJ;","names":[]}
@@ -0,0 +1,61 @@
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 folder_page_exports = {};
20
+ __export(folder_page_exports, {
21
+ FolderPage: () => FolderPage
22
+ });
23
+ module.exports = __toCommonJS(folder_page_exports);
24
+ var import_jsx_runtime = require("react/jsx-runtime");
25
+ var import_post_preview = require("../post-preview");
26
+ var import_bread_crumbs = require("../bread-crumbs");
27
+ const FolderPage = ({
28
+ folder
29
+ }) => {
30
+ console.log("folder", JSON.stringify(folder, null, 2));
31
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "max-w-6xl mx-auto px-4 py-10", children: [
32
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_bread_crumbs.BreadCrumbs, {}),
33
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { className: "text-4xl font-bold mb-2", children: folder.name }),
34
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground max-w-2xl mb-8", children: folder.description || `Explore articles about ${folder.name}.` }),
35
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8", children: [
36
+ folder.posts.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-muted-foreground", children: "No posts added yet" }),
37
+ folder.posts.map((post) => {
38
+ console.log("post.image", post.image);
39
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_post_preview.PostPreview, { post }, post.slug);
40
+ })
41
+ ] })
42
+ ] });
43
+ };
44
+ function formatDate(dateStr) {
45
+ return new Date(dateStr).toLocaleDateString("en-GB", {
46
+ day: "2-digit",
47
+ month: "short",
48
+ year: "numeric"
49
+ });
50
+ }
51
+ function formatMinutes(description) {
52
+ if (!description) return "5 min read";
53
+ const words = description.split(" ").length;
54
+ const mins = Math.ceil(words / 200);
55
+ return `${mins} min read`;
56
+ }
57
+ // Annotate the CommonJS export names for ESM import in node:
58
+ 0 && (module.exports = {
59
+ FolderPage
60
+ });
61
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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\";\n\nexport const FolderPage = ({\n folder,\n}: {\n folder: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"folder\" }\n >[\"data\"];\n}) => {\n console.log(\"folder\", JSON.stringify(folder, null, 2));\n return (\n <div className=\"max-w-6xl mx-auto px-4 py-10\">\n <BreadCrumbs />\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 console.log(\"post.image\", post.image);\n return <PostPreview key={post.slug} post={post} />;\n })}\n </div>\n </div>\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;AAeM;AAdN,0BAA4B;AAC5B,0BAA4B;AAErB,MAAM,aAAa,CAAC;AAAA,EACzB;AACF,MAKM;AACJ,UAAQ,IAAI,UAAU,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACrD,SACE,6CAAC,SAAI,WAAU,gCACb;AAAA,gDAAC,mCAAY;AAAA,IAEb,4CAAC,QAAG,WAAU,2BAA2B,iBAAO,MAAK;AAAA,IACrD,4CAAC,OAAE,WAAU,wCACV,iBAAO,eAAe,0BAA0B,OAAO,IAAI,KAC9D;AAAA,IAEA,6CAAC,SAAI,WAAU,wDACZ;AAAA,aAAO,MAAM,WAAW,KACvB,4CAAC,SAAI,WAAU,yBAAwB,gCAAkB;AAAA,MAE1D,OAAO,MAAM,IAAI,CAAC,SAAS;AAC1B,gBAAQ,IAAI,cAAc,KAAK,KAAK;AACpC,eAAO,4CAAC,mCAA4B,QAAX,KAAK,IAAkB;AAAA,MAClD,CAAC;AAAA,OACH;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":[]}
@@ -0,0 +1,10 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { Opinly } from '@opinly/backend';
3
+
4
+ declare const FolderPage: ({ folder, }: {
5
+ folder: Extract<Awaited<ReturnType<Opinly["content"]["blog"]>>, {
6
+ type: "folder";
7
+ }>["data"];
8
+ }) => react_jsx_runtime.JSX.Element;
9
+
10
+ export { FolderPage };
@@ -0,0 +1,10 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { Opinly } from '@opinly/backend';
3
+
4
+ declare const FolderPage: ({ folder, }: {
5
+ folder: Extract<Awaited<ReturnType<Opinly["content"]["blog"]>>, {
6
+ type: "folder";
7
+ }>["data"];
8
+ }) => react_jsx_runtime.JSX.Element;
9
+
10
+ export { FolderPage };
@@ -0,0 +1,37 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { PostPreview } from "../post-preview";
3
+ import { BreadCrumbs } from "../bread-crumbs";
4
+ const FolderPage = ({
5
+ folder
6
+ }) => {
7
+ console.log("folder", JSON.stringify(folder, null, 2));
8
+ return /* @__PURE__ */ jsxs("div", { className: "max-w-6xl mx-auto px-4 py-10", children: [
9
+ /* @__PURE__ */ jsx(BreadCrumbs, {}),
10
+ /* @__PURE__ */ jsx("h1", { className: "text-4xl font-bold mb-2", children: folder.name }),
11
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground max-w-2xl mb-8", children: folder.description || `Explore articles about ${folder.name}.` }),
12
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8", children: [
13
+ folder.posts.length === 0 && /* @__PURE__ */ jsx("div", { className: "text-muted-foreground", children: "No posts added yet" }),
14
+ folder.posts.map((post) => {
15
+ console.log("post.image", post.image);
16
+ return /* @__PURE__ */ jsx(PostPreview, { post }, post.slug);
17
+ })
18
+ ] })
19
+ ] });
20
+ };
21
+ function formatDate(dateStr) {
22
+ return new Date(dateStr).toLocaleDateString("en-GB", {
23
+ day: "2-digit",
24
+ month: "short",
25
+ year: "numeric"
26
+ });
27
+ }
28
+ function formatMinutes(description) {
29
+ if (!description) return "5 min read";
30
+ const words = description.split(" ").length;
31
+ const mins = Math.ceil(words / 200);
32
+ return `${mins} min read`;
33
+ }
34
+ export {
35
+ FolderPage
36
+ };
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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\";\n\nexport const FolderPage = ({\n folder,\n}: {\n folder: Extract<\n Awaited<ReturnType<Opinly[\"content\"][\"blog\"]>>,\n { type: \"folder\" }\n >[\"data\"];\n}) => {\n console.log(\"folder\", JSON.stringify(folder, null, 2));\n return (\n <div className=\"max-w-6xl mx-auto px-4 py-10\">\n <BreadCrumbs />\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 console.log(\"post.image\", post.image);\n return <PostPreview key={post.slug} post={post} />;\n })}\n </div>\n </div>\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":"AAeM,cAOA,YAPA;AAdN,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAErB,MAAM,aAAa,CAAC;AAAA,EACzB;AACF,MAKM;AACJ,UAAQ,IAAI,UAAU,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACrD,SACE,qBAAC,SAAI,WAAU,gCACb;AAAA,wBAAC,eAAY;AAAA,IAEb,oBAAC,QAAG,WAAU,2BAA2B,iBAAO,MAAK;AAAA,IACrD,oBAAC,OAAE,WAAU,wCACV,iBAAO,eAAe,0BAA0B,OAAO,IAAI,KAC9D;AAAA,IAEA,qBAAC,SAAI,WAAU,wDACZ;AAAA,aAAO,MAAM,WAAW,KACvB,oBAAC,SAAI,WAAU,yBAAwB,gCAAkB;AAAA,MAE1D,OAAO,MAAM,IAAI,CAAC,SAAS;AAC1B,gBAAQ,IAAI,cAAc,KAAK,KAAK;AACpC,eAAO,oBAAC,eAA4B,QAAX,KAAK,IAAkB;AAAA,MAClD,CAAC;AAAA,OACH;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":[]}