Giter Club home page Giter Club logo

jgprogresshud's Introduction

JGProgressHUD

An elegant and simple progress HUD for iOS and tvOS. Supports Swift and Objective-C!

Overview

The ultimate progress HUD for iOS and tvOS is here: JGProgressHUD!

  • Plug and play: Simple integration, easy to use, few lines of code required.
  • Easily customizable (custom animations, indicator views and more).
  • Uses UIVisualEffectView and UIMotionEffect for a native look.
  • Uses AutoLayout to provide a fully dynamic layout.
  • Detects and repositions when keyboard appears/disappears.
  • Dark mode support — automatically changes appearance.
  • Well documented and maintained.
  • Voice Over/UIAccessibility support.
  • Backward compatibility to iOS 8.
  • Can be used with Swift and Objective-C.
  • And most importantly, it looks good!

Download the source code and open the Examples project to try JGProgressHUD and see all of its features in action!

JGProgressHUD can also be used with SwiftUI. See JGProgressHUD-SwiftUI.

GitHub license CocoaPods Carthage compatible Carthage compatible

Examples

           

Showing indeterminate progress:

Objective-C:

JGProgressHUD *HUD = [[JGProgressHUD alloc] init];
HUD.textLabel.text = @"Loading";
[HUD showInView:self.view];
[HUD dismissAfterDelay:3.0];

Swift:

let hud = JGProgressHUD()
hud.textLabel.text = "Loading"
hud.show(in: self.view)
hud.dismiss(afterDelay: 3.0)

This displays a dark HUD with an activity indicator and the title "Loading". The HUD is presented with a fade animation and is dismissed after 3 seconds with a fade animation.

Showing an error message:

JGProgressHUD *HUD = [[JGProgressHUD alloc] init];
HUD.textLabel.text = @"Error";
HUD.indicatorView = [[JGProgressHUDErrorIndicatorView alloc] init]; //JGProgressHUDSuccessIndicatorView is also available
[HUD showInView:self.view];
[HUD dismissAfterDelay:3.0];

Showing determinate progress:

JGProgressHUD *HUD = [[JGProgressHUD alloc] init];
HUD.indicatorView = [[JGProgressHUDPieIndicatorView alloc] init]; //Or JGProgressHUDRingIndicatorView
HUD.progress = 0.5f;
[HUD showInView:self.view];
[HUD dismissAfterDelay:3.0];

For more examples, including in Swift, see Examples.

Important: You should always show JGProgressHUD in a UIViewController view.

Customization

Styles:

JGProgressHUD can be displayed in 3 styles:

  • Extra Light
  • Light
  • Dark

The style can also be set automatically according to the current UITraitCollection (dark mode). Use the initializer [[JGProgressHUD alloc] init]/JGProgressHUD() to take advantage of the automatic style.

Indicator Views:

By default a HUD will display an indeterminate progress indicator. The indicator view can be completely hidden by setting the indicatorView property to nil. These indicator views are available by default:

  • Indeterminate progress indicator
  • Pie progress indicator
  • Ring progress indicator
  • Success indicator
  • Error indicator
  • Image indicator

Custom indicator views can be created by subclassing JGProgressHUDIndicatorView.

Animations:

By default a HUD will use a fade animation. Several parameters can be altered such as animation duration or animation curve. A HUD can be displayed without animation and different animations can be used. These animations are available by default:

  • Fade
  • Zoom and Fade

Custom animations can be created by subclassing JGProgressHUDAnimation.

To dim the content behind the HUD set your dim color as backgroundColor of your JGProgressHUD instance.

Installation

Swift Package Manager:

In Xcode, use the menu File > Swift Packages > Add Package Dependency... and enter the package URL https://github.com/JonasGessner/JGProgressHUD.git.

This is the recommended way of installing JGProgressHUD.

Carthage:

In your Cartfile add:

github "JonasGessner/JGProgressHUD"

CocoaPods:

In your Podfile add:

pod 'JGProgressHUD'

Manual Installation:

  1. Drag the JGProgressHUD.xcodeproj file into your Xcode project.
  2. Add JGProgressHUD.framework to "Embedded Binaries" in the "General" tab of your target.

After installing import the module where you want to use it:

@import JGProgressHUD;

Swift:

import JGProgressHUD

See the Examples project for an example implementation of JGProgressHUD as framework.

