mikevercoelen / icons-loader

Icons loader for webpack, generates iconfonts for webpack
https://www.npmjs.com/package/icons-loader
36 stars 9 forks source link

CSS Generation #3

Open amcdnl opened 8 years ago

amcdnl commented 8 years ago

It would be nice to have automatic CSS generation included in this loader.

This is a gulp extension I wrote that I'm wonder if your interested on collaborating on integrating. This also generates a HTML preview of the icons too.

build.icons.js

var gulp = require('gulp');
var iconfont = require('gulp-iconfont');
var iconfontCss = require('gulp-iconfont-css');
var paths = require('./paths');
var consolidate = require('gulp-consolidate');

gulp.task('build:icons', function(done) {
  var fontName = 'icons';
  var cssClass = 'icon';

  return gulp.src(paths.svgs)
    .pipe(iconfontCss({
      fontName,
      cssClass: cssClass,
      targetPath: 'styles/icons.css',
      fontPath: 'fonts/icons/',
      path: 'template.css'
    }))
    .pipe(iconfont({
      fontName,
      normalize:true,
      fontHeight: 1001,
      log: () => {},
      formats: ['ttf', 'eot', 'woff', 'svg']
    }))
    .on('glyphs', function(glyphs, options) {
      gulp.src('template.html')
        .pipe(consolidate('lodash', {
          glyphs: glyphs,
          fontName: fontName,
          cssClass: cssClass
        }))
        .pipe(gulp.dest(`${paths.output}assets/fonts/icons`));
    })
    .pipe(gulp.dest(`${paths.output}assets/fonts/icons`));
});

template.css

@charset "UTF-8";

@font-face {
    font-family: "<%= fontName %>";
    src: url('<%= fontPath %><%= fontName %>.eot');
    src: url("../assets/fonts/fontastic/swimlane.eot?#iefix") format("embedded-opentype"),
        url('<%= fontPath %><%= fontName %>.woff') format('woff'),
        url('<%= fontPath %><%= fontName %>.ttf') format('truetype'),
        url('<%= fontPath %><%= fontName %>.svg#<%= fontName %>') format('svg');

    font-weight: normal;
  font-style: normal;
}

[class^="<%= cssClass %>-"]:before,
[class*=" <%= cssClass %>-"]:before {
    font-family: "<%= fontName %>"  !important;
    speak: none;
    line-height: 1;

    font-style: normal !important;
    font-weight: normal !important;
    font-variant: normal !important;
    text-transform: none !important;
    text-decoration: none !important;

    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

<% _.each(glyphs, function(glyph) { %>
.<%= cssClass %>-<%= glyph.fileName %>:before {
    content: "\<%= glyph.codePoint %>";
}
<% }); %>

template.html


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Font Reference - Swimlane</title>
    <link rel="stylesheet" href="../../styles/icons.css">
    <style type="text/css">html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-weight:inherit;font-style:inherit;font-family:inherit;font-size:100%;vertical-align:baseline}body{line-height:1;color:#000;background:#fff}ol,ul{list-style:none}table{border-collapse:separate;border-spacing:0;vertical-align:middle}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}a img{border:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{font-family:'Dosis','Tahoma',sans-serif}.container{margin:15px auto;width:80%}h1{margin:40px 0 20px;font-weight:700;font-size:38px;line-height:32px;color:#fb565e}h2{font-size:18px;padding:0 0 21px 5px;margin:45px 0 0 0;text-transform:uppercase;font-weight:500}.small{font-size:14px;color:#a5adb4;}.small a{color:#a5adb4;}.small a:hover{color:#fb565e}.glyphs.character-mapping{margin:0 0 20px 0;padding:20px 0 20px 30px;color:rgba(0,0,0,0.5);border:1px solid #d8e0e5;-webkit-border-radius:3px;border-radius:3px;}.glyphs.character-mapping li{margin:0 30px 20px 0;display:inline-block;width:90px}.glyphs.character-mapping .icon{margin:10px 0 10px 15px;padding:15px;position:relative;width:55px;height:55px;color:#162a36 !important;overflow:hidden;-webkit-border-radius:3px;border-radius:3px;font-size:32px;}.glyphs.character-mapping .icon svg{fill:#000}.glyphs.character-mapping input{margin:0;padding:5px 0;line-height:12px;font-size:12px;display:block;width:100%;border:1px solid #d8e0e5;-webkit-border-radius:5px;border-radius:5px;text-align:center;outline:0;}.glyphs.character-mapping input:focus{border:1px solid #fbde4a;-webkit-box-shadow:inset 0 0 3px #fbde4a;box-shadow:inset 0 0 3px #fbde4a}.glyphs.character-mapping input:hover{-webkit-box-shadow:inset 0 0 3px #fbde4a;box-shadow:inset 0 0 3px #fbde4a}.glyphs.css-mapping{margin:0 0 60px 0;padding:30px 0 20px 30px;color:rgba(0,0,0,0.5);border:1px solid #d8e0e5;-webkit-border-radius:3px;border-radius:3px;}.glyphs.css-mapping li{margin:0 30px 20px 0;padding:0;display:inline-block;overflow:hidden}.glyphs.css-mapping .icon{margin:0;margin-right:10px;padding:13px;height:50px;width:50px;color:#162a36 !important;overflow:hidden;float:left;font-size:24px}.glyphs.css-mapping input{margin:0;margin-top:5px;padding:8px;line-height:16px;font-size:16px;display:block;width:150px;height:40px;border:1px solid #d8e0e5;-webkit-border-radius:5px;border-radius:5px;background:#fff;outline:0;float:right;}.glyphs.css-mapping input:focus{border:1px solid #fbde4a;-webkit-box-shadow:inset 0 0 3px #fbde4a;box-shadow:inset 0 0 3px #fbde4a}.glyphs.css-mapping input:hover{-webkit-box-shadow:inset 0 0 3px #fbde4a;box-shadow:inset 0 0 3px #fbde4a}</style>
  </head>
  <body>
    <div class="container">
      <h1>Swimlane: <%= fontName %></h1>
      <ul class="glyphs css-mapping">
        <% _.each(glyphs, function(glyph) { %>
        <li>
          <div class="icon <%= cssClass %>-<%= glyph.name %>"></div>
          <input type="text" readonly="readonly" value="<%= cssClass %>-<%= glyph.name %>">
        </li>
        <% }); %>
      </ul>
    </div>
    <script>
      (function() {
        var glyphs, i, len, ref;
        ref = document.getElementsByClassName('glyphs');
        for (i = 0, len = ref.length; i < len; i++) {
          glyphs = ref[i];
          glyphs.addEventListener('click', function(event) {
            if (event.target.tagName === 'INPUT') {
              return event.target.select();
            }
          });
        }
      }).call(this);
    </script>
  </body>
</html>
mikevercoelen commented 8 years ago

true that, will add it soon :) Thanks man