Giter Site home page Giter Site logo

ignition's Introduction

ignition

alt text

The Starter Theme that Could

Ignition is an amazing WordPress starter theme that aims to make your life easier and your development faster!

Note: The site below has a splash page that is a bit old and mentions one day incorporating Gutenberg... We are long past that! Luckily the documentation has been updated. Please stand by while we find time to update the splash page.

Ignition 4.0

Ignition 4.0 is out as of Jun 16, 2020

Features

Ignition has a lot of features while remaining lightweight and bare bones. It allows you to create your website without having to rebuild the most common things found in most projects. Here are just some of the features found in ignition.

  • NPM and Webpack ready so you can use the latest js, as well as sass, postcss, and more
  • We use dart sass for the latest sass including @use and @forward
  • Quick theme configuration via theme.config.json for settings you don't want clients touching
  • A powerful CSS grid system that falls back on flexbox for older browsers.
  • Upload svg logos in the customizer, and they will output as inline logos for easy css styling. Logo will also appear on login page
  • A beautiful menu that works with submenus, dropdowns, and menu placement via the theme config.
  • All your JS scripts will be minified and concatenated and set for output, so you wont need to enqueue any front end JS files. They automatically are included.
  • Google Fonts at the ready. Easily changeable in the theme config file.
  • ACF Blocks Included. Easily use and add your own in the blocks folder.
  • Javascript events for scroll animations and click events and even moving items from around the page with simple data attributes.
  • svg icons support with iconify.design
  • An automatic header block that can be added when a new post is made automatically using the theme config file
  • Drag and drop folders of js, css, and even php for plug and play. Any underscored files will be auto included in the build. Even underscored php files.

Quick Install

First things first!
Download the theme into your WordPress theme directory.

npx create-ignition-theme theme-directory-name --setup

This will ask you for the new name of your theme. You must also give a slug which will be used as your text domain and in some functions. Example: Theme Name: My Amazing Theme, Slug: amazing-theme If you are using a local environment with something like flywheel, make sure to enter the local url. The default is ignition.local

Answer all the questions and your theme will be all set up and ready to use!

You should also install Advanced Custom Fields Pro as Ignition works best with it.

Theme Config

There is now a theme config file. It has some nifty quick settings for you without letting the client mess around. Some of these settings use to be in the WP customizer. We have moved them here. Note the name and slug here were created by running the setup. If you run the setup again, it will do a replacement based on whats here. So to change the theme name again, run the setup, don't just change those here!

{
 "name": "Ignition", //Theme name. Created by the setup we ran before. No touchy!
 "slug": "ignition", //Theme slug. No touchy! If you want to change the theme name, run setup again
 "local": "ignition.local", //browsersync url proxy
 "google_fonts": [
   "Roboto:400,400i,700,700i", //change me to your liking!
   "Roboto Slab:400,700"
 ],
  "menu_icon": "", //svg icons can be added here and in the icon settings below
   "sidebar_icon": "",
   "submenu_arrow_icon": "",
   "comment_icon": "",
   "search_menu_item": false, //adds a search item to top menu
   "dev_admin_bar_color": "#156288", //color of local admin bar
   "admin_access_capability": "manage_options", //capability of who can access back end
   "load_custom_icons": false, //now that we use iconify.design you might not need to load any custom icons, although you can still add them
   "mobile_menu_type": "app-menu", //fancy mobile menu, leave blank for regular
   "logo_position": "logo-left", //logo position with menu
   "site_top_container": "container", //contain the menu and logo takes container, container-fluid or nothing
   "default_acf_header_block" : ["post", "page"] //create default header block for these post types (assumes they use Gutenberg)
}

By setting these up here you wont have to delve into files or through setting pages. It's fast and easy!

Variables.scss

This file resides in "src/sass". Here you can edit your CSS variables and colors and fonts. Add the google fonts you created in the theme config here so they are applied to the entire site. For adding or changing SASS variables, please use the resources.scss file. SASS variables are still being used for media queries and the like. Otherwise try and use CSS variables.

Functions File

If you have made a theme before, you know this one. Here you can set up your theme. However, the theme config has basically taken care of almost everything for you! The only thing you may find you need to do here is add image-sizes based on the site you are making. Remember, the web is responsive and pixel size matters less than ratio size. If the client has two image sizes of 500x200 and 1000x400, only make the bigger one. Users should upload images twice the size of the image-size so they look good on retina. I also recommend going to the back end of the site and setting the media sizes of medium and large to 0. This way disk space is saved and images uploaded don't create a plethora of image sizes. Lastly, all main styles and scripts have been enqueued for you.

