singularity-components 0.1.194 → 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.
Files changed (203) hide show
  1. package/dist/components/blocks/badges/category-badge.d.ts +11 -0
  2. package/dist/components/blocks/badges/category-badge.js +34 -0
  3. package/dist/components/blocks/badges/category-badge.js.map +1 -0
  4. package/dist/components/blocks/cards/blogpost-card.d.ts +4 -2
  5. package/dist/components/blocks/cards/blogpost-card.js +9 -4
  6. package/dist/components/blocks/cards/blogpost-card.js.map +1 -1
  7. package/dist/components/blocks/cards/card.d.ts +7 -8
  8. package/dist/components/blocks/directory/author-card.d.ts +10 -0
  9. package/dist/components/blocks/directory/author-card.js +50 -0
  10. package/dist/components/blocks/directory/author-card.js.map +1 -0
  11. package/dist/components/blocks/directory/category-card.d.ts +10 -0
  12. package/dist/components/blocks/directory/category-card.js +26 -0
  13. package/dist/components/blocks/directory/category-card.js.map +1 -0
  14. package/dist/components/blocks/empty-state/EmptyState.d.ts +2 -2
  15. package/dist/components/blocks/extras/extras-hub-card.d.ts +16 -0
  16. package/dist/components/blocks/extras/extras-hub-card.js +21 -0
  17. package/dist/components/blocks/extras/extras-hub-card.js.map +1 -0
  18. package/dist/components/blocks/gallery/image-gallery.d.ts +14 -0
  19. package/dist/components/blocks/gallery/image-gallery.js +211 -0
  20. package/dist/components/blocks/gallery/image-gallery.js.map +1 -0
  21. package/dist/components/blocks/index.d.ts +12 -1
  22. package/dist/components/blocks/index.js +11 -0
  23. package/dist/components/blocks/index.js.map +1 -1
  24. package/dist/components/blocks/loading/loading-skeletons.d.ts +15 -0
  25. package/dist/components/blocks/loading/loading-skeletons.js +78 -0
  26. package/dist/components/blocks/loading/loading-skeletons.js.map +1 -0
  27. package/dist/components/blocks/login/login.d.ts +78 -0
  28. package/dist/components/blocks/login/login.js +95 -0
  29. package/dist/components/blocks/login/login.js.map +1 -0
  30. package/dist/components/blocks/marketing/page-hero.d.ts +13 -0
  31. package/dist/components/blocks/marketing/page-hero.js +37 -0
  32. package/dist/components/blocks/marketing/page-hero.js.map +1 -0
  33. package/dist/components/blocks/marketing/stats-grid.d.ts +16 -0
  34. package/dist/components/blocks/marketing/stats-grid.js +30 -0
  35. package/dist/components/blocks/marketing/stats-grid.js.map +1 -0
  36. package/dist/components/blocks/marketing/timeline.d.ts +17 -0
  37. package/dist/components/blocks/marketing/timeline.js +45 -0
  38. package/dist/components/blocks/marketing/timeline.js.map +1 -0
  39. package/dist/components/blocks/marketing/values-grid.d.ts +16 -0
  40. package/dist/components/blocks/marketing/values-grid.js +29 -0
  41. package/dist/components/blocks/marketing/values-grid.js.map +1 -0
  42. package/dist/components/blocks/post-list/post-filters.d.ts +2 -2
  43. package/dist/components/blocks/post-list/post-list-with-filters.d.ts +2 -2
  44. package/dist/components/index.d.ts +30 -3
  45. package/dist/components/pages/about/about-page.d.ts +5 -0
  46. package/dist/components/pages/about/about-page.js +161 -0
  47. package/dist/components/pages/about/about-page.js.map +1 -0
  48. package/dist/components/pages/admin/admin-page.d.ts +2 -2
  49. package/dist/components/pages/admin/admin-page.js +4 -1
  50. package/dist/components/pages/admin/admin-page.js.map +1 -1
  51. package/dist/components/pages/author/author-page.d.ts +8 -0
  52. package/dist/components/pages/author/author-page.js +107 -0
  53. package/dist/components/pages/author/author-page.js.map +1 -0
  54. package/dist/components/pages/authors/authors-page.d.ts +5 -0
  55. package/dist/components/pages/authors/authors-page.js +25 -0
  56. package/dist/components/pages/authors/authors-page.js.map +1 -0
  57. package/dist/components/pages/blogpost/blogpost.d.ts +5 -2
  58. package/dist/components/pages/blogpost/blogpost.js +38 -18
  59. package/dist/components/pages/blogpost/blogpost.js.map +1 -1
  60. package/dist/components/pages/categories/categories-page.d.ts +5 -0
  61. package/dist/components/pages/categories/categories-page.js +33 -0
  62. package/dist/components/pages/categories/categories-page.js.map +1 -0
  63. package/dist/components/pages/category/category-page.d.ts +2 -2
  64. package/dist/components/pages/category/category-page.js +3 -1
  65. package/dist/components/pages/category/category-page.js.map +1 -1
  66. package/dist/components/pages/chat/chat-page.d.ts +2 -2
  67. package/dist/components/pages/contact/contact-page.d.ts +5 -0
  68. package/dist/components/pages/contact/contact-page.js +173 -0
  69. package/dist/components/pages/contact/contact-page.js.map +1 -0
  70. package/dist/components/pages/content-blocks/content-blocks-page.d.ts +5 -0
  71. package/dist/components/pages/content-blocks/content-blocks-page.js +86 -0
  72. package/dist/components/pages/content-blocks/content-blocks-page.js.map +1 -0
  73. package/dist/components/pages/extras/extras-hub-page.d.ts +10 -0
  74. package/dist/components/pages/extras/extras-hub-page.js +110 -0
  75. package/dist/components/pages/extras/extras-hub-page.js.map +1 -0
  76. package/dist/components/pages/index.d.ts +15 -1
  77. package/dist/components/pages/index.js +12 -0
  78. package/dist/components/pages/index.js.map +1 -1
  79. package/dist/components/pages/login/login-page.d.ts +2 -2
  80. package/dist/components/pages/login/login-page.js +19 -69
  81. package/dist/components/pages/login/login-page.js.map +1 -1
  82. package/dist/components/pages/maintenance/maintenance-page.d.ts +2 -2
  83. package/dist/components/pages/membership/membership-page.d.ts +5 -0
  84. package/dist/components/pages/membership/membership-page.js +131 -0
  85. package/dist/components/pages/membership/membership-page.js.map +1 -0
  86. package/dist/components/pages/mosaic/mosaic-page.d.ts +5 -0
  87. package/dist/components/pages/mosaic/mosaic-page.js +81 -0
  88. package/dist/components/pages/mosaic/mosaic-page.js.map +1 -0
  89. package/dist/components/pages/newsletter/newsletter-page.d.ts +5 -0
  90. package/dist/components/pages/newsletter/newsletter-page.js +148 -0
  91. package/dist/components/pages/newsletter/newsletter-page.js.map +1 -0
  92. package/dist/components/pages/not-found/not-found.d.ts +2 -2
  93. package/dist/components/pages/privacy/privacy-page.d.ts +2 -2
  94. package/dist/components/pages/resources/resources-page.d.ts +5 -0
  95. package/dist/components/pages/resources/resources-page.js +24 -0
  96. package/dist/components/pages/resources/resources-page.js.map +1 -0
  97. package/dist/components/pages/search/search-page.d.ts +2 -2
  98. package/dist/components/pages/startpage/startpage.d.ts +2 -2
  99. package/dist/components/pages/startpage/startpage.js +6 -4
  100. package/dist/components/pages/startpage/startpage.js.map +1 -1
  101. package/dist/components/pages/terms/terms-page.d.ts +2 -2
  102. package/dist/components/primitives/accordion/accordion.d.ts +5 -5
  103. package/dist/components/primitives/accordion/accordion.js +14 -16
  104. package/dist/components/primitives/accordion/accordion.js.map +1 -1
  105. package/dist/components/primitives/alert/alert.d.ts +4 -5
  106. package/dist/components/primitives/avatar/avatar.d.ts +6 -7
  107. package/dist/components/primitives/badge/badge.js +1 -1
  108. package/dist/components/primitives/badge/badge.js.map +1 -1
  109. package/dist/components/primitives/badge/badges.d.ts +1 -2
  110. package/dist/components/primitives/buttons/button.d.ts +4 -4
  111. package/dist/components/primitives/buttons/icon-button.d.ts +3 -3
  112. package/dist/components/primitives/buttons/link-button.d.ts +2 -3
  113. package/dist/components/primitives/collapsible/collapsible.d.ts +3 -4
  114. package/dist/components/primitives/collapsible/collapsible.js +4 -1
  115. package/dist/components/primitives/collapsible/collapsible.js.map +1 -1
  116. package/dist/components/primitives/dropdown-menu/dropdown-menu.d.ts +1 -2
  117. package/dist/components/primitives/dropdown-menu/dropdown-menu.js +6 -1
  118. package/dist/components/primitives/dropdown-menu/dropdown-menu.js.map +1 -1
  119. package/dist/components/primitives/forms/checkbox.d.ts +2 -2
  120. package/dist/components/primitives/forms/checkbox.js +1 -1
  121. package/dist/components/primitives/forms/checkbox.js.map +1 -1
  122. package/dist/components/primitives/forms/field.d.ts +14 -13
  123. package/dist/components/primitives/forms/field.js +4 -2
  124. package/dist/components/primitives/forms/field.js.map +1 -1
  125. package/dist/components/primitives/forms/form-control.d.ts +28 -0
  126. package/dist/components/primitives/forms/form-control.js +40 -0
  127. package/dist/components/primitives/forms/form-control.js.map +1 -0
  128. package/dist/components/primitives/forms/form.d.ts +12 -0
  129. package/dist/components/primitives/forms/form.js +30 -0
  130. package/dist/components/primitives/forms/form.js.map +1 -0
  131. package/dist/components/primitives/forms/input.d.ts +1 -2
  132. package/dist/components/primitives/forms/select.d.ts +7 -8
  133. package/dist/components/primitives/forms/select.js +12 -12
  134. package/dist/components/primitives/forms/select.js.map +1 -1
  135. package/dist/components/primitives/forms/textarea.d.ts +1 -2
  136. package/dist/components/primitives/icon/icon.d.ts +4 -4
  137. package/dist/components/primitives/icon/icon.js +2 -1
  138. package/dist/components/primitives/icon/icon.js.map +1 -1
  139. package/dist/components/primitives/index.d.ts +6 -3
  140. package/dist/components/primitives/index.js +3 -0
  141. package/dist/components/primitives/index.js.map +1 -1
  142. package/dist/components/primitives/label/label.d.ts +1 -2
  143. package/dist/components/primitives/layout/layout.d.ts +5 -4
  144. package/dist/components/primitives/layout/layout.js.map +1 -1
  145. package/dist/components/primitives/link/link.d.ts +4 -5
  146. package/dist/components/primitives/separator/separator.d.ts +2 -2
  147. package/dist/components/primitives/sheet/sheet.d.ts +2 -3
  148. package/dist/components/primitives/sheet/sheet.js +1 -1
  149. package/dist/components/primitives/sheet/sheet.js.map +1 -1
  150. package/dist/components/primitives/skeleton/skeleton.d.ts +2 -2
  151. package/dist/components/primitives/sonner/sonner.d.ts +2 -2
  152. package/dist/components/primitives/spinner/spinner.d.ts +2 -2
  153. package/dist/components/primitives/stack/stack.d.ts +47 -3
  154. package/dist/components/primitives/stack/stack.js +44 -42
  155. package/dist/components/primitives/stack/stack.js.map +1 -1
  156. package/dist/components/primitives/text/heading.d.ts +2 -3
  157. package/dist/components/primitives/text/internal/text-element.d.ts +9 -4
  158. package/dist/components/primitives/text/internal/text-element.js +3 -0
  159. package/dist/components/primitives/text/internal/text-element.js.map +1 -1
  160. package/dist/components/primitives/text/text-code.d.ts +3 -3
  161. package/dist/components/primitives/text/text-div.d.ts +2 -3
  162. package/dist/components/primitives/text/text-span.d.ts +2 -3
  163. package/dist/components/primitives/text/text-time.d.ts +2 -3
  164. package/dist/components/primitives/text/text.d.ts +2 -3
  165. package/dist/components/primitives/ui-image/ui-image.d.ts +2 -3
  166. package/dist/components/primitives/ui-link/ui-link.d.ts +2 -3
  167. package/dist/components/providers/SingularityContext.d.ts +0 -1
  168. package/dist/components/providers/auth-provider.d.ts +2 -2
  169. package/dist/components/providers/index.d.ts +0 -1
  170. package/dist/components/providers/theme-provider.d.ts +1 -2
  171. package/dist/components/templates/container/container.d.ts +4 -5
  172. package/dist/components/templates/footer/footer.d.ts +2 -2
  173. package/dist/components/templates/form/form.d.ts +2 -2
  174. package/dist/components/templates/hero/hero.d.ts +2 -2
  175. package/dist/components/templates/index.d.ts +1 -1
  176. package/dist/components/templates/index.js +1 -0
  177. package/dist/components/templates/index.js.map +1 -1
  178. package/dist/components/templates/loading-screen/loading-screen.d.ts +10 -0
  179. package/dist/components/templates/loading-screen/loading-screen.js +39 -0
  180. package/dist/components/templates/loading-screen/loading-screen.js.map +1 -0
  181. package/dist/components/templates/navigation/header.d.ts +1 -2
  182. package/dist/components/templates/navigation/index.d.ts +0 -1
  183. package/dist/css/variables.css +2 -0
  184. package/dist/css/variables.css.map +1 -1
  185. package/dist/data/posts.d.ts +5 -0
  186. package/dist/data/posts.js +37 -4
  187. package/dist/data/posts.js.map +1 -1
  188. package/dist/index.d.ts +30 -3
  189. package/dist/lib/forms/field-props.d.ts +60 -0
  190. package/dist/lib/forms/field-props.js +60 -0
  191. package/dist/lib/forms/field-props.js.map +1 -0
  192. package/dist/lib/forms/index.d.ts +11 -0
  193. package/dist/lib/forms/index.js +3 -0
  194. package/dist/lib/forms/index.js.map +1 -0
  195. package/dist/lib/forms/tanstack-field.d.ts +56 -0
  196. package/dist/lib/forms/tanstack-field.js +114 -0
  197. package/dist/lib/forms/tanstack-field.js.map +1 -0
  198. package/dist/lib/index.d.ts +11 -0
  199. package/dist/lib/index.js +1 -0
  200. package/dist/lib/index.js.map +1 -1
  201. package/dist/main.css +442 -117
  202. package/dist/main.css.map +1 -1
  203. package/package.json +64 -39
