astar-visualizer 1.0.8 → 1.0.9

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,14 +1,14 @@
1
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";
2
+ import D, { useState as ee, useEffect as te, useRef as ne } from "react";
3
3
  const U = (e) => {
4
4
  let t;
5
- const r = /* @__PURE__ */ new Set(), s = (d, c) => {
6
- const u = typeof d == "function" ? d(t) : d;
5
+ const r = /* @__PURE__ */ new Set(), s = (f, c) => {
6
+ const u = typeof f == "function" ? f(t) : f;
7
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));
8
+ const h = t;
9
+ t = c ?? (typeof u != "object" || u === null) ? u : Object.assign({}, t, u), r.forEach((m) => m(t, h));
10
10
  }
11
- }, n = () => t, w = { setState: s, getState: n, getInitialState: () => i, subscribe: (d) => (r.add(d), () => r.delete(d)), destroy: () => {
11
+ }, n = () => t, w = { setState: s, getState: n, getInitialState: () => i, subscribe: (f) => (r.add(f), () => r.delete(f)), destroy: () => {
12
12
  r.clear();
13
13
  } }, i = t = e(s, n, w);
14
14
  return w;
@@ -31,33 +31,33 @@ function le() {
31
31
  if (q)
32
32
  return W;
33
33
  q = 1;
34
- var e = z;
34
+ var e = D;
35
35
  function t(c, u) {
36
36
  return c === u && (c !== 0 || 1 / c === 1 / u) || c !== c && u !== u;
37
37
  }
38
38
  var r = typeof Object.is == "function" ? Object.is : t, s = e.useState, n = e.useEffect, o = e.useLayoutEffect, l = e.useDebugValue;
39
39
  function p(c, u) {
40
- var f = u(), h = s({ inst: { value: f, getSnapshot: u } }), m = h[0].inst, S = h[1];
40
+ var h = u(), m = s({ inst: { value: h, getSnapshot: u } }), d = m[0].inst, S = m[1];
41
41
  return o(
42
42
  function() {
43
- m.value = f, m.getSnapshot = u, w(m) && S({ inst: m });
43
+ d.value = h, d.getSnapshot = u, w(d) && S({ inst: d });
44
44
  },
45
- [c, f, u]
45
+ [c, h, u]
46
46
  ), n(
47
47
  function() {
48
- return w(m) && S({ inst: m }), c(function() {
49
- w(m) && S({ inst: m });
48
+ return w(d) && S({ inst: d }), c(function() {
49
+ w(d) && S({ inst: d });
50
50
  });
51
51
  },
52
52
  [c]
53
- ), l(f), f;
53
+ ), l(h), h;
54
54
  }
55
55
  function w(c) {
56
56
  var u = c.getSnapshot;
57
57
  c = c.value;
58
58
  try {
59
- var f = u();
60
- return !r(c, f);
59
+ var h = u();
60
+ return !r(c, h);
61
61
  } catch {
62
62
  return !0;
63
63
  }
@@ -65,8 +65,8 @@ function le() {
65
65
  function i(c, u) {
66
66
  return u();
67
67
  }
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;
68
+ var f = typeof window > "u" || typeof window.document > "u" || typeof window.document.createElement > "u" ? i : p;
69
+ return W.useSyncExternalStore = e.useSyncExternalStore !== void 0 ? e.useSyncExternalStore : f, W;
70
70
  }
71
71
  var P = {};
72
72
  /**
@@ -81,53 +81,53 @@ var P = {};
81
81
  var J;
82
82
  function ie() {
83
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;
84
+ function e(h, m) {
85
+ return h === m && (h !== 0 || 1 / h === 1 / m) || h !== h && m !== m;
86
86
  }
87
- function t(f, h) {
88
- d || n.startTransition === void 0 || (d = !0, console.error(
87
+ function t(h, m) {
88
+ f || n.startTransition === void 0 || (f = !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 m = h();
91
+ var d = m();
92
92
  if (!c) {
93
- var S = h();
94
- o(m, S) || (console.error(
93
+ var S = m();
94
+ o(d, S) || (console.error(
95
95
  "The result of getSnapshot should be cached to avoid an infinite loop"
96
96
  ), c = !0);
97
97
  }
98
98
  S = l({
99
- inst: { value: m, getSnapshot: h }
99
+ inst: { value: d, getSnapshot: m }
100
100
  });
101
- var E = S[0].inst, O = S[1];
101
+ var E = S[0].inst, y = S[1];
102
102
  return w(
103
103
  function() {
104
- E.value = m, E.getSnapshot = h, r(E) && O({ inst: E });
104
+ E.value = d, E.getSnapshot = m, r(E) && y({ inst: E });
105
105
  },
106
- [f, m, h]
106
+ [h, d, m]
107
107
  ), p(
108
108
  function() {
109
- return r(E) && O({ inst: E }), f(function() {
110
- r(E) && O({ inst: E });
109
+ return r(E) && y({ inst: E }), h(function() {
110
+ r(E) && y({ inst: E });
111
111
  });
112
112
  },
113
- [f]
114
- ), i(m), m;
113
+ [h]
114
+ ), i(d), d;
115
115
  }
116
- function r(f) {
117
- var h = f.getSnapshot;
118
- f = f.value;
116
+ function r(h) {
117
+ var m = h.getSnapshot;
118
+ h = h.value;
119
119
  try {
120
- var m = h();
121
- return !o(f, m);
120
+ var d = m();
121
+ return !o(h, d);
122
122
  } catch {
123
123
  return !0;
124
124
  }
125
125
  }
126
- function s(f, h) {
127
- return h();
126
+ function s(h, m) {
127
+ return m();
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 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;
130
+ var n = D, o = typeof Object.is == "function" ? Object.is : e, l = n.useState, p = n.useEffect, w = n.useLayoutEffect, i = n.useDebugValue, f = !1, c = !1, u = typeof window > "u" || typeof window.document > "u" || typeof window.document.createElement > "u" ? s : t;
131
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
132
  }()), P;
133
133
  }
@@ -149,25 +149,25 @@ function ce() {
149
149
  if (Q)
150
150
  return k;
151
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;
152
+ var e = D, t = re();
153
+ function r(i, f) {
154
+ return i === f && (i !== 0 || 1 / i === 1 / f) || i !== i && f !== f;
155
155
  }
156
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;
157
+ return k.useSyncExternalStoreWithSelector = function(i, f, c, u, h) {
158
+ var m = o(null);
159
+ if (m.current === null) {
160
+ var d = { hasValue: !1, value: null };
161
+ m.current = d;
162
162
  } else
163
- m = h.current;
164
- h = p(
163
+ d = m.current;
164
+ m = p(
165
165
  function() {
166
166
  function E(_) {
167
- if (!O) {
168
- if (O = !0, b = _, _ = u(_), f !== void 0 && m.hasValue) {
169
- var C = m.value;
170
- if (f(C, _))
167
+ if (!y) {
168
+ if (y = !0, b = _, _ = u(_), h !== void 0 && d.hasValue) {
169
+ var C = d.value;
170
+ if (h(C, _))
171
171
  return M = C;
172
172
  }
173
173
  return M = _;
@@ -175,24 +175,24 @@ function ce() {
175
175
  if (C = M, s(b, _))
176
176
  return C;
177
177
  var L = u(_);
178
- return f !== void 0 && f(C, L) ? (b = _, C) : (b = _, M = L);
178
+ return h !== void 0 && h(C, L) ? (b = _, C) : (b = _, M = L);
179
179
  }
180
- var O = !1, b, M, R = c === void 0 ? null : c;
180
+ var y = !1, b, M, R = c === void 0 ? null : c;
181
181
  return [
182
182
  function() {
183
- return E(d());
183
+ return E(f());
184
184
  },
185
185
  R === null ? void 0 : function() {
186
186
  return E(R());
187
187
  }
188
188
  ];
189
189
  },
190
- [d, c, u, f]
190
+ [f, c, u, h]
191
191
  );
192
- var S = n(i, h[0], h[1]);
192
+ var S = n(i, m[0], m[1]);
193
193
  return l(
194
194
  function() {
195
- m.hasValue = !0, m.value = S;
195
+ d.hasValue = !0, d.value = S;
196
196
  },
197
197
  [S]
198
198
  ), w(S), S;
@@ -211,25 +211,25 @@ var I = {};
211
211
  var X;
212
212
  function ue() {
213
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;
214
+ function e(i, f) {
215
+ return i === f && (i !== 0 || 1 / i === 1 / f) || i !== i && f !== f;
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 = 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;
218
+ var t = D, 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, f, c, u, h) {
220
+ var m = o(null);
221
+ if (m.current === null) {
222
+ var d = { hasValue: !1, value: null };
223
+ m.current = d;
224
224
  } else
225
- m = h.current;
226
- h = p(
225
+ d = m.current;
226
+ m = p(
227
227
  function() {
228
228
  function E(_) {
229
- if (!O) {
230
- if (O = !0, b = _, _ = u(_), f !== void 0 && m.hasValue) {
231
- var C = m.value;
232
- if (f(C, _))
229
+ if (!y) {
230
+ if (y = !0, b = _, _ = u(_), h !== void 0 && d.hasValue) {
231
+ var C = d.value;
232
+ if (h(C, _))
233
233
  return M = C;
234
234
  }
235
235
  return M = _;
@@ -237,24 +237,24 @@ function ue() {
237
237
  if (C = M, s(b, _))
238
238
  return C;
239
239
  var L = u(_);
240
- return f !== void 0 && f(C, L) ? (b = _, C) : (b = _, M = L);
240
+ return h !== void 0 && h(C, L) ? (b = _, C) : (b = _, M = L);
241
241
  }
242
- var O = !1, b, M, R = c === void 0 ? null : c;
242
+ var y = !1, b, M, R = c === void 0 ? null : c;
243
243
  return [
244
244
  function() {
245
- return E(d());
245
+ return E(f());
246
246
  },
247
247
  R === null ? void 0 : function() {
248
248
  return E(R());
249
249
  }
250
250
  ];
251
251
  },
252
- [d, c, u, f]
252
+ [f, c, u, h]
253
253
  );
254
- var S = n(i, h[0], h[1]);
254
+ var S = n(i, m[0], m[1]);
255
255
  return l(
256
256
  function() {
257
- m.hasValue = !0, m.value = S;
257
+ d.hasValue = !0, d.value = S;
258
258
  },
259
259
  [S]
260
260
  ), w(S), S;
@@ -263,7 +263,7 @@ function ue() {
263
263
  }
264
264
  process.env.NODE_ENV === "production" ? B.exports = ce() : B.exports = ue();
265
265
  var de = B.exports;
266
- const fe = /* @__PURE__ */ ae(de), { useDebugValue: he } = z, { useSyncExternalStoreWithSelector: me } = fe;
266
+ const fe = /* @__PURE__ */ ae(de), { useDebugValue: he } = D, { useSyncExternalStoreWithSelector: me } = fe;
267
267
  const pe = (e) => e;
268
268
  function ve(e, t = pe, r) {
269
269
  const s = me(
@@ -279,7 +279,7 @@ const Z = (e) => {
279
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
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 || {});
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 || {}), z = /* @__PURE__ */ ((e) => (e.Classic = "classic", e.Medieval = "medieval", e))(z || {});
283
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));
@@ -321,33 +321,33 @@ const x = (e, t) => {
321
321
  }, _e = (e, t, r, s) => {
322
322
  const n = [], o = [], l = be(t, r);
323
323
  for (n.push(l); n.length > 0; ) {
324
- n.sort((i, d) => i.f - d.f);
324
+ n.sort((i, f) => i.f - f.f);
325
325
  const p = n.shift();
326
326
  if (p.row === r.row && p.col === r.col)
327
327
  return o.push(p), { path: Se(p), visitedNodes: o };
328
328
  o.push(p);
329
329
  const w = ge(p, e, s);
330
330
  for (const i of w) {
331
- if (o.some((h) => h.row === i.row && h.col === i.col))
331
+ if (o.some((m) => m.row === i.row && m.col === i.col))
332
332
  continue;
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
+ const { g: f, h: c, f: u } = Ee(p, i, r), h = n.find(
334
+ (m) => m.row === i.row && m.col === i.col
335
335
  );
336
- if (!f || d < f.g) {
337
- const h = {
336
+ if (!h || f < h.g) {
337
+ const m = {
338
338
  row: i.row,
339
339
  col: i.col,
340
- g: d,
340
+ g: f,
341
341
  h: c,
342
342
  f: u,
343
343
  parent: p
344
344
  };
345
- f ? (f.g = d, f.f = u, f.parent = p) : n.push(h);
345
+ h ? (h.g = f, h.f = u, h.parent = p) : n.push(m);
346
346
  }
347
347
  }
348
348
  }
349
349
  return { path: [], visitedNodes: o };
350
- }, Oe = (e) => ({
350
+ }, ye = (e) => ({
351
351
  cells: Array.from(
352
352
  { length: 8 },
353
353
  (t, r) => Array.from({ length: 12 }, (s, n) => ({
@@ -406,7 +406,7 @@ const x = (e, t) => {
406
406
  setCellState: (t, r, s) => {
407
407
  e((n) => {
408
408
  const o = n.cells.map(
409
- (i) => i.map((d) => ({ ...d }))
409
+ (i) => i.map((f) => ({ ...f }))
410
410
  );
411
411
  let l = n.startTile, p = n.endTile, w = [...n.obstacleTiles];
412
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) {
@@ -455,38 +455,38 @@ const x = (e, t) => {
455
455
  const s = r.cells.flat().find((o) => o.state === a.Start), n = r.cells.flat().find((o) => o.state === a.End);
456
456
  if (s && n) {
457
457
  const o = r.cells.map(
458
- (i) => i.map((d) => ({
459
- row: d.row,
460
- col: d.col,
461
- state: d.state
458
+ (i) => i.map((f) => ({
459
+ row: f.row,
460
+ col: f.col,
461
+ state: f.state
462
462
  }))
463
463
  ), { path: l, visitedNodes: p } = _e(o, s, n, t);
464
- return (async (i, d) => {
465
- for (let c of d)
464
+ return (async (i, f) => {
465
+ for (let c of f)
466
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
467
+ const h = u.cells.map(
468
+ (m) => m.map((d) => ({
469
+ ...d,
470
+ state: c.row === d.row && c.col === d.col && d.state === a.Empty ? a.Visited : d.state
471
471
  }))
472
472
  );
473
473
  return {
474
474
  ...u,
475
- cells: f,
475
+ cells: h,
476
476
  visitedNodes: [...u.visitedNodes, c]
477
477
  };
478
478
  });
479
479
  for (let c of i)
480
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
481
+ const h = u.cells.map(
482
+ (m) => m.map((d) => ({
483
+ ...d,
484
+ state: c.row === d.row && c.col === d.col ? a.Path : d.state
485
485
  }))
486
486
  );
487
487
  return {
488
488
  ...u,
489
- cells: f,
489
+ cells: h,
490
490
  path: [...u.path, c]
491
491
  };
492
492
  });
@@ -523,22 +523,22 @@ const x = (e, t) => {
523
523
  };
524
524
  });
525
525
  }
526
- }), ye = (e) => ({
526
+ }), Oe = (e) => ({
527
527
  activeButton: a.Start,
528
528
  setSelectedButtonState: (t) => e({ activeButton: t }),
529
529
  canTravelDiagonally: !0,
530
530
  setCanTravelDiagonally: (t) => e({ canTravelDiagonally: t })
531
531
  }), Ne = (e) => ({
532
- visualTheme: A.Medieval,
532
+ visualTheme: z.Medieval,
533
533
  showCosts: !1,
534
534
  setVisualTheme: (t) => e({ visualTheme: t }),
535
535
  setShowCosts: (t) => e({ showCosts: t })
536
536
  }), j = we((e, t, r) => ({
537
- ...Oe(e),
538
537
  ...ye(e),
538
+ ...Oe(e),
539
539
  ...Ne(e)
540
540
  })), Me = {
541
- id: A.Classic,
541
+ id: z.Classic,
542
542
  name: "Classic",
543
543
  startIcon: "●",
544
544
  endIcon: "●",
@@ -550,7 +550,7 @@ const x = (e, t) => {
550
550
  { id: "maze", name: "Maze", icon: "🔲" }
551
551
  ]
552
552
  }, Ce = {
553
- id: A.Medieval,
553
+ id: z.Medieval,
554
554
  name: "Medieval",
555
555
  startIcon: "⚔️",
556
556
  endIcon: "🏰",
@@ -567,8 +567,8 @@ const x = (e, t) => {
567
567
  { id: "random", name: "Random Forest", icon: "🎲" }
568
568
  ]
569
569
  }, oe = {
570
- [A.Classic]: Me,
571
- [A.Medieval]: Ce
570
+ [z.Classic]: Me,
571
+ [z.Medieval]: Ce
572
572
  }, F = (e) => oe[e], Te = (e) => {
573
573
  const t = F(e);
574
574
  return Object.entries(t.terrains).map(([r, s]) => ({
@@ -578,18 +578,18 @@ const x = (e, t) => {
578
578
  };
579
579
  const Re = () => {
580
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);
581
+ const { cells: e, activeButton: t, setCellState: r, setSelectedButtonState: s, visitedNodes: n, path: o, visualTheme: l, showCosts: p } = j(), w = F(l), [i, f] = ee({ width: 0, height: 0 }), c = D.useRef(null);
582
582
  te(() => {
583
583
  const E = () => {
584
584
  if (c.current) {
585
- const O = c.current.getBoundingClientRect();
586
- d({ width: O.width, height: O.height });
585
+ const y = c.current.getBoundingClientRect();
586
+ f({ width: y.width, height: y.height });
587
587
  }
588
588
  };
589
589
  return E(), window.addEventListener("resize", E), () => window.removeEventListener("resize", E);
590
590
  }, []);
591
- const u = (E, O) => {
592
- switch (r(E, O, t), t) {
591
+ const u = (E, y) => {
592
+ switch (r(E, y, t), t) {
593
593
  case a.Start:
594
594
  s(a.End);
595
595
  break;
@@ -597,14 +597,14 @@ const Re = () => {
597
597
  s(a.Obstacle);
598
598
  break;
599
599
  }
600
- }, f = (E, O) => {
601
- const b = n.find((M) => M.row === E && M.col === O);
600
+ }, h = (E, y) => {
601
+ const b = n.find((M) => M.row === E && M.col === y);
602
602
  return b ? { g: b.g, h: b.h, f: b.f } : { g: null, h: null, f: null };
603
- }, m = (() => {
604
- var y;
603
+ }, d = (() => {
604
+ var O;
605
605
  if (!i.width || !i.height)
606
606
  return 20;
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);
607
+ const E = ((O = e[0]) == null ? void 0 : O.length) || 1, y = e.length || 1, b = 20, M = E + y, R = i.width - b - M, _ = i.height - b - M, C = R / E, L = _ / y, g = Math.min(C, L);
608
608
  return Math.max(15, Math.min(g, 60));
609
609
  })();
610
610
  return /* @__PURE__ */ v("div", { className: "grid-wrapper", ref: c, children: /* @__PURE__ */ v(
@@ -613,8 +613,8 @@ const Re = () => {
613
613
  className: "grid-container",
614
614
  style: {
615
615
  display: "grid",
616
- gridTemplateColumns: `repeat(${((S = e[0]) == null ? void 0 : S.length) || 1}, ${m}px)`,
617
- gridTemplateRows: `repeat(${e.length || 1}, ${m}px)`,
616
+ gridTemplateColumns: `repeat(${((S = e[0]) == null ? void 0 : S.length) || 1}, ${d}px)`,
617
+ gridTemplateRows: `repeat(${e.length || 1}, ${d}px)`,
618
618
  gap: "1px",
619
619
  padding: "8px",
620
620
  background: "var(--bg-secondary)",
@@ -623,23 +623,23 @@ const Re = () => {
623
623
  border: "1px solid var(--border-color)"
624
624
  },
625
625
  children: e.map(
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, _);
626
+ (E, y) => E.map((b, M) => {
627
+ var A, 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 } = h(b.row, b.col);
629
+ let O = Le(b, _);
630
630
  if (R) {
631
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)";
632
+ T === 0 ? O = "var(--cell-start)" : T === o.length - 1 ? O = "var(--cell-end)" : O = "var(--cell-path)";
633
633
  }
634
634
  return /* @__PURE__ */ N(
635
635
  "div",
636
636
  {
637
637
  className: "grid-cell",
638
- onClick: () => u(O, M),
638
+ onClick: () => u(y, M),
639
639
  style: {
640
- width: m,
641
- height: m,
642
- backgroundColor: y,
640
+ width: d,
641
+ height: d,
642
+ backgroundColor: O,
643
643
  border: "1px solid var(--cell-border)",
644
644
  cursor: "pointer",
645
645
  transition: "all 0.15s ease",
@@ -653,7 +653,7 @@ const Re = () => {
653
653
  b.state === a.Empty && (T.currentTarget.style.backgroundColor = "var(--bg-tertiary)", T.currentTarget.style.transform = "scale(1.02)");
654
654
  },
655
655
  onMouseLeave: (T) => {
656
- b.state === a.Empty && (T.currentTarget.style.backgroundColor = y, T.currentTarget.style.transform = "scale(1)");
656
+ b.state === a.Empty && (T.currentTarget.style.backgroundColor = O, T.currentTarget.style.transform = "scale(1)");
657
657
  },
658
658
  children: [
659
659
  _ && p && /* @__PURE__ */ N("div", { className: "cell-values", children: [
@@ -670,15 +670,15 @@ const Re = () => {
670
670
  C
671
671
  ] })
672
672
  ] }),
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) || "⛰️" })
673
+ b.state === a.Start && /* @__PURE__ */ v("div", { className: "cell-indicator start", style: { fontSize: d * 0.7 }, children: w.startIcon }),
674
+ b.state === a.End && /* @__PURE__ */ v("div", { className: "cell-indicator end", style: { fontSize: d * 0.7 }, children: w.endIcon }),
675
+ b.state === a.Obstacle && /* @__PURE__ */ v("div", { className: "cell-indicator obstacle", style: { fontSize: d * 0.7 }, children: ((A = w.terrains[a.Obstacle]) == null ? void 0 : A.icon) || "■" }),
676
+ b.state === a.Water && /* @__PURE__ */ v("div", { className: "cell-indicator water", style: { fontSize: d * 0.7 }, children: ((G = w.terrains[a.Water]) == null ? void 0 : G.icon) || "🌊" }),
677
+ b.state === a.Forest && /* @__PURE__ */ v("div", { className: "cell-indicator forest", style: { fontSize: d * 0.7 }, children: (($ = w.terrains[a.Forest]) == null ? void 0 : $.icon) || "🌲" }),
678
+ b.state === a.Mountain && /* @__PURE__ */ v("div", { className: "cell-indicator mountain", style: { fontSize: d * 0.7 }, children: ((H = w.terrains[a.Mountain]) == null ? void 0 : H.icon) || "⛰️" })
679
679
  ]
680
680
  },
681
- `${O}-${M}`
681
+ `${y}-${M}`
682
682
  );
683
683
  })
684
684
  )
@@ -705,7 +705,7 @@ const Re = () => {
705
705
  default:
706
706
  return "var(--cell-empty)";
707
707
  }
708
- }, Ae = (e, t) => {
708
+ }, ze = (e, t) => {
709
709
  const r = [], s = Math.floor(e / 2), n = Math.max(2, Math.floor(t / 6)), o = [];
710
710
  for (let l = 0; l < n; l++) {
711
711
  const p = Math.floor(t / (n + 1) * (l + 1));
@@ -716,27 +716,27 @@ const Re = () => {
716
716
  for (let l = 0; l < t; l += 3)
717
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
718
  return r;
719
- }, De = (e, t) => {
719
+ }, Ae = (e, t) => {
720
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
721
  for (let i = 0; i < p; i++)
722
722
  w.push(Math.floor((l - n) / (p + 1) * (i + 1)) + n);
723
723
  for (let i = n; i <= l; i++) {
724
- const d = (i - n) / (l - n), c = Math.floor(s + (o - s) * d);
724
+ const f = (i - n) / (l - n), c = Math.floor(s + (o - s) * f);
725
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
726
  }
727
727
  for (const i of [...r])
728
728
  if (i.state === a.Mountain) {
729
- const d = [
729
+ const f = [
730
730
  { row: i.row - 2, col: i.col },
731
731
  { row: i.row + 2, col: i.col },
732
732
  { row: i.row, col: i.col - 2 },
733
733
  { row: i.row, col: i.col + 2 }
734
734
  ];
735
- for (const c of d)
735
+ for (const c of f)
736
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
737
  }
738
738
  return r;
739
- }, ze = (e, t) => {
739
+ }, De = (e, t) => {
740
740
  const r = [];
741
741
  for (let n = 0; n < e; n++)
742
742
  for (let o = 0; o < t; o++) {
@@ -787,14 +787,14 @@ const Pe = ({ isDarkMode: e, setIsDarkMode: t }) => {
787
787
  setNumberOfRows: p,
788
788
  setNumberOfColumns: w,
789
789
  handleFindPath: i,
790
- canTravelDiagonally: d,
790
+ canTravelDiagonally: f,
791
791
  setCanTravelDiagonally: c,
792
792
  visualTheme: u,
793
- setVisualTheme: f,
794
- showCosts: h,
795
- setShowCosts: m,
793
+ setVisualTheme: h,
794
+ showCosts: m,
795
+ setShowCosts: d,
796
796
  setCellState: S
797
- } = j(), E = F(u), O = Te(u), b = () => {
797
+ } = j(), E = F(u), y = Te(u), b = () => {
798
798
  t(!e);
799
799
  }, M = [
800
800
  { label: "Start", state: a.Start },
@@ -807,23 +807,23 @@ const Pe = ({ isDarkMode: e, setIsDarkMode: t }) => {
807
807
  }, _ = () => {
808
808
  n(), s(a.Start);
809
809
  }, C = () => {
810
- i(d);
810
+ i(f);
811
811
  }, L = (g) => {
812
812
  n();
813
- let y;
814
- if (u === A.Medieval)
813
+ let O;
814
+ if (u === z.Medieval)
815
815
  switch (g) {
816
816
  case "river":
817
- y = Ae(o, l);
817
+ O = ze(o, l);
818
818
  break;
819
819
  case "mountains":
820
- y = De(o, l);
820
+ O = Ae(o, l);
821
821
  break;
822
822
  case "maze":
823
- y = ze(o, l);
823
+ O = De(o, l);
824
824
  break;
825
825
  case "random":
826
- y = Ve(o, l);
826
+ O = Ve(o, l);
827
827
  break;
828
828
  default:
829
829
  return;
@@ -831,16 +831,16 @@ const Pe = ({ isDarkMode: e, setIsDarkMode: t }) => {
831
831
  else
832
832
  switch (g) {
833
833
  case "random":
834
- y = ke(o, l);
834
+ O = ke(o, l);
835
835
  break;
836
836
  case "maze":
837
- y = We(o, l);
837
+ O = We(o, l);
838
838
  break;
839
839
  default:
840
840
  return;
841
841
  }
842
- for (const D of y)
843
- S(D.row, D.col, D.state);
842
+ for (const A of O)
843
+ S(A.row, A.col, A.state);
844
844
  S(0, 0, a.Start), S(o - 1, l - 1, a.End), s(a.Obstacle);
845
845
  };
846
846
  return /* @__PURE__ */ v("div", { className: "control-panel", children: /* @__PURE__ */ N("div", { className: "control-grid", children: [
@@ -852,7 +852,7 @@ const Pe = ({ isDarkMode: e, setIsDarkMode: t }) => {
852
852
  {
853
853
  className: "theme-select",
854
854
  value: u,
855
- onChange: (g) => f(g.target.value),
855
+ onChange: (g) => h(g.target.value),
856
856
  children: Object.values(oe).map((g) => /* @__PURE__ */ v("option", { value: g.id, children: g.name }, g.id))
857
857
  }
858
858
  ),
@@ -868,38 +868,38 @@ const Pe = ({ isDarkMode: e, setIsDarkMode: t }) => {
868
868
  /* @__PURE__ */ v(
869
869
  "button",
870
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"
871
+ className: `control-button show-costs ${m ? "active" : ""}`,
872
+ onClick: () => d(!m),
873
+ title: m ? "Hide costs" : "Show costs",
874
+ children: m ? "📊 Costs On" : "📊 Costs Off"
875
875
  }
876
876
  )
877
877
  ] })
878
878
  ] }),
879
879
  /* @__PURE__ */ N("div", { className: "control-group tools", children: [
880
880
  /* @__PURE__ */ v("h3", { className: "group-title", children: "Tools" }),
881
- /* @__PURE__ */ v("div", { className: "button-group", children: M.map((g, y) => /* @__PURE__ */ v(
881
+ /* @__PURE__ */ v("div", { className: "button-group", children: M.map((g, O) => /* @__PURE__ */ v(
882
882
  "button",
883
883
  {
884
884
  className: `control-button ${g.label.toLowerCase()} ${r === g.state ? "active" : ""}`,
885
885
  onClick: () => R(g.state),
886
886
  children: g.label
887
887
  },
888
- y
888
+ O
889
889
  )) })
890
890
  ] }),
891
- u === A.Medieval && /* @__PURE__ */ N("div", { className: "control-group terrain", children: [
891
+ u === z.Medieval && /* @__PURE__ */ N("div", { className: "control-group terrain", children: [
892
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(
893
+ /* @__PURE__ */ v("div", { className: "button-group", children: y.filter(({ state: g }) => g !== a.Obstacle).map(({ state: g, config: O }) => /* @__PURE__ */ N(
894
894
  "button",
895
895
  {
896
- className: `control-button terrain-btn ${y.name.toLowerCase()} ${r === g ? "active" : ""}`,
896
+ className: `control-button terrain-btn ${O.name.toLowerCase()} ${r === g ? "active" : ""}`,
897
897
  onClick: () => s(g),
898
- title: y.passable ? "Passable terrain" : "Impassable terrain",
898
+ title: O.passable ? "Passable terrain" : "Impassable terrain",
899
899
  children: [
900
- y.icon,
900
+ O.icon,
901
901
  " ",
902
- y.name
902
+ O.name
903
903
  ]
904
904
  },
905
905
  g
@@ -935,9 +935,9 @@ const Pe = ({ isDarkMode: e, setIsDarkMode: t }) => {
935
935
  /* @__PURE__ */ v(
936
936
  "button",
937
937
  {
938
- className: `control-button diagonal ${d ? "active" : ""}`,
939
- onClick: () => c(!d),
940
- children: d ? "Diagonal On" : "Diagonal Off"
938
+ className: `control-button diagonal ${f ? "active" : ""}`,
939
+ onClick: () => c(!f),
940
+ children: f ? "Diagonal On" : "Diagonal Off"
941
941
  }
942
942
  )
943
943
  ] })
@@ -1018,5 +1018,5 @@ export {
1018
1018
  je as AStarVisualizer,
1019
1019
  a as CellState,
1020
1020
  Ie as Layout,
1021
- A as VisualTheme
1021
+ z as VisualTheme
1022
1022
  };
@@ -1,4 +1,4 @@
1
- (function(C,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],i):(C=typeof globalThis<"u"?globalThis:C||self,i(C.AStarVisualizer={},C["react/jsx-runtime"],C.React))})(this,function(C,i,L){"use strict";const Ie="",Be="",H=e=>{let t;const o=new Set,n=(f,u)=>{const d=typeof f=="function"?f(t):f;if(!Object.is(d,t)){const h=t;t=u??(typeof d!="object"||d===null)?d:Object.assign({},t,d),o.forEach(m=>m(t,h))}},s=()=>t,w={setState:n,getState:s,getInitialState:()=>c,subscribe:f=>(o.add(f),()=>o.delete(f)),destroy:()=>{o.clear()}},c=t=e(n,s,w);return w},re=e=>e?H(e):H;function se(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var P={exports:{}},W={},k={exports:{}},I={};/**
1
+ (function(C,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],i):(C=typeof globalThis<"u"?globalThis:C||self,i(C.AStarVisualizer={},C["react/jsx-runtime"],C.React))})(this,function(C,i,L){"use strict";const Ie="",Be="",H=e=>{let t;const o=new Set,n=(h,u)=>{const d=typeof h=="function"?h(t):h;if(!Object.is(d,t)){const m=t;t=u??(typeof d!="object"||d===null)?d:Object.assign({},t,d),o.forEach(p=>p(t,m))}},s=()=>t,w={setState:n,getState:s,getInitialState:()=>c,subscribe:h=>(o.add(h),()=>o.delete(h)),destroy:()=>{o.clear()}},c=t=e(n,s,w);return w},re=e=>e?H(e):H;function se(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var P={exports:{}},W={},k={exports:{}},I={};/**
2
2
  * @license React
3
3
  * use-sync-external-store-shim.production.js
4
4
  *
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
9
- */var K;function ne(){if(K)return I;K=1;var e=L;function t(u,d){return u===d&&(u!==0||1/u===1/d)||u!==u&&d!==d}var o=typeof Object.is=="function"?Object.is:t,n=e.useState,s=e.useEffect,r=e.useLayoutEffect,l=e.useDebugValue;function v(u,d){var h=d(),m=n({inst:{value:h,getSnapshot:d}}),p=m[0].inst,S=m[1];return r(function(){p.value=h,p.getSnapshot=d,w(p)&&S({inst:p})},[u,h,d]),s(function(){return w(p)&&S({inst:p}),u(function(){w(p)&&S({inst:p})})},[u]),l(h),h}function w(u){var d=u.getSnapshot;u=u.value;try{var h=d();return!o(u,h)}catch{return!0}}function c(u,d){return d()}var f=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?c:v;return I.useSyncExternalStore=e.useSyncExternalStore!==void 0?e.useSyncExternalStore:f,I}var B={};/**
9
+ */var K;function ne(){if(K)return I;K=1;var e=L;function t(u,d){return u===d&&(u!==0||1/u===1/d)||u!==u&&d!==d}var o=typeof Object.is=="function"?Object.is:t,n=e.useState,s=e.useEffect,r=e.useLayoutEffect,l=e.useDebugValue;function v(u,d){var m=d(),p=n({inst:{value:m,getSnapshot:d}}),f=p[0].inst,E=p[1];return r(function(){f.value=m,f.getSnapshot=d,w(f)&&E({inst:f})},[u,m,d]),s(function(){return w(f)&&E({inst:f}),u(function(){w(f)&&E({inst:f})})},[u]),l(m),m}function w(u){var d=u.getSnapshot;u=u.value;try{var m=d();return!o(u,m)}catch{return!0}}function c(u,d){return d()}var h=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?c:v;return I.useSyncExternalStore=e.useSyncExternalStore!==void 0?e.useSyncExternalStore:h,I}var B={};/**
10
10
  * @license React
11
11
  * use-sync-external-store-shim.development.js
12
12
  *
@@ -14,7 +14,7 @@
14
14
  *
15
15
  * This source code is licensed under the MIT license found in the
16
16
  * LICENSE file in the root directory of this source tree.
17
- */var U;function ae(){return U||(U=1,process.env.NODE_ENV!=="production"&&function(){function e(h,m){return h===m&&(h!==0||1/h===1/m)||h!==h&&m!==m}function t(h,m){f||s.startTransition===void 0||(f=!0,console.error("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."));var p=m();if(!u){var S=m();r(p,S)||(console.error("The result of getSnapshot should be cached to avoid an infinite loop"),u=!0)}S=l({inst:{value:p,getSnapshot:m}});var E=S[0].inst,y=S[1];return w(function(){E.value=p,E.getSnapshot=m,o(E)&&y({inst:E})},[h,p,m]),v(function(){return o(E)&&y({inst:E}),h(function(){o(E)&&y({inst:E})})},[h]),c(p),p}function o(h){var m=h.getSnapshot;h=h.value;try{var p=m();return!r(h,p)}catch{return!0}}function n(h,m){return m()}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var s=L,r=typeof Object.is=="function"?Object.is:e,l=s.useState,v=s.useEffect,w=s.useLayoutEffect,c=s.useDebugValue,f=!1,u=!1,d=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?n:t;B.useSyncExternalStore=s.useSyncExternalStore!==void 0?s.useSyncExternalStore:d,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),B}var R;function J(){return R||(R=1,process.env.NODE_ENV==="production"?k.exports=ne():k.exports=ae()),k.exports}/**
17
+ */var U;function ae(){return U||(U=1,process.env.NODE_ENV!=="production"&&function(){function e(m,p){return m===p&&(m!==0||1/m===1/p)||m!==m&&p!==p}function t(m,p){h||s.startTransition===void 0||(h=!0,console.error("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."));var f=p();if(!u){var E=p();r(f,E)||(console.error("The result of getSnapshot should be cached to avoid an infinite loop"),u=!0)}E=l({inst:{value:f,getSnapshot:p}});var S=E[0].inst,_=E[1];return w(function(){S.value=f,S.getSnapshot=p,o(S)&&_({inst:S})},[m,f,p]),v(function(){return o(S)&&_({inst:S}),m(function(){o(S)&&_({inst:S})})},[m]),c(f),f}function o(m){var p=m.getSnapshot;m=m.value;try{var f=p();return!r(m,f)}catch{return!0}}function n(m,p){return p()}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var s=L,r=typeof Object.is=="function"?Object.is:e,l=s.useState,v=s.useEffect,w=s.useLayoutEffect,c=s.useDebugValue,h=!1,u=!1,d=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?n:t;B.useSyncExternalStore=s.useSyncExternalStore!==void 0?s.useSyncExternalStore:d,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),B}var R;function J(){return R||(R=1,process.env.NODE_ENV==="production"?k.exports=ne():k.exports=ae()),k.exports}/**
18
18
  * @license React
19
19
  * use-sync-external-store-shim/with-selector.production.js
20
20
  *
@@ -22,7 +22,7 @@
22
22
  *
23
23
  * This source code is licensed under the MIT license found in the
24
24
  * LICENSE file in the root directory of this source tree.
25
- */var q;function le(){if(q)return W;q=1;var e=L,t=J();function o(c,f){return c===f&&(c!==0||1/c===1/f)||c!==c&&f!==f}var n=typeof Object.is=="function"?Object.is:o,s=t.useSyncExternalStore,r=e.useRef,l=e.useEffect,v=e.useMemo,w=e.useDebugValue;return W.useSyncExternalStoreWithSelector=function(c,f,u,d,h){var m=r(null);if(m.current===null){var p={hasValue:!1,value:null};m.current=p}else p=m.current;m=v(function(){function E(_){if(!y){if(y=!0,b=_,_=d(_),h!==void 0&&p.hasValue){var M=p.value;if(h(M,_))return N=M}return N=_}if(M=N,n(b,_))return M;var D=d(_);return h!==void 0&&h(M,D)?(b=_,M):(b=_,N=D)}var y=!1,b,N,A=u===void 0?null:u;return[function(){return E(f())},A===null?void 0:function(){return E(A())}]},[f,u,d,h]);var S=s(c,m[0],m[1]);return l(function(){p.hasValue=!0,p.value=S},[S]),w(S),S},W}var j={};/**
25
+ */var q;function le(){if(q)return W;q=1;var e=L,t=J();function o(c,h){return c===h&&(c!==0||1/c===1/h)||c!==c&&h!==h}var n=typeof Object.is=="function"?Object.is:o,s=t.useSyncExternalStore,r=e.useRef,l=e.useEffect,v=e.useMemo,w=e.useDebugValue;return W.useSyncExternalStoreWithSelector=function(c,h,u,d,m){var p=r(null);if(p.current===null){var f={hasValue:!1,value:null};p.current=f}else f=p.current;p=v(function(){function S(y){if(!_){if(_=!0,b=y,y=d(y),m!==void 0&&f.hasValue){var M=f.value;if(m(M,y))return N=M}return N=y}if(M=N,n(b,y))return M;var A=d(y);return m!==void 0&&m(M,A)?(b=y,M):(b=y,N=A)}var _=!1,b,N,z=u===void 0?null:u;return[function(){return S(h())},z===null?void 0:function(){return S(z())}]},[h,u,d,m]);var E=s(c,p[0],p[1]);return l(function(){f.hasValue=!0,f.value=E},[E]),w(E),E},W}var j={};/**
26
26
  * @license React
27
27
  * use-sync-external-store-shim/with-selector.development.js
28
28
  *
@@ -30,4 +30,4 @@
30
30
  *
31
31
  * This source code is licensed under the MIT license found in the
32
32
  * LICENSE file in the root directory of this source tree.
33
- */var Y;function ce(){return Y||(Y=1,process.env.NODE_ENV!=="production"&&function(){function e(c,f){return c===f&&(c!==0||1/c===1/f)||c!==c&&f!==f}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var t=L,o=J(),n=typeof Object.is=="function"?Object.is:e,s=o.useSyncExternalStore,r=t.useRef,l=t.useEffect,v=t.useMemo,w=t.useDebugValue;j.useSyncExternalStoreWithSelector=function(c,f,u,d,h){var m=r(null);if(m.current===null){var p={hasValue:!1,value:null};m.current=p}else p=m.current;m=v(function(){function E(_){if(!y){if(y=!0,b=_,_=d(_),h!==void 0&&p.hasValue){var M=p.value;if(h(M,_))return N=M}return N=_}if(M=N,n(b,_))return M;var D=d(_);return h!==void 0&&h(M,D)?(b=_,M):(b=_,N=D)}var y=!1,b,N,A=u===void 0?null:u;return[function(){return E(f())},A===null?void 0:function(){return E(A())}]},[f,u,d,h]);var S=s(c,m[0],m[1]);return l(function(){p.hasValue=!0,p.value=S},[S]),w(S),S},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),j}process.env.NODE_ENV==="production"?P.exports=le():P.exports=ce();var ie=P.exports;const ue=se(ie),{useDebugValue:de}=L,{useSyncExternalStoreWithSelector:fe}=ue;let je=!1;const he=e=>e;function me(e,t=he,o){const n=fe(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,o);return de(n),n}const Q=e=>{const t=typeof e=="function"?re(e):e,o=(n,s)=>me(t,n,s);return Object.assign(o,t),o},pe=e=>e?Q(e):Q;var a=(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||{}),z=(e=>(e.Classic="classic",e.Medieval="medieval",e))(z||{});const x=(e,t)=>{const o=Math.abs(e.row-t.row),n=Math.abs(e.col-t.col);return Math.floor(10*Math.sqrt(o*o+n*n))},ve=(e,t)=>({row:e.row,col:e.col,g:0,h:x(e,t),f:x(e,t),parent:null}),we=(e,t,o)=>{const n=[{row:e.row-1,col:e.col},{row:e.row+1,col:e.col},{row:e.row,col:e.col-1},{row:e.row,col:e.col+1}];o&&n.push({row:e.row-1,col:e.col-1},{row:e.row-1,col:e.col+1},{row:e.row+1,col:e.col-1},{row:e.row+1,col:e.col+1});const s=[a.Obstacle,a.Water,a.Mountain];return n.filter(r=>r.row>=0&&r.row<t.length&&r.col>=0&&r.col<t[0].length&&!s.includes(t[r.row][r.col].state)).map(r=>({row:r.row,col:r.col,state:t[r.row][r.col].state}))},be=(e,t,o)=>{const n=Math.abs(e.row-t.row),s=Math.abs(e.col-t.col),r=e.g+(n===0||s===0?10:14),l=x(t,o),v=r+l;return{g:r,h:l,f:v}},ge=e=>{const t=[];let o=e;for(;o;)t.push(o),o=o.parent;return t.reverse()},Ee=(e,t,o,n)=>{const s=[],r=[],l=ve(t,o);for(s.push(l);s.length>0;){s.sort((c,f)=>c.f-f.f);const v=s.shift();if(v.row===o.row&&v.col===o.col)return r.push(v),{path:ge(v),visitedNodes:r};r.push(v);const w=we(v,e,n);for(const c of w){if(r.some(m=>m.row===c.row&&m.col===c.col))continue;const{g:f,h:u,f:d}=be(v,c,o),h=s.find(m=>m.row===c.row&&m.col===c.col);if(!h||f<h.g){const m={row:c.row,col:c.col,g:f,h:u,f:d,parent:v};h?(h.g=f,h.f=d,h.parent=v):s.push(m)}}}return{path:[],visitedNodes:r}},Se=e=>({cells:Array.from({length:8},(t,o)=>Array.from({length:12},(n,s)=>({row:o,col:s,state:a.Empty}))),rows:8,columns:12,startTile:null,endTile:null,obstacleTiles:[],path:[],visitedNodes:[],setNumberOfColumns:t=>{e(o=>{const n=o.cells.map(s=>t>o.columns?[...s,...Array.from({length:t-o.columns},(r,l)=>({row:s[0].row,col:o.columns+l,state:a.Empty}))]:s.slice(0,t));return{...o,columns:t,cells:n}})},setNumberOfRows:t=>{e(o=>{let n=[...o.cells];return t>o.rows?n=[...n,...Array.from({length:t-o.rows},(s,r)=>Array.from({length:o.columns},(l,v)=>({row:o.rows+r,col:v,state:a.Empty})))]:n=n.slice(0,t),{...o,rows:t,cells:n}})},setCellState:(t,o,n)=>{e(s=>{const r=s.cells.map(c=>c.map(f=>({...f})));let l=s.startTile,v=s.endTile,w=[...s.obstacleTiles];switch(n===a.Start&&s.startTile&&(r[s.startTile.row][s.startTile.col].state=a.Empty,l=null),n===a.End&&s.endTile&&(r[s.endTile.row][s.endTile.col].state=a.Empty,v=null),r[t][o].state=n,n){case a.Start:l={row:t,col:o};break;case a.End:v={row:t,col:o};break;case a.Obstacle:w.some(c=>c.row===t&&c.col===o)||w.push({row:t,col:o});break;case a.Empty:w=w.filter(c=>!(c.row===t&&c.col===o));break}return{...s,cells:r,startTile:l,endTile:v,obstacleTiles:w}})},resetCells:()=>{e(t=>({...t,cells:t.cells.map(o=>o.map(n=>({...n,state:a.Empty}))),startTile:null,endTile:null,obstacleTiles:[],path:[],visitedNodes:[]}))},handleFindPath:t=>{e(o=>{const n=o.cells.flat().find(r=>r.state===a.Start),s=o.cells.flat().find(r=>r.state===a.End);if(n&&s){const r=o.cells.map(c=>c.map(f=>({row:f.row,col:f.col,state:f.state}))),{path:l,visitedNodes:v}=Ee(r,n,s,t);return(async(c,f)=>{for(let u of f)await new Promise(d=>setTimeout(d,100)),e(d=>{const h=d.cells.map(m=>m.map(p=>({...p,state:u.row===p.row&&u.col===p.col&&p.state===a.Empty?a.Visited:p.state})));return{...d,cells:h,visitedNodes:[...d.visitedNodes,u]}});for(let u of c)await new Promise(d=>setTimeout(d,250)),e(d=>{const h=d.cells.map(m=>m.map(p=>({...p,state:u.row===p.row&&u.col===p.col?a.Path:p.state})));return{...d,cells:h,path:[...d.path,u]}})})(l,v),{...o,path:[],visitedNodes:[]}}return o})},setPath:t=>{e(o=>{const n=o.cells.map(s=>s.map(r=>({...r,state:t.some(l=>l.row===r.row&&l.col===r.col)?a.Path:r.state})));return{...o,cells:n}})},setVisitedNodes:t=>{e(o=>{const n=o.cells.map(s=>s.map(r=>({...r,state:t.some(l=>l.row===r.row&&l.col===r.col)&&r.state===a.Empty?a.Visited:r.state})));return{...o,cells:n}})}}),_e=e=>({activeButton:a.Start,setSelectedButtonState:t=>e({activeButton:t}),canTravelDiagonally:!0,setCanTravelDiagonally:t=>e({canTravelDiagonally:t})}),ye=e=>({visualTheme:z.Medieval,showCosts:!1,setVisualTheme:t=>e({visualTheme:t}),setShowCosts:t=>e({showCosts:t})}),F=pe((e,t,o)=>({...Se(e),..._e(e),...ye(e)})),Oe={id:z.Classic,name:"Classic",startIcon:"●",endIcon:"●",terrains:{[a.Obstacle]:{name:"Wall",icon:"■",passable:!1}},presets:[{id:"random",name:"Random",icon:"🎲"},{id:"maze",name:"Maze",icon:"🔲"}]},Ne={id:z.Medieval,name:"Medieval",startIcon:"⚔️",endIcon:"🏰",terrains:{[a.Obstacle]:{name:"Wall",icon:"🧱",passable:!1},[a.Water]:{name:"Water",icon:"🌊",passable:!1},[a.Forest]:{name:"Forest",icon:"🌲",passable:!0},[a.Mountain]:{name:"Mountain",icon:"⛰️",passable:!1}},presets:[{id:"river",name:"River Crossing",icon:"🌊"},{id:"mountains",name:"Mountain Range",icon:"⛰️"},{id:"maze",name:"Castle Maze",icon:"🏰"},{id:"random",name:"Random Forest",icon:"🎲"}]},X={[z.Classic]:Oe,[z.Medieval]:Ne},G=e=>X[e],Me=e=>{const t=G(e);return Object.entries(t.terrains).map(([o,n])=>({state:Number(o),config:n}))},xe="",Te=()=>{var S;const{cells:e,activeButton:t,setCellState:o,setSelectedButtonState:n,visitedNodes:s,path:r,visualTheme:l,showCosts:v}=F(),w=G(l),[c,f]=L.useState({width:0,height:0}),u=L.useRef(null);L.useEffect(()=>{const E=()=>{if(u.current){const y=u.current.getBoundingClientRect();f({width:y.width,height:y.height})}};return E(),window.addEventListener("resize",E),()=>window.removeEventListener("resize",E)},[]);const d=(E,y)=>{switch(o(E,y,t),t){case a.Start:n(a.End);break;case a.End:n(a.Obstacle);break}},h=(E,y)=>{const b=s.find(N=>N.row===E&&N.col===y);return b?{g:b.g,h:b.h,f:b.f}:{g:null,h:null,f:null}},p=(()=>{var O;if(!c.width||!c.height)return 20;const E=((O=e[0])==null?void 0:O.length)||1,y=e.length||1,b=20,N=E+y,A=c.width-b-N,_=c.height-b-N,M=A/E,D=_/y,g=Math.min(M,D);return Math.max(15,Math.min(g,60))})();return i.jsx("div",{className:"grid-wrapper",ref:u,children:i.jsx("div",{className:"grid-container",style:{display:"grid",gridTemplateColumns:`repeat(${((S=e[0])==null?void 0:S.length)||1}, ${p}px)`,gridTemplateRows:`repeat(${e.length||1}, ${p}px)`,gap:"1px",padding:"8px",background:"var(--bg-secondary)",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.1)",border:"1px solid var(--border-color)"},children:e.map((E,y)=>E.map((b,N)=>{var V,$,ee,te;const A=r.some(T=>T.row===b.row&&T.col===b.col),_=s.some(T=>T.row===b.row&&T.col===b.col),{g:M,h:D,f:g}=h(b.row,b.col);let O=Ce(b,_);if(A){const T=r.findIndex(oe=>oe.row===b.row&&oe.col===b.col);T===0?O="var(--cell-start)":T===r.length-1?O="var(--cell-end)":O="var(--cell-path)"}return i.jsxs("div",{className:"grid-cell",onClick:()=>d(y,N),style:{width:p,height:p,backgroundColor:O,border:"1px solid var(--cell-border)",cursor:"pointer",transition:"all 0.15s ease",position:"relative",display:"flex",justifyContent:"center",alignItems:"center",borderRadius:"2px"},onMouseEnter:T=>{b.state===a.Empty&&(T.currentTarget.style.backgroundColor="var(--bg-tertiary)",T.currentTarget.style.transform="scale(1.02)")},onMouseLeave:T=>{b.state===a.Empty&&(T.currentTarget.style.backgroundColor=O,T.currentTarget.style.transform="scale(1)")},children:[_&&v&&i.jsxs("div",{className:"cell-values",children:[i.jsxs("div",{className:"value-h",children:["h",D]}),i.jsxs("div",{className:"value-f",children:["f",g]}),i.jsxs("div",{className:"value-g",children:["g",M]})]}),b.state===a.Start&&i.jsx("div",{className:"cell-indicator start",children:w.startIcon}),b.state===a.End&&i.jsx("div",{className:"cell-indicator end",children:w.endIcon}),b.state===a.Obstacle&&i.jsx("div",{className:"cell-indicator obstacle",children:((V=w.terrains[a.Obstacle])==null?void 0:V.icon)||"■"}),b.state===a.Water&&i.jsx("div",{className:"cell-indicator water",children:(($=w.terrains[a.Water])==null?void 0:$.icon)||"🌊"}),b.state===a.Forest&&i.jsx("div",{className:"cell-indicator forest",children:((ee=w.terrains[a.Forest])==null?void 0:ee.icon)||"🌲"}),b.state===a.Mountain&&i.jsx("div",{className:"cell-indicator mountain",children:((te=w.terrains[a.Mountain])==null?void 0:te.icon)||"⛰️"})]},`${y}-${N}`)}))})})},Ce=(e,t)=>{if(t)return e.state===a.Start?"var(--cell-start)":e.state===a.End?"var(--cell-end)":"var(--cell-visited)";switch(e.state){case a.Start:return"var(--cell-start)";case a.End:return"var(--cell-end)";case a.Obstacle:return"var(--cell-obstacle)";case a.Water:return"var(--cell-water)";case a.Forest:return"var(--cell-forest)";case a.Mountain:return"var(--cell-mountain)";case a.Empty:return"var(--cell-empty)";default:return"var(--cell-empty)"}},Le=(e,t)=>{const o=[],n=Math.floor(e/2),s=Math.max(2,Math.floor(t/6)),r=[];for(let l=0;l<s;l++){const v=Math.floor(t/(s+1)*(l+1));r.push(v)}for(let l=0;l<t;l++)r.includes(l)||(o.push({row:n,col:l,state:a.Water}),n+1<e&&o.push({row:n+1,col:l,state:a.Water}));for(let l=0;l<t;l+=3)n-1>=0&&Math.random()>.5&&o.push({row:n-1,col:l,state:a.Forest}),n+2<e&&Math.random()>.5&&o.push({row:n+2,col:l,state:a.Forest});return o},Ae=(e,t)=>{const o=[],n=Math.floor(e*.2),s=Math.floor(t*.1),r=Math.floor(e*.8),l=Math.floor(t*.9),v=Math.max(2,Math.floor(Math.min(e,t)/5)),w=[];for(let c=0;c<v;c++)w.push(Math.floor((l-s)/(v+1)*(c+1))+s);for(let c=s;c<=l;c++){const f=(c-s)/(l-s),u=Math.floor(n+(r-n)*f);w.some(d=>Math.abs(c-d)<=1)||(u>=0&&u<e&&o.push({row:u,col:c,state:a.Mountain}),u+1<e&&Math.random()>.3&&o.push({row:u+1,col:c,state:a.Mountain}),u-1>=0&&Math.random()>.3&&o.push({row:u-1,col:c,state:a.Mountain}))}for(const c of[...o])if(c.state===a.Mountain){const f=[{row:c.row-2,col:c.col},{row:c.row+2,col:c.col},{row:c.row,col:c.col-2},{row:c.row,col:c.col+2}];for(const u of f)u.row>=0&&u.row<e&&u.col>=0&&u.col<t&&Math.random()>.7&&(o.some(d=>d.row===u.row&&d.col===u.col)||o.push({row:u.row,col:u.col,state:a.Forest}))}return o},De=(e,t)=>{const o=[];for(let s=0;s<e;s++)for(let r=0;r<t;r++){const l=s%3===1,v=r%3===1;(l||v)&&Math.random()>.35&&o.push({row:s,col:r,state:a.Obstacle})}const n=2;return o.filter(s=>{const r=s.row<n&&s.col<n,l=s.row>=e-n&&s.col>=t-n;return!r&&!l})},ze=(e,t,o=.25)=>{const n=[];for(let s=0;s<e;s++)for(let r=0;r<t;r++)if(!(s<2&&r<2||s>=e-2&&r>=t-2)&&Math.random()<o){const v=Math.random();let w;v<.4?w=a.Forest:v<.6?w=a.Obstacle:v<.8?w=a.Water:w=a.Mountain,n.push({row:s,col:r,state:w})}return n},Ve=(e,t,o=.2)=>{const n=[];for(let s=0;s<e;s++)for(let r=0;r<t;r++)!(s<2&&r<2||s>=e-2&&r>=t-2)&&Math.random()<o&&n.push({row:s,col:r,state:a.Obstacle});return n},ke=(e,t)=>{const o=[];for(let s=0;s<e;s++)for(let r=0;r<t;r++){const l=s%3===1,v=r%3===1;(l||v)&&Math.random()>.35&&o.push({row:s,col:r,state:a.Obstacle})}const n=2;return o.filter(s=>{const r=s.row<n&&s.col<n,l=s.row>=e-n&&s.col>=t-n;return!r&&!l})},Fe="",Pe=({isDarkMode:e,setIsDarkMode:t})=>{const{activeButton:o,setSelectedButtonState:n,resetCells:s,rows:r,columns:l,setNumberOfRows:v,setNumberOfColumns:w,handleFindPath:c,canTravelDiagonally:f,setCanTravelDiagonally:u,visualTheme:d,setVisualTheme:h,showCosts:m,setShowCosts:p,setCellState:S}=F(),E=G(d),y=Me(d),b=()=>{t(!e)},N=[{label:"Start",state:a.Start},{label:"End",state:a.End},{label:"Obstacle",state:a.Obstacle},{label:"Clear",state:a.Empty},{label:"Reset",state:null}],A=g=>{g===null?_():n(g)},_=()=>{s(),n(a.Start)},M=()=>{c(f)},D=g=>{s();let O;if(d===z.Medieval)switch(g){case"river":O=Le(r,l);break;case"mountains":O=Ae(r,l);break;case"maze":O=De(r,l);break;case"random":O=ze(r,l);break;default:return}else switch(g){case"random":O=Ve(r,l);break;case"maze":O=ke(r,l);break;default:return}for(const V of O)S(V.row,V.col,V.state);S(0,0,a.Start),S(r-1,l-1,a.End),n(a.Obstacle)};return i.jsx("div",{className:"control-panel",children:i.jsxs("div",{className:"control-grid",children:[i.jsxs("div",{className:"control-group theme-section",children:[i.jsx("h3",{className:"group-title",children:"Theme"}),i.jsxs("div",{className:"button-group",children:[i.jsx("select",{className:"theme-select",value:d,onChange:g=>h(g.target.value),children:Object.values(X).map(g=>i.jsx("option",{value:g.id,children:g.name},g.id))}),i.jsx("button",{className:`control-button theme-toggle ${e?"active":""}`,onClick:b,title:e?"Switch to light mode":"Switch to dark mode",children:e?"☀️ Light":"🌙 Dark"}),i.jsx("button",{className:`control-button show-costs ${m?"active":""}`,onClick:()=>p(!m),title:m?"Hide costs":"Show costs",children:m?"📊 Costs On":"📊 Costs Off"})]})]}),i.jsxs("div",{className:"control-group tools",children:[i.jsx("h3",{className:"group-title",children:"Tools"}),i.jsx("div",{className:"button-group",children:N.map((g,O)=>i.jsx("button",{className:`control-button ${g.label.toLowerCase()} ${o===g.state?"active":""}`,onClick:()=>A(g.state),children:g.label},O))})]}),d===z.Medieval&&i.jsxs("div",{className:"control-group terrain",children:[i.jsx("h3",{className:"group-title",children:"Terrain"}),i.jsx("div",{className:"button-group",children:y.filter(({state:g})=>g!==a.Obstacle).map(({state:g,config:O})=>i.jsxs("button",{className:`control-button terrain-btn ${O.name.toLowerCase()} ${o===g?"active":""}`,onClick:()=>n(g),title:O.passable?"Passable terrain":"Impassable terrain",children:[O.icon," ",O.name]},g))})]}),i.jsxs("div",{className:"control-group presets",children:[i.jsx("h3",{className:"group-title",children:"Generate Map"}),i.jsx("div",{className:"button-group",children:E.presets.map(g=>i.jsxs("button",{className:"control-button preset-btn",onClick:()=>D(g.id),children:[g.icon," ",g.name]},g.id))})]}),i.jsxs("div",{className:"control-group actions",children:[i.jsx("h3",{className:"group-title",children:"Actions"}),i.jsxs("div",{className:"button-group",children:[i.jsx("button",{className:"control-button find-path",onClick:M,children:"Find Path"}),i.jsx("button",{className:`control-button diagonal ${f?"active":""}`,onClick:()=>u(!f),children:f?"Diagonal On":"Diagonal Off"})]})]}),i.jsxs("div",{className:"control-group size",children:[i.jsx("h3",{className:"group-title",children:"Grid Size"}),i.jsxs("div",{className:"size-controls",children:[i.jsxs("div",{className:"size-control",children:[i.jsx("label",{className:"size-label",children:"Rows"}),i.jsxs("div",{className:"size-buttons",children:[i.jsx("button",{className:"size-button",onClick:()=>v(Math.max(5,r-1)),disabled:r<=5,children:"−"}),i.jsx("span",{className:"size-value",children:r}),i.jsx("button",{className:"size-button",onClick:()=>v(Math.min(50,r+1)),disabled:r>=50,children:"+"})]})]}),i.jsxs("div",{className:"size-control",children:[i.jsx("label",{className:"size-label",children:"Columns"}),i.jsxs("div",{className:"size-buttons",children:[i.jsx("button",{className:"size-button",onClick:()=>w(Math.max(5,l-1)),disabled:l<=5,children:"−"}),i.jsx("span",{className:"size-value",children:l}),i.jsx("button",{className:"size-button",onClick:()=>w(Math.min(50,l+1)),disabled:l>=50,children:"+"})]})]})]})]})]})})},Z=({defaultDarkMode:e})=>{const t=L.useRef(null),{visualTheme:o}=F(),[n,s]=L.useState(()=>{if(e!==void 0)return e;const r=localStorage.getItem("astar-darkMode");return r?JSON.parse(r):!1});return L.useEffect(()=>{e===void 0&&localStorage.setItem("astar-darkMode",JSON.stringify(n)),t.current&&(t.current.setAttribute("data-theme",n?"dark":"light"),t.current.setAttribute("data-visual-theme",o))},[n,e,o]),i.jsx("div",{ref:t,className:"astar-visualizer-root","data-theme":n?"dark":"light","data-visual-theme":o,children:i.jsxs("div",{className:"app-container",children:[i.jsx("header",{className:"app-header",children:i.jsx("h1",{className:"app-title",children:"A* Pathfinding"})}),i.jsx("main",{className:"app-main",children:i.jsx(Te,{})}),i.jsx("footer",{className:"app-footer",children:i.jsx(Pe,{isDarkMode:n,setIsDarkMode:s})})]})})};function We({defaultDarkMode:e}){return i.jsx(Z,{defaultDarkMode:e})}C.AStarVisualizer=We,C.CellState=a,C.Layout=Z,C.VisualTheme=z,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})});
33
+ */var Y;function ce(){return Y||(Y=1,process.env.NODE_ENV!=="production"&&function(){function e(c,h){return c===h&&(c!==0||1/c===1/h)||c!==c&&h!==h}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var t=L,o=J(),n=typeof Object.is=="function"?Object.is:e,s=o.useSyncExternalStore,r=t.useRef,l=t.useEffect,v=t.useMemo,w=t.useDebugValue;j.useSyncExternalStoreWithSelector=function(c,h,u,d,m){var p=r(null);if(p.current===null){var f={hasValue:!1,value:null};p.current=f}else f=p.current;p=v(function(){function S(y){if(!_){if(_=!0,b=y,y=d(y),m!==void 0&&f.hasValue){var M=f.value;if(m(M,y))return N=M}return N=y}if(M=N,n(b,y))return M;var A=d(y);return m!==void 0&&m(M,A)?(b=y,M):(b=y,N=A)}var _=!1,b,N,z=u===void 0?null:u;return[function(){return S(h())},z===null?void 0:function(){return S(z())}]},[h,u,d,m]);var E=s(c,p[0],p[1]);return l(function(){f.hasValue=!0,f.value=E},[E]),w(E),E},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),j}process.env.NODE_ENV==="production"?P.exports=le():P.exports=ce();var ie=P.exports;const ue=se(ie),{useDebugValue:de}=L,{useSyncExternalStoreWithSelector:fe}=ue;let je=!1;const he=e=>e;function me(e,t=he,o){const n=fe(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,o);return de(n),n}const Q=e=>{const t=typeof e=="function"?re(e):e,o=(n,s)=>me(t,n,s);return Object.assign(o,t),o},pe=e=>e?Q(e):Q;var a=(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||{}),D=(e=>(e.Classic="classic",e.Medieval="medieval",e))(D||{});const x=(e,t)=>{const o=Math.abs(e.row-t.row),n=Math.abs(e.col-t.col);return Math.floor(10*Math.sqrt(o*o+n*n))},ve=(e,t)=>({row:e.row,col:e.col,g:0,h:x(e,t),f:x(e,t),parent:null}),we=(e,t,o)=>{const n=[{row:e.row-1,col:e.col},{row:e.row+1,col:e.col},{row:e.row,col:e.col-1},{row:e.row,col:e.col+1}];o&&n.push({row:e.row-1,col:e.col-1},{row:e.row-1,col:e.col+1},{row:e.row+1,col:e.col-1},{row:e.row+1,col:e.col+1});const s=[a.Obstacle,a.Water,a.Mountain];return n.filter(r=>r.row>=0&&r.row<t.length&&r.col>=0&&r.col<t[0].length&&!s.includes(t[r.row][r.col].state)).map(r=>({row:r.row,col:r.col,state:t[r.row][r.col].state}))},be=(e,t,o)=>{const n=Math.abs(e.row-t.row),s=Math.abs(e.col-t.col),r=e.g+(n===0||s===0?10:14),l=x(t,o),v=r+l;return{g:r,h:l,f:v}},ge=e=>{const t=[];let o=e;for(;o;)t.push(o),o=o.parent;return t.reverse()},Se=(e,t,o,n)=>{const s=[],r=[],l=ve(t,o);for(s.push(l);s.length>0;){s.sort((c,h)=>c.f-h.f);const v=s.shift();if(v.row===o.row&&v.col===o.col)return r.push(v),{path:ge(v),visitedNodes:r};r.push(v);const w=we(v,e,n);for(const c of w){if(r.some(p=>p.row===c.row&&p.col===c.col))continue;const{g:h,h:u,f:d}=be(v,c,o),m=s.find(p=>p.row===c.row&&p.col===c.col);if(!m||h<m.g){const p={row:c.row,col:c.col,g:h,h:u,f:d,parent:v};m?(m.g=h,m.f=d,m.parent=v):s.push(p)}}}return{path:[],visitedNodes:r}},Ee=e=>({cells:Array.from({length:8},(t,o)=>Array.from({length:12},(n,s)=>({row:o,col:s,state:a.Empty}))),rows:8,columns:12,startTile:null,endTile:null,obstacleTiles:[],path:[],visitedNodes:[],setNumberOfColumns:t=>{e(o=>{const n=o.cells.map(s=>t>o.columns?[...s,...Array.from({length:t-o.columns},(r,l)=>({row:s[0].row,col:o.columns+l,state:a.Empty}))]:s.slice(0,t));return{...o,columns:t,cells:n}})},setNumberOfRows:t=>{e(o=>{let n=[...o.cells];return t>o.rows?n=[...n,...Array.from({length:t-o.rows},(s,r)=>Array.from({length:o.columns},(l,v)=>({row:o.rows+r,col:v,state:a.Empty})))]:n=n.slice(0,t),{...o,rows:t,cells:n}})},setCellState:(t,o,n)=>{e(s=>{const r=s.cells.map(c=>c.map(h=>({...h})));let l=s.startTile,v=s.endTile,w=[...s.obstacleTiles];switch(n===a.Start&&s.startTile&&(r[s.startTile.row][s.startTile.col].state=a.Empty,l=null),n===a.End&&s.endTile&&(r[s.endTile.row][s.endTile.col].state=a.Empty,v=null),r[t][o].state=n,n){case a.Start:l={row:t,col:o};break;case a.End:v={row:t,col:o};break;case a.Obstacle:w.some(c=>c.row===t&&c.col===o)||w.push({row:t,col:o});break;case a.Empty:w=w.filter(c=>!(c.row===t&&c.col===o));break}return{...s,cells:r,startTile:l,endTile:v,obstacleTiles:w}})},resetCells:()=>{e(t=>({...t,cells:t.cells.map(o=>o.map(n=>({...n,state:a.Empty}))),startTile:null,endTile:null,obstacleTiles:[],path:[],visitedNodes:[]}))},handleFindPath:t=>{e(o=>{const n=o.cells.flat().find(r=>r.state===a.Start),s=o.cells.flat().find(r=>r.state===a.End);if(n&&s){const r=o.cells.map(c=>c.map(h=>({row:h.row,col:h.col,state:h.state}))),{path:l,visitedNodes:v}=Se(r,n,s,t);return(async(c,h)=>{for(let u of h)await new Promise(d=>setTimeout(d,100)),e(d=>{const m=d.cells.map(p=>p.map(f=>({...f,state:u.row===f.row&&u.col===f.col&&f.state===a.Empty?a.Visited:f.state})));return{...d,cells:m,visitedNodes:[...d.visitedNodes,u]}});for(let u of c)await new Promise(d=>setTimeout(d,250)),e(d=>{const m=d.cells.map(p=>p.map(f=>({...f,state:u.row===f.row&&u.col===f.col?a.Path:f.state})));return{...d,cells:m,path:[...d.path,u]}})})(l,v),{...o,path:[],visitedNodes:[]}}return o})},setPath:t=>{e(o=>{const n=o.cells.map(s=>s.map(r=>({...r,state:t.some(l=>l.row===r.row&&l.col===r.col)?a.Path:r.state})));return{...o,cells:n}})},setVisitedNodes:t=>{e(o=>{const n=o.cells.map(s=>s.map(r=>({...r,state:t.some(l=>l.row===r.row&&l.col===r.col)&&r.state===a.Empty?a.Visited:r.state})));return{...o,cells:n}})}}),ye=e=>({activeButton:a.Start,setSelectedButtonState:t=>e({activeButton:t}),canTravelDiagonally:!0,setCanTravelDiagonally:t=>e({canTravelDiagonally:t})}),_e=e=>({visualTheme:D.Medieval,showCosts:!1,setVisualTheme:t=>e({visualTheme:t}),setShowCosts:t=>e({showCosts:t})}),F=pe((e,t,o)=>({...Ee(e),...ye(e),..._e(e)})),Oe={id:D.Classic,name:"Classic",startIcon:"●",endIcon:"●",terrains:{[a.Obstacle]:{name:"Wall",icon:"■",passable:!1}},presets:[{id:"random",name:"Random",icon:"🎲"},{id:"maze",name:"Maze",icon:"🔲"}]},Ne={id:D.Medieval,name:"Medieval",startIcon:"⚔️",endIcon:"🏰",terrains:{[a.Obstacle]:{name:"Wall",icon:"🧱",passable:!1},[a.Water]:{name:"Water",icon:"🌊",passable:!1},[a.Forest]:{name:"Forest",icon:"🌲",passable:!0},[a.Mountain]:{name:"Mountain",icon:"⛰️",passable:!1}},presets:[{id:"river",name:"River Crossing",icon:"🌊"},{id:"mountains",name:"Mountain Range",icon:"⛰️"},{id:"maze",name:"Castle Maze",icon:"🏰"},{id:"random",name:"Random Forest",icon:"🎲"}]},X={[D.Classic]:Oe,[D.Medieval]:Ne},G=e=>X[e],Me=e=>{const t=G(e);return Object.entries(t.terrains).map(([o,n])=>({state:Number(o),config:n}))},xe="",Te=()=>{var E;const{cells:e,activeButton:t,setCellState:o,setSelectedButtonState:n,visitedNodes:s,path:r,visualTheme:l,showCosts:v}=F(),w=G(l),[c,h]=L.useState({width:0,height:0}),u=L.useRef(null);L.useEffect(()=>{const S=()=>{if(u.current){const _=u.current.getBoundingClientRect();h({width:_.width,height:_.height})}};return S(),window.addEventListener("resize",S),()=>window.removeEventListener("resize",S)},[]);const d=(S,_)=>{switch(o(S,_,t),t){case a.Start:n(a.End);break;case a.End:n(a.Obstacle);break}},m=(S,_)=>{const b=s.find(N=>N.row===S&&N.col===_);return b?{g:b.g,h:b.h,f:b.f}:{g:null,h:null,f:null}},f=(()=>{var O;if(!c.width||!c.height)return 20;const S=((O=e[0])==null?void 0:O.length)||1,_=e.length||1,b=20,N=S+_,z=c.width-b-N,y=c.height-b-N,M=z/S,A=y/_,g=Math.min(M,A);return Math.max(15,Math.min(g,60))})();return i.jsx("div",{className:"grid-wrapper",ref:u,children:i.jsx("div",{className:"grid-container",style:{display:"grid",gridTemplateColumns:`repeat(${((E=e[0])==null?void 0:E.length)||1}, ${f}px)`,gridTemplateRows:`repeat(${e.length||1}, ${f}px)`,gap:"1px",padding:"8px",background:"var(--bg-secondary)",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.1)",border:"1px solid var(--border-color)"},children:e.map((S,_)=>S.map((b,N)=>{var V,$,ee,te;const z=r.some(T=>T.row===b.row&&T.col===b.col),y=s.some(T=>T.row===b.row&&T.col===b.col),{g:M,h:A,f:g}=m(b.row,b.col);let O=Ce(b,y);if(z){const T=r.findIndex(oe=>oe.row===b.row&&oe.col===b.col);T===0?O="var(--cell-start)":T===r.length-1?O="var(--cell-end)":O="var(--cell-path)"}return i.jsxs("div",{className:"grid-cell",onClick:()=>d(_,N),style:{width:f,height:f,backgroundColor:O,border:"1px solid var(--cell-border)",cursor:"pointer",transition:"all 0.15s ease",position:"relative",display:"flex",justifyContent:"center",alignItems:"center",borderRadius:"2px"},onMouseEnter:T=>{b.state===a.Empty&&(T.currentTarget.style.backgroundColor="var(--bg-tertiary)",T.currentTarget.style.transform="scale(1.02)")},onMouseLeave:T=>{b.state===a.Empty&&(T.currentTarget.style.backgroundColor=O,T.currentTarget.style.transform="scale(1)")},children:[y&&v&&i.jsxs("div",{className:"cell-values",children:[i.jsxs("div",{className:"value-h",children:["h",A]}),i.jsxs("div",{className:"value-f",children:["f",g]}),i.jsxs("div",{className:"value-g",children:["g",M]})]}),b.state===a.Start&&i.jsx("div",{className:"cell-indicator start",style:{fontSize:f*.7},children:w.startIcon}),b.state===a.End&&i.jsx("div",{className:"cell-indicator end",style:{fontSize:f*.7},children:w.endIcon}),b.state===a.Obstacle&&i.jsx("div",{className:"cell-indicator obstacle",style:{fontSize:f*.7},children:((V=w.terrains[a.Obstacle])==null?void 0:V.icon)||"■"}),b.state===a.Water&&i.jsx("div",{className:"cell-indicator water",style:{fontSize:f*.7},children:(($=w.terrains[a.Water])==null?void 0:$.icon)||"🌊"}),b.state===a.Forest&&i.jsx("div",{className:"cell-indicator forest",style:{fontSize:f*.7},children:((ee=w.terrains[a.Forest])==null?void 0:ee.icon)||"🌲"}),b.state===a.Mountain&&i.jsx("div",{className:"cell-indicator mountain",style:{fontSize:f*.7},children:((te=w.terrains[a.Mountain])==null?void 0:te.icon)||"⛰️"})]},`${_}-${N}`)}))})})},Ce=(e,t)=>{if(t)return e.state===a.Start?"var(--cell-start)":e.state===a.End?"var(--cell-end)":"var(--cell-visited)";switch(e.state){case a.Start:return"var(--cell-start)";case a.End:return"var(--cell-end)";case a.Obstacle:return"var(--cell-obstacle)";case a.Water:return"var(--cell-water)";case a.Forest:return"var(--cell-forest)";case a.Mountain:return"var(--cell-mountain)";case a.Empty:return"var(--cell-empty)";default:return"var(--cell-empty)"}},Le=(e,t)=>{const o=[],n=Math.floor(e/2),s=Math.max(2,Math.floor(t/6)),r=[];for(let l=0;l<s;l++){const v=Math.floor(t/(s+1)*(l+1));r.push(v)}for(let l=0;l<t;l++)r.includes(l)||(o.push({row:n,col:l,state:a.Water}),n+1<e&&o.push({row:n+1,col:l,state:a.Water}));for(let l=0;l<t;l+=3)n-1>=0&&Math.random()>.5&&o.push({row:n-1,col:l,state:a.Forest}),n+2<e&&Math.random()>.5&&o.push({row:n+2,col:l,state:a.Forest});return o},ze=(e,t)=>{const o=[],n=Math.floor(e*.2),s=Math.floor(t*.1),r=Math.floor(e*.8),l=Math.floor(t*.9),v=Math.max(2,Math.floor(Math.min(e,t)/5)),w=[];for(let c=0;c<v;c++)w.push(Math.floor((l-s)/(v+1)*(c+1))+s);for(let c=s;c<=l;c++){const h=(c-s)/(l-s),u=Math.floor(n+(r-n)*h);w.some(d=>Math.abs(c-d)<=1)||(u>=0&&u<e&&o.push({row:u,col:c,state:a.Mountain}),u+1<e&&Math.random()>.3&&o.push({row:u+1,col:c,state:a.Mountain}),u-1>=0&&Math.random()>.3&&o.push({row:u-1,col:c,state:a.Mountain}))}for(const c of[...o])if(c.state===a.Mountain){const h=[{row:c.row-2,col:c.col},{row:c.row+2,col:c.col},{row:c.row,col:c.col-2},{row:c.row,col:c.col+2}];for(const u of h)u.row>=0&&u.row<e&&u.col>=0&&u.col<t&&Math.random()>.7&&(o.some(d=>d.row===u.row&&d.col===u.col)||o.push({row:u.row,col:u.col,state:a.Forest}))}return o},Ae=(e,t)=>{const o=[];for(let s=0;s<e;s++)for(let r=0;r<t;r++){const l=s%3===1,v=r%3===1;(l||v)&&Math.random()>.35&&o.push({row:s,col:r,state:a.Obstacle})}const n=2;return o.filter(s=>{const r=s.row<n&&s.col<n,l=s.row>=e-n&&s.col>=t-n;return!r&&!l})},De=(e,t,o=.25)=>{const n=[];for(let s=0;s<e;s++)for(let r=0;r<t;r++)if(!(s<2&&r<2||s>=e-2&&r>=t-2)&&Math.random()<o){const v=Math.random();let w;v<.4?w=a.Forest:v<.6?w=a.Obstacle:v<.8?w=a.Water:w=a.Mountain,n.push({row:s,col:r,state:w})}return n},Ve=(e,t,o=.2)=>{const n=[];for(let s=0;s<e;s++)for(let r=0;r<t;r++)!(s<2&&r<2||s>=e-2&&r>=t-2)&&Math.random()<o&&n.push({row:s,col:r,state:a.Obstacle});return n},ke=(e,t)=>{const o=[];for(let s=0;s<e;s++)for(let r=0;r<t;r++){const l=s%3===1,v=r%3===1;(l||v)&&Math.random()>.35&&o.push({row:s,col:r,state:a.Obstacle})}const n=2;return o.filter(s=>{const r=s.row<n&&s.col<n,l=s.row>=e-n&&s.col>=t-n;return!r&&!l})},Fe="",Pe=({isDarkMode:e,setIsDarkMode:t})=>{const{activeButton:o,setSelectedButtonState:n,resetCells:s,rows:r,columns:l,setNumberOfRows:v,setNumberOfColumns:w,handleFindPath:c,canTravelDiagonally:h,setCanTravelDiagonally:u,visualTheme:d,setVisualTheme:m,showCosts:p,setShowCosts:f,setCellState:E}=F(),S=G(d),_=Me(d),b=()=>{t(!e)},N=[{label:"Start",state:a.Start},{label:"End",state:a.End},{label:"Obstacle",state:a.Obstacle},{label:"Clear",state:a.Empty},{label:"Reset",state:null}],z=g=>{g===null?y():n(g)},y=()=>{s(),n(a.Start)},M=()=>{c(h)},A=g=>{s();let O;if(d===D.Medieval)switch(g){case"river":O=Le(r,l);break;case"mountains":O=ze(r,l);break;case"maze":O=Ae(r,l);break;case"random":O=De(r,l);break;default:return}else switch(g){case"random":O=Ve(r,l);break;case"maze":O=ke(r,l);break;default:return}for(const V of O)E(V.row,V.col,V.state);E(0,0,a.Start),E(r-1,l-1,a.End),n(a.Obstacle)};return i.jsx("div",{className:"control-panel",children:i.jsxs("div",{className:"control-grid",children:[i.jsxs("div",{className:"control-group theme-section",children:[i.jsx("h3",{className:"group-title",children:"Theme"}),i.jsxs("div",{className:"button-group",children:[i.jsx("select",{className:"theme-select",value:d,onChange:g=>m(g.target.value),children:Object.values(X).map(g=>i.jsx("option",{value:g.id,children:g.name},g.id))}),i.jsx("button",{className:`control-button theme-toggle ${e?"active":""}`,onClick:b,title:e?"Switch to light mode":"Switch to dark mode",children:e?"☀️ Light":"🌙 Dark"}),i.jsx("button",{className:`control-button show-costs ${p?"active":""}`,onClick:()=>f(!p),title:p?"Hide costs":"Show costs",children:p?"📊 Costs On":"📊 Costs Off"})]})]}),i.jsxs("div",{className:"control-group tools",children:[i.jsx("h3",{className:"group-title",children:"Tools"}),i.jsx("div",{className:"button-group",children:N.map((g,O)=>i.jsx("button",{className:`control-button ${g.label.toLowerCase()} ${o===g.state?"active":""}`,onClick:()=>z(g.state),children:g.label},O))})]}),d===D.Medieval&&i.jsxs("div",{className:"control-group terrain",children:[i.jsx("h3",{className:"group-title",children:"Terrain"}),i.jsx("div",{className:"button-group",children:_.filter(({state:g})=>g!==a.Obstacle).map(({state:g,config:O})=>i.jsxs("button",{className:`control-button terrain-btn ${O.name.toLowerCase()} ${o===g?"active":""}`,onClick:()=>n(g),title:O.passable?"Passable terrain":"Impassable terrain",children:[O.icon," ",O.name]},g))})]}),i.jsxs("div",{className:"control-group presets",children:[i.jsx("h3",{className:"group-title",children:"Generate Map"}),i.jsx("div",{className:"button-group",children:S.presets.map(g=>i.jsxs("button",{className:"control-button preset-btn",onClick:()=>A(g.id),children:[g.icon," ",g.name]},g.id))})]}),i.jsxs("div",{className:"control-group actions",children:[i.jsx("h3",{className:"group-title",children:"Actions"}),i.jsxs("div",{className:"button-group",children:[i.jsx("button",{className:"control-button find-path",onClick:M,children:"Find Path"}),i.jsx("button",{className:`control-button diagonal ${h?"active":""}`,onClick:()=>u(!h),children:h?"Diagonal On":"Diagonal Off"})]})]}),i.jsxs("div",{className:"control-group size",children:[i.jsx("h3",{className:"group-title",children:"Grid Size"}),i.jsxs("div",{className:"size-controls",children:[i.jsxs("div",{className:"size-control",children:[i.jsx("label",{className:"size-label",children:"Rows"}),i.jsxs("div",{className:"size-buttons",children:[i.jsx("button",{className:"size-button",onClick:()=>v(Math.max(5,r-1)),disabled:r<=5,children:"−"}),i.jsx("span",{className:"size-value",children:r}),i.jsx("button",{className:"size-button",onClick:()=>v(Math.min(50,r+1)),disabled:r>=50,children:"+"})]})]}),i.jsxs("div",{className:"size-control",children:[i.jsx("label",{className:"size-label",children:"Columns"}),i.jsxs("div",{className:"size-buttons",children:[i.jsx("button",{className:"size-button",onClick:()=>w(Math.max(5,l-1)),disabled:l<=5,children:"−"}),i.jsx("span",{className:"size-value",children:l}),i.jsx("button",{className:"size-button",onClick:()=>w(Math.min(50,l+1)),disabled:l>=50,children:"+"})]})]})]})]})]})})},Z=({defaultDarkMode:e})=>{const t=L.useRef(null),{visualTheme:o}=F(),[n,s]=L.useState(()=>{if(e!==void 0)return e;const r=localStorage.getItem("astar-darkMode");return r?JSON.parse(r):!1});return L.useEffect(()=>{e===void 0&&localStorage.setItem("astar-darkMode",JSON.stringify(n)),t.current&&(t.current.setAttribute("data-theme",n?"dark":"light"),t.current.setAttribute("data-visual-theme",o))},[n,e,o]),i.jsx("div",{ref:t,className:"astar-visualizer-root","data-theme":n?"dark":"light","data-visual-theme":o,children:i.jsxs("div",{className:"app-container",children:[i.jsx("header",{className:"app-header",children:i.jsx("h1",{className:"app-title",children:"A* Pathfinding"})}),i.jsx("main",{className:"app-main",children:i.jsx(Te,{})}),i.jsx("footer",{className:"app-footer",children:i.jsx(Pe,{isDarkMode:n,setIsDarkMode:s})})]})})};function We({defaultDarkMode:e}){return i.jsx(Z,{defaultDarkMode:e})}C.AStarVisualizer=We,C.CellState=a,C.Layout=Z,C.VisualTheme=D,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})});
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- :root{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;line-height:1.5;font-weight:400;--bg-primary: #fafafa;--bg-secondary: #ffffff;--bg-tertiary: #f5f5f5;--text-primary: #1a1a1a;--text-secondary: #666666;--text-muted: #999999;--border-color: #e0e0e0;--border-hover: #d0d0d0;--cell-empty: #ffffff;--cell-start: #4caf50;--cell-end: #f44336;--cell-obstacle: #424242;--cell-visited: #2196f3;--cell-path: #ff9800;--cell-border: #e0e0e0;--cell-water: #4A90D9;--cell-forest: #228B22;--cell-mountain: #8B7355;--primary: #2196f3;--primary-hover: #1976d2;--success: #4caf50;--success-hover: #388e3c;--danger: #f44336;--danger-hover: #d32f2f;--warning: #ff9800;--warning-hover: #f57c00;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%}.astar-visualizer-root[data-theme=dark]{--bg-primary: #0f0f0f;--bg-secondary: #1a1a1a;--bg-tertiary: #2a2a2a;--text-primary: #ffffff;--text-secondary: #b3b3b3;--text-muted: #808080;--border-color: #404040;--border-hover: #505050;--cell-empty: #2a2a2a;--cell-start: #4caf50;--cell-end: #f44336;--cell-obstacle: #1a1a1a;--cell-visited: #2196f3;--cell-path: #ff9800;--cell-border: #404040;--cell-water: #1E5A8F;--cell-forest: #1B5E20;--cell-mountain: #5D4E37;--primary: #2196f3;--primary-hover: #1976d2;--success: #4caf50;--success-hover: #388e3c;--danger: #f44336;--danger-hover: #d32f2f;--warning: #ff9800;--warning-hover: #f57c00}.astar-visualizer-root[data-visual-theme=medieval]{--cell-empty: #90EE90;--cell-start: #4caf50;--cell-end: #8B0000;--cell-obstacle: #696969;--cell-visited: #87CEEB;--cell-path: #FFD700;--cell-border: #556B2F;--cell-water: #4A90D9;--cell-forest: #228B22;--cell-mountain: #8B7355}.astar-visualizer-root[data-visual-theme=medieval][data-theme=dark]{--cell-empty: #2D5A2D;--cell-start: #2E7D32;--cell-end: #5C0000;--cell-obstacle: #3D3D3D;--cell-visited: #4682B4;--cell-path: #B8860B;--cell-border: #3B4A29;--cell-water: #1E3A5F;--cell-forest: #1B4D1B;--cell-mountain: #4A3728}.astar-visualizer-root,.astar-visualizer-root *,.astar-visualizer-root *:before,.astar-visualizer-root *:after{transition:background-color .3s ease,color .3s ease,border-color .3s ease,box-shadow .3s ease}.astar-visualizer-root{width:100%;height:100%;display:flex;flex-direction:column;margin:0;padding:0;overflow:hidden;background:var(--bg-primary);color:var(--text-primary);position:relative}.astar-visualizer-root *{box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.astar-visualizer-root .app-container{display:flex;flex-direction:column;height:100%;width:100%}.astar-visualizer-root .app-header{padding:.5rem 1rem;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);text-align:center;flex-shrink:0}.astar-visualizer-root .app-title{font-size:1.25rem;font-weight:600;margin:0;color:var(--text-primary);letter-spacing:-.025em}.astar-visualizer-root .app-main{flex:1;display:flex;justify-content:center;align-items:center;padding:.5rem;overflow:hidden;min-height:0}.astar-visualizer-root .app-footer{padding:.5rem 1rem;background:var(--bg-secondary);border-top:1px solid var(--border-color);flex-shrink:0;overflow-y:auto;max-height:30%}.astar-visualizer-root button{border:1px solid var(--border-color);border-radius:6px;padding:.5rem 1rem;font-size:.875rem;font-weight:500;font-family:inherit;background:var(--bg-secondary);color:var(--text-primary);cursor:pointer;transition:all .2s ease;outline:none}.astar-visualizer-root button:hover{border-color:var(--border-hover);background:var(--bg-tertiary)}.astar-visualizer-root button:active{transform:translateY(1px)}.astar-visualizer-root button:focus-visible{outline:2px solid var(--primary);outline-offset:2px}@media (max-width: 768px){.astar-visualizer-root .app-header{padding:.75rem 1.5rem}.astar-visualizer-root .app-title{font-size:1.5rem}.astar-visualizer-root .app-main{padding:.25rem}.astar-visualizer-root .app-footer{padding:.75rem 1.5rem}}@media (max-width: 480px){.astar-visualizer-root .app-header{padding:.5rem 1rem}.astar-visualizer-root .app-title{font-size:1.25rem}.astar-visualizer-root .app-main{padding:.125rem}.astar-visualizer-root .app-footer{padding:.5rem 1rem}}@media (max-height: 600px){.astar-visualizer-root .app-header{padding:.5rem 1rem}.astar-visualizer-root .app-title{font-size:1.25rem}.astar-visualizer-root .app-footer{padding:.5rem 1rem}}@media (max-height: 400px){.astar-visualizer-root .app-header{padding:.25rem .5rem}.astar-visualizer-root .app-title{font-size:1rem}.astar-visualizer-root .app-footer{padding:.25rem .5rem}}.astar-visualizer-root #root{width:100%;height:100%;margin:0;padding:0;overflow:hidden;display:flex;flex-direction:column}.astar-visualizer-root .loading{display:flex;justify-content:center;align-items:center;height:100%;font-size:1.5rem;color:var(--text-secondary)}.astar-visualizer-root .error{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;padding:2rem;text-align:center}.astar-visualizer-root .error h2{color:var(--danger);margin-bottom:1rem}.astar-visualizer-root .error p{color:var(--text-secondary);max-width:500px}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}*{transition:none!important}}@media (prefers-contrast: high){:root{--cell-border: #000000;--text-primary: #000000;--text-secondary: #000000;--bg-primary: #ffffff;--bg-secondary: #ffffff}[data-theme=dark]{--cell-border: #ffffff;--text-primary: #ffffff;--text-secondary: #ffffff;--bg-primary: #000000;--bg-secondary: #000000}}@media print{.astar-visualizer-root .app-footer{display:none}.astar-visualizer-root .app-header{background:white!important;color:#000!important}.astar-visualizer-root .grid-container{box-shadow:none!important;border:2px solid black!important}}.astar-visualizer-root .grid-wrapper{display:flex;justify-content:center;align-items:center;width:100%;height:100%;padding:.5rem;box-sizing:border-box;overflow:hidden}.astar-visualizer-root .grid-container{display:grid;gap:1px;padding:4px;background:var(--bg-secondary);border-radius:4px;box-shadow:0 2px 8px #0000001a;border:1px solid var(--border-color);width:fit-content;height:fit-content}.astar-visualizer-root .grid-cell{position:relative;display:flex;justify-content:center;align-items:center;border:1px solid var(--cell-border);cursor:pointer;transition:all .15s ease;border-radius:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.astar-visualizer-root .grid-cell:hover{transform:scale(1.02)}.astar-visualizer-root .grid-cell:active{transform:scale(.98)}.astar-visualizer-root .cell-values{position:absolute;top:0;left:0;right:0;bottom:0;display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-rows:1fr 1fr;font-size:.75rem;font-weight:700;color:#fff;text-shadow:0 2px 4px rgba(0,0,0,.9);pointer-events:none}.astar-visualizer-root .value-h{grid-column:1;grid-row:1;display:flex;align-items:center;justify-content:center;font-size:.65rem}.astar-visualizer-root .value-f{grid-column:3;grid-row:1;display:flex;align-items:center;justify-content:center;font-size:.65rem}.astar-visualizer-root .value-g{grid-column:2;grid-row:2;display:flex;align-items:center;justify-content:center;font-size:.65rem}.astar-visualizer-root .cell-indicator{font-size:1.2rem;font-weight:700;color:#fff;text-shadow:0 2px 4px rgba(0,0,0,.9)}.astar-visualizer-root .cell-indicator.start,.astar-visualizer-root .cell-indicator.end,.astar-visualizer-root .cell-indicator.obstacle{color:#fff}@media (max-width: 768px){.astar-visualizer-root .cell-values{font-size:.6rem}.astar-visualizer-root .value-h,.astar-visualizer-root .value-f,.astar-visualizer-root .value-g{font-size:.5rem}.astar-visualizer-root .cell-indicator{font-size:1rem}}@media (max-width: 480px){.astar-visualizer-root .cell-values{font-size:.5rem}.astar-visualizer-root .value-h,.astar-visualizer-root .value-f,.astar-visualizer-root .value-g{font-size:.4rem}.astar-visualizer-root .cell-indicator{font-size:.9rem}}.astar-visualizer-root .control-panel{padding:1rem;background:var(--bg-secondary);border-radius:8px;border:1px solid var(--border-color);box-shadow:0 2px 8px #0000001a}.astar-visualizer-root .control-grid{display:grid;grid-template-columns:1fr;gap:1.5rem;align-items:start}.astar-visualizer-root .control-group{display:flex;flex-direction:column;gap:.75rem}.astar-visualizer-root .group-title{font-size:.875rem;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em;margin:0;padding-bottom:.5rem;border-bottom:1px solid var(--border-color)}.astar-visualizer-root .button-group{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;justify-content:center}.astar-visualizer-root .control-button{padding:.5rem 1rem;font-size:.875rem;font-weight:500;color:var(--text-primary);background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px;cursor:pointer;transition:all .2s ease;outline:none;min-width:fit-content}.astar-visualizer-root .control-button:hover{border-color:var(--border-hover);background:var(--bg-tertiary)}.astar-visualizer-root .control-button:active{transform:translateY(1px)}.astar-visualizer-root .control-button:focus-visible{outline:2px solid var(--primary);outline-offset:2px}.astar-visualizer-root .control-button.start.active{background:var(--success);border-color:var(--success);color:#fff}.astar-visualizer-root .control-button.end.active{background:var(--danger);border-color:var(--danger);color:#fff}.astar-visualizer-root .control-button.obstacle.active{background:var(--text-primary);border-color:var(--text-primary);color:#fff}.astar-visualizer-root .control-button.clear.active{background:var(--text-muted);border-color:var(--text-muted);color:#fff}.astar-visualizer-root .control-button.reset{background:var(--danger);border-color:var(--danger);color:#fff}.astar-visualizer-root .control-button.reset:hover{background:var(--danger-hover);border-color:var(--danger-hover)}.astar-visualizer-root .control-button.find-path{background:var(--primary);border-color:var(--primary);color:#fff}.astar-visualizer-root .control-button.find-path:hover{background:var(--primary-hover);border-color:var(--primary-hover)}.astar-visualizer-root .control-button.diagonal.active{background:var(--warning);border-color:var(--warning);color:#fff}.astar-visualizer-root .control-button.diagonal:hover{background:var(--warning-hover);border-color:var(--warning-hover)}.astar-visualizer-root .control-button.theme-toggle{background:var(--text-muted);border-color:var(--text-muted);color:#fff}.astar-visualizer-root .control-button.theme-toggle:hover{background:var(--text-secondary);border-color:var(--text-secondary)}.astar-visualizer-root .control-button.theme-toggle.active{background:var(--warning);border-color:var(--warning);color:#fff}.astar-visualizer-root .control-button.theme-toggle.active:hover{background:var(--warning-hover);border-color:var(--warning-hover)}.astar-visualizer-root .theme-select{padding:.5rem 1rem;font-size:.875rem;font-weight:500;font-family:inherit;color:var(--text-primary);background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px;cursor:pointer;transition:all .2s ease;outline:none;min-width:120px}.astar-visualizer-root .theme-select:hover{border-color:var(--border-hover);background:var(--bg-tertiary)}.astar-visualizer-root .theme-select:focus{outline:2px solid var(--primary);outline-offset:2px}.astar-visualizer-root .control-button.show-costs{background:var(--text-muted);border-color:var(--text-muted);color:#fff}.astar-visualizer-root .control-button.show-costs:hover{background:var(--text-secondary);border-color:var(--text-secondary)}.astar-visualizer-root .control-button.show-costs.active{background:var(--primary);border-color:var(--primary);color:#fff}.astar-visualizer-root .control-button.terrain-btn{background:var(--bg-secondary);border-color:var(--border-color)}.astar-visualizer-root .control-button.terrain-btn:hover{background:var(--bg-tertiary);border-color:var(--border-hover)}.astar-visualizer-root .control-button.terrain-btn.water.active{background:#4A90D9;border-color:#4a90d9;color:#fff}.astar-visualizer-root .control-button.terrain-btn.forest.active{background:#228B22;border-color:#228b22;color:#fff}.astar-visualizer-root .control-button.terrain-btn.mountain.active{background:#8B7355;border-color:#8b7355;color:#fff}.astar-visualizer-root .control-button.preset-btn{background:var(--bg-tertiary);border-color:var(--border-color)}.astar-visualizer-root .control-button.preset-btn:hover{background:var(--primary);border-color:var(--primary);color:#fff}.astar-visualizer-root .size-controls{display:flex;flex-direction:column;gap:.75rem;align-items:center}.astar-visualizer-root .size-control{display:flex;flex-direction:column;gap:.25rem;align-items:center}.astar-visualizer-root .size-label{font-size:.75rem;font-weight:500;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em}.astar-visualizer-root .size-buttons{display:flex;align-items:center;gap:.5rem}.astar-visualizer-root .size-button{display:flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;font-size:1rem;font-weight:600;color:var(--text-primary);background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:4px;cursor:pointer;transition:all .2s ease;outline:none}.astar-visualizer-root .size-button:hover:not(:disabled){background:var(--primary);border-color:var(--primary);color:#fff}.astar-visualizer-root .size-button:active:not(:disabled){transform:scale(.95)}.astar-visualizer-root .size-button:disabled{opacity:.4;cursor:not-allowed}.astar-visualizer-root .size-button:focus-visible{outline:2px solid var(--primary);outline-offset:2px}.astar-visualizer-root .size-value{display:flex;align-items:center;justify-content:center;min-width:2.5rem;height:1.75rem;font-size:.875rem;font-weight:600;color:var(--text-primary);background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px}@media (min-width: 1024px){.astar-visualizer-root .control-grid{grid-template-columns:2fr 1fr 1fr;gap:2rem}.astar-visualizer-root .control-group.tools{grid-column:1}.astar-visualizer-root .control-group.actions{grid-column:2}.astar-visualizer-root .control-group.size{grid-column:3}}@media (min-width: 768px) and (max-width: 1023px){.astar-visualizer-root .control-grid{grid-template-columns:1fr 1fr;gap:1.5rem}.astar-visualizer-root .control-group.tools{grid-column:1 / -1}.astar-visualizer-root .control-group.actions{grid-column:1}.astar-visualizer-root .control-group.size{grid-column:2}}@media (max-width: 768px){.astar-visualizer-root .control-panel{padding:.75rem}.astar-visualizer-root .control-grid{gap:1rem}.astar-visualizer-root .button-group{gap:.375rem}.astar-visualizer-root .control-button{padding:.375rem .75rem;font-size:.8125rem}.astar-visualizer-root .size-controls{gap:.5rem}.astar-visualizer-root .size-buttons{gap:.375rem}.astar-visualizer-root .size-button{width:1.5rem;height:1.5rem;font-size:.875rem}.astar-visualizer-root .size-value{min-width:2rem;height:1.5rem;font-size:.8125rem}}@media (max-width: 480px){.astar-visualizer-root .control-panel{padding:.5rem}.astar-visualizer-root .control-grid{gap:.75rem}.astar-visualizer-root .button-group{flex-direction:column;gap:.25rem}.astar-visualizer-root .control-button{width:100%;padding:.5rem;font-size:.75rem}.astar-visualizer-root .size-controls{gap:.375rem}.astar-visualizer-root .size-buttons{gap:.25rem}.astar-visualizer-root .size-button{width:1.25rem;height:1.25rem;font-size:.75rem}.astar-visualizer-root .size-value{min-width:1.75rem;height:1.25rem;font-size:.75rem}}
1
+ :root{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;line-height:1.5;font-weight:400;--bg-primary: #fafafa;--bg-secondary: #ffffff;--bg-tertiary: #f5f5f5;--text-primary: #1a1a1a;--text-secondary: #666666;--text-muted: #999999;--border-color: #e0e0e0;--border-hover: #d0d0d0;--cell-empty: #ffffff;--cell-start: #4caf50;--cell-end: #f44336;--cell-obstacle: #424242;--cell-visited: #2196f3;--cell-path: #ff9800;--cell-border: #e0e0e0;--cell-water: #4A90D9;--cell-forest: #228B22;--cell-mountain: #8B7355;--primary: #2196f3;--primary-hover: #1976d2;--success: #4caf50;--success-hover: #388e3c;--danger: #f44336;--danger-hover: #d32f2f;--warning: #ff9800;--warning-hover: #f57c00;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%}.astar-visualizer-root[data-theme=dark]{--bg-primary: #0f0f0f;--bg-secondary: #1a1a1a;--bg-tertiary: #2a2a2a;--text-primary: #ffffff;--text-secondary: #b3b3b3;--text-muted: #808080;--border-color: #404040;--border-hover: #505050;--cell-empty: #2a2a2a;--cell-start: #4caf50;--cell-end: #f44336;--cell-obstacle: #1a1a1a;--cell-visited: #2196f3;--cell-path: #ff9800;--cell-border: #404040;--cell-water: #1E5A8F;--cell-forest: #1B5E20;--cell-mountain: #5D4E37;--primary: #2196f3;--primary-hover: #1976d2;--success: #4caf50;--success-hover: #388e3c;--danger: #f44336;--danger-hover: #d32f2f;--warning: #ff9800;--warning-hover: #f57c00}.astar-visualizer-root[data-visual-theme=medieval]{--cell-empty: #90EE90;--cell-start: #4caf50;--cell-end: #8B0000;--cell-obstacle: #696969;--cell-visited: #87CEEB;--cell-path: #FFD700;--cell-border: #556B2F;--cell-water: #4A90D9;--cell-forest: #228B22;--cell-mountain: #8B7355}.astar-visualizer-root[data-visual-theme=medieval][data-theme=dark]{--cell-empty: #2D5A2D;--cell-start: #2E7D32;--cell-end: #5C0000;--cell-obstacle: #3D3D3D;--cell-visited: #4682B4;--cell-path: #B8860B;--cell-border: #3B4A29;--cell-water: #1E3A5F;--cell-forest: #1B4D1B;--cell-mountain: #4A3728}.astar-visualizer-root,.astar-visualizer-root *,.astar-visualizer-root *:before,.astar-visualizer-root *:after{transition:background-color .3s ease,color .3s ease,border-color .3s ease,box-shadow .3s ease}.astar-visualizer-root{width:100%;height:100%;display:flex;flex-direction:column;margin:0;padding:0;overflow:hidden;background:var(--bg-primary);color:var(--text-primary);position:relative}.astar-visualizer-root *{box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.astar-visualizer-root .app-container{display:flex;flex-direction:column;height:100%;width:100%}.astar-visualizer-root .app-header{padding:.5rem 1rem;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);text-align:center;flex-shrink:0}.astar-visualizer-root .app-title{font-size:1.25rem;font-weight:600;margin:0;color:var(--text-primary);letter-spacing:-.025em}.astar-visualizer-root .app-main{flex:1;display:flex;justify-content:center;align-items:center;padding:.5rem;overflow:hidden;min-height:0}.astar-visualizer-root .app-footer{padding:.5rem 1rem;background:var(--bg-secondary);border-top:1px solid var(--border-color);flex-shrink:0;overflow-y:auto;max-height:30%}.astar-visualizer-root button{border:1px solid var(--border-color);border-radius:6px;padding:.5rem 1rem;font-size:.875rem;font-weight:500;font-family:inherit;background:var(--bg-secondary);color:var(--text-primary);cursor:pointer;transition:all .2s ease;outline:none}.astar-visualizer-root button:hover{border-color:var(--border-hover);background:var(--bg-tertiary)}.astar-visualizer-root button:active{transform:translateY(1px)}.astar-visualizer-root button:focus-visible{outline:2px solid var(--primary);outline-offset:2px}@media (max-width: 768px){.astar-visualizer-root .app-header{padding:.75rem 1.5rem}.astar-visualizer-root .app-title{font-size:1.5rem}.astar-visualizer-root .app-main{padding:.25rem}.astar-visualizer-root .app-footer{padding:.75rem 1.5rem}}@media (max-width: 480px){.astar-visualizer-root .app-header{padding:.5rem 1rem}.astar-visualizer-root .app-title{font-size:1.25rem}.astar-visualizer-root .app-main{padding:.125rem}.astar-visualizer-root .app-footer{padding:.5rem 1rem}}@media (max-height: 600px){.astar-visualizer-root .app-header{padding:.5rem 1rem}.astar-visualizer-root .app-title{font-size:1.25rem}.astar-visualizer-root .app-footer{padding:.5rem 1rem}}@media (max-height: 400px){.astar-visualizer-root .app-header{padding:.25rem .5rem}.astar-visualizer-root .app-title{font-size:1rem}.astar-visualizer-root .app-footer{padding:.25rem .5rem}}.astar-visualizer-root #root{width:100%;height:100%;margin:0;padding:0;overflow:hidden;display:flex;flex-direction:column}.astar-visualizer-root .loading{display:flex;justify-content:center;align-items:center;height:100%;font-size:1.5rem;color:var(--text-secondary)}.astar-visualizer-root .error{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;padding:2rem;text-align:center}.astar-visualizer-root .error h2{color:var(--danger);margin-bottom:1rem}.astar-visualizer-root .error p{color:var(--text-secondary);max-width:500px}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}*{transition:none!important}}@media (prefers-contrast: high){:root{--cell-border: #000000;--text-primary: #000000;--text-secondary: #000000;--bg-primary: #ffffff;--bg-secondary: #ffffff}[data-theme=dark]{--cell-border: #ffffff;--text-primary: #ffffff;--text-secondary: #ffffff;--bg-primary: #000000;--bg-secondary: #000000}}@media print{.astar-visualizer-root .app-footer{display:none}.astar-visualizer-root .app-header{background:white!important;color:#000!important}.astar-visualizer-root .grid-container{box-shadow:none!important;border:2px solid black!important}}.astar-visualizer-root .grid-wrapper{display:flex;justify-content:center;align-items:center;width:100%;height:100%;padding:.5rem;box-sizing:border-box;overflow:hidden}.astar-visualizer-root .grid-container{display:grid;gap:1px;padding:4px;background:var(--bg-secondary);border-radius:4px;box-shadow:0 2px 8px #0000001a;border:1px solid var(--border-color);width:fit-content;height:fit-content}.astar-visualizer-root .grid-cell{position:relative;display:flex;justify-content:center;align-items:center;border:1px solid var(--cell-border);cursor:pointer;transition:all .15s ease;border-radius:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.astar-visualizer-root .grid-cell:hover{transform:scale(1.02)}.astar-visualizer-root .grid-cell:active{transform:scale(.98)}.astar-visualizer-root .cell-values{position:absolute;top:0;left:0;right:0;bottom:0;display:grid;grid-template-columns:1fr 1fr 1fr;grid-template-rows:1fr 1fr;font-size:.75rem;font-weight:700;color:#fff;text-shadow:0 2px 4px rgba(0,0,0,.9);pointer-events:none}.astar-visualizer-root .value-h{grid-column:1;grid-row:1;display:flex;align-items:center;justify-content:center;font-size:.65rem}.astar-visualizer-root .value-f{grid-column:3;grid-row:1;display:flex;align-items:center;justify-content:center;font-size:.65rem}.astar-visualizer-root .value-g{grid-column:2;grid-row:2;display:flex;align-items:center;justify-content:center;font-size:.65rem}.astar-visualizer-root .cell-indicator{font-weight:700;color:#fff;text-shadow:0 2px 4px rgba(0,0,0,.9)}.astar-visualizer-root .cell-indicator.start,.astar-visualizer-root .cell-indicator.end,.astar-visualizer-root .cell-indicator.obstacle{color:#fff}@media (max-width: 768px){.astar-visualizer-root .cell-values{font-size:.6rem}.astar-visualizer-root .value-h,.astar-visualizer-root .value-f,.astar-visualizer-root .value-g{font-size:.5rem}}@media (max-width: 480px){.astar-visualizer-root .cell-values{font-size:.5rem}.astar-visualizer-root .value-h,.astar-visualizer-root .value-f,.astar-visualizer-root .value-g{font-size:.4rem}}.astar-visualizer-root .control-panel{padding:1rem;background:var(--bg-secondary);border-radius:8px;border:1px solid var(--border-color);box-shadow:0 2px 8px #0000001a}.astar-visualizer-root .control-grid{display:grid;grid-template-columns:1fr;gap:1.5rem;align-items:start}.astar-visualizer-root .control-group{display:flex;flex-direction:column;gap:.75rem}.astar-visualizer-root .group-title{font-size:.875rem;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em;margin:0;padding-bottom:.5rem;border-bottom:1px solid var(--border-color)}.astar-visualizer-root .button-group{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;justify-content:center}.astar-visualizer-root .control-button{padding:.5rem 1rem;font-size:.875rem;font-weight:500;color:var(--text-primary);background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px;cursor:pointer;transition:all .2s ease;outline:none;min-width:fit-content}.astar-visualizer-root .control-button:hover{border-color:var(--border-hover);background:var(--bg-tertiary)}.astar-visualizer-root .control-button:active{transform:translateY(1px)}.astar-visualizer-root .control-button:focus-visible{outline:2px solid var(--primary);outline-offset:2px}.astar-visualizer-root .control-button.start.active{background:var(--success);border-color:var(--success);color:#fff}.astar-visualizer-root .control-button.end.active{background:var(--danger);border-color:var(--danger);color:#fff}.astar-visualizer-root .control-button.obstacle.active{background:var(--text-primary);border-color:var(--text-primary);color:#fff}.astar-visualizer-root .control-button.clear.active{background:var(--text-muted);border-color:var(--text-muted);color:#fff}.astar-visualizer-root .control-button.reset{background:var(--danger);border-color:var(--danger);color:#fff}.astar-visualizer-root .control-button.reset:hover{background:var(--danger-hover);border-color:var(--danger-hover)}.astar-visualizer-root .control-button.find-path{background:var(--primary);border-color:var(--primary);color:#fff}.astar-visualizer-root .control-button.find-path:hover{background:var(--primary-hover);border-color:var(--primary-hover)}.astar-visualizer-root .control-button.diagonal.active{background:var(--warning);border-color:var(--warning);color:#fff}.astar-visualizer-root .control-button.diagonal:hover{background:var(--warning-hover);border-color:var(--warning-hover)}.astar-visualizer-root .control-button.theme-toggle{background:var(--text-muted);border-color:var(--text-muted);color:#fff}.astar-visualizer-root .control-button.theme-toggle:hover{background:var(--text-secondary);border-color:var(--text-secondary)}.astar-visualizer-root .control-button.theme-toggle.active{background:var(--warning);border-color:var(--warning);color:#fff}.astar-visualizer-root .control-button.theme-toggle.active:hover{background:var(--warning-hover);border-color:var(--warning-hover)}.astar-visualizer-root .theme-select{padding:.5rem 1rem;font-size:.875rem;font-weight:500;font-family:inherit;color:var(--text-primary);background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px;cursor:pointer;transition:all .2s ease;outline:none;min-width:120px}.astar-visualizer-root .theme-select:hover{border-color:var(--border-hover);background:var(--bg-tertiary)}.astar-visualizer-root .theme-select:focus{outline:2px solid var(--primary);outline-offset:2px}.astar-visualizer-root .control-button.show-costs{background:var(--text-muted);border-color:var(--text-muted);color:#fff}.astar-visualizer-root .control-button.show-costs:hover{background:var(--text-secondary);border-color:var(--text-secondary)}.astar-visualizer-root .control-button.show-costs.active{background:var(--primary);border-color:var(--primary);color:#fff}.astar-visualizer-root .control-button.terrain-btn{background:var(--bg-secondary);border-color:var(--border-color)}.astar-visualizer-root .control-button.terrain-btn:hover{background:var(--bg-tertiary);border-color:var(--border-hover)}.astar-visualizer-root .control-button.terrain-btn.water.active{background:#4A90D9;border-color:#4a90d9;color:#fff}.astar-visualizer-root .control-button.terrain-btn.forest.active{background:#228B22;border-color:#228b22;color:#fff}.astar-visualizer-root .control-button.terrain-btn.mountain.active{background:#8B7355;border-color:#8b7355;color:#fff}.astar-visualizer-root .control-button.preset-btn{background:var(--bg-tertiary);border-color:var(--border-color)}.astar-visualizer-root .control-button.preset-btn:hover{background:var(--primary);border-color:var(--primary);color:#fff}.astar-visualizer-root .size-controls{display:flex;flex-direction:column;gap:.75rem;align-items:center}.astar-visualizer-root .size-control{display:flex;flex-direction:column;gap:.25rem;align-items:center}.astar-visualizer-root .size-label{font-size:.75rem;font-weight:500;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em}.astar-visualizer-root .size-buttons{display:flex;align-items:center;gap:.5rem}.astar-visualizer-root .size-button{display:flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;font-size:1rem;font-weight:600;color:var(--text-primary);background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:4px;cursor:pointer;transition:all .2s ease;outline:none}.astar-visualizer-root .size-button:hover:not(:disabled){background:var(--primary);border-color:var(--primary);color:#fff}.astar-visualizer-root .size-button:active:not(:disabled){transform:scale(.95)}.astar-visualizer-root .size-button:disabled{opacity:.4;cursor:not-allowed}.astar-visualizer-root .size-button:focus-visible{outline:2px solid var(--primary);outline-offset:2px}.astar-visualizer-root .size-value{display:flex;align-items:center;justify-content:center;min-width:2.5rem;height:1.75rem;font-size:.875rem;font-weight:600;color:var(--text-primary);background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px}@media (min-width: 1024px){.astar-visualizer-root .control-grid{grid-template-columns:2fr 1fr 1fr;gap:2rem}.astar-visualizer-root .control-group.tools{grid-column:1}.astar-visualizer-root .control-group.actions{grid-column:2}.astar-visualizer-root .control-group.size{grid-column:3}}@media (min-width: 768px) and (max-width: 1023px){.astar-visualizer-root .control-grid{grid-template-columns:1fr 1fr;gap:1.5rem}.astar-visualizer-root .control-group.tools{grid-column:1 / -1}.astar-visualizer-root .control-group.actions{grid-column:1}.astar-visualizer-root .control-group.size{grid-column:2}}@media (max-width: 768px){.astar-visualizer-root .control-panel{padding:.75rem}.astar-visualizer-root .control-grid{gap:1rem}.astar-visualizer-root .button-group{gap:.375rem}.astar-visualizer-root .control-button{padding:.375rem .75rem;font-size:.8125rem}.astar-visualizer-root .size-controls{gap:.5rem}.astar-visualizer-root .size-buttons{gap:.375rem}.astar-visualizer-root .size-button{width:1.5rem;height:1.5rem;font-size:.875rem}.astar-visualizer-root .size-value{min-width:2rem;height:1.5rem;font-size:.8125rem}}@media (max-width: 480px){.astar-visualizer-root .control-panel{padding:.5rem}.astar-visualizer-root .control-grid{gap:.75rem}.astar-visualizer-root .button-group{flex-direction:column;gap:.25rem}.astar-visualizer-root .control-button{width:100%;padding:.5rem;font-size:.75rem}.astar-visualizer-root .size-controls{gap:.375rem}.astar-visualizer-root .size-buttons{gap:.25rem}.astar-visualizer-root .size-button{width:1.25rem;height:1.25rem;font-size:.75rem}.astar-visualizer-root .size-value{min-width:1.75rem;height:1.25rem;font-size:.75rem}}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "astar-visualizer",
3
3
  "private": false,
4
- "version": "1.0.8",
4
+ "version": "1.0.9",
5
5
  "type": "module",
6
6
  "description": "A React component for visualizing A* pathfinding algorithm",
7
7
  "main": "./dist/astar-visualizer.umd.cjs",