@burdenoff/microfe-comradecircle 2026.805.1 → 2026.827.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 (40) hide show
  1. package/dist/comradecircle/components/DraftsPanel.d.ts +32 -0
  2. package/dist/comradecircle/components/DraftsPanel.d.ts.map +1 -0
  3. package/dist/comradecircle/components/DraftsPanel.js +176 -0
  4. package/dist/comradecircle/components/DraftsPanel.js.map +1 -0
  5. package/dist/comradecircle/components/PostComposer.d.ts +11 -5
  6. package/dist/comradecircle/components/PostComposer.d.ts.map +1 -1
  7. package/dist/comradecircle/components/PostComposer.js +58 -46
  8. package/dist/comradecircle/components/PostComposer.js.map +1 -1
  9. package/dist/comradecircle/components/UpcomingEvents.d.ts +26 -0
  10. package/dist/comradecircle/components/UpcomingEvents.d.ts.map +1 -0
  11. package/dist/comradecircle/components/UpcomingEvents.js +126 -0
  12. package/dist/comradecircle/components/UpcomingEvents.js.map +1 -0
  13. package/dist/comradecircle/components/index.d.ts +2 -0
  14. package/dist/comradecircle/components/index.d.ts.map +1 -1
  15. package/dist/comradecircle/pages/FeedPage.d.ts +5 -0
  16. package/dist/comradecircle/pages/FeedPage.d.ts.map +1 -1
  17. package/dist/comradecircle/pages/FeedPage.js +54 -53
  18. package/dist/comradecircle/pages/FeedPage.js.map +1 -1
  19. package/dist/comradecircle/pages/circles/CircleDetailPage.d.ts.map +1 -1
  20. package/dist/comradecircle/pages/circles/CircleDetailPage.js +244 -237
  21. package/dist/comradecircle/pages/circles/CircleDetailPage.js.map +1 -1
  22. package/dist/comradecircle/utils/pageContext.d.ts.map +1 -1
  23. package/dist/comradecircle/utils/pageContext.js +3 -1
  24. package/dist/comradecircle/utils/pageContext.js.map +1 -1
  25. package/dist/stories/CircleCard.stories.d.ts +10 -0
  26. package/dist/stories/CircleCard.stories.d.ts.map +1 -0
  27. package/dist/stories/CommentThread.stories.d.ts +8 -0
  28. package/dist/stories/CommentThread.stories.d.ts.map +1 -0
  29. package/dist/stories/CreateCircleDialog.stories.d.ts +8 -0
  30. package/dist/stories/CreateCircleDialog.stories.d.ts.map +1 -0
  31. package/dist/stories/EmptyState.stories.d.ts.map +1 -1
  32. package/dist/stories/EventCard.stories.d.ts +10 -0
  33. package/dist/stories/EventCard.stories.d.ts.map +1 -0
  34. package/dist/stories/MetricsCard.stories.d.ts.map +1 -1
  35. package/dist/stories/PollCard.stories.d.ts +10 -0
  36. package/dist/stories/PollCard.stories.d.ts.map +1 -0
  37. package/dist/stories/PostCard.stories.d.ts +10 -0
  38. package/dist/stories/PostCard.stories.d.ts.map +1 -0
  39. package/dist/stories/StatusBadge.stories.d.ts.map +1 -1
  40. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpcomingEvents.js","names":[],"sources":["../../../src/comradecircle/components/UpcomingEvents.tsx"],"sourcesContent":["/**\n * UpcomingEvents — a compact \"what's next\" strip for the home feed.\n * @module comradecircle/components\n *\n * Reads `comListEvents(status: SCHEDULED)` — the same root field the Events page\n * already uses — and writes `comRsvpEvent(eventId, status)` straight from the\n * row, so the member can commit to the next gathering without leaving home.\n * Every value shown (`title`, `startsAt`, `mode`, `location`, `rsvpCount`,\n * `capacity`) comes from that query's own selection set.\n *\n * Why the client-side date filter: the svc orders `comListEvents` by\n * `startsAt: 'asc'` and does NOT drop events whose start time has passed, so an\n * event left in `SCHEDULED` after its slot sorts *ahead* of genuinely upcoming\n * ones. The rail therefore reads a window of the ordered list and keeps only\n * rows still in the future. If that window is entirely historical the strip\n * renders nothing at all — it never claims \"no upcoming events\", because one\n * page of a list is not evidence that none exist.\n */\n\nimport { useEffect, useMemo, useState } from 'react';\nimport { ArrowRight, CalendarDays, Check, MapPin, Users, Video } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\nimport { useComEvents, useComRsvpEvent } from '../hooks';\nimport { useComradeCircle } from '../context';\nimport { formatDateTime, formatNumber } from '../utils/formatters';\nimport { notify, describeError } from '../lib/toast';\nimport type { ComEvent, ComRsvpStatus } from '../types';\n\n/** How far down the `startsAt`-ascending list to look for future events. */\nconst LOOKAHEAD = 50;\n\n/** How often the \"is it still in the future?\" cut-off is re-evaluated. */\nconst TICK_MS = 60_000;\n\n/**\n * A wall-clock reading that advances on its own, so a row whose start time\n * passes while the page is open drops out without waiting for a refetch.\n * Reading the clock in an effect (never in render) keeps the component pure.\n */\nfunction useNow(intervalMs: number = TICK_MS): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), intervalMs);\n return () => clearInterval(id);\n }, [intervalMs]);\n return now;\n}\n\ninterface UpcomingEventsProps {\n /** Rows to render once past events are filtered out. */\n limit?: number;\n className?: string;\n}\n\nexport function UpcomingEvents({ limit = 3, className }: UpcomingEventsProps) {\n const { navigateTo } = useComradeCircle();\n const now = useNow();\n const { data, isLoading, isError } = useComEvents({\n status: 'SCHEDULED',\n pagination: { limit: LOOKAHEAD },\n });\n\n const upcoming = useMemo(\n () =>\n (data?.items ?? [])\n .filter((event) => new Date(event.startsAt).getTime() >= now)\n .slice(0, limit),\n [data, now, limit]\n );\n\n // A supplementary strip above the feed: while it loads, or if it fails, the\n // feed below is the page — the rail simply stays out of the layout rather\n // than pushing the posts down for a section that may turn out to be empty.\n if (isLoading || isError || upcoming.length === 0) return null;\n\n return (\n <section className={cn('mx-auto w-full max-w-2xl', className)} aria-labelledby=\"cc-upcoming\">\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <h2\n id=\"cc-upcoming\"\n className=\"inline-flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wide text-text-tertiary\"\n >\n <CalendarDays className=\"h-3.5 w-3.5\" /> Upcoming events\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('events')}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-text-secondary transition-colors hover:text-text-primary\"\n >\n View all <ArrowRight className=\"h-3 w-3\" />\n </button>\n </div>\n\n <ul className=\"overflow-hidden rounded-2xl border border-border-seam bg-bg-surface\">\n {upcoming.map((event) => (\n <li key={event.id} className=\"border-b border-border-seam last:border-b-0\">\n <UpcomingEventRow event={event} />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction UpcomingEventRow({ event }: { event: ComEvent }) {\n const { navigateTo } = useComradeCircle();\n const rsvp = useComRsvpEvent();\n // `comListEvents` returns aggregate `rsvpCount`, not the caller's own RSVP, so\n // the confirmed cue reflects this session's mutation only — the same contract\n // EventCard documents.\n const [myStatus, setMyStatus] = useState<ComRsvpStatus | null>(null);\n\n const going = myStatus === 'GOING';\n const ModeIcon = event.mode === 'IN_PERSON' ? MapPin : Video;\n const where =\n event.mode === 'IN_PERSON'\n ? event.location || 'In person'\n : event.mode === 'HYBRID'\n ? `Hybrid${event.location ? ` · ${event.location}` : ''}`\n : 'Online';\n\n const doRsvp = async () => {\n try {\n await rsvp.mutateAsync({ eventId: event.id, status: 'GOING' });\n setMyStatus('GOING');\n notify.success('RSVP: Going', event.title);\n } catch (err) {\n notify.error('Could not RSVP', describeError(err));\n }\n };\n\n return (\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <span\n aria-hidden=\"true\"\n className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-[var(--color-accent-soft)] text-accent\"\n >\n <CalendarDays className=\"h-5 w-5\" />\n </span>\n\n <div className=\"min-w-0 flex-1\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`events/${event.id}`)}\n className=\"block max-w-full truncate text-left text-sm font-semibold text-text-primary transition-colors hover:text-accent\"\n >\n {event.title}\n </button>\n <div className=\"mt-0.5 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-text-tertiary\">\n <span>{formatDateTime(event.startsAt)}</span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"inline-flex items-center gap-1\">\n <ModeIcon className=\"h-3 w-3\" /> {where}\n </span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"inline-flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {formatNumber(event.rsvpCount)}\n {event.capacity ? ` / ${formatNumber(event.capacity)}` : ''}\n </span>\n </div>\n </div>\n\n <Button\n size=\"sm\"\n variant={going ? 'outline' : 'default'}\n onClick={() => void doRsvp()}\n disabled={rsvp.isPending}\n aria-pressed={going}\n className={cn('shrink-0', going && 'text-accent')}\n >\n {going ? (\n <>\n <Check className=\"mr-1 h-3.5 w-3.5\" /> Going\n </>\n ) : (\n 'RSVP'\n )}\n </Button>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -22,7 +22,9 @@ export { TagInput } from './TagInput';
22
22
  export { ReactionBar } from './ReactionBar';
23
23
  export { CommentThread } from './CommentThread';
24
24
  export { PostComposer } from './PostComposer';
25
+ export { DraftsPanel } from './DraftsPanel';
25
26
  export { PostCard } from './PostCard';
27
+ export { UpcomingEvents } from './UpcomingEvents';
26
28
  export { CircleCard } from './CircleCard';
27
29
  export { EventCard } from './EventCard';
28
30
  export { PollCard } from './PollCard';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -5,6 +5,11 @@
5
5
  * Reads `comMyFeed` (published posts from every channel, member, and circle the
6
6
  * caller follows, newest first). A new member with no follows sees a guided
7
7
  * empty state pointing at circle & member discovery.
8
+ *
9
+ * Above the post column sits {@link UpcomingEvents} — the mobile home mock
10
+ * shows the home surface carrying the member's next gathering (with an RSVP
11
+ * affordance), not posts alone. It is a separate `comListEvents` read because
12
+ * `comMyFeed` returns `ComPost` rows only.
8
13
  */
