astar-visualizer 1.0.6 → 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 S, jsxs as y } from "react/jsx-runtime";
2
- import D, { useState as H, useEffect as F } 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(), s = (i, m) => {
6
- const c = typeof i == "function" ? i(t) : i;
7
- if (!Object.is(c, t)) {
8
- const l = t;
9
- t = m ?? (typeof c != "object" || c === null) ? c : Object.assign({}, t, c), r.forEach((n) => n(t, l));
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, w = { setState: s, getState: o, getInitialState: () => d, subscribe: (i) => (r.add(i), () => r.delete(i)), 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(s, o, w);
13
+ } }, i = t = e(s, n, w);
14
14
  return w;
15
- }, q = (e) => e ? P(e) : P;
16
- function J(e) {
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 V = { exports: {} }, L = {}, R = { exports: {} }, A = {};
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 V = { exports: {} }, L = {}, R = { exports: {} }, A = {};
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 Y() {
31
- if (I)
32
- return A;
33
- I = 1;
34
- var e = D;
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, s = e.useState, o = e.useEffect, u = e.useLayoutEffect, p = e.useDebugValue;
39
- function E(m, c) {
40
- var l = c(), n = s({ inst: { value: l, getSnapshot: c } }), a = n[0].inst, f = n[1];
41
- return u(
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
- a.value = l, a.getSnapshot = c, w(a) && f({ inst: a });
43
+ m.value = f, m.getSnapshot = u, w(m) && S({ inst: m });
44
44
  },
45
- [m, l, c]
46
- ), o(
45
+ [c, f, u]
46
+ ), n(
47
47
  function() {
48
- return w(a) && f({ inst: a }), m(function() {
49
- w(a) && f({ inst: a });
48
+ return w(m) && S({ inst: m }), c(function() {
49
+ w(m) && S({ inst: m });
50
50
  });
51
51
  },
52
- [m]
53
- ), p(l), l;
52
+ [c]
53
+ ), l(f), f;
54
54
  }
55
- function w(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 l = c();
60
- return !r(m, l);
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 i = typeof window > "u" || typeof window.document > "u" || typeof window.document.createElement > "u" ? d : E;
69
- return A.useSyncExternalStore = e.useSyncExternalStore !== void 0 ? e.useSyncExternalStore : i, A;
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 Q() {
83
- return x || (x = 1, process.env.NODE_ENV !== "production" && function() {
84
- function e(l, n) {
85
- return l === n && (l !== 0 || 1 / l === 1 / n) || l !== l && 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(l, n) {
88
- i || o.startTransition === void 0 || (i = !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 a = n();
92
- if (!m) {
93
- var f = n();
94
- u(a, 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: a, getSnapshot: n }
98
+ S = l({
99
+ inst: { value: m, getSnapshot: h }
100
100
  });
101
- var v = f[0].inst, O = f[1];
101
+ var E = S[0].inst, O = S[1];
102
102
  return w(
103
103
  function() {
104
- v.value = a, v.getSnapshot = n, r(v) && O({ inst: v });
104
+ E.value = m, E.getSnapshot = h, r(E) && O({ inst: E });
105
105
  },
106
- [l, a, n]
107
- ), E(
106
+ [f, m, h]
107
+ ), p(
108
108
  function() {
109
- return r(v) && O({ inst: v }), l(function() {
110
- r(v) && O({ inst: v });
109
+ return r(E) && O({ inst: E }), f(function() {
110
+ r(E) && O({ inst: E });
111
111
  });
112
112
  },
113
- [l]
114
- ), d(a), a;
113
+ [f]
114
+ ), i(m), m;
115
115
  }
116
- function r(l) {
117
- var n = l.getSnapshot;
118
- l = l.value;
116
+ function r(f) {
117
+ var h = f.getSnapshot;
118
+ f = f.value;
119
119
  try {
120
- var a = n();
121
- return !u(l, a);
120
+ var m = h();
121
+ return !o(f, m);
122
122
  } catch {
123
123
  return !0;
124
124
  }
125
125
  }
126
- function s(l, 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 = D, u = typeof Object.is == "function" ? Object.is : e, p = o.useState, E = o.useEffect, w = o.useLayoutEffect, d = o.useDebugValue, i = !1, m = !1, c = typeof window > "u" || typeof window.document > "u" || typeof window.document.createElement > "u" ? s : 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" ? R.exports = Y() : R.exports = Q()), R.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 X() {
149
- if (G)
150
- return L;
151
- G = 1;
152
- var e = D, t = K();
153
- function r(d, i) {
154
- return d === i && (d !== 0 || 1 / d === 1 / i) || d !== d && i !== i;
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 s = typeof Object.is == "function" ? Object.is : r, o = t.useSyncExternalStore, u = e.useRef, p = e.useEffect, E = e.useMemo, w = e.useDebugValue;
157
- return L.useSyncExternalStoreWithSelector = function(d, i, m, c, l) {
158
- var n = u(null);
159
- if (n.current === null) {
160
- var a = { hasValue: !1, value: null };
161
- n.current = a;
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
- a = n.current;
164
- n = E(
163
+ m = h.current;
164
+ h = p(
165
165
  function() {
166
- function v(g) {
166
+ function E(_) {
167
167
  if (!O) {
168
- if (O = !0, N = g, g = c(g), l !== void 0 && a.hasValue) {
169
- var b = a.value;
170
- if (l(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, s(N, g))
176
- return b;
177
- var _ = c(g);
178
- return l !== void 0 && l(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 v(i());
183
+ return E(d());
184
184
  },
185
- C === null ? void 0 : function() {
186
- return v(C());
185
+ R === null ? void 0 : function() {
186
+ return E(R());
187
187
  }
188
188
  ];
189
189
  },
190
- [i, m, c, l]
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
- a.hasValue = !0, a.value = f;
195
+ m.hasValue = !0, m.value = S;
196
196
  },
197
- [f]
198
- ), w(f), f;
199
- }, L;
197
+ [S]
198
+ ), w(S), S;
199
+ }, k;
200
200
  }
201
- var M = {};
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 M = {};
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 Z() {
213
- return W || (W = 1, process.env.NODE_ENV !== "production" && function() {
214
- function e(d, i) {
215
- return d === i && (d !== 0 || 1 / d === 1 / i) || d !== d && i !== i;
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 = D, r = K(), s = typeof Object.is == "function" ? Object.is : e, o = r.useSyncExternalStore, u = t.useRef, p = t.useEffect, E = t.useMemo, w = t.useDebugValue;
219
- M.useSyncExternalStoreWithSelector = function(d, i, m, c, l) {
220
- var n = u(null);
221
- if (n.current === null) {
222
- var a = { hasValue: !1, value: null };
223
- n.current = a;
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
- a = n.current;
226
- n = E(
225
+ m = h.current;
226
+ h = p(
227
227
  function() {
228
- function v(g) {
228
+ function E(_) {
229
229
  if (!O) {
230
- if (O = !0, N = g, g = c(g), l !== void 0 && a.hasValue) {
231
- var b = a.value;
232
- if (l(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, s(N, g))
238
- return b;
239
- var _ = c(g);
240
- return l !== void 0 && l(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 v(i());
245
+ return E(d());
246
246
  },
247
- C === null ? void 0 : function() {
248
- return v(C());
247
+ R === null ? void 0 : function() {
248
+ return E(R());
249
249
  }
250
250
  ];
251
251
  },
252
- [i, m, c, l]
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
- a.hasValue = !0, a.value = f;
257
+ m.hasValue = !0, m.value = S;
258
258
  },
259
- [f]
260
- ), w(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
- }()), M;
262
+ }()), I;
263
263
  }
264
- process.env.NODE_ENV === "production" ? V.exports = X() : V.exports = Z();
265
- var ee = V.exports;
266
- const te = /* @__PURE__ */ J(ee), { useDebugValue: re } = D, { useSyncExternalStoreWithSelector: oe } = te;
267
- const ne = (e) => e;
268
- function se(e, t = ne, r) {
269
- const s = oe(
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 re(s), s;
276
+ return he(s), s;
277
277
  }
278
- const $ = (e) => {
279
- const t = typeof e == "function" ? q(e) : e, r = (s, o) => se(t, s, 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
- }, ae = (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) => {
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
284
  const r = Math.abs(e.row - t.row), s = Math.abs(e.col - t.col);
285
285
  return Math.floor(10 * Math.sqrt(r * r + s * s));
286
- }, le = (e, t) => ({
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
- }), ie = (e, t, r) => {
293
+ }), ge = (e, t, r) => {
294
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 && s.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
- ), s.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
- }, ce = (e, t, r) => {
311
- const s = Math.abs(e.row - t.row), o = Math.abs(e.col - t.col), u = e.g + (s === 0 || o === 0 ? 10 : 14), p = k(t, r), E = u + p;
312
- return { g: u, h: p, f: E };
313
- }, ue = (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
- }, de = (e, t, r, s) => {
320
- const o = [], u = [], p = le(t, r);
321
- for (o.push(p); o.length > 0; ) {
322
- o.sort((d, i) => d.f - i.f);
323
- const E = o.shift();
324
- if (E.row === r.row && E.col === r.col)
325
- return u.push(E), { path: ue(E), visitedNodes: u };
326
- u.push(E);
327
- const w = ie(E, e, s);
328
- for (const d of w) {
329
- if (u.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: i, h: m, f: c } = ce(E, d, r), l = 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 (!l || i < l.g) {
335
- const n = {
336
- row: d.row,
337
- col: d.col,
338
- g: i,
339
- h: m,
340
- f: c,
341
- parent: E
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
- l ? (l.g = i, l.f = c, l.parent = E) : 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: u };
348
- }, fe = (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 }, (s, 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,17 +365,17 @@ const k = (e, t) => {
363
365
  visitedNodes: [],
364
366
  setNumberOfColumns: (t) => {
365
367
  e((r) => {
366
- const s = 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
- (u, 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,
@@ -388,10 +390,10 @@ const k = (e, t) => {
388
390
  ...s,
389
391
  ...Array.from(
390
392
  { length: t - r.rows },
391
- (o, u) => Array.from({ length: r.columns }, (p, E) => ({
392
- row: r.rows + u,
393
- col: E,
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
399
  ] : s = s.slice(0, t), {
@@ -402,32 +404,32 @@ const k = (e, t) => {
402
404
  });
403
405
  },
404
406
  setCellState: (t, r, s) => {
405
- e((o) => {
406
- const u = o.cells.map(
407
- (d) => d.map((i) => ({ ...i }))
407
+ e((n) => {
408
+ const o = n.cells.map(
409
+ (i) => i.map((d) => ({ ...d }))
408
410
  );
409
- let p = o.startTile, E = o.endTile, w = [...o.obstacleTiles];
410
- switch (s === h.Start && o.startTile && (u[o.startTile.row][o.startTile.col].state = h.Empty, p = null), s === h.End && o.endTile && (u[o.endTile.row][o.endTile.col].state = h.Empty, E = null), u[t][r].state = s, s) {
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
- E = { row: t, col: r };
416
+ case a.End:
417
+ p = { row: t, col: r };
416
418
  break;
417
- case h.Obstacle:
418
- w.some((d) => d.row === t && d.col === r) || w.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:
422
+ case a.Empty:
421
423
  w = w.filter(
422
- (d) => !(d.row === t && d.col === r)
424
+ (i) => !(i.row === t && i.col === r)
423
425
  );
424
426
  break;
425
427
  }
426
428
  return {
427
- ...o,
428
- cells: u,
429
- startTile: p,
430
- endTile: E,
429
+ ...n,
430
+ cells: o,
431
+ startTile: l,
432
+ endTile: p,
431
433
  obstacleTiles: w
432
434
  };
433
435
  });
@@ -438,7 +440,7 @@ const k = (e, t) => {
438
440
  cells: t.cells.map(
439
441
  (r) => r.map((s) => ({
440
442
  ...s,
441
- state: h.Empty
443
+ state: a.Empty
442
444
  }))
443
445
  ),
444
446
  startTile: null,
@@ -450,45 +452,45 @@ const k = (e, t) => {
450
452
  },
451
453
  handleFindPath: (t) => {
452
454
  e((r) => {
453
- const s = r.cells.flat().find((u) => u.state === h.Start), o = r.cells.flat().find((u) => u.state === h.End);
454
- if (s && o) {
455
- const u = r.cells.map(
456
- (d) => d.map((i) => ({
457
- row: i.row,
458
- col: i.col,
459
- state: i.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: E } = de(u, s, o, t);
462
- return (async (d, i) => {
463
- for (let m of i)
464
- await new Promise((c) => setTimeout(c, 100)), e((c) => {
465
- const l = c.cells.map(
466
- (n) => n.map((a) => ({
467
- ...a,
468
- state: m.row === a.row && m.col === a.col && a.state === h.Empty ? h.Visited : a.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: l,
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 l = c.cells.map(
480
- (n) => n.map((a) => ({
481
- ...a,
482
- state: m.row === a.row && m.col === a.col ? h.Path : a.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: l,
488
- path: [...c.path, m]
488
+ ...u,
489
+ cells: f,
490
+ path: [...u.path, c]
489
491
  };
490
492
  });
491
- })(p, E), { ...r, path: [], visitedNodes: [] };
493
+ })(l, p), { ...r, path: [], visitedNodes: [] };
492
494
  }
493
495
  return r;
494
496
  });
@@ -496,9 +498,9 @@ const k = (e, t) => {
496
498
  setPath: (t) => {
497
499
  e((r) => {
498
500
  const s = r.cells.map(
499
- (o) => o.map((u) => ({
500
- ...u,
501
- state: t.some((p) => p.row === u.row && p.col === u.col) ? h.Path : u.state
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 {
@@ -510,9 +512,9 @@ const k = (e, t) => {
510
512
  setVisitedNodes: (t) => {
511
513
  e((r) => {
512
514
  const s = r.cells.map(
513
- (o) => o.map((u) => ({
514
- ...u,
515
- state: t.some((p) => p.row === u.row && p.col === u.col) && u.state === h.Empty ? h.Visited : u.state
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 {
@@ -521,54 +523,98 @@ const k = (e, t) => {
521
523
  };
522
524
  });
523
525
  }
524
- }), he = (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 = ae((e, t, r) => ({
530
- ...fe(e),
531
- ...he(e)
532
- }));
533
- const me = () => {
534
- var l;
535
- const { cells: e, activeButton: t, setCellState: r, setSelectedButtonState: s, visitedNodes: o, path: u } = U(), [p, E] = H({ width: 0, height: 0 }), w = D.useRef(null);
536
- F(() => {
537
- const n = () => {
538
- if (w.current) {
539
- const a = w.current.getBoundingClientRect();
540
- E({ width: a.width, height: a.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, a) => {
546
- switch (r(n, a, t), t) {
547
- case h.Start:
548
- s(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
- s(h.Obstacle);
596
+ case a.End:
597
+ s(a.Obstacle);
552
598
  break;
553
599
  }
554
- }, i = (n, a) => {
555
- const f = o.find((v) => v.row === n && v.col === a);
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, a = e.length || 1, f = 20, v = n + a, O = p.width - f - v, N = p.height - f - v, T = O / n, C = N / a, 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__ */ S("div", { className: "grid-wrapper", ref: w, children: /* @__PURE__ */ S(
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(${((l = e[0]) == null ? void 0 : l.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 me = () => {
577
623
  border: "1px solid var(--border-color)"
578
624
  },
579
625
  children: e.map(
580
- (n, a) => n.map((f, v) => {
581
- const O = u.some((_) => _.row === f.row && _.col === f.col), N = o.some((_) => _.row === f.row && _.col === f.col), { g: T, h: C, f: g } = i(f.row, f.col);
582
- let b = pe(f, N);
583
- if (O) {
584
- const _ = u.findIndex((B) => B.row === f.row && B.col === f.col);
585
- _ === 0 ? b = "var(--cell-start)" : _ === u.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(a, v),
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,177 +649,345 @@ const me = () => {
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__ */ S("div", { className: "cell-indicator start", children: "●" }),
627
- f.state === h.End && /* @__PURE__ */ S("div", { className: "cell-indicator end", children: "●" }),
628
- f.state === h.Obstacle && /* @__PURE__ */ S("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
- `${a}-${v}`
681
+ `${O}-${M}`
632
682
  );
633
683
  })
634
684
  )
635
685
  }
636
686
  ) });
637
- }, pe = (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 ve = () => {
780
+ const Pe = ({ isDarkMode: e, setIsDarkMode: t }) => {
654
781
  const {
655
- activeButton: e,
656
- setSelectedButtonState: t,
657
- resetCells: r,
658
- rows: s,
659
- columns: o,
660
- setNumberOfRows: u,
661
- setNumberOfColumns: p,
662
- handleFindPath: E,
663
- canTravelDiagonally: w,
664
- setCanTravelDiagonally: d
665
- } = U(), [i, m] = H(() => {
666
- const v = localStorage.getItem("darkMode");
667
- return v ? JSON.parse(v) : !1;
668
- });
669
- F(() => {
670
- localStorage.setItem("darkMode", JSON.stringify(i)), document.documentElement.setAttribute("data-theme", i ? "dark" : "light");
671
- }, [i]);
672
- const c = () => {
673
- m(!i);
674
- }, l = [
675
- { label: "Start", state: h.Start },
676
- { label: "End", state: h.End },
677
- { label: "Obstacle", state: h.Obstacle },
678
- { label: "Clear", state: h.Empty },
782
+ activeButton: r,
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 = () => {
798
+ t(!e);
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 },
679
804
  { label: "Reset", state: null }
680
- ], n = (v) => {
681
- v === null ? a() : t(v);
682
- }, a = () => {
683
- r(), t(h.Start);
684
- }, f = () => {
685
- E(w);
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);
686
845
  };
687
- return /* @__PURE__ */ S("div", { className: "control-panel", children: /* @__PURE__ */ y("div", { className: "control-grid", children: [
688
- /* @__PURE__ */ y("div", { className: "control-group tools", children: [
689
- /* @__PURE__ */ S("h3", { className: "group-title", children: "Tools" }),
690
- /* @__PURE__ */ S("div", { className: "button-group", children: l.map((v, O) => /* @__PURE__ */ S(
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(
691
882
  "button",
692
883
  {
693
- className: `control-button ${v.label.toLowerCase()} ${e === v.state ? "active" : ""}`,
694
- onClick: () => n(v.state),
695
- children: v.label
884
+ className: `control-button ${g.label.toLowerCase()} ${r === g.state ? "active" : ""}`,
885
+ onClick: () => R(g.state),
886
+ children: g.label
696
887
  },
697
- O
888
+ y
698
889
  )) })
699
890
  ] }),
700
- /* @__PURE__ */ y("div", { className: "control-group actions", children: [
701
- /* @__PURE__ */ S("h3", { className: "group-title", children: "Actions" }),
702
- /* @__PURE__ */ y("div", { className: "button-group", children: [
703
- /* @__PURE__ */ S(
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(
894
+ "button",
895
+ {
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
+ ]
904
+ },
905
+ g
906
+ )) })
907
+ ] }),
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(
704
928
  "button",
705
929
  {
706
930
  className: "control-button find-path",
707
- onClick: f,
931
+ onClick: C,
708
932
  children: "Find Path"
709
933
  }
710
934
  ),
711
- /* @__PURE__ */ S(
712
- "button",
713
- {
714
- className: `control-button diagonal ${w ? "active" : ""}`,
715
- onClick: () => d(!w),
716
- children: w ? "Diagonal On" : "Diagonal Off"
717
- }
718
- ),
719
- /* @__PURE__ */ S(
935
+ /* @__PURE__ */ v(
720
936
  "button",
721
937
  {
722
- className: `control-button theme-toggle ${i ? "active" : ""}`,
723
- onClick: c,
724
- title: i ? "Switch to light mode" : "Switch to dark mode",
725
- children: i ? "☀️ Light" : "🌙 Dark"
938
+ className: `control-button diagonal ${d ? "active" : ""}`,
939
+ onClick: () => c(!d),
940
+ children: d ? "Diagonal On" : "Diagonal Off"
726
941
  }
727
942
  )
728
943
  ] })
729
944
  ] }),
730
- /* @__PURE__ */ y("div", { className: "control-group size", children: [
731
- /* @__PURE__ */ S("h3", { className: "group-title", children: "Grid Size" }),
732
- /* @__PURE__ */ y("div", { className: "size-controls", children: [
733
- /* @__PURE__ */ y("div", { className: "size-control", children: [
734
- /* @__PURE__ */ S("label", { className: "size-label", children: "Rows" }),
735
- /* @__PURE__ */ y("div", { className: "size-buttons", children: [
736
- /* @__PURE__ */ S(
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(
737
952
  "button",
738
953
  {
739
954
  className: "size-button",
740
- onClick: () => u(Math.max(5, s - 1)),
741
- disabled: s <= 5,
955
+ onClick: () => p(Math.max(5, o - 1)),
956
+ disabled: o <= 5,
742
957
  children: "−"
743
958
  }
744
959
  ),
745
- /* @__PURE__ */ S("span", { className: "size-value", children: s }),
746
- /* @__PURE__ */ S(
960
+ /* @__PURE__ */ v("span", { className: "size-value", children: o }),
961
+ /* @__PURE__ */ v(
747
962
  "button",
748
963
  {
749
964
  className: "size-button",
750
- onClick: () => u(Math.min(50, s + 1)),
751
- disabled: s >= 50,
965
+ onClick: () => p(Math.min(50, o + 1)),
966
+ disabled: o >= 50,
752
967
  children: "+"
753
968
  }
754
969
  )
755
970
  ] })
756
971
  ] }),
757
- /* @__PURE__ */ y("div", { className: "size-control", children: [
758
- /* @__PURE__ */ S("label", { className: "size-label", children: "Columns" }),
759
- /* @__PURE__ */ y("div", { className: "size-buttons", children: [
760
- /* @__PURE__ */ S(
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(
761
976
  "button",
762
977
  {
763
978
  className: "size-button",
764
- onClick: () => p(Math.max(5, o - 1)),
765
- disabled: o <= 5,
979
+ onClick: () => w(Math.max(5, l - 1)),
980
+ disabled: l <= 5,
766
981
  children: "−"
767
982
  }
768
983
  ),
769
- /* @__PURE__ */ S("span", { className: "size-value", children: o }),
770
- /* @__PURE__ */ S(
984
+ /* @__PURE__ */ v("span", { className: "size-value", children: l }),
985
+ /* @__PURE__ */ v(
771
986
  "button",
772
987
  {
773
988
  className: "size-button",
774
- onClick: () => p(Math.min(50, o + 1)),
775
- disabled: o >= 50,
989
+ onClick: () => w(Math.min(50, l + 1)),
990
+ disabled: l >= 50,
776
991
  children: "+"
777
992
  }
778
993
  )
@@ -781,16 +996,27 @@ const ve = () => {
781
996
  ] })
782
997
  ] })
783
998
  ] }) });
784
- }, Ee = () => /* @__PURE__ */ S("div", { className: "astar-visualizer-root", children: /* @__PURE__ */ y("div", { className: "app-container", children: [
785
- /* @__PURE__ */ S("header", { className: "app-header", children: /* @__PURE__ */ S("h1", { className: "app-title", children: "A* Pathfinding" }) }),
786
- /* @__PURE__ */ S("main", { className: "app-main", children: /* @__PURE__ */ S(me, {}) }),
787
- /* @__PURE__ */ S("footer", { className: "app-footer", children: /* @__PURE__ */ S(ve, {}) })
788
- ] }) });
789
- function ge() {
790
- return /* @__PURE__ */ S(Ee, {});
999
+ }, Ie = ({ defaultDarkMode: e }) => {
1000
+ const t = ne(null), { visualTheme: r } = j(), [s, n] = ee(() => {
1001
+ if (e !== void 0)
1002
+ return e;
1003
+ const o = localStorage.getItem("astar-darkMode");
1004
+ return o ? JSON.parse(o) : !1;
1005
+ });
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 }) })
1012
+ ] }) });
1013
+ };
1014
+ function je({ defaultDarkMode: e }) {
1015
+ return /* @__PURE__ */ v(Ie, { defaultDarkMode: e });
791
1016
  }
792
1017
  export {
793
- ge as AStarVisualizer,
794
- h as CellState,
795
- Ee as Layout
1018
+ je as AStarVisualizer,
1019
+ a as CellState,
1020
+ Ie as Layout,
1021
+ A as VisualTheme
796
1022
  };