Files
JARVIS/frontend/public/star-office/index.html

370 lines
9.0 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Jarvis Star Office Stage</title>
<style>
@font-face {
font-family: 'ArkPixel';
src: url('./fonts/ark-pixel-12px-proportional-zh_cn.ttf.woff2') format('woff2');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'ArkPixelLatin';
src: url('./fonts/ark-pixel-12px-proportional-latin.ttf.woff2') format('woff2');
font-weight: normal;
font-style: normal;
}
:root {
color-scheme: dark;
--bg: #050810;
--panel: rgba(8, 16, 29, 0.86);
--panel-border: rgba(97, 211, 255, 0.18);
--text: #e9fbff;
--muted: #86cbe2;
--accent: #6fe0ff;
--warn: #ffd36b;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
width: 100%;
min-height: 100%;
background:
radial-gradient(circle at top left, rgba(64, 176, 255, 0.12), transparent 28%),
radial-gradient(circle at top right, rgba(255, 196, 94, 0.08), transparent 20%),
linear-gradient(180deg, #07111d 0%, #03070e 100%);
color: var(--text);
font-family: 'ArkPixel', 'ArkPixelLatin', 'Courier New', monospace;
}
body {
display: flex;
flex-direction: column;
gap: 14px;
padding: 14px;
overflow-y: auto;
}
.hud {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 12px 14px;
border: 1px solid var(--panel-border);
background: var(--panel);
backdrop-filter: blur(12px);
}
.hud-copy {
display: grid;
gap: 4px;
}
.hud-kicker,
.meta-chip,
.panel-kicker,
.license-note {
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted);
}
.hud-title {
font-size: 24px;
color: var(--text);
letter-spacing: 0.08em;
}
.hud-subtitle {
font-size: 12px;
line-height: 1.5;
color: rgba(233, 251, 255, 0.74);
max-width: 760px;
}
.hud-meta {
display: flex;
gap: 8px;
flex-wrap: wrap;
justify-content: flex-end;
}
.meta-chip {
padding: 8px 10px;
border: 1px solid rgba(111, 224, 255, 0.18);
background: rgba(7, 18, 30, 0.92);
color: var(--text);
letter-spacing: 0.1em;
}
.stage {
display: grid;
gap: 14px;
}
.game-shell {
position: relative;
width: 100%;
aspect-ratio: 16 / 9;
border: 1px solid rgba(107, 214, 255, 0.16);
background: rgba(6, 13, 22, 0.88);
overflow: hidden;
}
#game-container {
width: 100%;
height: 100%;
}
#game-container canvas {
width: 100% !important;
height: 100% !important;
image-rendering: pixelated;
display: block;
}
.overlay-status {
position: absolute;
left: 14px;
bottom: 14px;
max-width: calc(100% - 28px);
padding: 10px 12px;
border: 1px solid rgba(111, 224, 255, 0.16);
background: rgba(2, 8, 16, 0.82);
color: var(--text);
font-size: 12px;
line-height: 1.45;
z-index: 5;
pointer-events: none;
}
#coords-overlay,
#coords-toggle {
display: none;
}
.panels {
display: grid;
grid-template-columns: minmax(0, 1fr) 330px;
gap: 14px;
}
.panel {
border: 1px solid var(--panel-border);
background: var(--panel);
backdrop-filter: blur(12px);
padding: 12px 14px;
min-height: 168px;
}
.panel-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
margin-bottom: 10px;
}
.panel-title {
font-size: 16px;
letter-spacing: 0.08em;
color: var(--text);
}
.memo-card {
height: calc(100% - 30px);
display: grid;
grid-template-rows: auto 1fr;
gap: 8px;
padding: 12px;
border: 1px solid rgba(111, 224, 255, 0.12);
background:
linear-gradient(rgba(255,255,255,0.03), rgba(255,255,255,0.03)),
url('./assets/memo-bg.webp') center/cover no-repeat;
color: #09131d;
}
#memo-date {
font-size: 11px;
color: #2c4456;
letter-spacing: 0.1em;
text-transform: uppercase;
}
#memo-content {
white-space: pre-wrap;
font-size: 13px;
line-height: 1.55;
color: #081019;
overflow: auto;
}
.legend-list {
display: grid;
gap: 10px;
}
.legend-item {
display: grid;
gap: 4px;
padding: 10px;
border: 1px solid rgba(111, 224, 255, 0.1);
background: rgba(7, 18, 30, 0.74);
}
.legend-name {
font-size: 12px;
color: var(--text);
letter-spacing: 0.08em;
text-transform: uppercase;
}
.legend-detail {
font-size: 12px;
line-height: 1.45;
color: rgba(233, 251, 255, 0.72);
}
.license-note {
color: rgba(255, 211, 107, 0.86);
}
#loading-overlay {
position: absolute;
inset: 0;
z-index: 9;
display: flex;
align-items: center;
justify-content: center;
background: rgba(3, 8, 14, 0.94);
}
.loading-box {
width: min(420px, calc(100% - 40px));
display: grid;
gap: 12px;
padding: 18px;
border: 1px solid rgba(111, 224, 255, 0.16);
background: rgba(7, 18, 30, 0.94);
}
#loading-text {
font-size: 14px;
color: var(--text);
line-height: 1.45;
}
#loading-progress-container {
width: 100%;
height: 12px;
border: 1px solid rgba(111, 224, 255, 0.16);
background: rgba(2, 8, 16, 0.82);
}
#loading-progress-bar {
width: 0%;
height: 100%;
background: linear-gradient(90deg, #4ad4ff, #ffd36b);
transition: width .2s ease;
}
@media (max-width: 900px) {
.hud {
grid-template-columns: 1fr;
display: grid;
}
.hud-meta {
justify-content: flex-start;
}
.panels {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<header class="hud">
<div class="hud-copy">
<div class="hud-kicker">Jarvis War Room / Star Office Stage</div>
<div class="hud-title">STAR OFFICE</div>
<div class="hud-subtitle">
Pixel office stage adapted from the upstream Star Office UI project and wired into Jarvis office state endpoints.
</div>
</div>
<div class="hud-meta">
<div class="meta-chip">READ ONLY STAGE</div>
<div class="meta-chip" id="live-state-chip">STATE / IDLE</div>
<div class="meta-chip">API / <span id="agents-count">1</span> AGENTS</div>
</div>
</header>
<main class="stage">
<section class="game-shell">
<div id="game-container"></div>
<div id="loading-overlay">
<div class="loading-box">
<div id="loading-text">Loading Jarvis Star Office...</div>
<div id="loading-progress-container">
<div id="loading-progress-bar"></div>
</div>
</div>
</div>
<div class="overlay-status" id="status-text">[IDLE] Awaiting commands...</div>
<div id="coords-overlay"></div>
<button id="coords-toggle" type="button">coords</button>
</section>
<section class="panels">
<article class="panel">
<div class="panel-head">
<div class="panel-title">YESTERDAY MEMO</div>
<div class="panel-kicker" id="memo-date">memo</div>
</div>
<div class="memo-card">
<div class="panel-kicker">OPERATIONS NOTEBOOK</div>
<div id="memo-content">Loading memo...</div>
</div>
</article>
<article class="panel">
<div class="panel-head">
<div class="panel-title">INTEGRATION NOTE</div>
<div class="panel-kicker">WAR ROOM</div>
</div>
<div class="legend-list">
<div class="legend-item">
<div class="legend-name">State Mapping</div>
<div class="legend-detail">Idle stays in lounge. Writing, researching and executing move to the desk. Syncing lights the server room. Error wakes the bug bay.</div>
</div>
<div class="legend-item">
<div class="legend-name">Agent Layer</div>
<div class="legend-detail">The main agent uses Jarvis office state. Visitor sprites fall back to local demo agents when no extra office agents are available.</div>
</div>
<div class="legend-item">
<div class="legend-name">License Note</div>
<div class="legend-detail license-note">Upstream code is MIT. Upstream art assets are marked non-commercial by the project README. Keep that constraint in mind before external distribution.</div>
</div>
</div>
</article>
</section>
</main>
<script src="./vendor/phaser-3.80.1.min.js"></script>
<script src="./office-runtime.js"></script>
</body>
</html>