@@ -0,0 +1,86 @@
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
+ Alert,
9
+ AlertDescription,
10
+ AlertTitle,
11
+ Accordion,
12
+ AccordionContent,
13
+ AccordionItem,
14
+ AccordionTrigger
15
+ } from "../../primitives/index.js";
16
+ import { LinkButton } from "../../primitives/buttons/link-button.js";
17
+ import { PageHero } from "../../blocks/marketing/page-hero.js";
18
+ import { Card, CardContent } from "../../blocks/cards/card.js";
19
+ import { TextCode } from "../../primitives/text/text-code.js";
20
+ function ContentBlocksPage() {
21
+ return /* @__PURE__ */ jsxs(
22
+ motion.div,
23
+ {
24
+ initial: { opacity: 0, y: 20 },
25
+ animate: { opacity: 1, y: 0 },
26
+ transition: { duration: 0.3 },
27
+ children: [
28
+ /* @__PURE__ */ jsx(
29
+ PageHero,
30
+ {
31
+ icon: "Layers",
32
+ title: "Content Blocks",
33
+ description: "Reusable editorial patterns for articles and marketing pages."
34
+ }
35
+ ),
36
+ /* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-16", children: /* @__PURE__ */ jsxs(Layout.Col1, { hideDiv: true, className: "sg:max-w-3xl sg:space-y-12", children: [
37
+ /* @__PURE__ */ jsxs("section", { className: "sg:space-y-4", children: [
38
+ /* @__PURE__ */ jsx(Heading, { variant: "h2", children: "Callouts" }),
39
+ /* @__PURE__ */ jsxs(Alert, { children: [
40
+ /* @__PURE__ */ jsx(AlertTitle, { children: "Info" }),
41
+ /* @__PURE__ */ jsx(AlertDescription, { children: "Use callouts to highlight tips, warnings, or key takeaways." })
42
+ ] })
43
+ ] }),
44
+ /* @__PURE__ */ jsxs("section", { className: "sg:space-y-4", children: [
45
+ /* @__PURE__ */ jsx(Heading, { variant: "h2", children: "Code Snippets" }),
46
+ /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardContent, { className: "sg:pt-6", children: /* @__PURE__ */ jsx(TextCode, { children: `const featured = posts.filter((p) => p.featured);` }) }) })
47
+ ] }),
48
+ /* @__PURE__ */ jsxs("section", { className: "sg:space-y-4", children: [
49
+ /* @__PURE__ */ jsx(Heading, { variant: "h2", children: "Quote Block" }),
50
+ /* @__PURE__ */ jsxs("blockquote", { className: "sg:border-l-4 sg:border-primary sg:pl-6 sg:py-2", children: [
51
+ /* @__PURE__ */ jsx(Text, { size: "lg", className: "sg:italic", children: '"Design is not just what it looks like \u2014 design is how it works."' }),
52
+ /* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", className: "sg:mt-2", children: "\u2014 Steve Jobs" })
53
+ ] })
54
+ ] }),
55
+ /* @__PURE__ */ jsxs("section", { className: "sg:space-y-4", children: [
56
+ /* @__PURE__ */ jsx(Heading, { variant: "h2", children: "FAQ Accordion" }),
57
+ /* @__PURE__ */ jsxs(Accordion, { multiple: false, "aria-label": "Content blocks FAQ", children: [
58
+ /* @__PURE__ */ jsxs(AccordionItem, { value: "item-1", children: [
59
+ /* @__PURE__ */ jsx(AccordionTrigger, { children: "What are content blocks?" }),
60
+ /* @__PURE__ */ jsx(AccordionContent, { children: "Reusable UI patterns for editorial and marketing content." })
61
+ ] }),
62
+ /* @__PURE__ */ jsxs(AccordionItem, { value: "item-2", children: [
63
+ /* @__PURE__ */ jsx(AccordionTrigger, { children: "How do I use them?" }),
64
+ /* @__PURE__ */ jsx(AccordionContent, { children: "Import the block components and compose them in your pages." })
65
+ ] })
66
+ ] })
67
+ ] }),
68
+ /* @__PURE__ */ jsxs("section", { className: "sg:space-y-4", children: [
69
+ /* @__PURE__ */ jsx(Heading, { variant: "h2", children: "Inline CTA" }),
70
+ /* @__PURE__ */ jsx(Card, { className: "sg:bg-primary/5 sg:border-primary/20", children: /* @__PURE__ */ jsxs(CardContent, { className: "sg:py-6 sg:flex sg:flex-col sm:sg:flex-row sg:items-center sg:justify-between sg:gap-4", children: [
71
+ /* @__PURE__ */ jsxs("div", { children: [
72
+ /* @__PURE__ */ jsx(Heading, { variant: "h4", children: "Stay in the loop" }),
73
+ /* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", children: "Get curated stories delivered weekly." })
74
+ ] }),
75
+ /* @__PURE__ */ jsx(LinkButton, { to: "/extras/newsletter", children: "Subscribe" })
76
+ ] }) })
77
+ ] })
78
+ ] }) })
79
+ ]
80
+ }
81
+ );
82
+ }
83
+ export {
84
+ ContentBlocksPage
85
+ };
86
+ //# sourceMappingURL=content-blocks-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/pages/content-blocks/content-blocks-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\tAlert,\r\n\tAlertDescription,\r\n\tAlertTitle,\r\n\tAccordion,\r\n\tAccordionContent,\r\n\tAccordionItem,\r\n\tAccordionTrigger,\r\n} from \"../../primitives/index\";\r\nimport { LinkButton } from \"../../primitives/buttons/link-button\";\r\nimport { PageHero } from \"../../blocks/marketing/page-hero\";\r\nimport { Card, CardContent } from \"../../blocks/cards/card\";\r\nimport { TextCode } from \"../../primitives/text/text-code\";\r\n\r\nexport function ContentBlocksPage() {\r\n\treturn (\r\n\t\t<motion.div\r\n\t\t\tinitial={{ opacity: 0, y: 20 }}\r\n\t\t\tanimate={{ opacity: 1, y: 0 }}\r\n\t\t\ttransition={{ duration: 0.3 }}\r\n\t\t>\r\n\t\t\t<PageHero\r\n\t\t\t\ticon=\"Layers\"\r\n\t\t\t\ttitle=\"Content Blocks\"\r\n\t\t\t\tdescription=\"Reusable editorial patterns for articles and marketing pages.\"\r\n\t\t\t/>\r\n\r\n\t\t\t<Layout type=\"col\" className=\"sg:py-16\">\r\n\t\t\t\t<Layout.Col1 hideDiv className=\"sg:max-w-3xl sg:space-y-12\">\r\n\t\t\t\t\t<section className=\"sg:space-y-4\">\r\n\t\t\t\t\t\t<Heading variant=\"h2\">Callouts</Heading>\r\n\t\t\t\t\t\t<Alert>\r\n\t\t\t\t\t\t\t<AlertTitle>Info</AlertTitle>\r\n\t\t\t\t\t\t\t<AlertDescription>\r\n\t\t\t\t\t\t\t\tUse callouts to highlight tips, warnings, or key takeaways.\r\n\t\t\t\t\t\t\t</AlertDescription>\r\n\t\t\t\t\t\t</Alert>\r\n\t\t\t\t\t</section>\r\n\r\n\t\t\t\t\t<section className=\"sg:space-y-4\">\r\n\t\t\t\t\t\t<Heading variant=\"h2\">Code Snippets</Heading>\r\n\t\t\t\t\t\t<Card>\r\n\t\t\t\t\t\t\t<CardContent className=\"sg:pt-6\">\r\n\t\t\t\t\t\t\t\t<TextCode>{`const featured = posts.filter((p) => p.featured);`}</TextCode>\r\n\t\t\t\t\t\t\t</CardContent>\r\n\t\t\t\t\t\t</Card>\r\n\t\t\t\t\t</section>\r\n\r\n\t\t\t\t\t<section className=\"sg:space-y-4\">\r\n\t\t\t\t\t\t<Heading variant=\"h2\">Quote Block</Heading>\r\n\t\t\t\t\t\t<blockquote className=\"sg:border-l-4 sg:border-primary sg:pl-6 sg:py-2\">\r\n\t\t\t\t\t\t\t<Text size=\"lg\" className=\"sg:italic\">\r\n\t\t\t\t\t\t\t\t&quot;Design is not just what it looks like — design is how it works.&quot;\r\n\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t<Text size=\"sm\" foreground=\"muted-foreground\" className=\"sg:mt-2\">\r\n\t\t\t\t\t\t\t\t— Steve Jobs\r\n\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t</blockquote>\r\n\t\t\t\t\t</section>\r\n\r\n\t\t\t\t\t<section className=\"sg:space-y-4\">\r\n\t\t\t\t\t\t<Heading variant=\"h2\">FAQ Accordion</Heading>\r\n\t\t\t\t\t\t<Accordion multiple={false} aria-label=\"Content blocks FAQ\">\r\n\t\t\t\t\t\t\t<AccordionItem value=\"item-1\">\r\n\t\t\t\t\t\t\t\t<AccordionTrigger>What are content blocks?</AccordionTrigger>\r\n\t\t\t\t\t\t\t\t<AccordionContent>\r\n\t\t\t\t\t\t\t\t\tReusable UI patterns for editorial and marketing content.\r\n\t\t\t\t\t\t\t\t</AccordionContent>\r\n\t\t\t\t\t\t\t</AccordionItem>\r\n\t\t\t\t\t\t\t<AccordionItem value=\"item-2\">\r\n\t\t\t\t\t\t\t\t<AccordionTrigger>How do I use them?</AccordionTrigger>\r\n\t\t\t\t\t\t\t\t<AccordionContent>\r\n\t\t\t\t\t\t\t\t\tImport the block components and compose them in your pages.\r\n\t\t\t\t\t\t\t\t</AccordionContent>\r\n\t\t\t\t\t\t\t</AccordionItem>\r\n\t\t\t\t\t\t</Accordion>\r\n\t\t\t\t\t</section>\r\n\r\n\t\t\t\t\t<section className=\"sg:space-y-4\">\r\n\t\t\t\t\t\t<Heading variant=\"h2\">Inline CTA</Heading>\r\n\t\t\t\t\t\t<Card className=\"sg:bg-primary/5 sg:border-primary/20\">\r\n\t\t\t\t\t\t\t<CardContent className=\"sg:py-6 sg:flex sg:flex-col sm:sg:flex-row sg:items-center sg:justify-between sg:gap-4\">\r\n\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t<Heading variant=\"h4\">Stay in the loop</Heading>\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\tGet curated stories delivered weekly.\r\n\t\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t<LinkButton to=\"/extras/newsletter\">Subscribe</LinkButton>\r\n\t\t\t\t\t\t\t</CardContent>\r\n\t\t\t\t\t\t</Card>\r\n\t\t\t\t\t</section>\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":";AA2BG,cAUG,YAVH;AAzBH,SAAS,cAAc;AACvB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,SAAS,MAAM,mBAAmB;AAClC,SAAS,gBAAgB;AAElB,SAAS,oBAAoB;AACnC,SACC;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;AAAA,UAAC;AAAA;AAAA,YACA,MAAK;AAAA,YACL,OAAM;AAAA,YACN,aAAY;AAAA;AAAA,QACb;AAAA,QAEA,oBAAC,UAAO,MAAK,OAAM,WAAU,YAC5B,+BAAC,OAAO,MAAP,EAAY,SAAO,MAAC,WAAU,8BAC9B;AAAA,+BAAC,aAAQ,WAAU,gBAClB;AAAA,gCAAC,WAAQ,SAAQ,MAAK,sBAAQ;AAAA,YAC9B,qBAAC,SACA;AAAA,kCAAC,cAAW,kBAAI;AAAA,cAChB,oBAAC,oBAAiB,yEAElB;AAAA,eACD;AAAA,aACD;AAAA,UAEA,qBAAC,aAAQ,WAAU,gBAClB;AAAA,gCAAC,WAAQ,SAAQ,MAAK,2BAAa;AAAA,YACnC,oBAAC,QACA,8BAAC,eAAY,WAAU,WACtB,8BAAC,YAAU,+DAAoD,GAChE,GACD;AAAA,aACD;AAAA,UAEA,qBAAC,aAAQ,WAAU,gBAClB;AAAA,gCAAC,WAAQ,SAAQ,MAAK,yBAAW;AAAA,YACjC,qBAAC,gBAAW,WAAU,mDACrB;AAAA,kCAAC,QAAK,MAAK,MAAK,WAAU,aAAY,oFAEtC;AAAA,cACA,oBAAC,QAAK,MAAK,MAAK,YAAW,oBAAmB,WAAU,WAAU,+BAElE;AAAA,eACD;AAAA,aACD;AAAA,UAEA,qBAAC,aAAQ,WAAU,gBAClB;AAAA,gCAAC,WAAQ,SAAQ,MAAK,2BAAa;AAAA,YACnC,qBAAC,aAAU,UAAU,OAAO,cAAW,sBACtC;AAAA,mCAAC,iBAAc,OAAM,UACpB;AAAA,oCAAC,oBAAiB,sCAAwB;AAAA,gBAC1C,oBAAC,oBAAiB,uEAElB;AAAA,iBACD;AAAA,cACA,qBAAC,iBAAc,OAAM,UACpB;AAAA,oCAAC,oBAAiB,gCAAkB;AAAA,gBACpC,oBAAC,oBAAiB,yEAElB;AAAA,iBACD;AAAA,eACD;AAAA,aACD;AAAA,UAEA,qBAAC,aAAQ,WAAU,gBAClB;AAAA,gCAAC,WAAQ,SAAQ,MAAK,wBAAU;AAAA,YAChC,oBAAC,QAAK,WAAU,wCACf,+BAAC,eAAY,WAAU,0FACtB;AAAA,mCAAC,SACA;AAAA,oCAAC,WAAQ,SAAQ,MAAK,8BAAgB;AAAA,gBACtC,oBAAC,QAAK,MAAK,MAAK,YAAW,oBAAmB,mDAE9C;AAAA,iBACD;AAAA,cACA,oBAAC,cAAW,IAAG,sBAAqB,uBAAS;AAAA,eAC9C,GACD;AAAA,aACD;AAAA,WACD,GACD;AAAA;AAAA;AAAA,EACD;AAEF;","names":[]}
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import { ExtrasHubItem } from '../../blocks/extras/extras-hub-card.js';
3
+ import 'lucide-react';
4
+
5
+ type Props = {
6
+ items?: ExtrasHubItem[];
7
+ };
8
+ declare function ExtrasHubPage({ items }: Props): React.JSX.Element;
9
+
10
+ export { ExtrasHubPage };
@@ -0,0 +1,110 @@
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 { ExtrasHubCard } from "../../blocks/extras/extras-hub-card.js";
6
+ const defaultItems = [
7
+ {
8
+ title: "About",
9
+ description: "Our mission, story, team, and journey.",
10
+ to: "/extras/about",
11
+ icon: "Info"
12
+ },
13
+ {
14
+ title: "Contact",
15
+ description: "Get in touch \u2014 form, map, and social links.",
16
+ to: "/extras/contact",
17
+ icon: "Mail"
18
+ },
19
+ {
20
+ title: "Newsletter",
21
+ description: "Subscribe for weekly curated stories and exclusive content.",
22
+ to: "/extras/newsletter",
23
+ icon: "Newspaper"
24
+ },
25
+ {
26
+ title: "Membership",
27
+ description: "Premium plans, benefits comparison, and pricing.",
28
+ to: "/extras/membership",
29
+ icon: "Crown"
30
+ },
31
+ {
32
+ title: "Content Blocks",
33
+ description: "Callouts, code snippets, quotes, tables, CTAs, and more.",
34
+ to: "/extras/content-blocks",
35
+ icon: "Layers"
36
+ },
37
+ {
38
+ title: "Resources",
39
+ description: "Curated links, tools, and references for creators.",
40
+ to: "/extras/resources",
41
+ icon: "Sparkles"
42
+ },
43
+ {
44
+ title: "Mosaic",
45
+ description: "A visual mosaic of images from our blog posts.",
46
+ to: "/extras/showcase",
47
+ icon: "Palette"
48
+ },
49
+ {
50
+ title: "Authors",
51
+ description: "Meet the writers behind the stories.",
52
+ to: "/extras/authors",
53
+ icon: "Users"
54
+ },
55
+ {
56
+ title: "Categories",
57
+ description: "Browse all post categories in one place.",
58
+ to: "/extras/categories",
59
+ icon: "Tag"
60
+ },
61
+ {
62
+ title: "Search",
63
+ description: "Find posts by keyword, category, or author with flexible filters.",
64
+ to: "/extras/search",
65
+ icon: "Search"
66
+ },
67
+ {
68
+ title: "Search (Compact)",
69
+ description: "Same search with filters always in a slide-out drawer.",
70
+ to: "/extras/search-compact",
71
+ icon: "Search"
72
+ },
73
+ {
74
+ title: "Chat",
75
+ description: "AI chatbot demo with conversational interface.",
76
+ to: "/extras/chat",
77
+ icon: "MessageCircle"
78
+ },
79
+ {
80
+ title: "Privacy Policy",
81
+ description: "How we handle your data and protect your privacy.",
82
+ to: "/extras/privacy",
83
+ icon: "Shield"
84
+ },
85
+ {
86
+ title: "Terms of Service",
87
+ description: "Rules and conditions for using the site.",
88
+ to: "/extras/terms",
89
+ icon: "FileText"
90
+ }
91
+ ];
92
+ function ExtrasHubPage({ items = defaultItems }) {
93
+ 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(
94
+ motion.div,
95
+ {
96
+ initial: { opacity: 0, y: 20 },
97
+ animate: { opacity: 1, y: 0 },
98
+ transition: { duration: 0.3 },
99
+ children: [
100
+ /* @__PURE__ */ jsx(Heading, { variant: "h1", className: "sg:mb-2", children: "Extras" }),
101
+ /* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:mb-10", children: "Bonus content and additional pages." }),
102
+ /* @__PURE__ */ jsx("div", { className: "sg:grid sg:gap-4 sm:sg:grid-cols-2", children: items.map((item) => /* @__PURE__ */ jsx(ExtrasHubCard, { item }, item.to)) })
103
+ ]
104
+ }
105
+ ) }) });
106
+ }
107
+ export {
108
+ ExtrasHubPage
109
+ };
110
+ //# sourceMappingURL=extras-hub-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/pages/extras/extras-hub-page.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { motion } from \"framer-motion\";\r\nimport { Layout, Heading, Text } from \"../../primitives/index\";\r\nimport { ExtrasHubCard, type ExtrasHubItem } from \"../../blocks/extras/extras-hub-card\";\r\n\r\nconst defaultItems: ExtrasHubItem[] = [\r\n\t{\r\n\t\ttitle: \"About\",\r\n\t\tdescription: \"Our mission, story, team, and journey.\",\r\n\t\tto: \"/extras/about\",\r\n\t\ticon: \"Info\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Contact\",\r\n\t\tdescription: \"Get in touch — form, map, and social links.\",\r\n\t\tto: \"/extras/contact\",\r\n\t\ticon: \"Mail\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Newsletter\",\r\n\t\tdescription: \"Subscribe for weekly curated stories and exclusive content.\",\r\n\t\tto: \"/extras/newsletter\",\r\n\t\ticon: \"Newspaper\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Membership\",\r\n\t\tdescription: \"Premium plans, benefits comparison, and pricing.\",\r\n\t\tto: \"/extras/membership\",\r\n\t\ticon: \"Crown\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Content Blocks\",\r\n\t\tdescription: \"Callouts, code snippets, quotes, tables, CTAs, and more.\",\r\n\t\tto: \"/extras/content-blocks\",\r\n\t\ticon: \"Layers\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Resources\",\r\n\t\tdescription: \"Curated links, tools, and references for creators.\",\r\n\t\tto: \"/extras/resources\",\r\n\t\ticon: \"Sparkles\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Mosaic\",\r\n\t\tdescription: \"A visual mosaic of images from our blog posts.\",\r\n\t\tto: \"/extras/showcase\",\r\n\t\ticon: \"Palette\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Authors\",\r\n\t\tdescription: \"Meet the writers behind the stories.\",\r\n\t\tto: \"/extras/authors\",\r\n\t\ticon: \"Users\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Categories\",\r\n\t\tdescription: \"Browse all post categories in one place.\",\r\n\t\tto: \"/extras/categories\",\r\n\t\ticon: \"Tag\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Search\",\r\n\t\tdescription: \"Find posts by keyword, category, or author with flexible filters.\",\r\n\t\tto: \"/extras/search\",\r\n\t\ticon: \"Search\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Search (Compact)\",\r\n\t\tdescription: \"Same search with filters always in a slide-out drawer.\",\r\n\t\tto: \"/extras/search-compact\",\r\n\t\ticon: \"Search\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Chat\",\r\n\t\tdescription: \"AI chatbot demo with conversational interface.\",\r\n\t\tto: \"/extras/chat\",\r\n\t\ticon: \"MessageCircle\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Privacy Policy\",\r\n\t\tdescription: \"How we handle your data and protect your privacy.\",\r\n\t\tto: \"/extras/privacy\",\r\n\t\ticon: \"Shield\",\r\n\t},\r\n\t{\r\n\t\ttitle: \"Terms of Service\",\r\n\t\tdescription: \"Rules and conditions for using the site.\",\r\n\t\tto: \"/extras/terms\",\r\n\t\ticon: \"FileText\",\r\n\t},\r\n];\r\n\r\ntype Props = {\r\n\titems?: ExtrasHubItem[];\r\n};\r\n\r\nexport function ExtrasHubPage({ items = defaultItems }: Props) {\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\tExtras\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\tBonus content and additional pages.\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t\t<div className=\"sg:grid sg:gap-4 sm:sg:grid-cols-2\">\r\n\t\t\t\t\t\t{items.map((item) => (\r\n\t\t\t\t\t\t\t<ExtrasHubCard key={item.to} item={item} />\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\t\t\t</Layout.Col1>\r\n\t\t</Layout>\r\n\t);\r\n}\r\n"],"mappings":";AAqGI,SAKC,KALD;AAnGJ,SAAS,cAAc;AACvB,SAAS,QAAQ,SAAS,YAAY;AACtC,SAAS,qBAAyC;AAElD,MAAM,eAAgC;AAAA,EACrC;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AACD;AAMO,SAAS,cAAc,EAAE,QAAQ,aAAa,GAAU;AAC9D,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,oBAE1C;AAAA,QACA,oBAAC,QAAK,YAAW,oBAAmB,WAAU,YAAW,iDAEzD;AAAA,QACA,oBAAC,SAAI,WAAU,sCACb,gBAAM,IAAI,CAAC,SACX,oBAAC,iBAA4B,QAAT,KAAK,EAAgB,CACzC,GACF;AAAA;AAAA;AAAA,EACD,GACD,GACD;AAEF;","names":[]}
@@ -1,11 +1,25 @@
1
+ export { AboutPage } from './about/about-page.js';
1
2
  export { AdminPage, AdminPageProps } from './admin/admin-page.js';
