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
@@ -67,6 +67,19 @@ export const dict: Record<I18nKey, string> = {
"mobile.sessions.confirmRemoveProject": "Excluir",
"mobile.sessions.confirmRemoveProjectAria": "Confirmar remoção de {label}",
"mobile.sessions.toast.projectRemoved": "Removido {label}",
"mobile.sessions.editProjectAria": "Editar {label}",
"mobile.projectEdit.worktreesTitle": "Worktrees",
"mobile.projectEdit.worktreesEmpty": "Este projeto ainda não tem worktrees.",
"mobile.projectEdit.reorderHint": "Arraste para reordenar os worktrees.",
"mobile.projectEdit.dragWorktreeAria": "Arraste {label} para reordenar",
"mobile.projectEdit.deleteWorktreeAria": "Remover worktree {label}",
"mobile.projectEdit.deleteWorktreeTitle": "Remover worktree",
"mobile.projectEdit.deleteWorktreeConfirmButton": "Remover",
"mobile.projectEdit.deleteWorktreeConfirm": "Remover o worktree “{name}”? Isso não pode ser desfeito.",
"mobile.projectEdit.deleteWorktreeDirty": "Este worktree tem alterações não confirmadas que serão perdidas.",
"mobile.projectEdit.deleteWorktreeArchiveNote": "{count} sessão(ões) anexada(s) serão arquivadas.",
"mobile.projectEdit.deleteLocalBranch": "Também excluir o branch local",
"mobile.projectEdit.deleteRemoteBranch": "Também excluir o branch remoto",
"mobile.sessions.showMore": "Mostrar mais {count}",
"mobile.sessions.search.section.sessions": "Sessões",
"mobile.sessions.search.section.archived": "Arquivadas",