diff --git a/client/css/style.css b/client/css/style.css
index 99d98f4..b427666 100644
--- a/client/css/style.css
+++ b/client/css/style.css
@@ -639,6 +639,12 @@ input:focus, select:focus { border-color: var(--accent); }
align-self: center;
opacity: 0.9;
}
+.unit-icon {
+ width: 26px;
+ height: 26px;
+ flex: 0 0 auto;
+ opacity: 0.9;
+}
.row-card .name { font-weight: 600; }
.row-card .desc { color: var(--muted); font-size: 12px; margin: 3px 0; }
.row-card .effects { font-size: 12px; color: #bcd4ff; }
@@ -741,8 +747,9 @@ input:focus, select:focus { border-color: var(--accent); }
.training-queue .queue-row .actions .aero { min-width: 110px; }
/* The city modal keeps a fixed, slightly larger size. The unit buttons sit in
- a fixed, non-scrolling box; the queue is the flexible part and scrolls, so
- adding units never stretches the card or pushes the buttons out of reach. */
+ a fixed-height box that scrolls when there are more units than fit; the queue
+ below is the flexible part and scrolls too, so adding units never stretches
+ the card or pushes the buttons out of reach. */
#modal-city .modal-card {
width: 680px;
height: min(80vh, 740px);
@@ -750,13 +757,19 @@ input:focus, select:focus { border-color: var(--accent); }
#modal-city #city-train-list {
flex: 0 0 auto;
width: 100%;
- height: 120px;
- max-height: none;
- overflow: hidden;
+ max-height: 168px;
+ overflow-y: auto;
display: flex;
flex-direction: column;
gap: 8px;
}
+#modal-city #city-train-list .train-button {
+ flex: 0 0 auto;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ text-align: left;
+}
#modal-city .training-status { flex: 0 0 auto; }
#modal-city .training-queue { flex: 1 1 auto; min-height: 0; }
.progress { height: 14px; margin-top: 8px; background: rgba(0, 0, 0, 0.5); border-radius: 7px; overflow: hidden; }
diff --git a/client/js/modals/city.js b/client/js/modals/city.js
index b43c528..33236dd 100644
--- a/client/js/modals/city.js
+++ b/client/js/modals/city.js
@@ -87,9 +87,16 @@ export class CityModal {
for (let index = 0; index < trainableUnits.length; index++) {
const proto = trainableUnits[index];
if (!proto.cost && proto.cost !== 0) continue;
- const button = $("");
+ const button = $("");
+ if (proto.icon) {
+ button.append(
+ $("
").attr({ src: `assets/${proto.icon}`, alt: proto.name })
+ );
+ }
const duration = ECONOMY.trainingHours(gdp, proto.cost);
- button.text(`${proto.name} — Cost ${groupDigits(proto.cost)} — ${hours(duration)}`);
+ button.append(
+ $("").text(`${proto.name} — Cost ${groupDigits(proto.cost)} — ${hours(duration)}`)
+ );
const serverIndex = proto.serverIndex !== undefined ? proto.serverIndex : index;
this.protoNames.set(serverIndex, proto.name);
button.on("click", () => this.onTrain(this.cityId, serverIndex));