diff --git a/.gitignore b/.gitignore
index 3cbc314..f946a1c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,13 @@
.worktrees/
/vendor/
-/var/
+/var/cache/
+/var/phpunit/
+/var/phpstan/
+/var/logs/
+/var/uploads/*
+!/var/uploads/.htaccess
+!/var/uploads/index.php
+/node_modules/
+/public/js/*.map
+.phpunit.result.cache
+.phpunit.cache
diff --git a/phpcs.xml b/phpcs.xml
index 367f237..a8df2a9 100644
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -4,6 +4,7 @@
src
tests
+ public/index.php
diff --git a/phpstan.neon b/phpstan.neon
index e7662a4..0d38a3b 100644
--- a/phpstan.neon
+++ b/phpstan.neon
@@ -3,4 +3,7 @@ parameters:
paths:
- src
- tests
+ - public/index.php
+ excludePaths:
+ - src/Views/*
tmpDir: var/phpstan
diff --git a/phpunit.xml b/phpunit.xml
index cf65ccf..dd70c0c 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -5,8 +5,11 @@
cacheDirectory="var/phpunit"
colors="true">
-
- tests
+
+ tests/Unit
+
+
+ tests/Integration
diff --git a/public/assets/styles.css b/public/assets/styles.css
new file mode 100644
index 0000000..f443cb8
--- /dev/null
+++ b/public/assets/styles.css
@@ -0,0 +1,21 @@
+* { box-sizing: border-box; }
+html, body { margin: 0; padding: 0; font-family: sans-serif; }
+body { padding: 1rem; max-width: 64rem; margin: 0 auto; }
+fieldset { margin: 0 0 1rem 0; padding: 0.5rem 1rem; }
+legend { font-weight: bold; }
+label { display: block; margin: 0.25rem 0; }
+input, select, button, textarea { font: inherit; }
+input[type="number"] { width: 5rem; }
+table.bf-grid { border-collapse: collapse; }
+table.bf-grid td { padding: 0; }
+table.bf-grid button { width: 2rem; height: 2rem; border: 1px solid #ccc; background: #fff; }
+table.bf-grid button[data-paint="open"] { background: #fff; }
+table.bf-grid button[data-paint="forest"] { background: #cfc; }
+table.bf-grid button[data-paint="rough"] { background: #fec; }
+table.bf-grid button[data-paint="water"] { background: #cce; }
+table.bf-grid button[data-paint="blocking"] { background: #444; color: #fff; }
+table.bf-grid button[data-objective="1"] { outline: 3px solid #c00; }
+table.bf-grid button[data-zone="alpha"] { outline: 3px solid #00c; }
+table.bf-grid button[data-zone="bravo"] { outline: 3px solid #0c0; }
+.bf-errors { color: #c00; }
+.bf-toast { background: #dfd; padding: 0.5rem 1rem; margin: 0.5rem 0; }
diff --git a/public/index.php b/public/index.php
new file mode 100644
index 0000000..0845a87
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,9 @@
+