singularity-components 0.1.140 → 0.1.193

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/README.md +36 -4
  2. package/dist/components/blocks/cards/blogpost-card.d.ts +13 -0
  3. package/dist/components/blocks/cards/blogpost-card.js +79 -0
  4. package/dist/components/blocks/cards/blogpost-card.js.map +1 -0
  5. package/dist/components/blocks/cards/card.d.ts +14 -0
  6. package/dist/components/blocks/cards/card.js +86 -0
  7. package/dist/components/blocks/cards/card.js.map +1 -0
  8. package/dist/components/blocks/empty-state/EmptyState.d.ts +15 -0
  9. package/dist/components/blocks/empty-state/EmptyState.js +36 -0
  10. package/dist/components/blocks/empty-state/EmptyState.js.map +1 -0
  11. package/dist/components/blocks/index.d.ts +5 -0
  12. package/dist/components/blocks/index.js +5 -0
  13. package/dist/components/blocks/index.js.map +1 -0
  14. package/dist/components/blocks/post-list/post-filters.d.ts +19 -0
  15. package/dist/components/blocks/post-list/post-filters.js +99 -0
  16. package/dist/components/blocks/post-list/post-filters.js.map +1 -0
  17. package/dist/components/blocks/post-list/post-list-with-filters.d.ts +19 -0
  18. package/dist/components/blocks/post-list/post-list-with-filters.js +439 -0
  19. package/dist/components/blocks/post-list/post-list-with-filters.js.map +1 -0
  20. package/dist/components/index.d.ts +43 -10
  21. package/dist/components/index.js +5 -3
  22. package/dist/components/index.js.map +1 -1
  23. package/dist/components/pages/admin/admin-page.d.ts +8 -0
  24. package/dist/components/pages/admin/admin-page.js +299 -0
  25. package/dist/components/pages/admin/admin-page.js.map +1 -0
  26. package/dist/components/pages/blogpost/blogpost.d.ts +5 -0
  27. package/dist/components/pages/blogpost/blogpost.js +440 -0
  28. package/dist/components/pages/blogpost/blogpost.js.map +1 -0
  29. package/dist/components/pages/category/category-page.d.ts +8 -0
  30. package/dist/components/pages/category/category-page.js +69 -0
  31. package/dist/components/pages/category/category-page.js.map +1 -0
  32. package/dist/components/pages/chat/chat-page.d.ts +5 -0
  33. package/dist/components/pages/chat/chat-page.js +209 -0
  34. package/dist/components/pages/chat/chat-page.js.map +1 -0
  35. package/dist/components/pages/index.d.ts +11 -0
  36. package/dist/components/pages/index.js +11 -0
  37. package/dist/components/pages/index.js.map +1 -0
  38. package/dist/components/pages/login/login-page.d.ts +19 -0
  39. package/dist/components/pages/login/login-page.js +108 -0
  40. package/dist/components/pages/login/login-page.js.map +1 -0
  41. package/dist/components/pages/maintenance/maintenance-page.d.ts +5 -0
  42. package/dist/components/pages/maintenance/maintenance-page.js +50 -0
  43. package/dist/components/pages/maintenance/maintenance-page.js.map +1 -0
  44. package/dist/components/pages/not-found/not-found.d.ts +10 -0
  45. package/dist/components/pages/not-found/not-found.js +64 -0
  46. package/dist/components/pages/not-found/not-found.js.map +1 -0
  47. package/dist/components/pages/privacy/privacy-page.d.ts +15 -0
  48. package/dist/components/pages/privacy/privacy-page.js +98 -0
  49. package/dist/components/pages/privacy/privacy-page.js.map +1 -0
  50. package/dist/components/pages/search/search-page.d.ts +5 -0
  51. package/dist/components/pages/search/search-page.js +18 -0
  52. package/dist/components/pages/search/search-page.js.map +1 -0
  53. package/dist/components/pages/startpage/startpage.d.ts +5 -0
  54. package/dist/components/pages/startpage/startpage.js +50 -0
  55. package/dist/components/pages/startpage/startpage.js.map +1 -0
  56. package/dist/components/pages/terms/terms-page.d.ts +15 -0
  57. package/dist/components/pages/terms/terms-page.js +98 -0
  58. package/dist/components/pages/terms/terms-page.js.map +1 -0
  59. package/dist/components/primitives/accordion/accordion.js +1 -1
  60. package/dist/components/primitives/accordion/accordion.js.map +1 -1
  61. package/dist/components/primitives/alert/alert.js +1 -1
  62. package/dist/components/primitives/alert/alert.js.map +1 -1
  63. package/dist/components/primitives/avatar/avatar.d.ts +14 -0
  64. package/dist/components/primitives/avatar/avatar.js +103 -0
  65. package/dist/components/primitives/avatar/avatar.js.map +1 -0
  66. package/dist/components/primitives/badge/badge.d.ts +12 -4
  67. package/dist/components/primitives/badge/badge.js +15 -15
  68. package/dist/components/primitives/badge/badge.js.map +1 -1
  69. package/dist/components/primitives/badge/badges.js +1 -1
  70. package/dist/components/primitives/badge/badges.js.map +1 -1
  71. package/dist/components/primitives/{button → buttons}/button.d.ts +15 -9
  72. package/dist/components/primitives/buttons/button.js +92 -0
  73. package/dist/components/primitives/buttons/button.js.map +1 -0
  74. package/dist/components/primitives/buttons/icon-button.d.ts +33 -0
  75. package/dist/components/primitives/buttons/icon-button.js +61 -0
  76. package/dist/components/primitives/buttons/icon-button.js.map +1 -0
  77. package/dist/components/primitives/buttons/link-button.d.ts +16 -0
  78. package/dist/components/primitives/buttons/link-button.js +35 -0
  79. package/dist/components/primitives/buttons/link-button.js.map +1 -0
  80. package/dist/components/primitives/collapsible/collapsible.d.ts +9 -0
  81. package/dist/components/primitives/collapsible/collapsible.js +53 -0
  82. package/dist/components/primitives/collapsible/collapsible.js.map +1 -0
  83. package/dist/components/primitives/dropdown-menu/dropdown-menu.d.ts +30 -0
  84. package/dist/components/primitives/dropdown-menu/dropdown-menu.js +164 -0
  85. package/dist/components/primitives/dropdown-menu/dropdown-menu.js.map +1 -0
  86. package/dist/components/primitives/forms/checkbox.d.ts +6 -0
  87. package/dist/components/primitives/forms/checkbox.js +30 -0
  88. package/dist/components/primitives/forms/checkbox.js.map +1 -0
  89. package/dist/components/primitives/forms/field.d.ts +29 -0
  90. package/dist/components/primitives/forms/field.js +218 -0
  91. package/dist/components/primitives/forms/field.js.map +1 -0
  92. package/dist/components/primitives/forms/input.d.ts +6 -0
  93. package/dist/components/primitives/forms/input.js +22 -0
  94. package/dist/components/primitives/forms/input.js.map +1 -0
  95. package/dist/components/primitives/forms/select.d.ts +22 -0
  96. package/dist/components/primitives/forms/select.js +169 -0
  97. package/dist/components/primitives/forms/select.js.map +1 -0
  98. package/dist/components/primitives/forms/textarea.d.ts +6 -0
  99. package/dist/components/primitives/forms/textarea.js +20 -0
  100. package/dist/components/primitives/forms/textarea.js.map +1 -0
  101. package/dist/components/primitives/icon/icon.d.ts +10 -3
  102. package/dist/components/primitives/icon/icon.js +15 -14
  103. package/dist/components/primitives/icon/icon.js.map +1 -1
  104. package/dist/components/primitives/index.d.ts +25 -7
  105. package/dist/components/primitives/index.js +31 -18
  106. package/dist/components/primitives/index.js.map +1 -1
  107. package/dist/components/primitives/label/label.d.ts +6 -0
  108. package/dist/components/primitives/label/label.js +22 -0
  109. package/dist/components/primitives/label/label.js.map +1 -0
  110. package/dist/components/primitives/layout/layout.d.ts +8 -4
  111. package/dist/components/primitives/layout/layout.js +35 -17
  112. package/dist/components/primitives/layout/layout.js.map +1 -1
  113. package/dist/components/primitives/link/link.d.ts +42 -0
  114. package/dist/components/primitives/link/link.js +83 -0
  115. package/dist/components/primitives/link/link.js.map +1 -0
  116. package/dist/components/primitives/separator/separator.js +1 -1
  117. package/dist/components/primitives/separator/separator.js.map +1 -1
  118. package/dist/components/primitives/sheet/sheet.d.ts +29 -0
  119. package/dist/components/primitives/sheet/sheet.js +117 -0
  120. package/dist/components/primitives/sheet/sheet.js.map +1 -0
  121. package/dist/components/primitives/skeleton/skeleton.js +1 -1
  122. package/dist/components/primitives/skeleton/skeleton.js.map +1 -1
  123. package/dist/components/primitives/sonner/sonner.d.ts +7 -0
  124. package/dist/components/primitives/sonner/sonner.js +42 -0
  125. package/dist/components/primitives/sonner/sonner.js.map +1 -0
  126. package/dist/components/primitives/sonner/use-toast.d.ts +24 -0
  127. package/dist/components/primitives/sonner/use-toast.js +21 -0
  128. package/dist/components/primitives/sonner/use-toast.js.map +1 -0
  129. package/dist/components/primitives/spinner/spinner.js +1 -1
  130. package/dist/components/primitives/spinner/spinner.js.map +1 -1
  131. package/dist/components/primitives/stack/stack.d.ts +5 -1
  132. package/dist/components/primitives/stack/stack.js +46 -5
  133. package/dist/components/primitives/stack/stack.js.map +1 -1
  134. package/dist/components/primitives/text/{text-heading.d.ts → heading.d.ts} +5 -5
  135. package/dist/components/primitives/text/heading.js +53 -0
  136. package/dist/components/primitives/text/heading.js.map +1 -0
  137. package/dist/components/primitives/text/internal/text-element.d.ts +30 -4
  138. package/dist/components/primitives/text/internal/text-element.js +24 -14
  139. package/dist/components/primitives/text/internal/text-element.js.map +1 -1
  140. package/dist/components/primitives/text/text-code.d.ts +26 -0
  141. package/dist/components/primitives/text/text-code.js +44 -0
  142. package/dist/components/primitives/text/text-code.js.map +1 -0
  143. package/dist/components/primitives/text/text-div.d.ts +1 -1
  144. package/dist/components/primitives/text/text-div.js +2 -2
  145. package/dist/components/primitives/text/text-div.js.map +1 -1
  146. package/dist/components/primitives/text/text-span.js +2 -2
  147. package/dist/components/primitives/text/text-span.js.map +1 -1
  148. package/dist/components/primitives/text/text-time.js +2 -2
  149. package/dist/components/primitives/text/text-time.js.map +1 -1
  150. package/dist/components/primitives/text/text.d.ts +16 -0
  151. package/dist/components/primitives/text/{text-paragraph.js → text.js} +16 -5
  152. package/dist/components/primitives/text/text.js.map +1 -0
  153. package/dist/components/primitives/{ui-image.d.ts → ui-image/ui-image.d.ts} +1 -1
  154. package/dist/components/primitives/{ui-image.js → ui-image/ui-image.js} +4 -7
  155. package/dist/components/primitives/ui-image/ui-image.js.map +1 -0
  156. package/dist/components/primitives/ui-link/ui-link.d.ts +8 -0
  157. package/dist/components/primitives/ui-link/ui-link.js +19 -0
  158. package/dist/components/primitives/ui-link/ui-link.js.map +1 -0
  159. package/dist/components/providers/LinkContext.d.ts +1 -1
  160. package/dist/components/providers/LinkContext.js +1 -1
  161. package/dist/components/providers/LinkContext.js.map +1 -1
  162. package/dist/components/providers/SingularityContext.d.ts +4 -1
  163. package/dist/components/providers/SingularityContext.js +7 -3
  164. package/dist/components/providers/SingularityContext.js.map +1 -1
  165. package/dist/components/providers/auth-provider.d.ts +15 -0
  166. package/dist/components/providers/auth-provider.js +30 -0
  167. package/dist/components/providers/auth-provider.js.map +1 -0
  168. package/dist/components/providers/index.d.ts +3 -0
  169. package/dist/components/providers/index.js +5 -3
  170. package/dist/components/providers/index.js.map +1 -1
  171. package/dist/components/providers/theme-provider.d.ts +27 -0
  172. package/dist/components/providers/theme-provider.js +75 -0
  173. package/dist/components/providers/theme-provider.js.map +1 -0
  174. package/dist/components/templates/container/container.d.ts +20 -0
  175. package/dist/components/templates/container/container.js +58 -0
  176. package/dist/components/templates/container/container.js.map +1 -0
  177. package/dist/components/templates/footer/footer.d.ts +5 -0
  178. package/dist/components/templates/footer/footer.js +12 -0
  179. package/dist/components/templates/footer/footer.js.map +1 -0
  180. package/dist/components/templates/form/form.d.ts +5 -0
  181. package/dist/components/templates/form/form.js +141 -0
  182. package/dist/components/templates/form/form.js.map +1 -0
  183. package/dist/components/templates/hero/hero.d.ts +18 -0
  184. package/dist/components/templates/hero/hero.js +301 -0
  185. package/dist/components/templates/hero/hero.js.map +1 -0
  186. package/dist/components/templates/index.d.ts +5 -0
  187. package/dist/components/templates/index.js +5 -0
  188. package/dist/components/templates/index.js.map +1 -0
  189. package/dist/components/templates/navigation/header.d.ts +19 -0
  190. package/dist/components/templates/navigation/header.js +222 -0
  191. package/dist/components/templates/navigation/header.js.map +1 -0
  192. package/dist/components/templates/navigation/index.d.ts +3 -0
  193. package/dist/components/templates/navigation/index.js +2 -0
  194. package/dist/components/templates/navigation/index.js.map +1 -0
  195. package/dist/css/variables.css +75 -73
  196. package/dist/css/variables.css.map +1 -1
  197. package/dist/data/authors.d.ts +12 -0
  198. package/dist/data/authors.js +33 -0
  199. package/dist/data/authors.js.map +1 -0
  200. package/dist/data/posts.d.ts +22 -0
  201. package/dist/data/posts.js +285 -0
  202. package/dist/data/posts.js.map +1 -0
  203. package/dist/index.d.ts +43 -10
  204. package/dist/index.js +1 -1
  205. package/dist/index.js.map +1 -1
  206. package/dist/lib/helpers/index.js +1 -1
  207. package/dist/lib/helpers/index.js.map +1 -1
  208. package/dist/lib/hooks/useIsClient.d.ts +3 -0
  209. package/dist/lib/hooks/useIsClient.js +14 -0
  210. package/dist/lib/hooks/useIsClient.js.map +1 -0
  211. package/dist/lib/index.d.ts +1 -0
  212. package/dist/lib/index.js +2 -1
  213. package/dist/lib/index.js.map +1 -1
  214. package/dist/lib/types.d.ts +4 -8
  215. package/dist/main.css +2026 -455
  216. package/dist/main.css.map +1 -1
  217. package/dist/{utils.js → utils/index.js} +1 -1
  218. package/dist/utils/index.js.map +1 -0
  219. package/dist/utils/index.test.js +37 -0
  220. package/dist/utils/index.test.js.map +1 -0
  221. package/package.json +80 -44
  222. package/dist/components/primitives/accordion/accordion.stories.d.ts +0 -15
  223. package/dist/components/primitives/accordion/accordion.stories.js +0 -60
  224. package/dist/components/primitives/accordion/accordion.stories.js.map +0 -1
  225. package/dist/components/primitives/alert/alert.stories.d.ts +0 -22
  226. package/dist/components/primitives/alert/alert.stories.js +0 -37
  227. package/dist/components/primitives/alert/alert.stories.js.map +0 -1
  228. package/dist/components/primitives/button/button.js +0 -56
  229. package/dist/components/primitives/button/button.js.map +0 -1
  230. package/dist/components/primitives/button/button.stories.d.ts +0 -34
  231. package/dist/components/primitives/button/button.stories.js +0 -74
  232. package/dist/components/primitives/button/button.stories.js.map +0 -1
  233. package/dist/components/primitives/button/button_with_icon_variant.js +0 -1
  234. package/dist/components/primitives/button/button_with_icon_variant.js.map +0 -1
  235. package/dist/components/primitives/icon/icon.stories.d.ts +0 -27
  236. package/dist/components/primitives/icon/icon.stories.js +0 -30
  237. package/dist/components/primitives/icon/icon.stories.js.map +0 -1
  238. package/dist/components/primitives/layout/layout.stories.d.ts +0 -32
  239. package/dist/components/primitives/layout/layout.stories.js +0 -72
  240. package/dist/components/primitives/layout/layout.stories.js.map +0 -1
  241. package/dist/components/primitives/separator/separator.stories.d.ts +0 -15
  242. package/dist/components/primitives/separator/separator.stories.js +0 -18
  243. package/dist/components/primitives/separator/separator.stories.js.map +0 -1
  244. package/dist/components/primitives/skeleton/skeleton.stories.d.ts +0 -13
  245. package/dist/components/primitives/skeleton/skeleton.stories.js +0 -16
  246. package/dist/components/primitives/skeleton/skeleton.stories.js.map +0 -1
  247. package/dist/components/primitives/spinner/spinner.stories.d.ts +0 -16
  248. package/dist/components/primitives/spinner/spinner.stories.js +0 -34
  249. package/dist/components/primitives/spinner/spinner.stories.js.map +0 -1
  250. package/dist/components/primitives/stack/stack.stories.d.ts +0 -13
  251. package/dist/components/primitives/stack/stack.stories.js +0 -26
  252. package/dist/components/primitives/stack/stack.stories.js.map +0 -1
  253. package/dist/components/primitives/text/text-div.stories.d.ts +0 -32
  254. package/dist/components/primitives/text/text-div.stories.js +0 -59
  255. package/dist/components/primitives/text/text-div.stories.js.map +0 -1
  256. package/dist/components/primitives/text/text-heading.js +0 -53
  257. package/dist/components/primitives/text/text-heading.js.map +0 -1
  258. package/dist/components/primitives/text/text-heading.stories.d.ts +0 -27
  259. package/dist/components/primitives/text/text-heading.stories.js +0 -47
  260. package/dist/components/primitives/text/text-heading.stories.js.map +0 -1
  261. package/dist/components/primitives/text/text-paragraph.d.ts +0 -10
  262. package/dist/components/primitives/text/text-paragraph.js.map +0 -1
  263. package/dist/components/primitives/text/text-span.stories.d.ts +0 -31
  264. package/dist/components/primitives/text/text-span.stories.js +0 -59
  265. package/dist/components/primitives/text/text-span.stories.js.map +0 -1
  266. package/dist/components/primitives/ui-image.js.map +0 -1
  267. package/dist/components/primitives/ui-link.d.ts +0 -6
  268. package/dist/components/primitives/ui-link.js +0 -22
  269. package/dist/components/primitives/ui-link.js.map +0 -1
  270. package/dist/components/units/cards/blog-card.d.ts +0 -19
  271. package/dist/components/units/cards/blog-card.js +0 -82
  272. package/dist/components/units/cards/blog-card.js.map +0 -1
  273. package/dist/components/units/cards/card.d.ts +0 -15
  274. package/dist/components/units/cards/card.js +0 -89
  275. package/dist/components/units/cards/card.js.map +0 -1
  276. package/dist/components/units/cards/cards.d.ts +0 -17
  277. package/dist/components/units/cards/cards.js +0 -37
  278. package/dist/components/units/cards/cards.js.map +0 -1
  279. package/dist/components/units/index.d.ts +0 -5
  280. package/dist/components/units/index.js +0 -4
  281. package/dist/components/units/index.js.map +0 -1
  282. package/dist/utils.js.map +0 -1
  283. /package/dist/{utils.d.ts → utils/index.d.ts} +0 -0
  284. /package/dist/{components/primitives/button/button_with_icon_variant.d.ts → utils/index.test.d.ts} +0 -0
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  ## Build
2
2
 
