Code Monkey home page Code Monkey logo

jquery-flipster's Introduction

jQuery.Flipster

2024 Update: I no longer use jQuery and this library won't be getting any new feature development, but it still works! If it's useful to you that's great! Feel free to submit issues if you encounter major bugs. I'm declaring issue bankruptcy as of January 2024 for a clean slate.

Flipster is a CSS3 3D transform-based jQuery plugin built to replicate the familiar 'cover flow' effect, but also supports a variety of styles. Not only is it gorgeous to look at, Flipster is also:

  • Responsive: From desktop to mobile, Flipster automatically centers and scales to fit the area provided.
  • Lightweight: Javascript and CSS combined are only 5kb gzipped (13kb uncompressed). Only dependency is jQuery.
  • Touch/Scrollwheel/Trackpad/Keyboard Friendly Swipe on touch devices, scroll via trackpad or mousewheel, and use your arrow keys to fly through items!
  • Flexible: Flip an image gallery or any HTML content. Links and dynamic content work great!
  • Customizable: Four built in styles (coverflow, carousel, wheel and flat) with plenty of options to configure Flipster the way you want.

Live demo: http://brokensquare.com/Code/jquery-flipster/demo/

Browser Support

  • Chrome (latest)
  • Safari & iOS Safari (latest)
  • Firefox (latest)
  • IE 10+ full support
  • IE 8-9 limited support

Installation

Include the relevant files from /dist/ in your project, or:

npm install jquery.flipster

Basic Usage

Step 1: Include Flipster's CSS, typically in the <head>:

<link rel="stylesheet" href="css/flipster.min.css">

Tip: Use the un-minified flipster.css or the LESS files in the src/less folder to make your own Flipster styles!

Step 2: Set up your content:

<div class="my-flipster">
  <ul>
    <li><img src="" /></li>
    <li><p>Plain ol' <abbr>HTML</abbr>!</p></li>
    ...
  </ul>
</div>

*Tip: Set the itemContainer and itemSelector options to fit your markup. Flipster only requires an outer container and inner container; you aren't restricted to <div>, <ul>, and <li>s. *

Step 3: Include Flipster's Javascript after jQuery (ideally at the bottom of the page before the </body> tag) and initialize Flipster on your element:

<script src="/js/jquery.min.js"></script>
<script src="/js/jquery.flipster.min.js"></script>
<script>
    $('.my-flipster').flipster();
</script>

Step 4: Start flippin'!

Options

Configure your options when first initializing Flipster. Default values and descriptions are shown below.

$('.my-flipster').flipster({
    itemContainer: 'ul',
    // [string|object]
    // Selector for the container of the flippin' items.

    itemSelector: 'li',
    // [string|object]
    // Selector for children of `itemContainer` to flip

    start: 'center',
    // ['center'|number]
    // Zero based index of the starting item, or use 'center' to start in the middle

    fadeIn: 400,
    // [milliseconds]
    // Speed of the fade in animation after items have been setup

    loop: false,
    // [true|false]
    // Loop around when the start or end is reached

    autoplay: false,
    // [false|milliseconds]
    // If a positive number, Flipster will automatically advance to next item after that number of milliseconds

    pauseOnHover: true,
    // [true|false]
    // If true, autoplay advancement will pause when Flipster is hovered

    style: 'coverflow',
    // [coverflow|carousel|flat|...]
    // Adds a class (e.g. flipster--coverflow) to the flipster element to switch between display styles
    // Create your own theme in CSS and use this setting to have Flipster add the custom class

    spacing: -0.6,
    // [number]
    // Space between items relative to each item's width. 0 for no spacing, negative values to overlap

    click: true,
    // [true|false]
    // Clicking an item switches to that item

    keyboard: true,
    // [true|false]
    // Enable left/right arrow navigation

    scrollwheel: true,
    // [true|false]
    // Enable mousewheel/trackpad navigation; up/left = previous, down/right = next

    touch: true,
    // [true|false]
    // Enable swipe navigation for touch devices

    nav: false,
    // [true|false|'before'|'after']
    // If not false, Flipster will build an unordered list of the items
    // Values true or 'before' will insert the navigation before the items, 'after' will append the navigation after the items

    buttons: false,
    // [true|false|'custom']
    // If true, Flipster will insert Previous / Next buttons with SVG arrows
    // If 'custom', Flipster will not insert the arrows and will instead use the values of `buttonPrev` and `buttonNext`

    buttonPrev: 'Previous',
    // [text|html]
    // Changes the text for the Previous button

    buttonNext: 'Next',
    // [text|html]
    // Changes the text for the Next button

    onItemSwitch: false
    // [function]
    // Callback function when items are switched
    // Arguments received: [currentItem, previousItem]
});

