diff --git a/Configuration/config.xcconfig b/Configuration/config.xcconfig new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE/LICENSE.txt b/LICENSE/LICENSE.txt new file mode 100644 index 0000000..e69de29 diff --git a/Package.swift b/Package.swift index 57ae4c4..520218d 100644 --- a/Package.swift +++ b/Package.swift @@ -1,20 +1,32 @@ -// swift-tools-version: 5.9.0 +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( - name: "AccessibilityDocumentation", - platforms: [.iOS(.v17)], + name: "iOSAccessibilityHandbook", + platforms: [ + .macOS(.v11), + .iOS(.v17), + .watchOS(.v7), + .tvOS(.v13) + ], products: [ + // Products define the executables and libraries a package produces, making them visible to other packages. + .library( - name: "AccessibilityDocumentation", - targets: ["AccessibilityDocumentation"]), + name: "iOSAccessibilityHandbook", + targets: ["iOSAccessibilityHandbook"] + ) ], dependencies: [ .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0") ], targets: [ + // Targets are the basic building blocks of a package, defining a module or a test suite. + // Targets can depend on other targets in this package and products from dependencies. .target( - name: "AccessibilityDocumentation"), + name: "iOSAccessibilityHandbook" + ) ] ) diff --git a/Sources/AccessibilityDocumentation/Constants.swift b/Sources/AccessibilityDocumentation/Constants.swift deleted file mode 100644 index 37f509d..0000000 --- a/Sources/AccessibilityDocumentation/Constants.swift +++ /dev/null @@ -1,496 +0,0 @@ -import Foundation - -// -// UIAccessibilityConstants.h -// UIKit -// -// Copyright (c) 2009-2018 Apple Inc. All rights reserved. -// - -/** - Accessibility Traits - - Traits are combined in a mask to help assistive applications understand - the meaning and intended use of a particular accessibility element. - - UIKit applies appropriate traits to all standard controls, however the - following traits may be used in conjunction with custom controls. - - When setting accessibility traits, combine custom traits with - [super accessibilityTraits]. An incorrect combination of custom traits - will cause accessibility clients to incorrectly interpret the element. - Use common sense when combining traits. - */ -public struct UIAccessibilityTraits_ : Hashable, Equatable, RawRepresentable, @unchecked Sendable { - public var rawValue: UInt64 - - /// Creates a new option set from the given raw value. - /// - /// This initializer always succeeds, even if the value passed as `rawValue` - /// exceeds the static properties declared as part of the option set. This - /// example creates an instance of `ShippingOptions` with a raw value beyond - /// the highest element, with a bit mask that effectively contains all the - /// declared static members. - /// - /// let extraOptions = ShippingOptions(rawValue: 255) - /// print(extraOptions.isStrictSuperset(of: .all)) - /// // Prints "true" - /// - /// - Parameter rawValue: The raw value of the option set to create. Each bit - /// of `rawValue` potentially represents an element of the option set, - /// though raw values may include bits that are not defined as distinct - /// values of the `OptionSet` type. - public init(rawValue: UInt64) { - self.rawValue = rawValue - } -} - -extension UIAccessibilityTraits_ : OptionSet { - - /// The type of the elements of an array literal. - public typealias ArrayLiteralElement = UIAccessibilityTraits_ - - /// The element type of the option set. - /// - /// To inherit all the default implementations from the `OptionSet` protocol, - /// the `Element` type must be `Self`, the default. - public typealias Element = UIAccessibilityTraits_ -} -extension UIAccessibilityTraits_ { - - - public static var none: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when the element should be treated as a button. - public static var button: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when the element should be treated as a link. - public static var link: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when an element acts as a header for a content section (e.g. the title of a navigation bar). - @available(iOS 6.0, *) - public static var header: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when the text field element should also be treated as a search field. - public static var searchField: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when the element should be treated as an image. Can be combined with button or link, for example. - public static var image: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /** - Used when the element is selected. - For example, a selected row in a table or a selected button within a segmented control. - */ - public static var selected: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when the element plays its own sound when activated. - public static var playsSound: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when the element acts as a keyboard key. - public static var keyboardKey: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when the element should be treated as static text that cannot change. - public static var staticText: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /** - Used when an element can be used to provide a quick summary of current - conditions in the app when the app first launches. For example, when Weather - first launches, the element with today's weather conditions is marked with - this trait. - */ - public static var summaryElement: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when the control is not enabled and does not respond to user input. - public static var notEnabled: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /** - Used when the element frequently updates its label or value, but too often to send notifications. - Allows an accessibility client to poll for changes. A stopwatch would be an example. - */ - public static var updatesFrequently: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /** - Used when activating an element starts a media session (e.g. playing a movie, recording audio) - that should not be interrupted by output from an assistive technology, like VoiceOver. - */ - @available(iOS 4.0, *) - public static var startsMediaSession: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /** - Used when an element can be "adjusted" (e.g. a slider). The element must also - implement accessibilityIncrement and accessibilityDecrement. Read for detailed explanation - */ - @available(iOS 4.0, *) - public static var adjustable: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when an element allows direct touch interaction for VoiceOver users (for example, a view representing a piano keyboard). - @available(iOS 5.0, *) - public static var allowsDirectInteraction: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /** - Informs VoiceOver that it should scroll to the next page when it finishes reading the contents of the - element. VoiceOver will scroll by calling accessibilityScroll: with UIAccessibilityScrollDirectionNext and will - stop scrolling when it detects the content has not changed. - */ - @available(iOS 5.0, *) - public static var causesPageTurn: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /** - Used when a view or accessibility container represents an ordered list of tabs. - The object with this trait should return NO for isAccessibilityElement. - */ - @available(iOS 10.0, *) - public static var tabBar: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /// Used when the element should be treated as a toggle. - @available(iOS 17.0, *) - public static var toggleButton: UIAccessibilityTraits_ = .init(rawValue: 0) - - - /** - Used when the element has zoom functionality. - */ - @available(iOS 17.0, *) - public static var supportsZoom: UIAccessibilityTraits_ = .init(rawValue: 0) -} - -//extension UIAccessibility { -// -// -// public struct Notification : Hashable, Equatable, RawRepresentable, @unchecked Sendable { -// -// public init(rawValue: UInt32) -// } -// -// -// /* -// Should be posted when a new view appears that encompasses a major portion of the screen. -// Optionally, pass the element that VoiceOver should move to after processing the notification. -// */ -// -// /* -// Should be posted when the layout of a screen changes, for example when an individual -// element appears or disappears. -// Optionally, pass the element that VoiceOver should move to after processing the notification. -// */ -// -// /* -// Should be posted when an announcement needs to be conveyed to VoiceOver. -// VoiceOver will output the announcement string that is used as the argument. -// The argument is a NSString. -// */ -// -// /* -// Should be posted after accessibilityScroll: is called and the scrolling action has completed. -// A string representing the status of the new scroll position should be used as the argument -// (e.g. "Page 2 of 5"). If the same status is used repeatedly, the assistive technology will -// indicate a border has been reached. -// The argument is a NSString. -// */ -// -// /* -// Should be posted to pause an assistive technology's operations temporarily. -// For example, you may want to pause scanning in Switch Control while your app plays an animation. -// An identifier representing the assistive technology should be used as the argument. -// Currently, these notifications only apply to Switch Control. -// The notifications must be balanced. That is, every UIAccessibilityPauseAssistiveTechnologyNotification -// should be followed by a matching UIAccessibilityResumeAssistiveTechnologyNotification with the same argument. -// If the user performs an action that requires the assistive technology to resume operations, -// it may do so before it receives the corresponding UIAccessibilityResumeAssistiveTechnologyNotification. -// The argument is a NSString. -// */ -// -// /* -// Listen for this notification to know when VoiceOver finishes outputting an announcement. -// The userInfo dictionary contains UIAccessibilityAnnouncementKeyString and UIAccessibilityAnnouncementKeyWasSuccessful. -// */ -// @available(iOS 6.0, *) -// public static let announcementDidFinishNotification: NSNotification.Name -// -// -// // The corresponding value is the string that was used for the announcement. -// @available(iOS 6.0, *) -// public static let announcementStringValueUserInfoKey: String -// -// -// // The corresponding value is an NSNumber representing whether VoiceOver successfully outputted the announcement. -// @available(iOS 6.0, *) -// public static let announcementWasSuccessfulUserInfoKey: String -// -// -// // In order to know when an assistive technology has focused on an element listen to this notification -// // The newly focused element will be referenced by UIAccessibilityElementFocusedKeyElement in the userInfo dictionary. -// @available(iOS 9.0, *) -// public static let elementFocusedNotification: NSNotification.Name -// -// -// // The corresponding value is the element that is now focused by the assistive technology. -// @available(iOS 9.0, *) -// public static let focusedElementUserInfoKey: String -// -// -// // The corresponding value is the element that had previously been focused by the assistive technology. -// @available(iOS 9.0, *) -// public static let unfocusedElementUserInfoKey: String -// -// -// // The corresponding value is the identifier of the assistive technology -// @available(iOS 9.0, *) -// public static let assistiveTechnologyUserInfoKey: String -// -// -// public struct AssistiveTechnologyIdentifier : Hashable, Equatable, RawRepresentable, @unchecked Sendable { -// -// public init(rawValue: String) -// } -// -// -// /* -// The following identifier should be used as the argument when posting a UIAccessibilityPauseAssistiveTechnologyNotification -// or a UIAccessibilityResumeAssistiveTechnologyNotification. -// */ -// -// // Used to identify VoiceOver as the assistive technology. -// -// /* -// The following values describe how the receiver's elements should be navigated by an assistive technology. -// */ -// -// /* -// The assistive technology will automatically determine how the receiver's elements should be navigated. -// This is the default value. -// */ -// -// /* -// The receiver's elements should be navigated as separate elements. -// */ -// -// /* -// The receiver’s elements should be combined and navigated as a single item. -// When the combined item has been selected, the assistive technology will navigate each element separately. -// */ -// -// // If using this container type, you must also implement the UIAccessibilityContainerDataTable protocol. -// -// // Assistive technologies might query the accessibility properties set on the container, such as the accessibilityLabel, in order to output appropriate information about the semantic group to the user -// -// @available(iOS 17.0, *) -// public struct DirectTouchOptions : OptionSet, @unchecked Sendable { -// -// public init(rawValue: UInt) -// -// -// // Allows a direct touch area to immediately receive touch events without VoiceOver speaking. Appropriate -// // for apps that provide direct audio feedback during interaction that would conflict with VoiceOver (like a drum pad in a music creation app). -// public static var silentOnTouch: UIAccessibility.DirectTouchOptions { get } -// -// // Requires VoiceOver to activate the element before touch passthrough starts. -// public static var requiresActivation: UIAccessibility.DirectTouchOptions { get } -// } -//} - -extension Book { - - /// Call this notification when entire screen had changed to rebuild accessibility tree. VoiceOver will notify by special signal. Modal and push presentation call this notification automatically. - public static var screenChanged: Notification = Notification(name: Notification.Name(rawValue: "screenChanged")) - - /// Call this notification when part of a screen had changed to rebuild accessibility tree. Great for some disclosures area for e.g. - public static var layoutChanged: Notification = Notification(name: Notification.Name(rawValue: "screenChanged")) - - /// Notify user when some process had completed. Examples: finish loading, complete order in restaurant - @available(iOS 4.0, *) - public static var announcement: Notification = Notification(name: Notification.Name(rawValue: "screenChanged")) - - @available(iOS 4.2, *) - public static var pageScrolled: Notification = Notification(name: Notification.Name(rawValue: "screenChanged")) - - @available(iOS 8.0, *) - public static var pauseAssistiveTechnology: Notification = Notification(name: Notification.Name(rawValue: "screenChanged")) - - @available(iOS 8.0, *) - public static var resumeAssistiveTechnology: Notification = Notification(name: Notification.Name(rawValue: "screenChanged")) -} -//extension UIAccessibility.AssistiveTechnologyIdentifier { -// -// @available(iOS 8.0, *) -// public static let notificationSwitchControl: UIAccessibility.AssistiveTechnologyIdentifier -// -// @available(iOS 9.0, *) -// public static let notificationVoiceOver: UIAccessibility.AssistiveTechnologyIdentifier -//} -//@available(iOS 8.0, *) -//public enum UIAccessibilityNavigationStyle : Int, @unchecked Sendable { -// -// case automatic = 0 -// -// case separate = 1 -// -// case combined = 2 -//} -@available(iOS 11.0, *) -public enum UIAccessibilityContainerType : Int, @unchecked Sendable { - - case none = 0 - - case dataTable = 1 - - case list = 2 - - case landmark = 3 - - @available(iOS 13.0, *) - case semanticGroup = 4 -} -// -//// The following constants can be used with either the accessibilityTextualContext property, or with the -//// UIAccessibilityTextAttributeContext attributed key. -//@available(iOS 13.0, *) -//public struct UIAccessibilityTextualContext : Hashable, Equatable, RawRepresentable, @unchecked Sendable { -// -// public init(_ rawValue: String) -// -// public init(rawValue: String) -//} -//extension UIAccessibilityTextualContext { -// -// @available(iOS 13.0, *) -// public static let wordProcessing: UIAccessibilityTextualContext -// -// @available(iOS 13.0, *) -// public static let narrative: UIAccessibilityTextualContext -// -// @available(iOS 13.0, *) -// public static let messaging: UIAccessibilityTextualContext -// -// @available(iOS 13.0, *) -// public static let spreadsheet: UIAccessibilityTextualContext -// -// @available(iOS 13.0, *) -// public static let fileSystem: UIAccessibilityTextualContext -// -// @available(iOS 13.0, *) -// public static let sourceCode: UIAccessibilityTextualContext -// -// @available(iOS 13.0, *) -// public static let console: UIAccessibilityTextualContext -//} -// -//// The following constants can be used with either the accessibilityAnnouncementPriority property, or with the -//// UIAccessibilityAnnouncementPriority attributed key. -//@available(iOS 17.0, *) -//public struct UIAccessibilityPriority : Hashable, Equatable, RawRepresentable, @unchecked Sendable { -// -// public init(rawValue: String) -//} -//extension UIAccessibilityPriority { -// -// -// @available(iOS 17.0, *) -// public static let high: UIAccessibilityPriority -// -// // Announcements will interrupt existing speech, but are interruptible if a new speech utterance is started. -// @available(iOS 17.0, *) -// public static let `default`: UIAccessibilityPriority -// -// // Announcements are queued and spoken when other speech utterances have completed. -// @available(iOS 17.0, *) -// public static let low: UIAccessibilityPriority -//} -//extension NSAttributedString.Key { -// -// -// @available(iOS 7.0, *) -// public static let accessibilitySpeechPunctuation: NSAttributedString.Key -// -// -// // Use an NSString with a BCP-47 language code to identify the language of a segment of a string. -// @available(iOS 7.0, *) -// public static let accessibilitySpeechLanguage: NSAttributedString.Key -// -// -// // Use an NSNumber with a value between [0-2] that specifies the pitch. -// // For example, you may want to lower the pitch when an object is deleted, or raise the pitch if an object is inserted. -// // Default value == 1.0f. -// @available(iOS 7.0, *) -// public static let accessibilitySpeechPitch: NSAttributedString.Key -// -// -// // The corresponding value for this key should be a NSNumber with a YES or NO value. -// // If YES, then this announcement will be queued behind existing speech; if NO, then it will interrupt existing speech. -// // Default behavior is to interrupt existing speech. -// @available(iOS 11.0, *) -// public static let accessibilitySpeechQueueAnnouncement: NSAttributedString.Key -// -// -// // Use with a UIAccessibilityAnnouncementPriority value to specify whether this announcement can be queued or interrupted. -// @available(iOS 17.0, *) -// public static let accessibilitySpeechAnnouncementPriority: NSAttributedString.Key -// -// -// // Use an NSString, containing International Phonetic Alphabet (IPA) symbols. -// // Controls the pronunciation of a word or phrase, e.g. a proper name. -// @available(iOS 11.0, *) -// public static let accessibilitySpeechIPANotation: NSAttributedString.Key -// -// -// // Use an NSNumber with a YES or NO value to specify whether each letter in the string should be spoken separately. -// @available(iOS 13.0, *) -// public static let accessibilitySpeechSpellOut: NSAttributedString.Key -// -// -// /* -// Accessibility Text Attributes -// -// The following attributes can be used in the NSAttributedString returned by attributeText methods of views conforming to UITextInput -// to convey extra information about the text. -// -// Use existing NSAttributedString attributes for properties not defined here from -// -// To include an inline element (like an image or table), use NSAttachmentAttributeName and set the value to the element. -// */ -// -// // Use an NSNumber where the value is [0, 6]. Use 0 to indicate the absence of a specific heading level. -// @available(iOS 11.0, *) -// public static let accessibilityTextHeadingLevel: NSAttributedString.Key -// -// -// // Use an NSArray of localized NSStrings to convey custom text attributes. -// // For example, a range of text may have multiple custom 'annotation styles, which can be described with this key. -// @available(iOS 11.0, *) -// public static let accessibilityTextCustom: NSAttributedString.Key -// -// -// // Use a UIAccessibilityTextualContext to specify how this text content should be interpreted by assistive technologies. -// @available(iOS 13.0, *) -// public static let UIAccessibilityTextAttributeContext: NSAttributedString.Key -//} -// -//// This struct is not available in Objective-C. Its only purpose is to create a namespace for accessibility symbols in Swift. -//public struct UIAccessibility { -// -// public init(_reserved: UnsafeMutableRawPointer) -// -// public var _reserved: UnsafeMutableRawPointer -//} -// -//@available(*, unavailable) -//extension UIAccessibility : @unchecked Sendable { -//} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/SpecificProperties.md b/Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/SpecificProperties.md deleted file mode 100644 index 626a812..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/SpecificProperties.md +++ /dev/null @@ -1,18 +0,0 @@ -# Specific Properties - -Different disabilities requires different way of perceptions and control. As a result some technologies provides additional properties for finergaind control. - - -## VoiceOver - - allows to control the element by vertical swipe, but in useful only for blind persons. - -## Switch Control - -- ``Book/accessibilityNavigationStyle`` - -## Voice Control - -In regular vocabulary we use a lot of synonyms. To simplify interaction Voice Control can use ``Book/accessibilityLabel`` alongside alternatives from `UserInputLabel` - -- ``Book/accessibilityUserInputLabels`` diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/VisualProperties.md b/Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/VisualProperties.md deleted file mode 100644 index 8e99ec9..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/VisualProperties.md +++ /dev/null @@ -1,20 +0,0 @@ -# Visual Properties - -Every technologies requires understanding of graphical properties for different apporoach. - - - -## Overview - -Text - -### Section header - -## Topics -- ``Book/accessibilityFrame`` - -- ``Book/accessibilityActivationPoint`` - -- ``Book/accessibilityPath`` - -- ``Book/accessibilityRespondsToUserInteraction`` diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Getting Started.md b/Sources/AccessibilityDocumentation/Documentation.docc/Getting Started.md deleted file mode 100644 index 27eb127..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Getting Started.md +++ /dev/null @@ -1,84 +0,0 @@ -# ``AccessibilityDocumentation`` - -Accessibility part of UIKit and SwiftUI frameworks helps developers to represent graphical user interface for assistive technologies - -## Overview - -### Accessibility Features - -There are three main assistance for blind or motion limited users: -@Links(visualStyle: compactGrid) { - - - - - - -} - -- **** helps blind or low-visioned persons to use a phone by listening audio description of UI and command by different swipes and non-direct touches. Developer prepare text description of the element, iPhone will generate voice description from text. - -![VoiceOver gestures](VoiceOverGestures) - -- **** adds additional commands over graphical UI to control a phone by voice commands. A user of Voice Control can see, but can't touch their phone, as a result he can pronounce commands lite "select Pepperoni", "tap purchase" or "close screen". iPhone recognizes speach, convert it to text and links command to elements' description. - -![Voice Control modes: with labels, enumerated elements or grid](VoiceControlOverview) - -- **** allows to connect external devices and link them to any command. As a result paralyzed people can control a phone by simple signals: finger movement, muscle stretches, etc. Also, a iPhone's camera can recognize facial expression or any sound like a command. In the end user moves focus on screen and pass command to focused element by submenu that is presented after selection. - -![Switch Control modes: focus groups on elements, cross selection and submenu](SwitchControlOverview) - -> Note: Watch [Apple's playlist about Accessibility ](https://www.youtube.com/playlist?list=PLIl2EzNYri0cLtSlZowttih25VnSvWITu) for inspiration - -To prototype interaction on early stage of development you can use [VoiceOver Designer](https://rubanov.dev/voice-over-designer/) application for macOS. - -![Screenshot of the application](VoiceOverDesigner.png) - -## Tutorials - -Step by step practice course. - -@Links(visualStyle: detailedGrid) { - - - - -} - -@Comment { - - // TODO: Uncomment? - - @TabNavigator { - @Tab("Switch Control") { - Allows to connect external devices and link them to any command. As a result paralyzed people can control a phone by simple signals: finger movement, muscle stretches, etc. Also, a iPhone's camera can recognize facial expression or any sound like a command. In the end user moves focus on screen and pass command to focused element by submenu that is presented after selection. - ![Switch Control modes: focus groups on elements, cross selection and submenu](Switch ControlOverview) - } - - - @Tab("Voice Control") { - Adds additional commands over graphical UI to control a phone by voice commands. A user of Voice Control can see, but can't touch their phone, as a result he can pronounce commands lite "select Pepperoni", "tap purchase" or "close screen". iPhone recognizes speach, convert it to text and links command to elements' description. - - ![Voice Control modes: with labels, enumerated elements or grid](VoiceControlOverview) - } - - @Tab("Voice Over") { - Helps blind or low-visioned persons to use a phone by listening audio description of UI and command by different swipes and non-direct touches. Developer prepare text description of the element, iPhone will generate voice description from text. - - ![VoiceOver gestures](VoiceOverGestures) - } - } - } - - -## Topics - -### Basic -- -- -- -- -- - -### Advanced -- -- - -Tutorial: -- - diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_1.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_1.swift deleted file mode 100644 index 8c5fcf1..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_1.swift +++ /dev/null @@ -1,6 +0,0 @@ -import UIKit - -class AccessibleStepper: UIStepper { - - private func counterValue = 0 -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_2.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_2.swift deleted file mode 100644 index fc33e14..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_2.swift +++ /dev/null @@ -1,18 +0,0 @@ -import UIKit - -class AccessibleStepper: UIStepper { - - private func counterValue = 0 - - var isAccessibilityElement: Bool { - true - } - - var accessibilityLabel: String { - "Number of products" - } - - var accessibilityValue: String { - "\(counterValue)" - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_3.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_3.swift deleted file mode 100644 index 0fc5346..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_3.swift +++ /dev/null @@ -1,30 +0,0 @@ -import UIKit - -class AccessibleStepper: UIStepper { - - private func counterValue = 0 - - var isAccessibilityElement: Bool { - true - } - - var accessibilityLabel: String { - "Number of products" - } - - var accessibilityValue: String { - "\(counterValue)" - } - - var accessibilityTraits: [UIAccessibilityTraits] { - .adjustable - } - - func accessibilityIncrement() { - counterValue += 1 - } - - func accessibilityDecrement() { - counterValue -= 1 - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_4.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_4.swift deleted file mode 100644 index 5202f39..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_4.swift +++ /dev/null @@ -1,30 +0,0 @@ -import UIKit - -class AccessibleStepper: UIStepper { - - private func counterValue = 0 - - var isAccessibilityElement: Bool { - UIAccessibility.isVoiceOverRunning - } - - var accessibilityLabel: String { - "Number of products" - } - - var accessibilityValue: String { - "\(counterValue)" - } - - var accessibilityTraits: [UIAccessibilityTraits] { - UIAccessibility.isVoiceOverRunning ? .adjustable : .none - } - - func accessibilityIncrement() { - counterValue += 1 - } - - func accessibilityDecrement() { - counterValue -= 1 - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_5.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_5.swift deleted file mode 100644 index 5748c5d..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdjustableTutorial/AdjustableTutorialStep_5.swift +++ /dev/null @@ -1,32 +0,0 @@ -import UIKit - -class AccessibleStepper: UIStepper { - - private func counterValue = 0 - - var isAccessibilityElement: Bool { - UIAccessibility.isVoiceOverRunning - } - - var accessibilityLabel: String { - "Number of products" - } - - var accessibilityValue: String { - "\(counterValue)" - } - - var accessibilityTraits: [UIAccessibilityTraits] { - UIAccessibility.isVoiceOverRunning ? .adjustable : .none - } - - func accessibilityIncrement() { - counterValue += 1 - } - - func accessibilityDecrement() { - counterValue -= 1 - } - - var accessibilityNavigationStyle = .combined -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_1.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_1.png deleted file mode 100644 index 0fef8a3..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_1.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_10.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_10.swift deleted file mode 100644 index daeee8a..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_10.swift +++ /dev/null @@ -1,22 +0,0 @@ -class PizzaCell: UITableViewCell { - private var titleLabel: UILabel! - private var ingredientsLabel: UILabel! - private var priceButton: UIButton! - - struct ViewModel { - let title: String - let ingredients: String - let price: String - } - - func setup(with viewModel: ViewModel) { - titleLabel.text = viewModel.title - ingredientsLabel.text = viewModel.ingredients - priceButton.setTitle(viewModel.price, for: .normal) - - isAccessibilityElement = true - accessibilityLabel = viewModel.title - accessibilityValue = viewModel.price + ", " + viewModel.ingredients - accessibilityTraits = .button - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_11.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_11.swift deleted file mode 100644 index 4d8794e..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_11.swift +++ /dev/null @@ -1,5 +0,0 @@ -extension MenuViewController: UIScrollViewAccessibilityDelegate { - public func accessibilityScrollStatus(for scrollView: UIScrollView) -> String? { - - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_11_0.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_11_0.swift deleted file mode 100644 index 40be9f6..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_11_0.swift +++ /dev/null @@ -1,3 +0,0 @@ -extension MenuViewController { - -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_12.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_12.swift deleted file mode 100644 index a5f3c4a..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_12.swift +++ /dev/null @@ -1,7 +0,0 @@ -extension MenuViewController: UIScrollViewAccessibilityDelegate { - public func accessibilityScrollStatus(for scrollView: UIScrollView) -> String? { - guard let visiblePaths = self.tableView.indexPathsForVisibleRows else { - return nil - } - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_13.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_13.swift deleted file mode 100644 index f5fd9b0..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_13.swift +++ /dev/null @@ -1,11 +0,0 @@ -extension MenuViewController: UIScrollViewAccessibilityDelegate { - public func accessibilityScrollStatus(for scrollView: UIScrollView) -> String? { - guard let visiblePaths = self.tableView.indexPathsForVisibleRows else { - return nil - } - - let visibleProducts = visiblePaths.map { path in - menuModel.products[path.row] - } - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_14.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_14.swift deleted file mode 100644 index 31158b0..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_14.swift +++ /dev/null @@ -1,13 +0,0 @@ -extension MenuViewController: UIScrollViewAccessibilityDelegate { - public func accessibilityScrollStatus(for scrollView: UIScrollView) -> String? { - guard let visiblePaths = self.tableView.indexPathsForVisibleRows else { - return nil - } - - let visibleProducts = visiblePaths.map { path in - menuModel.products[path.row] - } - - let titles = visibleProducts.map(\.title) - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_15.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_15.swift deleted file mode 100644 index f4c3b42..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_15.swift +++ /dev/null @@ -1,15 +0,0 @@ -extension MenuViewController: UIScrollViewAccessibilityDelegate { - public func accessibilityScrollStatus(for scrollView: UIScrollView) -> String? { - guard let visiblePaths = self.tableView.indexPathsForVisibleRows else { - return nil - } - - let visibleProducts = visiblePaths.map { path in - menuModel.products[path.row] - } - - let titles = visibleProducts.map(\.title) - - return titles.joined(separator: ", ") - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_16.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_16.swift deleted file mode 100644 index c08dc26..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_16.swift +++ /dev/null @@ -1,15 +0,0 @@ -extension MenuViewController: UIScrollViewAccessibilityDelegate { - public func accessibilityScrollStatus(for scrollView: UIScrollView) -> String? { - guard let visiblePaths = self.tableView.indexPathsForVisibleRows else { - return nil - } - - let visibleProducts = visiblePaths.map { path in - menuModel.products[path.row] - } - - let titles = visibleProducts.map(\.title) - - return titles.joined(separator: ", ") // TODO: Add current type of products and "out of 24" - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_2.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_2.png deleted file mode 100644 index 0c8ad92..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_2.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3.png deleted file mode 100644 index c6e4388..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_0.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_0.swift deleted file mode 100644 index 02342c0..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_0.swift +++ /dev/null @@ -1,4 +0,0 @@ -Chicken BBQ -Pizza sauce... -from AED 30 - diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_1.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_1.swift deleted file mode 100644 index d4f2243..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_1.swift +++ /dev/null @@ -1,9 +0,0 @@ -Chicken BBQ -Pizza sauce... -from AED 30 -Meat King Supreme -Pizza sauce... -from AED 30 -Hawaii -Pizza sauce... -from AED 30 diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_2.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_2.swift deleted file mode 100644 index 6ff9740..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_2.swift +++ /dev/null @@ -1,9 +0,0 @@ -Chicken BBQ -Pizza sauce... -from AED 30 -Meat King Supreme -Pizza sauce... -from AED 30 // Does it relate... -Hawaii // To this title? -Pizza sauce... -from AED 30 diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_3.jpeg b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_3.jpeg deleted file mode 100644 index 5e0ab27..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_3_3.jpeg and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_4.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_4.png deleted file mode 100644 index 6c34a0b..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_4.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_5.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_5.png deleted file mode 100644 index 3025f10..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_5.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_6.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_6.swift deleted file mode 100644 index ad6ae92..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_6.swift +++ /dev/null @@ -1,17 +0,0 @@ -class PizzaCell: UITableViewCell { - private var titleLabel: UILabel! - private var ingredientsLabel: UILabel! - private var priceButton: UIButton! - - struct ViewModel { - let title: String - let ingredients: String - let price: String - } - - func setup(with viewModel: ViewModel) { - titleLabel.text = viewModel.title - ingredientsLabel.text = viewModel.ingredients - priceButton.setTitle(viewModel.price, for: .normal) - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_7.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_7.swift deleted file mode 100644 index a72cb71..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_7.swift +++ /dev/null @@ -1,19 +0,0 @@ -class PizzaCell: UITableViewCell { - private var titleLabel: UILabel! - private var ingredientsLabel: UILabel! - private var priceButton: UIButton! - - struct ViewModel { - let title: String - let ingredients: String - let price: String - } - - func setup(with viewModel: ViewModel) { - titleLabel.text = viewModel.title - ingredientsLabel.text = viewModel.ingredients - priceButton.setTitle(viewModel.price, for: .normal) - - isAccessibilityElement = true - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_8.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_8.swift deleted file mode 100644 index 50c3713..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_8.swift +++ /dev/null @@ -1,21 +0,0 @@ -class PizzaCell: UITableViewCell { - private var titleLabel: UILabel! - private var ingredientsLabel: UILabel! - private var priceButton: UIButton! - - struct ViewModel { - let title: String - let ingredients: String - let price: String - } - - func setup(with viewModel: ViewModel) { - titleLabel.text = viewModel.title - ingredientsLabel.text = viewModel.ingredients - priceButton.setTitle(viewModel.price, for: .normal) - - isAccessibilityElement = true - accessibilityLabel = viewModel.title - accessibilityValue = viewModel.ingredients - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_9.swift b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_9.swift deleted file mode 100644 index 054073f..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_9.swift +++ /dev/null @@ -1,21 +0,0 @@ -class PizzaCell: UITableViewCell { - private var titleLabel: UILabel! - private var ingredientsLabel: UILabel! - private var priceButton: UIButton! - - struct ViewModel { - let title: String - let ingredients: String - let price: String - } - - func setup(with viewModel: ViewModel) { - titleLabel.text = viewModel.title - ingredientsLabel.text = viewModel.ingredients - priceButton.setTitle(viewModel.price, for: .normal) - - isAccessibilityElement = true - accessibilityLabel = viewModel.title - accessibilityValue = viewModel.price + ", " + viewModel.ingredients - } -} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_9_preview.jpeg b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_9_preview.jpeg deleted file mode 100644 index a0d5df5..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/AdoptingCell/DescribeCell_9_preview.jpeg and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Chicken BBQ.PNG b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Chicken BBQ.PNG deleted file mode 100644 index 3962358..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Chicken BBQ.PNG and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/Switch Control Preview.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/Switch Control Preview.png deleted file mode 100644 index 27e410d..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/Switch Control Preview.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/SwitchControlOverview.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/SwitchControlOverview.png deleted file mode 100644 index e4848b9..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/SwitchControlOverview.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/Voice Control Preview.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/Voice Control Preview.png deleted file mode 100644 index ff03621..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/Voice Control Preview.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceControlOverview.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceControlOverview.png deleted file mode 100644 index b00f331..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceControlOverview.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOver Preview.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOver Preview.png deleted file mode 100644 index 6d6b726..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOver Preview.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOverDesigner.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOverDesigner.png deleted file mode 100644 index 45a2167..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOverDesigner.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOverDesigner~dark.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOverDesigner~dark.png deleted file mode 100644 index 10fd642..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOverDesigner~dark.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOverGestures.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOverGestures.png deleted file mode 100644 index b9ef2c5..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Covers/VoiceOverGestures.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Different technologies.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Different technologies.png deleted file mode 100644 index 4f619f2..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/Different technologies.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/ScreenAsTrackPad.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/ScreenAsTrackPad.png deleted file mode 100644 index 4bdf667..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/ScreenAsTrackPad.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/TraitsOrder.png b/Sources/AccessibilityDocumentation/Documentation.docc/Resources/TraitsOrder.png deleted file mode 100644 index 3b760a3..0000000 Binary files a/Sources/AccessibilityDocumentation/Documentation.docc/Resources/TraitsOrder.png and /dev/null differ diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Tutorials/Tutorial Table of Contents.tutorial b/Sources/AccessibilityDocumentation/Documentation.docc/Tutorials/Tutorial Table of Contents.tutorial deleted file mode 100644 index 85c65a7..0000000 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Tutorials/Tutorial Table of Contents.tutorial +++ /dev/null @@ -1,55 +0,0 @@ -@Tutorials(name: "How To Adapt an iOS Application") { - @Intro(title: "Just A Few Steps") { - - To make an application *accessible* for the *assistive technology* and therefore *allow* people with Accessibility Features enabled comfortably use it one doesn't have to do much. The *adaptation plan* is as simple as: - - 1. *Simplify* and *group* elements in the UI's hierarchy - 2. Add *labels* to elements - 3. Specify additional *properties* - - Yep, that's it. In other words **the adaption process is consisted of an optional *reconstructing* of already-existing elements' *order* and their *description* with some *properties* being *explicitly specified***. - - - } - - - @Volume(name: "Getting Started") { - @Chapter(name: "Adapting Cell") { - Simplifies navigation and control over a complex element for VoiceOver. - - @Image(source: "Chicken BBQ", alt: "Cell of Chicken BBQ with image, title, ingredients and price") - - @TutorialReference(tutorial: "doc:AdaptingCell") - } - - @Chapter(name: "Control Hierarchy") { - Also simplifies navigation and control over a complex element for VoiceOver. - - - - - } - } - - @Volume(name: "Climbing Higher") { - @Chapter(name: "Adjustable Elements") { - Simplifies navigation and control over a complex element for VoiceOver - - - - @TutorialReference(tutorial: "doc:AdjustableTutorial") - } - - @Chapter(name: "Tweak Visual Properties") { - Simplifies navigation and control over a complex element for VoiceOver - - - - - } - } - - @Comment { - // TODO: Update links - } -} diff --git a/Sources/AccessibilityDocumentation/SwiftUIView.swift b/Sources/AccessibilityDocumentation/SwiftUIView.swift deleted file mode 100644 index c8f08ef..0000000 --- a/Sources/AccessibilityDocumentation/SwiftUIView.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// SwiftUIView.swift -// -// -// Created by Mikhail Rubanov on 13.12.2023. -// - -import SwiftUI - -struct SwiftUIView: View { - var body: some View { - Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) - } -} - -#Preview { - SwiftUIView() -} diff --git a/Sources/AccessibilityDocumentation/UIAccessibility+Container.swift b/Sources/AccessibilityDocumentation/UIAccessibility+Container.swift deleted file mode 100644 index 556769c..0000000 --- a/Sources/AccessibilityDocumentation/UIAccessibility+Container.swift +++ /dev/null @@ -1,94 +0,0 @@ -import UIKit - -// -// UIAccessibilityContainer.h -// UIKit -// -// Copyright (c) 2016-2018 Apple Inc. All rights reserved. -// - -/** - UIAccessibilityContainer methods can be overridden to vend individual elements - that are managed by a single UIView. - - For example, a single UIView might draw several items that (to an - end user) have separate meaning and functionality. It is important to vend - each item as an individual accessibility element. - - Sub-elements of a container that are not represented by concrete UIView - instances (perhaps painted text or icons) can be represented using instances - of UIAccessibilityElement class (see UIAccessibilityElement.h). - - Accessibility containers MUST return NO to -isAccessibilityElement. - */ -public class AccessibilityContainer { - - - @MainActor open func accessibilityElementCount() -> Int { 0 } - - - @MainActor open func accessibilityElement(at index: Int) -> Any? { nil } - - - @MainActor open func index(ofAccessibilityElement element: Any) -> Int { 0 } - - - /// A list of container elements managed by the receiver. - /// This can be used as an alternative to implementing the dynamic methods. - /// default == nil - @available(iOS 8.0, *) - @MainActor open var accessibilityElements: [Any]? = nil - - - /// Some containers provide more context for accessibility elements, such as tables or lists. - /// Set this property so that assistive technologies can output more information. - /// default == UIAccessibilityContainerTypeNone - @available(iOS 11.0, *) - @MainActor open var accessibilityContainerType: UIAccessibilityContainerType = .none - - - /// An array of container elements similar to accessibilityElements but specific for automation. - /// This can be used to modify the children in the accessibility tree for automation. - /// If not set, automationElements will default first to accessibilityElements if it’s not an accessibility element. - /// If there are no accessibilityElements and the view is an accessibility element, it will return the list of subviews that have accessibilityIdentifier. - /// Otherwise, the default will be an empty array. - @available(iOS 17.0, *) - @MainActor open var automationElements: [Any]? = nil -} - -/** - The UIAccessibilityContainerDataTable and UIAccessibilityContainerDataTableCell protocols - convey more information specific to tables that contain structured data. - */ - -@available(iOS 11.0, *) -@MainActor public protocol UIAccessibilityContainerDataTableCell : NSObjectProtocol { - - - /// The row/column index + the row/column span. - /// default == { NSNotFound, 0 } - func accessibilityRowRange() -> NSRange - - func accessibilityColumnRange() -> NSRange -} - -@available(iOS 11.0, *) -@MainActor public protocol UIAccessibilityContainerDataTable : NSObjectProtocol { - - - /// Return the cell element for a specific row/column, including elements that span rows/columns. - /// default == nil - func accessibilityDataTableCellElement(forRow row: Int, column: Int) -> UIAccessibilityContainerDataTableCell? - - - func accessibilityRowCount() -> Int - - func accessibilityColumnCount() -> Int - - - /// Return header elements for a specific row or column. - /// default == nil - func accessibilityHeaderElements(forRow row: Int) -> [UIAccessibilityContainerDataTableCell]? - - func accessibilityHeaderElements(forColumn column: Int) -> [UIAccessibilityContainerDataTableCell]? -} diff --git a/Sources/AccessibilityDocumentation/UIAccessibility_.swift b/Sources/AccessibilityDocumentation/UIAccessibility_.swift deleted file mode 100644 index d41f380..0000000 --- a/Sources/AccessibilityDocumentation/UIAccessibility_.swift +++ /dev/null @@ -1,845 +0,0 @@ -import UIKit -import Foundation -// -// UIAccessibility.h -// UIKit -// -// Copyright (c) 2008-2018 Apple Inc. All rights reserved. -// - -/** - UIAccessibility is implemented on all standard UIKit views and controls so that assistive applications can present them to users with disabilities. - - Custom items in a user interface should override aspects of UIAccessibility - to supply details where the default value is incomplete. - - For example, a UIImageView subclass may need to override accessibilityLabel, - but it does not need to override accessibilityFrame. - - A completely custom subclass of UIView might need to override all of the - UIAccessibility methods except accessibilityFrame. - */ -public class Book { - - /** - Return YES if the receiver should be exposed as an accessibility element. - - Setting the property to YES will cause the receiver to be visible to assistive applications: VoiceOver will focus on this element to speak aloud it, Voice Control and Switch Control will focus is elements it intrectitve - - default == NO - default on UIKit controls == YES - - */ - open var isAccessibilityElement: Bool = false - - - /** - Short name for the element - - > Tip: Keep label as short as possible. Detail information should be placed to ``accessibilityValue`` - - If the element does not display text (an icon for example), this method - should return text that best labels the element. For example: "Play" could be used for - a button that is used to play music. "Play button" should not be used, since there is a trait - that identifies the control is a button. - default == nil - default on UIKit controls == derived from the title - Setting the property will change the label that is returned to the accessibility client. - - See for more detail - */ - open var accessibilityLabel: String? = nil - - - /** - The underlying attributed version of the accessibility label. Setting this property will change the - value of the accessibilityLabel property and vice-versa. - */ - @available(iOS 11.0, *) - @NSCopying open var accessibilityAttributedLabel: NSAttributedString? = nil - - - /** - Returns a localized string that describes the result of performing an action on the element, when the result is non-obvious. - The hint should be a brief phrase. - For example: "Purchases the item." or "Downloads the attachment." - default == nil - Setting the property will change the hint that is returned to the accessibility client. - */ - open var accessibilityHint: String? = nil - - - /** - The underlying attributed version of the accessibility hint. Setting this property will change the - value of the accessibilityHint property and vice-versa. - */ - @available(iOS 11.0, *) - @NSCopying open var accessibilityAttributedHint: NSAttributedString? = nil - - - /** - Returns a localized string that represents the value of the element, such as the value - of a slider or the text in a text field. - - > Important: Useful for VoiceOver only, not visible for Voice Control and Switch Control - - Value can vary for VoiceOver and be changed by vertical swipe. See for details - - Use only when the label of the element differs from a value. For example: A volume slider has a label of "Volume", but a value of "60%". - default == nil - default on UIKit controls == values for appropriate controls - Setting the property will change the value that is returned to the accessibility client. - */ - open var accessibilityValue: String? = nil - - - /** - The underlying attributed version of the accessibility value. Setting this property will change the - value of the accessibilityValue property and vice-versa. - */ - @available(iOS 11.0, *) - @NSCopying open var accessibilityAttributedValue: NSAttributedString? = nil - - - /** - Combination of accessibility traits that define controls behaviour - - See UIAccessibilityConstants.h for a list of traits. - When overriding this method, remember to combine your custom traits - with [super accessibilityTraits]. - default == UIAccessibilityTraitNone - default on UIKit controls == traits that best characterize individual controls. - Setting the property will change the traits that are returned to the accessibility client. - */ - open var accessibilityTraits: UIAccessibilityTraits_ = .none - - - /** - Returns the frame of the element *in screen coordinates.* - - VoiceOver and Switch Control uses it to draw focus. In opposite way by this property we can recognise what the element under user's finger. - - Voice Control draw badges over screen that is linked to element by this property. - - Use ``convertToScreenCoordinates(_:in:)-4i9mu`` to calculate onscreen values - - */ - open var accessibilityFrame: CGRect = .zero - - /** - Returns the path of the element in screen coordinates. - default == nil - Setting the property, or overriding the method, will cause the assistive technology to prefer the path over the accessibility. - frame when highlighting the element. - */ - @available(iOS 7.0, *) - @NSCopying open var accessibilityPath: UIBezierPath? = nil - - - // The accessibilityPath is expected to be in screen coordinates. - // To help convert the path to screen coordinates, use the following method. - // The path should exist in the view space of the UIView argument. - - /** - Returns the activation point for an accessible element in screen coordinates. - default == Mid-point of the accessibilityFrame. - */ - @available(iOS 5.0, *) - open var accessibilityActivationPoint: CGPoint = .zero - - - /** - Returns the language code that the element's label, value and hint should be spoken in. - If no language is set, the user's language is used. - The format for the language code should follow Internet BCP 47 for language tags. - For example, en-US specifies U.S. English. - default == nil - */ - open var accessibilityLanguage: String? = nil - - - /** - Marks all the accessible elements contained within as hidden. - - default == NO - */ - @available(iOS 5.0, *) - open var accessibilityElementsHidden: Bool = false - - - /** - Informs whether the receiving view should be considered modal by accessibility. If YES, then - elements outside this view will be ignored. Only elements inside this view will be exposed. - - > Tip: Support action to close modal view with special gesture. - - default == NO - */ - @available(iOS 5.0, *) - open var accessibilityViewIsModal: Bool = false - - - /** - Forces children elements to be grouped together regardless of their position on screen. Move focus to nearest element, not to the next by reading order. - - For example, your app may show items that are meant to be grouped together in vertical columns. - By default, VoiceOver will navigate those items in horizontal rows. If shouldGroupAccessibilityChildren is set on - a parent view of the items in the vertical column, VoiceOver will navigate the order correctly. - - default == NO - */ - @available(iOS 6.0, *) - open var shouldGroupAccessibilityChildren: Bool = false - - - /** - Some assistive technologies allow the user to select a parent view or container to navigate its elements. - This property allows an app to specify whether that behavior should apply to the receiver. - Currently, this property only affects Switch Control, not VoiceOver or other assistive technologies. - See UIAccessibilityConstants.h for the list of supported values. - default == UIAccessibilityNavigationStyleAutomatic - */ - @available(iOS 8.0, *) - open var accessibilityNavigationStyle: UIAccessibilityNavigationStyle = .automatic - - - /** - Returns whether the element performs an action based on user interaction. - For example, a button that causes UI to update when it is tapped should return YES. - A label whose only purpose is to display information should return NO. - default == derived from other accessibility properties (for example, an element with UIAccessibilityTraitNotEnabled returns NO) - */ - @available(iOS 13.0, *) - open var accessibilityRespondsToUserInteraction: Bool = false - - - /** - Returns the localized label(s) that should be provided by the user to refer to this element. - Use this property when the accessibilityLabel is not appropriate for dictated or typed input. - For example, an element that contains additional descriptive information in its accessibilityLabel can return a more concise label. - The primary label should be first in the array, optionally followed by alternative labels in descending order of importance. - If this property returns an empty or invalid value, the accessibilityLabel will be used instead. - default == an empty array - default on UIKit controls == an array with an appropriate label, if different from accessibilityLabel - */ - @available(iOS 13.0, *) - open var accessibilityUserInputLabels: [String]! = [] - - - /** - The underlying attributed versions of the accessibility user input label(s). - Setting this property will change the value of the accessibilityUserInputLabels property and vice versa. - */ - @available(iOS 13.0, *) - open var accessibilityAttributedUserInputLabels: [NSAttributedString]! = [] - - - /** - Returns an appropriate, named context to help identify and classify the type of text inside this element. - This can be used by assistive technologies to choose an appropriate way to output the text. - For example, when encountering a source coding context, VoiceOver could choose to speak all punctuation. - To specify a substring within the textual context, use the UIAccessibilityTextAttributeContext attributed key. - default == nil - */ - @available(iOS 13.0, *) - open var accessibilityTextualContext: UIAccessibilityTextualContext? = nil - - - // Configure how VoiceOver interacts with direct touch areas. - @available(iOS 17.0, *) - open var accessibilityDirectTouchOptions: UIAccessibility.DirectTouchOptions = .requiresActivation - - - /** - Block based setters take precedence over single line setters (i.e setAccessibilityLabel:(NSString *)) and property overrides (i.e. accessibilityLabel). - These methods require the block to have a specific return type that corresponds to the attribute's type. - Each of these block based setters have a corresponding accessibility property. - See the notes for the property for more specific information about that property. - */ - - // Basic accessibility - @available(iOS 17.0, *) - open var isAccessibilityElementBlock: AXBoolReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityLabelBlock: AXStringReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityValueBlock: AXStringReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityHintBlock: AXStringReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityTraitsBlock: AXTraitsReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityIdentifierBlock: AXStringReturnBlock? - - - // Defining accessibility text and language - @available(iOS 17.0, *) - open var accessibilityHeaderElementsBlock: AXArrayReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityAttributedLabelBlock: AXAttributedStringReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityAttributedHintBlock: AXAttributedStringReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityLanguageBlock: AXStringReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityTextualContextBlock: AXTextualContextReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityUserInputLabelsBlock: AXStringArrayReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityAttributedUserInputLabelsBlock: AXAttributedStringArrayReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityAttributedValueBlock: AXAttributedStringReturnBlock? - - - // Configuring behavior - @available(iOS 17.0, *) - open var accessibilityElementsHiddenBlock: AXBoolReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityRespondsToUserInteractionBlock: AXBoolReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityViewIsModalBlock: AXBoolReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityShouldGroupAccessibilityChildrenBlock: AXBoolReturnBlock? - - - // Navigating elements - @available(iOS 17.0, *) - open var accessibilityElementsBlock: AXArrayReturnBlock? - - @available(iOS 17.0, *) - open var automationElementsBlock: AXArrayReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityContainerTypeBlock: AXContainerTypeReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityActivationPointBlock: AXPointReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityFrameBlock: AXRectReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityNavigationStyleBlock: AXNavigationStyleReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityPathBlock: AXPathReturnBlock? - - - // Actions - @available(iOS 17.0, *) - open var accessibilityActivateBlock: AXBoolReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityIncrementBlock: AXVoidReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityDecrementBlock: AXVoidReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityPerformEscapeBlock: AXBoolReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityMagicTapBlock: AXBoolReturnBlock? - - @available(iOS 17.0, *) - open var accessibilityCustomActionsBlock: AXCustomActionsReturnBlock? - - @available(iOS 7.0, *) - public static func convertToScreenCoordinates(_ rect: CGRect, in view: UIView) -> CGRect { fatalError() } - - @available(iOS 7.0, *) - public static func convertToScreenCoordinates(_ path: UIBezierPath, in view: UIView) -> UIBezierPath { fatalError() } - - - /** - UIAccessibilityFocus - - Assistive technologies, like VoiceOver, maintain a virtual focus on an element - that allows the user to inspect an element without activating it. - */ - - // Override the following methods to know when an assistive technology has set or unset its virtual focus on the element. - - // Returns whether an assistive technology is focused on the element. - - // Returns a set of identifier keys indicating which technology is focused on this object - - // Returns the element that is currently focused by an assistive technology. - // default = nil. - // Pass in a specific identifier (e.g. UIAccessibilityNotificationVoiceOverIdentifier) in order to choose the focused element for a specific product. - // If no argument is used, the function will returned the element that was most recently focused. - @available(iOS 9.0, *) - public static func focusedElement(using assistiveTechnologyIdentifier: UIAccessibility.AssistiveTechnologyIdentifier?) -> Any? { fatalError() } - - - /** - UIAccessibilityAction - - An element should implement methods in this category if it supports the action. - */ - - /** - Implement accessibilityActivate on an element in order to handle the default action. - For example, if a native control requires a swipe gesture, you may implement this method so that a - VoiceOver user will perform a double-tap to activate the item. - If your implementation successfully handles activate, return YES, otherwise return NO. - default == NO - */ - - /** - If an element has the UIAccessibilityTraitAdjustable trait, it must also implement - the following methods. Incrementing will adjust the element so that it increases its content, - while decrementing decreases its content. For example, accessibilityIncrement will increase the value - of a UISlider, and accessibilityDecrement will decrease the value. - */ - - /** - If an element has the UIAccessibilityTraitSupportsZoom trait, it must also implement - the following methods. The point is the center point in the coordinate space of the - corresponding view. For example, if an element allows an expand gesture that modifies the - view in some way, you may implement accessibilityZoomInAtPoint so that VoiceOver's zoom in - custom action will receive the same behavior. If your implementation successfully handles - zooming, return YES, otherwise return NO. - default == NO - */ - - /** - If the user interface requires a scrolling action (e.g. turning the page of a book), a view in the view - hierarchy should implement the following method. The return result indicates whether the action - succeeded for that direction. If the action failed, the method will be called on a view higher - in the hierarchy. If the action succeeds, UIAccessibilityPageScrolledNotification must be posted after - the scrolling completes. - default == NO - */ - - /** - Implement accessibilityPerformEscape on an element or containing view to exit a modal or hierarchical interface view. - For example, UIPopoverController implements accessibilityPerformEscape on it's root view, so that when - called (as a result of a VoiceOver user action), it dismisses the popover. - If your implementation successfully dismisses the current UI, return YES, otherwise return NO. - default == NO - */ - - /** - Implement accessibilityPerformMagicTap on an element, or the application, in order to provide a context-sensitive action. - For example, a music player can implement this to start and stop playback, or a recording app could start and stop recording. - Return YES to indicate that the action was handled. - default == NO - */ - - /** - Return an array of UIAccessibilityCustomAction objects to make custom actions for an element accessible to an assistive technology. - For example, a photo app might have a view that deletes its corresponding photo in response to a flick gesture. - If the view returns a delete action from this property, VoiceOver and Switch Control users will be able to delete photos without performing the flick gesture. - default == nil - */ - - /** - UIAccessibilityReadingContent - - Implemented on an element that represents content meant to be read, like a book or periodical. - Use in conjunction with UIAccessibilityTraitCausesPageTurn to provide a continuous reading experience with VoiceOver. - */ - - // Returns the line number given a point in the view's coordinate space. - - // Returns the content associated with a line number as a string. - - // Returns the on-screen rectangle for a line number. - - // Returns a string representing the text displayed on the current page. - - // If an object adopting this protocol responds to these methods, the system will try sending them before sending the non-attributed versions. - - /** By default, if an accessible view or its subtree has drag and/or drop interactions, they will be - * automatically exposed by assistive technologies. However, if there is more than one such - * interaction, each drag or drop should have a name to disambiguate it and give a good user - * experience. Also, there may be situations in which you want to expose drags or drops from an - * element, and those interactions are installed on views that are not part of that element's view - * hierarchy subtree. - * - * This is trivially the case when the element is not a view at all, but an instance of - * UIAccessibilityElement. - * - * Another example is when a container view maintains interactions that are logically - * associated with subviews. For instance, UITableView has associated drag interactions that allow - * for dragging its rows; to make the rows draggable by assistive technologies, UITableViewCell has - * drag descriptors that describe where in the table view to start a drag to activate dragging of - * the cell. - * (Note that this implementation detail is noted here for expository purposes only and may change - * at any time without warning.) - * - * Properties defined here allow you to fine-tune how drags and drops are exposed to assistive - * technologies. Both of their getter methods can be overridden to provide information on-demand. - * For each location descriptor, the associated view should be the UIView with the appropriate - * UIInteraction object for that drag or drop. - * - * `accessibilityDragSourceDescriptors` is an array of UIAccessibilityLocationDescriptor - * objects and is used to define and describe what drags are available from an element. - * - * `accessibilityDropPointDescriptors` is similarly an array of - * UIAccessibilityLocationDescriptor objects and is used to define and describe where - * drops are possible on this element. - * - * To restore the default automatic behavior for these properties, assign (or return) the default - * value of nil. Note that nil does not describe the same behavior as the empty array, which - * specifies that there are no relevant interactions for this element. - * - */ - - /** - UIAccessibilityPostNotification - - This function posts a notification to assistive applications. - Some notifications specify a required or optional argument. - Pass nil for the argument if the notification does not specify otherwise. - See UIAccessibilityConstants.h for a list of notifications. - */ - public static func post(notification: UIAccessibility.Notification, argument: Any?) {} - - - /** - Assistive Technology - - Use UIAccessibilityIsVoiceOverRunning() to determine if VoiceOver is running. - Listen for UIAccessibilityVoiceOverStatusDidChangeNotification to know when VoiceOver starts or stops. - */ - @available(iOS 4.0, *) - public static var isVoiceOverRunning: Bool { false } - - - @available(iOS 11.0, *) - public static let voiceOverStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether system audio is mixed down from stereo to mono. - @available(iOS 5.0, *) - public static var isMonoAudioEnabled: Bool { false } - - - @available(iOS 5.0, *) - public static let monoAudioStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for closed captioning is enabled. - @available(iOS 5.0, *) - public static var isClosedCaptioningEnabled: Bool { false } - - - @available(iOS 5.0, *) - public static let closedCaptioningStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for invert colors is enabled. - @available(iOS 6.0, *) - public static var isInvertColorsEnabled: Bool { false } - - - @available(iOS 6.0, *) - public static let invertColorsStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the app is running under Guided Access mode. - @available(iOS 6.0, *) - public static var isGuidedAccessEnabled: Bool { false } - - - @available(iOS 6.0, *) - public static let guidedAccessStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for bold text is enabled - @available(iOS 8.0, *) - public static var isBoldTextEnabled: Bool { false } - - - @available(iOS 8.0, *) - public static let boldTextStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for button shapes is enabled - @available(iOS 14.0, *) - public static var buttonShapesEnabled: Bool { false } - - - @available(iOS 14.0, *) - public static let buttonShapesEnabledStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for grayscale is enabled - @available(iOS 8.0, *) - public static var isGrayscaleEnabled: Bool { false } - - - @available(iOS 8.0, *) - public static let grayscaleStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for reduce transparency is enabled - @available(iOS 8.0, *) - public static var isReduceTransparencyEnabled: Bool { false } - - - @available(iOS 8.0, *) - public static let reduceTransparencyStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for reduce motion is enabled - @available(iOS 8.0, *) - public static var isReduceMotionEnabled: Bool { false } - - - @available(iOS 8.0, *) - public static let reduceMotionStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for reduce motion: prefer cross-fade transitions is enabled - @available(iOS 14.0, *) - public static var prefersCrossFadeTransitions: Bool { false } - - - @available(iOS 14.0, *) - public static let prefersCrossFadeTransitionsStatusDidChange: NSNotification.Name = .init("") - - - /// Returns whether the system preference for auto-play videos is enabled - @available(iOS 13.0, *) - public static var isVideoAutoplayEnabled: Bool { false } - - - @available(iOS 13.0, *) - public static let videoAutoplayStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for darker colors is enabled - @available(iOS 8.0, *) - public static var isDarkerSystemColorsEnabled: Bool { false } - - - @available(iOS 8.0, *) - public static let darkerSystemColorsStatusDidChangeNotification: NSNotification.Name = .init("") - - - /** - Use UIAccessibilityIsSwitchControlRunning() to determine if Switch Control is running. - Listen for UIAccessibilitySwitchControlStatusDidChangeNotification to know when Switch Control starts or stops. - */ - @available(iOS 8.0, *) - public static var isSwitchControlRunning: Bool { false } - - - @available(iOS 8.0, *) - public static let SwitchControlStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for Speak Selection is enabled - @available(iOS 8.0, *) - public static var isSpeakSelectionEnabled: Bool { false } - - - @available(iOS 8.0, *) - public static let speakSelectionStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for Speak Screen is enabled - @available(iOS 8.0, *) - public static var isSpeakScreenEnabled: Bool { false } - - - @available(iOS 8.0, *) - public static let speakScreenStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for Shake to Undo is enabled - @available(iOS 9.0, *) - public static var isShakeToUndoEnabled: Bool { false } - - - @available(iOS 9.0, *) - public static let shakeToUndoDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for AssistiveTouch is enabled. - /// This always returns false if Guided Access is not enabled. - @available(iOS 10.0, *) - public static var isAssistiveTouchRunning: Bool { false } - - - @available(iOS 10.0, *) - public static let assistiveTouchStatusDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for Differentiate without Color is enabled. - @available(iOS 13.0, *) - public static var shouldDifferentiateWithoutColor: Bool { false } - - - @available(iOS 13.0, *) - public static let differentiateWithoutColorDidChangeNotification: NSNotification.Name = .init("") - - - /// Returns whether the system preference for On/Off labels is enabled. - @available(iOS 13.0, *) - public static var isOnOffSwitchLabelsEnabled: Bool { false } - - - @available(iOS 13.0, *) - public static let onOffSwitchLabelsDidChangeNotification: NSNotification.Name = .init("") - - - /** - Use UIAccessibilityRequestGuidedAccessSession() to request this app be locked into or released - from Single App mode. The request to lock this app into Single App mode will only succeed if the device is Supervised, - and the app's bundle identifier has been whitelisted using Mobile Device Management. If you successfully request Single - App mode, it is your responsibility to release the device by balancing this call. - */ -// @available(iOS 7.0, *) -// public static func requestGuidedAccessSession(enabled enable: Bool, completionHandler: @escaping (Bool) -> Void) -// -// -// @available(iOS 10.0, *) -// public struct HearingDeviceEar : OptionSet, @unchecked Sendable { -// -// public init(rawValue: UInt) -// -// -// public static var left: UIAccessibility.HearingDeviceEar { get } -// -// public static var right: UIAccessibility.HearingDeviceEar { get } -// -// public static var both: UIAccessibility.HearingDeviceEar { get } -// } -// -// -// // Returns the current pairing status of MFi hearing aids -// @available(iOS 10.0, *) -// public static var hearingDevicePairedEar: UIAccessibility.HearingDeviceEar { get } - - - @available(iOS 10.0, *) - public static let hearingDevicePairedEarDidChangeNotification: NSNotification.Name = .init("") - -//public typealias AXBoolReturnBlock = () -> Bool -//public typealias AXStringReturnBlock = () -> String? -//public typealias AXStringArrayReturnBlock = () -> [String]? -//public typealias AXAttributedStringReturnBlock = () -> NSAttributedString? -//public typealias AXAttributedStringArrayReturnBlock = () -> [NSAttributedString]? -//public typealias AXRectReturnBlock = () -> CGRect -//public typealias AXPathReturnBlock = () -> UIBezierPath? -//public typealias AXPointReturnBlock = () -> CGPoint -//public typealias AXObjectReturnBlock = () -> Any? -//public typealias AXArrayReturnBlock = () -> [Any]? -//public typealias AXVoidReturnBlock = () -> Void -//public typealias AXTraitsReturnBlock = () -> UIAccessibilityTraits_ -//public typealias AXNavigationStyleReturnBlock = () -> UIAccessibilityNavigationStyle -//public typealias AXContainerTypeReturnBlock = () -> UIAccessibilityContainerType -//public typealias AXTextualContextReturnBlock = () -> UIAccessibilityTextualContext? -//public typealias AXCustomActionsReturnBlock = () -> [UIAccessibilityCustomAction]? -//extension NSObject { -// -// @available(iOS 4.0, *) -// open func accessibilityElementDidBecomeFocused() -// -// @available(iOS 4.0, *) -// open func accessibilityElementDidLoseFocus() -// -// @available(iOS 4.0, *) -// open func accessibilityElementIsFocused() -> Bool -// -// @available(iOS 9.0, *) -// open func accessibilityAssistiveTechnologyFocusedIdentifiers() -> Set? - - @available(iOS 7.0, *) - open func accessibilityActivate() -> Bool { false } - - @available(iOS 4.0, *) - open func accessibilityIncrement() -> Bool { false } - - @available(iOS 4.0, *) - open func accessibilityDecrement() -> Bool { false } - - @available(iOS 17.0, *) - open func accessibilityZoomIn(at point: CGPoint) -> Bool { false } - - @available(iOS 17.0, *) - open func accessibilityZoomOut(at point: CGPoint) -> Bool { false } - - @available(iOS 4.2, *) - open func accessibilityScroll(_ direction: UIAccessibilityScrollDirection) -> Bool { false } - - - /// Is called when user perform special closing gesture. VoiceOver calls this after drawing N-symbol by two finger. - /// - /// See for more details - /// - /// - Returns: `true` if this class handles gestures. If `false` UIKit will traverse firstResponders for next element that can handle this gesture - @available(iOS 5.0, *) - open func accessibilityPerformEscape() -> Bool { false } - - @available(iOS 6.0, *) - open func accessibilityPerformMagicTap() -> Bool { false } - - @available(iOS 8.0, *) - open var accessibilityCustomActions: [UIAccessibilityCustomAction]? = [] -} -//public enum UIAccessibilityScrollDirection : Int, @unchecked Sendable { -// -// case right = 1 -// -// case left = 2 -// -// case up = 3 -// -// case down = 4 -// -// @available(iOS 5.0, *) -// case next = 5 -// -// @available(iOS 5.0, *) -// case previous = 6 -//} -//public protocol UIAccessibilityReadingContent { -// -// @available(iOS 5.0, *) -// func accessibilityLineNumber(for point: CGPoint) -> Int -// -// @available(iOS 5.0, *) -// func accessibilityContent(forLineNumber lineNumber: Int) -> String? -// -// @available(iOS 5.0, *) -// func accessibilityFrame(forLineNumber lineNumber: Int) -> CGRect -// -// @available(iOS 5.0, *) -// func accessibilityPageContent() -> String? -// -// @available(iOS 11.0, *) -// optional func accessibilityAttributedContent(forLineNumber lineNumber: Int) -> NSAttributedString? -// -// @available(iOS 11.0, *) -// optional func accessibilityAttributedPageContent() -> NSAttributedString? -//} -//extension NSObject { -// -// @available(iOS 11.0, *) -// open var accessibilityDragSourceDescriptors: [UIAccessibilityLocationDescriptor]? -// -// @available(iOS 11.0, *) -// open var accessibilityDropPointDescriptors: [UIAccessibilityLocationDescriptor]? -//} -//@available(iOS, introduced: 4.0, deprecated: 11.0, renamed: "UIAccessibility.voiceOverStatusDidChangeNotification") -//public let UIAccessibilityVoiceOverStatusChanged: String diff --git a/Sources/iOSAccessibilityHandbook/File.swift b/Sources/iOSAccessibilityHandbook/File.swift new file mode 100644 index 0000000..8874864 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/File.swift @@ -0,0 +1,8 @@ +// +// File.swift +// +// +// Created by admin on 04.02.2024. +// + +import Foundation diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/AccessibilityAdaption.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/AccessibilityAdaption.md new file mode 100644 index 0000000..096ae94 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/AccessibilityAdaption.md @@ -0,0 +1,3 @@ +# πŸ”’ Accessibility Adaption + +Nothing here yet! diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/AdaptionStrategy.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/AdaptionStrategy.tutorial new file mode 100644 index 0000000..9a30e04 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/AdaptionStrategy.tutorial @@ -0,0 +1,152 @@ +@Tutorials(name: "AdaptionStrategy") { + @Intro(title: "iOS Applications Accessibility Adaption Guide") { + Here is the **roadmap** of what one can do to make their app *accessible*. + + ### Essentiality + The *level of importance* β€” whether an enhancement is **basic** or **advanced** β€” decided by its requirement for assistive technologies to *simply* function. To make the accessible experience more *delightful* some **additional tinkering** has to be done. + + ### Familiarity + If you are not familiar with the topic, see the **introductory pages**. + + @Links(visualStyle: detailedGrid) { + - + - + } + + Otherwise you may start straight from the first guide or a tutorial of your particular interest β€” the separeted materials are *self-sufficient* and their cohesion is decorative. + } + + @Volume(name: "Making Accessibility Work") { + + Here are the guides about implementing *essential* for assistive technology to function features. + + @Image(source: placeholder-image.png, alt: "") + + @Chapter(name: "Alternative Description") { + @Image(source: chapter-placeholder.png, alt: "") + + Accompany visuals with a verbose description so people who are unable to see can experience the content too. + + @TutorialReference(tutorial: "doc:AlternativeDescription") + } + + @Chapter(name: "Colors And Shapes") { + @Image(source: chapter-placeholder.png, alt: "") + + Follow specific guidelines to make your GUI easy to comprehend. + + @TutorialReference(tutorial: "doc:ColorsAndShapes") + } + + @Chapter(name: "Describe Elements") { + @Image(source: chapter-placeholder.png, alt: "") + + Provide a detailed description to everything so assistive technologies know how to deal with them. + + @TutorialReference(tutorial: "doc:DescribeElements") + } + + + @Chapter(name: "Adapt Cells") { + @Image(source: chapter-placeholder.png, alt: "") + + Re-structure complex collections that way so it is easier to navigate between them. + + @TutorialReference(tutorial: "doc:AdaptCells") + } + + @Chapter(name: "On-Screen Navigation") { + @Image(source: chapter-placeholder.png, alt: "") + + Adapt navigation within a screen for Accessibility Features. + + @TutorialReference(tutorial: "doc:On-ScreenNavigation") + } + + @Chapter(name: "Between-Screens Navigation") { + @Image(source: chapter-placeholder.png, alt: "") + + See how navigation between screens can be implemented. + + @TutorialReference(tutorial: "doc:Between-ScreensNavigation") + } + + @Chapter(name: "Charts") { + @Image(source: chapter-placeholder.png, alt: "") + + Your application displays statistics and you are afraid that charts is an inaccessible case of representation? You will be surprised. + + @TutorialReference(tutorial: "doc:Charts") + } + } + + @Volume(name: "Advanced Adaption Techniques") { + + The tutorials here are dedicated to making the *experience* of Accessibility Features users more **comfortable** and **immersive**. + + @Image(source: placeholder-image.png, alt: "") + + @Chapter(name: "Vertical Swipes") { + @Image(source: chapter-placeholder.png, alt: "") + + Placeholder text here. I have no fucking idea what is this. + + @TutorialReference(tutorial: "doc:VerticalSwipes") + } + + @Chapter(name: "Rotor") { + @Image(source: chapter-placeholder.png, alt: "") + + Rotor is the thing you turn with two fingers. + + @TutorialReference(tutorial: "doc:Rotor") + } + + @Chapter(name: "Adjustable Elements") { + @Image(source: chapter-placeholder.png, alt: "") + + Ugh... + + @TutorialReference(tutorial: "doc:AdjustableElements") + } + + @Chapter(name: "Specific Properties") { + @Image(source: chapter-placeholder.png, alt: "") + + No idea really. + + @TutorialReference(tutorial: "doc:SpecificProperties") + } + } + + @Volume(name: "What's Next?") { + + Additional resources expanding on the topic of Accessibility and its integration to design, development and production. + + @Image(source: placeholder-image.png, alt: "") + + @Chapter(name: "Design") { + @Image(source: chapter-placeholder.png, alt: "") + + How to design accessible apps. + + @TutorialReference(tutorial: "doc:AccessibleDesign") + } + + @Chapter(name: "Testing") { + @Image(source: chapter-placeholder.png, alt: "") + + How to test accessible apps. + + @TutorialReference(tutorial: "doc:AccessibilityQA") + } + + @Chapter(name: "Activism") { + @Image(source: chapter-placeholder.png, alt: "") + + Burn some shit in front of your пСнсионный Ρ„ΠΎΠ½Π΄. + + @TutorialReference(tutorial: "doc:AccessibilityActivism") + } + } +} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Tutorials/2. Advanced/AdjustableTutorial.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/AdjustableElements/AdjustableElements.tutorial similarity index 100% rename from Sources/AccessibilityDocumentation/Documentation.docc/Tutorials/2. Advanced/AdjustableTutorial.tutorial rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/AdjustableElements/AdjustableElements.tutorial diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/2. Advanced/AdjustableElements.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/AdjustableElements/aAdjustableElements.md similarity index 99% rename from Sources/AccessibilityDocumentation/Documentation.docc/Articles/2. Advanced/AdjustableElements.md rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/AdjustableElements/aAdjustableElements.md index 9b8046d..b4cb2a6 100644 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/2. Advanced/AdjustableElements.md +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/AdjustableElements/aAdjustableElements.md @@ -62,4 +62,3 @@ var accessibilityTraits: UIAccessibilityTraits { See tutorial - diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/2. Advanced/Rotor.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/AdvancedTechniques.md similarity index 83% rename from Sources/AccessibilityDocumentation/Documentation.docc/Articles/2. Advanced/Rotor.md rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/AdvancedTechniques.md index 6b26cb8..f5c6428 100644 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/2. Advanced/Rotor.md +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/AdvancedTechniques.md @@ -1,4 +1,4 @@ -# Rotor +# πŸ”’ Enhancing Accessible Experience Summary diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/Rotor/Rotor.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/Rotor/Rotor.tutorial new file mode 100644 index 0000000..bbc610a --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/Rotor/Rotor.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 30) { + @Intro(title: "πŸ”’ Custom Actions With Rotor") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/SpecificProperties/SpecificProperties.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/SpecificProperties/SpecificProperties.tutorial new file mode 100644 index 0000000..5bb6657 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/SpecificProperties/SpecificProperties.tutorial @@ -0,0 +1,30 @@ +@Tutorial(time: 20) { + @Intro(title: "πŸ”’ I Do Not Know Neither Does Mikhail Rubanov") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} + diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/VerticalSwipes/VerticalSwipes.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/VerticalSwipes/VerticalSwipes.tutorial new file mode 100644 index 0000000..9e2ba84 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/VerticalSwipes/VerticalSwipes.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 15) { + @Intro(title: "πŸ”’ I Do Not Know Neither Does Mikhail Rubanov") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/2. Advanced/VerticalSwipe.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/VerticalSwipes/aVerticalSwipes.md similarity index 100% rename from Sources/AccessibilityDocumentation/Documentation.docc/Articles/2. Advanced/VerticalSwipe.md rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Advanced/VerticalSwipes/aVerticalSwipes.md diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Tutorials/1. Basic/AdaptingCell.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/AdaptCells/AdaptCells.tutorial similarity index 99% rename from Sources/AccessibilityDocumentation/Documentation.docc/Tutorials/1. Basic/AdaptingCell.tutorial rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/AdaptCells/AdaptCells.tutorial index fb82fdf..22eb466 100644 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Tutorials/1. Basic/AdaptingCell.tutorial +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/AdaptCells/AdaptCells.tutorial @@ -1,5 +1,5 @@ -@Tutorial(time: 10) { - @Intro(title: "Adapting Cell") { +@Tutorial(time: 20) { + @Intro(title: "πŸ”’ Simplifying Cells' Structure") { To have **Accessibility Features** work as intented sometimes it is needed to **simplify complex cells** to such degree so there is no difference for accessibility features between *differentiated abstractions* that are stored in cells. diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/AlternativeDescription/AlternativeDescription.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/AlternativeDescription/AlternativeDescription.tutorial new file mode 100644 index 0000000..c6b3eb0 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/AlternativeDescription/AlternativeDescription.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 15) { + @Intro(title: "πŸ”’ Providing Description For Visual Elements") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/Between-ScreensNavigation/Between-ScreensNavigation.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/Between-ScreensNavigation/Between-ScreensNavigation.tutorial new file mode 100644 index 0000000..e7fb6fa --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/Between-ScreensNavigation/Between-ScreensNavigation.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 20) { + @Intro(title: "πŸ”’ Navigation Between Screens") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/Charts/Charts.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/Charts/Charts.tutorial new file mode 100644 index 0000000..0075b77 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/Charts/Charts.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 20) { + @Intro(title: "πŸ”’ Making Charts Accessible") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/ColorsAndShapes/ColorsAndShapes.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/ColorsAndShapes/ColorsAndShapes.tutorial new file mode 100644 index 0000000..8296437 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/ColorsAndShapes/ColorsAndShapes.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 15) { + @Intro(title: "πŸ”’ Accessible Colors And Shapes") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/ControlHierarchy/ControlHierarchy.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/ControlHierarchy/ControlHierarchy.tutorial new file mode 100644 index 0000000..c3df1c1 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/ControlHierarchy/ControlHierarchy.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 20) { + @Intro(title: "πŸ”’ I Do Not Know") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/ControlHierarchy.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/ControlHierarchy/aControlHierarchy.md similarity index 100% rename from Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/ControlHierarchy.md rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/ControlHierarchy/aControlHierarchy.md diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/DescribeElements/DescribeElements.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/DescribeElements/DescribeElements.tutorial new file mode 100644 index 0000000..6e1f995 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/DescribeElements/DescribeElements.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 15) { + @Intro(title: "πŸ”’ Elements Described For Assistive Technology") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/DescribeElements.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/DescribeElements/aDescribeElements.md similarity index 100% rename from Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/DescribeElements.md rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/DescribeElements/aDescribeElements.md diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/Navigation.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/Miscallenous/Navigation.md similarity index 100% rename from Sources/AccessibilityDocumentation/Documentation.docc/Articles/1. Basic/Navigation.md rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/Miscallenous/Navigation.md diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/On-ScreenNavigation/OnScreen-Navigation.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/On-ScreenNavigation/OnScreen-Navigation.tutorial new file mode 100644 index 0000000..acfb95e --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/AdaptionTechniques/Essentials/On-ScreenNavigation/OnScreen-Navigation.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 15) { + @Intro(title: "πŸ”’ Navigation Within A Screen") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures.md new file mode 100644 index 0000000..bc1569b --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures.md @@ -0,0 +1,3 @@ +# πŸ”’ Accessibility Features + +Nothing here yet! diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/AssistiveTouch/AssistiveTouch.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/AssistiveTouch/AssistiveTouch.md new file mode 100644 index 0000000..b6447fb --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/AssistiveTouch/AssistiveTouch.md @@ -0,0 +1,3 @@ +# πŸ”’ AssistiveTouch + +Nothing here yet! diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/DynamicType/DynamicType.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/DynamicType/DynamicType.md new file mode 100644 index 0000000..217c2b8 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/DynamicType/DynamicType.md @@ -0,0 +1,4 @@ +# πŸ”’ Dynamic Type + +Nothing here yet! + diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/GuidedAccess/GuidedAccess.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/GuidedAccess/GuidedAccess.md new file mode 100644 index 0000000..4e48ba8 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/GuidedAccess/GuidedAccess.md @@ -0,0 +1,4 @@ +# πŸ”’ Guided Access + +Nothing here yet! + diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/0. AssistiveTechnologies/SwitchControl.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/SwitchControl/SwitchControl.md similarity index 100% rename from Sources/AccessibilityDocumentation/Documentation.docc/Articles/0. AssistiveTechnologies/SwitchControl.md rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/SwitchControl/SwitchControl.md diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/0. AssistiveTechnologies/VoiceControl.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/VoiceControl/VoiceControl.md similarity index 99% rename from Sources/AccessibilityDocumentation/Documentation.docc/Articles/0. AssistiveTechnologies/VoiceControl.md rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/VoiceControl/VoiceControl.md index 91099a1..222f9b4 100644 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/0. AssistiveTechnologies/VoiceControl.md +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/VoiceControl/VoiceControl.md @@ -15,4 +15,3 @@ Adds additional commands over graphical UI to control a phone by voice commands. ![Voice Control modes: with labels, enumerated elements or grid](VoiceControlOverview) [Video how to use Voice Control](https://www.youtube.com/watch?v=eg22JaZWAgs) - diff --git a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/0. AssistiveTechnologies/VoiceOver.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/VoiceOver/VoiceOver.md similarity index 99% rename from Sources/AccessibilityDocumentation/Documentation.docc/Articles/0. AssistiveTechnologies/VoiceOver.md rename to Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/VoiceOver/VoiceOver.md index 7e452e1..1fd93ef 100644 --- a/Sources/AccessibilityDocumentation/Documentation.docc/Articles/0. AssistiveTechnologies/VoiceOver.md +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/AccessibilityFeatures/VoiceOver/VoiceOver.md @@ -14,4 +14,3 @@ Helps blind or low-visioned persons to use a phone by listening audio descriptio ![VoiceOver gestures](VoiceOverGestures) [Video how to navigate by VoiceOver](https://www.youtube.com/watch?v=qDm7GiKra28) - diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/UIFrameworks.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/UIFrameworks.md new file mode 100644 index 0000000..7e2425f --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/UIFrameworks.md @@ -0,0 +1,4 @@ +# πŸ”’ Accessibility in UIKit and SwiftUI + +## UI Frameworks Differences + diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/iOSAccessibility.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/iOSAccessibility.md new file mode 100644 index 0000000..36ab237 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/Introduction/iOSAccessibility.md @@ -0,0 +1,3 @@ +# πŸ”’ iOS Accessibility + +Nothing here yet! diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Activism/AccessibilityActivism.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Activism/AccessibilityActivism.tutorial new file mode 100644 index 0000000..d2d5f51 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Activism/AccessibilityActivism.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 10) { + @Intro(title: "πŸ”’ I Want Accessibility To Be Considered") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Design/AccessibleDesign.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Design/AccessibleDesign.tutorial new file mode 100644 index 0000000..fbbd0e6 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Design/AccessibleDesign.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 20) { + @Intro(title: "πŸ”’ Making Products Accessible From The Beginning") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Processes.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Processes.md new file mode 100644 index 0000000..70772c7 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Processes.md @@ -0,0 +1,4 @@ +# πŸ”’ Processes + +Nothing here yet! + diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Testing/AccessibilityQA.tutorial b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Testing/AccessibilityQA.tutorial new file mode 100644 index 0000000..6e93f03 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/Processes/Testing/AccessibilityQA.tutorial @@ -0,0 +1,29 @@ +@Tutorial(time: 20) { + @Intro(title: "πŸ”’ Making Sure That Your App is Accessible") { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Section(title: "<#text#>") { + @ContentAndMedia { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Steps { + @Step { + <#text#> + + @Image(source: <#file#>, alt: "<#accessible description#>") + } + + @Step { + <#text#> + + @Code(name: "<#display name#>", file: <#filename.swift#>) + } + } + } +} diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/WhatsNext.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/WhatsNext.md new file mode 100644 index 0000000..d9691d7 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/WhatsNext/WhatsNext.md @@ -0,0 +1,3 @@ +# πŸ”’ What's Next? + +Nothing here yet! diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/iOSAccessibilityHandbook.md b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/iOSAccessibilityHandbook.md new file mode 100644 index 0000000..24a7ea0 --- /dev/null +++ b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Pages/iOSAccessibilityHandbook.md @@ -0,0 +1,99 @@ +# ``iOSAccessibilityHandbook`` + +Make your iOS application accessible for everyone with help of interactive guides. + +@Metadata { + @DisplayName("iOS Accessibility Handbook") + @PageImage( + purpose: icon, + source: "icon", + alt: "") + @PageColor(blue) +} + +## β€” What is this? + +iOS Accessibility Handbook is an open-source **educational project** about making iOS applications *accessible*. Accessible application is such application that works with various *assistive technologies*, such as [VoiceOver](https://www.apple.com/accessibility/voiceover), [Voice Control](https://support.apple.com/en-us/HT210417) and [Switch Control](https://support.apple.com/en-us/HT201370), which enable *people with disabilities* use the application. + +@Image(source: placeholder-image.png, alt: "") + + +### Interactive Learning +This handbook provides *extended documentation* for Accessibility Features, including verbose *articles* on the topic, interactive *guides* to follow step-by-step and various media that cover **everything one could ever need to know about accessibility on iOS**. + +@Image(source: placeholder-image.png, alt: "") + + +### Target Audience +The project is dedicated to help *developers*, *designers*, *researchers* and so on β€” in other words, to *everyone working with accessibility* on iOS. There is **no commercial underlayment** and the only reason the project exists is to popularise the topic and to *share* relevant real-life experience of contributing *accessibility experts*. + +@Image(source: placeholder-image.png, alt: "") + + +### Featured +@Links(visualStyle: detailedGrid) { + - + - +} + +## β€” How does it work? + +The handbook is somewhat of a *complete course* of **how to make iOS applications accessible** regardless of the stage of its development. The material is split into conceptual *topics* and categorised by its relation to particular assistive technologies and levels of *importance*. + +To know more about the book's structure scroll down to the bottom of the page where table of contents is. + +### Technical Implementation +At the moment the project's form is defined by being a *documentation catalog* ([DocC](https://www.swift.org/documentation/docc)) hosted by [GitHub pages](https://pages.github.com). + +To contribute to the project visit its [GitHub page](https://github.com/VODGroup/AccessibilityDocumentation) and see the instruction of how one may help. + +### Contributors +The resources are provided by **Mikhail Rubanov**, Head of Mobile Development at [Dodo Brands](https://dodobrands.io), accesisibility activist and the author of [Β«About Accesibility on iOSΒ»]( https://rubanov.dev/a11y-book) book. Examplary and illustrative materials are based on his *working experience*. +@Image(source: "aboutAccessibility-sample", alt: "-") + +### VoiceOver Designer +Reading the book you may sometimes notice screenshots of iOS applications with *mark-ups* related to accessibility design over them. This is [VoiceOver Designer](https://rubanov.dev/voice-over-designer), an [open-source](https://github.com/VODGroup/VoiceOverDesigner) macOS application that allows to design *accessibility scenarios* over a screenshot of an app. +![Screenshot of VoiceOver Designer](https://rubanov.dev/voice-over-designer/images/HeaderLight.png) + + +## Topics +### General Knowledge +- +- + +### Assistive Technology +- +- +- +- +- +- + +### Accessibility In Code +- +- + +### Adapting Strategy +- + +### Essential Implementations +- +- +- +- +- +- +- + +### Greater Accessible Experience +- + +### Advanced Techniques +- +- +- +- + +### What's Next? +- +- diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/chapter-placeholder~dark@2x.png b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/chapter-placeholder~dark@2x.png new file mode 100644 index 0000000..13b34c0 Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/chapter-placeholder~dark@2x.png differ diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/chapter-placeholder~light@2x.png b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/chapter-placeholder~light@2x.png new file mode 100644 index 0000000..b237cda Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/chapter-placeholder~light@2x.png differ diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder-image@2x.png b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder-image@2x.png new file mode 100644 index 0000000..934497d Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder-image@2x.png differ diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder-image~dark@2x.png b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder-image~dark@2x.png new file mode 100644 index 0000000..03b9718 Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder-image~dark@2x.png differ diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder-video.mp4 b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder-video.mp4 new file mode 100644 index 0000000..6719fe6 Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder-video.mp4 differ diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder~dark@2x.png b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder~dark@2x.png new file mode 100644 index 0000000..7e32851 Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder~dark@2x.png differ diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder~light@2x.png b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder~light@2x.png new file mode 100644 index 0000000..5b5494f Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/placeholder~light@2x.png differ diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/tutorial-placeholder@2x.png b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/tutorial-placeholder@2x.png new file mode 100644 index 0000000..540fe60 Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Placeholders/tutorial-placeholder@2x.png differ diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Screenshots/aboutAccessibility-sample~dark.png b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Screenshots/aboutAccessibility-sample~dark.png new file mode 100644 index 0000000..19121a9 Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Screenshots/aboutAccessibility-sample~dark.png differ diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Screenshots/aboutAccessibility-sample~light.png b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Screenshots/aboutAccessibility-sample~light.png new file mode 100644 index 0000000..ae59cae Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/Screenshots/aboutAccessibility-sample~light.png differ diff --git a/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/icon@2x.png b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/icon@2x.png new file mode 100644 index 0000000..ed46f43 Binary files /dev/null and b/Sources/iOSAccessibilityHandbook/iOSAccessibilityHandbook.docc/Resources/icon@2x.png differ