@burdenoff/microfe-comradecircle 2026.819.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 (89) 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.d.ts +32 -0
  13. package/dist/comradecircle/components/DraftsPanel.d.ts.map +1 -0
  14. package/dist/comradecircle/components/DraftsPanel.js +176 -0
  15. package/dist/comradecircle/components/DraftsPanel.js.map +1 -0
  16. package/dist/comradecircle/components/EventCard.js +5 -5
  17. package/dist/comradecircle/components/FileImage.js +5 -5
  18. package/dist/comradecircle/components/ImageAttachments.js +21 -21
  19. package/dist/comradecircle/components/MemberIdentity.js +4 -4
  20. package/dist/comradecircle/components/MobileBottomNav.d.ts.map +1 -1
  21. package/dist/comradecircle/components/MobileBottomNav.js +37 -30
  22. package/dist/comradecircle/components/MobileBottomNav.js.map +1 -1
  23. package/dist/comradecircle/components/Pagination.d.ts.map +1 -1
  24. package/dist/comradecircle/components/Pagination.js +37 -28
  25. package/dist/comradecircle/components/Pagination.js.map +1 -1
  26. package/dist/comradecircle/components/PollCard.js +13 -13
  27. package/dist/comradecircle/components/PostCard.d.ts.map +1 -1
  28. package/dist/comradecircle/components/PostCard.js +102 -89
  29. package/dist/comradecircle/components/PostCard.js.map +1 -1
  30. package/dist/comradecircle/components/PostComposer.d.ts +11 -5
  31. package/dist/comradecircle/components/PostComposer.d.ts.map +1 -1
  32. package/dist/comradecircle/components/PostComposer.js +60 -48
  33. package/dist/comradecircle/components/PostComposer.js.map +1 -1
  34. package/dist/comradecircle/components/ReactionBar.d.ts.map +1 -1
  35. package/dist/comradecircle/components/ReactionBar.js +65 -55
  36. package/dist/comradecircle/components/ReactionBar.js.map +1 -1
  37. package/dist/comradecircle/components/StateViews.d.ts.map +1 -1
  38. package/dist/comradecircle/components/StateViews.js +38 -30
  39. package/dist/comradecircle/components/StateViews.js.map +1 -1
  40. package/dist/comradecircle/components/UpcomingEvents.d.ts +26 -0
  41. package/dist/comradecircle/components/UpcomingEvents.d.ts.map +1 -0
  42. package/dist/comradecircle/components/UpcomingEvents.js +126 -0
  43. package/dist/comradecircle/components/UpcomingEvents.js.map +1 -0
  44. package/dist/comradecircle/components/index.d.ts +2 -0
  45. package/dist/comradecircle/components/index.d.ts.map +1 -1
  46. package/dist/comradecircle/hooks/index.d.ts +1 -0
  47. package/dist/comradecircle/hooks/index.d.ts.map +1 -1
  48. package/dist/comradecircle/hooks/index.js +1 -0
  49. package/dist/comradecircle/hooks/useTr.d.ts +18 -0
  50. package/dist/comradecircle/hooks/useTr.d.ts.map +1 -0
  51. package/dist/comradecircle/hooks/useTr.js +12 -0
  52. package/dist/comradecircle/hooks/useTr.js.map +1 -0
  53. package/dist/comradecircle/pages/FeedPage.d.ts +5 -0
  54. package/dist/comradecircle/pages/FeedPage.d.ts.map +1 -1
  55. package/dist/comradecircle/pages/FeedPage.js +76 -62
  56. package/dist/comradecircle/pages/FeedPage.js.map +1 -1
  57. package/dist/comradecircle/pages/circles/CircleDetailPage.d.ts.map +1 -1
  58. package/dist/comradecircle/pages/circles/CircleDetailPage.js +454 -409
  59. package/dist/comradecircle/pages/circles/CircleDetailPage.js.map +1 -1
  60. package/dist/comradecircle/pages/circles/CirclesPage.d.ts.map +1 -1
  61. package/dist/comradecircle/pages/circles/CirclesPage.js +124 -117
  62. package/dist/comradecircle/pages/circles/CirclesPage.js.map +1 -1
  63. package/dist/comradecircle/pages/events/EventDetailPage.d.ts.map +1 -1
  64. package/dist/comradecircle/pages/events/EventDetailPage.js +182 -153
  65. package/dist/comradecircle/pages/events/EventDetailPage.js.map +1 -1
  66. package/dist/comradecircle/pages/events/EventsPage.d.ts.map +1 -1
  67. package/dist/comradecircle/pages/events/EventsPage.js +100 -91
  68. package/dist/comradecircle/pages/events/EventsPage.js.map +1 -1
  69. package/dist/comradecircle/pages/members/MemberProfilePage.d.ts.map +1 -1
  70. package/dist/comradecircle/pages/members/MemberProfilePage.js +172 -159
  71. package/dist/comradecircle/pages/members/MemberProfilePage.js.map +1 -1
  72. package/dist/comradecircle/pages/members/MembersPage.d.ts.map +1 -1
  73. package/dist/comradecircle/pages/members/MembersPage.js +103 -104
  74. package/dist/comradecircle/pages/members/MembersPage.js.map +1 -1
  75. package/dist/comradecircle/pages/monetization/MonetizationPage.d.ts.map +1 -1
  76. package/dist/comradecircle/pages/monetization/MonetizationPage.js +319 -297
  77. package/dist/comradecircle/pages/monetization/MonetizationPage.js.map +1 -1
  78. package/dist/comradecircle/pages/posts/PostThreadPage.d.ts.map +1 -1
  79. package/dist/comradecircle/pages/posts/PostThreadPage.js +37 -32
  80. package/dist/comradecircle/pages/posts/PostThreadPage.js.map +1 -1
  81. package/dist/comradecircle/pages/profile/MyProfilePage.d.ts.map +1 -1
  82. package/dist/comradecircle/pages/profile/MyProfilePage.js +182 -177
  83. package/dist/comradecircle/pages/profile/MyProfilePage.js.map +1 -1
  84. package/dist/comradecircle/utils/i18n.js +15 -0
  85. package/dist/comradecircle/utils/i18n.js.map +1 -0
  86. package/dist/comradecircle/utils/pageContext.d.ts.map +1 -1
  87. package/dist/comradecircle/utils/pageContext.js +3 -1
  88. package/dist/comradecircle/utils/pageContext.js.map +1 -1
  89. package/package.json +1 -1
