@yamat47/playmaker 0.1.1 → 0.2.0

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.
package/dist/playmaker.js CHANGED
@@ -1,8 +1,70 @@
1
+ // src/browser/i18n/ja.ts
2
+ var e = {
3
+ tool: {
4
+ select: "選択",
5
+ "add-player": "選手を追加",
6
+ "draw-line": "線を描く"
7
+ },
8
+ undo: "元に戻す",
9
+ redo: "やり直す",
10
+ delete: "削除",
11
+ finishLine: "線を確定",
12
+ cancel: "取消",
13
+ zone: {
14
+ "own-redzone": "自陣RZ",
15
+ middle: "中央",
16
+ redzone: "相手RZ"
17
+ },
18
+ formation: "フォーメーション",
19
+ loadFormation: "フォーメーション読込…",
20
+ side: {
21
+ offense: "オフェンス",
22
+ defense: "ディフェンス"
23
+ },
24
+ formationLimit: (e) => `置くと ${e} 人を超えるフォーメーションは読み込めません`,
25
+ playerLimit: (e) => `選手は ${e} 人までです`,
26
+ lineLimit: (e) => `線は ${e} 本までです`,
27
+ selectionHint: "対象を選択するとプロパティを編集できます",
28
+ player: "選手",
29
+ line: "線",
30
+ label: "ラベル",
31
+ shape: "形状",
32
+ color: "色",
33
+ kind: "種別",
34
+ interpolation: "補間",
35
+ width: "太さ",
36
+ shapes: {
37
+ circle: "丸",
38
+ square: "四角"
39
+ },
40
+ fills: {
41
+ outline: "枠線",
42
+ solid: "塗りつぶし"
43
+ },
44
+ kinds: {
45
+ route: "ルート",
46
+ block: "ブロック",
47
+ motion: "モーション"
48
+ },
49
+ interpolations: {
50
+ straight: "直線",
51
+ bezier: "曲線"
52
+ },
53
+ colors: {
54
+ swatch1: "黒",
55
+ swatch2: "赤",
56
+ swatch3: "青",
57
+ swatch4: "緑"
58
+ },
59
+ swatch: (e, t) => `${e}の${t}`,
60
+ reset: "既定",
61
+ resetField: (e) => `${e}を既定に戻す`
62
+ };
1
63
  // src/common/base/lifecycle.ts
