Skip to content
Snippets Groups Projects
update-iconset.js 2.71 KiB
#!/usr/bin/env node

const crypto = require('crypto');
const fs = require("fs/promises");
const path = require("path");

const selection = require("../source/icons/selection.json");

const buildBaseRules = (hash) => `
@font-face {
  font-family: 'pirati-ui';
  src:  url('../fonts/pirati-ui.eot?${hash}');
  src:  url('../fonts/pirati-ui.eot?${hash}#iefix') format('embedded-opentype'),
    url('../fonts/pirati-ui.ttf?${hash}') format('truetype'),
    url('../fonts/pirati-ui.woff?${hash}') format('woff'),
    url('../fonts/pirati-ui.svg?${hash}#pirati-ui') format('svg');
  font-weight: normal;
  font-style: normal;
  font-display: block;
}

[class^="ico--"], [class*=" ico--"] {
  /* use !important to prevent issues with browser extensions that change fonts */
  font-family: 'pirati-ui' !important;
  speak: never;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  text-transform: none;
  line-height: 1;

  /* Better Font Rendering =========== */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
`;

const buildIconRules = (icons) => {
  return icons.map(icon => `.${icon.class}:before { content: "${icon.content}"; }`).join("\n");
}

const getHash = (icons) => {
  return crypto.createHash('md5').update(icons, 'utf8').digest('hex');
}

const buildRuleset = (icons) => {
  const iconRules = buildIconRules(icons);
  const hash = getHash(iconRules);
  const baseRules = buildBaseRules(hash);
  return [baseRules, iconRules].join("\n");
}

const buildPattern = (icons) => {
  const body = icons.map(icon => `
<div class="card">
  <div class="flex justify-center items-center h-16 text-2xl border-b border-grey-100 bg-grey-50 p-2">
    <i class="${icon.class}"></i>
  </div>
  <div class="card__body p-2 text-2xs">
    <code>.${icon.class}</code>
  </div>
</div>`).join("\n");
  return `<div class="grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-8 xl:grid-cols-16 gap-2 items-center">${body}</div>`;
}

async function writeFile(path, content) {
  let filehandle;

  try {
    filehandle = await fs.open(path, "w");
    filehandle.write(content);
  } finally {
    if (filehandle !== undefined)
      await filehandle.close();
  }
}


const prefix = selection.preferences.fontPref.prefix;
const icons = selection.icons.map(icon => {
  const content = `${'\\'}${icon.properties.code.toString(16)}`;
  return icon.properties.name.split(", ").map(iconName => ({
    class: `${prefix}${iconName}`,
    content
  }));
}).flat();

// Write PCSS
writeFile(path.join(path.dirname(__filename), "..", "source", "css", "atoms", "icons.pcss"), buildRuleset(icons));

// Write Pattern Lab pattern
writeFile(path.join(path.dirname(__filename), "..", "source", "_patterns", "00-atoms", "02-icons", "icons.mustache"), buildPattern(icons));