Requirements

  • Base SDK of iOS/tvOS/macCatalyst 13.0 or higher.
  • Deployment target of iOS 8.0, tvOS 9.0, macCatalyst 13.0, or higher.

JGProgressHUD can also be used by projects written in Swift. See Installation for details.

Documentation

Detailed documentation can be found on here.

Each class and method is well documented, making it easy to quickly get a good overview. To start, see JGProgressHUD.h.

License

MIT License.
© 2014-2020, Jonas Gessner.

Credits

Created and maintained by Jonas Gessner, © 2014-2020.

jgprogresshud's People

Contributors

aporat avatar colemancda avatar diederich avatar gantman avatar ggurantz avatar jeehut avatar johncoates avatar jonasgessner avatar keith avatar krzyzanowskim avatar mallorypaine avatar mjwybrow avatar mman avatar mplorentz avatar reflejo avatar sberrevoets avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jgprogresshud's Issues

HUD is currently transitioning issue

Hi,
I have used JGProgressHUD to show loading progress on login page. When user input wrong user/password, then i want to show error message using JGProgressHUDErrorIndicatorView.
But it occurs error:
2014-09-04 16:15:30.734 SPS[3839:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'HUD is currently transitioning'

How can i solve this problem?
Thanks.

Fail to install v1.3 via Carthage

This is the only message i get:

Failed to read file or folder at /private/var/folders/mp/1x8f09w51rz2ghkxy3zkglwc0000gn/T/carthage-archive.w4JYoc/__MACOSX/JGProgressHUD.framework

PLS HALP!

Rotation Issue

Hi Jonas

Found another issue.

I've got a "portrait-only" ViewController, which is called from a normal (portrait and landscape) ViewController. Now when I am in landscape mode and go to the portrait-only ViewController, the ProgressHUD is displayed quite wrong.. This issue also appears while changing orientation.

Thanks for your great code anyway. It's a very cool HUD :)

Ignore "dismiss" when not on display instead of asserting it?

Hi, thanks for making this awesome piece of UI.

The current behavior of JGProgressHUD due to the NSAsserts is that it will crash when

  • showInView is called but it is already on view
  • dismiss is called but it is not on view

I wonder if such situations can be better handled by simply ignoring the command and produce a warning message, instead of immediately crashing the program. Is there any disadvantage in doing so?

I'll be happy to make a pull request if you think this is a good idea.

iOS 10: UIView setEffect crash

I'm experiencing a crash in 1.4 on a iOS 10 device that says:

-[UIView setEffect:]: unrecognized selector sent to instance

I don't see anywhere in the source where setEffect is being used. Any clue?

Better animations

Sorry for bothering you again.
Current HUD transition between states without text and with some text/details (and when changing visible text/details values) does not really look good -
text/detail labels are floating over the HUD borders. Is it possible to somehow fix these transitions (to make text labels appearing from the center of HUD and not crossing the HUD borders)?
Here is the example video: http://youtu.be/IVEkKvK_wRs
Thanks.

Unsupported Architectures.

ERROR ITMS-90087: "Unsupported Architectures. The executable for xxx.app/Frameworks/JGProgressHUD.framework contains unsupported architectures '[x86_64, i386]'."
ERROR ITMS-90087: "Unsupported Architectures. The executable for xxx.app/Frameworks/JGProgressHUD.framework contains unsupported architectures '[x86_64, i386]'."

Parallax Motion Effect Option

I notice that when device is moved around, the hud moves as well, mimicing the parallax on iOS backgrounds.
I suggest allowing an option to enable/disable that named something like "enableParallaxEffect".
Additionally it may be good to provide a mode of 3 types:

Show HUD over keyboard

Hello! Have a question.
For some reason I prefer not to dismiss keyboard while showing HUD and seeking the simple way to deny user possibility of pressing the keyboard buttons while making some network request in background.
Is it possible to somwhow display HUD to cover the visible keyboard?
Thanks!

Remove asserts

Hi,

You should remove or catch the asserts in the show and hide methods. It's not cool that the app crashes if you try to show a HUD twice. It should just fail gracefully.

Swift Project not loading success/failure images, cocoapods integrated

Hi, So I've integrated the library through cocoapods, and I'm having a pure swift project, XCode 6.3.. really didn't change anything.. any thoughts?
P.S: I'm importing in my swift file using the swift import JGProgressHUD, not through bridging header.. (which btw, I can't import it through bridging header alone)..
I don't know if that's enough information.. the library is working fine really, just the images are not loading apparently from the resources bundle, everything else is fine...

