Easy to Toast & Popup any View by SwiftUI!
SwiftUI 实现的弹窗控件,简单易用!《中文文档》
SwiftUI で作られた PopupView は、簡単で使いやすいです!『日本語のREADME』
| Center Prompt | Center Confirmation | Bottom Confirmation | 
|---|---|---|
|  |  |  | 
| Bottom Input | Sidebar | Top Notification | 
|  |  |  | 
| Top Prompt | Background Color | Code Generation | 
|  |  |  | 
dependencies: [
    .package(url: "https://github.com/pikacode/PopupUI.git")
]pod 'PopupUI'import PopupUIAdd .popupUI() after a view to pop up within it's scope:
var body: some View {
    VStack {
        ...
    }
    .popupUI()  // <-- Add to the view
}Or add to the root view, only once to pop up throughout the entire application:
@main
struct PopupUI_demoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .popupUI()  // <-- Add to the root view
        }
    }
}PopupUI
    .show(Text("Hello, PopupUI!"))PopupUI
    .hide()     // Hide the last popup 
Customize various parameters:
PopupUI
    .show(YourCustomView())                 // The view to be shown
    .from(.bottom)                          // The direction from which the view is shown
    .stay(2)                                // The duration of the view staying
    .to(.center, .easeOut(duration: 0.3))   // The direction to which the view is hidden and the animation
    .background(Color.black.opacity(0.3))   // The background view
    .padding(24)                            // The padding of the view
    .isSafeArea(true)                       // Whether to avoid the safe area
    .id("Unique Popup ID")                  // The unique identifier, when not passed, the same id is used by default, so only one popup can be displayed at a time, you can display multiple popups at the same time by setting different ids
    .isAvoidKeyboard(true)                  // Whether to avoid the keyboard
    .isBackgroundOpaque(true)               // Whether to prevent the user from interacting with the background view
    .dismissWhenTapBackground(true)         // Whether to hide when the background view is tapped
    .scaleFrom(0.5)                         // show: value -> 1
    .scaleTo(0.5)                           // hide: 1 -> value
    .opacityFrom(0.5)                       // show: value -> 1
    .opacityTo(0.5)                         // hide: 1 -> value
    .duplicatedIdBehavior(.ignore)          // When the id is duplicated: .ignore: the lasteat will be ignored / .replace: the lasteat will replace the previous one
    .dismissCallback { id in                // The callback when the view is hidden
        print("Popup dismissed: \(id)")
    }Or display a view and customize the parameters through the closure:
PopupUI
    .show {
        VStack {
            ...
        }
    } config: { config in
        config.from = ...
    }PopupUI
    .hide("Unique Popup ID")    // Hide the specified popupCustomize the default parameters through PopupConfiguration.default to simplify the popup code:
let configuration = PopupConfiguration()
configuration.stay = 2
configuration.to = .center
...
PopupConfiguration.default = configurationOr:
PopupConfiguration
    .default
    .stay(2)
    .to(.center)
    ...Define all styles in App as several templates to simplify the popup code:
extension PopupConfiguration {      //PopupStyle
    static var center: PopupConfiguration {
            PopupConfiguration()
                        .from(.center)
                        .to(.center, .easeOut)
                        ...
    }
    
    static var bottom: PopupConfiguration {
            PopupConfiguration()
                        .from(.bottom)
                        .isOpaque(false)
                        ...                                    
    }
}
                                    
PopupUI
    .show(CenterView())
    .config(.center)        //.style(.center)
PopupUI
    .show(BottomView())
    .config(.bottom)