@@ -1,23 +1,24 @@
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 { useComCircles as n, useComMemberships as r } from "../../hooks/useComradeCircleApi.js";
5
- import { useCursorPager as i } from "../../hooks/useCursorPager.js";
3
+ import { useComCircles as t, useComMemberships as n } from "../../hooks/useComradeCircleApi.js";
4
+ import { useCursorPager as r } from "../../hooks/useCursorPager.js";
5
+ import { useTr as i } from "../../hooks/useTr.js";
6
6
  import "../../hooks/index.js";
7
- import { formatNumber as a } from "../../utils/formatters.js";
8
- import { EmptyState as o } from "../../components/EmptyState.js";
9
- import { ErrorView as s } from "../../components/StateViews.js";
10
- import { Pagination as c } from "../../components/Pagination.js";
11
- import { FilterTabs as l } from "../../components/FilterTabs.js";
12
- import { CircleCard as u } from "../../components/CircleCard.js";
13
- import { CreateCircleDialog as d } from "../../components/CreateCircleDialog.js";
14
- import { useMemo as f, useState as p } from "react";
15
- import { Plus as m } from "lucide-react";
16
- import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
17
- import { Button as v, GlassCard as y, Select as b, SelectContent as x, SelectItem as S, SelectTrigger as C, SelectValue as w, Skeleton as T } from "@burdenoff/fe-libs/ui";
7
+ import { PageLayout as a } from "../../components/PageLayout.js";
8
+ import { formatNumber as o } from "../../utils/formatters.js";
9
+ import { EmptyState as s } from "../../components/EmptyState.js";
10
+ import { ErrorView as c } from "../../components/StateViews.js";
11
+ import { Pagination as l } from "../../components/Pagination.js";
12
+ import { FilterTabs as u } from "../../components/FilterTabs.js";
13
+ import { CircleCard as d } from "../../components/CircleCard.js";
14
+ import { CreateCircleDialog as f } from "../../components/CreateCircleDialog.js";
15
+ import { useMemo as p, useState as m } from "react";
16
+ import { Plus as h } from "lucide-react";
17
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
18
+ import { Button as y, GlassCard as b, Select as x, SelectContent as S, SelectItem as C, SelectTrigger as w, SelectValue as T, Skeleton as E } from "@burdenoff/fe-libs/ui";
18
19
  //#region src/comradecircle/pages/circles/CirclesPage.tsx