BlockAllTouches and blocks

If you have HUD with JGProgressHUDInteractionTypeBlockAllTouches the tapBlock are actually triggered, otherwise they are not. This is not corresponding with documentation.

iOS 7 crash

Hi, congratulations for the work.

My application crashes when running in iOS 7 before did not happen.

Use CocoaPods with JGProgressHUD version: 1.3.4

if (iOS7) {
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateMotionOnHUDView) name:UIAccessibilityReduceMotionStatusDidChangeNotification object:nil];
        }

Thank you for your prompt reply.

Does not support screen rotations

Hello! This HUD looks very nice and promising. But as I can see it doesn't update position properly on screen rotations (and when keyboard appears). Would be great to have such feature. Thanks!

Scheme doesn't get built when trying Carthage install

When trying to build the framework using Carthage v0.7.5, I see the following:

*** Checking out JGProgressHUD at "v1.2.7"

but nothing similar to this:

*** Building scheme "JGProgressHUD" in JGProgressHUD.xcworkspace

and afterwards there is no JGProgressHUD framework in Carthage's Build folder either. Can you reproduce this issue?

important problem

How to make a progress bar when the progress bar shows that it can be operation interface, because when a progress bar pops up, now he can only wait for, and can't do any operation, thank you

Add new feature

I like this code!
But , I want to run some code after progressHUD dismissed, Could add some block after JGProgressHUD dismissed ?
I think this feature is very useful !
Thank you.

userInteractionEnabled property counter-intuitive

First of all, I really enjoy this control. Excellent work.

I do have one issue/question. In order to prevent the user from interacting with views behind the HUD, I understand I need to set the userInteractionEnabled property. However, in order to disable interaction I have to set userInteractionEnabled = YES. In plain English that reads to me that I have set the user interaction enabled property to YES thereby allowing interaction which is actually the opposite of what I have done.

Hope this makes sense. It seems that I should set this property to NO in order to disable user interactions with background views.

Support adding UIImageView as a subview to `.contentView`

It seems to loose the padding when I do so.

JGProgressHUD *HUD = [JGProgressHUD progressHUDWithStyle:JGProgressHUDStyleLight];
HUD.indicatorView = nil;
[HUD.contentView addSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hud-saved"]]];
[HUD showInView:self.view];

Results in:

Weirdly enough this works, though with a warning:

JGProgressHUD *HUD = [JGProgressHUD progressHUDWithStyle:JGProgressHUDStyleLight];
HUD.indicatorView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hud-saved"]];
[HUD showInView:self.view];

IndicatorView is not accessible in swift

var hud:JGProgressHUD = JGProgressHUD(style:JGProgressHUDStyle.ExtraLight)
hud.indicatorView = nil

gives the error:
'JGProgressHUD' does not have a member named 'indicatorView'

Not centered

See

import UIKit

class MyViewController: UIViewController {

    var hud : JGProgressHUD!

    override func viewDidLoad() {
        super.viewDidLoad()

        hud = JGProgressHUD(style: JGProgressHUDStyle.Light)
        hud.showInView(self.view)
    }

}

Carthage bitcode issue

There is an issue with this on carthage when using archive builds of a project using the created framework, You can check out this link Carthage/Carthage#53 for more detail. Basically you need to add user-defined-setting of "BITCODE_GENERATION_MODE" set to "bitcode" in the framework project before it will be able to work from a carthage builds. I have already cleared this with the guys at Alamofire and it works.

Change the HUD background color to clear

Now we have three styles JGProgressHUDStyleExtraLight, JGProgressHUDStyleLight and JGProgressHUDStyleDark.
How can I create a HUD with clear background color?

dismissAnimated withCompletion

Is there a way to dismiss the hud with a completion block? I need to dismiss the hud (animated) on a modal controller, and once the hud is completely dismissed, I need to dismiss the modal controller. Right now, when I try to dismiss the hud and then the modal controller without this method, I get the error: "HUD is not visible" because the modal gets dismissed before the hud gets dismissed.

Blurry font

Hi Jonas

The font in the progress hud seems a bit blurry..

I already changed the font and frame size, but something seems to be wrong.

Thanks

`userInteractionEnabled` not effectively implemented.

This is a really nice library, but it is not effective to rely on targetView.userInteractionEnabled to completely block interaction with the UI. For example if the view contains a child view controller via an embed segue, the child view controller's interaction does not appear to be blocked by userInteractionEnabled. A better approach would be to place a transparent overlay view over the entire target view and block interaction with that. I will see if I can get this implemented myself.

Parallax Motion Clip Bug

Noticed the following bug when moving the device with the hud present.
Seems to be a problem caused by clipping.
Using Swift and added it to an empty view controller.

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = UIColor.blackColor()

        let hud = JGProgressHUD(style: .ExtraLight)
        hud.showInView(view)
    }
