Spaces:
Running
Running
File size: 7,936 Bytes
0c573fe d6b7853 0c573fe d6b7853 0c573fe 0d345ef 0c573fe 0d345ef 0c573fe 8f28cd7 48bdfa8 8f28cd7 0c573fe 8f28cd7 48bdfa8 8f28cd7 0c573fe d633da3 0c573fe d633da3 0c573fe d633da3 0c573fe 0feb400 0c573fe d6b7853 0c573fe d6b7853 0c573fe d633da3 0c573fe | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | /* Shared chrome for the Sprite Animations playground — the team-grouped character
* picker, the on-canvas hint, the aimed-attack compass, and the extras list.
* ONE source for the React app (src/views/Movement.jsx) and the Gradio Space
* (tiny-army web/playground.js). It is fully self-contained: the palette is
* scoped on `.movement-view` (copied from the auto-battler theme) so it looks
* identical whether mounted in the app or inside Gradio, with no dependency on
* the host's theme vars or sidebar classes.
*/
.movement-view {
--mv-ink: #141821;
--mv-ink-muted: #6d6a5f;
--mv-ink-faint: #8a8574;
--mv-paper: #f3ebdc;
--mv-paper-2: #ece2cc;
--mv-card: #fbf6ea;
--mv-transmit: #d8271a;
--mv-mono: 'JetBrains Mono', ui-monospace, Menlo, monospace;
--mv-sans: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
display: flex; height: 100%; width: 100%; box-sizing: border-box;
color: var(--mv-ink); font-family: var(--mv-sans);
}
.movement-view * { box-sizing: border-box; }
/* ── Team-grouped character picker ─────────────────────────────────────────── */
.movement-picker {
width: 240px; flex-shrink: 0; border-right: 2px solid var(--mv-ink);
background: var(--mv-paper-2); overflow-y: auto; padding: 12px;
}
/* It's an <h2>, so the host (Gradio's `.prose h2`) blows it up and blackens it —
* defend size + colour with `!important`. */
.movement-picker-title {
margin: 0 0 8px !important; font-family: var(--mv-mono); font-size: 11px !important;
font-weight: 500 !important; letter-spacing: .2em; line-height: 1.4 !important;
text-transform: uppercase; color: var(--mv-transmit) !important;
}
.movement-pack { margin-top: 8px; border-top: 1px solid var(--mv-paper); }
.movement-pack > summary {
cursor: pointer; list-style: none; padding: 6px 4px; font-family: var(--mv-mono);
font-size: 11px; letter-spacing: .1em; text-transform: uppercase; color: var(--mv-ink-muted);
}
.movement-pack > summary::-webkit-details-marker { display: none; }
.movement-pack > summary::before { content: '▸ '; color: var(--mv-ink-faint); }
.movement-pack[open] > summary::before { content: '▾ '; }
/* `!important` defends the list against a host (Gradio's `.prose ul/li`) re-adding
* bullets + vertical margins, which spread the rows out and broke the layout. */
.movement-pack ul { list-style: none !important; margin: 0 0 6px !important; padding: 0 !important; }
.movement-pack li { list-style: none !important; margin: 0 !important; padding: 0 !important; display: block !important; text-align: left !important; }
.movement-pack li::marker { content: ""; }
/* `!important` on colour/underline/padding defends against host link + list themes
* (Gradio's `.prose a`) that recolour, underline, and re-pad these rows. */
.movement-char {
display: block; padding: 4px 10px !important; margin: 0 !important; border-radius: 0;
color: var(--mv-ink) !important; text-decoration: none !important; text-align: left !important;
font-family: var(--mv-sans); font-size: 13px; font-weight: 500; line-height: 1.35; cursor: pointer;
}
.movement-char:hover { background: var(--mv-paper); }
.movement-char.active { background: var(--mv-ink); color: var(--mv-card) !important; }
/* ── Stage + canvas ────────────────────────────────────────────────────────── */
.movement-stage { flex: 1; min-width: 0; position: relative; }
.movement-canvas { position: absolute; inset: 0; display: flex; }
.movement-canvas canvas { display: block; width: 100%; height: 100%; }
/* ── On-canvas hint (instructions + toggles) ───────────────────────────────── */
.movement-hint {
position: absolute; bottom: 12px; left: 12px; z-index: 5; pointer-events: none;
font-family: var(--mv-mono); font-size: 10px; letter-spacing: .14em; text-transform: uppercase;
color: var(--mv-ink); background: var(--mv-card); border: 1.5px solid var(--mv-ink);
padding: 4px 8px; box-shadow: 2px 2px 0 var(--mv-ink); max-width: calc(100% - 24px);
}
/* `!important` on color so a host text rule can't make the light glyph match the
* dark chip background (which renders the keys as solid black boxes under Gradio). */
.movement-key {
font-family: var(--mv-mono); font-weight: 700; background: var(--mv-ink) !important;
color: var(--mv-card) !important; padding: 0 4px; border-radius: 2px;
}
.movement-effects-toggle { margin-left: 4px; cursor: pointer; opacity: .8; pointer-events: auto; }
/* ── Aimed-attack debug compass ────────────────────────────────────────────── */
.movement-compass-wrap {
position: absolute; top: 12px; left: 12px; z-index: 5; pointer-events: none;
display: flex; flex-direction: column; gap: 4px;
background: var(--mv-card); border: 1.5px solid var(--mv-ink); box-shadow: 2px 2px 0 var(--mv-ink); padding: 6px;
}
.movement-compass { display: grid; grid-template-columns: repeat(3, 18px); grid-template-rows: repeat(3, 18px); }
.movement-compass span { display: flex; align-items: center; justify-content: center; font-size: 12px; color: var(--mv-ink-faint) !important; }
.movement-compass span.on { color: var(--mv-card) !important; background: var(--mv-ink); border-radius: 3px; }
.movement-compass-label { font-family: var(--mv-mono); font-size: 9px; letter-spacing: .08em; color: var(--mv-ink-muted); text-align: center; }
/* ── Extras list ───────────────────────────────────────────────────────────── */
.movement-extras {
position: absolute; top: 12px; right: 12px; z-index: 5;
display: flex; flex-direction: column; gap: 6px; align-items: flex-end;
max-width: min(360px, 55%);
background: var(--mv-card); border: 1.5px solid var(--mv-ink); box-shadow: 2px 2px 0 var(--mv-ink); padding: 6px 8px;
}
.movement-extras-hint {
font-family: var(--mv-mono); font-size: 9px; letter-spacing: .1em; text-transform: uppercase; color: var(--mv-ink-muted);
}
.movement-extras-list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 4px; justify-content: flex-end; }
/* Host button themes (Gradio's `.gradio-container button`) enlarge these and swap
* the font — defend the type + box props with `!important` so they stay small mono. */
.movement-extra {
font-family: var(--mv-mono) !important; font-size: 9px !important; line-height: 1.2 !important;
letter-spacing: .04em !important; text-transform: uppercase !important; font-weight: 500 !important;
color: var(--mv-ink) !important; background: var(--mv-card) !important; border: 1.5px solid var(--mv-ink) !important;
cursor: pointer; padding: 2px 6px !important; display: inline-flex; align-items: center; gap: 4px;
min-height: 0 !important; border-radius: 0 !important; box-shadow: none !important;
}
.movement-extra:hover { background: var(--mv-paper) !important; }
.movement-extra.active { color: var(--mv-card) !important; background: var(--mv-ink) !important; }
.movement-extra-num { font-weight: 700; opacity: .55; }
.movement-extra-tag { font-size: 7px; letter-spacing: .06em; padding: 0 2px; margin-left: 3px; border: 1px solid currentColor; opacity: .6; vertical-align: middle; }
/* ── Mobile: stack the picker above the stage ──────────────────────────────── */
@media (max-width: 768px) {
.movement-view { flex-direction: column; }
.movement-picker {
width: 100%; max-height: 32%; border-right: 0; border-bottom: 2px solid var(--mv-ink);
}
.movement-extras { max-width: 60%; }
}
|