19
- function E() {
20
- return /* @__PURE__ */ _("svg", {
20
+ function D() {
21
+ return /* @__PURE__ */ v("svg", {
21
22
  viewBox: "0 0 64 64",
22
23
  className: "h-12 w-12",
23
24
  fill: "none",
@@ -25,19 +26,19 @@ function E() {
25
26
  strokeWidth: "2",
26
27
  "aria-hidden": "true",
27
28
  children: [
28
- /* @__PURE__ */ g("circle", {
29
+ /* @__PURE__ */ _("circle", {
29
30
  cx: "24",
30
31
  cy: "26",
31
32
  r: "14",
32
33
  opacity: "0.9"
33
34
  }),
34
- /* @__PURE__ */ g("circle", {
35
+ /* @__PURE__ */ _("circle", {
35
36
  cx: "42",
36
37
  cy: "26",
37
38
  r: "14",
38
39
  opacity: "0.55"
39
40
  }),
40
- /* @__PURE__ */ g("circle", {
41
+ /* @__PURE__ */ _("circle", {
41
42
  cx: "33",
42
43
  cy: "42",
43
44
  r: "14",
@@ -46,167 +47,173 @@ function E() {
46
47
  ]
47
48
  });
48
49
  }
49
- function D() {
50
- return /* @__PURE__ */ _(y, {
50
+ function O() {
51
+ return /* @__PURE__ */ v(b, {
51
52
  treatment: "plain",
52
53
  className: "flex flex-col p-5",
53
54
  children: [
54
- /* @__PURE__ */ _("div", {
55
+ /* @__PURE__ */ v("div", {
55
56
  className: "flex items-start gap-3",
56
- children: [/* @__PURE__ */ g(T, { className: "h-12 w-12 shrink-0 rounded-full" }), /* @__PURE__ */ _("div", {
57
+ children: [/* @__PURE__ */ _(E, { className: "h-12 w-12 shrink-0 rounded-full" }), /* @__PURE__ */ v("div", {
57
58
  className: "min-w-0 flex-1 space-y-2",
58
59
  children: [
59
- /* @__PURE__ */ g(T, { className: "h-4 w-2/3 rounded" }),
60
- /* @__PURE__ */ g(T, { className: "h-3 w-1/3 rounded" }),
61
- /* @__PURE__ */ _("div", {
60
+ /* @__PURE__ */ _(E, { className: "h-4 w-2/3 rounded" }),
61
+ /* @__PURE__ */ _(E, { className: "h-3 w-1/3 rounded" }),
62
+ /* @__PURE__ */ v("div", {
62
63
  className: "flex gap-1.5 pt-1",
63
- children: [/* @__PURE__ */ g(T, { className: "h-4 w-14 rounded-full" }), /* @__PURE__ */ g(T, { className: "h-4 w-16 rounded-full" })]
64
+ children: [/* @__PURE__ */ _(E, { className: "h-4 w-14 rounded-full" }), /* @__PURE__ */ _(E, { className: "h-4 w-16 rounded-full" })]
64
65
  })
65
66
  ]
66
67
  })]
67
68
  }),
68
- /* @__PURE__ */ _("div", {
69
+ /* @__PURE__ */ v("div", {
69
70
  className: "mt-3 space-y-2",
70
- children: [/* @__PURE__ */ g(T, { className: "h-3 w-full rounded" }), /* @__PURE__ */ g(T, { className: "h-3 w-4/5 rounded" })]
71
+ children: [/* @__PURE__ */ _(E, { className: "h-3 w-full rounded" }), /* @__PURE__ */ _(E, { className: "h-3 w-4/5 rounded" })]
71
72
  }),
72
- /* @__PURE__ */ _("div", {
73
+ /* @__PURE__ */ v("div", {
73
74
  className: "mt-4 flex items-center justify-between gap-3 border-t border-border-seam pt-3",
74
- children: [/* @__PURE__ */ g(T, { className: "h-4 w-24 rounded" }), /* @__PURE__ */ g(T, { className: "h-8 w-16 rounded-lg" })]
75
+ children: [/* @__PURE__ */ _(E, { className: "h-4 w-24 rounded" }), /* @__PURE__ */ _(E, { className: "h-8 w-16 rounded-lg" })]
75
76
  })
76
77
  ]
77
78
  });
78
79
  }
79
- var O = 12, k = [
80
- {
81
- value: "ALL",
82
- label: "All"
83
- },
84
- {
85
- value: "ACTIVE",
86
- label: "Active"
87
- },
88
- {
89
- value: "ARCHIVED",
90
- label: "Archived"
91
- }
92
- ], A = [
93
- {
94
- value: "ALL",
95
- label: "All visibility"
96
- },
97
- {
98
- value: "PUBLIC",
99
- label: "Public"
100
- },
101
- {
102
- value: "PRIVATE",
103
- label: "Private"
104
- },
105
- {
106
- value: "SECRET",
107
- label: "Secret"
108
- }
109
- ];
110
- function j() {
111
- let { navigateTo: y, currentUser: T } = e(), j = i(), [M, N] = p("ALL"), [P, F] = p("ALL"), [I, L] = p(!1), { data: R, isLoading: z, isError: B, refetch: V } = n({
80
+ var k = 12;
81
+ function A() {
82
+ let { navigateTo: b, currentUser: E } = e(), A = r(), j = i(), [M, N] = m("ALL"), [P, F] = m("ALL"), [I, L] = m(!1), R = [
83
+ {
84
+ value: "ALL",
85
+ label: j("comradecircle.pages.circles.statusAll", "All")
86
+ },
87
+ {
88
+ value: "ACTIVE",
89
+ label: j("comradecircle.pages.circles.statusActive", "Active")
90
+ },
91
+ {
92
+ value: "ARCHIVED",
93
+ label: j("comradecircle.pages.circles.statusArchived", "Archived")
94
+ }
95
+ ], z = [
96
+ {
97
+ value: "ALL",
98
+ label: j("comradecircle.pages.circles.visibilityAll", "All visibility")
99
+ },
100
+ {
101
+ value: "PUBLIC",
102
+ label: j("comradecircle.pages.circles.visibilityPublic", "Public")
103
+ },
104
+ {
105
+ value: "PRIVATE",
106
+ label: j("comradecircle.pages.circles.visibilityPrivate", "Private")
107
+ },
108
+ {
109
+ value: "SECRET",
110
+ label: j("comradecircle.pages.circles.visibilitySecret", "Secret")
111
+ }
112
+ ], { data: B, isLoading: V, isError: H, refetch: U } = t({
112
113
  status: M === "ALL" ? void 0 : M,
113
114
  visibility: P === "ALL" ? void 0 : P,
114
115
  pagination: {
115
- limit: O,
116
- cursor: j.cursor
116
+ limit: k,
117
+ cursor: A.cursor
117
118
  }
118
- }), { data: H } = r({ status: "ACTIVE" }), U = f(() => {
119
+ }), { data: W } = n({ status: "ACTIVE" }), G = p(() => {
119
120
  let e = /* @__PURE__ */ new Map();
120
- for (let t of H?.items ?? []) t.memberId === T?.id && e.set(t.circleId, t);
121
+ for (let t of W?.items ?? []) t.memberId === E?.id && e.set(t.circleId, t);
121
122
  return e;
122
- }, [H, T?.id]), W = R?.items ?? [];
123
- return /* @__PURE__ */ _(t, {
124
- title: "Circles",
123
+ }, [W, E?.id]), K = B?.items ?? [];
124
+ return /* @__PURE__ */ v(a, {
125
+ title: j("comradecircle.pages.circles.title", "Circles"),
125
126
  titleGradient: !0,
126
127
  aurora: !0,
127
- description: "Discover and join communities — each circle has its own channels, members, events, and polls.",
128
- actions: /* @__PURE__ */ _(v, {
128
+ description: j("comradecircle.pages.circles.description", "Discover and join communities — each circle has its own channels, members, events, and polls."),
129
+ actions: /* @__PURE__ */ v(y, {
129
130
  onClick: () => L(!0),
130
- children: [/* @__PURE__ */ g(m, { className: "mr-1.5 h-4 w-4" }), " Create circle"]
131
+ children: [
132
+ /* @__PURE__ */ _(h, { className: "mr-1.5 h-4 w-4" }),
133
+ " ",
134
+ j("comradecircle.pages.circles.createCircle", "Create circle")
135
+ ]
131
136
  }),
132
137
  children: [
133
- /* @__PURE__ */ _("div", {
138
+ /* @__PURE__ */ v("div", {
134
139
  className: "mb-5 flex flex-wrap items-center gap-3",
135
- children: [/* @__PURE__ */ g(l, {
136
- options: k,
140
+ children: [/* @__PURE__ */ _(u, {
141
+ options: R,
137
142
  value: M,
138
143
  onChange: (e) => {
139
- N(e), j.reset();
144
+ N(e), A.reset();
140
145
  }
141
- }), /* @__PURE__ */ _(b, {
146
+ }), /* @__PURE__ */ v(x, {
142
147
  value: P,
143
148
  onValueChange: (e) => {
144
- F(e), j.reset();
149
+ F(e), A.reset();
145
150
  },
146
- children: [/* @__PURE__ */ g(C, {
151
+ children: [/* @__PURE__ */ _(w, {
147
152
  className: "w-[10.5rem]",
148
- "aria-label": "Filter by visibility",
149
- children: /* @__PURE__ */ g(w, {})
150
- }), /* @__PURE__ */ g(x, { children: A.map((e) => /* @__PURE__ */ g(S, {
153
+ "aria-label": j("comradecircle.pages.circles.filterVisibility", "Filter by visibility"),
154
+ children: /* @__PURE__ */ _(T, {})
155
+ }), /* @__PURE__ */ _(S, { children: z.map((e) => /* @__PURE__ */ _(C, {
151
156
  value: e.value,
152
157
  children: e.label
153
158
  }, e.value)) })]
154
159
  })]
155
160
  }),
156
- z ? /* @__PURE__ */ g("div", {
161
+ V ? /* @__PURE__ */ _("div", {
157
162
  className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-3",
158
163
  "aria-busy": "true",
159
- "aria-label": "Loading circles",
160
- children: Array.from({ length: 6 }, (e, t) => /* @__PURE__ */ g(D, {}, t))
161
- }) : B ? /* @__PURE__ */ g(s, {
162
- message: "We couldn't load circles.",
163
- onRetry: () => V()
164
- }) : W.length === 0 && j.page === 0 ? /* @__PURE__ */ g(o, {
165
- icon: /* @__PURE__ */ g("span", {
164
+ "aria-label": j("comradecircle.pages.circles.loadingAriaLabel", "Loading circles"),
165
+ children: Array.from({ length: 6 }, (e, t) => /* @__PURE__ */ _(O, {}, t))
166
+ }) : H ? /* @__PURE__ */ _(c, {
167
+ message: j("comradecircle.pages.circles.errorMessage", "We couldn't load circles."),
168
+ onRetry: () => U()
169
+ }) : K.length === 0 && A.page === 0 ? /* @__PURE__ */ _(s, {
170
+ icon: /* @__PURE__ */ _("span", {
166
171
  className: "inline-flex h-20 w-20 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-accent",
167
- children: /* @__PURE__ */ g(E, {})
172
+ children: /* @__PURE__ */ _(D, {})
168
173
  }),
169
- title: "No circles found",
170
- description: M === "ALL" && P === "ALL" ? "Be the first to start a community. Create a circle to gather members around a shared interest." : "No circles match these filters. Try widening them or start your own.",
171
- action: /* @__PURE__ */ _(v, {
174
+ title: j("comradecircle.pages.circles.emptyTitle", "No circles found"),
175
+ description: M === "ALL" && P === "ALL" ? j("comradecircle.pages.circles.emptyDescriptionAll", "Be the first to start a community. Create a circle to gather members around a shared interest.") : j("comradecircle.pages.circles.emptyDescriptionFiltered", "No circles match these filters. Try widening them or start your own."),
176
+ action: /* @__PURE__ */ v(y, {
172
177
  onClick: () => L(!0),
173
- children: [/* @__PURE__ */ g(m, { className: "mr-1.5 h-4 w-4" }), " Create circle"]
178
+ children: [
179
+ /* @__PURE__ */ _(h, { className: "mr-1.5 h-4 w-4" }),
180
+ " ",
181
+ j("comradecircle.pages.circles.createCircle", "Create circle")
182
+ ]
174
183
  })
175
- }) : /* @__PURE__ */ _(h, { children: [
184
+ }) : /* @__PURE__ */ v(g, { children: [
176
185
  /* @__PURE__ */ _("p", {
177
186
  className: "mb-3 text-sm text-text-tertiary",
178
- children: [
179
- "Showing ",
180
- a(W.length),
181
- " circle",
182
- W.length === 1 ? "" : "s"
183
- ]
187
+ children: j("comradecircle.pages.circles.showingCount", "Showing {{count}} circle{{plural}}", {
188
+ count: o(K.length),
189
+ plural: K.length === 1 ? "" : "s"
190
+ })
184
191
  }),
185
- /* @__PURE__ */ g("div", {
192
+ /* @__PURE__ */ _("div", {
186
193
  className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-3",
187
- children: W.map((e) => /* @__PURE__ */ g(u, {
194
+ children: K.map((e) => /* @__PURE__ */ _(d, {
188
195
  circle: e,
189
- membership: U.get(e.id) ?? null,
190
- onOpen: () => y("circles/" + e.id)
196
+ membership: G.get(e.id) ?? null,
197
+ onOpen: () => b("circles/" + e.id)
191
198
  }, e.id))
192
199
  }),
193
- /* @__PURE__ */ g(c, {
194
- page: j.page,
195
- pageSize: O,
196
- itemCount: W.length,
197
- hasMore: R?.pageInfo.hasMore ?? !1,
198
- onPageChange: (e) => j.onPageChange(e, R?.pageInfo.cursor)
200
+ /* @__PURE__ */ _(l, {
201
+ page: A.page,
202
+ pageSize: k,
203
+ itemCount: K.length,
204
+ hasMore: B?.pageInfo.hasMore ?? !1,
205
+ onPageChange: (e) => A.onPageChange(e, B?.pageInfo.cursor)
199
206
  })
200
207
  ] }),
201
- /* @__PURE__ */ g(d, {
208
+ /* @__PURE__ */ _(f, {
202
209
  open: I,
203
210
  onOpenChange: L,
204
- onCreated: (e) => y("circles/" + e.id)
211
+ onCreated: (e) => b("circles/" + e.id)
205
212
  })
206
213
  ]
207
214
  });
208
215
  }
209
216
  //#endregion
210
- export { j as CirclesPage };
217
+ export { A as CirclesPage };
211
218
 
212
219
  //# sourceMappingURL=CirclesPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CirclesPage.js","names":[],"sources":["../../../../src/comradecircle/pages/circles/CirclesPage.tsx"],"sourcesContent":["/**\n * CirclesPage — the circle discovery & browse experience.\n * @module comradecircle/pages/circles\n *\n * Reads `comListCircles` (filtered by status + visibility) and, in parallel, the\n * caller's active memberships (`comListMemberships`) so each tile can show the\n * right affordance: Join for circles you don't belong to, Open/Leave + your role\n * for the ones you do. Anyone can spin up a new circle from the header action.\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus } from 'lucide-react';\nimport {\n Button,\n GlassCard,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { FilterTabs, type FilterOption } from '../../components/FilterTabs';\nimport { CircleCard } from '../../components/CircleCard';\nimport { CreateCircleDialog } from '../../components/CreateCircleDialog';\nimport { EmptyState } from '../../components/EmptyState';\nimport { ErrorView } from '../../components/StateViews';\nimport { Pagination } from '../../components/Pagination';\nimport { useComCircles, useComMemberships, useCursorPager } from '../../hooks';\nimport { useComradeCircle } from '../../context';\nimport { formatNumber } from '../../utils/formatters';\nimport type { ComCircleVisibility, ComMembership } from '../../types';\n\n/**\n * ConnectedCirclesIcon — product-specific zero-state artwork (BOFF-3973).\n *\n * `comradecircle-23-circles-empty-state.png` pairs \"No circles found\" with a\n * custom connected-circles motif rather than the generic `empty-people`\n * illustration from `fe-libs/ui`. Composed inline (per the ticket's own\n * suggested implementation) instead of adding a new shared illustration\n * asset, since `fe-libs/ui` is consumed fleet-wide and a product-specific\n * glyph doesn't belong there. Uses `currentColor` only — no raw color\n * literals — so it inherits the semantic accent token from its wrapper.\n */\nfunction ConnectedCirclesIcon() {\n return (\n <svg\n viewBox=\"0 0 64 64\"\n className=\"h-12 w-12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"26\" r=\"14\" opacity=\"0.9\" />\n <circle cx=\"42\" cy=\"26\" r=\"14\" opacity=\"0.55\" />\n <circle cx=\"33\" cy=\"42\" r=\"14\" opacity=\"0.3\" />\n </svg>\n );\n}\n\n/** Circle-tile-shaped placeholder used while the directory loads. */\nfunction CircleCardSkeleton() {\n return (\n <GlassCard treatment=\"plain\" className=\"flex flex-col p-5\">\n <div className=\"flex items-start gap-3\">\n <Skeleton className=\"h-12 w-12 shrink-0 rounded-full\" />\n <div className=\"min-w-0 flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-2/3 rounded\" />\n <Skeleton className=\"h-3 w-1/3 rounded\" />\n <div className=\"flex gap-1.5 pt-1\">\n <Skeleton className=\"h-4 w-14 rounded-full\" />\n <Skeleton className=\"h-4 w-16 rounded-full\" />\n </div>\n </div>\n </div>\n <div className=\"mt-3 space-y-2\">\n <Skeleton className=\"h-3 w-full rounded\" />\n <Skeleton className=\"h-3 w-4/5 rounded\" />\n </div>\n <div className=\"mt-4 flex items-center justify-between gap-3 border-t border-border-seam pt-3\">\n <Skeleton className=\"h-4 w-24 rounded\" />\n <Skeleton className=\"h-8 w-16 rounded-lg\" />\n </div>\n </GlassCard>\n );\n}\n\nconst PAGE_SIZE = 12;\n\ntype StatusFilter = 'ALL' | 'ACTIVE' | 'ARCHIVED';\ntype VisibilityFilter = 'ALL' | ComCircleVisibility;\n\nconst STATUS_OPTIONS: FilterOption<StatusFilter>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'ACTIVE', label: 'Active' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst VISIBILITY_OPTIONS: { value: VisibilityFilter; label: string }[] = [\n { value: 'ALL', label: 'All visibility' },\n { value: 'PUBLIC', label: 'Public' },\n { value: 'PRIVATE', label: 'Private' },\n { value: 'SECRET', label: 'Secret' },\n];\n\nexport function CirclesPage() {\n const { navigateTo, currentUser } = useComradeCircle();\n const pager = useCursorPager();\n const [status, setStatus] = useState<StatusFilter>('ALL');\n const [visibility, setVisibility] = useState<VisibilityFilter>('ALL');\n const [createOpen, setCreateOpen] = useState(false);\n\n const { data, isLoading, isError, refetch } = useComCircles({\n status: status === 'ALL' ? undefined : status,\n visibility: visibility === 'ALL' ? undefined : visibility,\n pagination: { limit: PAGE_SIZE, cursor: pager.cursor },\n });\n\n // Parallel: the caller's active memberships, keyed by circle so each tile knows\n // whether the current user already belongs (and in what role).\n const { data: membershipData } = useComMemberships({ status: 'ACTIVE' });\n\n const membershipByCircle = useMemo(() => {\n const map = new Map<string, ComMembership>();\n for (const membership of membershipData?.items ?? []) {\n if (membership.memberId === currentUser?.id) {\n map.set(membership.circleId, membership);\n }\n }\n return map;\n }, [membershipData, currentUser?.id]);\n\n const circles = data?.items ?? [];\n\n const changeStatus = (next: StatusFilter) => {\n setStatus(next);\n pager.reset();\n };\n\n const changeVisibility = (next: string) => {\n setVisibility(next as VisibilityFilter);\n pager.reset();\n };\n\n return (\n <PageLayout\n title=\"Circles\"\n titleGradient\n aurora\n description=\"Discover and join communities — each circle has its own channels, members, events, and polls.\"\n actions={\n <Button onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Create circle\n </Button>\n }\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-3\">\n <FilterTabs options={STATUS_OPTIONS} value={status} onChange={changeStatus} />\n <Select value={visibility} onValueChange={changeVisibility}>\n <SelectTrigger className=\"w-[10.5rem]\" aria-label=\"Filter by visibility\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {VISIBILITY_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {isLoading ? (\n <div\n className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-3\"\n aria-busy=\"true\"\n aria-label=\"Loading circles\"\n >\n {Array.from({ length: 6 }, (_, i) => (\n <CircleCardSkeleton key={i} />\n ))}\n </div>\n ) : isError ? (\n <ErrorView message=\"We couldn't load circles.\" onRetry={() => refetch()} />\n ) : circles.length === 0 && pager.page === 0 ? (\n <EmptyState\n icon={\n <span className=\"inline-flex h-20 w-20 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-accent\">\n <ConnectedCirclesIcon />\n </span>\n }\n title=\"No circles found\"\n description={\n status === 'ALL' && visibility === 'ALL'\n ? 'Be the first to start a community. Create a circle to gather members around a shared interest.'\n : 'No circles match these filters. Try widening them or start your own.'\n }\n action={\n <Button onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Create circle\n </Button>\n }\n />\n ) : (\n <>\n <p className=\"mb-3 text-sm text-text-tertiary\">\n Showing {formatNumber(circles.length)} circle{circles.length === 1 ? '' : 's'}\n </p>\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-3\">\n {circles.map((circle) => (\n <CircleCard\n key={circle.id}\n circle={circle}\n membership={membershipByCircle.get(circle.id) ?? null}\n onOpen={() => navigateTo('circles/' + circle.id)}\n />\n ))}\n </div>\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={circles.length}\n hasMore={data?.pageInfo.hasMore ?? false}\n onPageChange={(target) => pager.onPageChange(target, data?.pageInfo.cursor)}\n />\n </>\n )}\n\n <CreateCircleDialog\n open={createOpen}\n onOpenChange={setCreateOpen}\n onCreated={(circle) => navigateTo('circles/' + circle.id)}\n />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CirclesPage.js","names":[],"sources":["../../../../src/comradecircle/pages/circles/CirclesPage.tsx"],"sourcesContent":["/**\n * CirclesPage — the circle discovery & browse experience.\n * @module comradecircle/pages/circles\n *\n * Reads `comListCircles` (filtered by status + visibility) and, in parallel, the\n * caller's active memberships (`comListMemberships`) so each tile can show the\n * right affordance: Join for circles you don't belong to, Open/Leave + your role\n * for the ones you do. Anyone can spin up a new circle from the header action.\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus } from 'lucide-react';\nimport {\n Button,\n GlassCard,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { FilterTabs, type FilterOption } from '../../components/FilterTabs';\nimport { CircleCard } from '../../components/CircleCard';\nimport { CreateCircleDialog } from '../../components/CreateCircleDialog';\nimport { EmptyState } from '../../components/EmptyState';\nimport { ErrorView } from '../../components/StateViews';\nimport { Pagination } from '../../components/Pagination';\nimport { useComCircles, useComMemberships, useCursorPager, useTr } from '../../hooks';\nimport { useComradeCircle } from '../../context';\nimport { formatNumber } from '../../utils/formatters';\nimport type { ComCircleVisibility, ComMembership } from '../../types';\n\n/**\n * ConnectedCirclesIcon — product-specific zero-state artwork (BOFF-3973).\n *\n * `comradecircle-23-circles-empty-state.png` pairs \"No circles found\" with a\n * custom connected-circles motif rather than the generic `empty-people`\n * illustration from `fe-libs/ui`. Composed inline (per the ticket's own\n * suggested implementation) instead of adding a new shared illustration\n * asset, since `fe-libs/ui` is consumed fleet-wide and a product-specific\n * glyph doesn't belong there. Uses `currentColor` only — no raw color\n * literals — so it inherits the semantic accent token from its wrapper.\n */\nfunction ConnectedCirclesIcon() {\n return (\n <svg\n viewBox=\"0 0 64 64\"\n className=\"h-12 w-12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <circle cx=\"24\" cy=\"26\" r=\"14\" opacity=\"0.9\" />\n <circle cx=\"42\" cy=\"26\" r=\"14\" opacity=\"0.55\" />\n <circle cx=\"33\" cy=\"42\" r=\"14\" opacity=\"0.3\" />\n </svg>\n );\n}\n\n/** Circle-tile-shaped placeholder used while the directory loads. */\nfunction CircleCardSkeleton() {\n return (\n <GlassCard treatment=\"plain\" className=\"flex flex-col p-5\">\n <div className=\"flex items-start gap-3\">\n <Skeleton className=\"h-12 w-12 shrink-0 rounded-full\" />\n <div className=\"min-w-0 flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-2/3 rounded\" />\n <Skeleton className=\"h-3 w-1/3 rounded\" />\n <div className=\"flex gap-1.5 pt-1\">\n <Skeleton className=\"h-4 w-14 rounded-full\" />\n <Skeleton className=\"h-4 w-16 rounded-full\" />\n </div>\n </div>\n </div>\n <div className=\"mt-3 space-y-2\">\n <Skeleton className=\"h-3 w-full rounded\" />\n <Skeleton className=\"h-3 w-4/5 rounded\" />\n </div>\n <div className=\"mt-4 flex items-center justify-between gap-3 border-t border-border-seam pt-3\">\n <Skeleton className=\"h-4 w-24 rounded\" />\n <Skeleton className=\"h-8 w-16 rounded-lg\" />\n </div>\n </GlassCard>\n );\n}\n\nconst PAGE_SIZE = 12;\n\ntype StatusFilter = 'ALL' | 'ACTIVE' | 'ARCHIVED';\ntype VisibilityFilter = 'ALL' | ComCircleVisibility;\n\nexport function CirclesPage() {\n const { navigateTo, currentUser } = useComradeCircle();\n const pager = useCursorPager();\n const tr = useTr();\n const [status, setStatus] = useState<StatusFilter>('ALL');\n const [visibility, setVisibility] = useState<VisibilityFilter>('ALL');\n const [createOpen, setCreateOpen] = useState(false);\n\n const STATUS_OPTIONS: FilterOption<StatusFilter>[] = [\n { value: 'ALL', label: tr('comradecircle.pages.circles.statusAll', 'All') },\n { value: 'ACTIVE', label: tr('comradecircle.pages.circles.statusActive', 'Active') },\n { value: 'ARCHIVED', label: tr('comradecircle.pages.circles.statusArchived', 'Archived') },\n ];\n\n const VISIBILITY_OPTIONS: { value: VisibilityFilter; label: string }[] = [\n { value: 'ALL', label: tr('comradecircle.pages.circles.visibilityAll', 'All visibility') },\n { value: 'PUBLIC', label: tr('comradecircle.pages.circles.visibilityPublic', 'Public') },\n { value: 'PRIVATE', label: tr('comradecircle.pages.circles.visibilityPrivate', 'Private') },\n { value: 'SECRET', label: tr('comradecircle.pages.circles.visibilitySecret', 'Secret') },\n ];\n\n const { data, isLoading, isError, refetch } = useComCircles({\n status: status === 'ALL' ? undefined : status,\n visibility: visibility === 'ALL' ? undefined : visibility,\n pagination: { limit: PAGE_SIZE, cursor: pager.cursor },\n });\n\n // Parallel: the caller's active memberships, keyed by circle so each tile knows\n // whether the current user already belongs (and in what role).\n const { data: membershipData } = useComMemberships({ status: 'ACTIVE' });\n\n const membershipByCircle = useMemo(() => {\n const map = new Map<string, ComMembership>();\n for (const membership of membershipData?.items ?? []) {\n if (membership.memberId === currentUser?.id) {\n map.set(membership.circleId, membership);\n }\n }\n return map;\n }, [membershipData, currentUser?.id]);\n\n const circles = data?.items ?? [];\n\n const changeStatus = (next: StatusFilter) => {\n setStatus(next);\n pager.reset();\n };\n\n const changeVisibility = (next: string) => {\n setVisibility(next as VisibilityFilter);\n pager.reset();\n };\n\n return (\n <PageLayout\n title={tr('comradecircle.pages.circles.title', 'Circles')}\n titleGradient\n aurora\n description={tr(\n 'comradecircle.pages.circles.description',\n 'Discover and join communities — each circle has its own channels, members, events, and polls.'\n )}\n actions={\n <Button onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" />{' '}\n {tr('comradecircle.pages.circles.createCircle', 'Create circle')}\n </Button>\n }\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-3\">\n <FilterTabs options={STATUS_OPTIONS} value={status} onChange={changeStatus} />\n <Select value={visibility} onValueChange={changeVisibility}>\n <SelectTrigger\n className=\"w-[10.5rem]\"\n aria-label={tr('comradecircle.pages.circles.filterVisibility', 'Filter by visibility')}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {VISIBILITY_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {isLoading ? (\n <div\n className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-3\"\n aria-busy=\"true\"\n aria-label={tr('comradecircle.pages.circles.loadingAriaLabel', 'Loading circles')}\n >\n {Array.from({ length: 6 }, (_, i) => (\n <CircleCardSkeleton key={i} />\n ))}\n </div>\n ) : isError ? (\n <ErrorView\n message={tr('comradecircle.pages.circles.errorMessage', \"We couldn't load circles.\")}\n onRetry={() => refetch()}\n />\n ) : circles.length === 0 && pager.page === 0 ? (\n <EmptyState\n icon={\n <span className=\"inline-flex h-20 w-20 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-accent\">\n <ConnectedCirclesIcon />\n </span>\n }\n title={tr('comradecircle.pages.circles.emptyTitle', 'No circles found')}\n description={\n status === 'ALL' && visibility === 'ALL'\n ? tr(\n 'comradecircle.pages.circles.emptyDescriptionAll',\n 'Be the first to start a community. Create a circle to gather members around a shared interest.'\n )\n : tr(\n 'comradecircle.pages.circles.emptyDescriptionFiltered',\n 'No circles match these filters. Try widening them or start your own.'\n )\n }\n action={\n <Button onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" />{' '}\n {tr('comradecircle.pages.circles.createCircle', 'Create circle')}\n </Button>\n }\n />\n ) : (\n <>\n <p className=\"mb-3 text-sm text-text-tertiary\">\n {tr('comradecircle.pages.circles.showingCount', 'Showing {{count}} circle{{plural}}', {\n count: formatNumber(circles.length),\n plural: circles.length === 1 ? '' : 's',\n })}\n </p>\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-3\">\n {circles.map((circle) => (\n <CircleCard\n key={circle.id}\n circle={circle}\n membership={membershipByCircle.get(circle.id) ?? null}\n onOpen={() => navigateTo('circles/' + circle.id)}\n />\n ))}\n </div>\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={circles.length}\n hasMore={data?.pageInfo.hasMore ?? false}\n onPageChange={(target) => pager.onPageChange(target, data?.pageInfo.cursor)}\n />\n </>\n )}\n\n <CreateCircleDialog\n open={createOpen}\n onOpenChange={setCreateOpen}\n onCreated={(circle) => navigateTo('circles/' + circle.id)}\n />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EventDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/comradecircle/pages/events/EventDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoDH,wBAAgB,eAAe,4CAoV9B"}
1
+ {"version":3,"file":"EventDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/comradecircle/pages/events/EventDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkFH,wBAAgB,eAAe,4CA2Z9B"}