@burdenoff/microfe-theculturepost 2026.802.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 (49) hide show
  1. package/dist/theculturepost/components/CitationList.d.ts +2 -1
  2. package/dist/theculturepost/components/CitationList.d.ts.map +1 -1
  3. package/dist/theculturepost/components/CitationList.js +114 -95
  4. package/dist/theculturepost/components/CitationList.js.map +1 -1
  5. package/dist/theculturepost/components/SourceScanLink.d.ts +25 -0
  6. package/dist/theculturepost/components/SourceScanLink.d.ts.map +1 -0
  7. package/dist/theculturepost/components/SourceScanLink.js +36 -0
  8. package/dist/theculturepost/components/SourceScanLink.js.map +1 -0
  9. package/dist/theculturepost/components/index.d.ts +1 -0
  10. package/dist/theculturepost/components/index.d.ts.map +1 -1
  11. package/dist/theculturepost/components/index.js +1 -0
  12. package/dist/theculturepost/hooks/useTr.js +2 -2
  13. package/dist/theculturepost/hooks/useTr.js.map +1 -1
  14. package/dist/theculturepost/pages/HomePage.d.ts.map +1 -1
  15. package/dist/theculturepost/pages/HomePage.js +145 -127
  16. package/dist/theculturepost/pages/HomePage.js.map +1 -1
  17. package/dist/theculturepost/pages/governance/GovernancePage.d.ts +3 -1
  18. package/dist/theculturepost/pages/governance/GovernancePage.d.ts.map +1 -1
  19. package/dist/theculturepost/pages/governance/GovernancePage.js +122 -99
  20. package/dist/theculturepost/pages/governance/GovernancePage.js.map +1 -1
  21. package/dist/theculturepost/pages/stories/StoryDetailPage.d.ts +3 -0
  22. package/dist/theculturepost/pages/stories/StoryDetailPage.d.ts.map +1 -1
  23. package/dist/theculturepost/pages/stories/StoryDetailPage.js +202 -132
  24. package/dist/theculturepost/pages/stories/StoryDetailPage.js.map +1 -1
  25. package/dist/theculturepost/translations/ar.d.ts +43 -0
  26. package/dist/theculturepost/translations/ar.d.ts.map +1 -1
  27. package/dist/theculturepost/translations/ar.js +43 -0
  28. package/dist/theculturepost/translations/ar.js.map +1 -1
  29. package/dist/theculturepost/translations/en.d.ts +43 -0
  30. package/dist/theculturepost/translations/en.d.ts.map +1 -1
  31. package/dist/theculturepost/translations/en.js +43 -0
  32. package/dist/theculturepost/translations/en.js.map +1 -1
  33. package/dist/theculturepost/translations/es.d.ts +43 -0
  34. package/dist/theculturepost/translations/es.d.ts.map +1 -1
  35. package/dist/theculturepost/translations/es.js +43 -0
  36. package/dist/theculturepost/translations/es.js.map +1 -1
  37. package/dist/theculturepost/translations/hi.d.ts +43 -0
  38. package/dist/theculturepost/translations/hi.d.ts.map +1 -1
  39. package/dist/theculturepost/translations/hi.js +43 -0
  40. package/dist/theculturepost/translations/hi.js.map +1 -1
  41. package/dist/theculturepost/translations/ta.d.ts +43 -0
  42. package/dist/theculturepost/translations/ta.d.ts.map +1 -1
  43. package/dist/theculturepost/translations/ta.js +43 -0
  44. package/dist/theculturepost/translations/ta.js.map +1 -1
  45. package/dist/theculturepost/translations/zh.d.ts +43 -0
  46. package/dist/theculturepost/translations/zh.d.ts.map +1 -1
  47. package/dist/theculturepost/translations/zh.js +43 -0
  48. package/dist/theculturepost/translations/zh.js.map +1 -1
  49. package/package.json +2 -2
@@ -6,16 +6,17 @@ import { LoadingView as r } from "../components/StateViews.js";
6
6
  import { formatNumber as i, formatRelativeTime as a } from "../utils/formatters.js";
7
7
  import { OverlayBadge as o } from "../components/OverlayBadge.js";
8
8
  import { useTcpCollections as s, useTcpDiscussions as c, useTcpStories as l, useTcpTopics as u } from "../hooks/useTcpApi.js";
9
+ import { useTr as d } from "../hooks/useTr.js";
9
10
  import "../hooks/index.js";
10
- import { StoryCard as d } from "../components/StoryCard.js";
11
- import { TopicCard as f } from "../components/TopicCard.js";
12
- import { EmptyState as p } from "../components/EmptyState.js";
13
- import { ArrowRight as m, BookOpen as h, Compass as g, HeartHandshake as _, Layers as v, Library as y, MessagesSquare as b } from "lucide-react";
14
- import { jsx as x, jsxs as S } from "react/jsx-runtime";
15
- import { Button as C } from "@burdenoff/fe-libs/ui";
11
+ import { StoryCard as f } from "../components/StoryCard.js";
12
+ import { TopicCard as p } from "../components/TopicCard.js";
13
+ import { EmptyState as m } from "../components/EmptyState.js";
14
+ import { ArrowRight as h, BookOpen as g, Compass as _, HeartHandshake as v, Layers as y, Library as b, MessagesSquare as x } from "lucide-react";
15
+ import { jsx as S, jsxs as C } from "react/jsx-runtime";
16
+ import { Button as w } from "@burdenoff/fe-libs/ui";
16
17
  //#region src/theculturepost/pages/HomePage.tsx
