๐Ÿ‘”EmojiTextFieldStyle

import SwiftUI

// ๐Ÿ‘” EmojiTextFieldStyle (internal)
struct EmojiTextFieldStyle<Background: View>: TextFieldStyle {
    
    // โญ๏ธ style parameters
    var background : Background
    var borderColor: Color   = .black
    var borderWidth: CGFloat = 2
    var emoji      : String  = "๐Ÿ€"
    
    let opacity    : Double  = 0.85
    
    // ๐Ÿ…ฟ๏ธ TextFieldStyle requirement
    public func _body(configuration: TextField<_Label>) -> some View {
        let w = borderWidth
        return configuration
            .shadow(color: .black, radius: 2, x: 0, y: 1)
            .padding(w+6, w+12, w+6, w+12)  // ๐ŸŒ€view.padding(_,_,_,_)
            .background(background)
            .overlay(
                ZStack(alignment: .trailing) {
                    Rectangle()
                        .stroke(borderColor, lineWidth: borderWidth*2) // border
                        .shadow(radius: 3, x: w, y: w+1)
                    Text(emoji)            // emoji
                        .opacity(opacity)  // emoji opacity
                        .shadow(radius: 3, x: 2, y: 2)
                        .offset(x: -w-6)
            }).clipped()
    }
}

// ๐ŸŒ€view.textFieldStyle()
extension View {
    
    // ๐ŸŒ€view.textFieldStyle(background:) 
    public func emojiTextFieldStyle<BG: View>(
        _ background : BG,
        borderColor: Color   = .black,
        borderWidth: CGFloat = 2
    ) -> some View {
        textFieldStyle(
            EmojiTextFieldStyle(
                background : background, 
                borderColor: borderColor, 
                borderWidth: borderWidth
            )
        )
    }//end
    
    // ๐ŸŒ€view.emojiTextFieldStyle() 
    public func emojiTextFieldStyle(
        _     emoji: String  = "๐Ÿ€",
        _        bg: Color   = .orange,
        borderColor: Color   = .black,
        borderWidth: CGFloat = 2
    ) -> some View {
        textFieldStyle(
            EmojiTextFieldStyle(
                background : bg, 
                borderColor: borderColor, 
                borderWidth: borderWidth, 
                emoji      : emoji
            )
        )
    }
}

Last updated