@burdenoff/microfe-comradecircle 2026.827.1 → 2026.830.1

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 (74) hide show
  1. package/dist/comradecircle/components/AvatarUploadField.js +8 -8
  2. package/dist/comradecircle/components/CircleCard.js +4 -4
  3. package/dist/comradecircle/components/CommentThread.d.ts.map +1 -1
  4. package/dist/comradecircle/components/CommentThread.js +66 -61
  5. package/dist/comradecircle/components/CommentThread.js.map +1 -1
  6. package/dist/comradecircle/components/CreateCircleDialog.d.ts.map +1 -1
  7. package/dist/comradecircle/components/CreateCircleDialog.js +89 -88
  8. package/dist/comradecircle/components/CreateCircleDialog.js.map +1 -1
  9. package/dist/comradecircle/components/CreateEventDialog.d.ts.map +1 -1
  10. package/dist/comradecircle/components/CreateEventDialog.js +28 -27
  11. package/dist/comradecircle/components/CreateEventDialog.js.map +1 -1
  12. package/dist/comradecircle/components/DraftsPanel.js +13 -13
  13. package/dist/comradecircle/components/EventCard.js +5 -5
  14. package/dist/comradecircle/components/FileImage.js +5 -5
  15. package/dist/comradecircle/components/ImageAttachments.js +21 -21
  16. package/dist/comradecircle/components/MemberIdentity.js +4 -4
  17. package/dist/comradecircle/components/MobileBottomNav.d.ts.map +1 -1
  18. package/dist/comradecircle/components/MobileBottomNav.js +37 -30
  19. package/dist/comradecircle/components/MobileBottomNav.js.map +1 -1
  20. package/dist/comradecircle/components/Pagination.d.ts.map +1 -1
  21. package/dist/comradecircle/components/Pagination.js +37 -28
  22. package/dist/comradecircle/components/Pagination.js.map +1 -1
  23. package/dist/comradecircle/components/PollCard.js +13 -13
  24. package/dist/comradecircle/components/PostCard.d.ts.map +1 -1
  25. package/dist/comradecircle/components/PostCard.js +102 -89
  26. package/dist/comradecircle/components/PostCard.js.map +1 -1
  27. package/dist/comradecircle/components/PostComposer.js +4 -4
  28. package/dist/comradecircle/components/ReactionBar.d.ts.map +1 -1
  29. package/dist/comradecircle/components/ReactionBar.js +65 -55
  30. package/dist/comradecircle/components/ReactionBar.js.map +1 -1
  31. package/dist/comradecircle/components/StateViews.d.ts.map +1 -1
  32. package/dist/comradecircle/components/StateViews.js +38 -30
  33. package/dist/comradecircle/components/StateViews.js.map +1 -1
  34. package/dist/comradecircle/components/UpcomingEvents.js +17 -17
  35. package/dist/comradecircle/hooks/index.d.ts +1 -0
  36. package/dist/comradecircle/hooks/index.d.ts.map +1 -1
  37. package/dist/comradecircle/hooks/index.js +1 -0
  38. package/dist/comradecircle/hooks/useTr.d.ts +18 -0
  39. package/dist/comradecircle/hooks/useTr.d.ts.map +1 -0
  40. package/dist/comradecircle/hooks/useTr.js +12 -0
  41. package/dist/comradecircle/hooks/useTr.js.map +1 -0
  42. package/dist/comradecircle/pages/FeedPage.d.ts.map +1 -1
  43. package/dist/comradecircle/pages/FeedPage.js +75 -62
  44. package/dist/comradecircle/pages/FeedPage.js.map +1 -1
  45. package/dist/comradecircle/pages/circles/CircleDetailPage.d.ts.map +1 -1
  46. package/dist/comradecircle/pages/circles/CircleDetailPage.js +439 -401
  47. package/dist/comradecircle/pages/circles/CircleDetailPage.js.map +1 -1
  48. package/dist/comradecircle/pages/circles/CirclesPage.d.ts.map +1 -1
  49. package/dist/comradecircle/pages/circles/CirclesPage.js +124 -117
  50. package/dist/comradecircle/pages/circles/CirclesPage.js.map +1 -1
  51. package/dist/comradecircle/pages/events/EventDetailPage.d.ts.map +1 -1
  52. package/dist/comradecircle/pages/events/EventDetailPage.js +182 -153
  53. package/dist/comradecircle/pages/events/EventDetailPage.js.map +1 -1
  54. package/dist/comradecircle/pages/events/EventsPage.d.ts.map +1 -1
  55. package/dist/comradecircle/pages/events/EventsPage.js +100 -91
  56. package/dist/comradecircle/pages/events/EventsPage.js.map +1 -1
  57. package/dist/comradecircle/pages/members/MemberProfilePage.d.ts.map +1 -1
  58. package/dist/comradecircle/pages/members/MemberProfilePage.js +172 -159
  59. package/dist/comradecircle/pages/members/MemberProfilePage.js.map +1 -1
  60. package/dist/comradecircle/pages/members/MembersPage.d.ts.map +1 -1
  61. package/dist/comradecircle/pages/members/MembersPage.js +103 -104
  62. package/dist/comradecircle/pages/members/MembersPage.js.map +1 -1
  63. package/dist/comradecircle/pages/monetization/MonetizationPage.d.ts.map +1 -1
  64. package/dist/comradecircle/pages/monetization/MonetizationPage.js +319 -297
  65. package/dist/comradecircle/pages/monetization/MonetizationPage.js.map +1 -1
  66. package/dist/comradecircle/pages/posts/PostThreadPage.d.ts.map +1 -1
  67. package/dist/comradecircle/pages/posts/PostThreadPage.js +37 -32
  68. package/dist/comradecircle/pages/posts/PostThreadPage.js.map +1 -1
  69. package/dist/comradecircle/pages/profile/MyProfilePage.d.ts.map +1 -1
  70. package/dist/comradecircle/pages/profile/MyProfilePage.js +182 -177
  71. package/dist/comradecircle/pages/profile/MyProfilePage.js.map +1 -1
  72. package/dist/comradecircle/utils/i18n.js +15 -0
  73. package/dist/comradecircle/utils/i18n.js.map +1 -0
  74. package/package.json +1 -1
