diff --git a/app/soapbox/components/icon.js b/app/soapbox/components/icon.js
index d97c7739d..4dff5cf61 100644
--- a/app/soapbox/components/icon.js
+++ b/app/soapbox/components/icon.js
@@ -2,27 +2,29 @@
* Icon: abstract icon class that can render icons from multiple sets.
* @module soapbox/components/icon
* @see soapbox/components/fork_awesome_icon
+ * @see soapbox/components/svg_icon
*/
import React from 'react';
import PropTypes from 'prop-types';
import ForkAwesomeIcon from './fork_awesome_icon';
+import SvgIcon from './svg_icon';
export default class Icon extends React.PureComponent {
static propTypes = {
id: PropTypes.string.isRequired,
- iconset: PropTypes.string,
+ src: PropTypes.string,
className: PropTypes.string,
- fixedWidth: PropTypes.bool,
};
render() {
- const { iconset, ...rest } = this.props;
+ const { id, src, ...rest } = this.props;
- switch(iconset) {
- default:
- return ;
+ if (src) {
+ return ;
+ } else {
+ return ;
}
}
diff --git a/app/soapbox/components/sidebar_menu.js b/app/soapbox/components/sidebar_menu.js
index a7b86fbd4..a42cc45c1 100644
--- a/app/soapbox/components/sidebar_menu.js
+++ b/app/soapbox/components/sidebar_menu.js
@@ -200,84 +200,84 @@ class SidebarMenu extends ImmutablePureComponent {
-
+
{intl.formatMessage(messages.profile)}
{donateUrl &&
-
+
{intl.formatMessage(messages.donate)}
}
{hasCrypto &&
-
+
{intl.formatMessage(messages.donate_crypto)}
}
{features.lists &&
-
+
{intl.formatMessage(messages.lists)}
}
{features.bookmarks &&
-
+
{intl.formatMessage(messages.bookmarks)}
}
-
+
{intl.formatMessage(messages.follow_requests)}
-
+
{intl.formatMessage(messages.blocks)}
{features.federating &&
-
+
{intl.formatMessage(messages.domain_blocks)}
}
-
+
{intl.formatMessage(messages.mutes)}
-
+
{intl.formatMessage(messages.filters)}
{isAdmin(account) &&
-
+
{intl.formatMessage(messages.admin_settings)}
}
{isAdmin(account) &&
-
+
{intl.formatMessage(messages.soapbox_config)}
}
-
+
{intl.formatMessage(messages.preferences)}
-
+
{intl.formatMessage(messages.import_data)}
{(features.federating && features.accountAliasesAPI) &&
-
+
{intl.formatMessage(messages.account_aliases)}
}
-
+
{intl.formatMessage(messages.security)}
-
+
{intl.formatMessage(messages.info)}
-
+
{intl.formatMessage(messages.logout)}
diff --git a/app/styles/components/icon.scss b/app/styles/components/icon.scss
index 0545ae2b5..9a02ac90a 100644
--- a/app/styles/components/icon.scss
+++ b/app/styles/components/icon.scss
@@ -6,8 +6,9 @@
justify-content: center;
> svg {
- max-width: 100%;
- max-height: 100%;
+ // Apparently this won't skew the image as long as it has a viewbox
+ width: 100%;
+ height: 100%;
}
}
diff --git a/app/styles/components/sidebar-menu.scss b/app/styles/components/sidebar-menu.scss
index 451b32571..16e706557 100644
--- a/app/styles/components/sidebar-menu.scss
+++ b/app/styles/components/sidebar-menu.scss
@@ -158,9 +158,13 @@
}
> .svg-icon {
- width: 24px;
- height: 24px;
+ width: 28px;
+ height: 28px;
margin-right: 15px;
+
+ svg.icon-tabler {
+ stroke-width: 1px;
+ }
}
&:hover {
diff --git a/package.json b/package.json
index d921b210f..5de8a4d31 100644
--- a/package.json
+++ b/package.json
@@ -56,6 +56,7 @@
"@sentry/browser": "^6.12.0",
"@sentry/react": "^6.12.0",
"@sentry/tracing": "^6.12.0",
+ "@tabler/icons": "^1.41.2",
"array-includes": "^3.0.3",
"autoprefixer": "^10.0.0",
"axios": "^0.21.4",
@@ -100,6 +101,7 @@
"mark-loader": "^0.1.6",
"marky": "^1.2.1",
"mini-css-extract-plugin": "^1.6.2",
+ "mini-svg-data-uri": "^1.3.3",
"object-assign": "^4.1.1",
"object-fit-images": "^3.2.3",
"object.values": "^1.1.0",
diff --git a/webpack/rules/assets.js b/webpack/rules/assets.js
index 2c6fb3f0d..14ed250ad 100644
--- a/webpack/rules/assets.js
+++ b/webpack/rules/assets.js
@@ -2,6 +2,7 @@
// https://webpack.js.org/guides/asset-modules/
const { resolve } = require('path');
+const svgToMiniDataURI = require('mini-svg-data-uri');
// These are processed in reverse-order
// We use the name 'packs' instead of 'assets' for legacy reasons
@@ -40,6 +41,20 @@ module.exports = [{
generator: {
filename: 'packs/emoji/[name]-[contenthash:8][ext]',
},
+}, {
+ test: /\.svg$/,
+ type: 'asset/inline',
+ include: resolve('node_modules', '@material-design-icons'),
+ generator: {
+ dataUrl: content => svgToMiniDataURI(content.toString()),
+ },
+}, {
+ test: /\.svg$/,
+ type: 'asset/inline',
+ include: resolve('node_modules', '@tabler'),
+ generator: {
+ dataUrl: content => svgToMiniDataURI(content.toString()),
+ },
}, {
test: /\.svg$/,
type: 'asset/resource',
diff --git a/webpack/shared.js b/webpack/shared.js
index fd01df7be..0e732d81e 100644
--- a/webpack/shared.js
+++ b/webpack/shared.js
@@ -106,6 +106,11 @@ module.exports = {
resolve(settings.source_path),
'node_modules',
],
+ alias: {
+ // Override tabler's package.json to allow importing .svg files directly
+ // https://stackoverflow.com/a/35990101/8811886
+ '@tabler': resolve('node_modules', '@tabler'),
+ },
fallback: {
path: require.resolve('path-browserify'),
util: require.resolve('util'),
diff --git a/yarn.lock b/yarn.lock
index 54cdfb430..add93b603 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1519,6 +1519,11 @@
remark "^13.0.0"
unist-util-find-all-after "^3.0.2"
+"@tabler/icons@^1.41.2":
+ version "1.41.2"
+ resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-1.41.2.tgz#effccbb261539b68609cc7dc660a058683170ee1"
+ integrity sha512-X6cQmMC24hiwg0p2BzasvU3IeCCdOk0f/9d6gNNtJM4lzG2TCloTns1bVvU5MAFkITGukxUqjPFE3Ecd6kGsfw==
+
"@tootallnate/once@1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
@@ -6488,6 +6493,11 @@ mini-css-extract-plugin@^1.6.2:
schema-utils "^3.0.0"
webpack-sources "^1.1.0"
+mini-svg-data-uri@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.3.3.tgz#91d2c09f45e056e5e1043340b8b37ba7b50f4fac"
+ integrity sha512-+fA2oRcR1dJI/7ITmeQJDrYWks0wodlOz0pAEhKYJ2IVc1z0AnwJUsKY2fzFmPAM3Jo9J0rBx8JAA9QQSJ5PuA==
+
minimalistic-assert@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"