zx-kit 0.2.0 → 0.2.2

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/audio.d.ts CHANGED
@@ -1,18 +1,56 @@
1
+ /**
2
+ * Creates the shared `AudioContext` and master `GainNode`. Idempotent — safe to call
3
+ * multiple times (subsequent calls are no-ops).
4
+ * Must be called inside a user-gesture handler (click or keydown) due to browser autoplay policy.
5
+ *
6
+ * @param volume - Master gain value (0.0–1.0, default `0.3`)
7
+ *
8
+ * @example
9
+ * window.addEventListener('keydown', () => initAudio(), { once: true })
10
+ */
1
11
  export declare function initAudio(volume?: number): void;
12
+ /**
13
+ * Resumes a suspended `AudioContext`. Browsers suspend the context on tab hide or first load.
14
+ * Call before scheduling any audio in the game loop.
15
+ *
16
+ * @example
17
+ * resumeAudio()
18
+ * beep(440, 80, getAudioContext()!.currentTime)
19
+ */
2
20
  export declare function resumeAudio(): void;
21
+ /**
22
+ * Returns the shared `AudioContext`, or `null` if `initAudio()` has not been called yet.
23
+ * Use to get `currentTime` for scheduling beeps and to check audio readiness.
24
+ *
25
+ * @example
26
+ * const audio = getAudioContext()
27
+ * if (audio) beep(440, 80, audio.currentTime)
28
+ */
3
29
  export declare function getAudioContext(): AudioContext | null;
30
+ /**
31
+ * Returns the master `GainNode`, or `null` before `initAudio()`.
32
+ * Connect your own oscillators/gains to this node to respect the global volume level.
33
+ *
34
+ * @example
35
+ * const osc = ctx.createOscillator()
36
+ * osc.connect(getMasterGain()!)
37
+ */
4
38
  export declare function getMasterGain(): GainNode | null;
5
- /** A single note in a melody pattern. freq=0 is a rest (silence). */
39
+ /** A single note in a melody pattern. Use `freq: 0` for a rest (silence). */
6
40
  export interface Note {
7
41
  freq: number;
8
42
  dur: number;
9
43
  }
10
44
  /**
11
- * Schedule a sequence of notes using the shared AudioContext.
45
+ * Schedules a sequence of notes on the shared `AudioContext`.
12
46
  * Silently exits if audio has not been initialised yet.
47
+ * `freq: 0` entries are treated as rests — they advance the timeline but produce no sound.
48
+ *
49
+ * @param notes - Array of `Note` objects to play in order
50
+ * @param startDelay - Optional delay before the first note in milliseconds (default `0`)
13
51
  *
14
52
  * @example
15
- * // Intro jingle — three notes with rests
53
+ * // Jingle — three notes with rests
16
54
  * playPattern([
17
55
  * { freq: 523, dur: 120 }, // C5
18
56
  * { freq: 0, dur: 40 }, // rest
@@ -25,5 +63,21 @@ export interface Note {
25
63
  * playPattern([{ freq: 440, dur: 100 }, { freq: 880, dur: 50 }], 500)
26
64
  */
27
65
  export declare function playPattern(notes: Note[], startDelay?: number): void;
66
+ /**
67
+ * Schedules a single square-wave beep on the shared `AudioContext`.
68
+ * Uses a 5ms linear ramp attack and release to avoid click artefacts.
69
+ * Routed through the master gain node.
70
+ * Prefer `playPattern` for sequences — use `beep` when you need precise timing control.
71
+ *
72
+ * @param freq - Frequency in Hz
73
+ * @param durationMs - Duration in milliseconds
74
+ * @param startTime - Absolute `AudioContext.currentTime` to start at
75
+ *
76
+ * @example
77
+ * const audio = getAudioContext()!
78
+ * resumeAudio()
79
+ * beep(440, 80, audio.currentTime)
80
+ * beep(880, 80, audio.currentTime + 0.15) // second note 150ms later
81
+ */
28
82
  export declare function beep(freq: number, durationMs: number, startTime: number): void;
29
83
  //# sourceMappingURL=audio.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,MAAM,SAAM,GAAG,IAAI,CAM5C;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AAED,wBAAgB,aAAa,IAAI,QAAQ,GAAG,IAAI,CAE/C;AAED,qEAAqE;AACrE,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,SAAI,GAAG,IAAI,CAS/D;AAGD,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAc9E"}
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,MAAM,SAAM,GAAG,IAAI,CAM5C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,QAAQ,GAAG,IAAI,CAE/C;AAED,6EAA6E;AAC7E,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,SAAI,GAAG,IAAI,CAS/D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAc9E"}
package/dist/audio.js CHANGED
@@ -1,5 +1,15 @@
1
1
  let ctx = null;
