singularity-components 0.1.140 → 0.1.193

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 (284) hide show
  1. package/README.md +36 -4
  2. package/dist/components/blocks/cards/blogpost-card.d.ts +13 -0
  3. package/dist/components/blocks/cards/blogpost-card.js +79 -0
  4. package/dist/components/blocks/cards/blogpost-card.js.map +1 -0
  5. package/dist/components/blocks/cards/card.d.ts +14 -0
  6. package/dist/components/blocks/cards/card.js +86 -0
  7. package/dist/components/blocks/cards/card.js.map +1 -0
  8. package/dist/components/blocks/empty-state/EmptyState.d.ts +15 -0
  9. package/dist/components/blocks/empty-state/EmptyState.js +36 -0
  10. package/dist/components/blocks/empty-state/EmptyState.js.map +1 -0
  11. package/dist/components/blocks/index.d.ts +5 -0
  12. package/dist/components/blocks/index.js +5 -0
  13. package/dist/components/blocks/index.js.map +1 -0
  14. package/dist/components/blocks/post-list/post-filters.d.ts +19 -0
  15. package/dist/components/blocks/post-list/post-filters.js +99 -0
  16. package/dist/components/blocks/post-list/post-filters.js.map +1 -0
  17. package/dist/components/blocks/post-list/post-list-with-filters.d.ts +19 -0
  18. package/dist/components/blocks/post-list/post-list-with-filters.js +439 -0
  19. package/dist/components/blocks/post-list/post-list-with-filters.js.map +1 -0
  20. package/dist/components/index.d.ts +43 -10
  21. package/dist/components/index.js +5 -3
  22. package/dist/components/index.js.map +1 -1
  23. package/dist/components/pages/admin/admin-page.d.ts +8 -0
  24. package/dist/components/pages/admin/admin-page.js +299 -0
  25. package/dist/components/pages/admin/admin-page.js.map +1 -0
  26. package/dist/components/pages/blogpost/blogpost.d.ts +5 -0
  27. package/dist/components/pages/blogpost/blogpost.js +440 -0
  28. package/dist/components/pages/blogpost/blogpost.js.map +1 -0
  29. package/dist/components/pages/category/category-page.d.ts +8 -0
  30. package/dist/components/pages/category/category-page.js +69 -0
  31. package/dist/components/pages/category/category-page.js.map +1 -0
  32. package/dist/components/pages/chat/chat-page.d.ts +5 -0
  33. package/dist/components/pages/chat/chat-page.js +209 -0
  34. package/dist/components/pages/chat/chat-page.js.map +1 -0
  35. package/dist/components/pages/index.d.ts +11 -0
  36. package/dist/components/pages/index.js +11 -0
  37. package/dist/components/pages/index.js.map +1 -0
  38. package/dist/components/pages/login/login-page.d.ts +19 -0
  39. package/dist/components/pages/login/login-page.js +108 -0
  40. package/dist/components/pages/login/login-page.js.map +1 -0
  41. package/dist/components/pages/maintenance/maintenance-page.d.ts +5 -0
  42. package/dist/components/pages/maintenance/maintenance-page.js +50 -0
  43. package/dist/components/pages/maintenance/maintenance-page.js.map +1 -0
  44. package/dist/components/pages/not-found/not-found.d.ts +10 -0
  45. package/dist/components/pages/not-found/not-found.js +64 -0
  46. package/dist/components/pages/not-found/not-found.js.map +1 -0
  47. package/dist/components/pages/privacy/privacy-page.d.ts +15 -0
  48. package/dist/components/pages/privacy/privacy-page.js +98 -0
  49. package/dist/components/pages/privacy/privacy-page.js.map +1 -0
  50. package/dist/components/pages/search/search-page.d.ts +5 -0
  51. package/dist/components/pages/search/search-page.js +18 -0
  52. package/dist/components/pages/search/search-page.js.map +1 -0
  53. package/dist/components/pages/startpage/startpage.d.ts +5 -0
  54. package/dist/components/pages/startpage/startpage.js +50 -0
  55. package/dist/components/pages/startpage/startpage.js.map +1 -0
  56. package/dist/components/pages/terms/terms-page.d.ts +15 -0
  57. package/dist/components/pages/terms/terms-page.js +98 -0
  58. package/dist/components/pages/terms/terms-page.js.map +1 -0
  59. package/dist/components/primitives/accordion/accordion.js +1 -1
  60. package/dist/components/primitives/accordion/accordion.js.map +1 -1
  61. package/dist/components/primitives/alert/alert.js +1 -1
  62. package/dist/components/primitives/alert/alert.js.map +1 -1
  63. package/dist/components/primitives/avatar/avatar.d.ts +14 -0
  64. package/dist/components/primitives/avatar/avatar.js +103 -0
  65. package/dist/components/primitives/avatar/avatar.js.map +1 -0
  66. package/dist/components/primitives/badge/badge.d.ts +12 -4
  67. package/dist/components/primitives/badge/badge.js +15 -15
  68. package/dist/components/primitives/badge/badge.js.map +1 -1
  69. package/dist/components/primitives/badge/badges.js +1 -1
  70. package/dist/components/primitives/badge/badges.js.map +1 -1
  71. package/dist/components/primitives/{button → buttons}/button.d.ts +15 -9
  72. package/dist/components/primitives/buttons/button.js +92 -0
  73. package/dist/components/primitives/buttons/button.js.map +1 -0
  74. package/dist/components/primitives/buttons/icon-button.d.ts +33 -0
  75. package/dist/components/primitives/buttons/icon-button.js +61 -0
  76. package/dist/components/primitives/buttons/icon-button.js.map +1 -0
  77. package/dist/components/primitives/buttons/link-button.d.ts +16 -0
  78. package/dist/components/primitives/buttons/link-button.js +35 -0
  79. package/dist/components/primitives/buttons/link-button.js.map +1 -0
  80. package/dist/components/primitives/collapsible/collapsible.d.ts +9 -0
  81. package/dist/components/primitives/collapsible/collapsible.js +53 -0
  82. package/dist/components/primitives/collapsible/collapsible.js.map +1 -0
  83. package/dist/components/primitives/dropdown-menu/dropdown-menu.d.ts +30 -0
  84. package/dist/components/primitives/dropdown-menu/dropdown-menu.js +164 -0
  85. package/dist/components/primitives/dropdown-menu/dropdown-menu.js.map +1 -0
  86. package/dist/components/primitives/forms/checkbox.d.ts +6 -0
  87. package/dist/components/primitives/forms/checkbox.js +30 -0
  88. package/dist/components/primitives/forms/checkbox.js.map +1 -0
  89. package/dist/components/primitives/forms/field.d.ts +29 -0
  90. package/dist/components/primitives/forms/field.js +218 -0
  91. package/dist/components/primitives/forms/field.js.map +1 -0
  92. package/dist/components/primitives/forms/input.d.ts +6 -0
  93. package/dist/components/primitives/forms/input.js +22 -0
  94. package/dist/components/primitives/forms/input.js.map +1 -0
  95. package/dist/components/primitives/forms/select.d.ts +22 -0
  96. package/dist/components/primitives/forms/select.js +169 -0
  97. package/dist/components/primitives/forms/select.js.map +1 -0
  98. package/dist/components/primitives/forms/textarea.d.ts +6 -0
  99. package/dist/components/primitives/forms/textarea.js +20 -0
  100. package/dist/components/primitives/forms/textarea.js.map +1 -0
  101. package/dist/components/primitives/icon/icon.d.ts +10 -3
  102. package/dist/components/primitives/icon/icon.js +15 -14
  103. package/dist/components/primitives/icon/icon.js.map +1 -1
  104. package/dist/components/primitives/index.d.ts +25 -7
  105. package/dist/components/primitives/index.js +31 -18
  106. package/dist/components/primitives/index.js.map +1 -1
  107. package/dist/components/primitives/label/label.d.ts +6 -0
  108. package/dist/components/primitives/label/label.js +22 -0
  109. package/dist/components/primitives/label/label.js.map +1 -0
  110. package/dist/components/primitives/layout/layout.d.ts +8 -4
  111. package/dist/components/primitives/layout/layout.js +35 -17
  112. package/dist/components/primitives/layout/layout.js.map +1 -1
  113. package/dist/components/primitives/link/link.d.ts +42 -0
  114. package/dist/components/primitives/link/link.js +83 -0
  115. package/dist/components/primitives/link/link.js.map +1 -0
  116. package/dist/components/primitives/separator/separator.js +1 -1
  117. package/dist/components/primitives/separator/separator.js.map +1 -1
  118. package/dist/components/primitives/sheet/sheet.d.ts +29 -0
  119. package/dist/components/primitives/sheet/sheet.js +117 -0
  120. package/dist/components/primitives/sheet/sheet.js.map +1 -0
  121. package/dist/components/primitives/skeleton/skeleton.js +1 -1
  122. package/dist/components/primitives/skeleton/skeleton.js.map +1 -1
  123. package/dist/components/primitives/sonner/sonner.d.ts +7 -0
  124. package/dist/components/primitives/sonner/sonner.js +42 -0
  125. package/dist/components/primitives/sonner/sonner.js.map +1 -0
  126. package/dist/components/primitives/sonner/use-toast.d.ts +24 -0
  127. package/dist/components/primitives/sonner/use-toast.js +21 -0
  128. package/dist/components/primitives/sonner/use-toast.js.map +1 -0
  129. package/dist/components/primitives/spinner/spinner.js +1 -1
  130. package/dist/components/primitives/spinner/spinner.js.map +1 -1
  131. package/dist/components/primitives/stack/stack.d.ts +5 -1
  132. package/dist/components/primitives/stack/stack.js +46 -5
  133. package/dist/components/primitives/stack/stack.js.map +1 -1
  134. package/dist/components/primitives/text/{text-heading.d.ts → heading.d.ts} +5 -5
  135. package/dist/components/primitives/text/heading.js +53 -0
  136. package/dist/components/primitives/text/heading.js.map +1 -0
  137. package/dist/components/primitives/text/internal/text-element.d.ts +30 -4
  138. package/dist/components/primitives/text/internal/text-element.js +24 -14
  139. package/dist/components/primitives/text/internal/text-element.js.map +1 -1
  140. package/dist/components/primitives/text/text-code.d.ts +26 -0
  141. package/dist/components/primitives/text/text-code.js +44 -0
  142. package/dist/components/primitives/text/text-code.js.map +1 -0
  143. package/dist/components/primitives/text/text-div.d.ts +1 -1
  144. package/dist/components/primitives/text/text-div.js +2 -2
  145. package/dist/components/primitives/text/text-div.js.map +1 -1
  146. package/dist/components/primitives/text/text-span.js +2 -2
  147. package/dist/components/primitives/text/text-span.js.map +1 -1
  148. package/dist/components/primitives/text/text-time.js +2 -2
  149. package/dist/components/primitives/text/text-time.js.map +1 -1
  150. package/dist/components/primitives/text/text.d.ts +16 -0
  151. package/dist/components/primitives/text/{text-paragraph.js → text.js} +16 -5
  152. package/dist/components/primitives/text/text.js.map +1 -0
  153. package/dist/components/primitives/{ui-image.d.ts → ui-image/ui-image.d.ts} +1 -1
  154. package/dist/components/primitives/{ui-image.js → ui-image/ui-image.js} +4 -7
  155. package/dist/components/primitives/ui-image/ui-image.js.map +1 -0
  156. package/dist/components/primitives/ui-link/ui-link.d.ts +8 -0
  157. package/dist/components/primitives/ui-link/ui-link.js +19 -0
  158. package/dist/components/primitives/ui-link/ui-link.js.map +1 -0
  159. package/dist/components/providers/LinkContext.d.ts +1 -1
  160. package/dist/components/providers/LinkContext.js +1 -1
  161. package/dist/components/providers/LinkContext.js.map +1 -1
  162. package/dist/components/providers/SingularityContext.d.ts +4 -1
  163. package/dist/components/providers/SingularityContext.js +7 -3
  164. package/dist/components/providers/SingularityContext.js.map +1 -1
  165. package/dist/components/providers/auth-provider.d.ts +15 -0
  166. package/dist/components/providers/auth-provider.js +30 -0
  167. package/dist/components/providers/auth-provider.js.map +1 -0
  168. package/dist/components/providers/index.d.ts +3 -0
  169. package/dist/components/providers/index.js +5 -3
  170. package/dist/components/providers/index.js.map +1 -1
  171. package/dist/components/providers/theme-provider.d.ts +27 -0
  172. package/dist/components/providers/theme-provider.js +75 -0
  173. package/dist/components/providers/theme-provider.js.map +1 -0
  174. package/dist/components/templates/container/container.d.ts +20 -0
  175. package/dist/components/templates/container/container.js +58 -0
  176. package/dist/components/templates/container/container.js.map +1 -0
  177. package/dist/components/templates/footer/footer.d.ts +5 -0
  178. package/dist/components/templates/footer/footer.js +12 -0
  179. package/dist/components/templates/footer/footer.js.map +1 -0
  180. package/dist/components/templates/form/form.d.ts +5 -0
  181. package/dist/components/templates/form/form.js +141 -0
  182. package/dist/components/templates/form/form.js.map +1 -0
  183. package/dist/components/templates/hero/hero.d.ts +18 -0
  184. package/dist/components/templates/hero/hero.js +301 -0
  185. package/dist/components/templates/hero/hero.js.map +1 -0
  186. package/dist/components/templates/index.d.ts +5 -0
  187. package/dist/components/templates/index.js +5 -0
  188. package/dist/components/templates/index.js.map +1 -0
  189. package/dist/components/templates/navigation/header.d.ts +19 -0
  190. package/dist/components/templates/navigation/header.js +222 -0
  191. package/dist/components/templates/navigation/header.js.map +1 -0
  192. package/dist/components/templates/navigation/index.d.ts +3 -0
  193. package/dist/components/templates/navigation/index.js +2 -0
  194. package/dist/components/templates/navigation/index.js.map +1 -0
  195. package/dist/css/variables.css +75 -73
  196. package/dist/css/variables.css.map +1 -1
  197. package/dist/data/authors.d.ts +12 -0
  198. package/dist/data/authors.js +33 -0
  199. package/dist/data/authors.js.map +1 -0
  200. package/dist/data/posts.d.ts +22 -0
  201. package/dist/data/posts.js +285 -0
  202. package/dist/data/posts.js.map +1 -0
  203. package/dist/index.d.ts +43 -10
  204. package/dist/index.js +1 -1
  205. package/dist/index.js.map +1 -1
  206. package/dist/lib/helpers/index.js +1 -1
  207. package/dist/lib/helpers/index.js.map +1 -1
  208. package/dist/lib/hooks/useIsClient.d.ts +3 -0
  209. package/dist/lib/hooks/useIsClient.js +14 -0
  210. package/dist/lib/hooks/useIsClient.js.map +1 -0
  211. package/dist/lib/index.d.ts +1 -0
  212. package/dist/lib/index.js +2 -1
  213. package/dist/lib/index.js.map +1 -1
  214. package/dist/lib/types.d.ts +4 -8
  215. package/dist/main.css +2026 -455
  216. package/dist/main.css.map +1 -1
  217. package/dist/{utils.js → utils/index.js} +1 -1
  218. package/dist/utils/index.js.map +1 -0
  219. package/dist/utils/index.test.js +37 -0
  220. package/dist/utils/index.test.js.map +1 -0
  221. package/package.json +80 -44
  222. package/dist/components/primitives/accordion/accordion.stories.d.ts +0 -15
  223. package/dist/components/primitives/accordion/accordion.stories.js +0 -60
  224. package/dist/components/primitives/accordion/accordion.stories.js.map +0 -1
  225. package/dist/components/primitives/alert/alert.stories.d.ts +0 -22
  226. package/dist/components/primitives/alert/alert.stories.js +0 -37
  227. package/dist/components/primitives/alert/alert.stories.js.map +0 -1
  228. package/dist/components/primitives/button/button.js +0 -56
  229. package/dist/components/primitives/button/button.js.map +0 -1
  230. package/dist/components/primitives/button/button.stories.d.ts +0 -34
  231. package/dist/components/primitives/button/button.stories.js +0 -74
  232. package/dist/components/primitives/button/button.stories.js.map +0 -1
  233. package/dist/components/primitives/button/button_with_icon_variant.js +0 -1
  234. package/dist/components/primitives/button/button_with_icon_variant.js.map +0 -1
  235. package/dist/components/primitives/icon/icon.stories.d.ts +0 -27
  236. package/dist/components/primitives/icon/icon.stories.js +0 -30
  237. package/dist/components/primitives/icon/icon.stories.js.map +0 -1
  238. package/dist/components/primitives/layout/layout.stories.d.ts +0 -32
  239. package/dist/components/primitives/layout/layout.stories.js +0 -72
  240. package/dist/components/primitives/layout/layout.stories.js.map +0 -1
  241. package/dist/components/primitives/separator/separator.stories.d.ts +0 -15
  242. package/dist/components/primitives/separator/separator.stories.js +0 -18
  243. package/dist/components/primitives/separator/separator.stories.js.map +0 -1
  244. package/dist/components/primitives/skeleton/skeleton.stories.d.ts +0 -13
  245. package/dist/components/primitives/skeleton/skeleton.stories.js +0 -16
  246. package/dist/components/primitives/skeleton/skeleton.stories.js.map +0 -1
  247. package/dist/components/primitives/spinner/spinner.stories.d.ts +0 -16
  248. package/dist/components/primitives/spinner/spinner.stories.js +0 -34
  249. package/dist/components/primitives/spinner/spinner.stories.js.map +0 -1
  250. package/dist/components/primitives/stack/stack.stories.d.ts +0 -13
  251. package/dist/components/primitives/stack/stack.stories.js +0 -26
  252. package/dist/components/primitives/stack/stack.stories.js.map +0 -1
  253. package/dist/components/primitives/text/text-div.stories.d.ts +0 -32
  254. package/dist/components/primitives/text/text-div.stories.js +0 -59
  255. package/dist/components/primitives/text/text-div.stories.js.map +0 -1
  256. package/dist/components/primitives/text/text-heading.js +0 -53
  257. package/dist/components/primitives/text/text-heading.js.map +0 -1
  258. package/dist/components/primitives/text/text-heading.stories.d.ts +0 -27
  259. package/dist/components/primitives/text/text-heading.stories.js +0 -47
  260. package/dist/components/primitives/text/text-heading.stories.js.map +0 -1
  261. package/dist/components/primitives/text/text-paragraph.d.ts +0 -10
  262. package/dist/components/primitives/text/text-paragraph.js.map +0 -1
  263. package/dist/components/primitives/text/text-span.stories.d.ts +0 -31
  264. package/dist/components/primitives/text/text-span.stories.js +0 -59
  265. package/dist/components/primitives/text/text-span.stories.js.map +0 -1
  266. package/dist/components/primitives/ui-image.js.map +0 -1
  267. package/dist/components/primitives/ui-link.d.ts +0 -6
  268. package/dist/components/primitives/ui-link.js +0 -22
  269. package/dist/components/primitives/ui-link.js.map +0 -1
  270. package/dist/components/units/cards/blog-card.d.ts +0 -19
  271. package/dist/components/units/cards/blog-card.js +0 -82
  272. package/dist/components/units/cards/blog-card.js.map +0 -1
  273. package/dist/components/units/cards/card.d.ts +0 -15
  274. package/dist/components/units/cards/card.js +0 -89
  275. package/dist/components/units/cards/card.js.map +0 -1
  276. package/dist/components/units/cards/cards.d.ts +0 -17
  277. package/dist/components/units/cards/cards.js +0 -37
  278. package/dist/components/units/cards/cards.js.map +0 -1
  279. package/dist/components/units/index.d.ts +0 -5
  280. package/dist/components/units/index.js +0 -4
  281. package/dist/components/units/index.js.map +0 -1
  282. package/dist/utils.js.map +0 -1
  283. /package/dist/{utils.d.ts → utils/index.d.ts} +0 -0
  284. /package/dist/{components/primitives/button/button_with_icon_variant.d.ts → utils/index.test.d.ts} +0 -0
