From 5761095eadc9f3d94354f6b95f878f0e41ecbb65 Mon Sep 17 00:00:00 2001 From: Pavel Holec Date: Wed, 22 Nov 2023 11:53:28 +0100 Subject: [PATCH 1/5] Create Textarea component and update documentation for both text input components --- Sources/Orbit/Components/InputField.swift | 58 ++-- Sources/Orbit/Components/Select.swift | 3 +- Sources/Orbit/Components/Textarea.swift | 154 ++++++++++ .../Components/Extensions/InputField.md | 19 +- .../Components/Extensions/Textarea.md | 45 +++ .../InputContentButtonStyle.swift | 10 +- .../InputFieldBeginEditingActionKey.swift | 16 +- .../InputFieldEndEditingActionKey.swift | 16 +- .../InputFieldReturnActionKey.swift | 14 +- ...FieldShouldChangeCharactersActionKey.swift | 20 +- .../InputFieldShouldReturnActionKey.swift | 14 +- .../Orbit/Support/Forms/InputContent.swift | 3 - .../TextFields/InsetableTextField.swift | 2 +- .../TextFields/InsetableTextView.swift | 77 +++++ .../Orbit/Support/TextFields/TextField.swift | 8 +- .../TextFields/TextFieldBuildable.swift | 85 +++++- .../TextFields/TextFieldCoordinator.swift | 145 ++++++--- .../Orbit/Support/TextFields/TextView.swift | 283 ++++++++++++++++++ .../Components/TextareaTests.swift | 9 + component-status.yaml | 2 + 20 files changed, 847 insertions(+), 136 deletions(-) create mode 100644 Sources/Orbit/Components/Textarea.swift create mode 100644 Sources/Orbit/Orbit.docc/Components/Extensions/Textarea.md create mode 100644 Sources/Orbit/Support/TextFields/InsetableTextView.swift create mode 100644 Sources/Orbit/Support/TextFields/TextView.swift create mode 100644 Tests/SnapshotTests/Components/TextareaTests.swift diff --git a/Sources/Orbit/Components/InputField.swift b/Sources/Orbit/Components/InputField.swift index 78a012e1323..7f2f8361887 100644 --- a/Sources/Orbit/Components/InputField.swift +++ b/Sources/Orbit/Components/InputField.swift @@ -1,14 +1,39 @@ import SwiftUI import UIKit -/// Also known as textbox. Offers users a simple input for a form. +/// Orbit component that offers a simple text input. The component is an equivalent of the native `TextField` component. /// -/// When you have additional information or helpful examples, include prompt text to help users along. +/// The InputField is created with an optional label and a binding to a string value. +/// +/// ```swift +/// InputField("Label", value: $email, prompt: "E-mail") +/// .keyboardType(.emailAddress) +/// .returnKeyType(.done) +/// .focused($isEmailFocused) +/// .inputFieldReturnAction { +/// // Action after the value is submitted +/// } +/// ``` +/// +/// For secure version, the `passwordStrength` hint can be provided. +/// +/// ```swift +/// InputField( +/// "Password", +/// value: $password, +/// isSecure: true, +/// passwordStrength: passwordStrength, +/// message: .help("Must be at least 8 characters long") +/// ) +/// ``` /// -/// The custom Orbit version of ``TextField`` component is used internally. +/// The component uses a custom ``TextField`` component (implemented using `UITextField`) that represents the native `TextField`. +/// +/// ### Layout +/// +/// The component expands horizontally. /// /// - Note: [Orbit definition](https://orbit.kiwi/components/inputfield/) -/// - Important: Component expands horizontally unless prevented by `fixedSize` modifier. public struct InputField: View, TextFieldBuildable { @Environment(\.inputFieldBeginEditingAction) private var inputFieldBeginEditingAction @@ -50,8 +75,7 @@ public struct InputField: View, TextFieldBuildable { state: state, label: compactLabel, message: message, - isFocused: isFocused, - isPlaceholder: value.isEmpty + isFocused: isFocused ) { textField } prefix: { @@ -131,18 +155,11 @@ public struct InputField: View, TextFieldBuildable { public extension InputField { - /// Creates Orbit InputField component. - /// - /// The keyboard related modifiers can be used directly on this component to modify the keyboard behaviour: - /// - `autocapitalization()` - /// - `autocorrectionDisabled()` - /// - `keyboardType()` - /// - `textContentType()` + /// Creates Orbit ``InputField`` component. /// /// - Parameters: - /// - message: Optional message below the InputField. + /// - message: Optional message below the text field. /// - messageHeight: Binding to the current height of the optional message. - /// - suffixAction: Optional action when suffix icon is tapped. init( _ label: String = "", value: Binding, @@ -173,18 +190,11 @@ public extension InputField { } } - /// Creates Orbit InputField component with custom prefix or suffix. - /// - /// The keyboard related modifiers can be used directly on this component to modify the keyboard behaviour: - /// - `autocapitalization()` - /// - `autocorrectionDisabled()` - /// - `keyboardType()` - /// - `textContentType()` + /// Creates Orbit ``InputField`` component with custom prefix or suffix. /// /// - Parameters: - /// - message: Optional message below the InputField. + /// - message: Optional message below the text field. /// - messageHeight: Binding to the current height of the optional message. - /// - suffixAction: Optional action when suffix icon is tapped. init( _ label: String = "", value: Binding, diff --git a/Sources/Orbit/Components/Select.swift b/Sources/Orbit/Components/Select.swift index 3e4408e176c..be3574cd08c 100644 --- a/Sources/Orbit/Components/Select.swift +++ b/Sources/Orbit/Components/Select.swift @@ -49,8 +49,7 @@ public struct Select: View { InputContentButtonStyle( state: state, label: compactLabel, - message: message, - isPlaceholder: value == nil + message: message ) { prefix .accessibility(.selectPrefix) diff --git a/Sources/Orbit/Components/Textarea.swift b/Sources/Orbit/Components/Textarea.swift new file mode 100644 index 00000000000..a76814d012a --- /dev/null +++ b/Sources/Orbit/Components/Textarea.swift @@ -0,0 +1,154 @@ +import SwiftUI +import UIKit + +/// Orbit component that offers multiline text input. The component is an equivalent of the native `TextField` component with vertical axis specified. +/// +/// The Textarea is created with an optional label and a binding to a string value. +/// +/// ```swift +/// Textarea("Label", value: $text, prompt: "Description") +/// .focused($isDescriptionFocused) +/// .inputFieldReturnAction { +/// // Action after the value is submitted +/// } +/// .frame(height: 200) +/// ``` +/// +/// The component uses a custom ``TextView`` component (implemented using `UITextView`) that represents the native `TextField`. +/// +/// ### Layout +/// +/// The component expands horizontally and vertically, unless limited by a `frame` modifier. +/// +/// - Note: [Orbit definition](https://orbit.kiwi/components/input/textarea/) +public struct Textarea: View, TextFieldBuildable { + + @Environment(\.inputFieldBeginEditingAction) private var inputFieldBeginEditingAction + @Environment(\.inputFieldEndEditingAction) private var inputFieldEndEditingAction + @Environment(\.isEnabled) private var isEnabled + @Environment(\.sizeCategory) private var sizeCategory + + @State private var isFocused: Bool = false + + private let label: String + @Binding private var value: String + private let prompt: String + private let state: InputState + + private let message: Message? + @Binding private var messageHeight: CGFloat + + // Builder properties (keyboard related) + var autocapitalizationType: UITextAutocapitalizationType = .none + var isAutocorrectionDisabled: Bool? = false + var keyboardType: UIKeyboardType = .default + var returnKeyType: UIReturnKeyType = .default + var textContentType: UITextContentType? + var shouldDeleteBackwardAction: (String) -> Bool = { _ in true } + + public var body: some View { + FieldWrapper(label, message: message, messageHeight: $messageHeight) { + InputContent(state: state, message: message, isFocused: isFocused) { + textView + } + } + } + + @ViewBuilder var textView: some View { + TextView( + value: $value, + prompt: prompt, + insets: .init( + top: .small, + left: .small, + bottom: .small, + right: .small + ) + ) + .returnKeyType(returnKeyType) + .autocorrectionDisabled(isAutocorrectionDisabled) + .keyboardType(keyboardType) + .textContentType(textContentType) + .autocapitalization(autocapitalizationType) + .shouldDeleteBackwardAction(shouldDeleteBackwardAction) + .accessibility(label: .init(label)) + .inputFieldBeginEditingAction { + isFocused = true + inputFieldBeginEditingAction() + } + .inputFieldEndEditingAction { + isFocused = false + inputFieldEndEditingAction() + } + } +} + +// MARK: - Inits +public extension Textarea { + + /// Creates Orbit ``Textarea`` component. + /// + /// - Parameters: + /// - message: Optional message below the text field. + /// - messageHeight: Binding to the current height of the optional message. + init( + _ label: String = "", + value: Binding, + prompt: String = "", + state: InputState = .default, + message: Message? = nil, + messageHeight: Binding = .constant(0) + ) { + self.label = label + self._value = value + self.prompt = prompt + self.state = state + self.message = message + self._messageHeight = messageHeight + } +} + +// MARK: - Previews +struct TextareaPreviews: PreviewProvider { + + static let prompt = "Enter \(String(repeating: "values ", count: 20))" + + static var previews: some View { + PreviewWrapper { + standalone + layout + } + .previewLayout(.sizeThatFits) + } + + static var standalone: some View { + textarea + .padding(.medium) + .previewDisplayName() + } + + static var layout: some View { + VStack(alignment: .leading, spacing: .medium) { + textarea + + StateWrapper("") { $value in + Textarea(value: $value, prompt: prompt) + .frame(height: 100) + } + + HStack(alignment: .top, spacing: .medium) { + textarea + textarea + } + } + .padding(.medium) + .previewDisplayName() + } + + static var textarea: some View { + StateWrapper(prompt) { $value in + Textarea("Label", value: $value, prompt: prompt) + .frame(height: 100) + } + } +} diff --git a/Sources/Orbit/Orbit.docc/Components/Extensions/InputField.md b/Sources/Orbit/Orbit.docc/Components/Extensions/InputField.md index aef5d530f31..048b16bd319 100644 --- a/Sources/Orbit/Orbit.docc/Components/Extensions/InputField.md +++ b/Sources/Orbit/Orbit.docc/Components/Extensions/InputField.md @@ -6,12 +6,14 @@ ## Topics -### UITextField delegation +### Input and event modifiers +- ``disabled(_:)`` - ``inputFieldBeginEditingAction(_:)-2n7iu`` - ``inputFieldBeginEditingAction(_:)-63rdh`` - ``inputFieldEndEditingAction(_:)-1p8ux`` - ``inputFieldEndEditingAction(_:)-3vtzf`` +- ``inputFieldFocus(_:)`` - ``inputFieldReturnAction(_:)-4p3ne`` - ``inputFieldReturnAction(_:)-8ukhl`` - ``inputFieldShouldReturnAction(_:)-82nse`` @@ -20,11 +22,24 @@ - ``inputFieldShouldChangeCharactersAction(_:)-7xzq2`` - ``InputFieldShouldChangeResult`` -### UITextField components +### Managing text entry + +- ``autocapitalization(_:)-6ecdh`` +- ``autocorrectionDisabled(_:)-7sz54`` +- ``keyboardType(_:)-1uu7i`` +- ``returnKeyType(_:)`` +- ``shouldDeleteBackwardAction(_:)`` +- ``textContentType(_:)-4ng7o`` + +### UIKit components - ``TextField`` - ``InsetableTextField`` ### Customizing Appearance +- ``textColor(_:)`` +- ``textFontWeight(_:)`` +- ``textSize(_:)`` +- ``textSize(custom:)`` - ``InputLabelStyle`` diff --git a/Sources/Orbit/Orbit.docc/Components/Extensions/Textarea.md b/Sources/Orbit/Orbit.docc/Components/Extensions/Textarea.md new file mode 100644 index 00000000000..918dc1dfbba --- /dev/null +++ b/Sources/Orbit/Orbit.docc/Components/Extensions/Textarea.md @@ -0,0 +1,45 @@ +# ``Orbit/Textarea`` + +@Metadata { + @DocumentationExtension(mergeBehavior: append) +} + +## Topics + +### Input and event modifiers + +- ``disabled(_:)`` +- ``inputFieldBeginEditingAction(_:)-6qvc9`` +- ``inputFieldBeginEditingAction(_:)-4935w`` +- ``inputFieldEndEditingAction(_:)-238ir`` +- ``inputFieldEndEditingAction(_:)-38zwl`` +- ``inputFieldFocus(_:)`` +- ``inputFieldReturnAction(_:)-2dxhj`` +- ``inputFieldReturnAction(_:)-4sxsc`` +- ``inputFieldShouldReturnAction(_:)-7ydww`` +- ``inputFieldShouldReturnAction(_:)-8trm2`` +- ``inputFieldShouldChangeCharactersAction(_:)-6g5c3`` +- ``inputFieldShouldChangeCharactersAction(_:)-50iz2`` +- ``InputFieldShouldChangeResult`` + +### Managing text entry + +- ``autocapitalization(_:)-9k9yh`` +- ``autocorrectionDisabled(_:)-4x1d6`` +- ``keyboardType(_:)-7khza`` +- ``returnKeyType(_:)`` +- ``shouldDeleteBackwardAction(_:)`` +- ``textContentType(_:)-6etk6`` + +### UIKit components + +- ``TextView`` +- ``InsetableTextView`` + +### Customizing Appearance + +- ``textColor(_:)`` +- ``textFontWeight(_:)`` +- ``textSize(_:)`` +- ``textSize(custom:)`` +- ``InputLabelStyle`` diff --git a/Sources/Orbit/Support/ButtonStyles/InputContentButtonStyle.swift b/Sources/Orbit/Support/ButtonStyles/InputContentButtonStyle.swift index 3746137535b..455a3b77a4e 100644 --- a/Sources/Orbit/Support/ButtonStyles/InputContentButtonStyle.swift +++ b/Sources/Orbit/Support/ButtonStyles/InputContentButtonStyle.swift @@ -1,13 +1,12 @@ import SwiftUI -/// Button style for Orbit ``InputField`` and similar input components that share common layout with a prefix and suffix. +/// Button style for Orbit input components that share common layout with a prefix and suffix. public struct InputContentButtonStyle: ButtonStyle { private let state: InputState private let label: String private let message: Message? private let isFocused: Bool - private let isPlaceholder: Bool @ViewBuilder private let prefix: Prefix @ViewBuilder private let suffix: Suffix @@ -17,8 +16,7 @@ public struct InputContentButtonStyle: ButtonStyle { label: label, message: message, isPressed: configuration.isPressed, - isFocused: isFocused, - isPlaceholder: isPlaceholder + isFocused: isFocused ) { configuration.label } prefix: { @@ -28,13 +26,12 @@ public struct InputContentButtonStyle: ButtonStyle { } } - /// Create button style for Orbit ``InputField`` and similar input components. + /// Create button style for Orbit input components. public init( state: InputState = .default, label: String = "", message: Message? = nil, isFocused: Bool = false, - isPlaceholder: Bool = false, @ViewBuilder prefix: () -> Prefix = { EmptyView() }, @ViewBuilder suffix: () -> Suffix = { EmptyView() } ) { @@ -42,7 +39,6 @@ public struct InputContentButtonStyle: ButtonStyle { self.label = label self.message = message self.isFocused = isFocused - self.isPlaceholder = isPlaceholder self.prefix = prefix() self.suffix = suffix() } diff --git a/Sources/Orbit/Support/Environment Keys/InputFieldBeginEditingActionKey.swift b/Sources/Orbit/Support/Environment Keys/InputFieldBeginEditingActionKey.swift index fe98a4f97e2..0953324523b 100644 --- a/Sources/Orbit/Support/Environment Keys/InputFieldBeginEditingActionKey.swift +++ b/Sources/Orbit/Support/Environment Keys/InputFieldBeginEditingActionKey.swift @@ -10,14 +10,14 @@ struct InputFieldBeginEditingIdentifiableActionKey: EnvironmentKey { public extension EnvironmentValues { - /// An Orbit `textFieldDidBeginEditing` action for `InputField` stored in a view’s environment. + /// An Orbit `textFieldDidBeginEditing` action for text fields stored in a view’s environment. @available(iOS, deprecated: 15.0, message: "Use native @FocusState to manage focus for Orbit text fields") var inputFieldBeginEditingAction: () -> Void { get { self[InputFieldBeginEditingActionKey.self] } set { self[InputFieldBeginEditingActionKey.self] = newValue } } - /// An Orbit `textFieldDidBeginEditing` action for an identifiable `InputField` stored in a view’s environment. + /// An Orbit `textFieldDidBeginEditing` action for an identifiable text field stored in a view’s environment. @available(iOS, deprecated: 15.0, message: "Use native @FocusState to manage focus for Orbit text fields") var inputFieldBeginEditingIdentifiableAction: (AnyHashable) -> Void { get { self[InputFieldBeginEditingIdentifiableActionKey.self] } @@ -27,22 +27,22 @@ public extension EnvironmentValues { public extension View { - /// Set the `textFieldDidBeginEditing` action for Orbit `InputField`. + /// Set the `textFieldDidBeginEditing` action for Orbit text fields. /// /// - Parameters: - /// - action: A handler that is executed when the user starts editing `InputField` inside the view hierarchy. + /// - action: A handler that is executed when the user starts editing text field inside the view hierarchy. @available(iOS, deprecated: 15.0, renamed: "onChange(_:)", message: "Use native @FocusState in combination with `onChange` to monitor focus changes of Orbit text fields") func inputFieldBeginEditingAction(_ action: @escaping () -> Void) -> some View { environment(\.inputFieldBeginEditingAction, action) } - /// Set the `textFieldDidBeginEditing` action for Orbit identifiable `InputField`. + /// Set the `textFieldDidBeginEditing` action for Orbit identifiable text fields. /// - /// Mark the associated Orbit InputField with `identifier()` modifier to set its identity. + /// Mark the associated Orbit text field with `identifier()` modifier to set its identity. /// /// - Parameters: - /// - action: A handler that is executed when the user starts editing an identifiable `InputField` inside the view hierarchy. - /// The action parameter specifies the identifier of the `InputField`. + /// - action: A handler that is executed when the user starts editing an identifiable text field inside the view hierarchy. + /// The action parameter specifies the identifier of the text field. @available(iOS, deprecated: 15.0, renamed: "onChange(_:)", message: "Use native @FocusState in combination with `onChange` to monitor focus changes of Orbit text fields") func inputFieldBeginEditingAction(_ action: @escaping (AnyHashable) -> Void) -> some View { environment(\.inputFieldBeginEditingIdentifiableAction, action) diff --git a/Sources/Orbit/Support/Environment Keys/InputFieldEndEditingActionKey.swift b/Sources/Orbit/Support/Environment Keys/InputFieldEndEditingActionKey.swift index f965a10ab56..2c4ae904d2a 100644 --- a/Sources/Orbit/Support/Environment Keys/InputFieldEndEditingActionKey.swift +++ b/Sources/Orbit/Support/Environment Keys/InputFieldEndEditingActionKey.swift @@ -10,14 +10,14 @@ struct InputFieldEndEditingIdentifiableActionKey: EnvironmentKey { public extension EnvironmentValues { - /// An Orbit `textFieldDidEndEditing` action for `InputField` stored in a view’s environment. + /// An Orbit `textFieldDidEndEditing` action for text fields stored in a view’s environment. @available(iOS, deprecated: 15.0, message: "Use native @FocusState to manage focus for Orbit text fields") var inputFieldEndEditingAction: () -> Void { get { self[InputFieldEndEditingActionKey.self] } set { self[InputFieldEndEditingActionKey.self] = newValue } } - /// An Orbit `textFieldDidEndEditing` action for an identifiable `InputField` stored in a view’s environment. + /// An Orbit `textFieldDidEndEditing` action for an identifiable text field stored in a view’s environment. @available(iOS, deprecated: 15.0, message: "Use native @FocusState to manage focus for Orbit text fields") var inputFieldEndEditingIdentifiableAction: (AnyHashable) -> Void { get { self[InputFieldEndEditingIdentifiableActionKey.self] } @@ -27,22 +27,22 @@ public extension EnvironmentValues { public extension View { - /// Set the `textFieldDidEndEditing` action for Orbit `InputField`. + /// Set the `textFieldDidEndEditing` action for Orbit text fields. /// /// - Parameters: - /// - action: A handler that is executed after the user ends editing `InputField` inside the view hierarchy. + /// - action: A handler that is executed after the user ends editing text field inside the view hierarchy. @available(iOS, deprecated: 15.0, renamed: "onChange(_:)", message: "Use native @FocusState in combination with `onChange` to monitor focus changes of Orbit text fields") func inputFieldEndEditingAction(_ action: @escaping () -> Void) -> some View { environment(\.inputFieldEndEditingAction, action) } - /// Set the `textFieldDidEndEditing` action for Orbit identifiable `InputField`. + /// Set the `textFieldDidEndEditing` action for Orbit identifiable text fields. /// - /// Mark the associated Orbit InputField with `identifier()` modifier to set its identity. + /// Mark the associated Orbit text field with `identifier()` modifier to set its identity. /// /// - Parameters: - /// - action: A handler that is executed after the user ends editing a specific identifiable `InputField` inside the view hierarchy. - /// The action parameter specifies the identifier of the `InputField`. + /// - action: A handler that is executed after the user ends editing a specific identifiable text field inside the view hierarchy. + /// The action parameter specifies the identifier of the text field. @available(iOS, deprecated: 15.0, renamed: "onChange(_:)", message: "Use native @FocusState in combination with `onChange` to monitor focus changes of Orbit text fields") func inputFieldEndEditingAction(_ action: @escaping (AnyHashable) -> Void) -> some View { environment(\.inputFieldEndEditingIdentifiableAction, action) diff --git a/Sources/Orbit/Support/Environment Keys/InputFieldReturnActionKey.swift b/Sources/Orbit/Support/Environment Keys/InputFieldReturnActionKey.swift index 2c718d88f83..6c71e9833ec 100644 --- a/Sources/Orbit/Support/Environment Keys/InputFieldReturnActionKey.swift +++ b/Sources/Orbit/Support/Environment Keys/InputFieldReturnActionKey.swift @@ -10,13 +10,13 @@ struct InputFieldReturnIdentifiableActionKey: EnvironmentKey { public extension EnvironmentValues { - /// An Orbit `inputFieldReturnAction` action for `InputField` stored in a view’s environment. + /// An Orbit `inputFieldReturnAction` action for text fields stored in a view’s environment. var inputFieldReturnAction: () -> Void { get { self[InputFieldReturnActionKey.self] } set { self[InputFieldReturnActionKey.self] = newValue } } - /// An Orbit `inputFieldReturnIdentifiableAction` action for identifiable `InputField` stored in a view’s environment. + /// An Orbit `inputFieldReturnIdentifiableAction` action for identifiable text field stored in a view’s environment. var inputFieldReturnIdentifiableAction: (AnyHashable) -> Void { get { self[InputFieldReturnIdentifiableActionKey.self] } set { self[InputFieldReturnIdentifiableActionKey.self] = newValue } @@ -25,20 +25,20 @@ public extension EnvironmentValues { public extension View { - /// Set the `textFieldReturn` action for Orbit `InputField`. + /// Set the `textFieldReturn` action for Orbit text fields. /// /// - Parameters: - /// - action: A handler that is executed immediately after keyboard Return action for the `InputField` inside the view hierarchy. + /// - action: A handler that is executed immediately after keyboard Return action for the text field inside the view hierarchy. func inputFieldReturnAction(_ action: @escaping () -> Void) -> some View { environment(\.inputFieldReturnAction, action) } - /// Set the `textFieldReturn` action for Orbit identifiable `InputField`. + /// Set the `textFieldReturn` action for Orbit identifiable text fields. /// - /// Mark the associated Orbit InputField with `identifier()` modifier to set its identity. + /// Mark the associated Orbit text field with `identifier()` modifier to set its identity. /// /// - Parameters: - /// - action: A handler that is executed immediately after keyboard Return action for the identifiable `InputField` inside the view hierarchy. + /// - action: A handler that is executed immediately after keyboard Return action for the identifiable text field inside the view hierarchy. func inputFieldReturnAction(_ action: @escaping (AnyHashable) -> Void) -> some View { environment(\.inputFieldReturnIdentifiableAction, action) } diff --git a/Sources/Orbit/Support/Environment Keys/InputFieldShouldChangeCharactersActionKey.swift b/Sources/Orbit/Support/Environment Keys/InputFieldShouldChangeCharactersActionKey.swift index 86d7ff92b59..af91ac9aa11 100644 --- a/Sources/Orbit/Support/Environment Keys/InputFieldShouldChangeCharactersActionKey.swift +++ b/Sources/Orbit/Support/Environment Keys/InputFieldShouldChangeCharactersActionKey.swift @@ -10,13 +10,13 @@ struct InputFieldShouldChangeCharactersIdentifiableActionKey: EnvironmentKey { public extension EnvironmentValues { - /// An Orbit `textField(shouldChangeCharactersIn:)` action for `InputField` stored in a view’s environment. + /// An Orbit `textField(shouldChangeCharactersIn:)` action for text fields stored in a view’s environment. var inputFieldShouldChangeCharactersAction: ((NSString, NSRange, String) -> InputFieldShouldChangeResult)? { get { self[InputFieldShouldChangeCharactersActionKey.self] } set { self[InputFieldShouldChangeCharactersActionKey.self] = newValue } } - /// An Orbit `textField(shouldChangeCharactersIn:)` action for `InputField` stored in a view’s environment. + /// An Orbit `textField(shouldChangeCharactersIn:)` action for identifiable text field stored in a view’s environment. var inputFieldShouldChangeCharactersIdentifiableAction: ((AnyHashable, NSString, NSRange, String) -> InputFieldShouldChangeResult)? { get { self[InputFieldShouldChangeCharactersIdentifiableActionKey.self] } set { self[InputFieldShouldChangeCharactersIdentifiableActionKey.self] = newValue } @@ -25,24 +25,24 @@ public extension EnvironmentValues { public extension View { - /// Set the `textField(shouldChangeCharactersIn:)` action for Orbit `InputField`. + /// Set the `textField(shouldChangeCharactersIn:)` action for Orbit text fields. /// /// - Parameters: - /// - action: A handler that is executed for `InputField` inside the view hierarchy when deciding whether to change the specified text. + /// - action: A handler that is executed for text fields inside the view hierarchy when deciding whether to change the specified text. /// Parameters follow the `textField(shouldChangeCharactersIn:)` method - `(textField.text, range, replacementString)`. - /// A return value specifies whether the changes should be accepted and if not, whether the InputField value should be replaced with provided modified value. + /// A return value specifies whether the changes should be accepted and if not, whether the text field value should be replaced with provided modified value. func inputFieldShouldChangeCharactersAction(_ action: @escaping (NSString, NSRange, String) -> InputFieldShouldChangeResult) -> some View { environment(\.inputFieldShouldChangeCharactersAction, action) } - /// Set the `textField(shouldChangeCharactersIn:)` action for Orbit identifiable `InputField`. + /// Set the `textField(shouldChangeCharactersIn:)` action for Orbit identifiable text fields. /// - /// Mark the associated Orbit InputField with `identifier()` modifier to set its identity. + /// Mark the associated Orbit text field with `identifier()` modifier to set its identity. /// /// - Parameters: - /// - action: A handler that is executed for identifiable `InputField` inside the view hierarchy when deciding whether to change the specified text. - /// The first parameter is an InputField identifier. The rest of parameters follow the `textField(shouldChangeCharactersIn:)` method - `(textField.text, range, replacementString)`. - /// A return value specifies whether the changes should be accepted and if not, whether the InputField value should be replaced with provided modified value. + /// - action: A handler that is executed for identifiable text fields inside the view hierarchy when deciding whether to change the specified text. + /// The first parameter is a text field identifier. The rest of parameters follow the `textField(shouldChangeCharactersIn:)` method - `(textField.text, range, replacementString)`. + /// A return value specifies whether the changes should be accepted and if not, whether the text field value should be replaced with provided modified value. func inputFieldShouldChangeCharactersAction(_ action: @escaping (AnyHashable, NSString, NSRange, String) -> InputFieldShouldChangeResult) -> some View { environment(\.inputFieldShouldChangeCharactersIdentifiableAction, action) } diff --git a/Sources/Orbit/Support/Environment Keys/InputFieldShouldReturnActionKey.swift b/Sources/Orbit/Support/Environment Keys/InputFieldShouldReturnActionKey.swift index 06336962be9..b08cc11b01b 100644 --- a/Sources/Orbit/Support/Environment Keys/InputFieldShouldReturnActionKey.swift +++ b/Sources/Orbit/Support/Environment Keys/InputFieldShouldReturnActionKey.swift @@ -10,13 +10,13 @@ struct InputFieldShouldReturnIdentifiableActionKey: EnvironmentKey { public extension EnvironmentValues { - /// An Orbit `textFieldShouldReturn` action for `InputField` stored in a view’s environment. + /// An Orbit `textFieldShouldReturn` action for text fields stored in a view’s environment. var inputFieldShouldReturnAction: (() -> Bool)? { get { self[InputFieldShouldReturnActionKey.self] } set { self[InputFieldShouldReturnActionKey.self] = newValue } } - /// An Orbit `textFieldShouldReturn` action for identifiable `InputField` stored in a view’s environment. + /// An Orbit `textFieldShouldReturn` action for identifiable text field stored in a view’s environment. var inputFieldShouldReturnIdentifiableAction: ((AnyHashable) -> Bool)? { get { self[InputFieldShouldReturnIdentifiableActionKey.self] } set { self[InputFieldShouldReturnIdentifiableActionKey.self] = newValue } @@ -25,20 +25,20 @@ public extension EnvironmentValues { public extension View { - /// Set the `textFieldShouldReturn` action for Orbit `InputField`. + /// Set the `textFieldShouldReturn` action for Orbit text fields. /// /// - Parameters: - /// - action: A handler that is executed to ask whether to process the pressing of the Return button for the `InputField` inside the view hierarchy. + /// - action: A handler that is executed to ask whether to process the pressing of the Return button for text fields inside the view hierarchy. func inputFieldShouldReturnAction(_ action: @escaping () -> Bool) -> some View { environment(\.inputFieldShouldReturnAction, action) } - /// Set the `textFieldShouldReturn` action for Orbit identifiable `InputField`. + /// Set the `textFieldShouldReturn` action for Orbit identifiable text fields. /// - /// Mark the associated Orbit InputField with `identifier()` modifier to set its identity. + /// Mark the associated Orbit text field with `identifier()` modifier to set its identity. /// /// - Parameters: - /// - action: A handler that is executed to ask whether to process the pressing of the Return button for the identifiable `InputField` inside the view hierarchy. + /// - action: A handler that is executed to ask whether to process the pressing of the Return button for the identifiable text field inside the view hierarchy. func inputFieldShouldReturnAction(_ action: @escaping (AnyHashable) -> Bool) -> some View { environment(\.inputFieldShouldReturnIdentifiableAction, action) } diff --git a/Sources/Orbit/Support/Forms/InputContent.swift b/Sources/Orbit/Support/Forms/InputContent.swift index da9d1709569..2fc974bc39f 100644 --- a/Sources/Orbit/Support/Forms/InputContent.swift +++ b/Sources/Orbit/Support/Forms/InputContent.swift @@ -15,7 +15,6 @@ public struct InputContent: View { private let message: Message? private let isPressed: Bool private let isFocused: Bool - private let isPlaceholder: Bool @ViewBuilder private let content: Content @ViewBuilder private let prefix: Prefix @ViewBuilder private let suffix: Suffix @@ -132,7 +131,6 @@ public struct InputContent: View { message: Message? = nil, isPressed: Bool = false, isFocused: Bool = false, - isPlaceholder: Bool = false, @ViewBuilder content: () -> Content, @ViewBuilder prefix: () -> Prefix = { EmptyView() }, @ViewBuilder suffix: () -> Suffix = { EmptyView() } @@ -142,7 +140,6 @@ public struct InputContent: View { self.message = message self.isPressed = isPressed self.isFocused = isFocused - self.isPlaceholder = isPlaceholder self.content = content() self.prefix = prefix() self.suffix = suffix() diff --git a/Sources/Orbit/Support/TextFields/InsetableTextField.swift b/Sources/Orbit/Support/TextFields/InsetableTextField.swift index d25a8c736e6..b080523f8bf 100644 --- a/Sources/Orbit/Support/TextFields/InsetableTextField.swift +++ b/Sources/Orbit/Support/TextFields/InsetableTextField.swift @@ -43,7 +43,7 @@ public class InsetableTextField: UITextField { return success } - public func replace(withText text: String, keepingCapacity: Bool = false) { + func replace(withText text: String, keepingCapacity: Bool = false) { self.text?.removeAll(keepingCapacity: keepingCapacity) insertText(text) } diff --git a/Sources/Orbit/Support/TextFields/InsetableTextView.swift b/Sources/Orbit/Support/TextFields/InsetableTextView.swift new file mode 100644 index 00000000000..d388e685872 --- /dev/null +++ b/Sources/Orbit/Support/TextFields/InsetableTextView.swift @@ -0,0 +1,77 @@ +import UIKit + +/// Orbit UITextView wrapper with a larger touch area and a prompt. +public class InsetableTextView: UITextView { + + public var insets: UIEdgeInsets = .zero + + public var shouldDeleteBackwardAction: (String) -> Bool = { _ in true } + + var prompt = "" { + didSet { + if prompt != promptLabel.text { + promptLabel.text = prompt + updatePromptVisibility() + } + } + } + + let promptLabel = UILabel() + + public init() { + super.init(frame: .zero, textContainer: nil) + initialize() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + initialize() + } + + private func initialize() { + backgroundColor = nil + textContainer.lineFragmentPadding = 0 + textContainerInset = .zero + textContainer.lineBreakMode = .byWordWrapping + + promptLabel.numberOfLines = 0 + promptLabel.adjustsFontSizeToFitWidth = true + promptLabel.lineBreakMode = .byWordWrapping + promptLabel.textColor = .inkLight + + addSubview(promptLabel) + } + + public override func layoutSubviews() { + super.layoutSubviews() + contentInset = insets + let size = promptLabel.sizeThatFits(bounds.inset(by: insets).size) + promptLabel.frame = .init(origin: .zero, size: size) + } + + override public func deleteBackward() { + if shouldDeleteBackwardAction(text ?? "") { + super.deleteBackward() + } + } + + override public func becomeFirstResponder() -> Bool { + let success = super.becomeFirstResponder() + + // Prevent erasing the current value + if let text { + replace(withText: text, keepingCapacity: true) + } + + return success + } + + func updatePromptVisibility() { + promptLabel.isHidden = text.isEmpty == false + } + + func replace(withText text: String, keepingCapacity: Bool = false) { + self.text?.removeAll(keepingCapacity: keepingCapacity) + insertText(text) + } +} diff --git a/Sources/Orbit/Support/TextFields/TextField.swift b/Sources/Orbit/Support/TextFields/TextField.swift index 282fae22e0d..a52c70049a6 100644 --- a/Sources/Orbit/Support/TextFields/TextField.swift +++ b/Sources/Orbit/Support/TextFields/TextField.swift @@ -3,14 +3,14 @@ import UIKit /// Orbit control that displays an editable text interface, a replacement for native `TextField` component. /// -/// The component uses UIKit implementation to support these feature for older iOS versions: +/// The component uses UIKit `UITextField` implementation to support these feature for older iOS versions: /// - focus changes /// - UITextField event handling /// - full UITextField configuration /// - font and text override /// - larger and configurable touch area /// -/// The component is compatible with native `@FocusState` modifier to support focus changes in later iOS versions. +/// The component is compatible with native `@FocusState` modifier to support focus changes in newer iOS versions. public struct TextField: UIViewRepresentable, TextFieldBuildable { @Environment(\.identifier) private var identifier @@ -40,7 +40,7 @@ public struct TextField: UIViewRepresentable, TextFieldBuildable { // Builder properties (keyboard related) var returnKeyType: UIReturnKeyType = .default - var isAutocorrectionDisabled: Bool? = nil + var isAutocorrectionDisabled: Bool? var keyboardType: UIKeyboardType = .default var textContentType: UITextContentType? var autocapitalizationType: UITextAutocapitalizationType = .sentences @@ -171,7 +171,7 @@ public struct TextField: UIViewRepresentable, TextFieldBuildable { // MARK: - Inits public extension TextField { - /// Creates Orbit TextField wrapper over UITextField, used internally in `InputField`. + /// Creates Orbit ``TextField`` wrapper over UITextField, used in ``InputField``. init( value: Binding, prompt: String = "", diff --git a/Sources/Orbit/Support/TextFields/TextFieldBuildable.swift b/Sources/Orbit/Support/TextFields/TextFieldBuildable.swift index 762ab93115b..f1077c2a5ab 100644 --- a/Sources/Orbit/Support/TextFields/TextFieldBuildable.swift +++ b/Sources/Orbit/Support/TextFields/TextFieldBuildable.swift @@ -1,7 +1,7 @@ import SwiftUI // Modifiers that shadow the SwiftUI modifiers need to have the exact signature -// in order to prefer the method of the TextField over the generic View version +// in order to prefer the method of TextFieldBuildable over the generic View version protocol TextFieldBuildable { @@ -9,8 +9,8 @@ protocol TextFieldBuildable { var isAutocorrectionDisabled: Bool? { get set } var keyboardType: UIKeyboardType { get set } var returnKeyType: UIReturnKeyType { get set } - var textContentType: UITextContentType? { get set } var shouldDeleteBackwardAction: (String) -> Bool { get set } + var textContentType: UITextContentType? { get set } } extension TextFieldBuildable { @@ -39,11 +39,6 @@ public extension TextField { set(\.keyboardType, to: type) } - /// Returns a modified Orbit TextField with provided content type. - func textContentType(_ textContentType: UITextContentType?) -> Self { - set(\.textContentType, to: textContentType) - } - /// Returns a modified Orbit TextField with provided keyboard return type. func returnKeyType(_ returnKeyType: UIReturnKeyType) -> Self { set(\.returnKeyType, to: returnKeyType) @@ -53,6 +48,11 @@ public extension TextField { func shouldDeleteBackwardAction(_ action: @escaping (String) -> Bool) -> Self { set(\.shouldDeleteBackwardAction, to: action) } + + /// Returns a modified Orbit TextField with provided content type. + func textContentType(_ textContentType: UITextContentType?) -> Self { + set(\.textContentType, to: textContentType) + } } public extension InputField { @@ -72,18 +72,85 @@ public extension InputField { set(\.keyboardType, to: type) } + /// Returns a modified Orbit InputField with provided keyboard return type. + func returnKeyType(_ returnKeyType: UIReturnKeyType) -> Self { + set(\.returnKeyType, to: returnKeyType) + } + + /// Returns a modified Orbit InputField with provided handler of delete backward event. + func shouldDeleteBackwardAction(_ action: @escaping (String) -> Bool) -> Self { + set(\.shouldDeleteBackwardAction, to: action) + } + /// Returns a modified Orbit InputField with provided content type. func textContentType(_ textContentType: UITextContentType?) -> Self { set(\.textContentType, to: textContentType) } +} - /// Returns a modified Orbit InputField with provided keyboard return type. +public extension Textarea { + + /// Returns a modified Orbit Textarea with provided auto-capitalization type. + func autocapitalization(_ style: UITextAutocapitalizationType) -> Self { + set(\.autocapitalizationType, to: style) + } + + /// Returns a modified Orbit Textarea with provided autocorrection type. + func autocorrectionDisabled(_ disable: Bool? = true) -> Self { + set(\.isAutocorrectionDisabled, to: disable) + } + + /// Returns a modified Orbit Textarea with provided keyboard type. + func keyboardType(_ type: UIKeyboardType) -> Self { + set(\.keyboardType, to: type) + } + + /// Returns a modified Orbit Textarea with provided keyboard return type. func returnKeyType(_ returnKeyType: UIReturnKeyType) -> Self { set(\.returnKeyType, to: returnKeyType) } - /// Returns a modified Orbit InputField with provided handler of delete backward event. + /// Returns a modified Orbit Textarea with provided handler of delete backward event. + func shouldDeleteBackwardAction(_ action: @escaping (String) -> Bool) -> Self { + set(\.shouldDeleteBackwardAction, to: action) + } + + /// Returns a modified Orbit Textarea with provided content type. + func textContentType(_ textContentType: UITextContentType?) -> Self { + set(\.textContentType, to: textContentType) + } +} + +public extension TextView { + + /// Returns a modified Orbit TextView with provided auto-capitalization type. + func autocapitalization(_ style: UITextAutocapitalizationType) -> Self { + set(\.autocapitalizationType, to: style) + } + + /// Returns a modified Orbit TextView with provided autocorrection type. + func autocorrectionDisabled(_ disable: Bool? = true) -> Self { + set(\.isAutocorrectionDisabled, to: disable) + } + + /// Returns a modified Orbit TextView with provided keyboard type. + func keyboardType(_ type: UIKeyboardType) -> Self { + set(\.keyboardType, to: type) + } + + /// Returns a modified Orbit TextView with provided keyboard return type. + func returnKeyType(_ returnKeyType: UIReturnKeyType) -> Self { + set(\.returnKeyType, to: returnKeyType) + } + + /// Returns a modified Orbit TextView with provided handler of delete backward event. func shouldDeleteBackwardAction(_ action: @escaping (String) -> Bool) -> Self { set(\.shouldDeleteBackwardAction, to: action) } + + /// Returns a modified Orbit TextView with provided content type. + func textContentType(_ textContentType: UITextContentType?) -> Self { + set(\.textContentType, to: textContentType) + } } + diff --git a/Sources/Orbit/Support/TextFields/TextFieldCoordinator.swift b/Sources/Orbit/Support/TextFields/TextFieldCoordinator.swift index 7d9e4a944d5..064ccd68a1c 100644 --- a/Sources/Orbit/Support/TextFields/TextFieldCoordinator.swift +++ b/Sources/Orbit/Support/TextFields/TextFieldCoordinator.swift @@ -1,10 +1,11 @@ import SwiftUI -public final class TextFieldCoordinator: NSObject, UITextFieldDelegate, ObservableObject { +/// Coordinator that manages Orbit text input components `InputField` and `Textarea`. +public final class TextFieldCoordinator: NSObject, ObservableObject { - static var textFieldToBecomeResponder: UITextField? + static var textFieldToBecomeResponder: UITextInput? static var coordinatorToBecomeResponder: TextFieldCoordinator? - static var textFieldToResignResponder: UITextField? + static var textFieldToResignResponder: UITextInput? static var coordinatorToResignResponder: TextFieldCoordinator? static func debounceBecomeResponder(coordinator: TextFieldCoordinator) { @@ -31,9 +32,9 @@ public final class TextFieldCoordinator: NSObject, UITextFieldDelegate, Observab static func switchResponders() { // The inverted order is important for keyboard to stay fixed when switching responders - _ = textFieldToBecomeResponder?.becomeFirstResponder() + _ = textFieldToBecomeResponder?.textInputView?.superview?.becomeFirstResponder() textFieldToBecomeResponder = nil - _ = textFieldToResignResponder?.resignFirstResponder() + _ = textFieldToResignResponder?.textInputView?.superview?.resignFirstResponder() textFieldToResignResponder = nil coordinatorToResignResponder?.onEndEditing(updateBinding: false) @@ -99,33 +100,48 @@ public final class TextFieldCoordinator: NSObject, UITextFieldDelegate, Observab self.inputFieldShouldChangeCharactersAction = inputFieldShouldChangeCharactersAction self.inputFieldShouldChangeCharactersIdentifiableAction = inputFieldShouldChangeCharactersIdentifiableAction } - - public func textFieldDidBeginEditing(_ textField: UITextField) { + + fileprivate func didBeginEditing() { if isBeingUpdated { return } onBeginEditing(updateBinding: true) } - - public func textFieldDidEndEditing(_ textField: UITextField) { + + fileprivate func didEndEditing() { if isBeingUpdated { return } onEndEditing(updateBinding: true) } - - public func textFieldShouldReturn(_ textField: UITextField) -> Bool { + + fileprivate func shouldReturn(textInput: UITextInput) -> Bool { if isBeingUpdated { return true } - let shouldReturn = shouldReturn - + let shouldReturn: Bool + + if let inputFieldShouldReturnIdentifiableAction, let identifier { + shouldReturn = inputFieldShouldReturnIdentifiableAction(identifier) + } else if let inputFieldShouldReturnAction { + shouldReturn = inputFieldShouldReturnAction() + } else { + shouldReturn = true + } + if shouldReturn { - onReturn(textField) + DispatchQueue.main.async { + textInput.textInputView?.superview?.resignFirstResponder() + self.inputFieldReturnAction() + + if let identifier = self.identifier { + self.inputFieldReturnIdentifiableAction(identifier) + } + } } return shouldReturn } - - public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + + fileprivate func shouldChange(textInput: UITextInput, charactersIn range: NSRange, replacementString string: String) -> Bool { if isBeingUpdated { return true } - let text = ((textField.text ?? "") as NSString) + let text = ((textInput.text) as NSString) let result: InputFieldShouldChangeResult if let inputFieldShouldChangeCharactersIdentifiableAction, let identifier { @@ -141,17 +157,17 @@ public final class TextFieldCoordinator: NSObject, UITextFieldDelegate, Observab return true case .replace(let modifiedValue): // Refuse the proposed change, replace the text with modified value - textField.text = modifiedValue + textInput.text = modifiedValue return false case .reject: return false } } - - public func textFieldDidChangeSelection(_ textField: UITextField) { + + fileprivate func didChange(textInput: UITextInput) { if isBeingUpdated { return } - let newValue = textField.text ?? "" + let newValue = textInput.text if value != newValue { // This is a safer place to report the actual value, as it can be modified by system silently. @@ -185,27 +201,6 @@ public final class TextFieldCoordinator: NSObject, UITextFieldDelegate, Observab } } - fileprivate func onReturn(_ textField: UITextField) { - DispatchQueue.main.async { - textField.resignFirstResponder() - self.inputFieldReturnAction() - - if let identifier = self.identifier { - self.inputFieldReturnIdentifiableAction(identifier) - } - } - } - - private var shouldReturn: Bool { - if let inputFieldShouldReturnIdentifiableAction, let identifier { - return inputFieldShouldReturnIdentifiableAction(identifier) - } else if let inputFieldShouldReturnAction { - return inputFieldShouldReturnAction() - } else { - return true - } - } - private func updateInputFieldFocusBindingIfNeeded(_ value: AnyHashable?) { valueToUpdate = [value] @@ -223,10 +218,59 @@ public final class TextFieldCoordinator: NSObject, UITextFieldDelegate, Observab } } -extension UITextField { +// MARK: - UITextFieldDelegate +extension TextFieldCoordinator: UITextFieldDelegate { + + public func textFieldDidBeginEditing(_ textField: UITextField) { + didBeginEditing() + } + + public func textFieldDidEndEditing(_ textField: UITextField) { + didEndEditing() + } + + public func textFieldShouldReturn(_ textField: UITextField) -> Bool { + shouldReturn(textInput: textField) + } + + public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + shouldChange(textInput: textField, charactersIn: range, replacementString: string) + } + + public func textFieldDidChangeSelection(_ textField: UITextField) { + didChange(textInput: textField) + } +} + +// MARK: - UITextViewDelegate +extension TextFieldCoordinator: UITextViewDelegate { + + public func textViewDidBeginEditing(_ textView: UITextView) { + didBeginEditing() + } + + public func textViewDidEndEditing(_ textView: UITextView) { + didEndEditing() + } + + public func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { + shouldChange(textInput: textView, charactersIn: range, replacementString: text) + } + + public func textViewDidChange(_ textView: UITextView) { + (textView as? InsetableTextView)?.updatePromptVisibility() + } + + public func textViewDidChangeSelection(_ textView: UITextView) { + didChange(textInput: textView) + } +} + +// MARK: - +extension UITextInput { func toggleKeyboardFocus(_ focus: Bool, coordinator: TextFieldCoordinator) { - guard self.window != nil else { return } + guard self.textInputView?.superview?.window != nil else { return } if focus { TextFieldCoordinator.textFieldToBecomeResponder = self @@ -242,4 +286,17 @@ extension UITextField { } } } + + var textRange: UITextRange { + textRange(from: beginningOfDocument, to: endOfDocument) ?? .init() + } + + var text: String { + get { + text(in: textRange) ?? "" + } + set { + replace(textRange, withText: newValue) + } + } } diff --git a/Sources/Orbit/Support/TextFields/TextView.swift b/Sources/Orbit/Support/TextFields/TextView.swift new file mode 100644 index 00000000000..bbfb3893a1d --- /dev/null +++ b/Sources/Orbit/Support/TextFields/TextView.swift @@ -0,0 +1,283 @@ +import SwiftUI +import UIKit + +/// Orbit control that displays a multiline editable text interface, a replacement for the native multiline `TextField` component. +/// +/// The component uses UIKit `UITextView` implementation to support these feature for older iOS versions: +/// - focus changes +/// - UITextField event handling +/// - full UITextField configuration +/// - font and text override +/// - larger and configurable touch area +/// +/// The component is compatible with native `@FocusState` modifier to support focus changes in newer iOS versions. +public struct TextView: UIViewRepresentable, TextFieldBuildable { + + @Environment(\.identifier) private var identifier + @Environment(\.isEnabled) private var isEnabled: Bool + @Environment(\.inputFieldBeginEditingAction) private var inputFieldBeginEditingAction + @Environment(\.inputFieldBeginEditingIdentifiableAction) private var inputFieldBeginEditingIdentifiableAction + @Environment(\.inputFieldEndEditingAction) private var inputFieldEndEditingAction + @Environment(\.inputFieldEndEditingIdentifiableAction) private var inputFieldEndEditingIdentifiableAction + @Environment(\.inputFieldFocus) private var inputFieldFocus + @Environment(\.inputFieldReturnAction) private var inputFieldReturnAction + @Environment(\.inputFieldReturnIdentifiableAction) private var inputFieldReturnIdentifiableAction + @Environment(\.inputFieldShouldReturnAction) private var inputFieldShouldReturnAction + @Environment(\.inputFieldShouldReturnIdentifiableAction) private var inputFieldShouldReturnIdentifiableAction + @Environment(\.inputFieldShouldChangeCharactersAction) private var inputFieldShouldChangeCharactersAction + @Environment(\.inputFieldShouldChangeCharactersIdentifiableAction) private var inputFieldShouldChangeCharactersIdentifiableAction + @Environment(\.sizeCategory) private var sizeCategory + @Environment(\.textFontWeight) private var textFontWeight + @Environment(\.textColor) private var textColor + @Environment(\.textSize) private var textSize + + @Binding private var value: String + private var prompt: String + private var state: InputState + private var insets: UIEdgeInsets + + // Builder properties (keyboard related) + var returnKeyType: UIReturnKeyType = .done + var isAutocorrectionDisabled: Bool? + var keyboardType: UIKeyboardType = .default + var textContentType: UITextContentType? + var autocapitalizationType: UITextAutocapitalizationType = .sentences + var shouldDeleteBackwardAction: (String) -> Bool = { _ in true } + + public func makeUIView(context: Context) -> InsetableTextView { + let textView = InsetableTextView() + textView.insets = insets + textView.delegate = context.coordinator + + textView.adjustsFontForContentSizeCategory = false + textView.tintColor = .blueNormal + + textView.setContentHuggingPriority(.defaultHigh, for: .vertical) + textView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) + + // Set initial text value to distinguish from binding updates + textView.text = value + + return textView + } + + public func updateUIView(_ uiView: InsetableTextView, context: Context) { + // Prevent delegate call cycle when updating values from SwiftUI + context.coordinator.isBeingUpdated = true + + uiView.updateIfNeeded(\.contentInset, to: insets) + + // Keyboard related + uiView.updateIfNeeded(\.returnKeyType, to: returnKeyType) + uiView.updateIfNeeded(\.keyboardType, to: keyboardType) + uiView.updateIfNeeded(\.textContentType, to: textContentType) + + let autocorrectionType: UITextAutocorrectionType + + if let isAutocorrectionDisabled { + autocorrectionType = isAutocorrectionDisabled ? .no : .yes + } else { + switch textContentType { + case UITextContentType.emailAddress, UITextContentType.password, UITextContentType.newPassword: + // If not specified, disable autocomplete for these content types + autocorrectionType = .no + default: + autocorrectionType = .default + } + } + + uiView.updateIfNeeded(\.autocorrectionType, to: autocorrectionType) + uiView.updateIfNeeded(\.autocapitalizationType, to: autocapitalizationType) + uiView.shouldDeleteBackwardAction = shouldDeleteBackwardAction + + if resolvedTextSize != context.coordinator.fontSize || resolvedTextWeight != context.coordinator.fontWeight { + uiView.font = UIFont.orbit(size: resolvedTextSize, weight: resolvedTextWeight) + uiView.promptLabel.font = uiView.font + context.coordinator.fontSize = resolvedTextSize + context.coordinator.fontWeight = resolvedTextWeight + } + + uiView.updateIfNeeded(\.textColor, to: isEnabled ? (textColor ?? state.textColor).uiColor : .cloudDarkActive) + uiView.updateIfNeeded(\.isEditable, to: isEnabled) + uiView.updateIfNeeded(\.prompt, to: prompt) + uiView.updateIfNeeded(\.promptLabel.textColor, to: isEnabled ? state.placeholderColor.uiColor : .cloudDarkActive) + + // Check if the binding value is different to replace the text content + if value != uiView.text { + uiView.replace(withText: value) + } + + // Become/Resign first responder if needed. + // Only relevant to fields with identifier and Orbit focus modifier applied. + // Not relevant for fields driven by iOS15+ @FocusState + if let inputFieldFocus, let identifier { + + if let valueToUpdate = context.coordinator.valueToUpdate.first, valueToUpdate != inputFieldFocus.binding.wrappedValue { + // Updated binding value from UIKit was not yet updated, ignoring + context.coordinator.isBeingUpdated = false + return + } + + if uiView.isFirstResponder == false && inputFieldFocus.binding.wrappedValue == identifier { + uiView.toggleKeyboardFocus(true, coordinator: context.coordinator) + return + } else if uiView.isFirstResponder && inputFieldFocus.binding.wrappedValue != identifier { + uiView.toggleKeyboardFocus(false, coordinator: context.coordinator) + return + } + } + + context.coordinator.isBeingUpdated = false + } + + public func makeCoordinator() -> TextFieldCoordinator { + TextFieldCoordinator( + identifier: identifier, + value: $value, + inputFieldFocus: inputFieldFocus, + inputFieldBeginEditingAction: inputFieldBeginEditingAction, + inputFieldBeginEditingIdentifiableAction: inputFieldBeginEditingIdentifiableAction, + inputFieldEndEditingAction: inputFieldEndEditingAction, + inputFieldEndEditingIdentifiableAction: inputFieldEndEditingIdentifiableAction, + inputFieldReturnAction: inputFieldReturnAction, + inputFieldReturnIdentifiableAction: inputFieldReturnIdentifiableAction, + inputFieldShouldReturnAction: inputFieldShouldReturnAction, + inputFieldShouldReturnIdentifiableAction: inputFieldShouldReturnIdentifiableAction, + inputFieldShouldChangeCharactersAction: inputFieldShouldChangeCharactersAction, + inputFieldShouldChangeCharactersIdentifiableAction: inputFieldShouldChangeCharactersIdentifiableAction + ) + } + + private var resolvedTextSize: CGFloat { + (textSize ?? Text.Size.normal.value) * sizeCategory.ratio + } + + private var resolvedTextWeight: UIFont.Weight { + (textFontWeight ?? .regular).uiKit + } +} + +// MARK: - Inits +public extension TextView { + + /// Creates Orbit ``TextView`` wrapper over `UITextView`. The component is used in ``Textarea`` component. + init( + value: Binding, + prompt: String = "", + state: InputState = .default, + insets: UIEdgeInsets = .zero + ) { + self._value = value + self.prompt = prompt + self.state = state + self.insets = insets + } +} + +private extension InsetableTextView { + + @discardableResult + func updateIfNeeded(_ path: ReferenceWritableKeyPath, to value: Value) -> Self { + if value != self[keyPath: path] { + self[keyPath: path] = value + } + return self + } +} + + +// MARK: - Previews +struct TextViewPreviews: PreviewProvider { + + static var previews: some View { + PreviewWrapper { + standalone + alignment + } + .padding(.medium) + .previewLayout(.sizeThatFits) + } + + static var standalone: some View { + VStack(spacing: .medium) { + Group { + TextView(value: .constant(""), prompt: "Disabled") + .disabled(true) + .frame(width: 50, height: 50) + + StateWrapper("") { $value in + TextView(value: $value, prompt: "Enter value") + .frame(height: 50) + } + StateWrapper("value") { $value in + TextView(value: $value, prompt: "Enter value") + .frame(width: 200, height: 100) + } + StateWrapper("value") { $value in + TextView(value: $value, prompt: "Enter value") + } + } + .border(.black, width: .hairline) + } + .previewDisplayName() + } + + static var alignment: some View { + VStack(spacing: .medium) { + Group { + if #available(iOS 16.0, *) { + HStack(alignment: .firstTextBaseline) { + Text("Native") + SwiftUI.TextField("Enter value", text: .constant("Value"), axis: .vertical) + .lineLimit(3, reservesSpace: true) + .border(.black, width: .hairline) + } + + HStack(alignment: .firstTextBaseline) { + Text("Native") + SwiftUI.TextField("Enter value", text: .constant(""), axis: .vertical) + .lineLimit(3, reservesSpace: true) + .border(.black, width: .hairline) + } + } + + HStack(alignment: .firstTextBaseline) { + Text("TextField") + TextField(value: .constant(""), prompt: "Enter value") + .border(.black, width: .hairline) + } + + HStack(alignment: .firstTextBaseline) { + Text("Label") + TextView(value: .constant(""), prompt: "Enter value value value value value value value value value value value", insets: .init(top: .medium, left: .medium, bottom: .medium, right: .medium)) + .frame(height: 100) + .border(.black, width: .hairline) + } + + HStack(alignment: .firstTextBaseline) { + Text("Label") + TextView(value: .constant("Value"), prompt: "Enter value value value value value value value") + .frame(height: 100) + .border(.black, width: .hairline) + } + + HStack(alignment: .firstTextBaseline) { + Text("Label") + TextView(value: .constant("Value"), prompt: "Enter value") + .frame(width: 200, height: 100) + .border(.black, width: .hairline) + } + .textSize(custom: 40) + .textColor(.blueDark) + .textFontWeight(.black) + } + .overlay( + Color.redNormal + .frame(height: .hairline) + , + alignment: .centerFirstTextBaseline + ) + } + .previewDisplayName() + } +} diff --git a/Tests/SnapshotTests/Components/TextareaTests.swift b/Tests/SnapshotTests/Components/TextareaTests.swift new file mode 100644 index 00000000000..c7b6fd22ae4 --- /dev/null +++ b/Tests/SnapshotTests/Components/TextareaTests.swift @@ -0,0 +1,9 @@ +import XCTest +@testable import Orbit + +class TextareaTests: SnapshotTestCase { + + func testTextarea() { + assert(TextareaPreviews.layout) + } +} diff --git a/component-status.yaml b/component-status.yaml index 8ef57f3491b..287d730446c 100644 --- a/component-status.yaml +++ b/component-status.yaml @@ -72,6 +72,8 @@ ios: Released - component: Text ios: Released +- component: Textarea + ios: Released - component: TextLink ios: Released - component: Tile From c4f15bcc5e58889ce10bd8316207eb7673d29587 Mon Sep 17 00:00:00 2001 From: Pavel Holec Date: Mon, 27 Nov 2023 09:52:43 +0100 Subject: [PATCH 2/5] Shorten syntax of buttons and wrappers --- Sources/Orbit/Components/Checkbox.swift | 41 ++++++++--------- Sources/Orbit/Components/ChoiceTile.swift | 41 ++++++++--------- Sources/Orbit/Components/InputField.swift | 13 +----- Sources/Orbit/Components/Radio.swift | 41 ++++++++--------- Sources/Orbit/Components/Select.swift | 33 ++++++-------- Sources/Orbit/Components/Tag.swift | 45 +++++++++---------- Sources/Orbit/Components/Tile.swift | 19 ++++---- .../ButtonStyles/CheckboxButtonStyle.swift | 5 +-- .../Support/Components/NavigationButton.swift | 19 ++++---- .../Support/Components/StepperButton.swift | 4 +- 10 files changed, 113 insertions(+), 148 deletions(-) diff --git a/Sources/Orbit/Components/Checkbox.swift b/Sources/Orbit/Components/Checkbox.swift index 67cfbcc7e52..1455d5fdcfc 100644 --- a/Sources/Orbit/Components/Checkbox.swift +++ b/Sources/Orbit/Components/Checkbox.swift @@ -17,30 +17,27 @@ public struct Checkbox: View { @Binding var isChecked: Bool public var body: some View { - SwiftUI.Button( - action: { - if isHapticsEnabled { - HapticsProvider.sendHapticFeedback(.light(0.5)) - } - - isChecked.toggle() - }, - label: { - if title.isEmpty == false || description.isEmpty == false { - VStack(alignment: .leading, spacing: 1) { - Text(title) - .textColor(labelColor) - .fontWeight(.medium) - .accessibility(.checkboxTitle) - - Text(description) - .textSize(.small) - .textColor(descriptionColor) - .accessibility(.checkboxDescription) - } + SwiftUI.Button { + if isHapticsEnabled { + HapticsProvider.sendHapticFeedback(.light(0.5)) + } + + isChecked.toggle() + } label: { + if title.isEmpty == false || description.isEmpty == false { + VStack(alignment: .leading, spacing: 1) { + Text(title) + .textColor(labelColor) + .fontWeight(.medium) + .accessibility(.checkboxTitle) + + Text(description) + .textSize(.small) + .textColor(descriptionColor) + .accessibility(.checkboxDescription) } } - ) + } .buttonStyle( CheckboxButtonStyle(state: state, isChecked: isChecked) ) diff --git a/Sources/Orbit/Components/ChoiceTile.swift b/Sources/Orbit/Components/ChoiceTile.swift index da73dba94d0..ab7bbd79cdd 100644 --- a/Sources/Orbit/Components/ChoiceTile.swift +++ b/Sources/Orbit/Components/ChoiceTile.swift @@ -29,31 +29,28 @@ public struct ChoiceTile: View, TextFieldBuildable { var shouldDeleteBackwardAction: (String) -> Bool = { _ in true } public var body: some View { - FieldWrapper( - defaultLabel, - message: message, - messageHeight: $messageHeight - ) { - InputContent( - state: state, - label: compactLabel, - message: message, - isFocused: isFocused - ) { + FieldWrapper(defaultLabel, message: message, messageHeight: $messageHeight) { + InputContent(state: state, label: compactLabel, message: message, isFocused: isFocused) { textField } prefix: { prefix diff --git a/Sources/Orbit/Components/Radio.swift b/Sources/Orbit/Components/Radio.swift index f11b84093ee..531a5919312 100644 --- a/Sources/Orbit/Components/Radio.swift +++ b/Sources/Orbit/Components/Radio.swift @@ -17,30 +17,27 @@ public struct Radio: View { @Binding var isChecked: Bool public var body: some View { - SwiftUI.Button( - action: { - if isHapticsEnabled { - HapticsProvider.sendHapticFeedback(.light(0.5)) - } - - isChecked.toggle() - }, - label: { - if title.isEmpty == false || description.isEmpty == false { - VStack(alignment: .leading, spacing: 1) { - Text(title) - .textColor(labelColor) - .fontWeight(.medium) - .accessibility(.radioTitle) - - Text(description) - .textSize(.small) - .textColor(descriptionColor) - .accessibility(.radioDescription) - } + SwiftUI.Button { + if isHapticsEnabled { + HapticsProvider.sendHapticFeedback(.light(0.5)) + } + + isChecked.toggle() + } label: { + if title.isEmpty == false || description.isEmpty == false { + VStack(alignment: .leading, spacing: 1) { + Text(title) + .textColor(labelColor) + .fontWeight(.medium) + .accessibility(.radioTitle) + + Text(description) + .textSize(.small) + .textColor(descriptionColor) + .accessibility(.radioDescription) } } - ) + } .buttonStyle( RadioButtonStyle(state: state, isChecked: isChecked) ) diff --git a/Sources/Orbit/Components/Select.swift b/Sources/Orbit/Components/Select.swift index be3574cd08c..d5dbe0a7e3e 100644 --- a/Sources/Orbit/Components/Select.swift +++ b/Sources/Orbit/Components/Select.swift @@ -24,27 +24,20 @@ public struct Select: View { @ViewBuilder private let suffix: Suffix public var body: some View { - FieldWrapper( - defaultLabel, - message: message, - messageHeight: $messageHeight - ) { - SwiftUI.Button( - action: { - if isHapticsEnabled { - HapticsProvider.sendHapticFeedback(.light(0.5)) - } - - action() - }, - label: { - Text(value ?? prompt) - .textColor(valueColor) - .accessibility(.selectValue) - .padding(.horizontal, .small) - .padding(.vertical, verticalTextPadding) + FieldWrapper(defaultLabel, message: message, messageHeight: $messageHeight) { + SwiftUI.Button { + if isHapticsEnabled { + HapticsProvider.sendHapticFeedback(.light(0.5)) } - ) + + action() + } label: { + Text(value ?? prompt) + .textColor(valueColor) + .accessibility(.selectValue) + .padding(.horizontal, .small) + .padding(.vertical, verticalTextPadding) + } .buttonStyle( InputContentButtonStyle( state: state, diff --git a/Sources/Orbit/Components/Tag.swift b/Sources/Orbit/Components/Tag.swift index 05ddba0f3b9..6d786806b47 100644 --- a/Sources/Orbit/Components/Tag.swift +++ b/Sources/Orbit/Components/Tag.swift @@ -17,34 +17,31 @@ public struct Tag: View, PotentiallyEmptyView { public var body: some View { if isEmpty == false { - SwiftUI.Button( - action: { - if isHapticsEnabled { - HapticsProvider.sendHapticFeedback(.light(0.5)) + SwiftUI.Button { + if isHapticsEnabled { + HapticsProvider.sendHapticFeedback(.light(0.5)) + } + + isSelected.toggle() + } label: { + HStack(spacing: 0) { + if idealSize.horizontal == false { + Spacer(minLength: 0) + } + + HStack(spacing: 6) { + icon + .font(.system(size: Text.Size.normal.value)) + + Text(label) } + .fixedSize(horizontal: true, vertical: false) - isSelected.toggle() - }, - label: { - HStack(spacing: 0) { - if idealSize.horizontal == false { - Spacer(minLength: 0) - } - - HStack(spacing: 6) { - icon - .font(.system(size: Text.Size.normal.value)) - - Text(label) - } - .fixedSize(horizontal: true, vertical: false) - - if idealSize.horizontal == false { - Spacer(minLength: 0) - } + if idealSize.horizontal == false { + Spacer(minLength: 0) } } - ) + } .buttonStyle( TagButtonStyle( style: style, diff --git a/Sources/Orbit/Components/Tile.swift b/Sources/Orbit/Components/Tile.swift index 8111b7f5e6c..22d0f6b4d52 100644 --- a/Sources/Orbit/Components/Tile.swift +++ b/Sources/Orbit/Components/Tile.swift @@ -24,18 +24,15 @@ public struct Tile: View { @ViewBuilder private let icon: Icon public var body: some View { - SwiftUI.Button( - action: { - if isHapticsEnabled { - HapticsProvider.sendHapticFeedback(.light(0.5)) - } - - action() - }, - label: { - buttonContent + SwiftUI.Button { + if isHapticsEnabled { + HapticsProvider.sendHapticFeedback(.light(0.5)) } - ) + + action() + } label: { + buttonContent + } .buttonStyle(TileButtonStyle(style: tileBorderStyle)) .accessibilityElement(children: .ignore) .accessibility(label: .init(title)) diff --git a/Sources/Orbit/Support/ButtonStyles/CheckboxButtonStyle.swift b/Sources/Orbit/Support/ButtonStyles/CheckboxButtonStyle.swift index 8eac572bedc..ae359ae01b6 100644 --- a/Sources/Orbit/Support/ButtonStyles/CheckboxButtonStyle.swift +++ b/Sources/Orbit/Support/ButtonStyles/CheckboxButtonStyle.swift @@ -22,10 +22,7 @@ public struct CheckboxButtonStyle: ButtonStyle { func indicator(isPressed: Bool) -> some View { shape - .strokeBorder( - indicatorStrokeColor(isPressed: isPressed), - lineWidth: indicatorStrokeWidth - ) + .strokeBorder(indicatorStrokeColor(isPressed: isPressed), lineWidth: indicatorStrokeWidth) .background( shape .fill(indicatorBackgroundColor(isPressed: isPressed)) diff --git a/Sources/Orbit/Support/Components/NavigationButton.swift b/Sources/Orbit/Support/Components/NavigationButton.swift index c757400b06c..19b859c5fb1 100644 --- a/Sources/Orbit/Support/Components/NavigationButton.swift +++ b/Sources/Orbit/Support/Components/NavigationButton.swift @@ -9,18 +9,15 @@ public struct NavigationButton: View { private let action: () -> Void public var body: some View { - SwiftUI.Button( - action: { - if isHapticsEnabled { - HapticsProvider.sendHapticFeedback(.light(0.5)) - } - - action() - }, - label: { - Image(state.imageSymbol) + SwiftUI.Button { + if isHapticsEnabled { + HapticsProvider.sendHapticFeedback(.light(0.5)) } - ) + + action() + } label: { + Image(state.imageSymbol) + } .buttonStyle(NavigationButtonStyle()) } diff --git a/Sources/Orbit/Support/Components/StepperButton.swift b/Sources/Orbit/Support/Components/StepperButton.swift index 600a8ed172a..5a19539b482 100644 --- a/Sources/Orbit/Support/Components/StepperButton.swift +++ b/Sources/Orbit/Support/Components/StepperButton.swift @@ -11,7 +11,9 @@ public struct StepperButton: View { let action: () -> Void public var body: some View { - SwiftUI.Button(action: action) { + SwiftUI.Button { + action() + } label: { Icon(icon) .textColor(color) } From be253850a65fe46da0495247fb37e878169ffd4d Mon Sep 17 00:00:00 2001 From: Pavel Holec Date: Fri, 24 Nov 2023 13:05:37 +0100 Subject: [PATCH 3/5] Add Textarea to Storybook --- .../Detail/Items/StorybookTextarea.swift | 40 +++++++++++++++++++ .../Detail/StorybookDetail.swift | 1 + Sources/OrbitStorybook/Storybook+Items.swift | 2 + 3 files changed, 43 insertions(+) create mode 100644 Sources/OrbitStorybook/Detail/Items/StorybookTextarea.swift diff --git a/Sources/OrbitStorybook/Detail/Items/StorybookTextarea.swift b/Sources/OrbitStorybook/Detail/Items/StorybookTextarea.swift new file mode 100644 index 00000000000..26f0a6c62d3 --- /dev/null +++ b/Sources/OrbitStorybook/Detail/Items/StorybookTextarea.swift @@ -0,0 +1,40 @@ +import SwiftUI +import Orbit + +struct StorybookTextarea { + + static let prompt = "Enter \(String(repeating: "values ", count: 20))" + + static var basic: some View { + VStack(alignment: .leading, spacing: .medium) { + textarea + + StateWrapper("") { $value in + Textarea(value: $value, prompt: prompt) + .frame(height: 150) + } + + HStack(alignment: .top, spacing: .medium) { + textarea + textarea + } + } + } + + static var textarea: some View { + StateWrapper(prompt) { $value in + Textarea("Label", value: $value, prompt: prompt) + .frame(height: 100) + } + } +} + +struct StorybookTextareaPreviews: PreviewProvider { + + static var previews: some View { + OrbitPreviewWrapper { + StorybookTextarea.basic + .padding(.medium) + } + } +} diff --git a/Sources/OrbitStorybook/Detail/StorybookDetail.swift b/Sources/OrbitStorybook/Detail/StorybookDetail.swift index c1485c4db72..b0ec4f3468f 100644 --- a/Sources/OrbitStorybook/Detail/StorybookDetail.swift +++ b/Sources/OrbitStorybook/Detail/StorybookDetail.swift @@ -154,6 +154,7 @@ struct StorybookDetail: View { case (.tabs, 1): StorybookTabs.live case (.tag, _): StorybookTag.basic case (.text, _): StorybookText.basic + case (.textarea, _): StorybookTextarea.basic case (.textLink, 0): StorybookTextLink.basic case (.textLink, 1): StorybookTextLink.live case (.tile, 0): StorybookTile.basic diff --git a/Sources/OrbitStorybook/Storybook+Items.swift b/Sources/OrbitStorybook/Storybook+Items.swift index a4ba23cfbe5..a183f62e97c 100644 --- a/Sources/OrbitStorybook/Storybook+Items.swift +++ b/Sources/OrbitStorybook/Storybook+Items.swift @@ -112,6 +112,7 @@ extension Storybook { case .tabs: return ["Basic", "Live"] case .tag: return ["Basic"] case .text: return ["Basic"] + case .textarea: return ["Basic"] case .textLink: return ["Basic", "Live"] case .tile: return ["Basic", "Mix"] case .tileGroup: return ["Basic"] @@ -162,6 +163,7 @@ extension Storybook { case .tabs: return "menubar.rectangle" case .tag: return "123.rectangle.fill" case .text: return "text.alignleft" + case .textarea: return "square.and.pencil" case .textLink: return "text.redaction" case .tile: return "rectangle" case .tileGroup: return "rectangle.grid.2x2" From 4ab19e49014ca24e72ee51fb449ebef23cbf6605 Mon Sep 17 00:00:00 2001 From: runner Date: Fri, 24 Nov 2023 12:58:54 +0000 Subject: [PATCH 4/5] Snapshots - iPhone SE (3rd generation) --- .../iPhone/TextareaTests/testTextarea.1.png | Bin 0 -> 68601 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Snapshots/iPhone/TextareaTests/testTextarea.1.png diff --git a/Snapshots/iPhone/TextareaTests/testTextarea.1.png b/Snapshots/iPhone/TextareaTests/testTextarea.1.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ce15042b4e3eaaa5c2bc7d32aa6cca58a16f4c GIT binary patch literal 68601 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 Date: Fri, 24 Nov 2023 13:01:27 +0000 Subject: [PATCH 5/5] Snapshots - iPad (10th generation) --- Snapshots/iPad/TextareaTests/testTextarea.1.png | Bin 0 -> 74223 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Snapshots/iPad/TextareaTests/testTextarea.1.png diff --git a/Snapshots/iPad/TextareaTests/testTextarea.1.png b/Snapshots/iPad/TextareaTests/testTextarea.1.png new file mode 100644 index 0000000000000000000000000000000000000000..4b025dae4373beee524fb30bba0283cb87e6c2af GIT binary patch literal 74223 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

lu0NsiFNPZ`+*f$v& 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 literal 0 HcmV?d00001