singularity-components 0.1.195 → 0.1.197
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/blocks/badges/category-badge.d.ts +11 -0
- package/dist/components/blocks/badges/category-badge.js +34 -0
- package/dist/components/blocks/badges/category-badge.js.map +1 -0
- package/dist/components/blocks/cards/blogpost-card.d.ts +3 -1
- package/dist/components/blocks/cards/blogpost-card.js +10 -5
- package/dist/components/blocks/cards/blogpost-card.js.map +1 -1
- package/dist/components/blocks/directory/author-card.d.ts +10 -0
- package/dist/components/blocks/directory/author-card.js +50 -0
- package/dist/components/blocks/directory/author-card.js.map +1 -0
- package/dist/components/blocks/directory/category-card.d.ts +10 -0
- package/dist/components/blocks/directory/category-card.js +27 -0
- package/dist/components/blocks/directory/category-card.js.map +1 -0
- package/dist/components/blocks/extras/extras-hub-card.d.ts +16 -0
- package/dist/components/blocks/extras/extras-hub-card.js +22 -0
- package/dist/components/blocks/extras/extras-hub-card.js.map +1 -0
- package/dist/components/blocks/gallery/image-gallery.d.ts +14 -0
- package/dist/components/blocks/gallery/image-gallery.js +211 -0
- package/dist/components/blocks/gallery/image-gallery.js.map +1 -0
- package/dist/components/blocks/index.d.ts +11 -0
- package/dist/components/blocks/index.js +10 -0
- package/dist/components/blocks/index.js.map +1 -1
- package/dist/components/blocks/loading/loading-skeletons.d.ts +15 -0
- package/dist/components/blocks/loading/loading-skeletons.js +78 -0
- package/dist/components/blocks/loading/loading-skeletons.js.map +1 -0
- package/dist/components/blocks/login/login.js +76 -47
- package/dist/components/blocks/login/login.js.map +1 -1
- package/dist/components/blocks/marketing/page-hero.d.ts +13 -0
- package/dist/components/blocks/marketing/page-hero.js +37 -0
- package/dist/components/blocks/marketing/page-hero.js.map +1 -0
- package/dist/components/blocks/marketing/stats-grid.d.ts +16 -0
- package/dist/components/blocks/marketing/stats-grid.js +30 -0
- package/dist/components/blocks/marketing/stats-grid.js.map +1 -0
- package/dist/components/blocks/marketing/timeline.d.ts +17 -0
- package/dist/components/blocks/marketing/timeline.js +46 -0
- package/dist/components/blocks/marketing/timeline.js.map +1 -0
- package/dist/components/blocks/marketing/values-grid.d.ts +16 -0
- package/dist/components/blocks/marketing/values-grid.js +29 -0
- package/dist/components/blocks/marketing/values-grid.js.map +1 -0
- package/dist/components/blocks/post-list/post-list-with-filters.js +4 -4
- package/dist/components/blocks/post-list/post-list-with-filters.js.map +1 -1
- package/dist/components/index.d.ts +28 -1
- package/dist/components/pages/about/about-page.d.ts +5 -0
- package/dist/components/pages/about/about-page.js +161 -0
- package/dist/components/pages/about/about-page.js.map +1 -0
- package/dist/components/pages/admin/admin-page.js +160 -103
- package/dist/components/pages/admin/admin-page.js.map +1 -1
- package/dist/components/pages/author/author-page.d.ts +8 -0
- package/dist/components/pages/author/author-page.js +107 -0
- package/dist/components/pages/author/author-page.js.map +1 -0
- package/dist/components/pages/authors/authors-page.d.ts +5 -0
- package/dist/components/pages/authors/authors-page.js +25 -0
- package/dist/components/pages/authors/authors-page.js.map +1 -0
- package/dist/components/pages/blogpost/blogpost.d.ts +4 -1
- package/dist/components/pages/blogpost/blogpost.js +110 -62
- package/dist/components/pages/blogpost/blogpost.js.map +1 -1
- package/dist/components/pages/categories/categories-page.d.ts +5 -0
- package/dist/components/pages/categories/categories-page.js +33 -0
- package/dist/components/pages/categories/categories-page.js.map +1 -0
- package/dist/components/pages/category/category-page.js +4 -2
- package/dist/components/pages/category/category-page.js.map +1 -1
- package/dist/components/pages/chat/chat-page.js +4 -4
- package/dist/components/pages/chat/chat-page.js.map +1 -1
- package/dist/components/pages/contact/contact-page.d.ts +5 -0
- package/dist/components/pages/contact/contact-page.js +180 -0
- package/dist/components/pages/contact/contact-page.js.map +1 -0
- package/dist/components/pages/content-blocks/content-blocks-page.d.ts +5 -0
- package/dist/components/pages/content-blocks/content-blocks-page.js +87 -0
- package/dist/components/pages/content-blocks/content-blocks-page.js.map +1 -0
- package/dist/components/pages/extras/extras-hub-page.d.ts +10 -0
- package/dist/components/pages/extras/extras-hub-page.js +110 -0
- package/dist/components/pages/extras/extras-hub-page.js.map +1 -0
- package/dist/components/pages/index.d.ts +14 -0
- package/dist/components/pages/index.js +12 -0
- package/dist/components/pages/index.js.map +1 -1
- package/dist/components/pages/maintenance/maintenance-page.js +1 -1
- package/dist/components/pages/maintenance/maintenance-page.js.map +1 -1
- package/dist/components/pages/membership/membership-page.d.ts +5 -0
- package/dist/components/pages/membership/membership-page.js +131 -0
- package/dist/components/pages/membership/membership-page.js.map +1 -0
- package/dist/components/pages/mosaic/mosaic-page.d.ts +5 -0
- package/dist/components/pages/mosaic/mosaic-page.js +81 -0
- package/dist/components/pages/mosaic/mosaic-page.js.map +1 -0
- package/dist/components/pages/newsletter/newsletter-page.d.ts +5 -0
- package/dist/components/pages/newsletter/newsletter-page.js +165 -0
- package/dist/components/pages/newsletter/newsletter-page.js.map +1 -0
- package/dist/components/pages/not-found/not-found.js +2 -2
- package/dist/components/pages/not-found/not-found.js.map +1 -1
- package/dist/components/pages/privacy/privacy-page.js +2 -2
- package/dist/components/pages/privacy/privacy-page.js.map +1 -1
- package/dist/components/pages/resources/resources-page.d.ts +5 -0
- package/dist/components/pages/resources/resources-page.js +24 -0
- package/dist/components/pages/resources/resources-page.js.map +1 -0
- package/dist/components/pages/startpage/startpage.js +6 -4
- package/dist/components/pages/startpage/startpage.js.map +1 -1
- package/dist/components/pages/terms/terms-page.js +2 -2
- package/dist/components/pages/terms/terms-page.js.map +1 -1
- package/dist/components/primitives/accordion/accordion.js +14 -16
- package/dist/components/primitives/accordion/accordion.js.map +1 -1
- package/dist/components/primitives/badge/badge.js +1 -1
- package/dist/components/primitives/badge/badge.js.map +1 -1
- package/dist/components/primitives/buttons/button.d.ts +2 -2
- package/dist/components/primitives/buttons/icon-button.d.ts +1 -1
- package/dist/components/primitives/collapsible/collapsible.js +4 -1
- package/dist/components/primitives/collapsible/collapsible.js.map +1 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu.js +6 -1
- package/dist/components/primitives/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/primitives/forms/checkbox.js +1 -1
- package/dist/components/primitives/forms/checkbox.js.map +1 -1
- package/dist/components/primitives/forms/field.d.ts +4 -2
- package/dist/components/primitives/forms/field.js +4 -2
- package/dist/components/primitives/forms/field.js.map +1 -1
- package/dist/components/primitives/forms/form-control.d.ts +28 -0
- package/dist/components/primitives/forms/form-control.js +40 -0
- package/dist/components/primitives/forms/form-control.js.map +1 -0
- package/dist/components/primitives/forms/form.d.ts +12 -0
- package/dist/components/primitives/forms/form.js +30 -0
- package/dist/components/primitives/forms/form.js.map +1 -0
- package/dist/components/primitives/forms/select.js +12 -12
- package/dist/components/primitives/forms/select.js.map +1 -1
- package/dist/components/primitives/icon/icon.d.ts +3 -2
- package/dist/components/primitives/icon/icon.js +2 -1
- package/dist/components/primitives/icon/icon.js.map +1 -1
- package/dist/components/primitives/index.d.ts +4 -0
- package/dist/components/primitives/index.js +3 -0
- package/dist/components/primitives/index.js.map +1 -1
- package/dist/components/primitives/layout/layout.d.ts +1 -1
- package/dist/components/primitives/link/link.d.ts +2 -2
- package/dist/components/primitives/sheet/sheet.js +1 -1
- package/dist/components/primitives/sheet/sheet.js.map +1 -1
- package/dist/components/primitives/stack/stack.d.ts +2 -2
- package/dist/components/primitives/text/internal/text-element.d.ts +8 -2
- package/dist/components/primitives/text/internal/text-element.js +3 -0
- package/dist/components/primitives/text/internal/text-element.js.map +1 -1
- package/dist/components/primitives/text/text-code.d.ts +1 -1
- package/dist/components/templates/form/form.d.ts +2 -2
- package/dist/components/templates/form/form.js +133 -87
- package/dist/components/templates/form/form.js.map +1 -1
- package/dist/components/templates/hero/hero.js +1 -0
- package/dist/components/templates/hero/hero.js.map +1 -1
- package/dist/components/templates/index.d.ts +1 -0
- package/dist/components/templates/index.js +1 -0
- package/dist/components/templates/index.js.map +1 -1
- package/dist/components/templates/loading-screen/loading-screen.d.ts +10 -0
- package/dist/components/templates/loading-screen/loading-screen.js +39 -0
- package/dist/components/templates/loading-screen/loading-screen.js.map +1 -0
- package/dist/css/variables.css +6 -3
- package/dist/css/variables.css.map +1 -1
- package/dist/data/posts.d.ts +5 -0
- package/dist/data/posts.js +41 -8
- package/dist/data/posts.js.map +1 -1
- package/dist/index.d.ts +28 -1
- package/dist/lib/forms/field-props.d.ts +60 -0
- package/dist/lib/forms/field-props.js +60 -0
- package/dist/lib/forms/field-props.js.map +1 -0
- package/dist/lib/forms/index.d.ts +11 -0
- package/dist/lib/forms/index.js +3 -0
- package/dist/lib/forms/index.js.map +1 -0
- package/dist/lib/forms/tanstack-field.d.ts +71 -0
- package/dist/lib/forms/tanstack-field.js +121 -0
- package/dist/lib/forms/tanstack-field.js.map +1 -0
- package/dist/lib/index.d.ts +11 -0
- package/dist/lib/index.js +1 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/main.css +393 -90
- package/dist/main.css.map +1 -1
- package/package.json +30 -23
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Skeleton } from "../../primitives/skeleton/skeleton.js";
|
|
3
|
+
function PostCardSkeleton() {
|
|
4
|
+
return /* @__PURE__ */ jsxs("div", { className: "sg:rounded-lg sg:border sg:bg-card sg:overflow-hidden", children: [
|
|
5
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:w-full sg:h-48" }),
|
|
6
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:p-5 sg:space-y-3", children: [
|
|
7
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex sg:gap-2", children: [
|
|
8
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-5 sg:w-16 sg:rounded-full" }),
|
|
9
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-5 sg:w-20 sg:rounded-full" })
|
|
10
|
+
] }),
|
|
11
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-6 sg:w-3/4" }),
|
|
12
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-full" }),
|
|
13
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-2/3" }),
|
|
14
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex sg:items-center sg:gap-2 sg:pt-2", children: [
|
|
15
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-4 sg:rounded-full" }),
|
|
16
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-24" })
|
|
17
|
+
] })
|
|
18
|
+
] })
|
|
19
|
+
] });
|
|
20
|
+
}
|
|
21
|
+
function PostListSkeleton({ count = 6 }) {
|
|
22
|
+
return /* @__PURE__ */ jsx("div", { className: "sg:grid sg:grid-cols-1 sm:sg:grid-cols-2 lg:sg:grid-cols-3 sg:gap-6", children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsx(PostCardSkeleton, {}, i)) });
|
|
23
|
+
}
|
|
24
|
+
function PostListRowSkeleton({ count = 4 }) {
|
|
25
|
+
return /* @__PURE__ */ jsx("div", { className: "sg:flex sg:flex-col sg:gap-4", children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsxs(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
className: "sg:flex sg:gap-4 sg:rounded-lg sg:border sg:bg-card sg:p-4",
|
|
29
|
+
children: [
|
|
30
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:w-24 sg:h-24 sg:rounded-md sg:shrink-0" }),
|
|
31
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex-1 sg:space-y-2 sg:py-1", children: [
|
|
32
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-5 sg:w-3/4" }),
|
|
33
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-full" }),
|
|
34
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-3 sg:w-1/3" })
|
|
35
|
+
] })
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
i
|
|
39
|
+
)) });
|
|
40
|
+
}
|
|
41
|
+
function CommentSkeleton({ count = 3 }) {
|
|
42
|
+
return /* @__PURE__ */ jsx("div", { className: "sg:space-y-4", children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsxs("div", { className: "sg:rounded-lg sg:bg-accent sg:p-4 sg:space-y-2", children: [
|
|
43
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex sg:items-center sg:gap-2", children: [
|
|
44
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-20" }),
|
|
45
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-3 sg:w-16" })
|
|
46
|
+
] }),
|
|
47
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-full" }),
|
|
48
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-2/3" })
|
|
49
|
+
] }, i)) });
|
|
50
|
+
}
|
|
51
|
+
function SinglePostSkeleton() {
|
|
52
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
53
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:w-full sg:h-64 md:sg:h-96" }),
|
|
54
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:container sg:max-w-3xl sg:py-12 sg:space-y-4", children: [
|
|
55
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-32" }),
|
|
56
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-3 sg:w-48" }),
|
|
57
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-10 sg:w-3/4" }),
|
|
58
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex sg:gap-2", children: [
|
|
59
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-6 sg:w-20 sg:rounded-full" }),
|
|
60
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-6 sg:w-24 sg:rounded-full" })
|
|
61
|
+
] }),
|
|
62
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-5 sg:w-full" }),
|
|
63
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-5 sg:w-5/6" }),
|
|
64
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:space-y-3 sg:pt-8", children: [
|
|
65
|
+
Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-full" }, i)),
|
|
66
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-2/3" })
|
|
67
|
+
] })
|
|
68
|
+
] })
|
|
69
|
+
] });
|
|
70
|
+
}
|
|
71
|
+
export {
|
|
72
|
+
CommentSkeleton,
|
|
73
|
+
PostCardSkeleton,
|
|
74
|
+
PostListRowSkeleton,
|
|
75
|
+
PostListSkeleton,
|
|
76
|
+
SinglePostSkeleton
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=loading-skeletons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/blocks/loading/loading-skeletons.tsx"],"sourcesContent":["import { Skeleton } from \"../../primitives/skeleton/skeleton\";\r\n\r\nexport function PostCardSkeleton() {\r\n\treturn (\r\n\t\t<div className=\"sg:rounded-lg sg:border sg:bg-card sg:overflow-hidden\">\r\n\t\t\t<Skeleton className=\"sg:w-full sg:h-48\" />\r\n\t\t\t<div className=\"sg:p-5 sg:space-y-3\">\r\n\t\t\t\t<div className=\"sg:flex sg:gap-2\">\r\n\t\t\t\t\t<Skeleton className=\"sg:h-5 sg:w-16 sg:rounded-full\" />\r\n\t\t\t\t\t<Skeleton className=\"sg:h-5 sg:w-20 sg:rounded-full\" />\r\n\t\t\t\t</div>\r\n\t\t\t\t<Skeleton className=\"sg:h-6 sg:w-3/4\" />\r\n\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-full\" />\r\n\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-2/3\" />\r\n\t\t\t\t<div className=\"sg:flex sg:items-center sg:gap-2 sg:pt-2\">\r\n\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-4 sg:rounded-full\" />\r\n\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-24\" />\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function PostListSkeleton({ count = 6 }: { count?: number }) {\r\n\treturn (\r\n\t\t<div className=\"sg:grid sg:grid-cols-1 sm:sg:grid-cols-2 lg:sg:grid-cols-3 sg:gap-6\">\r\n\t\t\t{Array.from({ length: count }).map((_, i) => (\r\n\t\t\t\t<PostCardSkeleton key={i} />\r\n\t\t\t))}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function PostListRowSkeleton({ count = 4 }: { count?: number }) {\r\n\treturn (\r\n\t\t<div className=\"sg:flex sg:flex-col sg:gap-4\">\r\n\t\t\t{Array.from({ length: count }).map((_, i) => (\r\n\t\t\t\t<div\r\n\t\t\t\t\tkey={i}\r\n\t\t\t\t\tclassName=\"sg:flex sg:gap-4 sg:rounded-lg sg:border sg:bg-card sg:p-4\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Skeleton className=\"sg:w-24 sg:h-24 sg:rounded-md sg:shrink-0\" />\r\n\t\t\t\t\t<div className=\"sg:flex-1 sg:space-y-2 sg:py-1\">\r\n\t\t\t\t\t\t<Skeleton className=\"sg:h-5 sg:w-3/4\" />\r\n\t\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-full\" />\r\n\t\t\t\t\t\t<Skeleton className=\"sg:h-3 sg:w-1/3\" />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t))}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function CommentSkeleton({ count = 3 }: { count?: number }) {\r\n\treturn (\r\n\t\t<div className=\"sg:space-y-4\">\r\n\t\t\t{Array.from({ length: count }).map((_, i) => (\r\n\t\t\t\t<div key={i} className=\"sg:rounded-lg sg:bg-accent sg:p-4 sg:space-y-2\">\r\n\t\t\t\t\t<div className=\"sg:flex sg:items-center sg:gap-2\">\r\n\t\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-20\" />\r\n\t\t\t\t\t\t<Skeleton className=\"sg:h-3 sg:w-16\" />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-full\" />\r\n\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-2/3\" />\r\n\t\t\t\t</div>\r\n\t\t\t))}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function SinglePostSkeleton() {\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<Skeleton className=\"sg:w-full sg:h-64 md:sg:h-96\" />\r\n\t\t\t<div className=\"sg:container sg:max-w-3xl sg:py-12 sg:space-y-4\">\r\n\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-32\" />\r\n\t\t\t\t<Skeleton className=\"sg:h-3 sg:w-48\" />\r\n\t\t\t\t<Skeleton className=\"sg:h-10 sg:w-3/4\" />\r\n\t\t\t\t<div className=\"sg:flex sg:gap-2\">\r\n\t\t\t\t\t<Skeleton className=\"sg:h-6 sg:w-20 sg:rounded-full\" />\r\n\t\t\t\t\t<Skeleton className=\"sg:h-6 sg:w-24 sg:rounded-full\" />\r\n\t\t\t\t</div>\r\n\t\t\t\t<Skeleton className=\"sg:h-5 sg:w-full\" />\r\n\t\t\t\t<Skeleton className=\"sg:h-5 sg:w-5/6\" />\r\n\t\t\t\t<div className=\"sg:space-y-3 sg:pt-8\">\r\n\t\t\t\t\t{Array.from({ length: 6 }).map((_, i) => (\r\n\t\t\t\t\t\t<Skeleton key={i} className=\"sg:h-4 sg:w-full\" />\r\n\t\t\t\t\t))}\r\n\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-2/3\" />\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n"],"mappings":"AAKG,cAEC,YAFD;AALH,SAAS,gBAAgB;AAElB,SAAS,mBAAmB;AAClC,SACC,qBAAC,SAAI,WAAU,yDACd;AAAA,wBAAC,YAAS,WAAU,qBAAoB;AAAA,IACxC,qBAAC,SAAI,WAAU,uBACd;AAAA,2BAAC,SAAI,WAAU,oBACd;AAAA,4BAAC,YAAS,WAAU,kCAAiC;AAAA,QACrD,oBAAC,YAAS,WAAU,kCAAiC;AAAA,SACtD;AAAA,MACA,oBAAC,YAAS,WAAU,mBAAkB;AAAA,MACtC,oBAAC,YAAS,WAAU,oBAAmB;AAAA,MACvC,oBAAC,YAAS,WAAU,mBAAkB;AAAA,MACtC,qBAAC,SAAI,WAAU,4CACd;AAAA,4BAAC,YAAS,WAAU,iCAAgC;AAAA,QACpD,oBAAC,YAAS,WAAU,kBAAiB;AAAA,SACtC;AAAA,OACD;AAAA,KACD;AAEF;AAEO,SAAS,iBAAiB,EAAE,QAAQ,EAAE,GAAuB;AACnE,SACC,oBAAC,SAAI,WAAU,uEACb,gBAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MACtC,oBAAC,sBAAsB,CAAG,CAC1B,GACF;AAEF;AAEO,SAAS,oBAAoB,EAAE,QAAQ,EAAE,GAAuB;AACtE,SACC,oBAAC,SAAI,WAAU,gCACb,gBAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MACtC;AAAA,IAAC;AAAA;AAAA,MAEA,WAAU;AAAA,MAEV;AAAA,4BAAC,YAAS,WAAU,6CAA4C;AAAA,QAChE,qBAAC,SAAI,WAAU,kCACd;AAAA,8BAAC,YAAS,WAAU,mBAAkB;AAAA,UACtC,oBAAC,YAAS,WAAU,oBAAmB;AAAA,UACvC,oBAAC,YAAS,WAAU,mBAAkB;AAAA,WACvC;AAAA;AAAA;AAAA,IARK;AAAA,EASN,CACA,GACF;AAEF;AAEO,SAAS,gBAAgB,EAAE,QAAQ,EAAE,GAAuB;AAClE,SACC,oBAAC,SAAI,WAAU,gBACb,gBAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MACtC,qBAAC,SAAY,WAAU,kDACtB;AAAA,yBAAC,SAAI,WAAU,oCACd;AAAA,0BAAC,YAAS,WAAU,kBAAiB;AAAA,MACrC,oBAAC,YAAS,WAAU,kBAAiB;AAAA,OACtC;AAAA,IACA,oBAAC,YAAS,WAAU,oBAAmB;AAAA,IACvC,oBAAC,YAAS,WAAU,mBAAkB;AAAA,OAN7B,CAOV,CACA,GACF;AAEF;AAEO,SAAS,qBAAqB;AACpC,SACC,qBAAC,SACA;AAAA,wBAAC,YAAS,WAAU,gCAA+B;AAAA,IACnD,qBAAC,SAAI,WAAU,mDACd;AAAA,0BAAC,YAAS,WAAU,kBAAiB;AAAA,MACrC,oBAAC,YAAS,WAAU,kBAAiB;AAAA,MACrC,oBAAC,YAAS,WAAU,oBAAmB;AAAA,MACvC,qBAAC,SAAI,WAAU,oBACd;AAAA,4BAAC,YAAS,WAAU,kCAAiC;AAAA,QACrD,oBAAC,YAAS,WAAU,kCAAiC;AAAA,SACtD;AAAA,MACA,oBAAC,YAAS,WAAU,oBAAmB;AAAA,MACvC,oBAAC,YAAS,WAAU,mBAAkB;AAAA,MACtC,qBAAC,SAAI,WAAU,wBACb;AAAA,cAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MAClC,oBAAC,YAAiB,WAAU,sBAAb,CAAgC,CAC/C;AAAA,QACD,oBAAC,YAAS,WAAU,mBAAkB;AAAA,SACvC;AAAA,OACD;AAAA,KACD;AAEF;","names":[]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import { useForm } from "@tanstack/react-form";
|
|
4
|
+
import { useId } from "react";
|
|
5
|
+
import { TanStackInputField } from "../../../lib/forms/tanstack-field.js";
|
|
4
6
|
import { Button } from "../../primitives/buttons/button.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
+
import { FieldGroup } from "../../primitives/forms/field.js";
|
|
8
|
+
import { Form, FormActions } from "../../primitives/forms/form.js";
|
|
7
9
|
import { Heading, Link, Text } from "../../primitives/index.js";
|
|
8
10
|
import { cn } from "../../../utils/index.js";
|
|
9
11
|
function Login({
|
|
@@ -25,56 +27,83 @@ function Login({
|
|
|
25
27
|
autoFocus = false
|
|
26
28
|
}) {
|
|
27
29
|
const id = useId();
|
|
28
|
-
const usernameId = `${id}-username`;
|
|
29
|
-
const passwordId = `${id}-password`;
|
|
30
30
|
const titleId = `${id}-title`;
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
const form = useForm({
|
|
32
|
+
defaultValues: {
|
|
33
|
+
username: "",
|
|
34
|
+
password: ""
|
|
35
|
+
},
|
|
36
|
+
onSubmit: async ({ value }) => {
|
|
37
|
+
await onSubmit?.(value);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
37
40
|
return /* @__PURE__ */ jsxs("div", { className: cn("sg:w-full sg:max-w-sm sg:space-y-6", className), children: [
|
|
38
41
|
/* @__PURE__ */ jsxs("div", { className: "sg:text-center", children: [
|
|
39
42
|
/* @__PURE__ */ jsx(Heading, { variant: titleVariant, id: titleId, children: title }),
|
|
40
43
|
description && /* @__PURE__ */ jsx(Text, { className: "sg:mt-2", foreground: "muted-foreground", children: description })
|
|
41
44
|
] }),
|
|
42
|
-
/* @__PURE__ */ jsxs(
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
45
|
+
/* @__PURE__ */ jsxs(
|
|
46
|
+
Form,
|
|
47
|
+
{
|
|
48
|
+
className: "sg:gap-4",
|
|
49
|
+
"aria-labelledby": titleId,
|
|
50
|
+
onSubmit: (event) => {
|
|
51
|
+
event.preventDefault();
|
|
52
|
+
event.stopPropagation();
|
|
53
|
+
void form.handleSubmit();
|
|
54
|
+
},
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ jsxs(FieldGroup, { children: [
|
|
57
|
+
/* @__PURE__ */ jsx(
|
|
58
|
+
TanStackInputField,
|
|
59
|
+
{
|
|
60
|
+
formApi: form,
|
|
61
|
+
name: "username",
|
|
62
|
+
label: usernameLabel,
|
|
63
|
+
type: usernameType,
|
|
64
|
+
placeholder: usernamePlaceholder,
|
|
65
|
+
autoFocus,
|
|
66
|
+
disabled: loading,
|
|
67
|
+
autoComplete: "username",
|
|
68
|
+
validators: {
|
|
69
|
+
onChange: ({ value }) => value.trim() ? void 0 : `${usernameLabel} is required.`
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
),
|
|
73
|
+
/* @__PURE__ */ jsx(
|
|
74
|
+
TanStackInputField,
|
|
75
|
+
{
|
|
76
|
+
formApi: form,
|
|
77
|
+
name: "password",
|
|
78
|
+
label: passwordLabel,
|
|
79
|
+
type: "password",
|
|
80
|
+
placeholder: passwordPlaceholder,
|
|
81
|
+
disabled: loading,
|
|
82
|
+
autoComplete: "current-password",
|
|
83
|
+
validators: {
|
|
84
|
+
onChange: ({ value }) => value.trim() ? void 0 : `${passwordLabel} is required.`
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
] }),
|
|
89
|
+
/* @__PURE__ */ jsx(FormActions, { children: /* @__PURE__ */ jsx(
|
|
90
|
+
form.Subscribe,
|
|
91
|
+
{
|
|
92
|
+
selector: (state) => [state.canSubmit, state.isSubmitting],
|
|
93
|
+
children: ([canSubmit, isSubmitting]) => /* @__PURE__ */ jsx(
|
|
94
|
+
Button,
|
|
95
|
+
{
|
|
96
|
+
type: "submit",
|
|
97
|
+
className: "sg:w-full",
|
|
98
|
+
disabled: loading || !canSubmit || isSubmitting,
|
|
99
|
+
children: loading || isSubmitting ? loadingLabel : submitLabel
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
) })
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
),
|
|
78
107
|
signUpLabel && signUpHref && /* @__PURE__ */ jsxs(
|
|
79
108
|
Text,
|
|
80
109
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/blocks/login/login.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useId
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/blocks/login/login.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useForm } from \"@tanstack/react-form\";\r\nimport { useId } from \"react\";\r\nimport { TanStackInputField } from \"../../../lib/forms/tanstack-field\";\r\nimport { Button } from \"../../primitives/buttons/button\";\r\nimport { FieldGroup } from \"../../primitives/forms/field\";\r\nimport { Form, FormActions } from \"../../primitives/forms/form\";\r\nimport { Heading, Link, Text } from \"../../primitives/index\";\r\nimport { cn } from \"../../../utils/index\";\r\n\r\nexport type LoginCredentials = {\r\n username: string;\r\n password: string;\r\n};\r\n\r\nexport type LoginProps = {\r\n /**\r\n * Form heading text.\r\n */\r\n title?: string;\r\n /**\r\n * Supporting text shown below the heading.\r\n */\r\n description?: string;\r\n /**\r\n * Label for the username or email field.\r\n */\r\n usernameLabel?: string;\r\n /**\r\n * Input type for the identifier field.\r\n */\r\n usernameType?: \"text\" | \"email\";\r\n /**\r\n * Placeholder for the identifier field.\r\n */\r\n usernamePlaceholder?: string;\r\n /**\r\n * Label for the password field.\r\n */\r\n passwordLabel?: string;\r\n /**\r\n * Placeholder for the password field.\r\n */\r\n passwordPlaceholder?: string;\r\n /**\r\n * Submit button label when not loading.\r\n */\r\n submitLabel?: string;\r\n /**\r\n * Submit button label while loading.\r\n */\r\n loadingLabel?: string;\r\n /**\r\n * Disables the form and shows the loading label on submit.\r\n */\r\n loading?: boolean;\r\n /**\r\n * Label for the optional sign-up link.\r\n */\r\n signUpLabel?: string;\r\n /**\r\n * Destination for the optional sign-up link.\r\n */\r\n signUpHref?: string;\r\n /**\r\n * Heading level for the title.\r\n */\r\n titleVariant?: \"h1\" | \"h2\" | \"h3\" | \"h4\";\r\n /**\r\n * Called when the form is submitted with valid credentials.\r\n */\r\n onSubmit?: (credentials: LoginCredentials) => void | Promise<void>;\r\n /**\r\n * Additional classes for the root wrapper.\r\n */\r\n className?: string;\r\n /**\r\n * Focuses the identifier field on mount.\r\n */\r\n autoFocus?: boolean;\r\n};\r\n\r\n/**\r\n * Reusable login form with username/email and password fields.\r\n */\r\nexport function Login({\r\n title = \"Log in\",\r\n description,\r\n usernameLabel = \"Username\",\r\n usernameType = \"text\",\r\n usernamePlaceholder = \"johndoe\",\r\n passwordLabel = \"Password\",\r\n passwordPlaceholder = \"••••••••\",\r\n submitLabel = \"Log in\",\r\n loadingLabel = \"Logging in...\",\r\n loading = false,\r\n signUpLabel,\r\n signUpHref,\r\n titleVariant = \"h1\",\r\n onSubmit,\r\n className,\r\n autoFocus = false,\r\n}: LoginProps) {\r\n const id = useId();\r\n const titleId = `${id}-title`;\r\n\r\n const form = useForm({\r\n defaultValues: {\r\n username: \"\",\r\n password: \"\",\r\n } satisfies LoginCredentials,\r\n onSubmit: async ({ value }) => {\r\n await onSubmit?.(value);\r\n },\r\n });\r\n\r\n return (\r\n <div className={cn(\"sg:w-full sg:max-w-sm sg:space-y-6\", className)}>\r\n <div className=\"sg:text-center\">\r\n <Heading variant={titleVariant} id={titleId}>\r\n {title}\r\n </Heading>\r\n {description && (\r\n <Text className=\"sg:mt-2\" foreground=\"muted-foreground\">\r\n {description}\r\n </Text>\r\n )}\r\n </div>\r\n\r\n <Form\r\n className=\"sg:gap-4\"\r\n aria-labelledby={titleId}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n void form.handleSubmit();\r\n }}\r\n >\r\n <FieldGroup>\r\n <TanStackInputField\r\n formApi={form}\r\n name=\"username\"\r\n label={usernameLabel}\r\n type={usernameType}\r\n placeholder={usernamePlaceholder}\r\n autoFocus={autoFocus}\r\n disabled={loading}\r\n autoComplete=\"username\"\r\n validators={{\r\n onChange: ({ value }: { value: string }) =>\r\n value.trim() ? undefined : `${usernameLabel} is required.`,\r\n }}\r\n />\r\n <TanStackInputField\r\n formApi={form}\r\n name=\"password\"\r\n label={passwordLabel}\r\n type=\"password\"\r\n placeholder={passwordPlaceholder}\r\n disabled={loading}\r\n autoComplete=\"current-password\"\r\n validators={{\r\n onChange: ({ value }: { value: string }) =>\r\n value.trim() ? undefined : `${passwordLabel} is required.`,\r\n }}\r\n />\r\n </FieldGroup>\r\n <FormActions>\r\n <form.Subscribe\r\n selector={(state) => [state.canSubmit, state.isSubmitting]}\r\n >\r\n {([canSubmit, isSubmitting]) => (\r\n <Button\r\n type=\"submit\"\r\n className=\"sg:w-full\"\r\n disabled={loading || !canSubmit || isSubmitting}\r\n >\r\n {loading || isSubmitting ? loadingLabel : submitLabel}\r\n </Button>\r\n )}\r\n </form.Subscribe>\r\n </FormActions>\r\n </Form>\r\n\r\n {signUpLabel && signUpHref && (\r\n <Text\r\n size=\"sm\"\r\n foreground=\"muted-foreground\"\r\n className=\"sg:text-center\"\r\n >\r\n Don't have an account? <Link to={signUpHref}>{signUpLabel}</Link>\r\n </Text>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":";AAuHM,SACE,KADF;AArHN,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,0BAA0B;AACnC,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,MAAM,mBAAmB;AAClC,SAAS,SAAS,MAAM,YAAY;AACpC,SAAS,UAAU;AA6EZ,SAAS,MAAM;AAAA,EACpB,QAAQ;AAAA,EACR;AAAA,EACA,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAe;AACb,QAAM,KAAK,MAAM;AACjB,QAAM,UAAU,GAAG,EAAE;AAErB,QAAM,OAAO,QAAQ;AAAA,IACnB,eAAe;AAAA,MACb,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,IACA,UAAU,OAAO,EAAE,MAAM,MAAM;AAC7B,YAAM,WAAW,KAAK;AAAA,IACxB;AAAA,EACF,CAAC;AAED,SACE,qBAAC,SAAI,WAAW,GAAG,sCAAsC,SAAS,GAChE;AAAA,yBAAC,SAAI,WAAU,kBACb;AAAA,0BAAC,WAAQ,SAAS,cAAc,IAAI,SACjC,iBACH;AAAA,MACC,eACC,oBAAC,QAAK,WAAU,WAAU,YAAW,oBAClC,uBACH;AAAA,OAEJ;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,mBAAiB;AAAA,QACjB,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB,eAAK,KAAK,aAAa;AAAA,QACzB;AAAA,QAEA;AAAA,+BAAC,cACC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,gBACb;AAAA,gBACA,UAAU;AAAA,gBACV,cAAa;AAAA,gBACb,YAAY;AAAA,kBACV,UAAU,CAAC,EAAE,MAAM,MACjB,MAAM,KAAK,IAAI,SAAY,GAAG,aAAa;AAAA,gBAC/C;AAAA;AAAA,YACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,MAAK;AAAA,gBACL,aAAa;AAAA,gBACb,UAAU;AAAA,gBACV,cAAa;AAAA,gBACb,YAAY;AAAA,kBACV,UAAU,CAAC,EAAE,MAAM,MACjB,MAAM,KAAK,IAAI,SAAY,GAAG,aAAa;AAAA,gBAC/C;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UACA,oBAAC,eACC;AAAA,YAAC,KAAK;AAAA,YAAL;AAAA,cACC,UAAU,CAAC,UAAU,CAAC,MAAM,WAAW,MAAM,YAAY;AAAA,cAExD,WAAC,CAAC,WAAW,YAAY,MACxB;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU,WAAW,CAAC,aAAa;AAAA,kBAElC,qBAAW,eAAe,eAAe;AAAA;AAAA,cAC5C;AAAA;AAAA,UAEJ,GACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEC,eAAe,cACd;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAW;AAAA,QACX,WAAU;AAAA,QACX;AAAA;AAAA,UAC6B,oBAAC,QAAK,IAAI,YAAa,uBAAY;AAAA;AAAA;AAAA,IACjE;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { icons } from 'lucide-react';
|
|
3
|
+
|
|
4
|
+
type Props = {
|
|
5
|
+
icon?: keyof typeof icons;
|
|
6
|
+
title: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
};
|
|
10
|
+
/** Centered hero strip with icon, title, and optional description. */
|
|
11
|
+
declare function PageHero({ icon, title, description, className }: Props): React.JSX.Element;
|
|
12
|
+
|
|
13
|
+
export { PageHero };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Icon, Heading, Text } from "../../primitives/index.js";
|
|
3
|
+
import { cn } from "../../../utils/index.js";
|
|
4
|
+
function PageHero({ icon, title, description, className }) {
|
|
5
|
+
return /* @__PURE__ */ jsx(
|
|
6
|
+
"section",
|
|
7
|
+
{
|
|
8
|
+
className: cn(
|
|
9
|
+
"sg:bg-primary/5 sg:border-b sg:border-border",
|
|
10
|
+
className
|
|
11
|
+
),
|
|
12
|
+
children: /* @__PURE__ */ jsxs("div", { className: "sg:container sg:py-16 md:sg:py-20 sg:max-w-3xl sg:mx-auto sg:text-center", children: [
|
|
13
|
+
icon && /* @__PURE__ */ jsx(
|
|
14
|
+
Icon,
|
|
15
|
+
{
|
|
16
|
+
icon,
|
|
17
|
+
className: "sg:h-10 sg:w-10 sg:text-primary sg:mx-auto sg:mb-4"
|
|
18
|
+
}
|
|
19
|
+
),
|
|
20
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h1", className: "sg:mb-3", children: title }),
|
|
21
|
+
description && /* @__PURE__ */ jsx(
|
|
22
|
+
Text,
|
|
23
|
+
{
|
|
24
|
+
size: "lg",
|
|
25
|
+
foreground: "muted-foreground",
|
|
26
|
+
className: "sg:max-w-xl sg:mx-auto sg:leading-relaxed",
|
|
27
|
+
children: description
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
] })
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
PageHero
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=page-hero.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/blocks/marketing/page-hero.tsx"],"sourcesContent":["import type { icons } from \"lucide-react\";\r\nimport { Icon, Heading, Text } from \"../../primitives/index\";\r\nimport { cn } from \"../../../utils/index\";\r\n\r\ntype Props = {\r\n\ticon?: keyof typeof icons;\r\n\ttitle: string;\r\n\tdescription?: string;\r\n\tclassName?: string;\r\n};\r\n\r\n/** Centered hero strip with icon, title, and optional description. */\r\nexport function PageHero({ icon, title, description, className }: Props) {\r\n\treturn (\r\n\t\t<section\r\n\t\t\tclassName={cn(\r\n\t\t\t\t\"sg:bg-primary/5 sg:border-b sg:border-border\",\r\n\t\t\t\tclassName,\r\n\t\t\t)}\r\n\t\t>\r\n\t\t\t<div className=\"sg:container sg:py-16 md:sg:py-20 sg:max-w-3xl sg:mx-auto sg:text-center\">\r\n\t\t\t\t{icon && (\r\n\t\t\t\t\t<Icon\r\n\t\t\t\t\t\ticon={icon}\r\n\t\t\t\t\t\tclassName=\"sg:h-10 sg:w-10 sg:text-primary sg:mx-auto sg:mb-4\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t)}\r\n\t\t\t\t<Heading variant=\"h1\" className=\"sg:mb-3\">\r\n\t\t\t\t\t{title}\r\n\t\t\t\t</Heading>\r\n\t\t\t\t{description && (\r\n\t\t\t\t\t<Text\r\n\t\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\t\tforeground=\"muted-foreground\"\r\n\t\t\t\t\t\tclassName=\"sg:max-w-xl sg:mx-auto sg:leading-relaxed\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{description}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t)}\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t);\r\n}\r\n"],"mappings":"AAoBG,SAEE,KAFF;AAnBH,SAAS,MAAM,SAAS,YAAY;AACpC,SAAS,UAAU;AAUZ,SAAS,SAAS,EAAE,MAAM,OAAO,aAAa,UAAU,GAAU;AACxE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MAEA,+BAAC,SAAI,WAAU,4EACb;AAAA,gBACA;AAAA,UAAC;AAAA;AAAA,YACA;AAAA,YACA,WAAU;AAAA;AAAA,QACX;AAAA,QAED,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAC9B,iBACF;AAAA,QACC,eACA;AAAA,UAAC;AAAA;AAAA,YACA,MAAK;AAAA,YACL,YAAW;AAAA,YACX,WAAU;AAAA,YAET;AAAA;AAAA,QACF;AAAA,SAEF;AAAA;AAAA,EACD;AAEF;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { icons } from 'lucide-react';
|
|
3
|
+
|
|
4
|
+
type StatItem = {
|
|
5
|
+
label: string;
|
|
6
|
+
value: string;
|
|
7
|
+
icon?: keyof typeof icons;
|
|
8
|
+
};
|
|
9
|
+
type Props = {
|
|
10
|
+
items: StatItem[];
|
|
11
|
+
className?: string;
|
|
12
|
+
};
|
|
13
|
+
/** Grid of stat cards with icon, value, and label. */
|
|
14
|
+
declare function StatsGrid({ items, className }: Props): React.JSX.Element;
|
|
15
|
+
|
|
16
|
+
export { type StatItem, StatsGrid };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Card, CardContent } from "../cards/card.js";
|
|
3
|
+
import { Icon, Heading, Text } from "../../primitives/index.js";
|
|
4
|
+
import { cn } from "../../../utils/index.js";
|
|
5
|
+
function StatsGrid({ items, className }) {
|
|
6
|
+
return /* @__PURE__ */ jsx(
|
|
7
|
+
"div",
|
|
8
|
+
{
|
|
9
|
+
className: cn(
|
|
10
|
+
"sg:grid sg:grid-cols-2 md:sg:grid-cols-4 sg:gap-4",
|
|
11
|
+
className
|
|
12
|
+
),
|
|
13
|
+
children: items.map((stat) => /* @__PURE__ */ jsx(Card, { className: "sg:text-center", children: /* @__PURE__ */ jsxs(CardContent, { className: "sg:pt-6 sg:pb-4", children: [
|
|
14
|
+
stat.icon && /* @__PURE__ */ jsx(
|
|
15
|
+
Icon,
|
|
16
|
+
{
|
|
17
|
+
icon: stat.icon,
|
|
18
|
+
className: "sg:h-6 sg:w-6 sg:text-primary sg:mx-auto sg:mb-2"
|
|
19
|
+
}
|
|
20
|
+
),
|
|
21
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h3", className: "sg:text-3xl", children: stat.value }),
|
|
22
|
+
/* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", className: "sg:mt-1", children: stat.label })
|
|
23
|
+
] }) }, stat.label))
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
StatsGrid
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=stats-grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/blocks/marketing/stats-grid.tsx"],"sourcesContent":["import type { icons } from \"lucide-react\";\r\nimport { Card, CardContent } from \"../cards/card\";\r\nimport { Icon, Heading, Text } from \"../../primitives/index\";\r\nimport { cn } from \"../../../utils/index\";\r\n\r\nexport type StatItem = {\r\n\tlabel: string;\r\n\tvalue: string;\r\n\ticon?: keyof typeof icons;\r\n};\r\n\r\ntype Props = {\r\n\titems: StatItem[];\r\n\tclassName?: string;\r\n};\r\n\r\n/** Grid of stat cards with icon, value, and label. */\r\nexport function StatsGrid({ items, className }: Props) {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName={cn(\r\n\t\t\t\t\"sg:grid sg:grid-cols-2 md:sg:grid-cols-4 sg:gap-4\",\r\n\t\t\t\tclassName,\r\n\t\t\t)}\r\n\t\t>\r\n\t\t\t{items.map((stat) => (\r\n\t\t\t\t<Card key={stat.label} className=\"sg:text-center\">\r\n\t\t\t\t\t<CardContent className=\"sg:pt-6 sg:pb-4\">\r\n\t\t\t\t\t\t{stat.icon && (\r\n\t\t\t\t\t\t\t<Icon\r\n\t\t\t\t\t\t\t\ticon={stat.icon}\r\n\t\t\t\t\t\t\t\tclassName=\"sg:h-6 sg:w-6 sg:text-primary sg:mx-auto sg:mb-2\"\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t<Heading variant=\"h3\" className=\"sg:text-3xl\">\r\n\t\t\t\t\t\t\t{stat.value}\r\n\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t<Text size=\"sm\" foreground=\"muted-foreground\" className=\"sg:mt-1\">\r\n\t\t\t\t\t\t\t{stat.label}\r\n\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t</CardContent>\r\n\t\t\t\t</Card>\r\n\t\t\t))}\r\n\t\t</div>\r\n\t);\r\n}\r\n"],"mappings":"AA2BK,SAEE,KAFF;AA1BL,SAAS,MAAM,mBAAmB;AAClC,SAAS,MAAM,SAAS,YAAY;AACpC,SAAS,UAAU;AAcZ,SAAS,UAAU,EAAE,OAAO,UAAU,GAAU;AACtD,SACC;AAAA,IAAC;AAAA;AAAA,MACA,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MAEC,gBAAM,IAAI,CAAC,SACX,oBAAC,QAAsB,WAAU,kBAChC,+BAAC,eAAY,WAAU,mBACrB;AAAA,aAAK,QACL;AAAA,UAAC;AAAA;AAAA,YACA,MAAM,KAAK;AAAA,YACX,WAAU;AAAA;AAAA,QACX;AAAA,QAED,oBAAC,WAAQ,SAAQ,MAAK,WAAU,eAC9B,eAAK,OACP;AAAA,QACA,oBAAC,QAAK,MAAK,MAAK,YAAW,oBAAmB,WAAU,WACtD,eAAK,OACP;AAAA,SACD,KAdU,KAAK,KAehB,CACA;AAAA;AAAA,EACF;AAEF;","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type TimelineItem = {
|
|
4
|
+
year: string;
|
|
5
|
+
title: string;
|
|
6
|
+
description: string;
|
|
7
|
+
};
|
|
8
|
+
type Props = {
|
|
9
|
+
items: TimelineItem[];
|
|
10
|
+
title?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
className?: string;
|
|
13
|
+
};
|
|
14
|
+
/** Vertical timeline with year, title, and description entries. */
|
|
15
|
+
declare function Timeline({ items, title, description, className, }: Props): React.JSX.Element;
|
|
16
|
+
|
|
17
|
+
export { Timeline, type TimelineItem };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Heading, Text } from "../../primitives/index.js";
|
|
3
|
+
function Timeline({
|
|
4
|
+
items,
|
|
5
|
+
title = "Our Journey",
|
|
6
|
+
description,
|
|
7
|
+
className
|
|
8
|
+
}) {
|
|
9
|
+
return /* @__PURE__ */ jsxs("div", { className, children: [
|
|
10
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:mb-2", children: title }),
|
|
11
|
+
description && /* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:mb-10", children: description }),
|
|
12
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:relative", children: [
|
|
13
|
+
/* @__PURE__ */ jsx(
|
|
14
|
+
"div",
|
|
15
|
+
{
|
|
16
|
+
className: "sg:absolute sg:left-4 md:sg:left-6 sg:top-0 sg:bottom-0 sg:w-px sg:bg-border",
|
|
17
|
+
"aria-hidden": "true"
|
|
18
|
+
}
|
|
19
|
+
),
|
|
20
|
+
/* @__PURE__ */ jsx("div", { className: "sg:space-y-10", children: items.map((item, i) => /* @__PURE__ */ jsxs("div", { className: "sg:relative sg:pl-12 md:sg:pl-16", children: [
|
|
21
|
+
/* @__PURE__ */ jsx(
|
|
22
|
+
"div",
|
|
23
|
+
{
|
|
24
|
+
className: "sg:absolute sg:left-2.5 md:sg:left-4.5 sg:top-1 sg:h-3 sg:w-3 sg:rounded-full sg:bg-primary sg:ring-4 sg:ring-background",
|
|
25
|
+
"aria-hidden": "true"
|
|
26
|
+
}
|
|
27
|
+
),
|
|
28
|
+
/* @__PURE__ */ jsx(
|
|
29
|
+
Text,
|
|
30
|
+
{
|
|
31
|
+
size: "xs",
|
|
32
|
+
foreground: "muted-foreground",
|
|
33
|
+
className: "sg:font-mono sg:uppercase sg:tracking-wider",
|
|
34
|
+
children: item.year
|
|
35
|
+
}
|
|
36
|
+
),
|
|
37
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h4", className: "sg:mt-0.5", children: item.title }),
|
|
38
|
+
/* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", className: "sg:mt-1", children: item.description })
|
|
39
|
+
] }, i)) })
|
|
40
|
+
] })
|
|
41
|
+
] });
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
Timeline
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/blocks/marketing/timeline.tsx"],"sourcesContent":["import { Heading, Text } from \"../../primitives/index\";\r\n\r\nexport type TimelineItem = {\r\n\tyear: string;\r\n\ttitle: string;\r\n\tdescription: string;\r\n};\r\n\r\ntype Props = {\r\n\titems: TimelineItem[];\r\n\ttitle?: string;\r\n\tdescription?: string;\r\n\tclassName?: string;\r\n};\r\n\r\n/** Vertical timeline with year, title, and description entries. */\r\nexport function Timeline({\r\n\titems,\r\n\ttitle = \"Our Journey\",\r\n\tdescription,\r\n\tclassName,\r\n}: Props) {\r\n\treturn (\r\n\t\t<div className={className}>\r\n\t\t\t<Heading variant=\"h2\" className=\"sg:mb-2\">\r\n\t\t\t\t{title}\r\n\t\t\t</Heading>\r\n\t\t\t{description && (\r\n\t\t\t\t<Text foreground=\"muted-foreground\" className=\"sg:mb-10\">\r\n\t\t\t\t\t{description}\r\n\t\t\t\t</Text>\r\n\t\t\t)}\r\n\t\t\t<div className=\"sg:relative\">\r\n\t\t\t\t<div\r\n\t\t\t\t\tclassName=\"sg:absolute sg:left-4 md:sg:left-6 sg:top-0 sg:bottom-0 sg:w-px sg:bg-border\"\r\n\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t/>\r\n\t\t\t\t<div className=\"sg:space-y-10\">\r\n\t\t\t\t\t{items.map((item, i) => (\r\n\t\t\t\t\t\t<div key={i} className=\"sg:relative sg:pl-12 md:sg:pl-16\">\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tclassName=\"sg:absolute sg:left-2.5 md:sg:left-4.5 sg:top-1 sg:h-3 sg:w-3 sg:rounded-full sg:bg-primary sg:ring-4 sg:ring-background\"\r\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<Text\r\n\t\t\t\t\t\t\t\tsize=\"xs\"\r\n\t\t\t\t\t\t\t\tforeground=\"muted-foreground\"\r\n\t\t\t\t\t\t\t\tclassName=\"sg:font-mono sg:uppercase sg:tracking-wider\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{item.year}\r\n\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t<Heading variant=\"h4\" className=\"sg:mt-0.5\">\r\n\t\t\t\t\t\t\t\t{item.title}\r\n\t\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t\t<Text size=\"sm\" foreground=\"muted-foreground\" className=\"sg:mt-1\">\r\n\t\t\t\t\t\t\t\t{item.description}\r\n\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n"],"mappings":"AAwBG,cAeG,YAfH;AAxBH,SAAS,SAAS,YAAY;AAgBvB,SAAS,SAAS;AAAA,EACxB;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACD,GAAU;AACT,SACC,qBAAC,SAAI,WACJ;AAAA,wBAAC,WAAQ,SAAQ,MAAK,WAAU,WAC9B,iBACF;AAAA,IACC,eACA,oBAAC,QAAK,YAAW,oBAAmB,WAAU,YAC5C,uBACF;AAAA,IAED,qBAAC,SAAI,WAAU,eACd;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,WAAU;AAAA,UACV,eAAY;AAAA;AAAA,MACb;AAAA,MACA,oBAAC,SAAI,WAAU,iBACb,gBAAM,IAAI,CAAC,MAAM,MACjB,qBAAC,SAAY,WAAU,oCACtB;AAAA;AAAA,UAAC;AAAA;AAAA,YACA,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,QACb;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,MAAK;AAAA,YACL,YAAW;AAAA,YACX,WAAU;AAAA,YAET,eAAK;AAAA;AAAA,QACP;AAAA,QACA,oBAAC,WAAQ,SAAQ,MAAK,WAAU,aAC9B,eAAK,OACP;AAAA,QACA,oBAAC,QAAK,MAAK,MAAK,YAAW,oBAAmB,WAAU,WACtD,eAAK,aACP;AAAA,WAjBS,CAkBV,CACA,GACF;AAAA,OACD;AAAA,KACD;AAEF;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as React$1 from 'react';
|
|
2
|
+
|
|
3
|
+
type ValueItem = {
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
};
|
|
7
|
+
type Props = {
|
|
8
|
+
items: ValueItem[];
|
|
9
|
+
title?: string;
|
|
10
|
+
icon?: React.ReactNode;
|
|
11
|
+
className?: string;
|
|
12
|
+
};
|
|
13
|
+
/** Grid of value cards with title and description. */
|
|
14
|
+
declare function ValuesGrid({ items, title, icon, className, }: Props): React$1.JSX.Element;
|
|
15
|
+
|
|
16
|
+
export { type ValueItem, ValuesGrid };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Heading, Text } from "../../primitives/index.js";
|
|
3
|
+
import { cn } from "../../../utils/index.js";
|
|
4
|
+
function ValuesGrid({
|
|
5
|
+
items,
|
|
6
|
+
title = "What We Value",
|
|
7
|
+
icon,
|
|
8
|
+
className
|
|
9
|
+
}) {
|
|
10
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("sg:text-center", className), children: [
|
|
11
|
+
icon,
|
|
12
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:mb-4", children: title }),
|
|
13
|
+
/* @__PURE__ */ jsx("div", { className: "sg:grid sg:gap-4 sm:sg:grid-cols-3 sg:text-left sg:mt-8", children: items.map((value) => /* @__PURE__ */ jsxs(
|
|
14
|
+
"div",
|
|
15
|
+
{
|
|
16
|
+
className: "sg:p-4 sg:rounded-lg sg:bg-background sg:border sg:border-border",
|
|
17
|
+
children: [
|
|
18
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h6", className: "sg:mb-1", children: value.title }),
|
|
19
|
+
/* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", children: value.description })
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
value.title
|
|
23
|
+
)) })
|
|
24
|
+
] });
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
ValuesGrid
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=values-grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/blocks/marketing/values-grid.tsx"],"sourcesContent":["import { Heading, Text } from \"../../primitives/index\";\r\nimport { cn } from \"../../../utils/index\";\r\n\r\nexport type ValueItem = {\r\n\ttitle: string;\r\n\tdescription: string;\r\n};\r\n\r\ntype Props = {\r\n\titems: ValueItem[];\r\n\ttitle?: string;\r\n\ticon?: React.ReactNode;\r\n\tclassName?: string;\r\n};\r\n\r\n/** Grid of value cards with title and description. */\r\nexport function ValuesGrid({\r\n\titems,\r\n\ttitle = \"What We Value\",\r\n\ticon,\r\n\tclassName,\r\n}: Props) {\r\n\treturn (\r\n\t\t<div className={cn(\"sg:text-center\", className)}>\r\n\t\t\t{icon}\r\n\t\t\t<Heading variant=\"h2\" className=\"sg:mb-4\">\r\n\t\t\t\t{title}\r\n\t\t\t</Heading>\r\n\t\t\t<div className=\"sg:grid sg:gap-4 sm:sg:grid-cols-3 sg:text-left sg:mt-8\">\r\n\t\t\t\t{items.map((value) => (\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tkey={value.title}\r\n\t\t\t\t\t\tclassName=\"sg:p-4 sg:rounded-lg sg:bg-background sg:border sg:border-border\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Heading variant=\"h6\" className=\"sg:mb-1\">\r\n\t\t\t\t\t\t\t{value.title}\r\n\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t<Text size=\"sm\" foreground=\"muted-foreground\">\r\n\t\t\t\t\t\t\t{value.description}\r\n\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t))}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n"],"mappings":"AAyBG,cAKE,YALF;AAzBH,SAAS,SAAS,YAAY;AAC9B,SAAS,UAAU;AAeZ,SAAS,WAAW;AAAA,EAC1B;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACD,GAAU;AACT,SACC,qBAAC,SAAI,WAAW,GAAG,kBAAkB,SAAS,GAC5C;AAAA;AAAA,IACD,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAC9B,iBACF;AAAA,IACA,oBAAC,SAAI,WAAU,2DACb,gBAAM,IAAI,CAAC,UACX;AAAA,MAAC;AAAA;AAAA,QAEA,WAAU;AAAA,QAEV;AAAA,8BAAC,WAAQ,SAAQ,MAAK,WAAU,WAC9B,gBAAM,OACR;AAAA,UACA,oBAAC,QAAK,MAAK,MAAK,YAAW,oBACzB,gBAAM,aACR;AAAA;AAAA;AAAA,MARK,MAAM;AAAA,IASZ,CACA,GACF;AAAA,KACD;AAEF;","names":[]}
|
|
@@ -193,9 +193,9 @@ function PostListWithFilters({
|
|
|
193
193
|
/* @__PURE__ */ jsx(AnimatePresence, { children: isFiltersOpen && /* @__PURE__ */ jsxs(
|
|
194
194
|
motion.div,
|
|
195
195
|
{
|
|
196
|
-
initial: { height: 0, opacity:
|
|
196
|
+
initial: { height: 0, opacity: 1 },
|
|
197
197
|
animate: { height: "auto", opacity: 1 },
|
|
198
|
-
exit: { height: 0, opacity:
|
|
198
|
+
exit: { height: 0, opacity: 1 },
|
|
199
199
|
className: "sg:overflow-hidden sg:border sg:rounded-xl sg:p-6 sg:bg-card sg:mb-8 sg:shadow-sm",
|
|
200
200
|
children: [
|
|
201
201
|
/* @__PURE__ */ jsxs("div", { className: "sg:flex sg:justify-between sg:items-center sg:mb-6", children: [
|
|
@@ -312,9 +312,9 @@ function PostListWithFilters({
|
|
|
312
312
|
/* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsx(
|
|
313
313
|
motion.div,
|
|
314
314
|
{
|
|
315
|
-
initial: { opacity:
|
|
315
|
+
initial: { opacity: 1, y: 10 },
|
|
316
316
|
animate: { opacity: 1, y: 0 },
|
|
317
|
-
exit: { opacity:
|
|
317
|
+
exit: { opacity: 1, y: -10 },
|
|
318
318
|
transition: { duration: 0.2 },
|
|
319
319
|
className: viewMode === "grid" ? "sg:grid sg:grid-cols-[repeat(auto-fill,minmax(210px,1fr))] sg:gap-8" : "sg:flex sg:flex-col sg:gap-4",
|
|
320
320
|
children: displayed.map(
|