Methods

Once an element has been initialized with Flipster, you can call methods to control it:

var myFlipster = $('.my-flipster').flipster(); // It's best to store the element as a variable for easy reference.

myFlipster.flipster('next'); // Next item
myFlipster.flipster('prev'); // Previous item
myFlipster.flipster('jump', 0); // Jump to a specific index
myFlipster.flipster('jump', $('.my-item')); // Jump to a specific item
myFlipster.flipster('play'); // Resume autoplay
myFlipster.flipster('play', 5000); // Set autoplay duration
myFlipster.flipster('pause'); // Pause the autoplay until next jump
myFlipster.flipster('stop'); // Stop the autoplay entirely
myFlipster.flipster('index'); // If items are added or removed, you can tell Flipster to reindex

Navigation

Set nav: true in the options and Flipster can build an unordered list of links to each item to let users jump around.

The navigation list will use each item's data-flip-title attribute as the text. If an item does not have a data-flip-title, Flipster will try to grab the title attribute, or will default to the item's index.

<div class="my-flipster">
    <ul>
        <li data-flip-title="Item 1 Title">...</li>
        <li data-flip-title="Item 2 Title">...</li>
        ...
    </ul>
</div>

Categories

Include data-flip-category attributes on your items, and the navigation list will group items into categories, allowing for basic filtering and quicker navigation.

<div class="my-flipster">
    <ul>
        <li data-flip-title="Item 1 Title" data-flip-category="Category 1">...</li>
        <li data-flip-title="Item 2 Title" data-flip-category="Category 1">...</li>
        <li data-flip-title="Item 3 Title" data-flip-category="Category 2">...</li>
        <li data-flip-title="Item 4 Title" data-flip-category="Category 2">...</li>
        <li data-flip-title="Item 5 Title">...</li>
    </ul>
</div>

Contributing

If you run into a problem or have an idea, make an issue on Github.

See room for improvement? Don't be shy! Fork this repo and I'll be happy to merge pull requests provided they keep Flipster lightweight, simple, and free of dependencies beyond jQuery. Make sure that you run grunt to generate minified files for distribution before making a pull request!

Version History

  • 1.1.6 - Jan 17 2024

    • Update npm dependencies and rebuild dist files
  • 1.1.5 - Oct 17 2020

    • Fix issue with event handling in latest browsers, thanks to @marcodafonseca and @Peadey
  • 1.1.3 - Nov 10 2017

    • Improvements to touch swiping on mobile devices, thanks to @fjmusick
  • 1.1.2 - Mar 3 2016

    • Bower & package.json fixes
  • 1.1.1 - Mar 3 2016

    • Fix for maximum callstack errors when not visible. #74 #79
  • 1.1.0 - Mar 3 2016

    • stop method added for issues like #75
  • 1.0.1 - Nov 1 2015

    • Fixed issue #63 where the active nav class was added to all nav items.
  • 1.0.0 - Oct 23 2015

    • Special thanks to @shshaw for major additions leading to version 1.0!
    • Massive rewrite for performance optimization and simplification
    • Some option names have changed; be sure to check the documentation to update your code
    • Better scrollwheel, keyboard and touch events
    • BEM syntax for all Flipster classes
    • Added autoplay option to automatically advance through items; pauseOnHover option will prevent items from switching automatically while hovered
    • Added fadeIn option for controlling duration of fade-in animation after Flipster has been setup
  • 0.3.4 - July 23 2014

    • Some additional options available
    • Cleaned up code and normalized whitespace
    • Added Grunt support for minifying css and js for distribution
  • 0.3.2 - February 4 2014

    • Added public access for jump method and functionality for exposing other methods. (Thanks @JoeWagner!)
    • A number of bug fixes.
  • 0.3.1 - July 18 2013

  • 0.3.0 - July 17 2013

    • @shshaw forked from @drien's jQuery.Flipster
    • Added new Carousel style! Shows 5 items at a time in a looping carousel
    • Added itemContainer, itemSelector, style, and start options for basic configuration
    • Added enableKeyboard, enableMousewheel, and enableTouch options to enable/disable features
    • Added enableNav and enableNavButtons options to insert controls into the container
    • Added onItemSwitch callback
  • 0.2.1 - July 11 2013

    • Fixed bug where all keyboard input was being suppressed.
  • 0.2.0 - June 27 2013

    • Added automatic height adjustment for the container element, which used to just overflow.
    • A few minor code improvements.
    • Added minified versions of the js and css files.
  • 0.1.3 - March 25 2013

    • Strong men also cry, strong men also cry.
  • 0.1.0 - March 25 2013

    • Improvements in fallbacks for old version of IE and basic fixes to make it actually work.
  • 0.0.0 - March 22 2013

    • LIFE ON THE BLEEDING EDGE BABY

