singularity-components 0.1.194 → 0.1.196

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/dist/components/blocks/badges/category-badge.d.ts +11 -0
  2. package/dist/components/blocks/badges/category-badge.js +34 -0
  3. package/dist/components/blocks/badges/category-badge.js.map +1 -0
  4. package/dist/components/blocks/cards/blogpost-card.d.ts +4 -2
  5. package/dist/components/blocks/cards/blogpost-card.js +9 -4
  6. package/dist/components/blocks/cards/blogpost-card.js.map +1 -1
  7. package/dist/components/blocks/cards/card.d.ts +7 -8
  8. package/dist/components/blocks/directory/author-card.d.ts +10 -0
  9. package/dist/components/blocks/directory/author-card.js +50 -0
  10. package/dist/components/blocks/directory/author-card.js.map +1 -0
  11. package/dist/components/blocks/directory/category-card.d.ts +10 -0
  12. package/dist/components/blocks/directory/category-card.js +26 -0
  13. package/dist/components/blocks/directory/category-card.js.map +1 -0
  14. package/dist/components/blocks/empty-state/EmptyState.d.ts +2 -2
  15. package/dist/components/blocks/extras/extras-hub-card.d.ts +16 -0
  16. package/dist/components/blocks/extras/extras-hub-card.js +21 -0
  17. package/dist/components/blocks/extras/extras-hub-card.js.map +1 -0
  18. package/dist/components/blocks/gallery/image-gallery.d.ts +14 -0
  19. package/dist/components/blocks/gallery/image-gallery.js +211 -0
  20. package/dist/components/blocks/gallery/image-gallery.js.map +1 -0
  21. package/dist/components/blocks/index.d.ts +12 -1
  22. package/dist/components/blocks/index.js +11 -0
  23. package/dist/components/blocks/index.js.map +1 -1
  24. package/dist/components/blocks/loading/loading-skeletons.d.ts +15 -0
  25. package/dist/components/blocks/loading/loading-skeletons.js +78 -0
  26. package/dist/components/blocks/loading/loading-skeletons.js.map +1 -0
  27. package/dist/components/blocks/login/login.d.ts +78 -0
  28. package/dist/components/blocks/login/login.js +95 -0
  29. package/dist/components/blocks/login/login.js.map +1 -0
  30. package/dist/components/blocks/marketing/page-hero.d.ts +13 -0
  31. package/dist/components/blocks/marketing/page-hero.js +37 -0
  32. package/dist/components/blocks/marketing/page-hero.js.map +1 -0
  33. package/dist/components/blocks/marketing/stats-grid.d.ts +16 -0
  34. package/dist/components/blocks/marketing/stats-grid.js +30 -0
  35. package/dist/components/blocks/marketing/stats-grid.js.map +1 -0
  36. package/dist/components/blocks/marketing/timeline.d.ts +17 -0
  37. package/dist/components/blocks/marketing/timeline.js +45 -0
  38. package/dist/components/blocks/marketing/timeline.js.map +1 -0
  39. package/dist/components/blocks/marketing/values-grid.d.ts +16 -0
  40. package/dist/components/blocks/marketing/values-grid.js +29 -0
  41. package/dist/components/blocks/marketing/values-grid.js.map +1 -0
  42. package/dist/components/blocks/post-list/post-filters.d.ts +2 -2
  43. package/dist/components/blocks/post-list/post-list-with-filters.d.ts +2 -2
  44. package/dist/components/index.d.ts +30 -3
  45. package/dist/components/pages/about/about-page.d.ts +5 -0
  46. package/dist/components/pages/about/about-page.js +161 -0
  47. package/dist/components/pages/about/about-page.js.map +1 -0
  48. package/dist/components/pages/admin/admin-page.d.ts +2 -2
  49. package/dist/components/pages/admin/admin-page.js +4 -1
  50. package/dist/components/pages/admin/admin-page.js.map +1 -1
  51. package/dist/components/pages/author/author-page.d.ts +8 -0
  52. package/dist/components/pages/author/author-page.js +107 -0
  53. package/dist/components/pages/author/author-page.js.map +1 -0
  54. package/dist/components/pages/authors/authors-page.d.ts +5 -0
  55. package/dist/components/pages/authors/authors-page.js +25 -0
  56. package/dist/components/pages/authors/authors-page.js.map +1 -0
  57. package/dist/components/pages/blogpost/blogpost.d.ts +5 -2
  58. package/dist/components/pages/blogpost/blogpost.js +38 -18
  59. package/dist/components/pages/blogpost/blogpost.js.map +1 -1
  60. package/dist/components/pages/categories/categories-page.d.ts +5 -0
  61. package/dist/components/pages/categories/categories-page.js +33 -0
  62. package/dist/components/pages/categories/categories-page.js.map +1 -0
  63. package/dist/components/pages/category/category-page.d.ts +2 -2
  64. package/dist/components/pages/category/category-page.js +3 -1
  65. package/dist/components/pages/category/category-page.js.map +1 -1
  66. package/dist/components/pages/chat/chat-page.d.ts +2 -2
  67. package/dist/components/pages/contact/contact-page.d.ts +5 -0
  68. package/dist/components/pages/contact/contact-page.js +173 -0
  69. package/dist/components/pages/contact/contact-page.js.map +1 -0
  70. package/dist/components/pages/content-blocks/content-blocks-page.d.ts +5 -0
  71. package/dist/components/pages/content-blocks/content-blocks-page.js +86 -0
  72. package/dist/components/pages/content-blocks/content-blocks-page.js.map +1 -0
  73. package/dist/components/pages/extras/extras-hub-page.d.ts +10 -0
  74. package/dist/components/pages/extras/extras-hub-page.js +110 -0
  75. package/dist/components/pages/extras/extras-hub-page.js.map +1 -0
  76. package/dist/components/pages/index.d.ts +15 -1
  77. package/dist/components/pages/index.js +12 -0
  78. package/dist/components/pages/index.js.map +1 -1
  79. package/dist/components/pages/login/login-page.d.ts +2 -2
  80. package/dist/components/pages/login/login-page.js +19 -69
  81. package/dist/components/pages/login/login-page.js.map +1 -1
  82. package/dist/components/pages/maintenance/maintenance-page.d.ts +2 -2
  83. package/dist/components/pages/membership/membership-page.d.ts +5 -0
  84. package/dist/components/pages/membership/membership-page.js +131 -0
  85. package/dist/components/pages/membership/membership-page.js.map +1 -0
  86. package/dist/components/pages/mosaic/mosaic-page.d.ts +5 -0
  87. package/dist/components/pages/mosaic/mosaic-page.js +81 -0
  88. package/dist/components/pages/mosaic/mosaic-page.js.map +1 -0
  89. package/dist/components/pages/newsletter/newsletter-page.d.ts +5 -0
  90. package/dist/components/pages/newsletter/newsletter-page.js +148 -0
  91. package/dist/components/pages/newsletter/newsletter-page.js.map +1 -0
  92. package/dist/components/pages/not-found/not-found.d.ts +2 -2
  93. package/dist/components/pages/privacy/privacy-page.d.ts +2 -2
  94. package/dist/components/pages/resources/resources-page.d.ts +5 -0
  95. package/dist/components/pages/resources/resources-page.js +24 -0
  96. package/dist/components/pages/resources/resources-page.js.map +1 -0
  97. package/dist/components/pages/search/search-page.d.ts +2 -2
  98. package/dist/components/pages/startpage/startpage.d.ts +2 -2
  99. package/dist/components/pages/startpage/startpage.js +6 -4
  100. package/dist/components/pages/startpage/startpage.js.map +1 -1
  101. package/dist/components/pages/terms/terms-page.d.ts +2 -2
  102. package/dist/components/primitives/accordion/accordion.d.ts +5 -5
  103. package/dist/components/primitives/accordion/accordion.js +14 -16
  104. package/dist/components/primitives/accordion/accordion.js.map +1 -1
  105. package/dist/components/primitives/alert/alert.d.ts +4 -5
  106. package/dist/components/primitives/avatar/avatar.d.ts +6 -7
  107. package/dist/components/primitives/badge/badge.js +1 -1
  108. package/dist/components/primitives/badge/badge.js.map +1 -1
  109. package/dist/components/primitives/badge/badges.d.ts +1 -2
  110. package/dist/components/primitives/buttons/button.d.ts +4 -4
  111. package/dist/components/primitives/buttons/icon-button.d.ts +3 -3
  112. package/dist/components/primitives/buttons/link-button.d.ts +2 -3
  113. package/dist/components/primitives/collapsible/collapsible.d.ts +3 -4
  114. package/dist/components/primitives/collapsible/collapsible.js +4 -1
  115. package/dist/components/primitives/collapsible/collapsible.js.map +1 -1
  116. package/dist/components/primitives/dropdown-menu/dropdown-menu.d.ts +1 -2
  117. package/dist/components/primitives/dropdown-menu/dropdown-menu.js +6 -1
  118. package/dist/components/primitives/dropdown-menu/dropdown-menu.js.map +1 -1
  119. package/dist/components/primitives/forms/checkbox.d.ts +2 -2
  120. package/dist/components/primitives/forms/checkbox.js +1 -1
  121. package/dist/components/primitives/forms/checkbox.js.map +1 -1
  122. package/dist/components/primitives/forms/field.d.ts +14 -13
  123. package/dist/components/primitives/forms/field.js +4 -2
  124. package/dist/components/primitives/forms/field.js.map +1 -1
  125. package/dist/components/primitives/forms/form-control.d.ts +28 -0
  126. package/dist/components/primitives/forms/form-control.js +40 -0
  127. package/dist/components/primitives/forms/form-control.js.map +1 -0
  128. package/dist/components/primitives/forms/form.d.ts +12 -0
  129. package/dist/components/primitives/forms/form.js +30 -0
  130. package/dist/components/primitives/forms/form.js.map +1 -0
  131. package/dist/components/primitives/forms/input.d.ts +1 -2
  132. package/dist/components/primitives/forms/select.d.ts +7 -8
  133. package/dist/components/primitives/forms/select.js +12 -12
  134. package/dist/components/primitives/forms/select.js.map +1 -1
  135. package/dist/components/primitives/forms/textarea.d.ts +1 -2
  136. package/dist/components/primitives/icon/icon.d.ts +4 -4
  137. package/dist/components/primitives/icon/icon.js +2 -1
  138. package/dist/components/primitives/icon/icon.js.map +1 -1
  139. package/dist/components/primitives/index.d.ts +6 -3
  140. package/dist/components/primitives/index.js +3 -0
  141. package/dist/components/primitives/index.js.map +1 -1
  142. package/dist/components/primitives/label/label.d.ts +1 -2
  143. package/dist/components/primitives/layout/layout.d.ts +5 -4
  144. package/dist/components/primitives/layout/layout.js.map +1 -1
  145. package/dist/components/primitives/link/link.d.ts +4 -5
  146. package/dist/components/primitives/separator/separator.d.ts +2 -2
  147. package/dist/components/primitives/sheet/sheet.d.ts +2 -3
  148. package/dist/components/primitives/sheet/sheet.js +1 -1
  149. package/dist/components/primitives/sheet/sheet.js.map +1 -1
  150. package/dist/components/primitives/skeleton/skeleton.d.ts +2 -2
  151. package/dist/components/primitives/sonner/sonner.d.ts +2 -2
  152. package/dist/components/primitives/spinner/spinner.d.ts +2 -2
  153. package/dist/components/primitives/stack/stack.d.ts +47 -3
  154. package/dist/components/primitives/stack/stack.js +44 -42
  155. package/dist/components/primitives/stack/stack.js.map +1 -1
  156. package/dist/components/primitives/text/heading.d.ts +2 -3
  157. package/dist/components/primitives/text/internal/text-element.d.ts +9 -4
  158. package/dist/components/primitives/text/internal/text-element.js +3 -0
  159. package/dist/components/primitives/text/internal/text-element.js.map +1 -1
  160. package/dist/components/primitives/text/text-code.d.ts +3 -3
  161. package/dist/components/primitives/text/text-div.d.ts +2 -3
  162. package/dist/components/primitives/text/text-span.d.ts +2 -3
  163. package/dist/components/primitives/text/text-time.d.ts +2 -3
  164. package/dist/components/primitives/text/text.d.ts +2 -3
  165. package/dist/components/primitives/ui-image/ui-image.d.ts +2 -3
  166. package/dist/components/primitives/ui-link/ui-link.d.ts +2 -3
  167. package/dist/components/providers/SingularityContext.d.ts +0 -1
  168. package/dist/components/providers/auth-provider.d.ts +2 -2
  169. package/dist/components/providers/index.d.ts +0 -1
  170. package/dist/components/providers/theme-provider.d.ts +1 -2
  171. package/dist/components/templates/container/container.d.ts +4 -5
  172. package/dist/components/templates/footer/footer.d.ts +2 -2
  173. package/dist/components/templates/form/form.d.ts +2 -2
  174. package/dist/components/templates/hero/hero.d.ts +2 -2
  175. package/dist/components/templates/index.d.ts +1 -1
  176. package/dist/components/templates/index.js +1 -0
  177. package/dist/components/templates/index.js.map +1 -1
  178. package/dist/components/templates/loading-screen/loading-screen.d.ts +10 -0
  179. package/dist/components/templates/loading-screen/loading-screen.js +39 -0
  180. package/dist/components/templates/loading-screen/loading-screen.js.map +1 -0
  181. package/dist/components/templates/navigation/header.d.ts +1 -2
  182. package/dist/components/templates/navigation/index.d.ts +0 -1
  183. package/dist/css/variables.css +2 -0
  184. package/dist/css/variables.css.map +1 -1
  185. package/dist/data/posts.d.ts +5 -0
  186. package/dist/data/posts.js +37 -4
  187. package/dist/data/posts.js.map +1 -1
  188. package/dist/index.d.ts +30 -3
  189. package/dist/lib/forms/field-props.d.ts +60 -0
  190. package/dist/lib/forms/field-props.js +60 -0
  191. package/dist/lib/forms/field-props.js.map +1 -0
  192. package/dist/lib/forms/index.d.ts +11 -0
  193. package/dist/lib/forms/index.js +3 -0
  194. package/dist/lib/forms/index.js.map +1 -0
  195. package/dist/lib/forms/tanstack-field.d.ts +56 -0
  196. package/dist/lib/forms/tanstack-field.js +114 -0
  197. package/dist/lib/forms/tanstack-field.js.map +1 -0
  198. package/dist/lib/index.d.ts +11 -0
  199. package/dist/lib/index.js +1 -0
  200. package/dist/lib/index.js.map +1 -1
  201. package/dist/main.css +442 -117
  202. package/dist/main.css.map +1 -1
  203. package/package.json +64 -39
