diff --git a/Sources/FoundationExtensions/A11y/AccessibilityIdentifiable.swift b/Sources/FoundationExtensions/A11y/AccessibilityIdentifiable.swift new file mode 100644 index 0000000..738a641 --- /dev/null +++ b/Sources/FoundationExtensions/A11y/AccessibilityIdentifiable.swift @@ -0,0 +1,3 @@ +// Copyright © 2023 Lautsprecher Teufel GmbH. All rights reserved. + +public protocol AccessibilityIdentifiable: TypePathConvertible { } diff --git a/Sources/FoundationExtensions/A11y/AccessibilityIdentifier.swift b/Sources/FoundationExtensions/A11y/AccessibilityIdentifier.swift new file mode 100644 index 0000000..ef2b04a --- /dev/null +++ b/Sources/FoundationExtensions/A11y/AccessibilityIdentifier.swift @@ -0,0 +1,28 @@ +// Copyright © 2023 Lautsprecher Teufel GmbH. All rights reserved. + +/// A namespace for accessibility identifiers. +/// +/// You could declare A11Y IDs like this +/// ``` +/// extension AccessibilityIdentifier { +/// enum HomeScreen: AccessibilityIdentifiable { +/// enum MusicView: AccessibilityIdentifiable { +/// case sectionHeader +/// case recentlyPlayedScrollview +/// } +/// +/// enum MiniPlayer: AccessibilityIdentifiable { +/// case muteButton +/// case coverImage +/// } +/// } +/// } +/// ``` +/// Thanks to the TypePathConvertible conformance, you can use it on your views: +/// ``` +/// Text("Podcasts") +/// .accessibilityIdentifier(AccessibilityIdentifier.HomeScreen.MusicView.sectionHeader.typePath) +/// ``` +/// which adds the A11Y ID "MyApp.AccessibilityIdentifier.HomeScreen.MusicView.sectionHeader" to the View. +/// +public enum AccessibilityIdentifier: AccessibilityIdentifiable { }