Adding to functions

When adding your own filters and actions you can stick them in functions.php OR keep it clean and make a new file, probably in the inc folder. This file can be added to function.php with an include or require... but you don't even need to do that!
You can add php files to functions.php by simply giving the file a name that starts with an underscore.

Any php file that starts with an underscore inside the "inc", "blocks", and "parts" folders will automatically be included to functions.php A similar ability exists with js files and scss files that start with an underscore and are found in one of those folders. This allows you to bundle your php, scss, and js files together without explicitly importing or enqueuing them. See the blocks example below.

With all these files setup your ready to start making a theme!!

Developing

To get development rolling, open the terminal and run

npm run start

This will watch your files and reload the browser using browsersync.

Creating Template files and Folders

Most of your development will take place in the src folder. This is where everything you make will go. From template files, to js files to scss. What's really cool is you can group your sass, js, and php files together! They don't have to be separated into separate folders. Not only that but underscored files are automatically imported. No need to enqueue those files!

This is because of special functionality ignition has. Let's look at the blocks folder for a good example:

 - blocks/
 -- section-menu/
 ---- _section-menu.scss
 ---- _section-menu-block.php
 ---- section-menu-block.php

This is a block that spits out a custom menu section. Here, we can see there is an underscore php file _section-menu-block.php. This means it will automatically be included in the functions.php file. This file is responsible for setting up and registering the block. The scss file is also underscored so it will automatically be added to both the front and back end bundle css files. The last file there is a php file which is the actual template file for showing the block and wont be imported anywhere. The ability to add underscore files into the system means you can drag and drop folders with functionality straight into your theme. Drag a block you made in another project right in and its ready to use. (The only piece you might need to put elsewhere is the acf-json file if your block is using that,=. that must go in the acf-json folder)

This will greatly organize your files so you can work in one folder without having to fly around folders.

Non-underscored files need to be imported manually

If your js or scss file is not underscored it will not be imported. You will have to add it yourself, if you choose to. This allows you to choose if it should be enqueued or put somewhere specific etc... js files can be imported into the index.js or admin-index.js files in the src folder. Admin-index is for the back end.
SASS files can be imported via @use or @forward within the SASS folder in one of the files there. If the file requires sass variables or mixins, make sure to use @use "resources" as *; at the top of the file.

Routing and Template Parts

When a single post is shown it uses the single.php file in the root. This is standard WordPress templating.
This file in turn will check which current post type is being shown and find the appropriate content file. This is ignition templating.
By default it will go to src/parts/post-type/ folder and get a file there. This is all done using a special template function Ignition comes with. It's similar to say, get_template_part() and actually uses locate_template() under the hood, except it's faster and you can pass variables to it.

ign_template('somePrefix'); //gets somePrefix-{post-type}.php

See the difference below:

 //Assumes your in a loop

//The following is the non ignition way to get a template part based on dynamic post type
locate_template( 'src/parts/' . get_post_type() . '/content-'  . get_post_type() . '.php');

//The following is the ignition way. It also has fallbacks that eventually go to the post folder
ign_template('content');
//This little line will search for a file in this order, stops after it finds one:
//looks for src/parts/{post-type}/content-{post-type}.php
//looks for src/parts/{post-type}/content.php
//looks for src/parts/post/content-{post-type}.php
//looks for src/parts/post/content.php

Therefore it's best to work and divide your content into post type folders and give your files name-{post-type}.php

Furthermore you can pass a second parameter of variables like so:

$var = 'hello'; //will not be available inside the file below using WP function locate_template()
locate_template( 'src/parts/' . get_post_type() . '/content-'  . get_post_type() . '.php');

$var = 'hello'; //WILL be available using Ignition function ign_template()
ign_template('content', array('var'=> $var)); //pass an array of variables $var will now work

You can also use ign_template outside the loop by giving it a full path from the root of the theme

ign_template('src/some-folder/some-file.php'); //you can also pass variables if wanted here too

With ign_template(), you don't need to make a single-portfolio.php for a portfolio post-type. You just make a new post-type folder with all the different views and template files that exist for that post type. Your post type folders should have a content-{post-type}.php and a card-{post-type}.php file to begin with. If the header is to look different, it should also have a header-{post-type}.php file.
A good place to start is to duplicate and rename the post folder. Rename the files inside too. The content one is for full view and the card one is usually for archive listings. The card view is used by default in index.php

