Folders one level at a time on a phone, and targets a thumb can hit

Three things the mobile interface got wrong, all of them measurable.

The folder tree spent its width on depth. Four levels down, the 16px
indent steps and the 18px twisty left a folder 85px of a 300px drawer to
print its name in, and the twisty had walked far enough right that
hitting it was luck -- a miss landed on the row, which is a link, so the
wrong tap also cost a navigation. Under 768px the tree is now a
drill-down: one level at a time, no indent, a back row above it, and a
chevron at the right edge that is the same size in the same place on
every row. Tapping the row still opens the folder; only the chevron
changes what the list shows. The tree is untouched above 768px, where a
wide sidebar can afford the indent and where dragging a folder onto
another folder -- still the only way to reparent one -- needs both of
them on screen at once.

Every control in the top bar was under the 44px a fingertip covers: the
icons at 36, the search filter at 30, the row menu at 24, and the
hamburger 6px from the bezel in the corner a thumb is worst at. They
keep the size they draw at and gain a transparent hit area, since
growing the boxes would reflow a bar with no room to give; rows grow for
real, because a 44px target inside a 36px row reaches into its
neighbours. The one exception is the row menu, held to 36px wide: at a
full 44 it overlapped the drill chevron by 4px, so its right edge
silently drilled instead.

Pinch was dead on the message list. `.msg-row` sets `touch-action:
pan-y` to feed the swipe gesture the horizontal movement the browser is
not using -- but naming any value drops every gesture not named, zoom
included. It worked on an open message and died on the list, which reads
as the zoom being broken at random rather than as a rule about rows.
`pan-y pinch-zoom` keeps the swipe and gives the zoom back.
This commit is contained in:
2026-08-31 21:47:30 -07:00
parent 100f07b580
commit 6c958b8609
12 changed files with 295 additions and 21 deletions
+1
View File
@@ -229,6 +229,7 @@ export const catalog: Catalog = {
"Folder options": "Ordneroptionen",
"New folder": "Neuer Ordner",
"New subfolder": "Neuer Unterordner",
"Open subfolders of {name}": "Unterordner von {name} öffnen",
"Delete folder": "Ordner löschen",
"No matching folders": "Keine passenden Ordner",
"No subfolders here.": "Hier gibt es keine Unterordner.",
+1
View File
@@ -221,6 +221,7 @@ export const catalog: Catalog = {
"Folder options": "Opciones de la carpeta",
"New folder": "Carpeta nueva",
"New subfolder": "Subcarpeta nueva",
"Open subfolders of {name}": "Abrir las subcarpetas de {name}",
"Delete folder": "Eliminar la carpeta",
"No matching folders": "Ninguna carpeta coincide",
"No subfolders here.": "Aquí no hay subcarpetas.",
+1
View File
@@ -226,6 +226,7 @@ export const catalog: Catalog = {
"Folder options": "Options du dossier",
"New folder": "Nouveau dossier",
"New subfolder": "Nouveau sous-dossier",
"Open subfolders of {name}": "Ouvrir les sous-dossiers de {name}",
"Delete folder": "Supprimer le dossier",
"No matching folders": "Aucun dossier correspondant",
"No subfolders here.": "Aucun sous-dossier ici.",
+1
View File
@@ -220,6 +220,7 @@ export const catalog: Catalog = {
"Folder options": "フォルダーのオプション",
"New folder": "新しいフォルダー",
"New subfolder": "新しいサブフォルダー",
"Open subfolders of {name}": "{name} のサブフォルダーを開く",
"Delete folder": "フォルダーを削除",
"No matching folders": "該当するフォルダーはありません",
"No subfolders here.": "サブフォルダーはありません。",
+1
View File
@@ -217,6 +217,7 @@ export const catalog: Catalog = {
"Folder options": "Mapopties",
"New folder": "Nieuwe map",
"New subfolder": "Nieuwe submap",
"Open subfolders of {name}": "Submappen van {name} openen",
"Delete folder": "Map verwijderen",
"No matching folders": "Geen overeenkomende mappen",
"No subfolders here.": "Hier zijn geen submappen.",
+1
View File
@@ -224,6 +224,7 @@ export const catalog: Catalog = {
"Folder options": "Opções da pasta",
"New folder": "Nova pasta",
"New subfolder": "Nova subpasta",
"Open subfolders of {name}": "Abrir as subpastas de {name}",
"Delete folder": "Excluir a pasta",
"No matching folders": "Nenhuma pasta corresponde",
"No subfolders here.": "Não há subpastas aqui.",
+1
View File
@@ -223,6 +223,7 @@ export const catalog: Catalog = {
"Folder options": "Параметры папки",
"New folder": "Новая папка",
"New subfolder": "Новая вложенная папка",
"Open subfolders of {name}": "Открыть вложенные папки «{name}»",
"Delete folder": "Удалить папку",
"No matching folders": "Подходящих папок нет",
"No subfolders here.": "Здесь нет вложенных папок.",
+1
View File
@@ -217,6 +217,7 @@ export const catalog: Catalog = {
"Folder options": "Параметри теки",
"New folder": "Нова тека",
"New subfolder": "Нова вкладена тека",
"Open subfolders of {name}": "Відкрити вкладені теки «{name}»",
"Delete folder": "Видалити теку",
"No matching folders": "Відповідних тек немає",
"No subfolders here.": "Тут немає вкладених тек.",
+1
View File
@@ -219,6 +219,7 @@ export const catalog: Catalog = {
"Folder options": "文件夹选项",
"New folder": "新建文件夹",
"New subfolder": "新建子文件夹",
"Open subfolders of {name}": "打开{name}的子文件夹",
"Delete folder": "删除文件夹",
"No matching folders": "没有匹配的文件夹",
"No subfolders here.": "这里没有子文件夹。",