singularity-components 0.1.195 → 0.1.196
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 +9 -4
- 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 +26 -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 +21 -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/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 +45 -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/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 +4 -1
- 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 +38 -18
- 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 +3 -1
- package/dist/components/pages/category/category-page.js.map +1 -1
- package/dist/components/pages/contact/contact-page.d.ts +5 -0
- package/dist/components/pages/contact/contact-page.js +173 -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 +86 -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/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 +148 -0
- package/dist/components/pages/newsletter/newsletter-page.js.map +1 -0
- 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/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/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 +2 -0
- package/dist/css/variables.css.map +1 -1
- package/dist/data/posts.d.ts +5 -0
- package/dist/data/posts.js +37 -4
- 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 +56 -0
- package/dist/lib/forms/tanstack-field.js +114 -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 +396 -87
- package/dist/main.css.map +1 -1
- package/package.json +14 -2
|
@@ -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":[]}
|
|
@@ -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,45 @@
|
|
|
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
|
+
className: "sg:font-mono sg:text-primary/70 sg:uppercase sg:tracking-wider",
|
|
33
|
+
children: item.year
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h4", className: "sg:mt-0.5", children: item.title }),
|
|
37
|
+
/* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", className: "sg:mt-1", children: item.description })
|
|
38
|
+
] }, i)) })
|
|
39
|
+
] })
|
|
40
|
+
] });
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
Timeline
|
|
44
|
+
};
|
|
45
|
+
//# 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\tclassName=\"sg:font-mono sg:text-primary/70 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,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,WAhBS,CAiBV,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":[]}
|
|
@@ -1,13 +1,34 @@
|
|
|
1
1
|
export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './blocks/cards/card.js';
|
|
2
|
+
export { AuthorCard } from './blocks/directory/author-card.js';
|
|
3
|
+
export { CategoryCard } from './blocks/directory/category-card.js';
|
|
4
|
+
export { ExtrasHubCard, ExtrasHubItem } from './blocks/extras/extras-hub-card.js';
|
|
5
|
+
export { GalleryImage } from './blocks/gallery/image-gallery.js';
|
|
6
|
+
export { CommentSkeleton, PostCardSkeleton, PostListRowSkeleton, PostListSkeleton, SinglePostSkeleton } from './blocks/loading/loading-skeletons.js';
|
|
2
7
|
export { Login, LoginCredentials, LoginProps } from './blocks/login/login.js';
|
|
8
|
+
export { PageHero } from './blocks/marketing/page-hero.js';
|
|
9
|
+
export { StatItem, StatsGrid } from './blocks/marketing/stats-grid.js';
|
|
10
|
+
export { Timeline, TimelineItem } from './blocks/marketing/timeline.js';
|
|
11
|
+
export { ValueItem, ValuesGrid } from './blocks/marketing/values-grid.js';
|
|
3
12
|
export { PostListWithFilters } from './blocks/post-list/post-list-with-filters.js';
|
|
13
|
+
export { AboutPage } from './pages/about/about-page.js';
|
|
4
14
|
export { AdminPage, AdminPageProps } from './pages/admin/admin-page.js';
|
|
15
|
+
export { AuthorPage } from './pages/author/author-page.js';
|
|
16
|
+
export { AuthorsPage } from './pages/authors/authors-page.js';
|
|
5
17
|
export { BlogPost } from './pages/blogpost/blogpost.js';
|
|
18
|
+
export { CategoriesPage } from './pages/categories/categories-page.js';
|
|
6
19
|
export { CategoryPage } from './pages/category/category-page.js';
|
|
20
|
+
export { ChatPage } from './pages/chat/chat-page.js';
|
|
21
|
+
export { ContactPage } from './pages/contact/contact-page.js';
|
|
22
|
+
export { ContentBlocksPage } from './pages/content-blocks/content-blocks-page.js';
|
|
23
|
+
export { ExtrasHubPage } from './pages/extras/extras-hub-page.js';
|
|
7
24
|
export { LoginPage } from './pages/login/login-page.js';
|
|
8
25
|
export { MaintenancePage } from './pages/maintenance/maintenance-page.js';
|
|
26
|
+
export { MembershipPage } from './pages/membership/membership-page.js';
|
|
27
|
+
export { MosaicPage } from './pages/mosaic/mosaic-page.js';
|
|
28
|
+
export { NewsletterPage } from './pages/newsletter/newsletter-page.js';
|
|
9
29
|
export { NotFound } from './pages/not-found/not-found.js';
|
|
10
30
|
export { PrivacyPage } from './pages/privacy/privacy-page.js';
|
|
31
|
+
export { ResourcesPage } from './pages/resources/resources-page.js';
|
|
11
32
|
export { SearchPage } from './pages/search/search-page.js';
|
|
12
33
|
export { StartPage } from './pages/startpage/startpage.js';
|
|
13
34
|
export { TermsPage } from './pages/terms/terms-page.js';
|
|
@@ -21,6 +42,9 @@ export { LinkButton } from './primitives/buttons/link-button.js';
|
|
|
21
42
|
export { Collapsible, CollapsibleContent, CollapsibleTrigger } from './primitives/collapsible/collapsible.js';
|
|
22
43
|
export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from './primitives/dropdown-menu/dropdown-menu.js';
|
|
23
44
|
export { Checkbox } from './primitives/forms/checkbox.js';
|
|
45
|
+
export { Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle } from './primitives/forms/field.js';
|
|
46
|
+
export { Form, FormActions } from './primitives/forms/form.js';
|
|
47
|
+
export { FormControl } from './primitives/forms/form-control.js';
|
|
24
48
|
export { Input } from './primitives/forms/input.js';
|
|
25
49
|
export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } from './primitives/forms/select.js';
|
|
26
50
|
export { Textarea } from './primitives/forms/textarea.js';
|
|
@@ -49,19 +73,22 @@ export { AuthProvider, useAuth } from './providers/auth-provider.js';
|
|
|
49
73
|
export { Theme, ThemeProvider, ThemeProviderProps, ThemeProviderState, useTheme } from './providers/theme-provider.js';
|
|
50
74
|
export { Container } from './templates/container/container.js';
|
|
51
75
|
export { Footer } from './templates/footer/footer.js';
|
|
76
|
+
export { LoadingScreen } from './templates/loading-screen/loading-screen.js';
|
|
52
77
|
export { Header, HeaderProps, NavLink } from './templates/navigation/header.js';
|
|
53
78
|
export { toast } from 'sonner';
|
|
54
79
|
import 'react';
|
|
80
|
+
import '../data/authors.js';
|
|
81
|
+
import 'lucide-react';
|
|
55
82
|
import '../data/posts.js';
|
|
56
83
|
import '@base-ui/react/accordion';
|
|
57
84
|
import 'class-variance-authority/types';
|
|
58
85
|
import 'class-variance-authority';
|
|
59
86
|
import '@base-ui/react/use-render';
|
|
60
87
|
import '@base-ui/react/button';
|
|
61
|
-
import 'lucide-react';
|
|
62
88
|
import '@radix-ui/react-collapsible';
|
|
63
89
|
import '@radix-ui/react-dropdown-menu';
|
|
64
90
|
import '@base-ui/react';
|
|
91
|
+
import '../lib/forms/field-props.js';
|
|
65
92
|
import '@base-ui/react/separator';
|
|
66
93
|
import '@radix-ui/react-dialog';
|
|
67
94
|
import './primitives/text/internal/text-element.js';
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { motion } from "framer-motion";
|
|
4
|
+
import { Layout, Heading, Text, Icon, Separator } from "../../primitives/index.js";
|
|
5
|
+
import { PageHero } from "../../blocks/marketing/page-hero.js";
|
|
6
|
+
import { StatsGrid } from "../../blocks/marketing/stats-grid.js";
|
|
7
|
+
import { Timeline } from "../../blocks/marketing/timeline.js";
|
|
8
|
+
import { ValuesGrid } from "../../blocks/marketing/values-grid.js";
|
|
9
|
+
import { Card, CardContent } from "../../blocks/cards/card.js";
|
|
10
|
+
import {
|
|
11
|
+
Avatar,
|
|
12
|
+
AvatarFallback,
|
|
13
|
+
AvatarImage
|
|
14
|
+
} from "../../primitives/avatar/avatar.js";
|
|
15
|
+
import { Link } from "../../primitives/link/link.js";
|
|
16
|
+
import { authors } from "../../../data/authors.js";
|
|
17
|
+
import { posts } from "../../../data/posts.js";
|
|
18
|
+
const stats = [
|
|
19
|
+
{
|
|
20
|
+
label: "Articles Published",
|
|
21
|
+
value: posts.length.toString(),
|
|
22
|
+
icon: "BookOpen"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
label: "Contributing Writers",
|
|
26
|
+
value: authors.length.toString(),
|
|
27
|
+
icon: "Users"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
label: "Categories Covered",
|
|
31
|
+
value: [...new Set(posts.flatMap((p) => p.categories))].length.toString(),
|
|
32
|
+
icon: "TrendingUp"
|
|
33
|
+
},
|
|
34
|
+
{ label: "Years Running", value: "3", icon: "Calendar" }
|
|
35
|
+
];
|
|
36
|
+
const timeline = [
|
|
37
|
+
{
|
|
38
|
+
year: "2023",
|
|
39
|
+
title: "The Beginning",
|
|
40
|
+
description: "Launched as a personal blog about slow living and intentional design."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
year: "2023",
|
|
44
|
+
title: "Growing the Team",
|
|
45
|
+
description: "New contributing writers expanded coverage into culture and design."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
year: "2024",
|
|
49
|
+
title: "Community & Resources",
|
|
50
|
+
description: "Introduced the Resources hub and Mosaic gallery. Readership doubled."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
year: "2025",
|
|
54
|
+
title: "New Horizons",
|
|
55
|
+
description: "Expanded categories, launched chat, and hit a milestone of regular readers."
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
const values = [
|
|
59
|
+
{
|
|
60
|
+
title: "Depth over speed",
|
|
61
|
+
description: "We take time to research, write, and edit. Every piece earns its place."
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
title: "Beauty in simplicity",
|
|
65
|
+
description: "Clean design, honest words, and images that breathe."
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
title: "Community first",
|
|
69
|
+
description: "We write for curious minds who value connection and craft."
|
|
70
|
+
}
|
|
71
|
+
];
|
|
72
|
+
function AboutPage() {
|
|
73
|
+
return /* @__PURE__ */ jsxs(
|
|
74
|
+
motion.div,
|
|
75
|
+
{
|
|
76
|
+
initial: { opacity: 0, y: 20 },
|
|
77
|
+
animate: { opacity: 1, y: 0 },
|
|
78
|
+
transition: { duration: 0.3 },
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsx(
|
|
81
|
+
PageHero,
|
|
82
|
+
{
|
|
83
|
+
icon: "Heart",
|
|
84
|
+
title: "About filion",
|
|
85
|
+
description: "We believe in the power of slow, intentional storytelling \u2014 depth over speed, beauty over noise, and presence over productivity."
|
|
86
|
+
}
|
|
87
|
+
),
|
|
88
|
+
/* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsx(Layout.Col1, { hideDiv: true, className: "sg:max-w-4xl", children: /* @__PURE__ */ jsx(StatsGrid, { items: stats }) }) }),
|
|
89
|
+
/* @__PURE__ */ jsx("section", { className: "sg:bg-muted/40 sg:border-y sg:border-border", children: /* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsxs(Layout.Col1, { hideDiv: true, className: "sg:max-w-3xl", children: [
|
|
90
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:mb-6", children: "Our Story" }),
|
|
91
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:space-y-4", children: [
|
|
92
|
+
/* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:leading-relaxed", children: "What began as one writer's reflections on slow mornings and handwritten letters grew into a collective of voices united by curiosity and care." }),
|
|
93
|
+
/* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:leading-relaxed", children: "Today, our team explores everything from minimalist design to global traditions, always with the same ethos: take your time, pay attention, and tell the story honestly." })
|
|
94
|
+
] })
|
|
95
|
+
] }) }) }),
|
|
96
|
+
/* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsxs(Layout.Col1, { hideDiv: true, className: "sg:max-w-4xl", children: [
|
|
97
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:mb-2", children: "The Team" }),
|
|
98
|
+
/* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:mb-8", children: "The writers behind the words." }),
|
|
99
|
+
/* @__PURE__ */ jsx("div", { className: "sg:grid sg:gap-6 sm:sg:grid-cols-3", children: authors.map((author) => /* @__PURE__ */ jsx(
|
|
100
|
+
Link,
|
|
101
|
+
{
|
|
102
|
+
to: `/extras/authors/${author.slug}`,
|
|
103
|
+
variant: "no-decoration",
|
|
104
|
+
className: "sg:group",
|
|
105
|
+
children: /* @__PURE__ */ jsx(Card, { className: "sg:h-full sg:transition-shadow sg:hover:shadow-lg sg:hover:border-primary/40", children: /* @__PURE__ */ jsxs(CardContent, { className: "sg:pt-6 sg:text-center", children: [
|
|
106
|
+
/* @__PURE__ */ jsxs(Avatar, { className: "sg:h-20 sg:w-20 sg:mx-auto sg:mb-3", children: [
|
|
107
|
+
/* @__PURE__ */ jsx(AvatarImage, { src: author.avatar, alt: author.name }),
|
|
108
|
+
/* @__PURE__ */ jsx(AvatarFallback, { children: author.name[0] })
|
|
109
|
+
] }),
|
|
110
|
+
/* @__PURE__ */ jsx(
|
|
111
|
+
Heading,
|
|
112
|
+
{
|
|
113
|
+
variant: "h5",
|
|
114
|
+
className: "sg:group-hover:text-primary sg:transition-colors",
|
|
115
|
+
children: author.name
|
|
116
|
+
}
|
|
117
|
+
),
|
|
118
|
+
/* @__PURE__ */ jsx(Text, { size: "sm", className: "sg:text-primary/80 sg:mb-2", children: author.role }),
|
|
119
|
+
/* @__PURE__ */ jsx(
|
|
120
|
+
Text,
|
|
121
|
+
{
|
|
122
|
+
size: "sm",
|
|
123
|
+
foreground: "muted-foreground",
|
|
124
|
+
className: "sg:line-clamp-3 sg:leading-relaxed",
|
|
125
|
+
children: author.bio
|
|
126
|
+
}
|
|
127
|
+
)
|
|
128
|
+
] }) })
|
|
129
|
+
},
|
|
130
|
+
author.slug
|
|
131
|
+
)) })
|
|
132
|
+
] }) }),
|
|
133
|
+
/* @__PURE__ */ jsx(Separator, { className: "sg:max-w-3xl sg:mx-auto" }),
|
|
134
|
+
/* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsx(Layout.Col1, { hideDiv: true, className: "sg:max-w-3xl", children: /* @__PURE__ */ jsx(
|
|
135
|
+
Timeline,
|
|
136
|
+
{
|
|
137
|
+
items: timeline,
|
|
138
|
+
description: "Key moments that shaped our journey."
|
|
139
|
+
}
|
|
140
|
+
) }) }),
|
|
141
|
+
/* @__PURE__ */ jsx("section", { className: "sg:bg-primary/5 sg:border-t sg:border-border", children: /* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsx(Layout.Col1, { hideDiv: true, className: "sg:max-w-3xl", children: /* @__PURE__ */ jsx(
|
|
142
|
+
ValuesGrid,
|
|
143
|
+
{
|
|
144
|
+
items: values,
|
|
145
|
+
icon: /* @__PURE__ */ jsx(
|
|
146
|
+
Icon,
|
|
147
|
+
{
|
|
148
|
+
icon: "Award",
|
|
149
|
+
className: "sg:h-8 sg:w-8 sg:text-primary sg:mx-auto sg:mb-4"
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
) }) }) })
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
AboutPage
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=about-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/pages/about/about-page.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { motion } from \"framer-motion\";\r\nimport { Layout, Heading, Text, Icon, Separator } from \"../../primitives/index\";\r\nimport { PageHero } from \"../../blocks/marketing/page-hero\";\r\nimport { StatsGrid } from \"../../blocks/marketing/stats-grid\";\r\nimport { Timeline } from \"../../blocks/marketing/timeline\";\r\nimport { ValuesGrid } from \"../../blocks/marketing/values-grid\";\r\nimport { Card, CardContent } from \"../../blocks/cards/card\";\r\nimport {\r\n\tAvatar,\r\n\tAvatarFallback,\r\n\tAvatarImage,\r\n} from \"../../primitives/avatar/avatar\";\r\nimport { Link } from \"../../primitives/link/link\";\r\nimport { authors } from \"../../../data/authors\";\r\nimport { posts } from \"../../../data/posts\";\r\n\r\nconst stats = [\r\n\t{\r\n\t\tlabel: \"Articles Published\",\r\n\t\tvalue: posts.length.toString(),\r\n\t\ticon: \"BookOpen\" as const,\r\n\t},\r\n\t{\r\n\t\tlabel: \"Contributing Writers\",\r\n\t\tvalue: authors.length.toString(),\r\n\t\ticon: \"Users\" as const,\r\n\t},\r\n\t{\r\n\t\tlabel: \"Categories Covered\",\r\n\t\tvalue: [...new Set(posts.flatMap((p) => p.categories))].length.toString(),\r\n\t\ticon: \"TrendingUp\" as const,\r\n\t},\r\n\t{ label: \"Years Running\", value: \"3\", icon: \"Calendar\" as const },\r\n];\r\n\r\nconst timeline = [\r\n\t{\r\n\t\tyear: \"2023\",\r\n\t\ttitle: \"The Beginning\",\r\n\t\tdescription:\r\n\t\t\t\"Launched as a personal blog about slow living and intentional design.\",\r\n\t},\r\n\t{\r\n\t\tyear: \"2023\",\r\n\t\ttitle: \"Growing the Team\",\r\n\t\tdescription:\r\n\t\t\t\"New contributing writers expanded coverage into culture and design.\",\r\n\t},\r\n\t{\r\n\t\tyear: \"2024\",\r\n\t\ttitle: \"Community & Resources\",\r\n\t\tdescription:\r\n\t\t\t\"Introduced the Resources hub and Mosaic gallery. Readership doubled.\",\r\n\t},\r\n\t{\r\n\t\tyear: \"2025\",\r\n\t\ttitle: \"New Horizons\",\r\n\t\tdescription:\r\n\t\t\t\"Expanded categories, launched chat, and hit a milestone of regular readers.\",\r\n\t},\r\n];\r\n\r\nconst values = [\r\n\t{\r\n\t\ttitle: \"Depth over speed\",\r\n\t\tdescription:\r\n\t\t\t\"We take time to research, write, and edit. Every piece earns its place.\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Beauty in simplicity\",\r\n\t\tdescription: \"Clean design, honest words, and images that breathe.\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Community first\",\r\n\t\tdescription:\r\n\t\t\t\"We write for curious minds who value connection and craft.\",\r\n\t},\r\n];\r\n\r\nexport function AboutPage() {\r\n\treturn (\r\n\t\t<motion.div\r\n\t\t\tinitial={{ opacity: 0, y: 20 }}\r\n\t\t\tanimate={{ opacity: 1, y: 0 }}\r\n\t\t\ttransition={{ duration: 0.3 }}\r\n\t\t>\r\n\t\t\t<PageHero\r\n\t\t\t\ticon=\"Heart\"\r\n\t\t\t\ttitle=\"About filion\"\r\n\t\t\t\tdescription=\"We believe in the power of slow, intentional storytelling — depth over speed, beauty over noise, and presence over productivity.\"\r\n\t\t\t/>\r\n\r\n\t\t\t<Layout type=\"col\" className=\"sg:py-16\">\r\n\t\t\t\t<Layout.Col1 hideDiv className=\"sg:max-w-4xl\">\r\n\t\t\t\t\t<StatsGrid items={stats} />\r\n\t\t\t\t</Layout.Col1>\r\n\t\t\t</Layout>\r\n\r\n\t\t\t<section className=\"sg:bg-muted/40 sg:border-y sg:border-border\">\r\n\t\t\t\t<Layout type=\"col\" className=\"sg:py-16\">\r\n\t\t\t\t\t<Layout.Col1 hideDiv className=\"sg:max-w-3xl\">\r\n\t\t\t\t\t\t<Heading variant=\"h2\" className=\"sg:mb-6\">\r\n\t\t\t\t\t\t\tOur Story\r\n\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t<div className=\"sg:space-y-4\">\r\n\t\t\t\t\t\t\t<Text foreground=\"muted-foreground\" className=\"sg:leading-relaxed\">\r\n\t\t\t\t\t\t\t\tWhat began as one writer's reflections on slow mornings and\r\n\t\t\t\t\t\t\t\thandwritten letters grew into a collective of voices united by\r\n\t\t\t\t\t\t\t\tcuriosity and care.\r\n\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t<Text foreground=\"muted-foreground\" className=\"sg:leading-relaxed\">\r\n\t\t\t\t\t\t\t\tToday, our team explores everything from minimalist design to\r\n\t\t\t\t\t\t\t\tglobal traditions, always with the same ethos: take your time,\r\n\t\t\t\t\t\t\t\tpay attention, and tell the story honestly.\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</Layout.Col1>\r\n\t\t\t\t</Layout>\r\n\t\t\t</section>\r\n\r\n\t\t\t<Layout type=\"col\" className=\"sg:py-16\">\r\n\t\t\t\t<Layout.Col1 hideDiv className=\"sg:max-w-4xl\">\r\n\t\t\t\t\t<Heading variant=\"h2\" className=\"sg:mb-2\">\r\n\t\t\t\t\t\tThe Team\r\n\t\t\t\t\t</Heading>\r\n\t\t\t\t\t<Text foreground=\"muted-foreground\" className=\"sg:mb-8\">\r\n\t\t\t\t\t\tThe writers behind the words.\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t\t<div className=\"sg:grid sg:gap-6 sm:sg:grid-cols-3\">\r\n\t\t\t\t\t\t{authors.map((author) => (\r\n\t\t\t\t\t\t\t<Link\r\n\t\t\t\t\t\t\t\tkey={author.slug}\r\n\t\t\t\t\t\t\t\tto={`/extras/authors/${author.slug}`}\r\n\t\t\t\t\t\t\t\tvariant=\"no-decoration\"\r\n\t\t\t\t\t\t\t\tclassName=\"sg:group\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<Card className=\"sg:h-full sg:transition-shadow sg:hover:shadow-lg sg:hover:border-primary/40\">\r\n\t\t\t\t\t\t\t\t\t<CardContent className=\"sg:pt-6 sg:text-center\">\r\n\t\t\t\t\t\t\t\t\t\t<Avatar className=\"sg:h-20 sg:w-20 sg:mx-auto sg:mb-3\">\r\n\t\t\t\t\t\t\t\t\t\t\t<AvatarImage src={author.avatar} alt={author.name} />\r\n\t\t\t\t\t\t\t\t\t\t\t<AvatarFallback>{author.name[0]}</AvatarFallback>\r\n\t\t\t\t\t\t\t\t\t\t</Avatar>\r\n\t\t\t\t\t\t\t\t\t\t<Heading\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"h5\"\r\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"sg:group-hover:text-primary sg:transition-colors\"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{author.name}\r\n\t\t\t\t\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t\t\t\t\t<Text size=\"sm\" className=\"sg:text-primary/80 sg:mb-2\">\r\n\t\t\t\t\t\t\t\t\t\t\t{author.role}\r\n\t\t\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t\t\t\t<Text\r\n\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\r\n\t\t\t\t\t\t\t\t\t\t\tforeground=\"muted-foreground\"\r\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"sg:line-clamp-3 sg:leading-relaxed\"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{author.bio}\r\n\t\t\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t\t\t</CardContent>\r\n\t\t\t\t\t\t\t\t</Card>\r\n\t\t\t\t\t\t\t</Link>\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</Layout.Col1>\r\n\t\t\t</Layout>\r\n\r\n\t\t\t<Separator className=\"sg:max-w-3xl sg:mx-auto\" />\r\n\r\n\t\t\t<Layout type=\"col\" className=\"sg:py-16\">\r\n\t\t\t\t<Layout.Col1 hideDiv className=\"sg:max-w-3xl\">\r\n\t\t\t\t\t<Timeline\r\n\t\t\t\t\t\titems={timeline}\r\n\t\t\t\t\t\tdescription=\"Key moments that shaped our journey.\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</Layout.Col1>\r\n\t\t\t</Layout>\r\n\r\n\t\t\t<section className=\"sg:bg-primary/5 sg:border-t sg:border-border\">\r\n\t\t\t\t<Layout type=\"col\" className=\"sg:py-16\">\r\n\t\t\t\t\t<Layout.Col1 hideDiv className=\"sg:max-w-3xl\">\r\n\t\t\t\t\t\t<ValuesGrid\r\n\t\t\t\t\t\t\titems={values}\r\n\t\t\t\t\t\t\ticon={\r\n\t\t\t\t\t\t\t\t<Icon\r\n\t\t\t\t\t\t\t\t\ticon=\"Award\"\r\n\t\t\t\t\t\t\t\t\tclassName=\"sg:h-8 sg:w-8 sg:text-primary sg:mx-auto sg:mb-4\"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</Layout.Col1>\r\n\t\t\t\t</Layout>\r\n\t\t\t</section>\r\n\t\t</motion.div>\r\n\t);\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -23,6 +23,7 @@ function AdminPage({ initialEditId }) {
|
|
|
23
23
|
const { toast } = useToast();
|
|
24
24
|
const emptyPost = {
|
|
25
25
|
id: 0,
|
|
26
|
+
slug: "",
|
|
26
27
|
title: "",
|
|
27
28
|
excerpt: "",
|
|
28
29
|
content: "",
|
|
@@ -39,6 +40,7 @@ function AdminPage({ initialEditId }) {
|
|
|
39
40
|
if (post) {
|
|
40
41
|
setForm({
|
|
41
42
|
id: post.id,
|
|
43
|
+
slug: post.slug,
|
|
42
44
|
title: post.title,
|
|
43
45
|
excerpt: post.excerpt,
|
|
44
46
|
content: post.content,
|
|
@@ -66,7 +68,8 @@ function AdminPage({ initialEditId }) {
|
|
|
66
68
|
setEditing(null);
|
|
67
69
|
} else {
|
|
68
70
|
const nextId = Math.max(...postsList.map((p) => p.id), 0) + 1;
|
|
69
|
-
|
|
71
|
+
const slug = form.slug || form.title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || `post-${nextId}`;
|
|
72
|
+
setPostsList((prev) => [{ ...form, id: nextId, slug }, ...prev]);
|
|
70
73
|
toast.success("Post created", {
|
|
71
74
|
description: `"${form.title}" has been published.`
|
|
72
75
|
});
|