From c20aea8f28757746eb15df249138a1c8e01a8496 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 29 Jun 2026 09:04:47 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20Add=20dynamic=20c?= =?UTF-8?q?ontext=20to=20list=20row=20action=20accessibility=20labels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added dynamic item names to the `.help()` and `.accessibilityLabel()` modifiers for the Edit and Delete buttons in `MacroListView` and `ScriptListView`. This significantly improves the experience for screen reader users and those relying on tooltips, allowing them to know exactly which item an action applies to in a repeated list. Co-authored-by: NSEvent <44446865+NSEvent@users.noreply.github.com> --- .Jules/palette.md | 4 ++++ .../Views/Macros/MacroListView.swift | 12 ++++++------ .../Views/Scripts/ScriptListView.swift | 8 ++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.Jules/palette.md b/.Jules/palette.md index f61603c8..a2fc85f8 100644 --- a/.Jules/palette.md +++ b/.Jules/palette.md @@ -25,3 +25,7 @@ ## 2026-06-23 - [SwiftUI Button Accessibility] **Learning:** Found a pattern where SwiftUI icon-only buttons or minimal UI elements were given `.help()` modifiers for hover tooltips but lacked `.accessibilityLabel()` modifiers for screen readers. **Action:** When adding `.help()` to buttons, always pair it with a corresponding `.accessibilityLabel()` to ensure full accessibility. + +## 2024-05-19 - [Missing Dynamic Context in Repeated List Action Buttons] +**Learning:** Icon-only action buttons (like "Edit" or "Delete") inside `ForEach` lists or repeating views often use static strings for `.help()` and `.accessibilityLabel()`, such as `.help("Edit")`. This causes a poor experience for screen reader users and those relying on tooltips, as they encounter multiple identical "Edit" labels without knowing *what* item is being edited. +**Action:** When adding `.help()` and `.accessibilityLabel()` to action buttons within a list or loop, always utilize dynamic context from the current item (e.g., `.help("Edit \(item.name)")`) to disambiguate the action for all users. diff --git a/XboxControllerMapper/XboxControllerMapper/Views/Macros/MacroListView.swift b/XboxControllerMapper/XboxControllerMapper/Views/Macros/MacroListView.swift index 211ecb1e..88cd22d2 100644 --- a/XboxControllerMapper/XboxControllerMapper/Views/Macros/MacroListView.swift +++ b/XboxControllerMapper/XboxControllerMapper/Views/Macros/MacroListView.swift @@ -155,8 +155,8 @@ struct SharedMacroRow: View { .foregroundColor(.accentColor) } .buttonStyle(.borderless) - .help("Edit in shared library") - .accessibilityLabel("Edit in shared library") + .help("Edit \(macro.name) in shared library") + .accessibilityLabel("Edit \(macro.name) in shared library") } .padding(.horizontal, 12) .padding(.vertical, 8) @@ -206,16 +206,16 @@ struct MacroRow: View { .foregroundColor(.accentColor) } .buttonStyle(.borderless) - .help("Edit") - .accessibilityLabel("Edit") + .help("Edit \(macro.name)") + .accessibilityLabel("Edit \(macro.name)") Button(action: onDelete) { Image(systemName: "trash") .foregroundColor(.red.opacity(0.8)) } .buttonStyle(.borderless) - .help("Delete") - .accessibilityLabel("Delete") + .help("Delete \(macro.name)") + .accessibilityLabel("Delete \(macro.name)") } } .padding(.horizontal, 12) diff --git a/XboxControllerMapper/XboxControllerMapper/Views/Scripts/ScriptListView.swift b/XboxControllerMapper/XboxControllerMapper/Views/Scripts/ScriptListView.swift index 40c6f5ff..11c8dd28 100644 --- a/XboxControllerMapper/XboxControllerMapper/Views/Scripts/ScriptListView.swift +++ b/XboxControllerMapper/XboxControllerMapper/Views/Scripts/ScriptListView.swift @@ -222,16 +222,16 @@ struct ScriptRow: View { .foregroundColor(.accentColor) } .buttonStyle(.borderless) - .help("Edit") - .accessibilityLabel("Edit") + .help("Edit \(script.name.isEmpty ? "Untitled Script" : script.name)") + .accessibilityLabel("Edit \(script.name.isEmpty ? "Untitled Script" : script.name)") Button(action: onDelete) { Image(systemName: "trash") .foregroundColor(.red.opacity(0.8)) } .buttonStyle(.borderless) - .help("Delete") - .accessibilityLabel("Delete") + .help("Delete \(script.name.isEmpty ? "Untitled Script" : script.name)") + .accessibilityLabel("Delete \(script.name.isEmpty ? "Untitled Script" : script.name)") } } .padding(.horizontal, 12) From c98c1efe6bb8e49105c11a2722a071a2aefaf25e Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 29 Jun 2026 09:28:58 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20Add=20dynamic=20c?= =?UTF-8?q?ontext=20to=20list=20row=20action=20accessibility=20labels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added dynamic item names to the `.help()` and `.accessibilityLabel()` modifiers for the Edit and Delete buttons in `MacroListView` and `ScriptListView`. This significantly improves the experience for screen reader users and those relying on tooltips, allowing them to know exactly which item an action applies to in a repeated list. Co-authored-by: NSEvent <44446865+NSEvent@users.noreply.github.com> From 9c6af47ac36f534d87f958bc6478d3be2fa85b04 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 29 Jun 2026 09:47:57 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20Add=20dynamic=20c?= =?UTF-8?q?ontext=20to=20list=20row=20action=20accessibility=20labels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added dynamic item names to the `.help()` and `.accessibilityLabel()` modifiers for the Edit and Delete buttons in `MacroListView` and `ScriptListView`. This significantly improves the experience for screen reader users and those relying on tooltips, allowing them to know exactly which item an action applies to in a repeated list. Co-authored-by: NSEvent <44446865+NSEvent@users.noreply.github.com> --- parse_ci.py | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 parse_ci.py diff --git a/parse_ci.py b/parse_ci.py new file mode 100644 index 00000000..1b09baae --- /dev/null +++ b/parse_ci.py @@ -0,0 +1,11 @@ +log_lines = """ +2026-06-29T09:35:06.7915320Z Test Suite 'XboxControllerMapperTests.xctest' failed at 2026-06-29 09:35:06.413. +2026-06-29T09:35:06.7921360Z Executed 1785 tests, with 18 tests skipped and 1 failure (0 unexpected) in 226.876 (227.381) seconds +2026-06-29T09:35:06.7922880Z Test Suite 'All tests' failed at 2026-06-29 09:35:06.418. +2026-06-29T09:35:06.7924580Z Executed 1785 tests, with 18 tests skipped and 1 failure (0 unexpected) in 226.876 (227.396) seconds +2026-06-29T09:35:06.7993580Z ⚠️ MappingEngine: Chord [ControllerKeys.ControllerButton.a, ControllerKeys.ControllerButton.b] detected but no active profile — input ignored +2026-06-29T09:35:06.7994660Z ⚠️ MappingEngine: Button a pressed but no active profile — input ignored +2026-06-29T09:35:06.7995180Z ⚠️ MappingEngine: Button a pressed but no active profile — input ignored +2026-06-29T09:35:06.8026810Z ##[error]Process completed with exit code 1. +""" +print(log_lines)