3
+ export { AuthorPage } from './author/author-page.js';
4
+ export { AuthorsPage } from './authors/authors-page.js';
2
5
  export { BlogPost } from './blogpost/blogpost.js';
6
+ export { CategoriesPage } from './categories/categories-page.js';
3
7
  export { CategoryPage } from './category/category-page.js';
8
+ export { ChatPage } from './chat/chat-page.js';
9
+ export { ContactPage } from './contact/contact-page.js';
10
+ export { ContentBlocksPage } from './content-blocks/content-blocks-page.js';
11
+ export { ExtrasHubPage } from './extras/extras-hub-page.js';
4
12
  export { LoginPage } from './login/login-page.js';
5
13
  export { MaintenancePage } from './maintenance/maintenance-page.js';
14
+ export { MembershipPage } from './membership/membership-page.js';
15
+ export { MosaicPage } from './mosaic/mosaic-page.js';
16
+ export { NewsletterPage } from './newsletter/newsletter-page.js';
6
17
  export { NotFound } from './not-found/not-found.js';
7
18
  export { PrivacyPage } from './privacy/privacy-page.js';
19
+ export { ResourcesPage } from './resources/resources-page.js';
8
20
  export { SearchPage } from './search/search-page.js';
9
21
  export { StartPage } from './startpage/startpage.js';