@@ -1,19 +1,20 @@
1
1
  import { useComradeCircle as e } from "../context/ComradeCircleContext.js";
2
2
  import "../context/index.js";
3
- import { PageLayout as t } from "../components/PageLayout.js";
4
- import { useComMyFeed as n } from "../hooks/useComradeCircleApi.js";
5
- import { useCursorPager as r } from "../hooks/useCursorPager.js";
3
+ import { useComMyFeed as t } from "../hooks/useComradeCircleApi.js";
4
+ import { useCursorPager as n } from "../hooks/useCursorPager.js";
5
+ import { useTr as r } from "../hooks/useTr.js";
6
6
  import "../hooks/index.js";
7
- import { PostCard as i } from "../components/PostCard.js";
8
- import { UpcomingEvents as a } from "../components/UpcomingEvents.js";
9
- import { EmptyState as o } from "../components/EmptyState.js";
10
- import { ErrorView as s } from "../components/StateViews.js";
11
- import { Pagination as c } from "../components/Pagination.js";
12
- import { Compass as l, Newspaper as u, UsersRound as d } from "lucide-react";
13
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
14
- import { Button as m, GlassCard as h, Skeleton as g } from "@burdenoff/fe-libs/ui";
7
+ import { PageLayout as i } from "../components/PageLayout.js";
8
+ import { PostCard as a } from "../components/PostCard.js";
9
+ import { UpcomingEvents as o } from "../components/UpcomingEvents.js";
10
+ import { EmptyState as s } from "../components/EmptyState.js";
11
+ import { ErrorView as c } from "../components/StateViews.js";
12
+ import { Pagination as l } from "../components/Pagination.js";
13
+ import { Compass as u, Newspaper as d, UsersRound as f } from "lucide-react";
14
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
15
+ import { Button as h, GlassCard as g, Skeleton as _ } from "@burdenoff/fe-libs/ui";
15
16
  //#region src/comradecircle/pages/FeedPage.tsx
