singularity-components 0.1.195 → 0.1.197

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) 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 +3 -1
  5. package/dist/components/blocks/cards/blogpost-card.js +10 -5
  6. package/dist/components/blocks/cards/blogpost-card.js.map +1 -1
  7. package/dist/components/blocks/directory/author-card.d.ts +10 -0
  8. package/dist/components/blocks/directory/author-card.js +50 -0
  9. package/dist/components/blocks/directory/author-card.js.map +1 -0
  10. package/dist/components/blocks/directory/category-card.d.ts +10 -0
  11. package/dist/components/blocks/directory/category-card.js +27 -0
  12. package/dist/components/blocks/directory/category-card.js.map +1 -0
  13. package/dist/components/blocks/extras/extras-hub-card.d.ts +16 -0
  14. package/dist/components/blocks/extras/extras-hub-card.js +22 -0
  15. package/dist/components/blocks/extras/extras-hub-card.js.map +1 -0
  16. package/dist/components/blocks/gallery/image-gallery.d.ts +14 -0
  17. package/dist/components/blocks/gallery/image-gallery.js +211 -0
  18. package/dist/components/blocks/gallery/image-gallery.js.map +1 -0
  19. package/dist/components/blocks/index.d.ts +11 -0
  20. package/dist/components/blocks/index.js +10 -0
  21. package/dist/components/blocks/index.js.map +1 -1
  22. package/dist/components/blocks/loading/loading-skeletons.d.ts +15 -0
  23. package/dist/components/blocks/loading/loading-skeletons.js +78 -0
  24. package/dist/components/blocks/loading/loading-skeletons.js.map +1 -0
  25. package/dist/components/blocks/login/login.js +76 -47
  26. package/dist/components/blocks/login/login.js.map +1 -1
  27. package/dist/components/blocks/marketing/page-hero.d.ts +13 -0
  28. package/dist/components/blocks/marketing/page-hero.js +37 -0
  29. package/dist/components/blocks/marketing/page-hero.js.map +1 -0
  30. package/dist/components/blocks/marketing/stats-grid.d.ts +16 -0
  31. package/dist/components/blocks/marketing/stats-grid.js +30 -0
  32. package/dist/components/blocks/marketing/stats-grid.js.map +1 -0
  33. package/dist/components/blocks/marketing/timeline.d.ts +17 -0
  34. package/dist/components/blocks/marketing/timeline.js +46 -0
  35. package/dist/components/blocks/marketing/timeline.js.map +1 -0
  36. package/dist/components/blocks/marketing/values-grid.d.ts +16 -0
  37. package/dist/components/blocks/marketing/values-grid.js +29 -0
  38. package/dist/components/blocks/marketing/values-grid.js.map +1 -0
  39. package/dist/components/blocks/post-list/post-list-with-filters.js +4 -4
  40. package/dist/components/blocks/post-list/post-list-with-filters.js.map +1 -1
  41. package/dist/components/index.d.ts +28 -1
  42. package/dist/components/pages/about/about-page.d.ts +5 -0
  43. package/dist/components/pages/about/about-page.js +161 -0
  44. package/dist/components/pages/about/about-page.js.map +1 -0
  45. package/dist/components/pages/admin/admin-page.js +160 -103
  46. package/dist/components/pages/admin/admin-page.js.map +1 -1
  47. package/dist/components/pages/author/author-page.d.ts +8 -0
  48. package/dist/components/pages/author/author-page.js +107 -0
  49. package/dist/components/pages/author/author-page.js.map +1 -0
  50. package/dist/components/pages/authors/authors-page.d.ts +5 -0
  51. package/dist/components/pages/authors/authors-page.js +25 -0
  52. package/dist/components/pages/authors/authors-page.js.map +1 -0
  53. package/dist/components/pages/blogpost/blogpost.d.ts +4 -1
  54. package/dist/components/pages/blogpost/blogpost.js +110 -62
  55. package/dist/components/pages/blogpost/blogpost.js.map +1 -1
  56. package/dist/components/pages/categories/categories-page.d.ts +5 -0
  57. package/dist/components/pages/categories/categories-page.js +33 -0
  58. package/dist/components/pages/categories/categories-page.js.map +1 -0
  59. package/dist/components/pages/category/category-page.js +4 -2
  60. package/dist/components/pages/category/category-page.js.map +1 -1
  61. package/dist/components/pages/chat/chat-page.js +4 -4
  62. package/dist/components/pages/chat/chat-page.js.map +1 -1
  63. package/dist/components/pages/contact/contact-page.d.ts +5 -0
  64. package/dist/components/pages/contact/contact-page.js +180 -0
  65. package/dist/components/pages/contact/contact-page.js.map +1 -0
  66. package/dist/components/pages/content-blocks/content-blocks-page.d.ts +5 -0
  67. package/dist/components/pages/content-blocks/content-blocks-page.js +87 -0
  68. package/dist/components/pages/content-blocks/content-blocks-page.js.map +1 -0
  69. package/dist/components/pages/extras/extras-hub-page.d.ts +10 -0
  70. package/dist/components/pages/extras/extras-hub-page.js +110 -0
  71. package/dist/components/pages/extras/extras-hub-page.js.map +1 -0
  72. package/dist/components/pages/index.d.ts +14 -0
  73. package/dist/components/pages/index.js +12 -0
  74. package/dist/components/pages/index.js.map +1 -1
  75. package/dist/components/pages/maintenance/maintenance-page.js +1 -1
  76. package/dist/components/pages/maintenance/maintenance-page.js.map +1 -1
  77. package/dist/components/pages/membership/membership-page.d.ts +5 -0
  78. package/dist/components/pages/membership/membership-page.js +131 -0
  79. package/dist/components/pages/membership/membership-page.js.map +1 -0
  80. package/dist/components/pages/mosaic/mosaic-page.d.ts +5 -0
  81. package/dist/components/pages/mosaic/mosaic-page.js +81 -0
  82. package/dist/components/pages/mosaic/mosaic-page.js.map +1 -0
  83. package/dist/components/pages/newsletter/newsletter-page.d.ts +5 -0
  84. package/dist/components/pages/newsletter/newsletter-page.js +165 -0
  85. package/dist/components/pages/newsletter/newsletter-page.js.map +1 -0
  86. package/dist/components/pages/not-found/not-found.js +2 -2
  87. package/dist/components/pages/not-found/not-found.js.map +1 -1
  88. package/dist/components/pages/privacy/privacy-page.js +2 -2
  89. package/dist/components/pages/privacy/privacy-page.js.map +1 -1
  90. package/dist/components/pages/resources/resources-page.d.ts +5 -0
  91. package/dist/components/pages/resources/resources-page.js +24 -0
  92. package/dist/components/pages/resources/resources-page.js.map +1 -0
  93. package/dist/components/pages/startpage/startpage.js +6 -4
  94. package/dist/components/pages/startpage/startpage.js.map +1 -1
  95. package/dist/components/pages/terms/terms-page.js +2 -2
  96. package/dist/components/pages/terms/terms-page.js.map +1 -1
  97. package/dist/components/primitives/accordion/accordion.js +14 -16
  98. package/dist/components/primitives/accordion/accordion.js.map +1 -1
  99. package/dist/components/primitives/badge/badge.js +1 -1
  100. package/dist/components/primitives/badge/badge.js.map +1 -1
  101. package/dist/components/primitives/buttons/button.d.ts +2 -2
  102. package/dist/components/primitives/buttons/icon-button.d.ts +1 -1
  103. package/dist/components/primitives/collapsible/collapsible.js +4 -1
  104. package/dist/components/primitives/collapsible/collapsible.js.map +1 -1
  105. package/dist/components/primitives/dropdown-menu/dropdown-menu.js +6 -1
  106. package/dist/components/primitives/dropdown-menu/dropdown-menu.js.map +1 -1
  107. package/dist/components/primitives/forms/checkbox.js +1 -1
  108. package/dist/components/primitives/forms/checkbox.js.map +1 -1
  109. package/dist/components/primitives/forms/field.d.ts +4 -2
  110. package/dist/components/primitives/forms/field.js +4 -2
  111. package/dist/components/primitives/forms/field.js.map +1 -1
  112. package/dist/components/primitives/forms/form-control.d.ts +28 -0
  113. package/dist/components/primitives/forms/form-control.js +40 -0
  114. package/dist/components/primitives/forms/form-control.js.map +1 -0
  115. package/dist/components/primitives/forms/form.d.ts +12 -0
  116. package/dist/components/primitives/forms/form.js +30 -0
  117. package/dist/components/primitives/forms/form.js.map +1 -0
  118. package/dist/components/primitives/forms/select.js +12 -12
  119. package/dist/components/primitives/forms/select.js.map +1 -1
  120. package/dist/components/primitives/icon/icon.d.ts +3 -2
  121. package/dist/components/primitives/icon/icon.js +2 -1
  122. package/dist/components/primitives/icon/icon.js.map +1 -1
  123. package/dist/components/primitives/index.d.ts +4 -0
  124. package/dist/components/primitives/index.js +3 -0
  125. package/dist/components/primitives/index.js.map +1 -1
  126. package/dist/components/primitives/layout/layout.d.ts +1 -1
  127. package/dist/components/primitives/link/link.d.ts +2 -2
  128. package/dist/components/primitives/sheet/sheet.js +1 -1
  129. package/dist/components/primitives/sheet/sheet.js.map +1 -1
  130. package/dist/components/primitives/stack/stack.d.ts +2 -2
  131. package/dist/components/primitives/text/internal/text-element.d.ts +8 -2
  132. package/dist/components/primitives/text/internal/text-element.js +3 -0
  133. package/dist/components/primitives/text/internal/text-element.js.map +1 -1
  134. package/dist/components/primitives/text/text-code.d.ts +1 -1
  135. package/dist/components/templates/form/form.d.ts +2 -2
  136. package/dist/components/templates/form/form.js +133 -87
  137. package/dist/components/templates/form/form.js.map +1 -1
  138. package/dist/components/templates/hero/hero.js +1 -0
  139. package/dist/components/templates/hero/hero.js.map +1 -1
  140. package/dist/components/templates/index.d.ts +1 -0
  141. package/dist/components/templates/index.js +1 -0
  142. package/dist/components/templates/index.js.map +1 -1
  143. package/dist/components/templates/loading-screen/loading-screen.d.ts +10 -0
  144. package/dist/components/templates/loading-screen/loading-screen.js +39 -0
  145. package/dist/components/templates/loading-screen/loading-screen.js.map +1 -0
  146. package/dist/css/variables.css +6 -3
  147. package/dist/css/variables.css.map +1 -1
  148. package/dist/data/posts.d.ts +5 -0
  149. package/dist/data/posts.js +41 -8
  150. package/dist/data/posts.js.map +1 -1
  151. package/dist/index.d.ts +28 -1
  152. package/dist/lib/forms/field-props.d.ts +60 -0
  153. package/dist/lib/forms/field-props.js +60 -0
  154. package/dist/lib/forms/field-props.js.map +1 -0
  155. package/dist/lib/forms/index.d.ts +11 -0
  156. package/dist/lib/forms/index.js +3 -0
  157. package/dist/lib/forms/index.js.map +1 -0
  158. package/dist/lib/forms/tanstack-field.d.ts +71 -0
  159. package/dist/lib/forms/tanstack-field.js +121 -0
  160. package/dist/lib/forms/tanstack-field.js.map +1 -0
  161. package/dist/lib/index.d.ts +11 -0
  162. package/dist/lib/index.js +1 -0
  163. package/dist/lib/index.js.map +1 -1
  164. package/dist/main.css +393 -90
  165. package/dist/main.css.map +1 -1
  166. package/package.json +30 -23
