diff --git a/assets/css/app.css b/assets/css/app.css index ef1477df..4a523439 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -3,7 +3,10 @@ @source "../js"; @source "../../lib/music_library_web"; -@plugin "./heroicons.tailwind.plugin.js"; +/* A Tailwind plugin that makes "hero-#{ICON}" classes available. + The heroicons installation itself is managed by your mix.exs */ +@plugin "../vendor/heroicons"; + @plugin "@tailwindcss/forms"; @custom-variant phx-click-loading (.phx-click-loading&, .phx-click-loading &); diff --git a/assets/css/heroicons.tailwind.plugin.js b/assets/css/heroicons.tailwind.plugin.js deleted file mode 100644 index 95b2cbed..00000000 --- a/assets/css/heroicons.tailwind.plugin.js +++ /dev/null @@ -1,47 +0,0 @@ -const fs = require("fs"); -const path = require("path"); - -module.exports = function ({ matchComponents, theme }) { - let iconsDir = path.join(process.cwd(), "deps/heroicons/optimized"); - let values = {}; - let icons = [ - ["", "/24/outline"], - ["-solid", "/24/solid"], - ["-mini", "/20/solid"], - ["-micro", "/16/solid"], - ]; - icons.forEach(([suffix, dir]) => { - fs.readdirSync(path.join(iconsDir, dir)).forEach((file) => { - let name = path.basename(file, ".svg") + suffix; - values[name] = { name, fullPath: path.join(iconsDir, dir, file) }; - }); - }); - matchComponents( - { - hero: ({ name, fullPath }) => { - let content = fs - .readFileSync(fullPath) - .toString() - .replace(/\r?\n|\r/g, ""); - let size = theme("spacing.6"); - if (name.endsWith("-mini")) { - size = theme("spacing.5"); - } else if (name.endsWith("-micro")) { - size = theme("spacing.4"); - } - return { - [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`, - "-webkit-mask": `var(--hero-${name})`, - mask: `var(--hero-${name})`, - "mask-repeat": "no-repeat", - "background-color": "currentColor", - "vertical-align": "middle", - display: "inline-block", - width: size, - height: size, - }; - }, - }, - { values }, - ); -}; diff --git a/assets/vendor/heroicons.js b/assets/vendor/heroicons.js new file mode 100644 index 00000000..296f80e4 --- /dev/null +++ b/assets/vendor/heroicons.js @@ -0,0 +1,43 @@ +const plugin = require("tailwindcss/plugin") +const fs = require("fs") +const path = require("path") + +module.exports = plugin(function({matchComponents, theme}) { + let iconsDir = path.join(__dirname, "../../deps/heroicons/optimized") + let values = {} + let icons = [ + ["", "/24/outline"], + ["-solid", "/24/solid"], + ["-mini", "/20/solid"], + ["-micro", "/16/solid"] + ] + icons.forEach(([suffix, dir]) => { + fs.readdirSync(path.join(iconsDir, dir)).forEach(file => { + let name = path.basename(file, ".svg") + suffix + values[name] = {name, fullPath: path.join(iconsDir, dir, file)} + }) + }) + matchComponents({ + "hero": ({name, fullPath}) => { + let content = fs.readFileSync(fullPath).toString().replace(/\r?\n|\r/g, "") + content = encodeURIComponent(content) + let size = theme("spacing.6") + if (name.endsWith("-mini")) { + size = theme("spacing.5") + } else if (name.endsWith("-micro")) { + size = theme("spacing.4") + } + return { + [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`, + "-webkit-mask": `var(--hero-${name})`, + "mask": `var(--hero-${name})`, + "mask-repeat": "no-repeat", + "background-color": "currentColor", + "vertical-align": "middle", + "display": "inline-block", + "width": size, + "height": size + } + } + }, {values}) +})