Initial presentation

screen shot 2016-07-03 at 4 01 57 pm

Having moved the device

screen shot 2016-07-03 at 4 02 11 pm

HUD crashes if dismiss called more than once

If you call dismiss on the HUD more than once (for any number of reasons) it bumps into the the NSAssert for self.targetView. It seems more practical to ignore the calls to dismiss rather than allowing it to continue in and crash.

Any plans of making it a dynamic library?

As iOS 8 supports dynamic libraries, it will be great if there can be a dynamic version of this library. Then it can be installed using Carthage for example, and I think that's more friendly than a static library.

HUD position issue

Hi, first of all — thanks for awesome lib that you've made!

Unfortunately, i've faced an issue with it :(

Version: 1.3.1
iOS versions: 8&9. Both simulator & device.

Flow:

  1. present HUD in UIViewControllers view
  2. push another view controller to navigation stack
  3. rotate device
  4. go back to previous controller
  5. observe wrong position for HUD

I've made small project which shows the issue: https://github.com/Austinate/JGProgressHudIssue
You can run UI test testRotation and see what's happening. Sorry if test is bad or it's code smells, it was my first experience with XCTest UI testing 😭

Image that shows issue.

As i see what's happening — view controllers view bounds doesn't change on rotation if controller wasn't presented on screen during rotation.