17
- function w({ label: e, onClick: t }) {
18
- return /* @__PURE__ */ S(C, {
18
+ function T({ label: e, onClick: t }) {
19
+ return /* @__PURE__ */ C(w, {
19
20
  variant: "ghost",
20
21
  size: "sm",
21
22
  onClick: t,
@@ -23,24 +24,24 @@ function w({ label: e, onClick: t }) {
23
24
  children: [
24
25
  e,
25
26
  " ",
26
- /* @__PURE__ */ x(m, {
27
+ /* @__PURE__ */ S(h, {
27
28
  className: "ml-1 h-4 w-4",
28
29
  "aria-hidden": "true"
29
30
  })
30
31
  ]
31
32
  });
32
33
  }
33
- function T({ title: e, description: t, action: n, children: r }) {
34
- return /* @__PURE__ */ S("section", {
34
+ function E({ title: e, description: t, action: n, children: r }) {
35
+ return /* @__PURE__ */ C("section", {
35
36
  className: "flex flex-col gap-4",
36
- children: [/* @__PURE__ */ S("div", {
37
+ children: [/* @__PURE__ */ C("div", {
37
38
  className: "flex items-end justify-between gap-3 border-b border-border-seam pb-3",
38
- children: [/* @__PURE__ */ S("div", {
39
+ children: [/* @__PURE__ */ C("div", {
39
40
  className: "min-w-0",
40
- children: [/* @__PURE__ */ x("h2", {
41
+ children: [/* @__PURE__ */ S("h2", {
41
42
  className: "font-display text-xl font-semibold leading-tight text-text-primary sm:text-2xl",
42
43
  children: e
43
- }), t && /* @__PURE__ */ x("p", {
44
+ }), t && /* @__PURE__ */ S("p", {
44
45
  className: "mt-1 text-sm text-text-secondary",
45
46
  children: t
46
47
  })]
@@ -48,178 +49,195 @@ function T({ title: e, description: t, action: n, children: r }) {
48
49
  }), r]
49
50
  });
50
51
  }
51
- function E({ title: e, action: t, children: n }) {
52
- return /* @__PURE__ */ S("section", {
52
+ function D({ title: e, action: t, children: n }) {
53
+ return /* @__PURE__ */ C("section", {
53
54
  className: "rounded-2xl border border-border-seam bg-bg-surface p-4",
54
- children: [/* @__PURE__ */ S("div", {
55
+ children: [/* @__PURE__ */ C("div", {
55
56
  className: "mb-3 flex items-center justify-between gap-2",
56
- children: [/* @__PURE__ */ x("h3", {
57
+ children: [/* @__PURE__ */ S("h3", {
57
58
  className: "text-xs font-semibold uppercase tracking-[0.12em] text-text-secondary",
58
59
  children: e
59
60
  }), t]
60
61
  }), n]
61
62
  });
62
63
  }
63
- function D({ discussion: e, onOpen: t }) {
64
- return /* @__PURE__ */ S("button", {
64
+ function O({ discussion: e, onOpen: t }) {
65
+ let n = d();
66
+ return /* @__PURE__ */ C("button", {
65
67
  type: "button",
66
68
  onClick: t,
67
69
  className: "group flex w-full items-start gap-3 rounded-xl px-2 py-2.5 text-left transition-colors hover:bg-bg-sunken",
68
- children: [/* @__PURE__ */ x("span", {
70
+ children: [/* @__PURE__ */ S("span", {
69
71
  className: "mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-accent",
70
72
  "aria-hidden": "true",
71
- children: /* @__PURE__ */ x(e.isInterfaith ? _ : b, { className: "h-4 w-4" })
72
- }), /* @__PURE__ */ S("span", {
73
+ children: /* @__PURE__ */ S(e.isInterfaith ? v : x, { className: "h-4 w-4" })
74
+ }), /* @__PURE__ */ C("span", {
73
75
  className: "min-w-0 flex-1",
74
- children: [/* @__PURE__ */ x("span", {
76
+ children: [/* @__PURE__ */ S("span", {
75
77
  className: "line-clamp-2 text-sm font-medium text-text-primary group-hover:text-accent",
76
78
  children: e.title
77
- }), /* @__PURE__ */ S("span", {
79
+ }), /* @__PURE__ */ C("span", {
78
80
  className: "mt-1 flex flex-wrap items-center gap-x-2.5 gap-y-1 text-xs text-text-tertiary",
79
81
  children: [
80
- e.isInterfaith && /* @__PURE__ */ S("span", {
82
+ e.isInterfaith && /* @__PURE__ */ C("span", {
81
83
  className: "inline-flex items-center gap-1 rounded-full bg-[var(--color-accent-soft)] px-1.5 py-0.5 font-medium text-text-primary",
82
- children: [/* @__PURE__ */ x(_, {
83
- className: "h-3 w-3",
84
- "aria-hidden": "true"
85
- }), " Interfaith"]
84
+ children: [
85
+ /* @__PURE__ */ S(v, {
86
+ className: "h-3 w-3",
87
+ "aria-hidden": "true"
88
+ }),
89
+ " ",
90
+ n("home.interfaith", "Interfaith")
91
+ ]
86
92
  }),
87
- /* @__PURE__ */ S("span", {
93
+ /* @__PURE__ */ C("span", {
88
94
  className: "inline-flex items-center gap-1",
89
- children: [/* @__PURE__ */ x(b, {
95
+ children: [/* @__PURE__ */ S(x, {
90
96
  className: "h-3 w-3",
91
97
  "aria-hidden": "true"
92
98
  }), i(e.replyCount)]
93
99
  }),
94
- /* @__PURE__ */ x("span", { children: a(e.updatedAt) })
100
+ /* @__PURE__ */ S("span", { children: a(e.updatedAt) })
95
101
  ]
96
102
  })]
97
103
  })]
98
104
  });
99
105
  }
100
- function O({ collection: e, onOpen: n }) {
101
- return /* @__PURE__ */ S("button", {
106
+ function k({ collection: e, onOpen: n }) {
107
+ return /* @__PURE__ */ C("button", {
102
108
  type: "button",
103
109
  onClick: n,
104
- "aria-label": `Open ${e.name}`,
110
+ "aria-label": d()("archive.openCollection", "Open {{name}}", { name: e.name }),
105
111
  className: "group flex flex-col gap-2 text-left",
106
- children: [/* @__PURE__ */ S("span", {
112
+ children: [/* @__PURE__ */ C("span", {
107
113
  className: "relative block aspect-square w-full overflow-hidden rounded-xl",
108
- children: [/* @__PURE__ */ x(t, {
114
+ children: [/* @__PURE__ */ S(t, {
109
115
  fileId: e.cover?.id,
110
116
  alt: e.name,
111
117
  rounded: "rounded-none",
112
118
  className: "h-full w-full transition-transform duration-500 group-hover:scale-[1.03]",
113
- icon: /* @__PURE__ */ x(y, { className: "h-6 w-6" })
114
- }), /* @__PURE__ */ x(o, {
119
+ icon: /* @__PURE__ */ S(b, { className: "h-6 w-6" })
120
+ }), /* @__PURE__ */ S(o, {
115
121
  position: "bottom-right",
116
- icon: /* @__PURE__ */ x(v, { className: "h-3 w-3" }),
122
+ icon: /* @__PURE__ */ S(y, { className: "h-3 w-3" }),
117
123
  children: i(e.itemCount)
118
124
  })]
119
- }), /* @__PURE__ */ S("span", {
125
+ }), /* @__PURE__ */ C("span", {
120
126
  className: "min-w-0",
121
- children: [/* @__PURE__ */ x("span", {
127
+ children: [/* @__PURE__ */ S("span", {
122
128
  className: "block truncate font-display text-sm font-semibold text-text-primary group-hover:text-accent",
123
129
  children: e.name
124
- }), e.tradition && /* @__PURE__ */ x("span", {
130
+ }), e.tradition && /* @__PURE__ */ S("span", {
125
131
  className: "block truncate text-xs text-text-tertiary",
126
132
  children: e.tradition
127
133
  })]
128
134
  })]
129
135
  });
130
136
  }
131
- function k() {
132
- let { navigateTo: t } = e(), i = u({ pagination: { limit: 6 } }), a = l({
137
+ function A() {
138
+ let { navigateTo: t } = e(), i = d(), a = u({ pagination: { limit: 6 } }), o = l({
133
139
  status: "PUBLISHED",
134
140
  pagination: { limit: 6 }
135
- }), o = c({
141
+ }), h = c({
136
142
  status: "APPROVED",
137
143
  pagination: { limit: 6 }
138
- }), m = s({ limit: 6 }), _ = i.data?.items ?? [], v = _.filter((e) => e.isFeatured), k = (v.length > 0 ? v : _).slice(0, 4), A = a.data?.items ?? [], j = o.data?.items ?? [], M = m.data ?? [], N = i.isLoading && a.isLoading && o.isLoading && m.isLoading, P = !i.isLoading && !a.isLoading && !o.isLoading && !m.isLoading && k.length === 0 && A.length === 0 && j.length === 0 && M.length === 0;
139
- return /* @__PURE__ */ x("div", {
144
+ }), v = s({ limit: 6 }), y = a.data?.items ?? [], A = y.filter((e) => e.isFeatured), j = (A.length > 0 ? A : y).slice(0, 4), M = o.data?.items ?? [], N = h.data?.items ?? [], P = v.data ?? [], F = a.isLoading && o.isLoading && h.isLoading && v.isLoading, I = !a.isLoading && !o.isLoading && !h.isLoading && !v.isLoading && j.length === 0 && M.length === 0 && N.length === 0 && P.length === 0;
145
+ return /* @__PURE__ */ S("div", {
140
146
  className: "flex h-full flex-col",
141
- children: /* @__PURE__ */ x("div", {
147
+ children: /* @__PURE__ */ S("div", {
142
148
  className: "flex-1 overflow-auto",
143
- children: /* @__PURE__ */ S("div", {
149
+ children: /* @__PURE__ */ C("div", {
144
150
  className: "mx-auto flex max-w-7xl flex-col gap-8 p-4 sm:p-6",
145
- children: [/* @__PURE__ */ x("div", {
151
+ children: [/* @__PURE__ */ S("div", {
146
152
  "data-tour": "theculturepost-home-hero",
147
- children: /* @__PURE__ */ x(n, {
148
- eyebrow: "TheCulturePost",
149
- title: "Culture, religion, values & history — told with care",
150
- description: "A space for respectful stories and thoughtful conversations that connect us across traditions and time — grounded in the record.",
151
- actions: /* @__PURE__ */ S(C, {
153
+ children: /* @__PURE__ */ S(n, {
154
+ eyebrow: i("home.hero.eyebrow", "TheCulturePost"),
155
+ title: i("home.hero.title", "Culture, religion, values & history — told with care"),
156
+ description: i("home.hero.description", "A space for respectful stories and thoughtful conversations that connect us across traditions and time — grounded in the record."),
157
+ actions: /* @__PURE__ */ C(w, {
152
158
  size: "lg",
153
159
  onClick: () => t("stories"),
154
- children: [/* @__PURE__ */ x(h, {
155
- className: "mr-1.5 h-4 w-4",
156
- "aria-hidden": "true"
157
- }), " Read stories"]
160
+ children: [
161
+ /* @__PURE__ */ S(g, {
162
+ className: "mr-1.5 h-4 w-4",
163
+ "aria-hidden": "true"
164
+ }),
165
+ " ",
166
+ i("home.hero.readStories", "Read stories")
167
+ ]
158
168
  })
159
169
  })
160
- }), N ? /* @__PURE__ */ x(r, { label: "Loading the latest…" }) : P ? /* @__PURE__ */ x(p, {
170
+ }), F ? /* @__PURE__ */ S(r, { label: i("home.loading", "Loading the latest…") }) : I ? /* @__PURE__ */ S(m, {
161
171
  illustration: "onboarding",
162
- icon: /* @__PURE__ */ x(h, { className: "h-10 w-10" }),
163
- title: "Welcome to TheCulturePost",
164
- description: "This publication is just getting started. Curate a topic, draft a story, or begin building the archive.",
165
- action: /* @__PURE__ */ S("div", {
172
+ icon: /* @__PURE__ */ S(g, { className: "h-10 w-10" }),
173
+ title: i("home.welcome.title", "Welcome to TheCulturePost"),
174
+ description: i("home.welcome.description", "This publication is just getting started. Curate a topic, draft a story, or begin building the archive."),
175
+ action: /* @__PURE__ */ C("div", {
166
176
  className: "flex flex-wrap items-center justify-center gap-3",
167
- children: [/* @__PURE__ */ S(C, {
177
+ children: [/* @__PURE__ */ C(w, {
168
178
  onClick: () => t("stories"),
169
- children: [/* @__PURE__ */ x(h, {
170
- className: "mr-1.5 h-4 w-4",
171
- "aria-hidden": "true"
172
- }), " Draft a story"]
173
- }), /* @__PURE__ */ S(C, {
179
+ children: [
180
+ /* @__PURE__ */ S(g, {
181
+ className: "mr-1.5 h-4 w-4",
182
+ "aria-hidden": "true"
183
+ }),
184
+ " ",
185
+ i("home.welcome.draftStory", "Draft a story")
186
+ ]
187
+ }), /* @__PURE__ */ C(w, {
174
188
  variant: "outline",
175
189
  onClick: () => t("topics"),
176
- children: [/* @__PURE__ */ x(g, {
177
- className: "mr-1.5 h-4 w-4",
178
- "aria-hidden": "true"
179
- }), " Curate a topic"]
190
+ children: [
191
+ /* @__PURE__ */ S(_, {
192
+ className: "mr-1.5 h-4 w-4",
193
+ "aria-hidden": "true"
194
+ }),
195
+ " ",
196
+ i("home.welcome.curateTopic", "Curate a topic")
197
+ ]
180
198
  })]
181
199
  })
182
- }) : /* @__PURE__ */ S("div", {
200
+ }) : /* @__PURE__ */ C("div", {
183
201
  className: "grid gap-8 lg:grid-cols-3",
184
- children: [/* @__PURE__ */ S("div", {
202
+ children: [/* @__PURE__ */ C("div", {
185
203
  className: "flex flex-col gap-10 lg:col-span-2",
186
- children: [/* @__PURE__ */ x(T, {
187
- title: "Featured topics",
188
- description: "Curated subjects across culture, faith, history and heritage.",
189
- action: /* @__PURE__ */ x(w, {
190
- label: "All topics",
204
+ children: [/* @__PURE__ */ S(E, {
205
+ title: i("home.topics.title", "Featured topics"),
206
+ description: i("home.topics.description", "Curated subjects across culture, faith, history and heritage."),
207
+ action: /* @__PURE__ */ S(T, {
208
+ label: i("home.topics.allTopics", "All topics"),
191
209
  onClick: () => t("topics")
192
210
  }),
193
- children: /* @__PURE__ */ x("div", {
211
+ children: /* @__PURE__ */ S("div", {
194
212
  "data-tour": "theculturepost-home-topics",
195
- children: k.length === 0 ? /* @__PURE__ */ x(p, {
196
- icon: /* @__PURE__ */ x(g, { className: "h-9 w-9" }),
197
- title: "No topics yet",
198
- description: "Curate the first topic to organise the publication."
199
- }) : /* @__PURE__ */ x("div", {
213
+ children: j.length === 0 ? /* @__PURE__ */ S(m, {
214
+ icon: /* @__PURE__ */ S(_, { className: "h-9 w-9" }),
215
+ title: i("home.topics.emptyTitle", "No topics yet"),
216
+ description: i("home.topics.emptyDescription", "Curate the first topic to organise the publication.")
217
+ }) : /* @__PURE__ */ S("div", {
200
218
  className: "grid gap-4 sm:grid-cols-2",
201
- children: k.map((e) => /* @__PURE__ */ x(f, {
219
+ children: j.map((e) => /* @__PURE__ */ S(p, {
202
220
  topic: e,
203
221
  onOpen: () => t(`topics/${e.id}`)
204
222
  }, e.id))
205
223
  })
206
224
  })
207
- }), /* @__PURE__ */ x(T, {
208
- title: "Latest published stories",
209
- description: "Freshly published pieces from the newsroom.",
210
- action: /* @__PURE__ */ x(w, {
211
- label: "All stories",
225
+ }), /* @__PURE__ */ S(E, {
226
+ title: i("home.stories.title", "Latest published stories"),
227
+ description: i("home.stories.description", "Freshly published pieces from the newsroom."),
228
+ action: /* @__PURE__ */ S(T, {
229
+ label: i("home.stories.allStories", "All stories"),
212
230
  onClick: () => t("stories")
213
231
  }),
214
- children: /* @__PURE__ */ x("div", {
232
+ children: /* @__PURE__ */ S("div", {
215
233
  "data-tour": "theculturepost-home-stories",
216
- children: A.length === 0 ? /* @__PURE__ */ x(p, {
217
- icon: /* @__PURE__ */ x(h, { className: "h-9 w-9" }),
218
- title: "No published stories yet",
219
- description: "Draft a story and move it through the editorial lifecycle to publish."
220
- }) : /* @__PURE__ */ x("div", {
234
+ children: M.length === 0 ? /* @__PURE__ */ S(m, {
235
+ icon: /* @__PURE__ */ S(g, { className: "h-9 w-9" }),
236
+ title: i("home.stories.emptyTitle", "No published stories yet"),
237
+ description: i("home.stories.emptyDescription", "Draft a story and move it through the editorial lifecycle to publish.")
238
+ }) : /* @__PURE__ */ S("div", {
221
239
  className: "grid gap-4 sm:grid-cols-2",
222
- children: A.map((e) => /* @__PURE__ */ x(d, {
240
+ children: M.map((e) => /* @__PURE__ */ S(f, {
223
241
  story: e,
224
242
  hideStatus: !0,
225
243
  onOpen: () => t(`stories/${e.id}`)
@@ -227,47 +245,47 @@ function k() {
227
245
  })
228
246
  })
229
247
  })]
230
- }), /* @__PURE__ */ S("aside", {
248
+ }), /* @__PURE__ */ C("aside", {
231
249
  className: "flex flex-col gap-6",
232
- children: [/* @__PURE__ */ x("div", {
250
+ children: [/* @__PURE__ */ S("div", {
233
251
  "data-tour": "theculturepost-home-discussions",
234
- children: /* @__PURE__ */ x(E, {
235
- title: "Active discussions",
236
- action: /* @__PURE__ */ x("button", {
252
+ children: /* @__PURE__ */ S(D, {
253
+ title: i("home.discussions.title", "Active discussions"),
254
+ action: /* @__PURE__ */ S("button", {
237
255
  type: "button",
238
256
  onClick: () => t("discussions"),
239
257
  className: "text-xs font-medium text-accent hover:underline",
240
- children: "View all"
258
+ children: i("home.discussions.viewAll", "View all")
241
259
  }),
242
- children: j.length === 0 ? /* @__PURE__ */ x(p, {
243
- icon: /* @__PURE__ */ x(b, { className: "h-8 w-8" }),
244
- title: "No open discussions",
245
- description: "Open a discussion to invite thoughtful perspectives."
246
- }) : /* @__PURE__ */ x("div", {
260
+ children: N.length === 0 ? /* @__PURE__ */ S(m, {
261
+ icon: /* @__PURE__ */ S(x, { className: "h-8 w-8" }),
262
+ title: i("home.discussions.emptyTitle", "No open discussions"),
263
+ description: i("home.discussions.emptyDescription", "Open a discussion to invite thoughtful perspectives.")
264
+ }) : /* @__PURE__ */ S("div", {
247
265
  className: "-mx-2 flex flex-col",
248
- children: j.map((e) => /* @__PURE__ */ x(D, {
266
+ children: N.map((e) => /* @__PURE__ */ S(O, {
249
267
  discussion: e,
250
268
  onOpen: () => t(`discussions/${e.id}`)
251
269
  }, e.id))
252
270
  })
253
271
  })
254
- }), /* @__PURE__ */ x("div", {
272
+ }), /* @__PURE__ */ S("div", {
255
273
  "data-tour": "theculturepost-home-archive",
256
- children: /* @__PURE__ */ x(E, {
257
- title: "From the archive",
258
- action: /* @__PURE__ */ x("button", {
274
+ children: /* @__PURE__ */ S(D, {
275
+ title: i("home.archive.title", "From the archive"),
276
+ action: /* @__PURE__ */ S("button", {
259
277
  type: "button",
260
278
  onClick: () => t("archive"),
261
279
  className: "text-xs font-medium text-accent hover:underline",
262
- children: "View all"
280
+ children: i("home.archive.viewAll", "View all")
263
281
  }),
264
- children: M.length === 0 ? /* @__PURE__ */ x(p, {
265
- icon: /* @__PURE__ */ x(y, { className: "h-8 w-8" }),
266
- title: "The archive is empty",
267
- description: "Create a collection to begin preserving heritage."
268
- }) : /* @__PURE__ */ x("div", {
282
+ children: P.length === 0 ? /* @__PURE__ */ S(m, {
283
+ icon: /* @__PURE__ */ S(b, { className: "h-8 w-8" }),
284
+ title: i("home.archive.emptyTitle", "The archive is empty"),
285
+ description: i("home.archive.emptyDescription", "Create a collection to begin preserving heritage.")
286
+ }) : /* @__PURE__ */ S("div", {
269
287
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
270
- children: M.map((e) => /* @__PURE__ */ x(O, {
288
+ children: P.map((e) => /* @__PURE__ */ S(k, {
271
289
  collection: e,
272
290
  onOpen: () => t(`archive/collections/${e.id}`)
273
291
  }, e.id))
@@ -281,6 +299,6 @@ function k() {
281
299
  });
282
300
  }
283
301
  //#endregion
284
- export { k as HomePage };
302
+ export { A as HomePage };
285
303
 
286
304
  //# sourceMappingURL=HomePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/theculturepost/pages/HomePage.tsx"],"sourcesContent":["/**\n * HomePage — the editorial-magazine landing for TheCulturePost.\n * @module theculturepost/pages\n *\n * Layout: a decorative {@link PageHero}, then a two-column magazine grid —\n * - main column: \"Featured topics\" ({@link TopicCard}) + \"Latest published\n * stories\" ({@link StoryCard} status:PUBLISHED)\n * - right rail (compact): \"Active discussions\" (status:APPROVED) rows +\n * \"From the archive\" collection thumbnails.\n *\n * Every surface links into its section and shows an honest empty state when it\n * has no data. Only real schema fields are rendered — no fabricated metrics,\n * avatars or imagery (topics/discussions use token-only decorative motifs).\n */\n\nimport type { ReactNode } from 'react';\nimport {\n BookOpen,\n Compass,\n MessagesSquare,\n Library,\n Layers,\n HeartHandshake,\n ArrowRight,\n} from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { PageHero } from '../components/PageHero';\nimport { LoadingView } from '../components/StateViews';\nimport { StoryCard } from '../components/StoryCard';\nimport { TopicCard } from '../components/TopicCard';\nimport { CoverImage } from '../components/CoverImage';\nimport { OverlayBadge } from '../components/OverlayBadge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useTcpTopics, useTcpStories, useTcpDiscussions, useTcpCollections } from '../hooks';\nimport { useTheCulturePost } from '../context';\nimport { formatNumber, formatRelativeTime } from '../utils/formatters';\nimport type { TcpDiscussion, TcpCollection } from '../types';\n\n// ---------------------------------------------------------------------------\n// Small presentational helpers (home-only; kept inline)\n// ---------------------------------------------------------------------------\n\nfunction SectionLink({ label, onClick }: { label: string; onClick: () => void }) {\n return (\n <Button variant=\"ghost\" size=\"sm\" onClick={onClick} className=\"shrink-0\">\n {label} <ArrowRight className=\"ml-1 h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n );\n}\n\n/** A magazine section header (serif) for the main reading column. */\nfunction MagSection({\n title,\n description,\n action,\n children,\n}: {\n title: string;\n description?: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"flex flex-col gap-4\">\n <div className=\"flex items-end justify-between gap-3 border-b border-border-seam pb-3\">\n <div className=\"min-w-0\">\n <h2 className=\"font-display text-xl font-semibold leading-tight text-text-primary sm:text-2xl\">\n {title}\n </h2>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {action}\n </div>\n {children}\n </section>\n );\n}\n\n/** A bordered panel for the compact right rail. */\nfunction RailSection({\n title,\n action,\n children,\n}: {\n title: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"rounded-2xl border border-border-seam bg-bg-surface p-4\">\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-[0.12em] text-text-secondary\">\n {title}\n </h3>\n {action}\n </div>\n {children}\n </section>\n );\n}\n\n/** A compact discussion row for the rail — real fields only. */\nfunction DiscussionRow({ discussion, onOpen }: { discussion: TcpDiscussion; onOpen: () => void }) {\n const Icon = discussion.isInterfaith ? HeartHandshake : MessagesSquare;\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className=\"group flex w-full items-start gap-3 rounded-xl px-2 py-2.5 text-left transition-colors hover:bg-bg-sunken\"\n >\n <span\n className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-accent\"\n aria-hidden=\"true\"\n >\n <Icon className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"line-clamp-2 text-sm font-medium text-text-primary group-hover:text-accent\">\n {discussion.title}\n </span>\n <span className=\"mt-1 flex flex-wrap items-center gap-x-2.5 gap-y-1 text-xs text-text-tertiary\">\n {discussion.isInterfaith && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-[var(--color-accent-soft)] px-1.5 py-0.5 font-medium text-text-primary\">\n <HeartHandshake className=\"h-3 w-3\" aria-hidden=\"true\" /> Interfaith\n </span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n <MessagesSquare className=\"h-3 w-3\" aria-hidden=\"true\" />\n {formatNumber(discussion.replyCount)}\n </span>\n <span>{formatRelativeTime(discussion.updatedAt)}</span>\n </span>\n </span>\n </button>\n );\n}\n\n/** A compact archive-collection thumbnail for the rail (real itemCount only). */\nfunction ArchiveThumb({ collection, onOpen }: { collection: TcpCollection; onOpen: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n aria-label={`Open ${collection.name}`}\n className=\"group flex flex-col gap-2 text-left\"\n >\n <span className=\"relative block aspect-square w-full overflow-hidden rounded-xl\">\n <CoverImage\n fileId={collection.cover?.id}\n alt={collection.name}\n rounded=\"rounded-none\"\n className=\"h-full w-full transition-transform duration-500 group-hover:scale-[1.03]\"\n icon={<Library className=\"h-6 w-6\" />}\n />\n <OverlayBadge position=\"bottom-right\" icon={<Layers className=\"h-3 w-3\" />}>\n {formatNumber(collection.itemCount)}\n </OverlayBadge>\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate font-display text-sm font-semibold text-text-primary group-hover:text-accent\">\n {collection.name}\n </span>\n {collection.tradition && (\n <span className=\"block truncate text-xs text-text-tertiary\">{collection.tradition}</span>\n )}\n </span>\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Page\n// ---------------------------------------------------------------------------\n\nexport function HomePage() {\n const { navigateTo } = useTheCulturePost();\n\n const topicsQuery = useTcpTopics({ pagination: { limit: 6 } });\n const storiesQuery = useTcpStories({ status: 'PUBLISHED', pagination: { limit: 6 } });\n const discussionsQuery = useTcpDiscussions({ status: 'APPROVED', pagination: { limit: 6 } });\n const collectionsQuery = useTcpCollections({ limit: 6 });\n\n const topics = topicsQuery.data?.items ?? [];\n const featuredTopics = topics.filter((t) => t.isFeatured);\n const shownTopics = (featuredTopics.length > 0 ? featuredTopics : topics).slice(0, 4);\n const stories = storiesQuery.data?.items ?? [];\n const discussions = discussionsQuery.data?.items ?? [];\n const collections = collectionsQuery.data ?? [];\n\n const anythingLoading =\n topicsQuery.isLoading &&\n storiesQuery.isLoading &&\n discussionsQuery.isLoading &&\n collectionsQuery.isLoading;\n\n const everythingEmpty =\n !topicsQuery.isLoading &&\n !storiesQuery.isLoading &&\n !discussionsQuery.isLoading &&\n !collectionsQuery.isLoading &&\n shownTopics.length === 0 &&\n stories.length === 0 &&\n discussions.length === 0 &&\n collections.length === 0;\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex-1 overflow-auto\">\n <div className=\"mx-auto flex max-w-7xl flex-col gap-8 p-4 sm:p-6\">\n <div data-tour=\"theculturepost-home-hero\">\n <PageHero\n eyebrow=\"TheCulturePost\"\n title=\"Culture, religion, values & history — told with care\"\n description=\"A space for respectful stories and thoughtful conversations that connect us across traditions and time — grounded in the record.\"\n actions={\n <Button size=\"lg\" onClick={() => navigateTo('stories')}>\n <BookOpen className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" /> Read stories\n </Button>\n }\n />\n </div>\n\n {anythingLoading ? (\n <LoadingView label=\"Loading the latest…\" />\n ) : everythingEmpty ? (\n <EmptyState\n illustration=\"onboarding\"\n icon={<BookOpen className=\"h-10 w-10\" />}\n title=\"Welcome to TheCulturePost\"\n description=\"This publication is just getting started. Curate a topic, draft a story, or begin building the archive.\"\n action={\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <Button onClick={() => navigateTo('stories')}>\n <BookOpen className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" /> Draft a story\n </Button>\n <Button variant=\"outline\" onClick={() => navigateTo('topics')}>\n <Compass className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" /> Curate a topic\n </Button>\n </div>\n }\n />\n ) : (\n <div className=\"grid gap-8 lg:grid-cols-3\">\n {/* Main reading column */}\n <div className=\"flex flex-col gap-10 lg:col-span-2\">\n {/* Featured topics */}\n <MagSection\n title=\"Featured topics\"\n description=\"Curated subjects across culture, faith, history and heritage.\"\n action={<SectionLink label=\"All topics\" onClick={() => navigateTo('topics')} />}\n >\n <div data-tour=\"theculturepost-home-topics\">\n {shownTopics.length === 0 ? (\n <EmptyState\n icon={<Compass className=\"h-9 w-9\" />}\n title=\"No topics yet\"\n description=\"Curate the first topic to organise the publication.\"\n />\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {shownTopics.map((topic) => (\n <TopicCard\n key={topic.id}\n topic={topic}\n onOpen={() => navigateTo(`topics/${topic.id}`)}\n />\n ))}\n </div>\n )}\n </div>\n </MagSection>\n\n {/* Latest published stories */}\n <MagSection\n title=\"Latest published stories\"\n description=\"Freshly published pieces from the newsroom.\"\n action={<SectionLink label=\"All stories\" onClick={() => navigateTo('stories')} />}\n >\n <div data-tour=\"theculturepost-home-stories\">\n {stories.length === 0 ? (\n <EmptyState\n icon={<BookOpen className=\"h-9 w-9\" />}\n title=\"No published stories yet\"\n description=\"Draft a story and move it through the editorial lifecycle to publish.\"\n />\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {stories.map((story) => (\n <StoryCard\n key={story.id}\n story={story}\n hideStatus\n onOpen={() => navigateTo(`stories/${story.id}`)}\n />\n ))}\n </div>\n )}\n </div>\n </MagSection>\n </div>\n\n {/* Compact right rail */}\n <aside className=\"flex flex-col gap-6\">\n {/* Active discussions */}\n <div data-tour=\"theculturepost-home-discussions\">\n <RailSection\n title=\"Active discussions\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('discussions')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n View all\n </button>\n }\n >\n {discussions.length === 0 ? (\n <EmptyState\n icon={<MessagesSquare className=\"h-8 w-8\" />}\n title=\"No open discussions\"\n description=\"Open a discussion to invite thoughtful perspectives.\"\n />\n ) : (\n <div className=\"-mx-2 flex flex-col\">\n {discussions.map((discussion) => (\n <DiscussionRow\n key={discussion.id}\n discussion={discussion}\n onOpen={() => navigateTo(`discussions/${discussion.id}`)}\n />\n ))}\n </div>\n )}\n </RailSection>\n </div>\n\n {/* From the archive */}\n <div data-tour=\"theculturepost-home-archive\">\n <RailSection\n title=\"From the archive\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('archive')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n View all\n </button>\n }\n >\n {collections.length === 0 ? (\n <EmptyState\n icon={<Library className=\"h-8 w-8\" />}\n title=\"The archive is empty\"\n description=\"Create a collection to begin preserving heritage.\"\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {collections.map((collection) => (\n <ArchiveThumb\n key={collection.id}\n collection={collection}\n onOpen={() => navigateTo(`archive/collections/${collection.id}`)}\n />\n ))}\n </div>\n )}\n </RailSection>\n </div>\n </aside>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/theculturepost/pages/HomePage.tsx"],"sourcesContent":["/**\n * HomePage — the editorial-magazine landing for TheCulturePost.\n * @module theculturepost/pages\n *\n * Layout: a decorative {@link PageHero}, then a two-column magazine grid —\n * - main column: \"Featured topics\" ({@link TopicCard}) + \"Latest published\n * stories\" ({@link StoryCard} status:PUBLISHED)\n * - right rail (compact): \"Active discussions\" (status:APPROVED) rows +\n * \"From the archive\" collection thumbnails.\n *\n * Every surface links into its section and shows an honest empty state when it\n * has no data. Only real schema fields are rendered — no fabricated metrics,\n * avatars or imagery (topics/discussions use token-only decorative motifs).\n */\n\nimport type { ReactNode } from 'react';\nimport {\n BookOpen,\n Compass,\n MessagesSquare,\n Library,\n Layers,\n HeartHandshake,\n ArrowRight,\n} from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { PageHero } from '../components/PageHero';\nimport { LoadingView } from '../components/StateViews';\nimport { StoryCard } from '../components/StoryCard';\nimport { TopicCard } from '../components/TopicCard';\nimport { CoverImage } from '../components/CoverImage';\nimport { OverlayBadge } from '../components/OverlayBadge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useTcpTopics, useTcpStories, useTcpDiscussions, useTcpCollections, useTr } from '../hooks';\nimport { useTheCulturePost } from '../context';\nimport { formatNumber, formatRelativeTime } from '../utils/formatters';\nimport type { TcpDiscussion, TcpCollection } from '../types';\n\n// ---------------------------------------------------------------------------\n// Small presentational helpers (home-only; kept inline)\n// ---------------------------------------------------------------------------\n\nfunction SectionLink({ label, onClick }: { label: string; onClick: () => void }) {\n return (\n <Button variant=\"ghost\" size=\"sm\" onClick={onClick} className=\"shrink-0\">\n {label} <ArrowRight className=\"ml-1 h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n );\n}\n\n/** A magazine section header (serif) for the main reading column. */\nfunction MagSection({\n title,\n description,\n action,\n children,\n}: {\n title: string;\n description?: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"flex flex-col gap-4\">\n <div className=\"flex items-end justify-between gap-3 border-b border-border-seam pb-3\">\n <div className=\"min-w-0\">\n <h2 className=\"font-display text-xl font-semibold leading-tight text-text-primary sm:text-2xl\">\n {title}\n </h2>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {action}\n </div>\n {children}\n </section>\n );\n}\n\n/** A bordered panel for the compact right rail. */\nfunction RailSection({\n title,\n action,\n children,\n}: {\n title: string;\n action?: ReactNode;\n children: ReactNode;\n}) {\n return (\n <section className=\"rounded-2xl border border-border-seam bg-bg-surface p-4\">\n <div className=\"mb-3 flex items-center justify-between gap-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-[0.12em] text-text-secondary\">\n {title}\n </h3>\n {action}\n </div>\n {children}\n </section>\n );\n}\n\n/** A compact discussion row for the rail — real fields only. */\nfunction DiscussionRow({ discussion, onOpen }: { discussion: TcpDiscussion; onOpen: () => void }) {\n const tr = useTr();\n const Icon = discussion.isInterfaith ? HeartHandshake : MessagesSquare;\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className=\"group flex w-full items-start gap-3 rounded-xl px-2 py-2.5 text-left transition-colors hover:bg-bg-sunken\"\n >\n <span\n className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-accent\"\n aria-hidden=\"true\"\n >\n <Icon className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"line-clamp-2 text-sm font-medium text-text-primary group-hover:text-accent\">\n {discussion.title}\n </span>\n <span className=\"mt-1 flex flex-wrap items-center gap-x-2.5 gap-y-1 text-xs text-text-tertiary\">\n {discussion.isInterfaith && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-[var(--color-accent-soft)] px-1.5 py-0.5 font-medium text-text-primary\">\n <HeartHandshake className=\"h-3 w-3\" aria-hidden=\"true\" />{' '}\n {tr('home.interfaith', 'Interfaith')}\n </span>\n )}\n <span className=\"inline-flex items-center gap-1\">\n <MessagesSquare className=\"h-3 w-3\" aria-hidden=\"true\" />\n {formatNumber(discussion.replyCount)}\n </span>\n <span>{formatRelativeTime(discussion.updatedAt)}</span>\n </span>\n </span>\n </button>\n );\n}\n\n/** A compact archive-collection thumbnail for the rail (real itemCount only). */\nfunction ArchiveThumb({ collection, onOpen }: { collection: TcpCollection; onOpen: () => void }) {\n const tr = useTr();\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n aria-label={tr('archive.openCollection', 'Open {{name}}', { name: collection.name })}\n className=\"group flex flex-col gap-2 text-left\"\n >\n <span className=\"relative block aspect-square w-full overflow-hidden rounded-xl\">\n <CoverImage\n fileId={collection.cover?.id}\n alt={collection.name}\n rounded=\"rounded-none\"\n className=\"h-full w-full transition-transform duration-500 group-hover:scale-[1.03]\"\n icon={<Library className=\"h-6 w-6\" />}\n />\n <OverlayBadge position=\"bottom-right\" icon={<Layers className=\"h-3 w-3\" />}>\n {formatNumber(collection.itemCount)}\n </OverlayBadge>\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate font-display text-sm font-semibold text-text-primary group-hover:text-accent\">\n {collection.name}\n </span>\n {collection.tradition && (\n <span className=\"block truncate text-xs text-text-tertiary\">{collection.tradition}</span>\n )}\n </span>\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Page\n// ---------------------------------------------------------------------------\n\nexport function HomePage() {\n const { navigateTo } = useTheCulturePost();\n const tr = useTr();\n\n const topicsQuery = useTcpTopics({ pagination: { limit: 6 } });\n const storiesQuery = useTcpStories({ status: 'PUBLISHED', pagination: { limit: 6 } });\n const discussionsQuery = useTcpDiscussions({ status: 'APPROVED', pagination: { limit: 6 } });\n const collectionsQuery = useTcpCollections({ limit: 6 });\n\n const topics = topicsQuery.data?.items ?? [];\n const featuredTopics = topics.filter((t) => t.isFeatured);\n const shownTopics = (featuredTopics.length > 0 ? featuredTopics : topics).slice(0, 4);\n const stories = storiesQuery.data?.items ?? [];\n const discussions = discussionsQuery.data?.items ?? [];\n const collections = collectionsQuery.data ?? [];\n\n const anythingLoading =\n topicsQuery.isLoading &&\n storiesQuery.isLoading &&\n discussionsQuery.isLoading &&\n collectionsQuery.isLoading;\n\n const everythingEmpty =\n !topicsQuery.isLoading &&\n !storiesQuery.isLoading &&\n !discussionsQuery.isLoading &&\n !collectionsQuery.isLoading &&\n shownTopics.length === 0 &&\n stories.length === 0 &&\n discussions.length === 0 &&\n collections.length === 0;\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex-1 overflow-auto\">\n <div className=\"mx-auto flex max-w-7xl flex-col gap-8 p-4 sm:p-6\">\n <div data-tour=\"theculturepost-home-hero\">\n <PageHero\n eyebrow={tr('home.hero.eyebrow', 'TheCulturePost')}\n title={tr('home.hero.title', 'Culture, religion, values & history — told with care')}\n description={tr(\n 'home.hero.description',\n 'A space for respectful stories and thoughtful conversations that connect us across traditions and time — grounded in the record.'\n )}\n actions={\n <Button size=\"lg\" onClick={() => navigateTo('stories')}>\n <BookOpen className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" />{' '}\n {tr('home.hero.readStories', 'Read stories')}\n </Button>\n }\n />\n </div>\n\n {anythingLoading ? (\n <LoadingView label={tr('home.loading', 'Loading the latest…')} />\n ) : everythingEmpty ? (\n <EmptyState\n illustration=\"onboarding\"\n icon={<BookOpen className=\"h-10 w-10\" />}\n title={tr('home.welcome.title', 'Welcome to TheCulturePost')}\n description={tr(\n 'home.welcome.description',\n 'This publication is just getting started. Curate a topic, draft a story, or begin building the archive.'\n )}\n action={\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n <Button onClick={() => navigateTo('stories')}>\n <BookOpen className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" />{' '}\n {tr('home.welcome.draftStory', 'Draft a story')}\n </Button>\n <Button variant=\"outline\" onClick={() => navigateTo('topics')}>\n <Compass className=\"mr-1.5 h-4 w-4\" aria-hidden=\"true\" />{' '}\n {tr('home.welcome.curateTopic', 'Curate a topic')}\n </Button>\n </div>\n }\n />\n ) : (\n <div className=\"grid gap-8 lg:grid-cols-3\">\n {/* Main reading column */}\n <div className=\"flex flex-col gap-10 lg:col-span-2\">\n {/* Featured topics */}\n <MagSection\n title={tr('home.topics.title', 'Featured topics')}\n description={tr(\n 'home.topics.description',\n 'Curated subjects across culture, faith, history and heritage.'\n )}\n action={\n <SectionLink\n label={tr('home.topics.allTopics', 'All topics')}\n onClick={() => navigateTo('topics')}\n />\n }\n >\n <div data-tour=\"theculturepost-home-topics\">\n {shownTopics.length === 0 ? (\n <EmptyState\n icon={<Compass className=\"h-9 w-9\" />}\n title={tr('home.topics.emptyTitle', 'No topics yet')}\n description={tr(\n 'home.topics.emptyDescription',\n 'Curate the first topic to organise the publication.'\n )}\n />\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {shownTopics.map((topic) => (\n <TopicCard\n key={topic.id}\n topic={topic}\n onOpen={() => navigateTo(`topics/${topic.id}`)}\n />\n ))}\n </div>\n )}\n </div>\n </MagSection>\n\n {/* Latest published stories */}\n <MagSection\n title={tr('home.stories.title', 'Latest published stories')}\n description={tr(\n 'home.stories.description',\n 'Freshly published pieces from the newsroom.'\n )}\n action={\n <SectionLink\n label={tr('home.stories.allStories', 'All stories')}\n onClick={() => navigateTo('stories')}\n />\n }\n >\n <div data-tour=\"theculturepost-home-stories\">\n {stories.length === 0 ? (\n <EmptyState\n icon={<BookOpen className=\"h-9 w-9\" />}\n title={tr('home.stories.emptyTitle', 'No published stories yet')}\n description={tr(\n 'home.stories.emptyDescription',\n 'Draft a story and move it through the editorial lifecycle to publish.'\n )}\n />\n ) : (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {stories.map((story) => (\n <StoryCard\n key={story.id}\n story={story}\n hideStatus\n onOpen={() => navigateTo(`stories/${story.id}`)}\n />\n ))}\n </div>\n )}\n </div>\n </MagSection>\n </div>\n\n {/* Compact right rail */}\n <aside className=\"flex flex-col gap-6\">\n {/* Active discussions */}\n <div data-tour=\"theculturepost-home-discussions\">\n <RailSection\n title={tr('home.discussions.title', 'Active discussions')}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('discussions')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n {tr('home.discussions.viewAll', 'View all')}\n </button>\n }\n >\n {discussions.length === 0 ? (\n <EmptyState\n icon={<MessagesSquare className=\"h-8 w-8\" />}\n title={tr('home.discussions.emptyTitle', 'No open discussions')}\n description={tr(\n 'home.discussions.emptyDescription',\n 'Open a discussion to invite thoughtful perspectives.'\n )}\n />\n ) : (\n <div className=\"-mx-2 flex flex-col\">\n {discussions.map((discussion) => (\n <DiscussionRow\n key={discussion.id}\n discussion={discussion}\n onOpen={() => navigateTo(`discussions/${discussion.id}`)}\n />\n ))}\n </div>\n )}\n </RailSection>\n </div>\n\n {/* From the archive */}\n <div data-tour=\"theculturepost-home-archive\">\n <RailSection\n title={tr('home.archive.title', 'From the archive')}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('archive')}\n className=\"text-xs font-medium text-accent hover:underline\"\n >\n {tr('home.archive.viewAll', 'View all')}\n </button>\n }\n >\n {collections.length === 0 ? (\n <EmptyState\n icon={<Library className=\"h-8 w-8\" />}\n title={tr('home.archive.emptyTitle', 'The archive is empty')}\n description={tr(\n 'home.archive.emptyDescription',\n 'Create a collection to begin preserving heritage.'\n )}\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {collections.map((collection) => (\n <ArchiveThumb\n key={collection.id}\n collection={collection}\n onOpen={() => navigateTo(`archive/collections/${collection.id}`)}\n />\n ))}\n </div>\n )}\n </RailSection>\n </div>\n </aside>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -13,7 +13,9 @@
13
13
  * - Status StatTiles: Published / In Review / Draft / Idea stories, plus a
14
14
  * Discussions total and an Archive (artifacts) count.
15
15
  * - "Content pipeline" {@link BarChart} across the lifecycle stages.
16
- * - "Discussion health" {@link Donut} = share of discussions that are Approved.
16
+ * - "Discussion health" {@link Donut} = share of discussions that are Approved,
17
+ * beside the real per-status moderation tally (Approved / Pending / Flagged
18
+ * / Removed) read straight off `TcpDiscussion.status`.
17
19
  * - "Recent activity" — the latest stories + discussions, newest first.
18
20
  */
19
21
  export declare function GovernancePage(): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"GovernancePage.d.ts","sourceRoot":"","sources":["../../../../src/theculturepost/pages/governance/GovernancePage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAuDH,wBAAgB,cAAc,4CAgS7B"}
1
+ {"version":3,"file":"GovernancePage.d.ts","sourceRoot":"","sources":["../../../../src/theculturepost/pages/governance/GovernancePage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAiFH,wBAAgB,cAAc,4CAiT7B"}