@burdenoff/microfe-theculturepost 2026.827.1 → 2026.830.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/theculturepost/hooks/useTr.js +2 -2
- package/dist/theculturepost/hooks/useTr.js.map +1 -1
- package/dist/theculturepost/pages/HomePage.d.ts.map +1 -1
- package/dist/theculturepost/pages/HomePage.js +145 -127
- package/dist/theculturepost/pages/HomePage.js.map +1 -1
- package/dist/theculturepost/translations/ar.d.ts +43 -0
- package/dist/theculturepost/translations/ar.d.ts.map +1 -1
- package/dist/theculturepost/translations/ar.js +43 -0
- package/dist/theculturepost/translations/ar.js.map +1 -1
- package/dist/theculturepost/translations/en.d.ts +43 -0
- package/dist/theculturepost/translations/en.d.ts.map +1 -1
- package/dist/theculturepost/translations/en.js +43 -0
- package/dist/theculturepost/translations/en.js.map +1 -1
- package/dist/theculturepost/translations/es.d.ts +43 -0
- package/dist/theculturepost/translations/es.d.ts.map +1 -1
- package/dist/theculturepost/translations/es.js +43 -0
- package/dist/theculturepost/translations/es.js.map +1 -1
- package/dist/theculturepost/translations/hi.d.ts +43 -0
- package/dist/theculturepost/translations/hi.d.ts.map +1 -1
- package/dist/theculturepost/translations/hi.js +43 -0
- package/dist/theculturepost/translations/hi.js.map +1 -1
- package/dist/theculturepost/translations/ta.d.ts +43 -0
- package/dist/theculturepost/translations/ta.d.ts.map +1 -1
- package/dist/theculturepost/translations/ta.js +43 -0
- package/dist/theculturepost/translations/ta.js.map +1 -1
- package/dist/theculturepost/translations/zh.d.ts +43 -0
- package/dist/theculturepost/translations/zh.d.ts.map +1 -1
- package/dist/theculturepost/translations/zh.js +43 -0
- package/dist/theculturepost/translations/zh.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,11 +2,11 @@ import { useCallback as e } from "react";
|
|
|
2
2
|
import { useI18n as t } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
3
3
|
//#region src/theculturepost/hooks/useTr.ts
|
|
4
4
|
function n() {
|
|
5
|
-
let { t: n
|
|
5
|
+
let { t: n } = t();
|
|
6
6
|
return e((e, t, r) => {
|
|
7
7
|
let i = n(e), a = i === e ? t : i;
|
|
8
8
|
return r ? Object.entries(r).reduce((e, [t, n]) => e.replace(RegExp(`\\{\\{${t}\\}\\}`, "g"), String(n)), a) : a;
|
|
9
|
-
}, [n
|
|
9
|
+
}, [n]);
|
|
10
10
|
}
|
|
11
11
|
//#endregion
|
|
12
12
|
export { n as useTr };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTr.js","names":[],"sources":["../../../src/theculturepost/hooks/useTr.ts"],"sourcesContent":["/**\n * Translation hook for TheCulturePost microfrontend.\n *\n * Wraps the shell's `useI18n()` and provides an inline English fallback plus\n * simple `{{param}}` interpolation, matching the VibeControls MFE pattern.\n */\n\nimport { useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nexport function useTr() {\n const { t
|
|
1
|
+
{"version":3,"file":"useTr.js","names":[],"sources":["../../../src/theculturepost/hooks/useTr.ts"],"sourcesContent":["/**\n * Translation hook for TheCulturePost microfrontend.\n *\n * Wraps the shell's `useI18n()` and provides an inline English fallback plus\n * simple `{{param}}` interpolation, matching the VibeControls MFE pattern.\n */\n\nimport { useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nexport function useTr() {\n const { t } = useI18n();\n\n return useCallback(\n (key: string, fallback: string, params?: Record<string, string | number>): string => {\n const translated = t(key);\n const source = translated === key ? fallback : translated;\n if (!params) return source;\n return Object.entries(params).reduce(\n (acc, [paramKey, value]) =>\n acc.replace(new RegExp(`\\\\{\\\\{${paramKey}\\\\}\\\\}`, 'g'), String(value)),\n source\n );\n },\n [t]\n );\n}\n"],"mappings":";;;AAUA,SAAgB,IAAQ;CACtB,IAAM,EAAE,SAAM,GAAS;AAEvB,QAAO,GACJ,GAAa,GAAkB,MAAqD;EACnF,IAAM,IAAa,EAAE,EAAI,EACnB,IAAS,MAAe,IAAM,IAAW;AAE/C,SADK,IACE,OAAO,QAAQ,EAAO,CAAC,QAC3B,GAAK,CAAC,GAAU,OACf,EAAI,QAAY,OAAO,SAAS,EAAS,SAAS,IAAI,EAAE,OAAO,EAAM,CAAC,EACxE,EACD,GALmB;IAOtB,CAAC,EAAE,CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomePage.d.ts","sourceRoot":"","sources":["../../../src/theculturepost/pages/HomePage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"HomePage.d.ts","sourceRoot":"","sources":["../../../src/theculturepost/pages/HomePage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAoKH,wBAAgB,QAAQ,4CAiPvB"}
|
|
@@ -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
|
|
11
|
-
import { TopicCard as
|
|
12
|
-
import { EmptyState as
|
|
13
|
-
import { ArrowRight as
|
|
14
|
-
import { jsx as
|
|
15
|
-
import { Button as
|
|
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
|
|
18
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
34
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
39
|
+
children: [/* @__PURE__ */ C("div", {
|
|
39
40
|
className: "min-w-0",
|
|
40
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
52
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
55
|
+
children: [/* @__PURE__ */ C("div", {
|
|
55
56
|
className: "mb-3 flex items-center justify-between gap-2",
|
|
56
|
-
children: [/* @__PURE__ */
|
|
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
|
|
64
|
-
|
|
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__ */
|
|
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__ */
|
|
72
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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: [
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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__ */
|
|
93
|
+
/* @__PURE__ */ C("span", {
|
|
88
94
|
className: "inline-flex items-center gap-1",
|
|
89
|
-
children: [/* @__PURE__ */ x
|
|
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__ */
|
|
100
|
+
/* @__PURE__ */ S("span", { children: a(e.updatedAt) })
|
|
95
101
|
]
|
|
96
102
|
})]
|
|
97
103
|
})]
|
|
98
104
|
});
|
|
99
105
|
}
|
|
100
|
-
function
|
|
101
|
-
return /* @__PURE__ */
|
|
106
|
+
function k({ collection: e, onOpen: n }) {
|
|
107
|
+
return /* @__PURE__ */ C("button", {
|
|
102
108
|
type: "button",
|
|
103
109
|
onClick: n,
|
|
104
|
-
"aria-label":
|
|
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__ */
|
|
112
|
+
children: [/* @__PURE__ */ C("span", {
|
|
107
113
|
className: "relative block aspect-square w-full overflow-hidden rounded-xl",
|
|
108
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
114
|
-
}), /* @__PURE__ */
|
|
119
|
+
icon: /* @__PURE__ */ S(b, { className: "h-6 w-6" })
|
|
120
|
+
}), /* @__PURE__ */ S(o, {
|
|
115
121
|
position: "bottom-right",
|
|
116
|
-
icon: /* @__PURE__ */
|
|
122
|
+
icon: /* @__PURE__ */ S(y, { className: "h-3 w-3" }),
|
|
117
123
|
children: i(e.itemCount)
|
|
118
124
|
})]
|
|
119
|
-
}), /* @__PURE__ */
|
|
125
|
+
}), /* @__PURE__ */ C("span", {
|
|
120
126
|
className: "min-w-0",
|
|
121
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
132
|
-
let { navigateTo: t } = e(), i = u({ pagination: { limit: 6 } }),
|
|
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
|
-
}),
|
|
141
|
+
}), h = c({
|
|
136
142
|
status: "APPROVED",
|
|
137
143
|
pagination: { limit: 6 }
|
|
138
|
-
}),
|
|
139
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
147
|
+
children: /* @__PURE__ */ S("div", {
|
|
142
148
|
className: "flex-1 overflow-auto",
|
|
143
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
151
|
+
children: [/* @__PURE__ */ S("div", {
|
|
146
152
|
"data-tour": "theculturepost-home-hero",
|
|
147
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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: [
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
}),
|
|
170
|
+
}), F ? /* @__PURE__ */ S(r, { label: i("home.loading", "Loading the latest…") }) : I ? /* @__PURE__ */ S(m, {
|
|
161
171
|
illustration: "onboarding",
|
|
162
|
-
icon: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
177
|
+
children: [/* @__PURE__ */ C(w, {
|
|
168
178
|
onClick: () => t("stories"),
|
|
169
|
-
children: [
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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: [
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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__ */
|
|
200
|
+
}) : /* @__PURE__ */ C("div", {
|
|
183
201
|
className: "grid gap-8 lg:grid-cols-3",
|
|
184
|
-
children: [/* @__PURE__ */
|
|
202
|
+
children: [/* @__PURE__ */ C("div", {
|
|
185
203
|
className: "flex flex-col gap-10 lg:col-span-2",
|
|
186
|
-
children: [/* @__PURE__ */
|
|
187
|
-
title: "Featured topics",
|
|
188
|
-
description: "Curated subjects across culture, faith, history and heritage.",
|
|
189
|
-
action: /* @__PURE__ */
|
|
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__ */
|
|
211
|
+
children: /* @__PURE__ */ S("div", {
|
|
194
212
|
"data-tour": "theculturepost-home-topics",
|
|
195
|
-
children:
|
|
196
|
-
icon: /* @__PURE__ */
|
|
197
|
-
title: "No topics yet",
|
|
198
|
-
description: "Curate the first topic to organise the publication."
|
|
199
|
-
}) : /* @__PURE__ */
|
|
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:
|
|
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__ */
|
|
208
|
-
title: "Latest published stories",
|
|
209
|
-
description: "Freshly published pieces from the newsroom.",
|
|
210
|
-
action: /* @__PURE__ */
|
|
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__ */
|
|
232
|
+
children: /* @__PURE__ */ S("div", {
|
|
215
233
|
"data-tour": "theculturepost-home-stories",
|
|
216
|
-
children:
|
|
217
|
-
icon: /* @__PURE__ */
|
|
218
|
-
title: "No published stories yet",
|
|
219
|
-
description: "Draft a story and move it through the editorial lifecycle to publish."
|
|
220
|
-
}) : /* @__PURE__ */
|
|
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:
|
|
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__ */
|
|
248
|
+
}), /* @__PURE__ */ C("aside", {
|
|
231
249
|
className: "flex flex-col gap-6",
|
|
232
|
-
children: [/* @__PURE__ */
|
|
250
|
+
children: [/* @__PURE__ */ S("div", {
|
|
233
251
|
"data-tour": "theculturepost-home-discussions",
|
|
234
|
-
children: /* @__PURE__ */
|
|
235
|
-
title: "Active discussions",
|
|
236
|
-
action: /* @__PURE__ */
|
|
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:
|
|
243
|
-
icon: /* @__PURE__ */ x
|
|
244
|
-
title: "No open discussions",
|
|
245
|
-
description: "Open a discussion to invite thoughtful perspectives."
|
|
246
|
-
}) : /* @__PURE__ */
|
|
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:
|
|
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__ */
|
|
272
|
+
}), /* @__PURE__ */ S("div", {
|
|
255
273
|
"data-tour": "theculturepost-home-archive",
|
|
256
|
-
children: /* @__PURE__ */
|
|
257
|
-
title: "From the archive",
|
|
258
|
-
action: /* @__PURE__ */
|
|
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:
|
|
265
|
-
icon: /* @__PURE__ */
|
|
266
|
-
title: "The archive is empty",
|
|
267
|
-
description: "Create a collection to begin preserving heritage."
|
|
268
|
-
}) : /* @__PURE__ */
|
|
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:
|
|
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 {
|
|
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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"}
|
|
@@ -8,6 +8,48 @@ export declare const arTranslations: {
|
|
|
8
8
|
discussions: string;
|
|
9
9
|
archive: string;
|
|
10
10
|
};
|
|
11
|
+
home: {
|
|
12
|
+
hero: {
|
|
13
|
+
eyebrow: string;
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
readStories: string;
|
|
17
|
+
};
|
|
18
|
+
loading: string;
|
|
19
|
+
welcome: {
|
|
20
|
+
title: string;
|
|
21
|
+
description: string;
|
|
22
|
+
draftStory: string;
|
|
23
|
+
curateTopic: string;
|
|
24
|
+
};
|
|
25
|
+
topics: {
|
|
26
|
+
title: string;
|
|
27
|
+
description: string;
|
|
28
|
+
allTopics: string;
|
|
29
|
+
emptyTitle: string;
|
|
30
|
+
emptyDescription: string;
|
|
31
|
+
};
|
|
32
|
+
stories: {
|
|
33
|
+
title: string;
|
|
34
|
+
description: string;
|
|
35
|
+
allStories: string;
|
|
36
|
+
emptyTitle: string;
|
|
37
|
+
emptyDescription: string;
|
|
38
|
+
};
|
|
39
|
+
discussions: {
|
|
40
|
+
title: string;
|
|
41
|
+
viewAll: string;
|
|
42
|
+
emptyTitle: string;
|
|
43
|
+
emptyDescription: string;
|
|
44
|
+
};
|
|
45
|
+
archive: {
|
|
46
|
+
title: string;
|
|
47
|
+
viewAll: string;
|
|
48
|
+
emptyTitle: string;
|
|
49
|
+
emptyDescription: string;
|
|
50
|
+
};
|
|
51
|
+
interfaith: string;
|
|
52
|
+
};
|
|
11
53
|
stories: {
|
|
12
54
|
title: string;
|
|
13
55
|
description: string;
|
|
@@ -34,6 +76,7 @@ export declare const arTranslations: {
|
|
|
34
76
|
newCollection: string;
|
|
35
77
|
newArtifact: string;
|
|
36
78
|
newRecording: string;
|
|
79
|
+
openCollection: string;
|
|
37
80
|
noCollections: string;
|
|
38
81
|
};
|
|
39
82
|
common: {
|