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,131 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { motion } from "framer-motion";
|
|
4
|
+
import {
|
|
5
|
+
Layout,
|
|
6
|
+
Heading,
|
|
7
|
+
Text,
|
|
8
|
+
TextSpan,
|
|
9
|
+
Button,
|
|
10
|
+
Icon,
|
|
11
|
+
Badge,
|
|
12
|
+
Separator,
|
|
13
|
+
Accordion,
|
|
14
|
+
AccordionContent,
|
|
15
|
+
AccordionItem,
|
|
16
|
+
AccordionTrigger
|
|
17
|
+
} from "../../primitives/index.js";
|
|
18
|
+
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "../../blocks/cards/card.js";
|
|
19
|
+
const plans = [
|
|
20
|
+
{
|
|
21
|
+
name: "Free",
|
|
22
|
+
price: "$0",
|
|
23
|
+
period: "forever",
|
|
24
|
+
description: "Everything you need to enjoy the blog.",
|
|
25
|
+
icon: "BookOpen",
|
|
26
|
+
featured: false,
|
|
27
|
+
features: [
|
|
28
|
+
"Access to all published articles",
|
|
29
|
+
"Weekly newsletter",
|
|
30
|
+
"Comment on posts",
|
|
31
|
+
"Dark mode"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "Premium",
|
|
36
|
+
price: "$8",
|
|
37
|
+
period: "/month",
|
|
38
|
+
description: "For readers who want the full experience.",
|
|
39
|
+
icon: "Crown",
|
|
40
|
+
featured: true,
|
|
41
|
+
features: [
|
|
42
|
+
"Everything in Free",
|
|
43
|
+
"Early access to new posts",
|
|
44
|
+
"Exclusive essays & interviews",
|
|
45
|
+
"Ad-free reading experience"
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "Patron",
|
|
50
|
+
price: "$20",
|
|
51
|
+
period: "/month",
|
|
52
|
+
description: "Support independent storytelling at its best.",
|
|
53
|
+
icon: "Gem",
|
|
54
|
+
featured: false,
|
|
55
|
+
features: [
|
|
56
|
+
"Everything in Premium",
|
|
57
|
+
"Members-only community",
|
|
58
|
+
"Direct author Q&A sessions",
|
|
59
|
+
"Patron badge on comments"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
];
|
|
63
|
+
const faqs = [
|
|
64
|
+
{
|
|
65
|
+
q: "When will Premium launch?",
|
|
66
|
+
a: "We're building membership features now. Join our newsletter to be the first to know."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
q: "Can I cancel anytime?",
|
|
70
|
+
a: "Absolutely. No contracts, no commitments. Cancel with one click whenever you want."
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
q: "Will free content go behind a paywall?",
|
|
74
|
+
a: "Never. All currently free content stays free. Premium adds new content on top."
|
|
75
|
+
}
|
|
76
|
+
];
|
|
77
|
+
function MembershipPage() {
|
|
78
|
+
return /* @__PURE__ */ jsxs(
|
|
79
|
+
motion.div,
|
|
80
|
+
{
|
|
81
|
+
initial: { opacity: 1, y: 20 },
|
|
82
|
+
animate: { opacity: 1, y: 0 },
|
|
83
|
+
transition: { duration: 0.3 },
|
|
84
|
+
children: [
|
|
85
|
+
/* @__PURE__ */ jsx("section", { className: "sg:bg-primary/5 sg:border-b sg:border-border", children: /* @__PURE__ */ jsxs("div", { className: "sg:container sg:py-20 sg:max-w-3xl sg:mx-auto sg:text-center", children: [
|
|
86
|
+
/* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "sg:mb-4 sg:uppercase sg:tracking-wider", children: "Coming Soon" }),
|
|
87
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h1", className: "sg:mb-4", children: "Membership" }),
|
|
88
|
+
/* @__PURE__ */ jsx(Text, { size: "lg", foreground: "muted-foreground", className: "sg:max-w-xl sg:mx-auto", children: "Support independent storytelling and unlock a richer reading experience." })
|
|
89
|
+
] }) }),
|
|
90
|
+
/* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsx(Layout.Col1, { hideDiv: true, className: "sg:max-w-5xl", children: /* @__PURE__ */ jsx("div", { className: "sg:grid sg:gap-6 lg:sg:grid-cols-3", children: plans.map((plan) => /* @__PURE__ */ jsxs(
|
|
91
|
+
Card,
|
|
92
|
+
{
|
|
93
|
+
className: plan.featured ? "sg:border-primary sg:shadow-lg sg:ring-1 sg:ring-primary/20 sg:relative" : "",
|
|
94
|
+
children: [
|
|
95
|
+
plan.featured && /* @__PURE__ */ jsx("div", { className: "sg:absolute sg:-top-3 sg:left-1/2 sg:-translate-x-1/2", children: /* @__PURE__ */ jsx(Badge, { children: "Most Popular" }) }),
|
|
96
|
+
/* @__PURE__ */ jsxs(CardHeader, { className: "sg:text-center sg:pb-2", children: [
|
|
97
|
+
/* @__PURE__ */ jsx("div", { className: "sg:rounded-full sg:bg-primary/10 sg:p-3 sg:inline-flex sg:mx-auto sg:mb-2", children: /* @__PURE__ */ jsx(Icon, { icon: plan.icon, className: "sg:h-6 sg:w-6 sg:text-primary" }) }),
|
|
98
|
+
/* @__PURE__ */ jsx(CardTitle, { children: plan.name }),
|
|
99
|
+
/* @__PURE__ */ jsx(CardDescription, { children: plan.description })
|
|
100
|
+
] }),
|
|
101
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "sg:flex sg:flex-col sg:flex-1", children: [
|
|
102
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:text-center sg:mb-6", children: [
|
|
103
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:inline", children: plan.price }),
|
|
104
|
+
/* @__PURE__ */ jsx(TextSpan, { size: "sm", foreground: "muted-foreground", className: "sg:ml-1", children: plan.period })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsx("ul", { className: "sg:space-y-3 sg:mb-8 sg:flex-1", children: plan.features.map((feature) => /* @__PURE__ */ jsxs("li", { className: "sg:flex sg:items-start sg:gap-2.5", children: [
|
|
107
|
+
/* @__PURE__ */ jsx(Icon, { icon: "Check", className: "sg:h-4 sg:w-4 sg:text-primary sg:mt-0.5 sg:shrink-0" }),
|
|
108
|
+
/* @__PURE__ */ jsx(Text, { size: "sm", children: feature })
|
|
109
|
+
] }, feature)) }),
|
|
110
|
+
/* @__PURE__ */ jsx(Button, { variant: plan.featured ? "default" : "outline", disabled: true, children: "Coming Soon" })
|
|
111
|
+
] })
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
plan.name
|
|
115
|
+
)) }) }) }),
|
|
116
|
+
/* @__PURE__ */ jsx(Separator, { className: "sg:max-w-3xl sg:mx-auto" }),
|
|
117
|
+
/* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsxs(Layout.Col1, { hideDiv: true, className: "sg:max-w-2xl", children: [
|
|
118
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:mb-6 sg:text-center", children: "FAQ" }),
|
|
119
|
+
/* @__PURE__ */ jsx(Accordion, { multiple: false, "aria-label": "Membership FAQ", children: faqs.map((faq, i) => /* @__PURE__ */ jsxs(AccordionItem, { value: `faq-${i}`, children: [
|
|
120
|
+
/* @__PURE__ */ jsx(AccordionTrigger, { children: faq.q }),
|
|
121
|
+
/* @__PURE__ */ jsx(AccordionContent, { children: faq.a })
|
|
122
|
+
] }, faq.q)) })
|
|
123
|
+
] }) })
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
export {
|
|
129
|
+
MembershipPage
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=membership-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/pages/membership/membership-page.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { motion } from \"framer-motion\";\r\nimport {\r\n\tLayout,\r\n\tHeading,\r\n\tText,\r\n\tTextSpan,\r\n\tButton,\r\n\tIcon,\r\n\tBadge,\r\n\tSeparator,\r\n\tAccordion,\r\n\tAccordionContent,\r\n\tAccordionItem,\r\n\tAccordionTrigger,\r\n} from \"../../primitives/index\";\r\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from \"../../blocks/cards/card\";\r\n\r\nconst plans = [\r\n\t{\r\n\t\tname: \"Free\",\r\n\t\tprice: \"$0\",\r\n\t\tperiod: \"forever\",\r\n\t\tdescription: \"Everything you need to enjoy the blog.\",\r\n\t\ticon: \"BookOpen\" as const,\r\n\t\tfeatured: false,\r\n\t\tfeatures: [\r\n\t\t\t\"Access to all published articles\",\r\n\t\t\t\"Weekly newsletter\",\r\n\t\t\t\"Comment on posts\",\r\n\t\t\t\"Dark mode\",\r\n\t\t],\r\n\t},\r\n\t{\r\n\t\tname: \"Premium\",\r\n\t\tprice: \"$8\",\r\n\t\tperiod: \"/month\",\r\n\t\tdescription: \"For readers who want the full experience.\",\r\n\t\ticon: \"Crown\" as const,\r\n\t\tfeatured: true,\r\n\t\tfeatures: [\r\n\t\t\t\"Everything in Free\",\r\n\t\t\t\"Early access to new posts\",\r\n\t\t\t\"Exclusive essays & interviews\",\r\n\t\t\t\"Ad-free reading experience\",\r\n\t\t],\r\n\t},\r\n\t{\r\n\t\tname: \"Patron\",\r\n\t\tprice: \"$20\",\r\n\t\tperiod: \"/month\",\r\n\t\tdescription: \"Support independent storytelling at its best.\",\r\n\t\ticon: \"Gem\" as const,\r\n\t\tfeatured: false,\r\n\t\tfeatures: [\r\n\t\t\t\"Everything in Premium\",\r\n\t\t\t\"Members-only community\",\r\n\t\t\t\"Direct author Q&A sessions\",\r\n\t\t\t\"Patron badge on comments\",\r\n\t\t],\r\n\t},\r\n];\r\n\r\nconst faqs = [\r\n\t{\r\n\t\tq: \"When will Premium launch?\",\r\n\t\ta: \"We're building membership features now. Join our newsletter to be the first to know.\",\r\n\t},\r\n\t{\r\n\t\tq: \"Can I cancel anytime?\",\r\n\t\ta: \"Absolutely. No contracts, no commitments. Cancel with one click whenever you want.\",\r\n\t},\r\n\t{\r\n\t\tq: \"Will free content go behind a paywall?\",\r\n\t\ta: \"Never. All currently free content stays free. Premium adds new content on top.\",\r\n\t},\r\n];\r\n\r\nexport function MembershipPage() {\r\n\treturn (\r\n\t\t<motion.div\r\n\t\t\tinitial={{ opacity: 1, 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<section className=\"sg:bg-primary/5 sg:border-b sg:border-border\">\r\n\t\t\t\t<div className=\"sg:container sg:py-20 sg:max-w-3xl sg:mx-auto sg:text-center\">\r\n\t\t\t\t\t<Badge variant=\"secondary\" className=\"sg:mb-4 sg:uppercase sg:tracking-wider\">\r\n\t\t\t\t\t\tComing Soon\r\n\t\t\t\t\t</Badge>\r\n\t\t\t\t\t<Heading variant=\"h1\" className=\"sg:mb-4\">\r\n\t\t\t\t\t\tMembership\r\n\t\t\t\t\t</Heading>\r\n\t\t\t\t\t<Text size=\"lg\" foreground=\"muted-foreground\" className=\"sg:max-w-xl sg:mx-auto\">\r\n\t\t\t\t\t\tSupport independent storytelling and unlock a richer reading experience.\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t</div>\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-5xl\">\r\n\t\t\t\t\t<div className=\"sg:grid sg:gap-6 lg:sg:grid-cols-3\">\r\n\t\t\t\t\t\t{plans.map((plan) => (\r\n\t\t\t\t\t\t\t<Card\r\n\t\t\t\t\t\t\t\tkey={plan.name}\r\n\t\t\t\t\t\t\t\tclassName={\r\n\t\t\t\t\t\t\t\t\tplan.featured\r\n\t\t\t\t\t\t\t\t\t\t? \"sg:border-primary sg:shadow-lg sg:ring-1 sg:ring-primary/20 sg:relative\"\r\n\t\t\t\t\t\t\t\t\t\t: \"\"\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\t\t{plan.featured && (\r\n\t\t\t\t\t\t\t\t\t<div className=\"sg:absolute sg:-top-3 sg:left-1/2 sg:-translate-x-1/2\">\r\n\t\t\t\t\t\t\t\t\t\t<Badge>Most Popular</Badge>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t<CardHeader className=\"sg:text-center sg:pb-2\">\r\n\t\t\t\t\t\t\t\t\t<div className=\"sg:rounded-full sg:bg-primary/10 sg:p-3 sg:inline-flex sg:mx-auto sg:mb-2\">\r\n\t\t\t\t\t\t\t\t\t\t<Icon icon={plan.icon} className=\"sg:h-6 sg:w-6 sg:text-primary\" />\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<CardTitle>{plan.name}</CardTitle>\r\n\t\t\t\t\t\t\t\t\t<CardDescription>{plan.description}</CardDescription>\r\n\t\t\t\t\t\t\t\t</CardHeader>\r\n\t\t\t\t\t\t\t\t<CardContent className=\"sg:flex sg:flex-col sg:flex-1\">\r\n\t\t\t\t\t\t\t\t\t<div className=\"sg:text-center sg:mb-6\">\r\n\t\t\t\t\t\t\t\t\t\t<Heading variant=\"h2\" className=\"sg:inline\">\r\n\t\t\t\t\t\t\t\t\t\t\t{plan.price}\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<TextSpan size=\"sm\" foreground=\"muted-foreground\" className=\"sg:ml-1\">\r\n\t\t\t\t\t\t\t\t\t\t\t{plan.period}\r\n\t\t\t\t\t\t\t\t\t\t</TextSpan>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<ul className=\"sg:space-y-3 sg:mb-8 sg:flex-1\">\r\n\t\t\t\t\t\t\t\t\t\t{plan.features.map((feature) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<li key={feature} className=\"sg:flex sg:items-start sg:gap-2.5\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon icon=\"Check\" className=\"sg:h-4 sg:w-4 sg:text-primary sg:mt-0.5 sg:shrink-0\" />\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Text size=\"sm\">{feature}</Text>\r\n\t\t\t\t\t\t\t\t\t\t\t</li>\r\n\t\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t\t\t\t<Button variant={plan.featured ? \"default\" : \"outline\"} disabled>\r\n\t\t\t\t\t\t\t\t\t\tComing Soon\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</CardContent>\r\n\t\t\t\t\t\t\t</Card>\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-2xl\">\r\n\t\t\t\t\t<Heading variant=\"h2\" className=\"sg:mb-6 sg:text-center\">\r\n\t\t\t\t\t\tFAQ\r\n\t\t\t\t\t</Heading>\r\n\t\t\t\t\t<Accordion multiple={false} aria-label=\"Membership FAQ\">\r\n\t\t\t\t\t\t{faqs.map((faq, i) => (\r\n\t\t\t\t\t\t\t<AccordionItem key={faq.q} value={`faq-${i}`}>\r\n\t\t\t\t\t\t\t\t<AccordionTrigger>{faq.q}</AccordionTrigger>\r\n\t\t\t\t\t\t\t\t<AccordionContent>{faq.a}</AccordionContent>\r\n\t\t\t\t\t\t\t</AccordionItem>\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t</Accordion>\r\n\t\t\t\t</Layout.Col1>\r\n\t\t\t</Layout>\r\n\t\t</motion.div>\r\n\t);\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
|
+
import { motion } from "framer-motion";
|
|
5
|
+
import { Layout, Heading, Text, UiImage, Link } from "../../primitives/index.js";
|
|
6
|
+
import { posts } from "../../../data/posts.js";
|
|
7
|
+
import {
|
|
8
|
+
Sheet,
|
|
9
|
+
SheetContent,
|
|
10
|
+
SheetTitle
|
|
11
|
+
} from "../../primitives/sheet/sheet.js";
|
|
12
|
+
function MosaicPage() {
|
|
13
|
+
const [lightbox, setLightbox] = useState(null);
|
|
14
|
+
const items = useMemo(() => {
|
|
15
|
+
return posts.flatMap((post) => {
|
|
16
|
+
const images = post.gallery?.length ? post.gallery : [{ src: post.primaryImage, alt: post.title }];
|
|
17
|
+
return images.map((img) => ({
|
|
18
|
+
src: img.src,
|
|
19
|
+
alt: img.alt || post.title,
|
|
20
|
+
postSlug: post.slug,
|
|
21
|
+
postTitle: post.title
|
|
22
|
+
}));
|
|
23
|
+
});
|
|
24
|
+
}, []);
|
|
25
|
+
return /* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsxs(Layout.Col1, { hideDiv: true, children: [
|
|
26
|
+
/* @__PURE__ */ jsxs(
|
|
27
|
+
motion.div,
|
|
28
|
+
{
|
|
29
|
+
initial: { opacity: 1, y: 20 },
|
|
30
|
+
animate: { opacity: 1, y: 0 },
|
|
31
|
+
transition: { duration: 0.3 },
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h1", className: "sg:mb-2", children: "Mosaic" }),
|
|
34
|
+
/* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:mb-10", children: "A visual mosaic of images from our blog posts." }),
|
|
35
|
+
/* @__PURE__ */ jsx("div", { className: "sg:columns-2 md:sg:columns-3 lg:sg:columns-4 sg:gap-3 sg:space-y-3", children: items.map((item, i) => /* @__PURE__ */ jsx(
|
|
36
|
+
"button",
|
|
37
|
+
{
|
|
38
|
+
type: "button",
|
|
39
|
+
className: "sg:block sg:w-full sg:mb-3 sg:break-inside-avoid sg:rounded-lg sg:overflow-hidden sg:border-0 sg:p-0 sg:bg-transparent sg:cursor-pointer sg:group",
|
|
40
|
+
onClick: () => setLightbox(item),
|
|
41
|
+
children: /* @__PURE__ */ jsx(
|
|
42
|
+
UiImage,
|
|
43
|
+
{
|
|
44
|
+
src: item.src,
|
|
45
|
+
alt: item.alt,
|
|
46
|
+
className: "sg:w-full sg:object-cover sg:transition-transform sg:duration-300 sg:group-hover:scale-105",
|
|
47
|
+
loading: "lazy"
|
|
48
|
+
}
|
|
49
|
+
)
|
|
50
|
+
},
|
|
51
|
+
`${item.postSlug}-${i}`
|
|
52
|
+
)) })
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
),
|
|
56
|
+
/* @__PURE__ */ jsx(Sheet, { open: !!lightbox, onOpenChange: (open) => !open && setLightbox(null), children: /* @__PURE__ */ jsxs(SheetContent, { side: "bottom", className: "sg:max-h-[90vh] sg:p-4", children: [
|
|
57
|
+
/* @__PURE__ */ jsx(SheetTitle, { className: "sg:sr-only", children: "Image preview" }),
|
|
58
|
+
lightbox && /* @__PURE__ */ jsxs("div", { className: "sg:space-y-4 sg:mx-auto sg:max-w-4xl", children: [
|
|
59
|
+
/* @__PURE__ */ jsx(
|
|
60
|
+
UiImage,
|
|
61
|
+
{
|
|
62
|
+
src: lightbox.src,
|
|
63
|
+
alt: lightbox.alt,
|
|
64
|
+
className: "sg:w-full sg:max-h-[70vh] sg:object-contain sg:rounded-md"
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex sg:items-center sg:justify-between sg:gap-4", children: [
|
|
68
|
+
/* @__PURE__ */ jsxs(Text, { size: "sm", foreground: "muted-foreground", children: [
|
|
69
|
+
"From: ",
|
|
70
|
+
lightbox.postTitle
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ jsx(Link, { to: `/posts/${lightbox.postSlug}`, children: "View post" })
|
|
73
|
+
] })
|
|
74
|
+
] })
|
|
75
|
+
] }) })
|
|
76
|
+
] }) });
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
MosaicPage
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=mosaic-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/pages/mosaic/mosaic-page.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useMemo, useState } from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport { Layout, Heading, Text, UiImage, Link } from \"../../primitives/index\";\r\nimport { posts } from \"../../../data/posts\";\r\nimport {\r\n\tSheet,\r\n\tSheetContent,\r\n\tSheetTitle,\r\n} from \"../../primitives/sheet/sheet\";\r\n\r\ntype MosaicItem = {\r\n\tsrc: string;\r\n\talt: string;\r\n\tpostSlug: string;\r\n\tpostTitle: string;\r\n};\r\n\r\nexport function MosaicPage() {\r\n\tconst [lightbox, setLightbox] = useState<MosaicItem | null>(null);\r\n\r\n\tconst items = useMemo<MosaicItem[]>(() => {\r\n\t\treturn posts.flatMap((post) => {\r\n\t\t\tconst images = post.gallery?.length\r\n\t\t\t\t? post.gallery\r\n\t\t\t\t: [{ src: post.primaryImage, alt: post.title }];\r\n\t\t\treturn images.map((img) => ({\r\n\t\t\t\tsrc: img.src,\r\n\t\t\t\talt: img.alt || post.title,\r\n\t\t\t\tpostSlug: post.slug,\r\n\t\t\t\tpostTitle: post.title,\r\n\t\t\t}));\r\n\t\t});\r\n\t}, []);\r\n\r\n\treturn (\r\n\t\t<Layout type=\"col\" className=\"sg:py-16\">\r\n\t\t\t<Layout.Col1 hideDiv>\r\n\t\t\t\t<motion.div\r\n\t\t\t\t\tinitial={{ opacity: 1, y: 20 }}\r\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\r\n\t\t\t\t\ttransition={{ duration: 0.3 }}\r\n\t\t\t\t>\r\n\t\t\t\t\t<Heading variant=\"h1\" className=\"sg:mb-2\">\r\n\t\t\t\t\t\tMosaic\r\n\t\t\t\t\t</Heading>\r\n\t\t\t\t\t<Text foreground=\"muted-foreground\" className=\"sg:mb-10\">\r\n\t\t\t\t\t\tA visual mosaic of images from our blog posts.\r\n\t\t\t\t\t</Text>\r\n\r\n\t\t\t\t\t<div className=\"sg:columns-2 md:sg:columns-3 lg:sg:columns-4 sg:gap-3 sg:space-y-3\">\r\n\t\t\t\t\t\t{items.map((item, i) => (\r\n\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\tkey={`${item.postSlug}-${i}`}\r\n\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\tclassName=\"sg:block sg:w-full sg:mb-3 sg:break-inside-avoid sg:rounded-lg sg:overflow-hidden sg:border-0 sg:p-0 sg:bg-transparent sg:cursor-pointer sg:group\"\r\n\t\t\t\t\t\t\t\tonClick={() => setLightbox(item)}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<UiImage\r\n\t\t\t\t\t\t\t\t\tsrc={item.src}\r\n\t\t\t\t\t\t\t\t\talt={item.alt}\r\n\t\t\t\t\t\t\t\t\tclassName=\"sg:w-full sg:object-cover sg:transition-transform sg:duration-300 sg:group-hover:scale-105\"\r\n\t\t\t\t\t\t\t\t\tloading=\"lazy\"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</motion.div>\r\n\r\n\t\t\t\t<Sheet open={!!lightbox} onOpenChange={(open) => !open && setLightbox(null)}>\r\n\t\t\t\t\t<SheetContent side=\"bottom\" className=\"sg:max-h-[90vh] sg:p-4\">\r\n\t\t\t\t\t\t<SheetTitle className=\"sg:sr-only\">Image preview</SheetTitle>\r\n\t\t\t\t\t\t{lightbox && (\r\n\t\t\t\t\t\t\t<div className=\"sg:space-y-4 sg:mx-auto sg:max-w-4xl\">\r\n\t\t\t\t\t\t\t\t<UiImage\r\n\t\t\t\t\t\t\t\t\tsrc={lightbox.src}\r\n\t\t\t\t\t\t\t\t\talt={lightbox.alt}\r\n\t\t\t\t\t\t\t\t\tclassName=\"sg:w-full sg:max-h-[70vh] sg:object-contain sg:rounded-md\"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<div className=\"sg:flex sg:items-center sg:justify-between sg:gap-4\">\r\n\t\t\t\t\t\t\t\t\t<Text size=\"sm\" foreground=\"muted-foreground\">\r\n\t\t\t\t\t\t\t\t\t\tFrom: {lightbox.postTitle}\r\n\t\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t\t\t<Link to={`/posts/${lightbox.postSlug}`}>View post</Link>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</SheetContent>\r\n\t\t\t\t</Sheet>\r\n\t\t\t</Layout.Col1>\r\n\t\t</Layout>\r\n\t);\r\n}\r\n"],"mappings":";AAuCI,SAKC,KALD;AArCJ,SAAS,SAAS,gBAAgB;AAClC,SAAS,cAAc;AACvB,SAAS,QAAQ,SAAS,MAAM,SAAS,YAAY;AACrD,SAAS,aAAa;AACtB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AASA,SAAS,aAAa;AAC5B,QAAM,CAAC,UAAU,WAAW,IAAI,SAA4B,IAAI;AAEhE,QAAM,QAAQ,QAAsB,MAAM;AACzC,WAAO,MAAM,QAAQ,CAAC,SAAS;AAC9B,YAAM,SAAS,KAAK,SAAS,SAC1B,KAAK,UACL,CAAC,EAAE,KAAK,KAAK,cAAc,KAAK,KAAK,MAAM,CAAC;AAC/C,aAAO,OAAO,IAAI,CAAC,SAAS;AAAA,QAC3B,KAAK,IAAI;AAAA,QACT,KAAK,IAAI,OAAO,KAAK;AAAA,QACrB,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,MACjB,EAAE;AAAA,IACH,CAAC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACC,oBAAC,UAAO,MAAK,OAAM,WAAU,YAC5B,+BAAC,OAAO,MAAP,EAAY,SAAO,MACnB;AAAA;AAAA,MAAC,OAAO;AAAA,MAAP;AAAA,QACA,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,QAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,QAC5B,YAAY,EAAE,UAAU,IAAI;AAAA,QAE5B;AAAA,8BAAC,WAAQ,SAAQ,MAAK,WAAU,WAAU,oBAE1C;AAAA,UACA,oBAAC,QAAK,YAAW,oBAAmB,WAAU,YAAW,4DAEzD;AAAA,UAEA,oBAAC,SAAI,WAAU,sEACb,gBAAM,IAAI,CAAC,MAAM,MACjB;AAAA,YAAC;AAAA;AAAA,cAEA,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM,YAAY,IAAI;AAAA,cAE/B;AAAA,gBAAC;AAAA;AAAA,kBACA,KAAK,KAAK;AAAA,kBACV,KAAK,KAAK;AAAA,kBACV,WAAU;AAAA,kBACV,SAAQ;AAAA;AAAA,cACT;AAAA;AAAA,YAVK,GAAG,KAAK,QAAQ,IAAI,CAAC;AAAA,UAW3B,CACA,GACF;AAAA;AAAA;AAAA,IACD;AAAA,IAEA,oBAAC,SAAM,MAAM,CAAC,CAAC,UAAU,cAAc,CAAC,SAAS,CAAC,QAAQ,YAAY,IAAI,GACzE,+BAAC,gBAAa,MAAK,UAAS,WAAU,0BACrC;AAAA,0BAAC,cAAW,WAAU,cAAa,2BAAa;AAAA,MAC/C,YACA,qBAAC,SAAI,WAAU,wCACd;AAAA;AAAA,UAAC;AAAA;AAAA,YACA,KAAK,SAAS;AAAA,YACd,KAAK,SAAS;AAAA,YACd,WAAU;AAAA;AAAA,QACX;AAAA,QACA,qBAAC,SAAI,WAAU,uDACd;AAAA,+BAAC,QAAK,MAAK,MAAK,YAAW,oBAAmB;AAAA;AAAA,YACtC,SAAS;AAAA,aACjB;AAAA,UACA,oBAAC,QAAK,IAAI,UAAU,SAAS,QAAQ,IAAI,uBAAS;AAAA,WACnD;AAAA,SACD;AAAA,OAEF,GACD;AAAA,KACD,GACD;AAEF;","names":[]}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useForm } from "@tanstack/react-form";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { motion } from "framer-motion";
|
|
6
|
+
import { TanStackInputField } from "../../../lib/forms/tanstack-field.js";
|
|
7
|
+
import {
|
|
8
|
+
Layout,
|
|
9
|
+
Heading,
|
|
10
|
+
Text,
|
|
11
|
+
Button,
|
|
12
|
+
Icon,
|
|
13
|
+
Separator
|
|
14
|
+
} from "../../primitives/index.js";
|
|
15
|
+
import { FieldGroup } from "../../primitives/forms/field.js";
|
|
16
|
+
import {
|
|
17
|
+
Form,
|
|
18
|
+
FormActions
|
|
19
|
+
} from "../../primitives/forms/form.js";
|
|
20
|
+
import { Card, CardContent } from "../../blocks/cards/card.js";
|
|
21
|
+
import {
|
|
22
|
+
Avatar,
|
|
23
|
+
AvatarFallback,
|
|
24
|
+
AvatarImage
|
|
25
|
+
} from "../../primitives/avatar/avatar.js";
|
|
26
|
+
import { useToast } from "../../primitives/sonner/use-toast.js";
|
|
27
|
+
import { authors } from "../../../data/authors.js";
|
|
28
|
+
const benefits = [
|
|
29
|
+
{
|
|
30
|
+
icon: "BookOpen",
|
|
31
|
+
title: "Curated Stories",
|
|
32
|
+
description: "Handpicked articles on slow living, design, and culture \u2014 delivered weekly."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
icon: "Sparkles",
|
|
36
|
+
title: "Exclusive Content",
|
|
37
|
+
description: "Subscriber-only essays, interviews, and behind-the-scenes looks."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
icon: "Clock",
|
|
41
|
+
title: "Early Access",
|
|
42
|
+
description: "Be the first to read new posts before they go live."
|
|
43
|
+
}
|
|
44
|
+
];
|
|
45
|
+
function NewsletterPage() {
|
|
46
|
+
const { toast } = useToast();
|
|
47
|
+
const [subscribed, setSubscribed] = useState(false);
|
|
48
|
+
const form = useForm({
|
|
49
|
+
defaultValues: { email: "" },
|
|
50
|
+
onSubmit: async ({ formApi }) => {
|
|
51
|
+
await new Promise((resolve) => setTimeout(resolve, 1200));
|
|
52
|
+
setSubscribed(true);
|
|
53
|
+
formApi.reset();
|
|
54
|
+
toast.message("You're subscribed!", {
|
|
55
|
+
description: "Check your inbox for a welcome email."
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return /* @__PURE__ */ jsxs(
|
|
60
|
+
motion.div,
|
|
61
|
+
{
|
|
62
|
+
initial: { opacity: 1, y: 20 },
|
|
63
|
+
animate: { opacity: 1, y: 0 },
|
|
64
|
+
transition: { duration: 0.3 },
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ jsx("section", { className: "sg:bg-primary/5 sg:border-b sg:border-border", children: /* @__PURE__ */ jsxs("div", { className: "sg:container sg:py-20 sg:max-w-3xl sg:mx-auto sg:text-center", children: [
|
|
67
|
+
/* @__PURE__ */ jsx(Icon, { icon: "Mail", className: "sg:h-12 sg:w-12 sg:text-primary sg:mx-auto sg:mb-5" }),
|
|
68
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h1", className: "sg:mb-4", children: "Stories Worth Reading, Delivered Weekly" }),
|
|
69
|
+
/* @__PURE__ */ jsx(
|
|
70
|
+
Text,
|
|
71
|
+
{
|
|
72
|
+
size: "lg",
|
|
73
|
+
foreground: "muted-foreground",
|
|
74
|
+
className: "sg:max-w-xl sg:mx-auto sg:leading-relaxed",
|
|
75
|
+
children: "Join a growing community of thoughtful readers. Curated essays on slow living, intentional design, and creative culture \u2014 every Sunday."
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
!subscribed ? /* @__PURE__ */ jsxs(
|
|
79
|
+
Form,
|
|
80
|
+
{
|
|
81
|
+
className: "sg:mt-8 sg:flex-col sm:sg:flex-row sg:gap-3 sg:max-w-md sg:mx-auto",
|
|
82
|
+
onSubmit: (event) => {
|
|
83
|
+
event.preventDefault();
|
|
84
|
+
event.stopPropagation();
|
|
85
|
+
void form.handleSubmit();
|
|
86
|
+
},
|
|
87
|
+
children: [
|
|
88
|
+
/* @__PURE__ */ jsx(FieldGroup, { className: "sg:flex-1", children: /* @__PURE__ */ jsx(
|
|
89
|
+
TanStackInputField,
|
|
90
|
+
{
|
|
91
|
+
formApi: form,
|
|
92
|
+
name: "email",
|
|
93
|
+
label: "Email",
|
|
94
|
+
labelClassName: "sg:sr-only",
|
|
95
|
+
type: "email",
|
|
96
|
+
placeholder: "you@example.com",
|
|
97
|
+
validators: {
|
|
98
|
+
onChange: ({ value }) => {
|
|
99
|
+
if (!value.trim() || !value.includes("@")) {
|
|
100
|
+
return "Please enter a valid email address";
|
|
101
|
+
}
|
|
102
|
+
return void 0;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
) }),
|
|
107
|
+
/* @__PURE__ */ jsx(FormActions, { children: /* @__PURE__ */ jsx(
|
|
108
|
+
form.Subscribe,
|
|
109
|
+
{
|
|
110
|
+
selector: (state) => [state.canSubmit, state.isSubmitting],
|
|
111
|
+
children: ([canSubmit, isSubmitting]) => /* @__PURE__ */ jsx(
|
|
112
|
+
Button,
|
|
113
|
+
{
|
|
114
|
+
type: "submit",
|
|
115
|
+
iconStart: "Mail",
|
|
116
|
+
disabled: !canSubmit || isSubmitting,
|
|
117
|
+
loading: isSubmitting,
|
|
118
|
+
children: "Subscribe"
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
) })
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
) : /* @__PURE__ */ jsxs("div", { className: "sg:mt-8 sg:inline-flex sg:items-center sg:gap-2 sg:bg-primary/10 sg:text-primary sg:rounded-full sg:px-5 sg:py-2.5 sg:font-medium", children: [
|
|
126
|
+
/* @__PURE__ */ jsx(Icon, { icon: "CircleCheck", className: "sg:h-5 sg:w-5" }),
|
|
127
|
+
"You're subscribed \u2014 welcome aboard!"
|
|
128
|
+
] }),
|
|
129
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:mt-6 sg:flex sg:items-center sg:justify-center sg:gap-2", children: [
|
|
130
|
+
/* @__PURE__ */ jsx("div", { className: "sg:flex sg:-space-x-2", children: authors.map((a) => /* @__PURE__ */ jsxs(
|
|
131
|
+
Avatar,
|
|
132
|
+
{
|
|
133
|
+
className: "sg:h-7 sg:w-7 sg:border-2 sg:border-background",
|
|
134
|
+
children: [
|
|
135
|
+
/* @__PURE__ */ jsx(AvatarImage, { src: a.avatar, alt: a.name }),
|
|
136
|
+
/* @__PURE__ */ jsx(AvatarFallback, { className: "sg:text-[10px]", children: a.name[0] })
|
|
137
|
+
]
|
|
138
|
+
},
|
|
139
|
+
a.slug
|
|
140
|
+
)) }),
|
|
141
|
+
/* @__PURE__ */ jsxs(Text, { size: "sm", foreground: "muted-foreground", children: [
|
|
142
|
+
"Join ",
|
|
143
|
+
/* @__PURE__ */ jsx("span", { className: "sg:font-medium sg:text-foreground", children: "2,400+" }),
|
|
144
|
+
" readers"
|
|
145
|
+
] })
|
|
146
|
+
] })
|
|
147
|
+
] }) }),
|
|
148
|
+
/* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsxs(Layout.Col1, { hideDiv: true, className: "sg:max-w-4xl", children: [
|
|
149
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:text-center sg:mb-2", children: "What You'll Get" }),
|
|
150
|
+
/* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:text-center sg:mb-10", children: "Every issue is crafted with the same care as our articles." }),
|
|
151
|
+
/* @__PURE__ */ jsx("div", { className: "sg:grid sg:gap-6 sm:sg:grid-cols-3", children: benefits.map((b) => /* @__PURE__ */ jsx(Card, { className: "sg:text-center", children: /* @__PURE__ */ jsxs(CardContent, { className: "sg:pt-6", children: [
|
|
152
|
+
/* @__PURE__ */ jsx("div", { className: "sg:rounded-full sg:bg-primary/10 sg:p-3 sg:inline-flex sg:mb-4", children: /* @__PURE__ */ jsx(Icon, { icon: b.icon, className: "sg:h-6 sg:w-6 sg:text-primary" }) }),
|
|
153
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h5", className: "sg:mb-1", children: b.title }),
|
|
154
|
+
/* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", className: "sg:leading-relaxed", children: b.description })
|
|
155
|
+
] }) }, b.title)) })
|
|
156
|
+
] }) }),
|
|
157
|
+
/* @__PURE__ */ jsx(Separator, { className: "sg:max-w-4xl sg:mx-auto" })
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
export {
|
|
163
|
+
NewsletterPage
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=newsletter-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/pages/newsletter/newsletter-page.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useForm } from \"@tanstack/react-form\";\r\nimport { useState } from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport { TanStackInputField } from \"../../../lib/forms/tanstack-field\";\r\nimport {\r\n\tLayout,\r\n\tHeading,\r\n\tText,\r\n\tButton,\r\n\tIcon,\r\n\tSeparator,\r\n} from \"../../primitives/index\";\r\nimport { FieldGroup } from \"../../primitives/forms/field\";\r\nimport {\r\n\tForm,\r\n\tFormActions,\r\n} from \"../../primitives/forms/form\";\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 { useToast } from \"../../primitives/sonner/use-toast\";\r\nimport { authors } from \"../../../data/authors\";\r\n\r\nconst benefits = [\r\n\t{\r\n\t\ticon: \"BookOpen\" as const,\r\n\t\ttitle: \"Curated Stories\",\r\n\t\tdescription:\r\n\t\t\t\"Handpicked articles on slow living, design, and culture — delivered weekly.\",\r\n\t},\r\n\t{\r\n\t\ticon: \"Sparkles\" as const,\r\n\t\ttitle: \"Exclusive Content\",\r\n\t\tdescription:\r\n\t\t\t\"Subscriber-only essays, interviews, and behind-the-scenes looks.\",\r\n\t},\r\n\t{\r\n\t\ticon: \"Clock\" as const,\r\n\t\ttitle: \"Early Access\",\r\n\t\tdescription: \"Be the first to read new posts before they go live.\",\r\n\t},\r\n];\r\n\r\nexport function NewsletterPage() {\r\n\tconst { toast } = useToast();\r\n\tconst [subscribed, setSubscribed] = useState(false);\r\n\r\n\tconst form = useForm({\r\n\t\tdefaultValues: { email: \"\" },\r\n\t\tonSubmit: async ({ formApi }) => {\r\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1200));\r\n\t\t\tsetSubscribed(true);\r\n\t\t\tformApi.reset();\r\n\t\t\ttoast.message(\"You're subscribed!\", {\r\n\t\t\t\tdescription: \"Check your inbox for a welcome email.\",\r\n\t\t\t});\r\n\t\t},\r\n\t});\r\n\r\n\treturn (\r\n\t\t<motion.div\r\n\t\t\tinitial={{ opacity: 1, 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<section className=\"sg:bg-primary/5 sg:border-b sg:border-border\">\r\n\t\t\t\t<div className=\"sg:container sg:py-20 sg:max-w-3xl sg:mx-auto sg:text-center\">\r\n\t\t\t\t\t<Icon icon=\"Mail\" className=\"sg:h-12 sg:w-12 sg:text-primary sg:mx-auto sg:mb-5\" />\r\n\t\t\t\t\t<Heading variant=\"h1\" className=\"sg:mb-4\">\r\n\t\t\t\t\t\tStories Worth Reading, Delivered Weekly\r\n\t\t\t\t\t</Heading>\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\tJoin a growing community of thoughtful readers. Curated essays on slow\r\n\t\t\t\t\t\tliving, intentional design, and creative culture — every Sunday.\r\n\t\t\t\t\t</Text>\r\n\r\n\t\t\t\t\t{!subscribed ? (\r\n\t\t\t\t\t\t<Form\r\n\t\t\t\t\t\t\tclassName=\"sg:mt-8 sg:flex-col sm:sg:flex-row sg:gap-3 sg:max-w-md sg:mx-auto\"\r\n\t\t\t\t\t\t\tonSubmit={(event) => {\r\n\t\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t\t\tvoid form.handleSubmit();\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\t<FieldGroup className=\"sg:flex-1\">\r\n\t\t\t\t\t\t\t\t<TanStackInputField\r\n\t\t\t\t\t\t\t\t\tformApi={form}\r\n\t\t\t\t\t\t\t\t\tname=\"email\"\r\n\t\t\t\t\t\t\t\t\tlabel=\"Email\"\r\n\t\t\t\t\t\t\t\t\tlabelClassName=\"sg:sr-only\"\r\n\t\t\t\t\t\t\t\t\ttype=\"email\"\r\n\t\t\t\t\t\t\t\t\tplaceholder=\"you@example.com\"\r\n\t\t\t\t\t\t\t\t\tvalidators={{\r\n\t\t\t\t\t\t\t\t\t\tonChange: ({ value }: { value: string }) => {\r\n\t\t\t\t\t\t\t\t\t\t\tif (!value.trim() || !value.includes(\"@\")) {\r\n\t\t\t\t\t\t\t\t\t\t\t\treturn \"Please enter a valid email address\";\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\treturn undefined;\r\n\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</FieldGroup>\r\n\t\t\t\t\t\t\t<FormActions>\r\n\t\t\t\t\t\t\t\t<form.Subscribe\r\n\t\t\t\t\t\t\t\t\tselector={(state) => [state.canSubmit, state.isSubmitting]}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{([canSubmit, isSubmitting]) => (\r\n\t\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"submit\"\r\n\t\t\t\t\t\t\t\t\t\t\ticonStart=\"Mail\"\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={!canSubmit || isSubmitting}\r\n\t\t\t\t\t\t\t\t\t\t\tloading={isSubmitting}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tSubscribe\r\n\t\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</form.Subscribe>\r\n\t\t\t\t\t\t\t</FormActions>\r\n\t\t\t\t\t\t</Form>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<div className=\"sg:mt-8 sg:inline-flex sg:items-center sg:gap-2 sg:bg-primary/10 sg:text-primary sg:rounded-full sg:px-5 sg:py-2.5 sg:font-medium\">\r\n\t\t\t\t\t\t\t<Icon icon=\"CircleCheck\" className=\"sg:h-5 sg:w-5\" />\r\n\t\t\t\t\t\t\tYou're subscribed — welcome aboard!\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t<div className=\"sg:mt-6 sg:flex sg:items-center sg:justify-center sg:gap-2\">\r\n\t\t\t\t\t\t<div className=\"sg:flex sg:-space-x-2\">\r\n\t\t\t\t\t\t\t{authors.map((a) => (\r\n\t\t\t\t\t\t\t\t<Avatar\r\n\t\t\t\t\t\t\t\t\tkey={a.slug}\r\n\t\t\t\t\t\t\t\t\tclassName=\"sg:h-7 sg:w-7 sg:border-2 sg:border-background\"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<AvatarImage src={a.avatar} alt={a.name} />\r\n\t\t\t\t\t\t\t\t\t<AvatarFallback className=\"sg:text-[10px]\">\r\n\t\t\t\t\t\t\t\t\t\t{a.name[0]}\r\n\t\t\t\t\t\t\t\t\t</AvatarFallback>\r\n\t\t\t\t\t\t\t\t</Avatar>\r\n\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<Text size=\"sm\" foreground=\"muted-foreground\">\r\n\t\t\t\t\t\t\tJoin <span className=\"sg:font-medium sg:text-foreground\">2,400+</span> readers\r\n\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\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:text-center sg:mb-2\">\r\n\t\t\t\t\t\tWhat You'll Get\r\n\t\t\t\t\t</Heading>\r\n\t\t\t\t\t<Text foreground=\"muted-foreground\" className=\"sg:text-center sg:mb-10\">\r\n\t\t\t\t\t\tEvery issue is crafted with the same care as our articles.\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{benefits.map((b) => (\r\n\t\t\t\t\t\t\t<Card key={b.title} className=\"sg:text-center\">\r\n\t\t\t\t\t\t\t\t<CardContent className=\"sg:pt-6\">\r\n\t\t\t\t\t\t\t\t\t<div className=\"sg:rounded-full sg:bg-primary/10 sg:p-3 sg:inline-flex sg:mb-4\">\r\n\t\t\t\t\t\t\t\t\t\t<Icon icon={b.icon} className=\"sg:h-6 sg:w-6 sg:text-primary\" />\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<Heading variant=\"h5\" className=\"sg:mb-1\">\r\n\t\t\t\t\t\t\t\t\t\t{b.title}\r\n\t\t\t\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t\t\t\t<Text size=\"sm\" foreground=\"muted-foreground\" className=\"sg:leading-relaxed\">\r\n\t\t\t\t\t\t\t\t\t\t{b.description}\r\n\t\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t\t</CardContent>\r\n\t\t\t\t\t\t\t</Card>\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-4xl sg:mx-auto\" />\r\n\t\t</motion.div>\r\n\t);\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -28,9 +28,9 @@ const NotFound = ({
|
|
|
28
28
|
return /* @__PURE__ */ jsx(Layout, { bgColor: "background", children: /* @__PURE__ */ jsx(Layout.Col1, { className: "sg:flex sg:flex-col sg:items-center sg:justify-center sg:py-32 sg:text-center", children: /* @__PURE__ */ jsxs(
|
|
29
29
|
motion.div,
|
|
30
30
|
{
|
|
31
|
-
initial: { opacity:
|
|
31
|
+
initial: { opacity: 1, y: 20 },
|
|
32
32
|
animate: { opacity: 1, y: 0 },
|
|
33
|
-
exit: { opacity:
|
|
33
|
+
exit: { opacity: 1, y: -20 },
|
|
34
34
|
transition: { duration: 0.3 },
|
|
35
35
|
className: "sg:flex sg:flex-col sg:items-center",
|
|
36
36
|
children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/pages/not-found/not-found.tsx"],"sourcesContent":["\"use client\";\nimport { motion } from \"framer-motion\";\nimport { Layout } from \"../../primitives/layout/layout\";\nimport { Button } from \"../../primitives/buttons/button\";\nimport { LinkButton } from \"../../primitives/buttons/link-button\";\nimport { Heading, Icon, Stack, Text, TextCode } from \"../../primitives/index\";\nimport { useEffect } from \"react\";\n\ninterface NotFoundProps {\n pathname?: string;\n homeHref?: string;\n onGoBack?: () => void;\n}\n\nexport const NotFound = ({\n pathname,\n homeHref = \"/\",\n onGoBack,\n}: NotFoundProps) => {\n const currentPath =\n pathname ?? (typeof window !== \"undefined\" ? window.location.pathname : \"\");\n\n useEffect(() => {\n console.error(\n \"404 Error: User attempted to access non-existent route:\",\n currentPath,\n );\n }, [currentPath]);\n\n const handleGoBack = () => {\n if (onGoBack) {\n onGoBack();\n } else if (typeof window !== \"undefined\") {\n window.history.back();\n }\n };\n\n return (\n <Layout bgColor=\"background\">\n <Layout.Col1 className=\"sg:flex sg:flex-col sg:items-center sg:justify-center sg:py-32 sg:text-center\">\n <motion.div\n initial={{ opacity:
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/pages/not-found/not-found.tsx"],"sourcesContent":["\"use client\";\nimport { motion } from \"framer-motion\";\nimport { Layout } from \"../../primitives/layout/layout\";\nimport { Button } from \"../../primitives/buttons/button\";\nimport { LinkButton } from \"../../primitives/buttons/link-button\";\nimport { Heading, Icon, Stack, Text, TextCode } from \"../../primitives/index\";\nimport { useEffect } from \"react\";\n\ninterface NotFoundProps {\n pathname?: string;\n homeHref?: string;\n onGoBack?: () => void;\n}\n\nexport const NotFound = ({\n pathname,\n homeHref = \"/\",\n onGoBack,\n}: NotFoundProps) => {\n const currentPath =\n pathname ?? (typeof window !== \"undefined\" ? window.location.pathname : \"\");\n\n useEffect(() => {\n console.error(\n \"404 Error: User attempted to access non-existent route:\",\n currentPath,\n );\n }, [currentPath]);\n\n const handleGoBack = () => {\n if (onGoBack) {\n onGoBack();\n } else if (typeof window !== \"undefined\") {\n window.history.back();\n }\n };\n\n return (\n <Layout bgColor=\"background\">\n <Layout.Col1 className=\"sg:flex sg:flex-col sg:items-center sg:justify-center sg:py-32 sg:text-center\">\n <motion.div\n initial={{ opacity: 1, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 1, y: -20 }}\n transition={{ duration: 0.3 }}\n className=\"sg:flex sg:flex-col sg:items-center\"\n >\n <Icon size=\"xxl\" className=\"sg:mb-6\" icon=\"SearchX\" />\n\n <Heading variant=\"h1\" className=\"sg:mb-2\" foreground=\"primary\">\n 404\n </Heading>\n\n <Heading variant=\"h2\" className=\"sg:mb-3\">\n Page not found\n </Heading>\n\n <Text foreground=\"muted-foreground\" className=\"sg:max-w-md sg:mb-8\">\n The page <TextCode>{currentPath}</TextCode> doesn't exist. It\n may have been moved or removed.\n </Text>\n\n <Stack wrap=\"wrap\" justifyContent=\"center\" gap={3} direction=\"row\">\n <LinkButton to={homeHref} iconStart=\"House\">\n Back to Home\n </LinkButton>\n <Button\n variant=\"outline\"\n onClick={handleGoBack}\n iconStart=\"ArrowLeft\"\n >\n Go Back\n </Button>\n </Stack>\n </motion.div>\n </Layout.Col1>\n </Layout>\n );\n};\n"],"mappings":";AA+CU,cAUA,YAVA;AA9CV,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,SAAS,MAAM,OAAO,MAAM,gBAAgB;AACrD,SAAS,iBAAiB;AAQnB,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,WAAW;AAAA,EACX;AACF,MAAqB;AACnB,QAAM,cACJ,aAAa,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AAE1E,YAAU,MAAM;AACd,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,eAAe,MAAM;AACzB,QAAI,UAAU;AACZ,eAAS;AAAA,IACX,WAAW,OAAO,WAAW,aAAa;AACxC,aAAO,QAAQ,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,SACE,oBAAC,UAAO,SAAQ,cACd,8BAAC,OAAO,MAAP,EAAY,WAAU,iFACrB;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,MAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,MAC5B,MAAM,EAAE,SAAS,GAAG,GAAG,IAAI;AAAA,MAC3B,YAAY,EAAE,UAAU,IAAI;AAAA,MAC5B,WAAU;AAAA,MAEV;AAAA,4BAAC,QAAK,MAAK,OAAM,WAAU,WAAU,MAAK,WAAU;AAAA,QAEpD,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAAU,YAAW,WAAU,iBAE/D;AAAA,QAEA,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAAU,4BAE1C;AAAA,QAEA,qBAAC,QAAK,YAAW,oBAAmB,WAAU,uBAAsB;AAAA;AAAA,UACzD,oBAAC,YAAU,uBAAY;AAAA,UAAW;AAAA,WAE7C;AAAA,QAEA,qBAAC,SAAM,MAAK,QAAO,gBAAe,UAAS,KAAK,GAAG,WAAU,OAC3D;AAAA,8BAAC,cAAW,IAAI,UAAU,WAAU,SAAQ,0BAE5C;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,SAAS;AAAA,cACT,WAAU;AAAA,cACX;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF,GACF;AAEJ;","names":[]}
|
|
@@ -44,9 +44,9 @@ const PrivacyPage = ({
|
|
|
44
44
|
return /* @__PURE__ */ jsxs(
|
|
45
45
|
motion.div,
|
|
46
46
|
{
|
|
47
|
-
initial: { opacity:
|
|
47
|
+
initial: { opacity: 1, y: 20 },
|
|
48
48
|
animate: { opacity: 1, y: 0 },
|
|
49
|
-
exit: { opacity:
|
|
49
|
+
exit: { opacity: 1, y: -20 },
|
|
50
50
|
transition: { duration: 0.3 },
|
|
51
51
|
className: "sg:w-full",
|
|
52
52
|
children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/pages/privacy/privacy-page.tsx"],"sourcesContent":["\"use client\";\nimport { motion } from \"framer-motion\";\nimport {\n Layout,\n Separator,\n Heading,\n Text,\n Icon,\n Stack,\n} from \"../../primitives/index\";\n\ninterface Section {\n title: string;\n content: string;\n}\n\ninterface PrivacyPageProps {\n title?: string;\n effectiveDate?: string;\n introText?: string;\n sections?: Section[];\n}\n\nconst defaultSections: Section[] = [\n {\n title: \"Information We Collect\",\n content:\n \"We collect minimal information to provide and improve our service. This may include your name and email address when you use our contact form, and standard analytics data such as browser type, device, and pages visited.\",\n },\n {\n title: \"How We Use Your Information\",\n content:\n \"Your information is used solely to respond to your inquiries, improve our content and user experience, and maintain the security of our website. We do not sell, trade, or rent your personal data to third parties.\",\n },\n {\n title: \"Cookies & Analytics\",\n content:\n \"We use cookies to remember your preferences (such as dark mode) and basic analytics to understand how our content is used. You can disable cookies in your browser settings at any time.\",\n },\n {\n title: \"Data Retention\",\n content:\n \"We retain personal data only as long as necessary to fulfill the purposes outlined above. Contact form submissions are kept for up to 12 months before being deleted.\",\n },\n {\n title: \"Your Rights\",\n content:\n \"You have the right to access, correct, or delete your personal data at any time. To make a request, please reach out via our contact page and we will respond within 30 days.\",\n },\n {\n title: \"Changes to This Policy\",\n content:\n \"We may update this policy from time to time. Changes will be posted on this page with an updated effective date. Continued use of the site constitutes acceptance of the revised policy.\",\n },\n];\n\nexport const PrivacyPage = ({\n title = \"Privacy Policy\",\n effectiveDate = \"March 1, 2025\",\n introText = \"At Storied, we take your privacy seriously. This policy outlines what data we collect, how we use it, and your rights as a visitor to our site.\",\n sections = defaultSections,\n}: PrivacyPageProps) => {\n return (\n <motion.div\n initial={{ opacity:
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/pages/privacy/privacy-page.tsx"],"sourcesContent":["\"use client\";\nimport { motion } from \"framer-motion\";\nimport {\n Layout,\n Separator,\n Heading,\n Text,\n Icon,\n Stack,\n} from \"../../primitives/index\";\n\ninterface Section {\n title: string;\n content: string;\n}\n\ninterface PrivacyPageProps {\n title?: string;\n effectiveDate?: string;\n introText?: string;\n sections?: Section[];\n}\n\nconst defaultSections: Section[] = [\n {\n title: \"Information We Collect\",\n content:\n \"We collect minimal information to provide and improve our service. This may include your name and email address when you use our contact form, and standard analytics data such as browser type, device, and pages visited.\",\n },\n {\n title: \"How We Use Your Information\",\n content:\n \"Your information is used solely to respond to your inquiries, improve our content and user experience, and maintain the security of our website. We do not sell, trade, or rent your personal data to third parties.\",\n },\n {\n title: \"Cookies & Analytics\",\n content:\n \"We use cookies to remember your preferences (such as dark mode) and basic analytics to understand how our content is used. You can disable cookies in your browser settings at any time.\",\n },\n {\n title: \"Data Retention\",\n content:\n \"We retain personal data only as long as necessary to fulfill the purposes outlined above. Contact form submissions are kept for up to 12 months before being deleted.\",\n },\n {\n title: \"Your Rights\",\n content:\n \"You have the right to access, correct, or delete your personal data at any time. To make a request, please reach out via our contact page and we will respond within 30 days.\",\n },\n {\n title: \"Changes to This Policy\",\n content:\n \"We may update this policy from time to time. Changes will be posted on this page with an updated effective date. Continued use of the site constitutes acceptance of the revised policy.\",\n },\n];\n\nexport const PrivacyPage = ({\n title = \"Privacy Policy\",\n effectiveDate = \"March 1, 2025\",\n introText = \"At Storied, we take your privacy seriously. This policy outlines what data we collect, how we use it, and your rights as a visitor to our site.\",\n sections = defaultSections,\n}: PrivacyPageProps) => {\n return (\n <motion.div\n initial={{ opacity: 1, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 1, y: -20 }}\n transition={{ duration: 0.3 }}\n className=\"sg:w-full\"\n >\n <Layout type=\"container\" className=\"sg:border-b sg:border-border\">\n <Layout.Col1 className=\"sg:py-16 sg:px-4 sg:text-center sg:mx-auto\">\n <Icon\n size=\"lg\"\n color=\"primary\"\n className=\"sg:mx-auto sg:mb-4\"\n icon=\"Shield\"\n />\n <Heading variant=\"h1\" className=\"sg:mb-3\">\n {title}\n </Heading>\n <Text foreground=\"muted-foreground\">Effective {effectiveDate}</Text>\n </Layout.Col1>\n </Layout>\n <Layout>\n <Layout.Col1 className=\"sg:py-16 sg:px-4\">\n <Text\n foreground=\"muted-foreground\"\n className=\"sg:leading-relaxed sg:mb-10\"\n >\n {introText}\n </Text>\n <Stack gap={8}>\n {sections.map((s, i) => (\n <div key={i}>\n <Heading variant=\"h3\" as=\"h2\" className=\"sg:mb-2\">\n {s.title}\n </Heading>\n <Text\n foreground=\"muted-foreground\"\n className=\"sg:leading-relaxed\"\n >\n {s.content}\n </Text>\n {i < sections.length - 1 && <Separator className=\"sg:mt-8\" />}\n </div>\n ))}\n </Stack>\n </Layout.Col1>\n </Layout>\n </motion.div>\n );\n};\n"],"mappings":";AAwEU,cASA,YATA;AAvEV,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAcP,MAAM,kBAA6B;AAAA,EACjC;AAAA,IACE,OAAO;AAAA,IACP,SACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SACE;AAAA,EACJ;AACF;AAEO,MAAM,cAAc,CAAC;AAAA,EAC1B,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,WAAW;AACb,MAAwB;AACtB,SACE;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,MAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,MAC5B,MAAM,EAAE,SAAS,GAAG,GAAG,IAAI;AAAA,MAC3B,YAAY,EAAE,UAAU,IAAI;AAAA,MAC5B,WAAU;AAAA,MAEV;AAAA,4BAAC,UAAO,MAAK,aAAY,WAAU,gCACjC,+BAAC,OAAO,MAAP,EAAY,WAAU,8CACrB;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAM;AAAA,cACN,WAAU;AAAA,cACV,MAAK;AAAA;AAAA,UACP;AAAA,UACA,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAC7B,iBACH;AAAA,UACA,qBAAC,QAAK,YAAW,oBAAmB;AAAA;AAAA,YAAW;AAAA,aAAc;AAAA,WAC/D,GACF;AAAA,QACA,oBAAC,UACC,+BAAC,OAAO,MAAP,EAAY,WAAU,oBACrB;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,YAAW;AAAA,cACX,WAAU;AAAA,cAET;AAAA;AAAA,UACH;AAAA,UACA,oBAAC,SAAM,KAAK,GACT,mBAAS,IAAI,CAAC,GAAG,MAChB,qBAAC,SACC;AAAA,gCAAC,WAAQ,SAAQ,MAAK,IAAG,MAAK,WAAU,WACrC,YAAE,OACL;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,YAAW;AAAA,gBACX,WAAU;AAAA,gBAET,YAAE;AAAA;AAAA,YACL;AAAA,YACC,IAAI,SAAS,SAAS,KAAK,oBAAC,aAAU,WAAU,WAAU;AAAA,eAVnD,CAWV,CACD,GACH;AAAA,WACF,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { motion } from "framer-motion";
|
|
4
|
+
import { Layout, Heading, Text } from "../../primitives/index.js";
|
|
5
|
+
import { Card, CardContent } from "../../blocks/cards/card.js";
|
|
6
|
+
function ResourcesPage() {
|
|
7
|
+
return /* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsx(Layout.Col1, { hideDiv: true, className: "sg:max-w-3xl", children: /* @__PURE__ */ jsxs(
|
|
8
|
+
motion.div,
|
|
9
|
+
{
|
|
10
|
+
initial: { opacity: 1, y: 20 },
|
|
11
|
+
animate: { opacity: 1, y: 0 },
|
|
12
|
+
transition: { duration: 0.3 },
|
|
13
|
+
children: [
|
|
14
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h1", className: "sg:mb-2", children: "Resources" }),
|
|
15
|
+
/* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:mb-10", children: "Curated links, tools, and references for creators." }),
|
|
16
|
+
/* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardContent, { className: "sg:py-8 sg:text-center", children: /* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", children: "This is a placeholder page. Content coming soon." }) }) })
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
) }) });
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
ResourcesPage
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=resources-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/pages/resources/resources-page.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { motion } from \"framer-motion\";\r\nimport { Layout, Heading, Text } from \"../../primitives/index\";\r\nimport { Card, CardContent } from \"../../blocks/cards/card\";\r\n\r\nexport function ResourcesPage() {\r\n\treturn (\r\n\t\t<Layout type=\"col\" className=\"sg:py-16\">\r\n\t\t\t<Layout.Col1 hideDiv className=\"sg:max-w-3xl\">\r\n\t\t\t\t<motion.div\r\n\t\t\t\t\tinitial={{ opacity: 1, y: 20 }}\r\n\t\t\t\t\tanimate={{ opacity: 1, y: 0 }}\r\n\t\t\t\t\ttransition={{ duration: 0.3 }}\r\n\t\t\t\t>\r\n\t\t\t\t\t<Heading variant=\"h1\" className=\"sg:mb-2\">\r\n\t\t\t\t\t\tResources\r\n\t\t\t\t\t</Heading>\r\n\t\t\t\t\t<Text foreground=\"muted-foreground\" className=\"sg:mb-10\">\r\n\t\t\t\t\t\tCurated links, tools, and references for creators.\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t\t<Card>\r\n\t\t\t\t\t\t<CardContent className=\"sg:py-8 sg:text-center\">\r\n\t\t\t\t\t\t\t<Text foreground=\"muted-foreground\">\r\n\t\t\t\t\t\t\t\tThis is a placeholder page. Content coming soon.\r\n\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t</CardContent>\r\n\t\t\t\t\t</Card>\r\n\t\t\t\t</motion.div>\r\n\t\t\t</Layout.Col1>\r\n\t\t</Layout>\r\n\t);\r\n}\r\n"],"mappings":";AAUI,SAKC,KALD;AARJ,SAAS,cAAc;AACvB,SAAS,QAAQ,SAAS,YAAY;AACtC,SAAS,MAAM,mBAAmB;AAE3B,SAAS,gBAAgB;AAC/B,SACC,oBAAC,UAAO,MAAK,OAAM,WAAU,YAC5B,8BAAC,OAAO,MAAP,EAAY,SAAO,MAAC,WAAU,gBAC9B;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACA,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,MAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,MAC5B,YAAY,EAAE,UAAU,IAAI;AAAA,MAE5B;AAAA,4BAAC,WAAQ,SAAQ,MAAK,WAAU,WAAU,uBAE1C;AAAA,QACA,oBAAC,QAAK,YAAW,oBAAmB,WAAU,YAAW,gEAEzD;AAAA,QACA,oBAAC,QACA,8BAAC,eAAY,WAAU,0BACtB,8BAAC,QAAK,YAAW,oBAAmB,8DAEpC,GACD,GACD;AAAA;AAAA;AAAA,EACD,GACD,GACD;AAEF;","names":[]}
|
|
@@ -22,20 +22,22 @@ function StartPage() {
|
|
|
22
22
|
/* @__PURE__ */ jsx(Layout, { as: "section", className: "sg:py-16", children: /* @__PURE__ */ jsxs(Layout.Col1, { hideDiv: true, children: [
|
|
23
23
|
/* @__PURE__ */ jsxs("div", { className: "sg:flex sg:items-end sg:justify-between sg:flex-wrap sg:mb-10", children: [
|
|
24
24
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
25
|
-
/* @__PURE__ */ jsx(Heading, { variant: "h2", children: "
|
|
26
|
-
/* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:mt-2", children: "
|
|
25
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h2", children: "Featured" }),
|
|
26
|
+
/* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:mt-2", children: "Hand-picked stories we love." })
|
|
27
27
|
] }),
|
|
28
28
|
/* @__PURE__ */ jsx(Link, { to: "/posts", iconEnd: "ArrowRight", children: "View all" })
|
|
29
29
|
] }),
|
|
30
|
-
/* @__PURE__ */ jsx("div", { className: "sg:grid sg:grid-cols-[repeat(auto-fit,minmax(min(230px,100%),1fr))] sg:gap-8", children: posts.
|
|
30
|
+
/* @__PURE__ */ jsx("div", { className: "sg:grid sg:grid-cols-[repeat(auto-fit,minmax(min(230px,100%),1fr))] sg:gap-8", children: posts.filter((p) => p.featured).map((post) => /* @__PURE__ */ jsx(
|
|
31
31
|
BlogPostCard,
|
|
32
32
|
{
|
|
33
33
|
id: post.id,
|
|
34
|
+
slug: post.slug,
|
|
34
35
|
image: post.primaryImage,
|
|
35
36
|
categories: post.categories,
|
|
36
37
|
date: post.date,
|
|
37
38
|
title: post.title,
|
|
38
|
-
excerpt: post.excerpt
|
|
39
|
+
excerpt: post.excerpt,
|
|
40
|
+
clickableCategories: true
|
|
39
41
|
},
|
|
40
42
|
post.id
|
|
41
43
|
)) })
|