npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

assetgraph-sprite

v3.2.1

Published

AssetGraph plugin for creating sprites from background images

Downloads

3,745

Readme

AssetGraph-sprite

Gitter NPM version Build Status Coverage Status Dependency Status

A plugin (or "transform") for AssetGraph that optimizes CSS background images by creating sprite images. The spriting is guided by GET parameters and a set of custom CSS properties with a -sprite- prefix.

You can tell AssetGraph-sprite that you want to sprite a given CSS background image by adding a sprite parameter to its query string:

.classone {
  background-image: url(images/thething.png?sprite=mySpriteGroup);
}
.classtwo {
  background-image: url(images/theotherthing.png?sprite=mySpriteGroup);
}

This is valid CSS and will also work fine on its own in "development mode" without a compilation step, so you don't need to rebuild your project all the time, except when you want to test the spriting itself. After being run through the AssetGraph-sprite transform it will look something like this (123 is the id of the generated sprite asset and could be any number):

.classone {
  background-image: url(123png);
  background-position: 0 0;
}
.classtwo {
  background-image: url(123png);
  background-position: -34px 0;
}

Some additional parameters are supported:

padding=<top>,<right>,<bottom>,<left>

Adds "keepaway space" around the image in the sprite. Sometimes useful if the background image is applied to an element that takes up a bigger area than the background image. Supports regular CSS padding syntax, including the shorthand variants with 1, 2, or 3 values. The only supported unit is px. Defaults to 0 0 0 0. Not supported by the jim-scott packer (see the docs for -sprite-packer below).

spriteNoGroup

Tells AssetGraph-sprite that you want this selector to contain a background-image property pointing at the sprite image, even if the sprite group has a "group selector" configured (see below).

Configuring a sprite

If you can guarantee that the HTML elements that need to have the background image applied are also matched by another selector, you can save some more bytes by telling AssetGraph-sprite that it only needs to add the background-image property pointing at the sprite to that selector using the -sprite-selector-for-group property:

.foo {
  -sprite-selector-for-group: mySpriteGroup;
}
.classone {
  background-image: url(images/thething.png?sprite=mySpriteGroup);
}
.classtwo {
  background-image: url(images/theotherthing.png?sprite=mySpriteGroup);
}

... which compiles to:

.foo {
  background-image: url(123png);
}
.classone {
  background-position: 0 0;
}
.classtwo {
  background-position: -34px 0;
}

AssetGraph-sprite tries to preserve as much of the original CSS as possible, including existing background or background-image properties in the group selector and the priority (!important status), for example:

.foo {
  -sprite-selector-for-group: mySpriteGroup;
  background: red !important;
}
.classone {
  background: blue url(images/thething.png?sprite=mySpriteGroup) !important;
}

Compiles to:

.foo {
  background: red url(123png) !important;
}
.classone {
  background: blue !important;
  background-position: 0 0;
}

You can tweak the generated sprite images by putting additional -sprite-prefixed configuration properties into the "group selector", for example:

.foo {
  -sprite-selector-for-group: mySpriteGroup;
  -sprite-packer: horizontal;
  -sprite-background-color: #a767ac;
}

These options are currently supported:

-sprite-packer: horizontal|vertical|jim-scott|try-all

Selects the packing algorithm for the sprite. The horizontal and vertical variants naively lay out the images one after the other. This works well when you have a bunch of images with the same height or width. The jim-scott packer is a little fancier, it's an implementation of a floor planning algorithm originally invented by Jim Scott for packing lightmaps. The Jim Scott packer doesn't support the -sprite-padding property on the individual images. If you don't specify -sprite-packer, the default is try-all, which runs all the algorithms and chooses the packing that produces the smallest sprite image (area-wise).

-sprite-location: url(...)

Specifies the desired location of the sprite. This is useful in combination with the processImages transform if you want to postprocess the generated sprite image:

.foo {
  -sprite-selector-for-group: mySpriteGroup;
  -sprite-location: url(mySprite.png?pngquant=128);
}
.classone {
  background-position: 0 0;
}

Compiles to:

.foo {
  background: red url(mySprite.png?pngquant=128) !important;
}
.classone {
  background-position: 0 0;
}

-sprite-image-format: png|jpg

The format of the generated sprite. More will be added when node-canvas gains support for more image formats.

-sprite-background-color: red|yellow|#123123|transparent|...

Specifies the background color for the generated sprite image, supports any color syntax understood by node-canvas, which is the entire CSS3 Color Module, as far as I can tell. Defaults to transparent.

Installation

$ npm install assetgraph-sprite

Usage

Since AssetGraph-sprite is intended to be used as part of an AssetGraph workflow, first you'll need to have AssetGraph installed to use it properly:

$ npm install assetgraph

Here's a stripped-down example that loads all CSS files in a directory, loads all the images linked to by background and background-image properties, sprites them according to the -sprite-... instructions, then writes the resulting CSS and all the images to a different directory:

var AssetGraph = require('assetgraph');

new AssetGraph({ root: 'path/to/css/files' })
  .loadAssets('*.css')
  .populate({ followRelations: { type: 'CssImage' } })
  .queue(require('assetgraph-sprite')())
  .writeAssetsToDisc({ url: /^file:/ }, 'file:///my/output/dir')
  .run(function (err) {
    if (err) throw err;
    // All done!
  });

For a more elaborate example of how AssetGraph-sprite can fit in a workflow, see the buildProduction script in AssetGraph-builder

License

AssetGraph-sprite is licensed under a standard 3-clause BSD license -- see the LICENSE-file for details.