Refine gear stats and harden optimizer controls
Browse files- static/index.html +17 -15
- tests/test_market_optimizer_logic.py +6 -3
static/index.html
CHANGED
|
@@ -184,9 +184,9 @@ input::placeholder{color:var(--text3);}
|
|
| 184 |
.market-panel.market-collapsed .market-body{display:none;}
|
| 185 |
.market-panel.market-collapsed{max-width:none;margin-left:0;}
|
| 186 |
.market-panel.market-collapsed .collapse-btn{transform:rotate(-90deg);}
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
.opt-plan-shell{display:flex;flex-direction:column;gap:12px;}
|
| 191 |
.opt-plan-hero{border:1px solid rgba(0,200,255,.26);background:radial-gradient(circle at 0 0,rgba(0,200,255,.14),transparent 34%),linear-gradient(180deg,rgba(255,255,255,.04),rgba(255,255,255,0)),var(--bg2);border-radius:12px;padding:13px;overflow:hidden;}
|
| 192 |
.opt-plan-head{display:grid;grid-template-columns:minmax(260px,.95fr) minmax(340px,1.25fr);gap:12px;align-items:start;margin-bottom:12px;}
|
|
@@ -448,8 +448,8 @@ input::placeholder{color:var(--text3);}
|
|
| 448 |
.trade-power-card span{font-family:'Share Tech Mono',monospace;font-size:10px;color:var(--gold);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
| 449 |
.trade-cta{width:100%;justify-content:center;margin-top:12px;padding:10px;font-size:12px;border-radius:5px;}
|
| 450 |
@media(max-width:1180px){.opt-plan-head,.opt-plan-actions{grid-template-columns:1fr}.opt-summary-grid{grid-template-columns:repeat(2,minmax(135px,1fr));}.opt-room-head{grid-template-columns:1fr}.opt-room-stats{grid-template-columns:repeat(3,minmax(70px,1fr));}.opt-market-grid{grid-template-columns:repeat(2,minmax(100px,1fr));}}
|
| 451 |
-
@media(max-width:650px){.account-add-row,.account-base-grid,
|
| 452 |
-
@media(max-width:650px){
|
| 453 |
.account-lookup-panel{overflow:visible;}
|
| 454 |
.ai-avatar-card{width:94px;height:94px;margin:7px auto 3px;padding:3px;overflow:visible;border:1px solid rgba(0,200,255,.24);background:#657b91;border-radius:3px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 14px rgba(0,0,0,.18);}
|
| 455 |
.ai-avatar-card canvas{width:86px!important;height:86px!important;display:block;image-rendering:auto;filter:drop-shadow(0 4px 7px rgba(0,0,0,.42));}
|
|
@@ -797,17 +797,18 @@ input::placeholder{color:var(--text3);}
|
|
| 797 |
.gi-result-type{font-family:'Share Tech Mono',monospace;font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--text2);margin-top:6px;line-height:1.45;}
|
| 798 |
.gi-search-extra{margin-top:12px;font-family:'Share Tech Mono',monospace;font-size:13px;line-height:1.35;color:var(--text2);border-top:1px solid rgba(42,63,85,.62);padding-top:10px;}
|
| 799 |
.gi-search-extra strong{font-family:'Orbitron',monospace;font-size:18px;color:var(--green);letter-spacing:.4px;margin-left:8px;}
|
| 800 |
-
.gi-result-metrics{display:grid;grid-template-columns:minmax(340px,
|
| 801 |
.gi-result-metrics .gi-result-bars{margin-top:0;border-top:0;padding-top:0;}
|
| 802 |
-
.gi-
|
| 803 |
-
.gi-campfire-card
|
| 804 |
-
.gi-campfire-
|
| 805 |
-
.gi-campfire-
|
| 806 |
-
.gi-campfire-
|
|
|
|
| 807 |
.gi-campfire-card.ineligible{border-color:rgba(100,138,168,.3);background:rgba(8,11,16,.38);}
|
| 808 |
.gi-campfire-card.ineligible::before{background:var(--text3);box-shadow:none;}
|
| 809 |
.gi-campfire-card.ineligible .gi-campfire-label{color:var(--text3);}
|
| 810 |
-
.gi-campfire-card.ineligible .gi-campfire-time{font-size:
|
| 811 |
.gi-stat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:8px;}
|
| 812 |
.gi-stat-box{border:1px solid rgba(42,63,85,.78);border-radius:7px;background:rgba(8,11,16,.42);padding:9px;min-width:0;}
|
| 813 |
.gi-stat-lbl{font-family:'Share Tech Mono',monospace;font-size:8px;letter-spacing:1.5px;text-transform:uppercase;color:var(--text3);margin-bottom:5px;}
|
|
@@ -851,7 +852,7 @@ input::placeholder{color:var(--text3);}
|
|
| 851 |
.gi-bars{position:relative;z-index:1;display:flex;flex-direction:column;gap:11px;margin-top:auto;padding-top:10px;}
|
| 852 |
.gi-gallery-card .gi-bars{margin-top:10px;padding-top:8px;}
|
| 853 |
.gi-result-bars{margin-top:12px;border-top:1px solid rgba(42,63,85,.62);padding-top:10px;}
|
| 854 |
-
.gi-result-bars .gi-bars{
|
| 855 |
.gi-bar-row{display:grid;grid-template-columns:96px minmax(0,1fr) 82px;gap:10px;align-items:center;}
|
| 856 |
.gi-gallery-card .gi-bar-row{grid-template-columns:78px minmax(46px,1fr) 64px;gap:8px;}
|
| 857 |
.gi-bar-label,.gi-bar-value{font-family:'Share Tech Mono',monospace;font-size:12px;letter-spacing:.5px;color:var(--text2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
|
@@ -866,8 +867,9 @@ input::placeholder{color:var(--text3);}
|
|
| 866 |
.gi-armour-panel .pb{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px;overflow:auto;max-height:720px;}
|
| 867 |
.gi-armour-block{min-width:0;border:1px solid rgba(42,63,85,.58);border-radius:8px;background:rgba(8,11,16,.22);overflow:hidden;}
|
| 868 |
.gi-armour-title{font-family:'Share Tech Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--accent);padding:10px;border-bottom:1px solid rgba(42,63,85,.58);}
|
| 869 |
-
@media(max-width:980px){.gi-result-metrics{grid-template-columns:1fr}.gi-campfire-card{min-height:
|
| 870 |
@media(max-width:760px){.gi-result-card{grid-template-columns:1fr}.gi-result-art{min-height:190px;border-right:0;border-bottom:1px solid rgba(42,63,85,.65)}.gi-result-metrics{grid-template-columns:1fr}}
|
|
|
|
| 871 |
@media(max-width:1100px){.account-info-grid{grid-template-columns:1fr;}.ai-stat-grid{grid-template-columns:repeat(3,minmax(0,1fr));}}
|
| 872 |
@media(max-width:800px){.ai-stat-grid{grid-template-columns:repeat(2,minmax(0,1fr));}}
|
| 873 |
@media(max-width:620px){#app{padding:8px}.ai-quick-fields,.ai-profile-metrics{grid-template-columns:1fr 1fr}.ai-stat-grid,.ai-player-detail-grid{grid-template-columns:1fr;}.ai-inventory-cards{grid-template-columns:repeat(2,minmax(0,1fr));}.ai-inv-card{min-height:166px}.ai-inv-art{height:76px}.ai-inv-name{font-size:14px}.ai-lookup-card .ai-avatar-card{width:164px;height:164px}.ai-lookup-card .ai-avatar-card canvas{width:196px!important;height:196px!important;flex-basis:196px}.saved-player-purpose{display:none}.saved-player-tools{gap:4px}.saved-player-save,.saved-player-trigger{padding:4px 6px;font-size:8px}}
|
|
@@ -1040,7 +1042,7 @@ input::placeholder{color:var(--text3);}
|
|
| 1040 |
</div>
|
| 1041 |
</div>
|
| 1042 |
|
| 1043 |
-
<div
|
| 1044 |
<button class="btn btn-p" id="run-btn" style="font-size:14px;padding:11px" onclick="runOpt()">OPTIMIZE</button>
|
| 1045 |
<label class="mini-toggle" title="Disable market buy/sell search and only optimize current setup power and rooms">
|
| 1046 |
<input type="checkbox" id="use-market-optimum" checked>
|
|
|
|
| 184 |
.market-panel.market-collapsed .market-body{display:none;}
|
| 185 |
.market-panel.market-collapsed{max-width:none;margin-left:0;}
|
| 186 |
.market-panel.market-collapsed .collapse-btn{transform:rotate(-90deg);}
|
| 187 |
+
#optimizer-controls{display:grid;grid-template-columns:minmax(0,1.7fr) auto minmax(130px,.8fr);gap:8px;margin-bottom:12px;align-items:stretch;visibility:visible;opacity:1;}
|
| 188 |
+
#optimizer-controls .btn{justify-content:center;border-radius:7px;min-height:44px;}
|
| 189 |
+
#optimizer-controls .mini-toggle{justify-content:center;min-height:44px;}
|
| 190 |
.opt-plan-shell{display:flex;flex-direction:column;gap:12px;}
|
| 191 |
.opt-plan-hero{border:1px solid rgba(0,200,255,.26);background:radial-gradient(circle at 0 0,rgba(0,200,255,.14),transparent 34%),linear-gradient(180deg,rgba(255,255,255,.04),rgba(255,255,255,0)),var(--bg2);border-radius:12px;padding:13px;overflow:hidden;}
|
| 192 |
.opt-plan-head{display:grid;grid-template-columns:minmax(260px,.95fr) minmax(340px,1.25fr);gap:12px;align-items:start;margin-bottom:12px;}
|
|
|
|
| 448 |
.trade-power-card span{font-family:'Share Tech Mono',monospace;font-size:10px;color:var(--gold);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
| 449 |
.trade-cta{width:100%;justify-content:center;margin-top:12px;padding:10px;font-size:12px;border-radius:5px;}
|
| 450 |
@media(max-width:1180px){.opt-plan-head,.opt-plan-actions{grid-template-columns:1fr}.opt-summary-grid{grid-template-columns:repeat(2,minmax(135px,1fr));}.opt-room-head{grid-template-columns:1fr}.opt-room-stats{grid-template-columns:repeat(3,minmax(70px,1fr));}.opt-market-grid{grid-template-columns:repeat(2,minmax(100px,1fr));}}
|
| 451 |
+
@media(max-width:650px){.account-add-row,.account-base-grid,#optimizer-controls,.opt-rec-actions,.trade-lab,.trade-actions,.opt-summary-grid,.opt-room-stats,.opt-account-grid,.opt-market-grid,.opt-market-columns{grid-template-columns:1fr}.opt-plan-head,.opt-plan-actions{grid-template-columns:1fr}.opt-gear-row{grid-template-columns:1fr}.opt-pets{grid-template-columns:1fr}.opt-account-stats{grid-template-columns:repeat(2,minmax(0,1fr));}.opt-market-card .market-head{grid-template-columns:1fr auto}.opt-market-brief{grid-column:1 / -1;justify-content:flex-start}.opt-market-meta{grid-column:1 / -1;text-align:left}.opt-period-control{grid-template-columns:auto 1fr 1fr;}.opt-market-row{grid-template-columns:42px minmax(0,1fr)}.opt-market-side{grid-column:2 / -1;align-items:flex-start}.opt-market-price{text-align:left}.opt-section-head{align-items:flex-start;flex-direction:column}.opt-section-head>span{text-align:left}}
|
| 452 |
+
@media(max-width:650px){#optimizer-controls{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}#optimizer-controls #run-btn{grid-column:1 / -1}}
|
| 453 |
.account-lookup-panel{overflow:visible;}
|
| 454 |
.ai-avatar-card{width:94px;height:94px;margin:7px auto 3px;padding:3px;overflow:visible;border:1px solid rgba(0,200,255,.24);background:#657b91;border-radius:3px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 14px rgba(0,0,0,.18);}
|
| 455 |
.ai-avatar-card canvas{width:86px!important;height:86px!important;display:block;image-rendering:auto;filter:drop-shadow(0 4px 7px rgba(0,0,0,.42));}
|
|
|
|
| 797 |
.gi-result-type{font-family:'Share Tech Mono',monospace;font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--text2);margin-top:6px;line-height:1.45;}
|
| 798 |
.gi-search-extra{margin-top:12px;font-family:'Share Tech Mono',monospace;font-size:13px;line-height:1.35;color:var(--text2);border-top:1px solid rgba(42,63,85,.62);padding-top:10px;}
|
| 799 |
.gi-search-extra strong{font-family:'Orbitron',monospace;font-size:18px;color:var(--green);letter-spacing:.4px;margin-left:8px;}
|
| 800 |
+
.gi-result-metrics{display:grid;grid-template-columns:minmax(340px,1fr) 180px;gap:18px;align-items:start;margin-top:12px;border-top:1px solid rgba(42,63,85,.62);padding-top:12px;}
|
| 801 |
.gi-result-metrics .gi-result-bars{margin-top:0;border-top:0;padding-top:0;}
|
| 802 |
+
.gi-result-bars .gi-bar-value{font-family:'Orbitron',monospace;font-size:15px;font-weight:800;color:#fff;text-shadow:0 0 12px rgba(0,200,255,.16);}
|
| 803 |
+
.gi-campfire-card{width:180px;min-width:0;justify-self:end;border:1px solid rgba(240,165,0,.18);border-radius:6px;background:rgba(8,11,16,.3);padding:8px 9px 8px 11px;display:flex;flex-direction:column;justify-content:center;position:relative;overflow:hidden;}
|
| 804 |
+
.gi-campfire-card::before{content:'';position:absolute;inset:0 auto 0 0;width:2px;background:rgba(240,165,0,.58);}
|
| 805 |
+
.gi-campfire-label{font-family:'Share Tech Mono',monospace;font-size:8px;letter-spacing:1.5px;text-transform:uppercase;color:#b9974b;margin-bottom:4px;}
|
| 806 |
+
.gi-campfire-time{font-family:'Orbitron',monospace;font-size:14px;font-weight:700;line-height:1.15;color:#dbe3ec;overflow-wrap:anywhere;}
|
| 807 |
+
.gi-campfire-sub{font-family:'Share Tech Mono',monospace;font-size:8px;line-height:1.3;color:var(--text3);margin-top:4px;}
|
| 808 |
.gi-campfire-card.ineligible{border-color:rgba(100,138,168,.3);background:rgba(8,11,16,.38);}
|
| 809 |
.gi-campfire-card.ineligible::before{background:var(--text3);box-shadow:none;}
|
| 810 |
.gi-campfire-card.ineligible .gi-campfire-label{color:var(--text3);}
|
| 811 |
+
.gi-campfire-card.ineligible .gi-campfire-time{font-size:12px;color:var(--text2);}
|
| 812 |
.gi-stat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:8px;}
|
| 813 |
.gi-stat-box{border:1px solid rgba(42,63,85,.78);border-radius:7px;background:rgba(8,11,16,.42);padding:9px;min-width:0;}
|
| 814 |
.gi-stat-lbl{font-family:'Share Tech Mono',monospace;font-size:8px;letter-spacing:1.5px;text-transform:uppercase;color:var(--text3);margin-bottom:5px;}
|
|
|
|
| 852 |
.gi-bars{position:relative;z-index:1;display:flex;flex-direction:column;gap:11px;margin-top:auto;padding-top:10px;}
|
| 853 |
.gi-gallery-card .gi-bars{margin-top:10px;padding-top:8px;}
|
| 854 |
.gi-result-bars{margin-top:12px;border-top:1px solid rgba(42,63,85,.62);padding-top:10px;}
|
| 855 |
+
.gi-result-bars .gi-bars{margin-top:0;padding-top:0;}
|
| 856 |
.gi-bar-row{display:grid;grid-template-columns:96px minmax(0,1fr) 82px;gap:10px;align-items:center;}
|
| 857 |
.gi-gallery-card .gi-bar-row{grid-template-columns:78px minmax(46px,1fr) 64px;gap:8px;}
|
| 858 |
.gi-bar-label,.gi-bar-value{font-family:'Share Tech Mono',monospace;font-size:12px;letter-spacing:.5px;color:var(--text2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
|
|
|
| 867 |
.gi-armour-panel .pb{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:14px;overflow:auto;max-height:720px;}
|
| 868 |
.gi-armour-block{min-width:0;border:1px solid rgba(42,63,85,.58);border-radius:8px;background:rgba(8,11,16,.22);overflow:hidden;}
|
| 869 |
.gi-armour-title{font-family:'Share Tech Mono',monospace;font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(--accent);padding:10px;border-bottom:1px solid rgba(42,63,85,.58);}
|
| 870 |
+
@media(max-width:980px){.gi-result-metrics{grid-template-columns:1fr}.gi-campfire-card{min-height:0}}
|
| 871 |
@media(max-width:760px){.gi-result-card{grid-template-columns:1fr}.gi-result-art{min-height:190px;border-right:0;border-bottom:1px solid rgba(42,63,85,.65)}.gi-result-metrics{grid-template-columns:1fr}}
|
| 872 |
+
@media(max-width:520px){.gi-campfire-card{width:100%;justify-self:stretch}}
|
| 873 |
@media(max-width:1100px){.account-info-grid{grid-template-columns:1fr;}.ai-stat-grid{grid-template-columns:repeat(3,minmax(0,1fr));}}
|
| 874 |
@media(max-width:800px){.ai-stat-grid{grid-template-columns:repeat(2,minmax(0,1fr));}}
|
| 875 |
@media(max-width:620px){#app{padding:8px}.ai-quick-fields,.ai-profile-metrics{grid-template-columns:1fr 1fr}.ai-stat-grid,.ai-player-detail-grid{grid-template-columns:1fr;}.ai-inventory-cards{grid-template-columns:repeat(2,minmax(0,1fr));}.ai-inv-card{min-height:166px}.ai-inv-art{height:76px}.ai-inv-name{font-size:14px}.ai-lookup-card .ai-avatar-card{width:164px;height:164px}.ai-lookup-card .ai-avatar-card canvas{width:196px!important;height:196px!important;flex-basis:196px}.saved-player-purpose{display:none}.saved-player-tools{gap:4px}.saved-player-save,.saved-player-trigger{padding:4px 6px;font-size:8px}}
|
|
|
|
| 1042 |
</div>
|
| 1043 |
</div>
|
| 1044 |
|
| 1045 |
+
<div id="optimizer-controls">
|
| 1046 |
<button class="btn btn-p" id="run-btn" style="font-size:14px;padding:11px" onclick="runOpt()">OPTIMIZE</button>
|
| 1047 |
<label class="mini-toggle" title="Disable market buy/sell search and only optimize current setup power and rooms">
|
| 1048 |
<input type="checkbox" id="use-market-optimum" checked>
|
tests/test_market_optimizer_logic.py
CHANGED
|
@@ -1952,12 +1952,13 @@ class MarketOptimizerLogicTests(unittest.TestCase):
|
|
| 1952 |
def test_optimizer_actions_are_below_the_account_list(self):
|
| 1953 |
html = (Path(__file__).resolve().parents[1] / "static" / "index.html").read_text(encoding="utf-8")
|
| 1954 |
accounts_index = html.index('id="panel-accounts"')
|
| 1955 |
-
actions_index = html.index('<div
|
| 1956 |
right_column_index = html.index('<div><!-- RIGHT COLUMN -->')
|
| 1957 |
self.assertLess(accounts_index, actions_index)
|
| 1958 |
self.assertLess(actions_index, right_column_index)
|
| 1959 |
-
self.assertIn("
|
| 1960 |
-
self.assertNotIn("
|
|
|
|
| 1961 |
self.assertEqual(html.count('id="run-btn"'), 1)
|
| 1962 |
|
| 1963 |
def test_gear_info_uses_the_exact_campfire_formula_and_eligibility(self):
|
|
@@ -1969,6 +1970,8 @@ class MarketOptimizerLogicTests(unittest.TestCase):
|
|
| 1969 |
self.assertIn("Campfire accepts swords and shields only.", html)
|
| 1970 |
self.assertIn("Legendary items cannot be donated.", html)
|
| 1971 |
self.assertEqual(html.count("campfireBaseGold:sell"), 2)
|
|
|
|
|
|
|
| 1972 |
|
| 1973 |
def test_live_power_ui_keeps_raw_value_for_calculations_until_manual_edit(self):
|
| 1974 |
html = (Path(__file__).resolve().parents[1] / "static" / "index.html").read_text(encoding="utf-8")
|
|
|
|
| 1952 |
def test_optimizer_actions_are_below_the_account_list(self):
|
| 1953 |
html = (Path(__file__).resolve().parents[1] / "static" / "index.html").read_text(encoding="utf-8")
|
| 1954 |
accounts_index = html.index('id="panel-accounts"')
|
| 1955 |
+
actions_index = html.index('<div id="optimizer-controls">')
|
| 1956 |
right_column_index = html.index('<div><!-- RIGHT COLUMN -->')
|
| 1957 |
self.assertLess(accounts_index, actions_index)
|
| 1958 |
self.assertLess(actions_index, right_column_index)
|
| 1959 |
+
self.assertIn("#optimizer-controls{display:grid", html)
|
| 1960 |
+
self.assertNotIn("#optimizer-controls{position:sticky", html)
|
| 1961 |
+
self.assertNotIn("opt-action-bar", html)
|
| 1962 |
self.assertEqual(html.count('id="run-btn"'), 1)
|
| 1963 |
|
| 1964 |
def test_gear_info_uses_the_exact_campfire_formula_and_eligibility(self):
|
|
|
|
| 1970 |
self.assertIn("Campfire accepts swords and shields only.", html)
|
| 1971 |
self.assertIn("Legendary items cannot be donated.", html)
|
| 1972 |
self.assertEqual(html.count("campfireBaseGold:sell"), 2)
|
| 1973 |
+
self.assertIn("grid-template-columns:minmax(340px,1fr) 180px", html)
|
| 1974 |
+
self.assertIn(".gi-result-bars .gi-bar-value{font-family:'Orbitron'", html)
|
| 1975 |
|
| 1976 |
def test_live_power_ui_keeps_raw_value_for_calculations_until_manual_edit(self):
|
| 1977 |
html = (Path(__file__).resolve().parents[1] / "static" / "index.html").read_text(encoding="utf-8")
|