@@ -1,6 +1,7 @@
1
1
  const posts = [
2
2
  {
3
3
  id: 1,
4
+ slug: "the-art-of-slow-living",
4
5
  title: "The Art of Slow Living",
5
6
  excerpt: "In a world that never stops moving, there's a quiet revolution happening \u2014 one that asks us to pause, breathe, and savor.",
6
7
  content: `In a world that never stops moving, there's a quiet revolution happening \u2014 one that asks us to pause, breathe, and savor the moments that make up our days.
@@ -23,10 +24,20 @@ The beauty of slow living is that it doesn't require a complete lifestyle overha
23
24
  originalImage: "https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=800&h=500&fit=crop",
24
25
  date: "2026-02-01",
25
26
  author: "Elena Marsh",
26
- categories: ["Mindfulness"]
27
+ categories: ["Mindfulness"],
28
+ featured: true,
29
+ gallery: [
30
+ { src: "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800&h=600&fit=crop", alt: "Mountain lake at dawn" },
31
+ { src: "https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=800&h=600&fit=crop", alt: "Foggy forest path" },
32
+ { src: "https://images.unsplash.com/photo-1441974231531-c6227db76b6e?w=800&h=600&fit=crop", alt: "Sunlit woodland" },
33
+ { src: "https://images.unsplash.com/photo-1465146344425-f00d5f5c8f07?w=800&h=600&fit=crop", alt: "Wildflowers in a field" },
34
+ { src: "https://images.unsplash.com/photo-1501854140801-50d01698950b?w=800&h=600&fit=crop", alt: "Aerial view of green hills" },
35
+ { src: "https://images.unsplash.com/photo-1472214103451-9374bd1c798e?w=800&h=600&fit=crop", alt: "Valley at sunset" }
36
+ ]
27
37
  },
28
38
  {
29
39
  id: 2,
40
+ slug: "designing-with-intention",
30
41
  title: "Designing with Intention",
31
42
  excerpt: "Good design isn't decoration \u2014 it's communication. Every color, typeface, and pixel should earn its place.",
32
43
  content: `Good design isn't decoration \u2014 it's communication. Every color, typeface, and pixel should earn its place on the page.
@@ -50,10 +61,12 @@ The beauty of slow living is that it doesn't require a complete lifestyle overha
50
61
  originalImage: "https://images.unsplash.com/photo-1558618666-fcd25c85f82e?w=800&h=500&fit=crop",
51
62
  date: "2026-01-28",
52
63
  author: "Elena Marsh",
53
- categories: ["Design"]
64
+ categories: ["Design"],
65
+ featured: true
54
66
  },
55
67
  {
56
68
  id: 3,
69
+ slug: "morning-rituals-around-the-world",
57
70
  title: "Morning Rituals Around the World",
58
71
  excerpt: "From Japanese tea ceremonies to Scandinavian fika, how different cultures start their day reveals what they value most.",
59
72
  content: `From Japanese tea ceremonies to Scandinavian fika, how different cultures start their day reveals what they value most.
@@ -79,10 +92,18 @@ These rituals remind us that how we begin our day shapes everything that follows
79
92
  originalImage: "https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?w=800&h=500&fit=crop",
80
93
  date: "2026-01-20",
81
94
  author: "Elena Marsh",
82
- categories: ["Culture"]
95
+ categories: ["Culture"],
96
+ featured: true,
97
+ gallery: [
98
+ { src: "https://images.unsplash.com/photo-1545569341-9eb8b30979d9?w=800&h=600&fit=crop", alt: "Japanese temple garden" },
99
+ { src: "https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e?w=800&h=600&fit=crop", alt: "Traditional tea ceremony" },
100
+ { src: "https://images.unsplash.com/photo-1504754524776-8f4f37790ca0?w=800&h=600&fit=crop", alt: "Breakfast spread" },
101
+ { src: "https://images.unsplash.com/photo-1514933651103-005eec06c04b?w=800&h=600&fit=crop", alt: "Italian espresso bar" }
102
+ ]
83
103
  },
84
104
  {
85
105
  id: 4,
106
+ slug: "the-beauty-of-imperfection",
86
107
  title: "The Beauty of Imperfection",
87
108
  excerpt: "Wabi-sabi teaches us to find beauty in the worn, the weathered, and the wonderfully imperfect.",
88
109
  content: `Wabi-sabi teaches us to find beauty in the worn, the weathered, and the wonderfully imperfect.
@@ -104,10 +125,16 @@ The cracked pot, the faded photograph, the well-worn book \u2014 these carry sto
104
125
  originalImage: "https://images.unsplash.com/photo-1493106819501-66d381c466f3?w=800&h=500&fit=crop",
105
126
  date: "2026-01-15",
106
127
  author: "Elena Marsh",
107
- categories: ["Philosophy"]
128
+ categories: ["Philosophy"],
129
+ gallery: [
130
+ { src: "https://images.unsplash.com/photo-1528297506728-9533d2ac3fa4?w=800&h=600&fit=crop", alt: "Handmade ceramic bowl" },
131
+ { src: "https://images.unsplash.com/photo-1565193566173-7a0ee3dbe261?w=800&h=600&fit=crop", alt: "Cracked pottery with gold" },
132
+ { src: "https://images.unsplash.com/photo-1493106641515-6b5631de4bb9?w=800&h=600&fit=crop", alt: "Worn wooden texture" }
133
+ ]
108
134
  },
109
135
  {
110
136
  id: 5,
137
+ slug: "building-a-reading-habit",
111
138
  title: "Building a Reading Habit",
112
139
  excerpt: "Reading more doesn't require willpower \u2014 it requires environment design and a bit of curiosity.",
113
140
  content: `Reading more doesn't require willpower \u2014 it requires environment design and a bit of curiosity.
@@ -137,6 +164,7 @@ The goal isn't to read more books. It's to enjoy reading again.`,
137
164
  },
138
165
  {
139
166
  id: 6,
167
+ slug: "color-in-everyday-life",
140
168
  title: "Color in Everyday Life",
141
169
  excerpt: "We rarely notice it, but color shapes our moods, decisions, and memories more than we realize.",
142
170
  content: `We rarely notice it, but color shapes our moods, decisions, and memories more than we realize.
@@ -164,6 +192,7 @@ Notice the colors around you today. The golden light of morning. The deep green
164
192
  },
165
193
  {
166
194
  id: 7,
195
+ slug: "the-power-of-walking",
167
196
  title: "The Power of Walking",
168
197
  excerpt: "A daily walk is the most underrated tool for creativity, clarity, and calm.",
169
198
  content: `Walking is humanity's oldest form of movement \u2014 and still one of its most powerful. Great thinkers from Aristotle to Steve Jobs were known for their walking meetings and strolls.
@@ -183,6 +212,7 @@ You don't need a trail or a destination. A 20-minute loop around your neighborho
183
212
  },
184
213
  {
185
214
  id: 8,
215
+ slug: "minimalism-beyond-aesthetics",
186
216
  title: "Minimalism Beyond Aesthetics",
187
217
  excerpt: "True minimalism isn't about owning less \u2014 it's about making room for what matters.",
188
218
  content: `Minimalism has been reduced to white walls and empty shelves. But the philosophy runs much deeper than aesthetics.
@@ -202,6 +232,7 @@ Our phones hold more clutter than our homes. Audit your apps, notifications, and
202
232
  },
203
233
  {
204
234
  id: 9,
235
+ slug: "the-lost-art-of-letter-writing",
205
236
  title: "The Lost Art of Letter Writing",
206
237
  excerpt: "In an age of instant messaging, a handwritten letter carries a weight that no text can match.",
207
238
  content: `There's something irreplaceable about receiving a handwritten letter. The texture of the paper, the imperfections of the handwriting, the knowledge that someone sat down and gave you their time.
@@ -221,6 +252,7 @@ Buy a simple set of stationery. Write to someone you care about. It doesn't need
221
252
  },
222
253
  {
223
254
  id: 10,
255
+ slug: "cooking-as-meditation",
224
256
  title: "Cooking as Meditation",
225
257
  excerpt: "The kitchen can be your sanctuary \u2014 if you let the process matter more than the result.",
226
258
  content: `We often think of cooking as a chore \u2014 something to get through before we can eat. But approached differently, it becomes a meditative practice.
@@ -240,6 +272,7 @@ Start with a recipe you love. Prep all your ingredients before you begin. Put on
240
272
  },
241
273
  {
242
274
  id: 11,
275
+ slug: "digital-detox-weekend",
243
276
  title: "The Digital Detox Weekend",
244
277
  excerpt: "48 hours without screens sounds terrifying \u2014 until you try it and realize how much you've been missing.",
245
278
  content: `A digital detox weekend isn't about hating technology. It's about remembering what life feels like without constant input.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/data/posts.ts"],"sourcesContent":["export interface BlogPost {\r\n id: number;\r\n title: string;\r\n excerpt: string;\r\n content: string;\r\n primaryImage: string;\r\n originalImage: string;\r\n date: string;\r\n author: string;\r\n featured?: boolean;\r\n categories: string[];\r\n}\r\n\r\nexport interface Comment {\r\n id: string;\r\n author: string;\r\n text: string;\r\n date: string;\r\n}\r\n\r\nexport const posts: BlogPost[] = [\r\n {\r\n id: 1,\r\n title: \"The Art of Slow Living\",\r\n excerpt:\r\n \"In a world that never stops moving, there's a quiet revolution happening — one that asks us to pause, breathe, and savor.\",\r\n content: `In a world that never stops moving, there's a quiet revolution happening — one that asks us to pause, breathe, and savor the moments that make up our days.\r\n\r\nSlow living isn't about doing everything at a snail's pace. It's about being intentional with your time, choosing quality over quantity, and finding joy in the everyday. Whether it's brewing a cup of tea with care, taking a longer route through the park, or simply sitting with your thoughts — these small acts of presence add up.\r\n\r\n## Why Slow Down?\r\n\r\nResearch consistently shows that chronic busyness leads to burnout, anxiety, and a diminished sense of well-being. When we rush through life, we miss the textures, flavors, and connections that give it meaning.\r\n\r\n## Practical Steps\r\n\r\n1. **Start your morning without screens.** Give yourself 30 minutes before checking notifications.\r\n2. **Cook one meal from scratch each week.** The process itself becomes meditative.\r\n3. **Single-task.** Give your full attention to one thing at a time.\r\n4. **Spend time in nature.** Even 15 minutes outdoors can reset your nervous system.\r\n\r\nThe beauty of slow living is that it doesn't require a complete lifestyle overhaul. It begins with a single choice to be present.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=800&h=500&fit=crop\",\r\n date: \"2026-02-01\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Mindfulness\"],\r\n },\r\n {\r\n id: 2,\r\n title: \"Designing with Intention\",\r\n excerpt:\r\n \"Good design isn't decoration — it's communication. Every color, typeface, and pixel should earn its place.\",\r\n content: `Good design isn't decoration — it's communication. Every color, typeface, and pixel should earn its place on the page.\r\n\r\n When we design with intention, we start by asking questions: Who is this for? What should they feel? What action should they take? The answers shape every decision, from the warmth of a color palette to the weight of a heading.\r\n\r\n ## The Role of Constraints\r\n\r\n Constraints are a designer's best friend. A limited palette forces creativity. A strict grid creates rhythm. When everything is possible, nothing stands out.\r\n\r\n ## Color as Emotion\r\n\r\n Colors carry meaning. Warm terracottas evoke trust and earthiness. Golds suggest warmth and optimism. The combination tells a story before a single word is read.\r\n\r\n ## Typography as Voice\r\n\r\n Your typeface choices are the voice of your brand. A serif display font like Playfair Display brings elegance and editorial authority. Paired with a clean sans-serif for body text, it creates a hierarchy that guides the reader effortlessly.\r\n\r\n Design with intention means every element serves the whole.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1558618666-fcd25c85f82e?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1558618666-fcd25c85f82e?w=800&h=500&fit=crop\",\r\n date: \"2026-01-28\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Design\"],\r\n },\r\n {\r\n id: 3,\r\n title: \"Morning Rituals Around the World\",\r\n excerpt:\r\n \"From Japanese tea ceremonies to Scandinavian fika, how different cultures start their day reveals what they value most.\",\r\n content: `From Japanese tea ceremonies to Scandinavian fika, how different cultures start their day reveals what they value most.\r\n\r\n## Japan: The Way of Tea\r\n\r\nIn Japan, the morning tea ceremony is a practice of mindfulness. Each movement is deliberate, each moment savored. It's not about the tea — it's about presence.\r\n\r\n## Scandinavia: Fika\r\n\r\nThe Swedish tradition of fika — a coffee break with pastries — is less about caffeine and more about connection. It's a built-in pause in the day to share conversation with friends or colleagues.\r\n\r\n## India: Yoga and Chai\r\n\r\nIn many Indian households, the morning begins with yoga or meditation, followed by a cup of spiced chai. The combination of movement and warmth prepares both body and mind for the day ahead.\r\n\r\n## Italy: The Standing Espresso\r\n\r\nIt Indians take their morning espresso standing at the bar — a quick, intense ritual that's social and efficient. It's a moment of shared energy before the day begins.\r\n\r\nThese rituals remind us that how we begin our day shapes everything that follows.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?w=800&h=500&fit=crop\",\r\n date: \"2026-01-20\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Culture\"],\r\n },\r\n {\r\n id: 4,\r\n title: \"The Beauty of Imperfection\",\r\n excerpt:\r\n \"Wabi-sabi teaches us to find beauty in the worn, the weathered, and the wonderfully imperfect.\",\r\n content: `Wabi-sabi teaches us to find beauty in the worn, the weathered, and the wonderfully imperfect.\r\n\r\nIn a culture obsessed with perfection — flawless skin, pixel-perfect designs, curated feeds — wabi-sabi offers a radical alternative. This Japanese aesthetic philosophy finds beauty in impermanence, incompleteness, and imperfection.\r\n\r\n## What is Wabi-Sabi?\r\n\r\nWabi refers to a rustic simplicity, a quiet contentment. Sabi refers to the beauty that comes with age and wear. Together, they describe an aesthetic that values the authentic over the polished.\r\n\r\n## Applying Wabi-Sabi\r\n\r\n- **In your home:** Choose handmade ceramics over mass-produced perfection.\r\n- **In your work:** Ship the good-enough version rather than waiting for perfect.\r\n- **In yourself:** Embrace your quirks — they're what make you interesting.\r\n\r\nThe cracked pot, the faded photograph, the well-worn book — these carry stories that perfection never could.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1493106819501-66d381c466f3?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1493106819501-66d381c466f3?w=800&h=500&fit=crop\",\r\n date: \"2026-01-15\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Philosophy\"],\r\n },\r\n {\r\n id: 5,\r\n title: \"Building a Reading Habit\",\r\n excerpt:\r\n \"Reading more doesn't require willpower — it requires environment design and a bit of curiosity.\",\r\n content: `Reading more doesn't require willpower — it requires environment design and a bit of curiosity.\r\n\r\nMost people who say they want to read more are really saying they want to scroll less. The solution isn't discipline — it's making reading the easier choice.\r\n\r\n## Environment Design\r\n\r\n1. **Keep a book visible.** On your nightstand, your desk, your bag.\r\n2. **Remove friction.** If you read on a Kindle, keep it charged and accessible.\r\n3. **Create a reading nook.** A comfortable chair with good light signals \"this is where I read.\"\r\n\r\n## The Two-Page Rule\r\n\r\nDon't commit to a chapter. Commit to two pages. Most nights, you'll keep going. On the nights you don't, you've still read two pages more than zero.\r\n\r\n## Follow Your Curiosity\r\n\r\nAbandon books that bore you. Life is too short for obligatory reading. Follow what fascinates you, even if it's \"not serious enough.\"\r\n\r\nThe goal isn't to read more books. It's to enjoy reading again.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1512820790803-83ca734da794?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1512820790803-83ca734da794?w=800&h=500&fit=crop\",\r\n date: \"2026-01-10\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Habits\"],\r\n },\r\n {\r\n id: 6,\r\n title: \"Color in Everyday Life\",\r\n excerpt:\r\n \"We rarely notice it, but color shapes our moods, decisions, and memories more than we realize.\",\r\n content: `We rarely notice it, but color shapes our moods, decisions, and memories more than we realize.\r\n\r\nThink about the last time a sunset stopped you in your tracks, or a room felt inexplicably cozy. Chances are, color was doing the heavy lifting.\r\n\r\n## The Psychology of Color\r\n\r\n- **Warm colors** (reds, oranges, yellows) increase energy and appetite. Restaurants use them for a reason.\r\n- **Cool colors** (blues, greens) promote calm and focus. Think hospitals and meditation apps.\r\n- **Neutrals** create breathing room. They let other elements — and people — take center stage.\r\n\r\n## Color in Design\r\n\r\nA well-chosen color palette does more than look good. It creates hierarchy, draws attention, and establishes mood — all before a user reads a single word.\r\n\r\n## Your Daily Palette\r\n\r\nNotice the colors around you today. The golden light of morning. The deep green of a houseplant. The warm brown of your coffee. These aren't accidents — they're the palette of your life.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1525909002-1b05e0c869d8?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1525909002-1b05e0c869d8?w=800&h=500&fit=crop\",\r\n date: \"2026-01-05\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Design\"],\r\n },\r\n {\r\n id: 7,\r\n title: \"The Power of Walking\",\r\n excerpt:\r\n \"A daily walk is the most underrated tool for creativity, clarity, and calm.\",\r\n content: `Walking is humanity's oldest form of movement — and still one of its most powerful. Great thinkers from Aristotle to Steve Jobs were known for their walking meetings and strolls.\r\n\r\n## Why Walking Works\r\n\r\nWalking increases blood flow to the brain, boosts creative thinking by up to 60%, and reduces cortisol levels. It's exercise, meditation, and brainstorming rolled into one.\r\n\r\n## Making It a Practice\r\n\r\nYou don't need a trail or a destination. A 20-minute loop around your neighborhood is enough. Leave your phone behind — or at least keep it in your pocket.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1476480862126-209bfaa8edc8?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1476480862126-209bfaa8edc8?w=800&h=500&fit=crop\",\r\n date: \"2026-01-02\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Health\"],\r\n },\r\n {\r\n id: 8,\r\n title: \"Minimalism Beyond Aesthetics\",\r\n excerpt:\r\n \"True minimalism isn't about owning less — it's about making room for what matters.\",\r\n content: `Minimalism has been reduced to white walls and empty shelves. But the philosophy runs much deeper than aesthetics.\r\n\r\n## The Core Idea\r\n\r\nMinimalism asks one question: does this add value to my life? Apply it to your schedule, your relationships, your commitments — not just your closet.\r\n\r\n## Digital Minimalism\r\n\r\nOur phones hold more clutter than our homes. Audit your apps, notifications, and subscriptions. Keep only what serves you.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1494438639946-1ebd1d20bf85?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1494438639946-1ebd1d20bf85?w=800&h=500&fit=crop\",\r\n date: \"2025-12-28\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Lifestyle\"],\r\n },\r\n {\r\n id: 9,\r\n title: \"The Lost Art of Letter Writing\",\r\n excerpt:\r\n \"In an age of instant messaging, a handwritten letter carries a weight that no text can match.\",\r\n content: `There's something irreplaceable about receiving a handwritten letter. The texture of the paper, the imperfections of the handwriting, the knowledge that someone sat down and gave you their time.\r\n\r\n## Why Write Letters\r\n\r\nLetters slow us down. They force us to organize our thoughts, choose our words carefully, and express ourselves with intention.\r\n\r\n## Getting Started\r\n\r\nBuy a simple set of stationery. Write to someone you care about. It doesn't need to be long — even a few heartfelt lines will mean the world.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1517971071642-34a2d3ecc9cd?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1517971071642-34a2d3ecc9cd?w=800&h=500&fit=crop\",\r\n date: \"2025-12-20\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Connection\"],\r\n },\r\n {\r\n id: 10,\r\n title: \"Cooking as Meditation\",\r\n excerpt:\r\n \"The kitchen can be your sanctuary — if you let the process matter more than the result.\",\r\n content: `We often think of cooking as a chore — something to get through before we can eat. But approached differently, it becomes a meditative practice.\r\n\r\n## The Mindful Kitchen\r\n\r\nFocus on the sounds: the sizzle of oil, the chop of a knife, the bubble of a simmer. Engage your senses fully and the kitchen becomes a place of calm.\r\n\r\n## Simple Rituals\r\n\r\nStart with a recipe you love. Prep all your ingredients before you begin. Put on music. Pour yourself a drink. Let the process be the point.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&h=500&fit=crop\",\r\n date: \"2025-12-15\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Mindfulness\"],\r\n },\r\n {\r\n id: 11,\r\n title: \"The Digital Detox Weekend\",\r\n excerpt:\r\n \"48 hours without screens sounds terrifying — until you try it and realize how much you've been missing.\",\r\n content: `A digital detox weekend isn't about hating technology. It's about remembering what life feels like without constant input.\r\n\r\n## The Rules\r\n\r\nNo phone, no laptop, no tablet for 48 hours. Use a paper map, a physical book, an alarm clock. Tell people in advance so they don't worry.\r\n\r\n## What You'll Discover\r\n\r\nBoredom arrives first — then creativity. You'll notice birdsong, have longer conversations, and sleep better than you have in months.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1528297506728-9533d2ac3fa4?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1528297506728-9533d2ac3fa4?w=800&h=500&fit=crop\",\r\n date: \"2025-12-10\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Well-being\"],\r\n },\r\n];\r\n\r\nexport const mockComments: Comment[] = [\r\n {\r\n id: \"1\",\r\n author: \"Reader One\",\r\n text: \"This really resonated with me. Thank you for sharing.\",\r\n date: \"2026-02-02\",\r\n },\r\n {\r\n id: \"2\",\r\n author: \"Curious Mind\",\r\n text: \"I've been trying to slow down lately — this gave me some great ideas.\",\r\n date: \"2026-02-03\",\r\n },\r\n {\r\n id: \"3\",\r\n author: \"Design Fan\",\r\n text: \"Beautiful writing and perspective. More of this please!\",\r\n date: \"2026-02-05\",\r\n },\r\n];\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/data/posts.ts"],"sourcesContent":["export interface BlogPost {\r\n id: number;\r\n slug: string;\r\n title: string;\r\n excerpt: string;\r\n content: string;\r\n primaryImage: string;\r\n originalImage: string;\r\n date: string;\r\n author: string;\r\n featured?: boolean;\r\n categories: string[];\r\n gallery?: { src: string; alt?: string }[];\r\n}\r\n\r\nexport interface Comment {\r\n id: string;\r\n author: string;\r\n text: string;\r\n date: string;\r\n}\r\n\r\nexport const posts: BlogPost[] = [\r\n {\r\n id: 1,\r\n slug: \"the-art-of-slow-living\",\r\n title: \"The Art of Slow Living\",\r\n excerpt:\r\n \"In a world that never stops moving, there's a quiet revolution happening — one that asks us to pause, breathe, and savor.\",\r\n content: `In a world that never stops moving, there's a quiet revolution happening — one that asks us to pause, breathe, and savor the moments that make up our days.\r\n\r\nSlow living isn't about doing everything at a snail's pace. It's about being intentional with your time, choosing quality over quantity, and finding joy in the everyday. Whether it's brewing a cup of tea with care, taking a longer route through the park, or simply sitting with your thoughts — these small acts of presence add up.\r\n\r\n## Why Slow Down?\r\n\r\nResearch consistently shows that chronic busyness leads to burnout, anxiety, and a diminished sense of well-being. When we rush through life, we miss the textures, flavors, and connections that give it meaning.\r\n\r\n## Practical Steps\r\n\r\n1. **Start your morning without screens.** Give yourself 30 minutes before checking notifications.\r\n2. **Cook one meal from scratch each week.** The process itself becomes meditative.\r\n3. **Single-task.** Give your full attention to one thing at a time.\r\n4. **Spend time in nature.** Even 15 minutes outdoors can reset your nervous system.\r\n\r\nThe beauty of slow living is that it doesn't require a complete lifestyle overhaul. It begins with a single choice to be present.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=800&h=500&fit=crop\",\r\n date: \"2026-02-01\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Mindfulness\"],\r\n featured: true,\r\n gallery: [\r\n { src: \"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800&h=600&fit=crop\", alt: \"Mountain lake at dawn\" },\r\n { src: \"https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=800&h=600&fit=crop\", alt: \"Foggy forest path\" },\r\n { src: \"https://images.unsplash.com/photo-1441974231531-c6227db76b6e?w=800&h=600&fit=crop\", alt: \"Sunlit woodland\" },\r\n { src: \"https://images.unsplash.com/photo-1465146344425-f00d5f5c8f07?w=800&h=600&fit=crop\", alt: \"Wildflowers in a field\" },\r\n { src: \"https://images.unsplash.com/photo-1501854140801-50d01698950b?w=800&h=600&fit=crop\", alt: \"Aerial view of green hills\" },\r\n { src: \"https://images.unsplash.com/photo-1472214103451-9374bd1c798e?w=800&h=600&fit=crop\", alt: \"Valley at sunset\" },\r\n ],\r\n },\r\n {\r\n id: 2,\r\n slug: \"designing-with-intention\",\r\n title: \"Designing with Intention\",\r\n excerpt:\r\n \"Good design isn't decoration — it's communication. Every color, typeface, and pixel should earn its place.\",\r\n content: `Good design isn't decoration — it's communication. Every color, typeface, and pixel should earn its place on the page.\r\n\r\n When we design with intention, we start by asking questions: Who is this for? What should they feel? What action should they take? The answers shape every decision, from the warmth of a color palette to the weight of a heading.\r\n\r\n ## The Role of Constraints\r\n\r\n Constraints are a designer's best friend. A limited palette forces creativity. A strict grid creates rhythm. When everything is possible, nothing stands out.\r\n\r\n ## Color as Emotion\r\n\r\n Colors carry meaning. Warm terracottas evoke trust and earthiness. Golds suggest warmth and optimism. The combination tells a story before a single word is read.\r\n\r\n ## Typography as Voice\r\n\r\n Your typeface choices are the voice of your brand. A serif display font like Playfair Display brings elegance and editorial authority. Paired with a clean sans-serif for body text, it creates a hierarchy that guides the reader effortlessly.\r\n\r\n Design with intention means every element serves the whole.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1558618666-fcd25c85f82e?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1558618666-fcd25c85f82e?w=800&h=500&fit=crop\",\r\n date: \"2026-01-28\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Design\"],\r\n featured: true,\r\n },\r\n {\r\n id: 3,\r\n slug: \"morning-rituals-around-the-world\",\r\n title: \"Morning Rituals Around the World\",\r\n excerpt:\r\n \"From Japanese tea ceremonies to Scandinavian fika, how different cultures start their day reveals what they value most.\",\r\n content: `From Japanese tea ceremonies to Scandinavian fika, how different cultures start their day reveals what they value most.\r\n\r\n## Japan: The Way of Tea\r\n\r\nIn Japan, the morning tea ceremony is a practice of mindfulness. Each movement is deliberate, each moment savored. It's not about the tea — it's about presence.\r\n\r\n## Scandinavia: Fika\r\n\r\nThe Swedish tradition of fika — a coffee break with pastries — is less about caffeine and more about connection. It's a built-in pause in the day to share conversation with friends or colleagues.\r\n\r\n## India: Yoga and Chai\r\n\r\nIn many Indian households, the morning begins with yoga or meditation, followed by a cup of spiced chai. The combination of movement and warmth prepares both body and mind for the day ahead.\r\n\r\n## Italy: The Standing Espresso\r\n\r\nIt Indians take their morning espresso standing at the bar — a quick, intense ritual that's social and efficient. It's a moment of shared energy before the day begins.\r\n\r\nThese rituals remind us that how we begin our day shapes everything that follows.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1495474472287-4d71bcdd2085?w=800&h=500&fit=crop\",\r\n date: \"2026-01-20\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Culture\"],\r\n featured: true,\r\n gallery: [\r\n { src: \"https://images.unsplash.com/photo-1545569341-9eb8b30979d9?w=800&h=600&fit=crop\", alt: \"Japanese temple garden\" },\r\n { src: \"https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e?w=800&h=600&fit=crop\", alt: \"Traditional tea ceremony\" },\r\n { src: \"https://images.unsplash.com/photo-1504754524776-8f4f37790ca0?w=800&h=600&fit=crop\", alt: \"Breakfast spread\" },\r\n { src: \"https://images.unsplash.com/photo-1514933651103-005eec06c04b?w=800&h=600&fit=crop\", alt: \"Italian espresso bar\" },\r\n ],\r\n },\r\n {\r\n id: 4,\r\n slug: \"the-beauty-of-imperfection\",\r\n title: \"The Beauty of Imperfection\",\r\n excerpt:\r\n \"Wabi-sabi teaches us to find beauty in the worn, the weathered, and the wonderfully imperfect.\",\r\n content: `Wabi-sabi teaches us to find beauty in the worn, the weathered, and the wonderfully imperfect.\r\n\r\nIn a culture obsessed with perfection — flawless skin, pixel-perfect designs, curated feeds — wabi-sabi offers a radical alternative. This Japanese aesthetic philosophy finds beauty in impermanence, incompleteness, and imperfection.\r\n\r\n## What is Wabi-Sabi?\r\n\r\nWabi refers to a rustic simplicity, a quiet contentment. Sabi refers to the beauty that comes with age and wear. Together, they describe an aesthetic that values the authentic over the polished.\r\n\r\n## Applying Wabi-Sabi\r\n\r\n- **In your home:** Choose handmade ceramics over mass-produced perfection.\r\n- **In your work:** Ship the good-enough version rather than waiting for perfect.\r\n- **In yourself:** Embrace your quirks — they're what make you interesting.\r\n\r\nThe cracked pot, the faded photograph, the well-worn book — these carry stories that perfection never could.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1493106819501-66d381c466f3?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1493106819501-66d381c466f3?w=800&h=500&fit=crop\",\r\n date: \"2026-01-15\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Philosophy\"],\r\n gallery: [\r\n { src: \"https://images.unsplash.com/photo-1528297506728-9533d2ac3fa4?w=800&h=600&fit=crop\", alt: \"Handmade ceramic bowl\" },\r\n { src: \"https://images.unsplash.com/photo-1565193566173-7a0ee3dbe261?w=800&h=600&fit=crop\", alt: \"Cracked pottery with gold\" },\r\n { src: \"https://images.unsplash.com/photo-1493106641515-6b5631de4bb9?w=800&h=600&fit=crop\", alt: \"Worn wooden texture\" },\r\n ],\r\n },\r\n {\r\n id: 5,\r\n slug: \"building-a-reading-habit\",\r\n title: \"Building a Reading Habit\",\r\n excerpt:\r\n \"Reading more doesn't require willpower — it requires environment design and a bit of curiosity.\",\r\n content: `Reading more doesn't require willpower — it requires environment design and a bit of curiosity.\r\n\r\nMost people who say they want to read more are really saying they want to scroll less. The solution isn't discipline — it's making reading the easier choice.\r\n\r\n## Environment Design\r\n\r\n1. **Keep a book visible.** On your nightstand, your desk, your bag.\r\n2. **Remove friction.** If you read on a Kindle, keep it charged and accessible.\r\n3. **Create a reading nook.** A comfortable chair with good light signals \"this is where I read.\"\r\n\r\n## The Two-Page Rule\r\n\r\nDon't commit to a chapter. Commit to two pages. Most nights, you'll keep going. On the nights you don't, you've still read two pages more than zero.\r\n\r\n## Follow Your Curiosity\r\n\r\nAbandon books that bore you. Life is too short for obligatory reading. Follow what fascinates you, even if it's \"not serious enough.\"\r\n\r\nThe goal isn't to read more books. It's to enjoy reading again.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1512820790803-83ca734da794?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1512820790803-83ca734da794?w=800&h=500&fit=crop\",\r\n date: \"2026-01-10\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Habits\"],\r\n },\r\n {\r\n id: 6,\r\n slug: \"color-in-everyday-life\",\r\n title: \"Color in Everyday Life\",\r\n excerpt:\r\n \"We rarely notice it, but color shapes our moods, decisions, and memories more than we realize.\",\r\n content: `We rarely notice it, but color shapes our moods, decisions, and memories more than we realize.\r\n\r\nThink about the last time a sunset stopped you in your tracks, or a room felt inexplicably cozy. Chances are, color was doing the heavy lifting.\r\n\r\n## The Psychology of Color\r\n\r\n- **Warm colors** (reds, oranges, yellows) increase energy and appetite. Restaurants use them for a reason.\r\n- **Cool colors** (blues, greens) promote calm and focus. Think hospitals and meditation apps.\r\n- **Neutrals** create breathing room. They let other elements — and people — take center stage.\r\n\r\n## Color in Design\r\n\r\nA well-chosen color palette does more than look good. It creates hierarchy, draws attention, and establishes mood — all before a user reads a single word.\r\n\r\n## Your Daily Palette\r\n\r\nNotice the colors around you today. The golden light of morning. The deep green of a houseplant. The warm brown of your coffee. These aren't accidents — they're the palette of your life.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1525909002-1b05e0c869d8?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1525909002-1b05e0c869d8?w=800&h=500&fit=crop\",\r\n date: \"2026-01-05\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Design\"],\r\n },\r\n {\r\n id: 7,\r\n slug: \"the-power-of-walking\",\r\n title: \"The Power of Walking\",\r\n excerpt:\r\n \"A daily walk is the most underrated tool for creativity, clarity, and calm.\",\r\n content: `Walking is humanity's oldest form of movement — and still one of its most powerful. Great thinkers from Aristotle to Steve Jobs were known for their walking meetings and strolls.\r\n\r\n## Why Walking Works\r\n\r\nWalking increases blood flow to the brain, boosts creative thinking by up to 60%, and reduces cortisol levels. It's exercise, meditation, and brainstorming rolled into one.\r\n\r\n## Making It a Practice\r\n\r\nYou don't need a trail or a destination. A 20-minute loop around your neighborhood is enough. Leave your phone behind — or at least keep it in your pocket.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1476480862126-209bfaa8edc8?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1476480862126-209bfaa8edc8?w=800&h=500&fit=crop\",\r\n date: \"2026-01-02\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Health\"],\r\n },\r\n {\r\n id: 8,\r\n slug: \"minimalism-beyond-aesthetics\",\r\n title: \"Minimalism Beyond Aesthetics\",\r\n excerpt:\r\n \"True minimalism isn't about owning less — it's about making room for what matters.\",\r\n content: `Minimalism has been reduced to white walls and empty shelves. But the philosophy runs much deeper than aesthetics.\r\n\r\n## The Core Idea\r\n\r\nMinimalism asks one question: does this add value to my life? Apply it to your schedule, your relationships, your commitments — not just your closet.\r\n\r\n## Digital Minimalism\r\n\r\nOur phones hold more clutter than our homes. Audit your apps, notifications, and subscriptions. Keep only what serves you.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1494438639946-1ebd1d20bf85?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1494438639946-1ebd1d20bf85?w=800&h=500&fit=crop\",\r\n date: \"2025-12-28\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Lifestyle\"],\r\n },\r\n {\r\n id: 9,\r\n slug: \"the-lost-art-of-letter-writing\",\r\n title: \"The Lost Art of Letter Writing\",\r\n excerpt:\r\n \"In an age of instant messaging, a handwritten letter carries a weight that no text can match.\",\r\n content: `There's something irreplaceable about receiving a handwritten letter. The texture of the paper, the imperfections of the handwriting, the knowledge that someone sat down and gave you their time.\r\n\r\n## Why Write Letters\r\n\r\nLetters slow us down. They force us to organize our thoughts, choose our words carefully, and express ourselves with intention.\r\n\r\n## Getting Started\r\n\r\nBuy a simple set of stationery. Write to someone you care about. It doesn't need to be long — even a few heartfelt lines will mean the world.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1517971071642-34a2d3ecc9cd?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1517971071642-34a2d3ecc9cd?w=800&h=500&fit=crop\",\r\n date: \"2025-12-20\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Connection\"],\r\n },\r\n {\r\n id: 10,\r\n slug: \"cooking-as-meditation\",\r\n title: \"Cooking as Meditation\",\r\n excerpt:\r\n \"The kitchen can be your sanctuary — if you let the process matter more than the result.\",\r\n content: `We often think of cooking as a chore — something to get through before we can eat. But approached differently, it becomes a meditative practice.\r\n\r\n## The Mindful Kitchen\r\n\r\nFocus on the sounds: the sizzle of oil, the chop of a knife, the bubble of a simmer. Engage your senses fully and the kitchen becomes a place of calm.\r\n\r\n## Simple Rituals\r\n\r\nStart with a recipe you love. Prep all your ingredients before you begin. Put on music. Pour yourself a drink. Let the process be the point.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1556909114-f6e7ad7d3136?w=800&h=500&fit=crop\",\r\n date: \"2025-12-15\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Mindfulness\"],\r\n },\r\n {\r\n id: 11,\r\n slug: \"digital-detox-weekend\",\r\n title: \"The Digital Detox Weekend\",\r\n excerpt:\r\n \"48 hours without screens sounds terrifying — until you try it and realize how much you've been missing.\",\r\n content: `A digital detox weekend isn't about hating technology. It's about remembering what life feels like without constant input.\r\n\r\n## The Rules\r\n\r\nNo phone, no laptop, no tablet for 48 hours. Use a paper map, a physical book, an alarm clock. Tell people in advance so they don't worry.\r\n\r\n## What You'll Discover\r\n\r\nBoredom arrives first — then creativity. You'll notice birdsong, have longer conversations, and sleep better than you have in months.`,\r\n primaryImage:\r\n \"https://images.unsplash.com/photo-1528297506728-9533d2ac3fa4?w=800&h=500&fit=crop\",\r\n originalImage:\r\n \"https://images.unsplash.com/photo-1528297506728-9533d2ac3fa4?w=800&h=500&fit=crop\",\r\n date: \"2025-12-10\",\r\n author: \"Elena Marsh\",\r\n categories: [\"Well-being\"],\r\n },\r\n];\r\n\r\nexport const mockComments: Comment[] = [\r\n {\r\n id: \"1\",\r\n author: \"Reader One\",\r\n text: \"This really resonated with me. Thank you for sharing.\",\r\n date: \"2026-02-02\",\r\n },\r\n {\r\n id: \"2\",\r\n author: \"Curious Mind\",\r\n text: \"I've been trying to slow down lately — this gave me some great ideas.\",\r\n date: \"2026-02-03\",\r\n },\r\n {\r\n id: \"3\",\r\n author: \"Design Fan\",\r\n text: \"Beautiful writing and perspective. More of this please!\",\r\n date: \"2026-02-05\",\r\n },\r\n];\r\n"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,12 +1,34 @@
1
1
  export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './components/blocks/cards/card.js';
2
+ export { AuthorCard } from './components/blocks/directory/author-card.js';
3
+ export { CategoryCard } from './components/blocks/directory/category-card.js';
4
+ export { ExtrasHubCard, ExtrasHubItem } from './components/blocks/extras/extras-hub-card.js';
5
+ export { GalleryImage } from './components/blocks/gallery/image-gallery.js';
6
+ export { CommentSkeleton, PostCardSkeleton, PostListRowSkeleton, PostListSkeleton, SinglePostSkeleton } from './components/blocks/loading/loading-skeletons.js';
7
+ export { Login, LoginCredentials, LoginProps } from './components/blocks/login/login.js';
8
+ export { PageHero } from './components/blocks/marketing/page-hero.js';
9
+ export { StatItem, StatsGrid } from './components/blocks/marketing/stats-grid.js';
10
+ export { Timeline, TimelineItem } from './components/blocks/marketing/timeline.js';
11
+ export { ValueItem, ValuesGrid } from './components/blocks/marketing/values-grid.js';
2
12
  export { PostListWithFilters } from './components/blocks/post-list/post-list-with-filters.js';
13
+ export { AboutPage } from './components/pages/about/about-page.js';
3
14
  export { AdminPage, AdminPageProps } from './components/pages/admin/admin-page.js';
15
+ export { AuthorPage } from './components/pages/author/author-page.js';
16
+ export { AuthorsPage } from './components/pages/authors/authors-page.js';
4
17
  export { BlogPost } from './components/pages/blogpost/blogpost.js';
18
+ export { CategoriesPage } from './components/pages/categories/categories-page.js';
5
19
  export { CategoryPage } from './components/pages/category/category-page.js';
20
+ export { ChatPage } from './components/pages/chat/chat-page.js';
21
+ export { ContactPage } from './components/pages/contact/contact-page.js';
22
+ export { ContentBlocksPage } from './components/pages/content-blocks/content-blocks-page.js';
23
+ export { ExtrasHubPage } from './components/pages/extras/extras-hub-page.js';
6
24
  export { LoginPage } from './components/pages/login/login-page.js';
7
25
  export { MaintenancePage } from './components/pages/maintenance/maintenance-page.js';
26
+ export { MembershipPage } from './components/pages/membership/membership-page.js';
27
+ export { MosaicPage } from './components/pages/mosaic/mosaic-page.js';
28
+ export { NewsletterPage } from './components/pages/newsletter/newsletter-page.js';
8
29
  export { NotFound } from './components/pages/not-found/not-found.js';
9
30
  export { PrivacyPage } from './components/pages/privacy/privacy-page.js';
31
+ export { ResourcesPage } from './components/pages/resources/resources-page.js';
10
32
  export { SearchPage } from './components/pages/search/search-page.js';
11
33
  export { StartPage } from './components/pages/startpage/startpage.js';
12
34
  export { TermsPage } from './components/pages/terms/terms-page.js';
@@ -20,6 +42,9 @@ export { LinkButton } from './components/primitives/buttons/link-button.js';
20
42
  export { Collapsible, CollapsibleContent, CollapsibleTrigger } from './components/primitives/collapsible/collapsible.js';
21
43
  export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from './components/primitives/dropdown-menu/dropdown-menu.js';
22
44
  export { Checkbox } from './components/primitives/forms/checkbox.js';
45
+ export { Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle } from './components/primitives/forms/field.js';
46
+ export { Form, FormActions } from './components/primitives/forms/form.js';
47
+ export { FormControl } from './components/primitives/forms/form-control.js';
23
48
  export { Input } from './components/primitives/forms/input.js';
24
49
  export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } from './components/primitives/forms/select.js';
25
50
  export { Textarea } from './components/primitives/forms/textarea.js';
@@ -32,7 +57,7 @@ export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHe
32
57
  export { Skeleton } from './components/primitives/skeleton/skeleton.js';
33
58
  export { Toaster } from './components/primitives/sonner/sonner.js';
34
59
  export { Spinner } from './components/primitives/spinner/spinner.js';
35
- export { Stack, StackProps, stackVariants } from './components/primitives/stack/stack.js';
60
+ export { Stack, StackProps, stackVariantOptions, stackVariants } from './components/primitives/stack/stack.js';
36
61
  export { Heading, HeadingProps, headingVariants, headingVariantsProps } from './components/primitives/text/heading.js';
37
62
  export { TextCode, TextCodeProps, textCodeVariants, textCodeVariantsProps } from './components/primitives/text/text-code.js';
38
63
  export { TextDiv } from './components/primitives/text/text-div.js';
@@ -48,20 +73,22 @@ export { AuthProvider, useAuth } from './components/providers/auth-provider.js';
48
73
  export { Theme, ThemeProvider, ThemeProviderProps, ThemeProviderState, useTheme } from './components/providers/theme-provider.js';
49
74
  export { Container } from './components/templates/container/container.js';
50
75
  export { Footer } from './components/templates/footer/footer.js';
76
+ export { LoadingScreen } from './components/templates/loading-screen/loading-screen.js';
51
77
  export { Header, HeaderProps, NavLink } from './components/templates/navigation/header.js';
52
78
  export { toast } from 'sonner';
53
- import 'react/jsx-runtime';
54
79
  import 'react';
80
+ import './data/authors.js';
81
+ import 'lucide-react';
55
82
  import './data/posts.js';
56
83
  import '@base-ui/react/accordion';
57
84
  import 'class-variance-authority/types';
58
85
  import 'class-variance-authority';
59
86
  import '@base-ui/react/use-render';
60
87
  import '@base-ui/react/button';
61
- import 'lucide-react';
62
88
  import '@radix-ui/react-collapsible';
63
89
  import '@radix-ui/react-dropdown-menu';
64
90
  import '@base-ui/react';
91
+ import './lib/forms/field-props.js';
65
92
  import '@base-ui/react/separator';
66
93
  import '@radix-ui/react-dialog';
67
94
  import './components/primitives/text/internal/text-element.js';
@@ -0,0 +1,60 @@
1
+ type FieldErrorLike = {
2
+ message?: string;
3
+ } | string | undefined;
4
+ type TanStackFieldLike = {
5
+ name: string | number | symbol;
6
+ state: {
7
+ value: unknown;
8
+ meta: {
9
+ errors: unknown[];
10
+ isTouched: boolean;
11
+ };
12
+ };
13
+ handleBlur: () => void;
14
+ handleChange: (value: unknown) => void;
15
+ };
16
+ /**
17
+ * Normalizes validation errors from TanStack Form, Zod, or manual sources
18
+ * into the shape expected by {@link FieldError}.
19
+ */
20
+ declare function normalizeFieldErrors(errors: FieldErrorLike[] | undefined): Array<{
21
+ message?: string;
22
+ }>;
23
+ /**
24
+ * Returns whether a field should be shown in an invalid state.
25
+ */
26
+ declare function isFieldInvalid(field: TanStackFieldLike): boolean;
27
+ /**
28
+ * Maps a TanStack Form field to props for {@link Input} or {@link Textarea}.
29
+ */
30
+ declare function getInputFieldProps(field: TanStackFieldLike, controlId?: string): {
31
+ readonly id: string;
32
+ readonly name: string;
33
+ readonly value: string | number | readonly string[];
34
+ readonly onBlur: () => void;
35
+ readonly onChange: (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
36
+ readonly "aria-invalid": true | undefined;
37
+ };
38
+ /**
39
+ * Maps a TanStack Form field to props for {@link Checkbox}.
40
+ */
41
+ declare function getCheckboxFieldProps(field: TanStackFieldLike, controlId?: string): {
42
+ readonly id: string;
43
+ readonly name: string;
44
+ readonly checked: boolean;
45
+ readonly onCheckedChange: (checked: boolean) => void;
46
+ readonly onBlur: () => void;
47
+ readonly "aria-invalid": true | undefined;
48
+ };
49
+ /**
50
+ * Maps a TanStack Form field to props for {@link Select}.
51
+ */
52
+ declare function getSelectFieldProps(field: TanStackFieldLike, controlId?: string): {
53
+ readonly id: string;
54
+ readonly name: string;
55
+ readonly value: unknown;
56
+ readonly onValueChange: (value: unknown) => void;
57
+ readonly "aria-invalid": true | undefined;
58
+ };
59
+
60
+ export { type FieldErrorLike, type TanStackFieldLike, getCheckboxFieldProps, getInputFieldProps, getSelectFieldProps, isFieldInvalid, normalizeFieldErrors };
@@ -0,0 +1,60 @@
1
+ function normalizeFieldErrors(errors) {
2
+ if (!errors?.length) {
3
+ return [];
4
+ }
5
+ return errors.map(
6
+ (error) => typeof error === "string" ? { message: error } : error ?? void 0
7
+ ).filter((error) => Boolean(error?.message));
8
+ }
9
+ function isFieldInvalid(field) {
10
+ return field.state.meta.isTouched && field.state.meta.errors.length > 0;
11
+ }
12
+ function getInputFieldProps(field, controlId) {
13
+ const id = controlId ?? String(field.name);
14
+ const invalid = isFieldInvalid(field);
15
+ return {
16
+ id,
17
+ name: String(field.name),
18
+ value: field.state.value ?? "",
19
+ onBlur: field.handleBlur,
20
+ onChange: (event) => {
21
+ field.handleChange(event.target.value);
22
+ },
23
+ "aria-invalid": invalid ? true : void 0
24
+ };
25
+ }
26
+ function getCheckboxFieldProps(field, controlId) {
27
+ const id = controlId ?? String(field.name);
28
+ const invalid = isFieldInvalid(field);
29
+ return {
30
+ id,
31
+ name: String(field.name),
32
+ checked: Boolean(field.state.value),
33
+ onCheckedChange: (checked) => {
34
+ field.handleChange(checked);
35
+ },
36
+ onBlur: field.handleBlur,
37
+ "aria-invalid": invalid ? true : void 0
38
+ };
39
+ }
40
+ function getSelectFieldProps(field, controlId) {
41
+ const id = controlId ?? String(field.name);
42
+ const invalid = isFieldInvalid(field);
43
+ return {
44
+ id,
45
+ name: String(field.name),
46
+ value: field.state.value,
47
+ onValueChange: (value) => {
48
+ field.handleChange(value);
49
+ },
50
+ "aria-invalid": invalid ? true : void 0
51
+ };
52
+ }
53
+ export {
54
+ getCheckboxFieldProps,
55
+ getInputFieldProps,
56
+ getSelectFieldProps,
57
+ isFieldInvalid,
58
+ normalizeFieldErrors
59
+ };
60
+ //# sourceMappingURL=field-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/forms/field-props.ts"],"sourcesContent":["export type FieldErrorLike = { message?: string } | string | undefined;\r\n\r\nexport type TanStackFieldLike = {\r\n name: string | number | symbol;\r\n state: {\r\n value: unknown;\r\n meta: {\r\n errors: unknown[];\r\n isTouched: boolean;\r\n };\r\n };\r\n handleBlur: () => void;\r\n handleChange: (value: unknown) => void;\r\n};\r\n\r\n/**\r\n * Normalizes validation errors from TanStack Form, Zod, or manual sources\r\n * into the shape expected by {@link FieldError}.\r\n */\r\nexport function normalizeFieldErrors(\r\n errors: FieldErrorLike[] | undefined,\r\n): Array<{ message?: string }> {\r\n if (!errors?.length) {\r\n return [];\r\n }\r\n\r\n return errors\r\n .map((error) =>\r\n typeof error === \"string\" ? { message: error } : (error ?? undefined),\r\n )\r\n .filter((error): error is { message?: string } => Boolean(error?.message));\r\n}\r\n\r\n/**\r\n * Returns whether a field should be shown in an invalid state.\r\n */\r\nexport function isFieldInvalid(field: TanStackFieldLike): boolean {\r\n return field.state.meta.isTouched && field.state.meta.errors.length > 0;\r\n}\r\n\r\n/**\r\n * Maps a TanStack Form field to props for {@link Input} or {@link Textarea}.\r\n */\r\nexport function getInputFieldProps(\r\n field: TanStackFieldLike,\r\n controlId?: string,\r\n) {\r\n const id = controlId ?? String(field.name);\r\n const invalid = isFieldInvalid(field);\r\n\r\n return {\r\n id,\r\n name: String(field.name),\r\n value: (field.state.value as string | number | readonly string[]) ?? \"\",\r\n onBlur: field.handleBlur,\r\n onChange: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n ) => {\r\n field.handleChange(event.target.value);\r\n },\r\n \"aria-invalid\": invalid ? true : undefined,\r\n } as const;\r\n}\r\n\r\n/**\r\n * Maps a TanStack Form field to props for {@link Checkbox}.\r\n */\r\nexport function getCheckboxFieldProps(\r\n field: TanStackFieldLike,\r\n controlId?: string,\r\n) {\r\n const id = controlId ?? String(field.name);\r\n const invalid = isFieldInvalid(field);\r\n\r\n return {\r\n id,\r\n name: String(field.name),\r\n checked: Boolean(field.state.value),\r\n onCheckedChange: (checked: boolean) => {\r\n field.handleChange(checked);\r\n },\r\n onBlur: field.handleBlur,\r\n \"aria-invalid\": invalid ? true : undefined,\r\n } as const;\r\n}\r\n\r\n/**\r\n * Maps a TanStack Form field to props for {@link Select}.\r\n */\r\nexport function getSelectFieldProps(\r\n field: TanStackFieldLike,\r\n controlId?: string,\r\n) {\r\n const id = controlId ?? String(field.name);\r\n const invalid = isFieldInvalid(field);\r\n\r\n return {\r\n id,\r\n name: String(field.name),\r\n value: field.state.value,\r\n onValueChange: (value: unknown) => {\r\n field.handleChange(value);\r\n },\r\n \"aria-invalid\": invalid ? true : undefined,\r\n } as const;\r\n}\r\n"],"mappings":"AAmBO,SAAS,qBACd,QAC6B;AAC7B,MAAI,CAAC,QAAQ,QAAQ;AACnB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OACJ;AAAA,IAAI,CAAC,UACJ,OAAO,UAAU,WAAW,EAAE,SAAS,MAAM,IAAK,SAAS;AAAA,EAC7D,EACC,OAAO,CAAC,UAAyC,QAAQ,OAAO,OAAO,CAAC;AAC7E;AAKO,SAAS,eAAe,OAAmC;AAChE,SAAO,MAAM,MAAM,KAAK,aAAa,MAAM,MAAM,KAAK,OAAO,SAAS;AACxE;AAKO,SAAS,mBACd,OACA,WACA;AACA,QAAM,KAAK,aAAa,OAAO,MAAM,IAAI;AACzC,QAAM,UAAU,eAAe,KAAK;AAEpC,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO,MAAM,IAAI;AAAA,IACvB,OAAQ,MAAM,MAAM,SAAiD;AAAA,IACrE,QAAQ,MAAM;AAAA,IACd,UAAU,CACR,UACG;AACH,YAAM,aAAa,MAAM,OAAO,KAAK;AAAA,IACvC;AAAA,IACA,gBAAgB,UAAU,OAAO;AAAA,EACnC;AACF;AAKO,SAAS,sBACd,OACA,WACA;AACA,QAAM,KAAK,aAAa,OAAO,MAAM,IAAI;AACzC,QAAM,UAAU,eAAe,KAAK;AAEpC,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO,MAAM,IAAI;AAAA,IACvB,SAAS,QAAQ,MAAM,MAAM,KAAK;AAAA,IAClC,iBAAiB,CAAC,YAAqB;AACrC,YAAM,aAAa,OAAO;AAAA,IAC5B;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,gBAAgB,UAAU,OAAO;AAAA,EACnC;AACF;AAKO,SAAS,oBACd,OACA,WACA;AACA,QAAM,KAAK,aAAa,OAAO,MAAM,IAAI;AACzC,QAAM,UAAU,eAAe,KAAK;AAEpC,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO,MAAM,IAAI;AAAA,IACvB,OAAO,MAAM,MAAM;AAAA,IACnB,eAAe,CAAC,UAAmB;AACjC,YAAM,aAAa,KAAK;AAAA,IAC1B;AAAA,IACA,gBAAgB,UAAU,OAAO;AAAA,EACnC;AACF;","names":[]}
@@ -0,0 +1,11 @@
1
+ export { FieldErrorLike, TanStackFieldLike, getCheckboxFieldProps, getInputFieldProps, getSelectFieldProps, isFieldInvalid, normalizeFieldErrors } from './field-props.js';
2
+ export { TanStackCheckboxField, TanStackField, TanStackFormLike, TanStackInputField, TanStackTextareaField } from './tanstack-field.js';
3
+ import 'react';
4
+ import '@tanstack/react-form';
5
+ import '../../components/primitives/forms/form-control.js';
6
+ import '../../components/primitives/forms/field.js';
7
+ import 'class-variance-authority/types';
8
+ import 'class-variance-authority';
9
+ import '../../components/primitives/label/label.js';
10
+ import '../../components/primitives/forms/input.js';
11
+ import '../../components/primitives/forms/textarea.js';
@@ -0,0 +1,3 @@
1
+ export * from "./field-props.js";
2
+ export * from "./tanstack-field.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/forms/index.ts"],"sourcesContent":["export * from \"./field-props\";\r\nexport * from \"./tanstack-field\";\r\n"],"mappings":"AAAA,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,56 @@
1
+ import { TanStackFieldLike } from './field-props.js';
2
+ export { FieldErrorLike, getCheckboxFieldProps, getInputFieldProps, getSelectFieldProps, isFieldInvalid, normalizeFieldErrors } from './field-props.js';
3
+ import * as React$1 from 'react';
4
+ import { DeepKeys } from '@tanstack/react-form';
5
+ import { FormControl } from '../../components/primitives/forms/form-control.js';
6
+ import { Input } from '../../components/primitives/forms/input.js';
7
+ import { Textarea } from '../../components/primitives/forms/textarea.js';
8
+ import '../../components/primitives/forms/field.js';
9
+ import 'class-variance-authority/types';
10
+ import 'class-variance-authority';
11
+ import '../../components/primitives/label/label.js';
12
+
13
+ type TanStackFormLike<TFormData> = {
14
+ Field: (props: {
15
+ name: DeepKeys<TFormData>;
16
+ validators?: Record<string, unknown>;
17
+ children: (field: TanStackFieldLike) => React.ReactNode;
18
+ }) => React.ReactNode;
19
+ };
20
+ type TanStackFieldProps<TFormData, TName extends DeepKeys<TFormData>> = {
21
+ form: TanStackFormLike<TFormData>;
22
+ name: TName;
23
+ label?: React.ReactNode;
24
+ description?: React.ReactNode;
25
+ orientation?: React.ComponentProps<typeof FormControl>["orientation"];
26
+ labelClassName?: string;
27
+ className?: string;
28
+ validators?: Record<string, unknown>;
29
+ children: (field: TanStackFieldLike, controlProps: Record<string, unknown>, controlId: string) => React.ReactNode;
30
+ mapControlProps?: (field: TanStackFieldLike, controlId: string) => Record<string, unknown>;
31
+ };
32
+ /**
33
+ * Connects a TanStack Form field to Singularity {@link FormControl} layout primitives.
34
+ */
35
+ declare function TanStackField<TFormData, TName extends DeepKeys<TFormData>>({ form, name, label, description, orientation, labelClassName, className, validators, children, mapControlProps, }: TanStackFieldProps<TFormData, TName>): React$1.JSX.Element;
36
+ type TanStackInputFieldProps<TFormData, TName extends DeepKeys<TFormData>> = Omit<TanStackFieldProps<TFormData, TName>, "children" | "mapControlProps"> & Omit<React.ComponentProps<typeof Input>, "id" | "name" | "value" | "onChange" | "onBlur">;
37
+ /**
38
+ * TanStack Form field wired to {@link Input}.
39
+ */
40
+ declare function TanStackInputField<TFormData, TName extends DeepKeys<TFormData>>({ type, ...props }: TanStackInputFieldProps<TFormData, TName>): React$1.JSX.Element;
41
+ type TanStackTextareaFieldProps<TFormData, TName extends DeepKeys<TFormData>> = Omit<TanStackFieldProps<TFormData, TName>, "children" | "mapControlProps"> & Omit<React.ComponentProps<typeof Textarea>, "id" | "name" | "value" | "onChange" | "onBlur">;
42
+ /**
43
+ * TanStack Form field wired to {@link Textarea}.
44
+ */
45
+ declare function TanStackTextareaField<TFormData, TName extends DeepKeys<TFormData>>(props: TanStackTextareaFieldProps<TFormData, TName>): React$1.JSX.Element;
46
+ type TanStackCheckboxFieldProps<TFormData, TName extends DeepKeys<TFormData>> = Omit<TanStackFieldProps<TFormData, TName>, "children" | "mapControlProps" | "label"> & {
47
+ label: React.ReactNode;
48
+ checkboxClassName?: string;
49
+ labelClassName?: string;
50
+ };
51
+ /**
52
+ * TanStack Form field wired to {@link Checkbox} with a horizontal layout by default.
53
+ */
54
+ declare function TanStackCheckboxField<TFormData, TName extends DeepKeys<TFormData>>({ form, name, validators, checkboxClassName, labelClassName, label, description, orientation, className, }: TanStackCheckboxFieldProps<TFormData, TName>): React$1.JSX.Element;
55
+
56
+ export { TanStackCheckboxField, TanStackField, TanStackFieldLike, type TanStackFormLike, TanStackInputField, TanStackTextareaField };
@@ -0,0 +1,114 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { FormControl } from "../../components/primitives/forms/form-control.js";
4
+ import { Checkbox } from "../../components/primitives/forms/checkbox.js";
5
+ import { Input } from "../../components/primitives/forms/input.js";
6
+ import { Textarea } from "../../components/primitives/forms/textarea.js";
7
+ import {
8
+ Field,
9
+ FieldContent,
10
+ FieldDescription,
11
+ FieldError,
12
+ FieldLabel
13
+ } from "../../components/primitives/forms/field.js";
14
+ import {
15
+ getCheckboxFieldProps,
16
+ getInputFieldProps,
17
+ isFieldInvalid,
18
+ normalizeFieldErrors
19
+ } from "./field-props.js";
20
+ function TanStackField({
21
+ form,
22
+ name,
23
+ label,
24
+ description,
25
+ orientation,
26
+ labelClassName,
27
+ className,
28
+ validators,
29
+ children,
30
+ mapControlProps = getInputFieldProps
31
+ }) {
32
+ const FieldComponent = form.Field;
33
+ return /* @__PURE__ */ jsx(FieldComponent, { name, validators, children: (field) => {
34
+ const invalid = isFieldInvalid(field);
35
+ const controlId = String(field.name);
36
+ return /* @__PURE__ */ jsx(
37
+ FormControl,
38
+ {
39
+ id: controlId,
40
+ label,
41
+ description,
42
+ orientation,
43
+ labelClassName,
44
+ className,
45
+ invalid,
46
+ errors: normalizeFieldErrors(
47
+ field.state.meta.errors
48
+ ),
49
+ children: (resolvedControlId) => children(
50
+ field,
51
+ mapControlProps(field, resolvedControlId),
52
+ resolvedControlId
53
+ )
54
+ }
55
+ );
56
+ } });
57
+ }
58
+ function TanStackInputField({ type = "text", ...props }) {
59
+ return /* @__PURE__ */ jsx(TanStackField, { ...props, children: (_field, controlProps) => /* @__PURE__ */ jsx(Input, { ...controlProps, type }) });
60
+ }
61
+ function TanStackTextareaField(props) {
62
+ return /* @__PURE__ */ jsx(TanStackField, { ...props, children: (_field, controlProps) => /* @__PURE__ */ jsx(Textarea, { ...controlProps }) });
63
+ }
64
+ function TanStackCheckboxField({
65
+ form,
66
+ name,
67
+ validators,
68
+ checkboxClassName,
69
+ labelClassName,
70
+ label,
71
+ description,
72
+ orientation = "horizontal",
73
+ className
74
+ }) {
75
+ const FieldComponent = form.Field;
76
+ return /* @__PURE__ */ jsx(FieldComponent, { name, validators, children: (field) => {
77
+ const invalid = isFieldInvalid(field);
78
+ const controlProps = getCheckboxFieldProps(field);
79
+ return /* @__PURE__ */ jsxs(Field, { orientation, invalid, className, children: [
80
+ /* @__PURE__ */ jsx(Checkbox, { ...controlProps, className: checkboxClassName }),
81
+ /* @__PURE__ */ jsx(FieldLabel, { htmlFor: controlProps.id, className: labelClassName, children: label }),
82
+ (description || invalid) && /* @__PURE__ */ jsxs(FieldContent, { className: "sg:basis-full", children: [
83
+ description && /* @__PURE__ */ jsx(FieldDescription, { children: description }),
84
+ /* @__PURE__ */ jsx(
85
+ FieldError,
86
+ {
87
+ errors: normalizeFieldErrors(
88
+ field.state.meta.errors
89
+ )
90
+ }
91
+ )
92
+ ] })
93
+ ] });
94
+ } });
95
+ }
96
+ import {
97
+ getCheckboxFieldProps as getCheckboxFieldProps2,
98
+ getInputFieldProps as getInputFieldProps2,
99
+ getSelectFieldProps,
100
+ isFieldInvalid as isFieldInvalid2,
101
+ normalizeFieldErrors as normalizeFieldErrors2
102
+ } from "./field-props.js";
103
+ export {
104
+ TanStackCheckboxField,
105
+ TanStackField,
106
+ TanStackInputField,
107
+ TanStackTextareaField,
108
+ getCheckboxFieldProps2 as getCheckboxFieldProps,
109
+ getInputFieldProps2 as getInputFieldProps,
110
+ getSelectFieldProps,
111
+ isFieldInvalid2 as isFieldInvalid,
112
+ normalizeFieldErrors2 as normalizeFieldErrors
113
+ };
114
+ //# sourceMappingURL=tanstack-field.js.map