tiny-army / web /shell /classes.css
polats's picture
Style the skill-detail card on classes/enemies to match auto-battler
ca975ec
#classes-stage, #enemies-stage {
/* Classes sandbox styles. Kept in its own file (imported by Classes.jsx) rather
than the shared styles.css to avoid colliding with parallel work there.
Uses the global design tokens (--ink, --paper, …) defined in styles.css. */
.classes { display: flex; height: 100%; width: 100%; }
.classes-list { width: 170px; flex-shrink: 0; border-right: 2px solid var(--ink); background: var(--paper-2); padding: 12px; overflow-y: auto; }
.classes-list h2, .classes-customize h2, .classes-skills-head { font-family: var(--font-mono); font-size: 10px; letter-spacing: .2em; text-transform: uppercase; color: var(--transmit); margin: 0 0 8px; }
.classes-list ul { list-style: none; padding: 0; margin: 0; }
.classes-link { display: block; width: 100%; text-align: left; padding: 6px 8px; border: none; border-left: 3px solid var(--c); background: transparent; cursor: pointer; font-family: inherit; font-size: 14px; font-weight: 500; color: var(--ink); }
.classes-link:hover { background: var(--paper-3); }
.classes-link.active { background: var(--ink); color: var(--paper); }
.classes-palette { margin-top: 14px; padding-top: 10px; border-top: 1px solid var(--paper-3); }
.classes-palette-head { font-family: var(--font-mono); font-size: 10px; letter-spacing: .15em; text-transform: uppercase; color: var(--transmit); margin-bottom: 6px; }
.classes-palette-head .muted { letter-spacing: 0; }
.classes-swatches { display: flex; flex-direction: column; gap: 4px; }
.classes-swatch { display: grid; grid-template-columns: auto 1fr; align-items: center; gap: 7px; width: 100%; text-align: left; padding: 4px 6px; border: 1px solid transparent; border-radius: 4px; background: transparent; cursor: pointer; font-family: inherit; font-size: 11px; color: var(--ink); }
.classes-swatch-num { grid-row: 1 / span 2; font-family: var(--font-mono); font-size: 12px; font-weight: 700; color: var(--transmit); width: 12px; text-align: center; }
.classes-swatch-ramp { display: flex; height: 14px; border-radius: 3px; overflow: hidden; box-shadow: inset 0 0 0 1px rgba(0,0,0,.25); }
.classes-swatch-ramp i { flex: 1 1 0; min-width: 0; }
.classes-swatch-name { font-size: 10px; color: var(--muted, #8a857a); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.classes-swatch:hover { background: var(--paper-3); }
.classes-swatch.active { border-color: var(--ink); background: var(--paper-3); }
.classes-swatch.active .classes-swatch-name { color: var(--ink); font-weight: 600; }
.classes-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.classes-stage { flex: 1; min-height: 0; }
.classes-stage canvas { display: block; width: 100%; height: 100%; }
.classes-taskbar { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-top: 2px solid var(--ink); background: var(--paper-2); }
.classes-slot { width: 48px; height: 48px; border: 1.5px solid var(--ink); background: var(--card); cursor: pointer; display: flex; align-items: center; justify-content: center; padding: 0; box-shadow: 2px 2px 0 rgba(20,24,33,.25); }
.classes-slot.filled { box-shadow: 0 0 0 1.5px var(--transmit), 2px 2px 0 rgba(20,24,33,.25); }
.classes-slot img { width: 40px; height: 40px; image-rendering: pixelated; }
.classes-slot-num { font-family: var(--font-mono); font-size: 14px; color: var(--ink-faint); }
.classes-controls { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-top: 2px solid var(--ink); background: var(--paper-2); }
.classes-attack-btn { padding: 6px 12px; border: 1.5px solid var(--ink); background: var(--ink); color: var(--paper); cursor: pointer; font-family: var(--font-mono); font-size: 10px; letter-spacing: .1em; text-transform: uppercase; }
.classes-attack-btn:hover:not(:disabled) { background: var(--ink-2); }
.classes-attack-btn:disabled { opacity: .45; cursor: default; }
.classes-taskbar-hint { font-family: var(--font-mono); font-size: 10px; margin-left: auto; }
/* stackable effect editor (chips + add dropdown) */
.classes-fx-stack { display: flex; flex-direction: column; gap: 5px; }
.classes-fx-chips { display: flex; flex-wrap: wrap; gap: 4px; }
.classes-fx-chip { display: inline-flex; align-items: center; gap: 4px; font-family: var(--font-mono); font-size: 10px; padding: 2px 4px 2px 7px; border: 1.5px solid var(--ink); background: var(--card); color: var(--ink); }
.classes-fx-chip button { border: none; background: transparent; cursor: pointer; color: var(--ink-muted); font-size: 13px; line-height: 1; padding: 0 2px; }
.classes-fx-chip button:hover { color: var(--transmit); }
.classes-skills { height: 170px; flex-shrink: 0; border-top: 2px solid var(--ink); background: var(--paper); padding: 10px 12px; overflow-y: auto; }
.classes-skills-head { display: flex; align-items: baseline; gap: 4px; }
.classes-skills-head strong { font-family: var(--font-display); font-size: 14px; letter-spacing: 0; text-transform: none; }
.classes-skill-grid { display: flex; flex-wrap: wrap; gap: 5px; }
.classes-skill { padding: 0; border: 1.5px solid var(--ink); background: var(--card); cursor: pointer; line-height: 0; }
.classes-skill img { width: 36px; height: 36px; image-rendering: pixelated; }
.classes-skill:hover { transform: translate(-1px,-1px); }
.classes-skill.elite { border-color: var(--amber); box-shadow: 0 0 0 1.5px var(--amber); }
.classes-skill.on-bar { outline: 2px solid var(--transmit); outline-offset: 1px; }
.classes-skill.selected { outline: 2px solid var(--amber); outline-offset: 1px; }
.classes-skill:disabled { cursor: default; }
.classes-customize { width: 220px; flex-shrink: 0; border-left: 2px solid var(--ink); background: var(--paper-2); padding: 12px; }
.classes-customize h2 { border-bottom: 3px solid var(--c); padding-bottom: 4px; }
.classes-readonly { font-family: var(--font-mono); font-size: 10px; color: var(--ink-muted); border: 1px dashed var(--ink-faint); padding: 4px 6px; }
.classes-field { display: flex; flex-direction: column; gap: 4px; font-family: var(--font-mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 12px; }
.classes-field select { padding: 5px 6px; border: 1.5px solid var(--ink); background: var(--paper); font-family: var(--font-sans); font-size: 12px; letter-spacing: 0; text-transform: none; color: var(--ink); }
.classes-preview-name { font-size: 13px; color: var(--ink-2); }
/* selected-skill detail section (below the class customize fields) */
.classes-skill-detail { margin-top: 16px; border-top: 1px dashed var(--ink-faint); padding-top: 12px; }
.classes-skill-detail h2 { border-bottom: 3px solid var(--c); padding-bottom: 4px; }
.classes-skill-name { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.classes-skill-name img { border: 1.5px solid var(--ink); image-rendering: pixelated; }
.classes-skill-name img.elite { border-color: var(--amber); }
.classes-skill-name strong { font-family: var(--font-display); font-size: 15px; }
.classes-skill-ir { background: var(--ink); color: var(--paper); padding: 8px 10px; font-family: var(--font-mono); font-size: 10px; line-height: 1.5; white-space: pre-wrap; margin: 0 0 12px; }
.classes-skill-actions { display: flex; gap: 6px; margin-top: 8px; }
.classes-skill-add { flex: 1; padding: 6px; border: 1.5px dashed var(--ink); background: transparent; color: var(--ink); cursor: pointer; font-family: var(--font-sans); font-size: 12px; }
.classes-skill-add:hover:not(:disabled) { background: var(--ink); color: var(--paper); border-style: solid; }
.classes-skill-add:disabled { opacity: .5; cursor: default; }
/* Enemies sandbox: roster add/delete + stats grid (reuses the .classes-* layout
above; only the bits unique to the editable enemy roster live here). */
.enemies-roster-head { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
.enemies-add { border: 1.5px dashed var(--ink); background: transparent; color: var(--ink); cursor: pointer; font-family: var(--font-mono); font-size: 14px; line-height: 1; padding: 1px 7px; }
.enemies-add:hover { background: var(--ink); color: var(--paper); border-style: solid; }
.enemies-row { display: flex; align-items: stretch; }
.enemies-row .classes-link { flex: 1; min-width: 0; }
.enemies-del { border: none; background: transparent; color: var(--ink-faint); cursor: pointer; font-size: 13px; padding: 0 6px; }
.enemies-row:hover .enemies-del { color: var(--transmit); }
.enemies-empty { font-family: var(--font-mono); font-size: 10px; color: var(--ink-muted); padding: 6px 2px; }
.enemies-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 12px; }
.enemies-stat { display: flex; flex-direction: column; gap: 4px; font-family: var(--font-mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--ink-muted); }
.enemies-stat input { padding: 5px 6px; border: 1.5px solid var(--ink); background: var(--paper); font-family: var(--font-mono); font-size: 12px; letter-spacing: 0; color: var(--ink); width: 100%; box-sizing: border-box; }
.classes-field input[type="text"] { padding: 5px 6px; border: 1.5px solid var(--ink); background: var(--paper); font-family: var(--font-sans); font-size: 12px; letter-spacing: 0; text-transform: none; color: var(--ink); }
.enemies-skill-add-row { margin-top: 8px; }
.enemies-skill-add-row select { width: 100%; padding: 5px 6px; border: 1.5px solid var(--ink); background: var(--paper); font-family: var(--font-sans); font-size: 12px; color: var(--ink); }
/* Enemy skills panel: an "assigned" row + a filterable catalog whose chips
toggle membership (taskbar-style), with the profession filter pinned at the
bottom. A flex column so the catalog scrolls while header/filter stay put. */
.enemies-skills { height: 220px; display: flex; flex-direction: column; gap: 4px; overflow: hidden; }
.enemies-skill-sub { font-family: var(--font-mono); font-size: 9px; letter-spacing: .15em; text-transform: uppercase; color: var(--ink-muted); margin: 4px 0 2px; }
.enemies-assigned { flex-shrink: 0; display: flex; flex-wrap: wrap; gap: 5px; min-height: 38px; }
.enemies-catalog { flex: 1; min-height: 0; overflow-y: auto; display: flex; flex-wrap: wrap; gap: 5px; align-content: flex-start; }
.enemies-filter { flex-shrink: 0; display: flex; flex-wrap: wrap; gap: 4px; border-top: 1px dashed var(--ink-faint); padding-top: 6px; margin-top: 2px; }
.enemies-filter button { font-family: var(--font-mono); font-size: 9px; letter-spacing: .1em; text-transform: uppercase; padding: 3px 7px; border: 1.5px solid var(--ink); background: var(--paper); color: var(--ink); cursor: pointer; }
.enemies-filter button:hover { background: var(--paper-3); }
.enemies-filter button.active { background: var(--ink); color: var(--paper); }
.classes-skill.on-bar img { opacity: 1; }
.classes-skill.off-bar img { opacity: .4; }
.classes-skill.off-bar:hover img { opacity: .8; }
/* Remove badge: a small × in the top-right corner of an assigned skill chip,
for one-click removal without relying on the toggle. */
.enemies-skill-wrap { position: relative; line-height: 0; }
.enemies-remove-badge { position: absolute; top: -6px; right: -6px; width: 16px; height: 16px; padding: 0; border: 1.5px solid var(--ink); border-radius: 50%; background: var(--paper); color: var(--ink); font-family: var(--font-mono); font-size: 11px; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; z-index: 2; box-shadow: 1px 1px 0 rgba(20,24,33,.3); }
.enemies-remove-badge:hover { background: var(--transmit); color: var(--paper); border-color: var(--transmit); }
/* ════════════════════════════════════════════════════════════════════════════
* Gradio-host portability (Tiny Army Space). The Space loads ONLY this file, not
* the app's global styles.css, so (a) the design tokens would be undefined and
* (b) Gradio's `.gradio-container button/ul/li/select` base styles leak in (list
* bullets, tall rounded buttons, swapped fonts, dropped panel borders/bg). We fix
* both, scoped to `.classes`: redefine the tokens locally (mirroring styles.css
* :root) and re-assert the box/type props with !important. Both are harmless and
* redundant in the React app — same values, already-reset elements.
* ════════════════════════════════════════════════════════════════════════════ */
.classes {
--paper: #f3ebdc; --paper-2: #ece2cc; --paper-3: #e2d6ba; --card: #fbf6ea;
--ink: #141821; --ink-2: #2a2f3a; --ink-muted: #6d6a5f; --ink-faint: #8a8574;
--transmit: #d8271a; --lime: #b8d64a; --amber: #e8a72a;
--font-display: 'Fraunces', Georgia, serif;
--font-sans: 'Space Grotesk', -apple-system, BlinkMacSystemFont, sans-serif;
--font-mono: 'JetBrains Mono', ui-monospace, Menlo, monospace;
}
.classes ul, .classes li { list-style: none !important; margin: 0 !important; padding: 0 !important; }
.classes button { min-height: 0 !important; box-shadow: none !important; border-radius: 0 !important; }
.classes-link { padding: 6px 8px !important; border: none !important; border-left: 3px solid var(--c) !important; background: transparent !important; font-family: inherit !important; font-size: 14px !important; font-weight: 500 !important; text-align: left !important; }
.classes-swatch { text-align: left !important; }
.classes-link.active { background: var(--ink) !important; color: var(--paper) !important; }
.classes-attack-btn { padding: 6px 12px !important; border: 1.5px solid var(--ink) !important; background: var(--ink) !important; color: var(--paper) !important; font-family: var(--font-mono) !important; font-size: 10px !important; }
.classes-attack-btn:disabled { opacity: .45 !important; }
.classes-skill { padding: 0 !important; border: 1.5px solid var(--ink) !important; line-height: 0 !important; }
.classes-skill.elite { border-color: var(--amber) !important; box-shadow: 0 0 0 1.5px var(--amber) !important; }
.classes-swatch { padding: 4px 6px !important; border: 1px solid transparent !important; border-radius: 4px !important; background: transparent !important; font-family: inherit !important; }
.classes-swatch.active { border-color: var(--ink) !important; background: var(--paper-3) !important; }
.classes-fx-chip button { border: none !important; padding: 0 2px !important; background: transparent !important; }
.classes-field select, .classes-field input, .enemies-stat input, .enemies-skill-add-row select { border: 1.5px solid var(--ink) !important; background: var(--paper) !important; }
.enemies-filter button { padding: 3px 7px !important; border: 1.5px solid var(--ink) !important; background: var(--paper) !important; }
.enemies-filter button.active { background: var(--ink) !important; color: var(--paper) !important; }
.enemies-add, .classes-skill-add { border: 1.5px dashed var(--ink) !important; background: transparent !important; }
.enemies-remove-badge { border-radius: 50% !important; border: 1.5px solid var(--ink) !important; padding: 0 !important; box-shadow: 1px 1px 0 rgba(20,24,33,.3) !important; }
.enemies-del { border: none !important; background: transparent !important; }
.cbgame-skill-chip {
display: inline-flex; align-items: center; gap: 5px;
background: rgba(0,0,0,.28); border: 1px solid rgba(255,255,255,.1);
border-radius: 4px; padding: 2px 7px 2px 2px;
font-family: var(--font-mono); font-size: 9px; color: rgba(255,255,255,.72); letter-spacing: .02em;
}
.cbgame-skill-icon { width: 18px; height: 18px; border-radius: 3px; flex-shrink: 0; }
.cbgame-skill-dot { width: 7px; height: 7px; flex-shrink: 0; border-radius: 50%; background: var(--fx, #888); box-shadow: 0 0 4px var(--fx, #888); }
.cbgame-skill-chip.selectable { cursor: pointer; font: inherit; font-family: var(--font-mono); font-size: 9px; transition: background 140ms ease, border-color 140ms ease; }
.cbgame-skill-chip.selectable:hover { background: rgba(255,255,255,.08); }
.cbgame-skill-chip.selectable.selected { border-color: var(--prof-color, #888); background: rgba(255,255,255,.1); color: #fff; }
.cbgame-skill-detail {
display: flex; flex-direction: column; gap: 8px;
background: #14110d; border: 1px solid rgba(255,255,255,.12);
border-left: 3px solid var(--prof-color, #888); border-radius: 5px; padding: 10px;
}
.cbgame-skill-detail-head { display: flex; align-items: center; gap: 9px; }
.cbgame-skill-detail-icon { border-radius: 4px; flex-shrink: 0; image-rendering: pixelated; }
.cbgame-skill-detail-icon.elite { box-shadow: 0 0 0 1px #f0b429; }
.cbgame-skill-detail-name { font-family: var(--font-display); font-size: 14px; color: #f4ecd8; line-height: 1.15; }
.cbgame-skill-detail-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; font-family: var(--font-mono); font-size: 9px; color: var(--prof-color, #888); letter-spacing: .06em; text-transform: uppercase; margin-top: 3px; }
.cbgame-skill-detail-meta .dot { opacity: .5; }
.cbgame-skill-target { color: rgba(255,255,255,.55); border: 1px solid rgba(255,255,255,.18); border-radius: 3px; padding: 0 4px; }
.cbgame-skill-stats { display: flex; flex-wrap: wrap; gap: 5px; }
.cbgame-skill-stat {
display: inline-flex; align-items: center; gap: 4px; padding: 2px 7px 2px 5px;
border-radius: 10px; font-family: var(--font-mono); font-size: 11px; font-weight: 600;
background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.12); color: rgba(255,255,255,.82);
}
.cbgame-skill-stat img { image-rendering: pixelated; }
.cbgame-skill-stat.tone-energy { background: rgba(74,140,220,.18); border-color: rgba(74,140,220,.5); color: #aaccf5; }
.cbgame-skill-stat.tone-adrenaline { background: rgba(240,160,40,.16); border-color: rgba(240,160,40,.5); color: #f0c074; }
.cbgame-skill-stat.tone-sacrifice { background: rgba(200,60,60,.18); border-color: rgba(200,60,60,.5); color: #f0a0a0; }
.cbgame-skill-stat.tone-time { background: rgba(255,255,255,.05); border-color: rgba(255,255,255,.15); color: rgba(255,255,255,.7); }
.cbgame-skill-triggers { display: flex; flex-wrap: wrap; gap: 5px; }
.cbgame-skill-trigger {
font-family: var(--font-mono); font-size: 10px; letter-spacing: .02em;
background: rgba(240,180,64,.12); border: 1px solid rgba(240,180,64,.4); color: #f0c878;
border-radius: 4px; padding: 2px 7px;
}
.cbgame-skill-fx { display: flex; flex-direction: column; gap: 5px; }
.cbgame-skill-fx-row {
display: flex; align-items: center; gap: 7px;
background: color-mix(in srgb, var(--fx) 22%, #14110d);
border-left: 3px solid var(--fx); border-radius: 0 4px 4px 0; padding: 5px 8px;
}
.cbgame-skill-fx-tag {
flex-shrink: 0; font-family: var(--font-mono); font-size: 8px; font-weight: 700;
letter-spacing: .06em; text-transform: uppercase; padding: 2px 5px; border-radius: 3px;
background: var(--fx); color: #15110c;
}
.cbgame-skill-fx-cond { flex-shrink: 0; border-radius: 3px; box-shadow: 0 0 0 1px var(--fx); }
.cbgame-skill-fx-text { font-size: 11px; color: #ece4d4; line-height: 1.4; }
.cbgame-skill-palette { display: flex; flex-wrap: wrap; gap: 6px; }
.cbgame-skill-chip.palette { cursor: pointer; transition: background 140ms ease, border-color 140ms ease; }
.cbgame-skill-chip.palette:hover:not(:disabled) { background: rgba(255,255,255,.08); }
.cbgame-skill-chip.palette.on { border-color: var(--prof-color, #888); background: rgba(255,255,255,.1); color: #fff; }
.cbgame-skill-chip.palette.locked { opacity: .45; cursor: not-allowed; }
}