10
22
  export { TermsPage } from './terms/terms-page.js';
11
- import 'react/jsx-runtime';
23
+ import 'react';
24
+ import '../blocks/extras/extras-hub-card.js';
25
+ import 'lucide-react';
@@ -1,10 +1,22 @@
1
+ export * from "./about/about-page.js";
1
2
  export * from "./admin/admin-page.js";
3
+ export * from "./author/author-page.js";
4
+ export * from "./authors/authors-page.js";
2
5
  export * from "./blogpost/blogpost.js";
6
+ export * from "./categories/categories-page.js";
3
7
  export * from "./category/category-page.js";
8
+ export * from "./chat/chat-page.js";
9
+ export * from "./contact/contact-page.js";
10
+ export * from "./content-blocks/content-blocks-page.js";
11
+ export * from "./extras/extras-hub-page.js";
4
12
  export * from "./login/login-page.js";
5
13
  export * from "./maintenance/maintenance-page.js";
14
+ export * from "./membership/membership-page.js";
15
+ export * from "./mosaic/mosaic-page.js";
16
+ export * from "./newsletter/newsletter-page.js";
6
17
  export * from "./not-found/not-found.js";
7
18
  export * from "./privacy/privacy-page.js";
19
+ export * from "./resources/resources-page.js";
8
20
  export * from "./search/search-page.js";
