diff --git a/padelnomics/src/padelnomics/planner/calculator.py b/padelnomics/src/padelnomics/planner/calculator.py index e467ba1..44d2922 100644 --- a/padelnomics/src/padelnomics/planner/calculator.py +++ b/padelnomics/src/padelnomics/planner/calculator.py @@ -19,10 +19,10 @@ DEFAULTS = { "own": "rent", "dblCourts": 4, "sglCourts": 2, - "sqmPerDblHall": 330, - "sqmPerSglHall": 220, - "sqmPerDblOutdoor": 300, - "sqmPerSglOutdoor": 200, + "sqmPerDblHall": 336, + "sqmPerSglHall": 240, + "sqmPerDblOutdoor": 312, + "sqmPerSglOutdoor": 216, "ratePeak": 50, "rateOffPeak": 35, "rateSingle": 30, diff --git a/padelnomics/src/padelnomics/static/css/planner.css b/padelnomics/src/padelnomics/static/css/planner.css index 6d6a521..14494ba 100644 --- a/padelnomics/src/padelnomics/static/css/planner.css +++ b/padelnomics/src/padelnomics/static/css/planner.css @@ -279,6 +279,30 @@ -moz-appearance: textfield; } +/* ── Space reference facts ── */ +.space-facts { + margin-top: 10px; + padding: 10px 12px; + background: var(--card-bg); + border: 1px solid var(--border); + border-radius: 6px; + font-size: 11px; + color: var(--txt-3); +} +.space-facts__title { + font-weight: 600; + color: var(--txt-2); + margin-bottom: 6px; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.04em; +} +.space-facts__item { + display: flex; + justify-content: space-between; + padding: 2px 0; +} + /* ── Toggle buttons ── */ .toggle-group { display: flex; diff --git a/padelnomics/src/padelnomics/static/js/planner.js b/padelnomics/src/padelnomics/static/js/planner.js index c73cce3..af27f61 100644 --- a/padelnomics/src/padelnomics/static/js/planner.js +++ b/padelnomics/src/padelnomics/static/js/planner.js @@ -2,7 +2,7 @@ const S = { venue:'indoor', own:'rent', dblCourts:4, sglCourts:2, - sqmPerDblHall:330, sqmPerSglHall:220, sqmPerDblOutdoor:300, sqmPerSglOutdoor:200, + sqmPerDblHall:336, sqmPerSglHall:240, sqmPerDblOutdoor:312, sqmPerSglOutdoor:216, ratePeak:50, rateOffPeak:35, rateSingle:30, peakPct:40, hoursPerDay:16, daysPerMonthIndoor:29, daysPerMonthOutdoor:25, bookingFee:10, utilTarget:40, @@ -173,12 +173,19 @@ function rebuildSpaceInputs(){ const isIn = S.venue==='indoor'; let h = ''; if(isIn){ - h += slider('sqmPerDblHall','Hall m\u00B2 per Double Court',0,600,10,fN,'Total hall space needed per double court. Includes court (200m\u00B2), safety zones, circulation, and minimum clearances. Standard: 300\u2013350m\u00B2.')+ - slider('sqmPerSglHall','Hall m\u00B2 per Single Court',0,400,10,fN,'Total hall space needed per single court. Includes court (120m\u00B2), safety zones, and access. Standard: 200\u2013250m\u00B2.'); + h += slider('sqmPerDblHall','Hall m\u00B2 per Double Court',200,600,10,fN,'Total hall space needed per double court. Includes court (200m\u00B2), safety zones, circulation, and minimum clearances. Standard: 300\u2013350m\u00B2.')+ + slider('sqmPerSglHall','Hall m\u00B2 per Single Court',120,400,10,fN,'Total hall space needed per single court. Includes court (120m\u00B2), safety zones, and access. Standard: 200\u2013250m\u00B2.'); } else { - h += slider('sqmPerDblOutdoor','Land m\u00B2 per Double Court',0,500,10,fN,'Outdoor land area per double court. Includes court area, drainage slopes, access paths, and buffer zones. Standard: 280\u2013320m\u00B2.')+ - slider('sqmPerSglOutdoor','Land m\u00B2 per Single Court',0,350,10,fN,'Outdoor land area per single court. Includes court, surrounding space, and access paths. Standard: 180\u2013220m\u00B2.'); + h += slider('sqmPerDblOutdoor','Land m\u00B2 per Double Court',200,500,10,fN,'Outdoor land area per double court. Includes court area, drainage slopes, access paths, and buffer zones. Standard: 280\u2013320m\u00B2.')+ + slider('sqmPerSglOutdoor','Land m\u00B2 per Single Court',120,350,10,fN,'Outdoor land area per single court. Includes court, surrounding space, and access paths. Standard: 180\u2013220m\u00B2.'); } + h += '