Refine viewer ship rail layout
This commit is contained in:
@@ -112,7 +112,8 @@ The viewer still works as an observer/debug client first.
|
|||||||
|
|
||||||
Recommended work:
|
Recommended work:
|
||||||
|
|
||||||
- fix the current `followedShipId` regression in `GameViewer.ts`
|
- keep tuning the tactical and `camera-follow` camera feel
|
||||||
|
- add clearer camera mode affordances in the HUD / ship rail
|
||||||
- show station module state and construction state
|
- show station module state and construction state
|
||||||
- show dock occupancy and waiting ships
|
- show dock occupancy and waiting ships
|
||||||
- expose fuel-chain health
|
- expose fuel-chain health
|
||||||
|
|||||||
16
SESSION.md
16
SESSION.md
@@ -49,19 +49,24 @@ The viewer currently supports:
|
|||||||
- structures
|
- structures
|
||||||
- celestials
|
- celestials
|
||||||
- `WASD` panning on the `XZ` plane
|
- `WASD` panning on the `XZ` plane
|
||||||
- middle-mouse orbit camera
|
- middle-mouse tactical orbit camera
|
||||||
- smooth wheel zoom across local, system, and universe scales
|
- smooth wheel zoom across local, system, and universe scales
|
||||||
- layered system presentation
|
- layered system presentation
|
||||||
- one active local system with detailed content
|
- one active local system with detailed content
|
||||||
- non-local systems projected as distant shell markers
|
- non-local systems projected as distant shell markers
|
||||||
- procedurally animated planets and moons from orbital metadata
|
- procedurally animated planets and moons from orbital metadata
|
||||||
- ringed planets, binary star presentation, and richer resource visuals
|
- ringed planets, binary star presentation, and richer resource visuals
|
||||||
- follow-camera behavior for selected ships
|
- explicit camera modes
|
||||||
|
- tactical free-move / orbit camera
|
||||||
|
- `camera-follow` third-person trailing camera for ships
|
||||||
- dedicated `System` and `Focus` panels on the right HUD
|
- dedicated `System` and `Focus` panels on the right HUD
|
||||||
- hover labels for projected system markers
|
- hover labels for projected system markers
|
||||||
- a bottom ship list with horizontally scrolling ship cards
|
- a bottom ship list with horizontally scrolling ship cards
|
||||||
- card click selects and follows the ship
|
- card click selects the ship
|
||||||
|
- card double-click selects, focuses, and enables `camera-follow`
|
||||||
|
- cards now span the full screen width as a compact bottom rail
|
||||||
- cards show ship name, class, fuel, energy, state, and order
|
- cards show ship name, class, fuel, energy, state, and order
|
||||||
|
- cards include a compact history icon button under the ship-class tag
|
||||||
- multiple floating history windows for debugging
|
- multiple floating history windows for debugging
|
||||||
- openable from ship cards
|
- openable from ship cards
|
||||||
- independently movable and resizable
|
- independently movable and resizable
|
||||||
@@ -159,6 +164,8 @@ The runtime model still follows the intended layered control architecture:
|
|||||||
- added viewer-side interpolation / short extrapolation for movement
|
- added viewer-side interpolation / short extrapolation for movement
|
||||||
- added a plain-text network statistics readout
|
- added a plain-text network statistics readout
|
||||||
- reworked the camera with smoother zoom, orbit, panning, and marquee selection
|
- reworked the camera with smoother zoom, orbit, panning, and marquee selection
|
||||||
|
- split viewer camera behavior into tactical and `camera-follow` modes
|
||||||
|
- added ship-card double-click to focus and enter follow mode
|
||||||
- cleaned up several viewer HUD elements and removed redundant panel content
|
- cleaned up several viewer HUD elements and removed redundant panel content
|
||||||
- expanded the backend world into a large procedural galaxy with elevated vertical variance
|
- expanded the backend world into a large procedural galaxy with elevated vertical variance
|
||||||
- added deterministic orbital metadata for planets and client-side orbital animation in the viewer
|
- added deterministic orbital metadata for planets and client-side orbital animation in the viewer
|
||||||
@@ -204,7 +211,7 @@ The runtime model still follows the intended layered control architecture:
|
|||||||
- no command submission UI yet
|
- no command submission UI yet
|
||||||
- local / projected / galaxy presentation is now workable but still needs tuning
|
- local / projected / galaxy presentation is now workable but still needs tuning
|
||||||
- shell marker art direction and scaling still need polish
|
- shell marker art direction and scaling still need polish
|
||||||
- local camera feel still needs iteration
|
- tactical/follow camera tuning still needs iteration
|
||||||
- projected-system composition is still a viewer illusion, not a full multi-layer renderer
|
- projected-system composition is still a viewer illusion, not a full multi-layer renderer
|
||||||
- the galaxy is much larger now, so viewer performance and visual density need active tuning
|
- the galaxy is much larger now, so viewer performance and visual density need active tuning
|
||||||
- moon rendering is procedural from counts, not authored moon-by-moon data
|
- moon rendering is procedural from counts, not authored moon-by-moon data
|
||||||
@@ -216,7 +223,6 @@ The runtime model still follows the intended layered control architecture:
|
|||||||
- constructor logic only builds from station-local inventory
|
- constructor logic only builds from station-local inventory
|
||||||
- it does not yet fetch module materials from other stations or ships
|
- it does not yet fetch module materials from other stations or ships
|
||||||
- station installed modules and active construction are not yet exposed in the viewer contract
|
- station installed modules and active construction are not yet exposed in the viewer contract
|
||||||
- some viewer follow-camera code is currently broken by a pre-existing missing `followedShipId` property
|
|
||||||
- piracy and faction growth are still functional rather than strategically deep
|
- piracy and faction growth are still functional rather than strategically deep
|
||||||
- no persistence for saves, seeds, or reconnect state
|
- no persistence for saves, seeds, or reconnect state
|
||||||
|
|
||||||
|
|||||||
@@ -326,31 +326,34 @@ canvas {
|
|||||||
|
|
||||||
.ship-strip {
|
.ship-strip {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 20px;
|
left: 0;
|
||||||
bottom: 20px;
|
right: 0;
|
||||||
width: min(920px, calc(100vw - 440px));
|
bottom: 0;
|
||||||
min-height: 140px;
|
width: 100vw;
|
||||||
border-radius: 24px;
|
min-height: 128px;
|
||||||
padding: 16px;
|
border-radius: 0;
|
||||||
|
padding: 0;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
gap: 12px;
|
gap: 0;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
pointer-events: auto;
|
pointer-events: auto;
|
||||||
scrollbar-width: thin;
|
scrollbar-width: thin;
|
||||||
|
background: linear-gradient(180deg, rgba(5, 10, 18, 0), rgba(5, 10, 18, 0.92) 28%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.ship-card {
|
.ship-card {
|
||||||
border-radius: 18px;
|
border-radius: 0;
|
||||||
border: 1px solid rgba(127, 214, 255, 0.14);
|
border-top: 1px solid rgba(127, 214, 255, 0.14);
|
||||||
background: linear-gradient(180deg, rgba(11, 23, 43, 0.85), rgba(7, 15, 28, 0.9));
|
border-right: 1px solid rgba(127, 214, 255, 0.1);
|
||||||
padding: 14px;
|
background: linear-gradient(180deg, rgba(10, 20, 36, 0.96), rgba(6, 12, 22, 0.98));
|
||||||
min-width: 220px;
|
padding: 10px 12px 12px;
|
||||||
max-width: 220px;
|
min-width: 208px;
|
||||||
|
max-width: 208px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 8px;
|
gap: 6px;
|
||||||
color: var(--text);
|
color: var(--text);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: transform 140ms ease, border-color 140ms ease, box-shadow 140ms ease, background 140ms ease;
|
transition: transform 140ms ease, border-color 140ms ease, box-shadow 140ms ease, background 140ms ease;
|
||||||
@@ -363,7 +366,7 @@ canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ship-card.is-selected {
|
.ship-card.is-selected {
|
||||||
border-color: rgba(255, 191, 105, 0.82);
|
border-top-color: rgba(255, 191, 105, 0.82);
|
||||||
background: linear-gradient(180deg, rgba(31, 33, 20, 0.9), rgba(20, 18, 10, 0.92));
|
background: linear-gradient(180deg, rgba(31, 33, 20, 0.9), rgba(20, 18, 10, 0.92));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,28 +381,66 @@ canvas {
|
|||||||
gap: 10px;
|
gap: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ship-card h3 {
|
||||||
|
font-size: 0.82rem;
|
||||||
|
line-height: 1.15;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ship-card-meta {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-end;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
.ship-card-badge {
|
.ship-card-badge {
|
||||||
padding: 4px 8px;
|
padding: 3px 8px;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
background: rgba(127, 214, 255, 0.12);
|
background: rgba(127, 214, 255, 0.12);
|
||||||
color: var(--accent);
|
color: var(--accent);
|
||||||
font-size: 0.68rem;
|
font-size: 0.64rem;
|
||||||
letter-spacing: 0.12em;
|
letter-spacing: 0.12em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ship-card p {
|
.ship-card p {
|
||||||
margin: 6px 0 0;
|
margin: 2px 0 0;
|
||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
line-height: 1.45;
|
line-height: 1.35;
|
||||||
font-family: "IBM Plex Mono", "SFMono-Regular", monospace;
|
font-family: "IBM Plex Mono", "SFMono-Regular", monospace;
|
||||||
font-size: 0.77rem;
|
font-size: 0.72rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ship-card-header + p {
|
||||||
|
font-size: 0.62rem;
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ship-card-ai {
|
||||||
|
margin-top: 2px;
|
||||||
|
padding-top: 6px;
|
||||||
|
border-top: 1px solid rgba(127, 214, 255, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ship-card-section-title {
|
||||||
|
margin: 0;
|
||||||
|
color: var(--accent);
|
||||||
|
letter-spacing: 0.14em;
|
||||||
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ship-card-history-button {
|
.ship-card-history-button {
|
||||||
margin-top: auto;
|
width: 24px;
|
||||||
padding: 8px 12px;
|
height: 24px;
|
||||||
align-self: flex-start;
|
padding: 0;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
align-self: flex-end;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
line-height: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.swatch {
|
.swatch {
|
||||||
@@ -411,8 +452,7 @@ canvas {
|
|||||||
|
|
||||||
@media (max-width: 1080px) {
|
@media (max-width: 1080px) {
|
||||||
.ship-strip {
|
.ship-strip {
|
||||||
right: 20px;
|
width: 100vw;
|
||||||
width: auto;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -452,11 +492,11 @@ canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ship-strip {
|
.ship-strip {
|
||||||
left: 20px;
|
left: 0;
|
||||||
right: 20px;
|
right: 0;
|
||||||
bottom: 20px;
|
bottom: 0;
|
||||||
width: auto;
|
width: 100vw;
|
||||||
min-height: 126px;
|
min-height: 120px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.history-window {
|
.history-window {
|
||||||
|
|||||||
Reference in New Issue
Block a user