9
21
  export * from "./startpage/startpage.js";
10
22
  export * from "./terms/terms-page.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/pages/index.ts"],"sourcesContent":["/**\n * Pages index\n *\n * Please keep exports sorted alphabetically by path!\n */\n\nexport * from \"./admin/admin-page\";\nexport * from \"./blogpost/blogpost\";\nexport * from \"./category/category-page\";\nexport * from \"./login/login-page\";\nexport * from \"./maintenance/maintenance-page\";\nexport * from \"./not-found/not-found\";\nexport * from \"./privacy/privacy-page\";\nexport * from \"./search/search-page\";\nexport * from \"./startpage/startpage\";\nexport * from \"./terms/terms-page\";\n"],"mappings":"AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/pages/index.ts"],"sourcesContent":["/**\n * Pages index\n *\n * Please keep exports sorted alphabetically by path!\n */\n\nexport * from \"./about/about-page\";\nexport * from \"./admin/admin-page\";\nexport * from \"./author/author-page\";\nexport * from \"./authors/authors-page\";\nexport * from \"./blogpost/blogpost\";\nexport * from \"./categories/categories-page\";\nexport * from \"./category/category-page\";\nexport * from \"./chat/chat-page\";\nexport * from \"./contact/contact-page\";\nexport * from \"./content-blocks/content-blocks-page\";\nexport * from \"./extras/extras-hub-page\";\nexport * from \"./login/login-page\";\nexport * from \"./maintenance/maintenance-page\";\nexport * from \"./membership/membership-page\";\nexport * from \"./mosaic/mosaic-page\";\nexport * from \"./newsletter/newsletter-page\";\nexport * from \"./not-found/not-found\";\nexport * from \"./privacy/privacy-page\";\nexport * from \"./resources/resources-page\";\nexport * from \"./search/search-page\";\nexport * from \"./startpage/startpage\";\nexport * from \"./terms/terms-page\";\n"],"mappings":"AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