16
- var _ = 20, v = "motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in-from-bottom-3 motion-safe:duration-500 motion-safe:ease-out motion-safe:fill-mode-both", y = [
17
+ var v = 20, y = "motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in-from-bottom-3 motion-safe:duration-500 motion-safe:ease-out motion-safe:fill-mode-both", b = [
17
18
  ["w-11/12", "w-3/4"],
18
19
  [
19
20
  "w-full",
@@ -22,91 +23,103 @@ var _ = 20, v = "motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in
22
23
  ],
23
24
  ["w-5/6", "w-1/2"]
24
25
  ];
25
- function b() {
26
- return /* @__PURE__ */ f("div", {
26
+ function x() {
27
+ return /* @__PURE__ */ p("div", {
27
28
  className: "mx-auto flex max-w-2xl flex-col gap-4",
28
29
  "aria-hidden": "true",
29
- children: y.map((e, t) => /* @__PURE__ */ p(h, {
30
+ children: b.map((e, t) => /* @__PURE__ */ m(g, {
30
31
  treatment: "plain",
31
32
  className: "p-4",
32
33
  children: [
33
- /* @__PURE__ */ p("div", {
34
+ /* @__PURE__ */ m("div", {
34
35
  className: "flex items-start gap-3",
35
- children: [/* @__PURE__ */ f(g, { className: "h-10 w-10 shrink-0 rounded-full" }), /* @__PURE__ */ p("div", {
36
+ children: [/* @__PURE__ */ p(_, { className: "h-10 w-10 shrink-0 rounded-full" }), /* @__PURE__ */ m("div", {
36
37
  className: "flex-1 space-y-2 pt-1",
37
- children: [/* @__PURE__ */ f(g, { className: "h-3.5 w-32" }), /* @__PURE__ */ f(g, { className: "h-3 w-20" })]
38
+ children: [/* @__PURE__ */ p(_, { className: "h-3.5 w-32" }), /* @__PURE__ */ p(_, { className: "h-3 w-20" })]
38
39
  })]
39
40
  }),
40
- /* @__PURE__ */ f("div", {
41
+ /* @__PURE__ */ p("div", {
41
42
  className: "mt-4 space-y-2.5",
42
- children: e.map((e, t) => /* @__PURE__ */ f(g, { className: `h-3 ${e}` }, t))
43
+ children: e.map((e, t) => /* @__PURE__ */ p(_, { className: `h-3 ${e}` }, t))
43
44
  }),
44
- /* @__PURE__ */ p("div", {
45
+ /* @__PURE__ */ m("div", {
45
46
  className: "mt-4 flex items-center justify-between gap-3 border-t border-border-seam pt-3",
46
- children: [/* @__PURE__ */ p("div", {
47
+ children: [/* @__PURE__ */ m("div", {
47
48
  className: "flex items-center gap-2",
48
49
  children: [
49
- /* @__PURE__ */ f(g, { className: "h-7 w-14 rounded-full" }),
50
- /* @__PURE__ */ f(g, { className: "h-7 w-14 rounded-full" }),
51
- /* @__PURE__ */ f(g, { className: "h-7 w-14 rounded-full" })
50
+ /* @__PURE__ */ p(_, { className: "h-7 w-14 rounded-full" }),
51
+ /* @__PURE__ */ p(_, { className: "h-7 w-14 rounded-full" }),
52
+ /* @__PURE__ */ p(_, { className: "h-7 w-14 rounded-full" })
52
53
  ]
53
- }), /* @__PURE__ */ f(g, { className: "h-7 w-24 rounded-full" })]
54
+ }), /* @__PURE__ */ p(_, { className: "h-7 w-24 rounded-full" })]
54
55
  })
55
56
  ]
56
57
  }, t))
57
58
  });
58
59
  }
59
- function x() {
60
- let { navigateTo: h } = e(), g = r(), { data: y, isLoading: x, isError: S, refetch: C } = n({
61
- limit: _,
62
- cursor: g.cursor
63
- }), w = y?.items ?? [];
64
- return /* @__PURE__ */ p(t, {
65
- title: "Home",
60
+ function S() {
61
+ let { navigateTo: g } = e(), _ = n(), b = r(), { data: S, isLoading: C, isError: w, refetch: T } = t({
62
+ limit: v,
63
+ cursor: _.cursor
64
+ }), E = S?.items ?? [];
65
+ return /* @__PURE__ */ m(i, {
66
+ title: b("comradecircle.pages.feed.title", "Home"),
66
67
  titleGradient: !0,
67
68
  aurora: !0,
68
- description: "Posts from the circles, channels, and members you follow — newest first.",
69
- actions: /* @__PURE__ */ p(m, {
69
+ description: b("comradecircle.pages.feed.description", "Posts from the circles, channels, and members you follow — newest first."),
70
+ actions: /* @__PURE__ */ m(h, {
70
71
  variant: "outline",
71
- onClick: () => h("circles"),
72
- children: [/* @__PURE__ */ f(l, { className: "mr-1.5 h-4 w-4" }), " Discover circles"]
72
+ onClick: () => g("circles"),
73
+ children: [
74
+ /* @__PURE__ */ p(u, { className: "mr-1.5 h-4 w-4" }),
75
+ " ",
76
+ b("comradecircle.pages.feed.discoverCircles", "Discover circles")
77
+ ]
73
78
  }),
74
- children: [/* @__PURE__ */ f(a, { className: "mb-5" }), x ? /* @__PURE__ */ f(b, {}) : S ? /* @__PURE__ */ f(s, {
75
- message: "We couldn't load your feed.",
76
- onRetry: () => C()
77
- }) : w.length === 0 && g.page === 0 ? /* @__PURE__ */ f(o, {
79
+ children: [/* @__PURE__ */ p(o, { className: "mb-5" }), C ? /* @__PURE__ */ p(x, {}) : w ? /* @__PURE__ */ p(c, {
80
+ message: b("comradecircle.pages.feed.errorMessage", "We couldn't load your feed."),
81
+ onRetry: () => T()
82
+ }) : E.length === 0 && _.page === 0 ? /* @__PURE__ */ p(s, {
78
83
  illustration: "empty-notifications",
79
- icon: /* @__PURE__ */ f(u, { className: "h-10 w-10" }),
80
- title: "Your feed is quiet",
81
- description: "Follow circles and members to fill your home feed with their latest posts, events, and discussions.",
82
- action: /* @__PURE__ */ p("div", {
84
+ icon: /* @__PURE__ */ p(d, { className: "h-10 w-10" }),
85
+ title: b("comradecircle.pages.feed.emptyTitle", "Your feed is quiet"),
86
+ description: b("comradecircle.pages.feed.emptyDescription", "Follow circles and members to fill your home feed with their latest posts, events, and discussions."),
87
+ action: /* @__PURE__ */ m("div", {
83
88
  className: "flex flex-wrap items-center justify-center gap-3",
84
- children: [/* @__PURE__ */ p(m, {
85
- onClick: () => h("circles"),
86
- children: [/* @__PURE__ */ f(l, { className: "mr-1.5 h-4 w-4" }), " Explore circles"]
87
- }), /* @__PURE__ */ p(m, {
89
+ children: [/* @__PURE__ */ m(h, {
90
+ onClick: () => g("circles"),
91
+ children: [
92
+ /* @__PURE__ */ p(u, { className: "mr-1.5 h-4 w-4" }),
93
+ " ",
94
+ b("comradecircle.pages.feed.exploreCircles", "Explore circles")
95
+ ]
96
+ }), /* @__PURE__ */ m(h, {
88
97
  variant: "outline",
89
- onClick: () => h("members"),
90
- children: [/* @__PURE__ */ f(d, { className: "mr-1.5 h-4 w-4" }), " Find members"]
98
+ onClick: () => g("members"),
99
+ children: [
100
+ /* @__PURE__ */ p(f, { className: "mr-1.5 h-4 w-4" }),
101
+ " ",
102
+ b("comradecircle.pages.feed.findMembers", "Find members")
103
+ ]
91
104
  })]
92
105
  })
93
- }) : /* @__PURE__ */ p("div", {
106
+ }) : /* @__PURE__ */ m("div", {
94
107
  className: "mx-auto flex max-w-2xl flex-col gap-4",
95
- children: [w.map((e, t) => /* @__PURE__ */ f("div", {
96
- className: v,
108
+ children: [E.map((e, t) => /* @__PURE__ */ p("div", {
109
+ className: y,
97
110
  style: { animationDelay: `${Math.min(t, 8) * 70}ms` },
98
- children: /* @__PURE__ */ f(i, { post: e })
99
- }, e.id)), /* @__PURE__ */ f(c, {
100
- page: g.page,
101
- pageSize: _,
102
- itemCount: w.length,
103
- hasMore: y?.pageInfo.hasMore ?? !1,
104
- onPageChange: (e) => g.onPageChange(e, y?.pageInfo.cursor)
111
+ children: /* @__PURE__ */ p(a, { post: e })
112
+ }, e.id)), /* @__PURE__ */ p(l, {
113
+ page: _.page,
114
+ pageSize: v,
115
+ itemCount: E.length,
116
+ hasMore: S?.pageInfo.hasMore ?? !1,
117
+ onPageChange: (e) => _.onPageChange(e, S?.pageInfo.cursor)
105
118
  })]
106
119
  })]
107
120
  });
108
121
  }
109
122
  //#endregion
110
- export { x as FeedPage };
123
+ export { S as FeedPage };
111
124
 
112
125
  //# sourceMappingURL=FeedPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedPage.js","names":[],"sources":["../../../src/comradecircle/pages/FeedPage.tsx"],"sourcesContent":["/**\n * FeedPage — the member's unified home feed.\n * @module comradecircle/pages\n *\n * Reads `comMyFeed` (published posts from every channel, member, and circle the\n * caller follows, newest first). A new member with no follows sees a guided\n * empty state pointing at circle & member discovery.\n *\n * Above the post column sits {@link UpcomingEvents} — the mobile home mock\n * shows the home surface carrying the member's next gathering (with an RSVP\n * affordance), not posts alone. It is a separate `comListEvents` read because\n * `comMyFeed` returns `ComPost` rows only.\n */\n\nimport { Newspaper, Compass, UsersRound } from 'lucide-react';\nimport { Button, GlassCard, Skeleton } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { PostCard } from '../components/PostCard';\nimport { UpcomingEvents } from '../components/UpcomingEvents';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorView } from '../components/StateViews';\nimport { Pagination } from '../components/Pagination';\nimport { useComMyFeed, useCursorPager } from '../hooks';\nimport { useComradeCircle } from '../context';\n\nconst PAGE_SIZE = 20;\n\n/**\n * Motion for each post as the feed 'assembles' on arrival. Fully neutralised\n * under `prefers-reduced-motion` (every class is `motion-safe:`); `fill-mode-both`\n * holds the hidden start state through the per-card `animationDelay`.\n */\nconst POST_ENTER =\n 'motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in-from-bottom-3 ' +\n 'motion-safe:duration-500 motion-safe:ease-out motion-safe:fill-mode-both';\n\n/** Widths that give each skeleton post a natural, non-uniform body. */\nconst SKELETON_LINES = [\n ['w-11/12', 'w-3/4'],\n ['w-full', 'w-10/12', 'w-2/3'],\n ['w-5/6', 'w-1/2'],\n] as const;\n\n/**\n * A stack of post-card-shaped skeletons that mirrors the final feed layout, so\n * the transition from loading → loaded doesn't shift the column.\n */\nfunction FeedSkeleton() {\n return (\n <div className=\"mx-auto flex max-w-2xl flex-col gap-4\" aria-hidden=\"true\">\n {SKELETON_LINES.map((lines, i) => (\n <GlassCard key={i} treatment=\"plain\" className=\"p-4\">\n <div className=\"flex items-start gap-3\">\n <Skeleton className=\"h-10 w-10 shrink-0 rounded-full\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <Skeleton className=\"h-3.5 w-32\" />\n <Skeleton className=\"h-3 w-20\" />\n </div>\n </div>\n <div className=\"mt-4 space-y-2.5\">\n {lines.map((w, j) => (\n <Skeleton key={j} className={`h-3 ${w}`} />\n ))}\n </div>\n <div className=\"mt-4 flex items-center justify-between gap-3 border-t border-border-seam pt-3\">\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-7 w-14 rounded-full\" />\n <Skeleton className=\"h-7 w-14 rounded-full\" />\n <Skeleton className=\"h-7 w-14 rounded-full\" />\n </div>\n <Skeleton className=\"h-7 w-24 rounded-full\" />\n </div>\n </GlassCard>\n ))}\n </div>\n );\n}\n\nexport function FeedPage() {\n const { navigateTo } = useComradeCircle();\n const pager = useCursorPager();\n const { data, isLoading, isError, refetch } = useComMyFeed({\n limit: PAGE_SIZE,\n cursor: pager.cursor,\n });\n\n const posts = data?.items ?? [];\n\n return (\n <PageLayout\n title=\"Home\"\n titleGradient\n aurora\n description=\"Posts from the circles, channels, and members you follow — newest first.\"\n actions={\n <Button variant=\"outline\" onClick={() => navigateTo('circles')}>\n <Compass className=\"mr-1.5 h-4 w-4\" /> Discover circles\n </Button>\n }\n >\n <UpcomingEvents className=\"mb-5\" />\n\n {isLoading ? (\n <FeedSkeleton />\n ) : isError ? (\n <ErrorView message=\"We couldn't load your feed.\" onRetry={() => refetch()} />\n ) : posts.length === 0 && pager.page === 0 ? (\n <EmptyState\n illustration=\"empty-notifications\"\n icon={<Newspaper className=\"h-10 w-10\" />}\n title=\"Your feed is quiet\"\n description=\"Follow circles and members to fill your home feed with their latest posts, events, and discussions.\"\n action={\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <Button onClick={() => navigateTo('circles')}>\n <Compass className=\"mr-1.5 h-4 w-4\" /> Explore circles\n </Button>\n <Button variant=\"outline\" onClick={() => navigateTo('members')}>\n <UsersRound className=\"mr-1.5 h-4 w-4\" /> Find members\n </Button>\n </div>\n }\n />\n ) : (\n <div className=\"mx-auto flex max-w-2xl flex-col gap-4\">\n {posts.map((post, index) => (\n <div\n key={post.id}\n className={POST_ENTER}\n style={{ animationDelay: `${Math.min(index, 8) * 70}ms` }}\n >\n <PostCard post={post} />\n </div>\n ))}\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={posts.length}\n hasMore={data?.pageInfo.hasMore ?? false}\n onPageChange={(target) => pager.onPageChange(target, data?.pageInfo.cursor)}\n />\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,IAAM,IAAY,IAOZ,IACJ,0JAII,IAAiB;CACrB,CAAC,WAAW,OAAO;CACnB;EAAC;EAAU;EAAW;CAAO;CAC7B,CAAC,SAAS,OAAO;AACnB;AAMA,SAAS,IAAe;CACtB,OACE,kBAAC,OAAD;EAAK,WAAU;EAAwC,eAAY;YAChE,EAAe,KAAK,GAAO,MAC1B,kBAAC,GAAD;GAAmB,WAAU;GAAQ,WAAU;aAA/C;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAU,WAAU,kCAAmC,CAAA,GACvD,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA,GAClC,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,CAC7B;OACF;;IACL,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAM,KAAK,GAAG,MACb,kBAAC,GAAD,EAAkB,WAAW,OAAO,IAAM,GAA3B,CAA2B,CAC3C;IACE,CAAA;IACL,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;OAC7C,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;OAC7C,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;MAC1C;SACL,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA,CAC1C;;GACI;KArBK,CAqBL,CACZ;CACE,CAAA;AAET;AAEA,SAAgB,IAAW;CACzB,IAAM,EAAE,kBAAe,EAAiB,GAClC,IAAQ,EAAe,GACvB,EAAE,SAAM,cAAW,YAAS,eAAY,EAAa;EACzD,OAAO;EACP,QAAQ,EAAM;CAChB,CAAC,GAEK,IAAQ,GAAM,SAAS,CAAC;CAE9B,OACE,kBAAC,GAAD;EACE,OAAM;EACN,eAAA;EACA,QAAA;EACA,aAAY;EACZ,SACE,kBAAC,GAAD;GAAQ,SAAQ;GAAU,eAAe,EAAW,SAAS;aAA7D,CACE,kBAAC,GAAD,EAAS,WAAU,iBAAkB,CAAA,GAAC,mBAChC;;YARZ,CAWE,kBAAC,GAAD,EAAgB,WAAU,OAAQ,CAAA,GAEjC,IACC,kBAAC,GAAD,CAAe,CAAA,IACb,IACF,kBAAC,GAAD;GAAW,SAAQ;GAA8B,eAAe,EAAQ;EAAI,CAAA,IAC1E,EAAM,WAAW,KAAK,EAAM,SAAS,IACvC,kBAAC,GAAD;GACE,cAAa;GACb,MAAM,kBAAC,GAAD,EAAW,WAAU,YAAa,CAAA;GACxC,OAAM;GACN,aAAY;GACZ,QACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,eAAe,EAAW,SAAS;eAA3C,CACE,kBAAC,GAAD,EAAS,WAAU,iBAAkB,CAAA,GAAC,kBAChC;QACR,kBAAC,GAAD;KAAQ,SAAQ;KAAU,eAAe,EAAW,SAAS;eAA7D,CACE,kBAAC,GAAD,EAAY,WAAU,iBAAkB,CAAA,GAAC,eACnC;MACL;;EAER,CAAA,IAED,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAM,KAAK,GAAM,MAChB,kBAAC,OAAD;IAEE,WAAW;IACX,OAAO,EAAE,gBAAgB,GAAG,KAAK,IAAI,GAAO,CAAC,IAAI,GAAG,IAAI;cAExD,kBAAC,GAAD,EAAgB,QAAO,CAAA;GACpB,GALE,EAAK,EAKP,CACN,GACD,kBAAC,GAAD;IACE,MAAM,EAAM;IACZ,UAAU;IACV,WAAW,EAAM;IACjB,SAAS,GAAM,SAAS,WAAW;IACnC,eAAe,MAAW,EAAM,aAAa,GAAQ,GAAM,SAAS,MAAM;GAC3E,CAAA,CACE;IAEG;;AAEhB"}
1
+ {"version":3,"file":"FeedPage.js","names":[],"sources":["../../../src/comradecircle/pages/FeedPage.tsx"],"sourcesContent":["/**\n * FeedPage — the member's unified home feed.\n * @module comradecircle/pages\n *\n * Reads `comMyFeed` (published posts from every channel, member, and circle the\n * caller follows, newest first). A new member with no follows sees a guided\n * empty state pointing at circle & member discovery.\n *\n * Above the post column sits {@link UpcomingEvents} — the mobile home mock\n * shows the home surface carrying the member's next gathering (with an RSVP\n * affordance), not posts alone. It is a separate `comListEvents` read because\n * `comMyFeed` returns `ComPost` rows only.\n */\n\nimport { Newspaper, Compass, UsersRound } from 'lucide-react';\nimport { Button, GlassCard, Skeleton } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { PostCard } from '../components/PostCard';\nimport { UpcomingEvents } from '../components/UpcomingEvents';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorView } from '../components/StateViews';\nimport { Pagination } from '../components/Pagination';\nimport { useComMyFeed, useCursorPager, useTr } from '../hooks';\nimport { useComradeCircle } from '../context';\n\nconst PAGE_SIZE = 20;\n\n/**\n * Motion for each post as the feed 'assembles' on arrival. Fully neutralised\n * under `prefers-reduced-motion` (every class is `motion-safe:`); `fill-mode-both`\n * holds the hidden start state through the per-card `animationDelay`.\n */\nconst POST_ENTER =\n 'motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in-from-bottom-3 ' +\n 'motion-safe:duration-500 motion-safe:ease-out motion-safe:fill-mode-both';\n\n/** Widths that give each skeleton post a natural, non-uniform body. */\nconst SKELETON_LINES = [\n ['w-11/12', 'w-3/4'],\n ['w-full', 'w-10/12', 'w-2/3'],\n ['w-5/6', 'w-1/2'],\n] as const;\n\n/**\n * A stack of post-card-shaped skeletons that mirrors the final feed layout, so\n * the transition from loading → loaded doesn't shift the column.\n */\nfunction FeedSkeleton() {\n return (\n <div className=\"mx-auto flex max-w-2xl flex-col gap-4\" aria-hidden=\"true\">\n {SKELETON_LINES.map((lines, i) => (\n <GlassCard key={i} treatment=\"plain\" className=\"p-4\">\n <div className=\"flex items-start gap-3\">\n <Skeleton className=\"h-10 w-10 shrink-0 rounded-full\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <Skeleton className=\"h-3.5 w-32\" />\n <Skeleton className=\"h-3 w-20\" />\n </div>\n </div>\n <div className=\"mt-4 space-y-2.5\">\n {lines.map((w, j) => (\n <Skeleton key={j} className={`h-3 ${w}`} />\n ))}\n </div>\n <div className=\"mt-4 flex items-center justify-between gap-3 border-t border-border-seam pt-3\">\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-7 w-14 rounded-full\" />\n <Skeleton className=\"h-7 w-14 rounded-full\" />\n <Skeleton className=\"h-7 w-14 rounded-full\" />\n </div>\n <Skeleton className=\"h-7 w-24 rounded-full\" />\n </div>\n </GlassCard>\n ))}\n </div>\n );\n}\n\nexport function FeedPage() {\n const { navigateTo } = useComradeCircle();\n const pager = useCursorPager();\n const tr = useTr();\n const { data, isLoading, isError, refetch } = useComMyFeed({\n limit: PAGE_SIZE,\n cursor: pager.cursor,\n });\n\n const posts = data?.items ?? [];\n\n return (\n <PageLayout\n title={tr('comradecircle.pages.feed.title', 'Home')}\n titleGradient\n aurora\n description={tr(\n 'comradecircle.pages.feed.description',\n 'Posts from the circles, channels, and members you follow — newest first.'\n )}\n actions={\n <Button variant=\"outline\" onClick={() => navigateTo('circles')}>\n <Compass className=\"mr-1.5 h-4 w-4\" />{' '}\n {tr('comradecircle.pages.feed.discoverCircles', 'Discover circles')}\n </Button>\n }\n >\n <UpcomingEvents className=\"mb-5\" />\n\n {isLoading ? (\n <FeedSkeleton />\n ) : isError ? (\n <ErrorView\n message={tr('comradecircle.pages.feed.errorMessage', \"We couldn't load your feed.\")}\n onRetry={() => refetch()}\n />\n ) : posts.length === 0 && pager.page === 0 ? (\n <EmptyState\n illustration=\"empty-notifications\"\n icon={<Newspaper className=\"h-10 w-10\" />}\n title={tr('comradecircle.pages.feed.emptyTitle', 'Your feed is quiet')}\n description={tr(\n 'comradecircle.pages.feed.emptyDescription',\n 'Follow circles and members to fill your home feed with their latest posts, events, and discussions.'\n )}\n action={\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <Button onClick={() => navigateTo('circles')}>\n <Compass className=\"mr-1.5 h-4 w-4\" />{' '}\n {tr('comradecircle.pages.feed.exploreCircles', 'Explore circles')}\n </Button>\n <Button variant=\"outline\" onClick={() => navigateTo('members')}>\n <UsersRound className=\"mr-1.5 h-4 w-4\" />{' '}\n {tr('comradecircle.pages.feed.findMembers', 'Find members')}\n </Button>\n </div>\n }\n />\n ) : (\n <div className=\"mx-auto flex max-w-2xl flex-col gap-4\">\n {posts.map((post, index) => (\n <div\n key={post.id}\n className={POST_ENTER}\n style={{ animationDelay: `${Math.min(index, 8) * 70}ms` }}\n >\n <PostCard post={post} />\n </div>\n ))}\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={posts.length}\n hasMore={data?.pageInfo.hasMore ?? false}\n onPageChange={(target) => pager.onPageChange(target, data?.pageInfo.cursor)}\n />\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CircleDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/comradecircle/pages/circles/CircleDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0FH,wBAAgB,gBAAgB,4CAuH/B"}
1
+ {"version":3,"file":"CircleDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/comradecircle/pages/circles/CircleDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2FH,wBAAgB,gBAAgB,4CA0J/B"}