2
2
  let masterGain = null;
3
+ /**
4
+ * Creates the shared `AudioContext` and master `GainNode`. Idempotent — safe to call
5
+ * multiple times (subsequent calls are no-ops).
6
+ * Must be called inside a user-gesture handler (click or keydown) due to browser autoplay policy.
7
+ *
8
+ * @param volume - Master gain value (0.0–1.0, default `0.3`)
9
+ *
10
+ * @example
11
+ * window.addEventListener('keydown', () => initAudio(), { once: true })
12
+ */
3
13
  export function initAudio(volume = 0.3) {
4
14
  if (ctx)
5
15
  return;
@@ -8,22 +18,50 @@ export function initAudio(volume = 0.3) {
8
18
  masterGain.gain.value = volume;
9
19
  masterGain.connect(ctx.destination);
10
20
  }
21
+ /**
22
+ * Resumes a suspended `AudioContext`. Browsers suspend the context on tab hide or first load.
23
+ * Call before scheduling any audio in the game loop.
24
+ *
25
+ * @example
26
+ * resumeAudio()
27
+ * beep(440, 80, getAudioContext()!.currentTime)
28
+ */
11
29
  export function resumeAudio() {
12
30
  if (ctx && ctx.state === 'suspended')
13
31
  void ctx.resume();
14
32
  }
33
+ /**
34
+ * Returns the shared `AudioContext`, or `null` if `initAudio()` has not been called yet.
35
+ * Use to get `currentTime` for scheduling beeps and to check audio readiness.
36
+ *
37
+ * @example
38
+ * const audio = getAudioContext()
39
+ * if (audio) beep(440, 80, audio.currentTime)
40
+ */
15
41
  export function getAudioContext() {
16
42
  return ctx;
17
43
  }
44
+ /**
45
+ * Returns the master `GainNode`, or `null` before `initAudio()`.
46
+ * Connect your own oscillators/gains to this node to respect the global volume level.
47
+ *
48
+ * @example
49
+ * const osc = ctx.createOscillator()
50
+ * osc.connect(getMasterGain()!)
51
+ */
18
52
  export function getMasterGain() {
19
53
  return masterGain;
20
54
  }
21
55
  /**
22
- * Schedule a sequence of notes using the shared AudioContext.
56
+ * Schedules a sequence of notes on the shared `AudioContext`.
23
57
  * Silently exits if audio has not been initialised yet.
58
+ * `freq: 0` entries are treated as rests — they advance the timeline but produce no sound.
59
+ *
60
+ * @param notes - Array of `Note` objects to play in order
61
+ * @param startDelay - Optional delay before the first note in milliseconds (default `0`)
24
62
  *
25
63
  * @example
26
- * // Intro jingle — three notes with rests
64
+ * // Jingle — three notes with rests
27
65
  * playPattern([
28
66
  * { freq: 523, dur: 120 }, // C5
29
67
  * { freq: 0, dur: 40 }, // rest
@@ -47,7 +85,22 @@ export function playPattern(notes, startDelay = 0) {
47
85
  offset += note.dur;
48
86
  }
49
87
  }
50
- // Core primitive — schedule a square-wave beep on the shared AudioContext
88
+ /**
89
+ * Schedules a single square-wave beep on the shared `AudioContext`.
90
+ * Uses a 5ms linear ramp attack and release to avoid click artefacts.
91
+ * Routed through the master gain node.
92
+ * Prefer `playPattern` for sequences — use `beep` when you need precise timing control.
93
+ *
94
+ * @param freq - Frequency in Hz
95
+ * @param durationMs - Duration in milliseconds
96
+ * @param startTime - Absolute `AudioContext.currentTime` to start at
97
+ *
98
+ * @example
99
+ * const audio = getAudioContext()!
100
+ * resumeAudio()
101
+ * beep(440, 80, audio.currentTime)
102
+ * beep(880, 80, audio.currentTime + 0.15) // second note 150ms later
103
+ */
51
104
  export function beep(freq, durationMs, startTime) {
52
105
  if (!ctx || !masterGain)
53
106
  return;
package/dist/audio.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAAA,IAAI,GAAG,GAAwB,IAAI,CAAA;AACnC,IAAI,UAAU,GAAoB,IAAI,CAAA;AAEtC,MAAM,UAAU,SAAS,CAAC,MAAM,GAAG,GAAG;IACpC,IAAI,GAAG;QAAE,OAAM;IACf,GAAG,GAAG,IAAI,YAAY,EAAE,CAAA;IACxB,UAAU,GAAG,GAAG,CAAC,UAAU,EAAE,CAAA;IAC7B,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAA;IAC9B,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW;QAAE,KAAK,GAAG,CAAC,MAAM,EAAE,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAA;AACnB,CAAC;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,UAAU,GAAG,CAAC;IACvD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAA;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,WAAW,EAAE,CAAA;IACb,IAAI,MAAM,GAAG,UAAU,CAAA;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC,CAAA;QAC/E,MAAM,IAAI,IAAI,CAAC,GAAG,CAAA;IACpB,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,UAAkB,EAAE,SAAiB;IACtE,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU;QAAE,OAAM;IAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,EAAE,CAAA;IAC7B,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAA;IACnB,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAA;IAC1B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IACtC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,SAAS,GAAG,KAAK,CAAC,CAAA;IACzD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC,CAAA;IACpE,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC,CAAA;IACnE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACjB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACxB,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACpB,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAA;AAChD,CAAC"}
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAAA,IAAI,GAAG,GAAwB,IAAI,CAAA;AACnC,IAAI,UAAU,GAAoB,IAAI,CAAA;AAEtC;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,MAAM,GAAG,GAAG;IACpC,IAAI,GAAG;QAAE,OAAM;IACf,GAAG,GAAG,IAAI,YAAY,EAAE,CAAA;IACxB,UAAU,GAAG,GAAG,CAAC,UAAU,EAAE,CAAA;IAC7B,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAA;IAC9B,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW;QAAE,KAAK,GAAG,CAAC,MAAM,EAAE,CAAA;AACzD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAA;AACnB,CAAC;AAQD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,UAAU,GAAG,CAAC;IACvD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAA;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,WAAW,EAAE,CAAA;IACb,IAAI,MAAM,GAAG,UAAU,CAAA;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC,CAAA;QAC/E,MAAM,IAAI,IAAI,CAAC,GAAG,CAAA;IACpB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,UAAkB,EAAE,SAAiB;IACtE,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU;QAAE,OAAM;IAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,EAAE,CAAA;IAC7B,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAA;IACnB,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAA;IAC1B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IACtC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,SAAS,GAAG,KAAK,CAAC,CAAA;IACzD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC,CAAA;IACpE,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC,CAAA;IACnE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACjB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACxB,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACpB,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAA;AAChD,CAAC"}
package/dist/font.d.ts CHANGED
@@ -1,3 +1,25 @@
1
+ /**
2
+ * ZX Spectrum ROM bitmap font as a flat `Uint8Array`.
3
+ * 96 printable characters (ASCII 32–127), 8 bytes each — one byte per pixel row,
4
+ * bit 7 is the leftmost pixel. Character 127 is a solid block █.
5
+ * Access: `FONT[(charCode - 32) * 8 + row]`.
6
+ */
1
7
  export declare const FONT: Uint8Array<ArrayBuffer>;
8
+ /**
9
+ * Returns the bitmap byte for one row of an ASCII character.
10
+ * Bit 7 is the leftmost pixel; test with `byte & (0x80 >> bit)`.
11
+ * Returns `0` for out-of-range character codes.
12
+ *
13
+ * @param charCode - ASCII code (32–127); values outside this range return 0
14
+ * @param row - Pixel row within the glyph (0 = top, 7 = bottom)
15
+ *
16
+ * @example
17
+ * for (let row = 0; row < 8; row++) {
18
+ * const byte = getCharRow(65, row) // 'A'
19
+ * for (let bit = 0; bit < 8; bit++) {
20
+ * if (byte & (0x80 >> bit)) ctx.fillRect(x + bit, y + row, 1, 1)
21
+ * }
22
+ * }
23
+ */
2
24
  export declare function getCharRow(charCode: number, row: number): number;
3
25
  //# sourceMappingURL=font.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"font.d.ts","sourceRoot":"","sources":["../src/font.ts"],"names":[],"mappings":"AAoMA,eAAO,MAAM,IAAI,yBAAsB,CAAA;AAEvC,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhE"}
1
+ {"version":3,"file":"font.d.ts","sourceRoot":"","sources":["../src/font.ts"],"names":[],"mappings":"AAqMA;;;;;GAKG;AACH,eAAO,MAAM,IAAI,yBAAsB,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhE"}
package/dist/font.js CHANGED
@@ -1,4 +1,5 @@
1
1
  // ZX Spectrum ROM font — characters 32–127, 8 bytes per char (row-major, bit7=leftmost pixel)
2
+ // Source: original Spectrum ROM. Must not be altered — any change breaks Spectrum authenticity.
2
3
  const RAW = [
3
4
  // 32 space
4
5
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -193,7 +194,29 @@ const RAW = [
193
194
  // 127 solid block (used for lives / filled blocks)
194
195
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
195
196
  ];
197
+ /**
198
+ * ZX Spectrum ROM bitmap font as a flat `Uint8Array`.
199
+ * 96 printable characters (ASCII 32–127), 8 bytes each — one byte per pixel row,
200
+ * bit 7 is the leftmost pixel. Character 127 is a solid block █.
201
+ * Access: `FONT[(charCode - 32) * 8 + row]`.
202
+ */
196
203
  export const FONT = new Uint8Array(RAW);
204
+ /**
205
+ * Returns the bitmap byte for one row of an ASCII character.
206
+ * Bit 7 is the leftmost pixel; test with `byte & (0x80 >> bit)`.
207
+ * Returns `0` for out-of-range character codes.
208
+ *
209
+ * @param charCode - ASCII code (32–127); values outside this range return 0
210
+ * @param row - Pixel row within the glyph (0 = top, 7 = bottom)
211
+ *
212
+ * @example
213
+ * for (let row = 0; row < 8; row++) {
214
+ * const byte = getCharRow(65, row) // 'A'
215
+ * for (let bit = 0; bit < 8; bit++) {
216
+ * if (byte & (0x80 >> bit)) ctx.fillRect(x + bit, y + row, 1, 1)
217
+ * }
218
+ * }
219
+ */
197
220
  export function getCharRow(charCode, row) {
198
221
  const idx = charCode - 32;
199
222
  if (idx < 0 || idx >= 96)
package/dist/font.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"font.js","sourceRoot":"","sources":["../src/font.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,MAAM,GAAG,GAAsB;IAC7B,WAAW;IACX,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,eAAe;IACf,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,mDAAmD;IACnD,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;CACxC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;AAEvC,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,GAAW;IACtD,MAAM,GAAG,GAAG,QAAQ,GAAG,EAAE,CAAA;IACzB,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,CAAC,CAAA;IAClC,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAA;AAC5B,CAAC"}
1
+ {"version":3,"file":"font.js","sourceRoot":"","sources":["../src/font.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,gGAAgG;AAChG,MAAM,GAAG,GAAsB;IAC7B,WAAW;IACX,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,eAAe;IACf,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,OAAO;IACP,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,QAAQ;IACR,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;IACvC,mDAAmD;IACnD,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI;CACxC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,GAAW;IACtD,MAAM,GAAG,GAAG,QAAQ,GAAG,EAAE,CAAA;IACzB,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,CAAC,CAAA;IAClC,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAA;AAC5B,CAAC"}
package/dist/input.d.ts CHANGED
@@ -1,9 +1,51 @@
1
+ /** Movement direction returned by `tickMovement`. */
1
2
  export type Direction = 'up' | 'down' | 'left' | 'right';
3
+ /**
4
+ * Attaches global `keydown`/`keyup` listeners and configures key-repeat timing.
5
+ * Call once at startup after the DOM is ready.
6
+ * Arrow keys drive movement; `F`/`f` = flag; `P`/`p` = pause; `Ctrl+Shift+B` = debug toggle.
7
+ *
8
+ * @param repeatDelay - Milliseconds before auto-repeat starts after initial press (default `150`)
9
+ * @param repeatInterval - Milliseconds between repeat ticks while key is held (default `80`)
10
+ *
11
+ * @example
12
+ * initInput() // defaults: 150ms delay, 80ms repeat
13
+ * initInput(200, 60) // custom timing
14
+ */
2
15
  export declare function initInput(repeatDelay?: number, repeatInterval?: number): void;
16
+ /**
17
+ * Advances the key-repeat timer and returns the movement direction for this frame.
18
+ * Call once per frame with the frame delta in milliseconds.
19
+ * Returns a direction immediately on first press; repeats every `repeatInterval` ms while held.
20
+ * Returns `null` when no movement should occur this frame.
21
+ *
22
+ * @param dtMs - Frame delta in milliseconds
23
+ *
24
+ * @example
25
+ * function gameLoop(dt: number) {
26
+ * const dir = tickMovement(dt)
27
+ * if (dir) movePlayer(dir)
28
+ * }
29
+ */
3
30
  export declare function tickMovement(dtMs: number): Direction | null;
31
+ /** Consumes and returns the `F` key flag event (flag/unflag a cell). Resets to `false` after read. */
4
32
  export declare function consumeFlag(): boolean;
33
+ /** Consumes and returns the `Ctrl+Shift+B` debug toggle event. Resets to `false` after read. */
5
34
  export declare function consumeDebug(): boolean;
35
+ /** Consumes and returns the `P` key pause event. Resets to `false` after read. */
6
36
  export declare function consumePause(): boolean;
37
+ /**
38
+ * Consumes and returns `true` if any key was pressed since the last call.
39
+ * Use to dismiss intro screens or game-over overlays.
40
+ */
7
41
  export declare function consumeAnyKey(): boolean;
42
+ /**
43
+ * Returns `true` if the given key is currently held down.
44
+ *
45
+ * @param key - `KeyboardEvent.key` string (e.g. `'ArrowUp'`, `' '`, `'Enter'`)
46
+ *
47
+ * @example
48
+ * if (isHeld('ArrowUp')) { ... }
49
+ */
8
50
  export declare function isHeld(key: string): boolean;
9
51
  //# sourceMappingURL=input.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAmBxD,wBAAgB,SAAS,CAAC,WAAW,SAAM,EAAE,cAAc,SAAK,GAAG,IAAI,CAkCtE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAe3D;AAED,wBAAgB,WAAW,IAAI,OAAO,CAA+D;AACrG,wBAAgB,YAAY,IAAI,OAAO,CAA8D;AACrG,wBAAgB,YAAY,IAAI,OAAO,CAA8D;AACrG,wBAAgB,aAAa,IAAI,OAAO,CAA6D;AACrG,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAyB"}
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAmBxD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,WAAW,SAAM,EAAE,cAAc,SAAK,GAAG,IAAI,CAkCtE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAe3D;AAED,sGAAsG;AACtG,wBAAgB,WAAW,IAAI,OAAO,CAA+D;AAErG,gGAAgG;AAChG,wBAAgB,YAAY,IAAI,OAAO,CAA8D;AAErG,kFAAkF;AAClF,wBAAgB,YAAY,IAAI,OAAO,CAA8D;AAErG;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAA6D;AAErG;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAyB"}
package/dist/input.js CHANGED
@@ -12,6 +12,18 @@ let repeatPhase = 'idle';
12
12
  let pendingImmediate = null;
13
13
  let _repeatDelay = 150;
14
14
  let _repeatInterval = 80;
15
+ /**
16
+ * Attaches global `keydown`/`keyup` listeners and configures key-repeat timing.
17
+ * Call once at startup after the DOM is ready.
18
+ * Arrow keys drive movement; `F`/`f` = flag; `P`/`p` = pause; `Ctrl+Shift+B` = debug toggle.
19
+ *
20
+ * @param repeatDelay - Milliseconds before auto-repeat starts after initial press (default `150`)
21
+ * @param repeatInterval - Milliseconds between repeat ticks while key is held (default `80`)
22
+ *
23
+ * @example
24
+ * initInput() // defaults: 150ms delay, 80ms repeat
25
+ * initInput(200, 60) // custom timing
26
+ */
15
27
  export function initInput(repeatDelay = 150, repeatInterval = 80) {
16
28
  _repeatDelay = repeatDelay;
17
29
  _repeatInterval = repeatInterval;
@@ -45,6 +57,20 @@ export function initInput(repeatDelay = 150, repeatInterval = 80) {
45
57
  }
46
58
  });
47
59
  }
60
+ /**
61
+ * Advances the key-repeat timer and returns the movement direction for this frame.
62
+ * Call once per frame with the frame delta in milliseconds.
63
+ * Returns a direction immediately on first press; repeats every `repeatInterval` ms while held.
64
+ * Returns `null` when no movement should occur this frame.
65
+ *
66
+ * @param dtMs - Frame delta in milliseconds
67
+ *
68
+ * @example
69
+ * function gameLoop(dt: number) {
70
+ * const dir = tickMovement(dt)
71
+ * if (dir) movePlayer(dir)
72
+ * }
73
+ */
48
74
  export function tickMovement(dtMs) {
49
75
  if (pendingImmediate !== null) {
50
76
  const d = pendingImmediate;
@@ -62,9 +88,24 @@ export function tickMovement(dtMs) {
62
88
  }
63
89
  return null;
64
90
  }
91
+ /** Consumes and returns the `F` key flag event (flag/unflag a cell). Resets to `false` after read. */
65
92
  export function consumeFlag() { const v = pendingFlag; pendingFlag = false; return v; }
93
+ /** Consumes and returns the `Ctrl+Shift+B` debug toggle event. Resets to `false` after read. */
66
94
  export function consumeDebug() { const v = pendingDebug; pendingDebug = false; return v; }
95
+ /** Consumes and returns the `P` key pause event. Resets to `false` after read. */
67
96
  export function consumePause() { const v = pendingPause; pendingPause = false; return v; }
97
+ /**
98
+ * Consumes and returns `true` if any key was pressed since the last call.
99
+ * Use to dismiss intro screens or game-over overlays.
100
+ */
68
101
  export function consumeAnyKey() { const v = pendingAnyKey; pendingAnyKey = false; return v; }
102
+ /**
103
+ * Returns `true` if the given key is currently held down.
104
+ *
105
+ * @param key - `KeyboardEvent.key` string (e.g. `'ArrowUp'`, `' '`, `'Enter'`)
106
+ *
107
+ * @example
108
+ * if (isHeld('ArrowUp')) { ... }
109
+ */
69
110
  export function isHeld(key) { return held.has(key); }
70
111
  //# sourceMappingURL=input.js.map
package/dist/input.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
package/dist/palette.d.ts CHANGED
@@ -1,5 +1,16 @@
1
+ /** CSS pixel scale factor: 1 game pixel = 4 CSS pixels. */
1
2
  export declare const SCALE = 4;
3
+ /** Sprite and character grid size in game pixels (8×8 cell). */
2
4
  export declare const CELL = 8;
5
+ /**
6
+ * ZX Spectrum palette — exactly 15 colours as `#RRGGBB` hex strings.
7
+ * Normal brightness: `BLACK` … `WHITE`. Bright variants: `B_BLACK` … `B_WHITE` (prefix `B_`).
8
+ * **Never use any other hex values** — all game graphics must stay within this palette.
9
+ *
10
+ * @example
11
+ * ctx.fillStyle = C.B_CYAN
12
+ * ctx.fillRect(x, y, CELL, CELL)
13
+ */
3
14
  export declare const C: {
4
15
  readonly BLACK: "#000000";
5
16
  readonly BLUE: "#0000CD";
@@ -18,5 +29,13 @@ export declare const C: {
18
29
  readonly B_YELLOW: "#FFFF00";
19
30
  readonly B_WHITE: "#FFFFFF";
20
31
  };
32
+ /**
33
+ * Union of every hex value in the Spectrum palette (`typeof C[keyof typeof C]`).
34
+ * Use as the parameter type for `ink` / `paper` in your own drawing helpers
35
+ * to get compile-time palette enforcement.
36
+ *
37
+ * @example
38
+ * function highlight(ink: SpectrumColor) { ... }
39
+ */
21
40
  export type SpectrumColor = typeof C[keyof typeof C];
22
41
  //# sourceMappingURL=palette.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../src/palette.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,IAAI,CAAA;AACtB,eAAO,MAAM,IAAI,IAAI,CAAA;AAGrB,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;CAiBJ,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../src/palette.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,KAAK,IAAI,CAAA;AAEtB,gEAAgE;AAChE,eAAO,MAAM,IAAI,IAAI,CAAA;AAErB;;;;;;;;GAQG;AACH,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;CAiBJ,CAAA;AAEV;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,CAAA"}
package/dist/palette.js CHANGED
@@ -1,6 +1,16 @@
1
+ /** CSS pixel scale factor: 1 game pixel = 4 CSS pixels. */
1
2
  export const SCALE = 4;
3
+ /** Sprite and character grid size in game pixels (8×8 cell). */
2
4
  export const CELL = 8;
3
- // ZX Spectrum palette — exactly 15 colours, EXCLUSIVELY these hex values
5
+ /**
6
+ * ZX Spectrum palette — exactly 15 colours as `#RRGGBB` hex strings.
7
+ * Normal brightness: `BLACK` … `WHITE`. Bright variants: `B_BLACK` … `B_WHITE` (prefix `B_`).
8
+ * **Never use any other hex values** — all game graphics must stay within this palette.
9
+ *
10
+ * @example
11
+ * ctx.fillStyle = C.B_CYAN
12
+ * ctx.fillRect(x, y, CELL, CELL)
13
+ */
4
14
  export const C = {
5
15
  BLACK: '#000000',
6
16
  BLUE: '#0000CD',
@@ -1 +1 @@
1
- {"version":3,"file":"palette.js","sourceRoot":"","sources":["../src/palette.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAA;AACtB,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAA;AAErB,yEAAyE;AACzE,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,KAAK,EAAM,SAAS;IACpB,IAAI,EAAO,SAAS;IACpB,GAAG,EAAQ,SAAS;IACpB,OAAO,EAAI,SAAS;IACpB,KAAK,EAAM,SAAS;IACpB,IAAI,EAAO,SAAS;IACpB,MAAM,EAAK,SAAS;IACpB,KAAK,EAAM,SAAS;IACpB,OAAO,EAAI,SAAS;IACpB,MAAM,EAAK,SAAS;IACpB,KAAK,EAAM,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAI,SAAS;IACpB,MAAM,EAAK,SAAS;IACpB,QAAQ,EAAG,SAAS;IACpB,OAAO,EAAI,SAAS;CACZ,CAAA"}
1
+ {"version":3,"file":"palette.js","sourceRoot":"","sources":["../src/palette.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAA;AAEtB,gEAAgE;AAChE,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAA;AAErB;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,KAAK,EAAM,SAAS;IACpB,IAAI,EAAO,SAAS;IACpB,GAAG,EAAQ,SAAS;IACpB,OAAO,EAAI,SAAS;IACpB,KAAK,EAAM,SAAS;IACpB,IAAI,EAAO,SAAS;IACpB,MAAM,EAAK,SAAS;IACpB,KAAK,EAAM,SAAS;IACpB,OAAO,EAAI,SAAS;IACpB,MAAM,EAAK,SAAS;IACpB,KAAK,EAAM,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAI,SAAS;IACpB,MAAM,EAAK,SAAS;IACpB,QAAQ,EAAG,SAAS;IACpB,OAAO,EAAI,SAAS;CACZ,CAAA"}
@@ -1,16 +1,108 @@
1
+ /**
2
+ * Initialises a canvas element for pixel-perfect scaled rendering.
3
+ * Sets canvas dimensions, applies CSS size, disables image smoothing, applies `ctx.scale()`,
4
+ * and returns the 2D context. All subsequent draw calls use game-pixel coordinates.
5
+ * Call once at game startup.
6
+ *
7
+ * @param canvas - The `<canvas>` element to configure
8
+ * @param scale - CSS pixels per game pixel (e.g. `4` for standard ZX Spectrum display)
9
+ * @param width - Canvas width in game pixels (default `256`)
10
+ * @param height - Canvas height in game pixels (default `192`)
11
+ * @returns The configured `CanvasRenderingContext2D` (already scaled — draw in game pixels)
12
+ *
13
+ * @example
14
+ * const canvas = document.getElementById('game') as HTMLCanvasElement
15
+ * const ctx = setupCanvas(canvas, 4) // 256×192 game px → 1024×768 CSS px
16
+ * const ctx = setupCanvas(canvas, 4, 256, 208) // taller canvas for status rows
17
+ */
18
+ export declare function setupCanvas(canvas: HTMLCanvasElement, scale: number, width?: number, height?: number): CanvasRenderingContext2D;
19
+ /**
20
+ * Flips an 8×8 sprite horizontally. Returns a new `Uint8Array`.
21
+ * Use to derive left-facing sprites from right-facing definitions at module load time.
22
+ *
23
+ * @example
24
+ * export const PLAYER_RIGHT = new Uint8Array([0x18, 0x3C, ...])
25
+ * export const PLAYER_LEFT = mirrorSprite(PLAYER_RIGHT)
26
+ */
1
27
  export declare function mirrorSprite(src: Uint8Array): Uint8Array;
28
+ /**
29
+ * Draws an 8×8 sprite at game coordinates `(x, y)`.
30
+ * Always fills the full `CELL×CELL` area with `paper` first, then renders `ink` pixels.
31
+ *
32
+ * @param ctx - Target canvas context
33
+ * @param sprite - 8-byte sprite bitmap (one byte per row, bit 7 = leftmost pixel)
34
+ * @param x - Left edge in game pixels
35
+ * @param y - Top edge in game pixels
36
+ * @param ink - Foreground color (`C.*` palette value)
37
+ * @param paper - Background color (`C.*` palette value)
38
+ *
39
+ * @example
40
+ * drawSprite(ctx, MINE_SPRITE, col * CELL, row * CELL, C.B_RED, C.BLACK)
41
+ */
2
42
  export declare function drawSprite(ctx: CanvasRenderingContext2D, sprite: Uint8Array, x: number, y: number, ink: string, paper: string): void;
43
+ /**
44
+ * Draws a single ASCII character at game coordinates using the ROM font.
45
+ * If `paper` is omitted the background is not cleared (transparent).
46
+ *
47
+ * @param ctx - Target canvas context
48
+ * @param code - ASCII character code (32–127); 127 = solid block █
49
+ * @param x - Left edge in game pixels
50
+ * @param y - Top edge in game pixels
51
+ * @param ink - Foreground color
52
+ * @param paper - Optional background color; omit for transparent background
53
+ *
54
+ * @example
55
+ * drawChar(ctx, 127, x, y, C.B_GREEN, C.BLACK) // solid block █
56
+ * drawChar(ctx, 'A'.charCodeAt(0), x, y, C.B_WHITE) // transparent bg
57
+ */
3
58
  export declare function drawChar(ctx: CanvasRenderingContext2D, code: number, x: number, y: number, ink: string, paper?: string): void;
59
+ /**
60
+ * Draws a string left-to-right starting at game coordinates `(x, y)`.
61
+ * Each character occupies one `CELL`-wide slot.
62
+ *
63
+ * @param ctx - Target canvas context
64
+ * @param text - ASCII string to render
65
+ * @param x - Left edge in game pixels
66
+ * @param y - Top edge in game pixels
67
+ * @param ink - Foreground color
68
+ * @param paper - Optional background color
69
+ *
70
+ * @example
71
+ * drawText(ctx, 'SCORE:00000', 0, statusY, C.B_WHITE, C.BLACK)
72
+ */
4
73
  export declare function drawText(ctx: CanvasRenderingContext2D, text: string, x: number, y: number, ink: string, paper?: string): void;
5
74
  /**
6
- * Flash document.body background between `color` and `resetColor`.
7
- * Fire-and-forget — does not block.
75
+ * Draws a string centered horizontally within a canvas of `cols` character columns.
76
+ *
77
+ * @param ctx - Target canvas context
78
+ * @param text - ASCII string to render
79
+ * @param y - Top edge in game pixels
80
+ * @param cols - Total character columns (canvas width ÷ `CELL`, e.g. 32 for standard Spectrum)
81
+ * @param ink - Foreground color
82
+ * @param paper - Optional background color
83
+ *
84
+ * @example
85
+ * // Bind cols once to avoid passing it every time:
86
+ * const centered = (ctx: CanvasRenderingContext2D, text: string, y: number, ink: string) =>
87
+ * drawTextCentered(ctx, text, y, COLS, ink)
88
+ * centered(ctx, 'GAME OVER', y, C.B_RED)
89
+ */
90
+ export declare function drawTextCentered(ctx: CanvasRenderingContext2D, text: string, y: number, cols: number, ink: string, paper?: string): void;
91
+ /**
92
+ * Flashes `document.body.style.backgroundColor` between `color` and `resetColor`.
93
+ * Fire-and-forget — does not block. Uses `setInterval` internally.
94
+ * One "flash" = one `color → resetColor` cycle; total steps = `times * 2`.
95
+ * Always resets to `resetColor` on completion.
96
+ *
97
+ * @param color - Flash color (`C.*` palette value or any CSS color string)
98
+ * @param times - Number of flashes
99
+ * @param intervalMs - Duration of each half-cycle in milliseconds
100
+ * @param resetColor - Final color after flashing (default `C.BLACK`)
8
101
  *
9
102
  * @example
10
- * flashBorder(C.B_RED, 3, 150) // explosion — 3 red flashes
103
+ * flashBorder(C.B_RED, 3, 150) // explosion — 3 red flashes → black
11
104
  * flashBorder(C.B_GREEN, 2, 200) // level complete
12
- * flashBorder(C.B_CYAN, 2, 120, C.BLUE) // reset to blue border
105
+ * flashBorder(C.B_CYAN, 2, 120, C.BLUE) // flash → reset to blue border
13
106
  */
14
107
  export declare function flashBorder(color: string, times: number, intervalMs: number, resetColor?: string): void;
15
- export declare function drawTextCentered(ctx: CanvasRenderingContext2D, text: string, y: number, cols: number, ink: string, paper?: string): void;
16
108
  //# sourceMappingURL=renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,CAUxD;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,UAAU,EAClB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GACzB,IAAI,CAUN;AAED,wBAAgB,QAAQ,CACtB,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAC1B,IAAI,CAYN;AAED,wBAAgB,QAAQ,CACtB,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAC1B,IAAI,CAIN;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAgB,GAC3B,IAAI,CAWN;AAGD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAC1B,IAAI,CAGN"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,MAAM,EACb,KAAK,SAAM,EACX,MAAM,SAAM,GACX,wBAAwB,CAS1B;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,CAUxD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,UAAU,EAClB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GACzB,IAAI,CAUN;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAC1B,IAAI,CAYN;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAC1B,IAAI,CAIN;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAC1B,IAAI,CAGN;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAgB,GAC3B,IAAI,CAWN"}