Remember you can and should also add scss files as well as js files into your post-type folders. This keeps your post types and everything they need together.

Header Block/Template

Every post and page has a header. Sometimes you need the same header. Sometimes you want a different one per post type. Sometimes you want three for one post type and one for another. It can get confusing, but Ignition has finally made this part somewhat easier! Using the function above, a header template can be shown easily with:

ign_template('header'); //outputs header-{post-type}.php
//if your post type does not have this file it will try and load header-post.php as default

But what if you create a header block for say a carousel? And you would like to use that block instead? Ignition comes with another function that will check for a header block and if it exists, it will not output the header template. This function is used as follows and can be seen in content-post.php

//checks if there is a header block and if not outputs a header-{post-type}.php
ign_header_block();

//usually this comes next.
the_content();

The ign_header_block(); will check for a header block that has a name starting with header-. If you create a block with a name like header-carousel, it will be considered a header and if it's used, the header template file will not be shown. If it does not find a header block on the current post, it will use ign_template() to load a file. By default it loads header-{post-type}.php You can change this by adding a string inside so a different file is loaded.

Default Header Templates

Default headers per post type are great, but they are not blocks... They wont show up on the back end when your client is creating posts and pages with Gutenberg. This does not result in a smooth experience! While the template part would load on the front end it will not show up on the back. However, wouldn't it be nice if this file can be seen in the back end as well and act like a Gutenberg block so the client gets a smooth experience when using the default header?

Ignition to the rescue! In the themes.config file there is a setting for default_acf_header_block. Add your post type here and automatically your header-{post-type}.php template file will be added as a choosable block for that post type. Whats more it will be automatically loaded when the client goes to make a new post!
This gives the client a smooth experience when creating a page. It even updates when the client changes the title! The header template file can continue being used as a template file and works the same. You can use the_title() or any in-the-loop template tags, that you normally might not have access to in a block. It's magic.

You can add an ACF group and connect it to your default header block...er... template hybrid. Just make sure you understand that when the default header-{post-type}.php file is used as a block, get_field() will get fields from the block unless you specify the second parameter.

//inside some portfolio/header-portfolio.php

the_title(); //works even when used as a block!

//if you want a custom field from the post
get_field('some_post_meta', get_the_ID()); //make sure to get the meta from the post NOT the block

//if you want a custom field from the block
get_field('some_post_meta'); //note: if this header is loaded as a template this might yield nothing.

So now your header template file is showing up in Gutenberg and 'pretending' to be a block! This feature is enabled by default for posts and pages. go try and make a post and see the header template file show up.


This documentation is not complete! It will be finished soon!

Learn More

Visit the documentation to learn how to use the starter theme. It's quite simple and reading the documentation should take less than 25 minutes. So download ignition and give it a try!

View ChangeLog

View the changelog For helpful info.

Is it Ignition or ignition without a capital?

I dunno. Who cares!? Why do people ask these questions!? Just download it and see how easy your theming will become!!

ignition's People

Contributors

jp-albrecht avatar saltnpixels 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ignition's Issues

Source map not being output correctly

CSS sourcemaps aren't being output correctly. Chrome only reports main.css from the css sourcemap (ommiting all the .scss files) and no JS sourcemap. I'm not sure if this is a Ignition-specific issue or something to do with WP-Gulp.

Possible CSS incompatibility with WP5.4 post admin area

After upgrading on a fresh install of ignition i've noticed strange resizing issues with the sidebar in the page/post editor - where the sidebar when visible, causes the editor area to reduce in size by half and only occupy half of the visible screen.

Digging into the CSS i saw this bit of CSS in the Gutenberg SASS

@media (min-width: 768px) #wpwrap .edit-post-layout.is-sidebar-opened .edit-post-sidebar { width: 30%; }

disabling that bit of CSS in the gutenberg-editor-styles.scss seems to fix the issue.

Logo not centered in logo-in-middle position/display bug

When selecting logo-in-middle option the logo is not centered on the page. I had 3 top level menu items, which means the extra item to the left pushes the logo off center. When I add another top level menu item, the logo no longer displays until removing the new item and selecting another logo position.

'Set Value as Class' not in consistent position

Hello,