3
  interface LoginPageProps {
4
4
  /**
@@ -14,6 +14,6 @@ interface LoginPageProps {
14
14
  */
15
15
  signUpHref?: string;
16
16
  }
17
- declare function LoginPage({ onLoginSuccess, signUpLabel, signUpHref, }: LoginPageProps): react_jsx_runtime.JSX.Element;
17
+ declare function LoginPage({ onLoginSuccess, signUpLabel, signUpHref, }: LoginPageProps): React.JSX.Element;
18
18
 
19
19
  export { LoginPage };
@@ -1,34 +1,16 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { useState } from "react";
4
- import {
5
- Layout,
6
- Button,
7
- Input,
8
- Label,
9
- Heading,
10
- Text,
11
- Link
12
- } from "../../primitives/index.js";
3
+ import { Layout, Button, Heading, Text } from "../../primitives/index.js";
13
4
  import { useToast } from "../../primitives/sonner/use-toast.js";
5
+ import { Login } from "../../blocks/login/login.js";
14
6
  import { useAuth } from "singularity-components/components/providers/auth-provider";
15
7
  function LoginPage({
16
8
  onLoginSuccess,
17
9
  signUpLabel = "Sign up",
18
10
  signUpHref = "#"
19
11
  }) {
20
- const [email, setEmail] = useState("");
21
- const [password, setPassword] = useState("");
22
12
  const { toast } = useToast();
23
13
  const { isLoggedIn, login, logout, userName } = useAuth();
24
- const handleSubmit = (e) => {
25
- e.preventDefault();
26
- login(email.split("@")[0]);
27
- toast.success("Logged in!", {
28
- description: `Welcome back, ${email}!`
29
- });
30
- onLoginSuccess?.();
31
- };
32
14
  if (isLoggedIn) {
33
15
  return /* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-20", as: "main", children: /* @__PURE__ */ jsx(Layout.Col1, { centerContent: true, children: /* @__PURE__ */ jsxs("div", { className: "sg:w-full sg:max-w-sm sg:space-y-6", children: [
34
16
  /* @__PURE__ */ jsxs(Heading, { variant: "h1", className: "sg:text-foreground", children: [
@@ -51,56 +33,24 @@ function LoginPage({
51
33
  )
52
34
  ] }) }) });
53
35
  }
54
- return /* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-20", as: "main", children: /* @__PURE__ */ jsx(Layout.Col1, { centerContent: true, children: /* @__PURE__ */ jsxs("div", { className: "sg:w-full sg:max-w-sm sg:space-y-6", children: [
55
- /* @__PURE__ */ jsxs("div", { className: "sg:text-center", children: [
56
- /* @__PURE__ */ jsx(Heading, { variant: "h1", children: "Log in" }),
57
- /* @__PURE__ */ jsx(Text, { className: "sg:mt-2", foreground: "muted-foreground", children: "Welcome back to Storied." })
58
- ] }),
59
- /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "sg:space-y-4", children: [
60
- /* @__PURE__ */ jsxs("div", { className: "sg:space-y-2", children: [
61
- /* @__PURE__ */ jsx(Label, { htmlFor: "email", children: "Email" }),
62
- /* @__PURE__ */ jsx(
63
- Input,
64
- {
65
- id: "email",
66
- type: "email",
67
- placeholder: "you@example.com",
68
- value: email,
69
- onChange: (e) => setEmail(e.target.value),
70
- required: true
71
- }
72
- )
73
- ] }),
74
- /* @__PURE__ */ jsxs("div", { className: "sg:space-y-2", children: [
75
- /* @__PURE__ */ jsx(Label, { htmlFor: "password", children: "Password" }),
76
- /* @__PURE__ */ jsx(
77
- Input,
78
- {
79
- id: "password",
80
- type: "password",
81
- placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
82
- value: password,
83
- onChange: (e) => setPassword(e.target.value),
84
- required: true
85
- }
86
- )
87
- ] }),
88
- /* @__PURE__ */ jsx(Button, { type: "submit", className: "sg:w-full", children: "Log in" })
89
- ] }),
90
- /* @__PURE__ */ jsxs(
91
- Text,
92
- {
93
- size: "sm",
94
- foreground: "muted-foreground",
95
- className: "sg:text-center",
96
- children: [
97
- "Don't have an account?",
98
- " ",
99
- /* @__PURE__ */ jsx(Link, { to: signUpHref, children: signUpLabel })
100
- ]
36
+ return /* @__PURE__ */ jsx(Layout, { type: "col", className: "sg:py-20", as: "main", children: /* @__PURE__ */ jsx(Layout.Col1, { centerContent: true, children: /* @__PURE__ */ jsx(
37
+ Login,
38
+ {
39
+ description: "Welcome back to Storied.",
40
+ usernameLabel: "Email",
41
+ usernameType: "email",
42
+ usernamePlaceholder: "you@example.com",
43
+ signUpLabel,
44
+ signUpHref,
45
+ onSubmit: ({ username }) => {
46
+ login(username.split("@")[0]);
47
+ toast.success("Logged in!", {
48
+ description: `Welcome back, ${username}!`
49
+ });
50
+ onLoginSuccess?.();
101
51
  }
102
- )
103
- ] }) }) });
52
+ }
53
+ ) }) });
104
54
  }