License

The MIT License (MIT)

Copyright (c) 2013-2024 Adrien Delessert

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

jquery-flipster's People

Contributors

cody1213 avatar dependabot[bot] avatar drien avatar fjmusick avatar joewagner avatar krzysztofmoskalik avatar marcioos avatar marcodafonseca avatar nikrowell avatar racinggrinner avatar shshaw avatar titaniumlou 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

jquery-flipster's Issues

navigation children have incorrect active class bug

All children of .flipster__nav seem to have the class flipster__nav__item--current applied to them even if they are not currently selected.

My config is:

flipContainer.flipster({
    itemContainer: flipItemContainer,
    itemSelector: flipItem,
    loop: true,
    autoplay: 3000,
    style: 'flat',
    spacing: -0.2,
    scrollwheel: false,
    nav: 'after',
    buttons: false,
})

Resulting HTML:

[...]
<ul class="flipster__nav" role="navigation">
    <li class="flipster__nav__item flipster__nav__item--current">
        <a href="#" class="flipster__nav__link">0</a>
    </li>
    <li class="flipster__nav__item flipster__nav__item--current">
        <a href="#" class="flipster__nav__link">1</a>
    </li>
    <li class="flipster__nav__item flipster__nav__item--current">
        <a href="#" class="flipster__nav__link">2</a>
    </li>
    [...]
</ul>

Won't initialize after AJAX call

I am loading the items via ajax and it returns HTML. I then insert that HTML into the container. Then initialize flipster. First call works just fine but the succeeding calls are breaking. It gives me stacked images after.

Anyone out there who can help?

Vertical of Past & Future items not the same

Hi there,

This might not be a bug, but I wanted to ask if anybody else had an issue with the past & future items not being vertically positioned the same? I haven't made any changes to the javascript or to the CSS file, but on my project, the "future" items are located about 50px closer to the top of the container than the "past" items are. I can sort of fix it by playing with the transformation and scale, but then they look uneven in a different way.

Was just wondering if anybody else was having this issue and had any suggestions for a solution? Thanks!

Is it possible to Insert and Remove items from coverflow style?

Is it possible to Insert and Remove items from coverflow style? I tried removing the li element removed through JQ and I still see an empty space there, Also I want dynamically add an item into the specified index position. Is it possible? Thanks and appreciate any help on this.

doesn't seem to work in safari 5.1.2

Hi there,

I'm trying to test out the demos of flipster in safari 5.1.2 and the images don't load.
They work fine in firefox, but not safari. Any way to fix this?

Thanks! Laura

Vertical swipe on iOS

When testing flipster on iOS (iphone5/ipad), It is difficult to scroll vertically when the screen is filled with the flipster widget.

You need to find an area not used by the flipster widget to scroll down.

Is there any way to force flipster not to capture vertical swipes?

Many Thanks

Stacked images

I've noticed that under some circumstances the images will stack up on top of each other and not fan out. Noticed seemingly randomly in Chrome 28, Mac. Was immediately fixed by reloading the page. Not sure how to reproduce, but I'll investigate when I can.

carousel indicators

Hi,

Are there anyways to add carousel indicators like the bootstrap ones?

Thanks.

BEM Syntax

@drien,

I'm finally getting back to Flipster since I have another project that can use it. I'm sure you've seen a few small changes pushed to 0.4, but I've got some much bigger changes coming that should help Flipster run much faster and fix a lot of the outstanding issues. I'll push everything to the 0.4 branch once I've done more testing, unless you want me to start another branch.

Lately, I've adopted BEM syntax for most everything. Are you opposed to updating the Flipster classes to be BEM style?

