diff --git a/app/soapbox/features/soapbox_config/components/icon_picker_dropdown.js b/app/soapbox/features/soapbox_config/components/icon_picker_dropdown.js
new file mode 100644
index 000000000..963f55f26
--- /dev/null
+++ b/app/soapbox/features/soapbox_config/components/icon_picker_dropdown.js
@@ -0,0 +1,226 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { defineMessages, injectIntl } from 'react-intl';
+import Picker from 'emoji-mart/dist-es/components/picker/picker';
+import Overlay from 'react-overlays/lib/Overlay';
+import classNames from 'classnames';
+import detectPassiveEvents from 'detect-passive-events';
+import Icon from 'soapbox/components/icon';
+
+const messages = defineMessages({
+ emoji: { id: 'icon_button.label', defaultMessage: 'Select icon' },
+ emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search...' },
+ emoji_not_found: { id: 'icon_button.not_found', defaultMessage: 'No icons!! (╯°□°)╯︵ ┻━┻' },
+ custom: { id: 'icon_button.icons', defaultMessage: 'Icons' },
+ search_results: { id: 'emoji_button.search_results', defaultMessage: 'Search results' },
+});
+
+const backgroundImageFn = () => '';
+const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+
+const categoriesSort = ['custom'];
+
+@injectIntl
+class IconPickerMenu extends React.PureComponent {
+
+ static propTypes = {
+ custom_emojis: PropTypes.object,
+ loading: PropTypes.bool,
+ onClose: PropTypes.func.isRequired,
+ onPick: PropTypes.func.isRequired,
+ style: PropTypes.object,
+ placement: PropTypes.string,
+ arrowOffsetLeft: PropTypes.string,
+ arrowOffsetTop: PropTypes.string,
+ intl: PropTypes.object.isRequired,
+ };
+
+ static defaultProps = {
+ style: {},
+ loading: true,
+ };
+
+ state = {
+ modifierOpen: false,
+ placement: null,
+ };
+
+ handleDocumentClick = e => {
+ if (this.node && !this.node.contains(e.target)) {
+ this.props.onClose();
+ }
+ }
+
+ componentDidMount() {
+ document.addEventListener('click', this.handleDocumentClick, false);
+ document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+ }
+
+ componentWillUnmount() {
+ document.removeEventListener('click', this.handleDocumentClick, false);
+ document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);
+ }
+
+ setRef = c => {
+ this.node = c;
+ }
+
+ getI18n = () => {
+ const { intl } = this.props;
+
+ return {
+ search: intl.formatMessage(messages.emoji_search),
+ notfound: intl.formatMessage(messages.emoji_not_found),
+ categories: {
+ search: intl.formatMessage(messages.search_results),
+ custom: intl.formatMessage(messages.custom),
+ },
+ };
+ }
+
+ handleClick = emoji => {
+ emoji.native = emoji.colons;
+
+ this.props.onClose();
+ this.props.onPick(emoji);
+ }
+
+ buildIcons = (customEmojis, autoplay = false) => {
+ const emojis = [];
+
+ Object.values(customEmojis).forEach(category => {
+ category.forEach(function(icon) {
+ const name = icon.replace('fa fa-', '');
+ if (icon !== 'email' && icon !== 'memo') {
+ emojis.push({
+ id: name,
+ name,
+ short_names: [name],
+ emoticons: [],
+ keywords: [name],
+ imageUrl: '',
+ render: ,
+ });
+ }
+ });
+ });
+
+ return emojis;
+ };
+
+ render() {
+ const { loading, style, intl, custom_emojis } = this.props;
+
+ if (loading) {
+ return
;
+ }
+
+ let data = { compressed: true, categories: [], aliases: [], emojis: [] };
+ const title = intl.formatMessage(messages.emoji);
+ const { modifierOpen } = this.state;
+
+ return (
+
+ );
+ }
+
+}
+
+export default @injectIntl
+class IconPickerDropdown extends React.PureComponent {
+
+ static propTypes = {
+ frequentlyUsedEmojis: PropTypes.arrayOf(PropTypes.string),
+ intl: PropTypes.object.isRequired,
+ onPickEmoji: PropTypes.func.isRequired,
+ value: PropTypes.string,
+ };
+
+ state = {
+ active: false,
+ loading: false,
+ };
+
+ setRef = (c) => {
+ this.dropdown = c;
+ }
+
+ onShowDropdown = ({ target }) => {
+ this.setState({ active: true });
+
+ const { top } = target.getBoundingClientRect();
+ this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });
+ }
+
+ onHideDropdown = () => {
+ this.setState({ active: false });
+ }
+
+ onToggle = (e) => {
+ if (!this.state.loading && (!e.key || e.key === 'Enter')) {
+ if (this.state.active) {
+ this.onHideDropdown();
+ } else {
+ this.onShowDropdown(e);
+ }
+ }
+ }
+
+ handleKeyDown = e => {
+ if (e.key === 'Escape') {
+ this.onHideDropdown();
+ }
+ }
+
+ setTargetRef = c => {
+ this.target = c;
+ }
+
+ findTarget = () => {
+ return this.target;
+ }
+
+ render() {
+ const { intl, onPickEmoji, value } = this.props;
+ const title = intl.formatMessage(messages.emoji);
+ const { active, loading, placement } = this.state;
+ let forkAwesomeIcons = require('../forkawesome.json');
+
+ return (
+
+ );
+ }
+
+}
diff --git a/app/soapbox/features/soapbox_config/forkawesome.json b/app/soapbox/features/soapbox_config/forkawesome.json
new file mode 100644
index 000000000..44cc80f25
--- /dev/null
+++ b/app/soapbox/features/soapbox_config/forkawesome.json
@@ -0,0 +1,765 @@
+{
+ "Web Application Icons": [
+ "fa fa-glass",
+ "fa fa-music",
+ "fa fa-search",
+ "fa fa-envelope-o",
+ "fa fa-heart",
+ "fa fa-star",
+ "fa fa-star-o",
+ "fa fa-user",
+ "fa fa-film",
+ "fa fa-check",
+ "fa fa-times",
+ "fa fa-search-plus",
+ "fa fa-search-minus",
+ "fa fa-power-off",
+ "fa fa-signal",
+ "fa fa-cog",
+ "fa fa-trash-o",
+ "fa fa-home",
+ "fa fa-clock-o",
+ "fa fa-road",
+ "fa fa-download",
+ "fa fa-inbox",
+ "fa fa-refresh",
+ "fa fa-lock",
+ "fa fa-flag",
+ "fa fa-headphones",
+ "fa fa-volume-off",
+ "fa fa-volume-down",
+ "fa fa-volume-up",
+ "fa fa-qrcode",
+ "fa fa-barcode",
+ "fa fa-tag",
+ "fa fa-tags",
+ "fa fa-book",
+ "fa fa-bookmark",
+ "fa fa-print",
+ "fa fa-camera",
+ "fa fa-video-camera",
+ "fa fa-picture-o",
+ "fa fa-pencil",
+ "fa fa-map-marker",
+ "fa fa-adjust",
+ "fa fa-tint",
+ "fa fa-pencil-square-o",
+ "fa fa-share-square-o",
+ "fa fa-check-square-o",
+ "fa fa-arrows",
+ "fa fa-plus-circle",
+ "fa fa-minus-circle",
+ "fa fa-times-circle",
+ "fa fa-check-circle",
+ "fa fa-question-circle",
+ "fa fa-info-circle",
+ "fa fa-crosshairs",
+ "fa fa-times-circle-o",
+ "fa fa-check-circle-o",
+ "fa fa-ban",
+ "fa fa-share",
+ "fa fa-plus",
+ "fa fa-minus",
+ "fa fa-asterisk",
+ "fa fa-exclamation-circle",
+ "fa fa-gift",
+ "fa fa-leaf",
+ "fa fa-fire",
+ "fa fa-eye",
+ "fa fa-eye-slash",
+ "fa fa-exclamation-triangle",
+ "fa fa-plane",
+ "fa fa-calendar",
+ "fa fa-random",
+ "fa fa-comment",
+ "fa fa-magnet",
+ "fa fa-retweet",
+ "fa fa-shopping-cart",
+ "fa fa-folder",
+ "fa fa-folder-open",
+ "fa fa-arrows-v",
+ "fa fa-arrows-h",
+ "fa fa-bar-chart",
+ "fa fa-camera-retro",
+ "fa fa-key",
+ "fa fa-cogs",
+ "fa fa-comments",
+ "fa fa-thumbs-o-up",
+ "fa fa-thumbs-o-down",
+ "fa fa-star-half",
+ "fa fa-heart-o",
+ "fa fa-sign-out",
+ "fa fa-thumb-tack",
+ "fa fa-external-link",
+ "fa fa-sign-in",
+ "fa fa-trophy",
+ "fa fa-upload",
+ "fa fa-lemon-o",
+ "fa fa-phone",
+ "fa fa-square-o",
+ "fa fa-bookmark-o",
+ "fa fa-phone-square",
+ "fa fa-unlock",
+ "fa fa-credit-card",
+ "fa fa-rss",
+ "fa fa-hdd-o",
+ "fa fa-bullhorn",
+ "fa fa-bell-o",
+ "fa fa-certificate",
+ "fa fa-globe",
+ "fa fa-globe-e",
+ "fa fa-globe-w",
+ "fa fa-wrench",
+ "fa fa-tasks",
+ "fa fa-filter",
+ "fa fa-briefcase",
+ "fa fa-users",
+ "fa fa-cloud",
+ "fa fa-flask",
+ "fa fa-square",
+ "fa fa-bars",
+ "fa fa-magic",
+ "fa fa-truck",
+ "fa fa-money",
+ "fa fa-sort",
+ "fa fa-sort-desc",
+ "fa fa-sort-asc",
+ "fa fa-envelope",
+ "fa fa-gavel",
+ "fa fa-tachometer",
+ "fa fa-comment-o",
+ "fa fa-comments-o",
+ "fa fa-bolt",
+ "fa fa-sitemap",
+ "fa fa-umbrella",
+ "fa fa-lightbulb-o",
+ "fa fa-exchange",
+ "fa fa-cloud-download",
+ "fa fa-cloud-upload",
+ "fa fa-suitcase",
+ "fa fa-bell",
+ "fa fa-coffee",
+ "fa fa-cutlery",
+ "fa fa-building-o",
+ "fa fa-fighter-jet",
+ "fa fa-beer",
+ "fa fa-desktop",
+ "fa fa-laptop",
+ "fa fa-tablet",
+ "fa fa-mobile",
+ "fa fa-circle-o",
+ "fa fa-quote-left",
+ "fa fa-quote-right",
+ "fa fa-spinner",
+ "fa fa-circle",
+ "fa fa-reply",
+ "fa fa-folder-o",
+ "fa fa-folder-open-o",
+ "fa fa-smile-o",
+ "fa fa-frown-o",
+ "fa fa-meh-o",
+ "fa fa-gamepad",
+ "fa fa-keyboard-o",
+ "fa fa-flag-o",
+ "fa fa-flag-checkered",
+ "fa fa-terminal",
+ "fa fa-code",
+ "fa fa-reply-all",
+ "fa fa-star-half-o",
+ "fa fa-location-arrow",
+ "fa fa-crop",
+ "fa fa-code-fork",
+ "fa fa-question",
+ "fa fa-info",
+ "fa fa-exclamation",
+ "fa fa-puzzle-piece",
+ "fa fa-microphone",
+ "fa fa-microphone-slash",
+ "fa fa-shield",
+ "fa fa-calendar-o",
+ "fa fa-fire-extinguisher",
+ "fa fa-rocket",
+ "fa fa-anchor",
+ "fa fa-unlock-alt",
+ "fa fa-bullseye",
+ "fa fa-ellipsis-h",
+ "fa fa-ellipsis-v",
+ "fa fa-rss-square",
+ "fa fa-ticket",
+ "fa fa-minus-square",
+ "fa fa-minus-square-o",
+ "fa fa-level-up",
+ "fa fa-level-down",
+ "fa fa-check-square",
+ "fa fa-pencil-square",
+ "fa fa-external-link-square",
+ "fa fa-share-square",
+ "fa fa-compass",
+ "fa fa-caret-square-o-down",
+ "fa fa-caret-square-o-up",
+ "fa fa-caret-square-o-right",
+ "fa fa-sort-alpha-asc",
+ "fa fa-sort-alpha-desc",
+ "fa fa-sort-amount-asc",
+ "fa fa-sort-amount-desc",
+ "fa fa-sort-numeric-asc",
+ "fa fa-sort-numeric-desc",
+ "fa fa-thumbs-up",
+ "fa fa-thumbs-down",
+ "fa fa-female",
+ "fa fa-male",
+ "fa fa-sun-o",
+ "fa fa-moon-o",
+ "fa fa-archive",
+ "fa fa-bug",
+ "fa fa-caret-square-o-left",
+ "fa fa-dot-circle-o",
+ "fa fa-wheelchair",
+ "fa fa-plus-square-o",
+ "fa fa-space-shuttle",
+ "fa fa-envelope-square",
+ "fa fa-university",
+ "fa fa-graduation-cap",
+ "fa fa-language",
+ "fa fa-fax",
+ "fa fa-building",
+ "fa fa-child",
+ "fa fa-paw",
+ "fa fa-spoon",
+ "fa fa-cube",
+ "fa fa-cubes",
+ "fa fa-recycle",
+ "fa fa-car",
+ "fa fa-taxi",
+ "fa fa-tree",
+ "fa fa-database",
+ "fa fa-file-pdf-o",
+ "fa fa-file-word-o",
+ "fa fa-file-excel-o",
+ "fa fa-file-powerpoint-o",
+ "fa fa-file-image-o",
+ "fa fa-file-archive-o",
+ "fa fa-file-audio-o",
+ "fa fa-file-video-o",
+ "fa fa-file-code-o",
+ "fa fa-life-ring",
+ "fa fa-circle-o-notch",
+ "fa fa-paper-plane",
+ "fa fa-paper-plane-o",
+ "fa fa-history",
+ "fa fa-circle-thin",
+ "fa fa-sliders",
+ "fa fa-share-alt",
+ "fa fa-share-alt-square",
+ "fa fa-bomb",
+ "fa fa-futbol-o",
+ "fa fa-tty",
+ "fa fa-binoculars",
+ "fa fa-plug",
+ "fa fa-newspaper-o",
+ "fa fa-wifi",
+ "fa fa-calculator",
+ "fa fa-bell-slash",
+ "fa fa-bell-slash-o",
+ "fa fa-trash",
+ "fa fa-copyright",
+ "fa fa-at",
+ "fa fa-eyedropper",
+ "fa fa-paint-brush",
+ "fa fa-birthday-cake",
+ "fa fa-area-chart",
+ "fa fa-pie-chart",
+ "fa fa-line-chart",
+ "fa fa-toggle-off",
+ "fa fa-toggle-on",
+ "fa fa-bicycle",
+ "fa fa-bus",
+ "fa fa-cc",
+ "fa fa-cart-plus",
+ "fa fa-cart-arrow-down",
+ "fa fa-diamond",
+ "fa fa-ship",
+ "fa fa-user-secret",
+ "fa fa-motorcycle",
+ "fa fa-street-view",
+ "fa fa-heartbeat",
+ "fa fa-server",
+ "fa fa-user-plus",
+ "fa fa-user-times",
+ "fa fa-bed",
+ "fa fa-battery-full",
+ "fa fa-battery-three-quarters",
+ "fa fa-battery-half",
+ "fa fa-battery-quarter",
+ "fa fa-battery-empty",
+ "fa fa-mouse-pointer",
+ "fa fa-i-cursor",
+ "fa fa-object-group",
+ "fa fa-object-ungroup",
+ "fa fa-sticky-note",
+ "fa fa-sticky-note-o",
+ "fa fa-clone",
+ "fa fa-balance-scale",
+ "fa fa-hourglass-o",
+ "fa fa-hourglass-start",
+ "fa fa-hourglass-half",
+ "fa fa-hourglass-end",
+ "fa fa-hourglass",
+ "fa fa-hand-rock-o",
+ "fa fa-hand-paper-o",
+ "fa fa-hand-scissors-o",
+ "fa fa-hand-lizard-o",
+ "fa fa-hand-spock-o",
+ "fa fa-hand-pointer-o",
+ "fa fa-hand-peace-o",
+ "fa fa-trademark",
+ "fa fa-registered",
+ "fa fa-creative-commons",
+ "fa fa-television",
+ "fa fa-calendar-plus-o",
+ "fa fa-calendar-minus-o",
+ "fa fa-calendar-times-o",
+ "fa fa-calendar-check-o",
+ "fa fa-industry",
+ "fa fa-map-pin",
+ "fa fa-map-signs",
+ "fa fa-map-o",
+ "fa fa-map",
+ "fa fa-commenting",
+ "fa fa-commenting-o",
+ "fa fa-shopping-bag",
+ "fa fa-shopping-basket",
+ "fa fa-hashtag",
+ "fa fa-bluetooth",
+ "fa fa-bluetooth-b",
+ "fa fa-percent",
+ "fa fa-universal-access",
+ "fa fa-wheelchair-alt",
+ "fa fa-question-circle-o",
+ "fa fa-blind",
+ "fa fa-audio-description",
+ "fa fa-volume-control-phone",
+ "fa fa-braille",
+ "fa fa-assistive-listening-systems",
+ "fa fa-american-sign-language-interpreting",
+ "fa fa-deaf",
+ "fa fa-sign-language",
+ "fa fa-low-vision",
+ "fa fa-handshake-o",
+ "fa fa-envelope-open",
+ "fa fa-envelope-open-o",
+ "fa fa-address-book",
+ "fa fa-address-book-o",
+ "fa fa-address-card",
+ "fa fa-address-card-o",
+ "fa fa-user-circle",
+ "fa fa-user-circle-o",
+ "fa fa-user-o",
+ "fa fa-id-badge",
+ "fa fa-id-card",
+ "fa fa-id-card-o",
+ "fa fa-thermometer-full",
+ "fa fa-thermometer-three-quarters",
+ "fa fa-thermometer-half",
+ "fa fa-thermometer-quarter",
+ "fa fa-thermometer-empty",
+ "fa fa-shower",
+ "fa fa-bath",
+ "fa fa-podcast",
+ "fa fa-window-maximize",
+ "fa fa-window-minimize",
+ "fa fa-window-restore",
+ "fa fa-window-close",
+ "fa fa-window-close-o",
+ "fa fa-microchip",
+ "fa fa-snowflake-o",
+ "fa fa-mastodon",
+ "fa fa-mastodon-alt",
+ "fa fa-peertube",
+ "fa fa-diaspora",
+ "fa fa-friendica",
+ "fa fa-gnu-social",
+ "fa fa-liberapay-square",
+ "fa fa-liberapay",
+ "fa fa-scuttlebutt",
+ "fa fa-hubzilla",
+ "fa fa-social-home",
+ "fa fa-artstation",
+ "fa fa-discord",
+ "fa fa-discord-alt",
+ "fa fa-key-modern",
+ "fa fa-file-epub",
+ "fa fa-spell-check",
+ "fa fa-moon",
+ "fa fa-sun",
+ "fa fa-biometric"
+ ],
+ "Text Editor Icons": [
+ "fa fa-th-large",
+ "fa fa-th",
+ "fa fa-th-list",
+ "fa fa-file-o",
+ "fa fa-repeat",
+ "fa fa-list-alt",
+ "fa fa-font",
+ "fa fa-bold",
+ "fa fa-italic",
+ "fa fa-text-height",
+ "fa fa-text-width",
+ "fa fa-align-left",
+ "fa fa-align-center",
+ "fa fa-align-right",
+ "fa fa-align-justify",
+ "fa fa-list",
+ "fa fa-outdent",
+ "fa fa-indent",
+ "fa fa-link",
+ "fa fa-scissors",
+ "fa fa-files-o",
+ "fa fa-paperclip",
+ "fa fa-floppy-o",
+ "fa fa-list-ul",
+ "fa fa-list-ol",
+ "fa fa-strikethrough",
+ "fa fa-underline",
+ "fa fa-table",
+ "fa fa-columns",
+ "fa fa-undo",
+ "fa fa-clipboard",
+ "fa fa-file-text-o",
+ "fa fa-chain-broken",
+ "fa fa-superscript",
+ "fa fa-subscript",
+ "fa fa-eraser",
+ "fa fa-file",
+ "fa fa-file-text",
+ "fa fa-header",
+ "fa fa-paragraph"
+ ],
+ "Directional Icons": [
+ "fa fa-arrow-circle-o-down",
+ "fa fa-arrow-circle-o-up",
+ "fa fa-chevron-left",
+ "fa fa-chevron-right",
+ "fa fa-arrow-left",
+ "fa fa-arrow-right",
+ "fa fa-arrow-up",
+ "fa fa-arrow-down",
+ "fa fa-chevron-up",
+ "fa fa-chevron-down",
+ "fa fa-hand-o-right",
+ "fa fa-hand-o-left",
+ "fa fa-hand-o-up",
+ "fa fa-hand-o-down",
+ "fa fa-arrow-circle-left",
+ "fa fa-arrow-circle-right",
+ "fa fa-arrow-circle-up",
+ "fa fa-arrow-circle-down",
+ "fa fa-caret-down",
+ "fa fa-caret-up",
+ "fa fa-caret-left",
+ "fa fa-caret-right",
+ "fa fa-angle-double-left",
+ "fa fa-angle-double-right",
+ "fa fa-angle-double-up",
+ "fa fa-angle-double-down",
+ "fa fa-angle-left",
+ "fa fa-angle-right",
+ "fa fa-angle-up",
+ "fa fa-angle-down",
+ "fa fa-chevron-circle-left",
+ "fa fa-chevron-circle-right",
+ "fa fa-chevron-circle-up",
+ "fa fa-chevron-circle-down",
+ "fa fa-long-arrow-down",
+ "fa fa-long-arrow-up",
+ "fa fa-long-arrow-left",
+ "fa fa-long-arrow-right",
+ "fa fa-arrow-circle-o-right",
+ "fa fa-arrow-circle-o-left"
+ ],
+ "Video Player Icons": [
+ "fa fa-play-circle-o",
+ "fa fa-step-backward",
+ "fa fa-fast-backward",
+ "fa fa-backward",
+ "fa fa-play",
+ "fa fa-pause",
+ "fa fa-stop",
+ "fa fa-forward",
+ "fa fa-fast-forward",
+ "fa fa-step-forward",
+ "fa fa-eject",
+ "fa fa-expand",
+ "fa fa-compress",
+ "fa fa-arrows-alt",
+ "fa fa-play-circle",
+ "fa fa-pause-circle",
+ "fa fa-pause-circle-o",
+ "fa fa-stop-circle",
+ "fa fa-stop-circle-o"
+ ],
+ "Brand Icons": [
+ "fa fa-twitter-square",
+ "fa fa-facebook-square",
+ "fa fa-github-square",
+ "fa fa-twitter",
+ "fa fa-facebook",
+ "fa fa-github",
+ "fa fa-pinterest",
+ "fa fa-google-plus-square",
+ "fa fa-google-plus",
+ "fa fa-linkedin",
+ "fa fa-github-alt",
+ "fa fa-maxcdn",
+ "fa fa-html5",
+ "fa fa-css3",
+ "fa fa-youtube-square",
+ "fa fa-youtube",
+ "fa fa-xing",
+ "fa fa-xing-square",
+ "fa fa-youtube-play",
+ "fa fa-dropbox",
+ "fa fa-stack-overflow",
+ "fa fa-instagram",
+ "fa fa-flickr",
+ "fa fa-adn",
+ "fa fa-bitbucket",
+ "fa fa-bitbucket-square",
+ "fa fa-tumblr",
+ "fa fa-apple",
+ "fa fa-windows",
+ "fa fa-android",
+ "fa fa-linux",
+ "fa fa-dribbble",
+ "fa fa-skype",
+ "fa fa-foursquare",
+ "fa fa-trello",
+ "fa fa-gratipay",
+ "fa fa-vk",
+ "fa fa-weibo",
+ "fa fa-renren",
+ "fa fa-pagelines",
+ "fa fa-stack-exchange",
+ "fa fa-vimeo-square",
+ "fa fa-slack",
+ "fa fa-wordpress",
+ "fa fa-openid",
+ "fa fa-yahoo",
+ "fa fa-google",
+ "fa fa-reddit",
+ "fa fa-stumbleupon-circle",
+ "fa fa-stumbleupon",
+ "fa fa-delicious",
+ "fa fa-digg",
+ "fa fa-drupal",
+ "fa fa-joomla",
+ "fa fa-behance",
+ "fa fa-behance-square",
+ "fa fa-steam",
+ "fa fa-steam-square",
+ "fa fa-spotify",
+ "fa fa-deviantart",
+ "fa fa-soundcloud",
+ "fa fa-vine",
+ "fa fa-codepen",
+ "fa fa-jsfiddle",
+ "fa fa-rebel",
+ "fa fa-empire",
+ "fa fa-git-square",
+ "fa fa-git",
+ "fa fa-hacker-news",
+ "fa fa-tencent-weibo",
+ "fa fa-qq",
+ "fa fa-weixin",
+ "fa fa-slideshare",
+ "fa fa-twitch",
+ "fa fa-yelp",
+ "fa fa-paypal",
+ "fa fa-google-wallet",
+ "fa fa-cc-visa",
+ "fa fa-cc-mastercard",
+ "fa fa-cc-discover",
+ "fa fa-cc-amex",
+ "fa fa-cc-paypal",
+ "fa fa-cc-stripe",
+ "fa fa-lastfm",
+ "fa fa-lastfm-square",
+ "fa fa-ioxhost",
+ "fa fa-angellist",
+ "fa fa-meanpath",
+ "fa fa-buysellads",
+ "fa fa-connectdevelop",
+ "fa fa-dashcube",
+ "fa fa-forumbee",
+ "fa fa-leanpub",
+ "fa fa-sellsy",
+ "fa fa-shirtsinbulk",
+ "fa fa-simplybuilt",
+ "fa fa-skyatlas",
+ "fa fa-facebook-official",
+ "fa fa-whatsapp",
+ "fa fa-medium",
+ "fa fa-medium-square",
+ "fa fa-y-combinator",
+ "fa fa-optin-monster",
+ "fa fa-opencart",
+ "fa fa-expeditedssl",
+ "fa fa-cc-jcb",
+ "fa fa-cc-diners-club",
+ "fa fa-tripadvisor",
+ "fa fa-odnoklassniki",
+ "fa fa-odnoklassniki-square",
+ "fa fa-get-pocket",
+ "fa fa-wikipedia-w",
+ "fa fa-safari",
+ "fa fa-chrome",
+ "fa fa-firefox",
+ "fa fa-opera",
+ "fa fa-internet-explorer",
+ "fa fa-contao",
+ "fa fa-500px",
+ "fa fa-amazon",
+ "fa fa-houzz",
+ "fa fa-vimeo",
+ "fa fa-black-tie",
+ "fa fa-fonticons",
+ "fa fa-reddit-alien",
+ "fa fa-edge",
+ "fa fa-codiepie",
+ "fa fa-modx",
+ "fa fa-fort-awesome",
+ "fa fa-usb",
+ "fa fa-product-hunt",
+ "fa fa-mixcloud",
+ "fa fa-scribd",
+ "fa fa-gitlab",
+ "fa fa-wpbeginner",
+ "fa fa-wpforms",
+ "fa fa-envira",
+ "fa fa-glide",
+ "fa fa-glide-g",
+ "fa fa-viadeo",
+ "fa fa-viadeo-square",
+ "fa fa-snapchat",
+ "fa fa-snapchat-ghost",
+ "fa fa-snapchat-square",
+ "fa fa-first-order",
+ "fa fa-yoast",
+ "fa fa-themeisle",
+ "fa fa-google-plus-official",
+ "fa fa-font-awesome",
+ "fa fa-linode",
+ "fa fa-quora",
+ "fa fa-free-code-camp",
+ "fa fa-telegram",
+ "fa fa-bandcamp",
+ "fa fa-grav",
+ "fa fa-etsy",
+ "fa fa-imdb",
+ "fa fa-ravelry",
+ "fa fa-eercast",
+ "fa fa-superpowers",
+ "fa fa-wpexplorer",
+ "fa fa-meetup",
+ "fa fa-fork-awesome",
+ "fa fa-snowdrift",
+ "fa fa-activitypub",
+ "fa fa-keybase",
+ "fa fa-shaarli",
+ "fa fa-shaarli-o",
+ "fa fa-xmpp",
+ "fa fa-archive-org",
+ "fa fa-freedombox",
+ "fa fa-facebook-messenger",
+ "fa fa-debian",
+ "fa fa-mastodon-square",
+ "fa fa-react",
+ "fa fa-dogmazic",
+ "fa fa-zotero",
+ "fa fa-nodejs",
+ "fa fa-nextcloud",
+ "fa fa-nextcloud-square",
+ "fa fa-hackaday",
+ "fa fa-laravel",
+ "fa fa-gnupg",
+ "fa fa-php",
+ "fa fa-ffmpeg",
+ "fa fa-joplin",
+ "fa fa-syncthing",
+ "fa fa-inkscape",
+ "fa fa-matrix-org",
+ "fa fa-pixelfed",
+ "fa fa-bootstrap",
+ "fa fa-dev-to",
+ "fa fa-hashnode",
+ "fa fa-jirafeau",
+ "fa fa-emby",
+ "fa fa-wikidata",
+ "fa fa-gimp",
+ "fa fa-c",
+ "fa fa-digitalocean",
+ "fa fa-att",
+ "fa fa-gitea",
+ "fa fa-python",
+ "fa fa-archlinux",
+ "fa fa-pleroma",
+ "fa fa-unsplash",
+ "fa fa-hackster",
+ "fa fa-f-droid",
+ "fa fa-signalapp"
+ ],
+ "Medical Icons": [
+ "fa fa-user-md",
+ "fa fa-stethoscope",
+ "fa fa-hospital-o",
+ "fa fa-ambulance",
+ "fa fa-medkit",
+ "fa fa-h-square",
+ "fa fa-plus-square"
+ ],
+ "Currency Icons": [
+ "fa fa-eur",
+ "fa fa-gbp",
+ "fa fa-usd",
+ "fa fa-inr",
+ "fa fa-jpy",
+ "fa fa-rub",
+ "fa fa-krw",
+ "fa fa-try",
+ "fa fa-ils",
+ "fa fa-viacoin",
+ "fa fa-gg",
+ "fa fa-gg-circle"
+ ],
+ "Payment Icons": [
+ "fa fa-btc",
+ "fa fa-credit-card-alt",
+ "fa fa-patreon",
+ "fa fa-ethereum",
+ "fa fa-tipeee"
+ ],
+ "Gender Icons": [
+ "fa fa-venus",
+ "fa fa-mars",
+ "fa fa-mercury",
+ "fa fa-transgender",
+ "fa fa-transgender-alt",
+ "fa fa-venus-double",
+ "fa fa-mars-double",
+ "fa fa-venus-mars",
+ "fa fa-mars-stroke",
+ "fa fa-mars-stroke-v",
+ "fa fa-mars-stroke-h",
+ "fa fa-neuter",
+ "fa fa-genderless"
+ ],
+ "Transportation Icons": [
+ "fa fa-train",
+ "fa fa-subway"
+ ],
+ "Soapbox Icons": [
+ "fa fa-fediverse",
+ "fa fa-spinster"
+ ]
+}
diff --git a/app/soapbox/features/soapbox_config/index.js b/app/soapbox/features/soapbox_config/index.js
index 3c53a0652..37b3dd1fb 100644
--- a/app/soapbox/features/soapbox_config/index.js
+++ b/app/soapbox/features/soapbox_config/index.js
@@ -26,6 +26,7 @@ import Accordion from '../ui/components/accordion';
import SitePreview from './components/site_preview';
import ThemeToggle from 'soapbox/features/ui/components/theme_toggle';
import { defaultSettings } from 'soapbox/actions/settings';
+import IconPickerDropdown from './components/icon_picker_dropdown';
const messages = defineMessages({
heading: { id: 'column.soapbox_config', defaultMessage: 'Soapbox config' },
@@ -135,24 +136,24 @@ class SoapboxConfig extends ImmutablePureComponent {
};
};
- handleItemChange = (path, key, field, template) => {
+ handleItemChange = (path, key, field, template, getValue = e => e.target.value) => {
return this.handleChange(
path, (e) =>
template
.merge(field)
- .set(key, e.target.value),
+ .set(key, getValue(e)),
);
};
- handlePromoItemChange = (index, key, field) => {
+ handlePromoItemChange = (index, key, field, getValue) => {
return this.handleItemChange(
- ['promoPanel', 'items', index], key, field, templates.promoPanelItem,
+ ['promoPanel', 'items', index], key, field, templates.promoPanelItem, getValue,
);
};
- handleHomeFooterItemChange = (index, key, field) => {
+ handleHomeFooterItemChange = (index, key, field, getValue) => {
return this.handleItemChange(
- ['navlinks', 'homeFooter', index], key, field, templates.footerItem,
+ ['navlinks', 'homeFooter', index], key, field, templates.footerItem, getValue,
);
};
@@ -234,7 +235,7 @@ class SoapboxConfig extends ImmutablePureComponent {
/>
-
+
@@ -245,11 +246,10 @@ class SoapboxConfig extends ImmutablePureComponent {
{
soapbox.getIn(['promoPanel', 'items']).map((field, i) => (
-
val.id)}
/>
+
+ {label && (
)}
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/styles/emoji_picker.scss b/app/styles/emoji_picker.scss
index 9ac429152..df3b3574e 100644
--- a/app/styles/emoji_picker.scss
+++ b/app/styles/emoji_picker.scss
@@ -173,6 +173,13 @@
display: inline-block;
font-size: 0;
+ .fa {
+ font-size: 18px;
+ width: 22px;
+ height: 22px;
+ text-align: center;
+ }
+
span {
width: 22px;
height: 22px;
diff --git a/app/styles/fonts.scss b/app/styles/fonts.scss
index 500eafa28..542e5e41e 100644
--- a/app/styles/fonts.scss
+++ b/app/styles/fonts.scss
@@ -163,12 +163,12 @@
font-style: normal;
}
-.fa-users::before {
- font-family: 'ForkAwesome';
- content: '\f0c0';
-}
-
.fa-fediverse::before {
- font-family: 'soapbox' !important;
+ font-family: 'soapbox';
content: "\e901";
}
+
+.fa-spinster::before {
+ font-family: 'soapbox';
+ content: "\e900";
+}
diff --git a/app/styles/forms.scss b/app/styles/forms.scss
index 3fcaddcd9..9850138e5 100644
--- a/app/styles/forms.scss
+++ b/app/styles/forms.scss
@@ -179,6 +179,10 @@ code {
}
}
+ .input.font_icon_picker {
+ width: 52px;
+ }
+
.input.with_block_label {
max-width: none;
@@ -302,7 +306,8 @@ code {
input[type=number],
input[type=email],
input[type=password],
- textarea {
+ textarea,
+ .rfipbtn {
box-sizing: border-box;
font-size: 16px;
color: var(--primary-text-color);
@@ -335,6 +340,11 @@ code {
}
}
+ .rfip {
+ width: 100%;
+ margin: 0;
+ }
+
input[type=text][disabled],
input[type=number][disabled],
input[type=email][disabled],
@@ -501,6 +511,22 @@ code {
}
}
+ &__font_icon_picker {
+ font-size: 14px;
+
+ .font-icon-button {
+ padding: 9px;
+ border: 1px solid var(--highlight-text-color);
+ border-radius: 4px;
+ cursor: pointer;
+
+ .fa {
+ font-size: 18px;
+ color: var(--primary-text-color);
+ }
+ }
+ }
+
&__wrapper {
position: relative;
}
@@ -701,7 +727,7 @@ code {
}
}
-.input .row .fa-times-circle {
+.input .row > .fa-times-circle {
position: absolute;
right: 7px;
cursor: pointer;
diff --git a/package.json b/package.json
index 0bad95f87..f53c7b6de 100644
--- a/package.json
+++ b/package.json
@@ -62,7 +62,7 @@
"cssnano": "^4.1.10",
"detect-passive-events": "^2.0.0",
"dotenv": "^8.0.0",
- "emoji-mart": "Gargron/emoji-mart#build",
+ "emoji-mart": "https://gitlab.com/seanking2919/emoji-mart#build",
"es6-symbol": "^3.1.1",
"escape-html": "^1.0.3",
"exif-js": "^2.3.0",
diff --git a/yarn.lock b/yarn.lock
index 3dcd129df..3d016fa65 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4480,9 +4480,9 @@ elliptic@^6.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.0"
-emoji-mart@Gargron/emoji-mart#build:
- version "2.6.2"
- resolved "https://codeload.github.com/Gargron/emoji-mart/tar.gz/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9"
+"emoji-mart@https://gitlab.com/seanking2919/emoji-mart#build":
+ version "2.6.3"
+ resolved "https://gitlab.com/seanking2919/emoji-mart#4bdefa3d3ee7eb58716adc8727f688facc557291"
emoji-regex@^7.0.1:
version "7.0.3"