From d29a66f9849323b13b776be8d448d4b6175b7fbf Mon Sep 17 00:00:00 2001 From: nmemmert <67961292+nmemmert@users.noreply.github.com> Date: Tue, 6 Oct 2026 13:08:07 -0400 Subject: [PATCH] Make the app work better on iPhone and iPad - Text fields are at least 16px on touch screens (stops iOS zooming on focus) - Chapter swipe ignores sheets, fields, sliders, sideways-scrolling rows and text selection - vh -> dvh for sheets, palette and dialogs - Bigger tap targets for small links, chips and the logo; no double-tap delay - No tap flash or landscape text inflation Co-Authored-By: Claude Sonnet 5.5 --- src/components/CommandPalette.jsx | 4 +- src/components/PresentMode.jsx | 6 +-- src/components/ShortcutsHelp.jsx | 2 +- src/components/plans/PlanDetailSheet.jsx | 2 +- src/components/reader/Sheet.jsx | 2 +- src/components/study/PageShell.jsx | 2 +- src/components/study/SuggestWordsSheet.jsx | 2 +- src/index.css | 45 ++++++++++++++++++++++ src/pages/ReaderPage.jsx | 6 ++- src/pages/SetupPage.jsx | 4 +- src/utils/swipe.js | 12 ++++++ src/utils/swipe.test.js | 26 +++++++++++++ 12 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 src/utils/swipe.js create mode 100644 src/utils/swipe.test.js diff --git a/src/components/CommandPalette.jsx b/src/components/CommandPalette.jsx index 7e5fc43..a1a4015 100644 --- a/src/components/CommandPalette.jsx +++ b/src/components/CommandPalette.jsx @@ -94,7 +94,7 @@ export default function CommandPalette({ onClose }) { if (authUser === null && !authServerDown) return null; // the sign-in screen has nothing to search let lastGroup = null; return ( -
{ if (e.target === e.currentTarget) onClose(); }}> +
{ if (e.target === e.currentTarget) onClose(); }}>
@@ -107,7 +107,7 @@ export default function CommandPalette({ onClose }) { /> esc
-
    +
      {items.length === 0 &&
    • Nothing found. Try a book and chapter, like “romans 8”.
    • } {items.map((item, i) => { const header = item.group !== lastGroup ? item.group : null; diff --git a/src/components/PresentMode.jsx b/src/components/PresentMode.jsx index 6e59a4f..1e2008e 100644 --- a/src/components/PresentMode.jsx +++ b/src/components/PresentMode.jsx @@ -106,14 +106,14 @@ export default function PresentMode({ title, subtitle = '', mode, script = '', t
{mode === 'script' ? ( -
+
{script.trim() - ?
{script} + ?
{script} :

There’s no script to present yet. Write one on the Script page.

}
) : (
-
+
{step ? (

{step.kind ? `${step.kind} · ` : ''}Point {index + 1} of {steps.length}{step.minutes ? ` · ${step.minutes} min` : ''}

diff --git a/src/components/ShortcutsHelp.jsx b/src/components/ShortcutsHelp.jsx index f7f9df2..3037830 100644 --- a/src/components/ShortcutsHelp.jsx +++ b/src/components/ShortcutsHelp.jsx @@ -53,7 +53,7 @@ export default function ShortcutsHelp({ onClose }) { return (
{ if (e.target === e.currentTarget) onClose(); }}> -
+

Keyboard shortcuts

diff --git a/src/components/plans/PlanDetailSheet.jsx b/src/components/plans/PlanDetailSheet.jsx index 010e17c..a2aed2c 100644 --- a/src/components/plans/PlanDetailSheet.jsx +++ b/src/components/plans/PlanDetailSheet.jsx @@ -44,7 +44,7 @@ function ActiveBody({ plan, progress, onClose, actions }) {
)} -
+
{schedule.map((refs, i) => { const done = progress.completedDays.includes(i); return ( diff --git a/src/components/reader/Sheet.jsx b/src/components/reader/Sheet.jsx index e64d76f..8d966fc 100644 --- a/src/components/reader/Sheet.jsx +++ b/src/components/reader/Sheet.jsx @@ -46,7 +46,7 @@ export default function Sheet({ open, onClose, title, label, headerRight, modal aria-modal={modal ? 'true' : undefined} aria-label={typeof title === 'string' ? title : label} tabIndex={-1} - className={`fixed inset-x-0 bottom-0 z-50 flex max-h-[72vh] flex-col rounded-t-2xl focus:outline-none border-t border-[var(--r-line)] bg-[var(--r-bar)] text-[var(--r-text)] font-sans ${ + className={`fixed inset-x-0 bottom-0 z-50 flex max-h-[72dvh] flex-col rounded-t-2xl focus:outline-none border-t border-[var(--r-line)] bg-[var(--r-bar)] text-[var(--r-text)] font-sans ${ pane ? 'lg:inset-x-auto lg:bottom-0 lg:right-0 lg:top-12 lg:max-h-none lg:w-[var(--reader-pane,24rem)] lg:rounded-none lg:border-l lg:border-t-0' : 'sm:left-1/2 sm:right-auto sm:w-[36rem] sm:-translate-x-1/2' }`} > diff --git a/src/components/study/PageShell.jsx b/src/components/study/PageShell.jsx index 39290b0..32b2168 100644 --- a/src/components/study/PageShell.jsx +++ b/src/components/study/PageShell.jsx @@ -70,7 +70,7 @@ export default function PageShell({ title, onBack, actions, active = null, maxWi Skip to content
- diff --git a/src/components/study/SuggestWordsSheet.jsx b/src/components/study/SuggestWordsSheet.jsx index ca10523..fdd13d0 100644 --- a/src/components/study/SuggestWordsSheet.jsx +++ b/src/components/study/SuggestWordsSheet.jsx @@ -16,7 +16,7 @@ export default function SuggestWordsSheet({ wordStudy }) { {n} selected
-
    +
      {suggestModal.words.map((w) => (