Here's a quick example:

.flipster {}
.flipster--active {}
.flipster--no-rotate {}
.flipster--carousel {}
.flipster--coverflow {}

.flipster__container {}

.flipster__item {}
.flipster__item--past {}
.flipster__item--future {}
.flipster__item--current {}

It makes the classes a little more verbose, but it should help clarify each class's purpose better. Any objections? If not, I'll implement that in my upcoming changes.

Missing -webkit-box-reflect in Chrome

Hi Adrien,

I'm using Flipster Coverflow. Looks/works great in Safari. But in Chrome, the reflection doesn't display–unless I toggle -webkit-box-reflect rule off and on in Inspector. OR, I can just turn off on of the transition rules and then the reflection magically displays. So add, b/c the Flipster demo displays fine in Chrome.

I'm using it in a WordPress theme. I've also overridden some CSS. Can't figure if it's something not quite right in my code, or a weird Chrome bug.

Any Ideas?

Thanks,
Catherine
initial_view
toggle_off_transition_rule

Android Swipe Bug

Device: Galaxy Note 3
Browser: Default

The first slider don't responds to the swipe gesture, but the sliders change automatically. In other android devices the swipe gesture works just fine.

Does anyone have the same issue, or some advice on how to solve this?

Thanks

Preventing Keyboard Input?

I'm noticing that after Flipster is initialized, I can no longer use my keyboard for anything. Even basic things like refreshing the page or brining up the code inspector become impossible. Happy to investigate this, but can't really work with the .min files.

More images shown

Hello,

This script is exactly what i'm looking for...just one more detail and it's perfect!!

Instead of showing 2 images on left and right (to centered one), i would really need to be 3 on left, 3 on right and one centered.

I really need this for an important project, please help :(

Autoplay

Hi, is it possible to make this plug in autorotate in caurusel stile? please post me where to put code and what i need to write to do this? thanks.

Touch sensitivity and scroll speed

I'm using your flipster on a Nexus 7 and I find the responsiveness to be a bit slow when sliding/scrolling. I've hacked around a bit and implemented a touch sensitivity option (basically just implementing a variable to hold the 1.75 divisor used in touch navigation).

I'm also interested in looking if it is possible to adjust the number of "jumps" made based on how fast the user has swiped/scrolled. This would be some kind of speed option.

Would you be interested in merging such options if I created a pull request?

Safari not working

This slider is not supported in safari but still mention that it supports in safari.

Current Image selected

Dear all,

It is possible to retrieve the index of the selected image on Flipster?

Best regards,

Flavio

Conflict with bootstrap carousel

Firstly, what a great implementation of overflow and keep up the good work. Secondly, I have come across a small issue concerning flipster and the bootstrap carousel, the problem is once the flipster js is loaded it stops the bootstrap carousel from working (scrolling stops working entirely).
Would you have any suggestions as to a possible fix?

Regards

Carousel Pagination

Does current flipster support pagination? I'm unable to find pagination property in flipster Options.
Thanks.

Show images only when refresh

Hi,

I am using flipster in Carousel mode, but sometimes the images only appear refreshing the page.
It is not always, but sometimes it happens...

Anybody knows how to solve it?

Best regards,

Flavio

Show flipster after resize bug

I have come across a rather interesting bug. I have a website that hides the flipster bit to show a form component, if the page is re-sized while flipster is hidden when you show the flipster bit it collopses. This is a pretty niche bug. Can javascript determine if the page size changes. Would this be worthy of a bug fix? I can have a go at building a fix.

Thanks

Is a coverflow with looping option available?

If i have 3 items, i always want the clicked image on the center & 1 item on each side. Currently i am using 'carousel' style & when i am on the last item there is 2 items on the left & none on the right. So i need a looping style. ????

Minor issue with Colorbox

Not really an issue for a seasoned programmer, but I seem to have a problem: First of all, I really like the plug-in and I would like to make it work for me, but I have following issue (possibly a quick fix?)

I use the script as follows: Images loaded with flipster are screen shots of videos we took and I added a class (“cbiFrame”) to the links so that, when the image is clicked, it in turn opens a Colorbox with an iframe to to a given URL… so far so good, however seems I negated the functionality to maneuvering thru the images by clicking on the pref/next image(s) because, as it should, it opens the Colorbox window, displaying the video while moving the carousel in the back ground to the most active image;)

