GithubHelp home page GithubHelp logo

mmistakes / made-mistakes-jekyll Goto Github PK

View Code? Open in Web Editor NEW
443.0 18.0 191.0 15.19 MB

Deprecated source for mademistakes.com. Previously built with Jekyll, Gulp, and Netlify.

Home Page: https://mademistakes.com

License: MIT License

Ruby 6.60% JavaScript 15.88% CSS 41.53% HTML 35.44% Liquid 0.56%
jekyll gulp netlify algolia jamstack personal-website jamstack-site

made-mistakes-jekyll's Introduction

Made Mistakes Source Code

This is the source code of Made Mistakes, a personal blog and portfolio built with Jekyll Gulp, and Netlify.

Please note: Made Mistakes hasn't been "themed" like some of my other Jekyll repos and isn't compatible with the "default" GitHub Pages workflow without substantial alterations.

Plugins used

Images

Made Mistakes has a lot of image assets. src/assets/images/ has been split into its own repo and included as a Git submodule.

page.image.feature should be placed in src/assets/images/feature. These feature images will be converted into various sizes to be responsively served by browsers that support the srcset attribute.

Content helpers

Notices

Call-out text. Accepts the following types: info, danger, warning, and success. See style guide for visual examples.

Default notice example:

{% notice %}
Call out some text. **Markdown** is acceptable.
{% endnotice %}

Danger notice example:

{% notice danger %}
**Danger! Danger!** Use caution.
{% endnotice %}

Figure

Easily generate figure elements with optional caption and class parameters.

Examples:

In simplest usage:

{% figure %}
![Image](/path/to/image.jpg)
{% endfigure %}
<figure>
  <img src="/path/to/image.jpg" alt="Image" />
</figure>

If a figure contains an image (or multiple images), the surrounding <p> will be stripped:

{% figure %}
![Image](/path/to/image.jpg)
{% endfigure %}
<figure>
  <img src="/path/to/image.jpg" alt="Image" />
</figure>

You can provide a caption. Any markdown will be rendered:

{% figure caption:"*Markdown* caption" %}
![Image](/path/to/image.jpg)
{% endfigure %}
<figure>
  <img src="/path/to/image.jpg" alt="Image" />
  <figcaption><em>Markdown</em> caption</figcaption>
</figure>

You can also provide a class name(es) for CSS styling:

{% figure caption:"A caption" class:"classname" %}
![Image](/path/to/image.jpg)
{% endfigure %}
<figure class="classname">
  <img src="/path/to/image.jpg" alt="Image" />
  <figcaption>A caption</figcaption>
</figure>

Finally, the caption parameter will accept liquid output markup:

{% figure caption:"{{ page.title }}" %}
![Image](/path/to/image.jpg)
{% endfigure %}
<figure>
  <img src="/path/to/image.jpg" alt="Image" />
  <figcaption>The title of my post</figcaption>
</figure>

Lazyload

Lazyload images using lazysizes until they're actually needed for improved page performance.

Attribute Required Description
data-src Required Full path to image eg: /assets/images/filename.jpg. Use absolute URLS for those hosted externally.
src Optional Full path to low-quality image eg: /assets/images/filename.jpg. Use absolute URLS for those hosted externally. Defaults to inline transparent .gif.
alt Optional Image alternate text.

Example:

{% lazyload data-src="/assets/images/my-image.jpg" src="/assets/images/my-image-low-quality.jpg" alt="my lazyloaded image" %}

Responsive video embed

Embed a video from YouTube or Vimeo that responsively sizes to fit the width of its parent using /_plugins/video_embed.rb.

YouTube

To embed the following YouTube video at url https://www.youtube.com/watch?v=XsxDH4HcOWA (long version) or https://youtu.be/XsxDH4HcOWA (short version) into a post or page's main content you'd use:

{% youtube XsxDH4HcOWA %}
Vimeo

To embed the following Vimeo video at url https://vimeo.com/97649261 into a post or page's main content you'd use:

{% vimeo 97649261 %}

Local development

Let Jekyll do what it does best and transform your content into HTML. Asset management is handled by Gulp:

  • build style.css (preprocess SCSS, add vendor prefixes, concatenate, minify, hash, and gzip)
  • build critical path CSS
  • build index.js (concatenate, minify, hash, and gzip)
  • optimize images
  • optimize and resize feature images
  • optimize and combine SVG icon set
  • serve site locally for testing with Browser Sync
  • deploy site to production server via Rsync
  • submit XML sitemap to Google & Bing