@@ -0,0 +1,209 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState, useRef, useEffect } from "react";
4
+ import { motion } from "framer-motion";
5
+ import { Send, Bot, User, Sparkles } from "lucide-react";
6
+ import { Layout, Button, Input, Heading, Text } from "../../primitives/index.js";
7
+ import { cn } from "../../../utils/index.js";
8
+ const mockResponses = {
9
+ hello: "Hey there! \u{1F44B} I'm **Storied Bot**, your friendly AI assistant. I can help you explore blog posts, find resources, or just chat. What's on your mind?",
10
+ help: "Sure! Here's what I can help with:\n\n- \u{1F50D} **Search posts** \u2014 Ask me about any topic\n- \u{1F4DA} **Recommend reads** \u2014 I'll suggest posts based on your interests\n- \u{1F3A8} **Design tips** \u2014 Questions about typography, color, layout\n- \u{1F4A1} **General chat** \u2014 I'm happy to talk about anything!",
11
+ posts: "We have some great posts! Here are a few highlights:\n\n1. **The Art of Minimalism** \u2014 A deep dive into less-is-more design\n2. **Color Theory Fundamentals** \u2014 Understanding how colors work together\n3. **Typography Best Practices** \u2014 Making your text shine\n\nWant me to go deeper on any of these?",
12
+ design: "Great question about design! Here are some key principles I follow:\n\n- **Hierarchy** \u2014 Guide the eye with size, weight, and contrast\n- **Whitespace** \u2014 Give elements room to breathe\n- **Consistency** \u2014 Stick to your design system\n- **Accessibility** \u2014 Make sure everyone can use your work\n\nWould you like to explore our **Design System** page for live examples?"
13
+ };
14
+ const defaultResponse = "That's an interesting thought! \u{1F914}\n\nI'm currently running in demo mode, so my responses are limited. In a full implementation, I'd be powered by an AI model and could have much richer conversations.\n\nTry asking me about **posts**, **design**, or type **help** to see what I can do!";
15
+ function getResponse(input) {
16
+ const lower = input.toLowerCase().trim();
17
+ for (const [key, response] of Object.entries(mockResponses)) {
18
+ if (lower.includes(key)) return response;
19
+ }
20
+ return defaultResponse;
21
+ }
22
+ const initialMessages = [
23
+ {
24
+ id: "welcome",
25
+ role: "assistant",
26
+ content: "Welcome to **Storied Bot**! \u{1F916}\u2728\n\nI'm your AI assistant \u2014 here to help you explore content, answer questions, and chat. This is a demo showcasing how a conversational interface can look and feel.\n\nTry saying **hello**, ask about **posts**, or type **help** to get started!",
27
+ timestamp: new Date(Date.now() - 6e4)
28
+ }
29
+ ];
30
+ function ChatPage() {
31
+ const [messages, setMessages] = useState(initialMessages);
32
+ const [input, setInput] = useState("");
33
+ const [isTyping, setIsTyping] = useState(false);
34
+ const scrollRef = useRef(null);
35
+ const inputRef = useRef(null);
36
+ useEffect(() => {
37
+ scrollRef.current?.scrollTo({
38
+ top: scrollRef.current.scrollHeight,
39
+ behavior: "smooth"
40
+ });
41
+ }, [messages, isTyping]);
42
+ const sendMessage = () => {
43
+ const text = input.trim();
44
+ if (!text || isTyping) return;
45
+ const userMsg = {
46
+ id: crypto.randomUUID(),
47
+ role: "user",
48
+ content: text,
49
+ timestamp: /* @__PURE__ */ new Date()
50
+ };
51
+ setMessages((prev) => [...prev, userMsg]);
52
+ setInput("");
53
+ setIsTyping(true);
54
+ setTimeout(
55
+ () => {
56
+ const botMsg = {
57
+ id: crypto.randomUUID(),
58
+ role: "assistant",
59
+ content: getResponse(text),
60
+ timestamp: /* @__PURE__ */ new Date()
61
+ };
62
+ setMessages((prev) => [...prev, botMsg]);
63
+ setIsTyping(false);
64
+ },
65
+ 800 + Math.random() * 1200
66
+ );
67
+ };
68
+ const handleKeyDown = (e) => {
69
+ if (e.key === "Enter" && !e.shiftKey) {
70
+ e.preventDefault();
71
+ sendMessage();
72
+ }
73
+ };
74
+ return /* @__PURE__ */ jsx(Layout, { type: "container", bgColor: "background", className: "sg:min-h-screen", children: /* @__PURE__ */ jsx(Layout.Col1, { className: "sg:flex sg:flex-col sg:items-center", children: /* @__PURE__ */ jsxs(
75
+ motion.div,
76
+ {
77
+ initial: { opacity: 0, y: 20 },
78
+ animate: { opacity: 1, y: 0 },
79
+ exit: { opacity: 0, y: -20 },
80
+ transition: { duration: 0.3 },
81
+ className: "sg:container sg:py-8 sg:flex sg:flex-col sg:max-w-2xl sg:mx-auto sg:w-full",
82
+ style: { height: "calc(100vh - 2rem)" },
83
+ children: [
84
+ /* @__PURE__ */ jsxs("div", { className: "sg:flex sg:items-center sg:gap-3 sg:mb-4 sg:pb-4 sg:border-b sg:border-border", children: [
85
+ /* @__PURE__ */ jsx("div", { className: "sg:h-10 sg:w-10 sg:rounded-full sg:bg-primary/10 sg:flex sg:items-center sg:justify-center", children: /* @__PURE__ */ jsx(Sparkles, { className: "sg:h-5 sg:w-5 sg:text-primary" }) }),
86
+ /* @__PURE__ */ jsxs("div", { children: [
87
+ /* @__PURE__ */ jsx(Heading, { variant: "h4", className: "sg:font-bold sg:leading-tight", children: "Storied Bot" }),
88
+ /* @__PURE__ */ jsx(Text, { className: "sg:text-xs sg:text-muted-foreground", children: "AI assistant \xB7 Demo mode" })
89
+ ] })
90
+ ] }),
91
+ /* @__PURE__ */ jsxs(
92
+ "div",
93
+ {
94
+ ref: scrollRef,
95
+ className: "chat-scroll sg:flex-1 sg:overflow-y-auto sg:space-y-4 sg:pr-2 sg:min-h-0",
96
+ children: [
97
+ messages.map((msg) => /* @__PURE__ */ jsxs(
98
+ motion.div,
99
+ {
100
+ initial: { opacity: 0, y: 10 },
101
+ animate: { opacity: 1, y: 0 },
102
+ transition: { duration: 0.2 },
103
+ className: cn(
104
+ "sg:flex sg:gap-3 sg:max-w-[85%]",
105
+ msg.role === "user" ? "sg:ml-auto sg:flex-row-reverse" : ""
106
+ ),
107
+ children: [
108
+ /* @__PURE__ */ jsx(
109
+ "div",
110
+ {
111
+ className: cn(
112
+ "sg:h-8 sg:w-8 sg:rounded-full sg:flex sg:items-center sg:justify-center sg:shrink-0 sg:mt-0.5",
113
+ msg.role === "assistant" ? "sg:bg-primary/10 sg:text-primary" : "sg:bg-secondary sg:text-secondary-foreground"
114
+ ),
115
+ children: msg.role === "assistant" ? /* @__PURE__ */ jsx(Bot, { className: "sg:h-4 sg:w-4" }) : /* @__PURE__ */ jsx(User, { className: "sg:h-4 sg:w-4" })
116
+ }
117
+ ),
118
+ /* @__PURE__ */ jsxs(
119
+ "div",
120
+ {
121
+ className: cn(
122
+ "sg:rounded-2xl sg:px-4 sg:py-2.5 sg:text-sm sg:leading-relaxed",
123
+ msg.role === "assistant" ? "sg:bg-muted sg:text-foreground sg:rounded-tl-sm" : "sg:bg-primary sg:text-primary-foreground sg:rounded-tr-sm"
124
+ ),
125
+ children: [
126
+ /* @__PURE__ */ jsx(MessageContent, { content: msg.content }),
127
+ /* @__PURE__ */ jsx(
128
+ "p",
129
+ {
130
+ className: cn(
131
+ "sg:text-[10px] sg:mt-1.5",
132
+ msg.role === "assistant" ? "sg:text-muted-foreground" : "sg:text-primary-foreground/60"
133
+ ),
134
+ children: msg.timestamp.toLocaleTimeString([], {
135
+ hour: "2-digit",
136
+ minute: "2-digit"
137
+ })
138
+ }
139
+ )
140
+ ]
141
+ }
142
+ )
143
+ ]
144
+ },
145
+ msg.id
146
+ )),
147
+ isTyping && /* @__PURE__ */ jsxs(
148
+ motion.div,
149
+ {
150
+ initial: { opacity: 0, y: 10 },
151
+ animate: { opacity: 1, y: 0 },
152
+ className: "sg:flex sg:gap-3",
153
+ children: [
154
+ /* @__PURE__ */ jsx("div", { className: "sg:h-8 sg:w-8 sg:rounded-full sg:bg-primary/10 sg:text-primary sg:flex sg:items-center sg:justify-center sg:shrink-0", children: /* @__PURE__ */ jsx(Bot, { className: "sg:h-4 sg:w-4" }) }),
155
+ /* @__PURE__ */ jsxs("div", { className: "sg:bg-muted sg:rounded-2xl sg:rounded-tl-sm sg:px-4 sg:py-3 sg:flex sg:items-center sg:gap-1", children: [
156
+ /* @__PURE__ */ jsx("span", { className: "sg:w-2 sg:h-2 sg:rounded-full sg:bg-muted-foreground/40 sg:animate-bounce [animation-delay:0ms]" }),
157
+ /* @__PURE__ */ jsx("span", { className: "sg:w-2 sg:h-2 sg:rounded-full sg:bg-muted-foreground/40 sg:animate-bounce [animation-delay:150ms]" }),
158
+ /* @__PURE__ */ jsx("span", { className: "sg:w-2 sg:h-2 sg:rounded-full sg:bg-muted-foreground/40 sg:animate-bounce [animation-delay:300ms]" })
159
+ ] })
160
+ ]
161
+ }
162
+ )
163
+ ]
164
+ }
165
+ ),
166
+ /* @__PURE__ */ jsxs("div", { className: "sg:pt-4 sg:mt-4 sg:border-t sg:border-border", children: [
167
+ /* @__PURE__ */ jsxs("div", { className: "sg:flex sg:gap-2", children: [
168
+ /* @__PURE__ */ jsx(
169
+ Input,
170
+ {
171
+ ref: inputRef,
172
+ placeholder: "Type a message\u2026",
173
+ value: input,
174
+ onChange: (e) => setInput(e.target.value),
175
+ onKeyDown: handleKeyDown,
176
+ disabled: isTyping,
177
+ className: "sg:flex-1"
178
+ }
179
+ ),
180
+ /* @__PURE__ */ jsx(
181
+ Button,
182
+ {
183
+ onClick: sendMessage,
184
+ disabled: !input.trim() || isTyping,
185
+ "aria-label": "Send message",
186
+ children: /* @__PURE__ */ jsx(Send, { className: "sg:h-4 sg:w-4" })
187
+ }
188
+ )
189
+ ] }),
190
+ /* @__PURE__ */ jsx(Text, { className: "sg:text-[11px] sg:text-muted-foreground sg:text-center sg:mt-2", children: "Demo mode \u2014 responses are pre-written. Try: hello, help, posts, design" })
191
+ ] })
192
+ ]
193
+ }
194
+ ) }) });
195
+ }
196
+ function MessageContent({ content }) {
197
+ const lines = content.split("\n");
198
+ return /* @__PURE__ */ jsx("div", { className: "sg:space-y-1.5", children: lines.map((line, i) => {
199
+ if (line.trim() === "") return /* @__PURE__ */ jsx("br", {}, i);
200
+ const parts = line.split(/(\*\*[^*]+\*\*)/g);
201
+ return /* @__PURE__ */ jsx("p", { children: parts.map(
202
+ (part, j) => part.startsWith("**") && part.endsWith("**") ? /* @__PURE__ */ jsx("strong", { className: "sg:font-semibold", children: part.slice(2, -2) }, j) : /* @__PURE__ */ jsx("span", { children: part }, j)
203
+ ) }, i);
204
+ }) });
205
+ }
206
+ export {
207
+ ChatPage
208
+ };
209
+ //# sourceMappingURL=chat-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/pages/chat/chat-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useRef, useEffect } from \"react\";\nimport { motion } from \"framer-motion\";\nimport { Send, Bot, User, Sparkles } from \"lucide-react\";\nimport { Layout, Button, Input, Heading, Text } from \"../../primitives/index\";\nimport { cn } from \"../../../utils/index\";\n\ninterface Message {\n id: string;\n role: \"user\" | \"assistant\";\n content: string;\n timestamp: Date;\n}\n\nconst mockResponses: Record<string, string> = {\n hello:\n \"Hey there! 👋 I'm **Storied Bot**, your friendly AI assistant. I can help you explore blog posts, find resources, or just chat. What's on your mind?\",\n help: \"Sure! Here's what I can help with:\\n\\n- 🔍 **Search posts** — Ask me about any topic\\n- 📚 **Recommend reads** — I'll suggest posts based on your interests\\n- 🎨 **Design tips** — Questions about typography, color, layout\\n- 💡 **General chat** — I'm happy to talk about anything!\",\n posts:\n \"We have some great posts! Here are a few highlights:\\n\\n1. **The Art of Minimalism** — A deep dive into less-is-more design\\n2. **Color Theory Fundamentals** — Understanding how colors work together\\n3. **Typography Best Practices** — Making your text shine\\n\\nWant me to go deeper on any of these?\",\n design:\n \"Great question about design! Here are some key principles I follow:\\n\\n- **Hierarchy** — Guide the eye with size, weight, and contrast\\n- **Whitespace** — Give elements room to breathe\\n- **Consistency** — Stick to your design system\\n- **Accessibility** — Make sure everyone can use your work\\n\\nWould you like to explore our **Design System** page for live examples?\",\n};\n\nconst defaultResponse =\n \"That's an interesting thought! 🤔\\n\\nI'm currently running in demo mode, so my responses are limited. In a full implementation, I'd be powered by an AI model and could have much richer conversations.\\n\\nTry asking me about **posts**, **design**, or type **help** to see what I can do!\";\n\nfunction getResponse(input: string): string {\n const lower = input.toLowerCase().trim();\n for (const [key, response] of Object.entries(mockResponses)) {\n if (lower.includes(key)) return response;\n }\n return defaultResponse;\n}\n\nconst initialMessages: Message[] = [\n {\n id: \"welcome\",\n role: \"assistant\",\n content:\n \"Welcome to **Storied Bot**! 🤖✨\\n\\nI'm your AI assistant — here to help you explore content, answer questions, and chat. This is a demo showcasing how a conversational interface can look and feel.\\n\\nTry saying **hello**, ask about **posts**, or type **help** to get started!\",\n timestamp: new Date(Date.now() - 60000),\n },\n];\n\nexport function ChatPage() {\n const [messages, setMessages] = useState<Message[]>(initialMessages);\n const [input, setInput] = useState(\"\");\n const [isTyping, setIsTyping] = useState(false);\n const scrollRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n scrollRef.current?.scrollTo({\n top: scrollRef.current.scrollHeight,\n behavior: \"smooth\",\n });\n }, [messages, isTyping]);\n\n const sendMessage = () => {\n const text = input.trim();\n if (!text || isTyping) return;\n\n const userMsg: Message = {\n id: crypto.randomUUID(),\n role: \"user\",\n content: text,\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, userMsg]);\n setInput(\"\");\n setIsTyping(true);\n\n // Simulate typing delay\n setTimeout(\n () => {\n const botMsg: Message = {\n id: crypto.randomUUID(),\n role: \"assistant\",\n content: getResponse(text),\n timestamp: new Date(),\n };\n setMessages((prev) => [...prev, botMsg]);\n setIsTyping(false);\n },\n 800 + Math.random() * 1200,\n );\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n sendMessage();\n }\n };\n\n return (\n <Layout type=\"container\" bgColor=\"background\" className=\"sg:min-h-screen\">\n <Layout.Col1 className=\"sg:flex sg:flex-col sg:items-center\">\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n transition={{ duration: 0.3 }}\n className=\"sg:container sg:py-8 sg:flex sg:flex-col sg:max-w-2xl sg:mx-auto sg:w-full\"\n style={{ height: \"calc(100vh - 2rem)\" }}\n >\n {/* Header */}\n <div className=\"sg:flex sg:items-center sg:gap-3 sg:mb-4 sg:pb-4 sg:border-b sg:border-border\">\n <div className=\"sg:h-10 sg:w-10 sg:rounded-full sg:bg-primary/10 sg:flex sg:items-center sg:justify-center\">\n <Sparkles className=\"sg:h-5 sg:w-5 sg:text-primary\" />\n </div>\n <div>\n <Heading variant=\"h4\" className=\"sg:font-bold sg:leading-tight\">\n Storied Bot\n </Heading>\n <Text className=\"sg:text-xs sg:text-muted-foreground\">\n AI assistant · Demo mode\n </Text>\n </div>\n </div>\n\n {/* Messages area */}\n <div\n ref={scrollRef}\n className=\"chat-scroll sg:flex-1 sg:overflow-y-auto sg:space-y-4 sg:pr-2 sg:min-h-0\"\n >\n {messages.map((msg) => (\n <motion.div\n key={msg.id}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.2 }}\n className={cn(\n \"sg:flex sg:gap-3 sg:max-w-[85%]\",\n msg.role === \"user\" ? \"sg:ml-auto sg:flex-row-reverse\" : \"\",\n )}\n >\n {/* Avatar */}\n <div\n className={cn(\n \"sg:h-8 sg:w-8 sg:rounded-full sg:flex sg:items-center sg:justify-center sg:shrink-0 sg:mt-0.5\",\n msg.role === \"assistant\"\n ? \"sg:bg-primary/10 sg:text-primary\"\n : \"sg:bg-secondary sg:text-secondary-foreground\",\n )}\n >\n {msg.role === \"assistant\" ? (\n <Bot className=\"sg:h-4 sg:w-4\" />\n ) : (\n <User className=\"sg:h-4 sg:w-4\" />\n )}\n </div>\n\n {/* Bubble */}\n <div\n className={cn(\n \"sg:rounded-2xl sg:px-4 sg:py-2.5 sg:text-sm sg:leading-relaxed\",\n msg.role === \"assistant\"\n ? \"sg:bg-muted sg:text-foreground sg:rounded-tl-sm\"\n : \"sg:bg-primary sg:text-primary-foreground sg:rounded-tr-sm\",\n )}\n >\n <MessageContent content={msg.content} />\n <p\n className={cn(\n \"sg:text-[10px] sg:mt-1.5\",\n msg.role === \"assistant\"\n ? \"sg:text-muted-foreground\"\n : \"sg:text-primary-foreground/60\",\n )}\n >\n {msg.timestamp.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}\n </p>\n </div>\n </motion.div>\n ))}\n\n {/* Typing indicator */}\n {isTyping && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"sg:flex sg:gap-3\"\n >\n <div className=\"sg:h-8 sg:w-8 sg:rounded-full sg:bg-primary/10 sg:text-primary sg:flex sg:items-center sg:justify-center sg:shrink-0\">\n <Bot className=\"sg:h-4 sg:w-4\" />\n </div>\n <div className=\"sg:bg-muted sg:rounded-2xl sg:rounded-tl-sm sg:px-4 sg:py-3 sg:flex sg:items-center sg:gap-1\">\n <span className=\"sg:w-2 sg:h-2 sg:rounded-full sg:bg-muted-foreground/40 sg:animate-bounce [animation-delay:0ms]\" />\n <span className=\"sg:w-2 sg:h-2 sg:rounded-full sg:bg-muted-foreground/40 sg:animate-bounce [animation-delay:150ms]\" />\n <span className=\"sg:w-2 sg:h-2 sg:rounded-full sg:bg-muted-foreground/40 sg:animate-bounce [animation-delay:300ms]\" />\n </div>\n </motion.div>\n )}\n </div>\n\n {/* Input area */}\n <div className=\"sg:pt-4 sg:mt-4 sg:border-t sg:border-border\">\n <div className=\"sg:flex sg:gap-2\">\n <Input\n ref={inputRef}\n placeholder=\"Type a message…\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n disabled={isTyping}\n className=\"sg:flex-1\"\n />\n <Button\n onClick={sendMessage}\n disabled={!input.trim() || isTyping}\n aria-label=\"Send message\"\n >\n <Send className=\"sg:h-4 sg:w-4\" />\n </Button>\n </div>\n <Text className=\"sg:text-[11px] sg:text-muted-foreground sg:text-center sg:mt-2\">\n Demo mode — responses are pre-written. Try: hello, help, posts,\n design\n </Text>\n </div>\n </motion.div>\n </Layout.Col1>\n </Layout>\n );\n}\n\n/** Simple markdown-ish renderer for bold and line breaks */\nfunction MessageContent({ content }: { content: string }) {\n const lines = content.split(\"\\n\");\n return (\n <div className=\"sg:space-y-1.5\">\n {lines.map((line, i) => {\n if (line.trim() === \"\") return <br key={i} />;\n // Bold: **text**\n const parts = line.split(/(\\*\\*[^*]+\\*\\*)/g);\n return (\n <p key={i}>\n {parts.map((part, j) =>\n part.startsWith(\"**\") && part.endsWith(\"**\") ? (\n <strong key={j} className=\"sg:font-semibold\">\n {part.slice(2, -2)}\n </strong>\n ) : (\n <span key={j}>{part}</span>\n ),\n )}\n </p>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,11 @@
1
+ export { AdminPage, AdminPageProps } from './admin/admin-page.js';
2
+ export { BlogPost } from './blogpost/blogpost.js';
3
+ export { CategoryPage } from './category/category-page.js';
4
+ export { LoginPage } from './login/login-page.js';
5
+ export { MaintenancePage } from './maintenance/maintenance-page.js';
6
+ export { NotFound } from './not-found/not-found.js';
7
+ export { PrivacyPage } from './privacy/privacy-page.js';
8
+ export { SearchPage } from './search/search-page.js';
9
+ export { StartPage } from './startpage/startpage.js';
10
+ export { TermsPage } from './terms/terms-page.js';
11
+ import 'react/jsx-runtime';
@@ -0,0 +1,11 @@
1
+ export * from "./admin/admin-page.js";
2
+ export * from "./blogpost/blogpost.js";
3
+ export * from "./category/category-page.js";
4
+ export * from "./login/login-page.js";
5
+ export * from "./maintenance/maintenance-page.js";
6
+ export * from "./not-found/not-found.js";
7
+ export * from "./privacy/privacy-page.js";
8
+ export * from "./search/search-page.js";
9
+ export * from "./startpage/startpage.js";
10
+ export * from "./terms/terms-page.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface LoginPageProps {
4
+ /**
5
+ * Callback fired when login is successful
6
+ */
7
+ onLoginSuccess?: () => void;
8
+ /**
9
+ * Label for the "Sign up" link
10
+ */
11
+ signUpLabel?: string;
12
+ /**
13
+ * URL for the "Sign up" link
14
+ */
15
+ signUpHref?: string;
16
+ }
17
+ declare function LoginPage({ onLoginSuccess, signUpLabel, signUpHref, }: LoginPageProps): react_jsx_runtime.JSX.Element;
18
+
19
+ export { LoginPage };
@@ -0,0 +1,108 @@
1
+ "use client";
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";
13
+ import { useToast } from "../../primitives/sonner/use-toast.js";
14
+ import { useAuth } from "singularity-components/components/providers/auth-provider";
15
+ function LoginPage({
16
+ onLoginSuccess,
17
+ signUpLabel = "Sign up",
18
+ signUpHref = "#"
19
+ }) {
20
+ const [email, setEmail] = useState("");
21
+ const [password, setPassword] = useState("");
22
+ const { toast } = useToast();
23
+ 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
+ if (isLoggedIn) {
33
+ 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
+ /* @__PURE__ */ jsxs(Heading, { variant: "h1", className: "sg:text-foreground", children: [
35
+ "Welcome, ",
36
+ userName
37
+ ] }),
38
+ /* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", children: "You are currently logged in." }),
39
+ /* @__PURE__ */ jsx(
40
+ Button,
41
+ {
42
+ variant: "outline",
43
+ onClick: () => {
44
+ logout();
45
+ toast.message("Logged out", {
46
+ description: "See you next time!"
47
+ });
48
+ },
49
+ children: "Log out"
50
+ }
51
+ )
52
+ ] }) }) });
53
+ }
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
+ ]
101
+ }
102
+ )
103
+ ] }) }) });
104
+ }
105
+ export {
106
+ LoginPage
107
+ };
108
+ //# sourceMappingURL=login-page.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function MaintenancePage(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { MaintenancePage };
@@ -0,0 +1,50 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { motion } from "framer-motion";
4
+ import { Heading, Text, Button, Link, Icon, Stack } from "../../primitives/index.js";
5
+ import { LinkButton } from "../../primitives/buttons/link-button.js";
6
+ function MaintenancePage() {
7
+ return /* @__PURE__ */ jsx("div", { className: "sg:min-h-screen sg:flex sg:flex-col sg:items-center sg:justify-center sg:bg-background sg:px-4", children: /* @__PURE__ */ jsxs(
8
+ motion.div,
9
+ {
10
+ initial: { opacity: 0, y: 20 },
11
+ animate: { opacity: 1, y: 0 },
12
+ transition: { duration: 0.4 },
13
+ className: "sg:text-center sg:max-w-md",
14
+ children: [
15
+ /* @__PURE__ */ jsx("div", { className: "sg:rounded-full sg:bg-primary/10 sg:p-5 sg:inline-flex sg:mb-6", children: /* @__PURE__ */ jsx(Icon, { icon: "Construction", size: "xl", color: "primary" }) }),
16
+ /* @__PURE__ */ jsx(Heading, { variant: "h1", className: "sg:mb-3", children: "Under Maintenance" }),
17
+ /* @__PURE__ */ jsx(
18
+ Text,
19
+ {
20
+ foreground: "muted-foreground",
21
+ className: "sg:leading-relaxed sg:mb-2",
22
+ children: "We're making some improvements to bring you a better experience. We'll be back shortly."
23
+ }
24
+ ),
25
+ /* @__PURE__ */ jsx(
26
+ Text,
27
+ {
28
+ size: "sm",
29
+ foreground: "muted-foreground",
30
+ className: "sg:opacity-70 sg:mb-8",
31
+ children: "Expected downtime: less than 1 hour"
32
+ }
33
+ ),
34
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", wrap: "wrap", justifyContent: "center", gap: 3, children: [
35
+ /* @__PURE__ */ jsx(LinkButton, { to: "/", iconStart: "ArrowLeft", children: "Try Home Page" }),
36
+ /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: () => window.location.reload(), children: "Refresh" })
37
+ ] }),
38
+ /* @__PURE__ */ jsxs(Text, { size: "xs", foreground: "muted-foreground", className: "sg:mt-10", children: [
39
+ "Questions? Reach us at",
40
+ " ",
41
+ /* @__PURE__ */ jsx(Link, { to: "mailto:hello@storied.blog", children: "hello@storied.blog" })
42
+ ] })
43
+ ]
44
+ }
45
+ ) });
46
+ }
47
+ export {
48
+ MaintenancePage
49
+ };
50
+ //# sourceMappingURL=maintenance-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/pages/maintenance/maintenance-page.tsx"],"sourcesContent":["\"use client\";\nimport { motion } from \"framer-motion\";\nimport { Heading, Text, Button, Link, Icon, Stack } from \"../../primitives/index\";\nimport { LinkButton } from \"../../primitives/buttons/link-button\";\n\nexport function MaintenancePage() {\n return (\n <div className=\"sg:min-h-screen sg:flex sg:flex-col sg:items-center sg:justify-center sg:bg-background sg:px-4\">\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4 }}\n className=\"sg:text-center sg:max-w-md\"\n >\n <div className=\"sg:rounded-full sg:bg-primary/10 sg:p-5 sg:inline-flex sg:mb-6\">\n <Icon icon=\"Construction\" size=\"xl\" color=\"primary\" />\n </div>\n <Heading variant=\"h1\" className=\"sg:mb-3\">\n Under Maintenance\n </Heading>\n <Text\n foreground=\"muted-foreground\"\n className=\"sg:leading-relaxed sg:mb-2\"\n >\n We&apos;re making some improvements to bring you a better experience.\n We&apos;ll be back shortly.\n </Text>\n <Text\n size=\"sm\"\n foreground=\"muted-foreground\"\n className=\"sg:opacity-70 sg:mb-8\"\n >\n Expected downtime: less than 1 hour\n </Text>\n <Stack direction=\"row\" wrap=\"wrap\" justifyContent=\"center\" gap={3}>\n <LinkButton to=\"/\" iconStart=\"ArrowLeft\">\n Try Home Page\n </LinkButton>\n <Button variant=\"outline\" onClick={() => window.location.reload()}>\n Refresh\n </Button>\n </Stack>\n <Text size=\"xs\" foreground=\"muted-foreground\" className=\"sg:mt-10\">\n Questions? Reach us at{\" \"}\n <Link to=\"mailto:hello@storied.blog\">hello@storied.blog</Link>\n </Text>\n </motion.div>\n </div>\n );\n}\n"],"mappings":";AAeU,cAmBF,YAnBE;AAdV,SAAS,cAAc;AACvB,SAAS,SAAS,MAAM,QAAQ,MAAM,MAAM,aAAa;AACzD,SAAS,kBAAkB;AAEpB,SAAS,kBAAkB;AAChC,SACE,oBAAC,SAAI,WAAU,kGACb;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,MAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,MAC5B,YAAY,EAAE,UAAU,IAAI;AAAA,MAC5B,WAAU;AAAA,MAEV;AAAA,4BAAC,SAAI,WAAU,kEACb,8BAAC,QAAK,MAAK,gBAAe,MAAK,MAAK,OAAM,WAAU,GACtD;AAAA,QACA,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAAU,+BAE1C;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,YAAW;AAAA,YACX,WAAU;AAAA,YACX;AAAA;AAAA,QAGD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,YAAW;AAAA,YACX,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA,qBAAC,SAAM,WAAU,OAAM,MAAK,QAAO,gBAAe,UAAS,KAAK,GAC9D;AAAA,8BAAC,cAAW,IAAG,KAAI,WAAU,aAAY,2BAEzC;AAAA,UACA,oBAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,OAAO,SAAS,OAAO,GAAG,qBAEnE;AAAA,WACF;AAAA,QACA,qBAAC,QAAK,MAAK,MAAK,YAAW,oBAAmB,WAAU,YAAW;AAAA;AAAA,UAC1C;AAAA,UACvB,oBAAC,QAAK,IAAG,6BAA4B,gCAAkB;AAAA,WACzD;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
@@ -0,0 +1,10 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface NotFoundProps {
4
+ pathname?: string;
5
+ homeHref?: string;
6
+ onGoBack?: () => void;
7
+ }
8
+ declare const NotFound: ({ pathname, homeHref, onGoBack, }: NotFoundProps) => react_jsx_runtime.JSX.Element;
9
+
10
+ export { NotFound };
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { motion } from "framer-motion";
4
+ import { Layout } from "../../primitives/layout/layout.js";
5
+ import { Button } from "../../primitives/buttons/button.js";
6
+ import { LinkButton } from "../../primitives/buttons/link-button.js";
7
+ import { Heading, Icon, Stack, Text, TextCode } from "../../primitives/index.js";
8
+ import { useEffect } from "react";
9
+ const NotFound = ({
10
+ pathname,
11
+ homeHref = "/",
12
+ onGoBack
13
+ }) => {
14
+ const currentPath = pathname ?? (typeof window !== "undefined" ? window.location.pathname : "");
15
+ useEffect(() => {
16
+ console.error(
17
+ "404 Error: User attempted to access non-existent route:",
18
+ currentPath
19
+ );
20
+ }, [currentPath]);
21
+ const handleGoBack = () => {
22
+ if (onGoBack) {
23
+ onGoBack();
24
+ } else if (typeof window !== "undefined") {
25
+ window.history.back();
26
+ }
27
+ };
28
+ return /* @__PURE__ */ jsx(Layout, { bgColor: "background", children: /* @__PURE__ */ jsx(Layout.Col1, { className: "sg:flex sg:flex-col sg:items-center sg:justify-center sg:py-32 sg:text-center", children: /* @__PURE__ */ jsxs(
29
+ motion.div,
30
+ {
31
+ initial: { opacity: 0, y: 20 },
32
+ animate: { opacity: 1, y: 0 },
33
+ exit: { opacity: 0, y: -20 },
34
+ transition: { duration: 0.3 },
35
+ className: "sg:flex sg:flex-col sg:items-center",
36
+ children: [
37
+ /* @__PURE__ */ jsx(Icon, { size: "xxl", className: "sg:mb-6", icon: "SearchX" }),
38
+ /* @__PURE__ */ jsx(Heading, { variant: "h1", className: "sg:mb-2", foreground: "primary", children: "404" }),
39
+ /* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:mb-3", children: "Page not found" }),
40
+ /* @__PURE__ */ jsxs(Text, { foreground: "muted-foreground", className: "sg:max-w-md sg:mb-8", children: [
41
+ "The page ",
42
+ /* @__PURE__ */ jsx(TextCode, { children: currentPath }),
43
+ " doesn't exist. It may have been moved or removed."
44
+ ] }),
45
+ /* @__PURE__ */ jsxs(Stack, { wrap: "wrap", justifyContent: "center", gap: 3, direction: "row", children: [
46
+ /* @__PURE__ */ jsx(LinkButton, { to: homeHref, iconStart: "House", children: "Back to Home" }),
47
+ /* @__PURE__ */ jsx(
48
+ Button,
49
+ {
50
+ variant: "outline",
51
+ onClick: handleGoBack,
52
+ iconStart: "ArrowLeft",
53
+ children: "Go Back"
54
+ }
55
+ )
56
+ ] })
57
+ ]
58
+ }
59
+ ) }) });
60
+ };
61
+ export {
62
+ NotFound
63
+ };
64
+ //# sourceMappingURL=not-found.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/pages/not-found/not-found.tsx"],"sourcesContent":["\"use client\";\nimport { motion } from \"framer-motion\";\nimport { Layout } from \"../../primitives/layout/layout\";\nimport { Button } from \"../../primitives/buttons/button\";\nimport { LinkButton } from \"../../primitives/buttons/link-button\";\nimport { Heading, Icon, Stack, Text, TextCode } from \"../../primitives/index\";\nimport { useEffect } from \"react\";\n\ninterface NotFoundProps {\n pathname?: string;\n homeHref?: string;\n onGoBack?: () => void;\n}\n\nexport const NotFound = ({\n pathname,\n homeHref = \"/\",\n onGoBack,\n}: NotFoundProps) => {\n const currentPath =\n pathname ?? (typeof window !== \"undefined\" ? window.location.pathname : \"\");\n\n useEffect(() => {\n console.error(\n \"404 Error: User attempted to access non-existent route:\",\n currentPath,\n );\n }, [currentPath]);\n\n const handleGoBack = () => {\n if (onGoBack) {\n onGoBack();\n } else if (typeof window !== \"undefined\") {\n window.history.back();\n }\n };\n\n return (\n <Layout bgColor=\"background\">\n <Layout.Col1 className=\"sg:flex sg:flex-col sg:items-center sg:justify-center sg:py-32 sg:text-center\">\n <motion.div\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -20 }}\n transition={{ duration: 0.3 }}\n className=\"sg:flex sg:flex-col sg:items-center\"\n >\n <Icon size=\"xxl\" className=\"sg:mb-6\" icon=\"SearchX\" />\n\n <Heading variant=\"h1\" className=\"sg:mb-2\" foreground=\"primary\">\n 404\n </Heading>\n\n <Heading variant=\"h2\" className=\"sg:mb-3\">\n Page not found\n </Heading>\n\n <Text foreground=\"muted-foreground\" className=\"sg:max-w-md sg:mb-8\">\n The page <TextCode>{currentPath}</TextCode> doesn&apos;t exist. It\n may have been moved or removed.\n </Text>\n\n <Stack wrap=\"wrap\" justifyContent=\"center\" gap={3} direction=\"row\">\n <LinkButton to={homeHref} iconStart=\"House\">\n Back to Home\n </LinkButton>\n <Button\n variant=\"outline\"\n onClick={handleGoBack}\n iconStart=\"ArrowLeft\"\n >\n Go Back\n </Button>\n </Stack>\n </motion.div>\n </Layout.Col1>\n </Layout>\n );\n};\n"],"mappings":";AA+CU,cAUA,YAVA;AA9CV,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,SAAS,MAAM,OAAO,MAAM,gBAAgB;AACrD,SAAS,iBAAiB;AAQnB,MAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA,WAAW;AAAA,EACX;AACF,MAAqB;AACnB,QAAM,cACJ,aAAa,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AAE1E,YAAU,MAAM;AACd,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,eAAe,MAAM;AACzB,QAAI,UAAU;AACZ,eAAS;AAAA,IACX,WAAW,OAAO,WAAW,aAAa;AACxC,aAAO,QAAQ,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,SACE,oBAAC,UAAO,SAAQ,cACd,8BAAC,OAAO,MAAP,EAAY,WAAU,iFACrB;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,SAAS,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,MAC7B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,MAC5B,MAAM,EAAE,SAAS,GAAG,GAAG,IAAI;AAAA,MAC3B,YAAY,EAAE,UAAU,IAAI;AAAA,MAC5B,WAAU;AAAA,MAEV;AAAA,4BAAC,QAAK,MAAK,OAAM,WAAU,WAAU,MAAK,WAAU;AAAA,QAEpD,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAAU,YAAW,WAAU,iBAE/D;AAAA,QAEA,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAAU,4BAE1C;AAAA,QAEA,qBAAC,QAAK,YAAW,oBAAmB,WAAU,uBAAsB;AAAA;AAAA,UACzD,oBAAC,YAAU,uBAAY;AAAA,UAAW;AAAA,WAE7C;AAAA,QAEA,qBAAC,SAAM,MAAK,QAAO,gBAAe,UAAS,KAAK,GAAG,WAAU,OAC3D;AAAA,8BAAC,cAAW,IAAI,UAAU,WAAU,SAAQ,0BAE5C;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,SAAS;AAAA,cACT,WAAU;AAAA,cACX;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GACF,GACF;AAEJ;","names":[]}
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface Section {
4
+ title: string;
5
+ content: string;
6
+ }
7
+ interface PrivacyPageProps {
8
+ title?: string;
9
+ effectiveDate?: string;
10
+ introText?: string;
11
+ sections?: Section[];
12
+ }
13
+ declare const PrivacyPage: ({ title, effectiveDate, introText, sections, }: PrivacyPageProps) => react_jsx_runtime.JSX.Element;
14
+
15
+ export { PrivacyPage };