@automatajs/core 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.
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Handles mouse/touch interaction on the canvas.
3
+ * - Click toggles a cell
4
+ * - Drag paints alive cells
5
+ */
6
+ export class Interaction {
7
+ constructor(canvas, renderer, grid) {
8
+ this.enabled = true;
9
+ this.isDragging = false;
10
+ this.lastCell = null;
11
+ this.onClickCb = null;
12
+ this.onDragCb = null;
13
+ this.canvas = canvas;
14
+ this.renderer = renderer;
15
+ this.grid = grid;
16
+ this.handleMouseDown = this._onMouseDown.bind(this);
17
+ this.handleMouseMove = this._onMouseMove.bind(this);
18
+ this.handleMouseUp = this._onMouseUp.bind(this);
19
+ this.handleTouchStart = this._onTouchStart.bind(this);
20
+ this.handleTouchMove = this._onTouchMove.bind(this);
21
+ this.handleTouchEnd = this._onTouchEnd.bind(this);
22
+ this.attach();
23
+ }
24
+ attach() {
25
+ this.canvas.addEventListener("mousedown", this.handleMouseDown);
26
+ this.canvas.addEventListener("mousemove", this.handleMouseMove);
27
+ window.addEventListener("mouseup", this.handleMouseUp);
28
+ this.canvas.addEventListener("touchstart", this.handleTouchStart, {
29
+ passive: false,
30
+ });
31
+ this.canvas.addEventListener("touchmove", this.handleTouchMove, {
32
+ passive: false,
33
+ });
34
+ window.addEventListener("touchend", this.handleTouchEnd);
35
+ }
36
+ /** Update grid reference (e.g., after reset). */
37
+ setGrid(grid) {
38
+ this.grid = grid;
39
+ }
40
+ /** Set custom click callback. */
41
+ onCellClick(fn) {
42
+ this.onClickCb = fn;
43
+ }
44
+ /** Set custom drag callback. */
45
+ onCellDrag(fn) {
46
+ this.onDragCb = fn;
47
+ }
48
+ enable() {
49
+ this.enabled = true;
50
+ }
51
+ disable() {
52
+ this.enabled = false;
53
+ }
54
+ getCanvasCoords(e) {
55
+ const rect = this.canvas.getBoundingClientRect();
56
+ return {
57
+ x: e.clientX - rect.left,
58
+ y: e.clientY - rect.top,
59
+ };
60
+ }
61
+ _onMouseDown(e) {
62
+ if (!this.enabled)
63
+ return;
64
+ this.isDragging = true;
65
+ const coords = this.getCanvasCoords(e);
66
+ const cell = this.renderer.canvasToGrid(coords.x, coords.y, this.grid);
67
+ if (cell) {
68
+ this.lastCell = cell;
69
+ if (this.onClickCb) {
70
+ this.onClickCb(cell.x, cell.y, this.grid.get(cell.x, cell.y));
71
+ }
72
+ else {
73
+ this.grid.toggle(cell.x, cell.y);
74
+ }
75
+ }
76
+ }
77
+ _onMouseMove(e) {
78
+ if (!this.enabled || !this.isDragging)
79
+ return;
80
+ const coords = this.getCanvasCoords(e);
81
+ const cell = this.renderer.canvasToGrid(coords.x, coords.y, this.grid);
82
+ if (cell && (!this.lastCell || cell.x !== this.lastCell.x || cell.y !== this.lastCell.y)) {
83
+ this.lastCell = cell;
84
+ if (this.onDragCb) {
85
+ this.onDragCb(cell.x, cell.y, this.grid.get(cell.x, cell.y));
86
+ }
87
+ else {
88
+ this.grid.set(cell.x, cell.y, 1);
89
+ }
90
+ }
91
+ }
92
+ _onMouseUp() {
93
+ this.isDragging = false;
94
+ this.lastCell = null;
95
+ }
96
+ _onTouchStart(e) {
97
+ if (!this.enabled)
98
+ return;
99
+ e.preventDefault();
100
+ const touch = e.touches[0];
101
+ const coords = this.getCanvasCoords(touch);
102
+ const cell = this.renderer.canvasToGrid(coords.x, coords.y, this.grid);
103
+ if (cell) {
104
+ this.isDragging = true;
105
+ this.lastCell = cell;
106
+ if (this.onClickCb) {
107
+ this.onClickCb(cell.x, cell.y, this.grid.get(cell.x, cell.y));
108
+ }
109
+ else {
110
+ this.grid.toggle(cell.x, cell.y);
111
+ }
112
+ }
113
+ }
114
+ _onTouchMove(e) {
115
+ if (!this.enabled || !this.isDragging)
116
+ return;
117
+ e.preventDefault();
118
+ const touch = e.touches[0];
119
+ const coords = this.getCanvasCoords(touch);
120
+ const cell = this.renderer.canvasToGrid(coords.x, coords.y, this.grid);
121
+ if (cell && (!this.lastCell || cell.x !== this.lastCell.x || cell.y !== this.lastCell.y)) {
122
+ this.lastCell = cell;
123
+ if (this.onDragCb) {
124
+ this.onDragCb(cell.x, cell.y, this.grid.get(cell.x, cell.y));
125
+ }
126
+ else {
127
+ this.grid.set(cell.x, cell.y, 1);
128
+ }
129
+ }
130
+ }
131
+ _onTouchEnd() {
132
+ this.isDragging = false;
133
+ this.lastCell = null;
134
+ }
135
+ /** Remove all event listeners. */
136
+ destroy() {
137
+ this.canvas.removeEventListener("mousedown", this.handleMouseDown);
138
+ this.canvas.removeEventListener("mousemove", this.handleMouseMove);
139
+ window.removeEventListener("mouseup", this.handleMouseUp);
140
+ this.canvas.removeEventListener("touchstart", this.handleTouchStart);
141
+ this.canvas.removeEventListener("touchmove", this.handleTouchMove);
142
+ window.removeEventListener("touchend", this.handleTouchEnd);
143
+ }
144
+ }
145
+ //# sourceMappingURL=interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction.js","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { RuleFunction } from "./types";
2
+ /**
3
+ * Conway's Game of Life (B3/S23)
4
+ * - A dead cell with exactly 3 neighbors becomes alive.
5
+ * - A live cell with 2 or 3 neighbors survives.
6
+ * - All other cells die or stay dead.
7
+ */
8
+ export declare const gameOfLife: RuleFunction;
9
+ /**
10
+ * HighLife (B36/S23)
11
+ * Like Game of Life but also births at 6 neighbors. Famous for replicators.
12
+ */
13
+ export declare const highLife: RuleFunction;
14
+ /**
15
+ * Seeds (B2/S)
16
+ * Dead cells with exactly 2 neighbors come alive; all live cells die.
17
+ * Creates explosive growth patterns.
18
+ */
19
+ export declare const seeds: RuleFunction;
20
+ /**
21
+ * Day & Night (B3678/S34678)
22
+ * Symmetric rule — patterns behave the same inverted.
23
+ */
24
+ export declare const dayAndNight: RuleFunction;
25
+ /**
26
+ * Diamoeba (B35678/S5678)
27
+ * Creates large diamond-shaped regions.
28
+ */
29
+ export declare const diamoeba: RuleFunction;
30
+ /**
31
+ * Create a custom birth/survival rule from standard notation.
32
+ * @param birth - Array of neighbor counts that cause birth
33
+ * @param survival - Array of neighbor counts that allow survival
34
+ */
35
+ export declare function createRule(birth: number[], survival: number[]): RuleFunction;
36
+ export declare const patterns: {
37
+ /** Still life: Block */
38
+ readonly block: readonly [readonly [1, 1], readonly [1, 1]];
39
+ /** Still life: Beehive */
40
+ readonly beehive: readonly [readonly [0, 1, 1, 0], readonly [1, 0, 0, 1], readonly [0, 1, 1, 0]];
41
+ /** Oscillator: Blinker (period 2) */
42
+ readonly blinker: readonly [readonly [1, 1, 1]];
43
+ /** Oscillator: Toad (period 2) */
44
+ readonly toad: readonly [readonly [0, 1, 1, 1], readonly [1, 1, 1, 0]];
45
+ /** Oscillator: Beacon (period 2) */
46
+ readonly beacon: readonly [readonly [1, 1, 0, 0], readonly [1, 1, 0, 0], readonly [0, 0, 1, 1], readonly [0, 0, 1, 1]];
47
+ /** Oscillator: Pulsar (period 3) */
48
+ readonly pulsar: readonly [readonly [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0]];
49
+ /** Spaceship: Glider */
50
+ readonly glider: readonly [readonly [0, 1, 0], readonly [0, 0, 1], readonly [1, 1, 1]];
51
+ /** Spaceship: LWSS (Lightweight Spaceship) */
52
+ readonly lwss: readonly [readonly [0, 1, 0, 0, 1], readonly [1, 0, 0, 0, 0], readonly [1, 0, 0, 0, 1], readonly [1, 1, 1, 1, 0]];
53
+ /** Methuselah: R-pentomino */
54
+ readonly rPentomino: readonly [readonly [0, 1, 1], readonly [1, 1, 0], readonly [0, 1, 0]];
55
+ /** Methuselah: Acorn */
56
+ readonly acorn: readonly [readonly [0, 1, 0, 0, 0, 0, 0], readonly [0, 0, 0, 1, 0, 0, 0], readonly [1, 1, 0, 0, 1, 1, 1]];
57
+ /** Gun: Gosper Glider Gun */
58
+ readonly gosperGliderGun: readonly [readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], readonly [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
59
+ };
60
+ /** Preset rule registry */
61
+ export declare const presets: Record<string, RuleFunction>;
62
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,YAKxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,YAKtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,KAAK,EAAE,YAGnB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,YAKzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,YAKtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAS5E;AAID,eAAO,MAAM,QAAQ;IACnB,wBAAwB;;IAMxB,0BAA0B;;IAO1B,qCAAqC;;IAGrC,kCAAkC;;IAMlC,oCAAoC;;IAQpC,oCAAoC;;IAiBpC,wBAAwB;;IAOxB,8CAA8C;;IAQ9C,8BAA8B;;IAO9B,wBAAwB;;IAOxB,6BAA6B;;CAYrB,CAAC;AAEX,2BAA2B;AAC3B,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAMhD,CAAC"}
@@ -0,0 +1,158 @@
1
+ // ─── Built-in Presets ───
2
+ /**
3
+ * Conway's Game of Life (B3/S23)
4
+ * - A dead cell with exactly 3 neighbors becomes alive.
5
+ * - A live cell with 2 or 3 neighbors survives.
6
+ * - All other cells die or stay dead.
7
+ */
8
+ export const gameOfLife = (neighbors, currentState) => {
9
+ if (currentState === 1) {
10
+ return neighbors === 2 || neighbors === 3 ? 1 : 0;
11
+ }
12
+ return neighbors === 3 ? 1 : 0;
13
+ };
14
+ /**
15
+ * HighLife (B36/S23)
16
+ * Like Game of Life but also births at 6 neighbors. Famous for replicators.
17
+ */
18
+ export const highLife = (neighbors, currentState) => {
19
+ if (currentState === 1) {
20
+ return neighbors === 2 || neighbors === 3 ? 1 : 0;
21
+ }
22
+ return neighbors === 3 || neighbors === 6 ? 1 : 0;
23
+ };
24
+ /**
25
+ * Seeds (B2/S)
26
+ * Dead cells with exactly 2 neighbors come alive; all live cells die.
27
+ * Creates explosive growth patterns.
28
+ */
29
+ export const seeds = (neighbors, currentState) => {
30
+ if (currentState === 1)
31
+ return 0;
32
+ return neighbors === 2 ? 1 : 0;
33
+ };
34
+ /**
35
+ * Day & Night (B3678/S34678)
36
+ * Symmetric rule — patterns behave the same inverted.
37
+ */
38
+ export const dayAndNight = (neighbors, currentState) => {
39
+ if (currentState === 1) {
40
+ return [3, 4, 6, 7, 8].includes(neighbors) ? 1 : 0;
41
+ }
42
+ return [3, 6, 7, 8].includes(neighbors) ? 1 : 0;
43
+ };
44
+ /**
45
+ * Diamoeba (B35678/S5678)
46
+ * Creates large diamond-shaped regions.
47
+ */
48
+ export const diamoeba = (neighbors, currentState) => {
49
+ if (currentState === 1) {
50
+ return [5, 6, 7, 8].includes(neighbors) ? 1 : 0;
51
+ }
52
+ return [3, 5, 6, 7, 8].includes(neighbors) ? 1 : 0;
53
+ };
54
+ /**
55
+ * Create a custom birth/survival rule from standard notation.
56
+ * @param birth - Array of neighbor counts that cause birth
57
+ * @param survival - Array of neighbor counts that allow survival
58
+ */
59
+ export function createRule(birth, survival) {
60
+ const birthSet = new Set(birth);
61
+ const survivalSet = new Set(survival);
62
+ return (neighbors, currentState) => {
63
+ if (currentState === 1) {
64
+ return survivalSet.has(neighbors) ? 1 : 0;
65
+ }
66
+ return birthSet.has(neighbors) ? 1 : 0;
67
+ };
68
+ }
69
+ // ─── Famous Patterns (for stamping) ───
70
+ export const patterns = {
71
+ /** Still life: Block */
72
+ block: [
73
+ [1, 1],
74
+ [1, 1],
75
+ ],
76
+ /** Still life: Beehive */
77
+ beehive: [
78
+ [0, 1, 1, 0],
79
+ [1, 0, 0, 1],
80
+ [0, 1, 1, 0],
81
+ ],
82
+ /** Oscillator: Blinker (period 2) */
83
+ blinker: [[1, 1, 1]],
84
+ /** Oscillator: Toad (period 2) */
85
+ toad: [
86
+ [0, 1, 1, 1],
87
+ [1, 1, 1, 0],
88
+ ],
89
+ /** Oscillator: Beacon (period 2) */
90
+ beacon: [
91
+ [1, 1, 0, 0],
92
+ [1, 1, 0, 0],
93
+ [0, 0, 1, 1],
94
+ [0, 0, 1, 1],
95
+ ],
96
+ /** Oscillator: Pulsar (period 3) */
97
+ pulsar: [
98
+ [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
99
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
100
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
101
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
102
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
103
+ [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
104
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
105
+ [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
106
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
107
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
108
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
109
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
110
+ [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
111
+ ],
112
+ /** Spaceship: Glider */
113
+ glider: [
114
+ [0, 1, 0],
115
+ [0, 0, 1],
116
+ [1, 1, 1],
117
+ ],
118
+ /** Spaceship: LWSS (Lightweight Spaceship) */
119
+ lwss: [
120
+ [0, 1, 0, 0, 1],
121
+ [1, 0, 0, 0, 0],
122
+ [1, 0, 0, 0, 1],
123
+ [1, 1, 1, 1, 0],
124
+ ],
125
+ /** Methuselah: R-pentomino */
126
+ rPentomino: [
127
+ [0, 1, 1],
128
+ [1, 1, 0],
129
+ [0, 1, 0],
130
+ ],
131
+ /** Methuselah: Acorn */
132
+ acorn: [
133
+ [0, 1, 0, 0, 0, 0, 0],
134
+ [0, 0, 0, 1, 0, 0, 0],
135
+ [1, 1, 0, 0, 1, 1, 1],
136
+ ],
137
+ /** Gun: Gosper Glider Gun */
138
+ gosperGliderGun: [
139
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
140
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
141
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
142
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
143
+ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
144
+ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
145
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
146
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
147
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
148
+ ],
149
+ };
150
+ /** Preset rule registry */
151
+ export const presets = {
152
+ gameOfLife,
153
+ highLife,
154
+ seeds,
155
+ dayAndNight,
156
+ diamoeba,
157
+ };
158
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"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C,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;KAC1E;CACO,CAAC;AAEX,2BAA2B;AAC3B,MAAM,CAAC,MAAM,OAAO,GAAiC;IACnD,UAAU;IACV,QAAQ;IACR,KAAK;IACL,WAAW;IACX,QAAQ;CACT,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { Grid } from "./grid";
2
+ import type { StyleFunction } from "./types";
3
+ /**
4
+ * Canvas 2D Renderer for the cellular automata grid.
5
+ * Handles drawing cells, grid lines, and background.
6
+ * Supports a custom StyleFunction for per-cell coloring.
7
+ */
8
+ export declare class Renderer {
9
+ private canvas;
10
+ private ctx;
11
+ aliveColor: string;
12
+ deadColor: string;
13
+ backgroundColor: string;
14
+ gridLineColor: string;
15
+ showGridLines: boolean;
16
+ cellSize: number;
17
+ /** Optional style function for per-cell coloring */
18
+ styleFunction: StyleFunction | null;
19
+ private offsetX;
20
+ private offsetY;
21
+ private scale;
22
+ constructor(canvas: HTMLCanvasElement, options?: {
23
+ aliveColor?: string;
24
+ deadColor?: string;
25
+ backgroundColor?: string;
26
+ gridLineColor?: string;
27
+ showGridLines?: boolean;
28
+ cellSize?: number;
29
+ });
30
+ /** Calculate cell size to fit the grid in the canvas (in CSS pixels). */
31
+ private computeCellSize;
32
+ /** Resize the canvas to fill its container, respecting devicePixelRatio. */
33
+ resizeToContainer(): void;
34
+ /** Get the display dimensions (CSS pixels). */
35
+ getDisplaySize(): {
36
+ width: number;
37
+ height: number;
38
+ };
39
+ /** Render the entire grid to canvas. */
40
+ render(grid: Grid): void;
41
+ /** Convert canvas pixel coords to grid cell coords. */
42
+ canvasToGrid(canvasX: number, canvasY: number, grid: Grid): {
43
+ x: number;
44
+ y: number;
45
+ } | null;
46
+ /** Export the current canvas as a data URL. */
47
+ toDataURL(format?: "png" | "jpeg"): string;
48
+ /** Get the underlying canvas element. */
49
+ getCanvas(): HTMLCanvasElement;
50
+ }
51
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAQ,MAAM,SAAS,CAAC;AAEnD;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,GAAG,CAA2B;IAEtC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,aAAa,EAAE,aAAa,GAAG,IAAI,CAAQ;IAG3C,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,KAAK,CAAa;gBAGxB,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACd;IAeR,yEAAyE;IACzE,OAAO,CAAC,eAAe;IAQvB,4EAA4E;IAC5E,iBAAiB,IAAI,IAAI;IAazB,+CAA+C;IAC/C,cAAc,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAQnD,wCAAwC;IACxC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAyExB,uDAAuD;IACvD,YAAY,CACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,GACT;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAiBlC,+CAA+C;IAC/C,SAAS,CAAC,MAAM,GAAE,KAAK,GAAG,MAAc,GAAG,MAAM;IAIjD,yCAAyC;IACzC,SAAS,IAAI,iBAAiB;CAG/B"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Canvas 2D Renderer for the cellular automata grid.
3
+ * Handles drawing cells, grid lines, and background.
4
+ * Supports a custom StyleFunction for per-cell coloring.
5
+ */
6
+ export class Renderer {
7
+ constructor(canvas, options = {}) {
8
+ /** Optional style function for per-cell coloring */
9
+ this.styleFunction = null;
10
+ // Viewport for zoom/pan (future use)
11
+ this.offsetX = 0;
12
+ this.offsetY = 0;
13
+ this.scale = 1;
14
+ this.canvas = canvas;
15
+ const ctx = canvas.getContext("2d");
16
+ if (!ctx)
17
+ throw new Error("Could not get 2D rendering context");
18
+ this.ctx = ctx;
19
+ this.aliveColor = options.aliveColor ?? "#22d3ee";
20
+ this.deadColor = options.deadColor ?? "#0f172a";
21
+ this.backgroundColor = options.backgroundColor ?? "#020617";
22
+ this.gridLineColor = options.gridLineColor ?? "#1e293b";
23
+ this.showGridLines = options.showGridLines ?? true;
24
+ this.cellSize = options.cellSize ?? 0; // 0 = auto-calculate
25
+ }
26
+ /** Calculate cell size to fit the grid in the canvas (in CSS pixels). */
27
+ computeCellSize(grid) {
28
+ if (this.cellSize > 0)
29
+ return this.cellSize;
30
+ const { width, height } = this.getDisplaySize();
31
+ const maxCellW = Math.floor(width / grid.cols);
32
+ const maxCellH = Math.floor(height / grid.rows);
33
+ return Math.max(1, Math.min(maxCellW, maxCellH));
34
+ }
35
+ /** Resize the canvas to fill its container, respecting devicePixelRatio. */
36
+ resizeToContainer() {
37
+ const parent = this.canvas.parentElement;
38
+ if (!parent)
39
+ return;
40
+ const dpr = window.devicePixelRatio || 1;
41
+ const rect = parent.getBoundingClientRect();
42
+ this.canvas.width = rect.width * dpr;
43
+ this.canvas.height = rect.height * dpr;
44
+ this.canvas.style.width = `${rect.width}px`;
45
+ this.canvas.style.height = `${rect.height}px`;
46
+ this.ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
47
+ }
48
+ /** Get the display dimensions (CSS pixels). */
49
+ getDisplaySize() {
50
+ const dpr = window.devicePixelRatio || 1;
51
+ return {
52
+ width: this.canvas.width / dpr,
53
+ height: this.canvas.height / dpr,
54
+ };
55
+ }
56
+ /** Render the entire grid to canvas. */
57
+ render(grid) {
58
+ const { width, height } = this.getDisplaySize();
59
+ const ctx = this.ctx;
60
+ // Clear
61
+ ctx.fillStyle = this.backgroundColor;
62
+ ctx.fillRect(0, 0, width, height);
63
+ const cs = this.computeCellSize(grid);
64
+ // Calculate centering offset
65
+ const totalW = grid.cols * cs;
66
+ const totalH = grid.rows * cs;
67
+ const ox = Math.floor((width - totalW) / 2) + this.offsetX;
68
+ const oy = Math.floor((height - totalH) / 2) + this.offsetY;
69
+ if (this.styleFunction) {
70
+ // Per-cell style function rendering
71
+ for (let y = 0; y < grid.rows; y++) {
72
+ for (let x = 0; x < grid.cols; x++) {
73
+ const state = grid.current[y * grid.cols + x];
74
+ const cellCtx = grid.buildContext(x, y);
75
+ const result = this.styleFunction(state, cellCtx);
76
+ let color = null;
77
+ if (result === true) {
78
+ color = this.aliveColor;
79
+ }
80
+ else if (result === false) {
81
+ color = null; // dead — skip (background shows through)
82
+ }
83
+ else if (typeof result === "string") {
84
+ color = result;
85
+ }
86
+ else if (Array.isArray(result)) {
87
+ const [r, g, b, a] = result;
88
+ color = `rgba(${r},${g},${b},${a / 255})`;
89
+ }
90
+ if (color) {
91
+ ctx.fillStyle = color;
92
+ ctx.fillRect(ox + x * cs, oy + y * cs, cs, cs);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ else {
98
+ // Default fast path: single alive color
99
+ ctx.fillStyle = this.aliveColor;
100
+ for (let y = 0; y < grid.rows; y++) {
101
+ for (let x = 0; x < grid.cols; x++) {
102
+ if (grid.current[y * grid.cols + x]) {
103
+ ctx.fillRect(ox + x * cs, oy + y * cs, cs, cs);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ // Draw grid lines
109
+ if (this.showGridLines && cs > 2) {
110
+ ctx.strokeStyle = this.gridLineColor;
111
+ ctx.lineWidth = 0.5;
112
+ ctx.beginPath();
113
+ for (let x = 0; x <= grid.cols; x++) {
114
+ const px = ox + x * cs;
115
+ ctx.moveTo(px, oy);
116
+ ctx.lineTo(px, oy + totalH);
117
+ }
118
+ for (let y = 0; y <= grid.rows; y++) {
119
+ const py = oy + y * cs;
120
+ ctx.moveTo(ox, py);
121
+ ctx.lineTo(ox + totalW, py);
122
+ }
123
+ ctx.stroke();
124
+ }
125
+ }
126
+ /** Convert canvas pixel coords to grid cell coords. */
127
+ canvasToGrid(canvasX, canvasY, grid) {
128
+ const { width, height } = this.getDisplaySize();
129
+ const cs = this.computeCellSize(grid);
130
+ const totalW = grid.cols * cs;
131
+ const totalH = grid.rows * cs;
132
+ const ox = Math.floor((width - totalW) / 2) + this.offsetX;
133
+ const oy = Math.floor((height - totalH) / 2) + this.offsetY;
134
+ const gx = Math.floor((canvasX - ox) / cs);
135
+ const gy = Math.floor((canvasY - oy) / cs);
136
+ if (gx >= 0 && gx < grid.cols && gy >= 0 && gy < grid.rows) {
137
+ return { x: gx, y: gy };
138
+ }
139
+ return null;
140
+ }
141
+ /** Export the current canvas as a data URL. */
142
+ toDataURL(format = "png") {
143
+ return this.canvas.toDataURL(`image/${format}`);
144
+ }
145
+ /** Get the underlying canvas element. */
146
+ getCanvas() {
147
+ return this.canvas;
148
+ }
149
+ }
150
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}