feat: species taxonomy UI + robust ingest + precision hero layout
Browse files- theme.py: rename rarity-* → species-* CSS classes (cascade/architect/
converter/throughput); add .tabitem padding override to fix column squish
- app.py: classify/rarity_class rewritten to Quadrant Species Designation;
board_html/card_html updated to species-* classes; ghost card updated;
hero replaced with precision hardware telemetry layout (4-column stat
strip, SYSTEM STATUS badge, METRIC VECTOR label)
- ingest.py: add Defense 1 (markdown fence strip) + Defense 2 (embedded
brace seeking) before JSON parse; wrap Strategy 1+2 in try/except so
broken trees fall through cleanly; Strategy 3 raises descriptive error
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@@ -69,11 +69,11 @@ def board_html(extra=None, sort_key="yield"):
|
|
| 69 |
rank_cls = f"mb-rank-{i}" if i <= 3 else ""
|
| 70 |
rkey = rarity_class(m)[0]
|
| 71 |
if you:
|
| 72 |
-
cls = f"mb-row
|
| 73 |
elif i == 1:
|
| 74 |
-
cls = f"mb-row
|
| 75 |
else:
|
| 76 |
-
cls = f"mb-row
|
| 77 |
ne = _html.escape(n)
|
| 78 |
est_mark = " <span class='mb-est' title='* structural estimation'>*</span>" if m.get("cost_estimated") else ""
|
| 79 |
out.append(f'<div class="{cls}">'
|
|
@@ -95,36 +95,35 @@ def board_html(extra=None, sort_key="yield"):
|
|
| 95 |
def classify(m):
|
| 96 |
if m["non_compounding"]: return "Non-Compounding \u00b7 stateless pipe"
|
| 97 |
v,l=m["velocity"],m["leverage"]
|
| 98 |
-
if v>=1 and l>=100: return "
|
| 99 |
-
if l>=10 and v<1: return "
|
| 100 |
-
if v>=0.
|
| 101 |
-
return "
|
| 102 |
|
| 103 |
def rarity_class(m):
|
| 104 |
-
"""Returns (
|
| 105 |
-
|
| 106 |
-
Mirrors the user's trading-card design: four species of greatness.
|
| 107 |
"""
|
| 108 |
v, l = m["velocity"], m["leverage"]
|
| 109 |
if v >= 1 and l >= 100:
|
| 110 |
-
return ("
|
| 111 |
-
"Compound
|
| 112 |
-
"Multipliers stack. Transmission \u00d7 Commitment \u00d7 Reuse = Leverage. "
|
| 113 |
-
"
|
| 114 |
if l >= 10 and v < 1:
|
| 115 |
-
return ("
|
| 116 |
-
"Persistent
|
| 117 |
-
"Builds
|
| 118 |
-
"Holds
|
| 119 |
if v >= 0.5:
|
| 120 |
-
return ("
|
| 121 |
-
"
|
| 122 |
-
"
|
| 123 |
-
"
|
| 124 |
-
return ("
|
| 125 |
-
"Mass Transit",
|
| 126 |
-
"
|
| 127 |
-
"
|
| 128 |
|
| 129 |
def comp_bar_html(c):
|
| 130 |
return (f'<div class="comp-bar">'
|
|
@@ -166,9 +165,9 @@ def card_html(name, m, rank, total_ops, narration_text):
|
|
| 166 |
cascade = '<div class="sig-card-cascade-box">\u2014<small>non-compounding</small></div>'
|
| 167 |
quote = _first_sentence(narration_text)
|
| 168 |
return (
|
| 169 |
-
f'<div class="sig-card
|
| 170 |
'<div class="sig-card-watermark">MO\u00a7ES\u2122 SIGRANK</div>'
|
| 171 |
-
f'<div class="sig-card-rarity
|
| 172 |
f'<div class="sig-card-name">{name}</div>'
|
| 173 |
f'<div class="sig-card-archetype">{archetype}</div>'
|
| 174 |
f'<div class="sig-card-passive">Passive: {passive}</div>'
|
|
@@ -330,10 +329,10 @@ _ON_SPACE = bool(_os.environ.get("SPACE_ID"))
|
|
| 330 |
|
| 331 |
# Ghost/"unminted" card so the right column is never an empty void on first load.
|
| 332 |
CARD_PLACEHOLDER = (
|
| 333 |
-
'<div class="sig-card
|
| 334 |
-
'<div class="sig-card-watermark">MO
|
| 335 |
-
'<div class="sig-card-rarity
|
| 336 |
-
'<div class="sig-card-name">Awaiting Operator
|
| 337 |
'<div class="sig-card-archetype">Signal Offline</div>'
|
| 338 |
'<div class="sig-card-yield">0,000</div>'
|
| 339 |
'<div class="sig-card-yield-label">insert token ledger to scan</div>'
|
|
@@ -350,15 +349,38 @@ def _build_demo():
|
|
| 350 |
_lead = (_ys[0] / _ys[1]) if len(_ys) > 1 and _ys[1] > 0 else 0.0
|
| 351 |
with _b:
|
| 352 |
with gr.Column(elem_id="moses-hero"):
|
| 353 |
-
gr.HTML(
|
| 354 |
-
|
| 355 |
-
|
| 356 |
-
|
| 357 |
-
|
| 358 |
-
|
| 359 |
-
|
| 360 |
-
|
| 361 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 362 |
|
| 363 |
# ---- TAB 1: Leaderboard (board + sticky profile inspector) ----
|
| 364 |
with gr.Tab("Leaderboard"):
|
|
|
|
| 69 |
rank_cls = f"mb-rank-{i}" if i <= 3 else ""
|
| 70 |
rkey = rarity_class(m)[0]
|
| 71 |
if you:
|
| 72 |
+
cls = f"mb-row species-{rkey} you"
|
| 73 |
elif i == 1:
|
| 74 |
+
cls = f"mb-row species-{rkey} rank1"
|
| 75 |
else:
|
| 76 |
+
cls = f"mb-row species-{rkey}"
|
| 77 |
ne = _html.escape(n)
|
| 78 |
est_mark = " <span class='mb-est' title='* structural estimation'>*</span>" if m.get("cost_estimated") else ""
|
| 79 |
out.append(f'<div class="{cls}">'
|
|
|
|
| 95 |
def classify(m):
|
| 96 |
if m["non_compounding"]: return "Non-Compounding \u00b7 stateless pipe"
|
| 97 |
v,l=m["velocity"],m["leverage"]
|
| 98 |
+
if v>=1 and l>=100: return "Cascade Matrix \u00b7 recursive processing loop"
|
| 99 |
+
if l>=10 and v<1: return "Cache Architect \u00b7 high structural reuse"
|
| 100 |
+
if v>=0.5 and l<2: return "Converter Loop \u00b7 single-pass processing velocity"
|
| 101 |
+
return "Throughput Pipe \u00b7 raw metric bandwidth"
|
| 102 |
|
| 103 |
def rarity_class(m):
|
| 104 |
+
"""Returns (species_key, label, trait, description).
|
| 105 |
+
Quadrant Species Designation based on algorithmic efficiency vectors.
|
|
|
|
| 106 |
"""
|
| 107 |
v, l = m["velocity"], m["leverage"]
|
| 108 |
if v >= 1 and l >= 100:
|
| 109 |
+
return ("cascade", "CASCADE SPECIES",
|
| 110 |
+
"Compound Cascading Loop",
|
| 111 |
+
"Multipliers stack across all dimensions. Transmission \u00d7 Commitment \u00d7 Reuse = Leverage. "
|
| 112 |
+
"Maintains high production velocity while driving compounding architectural feedback.")
|
| 113 |
if l >= 10 and v < 1:
|
| 114 |
+
return ("architect", "CACHE ARCHITECT",
|
| 115 |
+
"Persistent Context Layer",
|
| 116 |
+
"Builds high-reuse caching layers. Every token commit is read across sequential loops. "
|
| 117 |
+
"Holds state perfectly without requiring linear transformation velocity.")
|
| 118 |
if v >= 0.5:
|
| 119 |
+
return ("converter", "CONVERTER SPECIES",
|
| 120 |
+
"Linear Volumetric Output",
|
| 121 |
+
"High immediate input-to-output context conversion ratio. Maximizes localized turn processing. "
|
| 122 |
+
"Token footprint does not compound or recur inside long-term retrieval networks.")
|
| 123 |
+
return ("throughput", "THROUGHPUT SPECIES",
|
| 124 |
+
"Volumetric Mass Transit",
|
| 125 |
+
"Processes massive raw token scale across standard pipelines. Focuses on total platform load. "
|
| 126 |
+
"Optimization vector is execution bandwidth rather than persistent feedback loops.")
|
| 127 |
|
| 128 |
def comp_bar_html(c):
|
| 129 |
return (f'<div class="comp-bar">'
|
|
|
|
| 165 |
cascade = '<div class="sig-card-cascade-box">\u2014<small>non-compounding</small></div>'
|
| 166 |
quote = _first_sentence(narration_text)
|
| 167 |
return (
|
| 168 |
+
f'<div class="sig-card species-{rkey}">'
|
| 169 |
'<div class="sig-card-watermark">MO\u00a7ES\u2122 SIGRANK</div>'
|
| 170 |
+
f'<div class="sig-card-rarity species-{rkey}">{rlabel}</div>'
|
| 171 |
f'<div class="sig-card-name">{name}</div>'
|
| 172 |
f'<div class="sig-card-archetype">{archetype}</div>'
|
| 173 |
f'<div class="sig-card-passive">Passive: {passive}</div>'
|
|
|
|
| 329 |
|
| 330 |
# Ghost/"unminted" card so the right column is never an empty void on first load.
|
| 331 |
CARD_PLACEHOLDER = (
|
| 332 |
+
'<div class="sig-card species-throughput" id="ghost-card">'
|
| 333 |
+
'<div class="sig-card-watermark">MO\u00a7ES\u2122 SIGRANK</div>'
|
| 334 |
+
'<div class="sig-card-rarity species-throughput">UNMINTED</div>'
|
| 335 |
+
'<div class="sig-card-name">Awaiting Operator\u2026</div>'
|
| 336 |
'<div class="sig-card-archetype">Signal Offline</div>'
|
| 337 |
'<div class="sig-card-yield">0,000</div>'
|
| 338 |
'<div class="sig-card-yield-label">insert token ledger to scan</div>'
|
|
|
|
| 349 |
_lead = (_ys[0] / _ys[1]) if len(_ys) > 1 and _ys[1] > 0 else 0.0
|
| 350 |
with _b:
|
| 351 |
with gr.Column(elem_id="moses-hero"):
|
| 352 |
+
gr.HTML(
|
| 353 |
+
"<div style='display: flex; justify-content: space-between; align-items: flex-end; border-bottom: 2px solid #C4923A; padding-bottom: 12px; margin-bottom: 16px;'>"
|
| 354 |
+
" <div>"
|
| 355 |
+
" <h1 style='color: #C4923A !important; font-size: 36px !important; font-weight: 800 !important; letter-spacing: 0.2em !important; margin: 0 !important; line-height: 1.1;'>MO\u00a7ES<span style='font-size: 16px; vertical-align: super; font-weight: 400; letter-spacing: normal;'>\u2122</span> <span style='color: #E8E0CF; font-weight: 300;'>SIGRANK</span></h1>"
|
| 356 |
+
" <p style='color: #8a7f68 !important; font-size: 11px !important; letter-spacing: 0.05em !important; margin: 6px 0 0 0 !important; text-transform: uppercase;'>Diagnostic X-Ray of the Token Economy // Continuous Architectural Profiling</p>"
|
| 357 |
+
" </div>"
|
| 358 |
+
" <div style='text-align: right; font-size: 10px; color: #8a7f68; letter-spacing: 0.1em; line-height: 1.4; font-weight: bold;'>"
|
| 359 |
+
" SYSTEM STATUS: <span style='color: #22c55e;'>ONLINE</span><br>"
|
| 360 |
+
" METRIC VECTOR: <span style='color: #C4923A;'>\u03a5 = (C\u00b7O)/I\u00b2</span>"
|
| 361 |
+
" </div>"
|
| 362 |
+
"</div>"
|
| 363 |
+
)
|
| 364 |
+
gr.HTML(
|
| 365 |
+
f'<div id="moses-stat-strip" style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; background: #1E1B15; border: 1px solid #3A3324; padding: 12px 18px; border-radius: 6px; margin-bottom: 24px;">'
|
| 366 |
+
f' <div style="border-right: 1px solid #3A3324; padding-right: 10px;">'
|
| 367 |
+
f' <div style="font-size: 9px; color: #8a7f68; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 2px;">Operators Profiled</div>'
|
| 368 |
+
f' <div style="font-size: 20px; color: #E8E0CF; font-weight: 700;">{len(_ops_now)} <span style="font-size: 11px; color: #8a7f68; font-weight: normal;">nodes</span></div>'
|
| 369 |
+
f' </div>'
|
| 370 |
+
f' <div style="border-right: 1px solid #3A3324; padding-right: 10px; padding-left: 10px;">'
|
| 371 |
+
f' <div style="font-size: 9px; color: #8a7f68; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 2px;">Empirical Delta</div>'
|
| 372 |
+
f' <div style="font-size: 20px; color: #C4923A; font-weight: 700;">{_lead:,.0f}\u00d7 <span style="font-size: 11px; color: #8a7f68; font-weight: normal;">max \u03a5</span></div>'
|
| 373 |
+
f' </div>'
|
| 374 |
+
f' <div style="border-right: 1px solid #3A3324; padding-right: 10px; padding-left: 10px;">'
|
| 375 |
+
f' <div style="font-size: 9px; color: #8a7f68; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 2px;">Evaluation Strategy</div>'
|
| 376 |
+
f' <div style="font-size: 14px; color: #E8E0CF; font-weight: 700; line-height: 1.5; text-transform: uppercase; letter-spacing: 0.02em;">Compounding Loops</div>'
|
| 377 |
+
f' </div>'
|
| 378 |
+
f' <div style="padding-left: 10px;">'
|
| 379 |
+
f' <div style="font-size: 9px; color: #8a7f68; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 2px;">Core Constraint</div>'
|
| 380 |
+
f' <div style="font-size: 14px; color: #8a7f68; font-weight: 700; line-height: 1.5; text-transform: uppercase; letter-spacing: 0.02em;"><span style="color: #E8E0CF;">Architecture</span> > Budget</div>'
|
| 381 |
+
f' </div>'
|
| 382 |
+
f'</div>'
|
| 383 |
+
)
|
| 384 |
|
| 385 |
# ---- TAB 1: Leaderboard (board + sticky profile inspector) ----
|
| 386 |
with gr.Tab("Leaderboard"):
|
|
@@ -251,66 +251,93 @@ def ingest_meta(text, operator_profile=None):
|
|
| 251 |
- Text with named fields (extracts by field name, not position)
|
| 252 |
- Four bare numbers: input output cache_create cache_read
|
| 253 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 254 |
operator_profile: optional dict {"model_type": "claude", "io_ratio": float}
|
| 255 |
when the submitting user has a verified Claude session profile. This
|
| 256 |
switches the Codex parser from the Alpha 2:1 baseline to the Beta pathway
|
| 257 |
that uses the operator's own Claude input/output ratio.
|
| 258 |
"""
|
| 259 |
-
text=text.strip()
|
| 260 |
-
if not text:
|
|
|
|
| 261 |
|
| 262 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 263 |
fixed = None
|
| 264 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 265 |
fixed = _try_fix_json(text)
|
|
|
|
|
|
|
| 266 |
if fixed:
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
|
|
|
|
|
|
|
|
|
| 272 |
|
| 273 |
# --- Strategy 2: Text has named fields — extract by name ---
|
| 274 |
if _has_named_fields(text):
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
|
|
|
|
|
|
|
|
|
| 313 |
|
| 314 |
# --- Strategy 3: Four bare numbers ---
|
| 315 |
-
|
| 316 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 251 |
- Text with named fields (extracts by field name, not position)
|
| 252 |
- Four bare numbers: input output cache_create cache_read
|
| 253 |
|
| 254 |
+
Reinforced error handling guarantees that malformed JSON strings, trailing
|
| 255 |
+
spaces, or mixed terminal logs fall back safely through non-breaking pipeline
|
| 256 |
+
routes.
|
| 257 |
+
|
| 258 |
operator_profile: optional dict {"model_type": "claude", "io_ratio": float}
|
| 259 |
when the submitting user has a verified Claude session profile. This
|
| 260 |
switches the Codex parser from the Alpha 2:1 baseline to the Beta pathway
|
| 261 |
that uses the operator's own Claude input/output ratio.
|
| 262 |
"""
|
| 263 |
+
text = text.strip()
|
| 264 |
+
if not text:
|
| 265 |
+
raise ValueError("The sequence input buffer is empty.")
|
| 266 |
|
| 267 |
+
# Defense 1: Pre-process and strip common terminal markdown code block wrappers
|
| 268 |
+
if text.startswith("```"):
|
| 269 |
+
text = re.sub(r"^```[a-z]*\n", "", text, flags=re.IGNORECASE)
|
| 270 |
+
text = re.sub(r"\n```$", "", text)
|
| 271 |
+
text = text.strip()
|
| 272 |
+
|
| 273 |
+
# Defense 2: Seek embedded object markers if raw copy contains surrounding prose
|
| 274 |
fixed = None
|
| 275 |
+
json_start = re.search(r'[\{\["]', text)
|
| 276 |
+
if json_start:
|
| 277 |
+
candidate_segment = text[json_start.start():]
|
| 278 |
+
fixed = _try_fix_json(candidate_segment)
|
| 279 |
+
|
| 280 |
+
if not fixed and text[0] in '{["':
|
| 281 |
fixed = _try_fix_json(text)
|
| 282 |
+
|
| 283 |
+
# --- Strategy 1: Try to parse as valid JSON (or fix partial JSON) ---
|
| 284 |
if fixed:
|
| 285 |
+
try:
|
| 286 |
+
d = json.loads(fixed)
|
| 287 |
+
if is_codex_shape(d):
|
| 288 |
+
return parse_codex_submission(d, operator_profile=operator_profile)
|
| 289 |
+
i, o, cw, cr, cost = parse_ccusage(fixed)
|
| 290 |
+
return i, o, cw, cr, {"source": "ccusage", "estimated": False, "caveat": None, "cost": cost}
|
| 291 |
+
except Exception:
|
| 292 |
+
pass # Fall through to named-field extraction if the tree remains broken
|
| 293 |
|
| 294 |
# --- Strategy 2: Text has named fields — extract by name ---
|
| 295 |
if _has_named_fields(text):
|
| 296 |
+
try:
|
| 297 |
+
result = _extract_by_name(text)
|
| 298 |
+
if result:
|
| 299 |
+
i, o, cw, cr, cost_val = result
|
| 300 |
+
has_codex_fields = any(
|
| 301 |
+
alias in text
|
| 302 |
+
for alias in ("cachedInputTokens", "cached_input_tokens",
|
| 303 |
+
"reasoningOutputTokens", "reasoning_output_tokens")
|
| 304 |
+
)
|
| 305 |
+
if has_codex_fields:
|
| 306 |
+
# Re-route through Codex pathway with extracted totals
|
| 307 |
+
raw_cache = 0
|
| 308 |
+
for alias in _FIELD_ALIASES["cache_read"]:
|
| 309 |
+
m = re.search(rf'"{re.escape(alias)}"\s*:\s*([\d,.]+)', text)
|
| 310 |
+
if m:
|
| 311 |
+
raw_cache = int(float(m.group(1).replace(",", "")))
|
| 312 |
+
break
|
| 313 |
+
raw_in = 0
|
| 314 |
+
for alias in _FIELD_ALIASES["input"]:
|
| 315 |
+
m = re.search(rf'"{re.escape(alias)}"\s*:\s*([\d,.]+)', text)
|
| 316 |
+
if m:
|
| 317 |
+
raw_in = int(float(m.group(1).replace(",", "")))
|
| 318 |
+
break
|
| 319 |
+
raw_out = o # already includes reasoning from _extract_by_name
|
| 320 |
+
est_input, parsing_mode = _codex_input_estimate(raw_out, operator_profile)
|
| 321 |
+
context_debt = max(0, raw_in - est_input)
|
| 322 |
+
meta = {
|
| 323 |
+
"source": "codex", "estimated": True,
|
| 324 |
+
"parsing_mode": parsing_mode,
|
| 325 |
+
"caveat": f"* {parsing_mode}",
|
| 326 |
+
"anchor": parsing_mode, "cost": cost_val,
|
| 327 |
+
}
|
| 328 |
+
return int(est_input), raw_out, context_debt, raw_cache, meta
|
| 329 |
+
else:
|
| 330 |
+
cost = cost_val if cost_val and cost_val > 0 else None
|
| 331 |
+
return i, o, cw, cr, {
|
| 332 |
+
"source": "ccusage", "estimated": False,
|
| 333 |
+
"caveat": None, "cost": cost,
|
| 334 |
+
}
|
| 335 |
+
except Exception:
|
| 336 |
+
pass
|
| 337 |
|
| 338 |
# --- Strategy 3: Four bare numbers ---
|
| 339 |
+
try:
|
| 340 |
+
i, o, cw, cr = parse_four(text)
|
| 341 |
+
return i, o, cw, cr, {"source": "manual", "estimated": False, "caveat": None, "cost": None}
|
| 342 |
+
except Exception as e:
|
| 343 |
+
raise ValueError(f"Telemetry format unrecognized. Trace error: {str(e)}")
|
|
@@ -8,10 +8,10 @@ CSS = """
|
|
| 8 |
--moses-line: #3A3324;
|
| 9 |
--moses-ink: #E8E0CF;
|
| 10 |
--moses-dim: #8a7f68;
|
| 11 |
-
--
|
| 12 |
-
--
|
| 13 |
-
--
|
| 14 |
-
--
|
| 15 |
}
|
| 16 |
.gradio-container, .gradio-container * { font-family: ui-monospace, "SF Mono", Menlo, monospace !important; }
|
| 17 |
.gradio-container { background: var(--moses-bg) !important; max-width: 1100px !important; margin: 0 auto !important; }
|
|
@@ -31,6 +31,7 @@ CSS = """
|
|
| 31 |
margin: 0 !important;
|
| 32 |
}
|
| 33 |
#moses-hero p { color: var(--moses-dim) !important; font-size: 12px !important; margin: 6px 0 0 !important; }
|
|
|
|
| 34 |
/* stat strip */
|
| 35 |
#moses-stat-strip {
|
| 36 |
display: flex; gap: 24px; margin-top: 10px;
|
|
@@ -38,12 +39,19 @@ CSS = """
|
|
| 38 |
}
|
| 39 |
#moses-stat-strip span { color: var(--moses-ink); font-weight: 700; }
|
| 40 |
|
| 41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
button.selected { color: var(--moses-gold) !important; border-bottom: 2px solid var(--moses-gold) !important; }
|
| 43 |
.tab-nav button { color: var(--moses-dim) !important; font-size: 13px !important; letter-spacing: 0.06em; }
|
| 44 |
|
| 45 |
.dataframe, table { background: var(--moses-card) !important; color: var(--moses-ink) !important;
|
| 46 |
-
border: 1px solid var(--moses-line) !important; font-size: 12px !important; }
|
| 47 |
.dataframe thead th, table thead th { background: var(--moses-bg) !important; color: var(--moses-gold) !important;
|
| 48 |
border-bottom: 1px solid var(--moses-gold) !important; font-size: 10px !important;
|
| 49 |
letter-spacing: 0.06em !important; text-transform: uppercase; padding: 8px 6px !important; }
|
|
@@ -74,9 +82,10 @@ button.primary:hover, #compute-btn:hover { background: #d8a449 !important; }
|
|
| 74 |
.prose, .md, #moses-foot { color: var(--moses-dim) !important; font-size: 11px !important; }
|
| 75 |
#moses-foot { border-top: 1px solid var(--moses-line); padding-top: 10px; margin-top: 16px; line-height: 1.7; }
|
| 76 |
|
| 77 |
-
|
| 78 |
-
.
|
| 79 |
-
|
|
|
|
| 80 |
.mb-head { color: #C4923A; font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase;
|
| 81 |
border-bottom: 1px solid #C4923A; }
|
| 82 |
.mb-row { border-bottom: 1px solid #3A3324; color: #8a7f68; font-size: 12px; }
|
|
@@ -88,10 +97,12 @@ button.primary:hover, #compute-btn:hover { background: #d8a449 !important; }
|
|
| 88 |
color: var(--moses-ink) !important;
|
| 89 |
}
|
| 90 |
.mb-row.rank1 .mb-yval { color: var(--moses-gold); font-size: 14px; }
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
.mb-row.
|
| 94 |
-
.mb-row.
|
|
|
|
|
|
|
| 95 |
.mb-rank-1 { color: var(--moses-gold); font-weight: 700; }
|
| 96 |
.mb-rank-2 { color: #a0a0a0; }
|
| 97 |
.mb-rank-3 { color: #8a6a3a; }
|
|
@@ -121,10 +132,10 @@ button.primary:hover, #compute-btn:hover { background: #d8a449 !important; }
|
|
| 121 |
font-family: ui-monospace, monospace;
|
| 122 |
position: relative;
|
| 123 |
}
|
| 124 |
-
.sig-card.
|
| 125 |
-
.sig-card.
|
| 126 |
-
.sig-card.
|
| 127 |
-
.sig-card.
|
| 128 |
.sig-card-watermark {
|
| 129 |
position: absolute; top: 14px; right: 16px;
|
| 130 |
font-size: 9px; color: var(--moses-dim); letter-spacing: 0.1em;
|
|
@@ -156,14 +167,14 @@ button.primary:hover, #compute-btn:hover { background: #d8a449 !important; }
|
|
| 156 |
font-style: italic;
|
| 157 |
}
|
| 158 |
.sig-card-rarity { display: inline-block; font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; font-weight: 700; padding: 2px 8px; border-radius: 2px; margin-bottom: 8px; }
|
| 159 |
-
.sig-card-rarity.
|
| 160 |
-
.sig-card-rarity.
|
| 161 |
-
.sig-card-rarity.
|
| 162 |
-
.sig-card-rarity.
|
| 163 |
.sig-card-passive { font-size: 9px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--moses-dim); margin: 12px 0 4px; }
|
| 164 |
.sig-card-effect { font-size: 10px; color: var(--moses-dim); font-style: italic; border-left: 2px solid #3A3324; padding: 6px 10px; margin-bottom: 14px; line-height: 1.5; }
|
| 165 |
-
.sig-card.
|
| 166 |
-
.sig-card.
|
| 167 |
.sig-card-footer {
|
| 168 |
position: absolute; bottom: 16px; left: 24px; right: 24px;
|
| 169 |
font-size: 9px; color: #5f573f; letter-spacing: 0.06em;
|
|
@@ -200,10 +211,6 @@ button.primary:hover, #compute-btn:hover { background: #d8a449 !important; }
|
|
| 200 |
/* HF login button styling */
|
| 201 |
#hf-login-btn { margin-bottom: 8px; }
|
| 202 |
|
| 203 |
-
/* footprint flex line under the hero (Build Small badge) */
|
| 204 |
-
#moses-footprint { margin-top: 8px; font-size: 10px; color: var(--moses-dim);
|
| 205 |
-
letter-spacing: 0.05em; opacity: 0.85; }
|
| 206 |
-
|
| 207 |
/* "Rank by" radio -> horizontal pill / segmented control (not a gray form) */
|
| 208 |
#rank-by { border: none !important; background: transparent !important; padding: 0 !important; }
|
| 209 |
#rank-by .wrap { display: flex !important; flex-wrap: wrap; gap: 6px; }
|
|
|
|
| 8 |
--moses-line: #3A3324;
|
| 9 |
--moses-ink: #E8E0CF;
|
| 10 |
--moses-dim: #8a7f68;
|
| 11 |
+
--species-throughput: #6b7280;
|
| 12 |
+
--species-converter: #3b82f6;
|
| 13 |
+
--species-architect: #8b5cf6;
|
| 14 |
+
--species-cascade: #C4923A;
|
| 15 |
}
|
| 16 |
.gradio-container, .gradio-container * { font-family: ui-monospace, "SF Mono", Menlo, monospace !important; }
|
| 17 |
.gradio-container { background: var(--moses-bg) !important; max-width: 1100px !important; margin: 0 auto !important; }
|
|
|
|
| 31 |
margin: 0 !important;
|
| 32 |
}
|
| 33 |
#moses-hero p { color: var(--moses-dim) !important; font-size: 12px !important; margin: 6px 0 0 !important; }
|
| 34 |
+
|
| 35 |
/* stat strip */
|
| 36 |
#moses-stat-strip {
|
| 37 |
display: flex; gap: 24px; margin-top: 10px;
|
|
|
|
| 39 |
}
|
| 40 |
#moses-stat-strip span { color: var(--moses-ink); font-weight: 700; }
|
| 41 |
|
| 42 |
+
/* Tab padding layout stabilization overrides */
|
| 43 |
+
.tabs { background: transparent !important; border: none !important; }
|
| 44 |
+
.tabitem {
|
| 45 |
+
background: transparent !important;
|
| 46 |
+
border: none !important;
|
| 47 |
+
padding: 16px 0px !important;
|
| 48 |
+
}
|
| 49 |
+
.tabitem > div { gap: 20px !important; }
|
| 50 |
button.selected { color: var(--moses-gold) !important; border-bottom: 2px solid var(--moses-gold) !important; }
|
| 51 |
.tab-nav button { color: var(--moses-dim) !important; font-size: 13px !important; letter-spacing: 0.06em; }
|
| 52 |
|
| 53 |
.dataframe, table { background: var(--moses-card) !important; color: var(--moses-ink) !important;
|
| 54 |
+
border: 1px solid var(--moses-line) !important; font-size: 12px !important; width: 100% !important; }
|
| 55 |
.dataframe thead th, table thead th { background: var(--moses-bg) !important; color: var(--moses-gold) !important;
|
| 56 |
border-bottom: 1px solid var(--moses-gold) !important; font-size: 10px !important;
|
| 57 |
letter-spacing: 0.06em !important; text-transform: uppercase; padding: 8px 6px !important; }
|
|
|
|
| 82 |
.prose, .md, #moses-foot { color: var(--moses-dim) !important; font-size: 11px !important; }
|
| 83 |
#moses-foot { border-top: 1px solid var(--moses-line); padding-top: 10px; margin-top: 16px; line-height: 1.7; }
|
| 84 |
|
| 85 |
+
/* Structural Board Alignment Layout */
|
| 86 |
+
.moses-board { font-family: ui-monospace, monospace; margin-top: 6px; width: 100% !important; box-sizing: border-box !important; }
|
| 87 |
+
.mb-head, .mb-row { display: grid; grid-template-columns: 32px 1.8fr 0.6fr 0.7fr 0.7fr 0.75fr 0.7fr 1.5fr;
|
| 88 |
+
align-items: center; gap: 12px; padding: 10px 12px; width: 100%; box-sizing: border-box; }
|
| 89 |
.mb-head { color: #C4923A; font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase;
|
| 90 |
border-bottom: 1px solid #C4923A; }
|
| 91 |
.mb-row { border-bottom: 1px solid #3A3324; color: #8a7f68; font-size: 12px; }
|
|
|
|
| 97 |
color: var(--moses-ink) !important;
|
| 98 |
}
|
| 99 |
.mb-row.rank1 .mb-yval { color: var(--moses-gold); font-size: 14px; }
|
| 100 |
+
|
| 101 |
+
/* Species Classification Left Highlights */
|
| 102 |
+
.mb-row.species-throughput { border-left: 3px solid var(--species-throughput); }
|
| 103 |
+
.mb-row.species-converter { border-left: 3px solid var(--species-converter); }
|
| 104 |
+
.mb-row.species-architect { border-left: 3px solid var(--species-architect); }
|
| 105 |
+
.mb-row.species-cascade { border-left: 3px solid var(--species-cascade); }
|
| 106 |
.mb-rank-1 { color: var(--moses-gold); font-weight: 700; }
|
| 107 |
.mb-rank-2 { color: #a0a0a0; }
|
| 108 |
.mb-rank-3 { color: #8a6a3a; }
|
|
|
|
| 132 |
font-family: ui-monospace, monospace;
|
| 133 |
position: relative;
|
| 134 |
}
|
| 135 |
+
.sig-card.species-throughput { border: 1px solid var(--species-throughput); box-shadow: 0 0 20px rgba(107,114,128,0.12); }
|
| 136 |
+
.sig-card.species-converter { border: 1px solid var(--species-converter); box-shadow: 0 0 24px rgba(59,130,246,0.15); }
|
| 137 |
+
.sig-card.species-architect { border: 1px solid var(--species-architect); box-shadow: 0 0 28px rgba(139,92,246,0.18); }
|
| 138 |
+
.sig-card.species-cascade { border: 1px solid var(--species-cascade); box-shadow: 0 0 40px rgba(196,146,58,0.22), inset 0 1px 0 rgba(196,146,58,0.15); }
|
| 139 |
.sig-card-watermark {
|
| 140 |
position: absolute; top: 14px; right: 16px;
|
| 141 |
font-size: 9px; color: var(--moses-dim); letter-spacing: 0.1em;
|
|
|
|
| 167 |
font-style: italic;
|
| 168 |
}
|
| 169 |
.sig-card-rarity { display: inline-block; font-size: 9px; letter-spacing: 0.14em; text-transform: uppercase; font-weight: 700; padding: 2px 8px; border-radius: 2px; margin-bottom: 8px; }
|
| 170 |
+
.sig-card-rarity.species-throughput { color: var(--species-throughput); border: 1px solid var(--species-throughput); }
|
| 171 |
+
.sig-card-rarity.species-converter { color: var(--species-converter); border: 1px solid var(--species-converter); }
|
| 172 |
+
.sig-card-rarity.species-architect { color: var(--species-architect); border: 1px solid var(--species-architect); }
|
| 173 |
+
.sig-card-rarity.species-cascade { color: var(--species-cascade); border: 1px solid var(--species-cascade); }
|
| 174 |
.sig-card-passive { font-size: 9px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--moses-dim); margin: 12px 0 4px; }
|
| 175 |
.sig-card-effect { font-size: 10px; color: var(--moses-dim); font-style: italic; border-left: 2px solid #3A3324; padding: 6px 10px; margin-bottom: 14px; line-height: 1.5; }
|
| 176 |
+
.sig-card.species-cascade .sig-card-yield { color: var(--species-cascade); }
|
| 177 |
+
.sig-card.species-cascade .sig-card-name { color: var(--species-cascade); }
|
| 178 |
.sig-card-footer {
|
| 179 |
position: absolute; bottom: 16px; left: 24px; right: 24px;
|
| 180 |
font-size: 9px; color: #5f573f; letter-spacing: 0.06em;
|
|
|
|
| 211 |
/* HF login button styling */
|
| 212 |
#hf-login-btn { margin-bottom: 8px; }
|
| 213 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 214 |
/* "Rank by" radio -> horizontal pill / segmented control (not a gray form) */
|
| 215 |
#rank-by { border: none !important; background: transparent !important; padding: 0 !important; }
|
| 216 |
#rank-by .wrap { display: flex !important; flex-wrap: wrap; gap: 6px; }
|