From c252119cdbc48792503f1694666df7df3e0fac0d Mon Sep 17 00:00:00 2001 From: "codexbot.disnetdev.com (did:plc:hbonvqr5ysrscg5wdyb5klie)" Date: Fri, 31 Jul 2026 18:08:29 +0000 Subject: [PATCH] Improve mobile rail and touch inputs Co-Authored-By: codexbot.disnetdev.com (did:plc:hbonvqr5ysrscg5wdyb5klie) --- DESIGN.md | 5 ++-- packages/ui/src/app.css | 11 +++++++-- packages/ui/src/lib/components/PaneBar.svelte | 8 ++++++- packages/ui/src/lib/components/Rail.svelte | 2 +- packages/ui/src/lib/keys.test.ts | 14 +++++++++++ packages/ui/src/lib/keys.ts | 4 ++++ packages/ui/src/routes/+layout.svelte | 24 ++++++++++++++++++- 7 files changed, 61 insertions(+), 7 deletions(-) diff --git a/DESIGN.md b/DESIGN.md index 437be60..1f2d0ed 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -300,9 +300,10 @@ margins, so a hover fill bleeds past the text without moving it. Section heads t below. **Responsive.** At **860px** the rail becomes an overlay drawer over a full-bleed pane (a hamburger in the -bar, a scrim behind, a 300ms slide) at its own fixed width with no grip — a drawer over the pane is not a +bar, an interactive dismiss scrim behind, a 300ms slide) at its own fixed width with no grip — a drawer over the pane is not a column beside it, so there is no edge between two things to drag — `?frame` gives up, and gutters tighten -to 16px. At **560px** the +to 16px. On touch-primary devices, typed controls have a 16px font-size floor so focusing them does not +trigger Safari's viewport zoom. At **560px** the sheet sheds what it can afford to lose, in a fixed order: a unit row's summary, the breadcrumb's tail, the fixture chip, an actor's disc on a goal row, the second badge in a tail, and every badge's long form for its short one. A System row is the exception — its title is the record's identity, so the summary stays diff --git a/packages/ui/src/app.css b/packages/ui/src/app.css index d57beab..8b65170 100644 --- a/packages/ui/src/app.css +++ b/packages/ui/src/app.css @@ -1105,6 +1105,7 @@ select.sl { resize: none; cursor: pointer; padding-right: 8px; } .toast[hidden] { display: block; opacity: 0; transform: translateX(-50%) translateY(10px); } .railtoggle { display: none; } +.rail-scrim { display: none; } /* ─── responsive ─────────────────────────────────────────────────────────── */ @media (max-width: 860px) { @@ -1125,8 +1126,8 @@ select.sl { resize: none; cursor: pointer; padding-right: 8px; } the rail takes its own width here and the grip goes away rather than resizing an overlay. */ .rail-resize { display: none; } .app.rail-open .rail { transform: none; } - .app.rail-open::after { - content: ""; position: absolute; inset: 0; z-index: 29; + .rail-scrim { + display: block; position: absolute; inset: 0; z-index: 29; border: 0; padding: 0; background: oklch(0.2 0.03 262 / 0.28); } .railtoggle { display: grid; } @@ -1140,6 +1141,12 @@ select.sl { resize: none; cursor: pointer; padding-right: 8px; } .plus { right: 18px; bottom: 18px; } .menu { right: 18px; bottom: 74px; width: min(306px, calc(100vw - 36px)); } } + +/* iOS Safari zooms the page when a focused control is under 16px. On a touch-primary + device every typed control meets that floor; nothing else changes. */ +@media (hover: none) and (pointer: coarse) { + textarea.ta, input.ti, select.sl, .find input, .field input { font-size: 16px; } +} @media (max-width: 560px) { .row .sub { display: none; } .crumb .full { display: none; } diff --git a/packages/ui/src/lib/components/PaneBar.svelte b/packages/ui/src/lib/components/PaneBar.svelte index 4f37d82..469b7c2 100644 --- a/packages/ui/src/lib/components/PaneBar.svelte +++ b/packages/ui/src/lib/components/PaneBar.svelte @@ -31,7 +31,13 @@
- + {/if} -- 2.51.2