3
- npm run build
3
+ ```bash
4
+ pnpm build
5
+ ```
4
6
 
5
7
  ### Include component in build
6
8
 
@@ -8,12 +10,42 @@ Export from main.ts
8
10
 
9
11
  ## Publish to npm
10
12
 
11
- npm publish
13
+ ```bash
14
+ pnpm login (if needed)
15
+ pnpm publish
16
+ ```
12
17
 
13
18
  ## Start Storybook:
14
19
 
15
- npm run storybook
20
+ ```bash
21
+ pnpm storybook
22
+ ```
16
23
 
17
24
  ## Pack locally
18
25
 
19
- npm pack singularity-components
26
+ ```bash
27
+ pnpm pack singularity-components
28
+ ```
29
+
30
+ OR
31
+
32
+ ```bash
33
+ pnpm pack
34
+ ```
35
+
36
+ Can check with `pnpm pack --dry-run`
37
+ Or run `pnpm pack`
38
+
39
+ Creates a `singularity-components-1.0.0.tgz`
40
+
41
+ In other proj add:
42
+
43
+ ```json
44
+ {
45
+ "dependencies": {
46
+ "singularity-components": "file:../path-to-tarball/singularity-components-1.X.X.tgz"
47
+ }
48
+ }
49
+ ```
50
+
51
+ and `pnpm install`
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface Props {
4
+ id: number;
5
+ image: string;
6
+ categories: string[];
7
+ date: string;
8
+ title: string;
9
+ excerpt: string;
10
+ }
11
+ declare function BlogPostCard({ id, image, title, categories, date, excerpt, }: Props): react_jsx_runtime.JSX.Element;
12
+
13
+ export { BlogPostCard as default };
@@ -0,0 +1,79 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Card, CardContent } from "./card.js";
3
+ import { Link } from "../../primitives/link/link.js";
4
+ import {
5
+ TextTime,
6
+ Heading,
7
+ Text,
8
+ TextSpan,
9
+ Badges,
10
+ Badge,
11
+ Icon,
12
+ UiImage
13
+ } from "../../primitives/index.js";
14
+ function BlogPostCard({
15
+ id,
16
+ image,
17
+ title,
18
+ categories,
19
+ date,
20
+ excerpt
21
+ }) {
22
+ return /* @__PURE__ */ jsx(
23
+ Link,
24
+ {
25
+ to: `/posts/${id}`,
26
+ variant: "no-decoration",
27
+ className: "sg:group sg:block sg:h-full",
28
+ children: /* @__PURE__ */ jsxs(Card, { className: "sg:overflow-hidden sg:transition-shadow sg:hover:shadow-lg sg:h-full sg:flex sg:flex-col", children: [
29
+ /* @__PURE__ */ jsx("div", { className: "sg:aspect-16/10 sg:overflow-hidden", children: /* @__PURE__ */ jsx(
30
+ UiImage,
31
+ {
32
+ src: image,
33
+ alt: title,
34
+ className: "sg:h-full sg:w-full sg:object-cover sg:transition-transform sg:duration-300 sg:group-hover:scale-105",
35
+ loading: "lazy"
36
+ }
37
+ ) }),
38
+ /* @__PURE__ */ jsxs(CardContent, { className: "sg:p-5 sg:flex sg:flex-col sg:grow", children: [
39
+ categories && categories.length > 0 && /* @__PURE__ */ jsx(Badges, { className: "sg:mb-2", children: categories.map((cat) => /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: cat }, cat)) }),
40
+ /* @__PURE__ */ jsx(TextTime, { size: "xs", foreground: "muted-foreground", children: date }),
41
+ /* @__PURE__ */ jsx(
42
+ Heading,
43
+ {
44
+ variant: "h6",
45
+ as: "h3",
46
+ className: "sg:mt-1 sg:group-hover:text-primary sg:transition-colors",
47
+ children: title
48
+ }
49
+ ),
50
+ /* @__PURE__ */ jsx(
51
+ Text,
52
+ {
53
+ size: "sm",
54
+ foreground: "muted-foreground",
55
+ className: "sg:mt-2 sg:line-clamp-2",
56
+ children: excerpt
57
+ }
58
+ ),
59
+ /* @__PURE__ */ jsxs(
60
+ TextSpan,
61
+ {
62
+ size: "sm",
63
+ foreground: "primary",
64
+ className: "sg:mt-auto sg:pt-3 sg:inline-flex sg:items-center sg:gap-1",
65
+ children: [
66
+ "Read more ",
67
+ /* @__PURE__ */ jsx(Icon, { icon: "ArrowRight", size: "xs" })
68
+ ]
69
+ }
70
+ )
71
+ ] })
72
+ ] })
73
+ }
74
+ );
75
+ }
76
+ export {
77
+ BlogPostCard as default
78
+ };
79
+ //# sourceMappingURL=blogpost-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/blocks/cards/blogpost-card.tsx"],"sourcesContent":["import { Card, CardContent } from \"./card\";\r\nimport { Link } from \"../../primitives/link/link\";\r\nimport {\r\n TextTime,\r\n Heading,\r\n Text,\r\n TextSpan,\r\n Badges,\r\n Badge,\r\n Icon,\r\n UiImage,\r\n} from \"../../primitives/index\";\r\n\r\ninterface Props {\r\n id: number;\r\n image: string;\r\n categories: string[];\r\n date: string;\r\n title: string;\r\n excerpt: string;\r\n}\r\n\r\nexport default function BlogPostCard({\r\n id,\r\n image,\r\n title,\r\n categories,\r\n date,\r\n excerpt,\r\n}: Props) {\r\n return (\r\n <Link\r\n to={`/posts/${id}`}\r\n variant=\"no-decoration\"\r\n className=\"sg:group sg:block sg:h-full\"\r\n >\r\n <Card className=\"sg:overflow-hidden sg:transition-shadow sg:hover:shadow-lg sg:h-full sg:flex sg:flex-col\">\r\n <div className=\"sg:aspect-16/10 sg:overflow-hidden\">\r\n <UiImage\r\n src={image}\r\n alt={title}\r\n className=\"sg:h-full sg:w-full sg:object-cover sg:transition-transform sg:duration-300 sg:group-hover:scale-105\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n <CardContent className=\"sg:p-5 sg:flex sg:flex-col sg:grow\">\r\n {categories && categories.length > 0 && (\r\n <Badges className=\"sg:mb-2\">\r\n {categories.map((cat) => (\r\n <Badge key={cat} variant=\"secondary\">\r\n {cat}\r\n </Badge>\r\n ))}\r\n </Badges>\r\n )}\r\n <TextTime size=\"xs\" foreground=\"muted-foreground\">\r\n {date}\r\n </TextTime>\r\n <Heading\r\n variant=\"h6\"\r\n as=\"h3\"\r\n className=\"sg:mt-1 sg:group-hover:text-primary sg:transition-colors\"\r\n >\r\n {title}\r\n </Heading>\r\n <Text\r\n size=\"sm\"\r\n foreground=\"muted-foreground\"\r\n className=\"sg:mt-2 sg:line-clamp-2\"\r\n >\r\n {excerpt}\r\n </Text>\r\n <TextSpan\r\n size=\"sm\"\r\n foreground=\"primary\"\r\n className=\"sg:mt-auto sg:pt-3 sg:inline-flex sg:items-center sg:gap-1\"\r\n >\r\n Read more <Icon icon=\"ArrowRight\" size=\"xs\" />\r\n </TextSpan>\r\n </CardContent>\r\n </Card>\r\n </Link>\r\n );\r\n}\r\n"],"mappings":"AAsCU,cAkCA,YAlCA;AAtCV,SAAS,MAAM,mBAAmB;AAClC,SAAS,YAAY;AACrB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAWQ,SAAR,aAA8B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,UAAU,EAAE;AAAA,MAChB,SAAQ;AAAA,MACR,WAAU;AAAA,MAEV,+BAAC,QAAK,WAAU,4FACd;AAAA,4BAAC,SAAI,WAAU,sCACb;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAQ;AAAA;AAAA,QACV,GACF;AAAA,QACA,qBAAC,eAAY,WAAU,sCACpB;AAAA,wBAAc,WAAW,SAAS,KACjC,oBAAC,UAAO,WAAU,WACf,qBAAW,IAAI,CAAC,QACf,oBAAC,SAAgB,SAAQ,aACtB,iBADS,GAEZ,CACD,GACH;AAAA,UAEF,oBAAC,YAAS,MAAK,MAAK,YAAW,oBAC5B,gBACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAG;AAAA,cACH,WAAU;AAAA,cAET;AAAA;AAAA,UACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,YAAW;AAAA,cACX,WAAU;AAAA,cAET;AAAA;AAAA,UACH;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,YAAW;AAAA,cACX,WAAU;AAAA,cACX;AAAA;AAAA,gBACW,oBAAC,QAAK,MAAK,cAAa,MAAK,MAAK;AAAA;AAAA;AAAA,UAC9C;AAAA,WACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,14 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ declare function Card({ className, size, ...props }: React.ComponentProps<"div"> & {
5
+ size?: "default" | "sm";
6
+ }): react_jsx_runtime.JSX.Element;
7
+ declare function CardHeader({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
8
+ declare function CardTitle({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
9
+ declare function CardDescription({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
10
+ declare function CardAction({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
11
+ declare function CardContent({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
12
+ declare function CardFooter({ className, ...props }: React.ComponentProps<"div">): react_jsx_runtime.JSX.Element;
13
+
14
+ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
@@ -0,0 +1,86 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../../../utils/index.js";
4
+ function Card({
5
+ className,
6
+ size = "default",
7
+ ...props
8
+ }) {
9
+ return /* @__PURE__ */ jsx(
10
+ "div",
11
+ {
12
+ "data-slot": "card",
13
+ "data-size": size,
14
+ className: cn(
15
+ "sg:ring-foreground/10 sg:bg-card sg:gap-6 sg:overflow-hidden sg:rounded-2xl sg:ring-1 sg:has-[>img:first-child]:pt-0 sg:data-[size=sm]:gap-4 sg:data-[size=sm]:py-4 sg:*:[img:first-child]:rounded-t-xl sg:*:[img:last-child]:rounded-b-xl sg:group/card sg:flex sg:flex-col",
16
+ className
17
+ ),
18
+ ...props
19
+ }
20
+ );
21
+ }
22
+ function CardHeader({ className, ...props }) {
23
+ return /* @__PURE__ */ jsx(
24
+ "div",
25
+ {
26
+ "data-slot": "card-header",
27
+ className: cn(
28
+ "sg:gap-2 sg:rounded-t-xl sg:px-6 sg:group-data-[size=sm]/card:px-4 sg:[.border-b]:pb-6 sg:group-data-[size=sm]/card:[.border-b]:pb-4 sg:group/card-header sg:@container/card-header sg:grid sg:auto-rows-min sg:items-start sg:has-data-[slot=card-action]:grid-cols-[1fr_auto] sg:has-data-[slot=card-description]:grid-rows-[auto_auto]",
29
+ className
30
+ ),
31
+ ...props
32
+ }
33
+ );
34
+ }
35
+ function CardTitle({ className, ...props }) {
36
+ return /* @__PURE__ */ jsx("div", { "data-slot": "card-title", ...props });
37
+ }
38
+ function CardDescription({ className, ...props }) {
39
+ return /* @__PURE__ */ jsx("div", { "data-slot": "card-description", ...props });
40
+ }
41
+ function CardAction({ className, ...props }) {
42
+ return /* @__PURE__ */ jsx(
43
+ "div",
44
+ {
45
+ "data-slot": "card-action",
46
+ className: cn(
47
+ "sg:col-start-2 sg:row-span-2 sg:row-start-1 sg:self-start sg:justify-self-end",
48
+ className
49
+ ),
50
+ ...props
51
+ }
52
+ );
53
+ }
54
+ function CardContent({ className, ...props }) {
55
+ return /* @__PURE__ */ jsx(
56
+ "div",
57
+ {
58
+ "data-slot": "card-content",
59
+ className: cn("sg:px-6 sg:group-data-[size=sm]/card:px-4", className),
60
+ ...props
61
+ }
62
+ );
63
+ }
64
+ function CardFooter({ className, ...props }) {
65
+ return /* @__PURE__ */ jsx(
66
+ "div",
67
+ {
68
+ "data-slot": "card-footer",
69
+ className: cn(
70
+ "sg:rounded-b-xl sg:px-6 sg:group-data-[size=sm]/card:px-4 sg:[.border-t]:pt-6 sg:group-data-[size=sm]/card:[.border-t]:pt-4 sg:flex sg:items-center",
71
+ className
72
+ ),
73
+ ...props
74
+ }
75
+ );
76
+ }
77
+ export {
78
+ Card,
79
+ CardAction,
80
+ CardContent,
81
+ CardDescription,
82
+ CardFooter,
83
+ CardHeader,
84
+ CardTitle
85
+ };
86
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/blocks/cards/card.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../../utils/index\";\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"sg:ring-foreground/10 sg:bg-card sg:gap-6 sg:overflow-hidden sg:rounded-2xl sg:ring-1 sg:has-[>img:first-child]:pt-0 sg:data-[size=sm]:gap-4 sg:data-[size=sm]:py-4 sg:*:[img:first-child]:rounded-t-xl sg:*:[img:last-child]:rounded-b-xl sg:group/card sg:flex sg:flex-col\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"sg:gap-2 sg:rounded-t-xl sg:px-6 sg:group-data-[size=sm]/card:px-4 sg:[.border-b]:pb-6 sg:group-data-[size=sm]/card:[.border-b]:pb-4 sg:group/card-header sg:@container/card-header sg:grid sg:auto-rows-min sg:items-start sg:has-data-[slot=card-action]:grid-cols-[1fr_auto] sg:has-data-[slot=card-description]:grid-rows-[auto_auto]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-title\" {...props} />;\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div data-slot=\"card-description\" {...props} />;\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"sg:col-start-2 sg:row-span-2 sg:row-start-1 sg:self-start sg:justify-self-end\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"sg:px-6 sg:group-data-[size=sm]/card:px-4\", className)}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"sg:rounded-b-xl sg:px-6 sg:group-data-[size=sm]/card:px-4 sg:[.border-t]:pt-6 sg:group-data-[size=sm]/card:[.border-t]:pt-4 sg:flex sg:items-center\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n};\n"],"mappings":"AASI;AATJ,YAAY,WAAW;AACvB,SAAS,UAAU;AAEnB,SAAS,KAAK;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAA8D;AAC5D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,aAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,UAAU,EAAE,WAAW,GAAG,MAAM,GAAgC;AACvE,SAAO,oBAAC,SAAI,aAAU,cAAc,GAAG,OAAO;AAChD;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC7E,SAAO,oBAAC,SAAI,aAAU,oBAAoB,GAAG,OAAO;AACtD;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,6CAA6C,SAAS;AAAA,MACnE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AACxE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { icons } from 'lucide-react';
3
+
4
+ interface Props {
5
+ icon?: keyof typeof icons;
6
+ title: string;
7
+ description?: string;
8
+ actionLabel?: string;
9
+ actionTo?: string;
10
+ onAction?: () => void;
11
+ className?: string;
12
+ }
13
+ declare function EmptyState({ icon, title, description, actionLabel, actionTo, onAction, className, }: Props): react_jsx_runtime.JSX.Element;
14
+
15
+ export { EmptyState as default };
@@ -0,0 +1,36 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Button } from "../../primitives/buttons/button.js";
3
+ import { LinkButton } from "../../primitives/buttons/link-button.js";
4
+ import { Heading, Text } from "../../primitives/index.js";
5
+ import { cn } from "../../../utils/index.js";
6
+ import { icons } from "lucide-react";
7
+ function EmptyState({
8
+ icon,
9
+ title,
10
+ description,
11
+ actionLabel,
12
+ actionTo,
13
+ onAction,
14
+ className = ""
15
+ }) {
16
+ const Icon = icon && icons[icon];
17
+ return /* @__PURE__ */ jsxs(
18
+ "div",
19
+ {
20
+ className: cn(
21
+ "sg:flex sg:flex-col sg:items-center sg:justify-center sg:py-16 sg:text-center",
22
+ className
23
+ ),
24
+ children: [
25
+ /* @__PURE__ */ jsx("div", { className: "sg:rounded-full sg:bg-muted sg:p-4 sg:mb-4", children: Icon && /* @__PURE__ */ jsx(Icon, {}) }),
26
+ /* @__PURE__ */ jsx(Heading, { variant: "h3", className: "sg:mb-1", children: title }),
27
+ description && /* @__PURE__ */ jsx(Text, { size: "sm", foreground: "muted-foreground", className: "sg:max-w-sm", children: description }),
28
+ actionLabel && (actionTo || onAction) && /* @__PURE__ */ jsx("div", { className: "sg:mt-5", children: actionTo ? /* @__PURE__ */ jsx(LinkButton, { to: actionTo, children: actionLabel }) : /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: onAction, children: actionLabel }) })
29
+ ]
30
+ }
31
+ );
32
+ }
33
+ export {
34
+ EmptyState as default
35
+ };
36
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/blocks/empty-state/EmptyState.tsx"],"sourcesContent":["import { Button } from \"../../primitives/buttons/button\";\r\nimport { LinkButton } from \"../../primitives/buttons/link-button\";\r\nimport { Heading, Text } from \"../../primitives/index\";\r\nimport { cn } from \"../../../utils/index\";\r\nimport { icons } from \"lucide-react\";\r\n\r\ninterface Props {\r\n icon?: keyof typeof icons;\r\n title: string;\r\n description?: string;\r\n actionLabel?: string;\r\n actionTo?: string;\r\n onAction?: () => void;\r\n className?: string;\r\n}\r\n\r\nexport default function EmptyState({\r\n icon,\r\n title,\r\n description,\r\n actionLabel,\r\n actionTo,\r\n onAction,\r\n className = \"\",\r\n}: Props) {\r\n const Icon = icon && icons[icon];\r\n return (\r\n <div\r\n className={cn(\r\n \"sg:flex sg:flex-col sg:items-center sg:justify-center sg:py-16 sg:text-center\",\r\n className,\r\n )}\r\n >\r\n <div className=\"sg:rounded-full sg:bg-muted sg:p-4 sg:mb-4\">\r\n {Icon && <Icon />}\r\n </div>\r\n <Heading variant=\"h3\" className=\"sg:mb-1\">\r\n {title}\r\n </Heading>\r\n {description && (\r\n <Text size=\"sm\" foreground=\"muted-foreground\" className=\"sg:max-w-sm\">\r\n {description}\r\n </Text>\r\n )}\r\n {actionLabel && (actionTo || onAction) && (\r\n <div className=\"sg:mt-5\">\r\n {actionTo ? (\r\n <LinkButton to={actionTo}>{actionLabel}</LinkButton>\r\n ) : (\r\n <Button variant=\"outline\" onClick={onAction}>\r\n {actionLabel}\r\n </Button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"AA2BI,SAOa,KAPb;AA3BJ,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B,SAAS,SAAS,YAAY;AAC9B,SAAS,UAAU;AACnB,SAAS,aAAa;AAYP,SAAR,WAA4B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAU;AACR,QAAM,OAAO,QAAQ,MAAM,IAAI;AAC/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,4BAAC,SAAI,WAAU,8CACZ,kBAAQ,oBAAC,QAAK,GACjB;AAAA,QACA,oBAAC,WAAQ,SAAQ,MAAK,WAAU,WAC7B,iBACH;AAAA,QACC,eACC,oBAAC,QAAK,MAAK,MAAK,YAAW,oBAAmB,WAAU,eACrD,uBACH;AAAA,QAED,gBAAgB,YAAY,aAC3B,oBAAC,SAAI,WAAU,WACZ,qBACC,oBAAC,cAAW,IAAI,UAAW,uBAAY,IAEvC,oBAAC,UAAO,SAAQ,WAAU,SAAS,UAChC,uBACH,GAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
@@ -0,0 +1,5 @@
1
+ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './cards/card.js';
2
+ export { PostListWithFilters } from './post-list/post-list-with-filters.js';
3
+ import 'react/jsx-runtime';
4
+ import 'react';
5
+ import '../../data/posts.js';
@@ -0,0 +1,5 @@
1
+ export * from "./cards/blogpost-card.js";
2
+ export * from "./cards/card.js";
3
+ export * from "./empty-state/EmptyState.js";
4
+ export * from "./post-list/post-list-with-filters.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/blocks/index.ts"],"sourcesContent":["/**\n * Blocks index\n *\n * Please keep exports sorted alphabetically by path!\n */\n\nexport * from \"./cards/blogpost-card\";\nexport * from \"./cards/card\";\nexport * from \"./empty-state/EmptyState\";\nexport * from \"./post-list/post-list-with-filters\";\n"],"mappings":"AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type SortOption = "newest" | "oldest" | "a-z" | "z-a";
4
+ interface FilterControlsProps {
5
+ categories: string[];
6
+ authors: string[];
7
+ selectedCategories: string[];
8
+ selectedAuthors: string[];
9
+ toggleCategory: (cat: string) => void;
10
+ toggleAuthor: (author: string) => void;
11
+ clearFilters: () => void;
12
+ activeCount: number;
13
+ sortBy: SortOption;
14
+ setSortBy: (s: SortOption) => void;
15
+ hideAuthorFilter?: boolean;
16
+ }
17
+ declare function FilterControls({ categories, authors, selectedCategories, selectedAuthors, toggleCategory, toggleAuthor, clearFilters, activeCount, sortBy, setSortBy, hideAuthorFilter, }: FilterControlsProps): react_jsx_runtime.JSX.Element;
18
+
19
+ export { FilterControls };
@@ -0,0 +1,99 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Stack, Text } from "../../primitives/index.js";
4
+ import { Button } from "../../primitives/buttons/button.js";
5
+ import {
6
+ Select,
7
+ SelectContent,
8
+ SelectItem,
9
+ SelectTrigger,
10
+ SelectValue
11
+ } from "../../primitives/forms/select.js";
12
+ function FilterControls({
13
+ categories,
14
+ authors,
15
+ selectedCategories,
16
+ selectedAuthors,
17
+ toggleCategory,
18
+ toggleAuthor,
19
+ clearFilters,
20
+ activeCount,
21
+ sortBy,
22
+ setSortBy,
23
+ hideAuthorFilter
24
+ }) {
25
+ return /* @__PURE__ */ jsxs(Stack, { gap: 5, alignItems: "start", children: [
26
+ /* @__PURE__ */ jsxs("div", { children: [
27
+ /* @__PURE__ */ jsx(Text, { size: "sm", fontweight: "medium", className: "sg:mb-2", children: "Categories" }),
28
+ /* @__PURE__ */ jsx(Stack, { direction: "row", wrap: "wrap", gap: 2, children: categories.map((cat) => {
29
+ const isSelected = selectedCategories.includes(cat);
30
+ return /* @__PURE__ */ jsx(
31
+ Button,
32
+ {
33
+ variant: isSelected ? "default" : "outline",
34
+ size: "xs",
35
+ onClick: () => toggleCategory(cat),
36
+ children: cat
37
+ },
38
+ cat
39
+ );
40
+ }) })
41
+ ] }),
42
+ !hideAuthorFilter && authors.length > 1 && /* @__PURE__ */ jsxs("div", { children: [
43
+ /* @__PURE__ */ jsx(Text, { size: "sm", fontweight: "medium", className: "sg:mb-2", children: "Authors" }),
44
+ /* @__PURE__ */ jsx(Stack, { direction: "row", wrap: "wrap", gap: 2, children: authors.map((author) => {
45
+ const isSelected = selectedAuthors.includes(author);
46
+ return /* @__PURE__ */ jsx(
47
+ Button,
48
+ {
49
+ variant: isSelected ? "default" : "outline",
50
+ size: "xs",
51
+ onClick: () => toggleAuthor(author),
52
+ children: author
53
+ },
54
+ author
55
+ );
56
+ }) })
57
+ ] }),
58
+ /* @__PURE__ */ jsxs("div", { children: [
59
+ /* @__PURE__ */ jsx(
60
+ Text,
61
+ {
62
+ id: "sortby_dropdown",
63
+ size: "sm",
64
+ fontweight: "medium",
65
+ className: "sg:mb-2",
66
+ children: "Sort by"
67
+ }
68
+ ),
69
+ /* @__PURE__ */ jsxs(
70
+ Select,
71
+ {
72
+ value: sortBy,
73
+ onValueChange: (v) => setSortBy(v),
74
+ children: [
75
+ /* @__PURE__ */ jsx(
76
+ SelectTrigger,
77
+ {
78
+ className: "sg:w-full",
79
+ "aria-labelledby": "sortby_dropdown",
80
+ children: /* @__PURE__ */ jsx(SelectValue, {})
81
+ }
82
+ ),
83
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
84
+ /* @__PURE__ */ jsx(SelectItem, { value: "newest", children: "Newest first" }),
85
+ /* @__PURE__ */ jsx(SelectItem, { value: "oldest", children: "Oldest first" }),
86
+ /* @__PURE__ */ jsx(SelectItem, { value: "a-z", children: "Title A\u2013Z" }),
87
+ /* @__PURE__ */ jsx(SelectItem, { value: "z-a", children: "Title Z\u2013A" })
88
+ ] })
89
+ ]
90
+ }
91
+ )
92
+ ] }),
93
+ activeCount > 0 && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "xs", onClick: clearFilters, iconStart: "X", children: "Clear all filters" })
94
+ ] });
95
+ }
96
+ export {
97
+ FilterControls
98
+ };
99
+ //# sourceMappingURL=post-filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/blocks/post-list/post-filters.tsx"],"sourcesContent":["\"use client\";\nimport { Stack, Text } from \"../../primitives/index\";\nimport { Button } from \"../../primitives/buttons/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../primitives/forms/select\";\n\ntype SortOption = \"newest\" | \"oldest\" | \"a-z\" | \"z-a\";\n\ninterface FilterControlsProps {\n categories: string[];\n authors: string[];\n selectedCategories: string[];\n selectedAuthors: string[];\n toggleCategory: (cat: string) => void;\n toggleAuthor: (author: string) => void;\n clearFilters: () => void;\n activeCount: number;\n sortBy: SortOption;\n setSortBy: (s: SortOption) => void;\n hideAuthorFilter?: boolean;\n}\n\nexport function FilterControls({\n categories,\n authors,\n selectedCategories,\n selectedAuthors,\n toggleCategory,\n toggleAuthor,\n clearFilters,\n activeCount,\n sortBy,\n setSortBy,\n hideAuthorFilter,\n}: FilterControlsProps) {\n return (\n <Stack gap={5} alignItems=\"start\">\n <div>\n <Text size=\"sm\" fontweight=\"medium\" className=\"sg:mb-2\">\n Categories\n </Text>\n <Stack direction=\"row\" wrap=\"wrap\" gap={2}>\n {categories.map((cat) => {\n const isSelected = selectedCategories.includes(cat);\n return (\n <Button\n key={cat}\n variant={isSelected ? \"default\" : \"outline\"}\n size=\"xs\"\n onClick={() => toggleCategory(cat)}\n >\n {cat}\n </Button>\n );\n })}\n </Stack>\n </div>\n {!hideAuthorFilter && authors.length > 1 && (\n <div>\n <Text size=\"sm\" fontweight=\"medium\" className=\"sg:mb-2\">\n Authors\n </Text>\n <Stack direction=\"row\" wrap=\"wrap\" gap={2}>\n {authors.map((author) => {\n const isSelected = selectedAuthors.includes(author);\n return (\n <Button\n key={author}\n variant={isSelected ? \"default\" : \"outline\"}\n size=\"xs\"\n onClick={() => toggleAuthor(author)}\n >\n {author}\n </Button>\n );\n })}\n </Stack>\n </div>\n )}\n <div>\n <Text\n id=\"sortby_dropdown\"\n size=\"sm\"\n fontweight=\"medium\"\n className=\"sg:mb-2\"\n >\n Sort by\n </Text>\n <Select\n value={sortBy}\n onValueChange={(v) => setSortBy(v as SortOption)}\n >\n <SelectTrigger\n className=\"sg:w-full\"\n aria-labelledby=\"sortby_dropdown\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"newest\">Newest first</SelectItem>\n <SelectItem value=\"oldest\">Oldest first</SelectItem>\n <SelectItem value=\"a-z\">Title A–Z</SelectItem>\n <SelectItem value=\"z-a\">Title Z–A</SelectItem>\n </SelectContent>\n </Select>\n </div>\n {activeCount > 0 && (\n <Button variant=\"ghost\" size=\"xs\" onClick={clearFilters} iconStart=\"X\">\n Clear all filters\n </Button>\n )}\n </Stack>\n );\n}\n"],"mappings":";AA0CM,SACE,KADF;AAzCN,SAAS,OAAO,YAAY;AAC5B,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkBA,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,SACE,qBAAC,SAAM,KAAK,GAAG,YAAW,SACxB;AAAA,yBAAC,SACC;AAAA,0BAAC,QAAK,MAAK,MAAK,YAAW,UAAS,WAAU,WAAU,wBAExD;AAAA,MACA,oBAAC,SAAM,WAAU,OAAM,MAAK,QAAO,KAAK,GACrC,qBAAW,IAAI,CAAC,QAAQ;AACvB,cAAM,aAAa,mBAAmB,SAAS,GAAG;AAClD,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,aAAa,YAAY;AAAA,YAClC,MAAK;AAAA,YACL,SAAS,MAAM,eAAe,GAAG;AAAA,YAEhC;AAAA;AAAA,UALI;AAAA,QAMP;AAAA,MAEJ,CAAC,GACH;AAAA,OACF;AAAA,IACC,CAAC,oBAAoB,QAAQ,SAAS,KACrC,qBAAC,SACC;AAAA,0BAAC,QAAK,MAAK,MAAK,YAAW,UAAS,WAAU,WAAU,qBAExD;AAAA,MACA,oBAAC,SAAM,WAAU,OAAM,MAAK,QAAO,KAAK,GACrC,kBAAQ,IAAI,CAAC,WAAW;AACvB,cAAM,aAAa,gBAAgB,SAAS,MAAM;AAClD,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,aAAa,YAAY;AAAA,YAClC,MAAK;AAAA,YACL,SAAS,MAAM,aAAa,MAAM;AAAA,YAEjC;AAAA;AAAA,UALI;AAAA,QAMP;AAAA,MAEJ,CAAC,GACH;AAAA,OACF;AAAA,IAEF,qBAAC,SACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,MAAK;AAAA,UACL,YAAW;AAAA,UACX,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,eAAe,CAAC,MAAM,UAAU,CAAe;AAAA,UAE/C;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,mBAAgB;AAAA,gBAEhB,8BAAC,eAAY;AAAA;AAAA,YACf;AAAA,YACA,qBAAC,iBACC;AAAA,kCAAC,cAAW,OAAM,UAAS,0BAAY;AAAA,cACvC,oBAAC,cAAW,OAAM,UAAS,0BAAY;AAAA,cACvC,oBAAC,cAAW,OAAM,OAAM,4BAAS;AAAA,cACjC,oBAAC,cAAW,OAAM,OAAM,4BAAS;AAAA,eACnC;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IACC,cAAc,KACb,oBAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,SAAS,cAAc,WAAU,KAAI,+BAEvE;AAAA,KAEJ;AAEJ;","names":[]}
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { BlogPost } from '../../../data/posts.js';
3
+
4
+ type LoadMode = "pagination" | "load-more";
5
+ type FilterMode = "sidebar" | "drawer";
6
+ interface PostListWithFiltersProps {
7
+ posts: BlogPost[];
8
+ /** Hide the search bar */
9
+ hideSearch?: boolean;
10
+ /** Hide the author filter badges */
11
+ hideAuthorFilter?: boolean;
12
+ /** "sidebar" = inline on desktop, sheet on mobile (default). "drawer" = always behind a button/sheet. */
13
+ filterMode?: FilterMode;
14
+ /** Default load mode. "load-more" (default) or "pagination". User can still toggle. */
15
+ defaultLoadMode?: LoadMode;
16
+ }
17
+ declare function PostListWithFilters({ posts: sourcePosts, hideSearch, hideAuthorFilter, filterMode, defaultLoadMode, }: PostListWithFiltersProps): react_jsx_runtime.JSX.Element;
18
+
19
+ export { PostListWithFilters };