2
- function e(e) {
64
+ function t(e) {
3
65
  return { dispose: e };
4
66
  }
5
- var t = class {
67
+ var n = class {
6
68
  items = /* @__PURE__ */ new Set();
7
69
  disposed = !1;
8
70
  get isDisposed() {
@@ -18,8 +80,8 @@ var t = class {
18
80
  this.items.clear();
19
81
  }
20
82
  }
21
- }, n = class {
22
- _store = new t();
83
+ }, r = class {
84
+ _store = new n();
23
85
  get isDisposed() {
24
86
  return this._store.isDisposed;
25
87
  }
@@ -29,30 +91,30 @@ var t = class {
29
91
  dispose() {
30
92
  this._store.dispose();
31
93
  }
32
- }, r = .5;
33
- function i(e) {
34
- return Math.round(e / r) * r + 0;
35
- }
94
+ }, i = .5;
36
95
  function a(e) {
96
+ return Math.round(e / i) * i + 0;
97
+ }
98
+ function o(e) {
37
99
  return {
38
- lateralYard: i(e.lateralYard),
39
- downfieldYard: i(e.downfieldYard)
100
+ lateralYard: a(e.lateralYard),
101
+ downfieldYard: a(e.downfieldYard)
40
102
  };
41
103
  }
42
104
  // src/common/model/guards.ts
43
- function o(e) {
105
+ function s(e) {
44
106
  return typeof e == "object" && !!e;
45
107
  }
46
- function s(e) {
108
+ function c(e) {
47
109
  return typeof e == "number" && Number.isFinite(e);
48
110
  }
49
- function c(e) {
111
+ function l(e) {
50
112
  return typeof e == "string" && e.trim() !== "";
51
113
  }
52
- function l(e, t) {
114
+ function u(e, t) {
53
115
  return t.some((t) => t === e);
54
116
  }
55
- function u(e, t, n) {
117
+ function d(e, t, n) {
56
118
  if (!Array.isArray(e)) return [];
57
119
  let r = [], i = Math.min(e.length, t);
58
120
  for (let t = 0; t < i; t += 1) {
@@ -62,37 +124,37 @@ function u(e, t, n) {
62
124
  return r;
63
125
  }
64
126
  // src/common/model/player.ts
65
- var d = ["circle", "square"], f = "circle", p = ["outline", "solid"], m = .93;
66
- function h(e) {
67
- return l(e, d);
68
- }
127
+ var f = ["circle", "square"], p = "circle", m = ["outline", "solid"], h = .93;
69
128
  function ee(e) {
70
- return l(e, p);
129
+ return u(e, f);
71
130
  }
72
131
  function te(e) {
73
- if (!o(e)) return null;
132
+ return u(e, m);
133
+ }
134
+ function ne(e) {
135
+ if (!s(e)) return null;
74
136
  let { lateralYard: t, downfieldYard: n } = e;
75
- return !s(t) || !s(n) ? null : a({
137
+ return !c(t) || !c(n) ? null : o({
76
138
  lateralYard: t,
77
139
  downfieldYard: n
78
140
  });
79
141
  }
80
- function ne(e, t) {
81
- if (!o(e)) return null;
82
- let n = te(e.position);
142
+ function re(e, t) {
143
+ if (!s(e)) return null;
144
+ let n = ne(e.position);
83
145
  return n === null ? null : {
84
- id: c(e.id) ? e.id : `p${t}`,
146
+ id: l(e.id) ? e.id : `p${t}`,
85
147
  position: n,
86
- shape: h(e.shape) ? e.shape : f,
148
+ shape: ee(e.shape) ? e.shape : p,
87
149
  label: typeof e.label == "string" ? e.label : "",
88
- ...c(e.color) ? { color: e.color } : {},
89
- ...ee(e.fill) ? { fill: e.fill } : {}
150
+ ...l(e.color) ? { color: e.color } : {},
151
+ ...te(e.fill) ? { fill: e.fill } : {}
90
152
  };
91
153
  }
92
- function re(e) {
93
- return u(e, 64, ne);
94
- }
95
154
  function ie(e) {
155
+ return d(e, 64, re);
156
+ }
157
+ function ae(e) {
96
158
  return {
97
159
  id: e.id,
98
160
  position: { ...e.position },
@@ -103,41 +165,41 @@ function ie(e) {
103
165
  };
104
166
  }
105
167
  // src/common/design/metrics.ts
106
- var ae = 1, oe = .0021, se = .375, ce = 2.4, le = 10, ue = 1.5, de = .45, fe = 3, pe = 1.85, me = 1.2, he = .2, ge = 2, _e = .5, ve = 8, ye = .11, be = 1.5, xe = .4, Se = .72, Ce = .24, we = 1.1, Te = .7, Ee = .08, De = .75;
107
- function Oe(e, t) {
108
- let n = Math.max(0, e), r = Math.max(0, t), i = Math.max(ae, oe * n), a = 2 * m * r, o = Math.max(be, ye * a);
168
+ var oe = 1, se = .0021, ce = .375, le = 2.4, ue = 10, de = 1.5, fe = .45, pe = 3, me = 1.85, he = 1.2, ge = .2, _e = 2, ve = .5, ye = 8, be = .11, xe = 1.5, Se = .4, Ce = .72, we = .24, Te = 1.1, Ee = .7, De = .08, Oe = .75;
169
+ function ke(e, t) {
170
+ let n = Math.max(0, e), r = Math.max(0, t), i = Math.max(oe, se * n), a = 2 * h * r, o = Math.max(xe, be * a);
109
171
  return {
110
172
  yardLineWidth: i,
111
173
  goalLineWidth: 2 * i,
112
- midfieldLineWidth: ue * i,
113
- hashTickLength: se * r,
114
- numberHeight: Math.max(le, ce * r),
115
- pylonSize: Math.max(fe, de * r),
116
- goalpostCrossbarHalfLength: pe * r,
117
- goalpostUprightLength: me * r,
118
- goalpostStroke: Math.max(ge, he * a),
174
+ midfieldLineWidth: de * i,
175
+ hashTickLength: ce * r,
176
+ numberHeight: Math.max(ue, le * r),
177
+ pylonSize: Math.max(pe, fe * r),
178
+ goalpostCrossbarHalfLength: me * r,
179
+ goalpostUprightLength: he * r,
180
+ goalpostStroke: Math.max(_e, ge * a),
119
181
  tokenDiameter: a,
120
182
  markerStroke: o,
121
- markerLabelFont: Math.max(ve, _e * a),
183
+ markerLabelFont: Math.max(ye, ve * a),
122
184
  routeWidth: o,
123
185
  blockWidth: o,
124
- blockCapLength: xe * a,
125
- arrowLength: Se * a,
126
- arrowHalfWidth: Ce * a,
127
- motionDash: [we * r, Te * r],
128
- gridDotRadius: Math.max(De, Ee * r)
186
+ blockCapLength: Se * a,
187
+ arrowLength: Ce * a,
188
+ arrowHalfWidth: we * a,
189
+ motionDash: [Te * r, Ee * r],
190
+ gridDotRadius: Math.max(Oe, De * r)
129
191
  };
130
192
  }
131
193
  // src/common/editing/editor.ts
132
- var ke = [
194
+ var Ae = [
133
195
  "select",
134
196
  "add-player",
135
197
  "draw-line"
136
198
  ], g = { kind: "none" };
137
- function Ae(e, t) {
199
+ function je(e, t) {
138
200
  return e.kind === "none" || t.kind === "none" ? e.kind === t.kind : e.kind === t.kind && e.id === t.id;
139
201
  }
140
- function je(e, t) {
202
+ function _(e, t) {
141
203
  switch (e) {
142
204
  case "add-player": return t.remainingPlayerSlots > 0;
143
205
  case "draw-line": return t.canStartLine;
@@ -148,15 +210,15 @@ function Me(e, t) {
148
210
  return e.players.length <= t.remainingPlayerSlots;
149
211
  }
150
212
  // src/common/base/event.ts
151
- var _ = class {
213
+ var v = class {
152
214
  listeners = /* @__PURE__ */ new Set();
153
215
  disposed = !1;
154
216
  onListenerError;
155
217
  constructor(e = console.error) {
156
218
  this.onListenerError = e;
157
219
  }
158
- event = (t) => this.disposed ? e(() => {}) : (this.listeners.add(t), e(() => {
159
- this.listeners.delete(t);
220
+ event = (e) => this.disposed ? t(() => {}) : (this.listeners.add(e), t(() => {
221
+ this.listeners.delete(e);
160
222
  }));
161
223
  fire(e) {
162
224
  if (!this.disposed) for (let t of [...this.listeners]) try {
@@ -214,31 +276,31 @@ var _ = class {
214
276
  }
215
277
  }, Fe = ["offense", "defense"];
216
278
  function Ie(e) {
217
- return l(e, Fe);
279
+ return u(e, Fe);
218
280
  }
219
- function Le(e) {
281
+ function y(e) {
220
282
  if (typeof e == "object" && e && !Object.isFrozen(e)) {
221
283
  Object.freeze(e);
222
- for (let t of Object.values(e)) Le(t);
284
+ for (let t of Object.values(e)) y(t);
223
285
  }
224
286
  return e;
225
287
  }
226
288
  // src/common/formations/formation.ts
227
- function Re(e) {
228
- let { id: t, ...n } = ie(e);
289
+ function Le(e) {
290
+ let { id: t, ...n } = ae(e);
229
291
  return n;
230
292
  }
231
- function ze(e) {
232
- if (!o(e)) return null;
233
- let t = re(e.players).map(Re);
293
+ function Re(e) {
294
+ if (!s(e)) return null;
295
+ let t = ie(e.players).map(Le);
234
296
  return t.length === 0 ? null : {
235
- id: c(e.id) ? e.id : "formation",
236
- name: c(e.name) ? e.name : "フォーメーション",
297
+ id: l(e.id) ? e.id : "formation",
298
+ name: l(e.name) ? e.name : "Formation",
237
299
  side: Ie(e.side) ? e.side : "offense",
238
300
  players: t
239
301
  };
240
302
  }
241
- function Be(e, t, n) {
303
+ function ze(e, t, n) {
242
304
  let r = new Set(n);
243
305
  return e.players.map((e) => {
244
306
  let n = t.next("player", r);
@@ -249,7 +311,7 @@ function Be(e, t, n) {
249
311
  });
250
312
  }
251
313
  // src/common/model/id-factory.ts
252
- var Ve = class {
314
+ var Be = class {
253
315
  counters = /* @__PURE__ */ new Map();
254
316
  next(e, t) {
255
317
  let n = this.counters.get(e) ?? 0, r;
@@ -258,38 +320,38 @@ var Ve = class {
258
320
  while (t.has(r));
259
321
  return this.counters.set(e, n), r;
260
322
  }
261
- }, He = [
323
+ }, Ve = [
262
324
  "route",
263
325
  "block",
264
326
  "motion"
265
- ], Ue = ["straight", "bezier"], We = "route", Ge = "straight";
327
+ ], He = ["straight", "bezier"], Ue = "route", We = "straight";
328
+ function Ge(e) {
329
+ return u(e, Ve);
330
+ }
266
331
  function Ke(e) {
267
- return l(e, He);
332
+ return u(e, He);
268
333
  }
269
334
  function qe(e) {
270
- return l(e, Ue);
335
+ return c(e) && e > 0;
271
336
  }
272
- function Je(e) {
273
- return s(e) && e > 0;
274
- }
275
- function Ye(e, t, n) {
276
- if (!o(e) || !c(e.startPlayerId) || !n.has(e.startPlayerId)) return null;
277
- let r = te(e.end);
337
+ function Je(e, t, n) {
338
+ if (!s(e) || !l(e.startPlayerId) || !n.has(e.startPlayerId)) return null;
339
+ let r = ne(e.end);
278
340
  return r === null ? null : {
279
- id: c(e.id) ? e.id : `l${t}`,
280
- kind: Ke(e.kind) ? e.kind : We,
341
+ id: l(e.id) ? e.id : `l${t}`,
342
+ kind: Ge(e.kind) ? e.kind : Ue,
281
343
  startPlayerId: e.startPlayerId,
282
- waypoints: u(e.waypoints, 32, te),
344
+ waypoints: d(e.waypoints, 32, ne),
283
345
  end: r,
284
- interpolation: qe(e.interpolation) ? e.interpolation : Ge,
285
- ...c(e.color) ? { color: e.color } : {},
286
- ...Je(e.thickness) ? { thickness: e.thickness } : {}
346
+ interpolation: Ke(e.interpolation) ? e.interpolation : We,
347
+ ...l(e.color) ? { color: e.color } : {},
348
+ ...qe(e.thickness) ? { thickness: e.thickness } : {}
287
349
  };
288
350
  }
289
- function Xe(e, t) {
290
- return u(e, 128, (e, n) => Ye(e, n, t));
351
+ function Ye(e, t) {
352
+ return d(e, 128, (e, n) => Je(e, n, t));
291
353
  }
292
- function Ze(e) {
354
+ function Xe(e) {
293
355
  return {
294
356
  id: e.id,
295
357
  kind: e.kind,
@@ -301,7 +363,7 @@ function Ze(e) {
301
363
  ...e.thickness === void 0 ? {} : { thickness: e.thickness }
302
364
  };
303
365
  }
304
- function Qe(e, t) {
366
+ function Ze(e, t) {
305
367
  let n = t.get(e.startPlayerId);
306
368
  if (n !== void 0) return [
307
369
  { ...n.position },
@@ -309,52 +371,52 @@ function Qe(e, t) {
309
371
  { ...e.end }
310
372
  ];
311
373
  }
312
- function $e(e) {
374
+ function Qe(e) {
313
375
  let t = /* @__PURE__ */ new Map();
314
376
  for (let n of e) t.set(n.id, n);
315
377
  return t;
316
378
  }
317
379
  // src/common/model/play-data.ts
318
- var et = [
380
+ var $e = [
319
381
  "own-redzone",
320
382
  "middle",
321
383
  "redzone"
322
- ], tt = "middle", nt = {
323
- "own-redzone": "自陣RZ",
324
- middle: "中央",
325
- redzone: "相手RZ"
326
- }, rt = {
384
+ ], et = "middle", tt = {
385
+ "own-redzone": "Own red zone",
386
+ middle: "Midfield",
387
+ redzone: "Red zone"
388
+ }, nt = {
327
389
  "own-redzone": 10,
328
390
  middle: 50,
329
391
  redzone: 85
330
- }, it = 2;
331
- function at(e) {
332
- return l(e, et);
392
+ }, rt = 2;
393
+ function it(e) {
394
+ return u(e, $e);
333
395
  }
334
- function v(e) {
396
+ function b(e) {
335
397
  return {
336
398
  zone: e,
337
- losYard: rt[e]
399
+ losYard: nt[e]
338
400
  };
339
401
  }
340
- function ot(e) {
402
+ function at(e) {
341
403
  return {
342
404
  version: 2,
343
405
  field: { ...e.field },
344
- players: e.players.map(ie),
345
- lines: e.lines.map(Ze)
406
+ players: e.players.map(ae),
407
+ lines: e.lines.map(Xe)
346
408
  };
347
409
  }
348
- function st(e) {
349
- let t = o(e) ? e : {}, n = o(t.field) ? t.field.zone : void 0, r = ct(re(t.players)), i = new Set(r.map((e) => e.id));
410
+ function ot(e) {
411
+ let t = s(e) ? e : {}, n = s(t.field) ? t.field.zone : void 0, r = st(ie(t.players)), i = new Set(r.map((e) => e.id));
350
412
  return {
351
413
  version: 2,
352
- field: v(at(n) ? n : tt),
414
+ field: b(it(n) ? n : et),
353
415
  players: r,
354
- lines: ct(Xe(t.lines, i))
416
+ lines: st(Ye(t.lines, i))
355
417
  };
356
418
  }
357
- function ct(e) {
419
+ function st(e) {
358
420
  let t = new Set(e.map((e) => e.id)), n = /* @__PURE__ */ new Set();
359
421
  return e.map((e) => {
360
422
  if (!n.has(e.id)) return n.add(e.id), e;
@@ -367,30 +429,30 @@ function ct(e) {
367
429
  };
368
430
  });
369
431
  }
370
- function y(e, t) {
371
- if (!o(e)) return e;
432
+ function ct(e, t) {
433
+ if (!s(e)) return e;
372
434
  let { absoluteYard: n, ...r } = e;
373
- return s(n) ? {
435
+ return c(n) ? {
374
436
  ...r,
375
437
  downfieldYard: n - t
376
438
  } : e;
377
439
  }
378
440
  function lt(e, t) {
379
- return o(e) ? {
441
+ return s(e) ? {
380
442
  ...e,
381
- position: y(e.position, t)
443
+ position: ct(e.position, t)
382
444
  } : e;
383
445
  }
384
446
  function ut(e, t) {
385
- return o(e) ? {
447
+ return s(e) ? {
386
448
  ...e,
387
- waypoints: Array.isArray(e.waypoints) ? e.waypoints.slice(0, 32).map((e) => y(e, t)) : e.waypoints,
388
- end: y(e.end, t),
389
- thickness: s(e.thickness) ? e.thickness / 2 : e.thickness
449
+ waypoints: Array.isArray(e.waypoints) ? e.waypoints.slice(0, 32).map((e) => ct(e, t)) : e.waypoints,
450
+ end: ct(e.end, t),
451
+ thickness: c(e.thickness) ? e.thickness / 2 : e.thickness
390
452
  } : e;
391
453
  }
392
454
  function dt(e) {
393
- let t = v(o(e.field) && at(e.field.zone) ? e.field.zone : tt), { losYard: n } = t;
455
+ let t = b(s(e.field) && it(e.field.zone) ? e.field.zone : et), { losYard: n } = t;
394
456
  return {
395
457
  ...e,
396
458
  field: t,
@@ -404,19 +466,19 @@ var ft = [{
404
466
  migrate: dt
405
467
  }];
406
468
  function pt(e) {
407
- return o(e) && s(e.version) ? e.version : 0;
469
+ return s(e) && c(e.version) ? e.version : 0;
408
470
  }
409
471
  function mt(e, t, n) {
410
- if (!o(e)) return e;
472
+ if (!s(e)) return e;
411
473
  let r = e;
412
474
  for (let e of n) e.to > t && (r = e.migrate(r));
413
475
  return r;
414
476
  }
415
477
  function ht(e) {
416
- return st(mt(e, pt(e), ft));
478
+ return ot(mt(e, pt(e), ft));
417
479
  }
418
480
  // src/common/model/play-model.ts
419
- function b(e, t, n, r) {
481
+ function gt(e, t, n, r) {
420
482
  if (!Number.isInteger(t) || t < 0 || t > e.length) throw Error(`PlayModel: ${r} index out of range: ${t} (0..${e.length})`);
421
483
  return [
422
484
  ...e.slice(0, t),
@@ -424,25 +486,25 @@ function b(e, t, n, r) {
424
486
  ...e.slice(t)
425
487
  ];
426
488
  }
427
- function gt(e, t, n) {
489
+ function _t(e, t, n) {
428
490
  if (e.some((e) => e.id === t)) throw Error(`${n} "${t}"`);
429
491
  }
430
- function x(e, t, n) {
492
+ function vt(e, t, n) {
431
493
  if (e > t) throw Error(`PlayModel: too many ${n}: ${e} > ${t}`);
432
494
  }
433
- function _t(e) {
434
- x(e.players.length, 64, "players"), x(e.lines.length, 128, "lines");
435
- for (let t of e.lines) x(t.waypoints.length, 32, "waypoints");
495
+ function yt(e) {
496
+ vt(e.players.length, 64, "players"), vt(e.lines.length, 128, "lines");
497
+ for (let t of e.lines) vt(t.waypoints.length, 32, "waypoints");
436
498
  }
437
- var vt = class extends n {
438
- _onDidChange = this._register(new _());
499
+ var bt = class extends r {
500
+ _onDidChange = this._register(new v());
439
501
  onDidChange = this._onDidChange.event;
440
502
  state;
441
503
  constructor(e) {
442
504
  super(), this.state = ht(e);
443
505
  }
444
506
  getData() {
445
- return ot(this.state);
507
+ return at(this.state);
446
508
  }
447
509
  getSnapshot() {
448
510
  return this.state;
@@ -469,7 +531,7 @@ var vt = class extends n {
469
531
  setFieldZone(e) {
470
532
  this.commit({
471
533
  ...this.state,
472
- field: v(e)
534
+ field: b(e)
473
535
  });
474
536
  }
475
537
  addPlayer(e) {
@@ -516,9 +578,9 @@ var vt = class extends n {
516
578
  return this.emitChange(), n;
517
579
  }
518
580
  restorePlayer(e) {
519
- gt(this.state.players, e.player.id, "PlayModel.restorePlayer: duplicate player id");
520
- let t = b(this.state.players, e.index, e.player, "player"), n = this.state.lines;
521
- for (let { line: t, index: r } of [...e.removedLines].sort((e, t) => e.index - t.index)) n = b(n, r, t, "line");
581
+ _t(this.state.players, e.player.id, "PlayModel.restorePlayer: duplicate player id");
582
+ let t = gt(this.state.players, e.index, e.player, "player"), n = this.state.lines;
583
+ for (let { line: t, index: r } of [...e.removedLines].sort((e, t) => e.index - t.index)) n = gt(n, r, t, "line");
522
584
  this.commit({
523
585
  ...this.state,
524
586
  players: t,
@@ -536,9 +598,9 @@ var vt = class extends n {
536
598
  this.insertLine(e, this.state.lines.length);
537
599
  }
538
600
  insertLine(e, t) {
539
- gt(this.state.lines, e.id, "PlayModel: duplicate line id"), this.commit({
601
+ _t(this.state.lines, e.id, "PlayModel: duplicate line id"), this.commit({
540
602
  ...this.state,
541
- lines: b(this.state.lines, t, e, "line")
603
+ lines: gt(this.state.lines, t, e, "line")
542
604
  });
543
605
  }
544
606
  removeLine(e) {
@@ -561,22 +623,22 @@ var vt = class extends n {
561
623
  }), t;
562
624
  }
563
625
  commit(e) {
564
- _t(e), this.state = e, this.emitChange();
626
+ yt(e), this.state = e, this.emitChange();
565
627
  }
566
628
  emitChange() {
567
629
  this._onDidChange.fire(this.state);
568
630
  }
569
631
  };
570
632
  // src/common/commands/command.ts
571
- function S(e, t) {
572
- /* v8 ignore start -- 履歴は apply が済んだコマンドしか積まないので、編集の操作からは届かない。 */
573
- if (e === void 0) throw Error(`${t.label}: apply より前に undo された`);
633
+ function x(e, t) {
634
+ /* v8 ignore start -- Only applied commands enter the history, so edits never get here. */
635
+ if (e === void 0) throw Error(`${t.label}: undone before apply`);
574
636
  /* v8 ignore stop */
575
637
  return e;
576
638
  }
577
639
  // src/common/commands/field-commands.ts
578
- var yt = class {
579
- label = "フィールドゾーンの切替";
640
+ var xt = class {
641
+ label = "Switch field zone";
580
642
  zone;
581
643
  previous;
582
644
  constructor(e) {
@@ -586,10 +648,10 @@ var yt = class {
586
648
  return this.previous = e.getFieldZone(), this.previous !== this.zone && (e.setFieldZone(this.zone), !0);
587
649
  }
588
650
  undo(e) {
589
- e.setFieldZone(S(this.previous, this));
651
+ e.setFieldZone(x(this.previous, this));
590
652
  }
591
- }, bt = class {
592
- label = "フォーメーションの読み込み";
653
+ }, St = class {
654
+ label = "Load formation";
593
655
  players;
594
656
  constructor(e) {
595
657
  this.players = e;
@@ -602,24 +664,24 @@ var yt = class {
602
664
  }
603
665
  };
604
666
  // src/common/commands/patch.ts
605
- function xt(e) {
667
+ function Ct(e) {
606
668
  return e;
607
669
  }
608
- function St(e, t) {
609
- let n = { ...xt(e) };
670
+ function wt(e, t) {
671
+ let n = { ...Ct(e) };
610
672
  for (let [e, r] of Object.entries(t)) r === null ? delete n[e] : n[e] = r;
611
673
  return n;
612
674
  }
613
- function Ct(e, t) {
614
- let n = xt(e);
675
+ function Tt(e, t) {
676
+ let n = Ct(e);
615
677
  return Object.entries(t).some(([e, t]) => (t ?? void 0) !== n[e]);
616
678
  }
617
679
  // src/common/commands/line-commands.ts
618
- function wt(e, t) {
619
- return St(e, t);
680
+ function Et(e, t) {
681
+ return wt(e, t);
620
682
  }
621
- var Tt = class {
622
- label = "線の追加";
683
+ var Dt = class {
684
+ label = "Add line";
623
685
  line;
624
686
  constructor(e) {
625
687
  this.line = e;
@@ -630,8 +692,8 @@ var Tt = class {
630
692
  undo(e) {
631
693
  e.removeLine(this.line.id);
632
694
  }
633
- }, Et = class {
634
- label = "線の削除";
695
+ }, Ot = class {
696
+ label = "Delete line";
635
697
  lineId;
636
698
  removal;
637
699
  constructor(e) {
@@ -641,11 +703,11 @@ var Tt = class {
641
703
  return this.removal = e.removeLine(this.lineId), !0;
642
704
  }
643
705
  undo(e) {
644
- let { line: t, index: n } = S(this.removal, this);
706
+ let { line: t, index: n } = x(this.removal, this);
645
707
  e.insertLine(t, n);
646
708
  }
647
- }, Dt = class {
648
- label = "線の編集";
709
+ }, kt = class {
710
+ label = "Update line";
649
711
  lineId;
650
712
  patch;
651
713
  previous;
@@ -654,18 +716,18 @@ var Tt = class {
654
716
  }
655
717
  apply(e) {
656
718
  let t = e.getLine(this.lineId);
657
- return Ct(t, this.patch) ? (this.previous = e.updateLine(wt(t, this.patch)), !0) : !1;
719
+ return Tt(t, this.patch) ? (this.previous = e.updateLine(Et(t, this.patch)), !0) : !1;
658
720
  }
659
721
  undo(e) {
660
- e.updateLine(S(this.previous, this));
722
+ e.updateLine(x(this.previous, this));
661
723
  }
662
724
  };
663
725
  // src/common/commands/player-commands.ts
664
- function Ot(e, t) {
665
- return St(e, t);
726
+ function At(e, t) {
727
+ return wt(e, t);
666
728
  }
667
- var kt = class {
668
- label = "選手の追加";
729
+ var jt = class {
730
+ label = "Add player";
669
731
  player;
670
732
  constructor(e) {
671
733
  this.player = e;
@@ -676,8 +738,8 @@ var kt = class {
676
738
  undo(e) {
677
739
  e.removePlayer(this.player.id);
678
740
  }
679
- }, At = class {
680
- label = "選手の削除";
741
+ }, Mt = class {
742
+ label = "Delete player";
681
743
  playerId;
682
744
  removal;
683
745
  constructor(e) {
@@ -687,10 +749,10 @@ var kt = class {
687
749
  return this.removal = e.removePlayer(this.playerId), !0;
688
750
  }
689
751
  undo(e) {
690
- e.restorePlayer(S(this.removal, this));
752
+ e.restorePlayer(x(this.removal, this));
691
753
  }
692
- }, jt = class {
693
- label = "選手の編集";
754
+ }, Nt = class {
755
+ label = "Update player";
694
756
  playerId;
695
757
  patch;
696
758
  previous;
@@ -699,17 +761,17 @@ var kt = class {
699
761
  }
700
762
  apply(e) {
701
763
  let t = e.getPlayer(this.playerId);
702
- return Ct(t, this.patch) ? (this.previous = e.updatePlayer(Ot(t, this.patch)), !0) : !1;
764
+ return Tt(t, this.patch) ? (this.previous = e.updatePlayer(At(t, this.patch)), !0) : !1;
703
765
  }
704
766
  undo(e) {
705
- e.updatePlayer(S(this.previous, this));
767
+ e.updatePlayer(x(this.previous, this));
706
768
  }
707
- }, Mt = 53, Nt = {
769
+ }, Pt = 53, Ft = {
708
770
  ncaa: 6.5,
709
771
  nfl: 3,
710
772
  nfhs: 9
711
- }, Pt = "ncaa";
712
- function C(e) {
773
+ }, It = "ncaa";
774
+ function S(e) {
713
775
  switch (e) {
714
776
  case "own-redzone": return {
715
777
  startYard: -10,
@@ -725,30 +787,30 @@ function C(e) {
725
787
  };
726
788
  }
727
789
  }
728
- function Ft(e) {
729
- let { startYard: t, endYard: n } = C(e);
790
+ function Lt(e) {
791
+ let { startYard: t, endYard: n } = S(e);
730
792
  return n - t;
731
793
  }
732
- function It(e) {
733
- return 53 / Ft(e);
794
+ function Rt(e) {
795
+ return 53 / Lt(e);
734
796
  }
735
- function Lt(e, t) {
736
- let { startYard: n, endYard: r } = C(t.zone);
797
+ function zt(e, t) {
798
+ let { startYard: n, endYard: r } = S(t.zone);
737
799
  return {
738
800
  lateralYard: Math.min(Math.max(e.lateralYard, 0), 53),
739
801
  downfieldYard: Math.min(Math.max(e.downfieldYard, n - t.losYard), r - t.losYard)
740
802
  };
741
803
  }
742
- function Rt(e) {
804
+ function Bt(e) {
743
805
  return e <= 0 || e >= 100 ? null : 50 - Math.abs(50 - e);
744
806
  }
745
- function w(e, t) {
746
- if (t <= 0) throw Error("Playmaker: stepYards は正の数である必要があります。");
747
- let { startYard: n, endYard: r } = C(e), i = [], a = Math.ceil(n / t) * t;
807
+ function C(e, t) {
808
+ if (t <= 0) throw Error("Playmaker: stepYards must be a positive number.");
809
+ let { startYard: n, endYard: r } = S(e), i = [], a = Math.ceil(n / t) * t;
748
810
  for (let e = a; e <= r + 1e-9; e += t) i.push(e);
749
811
  return i;
750
812
  }
751
- var zt = class {
813
+ var Vt = class {
752
814
  viewportWidth;
753
815
  viewportHeight;
754
816
  zone;
@@ -760,7 +822,7 @@ var zt = class {
760
822
  offsetX;
761
823
  offsetY;
762
824
  constructor(e, t, n) {
763
- this.viewportWidth = e, this.viewportHeight = t, this.zone = n.zone, this.losYard = n.losYard, this.yardWindow = C(n.zone);
825
+ this.viewportWidth = e, this.viewportHeight = t, this.zone = n.zone, this.losYard = n.losYard, this.yardWindow = S(n.zone);
764
826
  let r = this.yardWindow.endYard - this.yardWindow.startYard, i = Math.max(0, e), a = Math.max(0, t);
765
827
  this.scale = Math.min(i / 53, a / r), this.fieldPixelWidth = 53 * this.scale, this.fieldPixelHeight = r * this.scale, this.offsetX = (i - this.fieldPixelWidth) / 2, this.offsetY = (a - this.fieldPixelHeight) / 2;
766
828
  }
@@ -793,22 +855,22 @@ var zt = class {
793
855
  }
794
856
  };
795
857
  // src/common/geometry/polyline.ts
796
- function* Bt(e) {
858
+ function* w(e) {
797
859
  let t;
798
860
  for (let n of e) t !== void 0 && (yield [t.point, n]), t = { point: n };
799
861
  }
800
- function Vt(e) {
862
+ function Ht(e) {
801
863
  let t = 0;
802
- for (let [n, r] of Bt(e)) t += Math.hypot(r.x - n.x, r.y - n.y);
864
+ for (let [n, r] of w(e)) t += Math.hypot(r.x - n.x, r.y - n.y);
803
865
  return t;
804
866
  }
805
- function Ht(e, t, n = 1) {
867
+ function Ut(e, t, n = 1) {
806
868
  if (e.length < 2 || t <= 0) return [...e];
807
- let r = n >= 1 ? t : Math.min(t, Vt(e) * n);
869
+ let r = n >= 1 ? t : Math.min(t, Ht(e) * n);
808
870
  if (r <= 0) return [...e];
809
871
  for (let t = e.length - 1; t > 0; t--) {
810
872
  let n = e[t - 1], i = e[t];
811
- /* v8 ignore start -- i は 1 から path.length - 1 までなので、a も b も範囲の内側にある。 */
873
+ /* v8 ignore start -- i runs from 1 to path.length - 1, so both a and b are inside the range. */
812
874
  if (n === void 0 || i === void 0) break;
813
875
  /* v8 ignore stop */
814
876
  let a = Math.hypot(i.x - n.x, i.y - n.y);
@@ -823,14 +885,14 @@ function Ht(e, t, n = 1) {
823
885
  }
824
886
  return e.slice(0, 1);
825
887
  }
826
- function Ut(e, t, n, r, i) {
888
+ function Wt(e, t, n, r, i) {
827
889
  let a = 1 - i, o = a * a * a, s = 3 * a * a * i, c = 3 * a * i * i, l = i * i * i;
828
890
  return {
829
891
  lateralYard: o * e.lateralYard + s * t.lateralYard + c * n.lateralYard + l * r.lateralYard,
830
892
  downfieldYard: o * e.downfieldYard + s * t.downfieldYard + c * n.downfieldYard + l * r.downfieldYard
831
893
  };
832
894
  }
833
- function Wt(e, t, n, r) {
895
+ function Gt(e, t, n, r) {
834
896
  return [{
835
897
  lateralYard: t.lateralYard + (n.lateralYard - e.lateralYard) / 6,
836
898
  downfieldYard: t.downfieldYard + (n.downfieldYard - e.downfieldYard) / 6
@@ -839,7 +901,7 @@ function Wt(e, t, n, r) {
839
901
  downfieldYard: n.downfieldYard - (r.downfieldYard - t.downfieldYard) / 6
840
902
  }];
841
903
  }
842
- function Gt(e) {
904
+ function Kt(e) {
843
905
  let t = [];
844
906
  for (let n of e) {
845
907
  let e = t[t.length - 1];
@@ -850,51 +912,51 @@ function Gt(e) {
850
912
  }
851
913
  return t;
852
914
  }
853
- function Kt(e, t, n = 16) {
854
- let r = Gt(e);
915
+ function qt(e, t, n = 16) {
916
+ let r = Kt(e);
855
917
  if (t === "straight" || r.length < 3) return r;
856
918
  let i = Math.max(1, Math.floor(n)), a = r.slice(0, 1);
857
- for (let [e, [t, n]] of [...Bt(r)].entries()) {
858
- let [o, s] = Wt(r[e - 1] ?? t, t, n, r[e + 2] ?? n);
859
- for (let e = 1; e <= i; e++) a.push(Ut(t, o, s, n, e / i));
919
+ for (let [e, [t, n]] of [...w(r)].entries()) {
920
+ let [o, s] = Gt(r[e - 1] ?? t, t, n, r[e + 2] ?? n);
921
+ for (let e = 1; e <= i; e++) a.push(Wt(t, o, s, n, e / i));
860
922
  }
861
923
  return a;
862
924
  }
863
925
  // src/common/geometry/hit-test.ts
864
- function qt(e, t, n = m) {
865
- if (n <= 0) throw Error("Playmaker: radiusYards は正の数である必要があります。");
926
+ function Jt(e, t, n = h) {
927
+ if (n <= 0) throw Error("Playmaker: radiusYards must be a positive number.");
866
928
  let r = n * n;
867
929
  for (let n of [...e].reverse()) {
868
930
  let e = n.position.lateralYard - t.lateralYard, i = n.position.downfieldYard - t.downfieldYard;
869
931
  if (e * e + i * i <= r) return n;
870
932
  }
871
933
  }
872
- var Jt = .6;
873
- function Yt(e, t, n) {
934
+ var Yt = .6;
935
+ function Xt(e, t, n) {
874
936
  let r = n.lateralYard - t.lateralYard, i = n.downfieldYard - t.downfieldYard, a = e.lateralYard - t.lateralYard, o = e.downfieldYard - t.downfieldYard, s = r * r + i * i, c = s > 0 ? Math.max(0, Math.min(1, (a * r + o * i) / s)) : 0, l = a - c * r, u = o - c * i;
875
937
  return Math.sqrt(l * l + u * u);
876
938
  }
877
- function Xt(e, t) {
939
+ function Zt(e, t) {
878
940
  let n = t.length === 1 ? t[0] : void 0;
879
- if (n !== void 0) return $t(e, n);
941
+ if (n !== void 0) return en(e, n);
880
942
  let r = Infinity;
881
- for (let [n, i] of Bt(t)) r = Math.min(r, Yt(e, n, i));
943
+ for (let [n, i] of w(t)) r = Math.min(r, Xt(e, n, i));
882
944
  return r;
883
945
  }
884
- function Zt(e, t, n, r = Jt) {
885
- if (r <= 0) throw Error("Playmaker: toleranceYards は正の数である必要があります。");
886
- let i = $e(t);
946
+ function Qt(e, t, n, r = Yt) {
947
+ if (r <= 0) throw Error("Playmaker: toleranceYards must be a positive number.");
948
+ let i = Qe(t);
887
949
  for (let t of [...e].reverse()) {
888
- let e = Qe(t, i);
889
- if (e !== void 0 && Xt(n, Kt(e, t.interpolation)) <= r) return t;
950
+ let e = Ze(t, i);
951
+ if (e !== void 0 && Zt(n, qt(e, t.interpolation)) <= r) return t;
890
952
  }
891
953
  }
892
- var Qt = .9;
893
- function $t(e, t) {
954
+ var $t = .9;
955
+ function en(e, t) {
894
956
  return Math.hypot(e.lateralYard - t.lateralYard, e.downfieldYard - t.downfieldYard);
895
957
  }
896
- function en(e, t) {
897
- let n = (e) => $t(t, e) <= Qt;
958
+ function tn(e, t) {
959
+ let n = (e) => en(t, e) <= $t;
898
960
  if (n(e.end)) return {
899
961
  kind: "endpoint",
900
962
  point: e.end
@@ -906,26 +968,26 @@ function en(e, t) {
906
968
  };
907
969
  }
908
970
  // src/common/editing/editor-notifier.ts
909
- var tn = {
971
+ var nn = {
910
972
  tool: Object.is,
911
- selection: Ae,
973
+ selection: je,
912
974
  canUndo: Object.is,
913
975
  canRedo: Object.is,
914
976
  fieldZone: Object.is,
915
977
  isDrawing: Object.is,
916
978
  remainingPlayerSlots: Object.is,
917
979
  canStartLine: Object.is
918
- }, nn = Object.keys(tn);
919
- function rn(e, t, n) {
920
- return tn[e](t[e], n[e]);
980
+ }, rn = Object.keys(nn);
981
+ function an(e, t, n) {
982
+ return nn[e](t[e], n[e]);
921
983
  }
922
- function an(e, t) {
923
- return nn.every((n) => rn(n, e.state, t.state)) && e.player === t.player && e.line === t.line;
984
+ function on(e, t) {
985
+ return rn.every((n) => an(n, e.state, t.state)) && e.player === t.player && e.line === t.line;
924
986
  }
925
- var on = class extends n {
926
- _onDidChangeScene = this._register(new _());
987
+ var sn = class extends r {
988
+ _onDidChangeScene = this._register(new v());
927
989
  onDidChangeScene = this._onDidChangeScene.event;
928
- _onDidChangeViewState = this._register(new _());
990
+ _onDidChangeViewState = this._register(new v());
929
991
  onDidChangeViewState = this._onDidChangeViewState.event;
930
992
  readView;
931
993
  depth = 0;
@@ -953,15 +1015,15 @@ var on = class extends n {
953
1015
  flush() {
954
1016
  this.sceneChanged && (this.sceneChanged = !1, this._onDidChangeScene.fire());
955
1017
  let e = this.readView();
956
- an(e, this.lastView) || (this.lastView = e, this._onDidChangeViewState.fire());
1018
+ on(e, this.lastView) || (this.lastView = e, this._onDidChangeViewState.fire());
957
1019
  }
958
1020
  };
959
1021
  // src/common/editing/interaction.ts
960
1022
  function T(e, t) {
961
1023
  return e.lateralYard === t.lateralYard && e.downfieldYard === t.downfieldYard;
962
1024
  }
963
- var sn = 33;
964
- function cn(e, t, n) {
1025
+ var cn = 33;
1026
+ function ln(e, t, n) {
965
1027
  return {
966
1028
  type: "drag",
967
1029
  target: e,
@@ -973,13 +1035,13 @@ function cn(e, t, n) {
973
1035
  current: t
974
1036
  };
975
1037
  }
976
- function ln(e, t) {
1038
+ function un(e, t) {
977
1039
  return {
978
1040
  lateralYard: t.lateralYard + e.grabOffset.lateralYard,
979
1041
  downfieldYard: t.downfieldYard + e.grabOffset.downfieldYard
980
1042
  };
981
1043
  }
982
- function un(e, t, n) {
1044
+ function dn(e, t, n) {
983
1045
  switch (t.kind) {
984
1046
  case "player": return e.players.some((e) => e.id === t.playerId) ? {
985
1047
  kind: "player",
@@ -1001,14 +1063,14 @@ function un(e, t, n) {
1001
1063
  }
1002
1064
  }
1003
1065
  }
1004
- function dn(e) {
1066
+ function fn(e) {
1005
1067
  let t = e.at(-1);
1006
1068
  return t === void 0 ? void 0 : {
1007
1069
  waypoints: e.slice(0, -1),
1008
1070
  end: t
1009
1071
  };
1010
1072
  }
1011
- function fn(e) {
1073
+ function pn(e) {
1012
1074
  return {
1013
1075
  type: "draw-line",
1014
1076
  startPlayerId: e.id,
@@ -1017,62 +1079,62 @@ function fn(e) {
1017
1079
  cursor: e.position
1018
1080
  };
1019
1081
  }
1020
- function pn(e, t) {
1021
- let n = !T(e.points.at(-1) ?? e.start, t) && e.points.length < sn;
1082
+ function mn(e, t) {
1083
+ let n = !T(e.points.at(-1) ?? e.start, t) && e.points.length < cn;
1022
1084
  return {
1023
1085
  ...e,
1024
1086
  points: n ? [...e.points, t] : e.points,
1025
1087
  cursor: t
1026
1088
  };
1027
1089
  }
1028
- function mn(e, t) {
1029
- let n = dn(e.points);
1090
+ function hn(e, t) {
1091
+ let n = fn(e.points);
1030
1092
  if (n !== void 0) return e.points.every((e) => T(e, t)) ? void 0 : n;
1031
1093
  }
1032
- function hn(e, t, n) {
1094
+ function gn(e, t, n) {
1033
1095
  return {
1034
1096
  id: t,
1035
- kind: We,
1097
+ kind: Ue,
1036
1098
  startPlayerId: e.startPlayerId,
1037
1099
  waypoints: n.waypoints,
1038
1100
  end: n.end,
1039
- interpolation: Ge
1101
+ interpolation: We
1040
1102
  };
1041
1103
  }
1042
1104
  // src/common/editing/preview.ts
1043
- var gn = "__playmaker_draft_line__";
1044
- function _n(e, t) {
1105
+ var _n = "__playmaker_draft_line__";
1106
+ function vn(e, t) {
1045
1107
  switch (t.kind) {
1046
1108
  case "player": return {
1047
1109
  ...e,
1048
- players: e.players.map((e) => e.id === t.playerId ? Ot(e, t.patch) : e)
1110
+ players: e.players.map((e) => e.id === t.playerId ? At(e, t.patch) : e)
1049
1111
  };
1050
1112
  case "line": return {
1051
1113
  ...e,
1052
- lines: e.lines.map((e) => e.id === t.lineId ? wt(e, t.patch) : e)
1114
+ lines: e.lines.map((e) => e.id === t.lineId ? Et(e, t.patch) : e)
1053
1115
  };
1054
1116
  }
1055
1117
  }
1056
- function vn(e) {
1057
- return hn(e, gn, (e.points.length >= sn ? dn(e.points) : void 0) ?? {
1118
+ function yn(e) {
1119
+ return gn(e, _n, (e.points.length >= cn ? fn(e.points) : void 0) ?? {
1058
1120
  waypoints: e.points,
1059
1121
  end: e.cursor
1060
1122
  });
1061
1123
  }
1062
- function yn(e, t) {
1124
+ function bn(e, t) {
1063
1125
  if (t === void 0) return e;
1064
1126
  switch (t.type) {
1065
1127
  case "drag": {
1066
- let n = un(e, t.target, t.current);
1067
- return n === void 0 ? e : _n(e, n);
1128
+ let n = dn(e, t.target, t.current);
1129
+ return n === void 0 ? e : vn(e, n);
1068
1130
  }
1069
1131
  case "draw-line": return {
1070
1132
  ...e,
1071
- lines: [...e.lines, vn(t)]
1133
+ lines: [...e.lines, yn(t)]
1072
1134
  };
1073
1135
  }
1074
1136
  }
1075
- function bn(e, t) {
1137
+ function xn(e, t) {
1076
1138
  if (t.kind === "player") return {
1077
1139
  kind: "player",
1078
1140
  playerId: t.id
@@ -1085,7 +1147,7 @@ function bn(e, t) {
1085
1147
  };
1086
1148
  }
1087
1149
  // src/common/editing/editor-controller.ts
1088
- var xn = class extends n {
1150
+ var Sn = class extends r {
1089
1151
  model;
1090
1152
  commands;
1091
1153
  ids;
@@ -1096,7 +1158,7 @@ var xn = class extends n {
1096
1158
  selection = g;
1097
1159
  interaction;
1098
1160
  constructor(e, t, n) {
1099
- super(), this.model = e, this.commands = t, this.ids = n, this.notifier = this._register(new on(() => ({
1161
+ super(), this.model = e, this.commands = t, this.ids = n, this.notifier = this._register(new sn(() => ({
1100
1162
  state: this.getViewState(),
1101
1163
  player: this.getSelectedPlayer(),
1102
1164
  line: this.getSelectedLine()
@@ -1124,10 +1186,10 @@ var xn = class extends n {
1124
1186
  return e.kind === "line" ? this.model.findLine(e.id) : void 0;
1125
1187
  }
1126
1188
  getFrame() {
1127
- let e = yn(this.model.getSnapshot(), this.interaction);
1189
+ let e = bn(this.model.getSnapshot(), this.interaction);
1128
1190
  return {
1129
1191
  scene: e,
1130
- overlay: bn(e, this.selection)
1192
+ overlay: xn(e, this.selection)
1131
1193
  };
1132
1194
  }
1133
1195
  setTool(e) {
@@ -1157,14 +1219,14 @@ var xn = class extends n {
1157
1219
  cursor: this.clampToField(e)
1158
1220
  } : {
1159
1221
  ...t,
1160
- current: this.clampToField(ln(t, e))
1222
+ current: this.clampToField(un(t, e))
1161
1223
  }));
1162
1224
  }
1163
1225
  pointerUp(e) {
1164
1226
  let t = this.interaction;
1165
1227
  t?.type === "drag" && this.notifier.batch(() => {
1166
1228
  this.setInteraction(void 0);
1167
- let n = ln(t, e);
1229
+ let n = un(t, e);
1168
1230
  if (T(n, t.origin)) return;
1169
1231
  let r = this.clampToField(n);
1170
1232
  if (T(r, t.origin)) return;
@@ -1180,7 +1242,7 @@ var xn = class extends n {
1180
1242
  e?.type === "draw-line" && this.notifier.batch(() => {
1181
1243
  this.setInteraction(void 0);
1182
1244
  let t = this.lineFromDraft(e);
1183
- t !== void 0 && (this.commands.execute(new Tt(t)), this.setTool("select"), this.setSelection({
1245
+ t !== void 0 && (this.commands.execute(new Dt(t)), this.setTool("select"), this.setSelection({
1184
1246
  kind: "line",
1185
1247
  id: t.id
1186
1248
  }));
@@ -1189,30 +1251,30 @@ var xn = class extends n {
1189
1251
  deleteSelection() {
1190
1252
  let e = this.getSelectedPlayer(), t = this.getSelectedLine();
1191
1253
  this.notifier.batch(() => {
1192
- if (e !== void 0) this.commands.execute(new At(e.id));
1193
- else if (t !== void 0) this.commands.execute(new Et(t.id));
1254
+ if (e !== void 0) this.commands.execute(new Mt(e.id));
1255
+ else if (t !== void 0) this.commands.execute(new Ot(t.id));
1194
1256
  else return;
1195
1257
  this.setSelection(g);
1196
1258
  });
1197
1259
  }
1198
1260
  updateSelectedPlayer(e) {
1199
1261
  let t = this.getSelectedPlayer();
1200
- t !== void 0 && this.notifier.batch(() => this.commands.execute(new jt(t.id, e)));
1262
+ t !== void 0 && this.notifier.batch(() => this.commands.execute(new Nt(t.id, e)));
1201
1263
  }
1202
1264
  updateSelectedLine(e) {
1203
1265
  let t = this.getSelectedLine();
1204
- t !== void 0 && this.notifier.batch(() => this.commands.execute(new Dt(t.id, e)));
1266
+ t !== void 0 && this.notifier.batch(() => this.commands.execute(new kt(t.id, e)));
1205
1267
  }
1206
1268
  setFieldZone(e) {
1207
1269
  this.notifier.batch(() => {
1208
- this.commands.execute(new yt(e)) && this.setInteraction(void 0);
1270
+ this.commands.execute(new xt(e)) && this.setInteraction(void 0);
1209
1271
  });
1210
1272
  }
1211
1273
  loadFormation(e) {
1212
1274
  if (!Me(e, this.getViewState())) return !1;
1213
- let { players: t } = this.model.getSnapshot(), n = Be(e, this.ids, t.map((e) => e.id));
1275
+ let { players: t } = this.model.getSnapshot(), n = ze(e, this.ids, t.map((e) => e.id));
1214
1276
  return this.notifier.batch(() => {
1215
- let e = this.commands.execute(new bt(n));
1277
+ let e = this.commands.execute(new St(n));
1216
1278
  return e && (this.setInteraction(void 0), this.setSelection(g)), e;
1217
1279
  });
1218
1280
  }
@@ -1231,21 +1293,21 @@ var xn = class extends n {
1231
1293
  });
1232
1294
  }
1233
1295
  setSelection(e) {
1234
- Ae(this.selection, e) || (this.selection = e, this.notifier.markSceneChanged());
1296
+ je(this.selection, e) || (this.selection = e, this.notifier.markSceneChanged());
1235
1297
  }
1236
1298
  setInteraction(e) {
1237
1299
  e !== this.interaction && (this.interaction = e, this.notifier.markSceneChanged());
1238
1300
  }
1239
1301
  clampToField(e) {
1240
- return a(Lt(e, this.model.getSnapshot().field));
1302
+ return o(zt(e, this.model.getSnapshot().field));
1241
1303
  }
1242
1304
  dropCommand(e, t) {
1243
- let n = un(this.model.getSnapshot(), e.target, t);
1244
- if (n !== void 0) return n.kind === "player" ? new jt(n.playerId, n.patch) : new Dt(n.lineId, n.patch);
1305
+ let n = dn(this.model.getSnapshot(), e.target, t);
1306
+ if (n !== void 0) return n.kind === "player" ? new Nt(n.playerId, n.patch) : new kt(n.lineId, n.patch);
1245
1307
  }
1246
1308
  lineFromDraft(e) {
1247
- let t = this.model.findPlayer(e.startPlayerId), n = t === void 0 ? void 0 : mn(e, t.position);
1248
- return n === void 0 ? void 0 : hn(e, this.ids.next("line", new Set(this.model.getSnapshot().lines.map((e) => e.id))), n);
1309
+ let t = this.model.findPlayer(e.startPlayerId), n = t === void 0 ? void 0 : hn(e, t.position);
1310
+ return n === void 0 ? void 0 : gn(e, this.ids.next("line", new Set(this.model.getSnapshot().lines.map((e) => e.id))), n);
1249
1311
  }
1250
1312
  selectPointerDown(e) {
1251
1313
  let t = this.model.getSnapshot(), n = this.hitSelectedLineHandle(e);
@@ -1253,26 +1315,26 @@ var xn = class extends n {
1253
1315
  this.setInteraction(n);
1254
1316
  return;
1255
1317
  }
1256
- let r = qt(t.players, e);
1318
+ let r = Jt(t.players, e);
1257
1319
  if (r !== void 0) {
1258
1320
  this.setSelection({
1259
1321
  kind: "player",
1260
1322
  id: r.id
1261
- }), this.setInteraction(cn({
1323
+ }), this.setInteraction(ln({
1262
1324
  kind: "player",
1263
1325
  playerId: r.id
1264
1326
  }, r.position, e));
1265
1327
  return;
1266
1328
  }
1267
- let i = Zt(t.lines, t.players, e);
1329
+ let i = Qt(t.lines, t.players, e);
1268
1330
  this.setSelection(i === void 0 ? g : {
1269
1331
  kind: "line",
1270
1332
  id: i.id
1271
1333
  });
1272
1334
  }
1273
1335
  hitSelectedLineHandle(e) {
1274
- let t = this.getSelectedLine(), n = t === void 0 ? void 0 : en(t, e);
1275
- return t === void 0 || n === void 0 ? void 0 : cn(n.kind === "endpoint" ? {
1336
+ let t = this.getSelectedLine(), n = t === void 0 ? void 0 : tn(t, e);
1337
+ return t === void 0 || n === void 0 ? void 0 : ln(n.kind === "endpoint" ? {
1276
1338
  kind: "endpoint",
1277
1339
  lineId: t.id
1278
1340
  } : {
@@ -1284,20 +1346,20 @@ var xn = class extends n {
1284
1346
  drawLinePointerDown(e) {
1285
1347
  let t = this.interaction;
1286
1348
  if (t?.type === "draw-line") {
1287
- this.setInteraction(pn(t, this.clampToField(e)));
1349
+ this.setInteraction(mn(t, this.clampToField(e)));
1288
1350
  return;
1289
1351
  }
1290
- if (!je("draw-line", this.getViewState())) return;
1291
- let n = qt(this.model.getSnapshot().players, e);
1292
- n !== void 0 && this.setInteraction(fn(n));
1352
+ if (!_("draw-line", this.getViewState())) return;
1353
+ let n = Jt(this.model.getSnapshot().players, e);
1354
+ n !== void 0 && this.setInteraction(pn(n));
1293
1355
  }
1294
1356
  addPlayerAt(e) {
1295
- if (!je("add-player", this.getViewState())) return;
1357
+ if (!_("add-player", this.getViewState())) return;
1296
1358
  let { players: t } = this.model.getSnapshot(), n = this.ids.next("player", new Set(t.map((e) => e.id)));
1297
- this.commands.execute(new kt({
1359
+ this.commands.execute(new jt({
1298
1360
  id: n,
1299
1361
  position: this.clampToField(e),
1300
- shape: f,
1362
+ shape: p,
1301
1363
  label: ""
1302
1364
  })), this.setSelection({
1303
1365
  kind: "player",
@@ -1306,22 +1368,22 @@ var xn = class extends n {
1306
1368
  }
1307
1369
  };
1308
1370
  // src/common/editing/play-session.ts
1309
- function Sn(e) {
1310
- let n = new t(), r = n.add(new vt(e)), i = new Ne(r, new Pe());
1371
+ function Cn(e) {
1372
+ let t = new n(), r = t.add(new bt(e)), i = new Ne(r, new Pe());
1311
1373
  return {
1312
- store: n,
1374
+ store: t,
1313
1375
  model: r,
1314
- controller: n.add(new xn(r, i, new Ve()))
1376
+ controller: t.add(new Sn(r, i, new Be()))
1315
1377
  };
1316
1378
  }
1317
- var Cn = class extends n {
1318
- _onDidReset = this._register(new _());
1379
+ var wn = class extends r {
1380
+ _onDidReset = this._register(new v());
1319
1381
  onDidReset = this._onDidReset.event;
1320
- _onDidEdit = this._register(new _());
1382
+ _onDidEdit = this._register(new v());
1321
1383
  onDidChange = (e) => this._onDidEdit.event(() => e(this.getPlayData()));
1322
- _onDidChangeScene = this._register(new _());
1384
+ _onDidChangeScene = this._register(new v());
1323
1385
  onDidChangeScene = this._onDidChangeScene.event;
1324
- _onDidChangeViewState = this._register(new _());
1386
+ _onDidChangeViewState = this._register(new v());
1325
1387
  onDidChangeViewState = this._onDidChangeViewState.event;
1326
1388
  document;
1327
1389
  constructor(e) {
@@ -1343,28 +1405,28 @@ var Cn = class extends n {
1343
1405
  this.document.controller.setFieldZone(e);
1344
1406
  }
1345
1407
  loadFormation(e) {
1346
- let t = ze(e);
1408
+ let t = Re(e);
1347
1409
  return t !== null && this.document.controller.loadFormation(t);
1348
1410
  }
1349
1411
  setPlayData(e) {
1350
1412
  this.document.store.dispose(), this.document = this.open(e), this._onDidReset.fire(), this._onDidChangeScene.fire(), this._onDidChangeViewState.fire();
1351
1413
  }
1352
1414
  open(e) {
1353
- let t = Sn(e), { store: n, model: r, controller: i } = t;
1415
+ let t = Cn(e), { store: n, model: r, controller: i } = t;
1354
1416
  return n.add(r.onDidChange(() => this._onDidEdit.fire())), n.add(i.onDidChangeScene(() => this._onDidChangeScene.fire())), n.add(i.onDidChangeViewState(() => this._onDidChangeViewState.fire())), t;
1355
1417
  }
1356
1418
  dispose() {
1357
1419
  this.document.store.dispose(), super.dispose();
1358
1420
  }
1359
- }, wn = 1600, Tn = 4096;
1360
- function En(e) {
1361
- return !s(e) || e < 1 ? wn : Math.min(Math.round(e), Tn);
1421
+ }, Tn = 1600, En = 4096;
1422
+ function Dn(e) {
1423
+ return !c(e) || e < 1 ? Tn : Math.min(Math.round(e), En);
1362
1424
  }
1363
- function Dn(e, t = {}) {
1364
- let n = En(t.width);
1425
+ function On(e, t = {}) {
1426
+ let n = Dn(t.width);
1365
1427
  return {
1366
1428
  width: n,
1367
- height: Math.round(n / It(e))
1429
+ height: Math.round(n / Rt(e))
1368
1430
  };
1369
1431
  }
1370
1432
  // src/common/presets/alignments.ts
@@ -1399,26 +1461,26 @@ var A = {
1399
1461
  n: E(25.5, 1.5),
1400
1462
  t: E(30, 1.5),
1401
1463
  eR: E(32.5, 1.5)
1402
- }, M = E(35.5, 1.5), N = {
1464
+ }, M = E(35.5, 1.5), kn = {
1403
1465
  eL: E(22.5, 1.5),
1404
1466
  n: E(26.5, 1.5),
1405
1467
  eR: E(30.5, 1.5)
1406
- }, P = {
1468
+ }, N = {
1407
1469
  w: E(22.5, 5),
1408
1470
  m: E(27, 5),
1409
1471
  s: E(34.5, 5)
1410
- }, F = {
1472
+ }, P = {
1411
1473
  m: E(24, 5),
1412
1474
  w: E(30, 5),
1413
1475
  nb: E(14, 5)
1414
1476
  };
1415
- function I(e) {
1477
+ function F(e) {
1416
1478
  return {
1417
1479
  left: E(6.5, e),
1418
1480
  right: E(46.5, e)
1419
1481
  };
1420
1482
  }
1421
- function L() {
1483
+ function I() {
1422
1484
  return [
1423
1485
  D("lt", "LT", A.lt, "square"),
1424
1486
  D("lg", "LG", A.lg, "square"),
@@ -1427,7 +1489,7 @@ function L() {
1427
1489
  D("rt", "RT", A.rt, "square")
1428
1490
  ];
1429
1491
  }
1430
- function R(e = j.eR) {
1492
+ function L(e = j.eR) {
1431
1493
  return [
1432
1494
  D("de-l", "E", j.eL),
1433
1495
  D("dt-l", "N", j.n),
@@ -1435,20 +1497,20 @@ function R(e = j.eR) {
1435
1497
  D("de-r", "E", e)
1436
1498
  ];
1437
1499
  }
1438
- function On() {
1500
+ function An() {
1439
1501
  return [
1440
- D("de-l", "E", N.eL),
1441
- D("nt", "N", N.n),
1442
- D("de-r", "E", N.eR)
1502
+ D("de-l", "E", kn.eL),
1503
+ D("nt", "N", kn.n),
1504
+ D("de-r", "E", kn.eR)
1443
1505
  ];
1444
1506
  }
1445
- function z(e) {
1446
- let { left: t, right: n } = I(e);
1507
+ function R(e) {
1508
+ let { left: t, right: n } = F(e);
1447
1509
  return [D("cb-l", "CB", t), D("cb-r", "CB", n)];
1448
1510
  }
1449
- function B() {
1511
+ function jn() {
1450
1512
  return [
1451
- ...L(),
1513
+ ...I(),
1452
1514
  D("y", "Y", E(34.5, -1), "square"),
1453
1515
  D("qb", "QB", E(26.5, -3)),
1454
1516
  D("fb", "FB", E(26.5, -6)),
@@ -1457,9 +1519,9 @@ function B() {
1457
1519
  D("z", "Z", E(46.5, -2))
1458
1520
  ];
1459
1521
  }
1460
- function V() {
1522
+ function z() {
1461
1523
  return [
1462
- ...L(),
1524
+ ...I(),
1463
1525
  D("y", "Y", E(34.5, -1), "square"),
1464
1526
  D("qb", "QB", E(26.5, -3)),
1465
1527
  D("rb", "RB", E(26.5, -7.5)),
@@ -1468,9 +1530,9 @@ function V() {
1468
1530
  D("z", "Z", E(47, -1))
1469
1531
  ];
1470
1532
  }
1471
- function H() {
1533
+ function B() {
1472
1534
  return [
1473
- ...L(),
1535
+ ...I(),
1474
1536
  D("qb", "QB", E(26.5, -5)),
1475
1537
  D("rb", "RB", E(29.5, -5)),
1476
1538
  D("x", "X", E(5.5, -1)),
@@ -1479,9 +1541,9 @@ function H() {
1479
1541
  D("z", "Z", E(47.5, -1))
1480
1542
  ];
1481
1543
  }
1482
- function kn() {
1544
+ function Mn() {
1483
1545
  return [
1484
- ...L(),
1546
+ ...I(),
1485
1547
  D("qb", "QB", E(26.5, -5)),
1486
1548
  D("rb", "RB", E(24, -5)),
1487
1549
  D("x", "X", E(5.5, -1)),
@@ -1490,9 +1552,9 @@ function kn() {
1490
1552
  D("z", "Z", E(47.5, -1))
1491
1553
  ];
1492
1554
  }
1493
- function An() {
1555
+ function Nn() {
1494
1556
  return [
1495
- ...L(),
1557
+ ...I(),
1496
1558
  D("qb", "QB", E(26.5, -5)),
1497
1559
  D("x", "X", E(5, -1)),
1498
1560
  D("f", "F", E(12, -2)),
@@ -1501,9 +1563,9 @@ function An() {
1501
1563
  D("z", "Z", E(48, -1))
1502
1564
  ];
1503
1565
  }
1504
- function jn() {
1566
+ function Pn() {
1505
1567
  return [
1506
- ...L(),
1568
+ ...I(),
1507
1569
  D("y", "Y", E(34.5, -1), "square"),
1508
1570
  D("qb", "QB", E(26.5, -4.5)),
1509
1571
  D("rb", "RB", E(26.5, -7.5)),
@@ -1512,9 +1574,9 @@ function jn() {
1512
1574
  D("z", "Z", E(47, -1))
1513
1575
  ];
1514
1576
  }
1515
- function Mn() {
1577
+ function Fn() {
1516
1578
  return [
1517
- ...L(),
1579
+ ...I(),
1518
1580
  D("qb", "QB", E(26.5, -5)),
1519
1581
  D("rb", "RB", E(24, -5)),
1520
1582
  D("x", "X", E(5.5, -1)),
@@ -1523,114 +1585,114 @@ function Mn() {
1523
1585
  D("y", "Y", E(39.5, -2))
1524
1586
  ];
1525
1587
  }
1526
- function U() {
1588
+ function V() {
1527
1589
  return [
1528
- ...R(M),
1529
- D("wlb", "W", P.w),
1530
- D("mlb", "M", P.m),
1531
- D("slb", "S", P.s),
1532
- ...z(6),
1590
+ ...L(M),
1591
+ D("wlb", "W", N.w),
1592
+ D("mlb", "M", N.m),
1593
+ D("slb", "S", N.s),
1594
+ ...R(6),
1533
1595
  D("fs", "FS", E(23, 11)),
1534
1596
  D("ss", "SS", E(32, 9))
1535
1597
  ];
1536
1598
  }
1537
- function Nn() {
1599
+ function In() {
1538
1600
  return [
1539
- ...On(),
1601
+ ...An(),
1540
1602
  D("wlb", "W", E(19, 2.5)),
1541
1603
  D("mlb", "M", E(24.5, 5)),
1542
1604
  D("tlb", "T", E(29, 5)),
1543
1605
  D("slb", "S", E(34.5, 2.5)),
1544
- ...z(6),
1606
+ ...R(6),
1545
1607
  D("fs", "FS", E(23, 11)),
1546
1608
  D("ss", "SS", E(30, 11))
1547
1609
  ];
1548
1610
  }
1549
- function Pn(e = j.eR) {
1611
+ function Ln(e = j.eR) {
1550
1612
  return [
1551
- ...R(e),
1552
- D("mlb", "M", F.m),
1553
- D("wlb", "W", F.w)
1613
+ ...L(e),
1614
+ D("mlb", "M", P.m),
1615
+ D("wlb", "W", P.w)
1554
1616
  ];
1555
1617
  }
1556
- var W = {
1618
+ var H = {
1557
1619
  cornerDepth: 6,
1558
1620
  fs: E(22, 11),
1559
1621
  ss: E(31, 11)
1560
1622
  };
1561
- function G(e, t = j.eR) {
1623
+ function U(e, t = j.eR) {
1562
1624
  return [
1563
- ...Pn(t),
1564
- D("nb", "NB", F.nb),
1565
- ...z(e.cornerDepth),
1625
+ ...Ln(t),
1626
+ D("nb", "NB", P.nb),
1627
+ ...R(e.cornerDepth),
1566
1628
  D("fs", "FS", e.fs),
1567
1629
  D("ss", "SS", e.ss)
1568
1630
  ];
1569
1631
  }
1570
- function Fn() {
1632
+ function Rn() {
1571
1633
  return [
1572
- ...R(),
1634
+ ...L(),
1573
1635
  D("mlb", "M", E(27, 5)),
1574
- D("nb", "NB", F.nb),
1636
+ D("nb", "NB", P.nb),
1575
1637
  D("db", "$", E(39, 5)),
1576
- ...z(6),
1638
+ ...R(6),
1577
1639
  D("fs", "FS", E(22, 11)),
1578
1640
  D("ss", "SS", E(31, 11))
1579
1641
  ];
1580
1642
  }
1581
- function In() {
1643
+ function zn() {
1582
1644
  return [
1583
- ...R(),
1645
+ ...L(),
1584
1646
  D("mlb", "M", E(24.5, 5)),
1585
- D("wlb", "W", F.w),
1647
+ D("wlb", "W", P.w),
1586
1648
  D("nb", "NB", E(39, 5)),
1587
- ...z(6),
1649
+ ...R(6),
1588
1650
  D("fs", "FS", E(23, 11)),
1589
1651
  D("ss", "SS", E(31, 9))
1590
1652
  ];
1591
1653
  }
1592
- function Ln() {
1654
+ function Bn() {
1593
1655
  return [
1594
- ...On(),
1656
+ ...An(),
1595
1657
  D("wlb", "W", E(20.5, 5)),
1596
1658
  D("mlb", "M", E(26.5, 5)),
1597
1659
  D("slb", "S", E(32.5, 5)),
1598
- D("nb", "NB", F.nb),
1599
- ...z(6),
1660
+ D("nb", "NB", P.nb),
1661
+ ...R(6),
1600
1662
  D("fs", "FS", E(23, 11)),
1601
1663
  D("ss", "SS", E(31, 9))
1602
1664
  ];
1603
1665
  }
1604
1666
  // src/common/formations/presets.ts
1605
- function K(e, t, n, r) {
1667
+ function W(e, t, n, r) {
1606
1668
  return {
1607
1669
  id: e,
1608
1670
  name: t,
1609
1671
  side: n,
1610
- players: r.map(Re)
1672
+ players: r.map(Le)
1611
1673
  };
1612
1674
  }
1613
- var Rn = /* @__PURE__ */ Le([
1614
- K("i-formation", "I-Formation", "offense", B()),
1615
- K("singleback-ace", "Singleback Ace", "offense", V()),
1616
- K("shotgun-spread", "Shotgun Spread", "offense", H()),
1617
- K("trips", "Trips", "offense", kn()),
1618
- K("empty", "Empty", "offense", An()),
1619
- K("pistol", "Pistol", "offense", jn()),
1620
- K("bunch", "Bunch", "offense", Mn()),
1621
- K("defense-4-3", "4-3 Over", "defense", U()),
1622
- K("defense-3-4", "3-4", "defense", Nn()),
1623
- K("defense-nickel", "Nickel", "defense", G(W)),
1624
- K("defense-dime", "Dime", "defense", Fn()),
1625
- K("defense-4-2-5", "4-2-5", "defense", In()),
1626
- K("defense-3-3-5", "3-3-5", "defense", Ln())
1675
+ var Vn = /* @__PURE__ */ y([
1676
+ W("i-formation", "I-Formation", "offense", jn()),
1677
+ W("singleback-ace", "Singleback Ace", "offense", z()),
1678
+ W("shotgun-spread", "Shotgun Spread", "offense", B()),
1679
+ W("trips", "Trips", "offense", Mn()),
1680
+ W("empty", "Empty", "offense", Nn()),
1681
+ W("pistol", "Pistol", "offense", Pn()),
1682
+ W("bunch", "Bunch", "offense", Fn()),
1683
+ W("defense-4-3", "4-3 Over", "defense", V()),
1684
+ W("defense-3-4", "3-4", "defense", In()),
1685
+ W("defense-nickel", "Nickel", "defense", U(H)),
1686
+ W("defense-dime", "Dime", "defense", Rn()),
1687
+ W("defense-4-2-5", "4-2-5", "defense", zn()),
1688
+ W("defense-3-3-5", "3-3-5", "defense", Bn())
1627
1689
  ]);
1628
- function zn(e) {
1629
- return Rn.find((t) => t.id === e);
1690
+ function Hn(e) {
1691
+ return Vn.find((t) => t.id === e);
1630
1692
  }
1631
1693
  // src/common/geometry/line-decoration.ts
1632
- var Bn = .9;
1633
- function Vn(e) {
1694
+ var Un = .9;
1695
+ function Wn(e) {
1634
1696
  let t = e.at(-1);
1635
1697
  if (t !== void 0) for (let n = e.length - 2; n >= 0; n--) {
1636
1698
  let r = e[n];
@@ -1644,11 +1706,11 @@ function Vn(e) {
1644
1706
  }
1645
1707
  }
1646
1708
  }
1647
- function Hn(e, t) {
1648
- return Ht(e, t, Bn);
1709
+ function Gn(e, t) {
1710
+ return Ut(e, t, Un);
1649
1711
  }
1650
- function Un(e, t, n) {
1651
- let r = Vn(e);
1712
+ function Kn(e, t, n) {
1713
+ let r = Wn(e);
1652
1714
  if (r === void 0) return;
1653
1715
  let { tip: i, ux: a, uy: o } = r, s = i.x - t * a, c = i.y - t * o;
1654
1716
  return [
@@ -1663,8 +1725,8 @@ function Un(e, t, n) {
1663
1725
  }
1664
1726
  ];
1665
1727
  }
1666
- function Wn(e, t) {
1667
- let n = Vn(e);
1728
+ function qn(e, t) {
1729
+ let n = Wn(e);
1668
1730
  if (n === void 0) return;
1669
1731
  let { tip: r, ux: i, uy: a } = n, o = t / 2;
1670
1732
  return [{
@@ -1676,12 +1738,12 @@ function Wn(e, t) {
1676
1738
  }];
1677
1739
  }
1678
1740
  // src/common/geometry/player-marker.ts
1679
- var Gn = .82;
1680
- function Kn(e, t) {
1741
+ var Jn = .82;
1742
+ function Yn(e, t) {
1681
1743
  switch (e) {
1682
1744
  case "circle": return {
1683
1745
  kind: "circle",
1684
- radius: t * Gn
1746
+ radius: t * Jn
1685
1747
  };
1686
1748
  case "square": return {
1687
1749
  kind: "square",
@@ -1690,12 +1752,12 @@ function Kn(e, t) {
1690
1752
  }
1691
1753
  }
1692
1754
  // src/common/input/keymap.ts
1693
- function qn(e) {
1755
+ function Xn(e) {
1694
1756
  let t = e.metaKey || e.ctrlKey, n = e.key.toLowerCase();
1695
1757
  return e.key === "Escape" ? "cancel-interaction" : e.key === "Enter" ? "commit-line" : t && n === "z" ? e.shiftKey ? "redo" : "undo" : t && n === "y" ? "redo" : null;
1696
1758
  }
1697
1759
  // src/common/plays/presets.ts
1698
- function q(e, t, n, r, i, a) {
1760
+ function G(e, t, n, r, i, a) {
1699
1761
  return {
1700
1762
  id: e,
1701
1763
  kind: t,
@@ -1705,7 +1767,7 @@ function q(e, t, n, r, i, a) {
1705
1767
  interpolation: a
1706
1768
  };
1707
1769
  }
1708
- function J(e, t, n, r, i, a, o, s) {
1770
+ function K(e, t, n, r, i, a, o, s) {
1709
1771
  return {
1710
1772
  id: e,
1711
1773
  name: t,
@@ -1715,267 +1777,331 @@ function J(e, t, n, r, i, a, o, s) {
1715
1777
  summary: a,
1716
1778
  data: {
1717
1779
  version: 2,
1718
- field: v("middle"),
1780
+ field: b("middle"),
1719
1781
  players: o,
1720
1782
  lines: s
1721
1783
  }
1722
1784
  };
1723
1785
  }
1724
- var Jn = {
1786
+ var Zn = {
1725
1787
  cornerDepth: 5,
1726
1788
  fs: E(18, 12),
1727
1789
  ss: E(35, 12)
1728
- }, Y = {
1790
+ }, q = {
1729
1791
  cornerDepth: 7,
1730
1792
  fs: E(26.5, 12),
1731
1793
  ss: E(34, 6)
1732
- }, Yn = /* @__PURE__ */ Le([
1733
- J("play-inside-zone", "Inside Zone", "offense", "run-zone", "11 pers", "ゾーンブロックで内側を一気に。RB は RG の内側を狙い、3 テクの動きで B ギャップか裏の A ギャップへ切る。", [
1734
- ...L(),
1794
+ }, Qn = /* @__PURE__ */ y([
1795
+ K("play-inside-zone", "Inside Zone", "offense", "run-zone", "11 pers", "Zone blocking, hitting inside in one motion. The RB aims inside the RG and cuts to the B gap or the backside A gap off the 3-technique's movement.", [
1796
+ ...I(),
1735
1797
  D("y", "Y", E(34.5, -1), "square"),
1736
1798
  D("qb", "QB", E(26.5, -5)),
1737
1799
  D("rb", "RB", E(24, -5)),
1738
1800
  D("x", "X", E(6, -1)),
1739
1801
  D("h", "H", E(40, -2)),
1740
1802
  D("z", "Z", E(47, -1)),
1741
- ...U()
1803
+ ...V()
1742
1804
  ], [
1743
- q("bl-lt", "block", "lt", [], O(j.eL), "straight"),
1744
- q("bl-lg", "block", "lg", [], O(j.n), "straight"),
1745
- q("bl-c", "block", "c", [k(j.n, 1)], O(P.m), "bezier"),
1746
- q("bl-rg", "block", "rg", [], O(j.t), "straight"),
1747
- q("bl-rt", "block", "rt", [k(j.t, 1.5)], O(P.s), "bezier"),
1748
- q("bl-y", "block", "y", [], O(M), "straight"),
1749
- q("run-rb", "route", "rb", [E(27.5, -2)], E(28, 3.5), "bezier")
1805
+ G("bl-lt", "block", "lt", [], O(j.eL), "straight"),
1806
+ G("bl-lg", "block", "lg", [], O(j.n), "straight"),
1807
+ G("bl-c", "block", "c", [k(j.n, 1)], O(N.m), "bezier"),
1808
+ G("bl-rg", "block", "rg", [], O(j.t), "straight"),
1809
+ G("bl-rt", "block", "rt", [k(j.t, 1.5)], O(N.s), "bezier"),
1810
+ G("bl-y", "block", "y", [], O(M), "straight"),
1811
+ G("run-rb", "route", "rb", [E(27.5, -2)], E(28, 3.5), "bezier")
1750
1812
  ]),
1751
- J("play-outside-zone", "Outside Zone", "offense", "run-zone", "11 pers", "ワイドゾーンで横へ伸ばす。RB は TE の外側を狙い、E と S の動きで外へ出るか縦に切り返す。", [...V(), ...U()], [
1752
- q("bl-lt", "block", "lt", [], O(j.eL), "straight"),
1753
- q("bl-lg", "block", "lg", [], O(j.n), "straight"),
1754
- q("bl-c", "block", "c", [k(j.n, 1)], O(P.m, .5), "bezier"),
1755
- q("bl-rg", "block", "rg", [], O(j.t, .5), "straight"),
1756
- q("bl-rt", "block", "rt", [k(j.t, 1.5)], O(P.s, .5), "bezier"),
1757
- q("bl-y", "block", "y", [], O(M, .5), "straight"),
1758
- q("run-rb", "route", "rb", [E(31, -5), E(35.5, -2)], E(37.5, 3), "bezier")
1813
+ K("play-outside-zone", "Outside Zone", "offense", "run-zone", "11 pers", "Wide zone, stretching the defense sideways. The RB aims outside the TE and bounces out or cuts upfield off the E and S.", [...z(), ...V()], [
1814
+ G("bl-lt", "block", "lt", [], O(j.eL), "straight"),
1815
+ G("bl-lg", "block", "lg", [], O(j.n), "straight"),
1816
+ G("bl-c", "block", "c", [k(j.n, 1)], O(N.m, .5), "bezier"),
1817
+ G("bl-rg", "block", "rg", [], O(j.t, .5), "straight"),
1818
+ G("bl-rt", "block", "rt", [k(j.t, 1.5)], O(N.s, .5), "bezier"),
1819
+ G("bl-y", "block", "y", [], O(M, .5), "straight"),
1820
+ G("run-rb", "route", "rb", [E(31, -5), E(35.5, -2)], E(37.5, 3), "bezier")
1759
1821
  ]),
1760
- J("play-power", "Power", "offense", "run-gap", "21 pers", "プレイサイドはダウンブロック、FB が 9 テクの E をキックアウト、バックサイドガードがプルして C ギャップをリードする。", [...B(), ...U()], [
1761
- q("bl-y", "block", "y", [], O(P.s), "straight"),
1762
- q("bl-rt", "block", "rt", [], O(j.t, .5), "straight"),
1763
- q("bl-rg", "block", "rg", [k(j.t, -1.5)], O(P.m), "bezier"),
1764
- q("bl-c", "block", "c", [], O(j.n), "straight"),
1765
- q("bl-lt", "block", "lt", [], O(j.eL), "straight"),
1766
- q("lead-fb", "block", "fb", [E(31, -3.5), E(33.5, -.5)], O(M, -.5), "bezier"),
1767
- q("pull-lg", "block", "lg", [
1822
+ K("play-power", "Power", "offense", "run-gap", "21 pers", "Down blocks on the play side, the FB kicks out the 9-technique E, and the backside guard pulls to lead through the C gap.", [...jn(), ...V()], [
1823
+ G("bl-y", "block", "y", [], O(N.s), "straight"),
1824
+ G("bl-rt", "block", "rt", [], O(j.t, .5), "straight"),
1825
+ G("bl-rg", "block", "rg", [k(j.t, -1.5)], O(N.m), "bezier"),
1826
+ G("bl-c", "block", "c", [], O(j.n), "straight"),
1827
+ G("bl-lt", "block", "lt", [], O(j.eL), "straight"),
1828
+ G("lead-fb", "block", "fb", [E(31, -3.5), E(33.5, -.5)], O(M, -.5), "bezier"),
1829
+ G("pull-lg", "block", "lg", [
1768
1830
  E(25, -4),
1769
1831
  E(31, -4),
1770
1832
  E(32.5, -2),
1771
1833
  E(32.5, 1)
1772
1834
  ], E(31.5, 3.5), "bezier"),
1773
- q("run-rb", "route", "rb", [E(30, -6), E(33, -3)], E(33.5, 4), "bezier")
1835
+ G("run-rb", "route", "rb", [E(30, -6), E(33, -3)], E(33.5, 4), "bezier")
1774
1836
  ]),
1775
- J("play-counter", "Counter (GT)", "offense", "run-gap", "21 pers", "バックサイドのガードが 9 テクの E をキックアウト、タックルが C ギャップへ巻き込み、FB がタックルの跡を埋める(GT カウンター)。", [...B(), ...U()], [
1776
- q("bl-y", "block", "y", [], O(P.s), "straight"),
1777
- q("bl-rt", "block", "rt", [], O(j.t, .5), "straight"),
1778
- q("bl-rg", "block", "rg", [k(j.t, -1.5)], O(P.m), "bezier"),
1779
- q("bl-c", "block", "c", [], O(j.n), "straight"),
1780
- q("pull-lg", "block", "lg", [
1837
+ K("play-counter", "Counter (GT)", "offense", "run-gap", "21 pers", "The backside guard kicks out the 9-technique E, the tackle wraps through the C gap, and the FB fills where the tackle left (GT counter).", [...jn(), ...V()], [
1838
+ G("bl-y", "block", "y", [], O(N.s), "straight"),
1839
+ G("bl-rt", "block", "rt", [], O(j.t, .5), "straight"),
1840
+ G("bl-rg", "block", "rg", [k(j.t, -1.5)], O(N.m), "bezier"),
1841
+ G("bl-c", "block", "c", [], O(j.n), "straight"),
1842
+ G("pull-lg", "block", "lg", [
1781
1843
  E(25, -4),
1782
1844
  E(32, -4),
1783
1845
  E(33.5, -.5)
1784
1846
  ], O(M, -.5), "straight"),
1785
- q("pull-lt", "block", "lt", [
1847
+ G("pull-lt", "block", "lt", [
1786
1848
  E(23, -5),
1787
1849
  E(31, -5),
1788
1850
  E(32.5, -2),
1789
1851
  E(32.5, 1)
1790
1852
  ], E(31.5, 3.5), "straight"),
1791
- q("fill-fb", "block", "fb", [E(24, -3), E(22.5, -.5)], O(j.eL, 1), "bezier"),
1792
- q("run-rb", "route", "rb", [
1853
+ G("fill-fb", "block", "fb", [E(24, -3), E(22.5, -.5)], O(j.eL, 1), "bezier"),
1854
+ G("run-rb", "route", "rb", [
1793
1855
  E(24, -7.5),
1794
1856
  E(30, -6.5),
1795
1857
  E(33, -3)
1796
1858
  ], E(33.5, 4), "bezier")
1797
1859
  ]),
1798
- J("play-four-verticals", "Four Verticals", "offense", "pass-deep", "10 pers", "トリップスから 4 本の縦。対シングルハイのシームで勝負する。", [...kn(), ...G(Y, M)], [
1799
- q("go-x", "route", "x", [E(4, 4)], E(4, 13), "straight"),
1800
- q("seam-y", "route", "y", [E(33, 5)], E(31, 13), "bezier"),
1801
- q("seam-h", "route", "h", [E(40, 5)], E(38, 13), "bezier"),
1802
- q("go-z", "route", "z", [E(49, 4)], E(49, 13), "straight"),
1803
- q("chk-rb", "route", "rb", [], E(20, -3), "straight")
1860
+ K("play-four-verticals", "Four Verticals", "offense", "pass-deep", "10 pers", "Four verticals from trips, attacking the seams against a single-high safety.", [...Mn(), ...U(q, M)], [
1861
+ G("go-x", "route", "x", [E(4, 4)], E(4, 13), "straight"),
1862
+ G("seam-y", "route", "y", [E(33, 5)], E(31, 13), "bezier"),
1863
+ G("seam-h", "route", "h", [E(40, 5)], E(38, 13), "bezier"),
1864
+ G("go-z", "route", "z", [E(49, 4)], E(49, 13), "straight"),
1865
+ G("chk-rb", "route", "rb", [], E(20, -3), "straight")
1804
1866
  ]),
1805
- J("play-mesh", "Mesh", "offense", "pass-dropback", "10 pers", "浅いクロスの交差。対マン/ゾーン両対応で空いた所へ運ぶ。", [...H(), ...G(W)], [
1806
- q("cross-y", "route", "y", [E(20, 3.5)], E(38, 4), "straight"),
1807
- q("cross-h", "route", "h", [E(33, 3)], E(15, 3.5), "straight"),
1808
- q("corner-x", "route", "x", [E(5, 5)], E(2, 9), "bezier"),
1809
- q("sit-z", "route", "z", [], E(47, 5), "straight"),
1810
- q("swing-rb", "route", "rb", [E(33, -4)], E(41, -3), "straight")
1867
+ K("play-mesh", "Mesh", "offense", "pass-dropback", "10 pers", "Shallow crossers that mesh. Works against man and zone by running to the open spot.", [...B(), ...U(H)], [
1868
+ G("cross-y", "route", "y", [E(20, 3.5)], E(38, 4), "straight"),
1869
+ G("cross-h", "route", "h", [E(33, 3)], E(15, 3.5), "straight"),
1870
+ G("corner-x", "route", "x", [E(5, 5)], E(2, 9), "bezier"),
1871
+ G("sit-z", "route", "z", [], E(47, 5), "straight"),
1872
+ G("swing-rb", "route", "rb", [E(33, -4)], E(41, -3), "straight")
1811
1873
  ]),
1812
- J("play-smash", "Smash", "offense", "pass-dropback", "11 pers", "コーナー+ヒッチのハイロー。対カバー 2 のコーナーを攻める。", [...V(), ...G(Jn, M)], [
1813
- q("hitch-z", "route", "z", [], E(47, 3), "straight"),
1814
- q("corner-h", "route", "h", [E(41, 4)], E(46, 10), "bezier"),
1815
- q("dig-y", "route", "y", [E(34.5, 8)], E(27, 9), "straight"),
1816
- q("hitch-x", "route", "x", [], E(6, 3), "straight"),
1817
- q("flat-rb", "route", "rb", [], E(22, -4), "straight")
1874
+ K("play-smash", "Smash", "offense", "pass-dropback", "11 pers", "A corner and hitch high-low that attacks the corner against Cover 2.", [...z(), ...U(Zn, M)], [
1875
+ G("hitch-z", "route", "z", [], E(47, 3), "straight"),
1876
+ G("corner-h", "route", "h", [E(41, 4)], E(46, 10), "bezier"),
1877
+ G("dig-y", "route", "y", [E(34.5, 8)], E(27, 9), "straight"),
1878
+ G("hitch-x", "route", "x", [], E(6, 3), "straight"),
1879
+ G("flat-rb", "route", "rb", [], E(22, -4), "straight")
1818
1880
  ]),
1819
- J("play-stick", "Stick", "offense", "pass-quick", "11 pers", "3 ステップの速攻。スティック(座り)+フラットで素早く配球する。", [...V(), ...G(W, M)], [
1820
- q("stick-y", "route", "y", [], E(34.5, 4), "straight"),
1821
- q("flat-h", "route", "h", [], E(45, 0), "straight"),
1822
- q("hitch-z", "route", "z", [], E(47, 3), "straight"),
1823
- q("slant-x", "route", "x", [E(6, 2)], E(10, 3), "bezier"),
1824
- q("chk-rb", "route", "rb", [], E(21, -5), "straight")
1881
+ K("play-stick", "Stick", "offense", "pass-quick", "11 pers", "A three-step quick game. Stick (sit down) and flat for a fast distribution.", [...z(), ...U(H, M)], [
1882
+ G("stick-y", "route", "y", [], E(34.5, 4), "straight"),
1883
+ G("flat-h", "route", "h", [], E(45, 0), "straight"),
1884
+ G("hitch-z", "route", "z", [], E(47, 3), "straight"),
1885
+ G("slant-x", "route", "x", [E(6, 2)], E(10, 3), "bezier"),
1886
+ G("chk-rb", "route", "rb", [], E(21, -5), "straight")
1825
1887
  ]),
1826
- J("play-rpo-bubble", "RPO (IZ + Bubble)", "offense", "rpo", "11 pers", "バブル側の W を読み、W がボックスに入ればバブル、残ればインサイドゾーンへ分岐する。", [...H(), ...G(W)], [
1827
- q("bl-lt", "block", "lt", [], O(j.eL), "straight"),
1828
- q("bl-lg", "block", "lg", [k(j.n, -1)], O(F.m), "bezier"),
1829
- q("bl-c", "block", "c", [], O(j.n), "straight"),
1830
- q("bl-rg", "block", "rg", [], O(j.t), "straight"),
1831
- q("bl-rt", "block", "rt", [], O(j.eR), "straight"),
1832
- q("run-rb", "route", "rb", [E(26, -2.5)], E(23, 3), "straight"),
1833
- q("bubble-h", "route", "h", [E(43, -3)], E(46, -.5), "bezier"),
1834
- q("bl-z", "block", "z", [], O(I(W.cornerDepth).right), "straight"),
1835
- q("glance-y", "route", "y", [E(15, 1)], E(19, 3), "bezier")
1888
+ K("play-rpo-bubble", "RPO (IZ + Bubble)", "offense", "rpo", "11 pers", "Reads the W on the bubble side: bubble if the W enters the box, inside zone if he stays.", [...B(), ...U(H)], [
1889
+ G("bl-lt", "block", "lt", [], O(j.eL), "straight"),
1890
+ G("bl-lg", "block", "lg", [k(j.n, -1)], O(P.m), "bezier"),
1891
+ G("bl-c", "block", "c", [], O(j.n), "straight"),
1892
+ G("bl-rg", "block", "rg", [], O(j.t), "straight"),
1893
+ G("bl-rt", "block", "rt", [], O(j.eR), "straight"),
1894
+ G("run-rb", "route", "rb", [E(26, -2.5)], E(23, 3), "straight"),
1895
+ G("bubble-h", "route", "h", [E(43, -3)], E(46, -.5), "bezier"),
1896
+ G("bl-z", "block", "z", [], O(F(H.cornerDepth).right), "straight"),
1897
+ G("glance-y", "route", "y", [E(15, 1)], E(19, 3), "bezier")
1836
1898
  ]),
1837
- J("play-pa-boot", "PA Boot (Sail)", "offense", "pa", "11 pers", "プレイアクションで QB がブートし、フラット/セイル/縦の 3 段で攻める。", [...V(), ...U()], [
1838
- q("fake-rb", "motion", "rb", [E(24, -6)], E(20.5, -4.5), "straight"),
1839
- q("boot-qb", "route", "qb", [E(31, -4)], E(36.5, -5), "bezier"),
1840
- q("bl-lt", "block", "lt", [], O(j.eL), "straight"),
1841
- q("bl-c", "block", "c", [], O(j.n), "straight"),
1842
- q("bl-rg", "block", "rg", [], O(j.t), "straight"),
1843
- q("flat-y", "route", "y", [E(37, -.5)], E(43, .5), "bezier"),
1844
- q("sail-h", "route", "h", [E(41, 3)], E(46, 8), "bezier"),
1845
- q("go-z", "route", "z", [E(49, 3)], E(49, 13), "straight"),
1846
- q("comeback-x", "route", "x", [E(5, 9)], E(7.5, 7.5), "bezier")
1899
+ K("play-pa-boot", "PA Boot (Sail)", "offense", "pa", "11 pers", "Play action with the QB booting out, attacking in three levels: flat, sail, and vertical.", [...z(), ...V()], [
1900
+ G("fake-rb", "motion", "rb", [E(24, -6)], E(20.5, -4.5), "straight"),
1901
+ G("boot-qb", "route", "qb", [E(31, -4)], E(36.5, -5), "bezier"),
1902
+ G("bl-lt", "block", "lt", [], O(j.eL), "straight"),
1903
+ G("bl-c", "block", "c", [], O(j.n), "straight"),
1904
+ G("bl-rg", "block", "rg", [], O(j.t), "straight"),
1905
+ G("flat-y", "route", "y", [E(37, -.5)], E(43, .5), "bezier"),
1906
+ G("sail-h", "route", "h", [E(41, 3)], E(46, 8), "bezier"),
1907
+ G("go-z", "route", "z", [E(49, 3)], E(49, 13), "straight"),
1908
+ G("comeback-x", "route", "x", [E(5, 9)], E(7.5, 7.5), "bezier")
1847
1909
  ]),
1848
- J("play-cover-1", "Cover 1 (Man Free)", "defense", "coverage", "Nickel", "1 ディープのフリーセイフティを残し、残りは全マン。W は穴(ラット)で待つ。", [...G({
1910
+ K("play-cover-1", "Cover 1 (Man Free)", "defense", "coverage", "Nickel", "One deep free safety, everyone else in man. The W waits in the hole (rat).", [...U({
1849
1911
  cornerDepth: 6,
1850
1912
  fs: E(26.5, 11),
1851
1913
  ss: E(38, 6)
1852
- }), ...H()], [
1853
- q("man-cbl", "motion", "cb-l", [], E(5.5, .5), "straight"),
1854
- q("man-cbr", "motion", "cb-r", [], E(47.5, .5), "straight"),
1855
- q("man-nb", "motion", "nb", [], E(13, -.5), "straight"),
1856
- q("man-ss", "motion", "ss", [], E(40, -.5), "straight"),
1857
- q("man-mlb", "motion", "mlb", [E(27.5, 2.5), E(27.5, -2.5)], E(29, -3.5), "straight"),
1858
- q("rat-wlb", "motion", "wlb", [], E(27.5, 3.5), "straight"),
1859
- q("free-fs", "motion", "fs", [], E(26.5, 13), "straight")
1914
+ }), ...B()], [
1915
+ G("man-cbl", "motion", "cb-l", [], E(5.5, .5), "straight"),
1916
+ G("man-cbr", "motion", "cb-r", [], E(47.5, .5), "straight"),
1917
+ G("man-nb", "motion", "nb", [], E(13, -.5), "straight"),
1918
+ G("man-ss", "motion", "ss", [], E(40, -.5), "straight"),
1919
+ G("man-mlb", "motion", "mlb", [E(27.5, 2.5), E(27.5, -2.5)], E(29, -3.5), "straight"),
1920
+ G("rat-wlb", "motion", "wlb", [], E(27.5, 3.5), "straight"),
1921
+ G("free-fs", "motion", "fs", [], E(26.5, 13), "straight")
1860
1922
  ]),
1861
- J("play-cover-2", "Cover 2", "defense", "coverage", "Nickel", "2 ディープ 5 アンダーのゾーン。深いハーフを 2 人で分け、CB はフラットに座る。", [...G({
1923
+ K("play-cover-2", "Cover 2", "defense", "coverage", "Nickel", "Two-deep, five-under zone. Two safeties split the deep halves, and the CBs sit in the flats.", [...U({
1862
1924
  cornerDepth: 5,
1863
1925
  fs: E(15, 11),
1864
1926
  ss: E(38, 11)
1865
- }), ...H()], [
1866
- q("half-fs", "motion", "fs", [], E(13, 14), "straight"),
1867
- q("half-ss", "motion", "ss", [], E(40, 14), "straight"),
1868
- q("flat-cbl", "motion", "cb-l", [], E(9.5, 4), "straight"),
1869
- q("flat-cbr", "motion", "cb-r", [], E(43.5, 4), "straight"),
1870
- q("hook-mlb", "motion", "mlb", [], E(21.5, 10), "straight"),
1871
- q("hook-wlb", "motion", "wlb", [], E(32.5, 10), "straight"),
1872
- q("curl-nb", "motion", "nb", [], E(16, 9), "straight")
1927
+ }), ...B()], [
1928
+ G("half-fs", "motion", "fs", [], E(13, 14), "straight"),
1929
+ G("half-ss", "motion", "ss", [], E(40, 14), "straight"),
1930
+ G("flat-cbl", "motion", "cb-l", [], E(9.5, 4), "straight"),
1931
+ G("flat-cbr", "motion", "cb-r", [], E(43.5, 4), "straight"),
1932
+ G("hook-mlb", "motion", "mlb", [], E(21.5, 10), "straight"),
1933
+ G("hook-wlb", "motion", "wlb", [], E(32.5, 10), "straight"),
1934
+ G("curl-nb", "motion", "nb", [], E(16, 9), "straight")
1873
1935
  ]),
1874
- J("play-cover-3", "Cover 3", "defense", "coverage", "Nickel", "3 ディープ 4 アンダー。現代の基準となるシングルハイのゾーン。", [...G(Y), ...H()], [
1875
- q("deep-cbl", "motion", "cb-l", [], E(7, 13), "straight"),
1876
- q("deep-cbr", "motion", "cb-r", [], E(46, 13), "straight"),
1877
- q("deep-fs", "motion", "fs", [], E(26.5, 14), "straight"),
1878
- q("curl-nb", "motion", "nb", [], E(15.5, 9), "straight"),
1879
- q("hook-mlb", "motion", "mlb", [], E(22, 10), "straight"),
1880
- q("hook-wlb", "motion", "wlb", [], E(31, 10), "straight"),
1881
- q("flat-ss", "motion", "ss", [], E(39, 4), "straight")
1936
+ K("play-cover-3", "Cover 3", "defense", "coverage", "Nickel", "Three-deep, four-under. The single-high zone that is today's baseline.", [...U(q), ...B()], [
1937
+ G("deep-cbl", "motion", "cb-l", [], E(7, 13), "straight"),
1938
+ G("deep-cbr", "motion", "cb-r", [], E(46, 13), "straight"),
1939
+ G("deep-fs", "motion", "fs", [], E(26.5, 14), "straight"),
1940
+ G("curl-nb", "motion", "nb", [], E(15.5, 9), "straight"),
1941
+ G("hook-mlb", "motion", "mlb", [], E(22, 10), "straight"),
1942
+ G("hook-wlb", "motion", "wlb", [], E(31, 10), "straight"),
1943
+ G("flat-ss", "motion", "ss", [], E(39, 4), "straight")
1882
1944
  ]),
1883
- J("play-cover-4", "Cover 4 (Quarters)", "defense", "coverage", "Nickel", "4 ディープのクォーターズ。縦パスを上から踏み潰す。", [...G({
1945
+ K("play-cover-4", "Cover 4 (Quarters)", "defense", "coverage", "Nickel", "Four-deep quarters, stamping out vertical passes from above.", [...U({
1884
1946
  cornerDepth: 7,
1885
1947
  fs: E(20, 11),
1886
1948
  ss: E(33, 11)
1887
- }), ...H()], [
1888
- q("qtr-cbl", "motion", "cb-l", [], E(6, 13), "straight"),
1889
- q("qtr-cbr", "motion", "cb-r", [], E(47, 13), "straight"),
1890
- q("qtr-fs", "motion", "fs", [], E(18, 14), "straight"),
1891
- q("qtr-ss", "motion", "ss", [], E(35, 14), "straight"),
1892
- q("under-nb", "motion", "nb", [], E(16, 8), "straight"),
1893
- q("under-mlb", "motion", "mlb", [], E(23, 9), "straight"),
1894
- q("under-wlb", "motion", "wlb", [], E(31, 9), "straight")
1949
+ }), ...B()], [
1950
+ G("qtr-cbl", "motion", "cb-l", [], E(6, 13), "straight"),
1951
+ G("qtr-cbr", "motion", "cb-r", [], E(47, 13), "straight"),
1952
+ G("qtr-fs", "motion", "fs", [], E(18, 14), "straight"),
1953
+ G("qtr-ss", "motion", "ss", [], E(35, 14), "straight"),
1954
+ G("under-nb", "motion", "nb", [], E(16, 8), "straight"),
1955
+ G("under-mlb", "motion", "mlb", [], E(23, 9), "straight"),
1956
+ G("under-wlb", "motion", "wlb", [], E(31, 9), "straight")
1895
1957
  ]),
1896
- J("play-fire-zone", "Fire Zone", "defense", "pressure", "Nickel", "5 人ブリッツ+ライン 1 枚をドロップ、3 ディープ 3 アンダーで覆う。", [...G(Y), ...H()], [
1897
- q("rush-dtl", "route", "dt-l", [], E(25, 0), "straight"),
1898
- q("rush-dtr", "route", "dt-r", [], E(28.5, 0), "straight"),
1899
- q("rush-der", "route", "de-r", [], E(33, 0), "straight"),
1900
- q("blz-wlb", "route", "wlb", [E(31.5, 2.5)], E(31, 0), "bezier"),
1901
- q("blz-nb", "route", "nb", [E(17, 2.5)], E(20, 0), "bezier"),
1902
- q("drop-del", "motion", "de-l", [E(19, 4)], E(17, 7), "straight"),
1903
- q("deep-cbl", "motion", "cb-l", [], E(7, 13), "straight"),
1904
- q("deep-cbr", "motion", "cb-r", [], E(46, 13), "straight"),
1905
- q("deep-fs", "motion", "fs", [], E(26.5, 14), "straight"),
1906
- q("hook-mlb", "motion", "mlb", [], E(23, 9), "straight"),
1907
- q("flat-ss", "motion", "ss", [], E(39, 4), "straight")
1958
+ K("play-fire-zone", "Fire Zone", "defense", "pressure", "Nickel", "A five-man blitz with one lineman dropping, covered by three-deep, three-under.", [...U(q), ...B()], [
1959
+ G("rush-dtl", "route", "dt-l", [], E(25, 0), "straight"),
1960
+ G("rush-dtr", "route", "dt-r", [], E(28.5, 0), "straight"),
1961
+ G("rush-der", "route", "de-r", [], E(33, 0), "straight"),
1962
+ G("blz-wlb", "route", "wlb", [E(31.5, 2.5)], E(31, 0), "bezier"),
1963
+ G("blz-nb", "route", "nb", [E(17, 2.5)], E(20, 0), "bezier"),
1964
+ G("drop-del", "motion", "de-l", [E(19, 4)], E(17, 7), "straight"),
1965
+ G("deep-cbl", "motion", "cb-l", [], E(7, 13), "straight"),
1966
+ G("deep-cbr", "motion", "cb-r", [], E(46, 13), "straight"),
1967
+ G("deep-fs", "motion", "fs", [], E(26.5, 14), "straight"),
1968
+ G("hook-mlb", "motion", "mlb", [], E(23, 9), "straight"),
1969
+ G("flat-ss", "motion", "ss", [], E(39, 4), "straight")
1908
1970
  ]),
1909
- J("play-cover-0", "Cover 0 Blitz", "defense", "pressure", "Nickel", "セイフティを残さず全マン、6 人で最大限の圧力をかける。FS が RB をマンで受け持つ。", [...G({
1971
+ K("play-cover-0", "Cover 0 Blitz", "defense", "pressure", "Nickel", "All-out man with no safety deep, six rushers for maximum pressure. The FS takes the RB in man.", [...U({
1910
1972
  cornerDepth: 5,
1911
1973
  fs: E(22, 9),
1912
1974
  ss: E(31, 9)
1913
- }), ...H()], [
1914
- q("rush-del", "route", "de-l", [], E(20, 0), "straight"),
1915
- q("rush-dtl", "route", "dt-l", [], E(25, 0), "straight"),
1916
- q("rush-dtr", "route", "dt-r", [], E(30.5, 0), "straight"),
1917
- q("rush-der", "route", "de-r", [], E(33, 0), "straight"),
1918
- q("blz-mlb", "route", "mlb", [E(27, 2.5)], E(27.5, 0), "bezier"),
1919
- q("blz-wlb", "route", "wlb", [E(31.5, 2.5)], E(31, 0), "bezier"),
1920
- q("man-cbl", "motion", "cb-l", [], E(5.5, .5), "straight"),
1921
- q("man-cbr", "motion", "cb-r", [], E(47.5, .5), "straight"),
1922
- q("man-nb", "motion", "nb", [], E(13, -.5), "straight"),
1923
- q("man-fs", "motion", "fs", [E(22, 2.5), E(23, -2.5)], E(28, -4), "straight"),
1924
- q("man-ss", "motion", "ss", [E(37, 4)], E(39.5, -.5), "straight")
1975
+ }), ...B()], [
1976
+ G("rush-del", "route", "de-l", [], E(20, 0), "straight"),
1977
+ G("rush-dtl", "route", "dt-l", [], E(25, 0), "straight"),
1978
+ G("rush-dtr", "route", "dt-r", [], E(30.5, 0), "straight"),
1979
+ G("rush-der", "route", "de-r", [], E(33, 0), "straight"),
1980
+ G("blz-mlb", "route", "mlb", [E(27, 2.5)], E(27.5, 0), "bezier"),
1981
+ G("blz-wlb", "route", "wlb", [E(31.5, 2.5)], E(31, 0), "bezier"),
1982
+ G("man-cbl", "motion", "cb-l", [], E(5.5, .5), "straight"),
1983
+ G("man-cbr", "motion", "cb-r", [], E(47.5, .5), "straight"),
1984
+ G("man-nb", "motion", "nb", [], E(13, -.5), "straight"),
1985
+ G("man-fs", "motion", "fs", [E(22, 2.5), E(23, -2.5)], E(28, -4), "straight"),
1986
+ G("man-ss", "motion", "ss", [E(37, 4)], E(39.5, -.5), "straight")
1925
1987
  ]),
1926
- J("play-double-a", "Double-A Gap", "defense", "pressure", "Nickel", "両 A ギャップに 2 人を提示。実行・シム(見せ)どちらにも化ける。", [
1988
+ K("play-double-a", "Double-A Gap", "defense", "pressure", "Nickel", "Two defenders shown in both A gaps. It can turn into a real pressure or a simulated one.", [
1927
1989
  D("de-l", "E", j.eL),
1928
1990
  D("dt-l", "T", E(23, 1.5)),
1929
1991
  D("dt-r", "T", j.t),
1930
1992
  D("de-r", "E", j.eR),
1931
1993
  D("mlb", "M", E(25.5, 3)),
1932
1994
  D("wlb", "W", E(27.5, 3)),
1933
- D("nb", "NB", F.nb),
1934
- D("cb-l", "CB", I(7).left),
1935
- D("cb-r", "CB", I(7).right),
1936
- D("fs", "FS", Y.fs),
1937
- D("ss", "SS", Y.ss),
1938
- ...H()
1995
+ D("nb", "NB", P.nb),
1996
+ D("cb-l", "CB", F(7).left),
1997
+ D("cb-r", "CB", F(7).right),
1998
+ D("fs", "FS", q.fs),
1999
+ D("ss", "SS", q.ss),
2000
+ ...B()
1939
2001
  ], [
1940
- q("aim-mlb", "route", "mlb", [], E(25.5, .5), "straight"),
1941
- q("aim-wlb", "route", "wlb", [], E(27.5, .5), "straight"),
1942
- q("rush-del", "route", "de-l", [], E(20, 0), "straight"),
1943
- q("rush-dtl", "route", "dt-l", [], E(22.5, 0), "straight"),
1944
- q("rush-dtr", "route", "dt-r", [], E(30.5, 0), "straight"),
1945
- q("rush-der", "route", "de-r", [], E(33, 0), "straight"),
1946
- q("bail-cbl", "motion", "cb-l", [], E(7, 12), "straight"),
1947
- q("bail-cbr", "motion", "cb-r", [], E(46, 12), "straight"),
1948
- q("deep-fs", "motion", "fs", [], E(26.5, 14), "straight"),
1949
- q("curl-nb", "motion", "nb", [], E(15.5, 9), "straight"),
1950
- q("flat-ss", "motion", "ss", [], E(39, 4), "straight")
2002
+ G("aim-mlb", "route", "mlb", [], E(25.5, .5), "straight"),
2003
+ G("aim-wlb", "route", "wlb", [], E(27.5, .5), "straight"),
2004
+ G("rush-del", "route", "de-l", [], E(20, 0), "straight"),
2005
+ G("rush-dtl", "route", "dt-l", [], E(22.5, 0), "straight"),
2006
+ G("rush-dtr", "route", "dt-r", [], E(30.5, 0), "straight"),
2007
+ G("rush-der", "route", "de-r", [], E(33, 0), "straight"),
2008
+ G("bail-cbl", "motion", "cb-l", [], E(7, 12), "straight"),
2009
+ G("bail-cbr", "motion", "cb-r", [], E(46, 12), "straight"),
2010
+ G("deep-fs", "motion", "fs", [], E(26.5, 14), "straight"),
2011
+ G("curl-nb", "motion", "nb", [], E(15.5, 9), "straight"),
2012
+ G("flat-ss", "motion", "ss", [], E(39, 4), "straight")
1951
2013
  ]),
1952
- J("play-cover-6", "Cover 6", "defense", "coverage", "Nickel", "クォーター×2+ハーフの分割カバー。フィールドはクォーターズ、バウンダリは 2。", [
1953
- ...Pn(),
2014
+ K("play-cover-6", "Cover 6", "defense", "coverage", "Nickel", "Split coverage: two quarters plus a half. Quarters to the field, Cover 2 to the boundary.", [
2015
+ ...Ln(),
1954
2016
  D("nb", "NB", E(39, 5)),
1955
- D("cb-l", "CB", I(5).left),
1956
- D("cb-r", "CB", I(7).right),
2017
+ D("cb-l", "CB", F(5).left),
2018
+ D("cb-r", "CB", F(7).right),
1957
2019
  D("fs", "FS", E(15, 11)),
1958
2020
  D("ss", "SS", E(35, 10)),
1959
- ...H()
2021
+ ...B()
1960
2022
  ], [
1961
- q("flat-cbl", "motion", "cb-l", [], E(10, 4), "straight"),
1962
- q("half-fs", "motion", "fs", [], E(12, 14), "straight"),
1963
- q("qtr-cbr", "motion", "cb-r", [], E(47, 13), "straight"),
1964
- q("qtr-ss", "motion", "ss", [], E(38, 14), "straight"),
1965
- q("curl-nb", "motion", "nb", [], E(41, 9), "straight"),
1966
- q("hook-mlb", "motion", "mlb", [], E(22, 10), "straight"),
1967
- q("hook-wlb", "motion", "wlb", [], E(31, 10), "straight")
2023
+ G("flat-cbl", "motion", "cb-l", [], E(10, 4), "straight"),
2024
+ G("half-fs", "motion", "fs", [], E(12, 14), "straight"),
2025
+ G("qtr-cbr", "motion", "cb-r", [], E(47, 13), "straight"),
2026
+ G("qtr-ss", "motion", "ss", [], E(38, 14), "straight"),
2027
+ G("curl-nb", "motion", "nb", [], E(41, 9), "straight"),
2028
+ G("hook-mlb", "motion", "mlb", [], E(22, 10), "straight"),
2029
+ G("hook-wlb", "motion", "wlb", [], E(31, 10), "straight")
1968
2030
  ])
1969
2031
  ]);
1970
- function Xn(e) {
1971
- return Yn.find((t) => t.id === e);
2032
+ function $n(e) {
2033
+ return Qn.find((t) => t.id === e);
2034
+ }
2035
+ // src/browser/i18n/messages.ts
2036
+ var er = ["en", "ja"], tr = {
2037
+ en: {
2038
+ tool: {
2039
+ select: "Select",
2040
+ "add-player": "Add player",
2041
+ "draw-line": "Draw line"
2042
+ },
2043
+ undo: "Undo",
2044
+ redo: "Redo",
2045
+ delete: "Delete",
2046
+ finishLine: "Finish line",
2047
+ cancel: "Cancel",
2048
+ zone: tt,
2049
+ formation: "Formation",
2050
+ loadFormation: "Load formation…",
2051
+ side: {
2052
+ offense: "Offense",
2053
+ defense: "Defense"
2054
+ },
2055
+ formationLimit: (e) => `Formations that would put more than ${e} players on the field cannot be loaded`,
2056
+ playerLimit: (e) => `Up to ${e} players`,
2057
+ lineLimit: (e) => `Up to ${e} lines`,
2058
+ selectionHint: "Select a player or a line to edit its properties",
2059
+ player: "Player",
2060
+ line: "Line",
2061
+ label: "Label",
2062
+ shape: "Shape",
2063
+ color: "Color",
2064
+ kind: "Kind",
2065
+ interpolation: "Interpolation",
2066
+ width: "Width",
2067
+ shapes: {
2068
+ circle: "Circle",
2069
+ square: "Square"
2070
+ },
2071
+ fills: {
2072
+ outline: "Outline",
2073
+ solid: "Solid"
2074
+ },
2075
+ kinds: {
2076
+ route: "Route",
2077
+ block: "Block",
2078
+ motion: "Motion"
2079
+ },
2080
+ interpolations: {
2081
+ straight: "Straight",
2082
+ bezier: "Curved"
2083
+ },
2084
+ colors: {
2085
+ swatch1: "Black",
2086
+ swatch2: "Red",
2087
+ swatch3: "Blue",
2088
+ swatch4: "Green"
2089
+ },
2090
+ swatch: (e, t) => `${e} ${t.toLowerCase()}`,
2091
+ reset: "Default",
2092
+ resetField: (e) => `Reset ${e.toLowerCase()} to default`
2093
+ },
2094
+ ja: e
2095
+ };
2096
+ function nr(e) {
2097
+ return tr[e];
1972
2098
  }
1973
2099
  // src/browser/input/pointer-input.ts
1974
- function Zn(e) {
2100
+ function rr(e) {
1975
2101
  return e instanceof HTMLInputElement || e instanceof HTMLSelectElement || e instanceof HTMLTextAreaElement;
1976
2102
  }
1977
- var Qn = class extends n {
1978
- constructor(t, n, r) {
2103
+ var ir = class extends r {
2104
+ constructor(e, n, r) {
1979
2105
  super();
1980
2106
  let i = n.canvas;
1981
2107
  i.tabIndex = 0;
@@ -1988,7 +2114,7 @@ var Qn = class extends n {
1988
2114
  }, d = (e) => {
1989
2115
  l(e) && !r.getViewState().isDrawing && r.cancelInteraction();
1990
2116
  }, f = () => r.commitLine(), p = (e) => {
1991
- if (!Zn(e.target)) switch (qn(e)) {
2117
+ if (!rr(e.target)) switch (Xn(e)) {
1992
2118
  case "cancel-interaction":
1993
2119
  r.cancelInteraction();
1994
2120
  return;
@@ -2004,39 +2130,39 @@ var Qn = class extends n {
2004
2130
  case null: return;
2005
2131
  }
2006
2132
  }, m = new AbortController(), { signal: h } = m;
2007
- i.addEventListener("pointerdown", s, { signal: h }), i.addEventListener("pointermove", c, { signal: h }), i.addEventListener("pointerup", u, { signal: h }), i.addEventListener("pointercancel", d, { signal: h }), i.addEventListener("lostpointercapture", d, { signal: h }), i.addEventListener("dblclick", f, { signal: h }), t.addEventListener("keydown", p, { signal: h }), this._register(e(() => {
2133
+ i.addEventListener("pointerdown", s, { signal: h }), i.addEventListener("pointermove", c, { signal: h }), i.addEventListener("pointerup", u, { signal: h }), i.addEventListener("pointercancel", d, { signal: h }), i.addEventListener("lostpointercapture", d, { signal: h }), i.addEventListener("dblclick", f, { signal: h }), e.addEventListener("keydown", p, { signal: h }), this._register(t(() => {
2008
2134
  m.abort(), i.removeAttribute("tabindex");
2009
2135
  }));
2010
2136
  }
2011
- }, $n = "data:font/woff2;base64,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", er = "Playmaker Saira", tr = `"${er}", sans-serif`;
2012
- function nr(e) {
2013
- return `700 ${e}px ${tr}`;
2137
+ }, ar = "data:font/woff2;base64,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", or = "Playmaker Saira", sr = `"${or}", sans-serif`;
2138
+ function cr(e) {
2139
+ return `700 ${e}px ${sr}`;
2014
2140
  }
2015
2141
  // src/browser/theme/field-font-face.ts
2016
- var rr;
2017
- function ir() {
2018
- return rr ??= ar(), rr;
2142
+ var lr;
2143
+ function ur() {
2144
+ return lr ??= dr(), lr;
2019
2145
  }
2020
- async function ar() {
2146
+ async function dr() {
2021
2147
  try {
2022
- let e = new FontFace(er, `url("${$n}")`, { weight: "700" });
2148
+ let e = new FontFace(or, `url("${ar}")`, { weight: "700" });
2023
2149
  document.fonts.add(e), await e.load();
2024
2150
  } catch {}
2025
2151
  }
2026
2152
  // src/browser/theme/css-color.ts
2027
- var or = { status: "unresolved" };
2028
- function sr() {
2029
- if (or.status === "unresolved") {
2153
+ var fr = { status: "unresolved" };
2154
+ function pr() {
2155
+ if (fr.status === "unresolved") {
2030
2156
  let e = document.createElement("canvas").getContext("2d");
2031
- or = e === null ? { status: "unavailable" } : {
2157
+ fr = e === null ? { status: "unavailable" } : {
2032
2158
  status: "ready",
2033
2159
  ctx: e
2034
2160
  };
2035
2161
  }
2036
- return or;
2162
+ return fr;
2037
2163
  }
2038
- function cr(e) {
2039
- let t = sr();
2164
+ function J(e) {
2165
+ let t = pr();
2040
2166
  if (t.status !== "ready") return e;
2041
2167
  let { ctx: n } = t;
2042
2168
  n.fillStyle = "#000000", n.fillStyle = e;
@@ -2044,26 +2170,26 @@ function cr(e) {
2044
2170
  return n.fillStyle = "#ffffff", n.fillStyle = e, typeof r == "string" && n.fillStyle === r ? r : void 0;
2045
2171
  }
2046
2172
  // src/browser/theme/tokens.ts
2047
- var lr = "#ffffff", X = "#212121", ur = "#d32f2f", dr = "#1976d2", fr = "#388e3c", pr = "#ff9800", mr = "#f5f5f5", hr = "#eeeeee", gr = "#bdbdbd", _r = "#9e9e9e", vr = {
2173
+ var mr = "#ffffff", Y = "#212121", hr = "#d32f2f", gr = "#1976d2", _r = "#388e3c", vr = "#ff9800", yr = "#f5f5f5", br = "#eeeeee", xr = "#bdbdbd", X = "#9e9e9e", Sr = {
2048
2174
  fieldGrass: {
2049
2175
  property: "--playmaker-field-grass",
2050
- fallback: lr
2176
+ fallback: mr
2051
2177
  },
2052
2178
  fieldOob: {
2053
2179
  property: "--playmaker-field-oob",
2054
- fallback: hr
2180
+ fallback: br
2055
2181
  },
2056
2182
  fieldEndzone: {
2057
2183
  property: "--playmaker-field-endzone",
2058
- fallback: mr
2184
+ fallback: yr
2059
2185
  },
2060
2186
  fieldLine: {
2061
2187
  property: "--playmaker-field-line",
2062
- fallback: _r
2188
+ fallback: X
2063
2189
  },
2064
2190
  fieldNumber: {
2065
2191
  property: "--playmaker-field-number",
2066
- fallback: gr
2192
+ fallback: xr
2067
2193
  },
2068
2194
  fieldGoalLine: {
2069
2195
  property: "--playmaker-field-goal-line",
@@ -2071,11 +2197,11 @@ var lr = "#ffffff", X = "#212121", ur = "#d32f2f", dr = "#1976d2", fr = "#388e3c
2071
2197
  },
2072
2198
  fieldPylon: {
2073
2199
  property: "--playmaker-field-pylon",
2074
- fallback: _r
2200
+ fallback: X
2075
2201
  },
2076
2202
  fieldGoalpost: {
2077
2203
  property: "--playmaker-field-goalpost",
2078
- fallback: _r
2204
+ fallback: X
2079
2205
  },
2080
2206
  fieldGrid: {
2081
2207
  property: "--playmaker-field-grid",
@@ -2083,64 +2209,64 @@ var lr = "#ffffff", X = "#212121", ur = "#d32f2f", dr = "#1976d2", fr = "#388e3c
2083
2209
  },
2084
2210
  playerColor: {
2085
2211
  property: "--playmaker-player-color",
2086
- fallback: X
2212
+ fallback: Y
2087
2213
  },
2088
2214
  playerLabel: {
2089
2215
  property: "--playmaker-player-label",
2090
- fallback: lr
2216
+ fallback: mr
2091
2217
  },
2092
2218
  lineRoute: {
2093
2219
  property: "--playmaker-line-route",
2094
- fallback: X
2220
+ fallback: Y
2095
2221
  },
2096
2222
  lineBlock: {
2097
2223
  property: "--playmaker-line-block",
2098
- fallback: X
2224
+ fallback: Y
2099
2225
  },
2100
2226
  lineMotion: {
2101
2227
  property: "--playmaker-line-motion",
2102
- fallback: X
2228
+ fallback: Y
2103
2229
  },
2104
2230
  swatch1: {
2105
2231
  property: "--playmaker-swatch-1",
2106
- fallback: X
2232
+ fallback: Y
2107
2233
  },
2108
2234
  swatch2: {
2109
2235
  property: "--playmaker-swatch-2",
2110
- fallback: ur
2236
+ fallback: hr
2111
2237
  },
2112
2238
  swatch3: {
2113
2239
  property: "--playmaker-swatch-3",
2114
- fallback: dr
2240
+ fallback: gr
2115
2241
  },
2116
2242
  swatch4: {
2117
2243
  property: "--playmaker-swatch-4",
2118
- fallback: fr
2244
+ fallback: _r
2119
2245
  },
2120
2246
  selection: {
2121
2247
  property: "--playmaker-selection",
2122
- fallback: pr
2248
+ fallback: vr
2123
2249
  },
2124
2250
  selectionOutline: {
2125
2251
  property: "--playmaker-selection-outline",
2126
- fallback: lr
2252
+ fallback: mr
2127
2253
  }
2128
2254
  };
2129
- function yr(e) {
2255
+ function Cr(e) {
2130
2256
  return (t) => {
2131
- let { property: n, fallback: r } = vr[t], i = e(n).trim();
2257
+ let { property: n, fallback: r } = Sr[t], i = e(n).trim();
2132
2258
  return i === "" ? r : i;
2133
2259
  };
2134
2260
  }
2135
2261
  // src/browser/theme/theme-reader.ts
2136
2262
  function Z(e) {
2137
2263
  let t = getComputedStyle(e), n = /* @__PURE__ */ new Map();
2138
- for (let { property: e } of Object.values(vr)) n.set(e, cr(t.getPropertyValue(e).trim()) ?? "");
2139
- return yr((e) => n.get(e) ?? "");
2264
+ for (let { property: e } of Object.values(Sr)) n.set(e, J(t.getPropertyValue(e).trim()) ?? "");
2265
+ return Cr((e) => n.get(e) ?? "");
2140
2266
  }
2141
2267
  // src/browser/rendering/field-renderer.ts
2142
- var br = .8, xr = .3, Sr = 2.5, Cr = 6, wr = .18;
2143
- function Tr(e) {
2268
+ var wr = .8, Tr = .3, Er = 2.5, Dr = 6, Or = .18;
2269
+ function kr(e) {
2144
2270
  return {
2145
2271
  fieldColor: e("fieldGrass"),
2146
2272
  oobColor: e("fieldOob"),
@@ -2152,9 +2278,9 @@ function Tr(e) {
2152
2278
  goalpostColor: e("fieldGoalpost")
2153
2279
  };
2154
2280
  }
2155
- var Er = class {
2281
+ var Ar = class {
2156
2282
  draw(e, t) {
2157
- let { geometry: n, metrics: r } = t, i = Tr(t.theme), { viewportWidth: a, viewportHeight: o, yardWindow: s } = n, c = {
2283
+ let { geometry: n, metrics: r } = t, i = kr(t.theme), { viewportWidth: a, viewportHeight: o, yardWindow: s } = n, c = {
2158
2284
  left: n.xForLateralYard(0),
2159
2285
  right: n.xForLateralYard(53),
2160
2286
  top: n.yForAbsoluteYard(s.endYard),
@@ -2174,9 +2300,9 @@ var Er = class {
2174
2300
  }
2175
2301
  }
2176
2302
  drawHashes(e, t, { left: n, right: r }, i, a) {
2177
- let o = Nt[Pt], s = 53 / 2, c = t.xForLateralYard(s - o), l = t.xForLateralYard(s + o), u = i.hashTickLength, d = u / 2;
2303
+ let o = Ft[It], s = 53 / 2, c = t.xForLateralYard(s - o), l = t.xForLateralYard(s + o), u = i.hashTickLength, d = u / 2;
2178
2304
  e.strokeStyle = a.lineColor, e.lineWidth = i.yardLineWidth, e.beginPath();
2179
- for (let i of w(t.zone, 1)) {
2305
+ for (let i of C(t.zone, 1)) {
2180
2306
  if (i < 0 || i > 100 || i % 5 == 0) continue;
2181
2307
  let a = t.yForAbsoluteYard(i);
2182
2308
  e.moveTo(n, a), e.lineTo(n + u, a), e.moveTo(r - u, a), e.lineTo(r, a), e.moveTo(c - d, a), e.lineTo(c + d, a), e.moveTo(l - d, a), e.lineTo(l + d, a);
@@ -2185,7 +2311,7 @@ var Er = class {
2185
2311
  }
2186
2312
  drawYardLines(e, t, { left: n, right: r, top: i, bottom: a }, o, s) {
2187
2313
  let c = new Path2D(), l = new Path2D(), u = new Path2D();
2188
- for (let e of w(t.zone, 5)) {
2314
+ for (let e of C(t.zone, 5)) {
2189
2315
  if (e < 0 || e > 100) continue;
2190
2316
  let i = t.yForAbsoluteYard(e), a = e === 0 || e === 100 ? c : e === 50 ? l : u;
2191
2317
  a.moveTo(n, i), a.lineTo(r, i);
@@ -2193,20 +2319,20 @@ var Er = class {
2193
2319
  e.strokeStyle = s.lineColor, e.lineWidth = o.yardLineWidth, e.stroke(u), e.lineWidth = o.midfieldLineWidth, e.stroke(l), e.lineWidth = o.goalLineWidth, e.beginPath(), e.moveTo(n, i), e.lineTo(n, a), e.moveTo(r, i), e.lineTo(r, a), e.moveTo(n, i), e.lineTo(r, i), e.moveTo(n, a), e.lineTo(r, a), e.stroke(), e.strokeStyle = s.goalLineColor, e.lineWidth = o.goalLineWidth, e.stroke(c);
2194
2320
  }
2195
2321
  drawNumbers(e, t, n, r) {
2196
- let i = t.xForLateralYard(Cr), a = t.xForLateralYard(53 - Cr), o = xr * t.scale, s = br / 2;
2197
- e.font = nr(n.numberHeight), e.textBaseline = "middle", e.textAlign = "center";
2198
- let c = n.numberHeight * wr, l = (t, n, r, i) => {
2322
+ let i = t.xForLateralYard(Dr), a = t.xForLateralYard(53 - Dr), o = Tr * t.scale, s = wr / 2;
2323
+ e.font = cr(n.numberHeight), e.textBaseline = "middle", e.textAlign = "center";
2324
+ let c = n.numberHeight * Or, l = (t, n, r, i) => {
2199
2325
  let [a, o] = [...t];
2200
2326
  e.save(), e.translate(n, r), e.rotate(i), t.length === 2 && a !== void 0 && o !== void 0 ? (e.fillText(a, -c / 2 - e.measureText(a).width / 2, 0), e.fillText(o, c / 2 + e.measureText(o).width / 2, 0)) : e.fillText(t, 0, 0), e.restore();
2201
2327
  }, u = (t, n, r) => {
2202
2328
  e.beginPath(), e.moveTo(t, n), e.lineTo(t - o, r), e.lineTo(t + o, r), e.closePath(), e.fill();
2203
2329
  };
2204
- for (let n of w(t.zone, 10)) {
2205
- let o = Rt(n);
2330
+ for (let n of C(t.zone, 10)) {
2331
+ let o = Bt(n);
2206
2332
  if (o === null) continue;
2207
2333
  let c = t.yForAbsoluteYard(n);
2208
2334
  if (e.fillStyle = r.numberColor, l(String(o), i, c, Math.PI / 2), l(String(o), a, c, -Math.PI / 2), n === 50) continue;
2209
- let d = n < 50 ? -1 : 1, f = n + d * Sr, p = t.yForAbsoluteYard(f + d * s), m = t.yForAbsoluteYard(f - d * s);
2335
+ let d = n < 50 ? -1 : 1, f = n + d * Er, p = t.yForAbsoluteYard(f + d * s), m = t.yForAbsoluteYard(f - d * s);
2210
2336
  e.fillStyle = r.lineColor, u(i, p, m), u(a, p, m);
2211
2337
  }
2212
2338
  }
@@ -2227,7 +2353,7 @@ var Er = class {
2227
2353
  let o = t.xForLateralYard(53 / 2), s = i.goalpostCrossbarHalfLength, c = i.goalpostUprightLength, l = r === "toward-top" ? -1 : 1;
2228
2354
  e.save(), e.strokeStyle = a.goalpostColor, e.lineWidth = i.goalpostStroke, e.lineCap = "round", e.beginPath(), e.moveTo(o - s, n), e.lineTo(o + s, n), e.moveTo(o - s, n), e.lineTo(o - s, n + l * c), e.moveTo(o + s, n), e.lineTo(o + s, n + l * c), e.stroke(), e.restore();
2229
2355
  }
2230
- }, Dr = class {
2356
+ }, jr = class {
2231
2357
  cached;
2232
2358
  draw(e, t) {
2233
2359
  let { geometry: n, metrics: r } = t, i = [
@@ -2239,38 +2365,38 @@ var Er = class {
2239
2365
  ].join(":");
2240
2366
  this.cached?.key !== i && (this.cached = {
2241
2367
  key: i,
2242
- dots: Or(n, r.gridDotRadius)
2368
+ dots: Mr(n, r.gridDotRadius)
2243
2369
  }), e.fillStyle = t.theme("fieldGrid"), e.fill(this.cached.dots);
2244
2370
  }
2245
2371
  };
2246
- function Or(e, t) {
2247
- let n = new Path2D(), i = 2 * t;
2248
- for (let a of w(e.zone, r)) {
2372
+ function Mr(e, t) {
2373
+ let n = new Path2D(), r = 2 * t;
2374
+ for (let a of C(e.zone, i)) {
2249
2375
  let { startYard: o, endYard: s } = e.yardWindow;
2250
2376
  if (a >= 0 && a <= 100 && a % 5 == 0 || a === o || a === s) continue;
2251
2377
  let c = e.yForAbsoluteYard(a);
2252
- for (let a = r; a < 53; a += r) n.rect(e.xForLateralYard(a) - t, c - t, i, i);
2378
+ for (let a = i; a < 53; a += i) n.rect(e.xForLateralYard(a) - t, c - t, r, r);
2253
2379
  }
2254
2380
  return n;
2255
2381
  }
2256
2382
  // src/browser/rendering/line-renderer.ts
2257
- var kr = {
2383
+ var Nr = {
2258
2384
  route: "lineRoute",
2259
2385
  block: "lineBlock",
2260
2386
  motion: "lineMotion"
2261
- }, Ar = class {
2387
+ }, Pr = class {
2262
2388
  draw(e, t) {
2263
2389
  let { geometry: n, metrics: r } = t, { lines: i, players: a } = t.scene;
2264
2390
  if (n.scale <= 0 || i.length === 0) return;
2265
- let o = $e(a);
2391
+ let o = Qe(a);
2266
2392
  for (let a of i) {
2267
- let i = Qe(a, o);
2393
+ let i = Ze(a, o);
2268
2394
  if (i === void 0) continue;
2269
- let s = Kt(i, a.interpolation).map((e) => n.toCanvas(e));
2395
+ let s = qt(i, a.interpolation).map((e) => n.toCanvas(e));
2270
2396
  if (s.length < 2) continue;
2271
- let c = a.color ?? t.theme(kr[a.kind]), l = this.widthFor(a.kind, r) * (a.thickness ?? 1), u = a.kind === "block";
2397
+ let c = a.color ?? t.theme(Nr[a.kind]), l = this.widthFor(a.kind, r) * (a.thickness ?? 1), u = a.kind === "block";
2272
2398
  e.save(), e.strokeStyle = c, e.lineWidth = l, e.lineJoin = "round", e.lineCap = "round", a.kind === "motion" && e.setLineDash([...r.motionDash]);
2273
- let d = u ? s : Hn(s, r.arrowLength);
2399
+ let d = u ? s : Gn(s, r.arrowLength);
2274
2400
  e.beginPath();
2275
2401
  for (let t of d) e.lineTo(t.x, t.y);
2276
2402
  e.stroke(), e.setLineDash([]), u ? this.drawBlockCap(e, s, c, r, l) : this.drawArrowHead(e, s, c, r), e.restore();
@@ -2280,39 +2406,39 @@ var kr = {
2280
2406
  return e === "block" ? t.blockWidth : t.routeWidth;
2281
2407
  }
2282
2408
  drawArrowHead(e, t, n, r) {
2283
- let i = Un(t, r.arrowLength, r.arrowHalfWidth);
2409
+ let i = Kn(t, r.arrowLength, r.arrowHalfWidth);
2284
2410
  if (i === void 0) return;
2285
2411
  let [a, o, s] = i;
2286
2412
  e.beginPath(), e.moveTo(a.x, a.y), e.lineTo(o.x, o.y), e.lineTo(s.x, s.y), e.closePath(), e.fillStyle = n, e.fill();
2287
2413
  }
2288
2414
  drawBlockCap(e, t, n, r, i) {
2289
- let a = Wn(t, r.blockCapLength);
2415
+ let a = qn(t, r.blockCapLength);
2290
2416
  if (a === void 0) return;
2291
2417
  let [o, s] = a;
2292
2418
  e.beginPath(), e.strokeStyle = n, e.lineWidth = i * 1.2, e.lineCap = "round", e.moveTo(o.x, o.y), e.lineTo(s.x, s.y), e.stroke();
2293
2419
  }
2294
- }, jr = class {
2420
+ }, Fr = class {
2295
2421
  draw(e, t) {
2296
2422
  let { overlay: n } = t;
2297
2423
  switch (n.kind) {
2298
2424
  case "none": return;
2299
2425
  case "player":
2300
- Mr(e, t, n.playerId);
2426
+ Ir(e, t, n.playerId);
2301
2427
  return;
2302
2428
  case "line":
2303
- Nr(e, t, n);
2429
+ Lr(e, t, n);
2304
2430
  return;
2305
2431
  }
2306
2432
  }
2307
2433
  };
2308
- function Mr(e, t, n) {
2434
+ function Ir(e, t, n) {
2309
2435
  let r = t.scene.players.find((e) => e.id === n);
2310
2436
  if (r === void 0) return;
2311
- let { x: i, y: a } = t.geometry.toCanvas(r.position), o = m * t.geometry.scale + 4;
2437
+ let { x: i, y: a } = t.geometry.toCanvas(r.position), o = h * t.geometry.scale + 4;
2312
2438
  e.beginPath(), e.arc(i, a, o, 0, Math.PI * 2), e.strokeStyle = t.theme("selection"), e.lineWidth = 2, e.stroke();
2313
2439
  }
2314
- function Nr(e, t, n) {
2315
- let { geometry: r } = t, i = t.theme("selection"), a = t.theme("selectionOutline"), o = Math.max(3, .45 * Qt * r.scale), s = () => {
2440
+ function Lr(e, t, n) {
2441
+ let { geometry: r } = t, i = t.theme("selection"), a = t.theme("selectionOutline"), o = Math.max(3, .45 * $t * r.scale), s = () => {
2316
2442
  e.fillStyle = i, e.fill(), e.lineWidth = 1.5, e.strokeStyle = a, e.stroke();
2317
2443
  };
2318
2444
  for (let t of n.waypointHandles) {
@@ -2323,22 +2449,22 @@ function Nr(e, t, n) {
2323
2449
  e.beginPath(), e.arc(c, l, o + 1, 0, Math.PI * 2), s();
2324
2450
  }
2325
2451
  // src/browser/rendering/player-renderer.ts
2326
- var Pr = class {
2452
+ var Rr = class {
2327
2453
  draw(e, t) {
2328
- let { geometry: n, metrics: r } = t, { players: i } = t.scene, a = t.theme("playerColor"), o = t.theme("fieldGrass"), s = t.theme("playerLabel"), c = m * n.scale;
2454
+ let { geometry: n, metrics: r } = t, { players: i } = t.scene, a = t.theme("playerColor"), o = t.theme("fieldGrass"), s = t.theme("playerLabel"), c = h * n.scale;
2329
2455
  if (c <= 0) return;
2330
2456
  let l = r.markerLabelFont;
2331
2457
  for (let t of i) {
2332
2458
  let i = n.toCanvas(t.position), u = t.color ?? a, d = (t.fill ?? "outline") === "solid";
2333
2459
  e.beginPath();
2334
- let f = Kn(t.shape, c);
2460
+ let f = Yn(t.shape, c);
2335
2461
  if (f.kind === "circle") e.arc(i.x, i.y, f.radius, 0, Math.PI * 2);
2336
2462
  else {
2337
2463
  let { halfSide: t } = f;
2338
2464
  e.rect(i.x - t, i.y - t, t * 2, t * 2);
2339
2465
  }
2340
2466
  if (e.fillStyle = d ? u : o, e.fill(), e.lineWidth = r.markerStroke, e.strokeStyle = u, e.stroke(), t.label !== "") {
2341
- e.fillStyle = d ? s : u, e.font = nr(l), e.textAlign = "center", e.textBaseline = "alphabetic";
2467
+ e.fillStyle = d ? s : u, e.font = cr(l), e.textAlign = "center", e.textBaseline = "alphabetic";
2342
2468
  let n = e.measureText(t.label), r = i.y + (n.actualBoundingBoxAscent - n.actualBoundingBoxDescent) / 2;
2343
2469
  e.fillText(t.label, i.x, r);
2344
2470
  }
@@ -2346,19 +2472,19 @@ var Pr = class {
2346
2472
  }
2347
2473
  };
2348
2474
  // src/browser/rendering/layer.ts
2349
- function Fr() {
2475
+ function zr() {
2350
2476
  return {
2351
- field: [new Er()],
2352
- backdrop: [new Dr()],
2353
- play: [new Ar(), new Pr()],
2354
- editor: [new jr()]
2477
+ field: [new Ar()],
2478
+ backdrop: [new jr()],
2479
+ play: [new Pr(), new Rr()],
2480
+ editor: [new Fr()]
2355
2481
  };
2356
2482
  }
2357
2483
  function Q(e, t, n) {
2358
2484
  for (let r of n) e.save(), r.draw(e, t), e.restore();
2359
2485
  }
2360
2486
  // src/browser/rendering/canvas-surface.ts
2361
- var Ir = class extends n {
2487
+ var Br = class extends r {
2362
2488
  canvas;
2363
2489
  ctx;
2364
2490
  layers;
@@ -2367,13 +2493,13 @@ var Ir = class extends n {
2367
2493
  frameRequest;
2368
2494
  dpr = 0;
2369
2495
  lifetime = new AbortController();
2370
- constructor(t, n, r, i = Fr()) {
2371
- super(), this.scene = n, this.overlay = r, this.layers = i, this.canvas = document.createElement("canvas"), this.canvas.className = "playmaker-canvas", t.appendChild(this.canvas), this._register(e(() => this.canvas.remove()));
2496
+ constructor(e, n, r, i = zr()) {
2497
+ super(), this.scene = n, this.overlay = r, this.layers = i, this.canvas = document.createElement("canvas"), this.canvas.className = "playmaker-canvas", e.appendChild(this.canvas), this._register(t(() => this.canvas.remove()));
2372
2498
  let a = this.canvas.getContext("2d");
2373
- if (!a) throw Error("Playmaker: 2D canvas context を取得できませんでした。");
2499
+ if (!a) throw Error("Playmaker: could not get a 2D canvas context.");
2374
2500
  this.ctx = a;
2375
2501
  let o = new ResizeObserver(() => this.resize());
2376
- o.observe(t), this._register(e(() => {
2502
+ o.observe(e), this._register(t(() => {
2377
2503
  o.disconnect(), this.lifetime.abort(), this.cancelFrame();
2378
2504
  })), this.watchDevicePixelRatio(), this.redrawWhenFontLoads();
2379
2505
  }
@@ -2391,21 +2517,21 @@ var Ir = class extends n {
2391
2517
  });
2392
2518
  }
2393
2519
  async exportToPngBlob(e, t) {
2394
- let { width: n, height: r } = Dn(e.field.zone, t), i = Z(this.host);
2395
- await ir();
2520
+ let { width: n, height: r } = On(e.field.zone, t), i = Z(this.host);
2521
+ await ur();
2396
2522
  let a = document.createElement("canvas");
2397
2523
  a.width = n, a.height = r;
2398
2524
  let o = a.getContext("2d");
2399
- if (!o) throw Error("Playmaker: エクスポート用 2D canvas context を取得できませんでした。");
2400
- let s = new zt(n, r, e.field);
2525
+ if (!o) throw Error("Playmaker: could not get a 2D canvas context for the export.");
2526
+ let s = new Vt(n, r, e.field);
2401
2527
  return this.paint(o, this.frameFor(s, e, i), void 0), new Promise((e, t) => {
2402
2528
  a.toBlob((n) => {
2403
- n ? e(n) : t(/* @__PURE__ */ Error("Playmaker: PNG への変換に失敗しました。"));
2529
+ n ? e(n) : t(/* @__PURE__ */ Error("Playmaker: could not convert the canvas to a PNG."));
2404
2530
  }, "image/png");
2405
2531
  });
2406
2532
  }
2407
2533
  redrawWhenFontLoads() {
2408
- ir().then(() => {
2534
+ ur().then(() => {
2409
2535
  this.isDisposed || this.invalidate();
2410
2536
  });
2411
2537
  }
@@ -2443,74 +2569,51 @@ var Ir = class extends n {
2443
2569
  frameFor(e, t, n) {
2444
2570
  return {
2445
2571
  geometry: e,
2446
- metrics: Oe(e.fieldPixelWidth, e.scale),
2572
+ metrics: ke(e.fieldPixelWidth, e.scale),
2447
2573
  scene: t,
2448
2574
  theme: n
2449
2575
  };
2450
2576
  }
2451
2577
  measure() {
2452
2578
  let { clientWidth: e, clientHeight: t } = this.host;
2453
- return new zt(e, t, this.scene.field);
2579
+ return new Vt(e, t, this.scene.field);
2454
2580
  }
2455
2581
  get host() {
2456
2582
  return this.canvas.parentElement ?? this.canvas;
2457
2583
  }
2458
2584
  };
2459
2585
  // src/browser/ui/focus.ts
2460
- function Lr(e, t, n) {
2586
+ function Vr(e, t, n) {
2461
2587
  let r = e.ownerDocument, i = e.contains(r.activeElement);
2462
2588
  n(), i && !e.contains(r.activeElement) && t.focus({ preventScroll: !0 });
2463
2589
  }
2464
2590
  // src/browser/theme/palette.ts
2465
- var Rr = [
2466
- {
2467
- label: "黒",
2468
- token: "swatch1"
2469
- },
2470
- {
2471
- label: "赤",
2472
- token: "swatch2"
2473
- },
2474
- {
2475
- label: "青",
2476
- token: "swatch3"
2477
- },
2478
- {
2479
- label: "緑",
2480
- token: "swatch4"
2481
- }
2482
- ], zr = {
2483
- circle: "丸",
2484
- square: "四角"
2485
- }, Br = {
2486
- outline: "枠線",
2487
- solid: "塗りつぶし"
2488
- }, Vr = {
2489
- route: "ルート",
2490
- block: "ブロック",
2491
- motion: "モーション"
2492
- }, Hr = {
2493
- straight: "直線",
2494
- bezier: "曲線"
2495
- };
2591
+ var Hr = [
2592
+ "swatch1",
2593
+ "swatch2",
2594
+ "swatch3",
2595
+ "swatch4"
2596
+ ];
2597
+ // src/browser/ui/property-panel.ts
2496
2598
  function Ur({ name: e, color: t, fill: n }) {
2497
2599
  let r = document.createElement("button");
2498
2600
  return r.type = "button", r.className = "playmaker-panel__swatch", r.title = e, r.setAttribute("aria-label", e), n === "outline" ? (r.classList.add("playmaker-panel__swatch--outline"), r.style.borderColor = t) : r.style.backgroundColor = t, r;
2499
2601
  }
2500
- var Wr = class extends n {
2602
+ var Wr = class extends r {
2501
2603
  element;
2502
2604
  controller;
2503
2605
  focusFallback;
2606
+ messages;
2504
2607
  shown;
2505
- constructor(t, n, r) {
2506
- super(), this.controller = n, this.focusFallback = r, this.element = document.createElement("div"), this.element.className = "playmaker-panel", t.appendChild(this.element), this._register(e(() => this.element.remove())), this._register(n.onDidChangeViewState(() => this.sync())), this.sync();
2608
+ constructor(e, n, r, i) {
2609
+ super(), this.controller = n, this.focusFallback = r, this.messages = i, this.element = document.createElement("div"), this.element.className = "playmaker-panel", e.appendChild(this.element), this._register(t(() => this.element.remove())), this._register(n.onDidChangeViewState(() => this.sync())), this.sync();
2507
2610
  }
2508
2611
  refresh() {
2509
2612
  this.shown = void 0, this.sync();
2510
2613
  }
2511
2614
  sync() {
2512
2615
  let e = this.selectedItem(), t = this.shown;
2513
- e.kind === "player" && t?.kind === "player" && t.id === e.player.id ? t.update(e.player) : e.kind === "line" && t?.kind === "line" && t.id === e.line.id ? t.update(e.line) : (e.kind !== "none" || t?.kind !== "hint") && Lr(this.element, this.focusFallback, () => {
2616
+ e.kind === "player" && t?.kind === "player" && t.id === e.player.id ? t.update(e.player) : e.kind === "line" && t?.kind === "line" && t.id === e.line.id ? t.update(e.line) : (e.kind !== "none" || t?.kind !== "hint") && Vr(this.element, this.focusFallback, () => {
2514
2617
  this.shown = this.rebuild(e);
2515
2618
  });
2516
2619
  }
@@ -2546,21 +2649,21 @@ var Wr = class extends n {
2546
2649
  }
2547
2650
  case "none": {
2548
2651
  let e = document.createElement("p");
2549
- return e.className = "playmaker-panel__hint", e.textContent = "対象を選択するとプロパティを編集できます", this.element.appendChild(e), { kind: "hint" };
2652
+ return e.className = "playmaker-panel__hint", e.textContent = this.messages.selectionHint, this.element.appendChild(e), { kind: "hint" };
2550
2653
  }
2551
2654
  }
2552
2655
  }
2553
2656
  addPlayerFields() {
2554
- let e = this.controller;
2555
- this.addTitle("選手");
2556
- let t = this.addText({
2557
- label: "ラベル",
2657
+ let { controller: e, messages: t } = this;
2658
+ this.addTitle(t.player);
2659
+ let n = this.addText({
2660
+ label: t.label,
2558
2661
  onChange: (t) => e.updateSelectedPlayer({ label: t })
2559
- }), n = this.addSelect("形状", d, zr, (t) => e.updateSelectedPlayer({ shape: t })), r = Z(this.element), i = p.flatMap((e) => Rr.map((t) => ({
2560
- name: `${t.label}の${Br[e]}`,
2561
- color: r(t.token),
2662
+ }), r = this.addSelect(t.shape, f, t.shapes, (t) => e.updateSelectedPlayer({ shape: t })), i = Z(this.element), a = m.flatMap((e) => Hr.map((n) => ({
2663
+ name: t.swatch(t.colors[n], t.fills[e]),
2664
+ color: i(n),
2562
2665
  fill: e
2563
- }))), a = this.addSwatches("色", i, {
2666
+ }))), o = this.addSwatches(t.color, a, {
2564
2667
  onChange: ({ color: t, fill: n }) => e.updateSelectedPlayer({
2565
2668
  color: t,
2566
2669
  fill: n
@@ -2569,32 +2672,32 @@ var Wr = class extends n {
2569
2672
  color: null,
2570
2673
  fill: null
2571
2674
  })
2572
- }), o = r("playerColor");
2675
+ }), s = i("playerColor");
2573
2676
  return (e) => {
2574
- t(e.label), n(e.shape);
2575
- let r = e.color === void 0 ? o : cr(e.color), i = e.fill ?? "outline";
2576
- a((e) => e.color === r && e.fill === i);
2677
+ n(e.label), r(e.shape);
2678
+ let t = e.color === void 0 ? s : J(e.color), i = e.fill ?? "outline";
2679
+ o((e) => e.color === t && e.fill === i);
2577
2680
  };
2578
2681
  }
2579
2682
  addLineFields() {
2580
- let e = this.controller;
2581
- this.addTitle("線");
2582
- let t = this.addSelect("種別", He, Vr, (t) => e.updateSelectedLine({ kind: t })), n = this.addSelect("補間", Ue, Hr, (t) => e.updateSelectedLine({ interpolation: t })), r = Z(this.element), i = Rr.map((e) => ({
2583
- name: e.label,
2584
- color: r(e.token),
2683
+ let { controller: e, messages: t } = this;
2684
+ this.addTitle(t.line);
2685
+ let n = this.addSelect(t.kind, Ve, t.kinds, (t) => e.updateSelectedLine({ kind: t })), r = this.addSelect(t.interpolation, He, t.interpolations, (t) => e.updateSelectedLine({ interpolation: t })), i = Z(this.element), a = Hr.map((e) => ({
2686
+ name: t.colors[e],
2687
+ color: i(e),
2585
2688
  fill: "solid"
2586
- })), a = this.addSwatches("色", i, {
2689
+ })), o = this.addSwatches(t.color, a, {
2587
2690
  onChange: ({ color: t }) => e.updateSelectedLine({ color: t }),
2588
2691
  onReset: () => e.updateSelectedLine({ color: null })
2589
- }), o = this.addNumber({
2590
- label: "太さ",
2692
+ }), s = this.addNumber({
2693
+ label: t.width,
2591
2694
  onChange: (t) => e.updateSelectedLine({ thickness: t }),
2592
2695
  onReset: () => e.updateSelectedLine({ thickness: null })
2593
2696
  });
2594
2697
  return (e) => {
2595
- t(e.kind), n(e.interpolation);
2596
- let r = e.color === void 0 ? void 0 : cr(e.color);
2597
- a((e) => e.color === r), o(e.thickness ?? 1);
2698
+ n(e.kind), r(e.interpolation);
2699
+ let t = e.color === void 0 ? void 0 : J(e.color);
2700
+ o((e) => e.color === t), s(e.thickness ?? 1);
2598
2701
  };
2599
2702
  }
2600
2703
  addTitle(e) {
@@ -2616,7 +2719,7 @@ var Wr = class extends n {
2616
2719
  let r = document.createElement("div");
2617
2720
  if (r.className = "playmaker-panel__row", r.append(...t), n !== void 0) {
2618
2721
  let t = document.createElement("button");
2619
- t.type = "button", t.className = "playmaker-panel__reset", t.textContent = "既定", t.setAttribute("aria-label", `${e}を既定に戻す`), t.addEventListener("click", n), r.appendChild(t);
2722
+ t.type = "button", t.className = "playmaker-panel__reset", t.textContent = this.messages.reset, t.setAttribute("aria-label", this.messages.resetField(e)), t.addEventListener("click", n), r.appendChild(t);
2620
2723
  }
2621
2724
  this.element.appendChild(r);
2622
2725
  }
@@ -2630,7 +2733,7 @@ var Wr = class extends n {
2630
2733
  let r = document.createElement("input");
2631
2734
  return r.type = "number", r.min = "0.25", r.step = "0.25", r.addEventListener("change", () => {
2632
2735
  let e = Number(r.value);
2633
- Je(e) && t(e);
2736
+ qe(e) && t(e);
2634
2737
  }), this.addRow(e, r, n), (e) => {
2635
2738
  r.value = String(e);
2636
2739
  };
@@ -2656,30 +2759,22 @@ var Wr = class extends n {
2656
2759
  t.value = e, t.textContent = n[e], i.appendChild(t);
2657
2760
  }
2658
2761
  return i.addEventListener("change", () => {
2659
- l(i.value, t) && r(i.value);
2762
+ u(i.value, t) && r(i.value);
2660
2763
  }), this.addRow(e, i), (e) => {
2661
2764
  i.value = e;
2662
2765
  };
2663
2766
  }
2664
- }, Gr = {
2665
- select: "選択",
2666
- "add-player": "選手を追加",
2667
- "draw-line": "線を描く"
2668
- }, Kr = "置くと 64 人を超えるフォーメーションは読み込めません", qr = {
2669
- "add-player": "選手は 64 人までです",
2670
- "draw-line": "線は 128 本までです"
2671
- }, Jr = {
2672
- offense: "オフェンス",
2673
- defense: "ディフェンス"
2674
2767
  };
2768
+ // src/browser/ui/toolbar.ts
2675
2769
  function $(e, t, n) {
2676
- e.setAttribute("aria-disabled", String(!t)), Yr(e, t ? void 0 : n);
2770
+ e.setAttribute("aria-disabled", String(!t)), Gr(e, t ? void 0 : n);
2677
2771
  }
2678
- function Yr(e, t) {
2772
+ function Gr(e, t) {
2679
2773
  t === void 0 ? e.removeAttribute("title") : e.title = t;
2680
2774
  }
2681
- var Xr = class extends n {
2775
+ var Kr = class extends r {
2682
2776
  element;
2777
+ messages;
2683
2778
  toolButtons = /* @__PURE__ */ new Map();
2684
2779
  zoneButtons = /* @__PURE__ */ new Map();
2685
2780
  undoButton;
@@ -2688,18 +2783,22 @@ var Xr = class extends n {
2688
2783
  commitButton;
2689
2784
  cancelButton;
2690
2785
  formationPicker;
2691
- constructor(t, n) {
2692
- super(), this.element = document.createElement("div"), this.element.className = "playmaker-toolbar";
2693
- for (let e of ke) {
2694
- let t = this.addButton(Gr[e], () => n.setTool(e));
2786
+ toolUnavailableReasons;
2787
+ constructor(e, n, r) {
2788
+ super(), this.messages = r, this.toolUnavailableReasons = {
2789
+ "add-player": r.playerLimit(64),
2790
+ "draw-line": r.lineLimit(128)
2791
+ }, this.element = document.createElement("div"), this.element.className = "playmaker-toolbar";
2792
+ for (let e of Ae) {
2793
+ let t = this.addButton(r.tool[e], () => n.setTool(e));
2695
2794
  this.toolButtons.set(e, t);
2696
2795
  }
2697
- this.addSeparator(), this.undoButton = this.addButton("元に戻す", () => n.undo()), this.redoButton = this.addButton("やり直す", () => n.redo()), this.deleteButton = this.addButton("削除", () => n.deleteSelection()), this.addSeparator();
2698
- for (let e of et) {
2699
- let t = this.addButton(nt[e], () => n.setFieldZone(e));
2796
+ this.addSeparator(), this.undoButton = this.addButton(r.undo, () => n.undo()), this.redoButton = this.addButton(r.redo, () => n.redo()), this.deleteButton = this.addButton(r.delete, () => n.deleteSelection()), this.addSeparator();
2797
+ for (let e of $e) {
2798
+ let t = this.addButton(r.zone[e], () => n.setFieldZone(e));
2700
2799
  this.zoneButtons.set(e, t);
2701
2800
  }
2702
- this.addSeparator(), this.formationPicker = this.addFormationPicker(n), this.addSeparator(), this.commitButton = this.addButton("線を確定", () => n.commitLine()), this.cancelButton = this.addButton("取消", () => n.cancelInteraction()), t.appendChild(this.element), this._register(e(() => this.element.remove())), this._register(n.onDidChangeViewState(() => this.sync(n))), this.sync(n);
2801
+ this.addSeparator(), this.formationPicker = this.addFormationPicker(n), this.addSeparator(), this.commitButton = this.addButton(r.finishLine, () => n.commitLine()), this.cancelButton = this.addButton(r.cancel, () => n.cancelInteraction()), e.appendChild(this.element), this._register(t(() => this.element.remove())), this._register(n.onDidChangeViewState(() => this.sync(n))), this.sync(n);
2703
2802
  }
2704
2803
  addButton(e, t) {
2705
2804
  let n = document.createElement("button");
@@ -2713,61 +2812,64 @@ var Xr = class extends n {
2713
2812
  }
2714
2813
  addFormationPicker(e) {
2715
2814
  let t = document.createElement("select");
2716
- t.className = "playmaker-toolbar__select", t.setAttribute("aria-label", "フォーメーション");
2815
+ t.className = "playmaker-toolbar__select", t.setAttribute("aria-label", this.messages.formation);
2717
2816
  let n = document.createElement("option");
2718
- n.value = "", n.textContent = "フォーメーション読込…", t.appendChild(n);
2817
+ n.value = "", n.textContent = this.messages.loadFormation, t.appendChild(n);
2719
2818
  for (let e of Fe) {
2720
2819
  let n = document.createElement("optgroup");
2721
- n.label = Jr[e];
2722
- for (let t of Rn.filter((t) => t.side === e)) {
2820
+ n.label = this.messages.side[e];
2821
+ for (let t of Vn.filter((t) => t.side === e)) {
2723
2822
  let e = document.createElement("option");
2724
2823
  e.value = t.id, e.textContent = t.name, n.appendChild(e);
2725
2824
  }
2726
2825
  t.appendChild(n);
2727
2826
  }
2728
2827
  return t.addEventListener("change", () => {
2729
- let n = zn(t.value);
2828
+ let n = Hn(t.value);
2730
2829
  n !== void 0 && e.loadFormation(n), t.value = "";
2731
2830
  }), this.element.appendChild(t), t;
2732
2831
  }
2733
2832
  sync(e) {
2734
2833
  let t = e.getViewState();
2735
- for (let [e, n] of this.toolButtons) n.setAttribute("aria-pressed", String(e === t.tool)), $(n, je(e, t), qr[e]);
2834
+ for (let [e, n] of this.toolButtons) n.setAttribute("aria-pressed", String(e === t.tool)), $(n, _(e, t), this.toolUnavailableReasons[e]);
2736
2835
  for (let [e, n] of this.zoneButtons) n.setAttribute("aria-pressed", String(e === t.fieldZone));
2737
2836
  $(this.undoButton, t.canUndo), $(this.redoButton, t.canRedo), $(this.deleteButton, t.selection.kind !== "none"), $(this.commitButton, t.isDrawing), $(this.cancelButton, t.isDrawing), this.syncFormationPicker(t);
2738
2837
  }
2739
2838
  syncFormationPicker(e) {
2740
2839
  let t = !1;
2741
2840
  for (let n of this.formationPicker.options) {
2742
- let r = zn(n.value);
2841
+ let r = Hn(n.value);
2743
2842
  n.disabled = r !== void 0 && !Me(r, e), t ||= n.disabled;
2744
2843
  }
2745
- Yr(this.formationPicker, t ? Kr : void 0);
2844
+ Gr(this.formationPicker, t ? this.messages.formationLimit(64) : void 0);
2746
2845
  }
2747
2846
  };
2748
2847
  // src/playmaker.ts
2749
- function Zr() {
2848
+ function qr() {
2750
2849
  try {
2751
2850
  return process.env.NODE_ENV !== "production";
2752
2851
  } catch {
2753
2852
  return !1;
2754
2853
  }
2755
2854
  }
2756
- var Qr = class {
2855
+ var Jr = class {
2757
2856
  onDidChange;
2758
- store = new t();
2857
+ store = new n();
2759
2858
  root;
2760
2859
  surface;
2761
2860
  session;
2762
2861
  currentMode;
2862
+ messages;
2763
2863
  panel;
2764
2864
  ui;
2765
- constructor(t, n = {}) {
2766
- this.currentMode = n.mode ?? "edit", this.session = this.store.add(new Cn(n.initialData)), this.onDidChange = this.session.onDidChange, n.onChange !== void 0 && this.store.add(this.session.onDidChange(n.onChange)), this.root = document.createElement("div"), this.root.className = "playmaker-root", this.root.dataset.mode = this.currentMode, t.appendChild(this.root), this.store.add(e(() => this.root.remove()));
2767
- let r = document.createElement("div");
2768
- r.className = "playmaker-stage", this.root.appendChild(r);
2769
- let { scene: i, overlay: a } = this.session.controller.getFrame();
2770
- this.surface = this.store.add(new Ir(r, i, this.surfaceOverlay(a))), this.ui = this.createUi(), this.store.add(this.session.onDidChangeScene(() => this.draw())), this.store.add(this.session.onDidReset(() => this.replaceUi()));
2865
+ constructor(e, n = {}) {
2866
+ this.currentMode = n.mode ?? "edit";
2867
+ let r = n.locale ?? "en";
2868
+ this.messages = nr(r), this.session = this.store.add(new wn(n.initialData)), this.onDidChange = this.session.onDidChange, n.onChange !== void 0 && this.store.add(this.session.onDidChange(n.onChange)), this.root = document.createElement("div"), this.root.className = "playmaker-root", this.root.dataset.mode = this.currentMode, this.root.lang = r, e.appendChild(this.root), this.store.add(t(() => this.root.remove()));
2869
+ let i = document.createElement("div");
2870
+ i.className = "playmaker-stage", this.root.appendChild(i);
2871
+ let { scene: a, overlay: o } = this.session.controller.getFrame();
2872
+ this.surface = this.store.add(new Br(i, a, this.surfaceOverlay(o))), this.ui = this.createUi(), this.store.add(this.session.onDidChangeScene(() => this.draw())), this.store.add(this.session.onDidReset(() => this.replaceUi()));
2771
2873
  }
2772
2874
  get mode() {
2773
2875
  return this.currentMode;
@@ -2794,7 +2896,7 @@ var Qr = class {
2794
2896
  return this.session.getPlayData();
2795
2897
  }
2796
2898
  exportToPng(e) {
2797
- return this.store.isDisposed ? Promise.reject(/* @__PURE__ */ Error("Playmaker: dispose したあとは PNG を書き出せません。")) : this.surface.exportToPngBlob(this.session.getSnapshot(), e);
2899
+ return this.store.isDisposed ? Promise.reject(/* @__PURE__ */ Error("Playmaker: cannot export a PNG after dispose.")) : this.surface.exportToPngBlob(this.session.getSnapshot(), e);
2798
2900
  }
2799
2901
  refresh() {
2800
2902
  this.store.isDisposed ? this.warnIgnoredAfterDispose("refresh") : (this.surface.refresh(), this.panel?.refresh());
@@ -2803,16 +2905,16 @@ var Qr = class {
2803
2905
  this.ui.dispose(), this.store.dispose();
2804
2906
  }
2805
2907
  warnIgnoredAfterDispose(e) {
2806
- Zr() && console.warn(`Playmaker: dispose したあとに ${e} を呼んだので、何もしません。`);
2908
+ qr() && console.warn(`Playmaker: ${e} was called after dispose, so it did nothing.`);
2807
2909
  }
2808
2910
  replaceUi() {
2809
- Lr(this.root, this.surface.canvas, () => {
2911
+ Vr(this.root, this.surface.canvas, () => {
2810
2912
  this.ui.dispose(), this.ui = this.createUi();
2811
2913
  });
2812
2914
  }
2813
2915
  createUi() {
2814
- let e = new t(), n = this.session.controller;
2815
- return this.panel = void 0, this.currentMode === "edit" && (e.add(new Xr(this.root, n)), this.panel = e.add(new Wr(this.root, n, this.surface.canvas)), e.add(new Qn(this.root, this.surface, n))), e;
2916
+ let e = new n(), t = this.session.controller;
2917
+ return this.panel = void 0, this.currentMode === "edit" && (e.add(new Kr(this.root, t, this.messages)), this.panel = e.add(new Wr(this.root, t, this.surface.canvas, this.messages)), e.add(new ir(this.root, this.surface, t))), e;
2816
2918
  }
2817
2919
  draw() {
2818
2920
  let { scene: e, overlay: t } = this.session.controller.getFrame();
@@ -2822,6 +2924,6 @@ var Qr = class {
2822
2924
  return this.currentMode === "edit" ? e : void 0;
2823
2925
  }
2824
2926
  };
2825
- export { it as CURRENT_PLAY_DATA_VERSION, Mt as FIELD_WIDTH_YARDS, nt as FIELD_ZONE_LABELS, et as FIELD_ZONE_VALUES, Rn as FORMATION_PRESETS, r as GRID_STEP_YARDS, Yn as PLAY_PRESETS, Qr as Playmaker, zn as getFormationPreset, Xn as getPlayPreset, ht as migratePlayData };
2927
+ export { rt as CURRENT_PLAY_DATA_VERSION, Pt as FIELD_WIDTH_YARDS, tt as FIELD_ZONE_LABELS, $e as FIELD_ZONE_VALUES, Vn as FORMATION_PRESETS, i as GRID_STEP_YARDS, er as PLAYMAKER_LOCALE_VALUES, Qn as PLAY_PRESETS, Jr as Playmaker, Hn as getFormationPreset, $n as getPlayPreset, ht as migratePlayData };
2826
2928
 
2827
2929
  //# sourceMappingURL=playmaker.js.map