singularity-components 0.1.140 → 0.1.193
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/README.md +36 -4
- package/dist/components/blocks/cards/blogpost-card.d.ts +13 -0
- package/dist/components/blocks/cards/blogpost-card.js +79 -0
- package/dist/components/blocks/cards/blogpost-card.js.map +1 -0
- package/dist/components/blocks/cards/card.d.ts +14 -0
- package/dist/components/blocks/cards/card.js +86 -0
- package/dist/components/blocks/cards/card.js.map +1 -0
- package/dist/components/blocks/empty-state/EmptyState.d.ts +15 -0
- package/dist/components/blocks/empty-state/EmptyState.js +36 -0
- package/dist/components/blocks/empty-state/EmptyState.js.map +1 -0
- package/dist/components/blocks/index.d.ts +5 -0
- package/dist/components/blocks/index.js +5 -0
- package/dist/components/blocks/index.js.map +1 -0
- package/dist/components/blocks/post-list/post-filters.d.ts +19 -0
- package/dist/components/blocks/post-list/post-filters.js +99 -0
- package/dist/components/blocks/post-list/post-filters.js.map +1 -0
- package/dist/components/blocks/post-list/post-list-with-filters.d.ts +19 -0
- package/dist/components/blocks/post-list/post-list-with-filters.js +439 -0
- package/dist/components/blocks/post-list/post-list-with-filters.js.map +1 -0
- package/dist/components/index.d.ts +43 -10
- package/dist/components/index.js +5 -3
- package/dist/components/index.js.map +1 -1
- package/dist/components/pages/admin/admin-page.d.ts +8 -0
- package/dist/components/pages/admin/admin-page.js +299 -0
- package/dist/components/pages/admin/admin-page.js.map +1 -0
- package/dist/components/pages/blogpost/blogpost.d.ts +5 -0
- package/dist/components/pages/blogpost/blogpost.js +440 -0
- package/dist/components/pages/blogpost/blogpost.js.map +1 -0
- package/dist/components/pages/category/category-page.d.ts +8 -0
- package/dist/components/pages/category/category-page.js +69 -0
- package/dist/components/pages/category/category-page.js.map +1 -0
- package/dist/components/pages/chat/chat-page.d.ts +5 -0
- package/dist/components/pages/chat/chat-page.js +209 -0
- package/dist/components/pages/chat/chat-page.js.map +1 -0
- package/dist/components/pages/index.d.ts +11 -0
- package/dist/components/pages/index.js +11 -0
- package/dist/components/pages/index.js.map +1 -0
- package/dist/components/pages/login/login-page.d.ts +19 -0
- package/dist/components/pages/login/login-page.js +108 -0
- package/dist/components/pages/login/login-page.js.map +1 -0
- package/dist/components/pages/maintenance/maintenance-page.d.ts +5 -0
- package/dist/components/pages/maintenance/maintenance-page.js +50 -0
- package/dist/components/pages/maintenance/maintenance-page.js.map +1 -0
- package/dist/components/pages/not-found/not-found.d.ts +10 -0
- package/dist/components/pages/not-found/not-found.js +64 -0
- package/dist/components/pages/not-found/not-found.js.map +1 -0
- package/dist/components/pages/privacy/privacy-page.d.ts +15 -0
- package/dist/components/pages/privacy/privacy-page.js +98 -0
- package/dist/components/pages/privacy/privacy-page.js.map +1 -0
- package/dist/components/pages/search/search-page.d.ts +5 -0
- package/dist/components/pages/search/search-page.js +18 -0
- package/dist/components/pages/search/search-page.js.map +1 -0
- package/dist/components/pages/startpage/startpage.d.ts +5 -0
- package/dist/components/pages/startpage/startpage.js +50 -0
- package/dist/components/pages/startpage/startpage.js.map +1 -0
- package/dist/components/pages/terms/terms-page.d.ts +15 -0
- package/dist/components/pages/terms/terms-page.js +98 -0
- package/dist/components/pages/terms/terms-page.js.map +1 -0
- package/dist/components/primitives/accordion/accordion.js +1 -1
- package/dist/components/primitives/accordion/accordion.js.map +1 -1
- package/dist/components/primitives/alert/alert.js +1 -1
- package/dist/components/primitives/alert/alert.js.map +1 -1
- package/dist/components/primitives/avatar/avatar.d.ts +14 -0
- package/dist/components/primitives/avatar/avatar.js +103 -0
- package/dist/components/primitives/avatar/avatar.js.map +1 -0
- package/dist/components/primitives/badge/badge.d.ts +12 -4
- package/dist/components/primitives/badge/badge.js +15 -15
- package/dist/components/primitives/badge/badge.js.map +1 -1
- package/dist/components/primitives/badge/badges.js +1 -1
- package/dist/components/primitives/badge/badges.js.map +1 -1
- package/dist/components/primitives/{button → buttons}/button.d.ts +15 -9
- package/dist/components/primitives/buttons/button.js +92 -0
- package/dist/components/primitives/buttons/button.js.map +1 -0
- package/dist/components/primitives/buttons/icon-button.d.ts +33 -0
- package/dist/components/primitives/buttons/icon-button.js +61 -0
- package/dist/components/primitives/buttons/icon-button.js.map +1 -0
- package/dist/components/primitives/buttons/link-button.d.ts +16 -0
- package/dist/components/primitives/buttons/link-button.js +35 -0
- package/dist/components/primitives/buttons/link-button.js.map +1 -0
- package/dist/components/primitives/collapsible/collapsible.d.ts +9 -0
- package/dist/components/primitives/collapsible/collapsible.js +53 -0
- package/dist/components/primitives/collapsible/collapsible.js.map +1 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu.d.ts +30 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu.js +164 -0
- package/dist/components/primitives/dropdown-menu/dropdown-menu.js.map +1 -0
- package/dist/components/primitives/forms/checkbox.d.ts +6 -0
- package/dist/components/primitives/forms/checkbox.js +30 -0
- package/dist/components/primitives/forms/checkbox.js.map +1 -0
- package/dist/components/primitives/forms/field.d.ts +29 -0
- package/dist/components/primitives/forms/field.js +218 -0
- package/dist/components/primitives/forms/field.js.map +1 -0
- package/dist/components/primitives/forms/input.d.ts +6 -0
- package/dist/components/primitives/forms/input.js +22 -0
- package/dist/components/primitives/forms/input.js.map +1 -0
- package/dist/components/primitives/forms/select.d.ts +22 -0
- package/dist/components/primitives/forms/select.js +169 -0
- package/dist/components/primitives/forms/select.js.map +1 -0
- package/dist/components/primitives/forms/textarea.d.ts +6 -0
- package/dist/components/primitives/forms/textarea.js +20 -0
- package/dist/components/primitives/forms/textarea.js.map +1 -0
- package/dist/components/primitives/icon/icon.d.ts +10 -3
- package/dist/components/primitives/icon/icon.js +15 -14
- package/dist/components/primitives/icon/icon.js.map +1 -1
- package/dist/components/primitives/index.d.ts +25 -7
- package/dist/components/primitives/index.js +31 -18
- package/dist/components/primitives/index.js.map +1 -1
- package/dist/components/primitives/label/label.d.ts +6 -0
- package/dist/components/primitives/label/label.js +22 -0
- package/dist/components/primitives/label/label.js.map +1 -0
- package/dist/components/primitives/layout/layout.d.ts +8 -4
- package/dist/components/primitives/layout/layout.js +35 -17
- package/dist/components/primitives/layout/layout.js.map +1 -1
- package/dist/components/primitives/link/link.d.ts +42 -0
- package/dist/components/primitives/link/link.js +83 -0
- package/dist/components/primitives/link/link.js.map +1 -0
- package/dist/components/primitives/separator/separator.js +1 -1
- package/dist/components/primitives/separator/separator.js.map +1 -1
- package/dist/components/primitives/sheet/sheet.d.ts +29 -0
- package/dist/components/primitives/sheet/sheet.js +117 -0
- package/dist/components/primitives/sheet/sheet.js.map +1 -0
- package/dist/components/primitives/skeleton/skeleton.js +1 -1
- package/dist/components/primitives/skeleton/skeleton.js.map +1 -1
- package/dist/components/primitives/sonner/sonner.d.ts +7 -0
- package/dist/components/primitives/sonner/sonner.js +42 -0
- package/dist/components/primitives/sonner/sonner.js.map +1 -0
- package/dist/components/primitives/sonner/use-toast.d.ts +24 -0
- package/dist/components/primitives/sonner/use-toast.js +21 -0
- package/dist/components/primitives/sonner/use-toast.js.map +1 -0
- package/dist/components/primitives/spinner/spinner.js +1 -1
- package/dist/components/primitives/spinner/spinner.js.map +1 -1
- package/dist/components/primitives/stack/stack.d.ts +5 -1
- package/dist/components/primitives/stack/stack.js +46 -5
- package/dist/components/primitives/stack/stack.js.map +1 -1
- package/dist/components/primitives/text/{text-heading.d.ts → heading.d.ts} +5 -5
- package/dist/components/primitives/text/heading.js +53 -0
- package/dist/components/primitives/text/heading.js.map +1 -0
- package/dist/components/primitives/text/internal/text-element.d.ts +30 -4
- package/dist/components/primitives/text/internal/text-element.js +24 -14
- package/dist/components/primitives/text/internal/text-element.js.map +1 -1
- package/dist/components/primitives/text/text-code.d.ts +26 -0
- package/dist/components/primitives/text/text-code.js +44 -0
- package/dist/components/primitives/text/text-code.js.map +1 -0
- package/dist/components/primitives/text/text-div.d.ts +1 -1
- package/dist/components/primitives/text/text-div.js +2 -2
- package/dist/components/primitives/text/text-div.js.map +1 -1
- package/dist/components/primitives/text/text-span.js +2 -2
- package/dist/components/primitives/text/text-span.js.map +1 -1
- package/dist/components/primitives/text/text-time.js +2 -2
- package/dist/components/primitives/text/text-time.js.map +1 -1
- package/dist/components/primitives/text/text.d.ts +16 -0
- package/dist/components/primitives/text/{text-paragraph.js → text.js} +16 -5
- package/dist/components/primitives/text/text.js.map +1 -0
- package/dist/components/primitives/{ui-image.d.ts → ui-image/ui-image.d.ts} +1 -1
- package/dist/components/primitives/{ui-image.js → ui-image/ui-image.js} +4 -7
- package/dist/components/primitives/ui-image/ui-image.js.map +1 -0
- package/dist/components/primitives/ui-link/ui-link.d.ts +8 -0
- package/dist/components/primitives/ui-link/ui-link.js +19 -0
- package/dist/components/primitives/ui-link/ui-link.js.map +1 -0
- package/dist/components/providers/LinkContext.d.ts +1 -1
- package/dist/components/providers/LinkContext.js +1 -1
- package/dist/components/providers/LinkContext.js.map +1 -1
- package/dist/components/providers/SingularityContext.d.ts +4 -1
- package/dist/components/providers/SingularityContext.js +7 -3
- package/dist/components/providers/SingularityContext.js.map +1 -1
- package/dist/components/providers/auth-provider.d.ts +15 -0
- package/dist/components/providers/auth-provider.js +30 -0
- package/dist/components/providers/auth-provider.js.map +1 -0
- package/dist/components/providers/index.d.ts +3 -0
- package/dist/components/providers/index.js +5 -3
- package/dist/components/providers/index.js.map +1 -1
- package/dist/components/providers/theme-provider.d.ts +27 -0
- package/dist/components/providers/theme-provider.js +75 -0
- package/dist/components/providers/theme-provider.js.map +1 -0
- package/dist/components/templates/container/container.d.ts +20 -0
- package/dist/components/templates/container/container.js +58 -0
- package/dist/components/templates/container/container.js.map +1 -0
- package/dist/components/templates/footer/footer.d.ts +5 -0
- package/dist/components/templates/footer/footer.js +12 -0
- package/dist/components/templates/footer/footer.js.map +1 -0
- package/dist/components/templates/form/form.d.ts +5 -0
- package/dist/components/templates/form/form.js +141 -0
- package/dist/components/templates/form/form.js.map +1 -0
- package/dist/components/templates/hero/hero.d.ts +18 -0
- package/dist/components/templates/hero/hero.js +301 -0
- package/dist/components/templates/hero/hero.js.map +1 -0
- package/dist/components/templates/index.d.ts +5 -0
- package/dist/components/templates/index.js +5 -0
- package/dist/components/templates/index.js.map +1 -0
- package/dist/components/templates/navigation/header.d.ts +19 -0
- package/dist/components/templates/navigation/header.js +222 -0
- package/dist/components/templates/navigation/header.js.map +1 -0
- package/dist/components/templates/navigation/index.d.ts +3 -0
- package/dist/components/templates/navigation/index.js +2 -0
- package/dist/components/templates/navigation/index.js.map +1 -0
- package/dist/css/variables.css +75 -73
- package/dist/css/variables.css.map +1 -1
- package/dist/data/authors.d.ts +12 -0
- package/dist/data/authors.js +33 -0
- package/dist/data/authors.js.map +1 -0
- package/dist/data/posts.d.ts +22 -0
- package/dist/data/posts.js +285 -0
- package/dist/data/posts.js.map +1 -0
- package/dist/index.d.ts +43 -10
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/helpers/index.js +1 -1
- package/dist/lib/helpers/index.js.map +1 -1
- package/dist/lib/hooks/useIsClient.d.ts +3 -0
- package/dist/lib/hooks/useIsClient.js +14 -0
- package/dist/lib/hooks/useIsClient.js.map +1 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +2 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/types.d.ts +4 -8
- package/dist/main.css +2026 -455
- package/dist/main.css.map +1 -1
- package/dist/{utils.js → utils/index.js} +1 -1
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.test.js +37 -0
- package/dist/utils/index.test.js.map +1 -0
- package/package.json +80 -44
- package/dist/components/primitives/accordion/accordion.stories.d.ts +0 -15
- package/dist/components/primitives/accordion/accordion.stories.js +0 -60
- package/dist/components/primitives/accordion/accordion.stories.js.map +0 -1
- package/dist/components/primitives/alert/alert.stories.d.ts +0 -22
- package/dist/components/primitives/alert/alert.stories.js +0 -37
- package/dist/components/primitives/alert/alert.stories.js.map +0 -1
- package/dist/components/primitives/button/button.js +0 -56
- package/dist/components/primitives/button/button.js.map +0 -1
- package/dist/components/primitives/button/button.stories.d.ts +0 -34
- package/dist/components/primitives/button/button.stories.js +0 -74
- package/dist/components/primitives/button/button.stories.js.map +0 -1
- package/dist/components/primitives/button/button_with_icon_variant.js +0 -1
- package/dist/components/primitives/button/button_with_icon_variant.js.map +0 -1
- package/dist/components/primitives/icon/icon.stories.d.ts +0 -27
- package/dist/components/primitives/icon/icon.stories.js +0 -30
- package/dist/components/primitives/icon/icon.stories.js.map +0 -1
- package/dist/components/primitives/layout/layout.stories.d.ts +0 -32
- package/dist/components/primitives/layout/layout.stories.js +0 -72
- package/dist/components/primitives/layout/layout.stories.js.map +0 -1
- package/dist/components/primitives/separator/separator.stories.d.ts +0 -15
- package/dist/components/primitives/separator/separator.stories.js +0 -18
- package/dist/components/primitives/separator/separator.stories.js.map +0 -1
- package/dist/components/primitives/skeleton/skeleton.stories.d.ts +0 -13
- package/dist/components/primitives/skeleton/skeleton.stories.js +0 -16
- package/dist/components/primitives/skeleton/skeleton.stories.js.map +0 -1
- package/dist/components/primitives/spinner/spinner.stories.d.ts +0 -16
- package/dist/components/primitives/spinner/spinner.stories.js +0 -34
- package/dist/components/primitives/spinner/spinner.stories.js.map +0 -1
- package/dist/components/primitives/stack/stack.stories.d.ts +0 -13
- package/dist/components/primitives/stack/stack.stories.js +0 -26
- package/dist/components/primitives/stack/stack.stories.js.map +0 -1
- package/dist/components/primitives/text/text-div.stories.d.ts +0 -32
- package/dist/components/primitives/text/text-div.stories.js +0 -59
- package/dist/components/primitives/text/text-div.stories.js.map +0 -1
- package/dist/components/primitives/text/text-heading.js +0 -53
- package/dist/components/primitives/text/text-heading.js.map +0 -1
- package/dist/components/primitives/text/text-heading.stories.d.ts +0 -27
- package/dist/components/primitives/text/text-heading.stories.js +0 -47
- package/dist/components/primitives/text/text-heading.stories.js.map +0 -1
- package/dist/components/primitives/text/text-paragraph.d.ts +0 -10
- package/dist/components/primitives/text/text-paragraph.js.map +0 -1
- package/dist/components/primitives/text/text-span.stories.d.ts +0 -31
- package/dist/components/primitives/text/text-span.stories.js +0 -59
- package/dist/components/primitives/text/text-span.stories.js.map +0 -1
- package/dist/components/primitives/ui-image.js.map +0 -1
- package/dist/components/primitives/ui-link.d.ts +0 -6
- package/dist/components/primitives/ui-link.js +0 -22
- package/dist/components/primitives/ui-link.js.map +0 -1
- package/dist/components/units/cards/blog-card.d.ts +0 -19
- package/dist/components/units/cards/blog-card.js +0 -82
- package/dist/components/units/cards/blog-card.js.map +0 -1
- package/dist/components/units/cards/card.d.ts +0 -15
- package/dist/components/units/cards/card.js +0 -89
- package/dist/components/units/cards/card.js.map +0 -1
- package/dist/components/units/cards/cards.d.ts +0 -17
- package/dist/components/units/cards/cards.js +0 -37
- package/dist/components/units/cards/cards.js.map +0 -1
- package/dist/components/units/index.d.ts +0 -5
- package/dist/components/units/index.js +0 -4
- package/dist/components/units/index.js.map +0 -1
- package/dist/utils.js.map +0 -1
- /package/dist/{utils.d.ts → utils/index.d.ts} +0 -0
- /package/dist/{components/primitives/button/button_with_icon_variant.d.ts → utils/index.test.d.ts} +0 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useMemo, useEffect } from "react";
|
|
4
|
+
import {
|
|
5
|
+
Layout,
|
|
6
|
+
Button,
|
|
7
|
+
Input,
|
|
8
|
+
Textarea,
|
|
9
|
+
Label,
|
|
10
|
+
Heading,
|
|
11
|
+
Text,
|
|
12
|
+
Icon
|
|
13
|
+
} from "../../primitives/index.js";
|
|
14
|
+
import { Card, CardContent } from "../../blocks/index.js";
|
|
15
|
+
import { posts as initialPosts } from "../../../data/posts.js";
|
|
16
|
+
import { useToast } from "../../primitives/sonner/use-toast.js";
|
|
17
|
+
const POSTS_PER_PAGE = 5;
|
|
18
|
+
function AdminPage({ initialEditId }) {
|
|
19
|
+
const [postsList, setPostsList] = useState(initialPosts);
|
|
20
|
+
const [editing, setEditing] = useState(null);
|
|
21
|
+
const [showForm, setShowForm] = useState(false);
|
|
22
|
+
const [searchQuery, setSearchQuery] = useState("");
|
|
23
|
+
const { toast } = useToast();
|
|
24
|
+
const emptyPost = {
|
|
25
|
+
id: 0,
|
|
26
|
+
title: "",
|
|
27
|
+
excerpt: "",
|
|
28
|
+
content: "",
|
|
29
|
+
primaryImage: "",
|
|
30
|
+
originalImage: "",
|
|
31
|
+
date: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10),
|
|
32
|
+
author: "Admin",
|
|
33
|
+
categories: []
|
|
34
|
+
};
|
|
35
|
+
const [form, setForm] = useState(emptyPost);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (initialEditId) {
|
|
38
|
+
const post = postsList.find((p) => p.id === initialEditId);
|
|
39
|
+
if (post) {
|
|
40
|
+
setForm({
|
|
41
|
+
id: post.id,
|
|
42
|
+
title: post.title,
|
|
43
|
+
excerpt: post.excerpt,
|
|
44
|
+
content: post.content,
|
|
45
|
+
primaryImage: post.primaryImage,
|
|
46
|
+
originalImage: post.originalImage,
|
|
47
|
+
date: post.date,
|
|
48
|
+
author: post.author,
|
|
49
|
+
categories: post.categories
|
|
50
|
+
});
|
|
51
|
+
setEditing(post.id);
|
|
52
|
+
setShowForm(true);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}, [initialEditId, postsList]);
|
|
56
|
+
const handleSave = (e) => {
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
if (!form.title.trim()) return;
|
|
59
|
+
if (editing !== null) {
|
|
60
|
+
setPostsList(
|
|
61
|
+
(prev) => prev.map((p) => p.id === editing ? { ...p, ...form } : p)
|
|
62
|
+
);
|
|
63
|
+
toast.success("Post updated", {
|
|
64
|
+
description: `"${form.title}" has been saved.`
|
|
65
|
+
});
|
|
66
|
+
setEditing(null);
|
|
67
|
+
} else {
|
|
68
|
+
const nextId = Math.max(...postsList.map((p) => p.id), 0) + 1;
|
|
69
|
+
setPostsList((prev) => [{ ...form, id: nextId }, ...prev]);
|
|
70
|
+
toast.success("Post created", {
|
|
71
|
+
description: `"${form.title}" has been published.`
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
setForm(emptyPost);
|
|
75
|
+
setShowForm(false);
|
|
76
|
+
};
|
|
77
|
+
const handleEdit = (post) => {
|
|
78
|
+
setForm(post);
|
|
79
|
+
setEditing(post.id);
|
|
80
|
+
setShowForm(true);
|
|
81
|
+
};
|
|
82
|
+
const [page, setPage] = useState(1);
|
|
83
|
+
const handleDelete = (id) => {
|
|
84
|
+
setPostsList((prev) => {
|
|
85
|
+
const updated = prev.filter((p) => p.id !== id);
|
|
86
|
+
const newTotalPages = Math.ceil(updated.length / POSTS_PER_PAGE);
|
|
87
|
+
if (page > newTotalPages) setPage(Math.max(1, newTotalPages));
|
|
88
|
+
return updated;
|
|
89
|
+
});
|
|
90
|
+
toast.message("Post deleted");
|
|
91
|
+
};
|
|
92
|
+
const filteredPosts = useMemo(() => {
|
|
93
|
+
if (!searchQuery.trim()) return postsList;
|
|
94
|
+
const q = searchQuery.toLowerCase();
|
|
95
|
+
return postsList.filter((p) => p.title.toLowerCase().includes(q));
|
|
96
|
+
}, [postsList, searchQuery]);
|
|
97
|
+
const totalPages = Math.ceil(filteredPosts.length / POSTS_PER_PAGE);
|
|
98
|
+
const paginatedPosts = useMemo(
|
|
99
|
+
() => filteredPosts.slice((page - 1) * POSTS_PER_PAGE, page * POSTS_PER_PAGE),
|
|
100
|
+
[filteredPosts, page]
|
|
101
|
+
);
|
|
102
|
+
return /* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", as: "main", children: /* @__PURE__ */ jsx(Layout.Col1, { hideDiv: true, children: /* @__PURE__ */ jsxs("div", { className: "sg:space-y-8", children: [
|
|
103
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex sg:items-center sg:justify-between", children: [
|
|
104
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
105
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h1", children: "Admin" }),
|
|
106
|
+
/* @__PURE__ */ jsx(Text, { className: "sg:mt-1", foreground: "muted-foreground", children: "Manage your blog posts." })
|
|
107
|
+
] }),
|
|
108
|
+
/* @__PURE__ */ jsxs(
|
|
109
|
+
Button,
|
|
110
|
+
{
|
|
111
|
+
onClick: () => {
|
|
112
|
+
setShowForm(!showForm);
|
|
113
|
+
setEditing(null);
|
|
114
|
+
setForm(emptyPost);
|
|
115
|
+
},
|
|
116
|
+
children: [
|
|
117
|
+
/* @__PURE__ */ jsx(Icon, { icon: "Plus", size: "xs", className: "sg:mr-1" }),
|
|
118
|
+
" New post"
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
)
|
|
122
|
+
] }),
|
|
123
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:relative", children: [
|
|
124
|
+
/* @__PURE__ */ jsx(
|
|
125
|
+
Icon,
|
|
126
|
+
{
|
|
127
|
+
icon: "Search",
|
|
128
|
+
size: "xs",
|
|
129
|
+
color: "muted-foreground",
|
|
130
|
+
className: "sg:absolute sg:left-3 sg:top-1/2 sg:-translate-y-1/2"
|
|
131
|
+
}
|
|
132
|
+
),
|
|
133
|
+
/* @__PURE__ */ jsx(
|
|
134
|
+
Input,
|
|
135
|
+
{
|
|
136
|
+
placeholder: "Search posts by title...",
|
|
137
|
+
value: searchQuery,
|
|
138
|
+
onChange: (e) => {
|
|
139
|
+
setSearchQuery(e.target.value);
|
|
140
|
+
setPage(1);
|
|
141
|
+
},
|
|
142
|
+
className: "sg:pl-9"
|
|
143
|
+
}
|
|
144
|
+
)
|
|
145
|
+
] }),
|
|
146
|
+
showForm && /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "sg:p-6 sg:mt-6", children: [
|
|
147
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h3", className: "sg:mb-4", children: editing !== null ? "Edit Post" : "New Post" }),
|
|
148
|
+
/* @__PURE__ */ jsxs("form", { onSubmit: handleSave, className: "sg:space-y-4", children: [
|
|
149
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:space-y-2", children: [
|
|
150
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "title", children: "Title" }),
|
|
151
|
+
/* @__PURE__ */ jsx(
|
|
152
|
+
Input,
|
|
153
|
+
{
|
|
154
|
+
id: "title",
|
|
155
|
+
value: form.title,
|
|
156
|
+
onChange: (e) => setForm({ ...form, title: e.target.value }),
|
|
157
|
+
required: true
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
] }),
|
|
161
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:space-y-2", children: [
|
|
162
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "excerpt", children: "Excerpt" }),
|
|
163
|
+
/* @__PURE__ */ jsx(
|
|
164
|
+
Input,
|
|
165
|
+
{
|
|
166
|
+
id: "excerpt",
|
|
167
|
+
value: form.excerpt || "",
|
|
168
|
+
onChange: (e) => setForm({ ...form, excerpt: e.target.value })
|
|
169
|
+
}
|
|
170
|
+
)
|
|
171
|
+
] }),
|
|
172
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:space-y-2", children: [
|
|
173
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "image", children: "Image URL" }),
|
|
174
|
+
/* @__PURE__ */ jsx(
|
|
175
|
+
Input,
|
|
176
|
+
{
|
|
177
|
+
id: "image",
|
|
178
|
+
value: form.primaryImage,
|
|
179
|
+
onChange: (e) => setForm({ ...form, primaryImage: e.target.value }),
|
|
180
|
+
placeholder: "https://..."
|
|
181
|
+
}
|
|
182
|
+
)
|
|
183
|
+
] }),
|
|
184
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:space-y-2", children: [
|
|
185
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "content", children: "Content" }),
|
|
186
|
+
/* @__PURE__ */ jsx(
|
|
187
|
+
Textarea,
|
|
188
|
+
{
|
|
189
|
+
id: "content",
|
|
190
|
+
value: form.content || "",
|
|
191
|
+
onChange: (e) => setForm({
|
|
192
|
+
...form,
|
|
193
|
+
content: e.target.value
|
|
194
|
+
}),
|
|
195
|
+
className: "sg:min-h-[200px]"
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
] }),
|
|
199
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex sg:gap-2 sg:pt-2", children: [
|
|
200
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", children: editing !== null ? "Update" : "Publish" }),
|
|
201
|
+
/* @__PURE__ */ jsx(
|
|
202
|
+
Button,
|
|
203
|
+
{
|
|
204
|
+
type: "button",
|
|
205
|
+
variant: "ghost",
|
|
206
|
+
onClick: () => {
|
|
207
|
+
setShowForm(false);
|
|
208
|
+
setEditing(null);
|
|
209
|
+
setForm(emptyPost);
|
|
210
|
+
},
|
|
211
|
+
children: "Cancel"
|
|
212
|
+
}
|
|
213
|
+
)
|
|
214
|
+
] })
|
|
215
|
+
] })
|
|
216
|
+
] }) }),
|
|
217
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:space-y-3", children: [
|
|
218
|
+
paginatedPosts.map((post) => /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "sg:p-4 sg:flex sg:items-center sg:justify-between sg:pt-4", children: [
|
|
219
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex-1 sg:min-w-0", children: [
|
|
220
|
+
/* @__PURE__ */ jsx("div", { className: "sg:font-medium sg:truncate", children: post.title }),
|
|
221
|
+
/* @__PURE__ */ jsxs(Text, { size: "sm", foreground: "muted-foreground", children: [
|
|
222
|
+
post.date,
|
|
223
|
+
" \xB7 ",
|
|
224
|
+
post.author
|
|
225
|
+
] })
|
|
226
|
+
] }),
|
|
227
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex sg:gap-2 sg:ml-4", children: [
|
|
228
|
+
/* @__PURE__ */ jsx(
|
|
229
|
+
Button,
|
|
230
|
+
{
|
|
231
|
+
variant: "ghost",
|
|
232
|
+
onClick: () => handleEdit(post),
|
|
233
|
+
"aria-label": `Edit ${post.title}`,
|
|
234
|
+
className: "sg:px-2",
|
|
235
|
+
children: /* @__PURE__ */ jsx(Icon, { icon: "Pencil", size: "xs" })
|
|
236
|
+
}
|
|
237
|
+
),
|
|
238
|
+
/* @__PURE__ */ jsx(
|
|
239
|
+
Button,
|
|
240
|
+
{
|
|
241
|
+
variant: "ghost",
|
|
242
|
+
onClick: () => handleDelete(post.id),
|
|
243
|
+
"aria-label": `Delete ${post.title}`,
|
|
244
|
+
className: "sg:px-2 sg:text-destructive sg:hover:text-destructive sg:hover:bg-destructive/10",
|
|
245
|
+
children: /* @__PURE__ */ jsx(Icon, { icon: "Trash2", size: "xs" })
|
|
246
|
+
}
|
|
247
|
+
)
|
|
248
|
+
] })
|
|
249
|
+
] }) }, post.id)),
|
|
250
|
+
paginatedPosts.length === 0 && /* @__PURE__ */ jsx(
|
|
251
|
+
Text,
|
|
252
|
+
{
|
|
253
|
+
foreground: "muted-foreground",
|
|
254
|
+
className: "sg:text-center sg:py-8",
|
|
255
|
+
children: "No posts found."
|
|
256
|
+
}
|
|
257
|
+
)
|
|
258
|
+
] }),
|
|
259
|
+
totalPages > 1 && /* @__PURE__ */ jsxs("div", { className: "sg:flex sg:items-center sg:justify-center sg:gap-2 sg:pt-2", children: [
|
|
260
|
+
/* @__PURE__ */ jsxs(
|
|
261
|
+
Button,
|
|
262
|
+
{
|
|
263
|
+
variant: "outline",
|
|
264
|
+
size: "sm",
|
|
265
|
+
disabled: page === 1,
|
|
266
|
+
onClick: () => setPage(page - 1),
|
|
267
|
+
children: [
|
|
268
|
+
/* @__PURE__ */ jsx(Icon, { icon: "ChevronLeft", size: "xs", className: "sg:mr-1" }),
|
|
269
|
+
" ",
|
|
270
|
+
"Previous"
|
|
271
|
+
]
|
|
272
|
+
}
|
|
273
|
+
),
|
|
274
|
+
/* @__PURE__ */ jsxs(Text, { size: "sm", foreground: "muted-foreground", className: "sg:px-3", children: [
|
|
275
|
+
"Page ",
|
|
276
|
+
page,
|
|
277
|
+
" of ",
|
|
278
|
+
totalPages
|
|
279
|
+
] }),
|
|
280
|
+
/* @__PURE__ */ jsxs(
|
|
281
|
+
Button,
|
|
282
|
+
{
|
|
283
|
+
variant: "outline",
|
|
284
|
+
size: "sm",
|
|
285
|
+
disabled: page === totalPages,
|
|
286
|
+
onClick: () => setPage(page + 1),
|
|
287
|
+
children: [
|
|
288
|
+
"Next ",
|
|
289
|
+
/* @__PURE__ */ jsx(Icon, { icon: "ChevronRight", size: "xs", className: "sg:ml-1" })
|
|
290
|
+
]
|
|
291
|
+
}
|
|
292
|
+
)
|
|
293
|
+
] })
|
|
294
|
+
] }) }) });
|
|
295
|
+
}
|
|
296
|
+
export {
|
|
297
|
+
AdminPage
|
|
298
|
+
};
|
|
299
|
+
//# sourceMappingURL=admin-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/pages/admin/admin-page.tsx"],"sourcesContent":["\"use client\";\nimport { useState, useMemo, useEffect } from \"react\";\nimport {\n Layout,\n Button,\n Input,\n Textarea,\n Label,\n Heading,\n Text,\n Icon,\n} from \"../../primitives/index\";\nimport { Card, CardContent } from \"../../blocks/index\";\nimport { posts as initialPosts, type BlogPost } from \"../../../data/posts\";\nimport { useToast } from \"../../primitives/sonner/use-toast\";\n\nconst POSTS_PER_PAGE = 5;\n\nexport interface AdminPageProps {\n initialEditId?: number;\n}\n\nexport function AdminPage({ initialEditId }: AdminPageProps) {\n const [postsList, setPostsList] = useState<BlogPost[]>(initialPosts);\n const [editing, setEditing] = useState<number | null>(null);\n const [showForm, setShowForm] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const { toast } = useToast();\n\n const emptyPost: BlogPost = {\n id: 0,\n title: \"\",\n excerpt: \"\",\n content: \"\",\n primaryImage: \"\",\n originalImage: \"\",\n date: new Date().toISOString().slice(0, 10),\n author: \"Admin\",\n categories: [],\n };\n\n const [form, setForm] = useState(emptyPost);\n\n useEffect(() => {\n if (initialEditId) {\n const post = postsList.find((p) => p.id === initialEditId);\n if (post) {\n setForm({\n id: post.id,\n title: post.title,\n excerpt: post.excerpt,\n content: post.content,\n primaryImage: post.primaryImage,\n originalImage: post.originalImage,\n date: post.date,\n author: post.author,\n categories: post.categories,\n });\n setEditing(post.id);\n setShowForm(true);\n }\n }\n }, [initialEditId, postsList]);\n\n const handleSave = (e: React.FormEvent) => {\n e.preventDefault();\n if (!form.title.trim()) return;\n\n if (editing !== null) {\n setPostsList((prev) =>\n prev.map((p) => (p.id === editing ? { ...p, ...form } : p)),\n );\n toast.success(\"Post updated\", {\n description: `\"${form.title}\" has been saved.`,\n });\n setEditing(null);\n } else {\n const nextId = Math.max(...postsList.map((p) => p.id), 0) + 1;\n setPostsList((prev) => [{ ...form, id: nextId }, ...prev]);\n toast.success(\"Post created\", {\n description: `\"${form.title}\" has been published.`,\n });\n }\n\n setForm(emptyPost);\n setShowForm(false);\n };\n\n const handleEdit = (post: BlogPost) => {\n setForm(post);\n setEditing(post.id);\n setShowForm(true);\n };\n\n const [page, setPage] = useState(1);\n\n const handleDelete = (id: number) => {\n setPostsList((prev) => {\n const updated = prev.filter((p) => p.id !== id);\n const newTotalPages = Math.ceil(updated.length / POSTS_PER_PAGE);\n if (page > newTotalPages) setPage(Math.max(1, newTotalPages));\n return updated;\n });\n toast.message(\"Post deleted\");\n };\n\n const filteredPosts = useMemo(() => {\n if (!searchQuery.trim()) return postsList;\n const q = searchQuery.toLowerCase();\n return postsList.filter((p) => p.title.toLowerCase().includes(q));\n }, [postsList, searchQuery]);\n\n const totalPages = Math.ceil(filteredPosts.length / POSTS_PER_PAGE);\n const paginatedPosts = useMemo(\n () =>\n filteredPosts.slice((page - 1) * POSTS_PER_PAGE, page * POSTS_PER_PAGE),\n [filteredPosts, page],\n );\n\n return (\n <Layout type=\"col\" className=\"sg:py-16\" as=\"main\">\n <Layout.Col1 hideDiv>\n <div className=\"sg:space-y-8\">\n <div className=\"sg:flex sg:items-center sg:justify-between\">\n <div>\n <Heading variant=\"h1\">Admin</Heading>\n <Text className=\"sg:mt-1\" foreground=\"muted-foreground\">\n Manage your blog posts.\n </Text>\n </div>\n <Button\n onClick={() => {\n setShowForm(!showForm);\n setEditing(null);\n setForm(emptyPost);\n }}\n >\n <Icon icon=\"Plus\" size=\"xs\" className=\"sg:mr-1\" /> New post\n </Button>\n </div>\n\n {/* Search */}\n <div className=\"sg:relative\">\n <Icon\n icon=\"Search\"\n size=\"xs\"\n color=\"muted-foreground\"\n className=\"sg:absolute sg:left-3 sg:top-1/2 sg:-translate-y-1/2\"\n />\n <Input\n placeholder=\"Search posts by title...\"\n value={searchQuery}\n onChange={(e) => {\n setSearchQuery(e.target.value);\n setPage(1);\n }}\n className=\"sg:pl-9\"\n />\n </div>\n\n {/* Form */}\n {showForm && (\n <Card>\n <CardContent className=\"sg:p-6 sg:mt-6\">\n <Heading variant=\"h3\" className=\"sg:mb-4\">\n {editing !== null ? \"Edit Post\" : \"New Post\"}\n </Heading>\n <form onSubmit={handleSave} className=\"sg:space-y-4\">\n <div className=\"sg:space-y-2\">\n <Label htmlFor=\"title\">Title</Label>\n <Input\n id=\"title\"\n value={form.title}\n onChange={(e) =>\n setForm({ ...form, title: e.target.value })\n }\n required\n />\n </div>\n <div className=\"sg:space-y-2\">\n <Label htmlFor=\"excerpt\">Excerpt</Label>\n <Input\n id=\"excerpt\"\n value={form.excerpt || \"\"}\n onChange={(e) =>\n setForm({ ...form, excerpt: e.target.value })\n }\n />\n </div>\n <div className=\"sg:space-y-2\">\n <Label htmlFor=\"image\">Image URL</Label>\n <Input\n id=\"image\"\n value={form.primaryImage}\n onChange={(e) =>\n setForm({ ...form, primaryImage: e.target.value })\n }\n placeholder=\"https://...\"\n />\n </div>\n <div className=\"sg:space-y-2\">\n <Label htmlFor=\"content\">Content</Label>\n <Textarea\n id=\"content\"\n value={(form.content || \"\") as string}\n onChange={(e) =>\n setForm({\n ...form,\n content: e.target.value,\n })\n }\n className=\"sg:min-h-[200px]\"\n />\n </div>\n <div className=\"sg:flex sg:gap-2 sg:pt-2\">\n <Button type=\"submit\">\n {editing !== null ? \"Update\" : \"Publish\"}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => {\n setShowForm(false);\n setEditing(null);\n setForm(emptyPost);\n }}\n >\n Cancel\n </Button>\n </div>\n </form>\n </CardContent>\n </Card>\n )}\n\n {/* Posts list */}\n <div className=\"sg:space-y-3\">\n {paginatedPosts.map((post) => (\n <Card key={post.id}>\n <CardContent className=\"sg:p-4 sg:flex sg:items-center sg:justify-between sg:pt-4\">\n <div className=\"sg:flex-1 sg:min-w-0\">\n <div className=\"sg:font-medium sg:truncate\">\n {post.title}\n </div>\n <Text size=\"sm\" foreground=\"muted-foreground\">\n {post.date} · {post.author}\n </Text>\n </div>\n <div className=\"sg:flex sg:gap-2 sg:ml-4\">\n <Button\n variant=\"ghost\"\n onClick={() => handleEdit(post)}\n aria-label={`Edit ${post.title}`}\n className=\"sg:px-2\"\n >\n <Icon icon=\"Pencil\" size=\"xs\" />\n </Button>\n <Button\n variant=\"ghost\"\n onClick={() => handleDelete(post.id)}\n aria-label={`Delete ${post.title}`}\n className=\"sg:px-2 sg:text-destructive sg:hover:text-destructive sg:hover:bg-destructive/10\"\n >\n <Icon icon=\"Trash2\" size=\"xs\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n {paginatedPosts.length === 0 && (\n <Text\n foreground=\"muted-foreground\"\n className=\"sg:text-center sg:py-8\"\n >\n No posts found.\n </Text>\n )}\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"sg:flex sg:items-center sg:justify-center sg:gap-2 sg:pt-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page === 1}\n onClick={() => setPage(page - 1)}\n >\n <Icon icon=\"ChevronLeft\" size=\"xs\" className=\"sg:mr-1\" />{\" \"}\n Previous\n </Button>\n <Text size=\"sm\" foreground=\"muted-foreground\" className=\"sg:px-3\">\n Page {page} of {totalPages}\n </Text>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page === totalPages}\n onClick={() => setPage(page + 1)}\n >\n Next <Icon icon=\"ChevronRight\" size=\"xs\" className=\"sg:ml-1\" />\n </Button>\n </div>\n )}\n </div>\n </Layout.Col1>\n </Layout>\n );\n}\n"],"mappings":"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","names":[]}
|