9
14
  export declare function FeedPage(): import("react/jsx-runtime").JSX.Element;
10
15
  //# sourceMappingURL=FeedPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedPage.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/pages/FeedPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiEH,wBAAgB,QAAQ,4CAiEvB"}
1
+ {"version":3,"file":"FeedPage.d.ts","sourceRoot":"","sources":["../../../src/comradecircle/pages/FeedPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkEH,wBAAgB,QAAQ,4CAmEvB"}
@@ -5,14 +5,15 @@ import { useComMyFeed as n } from "../hooks/useComradeCircleApi.js";
5
5
  import { useCursorPager as r } from "../hooks/useCursorPager.js";
6
6
  import "../hooks/index.js";
7
7
  import { PostCard as i } from "../components/PostCard.js";
8
- import { EmptyState as a } from "../components/EmptyState.js";
9
- import { ErrorView as o } from "../components/StateViews.js";
10
- import { Pagination as s } from "../components/Pagination.js";
11
- import { Compass as c, Newspaper as l, UsersRound as u } from "lucide-react";
12
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
13
- import { Button as p, GlassCard as m, Skeleton as h } from "@burdenoff/fe-libs/ui";
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";
14
15
  //#region src/comradecircle/pages/FeedPage.tsx
15
- var g = 20, _ = "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", v = [
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 = [
16
17
  ["w-11/12", "w-3/4"],
17
18
  [
18
19
  "w-full",
@@ -21,91 +22,91 @@ var g = 20, _ = "motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in
21
22
  ],
22
23
  ["w-5/6", "w-1/2"]
23
24
  ];
24
- function y() {
25
- return /* @__PURE__ */ d("div", {
25
+ function b() {
26
+ return /* @__PURE__ */ f("div", {
26
27
  className: "mx-auto flex max-w-2xl flex-col gap-4",
27
28
  "aria-hidden": "true",
28
- children: v.map((e, t) => /* @__PURE__ */ f(m, {
29
+ children: y.map((e, t) => /* @__PURE__ */ p(h, {
29
30
  treatment: "plain",
30
31
  className: "p-4",
31
32
  children: [
32
- /* @__PURE__ */ f("div", {
33
+ /* @__PURE__ */ p("div", {
33
34
  className: "flex items-start gap-3",
34
- children: [/* @__PURE__ */ d(h, { className: "h-10 w-10 shrink-0 rounded-full" }), /* @__PURE__ */ f("div", {
35
+ children: [/* @__PURE__ */ f(g, { className: "h-10 w-10 shrink-0 rounded-full" }), /* @__PURE__ */ p("div", {
35
36
  className: "flex-1 space-y-2 pt-1",
36
- children: [/* @__PURE__ */ d(h, { className: "h-3.5 w-32" }), /* @__PURE__ */ d(h, { className: "h-3 w-20" })]
37
+ children: [/* @__PURE__ */ f(g, { className: "h-3.5 w-32" }), /* @__PURE__ */ f(g, { className: "h-3 w-20" })]
37
38
  })]
38
39
  }),
39
- /* @__PURE__ */ d("div", {
40
+ /* @__PURE__ */ f("div", {
40
41
  className: "mt-4 space-y-2.5",
41
- children: e.map((e, t) => /* @__PURE__ */ d(h, { className: `h-3 ${e}` }, t))
42
+ children: e.map((e, t) => /* @__PURE__ */ f(g, { className: `h-3 ${e}` }, t))
42
43
  }),
43
- /* @__PURE__ */ f("div", {
44
+ /* @__PURE__ */ p("div", {
44
45
  className: "mt-4 flex items-center justify-between gap-3 border-t border-border-seam pt-3",
45
- children: [/* @__PURE__ */ f("div", {
46
+ children: [/* @__PURE__ */ p("div", {
46
47
  className: "flex items-center gap-2",
47
48
  children: [
48
- /* @__PURE__ */ d(h, { className: "h-7 w-14 rounded-full" }),
49
- /* @__PURE__ */ d(h, { className: "h-7 w-14 rounded-full" }),
50
- /* @__PURE__ */ d(h, { className: "h-7 w-14 rounded-full" })
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" })
51
52
  ]
52
- }), /* @__PURE__ */ d(h, { className: "h-7 w-24 rounded-full" })]
53
+ }), /* @__PURE__ */ f(g, { className: "h-7 w-24 rounded-full" })]
53
54
  })
54
55
  ]
55
56
  }, t))
56
57
  });
57
58
  }
58
- function b() {
59
- let { navigateTo: m } = e(), h = r(), { data: v, isLoading: b, isError: x, refetch: S } = n({
60
- limit: g,
61
- cursor: h.cursor
62
- }), C = v?.items ?? [];
63
- return /* @__PURE__ */ d(t, {
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, {
64
65
  title: "Home",
65
66
  titleGradient: !0,
66
67
  aurora: !0,
67
68
  description: "Posts from the circles, channels, and members you follow — newest first.",
68
- actions: /* @__PURE__ */ f(p, {
69
+ actions: /* @__PURE__ */ p(m, {
69
70
  variant: "outline",
70
- onClick: () => m("circles"),
71
- children: [/* @__PURE__ */ d(c, { className: "mr-1.5 h-4 w-4" }), " Discover circles"]
71
+ onClick: () => h("circles"),
72
+ children: [/* @__PURE__ */ f(l, { className: "mr-1.5 h-4 w-4" }), " Discover circles"]
72
73
  }),
73
- children: b ? /* @__PURE__ */ d(y, {}) : x ? /* @__PURE__ */ d(o, {
74
+ children: [/* @__PURE__ */ f(a, { className: "mb-5" }), x ? /* @__PURE__ */ f(b, {}) : S ? /* @__PURE__ */ f(s, {
74
75
  message: "We couldn't load your feed.",
75
- onRetry: () => S()
76
- }) : C.length === 0 && h.page === 0 ? /* @__PURE__ */ d(a, {
76
+ onRetry: () => C()
77
+ }) : w.length === 0 && g.page === 0 ? /* @__PURE__ */ f(o, {
77
78
  illustration: "empty-notifications",
78
- icon: /* @__PURE__ */ d(l, { className: "h-10 w-10" }),
79
+ icon: /* @__PURE__ */ f(u, { className: "h-10 w-10" }),
79
80
  title: "Your feed is quiet",
80
81
  description: "Follow circles and members to fill your home feed with their latest posts, events, and discussions.",
81
- action: /* @__PURE__ */ f("div", {
82
+ action: /* @__PURE__ */ p("div", {
82
83
  className: "flex flex-wrap items-center justify-center gap-3",
83
- children: [/* @__PURE__ */ f(p, {
84
- onClick: () => m("circles"),
85
- children: [/* @__PURE__ */ d(c, { className: "mr-1.5 h-4 w-4" }), " Explore circles"]
86
- }), /* @__PURE__ */ f(p, {
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, {
87
88
  variant: "outline",
88
- onClick: () => m("members"),
89
- children: [/* @__PURE__ */ d(u, { className: "mr-1.5 h-4 w-4" }), " Find members"]
89
+ onClick: () => h("members"),
90
+ children: [/* @__PURE__ */ f(d, { className: "mr-1.5 h-4 w-4" }), " Find members"]
90
91
  })]
91
92
  })
92
- }) : /* @__PURE__ */ f("div", {
93
+ }) : /* @__PURE__ */ p("div", {
93
94
  className: "mx-auto flex max-w-2xl flex-col gap-4",
94
- children: [C.map((e, t) => /* @__PURE__ */ d("div", {
95
- className: _,
95
+ children: [w.map((e, t) => /* @__PURE__ */ f("div", {
96
+ className: v,
96
97
  style: { animationDelay: `${Math.min(t, 8) * 70}ms` },
97
- children: /* @__PURE__ */ d(i, { post: e })
98
- }, e.id)), /* @__PURE__ */ d(s, {
99
- page: h.page,
100
- pageSize: g,
101
- itemCount: C.length,
102
- hasMore: v?.pageInfo.hasMore ?? !1,
103
- onPageChange: (e) => h.onPageChange(e, v?.pageInfo.cursor)
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)
104
105
  })]
105
- })
106
+ })]
106
107
  });
107
108
  }
108
109
  //#endregion
109
- export { b as FeedPage };
110
+ export { x as FeedPage };
110
111
 
111
112
  //# 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\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 { 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 {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":";;;;;;;;;;;;;;AAmBA,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;;YAGT,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;;CAEG,CAAA;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 } 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 +1 @@
1
- {"version":3,"file":"CircleDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/comradecircle/pages/circles/CircleDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAyFH,wBAAgB,gBAAgB,4CAuH/B"}
1
+ {"version":3,"file":"CircleDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/comradecircle/pages/circles/CircleDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0FH,wBAAgB,gBAAgB,4CAuH/B"}