• This repository has been archived on 30/Aug/2022
  • Stars
    star
    3,304
  • Rank 13,575 (Top 0.3 %)
  • Language
    HTML
  • License
    MIT License
  • Created about 12 years ago
  • Updated about 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A mystical CSS icon solution.

⚠️ This project is archived and the repository is no longer maintained.

Grunticon Build Status

         /'
        //
    .  //
    |\//7
   /' " \
  .   . .
  | (    \
  |  '._  '
  /    \'-'

Filament Group

A mystical CSS icon solution

grunticon is a Grunt.js task that makes it easy to manage icons and background images for all devices, preferring HD (retina) SVG icons but also provides fallback support for standard definition browsers, and old browsers alike. From a CSS perspective, it's easy to use, as it generates a class referencing each icon, and doesn't use CSS sprites.

grunticon takes a folder of SVG/PNG files (typically, icons that you've drawn in an application like Adobe Illustrator), and outputs them to CSS in 3 formats: svg data urls, png data urls, and a third fallback CSS file with references to regular png images, which are also automatically generated and placed in a folder.

grunticon also generates a small bit of JavaScript to drop into your site, which asynchronously loads the appropriate icon CSS depending on a browser's capabilities, and a preview HTML file with that loader script in place.

You can see a demonstration of the output here.

Version 2.0 updates

With Grunticon version 2.0, we've added the enhanceSVG option which allows you to easily style and animate your SVGs with CSS or add interactivity with JavaScript. Standard Grunticons are static background images that can't be styled or scripted because SVG only supports this ability if the SVG data is in the HTML document. In 2.0, you can now choose which icons you want to "enhance" and the new loader script will copy the icon SVG paths from the cached Grunticon stylesheet and inject them as an embedded SVG element for you to script and style as needed. This allows us to offer the best of both worlds: the full power of embedded SVGs but with none the wasted bandwidth of including SVGs in your page markup.

Remember that only browsers that support SVGs will see these effects so use them only for "enhancements" that don't break the experience when not present. Embedding icons also has some degree of execution overhead so we recommend using this feature sparingly: only embed an icon if you need to apply style or scripting, otherwise use the classic background-image icon.

To start - in your Gruntfile.js, set the value for enhanceSVG to true so the loader will parse the markup for icons that should be embedded at runtime:

grunticon: {
  foo: {
    files: {
      // Handle files here
    },
    options: {
      // Handle your options as you normally would here
      enhanceSVG: true
    }
  }
}

Then, make sure you get the new loader that's produced for you when you run grunt (it should be in the same place as before) and inline that script in the <head>.

Just after the loader, you'll need to call grunticon and pass your 3 CSS file paths to it as usual. Additionally though, you'll want to add a fourth argument to kick off the SVG embedding, which we've pre-defined for you as grunticon.svgLoadedCallback. In all, your call to grunticon will now look something like this:

grunticon(["icons.data.svg.css", "icons.data.png.css", "icons.fallback.css"], grunticon.svgLoadedCallback );

After you've done this, you can have any icon embedded in the page and ready for styling just by adding a data-grunticon-embed attribute.

<div class="icon-burger alt" data-grunticon-embed></div>

Once the loader runs, the SVG will be embedded:

<div style="background-image: none;" class="icon-burger alt">
  <svg class="svg-source" xmlns="http://www.w3.org/2000/svg" width="32" height="30" viewBox="170.6 12.6 32 30" enable-background="new 170.6 12.6 32 30">
    <g class="hamburger">
      <path class="buns" fill="#DDAF6D" d="M188.6 12.6h-4c-5.5 0-13 4.5-13 10v1c0 .6.4 1 1 1h28c.6 0 1-.4 1-1v-1c0-5.5-7.5-10-13-10zm-17 28c0 1.1.9 2 2 2h26c1.1 0 2-.9 2-2v-2h-30v2z">
      </path>
      <path class="burger" fill="#BB6F39" d="M172.6 34.6h28c1.1 0 2 .9 2 2s-.9 2-2 2h-28c-1.1 0-2-.9-2-2s.9-2 2-2z">
      </path>
      <path class="cheese" fill="#EFC75E" d="M172.6 30.6h28v4h-2l-3 3-3-3h-20v-4z">
      </path>
      <path class="lettuce" fill="#3DB39E" d="M200.6 27.6l-28-.1v.1c-1.1.2-2 1.2-2 2.4 0 1.4 1.1 2.5 2.5 2.5 1.2 0 2.2-.9 2.4-2h4.1c0 1.1 1.1 2 2.5 2s2.5-.9 2.5-2h4c0 1.1 1.1 2 2.5 2s2.5-.9 2.5-2h4.1c.2 1.1 1.2 2 2.4 2 1.4 0 2.5-1.1 2.5-2.5 0-1.1-.9-2.1-2-2.4z">
      </path>
      <path class="tomato" fill="#BF392C" d="M172.6 24.6h28v3h-28v-3z"></path>
      <path class="shadows" fill="#C69D63" d="M172.6 24.6h2c-.6 0-1-.4-1-1v-1c0-5.5 7.5-10 13-10h-2c-5.5 0-13 4.5-13 10v1c0 .5.4 1 1 1zm1 16v-2h-2v2c0 1.1.9 2 2 2h2c-1.1 0-2-.9-2-2z">
      </path>
      <path class="burger-shadow" fill="#A86433" d="M172.6 36.6c0-1.1.9-2 2-2h-2c-1.1 0-2 .9-2 2s.9 2 2 2h2c-1.1 0-2-.9-2-2z">
      </path>
      <path fill="#37A18E" d="M172.6 30.1c0-1.2.9-2.2 2-2.4v-.1h-2v.1c-1.1.2-2 1.2-2 2.4 0 1.4 1.1 2.5 2.5 2.5.4 0 .7-.1 1-.2-.9-.4-1.5-1.3-1.5-2.3zm9 .5h-2c0 1.1 1.1 2 2.5 2 .4 0 .7-.1 1-.2-.9-.3-1.5-1-1.5-1.8zm9 0h-2c0 1.1 1.1 2 2.5 2 .4 0 .7-.1 1-.2-.9-.3-1.5-1-1.5-1.8zm9 0h-2c.2 1.1 1.2 2 2.4 2 .4 0 .7-.1 1-.2-.7-.4-1.2-1-1.4-1.8z" class="lettuce-shadow">
      </path>
    </g>
  </svg>
</div>

Now, style appropriately:

  .icon-burger {
    width: 32px;
    height: 30px;
    display: inline-block;
  }
  .icon-burger.alt .cheese {
    fill: red;
  }
  .icon-burger.alt .buns {
    fill: orange;
  }
  .icon-burger.alt .burger {
    fill: yellow;
  }
  .icon-burger.alt .lettuce {
    fill: green;
  }

And voila! Styled SVG icons!

Check out our example at http://filamentgroup.github.io/grunticon/example/output/preview.html

Also: How to use SVG Embedding across domains

If you're hosting your grunticon CSS on a different domain than your HTML, you will need to do a little extra configuration to use SVG Embedding.

  1. Set the corsEmbed option to true in your gruntfile. This adds a little extra scripting to the grunticon loader so that it can make a cross-domain request.
  2. Once that's in, change the callback at the end of your grunticon call to reference svgLoadedCORSCallback instead of the one listed above.
  3. That might be enough, but if not, you'll need to enable cross-domain requests on the server where the CSS is hosted. Here's how that looks in Apache .htaccess for example:
<IfModule mod_headers.c>
    Header add Access-Control-Allow-Origin "*"
</IfModule>

(That "*" can be a particular domain if you want)

Getting Started

This plugin requires Grunt ~0.4.2

If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins. You might also check out Chris Coyier’s great article, Grunt for People Who Think Things Like Grunt are Weird and Hard.

Once you're familiar with that process, you may install this plugin with this command:

npm install grunt-grunticon --save-dev

Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:

grunt.loadNpmTasks('grunt-grunticon');

The "grunticon" task

For a brief overview of the Grunticon workflow, particularly from a designer's perspective, you might check out Todd Parker's article, A Designer’s Guide to Grumpicon, which covers basic SVG workflow tips for both Grunticon and Grumpicon.

Required configuration properties

grunticon has a files object that needs to be filled in order to run, this files object currently requires that a cwd, and a dest dir are placed, and therefore will blow up without it. This will be fixed to better fit the pattern set by Grunt for this.

These can be set in your Gruntfile.js config file. Grunticon is a multitask, making it easy to create as many export batches as you'd like. Just create one or more custom named objects within the grunticon object, and configure Grunticon options within it, like so:

grunticon: {
	myIcons: {
		files: [{
			expand: true,
			cwd: 'example/source',
			src: ['*.svg', '*.png'],
			dest: "example/output"
		}],
		options: {
		}
	}
}

IMPORTANT NOTE: grunticon will overwrite any files in the dest directory if they are of the same name as a file that grunticon needs to create. For easiest results, you can set dest to a folder that does not yet exist in your directory and grunticon will create that folder, or set it to an existing folder and be sure to configure grunticon to create file names that do not already exist in that folder.

With these configuration properties set, you can add grunticon to your default tasks list. That'll look something like this:

grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify', 'grunticon:myIcons']);

grunticon will now batch your icons whenever you run grunt.

Options

options.datasvgcss

Type: String Default value: "icons.data.svg.css"

The name of the generated CSS file containing SVG data uris.

options.datapngcss

Type: String Default value: "icons.data.png.css"

The name of the generated CSS file containing PNG data uris

options.urlpngcss

Type: String Default value: "icons.fallback.css"

The name of the generated CSS file containing external png url references.

options.previewhtml

Type: String Default value: "preview.html"

The name of the generated HTML file containing PNG data uris.

options.loadersnippet

Type: String Default value: "grunticon.loader.js"

The name of the generated text file containing the grunticon loading snippet.

options.enhanceSVG

Type: Boolean Default value: False

Include additional methods in the loader script to offer SVG embedding

options.corsEmbed

Type: Boolean Default value: False

Include additional methods in the loader script to offer cross-domain SVG embedding. options.enhanceSVG must be true for this option to be respected.

options.pngfolder

Type: String Default value: "png/"

The name of the generated folder containing the generated PNG images.

options.pngpath

Type: String Default value: value of options.pngfolder

Allows you to specify a custom URL to serve fallback PNGs at.

Example:

{
    pngpath: "/assets/icons/png"
}

Will generate PNG fallbacks like:

.icon-bar {
	background-image: url('/assets/icons/png/bar.png');
	background-repeat: no-repeat;
}

options.cssprefix

Type: String Default value: ".icon-"

a string to prefix all icon selectors with (currently only classes or ids are guaranteed to work with the preview)

options.customselectors

Type: Object

Allows you to specify custom selectors for individual files. This is in addition to the selectors generated using cssprefix + filename - extension.

Example:

{
	"foo": [".icon-bar", ".baz"]
}

will produce:

.icon-bar,
.baz,
.icon-foo {
	//css
}

You can also use an asterisk in your custom selector. The filename can be referenced with $1.

Examples:

...
customselectors: {
  "*": [".icon-$1:before", ".icon-$1-what", ".hey-$1"]
},
cssprefix: ".icon-"
...

Should give the file bear.svg the css

.icon-bear:before,
.icon-bear-what,
.hey-bear,
.icon-bear {
 // CSS THINGS
}

And if there are files bear.svg and cat.svg, the css should be like:

.icon-bear:before,
.icon-bear-what,
.hey-bear,
.icon-bear {
 // CSS THINGS
}

.icon-cat:before,
.icon-cat-what,
.hey-cat,
.icon-cat {
 // CSS THINGS
}

This should give you more flexibility with your selectors.

options.defaultWidth

Type: String Default value: "400px"

a string that MUST be defined in px that will be the size of the PNG if there is no width given in the SVG element.

options.defaultHeight

Type: String Default value: "300px"

similar to defaultWidth, but for height

options.previewTemplate

Type: String Default value: Goes to the example/preview.hbs file

Takes a path to the template that will be used for the preview.html. Example of .hbs file contents:

<!doctype HTML>
<html>
  <head>
    <title>Icons Preview!</title>
    <style>
      body {
        background-image: linear-gradient(#eee 25%, transparent 25%, transparent), linear-gradient(#eee 25%, transparent 25%, transparent), linear-gradient(transparent 75%, #eee 75%), linear-gradient(transparent 75%, #eee 75%);
        width: 100%;
        background-size: 10px 10px;
      }
    </style>
    <script>
      {{{loaderText}}}
      grunticon(["icons.data.svg.css", "icons.data.png.css", "icons.fallback.css"]);
    </script>
  <noscript><link href="icons.fallback.css" rel="stylesheet"></noscript>
  </head>
  <body>
    {{#each icons}}
      {{#with this}}
      <pre><code>{{prefix}}{{name}}:</code></pre><div class="{{prefixClass}}{{name}}" style="width: {{width}}px; height: {{height}}px;" ></div><hr/>
      {{/with}}
    {{/each}}
</body>
</html>

options.tmpPath

Type: String Default value: os.tmpDir()

Let's you specify an absolute tmp-path (options.tmpDir will still be appended).

options.tmpDir

Type: String Default value: "grunticon-tmp"

Let's you specify a tmp-folder. Useful when having multiple grunticon tasks and using grunt-concurrent.

options.template

Type: String Default value: ""

Location of a handlebars template that will allow you to structure your CSS file the way that you choose. As more data becomes available via directory-encoder, more options will be available for you to tap into during templating.

Example of .hbs file contents:

{{#each customselectors}}{{this}},{{/each}}
{{prefix}}{{name}} {
	background-image: url('{{datauri}}');
	background-repeat: no-repeat;
}

options.compressPNG

Type: Boolean Default value: false

Will compress the converted png files using optipng

options.optimizationLevel

Type: Integer Default value: 3

If compress is set to true, this will set the optimationLevel for optipng

Automating color variations

Grunticon allows you to output any icon in different colors simply by changing its filename to the following syntax: myfilename.colors-red-aa0000-gray.svg. In this example, any color names or hexidecimal values that follow colors- and are separated by a dash will be used to generate additional icons of that color. By default, each icon will be assigned a numbered class name for CSS use. You can improve the class naming conventions by defining color variables in your Gruntfile's colors option shown below. When defined, you can reference a color variable in place of a color in your file names, and the generated classes will use that variable name as well. See the Gruntfile.js's colors and dynamicColorOnly options for an example of how color automation.

A note on filesize impact: Adding color variations of an icon involves creating duplicates of that icon's SVG source in the CSS, so unfortunately, each color variation will cause an increase in filesize. However, transferring CSS with gzip compression can negate much of this filesize increase, and we highly recommend always transferring with gzip. In testing, we found that creating a color variation of every icon in our example set increased overall size by 25%, rather than 100% as a raw text duplicate would increase. That said, size increases for non-SVG-supporting browsers will be more dramatic, as the fallback PNGs will not have the heavy transfer compression as SVG enjoys. We advise using this feature on a case-by-case basis to ensure overhead is kept to a minimum.

options.colors

Allows you to predefine colors as variables that can be used in filename color configuration.

options: {
	colors: {
		myAwesomeRed: "#fc3d39",
		coolBlue: "#6950ff"
	}

options.dynamicColorOnly

Type: Boolean Default value: false

Allows you to tell directory-colorfy to ignore the original file when using colors.

For example, if given a file named like so:

bear.colors-white.svg

And dynamicColorOnly is set to true:

{
	dynamicColorOnly: true
}

Then only a single file: bear-white.svg, will be generated, rather than two: bear.svg with the original colors and bear-white.svg with white colors.

Grunticon Loader Methods

With enhanceSVG turned on, the Grunticon loader has a few exposed methods and attributes on the grunticon object that you can use:

href

Type: String

The url that is being loaded by Grunticon.

method

Type: String

Is "svg" if the page loaded the SVG-based css. Is "datapng" if the page loaded the png with datauri-based css. Is "png" if the page loaded the plain link to png-based css.

loadCSS

See: https://github.com/filamentgroup/loadcss

getCSS

Arguments: String Returns: Object

Fetch a stylesheet link by its href.

getIcons

Arguments: String Returns: Object

Takes a stylesheet node (link or style) and returns all of the icon selectors and the svgs contained within it in an object formatted in this way:

{
  grunticon:selector: "SVG Content in String"
}

embedIcons

Arguments: Object Returns: NodeList

Takes icons in the object format outputted by getIcons and then queries the page for all icons with the data-grunticon-embed attribute. For each of these that it finds, it places the SVG contents associated with the relevant selector in the icons. It then returns the NodeList of all of the elements that had SVGs embedded in them.

ready

Arguments: Function Returns: None

An alternative to listening for the DOMContentLoaded event. Takes a function as a callback and calls the function when the DOM is ready.

svgLoadedCallback

Arguments: Function Returns: None

Uses the above methods to call:

var svgLoadedCallback = function( embedComplete ){
  ready(function(){
    embedIcons(getIcons(grunticon.href));
    embedComplete();
  });
}

If embedComplete is defined, the loader will call it when SVG embedding is complete. This is true for both local and CORS embedding. So if you need to run logic after SVG markup is appended to the DOM, just pass a callback to grunticon.svgLoadedCallback or grunticon.svgLoadedCORSCallback.

Cross-domain SVG Embedding Methods

With enhanceSVG and corsEmbed turned on, the Grunticon loader has a few exposed 2 more methods and attributes on the grunticon object that you can use:

ajaxGet

Arguments: String, Function Returns: Object

First argument is a string reference to a url to request via cross-domain Ajax. Second argument is an optional callback when the request finishes loading. (In the callback, this refers to the XHR object).

svgLoadedCORSCallback

Arguments: Function Returns: None

Uses the above methods to make SVG embedding work when CSS is hosted on another domain. (CORS must be allowed on the external domain.)

Browser testing results for icon output

The generated asynchronous CSS loader script delivers an appropriate icon stylesheet depending on a device/browser's capabilities. Grunticon is supported in cases where icon fonts fail.

Browsers that render the SVG data url stylesheet:

  • IE9
  • Chrome 14+ (maybe older too?)
  • Safari 4+ (maybe older too?)
  • Firefox 3.6+ (maybe older too?)
  • Opera 15+
  • iOS 3+ Safari and Chrome
  • Android 4.0 Chrome (caveat: SVG icons do not scale in vector, but do appear to draw in high-resolution)
  • Android 4.0 ICS Browser
  • BlackBerry Playbook

Browsers that receive the PNG data url stylesheet:

  • IE8
  • All versions of Opera, Opera Mini, and Opera Mobile before Chrome integration (v 15)
  • Android 2.3 Browser
  • Android 2.2 Browser
  • Android 2.1 Browser
  • Android 1.6 Browser
  • Android 1.5 Browser

Browsers that receive the fallback png request:

  • IE7
  • IE6
  • Non-JavaScript environments

View the full support spreadsheet here. Feel free to edit it if you find anything new.

The test page can be found here.

Tips

Cleaning the cruft out of your SVGs

In earlier versions of Grunticon, we included SVGO to optimize the SVG output. In the 1.0 version, we removed this dependency to ease the installation complexity but still recommend that SVG optimization is part of the Grunticon workflow.

When producing SVGs through a tool like Illustrator, there is a lot of unnecessary markup, comments, and general code written into your SVG files. Because of that, we strongly recommend using a tool like grunt-svgmin. If run before running Grunticon, it can greatly reduce your filesizes!

Here's an example:

svgmin: {
	dist: {
		options: {
			plugins: [
				// Don't remove XML declaration (needed to avoid errors creating PNG on Win 7)
				{ removeXMLProcInst: false }
			]
		},
		files: [{
			expand: true,
			cwd: 'example/svgs',
			src: ['*.svg'],
			dest: 'example/source'
		}]
	}
},
grunticon: {
	foo: {
		files: [{
			expand: true,
			cwd: 'example/source',
			src: ['*.svg', '*.png'],
			dest: "example/output"
		}],
		options: {
		}
	}
}

The svgmin options section is only needed to avoid errors under windows and can be omitted for smaller svg files on other platforms. For a more extensive example, check out our Gruntfile example project.

Serving compressed CSS

One of the great benefits to data uris is the ability to compress the images heavily via gzip compression. Be sure to enable gzip of CSS on your server, as it'll cut your icon transfer size greatly.

Creating SVG Artwork

The workflow we've been using so far involves creating a new Illustrator file with the artboard set to the desired size of the icon you want set in the CSS.

Export the artwork by choosing File > Save as... In the dialog, choose "SVG" as the format and enter a name for the file (this wil be used as your class name later, so keep it free of any disallowed CSS class characters like ., {, (, ), etc.

In the Save SVG dialog that opens up, there are lots of options. SVG has a ton of formats, so here are a few tips we've learned.

  • SVG Profile: Seems like SVG 1.1 Tiny is really well supported across even older mobile platforms so if you have simple artwork that doesn't use gradients or opacity this will yield a smaller and more compatible graphic. If you want to use all the fancy effects, save artwork as SVG 1.1.
  • Type: Convert to outline before export.
  • Subsetting: None, I usually convert all text to outlines ahead of time
  • Images: Embed
  • Don't check "Preserve Illustrator editing" to reduce file size

Warnings

  • If your files have #, ., >, or any other css selecting character in their names, they will likely be improperly processed.

Roadmap

This repository is now using lodash style issue management for enhancements. This means enhancement issues will now be closed instead of leaving them open.

View the enhancement backlog here. Don’t forget to upvote the top comment with 👍!

Dependents and Dependencies

Release History

  • Version 2.1.0: Add ability to embed SVGs with cross-domain requested CSS files via corsEmbed option
  • Version 2.0.0: Add ability to enhance SVGs by embedding them inside of the element instead of using a background-image
  • Version 1.4.0: Add tmpPath option
  • Version 1.3.0: Add dynamicColorOnly support from directory-colorfy
  • Version 1.2.0: Update directory-encoder version, this allows the pngpath option
  • Version 1.1.0: Add previewTemplate option
  • Version 1.0.0: Some alpha and beta bugs taken care of.
  • Version 1.0.0-alpha: Almost complete rewrite. Breaking out pieces of this project into other areas. Removed SVGO and PNGCrush. SVGO is better served through the svgmin plugin.
  • Version 0.6.5: CSS Writing has been moved from Phantom to Node, in order to decrease base64 datauri sizes
  • Version 0.6.0: Grunticon now comes with PNG Crush. This will reduce the size of your PNGs
  • Version 0.5.0: Grunticon now comes with SVGO. This cleans up your SVGs, greatly reducing the size of your CSS file.
  • Version 0.4.1: Opera browsers prior to version 15 are given fallback PNG due to SVG scaling troubles.
  • Version 0.4.0: Automated filename-driven color variations were added, along with the colors option
  • Version 0.3.4: SVGs without width and height can be used
  • Version 0.3.2: Added PhantomJS as a Node dependency, easing installation
  • Version 0.3.1: Documentation updates
  • Version 0.3.0: Grunticon becomes a multitask - syntax change involved in Gruntfile
  • Version 0.2.1: Custom selectors feature added
  • Version 0.2.0: Compatibility rewrite for Grunt 0.4x
  • Version 0.1.6: Switched from base64 encoding to escaping raw SVG text in data uris. Fixes to cssprefix setting. If fallback png data uri is > 32768 chars, link to ext png instead for IE issues.

More Repositories

1

loadCSS

Load CSS asynchronously
JavaScript
6,716
star
2

tablesaw

A group of plugins for responsive tables.
JavaScript
5,481
star
3

criticalCSS

Finds the Above the Fold CSS for your page, and outputs it into a file
JavaScript
1,698
star
4

fixed-sticky

DEPRECATED: A position: sticky polyfill that works with filamentgroup/fixed-fixed for a safer position:fixed fallback.
JavaScript
1,486
star
5

Responsive-Images

NOTE: use Picturefill instead. An Experiment with Mobile-First Images that Scale Responsively & Responsibly
JavaScript
1,382
star
6

SocialCount

Unmaintained (see the README): Simple barebones project to show share counts from various social networks.
JavaScript
1,357
star
7

select-css

Cross-browser styles for consistent select element styling
CSS
1,238
star
8

glyphhanger

Your web font utility belt. It can subset web fonts. It can find unicode-ranges for you automatically. It makes julienne fries.
JavaScript
1,112
star
9

Southstreet

Filament Group's core tools & workflow for delivering rich cross-device web applications
JavaScript
1,087
star
10

Overthrow

A tiny, no-frills, framework-independent, targeted overflow: auto polyfill for use in responsive design.
JavaScript
907
star
11

responsive-carousel

A jQuery-based script for responsive carousels that work with mouse, touch, and keyboard
JavaScript
904
star
12

loadJS

A simple function for asynchronously loading JavaScript files
JavaScript
892
star
13

Ajax-Include-Pattern

An Ajax-Include Pattern for Modular Content
JavaScript
625
star
14

tappy

Retired (see README): Tappy! - a lightweight normalized tap event.
HTML
572
star
15

politespace

Politely add spaces to numeric form values to increase readability (credit card numbers, phone numbers, etc).
JavaScript
535
star
16

grunt-criticalcss

Grunt wrapper for criticalcss
JavaScript
530
star
17

enhance

A JavaScript workflow designed to progressively enhance sites in a qualified manner.
JavaScript
489
star
18

shoestring

A lightweight, simple DOM utility made to run on a tight budget.
JavaScript
440
star
19

imaging-heap

A command line tool to measure the efficiency of your responsive image markup across viewport sizes and device pixel ratios.
JavaScript
401
star
20

snapper

A CSS Snap-Points based carousel (and lightweight polyfill)
JavaScript
361
star
21

jQuery-Visualize

HTML5 canvas charts driven by HTML table elements
JavaScript
353
star
22

a-font-garde

A variety of test cases and tools for safe font-icon usage.
JavaScript
292
star
23

jQuery-UI-Date-Range-Picker

A range picker built on top of jQuery UI's Datepicker Control
JavaScript
272
star
24

X-rayHTML

A little something to help build documentation pages.
JavaScript
258
star
25

AppendAround

A pattern for responsive markup
JavaScript
236
star
26

jqm-pagination

jQuery Mobile Pagination for touch, mouse, and keyboard
JavaScript
213
star
27

jQuery-Equal-Heights

This repository is unmaintained. Please see the included readme for more information.
JavaScript
206
star
28

formcore

A set of forms.
HTML
205
star
29

font-loading

Research on fonts
HTML
193
star
30

quickconcat

a simple dynamic concatenator for html, css, and js files, written in php
PHP
182
star
31

fixed-fixed

CSS position:fixed qualifier.
HTML
178
star
32

RWD-Nav-Patterns

Experimental navigation structure and behavior patterns based on progressive enhancement and responsive web design.
CSS
146
star
33

jQuery-Custom-File-Input

CSS-Friendly File Input
JavaScript
132
star
34

svg-to-png

Turn a folder full of SVGs into PNGs!
JavaScript
125
star
35

layersnap

Build SVG transitions simply and declaratively
JavaScript
110
star
36

woff2-feature-test

A simple feature test for the WOFF2 font format
JavaScript
107
star
37

RWD-Table-Patterns

This repository has been retired. Please see the readme below for more information.
JavaScript
105
star
38

scoped-media-query

An element query workaround. A Sass mixin for scoping CSS styles to apply only within given selector/media query pairs.
SCSS
104
star
39

EnhanceJS

Are you looking for the new "Enhance"? Try here https://github.com/filamentgroup/enhance
JavaScript
104
star
40

html-video-responsive

Explainer repo for a proposal to improve the responsive capabilities of the HTML video element
100
star
41

faux-pas

A script to highlight elements that are mismatched incorrectly to @​font-face blocks, which may result in shoddy faux bold or faux italic rendering.
HTML
99
star
42

jQuery-File-Download

One issue we have not yet seen addressed is the Ajax’s inability to receive a response in any form but text. Since it is now common for web applications to offer options for exporting your data in desktop app formats — such as .doc or .xls — we wrote a jQuery plugin to facilitate requests from the front end that result in a file for download. The plugin does not actually use Ajax, but its syntax follows the conventions of jQuery's native Ajax functions, making it a natural addition to our jQuery toolset.
JavaScript
98
star
43

enlarge

zoom a photo
JavaScript
91
star
44

cookie

Get, set, forget cookies!
JavaScript
91
star
45

elementary

A CSS workflow for mimicking element queries
JavaScript
87
star
46

porthole

Activate stuff when it's in the viewport
JavaScript
86
star
47

jQuery-Menu

Dropdown, iPod Drilldown, and Flyout styles with ARIA Support and ThemeRoller Ready
CSS
83
star
48

collapsible

Toggle your collapsible content
JavaScript
81
star
49

dialog

Just a simple, minimal jQuery dialog with typical interactivity
JavaScript
80
star
50

jQuery-Preload-CSS-Images

A solution that automates the age-old task of preloading images in web applications.
JavaScript
75
star
51

fg-modal

A modal web component
JavaScript
71
star
52

grumpicon

Grunticon Web App.
JavaScript
71
star
53

gulpicon

A gulp task wrapper for grunticon-lib.
Handlebars
67
star
54

jQuery-Custom-Input

Accessible, custom designed checkbox and radio button inputs styled with CSS (and a dash of jQuery)
HTML
63
star
55

checkboxradio

jQuery Plugin for progressively enhanced radio buttons and checkboxes
JavaScript
54
star
56

select

Minimally custom-styled select element
CSS
53
star
57

Revolver

A 360° panoramic photo viewer
JavaScript
50
star
58

resizeasaurus

A little utility to add resizing behavior to test intrinsically sized responsive components.
HTML
49
star
59

jQuery-Pixel-Em-Converter

jQuery Plugin for Retaining Scalable Interfaces with Pixel-to-Em Conversion
JavaScript
48
star
60

jQuery-Mobile-FixedToolbar-Legacy-Polyfill

Brings jQM Fixed Toolbar support to browsers that don't natively support position:fixed (like iOS4)
HTML
43
star
61

grunticon-lib

Stand-alone library for Grunticon
JavaScript
41
star
62

cq

A minimal container query web component
JavaScript
39
star
63

Overthrow-Sidescroller

The Sidescroller extension for Overthrow
JavaScript
37
star
64

jQuery-Mobile-Themed-DatePicker

This is jQuery UI's datepicker plugin with jQuery Mobile's theming and script handling applied.
HTML
36
star
65

auto-complete

A very small auto-complete component.
JavaScript
35
star
66

jQuery-Tree-Control

An accessible HTML tree component
JavaScript
34
star
67

jQuery-Slider

Accessible, custom slider widget based on a standard HTML select
JavaScript
34
star
68

directory-encoder

Takes a directory of images, turns it into some CSS.
JavaScript
33
star
69

anims

Just some CSS utilities for build and loop animations.
CSS
33
star
70

Accessible-jQuery-Tabs

A simple jQuery plugin for accessible tabs widget
HTML
30
star
71

face-off

This repository has been retired. Please see the readme below for more information.
HTML
29
star
72

Heart.js

A lightweight “ticker” plugin.
HTML
28
star
73

tau

Tau is a small and simple 360° gallery
JavaScript
26
star
74

Menu

jQuery Plugin for progressively enhanced menus
JavaScript
26
star
75

jQuery-Collapsible-Content

An accessible collapsible content panel plugin
JavaScript
25
star
76

directory-colorfy

Turn a folder of SVGs into a different color, quickly!
JavaScript
24
star
77

script-media-query

An @media (script) polyfill experiment
JavaScript
21
star
78

fg-carousel

An accessible carousel web component
JavaScript
18
star
79

Details

JavaScript
17
star
80

iconoclash

A workflow for configurable external svg sets.
JavaScript
14
star
81

iframe-caching

HTML
12
star
82

marquee

HTML
11
star
83

creditable

Utilities for working with credit card form input.
JavaScript
11
star
84

postcss-media-query-optimizer

A postcss plugin that will optimize your media queries.
JavaScript
10
star
85

servers-workers

Service Worker examples to be used at the CDN level.
JavaScript
9
star
86

component

just our typical auto enhance-able component skeleton
JavaScript
9
star
87

jqm-mail

An experimental responsive web app layout using jQuery Mobile controls
HTML
8
star
88

fg-collapse

An accessible collapsible web component
JavaScript
8
star
89

getmeta

get a meta tag's value by its name
JavaScript
8
star
90

3D-feature-test

Using progressive enhancement to apply 3D flip animation only to capable browsers
CSS
7
star
91

node-faux-pas

A command line utility to test a URL for faux web font rendering and mismatched web font code.
JavaScript
7
star
92

wc-experiments

web components and such
JavaScript
6
star
93

pym

A lightweight zoom library
JavaScript
4
star
94

validator

Form validation goodies
JavaScript
4
star
95

toss

A JavaScript function that scrolls any overflow container to a set of coordinates using an animated duration.
JavaScript
3
star
96

Trunca-

JavaScript
2
star
97

demo-head

Header for demo pages
CSS
2
star
98

compare-embed

HTML
1
star
99

flex-luthor

A small wrapper library to help with responsive intrinsic-sized Flexbox layouts that wrap based on content and container width and avoiding viewport-based media queries.
Nunjucks
1
star