phantom-grid / ui /web /static /app.css
unity4ar's picture
Ship Phantom Grid Docker Space
d2e6f94 verified
Raw
History Blame Contribute Delete
41.6 kB
:root {
color-scheme: dark;
--teal: #073f42;
--teal-dark: #06292a;
--gold: #d6a33c;
--gold-bright: #ffd46f;
--paper: #f2d99c;
--paper-deep: #c9944d;
--ink: #2a160b;
--red: #a42b21;
--blue: #10537d;
--green: #176e5e;
--shadow: 0 18px 48px rgba(0, 0, 0, 0.42);
}
* {
box-sizing: border-box;
}
html,
body {
height: 100%;
}
body {
margin: 0;
color: #fff0bc;
font-family: Georgia, "Times New Roman", serif;
background:
linear-gradient(90deg, rgba(6, 41, 42, 0.9), rgba(65, 36, 10, 0.65)),
#241508;
overflow: hidden;
}
button,
textarea {
font: inherit;
}
button {
cursor: pointer;
}
button:disabled {
cursor: default;
}
.game-board {
width: min(1920px, 100vw);
height: 100vh;
display: grid;
grid-template-rows: auto minmax(0, 1fr) auto;
margin: 0 auto;
padding: 0 0 8px;
background:
repeating-linear-gradient(0deg, rgba(255, 255, 255, 0.025) 0 1px, transparent 1px 18px),
linear-gradient(180deg, #0c4141 0 15%, #261307 15% 100%);
border: 3px solid #8e5f18;
box-shadow: inset 0 0 0 3px #e0a83d, var(--shadow);
}
.top-banner {
height: 128px;
display: grid;
grid-template-columns: 288px minmax(0, 1fr) 172px 94px;
align-items: stretch;
gap: 10px;
padding: 6px 10px;
background:
linear-gradient(180deg, rgba(255, 233, 145, 0.16), transparent 32%),
linear-gradient(90deg, #063538, #07484b 52%, #063538);
border-bottom: 5px solid #b47b25;
box-shadow: inset 0 -2px 0 #ffd476;
}
.bureau-crest {
position: relative;
display: grid;
place-items: center;
overflow: hidden;
}
.bureau-crest img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: fill;
}
.title-panel {
position: relative;
display: grid;
place-items: center;
align-content: center;
min-width: 0;
}
.title-panel:before,
.title-panel:after {
content: "";
position: absolute;
top: 58%;
width: 120px;
height: 11px;
background: linear-gradient(90deg, transparent, var(--gold-bright), transparent);
}
.title-panel:before {
left: 34px;
}
.title-panel:after {
right: 34px;
}
.title-panel h1 {
margin: 0;
color: #ffc85f;
font-size: clamp(3.4rem, 7vw, 6.3rem);
line-height: 0.86;
letter-spacing: 0;
text-transform: uppercase;
text-shadow:
0 3px 0 #5f3209,
0 6px 0 #171008,
0 0 18px rgba(255, 214, 105, 0.45);
white-space: nowrap;
}
.title-panel p {
margin: 10px 0 0;
color: #ffd46f;
font-size: 1.16rem;
font-weight: 950;
letter-spacing: 0.14em;
text-transform: uppercase;
}
.title-panel h1[contenteditable="true"],
.title-panel p[contenteditable="true"] {
max-width: 100%;
outline: 0;
cursor: text;
}
.title-panel h1[contenteditable="true"]:focus,
.title-panel p[contenteditable="true"]:focus {
text-decoration: underline;
text-decoration-color: rgba(255, 212, 111, 0.8);
text-underline-offset: 0.12em;
}
.turn-panel,
.gear-button {
border: 4px solid #b98127;
background:
linear-gradient(180deg, rgba(255, 213, 109, 0.15), transparent),
#08393c;
box-shadow: inset 0 0 0 2px #52320b, 0 4px 0 #301a05;
}
.turn-panel {
display: grid;
place-items: center;
align-content: center;
color: #ffd46f;
text-transform: uppercase;
}
.turn-panel span,
.turn-panel small {
font-weight: 950;
letter-spacing: 0.08em;
}
.turn-panel strong {
color: #fff0bc;
font-size: 2.45rem;
line-height: 1;
}
.gear-button {
display: grid;
place-items: center;
color: #ffdf86;
font-size: 3.3rem;
}
.gear-button.muted {
opacity: 0.62;
}
.table-grid {
height: auto;
min-height: 0;
display: grid;
grid-template-columns: 286px minmax(0, 1fr) 334px;
gap: 8px;
padding: 8px;
}
.left-rail,
.right-rail,
.center-stage {
min-height: 0;
}
.left-rail,
.right-rail {
display: grid;
gap: 10px;
}
.left-rail {
grid-template-rows: minmax(0, 1fr) 92px 62px 46px 42px;
}
.right-rail {
grid-template-rows: minmax(0, 0.92fr) minmax(0, 1fr);
}
.wanted-card,
.active-units,
.lookout-board,
.statements-panel {
border: 4px solid #b98127;
box-shadow: inset 0 0 0 2px #55320b, var(--shadow);
}
.wanted-card {
min-height: 0;
display: grid;
justify-items: center;
gap: 7px;
padding: 14px;
color: var(--ink);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.45), transparent 24%),
var(--paper);
}
.wanted-card h2 {
margin: 0;
color: #8b2217;
font-size: 3rem;
line-height: 0.95;
letter-spacing: 0.02em;
text-transform: uppercase;
}
.suspect-image {
width: 198px;
height: min(224px, 28vh);
object-fit: cover;
border: 2px solid #9e6d2c;
box-shadow: inset 0 0 0 3px rgba(255, 239, 185, 0.5);
}
.wanted-card dl {
width: 100%;
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: 4px 8px;
margin: 0;
}
.wanted-card dt {
color: #251304;
font-weight: 950;
text-transform: uppercase;
}
.wanted-card dd {
min-width: 0;
margin: 0;
color: #5c1f13;
font-weight: 800;
line-height: 1.02;
}
#wantedLastSeen {
color: #8b2217;
}
.wanted-card strong {
color: #4b2109;
font-size: 1.55rem;
}
.wanted-card small {
color: #4b2109;
font-weight: 950;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.active-units {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
grid-template-rows: auto minmax(0, 1fr);
align-items: center;
gap: 4px 8px;
padding: 9px 10px;
background:
repeating-linear-gradient(170deg, rgba(255, 255, 255, 0.04) 0 1px, transparent 1px 14px),
var(--teal);
}
.active-units h2,
.lookout-board h2,
.statements-panel h2 {
margin: 0;
color: #ffd46f;
font-size: 1.3rem;
letter-spacing: 0.08em;
text-transform: uppercase;
text-shadow: 0 2px 0 #311a06;
}
.active-units h2 {
grid-column: 1 / -1;
font-size: 1.08rem;
}
.unit-row {
min-width: 0;
display: grid;
grid-template-columns: repeat(6, 15px);
gap: 4px;
align-content: center;
}
.unit-dot {
width: 15px;
height: 19px;
display: block;
border-radius: 50% 50% 7px 7px;
border: 1px solid rgba(255, 239, 185, 0.75);
}
.unit-dot.ready {
background:
radial-gradient(circle at 50% 24%, #a6e4ff 0 3px, transparent 4px),
linear-gradient(135deg, #1784bd, #0b4265);
}
.unit-dot.used {
background:
radial-gradient(circle at 50% 24%, #c2c2b6 0 3px, transparent 4px),
linear-gradient(135deg, #777d77, #3d413d);
opacity: 0.72;
}
.active-units strong {
justify-self: end;
color: #ffdf86;
font-size: 1.08rem;
white-space: nowrap;
}
.advance-button,
.new-case-button,
.search-button {
min-height: 50px;
color: #fff4c2;
font-size: 1.45rem;
font-weight: 950;
text-transform: uppercase;
border: 3px solid #a97522;
box-shadow: inset 0 0 0 2px rgba(255, 239, 185, 0.24), 0 5px 0 #2c1907;
}
.advance-button {
background: linear-gradient(180deg, #1d6796, #0c436e);
}
.advance-button.processing,
.new-case-button.processing {
background: linear-gradient(180deg, #c8862c, #7a4e0d);
color: #1a0e02;
cursor: progress;
animation: advance-pulse 1.1s ease-in-out infinite;
}
@keyframes advance-pulse {
0%, 100% { box-shadow: inset 0 0 0 2px rgba(255, 239, 185, 0.24), 0 5px 0 #2c1907, 0 0 0 0 rgba(255, 215, 100, 0.0); }
50% { box-shadow: inset 0 0 0 2px rgba(255, 239, 185, 0.6), 0 5px 0 #2c1907, 0 0 16px 4px rgba(255, 215, 100, 0.55); }
}
.new-case-button {
background: linear-gradient(180deg, #25765f, #104d43);
}
.search-button {
background: linear-gradient(180deg, #c33d32, #8b2119);
}
.center-stage {
display: grid;
grid-template-rows: 130px minmax(0, 1fr);
gap: 8px;
}
.tactic-strip {
padding: 8px 12px 10px;
color: var(--ink);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.45), transparent 42%),
var(--paper);
border: 4px solid #b98127;
box-shadow: inset 0 0 0 2px #56330c, var(--shadow);
}
.tactic-strip h2 {
margin: 0 0 8px;
color: #143d3d;
font-size: 1.55rem;
text-align: center;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.tactic-tray {
display: grid;
grid-template-columns: repeat(5, minmax(132px, 1fr));
gap: 9px;
}
.tactic-card {
position: relative;
height: 78px;
display: grid;
grid-template-columns: 66px minmax(0, 1fr);
grid-template-rows: minmax(0, 1fr) auto;
align-items: center;
gap: 0 8px;
padding: 8px 10px;
color: var(--ink);
text-align: left;
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.46), transparent 50%),
#f2d99c;
border: 3px solid #a97522;
box-shadow: inset 0 0 0 2px rgba(80, 43, 8, 0.25), 0 4px 0 rgba(54, 30, 5, 0.55);
}
.tactic-card:disabled {
filter: grayscale(0.65);
opacity: 0.58;
}
.tactic-card img {
grid-row: 1 / 3;
width: 62px;
height: 62px;
object-fit: contain;
}
.tactic-card span {
min-width: 0;
color: #201005;
font-size: 0.96rem;
font-weight: 950;
line-height: 1.02;
text-transform: uppercase;
}
.tactic-card strong {
color: #201005;
font-size: 1.15rem;
}
.tactic-preview {
position: absolute;
left: 50%;
bottom: calc(100% + 10px);
z-index: 30;
width: min(260px, 70vw);
display: none;
transform: translateX(-50%);
padding: 10px 12px;
color: #173a35;
font-size: 0.92rem;
font-style: normal;
line-height: 1.25;
background: #fff1bd;
border: 3px solid #a97522;
box-shadow: 0 14px 32px rgba(0, 0, 0, 0.38);
}
.tactic-preview:after {
content: "";
position: absolute;
left: 50%;
bottom: -10px;
width: 16px;
height: 16px;
transform: translateX(-50%) rotate(45deg);
background: #fff1bd;
border-right: 3px solid #a97522;
border-bottom: 3px solid #a97522;
}
.tactic-card:hover .tactic-preview,
.tactic-card:focus-visible .tactic-preview {
display: block;
}
.map-shell {
min-height: 0;
display: grid;
grid-template-rows: 38px minmax(0, 1fr) 62px;
padding: 0;
}
.layer-tabs {
display: flex;
align-items: end;
gap: 4px;
padding-left: 14px;
}
.layer-tabs button {
min-width: 112px;
height: 40px;
color: #ffdf86;
font-size: 1.16rem;
font-weight: 950;
background: linear-gradient(180deg, #0c5d5d, #063738);
border: 3px solid #a97522;
border-bottom: 0;
text-transform: capitalize;
}
.layer-tabs button.active {
color: #251304;
background: linear-gradient(180deg, #ffd461, #d4a231);
}
.map-wrap {
position: relative;
min-height: 0;
overflow: hidden;
background: #0a1414;
border: 5px solid #b98127;
border-radius: 16px 16px 0 0;
box-shadow: inset 0 0 0 3px #4c2c08, var(--shadow);
cursor: grab;
touch-action: none;
}
.map-wrap:active {
cursor: grabbing;
}
.map-canvas {
position: absolute;
inset: 0;
transform-origin: 0 0;
will-change: transform;
}
#mapImage {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
user-select: none;
pointer-events: none;
}
.overlay-layer {
position: absolute;
inset: 0;
pointer-events: none;
}
.map-controls {
position: absolute;
right: 12px;
top: 12px;
z-index: 18;
display: flex;
align-items: center;
gap: 5px;
max-width: calc(100% - 24px);
padding: 5px;
color: var(--ink);
background: rgba(242, 217, 156, 0.94);
border: 2px solid #a97522;
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.34);
}
.map-controls button,
.map-controls output {
min-width: 34px;
height: 30px;
display: grid;
place-items: center;
color: var(--ink);
font-weight: 950;
background: #ffd46f;
border: 1px solid #8f5d18;
}
.map-controls output {
min-width: 52px;
background: #fff0bc;
}
.map-control-divider {
width: 1px;
height: 24px;
background: #8f5d18;
}
.map-controls .map-visibility-toggle,
.map-controls #witnessModeButton {
min-width: auto;
padding: 0 8px;
font-size: 0.72rem;
}
.map-controls .map-visibility-toggle:not(.active) {
color: #6c5c42;
background: #c8b98f;
text-decoration: line-through;
}
.map-controls #witnessModeButton.active {
color: #fff4c2;
background: #176e5e;
}
.focus-marker {
position: absolute;
width: 30px;
height: 30px;
transform: translate(-50%, -50%);
border: 3px solid #ffdf86;
border-radius: 50%;
box-shadow: 0 0 0 4px rgba(25, 105, 100, 0.35), 0 0 14px rgba(255, 212, 111, 0.62);
}
.map-token,
.witness-token {
position: absolute;
pointer-events: auto;
border: 0;
background: transparent;
filter: drop-shadow(0 10px 8px rgba(0, 0, 0, 0.52));
}
.map-token {
width: 40px;
height: 48px;
transform: translate(
calc(-50% + var(--token-offset-x, 0px)),
calc(-82% + var(--token-offset-y, 0px))
);
}
.map-token.junction_lockdown {
width: 58px;
height: 44px;
}
.map-token.roadblock {
width: 32px;
height: 26px;
}
.map-token.patrol_unit {
width: 48px;
height: 54px;
}
.map-token.search_team {
width: 50px;
height: 50px;
}
.map-token.lookout_board {
width: 48px;
height: 58px;
}
.witness-token {
width: 38px;
height: 52px;
transform: translate(
calc(-50% + var(--token-offset-x, 0px)),
calc(-86% + var(--token-offset-y, 0px))
);
}
#selectionLayer { z-index: 10; }
#tacticLayer { z-index: 11; }
#witnessLayer { z-index: 12; }
.map-token.co-located,
.witness-token.co-located {
filter: drop-shadow(0 10px 8px rgba(0, 0, 0, 0.62));
}
.map-token img,
.witness-token img {
width: 100%;
height: 100%;
object-fit: contain;
}
.witness-token strong {
position: absolute;
right: -1px;
top: 4px;
min-width: 16px;
min-height: 16px;
display: grid;
place-items: center;
color: #fff4c2;
font-size: 0.62rem;
border-radius: 50%;
background: #8e2118;
border: 1px solid #ffdf86;
}
.witness-token.viewed strong {
background: #176e5e;
}
.witness-cluster-token {
z-index: 4;
width: 42px;
height: 56px;
transform: translate(-50%, -86%);
}
.witness-cluster-token strong {
right: -3px;
top: 1px;
min-width: 19px;
min-height: 19px;
font-size: 0.68rem;
}
.witness-cluster-member {
opacity: 0;
pointer-events: none;
}
.cluster-report-list {
display: grid;
gap: 7px;
max-height: 230px;
overflow: auto;
}
.cluster-report-button {
display: grid;
gap: 3px;
padding: 8px;
color: #251304;
text-align: left;
background: #fff0bc;
border: 2px solid #a97522;
}
.cluster-report-button.viewed {
border-color: #176e5e;
background: #d7eee0;
}
.cluster-report-button span {
font-size: 0.76rem;
line-height: 1.25;
}
.cluster-report-button em {
font-style: normal;
font-size: 0.7rem;
font-weight: 700;
color: #6b3812;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.map-message {
position: absolute;
left: 14px;
right: 14px;
bottom: 12px;
min-height: 34px;
display: flex;
align-items: center;
padding: 0 12px;
color: #fff4c2;
font-weight: 800;
background: rgba(7, 63, 66, 0.88);
border: 2px solid rgba(255, 212, 111, 0.7);
pointer-events: none;
}
.legend-strip {
min-height: 62px;
display: grid;
grid-template-columns: repeat(7, minmax(0, 1fr));
gap: 6px;
padding: 7px 9px;
color: var(--ink);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.45), transparent),
var(--paper);
border: 5px solid #b98127;
border-top: 0;
box-shadow: inset 0 0 0 2px #55320b;
}
.legend-item {
min-width: 0;
display: grid;
grid-template-columns: 42px minmax(0, 1fr);
grid-template-rows: 1fr 1fr;
align-items: center;
column-gap: 6px;
}
.legend-item img {
grid-row: 1 / 3;
width: 42px;
height: 52px;
object-fit: contain;
}
.legend-item strong {
overflow: hidden;
font-size: 0.76rem;
font-weight: 950;
text-overflow: ellipsis;
text-transform: uppercase;
white-space: nowrap;
}
.legend-item span {
overflow: hidden;
font-family: "Segoe Print", "Bradley Hand ITC", cursive;
font-size: 0.72rem;
text-overflow: ellipsis;
white-space: nowrap;
}
.lookout-board,
.statements-panel {
min-height: 0;
display: grid;
gap: 8px;
padding: 12px;
background:
repeating-linear-gradient(172deg, rgba(255, 255, 255, 0.035) 0 1px, transparent 1px 16px),
var(--teal);
}
.lookout-board {
grid-template-rows: auto minmax(0, 1fr);
}
.statements-panel {
grid-template-rows: auto minmax(0, 1fr);
}
.paper-note {
min-height: 0;
display: grid;
grid-template-rows: auto minmax(0, 1fr) auto auto;
gap: 8px;
padding: 14px;
color: var(--ink);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.52), transparent 34%),
var(--paper);
border: 3px solid #a97522;
box-shadow: inset 0 0 0 2px rgba(86, 51, 12, 0.28);
}
.paper-note h3 {
margin: 0;
color: #8b2217;
text-align: center;
text-transform: uppercase;
}
.paper-note textarea {
width: 100%;
min-height: 126px;
resize: none;
color: #193b34;
font-family: "Segoe Print", "Bradley Hand ITC", cursive;
font-size: 1.05rem;
line-height: 1.42;
background:
repeating-linear-gradient(180deg, transparent 0 30px, rgba(35, 87, 72, 0.12) 31px),
rgba(255, 249, 218, 0.18);
border: 1px dashed rgba(80, 43, 8, 0.35);
outline: none;
}
.paper-note button,
.ask-button,
.remove-button {
min-height: 36px;
color: #fff4c2;
font-weight: 950;
background: linear-gradient(180deg, #25765f, #104d43);
border: 2px solid #a97522;
}
.paper-note p {
margin: 0;
color: #5b3110;
font-weight: 800;
}
.statement-list {
min-height: 0;
display: grid;
align-content: start;
gap: 8px;
overflow: auto;
}
.statement-card {
position: relative;
min-height: 78px;
padding: 9px 44px 9px 10px;
color: var(--ink);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.45), transparent 50%),
#f0d69a;
border: 2px solid #a97522;
}
.statement-card div {
display: flex;
justify-content: space-between;
gap: 8px;
}
.statement-card strong {
font-size: 0.92rem;
text-transform: uppercase;
}
.statement-card span {
color: #176e5e;
font-size: 0.72rem;
font-weight: 950;
text-transform: uppercase;
}
.statement-card p {
margin: 5px 0 0;
font-family: "Segoe Print", "Bradley Hand ITC", cursive;
font-size: 0.84rem;
line-height: 1.22;
}
.statement-card mark {
position: absolute;
right: 9px;
top: 50%;
width: 30px;
height: 30px;
display: grid;
place-items: center;
transform: translateY(-50%);
color: #176e5e;
font-size: 1.35rem;
font-weight: 950;
background: transparent;
border: 3px solid #176e5e;
border-radius: 50%;
}
.statement-card.empty mark {
display: none;
}
.event-ticker {
margin: 0 8px;
min-height: 28px;
display: flex;
align-items: center;
padding: 0 12px;
color: #ffdf86;
background: rgba(0, 0, 0, 0.34);
border: 2px solid rgba(255, 212, 111, 0.45);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.detail-popup {
position: fixed;
z-index: 80;
width: 280px;
display: grid;
gap: 8px;
padding: 12px;
color: var(--ink);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.48), transparent 46%),
var(--paper);
border: 4px solid #a97522;
box-shadow: var(--shadow);
}
.drag-ghost {
position: fixed;
z-index: 120;
width: 136px;
min-height: 54px;
display: grid;
grid-template-columns: 46px minmax(0, 1fr);
align-items: center;
gap: 7px;
padding: 6px 9px;
color: var(--ink);
font-weight: 950;
text-transform: uppercase;
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.48), transparent),
var(--paper);
border: 3px solid #a97522;
box-shadow: 0 16px 34px rgba(0, 0, 0, 0.45);
pointer-events: none;
}
.drag-ghost img {
width: 44px;
height: 44px;
object-fit: contain;
}
.drag-ghost span {
min-width: 0;
font-size: 0.78rem;
line-height: 1.05;
}
.detail-popup[hidden] {
display: none;
}
.detail-popup > img {
width: 58px;
height: 68px;
object-fit: contain;
}
.detail-popup h3 {
margin: 0;
color: #8b2217;
font-size: 1.1rem;
text-transform: uppercase;
}
.detail-popup p {
margin: 0;
line-height: 1.32;
}
.detail-popup dl {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
gap: 4px 8px;
margin: 0;
}
.detail-popup dt {
font-weight: 950;
text-transform: uppercase;
}
.detail-popup dd {
margin: 0;
}
.popup-close {
position: absolute;
right: 6px;
top: 5px;
width: 28px;
height: 28px;
color: #fff4c2;
background: #8b2217;
border: 2px solid #a97522;
}
.remove-button {
background: linear-gradient(180deg, #c33d32, #8b2119);
}
.settings-dialog {
width: min(760px, calc(100vw - 28px));
max-height: calc(100dvh - 28px);
color: var(--ink);
background: transparent;
border: 0;
padding: 0;
}
.settings-dialog::backdrop {
background: rgba(0, 0, 0, 0.58);
}
.settings-panel {
display: grid;
width: 100%;
box-sizing: border-box;
gap: 14px;
padding: 16px;
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.42), transparent 42%),
var(--paper);
border: 5px solid #a97522;
box-shadow: var(--shadow);
max-height: calc(100dvh - 28px);
overflow-y: auto;
overflow-x: hidden;
overscroll-behavior: contain;
}
.settings-panel > * {
min-width: 0;
}
.settings-panel header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.settings-panel h2 {
margin: 0;
color: #8b2217;
font-size: 2rem;
text-transform: uppercase;
}
.settings-panel header button {
width: 34px;
height: 34px;
color: #fff4c2;
background: #8b2217;
border: 2px solid #a97522;
}
.settings-grid {
display: grid;
min-width: 0;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.settings-grid label {
min-width: 0;
display: grid;
gap: 4px;
color: #482309;
font-weight: 950;
text-transform: uppercase;
}
.settings-wide {
grid-column: 1 / -1;
}
.settings-subgrid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
padding: 12px;
background: rgba(139, 34, 23, 0.07);
border: 2px dashed rgba(139, 34, 23, 0.45);
}
.settings-subgrid[hidden] {
display: none;
}
.settings-hint {
margin: 0;
color: #5f3215;
font-size: 0.82rem;
font-weight: 750;
line-height: 1.35;
text-transform: none;
}
.settings-grid input,
.settings-grid select {
width: 100%;
min-width: 0;
box-sizing: border-box;
min-height: 36px;
color: var(--ink);
background: #fff0bc;
border: 2px solid #a97522;
padding: 6px 8px;
}
.llama-status {
margin: 0;
padding: 10px;
color: #173a35;
font-weight: 850;
background: rgba(23, 110, 94, 0.12);
border-left: 5px solid #176e5e;
overflow-wrap: anywhere;
}
.settings-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.settings-actions button {
min-height: 38px;
padding: 0 12px;
color: #fff4c2;
font-weight: 950;
background: linear-gradient(180deg, #25765f, #104d43);
border: 2px solid #a97522;
}
@media (max-width: 700px) {
.settings-grid,
.settings-subgrid {
grid-template-columns: 1fr;
}
}
.setup-overlay {
position: fixed;
inset: 0;
z-index: 1000;
display: grid;
place-items: center;
padding: 24px;
background: rgba(7, 17, 19, 0.82);
backdrop-filter: blur(6px);
}
.setup-overlay[hidden] {
display: none;
}
.setup-card {
width: min(620px, 92vw);
display: grid;
gap: 16px;
padding: 34px;
color: #3e210d;
text-align: center;
background: linear-gradient(145deg, #f8e7ad, #d7b86b);
border: 5px solid #6d3c12;
box-shadow: inset 0 0 0 3px #f8da82, 0 24px 70px #000;
}
.setup-card small {
font-weight: 950;
letter-spacing: 0.16em;
text-transform: uppercase;
}
.setup-card h2 {
margin: 0;
font-size: clamp(2rem, 5vw, 3.4rem);
line-height: 0.95;
text-transform: uppercase;
}
.setup-card p {
margin: 0;
font-size: 1.08rem;
font-weight: 750;
}
.setup-card progress {
width: 100%;
height: 24px;
accent-color: #176e5e;
}
.setup-start-button {
min-height: 72px;
color: #fff4c2;
font-size: 1.8rem;
font-weight: 1000;
text-transform: uppercase;
background: linear-gradient(180deg, #2b8b69, #104d43);
border: 4px solid #a97522;
box-shadow: inset 0 0 0 2px rgba(255, 239, 185, 0.3), 0 7px 0 #2c1907;
}
.setup-start-button:disabled {
cursor: wait;
filter: grayscale(0.7);
opacity: 0.72;
}
.setup-overlay.ready .setup-start-button {
animation: setup-ready-pulse 1.8s ease-in-out infinite;
}
.setup-settings-button {
justify-self: center;
color: #4c2b12;
font-weight: 900;
background: transparent;
border: 0;
text-decoration: underline;
}
.setup-picker {
display: grid;
gap: 12px;
padding: 18px;
text-align: left;
background: rgba(255, 248, 222, 0.72);
border: 2px solid #a97522;
border-radius: 6px;
}
.setup-picker[hidden] { display: none; }
.setup-picker-intro {
margin: 0;
font-size: 0.98rem;
font-weight: 750;
color: #4c2b12;
}
.setup-storage-hint {
padding: 8px 10px;
overflow-wrap: anywhere;
font-size: 0.82rem !important;
color: #4c2b12;
background: rgba(255, 255, 255, 0.42);
border-left: 4px solid #176e5e;
}
.setup-picker-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px 16px;
}
.setup-picker-grid label {
display: grid;
gap: 4px;
font-weight: 850;
font-size: 0.86rem;
text-transform: uppercase;
letter-spacing: 0.04em;
color: #4c2b12;
}
.setup-picker-grid select {
padding: 8px 10px;
font-size: 0.95rem;
font-weight: 600;
color: #2c1907;
background: #fff8d8;
border: 2px solid #6d3c12;
border-radius: 4px;
text-transform: none;
letter-spacing: 0;
}
.setup-picker-grid small {
font-weight: 500;
font-size: 0.78rem;
text-transform: none;
letter-spacing: 0;
color: #5a3e1f;
}
@media (max-width: 700px) {
.setup-picker-grid { grid-template-columns: minmax(0, 1fr); }
}
@keyframes setup-ready-pulse {
50% { transform: scale(1.025); box-shadow: inset 0 0 0 2px rgba(255, 239, 185, 0.4), 0 10px 0 #2c1907, 0 0 30px rgba(255, 214, 101, 0.65); }
}
@media (max-width: 1200px) {
.top-banner {
height: auto;
grid-template-columns: 190px minmax(0, 1fr) 132px 72px;
}
.table-grid {
height: auto;
grid-template-columns: 220px minmax(0, 1fr);
}
.right-rail {
grid-column: 1 / -1;
grid-template-columns: 1fr 1fr;
grid-template-rows: minmax(260px, 1fr);
}
.tactic-tray {
grid-template-columns: repeat(3, minmax(132px, 1fr));
}
.center-stage {
grid-template-rows: auto minmax(620px, 68vh);
}
}
@media (max-width: 1400px) {
.top-banner {
grid-template-columns: 250px minmax(0, 1fr) 150px 78px;
}
.title-panel:before,
.title-panel:after {
display: none;
}
.title-panel h1 {
font-size: clamp(3rem, 5.4vw, 4.35rem);
}
.title-panel p {
font-size: 0.94rem;
}
.turn-panel strong {
font-size: 1.72rem;
}
.gear-button {
font-size: 2.5rem;
}
.table-grid {
grid-template-columns: 250px minmax(0, 1fr) 300px;
}
.wanted-card h2 {
font-size: 2.35rem;
}
.suspect-image {
width: 172px;
height: 206px;
}
.wanted-card {
gap: 5px;
padding: 10px;
}
.wanted-card dl {
font-size: 0.94rem;
gap: 3px 7px;
}
.wanted-card strong {
font-size: 1.25rem;
}
.tactic-tray {
grid-template-columns: repeat(5, minmax(0, 1fr));
}
.tactic-card {
grid-template-columns: 48px minmax(0, 1fr);
gap: 0 5px;
padding: 7px;
}
.tactic-card img {
width: 48px;
height: 48px;
}
.tactic-card span {
font-size: 0.78rem;
}
.tactic-card strong {
font-size: 0.95rem;
}
.right-rail {
min-width: 0;
}
}
@media (max-width: 760px) {
.top-banner,
.table-grid,
.right-rail {
grid-template-columns: 1fr;
}
.bureau-crest {
min-height: 126px;
}
.title-panel h1 {
font-size: 3rem;
white-space: normal;
text-align: center;
}
.table-grid {
min-height: 0;
}
.tactic-tray,
.legend-strip {
grid-template-columns: 1fr;
}
.map-shell {
grid-template-rows: auto minmax(520px, 65vh) auto;
}
}
body {
position: relative;
}
.game-board {
position: fixed;
left: 50%;
top: 50%;
width: 1672px;
height: 940px;
min-height: 0;
transform: translate(-50%, -50%) scale(var(--app-scale, 1));
transform-origin: center center;
}
.top-banner {
height: 142px;
grid-template-columns: 286px minmax(0, 1fr) 172px 94px;
}
.table-grid {
height: auto;
min-height: 0;
grid-template-columns: 286px minmax(0, 1fr) 334px;
}
.left-rail {
grid-template-rows: minmax(0, 1fr) 92px 62px 46px 42px;
}
.right-rail {
grid-column: auto;
min-width: 0;
grid-template-columns: 1fr;
grid-template-rows: minmax(0, 0.92fr) minmax(0, 1fr);
}
.center-stage {
grid-template-rows: 130px minmax(0, 1fr);
}
.tactic-tray {
grid-template-columns: repeat(5, minmax(0, 1fr));
}
.map-shell {
grid-template-rows: 38px minmax(0, 1fr) 62px;
}
.legend-strip {
grid-template-columns: repeat(7, minmax(0, 1fr));
}
.case-control-row { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.case-control-row button { color: #ffe8a7; font-weight: 900; background: #63251c; border: 2px solid #c28a35; }
#notesText { min-height: 210px; resize: none; }
#notesStatus { margin: 6px 0 0; opacity: 0.76; }
.notice-dialog, .witness-dialog, .story-dialog { padding: 0; color: var(--ink); background: transparent; border: 0; }
.notice-dialog::backdrop, .witness-dialog::backdrop, .story-dialog::backdrop { background: rgba(3, 14, 15, 0.9); backdrop-filter: blur(5px); }
.notice-panel { width: min(720px, 92vw); display: grid; gap: 16px; padding: 22px; background: #f3dda6; border: 5px solid #b47b25; box-shadow: 0 24px 80px #000; }
.notice-panel header, .witness-interview-shell > header, .story-reveal-shell > header { display: flex; align-items: center; justify-content: space-between; gap: 16px; }
.notice-panel h2, .witness-interview-shell h2, .story-reveal-shell h2 { margin: 0; color: #8b2217; text-transform: uppercase; }
.notice-panel textarea { min-height: 220px; padding: 16px; color: #251304; background: #fff0bc; border: 2px solid #9a6825; resize: vertical; }
.dialog-actions, .speech-controls, .text-chat-row { display: flex; gap: 10px; }
.dialog-actions button, .witness-interview-shell button, .story-reveal-shell button { min-height: 40px; padding: 8px 14px; color: #fff0bc; font-weight: 900; background: #0c5552; border: 2px solid #c18a34; }
.witness-dialog, .story-dialog { width: 100vw; max-width: none; height: 100vh; max-height: none; }
.witness-interview-shell, .story-reveal-shell { width: 100%; height: 100%; display: grid; grid-template-rows: auto auto minmax(0, 1fr) auto; gap: 14px; padding: clamp(18px, 3vw, 48px); color: #f8e7b3; background: radial-gradient(circle at 20% 10%, rgba(211, 159, 55, 0.16), transparent 34%), linear-gradient(145deg, #052d30, #171006 70%); border: 8px solid #9f6d22; }
.witness-interview-shell h2, .story-reveal-shell h2 { color: #ffd46f; font-size: clamp(2rem, 4vw, 4rem); }
.witness-interview-shell header p, .witness-interview-shell header small, .story-reveal-shell header small { margin: 4px 0; color: #e8c978; }
.witness-summary { padding: 14px 18px; color: #2a160b; background: #eed69b; border-left: 6px solid #9e2c20; }
.witness-transcript, .story-timeline { min-height: 0; overflow: auto; padding: 18px; background: rgba(0, 0, 0, 0.27); border: 2px solid #8c672d; }
.chat-message { width: min(76%, 820px); margin: 10px 0; padding: 12px 14px; border-radius: 8px; line-height: 1.45; }
.chat-message.user { margin-left: auto; color: #f9ebbd; background: #175e65; }
.chat-message.witness { color: #2b1709; background: #eed69b; }
.witness-interview-shell footer { display: grid; gap: 10px; }
.speech-controls { align-items: center; flex-wrap: wrap; }
#pushToTalkButton.recording, #autoSpeechButton.active { background: #9b2a20; box-shadow: 0 0 20px rgba(255, 85, 62, 0.6); }
#micLevel { width: 180px; }
.text-chat-row textarea { min-height: 58px; flex: 1; padding: 10px; color: #241307; background: #fff0bc; resize: none; }
.story-reveal-shell { grid-template-rows: auto minmax(0, 1fr) auto; }
.story-card { margin: 0 0 16px; padding: 18px; color: #28170a; background: #efd99f; border-left: 7px solid #9b2a20; }
.story-card h3 { margin: 0 0 8px; color: #7f2219; }
.story-facts { margin: 10px 0 0; color: #4c3318; }
.case-intro-dialog { width: 100vw; max-width: none; height: 100vh; max-height: none; padding: 0; color: #f7e7b5; background: transparent; border: 0; }
.case-intro-dialog::backdrop { background: rgba(1, 8, 10, 0.94); backdrop-filter: blur(7px); }
.case-intro-shell { box-sizing: border-box; width: 100%; height: 100%; display: grid; grid-template-rows: auto 1fr auto; gap: clamp(18px, 3vh, 34px); padding: clamp(24px, 4vw, 64px); overflow: auto; background: radial-gradient(circle at 82% 12%, rgba(183, 44, 29, 0.2), transparent 30%), radial-gradient(circle at 12% 80%, rgba(199, 151, 51, 0.15), transparent 34%), #071f21; border: 10px solid #9a6926; box-shadow: inset 0 0 90px #000; }
.case-intro-heading { display: flex; align-items: center; justify-content: space-between; gap: 24px; border-bottom: 1px solid rgba(232, 195, 104, 0.4); padding-bottom: 18px; }
.case-intro-heading small, .intro-card > small { color: #d9ae50; font-weight: 900; letter-spacing: 0.18em; text-transform: uppercase; }
.case-intro-heading h2 { margin: 5px 0 0; color: #ffe39a; font-size: clamp(2.4rem, 5vw, 5.2rem); line-height: 0.92; text-transform: uppercase; text-shadow: 4px 5px 0 #3f1710; }
.case-intro-heading p { max-width: 760px; margin: 12px 0 0; color: #d8c38f; font-size: 1.08rem; }
.case-stamp { padding: 12px 18px; color: #d4513e; font: 900 1.15rem Georgia, serif; letter-spacing: 0.14em; text-transform: uppercase; border: 4px double #b43a2b; transform: rotate(5deg); }
.case-intro-cards { display: grid; grid-template-columns: 1.25fr 0.8fr 1.15fr; gap: clamp(14px, 2vw, 28px); align-items: stretch; }
.intro-card { position: relative; min-height: 430px; padding: clamp(22px, 2.5vw, 38px); color: #281707; overflow: hidden; background: linear-gradient(145deg, #f5e3ac, #d8b96f); border: 1px solid #fff0be; box-shadow: 0 22px 50px rgba(0,0,0,0.5), inset 0 0 35px rgba(91,45,12,0.18); transform: rotate(-0.7deg); }
.intro-card:nth-child(2) { transform: translateY(10px) rotate(0.8deg); }
.intro-card:nth-child(3) { transform: rotate(-0.3deg); }
.intro-card:after { content: ""; position: absolute; inset: 10px; pointer-events: none; border: 1px solid rgba(107, 58, 17, 0.35); }
.intro-card-number { position: absolute; top: 10px; right: 20px; color: rgba(116, 57, 16, 0.16); font: 900 5rem Georgia, serif; }
.intro-card h3 { position: relative; margin: 14px 0; color: #7f2118; font: 900 clamp(1.55rem, 2.4vw, 2.7rem) Georgia, serif; line-height: 1; text-transform: uppercase; }
.intro-card p { position: relative; line-height: 1.55; }
.crime-card dl { position: relative; display: grid; grid-template-columns: 72px 1fr; gap: 8px 12px; margin-top: 24px; padding-top: 18px; border-top: 2px solid rgba(112, 62, 19, 0.35); }
.crime-card dt { color: #8d271b; font-weight: 900; text-transform: uppercase; }
.crime-card dd { margin: 0; font-weight: 700; }
.suspect-card { text-align: center; background: linear-gradient(160deg, #d9c17b, #ae8946); }
.suspect-card img { position: relative; width: min(90%, 230px); height: 245px; margin: 14px auto 4px; object-fit: cover; filter: sepia(0.8) contrast(1.2); border: 7px solid #f2dda0; box-shadow: 0 5px 15px rgba(48, 25, 5, 0.45); }
.suspect-card p { padding: 12px; color: #f8e8b7; background: #4e2615; }
.sightings-card ol { position: relative; display: grid; gap: 10px; margin: 18px 0 0; padding: 0; list-style: none; }
.sightings-card li { display: grid; grid-template-columns: 40px 1fr; gap: 12px; padding: 12px; background: rgba(255,247,211,0.45); border-left: 5px solid #856632; }
.sightings-card li.sighting-confirmed { background: rgba(153, 39, 26, 0.12); border-color: #9a2a1d; }
.sightings-card li > span { color: #9a2a1d; font: 900 1.35rem Georgia, serif; }
.sightings-card li small, .sightings-card li strong { display: block; }
.sightings-card li small { color: #75521e; font-weight: 900; text-transform: uppercase; }
.sightings-card li strong { margin: 2px 0 4px; font-size: 1.08rem; }
.sightings-card li p { margin: 0; font-size: 0.9rem; line-height: 1.35; }
.case-intro-shell footer { display: flex; align-items: center; justify-content: space-between; gap: 20px; color: #d7bd79; }
.case-intro-shell footer button { min-width: 240px; padding: 15px 24px; color: #fff1bd; font-weight: 900; letter-spacing: 0.08em; text-transform: uppercase; background: linear-gradient(#a73a29, #702116); border: 3px solid #d7a64d; box-shadow: 0 8px 0 #32100c; }
.case-intro-shell footer button:hover { transform: translateY(-2px); box-shadow: 0 10px 0 #32100c; }
@media (max-width: 1000px) {
.case-intro-cards { grid-template-columns: 1fr; }
.intro-card { min-height: 0; transform: none !important; }
.case-intro-heading { align-items: flex-start; }
}
/* How-to-play tutorial -------------------------------------------------- */
.help-button { font: 900 1.5rem Georgia, serif; }
.tutorial-dialog { width: 100vw; max-width: none; height: 100vh; max-height: none; padding: 0; color: #f7e7b5; background: transparent; border: 0; }
.tutorial-dialog::backdrop { background: rgba(1, 8, 10, 0.95); backdrop-filter: blur(7px); }
.tutorial-shell { box-sizing: border-box; width: 100%; height: 100%; display: grid; grid-template-rows: auto 1fr auto; gap: clamp(16px, 2.6vh, 30px); padding: clamp(22px, 3.4vw, 56px); overflow: auto; background: radial-gradient(circle at 82% 12%, rgba(183, 44, 29, 0.18), transparent 30%), radial-gradient(circle at 12% 80%, rgba(199, 151, 51, 0.14), transparent 34%), #071f21; border: 10px solid #9a6926; box-shadow: inset 0 0 90px #000; }
.tutorial-head { display: flex; align-items: center; justify-content: space-between; gap: 24px; border-bottom: 1px solid rgba(232, 195, 104, 0.4); padding-bottom: 14px; }
.tutorial-head small { color: #d9ae50; font-weight: 900; letter-spacing: 0.18em; text-transform: uppercase; }
.tutorial-head h2 { margin: 5px 0 0; color: #ffe39a; font-size: clamp(1.9rem, 3.6vw, 3.4rem); line-height: 0.95; text-transform: uppercase; text-shadow: 3px 4px 0 #3f1710; }
.tutorial-skip { padding: 10px 18px; color: #e7cd8a; font-weight: 900; letter-spacing: 0.06em; text-transform: uppercase; background: transparent; border: 2px solid rgba(215, 166, 77, 0.6); border-radius: 4px; cursor: pointer; }
.tutorial-skip:hover { color: #fff1bd; border-color: #d7a64d; }
.tutorial-body { display: grid; grid-template-columns: 1.55fr 1fr; gap: clamp(18px, 2.5vw, 40px); align-items: center; min-height: 0; }
.tutorial-figure { margin: 0; padding: 12px; background: linear-gradient(145deg, #16322f, #0a2422); border: 4px solid #9a6926; box-shadow: 0 22px 50px rgba(0,0,0,0.55); }
.tutorial-figure img { display: block; width: 100%; height: auto; max-height: 64vh; object-fit: contain; border: 1px solid rgba(0,0,0,0.5); }
.tutorial-copy { display: grid; gap: 14px; align-content: center; }
.tutorial-tag { justify-self: start; padding: 6px 14px; color: #1c1305; font: 900 0.82rem Georgia, serif; letter-spacing: 0.14em; text-transform: uppercase; background: linear-gradient(#f5e3ac, #d8b96f); border: 2px solid #fff0be; }
.tutorial-copy h3 { margin: 0; color: #ffe39a; font: 900 clamp(1.6rem, 2.6vw, 2.8rem) Georgia, serif; line-height: 1.02; text-transform: uppercase; }
.tutorial-text { display: grid; gap: 12px; margin: 0; padding: 0; list-style: none; }
.tutorial-text li { position: relative; padding-left: 26px; color: #e8d5a0; font-size: clamp(0.98rem, 1.2vw, 1.18rem); line-height: 1.45; }
.tutorial-text li::before { content: ""; position: absolute; left: 4px; top: 0.55em; width: 9px; height: 9px; background: #d4513e; transform: rotate(45deg); box-shadow: 0 0 0 2px rgba(215, 166, 77, 0.5); }
.tutorial-text li strong { color: #ffe39a; }
.tutorial-foot { display: flex; align-items: center; justify-content: space-between; gap: 20px; border-top: 1px solid rgba(232, 195, 104, 0.4); padding-top: 14px; }
.tutorial-dots { display: flex; gap: 10px; }
.tutorial-dots button { width: 13px; height: 13px; padding: 0; background: rgba(215, 166, 77, 0.3); border: 2px solid #8a6427; border-radius: 50%; cursor: pointer; }
.tutorial-dots button.active { background: #d4513e; border-color: #f0c267; }
.tutorial-nav { display: flex; align-items: center; gap: 14px; }
.tutorial-counter { color: #c9ad6c; font-weight: 800; letter-spacing: 0.08em; }
.tutorial-nav button { min-width: 130px; padding: 13px 22px; color: #fff1bd; font-weight: 900; letter-spacing: 0.08em; text-transform: uppercase; background: linear-gradient(#23423d, #15302d); border: 3px solid #d7a64d; box-shadow: 0 6px 0 #0a1c1a; cursor: pointer; }
.tutorial-nav button.tutorial-primary { background: linear-gradient(#a73a29, #702116); box-shadow: 0 6px 0 #32100c; }
.tutorial-nav button:hover { transform: translateY(-2px); }
.tutorial-nav button:disabled { opacity: 0.4; cursor: default; transform: none; }
@media (max-width: 1000px) {
.tutorial-body { grid-template-columns: 1fr; }
.tutorial-figure img { max-height: 40vh; }
}
@media (max-height: 800px) and (min-width: 1001px) {
.case-intro-shell { gap: 14px; padding: 22px 42px; }
.case-intro-heading { padding-bottom: 10px; }
.case-intro-heading h2 { font-size: 3rem; }
.case-intro-heading p { margin-top: 7px; }
.intro-card { min-height: 360px; padding: 20px 25px; }
.intro-card h3 { font-size: 1.7rem; }
.suspect-card img { width: 180px; height: 195px; margin-top: 8px; }
.sightings-card ol { gap: 7px; margin-top: 10px; }
.sightings-card li { padding: 8px 10px; }
.sightings-card li p { font-size: 0.8rem; }
.case-intro-shell footer button { padding: 11px 20px; }
}