Default structure (paths can be modified in gulpfile.js and _config.yml):

├── gulp                      # => gulp tasks
├── src                       # => source Jekyll files and assets
|  ├── _includes
|  ├── _layouts
|  ├── _plugins
|  ├── ...
|  ├── _posts
|  ├── assets
|  |  ├── icons
|  |  ├── images
|  |  |   └── feature
|  |  ├── javascript
|  |  |   ├── plugins
|  |  |   ├── vendor
|  |  |   └── main.js
|  |  ├── stylesheets
|  |  |   ├── vendor
|  |  |   ├── ...
|  |  |   └── style.scss
├── .editorconfig
├── .gitignore
├── _config.dev.yml
├── _config.yml
├── Gemfile
├── gulpfile.js
├── package.json
├── rsync-credentials.json
├── ...

Getting started

Dependencies:

  • Ruby: >2.1 with Bundler >1.10
  • Node: >4.2 and Yo >1.7.0
  • Yarn
  • Gulp: Since the release candidate is running Gulp 4.0 you need to install gulp-cli: npm install gulp-cli -g

Step 1: Install Bundler, then run bundle install.

Step 2. Install Node.js and Yarn, then run yarn install.

Step 3: Install node-gyp.

Step 4. To start run gulp. A development version of the site should be generated and opened in a browser with Browser Sync at http://localhost:4000.

Usage

gulp [--prod]

This is the default command, and probably the one you'll use the most. This command will build your assets and site with development settings. You'll get sourcemaps, your drafts will be generated. As you are changing your posts, pages and assets they will automatically update and inject into your browser via BrowserSync.

--prod

Once you are done and want to verify that everything works with production settings you add the flag --prod and your assets will be optimized. Your CSS, JS and HTML will be minified and gzipped, plus the CSS and JS will be cache busted. The images will be compressed and Jekyll will generate a site with all your posts and no drafts.

gulp build [--prod]

This command is identical to the normal gulp [--prod] however it will not create a BrowserSync session in your browser.

gulp (build) [--prod] main subtasks

gulp jekyll [--prod]

Without production settings Jekyll will only create both future posts and drafts. With --prod none of that is true and it will generate all your posts.

gulp styles|scripts [--prod]

Both your CSS and JS will have sourcemaps generated for them under development settings. Once you generate them with production settings sourcemap generation is disabled. Both will be minified, gzipped and cache busted with production settings.

gulp images:optimize

Optimizes standard images and copies to /dist folder.

gulp images:feature

Similar to the previous task but for images in src/assets/images/feature. Resizes each image into various sizes to be served responsively with <img> srcset or <picture> elements, optimizes, and then copies to /dist folder.

gulp html --prod

Does nothing without --prod. Minifies and gzips your HTML files.

gulp serve

If you just want to watch your site you can run this command. If wanted you can also edit the serve task to allow it to tunnel via localtunnel so people outside your local network can view it as well:

  // tunnel: true,

You can also change the behavior for how it opens the URL when you run gulp [--prod], you can see the options here:

  // open: false,

gulp icons

SVG assets are optimized and smashed together into assets/icons/icons.svg and can be referenced by name. To update or add new assets place appropriately named .svg files into the src/assets/icons folder.

gulp deploy

When you're done developing and have built your site with either gulp --prod or gulp build --prod you can deploy your site with Rsync.

If you need any help with configuring it, checkout the gulp-rsync repo.

gulp submit:sitemap

Submit sitemap XML file to Google and Bing.

gulp check

Builds site with production settings then tests HTML for broken links with html-proofer.

gulp clean

Deletes your assets from their .tmp directory as well as in dist and deletes any gzipped files. NOTE: Does not delete your images from .tmp to reduce the time to build your site due to image optimizations.

gulp rebuild

Only use this if you want to regenerate everything, this will delete everything (images, assets, your generated Jekyll site). You really shouldn't need to do this unless you have phantom image assets floating around you want to clear.

gulp critical

Extract critical path CSS from home, archive, post, and page layouts to inline via Jekyll _includes.

Note: Clear critical-<layout>.css includes, run gulp build, then gulp critical.

Subtasks

All of the subtasks lives in their own files in the gulp directory and are named after what they do. You can edit or look at any of them to see how they actually work. They're all commented.