I noticed the 'Set Value as Class' field has a different position when editing a Text Field and a Email Field. For the Text Field it's after the Character Limit before the Conditional Logic. On the Email Field it's right after the Admin Only? field before the Default Value.

Text Field;
Screen Shot 2019-07-23 at 1 36 27 PM

Email Field;
Screen Shot 2019-07-23 at 1 36 34 PM

Would be nice to have this consistent across fields.

Thanks

4.0 source mapping?

Notice that when inspecting styles i'm not seeing any source mapping - is there a way to enable sourcemap output by default?

WP-SCSS compatibility with 4.0

I'm about to start my first build using Ignition after abandoning my own bones / flexbox based starter and while i know the previous version of ignition worked with wp-scss (useful for compiling changes after launch say.) i'm curious if v4 continues that compatibility and if so - what output settings show be used?

Thanks and much appreciate the work you've done here - i've been scouring the web for a starter theme with the right combination of technology / workflow / and approachability. So many are great but over engineered to the point of not really being "WordPress" anymore, yours feels WordPressy while making a number of workflow improvements. Kudos!

best way to have an ignition version of front-page.php?

One thing that isn't immediately clear to me from the docs is how to achieve a completely different home page where a page is specified as a static home page.

Usually, I'd have a front-page.php template. But that doesn't seem like it is the Ignition way of doing things? I'd guessed at using the parts approach but that seems to work only with post types?

Is there an easy way of doing this or do I just use a front-page.php file, like I normally would and create that from a copy of page.php?

Gutenberg insert image "full width" not 100% width

I've noticed that when inserting an image via Gutenberg and then selecting its alignment as "full width" the image doesn't stretch all the way across the page:

new site just another wordpress site 2019-01-04 18-14-38

I've been trying to work out why, seems to be something to do with max-width of the wp-block-image

.wp-block-image { max-width: 100%; }

Issues creating a new page template

Hi!
I started working with your theme a few days ago. I read the documentation, but it seems I can't make WP recognize my homepage template.
I created _homepage.php into the parts folder, but Ignition doesn't seem to notice it. When I go into the new page's backend and try to select my template in the "page attributes" section, I don't find it there. All I can see is Default, Sidebar Left and Sidebar Right.
Same thing happens for mi sccs file which I named _homepage.scss (in parts folder). It's like Ignition doesn't see it.

I really appreciate your help in solving this issue, I'm sure there must be something stupid I'm missing!

Many thanks,

Eleonora

Right sidebar for mobile

Hi!

First of all, thanks for the development of this theme. It really is a powerful tool when a blank template is needed.

But I found myself quite lost when I "just" needed to have my mobile hamburger menu moved to the right. That's because of the whole sidebar left / right behavior. I guess the theme wasn't intended to have the mobile menu in the right sidebar.

Would it be something worth adding to the theme ? Maybe in the theme config file ? Or just to simplify the sidebar left / right handling so that it is easier to move content between one and the other.

Regards,

Error in Mixin

When Compiling sass It throws error here
Running "sass:dist" (sass) task Error: Invalid CSS after " @if($sizeValue ": expected ")", was "= 16){" on line 6 of assets/sass/site/_mixin.scss
Changing to @if($sizeValue : 16) fixes it

I am using grunt btw if that makes a difference

Issue with Webpack and Docker

Hi!
I've installed Ignition theme a couple of times.
Everything seems to be ok, but when I run Webpack my browser opens a new tab (localhost:3001) which keeps on loading forever.
I'm starting to think the problem is with Docker and Webpack.

Here's my docker-compose.yml file:

version: '3'

services:
  # Database
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: ellietest
      MYSQL_USER: root
      MYSQL_PASSWORD: root
    networks:
      - wpsite
  # phpmyadmin
  phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - '8080:80'
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: root 
    networks:
      - wpsite
  # Wordpress
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - '3000:80'
    restart: always
    volumes: ['./wp-content:/var/www/html/wp-content']
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: ellietest
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: root
    networks:
      - wpsite
networks:
  wpsite:
volumes:
  db_data:


...and my theme.config.json:

{
  "name": "Ellie",
  "slug": "ellie",
  "server": "localhost:3000",
  "google_fonts": [
    "Roboto:400,400i,700,700i",
    "Roboto Slab:400,700"
  ],
  "menu_icon": "",
  "sidebar_icon": "",
  "submenu_arrow_icon": "",
  "comment_icon": "",
  "search_menu_item": false,
  "dev_admin_bar_color": "#156288",
  "admin_access_capability": "manage_options",
  "load_custom_icons": false,
  "mobile_menu_type": "app-menu",
  "logo_position": "logo-left",
  "site_top_container": "container",
  "default_acf_header_block" : ["post", "page"]
}

