Update index.js
Browse files
index.js
CHANGED
|
@@ -64,8 +64,9 @@ function calcValue(name, weight, rarity = "Normal", mutations = []) {
|
|
| 64 |
}
|
| 65 |
|
| 66 |
app.get("/", (req, res) => {
|
| 67 |
-
const fruitOptions = fruits.map(f => f[0]).sort().map(name => `<option>${name}</option>`).join("")
|
| 68 |
-
const mutationOptions = Object.keys(mutationMultiplier).map(m => `<option>${m}</option>`).join("")
|
|
|
|
| 69 |
res.send(`
|
| 70 |
<!DOCTYPE html>
|
| 71 |
<html lang='en'>
|
|
@@ -77,21 +78,30 @@ app.get("/", (req, res) => {
|
|
| 77 |
<style>
|
| 78 |
.fade-in { animation: fadeIn 0.6s ease-in-out; }
|
| 79 |
@keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }
|
|
|
|
| 80 |
</style>
|
| 81 |
</head>
|
| 82 |
<body class="bg-gradient-to-br from-[#0f0f1a] to-[#0c1b2a] text-white flex items-center justify-center min-h-screen px-4">
|
| 83 |
<div class="w-full max-w-lg fade-in">
|
| 84 |
<h1 class="text-3xl font-bold text-center mb-4 text-blue-300">Grow a Garden</h1>
|
| 85 |
-
<h2 class="text-lg text-center text-blue-400 mb-6">Calculate your fruit's price
|
| 86 |
<form id="form" class="bg-[#1a1d2c] p-6 rounded-2xl shadow-xl space-y-4">
|
| 87 |
-
<
|
| 88 |
-
<
|
| 89 |
-
|
| 90 |
-
<
|
| 91 |
-
<
|
| 92 |
-
<
|
| 93 |
-
|
| 94 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
<button type="submit" class="w-full bg-blue-500 hover:bg-blue-600 p-3 rounded font-bold transition-all">Calculate</button>
|
| 96 |
<div id="result" class="text-center text-blue-300 font-semibold"></div>
|
| 97 |
</form>
|
|
@@ -102,11 +112,12 @@ app.get("/", (req, res) => {
|
|
| 102 |
const form = e.target
|
| 103 |
const data = new URLSearchParams()
|
| 104 |
const fruit = form.fruit.value
|
|
|
|
| 105 |
data.append("fruit", fruit)
|
| 106 |
data.append("weight", form.weight.value)
|
| 107 |
-
data.append("rarity",
|
| 108 |
-
let selected = Array.from(form.mutations.selectedOptions).map(o => o.value)
|
| 109 |
|
|
|
|
| 110 |
if (selected.includes("Frozen") || (selected.includes("Wet") && selected.includes("Chilled"))) {
|
| 111 |
selected = selected.filter(m => !["Wet", "Chilled"].includes(m))
|
| 112 |
if (!selected.includes("Frozen")) selected.push("Frozen")
|
|
@@ -129,9 +140,10 @@ app.get("/", (req, res) => {
|
|
| 129 |
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
| 130 |
body: data
|
| 131 |
})
|
|
|
|
| 132 |
const json = await res.json()
|
| 133 |
-
|
| 134 |
-
|
| 135 |
}
|
| 136 |
</script>
|
| 137 |
</body>
|
|
|
|
| 64 |
}
|
| 65 |
|
| 66 |
app.get("/", (req, res) => {
|
| 67 |
+
const fruitOptions = fruits.map(f => f[0]).sort().map(name => `<option value="${name}">${name}</option>`).join("")
|
| 68 |
+
const mutationOptions = Object.keys(mutationMultiplier).map(m => `<option value="${m}">${m}</option>`).join("")
|
| 69 |
+
const rarityOptions = ["Normal", "Gold", "Rainbow"].map(r => `<option value="${r}">${r}</option>`).join("")
|
| 70 |
res.send(`
|
| 71 |
<!DOCTYPE html>
|
| 72 |
<html lang='en'>
|
|
|
|
| 78 |
<style>
|
| 79 |
.fade-in { animation: fadeIn 0.6s ease-in-out; }
|
| 80 |
@keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }
|
| 81 |
+
select { appearance: none; background-image: url("data:image/svg+xml,%3Csvg fill='white' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 12l-4-4h8l-4 4z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 0.75rem center; background-size: 1rem; }
|
| 82 |
</style>
|
| 83 |
</head>
|
| 84 |
<body class="bg-gradient-to-br from-[#0f0f1a] to-[#0c1b2a] text-white flex items-center justify-center min-h-screen px-4">
|
| 85 |
<div class="w-full max-w-lg fade-in">
|
| 86 |
<h1 class="text-3xl font-bold text-center mb-4 text-blue-300">Grow a Garden</h1>
|
| 87 |
+
<h2 class="text-lg text-center text-blue-400 mb-6">Calculate your fruit's price</h2>
|
| 88 |
<form id="form" class="bg-[#1a1d2c] p-6 rounded-2xl shadow-xl space-y-4">
|
| 89 |
+
<div>
|
| 90 |
+
<label class="block mb-1 text-sm">Fruit</label>
|
| 91 |
+
<select name="fruit" id="fruit" required class="w-full p-3 rounded bg-[#2c3144] text-white focus:outline-none focus:ring-2 focus:ring-blue-400">${fruitOptions}</select>
|
| 92 |
+
</div>
|
| 93 |
+
<div>
|
| 94 |
+
<label class="block mb-1 text-sm">Weight (kg)</label>
|
| 95 |
+
<input name="weight" type="number" step="0.01" placeholder="0.00" required class="w-full p-3 rounded bg-[#2c3144] text-white focus:outline-none focus:ring-2 focus:ring-blue-400">
|
| 96 |
+
</div>
|
| 97 |
+
<div>
|
| 98 |
+
<label class="block mb-1 text-sm">Rarity</label>
|
| 99 |
+
<select name="rarity" id="rarity" required class="w-full p-3 rounded bg-[#2c3144] text-white focus:outline-none focus:ring-2 focus:ring-blue-400">${rarityOptions}</select>
|
| 100 |
+
</div>
|
| 101 |
+
<div>
|
| 102 |
+
<label class="block mb-1 text-sm">Mutations</label>
|
| 103 |
+
<select name="mutations" id="mutations" multiple size="6" class="w-full p-3 rounded bg-[#2c3144] text-white focus:outline-none focus:ring-2 focus:ring-blue-400">${mutationOptions}</select>
|
| 104 |
+
</div>
|
| 105 |
<button type="submit" class="w-full bg-blue-500 hover:bg-blue-600 p-3 rounded font-bold transition-all">Calculate</button>
|
| 106 |
<div id="result" class="text-center text-blue-300 font-semibold"></div>
|
| 107 |
</form>
|
|
|
|
| 112 |
const form = e.target
|
| 113 |
const data = new URLSearchParams()
|
| 114 |
const fruit = form.fruit.value
|
| 115 |
+
const rarity = form.rarity.value.trim()
|
| 116 |
data.append("fruit", fruit)
|
| 117 |
data.append("weight", form.weight.value)
|
| 118 |
+
data.append("rarity", rarity)
|
|
|
|
| 119 |
|
| 120 |
+
let selected = Array.from(form.mutations.selectedOptions).map(o => o.value)
|
| 121 |
if (selected.includes("Frozen") || (selected.includes("Wet") && selected.includes("Chilled"))) {
|
| 122 |
selected = selected.filter(m => !["Wet", "Chilled"].includes(m))
|
| 123 |
if (!selected.includes("Frozen")) selected.push("Frozen")
|
|
|
|
| 140 |
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
| 141 |
body: data
|
| 142 |
})
|
| 143 |
+
|
| 144 |
const json = await res.json()
|
| 145 |
+
const output = json.value ? \`<p>Total: <span class='text-blue-400'>\${json.value}</span></p>\` : \`<p class='text-red-400'>Invalid input</p>\`
|
| 146 |
+
document.getElementById("result").innerHTML = output
|
| 147 |
}
|
| 148 |
</script>
|
| 149 |
</body>
|