mirror of
https://github.com/danbulant/dribbblish-dynamic-theme
synced 2026-05-19 04:08:53 +00:00
refactor icons a bit
This commit is contained in:
parent
4dd2d42ca4
commit
0e50a92431
4 changed files with 53 additions and 22 deletions
|
|
@ -1,7 +1,7 @@
|
|||
import { parseSync as parseSVG, stringify as stringifySVG } from "svgson";
|
||||
|
||||
export default class Icons {
|
||||
/** @typedef {"baseline" | "outline" | "round" | "sharp" | "twotone"} IconStyle */
|
||||
/** @typedef {"custom" | "material:baseline" | "material:outline" | "material:round" | "material:sharp" | "material:twotone"} IconStyle */
|
||||
|
||||
/**
|
||||
* @typedef {Object} IconOptions
|
||||
|
|
@ -19,20 +19,41 @@ export default class Icons {
|
|||
this.#icons = process.env.DRIBBBLISH_ICONS;
|
||||
}
|
||||
|
||||
getRawSVG(name, style = "round") {
|
||||
/**
|
||||
* @param {String} name
|
||||
* @param {IconStyle} style
|
||||
* @returns {String}
|
||||
*/
|
||||
getRawSVG(name, style) {
|
||||
if (style == null) style = this.#getDefaultStyle(name);
|
||||
if (!this.#icons.hasOwnProperty(name)) throw new Error(`Icon "${name}" does not exist`);
|
||||
|
||||
if (typeof this.#icons[name] == "string") {
|
||||
return this.#icons[name];
|
||||
} else {
|
||||
if (!this.#icons[name].hasOwnProperty(style)) {
|
||||
const styles = Object.keys(this.#icons[name])
|
||||
.map((s) => `"${s}"`)
|
||||
.join(", ");
|
||||
throw new Error(`Icon "${name}" does not have style "${style}". It is available in styles [${styles}].`);
|
||||
}
|
||||
return this.#icons[name][style];
|
||||
if (!this.#icons[name].hasOwnProperty(style)) {
|
||||
const styles = Object.keys(this.#icons[name])
|
||||
.map((s) => `"${s}"`)
|
||||
.join(", ");
|
||||
throw new Error(`Icon "${name}" does not have style "${style}". It is available in styles [${styles}].`);
|
||||
}
|
||||
|
||||
return this.#icons[name][style];
|
||||
}
|
||||
|
||||
getAvailableStyles(name) {
|
||||
if (!this.#icons.hasOwnProperty(name)) throw new Error(`Icon "${name}" does not exist`);
|
||||
return Object.keys(this.#icons[name]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {String} name
|
||||
* @returns
|
||||
*/
|
||||
#getDefaultStyle(name) {
|
||||
const styles = this.getAvailableStyles(name);
|
||||
for (const s of ["custom", "material:round"]) {
|
||||
if (styles.includes(s)) return s;
|
||||
}
|
||||
|
||||
return styles[0];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -44,7 +65,7 @@ export default class Icons {
|
|||
get(name, options) {
|
||||
/** @type {IconOptions} */
|
||||
const defaultOptions = {
|
||||
style: "round",
|
||||
style: this.#getDefaultStyle(name),
|
||||
size: 16,
|
||||
scale: 1,
|
||||
fill: "currentColor",
|
||||
|
|
@ -54,7 +75,8 @@ export default class Icons {
|
|||
|
||||
const svg = parseSVG(this.getRawSVG(name, options.style));
|
||||
|
||||
svg.attributes.type = "dribbblish-icon";
|
||||
svg.attributes["icon-type"] = "dribbblish";
|
||||
svg.attributes["icon-style"] = options.style;
|
||||
svg.attributes.fill = options.fill;
|
||||
svg.attributes.width = options.size;
|
||||
svg.attributes.height = options.size;
|
||||
|
|
@ -66,7 +88,7 @@ export default class Icons {
|
|||
styles.transformOrigin = "center";
|
||||
}
|
||||
svg.children = svg.children.map((child) => {
|
||||
child.attributes.style = styles.cssText;
|
||||
if (styles.cssText != "") child.attributes.style = styles.cssText;
|
||||
return child;
|
||||
});
|
||||
|
||||
|
|
|
|||
7
src/styles/Icons.scss
Normal file
7
src/styles/Icons.scss
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
svg[icon-type="dribbblish"] {
|
||||
overflow: visible;
|
||||
|
||||
// &[icon-style="custom"] {}
|
||||
|
||||
// &[icon-style^="material:"] {}
|
||||
}
|
||||
|
|
@ -10,6 +10,7 @@
|
|||
@import "Loader";
|
||||
@import "Modals";
|
||||
@import "ConnectDeviceList";
|
||||
@import "Icons";
|
||||
|
||||
:root {
|
||||
--bar-height: 70px;
|
||||
|
|
@ -591,6 +592,7 @@ html.sidebar-hide-text .GlueDropTarget span {
|
|||
transform: translateX(calc(-50%));
|
||||
padding: 0 5px;
|
||||
text-align: center;
|
||||
white-space: nowrap;
|
||||
pointer-events: none;
|
||||
border: 1px solid spiceColor("subtext", 0.1, 0.1);
|
||||
border-radius: var(--main-corner-radius);
|
||||
|
|
@ -1280,10 +1282,6 @@ html.right-expanded-cover.buddyfeed-visible .main-coverSlotExpanded-container {
|
|||
display: none;
|
||||
}
|
||||
|
||||
svg[type="dribbblish-icon"] {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
// ! WORKAROUNDS / TEMP FIXES
|
||||
// Spotify UI breaks after advertisements #63
|
||||
canvas[width="250"][height="250"] {
|
||||
|
|
|
|||
|
|
@ -5,18 +5,22 @@ const path = require("path");
|
|||
const fs = require("fs");
|
||||
|
||||
const icons = {};
|
||||
function addIcon(name, style, path) {
|
||||
name = name.replace(/_/g, "-");
|
||||
if (!icons.hasOwnProperty(name)) icons[name] = {};
|
||||
icons[name][style] = fs.readFileSync(path, { encoding: "utf8" });
|
||||
}
|
||||
// Add Material Icons
|
||||
let iconDir = path.resolve(__dirname, "node_modules/@material-icons/svg/svg");
|
||||
for (const dir of fs.readdirSync(iconDir)) {
|
||||
icons[dir.replace("_", "-")] = {};
|
||||
for (const file of fs.readdirSync(path.resolve(iconDir, dir))) {
|
||||
icons[dir.replace("_", "-")][file.replace(/\..*?$/, "")] = fs.readFileSync(path.resolve(iconDir, dir, file), { encoding: "utf8" });
|
||||
addIcon(dir, `material:${file.replace(/\..*?$/, "")}`, path.resolve(iconDir, dir, file));
|
||||
}
|
||||
}
|
||||
// Add Custom Icons
|
||||
iconDir = path.resolve(__dirname, "src/icons");
|
||||
for (const icon of fs.readdirSync(iconDir)) {
|
||||
icons[icon.replace(/\..*?$/, "")] = fs.readFileSync(path.resolve(iconDir, icon), { encoding: "utf8" });
|
||||
addIcon(icon.replace(/\..*?$/, ""), "custom", path.resolve(iconDir, icon));
|
||||
}
|
||||
|
||||
/** @type {import('webpack').Configuration} */
|
||||
|
|
|
|||
Loading…
Reference in a new issue