From e23be20b13fef05db829b85c8d3699fb99fece25 Mon Sep 17 00:00:00 2001 From: grabowski Date: Fri, 2 Oct 2026 21:33:04 +0200 Subject: [PATCH] Plant operation page: work on phones and tablets held sideways The header no longer forces a 1,600 px layout: it wraps on tablets and narrow desktops (all nine KPIs now fit at 1,600 px, one was clipped before), and on short screens (max-height 560 px, i.e. phones in landscape) it collapses to one row with a scrolling KPI strip. There the detail, event log and legend move into a side sheet (Info button, opens by itself when a station is tapped), so the drawing gets the full height. The drawing pans and zooms by viewBox, so the sim coordinates are untouched: pinch and drag on touch, wheel and drag with a mouse, plus zoom buttons and +/-/0 keys. A drag or pinch never selects the station under the finger. Uses 100dvh and disables iOS landscape text inflation. Upright phones get a hint to turn sideways. Checked in Chrome device emulation at 667x375, 740x360, 844x390, 932x430, 1024x768, 1180x820, 1366x1024, 1258x800, 1600x900, 1920x1080 (no horizontal overflow, zoom controls clear of every station) with real touch input (tap, tab switching, pinch, drag) and a 10x sim run without errors. --- README.md | 4 +- docs/plant-operation.html | 143 ++++++++++++++++++++++++++++++++++---- site/public/index.html | 3 +- 3 files changed, 135 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 0705761..9b8a2e8 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,9 @@ The detail lives in dedicated documents: animating the whole plant as a simulated SCADA overview, from PVC intake and the material lab through extruder, press, trim, optical inspection, finishing, packaging and fulfillment, with the metal path, utilities and - energy alongside; open it in a browser, every station is clickable + energy alongside; open it in a browser, every station is clickable; + on phones and tablets held sideways it pinch-zooms and opens station + details in a side sheet - [Test site](site/README.md): `site/` builds https://cnxvinyl.lol/, the internal test site with demo pages from `docs/` (the plant operation page first) and any static site we want to share by link; Gitea Actions diff --git a/docs/plant-operation.html b/docs/plant-operation.html index 98e1e6f..286df65 100644 --- a/docs/plant-operation.html +++ b/docs/plant-operation.html @@ -12,22 +12,31 @@ } *{box-sizing:border-box;margin:0;padding:0} html,body{height:100%} -body{background:var(--bg);color:var(--fg);font:13px/1.4 -apple-system,"Segoe UI",Roboto,Arial,sans-serif;display:flex;flex-direction:column;height:100vh;overflow:hidden} -header{display:flex;align-items:center;gap:16px;padding:7px 14px;background:var(--panel);border-bottom:1px solid var(--stroke);flex:0 0 auto} +html{-webkit-text-size-adjust:100%;text-size-adjust:100%} +body{background:var(--bg);color:var(--fg);font:13px/1.4 -apple-system,"Segoe UI",Roboto,Arial,sans-serif;display:flex;flex-direction:column;height:100vh;height:100dvh;overflow:hidden} +header{display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:7px 14px;background:var(--panel);border-bottom:1px solid var(--stroke);flex:0 0 auto} header h1{font-size:15px;font-weight:600;letter-spacing:.02em;white-space:nowrap} header h1 span{color:var(--mute);font-weight:400} -.kpis{display:flex;gap:14px;margin-left:auto} -.kpi{display:flex;flex-direction:column;min-width:70px} +.kpis{display:flex;gap:12px;margin-left:auto;min-width:0;max-width:100%;overflow-x:auto;scrollbar-width:none} +.kpis::-webkit-scrollbar{display:none} +.kpi{display:flex;flex-direction:column;min-width:70px;flex:0 0 auto} .kpi b{font:600 15px var(--mono);white-space:nowrap} .kpi small{color:var(--mute);font-size:10px;text-transform:uppercase;letter-spacing:.06em;white-space:nowrap} -.ctl{display:flex;gap:6px;align-items:center;margin-left:16px} +.ctl{display:flex;gap:6px;align-items:center;flex:0 0 auto} button{background:#182238;color:var(--fg);border:1px solid var(--stroke);border-radius:4px;padding:4px 9px;font-size:12px;cursor:pointer;white-space:nowrap} button:hover{background:#1f2c47} button.on{background:#244a7a;border-color:#3b74b8} button.demo{border-color:#5a4a1f;color:#ffd777} -main{flex:1 1 auto;min-height:0;display:flex;align-items:center;justify-content:center;padding:4px 10px} -svg{width:100%;height:100%} -footer{flex:0 0 210px;display:grid;grid-template-columns:1.1fr 1fr 0.9fr;gap:10px;padding:8px 14px 10px;background:var(--panel);border-top:1px solid var(--stroke);min-height:0} +main{flex:1 1 auto;min-height:0;display:flex;align-items:center;justify-content:center;padding:4px 10px;position:relative} +svg{width:100%;height:100%;touch-action:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent} +svg.zoomed{cursor:grab} +svg.dragging{cursor:grabbing} +.mapctl{position:absolute;right:12px;bottom:8px;display:flex;gap:2px;z-index:2} +.mapctl button{background:rgba(24,34,56,.88);min-width:30px} +#btnInfo,footer .tabs{display:none} +#hint{display:none;position:absolute;top:8px;left:50%;transform:translateX(-50%);background:var(--box);border:1px solid var(--stroke);border-radius:6px;padding:6px 10px;color:var(--mute);font-size:12px;white-space:nowrap;z-index:2} +footer .tabs button.close{margin-left:auto;min-width:32px} +footer{flex:0 0 clamp(150px,26vh,210px);display:grid;grid-template-columns:1.1fr 1fr 0.9fr;gap:10px;padding:8px 14px 10px;background:var(--panel);border-top:1px solid var(--stroke);min-height:0} .panel{background:var(--box);border:1px solid var(--stroke);border-radius:6px;padding:8px 12px;overflow:auto;min-height:0} .panel h2{font-size:13px;margin-bottom:4px} .panel h3{font-size:11px;color:var(--mute);text-transform:uppercase;letter-spacing:.06em;margin:6px 0 2px} @@ -45,6 +54,35 @@ footer{flex:0 0 210px;display:grid;grid-template-columns:1.1fr 1fr 0.9fr;gap:10p .legend i.d{border-top-style:dashed} .legend .note{grid-column:1/3;color:var(--mute);margin-top:6px;font-size:10.5px} +/* Short screens (phones held sideways): one-row header with a scrolling KPI + strip, the drawing takes the rest, panels open as a sheet on the right. */ +@media (max-height:560px){ + header{flex-wrap:nowrap;gap:8px;padding:4px 8px} + header h1{font-size:13px} + header h1 span{display:none} + .ctl{gap:4px} + button{padding:4px 7px;font-size:11px;min-height:28px} + .kpis{flex:1 1 0;gap:10px} + .kpi{min-width:56px} + .kpi b{font-size:13px} + .kpi small{font-size:9px} + main{padding:2px 4px} + .mapctl{right:8px;bottom:4px} + body.sheet .mapctl{right:calc(min(420px,55vw) + 8px)} + #btnInfo{display:inline-block} + footer{position:fixed;z-index:5;top:var(--hdrH,37px);right:0;bottom:0;width:min(420px,55vw);display:none;flex-direction:column;gap:6px;padding:6px;border-top:0;border-left:1px solid var(--stroke);box-shadow:-8px 0 24px rgba(0,0,0,.45)} + body.sheet footer{display:flex} + footer .tabs{display:flex;gap:4px;flex:0 0 auto} + footer .panel{display:none;flex:1 1 auto} + body[data-panel=detail] #detail,body[data-panel=log] #logPanel,body[data-panel=legend] #legendPanel{display:block} +} +/* Phones held upright: the plant is too wide, ask for landscape. */ +@media (orientation:portrait) and (max-width:600px){ + #hint{display:block} + header h1{white-space:normal} + .ctl{flex-wrap:wrap} +} + /* SVG */ .mbox{fill:#121a2b;stroke:#2a3a56;stroke-width:1} .machine{cursor:pointer} @@ -111,6 +149,7 @@ footer{flex:0 0 210px;display:grid;grid-template-columns:1.1fr 1fr 0.9fr;gap:10p +
08:00:00sim clock
@@ -132,15 +171,27 @@ footer{flex:0 0 210px;display:grid;grid-template-columns:1.1fr 1fr 0.9fr;gap:10p +
+ + + +
+
Turn the phone sideways for the plant view