@burdenoff/microfe-ecoimpacthub 2026.509.101
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/README.md +12 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/ecoimpacthub/EcoImpactHubRoot.d.ts +5 -0
- package/dist/ecoimpacthub/EcoImpactHubRoot.d.ts.map +1 -0
- package/dist/ecoimpacthub/EcoImpactHubRoot.js +126 -0
- package/dist/ecoimpacthub/EcoImpactHubRoot.js.map +1 -0
- package/dist/ecoimpacthub/EcoImpactHubRoutes.d.ts +2 -0
- package/dist/ecoimpacthub/EcoImpactHubRoutes.d.ts.map +1 -0
- package/dist/ecoimpacthub/EcoImpactHubRoutes.js +55 -0
- package/dist/ecoimpacthub/EcoImpactHubRoutes.js.map +1 -0
- package/dist/ecoimpacthub/index.d.ts +5 -0
- package/dist/ecoimpacthub/index.d.ts.map +1 -0
- package/dist/ecoimpacthub/index.js +3 -0
- package/dist/ecoimpacthub/pages/ActionTrackerPage.d.ts +2 -0
- package/dist/ecoimpacthub/pages/ActionTrackerPage.d.ts.map +1 -0
- package/dist/ecoimpacthub/pages/ActionTrackerPage.js +449 -0
- package/dist/ecoimpacthub/pages/ActionTrackerPage.js.map +1 -0
- package/dist/ecoimpacthub/pages/ChallengesPage.d.ts +2 -0
- package/dist/ecoimpacthub/pages/ChallengesPage.d.ts.map +1 -0
- package/dist/ecoimpacthub/pages/ChallengesPage.js +242 -0
- package/dist/ecoimpacthub/pages/ChallengesPage.js.map +1 -0
- package/dist/ecoimpacthub/pages/CitizenSciencePage.d.ts +2 -0
- package/dist/ecoimpacthub/pages/CitizenSciencePage.d.ts.map +1 -0
- package/dist/ecoimpacthub/pages/CitizenSciencePage.js +443 -0
- package/dist/ecoimpacthub/pages/CitizenSciencePage.js.map +1 -0
- package/dist/ecoimpacthub/pages/CommunityPage.d.ts +2 -0
- package/dist/ecoimpacthub/pages/CommunityPage.d.ts.map +1 -0
- package/dist/ecoimpacthub/pages/CommunityPage.js +377 -0
- package/dist/ecoimpacthub/pages/CommunityPage.js.map +1 -0
- package/dist/ecoimpacthub/pages/DashboardPage.d.ts +2 -0
- package/dist/ecoimpacthub/pages/DashboardPage.d.ts.map +1 -0
- package/dist/ecoimpacthub/pages/DashboardPage.js +380 -0
- package/dist/ecoimpacthub/pages/DashboardPage.js.map +1 -0
- package/dist/ecoimpacthub/pages/LearningPage.d.ts +2 -0
- package/dist/ecoimpacthub/pages/LearningPage.d.ts.map +1 -0
- package/dist/ecoimpacthub/pages/LearningPage.js +276 -0
- package/dist/ecoimpacthub/pages/LearningPage.js.map +1 -0
- package/dist/ecoimpacthub/providers/EcoImpactHubProvider.d.ts +6 -0
- package/dist/ecoimpacthub/providers/EcoImpactHubProvider.d.ts.map +1 -0
- package/dist/ecoimpacthub/providers/EcoImpactHubProvider.js +27 -0
- package/dist/ecoimpacthub/providers/EcoImpactHubProvider.js.map +1 -0
- package/dist/ecoimpacthub/store/ecoimpacthubStore.d.ts +135 -0
- package/dist/ecoimpacthub/store/ecoimpacthubStore.d.ts.map +1 -0
- package/dist/ecoimpacthub/store/ecoimpacthubStore.js +551 -0
- package/dist/ecoimpacthub/store/ecoimpacthubStore.js.map +1 -0
- package/dist/ecoimpacthub/types/index.d.ts +51 -0
- package/dist/ecoimpacthub/types/index.d.ts.map +1 -0
- package/dist/ecoimpacthub/utils/cn.d.ts +4 -0
- package/dist/ecoimpacthub/utils/cn.d.ts.map +1 -0
- package/dist/ecoimpacthub/utils/i18n.d.ts +6 -0
- package/dist/ecoimpacthub/utils/i18n.d.ts.map +1 -0
- package/dist/ecoimpacthub/utils/i18n.js +15 -0
- package/dist/ecoimpacthub/utils/i18n.js.map +1 -0
- package/dist/ecoimpacthub/utils/navigation.d.ts +2 -0
- package/dist/ecoimpacthub/utils/navigation.d.ts.map +1 -0
- package/dist/ecoimpacthub/utils/navigation.js +8 -0
- package/dist/ecoimpacthub/utils/navigation.js.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +18199 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +43046 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/package.json +107 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import { useEcoImpactHubStore as e } from "../store/ecoimpacthubStore.js";
|
|
2
|
+
import { tWithFallback as t } from "../utils/i18n.js";
|
|
3
|
+
import { useState as n } from "react";
|
|
4
|
+
import { AlertCircle as r, Award as i, Bird as a, Calendar as o, Camera as s, CheckCircle as c, Cloud as l, Eye as u, Fish as d, Leaf as f, MapPin as p, Microscope as m, Plus as h, Search as g, Star as _, TreePine as v, Upload as y, Users as b } from "lucide-react";
|
|
5
|
+
import { useI18n as x } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
|
+
import { Badge as S, Button as C, Card as w, CardContent as T, Input as E } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
import { jsx as D, jsxs as O } from "react/jsx-runtime";
|
|
8
|
+
//#region src/ecoimpacthub/pages/CitizenSciencePage.tsx
|
|
9
|
+
function k() {
|
|
10
|
+
let { t: k } = x(), { scienceProjects: A, observations: j } = e(), [M, N] = n("projects"), [P, F] = n("all"), I = (e, n, r) => t(k, e, n, r), L = [
|
|
11
|
+
{
|
|
12
|
+
value: "all",
|
|
13
|
+
label: I("ecoimpacthub.citizenScience.categories.all", "All Categories"),
|
|
14
|
+
icon: m
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
value: "biodiversity",
|
|
18
|
+
label: I("ecoimpacthub.citizenScience.categories.biodiversity", "Biodiversity"),
|
|
19
|
+
icon: f
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
value: "pollution",
|
|
23
|
+
label: I("ecoimpacthub.citizenScience.categories.pollution", "Pollution"),
|
|
24
|
+
icon: r
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
value: "climate",
|
|
28
|
+
label: I("ecoimpacthub.citizenScience.categories.climate", "Climate"),
|
|
29
|
+
icon: l
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
value: "conservation",
|
|
33
|
+
label: I("ecoimpacthub.citizenScience.categories.conservation", "Conservation"),
|
|
34
|
+
icon: v
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
value: "water-quality",
|
|
38
|
+
label: I("ecoimpacthub.citizenScience.categories.waterQuality", "Water Quality"),
|
|
39
|
+
icon: d
|
|
40
|
+
}
|
|
41
|
+
], R = A.filter((e) => P === "all" || e.category === P), z = (e) => {
|
|
42
|
+
switch (e) {
|
|
43
|
+
case "beginner": return "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300";
|
|
44
|
+
case "intermediate": return "bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300";
|
|
45
|
+
case "advanced": return "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300";
|
|
46
|
+
default: return "bg-muted text-muted-foreground";
|
|
47
|
+
}
|
|
48
|
+
}, B = (e) => {
|
|
49
|
+
switch (e) {
|
|
50
|
+
case "verified": return "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300";
|
|
51
|
+
case "pending": return "bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300";
|
|
52
|
+
case "needs-review": return "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300";
|
|
53
|
+
default: return "bg-muted text-muted-foreground";
|
|
54
|
+
}
|
|
55
|
+
}, V = (e) => {
|
|
56
|
+
switch (e) {
|
|
57
|
+
case "plant": return /* @__PURE__ */ D(f, { className: "h-4 w-4" });
|
|
58
|
+
case "animal": return /* @__PURE__ */ D(a, { className: "h-4 w-4" });
|
|
59
|
+
case "pollution": return /* @__PURE__ */ D(r, { className: "h-4 w-4" });
|
|
60
|
+
case "weather": return /* @__PURE__ */ D(l, { className: "h-4 w-4" });
|
|
61
|
+
case "water": return /* @__PURE__ */ D(d, { className: "h-4 w-4" });
|
|
62
|
+
default: return /* @__PURE__ */ D(u, { className: "h-4 w-4" });
|
|
63
|
+
}
|
|
64
|
+
}, H = (e) => {
|
|
65
|
+
switch (e) {
|
|
66
|
+
case "projects": return I("ecoimpacthub.citizenScience.tabs.projects", "Projects");
|
|
67
|
+
case "observations": return I("ecoimpacthub.citizenScience.tabs.observations", "Observations");
|
|
68
|
+
case "contribute": return I("ecoimpacthub.citizenScience.tabs.contribute", "Contribute");
|
|
69
|
+
default: return e;
|
|
70
|
+
}
|
|
71
|
+
}, U = [
|
|
72
|
+
{
|
|
73
|
+
label: I("ecoimpacthub.citizenScience.stats.observations.label", "Observations"),
|
|
74
|
+
value: "47",
|
|
75
|
+
sub: I("ecoimpacthub.citizenScience.stats.observations.sub", "contributed"),
|
|
76
|
+
icon: m,
|
|
77
|
+
color: "text-primary"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
label: I("ecoimpacthub.citizenScience.stats.verified.label", "Verified"),
|
|
81
|
+
value: "32",
|
|
82
|
+
sub: I("ecoimpacthub.citizenScience.stats.verified.sub", "by experts"),
|
|
83
|
+
icon: c,
|
|
84
|
+
color: "text-green-600"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
label: I("ecoimpacthub.citizenScience.stats.projects.label", "Projects"),
|
|
88
|
+
value: "8",
|
|
89
|
+
sub: I("ecoimpacthub.citizenScience.stats.projects.sub", "participated in"),
|
|
90
|
+
icon: i,
|
|
91
|
+
color: "text-blue-600"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
label: I("ecoimpacthub.citizenScience.stats.accuracyRate.label", "Accuracy Rate"),
|
|
95
|
+
value: "94%",
|
|
96
|
+
sub: I("ecoimpacthub.citizenScience.stats.accuracyRate.sub", "identification accuracy"),
|
|
97
|
+
icon: _,
|
|
98
|
+
color: "text-purple-600"
|
|
99
|
+
}
|
|
100
|
+
];
|
|
101
|
+
return /* @__PURE__ */ D("div", {
|
|
102
|
+
className: "min-h-screen p-4",
|
|
103
|
+
children: /* @__PURE__ */ O("div", {
|
|
104
|
+
className: "mx-auto max-w-7xl space-y-8",
|
|
105
|
+
children: [
|
|
106
|
+
/* @__PURE__ */ O("div", {
|
|
107
|
+
className: "space-y-4 text-center",
|
|
108
|
+
children: [/* @__PURE__ */ D("h1", {
|
|
109
|
+
className: "text-4xl font-bold",
|
|
110
|
+
children: I("ecoimpacthub.citizenScience.title", "Citizen Science Hub")
|
|
111
|
+
}), /* @__PURE__ */ D("p", {
|
|
112
|
+
className: "mx-auto max-w-3xl text-xl text-muted-foreground",
|
|
113
|
+
children: I("ecoimpacthub.citizenScience.subtitle", "Contribute to real scientific research by collecting environmental data, identifying species, and monitoring ecosystem health in your community.")
|
|
114
|
+
})]
|
|
115
|
+
}),
|
|
116
|
+
/* @__PURE__ */ D("div", {
|
|
117
|
+
className: "grid grid-cols-1 gap-6 md:grid-cols-4",
|
|
118
|
+
children: U.map((e) => {
|
|
119
|
+
let t = e.icon;
|
|
120
|
+
return /* @__PURE__ */ D(w, { children: /* @__PURE__ */ O(T, {
|
|
121
|
+
className: "space-y-2 p-6",
|
|
122
|
+
children: [
|
|
123
|
+
/* @__PURE__ */ O("div", {
|
|
124
|
+
className: `flex items-center gap-2 ${e.color}`,
|
|
125
|
+
children: [/* @__PURE__ */ D(t, { className: "h-5 w-5" }), /* @__PURE__ */ D("span", {
|
|
126
|
+
className: "font-semibold",
|
|
127
|
+
children: e.label
|
|
128
|
+
})]
|
|
129
|
+
}),
|
|
130
|
+
/* @__PURE__ */ D("div", {
|
|
131
|
+
className: "text-3xl font-bold",
|
|
132
|
+
children: e.value
|
|
133
|
+
}),
|
|
134
|
+
/* @__PURE__ */ D("div", {
|
|
135
|
+
className: "text-sm text-muted-foreground",
|
|
136
|
+
children: e.sub
|
|
137
|
+
})
|
|
138
|
+
]
|
|
139
|
+
}) }, e.label);
|
|
140
|
+
})
|
|
141
|
+
}),
|
|
142
|
+
/* @__PURE__ */ D("div", {
|
|
143
|
+
className: "flex gap-2 border-b",
|
|
144
|
+
children: [
|
|
145
|
+
"projects",
|
|
146
|
+
"observations",
|
|
147
|
+
"contribute"
|
|
148
|
+
].map((e) => /* @__PURE__ */ O(C, {
|
|
149
|
+
variant: M === e ? "default" : "ghost",
|
|
150
|
+
onClick: () => N(e),
|
|
151
|
+
children: [
|
|
152
|
+
e === "projects" && /* @__PURE__ */ D(g, { className: "mr-2 h-4 w-4" }),
|
|
153
|
+
e === "observations" && /* @__PURE__ */ D(u, { className: "mr-2 h-4 w-4" }),
|
|
154
|
+
e === "contribute" && /* @__PURE__ */ D(h, { className: "mr-2 h-4 w-4" }),
|
|
155
|
+
H(e)
|
|
156
|
+
]
|
|
157
|
+
}, e))
|
|
158
|
+
}),
|
|
159
|
+
M === "projects" && /* @__PURE__ */ O("div", {
|
|
160
|
+
className: "space-y-6",
|
|
161
|
+
children: [/* @__PURE__ */ D("div", {
|
|
162
|
+
className: "flex flex-wrap gap-2",
|
|
163
|
+
children: L.map(({ value: e, label: t, icon: n }) => /* @__PURE__ */ O(C, {
|
|
164
|
+
variant: P === e ? "default" : "outline",
|
|
165
|
+
size: "sm",
|
|
166
|
+
onClick: () => F(e),
|
|
167
|
+
className: "flex items-center gap-2",
|
|
168
|
+
children: [/* @__PURE__ */ D(n, { className: "h-4 w-4" }), t]
|
|
169
|
+
}, e))
|
|
170
|
+
}), /* @__PURE__ */ D("div", {
|
|
171
|
+
className: "grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3",
|
|
172
|
+
children: R.map((e) => /* @__PURE__ */ D(w, {
|
|
173
|
+
className: "overflow-hidden transition-shadow hover:shadow-lg",
|
|
174
|
+
children: /* @__PURE__ */ O(T, {
|
|
175
|
+
className: "space-y-4 p-6",
|
|
176
|
+
children: [
|
|
177
|
+
/* @__PURE__ */ O("div", {
|
|
178
|
+
className: "flex items-start justify-between",
|
|
179
|
+
children: [/* @__PURE__ */ O("div", {
|
|
180
|
+
className: "flex items-center gap-3",
|
|
181
|
+
children: [/* @__PURE__ */ D("div", {
|
|
182
|
+
className: "text-2xl",
|
|
183
|
+
children: e.icon
|
|
184
|
+
}), /* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("h3", {
|
|
185
|
+
className: "line-clamp-2 text-lg font-semibold",
|
|
186
|
+
children: e.title
|
|
187
|
+
}), /* @__PURE__ */ O("div", {
|
|
188
|
+
className: "flex items-center gap-2 text-sm text-muted-foreground",
|
|
189
|
+
children: [/* @__PURE__ */ D(p, { className: "h-3 w-3" }), /* @__PURE__ */ D("span", { children: e.location })]
|
|
190
|
+
})] })]
|
|
191
|
+
}), /* @__PURE__ */ D(S, {
|
|
192
|
+
className: z(e.difficulty),
|
|
193
|
+
children: e.difficulty
|
|
194
|
+
})]
|
|
195
|
+
}),
|
|
196
|
+
/* @__PURE__ */ D("p", {
|
|
197
|
+
className: "line-clamp-3 text-sm text-muted-foreground",
|
|
198
|
+
children: e.description
|
|
199
|
+
}),
|
|
200
|
+
/* @__PURE__ */ O("div", {
|
|
201
|
+
className: "space-y-2",
|
|
202
|
+
children: [/* @__PURE__ */ D("p", {
|
|
203
|
+
className: "text-sm font-medium",
|
|
204
|
+
children: I("ecoimpacthub.citizenScience.projects.requiredSkills", "Required Skills:")
|
|
205
|
+
}), /* @__PURE__ */ D("div", {
|
|
206
|
+
className: "flex flex-wrap gap-1",
|
|
207
|
+
children: e.requiredSkills.map((e) => /* @__PURE__ */ D("span", {
|
|
208
|
+
className: "rounded bg-muted px-2 py-1 text-xs text-muted-foreground",
|
|
209
|
+
children: e
|
|
210
|
+
}, e))
|
|
211
|
+
})]
|
|
212
|
+
}),
|
|
213
|
+
/* @__PURE__ */ O("div", {
|
|
214
|
+
className: "flex items-center justify-between text-sm text-muted-foreground",
|
|
215
|
+
children: [/* @__PURE__ */ O("div", {
|
|
216
|
+
className: "flex items-center gap-4",
|
|
217
|
+
children: [/* @__PURE__ */ O("div", {
|
|
218
|
+
className: "flex items-center gap-1",
|
|
219
|
+
children: [/* @__PURE__ */ D(b, { className: "h-4 w-4" }), /* @__PURE__ */ D("span", { children: e.contributors.toLocaleString() })]
|
|
220
|
+
}), /* @__PURE__ */ O("div", {
|
|
221
|
+
className: "flex items-center gap-1",
|
|
222
|
+
children: [/* @__PURE__ */ D(u, { className: "h-4 w-4" }), /* @__PURE__ */ D("span", { children: e.observations.toLocaleString() })]
|
|
223
|
+
})]
|
|
224
|
+
}), /* @__PURE__ */ O("div", {
|
|
225
|
+
className: "flex items-center gap-1",
|
|
226
|
+
children: [/* @__PURE__ */ D(o, { className: "h-4 w-4" }), /* @__PURE__ */ D("span", { children: new Date(e.endDate).toLocaleDateString() })]
|
|
227
|
+
})]
|
|
228
|
+
}),
|
|
229
|
+
/* @__PURE__ */ D(C, {
|
|
230
|
+
className: "w-full",
|
|
231
|
+
children: I("ecoimpacthub.citizenScience.actions.joinProject", "Join Project")
|
|
232
|
+
})
|
|
233
|
+
]
|
|
234
|
+
})
|
|
235
|
+
}, e.id))
|
|
236
|
+
})]
|
|
237
|
+
}),
|
|
238
|
+
M === "observations" && /* @__PURE__ */ O("div", {
|
|
239
|
+
className: "space-y-6",
|
|
240
|
+
children: [/* @__PURE__ */ O("div", {
|
|
241
|
+
className: "flex items-center justify-between",
|
|
242
|
+
children: [/* @__PURE__ */ D("h2", {
|
|
243
|
+
className: "text-2xl font-bold",
|
|
244
|
+
children: I("ecoimpacthub.citizenScience.observations.title", "Your Observations")
|
|
245
|
+
}), /* @__PURE__ */ O(C, { children: [/* @__PURE__ */ D(h, { className: "mr-2 h-4 w-4" }), I("ecoimpacthub.citizenScience.actions.newObservation", "New Observation")] })]
|
|
246
|
+
}), /* @__PURE__ */ D("div", {
|
|
247
|
+
className: "grid gap-4",
|
|
248
|
+
children: j.map((e) => /* @__PURE__ */ D(w, { children: /* @__PURE__ */ D(T, {
|
|
249
|
+
className: "p-6",
|
|
250
|
+
children: /* @__PURE__ */ O("div", {
|
|
251
|
+
className: "flex items-start gap-4",
|
|
252
|
+
children: [/* @__PURE__ */ D("div", {
|
|
253
|
+
className: "text-4xl",
|
|
254
|
+
children: e.image
|
|
255
|
+
}), /* @__PURE__ */ O("div", {
|
|
256
|
+
className: "flex-1 space-y-3",
|
|
257
|
+
children: [/* @__PURE__ */ O("div", {
|
|
258
|
+
className: "flex items-start justify-between",
|
|
259
|
+
children: [/* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("h3", {
|
|
260
|
+
className: "text-lg font-semibold",
|
|
261
|
+
children: e.title
|
|
262
|
+
}), /* @__PURE__ */ O("div", {
|
|
263
|
+
className: "flex items-center gap-4 text-sm text-muted-foreground",
|
|
264
|
+
children: [
|
|
265
|
+
/* @__PURE__ */ O("div", {
|
|
266
|
+
className: "flex items-center gap-1",
|
|
267
|
+
children: [V(e.category), /* @__PURE__ */ D("span", { children: e.category })]
|
|
268
|
+
}),
|
|
269
|
+
/* @__PURE__ */ O("div", {
|
|
270
|
+
className: "flex items-center gap-1",
|
|
271
|
+
children: [/* @__PURE__ */ D(p, { className: "h-4 w-4" }), /* @__PURE__ */ D("span", { children: e.location })]
|
|
272
|
+
}),
|
|
273
|
+
/* @__PURE__ */ O("div", {
|
|
274
|
+
className: "flex items-center gap-1",
|
|
275
|
+
children: [/* @__PURE__ */ D(o, { className: "h-4 w-4" }), /* @__PURE__ */ D("span", { children: new Date(e.date).toLocaleDateString() })]
|
|
276
|
+
})
|
|
277
|
+
]
|
|
278
|
+
})] }), /* @__PURE__ */ O("div", {
|
|
279
|
+
className: "flex items-center gap-2",
|
|
280
|
+
children: [/* @__PURE__ */ D(S, {
|
|
281
|
+
className: B(e.status),
|
|
282
|
+
children: e.status.replace("-", " ")
|
|
283
|
+
}), /* @__PURE__ */ D("div", {
|
|
284
|
+
className: "text-sm text-muted-foreground",
|
|
285
|
+
children: I("ecoimpacthub.citizenScience.observations.confidence", "{{value}}% confidence", { value: e.confidence })
|
|
286
|
+
})]
|
|
287
|
+
})]
|
|
288
|
+
}), /* @__PURE__ */ D("p", {
|
|
289
|
+
className: "text-sm text-muted-foreground",
|
|
290
|
+
children: e.description
|
|
291
|
+
})]
|
|
292
|
+
})]
|
|
293
|
+
})
|
|
294
|
+
}) }, e.id))
|
|
295
|
+
})]
|
|
296
|
+
}),
|
|
297
|
+
M === "contribute" && /* @__PURE__ */ O("div", {
|
|
298
|
+
className: "space-y-8",
|
|
299
|
+
children: [
|
|
300
|
+
/* @__PURE__ */ O("div", {
|
|
301
|
+
className: "space-y-4 text-center",
|
|
302
|
+
children: [/* @__PURE__ */ D("h2", {
|
|
303
|
+
className: "text-3xl font-bold",
|
|
304
|
+
children: I("ecoimpacthub.citizenScience.contribute.title", "Make a Contribution")
|
|
305
|
+
}), /* @__PURE__ */ D("p", {
|
|
306
|
+
className: "mx-auto max-w-2xl text-muted-foreground",
|
|
307
|
+
children: I("ecoimpacthub.citizenScience.contribute.subtitle", "Choose how you'd like to contribute to environmental science and conservation efforts.")
|
|
308
|
+
})]
|
|
309
|
+
}),
|
|
310
|
+
/* @__PURE__ */ O("div", {
|
|
311
|
+
className: "grid grid-cols-1 gap-6 md:grid-cols-3",
|
|
312
|
+
children: [
|
|
313
|
+
/* @__PURE__ */ D(w, {
|
|
314
|
+
className: "text-center transition-shadow hover:shadow-lg",
|
|
315
|
+
children: /* @__PURE__ */ O(T, {
|
|
316
|
+
className: "space-y-4 p-8",
|
|
317
|
+
children: [
|
|
318
|
+
/* @__PURE__ */ D("div", {
|
|
319
|
+
className: "mb-4 text-4xl",
|
|
320
|
+
children: "🔍"
|
|
321
|
+
}),
|
|
322
|
+
/* @__PURE__ */ D("h3", {
|
|
323
|
+
className: "text-xl font-semibold",
|
|
324
|
+
children: I("ecoimpacthub.citizenScience.cards.identifySpecies.title", "Identify Species")
|
|
325
|
+
}),
|
|
326
|
+
/* @__PURE__ */ D("p", {
|
|
327
|
+
className: "text-sm text-muted-foreground",
|
|
328
|
+
children: I("ecoimpacthub.citizenScience.cards.identifySpecies.description", "Use AI-powered tools to identify plants and animals you encounter in nature.")
|
|
329
|
+
}),
|
|
330
|
+
/* @__PURE__ */ O(C, {
|
|
331
|
+
className: "w-full",
|
|
332
|
+
children: [/* @__PURE__ */ D(s, { className: "mr-2 h-4 w-4" }), I("ecoimpacthub.citizenScience.actions.takePhoto", "Take Photo")]
|
|
333
|
+
})
|
|
334
|
+
]
|
|
335
|
+
})
|
|
336
|
+
}),
|
|
337
|
+
/* @__PURE__ */ D(w, {
|
|
338
|
+
className: "text-center transition-shadow hover:shadow-lg",
|
|
339
|
+
children: /* @__PURE__ */ O(T, {
|
|
340
|
+
className: "space-y-4 p-8",
|
|
341
|
+
children: [
|
|
342
|
+
/* @__PURE__ */ D("div", {
|
|
343
|
+
className: "mb-4 text-4xl",
|
|
344
|
+
children: "📊"
|
|
345
|
+
}),
|
|
346
|
+
/* @__PURE__ */ D("h3", {
|
|
347
|
+
className: "text-xl font-semibold",
|
|
348
|
+
children: I("ecoimpacthub.citizenScience.cards.collectData.title", "Collect Data")
|
|
349
|
+
}),
|
|
350
|
+
/* @__PURE__ */ D("p", {
|
|
351
|
+
className: "text-sm text-muted-foreground",
|
|
352
|
+
children: I("ecoimpacthub.citizenScience.cards.collectData.description", "Record environmental measurements and observations for ongoing research projects.")
|
|
353
|
+
}),
|
|
354
|
+
/* @__PURE__ */ O(C, {
|
|
355
|
+
className: "w-full",
|
|
356
|
+
children: [/* @__PURE__ */ D(y, { className: "mr-2 h-4 w-4" }), I("ecoimpacthub.citizenScience.actions.submitData", "Submit Data")]
|
|
357
|
+
})
|
|
358
|
+
]
|
|
359
|
+
})
|
|
360
|
+
}),
|
|
361
|
+
/* @__PURE__ */ D(w, {
|
|
362
|
+
className: "text-center transition-shadow hover:shadow-lg",
|
|
363
|
+
children: /* @__PURE__ */ O(T, {
|
|
364
|
+
className: "space-y-4 p-8",
|
|
365
|
+
children: [
|
|
366
|
+
/* @__PURE__ */ D("div", {
|
|
367
|
+
className: "mb-4 text-4xl",
|
|
368
|
+
children: "⚠️"
|
|
369
|
+
}),
|
|
370
|
+
/* @__PURE__ */ D("h3", {
|
|
371
|
+
className: "text-xl font-semibold",
|
|
372
|
+
children: I("ecoimpacthub.citizenScience.cards.reportIssues.title", "Report Issues")
|
|
373
|
+
}),
|
|
374
|
+
/* @__PURE__ */ D("p", {
|
|
375
|
+
className: "text-sm text-muted-foreground",
|
|
376
|
+
children: I("ecoimpacthub.citizenScience.cards.reportIssues.description", "Document pollution, invasive species, or other environmental concerns in your area.")
|
|
377
|
+
}),
|
|
378
|
+
/* @__PURE__ */ O(C, {
|
|
379
|
+
className: "w-full",
|
|
380
|
+
children: [/* @__PURE__ */ D(p, { className: "mr-2 h-4 w-4" }), I("ecoimpacthub.citizenScience.actions.reportIssue", "Report Issue")]
|
|
381
|
+
})
|
|
382
|
+
]
|
|
383
|
+
})
|
|
384
|
+
})
|
|
385
|
+
]
|
|
386
|
+
}),
|
|
387
|
+
/* @__PURE__ */ D(w, { children: /* @__PURE__ */ O(T, {
|
|
388
|
+
className: "p-6",
|
|
389
|
+
children: [/* @__PURE__ */ D("h3", {
|
|
390
|
+
className: "mb-4 text-xl font-semibold",
|
|
391
|
+
children: I("ecoimpacthub.citizenScience.quickObservation.title", "Quick Observation")
|
|
392
|
+
}), /* @__PURE__ */ O("div", {
|
|
393
|
+
className: "grid grid-cols-1 gap-4 md:grid-cols-2",
|
|
394
|
+
children: [/* @__PURE__ */ O("div", {
|
|
395
|
+
className: "space-y-4",
|
|
396
|
+
children: [
|
|
397
|
+
/* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
|
|
398
|
+
className: "text-sm font-medium",
|
|
399
|
+
children: I("ecoimpacthub.citizenScience.quickObservation.whatLabel", "What did you observe?")
|
|
400
|
+
}), /* @__PURE__ */ D(E, {
|
|
401
|
+
placeholder: I("ecoimpacthub.citizenScience.quickObservation.whatPlaceholder", "e.g., Red-tailed hawk, Plastic debris..."),
|
|
402
|
+
className: "mt-1"
|
|
403
|
+
})] }),
|
|
404
|
+
/* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
|
|
405
|
+
className: "text-sm font-medium",
|
|
406
|
+
children: I("ecoimpacthub.citizenScience.quickObservation.locationLabel", "Location")
|
|
407
|
+
}), /* @__PURE__ */ D(E, {
|
|
408
|
+
placeholder: I("ecoimpacthub.citizenScience.quickObservation.locationPlaceholder", "e.g., Central Park, NYC"),
|
|
409
|
+
className: "mt-1"
|
|
410
|
+
})] }),
|
|
411
|
+
/* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
|
|
412
|
+
className: "text-sm font-medium",
|
|
413
|
+
children: I("ecoimpacthub.citizenScience.quickObservation.descriptionLabel", "Description")
|
|
414
|
+
}), /* @__PURE__ */ D(E, {
|
|
415
|
+
placeholder: I("ecoimpacthub.citizenScience.quickObservation.descriptionPlaceholder", "Describe what you observed..."),
|
|
416
|
+
className: "mt-1"
|
|
417
|
+
})] })
|
|
418
|
+
]
|
|
419
|
+
}), /* @__PURE__ */ O("div", {
|
|
420
|
+
className: "space-y-4",
|
|
421
|
+
children: [/* @__PURE__ */ O("div", {
|
|
422
|
+
className: "rounded-lg border-2 border-dashed border-muted p-8 text-center",
|
|
423
|
+
children: [/* @__PURE__ */ D(s, { className: "mx-auto mb-2 h-8 w-8 text-muted-foreground" }), /* @__PURE__ */ D("p", {
|
|
424
|
+
className: "text-sm text-muted-foreground",
|
|
425
|
+
children: I("ecoimpacthub.citizenScience.quickObservation.addPhoto", "Click to add photo")
|
|
426
|
+
})]
|
|
427
|
+
}), /* @__PURE__ */ D(C, {
|
|
428
|
+
className: "w-full",
|
|
429
|
+
children: I("ecoimpacthub.citizenScience.actions.submitObservation", "Submit Observation")
|
|
430
|
+
})]
|
|
431
|
+
})]
|
|
432
|
+
})]
|
|
433
|
+
}) })
|
|
434
|
+
]
|
|
435
|
+
})
|
|
436
|
+
]
|
|
437
|
+
})
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
//#endregion
|
|
441
|
+
export { k as CitizenSciencePage };
|
|
442
|
+
|
|
443
|
+
//# sourceMappingURL=CitizenSciencePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CitizenSciencePage.js","names":[],"sources":["../../../src/ecoimpacthub/pages/CitizenSciencePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Badge, Button, Card, CardContent, Input } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Microscope,\n Camera,\n MapPin,\n Upload,\n Search,\n Star,\n Calendar,\n Users,\n Award,\n Eye,\n Leaf,\n Bird,\n Fish,\n TreePine,\n CheckCircle,\n AlertCircle,\n Plus,\n Cloud,\n} from 'lucide-react';\nimport { useEcoImpactHubStore } from '../store/ecoimpacthubStore';\nimport { tWithFallback } from '../utils/i18n';\n\ntype ProjectCategory =\n | 'all'\n | 'biodiversity'\n | 'pollution'\n | 'climate'\n | 'conservation'\n | 'water-quality';\n\nexport function CitizenSciencePage() {\n const { t } = useI18n();\n const { scienceProjects, observations } = useEcoImpactHubStore();\n const [activeTab, setActiveTab] = useState<'projects' | 'observations' | 'contribute'>(\n 'projects'\n );\n const [selectedCategory, setSelectedCategory] = useState<ProjectCategory>('all');\n const translate = (key: string, fallback: string, params?: Record<string, string | number>) =>\n tWithFallback(t, key, fallback, params);\n\n const categories: { value: ProjectCategory; label: string; icon: typeof Microscope }[] = [\n {\n value: 'all',\n label: translate('ecoimpacthub.citizenScience.categories.all', 'All Categories'),\n icon: Microscope,\n },\n {\n value: 'biodiversity',\n label: translate('ecoimpacthub.citizenScience.categories.biodiversity', 'Biodiversity'),\n icon: Leaf,\n },\n {\n value: 'pollution',\n label: translate('ecoimpacthub.citizenScience.categories.pollution', 'Pollution'),\n icon: AlertCircle,\n },\n {\n value: 'climate',\n label: translate('ecoimpacthub.citizenScience.categories.climate', 'Climate'),\n icon: Cloud,\n },\n {\n value: 'conservation',\n label: translate('ecoimpacthub.citizenScience.categories.conservation', 'Conservation'),\n icon: TreePine,\n },\n {\n value: 'water-quality',\n label: translate('ecoimpacthub.citizenScience.categories.waterQuality', 'Water Quality'),\n icon: Fish,\n },\n ];\n\n const filteredProjects = scienceProjects.filter(\n (project) => selectedCategory === 'all' || project.category === selectedCategory\n );\n\n const getDifficultyColor = (difficulty: string) => {\n switch (difficulty) {\n case 'beginner':\n return 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300';\n case 'intermediate':\n return 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300';\n case 'advanced':\n return 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300';\n default:\n return 'bg-muted text-muted-foreground';\n }\n };\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case 'verified':\n return 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300';\n case 'pending':\n return 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300';\n case 'needs-review':\n return 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300';\n default:\n return 'bg-muted text-muted-foreground';\n }\n };\n\n const getCategoryIcon = (category: string) => {\n switch (category) {\n case 'plant':\n return <Leaf className=\"h-4 w-4\" />;\n case 'animal':\n return <Bird className=\"h-4 w-4\" />;\n case 'pollution':\n return <AlertCircle className=\"h-4 w-4\" />;\n case 'weather':\n return <Cloud className=\"h-4 w-4\" />;\n case 'water':\n return <Fish className=\"h-4 w-4\" />;\n default:\n return <Eye className=\"h-4 w-4\" />;\n }\n };\n\n const getTabLabel = (tab: 'projects' | 'observations' | 'contribute') => {\n switch (tab) {\n case 'projects':\n return translate('ecoimpacthub.citizenScience.tabs.projects', 'Projects');\n case 'observations':\n return translate('ecoimpacthub.citizenScience.tabs.observations', 'Observations');\n case 'contribute':\n return translate('ecoimpacthub.citizenScience.tabs.contribute', 'Contribute');\n default:\n return tab;\n }\n };\n\n const stats = [\n {\n label: translate('ecoimpacthub.citizenScience.stats.observations.label', 'Observations'),\n value: '47',\n sub: translate('ecoimpacthub.citizenScience.stats.observations.sub', 'contributed'),\n icon: Microscope,\n color: 'text-primary',\n },\n {\n label: translate('ecoimpacthub.citizenScience.stats.verified.label', 'Verified'),\n value: '32',\n sub: translate('ecoimpacthub.citizenScience.stats.verified.sub', 'by experts'),\n icon: CheckCircle,\n color: 'text-green-600',\n },\n {\n label: translate('ecoimpacthub.citizenScience.stats.projects.label', 'Projects'),\n value: '8',\n sub: translate('ecoimpacthub.citizenScience.stats.projects.sub', 'participated in'),\n icon: Award,\n color: 'text-blue-600',\n },\n {\n label: translate('ecoimpacthub.citizenScience.stats.accuracyRate.label', 'Accuracy Rate'),\n value: '94%',\n sub: translate(\n 'ecoimpacthub.citizenScience.stats.accuracyRate.sub',\n 'identification accuracy'\n ),\n icon: Star,\n color: 'text-purple-600',\n },\n ];\n\n return (\n <div className=\"min-h-screen p-4\">\n <div className=\"mx-auto max-w-7xl space-y-8\">\n <div className=\"space-y-4 text-center\">\n <h1 className=\"text-4xl font-bold\">\n {translate('ecoimpacthub.citizenScience.title', 'Citizen Science Hub')}\n </h1>\n <p className=\"mx-auto max-w-3xl text-xl text-muted-foreground\">\n {translate(\n 'ecoimpacthub.citizenScience.subtitle',\n 'Contribute to real scientific research by collecting environmental data, identifying species, and monitoring ecosystem health in your community.'\n )}\n </p>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-4\">\n {stats.map((stat) => {\n const Icon = stat.icon;\n return (\n <Card key={stat.label}>\n <CardContent className=\"space-y-2 p-6\">\n <div className={`flex items-center gap-2 ${stat.color}`}>\n <Icon className=\"h-5 w-5\" />\n <span className=\"font-semibold\">{stat.label}</span>\n </div>\n <div className=\"text-3xl font-bold\">{stat.value}</div>\n <div className=\"text-sm text-muted-foreground\">{stat.sub}</div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n\n <div className=\"flex gap-2 border-b\">\n {(['projects', 'observations', 'contribute'] as const).map((tab) => (\n <Button\n key={tab}\n variant={activeTab === tab ? 'default' : 'ghost'}\n onClick={() => setActiveTab(tab)}\n >\n {tab === 'projects' && <Search className=\"mr-2 h-4 w-4\" />}\n {tab === 'observations' && <Eye className=\"mr-2 h-4 w-4\" />}\n {tab === 'contribute' && <Plus className=\"mr-2 h-4 w-4\" />}\n {getTabLabel(tab)}\n </Button>\n ))}\n </div>\n\n {activeTab === 'projects' && (\n <div className=\"space-y-6\">\n <div className=\"flex flex-wrap gap-2\">\n {categories.map(({ value, label, icon: Icon }) => (\n <Button\n key={value}\n variant={selectedCategory === value ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedCategory(value)}\n className=\"flex items-center gap-2\"\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </Button>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3\">\n {filteredProjects.map((project) => (\n <Card\n key={project.id}\n className=\"overflow-hidden transition-shadow hover:shadow-lg\"\n >\n <CardContent className=\"space-y-4 p-6\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"text-2xl\">{project.icon}</div>\n <div>\n <h3 className=\"line-clamp-2 text-lg font-semibold\">{project.title}</h3>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <MapPin className=\"h-3 w-3\" />\n <span>{project.location}</span>\n </div>\n </div>\n </div>\n <Badge className={getDifficultyColor(project.difficulty)}>\n {project.difficulty}\n </Badge>\n </div>\n\n <p className=\"line-clamp-3 text-sm text-muted-foreground\">\n {project.description}\n </p>\n\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">\n {translate(\n 'ecoimpacthub.citizenScience.projects.requiredSkills',\n 'Required Skills:'\n )}\n </p>\n <div className=\"flex flex-wrap gap-1\">\n {project.requiredSkills.map((skill) => (\n <span\n key={skill}\n className=\"rounded bg-muted px-2 py-1 text-xs text-muted-foreground\"\n >\n {skill}\n </span>\n ))}\n </div>\n </div>\n\n <div className=\"flex items-center justify-between text-sm text-muted-foreground\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-1\">\n <Users className=\"h-4 w-4\" />\n <span>{project.contributors.toLocaleString()}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Eye className=\"h-4 w-4\" />\n <span>{project.observations.toLocaleString()}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-1\">\n <Calendar className=\"h-4 w-4\" />\n <span>{new Date(project.endDate).toLocaleDateString()}</span>\n </div>\n </div>\n\n <Button className=\"w-full\">\n {translate('ecoimpacthub.citizenScience.actions.joinProject', 'Join Project')}\n </Button>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n )}\n\n {activeTab === 'observations' && (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-2xl font-bold\">\n {translate('ecoimpacthub.citizenScience.observations.title', 'Your Observations')}\n </h2>\n <Button>\n <Plus className=\"mr-2 h-4 w-4\" />\n {translate('ecoimpacthub.citizenScience.actions.newObservation', 'New Observation')}\n </Button>\n </div>\n\n <div className=\"grid gap-4\">\n {observations.map((observation) => (\n <Card key={observation.id}>\n <CardContent className=\"p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"text-4xl\">{observation.image}</div>\n <div className=\"flex-1 space-y-3\">\n <div className=\"flex items-start justify-between\">\n <div>\n <h3 className=\"text-lg font-semibold\">{observation.title}</h3>\n <div className=\"flex items-center gap-4 text-sm text-muted-foreground\">\n <div className=\"flex items-center gap-1\">\n {getCategoryIcon(observation.category)}\n <span>{observation.category}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <MapPin className=\"h-4 w-4\" />\n <span>{observation.location}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Calendar className=\"h-4 w-4\" />\n <span>{new Date(observation.date).toLocaleDateString()}</span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge className={getStatusColor(observation.status)}>\n {observation.status.replace('-', ' ')}\n </Badge>\n <div className=\"text-sm text-muted-foreground\">\n {translate(\n 'ecoimpacthub.citizenScience.observations.confidence',\n '{{value}}% confidence',\n { value: observation.confidence }\n )}\n </div>\n </div>\n </div>\n <p className=\"text-sm text-muted-foreground\">{observation.description}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n )}\n\n {activeTab === 'contribute' && (\n <div className=\"space-y-8\">\n <div className=\"space-y-4 text-center\">\n <h2 className=\"text-3xl font-bold\">\n {translate('ecoimpacthub.citizenScience.contribute.title', 'Make a Contribution')}\n </h2>\n <p className=\"mx-auto max-w-2xl text-muted-foreground\">\n {translate(\n 'ecoimpacthub.citizenScience.contribute.subtitle',\n \"Choose how you'd like to contribute to environmental science and conservation efforts.\"\n )}\n </p>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-3\">\n <Card className=\"text-center transition-shadow hover:shadow-lg\">\n <CardContent className=\"space-y-4 p-8\">\n <div className=\"mb-4 text-4xl\">🔍</div>\n <h3 className=\"text-xl font-semibold\">\n {translate(\n 'ecoimpacthub.citizenScience.cards.identifySpecies.title',\n 'Identify Species'\n )}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n {translate(\n 'ecoimpacthub.citizenScience.cards.identifySpecies.description',\n 'Use AI-powered tools to identify plants and animals you encounter in nature.'\n )}\n </p>\n <Button className=\"w-full\">\n <Camera className=\"mr-2 h-4 w-4\" />\n {translate('ecoimpacthub.citizenScience.actions.takePhoto', 'Take Photo')}\n </Button>\n </CardContent>\n </Card>\n\n <Card className=\"text-center transition-shadow hover:shadow-lg\">\n <CardContent className=\"space-y-4 p-8\">\n <div className=\"mb-4 text-4xl\">📊</div>\n <h3 className=\"text-xl font-semibold\">\n {translate(\n 'ecoimpacthub.citizenScience.cards.collectData.title',\n 'Collect Data'\n )}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n {translate(\n 'ecoimpacthub.citizenScience.cards.collectData.description',\n 'Record environmental measurements and observations for ongoing research projects.'\n )}\n </p>\n <Button className=\"w-full\">\n <Upload className=\"mr-2 h-4 w-4\" />\n {translate('ecoimpacthub.citizenScience.actions.submitData', 'Submit Data')}\n </Button>\n </CardContent>\n </Card>\n\n <Card className=\"text-center transition-shadow hover:shadow-lg\">\n <CardContent className=\"space-y-4 p-8\">\n <div className=\"mb-4 text-4xl\">⚠️</div>\n <h3 className=\"text-xl font-semibold\">\n {translate(\n 'ecoimpacthub.citizenScience.cards.reportIssues.title',\n 'Report Issues'\n )}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n {translate(\n 'ecoimpacthub.citizenScience.cards.reportIssues.description',\n 'Document pollution, invasive species, or other environmental concerns in your area.'\n )}\n </p>\n <Button className=\"w-full\">\n <MapPin className=\"mr-2 h-4 w-4\" />\n {translate('ecoimpacthub.citizenScience.actions.reportIssue', 'Report Issue')}\n </Button>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardContent className=\"p-6\">\n <h3 className=\"mb-4 text-xl font-semibold\">\n {translate(\n 'ecoimpacthub.citizenScience.quickObservation.title',\n 'Quick Observation'\n )}\n </h3>\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">\n {translate(\n 'ecoimpacthub.citizenScience.quickObservation.whatLabel',\n 'What did you observe?'\n )}\n </label>\n <Input\n placeholder={translate(\n 'ecoimpacthub.citizenScience.quickObservation.whatPlaceholder',\n 'e.g., Red-tailed hawk, Plastic debris...'\n )}\n className=\"mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">\n {translate(\n 'ecoimpacthub.citizenScience.quickObservation.locationLabel',\n 'Location'\n )}\n </label>\n <Input\n placeholder={translate(\n 'ecoimpacthub.citizenScience.quickObservation.locationPlaceholder',\n 'e.g., Central Park, NYC'\n )}\n className=\"mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">\n {translate(\n 'ecoimpacthub.citizenScience.quickObservation.descriptionLabel',\n 'Description'\n )}\n </label>\n <Input\n placeholder={translate(\n 'ecoimpacthub.citizenScience.quickObservation.descriptionPlaceholder',\n 'Describe what you observed...'\n )}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div className=\"space-y-4\">\n <div className=\"rounded-lg border-2 border-dashed border-muted p-8 text-center\">\n <Camera className=\"mx-auto mb-2 h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n {translate(\n 'ecoimpacthub.citizenScience.quickObservation.addPhoto',\n 'Click to add photo'\n )}\n </p>\n </div>\n <Button className=\"w-full\">\n {translate(\n 'ecoimpacthub.citizenScience.actions.submitObservation',\n 'Submit Observation'\n )}\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommunityPage.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/pages/CommunityPage.tsx"],"names":[],"mappings":"AA4BA,wBAAgB,aAAa,4CA4Z5B"}
|