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 @@