ui/phase-21: sciences CRUD list, designer, and production-picker integration

Lights up the player-defined sciences feature: a table view with sort
and filter, a designer with four percent inputs and a strict
sum-equals-100 gate, and a Research-sub-row integration so the
planet production picker lists the user's sciences alongside the
four tech buttons. Phase 21 decisions are baked back into ui/PLAN.md
(no UpdateScience on the wire — write-once via createScience +
removeScience; percentages instead of fractions; sciences live under
the existing Research segment).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Ilia Denisov
2026-05-10 21:32:37 +02:00
parent 0509f2cde2
commit 7bea22b0b5
31 changed files with 2751 additions and 71 deletions
@@ -65,6 +65,7 @@ describe("planet inspector", () => {
freeIndustry: 187.5,
}),
localShipClass: [],
localScience: [],
routes: [],
planets: [],
mapWidth: 1,
@@ -138,6 +139,7 @@ describe("planet inspector", () => {
freeIndustry: 75,
}),
localShipClass: [],
localScience: [],
routes: [],
planets: [],
mapWidth: 1,
@@ -177,6 +179,7 @@ describe("planet inspector", () => {
materialsStockpile: 0,
}),
localShipClass: [],
localScience: [],
routes: [],
planets: [],
mapWidth: 1,
@@ -217,6 +220,7 @@ describe("planet inspector", () => {
y: -5,
}),
localShipClass: [],
localScience: [],
routes: [],
planets: [],
mapWidth: 1,
@@ -253,6 +257,7 @@ describe("planet inspector", () => {
resources: 5,
}),
localShipClass: [],
localScience: [],
routes: [],
planets: [],
mapWidth: 1,
@@ -293,6 +298,7 @@ describe("planet inspector", () => {
freeIndustry: 0,
}),
localShipClass: [],
localScience: [],
routes: [],
planets: [],
mapWidth: 1,
@@ -364,6 +370,7 @@ describe("planet inspector", () => {
freeIndustry: 0,
}),
localShipClass: [],
localScience: [],
routes: [],
planets: [],
mapWidth: 1,
@@ -402,6 +409,7 @@ describe("planet inspector", () => {
freeIndustry: 0,
}),
localShipClass: [],
localScience: [],
routes: [],
planets: [],
mapWidth: 1,