@@ -0,0 +1,78 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Skeleton } from "../../primitives/skeleton/skeleton.js";
3
+ function PostCardSkeleton() {
4
+ return /* @__PURE__ */ jsxs("div", { className: "sg:rounded-lg sg:border sg:bg-card sg:overflow-hidden", children: [
5
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:w-full sg:h-48" }),
6
+ /* @__PURE__ */ jsxs("div", { className: "sg:p-5 sg:space-y-3", children: [
7
+ /* @__PURE__ */ jsxs("div", { className: "sg:flex sg:gap-2", children: [
8
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-5 sg:w-16 sg:rounded-full" }),
9
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-5 sg:w-20 sg:rounded-full" })
10
+ ] }),
11
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-6 sg:w-3/4" }),
12
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-full" }),
13
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-2/3" }),
14
+ /* @__PURE__ */ jsxs("div", { className: "sg:flex sg:items-center sg:gap-2 sg:pt-2", children: [
15
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-4 sg:rounded-full" }),
16
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-24" })
17
+ ] })
18
+ ] })
19
+ ] });
20
+ }
21
+ function PostListSkeleton({ count = 6 }) {
22
+ return /* @__PURE__ */ jsx("div", { className: "sg:grid sg:grid-cols-1 sm:sg:grid-cols-2 lg:sg:grid-cols-3 sg:gap-6", children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsx(PostCardSkeleton, {}, i)) });
23
+ }
24
+ function PostListRowSkeleton({ count = 4 }) {
25
+ return /* @__PURE__ */ jsx("div", { className: "sg:flex sg:flex-col sg:gap-4", children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsxs(
26
+ "div",
27
+ {
28
+ className: "sg:flex sg:gap-4 sg:rounded-lg sg:border sg:bg-card sg:p-4",
29
+ children: [
30
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:w-24 sg:h-24 sg:rounded-md sg:shrink-0" }),
31
+ /* @__PURE__ */ jsxs("div", { className: "sg:flex-1 sg:space-y-2 sg:py-1", children: [
32
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-5 sg:w-3/4" }),
33
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-full" }),
34
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-3 sg:w-1/3" })
35
+ ] })
36
+ ]
37
+ },
38
+ i
39
+ )) });
40
+ }
41
+ function CommentSkeleton({ count = 3 }) {
42
+ return /* @__PURE__ */ jsx("div", { className: "sg:space-y-4", children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsxs("div", { className: "sg:rounded-lg sg:bg-accent sg:p-4 sg:space-y-2", children: [
43
+ /* @__PURE__ */ jsxs("div", { className: "sg:flex sg:items-center sg:gap-2", children: [
44
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-20" }),
45
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-3 sg:w-16" })
46
+ ] }),
47
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-full" }),
48
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-2/3" })
49
+ ] }, i)) });
50
+ }
51
+ function SinglePostSkeleton() {
52
+ return /* @__PURE__ */ jsxs("div", { children: [
53
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:w-full sg:h-64 md:sg:h-96" }),
54
+ /* @__PURE__ */ jsxs("div", { className: "sg:container sg:max-w-3xl sg:py-12 sg:space-y-4", children: [
55
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-32" }),
56
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-3 sg:w-48" }),
57
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-10 sg:w-3/4" }),
58
+ /* @__PURE__ */ jsxs("div", { className: "sg:flex sg:gap-2", children: [
59
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-6 sg:w-20 sg:rounded-full" }),
60
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-6 sg:w-24 sg:rounded-full" })
61
+ ] }),
62
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-5 sg:w-full" }),
63
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-5 sg:w-5/6" }),
64
+ /* @__PURE__ */ jsxs("div", { className: "sg:space-y-3 sg:pt-8", children: [
65
+ Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-full" }, i)),
66
+ /* @__PURE__ */ jsx(Skeleton, { className: "sg:h-4 sg:w-2/3" })
67
+ ] })
68
+ ] })
69
+ ] });
70
+ }
71
+ export {
72
+ CommentSkeleton,
73
+ PostCardSkeleton,
74
+ PostListRowSkeleton,
75
+ PostListSkeleton,
76
+ SinglePostSkeleton
77
+ };
78
+ //# sourceMappingURL=loading-skeletons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/blocks/loading/loading-skeletons.tsx"],"sourcesContent":["import { Skeleton } from \"../../primitives/skeleton/skeleton\";\r\n\r\nexport function PostCardSkeleton() {\r\n\treturn (\r\n\t\t<div className=\"sg:rounded-lg sg:border sg:bg-card sg:overflow-hidden\">\r\n\t\t\t<Skeleton className=\"sg:w-full sg:h-48\" />\r\n\t\t\t<div className=\"sg:p-5 sg:space-y-3\">\r\n\t\t\t\t<div className=\"sg:flex sg:gap-2\">\r\n\t\t\t\t\t<Skeleton className=\"sg:h-5 sg:w-16 sg:rounded-full\" />\r\n\t\t\t\t\t<Skeleton className=\"sg:h-5 sg:w-20 sg:rounded-full\" />\r\n\t\t\t\t</div>\r\n\t\t\t\t<Skeleton className=\"sg:h-6 sg:w-3/4\" />\r\n\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-full\" />\r\n\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-2/3\" />\r\n\t\t\t\t<div className=\"sg:flex sg:items-center sg:gap-2 sg:pt-2\">\r\n\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-4 sg:rounded-full\" />\r\n\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-24\" />\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function PostListSkeleton({ count = 6 }: { count?: number }) {\r\n\treturn (\r\n\t\t<div className=\"sg:grid sg:grid-cols-1 sm:sg:grid-cols-2 lg:sg:grid-cols-3 sg:gap-6\">\r\n\t\t\t{Array.from({ length: count }).map((_, i) => (\r\n\t\t\t\t<PostCardSkeleton key={i} />\r\n\t\t\t))}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function PostListRowSkeleton({ count = 4 }: { count?: number }) {\r\n\treturn (\r\n\t\t<div className=\"sg:flex sg:flex-col sg:gap-4\">\r\n\t\t\t{Array.from({ length: count }).map((_, i) => (\r\n\t\t\t\t<div\r\n\t\t\t\t\tkey={i}\r\n\t\t\t\t\tclassName=\"sg:flex sg:gap-4 sg:rounded-lg sg:border sg:bg-card sg:p-4\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Skeleton className=\"sg:w-24 sg:h-24 sg:rounded-md sg:shrink-0\" />\r\n\t\t\t\t\t<div className=\"sg:flex-1 sg:space-y-2 sg:py-1\">\r\n\t\t\t\t\t\t<Skeleton className=\"sg:h-5 sg:w-3/4\" />\r\n\t\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-full\" />\r\n\t\t\t\t\t\t<Skeleton className=\"sg:h-3 sg:w-1/3\" />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t))}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function CommentSkeleton({ count = 3 }: { count?: number }) {\r\n\treturn (\r\n\t\t<div className=\"sg:space-y-4\">\r\n\t\t\t{Array.from({ length: count }).map((_, i) => (\r\n\t\t\t\t<div key={i} className=\"sg:rounded-lg sg:bg-accent sg:p-4 sg:space-y-2\">\r\n\t\t\t\t\t<div className=\"sg:flex sg:items-center sg:gap-2\">\r\n\t\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-20\" />\r\n\t\t\t\t\t\t<Skeleton className=\"sg:h-3 sg:w-16\" />\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-full\" />\r\n\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-2/3\" />\r\n\t\t\t\t</div>\r\n\t\t\t))}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport function SinglePostSkeleton() {\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<Skeleton className=\"sg:w-full sg:h-64 md:sg:h-96\" />\r\n\t\t\t<div className=\"sg:container sg:max-w-3xl sg:py-12 sg:space-y-4\">\r\n\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-32\" />\r\n\t\t\t\t<Skeleton className=\"sg:h-3 sg:w-48\" />\r\n\t\t\t\t<Skeleton className=\"sg:h-10 sg:w-3/4\" />\r\n\t\t\t\t<div className=\"sg:flex sg:gap-2\">\r\n\t\t\t\t\t<Skeleton className=\"sg:h-6 sg:w-20 sg:rounded-full\" />\r\n\t\t\t\t\t<Skeleton className=\"sg:h-6 sg:w-24 sg:rounded-full\" />\r\n\t\t\t\t</div>\r\n\t\t\t\t<Skeleton className=\"sg:h-5 sg:w-full\" />\r\n\t\t\t\t<Skeleton className=\"sg:h-5 sg:w-5/6\" />\r\n\t\t\t\t<div className=\"sg:space-y-3 sg:pt-8\">\r\n\t\t\t\t\t{Array.from({ length: 6 }).map((_, i) => (\r\n\t\t\t\t\t\t<Skeleton key={i} className=\"sg:h-4 sg:w-full\" />\r\n\t\t\t\t\t))}\r\n\t\t\t\t\t<Skeleton className=\"sg:h-4 sg:w-2/3\" />\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n"],"mappings":"AAKG,cAEC,YAFD;AALH,SAAS,gBAAgB;AAElB,SAAS,mBAAmB;AAClC,SACC,qBAAC,SAAI,WAAU,yDACd;AAAA,wBAAC,YAAS,WAAU,qBAAoB;AAAA,IACxC,qBAAC,SAAI,WAAU,uBACd;AAAA,2BAAC,SAAI,WAAU,oBACd;AAAA,4BAAC,YAAS,WAAU,kCAAiC;AAAA,QACrD,oBAAC,YAAS,WAAU,kCAAiC;AAAA,SACtD;AAAA,MACA,oBAAC,YAAS,WAAU,mBAAkB;AAAA,MACtC,oBAAC,YAAS,WAAU,oBAAmB;AAAA,MACvC,oBAAC,YAAS,WAAU,mBAAkB;AAAA,MACtC,qBAAC,SAAI,WAAU,4CACd;AAAA,4BAAC,YAAS,WAAU,iCAAgC;AAAA,QACpD,oBAAC,YAAS,WAAU,kBAAiB;AAAA,SACtC;AAAA,OACD;AAAA,KACD;AAEF;AAEO,SAAS,iBAAiB,EAAE,QAAQ,EAAE,GAAuB;AACnE,SACC,oBAAC,SAAI,WAAU,uEACb,gBAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MACtC,oBAAC,sBAAsB,CAAG,CAC1B,GACF;AAEF;AAEO,SAAS,oBAAoB,EAAE,QAAQ,EAAE,GAAuB;AACtE,SACC,oBAAC,SAAI,WAAU,gCACb,gBAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MACtC;AAAA,IAAC;AAAA;AAAA,MAEA,WAAU;AAAA,MAEV;AAAA,4BAAC,YAAS,WAAU,6CAA4C;AAAA,QAChE,qBAAC,SAAI,WAAU,kCACd;AAAA,8BAAC,YAAS,WAAU,mBAAkB;AAAA,UACtC,oBAAC,YAAS,WAAU,oBAAmB;AAAA,UACvC,oBAAC,YAAS,WAAU,mBAAkB;AAAA,WACvC;AAAA;AAAA;AAAA,IARK;AAAA,EASN,CACA,GACF;AAEF;AAEO,SAAS,gBAAgB,EAAE,QAAQ,EAAE,GAAuB;AAClE,SACC,oBAAC,SAAI,WAAU,gBACb,gBAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MACtC,qBAAC,SAAY,WAAU,kDACtB;AAAA,yBAAC,SAAI,WAAU,oCACd;AAAA,0BAAC,YAAS,WAAU,kBAAiB;AAAA,MACrC,oBAAC,YAAS,WAAU,kBAAiB;AAAA,OACtC;AAAA,IACA,oBAAC,YAAS,WAAU,oBAAmB;AAAA,IACvC,oBAAC,YAAS,WAAU,mBAAkB;AAAA,OAN7B,CAOV,CACA,GACF;AAEF;AAEO,SAAS,qBAAqB;AACpC,SACC,qBAAC,SACA;AAAA,wBAAC,YAAS,WAAU,gCAA+B;AAAA,IACnD,qBAAC,SAAI,WAAU,mDACd;AAAA,0BAAC,YAAS,WAAU,kBAAiB;AAAA,MACrC,oBAAC,YAAS,WAAU,kBAAiB;AAAA,MACrC,oBAAC,YAAS,WAAU,oBAAmB;AAAA,MACvC,qBAAC,SAAI,WAAU,oBACd;AAAA,4BAAC,YAAS,WAAU,kCAAiC;AAAA,QACrD,oBAAC,YAAS,WAAU,kCAAiC;AAAA,SACtD;AAAA,MACA,oBAAC,YAAS,WAAU,oBAAmB;AAAA,MACvC,oBAAC,YAAS,WAAU,mBAAkB;AAAA,MACtC,qBAAC,SAAI,WAAU,wBACb;AAAA,cAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MAClC,oBAAC,YAAiB,WAAU,sBAAb,CAAgC,CAC/C;AAAA,QACD,oBAAC,YAAS,WAAU,mBAAkB;AAAA,SACvC;AAAA,OACD;AAAA,KACD;AAEF;","names":[]}
@@ -1,9 +1,11 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { useId, useState } from "react";
3
+ import { useForm } from "@tanstack/react-form";
4
+ import { useId } from "react";
5
+ import { TanStackInputField } from "../../../lib/forms/tanstack-field.js";
4
6
  import { Button } from "../../primitives/buttons/button.js";
