astar-visualizer 1.0.7 → 1.0.8

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.
@@ -1,22 +1,22 @@
1
- import { jsx as w, jsxs as y } from "react/jsx-runtime";
2
- import R, { useState as H, useEffect as F, useRef as q } from "react";
3
- const P = (e) => {
1
+ import { jsx as v, jsxs as N } from "react/jsx-runtime";
2
+ import z, { useState as ee, useEffect as te, useRef as ne } from "react";
3
+ const U = (e) => {
4
4
  let t;
5
- const r = /* @__PURE__ */ new Set(), a = (u, m) => {
6
- const c = typeof u == "function" ? u(t) : u;
7
- if (!Object.is(c, t)) {
8
- const i = t;
9
- t = m ?? (typeof c != "object" || c === null) ? c : Object.assign({}, t, c), r.forEach((n) => n(t, i));
5
+ const r = /* @__PURE__ */ new Set(), s = (d, c) => {
6
+ const u = typeof d == "function" ? d(t) : d;
7
+ if (!Object.is(u, t)) {
8
+ const f = t;
9
+ t = c ?? (typeof u != "object" || u === null) ? u : Object.assign({}, t, u), r.forEach((h) => h(t, f));
10
10
  }
11
- }, o = () => t, S = { setState: a, getState: o, getInitialState: () => d, subscribe: (u) => (r.add(u), () => r.delete(u)), destroy: () => {
11
+ }, n = () => t, w = { setState: s, getState: n, getInitialState: () => i, subscribe: (d) => (r.add(d), () => r.delete(d)), destroy: () => {
12
12
  r.clear();
13
- } }, d = t = e(a, o, S);
14
- return S;
15
- }, J = (e) => e ? P(e) : P;
16
- function Y(e) {
13
+ } }, i = t = e(s, n, w);
14
+ return w;
15
+ }, se = (e) => e ? U(e) : U;
16
+ function ae(e) {
17
17
  return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
18
18
  }
19
- var M = { exports: {} }, A = {}, L = { exports: {} }, D = {};
19
+ var B = { exports: {} }, k = {}, V = { exports: {} }, W = {};
20
20
  /**
21
21
  * @license React
22
22
  * use-sync-external-store-shim.production.js
@@ -26,49 +26,49 @@ var M = { exports: {} }, A = {}, L = { exports: {} }, D = {};
26
26
  * This source code is licensed under the MIT license found in the
27
27
  * LICENSE file in the root directory of this source tree.
28
28
  */
29
- var I;
30
- function Q() {
31
- if (I)
32
- return D;
33
- I = 1;
34
- var e = R;
35
- function t(m, c) {
36
- return m === c && (m !== 0 || 1 / m === 1 / c) || m !== m && c !== c;
29
+ var q;
30
+ function le() {
31
+ if (q)
32
+ return W;
33
+ q = 1;
34
+ var e = z;
35
+ function t(c, u) {
36
+ return c === u && (c !== 0 || 1 / c === 1 / u) || c !== c && u !== u;
37
37
  }
38
- var r = typeof Object.is == "function" ? Object.is : t, a = e.useState, o = e.useEffect, l = e.useLayoutEffect, p = e.useDebugValue;
39
- function v(m, c) {
40
- var i = c(), n = a({ inst: { value: i, getSnapshot: c } }), s = n[0].inst, f = n[1];
41
- return l(
38
+ var r = typeof Object.is == "function" ? Object.is : t, s = e.useState, n = e.useEffect, o = e.useLayoutEffect, l = e.useDebugValue;
39
+ function p(c, u) {
40
+ var f = u(), h = s({ inst: { value: f, getSnapshot: u } }), m = h[0].inst, S = h[1];
41
+ return o(
42
42
  function() {
43
- s.value = i, s.getSnapshot = c, S(s) && f({ inst: s });
43
+ m.value = f, m.getSnapshot = u, w(m) && S({ inst: m });
44
44
  },
45
- [m, i, c]
46
- ), o(
45
+ [c, f, u]
46
+ ), n(
47
47
  function() {
48
- return S(s) && f({ inst: s }), m(function() {
49
- S(s) && f({ inst: s });
48
+ return w(m) && S({ inst: m }), c(function() {
49
+ w(m) && S({ inst: m });
50
50
  });
51
51
  },
52
- [m]
53
- ), p(i), i;
52
+ [c]
53
+ ), l(f), f;
54
54
  }
55
- function S(m) {
56
- var c = m.getSnapshot;
57
- m = m.value;
55
+ function w(c) {
56
+ var u = c.getSnapshot;
57
+ c = c.value;
58
58
  try {
59
- var i = c();
60
- return !r(m, i);
59
+ var f = u();
60
+ return !r(c, f);
61
61
  } catch {
62
62
  return !0;
63
63
  }
64
64
  }
65
- function d(m, c) {
66
- return c();
65
+ function i(c, u) {
66
+ return u();
67
67
  }
68
- var u = typeof window > "u" || typeof window.document > "u" || typeof window.document.createElement > "u" ? d : v;
69
- return D.useSyncExternalStore = e.useSyncExternalStore !== void 0 ? e.useSyncExternalStore : u, D;
68
+ var d = typeof window > "u" || typeof window.document > "u" || typeof window.document.createElement > "u" ? i : p;
69
+ return W.useSyncExternalStore = e.useSyncExternalStore !== void 0 ? e.useSyncExternalStore : d, W;
70
70
  }
71
- var z = {};
71
+ var P = {};
72
72
  /**
73
73
  * @license React
74
74
  * use-sync-external-store-shim.development.js
@@ -78,62 +78,62 @@ var z = {};
78
78
  * This source code is licensed under the MIT license found in the
79
79
  * LICENSE file in the root directory of this source tree.
80
80
  */
81
- var x;
82
- function X() {
83
- return x || (x = 1, process.env.NODE_ENV !== "production" && function() {
84
- function e(i, n) {
85
- return i === n && (i !== 0 || 1 / i === 1 / n) || i !== i && n !== n;
81
+ var J;
82
+ function ie() {
83
+ return J || (J = 1, process.env.NODE_ENV !== "production" && function() {
84
+ function e(f, h) {
85
+ return f === h && (f !== 0 || 1 / f === 1 / h) || f !== f && h !== h;
86
86
  }
87
- function t(i, n) {
88
- u || o.startTransition === void 0 || (u = !0, console.error(
87
+ function t(f, h) {
88
+ d || n.startTransition === void 0 || (d = !0, console.error(
89
89
  "You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."
90
90
  ));
91
- var s = n();
92
- if (!m) {
93
- var f = n();
94
- l(s, f) || (console.error(
91
+ var m = h();
92
+ if (!c) {
93
+ var S = h();
94
+ o(m, S) || (console.error(
95
95
  "The result of getSnapshot should be cached to avoid an infinite loop"
96
- ), m = !0);
96
+ ), c = !0);
97
97
  }
98
- f = p({
99
- inst: { value: s, getSnapshot: n }
98
+ S = l({
99
+ inst: { value: m, getSnapshot: h }
100
100
  });
101
- var E = f[0].inst, O = f[1];
102
- return S(
101
+ var E = S[0].inst, O = S[1];
102
+ return w(
103
103
  function() {
104
- E.value = s, E.getSnapshot = n, r(E) && O({ inst: E });
104
+ E.value = m, E.getSnapshot = h, r(E) && O({ inst: E });
105
105
  },
106
- [i, s, n]
107
- ), v(
106
+ [f, m, h]
107
+ ), p(
108
108
  function() {
109
- return r(E) && O({ inst: E }), i(function() {
109
+ return r(E) && O({ inst: E }), f(function() {
110
110
  r(E) && O({ inst: E });
111
111
  });
112
112
  },
113
- [i]
114
- ), d(s), s;
113
+ [f]
114
+ ), i(m), m;
115
115
  }
116
- function r(i) {
117
- var n = i.getSnapshot;
118
- i = i.value;
116
+ function r(f) {
117
+ var h = f.getSnapshot;
118
+ f = f.value;
119
119
  try {
120
- var s = n();
121
- return !l(i, s);
120
+ var m = h();
121
+ return !o(f, m);
122
122
  } catch {
123
123
  return !0;
124
124
  }
125
125
  }
126
- function a(i, n) {
127
- return n();
126
+ function s(f, h) {
127
+ return h();
128
128
  }
129
129
  typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < "u" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart == "function" && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
130
- var o = R, l = typeof Object.is == "function" ? Object.is : e, p = o.useState, v = o.useEffect, S = o.useLayoutEffect, d = o.useDebugValue, u = !1, m = !1, c = typeof window > "u" || typeof window.document > "u" || typeof window.document.createElement > "u" ? a : t;
131
- z.useSyncExternalStore = o.useSyncExternalStore !== void 0 ? o.useSyncExternalStore : c, typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < "u" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop == "function" && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
132
- }()), z;
130
+ var n = z, o = typeof Object.is == "function" ? Object.is : e, l = n.useState, p = n.useEffect, w = n.useLayoutEffect, i = n.useDebugValue, d = !1, c = !1, u = typeof window > "u" || typeof window.document > "u" || typeof window.document.createElement > "u" ? s : t;
131
+ P.useSyncExternalStore = n.useSyncExternalStore !== void 0 ? n.useSyncExternalStore : u, typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < "u" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop == "function" && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
132
+ }()), P;
133
133
  }
134
- var j;
135
- function K() {
136
- return j || (j = 1, process.env.NODE_ENV === "production" ? L.exports = Q() : L.exports = X()), L.exports;
134
+ var Y;
135
+ function re() {
136
+ return Y || (Y = 1, process.env.NODE_ENV === "production" ? V.exports = le() : V.exports = ie()), V.exports;
137
137
  }
138
138
  /**
139
139
  * @license React
@@ -144,61 +144,61 @@ function K() {
144
144
  * This source code is licensed under the MIT license found in the
145
145
  * LICENSE file in the root directory of this source tree.
146
146
  */
147
- var G;
148
- function Z() {
149
- if (G)
150
- return A;
151
- G = 1;
152
- var e = R, t = K();
153
- function r(d, u) {
154
- return d === u && (d !== 0 || 1 / d === 1 / u) || d !== d && u !== u;
147
+ var Q;
148
+ function ce() {
149
+ if (Q)
150
+ return k;
151
+ Q = 1;
152
+ var e = z, t = re();
153
+ function r(i, d) {
154
+ return i === d && (i !== 0 || 1 / i === 1 / d) || i !== i && d !== d;
155
155
  }
156
- var a = typeof Object.is == "function" ? Object.is : r, o = t.useSyncExternalStore, l = e.useRef, p = e.useEffect, v = e.useMemo, S = e.useDebugValue;
157
- return A.useSyncExternalStoreWithSelector = function(d, u, m, c, i) {
158
- var n = l(null);
159
- if (n.current === null) {
160
- var s = { hasValue: !1, value: null };
161
- n.current = s;
156
+ var s = typeof Object.is == "function" ? Object.is : r, n = t.useSyncExternalStore, o = e.useRef, l = e.useEffect, p = e.useMemo, w = e.useDebugValue;
157
+ return k.useSyncExternalStoreWithSelector = function(i, d, c, u, f) {
158
+ var h = o(null);
159
+ if (h.current === null) {
160
+ var m = { hasValue: !1, value: null };
161
+ h.current = m;
162
162
  } else
163
- s = n.current;
164
- n = v(
163
+ m = h.current;
164
+ h = p(
165
165
  function() {
166
- function E(g) {
166
+ function E(_) {
167
167
  if (!O) {
168
- if (O = !0, N = g, g = c(g), i !== void 0 && s.hasValue) {
169
- var b = s.value;
170
- if (i(b, g))
171
- return T = b;
168
+ if (O = !0, b = _, _ = u(_), f !== void 0 && m.hasValue) {
169
+ var C = m.value;
170
+ if (f(C, _))
171
+ return M = C;
172
172
  }
173
- return T = g;
173
+ return M = _;
174
174
  }
175
- if (b = T, a(N, g))
176
- return b;
177
- var _ = c(g);
178
- return i !== void 0 && i(b, _) ? (N = g, b) : (N = g, T = _);
175
+ if (C = M, s(b, _))
176
+ return C;
177
+ var L = u(_);
178
+ return f !== void 0 && f(C, L) ? (b = _, C) : (b = _, M = L);
179
179
  }
180
- var O = !1, N, T, C = m === void 0 ? null : m;
180
+ var O = !1, b, M, R = c === void 0 ? null : c;
181
181
  return [
182
182
  function() {
183
- return E(u());
183
+ return E(d());
184
184
  },
185
- C === null ? void 0 : function() {
186
- return E(C());
185
+ R === null ? void 0 : function() {
186
+ return E(R());
187
187
  }
188
188
  ];
189
189
  },
190
- [u, m, c, i]
190
+ [d, c, u, f]
191
191
  );
192
- var f = o(d, n[0], n[1]);
193
- return p(
192
+ var S = n(i, h[0], h[1]);
193
+ return l(
194
194
  function() {
195
- s.hasValue = !0, s.value = f;
195
+ m.hasValue = !0, m.value = S;
196
196
  },
197
- [f]
198
- ), S(f), f;
199
- }, A;
197
+ [S]
198
+ ), w(S), S;
199
+ }, k;
200
200
  }
201
- var V = {};
201
+ var I = {};
202
202
  /**
203
203
  * @license React
204
204
  * use-sync-external-store-shim/with-selector.development.js
@@ -208,150 +208,152 @@ var V = {};
208
208
  * This source code is licensed under the MIT license found in the
209
209
  * LICENSE file in the root directory of this source tree.
210
210
  */
211
- var W;
212
- function ee() {
213
- return W || (W = 1, process.env.NODE_ENV !== "production" && function() {
214
- function e(d, u) {
215
- return d === u && (d !== 0 || 1 / d === 1 / u) || d !== d && u !== u;
211
+ var X;
212
+ function ue() {
213
+ return X || (X = 1, process.env.NODE_ENV !== "production" && function() {
214
+ function e(i, d) {
215
+ return i === d && (i !== 0 || 1 / i === 1 / d) || i !== i && d !== d;
216
216
  }
217
217
  typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < "u" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart == "function" && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
218
- var t = R, r = K(), a = typeof Object.is == "function" ? Object.is : e, o = r.useSyncExternalStore, l = t.useRef, p = t.useEffect, v = t.useMemo, S = t.useDebugValue;
219
- V.useSyncExternalStoreWithSelector = function(d, u, m, c, i) {
220
- var n = l(null);
221
- if (n.current === null) {
222
- var s = { hasValue: !1, value: null };
223
- n.current = s;
218
+ var t = z, r = re(), s = typeof Object.is == "function" ? Object.is : e, n = r.useSyncExternalStore, o = t.useRef, l = t.useEffect, p = t.useMemo, w = t.useDebugValue;
219
+ I.useSyncExternalStoreWithSelector = function(i, d, c, u, f) {
220
+ var h = o(null);
221
+ if (h.current === null) {
222
+ var m = { hasValue: !1, value: null };
223
+ h.current = m;
224
224
  } else
225
- s = n.current;
226
- n = v(
225
+ m = h.current;
226
+ h = p(
227
227
  function() {
228
- function E(g) {
228
+ function E(_) {
229
229
  if (!O) {
230
- if (O = !0, N = g, g = c(g), i !== void 0 && s.hasValue) {
231
- var b = s.value;
232
- if (i(b, g))
233
- return T = b;
230
+ if (O = !0, b = _, _ = u(_), f !== void 0 && m.hasValue) {
231
+ var C = m.value;
232
+ if (f(C, _))
233
+ return M = C;
234
234
  }
235
- return T = g;
235
+ return M = _;
236
236
  }
237
- if (b = T, a(N, g))
238
- return b;
239
- var _ = c(g);
240
- return i !== void 0 && i(b, _) ? (N = g, b) : (N = g, T = _);
237
+ if (C = M, s(b, _))
238
+ return C;
239
+ var L = u(_);
240
+ return f !== void 0 && f(C, L) ? (b = _, C) : (b = _, M = L);
241
241
  }
242
- var O = !1, N, T, C = m === void 0 ? null : m;
242
+ var O = !1, b, M, R = c === void 0 ? null : c;
243
243
  return [
244
244
  function() {
245
- return E(u());
245
+ return E(d());
246
246
  },
247
- C === null ? void 0 : function() {
248
- return E(C());
247
+ R === null ? void 0 : function() {
248
+ return E(R());
249
249
  }
250
250
  ];
251
251
  },
252
- [u, m, c, i]
252
+ [d, c, u, f]
253
253
  );
254
- var f = o(d, n[0], n[1]);
255
- return p(
254
+ var S = n(i, h[0], h[1]);
255
+ return l(
256
256
  function() {
257
- s.hasValue = !0, s.value = f;
257
+ m.hasValue = !0, m.value = S;
258
258
  },
259
- [f]
260
- ), S(f), f;
259
+ [S]
260
+ ), w(S), S;
261
261
  }, typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < "u" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop == "function" && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
262
- }()), V;
262
+ }()), I;
263
263
  }
264
- process.env.NODE_ENV === "production" ? M.exports = Z() : M.exports = ee();
265
- var te = M.exports;
266
- const re = /* @__PURE__ */ Y(te), { useDebugValue: oe } = R, { useSyncExternalStoreWithSelector: ne } = re;
267
- const se = (e) => e;
268
- function ae(e, t = se, r) {
269
- const a = ne(
264
+ process.env.NODE_ENV === "production" ? B.exports = ce() : B.exports = ue();
265
+ var de = B.exports;
266
+ const fe = /* @__PURE__ */ ae(de), { useDebugValue: he } = z, { useSyncExternalStoreWithSelector: me } = fe;
267
+ const pe = (e) => e;
268
+ function ve(e, t = pe, r) {
269
+ const s = me(
270
270
  e.subscribe,
271
271
  e.getState,
272
272
  e.getServerState || e.getInitialState,
273
273
  t,
274
274
  r
275
275
  );
276
- return oe(a), a;
276
+ return he(s), s;
277
277
  }
278
- const $ = (e) => {
279
- const t = typeof e == "function" ? J(e) : e, r = (a, o) => ae(t, a, o);
278
+ const Z = (e) => {
279
+ const t = typeof e == "function" ? se(e) : e, r = (s, n) => ve(t, s, n);
280
280
  return Object.assign(r, t), r;
281
- }, le = (e) => e ? $(e) : $;
282
- var h = /* @__PURE__ */ ((e) => (e[e.Empty = 0] = "Empty", e[e.Start = 1] = "Start", e[e.End = 2] = "End", e[e.Obstacle = 3] = "Obstacle", e[e.Visited = 4] = "Visited", e[e.Path = 5] = "Path", e))(h || {});
283
- const k = (e, t) => {
284
- const r = Math.abs(e.row - t.row), a = Math.abs(e.col - t.col);
285
- return Math.floor(10 * Math.sqrt(r * r + a * a));
286
- }, ie = (e, t) => ({
281
+ }, we = (e) => e ? Z(e) : Z;
282
+ var a = /* @__PURE__ */ ((e) => (e[e.Empty = 0] = "Empty", e[e.Start = 1] = "Start", e[e.End = 2] = "End", e[e.Obstacle = 3] = "Obstacle", e[e.Visited = 4] = "Visited", e[e.Path = 5] = "Path", e[e.Water = 6] = "Water", e[e.Forest = 7] = "Forest", e[e.Mountain = 8] = "Mountain", e))(a || {}), A = /* @__PURE__ */ ((e) => (e.Classic = "classic", e.Medieval = "medieval", e))(A || {});
283
+ const x = (e, t) => {
284
+ const r = Math.abs(e.row - t.row), s = Math.abs(e.col - t.col);
285
+ return Math.floor(10 * Math.sqrt(r * r + s * s));
286
+ }, be = (e, t) => ({
287
287
  row: e.row,
288
288
  col: e.col,
289
289
  g: 0,
290
- h: k(e, t),
291
- f: k(e, t),
290
+ h: x(e, t),
291
+ f: x(e, t),
292
292
  parent: null
293
- }), ce = (e, t, r) => {
294
- const a = [
293
+ }), ge = (e, t, r) => {
294
+ const s = [
295
295
  { row: e.row - 1, col: e.col },
296
296
  { row: e.row + 1, col: e.col },
297
297
  { row: e.row, col: e.col - 1 },
298
298
  { row: e.row, col: e.col + 1 }
299
299
  ];
300
- return r && a.push(
300
+ r && s.push(
301
301
  { row: e.row - 1, col: e.col - 1 },
302
302
  { row: e.row - 1, col: e.col + 1 },
303
303
  { row: e.row + 1, col: e.col - 1 },
304
304
  { row: e.row + 1, col: e.col + 1 }
305
- ), a.filter((o) => o.row >= 0 && o.row < t.length && o.col >= 0 && o.col < t[0].length && t[o.row][o.col].state !== h.Obstacle).map((o) => ({
305
+ );
306
+ const n = [a.Obstacle, a.Water, a.Mountain];
307
+ return s.filter((o) => o.row >= 0 && o.row < t.length && o.col >= 0 && o.col < t[0].length && !n.includes(t[o.row][o.col].state)).map((o) => ({
306
308
  row: o.row,
307
309
  col: o.col,
308
310
  state: t[o.row][o.col].state
309
311
  }));
310
- }, ue = (e, t, r) => {
311
- const a = Math.abs(e.row - t.row), o = Math.abs(e.col - t.col), l = e.g + (a === 0 || o === 0 ? 10 : 14), p = k(t, r), v = l + p;
312
- return { g: l, h: p, f: v };
313
- }, de = (e) => {
312
+ }, Ee = (e, t, r) => {
313
+ const s = Math.abs(e.row - t.row), n = Math.abs(e.col - t.col), o = e.g + (s === 0 || n === 0 ? 10 : 14), l = x(t, r), p = o + l;
314
+ return { g: o, h: l, f: p };
315
+ }, Se = (e) => {
314
316
  const t = [];
315
317
  let r = e;
316
318
  for (; r; )
317
319
  t.push(r), r = r.parent;
318
320
  return t.reverse();
319
- }, fe = (e, t, r, a) => {
320
- const o = [], l = [], p = ie(t, r);
321
- for (o.push(p); o.length > 0; ) {
322
- o.sort((d, u) => d.f - u.f);
323
- const v = o.shift();
324
- if (v.row === r.row && v.col === r.col)
325
- return l.push(v), { path: de(v), visitedNodes: l };
326
- l.push(v);
327
- const S = ce(v, e, a);
328
- for (const d of S) {
329
- if (l.some((n) => n.row === d.row && n.col === d.col))
321
+ }, _e = (e, t, r, s) => {
322
+ const n = [], o = [], l = be(t, r);
323
+ for (n.push(l); n.length > 0; ) {
324
+ n.sort((i, d) => i.f - d.f);
325
+ const p = n.shift();
326
+ if (p.row === r.row && p.col === r.col)
327
+ return o.push(p), { path: Se(p), visitedNodes: o };
328
+ o.push(p);
329
+ const w = ge(p, e, s);
330
+ for (const i of w) {
331
+ if (o.some((h) => h.row === i.row && h.col === i.col))
330
332
  continue;
331
- const { g: u, h: m, f: c } = ue(v, d, r), i = o.find(
332
- (n) => n.row === d.row && n.col === d.col
333
+ const { g: d, h: c, f: u } = Ee(p, i, r), f = n.find(
334
+ (h) => h.row === i.row && h.col === i.col
333
335
  );
334
- if (!i || u < i.g) {
335
- const n = {
336
- row: d.row,
337
- col: d.col,
338
- g: u,
339
- h: m,
340
- f: c,
341
- parent: v
336
+ if (!f || d < f.g) {
337
+ const h = {
338
+ row: i.row,
339
+ col: i.col,
340
+ g: d,
341
+ h: c,
342
+ f: u,
343
+ parent: p
342
344
  };
343
- i ? (i.g = u, i.f = c, i.parent = v) : o.push(n);
345
+ f ? (f.g = d, f.f = u, f.parent = p) : n.push(h);
344
346
  }
345
347
  }
346
348
  }
347
- return { path: [], visitedNodes: l };
348
- }, he = (e) => ({
349
+ return { path: [], visitedNodes: o };
350
+ }, Oe = (e) => ({
349
351
  cells: Array.from(
350
352
  { length: 8 },
351
- (t, r) => Array.from({ length: 12 }, (a, o) => ({
353
+ (t, r) => Array.from({ length: 12 }, (s, n) => ({
352
354
  row: r,
353
- col: o,
354
- state: h.Empty
355
+ col: n,
356
+ state: a.Empty
355
357
  }))
356
358
  ),
357
359
  rows: 8,
@@ -363,72 +365,72 @@ const k = (e, t) => {
363
365
  visitedNodes: [],
364
366
  setNumberOfColumns: (t) => {
365
367
  e((r) => {
366
- const a = r.cells.map((o) => t > r.columns ? [
367
- ...o,
368
+ const s = r.cells.map((n) => t > r.columns ? [
369
+ ...n,
368
370
  ...Array.from(
369
371
  { length: t - r.columns },
370
- (l, p) => ({
371
- row: o[0].row,
372
- col: r.columns + p,
373
- state: h.Empty
372
+ (o, l) => ({
373
+ row: n[0].row,
374
+ col: r.columns + l,
375
+ state: a.Empty
374
376
  })
375
377
  )
376
- ] : o.slice(0, t));
378
+ ] : n.slice(0, t));
377
379
  return {
378
380
  ...r,
379
381
  columns: t,
380
- cells: a
382
+ cells: s
381
383
  };
382
384
  });
383
385
  },
384
386
  setNumberOfRows: (t) => {
385
387
  e((r) => {
386
- let a = [...r.cells];
387
- return t > r.rows ? a = [
388
- ...a,
388
+ let s = [...r.cells];
389
+ return t > r.rows ? s = [
390
+ ...s,
389
391
  ...Array.from(
390
392
  { length: t - r.rows },
391
- (o, l) => Array.from({ length: r.columns }, (p, v) => ({
392
- row: r.rows + l,
393
- col: v,
394
- state: h.Empty
393
+ (n, o) => Array.from({ length: r.columns }, (l, p) => ({
394
+ row: r.rows + o,
395
+ col: p,
396
+ state: a.Empty
395
397
  }))
396
398
  )
397
- ] : a = a.slice(0, t), {
399
+ ] : s = s.slice(0, t), {
398
400
  ...r,
399
401
  rows: t,
400
- cells: a
402
+ cells: s
401
403
  };
402
404
  });
403
405
  },
404
- setCellState: (t, r, a) => {
405
- e((o) => {
406
- const l = o.cells.map(
407
- (d) => d.map((u) => ({ ...u }))
406
+ setCellState: (t, r, s) => {
407
+ e((n) => {
408
+ const o = n.cells.map(
409
+ (i) => i.map((d) => ({ ...d }))
408
410
  );
409
- let p = o.startTile, v = o.endTile, S = [...o.obstacleTiles];
410
- switch (a === h.Start && o.startTile && (l[o.startTile.row][o.startTile.col].state = h.Empty, p = null), a === h.End && o.endTile && (l[o.endTile.row][o.endTile.col].state = h.Empty, v = null), l[t][r].state = a, a) {
411
- case h.Start:
412
- p = { row: t, col: r };
411
+ let l = n.startTile, p = n.endTile, w = [...n.obstacleTiles];
412
+ switch (s === a.Start && n.startTile && (o[n.startTile.row][n.startTile.col].state = a.Empty, l = null), s === a.End && n.endTile && (o[n.endTile.row][n.endTile.col].state = a.Empty, p = null), o[t][r].state = s, s) {
413
+ case a.Start:
414
+ l = { row: t, col: r };
413
415
  break;
414
- case h.End:
415
- v = { row: t, col: r };
416
+ case a.End:
417
+ p = { row: t, col: r };
416
418
  break;
417
- case h.Obstacle:
418
- S.some((d) => d.row === t && d.col === r) || S.push({ row: t, col: r });
419
+ case a.Obstacle:
420
+ w.some((i) => i.row === t && i.col === r) || w.push({ row: t, col: r });
419
421
  break;
420
- case h.Empty:
421
- S = S.filter(
422
- (d) => !(d.row === t && d.col === r)
422
+ case a.Empty:
423
+ w = w.filter(
424
+ (i) => !(i.row === t && i.col === r)
423
425
  );
424
426
  break;
425
427
  }
426
428
  return {
427
- ...o,
428
- cells: l,
429
- startTile: p,
430
- endTile: v,
431
- obstacleTiles: S
429
+ ...n,
430
+ cells: o,
431
+ startTile: l,
432
+ endTile: p,
433
+ obstacleTiles: w
432
434
  };
433
435
  });
434
436
  },
@@ -436,9 +438,9 @@ const k = (e, t) => {
436
438
  e((t) => ({
437
439
  ...t,
438
440
  cells: t.cells.map(
439
- (r) => r.map((a) => ({
440
- ...a,
441
- state: h.Empty
441
+ (r) => r.map((s) => ({
442
+ ...s,
443
+ state: a.Empty
442
444
  }))
443
445
  ),
444
446
  startTile: null,
@@ -450,125 +452,169 @@ const k = (e, t) => {
450
452
  },
451
453
  handleFindPath: (t) => {
452
454
  e((r) => {
453
- const a = r.cells.flat().find((l) => l.state === h.Start), o = r.cells.flat().find((l) => l.state === h.End);
454
- if (a && o) {
455
- const l = r.cells.map(
456
- (d) => d.map((u) => ({
457
- row: u.row,
458
- col: u.col,
459
- state: u.state
455
+ const s = r.cells.flat().find((o) => o.state === a.Start), n = r.cells.flat().find((o) => o.state === a.End);
456
+ if (s && n) {
457
+ const o = r.cells.map(
458
+ (i) => i.map((d) => ({
459
+ row: d.row,
460
+ col: d.col,
461
+ state: d.state
460
462
  }))
461
- ), { path: p, visitedNodes: v } = fe(l, a, o, t);
462
- return (async (d, u) => {
463
- for (let m of u)
464
- await new Promise((c) => setTimeout(c, 100)), e((c) => {
465
- const i = c.cells.map(
466
- (n) => n.map((s) => ({
467
- ...s,
468
- state: m.row === s.row && m.col === s.col && s.state === h.Empty ? h.Visited : s.state
463
+ ), { path: l, visitedNodes: p } = _e(o, s, n, t);
464
+ return (async (i, d) => {
465
+ for (let c of d)
466
+ await new Promise((u) => setTimeout(u, 100)), e((u) => {
467
+ const f = u.cells.map(
468
+ (h) => h.map((m) => ({
469
+ ...m,
470
+ state: c.row === m.row && c.col === m.col && m.state === a.Empty ? a.Visited : m.state
469
471
  }))
470
472
  );
471
473
  return {
472
- ...c,
473
- cells: i,
474
- visitedNodes: [...c.visitedNodes, m]
474
+ ...u,
475
+ cells: f,
476
+ visitedNodes: [...u.visitedNodes, c]
475
477
  };
476
478
  });
477
- for (let m of d)
478
- await new Promise((c) => setTimeout(c, 250)), e((c) => {
479
- const i = c.cells.map(
480
- (n) => n.map((s) => ({
481
- ...s,
482
- state: m.row === s.row && m.col === s.col ? h.Path : s.state
479
+ for (let c of i)
480
+ await new Promise((u) => setTimeout(u, 250)), e((u) => {
481
+ const f = u.cells.map(
482
+ (h) => h.map((m) => ({
483
+ ...m,
484
+ state: c.row === m.row && c.col === m.col ? a.Path : m.state
483
485
  }))
484
486
  );
485
487
  return {
486
- ...c,
487
- cells: i,
488
- path: [...c.path, m]
488
+ ...u,
489
+ cells: f,
490
+ path: [...u.path, c]
489
491
  };
490
492
  });
491
- })(p, v), { ...r, path: [], visitedNodes: [] };
493
+ })(l, p), { ...r, path: [], visitedNodes: [] };
492
494
  }
493
495
  return r;
494
496
  });
495
497
  },
496
498
  setPath: (t) => {
497
499
  e((r) => {
498
- const a = r.cells.map(
499
- (o) => o.map((l) => ({
500
- ...l,
501
- state: t.some((p) => p.row === l.row && p.col === l.col) ? h.Path : l.state
500
+ const s = r.cells.map(
501
+ (n) => n.map((o) => ({
502
+ ...o,
503
+ state: t.some((l) => l.row === o.row && l.col === o.col) ? a.Path : o.state
502
504
  }))
503
505
  );
504
506
  return {
505
507
  ...r,
506
- cells: a
508
+ cells: s
507
509
  };
508
510
  });
509
511
  },
510
512
  setVisitedNodes: (t) => {
511
513
  e((r) => {
512
- const a = r.cells.map(
513
- (o) => o.map((l) => ({
514
- ...l,
515
- state: t.some((p) => p.row === l.row && p.col === l.col) && l.state === h.Empty ? h.Visited : l.state
514
+ const s = r.cells.map(
515
+ (n) => n.map((o) => ({
516
+ ...o,
517
+ state: t.some((l) => l.row === o.row && l.col === o.col) && o.state === a.Empty ? a.Visited : o.state
516
518
  }))
517
519
  );
518
520
  return {
519
521
  ...r,
520
- cells: a
522
+ cells: s
521
523
  };
522
524
  });
523
525
  }
524
- }), me = (e) => ({
525
- activeButton: h.Start,
526
+ }), ye = (e) => ({
527
+ activeButton: a.Start,
526
528
  setSelectedButtonState: (t) => e({ activeButton: t }),
527
529
  canTravelDiagonally: !0,
528
530
  setCanTravelDiagonally: (t) => e({ canTravelDiagonally: t })
529
- }), U = le((e, t, r) => ({
530
- ...he(e),
531
- ...me(e)
532
- }));
533
- const pe = () => {
534
- var i;
535
- const { cells: e, activeButton: t, setCellState: r, setSelectedButtonState: a, visitedNodes: o, path: l } = U(), [p, v] = H({ width: 0, height: 0 }), S = R.useRef(null);
536
- F(() => {
537
- const n = () => {
538
- if (S.current) {
539
- const s = S.current.getBoundingClientRect();
540
- v({ width: s.width, height: s.height });
531
+ }), Ne = (e) => ({
532
+ visualTheme: A.Medieval,
533
+ showCosts: !1,
534
+ setVisualTheme: (t) => e({ visualTheme: t }),
535
+ setShowCosts: (t) => e({ showCosts: t })
536
+ }), j = we((e, t, r) => ({
537
+ ...Oe(e),
538
+ ...ye(e),
539
+ ...Ne(e)
540
+ })), Me = {
541
+ id: A.Classic,
542
+ name: "Classic",
543
+ startIcon: "●",
544
+ endIcon: "●",
545
+ terrains: {
546
+ [a.Obstacle]: { name: "Wall", icon: "■", passable: !1 }
547
+ },
548
+ presets: [
549
+ { id: "random", name: "Random", icon: "🎲" },
550
+ { id: "maze", name: "Maze", icon: "🔲" }
551
+ ]
552
+ }, Ce = {
553
+ id: A.Medieval,
554
+ name: "Medieval",
555
+ startIcon: "⚔️",
556
+ endIcon: "🏰",
557
+ terrains: {
558
+ [a.Obstacle]: { name: "Wall", icon: "🧱", passable: !1 },
559
+ [a.Water]: { name: "Water", icon: "🌊", passable: !1 },
560
+ [a.Forest]: { name: "Forest", icon: "🌲", passable: !0 },
561
+ [a.Mountain]: { name: "Mountain", icon: "⛰️", passable: !1 }
562
+ },
563
+ presets: [
564
+ { id: "river", name: "River Crossing", icon: "🌊" },
565
+ { id: "mountains", name: "Mountain Range", icon: "⛰️" },
566
+ { id: "maze", name: "Castle Maze", icon: "🏰" },
567
+ { id: "random", name: "Random Forest", icon: "🎲" }
568
+ ]
569
+ }, oe = {
570
+ [A.Classic]: Me,
571
+ [A.Medieval]: Ce
572
+ }, F = (e) => oe[e], Te = (e) => {
573
+ const t = F(e);
574
+ return Object.entries(t.terrains).map(([r, s]) => ({
575
+ state: Number(r),
576
+ config: s
577
+ }));
578
+ };
579
+ const Re = () => {
580
+ var S;
581
+ const { cells: e, activeButton: t, setCellState: r, setSelectedButtonState: s, visitedNodes: n, path: o, visualTheme: l, showCosts: p } = j(), w = F(l), [i, d] = ee({ width: 0, height: 0 }), c = z.useRef(null);
582
+ te(() => {
583
+ const E = () => {
584
+ if (c.current) {
585
+ const O = c.current.getBoundingClientRect();
586
+ d({ width: O.width, height: O.height });
541
587
  }
542
588
  };
543
- return n(), window.addEventListener("resize", n), () => window.removeEventListener("resize", n);
589
+ return E(), window.addEventListener("resize", E), () => window.removeEventListener("resize", E);
544
590
  }, []);
545
- const d = (n, s) => {
546
- switch (r(n, s, t), t) {
547
- case h.Start:
548
- a(h.End);
591
+ const u = (E, O) => {
592
+ switch (r(E, O, t), t) {
593
+ case a.Start:
594
+ s(a.End);
549
595
  break;
550
- case h.End:
551
- a(h.Obstacle);
596
+ case a.End:
597
+ s(a.Obstacle);
552
598
  break;
553
599
  }
554
- }, u = (n, s) => {
555
- const f = o.find((E) => E.row === n && E.col === s);
556
- return f ? { g: f.g, h: f.h, f: f.f } : { g: null, h: null, f: null };
557
- }, c = (() => {
558
- var b;
559
- if (!p.width || !p.height)
600
+ }, f = (E, O) => {
601
+ const b = n.find((M) => M.row === E && M.col === O);
602
+ return b ? { g: b.g, h: b.h, f: b.f } : { g: null, h: null, f: null };
603
+ }, m = (() => {
604
+ var y;
605
+ if (!i.width || !i.height)
560
606
  return 20;
561
- const n = ((b = e[0]) == null ? void 0 : b.length) || 1, s = e.length || 1, f = 20, E = n + s, O = p.width - f - E, N = p.height - f - E, T = O / n, C = N / s, g = Math.min(T, C);
607
+ const E = ((y = e[0]) == null ? void 0 : y.length) || 1, O = e.length || 1, b = 20, M = E + O, R = i.width - b - M, _ = i.height - b - M, C = R / E, L = _ / O, g = Math.min(C, L);
562
608
  return Math.max(15, Math.min(g, 60));
563
609
  })();
564
- return /* @__PURE__ */ w("div", { className: "grid-wrapper", ref: S, children: /* @__PURE__ */ w(
610
+ return /* @__PURE__ */ v("div", { className: "grid-wrapper", ref: c, children: /* @__PURE__ */ v(
565
611
  "div",
566
612
  {
567
613
  className: "grid-container",
568
614
  style: {
569
615
  display: "grid",
570
- gridTemplateColumns: `repeat(${((i = e[0]) == null ? void 0 : i.length) || 1}, ${c}px)`,
571
- gridTemplateRows: `repeat(${e.length || 1}, ${c}px)`,
616
+ gridTemplateColumns: `repeat(${((S = e[0]) == null ? void 0 : S.length) || 1}, ${m}px)`,
617
+ gridTemplateRows: `repeat(${e.length || 1}, ${m}px)`,
572
618
  gap: "1px",
573
619
  padding: "8px",
574
620
  background: "var(--bg-secondary)",
@@ -577,22 +623,23 @@ const pe = () => {
577
623
  border: "1px solid var(--border-color)"
578
624
  },
579
625
  children: e.map(
580
- (n, s) => n.map((f, E) => {
581
- const O = l.some((_) => _.row === f.row && _.col === f.col), N = o.some((_) => _.row === f.row && _.col === f.col), { g: T, h: C, f: g } = u(f.row, f.col);
582
- let b = ve(f, N);
583
- if (O) {
584
- const _ = l.findIndex((B) => B.row === f.row && B.col === f.col);
585
- _ === 0 ? b = "var(--cell-start)" : _ === l.length - 1 ? b = "var(--cell-end)" : b = "var(--cell-path)";
626
+ (E, O) => E.map((b, M) => {
627
+ var D, G, $, H;
628
+ const R = o.some((T) => T.row === b.row && T.col === b.col), _ = n.some((T) => T.row === b.row && T.col === b.col), { g: C, h: L, f: g } = f(b.row, b.col);
629
+ let y = Le(b, _);
630
+ if (R) {
631
+ const T = o.findIndex((K) => K.row === b.row && K.col === b.col);
632
+ T === 0 ? y = "var(--cell-start)" : T === o.length - 1 ? y = "var(--cell-end)" : y = "var(--cell-path)";
586
633
  }
587
- return /* @__PURE__ */ y(
634
+ return /* @__PURE__ */ N(
588
635
  "div",
589
636
  {
590
637
  className: "grid-cell",
591
- onClick: () => d(s, E),
638
+ onClick: () => u(O, M),
592
639
  style: {
593
- width: c,
594
- height: c,
595
- backgroundColor: b,
640
+ width: m,
641
+ height: m,
642
+ backgroundColor: y,
596
643
  border: "1px solid var(--cell-border)",
597
644
  cursor: "pointer",
598
645
  transition: "all 0.15s ease",
@@ -602,170 +649,345 @@ const pe = () => {
602
649
  alignItems: "center",
603
650
  borderRadius: "2px"
604
651
  },
605
- onMouseEnter: (_) => {
606
- f.state === h.Empty && (_.currentTarget.style.backgroundColor = "var(--bg-tertiary)", _.currentTarget.style.transform = "scale(1.02)");
652
+ onMouseEnter: (T) => {
653
+ b.state === a.Empty && (T.currentTarget.style.backgroundColor = "var(--bg-tertiary)", T.currentTarget.style.transform = "scale(1.02)");
607
654
  },
608
- onMouseLeave: (_) => {
609
- f.state === h.Empty && (_.currentTarget.style.backgroundColor = b, _.currentTarget.style.transform = "scale(1)");
655
+ onMouseLeave: (T) => {
656
+ b.state === a.Empty && (T.currentTarget.style.backgroundColor = y, T.currentTarget.style.transform = "scale(1)");
610
657
  },
611
658
  children: [
612
- N && /* @__PURE__ */ y("div", { className: "cell-values", children: [
613
- /* @__PURE__ */ y("div", { className: "value-h", children: [
659
+ _ && p && /* @__PURE__ */ N("div", { className: "cell-values", children: [
660
+ /* @__PURE__ */ N("div", { className: "value-h", children: [
614
661
  "h",
615
- C
662
+ L
616
663
  ] }),
617
- /* @__PURE__ */ y("div", { className: "value-f", children: [
664
+ /* @__PURE__ */ N("div", { className: "value-f", children: [
618
665
  "f",
619
666
  g
620
667
  ] }),
621
- /* @__PURE__ */ y("div", { className: "value-g", children: [
668
+ /* @__PURE__ */ N("div", { className: "value-g", children: [
622
669
  "g",
623
- T
670
+ C
624
671
  ] })
625
672
  ] }),
626
- f.state === h.Start && /* @__PURE__ */ w("div", { className: "cell-indicator start", children: "●" }),
627
- f.state === h.End && /* @__PURE__ */ w("div", { className: "cell-indicator end", children: "●" }),
628
- f.state === h.Obstacle && /* @__PURE__ */ w("div", { className: "cell-indicator obstacle", children: "■" })
673
+ b.state === a.Start && /* @__PURE__ */ v("div", { className: "cell-indicator start", children: w.startIcon }),
674
+ b.state === a.End && /* @__PURE__ */ v("div", { className: "cell-indicator end", children: w.endIcon }),
675
+ b.state === a.Obstacle && /* @__PURE__ */ v("div", { className: "cell-indicator obstacle", children: ((D = w.terrains[a.Obstacle]) == null ? void 0 : D.icon) || "■" }),
676
+ b.state === a.Water && /* @__PURE__ */ v("div", { className: "cell-indicator water", children: ((G = w.terrains[a.Water]) == null ? void 0 : G.icon) || "🌊" }),
677
+ b.state === a.Forest && /* @__PURE__ */ v("div", { className: "cell-indicator forest", children: (($ = w.terrains[a.Forest]) == null ? void 0 : $.icon) || "🌲" }),
678
+ b.state === a.Mountain && /* @__PURE__ */ v("div", { className: "cell-indicator mountain", children: ((H = w.terrains[a.Mountain]) == null ? void 0 : H.icon) || "⛰️" })
629
679
  ]
630
680
  },
631
- `${s}-${E}`
681
+ `${O}-${M}`
632
682
  );
633
683
  })
634
684
  )
635
685
  }
636
686
  ) });
637
- }, ve = (e, t) => {
687
+ }, Le = (e, t) => {
638
688
  if (t)
639
- return e.state === h.Start ? "var(--cell-start)" : e.state === h.End ? "var(--cell-end)" : "var(--cell-visited)";
689
+ return e.state === a.Start ? "var(--cell-start)" : e.state === a.End ? "var(--cell-end)" : "var(--cell-visited)";
640
690
  switch (e.state) {
641
- case h.Start:
691
+ case a.Start:
642
692
  return "var(--cell-start)";
643
- case h.End:
693
+ case a.End:
644
694
  return "var(--cell-end)";
645
- case h.Obstacle:
695
+ case a.Obstacle:
646
696
  return "var(--cell-obstacle)";
647
- case h.Empty:
697
+ case a.Water:
698
+ return "var(--cell-water)";
699
+ case a.Forest:
700
+ return "var(--cell-forest)";
701
+ case a.Mountain:
702
+ return "var(--cell-mountain)";
703
+ case a.Empty:
648
704
  return "var(--cell-empty)";
649
705
  default:
650
706
  return "var(--cell-empty)";
651
707
  }
708
+ }, Ae = (e, t) => {
709
+ const r = [], s = Math.floor(e / 2), n = Math.max(2, Math.floor(t / 6)), o = [];
710
+ for (let l = 0; l < n; l++) {
711
+ const p = Math.floor(t / (n + 1) * (l + 1));
712
+ o.push(p);
713
+ }
714
+ for (let l = 0; l < t; l++)
715
+ o.includes(l) || (r.push({ row: s, col: l, state: a.Water }), s + 1 < e && r.push({ row: s + 1, col: l, state: a.Water }));
716
+ for (let l = 0; l < t; l += 3)
717
+ s - 1 >= 0 && Math.random() > 0.5 && r.push({ row: s - 1, col: l, state: a.Forest }), s + 2 < e && Math.random() > 0.5 && r.push({ row: s + 2, col: l, state: a.Forest });
718
+ return r;
719
+ }, De = (e, t) => {
720
+ const r = [], s = Math.floor(e * 0.2), n = Math.floor(t * 0.1), o = Math.floor(e * 0.8), l = Math.floor(t * 0.9), p = Math.max(2, Math.floor(Math.min(e, t) / 5)), w = [];
721
+ for (let i = 0; i < p; i++)
722
+ w.push(Math.floor((l - n) / (p + 1) * (i + 1)) + n);
723
+ for (let i = n; i <= l; i++) {
724
+ const d = (i - n) / (l - n), c = Math.floor(s + (o - s) * d);
725
+ w.some((u) => Math.abs(i - u) <= 1) || (c >= 0 && c < e && r.push({ row: c, col: i, state: a.Mountain }), c + 1 < e && Math.random() > 0.3 && r.push({ row: c + 1, col: i, state: a.Mountain }), c - 1 >= 0 && Math.random() > 0.3 && r.push({ row: c - 1, col: i, state: a.Mountain }));
726
+ }
727
+ for (const i of [...r])
728
+ if (i.state === a.Mountain) {
729
+ const d = [
730
+ { row: i.row - 2, col: i.col },
731
+ { row: i.row + 2, col: i.col },
732
+ { row: i.row, col: i.col - 2 },
733
+ { row: i.row, col: i.col + 2 }
734
+ ];
735
+ for (const c of d)
736
+ c.row >= 0 && c.row < e && c.col >= 0 && c.col < t && Math.random() > 0.7 && (r.some((u) => u.row === c.row && u.col === c.col) || r.push({ row: c.row, col: c.col, state: a.Forest }));
737
+ }
738
+ return r;
739
+ }, ze = (e, t) => {
740
+ const r = [];
741
+ for (let n = 0; n < e; n++)
742
+ for (let o = 0; o < t; o++) {
743
+ const l = n % 3 === 1, p = o % 3 === 1;
744
+ (l || p) && Math.random() > 0.35 && r.push({ row: n, col: o, state: a.Obstacle });
745
+ }
746
+ const s = 2;
747
+ return r.filter((n) => {
748
+ const o = n.row < s && n.col < s, l = n.row >= e - s && n.col >= t - s;
749
+ return !o && !l;
750
+ });
751
+ }, Ve = (e, t, r = 0.25) => {
752
+ const s = [];
753
+ for (let n = 0; n < e; n++)
754
+ for (let o = 0; o < t; o++)
755
+ if (!(n < 2 && o < 2 || n >= e - 2 && o >= t - 2) && Math.random() < r) {
756
+ const p = Math.random();
757
+ let w;
758
+ p < 0.4 ? w = a.Forest : p < 0.6 ? w = a.Obstacle : p < 0.8 ? w = a.Water : w = a.Mountain, s.push({ row: n, col: o, state: w });
759
+ }
760
+ return s;
761
+ }, ke = (e, t, r = 0.2) => {
762
+ const s = [];
763
+ for (let n = 0; n < e; n++)
764
+ for (let o = 0; o < t; o++)
765
+ !(n < 2 && o < 2 || n >= e - 2 && o >= t - 2) && Math.random() < r && s.push({ row: n, col: o, state: a.Obstacle });
766
+ return s;
767
+ }, We = (e, t) => {
768
+ const r = [];
769
+ for (let n = 0; n < e; n++)
770
+ for (let o = 0; o < t; o++) {
771
+ const l = n % 3 === 1, p = o % 3 === 1;
772
+ (l || p) && Math.random() > 0.35 && r.push({ row: n, col: o, state: a.Obstacle });
773
+ }
774
+ const s = 2;
775
+ return r.filter((n) => {
776
+ const o = n.row < s && n.col < s, l = n.row >= e - s && n.col >= t - s;
777
+ return !o && !l;
778
+ });
652
779
  };
653
- const Ee = ({ isDarkMode: e, setIsDarkMode: t }) => {
780
+ const Pe = ({ isDarkMode: e, setIsDarkMode: t }) => {
654
781
  const {
655
782
  activeButton: r,
656
- setSelectedButtonState: a,
657
- resetCells: o,
658
- rows: l,
659
- columns: p,
660
- setNumberOfRows: v,
661
- setNumberOfColumns: S,
662
- handleFindPath: d,
663
- canTravelDiagonally: u,
664
- setCanTravelDiagonally: m
665
- } = U(), c = () => {
783
+ setSelectedButtonState: s,
784
+ resetCells: n,
785
+ rows: o,
786
+ columns: l,
787
+ setNumberOfRows: p,
788
+ setNumberOfColumns: w,
789
+ handleFindPath: i,
790
+ canTravelDiagonally: d,
791
+ setCanTravelDiagonally: c,
792
+ visualTheme: u,
793
+ setVisualTheme: f,
794
+ showCosts: h,
795
+ setShowCosts: m,
796
+ setCellState: S
797
+ } = j(), E = F(u), O = Te(u), b = () => {
666
798
  t(!e);
667
- }, i = [
668
- { label: "Start", state: h.Start },
669
- { label: "End", state: h.End },
670
- { label: "Obstacle", state: h.Obstacle },
671
- { label: "Clear", state: h.Empty },
799
+ }, M = [
800
+ { label: "Start", state: a.Start },
801
+ { label: "End", state: a.End },
802
+ { label: "Obstacle", state: a.Obstacle },
803
+ { label: "Clear", state: a.Empty },
672
804
  { label: "Reset", state: null }
673
- ], n = (E) => {
674
- E === null ? s() : a(E);
675
- }, s = () => {
676
- o(), a(h.Start);
677
- }, f = () => {
678
- d(u);
805
+ ], R = (g) => {
806
+ g === null ? _() : s(g);
807
+ }, _ = () => {
808
+ n(), s(a.Start);
809
+ }, C = () => {
810
+ i(d);
811
+ }, L = (g) => {
812
+ n();
813
+ let y;
814
+ if (u === A.Medieval)
815
+ switch (g) {
816
+ case "river":
817
+ y = Ae(o, l);
818
+ break;
819
+ case "mountains":
820
+ y = De(o, l);
821
+ break;
822
+ case "maze":
823
+ y = ze(o, l);
824
+ break;
825
+ case "random":
826
+ y = Ve(o, l);
827
+ break;
828
+ default:
829
+ return;
830
+ }
831
+ else
832
+ switch (g) {
833
+ case "random":
834
+ y = ke(o, l);
835
+ break;
836
+ case "maze":
837
+ y = We(o, l);
838
+ break;
839
+ default:
840
+ return;
841
+ }
842
+ for (const D of y)
843
+ S(D.row, D.col, D.state);
844
+ S(0, 0, a.Start), S(o - 1, l - 1, a.End), s(a.Obstacle);
679
845
  };
680
- return /* @__PURE__ */ w("div", { className: "control-panel", children: /* @__PURE__ */ y("div", { className: "control-grid", children: [
681
- /* @__PURE__ */ y("div", { className: "control-group tools", children: [
682
- /* @__PURE__ */ w("h3", { className: "group-title", children: "Tools" }),
683
- /* @__PURE__ */ w("div", { className: "button-group", children: i.map((E, O) => /* @__PURE__ */ w(
846
+ return /* @__PURE__ */ v("div", { className: "control-panel", children: /* @__PURE__ */ N("div", { className: "control-grid", children: [
847
+ /* @__PURE__ */ N("div", { className: "control-group theme-section", children: [
848
+ /* @__PURE__ */ v("h3", { className: "group-title", children: "Theme" }),
849
+ /* @__PURE__ */ N("div", { className: "button-group", children: [
850
+ /* @__PURE__ */ v(
851
+ "select",
852
+ {
853
+ className: "theme-select",
854
+ value: u,
855
+ onChange: (g) => f(g.target.value),
856
+ children: Object.values(oe).map((g) => /* @__PURE__ */ v("option", { value: g.id, children: g.name }, g.id))
857
+ }
858
+ ),
859
+ /* @__PURE__ */ v(
860
+ "button",
861
+ {
862
+ className: `control-button theme-toggle ${e ? "active" : ""}`,
863
+ onClick: b,
864
+ title: e ? "Switch to light mode" : "Switch to dark mode",
865
+ children: e ? "☀️ Light" : "🌙 Dark"
866
+ }
867
+ ),
868
+ /* @__PURE__ */ v(
869
+ "button",
870
+ {
871
+ className: `control-button show-costs ${h ? "active" : ""}`,
872
+ onClick: () => m(!h),
873
+ title: h ? "Hide costs" : "Show costs",
874
+ children: h ? "📊 Costs On" : "📊 Costs Off"
875
+ }
876
+ )
877
+ ] })
878
+ ] }),
879
+ /* @__PURE__ */ N("div", { className: "control-group tools", children: [
880
+ /* @__PURE__ */ v("h3", { className: "group-title", children: "Tools" }),
881
+ /* @__PURE__ */ v("div", { className: "button-group", children: M.map((g, y) => /* @__PURE__ */ v(
882
+ "button",
883
+ {
884
+ className: `control-button ${g.label.toLowerCase()} ${r === g.state ? "active" : ""}`,
885
+ onClick: () => R(g.state),
886
+ children: g.label
887
+ },
888
+ y
889
+ )) })
890
+ ] }),
891
+ u === A.Medieval && /* @__PURE__ */ N("div", { className: "control-group terrain", children: [
892
+ /* @__PURE__ */ v("h3", { className: "group-title", children: "Terrain" }),
893
+ /* @__PURE__ */ v("div", { className: "button-group", children: O.filter(({ state: g }) => g !== a.Obstacle).map(({ state: g, config: y }) => /* @__PURE__ */ N(
684
894
  "button",
685
895
  {
686
- className: `control-button ${E.label.toLowerCase()} ${r === E.state ? "active" : ""}`,
687
- onClick: () => n(E.state),
688
- children: E.label
896
+ className: `control-button terrain-btn ${y.name.toLowerCase()} ${r === g ? "active" : ""}`,
897
+ onClick: () => s(g),
898
+ title: y.passable ? "Passable terrain" : "Impassable terrain",
899
+ children: [
900
+ y.icon,
901
+ " ",
902
+ y.name
903
+ ]
689
904
  },
690
- O
905
+ g
691
906
  )) })
692
907
  ] }),
693
- /* @__PURE__ */ y("div", { className: "control-group actions", children: [
694
- /* @__PURE__ */ w("h3", { className: "group-title", children: "Actions" }),
695
- /* @__PURE__ */ y("div", { className: "button-group", children: [
696
- /* @__PURE__ */ w(
908
+ /* @__PURE__ */ N("div", { className: "control-group presets", children: [
909
+ /* @__PURE__ */ v("h3", { className: "group-title", children: "Generate Map" }),
910
+ /* @__PURE__ */ v("div", { className: "button-group", children: E.presets.map((g) => /* @__PURE__ */ N(
911
+ "button",
912
+ {
913
+ className: "control-button preset-btn",
914
+ onClick: () => L(g.id),
915
+ children: [
916
+ g.icon,
917
+ " ",
918
+ g.name
919
+ ]
920
+ },
921
+ g.id
922
+ )) })
923
+ ] }),
924
+ /* @__PURE__ */ N("div", { className: "control-group actions", children: [
925
+ /* @__PURE__ */ v("h3", { className: "group-title", children: "Actions" }),
926
+ /* @__PURE__ */ N("div", { className: "button-group", children: [
927
+ /* @__PURE__ */ v(
697
928
  "button",
698
929
  {
699
930
  className: "control-button find-path",
700
- onClick: f,
931
+ onClick: C,
701
932
  children: "Find Path"
702
933
  }
703
934
  ),
704
- /* @__PURE__ */ w(
705
- "button",
706
- {
707
- className: `control-button diagonal ${u ? "active" : ""}`,
708
- onClick: () => m(!u),
709
- children: u ? "Diagonal On" : "Diagonal Off"
710
- }
711
- ),
712
- /* @__PURE__ */ w(
935
+ /* @__PURE__ */ v(
713
936
  "button",
714
937
  {
715
- className: `control-button theme-toggle ${e ? "active" : ""}`,
716
- onClick: c,
717
- title: e ? "Switch to light mode" : "Switch to dark mode",
718
- children: e ? "☀️ Light" : "🌙 Dark"
938
+ className: `control-button diagonal ${d ? "active" : ""}`,
939
+ onClick: () => c(!d),
940
+ children: d ? "Diagonal On" : "Diagonal Off"
719
941
  }
720
942
  )
721
943
  ] })
722
944
  ] }),
723
- /* @__PURE__ */ y("div", { className: "control-group size", children: [
724
- /* @__PURE__ */ w("h3", { className: "group-title", children: "Grid Size" }),
725
- /* @__PURE__ */ y("div", { className: "size-controls", children: [
726
- /* @__PURE__ */ y("div", { className: "size-control", children: [
727
- /* @__PURE__ */ w("label", { className: "size-label", children: "Rows" }),
728
- /* @__PURE__ */ y("div", { className: "size-buttons", children: [
729
- /* @__PURE__ */ w(
945
+ /* @__PURE__ */ N("div", { className: "control-group size", children: [
946
+ /* @__PURE__ */ v("h3", { className: "group-title", children: "Grid Size" }),
947
+ /* @__PURE__ */ N("div", { className: "size-controls", children: [
948
+ /* @__PURE__ */ N("div", { className: "size-control", children: [
949
+ /* @__PURE__ */ v("label", { className: "size-label", children: "Rows" }),
950
+ /* @__PURE__ */ N("div", { className: "size-buttons", children: [
951
+ /* @__PURE__ */ v(
730
952
  "button",
731
953
  {
732
954
  className: "size-button",
733
- onClick: () => v(Math.max(5, l - 1)),
734
- disabled: l <= 5,
955
+ onClick: () => p(Math.max(5, o - 1)),
956
+ disabled: o <= 5,
735
957
  children: "−"
736
958
  }
737
959
  ),
738
- /* @__PURE__ */ w("span", { className: "size-value", children: l }),
739
- /* @__PURE__ */ w(
960
+ /* @__PURE__ */ v("span", { className: "size-value", children: o }),
961
+ /* @__PURE__ */ v(
740
962
  "button",
741
963
  {
742
964
  className: "size-button",
743
- onClick: () => v(Math.min(50, l + 1)),
744
- disabled: l >= 50,
965
+ onClick: () => p(Math.min(50, o + 1)),
966
+ disabled: o >= 50,
745
967
  children: "+"
746
968
  }
747
969
  )
748
970
  ] })
749
971
  ] }),
750
- /* @__PURE__ */ y("div", { className: "size-control", children: [
751
- /* @__PURE__ */ w("label", { className: "size-label", children: "Columns" }),
752
- /* @__PURE__ */ y("div", { className: "size-buttons", children: [
753
- /* @__PURE__ */ w(
972
+ /* @__PURE__ */ N("div", { className: "size-control", children: [
973
+ /* @__PURE__ */ v("label", { className: "size-label", children: "Columns" }),
974
+ /* @__PURE__ */ N("div", { className: "size-buttons", children: [
975
+ /* @__PURE__ */ v(
754
976
  "button",
755
977
  {
756
978
  className: "size-button",
757
- onClick: () => S(Math.max(5, p - 1)),
758
- disabled: p <= 5,
979
+ onClick: () => w(Math.max(5, l - 1)),
980
+ disabled: l <= 5,
759
981
  children: "−"
760
982
  }
761
983
  ),
762
- /* @__PURE__ */ w("span", { className: "size-value", children: p }),
763
- /* @__PURE__ */ w(
984
+ /* @__PURE__ */ v("span", { className: "size-value", children: l }),
985
+ /* @__PURE__ */ v(
764
986
  "button",
765
987
  {
766
988
  className: "size-button",
767
- onClick: () => S(Math.min(50, p + 1)),
768
- disabled: p >= 50,
989
+ onClick: () => w(Math.min(50, l + 1)),
990
+ disabled: l >= 50,
769
991
  children: "+"
770
992
  }
771
993
  )
@@ -774,26 +996,27 @@ const Ee = ({ isDarkMode: e, setIsDarkMode: t }) => {
774
996
  ] })
775
997
  ] })
776
998
  ] }) });
777
- }, we = ({ defaultDarkMode: e }) => {
778
- const t = q(null), [r, a] = H(() => {
999
+ }, Ie = ({ defaultDarkMode: e }) => {
1000
+ const t = ne(null), { visualTheme: r } = j(), [s, n] = ee(() => {
779
1001
  if (e !== void 0)
780
1002
  return e;
781
1003
  const o = localStorage.getItem("astar-darkMode");
782
1004
  return o ? JSON.parse(o) : !1;
783
1005
  });
784
- return F(() => {
785
- e === void 0 && localStorage.setItem("astar-darkMode", JSON.stringify(r)), t.current && t.current.setAttribute("data-theme", r ? "dark" : "light");
786
- }, [r, e]), /* @__PURE__ */ w("div", { ref: t, className: "astar-visualizer-root", "data-theme": r ? "dark" : "light", children: /* @__PURE__ */ y("div", { className: "app-container", children: [
787
- /* @__PURE__ */ w("header", { className: "app-header", children: /* @__PURE__ */ w("h1", { className: "app-title", children: "A* Pathfinding" }) }),
788
- /* @__PURE__ */ w("main", { className: "app-main", children: /* @__PURE__ */ w(pe, {}) }),
789
- /* @__PURE__ */ w("footer", { className: "app-footer", children: /* @__PURE__ */ w(Ee, { isDarkMode: r, setIsDarkMode: a }) })
1006
+ return te(() => {
1007
+ e === void 0 && localStorage.setItem("astar-darkMode", JSON.stringify(s)), t.current && (t.current.setAttribute("data-theme", s ? "dark" : "light"), t.current.setAttribute("data-visual-theme", r));
1008
+ }, [s, e, r]), /* @__PURE__ */ v("div", { ref: t, className: "astar-visualizer-root", "data-theme": s ? "dark" : "light", "data-visual-theme": r, children: /* @__PURE__ */ N("div", { className: "app-container", children: [
1009
+ /* @__PURE__ */ v("header", { className: "app-header", children: /* @__PURE__ */ v("h1", { className: "app-title", children: "A* Pathfinding" }) }),
1010
+ /* @__PURE__ */ v("main", { className: "app-main", children: /* @__PURE__ */ v(Re, {}) }),
1011
+ /* @__PURE__ */ v("footer", { className: "app-footer", children: /* @__PURE__ */ v(Pe, { isDarkMode: s, setIsDarkMode: n }) })
790
1012
  ] }) });
791
1013
  };
792
- function be({ defaultDarkMode: e }) {
793
- return /* @__PURE__ */ w(we, { defaultDarkMode: e });
1014
+ function je({ defaultDarkMode: e }) {
1015
+ return /* @__PURE__ */ v(Ie, { defaultDarkMode: e });
794
1016
  }
795
1017
  export {
796
- be as AStarVisualizer,
797
- h as CellState,
798
- we as Layout
1018
+ je as AStarVisualizer,
1019
+ a as CellState,
1020
+ Ie as Layout,
1021
+ A as VisualTheme
799
1022
  };