From 6beed389999cc637d58a47e3796a0d5293152339 Mon Sep 17 00:00:00 2001
From: BigSimmo <87357024+BigSimmo@users.noreply.github.com>
Date: Fri, 24 Jul 2026 15:26:11 +0800
Subject: [PATCH 1/6] Implement mobile touch ergonomics audit recommendations
---
src/app/documents/search/loading.tsx | 2 +-
src/app/globals.css | 10 ++++++++--
src/components/AccessibleTable.tsx | 2 +-
src/components/DocumentTagCloud.tsx | 2 +-
.../calculator-mockups/bedside-sheet-mockup.tsx | 8 ++++----
.../calculator-mockups/calculator-ui.tsx | 2 +-
.../calculator-mockups/directory-grid-mockup.tsx | 2 +-
.../calculator-mockups/popup-sheet-mockup.tsx | 6 +++---
.../calculator-mockups/search-detail-mockup.tsx | 10 +++++-----
src/lib/haptics.ts | 16 ++++++++++++++++
10 files changed, 41 insertions(+), 19 deletions(-)
create mode 100644 src/lib/haptics.ts
diff --git a/src/app/documents/search/loading.tsx b/src/app/documents/search/loading.tsx
index 7a40dd076..bb2b591d2 100644
--- a/src/app/documents/search/loading.tsx
+++ b/src/app/documents/search/loading.tsx
@@ -2,7 +2,7 @@ import { DocumentSearchPageSkeleton } from "@/components/mode-home-page-skeleton
export default function Loading() {
return (
-
+
);
diff --git a/src/app/globals.css b/src/app/globals.css
index 7e560bc47..2ac6e7a5d 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -502,7 +502,8 @@ a,
summary,
input,
textarea,
-select {
+select,
+.touch-card {
outline: none;
touch-action: manipulation;
-webkit-tap-highlight-color: transparent;
@@ -536,7 +537,7 @@ summary {
inline body/citation links down 1px on tap, which reads oddly for text links. */
button:active,
summary:active {
- transform: translateY(1px);
+ transform: scale(0.97);
}
summary::-webkit-details-marker {
@@ -587,6 +588,11 @@ summary::-webkit-details-marker {
background: color-mix(in srgb, var(--surface) 72%, transparent);
}
+ .modal-landscape-container {
+ padding-left: max(1rem, var(--safe-area-left));
+ padding-right: max(1rem, var(--safe-area-right));
+ }
+
.universal-header-mode-button {
border-color: var(--border);
background: var(--surface);
diff --git a/src/components/AccessibleTable.tsx b/src/components/AccessibleTable.tsx
index 912c22c16..40b84e54b 100644
--- a/src/components/AccessibleTable.tsx
+++ b/src/components/AccessibleTable.tsx
@@ -458,7 +458,7 @@ export function AccessibleTable({
portal
testId="table-fullscreen-dialog"
contentClassName="sm:max-w-none"
- bodyClassName="p-3 pb-[max(1rem,env(safe-area-inset-bottom))] sm:p-3"
+ bodyClassName="py-3 pb-[max(1rem,env(safe-area-inset-bottom))] modal-landscape-container sm:p-3"
>
{lowConfidence ? (
diff --git a/src/components/DocumentTagCloud.tsx b/src/components/DocumentTagCloud.tsx
index 2fec24755..b4b69c484 100644
--- a/src/components/DocumentTagCloud.tsx
+++ b/src/components/DocumentTagCloud.tsx
@@ -75,7 +75,7 @@ function DocumentTagChip({
}) {
const Icon = groupIcon[tag.group];
const tagClassName = cn(
- "inline-flex max-w-full items-center gap-1 rounded-md border font-semibold shadow-[var(--shadow-inset)]",
+ "relative inline-flex max-w-full items-center gap-1 rounded-md border font-semibold shadow-[var(--shadow-inset)] before:absolute before:-inset-y-2 before:-inset-x-1 before:content-['']",
compact ? "min-h-6 px-2 text-2xs" : "min-h-7 px-2 text-2xs",
groupToneClass(tag.group),
tag.queryMatched && "ring-2 ring-[color:var(--focus)]/25",
diff --git a/src/components/calculator-mockups/bedside-sheet-mockup.tsx b/src/components/calculator-mockups/bedside-sheet-mockup.tsx
index 9a520f42e..b0c89bd30 100644
--- a/src/components/calculator-mockups/bedside-sheet-mockup.tsx
+++ b/src/components/calculator-mockups/bedside-sheet-mockup.tsx
@@ -87,7 +87,7 @@ function SheetSection({
)}
{derived.flags.length > 0 ? (
@@ -95,7 +95,7 @@ function SheetSection({
) : null}
@@ -170,7 +170,7 @@ export function CalculatorsBedsideSheetMockup() {
{startedCalcs.length ? (
-