andreamiotto / partialsheet Goto Github PK
View Code? Open in Web Editor NEWA SwiftUI Partial Sheet fully customizable with dynamic height
Home Page: https://github.com/AndreaMiotto/PartialSheet/wiki
License: MIT License
A SwiftUI Partial Sheet fully customizable with dynamic height
Home Page: https://github.com/AndreaMiotto/PartialSheet/wiki
License: MIT License
There is this set on the sheet view:
.animation(self.dragState.isDragging ? nil : .interpolatingSpring(stiffness: 300.0, damping: 30.0, initialVelocity: 10.0))
which applies animation to the content of the sheet. In my case, I have views which are hidden and shown depending on the state in the sheet content and now they are automatically animated.
Per Apple's documentation on animation(_:)
: Use this modifier on leaf views rather than container views. The animation applies to all child views within this view; calling animation(_:) on a container view can lead to unbounded scope.
Basically, setting this on the the container (sheet view) is an anti-pattern. I think, explicit property animation should be used instead, this way no matter what the content is provided to the PartialSheet, it will not be affected.
Ability to stack a sheet onto another sheet.
Ability to dismiss existing sheet and quickly call a replacement sheet in function form.
Hey, nice work!
I noticed that the animation is only played when closing per tap on the background, not on drag-closing.
Here is a PR fixing it :-)
Or is this intended? Then I'll just use my fork
if we place a TabVIew and add a partial sheet to it, then add some NavigationViews for tabs and go to inside of NavigationView child views if view uses ObservedObject for ViewModel when we open partial sheet all variables in ObservedObject of ViewModel was reset
It would be great to have a style that simply takes a bool parameter for blur to produce the effect shown here:
https://medium.com/@edwurtle/blur-effect-inside-swiftui-a2e12e61e750
If you use a partial sheet to open one view.. close it.. then open the sheet with another view, the sheet open animation starts from the height of the previous sheet on the first open call of the new view.
[ISSUE FIXED IN 2.1.3]
This is great work. Thanks for your effort!
I would like execute some code when the user dismisses the sheet. Have you considered adding an onDismiss: closure?
Thank you.
I wrote the following code.
However, NavigationLink doesn't work.
How do I use NavigationLink in PertialSheet?
import PartialSheet
import SwiftUI
struct ContentView: View {
@EnvironmentObject private var partialSheetManager: PartialSheetManager
var body: some View {
NavigationView {
Button(action: {
self.partialSheetManager.showPartialSheet {
NavigationLink(destination: Text("destination view")) {
Text("navigation link")
}
}
}) {
Text("show partial sheet")
}
}
.navigationViewStyle(StackNavigationViewStyle())
.addPartialSheet()
}
}
Hello,
I'm using 2 Swift package for my SearchBar (SWIFTUIX), and Modal (PARTIALSHEET).
When I use the search bar, the keyboard appears and the view is above the keyboard.
When I add .addPartialSheet(style: .defaultStyle())
This might be related to issue #35
This would make it easy to define an automatic layout behavior, wherein the sheet would expand in increments to show more sections if they fit, and respond to scroll, naturally. Some tension between each section would give it a more natural transition, such as the spring interrupted animation wherein you implement drag interception of animation, but only start the animation after a certain magnitude of the current section is no longer visible. This would make a very nice automatic part to an automatic scrolling UI behavior on each field, wherein the user advances the form automatically and naturally as they complete each section.
Hi,
Nice work.
Just a suggestion:
It would be nice to be able to dismiss the modal from code the same way as a stock modal view. With:
@Environment (\.presentationMode) var presentationMode
and then:
{
self.presentationMode.wrappedValue.dismiss()
}
Thanks in advance if you consider it.
When this modal window appears, the buttons are not active, in order for the buttons to start working, you need to interact with scrollview, after that a modal view will jump (it will decrease by a few pixels) and the buttons will become active, I hope I explained it clearly) I also attach an example code from your project.
.partialSheet(presented: $showPartialSheet, backgroundColor: Color(UIColor.secondarySystemBackground)) {
ChangeIcons()
}
struct ChangeIcons: View {
var body: some View {
ScrollView(.horizontal, showsIndicators: false) {
HStack {
VStack(alignment: .center) {
Button(action: foofunc) {
Image("infoApp")
.resizable()
.renderingMode(.original)
.cornerRadius(15)
.frame(width: 80, height: 80)
.overlay(
RoundedRectangle(cornerRadius: 15)
.stroke(Color.red, lineWidth: 3)
.frame(width: 90, height: 90)
)
}.frame(width: 95, height: 95)
Text("Стандартная")
.font(.system(size: 11, design: .rounded))
.bold()
}
VStack(alignment: .center) {
Button(action: fooFunc) {
Image("altIconApp")
.resizable()
.renderingMode(.original)
.cornerRadius(15)
.frame(width: 80, height: 80)
.overlay(
RoundedRectangle(cornerRadius: 15)
.stroke(Color.red, lineWidth: 3)
.frame(width: 90, height: 90)
)
}.frame(width: 95, height: 95)
Text("Автор иконки")
.font(.system(size: 11, design: .rounded))
.bold()
}
}.padding(.horizontal)
}.onAppear(perform: fooFunc)
}
}
So I've noticed placing a picker in a partial sheet causes some weird issues.
Crash message
AttributeGraph precondition failure: setting value during update: 75004.
2020-06-29 09:14:19.822339-0500 Fox Relay[13433:3310197] [error] precondition failure: setting value during update: 75004
The crash originates here and is triggered here
I like this library and would like to continue using it for my app so some guidance on this would be appreciated.
I can't dismiss view with
self.presentationMode.wrappedValue.dismiss()
because I use Partial sheet, not system .sheet
How can I dismiss view which was presented by PartialSheet programmatically?
Is there a way to modify the rounding of corners?
Any possible to using AnyTransiton to insert it into View Hierarchy when presented and remove it when not presented.
Now partialSheet view is just being hidden off of the screen instead of being removed.
Possible improvements may be like below:
if presented {
PartialSheetContent.offset(offsetWhenPresented)
.transition(anyTransitionMethod).animation(anyAnimation)
}
else {
EmptyView()
}
Thanks for the amazing Swift package. It saved a lot of hours of work.
I would like to ask if it's possible to implement a functionality where, the partial sheet should have the max height equal to half the screen size (or height passed in configuration) on initial load and when swipe up, the height should change to full screen. I understand this should only be possible for contents which are of size more than half of screen.
Something like this gif. Where the partial screen takes full height when searching using a keyboard.
I have content for SheetView inside a ScrollView. And under ScrollView there are few UI elements and one button. So when the view loaded the first time the button is not working. But after doing the scroll event the button starts working. Here is my code,
//Main ContentView
`var body: some View {
HStack {
Spacer()
Button(action: {
self.partialSheetManager.showPartialSheet({
print("normal sheet dismissed")
}) {
SheetView()
}
}, label: {
Text("Display the Partial Sheet")
})
}
}`
//SheetView
`struct SheetView: View {
var body: some View {
VStack {
ScrollView {
Text("Hello")
Button(action: {
print("Button is tapping")
}) {
Text("Tap Here")
}
}
}
}
}`
Hi there, thanks for the great library! I really love to use this in my project but I just found some strange animation when using the DatePicker or Picker inside the sheet. This is the screen rec, you can see the sheet is moving up and down while using the DatePicker
And the code is basically this
.onTapGesture {
self.partialSheetManager.showPartialSheet({
print("Partial sheet dismissed")
}) {
VStack() {
Text("Some Title").bold().font(.title)
DatePicker("Please select a date", selection: self.$selectedDate, in: ...Date(), displayedComponents: .date).labelsHidden()
}.frame(height: 300)
}
}
Is there any way to fix this? Thx a lot
It appears that the new addition of keyboard observers causes elements like a tab bar to shift above the keyboard in instances where the partial sheet is added to the TabView and a keyboard is presented at any time, sheet presented or not. I think I have a solution that works.
Instead of .padding(.bottom, self.offset)
in the PartialSheetViewModifier on line 79, the negative offset should be added to iPhoneSheet()
as such .offset(x: 0, y: -self.offset)
on like 113.
if deviceType == .iphone {
iPhoneSheet()
.offset(x: 0, y: -self.offset)
.edgesIgnoringSafeArea(.vertical)
}
From my testing this solution will prevent the whole content from receiving a padding when the keyboard presents.
I'm struggling to get sheet running on a mixed setup and your documentation shows only the usage if app is configured with swiftUI form beginning.
can you show us how to use it if we don't have such a setup.
Thank you in advance!
The line self.dismissKeyboard()
in the code below crashes when dismissing the PartialSheet via a drag gesture if a TextField
in the PartialSheet has a keyboard presenting. I haven't looked too deeply into this, but I believe this may be because UIApplication.shared.sendAction(resign, to: nil, from: nil, for: nil)
is calling into something UIKit-related that SwiftUI isn't.
private func dragGesture() -> _EndedGesture<GestureStateGesture<DragGesture, DragState>> {
DragGesture()
.updating($dragState) { drag, state, _ in
self.dismissKeyboard()
let yOffset = drag.translation.height
let threshold = CGFloat(-50)
let stiffness = CGFloat(0.3)
if yOffset > threshold {
state = .dragging(translation: drag.translation)
} else if
// if above threshold and belove ScreenHeight make it elastic
-yOffset + self.sheetContentRect.height <
UIScreen.main.bounds.height + self.handlerSectionHeight
{
let distance = yOffset - threshold
let translationHeight = threshold + (distance * stiffness)
state = .dragging(translation: CGSize(width: drag.translation.width, height: translationHeight))
}
}
.onEnded(onDragEnded)
}
This should be reproducible in a pretty simple use case, but if not let me know and I can try to isolate a sample case.
Thanks a lot!
I tried this in a Mac app and found that it is full of UIKit code. If you are intending it for Mac Catalyst apps only, then update the README to say macOS Catalyst, not macOS.
sheet don't work on devices with iOS 13.1 or 13.0
it shows only white screen
Can you please update the package ?
I have tried this in my app by replacing different working instances of .sheet with .partialSheet and none of them has worked. The results have either been a blank sheet or corruption of the presenting view. Nice idea but I suspect it needs broader testing.
I try to add a TextField into partial sheet, but it does not update its @State var.
Example:
self.partialSheetManager.showPartialSheet {
TextField("Enter your name", text: self.$newBoardName)
Text("Hello, \(self.newBoardName)!") // won't update
}
I'm getting this error when I try and create a custom style. This is after adding PartialSheet using SPM.
I think it's because the PartialSheetStyle Struct needs a public init so it can be called when added as a module?
Thanks a lot to your project! but when I put my partialSheet on a button which is in a ZStack, and set the alignment .bottomTrailing, but it doesn't work .
the code as follows:
ZStack(alignment: .bottomTrailing){
VStack{
Picker("helo",selection: $selectedOption){
Text("People").tag(0)
Text("Tags").tag(1)
}.pickerStyle(SegmentedPickerStyle())
List{
ForEach(tags, id: \.self){
tag in
Text(tag.name ?? "")
}
}
}.blur(radius: addMaterialMode==false ? 0: 1000)
Button(action:{
self.addMaterialMode = true
}){
Image(systemName: "plus.circle.fill").resizable().frame(width: 70,height: 70).padding()
}.partialSheet(presented: $addMaterialMode) {
Text("hello")
}
}
it shows like this:
I have tried .bottomTrailing
.top
... but all of those don't work properly
, it can only show in the center of the screen
Xcode 12 canvas crashes as soon as PartialSheet is imported to view. Any idea how to fix this?
Hi, I added this package to make half modals as you mentioned in your stackoverflow answer. But seems like sheet is still going upto the top. The options you can specify while creating the partial sheet does not take any boolean value for it or am I doing wrong? My code is below:
import SwiftUI
import Combine
import PartialSheet
struct FriendsListView: View {
@ObservedObject var friendListVM:FriendListViewModel = FriendListViewModel()
@State var showModal:Bool = false
private func addFriend(){
self.showModal = true
}
var body: some View {
NavigationView {
List {
ForEach(self.friendListVM.friends) { friendVM in
NavigationLink(destination: FriendsDetailView(friendVM: friendVM)) {
HStack {
Image(friendVM.profilePicture)
.resizable()
.frame(width:50,height:50)
VStack(alignment:.leading) {
Text(friendVM.name)
.font(.title)
Text("$ 10.00")
}
}
}
}
}
.navigationBarTitle("Friends")
.navigationBarItems(trailing: Button(action:self.addFriend){
Image(systemName: "plus")
})
}.partialSheet(presented: self.$showModal) {
AddFriendView(isPresented: self.$showModal)
}
}
}
struct FriendsListView_Previews: PreviewProvider {
static var previews: some View {
FriendsListView()
}
}
The View is looking like below in simulator for iPhone 11 Pro Max
Hey, it would be totally awesome if you provide a license, otherwise it is illegal for others to use your code.
The license you choose is for sure up to you, but I would suggest to make it as easy as possible for people to use your code, use the Unlicense.
Otherwise, MIT is a popular choice.
Great swiftui element you developed there!
It there any way we can change the entire background color of the sheet, looks like it is always in white color. Would like to use it in dark mode.
Thank you so much!
PartialSheet is awesome and your work on 2.0 has been terrific! Thank you for what you are doing!
I have a bug in my prototype app. I do not know if it is caused by PartialSheet. I'm not as familiar with Xcode as I would like to be, and so you may want to ask me for more information.
Here is the setup:
A description of the problem:
Would it be possible that PartialSheet has a common bug that causes both crashes? What other information do you need from me?
Thank you very much for your help.
Jim
Crash with bringing up Map Settings PartialSheet
▿ 33 elements
0 : "0 ??? 0x000000011622466c 0x0 + 4666312300"
1 : "1 Cardigan 0x0000000104d69390 main + 0"
2 : "2 SwiftUI 0x00000001da5600f0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 5628144"
3 : "3 SwiftUI 0x00000001da4152a0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 4272800"
4 : "4 SwiftUI 0x00000001da5600f0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 5628144"
5 : "5 SwiftUI 0x00000001da4152a0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 4272800"
6 : "6 SwiftUI 0x00000001da55ff6c 3652361F-29A7-3130-AB4A-72A5F7BB506B + 5627756"
7 : "7 SwiftUI 0x00000001da52baf8 3652361F-29A7-3130-AB4A-72A5F7BB506B + 5413624"
8 : "8 SwiftUI 0x00000001da52aca0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 5409952"
9 : "9 SwiftUI 0x00000001da0bdea4 3652361F-29A7-3130-AB4A-72A5F7BB506B + 769700"
10 : "10 SwiftUI 0x00000001da0be9f4 3652361F-29A7-3130-AB4A-72A5F7BB506B + 772596"
11 : "11 AttributeGraph 0x00000001ce264ef4 5CAF326B-142F-3CAC-AE1C-7B4271D0A801 + 114420"
12 : "12 AttributeGraph 0x00000001ce24c88c 5CAF326B-142F-3CAC-AE1C-7B4271D0A801 + 14476"
13 : "13 AttributeGraph 0x00000001ce24cd48 5CAF326B-142F-3CAC-AE1C-7B4271D0A801 + 15688"
14 : "14 AttributeGraph 0x00000001ce251cb0 5CAF326B-142F-3CAC-AE1C-7B4271D0A801 + 36016"
15 : "15 SwiftUI 0x00000001da1cad3c 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1871164"
16 : "16 SwiftUI 0x00000001da1caaf0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1870576"
17 : "17 SwiftUI 0x00000001da1ca768 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1869672"
18 : "18 SwiftUI 0x00000001da1ca8e0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1870048"
19 : "19 SwiftUI 0x00000001da4814b4 3652361F-29A7-3130-AB4A-72A5F7BB506B + 4715700"
20 : "20 SwiftUI 0x00000001da1ca8a8 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1869992"
21 : "21 SwiftUI 0x00000001da1e6678 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1984120"
22 : "22 SwiftUI 0x00000001da05ccdc 3652361F-29A7-3130-AB4A-72A5F7BB506B + 371932"
23 : "23 SwiftUI 0x00000001da05cc4c 3652361F-29A7-3130-AB4A-72A5F7BB506B + 371788"
24 : "24 SwiftUI 0x00000001da05cd7c 3652361F-29A7-3130-AB4A-72A5F7BB506B + 372092"
25 : "25 CoreFoundation 0x00000001a1fbec54 9624AAFD-5437-3772-A507-0F357875808D + 707668"
26 : "26 CoreFoundation 0x00000001a1fb98e4 9624AAFD-5437-3772-A507-0F357875808D + 686308"
27 : "27 CoreFoundation 0x00000001a1fb9d84 9624AAFD-5437-3772-A507-0F357875808D + 687492"
28 : "28 CoreFoundation 0x00000001a1fb9660 CFRunLoopRunSpecific + 480"
29 : "29 GraphicsServices 0x00000001ac3ca604 GSEventRunModal + 164"
30 : "30 UIKitCore 0x00000001a618e15c UIApplicationMain + 1944"
31 : "31 Cardigan 0x0000000104d693e0 main + 80"
32 : "32 libdyld.dylib 0x00000001a1e351ec 95B366E7-F5BD-3308-9416-24B35999029B + 4588"
Crash with bringing up Pin Detail Settings PartialSheet
▿ 31 elements
0 : "0 ??? 0x000000011509866c 0x0 + 4647913068"
1 : "1 Cardigan 0x000000010245d390 main + 0"
2 : "2 SwiftUI 0x00000001da5600f0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 5628144"
3 : "3 SwiftUI 0x00000001da4152a0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 4272800"
4 : "4 SwiftUI 0x00000001da55ff6c 3652361F-29A7-3130-AB4A-72A5F7BB506B + 5627756"
5 : "5 SwiftUI 0x00000001da52baf8 3652361F-29A7-3130-AB4A-72A5F7BB506B + 5413624"
6 : "6 SwiftUI 0x00000001da52aca0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 5409952"
7 : "7 SwiftUI 0x00000001da0bdea4 3652361F-29A7-3130-AB4A-72A5F7BB506B + 769700"
8 : "8 SwiftUI 0x00000001da0be9f4 3652361F-29A7-3130-AB4A-72A5F7BB506B + 772596"
9 : "9 AttributeGraph 0x00000001ce264ef4 5CAF326B-142F-3CAC-AE1C-7B4271D0A801 + 114420"
10 : "10 AttributeGraph 0x00000001ce24c88c 5CAF326B-142F-3CAC-AE1C-7B4271D0A801 + 14476"
11 : "11 AttributeGraph 0x00000001ce24cd48 5CAF326B-142F-3CAC-AE1C-7B4271D0A801 + 15688"
12 : "12 AttributeGraph 0x00000001ce251cb0 5CAF326B-142F-3CAC-AE1C-7B4271D0A801 + 36016"
13 : "13 SwiftUI 0x00000001da1cad3c 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1871164"
14 : "14 SwiftUI 0x00000001da1caaf0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1870576"
15 : "15 SwiftUI 0x00000001da1ca768 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1869672"
16 : "16 SwiftUI 0x00000001da1ca8e0 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1870048"
17 : "17 SwiftUI 0x00000001da4814b4 3652361F-29A7-3130-AB4A-72A5F7BB506B + 4715700"
18 : "18 SwiftUI 0x00000001da1ca8a8 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1869992"
19 : "19 SwiftUI 0x00000001da1e6678 3652361F-29A7-3130-AB4A-72A5F7BB506B + 1984120"
20 : "20 SwiftUI 0x00000001da05ccdc 3652361F-29A7-3130-AB4A-72A5F7BB506B + 371932"
21 : "21 SwiftUI 0x00000001da05cc4c 3652361F-29A7-3130-AB4A-72A5F7BB506B + 371788"
22 : "22 SwiftUI 0x00000001da05cd7c 3652361F-29A7-3130-AB4A-72A5F7BB506B + 372092"
23 : "23 CoreFoundation 0x00000001a1fbec54 9624AAFD-5437-3772-A507-0F357875808D + 707668"
24 : "24 CoreFoundation 0x00000001a1fb98e4 9624AAFD-5437-3772-A507-0F357875808D + 686308"
25 : "25 CoreFoundation 0x00000001a1fb9d84 9624AAFD-5437-3772-A507-0F357875808D + 687492"
26 : "26 CoreFoundation 0x00000001a1fb9660 CFRunLoopRunSpecific + 480"
27 : "27 GraphicsServices 0x00000001ac3ca604 GSEventRunModal + 164"
28 : "28 UIKitCore 0x00000001a618e15c UIApplicationMain + 1944"
29 : "29 Cardigan 0x000000010245d3e0 main + 80"
30 : "30 libdyld.dylib 0x00000001a1e351ec 95B366E7-F5BD-3308-9416-24B35999029B + 4588"
Hello,
I installed it through SPM and then tried PushNavigationExample and an error was reported.
'isPresented' is inaccessible due to 'internal' protection level
I have looked at the library before, but have never used it. Now I've decided to use it and, as I understand, starting from 2.0, it's not possible to initialise PartialSheet using a binding, and is possible only using a user action (pressing a button and calling the sheet action there). If this is indeed so, I think it's a bit of a downgrade and is not in line with the SwiftUI approach.
I use global state for my navigation, so before, I could configure the state (in case of deep linking, for instance) and this way navigate to any of the views, including an opened sheet. Now it looks like I can't do that.
It is documented to run the onDismiss, but does not.
/// Close the Partial Sheet and run the onDismiss function if it has been previously specified
public func closePartialSheet() {
self.isPresented = false
}
The onDismiss function is run when dragging to close as expected.
I added something like this and bound it to an action and now I get the onDismiss to fire.
public func dismissPartialSheet() {
self.isPresented = false
self.onDismiss?()
}
I am not sure if there was intent to have the closePartialSheet merely close the sheet (e.g. maybe a cancel-type scenario) without running the onDismiss function.
In the standard Apple sheet, one can have a NavigationView inside the sheet, the same should be possible with PartialSheet.
In the code example below, you can see the behavior difference, in particular, in PartialSheet all actions become non-responsive when the NavigationView is open.
import SwiftUI
import PartialSheet
struct ExperimentAppleSheet: View {
@State var isModalSheetShown: Bool = false
@State var isPage1Active: Bool = false
var body: some View {
VStack {
Button(action: {
self.isModalSheetShown.toggle()
}) {
Text("Open sheet")
}
}
.sheet(isPresented: self.$isModalSheetShown) {
NavigationView {
VStack {
Text("Modal")
NavigationLink(destination: Text("page 1"), isActive: self.$isPage1Active, label: {
Button(action: {
self.isPage1Active.toggle()
}) {
Text("Go to next page")
}
})
}
.navigationBarItems(trailing: Button("Done",
action: {
self.isModalSheetShown.toggle()
}))
}
}
}
}
struct ExperimentPartialSheet: View {
@State var isPage1Active: Bool = false
@EnvironmentObject var partialSheetManager: PartialSheetManager
var body: some View {
VStack {
Button(action: {
self.partialSheetManager.showPartialSheet({
print("Partial sheet opened")
}) {
NavigationView {
VStack {
Text("Modal")
NavigationLink(destination: Text("page 1"), isActive: self.$isPage1Active, label: {
Button(action: {
self.isPage1Active.toggle()
}) {
Text("Go to next page")
}
})
}
.navigationBarItems(trailing: Button("Done",
action: {
self.partialSheetManager.closePartialSheet()
}))
}
}
}) {
Text("Open sheet")
}
}
.addPartialSheet(style: PartialSheetStyle(background: .solid(Color.white),
handlerBarColor: Color(UIColor.systemGray2),
enableCover: true,
coverColor: Color.black.opacity(0.4),
blurEffectStyle: nil,
cornerRadius: 10))
}
}
struct Experiment_Previews: PreviewProvider {
static var previews: some View {
ExperimentAppleSheet()
// ExperimentPartialSheet().environmentObject(PartialSheetManager()) // uncomment and comment line above to switch
}
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.