diff --git a/.betterer.results b/.betterer.results index 2cdb78262b7..0266d833b36 100644 --- a/.betterer.results +++ b/.betterer.results @@ -1490,33 +1490,16 @@ exports[`better eslint`] = { "public/app/features/admin/UserOrgs.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"], - [0, 0, 0, "Styles should be written using objects.", "3"], - [0, 0, 0, "Styles should be written using objects.", "4"], - [0, 0, 0, "Styles should be written using objects.", "5"], - [0, 0, 0, "Styles should be written using objects.", "6"], - [0, 0, 0, "Styles should be written using objects.", "7"], - [0, 0, 0, "Styles should be written using objects.", "8"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "Styles should be written using objects.", "10"], - [0, 0, 0, "Styles should be written using objects.", "11"], - [0, 0, 0, "Styles should be written using objects.", "12"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "13"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "14"], - [0, 0, 0, "Styles should be written using objects.", "15"], - [0, 0, 0, "Styles should be written using objects.", "16"], - [0, 0, 0, "Styles should be written using objects.", "17"], - [0, 0, 0, "Styles should be written using objects.", "18"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "19"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "20"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "21"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "22"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "23"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "24"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "25"], - [0, 0, 0, "Styles should be written using objects.", "26"], - [0, 0, 0, "Styles should be written using objects.", "27"], - [0, 0, 0, "Styles should be written using objects.", "28"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], + [0, 0, 0, "No untranslated strings. Wrap text with ", "11"] ], "public/app/features/admin/UserPermissions.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], @@ -5417,9 +5400,7 @@ exports[`better eslint`] = { ], "public/app/features/storage/RootView.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "Styles should be written using objects.", "2"], - [0, 0, 0, "Styles should be written using objects.", "3"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], "public/app/features/storage/StorageFolderPage.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] diff --git a/.eslintignore b/.eslintignore index 01e0c6ec342..95ace0ec535 100644 --- a/.eslintignore +++ b/.eslintignore @@ -13,6 +13,8 @@ node_modules /public/lib/monaco /scripts/grafana-server/tmp vendor +e2e/custom-plugins +playwright-report # TS generate from cue by cuetsy **/*.gen.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 568522b46fd..196c752d732 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -224,6 +224,7 @@ /devenv/local-npm/ @grafana/frontend-ops /devenv/vscode/ @grafana/frontend-ops /devenv/setup.sh @grafana/grafana-backend-services-squad +/devenv/plugins.yaml @grafana/plugins-platform-frontend # Emails /emails/ @grafana/alerting-frontend diff --git a/contribute/developer-guide.md b/contribute/developer-guide.md index 2607b91f1a9..bcdb979b790 100644 --- a/contribute/developer-guide.md +++ b/contribute/developer-guide.md @@ -235,7 +235,7 @@ yarn e2e:dev #### To run the Playwright tests: -**Note:** If you're using VS Code as your development editor, it's recommended to install the [Playwright test extension](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright). It allows you to run, debug and generate Playwright tests from within the editor. For more information about the extension and how to install it, refer to the [Playwright documentation](https://playwright.dev/docs/getting-started-vscode). +**Note:** If you're using VS Code as your development editor, it's recommended to install the [Playwright test extension](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright). It allows you to run, debug and generate Playwright tests from within the editor. For more information about the extension and how to use reports to analyze failing tests, refer to the [Playwright documentation](https://playwright.dev/docs/getting-started-vscode). Each version of Playwright needs specific versions of browser binaries to operate. You need to use the Playwright CLI to install these browsers. @@ -243,22 +243,16 @@ Each version of Playwright needs specific versions of browser binaries to operat yarn playwright install chromium ``` -To run all tests in a headless Chromium browser and display results in the terminal: +To run all tests in a headless Chromium browser and display results in the terminal. This assumes you have Grafana running on port 3000. ``` yarn e2e:playwright ``` -For a better developer experience, open the Playwright UI where you can visually walk through each step of the test and see what was happening before, during, and after each step. +The following script starts a Grafana [development server](https://github.com/grafana/grafana/blob/main/scripts/grafana-server/start-server) (same server that is being used when running e2e tests in Drone CI) on port 3001 and runs the Playwright tests. The development server is provisioned with the [devenv](https://github.com/grafana/grafana/blob/main/contribute/developer-guide.md#add-data-sources) dashboards, data sources and apps. ``` -yarn e2e:playwright:ui -``` - -To open the HTML reporter for the last test run session: - -``` -yarn e2e:playwright:report +yarn e2e:playwright:server ``` ## Configure Grafana for development diff --git a/contribute/style-guides/e2e-plugins.md b/contribute/style-guides/e2e-plugins.md index f675db96784..6324204c4f6 100644 --- a/contribute/style-guides/e2e-plugins.md +++ b/contribute/style-guides/e2e-plugins.md @@ -33,3 +33,5 @@ Playwright end-to-end tests for plugins should be added to the [`e2e/plugin-e2e` The script above assumes you have Grafana running on `localhost:3000`. You may change this by providing environment variables. `HOST=127.0.0.1 PORT=3001 yarn e2e:playwright` + +- `yarn e2e:playwright:server` will start a Grafana [development server](https://github.com/grafana/grafana/blob/main/scripts/grafana-server/start-server) on port 3001 and run the Playwright tests. The development server is provisioned with the [devenv](https://github.com/grafana/grafana/blob/main/contribute/developer-guide.md#add-data-sources) dashboards, data sources and apps. diff --git a/devenv/dev-dashboards/extensions/link-onclick-extensions.json b/devenv/dev-dashboards/extensions/link-onclick-extensions.json new file mode 100644 index 00000000000..5119eb4c1b9 --- /dev/null +++ b/devenv/dev-dashboards/extensions/link-onclick-extensions.json @@ -0,0 +1,342 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Link with one query", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 8 + }, + "id": 6, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "showRowNums": false + }, + "pluginVersion": "10.1.0-55406pre", + "title": "No extensions", + "type": "table" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 8 + }, + "id": 4, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "testdata" + }, + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 4 + }, + { + "datasource": { + "type": "testdata" + }, + "hide": false, + "refId": "B", + "scenarioId": "random_walk", + "seriesCount": 1 + } + ], + "title": "Link with new name", + "type": "piechart" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 16 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "testdata" + }, + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 1 + }, + { + "datasource": { + "type": "testdata" + }, + "hide": false, + "refId": "B", + "scenarioId": "random_walk", + "seriesCount": 1 + } + ], + "title": "Link with defaults", + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Link Extensions (onClick)", + "uid": "dbfb47c5-e5e5-4d28-8ac7-35f349b95946", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/devenv/dev-dashboards/extensions/link-path-extensions.json b/devenv/dev-dashboards/extensions/link-path-extensions.json new file mode 100644 index 00000000000..6ef0669e371 --- /dev/null +++ b/devenv/dev-dashboards/extensions/link-path-extensions.json @@ -0,0 +1,237 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 6, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "showRowNums": false + }, + "pluginVersion": "9.5.0-53420pre", + "title": "No extensions", + "type": "table" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "testdata" + }, + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 4 + } + ], + "title": "Link with new name", + "type": "piechart" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 8 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Link with defaults", + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Link Extensions (path)", + "uid": "d1fbb077-cd44-4738-8c8a-d4e66748b719", + "version": 3, + "weekStart": "" + } \ No newline at end of file diff --git a/devenv/jsonnet/dev-dashboards.libsonnet b/devenv/jsonnet/dev-dashboards.libsonnet index 6c9eb8afb30..8eabc329c5f 100644 --- a/devenv/jsonnet/dev-dashboards.libsonnet +++ b/devenv/jsonnet/dev-dashboards.libsonnet @@ -59,6 +59,8 @@ "join-by-field": (import '../dev-dashboards/transforms/join-by-field.json'), "join-by-labels": (import '../dev-dashboards/transforms/join-by-labels.json'), "lazy_loading": (import '../dev-dashboards/panel-common/lazy_loading.json'), + "link-onclick-extensions": (import '../dev-dashboards/extensions/link-onclick-extensions.json'), + "link-path-extensions": (import '../dev-dashboards/extensions/link-path-extensions.json'), "linked-viz": (import '../dev-dashboards/panel-common/linked-viz.json'), "live-flakey": (import '../dev-dashboards/live/live-flakey.json'), "live-flakey-refresh": (import '../dev-dashboards/live/live-flakey-refresh.json'), diff --git a/devenv/plugins.yaml b/devenv/plugins.yaml new file mode 100644 index 00000000000..9e488cc065f --- /dev/null +++ b/devenv/plugins.yaml @@ -0,0 +1,19 @@ +apiVersion: 1 + +apps: + - type: myorg-extensions-app + org_id: 1 + org_name: Main Org. + disabled: false + - type: myorg-a-app + org_id: 1 + org_name: Main Org. + disabled: false + - type: myorg-b-app + org_id: 1 + org_name: Main Org. + disabled: false + - type: myorg-extensionpoint-app + org_id: 1 + org_name: Main Org. + disabled: false diff --git a/e2e/custom-plugins/README.md b/e2e/custom-plugins/README.md new file mode 100644 index 00000000000..9fef8ba9aaf --- /dev/null +++ b/e2e/custom-plugins/README.md @@ -0,0 +1,5 @@ +# Custom plugins + +Plugins in this directory will be installed when the e2e [test server](https://github.com/grafana/grafana/blob/main/scripts/grafana-server/start-server) is started. Optionally, you can provision the plugin by adding configuration to the [datasources.yaml](https://github.com/grafana/grafana/blob/extensions/add-e2e-tests/devenv/datasources.yaml) or to the [plugins.yaml](https://github.com/grafana/grafana/blob/extensions/add-e2e-tests/devenv/plugins.yaml). + +These plugins are not being built as part of CI. Plugins in this directory are being version controlled, so make sure the bundle size is small. Only use dependencies provided by the runtime (see list of runtime dependencies [here](https://github.com/grafana/plugin-tools/blob/08b67179bdbf8847788c54aadb22654aa1a7c060/packages/create-plugin/templates/common/.config/webpack/webpack.config.ts#L36)). diff --git a/e2e/custom-plugins/app-with-extension-point/README.md b/e2e/custom-plugins/app-with-extension-point/README.md new file mode 100644 index 00000000000..99b656fa109 --- /dev/null +++ b/e2e/custom-plugins/app-with-extension-point/README.md @@ -0,0 +1,12 @@ +# App with extension point + +This app was initially copied from the [app-with-extension-point](https://github.com/grafana/grafana-plugin-examples/tree/main/examples/app-with-extension-point) example plugin. The plugin bundle is using AMD, but it's not minified and the plugin feature set is small so it should be possible to make changes in this file if necessary. + +To test this app: + +```sh +# start e2e test instance (it will install this plugin) +PORT=3000 ./scripts/grafana-server/start-server +# run Playwright tests using Playwright VSCode extension or with the following script +yarn e2e:playwright +``` diff --git a/e2e/custom-plugins/app-with-extension-point/module.js b/e2e/custom-plugins/app-with-extension-point/module.js new file mode 100644 index 00000000000..f08f08a2587 --- /dev/null +++ b/e2e/custom-plugins/app-with-extension-point/module.js @@ -0,0 +1,141 @@ +define(['@grafana/data', 'react', '@grafana/ui', '@grafana/runtime'], function (data, React, UI, runtime) { + 'use strict'; + + const styles = { + container: 'main-app-body', + actions: { button: 'action-button' }, + modal: { container: 'container', open: 'open-link' }, + appA: { container: 'a-app-body' }, + appB: { modal: 'b-app-modal' }, + }; + + function ModalComponent({ onDismiss, title, path }) { + return React.createElement( + UI.Modal, + { 'data-testid': styles.modal.container, title, isOpen: true, onDismiss }, + React.createElement( + UI.VerticalGroup, + { spacing: 'sm' }, + React.createElement('p', null, 'Do you want to proceed in the current tab or open a new tab?') + ), + React.createElement( + UI.Modal.ButtonRow, + null, + React.createElement(UI.Button, { onClick: onDismiss, fill: 'outline', variant: 'secondary' }, 'Cancel'), + React.createElement( + UI.Button, + { + type: 'submit', + variant: 'secondary', + onClick: function () { + window.open(data.locationUtil.assureBaseUrl(path), '_blank'); + onDismiss(); + }, + icon: 'external-link-alt', + }, + 'Open in new tab' + ), + React.createElement( + UI.Button, + { + 'data-testid': styles.modal.open, + type: 'submit', + variant: 'primary', + onClick: function () { + runtime.locationService.push(path); + }, + icon: 'apps', + }, + 'Open' + ) + ) + ); + } + + function ActionComponent({ extensions }) { + const options = React.useMemo( + function () { + return extensions.reduce(function (acc, extension) { + if (runtime.isPluginExtensionLink(extension)) { + acc.push({ label: extension.title, title: extension.title, value: extension }); + } + return acc; + }, []); + }, + [extensions] + ); + + const [selected, setSelected] = React.useState(); + + return options.length === 0 + ? React.createElement(UI.Button, null, 'Run default action') + : React.createElement( + React.Fragment, + null, + React.createElement( + UI.ButtonGroup, + null, + React.createElement( + UI.ToolbarButton, + { + key: 'default-action', + variant: 'canvas', + onClick: function () { + alert('You triggered the default action'); + }, + }, + 'Run default action' + ), + React.createElement(UI.ButtonSelect, { + 'data-testid': styles.actions.button, + key: 'select-extension', + variant: 'canvas', + options: options, + onChange: function (e) { + const extension = e.value; + if (runtime.isPluginExtensionLink(extension)) { + if (extension.path) setSelected(extension); + if (extension.onClick) extension.onClick(); + } + }, + }) + ), + selected && + selected.path && + React.createElement(ModalComponent, { + title: selected.title, + path: selected.path, + onDismiss: function () { + setSelected(undefined); + }, + }) + ); + } + + class RootComponent extends React.PureComponent { + render() { + const { extensions } = runtime.getPluginExtensions({ + extensionPointId: 'plugins/myorg-extensionpoint-app/actions', + context: {}, + }); + + return React.createElement( + 'div', + { 'data-testid': styles.container, style: { marginTop: '5%' } }, + React.createElement( + UI.HorizontalGroup, + { align: 'flex-start', justify: 'center' }, + React.createElement( + UI.HorizontalGroup, + null, + React.createElement('span', null, 'Hello Grafana! These are the actions you can trigger from this plugin'), + React.createElement(ActionComponent, { extensions: extensions }) + ) + ) + ); + } + } + + const plugin = new data.AppPlugin().setRootPage(RootComponent); + return { plugin: plugin }; +}); diff --git a/e2e/custom-plugins/app-with-extension-point/plugin.json b/e2e/custom-plugins/app-with-extension-point/plugin.json new file mode 100644 index 00000000000..b1d3c396384 --- /dev/null +++ b/e2e/custom-plugins/app-with-extension-point/plugin.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://raw.githubusercontent.com/grafana/grafana/main/docs/sources/developers/plugins/plugin.schema.json", + "type": "app", + "name": "Extension Point App", + "id": "myorg-extensionpoint-app", + "preload": true, + "info": { + "keywords": ["app"], + "description": "Show case how to add an extension point to your plugin", + "author": { + "name": "Myorg" + }, + "logos": { + "small": "img/logo.svg", + "large": "img/logo.svg" + }, + "screenshots": [], + "version": "1.0.0", + "updated": "2024-06-11" + }, + "includes": [ + { + "type": "page", + "name": "Default", + "path": "/a/myorg-extensionpoint-app", + "role": "Admin", + "addToNav": true, + "defaultNav": true + } + ], + "dependencies": { + "grafanaDependency": ">=10.3.3", + "plugins": [] + }, + "generated": { + "extensions": [] + } +} diff --git a/e2e/custom-plugins/app-with-extension-point/plugins/myorg-a-app/module.js b/e2e/custom-plugins/app-with-extension-point/plugins/myorg-a-app/module.js new file mode 100644 index 00000000000..055db7959fb --- /dev/null +++ b/e2e/custom-plugins/app-with-extension-point/plugins/myorg-a-app/module.js @@ -0,0 +1,26 @@ +define(['@grafana/data', 'react'], function (data, React) { + 'use strict'; + + const styles = { + container: 'a-app-body', + }; + + class RootComponent extends React.PureComponent { + render() { + return React.createElement( + 'div', + { 'data-testid': styles.container, className: 'page-container' }, + 'Hello Grafana!' + ); + } + } + + const plugin = new data.AppPlugin().setRootPage(RootComponent).configureExtensionLink({ + title: 'Go to A', + description: 'Navigating to plugin A', + extensionPointId: 'plugins/myorg-extensionpoint-app/actions', + path: '/a/myorg-a-app/', + }); + + return { plugin: plugin }; +}); diff --git a/e2e/custom-plugins/app-with-extension-point/plugins/myorg-a-app/plugin.json b/e2e/custom-plugins/app-with-extension-point/plugins/myorg-a-app/plugin.json new file mode 100644 index 00000000000..a37ec4e1710 --- /dev/null +++ b/e2e/custom-plugins/app-with-extension-point/plugins/myorg-a-app/plugin.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://raw.githubusercontent.com/grafana/grafana/main/docs/sources/developers/plugins/plugin.schema.json", + "type": "app", + "name": "A App", + "id": "myorg-a-app", + "preload": true, + "info": { + "keywords": ["app"], + "description": "Will extend root app with ui extensions", + "author": { + "name": "Myorg" + }, + "logos": { + "small": "img/logo.svg", + "large": "img/logo.svg" + }, + "screenshots": [], + "version": "%VERSION%", + "updated": "%TODAY%" + }, + "includes": [ + { + "type": "page", + "name": "Default", + "path": "/a/myorg-a-app", + "role": "Admin", + "addToNav": false, + "defaultNav": false + } + ], + "dependencies": { + "grafanaDependency": ">=10.3.3", + "plugins": [] + }, + "generated": { + "extensions": [ + { + "extensionPointId": "plugins/myorg-extensionpoint-app/actions", + "title": "Go to A", + "description": "Navigating to pluging A", + "type": "link" + } + ] + } +} diff --git a/e2e/custom-plugins/app-with-extension-point/plugins/myorg-b-app/module.js b/e2e/custom-plugins/app-with-extension-point/plugins/myorg-b-app/module.js new file mode 100644 index 00000000000..03c7468e6ae --- /dev/null +++ b/e2e/custom-plugins/app-with-extension-point/plugins/myorg-b-app/module.js @@ -0,0 +1,27 @@ +define(['react', '@grafana/data'], function (React, data) { + 'use strict'; + + class RootComponent extends React.PureComponent { + render() { + return React.createElement('div', { className: 'page-container' }, 'Hello Grafana!'); + } + } + + const modalId = 'b-app-modal'; + + const plugin = new data.AppPlugin().setRootPage(RootComponent).configureExtensionLink({ + title: 'Open from B', + description: 'Open a modal from plugin B', + extensionPointId: 'plugins/myorg-extensionpoint-app/actions', + onClick: function (e, { openModal }) { + openModal({ + title: 'Modal from app B', + body: function () { + return React.createElement('div', { 'data-testid': modalId }, 'From plugin B'); + }, + }); + }, + }); + + return { plugin: plugin }; +}); diff --git a/e2e/custom-plugins/app-with-extension-point/plugins/myorg-b-app/plugin.json b/e2e/custom-plugins/app-with-extension-point/plugins/myorg-b-app/plugin.json new file mode 100644 index 00000000000..ac501bc7f56 --- /dev/null +++ b/e2e/custom-plugins/app-with-extension-point/plugins/myorg-b-app/plugin.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://raw.githubusercontent.com/grafana/grafana/main/docs/sources/developers/plugins/plugin.schema.json", + "type": "app", + "name": "B App", + "id": "myorg-b-app", + "preload": true, + "info": { + "keywords": ["app"], + "description": "Will extend root app with ui extensions", + "author": { + "name": "Myorg" + }, + "logos": { + "small": "img/logo.svg", + "large": "img/logo.svg" + }, + "screenshots": [], + "version": "%VERSION%", + "updated": "%TODAY%" + }, + "includes": [ + { + "type": "page", + "name": "Default", + "path": "/a/myorg-b-app", + "role": "Admin", + "addToNav": false, + "defaultNav": false + } + ], + "dependencies": { + "grafanaDependency": ">=10.3.3", + "plugins": [] + }, + "generated": { + "extensions": [ + { + "extensionPointId": "plugins/myorg-extensionpoint-app/actions", + "title": "Open from B", + "description": "Open a modal from plugin B", + "type": "link" + } + ] + } +} diff --git a/e2e/custom-plugins/app-with-extensions/README.md b/e2e/custom-plugins/app-with-extensions/README.md new file mode 100644 index 00000000000..62ceac9ced4 --- /dev/null +++ b/e2e/custom-plugins/app-with-extensions/README.md @@ -0,0 +1,12 @@ +# App with extensions + +This app was initially copied from the [app-with-extensions](https://github.com/grafana/grafana-plugin-examples/tree/main/examples/app-with-extensions) example plugin. The plugin bundle is using AMD, but it's not minified and the plugin feature set is small so it should be possible to make changes in this file if necessary. + +To test this app: + +```sh +# start e2e test instance (it will install this plugin) +PORT=3000 ./scripts/grafana-server/start-server +# run Playwright tests using Playwright VSCode extension or with the following script +yarn e2e:playwright +``` diff --git a/e2e/custom-plugins/app-with-extensions/module.js b/e2e/custom-plugins/app-with-extensions/module.js new file mode 100644 index 00000000000..82469a3e211 --- /dev/null +++ b/e2e/custom-plugins/app-with-extensions/module.js @@ -0,0 +1,216 @@ +define(['react', '@grafana/data', '@grafana/ui', '@grafana/runtime', '@emotion/css', 'rxjs'], function ( + React, + data, + ui, + runtime, + css, + rxjs +) { + 'use strict'; + + const styles = { + modalBody: 'ape-modal-body', + mainPageContainer: 'ape-main-page-container', + }; + + class RootComponent extends React.PureComponent { + render() { + return React.createElement( + 'div', + { 'data-testid': styles.mainPageContainer, className: 'page-container' }, + 'Hello Grafana!' + ); + } + } + + const asyncWrapper = (fn) => { + return function () { + const gen = fn.apply(this, arguments); + return new Promise((resolve, reject) => { + function step(key, arg) { + let info, value; + try { + info = gen[key](arg); + value = info.value; + } catch (error) { + reject(error); + return; + } + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(next, throw_); + } + } + function next(value) { + step('next', value); + } + function throw_(value) { + step('throw', value); + } + next(); + }); + }; + }; + + const getStyles = (theme) => ({ + colorWeak: css.css`color: ${theme.colors.text.secondary};`, + marginTop: css.css`margin-top: ${theme.spacing(3)};`, + }); + + const updatePlugin = asyncWrapper(function* (pluginId, settings) { + const response = runtime + .getBackendSrv() + .fetch({ url: `/api/plugins/${pluginId}/settings`, method: 'POST', data: settings }); + return rxjs.lastValueFrom(response); + }); + + const handleUpdate = asyncWrapper(function* (pluginId, settings) { + try { + yield updatePlugin(pluginId, settings); + window.location.reload(); + } catch (error) { + console.error('Error while updating the plugin', error); + } + }); + + const configPageBody = ({ plugin }) => { + const styles = getStyles(ui.useStyles2()); + const { enabled, jsonData } = plugin.meta; + return React.createElement( + 'div', + null, + React.createElement(ui.Legend, null, 'Enable / Disable '), + !enabled && + React.createElement( + React.Fragment, + null, + React.createElement('div', { className: styles.colorWeak }, 'The plugin is currently not enabled.'), + React.createElement( + ui.Button, + { + className: styles.marginTop, + variant: 'primary', + onClick: () => handleUpdate(plugin.meta.id, { enabled: true, pinned: true, jsonData: jsonData }), + }, + 'Enable plugin' + ) + ), + enabled && + React.createElement( + React.Fragment, + null, + React.createElement('div', { className: styles.colorWeak }, 'The plugin is currently enabled.'), + React.createElement( + ui.Button, + { + className: styles.marginTop, + variant: 'destructive', + onClick: () => handleUpdate(plugin.meta.id, { enabled: false, pinned: false, jsonData: jsonData }), + }, + 'Disable plugin' + ) + ) + ); + }; + + const selectQueryModal = ({ targets = [], onDismiss }) => { + const [selectedQuery, setSelectedQuery] = React.useState(targets[0]); + return React.createElement( + 'div', + { 'data-testid': styles.modalBody }, + React.createElement( + 'p', + null, + 'Please select the query you would like to use to create "something" in the plugin.' + ), + React.createElement( + ui.HorizontalGroup, + null, + targets.map((query) => + React.createElement(ui.FilterPill, { + key: query.refId, + label: query.refId, + selected: query.refId === (selectedQuery ? selectedQuery.refId : null), + onClick: () => setSelectedQuery(query), + }) + ) + ), + React.createElement( + ui.Modal.ButtonRow, + null, + React.createElement(ui.Button, { variant: 'secondary', fill: 'outline', onClick: onDismiss }, 'Cancel'), + React.createElement( + ui.Button, + { + disabled: !Boolean(selectedQuery), + onClick: () => { + onDismiss && onDismiss(); + alert(`You selected query "${selectedQuery.refId}"`); + }, + }, + 'OK' + ) + ) + ); + }; + + const plugin = new data.AppPlugin() + .setRootPage(RootComponent) + .addConfigPage({ + title: 'Configuration', + icon: 'cog', + body: configPageBody, + id: 'configuration', + }) + .configureExtensionLink({ + title: 'Open from time series or pie charts (path)', + description: 'This link will only be visible on time series and pie charts', + extensionPointId: data.PluginExtensionPoints.DashboardPanelMenu, + path: `/a/myorg-extensions-app/`, + configure: (context) => { + if (context.dashboard?.title === 'Link Extensions (path)') { + switch (context.pluginId) { + case 'timeseries': + return {}; + case 'piechart': + return { title: `Open from ${context.pluginId}` }; + default: + return; + } + } + }, + }) + .configureExtensionLink({ + title: 'Open from time series or pie charts (onClick)', + description: 'This link will only be visible on time series and pie charts', + extensionPointId: data.PluginExtensionPoints.DashboardPanelMenu, + onClick: (_, { context, openModal }) => { + const targets = context?.targets || []; + const title = context?.title; + if (!targets.length) return; + if (targets.length > 1) { + openModal({ + title: `Select query from "${title}"`, + body: (props) => React.createElement(selectQueryModal, { ...props, targets: targets }), + }); + } else { + alert(`You selected query "${targets[0].refId}"`); + } + }, + configure: (context) => { + if (context.dashboard?.title === 'Link Extensions (onClick)') { + switch (context.pluginId) { + case 'timeseries': + return {}; + case 'piechart': + return { title: `Open from ${context.pluginId}` }; + default: + return; + } + } + }, + }); + + return { plugin: plugin }; +}); diff --git a/e2e/custom-plugins/app-with-extensions/plugin.json b/e2e/custom-plugins/app-with-extensions/plugin.json new file mode 100644 index 00000000000..d54f150b836 --- /dev/null +++ b/e2e/custom-plugins/app-with-extensions/plugin.json @@ -0,0 +1,49 @@ +{ + "$schema": "https://raw.githubusercontent.com/grafana/grafana/main/docs/sources/developers/plugins/plugin.schema.json", + "type": "app", + "name": "Extensions App", + "id": "myorg-extensions-app", + "preload": true, + "info": { + "keywords": ["app"], + "description": "Example on how to extend grafana ui from a plugin", + "author": { + "name": "Myorg" + }, + "logos": { + "small": "img/logo.svg", + "large": "img/logo.svg" + }, + "screenshots": [], + "version": "1.0.0", + "updated": "2024-06-11" + }, + "includes": [ + { + "type": "page", + "name": "Default", + "path": "/a/myorg-extensions-app", + "role": "Admin", + "addToNav": true, + "defaultNav": true + } + ], + "dependencies": { + "grafanaDependency": ">=10.3.3", + "plugins": [] + }, + "extensions": [ + { + "extensionPointId": "grafana/dashboard/panel/menu", + "type": "link", + "title": "Open from time series or pie charts (path)", + "description": "This link will only be visible on time series and pie charts" + }, + { + "extensionPointId": "grafana/dashboard/panel/menu", + "type": "link", + "title": "Open from time series or pie charts (onClick)", + "description": "This link will only be visible on time series and pie charts" + } + ] +} diff --git a/e2e/plugin-e2e/plugin-e2e-api-tests/as-admin-user/extensionPoints.spec.ts b/e2e/plugin-e2e/plugin-e2e-api-tests/as-admin-user/extensionPoints.spec.ts new file mode 100644 index 00000000000..bdd51f67d7e --- /dev/null +++ b/e2e/plugin-e2e/plugin-e2e-api-tests/as-admin-user/extensionPoints.spec.ts @@ -0,0 +1,35 @@ +import { test, expect } from '@grafana/plugin-e2e'; + +const testIds = { + container: 'main-app-body', + actions: { + button: 'action-button', + }, + modal: { + container: 'container', + open: 'open-link', + }, + appA: { + container: 'a-app-body', + }, + appB: { + modal: 'b-app-modal', + }, +}; + +const pluginId = 'myorg-extensionpoint-app'; + +test('should extend the actions menu with a link to a-app plugin', async ({ page }) => { + await page.goto(`/a/${pluginId}/one`); + await page.getByTestId(testIds.actions.button).click(); + await page.getByTestId(testIds.container).getByText('Go to A').click(); + await page.getByTestId(testIds.modal.open).click(); + await expect(page.getByTestId(testIds.appA.container)).toBeVisible(); +}); + +test('should extend the actions menu with a command triggered from b-app plugin', async ({ page }) => { + await page.goto(`/a/${pluginId}/one`); + await page.getByTestId(testIds.actions.button).click(); + await page.getByTestId(testIds.container).getByText('Open from B').click(); + await expect(page.getByTestId(testIds.appB.modal)).toBeVisible(); +}); diff --git a/e2e/plugin-e2e/plugin-e2e-api-tests/as-admin-user/extensions.spec.ts b/e2e/plugin-e2e/plugin-e2e-api-tests/as-admin-user/extensions.spec.ts new file mode 100644 index 00000000000..71ada2f4ee5 --- /dev/null +++ b/e2e/plugin-e2e/plugin-e2e-api-tests/as-admin-user/extensions.spec.ts @@ -0,0 +1,38 @@ +import { expect, test } from '@grafana/plugin-e2e'; + +const panelTitle = 'Link with defaults'; +const extensionTitle = 'Open from time series...'; +const testIds = { + modal: { + container: 'ape-modal-body', + }, + mainPage: { + container: 'ape-main-page-container', + }, +}; + +const linkOnClickDashboardUid = 'dbfb47c5-e5e5-4d28-8ac7-35f349b95946'; +const linkPathDashboardUid = 'd1fbb077-cd44-4738-8c8a-d4e66748b719'; + +test('should add link extension (path) with defaults to time series panel', async ({ gotoDashboardPage, page }) => { + const dashboardPage = await gotoDashboardPage({ uid: linkPathDashboardUid }); + const panel = await dashboardPage.getPanelByTitle(panelTitle); + await panel.clickOnMenuItem(extensionTitle, { parentItem: 'Extensions' }); + await expect(page.getByTestId(testIds.mainPage.container)).toBeVisible(); +}); + +test('should add link extension (onclick) with defaults to time series panel', async ({ gotoDashboardPage, page }) => { + const dashboardPage = await gotoDashboardPage({ uid: linkOnClickDashboardUid }); + const panel = await dashboardPage.getPanelByTitle(panelTitle); + await panel.clickOnMenuItem(extensionTitle, { parentItem: 'Extensions' }); + await expect(page.getByRole('dialog')).toContainText('Select query from "Link with defaults"'); +}); + +test('should add link extension (onclick) with new title to pie chart panel', async ({ gotoDashboardPage, page }) => { + const panelTitle = 'Link with new name'; + const extensionTitle = 'Open from piechart'; + const dashboardPage = await gotoDashboardPage({ uid: linkOnClickDashboardUid }); + const panel = await dashboardPage.getPanelByTitle(panelTitle); + await panel.clickOnMenuItem(extensionTitle, { parentItem: 'Extensions' }); + await expect(page.getByRole('dialog')).toContainText('Select query from "Link with new name"'); +}); diff --git a/e2e/plugin-e2e/start-and-run-suite b/e2e/plugin-e2e/start-and-run-suite new file mode 100755 index 00000000000..3322f449345 --- /dev/null +++ b/e2e/plugin-e2e/start-and-run-suite @@ -0,0 +1,23 @@ +#!/bin/bash + +. scripts/grafana-server/variables + +LICENSE_PATH="" + +if [ "$1" = "enterprise" ]; then + if [ "$2" != "dev" ] && [ "$2" != "debug" ]; then + LICENSE_PATH=$2/license.jwt + else + LICENSE_PATH=$3/license.jwt + fi +fi + +if [ "$BASE_URL" != "" ]; then + echo -e "BASE_URL set, skipping starting server" +else + # Start it in the background + ./scripts/grafana-server/start-server $LICENSE_PATH 2>&1 > scripts/grafana-server/server.log & + ./scripts/grafana-server/wait-for-grafana +fi + +PORT=3001 HOST=localhost yarn playwright test diff --git a/package.json b/package.json index bb49dde03d4..b999b4f1c53 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,7 @@ "e2e:enterprise:dev": "./e2e/start-and-run-suite enterprise dev", "e2e:enterprise:debug": "./e2e/start-and-run-suite enterprise debug", "e2e:playwright": "yarn playwright test", - "e2e:playwright:ui": "yarn playwright test --ui", - "e2e:playwright:report": "yarn playwright show-report", + "e2e:playwright:server": "./e2e/plugin-e2e/start-and-run-suite", "test": "jest --notify --watch", "test:coverage": "jest --coverage", "test:coverage:changes": "jest --coverage --changedSince=origin/main", @@ -94,6 +93,7 @@ "@testing-library/jest-dom": "6.4.2", "@testing-library/react": "15.0.2", "@testing-library/user-event": "14.5.2", + "@types/add": "^2", "@types/angular": "1.8.9", "@types/angular-route": "1.7.6", "@types/babel__core": "^7", @@ -258,7 +258,7 @@ "@grafana/prometheus": "workspace:*", "@grafana/runtime": "workspace:*", "@grafana/saga-icons": "workspace:*", - "@grafana/scenes": "4.29.0", + "@grafana/scenes": "^5.0.2", "@grafana/schema": "workspace:*", "@grafana/sql": "workspace:*", "@grafana/ui": "workspace:*", @@ -398,7 +398,8 @@ "uuid": "9.0.1", "visjs-network": "4.25.0", "whatwg-fetch": "3.6.20", - "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz" + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz", + "yarn": "^1.22.22" }, "resolutions": { "underscore": "1.13.6", diff --git a/packages/grafana-ui/src/components/Button/Button.test.tsx b/packages/grafana-ui/src/components/Button/Button.test.tsx deleted file mode 100644 index 68d4e1e55c4..00000000000 --- a/packages/grafana-ui/src/components/Button/Button.test.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { render } from '@testing-library/react'; -import React from 'react'; - -import { Button } from './Button'; - -describe('Button', () => { - it('spins the spinner when specified as an icon', () => { - const { container } = render(); - expect(container.querySelector('.fa-spin')).toBeInTheDocument(); - }); -}); diff --git a/packages/grafana-ui/src/components/Icon/Icon.tsx b/packages/grafana-ui/src/components/Icon/Icon.tsx index d33ed422b4d..d4ade1c4796 100644 --- a/packages/grafana-ui/src/components/Icon/Icon.tsx +++ b/packages/grafana-ui/src/components/Icon/Icon.tsx @@ -6,6 +6,7 @@ import { GrafanaTheme2, isIconName } from '@grafana/data'; import { useStyles2 } from '../../themes/ThemeContext'; import { IconName, IconType, IconSize } from '../../types/icon'; +import { spin } from '../../utils/keyframes'; import { getIconRoot, getIconSubDir, getSvgSize } from './utils'; @@ -33,6 +34,11 @@ const getIconStyles = (theme: GrafanaTheme2) => { orange: css({ fill: theme.v1.palette.orange, }), + spin: css({ + [theme.transitions.handleMotion('no-preference', 'reduce')]: { + animation: `${spin} 2s infinite linear`, + }, + }), }; }; @@ -58,7 +64,9 @@ export const Icon = React.forwardRef( styles.icon, className, type === 'mono' ? { [styles.orange]: name === 'favorite' } : '', - iconName === 'spinner' && 'fa-spin' + { + [styles.spin]: iconName === 'spinner', + } ); return ( diff --git a/packages/grafana-ui/src/components/Spinner/Spinner.tsx b/packages/grafana-ui/src/components/Spinner/Spinner.tsx index a4d45805f29..013f7332a2a 100644 --- a/packages/grafana-ui/src/components/Spinner/Spinner.tsx +++ b/packages/grafana-ui/src/components/Spinner/Spinner.tsx @@ -7,6 +7,7 @@ import { GrafanaTheme2 } from '@grafana/data'; import { useStyles2 } from '../../themes'; import { IconSize, isIconSize } from '../../types'; import { t } from '../../utils/i18n'; +import { spin } from '../../utils/keyframes'; import { Icon } from '../Icon/Icon'; import { getIconRoot, getIconSubDir } from '../Icon/utils'; @@ -46,7 +47,6 @@ export const Spinner = ({ // TODO remove once we fully remove the deprecated type if (typeof size !== 'string' || !isIconSize(size)) { const iconRoot = getIconRoot(); - const iconName = 'spinner'; const subDir = getIconSubDir(iconName, 'default'); const svgPath = `${iconRoot}${subDir}/${iconName}.svg`; return ( @@ -65,7 +65,7 @@ export const Spinner = ({ src={svgPath} width={size} height={size} - className={cx('fa-spin', deprecatedStyles.icon, className)} + className={cx(styles.spin, deprecatedStyles.icon, className)} style={style} /> @@ -84,12 +84,7 @@ export const Spinner = ({ )} > ({ inline: css({ display: 'inline-block', }), + spin: css({ + [theme.transitions.handleMotion('no-preference')]: { + animation: `${spin} 2s infinite linear`, + }, + }), }); // TODO remove once we fully remove the deprecated type diff --git a/packages/grafana-ui/src/themes/GlobalStyles/GlobalStyles.tsx b/packages/grafana-ui/src/themes/GlobalStyles/GlobalStyles.tsx index 377318481c3..f8cddcb4de8 100644 --- a/packages/grafana-ui/src/themes/GlobalStyles/GlobalStyles.tsx +++ b/packages/grafana-ui/src/themes/GlobalStyles/GlobalStyles.tsx @@ -3,6 +3,7 @@ import React from 'react'; import { useTheme2 } from '../ThemeContext'; +import { getAccessibilityStyles } from './accessibility'; import { getAgularPanelStyles } from './angularPanelStyles'; import { getCardStyles } from './card'; import { getCodeStyles } from './code'; @@ -24,6 +25,7 @@ export function GlobalStyles() { return ( { const getOrgRowStyles = stylesFactory((theme: GrafanaTheme2) => { return { - removeButton: css` - margin-right: 0.6rem; - text-decoration: underline; - color: ${theme.v1.palette.blue95}; - `, - label: css` - font-weight: 500; - `, - disabledTooltip: css` - display: flex; - `, - tooltipItem: css` - margin-left: 5px; - `, - tooltipItemLink: css` - color: ${theme.v1.palette.blue95}; - `, - rolePickerWrapper: css` - display: flex; - `, - rolePicker: css` - flex: auto; - margin-right: ${theme.spacing(1)}; - `, + removeButton: css({ + marginRight: '0.6rem', + textDecoration: 'underline', + color: theme.v1.palette.blue95, + }), + label: css({ + fontWeight: 500, + }), + disabledTooltip: css({ + display: 'flex', + }), + tooltipItem: css({ + marginLeft: '5px', + }), + tooltipItemLink: css({ + color: theme.v1.palette.blue95, + }), + rolePickerWrapper: css({ + display: 'flex', + }), + rolePicker: css({ + flex: 'auto', + marginRight: theme.spacing(1), + }), }; }); @@ -222,33 +222,29 @@ class UnThemedOrgRow extends PureComponent { {org.role} )} -
- {canChangeRole && ( - - )} -
+ {canChangeRole && ( + + )} )} -
- {canRemoveFromOrg && ( - - Remove from organization - - )} -
+ {canRemoveFromOrg && ( + + Remove from organization + + )} ); @@ -258,15 +254,15 @@ class UnThemedOrgRow extends PureComponent { const OrgRow = withTheme2(UnThemedOrgRow); const getAddToOrgModalStyles = stylesFactory(() => ({ - modal: css` - width: 500px; - `, - buttonRow: css` - text-align: center; - `, - modalContent: css` - overflow: visible; - `, + modal: css({ + width: '500px', + }), + buttonRow: css({ + textAlign: 'center', + }), + modalContent: css({ + overflow: 'visible', + }), })); interface AddToOrgModalProps { @@ -408,20 +404,20 @@ interface ChangeOrgButtonProps { } const getChangeOrgButtonTheme = (theme: GrafanaTheme2) => ({ - disabledTooltip: css` - display: flex; - `, - tooltipItemLink: css` - color: ${theme.v1.palette.blue95}; - `, - lockMessageClass: css` - font-style: italic; - margin-left: 1.8rem; - margin-right: 0.6rem; - `, - icon: css` - line-height: 2; - `, + disabledTooltip: css({ + display: 'flex', + }), + tooltipItemLink: css({ + color: theme.v1.palette.blue95, + }), + lockMessageClass: css({ + fontStyle: 'italic', + marginLeft: '1.8rem', + marginRight: '0.6rem', + }), + icon: css({ + lineHeight: 2, + }), }); export function ChangeOrgButton({ @@ -511,15 +507,15 @@ export const ExternalUserTooltip = ({ lockMessage }: ExternalUserTooltipProps) = }; const getTooltipStyles = (theme: GrafanaTheme2) => ({ - disabledTooltip: css` - display: flex; - `, - tooltipItemLink: css` - color: ${theme.v1.palette.blue95}; - `, - lockMessageClass: css` - font-style: italic; - margin-left: 1.8rem; - margin-right: 0.6rem; - `, + disabledTooltip: css({ + display: 'flex', + }), + tooltipItemLink: css({ + color: theme.v1.palette.blue95, + }), + lockMessageClass: css({ + fontStyle: 'italic', + marginLeft: '1.8rem', + marginRight: '0.6rem', + }), }); diff --git a/public/app/features/admin/UserSessions.tsx b/public/app/features/admin/UserSessions.tsx index 1129dc7201f..465072ba34d 100644 --- a/public/app/features/admin/UserSessions.tsx +++ b/public/app/features/admin/UserSessions.tsx @@ -72,17 +72,15 @@ class BaseUserSessions extends PureComponent { {session.clientIp} {`${session.browser} on ${session.os} ${session.osVersion}`} -
- {canLogout && ( - - Force logout - - )} -
+ {canLogout && ( + + Force logout + + )} ))} diff --git a/public/app/features/admin/ldap/LdapConnectionStatus.tsx b/public/app/features/admin/ldap/LdapConnectionStatus.tsx index bf4fc842fc8..2616a50436f 100644 --- a/public/app/features/admin/ldap/LdapConnectionStatus.tsx +++ b/public/app/features/admin/ldap/LdapConnectionStatus.tsx @@ -32,7 +32,7 @@ export const LdapConnectionStatus = ({ ldapConnectionInfo }: Props) => { return serverInfo.cell.value ? ( - + ) : ( diff --git a/public/app/features/alerting/unified/Receivers.test.tsx b/public/app/features/alerting/unified/Receivers.test.tsx new file mode 100644 index 00000000000..ac966805830 --- /dev/null +++ b/public/app/features/alerting/unified/Receivers.test.tsx @@ -0,0 +1,74 @@ +import React from 'react'; +import { selectOptionInTest } from 'test/helpers/selectOptionInTest'; +import { render, screen, waitFor, userEvent } from 'test/test-utils'; + +import { + EXTERNAL_VANILLA_ALERTMANAGER_UID, + setupVanillaAlertmanagerServer, +} from 'app/features/alerting/unified/components/settings/__mocks__/server'; +import { setupMswServer } from 'app/features/alerting/unified/mockApi'; +import { grantUserPermissions, mockDataSource } from 'app/features/alerting/unified/mocks'; +import { setupDataSources } from 'app/features/alerting/unified/testSetup/datasources'; +import { DataSourceType } from 'app/features/alerting/unified/utils/datasource'; +import { AlertManagerDataSourceJsonData, AlertManagerImplementation } from 'app/plugins/datasource/alertmanager/types'; +import { AccessControlAction } from 'app/types'; + +import ContactPoints from './Receivers'; + +import 'core-js/stable/structured-clone'; + +const server = setupMswServer(); + +const mockDataSources = { + [EXTERNAL_VANILLA_ALERTMANAGER_UID]: mockDataSource({ + uid: EXTERNAL_VANILLA_ALERTMANAGER_UID, + name: EXTERNAL_VANILLA_ALERTMANAGER_UID, + type: DataSourceType.Alertmanager, + jsonData: { + implementation: AlertManagerImplementation.prometheus, + }, + }), +}; + +beforeEach(() => { + grantUserPermissions([ + AccessControlAction.AlertingNotificationsRead, + AccessControlAction.AlertingNotificationsWrite, + AccessControlAction.AlertingNotificationsExternalRead, + AccessControlAction.AlertingNotificationsExternalWrite, + ]); +}); + +it('can save a contact point with a select dropdown', async () => { + setupVanillaAlertmanagerServer(server); + setupDataSources(mockDataSources[EXTERNAL_VANILLA_ALERTMANAGER_UID]); + + const user = userEvent.setup(); + + render(, { + historyOptions: { + initialEntries: [`/alerting/notifications/receivers/new?alertmanager=${EXTERNAL_VANILLA_ALERTMANAGER_UID}`], + }, + }); + + // Fill out contact point name + const contactPointName = await screen.findByPlaceholderText(/name/i); + await user.type(contactPointName, 'contact point with select'); + + // Select Telegram option (this is we expect the form to contain a dropdown) + const integrationDropdown = screen.getByLabelText(/integration/i); + await selectOptionInTest(integrationDropdown, /telegram/i); + + // Fill out basic fields necessary for contact point to be saved + const botToken = await screen.findByLabelText(/bot token/i); + const chatId = await screen.findByLabelText(/chat id/i); + + await user.type(botToken, 'sometoken'); + await user.type(chatId, '-123'); + + await user.click(await screen.findByRole('button', { name: /save contact point/i })); + + // TODO: Have a better way to assert that the contact point was saved. This is instead asserting on some + // text that's present on the list page, as there's a lot of overlap in text between the form and the list page + await waitFor(() => expect(screen.getByText(/search by name or type/i)).toBeInTheDocument(), { timeout: 2000 }); +}); diff --git a/public/app/features/alerting/unified/Receivers.tsx b/public/app/features/alerting/unified/Receivers.tsx index fc37703fba1..367a1f21376 100644 --- a/public/app/features/alerting/unified/Receivers.tsx +++ b/public/app/features/alerting/unified/Receivers.tsx @@ -3,7 +3,6 @@ import { Route, Switch } from 'react-router-dom'; import { withErrorBoundary } from '@grafana/ui'; import { SafeDynamicImport } from 'app/core/components/DynamicImports/SafeDynamicImport'; -import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; import { AlertmanagerPageWrapper } from './components/AlertingPageWrapper'; @@ -12,7 +11,7 @@ const EditContactPoint = SafeDynamicImport(() => import('./components/contact-po const NewContactPoint = SafeDynamicImport(() => import('./components/contact-points/NewContactPoint')); const GlobalConfig = SafeDynamicImport(() => import('./components/contact-points/components/GlobalConfig')); -const ContactPoints = (_props: GrafanaRouteComponentProps): JSX.Element => ( +const ContactPoints = (): JSX.Element => ( diff --git a/public/app/features/alerting/unified/components/Label.tsx b/public/app/features/alerting/unified/components/Label.tsx index 3d1b4d11d39..bef7c86d408 100644 --- a/public/app/features/alerting/unified/components/Label.tsx +++ b/public/app/features/alerting/unified/components/Label.tsx @@ -33,11 +33,9 @@ const Label = ({ label, value, icon, color, size = 'md' }: Props) => { )} - {value && ( -
- {value} -
- )} +
+ {value ?? '-'} +
); diff --git a/public/app/features/alerting/unified/components/receivers/form/fields/OptionField.tsx b/public/app/features/alerting/unified/components/receivers/form/fields/OptionField.tsx index 05bc1c00a5d..705ddc79eae 100644 --- a/public/app/features/alerting/unified/components/receivers/form/fields/OptionField.tsx +++ b/public/app/features/alerting/unified/components/receivers/form/fields/OptionField.tsx @@ -161,7 +161,7 @@ const OptionInput: FC = ({ )} control={control} name={name} - defaultValue={option.defaultValue} + defaultValue={option.defaultValue?.value} rules={{ validate: { customValidator: (v) => (customValidator ? customValidator(v) : true), diff --git a/public/app/features/alerting/unified/components/settings/__mocks__/server.ts b/public/app/features/alerting/unified/components/settings/__mocks__/server.ts index 428b6f54de6..41ead147008 100644 --- a/public/app/features/alerting/unified/components/settings/__mocks__/server.ts +++ b/public/app/features/alerting/unified/components/settings/__mocks__/server.ts @@ -2,7 +2,13 @@ import { delay, http, HttpResponse } from 'msw'; import { SetupServerApi } from 'msw/lib/node'; import { setDataSourceSrv } from '@grafana/runtime'; -import { AlertManagerDataSourceJsonData, AlertManagerImplementation } from 'app/plugins/datasource/alertmanager/types'; +import { + AlertManagerCortexConfig, + AlertManagerDataSourceJsonData, + AlertManagerImplementation, + AlertmanagerReceiver, + Receiver, +} from 'app/plugins/datasource/alertmanager/types'; import { mockDataSource, MockDataSourceSrv } from '../../../mocks'; import * as config from '../../../utils/config'; @@ -70,7 +76,7 @@ export function setupVanillaAlertmanagerServer(server: SetupServerApi) { server.use( createVanillaAlertmanagerConfigurationHandler(EXTERNAL_VANILLA_ALERTMANAGER_UID), - ...createAlertmanagerConfigurationHandlers(PROVISIONED_MIMIR_ALERTMANAGER_UID) + ...createAlertmanagerConfigurationHandlers() ); return server; @@ -82,11 +88,33 @@ const createExternalAlertmanagersHandler = () => { return http.get('/api/v1/ngalert/alertmanagers', () => HttpResponse.json(alertmanagers)); }; -const createAlertmanagerConfigurationHandlers = (name = 'grafana') => { +const createAlertmanagerConfigurationHandlers = () => { + // Dirty check to type guard against us having a non-Grafana managed receiver + const contactPointIsAMReceiver = (receiver: Receiver): receiver is AlertmanagerReceiver => { + return !receiver.grafana_managed_receiver_configs; + }; + return [ - http.get(`/api/alertmanager/${name}/config/api/v1/alerts`, () => HttpResponse.json(internalAlertmanagerConfig)), - http.post(`/api/alertmanager/${name}/config/api/v1/alerts`, async () => { + http.get(`/api/alertmanager/:name/config/api/v1/alerts`, () => HttpResponse.json(internalAlertmanagerConfig)), + http.post(`/api/alertmanager/:name/config/api/v1/alerts`, async ({ request }) => { await delay(1000); // simulate some time + + // Specifically mock and check for the case of an invalid telegram config, + // and return a 400 error in this case + // This is to test against us accidentally sending a `{label, value}` object instead of a string + const body = await request.json(); + const invalidConfig = body.alertmanager_config.receivers?.some((receiver) => { + if (!contactPointIsAMReceiver(receiver)) { + return false; + } + + return (receiver.telegram_configs || []).some((config) => typeof config.parse_mode === 'object'); + }); + + if (invalidConfig) { + return HttpResponse.json({ message: 'bad request data' }, { status: 400 }); + } + return HttpResponse.json({ message: 'configuration created' }); }), ]; diff --git a/public/app/features/alerting/unified/mocks/server/all-handlers.ts b/public/app/features/alerting/unified/mocks/server/all-handlers.ts index 8aa4831116d..908f4d77acc 100644 --- a/public/app/features/alerting/unified/mocks/server/all-handlers.ts +++ b/public/app/features/alerting/unified/mocks/server/all-handlers.ts @@ -21,7 +21,6 @@ const allHandlers = [ ...folderHandlers, ...pluginsHandlers, ...silenceHandlers, - ...alertRuleHandlers, ]; export default allHandlers; diff --git a/public/app/features/alerting/unified/mocks/server/handlers/alertRule.ts b/public/app/features/alerting/unified/mocks/server/handlers/alertRule.ts deleted file mode 100644 index bfa2afd5536..00000000000 --- a/public/app/features/alerting/unified/mocks/server/handlers/alertRule.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { http, HttpResponse } from 'msw'; - -import { - RulerGrafanaRuleDTO, - RulerRuleGroupDTO, - RulerRulesConfigDTO, -} from '../../../../../../types/unified-alerting-dto'; -import { grafanaRulerRule, namespaceByUid, namespaces } from '../../alertRuleApi'; - -export const rulerRulesHandler = () => { - return http.get(`/api/ruler/grafana/api/v1/rules`, () => { - const response = Object.entries(namespaces).reduce((acc, [namespaceUid, groups]) => { - acc[namespaceByUid[namespaceUid].name] = groups; - return acc; - }, {}); - - return HttpResponse.json(response); - }); -}; - -export const rulerRuleNamespaceHandler = () => { - return http.get<{ folderUid: string }>(`/api/ruler/grafana/api/v1/rules/:folderUid`, ({ params: { folderUid } }) => { - // This mimic API response as closely as possible - Invalid folderUid returns 403 - const namespace = namespaces[folderUid]; - if (!namespace) { - return new HttpResponse(null, { status: 403 }); - } - - return HttpResponse.json({ - [namespaceByUid[folderUid].name]: namespaces[folderUid], - }); - }); -}; - -export const rulerRuleGroupHandler = () => { - return http.get<{ folderUid: string; groupName: string }>( - `/api/ruler/grafana/api/v1/rules/:folderUid/:groupName`, - ({ params: { folderUid, groupName } }) => { - // This mimic API response as closely as possible. - // Invalid folderUid returns 403 but invalid group will return 202 with empty list of rules - const namespace = namespaces[folderUid]; - if (!namespace) { - return new HttpResponse(null, { status: 403 }); - } - - const matchingGroup = namespace.find((group) => group.name === groupName); - return HttpResponse.json({ - name: groupName, - interval: matchingGroup?.interval, - rules: matchingGroup?.rules ?? [], - }); - } - ); -}; - -export const getAlertRuleHandler = () => { - const grafanaRules = new Map( - [grafanaRulerRule].map((rule) => [rule.grafana_alert.uid, rule]) - ); - - return http.get<{ uid: string }>(`/api/ruler/grafana/api/v1/rule/:uid`, ({ params: { uid } }) => { - const rule = grafanaRules.get(uid); - if (!rule) { - return new HttpResponse(null, { status: 404 }); - } - return HttpResponse.json(rule); - }); -}; - -export const alertRuleHandlers = [ - rulerRulesHandler(), - rulerRuleNamespaceHandler(), - rulerRuleGroupHandler(), - getAlertRuleHandler(), -]; diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePage.tsx b/public/app/features/dashboard-scene/pages/DashboardScenePage.tsx index 84ca43a33e3..a1b4f0f46f3 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePage.tsx +++ b/public/app/features/dashboard-scene/pages/DashboardScenePage.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useMemo } from 'react'; import { PageLayoutType } from '@grafana/data'; +import { UrlSyncContextProvider } from '@grafana/scenes'; import { Page } from 'app/core/components/Page/Page'; import PageLoader from 'app/core/components/PageLoader/PageLoader'; import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; @@ -78,10 +79,10 @@ export function DashboardScenePage({ match, route, queryParams, history }: Props } return ( - <> + - + ); } diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.test.ts b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.test.ts index 2d67ff875e9..8f87474a151 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.test.ts +++ b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.test.ts @@ -1,7 +1,6 @@ import { advanceBy } from 'jest-date-mock'; -import { BackendSrv, locationService, setBackendSrv } from '@grafana/runtime'; -import { getUrlSyncManager } from '@grafana/scenes'; +import { BackendSrv, setBackendSrv } from '@grafana/runtime'; import store from 'app/core/store'; import { DASHBOARD_FROM_LS_KEY } from 'app/features/dashboard/state/initDashboard'; import { DashboardRoutes } from 'app/types'; @@ -95,40 +94,6 @@ describe('DashboardScenePageStateManager', () => { expect(loader.state.isLoading).toBe(false); }); - it('should initialize url sync', async () => { - setupLoadDashboardMock({ dashboard: { uid: 'fake-dash' }, meta: {} }); - - locationService.partial({ from: 'now-5m', to: 'now' }); - - const loader = new DashboardScenePageStateManager({}); - await loader.loadDashboard({ uid: 'fake-dash', route: DashboardRoutes.Normal }); - const dash = loader.state.dashboard; - - expect(dash!.state.$timeRange?.state.from).toEqual('now-5m'); - - getUrlSyncManager().cleanUp(dash!); - - // try loading again (and hitting cache) - locationService.partial({ from: 'now-10m', to: 'now' }); - - await loader.loadDashboard({ uid: 'fake-dash', route: DashboardRoutes.Normal }); - const dash2 = loader.state.dashboard; - - expect(dash2!.state.$timeRange?.state.from).toEqual('now-10m'); - }); - - it('should not initialize url sync for embedded dashboards', async () => { - setupLoadDashboardMock({ dashboard: { uid: 'fake-dash' }, meta: {} }); - - locationService.partial({ from: 'now-5m', to: 'now' }); - - const loader = new DashboardScenePageStateManager({}); - await loader.loadDashboard({ uid: 'fake-dash', route: DashboardRoutes.Embedded }); - const dash = loader.state.dashboard; - - expect(dash!.state.$timeRange?.state.from).toEqual('now-6h'); - }); - describe('New dashboards', () => { it('Should have new empty model with meta.isNew and should not be cached', async () => { const loader = new DashboardScenePageStateManager({}); diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts index a39c5ff1c1c..f0235de5a61 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts +++ b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts @@ -182,10 +182,6 @@ export class DashboardScenePageStateManager extends StateManagerBase; } - return ; + // if no time picker render without url sync + if (dashboard.state.controls?.state.hideTimeControls) { + return ; + } + + return ( + + + + ); } function PublicDashboardSceneRenderer({ model }: SceneComponentProps) { diff --git a/public/app/features/dashboard-scene/saving/useSaveDashboard.ts b/public/app/features/dashboard-scene/saving/useSaveDashboard.ts index c961e4a44db..ebd71b6ca63 100644 --- a/public/app/features/dashboard-scene/saving/useSaveDashboard.ts +++ b/public/app/features/dashboard-scene/saving/useSaveDashboard.ts @@ -61,10 +61,7 @@ export function useSaveDashboard(isCopy = false) { if (newUrl !== currentLocation.pathname) { setTimeout(() => { - // Because the path changes we need to stop and restart url sync - scene.stopUrlSync(); locationService.push({ pathname: newUrl, search: currentLocation.search }); - scene.startUrlSync(); }); } diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.tsx index c050e66ec37..13e6ec7dff7 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.tsx @@ -12,7 +12,6 @@ import { } from '@grafana/data'; import { config, locationService } from '@grafana/runtime'; import { - getUrlSyncManager, SceneFlexLayout, sceneGraph, SceneGridLayout, @@ -212,27 +211,15 @@ export class DashboardScene extends SceneObjectBase { window.__grafanaSceneContext = prevSceneContext; clearKeyBindings(); this._changeTracker.terminate(); - this.stopUrlSync(); oldDashboardWrapper.destroy(); dashboardWatcher.leave(); }; } - public startUrlSync() { - if (!this.state.meta.isEmbedded) { - getUrlSyncManager().initSync(this); - } - } - - public stopUrlSync() { - getUrlSyncManager().cleanUp(this); - } - public onEnterEditMode = (fromExplore = false) => { this._fromExplore = fromExplore; // Save this state this._initialState = sceneUtils.cloneSceneObjectState(this.state); - this._initialUrlState = locationService.getLocation(); // Switch to edit mode @@ -303,10 +290,7 @@ export class DashboardScene extends SceneObjectBase { private exitEditModeConfirmed(restoreInitialState = true) { // No need to listen to changes anymore this._changeTracker.stopTrackingChanges(); - // Stop url sync before updating url - this.stopUrlSync(); - // Now we can update urls // We are updating url and removing editview and editPanel. // The initial url may be including edit view, edit panel or inspect query params if the user pasted the url, // hence we need to cleanup those query params to get back to the dashboard view. Otherwise url sync can trigger overlays. @@ -330,8 +314,7 @@ export class DashboardScene extends SceneObjectBase { // Do not restore this.setState({ isEditing: false }); } - // and start url sync again - this.startUrlSync(); + // Disable grid dragging this.propagateEditModeChange(); } diff --git a/public/app/features/dashboard-scene/scene/NavToolbarActions.test.tsx b/public/app/features/dashboard-scene/scene/NavToolbarActions.test.tsx index d081dbae492..797a80fe51d 100644 --- a/public/app/features/dashboard-scene/scene/NavToolbarActions.test.tsx +++ b/public/app/features/dashboard-scene/scene/NavToolbarActions.test.tsx @@ -5,8 +5,8 @@ import { TestProvider } from 'test/helpers/TestProvider'; import { getGrafanaContextMock } from 'test/mocks/getGrafanaContextMock'; import { selectors } from '@grafana/e2e-selectors'; -import { config } from '@grafana/runtime'; -import { SceneGridLayout, SceneQueryRunner, SceneTimeRange, VizPanel } from '@grafana/scenes'; +import { config, locationService } from '@grafana/runtime'; +import { SceneGridLayout, SceneQueryRunner, SceneTimeRange, UrlSyncContextProvider, VizPanel } from '@grafana/scenes'; import { playlistSrv } from 'app/features/playlist/PlaylistSrv'; import { buildPanelEditScene } from '../panel-edit/PanelEditor'; @@ -103,9 +103,8 @@ describe('NavToolbarActions', () => { }); it('Should show correct buttons when in settings menu', async () => { - const { dashboard } = setup(); + setup(); - dashboard.startUrlSync(); await userEvent.click(await screen.findByText('Edit')); await userEvent.click(await screen.findByText('Settings')); @@ -118,6 +117,7 @@ describe('NavToolbarActions', () => { it('Should show correct buttons when editing a new panel', async () => { const { dashboard } = setup(); + await act(() => { dashboard.onEnterEditMode(); const editingPanel = ((dashboard.state.body as SceneGridLayout).state.children[0] as DashboardGridItem).state @@ -205,9 +205,13 @@ function setup() { const context = getGrafanaContextMock(); + locationService.push('/'); + render( - + + + ); diff --git a/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx b/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx index a039db09064..5331b22a93b 100644 --- a/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx @@ -5,7 +5,7 @@ import { SelectableValue } from '@grafana/data'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors'; import { getBackendSrv } from '@grafana/runtime'; import { SceneComponentProps, sceneGraph, SceneObjectBase, SceneObjectRef, VizPanel } from '@grafana/scenes'; -import { Button, ClipboardButton, Field, Input, Modal, RadioButtonGroup } from '@grafana/ui'; +import { Button, ClipboardButton, Field, Input, Modal, RadioButtonGroup, Stack } from '@grafana/ui'; import { t, Trans } from 'app/core/internationalization'; import { getTrackingSource, shareDashboardType } from 'app/features/dashboard/components/ShareModal/utils'; import { getDashboardSnapshotSrv, SnapshotSharingOptions } from 'app/features/dashboard/services/SnapshotSrv'; @@ -231,7 +231,7 @@ function ShareSnapshoTabRenderer({ model }: SceneComponentProps + -
+
Did you make a mistake?  
- + )} ); diff --git a/public/app/features/dashboard-scene/utils/dashboardSessionState.test.ts b/public/app/features/dashboard-scene/utils/dashboardSessionState.test.ts index f7052f2203a..2d1ec2cccbe 100644 --- a/public/app/features/dashboard-scene/utils/dashboardSessionState.test.ts +++ b/public/app/features/dashboard-scene/utils/dashboardSessionState.test.ts @@ -1,5 +1,5 @@ import { config, locationService } from '@grafana/runtime'; -import { CustomVariable } from '@grafana/scenes'; +import { CustomVariable, getUrlSyncManager } from '@grafana/scenes'; import { DashboardDataDTO } from 'app/types'; import { transformSaveModelToScene } from '../serialization/transformSaveModelToScene'; @@ -50,7 +50,8 @@ describe('dashboardSessionState', () => { restoreDashboardStateFromLocalStorage(scene); const variable = scene.state.$variables!.getByName('customVar') as CustomVariable; const timeRange = scene.state.$timeRange; - scene.startUrlSync(); + + getUrlSyncManager().initSync(scene); expect(variable!.state!.value).toEqual(['b']); expect(variable!.state!.text).toEqual(['b']); @@ -63,11 +64,12 @@ describe('dashboardSessionState', () => { PRESERVED_SCENE_STATE_KEY, '?var-customVar=b&var-nonApplicableVar=b&from=now-5m&to=now&timezone=browser' ); + const scene = buildTestScene(); restoreDashboardStateFromLocalStorage(scene); - expect(locationService.getSearch().toString()).toBe('var-customVar=b&from=now-5m&to=now&timezone=browser'); + expect(locationService.getLocation().search).toBe('?var-customVar=b&from=now-5m&to=now&timezone=browser'); }); // handles case when user navigates back to a dashboard with the same state, i.e. using back button @@ -79,7 +81,7 @@ describe('dashboardSessionState', () => { restoreDashboardStateFromLocalStorage(scene); - expect(locationService.getSearch().toString()).toBe('var-customVar=b&from=now-6h&to=now&timezone=browser'); + expect(locationService.getLocation().search).toBe('?var-customVar=b&from=now-6h&to=now&timezone=browser'); }); }); }); @@ -116,6 +118,7 @@ function buildTestScene() { version: 24, weekStart: '', }; + const scene = transformSaveModelToScene({ dashboard: testDashboard, meta: {} }); // Removing data layers to avoid mocking built-in Grafana data source diff --git a/public/app/features/dashboard-scene/utils/dashboardSessionState.ts b/public/app/features/dashboard-scene/utils/dashboardSessionState.ts index c93e530a530..6ad764e2222 100644 --- a/public/app/features/dashboard-scene/utils/dashboardSessionState.ts +++ b/public/app/features/dashboard-scene/utils/dashboardSessionState.ts @@ -17,10 +17,6 @@ export function restoreDashboardStateFromLocalStorage(dashboard: DashboardScene) preservedQueryParams.forEach((value, key) => { if (!currentQueryParams.has(key)) { currentQueryParams.append(key, value); - } else { - if (!currentQueryParams.getAll(key).includes(value)) { - currentQueryParams.append(key, value); - } } }); @@ -38,9 +34,7 @@ export function restoreDashboardStateFromLocalStorage(dashboard: DashboardScene) const finalParams = currentQueryParams.toString(); if (finalParams) { - locationService.replace({ - search: finalParams, - }); + locationService.replace({ search: finalParams }); } } } diff --git a/public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx b/public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx index e3309e2547e..9ef4546c674 100644 --- a/public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx +++ b/public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx @@ -2,7 +2,7 @@ import React, { PureComponent } from 'react'; import { isEmptyObject, SelectableValue, VariableRefresh } from '@grafana/data'; import { getBackendSrv } from '@grafana/runtime'; -import { Button, ClipboardButton, Field, Input, LinkButton, Modal, Select, Spinner } from '@grafana/ui'; +import { Button, ClipboardButton, Field, Input, LinkButton, Modal, Select, Spinner, Stack } from '@grafana/ui'; import { t, Trans } from 'app/core/internationalization'; import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv'; import { DashboardModel, PanelModel } from 'app/features/dashboard/state'; @@ -290,7 +290,7 @@ export class ShareSnapshot extends PureComponent { const { snapshotUrl } = this.state; return ( - <> + { /> -
+
Did you make a mistake?   Delete snapshot.
- + ); } diff --git a/public/app/features/storage/RootView.tsx b/public/app/features/storage/RootView.tsx index c6f855a7024..332f2e503da 100644 --- a/public/app/features/storage/RootView.tsx +++ b/public/app/features/storage/RootView.tsx @@ -83,9 +83,8 @@ export function RootView({ root, onPathChange }: Props) { - +
+
{renderRoots('', roots.base)}
@@ -100,12 +99,12 @@ export function RootView({ root, onPathChange }: Props) { function getStyles(theme: GrafanaTheme2) { return { - secondaryTextColor: css` - color: ${theme.colors.text.secondary}; - `, - clickable: css` - pointer-events: none; - `, + secondaryTextColor: css({ + color: theme.colors.text.secondary, + }), + clickable: css({ + pointerEvents: 'none', + }), }; } diff --git a/public/app/features/teams/TeamGroupSync.tsx b/public/app/features/teams/TeamGroupSync.tsx index 5dd0e5f8e8d..3d8b2bbca30 100644 --- a/public/app/features/teams/TeamGroupSync.tsx +++ b/public/app/features/teams/TeamGroupSync.tsx @@ -121,7 +121,7 @@ export class TeamGroupSync extends PureComponent { )}
{groups.length > 0 && ( - )} diff --git a/public/app/features/trails/DataTrail.test.tsx b/public/app/features/trails/DataTrail.test.tsx index 04dbcf2a047..833058cc5b5 100644 --- a/public/app/features/trails/DataTrail.test.tsx +++ b/public/app/features/trails/DataTrail.test.tsx @@ -71,7 +71,7 @@ describe('DataTrail', () => { }); it('should sync state with url', () => { - expect(locationService.getSearchObject().metric).toBe('metric_bucket'); + expect(trail.getUrlState().metric).toBe('metric_bucket'); }); it('should add history step', () => { @@ -104,10 +104,6 @@ describe('DataTrail', () => { trail.state.$timeRange?.setState({ from: 'now-1h' }); }); - it('should sync state with url', () => { - expect(locationService.getSearchObject().from).toBe('now-1h'); - }); - it('should add history step', () => { expect(trail.state.history.state.steps[2].type).toBe('time'); }); @@ -154,10 +150,6 @@ describe('DataTrail', () => { trail.state.$timeRange?.setState({ from: 'now-15m' }); }); - it('should sync state with url', () => { - expect(locationService.getSearchObject().from).toBe('now-15m'); - }); - it('should add history step', () => { expect(trail.state.history.state.steps[3].type).toBe('time'); }); @@ -224,10 +216,6 @@ describe('DataTrail', () => { getFilterVar().setState({ filters: [{ key: 'zone', operator: '=', value: 'a' }] }); }); - it('should sync state with url', () => { - expect(decodeURIComponent(locationService.getSearchObject()['var-filters']?.toString()!)).toBe('zone|=|a'); - }); - it('should add history step', () => { expect(trail.state.history.state.steps[2].type).toBe('filters'); }); @@ -276,12 +264,6 @@ describe('DataTrail', () => { getFilterVar().setState({ filters: [{ key: 'zone', operator: '=', value: 'b' }] }); }); - it('should sync state with url', () => { - expect(decodeURIComponent(locationService.getSearchObject()['var-filters']?.toString()!)).toBe( - 'zone|=|b' - ); - }); - it('should add history step', () => { expect(trail.state.history.state.steps[3].type).toBe('filters'); }); diff --git a/public/app/features/trails/DataTrail.tsx b/public/app/features/trails/DataTrail.tsx index fda4703db5a..3295af66bc8 100644 --- a/public/app/features/trails/DataTrail.tsx +++ b/public/app/features/trails/DataTrail.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import React from 'react'; -import { AdHocVariableFilter, GrafanaTheme2, VariableHide, urlUtil } from '@grafana/data'; +import { AdHocVariableFilter, GrafanaTheme2, PageLayoutType, VariableHide, urlUtil } from '@grafana/data'; import { locationService } from '@grafana/runtime'; import { AdHocFiltersVariable, @@ -25,6 +25,7 @@ import { VariableValueSelectors, } from '@grafana/scenes'; import { useStyles2 } from '@grafana/ui'; +import { Page } from 'app/core/components/Page/Page'; import { DataTrailSettings } from './DataTrailSettings'; import { DataTrailHistory } from './DataTrailsHistory'; @@ -35,6 +36,7 @@ import { getTrailStore } from './TrailStore/TrailStore'; import { MetricDatasourceHelper } from './helpers/MetricDatasourceHelper'; import { reportChangeInLabelFilters } from './interactions'; import { MetricSelectedEvent, trailDS, VAR_DATASOURCE, VAR_FILTERS } from './shared'; +import { getMetricName } from './utils'; export interface DataTrailState extends SceneObjectState { topScene?: SceneObject; @@ -93,21 +95,11 @@ export class DataTrail extends SceneObjectBase { ); } - // Disconnects the current step history state from the current state, to prevent changes affecting history state - const currentState = this.state.history.state.steps[this.state.history.state.currentStep]?.trailState; - if (currentState) { - this.restoreFromHistoryStep(currentState); - } - - this.enableUrlSync(); - // Save the current trail as a recent if the browser closes or reloads const saveRecentTrail = () => getTrailStore().setRecentTrail(this); window.addEventListener('unload', saveRecentTrail); return () => { - this.disableUrlSync(); - if (!this.state.embedded) { saveRecentTrail(); } @@ -115,18 +107,6 @@ export class DataTrail extends SceneObjectBase { }; } - private enableUrlSync() { - if (!this.state.embedded) { - getUrlSyncManager().initSync(this); - } - } - - private disableUrlSync() { - if (!this.state.embedded) { - getUrlSyncManager().cleanUp(this); - } - } - protected _variableDependency = new VariableDependencyConfig(this, { variableNames: [VAR_DATASOURCE], onReferencedVariableValueChanged: (variable: SceneVariable) => { @@ -167,8 +147,6 @@ export class DataTrail extends SceneObjectBase { } public restoreFromHistoryStep(state: DataTrailState) { - this.disableUrlSync(); - if (!state.topScene && !state.metric) { // If the top scene for an is missing, correct it. state.topScene = new MetricSelectScene({}); @@ -184,8 +162,6 @@ export class DataTrail extends SceneObjectBase { const urlState = getUrlSyncManager().getUrlState(this); const fullUrl = urlUtil.renderUrl(locationService.getLocation().pathname, urlState); locationService.replace(fullUrl); - - this.enableUrlSync(); } private _handleMetricSelectedEvent(evt: MetricSelectedEvent) { @@ -227,24 +203,26 @@ export class DataTrail extends SceneObjectBase { } static Component = ({ model }: SceneComponentProps) => { - const { controls, topScene, history, settings } = model.useState(); + const { controls, topScene, history, settings, metric } = model.useState(); const styles = useStyles2(getStyles); const showHeaderForFirstTimeUsers = getTrailStore().recent.length < 2; return ( -
- {showHeaderForFirstTimeUsers && } - - {controls && ( -
- {controls.map((control) => ( - - ))} - -
- )} -
{topScene && }
-
+ +
+ {showHeaderForFirstTimeUsers && } + + {controls && ( +
+ {controls.map((control) => ( + + ))} + +
+ )} +
{topScene && }
+
+
); }; } @@ -288,6 +266,8 @@ function getStyles(theme: GrafanaTheme2) { gap: theme.spacing(1), minHeight: '100%', flexDirection: 'column', + background: theme.isLight ? theme.colors.background.primary : theme.colors.background.canvas, + padding: theme.spacing(2, 3, 2, 3), }), body: css({ flexGrow: 1, diff --git a/public/app/features/trails/DataTrailsApp.tsx b/public/app/features/trails/DataTrailsApp.tsx index 9f2511306be..f23361f1f51 100644 --- a/public/app/features/trails/DataTrailsApp.tsx +++ b/public/app/features/trails/DataTrailsApp.tsx @@ -1,11 +1,9 @@ -import { css } from '@emotion/css'; import React, { useEffect } from 'react'; import { Route, Switch } from 'react-router-dom'; -import { GrafanaTheme2, PageLayoutType } from '@grafana/data'; +import { PageLayoutType } from '@grafana/data'; import { locationService } from '@grafana/runtime'; -import { SceneComponentProps, SceneObjectBase, SceneObjectState, getUrlSyncManager } from '@grafana/scenes'; -import { useStyles2 } from '@grafana/ui'; +import { SceneComponentProps, SceneObjectBase, SceneObjectState, UrlSyncContextProvider } from '@grafana/scenes'; import { Page } from 'app/core/components/Page/Page'; import { DataTrail } from './DataTrail'; @@ -13,7 +11,7 @@ import { DataTrailsHome } from './DataTrailsHome'; import { MetricsHeader } from './MetricsHeader'; import { getTrailStore } from './TrailStore/TrailStore'; import { HOME_ROUTE, TRAILS_ROUTE } from './shared'; -import { getMetricName, getUrlForTrail, newMetricsTrail } from './utils'; +import { getUrlForTrail, newMetricsTrail } from './utils'; export interface DataTrailsAppState extends SceneObjectState { trail: DataTrail; @@ -26,13 +24,12 @@ export class DataTrailsApp extends SceneObjectBase { } goToUrlForTrail(trail: DataTrail) { - this.setState({ trail }); locationService.push(getUrlForTrail(trail)); + this.setState({ trail }); } static Component = ({ model }: SceneComponentProps) => { const { trail, home } = model.useState(); - const styles = useStyles2(getStyles); return ( @@ -50,21 +47,7 @@ export class DataTrailsApp extends SceneObjectBase { )} /> - ( - -
- -
-
- )} - /> + } />
); }; @@ -84,7 +67,11 @@ function DataTrailView({ trail }: { trail: DataTrail }) { return null; } - return ; + return ( + + + + ); } let dataTrailsApp: DataTrailsApp; @@ -92,50 +79,10 @@ let dataTrailsApp: DataTrailsApp; export function getDataTrailsApp() { if (!dataTrailsApp) { dataTrailsApp = new DataTrailsApp({ - trail: getInitialTrail(), + trail: newMetricsTrail(), home: new DataTrailsHome({}), }); } return dataTrailsApp; } - -/** - * Get the initial trail for the app to work with based on the current URL - * - * It will either be a new trail that will be started based on the state represented - * in the URL parameters, or it will be the most recently used trail (according to the trail store) - * which has its current history step matching the URL parameters. - * - * The reason for trying to reinitialize from the recent trail is to resolve an issue - * where refreshing the browser would wipe the step history. This allows you to preserve - * it between browser refreshes, or when reaccessing the same URL. - */ -function getInitialTrail() { - const newTrail = newMetricsTrail(); - - // Set the initial state of the newTrail based on the URL, - // In case we are initializing from an externally created URL or a page reload - getUrlSyncManager().initSync(newTrail); - // Remove the URL sync for now. It will be restored on the trail if it is activated. - getUrlSyncManager().cleanUp(newTrail); - - // If one of the recent trails is a match to the newTrail derived from the current URL, - // let's restore that trail so that a page refresh doesn't create a new trail. - const recentMatchingTrail = getTrailStore().findMatchingRecentTrail(newTrail)?.resolve(); - - // If there is a matching trail, initialize with that. Otherwise, use the new trail. - return recentMatchingTrail || newTrail; -} - -function getStyles(theme: GrafanaTheme2) { - return { - customPage: css({ - padding: theme.spacing(2, 3, 2, 3), - background: theme.isLight ? theme.colors.background.primary : theme.colors.background.canvas, - flexGrow: 1, - display: 'flex', - flexDirection: 'column', - }), - }; -} diff --git a/public/app/features/trails/TrailStore/TrailStore.test.ts b/public/app/features/trails/TrailStore/TrailStore.test.ts index 1a3bccd567c..871dd2fc55c 100644 --- a/public/app/features/trails/TrailStore/TrailStore.test.ts +++ b/public/app/features/trails/TrailStore/TrailStore.test.ts @@ -349,6 +349,7 @@ describe('TrailStore', () => { describe('And time range is changed to now-15m to now', () => { let trail: DataTrail; + beforeEach(() => { localStorage.clear(); localStorage.setItem(RECENT_TRAILS_KEY, JSON.stringify([{ history, currentStep: 1 }])); @@ -357,6 +358,7 @@ describe('TrailStore', () => { trail = store.recent[0].resolve(); const urlState = getUrlSyncManager().getUrlState(trail); locationService.partial(urlState); + trail.activate(); trail.state.history.activate(); trail.state.$timeRange?.setState({ from: 'now-15m' }); diff --git a/public/app/features/trails/TrailStore/TrailStore.ts b/public/app/features/trails/TrailStore/TrailStore.ts index 02c7cd92446..4eeea064b32 100644 --- a/public/app/features/trails/TrailStore/TrailStore.ts +++ b/public/app/features/trails/TrailStore/TrailStore.ts @@ -1,5 +1,6 @@ import { debounce, isEqual } from 'lodash'; +import { urlUtil } from '@grafana/data'; import { getUrlSyncManager, SceneObject, SceneObjectRef, SceneObjectUrlValues, sceneUtils } from '@grafana/scenes'; import { dispatch } from 'app/store/store'; @@ -77,9 +78,14 @@ export class TrailStore { }); const currentStep = t.currentStep ?? trail.state.history.state.steps.length - 1; + trail.state.history.setState({ currentStep }); - // The state change listeners aren't activated yet, so maually change to the current step state - trail.setState(trail.state.history.state.steps[currentStep].trailState); + + trail.setState( + sceneUtils.cloneSceneObjectState(trail.state.history.state.steps[currentStep].trailState, { + history: trail.state.history, + }) + ); return trail; } @@ -102,8 +108,8 @@ export class TrailStore { } private _loadFromUrl(node: SceneObject, urlValues: SceneObjectUrlValues) { - node.urlSync?.updateFromUrl(urlValues); - node.forEachChild((child) => this._loadFromUrl(child, urlValues)); + const urlState = urlUtil.renderUrl('', urlValues); + sceneUtils.syncStateFromSearchParams(node, new URLSearchParams(urlState)); } // Recent Trails @@ -140,14 +146,6 @@ export class TrailStore { this._save(); } - findMatchingRecentTrail(trail: DataTrail) { - const matchUrlState = getUrlStateForComparison(trail); - return this._recent.find((t) => { - const urlState = getUrlStateForComparison(t.resolve()); - return isEqual(matchUrlState, urlState); - }); - } - // Bookmarked Trails get bookmarks() { return this._bookmarks; diff --git a/public/sass/_angular.scss b/public/sass/_angular.scss index d5b8abf0bcd..dbe49f7b96d 100644 --- a/public/sass/_angular.scss +++ b/public/sass/_angular.scss @@ -1832,3 +1832,17 @@ $easing: cubic-bezier(0, 0, 0.265, 1); } } } + +.pull-right { + float: right; +} +.pull-left { + float: left; +} + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: calc(4em / 3); + line-height: calc(3em / 4); + vertical-align: -15%; +} diff --git a/public/sass/base/_font_awesome.scss b/public/sass/base/_font_awesome.scss index c3521338143..b2d058cd7c5 100644 --- a/public/sass/base/_font_awesome.scss +++ b/public/sass/base/_font_awesome.scss @@ -3,16 +3,2844 @@ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ -@import './font-awesome/variables'; -@import './font-awesome/mixins'; -@import './font-awesome/path'; -@import './font-awesome/core'; -@import './font-awesome/larger'; -@import './font-awesome/fixed-width'; -@import './font-awesome/list'; -@import './font-awesome/bordered-pulled'; -@import './font-awesome/animated'; -@import './font-awesome/rotated-flipped'; -@import './font-awesome/stacked'; -@import './font-awesome/icons'; -@import './font-awesome/screen-reader'; +$fa-font-path: '../fonts' !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +$fa-css-prefix: fa !default; +$fa-version: '4.7.0' !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: calc(30em / 14) !default; + +@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'); + font-weight: normal; + font-style: normal; +} + +.#{$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; +} + +.#{$fa-css-prefix}-glass:before { + content: '\f000'; +} + +.#{$fa-css-prefix}-music:before { + content: '\f001'; +} + +.#{$fa-css-prefix}-search:before { + content: '\f002'; +} + +.#{$fa-css-prefix}-envelope-o:before { + content: '\f003'; +} + +.#{$fa-css-prefix}-heart:before { + content: '\f004'; +} + +.#{$fa-css-prefix}-star:before { + content: '\f005'; +} + +.#{$fa-css-prefix}-star-o:before { + content: '\f006'; +} + +.#{$fa-css-prefix}-user:before { + content: '\f007'; +} + +.#{$fa-css-prefix}-film:before { + content: '\f008'; +} + +.#{$fa-css-prefix}-th-large:before { + content: '\f009'; +} + +.#{$fa-css-prefix}-th:before { + content: '\f00a'; +} + +.#{$fa-css-prefix}-th-list:before { + content: '\f00b'; +} + +.#{$fa-css-prefix}-check:before { + content: '\f00c'; +} + +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { + content: '\f00d'; +} + +.#{$fa-css-prefix}-search-plus:before { + content: '\f00e'; +} + +.#{$fa-css-prefix}-search-minus:before { + content: '\f010'; +} + +.#{$fa-css-prefix}-power-off:before { + content: '\f011'; +} + +.#{$fa-css-prefix}-signal:before { + content: '\f012'; +} + +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { + content: '\f013'; +} + +.#{$fa-css-prefix}-trash-o:before { + content: '\f014'; +} + +.#{$fa-css-prefix}-home:before { + content: '\f015'; +} + +.#{$fa-css-prefix}-file-o:before { + content: '\f016'; +} + +.#{$fa-css-prefix}-clock-o:before { + content: '\f017'; +} + +.#{$fa-css-prefix}-road:before { + content: '\f018'; +} + +.#{$fa-css-prefix}-download:before { + content: '\f019'; +} + +.#{$fa-css-prefix}-arrow-circle-o-down:before { + content: '\f01a'; +} + +.#{$fa-css-prefix}-arrow-circle-o-up:before { + content: '\f01b'; +} + +.#{$fa-css-prefix}-inbox:before { + content: '\f01c'; +} + +.#{$fa-css-prefix}-play-circle-o:before { + content: '\f01d'; +} + +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { + content: '\f01e'; +} + +.#{$fa-css-prefix}-refresh:before { + content: '\f021'; +} + +.#{$fa-css-prefix}-list-alt:before { + content: '\f022'; +} + +.#{$fa-css-prefix}-lock:before { + content: '\f023'; +} + +.#{$fa-css-prefix}-flag:before { + content: '\f024'; +} + +.#{$fa-css-prefix}-headphones:before { + content: '\f025'; +} + +.#{$fa-css-prefix}-volume-off:before { + content: '\f026'; +} + +.#{$fa-css-prefix}-volume-down:before { + content: '\f027'; +} + +.#{$fa-css-prefix}-volume-up:before { + content: '\f028'; +} + +.#{$fa-css-prefix}-qrcode:before { + content: '\f029'; +} + +.#{$fa-css-prefix}-barcode:before { + content: '\f02a'; +} + +.#{$fa-css-prefix}-tag:before { + content: '\f02b'; +} + +.#{$fa-css-prefix}-tags:before { + content: '\f02c'; +} + +.#{$fa-css-prefix}-book:before { + content: '\f02d'; +} + +.#{$fa-css-prefix}-bookmark:before { + content: '\f02e'; +} + +.#{$fa-css-prefix}-print:before { + content: '\f02f'; +} + +.#{$fa-css-prefix}-camera:before { + content: '\f030'; +} + +.#{$fa-css-prefix}-font:before { + content: '\f031'; +} + +.#{$fa-css-prefix}-bold:before { + content: '\f032'; +} + +.#{$fa-css-prefix}-italic:before { + content: '\f033'; +} + +.#{$fa-css-prefix}-text-height:before { + content: '\f034'; +} + +.#{$fa-css-prefix}-text-width:before { + content: '\f035'; +} + +.#{$fa-css-prefix}-align-left:before { + content: '\f036'; +} + +.#{$fa-css-prefix}-align-center:before { + content: '\f037'; +} + +.#{$fa-css-prefix}-align-right:before { + content: '\f038'; +} + +.#{$fa-css-prefix}-align-justify:before { + content: '\f039'; +} + +.#{$fa-css-prefix}-list:before { + content: '\f03a'; +} + +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { + content: '\f03b'; +} + +.#{$fa-css-prefix}-indent:before { + content: '\f03c'; +} + +.#{$fa-css-prefix}-video-camera:before { + content: '\f03d'; +} + +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { + content: '\f03e'; +} + +.#{$fa-css-prefix}-pencil:before { + content: '\f040'; +} + +.#{$fa-css-prefix}-map-marker:before { + content: '\f041'; +} + +.#{$fa-css-prefix}-adjust:before { + content: '\f042'; +} + +.#{$fa-css-prefix}-tint:before { + content: '\f043'; +} + +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { + content: '\f044'; +} + +.#{$fa-css-prefix}-share-square-o:before { + content: '\f045'; +} + +.#{$fa-css-prefix}-check-square-o:before { + content: '\f046'; +} + +.#{$fa-css-prefix}-arrows:before { + content: '\f047'; +} + +.#{$fa-css-prefix}-step-backward:before { + content: '\f048'; +} + +.#{$fa-css-prefix}-fast-backward:before { + content: '\f049'; +} + +.#{$fa-css-prefix}-backward:before { + content: '\f04a'; +} + +.#{$fa-css-prefix}-play:before { + content: '\f04b'; +} + +.#{$fa-css-prefix}-pause:before { + content: '\f04c'; +} + +.#{$fa-css-prefix}-stop:before { + content: '\f04d'; +} + +.#{$fa-css-prefix}-forward:before { + content: '\f04e'; +} + +.#{$fa-css-prefix}-fast-forward:before { + content: '\f050'; +} + +.#{$fa-css-prefix}-step-forward:before { + content: '\f051'; +} + +.#{$fa-css-prefix}-eject:before { + content: '\f052'; +} + +.#{$fa-css-prefix}-chevron-left:before { + content: '\f053'; +} + +.#{$fa-css-prefix}-chevron-right:before { + content: '\f054'; +} + +.#{$fa-css-prefix}-plus-circle:before { + content: '\f055'; +} + +.#{$fa-css-prefix}-minus-circle:before { + content: '\f056'; +} + +.#{$fa-css-prefix}-times-circle:before { + content: '\f057'; +} + +.#{$fa-css-prefix}-check-circle:before { + content: '\f058'; +} + +.#{$fa-css-prefix}-question-circle:before { + content: '\f059'; +} + +.#{$fa-css-prefix}-info-circle:before { + content: '\f05a'; +} + +.#{$fa-css-prefix}-crosshairs:before { + content: '\f05b'; +} + +.#{$fa-css-prefix}-times-circle-o:before { + content: '\f05c'; +} + +.#{$fa-css-prefix}-check-circle-o:before { + content: '\f05d'; +} + +.#{$fa-css-prefix}-ban:before { + content: '\f05e'; +} + +.#{$fa-css-prefix}-arrow-left:before { + content: '\f060'; +} + +.#{$fa-css-prefix}-arrow-right:before { + content: '\f061'; +} + +.#{$fa-css-prefix}-arrow-up:before { + content: '\f062'; +} + +.#{$fa-css-prefix}-arrow-down:before { + content: '\f063'; +} + +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { + content: '\f064'; +} + +.#{$fa-css-prefix}-expand:before { + content: '\f065'; +} + +.#{$fa-css-prefix}-compress:before { + content: '\f066'; +} + +.#{$fa-css-prefix}-plus:before { + content: '\f067'; +} + +.#{$fa-css-prefix}-minus:before { + content: '\f068'; +} + +.#{$fa-css-prefix}-asterisk:before { + content: '\f069'; +} + +.#{$fa-css-prefix}-exclamation-circle:before { + content: '\f06a'; +} + +.#{$fa-css-prefix}-gift:before { + content: '\f06b'; +} + +.#{$fa-css-prefix}-leaf:before { + content: '\f06c'; +} + +.#{$fa-css-prefix}-fire:before { + content: '\f06d'; +} + +.#{$fa-css-prefix}-eye:before { + content: '\f06e'; +} + +.#{$fa-css-prefix}-eye-slash:before { + content: '\f070'; +} + +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { + content: '\f071'; +} + +.#{$fa-css-prefix}-plane:before { + content: '\f072'; +} + +.#{$fa-css-prefix}-calendar:before { + content: '\f073'; +} + +.#{$fa-css-prefix}-random:before { + content: '\f074'; +} + +.#{$fa-css-prefix}-comment:before { + content: '\f075'; +} + +.#{$fa-css-prefix}-magnet:before { + content: '\f076'; +} + +.#{$fa-css-prefix}-chevron-up:before { + content: '\f077'; +} + +.#{$fa-css-prefix}-chevron-down:before { + content: '\f078'; +} + +.#{$fa-css-prefix}-retweet:before { + content: '\f079'; +} + +.#{$fa-css-prefix}-shopping-cart:before { + content: '\f07a'; +} + +.#{$fa-css-prefix}-folder:before { + content: '\f07b'; +} + +.#{$fa-css-prefix}-folder-open:before { + content: '\f07c'; +} + +.#{$fa-css-prefix}-arrows-v:before { + content: '\f07d'; +} + +.#{$fa-css-prefix}-arrows-h:before { + content: '\f07e'; +} + +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { + content: '\f080'; +} + +.#{$fa-css-prefix}-twitter-square:before { + content: '\f081'; +} + +.#{$fa-css-prefix}-facebook-square:before { + content: '\f082'; +} + +.#{$fa-css-prefix}-camera-retro:before { + content: '\f083'; +} + +.#{$fa-css-prefix}-key:before { + content: '\f084'; +} + +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { + content: '\f085'; +} + +.#{$fa-css-prefix}-comments:before { + content: '\f086'; +} + +.#{$fa-css-prefix}-thumbs-o-up:before { + content: '\f087'; +} + +.#{$fa-css-prefix}-thumbs-o-down:before { + content: '\f088'; +} + +.#{$fa-css-prefix}-star-half:before { + content: '\f089'; +} + +.#{$fa-css-prefix}-heart-o:before { + content: '\f08a'; +} + +.#{$fa-css-prefix}-sign-out:before { + content: '\f08b'; +} + +.#{$fa-css-prefix}-linkedin-square:before { + content: '\f08c'; +} + +.#{$fa-css-prefix}-thumb-tack:before { + content: '\f08d'; +} + +.#{$fa-css-prefix}-external-link:before { + content: '\f08e'; +} + +.#{$fa-css-prefix}-sign-in:before { + content: '\f090'; +} + +.#{$fa-css-prefix}-trophy:before { + content: '\f091'; +} + +.#{$fa-css-prefix}-github-square:before { + content: '\f092'; +} + +.#{$fa-css-prefix}-upload:before { + content: '\f093'; +} + +.#{$fa-css-prefix}-lemon-o:before { + content: '\f094'; +} + +.#{$fa-css-prefix}-phone:before { + content: '\f095'; +} + +.#{$fa-css-prefix}-square-o:before { + content: '\f096'; +} + +.#{$fa-css-prefix}-bookmark-o:before { + content: '\f097'; +} + +.#{$fa-css-prefix}-phone-square:before { + content: '\f098'; +} + +.#{$fa-css-prefix}-twitter:before { + content: '\f099'; +} + +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { + content: '\f09a'; +} + +.#{$fa-css-prefix}-github:before { + content: '\f09b'; +} + +.#{$fa-css-prefix}-unlock:before { + content: '\f09c'; +} + +.#{$fa-css-prefix}-credit-card:before { + content: '\f09d'; +} + +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { + content: '\f09e'; +} + +.#{$fa-css-prefix}-hdd-o:before { + content: '\f0a0'; +} + +.#{$fa-css-prefix}-bullhorn:before { + content: '\f0a1'; +} + +.#{$fa-css-prefix}-bell:before { + content: '\f0f3'; +} + +.#{$fa-css-prefix}-certificate:before { + content: '\f0a3'; +} + +.#{$fa-css-prefix}-hand-o-right:before { + content: '\f0a4'; +} + +.#{$fa-css-prefix}-hand-o-left:before { + content: '\f0a5'; +} + +.#{$fa-css-prefix}-hand-o-up:before { + content: '\f0a6'; +} + +.#{$fa-css-prefix}-hand-o-down:before { + content: '\f0a7'; +} + +.#{$fa-css-prefix}-arrow-circle-left:before { + content: '\f0a8'; +} + +.#{$fa-css-prefix}-arrow-circle-right:before { + content: '\f0a9'; +} + +.#{$fa-css-prefix}-arrow-circle-up:before { + content: '\f0aa'; +} + +.#{$fa-css-prefix}-arrow-circle-down:before { + content: '\f0ab'; +} + +.#{$fa-css-prefix}-globe:before { + content: '\f0ac'; +} + +.#{$fa-css-prefix}-wrench:before { + content: '\f0ad'; +} + +.#{$fa-css-prefix}-tasks:before { + content: '\f0ae'; +} + +.#{$fa-css-prefix}-filter:before { + content: '\f0b0'; +} + +.#{$fa-css-prefix}-briefcase:before { + content: '\f0b1'; +} + +.#{$fa-css-prefix}-arrows-alt:before { + content: '\f0b2'; +} + +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { + content: '\f0c0'; +} + +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { + content: '\f0c1'; +} + +.#{$fa-css-prefix}-cloud:before { + content: '\f0c2'; +} + +.#{$fa-css-prefix}-flask:before { + content: '\f0c3'; +} + +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { + content: '\f0c4'; +} + +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { + content: '\f0c5'; +} + +.#{$fa-css-prefix}-paperclip:before { + content: '\f0c6'; +} + +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { + content: '\f0c7'; +} + +.#{$fa-css-prefix}-square:before { + content: '\f0c8'; +} + +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { + content: '\f0c9'; +} + +.#{$fa-css-prefix}-list-ul:before { + content: '\f0ca'; +} + +.#{$fa-css-prefix}-list-ol:before { + content: '\f0cb'; +} + +.#{$fa-css-prefix}-strikethrough:before { + content: '\f0cc'; +} + +.#{$fa-css-prefix}-underline:before { + content: '\f0cd'; +} + +.#{$fa-css-prefix}-table:before { + content: '\f0ce'; +} + +.#{$fa-css-prefix}-magic:before { + content: '\f0d0'; +} + +.#{$fa-css-prefix}-truck:before { + content: '\f0d1'; +} + +.#{$fa-css-prefix}-pinterest:before { + content: '\f0d2'; +} + +.#{$fa-css-prefix}-pinterest-square:before { + content: '\f0d3'; +} + +.#{$fa-css-prefix}-google-plus-square:before { + content: '\f0d4'; +} + +.#{$fa-css-prefix}-google-plus:before { + content: '\f0d5'; +} + +.#{$fa-css-prefix}-money:before { + content: '\f0d6'; +} + +.#{$fa-css-prefix}-caret-down:before { + content: '\f0d7'; +} + +.#{$fa-css-prefix}-caret-up:before { + content: '\f0d8'; +} + +.#{$fa-css-prefix}-caret-left:before { + content: '\f0d9'; +} + +.#{$fa-css-prefix}-caret-right:before { + content: '\f0da'; +} + +.#{$fa-css-prefix}-columns:before { + content: '\f0db'; +} + +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { + content: '\f0dc'; +} + +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { + content: '\f0dd'; +} + +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { + content: '\f0de'; +} + +.#{$fa-css-prefix}-envelope:before { + content: '\f0e0'; +} + +.#{$fa-css-prefix}-linkedin:before { + content: '\f0e1'; +} + +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { + content: '\f0e2'; +} + +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { + content: '\f0e3'; +} + +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { + content: '\f0e4'; +} + +.#{$fa-css-prefix}-comment-o:before { + content: '\f0e5'; +} + +.#{$fa-css-prefix}-comments-o:before { + content: '\f0e6'; +} + +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { + content: '\f0e7'; +} + +.#{$fa-css-prefix}-sitemap:before { + content: '\f0e8'; +} + +.#{$fa-css-prefix}-umbrella:before { + content: '\f0e9'; +} + +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { + content: '\f0ea'; +} + +.#{$fa-css-prefix}-lightbulb-o:before { + content: '\f0eb'; +} + +.#{$fa-css-prefix}-exchange:before { + content: '\f0ec'; +} + +.#{$fa-css-prefix}-cloud-download:before { + content: '\f0ed'; +} + +.#{$fa-css-prefix}-cloud-upload:before { + content: '\f0ee'; +} + +.#{$fa-css-prefix}-user-md:before { + content: '\f0f0'; +} + +.#{$fa-css-prefix}-stethoscope:before { + content: '\f0f1'; +} + +.#{$fa-css-prefix}-suitcase:before { + content: '\f0f2'; +} + +.#{$fa-css-prefix}-bell-o:before { + content: '\f0a2'; +} + +.#{$fa-css-prefix}-coffee:before { + content: '\f0f4'; +} + +.#{$fa-css-prefix}-cutlery:before { + content: '\f0f5'; +} + +.#{$fa-css-prefix}-file-text-o:before { + content: '\f0f6'; +} + +.#{$fa-css-prefix}-building-o:before { + content: '\f0f7'; +} + +.#{$fa-css-prefix}-hospital-o:before { + content: '\f0f8'; +} + +.#{$fa-css-prefix}-ambulance:before { + content: '\f0f9'; +} + +.#{$fa-css-prefix}-medkit:before { + content: '\f0fa'; +} + +.#{$fa-css-prefix}-fighter-jet:before { + content: '\f0fb'; +} + +.#{$fa-css-prefix}-beer:before { + content: '\f0fc'; +} + +.#{$fa-css-prefix}-h-square:before { + content: '\f0fd'; +} + +.#{$fa-css-prefix}-plus-square:before { + content: '\f0fe'; +} + +.#{$fa-css-prefix}-angle-double-left:before { + content: '\f100'; +} + +.#{$fa-css-prefix}-angle-double-right:before { + content: '\f101'; +} + +.#{$fa-css-prefix}-angle-double-up:before { + content: '\f102'; +} + +.#{$fa-css-prefix}-angle-double-down:before { + content: '\f103'; +} + +.#{$fa-css-prefix}-angle-left:before { + content: '\f104'; +} + +.#{$fa-css-prefix}-angle-right:before { + content: '\f105'; +} + +.#{$fa-css-prefix}-angle-up:before { + content: '\f106'; +} + +.#{$fa-css-prefix}-angle-down:before { + content: '\f107'; +} + +.#{$fa-css-prefix}-desktop:before { + content: '\f108'; +} + +.#{$fa-css-prefix}-laptop:before { + content: '\f109'; +} + +.#{$fa-css-prefix}-tablet:before { + content: '\f10a'; +} + +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { + content: '\f10b'; +} + +.#{$fa-css-prefix}-circle-o:before { + content: '\f10c'; +} + +.#{$fa-css-prefix}-quote-left:before { + content: '\f10d'; +} + +.#{$fa-css-prefix}-quote-right:before { + content: '\f10e'; +} + +.#{$fa-css-prefix}-spinner:before { + content: '\f110'; +} + +.#{$fa-css-prefix}-circle:before { + content: '\f111'; +} + +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { + content: '\f112'; +} + +.#{$fa-css-prefix}-github-alt:before { + content: '\f113'; +} + +.#{$fa-css-prefix}-folder-o:before { + content: '\f114'; +} + +.#{$fa-css-prefix}-folder-open-o:before { + content: '\f115'; +} + +.#{$fa-css-prefix}-smile-o:before { + content: '\f118'; +} + +.#{$fa-css-prefix}-frown-o:before { + content: '\f119'; +} + +.#{$fa-css-prefix}-meh-o:before { + content: '\f11a'; +} + +.#{$fa-css-prefix}-gamepad:before { + content: '\f11b'; +} + +.#{$fa-css-prefix}-keyboard-o:before { + content: '\f11c'; +} + +.#{$fa-css-prefix}-flag-o:before { + content: '\f11d'; +} + +.#{$fa-css-prefix}-flag-checkered:before { + content: '\f11e'; +} + +.#{$fa-css-prefix}-terminal:before { + content: '\f120'; +} + +.#{$fa-css-prefix}-code:before { + content: '\f121'; +} + +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { + content: '\f122'; +} + +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { + content: '\f123'; +} + +.#{$fa-css-prefix}-location-arrow:before { + content: '\f124'; +} + +.#{$fa-css-prefix}-crop:before { + content: '\f125'; +} + +.#{$fa-css-prefix}-code-fork:before { + content: '\f126'; +} + +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { + content: '\f127'; +} + +.#{$fa-css-prefix}-question:before { + content: '\f128'; +} + +.#{$fa-css-prefix}-info:before { + content: '\f129'; +} + +.#{$fa-css-prefix}-exclamation:before { + content: '\f12a'; +} + +.#{$fa-css-prefix}-superscript:before { + content: '\f12b'; +} + +.#{$fa-css-prefix}-subscript:before { + content: '\f12c'; +} + +.#{$fa-css-prefix}-eraser:before { + content: '\f12d'; +} + +.#{$fa-css-prefix}-puzzle-piece:before { + content: '\f12e'; +} + +.#{$fa-css-prefix}-microphone:before { + content: '\f130'; +} + +.#{$fa-css-prefix}-microphone-slash:before { + content: '\f131'; +} + +.#{$fa-css-prefix}-shield:before { + content: '\f132'; +} + +.#{$fa-css-prefix}-calendar-o:before { + content: '\f133'; +} + +.#{$fa-css-prefix}-fire-extinguisher:before { + content: '\f134'; +} + +.#{$fa-css-prefix}-rocket:before { + content: '\f135'; +} + +.#{$fa-css-prefix}-maxcdn:before { + content: '\f136'; +} + +.#{$fa-css-prefix}-chevron-circle-left:before { + content: '\f137'; +} + +.#{$fa-css-prefix}-chevron-circle-right:before { + content: '\f138'; +} + +.#{$fa-css-prefix}-chevron-circle-up:before { + content: '\f139'; +} + +.#{$fa-css-prefix}-chevron-circle-down:before { + content: '\f13a'; +} + +.#{$fa-css-prefix}-html5:before { + content: '\f13b'; +} + +.#{$fa-css-prefix}-css3:before { + content: '\f13c'; +} + +.#{$fa-css-prefix}-anchor:before { + content: '\f13d'; +} + +.#{$fa-css-prefix}-unlock-alt:before { + content: '\f13e'; +} + +.#{$fa-css-prefix}-bullseye:before { + content: '\f140'; +} + +.#{$fa-css-prefix}-ellipsis-h:before { + content: '\f141'; +} + +.#{$fa-css-prefix}-ellipsis-v:before { + content: '\f142'; +} + +.#{$fa-css-prefix}-rss-square:before { + content: '\f143'; +} + +.#{$fa-css-prefix}-play-circle:before { + content: '\f144'; +} + +.#{$fa-css-prefix}-ticket:before { + content: '\f145'; +} + +.#{$fa-css-prefix}-minus-square:before { + content: '\f146'; +} + +.#{$fa-css-prefix}-minus-square-o:before { + content: '\f147'; +} + +.#{$fa-css-prefix}-level-up:before { + content: '\f148'; +} + +.#{$fa-css-prefix}-level-down:before { + content: '\f149'; +} + +.#{$fa-css-prefix}-check-square:before { + content: '\f14a'; +} + +.#{$fa-css-prefix}-pencil-square:before { + content: '\f14b'; +} + +.#{$fa-css-prefix}-external-link-square:before { + content: '\f14c'; +} + +.#{$fa-css-prefix}-share-square:before { + content: '\f14d'; +} + +.#{$fa-css-prefix}-compass:before { + content: '\f14e'; +} + +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { + content: '\f150'; +} + +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { + content: '\f151'; +} + +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { + content: '\f152'; +} + +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { + content: '\f153'; +} + +.#{$fa-css-prefix}-gbp:before { + content: '\f154'; +} + +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { + content: '\f155'; +} + +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { + content: '\f156'; +} + +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { + content: '\f157'; +} + +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { + content: '\f158'; +} + +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { + content: '\f159'; +} + +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { + content: '\f15a'; +} + +.#{$fa-css-prefix}-file:before { + content: '\f15b'; +} + +.#{$fa-css-prefix}-file-text:before { + content: '\f15c'; +} + +.#{$fa-css-prefix}-sort-alpha-asc:before { + content: '\f15d'; +} + +.#{$fa-css-prefix}-sort-alpha-desc:before { + content: '\f15e'; +} + +.#{$fa-css-prefix}-sort-amount-asc:before { + content: '\f160'; +} + +.#{$fa-css-prefix}-sort-amount-desc:before { + content: '\f161'; +} + +.#{$fa-css-prefix}-sort-numeric-asc:before { + content: '\f162'; +} + +.#{$fa-css-prefix}-sort-numeric-desc:before { + content: '\f163'; +} + +.#{$fa-css-prefix}-thumbs-up:before { + content: '\f164'; +} + +.#{$fa-css-prefix}-thumbs-down:before { + content: '\f165'; +} + +.#{$fa-css-prefix}-youtube-square:before { + content: '\f166'; +} + +.#{$fa-css-prefix}-youtube:before { + content: '\f167'; +} + +.#{$fa-css-prefix}-xing:before { + content: '\f168'; +} + +.#{$fa-css-prefix}-xing-square:before { + content: '\f169'; +} + +.#{$fa-css-prefix}-youtube-play:before { + content: '\f16a'; +} + +.#{$fa-css-prefix}-dropbox:before { + content: '\f16b'; +} + +.#{$fa-css-prefix}-stack-overflow:before { + content: '\f16c'; +} + +.#{$fa-css-prefix}-instagram:before { + content: '\f16d'; +} + +.#{$fa-css-prefix}-flickr:before { + content: '\f16e'; +} + +.#{$fa-css-prefix}-adn:before { + content: '\f170'; +} + +.#{$fa-css-prefix}-bitbucket:before { + content: '\f171'; +} + +.#{$fa-css-prefix}-bitbucket-square:before { + content: '\f172'; +} + +.#{$fa-css-prefix}-tumblr:before { + content: '\f173'; +} + +.#{$fa-css-prefix}-tumblr-square:before { + content: '\f174'; +} + +.#{$fa-css-prefix}-long-arrow-down:before { + content: '\f175'; +} + +.#{$fa-css-prefix}-long-arrow-up:before { + content: '\f176'; +} + +.#{$fa-css-prefix}-long-arrow-left:before { + content: '\f177'; +} + +.#{$fa-css-prefix}-long-arrow-right:before { + content: '\f178'; +} + +.#{$fa-css-prefix}-apple:before { + content: '\f179'; +} + +.#{$fa-css-prefix}-windows:before { + content: '\f17a'; +} + +.#{$fa-css-prefix}-android:before { + content: '\f17b'; +} + +.#{$fa-css-prefix}-linux:before { + content: '\f17c'; +} + +.#{$fa-css-prefix}-dribbble:before { + content: '\f17d'; +} + +.#{$fa-css-prefix}-skype:before { + content: '\f17e'; +} + +.#{$fa-css-prefix}-foursquare:before { + content: '\f180'; +} + +.#{$fa-css-prefix}-trello:before { + content: '\f181'; +} + +.#{$fa-css-prefix}-female:before { + content: '\f182'; +} + +.#{$fa-css-prefix}-male:before { + content: '\f183'; +} + +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { + content: '\f184'; +} + +.#{$fa-css-prefix}-sun-o:before { + content: '\f185'; +} + +.#{$fa-css-prefix}-moon-o:before { + content: '\f186'; +} + +.#{$fa-css-prefix}-archive:before { + content: '\f187'; +} + +.#{$fa-css-prefix}-bug:before { + content: '\f188'; +} + +.#{$fa-css-prefix}-vk:before { + content: '\f189'; +} + +.#{$fa-css-prefix}-weibo:before { + content: '\f18a'; +} + +.#{$fa-css-prefix}-renren:before { + content: '\f18b'; +} + +.#{$fa-css-prefix}-pagelines:before { + content: '\f18c'; +} + +.#{$fa-css-prefix}-stack-exchange:before { + content: '\f18d'; +} + +.#{$fa-css-prefix}-arrow-circle-o-right:before { + content: '\f18e'; +} + +.#{$fa-css-prefix}-arrow-circle-o-left:before { + content: '\f190'; +} + +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { + content: '\f191'; +} + +.#{$fa-css-prefix}-dot-circle-o:before { + content: '\f192'; +} + +.#{$fa-css-prefix}-wheelchair:before { + content: '\f193'; +} + +.#{$fa-css-prefix}-vimeo-square:before { + content: '\f194'; +} + +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { + content: '\f195'; +} + +.#{$fa-css-prefix}-plus-square-o:before { + content: '\f196'; +} + +.#{$fa-css-prefix}-space-shuttle:before { + content: '\f197'; +} + +.#{$fa-css-prefix}-slack:before { + content: '\f198'; +} + +.#{$fa-css-prefix}-envelope-square:before { + content: '\f199'; +} + +.#{$fa-css-prefix}-wordpress:before { + content: '\f19a'; +} + +.#{$fa-css-prefix}-openid:before { + content: '\f19b'; +} + +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { + content: '\f19c'; +} + +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { + content: '\f19d'; +} + +.#{$fa-css-prefix}-yahoo:before { + content: '\f19e'; +} + +.#{$fa-css-prefix}-google:before { + content: '\f1a0'; +} + +.#{$fa-css-prefix}-reddit:before { + content: '\f1a1'; +} + +.#{$fa-css-prefix}-reddit-square:before { + content: '\f1a2'; +} + +.#{$fa-css-prefix}-stumbleupon-circle:before { + content: '\f1a3'; +} + +.#{$fa-css-prefix}-stumbleupon:before { + content: '\f1a4'; +} + +.#{$fa-css-prefix}-delicious:before { + content: '\f1a5'; +} + +.#{$fa-css-prefix}-digg:before { + content: '\f1a6'; +} + +.#{$fa-css-prefix}-pied-piper-pp:before { + content: '\f1a7'; +} + +.#{$fa-css-prefix}-pied-piper-alt:before { + content: '\f1a8'; +} + +.#{$fa-css-prefix}-drupal:before { + content: '\f1a9'; +} + +.#{$fa-css-prefix}-joomla:before { + content: '\f1aa'; +} + +.#{$fa-css-prefix}-language:before { + content: '\f1ab'; +} + +.#{$fa-css-prefix}-fax:before { + content: '\f1ac'; +} + +.#{$fa-css-prefix}-building:before { + content: '\f1ad'; +} + +.#{$fa-css-prefix}-child:before { + content: '\f1ae'; +} + +.#{$fa-css-prefix}-paw:before { + content: '\f1b0'; +} + +.#{$fa-css-prefix}-spoon:before { + content: '\f1b1'; +} + +.#{$fa-css-prefix}-cube:before { + content: '\f1b2'; +} + +.#{$fa-css-prefix}-cubes:before { + content: '\f1b3'; +} + +.#{$fa-css-prefix}-behance:before { + content: '\f1b4'; +} + +.#{$fa-css-prefix}-behance-square:before { + content: '\f1b5'; +} + +.#{$fa-css-prefix}-steam:before { + content: '\f1b6'; +} + +.#{$fa-css-prefix}-steam-square:before { + content: '\f1b7'; +} + +.#{$fa-css-prefix}-recycle:before { + content: '\f1b8'; +} + +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { + content: '\f1b9'; +} + +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { + content: '\f1ba'; +} + +.#{$fa-css-prefix}-tree:before { + content: '\f1bb'; +} + +.#{$fa-css-prefix}-spotify:before { + content: '\f1bc'; +} + +.#{$fa-css-prefix}-deviantart:before { + content: '\f1bd'; +} + +.#{$fa-css-prefix}-soundcloud:before { + content: '\f1be'; +} + +.#{$fa-css-prefix}-database:before { + content: '\f1c0'; +} + +.#{$fa-css-prefix}-file-pdf-o:before { + content: '\f1c1'; +} + +.#{$fa-css-prefix}-file-word-o:before { + content: '\f1c2'; +} + +.#{$fa-css-prefix}-file-excel-o:before { + content: '\f1c3'; +} + +.#{$fa-css-prefix}-file-powerpoint-o:before { + content: '\f1c4'; +} + +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { + content: '\f1c5'; +} + +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { + content: '\f1c6'; +} + +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { + content: '\f1c7'; +} + +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { + content: '\f1c8'; +} + +.#{$fa-css-prefix}-file-code-o:before { + content: '\f1c9'; +} + +.#{$fa-css-prefix}-vine:before { + content: '\f1ca'; +} + +.#{$fa-css-prefix}-codepen:before { + content: '\f1cb'; +} + +.#{$fa-css-prefix}-jsfiddle:before { + content: '\f1cc'; +} + +.#{$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: '\f1cd'; +} + +.#{$fa-css-prefix}-circle-o-notch:before { + content: '\f1ce'; +} + +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { + content: '\f1d0'; +} + +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { + content: '\f1d1'; +} + +.#{$fa-css-prefix}-git-square:before { + content: '\f1d2'; +} + +.#{$fa-css-prefix}-git:before { + content: '\f1d3'; +} + +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { + content: '\f1d4'; +} + +.#{$fa-css-prefix}-tencent-weibo:before { + content: '\f1d5'; +} + +.#{$fa-css-prefix}-qq:before { + content: '\f1d6'; +} + +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { + content: '\f1d7'; +} + +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { + content: '\f1d8'; +} + +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { + content: '\f1d9'; +} + +.#{$fa-css-prefix}-history:before { + content: '\f1da'; +} + +.#{$fa-css-prefix}-circle-thin:before { + content: '\f1db'; +} + +.#{$fa-css-prefix}-header:before { + content: '\f1dc'; +} + +.#{$fa-css-prefix}-paragraph:before { + content: '\f1dd'; +} + +.#{$fa-css-prefix}-sliders:before { + content: '\f1de'; +} + +.#{$fa-css-prefix}-share-alt:before { + content: '\f1e0'; +} + +.#{$fa-css-prefix}-share-alt-square:before { + content: '\f1e1'; +} + +.#{$fa-css-prefix}-bomb:before { + content: '\f1e2'; +} + +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { + content: '\f1e3'; +} + +.#{$fa-css-prefix}-tty:before { + content: '\f1e4'; +} + +.#{$fa-css-prefix}-binoculars:before { + content: '\f1e5'; +} + +.#{$fa-css-prefix}-plug:before { + content: '\f1e6'; +} + +.#{$fa-css-prefix}-slideshare:before { + content: '\f1e7'; +} + +.#{$fa-css-prefix}-twitch:before { + content: '\f1e8'; +} + +.#{$fa-css-prefix}-yelp:before { + content: '\f1e9'; +} + +.#{$fa-css-prefix}-newspaper-o:before { + content: '\f1ea'; +} + +.#{$fa-css-prefix}-wifi:before { + content: '\f1eb'; +} + +.#{$fa-css-prefix}-calculator:before { + content: '\f1ec'; +} + +.#{$fa-css-prefix}-paypal:before { + content: '\f1ed'; +} + +.#{$fa-css-prefix}-google-wallet:before { + content: '\f1ee'; +} + +.#{$fa-css-prefix}-cc-visa:before { + content: '\f1f0'; +} + +.#{$fa-css-prefix}-cc-mastercard:before { + content: '\f1f1'; +} + +.#{$fa-css-prefix}-cc-discover:before { + content: '\f1f2'; +} + +.#{$fa-css-prefix}-cc-amex:before { + content: '\f1f3'; +} + +.#{$fa-css-prefix}-cc-paypal:before { + content: '\f1f4'; +} + +.#{$fa-css-prefix}-cc-stripe:before { + content: '\f1f5'; +} + +.#{$fa-css-prefix}-bell-slash:before { + content: '\f1f6'; +} + +.#{$fa-css-prefix}-bell-slash-o:before { + content: '\f1f7'; +} + +.#{$fa-css-prefix}-trash:before { + content: '\f1f8'; +} + +.#{$fa-css-prefix}-copyright:before { + content: '\f1f9'; +} + +.#{$fa-css-prefix}-at:before { + content: '\f1fa'; +} + +.#{$fa-css-prefix}-eyedropper:before { + content: '\f1fb'; +} + +.#{$fa-css-prefix}-paint-brush:before { + content: '\f1fc'; +} + +.#{$fa-css-prefix}-birthday-cake:before { + content: '\f1fd'; +} + +.#{$fa-css-prefix}-area-chart:before { + content: '\f1fe'; +} + +.#{$fa-css-prefix}-pie-chart:before { + content: '\f200'; +} + +.#{$fa-css-prefix}-line-chart:before { + content: '\f201'; +} + +.#{$fa-css-prefix}-lastfm:before { + content: '\f202'; +} + +.#{$fa-css-prefix}-lastfm-square:before { + content: '\f203'; +} + +.#{$fa-css-prefix}-toggle-off:before { + content: '\f204'; +} + +.#{$fa-css-prefix}-toggle-on:before { + content: '\f205'; +} + +.#{$fa-css-prefix}-bicycle:before { + content: '\f206'; +} + +.#{$fa-css-prefix}-bus:before { + content: '\f207'; +} + +.#{$fa-css-prefix}-ioxhost:before { + content: '\f208'; +} + +.#{$fa-css-prefix}-angellist:before { + content: '\f209'; +} + +.#{$fa-css-prefix}-cc:before { + content: '\f20a'; +} + +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { + content: '\f20b'; +} + +.#{$fa-css-prefix}-meanpath:before { + content: '\f20c'; +} + +.#{$fa-css-prefix}-buysellads:before { + content: '\f20d'; +} + +.#{$fa-css-prefix}-connectdevelop:before { + content: '\f20e'; +} + +.#{$fa-css-prefix}-dashcube:before { + content: '\f210'; +} + +.#{$fa-css-prefix}-forumbee:before { + content: '\f211'; +} + +.#{$fa-css-prefix}-leanpub:before { + content: '\f212'; +} + +.#{$fa-css-prefix}-sellsy:before { + content: '\f213'; +} + +.#{$fa-css-prefix}-shirtsinbulk:before { + content: '\f214'; +} + +.#{$fa-css-prefix}-simplybuilt:before { + content: '\f215'; +} + +.#{$fa-css-prefix}-skyatlas:before { + content: '\f216'; +} + +.#{$fa-css-prefix}-cart-plus:before { + content: '\f217'; +} + +.#{$fa-css-prefix}-cart-arrow-down:before { + content: '\f218'; +} + +.#{$fa-css-prefix}-diamond:before { + content: '\f219'; +} + +.#{$fa-css-prefix}-ship:before { + content: '\f21a'; +} + +.#{$fa-css-prefix}-user-secret:before { + content: '\f21b'; +} + +.#{$fa-css-prefix}-motorcycle:before { + content: '\f21c'; +} + +.#{$fa-css-prefix}-street-view:before { + content: '\f21d'; +} + +.#{$fa-css-prefix}-heartbeat:before { + content: '\f21e'; +} + +.#{$fa-css-prefix}-venus:before { + content: '\f221'; +} + +.#{$fa-css-prefix}-mars:before { + content: '\f222'; +} + +.#{$fa-css-prefix}-mercury:before { + content: '\f223'; +} + +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { + content: '\f224'; +} + +.#{$fa-css-prefix}-transgender-alt:before { + content: '\f225'; +} + +.#{$fa-css-prefix}-venus-double:before { + content: '\f226'; +} + +.#{$fa-css-prefix}-mars-double:before { + content: '\f227'; +} + +.#{$fa-css-prefix}-venus-mars:before { + content: '\f228'; +} + +.#{$fa-css-prefix}-mars-stroke:before { + content: '\f229'; +} + +.#{$fa-css-prefix}-mars-stroke-v:before { + content: '\f22a'; +} + +.#{$fa-css-prefix}-mars-stroke-h:before { + content: '\f22b'; +} + +.#{$fa-css-prefix}-neuter:before { + content: '\f22c'; +} + +.#{$fa-css-prefix}-genderless:before { + content: '\f22d'; +} + +.#{$fa-css-prefix}-facebook-official:before { + content: '\f230'; +} + +.#{$fa-css-prefix}-pinterest-p:before { + content: '\f231'; +} + +.#{$fa-css-prefix}-whatsapp:before { + content: '\f232'; +} + +.#{$fa-css-prefix}-server:before { + content: '\f233'; +} + +.#{$fa-css-prefix}-user-plus:before { + content: '\f234'; +} + +.#{$fa-css-prefix}-user-times:before { + content: '\f235'; +} + +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { + content: '\f236'; +} + +.#{$fa-css-prefix}-viacoin:before { + content: '\f237'; +} + +.#{$fa-css-prefix}-train:before { + content: '\f238'; +} + +.#{$fa-css-prefix}-subway:before { + content: '\f239'; +} + +.#{$fa-css-prefix}-medium:before { + content: '\f23a'; +} + +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { + content: '\f23b'; +} + +.#{$fa-css-prefix}-optin-monster:before { + content: '\f23c'; +} + +.#{$fa-css-prefix}-opencart:before { + content: '\f23d'; +} + +.#{$fa-css-prefix}-expeditedssl:before { + content: '\f23e'; +} + +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery:before, +.#{$fa-css-prefix}-battery-full:before { + content: '\f240'; +} + +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { + content: '\f241'; +} + +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { + content: '\f242'; +} + +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { + content: '\f243'; +} + +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { + content: '\f244'; +} + +.#{$fa-css-prefix}-mouse-pointer:before { + content: '\f245'; +} + +.#{$fa-css-prefix}-i-cursor:before { + content: '\f246'; +} + +.#{$fa-css-prefix}-object-group:before { + content: '\f247'; +} + +.#{$fa-css-prefix}-object-ungroup:before { + content: '\f248'; +} + +.#{$fa-css-prefix}-sticky-note:before { + content: '\f249'; +} + +.#{$fa-css-prefix}-sticky-note-o:before { + content: '\f24a'; +} + +.#{$fa-css-prefix}-cc-jcb:before { + content: '\f24b'; +} + +.#{$fa-css-prefix}-cc-diners-club:before { + content: '\f24c'; +} + +.#{$fa-css-prefix}-clone:before { + content: '\f24d'; +} + +.#{$fa-css-prefix}-balance-scale:before { + content: '\f24e'; +} + +.#{$fa-css-prefix}-hourglass-o:before { + content: '\f250'; +} + +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { + content: '\f251'; +} + +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { + content: '\f252'; +} + +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { + content: '\f253'; +} + +.#{$fa-css-prefix}-hourglass:before { + content: '\f254'; +} + +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { + content: '\f255'; +} + +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { + content: '\f256'; +} + +.#{$fa-css-prefix}-hand-scissors-o:before { + content: '\f257'; +} + +.#{$fa-css-prefix}-hand-lizard-o:before { + content: '\f258'; +} + +.#{$fa-css-prefix}-hand-spock-o:before { + content: '\f259'; +} + +.#{$fa-css-prefix}-hand-pointer-o:before { + content: '\f25a'; +} + +.#{$fa-css-prefix}-hand-peace-o:before { + content: '\f25b'; +} + +.#{$fa-css-prefix}-trademark:before { + content: '\f25c'; +} + +.#{$fa-css-prefix}-registered:before { + content: '\f25d'; +} + +.#{$fa-css-prefix}-creative-commons:before { + content: '\f25e'; +} + +.#{$fa-css-prefix}-gg:before { + content: '\f260'; +} + +.#{$fa-css-prefix}-gg-circle:before { + content: '\f261'; +} + +.#{$fa-css-prefix}-tripadvisor:before { + content: '\f262'; +} + +.#{$fa-css-prefix}-odnoklassniki:before { + content: '\f263'; +} + +.#{$fa-css-prefix}-odnoklassniki-square:before { + content: '\f264'; +} + +.#{$fa-css-prefix}-get-pocket:before { + content: '\f265'; +} + +.#{$fa-css-prefix}-wikipedia-w:before { + content: '\f266'; +} + +.#{$fa-css-prefix}-safari:before { + content: '\f267'; +} + +.#{$fa-css-prefix}-chrome:before { + content: '\f268'; +} + +.#{$fa-css-prefix}-firefox:before { + content: '\f269'; +} + +.#{$fa-css-prefix}-opera:before { + content: '\f26a'; +} + +.#{$fa-css-prefix}-internet-explorer:before { + content: '\f26b'; +} + +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { + content: '\f26c'; +} + +.#{$fa-css-prefix}-contao:before { + content: '\f26d'; +} + +.#{$fa-css-prefix}-500px:before { + content: '\f26e'; +} + +.#{$fa-css-prefix}-amazon:before { + content: '\f270'; +} + +.#{$fa-css-prefix}-calendar-plus-o:before { + content: '\f271'; +} + +.#{$fa-css-prefix}-calendar-minus-o:before { + content: '\f272'; +} + +.#{$fa-css-prefix}-calendar-times-o:before { + content: '\f273'; +} + +.#{$fa-css-prefix}-calendar-check-o:before { + content: '\f274'; +} + +.#{$fa-css-prefix}-industry:before { + content: '\f275'; +} + +.#{$fa-css-prefix}-map-pin:before { + content: '\f276'; +} + +.#{$fa-css-prefix}-map-signs:before { + content: '\f277'; +} + +.#{$fa-css-prefix}-map-o:before { + content: '\f278'; +} + +.#{$fa-css-prefix}-map:before { + content: '\f279'; +} + +.#{$fa-css-prefix}-commenting:before { + content: '\f27a'; +} + +.#{$fa-css-prefix}-commenting-o:before { + content: '\f27b'; +} + +.#{$fa-css-prefix}-houzz:before { + content: '\f27c'; +} + +.#{$fa-css-prefix}-vimeo:before { + content: '\f27d'; +} + +.#{$fa-css-prefix}-black-tie:before { + content: '\f27e'; +} + +.#{$fa-css-prefix}-fonticons:before { + content: '\f280'; +} + +.#{$fa-css-prefix}-reddit-alien:before { + content: '\f281'; +} + +.#{$fa-css-prefix}-edge:before { + content: '\f282'; +} + +.#{$fa-css-prefix}-credit-card-alt:before { + content: '\f283'; +} + +.#{$fa-css-prefix}-codiepie:before { + content: '\f284'; +} + +.#{$fa-css-prefix}-modx:before { + content: '\f285'; +} + +.#{$fa-css-prefix}-fort-awesome:before { + content: '\f286'; +} + +.#{$fa-css-prefix}-usb:before { + content: '\f287'; +} + +.#{$fa-css-prefix}-product-hunt:before { + content: '\f288'; +} + +.#{$fa-css-prefix}-mixcloud:before { + content: '\f289'; +} + +.#{$fa-css-prefix}-scribd:before { + content: '\f28a'; +} + +.#{$fa-css-prefix}-pause-circle:before { + content: '\f28b'; +} + +.#{$fa-css-prefix}-pause-circle-o:before { + content: '\f28c'; +} + +.#{$fa-css-prefix}-stop-circle:before { + content: '\f28d'; +} + +.#{$fa-css-prefix}-stop-circle-o:before { + content: '\f28e'; +} + +.#{$fa-css-prefix}-shopping-bag:before { + content: '\f290'; +} + +.#{$fa-css-prefix}-shopping-basket:before { + content: '\f291'; +} + +.#{$fa-css-prefix}-hashtag:before { + content: '\f292'; +} + +.#{$fa-css-prefix}-bluetooth:before { + content: '\f293'; +} + +.#{$fa-css-prefix}-bluetooth-b:before { + content: '\f294'; +} + +.#{$fa-css-prefix}-percent:before { + content: '\f295'; +} + +.#{$fa-css-prefix}-gitlab:before { + content: '\f296'; +} + +.#{$fa-css-prefix}-wpbeginner:before { + content: '\f297'; +} + +.#{$fa-css-prefix}-wpforms:before { + content: '\f298'; +} + +.#{$fa-css-prefix}-envira:before { + content: '\f299'; +} + +.#{$fa-css-prefix}-universal-access:before { + content: '\f29a'; +} + +.#{$fa-css-prefix}-wheelchair-alt:before { + content: '\f29b'; +} + +.#{$fa-css-prefix}-question-circle-o:before { + content: '\f29c'; +} + +.#{$fa-css-prefix}-blind:before { + content: '\f29d'; +} + +.#{$fa-css-prefix}-audio-description:before { + content: '\f29e'; +} + +.#{$fa-css-prefix}-volume-control-phone:before { + content: '\f2a0'; +} + +.#{$fa-css-prefix}-braille:before { + content: '\f2a1'; +} + +.#{$fa-css-prefix}-assistive-listening-systems:before { + content: '\f2a2'; +} + +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { + content: '\f2a3'; +} + +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { + content: '\f2a4'; +} + +.#{$fa-css-prefix}-glide:before { + content: '\f2a5'; +} + +.#{$fa-css-prefix}-glide-g:before { + content: '\f2a6'; +} + +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { + content: '\f2a7'; +} + +.#{$fa-css-prefix}-low-vision:before { + content: '\f2a8'; +} + +.#{$fa-css-prefix}-viadeo:before { + content: '\f2a9'; +} + +.#{$fa-css-prefix}-viadeo-square:before { + content: '\f2aa'; +} + +.#{$fa-css-prefix}-snapchat:before { + content: '\f2ab'; +} + +.#{$fa-css-prefix}-snapchat-ghost:before { + content: '\f2ac'; +} + +.#{$fa-css-prefix}-snapchat-square:before { + content: '\f2ad'; +} + +.#{$fa-css-prefix}-pied-piper:before { + content: '\f2ae'; +} + +.#{$fa-css-prefix}-first-order:before { + content: '\f2b0'; +} + +.#{$fa-css-prefix}-yoast:before { + content: '\f2b1'; +} + +.#{$fa-css-prefix}-themeisle:before { + content: '\f2b2'; +} + +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { + content: '\f2b3'; +} + +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { + content: '\f2b4'; +} + +.#{$fa-css-prefix}-handshake-o:before { + content: '\f2b5'; +} + +.#{$fa-css-prefix}-envelope-open:before { + content: '\f2b6'; +} + +.#{$fa-css-prefix}-envelope-open-o:before { + content: '\f2b7'; +} + +.#{$fa-css-prefix}-linode:before { + content: '\f2b8'; +} + +.#{$fa-css-prefix}-address-book:before { + content: '\f2b9'; +} + +.#{$fa-css-prefix}-address-book-o:before { + content: '\f2ba'; +} + +.#{$fa-css-prefix}-vcard:before, +.#{$fa-css-prefix}-address-card:before { + content: '\f2bb'; +} + +.#{$fa-css-prefix}-vcard-o:before, +.#{$fa-css-prefix}-address-card-o:before { + content: '\f2bc'; +} + +.#{$fa-css-prefix}-user-circle:before { + content: '\f2bd'; +} + +.#{$fa-css-prefix}-user-circle-o:before { + content: '\f2be'; +} + +.#{$fa-css-prefix}-user-o:before { + content: '\f2c0'; +} + +.#{$fa-css-prefix}-id-badge:before { + content: '\f2c1'; +} + +.#{$fa-css-prefix}-drivers-license:before, +.#{$fa-css-prefix}-id-card:before { + content: '\f2c2'; +} + +.#{$fa-css-prefix}-drivers-license-o:before, +.#{$fa-css-prefix}-id-card-o:before { + content: '\f2c3'; +} + +.#{$fa-css-prefix}-quora:before { + content: '\f2c4'; +} + +.#{$fa-css-prefix}-free-code-camp:before { + content: '\f2c5'; +} + +.#{$fa-css-prefix}-telegram:before { + content: '\f2c6'; +} + +.#{$fa-css-prefix}-thermometer-4:before, +.#{$fa-css-prefix}-thermometer:before, +.#{$fa-css-prefix}-thermometer-full:before { + content: '\f2c7'; +} + +.#{$fa-css-prefix}-thermometer-3:before, +.#{$fa-css-prefix}-thermometer-three-quarters:before { + content: '\f2c8'; +} + +.#{$fa-css-prefix}-thermometer-2:before, +.#{$fa-css-prefix}-thermometer-half:before { + content: '\f2c9'; +} + +.#{$fa-css-prefix}-thermometer-1:before, +.#{$fa-css-prefix}-thermometer-quarter:before { + content: '\f2ca'; +} + +.#{$fa-css-prefix}-thermometer-0:before, +.#{$fa-css-prefix}-thermometer-empty:before { + content: '\f2cb'; +} + +.#{$fa-css-prefix}-shower:before { + content: '\f2cc'; +} + +.#{$fa-css-prefix}-bathtub:before, +.#{$fa-css-prefix}-s15:before, +.#{$fa-css-prefix}-bath:before { + content: '\f2cd'; +} + +.#{$fa-css-prefix}-podcast:before { + content: '\f2ce'; +} + +.#{$fa-css-prefix}-window-maximize:before { + content: '\f2d0'; +} + +.#{$fa-css-prefix}-window-minimize:before { + content: '\f2d1'; +} + +.#{$fa-css-prefix}-window-restore:before { + content: '\f2d2'; +} + +.#{$fa-css-prefix}-times-rectangle:before, +.#{$fa-css-prefix}-window-close:before { + content: '\f2d3'; +} + +.#{$fa-css-prefix}-times-rectangle-o:before, +.#{$fa-css-prefix}-window-close-o:before { + content: '\f2d4'; +} + +.#{$fa-css-prefix}-bandcamp:before { + content: '\f2d5'; +} + +.#{$fa-css-prefix}-grav:before { + content: '\f2d6'; +} + +.#{$fa-css-prefix}-etsy:before { + content: '\f2d7'; +} + +.#{$fa-css-prefix}-imdb:before { + content: '\f2d8'; +} + +.#{$fa-css-prefix}-ravelry:before { + content: '\f2d9'; +} + +.#{$fa-css-prefix}-eercast:before { + content: '\f2da'; +} + +.#{$fa-css-prefix}-microchip:before { + content: '\f2db'; +} + +.#{$fa-css-prefix}-snowflake-o:before { + content: '\f2dc'; +} + +.#{$fa-css-prefix}-superpowers:before { + content: '\f2dd'; +} + +.#{$fa-css-prefix}-wpexplorer:before { + content: '\f2de'; +} + +.#{$fa-css-prefix}-meetup:before { + content: '\f2e0'; +} diff --git a/public/sass/base/font-awesome/_animated.scss b/public/sass/base/font-awesome/_animated.scss deleted file mode 100644 index 230df6b9ea8..00000000000 --- a/public/sass/base/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/public/sass/base/font-awesome/_bordered-pulled.scss b/public/sass/base/font-awesome/_bordered-pulled.scss deleted file mode 100644 index c9b6b38ea6f..00000000000 --- a/public/sass/base/font-awesome/_bordered-pulled.scss +++ /dev/null @@ -1,41 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.#{$fa-css-prefix}-border { - padding: 0.2em 0.25em 0.15em; - border: solid 0.08em $fa-border-color; - border-radius: 0.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: 0.3em; - } - &.#{$fa-css-prefix}-pull-right { - margin-left: 0.3em; - } -} - -/* Deprecated as of 4.4.0 */ -.pull-right { - float: right; -} -.pull-left { - float: left; -} - -.#{$fa-css-prefix} { - &.pull-left { - margin-right: 0.3em; - } - &.pull-right { - margin-left: 0.3em; - } -} diff --git a/public/sass/base/font-awesome/_core.scss b/public/sass/base/font-awesome/_core.scss deleted file mode 100644 index a5411f108af..00000000000 --- a/public/sass/base/font-awesome/_core.scss +++ /dev/null @@ -1,11 +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/public/sass/base/font-awesome/_fixed-width.scss b/public/sass/base/font-awesome/_fixed-width.scss deleted file mode 100644 index 7102bbac0ca..00000000000 --- a/public/sass/base/font-awesome/_fixed-width.scss +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.#{$fa-css-prefix}-fw { - width: calc(18em / 14); - text-align: center; -} diff --git a/public/sass/base/font-awesome/_icons.scss b/public/sass/base/font-awesome/_icons.scss deleted file mode 100644 index 6ee6171f359..00000000000 --- a/public/sass/base/font-awesome/_icons.scss +++ /dev/null @@ -1,2139 +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/public/sass/base/font-awesome/_larger.scss b/public/sass/base/font-awesome/_larger.scss deleted file mode 100644 index 9e47f7720bb..00000000000 --- a/public/sass/base/font-awesome/_larger.scss +++ /dev/null @@ -1,21 +0,0 @@ -// Icon Sizes -// ------------------------- - -/* makes the font 33% larger relative to the icon container */ -.#{$fa-css-prefix}-lg { - font-size: calc(4em / 3); - line-height: calc(3em / 4); - vertical-align: -15%; -} -.#{$fa-css-prefix}-2x { - font-size: 2em !important; -} -.#{$fa-css-prefix}-3x { - font-size: 3em; -} -.#{$fa-css-prefix}-4x { - font-size: 4em; -} -.#{$fa-css-prefix}-5x { - font-size: 5em; -} diff --git a/public/sass/base/font-awesome/_list.scss b/public/sass/base/font-awesome/_list.scss deleted file mode 100644 index 728bc3fe678..00000000000 --- a/public/sass/base/font-awesome/_list.scss +++ /dev/null @@ -1,21 +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: calc(2em / 14); - text-align: center; - &.#{$fa-css-prefix}-lg { - left: -$fa-li-width + calc(4em / 14); - } -} diff --git a/public/sass/base/font-awesome/_mixins.scss b/public/sass/base/font-awesome/_mixins.scss deleted file mode 100644 index f2a92c1e922..00000000000 --- a/public/sass/base/font-awesome/_mixins.scss +++ /dev/null @@ -1,58 +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/public/sass/base/font-awesome/_path.scss b/public/sass/base/font-awesome/_path.scss deleted file mode 100644 index 5c84b7bb940..00000000000 --- a/public/sass/base/font-awesome/_path.scss +++ /dev/null @@ -1,16 +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/public/sass/base/font-awesome/_rotated-flipped.scss b/public/sass/base/font-awesome/_rotated-flipped.scss deleted file mode 100644 index 07c11a8b299..00000000000 --- a/public/sass/base/font-awesome/_rotated-flipped.scss +++ /dev/null @@ -1,30 +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/public/sass/base/font-awesome/_screen-reader.scss b/public/sass/base/font-awesome/_screen-reader.scss deleted file mode 100644 index e3bff899ed9..00000000000 --- a/public/sass/base/font-awesome/_screen-reader.scss +++ /dev/null @@ -1,9 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { - @include sr-only(); -} -.sr-only-focusable { - @include sr-only-focusable(); -} diff --git a/public/sass/base/font-awesome/_stacked.scss b/public/sass/base/font-awesome/_stacked.scss deleted file mode 100644 index 33fbe76979c..00000000000 --- a/public/sass/base/font-awesome/_stacked.scss +++ /dev/null @@ -1,27 +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/public/sass/base/font-awesome/_variables.scss b/public/sass/base/font-awesome/_variables.scss deleted file mode 100644 index 63f6a72f61a..00000000000 --- a/public/sass/base/font-awesome/_variables.scss +++ /dev/null @@ -1,799 +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: calc(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/scripts/grafana-server/start-server b/scripts/grafana-server/start-server index 75259985cc1..83e74b7508a 100755 --- a/scripts/grafana-server/start-server +++ b/scripts/grafana-server/start-server @@ -31,6 +31,7 @@ mkdir $PROV_DIR mkdir $PROV_DIR/datasources mkdir $PROV_DIR/dashboards mkdir $PROV_DIR/alerting +mkdir $PROV_DIR/plugins cp ./scripts/grafana-server/custom.ini $RUNDIR/conf/custom.ini cp ./conf/defaults.ini $RUNDIR/conf/defaults.ini @@ -51,6 +52,7 @@ echo -e "Copy provisioning setup from devenv" cp devenv/datasources.yaml $PROV_DIR/datasources cp devenv/dashboards.yaml $PROV_DIR/dashboards cp devenv/alert_rules.yaml $PROV_DIR/alerting +cp devenv/plugins.yaml $PROV_DIR/plugins cp -r devenv $RUNDIR diff --git a/yarn.lock b/yarn.lock index 365f011f4a0..25b3244e9e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -134,7 +134,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.24.7": +"@babel/helper-annotate-as-pure@npm:^7.22.5, @babel/helper-annotate-as-pure@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" dependencies: @@ -166,7 +166,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.24.7": +"@babel/helper-create-class-features-plugin@npm:^7.24.5, @babel/helper-create-class-features-plugin@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-create-class-features-plugin@npm:7.24.7" dependencies: @@ -285,7 +285,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.0, @babel/helper-plugin-utils@npm:^7.24.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.24.7 resolution: "@babel/helper-plugin-utils@npm:7.24.7" checksum: 10/dad51622f0123fdba4e2d40a81a6b7d6ef4b1491b2f92fd9749447a36bde809106cf117358705057a2adc8fd73d5dc090222e0561b1213dae8601c8367f5aac8 @@ -361,7 +361,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.24.7": +"@babel/helper-validator-option@npm:^7.23.5, @babel/helper-validator-option@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-validator-option@npm:7.24.7" checksum: 10/9689166bf3f777dd424c026841c8cd651e41b21242dbfd4569a53086179a3e744c8eddd56e9d10b54142270141c91581b53af0d7c00c82d552d2540e2a919f7e @@ -546,14 +546,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-flow@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-flow@npm:7.24.7" +"@babel/plugin-syntax-flow@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-syntax-flow@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0a83bde6736110d68f3b20eda44ca020a6d34c336a342f84369207f5514e17779b9c3d3ebc2f1c94b595c13819f46bf7af367c4b1382bda182e1764655fd6a5a + checksum: 10/87dfe32f3a3ea77941034fb2a39fdfc9ea18a994b8df40c3659a11c8787b2bc5adea029259c4eafc03cd35f11628f6533aa2a06381db7fcbe3b2cc3c2a2bb54f languageName: node linkType: hard @@ -601,7 +601,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.24.7, @babel/plugin-syntax-jsx@npm:^7.7.2": +"@babel/plugin-syntax-jsx@npm:^7.24.1, @babel/plugin-syntax-jsx@npm:^7.24.7, @babel/plugin-syntax-jsx@npm:^7.7.2": version: 7.24.7 resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" dependencies: @@ -700,7 +700,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.24.7, @babel/plugin-syntax-typescript@npm:^7.7.2": +"@babel/plugin-syntax-typescript@npm:^7.24.1, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.24.7 resolution: "@babel/plugin-syntax-typescript@npm:7.24.7" dependencies: @@ -908,15 +908,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-flow-strip-types@npm:7.24.7" +"@babel/plugin-transform-flow-strip-types@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/plugin-transform-flow-strip-types@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-flow": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/plugin-syntax-flow": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/234390eb09f0c1d5a2001c9e48c6440c30f9f188939004e07aa8c0cb946f04793a2e058fa1737b1c56041a7d3ea1510593c39220cc43bba85a017bfcc1c89c4d + checksum: 10/6e1db557d7d34a8dbfdf430557f47c75930a9044b838bb3cc706f9c816e11cd68a61c68239478dd05bbe3ec197113ad0c22c5be1bdddac8723040dd9e9cb9dc0 languageName: node linkType: hard @@ -1003,7 +1003,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.22.5, @babel/plugin-transform-modules-commonjs@npm:^7.23.0, @babel/plugin-transform-modules-commonjs@npm:^7.24.7": +"@babel/plugin-transform-modules-commonjs@npm:^7.22.5, @babel/plugin-transform-modules-commonjs@npm:^7.23.0, @babel/plugin-transform-modules-commonjs@npm:^7.24.1, @babel/plugin-transform-modules-commonjs@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.7" dependencies: @@ -1316,17 +1316,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-typescript@npm:7.24.7" +"@babel/plugin-transform-typescript@npm:^7.24.1": + version: 7.24.5 + resolution: "@babel/plugin-transform-typescript@npm:7.24.5" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-typescript": "npm:^7.24.7" + "@babel/helper-annotate-as-pure": "npm:^7.22.5" + "@babel/helper-create-class-features-plugin": "npm:^7.24.5" + "@babel/helper-plugin-utils": "npm:^7.24.5" + "@babel/plugin-syntax-typescript": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6a4af5a96a90f08ea679829abc558b8478b8b31b40c84b887f2859110b75ab2c8c48a2cf80193621d988a6b064aefef2a74ea3ccc310166219f87959d06a3033 + checksum: 10/3d35accd6d7ae075509e01ce2cc3921ef3b44159b8ec15dd6201050c56dab4cfe14c5c0538e26e3beffb14c33731527041b60444cfba1ceae740f0748caf0aa0 languageName: node linkType: hard @@ -1479,15 +1479,15 @@ __metadata: linkType: hard "@babel/preset-flow@npm:^7.22.15": - version: 7.24.7 - resolution: "@babel/preset-flow@npm:7.24.7" + version: 7.24.1 + resolution: "@babel/preset-flow@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - "@babel/plugin-transform-flow-strip-types": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/plugin-transform-flow-strip-types": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/20fe02b5bc3a9d5b353d164d5ef89841032605434ae351d14309a041d6dc5bd0df3417d0510a6468813392d54793825ba6b04d8c5a5377eee31fc2b55503bf26 + checksum: 10/f1402746050a1c03af9509791bb88e90d1d56a3063374278a80b030c6d1f48a462a822a1a66826d0a631cb5424fc70bf91a25de5f7f31ff519553a3e190a0b7e languageName: node linkType: hard @@ -1521,23 +1521,23 @@ __metadata: linkType: hard "@babel/preset-typescript@npm:^7.23.0": - version: 7.24.7 - resolution: "@babel/preset-typescript@npm:7.24.7" + version: 7.24.1 + resolution: "@babel/preset-typescript@npm:7.24.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - "@babel/plugin-syntax-jsx": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7" - "@babel/plugin-transform-typescript": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.24.0" + "@babel/helper-validator-option": "npm:^7.23.5" + "@babel/plugin-syntax-jsx": "npm:^7.24.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.24.1" + "@babel/plugin-transform-typescript": "npm:^7.24.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/995e9783f8e474581e7533d6b10ec1fbea69528cc939ad8582b5937e13548e5215d25a8e2c845e7b351fdaa13139896b5e42ab3bde83918ea4e41773f10861ac + checksum: 10/ba774bd427c9f376769ddbc2723f5801a6b30113a7c3aaa14c36215508e347a527fdae98cfc294f0ecb283d800ee0c1f74e66e38e84c9bc9ed2fe6ed50dcfaf8 languageName: node linkType: hard "@babel/register@npm:^7.22.15": - version: 7.24.6 - resolution: "@babel/register@npm:7.24.6" + version: 7.23.7 + resolution: "@babel/register@npm:7.23.7" dependencies: clone-deep: "npm:^4.0.1" find-cache-dir: "npm:^2.0.0" @@ -1546,7 +1546,7 @@ __metadata: source-map-support: "npm:^0.5.16" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/94580678ee541218475d605720ea1c3b4a647c504c8a08124373efad24a523f219dd7441de92f09c692c22362ea4422c5f3c51a3b3048b7a64deb1f6daea96b6 + checksum: 10/c72a6d4856ef04f13490370d805854d2d98a77786bfaec7d85e2c585e1217011c4f3df18197a890e14520906c9111bef95551ba1a9b59c88df4dfc2dfe2c8d1b languageName: node linkType: hard @@ -3524,15 +3524,15 @@ __metadata: languageName: unknown linkType: soft -"@grafana/scenes@npm:4.29.0": - version: 4.29.0 - resolution: "@grafana/scenes@npm:4.29.0" +"@grafana/scenes@npm:^5.0.2": + version: 5.0.3 + resolution: "@grafana/scenes@npm:5.0.3" dependencies: "@grafana/e2e-selectors": "npm:^11.0.0" "@leeoniya/ufuzzy": "npm:^1.0.14" react-grid-layout: "npm:1.3.4" - react-use: "npm:17.4.0" - react-virtualized-auto-sizer: "npm:1.0.7" + react-use: "npm:17.5.0" + react-virtualized-auto-sizer: "npm:1.0.24" uuid: "npm:^9.0.0" peerDependencies: "@grafana/data": ^10.4.1 @@ -3541,7 +3541,7 @@ __metadata: "@grafana/ui": ^10.4.1 react: ^18.0.0 react-dom: ^18.0.0 - checksum: 10/5da9b2ae9093f4c3ed012eeea58ce0dc66ddeabb02d2b0d4a87917f17463c857ccab5df23142cfc62323991e714a1a3f4d38d5956cdfe455ce57edcc82fe6893 + checksum: 10/d99e88ba26f6df34fa595656be20cdaee8e9e59a8928e80691bea5cd9646ef6534c9929f38a5fcca1b09891a2609d4ee8e96f898799c5ec73b1993abe09b094a languageName: node linkType: hard @@ -4664,13 +4664,13 @@ __metadata: linkType: hard "@ndelangen/get-tarball@npm:^3.0.7": - version: 3.0.9 - resolution: "@ndelangen/get-tarball@npm:3.0.9" + version: 3.0.7 + resolution: "@ndelangen/get-tarball@npm:3.0.7" dependencies: gunzip-maybe: "npm:^1.4.2" pump: "npm:^3.0.0" tar-fs: "npm:^2.1.1" - checksum: 10/39697cef2b92f6e08e3590467cc6da88cd6757b2a27cb9208879c2316ed71d6be4608892ee0a86eb0343140da1a5df498f93a32c2aaf8f1fbd90f883f08b5f63 + checksum: 10/382689de9d4a8e5e5eca0647c958969b4debd977f7acf398388c4515baf242a13f57f22adb6d02c558f68c4945834c2470982828da7247caaee90a2c9053a396 languageName: node linkType: hard @@ -6605,12 +6605,12 @@ __metadata: linkType: hard "@storybook/addon-webpack5-compiler-swc@npm:^1.0.2": - version: 1.0.3 - resolution: "@storybook/addon-webpack5-compiler-swc@npm:1.0.3" + version: 1.0.2 + resolution: "@storybook/addon-webpack5-compiler-swc@npm:1.0.2" dependencies: - "@swc/core": "npm:1.5.7" + "@swc/core": "npm:^1.3.102" swc-loader: "npm:^0.2.3" - checksum: 10/21d5fbf6021a1cb1c7a0c6b0d5d17a475d4afd29610fa1c43e2b21a015cee4446b9711c991812eca17e5ff78c3e9d402762d93584e5fecf2de303f261fb0db59 + checksum: 10/890b321888b844326b72cdb98b6627dcefe2fa3c0314816dd31b93fbc7a6ec6a3e3db7fb44505bef1155994874f2c47d1d75fd4c22a29a233d110852577ccc62 languageName: node linkType: hard @@ -7515,9 +7515,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core-darwin-arm64@npm:1.5.7" +"@swc/core-darwin-arm64@npm:1.5.5": + version: 1.5.5 + resolution: "@swc/core-darwin-arm64@npm:1.5.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -7529,9 +7529,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core-darwin-x64@npm:1.5.7" +"@swc/core-darwin-x64@npm:1.5.5": + version: 1.5.5 + resolution: "@swc/core-darwin-x64@npm:1.5.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -7543,9 +7543,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.5.7" +"@swc/core-linux-arm-gnueabihf@npm:1.5.5": + version: 1.5.5 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.5.5" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -7557,9 +7557,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core-linux-arm64-gnu@npm:1.5.7" +"@swc/core-linux-arm64-gnu@npm:1.5.5": + version: 1.5.5 + resolution: "@swc/core-linux-arm64-gnu@npm:1.5.5" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard @@ -7571,9 +7571,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core-linux-arm64-musl@npm:1.5.7" +"@swc/core-linux-arm64-musl@npm:1.5.5": + version: 1.5.5 + resolution: "@swc/core-linux-arm64-musl@npm:1.5.5" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard @@ -7585,9 +7585,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core-linux-x64-gnu@npm:1.5.7" +"@swc/core-linux-x64-gnu@npm:1.5.5": + version: 1.5.5 + resolution: "@swc/core-linux-x64-gnu@npm:1.5.5" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard @@ -7599,9 +7599,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core-linux-x64-musl@npm:1.5.7" +"@swc/core-linux-x64-musl@npm:1.5.5": + version: 1.5.5 + resolution: "@swc/core-linux-x64-musl@npm:1.5.5" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard @@ -7613,9 +7613,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core-win32-arm64-msvc@npm:1.5.7" +"@swc/core-win32-arm64-msvc@npm:1.5.5": + version: 1.5.5 + resolution: "@swc/core-win32-arm64-msvc@npm:1.5.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -7627,9 +7627,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core-win32-ia32-msvc@npm:1.5.7" +"@swc/core-win32-ia32-msvc@npm:1.5.5": + version: 1.5.5 + resolution: "@swc/core-win32-ia32-msvc@npm:1.5.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -7641,9 +7641,9 @@ __metadata: languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core-win32-x64-msvc@npm:1.5.7" +"@swc/core-win32-x64-msvc@npm:1.5.5": + version: 1.5.5 + resolution: "@swc/core-win32-x64-msvc@npm:1.5.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -7694,22 +7694,22 @@ __metadata: languageName: node linkType: hard -"@swc/core@npm:1.5.7": - version: 1.5.7 - resolution: "@swc/core@npm:1.5.7" +"@swc/core@npm:^1.3.102": + version: 1.5.5 + resolution: "@swc/core@npm:1.5.5" dependencies: - "@swc/core-darwin-arm64": "npm:1.5.7" - "@swc/core-darwin-x64": "npm:1.5.7" - "@swc/core-linux-arm-gnueabihf": "npm:1.5.7" - "@swc/core-linux-arm64-gnu": "npm:1.5.7" - "@swc/core-linux-arm64-musl": "npm:1.5.7" - "@swc/core-linux-x64-gnu": "npm:1.5.7" - "@swc/core-linux-x64-musl": "npm:1.5.7" - "@swc/core-win32-arm64-msvc": "npm:1.5.7" - "@swc/core-win32-ia32-msvc": "npm:1.5.7" - "@swc/core-win32-x64-msvc": "npm:1.5.7" + "@swc/core-darwin-arm64": "npm:1.5.5" + "@swc/core-darwin-x64": "npm:1.5.5" + "@swc/core-linux-arm-gnueabihf": "npm:1.5.5" + "@swc/core-linux-arm64-gnu": "npm:1.5.5" + "@swc/core-linux-arm64-musl": "npm:1.5.5" + "@swc/core-linux-x64-gnu": "npm:1.5.5" + "@swc/core-linux-x64-musl": "npm:1.5.5" + "@swc/core-win32-arm64-msvc": "npm:1.5.5" + "@swc/core-win32-ia32-msvc": "npm:1.5.5" + "@swc/core-win32-x64-msvc": "npm:1.5.5" "@swc/counter": "npm:^0.1.2" - "@swc/types": "npm:0.1.7" + "@swc/types": "npm:^0.1.5" peerDependencies: "@swc/helpers": ^0.5.0 dependenciesMeta: @@ -7736,7 +7736,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/83e03908db40f2133c3624a83d4550336d7a56e64af7d42fd959c746b8da950a253f3c6d9eaa3467e10abeda024aa6b039a987adc839326f969e1d26625f14ef + checksum: 10/31e6dc50eeb549d1e52f21e1c5ae63b714bf4488c70cc4106264de378048ca35c0264c640590fbbb760c0cbe7f2c91291ef20e6af5c46dc31b5da88e8b946f0c languageName: node linkType: hard @@ -7756,12 +7756,10 @@ __metadata: languageName: node linkType: hard -"@swc/types@npm:0.1.7, @swc/types@npm:^0.1.5": - version: 0.1.7 - resolution: "@swc/types@npm:0.1.7" - dependencies: - "@swc/counter": "npm:^0.1.3" - checksum: 10/ed66c26b36972a74f852c1781fadc75946578abfeeea58f110684833b5d1e70f28a77ddb82fd5bf3cf3c4dad0e1b6a1c924d7e2cc7a99f9b16ed16fe266bba25 +"@swc/types@npm:^0.1.5": + version: 0.1.5 + resolution: "@swc/types@npm:0.1.5" + checksum: 10/5f4de8c60d2623bed607c7fa1e0cee4ffc682af28d5ffe88dc9ed9903a1c2088ccc39f684689d6bb314595c9fbb560beaec773d633be515fb856ffc81d738822 languageName: node linkType: hard @@ -7942,6 +7940,13 @@ __metadata: languageName: node linkType: hard +"@types/add@npm:^2": + version: 2.0.3 + resolution: "@types/add@npm:2.0.3" + checksum: 10/c15815ef0e4903113f7fda84b4c2704a1b694fd6f53a6e3c9327b5b7067aba676c75e696b950401de45be7646b37b7059303a7bb5c4363de3eb3e0c06d25f565 + languageName: node + linkType: hard + "@types/angular-route@npm:1.7.6": version: 1.7.6 resolution: "@types/angular-route@npm:1.7.6" @@ -8073,11 +8078,11 @@ __metadata: linkType: hard "@types/cross-spawn@npm:^6.0.2": - version: 6.0.6 - resolution: "@types/cross-spawn@npm:6.0.6" + version: 6.0.3 + resolution: "@types/cross-spawn@npm:6.0.3" dependencies: "@types/node": "npm:*" - checksum: 10/b4172927cd1387cf037c3ade785ef46c87537b7bc2803d7f6663b4904d0c5d6f726415d1adb2fee4fecb21746738f11336076449265d46be4ce110cc3a8c8436 + checksum: 10/06d50fa1e1370ef60b9c9085b76adec7d7bc20728fbb02b3c2061d4d922312acf1ba56a7c94d88c27a22fc6241ab6b970c936f3294038a9c97a719fbc8eb8a76 languageName: node linkType: hard @@ -8402,9 +8407,9 @@ __metadata: linkType: hard "@types/detect-port@npm:^1.3.0": - version: 1.3.5 - resolution: "@types/detect-port@npm:1.3.5" - checksum: 10/923cf04c6a05af59090743baeb9948f1938ceb98c1f7ea93db7ac310210426b385aa00005d23039ebb8019a9d13e141f5246e9c733b290885018d722a4787921 + version: 1.3.2 + resolution: "@types/detect-port@npm:1.3.2" + checksum: 10/e4678244fbe8801014798b3efb967c886e6fc0fe94fb771a1be9558b35c68910b23bd30984df4a276b927820ce436b244506fb0972116d1b18506ac96bfd1a50 languageName: node linkType: hard @@ -8439,9 +8444,9 @@ __metadata: linkType: hard "@types/ejs@npm:^3.1.1": - version: 3.1.5 - resolution: "@types/ejs@npm:3.1.5" - checksum: 10/918898fd279108087722c1713e2ddb0c152ab839397946d164db8a18b5bbd732af9746373882a9bcf4843d35c6b191a8f569a7a4e51e90726d24501b39f40367 + version: 3.1.2 + resolution: "@types/ejs@npm:3.1.2" + checksum: 10/8be94c952dc06525a5fb229a469db66f2240425ce137a1f5108a6a11f500cac9190691e924e6d18df34c5c2be40ef36b537921d2833262467ee1dfb7a7c919ac languageName: node linkType: hard @@ -8768,18 +8773,18 @@ __metadata: linkType: hard "@types/mdast@npm:^4.0.0": - version: 4.0.4 - resolution: "@types/mdast@npm:4.0.4" + version: 4.0.3 + resolution: "@types/mdast@npm:4.0.3" dependencies: "@types/unist": "npm:*" - checksum: 10/efe3ec11b9ee0015a396c4fb4cd1b6f31b51b8ae9783c59560e6fc0bf6c2fa1dcc7fccaf45fa09a6c8b3397fab9dc8d431433935cae3835caa70a18f7fc775f8 + checksum: 10/6d2d8f00ffaff6663dd67ea9ab999a5e52066c001432a9b99947fa9e76bccba819dfca40e419588a637a70d42cd405071f5b76efd4ddeb1dc721353b7cc73623 languageName: node linkType: hard "@types/mdx@npm:^2.0.0": - version: 2.0.13 - resolution: "@types/mdx@npm:2.0.13" - checksum: 10/b73ed5f08114879b9590dc6a9ee8b648643c57c708583cd24b2bc3cc8961361fc63139ac7e9291e7b3b6e6b45707749d01d6f9727ddec5533df75dc3b90871a4 + version: 2.0.4 + resolution: "@types/mdx@npm:2.0.4" + checksum: 10/79e011ea17751741f69fa0a8bada8c596ca273c5510d4b37e8fa0dd8b5f93c6b8eb4a351da426454df7b4ddbaa8dfc3aae88562417300b968cc8964afac3a6ca languageName: node linkType: hard @@ -8908,9 +8913,9 @@ __metadata: linkType: hard "@types/pretty-hrtime@npm:^1.0.0": - version: 1.0.3 - resolution: "@types/pretty-hrtime@npm:1.0.3" - checksum: 10/288061dff992c8107d5c7b5a1277bbb0a314a27eb10087dea628a08fa37694a655191a69e25a212c95e61e498363c48ad9e281d23964a448f6c14100a6be0910 + version: 1.0.1 + resolution: "@types/pretty-hrtime@npm:1.0.1" + checksum: 10/a6cdee417eea6f7af914e4fcd13e05822864ce10b5d7646525632e86d69b79123eec55a5d3fff0155ba46b61902775e1644bcb80e1e4dffdac28e7febb089083 languageName: node linkType: hard @@ -10205,7 +10210,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.11.3, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.10.0, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -10238,9 +10243,9 @@ __metadata: linkType: hard "address@npm:^1.0.1": - version: 1.2.2 - resolution: "address@npm:1.2.2" - checksum: 10/57d80a0c6ccadc8769ad3aeb130c1599e8aee86a8d25f671216c40df9b8489d6c3ef879bc2752b40d1458aa768f947c2d91e5b2fedfe63cf702c40afdfda9ba9 + version: 1.1.2 + resolution: "address@npm:1.1.2" + checksum: 10/be4c16c4874a347c8f6dec28b5b5c891f7c3ca2234bdd734b6e4b0f28310b07a9ae8359937a8d92a4ae682019d375d70de920203d9acc839167674e3a525970a languageName: node linkType: hard @@ -11250,9 +11255,9 @@ __metadata: linkType: hard "big-integer@npm:^1.6.44": - version: 1.6.52 - resolution: "big-integer@npm:1.6.52" - checksum: 10/4bc6ae152a96edc9f95020f5fc66b13d26a9ad9a021225a9f0213f7e3dc44269f423aa8c42e19d6ac4a63bb2b22140b95d10be8f9ca7a6d9aa1b22b330d1f514 + version: 1.6.51 + resolution: "big-integer@npm:1.6.51" + checksum: 10/c7a12640901906d6f6b6bdb42a4eaba9578397b6d9a0dd090cf001ec813ff2bfcd441e364068ea0416db6175d2615f8ed19cff7d1a795115bf7c92d44993f991 languageName: node linkType: hard @@ -11992,15 +11997,6 @@ __metadata: languageName: node linkType: hard -"citty@npm:^0.1.6": - version: 0.1.6 - resolution: "citty@npm:0.1.6" - dependencies: - consola: "npm:^3.2.3" - checksum: 10/3208947e73abb699a12578ee2bfee254bf8dd1ce0d5698e8a298411cabf16bd3620d63433aef5bd88cdb2b9da71aef18adefa3b4ffd18273bb62dd1d28c344f5 - languageName: node - linkType: hard - "cjs-module-lexer@npm:^1.0.0, cjs-module-lexer@npm:^1.2.3": version: 1.3.1 resolution: "cjs-module-lexer@npm:1.3.1" @@ -12055,15 +12051,15 @@ __metadata: linkType: hard "cli-table3@npm:^0.6.1, cli-table3@npm:~0.6.1": - version: 0.6.5 - resolution: "cli-table3@npm:0.6.5" + version: 0.6.3 + resolution: "cli-table3@npm:0.6.3" dependencies: "@colors/colors": "npm:1.5.0" string-width: "npm:^4.2.0" dependenciesMeta: "@colors/colors": optional: true - checksum: 10/8dca71256f6f1367bab84c33add3f957367c7c43750a9828a4212ebd31b8df76bd7419d386e3391ac7419698a8540c25f1a474584028f35b170841cde2e055c5 + checksum: 10/8d82b75be7edc7febb1283dc49582a521536527cba80af62a2e4522a0ee39c252886a1a2f02d05ae9d753204dbcffeb3a40d1358ee10dccd7fe8d935cfad3f85 languageName: node linkType: hard @@ -12268,7 +12264,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.10, colorette@npm:^2.0.14, colorette@npm:^2.0.16": +"colorette@npm:^2.0.10, colorette@npm:^2.0.14, colorette@npm:^2.0.16, colorette@npm:^2.0.19": version: 2.0.20 resolution: "colorette@npm:2.0.20" checksum: 10/0b8de48bfa5d10afc160b8eaa2b9938f34a892530b2f7d7897e0458d9535a066e3998b49da9d21161c78225b272df19ae3a64d6df28b4c9734c0e55bbd02406f @@ -14005,10 +14001,10 @@ __metadata: languageName: node linkType: hard -"defu@npm:^6.1.4": - version: 6.1.4 - resolution: "defu@npm:6.1.4" - checksum: 10/aeffdb47300f45b4fdef1c5bd3880ac18ea7a1fd5b8a8faf8df29350ff03bf16dd34f9800205cab513d476e4c0a3783aa0cff0a433aff0ac84a67ddc4c8a2d64 +"defu@npm:^6.1.2": + version: 6.1.2 + resolution: "defu@npm:6.1.2" + checksum: 10/5704aa6ea0b503004ee25b2ce909af8e6dc7c472d2d41e293f5a879534a0a7827a37e6692e0ca0c6e8d3ef6b00651d50089be681c814832cbed98f0f206ef25b languageName: node linkType: hard @@ -14115,15 +14111,15 @@ __metadata: linkType: hard "detect-port@npm:^1.3.0": - version: 1.6.1 - resolution: "detect-port@npm:1.6.1" + version: 1.5.1 + resolution: "detect-port@npm:1.5.1" dependencies: address: "npm:^1.0.1" debug: "npm:4" bin: detect: bin/detect-port.js detect-port: bin/detect-port.js - checksum: 10/0429fa423abb15fc453face64e6ffa406e375f51f5b4421a7886962e680dc05824eae9b6ee4594ba273685c3add415ad00982b5da54802ac3de6f846173284c3 + checksum: 10/b48da9340481742547263d5d985e65d078592557863402ecf538511735e83575867e94f91fe74405ea19b61351feb99efccae7e55de9a151d5654e3417cea05b languageName: node linkType: hard @@ -15556,23 +15552,6 @@ __metadata: languageName: node linkType: hard -"execa@npm:^8.0.1": - version: 8.0.1 - resolution: "execa@npm:8.0.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^8.0.1" - human-signals: "npm:^5.0.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^4.1.0" - strip-final-newline: "npm:^3.0.0" - checksum: 10/d2ab5fe1e2bb92b9788864d0713f1fce9a07c4594e272c0c97bc18c90569897ab262e4ea58d27a694d288227a2e24f16f5e2575b44224ad9983b799dc7f1098d - languageName: node - linkType: hard - "executable@npm:^4.1.1": version: 4.1.1 resolution: "executable@npm:4.1.1" @@ -15868,9 +15847,9 @@ __metadata: linkType: hard "fetch-retry@npm:^5.0.2": - version: 5.0.6 - resolution: "fetch-retry@npm:5.0.6" - checksum: 10/9d64b37f9d179fecf486725ada210d169375803b731304a9500754e094a2a6aa81630d946adbb313d7f9d54457ad0d17c3ed5c115034961a719e8a65faa8b77c + version: 5.0.4 + resolution: "fetch-retry@npm:5.0.4" + checksum: 10/1c9fd7046b5b525e18cabdc34693887f0c410a8564eebf09bb8d8625d33bec4a9fa7f39660076ef99e36a77f152b233d26742be4b3b04583f41640c063152914 languageName: node linkType: hard @@ -16126,9 +16105,9 @@ __metadata: linkType: hard "flow-parser@npm:0.*": - version: 0.237.2 - resolution: "flow-parser@npm:0.237.2" - checksum: 10/8be3dd71f6838b812b6030e3a31d93b873564ab1deb0ebf060c346f5887d478510ee6c0c758ecd9ef288068c91e66f0d83fd30ae5ead674e3ea150c5589aa049 + version: 0.203.1 + resolution: "flow-parser@npm:0.203.1" + checksum: 10/7e00c89a13500b53b30e0013269f4f5e04a6a03e5f99bc91bb6fe0311fbecce1094b56c05cab35fb767bfb408af262e02e7ad1fbc47161d1709d1204bbb00fee languageName: node linkType: hard @@ -16555,9 +16534,9 @@ __metadata: linkType: hard "get-npm-tarball-url@npm:^2.0.3": - version: 2.1.0 - resolution: "get-npm-tarball-url@npm:2.1.0" - checksum: 10/02b96993ad5a04cbd0ef0577ac3cc9e2e78a7c60db6bb5e6c8fe78950fc1fc3d093314987629a2fda3083228d91a93670bde321767ca2cf89ce7f463c9e44071 + version: 2.0.3 + resolution: "get-npm-tarball-url@npm:2.0.3" + checksum: 10/8ad48a6f1126697665e12ebf053e0d1c3b15b3c4f29ea6c458387ac68d044ea1c08f0f2eb5c0fe35447fdd2da4f2fb5c9882feb5a2ea195c773f94e762c9b886 languageName: node linkType: hard @@ -16612,13 +16591,6 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^8.0.1": - version: 8.0.1 - resolution: "get-stream@npm:8.0.1" - checksum: 10/dde5511e2e65a48e9af80fea64aff11b4921b14b6e874c6f8294c50975095af08f41bfb0b680c887f28b566dd6ec2cb2f960f9d36a323359be324ce98b766e9e - languageName: node - linkType: hard - "get-symbol-description@npm:^1.0.2": version: 1.0.2 resolution: "get-symbol-description@npm:1.0.2" @@ -16677,20 +16649,19 @@ __metadata: linkType: hard "giget@npm:^1.0.0": - version: 1.2.3 - resolution: "giget@npm:1.2.3" + version: 1.1.2 + resolution: "giget@npm:1.1.2" dependencies: - citty: "npm:^0.1.6" - consola: "npm:^3.2.3" - defu: "npm:^6.1.4" - node-fetch-native: "npm:^1.6.3" - nypm: "npm:^0.3.8" - ohash: "npm:^1.1.3" - pathe: "npm:^1.1.2" - tar: "npm:^6.2.0" + colorette: "npm:^2.0.19" + defu: "npm:^6.1.2" + https-proxy-agent: "npm:^5.0.1" + mri: "npm:^1.2.0" + node-fetch-native: "npm:^1.0.2" + pathe: "npm:^1.1.0" + tar: "npm:^6.1.13" bin: giget: dist/cli.mjs - checksum: 10/85bdcf380566fc9c4299f029acbe78a706f1825912c6cea39b675d08064399988f5de30d17238246f725183ac7504e7b9d3000c417f1df7ebb52ab26c7d3ab8c + checksum: 10/f5080b18437fcd4cb92eb8bc90f69f57008460416c5a919a5d50e94889c0a5bfec641f203bd32f91b3de3058c8be48f23ab4b4f2d29f785dcb311b5f10c51bf4 languageName: node linkType: hard @@ -17015,7 +16986,7 @@ __metadata: "@grafana/prometheus": "workspace:*" "@grafana/runtime": "workspace:*" "@grafana/saga-icons": "workspace:*" - "@grafana/scenes": "npm:4.29.0" + "@grafana/scenes": "npm:^5.0.2" "@grafana/schema": "workspace:*" "@grafana/sql": "workspace:*" "@grafana/tsconfig": "npm:^1.3.0-rc1" @@ -17057,6 +17028,7 @@ __metadata: "@testing-library/react": "npm:15.0.2" "@testing-library/react-hooks": "npm:^8.0.1" "@testing-library/user-event": "npm:14.5.2" + "@types/add": "npm:^2" "@types/angular": "npm:1.8.9" "@types/angular-route": "npm:1.7.6" "@types/babel__core": "npm:^7" @@ -17314,6 +17286,7 @@ __metadata: xlsx: "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz" yaml: "npm:^2.0.0" yargs: "npm:^17.5.1" + yarn: "npm:^1.22.22" dependenciesMeta: prettier@3.3.1: unplugged: true @@ -17989,13 +17962,6 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^5.0.0": - version: 5.0.0 - resolution: "human-signals@npm:5.0.0" - checksum: 10/30f8870d831cdcd2d6ec0486a7d35d49384996742052cee792854273fa9dd9e7d5db06bb7985d4953e337e10714e994e0302e90dc6848069171b05ec836d65b0 - languageName: node - linkType: hard - "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -20982,8 +20948,8 @@ __metadata: linkType: hard "mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-from-markdown@npm:2.0.1" + version: 2.0.0 + resolution: "mdast-util-from-markdown@npm:2.0.0" dependencies: "@types/mdast": "npm:^4.0.0" "@types/unist": "npm:^3.0.0" @@ -20997,7 +20963,7 @@ __metadata: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" unist-util-stringify-position: "npm:^4.0.0" - checksum: 10/4172759cdd8cf9990701796c5617c8b6a4bd3f9863e730bb4e9689189daec80af3122e77eed2ab09090f1a2d396c4f5754416a41769d7c49efd165a1c0a033c8 + checksum: 10/960e28a8ff3d989cc25a615d14e9a1d95d145b938dc08323ce44689be6dd052ece544d2acf5242cedb8ad6ccdc3ffe854989b7c2516c6e62f2fca42b6d11a2da languageName: node linkType: hard @@ -21621,13 +21587,6 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 10/995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 - languageName: node - linkType: hard - "min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -22045,6 +22004,13 @@ __metadata: languageName: node linkType: hard +"mri@npm:^1.2.0": + version: 1.2.0 + resolution: "mri@npm:1.2.0" + checksum: 10/6775a1d2228bb9d191ead4efc220bd6be64f943ad3afd4dcb3b3ac8fc7b87034443f666e38805df38e8d047b29f910c3cc7810da0109af83e42c82c73bd3f6bc + languageName: node + linkType: hard + "mrmime@npm:^2.0.0": version: 2.0.0 resolution: "mrmime@npm:2.0.0" @@ -22151,7 +22117,7 @@ __metadata: languageName: node linkType: hard -"nano-css@npm:^5.3.1, nano-css@npm:^5.6.1": +"nano-css@npm:^5.6.1": version: 5.6.1 resolution: "nano-css@npm:5.6.1" dependencies: @@ -22254,10 +22220,10 @@ __metadata: languageName: node linkType: hard -"node-fetch-native@npm:^1.6.3": - version: 1.6.4 - resolution: "node-fetch-native@npm:1.6.4" - checksum: 10/39c4c6d0c2a4bed1444943e1647ad0d79eb6638cf159bc37dffeafd22cffcf6a998e006aa1f3dd1d9d2258db7d78dee96b44bee4ba0bbaf0440ed348794f2543 +"node-fetch-native@npm:^1.0.2": + version: 1.0.2 + resolution: "node-fetch-native@npm:1.0.2" + checksum: 10/50bf4732d8c1115f626b663d7ce066a8ef7b22786813c45e38fde1594cdc2f61a3e1f3b457d1c5a576ac5beb9369912b671002ba273493841a33b8a57b553e81 languageName: node linkType: hard @@ -22624,15 +22590,6 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^5.1.0": - version: 5.3.0 - resolution: "npm-run-path@npm:5.3.0" - dependencies: - path-key: "npm:^4.0.0" - checksum: 10/ae8e7a89da9594fb9c308f6555c73f618152340dcaae423e5fb3620026fefbec463618a8b761920382d666fa7a2d8d240b6fe320e8a6cdd54dc3687e2b659d25 - languageName: node - linkType: hard - "npmlog@npm:^4.1.2": version: 4.1.2 resolution: "npmlog@npm:4.1.2" @@ -22764,21 +22721,6 @@ __metadata: languageName: node linkType: hard -"nypm@npm:^0.3.8": - version: 0.3.8 - resolution: "nypm@npm:0.3.8" - dependencies: - citty: "npm:^0.1.6" - consola: "npm:^3.2.3" - execa: "npm:^8.0.1" - pathe: "npm:^1.1.2" - ufo: "npm:^1.4.0" - bin: - nypm: dist/cli.mjs - checksum: 10/fc3fcf4f2c9837d09c1b9b976c205e1538a9378b5ac40ea0d3bac0bcaeb554d0a8d17e4b42c1b8b6079fb6bf760f0d94b576084c032f862433a915739a54e327 - languageName: node - linkType: hard - "oas-kit-common@npm:^1.0.8": version: 1.0.8 resolution: "oas-kit-common@npm:1.0.8" @@ -22996,13 +22938,6 @@ __metadata: languageName: node linkType: hard -"ohash@npm:^1.1.3": - version: 1.1.3 - resolution: "ohash@npm:1.1.3" - checksum: 10/80a3528285f61588600c8c4f091a67f55fbc141f4eec4b3c30182468053042eef5a9684780e963f98a71ec068f3de56d42920c6417bf8f79ab14aeb75ac0bb39 - languageName: node - linkType: hard - "ol-ext@npm:4.0.18": version: 4.0.18 resolution: "ol-ext@npm:4.0.18" @@ -23070,15 +23005,6 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: "npm:^4.0.0" - checksum: 10/0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 - languageName: node - linkType: hard - "open@npm:^10.0.3": version: 10.0.3 resolution: "open@npm:10.0.3" @@ -23568,13 +23494,6 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 10/8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 - languageName: node - linkType: hard - "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -23645,10 +23564,10 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.2": - version: 1.1.2 - resolution: "pathe@npm:1.1.2" - checksum: 10/f201d796351bf7433d147b92c20eb154a4e0ea83512017bf4ec4e492a5d6e738fb45798be4259a61aa81270179fce11026f6ff0d3fa04173041de044defe9d80 +"pathe@npm:^1.1.0": + version: 1.1.0 + resolution: "pathe@npm:1.1.0" + checksum: 10/7cd4e00d9991a2454cccc575fd0ebdd0fe0caf257e5a6690af542d41c63e4d7033e580677395c54e0e4addbd9e297c0ef4e5de02906decc93b48c1a58a1acb0c languageName: node linkType: hard @@ -23820,11 +23739,11 @@ __metadata: linkType: hard "polished@npm:^4.2.2": - version: 4.3.1 - resolution: "polished@npm:4.3.1" + version: 4.2.2 + resolution: "polished@npm:4.2.2" dependencies: "@babel/runtime": "npm:^7.17.8" - checksum: 10/0902fe2eb16aecde1587a00efee7db8081b1331ac7bcfb6e61214d266388723a84858d732ad9395028e0aecd2bb8d0c39cc03d14b4c24c22329a0e40c38141eb + checksum: 10/da71b15c1e1d98b7f55e143bbf9ebb1b0934286c74c333522e571e52f89e42a61d7d44c5b4f941dc927355c7ae09780877aeb8f23707376fa9f006ab861e758b languageName: node linkType: hard @@ -25786,31 +25705,6 @@ __metadata: languageName: node linkType: hard -"react-use@npm:17.4.0": - version: 17.4.0 - resolution: "react-use@npm:17.4.0" - dependencies: - "@types/js-cookie": "npm:^2.2.6" - "@xobotyi/scrollbar-width": "npm:^1.9.5" - copy-to-clipboard: "npm:^3.3.1" - fast-deep-equal: "npm:^3.1.3" - fast-shallow-equal: "npm:^1.0.0" - js-cookie: "npm:^2.2.1" - nano-css: "npm:^5.3.1" - react-universal-interface: "npm:^0.6.2" - resize-observer-polyfill: "npm:^1.5.1" - screenfull: "npm:^5.1.0" - set-harmonic-interval: "npm:^1.0.1" - throttle-debounce: "npm:^3.0.1" - ts-easing: "npm:^0.2.0" - tslib: "npm:^2.1.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10/98566c4817b00251107824743ea9dff41f167b548bd5f249f6eb9e2ec09388a2de1e89988e4432cead3f8aa83cf706e0255db8a20c0615768c670751973d2761 - languageName: node - linkType: hard - "react-use@npm:17.5.0, react-use@npm:^17.4.2": version: 17.5.0 resolution: "react-use@npm:17.5.0" @@ -25857,16 +25751,6 @@ __metadata: languageName: node linkType: hard -"react-virtualized-auto-sizer@npm:1.0.7": - version: 1.0.7 - resolution: "react-virtualized-auto-sizer@npm:1.0.7" - peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - checksum: 10/a16d8ac11a0efa20d44f36a5cf3854027895b806363a409f2ddc07ff92bfc92aaf5b8eee21f3e1b153cee2273db5e5383b6334d4b530d934ed08808ecfb45b9f - languageName: node - linkType: hard - "react-window-infinite-loader@npm:1.0.9": version: 1.0.9 resolution: "react-window-infinite-loader@npm:1.0.9" @@ -26069,15 +25953,15 @@ __metadata: linkType: hard "recast@npm:^0.23.3, recast@npm:^0.23.5": - version: 0.23.9 - resolution: "recast@npm:0.23.9" + version: 0.23.7 + resolution: "recast@npm:0.23.7" dependencies: ast-types: "npm:^0.16.1" esprima: "npm:~4.0.0" source-map: "npm:~0.6.1" tiny-invariant: "npm:^1.3.3" tslib: "npm:^2.0.1" - checksum: 10/d60584be179d81a82fbe58b5bbe009aa42831ee114a21a3e3a22bda91334e0b8a1a4610dca8ecb7f9ea1426da4febc08134d3003085ad6ecee478d1808eb8796 + checksum: 10/f9f6436a8c7d2dcdaab81314a79094ad7079838988e008af8a07bf05f7aca5c13d2830f4f5b076c58633b6857260fa9f744fd24be8934de6bb8bee3961b7bd3c languageName: node linkType: hard @@ -28015,9 +27899,9 @@ __metadata: linkType: hard "stream-shift@npm:^1.0.0": - version: 1.0.3 - resolution: "stream-shift@npm:1.0.3" - checksum: 10/a24c0a3f66a8f9024bd1d579a533a53be283b4475d4e6b4b3211b964031447bdf6532dd1f3c2b0ad66752554391b7c62bd7ca4559193381f766534e723d50242 + version: 1.0.1 + resolution: "stream-shift@npm:1.0.1" + checksum: 10/59b82b44b29ec3699b5519a49b3cedcc6db58c72fb40c04e005525dfdcab1c75c4e0c180b923c380f204bed78211b9bad8faecc7b93dece4d004c3f6ec75737b languageName: node linkType: hard @@ -28225,13 +28109,6 @@ __metadata: languageName: node linkType: hard -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 10/23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 - languageName: node - linkType: hard - "strip-indent@npm:^3.0.0": version: 3.0.0 resolution: "strip-indent@npm:3.0.0" @@ -28609,7 +28486,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:6.2.1, tar@npm:^6.0.2, tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.0": +"tar@npm:6.2.1, tar@npm:^6.0.2, tar@npm:^6.1.11, tar@npm:^6.1.13, tar@npm:^6.1.2": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -28936,9 +28813,9 @@ __metadata: linkType: hard "tocbot@npm:^4.20.1": - version: 4.28.2 - resolution: "tocbot@npm:4.28.2" - checksum: 10/8b403d9c87b9a15d816f44ad6350325db4cc573e1dc0a50fa7921531225e83464909897589e109ad5922b60b276ac9bcea7eeae3ea774df5080ceda65eca3425 + version: 4.21.1 + resolution: "tocbot@npm:4.21.1" + checksum: 10/96ea72a9a36719595aebbfc79c6976c7f0e9a83ee8dfa2f0ce9f0a5ad744ee9a913d1d68d1e1c896e49ee771c21fe2c13b3275c26e545d100214178f0b110a49 languageName: node linkType: hard @@ -29336,9 +29213,9 @@ __metadata: linkType: hard "type-fest@npm:^4.18.2, type-fest@npm:^4.9.0": - version: 4.19.0 - resolution: "type-fest@npm:4.19.0" - checksum: 10/746294c1f463913425a4b40e9160ed1ea5cd1f877587789cbd42e01c6b67be9c55daf75e0d4787da584b98a09487df69e89b44c934d497e5d035800e115dc1e9 + version: 4.18.3 + resolution: "type-fest@npm:4.18.3" + checksum: 10/eb750920d0ef3639177f581edd6489d972c5c5827abb602a9c9662889aad148a7d558257e36c563f1beb81a2e417faec52ecec9799b28531d8335856f91e6dff languageName: node linkType: hard @@ -29492,13 +29369,6 @@ __metadata: languageName: node linkType: hard -"ufo@npm:^1.4.0": - version: 1.5.3 - resolution: "ufo@npm:1.5.3" - checksum: 10/2b30dddd873c643efecdb58cfe457183cd4d95937ccdacca6942c697b87a2c578232c25a5149fda85436696bf0fdbc213bf2b220874712bc3e58c0fb00a2c950 - languageName: node - linkType: hard - "uglify-js@npm:^3.1.4": version: 3.17.4 resolution: "uglify-js@npm:3.17.4" @@ -29728,14 +29598,14 @@ __metadata: linkType: hard "unplugin@npm:^1.3.1": - version: 1.10.1 - resolution: "unplugin@npm:1.10.1" + version: 1.5.0 + resolution: "unplugin@npm:1.5.0" dependencies: - acorn: "npm:^8.11.3" - chokidar: "npm:^3.6.0" + acorn: "npm:^8.10.0" + chokidar: "npm:^3.5.3" webpack-sources: "npm:^3.2.3" - webpack-virtual-modules: "npm:^0.6.1" - checksum: 10/d9819fad8a177c080f7f2b80744d633101935a8a6cc26b42e6a46648cccc1c5de83b7763233d56e11af53f34e6c5074816262897c9048a31e5d697bef5bb57e7 + webpack-virtual-modules: "npm:^0.5.0" + checksum: 10/4a867f2630b932c34983a4b7c741624789752677ea1a6e3e73ca68a716e7214d50d7855fb4d0e02b4a58f81aaee2def021d54365929be03a57c4b25911ae89c1 languageName: node linkType: hard @@ -30460,13 +30330,6 @@ __metadata: languageName: node linkType: hard -"webpack-virtual-modules@npm:^0.6.1": - version: 0.6.2 - resolution: "webpack-virtual-modules@npm:0.6.2" - checksum: 10/d9a0d035f7ec0c7f1055aaf88bfe48b7f96458043916a1b2926d9012fd61de3810a6b768e31a8cd4b3c84a9b6d55824361a9dd20aaf9f5ccfb6f017af216a178 - languageName: node - linkType: hard - "webpack@npm:5, webpack@npm:5.91.0, webpack@npm:^5": version: 5.91.0 resolution: "webpack@npm:5.91.0" @@ -30809,8 +30672,8 @@ __metadata: linkType: hard "ws@npm:^8.16.0, ws@npm:^8.2.3, ws@npm:^8.9.0": - version: 8.17.0 - resolution: "ws@npm:8.17.0" + version: 8.16.0 + resolution: "ws@npm:8.16.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -30819,7 +30682,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/5e1dcb0ae70c6e2f158f5b446e0a72a2cd335b07aba73ee1872e9bae1285382286a10e53ed479db21bdd690a5dfd05641a768611ebb236253c62fefa43ef58b4 + checksum: 10/7c511c59e979bd37b63c3aea4a8e4d4163204f00bd5633c053b05ed67835481995f61a523b0ad2b603566f9a89b34cb4965cb9fab9649fbfebd8f740cea57f17 languageName: node linkType: hard @@ -30969,6 +30832,16 @@ __metadata: languageName: node linkType: hard +"yarn@npm:^1.22.22": + version: 1.22.22 + resolution: "yarn@npm:1.22.22" + bin: + yarn: bin/yarn.js + yarnpkg: bin/yarn.js + checksum: 10/98d80230beaa81f186b2256dff5ef9dce2dd6073c94299209f8e562da9018cff4275c95c27c788aaa4a9c3c186ea8a9aee9a5b83570696a4c8a9d1fff2d4da3a + languageName: node + linkType: hard + "yauzl@npm:^2.10.0": version: 2.10.0 resolution: "yauzl@npm:2.10.0"