feat: add mobile project editor with worktree reorder and delete

Replace the up/down arrows in the mobile project reorder list (drag already
covers reordering) with an edit button that opens a dedicated project editor
surface: rename, pick icon and color, and discover a favicon (no upload).

The editor lists the project's worktrees with drag-to-reorder (persisted per
project, like project order) and a delete button that opens a mobile
confirmation built on the shared worktree primitives — archiving attached
sessions and optionally removing the local/remote branch.
This commit is contained in:
Bohdan Triapitsyn
2026-06-02 16:10:20 +03:00
parent 51682dc7af
commit 79d68ba583
12 changed files with 822 additions and 34 deletions
+13
View File
@@ -67,6 +67,19 @@ export const dict: Record<I18nKey, string> = {
"mobile.sessions.confirmRemoveProject": "Eliminar",
"mobile.sessions.confirmRemoveProjectAria": "Confirmar eliminación de {label}",
"mobile.sessions.toast.projectRemoved": "Se eliminó {label}",
"mobile.sessions.editProjectAria": "Editar {label}",
"mobile.projectEdit.worktreesTitle": "Worktrees",
"mobile.projectEdit.worktreesEmpty": "Este proyecto aún no tiene worktrees.",
"mobile.projectEdit.reorderHint": "Arrastra para reordenar los worktrees.",
"mobile.projectEdit.dragWorktreeAria": "Arrastra {label} para reordenar",
"mobile.projectEdit.deleteWorktreeAria": "Eliminar worktree {label}",
"mobile.projectEdit.deleteWorktreeTitle": "Eliminar worktree",
"mobile.projectEdit.deleteWorktreeConfirmButton": "Eliminar",
"mobile.projectEdit.deleteWorktreeConfirm": "¿Eliminar el worktree «{name}»? No se puede deshacer.",
"mobile.projectEdit.deleteWorktreeDirty": "Este worktree tiene cambios sin confirmar que se perderán.",
"mobile.projectEdit.deleteWorktreeArchiveNote": "Se archivarán {count} sesión(es) adjunta(s).",
"mobile.projectEdit.deleteLocalBranch": "Eliminar también la rama local",
"mobile.projectEdit.deleteRemoteBranch": "Eliminar también la rama remota",
"mobile.sessions.showMore": "Mostrar {count} más",
"mobile.sessions.search.section.sessions": "Sesiones",
"mobile.sessions.search.section.archived": "Archivadas",