Da forma que foi feita, quando o movimento passar de 50% da largura do capsule, vamos chamar a outra tela, porém ficaria legal que o botão se preenchesse até o final, simulado o movimento que o usuário faria se fosse até o fim.
Pra ajustar isso, eu só alterei o if quando o buttonOffset para dos 50% do tamanho do width - 60, mudando o buttonOffset para ser igual a largura do geometry -60 (largura do botão) - buttonHeight, desta forma, ao largar o botão após o 50%, o capsule de preenchimento vai a 100% e ai sim a janela é chamada.
.onEnded({ _ in
if buttonOffset > (geometry.size.width - 60) / 2 {
buttonOffset = geometry.size.width - 60 - buttonHeight
showSecondScreen = true
} else {
withAnimation (.easeInOut(duration: 0.25)) {
buttonOffset = 0
}
}
}))