From 005e1ecb9be5dadcf5e54db56c0216940c15ceea Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Wed, 7 Nov 2018 13:05:43 -0500 Subject: [PATCH] FEATURE: Update Font Awesome to v5.4.1 and SVGs (#6557) * First take on subsetting svg icons * FontAwesome 5 svg subset WIP * Include icons from plugins/badges into svg sprite subset * add svg icon support to themes * Add spec for SvgSprite * Misc. SVG icon fixes * Use FA5 svgs in local-dates plugin * CSS adjustments, fix SVG icons in group flair * Use SVG icons in poll plugin * Add SVG icons to /wizard --- .../lib/attribute-hook.js.es6 | 42 + .../discourse-common/lib/icon-library.js.es6 | 298 +- .../components/categories-boxes-topic.js.es6 | 12 +- .../components/group-flair-inputs.js.es6 | 6 + .../discourse/components/topic-status.js.es6 | 6 +- .../controllers/full-page-search.js.es6 | 2 +- .../discourse/helpers/icon-or-image.js.es6 | 7 +- .../svg-sprite-fontawesome.js.es6 | 11 + .../javascripts/discourse/lib/lightbox.js.es6 | 2 + .../lib/render-topic-featured-link.js.es6 | 8 +- .../discourse/lib/svg-sprite-loader.js.es6 | 18 + .../discourse/models/login-method.js.es6 | 5 + .../discourse/raw-views/topic-status.js.es6 | 5 +- .../components/categories-boxes-topic.hbs | 2 + .../templates/components/color-picker.hbs | 6 +- .../components/group-flair-inputs.hbs | 2 +- .../templates/components/login-buttons.hbs | 11 +- .../discourse/templates/topic-status.raw.hbs | 2 +- .../discourse/widgets/avatar-flair.js.es6 | 20 +- .../widgets/post-small-action.js.es6 | 12 +- .../discourse/widgets/time-gap.js.es6 | 3 +- .../discourse/widgets/topic-admin-menu.js.es6 | 2 +- .../discourse/widgets/topic-status.js.es6 | 4 +- .../preload-application-data.js.no-module.es6 | 5 + .../components/mini-tag-chooser.js.es6 | 5 +- .../components/pinned-options.js.es6 | 6 +- .../category-drop/category-drop-header.hbs | 2 +- .../components/combo-box/combo-box-header.hbs | 2 +- .../future-date-input-selector-header.hbs | 2 +- .../multi-select/selected-category.hbs | 1 + .../components/multi-select/selected-name.hbs | 1 + .../components/tag-drop/tag-drop-header.hbs | 2 +- app/assets/stylesheets/common.scss | 1 - .../common/admin/admin_report.scss | 4 +- .../common/admin/admin_report_counters.scss | 6 +- .../common/admin/dashboard_previous.scss | 16 +- .../stylesheets/common/admin/staff_logs.scss | 2 +- .../stylesheets/common/base/_topic-list.scss | 4 +- .../common/base/category-list.scss | 22 +- .../stylesheets/common/base/colorpicker.scss | 20 +- .../stylesheets/common/base/compose.scss | 4 +- app/assets/stylesheets/common/base/emoji.scss | 10 +- app/assets/stylesheets/common/base/group.scss | 6 +- .../stylesheets/common/base/groups.scss | 4 +- .../stylesheets/common/base/lightbox.scss | 18 +- .../common/base/magnific-popup.scss | 4 +- .../stylesheets/common/base/menu-panel.scss | 9 +- .../stylesheets/common/base/onebox.scss | 9 +- .../stylesheets/common/base/tagging.scss | 12 +- .../common/base/topic-admin-menu.scss | 3 - .../stylesheets/common/base/topic-post.scss | 9 +- app/assets/stylesheets/common/base/topic.scss | 16 +- app/assets/stylesheets/common/base/user.scss | 2 +- .../common/components/buttons.scss | 41 +- .../stylesheets/common/components/svg.scss | 12 + .../common/components/user-stream-item.scss | 2 +- .../stylesheets/common/foundation/mixins.scss | 57 + .../stylesheets/common/printer-friendly.scss | 3 - .../common/select-kit/mini-tag-chooser.scss | 11 +- .../common/select-kit/multi-select.scss | 32 +- .../stylesheets/common/topic-entrance.scss | 2 +- .../stylesheets/common/topic-timeline.scss | 9 +- app/assets/stylesheets/desktop/discourse.scss | 2 +- .../stylesheets/desktop/topic-list.scss | 6 +- .../stylesheets/desktop/topic-post.scss | 42 +- app/assets/stylesheets/desktop/topic.scss | 2 +- app/assets/stylesheets/desktop/user-card.scss | 6 +- app/assets/stylesheets/mobile/discourse.scss | 2 +- app/assets/stylesheets/mobile/header.scss | 2 +- app/assets/stylesheets/mobile/topic-list.scss | 6 +- app/assets/stylesheets/mobile/topic-post.scss | 8 +- app/assets/stylesheets/mobile/topic.scss | 2 +- .../vendor/font_awesome/_animated.scss | 34 - .../vendor/font_awesome/_bordered-pulled.scss | 25 - .../vendor/font_awesome/_core.scss | 12 - .../vendor/font_awesome/_fixed-width.scss | 6 - .../vendor/font_awesome/_icons.scss | 789 ---- .../vendor/font_awesome/_larger.scss | 13 - .../vendor/font_awesome/_list.scss | 19 - .../vendor/font_awesome/_mixins.scss | 60 - .../vendor/font_awesome/_path.scss | 15 - .../vendor/font_awesome/_rotated-flipped.scss | 20 - .../vendor/font_awesome/_screen-reader.scss | 5 - .../vendor/font_awesome/_stacked.scss | 20 - .../vendor/font_awesome/_variables.scss | 800 ---- .../vendor/font_awesome/font-awesome.scss | 18 - app/assets/stylesheets/wizard.scss | 2 +- app/controllers/svg_sprite_controller.rb | 25 + app/helpers/application_helper.rb | 5 + app/models/group.rb | 2 +- app/views/common/_special_font_face.html.erb | 21 - app/views/layouts/application.html.erb | 1 - .../layouts/finish_installation.html.erb | 1 - app/views/layouts/no_ember.html.erb | 1 - app/views/wizard/index.html.erb | 8 +- config/application.rb | 3 +- config/initializers/006-mini_profiler.rb | 1 + config/locales/server.en.yml | 2 +- config/routes.rb | 3 + config/site_settings.yml | 6 + lib/discourse_plugin_registry.rb | 9 + lib/plugin/instance.rb | 4 + lib/svg_sprite/svg_sprite.rb | 222 ++ lib/tasks/svg_icons.rake | 38 + package.json | 3 +- .../javascripts/discourse-local-dates.js | 2 +- .../common/discourse-local-dates.scss | 2 +- .../templates/modal/poll-ui-builder.hbs | 2 +- .../initializers/add-poll-ui-builder.js.es6 | 2 +- .../javascripts/widgets/discourse-poll.js.es6 | 4 +- .../poll/assets/stylesheets/desktop/poll.scss | 12 +- plugins/poll/plugin.rb | 2 + .../widgets/discourse-poll-option-test.js.es6 | 8 +- spec/components/svg_sprite/svg_sprite_spec.rb | 69 + spec/models/group_spec.rb | 18 + .../acceptance/group-index-test.js.es6 | 2 +- .../components/themes-list-item-test.js.es6 | 12 +- .../javascripts/components/d-icon-test.js.es6 | 7 +- .../widgets/avatar-flair-test.js.es6 | 36 + test/javascripts/widgets/widget-test.js.es6 | 2 +- .../assets/svg-icons/fontawesome/brands.svg | 1559 ++++++++ .../assets/svg-icons/fontawesome/regular.svg | 615 +++ vendor/assets/svg-icons/fontawesome/solid.svg | 3411 +++++++++++++++++ yarn.lock | 5 + 124 files changed, 6692 insertions(+), 2211 deletions(-) create mode 100644 app/assets/javascripts/discourse-common/lib/attribute-hook.js.es6 create mode 100644 app/assets/javascripts/discourse/initializers/svg-sprite-fontawesome.js.es6 create mode 100644 app/assets/javascripts/discourse/lib/svg-sprite-loader.js.es6 create mode 100644 app/assets/stylesheets/common/components/svg.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_animated.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_bordered-pulled.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_core.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_fixed-width.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_icons.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_larger.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_list.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_mixins.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_path.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_rotated-flipped.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_screen-reader.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_stacked.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/_variables.scss delete mode 100644 app/assets/stylesheets/vendor/font_awesome/font-awesome.scss create mode 100644 app/controllers/svg_sprite_controller.rb delete mode 100644 app/views/common/_special_font_face.html.erb create mode 100644 lib/svg_sprite/svg_sprite.rb create mode 100644 lib/tasks/svg_icons.rake create mode 100644 spec/components/svg_sprite/svg_sprite_spec.rb create mode 100644 test/javascripts/widgets/avatar-flair-test.js.es6 create mode 100644 vendor/assets/svg-icons/fontawesome/brands.svg create mode 100644 vendor/assets/svg-icons/fontawesome/regular.svg create mode 100644 vendor/assets/svg-icons/fontawesome/solid.svg diff --git a/app/assets/javascripts/discourse-common/lib/attribute-hook.js.es6 b/app/assets/javascripts/discourse-common/lib/attribute-hook.js.es6 new file mode 100644 index 00000000000..33aecc6646a --- /dev/null +++ b/app/assets/javascripts/discourse-common/lib/attribute-hook.js.es6 @@ -0,0 +1,42 @@ +// FROM: https://github.com/Matt-Esch/virtual-dom +// License: MIT + +function AttributeHook(namespace, value) { + if (!(this instanceof AttributeHook)) { + return new AttributeHook(namespace, value); + } + + this.namespace = namespace; + this.value = value; +} + +AttributeHook.prototype.hook = function(node, prop, prev) { + if ( + prev && + prev.type === "AttributeHook" && + prev.value === this.value && + prev.namespace === this.namespace + ) { + return; + } + + node.setAttributeNS(this.namespace, prop, this.value); +}; + +AttributeHook.prototype.unhook = function(node, prop, next) { + if ( + next && + next.type === "AttributeHook" && + next.namespace === this.namespace + ) { + return; + } + + var colonPosition = prop.indexOf(":"); + var localName = colonPosition > -1 ? prop.substr(colonPosition + 1) : prop; + node.removeAttributeNS(this.namespace, localName); +}; + +AttributeHook.prototype.type = "AttributeHook"; + +export default AttributeHook; diff --git a/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 b/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 index 2ad408cac33..011709a31ec 100644 --- a/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 +++ b/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 @@ -1,37 +1,200 @@ import { h } from "virtual-dom"; +import attributeHook from "discourse-common/lib/attribute-hook"; +import deprecated from "discourse-common/lib/deprecated"; + +const SVG_NAMESPACE = "http://www.w3.org/2000/svg"; let _renderers = []; const REPLACEMENTS = { "d-tracking": "circle", "d-muted": "times-circle", - "d-regular": "circle-o", + "d-regular": "far-circle", "d-watching": "exclamation-circle", - "d-watching-first": "dot-circle-o", + "d-watching-first": "far-dot-circle", "d-drop-expanded": "caret-down", "d-drop-collapsed": "caret-right", - "d-unliked": "heart-o", + "d-unliked": "far-heart", "d-liked": "heart", "notification.mentioned": "at", "notification.group_mentioned": "at", "notification.quoted": "quote-right", "notification.replied": "reply", "notification.posted": "reply", - "notification.edited": "pencil", + "notification.edited": "pencil-alt", "notification.liked": "heart", "notification.liked_2": "heart", "notification.liked_many": "heart", - "notification.private_message": "envelope-o", - "notification.invited_to_private_message": "envelope-o", - "notification.invited_to_topic": "hand-o-right", + "notification.private_message": "far-envelope", + "notification.invited_to_private_message": "far-envelope", + "notification.invited_to_topic": "far-hand-point-right", "notification.invitee_accepted": "user", "notification.moved_post": "sign-out", "notification.linked": "link", "notification.granted_badge": "certificate", "notification.topic_reminder": "hand-o-right", - "notification.watching_first_post": "dot-circle-o", + "notification.watching_first_post": "far-dot-circle", "notification.group_message_summary": "group" }; +const fa4Replacements = { + "area-chart": "chart-area", + "bar-chart": "far-chart-bar", + "bar-chart-o": "far-chart-bar", + "chain-broken": "unlink", + "circle-thin": "far-circle", + "code-fork": "code-branch", + "commenting-o": "far-comment-dots", + "credit-card": "far-credit-card", + "drivers-license": "id-card", + "drivers-license-o": "far-id-card", + "external-link": "external-link-alt", + "external-link-square": "external-link-square-alt", + "eye-slash": "far-eye-slash", + "facebook-square": "fab-facebook-square", + "file-sound-o": "far-file-audio", + "file-text": "file-alt", + "file-text-o": "far-file-alt", + "files-o": "far-copy", + "floppy-o": "far-save", + "github-alt": "fab-github-alt", + "github-square": "fab-github-square", + "hacker-news": "fab-hacker-news", + "hand-grab-o": "far-hand-rock", + "id-badge": "far-id-badge", + "internet-explorer": "fab-internet-explorer", + "line-chart": "chart-line", + "linkedin-square": "fab-linkedin", + "list-alt": "far-list-alt", + "mail-forward": "share", + "mail-reply": "reply", + "mail-reply-all": "reply-all", + "map-marker": "map-marker-alt", + "mobile-phone": "mobile-alt", + "object-group": "far-object-group", + "object-ungroup": "far-object-ungroup", + "pencil-square": "pen-square", + "pencil-square-o": "far-edit", + "picture-o": "far-image", + "pie-chart": "chart-pie", + "rotate-left": "undo", + "rotate-right": "redo", + "send-o": "far-paper-plane", + "sign-in": "sign-in-alt", + "sign-out": "sign-out-alt", + "soccer-ball-o": "far-futbol", + "sort-alpha-asc": "sort-alpha-down", + "sort-alpha-desc": "sort-alpha-up", + "sort-amount-asc": "sort-amount-down", + "sort-amount-desc": "sort-amount-up", + "sort-asc": "sort-up", + "sort-desc": "sort-down", + "sort-numeric-asc": "sort-numeric-down", + "sort-numeric-desc": "sort-numeric-up", + "star-half-empty": "far-star-half", + "star-half-full": "far-star-half", + "thumb-tack": "thumbtack", + "thumbs-o-down": "far-thumbs-down", + "thumbs-o-up": "far-thumbs-up", + "times-rectangle": "window-close", + "times-rectangle-o": "far-window-close", + "toggle-down": "far-caret-square-down", + "toggle-left": "far-caret-square-left", + "toggle-right": "far-caret-square-right", + "toggle-up": "far-caret-square-up", + "trash-o": "far-trash-alt", + "twitter-square": "fab-twitter-square", + "vcard-o": "far-address-card", + "video-camera": "video", + "vimeo-square": "fab-vimeo-square", + "wheelchair-alt": "fab-accessible-icon", + "window-maximize": "far-window-maximize", + "window-restore": "far-window-restore", + "youtube-play": "fab-youtube", + "youtube-square": "fab-youtube-square", + apple: "fab-apple", + bank: "university", + cab: "taxi", + calendar: "calendar-alt", + chain: "link", + clipboard: "far-clipboard", + clone: "far-clone", + close: "times", + cny: "yen-sign", + commenting: "far-comment-dots", + compass: "far-compass", + copyright: "far-copyright", + cutlery: "utensils", + dashboard: "tachometer-alt", + deafness: "deaf", + dedent: "outdent", + diamond: "far-gem", + dollar: "dollar-sign", + exchange: "exchange-alt", + eye: "far-eye", + eyedropper: "eye-dropper", + facebook: "fab-facebook-f", + feed: "rss", + flash: "bolt", + gbp: "pound-sign", + gear: "cog", + gears: "cogs", + github: "fab-github", + glass: "glass-martini", + glass: "glass-martini", + google: "fab-google", + group: "users", + header: "heading", + hotel: "bed", + ils: "shekel-sign", + image: "far-image", + inr: "rupee-sign", + instagram: "fab-instagram", + institution: "university", + intersex: "transgender", + jpy: "yen-sign", + legal: "gavel", + linkedin: "fab-linkedin-in", + linode: "fab-linode", + linux: "fab-linux", + meetup: "fab-meetup", + mobile: "mobile-alt", + navicon: "bars", + paste: "far-clipboard", + pencil: "pencil-alt", + photo: "far-image", + refresh: "sync", + registered: "far-registered", + remove: "times", + remove: "times", + reorder: "bars", + repeat: "redo", + rmb: "yen-sign", + rouble: "ruble-sign", + ruble: "ruble-sign", + rupee: "rupee-sign", + s15: "bath", + scissors: "cut", + send: "paper-plane", + shekel: "shekel-sign", + shield: "shield-alt", + signing: "sign-language", + support: "far-life-ring", + tablet: "tablet-alt", + tachometer: "tachometer-alt", + television: "tv", + ticket: "ticket-alt", + trash: "trash-alt", + twitter: "fab-twitter", + unsorted: "sort", + vcard: "address-card", + vimeo: "fab-vimeo-v", + warning: "exclamation-triangle", + whatsapp: "fab-whatsapp", + windows: "fab-windows", + yahoo: "fab-yahoo", + youtube: "fab-youtube" +}; + export function replaceIcon(source, destination) { REPLACEMENTS[source] = destination; } @@ -59,6 +222,13 @@ export function iconNode(id, params) { return renderIcon("node", id, params); } +export function convertIconClass(icon) { + return icon + .replace("far fa-", "far-") + .replace("fab fa-", "fab-") + .replace("fa-", ""); +} + // TODO: Improve how helpers are registered for vdom compliation if (typeof Discourse !== "undefined") { Discourse.__widget_helpers.iconNode = iconNode; @@ -68,58 +238,114 @@ export function registerIconRenderer(renderer) { _renderers.unshift(renderer); } -// Support for font awesome icons -function faClasses(icon, params) { - let classNames = `fa fa-${icon.replacementId || icon.id} d-icon d-icon-${ - icon.id - }`; +function iconClasses(icon, params) { + // "notification." is invalid syntax for classes, use replacement instead + const dClass = + icon.replacementId && icon.id.indexOf("notification.") > -1 + ? icon.replacementId + : icon.id; - if (params) { - if (params.modifier) { - classNames += " fa-" + params.modifier; - } - if (params["class"]) { - classNames += " " + params["class"]; - } + let classNames = `fa d-icon d-icon-${dClass} svg-icon`; + + if (params && params["class"]) { + classNames += " " + params["class"]; } + return classNames; } +function warnIfMissing(id) { + if ( + typeof Discourse !== "undefined" && + Discourse.Environment === "development" && + Discourse.SvgIconList && + Discourse.SvgIconList.indexOf(id) === -1 + ) { + console.warn(`The icon "${id}" is missing from the SVG subset.`); + } +} + +function warnIfDeprecated(oldId, newId) { + if ( + typeof Discourse !== "undefined" && + Discourse.Environment === "development" && + !Ember.testing + ) { + deprecated(`Icon "${oldId}" is now "${newId}".`); + } +} + +function handleIconId(icon) { + let id = icon.replacementId || icon.id || ""; + + if (fa4Replacements.hasOwnProperty(id)) { + warnIfDeprecated(id, fa4Replacements[id]); + id = fa4Replacements[id]; + } else if (id.substr(id.length - 2) === "-o") { + let newId = "far-" + id.replace("-o", ""); + warnIfDeprecated(id, newId); + id = newId; + } + + // TODO: clean up "thumbtack unpinned" at source instead of here + id = id.replace(" unpinned", ""); + + warnIfMissing(id); + return id; +} + // default resolver is font awesome registerIconRenderer({ name: "font-awesome", string(icon, params) { - let tagName = params.tagName || "i"; - let html = `<${tagName} class='${faClasses(icon, params)}'`; - if (params.title) { - html += ` title='${I18n.t(params.title).replace(/'/g, "'")}'`; - } + const id = handleIconId(icon); + let html = ``; + html += ` xmlns="${SVG_NAMESPACE}">`; if (params.label) { html += `${params.label}`; } + if (params.title) { + html = `${html}`; + } return html; }, node(icon, params) { - let tagName = params.tagName || "i"; + const id = handleIconId(icon); + const classes = iconClasses(icon, params) + " svg-node"; - const properties = { - className: faClasses(icon, params), - attributes: { "aria-hidden": true } - }; + const svg = h( + "svg", + { + attributes: { class: classes, "aria-hidden": true }, + namespace: SVG_NAMESPACE + }, + [ + h("use", { + "xlink:href": attributeHook("http://www.w3.org/1999/xlink", `#${id}`), + namespace: SVG_NAMESPACE + }) + ] + ); if (params.title) { - properties.attributes.title = params.title; - } - if (params.label) { - return h(tagName, properties, h("span.sr-only", I18n.t(params.label))); + return h( + "span", + { + title: params.title, + attributes: { class: "svg-icon-title" } + }, + [svg] + ); } else { - return h(tagName, properties); + return svg; } } }); diff --git a/app/assets/javascripts/discourse/components/categories-boxes-topic.js.es6 b/app/assets/javascripts/discourse/components/categories-boxes-topic.js.es6 index f39c5c6c899..c061cb55e95 100644 --- a/app/assets/javascripts/discourse/components/categories-boxes-topic.js.es6 +++ b/app/assets/javascripts/discourse/components/categories-boxes-topic.js.es6 @@ -2,19 +2,15 @@ import computed from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ tagName: "li", - classNameBindings: ["topicStatusIcon"], @computed("topic.pinned", "topic.closed", "topic.archived") topicStatusIcon(pinned, closed, archived) { if (pinned) { - return "topic-pinned"; + return "thumbtack"; } - if (closed) { - return "topic-closed"; + if (closed || archived) { + return "lock"; } - if (archived) { - return "topic-archived"; - } - return "topic-open"; + return "far-file-alt"; } }); diff --git a/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 b/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 index 00036734dee..322dffcf213 100644 --- a/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 +++ b/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 @@ -1,5 +1,6 @@ import computed from "ember-addons/ember-computed-decorators"; import { escapeExpression } from "discourse/lib/utilities"; +import { convertIconClass } from "discourse-common/lib/icon-library"; export default Ember.Component.extend({ classNames: ["group-flair-inputs"], @@ -14,6 +15,11 @@ export default Ember.Component.extend({ return flairURL && flairURL.substr(0, 3) === "fa-"; }, + @computed("model.flair_url", "flairPreviewIcon") + flairPreviewIconUrl(flairURL, flairPreviewIcon) { + return flairPreviewIcon ? convertIconClass(flairURL) : ""; + }, + @computed("model.flair_url", "flairPreviewIcon") flairPreviewImage(flairURL, flairPreviewIcon) { return flairURL && !flairPreviewIcon; diff --git a/app/assets/javascripts/discourse/components/topic-status.js.es6 b/app/assets/javascripts/discourse/components/topic-status.js.es6 index 834b26dfe19..2ab678f9d21 100644 --- a/app/assets/javascripts/discourse/components/topic-status.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-status.js.es6 @@ -17,7 +17,7 @@ export default Ember.Component.extend( click(e) { // only pin unpin for now - if (this.get("canAct") && $(e.target).hasClass("d-icon-thumb-tack")) { + if (this.get("canAct") && $(e.target).hasClass("d-icon-thumbtack")) { const topic = this.get("topic"); topic.get("pinned") ? topic.clearPin() : topic.rePin(); } @@ -58,10 +58,10 @@ export default Ember.Component.extend( renderIconIf("topic.archived", "lock", "archived"); } - renderIconIf("topic.pinned", "thumb-tack", "pinned", this.get("canAct")); + renderIconIf("topic.pinned", "thumbtack", "pinned", this.get("canAct")); renderIconIf( "topic.unpinned", - "thumb-tack", + "thumbtack", "unpinned", this.get("canAct") ); diff --git a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 index 1988ae91bac..0e1984ff49a 100644 --- a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 @@ -196,7 +196,7 @@ export default Ember.Controller.extend({ @computed("expanded") searchAdvancedIcon(expanded) { - return iconHTML(expanded ? "caret-down fa-fw" : "caret-right fa-fw"); + return iconHTML(expanded ? "caret-down" : "caret-right"); }, @computed("page") diff --git a/app/assets/javascripts/discourse/helpers/icon-or-image.js.es6 b/app/assets/javascripts/discourse/helpers/icon-or-image.js.es6 index e93068deea9..8e48171eee7 100644 --- a/app/assets/javascripts/discourse/helpers/icon-or-image.js.es6 +++ b/app/assets/javascripts/discourse/helpers/icon-or-image.js.es6 @@ -1,14 +1,15 @@ import { htmlHelper } from "discourse-common/lib/helpers"; -import { iconHTML } from "discourse-common/lib/icon-library"; +import { iconHTML, convertIconClass } from "discourse-common/lib/icon-library"; export default htmlHelper(function({ icon, image }) { if (!Ember.isEmpty(image)) { return ``; } - if (Ember.isEmpty(icon) || icon.indexOf("fa-") !== 0) { + if (Ember.isEmpty(icon) || icon.indexOf("fa-") < 0) { return ""; } - return iconHTML(icon.replace("fa-", "")); + icon = convertIconClass(icon); + return iconHTML(icon); }); diff --git a/app/assets/javascripts/discourse/initializers/svg-sprite-fontawesome.js.es6 b/app/assets/javascripts/discourse/initializers/svg-sprite-fontawesome.js.es6 new file mode 100644 index 00000000000..7a5924423c9 --- /dev/null +++ b/app/assets/javascripts/discourse/initializers/svg-sprite-fontawesome.js.es6 @@ -0,0 +1,11 @@ +import svgSpriteLoader from "discourse/lib/svg-sprite-loader"; + +export default { + name: "svg-sprite-fontawesome", + + initialize() { + if (Discourse && Discourse.SvgSpritePath) { + svgSpriteLoader.load(Discourse.SvgSpritePath, "fontawesome"); + } + } +}; diff --git a/app/assets/javascripts/discourse/lib/lightbox.js.es6 b/app/assets/javascripts/discourse/lib/lightbox.js.es6 index 48d3c66bdb9..6b0014e2401 100644 --- a/app/assets/javascripts/discourse/lib/lightbox.js.es6 +++ b/app/assets/javascripts/discourse/lib/lightbox.js.es6 @@ -1,5 +1,6 @@ import loadScript from "discourse/lib/load-script"; import { escapeExpression } from "discourse/lib/utilities"; +import { renderIcon } from "discourse-common/lib/icon-library"; export default function($elem) { if (!$elem) { @@ -57,6 +58,7 @@ export default function($elem) { '' + + renderIcon("string", "download") + I18n.t("lightbox.download") + "" ); diff --git a/app/assets/javascripts/discourse/lib/render-topic-featured-link.js.es6 b/app/assets/javascripts/discourse/lib/render-topic-featured-link.js.es6 index c1c7f5411fa..7fa722a28d8 100644 --- a/app/assets/javascripts/discourse/lib/render-topic-featured-link.js.es6 +++ b/app/assets/javascripts/discourse/lib/render-topic-featured-link.js.es6 @@ -1,4 +1,5 @@ import { h } from "virtual-dom"; +import { renderIcon } from "discourse-common/lib/icon-library"; const _decorators = []; @@ -35,12 +36,13 @@ export default function renderTopicFeaturedLink(topic) { if (meta) { return `${meta.domain}`; + }" href="${meta.href}">${renderIcon("string", "external-link-alt")} ${ + meta.domain + }`; } else { return ""; } } - export function topicFeaturedLinkNode(topic) { const meta = extractLinkMeta(topic); if (meta) { @@ -49,7 +51,7 @@ export function topicFeaturedLinkNode(topic) { { attributes: { href: meta.href, rel: meta.rel, target: meta.target } }, - meta.domain + [renderIcon("node", "external-link-alt"), meta.domain] ); } } diff --git a/app/assets/javascripts/discourse/lib/svg-sprite-loader.js.es6 b/app/assets/javascripts/discourse/lib/svg-sprite-loader.js.es6 new file mode 100644 index 00000000000..b2794d6743a --- /dev/null +++ b/app/assets/javascripts/discourse/lib/svg-sprite-loader.js.es6 @@ -0,0 +1,18 @@ +import { ajax } from "discourse/lib/ajax"; + +export default { + name: "svg-sprite-loader", + load(spritePath, spriteName) { + const c = "svg-sprites"; + const $cEl = `#${c}`; + const $spriteEl = `${$cEl} .${spriteName}`; + + if ($($cEl).length === 0) $("body").append(`
`); + if ($($spriteEl).length === 0) + $($cEl).append(`
`); + + ajax(spritePath, { type: "GET", dataType: "text" }).then(data => { + $($spriteEl).html(data); + }); + } +}; diff --git a/app/assets/javascripts/discourse/models/login-method.js.es6 b/app/assets/javascripts/discourse/models/login-method.js.es6 index aba619ee94b..0365a276585 100644 --- a/app/assets/javascripts/discourse/models/login-method.js.es6 +++ b/app/assets/javascripts/discourse/models/login-method.js.es6 @@ -93,6 +93,11 @@ export function findAll(siteSettings, capabilities, isMobileDevice) { methods.forEach(m => m.set("full_screen_login", true)); } + // exclude FA icon for Google, uses custom SVG + methods.forEach(m => + m.set("hasRegularIcon", m.get("name") === "google_oauth2" ? false : true) + ); + return methods; } diff --git a/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 b/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 index b93dca7b27d..3c3b7f2b709 100644 --- a/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 +++ b/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 @@ -45,11 +45,11 @@ export default Ember.Object.extend({ } if (topic.get("pinned")) { - results.push({ icon: "thumb-tack", key: "pinned" }); + results.push({ icon: "thumbtack", key: "pinned" }); } if (topic.get("unpinned")) { - results.push({ icon: "thumb-tack unpinned", key: "unpinned" }); + results.push({ icon: "thumbtack", key: "unpinned" }); } if (topic.get("invisible")) { @@ -74,7 +74,6 @@ export default Ember.Object.extend({ if (results.length === 0 && defaultIcon) { this.set("showDefault", defaultIcon); } - return results; } }); diff --git a/app/assets/javascripts/discourse/templates/components/categories-boxes-topic.hbs b/app/assets/javascripts/discourse/templates/components/categories-boxes-topic.hbs index 5251070169e..95ebe51a0d3 100644 --- a/app/assets/javascripts/discourse/templates/components/categories-boxes-topic.hbs +++ b/app/assets/javascripts/discourse/templates/components/categories-boxes-topic.hbs @@ -1,3 +1,5 @@ +{{d-icon topicStatusIcon}} + {{text-overflow class="overflow" text=topic.fancyTitle}} diff --git a/app/assets/javascripts/discourse/templates/components/color-picker.hbs b/app/assets/javascripts/discourse/templates/components/color-picker.hbs index 5842bf91512..65f280ab758 100644 --- a/app/assets/javascripts/discourse/templates/components/color-picker.hbs +++ b/app/assets/javascripts/discourse/templates/components/color-picker.hbs @@ -1 +1,5 @@ -{{#each colors as |c|}}{{color-picker-choice color=c usedColors=usedColors selectColor="selectColor"}}{{/each}} +{{#each colors as |c|}} + {{#color-picker-choice color=c usedColors=usedColors selectColor="selectColor"}} + {{d-icon 'check'}} + {{/color-picker-choice}} +{{/each}} diff --git a/app/assets/javascripts/discourse/templates/components/group-flair-inputs.hbs b/app/assets/javascripts/discourse/templates/components/group-flair-inputs.hbs index ad0530ba8e7..fdc25357187 100644 --- a/app/assets/javascripts/discourse/templates/components/group-flair-inputs.hbs +++ b/app/assets/javascripts/discourse/templates/components/group-flair-inputs.hbs @@ -39,7 +39,7 @@
{{else}}
- + {{d-icon flairPreviewIconUrl}}
{{/if}}
diff --git a/app/assets/javascripts/discourse/templates/components/login-buttons.hbs b/app/assets/javascripts/discourse/templates/components/login-buttons.hbs index 5289a927df0..cc950944ec3 100644 --- a/app/assets/javascripts/discourse/templates/components/login-buttons.hbs +++ b/app/assets/javascripts/discourse/templates/components/login-buttons.hbs @@ -1,5 +1,12 @@ {{#each buttons as |b|}} - + {{/each}} {{#if showLoginWithEmailLink}} @@ -7,6 +14,6 @@ action="emailLogin" label="email_login.button_label" disabled=processingEmailLink - icon="envelope-o" + icon="far-envelope" class="login-with-email-button"}} {{/if}} diff --git a/app/assets/javascripts/discourse/templates/topic-status.raw.hbs b/app/assets/javascripts/discourse/templates/topic-status.raw.hbs index c8b1c3a6f38..9dd8ee5a9bc 100644 --- a/app/assets/javascripts/discourse/templates/topic-status.raw.hbs +++ b/app/assets/javascripts/discourse/templates/topic-status.raw.hbs @@ -5,7 +5,7 @@ {{~#if status.href ~}} {{d-icon status.icon}} {{~else ~}} -<{{status.openTag}} title='{{status.title}}' class='topic-status'>{{d-icon status.icon}} +<{{status.openTag}} title='{{status.title}}' class='topic-status'>{{d-icon status.icon class=status.key}} {{~/if ~}} {{~/each}} {{~#if view.showDefault~}}{{d-icon view.showDefault}}{{~/if ~}} diff --git a/app/assets/javascripts/discourse/widgets/avatar-flair.js.es6 b/app/assets/javascripts/discourse/widgets/avatar-flair.js.es6 index f2e26106765..559adb9c599 100644 --- a/app/assets/javascripts/discourse/widgets/avatar-flair.js.es6 +++ b/app/assets/javascripts/discourse/widgets/avatar-flair.js.es6 @@ -1,5 +1,5 @@ import { createWidget } from "discourse/widgets/widget"; -import { h } from "virtual-dom"; +import { iconNode, convertIconClass } from "discourse-common/lib/icon-library"; createWidget("avatar-flair", { tagName: "div.avatar-flair", @@ -7,7 +7,7 @@ createWidget("avatar-flair", { isIcon(attrs) { return ( attrs.primary_group_flair_url && - attrs.primary_group_flair_url.substr(0, 3) === "fa-" + attrs.primary_group_flair_url.includes("fa-") ); }, @@ -52,20 +52,8 @@ createWidget("avatar-flair", { html(attrs) { if (this.isIcon(attrs)) { - return [ - h("i", { - className: "fa " + attrs.primary_group_flair_url, - attributes: { - style: attrs.primary_group_flair_color - ? "color: #" + - Handlebars.Utils.escapeExpression( - attrs.primary_group_flair_color - ) + - "; " - : "" - } - }) - ]; + const icon = convertIconClass(attrs.primary_group_flair_url); + return [iconNode(icon)]; } else { return []; } diff --git a/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 b/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 index 8ec91f8e49b..41b717bd774 100644 --- a/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 @@ -37,12 +37,12 @@ const icons = { "autoclosed.disabled": "unlock-alt", "archived.enabled": "folder", "archived.disabled": "folder-open", - "pinned.enabled": "thumb-tack", - "pinned.disabled": "thumb-tack unpinned", - "pinned_globally.enabled": "thumb-tack", - "pinned_globally.disabled": "thumb-tack unpinned", - "banner.enabled": "thumb-tack", - "banner.disabled": "thumb-tack unpinned", + "pinned.enabled": "thumbtack", + "pinned.disabled": "thumbtack unpinned", + "pinned_globally.enabled": "thumbtack", + "pinned_globally.disabled": "thumbtack unpinned", + "banner.enabled": "thumbtack", + "banner.disabled": "thumbtack unpinned", "visible.enabled": "eye", "visible.disabled": "eye-slash", split_topic: "sign-out", diff --git a/app/assets/javascripts/discourse/widgets/time-gap.js.es6 b/app/assets/javascripts/discourse/widgets/time-gap.js.es6 index 4fee6557dd6..aaede013c3e 100644 --- a/app/assets/javascripts/discourse/widgets/time-gap.js.es6 +++ b/app/assets/javascripts/discourse/widgets/time-gap.js.es6 @@ -1,6 +1,5 @@ import { createWidget } from "discourse/widgets/widget"; import { h } from "virtual-dom"; -import { iconNode } from "discourse-common/lib/icon-library"; function description(attrs) { const daysSince = attrs.daysSince; @@ -21,7 +20,7 @@ export default createWidget("time-gap", { html(attrs) { return [ - h("div.topic-avatar", iconNode("fw")), + h("div.topic-avatar", ""), h("div.small-action-desc.timegap", description(attrs)) ]; } diff --git a/app/assets/javascripts/discourse/widgets/topic-admin-menu.js.es6 b/app/assets/javascripts/discourse/widgets/topic-admin-menu.js.es6 index 783b4f09ef5..b029650af9f 100644 --- a/app/assets/javascripts/discourse/widgets/topic-admin-menu.js.es6 +++ b/app/assets/javascripts/discourse/widgets/topic-admin-menu.js.es6 @@ -196,7 +196,7 @@ export default createWidget("topic-admin-menu", { className: "topic-admin-pin", buttonClass: "btn-default", action: "showFeatureTopic", - icon: "thumb-tack", + icon: "thumbtack", label: featured ? "actions.unpin" : "actions.pin" }); } diff --git a/app/assets/javascripts/discourse/widgets/topic-status.js.es6 b/app/assets/javascripts/discourse/widgets/topic-status.js.es6 index e7c116a91fc..ff03d826573 100644 --- a/app/assets/javascripts/discourse/widgets/topic-status.js.es6 +++ b/app/assets/javascripts/discourse/widgets/topic-status.js.es6 @@ -37,8 +37,8 @@ export default createWidget("topic-status", { renderIconIf("archived", "lock", "archived"); } - renderIconIf("pinned", "thumb-tack", "pinned"); - renderIconIf("unpinned", "thumb-tack", "unpinned"); + renderIconIf("pinned", "thumbtack", "pinned"); + renderIconIf("unpinned", "thumbtack", "unpinned"); renderIconIf("invisible", "eye-slash", "invisible"); return result; diff --git a/app/assets/javascripts/preload-application-data.js.no-module.es6 b/app/assets/javascripts/preload-application-data.js.no-module.es6 index 7291d919502..d5cee7edfc6 100644 --- a/app/assets/javascripts/preload-application-data.js.no-module.es6 +++ b/app/assets/javascripts/preload-application-data.js.no-module.es6 @@ -34,6 +34,11 @@ } Discourse.HighlightJSPath = setupData.highlightJsPath; + Discourse.SvgSpritePath = setupData.svgSpritePath; + + if (Discourse.Environment === "development") { + Discourse.SvgIconList = setupData.svgIconList; + } if (setupData.s3BaseUrl) { Discourse.S3CDN = setupData.s3Cdn; diff --git a/app/assets/javascripts/select-kit/components/mini-tag-chooser.js.es6 b/app/assets/javascripts/select-kit/components/mini-tag-chooser.js.es6 index 07825a3bca0..6a12338eee9 100644 --- a/app/assets/javascripts/select-kit/components/mini-tag-chooser.js.es6 +++ b/app/assets/javascripts/select-kit/components/mini-tag-chooser.js.es6 @@ -3,6 +3,7 @@ import TagsMixin from "select-kit/mixins/tags"; import { default as computed } from "ember-addons/ember-computed-decorators"; import renderTag from "discourse/lib/render-tag"; import { escapeExpression } from "discourse/lib/utilities"; +import { iconHTML } from "discourse-common/lib/icon-library"; const { get, isEmpty, run, makeArray } = Ember; export default ComboBox.extend(TagsMixin, { @@ -67,7 +68,7 @@ export default ComboBox.extend(TagsMixin, { @computed("hasReachedMaximum") caretIcon(hasReachedMaximum) { - return hasReachedMaximum ? null : "plus fa-fw"; + return hasReachedMaximum ? null : "plus"; }, @computed("tags") @@ -125,7 +126,7 @@ export default ComboBox.extend(TagsMixin, { `; }); diff --git a/app/assets/javascripts/select-kit/components/pinned-options.js.es6 b/app/assets/javascripts/select-kit/components/pinned-options.js.es6 index 01cdb52c228..d32ab062d39 100644 --- a/app/assets/javascripts/select-kit/components/pinned-options.js.es6 +++ b/app/assets/javascripts/select-kit/components/pinned-options.js.es6 @@ -20,7 +20,7 @@ export default DropdownSelectBoxComponent.extend({ content.label = `${title}${iconHTML("caret-down")}`.htmlSafe(); content.title = title; content.name = state; - content.icon = `thumb-tack${state === "unpinned" ? " unpinned" : ""}`; + content.icon = `thumbtack${state === "unpinned" ? " unpinned" : ""}`; return content; }, @@ -33,12 +33,12 @@ export default DropdownSelectBoxComponent.extend({ id: "pinned", name: I18n.t("topic_statuses.pinned" + globally + ".title"), description: I18n.t("topic_statuses.pinned" + globally + ".help"), - icon: "thumb-tack" + icon: "thumbtack" }, { id: "unpinned", name: I18n.t("topic_statuses.unpinned.title"), - icon: "thumb-tack unpinned", + icon: "thumbtack unpinned", description: I18n.t("topic_statuses.unpinned.help") } ]); diff --git a/app/assets/javascripts/select-kit/templates/components/category-drop/category-drop-header.hbs b/app/assets/javascripts/select-kit/templates/components/category-drop/category-drop-header.hbs index 7e3ea1baf4f..7928a3b94b9 100644 --- a/app/assets/javascripts/select-kit/templates/components/category-drop/category-drop-header.hbs +++ b/app/assets/javascripts/select-kit/templates/components/category-drop/category-drop-header.hbs @@ -2,4 +2,4 @@ {{{label}}} -{{d-icon caretIcon class="caret-icon fa-fw"}} +{{d-icon caretIcon class="caret-icon"}} diff --git a/app/assets/javascripts/select-kit/templates/components/combo-box/combo-box-header.hbs b/app/assets/javascripts/select-kit/templates/components/combo-box/combo-box-header.hbs index c9fc965ee83..a090a66aaa3 100644 --- a/app/assets/javascripts/select-kit/templates/components/combo-box/combo-box-header.hbs +++ b/app/assets/javascripts/select-kit/templates/components/combo-box/combo-box-header.hbs @@ -14,4 +14,4 @@ {{/if}} -{{d-icon caretIcon class="caret-icon fa-fw"}} +{{d-icon caretIcon class="caret-icon"}} diff --git a/app/assets/javascripts/select-kit/templates/components/future-date-input-selector/future-date-input-selector-header.hbs b/app/assets/javascripts/select-kit/templates/components/future-date-input-selector/future-date-input-selector-header.hbs index a5c5cbd6a36..8a630455bda 100644 --- a/app/assets/javascripts/select-kit/templates/components/future-date-input-selector/future-date-input-selector-header.hbs +++ b/app/assets/javascripts/select-kit/templates/components/future-date-input-selector/future-date-input-selector-header.hbs @@ -24,4 +24,4 @@ {{/if}} -{{d-icon caretIcon class="caret-icon fa-fw"}} +{{d-icon caretIcon class="caret-icon"}} diff --git a/app/assets/javascripts/select-kit/templates/components/multi-select/selected-category.hbs b/app/assets/javascripts/select-kit/templates/components/multi-select/selected-category.hbs index 09b5adfa859..1eb83f00509 100644 --- a/app/assets/javascripts/select-kit/templates/components/multi-select/selected-category.hbs +++ b/app/assets/javascripts/select-kit/templates/components/multi-select/selected-category.hbs @@ -1,3 +1,4 @@
{{badge}} + {{d-icon 'times'}}
diff --git a/app/assets/javascripts/select-kit/templates/components/multi-select/selected-name.hbs b/app/assets/javascripts/select-kit/templates/components/multi-select/selected-name.hbs index 141ae2748f6..b39d272a045 100644 --- a/app/assets/javascripts/select-kit/templates/components/multi-select/selected-name.hbs +++ b/app/assets/javascripts/select-kit/templates/components/multi-select/selected-name.hbs @@ -8,6 +8,7 @@ {{{label}}} {{/if}} + {{d-icon 'times'}}
{{#if footerContent}}{{/if}} diff --git a/app/assets/javascripts/select-kit/templates/components/tag-drop/tag-drop-header.hbs b/app/assets/javascripts/select-kit/templates/components/tag-drop/tag-drop-header.hbs index 440988e3efe..41e15b8653e 100644 --- a/app/assets/javascripts/select-kit/templates/components/tag-drop/tag-drop-header.hbs +++ b/app/assets/javascripts/select-kit/templates/components/tag-drop/tag-drop-header.hbs @@ -6,4 +6,4 @@ {{/if}} -{{d-icon caretIcon class="caret-icon fa-fw"}} +{{d-icon caretIcon class="caret-icon"}} diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index d1c9e353363..4d4fa835821 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -1,5 +1,4 @@ @import "vendor/normalize"; -@import "vendor/font_awesome/font-awesome"; @import "vendor/pikaday"; @import "common/foundation/helpers"; @import "common/foundation/base"; diff --git a/app/assets/stylesheets/common/admin/admin_report.scss b/app/assets/stylesheets/common/admin/admin_report.scss index 603c421eb44..031363bad0f 100644 --- a/app/assets/stylesheets/common/admin/admin_report.scss +++ b/app/assets/stylesheets/common/admin/admin_report.scss @@ -61,7 +61,7 @@ &.no-change { color: $primary-medium; - i { + .d-icon { display: none; } } @@ -96,9 +96,9 @@ .d-icon { color: currentColor; - margin-bottom: 0.25em; font-size: $font-up-5; display: block; + margin: 0.25em auto; } &.no-data, diff --git a/app/assets/stylesheets/common/admin/admin_report_counters.scss b/app/assets/stylesheets/common/admin/admin_report_counters.scss index c9a8ef9df48..a2e1c7c9bc5 100644 --- a/app/assets/stylesheets/common/admin/admin_report_counters.scss +++ b/app/assets/stylesheets/common/admin/admin_report_counters.scss @@ -47,7 +47,7 @@ text-align: center; } - i { + .d-icon { margin: 0; } } @@ -65,13 +65,13 @@ &.high-trending-up, &.trending-up { - i { + .d-icon { color: $success; } } &.high-trending-down, &.trending-down { - i { + .d-icon { color: $danger; } } diff --git a/app/assets/stylesheets/common/admin/dashboard_previous.scss b/app/assets/stylesheets/common/admin/dashboard_previous.scss index b610e064a64..a040f1c5954 100644 --- a/app/assets/stylesheets/common/admin/dashboard_previous.scss +++ b/app/assets/stylesheets/common/admin/dashboard_previous.scss @@ -154,37 +154,37 @@ td.value { font-weight: bold; text-align: center; - i { + .d-icon { display: none; } &.high-trending-up, &.trending-up { - i.up { + .up { color: $success; display: inline; } } &.high-trending-down, &.trending-down { - i.down { + .down { color: $danger; display: inline; } } &.no-change { - i.down { + .down { display: inline; visibility: hidden; } } } tr.reverse-colors { - td.value.high-trending-down i.down, - td.value.trending-down i.down { + td.value.high-trending-down .down, + td.value.trending-down .down { color: $success; } - td.value.high-trending-up i.up, - td.value.trending-up i.up { + td.value.high-trending-up .up, + td.value.trending-up .up { color: $danger; } } diff --git a/app/assets/stylesheets/common/admin/staff_logs.scss b/app/assets/stylesheets/common/admin/staff_logs.scss index d20eef94dbb..cfe23babf20 100644 --- a/app/assets/stylesheets/common/admin/staff_logs.scss +++ b/app/assets/stylesheets/common/admin/staff_logs.scss @@ -201,7 +201,7 @@ .label { font-weight: bold; } - i { + .d-icon { margin-left: 6px; } } diff --git a/app/assets/stylesheets/common/base/_topic-list.scss b/app/assets/stylesheets/common/base/_topic-list.scss index 97411db14a5..26bee81e6e8 100644 --- a/app/assets/stylesheets/common/base/_topic-list.scss +++ b/app/assets/stylesheets/common/base/_topic-list.scss @@ -251,8 +251,8 @@ ol.category-breadcrumb { } } -.d-icon-thumb-tack.unpinned { - @include fa-icon-rotate(180deg, 1); +.d-icon-thumbtack.unpinned { + @include rotate(180deg, 1); color: $primary; /* because it is rotated, right becomes left! */ padding-left: 3px; diff --git a/app/assets/stylesheets/common/base/category-list.scss b/app/assets/stylesheets/common/base/category-list.scss index 8a6a3954526..0e130634b00 100644 --- a/app/assets/stylesheets/common/base/category-list.scss +++ b/app/assets/stylesheets/common/base/category-list.scss @@ -175,26 +175,18 @@ margin: 0; } li { - padding: 0; - margin-left: 1.5em; + padding: 4px 0; + display: flex; .overflow { max-height: 3em; overflow: hidden; text-overflow: ellipsis; } - } - li:before { - content: "\f0f6"; - font-family: "FontAwesome"; - float: left; - margin-left: -1.5em; - } - li.topic-pinned:before { - content: "\f08d"; - } - li.topic-closed:before, - li.topic-archived:before { - content: "\f023"; + + .d-icon { + margin-right: 6px; + margin-top: 2px; + } } } } diff --git a/app/assets/stylesheets/common/base/colorpicker.scss b/app/assets/stylesheets/common/base/colorpicker.scss index 788111d5743..271d48ccb76 100644 --- a/app/assets/stylesheets/common/base/colorpicker.scss +++ b/app/assets/stylesheets/common/base/colorpicker.scss @@ -33,18 +33,14 @@ height: 1.2em; padding: 0; flex: 0 0 auto; - &.used-color:before { - position: absolute; - top: 0; - left: 0; - display: flex; - align-items: center; - justify-content: center; - font-family: fontawesome; - content: "\f00c"; - height: 100%; - width: calc(1.25em - 2px); - color: rgba($secondary, 0.75); + color: white; + svg { + display: none; + } + &.used-color svg { + display: inline-flex; + opacity: 0.8; + max-width: 70%; } } } diff --git a/app/assets/stylesheets/common/base/compose.scss b/app/assets/stylesheets/common/base/compose.scss index 020db3d5fd3..8b81509bc32 100644 --- a/app/assets/stylesheets/common/base/compose.scss +++ b/app/assets/stylesheets/common/base/compose.scss @@ -36,7 +36,7 @@ border-color: $secondary; border-right-color: transparent; } - i { + .d-icon { color: $secondary; } } @@ -94,7 +94,7 @@ margin: 5px 0 10px 0; display: flex; align-items: center; - i { + .d-icon { color: $primary-high; } .reply-details { diff --git a/app/assets/stylesheets/common/base/emoji.scss b/app/assets/stylesheets/common/base/emoji.scss index 7a3b46a5de4..8d8cd19f7f4 100644 --- a/app/assets/stylesheets/common/base/emoji.scss +++ b/app/assets/stylesheets/common/base/emoji.scss @@ -143,18 +143,18 @@ img.emoji { background: #7c533e; } -.emoji-picker .diversity-picker .diversity-scale.selected i { +.emoji-picker .diversity-picker .diversity-scale.selected .d-icon { display: block; } -.emoji-picker .diversity-picker i { +.emoji-picker .diversity-picker .d-icon { display: none; } .emoji-picker .diversity-picker .d-icon { color: #fff; font-size: $font-0; - text-shadow: 0.5px 1.5px 0 rgba(0, 0, 0, 0.3); + filter: drop-shadow(0.5px 1.5px 0 rgba(0, 0, 0, 0.3)); } .emoji-picker button.emoji { @@ -182,10 +182,6 @@ img.emoji { background-color: lighten($tertiary, 40%); } -.wmd-emoji-button:before { - content: "\f118"; -} - .emoji-picker-modal.fadeIn { z-index: z("modal", "overlay"); position: fixed; diff --git a/app/assets/stylesheets/common/base/group.scss b/app/assets/stylesheets/common/base/group.scss index 653989b1ae6..20b6cf58520 100644 --- a/app/assets/stylesheets/common/base/group.scss +++ b/app/assets/stylesheets/common/base/group.scss @@ -57,7 +57,7 @@ background-size: $size; height: $size; - i { + .d-icon { font-size: $size !important; } } @@ -86,7 +86,7 @@ table.group-manage-logs { .group-manage-logs-expand-details { cursor: pointer; - i { + .d-icon { color: blend-primary-secondary(50%); } } @@ -117,7 +117,7 @@ table.group-members { } th.sortable { - i { + .d-icon { margin-left: 5px; } diff --git a/app/assets/stylesheets/common/base/groups.scss b/app/assets/stylesheets/common/base/groups.scss index 8b050b1488a..ee58f29424e 100644 --- a/app/assets/stylesheets/common/base/groups.scss +++ b/app/assets/stylesheets/common/base/groups.scss @@ -49,7 +49,7 @@ } td.group-user-status { - i { + .d-icon { color: $primary; } } @@ -103,7 +103,7 @@ background-size: $size; height: $size; - i { + .d-icon { font-size: $size !important; } } diff --git a/app/assets/stylesheets/common/base/lightbox.scss b/app/assets/stylesheets/common/base/lightbox.scss index 06c32b1636c..4f96f0592d7 100644 --- a/app/assets/stylesheets/common/base/lightbox.scss +++ b/app/assets/stylesheets/common/base/lightbox.scss @@ -36,9 +36,14 @@ white-space: nowrap; text-overflow: ellipsis; &:before { - font-family: "FontAwesome"; - content: "\F03E"; + // ideally, the SVG used here should be in HTML and reference the SVG sprite + content: svg-uri( + '' + ); margin-right: 5px; + display: inline-block; + vertical-align: middle; + opacity: 0.8; } } @@ -51,11 +56,14 @@ .expand { position: absolute; - bottom: 4px; + bottom: 2px; right: 7px; &:before { - font-family: "FontAwesome"; - content: "\F065"; + // ideally, the SVG used here should be in HTML and reference the SVG sprite + content: svg-uri( + ' ' + ); + opacity: 0.8; } } } diff --git a/app/assets/stylesheets/common/base/magnific-popup.scss b/app/assets/stylesheets/common/base/magnific-popup.scss index 17395ed1003..76ef9a84466 100644 --- a/app/assets/stylesheets/common/base/magnific-popup.scss +++ b/app/assets/stylesheets/common/base/magnific-popup.scss @@ -499,9 +499,7 @@ button { padding-right: 36px; // leave some space for counter at right side // add the download icon - a.image-source-link:before { - content: "\f019"; - font-family: FontAwesome; + a.image-source-link .d-icon { padding-right: 5px; } } diff --git a/app/assets/stylesheets/common/base/menu-panel.scss b/app/assets/stylesheets/common/base/menu-panel.scss index 43c719778ad..5ac03f7445a 100644 --- a/app/assets/stylesheets/common/base/menu-panel.scss +++ b/app/assets/stylesheets/common/base/menu-panel.scss @@ -153,7 +153,7 @@ // This is until other languages remove the HTML from within // notifications. It can then be removed - div i.fa { + div .fa { display: none; } @@ -181,17 +181,14 @@ } li:not(.show-all) { padding: 0.25em 0.5em; - i { + .d-icon { float: left; margin-right: 5px; padding-top: 2px; } } .is-warning { - .d-icon-envelope-o { - &:before { - content: "\f0e0"; - } + .d-icon-far-envelope { color: $danger; } } diff --git a/app/assets/stylesheets/common/base/onebox.scss b/app/assets/stylesheets/common/base/onebox.scss index 548b23cc84a..09f20ee5c81 100644 --- a/app/assets/stylesheets/common/base/onebox.scss +++ b/app/assets/stylesheets/common/base/onebox.scss @@ -251,14 +251,15 @@ aside.onebox { .instagram-video-icon { &:before { - font-family: FontAwesome; - font-size: $font-up-5; - content: "\f144"; + opacity: 0.8; + // ideally, the SVG used here should be in HTML and reference the SVG sprite + content: svg-uri( + '' + ); } bottom: 10px; right: 10px; position: absolute; - color: white; } .instagram-image { diff --git a/app/assets/stylesheets/common/base/tagging.scss b/app/assets/stylesheets/common/base/tagging.scss index 5c82fdbd59f..839dc3c3572 100644 --- a/app/assets/stylesheets/common/base/tagging.scss +++ b/app/assets/stylesheets/common/base/tagging.scss @@ -127,7 +127,7 @@ $tag-color: $primary-medium; display: inline-block; font-size: $font-down-1; } - .topic-featured-link { + .discourse-tags + .topic-featured-link { margin-left: 8px; } } @@ -169,12 +169,14 @@ $tag-color: $primary-medium; .discourse-tag.bullet { margin-right: 0.25em; &:before { - content: "\f04d"; - font-family: FontAwesome; - color: $primary-low-mid; + background: $primary-low-mid; margin-right: 5px; - font-size: $font-down-2; position: relative; + width: 8px; + height: 8px; + display: inline-block; + vertical-align: middle; + content: ""; } } diff --git a/app/assets/stylesheets/common/base/topic-admin-menu.scss b/app/assets/stylesheets/common/base/topic-admin-menu.scss index c8cf624aff2..57b81ce1eb9 100644 --- a/app/assets/stylesheets/common/base/topic-admin-menu.scss +++ b/app/assets/stylesheets/common/base/topic-admin-menu.scss @@ -28,9 +28,6 @@ button { width: 100%; margin-bottom: 5px; - i { - width: 14px; - } } } diff --git a/app/assets/stylesheets/common/base/topic-post.scss b/app/assets/stylesheets/common/base/topic-post.scss index 2fb3e97c130..2efa261c1a2 100644 --- a/app/assets/stylesheets/common/base/topic-post.scss +++ b/app/assets/stylesheets/common/base/topic-post.scss @@ -34,9 +34,12 @@ } .fa { font-size: $font-down-1; - margin-left: 3px; color: dark-light-choose($primary-medium, $secondary-medium); } + .svg-icon-title { + margin-left: 3px; + margin-right: 0px; + } .new_user a, .user-title, .user-title a { @@ -630,7 +633,7 @@ blockquote > *:last-child { padding: 0.7em 0; border-top: none; margin-right: 11px; - i { + .d-icon { font-size: 2em; width: 45px; text-align: center; @@ -742,7 +745,7 @@ a.mention-group { overflow: hidden; } - > i.fa { + > .fa { color: dark-light-choose($primary-medium, $secondary-medium); margin-right: 6px; font-size: $font-0; diff --git a/app/assets/stylesheets/common/base/topic.scss b/app/assets/stylesheets/common/base/topic.scss index 9d3a10b8bd9..8b96b80a96b 100644 --- a/app/assets/stylesheets/common/base/topic.scss +++ b/app/assets/stylesheets/common/base/topic.scss @@ -97,7 +97,7 @@ a.badge-category { a.badge-category { margin-top: 5px; } - a.edit-topic i { + a.edit-topic .d-icon { font-size: 0.8em; } .edit-topic-title { @@ -232,21 +232,21 @@ a.badge-category { margin-left: 0.5em; flex: 0 0 auto; } - i { + .d-icon { font-size: $font-down-2; margin: 0 0.5em 0 0; } } } a.reply-new { - i { + .d-icon { background: $secondary; border-radius: 20px; transition: all linear 0.15s; } &:hover { color: $tertiary; - i { + .d-icon { background: $tertiary-low; } } @@ -258,11 +258,7 @@ a.topic-featured-link { text-transform: lowercase; color: dark-light-choose($primary-medium, $secondary-medium); font-size: 0.875rem; - &::before { - position: relative; - top: 0.1em; - padding-right: 3px; - font-family: FontAwesome; - content: "\f08e"; + .d-icon { + margin-right: 3px; } } diff --git a/app/assets/stylesheets/common/base/user.scss b/app/assets/stylesheets/common/base/user.scss index 787e0246395..c02c904f667 100644 --- a/app/assets/stylesheets/common/base/user.scss +++ b/app/assets/stylesheets/common/base/user.scss @@ -89,7 +89,7 @@ h1 { font-size: $font-up-5; font-weight: normal; - i { + .d-icon { font-size: 0.8em; } } diff --git a/app/assets/stylesheets/common/components/buttons.scss b/app/assets/stylesheets/common/components/buttons.scss index aa439bccbe6..7a56588cf8c 100644 --- a/app/assets/stylesheets/common/components/buttons.scss +++ b/app/assets/stylesheets/common/components/buttons.scss @@ -158,7 +158,6 @@ } &:before { margin-right: 9px; - font-family: FontAwesome; font-size: $font-0; } &.google, @@ -166,62 +165,28 @@ background: $google; color: #333; border: 1px solid $primary-low; - display: flex; - align-items: center; - justify-content: center; - &:before { - content: ""; - display: inline-block; - width: 15px; - height: 15px; - // Background image url needs to be encoded for IE11 - background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20viewBox%3D%220%200%2048%2048%22%3E%3Cdefs%3E%3Cpath%20id%3D%22a%22%20d%3D%22M44.5%2020H24v8.5h11.8C34.7%2033.9%2030.1%2037%2024%2037c-7.2%200-13-5.8-13-13s5.8-13%2013-13c3.1%200%205.9%201.1%208.1%202.9l6.4-6.4C34.6%204.1%2029.6%202%2024%202%2011.8%202%202%2011.8%202%2024s9.8%2022%2022%2022c11%200%2021-8%2021-22%200-1.3-.2-2.7-.5-4z%22%2F%3E%3C%2Fdefs%3E%3CclipPath%20id%3D%22b%22%3E%3Cuse%20xlink%3Ahref%3D%22%23a%22%20overflow%3D%22visible%22%2F%3E%3C%2FclipPath%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%23FBBC05%22%20d%3D%22M0%2037V11l17%2013z%22%2F%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%23EA4335%22%20d%3D%22M0%2011l17%2013%207-6.1L48%2014V0H0z%22%2F%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%2334A853%22%20d%3D%22M0%2037l30-23%207.9%201L48%200v48H0z%22%2F%3E%3Cpath%20clip-path%3D%22url(%23b)%22%20fill%3D%22%234285F4%22%20d%3D%22M48%2048L17%2024l-4-3%2035-10z%22%2F%3E%3C%2Fsvg%3E"); - background-repeat: no-repeat; - background-size: cover; - } - } - .mobile-view & { - // Special case because we're using SVG here - &.google, - &.google_oauth2 { - &:before { - width: 17px; - height: 17px; - } + // non-FA SVG icon for Google in login-buttons.hbs + .d-icon { + opacity: 0.9; } } &.instagram { background: $instagram; - &:before { - content: $fa-var-instagram; - } } &.facebook { background: $facebook; - &:before { - content: $fa-var-facebook; - } } &.cas { background: $cas; } &.twitter { background: $twitter; - &:before { - content: $fa-var-twitter; - } } &.yahoo { background: $yahoo; - &:before { - content: $fa-var-yahoo; - } } &.github { background: $github; - &:before { - content: $fa-var-github; - } } } diff --git a/app/assets/stylesheets/common/components/svg.scss b/app/assets/stylesheets/common/components/svg.scss new file mode 100644 index 00000000000..26f428833fe --- /dev/null +++ b/app/assets/stylesheets/common/components/svg.scss @@ -0,0 +1,12 @@ +.svg-icon, +.svg-icon-title { + height: 1em; + width: 1em; + line-height: 1; + display: inline-flex; + position: relative; + vertical-align: -0.125em; + fill: currentColor; + flex-shrink: 0; // Prevent the icon from shrinking if it's in a flexbox + overflow: visible; +} diff --git a/app/assets/stylesheets/common/components/user-stream-item.scss b/app/assets/stylesheets/common/components/user-stream-item.scss index 54c2f126a89..39d7884d588 100644 --- a/app/assets/stylesheets/common/components/user-stream-item.scss +++ b/app/assets/stylesheets/common/components/user-stream-item.scss @@ -48,7 +48,7 @@ clear: right; } - .delete-info i { + .delete-info .d-icon { font-size: $font-0; } diff --git a/app/assets/stylesheets/common/foundation/mixins.scss b/app/assets/stylesheets/common/foundation/mixins.scss index 44654bde653..0fde66a24b7 100644 --- a/app/assets/stylesheets/common/foundation/mixins.scss +++ b/app/assets/stylesheets/common/foundation/mixins.scss @@ -86,3 +86,60 @@ $breakpoints: ( -moz-appearance: none; appearance: none; } + +@mixin rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +/// Helper function to easily use an SVG inline in CSS +/// without encoding it to base64, saving bytes. +/// It also helps with browser support, especially for IE11. +/// +/// @author Jakob Eriksen +/// @link http://codepen.io/jakob-e/pen/doMoML +/// @param {String} $svg - SVG image to encode +/// @return {String} - Encoded SVG data uri +@function svg-uri($svg) { + $encoded: ""; + $slice: 2000; + $index: 0; + $loops: ceil(str-length($svg) / $slice); + + @for $i from 1 through $loops { + $chunk: str-slice($svg, $index, $index + $slice - 1); + $chunk: str-replace($chunk, '"', "'"); + $chunk: str-replace($chunk, "<", "%3C"); + $chunk: str-replace($chunk, ">", "%3E"); + $chunk: str-replace($chunk, "&", "%26"); + $chunk: str-replace($chunk, "#", "%23"); + $encoded: #{$encoded}#{$chunk}; + $index: $index + $slice; + } + + @return url("data:image/svg+xml;charset=utf8,#{$encoded}"); +} + +/// Replace `$search` with `$replace` in `$string` +/// @author Hugo Giraudel +/// @link http://sassmeister.com/gist/1b4f2da5527830088e4d +/// @param {String} $string - Initial string +/// @param {String} $search - Substring to replace +/// @param {String} $replace ('') - New value +/// @return {String} - Updated string +@function str-replace($string, $search, $replace: "") { + $index: str-index($string, $search); + + @if $index { + @return str-slice($string, 1, $index - 1) + $replace + + str-replace( + str-slice($string, $index + str-length($search)), + $search, + $replace + ); + } + + @return $string; +} diff --git a/app/assets/stylesheets/common/printer-friendly.scss b/app/assets/stylesheets/common/printer-friendly.scss index 7a656553088..b60f1dc7d93 100644 --- a/app/assets/stylesheets/common/printer-friendly.scss +++ b/app/assets/stylesheets/common/printer-friendly.scss @@ -71,9 +71,6 @@ .gap { width: auto; } - .gutter { - padding: 0; - } /* restyle div#topic-title */ #topic-title { margin: 0; diff --git a/app/assets/stylesheets/common/select-kit/mini-tag-chooser.scss b/app/assets/stylesheets/common/select-kit/mini-tag-chooser.scss index 339ec4bb152..39db4c20eb0 100644 --- a/app/assets/stylesheets/common/select-kit/mini-tag-chooser.scss +++ b/app/assets/stylesheets/common/select-kit/mini-tag-chooser.scss @@ -79,16 +79,13 @@ box-shadow: 0 0 2px $danger, 0 1px 0 rgba(0, 0, 0, 0.05); } - &:after { - content: "\f00d"; + .d-icon { color: $primary-low-mid; - font-family: "FontAwesome"; + vertical-align: middle; } - &:hover { - &:after { - color: $danger; - } + &:hover .d-icon { + color: $danger; } } } diff --git a/app/assets/stylesheets/common/select-kit/multi-select.scss b/app/assets/stylesheets/common/select-kit/multi-select.scss index 10f0aeb5807..58cfdef4bcd 100644 --- a/app/assets/stylesheets/common/select-kit/multi-select.scss +++ b/app/assets/stylesheets/common/select-kit/multi-select.scss @@ -125,25 +125,20 @@ } .selected-category { + .body { + display: flex; + align-items: center; + } .badge-wrapper { &.bullet { margin-right: 2.5px; } - margin: auto 2.5px; padding: 2px 4px; line-height: $line-height-medium; display: flex; flex: 1; align-items: center; - - &:after { - content: "\f00d"; - color: $primary-low-mid; - font-family: "FontAwesome"; - font-size: $font-down-2; - margin-left: 5px; - } } } @@ -159,19 +154,12 @@ padding: 4px; } - .name { - &:after { - content: "\f00d"; - color: $primary-low-mid; - font-family: "FontAwesome"; - font-size: $font-down-2; - } - - &:hover { - &:after { - color: $danger; - } - } + .d-icon { + color: $primary-low-mid; + vertical-align: middle; + } + &:hover .d-icon { + color: $danger; } &.is-highlighted { diff --git a/app/assets/stylesheets/common/topic-entrance.scss b/app/assets/stylesheets/common/topic-entrance.scss index 4310fd2f040..d93d3548384 100644 --- a/app/assets/stylesheets/common/topic-entrance.scss +++ b/app/assets/stylesheets/common/topic-entrance.scss @@ -13,7 +13,7 @@ width: 100%; margin-bottom: 5px; - i { + .d-icon { display: block; margin-top: 2px; margin-bottom: 2px; diff --git a/app/assets/stylesheets/common/topic-timeline.scss b/app/assets/stylesheets/common/topic-timeline.scss index 253b89e2b98..d9b8628b5ee 100644 --- a/app/assets/stylesheets/common/topic-timeline.scss +++ b/app/assets/stylesheets/common/topic-timeline.scss @@ -119,7 +119,7 @@ .timeline-last-read { right: 0; margin-left: 0; - i.progress { + .progress { display: none; } } @@ -194,6 +194,7 @@ .timeline-footer-controls { margin-top: 1.5em; transition: opacity 0.2s ease-in; + display: flex; button { margin-right: 0.5em; @@ -262,8 +263,7 @@ .timeline-last-read { position: absolute; margin-left: -0.35em; - - i.progress { + .progress { font-size: 0.8em; color: $tertiary; margin-right: 1em; @@ -281,9 +281,6 @@ display: inline-block; color: dark-light-choose($primary-medium, $secondary-medium); margin-top: 0.5em; - i { - margin-left: 0.15em; - } } } } diff --git a/app/assets/stylesheets/desktop/discourse.scss b/app/assets/stylesheets/desktop/discourse.scss index df19506ad8e..aefaee51ff7 100644 --- a/app/assets/stylesheets/desktop/discourse.scss +++ b/app/assets/stylesheets/desktop/discourse.scss @@ -26,7 +26,7 @@ header { margin: 0; line-height: $line-height-small; - i { + .d-icon { font-size: $font-down-1; } } diff --git a/app/assets/stylesheets/desktop/topic-list.scss b/app/assets/stylesheets/desktop/topic-list.scss index 4be9edfc3f7..5f0f2c0a10d 100644 --- a/app/assets/stylesheets/desktop/topic-list.scss +++ b/app/assets/stylesheets/desktop/topic-list.scss @@ -33,10 +33,10 @@ // -------------------------------------------------- .topic-list-icons { - .d-icon-thumb-tack { + .d-icon-thumbtack { color: dark-light-choose($primary-medium, $secondary-medium); } - .d-icon-thumb-tack.unpinned { + .d-icon-thumbtack.unpinned { color: dark-light-choose($primary-medium, $secondary-medium); } a.title { @@ -242,7 +242,7 @@ button.dismiss-read { span { display: none; } - i { + .d-icon { margin-right: 0; } } diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index c2b7cae95b0..4cfb9a6b6ea 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -6,7 +6,7 @@ margin-left: 0; } -h1 .topic-statuses .topic-status i { +h1 .topic-statuses .topic-status .d-icon { font-size: 0.857em; vertical-align: middle; } @@ -88,7 +88,7 @@ nav.post-controls { .like-count { font-size: $font-up-1; margin-left: 0; - i.d-icon { + .d-icon { padding-left: 10px; color: dark-light-choose($primary-low-mid, $secondary-high); } @@ -145,7 +145,7 @@ nav.post-controls { color: $primary; } } - i { + .d-icon { margin-left: 5px; font-size: $font-down-1; } @@ -155,7 +155,7 @@ nav.post-controls { color: dark-light-choose($primary-high, $secondary-low); margin-left: 10px; } - .create i { + .create .d-icon { margin-right: 5px; } button { @@ -369,7 +369,7 @@ nav.post-controls { line-height: $line-height-large; } .number, - i { + .d-icon { color: dark-light-choose($primary-high, $secondary-low); font-size: $font-up-2; line-height: $line-height-medium; @@ -461,7 +461,7 @@ nav.post-controls { #suggested-topics .topic-statuses .topic-status { padding: 0; - i { + .d-icon { font-size: 1em; } } @@ -515,7 +515,7 @@ video { animation: fadein 0.7s; } .topic-statuses { - i { + .d-icon { color: $header_primary; } .d-icon-envelope { @@ -806,7 +806,7 @@ $topic-avatar-width: 45px; font-size: $font-up-4; color: $primary; margin-bottom: 5px; - i { + .d-icon { margin-right: 7px; } } @@ -815,24 +815,11 @@ $topic-avatar-width: 45px; a.attachment:before { display: inline-block; margin-right: 4px; - font-family: "FontAwesome"; - content: "\f019"; -} - -.private_message .gutter, -.deleted-topic .gutter, -.read_restricted .gutter { - position: relative; -} - -.deleted-topic .gutter:before { - display: block; - position: absolute; - left: 767px; - color: rgba($primary-low, 0.8); - font: 6.429em/1 FontAwesome; - content: "\f014"; - z-index: z("base"); + // ideally, the SVG used here should be in HTML and reference the SVG sprite + content: svg-uri( + '' + ); + vertical-align: middle; } .topic-meta-data { @@ -899,9 +886,6 @@ span.highlighted { /* Tablet (portrait) ----------- */ @media all and (max-width: 775px) { - .gutter { - display: none; - } .topic-avatar { width: 45px; } diff --git a/app/assets/stylesheets/desktop/topic.scss b/app/assets/stylesheets/desktop/topic.scss index cfcdbc1714d..d7a7ce8981e 100644 --- a/app/assets/stylesheets/desktop/topic.scss +++ b/app/assets/stylesheets/desktop/topic.scss @@ -102,7 +102,7 @@ button.full { width: 100%; margin-bottom: 5px; - i { + .d-icon { display: block; margin-top: 2px; margin-bottom: 2px; diff --git a/app/assets/stylesheets/desktop/user-card.scss b/app/assets/stylesheets/desktop/user-card.scss index 4000b275c43..54893e04e10 100644 --- a/app/assets/stylesheets/desktop/user-card.scss +++ b/app/assets/stylesheets/desktop/user-card.scss @@ -81,7 +81,7 @@ $user_card_background: $secondary; a { color: $user_card_primary; } - i { + .d-icon { font-size: $font-down-1; color: $user_card_primary; } @@ -185,7 +185,7 @@ $user_card_background: $secondary; max-width: 90%; overflow: hidden; align-items: baseline; - i { + .d-icon { margin-right: 0.25em; } } @@ -224,7 +224,7 @@ $user_card_background: $secondary; background-position: center; background-size: $size; color: $primary; - i { + .d-icon { margin: auto; font-size: $size / 1.5 !important; } diff --git a/app/assets/stylesheets/mobile/discourse.scss b/app/assets/stylesheets/mobile/discourse.scss index e211ebc25b7..cbfb4f62777 100644 --- a/app/assets/stylesheets/mobile/discourse.scss +++ b/app/assets/stylesheets/mobile/discourse.scss @@ -48,7 +48,7 @@ blockquote { display: inline-block; .topic-status { - i { + .d-icon { color: $secondary-high; } } diff --git a/app/assets/stylesheets/mobile/header.scss b/app/assets/stylesheets/mobile/header.scss index e4d2abb9040..5147d2c6570 100644 --- a/app/assets/stylesheets/mobile/header.scss +++ b/app/assets/stylesheets/mobile/header.scss @@ -54,6 +54,6 @@ display: none; } -.search-link .topic-statuses .topic-status i { +.search-link .topic-statuses .topic-status .d-icon { font-size: $font-0; } diff --git a/app/assets/stylesheets/mobile/topic-list.scss b/app/assets/stylesheets/mobile/topic-list.scss index ba1c8962169..319c94324b0 100644 --- a/app/assets/stylesheets/mobile/topic-list.scss +++ b/app/assets/stylesheets/mobile/topic-list.scss @@ -67,7 +67,7 @@ flex-wrap: wrap; width: 100%; .edit-category { - i { + .d-icon { margin: 0; } @media screen and (max-width: 374px) { @@ -162,7 +162,7 @@ font-size: $font-0; line-height: $line-height-small; padding: 0.15em 0.4em 0.2em 0.4em; - i { + .d-icon { color: $secondary; } @@ -276,7 +276,7 @@ tr.category-topic-link { display: inline-block; font-size: $font-up-2; margin: 0 0 0 10px; - i { + .d-icon { margin-right: 5px; } a[href] { diff --git a/app/assets/stylesheets/mobile/topic-post.scss b/app/assets/stylesheets/mobile/topic-post.scss index 9f3414436fc..e5126d27fd6 100644 --- a/app/assets/stylesheets/mobile/topic-post.scss +++ b/app/assets/stylesheets/mobile/topic-post.scss @@ -52,7 +52,7 @@ span.badge-posts { max-width: unset; margin-right: 0; padding: 8px 9px 8px 8px; - i { + .d-icon { padding-left: 8px; } } @@ -189,7 +189,7 @@ a.reply-to-tab { line-height: $line-height-medium; } .number, - i { + .d-icon { color: dark-light-choose($primary-high, $secondary-low); font-size: $font-up-1; } @@ -402,10 +402,6 @@ blockquote { padding: 0.25em 0; } -.gutter { - display: none; -} - .posts-wrapper { position: relative; } diff --git a/app/assets/stylesheets/mobile/topic.scss b/app/assets/stylesheets/mobile/topic.scss index d9870cce6cc..1a3c493c885 100644 --- a/app/assets/stylesheets/mobile/topic.scss +++ b/app/assets/stylesheets/mobile/topic.scss @@ -78,7 +78,7 @@ button.full { width: 100%; margin-bottom: 5px; - i { + .d-icon { display: block; margin-top: 2px; margin-bottom: 2px; diff --git a/app/assets/stylesheets/vendor/font_awesome/_animated.scss b/app/assets/stylesheets/vendor/font_awesome/_animated.scss deleted file mode 100644 index 8a020dbfff7..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_animated.scss +++ /dev/null @@ -1,34 +0,0 @@ -// Spinning Icons -// -------------------------- - -.#{$fa-css-prefix}-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} - -.#{$fa-css-prefix}-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} diff --git a/app/assets/stylesheets/vendor/font_awesome/_bordered-pulled.scss b/app/assets/stylesheets/vendor/font_awesome/_bordered-pulled.scss deleted file mode 100644 index d4b85a02f24..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_bordered-pulled.scss +++ /dev/null @@ -1,25 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.#{$fa-css-prefix}-border { - padding: .2em .25em .15em; - border: solid .08em $fa-border-color; - border-radius: .1em; -} - -.#{$fa-css-prefix}-pull-left { float: left; } -.#{$fa-css-prefix}-pull-right { float: right; } - -.#{$fa-css-prefix} { - &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } - &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } -} - -/* Deprecated as of 4.4.0 */ -.pull-right { float: right; } -.pull-left { float: left; } - -.#{$fa-css-prefix} { - &.pull-left { margin-right: .3em; } - &.pull-right { margin-left: .3em; } -} diff --git a/app/assets/stylesheets/vendor/font_awesome/_core.scss b/app/assets/stylesheets/vendor/font_awesome/_core.scss deleted file mode 100644 index 7425ef85fc8..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_core.scss +++ /dev/null @@ -1,12 +0,0 @@ -// Base Class Definition -// ------------------------- - -.#{$fa-css-prefix} { - display: inline-block; - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} diff --git a/app/assets/stylesheets/vendor/font_awesome/_fixed-width.scss b/app/assets/stylesheets/vendor/font_awesome/_fixed-width.scss deleted file mode 100644 index b221c98133a..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_fixed-width.scss +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.#{$fa-css-prefix}-fw { - width: (18em / 14); - text-align: center; -} diff --git a/app/assets/stylesheets/vendor/font_awesome/_icons.scss b/app/assets/stylesheets/vendor/font_awesome/_icons.scss deleted file mode 100644 index e63e702c4d9..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_icons.scss +++ /dev/null @@ -1,789 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - -.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } -.#{$fa-css-prefix}-music:before { content: $fa-var-music; } -.#{$fa-css-prefix}-search:before { content: $fa-var-search; } -.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } -.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } -.#{$fa-css-prefix}-star:before { content: $fa-var-star; } -.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } -.#{$fa-css-prefix}-user:before { content: $fa-var-user; } -.#{$fa-css-prefix}-film:before { content: $fa-var-film; } -.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } -.#{$fa-css-prefix}-th:before { content: $fa-var-th; } -.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } -.#{$fa-css-prefix}-check:before { content: $fa-var-check; } -.#{$fa-css-prefix}-remove:before, -.#{$fa-css-prefix}-close:before, -.#{$fa-css-prefix}-times:before { content: $fa-var-times; } -.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } -.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } -.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } -.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } -.#{$fa-css-prefix}-gear:before, -.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } -.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } -.#{$fa-css-prefix}-home:before { content: $fa-var-home; } -.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } -.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } -.#{$fa-css-prefix}-road:before { content: $fa-var-road; } -.#{$fa-css-prefix}-download:before { content: $fa-var-download; } -.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } -.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } -.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } -.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } -.#{$fa-css-prefix}-rotate-right:before, -.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } -.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } -.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } -.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } -.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } -.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } -.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } -.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } -.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } -.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } -.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } -.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } -.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } -.#{$fa-css-prefix}-book:before { content: $fa-var-book; } -.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } -.#{$fa-css-prefix}-print:before { content: $fa-var-print; } -.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } -.#{$fa-css-prefix}-font:before { content: $fa-var-font; } -.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } -.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } -.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } -.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } -.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } -.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } -.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } -.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } -.#{$fa-css-prefix}-list:before { content: $fa-var-list; } -.#{$fa-css-prefix}-dedent:before, -.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } -.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } -.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } -.#{$fa-css-prefix}-photo:before, -.#{$fa-css-prefix}-image:before, -.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } -.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } -.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } -.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } -.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } -.#{$fa-css-prefix}-edit:before, -.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } -.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } -.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } -.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } -.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } -.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } -.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } -.#{$fa-css-prefix}-play:before { content: $fa-var-play; } -.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } -.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } -.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } -.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } -.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } -.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } -.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } -.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } -.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } -.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } -.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } -.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } -.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } -.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } -.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } -.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } -.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } -.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } -.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } -.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } -.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } -.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } -.#{$fa-css-prefix}-mail-forward:before, -.#{$fa-css-prefix}-share:before { content: $fa-var-share; } -.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } -.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } -.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } -.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } -.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } -.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } -.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } -.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } -.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } -.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } -.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } -.#{$fa-css-prefix}-warning:before, -.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } -.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } -.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } -.#{$fa-css-prefix}-random:before { content: $fa-var-random; } -.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } -.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } -.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } -.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } -.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } -.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } -.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } -.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } -.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } -.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } -.#{$fa-css-prefix}-bar-chart-o:before, -.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } -.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } -.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } -.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } -.#{$fa-css-prefix}-key:before { content: $fa-var-key; } -.#{$fa-css-prefix}-gears:before, -.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } -.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } -.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } -.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } -.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } -.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } -.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } -.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } -.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } -.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } -.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } -.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } -.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } -.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } -.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } -.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } -.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } -.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } -.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } -.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } -.#{$fa-css-prefix}-facebook-f:before, -.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } -.#{$fa-css-prefix}-github:before { content: $fa-var-github; } -.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } -.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } -.#{$fa-css-prefix}-feed:before, -.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } -.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } -.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } -.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } -.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } -.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } -.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } -.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } -.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } -.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } -.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } -.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } -.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } -.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } -.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } -.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } -.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } -.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } -.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } -.#{$fa-css-prefix}-group:before, -.#{$fa-css-prefix}-users:before { content: $fa-var-users; } -.#{$fa-css-prefix}-chain:before, -.#{$fa-css-prefix}-link:before { content: $fa-var-link; } -.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } -.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } -.#{$fa-css-prefix}-cut:before, -.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } -.#{$fa-css-prefix}-copy:before, -.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } -.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } -.#{$fa-css-prefix}-save:before, -.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } -.#{$fa-css-prefix}-square:before { content: $fa-var-square; } -.#{$fa-css-prefix}-navicon:before, -.#{$fa-css-prefix}-reorder:before, -.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } -.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } -.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } -.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } -.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } -.#{$fa-css-prefix}-table:before { content: $fa-var-table; } -.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } -.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } -.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } -.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } -.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } -.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } -.#{$fa-css-prefix}-money:before { content: $fa-var-money; } -.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } -.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } -.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } -.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } -.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } -.#{$fa-css-prefix}-unsorted:before, -.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } -.#{$fa-css-prefix}-sort-down:before, -.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } -.#{$fa-css-prefix}-sort-up:before, -.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } -.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } -.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } -.#{$fa-css-prefix}-rotate-left:before, -.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } -.#{$fa-css-prefix}-legal:before, -.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } -.#{$fa-css-prefix}-dashboard:before, -.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } -.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } -.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } -.#{$fa-css-prefix}-flash:before, -.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } -.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } -.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } -.#{$fa-css-prefix}-paste:before, -.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } -.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } -.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } -.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } -.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } -.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } -.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } -.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } -.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } -.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } -.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } -.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } -.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } -.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } -.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } -.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } -.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } -.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } -.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } -.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } -.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } -.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } -.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } -.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } -.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } -.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } -.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } -.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } -.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } -.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } -.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } -.#{$fa-css-prefix}-mobile-phone:before, -.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } -.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } -.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } -.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } -.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } -.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } -.#{$fa-css-prefix}-mail-reply:before, -.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } -.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } -.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } -.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } -.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } -.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } -.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } -.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } -.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } -.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } -.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } -.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } -.#{$fa-css-prefix}-code:before { content: $fa-var-code; } -.#{$fa-css-prefix}-mail-reply-all:before, -.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } -.#{$fa-css-prefix}-star-half-empty:before, -.#{$fa-css-prefix}-star-half-full:before, -.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } -.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } -.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } -.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } -.#{$fa-css-prefix}-unlink:before, -.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } -.#{$fa-css-prefix}-question:before { content: $fa-var-question; } -.#{$fa-css-prefix}-info:before { content: $fa-var-info; } -.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } -.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } -.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } -.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } -.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } -.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } -.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } -.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } -.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } -.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } -.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } -.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } -.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } -.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } -.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } -.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } -.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } -.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } -.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } -.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } -.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } -.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } -.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } -.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } -.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } -.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } -.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } -.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } -.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } -.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } -.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } -.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } -.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } -.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } -.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } -.#{$fa-css-prefix}-toggle-down:before, -.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } -.#{$fa-css-prefix}-toggle-up:before, -.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } -.#{$fa-css-prefix}-toggle-right:before, -.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } -.#{$fa-css-prefix}-euro:before, -.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } -.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } -.#{$fa-css-prefix}-dollar:before, -.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } -.#{$fa-css-prefix}-rupee:before, -.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } -.#{$fa-css-prefix}-cny:before, -.#{$fa-css-prefix}-rmb:before, -.#{$fa-css-prefix}-yen:before, -.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } -.#{$fa-css-prefix}-ruble:before, -.#{$fa-css-prefix}-rouble:before, -.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } -.#{$fa-css-prefix}-won:before, -.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } -.#{$fa-css-prefix}-bitcoin:before, -.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } -.#{$fa-css-prefix}-file:before { content: $fa-var-file; } -.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } -.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } -.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } -.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } -.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } -.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } -.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } -.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } -.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } -.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } -.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } -.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } -.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } -.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } -.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } -.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } -.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } -.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } -.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } -.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } -.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } -.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } -.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } -.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } -.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } -.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } -.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } -.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } -.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } -.#{$fa-css-prefix}-android:before { content: $fa-var-android; } -.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } -.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } -.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } -.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } -.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } -.#{$fa-css-prefix}-female:before { content: $fa-var-female; } -.#{$fa-css-prefix}-male:before { content: $fa-var-male; } -.#{$fa-css-prefix}-gittip:before, -.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } -.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } -.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } -.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } -.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } -.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } -.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } -.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } -.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } -.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } -.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } -.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } -.#{$fa-css-prefix}-toggle-left:before, -.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } -.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } -.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } -.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } -.#{$fa-css-prefix}-turkish-lira:before, -.#{$fa-css-prefix}-try:before { content: $fa-var-try; } -.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } -.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } -.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } -.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } -.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } -.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } -.#{$fa-css-prefix}-institution:before, -.#{$fa-css-prefix}-bank:before, -.#{$fa-css-prefix}-university:before { content: $fa-var-university; } -.#{$fa-css-prefix}-mortar-board:before, -.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } -.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } -.#{$fa-css-prefix}-google:before { content: $fa-var-google; } -.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } -.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } -.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } -.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } -.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } -.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } -.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } -.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } -.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } -.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } -.#{$fa-css-prefix}-language:before { content: $fa-var-language; } -.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } -.#{$fa-css-prefix}-building:before { content: $fa-var-building; } -.#{$fa-css-prefix}-child:before { content: $fa-var-child; } -.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } -.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } -.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } -.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } -.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } -.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } -.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } -.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } -.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } -.#{$fa-css-prefix}-automobile:before, -.#{$fa-css-prefix}-car:before { content: $fa-var-car; } -.#{$fa-css-prefix}-cab:before, -.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } -.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } -.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } -.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } -.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } -.#{$fa-css-prefix}-database:before { content: $fa-var-database; } -.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } -.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } -.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } -.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } -.#{$fa-css-prefix}-file-photo-o:before, -.#{$fa-css-prefix}-file-picture-o:before, -.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } -.#{$fa-css-prefix}-file-zip-o:before, -.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } -.#{$fa-css-prefix}-file-sound-o:before, -.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } -.#{$fa-css-prefix}-file-movie-o:before, -.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } -.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } -.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } -.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } -.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } -.#{$fa-css-prefix}-life-bouy:before, -.#{$fa-css-prefix}-life-buoy:before, -.#{$fa-css-prefix}-life-saver:before, -.#{$fa-css-prefix}-support:before, -.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } -.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } -.#{$fa-css-prefix}-ra:before, -.#{$fa-css-prefix}-resistance:before, -.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } -.#{$fa-css-prefix}-ge:before, -.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } -.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } -.#{$fa-css-prefix}-git:before { content: $fa-var-git; } -.#{$fa-css-prefix}-y-combinator-square:before, -.#{$fa-css-prefix}-yc-square:before, -.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } -.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } -.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } -.#{$fa-css-prefix}-wechat:before, -.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } -.#{$fa-css-prefix}-send:before, -.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } -.#{$fa-css-prefix}-send-o:before, -.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } -.#{$fa-css-prefix}-history:before { content: $fa-var-history; } -.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } -.#{$fa-css-prefix}-header:before { content: $fa-var-header; } -.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } -.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } -.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } -.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } -.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } -.#{$fa-css-prefix}-soccer-ball-o:before, -.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } -.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } -.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } -.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } -.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } -.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } -.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } -.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } -.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } -.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } -.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } -.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } -.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } -.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } -.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } -.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } -.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } -.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } -.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } -.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } -.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } -.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } -.#{$fa-css-prefix}-at:before { content: $fa-var-at; } -.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } -.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } -.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } -.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } -.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } -.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } -.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } -.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } -.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } -.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } -.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } -.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } -.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } -.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } -.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } -.#{$fa-css-prefix}-shekel:before, -.#{$fa-css-prefix}-sheqel:before, -.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } -.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } -.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } -.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } -.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } -.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } -.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } -.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } -.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } -.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } -.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } -.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } -.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } -.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } -.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } -.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } -.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } -.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } -.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } -.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } -.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } -.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } -.#{$fa-css-prefix}-intersex:before, -.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } -.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } -.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } -.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } -.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } -.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } -.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } -.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } -.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } -.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } -.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } -.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } -.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } -.#{$fa-css-prefix}-server:before { content: $fa-var-server; } -.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } -.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } -.#{$fa-css-prefix}-hotel:before, -.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } -.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } -.#{$fa-css-prefix}-train:before { content: $fa-var-train; } -.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } -.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } -.#{$fa-css-prefix}-yc:before, -.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } -.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } -.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } -.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } -.#{$fa-css-prefix}-battery-4:before, -.#{$fa-css-prefix}-battery:before, -.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } -.#{$fa-css-prefix}-battery-3:before, -.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } -.#{$fa-css-prefix}-battery-2:before, -.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } -.#{$fa-css-prefix}-battery-1:before, -.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } -.#{$fa-css-prefix}-battery-0:before, -.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } -.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } -.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } -.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } -.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } -.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } -.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } -.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } -.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } -.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } -.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } -.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } -.#{$fa-css-prefix}-hourglass-1:before, -.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } -.#{$fa-css-prefix}-hourglass-2:before, -.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } -.#{$fa-css-prefix}-hourglass-3:before, -.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } -.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } -.#{$fa-css-prefix}-hand-grab-o:before, -.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } -.#{$fa-css-prefix}-hand-stop-o:before, -.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } -.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } -.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } -.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } -.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } -.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } -.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } -.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } -.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } -.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } -.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } -.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } -.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } -.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } -.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } -.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } -.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } -.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } -.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } -.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } -.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } -.#{$fa-css-prefix}-tv:before, -.#{$fa-css-prefix}-television:before { content: $fa-var-television; } -.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } -.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } -.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } -.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } -.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } -.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } -.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } -.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } -.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } -.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } -.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } -.#{$fa-css-prefix}-map:before { content: $fa-var-map; } -.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } -.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } -.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } -.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } -.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } -.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } -.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } -.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } -.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } -.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } -.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } -.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } -.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } -.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } -.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } -.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } -.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } -.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } -.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } -.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } -.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } -.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } -.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } -.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } -.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } -.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } -.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } -.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } -.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } -.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } -.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } -.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } -.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } -.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } -.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } -.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } -.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } -.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } -.#{$fa-css-prefix}-asl-interpreting:before, -.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } -.#{$fa-css-prefix}-deafness:before, -.#{$fa-css-prefix}-hard-of-hearing:before, -.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } -.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } -.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } -.#{$fa-css-prefix}-signing:before, -.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } -.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } -.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } -.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } -.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } -.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } -.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } -.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } -.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } -.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } -.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } -.#{$fa-css-prefix}-google-plus-circle:before, -.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } -.#{$fa-css-prefix}-fa:before, -.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } -.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } -.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } -.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } -.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } -.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } -.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } -.#{$fa-css-prefix}-vcard:before, -.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } -.#{$fa-css-prefix}-vcard-o:before, -.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } -.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } -.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } -.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } -.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } -.#{$fa-css-prefix}-drivers-license:before, -.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } -.#{$fa-css-prefix}-drivers-license-o:before, -.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } -.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } -.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } -.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } -.#{$fa-css-prefix}-thermometer-4:before, -.#{$fa-css-prefix}-thermometer:before, -.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } -.#{$fa-css-prefix}-thermometer-3:before, -.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } -.#{$fa-css-prefix}-thermometer-2:before, -.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } -.#{$fa-css-prefix}-thermometer-1:before, -.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } -.#{$fa-css-prefix}-thermometer-0:before, -.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } -.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } -.#{$fa-css-prefix}-bathtub:before, -.#{$fa-css-prefix}-s15:before, -.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } -.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } -.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } -.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } -.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } -.#{$fa-css-prefix}-times-rectangle:before, -.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } -.#{$fa-css-prefix}-times-rectangle-o:before, -.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } -.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } -.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } -.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } -.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } -.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } -.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } -.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } -.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } -.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } -.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } -.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/app/assets/stylesheets/vendor/font_awesome/_larger.scss b/app/assets/stylesheets/vendor/font_awesome/_larger.scss deleted file mode 100644 index 41e9a8184aa..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_larger.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Icon Sizes -// ------------------------- - -/* makes the font 33% larger relative to the icon container */ -.#{$fa-css-prefix}-lg { - font-size: (4em / 3); - line-height: (3em / 4); - vertical-align: -15%; -} -.#{$fa-css-prefix}-2x { font-size: 2em; } -.#{$fa-css-prefix}-3x { font-size: 3em; } -.#{$fa-css-prefix}-4x { font-size: 4em; } -.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/app/assets/stylesheets/vendor/font_awesome/_list.scss b/app/assets/stylesheets/vendor/font_awesome/_list.scss deleted file mode 100644 index 7d1e4d54d6c..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_list.scss +++ /dev/null @@ -1,19 +0,0 @@ -// List Icons -// ------------------------- - -.#{$fa-css-prefix}-ul { - padding-left: 0; - margin-left: $fa-li-width; - list-style-type: none; - > li { position: relative; } -} -.#{$fa-css-prefix}-li { - position: absolute; - left: -$fa-li-width; - width: $fa-li-width; - top: (2em / 14); - text-align: center; - &.#{$fa-css-prefix}-lg { - left: -$fa-li-width + (4em / 14); - } -} diff --git a/app/assets/stylesheets/vendor/font_awesome/_mixins.scss b/app/assets/stylesheets/vendor/font_awesome/_mixins.scss deleted file mode 100644 index c3bbd5745d3..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_mixins.scss +++ /dev/null @@ -1,60 +0,0 @@ -// Mixins -// -------------------------- - -@mixin fa-icon() { - display: inline-block; - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} - -@mixin fa-icon-rotate($degrees, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; - -webkit-transform: rotate($degrees); - -ms-transform: rotate($degrees); - transform: rotate($degrees); -} - -@mixin fa-icon-flip($horiz, $vert, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; - -webkit-transform: scale($horiz, $vert); - -ms-transform: scale($horiz, $vert); - transform: scale($horiz, $vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -@mixin sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - border: 0; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -@mixin sr-only-focusable { - &:active, - &:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; - } -} diff --git a/app/assets/stylesheets/vendor/font_awesome/_path.scss b/app/assets/stylesheets/vendor/font_awesome/_path.scss deleted file mode 100644 index bb457c23a8e..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_path.scss +++ /dev/null @@ -1,15 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); - src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), - url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), - url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), - url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), - url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); -// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; -} diff --git a/app/assets/stylesheets/vendor/font_awesome/_rotated-flipped.scss b/app/assets/stylesheets/vendor/font_awesome/_rotated-flipped.scss deleted file mode 100644 index a3558fd09ca..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_rotated-flipped.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } -.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } -.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } - -.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } -.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root .#{$fa-css-prefix}-rotate-90, -:root .#{$fa-css-prefix}-rotate-180, -:root .#{$fa-css-prefix}-rotate-270, -:root .#{$fa-css-prefix}-flip-horizontal, -:root .#{$fa-css-prefix}-flip-vertical { - filter: none; -} diff --git a/app/assets/stylesheets/vendor/font_awesome/_screen-reader.scss b/app/assets/stylesheets/vendor/font_awesome/_screen-reader.scss deleted file mode 100644 index 637426f0da6..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_screen-reader.scss +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { @include sr-only(); } -.sr-only-focusable { @include sr-only-focusable(); } diff --git a/app/assets/stylesheets/vendor/font_awesome/_stacked.scss b/app/assets/stylesheets/vendor/font_awesome/_stacked.scss deleted file mode 100644 index aef7403660c..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_stacked.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.#{$fa-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.#{$fa-css-prefix}-stack-1x { line-height: inherit; } -.#{$fa-css-prefix}-stack-2x { font-size: 2em; } -.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/app/assets/stylesheets/vendor/font_awesome/_variables.scss b/app/assets/stylesheets/vendor/font_awesome/_variables.scss deleted file mode 100644 index 498fc4a087c..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/_variables.scss +++ /dev/null @@ -1,800 +0,0 @@ -// Variables -// -------------------------- - -$fa-font-path: "../fonts" !default; -$fa-font-size-base: 14px !default; -$fa-line-height-base: 1 !default; -//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly -$fa-css-prefix: fa !default; -$fa-version: "4.7.0" !default; -$fa-border-color: #eee !default; -$fa-inverse: #fff !default; -$fa-li-width: (30em / 14) !default; - -$fa-var-500px: "\f26e"; -$fa-var-address-book: "\f2b9"; -$fa-var-address-book-o: "\f2ba"; -$fa-var-address-card: "\f2bb"; -$fa-var-address-card-o: "\f2bc"; -$fa-var-adjust: "\f042"; -$fa-var-adn: "\f170"; -$fa-var-align-center: "\f037"; -$fa-var-align-justify: "\f039"; -$fa-var-align-left: "\f036"; -$fa-var-align-right: "\f038"; -$fa-var-amazon: "\f270"; -$fa-var-ambulance: "\f0f9"; -$fa-var-american-sign-language-interpreting: "\f2a3"; -$fa-var-anchor: "\f13d"; -$fa-var-android: "\f17b"; -$fa-var-angellist: "\f209"; -$fa-var-angle-double-down: "\f103"; -$fa-var-angle-double-left: "\f100"; -$fa-var-angle-double-right: "\f101"; -$fa-var-angle-double-up: "\f102"; -$fa-var-angle-down: "\f107"; -$fa-var-angle-left: "\f104"; -$fa-var-angle-right: "\f105"; -$fa-var-angle-up: "\f106"; -$fa-var-apple: "\f179"; -$fa-var-archive: "\f187"; -$fa-var-area-chart: "\f1fe"; -$fa-var-arrow-circle-down: "\f0ab"; -$fa-var-arrow-circle-left: "\f0a8"; -$fa-var-arrow-circle-o-down: "\f01a"; -$fa-var-arrow-circle-o-left: "\f190"; -$fa-var-arrow-circle-o-right: "\f18e"; -$fa-var-arrow-circle-o-up: "\f01b"; -$fa-var-arrow-circle-right: "\f0a9"; -$fa-var-arrow-circle-up: "\f0aa"; -$fa-var-arrow-down: "\f063"; -$fa-var-arrow-left: "\f060"; -$fa-var-arrow-right: "\f061"; -$fa-var-arrow-up: "\f062"; -$fa-var-arrows: "\f047"; -$fa-var-arrows-alt: "\f0b2"; -$fa-var-arrows-h: "\f07e"; -$fa-var-arrows-v: "\f07d"; -$fa-var-asl-interpreting: "\f2a3"; -$fa-var-assistive-listening-systems: "\f2a2"; -$fa-var-asterisk: "\f069"; -$fa-var-at: "\f1fa"; -$fa-var-audio-description: "\f29e"; -$fa-var-automobile: "\f1b9"; -$fa-var-backward: "\f04a"; -$fa-var-balance-scale: "\f24e"; -$fa-var-ban: "\f05e"; -$fa-var-bandcamp: "\f2d5"; -$fa-var-bank: "\f19c"; -$fa-var-bar-chart: "\f080"; -$fa-var-bar-chart-o: "\f080"; -$fa-var-barcode: "\f02a"; -$fa-var-bars: "\f0c9"; -$fa-var-bath: "\f2cd"; -$fa-var-bathtub: "\f2cd"; -$fa-var-battery: "\f240"; -$fa-var-battery-0: "\f244"; -$fa-var-battery-1: "\f243"; -$fa-var-battery-2: "\f242"; -$fa-var-battery-3: "\f241"; -$fa-var-battery-4: "\f240"; -$fa-var-battery-empty: "\f244"; -$fa-var-battery-full: "\f240"; -$fa-var-battery-half: "\f242"; -$fa-var-battery-quarter: "\f243"; -$fa-var-battery-three-quarters: "\f241"; -$fa-var-bed: "\f236"; -$fa-var-beer: "\f0fc"; -$fa-var-behance: "\f1b4"; -$fa-var-behance-square: "\f1b5"; -$fa-var-bell: "\f0f3"; -$fa-var-bell-o: "\f0a2"; -$fa-var-bell-slash: "\f1f6"; -$fa-var-bell-slash-o: "\f1f7"; -$fa-var-bicycle: "\f206"; -$fa-var-binoculars: "\f1e5"; -$fa-var-birthday-cake: "\f1fd"; -$fa-var-bitbucket: "\f171"; -$fa-var-bitbucket-square: "\f172"; -$fa-var-bitcoin: "\f15a"; -$fa-var-black-tie: "\f27e"; -$fa-var-blind: "\f29d"; -$fa-var-bluetooth: "\f293"; -$fa-var-bluetooth-b: "\f294"; -$fa-var-bold: "\f032"; -$fa-var-bolt: "\f0e7"; -$fa-var-bomb: "\f1e2"; -$fa-var-book: "\f02d"; -$fa-var-bookmark: "\f02e"; -$fa-var-bookmark-o: "\f097"; -$fa-var-braille: "\f2a1"; -$fa-var-briefcase: "\f0b1"; -$fa-var-btc: "\f15a"; -$fa-var-bug: "\f188"; -$fa-var-building: "\f1ad"; -$fa-var-building-o: "\f0f7"; -$fa-var-bullhorn: "\f0a1"; -$fa-var-bullseye: "\f140"; -$fa-var-bus: "\f207"; -$fa-var-buysellads: "\f20d"; -$fa-var-cab: "\f1ba"; -$fa-var-calculator: "\f1ec"; -$fa-var-calendar: "\f073"; -$fa-var-calendar-check-o: "\f274"; -$fa-var-calendar-minus-o: "\f272"; -$fa-var-calendar-o: "\f133"; -$fa-var-calendar-plus-o: "\f271"; -$fa-var-calendar-times-o: "\f273"; -$fa-var-camera: "\f030"; -$fa-var-camera-retro: "\f083"; -$fa-var-car: "\f1b9"; -$fa-var-caret-down: "\f0d7"; -$fa-var-caret-left: "\f0d9"; -$fa-var-caret-right: "\f0da"; -$fa-var-caret-square-o-down: "\f150"; -$fa-var-caret-square-o-left: "\f191"; -$fa-var-caret-square-o-right: "\f152"; -$fa-var-caret-square-o-up: "\f151"; -$fa-var-caret-up: "\f0d8"; -$fa-var-cart-arrow-down: "\f218"; -$fa-var-cart-plus: "\f217"; -$fa-var-cc: "\f20a"; -$fa-var-cc-amex: "\f1f3"; -$fa-var-cc-diners-club: "\f24c"; -$fa-var-cc-discover: "\f1f2"; -$fa-var-cc-jcb: "\f24b"; -$fa-var-cc-mastercard: "\f1f1"; -$fa-var-cc-paypal: "\f1f4"; -$fa-var-cc-stripe: "\f1f5"; -$fa-var-cc-visa: "\f1f0"; -$fa-var-certificate: "\f0a3"; -$fa-var-chain: "\f0c1"; -$fa-var-chain-broken: "\f127"; -$fa-var-check: "\f00c"; -$fa-var-check-circle: "\f058"; -$fa-var-check-circle-o: "\f05d"; -$fa-var-check-square: "\f14a"; -$fa-var-check-square-o: "\f046"; -$fa-var-chevron-circle-down: "\f13a"; -$fa-var-chevron-circle-left: "\f137"; -$fa-var-chevron-circle-right: "\f138"; -$fa-var-chevron-circle-up: "\f139"; -$fa-var-chevron-down: "\f078"; -$fa-var-chevron-left: "\f053"; -$fa-var-chevron-right: "\f054"; -$fa-var-chevron-up: "\f077"; -$fa-var-child: "\f1ae"; -$fa-var-chrome: "\f268"; -$fa-var-circle: "\f111"; -$fa-var-circle-o: "\f10c"; -$fa-var-circle-o-notch: "\f1ce"; -$fa-var-circle-thin: "\f1db"; -$fa-var-clipboard: "\f0ea"; -$fa-var-clock-o: "\f017"; -$fa-var-clone: "\f24d"; -$fa-var-close: "\f00d"; -$fa-var-cloud: "\f0c2"; -$fa-var-cloud-download: "\f0ed"; -$fa-var-cloud-upload: "\f0ee"; -$fa-var-cny: "\f157"; -$fa-var-code: "\f121"; -$fa-var-code-fork: "\f126"; -$fa-var-codepen: "\f1cb"; -$fa-var-codiepie: "\f284"; -$fa-var-coffee: "\f0f4"; -$fa-var-cog: "\f013"; -$fa-var-cogs: "\f085"; -$fa-var-columns: "\f0db"; -$fa-var-comment: "\f075"; -$fa-var-comment-o: "\f0e5"; -$fa-var-commenting: "\f27a"; -$fa-var-commenting-o: "\f27b"; -$fa-var-comments: "\f086"; -$fa-var-comments-o: "\f0e6"; -$fa-var-compass: "\f14e"; -$fa-var-compress: "\f066"; -$fa-var-connectdevelop: "\f20e"; -$fa-var-contao: "\f26d"; -$fa-var-copy: "\f0c5"; -$fa-var-copyright: "\f1f9"; -$fa-var-creative-commons: "\f25e"; -$fa-var-credit-card: "\f09d"; -$fa-var-credit-card-alt: "\f283"; -$fa-var-crop: "\f125"; -$fa-var-crosshairs: "\f05b"; -$fa-var-css3: "\f13c"; -$fa-var-cube: "\f1b2"; -$fa-var-cubes: "\f1b3"; -$fa-var-cut: "\f0c4"; -$fa-var-cutlery: "\f0f5"; -$fa-var-dashboard: "\f0e4"; -$fa-var-dashcube: "\f210"; -$fa-var-database: "\f1c0"; -$fa-var-deaf: "\f2a4"; -$fa-var-deafness: "\f2a4"; -$fa-var-dedent: "\f03b"; -$fa-var-delicious: "\f1a5"; -$fa-var-desktop: "\f108"; -$fa-var-deviantart: "\f1bd"; -$fa-var-diamond: "\f219"; -$fa-var-digg: "\f1a6"; -$fa-var-dollar: "\f155"; -$fa-var-dot-circle-o: "\f192"; -$fa-var-download: "\f019"; -$fa-var-dribbble: "\f17d"; -$fa-var-drivers-license: "\f2c2"; -$fa-var-drivers-license-o: "\f2c3"; -$fa-var-dropbox: "\f16b"; -$fa-var-drupal: "\f1a9"; -$fa-var-edge: "\f282"; -$fa-var-edit: "\f044"; -$fa-var-eercast: "\f2da"; -$fa-var-eject: "\f052"; -$fa-var-ellipsis-h: "\f141"; -$fa-var-ellipsis-v: "\f142"; -$fa-var-empire: "\f1d1"; -$fa-var-envelope: "\f0e0"; -$fa-var-envelope-o: "\f003"; -$fa-var-envelope-open: "\f2b6"; -$fa-var-envelope-open-o: "\f2b7"; -$fa-var-envelope-square: "\f199"; -$fa-var-envira: "\f299"; -$fa-var-eraser: "\f12d"; -$fa-var-etsy: "\f2d7"; -$fa-var-eur: "\f153"; -$fa-var-euro: "\f153"; -$fa-var-exchange: "\f0ec"; -$fa-var-exclamation: "\f12a"; -$fa-var-exclamation-circle: "\f06a"; -$fa-var-exclamation-triangle: "\f071"; -$fa-var-expand: "\f065"; -$fa-var-expeditedssl: "\f23e"; -$fa-var-external-link: "\f08e"; -$fa-var-external-link-square: "\f14c"; -$fa-var-eye: "\f06e"; -$fa-var-eye-slash: "\f070"; -$fa-var-eyedropper: "\f1fb"; -$fa-var-fa: "\f2b4"; -$fa-var-facebook: "\f09a"; -$fa-var-facebook-f: "\f09a"; -$fa-var-facebook-official: "\f230"; -$fa-var-facebook-square: "\f082"; -$fa-var-fast-backward: "\f049"; -$fa-var-fast-forward: "\f050"; -$fa-var-fax: "\f1ac"; -$fa-var-feed: "\f09e"; -$fa-var-female: "\f182"; -$fa-var-fighter-jet: "\f0fb"; -$fa-var-file: "\f15b"; -$fa-var-file-archive-o: "\f1c6"; -$fa-var-file-audio-o: "\f1c7"; -$fa-var-file-code-o: "\f1c9"; -$fa-var-file-excel-o: "\f1c3"; -$fa-var-file-image-o: "\f1c5"; -$fa-var-file-movie-o: "\f1c8"; -$fa-var-file-o: "\f016"; -$fa-var-file-pdf-o: "\f1c1"; -$fa-var-file-photo-o: "\f1c5"; -$fa-var-file-picture-o: "\f1c5"; -$fa-var-file-powerpoint-o: "\f1c4"; -$fa-var-file-sound-o: "\f1c7"; -$fa-var-file-text: "\f15c"; -$fa-var-file-text-o: "\f0f6"; -$fa-var-file-video-o: "\f1c8"; -$fa-var-file-word-o: "\f1c2"; -$fa-var-file-zip-o: "\f1c6"; -$fa-var-files-o: "\f0c5"; -$fa-var-film: "\f008"; -$fa-var-filter: "\f0b0"; -$fa-var-fire: "\f06d"; -$fa-var-fire-extinguisher: "\f134"; -$fa-var-firefox: "\f269"; -$fa-var-first-order: "\f2b0"; -$fa-var-flag: "\f024"; -$fa-var-flag-checkered: "\f11e"; -$fa-var-flag-o: "\f11d"; -$fa-var-flash: "\f0e7"; -$fa-var-flask: "\f0c3"; -$fa-var-flickr: "\f16e"; -$fa-var-floppy-o: "\f0c7"; -$fa-var-folder: "\f07b"; -$fa-var-folder-o: "\f114"; -$fa-var-folder-open: "\f07c"; -$fa-var-folder-open-o: "\f115"; -$fa-var-font: "\f031"; -$fa-var-font-awesome: "\f2b4"; -$fa-var-fonticons: "\f280"; -$fa-var-fort-awesome: "\f286"; -$fa-var-forumbee: "\f211"; -$fa-var-forward: "\f04e"; -$fa-var-foursquare: "\f180"; -$fa-var-free-code-camp: "\f2c5"; -$fa-var-frown-o: "\f119"; -$fa-var-futbol-o: "\f1e3"; -$fa-var-gamepad: "\f11b"; -$fa-var-gavel: "\f0e3"; -$fa-var-gbp: "\f154"; -$fa-var-ge: "\f1d1"; -$fa-var-gear: "\f013"; -$fa-var-gears: "\f085"; -$fa-var-genderless: "\f22d"; -$fa-var-get-pocket: "\f265"; -$fa-var-gg: "\f260"; -$fa-var-gg-circle: "\f261"; -$fa-var-gift: "\f06b"; -$fa-var-git: "\f1d3"; -$fa-var-git-square: "\f1d2"; -$fa-var-github: "\f09b"; -$fa-var-github-alt: "\f113"; -$fa-var-github-square: "\f092"; -$fa-var-gitlab: "\f296"; -$fa-var-gittip: "\f184"; -$fa-var-glass: "\f000"; -$fa-var-glide: "\f2a5"; -$fa-var-glide-g: "\f2a6"; -$fa-var-globe: "\f0ac"; -$fa-var-google: "\f1a0"; -$fa-var-google-plus: "\f0d5"; -$fa-var-google-plus-circle: "\f2b3"; -$fa-var-google-plus-official: "\f2b3"; -$fa-var-google-plus-square: "\f0d4"; -$fa-var-google-wallet: "\f1ee"; -$fa-var-graduation-cap: "\f19d"; -$fa-var-gratipay: "\f184"; -$fa-var-grav: "\f2d6"; -$fa-var-group: "\f0c0"; -$fa-var-h-square: "\f0fd"; -$fa-var-hacker-news: "\f1d4"; -$fa-var-hand-grab-o: "\f255"; -$fa-var-hand-lizard-o: "\f258"; -$fa-var-hand-o-down: "\f0a7"; -$fa-var-hand-o-left: "\f0a5"; -$fa-var-hand-o-right: "\f0a4"; -$fa-var-hand-o-up: "\f0a6"; -$fa-var-hand-paper-o: "\f256"; -$fa-var-hand-peace-o: "\f25b"; -$fa-var-hand-pointer-o: "\f25a"; -$fa-var-hand-rock-o: "\f255"; -$fa-var-hand-scissors-o: "\f257"; -$fa-var-hand-spock-o: "\f259"; -$fa-var-hand-stop-o: "\f256"; -$fa-var-handshake-o: "\f2b5"; -$fa-var-hard-of-hearing: "\f2a4"; -$fa-var-hashtag: "\f292"; -$fa-var-hdd-o: "\f0a0"; -$fa-var-header: "\f1dc"; -$fa-var-headphones: "\f025"; -$fa-var-heart: "\f004"; -$fa-var-heart-o: "\f08a"; -$fa-var-heartbeat: "\f21e"; -$fa-var-history: "\f1da"; -$fa-var-home: "\f015"; -$fa-var-hospital-o: "\f0f8"; -$fa-var-hotel: "\f236"; -$fa-var-hourglass: "\f254"; -$fa-var-hourglass-1: "\f251"; -$fa-var-hourglass-2: "\f252"; -$fa-var-hourglass-3: "\f253"; -$fa-var-hourglass-end: "\f253"; -$fa-var-hourglass-half: "\f252"; -$fa-var-hourglass-o: "\f250"; -$fa-var-hourglass-start: "\f251"; -$fa-var-houzz: "\f27c"; -$fa-var-html5: "\f13b"; -$fa-var-i-cursor: "\f246"; -$fa-var-id-badge: "\f2c1"; -$fa-var-id-card: "\f2c2"; -$fa-var-id-card-o: "\f2c3"; -$fa-var-ils: "\f20b"; -$fa-var-image: "\f03e"; -$fa-var-imdb: "\f2d8"; -$fa-var-inbox: "\f01c"; -$fa-var-indent: "\f03c"; -$fa-var-industry: "\f275"; -$fa-var-info: "\f129"; -$fa-var-info-circle: "\f05a"; -$fa-var-inr: "\f156"; -$fa-var-instagram: "\f16d"; -$fa-var-institution: "\f19c"; -$fa-var-internet-explorer: "\f26b"; -$fa-var-intersex: "\f224"; -$fa-var-ioxhost: "\f208"; -$fa-var-italic: "\f033"; -$fa-var-joomla: "\f1aa"; -$fa-var-jpy: "\f157"; -$fa-var-jsfiddle: "\f1cc"; -$fa-var-key: "\f084"; -$fa-var-keyboard-o: "\f11c"; -$fa-var-krw: "\f159"; -$fa-var-language: "\f1ab"; -$fa-var-laptop: "\f109"; -$fa-var-lastfm: "\f202"; -$fa-var-lastfm-square: "\f203"; -$fa-var-leaf: "\f06c"; -$fa-var-leanpub: "\f212"; -$fa-var-legal: "\f0e3"; -$fa-var-lemon-o: "\f094"; -$fa-var-level-down: "\f149"; -$fa-var-level-up: "\f148"; -$fa-var-life-bouy: "\f1cd"; -$fa-var-life-buoy: "\f1cd"; -$fa-var-life-ring: "\f1cd"; -$fa-var-life-saver: "\f1cd"; -$fa-var-lightbulb-o: "\f0eb"; -$fa-var-line-chart: "\f201"; -$fa-var-link: "\f0c1"; -$fa-var-linkedin: "\f0e1"; -$fa-var-linkedin-square: "\f08c"; -$fa-var-linode: "\f2b8"; -$fa-var-linux: "\f17c"; -$fa-var-list: "\f03a"; -$fa-var-list-alt: "\f022"; -$fa-var-list-ol: "\f0cb"; -$fa-var-list-ul: "\f0ca"; -$fa-var-location-arrow: "\f124"; -$fa-var-lock: "\f023"; -$fa-var-long-arrow-down: "\f175"; -$fa-var-long-arrow-left: "\f177"; -$fa-var-long-arrow-right: "\f178"; -$fa-var-long-arrow-up: "\f176"; -$fa-var-low-vision: "\f2a8"; -$fa-var-magic: "\f0d0"; -$fa-var-magnet: "\f076"; -$fa-var-mail-forward: "\f064"; -$fa-var-mail-reply: "\f112"; -$fa-var-mail-reply-all: "\f122"; -$fa-var-male: "\f183"; -$fa-var-map: "\f279"; -$fa-var-map-marker: "\f041"; -$fa-var-map-o: "\f278"; -$fa-var-map-pin: "\f276"; -$fa-var-map-signs: "\f277"; -$fa-var-mars: "\f222"; -$fa-var-mars-double: "\f227"; -$fa-var-mars-stroke: "\f229"; -$fa-var-mars-stroke-h: "\f22b"; -$fa-var-mars-stroke-v: "\f22a"; -$fa-var-maxcdn: "\f136"; -$fa-var-meanpath: "\f20c"; -$fa-var-medium: "\f23a"; -$fa-var-medkit: "\f0fa"; -$fa-var-meetup: "\f2e0"; -$fa-var-meh-o: "\f11a"; -$fa-var-mercury: "\f223"; -$fa-var-microchip: "\f2db"; -$fa-var-microphone: "\f130"; -$fa-var-microphone-slash: "\f131"; -$fa-var-minus: "\f068"; -$fa-var-minus-circle: "\f056"; -$fa-var-minus-square: "\f146"; -$fa-var-minus-square-o: "\f147"; -$fa-var-mixcloud: "\f289"; -$fa-var-mobile: "\f10b"; -$fa-var-mobile-phone: "\f10b"; -$fa-var-modx: "\f285"; -$fa-var-money: "\f0d6"; -$fa-var-moon-o: "\f186"; -$fa-var-mortar-board: "\f19d"; -$fa-var-motorcycle: "\f21c"; -$fa-var-mouse-pointer: "\f245"; -$fa-var-music: "\f001"; -$fa-var-navicon: "\f0c9"; -$fa-var-neuter: "\f22c"; -$fa-var-newspaper-o: "\f1ea"; -$fa-var-object-group: "\f247"; -$fa-var-object-ungroup: "\f248"; -$fa-var-odnoklassniki: "\f263"; -$fa-var-odnoklassniki-square: "\f264"; -$fa-var-opencart: "\f23d"; -$fa-var-openid: "\f19b"; -$fa-var-opera: "\f26a"; -$fa-var-optin-monster: "\f23c"; -$fa-var-outdent: "\f03b"; -$fa-var-pagelines: "\f18c"; -$fa-var-paint-brush: "\f1fc"; -$fa-var-paper-plane: "\f1d8"; -$fa-var-paper-plane-o: "\f1d9"; -$fa-var-paperclip: "\f0c6"; -$fa-var-paragraph: "\f1dd"; -$fa-var-paste: "\f0ea"; -$fa-var-pause: "\f04c"; -$fa-var-pause-circle: "\f28b"; -$fa-var-pause-circle-o: "\f28c"; -$fa-var-paw: "\f1b0"; -$fa-var-paypal: "\f1ed"; -$fa-var-pencil: "\f040"; -$fa-var-pencil-square: "\f14b"; -$fa-var-pencil-square-o: "\f044"; -$fa-var-percent: "\f295"; -$fa-var-phone: "\f095"; -$fa-var-phone-square: "\f098"; -$fa-var-photo: "\f03e"; -$fa-var-picture-o: "\f03e"; -$fa-var-pie-chart: "\f200"; -$fa-var-pied-piper: "\f2ae"; -$fa-var-pied-piper-alt: "\f1a8"; -$fa-var-pied-piper-pp: "\f1a7"; -$fa-var-pinterest: "\f0d2"; -$fa-var-pinterest-p: "\f231"; -$fa-var-pinterest-square: "\f0d3"; -$fa-var-plane: "\f072"; -$fa-var-play: "\f04b"; -$fa-var-play-circle: "\f144"; -$fa-var-play-circle-o: "\f01d"; -$fa-var-plug: "\f1e6"; -$fa-var-plus: "\f067"; -$fa-var-plus-circle: "\f055"; -$fa-var-plus-square: "\f0fe"; -$fa-var-plus-square-o: "\f196"; -$fa-var-podcast: "\f2ce"; -$fa-var-power-off: "\f011"; -$fa-var-print: "\f02f"; -$fa-var-product-hunt: "\f288"; -$fa-var-puzzle-piece: "\f12e"; -$fa-var-qq: "\f1d6"; -$fa-var-qrcode: "\f029"; -$fa-var-question: "\f128"; -$fa-var-question-circle: "\f059"; -$fa-var-question-circle-o: "\f29c"; -$fa-var-quora: "\f2c4"; -$fa-var-quote-left: "\f10d"; -$fa-var-quote-right: "\f10e"; -$fa-var-ra: "\f1d0"; -$fa-var-random: "\f074"; -$fa-var-ravelry: "\f2d9"; -$fa-var-rebel: "\f1d0"; -$fa-var-recycle: "\f1b8"; -$fa-var-reddit: "\f1a1"; -$fa-var-reddit-alien: "\f281"; -$fa-var-reddit-square: "\f1a2"; -$fa-var-refresh: "\f021"; -$fa-var-registered: "\f25d"; -$fa-var-remove: "\f00d"; -$fa-var-renren: "\f18b"; -$fa-var-reorder: "\f0c9"; -$fa-var-repeat: "\f01e"; -$fa-var-reply: "\f112"; -$fa-var-reply-all: "\f122"; -$fa-var-resistance: "\f1d0"; -$fa-var-retweet: "\f079"; -$fa-var-rmb: "\f157"; -$fa-var-road: "\f018"; -$fa-var-rocket: "\f135"; -$fa-var-rotate-left: "\f0e2"; -$fa-var-rotate-right: "\f01e"; -$fa-var-rouble: "\f158"; -$fa-var-rss: "\f09e"; -$fa-var-rss-square: "\f143"; -$fa-var-rub: "\f158"; -$fa-var-ruble: "\f158"; -$fa-var-rupee: "\f156"; -$fa-var-s15: "\f2cd"; -$fa-var-safari: "\f267"; -$fa-var-save: "\f0c7"; -$fa-var-scissors: "\f0c4"; -$fa-var-scribd: "\f28a"; -$fa-var-search: "\f002"; -$fa-var-search-minus: "\f010"; -$fa-var-search-plus: "\f00e"; -$fa-var-sellsy: "\f213"; -$fa-var-send: "\f1d8"; -$fa-var-send-o: "\f1d9"; -$fa-var-server: "\f233"; -$fa-var-share: "\f064"; -$fa-var-share-alt: "\f1e0"; -$fa-var-share-alt-square: "\f1e1"; -$fa-var-share-square: "\f14d"; -$fa-var-share-square-o: "\f045"; -$fa-var-shekel: "\f20b"; -$fa-var-sheqel: "\f20b"; -$fa-var-shield: "\f132"; -$fa-var-ship: "\f21a"; -$fa-var-shirtsinbulk: "\f214"; -$fa-var-shopping-bag: "\f290"; -$fa-var-shopping-basket: "\f291"; -$fa-var-shopping-cart: "\f07a"; -$fa-var-shower: "\f2cc"; -$fa-var-sign-in: "\f090"; -$fa-var-sign-language: "\f2a7"; -$fa-var-sign-out: "\f08b"; -$fa-var-signal: "\f012"; -$fa-var-signing: "\f2a7"; -$fa-var-simplybuilt: "\f215"; -$fa-var-sitemap: "\f0e8"; -$fa-var-skyatlas: "\f216"; -$fa-var-skype: "\f17e"; -$fa-var-slack: "\f198"; -$fa-var-sliders: "\f1de"; -$fa-var-slideshare: "\f1e7"; -$fa-var-smile-o: "\f118"; -$fa-var-snapchat: "\f2ab"; -$fa-var-snapchat-ghost: "\f2ac"; -$fa-var-snapchat-square: "\f2ad"; -$fa-var-snowflake-o: "\f2dc"; -$fa-var-soccer-ball-o: "\f1e3"; -$fa-var-sort: "\f0dc"; -$fa-var-sort-alpha-asc: "\f15d"; -$fa-var-sort-alpha-desc: "\f15e"; -$fa-var-sort-amount-asc: "\f160"; -$fa-var-sort-amount-desc: "\f161"; -$fa-var-sort-asc: "\f0de"; -$fa-var-sort-desc: "\f0dd"; -$fa-var-sort-down: "\f0dd"; -$fa-var-sort-numeric-asc: "\f162"; -$fa-var-sort-numeric-desc: "\f163"; -$fa-var-sort-up: "\f0de"; -$fa-var-soundcloud: "\f1be"; -$fa-var-space-shuttle: "\f197"; -$fa-var-spinner: "\f110"; -$fa-var-spoon: "\f1b1"; -$fa-var-spotify: "\f1bc"; -$fa-var-square: "\f0c8"; -$fa-var-square-o: "\f096"; -$fa-var-stack-exchange: "\f18d"; -$fa-var-stack-overflow: "\f16c"; -$fa-var-star: "\f005"; -$fa-var-star-half: "\f089"; -$fa-var-star-half-empty: "\f123"; -$fa-var-star-half-full: "\f123"; -$fa-var-star-half-o: "\f123"; -$fa-var-star-o: "\f006"; -$fa-var-steam: "\f1b6"; -$fa-var-steam-square: "\f1b7"; -$fa-var-step-backward: "\f048"; -$fa-var-step-forward: "\f051"; -$fa-var-stethoscope: "\f0f1"; -$fa-var-sticky-note: "\f249"; -$fa-var-sticky-note-o: "\f24a"; -$fa-var-stop: "\f04d"; -$fa-var-stop-circle: "\f28d"; -$fa-var-stop-circle-o: "\f28e"; -$fa-var-street-view: "\f21d"; -$fa-var-strikethrough: "\f0cc"; -$fa-var-stumbleupon: "\f1a4"; -$fa-var-stumbleupon-circle: "\f1a3"; -$fa-var-subscript: "\f12c"; -$fa-var-subway: "\f239"; -$fa-var-suitcase: "\f0f2"; -$fa-var-sun-o: "\f185"; -$fa-var-superpowers: "\f2dd"; -$fa-var-superscript: "\f12b"; -$fa-var-support: "\f1cd"; -$fa-var-table: "\f0ce"; -$fa-var-tablet: "\f10a"; -$fa-var-tachometer: "\f0e4"; -$fa-var-tag: "\f02b"; -$fa-var-tags: "\f02c"; -$fa-var-tasks: "\f0ae"; -$fa-var-taxi: "\f1ba"; -$fa-var-telegram: "\f2c6"; -$fa-var-television: "\f26c"; -$fa-var-tencent-weibo: "\f1d5"; -$fa-var-terminal: "\f120"; -$fa-var-text-height: "\f034"; -$fa-var-text-width: "\f035"; -$fa-var-th: "\f00a"; -$fa-var-th-large: "\f009"; -$fa-var-th-list: "\f00b"; -$fa-var-themeisle: "\f2b2"; -$fa-var-thermometer: "\f2c7"; -$fa-var-thermometer-0: "\f2cb"; -$fa-var-thermometer-1: "\f2ca"; -$fa-var-thermometer-2: "\f2c9"; -$fa-var-thermometer-3: "\f2c8"; -$fa-var-thermometer-4: "\f2c7"; -$fa-var-thermometer-empty: "\f2cb"; -$fa-var-thermometer-full: "\f2c7"; -$fa-var-thermometer-half: "\f2c9"; -$fa-var-thermometer-quarter: "\f2ca"; -$fa-var-thermometer-three-quarters: "\f2c8"; -$fa-var-thumb-tack: "\f08d"; -$fa-var-thumbs-down: "\f165"; -$fa-var-thumbs-o-down: "\f088"; -$fa-var-thumbs-o-up: "\f087"; -$fa-var-thumbs-up: "\f164"; -$fa-var-ticket: "\f145"; -$fa-var-times: "\f00d"; -$fa-var-times-circle: "\f057"; -$fa-var-times-circle-o: "\f05c"; -$fa-var-times-rectangle: "\f2d3"; -$fa-var-times-rectangle-o: "\f2d4"; -$fa-var-tint: "\f043"; -$fa-var-toggle-down: "\f150"; -$fa-var-toggle-left: "\f191"; -$fa-var-toggle-off: "\f204"; -$fa-var-toggle-on: "\f205"; -$fa-var-toggle-right: "\f152"; -$fa-var-toggle-up: "\f151"; -$fa-var-trademark: "\f25c"; -$fa-var-train: "\f238"; -$fa-var-transgender: "\f224"; -$fa-var-transgender-alt: "\f225"; -$fa-var-trash: "\f1f8"; -$fa-var-trash-o: "\f014"; -$fa-var-tree: "\f1bb"; -$fa-var-trello: "\f181"; -$fa-var-tripadvisor: "\f262"; -$fa-var-trophy: "\f091"; -$fa-var-truck: "\f0d1"; -$fa-var-try: "\f195"; -$fa-var-tty: "\f1e4"; -$fa-var-tumblr: "\f173"; -$fa-var-tumblr-square: "\f174"; -$fa-var-turkish-lira: "\f195"; -$fa-var-tv: "\f26c"; -$fa-var-twitch: "\f1e8"; -$fa-var-twitter: "\f099"; -$fa-var-twitter-square: "\f081"; -$fa-var-umbrella: "\f0e9"; -$fa-var-underline: "\f0cd"; -$fa-var-undo: "\f0e2"; -$fa-var-universal-access: "\f29a"; -$fa-var-university: "\f19c"; -$fa-var-unlink: "\f127"; -$fa-var-unlock: "\f09c"; -$fa-var-unlock-alt: "\f13e"; -$fa-var-unsorted: "\f0dc"; -$fa-var-upload: "\f093"; -$fa-var-usb: "\f287"; -$fa-var-usd: "\f155"; -$fa-var-user: "\f007"; -$fa-var-user-circle: "\f2bd"; -$fa-var-user-circle-o: "\f2be"; -$fa-var-user-md: "\f0f0"; -$fa-var-user-o: "\f2c0"; -$fa-var-user-plus: "\f234"; -$fa-var-user-secret: "\f21b"; -$fa-var-user-times: "\f235"; -$fa-var-users: "\f0c0"; -$fa-var-vcard: "\f2bb"; -$fa-var-vcard-o: "\f2bc"; -$fa-var-venus: "\f221"; -$fa-var-venus-double: "\f226"; -$fa-var-venus-mars: "\f228"; -$fa-var-viacoin: "\f237"; -$fa-var-viadeo: "\f2a9"; -$fa-var-viadeo-square: "\f2aa"; -$fa-var-video-camera: "\f03d"; -$fa-var-vimeo: "\f27d"; -$fa-var-vimeo-square: "\f194"; -$fa-var-vine: "\f1ca"; -$fa-var-vk: "\f189"; -$fa-var-volume-control-phone: "\f2a0"; -$fa-var-volume-down: "\f027"; -$fa-var-volume-off: "\f026"; -$fa-var-volume-up: "\f028"; -$fa-var-warning: "\f071"; -$fa-var-wechat: "\f1d7"; -$fa-var-weibo: "\f18a"; -$fa-var-weixin: "\f1d7"; -$fa-var-whatsapp: "\f232"; -$fa-var-wheelchair: "\f193"; -$fa-var-wheelchair-alt: "\f29b"; -$fa-var-wifi: "\f1eb"; -$fa-var-wikipedia-w: "\f266"; -$fa-var-window-close: "\f2d3"; -$fa-var-window-close-o: "\f2d4"; -$fa-var-window-maximize: "\f2d0"; -$fa-var-window-minimize: "\f2d1"; -$fa-var-window-restore: "\f2d2"; -$fa-var-windows: "\f17a"; -$fa-var-won: "\f159"; -$fa-var-wordpress: "\f19a"; -$fa-var-wpbeginner: "\f297"; -$fa-var-wpexplorer: "\f2de"; -$fa-var-wpforms: "\f298"; -$fa-var-wrench: "\f0ad"; -$fa-var-xing: "\f168"; -$fa-var-xing-square: "\f169"; -$fa-var-y-combinator: "\f23b"; -$fa-var-y-combinator-square: "\f1d4"; -$fa-var-yahoo: "\f19e"; -$fa-var-yc: "\f23b"; -$fa-var-yc-square: "\f1d4"; -$fa-var-yelp: "\f1e9"; -$fa-var-yen: "\f157"; -$fa-var-yoast: "\f2b1"; -$fa-var-youtube: "\f167"; -$fa-var-youtube-play: "\f16a"; -$fa-var-youtube-square: "\f166"; - diff --git a/app/assets/stylesheets/vendor/font_awesome/font-awesome.scss b/app/assets/stylesheets/vendor/font_awesome/font-awesome.scss deleted file mode 100644 index abab424ee54..00000000000 --- a/app/assets/stylesheets/vendor/font_awesome/font-awesome.scss +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ - -@import "variables"; -@import "mixins"; -// @import "path"; -@import "core"; -@import "larger"; -@import "fixed-width"; -@import "list"; -@import "bordered-pulled"; -@import "animated"; -@import "rotated-flipped"; -@import "stacked"; -@import "icons"; -@import "screen-reader"; diff --git a/app/assets/stylesheets/wizard.scss b/app/assets/stylesheets/wizard.scss index 678fa956862..528111389c4 100644 --- a/app/assets/stylesheets/wizard.scss +++ b/app/assets/stylesheets/wizard.scss @@ -1,9 +1,9 @@ @import "vendor/normalize"; -@import "vendor/font_awesome/font-awesome"; @import "vendor/sweetalert"; @import "common/foundation/colors"; @import "common/foundation/variables"; @import "common/select-kit/*"; +@import "common/components/svg"; body.wizard { background-color: #fff; diff --git a/app/controllers/svg_sprite_controller.rb b/app/controllers/svg_sprite_controller.rb new file mode 100644 index 00000000000..a685718910e --- /dev/null +++ b/app/controllers/svg_sprite_controller.rb @@ -0,0 +1,25 @@ +class SvgSpriteController < ApplicationController + skip_before_action :preload_json, :redirect_to_login_if_required, :check_xhr, :verify_authenticity_token, only: [:show] + + def show + + no_cookies + + RailsMultisite::ConnectionManagement.with_hostname(params[:hostname]) do + + current_version = SvgSprite.version(SvgSprite.all_icons.to_s) + + if current_version != params[:version] + return redirect_to path(SvgSprite.path) + end + + svg_sprite = SvgSprite.bundle + + response.headers["Last-Modified"] = 10.years.ago.httpdate + response.headers["Content-Length"] = svg_sprite.bytesize.to_s + immutable_for 1.year + + render plain: svg_sprite, disposition: nil, content_type: 'image/svg+xml' + end + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 5a6998c6e3f..df0409f2bb2 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -423,8 +423,13 @@ module ApplicationHelper asset_version: Discourse.assets_digest, disable_custom_css: loading_admin?, highlight_js_path: HighlightJs.path, + svg_sprite_path: SvgSprite.path, } + if Rails.env.development? + setup_data[:svg_icon_list] = SvgSprite.all_icons + end + if guardian.can_enable_safe_mode? && params["safe_mode"] setup_data[:safe_mode] = normalized_safe_mode end diff --git a/app/models/group.rb b/app/models/group.rb index 5c8d1376e3e..19b7a82eef2 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -49,7 +49,7 @@ class Group < ActiveRecord::Base validate :automatic_membership_email_domains_format_validator validate :incoming_email_validator validate :can_allow_membership_requests, if: :allow_membership_requests - validates :flair_url, url: true, if: Proc.new { |g| g.flair_url && g.flair_url[0, 3] != 'fa-' } + validates :flair_url, url: true, if: Proc.new { |g| g.flair_url && g.flair_url.exclude?('fa-') } validate :validate_grant_trust_level, if: :will_save_change_to_grant_trust_level? AUTO_GROUPS = { diff --git a/app/views/common/_special_font_face.html.erb b/app/views/common/_special_font_face.html.erb deleted file mode 100644 index 50fc5d96a87..00000000000 --- a/app/views/common/_special_font_face.html.erb +++ /dev/null @@ -1,21 +0,0 @@ -<%# - The fonts are loaded outside of the stylesheet so that we can dynamically change the path. - This is to get around CDN caching on the Origin: - - https://forums.aws.amazon.com/thread.jspa?threadID=114646 - - Also added a cache breaker there in case we have breaking config changes - &1 was added last when the nginx sample config changed -%> - -<% font_domain = "#{Discourse.base_url_no_prefix}&2".html_safe %> -<% woff2_url = "#{asset_path("fontawesome-webfont.woff2")}?#{font_domain}&v=4.7.0".html_safe %> - - - diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 459c778d059..0e8d8b70e97 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -48,7 +48,6 @@ <%- end %> <%= render partial: "common/discourse_stylesheet" %> - <%= render partial: "common/special_font_face" %> <%= yield :head %> diff --git a/app/views/layouts/finish_installation.html.erb b/app/views/layouts/finish_installation.html.erb index 8fc25c08eb9..91df8077989 100644 --- a/app/views/layouts/finish_installation.html.erb +++ b/app/views/layouts/finish_installation.html.erb @@ -1,7 +1,6 @@ <%= discourse_stylesheet_link_tag 'wizard', theme_ids: nil %> - <%= render partial: "common/special_font_face" %> <%= preload_script 'ember_jquery' %> <%= preload_script 'wizard-vendor' %> <%= render partial: "layouts/head" %> diff --git a/app/views/layouts/no_ember.html.erb b/app/views/layouts/no_ember.html.erb index 8b68e33910f..29f0f52a6db 100644 --- a/app/views/layouts/no_ember.html.erb +++ b/app/views/layouts/no_ember.html.erb @@ -5,7 +5,6 @@ <%= content_for?(:title) ? yield(:title) : SiteSetting.title %> <%= render partial: "layouts/head" %> - <%= render partial: "common/special_font_face" %> <%= render partial: "common/discourse_stylesheet" %> <%= discourse_csrf_tags %> diff --git a/app/views/wizard/index.html.erb b/app/views/wizard/index.html.erb index ea5809bada5..9ccc5e3b15a 100644 --- a/app/views/wizard/index.html.erb +++ b/app/views/wizard/index.html.erb @@ -5,7 +5,6 @@ <%= preload_script "locales/#{I18n.locale}" %> <%= preload_script 'wizard-vendor' %> <%= preload_script 'wizard-application' %> - <%= render partial: "common/special_font_face" %> <%= csrf_meta_tags %> @@ -16,5 +15,12 @@
<%= preload_script 'wizard-start' %> + + + diff --git a/config/application.rb b/config/application.rb index 4a64cead119..f46d132e1f7 100644 --- a/config/application.rb +++ b/config/application.rb @@ -56,8 +56,9 @@ module Discourse require_dependency 'lib/es6_module_transpiler/rails' require_dependency 'lib/js_locale_helper' - # tiny file needed by site settings + # tiny files needed by site settings require_dependency 'lib/highlight_js/highlight_js' + require_dependency 'lib/svg_sprite/svg_sprite' # mocha hates us, active_support/testing/mochaing.rb line 2 is requiring the wrong # require, patched in source, on upgrade remove this diff --git a/config/initializers/006-mini_profiler.rb b/config/initializers/006-mini_profiler.rb index 737e3bbb0dc..4af6edb08fc 100644 --- a/config/initializers/006-mini_profiler.rb +++ b/config/initializers/006-mini_profiler.rb @@ -32,6 +32,7 @@ if defined?(Rack::MiniProfiler) /\/letter_avatar\//, /\/letter_avatar_proxy\//, /\/highlight-js\//, + /\/svg-sprite\//, /qunit/, /srv\/status/, /commits-widget/, diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index e3d2da193c8..59012a6fa03 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1744,7 +1744,7 @@ en: share_anonymized_statistics: "Share anonymized usage statistics." auto_handle_queued_age: "Automatically handle records that are waiting to be reviewed after this many days. Flags will be ignored. Queued posts and users will be rejected. Set to 0 to disable this feature." - + svg_icon_subset: "Add additional FontAwesome 5 icons that you would like to include in your assets. Use prefix 'far-' for regular icons and 'fab-' for brand icons. " max_prints_per_hour_per_user: "Maximum number of /print page impressions (set to 0 to disable)" full_name_required: "Full name is a required field of a user's profile." diff --git a/config/routes.rb b/config/routes.rb index d3cebd11eed..0994c0eccc1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -291,6 +291,7 @@ Discourse::Application.routes.draw do post "preview" => "badges#preview" end end + end # admin namespace get "email_preferences" => "email#preferences_redirect", :as => "email_preferences_redirect" @@ -446,6 +447,8 @@ Discourse::Application.routes.draw do # in most production settings this is bypassed get "letter_avatar_proxy/:version/letter/:letter/:color/:size.png" => "user_avatars#show_proxy_letter" + get "svg-sprite/:hostname/:version.svg" => "svg_sprite#show", format: false, constraints: { hostname: /[\w\.-]+/, version: /\h{40}/ } + get "highlight-js/:hostname/:version.js" => "highlight_js#show", format: false, constraints: { hostname: /[\w\.-]+/ } get "stylesheets/:name.css.map" => "stylesheets#show_source_map", constraints: { name: /[-a-z0-9_]+/ } diff --git a/config/site_settings.yml b/config/site_settings.yml index 3c5e32d4610..e12d9813a06 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1680,6 +1680,12 @@ uncategorized: default: 60 min: 0 + svg_icon_subset: + default: '' + type: 'list' + list_type: 'compact' + client: true + user_preferences: default_email_digest_frequency: enum: 'DigestEmailSiteSetting' diff --git a/lib/discourse_plugin_registry.rb b/lib/discourse_plugin_registry.rb index 88197b0abd7..0a641625b5d 100644 --- a/lib/discourse_plugin_registry.rb +++ b/lib/discourse_plugin_registry.rb @@ -15,6 +15,7 @@ class DiscoursePluginRegistry attr_writer :handlebars attr_writer :serialized_current_user_fields attr_writer :seed_data + attr_writer :svg_icons attr_writer :locales attr_accessor :custom_html @@ -59,6 +60,10 @@ class DiscoursePluginRegistry @sass_variables ||= Set.new end + def svg_icons + @svg_icons ||= [] + end + def handlebars @handlebars ||= Set.new end @@ -105,6 +110,10 @@ class DiscoursePluginRegistry self.service_workers << filename end + def self.register_svg_icon(icon) + self.svg_icons << icon + end + def register_css(filename) self.class.stylesheets << filename end diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index ac575b1c72b..37593438846 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -357,6 +357,10 @@ class Plugin::Instance javascripts << js end + def register_svg_icon(icon) + DiscoursePluginRegistry.register_svg_icon(SvgSprite.process(icon)) + end + # @option opts [String] :name # @option opts [String] :nativeName # @option opts [String] :fallbackLocale diff --git a/lib/svg_sprite/svg_sprite.rb b/lib/svg_sprite/svg_sprite.rb new file mode 100644 index 00000000000..73fb408fd88 --- /dev/null +++ b/lib/svg_sprite/svg_sprite.rb @@ -0,0 +1,222 @@ +# frozen_string_literal: true + +module SvgSprite + SVG_ICONS ||= Set.new([ + "anchor", + "angle-double-down", + "angle-double-up", + "angle-down", + "angle-up", + "archive", + "arrow-up", + "backward", + "ban", + "bars", + "bold", + "book", + "bookmark", + "calendar-alt", + "caret-down", + "caret-left", + "caret-right", + "caret-up", + "certificate", + "chart-bar", + "chart-pie", + "check", + "chevron-down", + "chevron-right", + "chevron-up", + "circle", + "code", + "cog", + "columns", + "comment", + "copy", + "crosshairs", + "cube", + "desktop", + "download", + "ellipsis-h", + "ellipsis-v", + "envelope", + "envelope-square", + "exclamation-circle", + "exclamation-triangle", + "external-link-alt", + "expand", + "fab-apple", + "fab-facebook-f", + "fab-facebook-square", + "fab-github", + "fab-instagram", + "fab-twitter", + "fab-twitter-square", + "fab-yahoo", + "far-bell", + "far-bell-slash", + "far-calendar-plus", + "far-circle", + "far-clipboard", + "far-clock", + "far-comment", + "far-dot-circle", + "far-edit", + "far-envelope", + "far-eye", + "far-eye-slash", + "far-file-alt", + "far-frown", + "far-heart", + "far-image", + "far-list-alt", + "far-smile", + "far-square", + "far-thumbs-down", + "far-thumbs-up", + "far-trash-alt", + "fast-backward", + "fast-forward", + "file", + "file-alt", + "flag", + "folder", + "forward", + "gavel", + "globe", + "globe-americas", + "heading", + "heart", + "info-circle", + "italic", + "key", + "link", + "list", + "list-ol", + "list-ul", + "lock", + "microphone-slash", + "minus", + "mobile-alt", + "paint-brush", + "pencil-alt", + "plug", + "plus", + "power-off", + "question", + "question-circle", + "quote-left", + "quote-right", + "reply", + "search", + "share", + "shield-alt", + "signal", + "sign-out-alt", + "step-backward", + "step-forward", + "sync", + "table", + "tasks", + "thumbtack", + "times", + "times-circle", + "trash-alt", + "undo", + "unlock", + "upload", + "user", + "user-plus", + "users", + "wrench" + ]) + + FA_ICON_MAP = { 'far fa-' => 'far-', 'fab fa-' => 'fab-', 'fa-' => '' } + + def self.all_icons + icons = SVG_ICONS.dup + icons.merge(SiteSetting.svg_icon_subset.split('|')) + icons.merge(plugin_icons).merge(badge_icons).merge(group_icons).merge(theme_icons) + end + + def self.bundle + require 'nokogiri' + + icons = all_icons + + @svg_subset = """ + + + """.dup + + Dir["#{Rails.root}/vendor/assets/svg-icons/fontawesome/*.svg"].each do |fname| + svg_file = Nokogiri::XML(File.open(fname)) do |config| + config.options = Nokogiri::XML::ParseOptions::NOBLANKS + end + + svg_filename = "#{File.basename(fname, ".svg")}" + + svg_file.css('symbol').each do |sym| + icon_id = sym.attr('id') + + case svg_filename + when "regular" + icon_id = icon_id.prepend('far-') + when "brands" + icon_id = icon_id.prepend('fab-') + end + + if icons.include? icon_id + sym.attributes['id'].value = icon_id + sym.css('title').each { |t| t.remove } + @svg_subset << sym.to_xml + end + end + end + + @svg_subset << '' + end + + def self.version(svg_subset) + (@svg_subset_cache ||= {})[svg_subset] ||= + Digest::SHA1.hexdigest(svg_subset) + end + + def self.path + "/svg-sprite/#{Discourse.current_hostname}/#{version all_icons.to_s}.svg" + end + + def self.plugin_icons + DiscoursePluginRegistry.svg_icons.each { |icon| process(icon) } + end + + def self.badge_icons + Badge.all.pluck(:icon).uniq.each { |icon| process(icon) } + end + + def self.group_icons + Group.where("flair_url LIKE '%fa-%'").pluck(:flair_url).uniq.each { |icon| process(icon) } + end + + def self.theme_icons + theme_icon_settings = [] + + Theme.all.each do |theme| + theme&.included_settings&.each do |name, value| + if name.to_s.include? "_icon" + theme_icon_settings |= [value] + end + end + end + + theme_icon_settings.each { |i| process(i) } + end + + def self.process(icon_name) + FA_ICON_MAP.each { |k, v| icon_name.sub!(k, v) } + icon_name + end +end diff --git a/lib/tasks/svg_icons.rake b/lib/tasks/svg_icons.rake new file mode 100644 index 00000000000..9ce0b48a8aa --- /dev/null +++ b/lib/tasks/svg_icons.rake @@ -0,0 +1,38 @@ +def vendor_svgs + "#{Rails.root}/vendor/assets/svg-icons" +end + +def library_src + "#{Rails.root}/node_modules" +end + +task 'svgicons:update' do + + yarn = system("yarn install") + abort('Unable to run "yarn install"') unless yarn + + dependencies = [ + { + source: '@fortawesome/fontawesome-free/sprites', + destination: 'fontawesome', + } + ] + + start = Time.now + + dependencies.each do |f| + src = "#{library_src}/#{f[:source]}" + + unless f[:destination] + filename = f[:source].split("/").last + else + filename = f[:destination] + end + + dest = "#{vendor_svgs}/#{filename}" + + FileUtils.cp_r(src, dest) + end + + STDERR.puts "Completed copying dependencies: #{(Time.now - start).round(2)} secs" +end diff --git a/package.json b/package.json index ae98ed4f9dc..571f6008495 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "author": "Discourse", "license": "MIT", "dependencies": { + "@fortawesome/fontawesome-free": "^5.4.1", "ace-builds": "1.4.1", "bootbox": "3.2.0", "chart.js": "2.7.2", @@ -15,9 +16,9 @@ "jquery": "3.3.1", "jquery-color": "1.0.0", "jquery-resize": "https://github.com/cowboy/jquery-resize/", + "jquery-tags-input": "1.3.5", "jquery.autoellipsis": "https://github.com/pvdspek/jquery.autoellipsis", "jquery.cookie": "1.4.1", - "jquery-tags-input": "1.3.5", "magnific-popup": "1.1.0", "markdown-it": "8.4.1", "mousetrap": "https://github.com/discourse/mousetrap#firefox-alt-key", diff --git a/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js b/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js index aad239019cf..5d5dda892dd 100644 --- a/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js +++ b/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js @@ -89,7 +89,7 @@ } var html = ""; - html += ""; + html += ``; html += ""; html += ""; diff --git a/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss b/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss index 79549c7b81f..b68eb5712d6 100644 --- a/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss +++ b/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss @@ -7,7 +7,7 @@ cursor: pointer; border-bottom: 1px dashed $primary-medium; - .d-icon-globe { + .d-icon { margin-right: 0.25em; color: $primary; } diff --git a/plugins/poll/assets/javascripts/discourse/templates/modal/poll-ui-builder.hbs b/plugins/poll/assets/javascripts/discourse/templates/modal/poll-ui-builder.hbs index 04eb9a61ea3..223e72e88c7 100644 --- a/plugins/poll/assets/javascripts/discourse/templates/modal/poll-ui-builder.hbs +++ b/plugins/poll/assets/javascripts/discourse/templates/modal/poll-ui-builder.hbs @@ -73,5 +73,5 @@ {{/d-modal-body}} diff --git a/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 b/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 index a9e80394e4c..6aeb6ee3e0a 100644 --- a/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 +++ b/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 @@ -32,7 +32,7 @@ function initializePollUIBuilder(api) { api.addToolbarPopupMenuOptionsCallback(function() { return { action: "showPollBuilder", - icon: "bar-chart-o", + icon: "chart-bar", label: "poll.ui_builder.title", condition: "canBuildPoll" }; diff --git a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 index 2925a22d985..39a5f307140 100644 --- a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 +++ b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 @@ -39,9 +39,9 @@ createWidget("discourse-poll-option", { const chosen = vote.indexOf(option.id) !== -1; if (attrs.isMultiple) { - result.push(iconNode(chosen ? "check-square-o" : "square-o")); + result.push(iconNode(chosen ? "far-check-square" : "far-square")); } else { - result.push(iconNode(chosen ? "dot-circle-o" : "circle-o")); + result.push(iconNode(chosen ? "far-dot-circle" : "far-circle")); } result.push(" "); result.push(optionHtml(option)); diff --git a/plugins/poll/assets/stylesheets/desktop/poll.scss b/plugins/poll/assets/stylesheets/desktop/poll.scss index e6ac930025a..42e2a3ac6f2 100644 --- a/plugins/poll/assets/stylesheets/desktop/poll.scss +++ b/plugins/poll/assets/stylesheets/desktop/poll.scss @@ -47,16 +47,20 @@ div.poll { .poll { li[data-poll-option-id]:before { - font-family: FontAwesome; - content: "\f10c"; - margin-right: 0.25em; position: relative; vertical-align: baseline; + border: 2px solid $primary; + border-radius: 50%; + display: inline-block; + margin-right: 0.5em; + width: 12px; + height: 12px; + content: ""; } &[data-poll-type="multiple"] { li[data-poll-option-id]:before { - content: "\f096"; + border-radius: 3px; } } } diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb index 21b586f98b2..5ef4465134f 100644 --- a/plugins/poll/plugin.rb +++ b/plugins/poll/plugin.rb @@ -9,6 +9,8 @@ register_asset "stylesheets/common/poll-ui-builder.scss" register_asset "stylesheets/desktop/poll.scss", :desktop register_asset "stylesheets/mobile/poll.scss", :mobile +register_svg_icon "far fa-check-square" + enabled_site_setting :poll_enabled hide_plugin if self.respond_to?(:hide_plugin) diff --git a/plugins/poll/test/javascripts/widgets/discourse-poll-option-test.js.es6 b/plugins/poll/test/javascripts/widgets/discourse-poll-option-test.js.es6 index 751607e3730..739452c8913 100644 --- a/plugins/poll/test/javascripts/widgets/discourse-poll-option-test.js.es6 +++ b/plugins/poll/test/javascripts/widgets/discourse-poll-option-test.js.es6 @@ -14,7 +14,7 @@ widgetTest("single, not selected", { }, test(assert) { - assert.ok(find("li .d-icon-circle-o:eq(0)").length === 1); + assert.ok(find("li .d-icon-far-circle:eq(0)").length === 1); } }); @@ -27,7 +27,7 @@ widgetTest("single, selected", { }, test(assert) { - assert.ok(find("li .d-icon-dot-circle-o:eq(0)").length === 1); + assert.ok(find("li .d-icon-far-dot-circle:eq(0)").length === 1); } }); @@ -43,7 +43,7 @@ widgetTest("multi, not selected", { }, test(assert) { - assert.ok(find("li .d-icon-square-o:eq(0)").length === 1); + assert.ok(find("li .d-icon-far-square:eq(0)").length === 1); } }); @@ -59,6 +59,6 @@ widgetTest("multi, selected", { }, test(assert) { - assert.ok(find("li .d-icon-check-square-o:eq(0)").length === 1); + assert.ok(find("li .d-icon-far-check-square:eq(0)").length === 1); } }); diff --git a/spec/components/svg_sprite/svg_sprite_spec.rb b/spec/components/svg_sprite/svg_sprite_spec.rb new file mode 100644 index 00000000000..dc8a47a2a19 --- /dev/null +++ b/spec/components/svg_sprite/svg_sprite_spec.rb @@ -0,0 +1,69 @@ +require 'rails_helper' + +describe SvgSprite do + it 'can generate a bundle' do + bundle = SvgSprite.bundle + expect(bundle).to match(/heart/) + expect(bundle).to match(/angle-double-down/) + end + + it 'can get a version string' do + version1 = SvgSprite.version("heart|caret-down") + version2 = SvgSprite.version("heart|caret-down|caret-up") + + expect(version1).not_to eq(version2) + end + + it 'includes Font Awesome 4.7 icons from badges' do + Fabricate(:badge, name: 'Custom Icon Badge', icon: 'fa-gamepad') + expect(SvgSprite.bundle).to match(/gamepad/) + end + + it 'includes Font Awesome 5 icons from badges' do + Fabricate(:badge, name: 'Custom Icon Badge', icon: 'far fa-building') + expect(SvgSprite.bundle).to match(/building/) + end + + it 'includes icons defined in themes' do + theme = Fabricate(:theme) + theme.set_field(target: :settings, name: :yaml, value: "custom_icon: gas-pump") + theme.save! + expect(SvgSprite.bundle).to match(/gas-pump/) + + setting = theme.settings.find { |s| s.name == :custom_icon } + setting.value = 'gamepad' + expect(SvgSprite.bundle).to match(/gamepad/) + + setting = theme.settings.find { |s| s.name == :custom_icon } + setting.value = 'fab fa-bandcamp' + expect(SvgSprite.bundle).to match(/fab-bandcamp/) + + end + + it 'includes icons from SiteSettings' do + SiteSetting.svg_icon_subset = 'blender|drafting-compass|fab-bandcamp' + bundle = SvgSprite.bundle + expect(bundle).to match(/blender/) + expect(bundle).to match(/drafting-compass/) + expect(bundle).to match(/fab-bandcamp/) + expect(bundle).not_to match(/dragon/) + end + + it 'includes icons from plugins' do + DiscoursePluginRegistry.register_svg_icon('blender') + DiscoursePluginRegistry.register_svg_icon('fab fa-bandcamp') + bundle = SvgSprite.bundle + expect(bundle).to match(/blender/) + expect(bundle).to match(/fab-bandcamp/) + end + + it "includes Font Awesome 4.7 icons as group flair" do + group = Fabricate(:group, flair_url: "fa-air-freshener") + expect(SvgSprite.bundle).to match(/air-freshener/) + end + + it "includes Font Awesome 5 icons as group flair" do + group = Fabricate(:group, flair_url: "far fa-building") + expect(SvgSprite.bundle).to match(/building/) + end +end diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index a0bdc24ac80..07b6d8e5ddb 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -820,4 +820,22 @@ describe Group do end end end + + it "allows Font Awesome 4.7 syntax as group avatar flair" do + group = Fabricate(:group) + group.flair_url = "fa-air-freshener" + group.save + + group = Group.find(group.id) + expect(group.flair_url).to eq("fa-air-freshener") + end + + it "allows Font Awesome 5 syntax as group avatar flair" do + group = Fabricate(:group) + group.flair_url = "fab fa-bandcamp" + group.save + + group = Group.find(group.id) + expect(group.flair_url).to eq("fab fa-bandcamp") + end end diff --git a/test/javascripts/acceptance/group-index-test.js.es6 b/test/javascripts/acceptance/group-index-test.js.es6 index 1ad8fee5620..1cc9025c2b6 100644 --- a/test/javascripts/acceptance/group-index-test.js.es6 +++ b/test/javascripts/acceptance/group-index-test.js.es6 @@ -6,7 +6,7 @@ QUnit.test("Viewing Members as anon user", async assert => { await visit("/groups/discourse"); assert.ok( - count(".avatar-flair .fa-adjust") === 1, + count(".avatar-flair .d-icon-adjust") === 1, "it displays the group's avatar flair" ); assert.ok(count(".group-members tr") > 0, "it lists group members"); diff --git a/test/javascripts/admin/components/themes-list-item-test.js.es6 b/test/javascripts/admin/components/themes-list-item-test.js.es6 index c08f1805b5c..55a50d3f69e 100644 --- a/test/javascripts/admin/components/themes-list-item-test.js.es6 +++ b/test/javascripts/admin/components/themes-list-item-test.js.es6 @@ -11,7 +11,7 @@ componentTest("default theme", { test(assert) { assert.expect(1); - assert.equal(this.$(".fa-check").length, 1, "shows default theme icon"); + assert.equal(this.$(".d-icon-check").length, 1, "shows default theme icon"); } }); @@ -26,11 +26,15 @@ componentTest("pending updates", { test(assert) { assert.expect(1); - assert.equal(this.$(".fa-refresh").length, 1, "shows pending update icon"); + assert.equal( + this.$(".d-icon-refresh").length, + 1, + "shows pending update icon" + ); } }); -componentTest("borken theme", { +componentTest("broken theme", { template: "{{themes-list-item theme=theme}}", beforeEach() { this.set( @@ -45,7 +49,7 @@ componentTest("borken theme", { test(assert) { assert.expect(1); assert.equal( - this.$(".fa-exclamation-circle").length, + this.$(".d-icon-exclamation-circle").length, 1, "shows broken theme icon" ); diff --git a/test/javascripts/components/d-icon-test.js.es6 b/test/javascripts/components/d-icon-test.js.es6 index bcaca7f7533..902447f5f86 100644 --- a/test/javascripts/components/d-icon-test.js.es6 +++ b/test/javascripts/components/d-icon-test.js.es6 @@ -9,7 +9,10 @@ componentTest("default", { const html = this.$() .html() .trim(); - assert.equal(html, ''); + assert.equal( + html, + '' + ); } }); @@ -22,7 +25,7 @@ componentTest("with replacement", { .trim(); assert.equal( html, - '' + '' ); } }); diff --git a/test/javascripts/widgets/avatar-flair-test.js.es6 b/test/javascripts/widgets/avatar-flair-test.js.es6 new file mode 100644 index 00000000000..9902efc0959 --- /dev/null +++ b/test/javascripts/widgets/avatar-flair-test.js.es6 @@ -0,0 +1,36 @@ +import { moduleForWidget, widgetTest } from "helpers/widget-test"; + +moduleForWidget("avatar-flair"); + +widgetTest("avatar flair with an icon", { + template: '{{mount-widget widget="avatar-flair" args=args}}', + beforeEach() { + this.set("args", { + primary_group_flair_url: "fa-bars", + primary_group_flair_bg_color: "CC0000", + primary_group_flair_color: "FFFFFF" + }); + }, + test(assert) { + assert.ok(this.$(".avatar-flair").length, "it has the tag"); + assert.ok(this.$("svg.d-icon-bars").length, "it has the svg icon"); + assert.equal( + this.$(".avatar-flair").attr("style"), + "background-color: #CC0000; color: #FFFFFF; ", + "it has styles" + ); + } +}); + +widgetTest("avatar flair with an image", { + template: '{{mount-widget widget="avatar-flair" args=args}}', + beforeEach() { + this.set("args", { + primary_group_flair_url: "/images/avatar.png" + }); + }, + test(assert) { + assert.ok(this.$(".avatar-flair").length, "it has the tag"); + assert.ok(this.$("svg").length === 0, "it does not have an svg icon"); + } +}); diff --git a/test/javascripts/widgets/widget-test.js.es6 b/test/javascripts/widgets/widget-test.js.es6 index 0b5eba78ea0..c3c8ccbbc1e 100644 --- a/test/javascripts/widgets/widget-test.js.es6 +++ b/test/javascripts/widgets/widget-test.js.es6 @@ -217,7 +217,7 @@ widgetTest("handlebars d-icon", { }, test(assert) { - assert.equal(this.$("i.fa.fa-arrow-down").length, 1); + assert.equal(this.$(".d-icon-arrow-down").length, 1); } }); diff --git a/vendor/assets/svg-icons/fontawesome/brands.svg b/vendor/assets/svg-icons/fontawesome/brands.svg new file mode 100644 index 00000000000..075c7be3ec6 --- /dev/null +++ b/vendor/assets/svg-icons/fontawesome/brands.svg @@ -0,0 +1,1559 @@ + + + + + 500px + + + + Accessible Icon + + + + Accusoft + + + + Acquisitions Incorporated + + + + App.net + + + + Adversal + + + + affiliatetheme + + + + Algolia + + + + Alipay + + + + Amazon + + + + Amazon Pay + + + + Amilia + + + + Android + + + + AngelList + + + + Angry Creative + + + + Angular + + + + App Store + + + + iOS App Store + + + + Apper Systems AB + + + + Apple + + + + Apple Pay + + + + Asymmetrik, Ltd. + + + + Audible + + + + Autoprefixer + + + + avianex + + + + Aviato + + + + Amazon Web Services (AWS) + + + + Bandcamp + + + + Behance + + + + Behance Square + + + + BIMobject + + + + Bitbucket + + + + Bitcoin + + + + Bity + + + + Font Awesome Black Tie + + + + BlackBerry + + + + Blogger + + + + Blogger B + + + + Bluetooth + + + + Bluetooth + + + + BTC + + + + Büromöbel-Experte GmbH & Co. KG. + + + + BuySellAds + + + + Amazon Pay Credit Card + + + + American Express Credit Card + + + + Apple Pay Credit Card + + + + Diner's Club Credit Card + + + + Discover Credit Card + + + + JCB Credit Card + + + + MasterCard Credit Card + + + + Paypal Credit Card + + + + Stripe Credit Card + + + + Visa Credit Card + + + + Centercode + + + + Chrome + + + + cloudscale.ch + + + + Cloudsmith + + + + cloudversify + + + + Codepen + + + + Codie Pie + + + + Connect Develop + + + + Contao + + + + cPanel + + + + Creative Commons + + + + Creative Commons Attribution + + + + Creative Commons Noncommercial + + + + Creative Commons Noncommercial (Euro Sign) + + + + Creative Commons Noncommercial (Yen Sign) + + + + Creative Commons No Derivative Works + + + + Creative Commons Public Domain + + + + Creative Commons Public Domain Alternate + + + + Creative Commons Remix + + + + Creative Commons Share Alike + + + + Creative Commons Sampling + + + + Creative Commons Sampling + + + + + Creative Commons Share + + + + Creative Commons CC0 + + + + Critical Role + + + + CSS 3 Logo + + + + Alternate CSS3 Logo + + + + Cuttlefish + + + + Dungeons & Dragons + + + + DashCube + + + + Delicious Logo + + + + deploy.dog + + + + Deskpro + + + + DEV + + + + deviantART + + + + Digg Logo + + + + Digital Ocean + + + + Discord + + + + Discourse + + + + DocHub + + + + Docker + + + + Draft2digital + + + + Dribbble + + + + Dribbble Square + + + + Dropbox + + + + Drupal Logo + + + + Dyalog + + + + Earlybirds + + + + eBay + + + + Edge Browser + + + + Elementor + + + + Ello + + + + Ember + + + + Galactic Empire + + + + Envira Gallery + + + + Erlang + + + + Ethereum + + + + Etsy + + + + ExpeditedSSL + + + + Facebook + + + + Facebook F + + + + Facebook Messenger + + + + Facebook Square + + + + Fantasy Flight-games + + + + Firefox + + + + First Order + + + + Alternate First Order + + + + firstdraft + + + + Flickr + + + + Flipboard + + + + Fly + + + + Font Awesome + + + + Alternate Font Awesome + + + + Font Awesome Flag + + + + Font Awesome Full Logo + + + + Fonticons + + + + Fonticons Fi + + + + Fort Awesome + + + + Alternate Fort Awesome + + + + Forumbee + + + + Foursquare + + + + Free Code Camp + + + + FreeBSD + + + + Fulcrum + + + + Galactic Republic + + + + Galactic Senate + + + + Get Pocket + + + + GG Currency + + + + GG Currency Circle + + + + Git + + + + Git Square + + + + GitHub + + + + Alternate GitHub + + + + GitHub Square + + + + GitKraken + + + + GitLab + + + + Gitter + + + + Glide + + + + Glide G + + + + Gofore + + + + Goodreads + + + + Goodreads G + + + + Google Logo + + + + Google Drive + + + + Google Play + + + + Google Plus + + + + Google Plus G + + + + Google Plus Square + + + + Google Wallet + + + + Gratipay (Gittip) + + + + Grav + + + + Gripfire, Inc. + + + + Grunt + + + + Gulp + + + + Hacker News + + + + Hacker News Square + + + + Hackerrank + + + + Hips + + + + HireAHelper + + + + Hooli + + + + Hornbill + + + + Hotjar + + + + Houzz + + + + HTML 5 Logo + + + + HubSpot + + + + IMDB + + + + Instagram + + + + Internet-explorer + + + + ioxhost + + + + iTunes + + + + Itunes Note + + + + Java + + + + Jedi Order + + + + Jenkis + + + + Joget + + + + Joomla Logo + + + + JavaScript (JS) + + + + JavaScript (JS) Square + + + + jsFiddle + + + + Kaggle + + + + Keybase + + + + KeyCDN + + + + Kickstarter + + + + Kickstarter K + + + + KORVUE + + + + Laravel + + + + last.fm + + + + last.fm Square + + + + Leanpub + + + + Less + + + + Line + + + + LinkedIn + + + + LinkedIn In + + + + Linode + + + + Linux + + + + lyft + + + + Magento + + + + Mailchimp + + + + Mandalorian + + + + Markdown + + + + Mastodon + + + + MaxCDN + + + + MedApps + + + + Medium + + + + Medium M + + + + MRT + + + + Meetup + + + + Megaport + + + + Microsoft + + + + Mix + + + + Mixcloud + + + + Mizuni + + + + MODX + + + + Monero + + + + Napster + + + + Neos + + + + Nimblr + + + + Nintendo Switch + + + + Node.js + + + + Node.js JS + + + + npm + + + + NS8 + + + + Nutritionix + + + + Odnoklassniki + + + + Odnoklassniki Square + + + + Old Republic + + + + OpenCart + + + + OpenID + + + + Opera + + + + Optin Monster + + + + Open Source Initiative + + + + page4 Corporation + + + + Pagelines + + + + Palfed + + + + Patreon + + + + Paypal + + + + Penny Arcade + + + + Periscope + + + + Phabricator + + + + Phoenix Framework + + + + Phoenix Squadron + + + + PHP + + + + Pied Piper Logo + + + + Alternate Pied Piper Logo + + + + Pied Piper-hat + + + + Pied Piper PP Logo (Old) + + + + Pinterest + + + + Pinterest P + + + + Pinterest Square + + + + PlayStation + + + + Product Hunt + + + + Pushed + + + + Python + + + + QQ + + + + QuinScape + + + + Quora + + + + R Project + + + + Ravelry + + + + React + + + + ReadMe + + + + Rebel Alliance + + + + red river + + + + reddit Logo + + + + reddit Alien + + + + reddit Square + + + + Rendact + + + + Renren + + + + replyd + + + + Researchgate + + + + Resolving + + + + Rev.io + + + + Rocket.Chat + + + + Rockrms + + + + Safari + + + + Sass + + + + SCHLIX + + + + Scribd + + + + Searchengin + + + + Sellcast + + + + Sellsy + + + + Servicestack + + + + Shirts in Bulk + + + + Shopware + + + + SimplyBuilt + + + + SISTRIX + + + + Sith + + + + skyatlas + + + + Skype + + + + Slack Logo + + + + Slack Hashtag + + + + Slideshare + + + + Snapchat + + + + Snapchat Ghost + + + + Snapchat Square + + + + SoundCloud + + + + Speakap + + + + Spotify + + + + Squarespace + + + + Stack Exchange + + + + Stack Overflow + + + + StayLinked + + + + Steam + + + + Steam Square + + + + Steam Symbol + + + + Sticker Mule + + + + Strava + + + + Stripe + + + + Stripe S + + + + Studio Vinari + + + + StumbleUpon Logo + + + + StumbleUpon Circle + + + + Superpowers + + + + Supple + + + + TeamSpeak + + + + Telegram + + + + Telegram Plane + + + + Tencent Weibo + + + + The Red Yeti + + + + Themeco + + + + ThemeIsle + + + + Trade Federation + + + + Trello + + + + TripAdvisor + + + + Tumblr + + + + Tumblr Square + + + + Twitch + + + + Twitter + + + + Twitter Square + + + + Typo3 + + + + Uber + + + + UIkit + + + + Uniregistry + + + + Untappd + + + + USB + + + + us-Sunnah Foundation + + + + Vaadin + + + + Viacoin + + + + Video + + + + Video Square + + + + Viber + + + + Vimeo + + + + Vimeo Square + + + + Vimeo + + + + Vine + + + + VK + + + + VNV + + + + Vue.js + + + + Weebly + + + + Weibo + + + + Weixin (WeChat) + + + + What's App + + + + What's App Square + + + + WHMCS + + + + Wikipedia W + + + + Windows + + + + Wix + + + + Wizards of the Coast + + + + Wolf Pack Battalion + + + + WordPress Logo + + + + Wordpress Simple + + + + WPBeginner + + + + WPExplorer + + + + WPForms + + + + Xbox + + + + Xing + + + + Xing Square + + + + Y Combinator + + + + Yahoo Logo + + + + Yandex + + + + Yandex International + + + + Yelp + + + + Yoast + + + + YouTube + + + + YouTube Square + + + + Zhihu + + + diff --git a/vendor/assets/svg-icons/fontawesome/regular.svg b/vendor/assets/svg-icons/fontawesome/regular.svg new file mode 100644 index 00000000000..ea1ab9faeb3 --- /dev/null +++ b/vendor/assets/svg-icons/fontawesome/regular.svg @@ -0,0 +1,615 @@ + + + + + Address Book + + + + Address Card + + + + Angry Face + + + + Alternate Arrow Circle Down + + + + Alternate Arrow Circle Left + + + + Alternate Arrow Circle Right + + + + Alternate Arrow Circle Up + + + + bell + + + + Bell Slash + + + + bookmark + + + + Building + + + + Calendar + + + + Alternate Calendar + + + + Calendar Check + + + + Calendar Minus + + + + Calendar Plus + + + + Calendar Times + + + + Caret Square Down + + + + Caret Square Left + + + + Caret Square Right + + + + Caret Square Up + + + + Bar Chart + + + + Check Circle + + + + Check Square + + + + Circle + + + + Clipboard + + + + Clock + + + + Clone + + + + Closed Captioning + + + + comment + + + + Alternate Comment + + + + Comment Dots + + + + comments + + + + Compass + + + + Copy + + + + Copyright + + + + Credit Card + + + + Dizzy Face + + + + Dot Circle + + + + Edit + + + + Envelope + + + + Envelope Open + + + + Eye + + + + Eye Slash + + + + File + + + + Alternate File + + + + Archive File + + + + Audio File + + + + Code File + + + + Excel File + + + + Image File + + + + PDF File + + + + Powerpoint File + + + + Video File + + + + Word File + + + + flag + + + + Flushed Face + + + + Folder + + + + Folder Open + + + + Font Awesome Full Logo + + + + Frowning Face + + + + Frowning Face With Open Mouth + + + + Futbol + + + + Gem + + + + Grimacing Face + + + + Grinning Face + + + + Alternate Grinning Face + + + + Grinning Face With Smiling Eyes + + + + Grinning Face With Sweat + + + + Smiling Face With Heart-Eyes + + + + Grinning Squinting Face + + + + Rolling on the Floor Laughing + + + + Star-Struck + + + + Face With Tears of Joy + + + + Face With Tongue + + + + Squinting Face With Tongue + + + + Winking Face With Tongue + + + + Grinning Winking Face + + + + Lizard (Hand) + + + + Paper (Hand) + + + + Peace (Hand) + + + + Hand Pointing Down + + + + Hand Pointing Left + + + + Hand Pointing Right + + + + Hand Pointing Up + + + + Pointer (Hand) + + + + Rock (Hand) + + + + Scissors (Hand) + + + + Spock (Hand) + + + + Handshake + + + + HDD + + + + Heart + + + + hospital + + + + Hourglass + + + + Identification Badge + + + + Identification Card + + + + Image + + + + Images + + + + Keyboard + + + + Kissing Face + + + + Kissing Face With Smiling Eyes + + + + Face Blowing a Kiss + + + + Grinning Face With Big Eyes + + + + Laugh Face with Beaming Eyes + + + + Laughing Squinting Face + + + + Laughing Winking Face + + + + Lemon + + + + Life Ring + + + + Lightbulb + + + + Alternate List + + + + Map + + + + Neutral Face + + + + Face Without Mouth + + + + Face With Rolling Eyes + + + + Minus Square + + + + Alternate Money Bill + + + + Moon + + + + Newspaper + + + + Object Group + + + + Object Ungroup + + + + Paper Plane + + + + Pause Circle + + + + Play Circle + + + + Plus Square + + + + Question Circle + + + + Registered Trademark + + + + Crying Face + + + + Loudly Crying Face + + + + Save + + + + Share Square + + + + Smiling Face + + + + Beaming Face With Smiling Eyes + + + + Winking Face + + + + Snowflake + + + + Square + + + + Star + + + + star-half + + + + Sticky Note + + + + Stop Circle + + + + Sun + + + + Hushed Face + + + + thumbs-down + + + + thumbs-up + + + + Times Circle + + + + Tired Face + + + + Alternate Trash + + + + User + + + + User Circle + + + + Window Close + + + + Window Maximize + + + + Window Minimize + + + + Window Restore + + + diff --git a/vendor/assets/svg-icons/fontawesome/solid.svg b/vendor/assets/svg-icons/fontawesome/solid.svg new file mode 100644 index 00000000000..39c24644e7d --- /dev/null +++ b/vendor/assets/svg-icons/fontawesome/solid.svg @@ -0,0 +1,3411 @@ + + + + + + Address Book + + + + Address Card + + + + adjust + + + + Air Freshener + + + + align-center + + + + align-justify + + + + align-left + + + + align-right + + + + Allergies + + + + ambulance + + + + American Sign Language Interpreting + + + + Anchor + + + + Angle Double Down + + + + Angle Double Left + + + + Angle Double Right + + + + Angle Double Up + + + + angle-down + + + + angle-left + + + + angle-right + + + + angle-up + + + + Angry Face + + + + Ankh + + + + Fruit Apple + + + + Archive + + + + Archway + + + + Alternate Arrow Circle Down + + + + Alternate Arrow Circle Left + + + + Alternate Arrow Circle Right + + + + Alternate Arrow Circle Up + + + + Arrow Circle Down + + + + Arrow Circle Left + + + + Arrow Circle Right + + + + Arrow Circle Up + + + + arrow-down + + + + arrow-left + + + + arrow-right + + + + arrow-up + + + + Alternate Arrows + + + + Alternate Arrows Horizontal + + + + Alternate Arrows Vertical + + + + Assistive Listening Systems + + + + asterisk + + + + At + + + + Atlas + + + + Atom + + + + Audio Description + + + + Award + + + + Backspace + + + + backward + + + + Balance Scale + + + + ban + + + + Band-Aid + + + + barcode + + + + Bars + + + + Baseball Ball + + + + Basketball Ball + + + + Bath + + + + Battery Empty + + + + Battery Full + + + + Battery 1/2 Full + + + + Battery 1/4 Full + + + + Battery 3/4 Full + + + + Bed + + + + beer + + + + bell + + + + Bell Slash + + + + Bezier Curve + + + + Bible + + + + Bicycle + + + + Binoculars + + + + Birthday Cake + + + + Blender + + + + Blender Phone + + + + Blind + + + + bold + + + + Lightning Bolt + + + + Bomb + + + + Bone + + + + Bong + + + + book + + + + Book of the Dead + + + + Book Open + + + + Book Reader + + + + bookmark + + + + Bowling Ball + + + + Box + + + + Box Open + + + + Boxes + + + + Braille + + + + Brain + + + + Briefcase + + + + Medical Briefcase + + + + Broadcast Tower + + + + Broom + + + + Brush + + + + Bug + + + + Building + + + + bullhorn + + + + Bullseye + + + + Burn + + + + Bus + + + + Bus Alt + + + + Business Time + + + + Calculator + + + + Calendar + + + + Alternate Calendar + + + + Calendar Check + + + + Calendar Minus + + + + Calendar Plus + + + + Calendar Times + + + + camera + + + + Retro Camera + + + + Campground + + + + Cannabis + + + + Capsules + + + + Car + + + + Alternate Car + + + + Car Battery + + + + Car Crash + + + + Car Side + + + + Caret Down + + + + Caret Left + + + + Caret Right + + + + Caret Square Down + + + + Caret Square Left + + + + Caret Square Right + + + + Caret Square Up + + + + Caret Up + + + + Shopping Cart Arrow Down + + + + Add to Shopping Cart + + + + Cat + + + + certificate + + + + Chair + + + + Chalkboard + + + + Chalkboard Teacher + + + + Charging Station + + + + Area Chart + + + + Bar Chart + + + + Line Chart + + + + Pie Chart + + + + Check + + + + Check Circle + + + + Check Double + + + + Check Square + + + + Chess + + + + Chess Bishop + + + + Chess Board + + + + Chess King + + + + Chess Knight + + + + Chess Pawn + + + + Chess Queen + + + + Chess Rook + + + + Chevron Circle Down + + + + Chevron Circle Left + + + + Chevron Circle Right + + + + Chevron Circle Up + + + + chevron-down + + + + chevron-left + + + + chevron-right + + + + chevron-up + + + + Child + + + + Church + + + + Circle + + + + Circle Notched + + + + City + + + + Clipboard + + + + Clipboard Check + + + + Clipboard List + + + + Clock + + + + Clone + + + + Closed Captioning + + + + Cloud + + + + Alternate Cloud Download + + + + Cloud with Moon + + + + Cloud with Sun + + + + Alternate Cloud Upload + + + + Cocktail + + + + Code + + + + Code Branch + + + + Coffee + + + + cog + + + + cogs + + + + Coins + + + + Columns + + + + comment + + + + Alternate Comment + + + + Comment Dollar + + + + Comment Dots + + + + Comment Slash + + + + comments + + + + Comments Dollar + + + + Compact Disc + + + + Compass + + + + Compress + + + + Concierge Bell + + + + Cookie + + + + Cookie Bite + + + + Copy + + + + Copyright + + + + Couch + + + + Credit Card + + + + crop + + + + Alternate Crop + + + + Cross + + + + Crosshairs + + + + Crow + + + + Crown + + + + Cube + + + + Cubes + + + + Cut + + + + Database + + + + Deaf + + + + Desktop + + + + Dharmachakra + + + + Diagnoses + + + + Dice + + + + Dice D20 + + + + Dice D6 + + + + Dice Five + + + + Dice Four + + + + Dice One + + + + Dice Six + + + + Dice Three + + + + Dice Two + + + + Digital Tachograph + + + + Directions + + + + Divide + + + + Dizzy Face + + + + DNA + + + + Dog + + + + Dollar Sign + + + + Dolly + + + + Dolly Flatbed + + + + + Door Closed + + + + Door Open + + + + Dot Circle + + + + Dove + + + + Download + + + + Drafting Compass + + + + Dragon + + + + Draw Polygon + + + + Drum + + + + Drum Steelpan + + + + Drumstick with Bite Taken Out + + + + Dumbbell + + + + Dungeon + + + + Edit + + + + eject + + + + Horizontal Ellipsis + + + + Vertical Ellipsis + + + + Envelope + + + + Envelope Open + + + + Envelope Open-text + + + + Envelope Square + + + + Equals + + + + eraser + + + + Euro Sign + + + + Alternate Exchange + + + + exclamation + + + + Exclamation Circle + + + + Exclamation Triangle + + + + Expand + + + + Alternate Expand Arrows + + + + Alternate External Link + + + + Alternate External Link Square + + + + Eye + + + + Eye Dropper + + + + Eye Slash + + + + fast-backward + + + + fast-forward + + + + Fax + + + + Feather + + + + Alternate Feather + + + + Female + + + + fighter-jet + + + + File + + + + Alternate File + + + + Archive File + + + + Audio File + + + + Code File + + + + File Contract + + + + File CSV + + + + File Download + + + + Excel File + + + + File Export + + + + Image File + + + + File Import + + + + File Invoice + + + + File Invoice with US Dollar + + + + Medical File + + + + Alternate Medical File + + + + PDF File + + + + Powerpoint File + + + + File Prescription + + + + File Signature + + + + File Upload + + + + Video File + + + + Word File + + + + Fill + + + + Fill Drip + + + + Film + + + + Filter + + + + Fingerprint + + + + fire + + + + fire-extinguisher + + + + First Aid + + + + Fish + + + + Raised Fist + + + + flag + + + + flag-checkered + + + + Flask + + + + Flushed Face + + + + Folder + + + + Folder Minus + + + + Folder Open + + + + Folder Plus + + + + font + + + + Font Awesome Full Logo + + + + Football Ball + + + + forward + + + + Frog + + + + Frowning Face + + + + Frowning Face With Open Mouth + + + + Funnel Dollar + + + + Futbol + + + + Gamepad + + + + Gas Pump + + + + Gavel + + + + Gem + + + + Genderless + + + + Ghost + + + + gift + + + + Martini Glass + + + + Alternate Glass Martini + + + + Glasses + + + + Globe + + + + Globe with Africa shown + + + + Globe with Americas shown + + + + Globe with Asia shown + + + + Golf Ball + + + + Gopuram + + + + Graduation Cap + + + + Greater Than + + + + Greater Than Equal To + + + + Grimacing Face + + + + Grinning Face + + + + Alternate Grinning Face + + + + Grinning Face With Smiling Eyes + + + + Grinning Face With Sweat + + + + Smiling Face With Heart-Eyes + + + + Grinning Squinting Face + + + + Rolling on the Floor Laughing + + + + Star-Struck + + + + Face With Tears of Joy + + + + Face With Tongue + + + + Squinting Face With Tongue + + + + Winking Face With Tongue + + + + Grinning Winking Face + + + + Grip Horizontal + + + + Grip Vertical + + + + H Square + + + + Hammer + + + + Hamsa + + + + Hand Holding + + + + Hand Holding Heart + + + + Hand Holding US Dollar + + + + Lizard (Hand) + + + + Paper (Hand) + + + + Peace (Hand) + + + + Hand Pointing Down + + + + Hand Pointing Left + + + + Hand Pointing Right + + + + Hand Pointing Up + + + + Pointer (Hand) + + + + Rock (Hand) + + + + Scissors (Hand) + + + + Spock (Hand) + + + + Hands + + + + Helping Hands + + + + Handshake + + + + Hanukiah + + + + Hashtag + + + + Wizard's Hat + + + + Haykal + + + + HDD + + + + heading + + + + headphones + + + + Alternate Headphones + + + + Headset + + + + Heart + + + + Heartbeat + + + + Helicopter + + + + Highlighter + + + + Hiking + + + + Hippo + + + + History + + + + Hockey Puck + + + + home + + + + Horse + + + + hospital + + + + Alternate Hospital + + + + Hospital Symbol + + + + Hot Tub + + + + Hotel + + + + Hourglass + + + + Hourglass End + + + + Hourglass Half + + + + Hourglass Start + + + + House Damage + + + + Hryvnia + + + + I Beam Cursor + + + + Identification Badge + + + + Identification Card + + + + Alternate Identification Card + + + + Image + + + + Images + + + + inbox + + + + Indent + + + + Industry + + + + Infinity + + + + Info + + + + Info Circle + + + + italic + + + + Jedi + + + + Joint + + + + Journal of the Whills + + + + Kaaba + + + + key + + + + Keyboard + + + + Khanda + + + + Kissing Face + + + + Kissing Face With Smiling Eyes + + + + Face Blowing a Kiss + + + + Kiwi Bird + + + + Landmark + + + + Language + + + + Laptop + + + + Laptop Code + + + + Grinning Face With Big Eyes + + + + Laugh Face with Beaming Eyes + + + + Laughing Squinting Face + + + + Laughing Winking Face + + + + Layer Group + + + + leaf + + + + Lemon + + + + Less Than + + + + Less Than Equal To + + + + Alternate Level Down + + + + Alternate Level Up + + + + Life Ring + + + + Lightbulb + + + + Link + + + + Turkish Lira Sign + + + + List + + + + Alternate List + + + + list-ol + + + + list-ul + + + + location-arrow + + + + lock + + + + Lock Open + + + + Alternate Long Arrow Down + + + + Alternate Long Arrow Left + + + + Alternate Long Arrow Right + + + + Alternate Long Arrow Up + + + + Low Vision + + + + Luggage Cart + + + + magic + + + + magnet + + + + Mail Bulk + + + + Male + + + + Map + + + + Map Marked + + + + Alternate Map Marked + + + + map-marker + + + + Alternate Map Marker + + + + Map Pin + + + + Map Signs + + + + Marker + + + + Mars + + + + Mars Double + + + + Mars Stroke + + + + Mars Stroke Horizontal + + + + Mars Stroke Vertical + + + + Mask + + + + Medal + + + + medkit + + + + Neutral Face + + + + Face Without Mouth + + + + Face With Rolling Eyes + + + + Memory + + + + Menorah + + + + Mercury + + + + Microchip + + + + microphone + + + + Alternate Microphone + + + + Alternate Microphone Slash + + + + Microphone Slash + + + + Microscope + + + + minus + + + + Minus Circle + + + + Minus Square + + + + Mobile Phone + + + + Alternate Mobile + + + + Money Bill + + + + Alternate Money Bill + + + + Wavy Money Bill + + + + Alternate Wavy Money Bill + + + + Money Check + + + + Alternate Money Check + + + + Monument + + + + Moon + + + + Mortar Pestle + + + + Mosque + + + + Motorcycle + + + + Mountain + + + + Mouse Pointer + + + + Music + + + + Wired Network + + + + Neuter + + + + Newspaper + + + + Not Equal + + + + Medical Notes + + + + Object Group + + + + Object Ungroup + + + + Oil Can + + + + Om + + + + Otter + + + + Outdent + + + + Paint Brush + + + + Paint Roller + + + + Palette + + + + Pallet + + + + Paper Plane + + + + Paperclip + + + + Parachute Box + + + + paragraph + + + + Parking + + + + Passport + + + + Pastafarianism + + + + Paste + + + + pause + + + + Pause Circle + + + + Paw + + + + Peace + + + + Pen + + + + Alternate Pen + + + + Pen Fancy + + + + Pen Nib + + + + Pen Square + + + + Alternate Pencil + + + + Pencil Ruler + + + + People Carry + + + + Percent + + + + Percentage + + + + Phone + + + + Phone Slash + + + + Phone Square + + + + Phone Volume + + + + Piggy Bank + + + + Pills + + + + Place Of Worship + + + + plane + + + + Plane Arrival + + + + Plane Departure + + + + play + + + + Play Circle + + + + Plug + + + + plus + + + + Plus Circle + + + + Plus Square + + + + Podcast + + + + Poll + + + + Poll H + + + + Poo + + + + Poop + + + + Portrait + + + + Pound Sign + + + + Power Off + + + + Pray + + + + Praying Hands + + + + Prescription + + + + Prescription Bottle + + + + Alternate Prescription Bottle + + + + print + + + + Procedures + + + + Project Diagram + + + + Puzzle Piece + + + + qrcode + + + + Question + + + + Question Circle + + + + Quidditch + + + + quote-left + + + + quote-right + + + + Quran + + + + random + + + + Receipt + + + + Recycle + + + + Redo + + + + Alternate Redo + + + + Registered Trademark + + + + Reply + + + + reply-all + + + + Retweet + + + + Ribbon + + + + Ring + + + + road + + + + Robot + + + + rocket + + + + Route + + + + rss + + + + RSS Square + + + + Ruble Sign + + + + Ruler + + + + Ruler Combined + + + + Ruler Horizontal + + + + Ruler Vertical + + + + Running + + + + Indian Rupee Sign + + + + Crying Face + + + + Loudly Crying Face + + + + Save + + + + School + + + + Screwdriver + + + + Scroll + + + + Search + + + + Search Dollar + + + + Search Location + + + + Search Minus + + + + Search Plus + + + + Seedling + + + + Server + + + + Shapes + + + + Share + + + + Alternate Share + + + + Alternate Share Square + + + + Share Square + + + + Shekel Sign + + + + Alternate Shield + + + + Ship + + + + Shipping Fast + + + + Shoe Prints + + + + Shopping Bag + + + + Shopping Basket + + + + shopping-cart + + + + Shower + + + + Shuttle Van + + + + Sign + + + + Alternate Sign In + + + + Sign Language + + + + Alternate Sign Out + + + + signal + + + + Signature + + + + Sitemap + + + + Skull + + + + Skull & Crossbones + + + + Slash + + + + Horizontal Sliders + + + + Smiling Face + + + + Beaming Face With Smiling Eyes + + + + Winking Face + + + + Smoking + + + + Smoking Ban + + + + Snowflake + + + + Socks + + + + Solar Panel + + + + Sort + + + + Sort Alpha Down + + + + Sort Alpha Up + + + + Sort Amount Down + + + + Sort Amount Up + + + + Sort Down (Descending) + + + + Sort Numeric Down + + + + Sort Numeric Up + + + + Sort Up (Ascending) + + + + Spa + + + + Space Shuttle + + + + Spider + + + + Spinner + + + + Splotch + + + + Spray Can + + + + Square + + + + Square Full + + + + Square Root Alternate + + + + Stamp + + + + Star + + + + Star and Crescent + + + + star-half + + + + Alternate Star Half + + + + Star of David + + + + Star of Life + + + + step-backward + + + + step-forward + + + + Stethoscope + + + + Sticky Note + + + + stop + + + + Stop Circle + + + + Stopwatch + + + + Store + + + + Alternate Store + + + + Stream + + + + Street View + + + + Strikethrough + + + + Stroopwafel + + + + subscript + + + + Subway + + + + Suitcase + + + + Suitcase Rolling + + + + Sun + + + + superscript + + + + Hushed Face + + + + Swatchbook + + + + Swimmer + + + + Swimming Pool + + + + Synagogue + + + + Sync + + + + Alternate Sync + + + + Syringe + + + + table + + + + Table Tennis + + + + tablet + + + + Alternate Tablet + + + + Tablets + + + + Alternate Tachometer + + + + tag + + + + tags + + + + Tape + + + + Tasks + + + + Taxi + + + + Teeth + + + + Teeth Open + + + + Terminal + + + + text-height + + + + text-width + + + + th + + + + th-large + + + + th-list + + + + Theater Masks + + + + Thermometer + + + + Thermometer Empty + + + + Thermometer Full + + + + Thermometer 1/2 Full + + + + Thermometer 1/4 Full + + + + Thermometer 3/4 Full + + + + thumbs-down + + + + thumbs-up + + + + Thumbtack + + + + Alternate Ticket + + + + Times + + + + Times Circle + + + + tint + + + + Tint Slash + + + + Tired Face + + + + Toggle Off + + + + Toggle On + + + + Toilet Paper + + + + Toolbox + + + + Tooth + + + + Torah + + + + Torii Gate + + + + Tractor + + + + Trademark + + + + Traffic Light + + + + Train + + + + Transgender + + + + Alternate Transgender + + + + Trash + + + + Alternate Trash + + + + Tree + + + + trophy + + + + truck + + + + Truck Loading + + + + Truck Monster + + + + Truck Moving + + + + Truck Side + + + + T-Shirt + + + + TTY + + + + Television + + + + Umbrella + + + + Umbrella Beach + + + + Underline + + + + Undo + + + + Alternate Undo + + + + Universal Access + + + + University + + + + unlink + + + + unlock + + + + Alternate Unlock + + + + Upload + + + + User + + + + Alternate User + + + + Alternate User Slash + + + + User Astronaut + + + + User Check + + + + User Circle + + + + User Clock + + + + User Cog + + + + User Edit + + + + User Friends + + + + User Graduate + + + + User Injured + + + + User Lock + + + + user-md + + + + User Minus + + + + User Ninja + + + + User Plus + + + + User Secret + + + + User Shield + + + + User Slash + + + + User Tag + + + + User Tie + + + + Remove User + + + + Users + + + + Users Cog + + + + Utensil Spoon + + + + Utensils + + + + Vector Square + + + + Venus + + + + Venus Double + + + + Venus Mars + + + + Vial + + + + Vials + + + + Video + + + + Video Slash + + + + Vihara + + + + Volleyball Ball + + + + Volume Down + + + + Volume Mute + + + + Volume Off + + + + Volume Up + + + + Walking + + + + Wallet + + + + Warehouse + + + + Weight + + + + Hanging Weight + + + + Wheelchair + + + + WiFi + + + + Wind + + + + Window Close + + + + Window Maximize + + + + Window Minimize + + + + Window Restore + + + + Wine Bottle + + + + Wine Glass + + + + Alternate Wine Glas + + + + Won Sign + + + + Wrench + + + + X-Ray + + + + Yen Sign + + + + Yin Yang + + + diff --git a/yarn.lock b/yarn.lock index 3a107446ed4..c20f002dd5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -87,6 +87,11 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" +"@fortawesome/fontawesome-free@^5.4.1": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.4.1.tgz#6194786c1a705ab84253e06429834466670e3c3f" + integrity sha512-ZcxfUmLFl4RLG71cPeZcTXRa6rt3xLnMmomAb7aYKRzUmlRRj7E8EVqSwYSXBiV2x6XpSQmGOQmNQx6HSeSwVQ== + "@sinonjs/commons@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.0.2.tgz#3e0ac737781627b8844257fadc3d803997d0526e"