105
55
  export {
106
56
  LoginPage
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/pages/login/login-page.tsx"],"sourcesContent":["\"use client\";\nimport { useState } from \"react\";\nimport {\n Layout,\n Button,\n Input,\n Label,\n Heading,\n Text,\n Link,\n} from \"../../primitives/index\";\nimport { useToast } from \"../../primitives/sonner/use-toast\";\nimport { useAuth } from \"singularity-components/components/providers/auth-provider\";\n\ninterface LoginPageProps {\n /**\n * Callback fired when login is successful\n */\n onLoginSuccess?: () => void;\n /**\n * Label for the \"Sign up\" link\n */\n signUpLabel?: string;\n /**\n * URL for the \"Sign up\" link\n */\n signUpHref?: string;\n}\n\nexport function LoginPage({\n onLoginSuccess,\n signUpLabel = \"Sign up\",\n signUpHref = \"#\",\n}: LoginPageProps) {\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const { toast } = useToast();\n const { isLoggedIn, login, logout, userName } = useAuth();\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n login(email.split(\"@\")[0]);\n toast.success(\"Logged in!\", {\n description: `Welcome back, ${email}!`,\n });\n onLoginSuccess?.();\n };\n\n if (isLoggedIn) {\n return (\n <Layout type=\"col\" className=\"sg:py-20\" as=\"main\">\n <Layout.Col1 centerContent>\n <div className=\"sg:w-full sg:max-w-sm sg:space-y-6\">\n <Heading variant=\"h1\" className=\"sg:text-foreground\">\n Welcome, {userName}\n </Heading>\n <Text foreground=\"muted-foreground\">\n You are currently logged in.\n </Text>\n <Button\n variant=\"outline\"\n onClick={() => {\n logout();\n toast.message(\"Logged out\", {\n description: \"See you next time!\",\n });\n }}\n >\n Log out\n </Button>\n </div>\n </Layout.Col1>\n </Layout>\n );\n }\n\n return (\n <Layout type=\"col\" className=\"sg:py-20\" as=\"main\">\n <Layout.Col1 centerContent>\n <div className=\"sg:w-full sg:max-w-sm sg:space-y-6\">\n <div className=\"sg:text-center\">\n <Heading variant=\"h1\">Log in</Heading>\n <Text className=\"sg:mt-2\" foreground=\"muted-foreground\">\n Welcome back to Storied.\n </Text>\n </div>\n\n <form onSubmit={handleSubmit} className=\"sg:space-y-4\">\n <div className=\"sg:space-y-2\">\n <Label htmlFor=\"email\">Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n />\n </div>\n <div className=\"sg:space-y-2\">\n <Label htmlFor=\"password\">Password</Label>\n <Input\n id=\"password\"\n type=\"password\"\n placeholder=\"••••••••\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n required\n />\n </div>\n <Button type=\"submit\" className=\"sg:w-full\">\n Log in\n </Button>\n </form>\n\n <Text\n size=\"sm\"\n foreground=\"muted-foreground\"\n className=\"sg:text-center\"\n >\n Don&apos;t have an account?{\" \"}\n <Link to={signUpHref}>{signUpLabel}</Link>\n </Text>\n </div>\n </Layout.Col1>\n </Layout>\n );\n}\n"],"mappings":";AAqDY,SAGA,KAHA;AApDZ,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAiBjB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AACf,GAAmB;AACjB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,EAAE,MAAM,IAAI,SAAS;AAC3B,QAAM,EAAE,YAAY,OAAO,QAAQ,SAAS,IAAI,QAAQ;AAExD,QAAM,eAAe,CAAC,MAAuB;AAC3C,MAAE,eAAe;AACjB,UAAM,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;AACzB,UAAM,QAAQ,cAAc;AAAA,MAC1B,aAAa,iBAAiB,KAAK;AAAA,IACrC,CAAC;AACD,qBAAiB;AAAA,EACnB;AAEA,MAAI,YAAY;AACd,WACE,oBAAC,UAAO,MAAK,OAAM,WAAU,YAAW,IAAG,QACzC,8BAAC,OAAO,MAAP,EAAY,eAAa,MACxB,+BAAC,SAAI,WAAU,sCACb;AAAA,2BAAC,WAAQ,SAAQ,MAAK,WAAU,sBAAqB;AAAA;AAAA,QACzC;AAAA,SACZ;AAAA,MACA,oBAAC,QAAK,YAAW,oBAAmB,0CAEpC;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,MAAM;AACb,mBAAO;AACP,kBAAM,QAAQ,cAAc;AAAA,cAC1B,aAAa;AAAA,YACf,CAAC;AAAA,UACH;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF,GACF,GACF;AAAA,EAEJ;AAEA,SACE,oBAAC,UAAO,MAAK,OAAM,WAAU,YAAW,IAAG,QACzC,8BAAC,OAAO,MAAP,EAAY,eAAa,MACxB,+BAAC,SAAI,WAAU,sCACb;AAAA,yBAAC,SAAI,WAAU,kBACb;AAAA,0BAAC,WAAQ,SAAQ,MAAK,oBAAM;AAAA,MAC5B,oBAAC,QAAK,WAAU,WAAU,YAAW,oBAAmB,sCAExD;AAAA,OACF;AAAA,IAEA,qBAAC,UAAK,UAAU,cAAc,WAAU,gBACtC;AAAA,2BAAC,SAAI,WAAU,gBACb;AAAA,4BAAC,SAAM,SAAQ,SAAQ,mBAAK;AAAA,QAC5B;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,UAAQ;AAAA;AAAA,QACV;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,gBACb;AAAA,4BAAC,SAAM,SAAQ,YAAW,sBAAQ;AAAA,QAClC;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAK;AAAA,YAC3C,UAAQ;AAAA;AAAA,QACV;AAAA,SACF;AAAA,MACA,oBAAC,UAAO,MAAK,UAAS,WAAU,aAAY,oBAE5C;AAAA,OACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAW;AAAA,QACX,WAAU;AAAA,QACX;AAAA;AAAA,UAC6B;AAAA,UAC5B,oBAAC,QAAK,IAAI,YAAa,uBAAY;AAAA;AAAA;AAAA,IACrC;AAAA,KACF,GACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/pages/login/login-page.tsx"],"sourcesContent":["\"use client\";\nimport { Layout, Button, Heading, Text } from \"../../primitives/index\";\nimport { useToast } from \"../../primitives/sonner/use-toast\";\nimport { Login } from \"../../blocks/login/login\";\nimport { useAuth } from \"singularity-components/components/providers/auth-provider\";\n\ninterface LoginPageProps {\n /**\n * Callback fired when login is successful\n */\n onLoginSuccess?: () => void;\n /**\n * Label for the \"Sign up\" link\n */\n signUpLabel?: string;\n /**\n * URL for the \"Sign up\" link\n */\n signUpHref?: string;\n}\n\nexport function LoginPage({\n onLoginSuccess,\n signUpLabel = \"Sign up\",\n signUpHref = \"#\",\n}: LoginPageProps) {\n const { toast } = useToast();\n const { isLoggedIn, login, logout, userName } = useAuth();\n\n if (isLoggedIn) {\n return (\n <Layout type=\"col\" className=\"sg:py-20\" as=\"main\">\n <Layout.Col1 centerContent>\n <div className=\"sg:w-full sg:max-w-sm sg:space-y-6\">\n <Heading variant=\"h1\" className=\"sg:text-foreground\">\n Welcome, {userName}\n </Heading>\n <Text foreground=\"muted-foreground\">\n You are currently logged in.\n </Text>\n <Button\n variant=\"outline\"\n onClick={() => {\n logout();\n toast.message(\"Logged out\", {\n description: \"See you next time!\",\n });\n }}\n >\n Log out\n </Button>\n </div>\n </Layout.Col1>\n </Layout>\n );\n }\n\n return (\n <Layout type=\"col\" className=\"sg:py-20\" as=\"main\">\n <Layout.Col1 centerContent>\n <Login\n description=\"Welcome back to Storied.\"\n usernameLabel=\"Email\"\n usernameType=\"email\"\n usernamePlaceholder=\"you@example.com\"\n signUpLabel={signUpLabel}\n signUpHref={signUpHref}\n onSubmit={({ username }) => {\n login(username.split(\"@\")[0]);\n toast.success(\"Logged in!\", {\n description: `Welcome back, ${username}!`,\n });\n onLoginSuccess?.();\n }}\n />\n </Layout.Col1>\n </Layout>\n );\n}\n"],"mappings":";AAkCY,SAGA,KAHA;AAjCZ,SAAS,QAAQ,QAAQ,SAAS,YAAY;AAC9C,SAAS,gBAAgB;AACzB,SAAS,aAAa;AACtB,SAAS,eAAe;AAiBjB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AACf,GAAmB;AACjB,QAAM,EAAE,MAAM,IAAI,SAAS;AAC3B,QAAM,EAAE,YAAY,OAAO,QAAQ,SAAS,IAAI,QAAQ;AAExD,MAAI,YAAY;AACd,WACE,oBAAC,UAAO,MAAK,OAAM,WAAU,YAAW,IAAG,QACzC,8BAAC,OAAO,MAAP,EAAY,eAAa,MACxB,+BAAC,SAAI,WAAU,sCACb;AAAA,2BAAC,WAAQ,SAAQ,MAAK,WAAU,sBAAqB;AAAA;AAAA,QACzC;AAAA,SACZ;AAAA,MACA,oBAAC,QAAK,YAAW,oBAAmB,0CAEpC;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,MAAM;AACb,mBAAO;AACP,kBAAM,QAAQ,cAAc;AAAA,cAC1B,aAAa;AAAA,YACf,CAAC;AAAA,UACH;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF,GACF,GACF;AAAA,EAEJ;AAEA,SACE,oBAAC,UAAO,MAAK,OAAM,WAAU,YAAW,IAAG,QACzC,8BAAC,OAAO,MAAP,EAAY,eAAa,MACxB;AAAA,IAAC;AAAA;AAAA,MACC,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,cAAa;AAAA,MACb,qBAAoB;AAAA,MACpB;AAAA,MACA;AAAA,MACA,UAAU,CAAC,EAAE,SAAS,MAAM;AAC1B,cAAM,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC;AAC5B,cAAM,QAAQ,cAAc;AAAA,UAC1B,aAAa,iBAAiB,QAAQ;AAAA,QACxC,CAAC;AACD,yBAAiB;AAAA,MACnB;AAAA;AAAA,EACF,GACF,GACF;AAEJ;","names":[]}
@@ -1,5 +1,5 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
- declare function MaintenancePage(): react_jsx_runtime.JSX.Element;
3
+ declare function MaintenancePage(): React.JSX.Element;
4
4
 
