oettaM123 commited on
Commit
2214bb2
·
1 Parent(s): feab5f8

Refine gear stats and harden optimizer controls

Browse files
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
- .opt-action-bar{display:grid;grid-template-columns:minmax(0,1.7fr) auto minmax(130px,.8fr);gap:8px;margin-bottom:12px;align-items:stretch;}
188
- .opt-action-bar .btn{justify-content:center;border-radius:7px;min-height:44px;}
189
- .opt-action-bar .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,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,.opt-action-bar,.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){.opt-action-bar{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.opt-action-bar #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,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,720px) minmax(170px,1fr);gap:14px;align-items:stretch;margin-top:12px;border-top:1px solid rgba(42,63,85,.62);padding-top:10px;}
801
  .gi-result-metrics .gi-result-bars{margin-top:0;border-top:0;padding-top:0;}
802
- .gi-campfire-card{min-width:0;border:1px solid rgba(240,165,0,.3);border-radius:7px;background:linear-gradient(145deg,rgba(240,165,0,.1),rgba(8,11,16,.54));padding:11px 12px;display:flex;flex-direction:column;justify-content:center;position:relative;overflow:hidden;}
803
- .gi-campfire-card::before{content:'';position:absolute;inset:0 auto 0 0;width:3px;background:var(--gold);box-shadow:0 0 14px rgba(240,165,0,.5);}
804
- .gi-campfire-label{font-family:'Share Tech Mono',monospace;font-size:9px;letter-spacing:1.8px;text-transform:uppercase;color:var(--gold);margin-bottom:6px;}
805
- .gi-campfire-time{font-family:'Orbitron',monospace;font-size:18px;font-weight:800;line-height:1.15;color:#fff;overflow-wrap:anywhere;}
806
- .gi-campfire-sub{font-family:'Share Tech Mono',monospace;font-size:10px;line-height:1.35;color:var(--text2);margin-top:6px;}
 
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:14px;color:var(--text2);}
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{max-width:720px;margin-top:0;padding-top:0;}
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:92px}}
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 class="opt-action-bar">
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 class="opt-action-bar">')
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(".opt-action-bar{display:grid", html)
1960
- self.assertNotIn(".opt-action-bar{position:sticky", html)
 
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")