DiffableTextViews
As-you-type formatting in SwiftUI
Install / Use
/learn @oscbyspro/DiffableTextViewsREADME
DiffableTextViews
An open source package for as-you-type formatting in SwiftUI.

Features
| | Feature | Description | |---|:--------|:------------| | :keyboard: | Responsive | Formats text as you type | | :magic_wand: | Automagical | Binds text to appropriate types | | :heavy_check_mark: | Proper | Validates and autocorrects | | :hammer_and_wrench: | Versatile | Uses snapshots and attributes | | :running_man: | Performant | O(n) differentiation algorithms | | :desert_island: | Standalone | Uses no remote dependencies | | :open_book: | Open | 100% transparent |
Installation
How to install this package.
Xcode (SPM)
- Select https://github.com/oscbyspro/DiffableTextViews
- Select a VERSIONED release (5.0.0)
Package.swift
.package(url: "https://github.com/oscbyspro/DiffableTextViews", from: "5.0.0"),
Requirements
| Version | Swift | iOS | iPadOS | Mac Catalyst | tvOS | |:-------:|:-----:|:-----:|:------:|:------------:|:-----:| | 5.0.0+ | 5.7+ | 15.0+ | 15.0+ | 15.0+ | 15.0+ |
Apps
The example app provides quick-and-easy-to-use customization tools.
| Number | Pattern | |--------|---------| <img src="Assets/AppXNumber.png" alt="Number" width="250"/> | <img src="Assets/AppXPattern.png" alt="Pattern" width="250"/>
Installation
Download this package and compile/run it with Xcode.
Views
DiffableTextField
A text field that binds values and formats them as you type.
Features
| | Feature | Description | |---|:--------|:------------| | :iphone: | SwiftUI | Value, style, done | | :mountain: | Environment | Uses environment values | | :mag_right: | Focus | Supports SwiftUI.FocusState |
Environment
environment(\.locale, _:)
environment(\.layoutDirection, _:)
diffableTextViews_autocorrectionDisabled(_:)
diffableTextViews_font(_:)
diffableTextViews_foregroundColor(_:)
diffableTextViews_multilineTextAlignment(_:)
diffableTextViews_onSubmit(_:)
diffableTextViews_submitLabel(_:)
diffableTextViews_textContentType(_:)
diffableTextViews_textFieldStyle(_:)
diffableTextViews_textInputAutocapitalization(_:)
diffableTextViews_tint(_:)
diffableTextViews_toolbarDoneButton(_:)
Styles
NumberTextStyle (Source, Tests)
A style that binds localized numbers using various formats.
Features
| | Feature | Description | |---|:--------|:------------| | :coin: | Values | Decimal, Double, (U)Int(8-64) | | :grey_question: | Optional | Standard and optional values | | :art: | Formats | Number, currency and percent | | :bricks: | Bounds | Clamps values to bounds | | :bow_and_arrow: | Precision | Up to 38 digits of precision | | :national_park: | Locales | Supports Foundation.Locale | | :two: | Bilingual | Accepts local and ASCII input |
Examples

import DiffableTextViews
import SwiftUI
//*============================================================================*
// MARK: * Number [...]
//*============================================================================*
struct ContentView: View {
typealias Amount = Decimal // Decimal, Double, (U)Int(8-64), Optional<T>
//=------------------------------------------------------------------------=
@State var amount = 0 as Amount
@State var currencyCode = "SEK"
@State var locale = Locale(identifier: "sv_SE")
//=------------------------------------------------------------------------=
var body: some View {
DiffableTextField(value: $amount) {
.currency(code: currencyCode)
// .bounds((0 as Amount)...) // autocorrects while view is in focus
// .precision(integer: 1..., fraction: 2) // default is appropriate
// .locale(Locale(identifier: "en_US")).constant() // ignores sv_SE
}
.environment(\.locale, locale)
.diffableTextViews_font(.body.monospaced())
.diffableTextViews_keyboardType(.decimalPad)
}
}
PatternTextStyle (Source, Tests)
A style that processes characters laid out in custom patterns.
Features
| | Feature | Description | |---|:--------|:------------| | :checkered_flag: | Pattern | Characters are laid out as described by a pattern | | :chess_pawn: | Placeholders | Placeholders represent not-yet-assigned values | | :fist_raised: | Independance | Supports multiple placeholders with different rules | | :ghost: | Invisibility | Pattern suffix can easily be \.hidden() |
Examples

import DiffableTextViews
import SwiftUI
//*============================================================================*
// MARK: * Pattern [...]
//*============================================================================*
struct ContentView: View {
typealias Number = String // Array<Character>
//=------------------------------------------------------------------------=
@State var number = Number("123456789")
//=------------------------------------------------------------------------=
var body: some View {
DiffableTextField(value: $number) {
.pattern("+## (###) ###-##-##")
.placeholders("#") { $0.isASCII && $0.isNumber }
// .hidden(true) // hides pattern beyond last real value
// .equals(()) // skips comparisons and discards changes
}
.diffableTextViews_font(.body.monospaced())
.diffableTextViews_keyboardType(.numberPad)
}
}
WrapperTextStyle(s) (Source, Tests)
Decorative styles that modify the behavior of their content.
| Style | Description | |:------|:------------| | constant() | Prevents style transformations | | equals(_:) | Binds the style's equality to a proxy | | standalone() | Grants ownership of the style's cache | | prefix(_:) | Adds a prefix to the style | | suffix(_:) | Adds a suffix to the style |
Related Skills
node-connect
340.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
340.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.2kCommit, push, and open a PR