I'm not sure if it's actually any implementation issue for JGProgressHUD (since it's accessing view bound as supposed to do), but i'd like to receive any advice that can help me, thanks!

Update

I was able to fix issue described in ticket, but than i've found that in my case that it still wasn't working so good. What i have: https://imgflip.com/gif/tew5o (gif)

I've updated test project with proper code to reproduce my issue. What happens: i show spinner in viewWillAppear and hide it after some networking stuff is done. So while appearing animation of HUD is in progress — frame change isn't happening because of this code:

if (_transitioning) {
        _updateAfterAppear = YES;
        return;
    }

So here comes question: will there be any UI issues if we'd let it to change frame during appear or there was some another reason why this code was added?

could have singletion hub?

    func requestLoginAction(sender: UIButton) {
        //进行登录
        hub.textLabel.text = "登录中..."
        hub.showInView(self.view)
        GCDBlock.async(GCDQueue.Default) {
            //do login

            let api = UserAPI()
            api.loginByUseranmeAndPassword("zhangsan", password: "123456", successHandler: { (json:JSON) in
                    GCDBlock.async(GCDQueue.Main, closure: {

                        if let code = json["code"].int where code != 200 {
                            GCDBlock.async(GCDQueue.Main, closure: {
                                let hub = JGProgressHUD(style: .Dark)
                                hub.indicatorView = JGProgressHUDErrorIndicatorView()
                                hub.textLabel.text = "\(json["msg"].stringValue)"
                                hub.showInView(self.view)
                                hub.dismissAfterDelay(3)
                            })
                        } else {
                            GCDBlock.async(GCDQueue.Main, closure: {
                                let hub = JGProgressHUD(style: .Dark)
                                hub.indicatorView = JGProgressHUDSuccessIndicatorView()
                                hub.textLabel.text = "登录成功"
                                hub.showInView(self.view)
                                hub.dismissAfterDelay(3)
                                //跳转到首页
                                let mainVC = self.storyboard?.instantiateViewControllerWithIdentifier("RootTabBarViewController") as! RootTabBarViewController

                                if let window = UIApplication.sharedApplication().delegate?.window {
                                    window?.rootViewController = mainVC
                                }
                            })

                        }
                    })
                }, errorHandler: { (err: NSError) in
                    GCDBlock.async(GCDQueue.Main, closure: {
                        self.hub.indicatorView = JGProgressHUDErrorIndicatorView()
                        self.hub.textLabel.text = "\(err.localizedDescription)"
                        self.hub.showInView(self.view)
                        self.hub.dismissAfterDelay(3)
                    })
            })
        }

    }

any solution?

Cocoapods inclusion would be nice

Thanks for the work, it looks like a great library. I was wondering if you could have this added to Cocoapods.org so I can add it to my project and allow my developers to update easily.

interactionType Unexpected results

It seems that the interactionType handling should be reversed. I would assume BlockNoTouches would mean that no touches would be blocked, but in this case, every touch is blocked as seen by the hittest code.

if (self.interactionType == JGProgressHUDInteractionTypeBlockNoTouches) {
    return nil;
}
else {
    UIView *view = [super hitTest:point withEvent:event];

    if (self.interactionType == JGProgressHUDInteractionTypeBlockAllTouches) {
        return view;
    }
    else if (self.interactionType == JGProgressHUDInteractionTypeBlockTouchesOnHUDView && view != self) {
        return view;
    }

    return nil;
}

Undefined symbols for architecture arm64

I was using cocoa pods to install JGProgressHUD: pod 'JGProgressHUD'.
However, when compiling the project, I kept getting error msg as bellowing.
Any fix or suggest?

 Undefined symbols for architecture arm64:
     "_OBJC_CLASS_$_JGProgressHUDSuccessIndicatorView", referenced from:
         objc-class-ref in previewLayer.o
     "_OBJC_CLASS_$_JGProgressHUD", referenced from:
         objc-class-ref in previewLayer.o
  ld: symbol(s) not found for architecture arm64
  clang: error: linker command failed with exit code 1 (use -v to see invocation)

Multiple Hud

Calling progress hud twice resulting cannot touch. (whole area is blocked -> except the navigation bars)

iOS9

Hi Jonas, any plans for iOS9?
img_2408

Cheers, Flavio

Add GracePeriod Option

I would like to see an option for setting a grace period. I have subclassed JGProgressHUD for one of my projects. Maybe you want to implement something similar?

import "JGProgressHUD.h"

@interface FSProgressHUD : JGProgressHUD

@Property NSNumber* graceTime;
@Property BOOL taskInProgress;
@Property BOOL showInSuperview;

  • (void)showInView:(UIView*)view;
  • (void)dismiss;

@EnD

import "FSProgressHUD.h"

@interface FSProgressHUD ()

@Property NSTimer* graceTimer;
@Property UIView* view;

@EnD

@implementation FSProgressHUD

/**
Shows the HUD animated. You should preferably show the HUD in a UIViewController's view.
@param view The view to show the HUD in. The frame of the @c view will be used to calculate the position of the HUD.
*/

  • (void)showInView:(UIView*)view
    {
    if (_graceTime && [_graceTime doubleValue] > 0.0) {
    _view = view;
    _taskInProgress = YES;
    _graceTimer = [NSTimer scheduledTimerWithTimeInterval:[_graceTime doubleValue] target:self
    selector:@selector(handleGraceTimer:)
    userInfo:nil
    repeats:NO];
    }
    else {
    [super showInView:view];
    }
    }
  • (void)dismiss
    {
    _taskInProgress = NO;
    [super dismiss];
    }
  • (void)handleGraceTimer:(NSTimer*)theTimer
    {
    if (_taskInProgress) {
    if (_showInSuperview && _view.superview) {
    [super showInView:_view.superview];
    }
    else {
    [super showInView:_view];
    }
    }
    }

@EnD

please add a property

please add a property like MBProgressHUD opacity background
HUD.dimBackground = YES;

Error when Dismiss Hud

I am having error when dismiss hud.

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'HUD is currently transitioning'

-(void)downloadData
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
JGProgressHUD *HUD = [[JGProgressHUD alloc] initWithStyle:JGProgressHUDStyleDark];
HUD.textLabel.text = @"Loading...";
HUD.delegate = self;
[HUD showInView:self.view];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
[HUD dismiss];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];

}
on JGProgressHUD.m file

  • (void)dismissAnimated:(BOOL)animated {
    CHECK_TRANSITIONING; ///<<<<<<<<<<<<<<<<<<<<<Error on this line

    _transitioning = YES;

    if ([self.delegate respondsToSelector:@selector(progressHUD:willDismissFromView:)]) {
    [self.delegate progressHUD:self willDismissFromView:self.targetView];
    }

    if (animated && self.animation) {
    [self.animation hide];
    }
    else {
    [self cleanUpAfterDismissal];
    }
    }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.