If I go to localhost:3000 I'm able to see new templates and html additions, but none of the css I add.
is there something I'm missing?
Sorry, I'm new to Webpack and I don't know how to configure it in order to make it work.

I really like your theme and I'm looking forward to starting develop with it!

Thanks for your help!

Eleonora

localhost times out

Hello! Sorry for the frank title of this issue. ๐Ÿ˜ I've just started to try out Ignition, but when running npm start a https://localhost:3000 window opens up and then stalls out with the message "localhost didnโ€™t send any data.
ERR_EMPTY_RESPONSE."

I see that Browsersync is running as expected on port : 3001, so I'm not sure where the issue lies:

[Browsersync] Proxying: http://flps.local
[Browsersync] Access URLs:
 ------------------------------------
       Local: https://localhost:3000
    External: https://flps.local:3000
 ------------------------------------
          UI: http://localhost:3001
 UI External: http://localhost:3001
 ------------------------------------
[Browsersync] Watching files...

Let me know what information I should provide and I'll post it.

Thank you~~

Questions || Ignition deployment

As I don't find a contact or question of FAQ on the website. I'm going to ask my questions here.

I find the gap in knowing basic coding for web and the jump it makes to deploying or managing WordPress based systems is a big jump.

Is it possible to host ignition on a shared hosting where there is no possibility to enter a command line or install node.js.

What kind of hosting should I have when I'm unable to do the former.

And is this platform thus made for making websites for simple portfolio's.

To you, they must look like obvious simple questions. But to me they would be a great help in finding the correct tool and or host in the maze of a zillion possibilities.

Catalina, node-gyp error, can't run create-ignition-theme

Hello,

I'm trying to try ignition, but I can't get it up and running. I've been trying to run create-ignition-theme via npx for a couple days. I keep running into an error that seems to be related to fsevents package being out of date, and not compatible with node-gyp.

I've gone down a rabbit hole of re-installing xcode and xcode command tools several times (which as you probably know is pretty time consuming). I've tried other solutions found in about 12 different Stackoverflow discussions. I keep running into the same exact issue. If there's a workaround for this, I'll keep trying but otherwise I'm throwing in the proverbial towel... This is what happens when I try to run npx create-ignition-theme, which I have to cancel out of because it just keeps looping. any help would be greatly appreciated:

npx: installed 10 in 2.725s
Downloading Ignition Starter Theme into theme-name
Ignition Theme Downloaded from git.
Running npm install...
npm WARN package.json [email protected] No repository field.
npm WARN peerDependencies The peer dependency node-sass@^4.0.0 included from sass-loader will no
npm WARN peerDependencies longer be automatically installed to fulfill the peerDependency
npm WARN peerDependencies in npm 3+. Your application will need to depend on it explicitly.
npm WARN peerDependencies The peer dependency fibers@>= 3.1.0 included from sass-loader will no
npm WARN peerDependencies longer be automatically installed to fulfill the peerDependency
npm WARN peerDependencies in npm 3+. Your application will need to depend on it explicitly.
npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated [email protected]: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.

[email protected] install /Users/pete/WebServer/leafnation-litespeed/sites/leafnation.com/html/front-end/themes/theme-name/node_modules/sass/node_modules/chokidar/node_modules/fsevents
node-gyp rebuild

gyp: binding.gyp not found (cwd: /Users/pete/WebServer/leafnation-litespeed/sites/leafnation.com/html/front-end/themes/theme-name/node_modules/sass/node_modules/chokidar/node_modules/fsevents) while trying to load binding.gyp
gyp ERR! configure error
gyp ERR! stack Error: gyp failed with exit code: 1
gyp ERR! stack at ChildProcess.onCpExit (/usr/local/lib/node_modules/node-gyp/lib/configure.js:351:16)
gyp ERR! stack at ChildProcess.emit (events.js:311:20)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)
gyp ERR! System Darwin 19.6.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/pete/WebServer/leafnation-litespeed/sites/leafnation.com/html/front-end/themes/theme-name/node_modules/sass/node_modules/chokidar/node_modules/fsevents
gyp ERR! node -v v12.16.1
gyp ERR! node-gyp -v v7.1.2
gyp ERR! not ok`

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.