Inject more than one JavaScript file

If you want to split up your JavaScript files into say a index.js and a vendor.js file with files from [Bower][https://bower.io/] you can do this quite easily. Create a copy of the scripts gulp task and rename it to scripts:vendor and change the gulp.src files you need:

gulp.src([
  'bower_components/somelibrary.js/dist/somelibrary.js',
  'bower_components/otherthing.js/dist/otherthing.js'
])

and then change .pipe(concat('index.js')) into .pipe(concat('vendor.js')). Then you go to the bottom of the gulpfile and change the assets task:

gulp.task('assets', gulp.series(
  gulp.series('clean:assets'),
  gulp.parallel('styles', 'scripts:vendor', 'scripts', 'fonts', 'images')
));

Notice the scripts:vendor task that has been added. Also be aware that things are injected in alphabetical order, so if you need your vendor scripts before the index.js file you have to either rename the index.js file or rename the vendor.js file. When you now run gulp or gulp build it will create a vendor.js file and automatically inject it at the bottom of your HTML. When running with --prod it'll automatically optimize as well.

For more advanced uses, refer to the gulp-inject documentation on how to create individual inject tags and inject specific files into them.

Gulp tasks inspired by generator-jekyllized by Sondre Nilsen.


Posts and Pages

Comments are disabled by default. To enable add comments: true to the YAML Front Matter. Preferred method is to enable via YAML Front Matter defaults in _config.yml.

License

The MIT License (MIT)

Copyright (c) 2004-2019 Michael Rose

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.

Made Mistakes incorporates icons from The Noun Project. Icons are distributed under Creative Commons Attribution 3.0 United States (CC BY 3.0 US). Home by Mahmure Alp from the Noun Project

Made Mistakes incorporates photographs from Unsplash.

Made Mistakes incorporates Breakpoint. Breakpoint is distributed under the terms of the MIT/GPL Licenses.

Made Mistakes incorporates Bigfoot, Copyright (c) 2013-2014, Chris Sauve. Bigfoot is distributed under the terms of the MIT License](http://opensource.org/licenses/MIT).

Made Mistakes incorporates Lity, Copyright (c) 2015-2016, Jan Sorgalla. Lity is distributed under the terms of the MIT License](http://opensource.org/licenses/MIT).

Made Mistakes incorporates Smooth Scroll, Copyright (c) 2019, Chris Ferdinandi. Smooth Scroll is distributed under the terms of the MIT License.

Made Mistakes incorporates Lazysizes, Copyright (c) 2015, Alexander Farkas. Lazysizes is distributed under the terms of the MIT License.

Made Mistakes incorporates SVG for Everybody, Copyright (c) Jonathan Neal. SVG for Everybody is distributed under the terms of the CC0 1.0 Universal License.

made-mistakes-jekyll's People

Contributors

dependabot[bot] avatar gbbns avatar mmistakes avatar nhoizey avatar parvjain avatar snyk-bot avatar staticman-net[bot] 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

made-mistakes-jekyll's Issues

Center "reply" lines

reply-lines

.comment.child:before {
    position: absolute;
    top: 4em;
+   left: 1.5em;
    bottom: 0;
    content: '';
    width: .5em;
    background-color: #e3e3e3;
+   bottom: -2em;
}

Text Callouts for Basically Basic Theme?

Looking through this repo trying to figure out if I can glean how you did the text callouts danger, warning etc so I can add them to Basically Basic. Is there already a way to do this in that theme that I am missing and if not could you advise how to accomplish this or add it to that theme?

bigfoot.js popup overflowing

Hi @mmistakes
I just notices a bug with bigfoot while implimenting on my website, and is present on your website too.

Bug - On mobile device (my mobile screen res - 720x1280), the popup overflow from the screen if shown on extreme left on the screen.

I thought of putting this issue on bigfoot.js repo, nut the project is stale with many issues pending. However I found this opened issue which might be the same -lemonmade/bigfoot#46

I tried using positionContent: "true" as mentioned on http://bigfootjs.com but no success.

Hoping that you can catch something...

Explanation -

On your website (about page)- -
I slowly resized screen in chrome (desktop) to emulate the bug.

image

On my website -
this page - happens on mobile device only

screenshot_20181001-073003

Whitespace issue

There is some white space getting added somewhere between send square cash and send bitcoins buttons on the support page.

Fix code block styling in "Style Guide"

Spacing seems off. Possibly related to Jekyll 3 and switch to Rouge for syntax highlighting?

Jekyll 3 + Rouge

<div class="component__code">
  <figure class="highlight">
    <pre>
      <code class="language-html" data-lang="html"> 
         ...  

Jekyll 2.5 + Pygments

<div class="component__code"> 
  <div class="highlight">
    <pre>
      <code class="language-html" data-lang="html">
        ...

screen shot 2015-12-14 at 11 15 12 pm

Content cleanup

  • Find/replace all image paths used in YAML Front Matter and prepend with full path (eg. /assets/images/filename.jpg
  • Update style-guide
  • Add waypoint links (breadcrumbs lite) to FAQs and any other collection documents that function similar to the "yellow" underlined category page links
  • Update/add feature images were necessary

Why you are using wufoo.js?

Hi @mmistakes ,

Kindly help with a question related to your website

Just like your contact form , I have managed to make wufoo working, without using <script>{% include_cached wufoo.js %}</script>

Doubt 1 - I was wondering what is the use of including above script? Nowhere on the original site of wufoo they have mentioned about this JS code

Doubt 2 - Are you using hidden text box to prevent spambots from spamming the form?
i.e. this one - <textarea name="comment" id="comment" rows="1" cols="1"></textarea>

Build `figure` helper (or plugin)

Build a helper that leverages {% include %} variables to build <figure> elements containing images and a caption. This will help remove the need to write HTML in .md which is hard to maintain and "junks" up the readability of Markdown only content.

Jekyll 3 regeneration slowdown

Investigate increasing regeneration times with each successive change on Windows. Possible fix is to add gem wdm to Gemfile.

mixin not found

Hi,
I am not able to find this function breakpoint in any of the mixin file.
The jekyll is throwing error -
Undefined mixin 'breakpoint
Am I doing something wrong?

Some SVG icons cut off

Inline SVG icons (possible those who's canvas isn't perfectly square) cut off. Related to width: 1em and height: 1em?

image

Build `gallery` helper (or plugin)

Build a helper that leverages {% include %} variables to build a gallery container that pulls from image data from YAML Front Matter. This will help remove the need to write HTML in .md which is hard to maintain and "junks" up the readability of Markdown only content.

Something similar to the helper built for Minimal Mistakes:

{% include base_path %}

{% if include.id %}
  {% assign gallery = page.[include.id] %}
{% else %}
  {% assign gallery = page.gallery %}
{% endif %}

{% if gallery.size == 2 %}
  {% assign gallery_layout = 'half' %}
{% elsif gallery.size >= 3 %}
  {% assign gallery_layout = 'third' %}
{% else %}
  {% assign gallery_layout = '' %}
{% endif %}

<figure class="{{ gallery_layout }} {{ include.class }}">
  {% for img in gallery %}
    {% if img.url %}
      <a href=
        {% if img.url contains "://" %}
          "{{ img.url }}"
        {% else %}
          "{{ img.url | prepend: "/images/" | prepend: base_path }}"
        {% endif %}
        {% if img.title %}title="{{ img.title }}"{% endif %}
      >
        <img src=
          {% if img.image_path contains "://" %}
            "{{ img.image_path }}"
          {% else %}
            "{{ img.image_path | prepend: "/images/" | prepend: base_path }}"
          {% endif %}
          alt="{% if img.alt %}{{ img.alt }}{% endif %}">
      </a>
    {% else %}
      <img src=
        {% if img.image_path contains "://" %}
          "{{ img.image_path }}"
        {% else %}
          "{{ img.image_path | prepend: "/images/" | prepend: base_path }}"
        {% endif %}
        alt="{% if img.alt %}{{ img.alt }}{% endif %}">
    {% endif %}
  {% endfor %}
  {% if include.caption %}
    <figcaption>{{ include.caption | markdownify | remove: "<p>" | remove: "</p>" }}</figcaption>
  {% endif %}
</figure>

bundle install fail on Mac OSX El Capitan

Very beautiful jekyll-based blog, however, I have no luck to run it on my Mac.

When $ bundle install

pkg-config could not be used to find libiconv
Please install either pkg-config or the pkg-config gem per

gem install pkg-config -v "~> 1.1.7"

checking for iconv using pkg-config libiconv... no

libiconv is missing. Please locate mkmf.log to investigate how it is failing.

*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.

Improve Site build times with cached includes

👋 Michael

Did you know that you can cache rendered outputs from stateless includes and improve your build times with a plugin..?
The plugin is called jekyll-include-cache and is whitelisted for use at GHP
(just not bundled by default, since its dangerous for novices)

The plugin can be used to cache any "include" that does not change its output from page-to-page.
Such includes can simply be plain HTML without any Liquid or an include that only references the global constant {{ site }} e.g., src/_includes/footer.html

I did not submit a PR because I thought I'd gather your feedback first and allow you to implement it first-hand so that you know where it can be used and where it should not be used..

Results from --profile on my system show that you may be able to shave of ~15 seconds but I may be wrong..

Improve fullcss cookie

Current experience

  1. User visits the site for the first time. Inlined critical CSS is loaded, followed by an asyn request for the full stylesheet.
  2. fullcss cookie is set with a value of true.
  3. On repeat visits cached full stylesheet(s) are loaded. Inconsistencies appears if CSS has been altered.

Need a way to cache bust the cookie value. Perhaps leverage the values set in the asset manifest to evaluate against instead of true.

Improve print stylesheet

  • Remove masthead
  • Remove footer
  • Improve layout of gallery images so they don't stretch
  • Add QR code of current page URL to view on mobile devices

Optimize build process

TL/DR plan of attack: relegate Jekyll to Markdown parsing and building HTML and leave assets (CSS, JS, images, and fonts) to Gulp (or equivalent task runner).

  • Replace jekyll-picture-tag with Gulp task.
  • Replace jekyll-assets with Gulp tasks.
  • Automate critical path CSS generation.
  • Replace layout: compress with Gulp minify task.
  • Replace Rake deploy tasks with Gulp.

The time to jekyll build and deploy the site has gotten out of hand the last couple of years. Test disabling various build tasks and plugins to determine offenders and investigate removing the dependency or developing a lighter weight alternative.

Made Mistakes Jekyll stats as of 8/23/2016:

Windows Test System:

  • Lenovo ThinkStation E30
  • Processor 3.30 GHz Intel Xeon E31245
  • Memory 16 GB
  • Intel SSDSA2BW160G3L 137GB
  • Windows 7 Professional Service Pack 1
  • ruby 2.2.4p230 [x64-mingw32]

Mac Test System:

  • iMac 21.5-inch, Late 2013
  • Processor 2.7 GHz Intel Core i5
  • Memory 16 GB 1600 MHz DDR3
  • 1.12 TB Fusion Drive
  • OS X El Capitan 10.11.6
    -- ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]

Initial build: bundle exec jekyll clean. Verify _site, .asset-cache, and any other .tmp folders and files have been removed.

To test build tasks, disable or remove from source and compute average time of 3 builds using bundle exec jekyll --profile.

task task time (Windows) task time (Mac)
Generate responsively sized page.image.feature photos 1288.289s 1429.255s
Minify HTML with layout: compress 39.348s 11.18s
Read /images/ and copy to _site/ 32.385s 23.629s
Build tag pages with jekyll-archives 17.398s 9.994s
Build tag index page with sort_tag filter 2.62s 0.586s
List related posts with jekyll-tagging-related_posts, jekyll/tagging, and LSI: true 38.356s 17.867s
List related posts with vanilla related_posts 1.649s 4.899s
Preprocess, concatenate, minify, and cache bust SCSS and JS with jekyll-assets 78.751s 25.031s
Display masthead and overlay menu from _data 9.656s 7.815s
List post comments from _data 7.103s 2.216s
Display colophon from _data 0.2s 0.486s
List post taxonomy metadata 3.479s 1.182s
List post breadcrumb links 2.834s 1.029s
List featured posts 0.195s 0.439s
Build style guide collection 1.161s 0.314s
List post social sharing links 5.092s 0.973s

Worst case offenders appear to be resizing large amounts of images, copying images from source to destination, and building the site.

Decoupling asset generation tasks from main Jekyll build so they don't trigger a rebuild each time they are updated should help with development build times. Browsersync can also come to the rescue injecting updated CSS/JS to circumvent the entire Jekyll build process.

Jekyll build times comparison:

build type Jekyll + plugins Jekyll Gulpified
clean build (Mac OS) 26.01 min 14 min
clean build (Windows) 26.31 min 17 min
build with images already resized (Mac OS) 2.21 min 1.58 min
build with images already resized (Win) 5.23 min 4.17 min

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.