huri000 / swiftentrykit Goto Github PK
View Code? Open in Web Editor NEWSwiftEntryKit is a presentation library for iOS. It can be used to easily display overlays within your iOS apps.
License: MIT License
SwiftEntryKit is a presentation library for iOS. It can be used to easily display overlays within your iOS apps.
License: MIT License
When I build the example project, I am getting "no such module 'QuickLayout' in the file EKMessageContentView.swift. And on the project navigator, I see a red "QuickLayout.xcodeproj".
What should I do here?
We were using the lifecycleEvents.willDisappear()
closure to execute some code on closing the Entry (in our case we wanted it at the beginning of the animation out), and noticed that in certain cases this event is never called.
Specifically, when closing an Entry using a swipe gesture, willDisappear()
is never called. See pull request for solution.
Is your feature request related to a problem? Please describe.
SwiftEntryKit should offer an alert message without an image.
Describe the solution you'd like
Make the image optional and if nil
, do not initialize an imageView at all.
Describe alternatives you've considered
Add separate preset model objects and views for alerts, but it creates reuse issue and redundancy.
Is your feature request related to a problem? Please describe.
EKWindow occupy application keyWindow while enrty attaching.
its overset any case to fetch correct application keyWindow, about present in keyWindow, about traversal with keyWindow
Describe the solution you'd like
should we show EKWindow used windowLevel-control like UIAlertViewController? That would not disturb the hierarchy of application windows
Describe alternatives you've considered
Additional context
i wish the better development with SwiftEntryKit
Hey!
I have an issue with iPhone X and safe area.
For some reason alert is placed above bottom safe area and when I scroll it, the alert view is increase. see the video bellow. How can I put my alert view on the bottom?
video: http://dropmefiles.com/gzaww
code is here:
var attributes: EKAttributes
attributes = .bottomFloat
attributes.windowLevel = .alerts
attributes.hapticFeedbackType = .success
attributes.screenInteraction = .forward
attributes.entryInteraction = .absorbTouches
attributes.scroll = .enabled(swipeable: true, pullbackAnimation: .jolt)
attributes.screenBackground = .color(color: .clear)
attributes.entryBackground = .color(color: .clear)
attributes.entranceAnimation = .init(scale: .init(from: 0.9, to: 1, duration: 0.4, spring: .init(damping: 1, initialVelocity: 0)), fade: .init(from: 0, to: 1, duration: 0.3))
attributes.exitAnimation = .init(scale: .init(from: 1, to: 0.9, duration: 0.4, spring: .init(damping: 1, initialVelocity: 0)), fade: .init(from: 1, to: 0, duration: 0.3))
attributes.displayDuration = .infinity
attributes.border = .value(color: .black, width: 0.5)
attributes.shadow = .active(with: .init(color: .black, opacity: 0.3, radius: 5, offset: .zero))
attributes.positionConstraints.size = .init(width: .constant(value: min(UIScreen.main.bounds.width, UIScreen.main.bounds.height)), height: .intrinsic)
attributes.positionConstraints.verticalOffset = 0
attributes.positionConstraints.safeArea = .empty(fillSafeArea: true)
return attributes
Describe the bug
A clear and concise description of what the bug is.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
A clear and concise description of what you expected to happen.
Screenshots
If applicable, add screenshots to help explain your problem.
iPhone (please complete the following information):
Additional context
Add any other context about the problem here.
Screenshots / Video Links
I added
pod 'SwiftEntryKit', '0.1.2'
and ran pod install
I get this message every time :(
[!] Unable to find a specification for
SwiftEntryKit (= 0.1.2)
Example can not build and run
Open SwiftEntryKit.xcworkspace
Build and run
SwiftEntryKit-master/Source/MessageViews/EKMessageContentView.swift:10:8: No such module 'QuickLayout'
Is your feature request related to a problem? Please describe.
Use a UIViewController as an entry in addition to the standard solution of a UIView.
Describe the solution you'd like
Enable developers to directly use a UIViewController as an entry. Thus, simply calling display
of the SwiftEntryKit type, should show the view of the view controller
Is your feature request related to a problem? Please describe.
Transform an entry into another entry using the same attributes for both.
Describe the solution you'd like
Create an additional state and routine that handles a slicky transformation of entry.
I wanted to run the example project so i followed
the below instruction guides
Run git clone with --recurse-submodules, to include QuickLayout as submodule, likewise:
$ git clone --recurse-submodules https://github.com/huri000/SwiftEntryKit.git
But i got error like
ld: warning: directory not found for option
ld: framework not found Pods_QuickLayoutiOSDemo
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Kindly check the screenshot
Expected behavior
It should run Fine
I'm getting this issue: [!] Unable to find a specification for SwiftEntryKit (= 0.1.5)
.
After setting the git path I get another error about QuickLayout: [!] Unable to find a specification for QuickLayout (= 1.0.13)
Running on CocoaPods 1.5.2
Describe the bug
Regular bottom toast with blurred background doesn't work on iOS 10.3.1
To Reproduce
Steps to reproduce the behavior:
iPhone (please complete the following information):
Is there a way to display multiple buttons on top of each other in such a way that they're stacked in the view? I briefly saw the documentation and saw that action-methods are supported, but how would one pass n-number of buttons, each with different delegate methods?
Is your feature request related to a problem? Please describe.
I should have a callback when popup is presented and dismissed, to do actions after presented or dismissed popup.
Describe the solution you'd like
I should have a callback when popup is presented and dismissed.
Describe alternatives you've considered
Maybe it's possible to add a delegate with to methods when finishing the animation for presenting and same when dismissing.
Additional context
nothing
First of all amazing goodlooking library!!!
I am showing a EKFormMessageView and pressing the button I validate the values of the textFields. And if one is worng I want to show EKPopUpMessageView like a Warning. But this action closes the FormMessageView. Why? Is there any chnace to keep the EKFormMessageView until all textfields are ok?
Thanks in advance.
Hello!
Based on a need I thought of implementing a SwiftEntry preset which allows you to select or multi-select items in a UITableView or UICollectionView.
The way I thought about it is that we can allow the developer to define their custom Cells or use a default cell, that has a title and accessory image with its selected accessory image. Thus, the developer would just need to pass models implementing this requirement.
As much as it would be desirable to make this with a UITableView, I think with a UICollectionView you can achieve much more different layouts with this single SwiftEntry preset.
Moreover, I guess we would need to define the maximum size the SwiftEntry can expand to before the UITableView or UICollectionView content becomes scrollable instead of expanding as much as it can to fit its content on the screen.
Would love to hear your thoughts about this and how you would go about implementing this feature!
ps: Thank you for this great project!
What if I can't set view controller-based status bar appearance to NO because my app behavior is different? I would write an extension for EKRootViewController
to override preferredStatusBarStyle
getter but the class is not public so I can't. Is there a workaround?
Description
Kits can be used for multiple UI Categories & Visual Response which can, in-some cases, appear on the screen at the same time. A typical use case would be Form & Notes. Users interact with form and notes shows the stage of completion.
Solution
Allow multiple Kits to be visible at a given time.
Additional context
As entry push itself on top of the stack and replaces active window, it might not be possible to use current implementation to push a new kit onto stack without dismissing the existing one. By separating controller "screenBackground" from entry, the above scenario can be achieved.
PS
Very good job dear Sir.
Is your feature request related to a problem? Please describe.
SwiftEntryKit should offer a notification message without an image.
Describe the solution you'd like
Make the image optional and if nil
, do not initialize an imageView at all.
Describe alternatives you've considered
Add separate preset model objects and views for notification and alert, but it creates reuse issue and redundancy.
Describe the bug
Hello!
There is issue when we are trying to show Alert when the previous one was closed.
To Reproduce
Steps to reproduce the behavior:
SwiftEntryKit.dismiss(with: {
})
show new alert "centerFloat"
Attribute:
var attributes: EKAttributes
attributes = .centerFloat
attributes.windowLevel = .normal
attributes.hapticFeedbackType = .success
attributes.screenInteraction = canBeClosed ? .dismiss : .absorbTouches
attributes.entryInteraction = .absorbTouches
attributes.roundCorners = .all(radius: 20)
attributes.scroll = .enabled(swipeable: canBeClosed ? true : false, pullbackAnimation: .jolt)
attributes.screenBackground = .color(color: UIColor(white: 0, alpha: 0.7))
attributes.entryBackground = .color(color: .white)
attributes.entranceAnimation = .init(scale: .init(from: 0.9, to: 1, duration: 0.4, spring: .init(damping: 1, initialVelocity: 0)), fade: .init(from: 0, to: 1, duration: 0.3))
attributes.exitAnimation = .init(scale: .init(from: 1, to: 0.9, duration: 0.4, spring: .init(damping: 1, initialVelocity: 0)), fade: .init(from: 1, to: 0, duration: 0.3))
attributes.displayDuration = .infinity
attributes.border = .value(color: .black, width: 0.5)
attributes.shadow = .active(with: .init(color: .black, opacity: 0.3, radius: 5, offset: .zero))
attributes.positionConstraints.maxSize = .init(width: .offset(value: CGFloat(40.0.dp)), height: .intrinsic)
attributes.positionConstraints.keyboardRelation = .bind(offset: .init(bottom: 10, screenEdgeResistance: 10))
iPhone (please complete the following information):
Describe the bug
A clear and concise description of what the bug is.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
A clear and concise description of what you expected to happen.
Screenshots
If applicable, add screenshots to help explain your problem.
iPhone (please complete the following information):
Additional context
Add any other context about the problem here.
Screenshots / Video Links
I did try whats desribed in #31 but still not running.
After the latest update my popups appears without roundCorners.
To Reproduce
Steps to reproduce the behavior:
Attribute:
var attributes: EKAttributes
attributes = .centerFloat
attributes.windowLevel = .normal
attributes.hapticFeedbackType = .success
attributes.screenInteraction = canBeClosed ? .dismiss : .absorbTouches
attributes.entryInteraction = .absorbTouches
attributes.roundCorners = .all(radius: 20)
attributes.scroll = .enabled(swipeable: canBeClosed ? true : false, pullbackAnimation: .jolt)
attributes.screenBackground = .color(color: UIColor(white: 0, alpha: 0.7))
attributes.entryBackground = .color(color: UIColor(white: 0, alpha: 0.7))
attributes.entranceAnimation = .init(scale: .init(from: 0.9, to: 1, duration: 0.4, spring: .init(damping: 1, initialVelocity: 0)), fade: .init(from: 0, to: 1, duration: 0.3))
attributes.exitAnimation = .init(scale: .init(from: 1, to: 0.9, duration: 0.4, spring: .init(damping: 1, initialVelocity: 0)), fade: .init(from: 1, to: 0, duration: 0.3))
attributes.displayDuration = .infinity
attributes.border = .value(color: .black, width: 0.5)
attributes.shadow = .active(with: .init(color: .black, opacity: 0.3, radius: 5, offset: .zero))
attributes.positionConstraints.maxSize = .init(width: .offset(value: CGFloat(40.0.dp)), height: .intrinsic)
attributes.positionConstraints.keyboardRelation = .bind(offset: .init(bottom: 10, screenEdgeResistance: 10))
return attributes
I'm displaying a nib that have button
In the dismiss for it I go to another VC but the status bar is hidden
and when UI debugging I found myself instantiating my VC in the entryKit hierarchy not in mine
Anyone have idea how to fix this or the right way to do it ?
** What I'm trying to do is to :
SwiftEntryKit supports Carthage and CocoaPods. It could be useful to support SwiftPM as well.
How can I create a custom interface.
Example add two button with action, label, image or whatever else
Describe the bug
Seems there is a bug with EKNotificationMessage. See the different from example project with 0.5.1 and your gif example:
Seems the labels should be slightly higher than now.
iPhone (please complete the following information):
Is your feature request related to a problem? Please describe.
How is the compatibility with objective-c code?
Describe the solution you'd like
To see how to use the library with objective-c
Describe alternatives you've considered
none so far
Additional context
I have a mixed objc-swift project (that we are migrating slowly and painfully) and I would like to use this awesome library
Is your feature request related to a problem? Please describe.
I would like to display multiple entries at the same time. Lets say a subtle message as statusbar overlay that says when you're offline plus an other one that displays custom notifications / infos as popups.
What I want to avoid is that the notifications dismiss the you're offline message.
I use this code to present a UIViewController
:
let vc = UIStoryboard(name: "Home", bundle: nil).instantiateViewController(withIdentifier: "VC") as! VC
SwiftEntryKit.display(entry: vc, using: .centerFloat)
But it does NOT work!!
Do I have to do anything else?
Describe the bug
Hello. The deployment target for SwiftEntryKit is 9.3 from carthage. It should be 9.0.
To Reproduce
Steps to reproduce the behavior:
iPhone (please complete the following information):
Is your feature request related to a problem? Please describe.
When an entry is displayed and another entry is pushed in, the background of the first entry animates out before the new entry is displayed. In case both entries have the same background configuration, the previous background should not animate out in order to generate continuity.
Describe the solution you'd like
EKAttributes.BackgroundStyle
and implement ==
.EKRootViewController
, before animating the previous entry out, check for background-style equality.Any method could let me set the value into textfield which I already fill in last time in Forms preset?
How to get the callback/delegation if I did finish key-in at textfield from keyboard?
EKAlertMessageView
works fine when there are only five ButtonContent
s, but it fails when there are more than five ButtonContent
s.
Here is a screenshot of the symptom
My environment:
Code generating the menu
func showPopUpOfPost(_ post: Post) {
var image = UIImage()
let semaphore = DispatchSemaphore(value: 1)
if let url = post.profileURL {
KingfisherManager.shared.retrieveImage(with: url, options: nil, progressBlock: nil) { (retrieved, error, cacheType, url) in
if retrieved != nil {
image = retrieved!
}
semaphore.signal()
}
}
semaphore.wait()
let imageContent = EKProperty.ImageContent(image: image, size: CGSize(width: 36, height: 36), contentMode: UIViewContentMode.scaleAspectFit, makeRound: true)
let title = EKProperty.LabelContent(text: UserManager.getBy(id: post.creatorID)!.displayName, style: .init(font: UIFont.boldSystemFont(ofSize: 17), color: .white))
let description = EKProperty.LabelContent(text: post.displayMessage, style: .init(font: UIFont.systemFont(ofSize: 17), color: .white))
let simpleMessage = EKSimpleMessage(image: imageContent, title: title, description: description)
let hashTagButton = buttonContent(text: "Add hashtag")
let reactionButton = buttonContent(text: "Add reaction")
let commentButton = buttonContent(text: "Add comment")
let bookmarkButton = buttonContent(text: "Bookmark")
let copyButton = buttonContent(text: "Copy message")
let pinButton = buttonContent(text: "Pin message")
let buttonsBarContent = EKProperty.ButtonBarContent(with: hashTagButton, reactionButton, commentButton, bookmarkButton, copyButton, pinButton, separatorColor: .black, expandAnimatedly: true)
let alertMessage = EKAlertMessage(simpleMessage: simpleMessage, imagePosition: .left, buttonBarContent: buttonsBarContent)
let contentView = EKAlertMessageView(with: alertMessage)
SwiftEntryKit.display(entry: contentView, using: Utilities.longPressPostAttribute)
}
private func buttonContent(text: String) -> EKProperty.ButtonContent {
let font = UIFont.systemFont(ofSize: 14)
let labelStyle = EKProperty.LabelStyle(font: font, color: .white)
let label = EKProperty.LabelContent(text: text, style: labelStyle)
return EKProperty.ButtonContent(label: label, backgroundColor: .clear, highlightedBackgroundColor: .black) {
SwiftEntryKit.dismiss()
}
}
The attributes
class Utilities: NSObject {
class var longPressPostAttribute: EKAttributes {
var attributes: EKAttributes
attributes = .bottomToast
attributes.hapticFeedbackType = .success
attributes.screenInteraction = .dismiss
attributes.entryInteraction = .absorbTouches
attributes.scroll = .enabled(swipeable: true, pullbackAnimation: .jolt)
attributes.screenBackground = .color(color: UIColor.black.withAlphaComponent(0.8))
attributes.entryBackground = .color(color: .highlight)
attributes.entranceAnimation = .init(
translate: .init(duration: 0.2, spring: .init(damping: 1, initialVelocity: 0)),
scale: .init(from: 0.6, to: 1, duration: 0.2),
fade: .init(from: 0.8, to: 1, duration: 0.1))
attributes.exitAnimation = .init(
scale: .init(from: 1, to: 0.7, duration: 0.3),
fade: .init(from: 1, to: 0, duration: 0.3))
attributes.displayDuration = .infinity
attributes.border = .value(color: .black, width: 1)
let minEdge = min(UIScreen.main.bounds.size.width, UIScreen.main.bounds.size.height)
attributes.positionConstraints.maxSize = .init(width: .constant(value: minEdge), height: .intrinsic)
return attributes
}
}
Thanks for this beautiful library!
Loading a custom view from a nib does not appear when called with SwiftEntryKit.display(...)
Steps to reproduce the behavior:
Expected behavior
the view should appear
iPhone (please complete the following information):
Source
class EditExpenseView: UIView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
init() {
super.init(frame: .zero)
setup()
}
private func setup() {
fromNib()
clipsToBounds = true
layer.cornerRadius = 5
}
}
extension NSObject {
var className: String {
return String(describing: type(of: self))
}
class var className: String {
return String(describing: self)
}
}
extension UIView {
@discardableResult
func fromNib<T : UIView>() -> T? {
guard let contentView = Bundle(for: type(of: self)).loadNibNamed(type(of: self).className, owner: self, options: nil)?.first as? T else {
return nil
}
addSubview(contentView)
contentView.fillSuperview()
return contentView
}
}
var attributes: EKAttributes
attributes = .bottomFloat
attributes.hapticFeedbackType = .success
attributes.displayDuration = 3
attributes.screenBackground = .clear
attributes.entryBackground = .clear
attributes.screenInteraction = .forward
attributes.entryInteraction = .absorbTouches
attributes.entranceAnimation = .init(translate: .init(duration: 0.5, spring: .init(damping: 0.9, initialVelocity: 0)),
scale: .init(from: 0.8, to: 1, duration: 0.5, spring: .init(damping: 0.8, initialVelocity: 0)),
fade: .init(from: 0.7, to: 1, duration: 0.3))
attributes.exitAnimation = .init(translate: .init(duration: 0.5),
scale: .init(from: 1, to: 0.8, duration: 0.5),
fade: .init(from: 1, to: 0, duration: 0.5))
attributes.popBehavior = .animated(animation: .init(translate: .init(duration: 0.3),
scale: .init(from: 1, to: 0.8, duration: 0.3)))
attributes.shadow = .active(with: .init(color: .black, opacity: 0.3, radius: 6))
attributes.positionConstraints.verticalOffset = 10
attributes.positionConstraints.size = .init(width: .offset(value: 20), height: .intrinsic)
attributes.positionConstraints.maxSize = .init(width: .constant(value: 375), height: .intrinsic)
attributes.statusBar = .dark
//this works!
// let myview:EditExpenseView = EditExpenseView()
// myview.frame = CGRect(x: 10, y: 100, width: 200, height: 200)
// self.view.addSubview(myview)
SwiftEntryKit.display(entry: EditExpenseView(), using: attributes) -> **here the entry does not appear**
Describe the bug
When compiling with XCode 10 beta two warnings appear:
SwiftEntryKit/Source/Extensions/UIApplication+EKAppearance.swift:15:9: Setter for 'isStatusBarHidden' was deprecated in iOS 9.0: Use -[UIViewController prefersStatusBarHidden]
SwiftEntryKit/Source/Extensions/UIApplication+EKAppearance.swift:16:9: Setter for 'statusBarStyle' was deprecated in iOS 9.0: Use -[UIViewController preferredStatusBarStyle]
To Reproduce
Steps to reproduce the behavior:
Expected behavior
No warnings are shown.
iPhone (please complete the following information):
Is your feature request related to a problem? Please describe.
SwiftEntryKit should offer a popup message without an image.
Describe the solution you'd like
Make the image optional and if nil
, do not initialize an imageView at all.
Describe alternatives you've considered
Add separate preset model objects and views for popups, but it creates reuse issue and redundancy.
What if we want the status bar to always be hidden and not have the note, toast, etc. show it?
Describe the bug
Cocoapods errors out when trying to install SwiftEntryKit.
To Reproduce
Steps to reproduce the behavior:
pod cache clean --all
pod deintegrate
pod 'SwiftEntryKit', '0.5.9'
into the Podfilepod install
Expected behavior
Pod would be installed without errors.
Screenshots
None, but this is the output:
$: pod install
Analyzing dependencies
Fetching podspec for `Keys` from `Pods/CocoaPodsKeys`
[!] Unable to find a specification for `SwiftEntryKit (= 0.5.9)`
iPhone (please complete the following information):
Additional context
I tried adding the pod without a version, then also tried using a previous version, to no avail.
Podfile looks more or less like this:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!
target 'main' do
pod 'Alamofire', '~> 4.5'
pod 'wpxmlrpc'
pod 'Kingfisher'
pod 'SwiftyBeaver'
pod 'Fabric'
pod 'Crashlytics'
pod 'Auth0', '~> 1.0'
pod 'SimpleKeychain', '~> 0.7'
pod 'SwiftyRSA'
pod 'AWSIoT', '~>2.6.0'
pod 'DRPLoadingSpinner'
pod 'SwiftEntryKit', '0.5.9'
end
Thanks!
EDIT: I just updated cocoapods to 1.5.3, same behavior
Hi,
Short explanation
I´m using your excellent library to create a Login window.
I´m showing the login popup window on viewDidAppear event. The problem is that the line of code after the "showSigninForm(attributes:.." is executed inmediatelly after the window is shown.
how can I make this popup modal???
Thanks in advance.
I am checking the example but I don't understand how we can get the text from the form. I tried to print out content of textFields
from following code but it didn't print out the text that I entered.
private func showSigninForm(attributes: EKAttributes, style: FormStyle) {
let title = EKProperty.LabelContent(text: "Sign in to your account", style: style.title)
let textFields = FormFieldPresetFactory.fields(by: [.email, .password], style: style)
let button = EKProperty.ButtonContent(label: .init(text: "Continue", style: style.buttonTitle), backgroundColor: style.buttonBackground, highlightedBackgroundColor: style.buttonBackground.withAlphaComponent(0.8)) {
print(textFields)
SwiftEntryKit.dismiss()
}
let contentView = EKFormMessageView(with: title, textFieldsContent: textFields, buttonContent: button)
SwiftEntryKit.display(entry: contentView, using: attributes)
}
PS: If I want to lets say show a country picker for any textfield, where can I add the code? I couldn't find any action for textFields.
Hello!
I have two questions:
Is your feature request related to a problem? Please describe.
It seems like a fun, nice-to-have feature.
Describe the solution you'd like
A popup that displays a service rating. Customizable and animatable.
Describe the bug
1- Pods/SwiftEntryKit/SwiftEntryKit/Model/EntryAttributes/EKAttributes+DisplayPriority.swift:20:19: Type 'EKAttributes.DisplayPriority' does not conform to protocol 'Hashable'
Hello,
I haven't found support or a way to adapt a displayed entry to keyboard showing/hiding, so that for example if the keyboard shows, a centred displayed entry will reposition by translating vertically.
So the question is: how can I change a displayed view position when the keyboard is shown/hid? Or, could you add support for it?
Thank you!
Describe the bug
While one entry is displayed on the screen, showing another entry freezes the app.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
Multiple entries are shown one after another.
iPhone (please complete the following information):
Additional context
Works perfectly on iOS 10., iOS 11., and even iOS 9.2.
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.