5
- import { Input } from "../../primitives/forms/input.js";
6
- import { Label } from "../../primitives/label/label.js";
7
+ import { FieldGroup } from "../../primitives/forms/field.js";
8
+ import { Form, FormActions } from "../../primitives/forms/form.js";
7
9
  import { Heading, Link, Text } from "../../primitives/index.js";
8
10
  import { cn } from "../../../utils/index.js";
9
11
  function Login({
@@ -25,56 +27,83 @@ function Login({
25
27
  autoFocus = false
26
28
  }) {
27
29
  const id = useId();
28
- const usernameId = `${id}-username`;
29
- const passwordId = `${id}-password`;
30
30
  const titleId = `${id}-title`;
31
- const [username, setUsername] = useState("");
32
- const [password, setPassword] = useState("");
33
- const handleSubmit = async (event) => {
34
- event.preventDefault();
35
- await onSubmit?.({ username, password });
36
- };
31
+ const form = useForm({
32
+ defaultValues: {
33
+ username: "",
34
+ password: ""
35
+ },
36
+ onSubmit: async ({ value }) => {
37
+ await onSubmit?.(value);
38
+ }
39
+ });
37
40
  return /* @__PURE__ */ jsxs("div", { className: cn("sg:w-full sg:max-w-sm sg:space-y-6", className), children: [
38
41
  /* @__PURE__ */ jsxs("div", { className: "sg:text-center", children: [
39
42
  /* @__PURE__ */ jsx(Heading, { variant: titleVariant, id: titleId, children: title }),
40
43
  description && /* @__PURE__ */ jsx(Text, { className: "sg:mt-2", foreground: "muted-foreground", children: description })
41
44
  ] }),
42
- /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "sg:space-y-4", "aria-labelledby": titleId, children: [
43
- /* @__PURE__ */ jsxs("div", { className: "sg:space-y-2", children: [
44
- /* @__PURE__ */ jsx(Label, { htmlFor: usernameId, children: usernameLabel }),
45
- /* @__PURE__ */ jsx(
46
- Input,
47
- {
48
- id: usernameId,
49
- type: usernameType,
50
- placeholder: usernamePlaceholder,
51
- value: username,
52
- onChange: (event) => setUsername(event.target.value),
53
- required: true,
54
- autoFocus,
55
- disabled: loading,
56
- autoComplete: "username"
57
- }
58
- )
59
- ] }),
60
- /* @__PURE__ */ jsxs("div", { className: "sg:space-y-2", children: [
61
- /* @__PURE__ */ jsx(Label, { htmlFor: passwordId, children: passwordLabel }),
62
- /* @__PURE__ */ jsx(
63
- Input,
64
- {
65
- id: passwordId,
66
- type: "password",
67
- placeholder: passwordPlaceholder,
68
- value: password,
69
- onChange: (event) => setPassword(event.target.value),
70
- required: true,
71
- disabled: loading,
72
- autoComplete: "current-password"
73
- }
74
- )
75
- ] }),
76
- /* @__PURE__ */ jsx(Button, { type: "submit", className: "sg:w-full", disabled: loading, children: loading ? loadingLabel : submitLabel })
77
- ] }),
45
+ /* @__PURE__ */ jsxs(
46
+ Form,
47
+ {
48
+ className: "sg:gap-4",
49
+ "aria-labelledby": titleId,
50
+ onSubmit: (event) => {
51
+ event.preventDefault();
52
+ event.stopPropagation();
53
+ void form.handleSubmit();
54
+ },
55
+ children: [
56
+ /* @__PURE__ */ jsxs(FieldGroup, { children: [
57
+ /* @__PURE__ */ jsx(
58
+ TanStackInputField,
59
+ {
60
+ formApi: form,
61
+ name: "username",
62
+ label: usernameLabel,
63
+ type: usernameType,
64
+ placeholder: usernamePlaceholder,
65
+ autoFocus,
66
+ disabled: loading,
67
+ autoComplete: "username",
68
+ validators: {
69
+ onChange: ({ value }) => value.trim() ? void 0 : `${usernameLabel} is required.`
70
+ }
71
+ }
72
+ ),
73
+ /* @__PURE__ */ jsx(
74
+ TanStackInputField,
75
+ {
76
+ formApi: form,
77
+ name: "password",
78
+ label: passwordLabel,
79
+ type: "password",
80
+ placeholder: passwordPlaceholder,
81
+ disabled: loading,
82
+ autoComplete: "current-password",
83
+ validators: {
84
+ onChange: ({ value }) => value.trim() ? void 0 : `${passwordLabel} is required.`
85
+ }
86
+ }
87
+ )
88
+ ] }),
89
+ /* @__PURE__ */ jsx(FormActions, { children: /* @__PURE__ */ jsx(
90
+ form.Subscribe,
91
+ {
92
+ selector: (state) => [state.canSubmit, state.isSubmitting],
93
+ children: ([canSubmit, isSubmitting]) => /* @__PURE__ */ jsx(
94
+ Button,
95
+ {
96
+ type: "submit",
97
+ className: "sg:w-full",
98
+ disabled: loading || !canSubmit || isSubmitting,
99
+ children: loading || isSubmitting ? loadingLabel : submitLabel
100
+ }
101
+ )
102
+ }
103
+ ) })
104
+ ]
105
+ }
106
+ ),
78
107
  signUpLabel && signUpHref && /* @__PURE__ */ jsxs(
79
108
  Text,
80
109
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/blocks/login/login.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useId, useState } from \"react\";\r\nimport { Button } from \"../../primitives/buttons/button\";\r\nimport { Input } from \"../../primitives/forms/input\";\r\nimport { Label } from \"../../primitives/label/label\";\r\nimport { Heading, Link, Text } from \"../../primitives/index\";\r\nimport { cn } from \"../../../utils/index\";\r\n\r\nexport type LoginCredentials = {\r\n username: string;\r\n password: string;\r\n};\r\n\r\nexport type LoginProps = {\r\n /**\r\n * Form heading text.\r\n */\r\n title?: string;\r\n /**\r\n * Supporting text shown below the heading.\r\n */\r\n description?: string;\r\n /**\r\n * Label for the username or email field.\r\n */\r\n usernameLabel?: string;\r\n /**\r\n * Input type for the identifier field.\r\n */\r\n usernameType?: \"text\" | \"email\";\r\n /**\r\n * Placeholder for the identifier field.\r\n */\r\n usernamePlaceholder?: string;\r\n /**\r\n * Label for the password field.\r\n */\r\n passwordLabel?: string;\r\n /**\r\n * Placeholder for the password field.\r\n */\r\n passwordPlaceholder?: string;\r\n /**\r\n * Submit button label when not loading.\r\n */\r\n submitLabel?: string;\r\n /**\r\n * Submit button label while loading.\r\n */\r\n loadingLabel?: string;\r\n /**\r\n * Disables the form and shows the loading label on submit.\r\n */\r\n loading?: boolean;\r\n /**\r\n * Label for the optional sign-up link.\r\n */\r\n signUpLabel?: string;\r\n /**\r\n * Destination for the optional sign-up link.\r\n */\r\n signUpHref?: string;\r\n /**\r\n * Heading level for the title.\r\n */\r\n titleVariant?: \"h1\" | \"h2\" | \"h3\" | \"h4\";\r\n /**\r\n * Called when the form is submitted with valid credentials.\r\n */\r\n onSubmit?: (credentials: LoginCredentials) => void | Promise<void>;\r\n /**\r\n * Additional classes for the root wrapper.\r\n */\r\n className?: string;\r\n /**\r\n * Focuses the identifier field on mount.\r\n */\r\n autoFocus?: boolean;\r\n};\r\n\r\n/**\r\n * Reusable login form with username/email and password fields.\r\n */\r\nexport function Login({\r\n title = \"Log in\",\r\n description,\r\n usernameLabel = \"Username\",\r\n usernameType = \"text\",\r\n usernamePlaceholder = \"johndoe\",\r\n passwordLabel = \"Password\",\r\n passwordPlaceholder = \"••••••••\",\r\n submitLabel = \"Log in\",\r\n loadingLabel = \"Logging in...\",\r\n loading = false,\r\n signUpLabel,\r\n signUpHref,\r\n titleVariant = \"h1\",\r\n onSubmit,\r\n className,\r\n autoFocus = false,\r\n}: LoginProps) {\r\n const id = useId();\r\n const usernameId = `${id}-username`;\r\n const passwordId = `${id}-password`;\r\n const titleId = `${id}-title`;\r\n const [username, setUsername] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n\r\n const handleSubmit = async (event: React.FormEvent) => {\r\n event.preventDefault();\r\n await onSubmit?.({ username, password });\r\n };\r\n\r\n return (\r\n <div className={cn(\"sg:w-full sg:max-w-sm sg:space-y-6\", className)}>\r\n <div className=\"sg:text-center\">\r\n <Heading variant={titleVariant} id={titleId}>\r\n {title}\r\n </Heading>\r\n {description && (\r\n <Text className=\"sg:mt-2\" foreground=\"muted-foreground\">\r\n {description}\r\n </Text>\r\n )}\r\n </div>\r\n\r\n <form onSubmit={handleSubmit} className=\"sg:space-y-4\" aria-labelledby={titleId}>\r\n <div className=\"sg:space-y-2\">\r\n <Label htmlFor={usernameId}>{usernameLabel}</Label>\r\n <Input\r\n id={usernameId}\r\n type={usernameType}\r\n placeholder={usernamePlaceholder}\r\n value={username}\r\n onChange={(event) => setUsername(event.target.value)}\r\n required\r\n autoFocus={autoFocus}\r\n disabled={loading}\r\n autoComplete=\"username\"\r\n />\r\n </div>\r\n <div className=\"sg:space-y-2\">\r\n <Label htmlFor={passwordId}>{passwordLabel}</Label>\r\n <Input\r\n id={passwordId}\r\n type=\"password\"\r\n placeholder={passwordPlaceholder}\r\n value={password}\r\n onChange={(event) => setPassword(event.target.value)}\r\n required\r\n disabled={loading}\r\n autoComplete=\"current-password\"\r\n />\r\n </div>\r\n <Button type=\"submit\" className=\"sg:w-full\" disabled={loading}>\r\n {loading ? loadingLabel : submitLabel}\r\n </Button>\r\n </form>\r\n\r\n {signUpLabel && signUpHref && (\r\n <Text\r\n size=\"sm\"\r\n foreground=\"muted-foreground\"\r\n className=\"sg:text-center\"\r\n >\r\n Don&apos;t have an account? <Link to={signUpHref}>{signUpLabel}</Link>\r\n </Text>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":";AAoHM,SACE,KADF;AAlHN,SAAS,OAAO,gBAAgB;AAChC,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,SAAS,MAAM,YAAY;AACpC,SAAS,UAAU;AA6EZ,SAAS,MAAM;AAAA,EACpB,QAAQ;AAAA,EACR;AAAA,EACA,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAe;AACb,QAAM,KAAK,MAAM;AACjB,QAAM,aAAa,GAAG,EAAE;AACxB,QAAM,aAAa,GAAG,EAAE;AACxB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAE3C,QAAM,eAAe,OAAO,UAA2B;AACrD,UAAM,eAAe;AACrB,UAAM,WAAW,EAAE,UAAU,SAAS,CAAC;AAAA,EACzC;AAEA,SACE,qBAAC,SAAI,WAAW,GAAG,sCAAsC,SAAS,GAChE;AAAA,yBAAC,SAAI,WAAU,kBACb;AAAA,0BAAC,WAAQ,SAAS,cAAc,IAAI,SACjC,iBACH;AAAA,MACC,eACC,oBAAC,QAAK,WAAU,WAAU,YAAW,oBAClC,uBACH;AAAA,OAEJ;AAAA,IAEA,qBAAC,UAAK,UAAU,cAAc,WAAU,gBAAe,mBAAiB,SACtE;AAAA,2BAAC,SAAI,WAAU,gBACb;AAAA,4BAAC,SAAM,SAAS,YAAa,yBAAc;AAAA,QAC3C;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,aAAa;AAAA,YACb,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,YAAY,MAAM,OAAO,KAAK;AAAA,YACnD,UAAQ;AAAA,YACR;AAAA,YACA,UAAU;AAAA,YACV,cAAa;AAAA;AAAA,QACf;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,gBACb;AAAA,4BAAC,SAAM,SAAS,YAAa,yBAAc;AAAA,QAC3C;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,YACJ,MAAK;AAAA,YACL,aAAa;AAAA,YACb,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,YAAY,MAAM,OAAO,KAAK;AAAA,YACnD,UAAQ;AAAA,YACR,UAAU;AAAA,YACV,cAAa;AAAA;AAAA,QACf;AAAA,SACF;AAAA,MACA,oBAAC,UAAO,MAAK,UAAS,WAAU,aAAY,UAAU,SACnD,oBAAU,eAAe,aAC5B;AAAA,OACF;AAAA,IAEC,eAAe,cACd;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAW;AAAA,QACX,WAAU;AAAA,QACX;AAAA;AAAA,UAC6B,oBAAC,QAAK,IAAI,YAAa,uBAAY;AAAA;AAAA;AAAA,IACjE;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/blocks/login/login.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useForm } from \"@tanstack/react-form\";\r\nimport { useId } from \"react\";\r\nimport { TanStackInputField } from \"../../../lib/forms/tanstack-field\";\r\nimport { Button } from \"../../primitives/buttons/button\";\r\nimport { FieldGroup } from \"../../primitives/forms/field\";\r\nimport { Form, FormActions } from \"../../primitives/forms/form\";\r\nimport { Heading, Link, Text } from \"../../primitives/index\";\r\nimport { cn } from \"../../../utils/index\";\r\n\r\nexport type LoginCredentials = {\r\n username: string;\r\n password: string;\r\n};\r\n\r\nexport type LoginProps = {\r\n /**\r\n * Form heading text.\r\n */\r\n title?: string;\r\n /**\r\n * Supporting text shown below the heading.\r\n */\r\n description?: string;\r\n /**\r\n * Label for the username or email field.\r\n */\r\n usernameLabel?: string;\r\n /**\r\n * Input type for the identifier field.\r\n */\r\n usernameType?: \"text\" | \"email\";\r\n /**\r\n * Placeholder for the identifier field.\r\n */\r\n usernamePlaceholder?: string;\r\n /**\r\n * Label for the password field.\r\n */\r\n passwordLabel?: string;\r\n /**\r\n * Placeholder for the password field.\r\n */\r\n passwordPlaceholder?: string;\r\n /**\r\n * Submit button label when not loading.\r\n */\r\n submitLabel?: string;\r\n /**\r\n * Submit button label while loading.\r\n */\r\n loadingLabel?: string;\r\n /**\r\n * Disables the form and shows the loading label on submit.\r\n */\r\n loading?: boolean;\r\n /**\r\n * Label for the optional sign-up link.\r\n */\r\n signUpLabel?: string;\r\n /**\r\n * Destination for the optional sign-up link.\r\n */\r\n signUpHref?: string;\r\n /**\r\n * Heading level for the title.\r\n */\r\n titleVariant?: \"h1\" | \"h2\" | \"h3\" | \"h4\";\r\n /**\r\n * Called when the form is submitted with valid credentials.\r\n */\r\n onSubmit?: (credentials: LoginCredentials) => void | Promise<void>;\r\n /**\r\n * Additional classes for the root wrapper.\r\n */\r\n className?: string;\r\n /**\r\n * Focuses the identifier field on mount.\r\n */\r\n autoFocus?: boolean;\r\n};\r\n\r\n/**\r\n * Reusable login form with username/email and password fields.\r\n */\r\nexport function Login({\r\n title = \"Log in\",\r\n description,\r\n usernameLabel = \"Username\",\r\n usernameType = \"text\",\r\n usernamePlaceholder = \"johndoe\",\r\n passwordLabel = \"Password\",\r\n passwordPlaceholder = \"••••••••\",\r\n submitLabel = \"Log in\",\r\n loadingLabel = \"Logging in...\",\r\n loading = false,\r\n signUpLabel,\r\n signUpHref,\r\n titleVariant = \"h1\",\r\n onSubmit,\r\n className,\r\n autoFocus = false,\r\n}: LoginProps) {\r\n const id = useId();\r\n const titleId = `${id}-title`;\r\n\r\n const form = useForm({\r\n defaultValues: {\r\n username: \"\",\r\n password: \"\",\r\n } satisfies LoginCredentials,\r\n onSubmit: async ({ value }) => {\r\n await onSubmit?.(value);\r\n },\r\n });\r\n\r\n return (\r\n <div className={cn(\"sg:w-full sg:max-w-sm sg:space-y-6\", className)}>\r\n <div className=\"sg:text-center\">\r\n <Heading variant={titleVariant} id={titleId}>\r\n {title}\r\n </Heading>\r\n {description && (\r\n <Text className=\"sg:mt-2\" foreground=\"muted-foreground\">\r\n {description}\r\n </Text>\r\n )}\r\n </div>\r\n\r\n <Form\r\n className=\"sg:gap-4\"\r\n aria-labelledby={titleId}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n void form.handleSubmit();\r\n }}\r\n >\r\n <FieldGroup>\r\n <TanStackInputField\r\n formApi={form}\r\n name=\"username\"\r\n label={usernameLabel}\r\n type={usernameType}\r\n placeholder={usernamePlaceholder}\r\n autoFocus={autoFocus}\r\n disabled={loading}\r\n autoComplete=\"username\"\r\n validators={{\r\n onChange: ({ value }: { value: string }) =>\r\n value.trim() ? undefined : `${usernameLabel} is required.`,\r\n }}\r\n />\r\n <TanStackInputField\r\n formApi={form}\r\n name=\"password\"\r\n label={passwordLabel}\r\n type=\"password\"\r\n placeholder={passwordPlaceholder}\r\n disabled={loading}\r\n autoComplete=\"current-password\"\r\n validators={{\r\n onChange: ({ value }: { value: string }) =>\r\n value.trim() ? undefined : `${passwordLabel} is required.`,\r\n }}\r\n />\r\n </FieldGroup>\r\n <FormActions>\r\n <form.Subscribe\r\n selector={(state) => [state.canSubmit, state.isSubmitting]}\r\n >\r\n {([canSubmit, isSubmitting]) => (\r\n <Button\r\n type=\"submit\"\r\n className=\"sg:w-full\"\r\n disabled={loading || !canSubmit || isSubmitting}\r\n >\r\n {loading || isSubmitting ? loadingLabel : submitLabel}\r\n </Button>\r\n )}\r\n </form.Subscribe>\r\n </FormActions>\r\n </Form>\r\n\r\n {signUpLabel && signUpHref && (\r\n <Text\r\n size=\"sm\"\r\n foreground=\"muted-foreground\"\r\n className=\"sg:text-center\"\r\n >\r\n Don&apos;t have an account? <Link to={signUpHref}>{signUpLabel}</Link>\r\n </Text>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":";AAuHM,SACE,KADF;AArHN,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,0BAA0B;AACnC,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,MAAM,mBAAmB;AAClC,SAAS,SAAS,MAAM,YAAY;AACpC,SAAS,UAAU;AA6EZ,SAAS,MAAM;AAAA,EACpB,QAAQ;AAAA,EACR;AAAA,EACA,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAe;AACb,QAAM,KAAK,MAAM;AACjB,QAAM,UAAU,GAAG,EAAE;AAErB,QAAM,OAAO,QAAQ;AAAA,IACnB,eAAe;AAAA,MACb,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,IACA,UAAU,OAAO,EAAE,MAAM,MAAM;AAC7B,YAAM,WAAW,KAAK;AAAA,IACxB;AAAA,EACF,CAAC;AAED,SACE,qBAAC,SAAI,WAAW,GAAG,sCAAsC,SAAS,GAChE;AAAA,yBAAC,SAAI,WAAU,kBACb;AAAA,0BAAC,WAAQ,SAAS,cAAc,IAAI,SACjC,iBACH;AAAA,MACC,eACC,oBAAC,QAAK,WAAU,WAAU,YAAW,oBAClC,uBACH;AAAA,OAEJ;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,mBAAiB;AAAA,QACjB,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB,eAAK,KAAK,aAAa;AAAA,QACzB;AAAA,QAEA;AAAA,+BAAC,cACC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,gBACb;AAAA,gBACA,UAAU;AAAA,gBACV,cAAa;AAAA,gBACb,YAAY;AAAA,kBACV,UAAU,CAAC,EAAE,MAAM,MACjB,MAAM,KAAK,IAAI,SAAY,GAAG,aAAa;AAAA,gBAC/C;AAAA;AAAA,YACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,MAAK;AAAA,gBACL,aAAa;AAAA,gBACb,UAAU;AAAA,gBACV,cAAa;AAAA,gBACb,YAAY;AAAA,kBACV,UAAU,CAAC,EAAE,MAAM,MACjB,MAAM,KAAK,IAAI,SAAY,GAAG,aAAa;AAAA,gBAC/C;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UACA,oBAAC,eACC;AAAA,YAAC,KAAK;AAAA,YAAL;AAAA,cACC,UAAU,CAAC,UAAU,CAAC,MAAM,WAAW,MAAM,YAAY;AAAA,cAExD,WAAC,CAAC,WAAW,YAAY,MACxB;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU,WAAW,CAAC,aAAa;AAAA,kBAElC,qBAAW,eAAe,eAAe;AAAA;AAAA,cAC5C;AAAA;AAAA,UAEJ,GACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEC,eAAe,cACd;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,YAAW;AAAA,QACX,WAAU;AAAA,QACX;AAAA;AAAA,UAC6B,oBAAC,QAAK,IAAI,YAAa,uBAAY;AAAA;AAAA;AAAA,IACjE;AAAA,KAEJ;AAEJ;","names":[]}
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ import { icons } from 'lucide-react';
3
+
4
+ type Props = {
5
+ icon?: keyof typeof icons;
6
+ title: string;
7
+ description?: string;
8
+ className?: string;
9
+ };
10
+ /** Centered hero strip with icon, title, and optional description. */
11
+ declare function PageHero({ icon, title, description, className }: Props): React.JSX.Element;
12
+
13
+ export { PageHero };
@@ -0,0 +1,37 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Icon, Heading, Text } from "../../primitives/index.js";
3
+ import { cn } from "../../../utils/index.js";
4
+ function PageHero({ icon, title, description, className }) {
5
+ return /* @__PURE__ */ jsx(
6
+ "section",
7
+ {
8
+ className: cn(
9
+ "sg:bg-primary/5 sg:border-b sg:border-border",
10
+ className
11
+ ),
12
+ children: /* @__PURE__ */ jsxs("div", { className: "sg:container sg:py-16 md:sg:py-20 sg:max-w-3xl sg:mx-auto sg:text-center", children: [
13
+ icon && /* @__PURE__ */ jsx(
14
+ Icon,
15
+ {
16
+ icon,
17
+ className: "sg:h-10 sg:w-10 sg:text-primary sg:mx-auto sg:mb-4"
18
+ }
19
+ ),
20
+ /* @__PURE__ */ jsx(Heading, { variant: "h1", className: "sg:mb-3", children: title }),
21
+ description && /* @__PURE__ */ jsx(
22
+ Text,
23
+ {
24
+ size: "lg",
25
+ foreground: "muted-foreground",
26
+ className: "sg:max-w-xl sg:mx-auto sg:leading-relaxed",
27
+ children: description
28
+ }
29
+ )
30
+ ] })
31
+ }
32
+ );
33
+ }
34
+ export {
35
+ PageHero
36
+ };
37
+ //# sourceMappingURL=page-hero.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/blocks/marketing/page-hero.tsx"],"sourcesContent":["import type { icons } from \"lucide-react\";\r\nimport { Icon, Heading, Text } from \"../../primitives/index\";\r\nimport { cn } from \"../../../utils/index\";\r\n\r\ntype Props = {\r\n\ticon?: keyof typeof icons;\r\n\ttitle: string;\r\n\tdescription?: string;\r\n\tclassName?: string;\r\n};\r\n\r\n/** Centered hero strip with icon, title, and optional description. */\r\nexport function PageHero({ icon, title, description, className }: Props) {\r\n\treturn (\r\n\t\t<section\r\n\t\t\tclassName={cn(\r\n\t\t\t\t\"sg:bg-primary/5 sg:border-b sg:border-border\",\r\n\t\t\t\tclassName,\r\n\t\t\t)}\r\n\t\t>\r\n\t\t\t<div className=\"sg:container sg:py-16 md:sg:py-20 sg:max-w-3xl sg:mx-auto sg:text-center\">\r\n\t\t\t\t{icon && (\r\n\t\t\t\t\t<Icon\r\n\t\t\t\t\t\ticon={icon}\r\n\t\t\t\t\t\tclassName=\"sg:h-10 sg:w-10 sg:text-primary sg:mx-auto sg:mb-4\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t)}\r\n\t\t\t\t<Heading variant=\"h1\" className=\"sg:mb-3\">\r\n\t\t\t\t\t{title}\r\n\t\t\t\t</Heading>\r\n\t\t\t\t{description && (\r\n\t\t\t\t\t<Text\r\n\t\t\t\t\t\tsize=\"lg\"\r\n\t\t\t\t\t\tforeground=\"muted-foreground\"\r\n\t\t\t\t\t\tclassName=\"sg:max-w-xl sg:mx-auto sg:leading-relaxed\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{description}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t)}\r\n\t\t\t</div>\r\n\t\t</section>\r\n\t);\r\n}\r\n"],"mappings":"AAoBG,SAEE,KAFF;AAnBH,SAAS,MAAM,SAAS,YAAY;AACpC,SAAS,UAAU;AAUZ,SAAS,SAAS,EAAE,MAAM,OAAO,aAAa,UAAU,GAAU;AACxE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MAEA,+BAAC,SAAI,WAAU,4EACb;AAAA,gBACA;AAAA,UAAC;AAAA;AAAA,YACA;AAAA,YACA,WAAU;AAAA;AAAA,QACX;AAAA,QAED,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAC9B,iBACF;AAAA,QACC,eACA;AAAA,UAAC;AAAA;AAAA,YACA,MAAK;AAAA,YACL,YAAW;AAAA,YACX,WAAU;AAAA,YAET;AAAA;AAAA,QACF;AAAA,SAEF;AAAA;AAAA,EACD;AAEF;","names":[]}
@@ -0,0 +1,16 @@
1
+ import * as React from 'react';
2
+ import { icons } from 'lucide-react';
3
+
4
+ type StatItem = {
5
+ label: string;
6
+ value: string;
7
+ icon?: keyof typeof icons;
8
+ };
9
+ type Props = {
10
+ items: StatItem[];
11
+ className?: string;
12
+ };
13
+ /** Grid of stat cards with icon, value, and label. */
14
+ declare function StatsGrid({ items, className }: Props): React.JSX.Element;
15
+
16
+ export { type StatItem, StatsGrid };
@@ -0,0 +1,30 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Card, CardContent } from "../cards/card.js";
3
+ import { Icon, Heading, Text } from "../../primitives/index.js";
4
+ import { cn } from "../../../utils/index.js";
5
+ function StatsGrid({ items, className }) {
6
+ return /* @__PURE__ */ jsx(
7
+ "div",
8
+ {
9
+ className: cn(
10
+ "sg:grid sg:grid-cols-2 md:sg:grid-cols-4 sg:gap-4",
11
+ className
12
+ ),
13
+ children: items.map((stat) => /* @__PURE__ */ jsx(Card, { className: "sg:text-center", children: /* @__PURE__ */ jsxs(CardContent, { className: "sg:pt-6 sg:pb-4", children: [
14
+ stat.icon && /* @__PURE__ */ jsx(
15
+ Icon,
16
+ {
17
+ icon: stat.icon,
18
+ className: "sg:h-6 sg:w-6 sg:text-primary sg:mx-auto sg:mb-2"
19
+ }
20
+ ),
21
+ /* @__PURE__ */ jsx(Heading, { variant: "h3", className: "sg:text-3xl", children: stat.value }),
22
+ /* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", className: "sg:mt-1", children: stat.label })
23
+ ] }) }, stat.label))
24
+ }
25
+ );
26
+ }
27
+ export {
28
+ StatsGrid
29
+ };
30
+ //# sourceMappingURL=stats-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/blocks/marketing/stats-grid.tsx"],"sourcesContent":["import type { icons } from \"lucide-react\";\r\nimport { Card, CardContent } from \"../cards/card\";\r\nimport { Icon, Heading, Text } from \"../../primitives/index\";\r\nimport { cn } from \"../../../utils/index\";\r\n\r\nexport type StatItem = {\r\n\tlabel: string;\r\n\tvalue: string;\r\n\ticon?: keyof typeof icons;\r\n};\r\n\r\ntype Props = {\r\n\titems: StatItem[];\r\n\tclassName?: string;\r\n};\r\n\r\n/** Grid of stat cards with icon, value, and label. */\r\nexport function StatsGrid({ items, className }: Props) {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName={cn(\r\n\t\t\t\t\"sg:grid sg:grid-cols-2 md:sg:grid-cols-4 sg:gap-4\",\r\n\t\t\t\tclassName,\r\n\t\t\t)}\r\n\t\t>\r\n\t\t\t{items.map((stat) => (\r\n\t\t\t\t<Card key={stat.label} className=\"sg:text-center\">\r\n\t\t\t\t\t<CardContent className=\"sg:pt-6 sg:pb-4\">\r\n\t\t\t\t\t\t{stat.icon && (\r\n\t\t\t\t\t\t\t<Icon\r\n\t\t\t\t\t\t\t\ticon={stat.icon}\r\n\t\t\t\t\t\t\t\tclassName=\"sg:h-6 sg:w-6 sg:text-primary sg:mx-auto sg:mb-2\"\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t<Heading variant=\"h3\" className=\"sg:text-3xl\">\r\n\t\t\t\t\t\t\t{stat.value}\r\n\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t<Text size=\"sm\" foreground=\"muted-foreground\" className=\"sg:mt-1\">\r\n\t\t\t\t\t\t\t{stat.label}\r\n\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t</CardContent>\r\n\t\t\t\t</Card>\r\n\t\t\t))}\r\n\t\t</div>\r\n\t);\r\n}\r\n"],"mappings":"AA2BK,SAEE,KAFF;AA1BL,SAAS,MAAM,mBAAmB;AAClC,SAAS,MAAM,SAAS,YAAY;AACpC,SAAS,UAAU;AAcZ,SAAS,UAAU,EAAE,OAAO,UAAU,GAAU;AACtD,SACC;AAAA,IAAC;AAAA;AAAA,MACA,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MAEC,gBAAM,IAAI,CAAC,SACX,oBAAC,QAAsB,WAAU,kBAChC,+BAAC,eAAY,WAAU,mBACrB;AAAA,aAAK,QACL;AAAA,UAAC;AAAA;AAAA,YACA,MAAM,KAAK;AAAA,YACX,WAAU;AAAA;AAAA,QACX;AAAA,QAED,oBAAC,WAAQ,SAAQ,MAAK,WAAU,eAC9B,eAAK,OACP;AAAA,QACA,oBAAC,QAAK,MAAK,MAAK,YAAW,oBAAmB,WAAU,WACtD,eAAK,OACP;AAAA,SACD,KAdU,KAAK,KAehB,CACA;AAAA;AAAA,EACF;AAEF;","names":[]}
@@ -0,0 +1,17 @@
1
+ import * as React from 'react';
2
+
3
+ type TimelineItem = {
4
+ year: string;
5
+ title: string;
6
+ description: string;
7
+ };
8
+ type Props = {
9
+ items: TimelineItem[];
10
+ title?: string;
11
+ description?: string;
12
+ className?: string;
13
+ };
14
+ /** Vertical timeline with year, title, and description entries. */
15
+ declare function Timeline({ items, title, description, className, }: Props): React.JSX.Element;
16
+
17
+ export { Timeline, type TimelineItem };
@@ -0,0 +1,46 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Heading, Text } from "../../primitives/index.js";
3
+ function Timeline({
4
+ items,
5
+ title = "Our Journey",
6
+ description,
7
+ className
8
+ }) {
9
+ return /* @__PURE__ */ jsxs("div", { className, children: [
10
+ /* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:mb-2", children: title }),
11
+ description && /* @__PURE__ */ jsx(Text, { foreground: "muted-foreground", className: "sg:mb-10", children: description }),
12
+ /* @__PURE__ */ jsxs("div", { className: "sg:relative", children: [
13
+ /* @__PURE__ */ jsx(
14
+ "div",
15
+ {
16
+ className: "sg:absolute sg:left-4 md:sg:left-6 sg:top-0 sg:bottom-0 sg:w-px sg:bg-border",
17
+ "aria-hidden": "true"
18
+ }
19
+ ),
20
+ /* @__PURE__ */ jsx("div", { className: "sg:space-y-10", children: items.map((item, i) => /* @__PURE__ */ jsxs("div", { className: "sg:relative sg:pl-12 md:sg:pl-16", children: [
21
+ /* @__PURE__ */ jsx(
22
+ "div",
23
+ {
24
+ className: "sg:absolute sg:left-2.5 md:sg:left-4.5 sg:top-1 sg:h-3 sg:w-3 sg:rounded-full sg:bg-primary sg:ring-4 sg:ring-background",
25
+ "aria-hidden": "true"
26
+ }
27
+ ),
28
+ /* @__PURE__ */ jsx(
29
+ Text,
30
+ {
31
+ size: "xs",
32
+ foreground: "muted-foreground",
33
+ className: "sg:font-mono sg:uppercase sg:tracking-wider",
34
+ children: item.year
35
+ }
36
+ ),
37
+ /* @__PURE__ */ jsx(Heading, { variant: "h4", className: "sg:mt-0.5", children: item.title }),
38
+ /* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", className: "sg:mt-1", children: item.description })
39
+ ] }, i)) })
40
+ ] })
41
+ ] });
42
+ }
43
+ export {
44
+ Timeline
45
+ };
46
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/blocks/marketing/timeline.tsx"],"sourcesContent":["import { Heading, Text } from \"../../primitives/index\";\r\n\r\nexport type TimelineItem = {\r\n\tyear: string;\r\n\ttitle: string;\r\n\tdescription: string;\r\n};\r\n\r\ntype Props = {\r\n\titems: TimelineItem[];\r\n\ttitle?: string;\r\n\tdescription?: string;\r\n\tclassName?: string;\r\n};\r\n\r\n/** Vertical timeline with year, title, and description entries. */\r\nexport function Timeline({\r\n\titems,\r\n\ttitle = \"Our Journey\",\r\n\tdescription,\r\n\tclassName,\r\n}: Props) {\r\n\treturn (\r\n\t\t<div className={className}>\r\n\t\t\t<Heading variant=\"h2\" className=\"sg:mb-2\">\r\n\t\t\t\t{title}\r\n\t\t\t</Heading>\r\n\t\t\t{description && (\r\n\t\t\t\t<Text foreground=\"muted-foreground\" className=\"sg:mb-10\">\r\n\t\t\t\t\t{description}\r\n\t\t\t\t</Text>\r\n\t\t\t)}\r\n\t\t\t<div className=\"sg:relative\">\r\n\t\t\t\t<div\r\n\t\t\t\t\tclassName=\"sg:absolute sg:left-4 md:sg:left-6 sg:top-0 sg:bottom-0 sg:w-px sg:bg-border\"\r\n\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t/>\r\n\t\t\t\t<div className=\"sg:space-y-10\">\r\n\t\t\t\t\t{items.map((item, i) => (\r\n\t\t\t\t\t\t<div key={i} className=\"sg:relative sg:pl-12 md:sg:pl-16\">\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tclassName=\"sg:absolute sg:left-2.5 md:sg:left-4.5 sg:top-1 sg:h-3 sg:w-3 sg:rounded-full sg:bg-primary sg:ring-4 sg:ring-background\"\r\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<Text\r\n\t\t\t\t\t\t\t\tsize=\"xs\"\r\n\t\t\t\t\t\t\t\tforeground=\"muted-foreground\"\r\n\t\t\t\t\t\t\t\tclassName=\"sg:font-mono sg:uppercase sg:tracking-wider\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{item.year}\r\n\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t<Heading variant=\"h4\" className=\"sg:mt-0.5\">\r\n\t\t\t\t\t\t\t\t{item.title}\r\n\t\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t\t<Text size=\"sm\" foreground=\"muted-foreground\" className=\"sg:mt-1\">\r\n\t\t\t\t\t\t\t\t{item.description}\r\n\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n"],"mappings":"AAwBG,cAeG,YAfH;AAxBH,SAAS,SAAS,YAAY;AAgBvB,SAAS,SAAS;AAAA,EACxB;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACD,GAAU;AACT,SACC,qBAAC,SAAI,WACJ;AAAA,wBAAC,WAAQ,SAAQ,MAAK,WAAU,WAC9B,iBACF;AAAA,IACC,eACA,oBAAC,QAAK,YAAW,oBAAmB,WAAU,YAC5C,uBACF;AAAA,IAED,qBAAC,SAAI,WAAU,eACd;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,WAAU;AAAA,UACV,eAAY;AAAA;AAAA,MACb;AAAA,MACA,oBAAC,SAAI,WAAU,iBACb,gBAAM,IAAI,CAAC,MAAM,MACjB,qBAAC,SAAY,WAAU,oCACtB;AAAA;AAAA,UAAC;AAAA;AAAA,YACA,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,QACb;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACA,MAAK;AAAA,YACL,YAAW;AAAA,YACX,WAAU;AAAA,YAET,eAAK;AAAA;AAAA,QACP;AAAA,QACA,oBAAC,WAAQ,SAAQ,MAAK,WAAU,aAC9B,eAAK,OACP;AAAA,QACA,oBAAC,QAAK,MAAK,MAAK,YAAW,oBAAmB,WAAU,WACtD,eAAK,aACP;AAAA,WAjBS,CAkBV,CACA,GACF;AAAA,OACD;AAAA,KACD;AAEF;","names":[]}
@@ -0,0 +1,16 @@
1
+ import * as React$1 from 'react';
2
+
3
+ type ValueItem = {
4
+ title: string;
5
+ description: string;
6
+ };
7
+ type Props = {
8
+ items: ValueItem[];
9
+ title?: string;
10
+ icon?: React.ReactNode;
11
+ className?: string;
12
+ };
13
+ /** Grid of value cards with title and description. */
14
+ declare function ValuesGrid({ items, title, icon, className, }: Props): React$1.JSX.Element;
15
+
16
+ export { type ValueItem, ValuesGrid };
@@ -0,0 +1,29 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Heading, Text } from "../../primitives/index.js";
3
+ import { cn } from "../../../utils/index.js";
4
+ function ValuesGrid({
5
+ items,
6
+ title = "What We Value",
7
+ icon,
8
+ className
9
+ }) {
10
+ return /* @__PURE__ */ jsxs("div", { className: cn("sg:text-center", className), children: [
11
+ icon,
12
+ /* @__PURE__ */ jsx(Heading, { variant: "h2", className: "sg:mb-4", children: title }),
13
+ /* @__PURE__ */ jsx("div", { className: "sg:grid sg:gap-4 sm:sg:grid-cols-3 sg:text-left sg:mt-8", children: items.map((value) => /* @__PURE__ */ jsxs(
14
+ "div",
15
+ {
16
+ className: "sg:p-4 sg:rounded-lg sg:bg-background sg:border sg:border-border",
17
+ children: [
18
+ /* @__PURE__ */ jsx(Heading, { variant: "h6", className: "sg:mb-1", children: value.title }),
19
+ /* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", children: value.description })
20
+ ]
21
+ },
22
+ value.title
23
+ )) })
24
+ ] });
25
+ }
26
+ export {
27
+ ValuesGrid
28
+ };
29
+ //# sourceMappingURL=values-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/blocks/marketing/values-grid.tsx"],"sourcesContent":["import { Heading, Text } from \"../../primitives/index\";\r\nimport { cn } from \"../../../utils/index\";\r\n\r\nexport type ValueItem = {\r\n\ttitle: string;\r\n\tdescription: string;\r\n};\r\n\r\ntype Props = {\r\n\titems: ValueItem[];\r\n\ttitle?: string;\r\n\ticon?: React.ReactNode;\r\n\tclassName?: string;\r\n};\r\n\r\n/** Grid of value cards with title and description. */\r\nexport function ValuesGrid({\r\n\titems,\r\n\ttitle = \"What We Value\",\r\n\ticon,\r\n\tclassName,\r\n}: Props) {\r\n\treturn (\r\n\t\t<div className={cn(\"sg:text-center\", className)}>\r\n\t\t\t{icon}\r\n\t\t\t<Heading variant=\"h2\" className=\"sg:mb-4\">\r\n\t\t\t\t{title}\r\n\t\t\t</Heading>\r\n\t\t\t<div className=\"sg:grid sg:gap-4 sm:sg:grid-cols-3 sg:text-left sg:mt-8\">\r\n\t\t\t\t{items.map((value) => (\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tkey={value.title}\r\n\t\t\t\t\t\tclassName=\"sg:p-4 sg:rounded-lg sg:bg-background sg:border sg:border-border\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Heading variant=\"h6\" className=\"sg:mb-1\">\r\n\t\t\t\t\t\t\t{value.title}\r\n\t\t\t\t\t\t</Heading>\r\n\t\t\t\t\t\t<Text size=\"sm\" foreground=\"muted-foreground\">\r\n\t\t\t\t\t\t\t{value.description}\r\n\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t))}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n"],"mappings":"AAyBG,cAKE,YALF;AAzBH,SAAS,SAAS,YAAY;AAC9B,SAAS,UAAU;AAeZ,SAAS,WAAW;AAAA,EAC1B;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACD,GAAU;AACT,SACC,qBAAC,SAAI,WAAW,GAAG,kBAAkB,SAAS,GAC5C;AAAA;AAAA,IACD,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAC9B,iBACF;AAAA,IACA,oBAAC,SAAI,WAAU,2DACb,gBAAM,IAAI,CAAC,UACX;AAAA,MAAC;AAAA;AAAA,QAEA,WAAU;AAAA,QAEV;AAAA,8BAAC,WAAQ,SAAQ,MAAK,WAAU,WAC9B,gBAAM,OACR;AAAA,UACA,oBAAC,QAAK,MAAK,MAAK,YAAW,oBACzB,gBAAM,aACR;AAAA;AAAA;AAAA,MARK,MAAM;AAAA,IASZ,CACA,GACF;AAAA,KACD;AAEF;","names":[]}
@@ -193,9 +193,9 @@ function PostListWithFilters({
193
193
  /* @__PURE__ */ jsx(AnimatePresence, { children: isFiltersOpen && /* @__PURE__ */ jsxs(
194
194
  motion.div,
195
195
  {
196
- initial: { height: 0, opacity: 0 },
196
+ initial: { height: 0, opacity: 1 },
197
197
  animate: { height: "auto", opacity: 1 },
198
- exit: { height: 0, opacity: 0 },
198
+ exit: { height: 0, opacity: 1 },
199
199
  className: "sg:overflow-hidden sg:border sg:rounded-xl sg:p-6 sg:bg-card sg:mb-8 sg:shadow-sm",
200
200
  children: [
201
201
  /* @__PURE__ */ jsxs("div", { className: "sg:flex sg:justify-between sg:items-center sg:mb-6", children: [
@@ -312,9 +312,9 @@ function PostListWithFilters({
312
312
  /* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsx(
313
313
  motion.div,
314
314
  {
315
- initial: { opacity: 0, y: 10 },
315
+ initial: { opacity: 1, y: 10 },
316
316
  animate: { opacity: 1, y: 0 },
317
- exit: { opacity: 0, y: -10 },
317
+ exit: { opacity: 1, y: -10 },
318
318
  transition: { duration: 0.2 },
319
319
  className: viewMode === "grid" ? "sg:grid sg:grid-cols-[repeat(auto-fill,minmax(210px,1fr))] sg:gap-8" : "sg:flex sg:flex-col sg:gap-4",
320
320
  children: displayed.map(