@appcorp/shadcn 1.1.28 → 1.1.30
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/components/shadcn-example/blog-detail-page/comment-section.d.ts +15 -0
- package/components/shadcn-example/blog-detail-page/comment-section.js +83 -0
- package/components/shadcn-example/blog-detail-page/content.d.ts +7 -0
- package/components/shadcn-example/blog-detail-page/content.js +15 -0
- package/components/shadcn-example/blog-detail-page/header.d.ts +11 -0
- package/components/shadcn-example/blog-detail-page/header.js +36 -0
- package/components/shadcn-example/blog-detail-page/index.d.ts +25 -0
- package/components/shadcn-example/blog-detail-page/index.js +74 -0
- package/components/shadcn-example/blog-page/blog-post-card.d.ts +12 -0
- package/components/shadcn-example/blog-page/blog-post-card.js +30 -0
- package/components/shadcn-example/blog-page/featured-post-sidebar-item.d.ts +9 -0
- package/components/shadcn-example/blog-page/featured-post-sidebar-item.js +19 -0
- package/components/shadcn-example/blog-page/index.d.ts +19 -0
- package/components/shadcn-example/blog-page/index.js +36 -0
- package/package.json +1 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface Comment {
|
|
3
|
+
authorAvatar?: string;
|
|
4
|
+
authorName: string;
|
|
5
|
+
claps: number;
|
|
6
|
+
content: string;
|
|
7
|
+
id: string;
|
|
8
|
+
publishedAt: string;
|
|
9
|
+
}
|
|
10
|
+
interface CommentSectionProps {
|
|
11
|
+
comments: Comment[];
|
|
12
|
+
onAddComment: (content: string) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare const CommentSection: ({ comments, onAddComment, }: CommentSectionProps) => React.JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CommentSection = void 0;
|
|
37
|
+
var react_1 = __importStar(require("react"));
|
|
38
|
+
var button_1 = require("@/components/ui/button");
|
|
39
|
+
var textarea_1 = require("@/components/ui/textarea");
|
|
40
|
+
var avatar_1 = require("@/components/ui/avatar");
|
|
41
|
+
var lucide_react_1 = require("lucide-react");
|
|
42
|
+
var CommentSection = function (_a) {
|
|
43
|
+
var comments = _a.comments, onAddComment = _a.onAddComment;
|
|
44
|
+
var _b = (0, react_1.useState)(""), newComment = _b[0], setNewComment = _b[1];
|
|
45
|
+
var handleSubmit = function (e) {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
if (newComment.trim()) {
|
|
48
|
+
onAddComment(newComment);
|
|
49
|
+
setNewComment("");
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
return (react_1.default.createElement("section", { className: "space-y-6" },
|
|
53
|
+
react_1.default.createElement("div", { className: "border-blog-border border-t pt-12" },
|
|
54
|
+
react_1.default.createElement("h2", { className: "text-foreground mb-8 flex items-center gap-2 text-2xl font-bold" },
|
|
55
|
+
react_1.default.createElement(lucide_react_1.MessageCircle, { className: "h-6 w-6" }),
|
|
56
|
+
"Comments (",
|
|
57
|
+
comments.length,
|
|
58
|
+
")"),
|
|
59
|
+
react_1.default.createElement("form", { onSubmit: handleSubmit, className: "bg-card border-blog-border mb-12 rounded-xl border p-6" },
|
|
60
|
+
react_1.default.createElement("div", { className: "space-y-4" },
|
|
61
|
+
react_1.default.createElement(textarea_1.Textarea, { placeholder: "Share your thoughts...", value: newComment, onChange: function (e) { return setNewComment(e.target.value); }, className: "border-blog-border focus:border-primary min-h-[100px] resize-none" }),
|
|
62
|
+
react_1.default.createElement("div", { className: "flex justify-end" },
|
|
63
|
+
react_1.default.createElement(button_1.Button, { type: "submit", className: "gap-2" },
|
|
64
|
+
react_1.default.createElement(lucide_react_1.Send, { className: "h-4 w-4" }),
|
|
65
|
+
"Post Comment")))),
|
|
66
|
+
react_1.default.createElement("div", { className: "space-y-6" }, comments.map(function (comment) { return (react_1.default.createElement("div", { key: comment.id, className: "bg-card border-blog-border hover:bg-blog-hover rounded-xl border p-6 transition-colors" },
|
|
67
|
+
react_1.default.createElement("div", { className: "flex items-start space-x-4" },
|
|
68
|
+
react_1.default.createElement(avatar_1.Avatar, { className: "h-10 w-10" },
|
|
69
|
+
react_1.default.createElement(avatar_1.AvatarImage, { src: comment.authorAvatar, alt: comment.authorName }),
|
|
70
|
+
react_1.default.createElement(avatar_1.AvatarFallback, null, comment.authorName.charAt(0))),
|
|
71
|
+
react_1.default.createElement("div", { className: "flex-1 space-y-3" },
|
|
72
|
+
react_1.default.createElement("div", { className: "flex items-center justify-between" },
|
|
73
|
+
react_1.default.createElement("div", null,
|
|
74
|
+
react_1.default.createElement("p", { className: "text-foreground font-medium" }, comment.authorName),
|
|
75
|
+
react_1.default.createElement("p", { className: "text-blog-meta text-sm" }, comment.publishedAt))),
|
|
76
|
+
react_1.default.createElement("p", { className: "text-blog-content leading-relaxed" }, comment.content),
|
|
77
|
+
react_1.default.createElement("div", { className: "flex items-center gap-4" },
|
|
78
|
+
react_1.default.createElement(button_1.Button, { variant: "ghost", size: "sm", className: "text-blog-meta hover:text-primary gap-2" },
|
|
79
|
+
react_1.default.createElement(lucide_react_1.Heart, { className: "h-4 w-4" }),
|
|
80
|
+
comment.claps),
|
|
81
|
+
react_1.default.createElement(button_1.Button, { variant: "ghost", size: "sm", className: "text-blog-meta hover:text-primary" }, "Reply")))))); })))));
|
|
82
|
+
};
|
|
83
|
+
exports.CommentSection = CommentSection;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Content = void 0;
|
|
7
|
+
var react_1 = __importDefault(require("react"));
|
|
8
|
+
var Content = function (_a) {
|
|
9
|
+
var content = _a.content, coverImage = _a.coverImage;
|
|
10
|
+
return (react_1.default.createElement("article", { className: "space-y-8" },
|
|
11
|
+
coverImage && (react_1.default.createElement("div", { className: "bg-muted aspect-video w-full overflow-hidden rounded-xl" },
|
|
12
|
+
react_1.default.createElement("img", { src: coverImage, alt: "Blog cover", className: "h-full w-full object-cover" }))),
|
|
13
|
+
react_1.default.createElement("div", { className: "prose prose-lg max-w-none" }, content.map(function (paragraph, index) { return (react_1.default.createElement("p", { key: index, className: "text-blog-content mb-6 leading-relaxed" }, paragraph)); }))));
|
|
14
|
+
};
|
|
15
|
+
exports.Content = Content;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface BlogHeaderProps {
|
|
3
|
+
category: string;
|
|
4
|
+
title: string;
|
|
5
|
+
authorName: string;
|
|
6
|
+
authorAvatar?: string;
|
|
7
|
+
publishedAt: string;
|
|
8
|
+
onBack: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare const Header: ({ category, title, authorName, authorAvatar, publishedAt, onBack, }: BlogHeaderProps) => React.JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Header = void 0;
|
|
7
|
+
var react_1 = __importDefault(require("react"));
|
|
8
|
+
var lucide_react_1 = require("lucide-react");
|
|
9
|
+
var button_1 = require("@/components/ui/button");
|
|
10
|
+
var avatar_1 = require("@/components/ui/avatar");
|
|
11
|
+
var badge_1 = require("@/components/ui/badge");
|
|
12
|
+
var Header = function (_a) {
|
|
13
|
+
var category = _a.category, title = _a.title, authorName = _a.authorName, authorAvatar = _a.authorAvatar, publishedAt = _a.publishedAt, onBack = _a.onBack;
|
|
14
|
+
return (react_1.default.createElement("header", { className: "space-y-6" },
|
|
15
|
+
react_1.default.createElement(badge_1.Badge, { variant: "outline" }, category),
|
|
16
|
+
react_1.default.createElement("h1", { className: "text-foreground text-4xl leading-15 font-bold tracking-tight md:text-4xl lg:text-5xl" }, title),
|
|
17
|
+
react_1.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-4" },
|
|
18
|
+
react_1.default.createElement("div", { className: "flex items-center space-x-4" },
|
|
19
|
+
react_1.default.createElement(avatar_1.Avatar, { className: "h-12 w-12" },
|
|
20
|
+
react_1.default.createElement(avatar_1.AvatarImage, { src: authorAvatar, alt: authorName, className: "object-cover" }),
|
|
21
|
+
react_1.default.createElement(avatar_1.AvatarFallback, null, authorName.charAt(0))),
|
|
22
|
+
react_1.default.createElement("div", null,
|
|
23
|
+
react_1.default.createElement("p", { className: "font-medium" },
|
|
24
|
+
"by ",
|
|
25
|
+
authorName),
|
|
26
|
+
react_1.default.createElement("p", { className: "text-muted-foreground text-sm" }, publishedAt))),
|
|
27
|
+
react_1.default.createElement("div", { className: "flex items-center space-x-3" },
|
|
28
|
+
react_1.default.createElement("span", { className: "text-muted-foreground text-[11px] font-medium tracking-widest uppercase" }, "Share this"),
|
|
29
|
+
react_1.default.createElement(button_1.Button, { variant: "outline", size: "icon", className: "hover:bg-blog-hover h-9 w-9 rounded-full" },
|
|
30
|
+
react_1.default.createElement(lucide_react_1.Twitter, null)),
|
|
31
|
+
react_1.default.createElement(button_1.Button, { variant: "outline", size: "icon", className: "hover:bg-blog-hover h-9 w-9 rounded-full" },
|
|
32
|
+
react_1.default.createElement(lucide_react_1.Facebook, null)),
|
|
33
|
+
react_1.default.createElement(button_1.Button, { variant: "outline", size: "icon", className: "hover:bg-blog-hover h-9 w-9 rounded-full" },
|
|
34
|
+
react_1.default.createElement(lucide_react_1.Linkedin, null))))));
|
|
35
|
+
};
|
|
36
|
+
exports.Header = Header;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type FC } from "react";
|
|
2
|
+
export type Comment = {
|
|
3
|
+
authorAvatar?: string;
|
|
4
|
+
authorName: string;
|
|
5
|
+
claps: number;
|
|
6
|
+
content: string;
|
|
7
|
+
id: string;
|
|
8
|
+
publishedAt: string;
|
|
9
|
+
};
|
|
10
|
+
export type BlogItem = {
|
|
11
|
+
authorAvatar?: string;
|
|
12
|
+
authorName: string;
|
|
13
|
+
category: string;
|
|
14
|
+
claps?: number;
|
|
15
|
+
content: string[];
|
|
16
|
+
publishedAt: string;
|
|
17
|
+
title: string;
|
|
18
|
+
};
|
|
19
|
+
type BlogDetailPageProps = {
|
|
20
|
+
blog: BlogItem;
|
|
21
|
+
recommendedPosts?: BlogItem[];
|
|
22
|
+
initialComments?: Comment[];
|
|
23
|
+
};
|
|
24
|
+
export declare const BlogDetailPage: FC<BlogDetailPageProps>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
37
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
38
|
+
if (ar || !(i in from)) {
|
|
39
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
40
|
+
ar[i] = from[i];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
44
|
+
};
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.BlogDetailPage = void 0;
|
|
47
|
+
var react_1 = __importStar(require("react"));
|
|
48
|
+
var header_1 = require("./header");
|
|
49
|
+
var content_1 = require("./content");
|
|
50
|
+
var comment_section_1 = require("./comment-section");
|
|
51
|
+
var BlogDetailPage = function (_a) {
|
|
52
|
+
// const navigate = useRouter();
|
|
53
|
+
var blog = _a.blog, _b = _a.initialComments, initialComments = _b === void 0 ? [] : _b;
|
|
54
|
+
var _c = (0, react_1.useState)(initialComments), comments = _c[0], setComments = _c[1];
|
|
55
|
+
var handleAddComment = function (content) {
|
|
56
|
+
var newComment = {
|
|
57
|
+
id: Date.now().toString(),
|
|
58
|
+
authorName: "You",
|
|
59
|
+
authorAvatar: "/placeholder.svg",
|
|
60
|
+
content: content,
|
|
61
|
+
publishedAt: "Just now",
|
|
62
|
+
claps: 0,
|
|
63
|
+
};
|
|
64
|
+
setComments(__spreadArray([newComment], comments, true));
|
|
65
|
+
};
|
|
66
|
+
return (react_1.default.createElement("div", { className: "bg-background min-h-screen" },
|
|
67
|
+
react_1.default.createElement("div", { className: "mx-auto max-w-4xl px-6 py-12" },
|
|
68
|
+
react_1.default.createElement(header_1.Header, { authorAvatar: blog.authorAvatar, authorName: blog.authorName, category: blog.category, onBack: function () { return void 0; }, publishedAt: blog.publishedAt, title: blog.title }),
|
|
69
|
+
react_1.default.createElement("div", { className: "mt-16" },
|
|
70
|
+
react_1.default.createElement(content_1.Content, { content: blog.content, coverImage: "https://plus.unsplash.com/premium_photo-1683211783920-8c66ab120c09" })),
|
|
71
|
+
react_1.default.createElement("div", { className: "mt-16" },
|
|
72
|
+
react_1.default.createElement(comment_section_1.CommentSection, { comments: comments, onAddComment: handleAddComment })))));
|
|
73
|
+
};
|
|
74
|
+
exports.BlogDetailPage = BlogDetailPage;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface BlogPostCardProps {
|
|
3
|
+
imageSrc: string;
|
|
4
|
+
imageAlt: string;
|
|
5
|
+
title: string;
|
|
6
|
+
description: string;
|
|
7
|
+
authorName: string;
|
|
8
|
+
authorAvatarSrc: string;
|
|
9
|
+
readTime: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const BlogPostCard: ({ authorAvatarSrc, authorName, description, imageAlt, imageSrc, readTime, title, }: BlogPostCardProps) => React.JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BlogPostCard = void 0;
|
|
7
|
+
var react_1 = __importDefault(require("react"));
|
|
8
|
+
var image_1 = __importDefault(require("next/image"));
|
|
9
|
+
var avatar_1 = require("../../../components/ui/avatar");
|
|
10
|
+
var BlogPostCard = function (_a) {
|
|
11
|
+
var authorAvatarSrc = _a.authorAvatarSrc, authorName = _a.authorName, description = _a.description, imageAlt = _a.imageAlt, imageSrc = _a.imageSrc, readTime = _a.readTime, title = _a.title;
|
|
12
|
+
return (react_1.default.createElement("div", { className: "bg-card text-card-foreground overflow-hidden rounded-lg border" },
|
|
13
|
+
react_1.default.createElement(image_1.default, { alt: imageAlt, className: "h-48 w-full object-cover", height: 225, src: imageSrc, width: 400 }),
|
|
14
|
+
react_1.default.createElement("div", { className: "grid gap-2 p-4" },
|
|
15
|
+
react_1.default.createElement("h3", { className: "text-lg leading-tight font-semibold" }, title),
|
|
16
|
+
react_1.default.createElement("p", { className: "text-muted-foreground line-clamp-3 text-sm" }, description),
|
|
17
|
+
react_1.default.createElement("div", { className: "text-muted-foreground flex items-center gap-2 text-sm" },
|
|
18
|
+
react_1.default.createElement(avatar_1.Avatar, { className: "h-6 w-6" },
|
|
19
|
+
react_1.default.createElement(avatar_1.AvatarImage, { src: authorAvatarSrc || "/placeholder.svg" }),
|
|
20
|
+
react_1.default.createElement(avatar_1.AvatarFallback, null, authorName
|
|
21
|
+
.split(" ")
|
|
22
|
+
.map(function (n) { return n[0]; })
|
|
23
|
+
.join(""))),
|
|
24
|
+
react_1.default.createElement("span", null, authorName),
|
|
25
|
+
react_1.default.createElement("span", null, "\u2022"),
|
|
26
|
+
react_1.default.createElement("span", null,
|
|
27
|
+
readTime,
|
|
28
|
+
" read")))));
|
|
29
|
+
};
|
|
30
|
+
exports.BlogPostCard = BlogPostCard;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface FeaturedPostSidebarItemProps {
|
|
3
|
+
imageSrc: string;
|
|
4
|
+
imageAlt: string;
|
|
5
|
+
title: string;
|
|
6
|
+
tags: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare const FeaturedPostSidebarItem: ({ imageSrc, imageAlt, title, tags, }: FeaturedPostSidebarItemProps) => React.JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FeaturedPostSidebarItem = void 0;
|
|
7
|
+
var react_1 = __importDefault(require("react"));
|
|
8
|
+
var image_1 = __importDefault(require("next/image"));
|
|
9
|
+
var badge_1 = require("../../ui/badge");
|
|
10
|
+
var FeaturedPostSidebarItem = function (_a) {
|
|
11
|
+
var imageSrc = _a.imageSrc, imageAlt = _a.imageAlt, title = _a.title, tags = _a.tags;
|
|
12
|
+
return (react_1.default.createElement("div", { className: "flex flex-col gap-2" },
|
|
13
|
+
react_1.default.createElement("div", { className: "flex items-center gap-4" },
|
|
14
|
+
react_1.default.createElement(image_1.default, { alt: imageAlt, className: "aspect-square rounded-md object-cover", height: 64, src: imageSrc || "/placeholder.svg", width: 64 }),
|
|
15
|
+
react_1.default.createElement("div", null,
|
|
16
|
+
react_1.default.createElement("h4", { className: "text-sm leading-snug font-medium" }, title),
|
|
17
|
+
react_1.default.createElement("div", { className: "flex flex-row gap-4" }, tags === null || tags === void 0 ? void 0 : tags.map(function (tag) { return (react_1.default.createElement(badge_1.Badge, { key: tag, className: "mb-2 w-fit bg-black text-white backdrop-blur-sm" }, tag)); }))))));
|
|
18
|
+
};
|
|
19
|
+
exports.FeaturedPostSidebarItem = FeaturedPostSidebarItem;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
export type BlogItem = {
|
|
3
|
+
authorAvatarSrc: string;
|
|
4
|
+
authorName: string;
|
|
5
|
+
description: string;
|
|
6
|
+
imageAlt?: string;
|
|
7
|
+
imageSrc: string;
|
|
8
|
+
isFeatured: boolean;
|
|
9
|
+
link: string;
|
|
10
|
+
readTime: string;
|
|
11
|
+
tags: string[];
|
|
12
|
+
title: string;
|
|
13
|
+
};
|
|
14
|
+
type BlogPageProps = {
|
|
15
|
+
items: BlogItem[];
|
|
16
|
+
recommendedPosts: BlogItem[];
|
|
17
|
+
};
|
|
18
|
+
export declare const BlogPage: FC<BlogPageProps>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BlogPage = void 0;
|
|
7
|
+
var react_1 = __importDefault(require("react"));
|
|
8
|
+
var link_1 = __importDefault(require("next/link"));
|
|
9
|
+
var image_1 = __importDefault(require("next/image"));
|
|
10
|
+
var badge_1 = require("../../../components/ui/badge");
|
|
11
|
+
var button_1 = require("../../../components/ui/button");
|
|
12
|
+
var blog_post_card_1 = require("./blog-post-card");
|
|
13
|
+
var featured_post_sidebar_item_1 = require("./featured-post-sidebar-item");
|
|
14
|
+
var BlogPage = function (_a) {
|
|
15
|
+
var _b;
|
|
16
|
+
var items = _a.items, recommendedPosts = _a.recommendedPosts;
|
|
17
|
+
var featuredPost = items.find(function (item) { return item.isFeatured; });
|
|
18
|
+
var otherPosts = items.filter(function (item) { return !item.isFeatured; });
|
|
19
|
+
return (react_1.default.createElement("div", { className: "container mx-auto px-4 py-8 md:px-6 lg:px-8" },
|
|
20
|
+
react_1.default.createElement("div", { className: "grid grid-cols-1 gap-8 lg:grid-cols-3" },
|
|
21
|
+
react_1.default.createElement("div", { className: "relative h-[400px] overflow-hidden rounded-lg shadow-lg md:h-[500px] lg:col-span-2" },
|
|
22
|
+
(featuredPost === null || featuredPost === void 0 ? void 0 : featuredPost.imageSrc) && (react_1.default.createElement(image_1.default, { alt: featuredPost.imageAlt, className: "w-full object-cover", fill: true, height: 0, sizes: "70vw", src: featuredPost.imageSrc, width: 0 })),
|
|
23
|
+
react_1.default.createElement("div", { className: "absolute inset-0 flex flex-col justify-end bg-gradient-to-t from-black/70 to-transparent p-6 text-white" },
|
|
24
|
+
react_1.default.createElement("div", { className: "flex flex-row gap-4" }, (_b = featuredPost === null || featuredPost === void 0 ? void 0 : featuredPost.tags) === null || _b === void 0 ? void 0 : _b.map(function (tag) { return (react_1.default.createElement(badge_1.Badge, { key: tag, className: "mb-2 w-fit bg-white/20 text-white backdrop-blur-sm" }, tag)); })),
|
|
25
|
+
react_1.default.createElement("h2", { className: "text-2xl leading-tight font-bold md:text-3xl" }, featuredPost === null || featuredPost === void 0 ? void 0 : featuredPost.title))),
|
|
26
|
+
react_1.default.createElement("div", { className: "bg-card text-card-foreground space-y-6 rounded-lg border p-6 lg:col-span-1" },
|
|
27
|
+
react_1.default.createElement("h3", { className: "text-xl font-semibold" }, "Other posts"),
|
|
28
|
+
react_1.default.createElement("div", { className: "space-y-4" }, otherPosts.map(function (item) { return (react_1.default.createElement(featured_post_sidebar_item_1.FeaturedPostSidebarItem, { imageAlt: item.imageAlt, imageSrc: item.imageSrc, key: item.title, tags: item.tags, title: item.title })); })))),
|
|
29
|
+
react_1.default.createElement("div", { className: "mt-12" },
|
|
30
|
+
react_1.default.createElement("div", { className: "mb-6 flex items-center justify-between" },
|
|
31
|
+
react_1.default.createElement("h2", { className: "text-2xl font-bold" }, "Recommended Posts"),
|
|
32
|
+
react_1.default.createElement(button_1.Button, { variant: "outline", asChild: true },
|
|
33
|
+
react_1.default.createElement(link_1.default, { href: "#" }, "All Posts"))),
|
|
34
|
+
react_1.default.createElement("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3" }, recommendedPosts.map(function (p) { return (react_1.default.createElement(blog_post_card_1.BlogPostCard, { authorAvatarSrc: p.authorAvatarSrc, authorName: p.authorName, description: p.description, imageAlt: p.imageAlt, imageSrc: p.imageSrc, key: p.title, readTime: p.readTime, title: p.title })); })))));
|
|
35
|
+
};
|
|
36
|
+
exports.BlogPage = BlogPage;
|