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,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: 0, 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: 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<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: 0, 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: 0, 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,148 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { motion } from "framer-motion";
|
|
5
|
+
import {
|
|
6
|
+
Layout,
|
|
7
|
+
Heading,
|
|
8
|
+
Text,
|
|
9
|
+
Input,
|
|
10
|
+
Button,
|
|
11
|
+
Icon,
|
|
12
|
+
Separator
|
|
13
|
+
} from "../../primitives/index.js";
|
|
14
|
+
import { Label } from "../../primitives/label/label.js";
|
|
15
|
+
import { Card, CardContent } from "../../blocks/cards/card.js";
|
|
16
|
+
import {
|
|
17
|
+
Avatar,
|
|
18
|
+
AvatarFallback,
|
|
19
|
+
AvatarImage
|
|
20
|
+
} from "../../primitives/avatar/avatar.js";
|
|
21
|
+
import { useToast } from "../../primitives/sonner/use-toast.js";
|
|
22
|
+
import { authors } from "../../../data/authors.js";
|
|
23
|
+
const benefits = [
|
|
24
|
+
{
|
|
25
|
+
icon: "BookOpen",
|
|
26
|
+
title: "Curated Stories",
|
|
27
|
+
description: "Handpicked articles on slow living, design, and culture \u2014 delivered weekly."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
icon: "Sparkles",
|
|
31
|
+
title: "Exclusive Content",
|
|
32
|
+
description: "Subscriber-only essays, interviews, and behind-the-scenes looks."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
icon: "Clock",
|
|
36
|
+
title: "Early Access",
|
|
37
|
+
description: "Be the first to read new posts before they go live."
|
|
38
|
+
}
|
|
39
|
+
];
|
|
40
|
+
function NewsletterPage() {
|
|
41
|
+
const { toast } = useToast();
|
|
42
|
+
const [email, setEmail] = useState("");
|
|
43
|
+
const [error, setError] = useState("");
|
|
44
|
+
const [submitting, setSubmitting] = useState(false);
|
|
45
|
+
const [subscribed, setSubscribed] = useState(false);
|
|
46
|
+
const handleSubmit = (e) => {
|
|
47
|
+
e.preventDefault();
|
|
48
|
+
if (!email.trim() || !email.includes("@")) {
|
|
49
|
+
setError("Please enter a valid email address");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
setError("");
|
|
53
|
+
setSubmitting(true);
|
|
54
|
+
setTimeout(() => {
|
|
55
|
+
setSubmitting(false);
|
|
56
|
+
setSubscribed(true);
|
|
57
|
+
toast.message("You're subscribed!", {
|
|
58
|
+
description: "Check your inbox for a welcome email."
|
|
59
|
+
});
|
|
60
|
+
}, 1200);
|
|
61
|
+
};
|
|
62
|
+
return /* @__PURE__ */ jsxs(
|
|
63
|
+
motion.div,
|
|
64
|
+
{
|
|
65
|
+
initial: { opacity: 0, y: 20 },
|
|
66
|
+
animate: { opacity: 1, y: 0 },
|
|
67
|
+
transition: { duration: 0.3 },
|
|
68
|
+
children: [
|
|
69
|
+
/* @__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: [
|
|
70
|
+
/* @__PURE__ */ jsx(Icon, { icon: "Mail", className: "sg:h-12 sg:w-12 sg:text-primary sg:mx-auto sg:mb-5" }),
|
|
71
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h1", className: "sg:mb-4", children: "Stories Worth Reading, Delivered Weekly" }),
|
|
72
|
+
/* @__PURE__ */ jsx(
|
|
73
|
+
Text,
|
|
74
|
+
{
|
|
75
|
+
size: "lg",
|
|
76
|
+
foreground: "muted-foreground",
|
|
77
|
+
className: "sg:max-w-xl sg:mx-auto sg:leading-relaxed",
|
|
78
|
+
children: "Join a growing community of thoughtful readers. Curated essays on slow living, intentional design, and creative culture \u2014 every Sunday."
|
|
79
|
+
}
|
|
80
|
+
),
|
|
81
|
+
!subscribed ? /* @__PURE__ */ jsxs(
|
|
82
|
+
"form",
|
|
83
|
+
{
|
|
84
|
+
onSubmit: handleSubmit,
|
|
85
|
+
className: "sg:mt-8 sg:flex sg:flex-col sm:sg:flex-row sg:gap-3 sg:max-w-md sg:mx-auto",
|
|
86
|
+
children: [
|
|
87
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:flex-1", children: [
|
|
88
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "newsletter-email", className: "sg:sr-only", children: "Email" }),
|
|
89
|
+
/* @__PURE__ */ jsx(
|
|
90
|
+
Input,
|
|
91
|
+
{
|
|
92
|
+
id: "newsletter-email",
|
|
93
|
+
type: "email",
|
|
94
|
+
placeholder: "you@example.com",
|
|
95
|
+
value: email,
|
|
96
|
+
onChange: (e) => {
|
|
97
|
+
setEmail(e.target.value);
|
|
98
|
+
if (error) setError("");
|
|
99
|
+
},
|
|
100
|
+
"aria-invalid": !!error
|
|
101
|
+
}
|
|
102
|
+
),
|
|
103
|
+
error && /* @__PURE__ */ jsx(Text, { size: "sm", className: "sg:text-destructive sg:text-left sg:mt-1", children: error })
|
|
104
|
+
] }),
|
|
105
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", loading: submitting, iconStart: "Mail", children: "Subscribe" })
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
) : /* @__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: [
|
|
109
|
+
/* @__PURE__ */ jsx(Icon, { icon: "CircleCheck", className: "sg:h-5 sg:w-5" }),
|
|
110
|
+
"You're subscribed \u2014 welcome aboard!"
|
|
111
|
+
] }),
|
|
112
|
+
/* @__PURE__ */ jsxs("div", { className: "sg:mt-6 sg:flex sg:items-center sg:justify-center sg:gap-2", children: [
|
|
113
|
+
/* @__PURE__ */ jsx("div", { className: "sg:flex sg:-space-x-2", children: authors.map((a) => /* @__PURE__ */ jsxs(
|
|
114
|
+
Avatar,
|
|
115
|
+
{
|
|
116
|
+
className: "sg:h-7 sg:w-7 sg:border-2 sg:border-background",
|
|
117
|
+
children: [
|
|
118
|
+
/* @__PURE__ */ jsx(AvatarImage, { src: a.avatar, alt: a.name }),
|
|
119
|
+
/* @__PURE__ */ jsx(AvatarFallback, { className: "sg:text-[10px]", children: a.name[0] })
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
a.slug
|
|
123
|
+
)) }),
|
|
124
|
+
/* @__PURE__ */ jsxs(Text, { size: "sm", foreground: "muted-foreground", children: [
|
|
125
|
+
"Join ",
|
|
126
|
+
/* @__PURE__ */ jsx("span", { className: "sg:font-medium sg:text-foreground", children: "2,400+" }),
|
|
127
|
+
" readers"
|
|
128
|
+
] })
|
|
129
|
+
] })
|
|
130
|
+
] }) }),
|
|
131
|
+
/* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsxs(Layout.Col1, { hideDiv: true, className: "sg:max-w-4xl", children: [
|
|
132
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:text-center sg:mb-2", children: "What You'll Get" }),
|
|
133
|
+
/* @__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." }),
|
|
134
|
+
/* @__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: [
|
|
135
|
+
/* @__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" }) }),
|
|
136
|
+
/* @__PURE__ */ jsx(Heading, { variant: "h5", className: "sg:mb-1", children: b.title }),
|
|
137
|
+
/* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", className: "sg:leading-relaxed", children: b.description })
|
|
138
|
+
] }) }, b.title)) })
|
|
139
|
+
] }) }),
|
|
140
|
+
/* @__PURE__ */ jsx(Separator, { className: "sg:max-w-4xl sg:mx-auto" })
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
export {
|
|
146
|
+
NewsletterPage
|
|
147
|
+
};
|
|
148
|
+
//# 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 { useState } from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport {\r\n\tLayout,\r\n\tHeading,\r\n\tText,\r\n\tInput,\r\n\tButton,\r\n\tIcon,\r\n\tSeparator,\r\n} from \"../../primitives/index\";\r\nimport { Label } from \"../../primitives/label/label\";\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 [email, setEmail] = useState(\"\");\r\n\tconst [error, setError] = useState(\"\");\r\n\tconst [submitting, setSubmitting] = useState(false);\r\n\tconst [subscribed, setSubscribed] = useState(false);\r\n\r\n\tconst handleSubmit = (e: React.FormEvent) => {\r\n\t\te.preventDefault();\r\n\t\tif (!email.trim() || !email.includes(\"@\")) {\r\n\t\t\tsetError(\"Please enter a valid email address\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsetError(\"\");\r\n\t\tsetSubmitting(true);\r\n\t\tsetTimeout(() => {\r\n\t\t\tsetSubmitting(false);\r\n\t\t\tsetSubscribed(true);\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}, 1200);\r\n\t};\r\n\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<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\tonSubmit={handleSubmit}\r\n\t\t\t\t\t\t\tclassName=\"sg:mt-8 sg:flex 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>\r\n\t\t\t\t\t\t\t<div className=\"sg:flex-1\">\r\n\t\t\t\t\t\t\t\t<Label htmlFor=\"newsletter-email\" className=\"sg:sr-only\">\r\n\t\t\t\t\t\t\t\t\tEmail\r\n\t\t\t\t\t\t\t\t</Label>\r\n\t\t\t\t\t\t\t\t<Input\r\n\t\t\t\t\t\t\t\t\tid=\"newsletter-email\"\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\tvalue={email}\r\n\t\t\t\t\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\t\t\t\t\tsetEmail(e.target.value);\r\n\t\t\t\t\t\t\t\t\t\tif (error) setError(\"\");\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\taria-invalid={!!error}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t{error && (\r\n\t\t\t\t\t\t\t\t\t<Text size=\"sm\" className=\"sg:text-destructive sg:text-left sg:mt-1\">\r\n\t\t\t\t\t\t\t\t\t\t{error}\r\n\t\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<Button type=\"submit\" loading={submitting} iconStart=\"Mail\">\r\n\t\t\t\t\t\t\t\tSubscribe\r\n\t\t\t\t\t\t\t</Button>\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":[]}
|
|
@@ -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: 0, 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: 0, 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
|
)) })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/pages/startpage/startpage.tsx"],"sourcesContent":["import { Container } from \"../../templates/container/container\";\nimport Hero from \"../../templates/hero/hero\";\nimport { Layout, Link, Heading, Text } from \"../../primitives/index\";\nimport BlogPostCard from \"../../blocks/cards/blogpost-card\";\nimport { posts } from \"../../../data/posts\";\nimport { Footer } from \"../../templates/footer/footer\";\n\nfunction StartPage() {\n return (\n <Container>\n <Container.Header />\n <Container.Content>\n <Hero\n title=\"Stories worth\"\n titleAccent=\"savoring\"\n description=\"A curated journal exploring design, culture, and the quiet art of living with intention.\"\n primaryCTA={{ label: \"Browse all posts\", href: \"#\" }}\n secondaryCTA={{ label: \"Our design system\", href: \"#\" }}\n />\n <Layout as=\"section\" className=\"sg:py-16\">\n <Layout.Col1 hideDiv>\n <div className=\"sg:flex sg:items-end sg:justify-between sg:flex-wrap sg:mb-10\">\n <div>\n <Heading variant=\"h2\">
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/pages/startpage/startpage.tsx"],"sourcesContent":["import { Container } from \"../../templates/container/container\";\nimport Hero from \"../../templates/hero/hero\";\nimport { Layout, Link, Heading, Text } from \"../../primitives/index\";\nimport BlogPostCard from \"../../blocks/cards/blogpost-card\";\nimport { posts } from \"../../../data/posts\";\nimport { Footer } from \"../../templates/footer/footer\";\n\nfunction StartPage() {\n return (\n <Container>\n <Container.Header />\n <Container.Content>\n <Hero\n title=\"Stories worth\"\n titleAccent=\"savoring\"\n description=\"A curated journal exploring design, culture, and the quiet art of living with intention.\"\n primaryCTA={{ label: \"Browse all posts\", href: \"#\" }}\n secondaryCTA={{ label: \"Our design system\", href: \"#\" }}\n />\n <Layout as=\"section\" className=\"sg:py-16\">\n <Layout.Col1 hideDiv>\n <div className=\"sg:flex sg:items-end sg:justify-between sg:flex-wrap sg:mb-10\">\n <div>\n <Heading variant=\"h2\">Featured</Heading>\n <Text foreground=\"muted-foreground\" className=\"sg:mt-2\">\n Hand-picked stories we love.\n </Text>\n </div>\n <Link to=\"/posts\" iconEnd=\"ArrowRight\">\n View all\n </Link>\n </div>\n <div className=\"sg:grid sg:grid-cols-[repeat(auto-fit,minmax(min(230px,100%),1fr))] sg:gap-8\">\n {posts.filter((p) => p.featured).map((post) => (\n <BlogPostCard\n key={post.id}\n id={post.id}\n slug={post.slug}\n image={post.primaryImage}\n categories={post.categories}\n date={post.date}\n title={post.title}\n excerpt={post.excerpt}\n clickableCategories\n />\n ))}\n </div>\n </Layout.Col1>\n </Layout>\n </Container.Content>\n <Container.Footer>\n <Footer />\n </Container.Footer>\n </Container>\n );\n}\n\nexport { StartPage };\n"],"mappings":"AAUM,cAYQ,YAZR;AAVN,SAAS,iBAAiB;AAC1B,OAAO,UAAU;AACjB,SAAS,QAAQ,MAAM,SAAS,YAAY;AAC5C,OAAO,kBAAkB;AACzB,SAAS,aAAa;AACtB,SAAS,cAAc;AAEvB,SAAS,YAAY;AACnB,SACE,qBAAC,aACC;AAAA,wBAAC,UAAU,QAAV,EAAiB;AAAA,IAClB,qBAAC,UAAU,SAAV,EACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,aAAY;AAAA,UACZ,YAAY,EAAE,OAAO,oBAAoB,MAAM,IAAI;AAAA,UACnD,cAAc,EAAE,OAAO,qBAAqB,MAAM,IAAI;AAAA;AAAA,MACxD;AAAA,MACA,oBAAC,UAAO,IAAG,WAAU,WAAU,YAC7B,+BAAC,OAAO,MAAP,EAAY,SAAO,MAClB;AAAA,6BAAC,SAAI,WAAU,iEACb;AAAA,+BAAC,SACC;AAAA,gCAAC,WAAQ,SAAQ,MAAK,sBAAQ;AAAA,YAC9B,oBAAC,QAAK,YAAW,oBAAmB,WAAU,WAAU,0CAExD;AAAA,aACF;AAAA,UACA,oBAAC,QAAK,IAAG,UAAS,SAAQ,cAAa,sBAEvC;AAAA,WACF;AAAA,QACA,oBAAC,SAAI,WAAU,gFACZ,gBAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,SACpC;AAAA,UAAC;AAAA;AAAA,YAEC,IAAI,KAAK;AAAA,YACT,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,YACZ,YAAY,KAAK;AAAA,YACjB,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,YACZ,SAAS,KAAK;AAAA,YACd,qBAAmB;AAAA;AAAA,UARd,KAAK;AAAA,QASZ,CACD,GACH;AAAA,SACF,GACF;AAAA,OACF;AAAA,IACA,oBAAC,UAAU,QAAV,EACC,8BAAC,UAAO,GACV;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion";
|
|
4
|
-
import { ChevronDownIcon, ChevronUpIcon } from "lucide-react";
|
|
5
4
|
import { cn } from "../../../utils/index.js";
|
|
5
|
+
import { Icon } from "../icon/icon.js";
|
|
6
6
|
function Accordion({ className, ...props }) {
|
|
7
7
|
return /* @__PURE__ */ jsx(
|
|
8
8
|
AccordionPrimitive.Root,
|
|
9
9
|
{
|
|
10
10
|
"data-slot": "accordion",
|
|
11
11
|
className: cn(
|
|
12
|
-
"sg:
|
|
12
|
+
"sg:flex sg:w-full sg:flex-col sg:rounded-lg sg:border sg:border-border sg:bg-card sg:text-card-foreground",
|
|
13
13
|
className
|
|
14
14
|
),
|
|
15
15
|
...props
|
|
@@ -21,7 +21,10 @@ function AccordionItem({ className, ...props }) {
|
|
|
21
21
|
AccordionPrimitive.Item,
|
|
22
22
|
{
|
|
23
23
|
"data-slot": "accordion-item",
|
|
24
|
-
className: cn(
|
|
24
|
+
className: cn(
|
|
25
|
+
"sg:not-last:border-b sg:not-last:border-border sg:data-open:bg-muted/40",
|
|
26
|
+
className
|
|
27
|
+
),
|
|
25
28
|
...props
|
|
26
29
|
}
|
|
27
30
|
);
|
|
@@ -31,29 +34,24 @@ function AccordionTrigger({
|
|
|
31
34
|
children,
|
|
32
35
|
...props
|
|
33
36
|
}) {
|
|
34
|
-
return /* @__PURE__ */ jsx(AccordionPrimitive.Header, { className: "sg:flex", children: /* @__PURE__ */ jsxs(
|
|
37
|
+
return /* @__PURE__ */ jsx(AccordionPrimitive.Header, { className: "sg:m-0 sg:flex sg:w-full", children: /* @__PURE__ */ jsxs(
|
|
35
38
|
AccordionPrimitive.Trigger,
|
|
36
39
|
{
|
|
37
40
|
"data-slot": "accordion-trigger",
|
|
38
41
|
className: cn(
|
|
39
|
-
"sg
|
|
42
|
+
"sg:group sg:relative sg:flex sg:w-full sg:flex-1 sg:items-center sg:justify-between sg:gap-4 sg:rounded-sm sg:p-4 sg:text-start sg:text-sm sg:font-medium sg:select-none sg:transition-colors sg:hover:not-data-disabled:bg-accent/50 sg:focus-visible:z-10 sg:focus-visible:outline-none sg:focus-visible:ring-2 sg:focus-visible:ring-inset sg:focus-visible:ring-ring sg:focus-visible:ring-offset-0 sg:disabled:pointer-events-none sg:disabled:opacity-50",
|
|
40
43
|
className
|
|
41
44
|
),
|
|
42
45
|
...props,
|
|
43
46
|
children: [
|
|
44
47
|
children,
|
|
45
48
|
/* @__PURE__ */ jsx(
|
|
46
|
-
|
|
47
|
-
{
|
|
48
|
-
"data-slot": "accordion-trigger-icon",
|
|
49
|
-
className: "sg:pointer-events-none sg:shrink-0 sg:group-aria-expanded/accordion-trigger:hidden"
|
|
50
|
-
}
|
|
51
|
-
),
|
|
52
|
-
/* @__PURE__ */ jsx(
|
|
53
|
-
ChevronUpIcon,
|
|
49
|
+
Icon,
|
|
54
50
|
{
|
|
51
|
+
icon: "ChevronDown",
|
|
52
|
+
size: "xs",
|
|
55
53
|
"data-slot": "accordion-trigger-icon",
|
|
56
|
-
className: "sg:pointer-events-none sg:
|
|
54
|
+
className: "sg:pointer-events-none sg:shrink-0 sg:text-muted-foreground sg:transition-transform sg:duration-200 sg:ease-out sg:group-data-panel-open:rotate-180"
|
|
57
55
|
}
|
|
58
56
|
)
|
|
59
57
|
]
|
|
@@ -69,13 +67,13 @@ function AccordionContent({
|
|
|
69
67
|
AccordionPrimitive.Panel,
|
|
70
68
|
{
|
|
71
69
|
"data-slot": "accordion-content",
|
|
72
|
-
className: "sg:
|
|
70
|
+
className: "sg:h-(--accordion-panel-height) sg:overflow-hidden sg:text-sm sg:transition-[height] sg:duration-150 sg:ease-out sg:data-ending-style:h-0 sg:data-starting-style:h-0",
|
|
73
71
|
...props,
|
|
74
72
|
children: /* @__PURE__ */ jsx(
|
|
75
73
|
"div",
|
|
76
74
|
{
|
|
77
75
|
className: cn(
|
|
78
|
-
"sg:
|
|
76
|
+
"sg:px-4 sg:pb-4 sg:text-muted-foreground sg:[&_a]:underline sg:[&_a]:underline-offset-3 sg:[&_a]:hover:text-foreground sg:[&_p:not(:last-child)]:mb-4",
|
|
79
77
|
className
|
|
80
78
|
),
|
|
81
79
|
children
|