From 26c7068d6668f836512f9392f21b3d9d37684946 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 20 Sep 2021 15:33:28 -0500 Subject: [PATCH] Add Tabler icons --- app/soapbox/components/icon.js | 14 +++++----- app/soapbox/components/sidebar_menu.js | 36 ++++++++++++------------- app/styles/components/icon.scss | 5 ++-- app/styles/components/sidebar-menu.scss | 8 ++++-- package.json | 2 ++ webpack/rules/assets.js | 15 +++++++++++ webpack/shared.js | 5 ++++ yarn.lock | 10 +++++++ 8 files changed, 67 insertions(+), 28 deletions(-) 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"