So I wonder: Is there maybe an easy where I could check if the mouse click originated from the front-most image (center image)? Maybe utilize jQuery and add a class to my URL Link (if present) and remove that class from all other images so that I restored your navigation function?

Your help is greatly appreciated,

  • Uwe Willenbacher

Sortable

Is it possible to make the items sortables?

I've made destructor function and seems to be working, not sure on how to implement sortables system though.

function destroy() {
      // Basic setup
      _flipster.removeClass("flipster flipster-active flipster-"+settings.style);


      if (settings.disableRotation)
        _flipster.removeClass('no-rotate');

      _flipItemsOuter = _flipster.find(settings.itemContainer).removeClass("flip-items");
      _flipItems = _flipItemsOuter.find(settings.itemSelector).removeClass("flip-item flip-hidden");

      //Browsers that don't support CSS3 transforms get compatibility:
      var isIEmax8 = ('\v' === 'v'); //IE <= 8
      var checkIE = document.createElement("b");
      checkIE.innerHTML = "<!--[if IE 9]><i></i><![endif]-->"; //IE 9
      var isIE9 = checkIE.getElementsByTagName("i").length === 1;
      if (isIEmax8 || isIE9) {
        compatibility = true;
        _flipItemsOuter.removeClass("compatibility");
      }

      _flipItems.each(function() {
        $(this).html($(this).find('.flip-content').html());
      });
      // Remove navigation if enabled.
      _flipster.find('.flipster-nav').remove();
      _flipster.find(".flipto-prev, .flipto-next").remove();

      _center = 0;     

      // Remove all inline style
      _flipItemsOuter.removeAttr('style');


      // Navigate directly to an item by clicking
      _flipItems.off("click");
      win.off("keydown.flipster");
      win.off("keyup.flipster");
      _flipster
        .off("mousewheel.flipster")
        .off("touchstart.flipster")
        .off("touchmove.flipster")
        .off("touchend.flipster");
}

How to refresh Flipster ?

How can we refresh flipster plugin ? Lets say we initialized plugin and it works fine, now if onchange event of some dropdown i have to re-initialize li items under ul container which is defined for the flipster. How should be refresh control so images are shown properly ?

[CHROME] 3 Items on carousel mode still uses past and future

I am dynamically loading carousel items. Max is 6 and min is 1. Now, when I have 3 items, there are times when they pile up on a corner. current > prev > past.

I want it to stop using prev and next when I only have 3 items. How do I go about that? Thank you.

browser issue

This plugin is not working on safari browser, please help as soon as possible .....

Android bug

Awesome work... not displaying on Android though :/

Any ideas?

Thx,
Jonathan.

Live demo?

It's the easiest way to view what the plugin does

Keyboard navigation on other component is updating flipster

When we have multiple flipster on the page and use keyboard to navigate through the first flipster, the successive flipsters are getting updated as well.

On investigation, I noticed that you are registering the keyboard events on the body, without checking the target of the event.

My suggestion would be to check if ".flip-content" from the present flipster is present in the "parents" tree of the event's target and only then call the jump function.

IE nav button position

I also noticed an issue with nav button position in IE 9/10/11. The button position is low compared to the "flat" setting and generates vertical scroll bars. I'm using the below CSS to tame it for now. I'll try and investigate to see if there is a better solution and get some screen shots as well.

@media all and (-ms-high-contrast:none)
 {
 .flipster__button { top: 15%; margin-top: -2em; } /* IE10 */
 *::-ms-backdrop, .flipster__button { top: 15% !important; margin-top: -2em; } /* IE11 */
 }

ie-issue

Autoplay of slider possible?

Is it possible to force a timed autoplay with this plugin? I've got it up and running, but autoplay could end up being a dealbreaker on the client side.

Pass element(s) onItemSwitch

I've had fun playing around with this plugin. Would be great if parameters were passed on the onItemSwitch event. My suggestion would be to pass the previous and current item elements.

Carousel images not loading full size in Firefox

Hi, I have the following issue:

When loading the page for the first time, all images in the carousel display at a very small size. Subsequent loads display images at full size as intended. You can replicate by hard refreshing (holding shift and refreshing the page). Seems to only happen in Firefox. I'm using FF version 32.0.1 on a mac.

I really like this flipster library, and will be using it on the home page of a large site if I can get this resolved. Currently in development so time is of the essence. Thank you!

hardrefreshinitialload

subsequentrefresh

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.