5
5
  export { MaintenancePage };
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+
3
+ declare function MembershipPage(): React.JSX.Element;
4
+
5
+ export { MembershipPage };
@@ -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":";AAuFI,SACC,KADD;AArFJ,SAAS,cAAc;AACvB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,MAAM,aAAa,YAAY,WAAW,uBAAuB;AAE1E,MAAM,QAAQ;AAAA,EACb;AAAA,IACC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;AAEA,MAAM,OAAO;AAAA,EACZ;AAAA,IACC,GAAG;AAAA,IACH,GAAG;AAAA,EACJ;AAAA,EACA;AAAA,IACC,GAAG;AAAA,IACH,GAAG;AAAA,EACJ;AAAA,EACA;AAAA,IACC,GAAG;AAAA,IACH,GAAG;AAAA,EACJ;AACD;AAEO,SAAS,iBAAiB;AAChC,SACC;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,aAAQ,WAAU,gDAClB,+BAAC,SAAI,WAAU,gEACd;AAAA,8BAAC,SAAM,SAAQ,aAAY,WAAU,0CAAyC,yBAE9E;AAAA,UACA,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAAU,wBAE1C;AAAA,UACA,oBAAC,QAAK,MAAK,MAAK,YAAW,oBAAmB,WAAU,0BAAyB,sFAEjF;AAAA,WACD,GACD;AAAA,QAEA,oBAAC,UAAO,MAAK,OAAM,WAAU,YAC5B,8BAAC,OAAO,MAAP,EAAY,SAAO,MAAC,WAAU,gBAC9B,8BAAC,SAAI,WAAU,sCACb,gBAAM,IAAI,CAAC,SACX;AAAA,UAAC;AAAA;AAAA,YAEA,WACC,KAAK,WACF,4EACA;AAAA,YAGH;AAAA,mBAAK,YACL,oBAAC,SAAI,WAAU,yDACd,8BAAC,SAAM,0BAAY,GACpB;AAAA,cAED,qBAAC,cAAW,WAAU,0BACrB;AAAA,oCAAC,SAAI,WAAU,6EACd,8BAAC,QAAK,MAAM,KAAK,MAAM,WAAU,iCAAgC,GAClE;AAAA,gBACA,oBAAC,aAAW,eAAK,MAAK;AAAA,gBACtB,oBAAC,mBAAiB,eAAK,aAAY;AAAA,iBACpC;AAAA,cACA,qBAAC,eAAY,WAAU,iCACtB;AAAA,qCAAC,SAAI,WAAU,0BACd;AAAA,sCAAC,WAAQ,SAAQ,MAAK,WAAU,aAC9B,eAAK,OACP;AAAA,kBACA,oBAAC,YAAS,MAAK,MAAK,YAAW,oBAAmB,WAAU,WAC1D,eAAK,QACP;AAAA,mBACD;AAAA,gBACA,oBAAC,QAAG,WAAU,kCACZ,eAAK,SAAS,IAAI,CAAC,YACnB,qBAAC,QAAiB,WAAU,qCAC3B;AAAA,sCAAC,QAAK,MAAK,SAAQ,WAAU,uDAAsD;AAAA,kBACnF,oBAAC,QAAK,MAAK,MAAM,mBAAQ;AAAA,qBAFjB,OAGT,CACA,GACF;AAAA,gBACA,oBAAC,UAAO,SAAS,KAAK,WAAW,YAAY,WAAW,UAAQ,MAAC,yBAEjE;AAAA,iBACD;AAAA;AAAA;AAAA,UAvCK,KAAK;AAAA,QAwCX,CACA,GACF,GACD,GACD;AAAA,QAEA,oBAAC,aAAU,WAAU,2BAA0B;AAAA,QAE/C,oBAAC,UAAO,MAAK,OAAM,WAAU,YAC5B,+BAAC,OAAO,MAAP,EAAY,SAAO,MAAC,WAAU,gBAC9B;AAAA,8BAAC,WAAQ,SAAQ,MAAK,WAAU,0BAAyB,iBAEzD;AAAA,UACA,oBAAC,aAAU,UAAU,OAAO,cAAW,kBACrC,eAAK,IAAI,CAAC,KAAK,MACf,qBAAC,iBAA0B,OAAO,OAAO,CAAC,IACzC;AAAA,gCAAC,oBAAkB,cAAI,GAAE;AAAA,YACzB,oBAAC,oBAAkB,cAAI,GAAE;AAAA,eAFN,IAAI,CAGxB,CACA,GACF;AAAA,WACD,GACD;AAAA;AAAA;AAAA,EACD;AAEF;","names":[]}
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+
3
+ declare function MosaicPage(): React.JSX.Element;
4
+
5
+ export { MosaicPage };