From e79642e792e914f1ea004e45f50e78979cca9ecb Mon Sep 17 00:00:00 2001 From: Filipe Moreira <108258235+lippdev@users.noreply.github.com> Date: Mon, 19 Oct 2026 21:08:32 +0200 Subject: [PATCH 1/2] feat: console-style redesign of the Console interface Home is now a row of launcher tiles over the game art with one pill Play button; the tabs move to the left of the top bar; the System tab becomes a category rail with only that category's options on the right. Shared console styles drop the hairlines and use rounder corners. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.en-US.md | 1 + CHANGELOG.md | 1 + docs/GUIDE.md | 4 + docs/GUIDE.pt-BR.md | 4 + docs/TESTING.md | 31 + src/ConsoleMode/App.xaml | 55 +- src/ConsoleMode/Services/LaunchArt.cs | 21 + .../ViewModels/MainViewModel.ConsoleTabs.cs | 11 +- .../ViewModels/MainViewModel.LaunchTiles.cs | 76 ++ src/ConsoleMode/ViewModels/MainViewModel.cs | 3 + src/ConsoleMode/Views/ConsoleHomeView.xaml | 723 +++++++++--------- src/ConsoleMode/Views/ConsoleHomeView.xaml.cs | 84 +- .../ConsoleMode.Tests.csproj | 1 + tests/ConsoleMode.Tests/LaunchArtTests.cs | 33 + 14 files changed, 671 insertions(+), 377 deletions(-) create mode 100644 src/ConsoleMode/Services/LaunchArt.cs create mode 100644 src/ConsoleMode/ViewModels/MainViewModel.LaunchTiles.cs create mode 100644 tests/ConsoleMode.Tests/LaunchArtTests.cs diff --git a/CHANGELOG.en-US.md b/CHANGELOG.en-US.md index 876a6d8..3fa52c0 100644 --- a/CHANGELOG.en-US.md +++ b/CHANGELOG.en-US.md @@ -4,6 +4,7 @@ English (US) release notes, mirroring CHANGELOG.md (Brazilian Portuguese). Befor ## [Unreleased] ### What's new +- A Console interface that looks like a home console: Home shows your launchers in a row at the top, over your games' art (A picks what opens, a pill-shaped Play now right below, with the screen, audio, resolution and HDR on one line), the tabs sit on the left, and the System tab is now a list of categories on the left with only that category's options on the right. Tiles without hairlines, rounder corners and less repetition: the setup summary left Home (it is in Session). (#PR) - Update notice in Portuguese: the new version's highlight shows in the app's language when there is a changelog in it (today, Portuguese); other languages still see it in English. Applies to updates published after this version. (#158) ## [1.6.2] diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b87ab8..bdee1b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Notas em português do Brasil; a versão em inglês (Estados Unidos) fica em `CH ## [Unreleased] ### Novidades +- Interface Console com cara de console de mesa: o Início mostra os iniciadores numa fileira no topo, sobre a arte dos seus jogos (A escolhe o que abre, Jogar agora em formato de pílula logo abaixo, com a tela, o áudio, a resolução e o HDR numa linha só), as abas ficam à esquerda e a aba Sistema virou uma lista de categorias à esquerda com só as opções daquela categoria à direita. Blocos sem borda fina, cantos mais arredondados e menos repetição: o resumo do setup saiu do Início (está na Sessão). (#PR) - Aviso de atualização em português: o destaque da nova versão aparece no idioma do app quando há um changelog nele (hoje, português); os outros idiomas continuam vendo o destaque em inglês. Vale a partir das atualizações publicadas depois desta versão. (#158) ## [1.6.2] diff --git a/docs/GUIDE.md b/docs/GUIDE.md index 3c90877..d4f8411 100644 --- a/docs/GUIDE.md +++ b/docs/GUIDE.md @@ -18,6 +18,10 @@ The session menu has two ways out. **Back to the PC** ends the session and puts ## Settings in Console mode +**Home** puts your launchers in a row at the top (Steam Big Picture, Playnite, Xbox mode): **A** on one picks what opens, and **Play now** below starts it. The line under the name says where you will play and what changes (audio, resolution, FPS, HDR, VRR); the round button next to Play now opens **Session**, with the screens and quick settings. + +The **System** tab lists its categories on the left (Gaming display, When entering console mode, Controller, TV, Optional extras, App, Shortcut, help, and data, More apps from the developer). Moving over a category shows its options on the right; **A** or right goes into them, and **B** or left goes back to the categories. + In **System → Controller**, choose the button layout: **Automatic**, **Xbox** or **PlayStation**. The preview and shortcut labels follow the choice, which is saved when you close the app. This changes the displayed symbols; the controller's inputs keep their existing mapping. The **System** tab provides the same settings as desktop mode, including controller shortcuts, Playnite, Android TV, custom FPS and the data folder. Both interfaces share the saved values, which remain after restarting the app. diff --git a/docs/GUIDE.pt-BR.md b/docs/GUIDE.pt-BR.md index be757ae..ecb946e 100644 --- a/docs/GUIDE.pt-BR.md +++ b/docs/GUIDE.pt-BR.md @@ -18,6 +18,10 @@ No menu da sessão há duas saídas. **Voltar ao PC** encerra a sessão e devolv ## Configurações no modo Console +O **Início** mostra os seus iniciadores numa fileira no topo (Steam Big Picture, Playnite, modo Xbox): **A** num deles escolhe o que abre, e **Jogar agora** logo abaixo começa. A linha embaixo do nome diz onde você vai jogar e o que muda (áudio, resolução, FPS, HDR, VRR); o botão redondo ao lado de Jogar agora abre a **Sessão**, com as telas e os ajustes rápidos. + +A aba **Sistema** lista as categorias à esquerda (Tela de jogo, Ao entrar no modo console, Controle, TV, Extras opcionais, App, Atalho, ajuda e dados, Outros apps do desenvolvedor). Passar por uma categoria mostra as opções dela à direita; **A** ou a direita entra nelas, e **B** ou a esquerda volta para as categorias. + Em **Sistema → Controle**, escolha o layout dos botões: **Automático**, **Xbox** ou **PlayStation**. A prévia e os nomes dos atalhos acompanham a escolha, que fica salva ao fechar o app. Isso muda os símbolos exibidos; as entradas do controle mantêm o mapeamento existente. A aba **Sistema** oferece os mesmos ajustes do modo PC, incluindo os atalhos do controle, Playnite, Android TV, FPS personalizado e pasta de dados. Os valores são compartilhados entre as duas interfaces e permanecem salvos ao reabrir o app. diff --git a/docs/TESTING.md b/docs/TESTING.md index 0a5dfdb..d379e85 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -469,3 +469,34 @@ Pré-requisito: RivaTuner Statistics Server instalado, com "Show On-Screen Displ - [ ] Interface Console → Sistema: a linha "Minimizar para a bandeja" alterna Ligado/Desligado e o modo PC mostra o mesmo valor; o valor fica salvo ao reabrir o app. - [ ] Com a sessão ativa e a opção ligada, minimizar e reabrir pela bandeja continua funcionando; o atalho do controle para abrir o app também traz a janela de volta. - [ ] Fechar no X (sem sessão ativa) continua fechando o app, com a opção ligada ou desligada. + +## Interface Console no estilo console (1.7.0) + +### Início +- [ ] Os iniciadores aparecem numa fileira no topo (Steam Big Picture, Playnite se instalado, modo Xbox), cada um com sua cor e ícone; o que abre hoje tem um ponto verde em cima. +- [ ] Com o controle, subir do Jogar agora chega na fileira; o bloco focado cresce e ganha o contorno branco, sem cortar nos vizinhos nem no topo. +- [ ] A num iniciador muda o ponto para ele, o título grande embaixo passa a ser o nome dele e a escolha aparece igual em Sistema → Ao entrar no modo console → Abrir e no modo PC. +- [ ] A linha embaixo do título mostra a resolução da tela de jogo e depois áudio, FPS, HDR e VRR quando ligados, separados por "·", e atualiza ao mudar cada um. +- [ ] Sem tela de jogo escolhida, o texto pede para escolher a tela e Jogar agora fica desativado. +- [ ] O botão redondo ao lado de Jogar agora abre a aba Sessão. +- [ ] Com capas da Steam como fundo, as capas aparecem mais à direita e o lado esquerdo e a parte de baixo ficam escuros; o texto continua legível. Com imagem própria e sem fundo também. +- [ ] Nomes longos (alemão, russo) não estouram: o título corta com reticências numa linha. + +### Barra do topo e dicas +- [ ] As abas ficam à esquerda, ao lado do ícone, com LB/RB (L1/R1) em volta; o relógio continua à direita. +- [ ] A barra de dicas embaixo não mostra mais LB/RB "Abas"; as outras dicas continuam. + +### Sistema +- [ ] Ao abrir a aba, o foco fica na categoria em uso, com a barrinha verde ao lado e o nome aceso; as outras categorias ficam apagadas. +- [ ] Descer e subir pelas categorias troca as opções da direita na hora, e a lista volta para o topo. +- [ ] A ou direita entra na primeira opção; esquerda ou B volta para a categoria certa (a da barrinha, não a que estiver na mesma altura). +- [ ] Abrir uma escolha (por exemplo Idioma, em App) e voltar com B ou escolhendo: o foco volta para a mesma linha. +- [ ] Atalhos (Controle): abrir o editor e voltar devolve o foco para a linha do atalho. +- [ ] Teste do controle (Atalho, ajuda e dados): ao fechar, o foco volta para a linha. +- [ ] Fundo, imagem do fundo e sons da interface ficam em App; Fechar a Steam ao voltar ao PC fica em Ao entrar no modo console. +- [ ] Campos de texto da TV e do FPS personalizado continuam aceitando digitação e as setas movem o cursor neles. + +### Visual geral +- [ ] Blocos e linhas sem borda fina, cantos mais arredondados, Jogar agora em formato de pílula; o contorno branco do foco aparece em tudo, inclusive no menu da sessão. +- [ ] Ajustes rápidos da Sessão aparecem como quadrados do mesmo tamanho, com o texto do valor inteiro (ou em duas linhas). +- [ ] Alto contraste do Windows: textos e foco continuam visíveis. diff --git a/src/ConsoleMode/App.xaml b/src/ConsoleMode/App.xaml index 6c7af0a..380da49 100644 --- a/src/ConsoleMode/App.xaml +++ b/src/ConsoleMode/App.xaml @@ -77,38 +77,40 @@ - + - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + @@ -714,7 +745,7 @@ - + @@ -741,7 +772,7 @@ - + @@ -782,7 +813,7 @@ - + - + @@ -823,7 +854,7 @@ - + diff --git a/src/ConsoleMode/Views/ConsoleHomeView.xaml.cs b/src/ConsoleMode/Views/ConsoleHomeView.xaml.cs index 651b0d1..80124be 100644 --- a/src/ConsoleMode/Views/ConsoleHomeView.xaml.cs +++ b/src/ConsoleMode/Views/ConsoleHomeView.xaml.cs @@ -19,6 +19,8 @@ public sealed partial class ConsoleHomeView : UserControl private bool _windowActive = true; private Microsoft.UI.Dispatching.DispatcherQueueTimer? _clock; private static Style? _cardStyle; + private static Style? _launchTileStyle; + private Control? _lastSettingsRow; private int _shownTab; private static readonly Windows.UI.ViewManagement.UISettings Ui = new(); @@ -36,6 +38,9 @@ public ConsoleHomeView() // The focused card grows a little, like the Xbox home. Root.GotFocus += (_, e) => ScaleTile(e.OriginalSource, 1.07f); Root.LostFocus += (_, e) => ScaleTile(e.OriginalSource, 1f); + // System tab: remember the option in use, so closing a picker lands back on it. + SettingsRows.GotFocus += (_, e) => { if (e.OriginalSource is Control row) _lastSettingsRow = row; }; + CategoryRail.GettingFocus += OnRailGettingFocus; // Mouse clicks on buttons sound like a confirm (the pad has its own sounds in the navigator). Root.AddHandler(UIElement.PointerPressedEvent, new PointerEventHandler(OnPointerPressed), true); ViewModel.PropertyChanged += OnViewModelChanged; @@ -133,7 +138,7 @@ private void OnViewModelChanged(object? sender, PropertyChangedEventArgs e) DispatcherQueue.TryEnqueue(() => { if (ViewModel.IsPickerOpen) FocusPickerSelection(); - else if (ViewModel.IsConsoleSettingsOpen) FirstSettingsRow.Focus(FocusState.Keyboard); + else if (ViewModel.IsConsoleSettingsOpen) FocusSystemRow(); else FocusDefault(); }); break; @@ -141,7 +146,7 @@ private void OnViewModelChanged(object? sender, PropertyChangedEventArgs e) DispatcherQueue.TryEnqueue(() => { if (ViewModel.IsControllerTestOpen) CopyDiagnosticsButton.Focus(FocusState.Keyboard); - else if (ViewModel.IsConsoleSettingsOpen) FirstSettingsRow.Focus(FocusState.Keyboard); + else if (ViewModel.IsConsoleSettingsOpen) FocusSystemRow(); else FocusDefault(); }); break; @@ -184,7 +189,7 @@ private void OnViewModelChanged(object? sender, PropertyChangedEventArgs e) case nameof(MainViewModel.IsConsoleSettingsOpen): DispatcherQueue.TryEnqueue(() => { - if (ViewModel.IsConsoleSettingsOpen) FirstSettingsRow.Focus(FocusState.Keyboard); + if (ViewModel.IsConsoleSettingsOpen) FocusSystemCategory(); else FocusDefault(); }); break; @@ -211,7 +216,7 @@ private void FocusDefault() if (ViewModel.IsUpdateOpen) { UpdateNowButton.Focus(FocusState.Keyboard); return; } if (ViewModel.IsConsoleTutorialOpen) { ConsoleTutorialNextButton.Focus(FocusState.Keyboard); return; } if (ViewModel.IsShortcutEditorOpen) { FocusShortcutEditorTarget(); return; } - if (ViewModel.IsSystemTab) { FirstSettingsRow.Focus(FocusState.Keyboard); return; } + if (ViewModel.IsSystemTab) { FocusSystemCategory(); return; } if (ViewModel.IsSessionTab) { (FocusManager.FindFirstFocusableElement(ScreenCards) as Control)?.Focus(FocusState.Keyboard); return; } if (ViewModel.CanStart) { PlayButton.Focus(FocusState.Keyboard); return; } (FocusManager.FindFirstFocusableElement(ScreenCards) as Control)?.Focus(FocusState.Keyboard); @@ -291,6 +296,7 @@ private void GoBack() else if (ViewModel.IsShortcutEditorOpen) ViewModel.CloseShortcutEditorCommand.Execute(null); else if (ViewModel.IsConsoleTutorialOpen) ViewModel.EndTourCommand.Execute(null); else if (ViewModel.IsRolePanelOpen) ViewModel.CloseRolePanelCommand.Execute(null); + else if (ViewModel.IsSystemTab && IsFocusInside(SettingsRows)) FocusSystemCategory(); else if (!ViewModel.IsHomeTab) ViewModel.SelectConsoleTabCommand.Execute("0"); else if (ViewModel.IsUpdateOpen && !ViewModel.IsUpdating) ViewModel.DismissUpdateCommand.Execute(null); } @@ -317,12 +323,72 @@ private void FocusShortcutEditorRow() "home" => HomeShortcutRow, "menu" => MenuShortcutRow, "exit" => ExitShortcutRow, - _ => FirstSettingsRow + _ => null }; - if (ViewModel.IsConsoleUi && ViewModel.IsSystemTab && row.Focus(FocusState.Keyboard)) return; + if (ViewModel.IsConsoleUi && ViewModel.IsSystemTab && row?.Focus(FocusState.Keyboard) == true) return; FocusDefault(); } + private Button CategoryButton(int index) => (Button)CategoryRail.Children[Math.Clamp(index, 0, CategoryRail.Children.Count - 1)]; + + private StackPanel SystemSection(int index) => index switch + { + 0 => SystemSection0, + 1 => SystemSection1, + 2 => SystemSection2, + 3 => SystemSection3, + 4 => SystemSection4, + 5 => SystemSection5, + 6 => SystemSection6, + _ => SystemSection7 + }; + + private void FocusSystemCategory() => CategoryButton(ViewModel.SystemCategory).Focus(FocusState.Keyboard); + + /// Back to the option that was in use, else the first one of the category, else the category itself. + private void FocusSystemRow() + { + if (_lastSettingsRow?.Focus(FocusState.Keyboard) == true) return; + var section = SystemSection(ViewModel.SystemCategory); + section.UpdateLayout(); + if ((FocusManager.FindFirstFocusableElement(section) as Control)?.Focus(FocusState.Keyboard) == true) return; + FocusSystemCategory(); + } + + /// Moving over a category shows its options, like a console's settings. + private void OnCategoryFocused(object sender, RoutedEventArgs e) + { + if (sender is not FrameworkElement { Tag: string tag } || !int.TryParse(tag, out var index) || index == ViewModel.SystemCategory) return; + ViewModel.SystemCategory = index; + _lastSettingsRow = null; + SettingsRows.ChangeView(null, 0, null, true); + } + + /// A on a category goes into its options. + private void OnCategoryClick(object sender, RoutedEventArgs e) + { + _lastSettingsRow = null; + FocusSystemRow(); + } + + /// Coming back from the options (left), land on the category they belong to, not the nearest one. + private void OnRailGettingFocus(UIElement sender, GettingFocusEventArgs args) + { + var current = CategoryButton(ViewModel.SystemCategory); + if (args.OldFocusedElement is DependencyObject old && IsInside(old, SettingsRows) && !ReferenceEquals(args.NewFocusedElement, current)) + args.TrySetNewFocusedElement(current); + } + + private bool IsFocusInside(DependencyObject container) => + Root.XamlRoot is { } root && FocusManager.GetFocusedElement(root) is DependencyObject focused && IsInside(focused, container); + + private static bool IsInside(DependencyObject node, DependencyObject container) + { + for (var current = node; current is not null; current = Microsoft.UI.Xaml.Media.VisualTreeHelper.GetParent(current)) + if (ReferenceEquals(current, container)) return true; + return false; + } + private void StartClock() { _clock ??= DispatcherQueue.CreateTimer(); @@ -336,12 +402,14 @@ private void StartClock() private void OnClockTick(Microsoft.UI.Dispatching.DispatcherQueueTimer sender, object args) => ClockText.Text = DateTime.Now.ToString("HH:mm"); - /// Cards (not settings rows) grow when focused and shrink back when it leaves. + /// Cards (not settings rows) grow when focused and shrink back when it leaves; the launchers grow more. private static void ScaleTile(object source, float scale) { if (source is not Button button) return; _cardStyle ??= Application.Current.Resources["ConsoleCard"] as Style; - if (!ReferenceEquals(button.Style, _cardStyle)) return; + _launchTileStyle ??= Application.Current.Resources["LaunchTileButton"] as Style; + if (ReferenceEquals(button.Style, _launchTileStyle)) scale = scale > 1f ? 1.14f : 1f; + else if (!ReferenceEquals(button.Style, _cardStyle)) return; button.CenterPoint = new Vector3((float)button.ActualWidth / 2, (float)button.ActualHeight / 2, 0); button.ScaleTransition ??= new Vector3Transition { Duration = TimeSpan.FromMilliseconds(140) }; button.Scale = new Vector3(scale, scale, 1); diff --git a/tests/ConsoleMode.Tests/ConsoleMode.Tests.csproj b/tests/ConsoleMode.Tests/ConsoleMode.Tests.csproj index 30b9532..503fc83 100644 --- a/tests/ConsoleMode.Tests/ConsoleMode.Tests.csproj +++ b/tests/ConsoleMode.Tests/ConsoleMode.Tests.csproj @@ -45,6 +45,7 @@ + diff --git a/tests/ConsoleMode.Tests/LaunchArtTests.cs b/tests/ConsoleMode.Tests/LaunchArtTests.cs new file mode 100644 index 0000000..8f532be --- /dev/null +++ b/tests/ConsoleMode.Tests/LaunchArtTests.cs @@ -0,0 +1,33 @@ +using ConsoleMode.Services; + +namespace ConsoleMode.Tests; + +public sealed class LaunchArtTests +{ + [Theory] + [InlineData("bigPicture")] + [InlineData("playnite")] + [InlineData("xboxMode")] + [InlineData("customApp")] + public void Every_launcher_has_its_own_tile(string mode) + { + var art = LaunchArt.For(mode); + Assert.NotEqual(LaunchArt.Neutral, art); + Assert.False(string.IsNullOrEmpty(art.Glyph)); + Assert.Equal(0xFFu, art.From >> 24); // opaque, so the art behind doesn't show through the tile + Assert.Equal(0xFFu, art.To >> 24); + } + + [Fact] + public void Launchers_look_different_from_each_other() + { + var tiles = new[] { "bigPicture", "playnite", "xboxMode", "customApp" }.Select(LaunchArt.For).ToList(); + Assert.Equal(tiles.Count, tiles.Select(t => t.From).Distinct().Count()); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData("somethingNew")] + public void Unknown_modes_get_the_neutral_tile(string? mode) => Assert.Equal(LaunchArt.Neutral, LaunchArt.For(mode)); +} From a6be52e48b697ea5a02db0980751f3ef93554ded Mon Sep 17 00:00:00 2001 From: Filipe Moreira <108258235+lippdev@users.noreply.github.com> Date: Mon, 19 Oct 2026 21:08:52 +0200 Subject: [PATCH 2/2] docs: changelog PR number for the console redesign Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.en-US.md | 2 +- CHANGELOG.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.en-US.md b/CHANGELOG.en-US.md index 3fa52c0..653f018 100644 --- a/CHANGELOG.en-US.md +++ b/CHANGELOG.en-US.md @@ -4,7 +4,7 @@ English (US) release notes, mirroring CHANGELOG.md (Brazilian Portuguese). Befor ## [Unreleased] ### What's new -- A Console interface that looks like a home console: Home shows your launchers in a row at the top, over your games' art (A picks what opens, a pill-shaped Play now right below, with the screen, audio, resolution and HDR on one line), the tabs sit on the left, and the System tab is now a list of categories on the left with only that category's options on the right. Tiles without hairlines, rounder corners and less repetition: the setup summary left Home (it is in Session). (#PR) +- A Console interface that looks like a home console: Home shows your launchers in a row at the top, over your games' art (A picks what opens, a pill-shaped Play now right below, with the screen, audio, resolution and HDR on one line), the tabs sit on the left, and the System tab is now a list of categories on the left with only that category's options on the right. Tiles without hairlines, rounder corners and less repetition: the setup summary left Home (it is in Session). (#162) - Update notice in Portuguese: the new version's highlight shows in the app's language when there is a changelog in it (today, Portuguese); other languages still see it in English. Applies to updates published after this version. (#158) ## [1.6.2] diff --git a/CHANGELOG.md b/CHANGELOG.md index bdee1b5..0011349 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Notas em português do Brasil; a versão em inglês (Estados Unidos) fica em `CH ## [Unreleased] ### Novidades -- Interface Console com cara de console de mesa: o Início mostra os iniciadores numa fileira no topo, sobre a arte dos seus jogos (A escolhe o que abre, Jogar agora em formato de pílula logo abaixo, com a tela, o áudio, a resolução e o HDR numa linha só), as abas ficam à esquerda e a aba Sistema virou uma lista de categorias à esquerda com só as opções daquela categoria à direita. Blocos sem borda fina, cantos mais arredondados e menos repetição: o resumo do setup saiu do Início (está na Sessão). (#PR) +- Interface Console com cara de console de mesa: o Início mostra os iniciadores numa fileira no topo, sobre a arte dos seus jogos (A escolhe o que abre, Jogar agora em formato de pílula logo abaixo, com a tela, o áudio, a resolução e o HDR numa linha só), as abas ficam à esquerda e a aba Sistema virou uma lista de categorias à esquerda com só as opções daquela categoria à direita. Blocos sem borda fina, cantos mais arredondados e menos repetição: o resumo do setup saiu do Início (está na Sessão). (#162) - Aviso de atualização em português: o destaque da nova versão aparece no idioma do app quando há um changelog nele (hoje, português); os outros idiomas continuam vendo o destaque em inglês. Vale a partir das atualizações publicadas depois desta versão. (#158) ## [1.6.2]