-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscore.html
More file actions
271 lines (244 loc) · 11.8 KB
/
Copy pathscore.html
File metadata and controls
271 lines (244 loc) · 11.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
<!DOCTYPE html>
<html lang="en" class="scroll-smooth dark">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Ecological Registry — Score</title>
<meta
name="description"
content="Ecological Registry score profile showing ecological assessment, badges, and upgrade opportunities."
/>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Abril+Fatface&family=IBM+Plex+Sans:wght@300;400;500&display=swap"
rel="stylesheet"
/>
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
darkMode: "class",
theme: {
extend: {
colors: {
regGreen: "#3d4535",
regBeige: "#fff0dc",
regLine: "#d7ccb9",
regSoft: "#f7ead6",
regDarkPanel: "#485141",
regDarkLine: "rgba(255,240,220,0.18)"
},
fontFamily: {
serif: ["Abril Fatface", "serif"],
sans: ["IBM Plex Sans", "sans-serif"]
},
boxShadow: {
card: "0 18px 50px rgba(32, 33, 28, 0.08)"
}
}
}
};
</script>
<style>
.metric-bar-fill {
transition: width 700ms ease;
}
</style>
</head>
<body class="bg-regBeige text-regGreen font-sans antialiased transition-colors duration-300 dark:bg-regGreen dark:text-regBeige">
<main class="min-h-screen px-6 py-10 md:px-10 lg:px-16">
<section class="mx-auto max-w-6xl">
<div class="mb-8 flex flex-col gap-5 border-b border-regLine pb-6 dark:border-regDarkLine md:flex-row md:items-end md:justify-between">
<div>
<p class="mb-3 text-xs uppercase tracking-[0.28em]">Ecological Registry</p>
<h1 class="font-serif text-4xl leading-none md:text-6xl">Score Panel</h1>
</div>
<button
id="themeToggle"
type="button"
class="inline-flex items-center justify-center border border-regLine px-4 py-2 text-xs uppercase tracking-[0.22em] transition hover:opacity-80 dark:border-regDarkLine"
>
Toggle light / dark
</button>
</div>
<div class="grid gap-6 lg:grid-cols-[1.2fr_0.8fr]">
<section class="border border-regLine bg-white text-regGreen shadow-card dark:border-regDarkLine dark:bg-regDarkPanel dark:text-regBeige">
<div class="border-b border-regLine px-6 py-5 dark:border-regDarkLine md:px-8 md:py-6">
<div class="flex flex-col gap-4 md:flex-row md:items-end md:justify-between">
<div>
<p class="mb-2 text-xs uppercase tracking-[0.28em]">Registered Garden</p>
<h2 id="gardenName" class="font-serif text-3xl leading-none md:text-5xl">Loading...</h2>
<p id="gardenMeta" class="mt-3 text-sm text-regGreen/75 dark:text-regBeige/75">
Loading assessment data...
</p>
</div>
<div class="border border-regLine bg-regSoft px-4 py-3 text-left dark:border-regDarkLine dark:bg-regGreen md:min-w-[210px]">
<p class="text-xs uppercase tracking-[0.28em]">Verification</p>
<p id="verificationLabel" class="mt-2 text-lg font-medium">Loading...</p>
</div>
</div>
</div>
<div class="grid gap-0 lg:grid-cols-[0.9fr_1.1fr]">
<div class="border-b border-regLine px-6 py-6 dark:border-regDarkLine lg:border-b-0 lg:border-r md:px-8 md:py-8">
<p class="text-xs uppercase tracking-[0.28em]">Current Ecological Score</p>
<div class="mt-4 flex items-end gap-3">
<div id="scoreValue" class="font-serif text-7xl leading-none md:text-8xl">--</div>
<div class="pb-2 text-lg">/ 100</div>
</div>
<div class="mt-5 h-px w-full bg-regLine dark:bg-regDarkLine"></div>
<div class="mt-5 grid grid-cols-2 gap-4 text-sm">
<div>
<p class="text-xs uppercase tracking-[0.22em]">Level</p>
<p id="scoreLevel" class="mt-2 text-lg font-medium">Loading...</p>
</div>
<div>
<p class="text-xs uppercase tracking-[0.22em]">Badges</p>
<p id="badgeCount" class="mt-2 text-lg font-medium">Loading...</p>
</div>
</div>
<div class="mt-6 border border-regLine bg-regSoft p-4 dark:border-regDarkLine dark:bg-regGreen">
<p class="text-xs uppercase tracking-[0.22em]">Progress note</p>
<p id="progressNote" class="mt-2 text-sm leading-relaxed text-regGreen/85 dark:text-regBeige/85">
Loading...
</p>
</div>
</div>
<div class="px-6 py-6 md:px-8 md:py-8">
<div class="flex items-center justify-between">
<h3 class="font-serif text-2xl">Category Breakdown</h3>
<p class="text-xs uppercase tracking-[0.22em] text-regGreen/70 dark:text-regBeige/70">
Live from inputs
</p>
</div>
<div id="categoryList" class="mt-6 space-y-5"></div>
</div>
</div>
</section>
<aside class="space-y-6">
<section class="border border-regLine bg-white px-6 py-6 text-regGreen shadow-card dark:border-regDarkLine dark:bg-regDarkPanel dark:text-regBeige md:px-8">
<div class="flex items-center justify-between gap-4">
<h3 class="font-serif text-2xl">Badges</h3>
<p class="text-xs uppercase tracking-[0.22em] text-regGreen/70 dark:text-regBeige/70">
Identity layer
</p>
</div>
<div id="badgeList" class="mt-5 flex flex-wrap gap-3"></div>
</section>
<section class="border border-regLine bg-white px-6 py-6 text-regGreen shadow-card dark:border-regDarkLine dark:bg-regDarkPanel dark:text-regBeige md:px-8">
<div class="flex items-center justify-between gap-4">
<h3 class="font-serif text-2xl">Next Upgrades</h3>
<p class="text-xs uppercase tracking-[0.22em] text-regGreen/70 dark:text-regBeige/70">
Fastest gains
</p>
</div>
<div id="recommendationList" class="mt-5 space-y-3"></div>
</section>
<section class="border border-regLine bg-regGreen px-6 py-6 text-regBeige shadow-card dark:border-regDarkLine md:px-8">
<p class="text-xs uppercase tracking-[0.24em] text-regBeige/70">Why this matters</p>
<p class="mt-3 font-serif text-2xl leading-tight">
A score turns ecology into something visible, improvable, and culturally legible.
</p>
<p class="mt-4 text-sm leading-relaxed text-regBeige/85">
This garden can now be understood not only as a private landscape, but as a measurable ecological asset within a wider urban network.
</p>
</section>
</aside>
</div>
</section>
</main>
<script src="js/reg-score.js"></script>
<script>
const savedTheme = localStorage.getItem("reg-theme");
if (savedTheme === "light") {
document.documentElement.classList.remove("dark");
} else {
document.documentElement.classList.add("dark");
}
function getGardenFromURL() {
const params = new URLSearchParams(window.location.search);
return params.get("garden") || "arundel";
}
function renderScorePanel(record) {
const result = scoreEcologicalRegistry(record);
document.getElementById("gardenName").textContent = record.garden_name;
document.getElementById("gardenMeta").textContent =
`${record.suburb} · Assessed ${record.assessment_date} · Score ${record.score_version}`;
document.getElementById("verificationLabel").textContent = result.verificationLabel;
document.getElementById("scoreValue").textContent = result.total;
document.getElementById("scoreLevel").textContent = result.level;
document.getElementById("badgeCount").textContent = `${result.badges.length} unlocked`;
const progressNote = document.getElementById("progressNote");
if (result.total >= 81) {
progressNote.textContent =
"This garden is operating as a high-functioning ecological landscape with strong habitat layering, verified stewardship, and clear network value.";
} else if (result.total >= 61) {
progressNote.textContent =
"This garden is now clearly legible as a registered ecological asset, with further gains available through water systems and species uplift.";
} else {
progressNote.textContent =
"This garden has meaningful ecological foundations and can be strengthened further through additional habitat layers, verification, and stewardship actions.";
}
const categoryList = document.getElementById("categoryList");
categoryList.innerHTML = result.categories.map(category => {
const width = `${(category.score / category.max) * 100}%`;
return `
<div>
<div class="mb-2 flex items-center justify-between gap-4 text-sm">
<span class="font-medium">${category.label}</span>
<span>${category.score} / ${category.max}</span>
</div>
<div class="h-2 w-full bg-regSoft dark:bg-regBeige/15">
<div class="metric-bar-fill h-2 bg-regGreen dark:bg-regBeige" style="width:${width}"></div>
</div>
</div>
`;
}).join("");
const badgeList = document.getElementById("badgeList");
badgeList.innerHTML = result.badges.map(badge => `
<span class="border border-regLine bg-regSoft px-3 py-2 text-sm dark:border-regDarkLine dark:bg-regGreen">
${badge}
</span>
`).join("");
const recommendationList = document.getElementById("recommendationList");
recommendationList.innerHTML = result.recommendations.slice(0, 4).map(item => `
<div class="border border-regLine p-4 dark:border-regDarkLine">
<div class="flex items-start justify-between gap-4">
<div>
<p class="text-sm font-medium">${item.action}</p>
<p class="mt-1 text-xs uppercase tracking-[0.18em] text-regGreen/65 dark:text-regBeige/65">Potential gain</p>
</div>
<div class="font-serif text-2xl leading-none">+${item.points}</div>
</div>
</div>
`).join("");
}
async function loadGardenRecord() {
try {
const gardenName = getGardenFromURL();
const response = await fetch(`data/${gardenName}.json`);
if (!response.ok) {
throw new Error("Could not load garden data");
}
const record = await response.json();
renderScorePanel(record);
} catch (error) {
console.error(error);
document.getElementById("gardenName").textContent = "Unable to load score";
document.getElementById("gardenMeta").textContent =
"Check data file name or URL parameter.";
document.getElementById("progressNote").textContent =
"The score panel could not load the assessment data.";
document.getElementById("categoryList").innerHTML = "";
document.getElementById("badgeList").innerHTML = "";
document.getElementById("recommendationList").innerHTML = "";
}
}
document.getElementById("themeToggle").addEventListener("click", () => {
document.documentElement.classList.toggle("dark");
const isDark = document.documentElement.classList.contains("dark");
localStorage.setItem("reg-theme", isDark ? "dark" : "light");
});
loadGardenRecord();
</script>
</body>
</html>