├── test ├── index.js ├── .eslintrc └── add-to-calendar_test.js ├── .gitignore ├── docs-site ├── images │ └── ribbon.png ├── src │ ├── breakpoint.scss │ ├── boot.jsx │ ├── hero_example.jsx │ ├── code_example_component.jsx │ ├── hero.scss │ ├── examples │ │ ├── changeLabel.jsx │ │ ├── textOnlyDropdown.jsx │ │ ├── textOnlyTemplate.jsx │ │ ├── removeDropdownItem.jsx │ │ ├── changeTemplate.jsx │ │ ├── default.jsx │ │ ├── changeDropdownLabels.jsx │ │ └── changeDropdownOrder.jsx │ ├── reset.scss │ ├── examples.scss │ ├── style.scss │ ├── higlight.scss │ ├── example_components.jsx │ └── root.jsx ├── publish.sh └── index.html ├── src ├── styles │ ├── font-awesome │ │ ├── _fixed-width.scss │ │ ├── _screen-reader.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _core.scss │ │ ├── font-awesome.scss │ │ ├── _stacked.scss │ │ ├── _bordered-pulled.scss │ │ ├── _rotated-flipped.scss │ │ ├── _path.scss │ │ ├── _animated.scss │ │ ├── _mixins.scss │ │ ├── _variables.scss │ │ └── _icons.scss │ └── ReactAddToCalendar.scss ├── helpers │ └── index.js └── ReactAddToCalendar.js ├── .editorconfig ├── .babelrc ├── scripts ├── release.sh ├── buildDocs.sh └── generateMarkdown.sh ├── .travis.yml ├── server.js ├── LICENSE ├── webpack.config.js ├── webpack.docs.config.js ├── docs └── ReactAddToCalendar.md ├── package.json ├── karma.conf.js ├── gruntfile.js ├── README.md ├── .scss-lint.yml └── .eslintrc /test/index.js: -------------------------------------------------------------------------------- 1 | var context = require.context('.', true, /_test$/) 2 | context.keys().forEach(context) 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .sass-cache 3 | npm-debug.log 4 | .idea 5 | dist 6 | lib 7 | tmp 8 | coverage 9 | 0.md 10 | -------------------------------------------------------------------------------- /docs-site/images/ribbon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jasonsalzman/react-add-to-calendar/HEAD/docs-site/images/ribbon.png -------------------------------------------------------------------------------- /docs-site/src/breakpoint.scss: -------------------------------------------------------------------------------- 1 | @mixin breakpoint($breakpoint) { 2 | @media (min-width: $breakpoint) { @content; } 3 | } 4 | -------------------------------------------------------------------------------- /docs-site/src/boot.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import Root from './root' 4 | 5 | ReactDOM.render(, document.getElementById('app')) 6 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true, 4 | }, 5 | 6 | "globals": { 7 | "assert": true, 8 | "describe": true, 9 | "expect": true, 10 | "sinon": true 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /docs-site/src/hero_example.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import AddToCalendar from "react-add-to-calendar"; 3 | 4 | export default class HeroExample extends React.Component { 5 | render() { 6 | return ; 7 | } 8 | } 9 | 10 | HeroExample.displayName = "HeroExample"; 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | root = true 4 | 5 | [*] 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = false 10 | indent_style = space 11 | indent_style = 4 12 | 13 | [*.json] 14 | indent_style = space 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015", "stage-0", "react"], 3 | "env": { 4 | "development": { 5 | "plugins": [ 6 | ["react-transform", { 7 | "transforms": [{ 8 | "transform": "react-transform-hmr", 9 | "imports": ["react"], 10 | "locals": ["module"] 11 | }] 12 | }] 13 | ] 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /scripts/release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | rm -rf ./node_modules ./lib ./dist 4 | npm install 5 | 6 | git checkout . 7 | 8 | npm version $1 9 | 10 | react-docgen ./src/*.js --resolver findAllComponentDefinitions | ./scripts/buildDocs.sh 11 | 12 | git add . 13 | 14 | git commit -m "Publish new API docs (automated commit)" 15 | 16 | git push 17 | 18 | git push --tags 19 | 20 | npm publish 21 | 22 | ./docs-site/publish.sh 23 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/styles/font-awesome/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /docs-site/publish.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 4 | 5 | npm run build 6 | 7 | mkdir -p tmp 8 | 9 | if [ ! -d "tmp/gh-pages" ]; then 10 | git clone git@github.com:jasonsalzman/react-add-to-calendar.git --branch gh-pages --single-branch tmp/gh-pages 11 | fi 12 | 13 | cd tmp/gh-pages 14 | 15 | git pull 16 | 17 | find . -maxdepth 1 ! -name '.git' ! -name '.' -exec rm -r {} \; 18 | 19 | cp -r $DIR/{bundle.js,index.html,style.css,images} ./ 20 | 21 | git add --all 22 | 23 | git commit -m "Publish new docs (automated commit)" 24 | 25 | git push 26 | -------------------------------------------------------------------------------- /docs-site/src/code_example_component.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | export default class CodeExampleComponent extends React.Component { 5 | render() { 6 | return ( 7 |
11 |

{this.props.title}

12 | {this.props.children} 13 |
14 | ); 15 | } 16 | } 17 | 18 | CodeExampleComponent.displayName = "CodeExampleComponent"; 19 | 20 | CodeExampleComponent.propTypes = { 21 | children: PropTypes.element, 22 | id: PropTypes.number, 23 | title: PropTypes.string 24 | }; 25 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /docs-site/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | React Add to Calendar Button crafted by Jason Salzman 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | dist: trusty 3 | language: node_js 4 | node_js: 5 | - "6" 6 | - "5" 7 | - "4" 8 | env: 9 | - CXX=g++-4.8 10 | addons: 11 | apt: 12 | sources: 13 | - ubuntu-toolchain-r-test 14 | packages: 15 | - g++-4.8 16 | rvm: 17 | - 2.1.7 18 | before_install: 19 | - npm install -g grunt-cli 20 | - gem update --system && gem install scss_lint -v 0.44.0 21 | - export CHROME_BIN=/usr/bin/google-chrome 22 | - export DISPLAY=:99.0 23 | - sh -e /etc/init.d/xvfb start 24 | - sudo apt-get update 25 | - sudo apt-get install -y libappindicator1 fonts-liberation 26 | - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 27 | - sudo dpkg -i google-chrome*.deb 28 | after_success: 29 | - bash <(curl -s https://codecov.io/bash) 30 | notifications: 31 | email: 32 | - jason@project41innovations.com 33 | -------------------------------------------------------------------------------- /docs-site/src/hero.scss: -------------------------------------------------------------------------------- 1 | .hero { 2 | color: #fff; 3 | background-color: #216ba5; 4 | 5 | &__content { 6 | @extend %container-styling; 7 | text-align: center; 8 | padding: 175px 0; 9 | } 10 | 11 | &__title { 12 | font-size: 34px; 13 | font-weight: 600; 14 | line-height: 1.2; 15 | margin: 0; 16 | padding: 0; 17 | border-bottom: 0; 18 | margin-bottom: 5px; 19 | } 20 | 21 | &__image { 22 | height: 14px; 23 | } 24 | 25 | &__example { 26 | width: 210px; 27 | margin: 0 auto; 28 | } 29 | 30 | &__crafted-by { 31 | margin-bottom: 30px; 32 | } 33 | 34 | &__crafted-by-link { 35 | color: #fff; 36 | } 37 | } 38 | 39 | .github-ribbon { 40 | position: absolute; 41 | top: 0; 42 | right: 0; 43 | border: 0; 44 | } 45 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | var express = require('express') 2 | var webpack = require('webpack') 3 | var merge = require('lodash/merge') 4 | var config = merge({}, require('./webpack.docs.config')) 5 | 6 | config.devtool = 'cheap-module-eval-source-map' 7 | config.entry.unshift('webpack-hot-middleware/client') 8 | config.plugins.push( 9 | new webpack.HotModuleReplacementPlugin(), 10 | new webpack.NoErrorsPlugin() 11 | ) 12 | 13 | var app = express() 14 | var compiler = webpack(config) 15 | 16 | app.use(require('webpack-dev-middleware')(compiler, { 17 | noInfo: true, 18 | publicPath: config.output.publicPath 19 | })) 20 | 21 | app.use(require('webpack-hot-middleware')(compiler)) 22 | 23 | app.use(express.static('docs-site')) 24 | 25 | app.listen(8080, 'localhost', function (err) { 26 | if (err) { 27 | console.log(err) 28 | return 29 | } 30 | 31 | console.log('Listening at http://localhost:8080') 32 | }) 33 | -------------------------------------------------------------------------------- /docs-site/src/examples/changeLabel.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import AddToCalendar from "react-add-to-calendar"; 3 | 4 | export default class ChangeLabel extends React.Component { 5 | render() { 6 | let event = { 7 | title: "Sample Event", 8 | description: "This is the sample event provided as an example only", 9 | location: "Portland, OR", 10 | startTime: "2016-09-16T20:15:00-04:00", 11 | endTime: "2016-09-16T21:45:00-04:00" 12 | }; 13 | 14 | return ( 15 |
16 |
17 |           
18 |             {"
19 |                
20 |             {"event={event}"}
21 |     22 | {'buttonLabel="Put on my calendar" />'} 23 |
24 |
25 |
26 | 27 |
28 |
29 | ); 30 | } 31 | } 32 | 33 | ChangeLabel.displayName = "ChangeLabel"; 34 | -------------------------------------------------------------------------------- /docs-site/src/examples/textOnlyDropdown.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import AddToCalendar from "react-add-to-calendar"; 3 | 4 | export default class TextOnlyDropdown extends React.Component { 5 | render() { 6 | let event = { 7 | title: "Sample Event", 8 | description: "This is the sample event provided as an example only", 9 | location: "Portland, OR", 10 | startTime: "2016-09-16T20:15:00-04:00", 11 | endTime: "2016-09-16T21:45:00-04:00" 12 | }; 13 | 14 | return ( 15 |
16 |
17 |           
18 |             {"
19 |                
20 |             {"event={event}"}
21 |     22 | {"displayItemIcons={false} />"} 23 |
24 |
25 |
26 | 27 |
28 |
29 | ); 30 | } 31 | } 32 | 33 | TextOnlyDropdown.displayName = "TextOnlyDropdown"; 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016-2017 Jason Salzman 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | var webpack = require('webpack') 2 | 3 | module.exports = { 4 | entry: './src/ReactAddToCalendar', 5 | output: { 6 | libraryTarget: 'umd', 7 | library: 'ReactAddToCalendar', 8 | path: './dist/' 9 | }, 10 | module: { 11 | loaders: [ 12 | { 13 | test: /\.js?$/, 14 | loader: 'babel', 15 | exclude: /node_modules/ 16 | } 17 | ] 18 | }, 19 | resolve: { 20 | extensions: ['', '.js', '.jsx'] 21 | }, 22 | externals: [ 23 | { 24 | 'react-dom': { 25 | root: 'ReactDOM', 26 | commonjs2: 'react-dom', 27 | commonjs: 'react-dom', 28 | amd: 'react-dom' 29 | } 30 | }, 31 | { 32 | 'react': { 33 | root: 'React', 34 | commonjs2: 'react', 35 | commonjs: 'react', 36 | amd: 'react' 37 | } 38 | }, 39 | { 40 | 'moment': { 41 | root: 'moment', 42 | commonjs2: 'moment', 43 | commonjs: 'moment', 44 | amd: 'moment' 45 | } 46 | } 47 | ], 48 | node: { Buffer: false }, 49 | plugins: [ 50 | new webpack.optimize.DedupePlugin(), 51 | new webpack.DefinePlugin({ 52 | 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) 53 | }) 54 | ] 55 | } 56 | -------------------------------------------------------------------------------- /docs-site/src/examples/textOnlyTemplate.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import AddToCalendar from "react-add-to-calendar"; 3 | 4 | export default class TextOnlyTemplate extends React.Component { 5 | render() { 6 | let event = { 7 | title: "Sample Event", 8 | description: "This is the sample event provided as an example only", 9 | location: "Portland, OR", 10 | startTime: "2016-09-16T20:15:00-04:00", 11 | endTime: "2016-09-16T21:45:00-04:00" 12 | }; 13 | 14 | let icon = { textOnly: "none" }; 15 | 16 | return ( 17 |
18 |
19 |           
20 |             {"let icon = { textOnly: 'none' };"}

21 |
22 | 23 | {" 24 |     25 | {"event={event}"}
26 |     27 | {"buttonTemplate={icon} />"} 28 |
29 |
30 |
31 | 32 |
33 |
34 | ); 35 | } 36 | } 37 | 38 | TextOnlyTemplate.displayName = "TextOnlyTemplate"; 39 | -------------------------------------------------------------------------------- /scripts/buildDocs.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * This example script expects a JSON blob generated by react-docgen as input, 5 | * e.g. react-docgen components/* | buildDocs.sh 6 | */ 7 | 8 | var fs = require('fs'); 9 | var generateMarkdown = require('./generateMarkdown.sh'); 10 | var path = require('path'); 11 | 12 | var json = ''; 13 | process.stdin.setEncoding('utf8'); 14 | process.stdin.on('readable', function() { 15 | var chunk = process.stdin.read(); 16 | if (chunk !== null) { 17 | json += chunk; 18 | } 19 | }); 20 | 21 | process.stdin.on('end', function() { 22 | buildDocs(JSON.parse(json)); 23 | }); 24 | 25 | function buildDocs(api) { 26 | // api is an object keyed by filepath. We use the file name as component name. 27 | for (var filepath in api) { 28 | var name = getComponentName(filepath); 29 | var markdown = generateMarkdown(name, api[filepath]); 30 | var outputLocation = './docs/'; 31 | fs.writeFileSync(outputLocation + name + '.md', markdown); 32 | process.stdout.write(filepath + ' -> ' + outputLocation + name + '.md\n'); 33 | } 34 | } 35 | 36 | function getComponentName(filepath) { 37 | var name = path.basename(filepath); 38 | var ext; 39 | while ((ext = path.extname(name))) { 40 | name = name.substring(0, name.length - ext.length); 41 | } 42 | return name; 43 | } 44 | -------------------------------------------------------------------------------- /webpack.docs.config.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | var webpack = require('webpack') 3 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | 5 | module.exports = { 6 | entry: [ 7 | './docs-site/src/boot' 8 | ], 9 | output: { 10 | path: path.resolve('./docs-site/'), 11 | filename: 'bundle.js', 12 | publicPath: '/' 13 | }, 14 | resolve: { 15 | extensions: ['', '.js', '.jsx'], 16 | 17 | // Needed to direct the docs to the local version of the component, this is not needed for 18 | // normal setup. 19 | alias: { 20 | 'react-add-to-calendar/dist/react-add-to-calendar.css': path.resolve('./src/styles/ReactAddToCalendar.scss'), 21 | 'react-add-to-calendar': path.resolve('./src/ReactAddToCalendar.js') 22 | } 23 | }, 24 | module: { 25 | loaders: [ 26 | { test: /\.js/, loader: 'babel', exclude: /node_modules/ }, 27 | { test: /\.scss/, loader: ExtractTextPlugin.extract('style-loader', 'css-loader!sass-loader') }, 28 | { test: /\.css/, loader: ExtractTextPlugin.extract('style-loader', 'css-loader') } 29 | ] 30 | }, 31 | node: { Buffer: false }, 32 | plugins: [ 33 | new webpack.optimize.DedupePlugin(), 34 | new ExtractTextPlugin('style.css', { allChunks: true }), 35 | new webpack.DefinePlugin({ 36 | 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) 37 | }) 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /docs-site/src/examples/removeDropdownItem.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import AddToCalendar from "react-add-to-calendar"; 3 | 4 | export default class RemoveDropdownItem extends React.Component { 5 | render() { 6 | let event = { 7 | title: "Sample Event", 8 | description: "This is the sample event provided as an example only", 9 | location: "Portland, OR", 10 | startTime: "2016-09-16T20:15:00-04:00", 11 | endTime: "2016-09-16T21:45:00-04:00" 12 | }; 13 | 14 | let items = [{ outlook: "Outlook" }, { google: "Google" }]; 15 | 16 | return ( 17 |
18 |
19 |           
20 |             {"let items = ["}
21 |     22 | {"{ outlook: 'Outlook' }"}
23 |     24 | {"{ google: 'Google' }"}
25 | {"];"}

26 |
27 | 28 | {" 29 |     30 | {"event={event}"}
31 |     32 | {"listItems={items} />"} 33 |
34 |
35 |
36 | 37 |
38 |
39 | ); 40 | } 41 | } 42 | 43 | RemoveDropdownItem.displayName = "Remove Dropdown Item"; 44 | -------------------------------------------------------------------------------- /docs-site/src/examples/changeTemplate.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import AddToCalendar from "react-add-to-calendar"; 3 | 4 | export default class ChangeTemplate extends React.Component { 5 | render() { 6 | let event = { 7 | title: "Sample Event", 8 | description: "This is the sample event provided as an example only", 9 | location: "Portland, OR", 10 | startTime: "2016-09-16T20:15:00-04:00", 11 | endTime: "2016-09-16T21:45:00-04:00" 12 | }; 13 | 14 | let icon = { "calendar-plus-o": "left" }; 15 | 16 | return ( 17 |
18 |
19 |           
20 |             {"let icon = { 'calendar-plus-o': 'left' };"}

21 | {"/*"}
22 |     23 | {"object property can be any Font Awesome icon"}
24 |     25 | {"and value can be 'left' or 'right'"}
26 | {"*/"}

27 |
28 | 29 | {" 30 |     31 | {"event={event}"}
32 |     33 | {"buttonTemplate={icon} />"} 34 |
35 |
36 |
37 | 38 |
39 |
40 | ); 41 | } 42 | } 43 | 44 | ChangeTemplate.displayName = "ChangeTemplate"; 45 | -------------------------------------------------------------------------------- /src/styles/ReactAddToCalendar.scss: -------------------------------------------------------------------------------- 1 | @import "./font-awesome/font-awesome"; 2 | 3 | .react-add-to-calendar { 4 | -webkit-font-smoothing: antialiased; 5 | text-shadow: 1px 1px 1px rgba(0, 0, 0, .004); 6 | position: relative; 7 | display: inline-block; 8 | margin: 0 auto; 9 | 10 | &__wrapper { 11 | zoom: 1; 12 | cursor: pointer; 13 | } 14 | 15 | &__button { 16 | padding: 10px; 17 | background-color: #f9f9f9; 18 | border: 1px solid #aab9d4; 19 | border-radius: 3px; 20 | color: #000; 21 | 22 | &--light { 23 | background-color: #fff; 24 | } 25 | } 26 | 27 | &__icon { 28 | &--right { 29 | padding-left: 5px; 30 | } 31 | 32 | &--left { 33 | padding-right: 5px; 34 | } 35 | } 36 | 37 | &__dropdown { 38 | position: absolute; 39 | top: 30px; 40 | left: 1px; 41 | width: 93%; 42 | padding: 5px 0 5px 8px; 43 | box-shadow: 1px 3px 6px rgba(0, 0, 0, .15); 44 | border: 1px solid #a8a8a8; 45 | background-color: #fff; 46 | text-align: left; 47 | 48 | ul { 49 | list-style: none; 50 | margin: 0; 51 | 52 | li { 53 | 54 | a { 55 | color: #000; 56 | text-decoration: none; 57 | 58 | i { 59 | padding-right: 10px; 60 | } 61 | } 62 | } 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /docs/ReactAddToCalendar.md: -------------------------------------------------------------------------------- 1 | `react-add-to-calendar` (component) 2 | =============== 3 | 4 | 5 | 6 | Props 7 | ----- 8 | 9 | ### `buttonClassClosed` 10 | 11 | type: `string` 12 | defaultValue: `'react-add-to-calendar__button'` 13 | 14 | 15 | ### `buttonClassOpen` 16 | 17 | type: `string` 18 | defaultValue: `'react-add-to-calendar__button--light'` 19 | 20 | 21 | ### `buttonLabel` 22 | 23 | type: `string` 24 | defaultValue: `'Add to My Calendar'` 25 | 26 | 27 | ### `buttonTemplate` 28 | 29 | type: `object` 30 | defaultValue: `{ caret: 'right' }` 31 | 32 | 33 | ### `buttonWrapperClass` 34 | 35 | type: `string` 36 | defaultValue: `'react-add-to-calendar__wrapper'` 37 | 38 | 39 | ### `displayItemIcons` 40 | 41 | type: `bool` 42 | defaultValue: `true` 43 | 44 | 45 | ### `dropdownClass` 46 | 47 | type: `string` 48 | defaultValue: `'react-add-to-calendar__dropdown'` 49 | 50 | 51 | ### `event` (required) 52 | 53 | type: `shape[object Object]` 54 | defaultValue: `{ 55 | title: 'Sample Event', 56 | description: 'This is the sample event provided as an example only', 57 | location: 'Portland, OR', 58 | startTime: '2016-09-16T20:15:00-04:00', 59 | endTime: '2016-09-16T21:45:00-04:00' 60 | }` 61 | 62 | 63 | ### `listItems` 64 | 65 | type: `arrayOf[object Object]` 66 | defaultValue: `[ 67 | { apple: 'Apple Calendar' }, 68 | { google: 'Google' }, 69 | { outlook: 'Outlook' }, 70 | { outlookcom: 'Outlook.com' }, 71 | { yahoo: 'Yahoo' } 72 | ]` 73 | 74 | 75 | ### `rootClass` 76 | 77 | type: `string` 78 | defaultValue: `'react-add-to-calendar'` 79 | 80 | ### `optionsOpen` 81 | type: `bool` 82 | defaultValue: `false` 83 | -------------------------------------------------------------------------------- /docs-site/src/examples/default.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import AddToCalendar from "react-add-to-calendar"; 3 | 4 | export default class Default extends React.Component { 5 | render() { 6 | let event = { 7 | title: "Sample Event", 8 | description: "This is the sample event provided as an example only", 9 | location: "Portland, OR", 10 | startTime: "2016-09-16T20:15:00-04:00", 11 | endTime: "2016-09-16T21:45:00-04:00" 12 | }; 13 | 14 | return ( 15 |
16 |
17 |           
18 |             {"let event = {"}
19 |     20 | {" title: 'Sample Event',"}
21 |     22 | { 23 | " description: 'This is the sample event provided as an example only'," 24 | } 25 |
26 |     27 | {" location: 'Portland, OR',"}
28 |     29 | {" startTime: '2016-09-16T20:15:00-04:00',"}
30 |     31 | {" endTime: '2016-09-16T21:45:00-04:00'"}
32 | {"};"}

33 | {"/*"}
34 |     35 | {"startTime and endTime can use any datetime"}
36 |     37 | {"string that is acceptable by MomentJS"}
38 | {"*/"} 39 |
40 | 41 | {""} 42 | 43 |
44 |
45 | 46 |
47 |
48 | ); 49 | } 50 | } 51 | 52 | Default.displayName = "Default"; 53 | -------------------------------------------------------------------------------- /docs-site/src/examples/changeDropdownLabels.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import AddToCalendar from "react-add-to-calendar"; 3 | 4 | export default class ChangeDropdownLabels extends React.Component { 5 | render() { 6 | let event = { 7 | title: "Sample Event", 8 | description: "This is the sample event provided as an example only", 9 | location: "Portland, OR", 10 | startTime: "2016-09-16T20:15:00-04:00", 11 | endTime: "2016-09-16T21:45:00-04:00" 12 | }; 13 | 14 | let items = [ 15 | { outlook: "Outlook" }, 16 | { outlookcom: "Outlook.com" }, 17 | { apple: "iCal" }, 18 | { yahoo: "Yahoo!" }, 19 | { google: "Google" } 20 | ]; 21 | 22 | return ( 23 |
24 |
25 |           
26 |             {"let items = ["}
27 |     28 | {"{ outlook: 'Outlook' }"}
29 |     30 | {"{ outlookcom: 'Outlook.com' }"}
31 |     32 | {"{ apple: 'iCal' }"}
33 |     34 | {"{ yahoo: 'Yahoo!' }"}
35 |     36 | {"{ google: 'Google' }"}
37 | {"];"}

38 |
39 | 40 | {" 41 |     42 | {"event={event}"}
43 |     44 | {"listItems={items} />"} 45 |
46 |
47 |
48 | 49 |
50 |
51 | ); 52 | } 53 | } 54 | 55 | ChangeDropdownLabels.displayName = "Change Dropdown Labels"; -------------------------------------------------------------------------------- /docs-site/src/examples/changeDropdownOrder.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import AddToCalendar from "react-add-to-calendar"; 3 | 4 | export default class ChangeDropdownOrder extends React.Component { 5 | render() { 6 | let event = { 7 | title: "Sample Event", 8 | description: "This is the sample event provided as an example only", 9 | location: "Portland, OR", 10 | startTime: "2016-09-16T20:15:00-04:00", 11 | endTime: "2016-09-16T21:45:00-04:00" 12 | }; 13 | 14 | let items = [ 15 | { outlook: "Outlook" }, 16 | { outlookcom: "Outlook.com" }, 17 | { apple: "Apple Calendar" }, 18 | { yahoo: "Yahoo" }, 19 | { google: "Google" } 20 | ]; 21 | 22 | return ( 23 |
24 |
25 |           
26 |             {"let items = ["}
27 |     28 | {"{ outlook: 'Outlook' }"}
29 |     30 | {"{ outlookcom: 'Outlook.com' }"}
31 |     32 | {"{ apple: 'Apple Calendar' }"}
33 |     34 | {"{ yahoo: 'Yahoo' }"}
35 |     36 | {"{ google: 'Google' }"}
37 | {"];"}

38 |
39 | 40 | {" 41 |     42 | {"event={event}"}
43 |     44 | {"listItems={items} />"} 45 |
46 |
47 |
48 | 49 |
50 |
51 | ); 52 | } 53 | } 54 | 55 | ChangeDropdownOrder.displayName = "Change Dropdown Order"; 56 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /docs-site/src/reset.scss: -------------------------------------------------------------------------------- 1 | html, 2 | body, 3 | div, 4 | span, 5 | applet, 6 | object, 7 | iframe, 8 | h1, 9 | h2, 10 | h3, 11 | h4, 12 | h5, 13 | h6, 14 | p, 15 | blockquote, 16 | pre, 17 | a, 18 | abbr, 19 | acronym, 20 | address, 21 | big, 22 | cite, 23 | code, 24 | del, 25 | dfn, 26 | em, 27 | img, 28 | ins, 29 | kbd, 30 | q, 31 | s, 32 | samp, 33 | small, 34 | strike, 35 | strong, 36 | sub, 37 | sup, 38 | tt, 39 | var, 40 | b, 41 | u, 42 | i, 43 | center, 44 | dl, 45 | dt, 46 | dd, 47 | ol, 48 | ul, 49 | li, 50 | fieldset, 51 | form, 52 | label, 53 | legend, 54 | table, 55 | caption, 56 | tbody, 57 | tfoot, 58 | thead, 59 | tr, 60 | th, 61 | td, 62 | article, 63 | aside, 64 | canvas, 65 | details, 66 | embed, 67 | figure, 68 | figcaption, 69 | footer, 70 | header, 71 | hgroup, 72 | menu, 73 | nav, 74 | output, 75 | ruby, 76 | section, 77 | summary, 78 | time, 79 | mark, 80 | audio, 81 | video { 82 | margin: 0; 83 | padding: 0; 84 | border: 0; 85 | font: inherit; 86 | font-size: 100%; 87 | vertical-align: baseline; 88 | } 89 | 90 | html { 91 | line-height: 1; 92 | } 93 | 94 | ol, 95 | ul { 96 | list-style: none; 97 | } 98 | 99 | table { 100 | border-collapse: collapse; 101 | border-spacing: 0; 102 | } 103 | 104 | caption, 105 | th, 106 | td { 107 | text-align: left; 108 | font-weight: normal; 109 | vertical-align: middle; 110 | } 111 | 112 | q, 113 | blockquote { 114 | quotes: none; 115 | } 116 | 117 | q:before, 118 | q:after, 119 | blockquote:before, 120 | blockquote:after { 121 | content: ""; 122 | content: none; 123 | } 124 | 125 | a img { 126 | border: none; 127 | } 128 | 129 | article, 130 | aside, 131 | details, 132 | figcaption, 133 | figure, 134 | footer, 135 | header, 136 | hgroup, 137 | menu, 138 | nav, 139 | section, 140 | summary { 141 | display: block; 142 | } 143 | -------------------------------------------------------------------------------- /docs-site/src/examples.scss: -------------------------------------------------------------------------------- 1 | .examples__navigation { 2 | display: none; 3 | 4 | @include breakpoint(640px) { 5 | width: 200px; 6 | float: left; 7 | display: block; 8 | list-style: none; 9 | margin: 0; 10 | margin-right: 20px; 11 | border: 1px solid #e4e4e4; 12 | background: #fff; 13 | border-radius: 4px; 14 | overflow: hidden; 15 | } 16 | } 17 | 18 | .examples__navigation-item { 19 | border-bottom: 1px solid #e4e4e4; 20 | 21 | &:last-child { 22 | border-bottom: none; 23 | } 24 | 25 | a { 26 | padding: 10px; 27 | color: inherit; 28 | text-decoration: none; 29 | display: block; 30 | 31 | &:hover { 32 | background: #f5f5f5; 33 | text-decoration: underline; 34 | } 35 | } 36 | } 37 | 38 | .examples { 39 | overflow: hidden; 40 | } 41 | 42 | .example { 43 | background-color: #fff; 44 | border-radius: 4px; 45 | border: 1px solid #e4e4e4; 46 | padding: 20px; 47 | margin-bottom: 20px; 48 | 49 | &__heading { 50 | color: #216ba5; 51 | font-weight: 400; 52 | font-size: 18px; 53 | border: 0; 54 | margin: 0; 55 | padding: 0; 56 | margin-bottom: 20px; 57 | } 58 | 59 | &__code { 60 | background-color: #f5f8fb; 61 | padding: 20px; 62 | margin: 0 -20px 20px; 63 | border-top: 1px solid #d8e4ef; 64 | border-bottom: 1px solid #d8e4ef; 65 | overflow-x: auto; 66 | overflow-y: hidden; 67 | white-space: nowrap; 68 | 69 | @include breakpoint(768px) { 70 | border-top-right-radius: 4px; 71 | border-bottom-right-radius: 4px; 72 | border-right: 1px solid #d8e4ef; 73 | margin-bottom: 0; 74 | } 75 | 76 | code { 77 | background: none; 78 | border: 0; 79 | } 80 | } 81 | } 82 | 83 | .red-border { 84 | border-color: #f00; 85 | } 86 | 87 | .example-custom-input { 88 | cursor: pointer; 89 | padding: 5px 15px; 90 | border: 0; 91 | border-radius: 4px; 92 | background-color: #216ba5; 93 | font: inherit; 94 | color: #fff; 95 | } 96 | -------------------------------------------------------------------------------- /test/add-to-calendar_test.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import TestUtils from "react-dom/test-utils"; 4 | import createReactClass from "create-react-class"; 5 | import AddToCalendar from "../src/ReactAddToCalendar.js"; 6 | 7 | describe("AddToCalendar", () => { 8 | it("should show the options menu when the button is clicked", () => { 9 | var event = { 10 | title: "Sample Event", 11 | description: "This is the sample event provided as an example only", 12 | location: "Portland, OR", 13 | startTime: "2016-09-16T20:15:00-04:00", 14 | endTime: "2016-09-16T21:45:00-04:00" 15 | }; 16 | var addToCalendar = TestUtils.renderIntoDocument( 17 | 18 | ); 19 | var button = TestUtils.findRenderedDOMComponentWithTag(addToCalendar, "a"); 20 | TestUtils.Simulate.click(ReactDOM.findDOMNode(button)); 21 | var dropdown = TestUtils.findRenderedDOMComponentWithClass( 22 | addToCalendar, 23 | "react-add-to-calendar__dropdown" 24 | ); 25 | expect(dropdown).to.exist; 26 | }); 27 | 28 | it("should show the options menu if optionsOpen is true", () => { 29 | var event = { 30 | title: "Sample Event", 31 | description: "This is the sample event provided as an example only", 32 | location: "Portland, OR", 33 | startTime: "2016-09-16T20:15:00-04:00", 34 | endTime: "2016-09-16T21:45:00-04:00" 35 | }; 36 | var addToCalendar = TestUtils.renderIntoDocument( 37 | 38 | ); 39 | var dropdown = TestUtils.findRenderedDOMComponentWithClass( 40 | addToCalendar, 41 | "react-add-to-calendar__dropdown" 42 | ); 43 | expect(dropdown).to.exist; 44 | }); 45 | 46 | it("should mount and unmount properly", done => { 47 | var TestComponent = createReactClass({ 48 | displayName: "TestComponent", 49 | 50 | getInitialState() { 51 | return { mounted: true }; 52 | }, 53 | render() { 54 | return this.state.mounted ? : null; 55 | } 56 | }); 57 | var element = TestUtils.renderIntoDocument(); 58 | element.setState({ mounted: false }, done); 59 | }); 60 | }); 61 | -------------------------------------------------------------------------------- /docs-site/src/style.scss: -------------------------------------------------------------------------------- 1 | @import "reset"; 2 | @import "higlight"; 3 | @import "breakpoint"; 4 | @import "hero"; 5 | @import "examples"; 6 | 7 | %container-styling { 8 | max-width: 1100px; 9 | margin: 0 auto; 10 | } 11 | 12 | html, 13 | body { 14 | height: 100%; 15 | background: #f5f5f5; 16 | font-family: "Open Sans", sans-serif; 17 | color: #555; 18 | font-size: 14px; 19 | line-height: 21px; 20 | 21 | input { 22 | width: 100%; 23 | } 24 | } 25 | 26 | a { 27 | text-decoration: none; 28 | } 29 | 30 | p { 31 | margin-bottom: 15px; 32 | } 33 | 34 | ul { 35 | list-style: disc; 36 | margin-left: 40px; 37 | margin-bottom: 15px; 38 | } 39 | 40 | h1, 41 | h2 { 42 | margin-top: 1em; 43 | margin-bottom: 16px; 44 | font-weight: bold; 45 | line-height: 1.4; 46 | } 47 | 48 | h1 { 49 | padding-bottom: .3em; 50 | font-size: 2.25em; 51 | line-height: 1.2; 52 | border-bottom: 1px solid #eee; 53 | } 54 | 55 | h2 { 56 | padding-bottom: .3em; 57 | font-size: 1.75em; 58 | line-height: 1.225; 59 | border-bottom: 1px solid #eee; 60 | } 61 | 62 | code { 63 | padding: 2px 4px; 64 | border: 1px solid #ccc; 65 | margin: 0; 66 | font-size: 85%; 67 | background-color: #e8e7e7; 68 | border-radius: 3px; 69 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; 70 | } 71 | 72 | strong { 73 | font-weight: 600; 74 | } 75 | 76 | .wrapper { 77 | @extend %container-styling; 78 | padding: 20px; 79 | } 80 | 81 | .row { 82 | @include breakpoint(768px) { 83 | display: flex; 84 | } 85 | } 86 | 87 | .column { 88 | @include breakpoint(768px) { 89 | width: 50%; 90 | 91 | &:first-child { 92 | margin-right: 20px; 93 | } 94 | } 95 | } 96 | 97 | input { 98 | font-size: 13px; 99 | border-radius: 4px; 100 | box-shadow: inset 0 2px 2px #e9e9e9; 101 | border: 1px solid #aeaeae; 102 | line-height: 16px; 103 | padding: 6px 10px 5px; 104 | 105 | &:focus { 106 | outline: none; 107 | border-color: #aeaeae; 108 | box-shadow: inset 0 2px 2px #e9e9e9, 0 0 10px 0 rgba(73, 107, 125, .3); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /scripts/generateMarkdown.sh: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | "use strict"; 10 | 11 | function stringOfLength(string, length) { 12 | var newString = ''; 13 | for (var i = 0; i < length; i++) { 14 | newString += string; 15 | } 16 | return newString; 17 | } 18 | 19 | function generateTitle(name) { 20 | var title = '`' + name + '` (component)'; 21 | return title + '\n' + stringOfLength('=', title.length) + '\n'; 22 | } 23 | 24 | function generateDesciption(description) { 25 | return description + '\n'; 26 | } 27 | 28 | function generatePropType(type) { 29 | var values; 30 | if (Array.isArray(type.value)) { 31 | values = '(' + 32 | type.value.map(function(typeValue) { 33 | return typeValue.name || typeValue.value; 34 | }).join('|') + 35 | ')'; 36 | } else { 37 | values = type.value; 38 | } 39 | 40 | return 'type: `' + type.name + (values ? values: '') + '`\n'; 41 | } 42 | 43 | function generatePropDefaultValue(value) { 44 | return 'defaultValue: `' + value.value + '`\n'; 45 | } 46 | 47 | function generateProp(propName, prop) { 48 | return ( 49 | '### `' + propName + '`' + (prop.required ? ' (required)' : '') + '\n' + 50 | '\n' + 51 | (prop.description ? prop.description + '\n\n' : '') + 52 | (prop.type ? generatePropType(prop.type) : '') + 53 | (prop.defaultValue ? generatePropDefaultValue(prop.defaultValue) : '') + 54 | '\n' 55 | ); 56 | } 57 | 58 | function generateProps(props) { 59 | var title = 'Props'; 60 | 61 | return ( 62 | title + '\n' + 63 | stringOfLength('-', title.length) + '\n' + 64 | '\n' + 65 | Object.keys(props).sort().map(function(propName) { 66 | return generateProp(propName, props[propName]); 67 | }).join('\n') 68 | ); 69 | } 70 | 71 | function generateMarkdown(name, reactAPI) { 72 | var markdownString = 73 | generateTitle(name) + '\n' + 74 | generateDesciption(reactAPI.description) + '\n' + 75 | generateProps(reactAPI.props); 76 | 77 | return markdownString; 78 | } 79 | 80 | module.exports = generateMarkdown; 81 | -------------------------------------------------------------------------------- /docs-site/src/higlight.scss: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | github.com style (c) Vasily Polovnyov 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | color: #333; 12 | -webkit-text-size-adjust: none; 13 | } 14 | 15 | .hljs-comment, 16 | .diff .hljs-header { 17 | color: #998; 18 | font-style: italic; 19 | } 20 | 21 | .hljs-keyword, 22 | .css .rule .hljs-keyword, 23 | .hljs-winutils, 24 | .nginx .hljs-title, 25 | .hljs-subst, 26 | .hljs-request, 27 | .hljs-status { 28 | color: #333; 29 | font-weight: bold; 30 | } 31 | 32 | .hljs-number, 33 | .hljs-hexcolor, 34 | .ruby .hljs-constant { 35 | color: #008080; 36 | } 37 | 38 | .hljs-string, 39 | .hljs-tag .hljs-value, 40 | .hljs-doctag, 41 | .tex .hljs-formula { 42 | color: #d14; 43 | } 44 | 45 | .hljs-title, 46 | .hljs-id, 47 | .scss .hljs-preprocessor { 48 | color: #900; 49 | font-weight: bold; 50 | } 51 | 52 | .hljs-list .hljs-keyword, 53 | .hljs-subst { 54 | font-weight: normal; 55 | } 56 | 57 | .hljs-class .hljs-title, 58 | .hljs-type, 59 | .vhdl .hljs-literal, 60 | .tex .hljs-command { 61 | color: #458; 62 | font-weight: bold; 63 | } 64 | 65 | .hljs-tag, 66 | .hljs-tag .hljs-title, 67 | .hljs-rule .hljs-property, 68 | .django .hljs-tag .hljs-keyword { 69 | color: #000080; 70 | font-weight: normal; 71 | } 72 | 73 | .hljs-attribute, 74 | .hljs-variable, 75 | .lisp .hljs-body, 76 | .hljs-name { 77 | color: #008080; 78 | } 79 | 80 | .hljs-regexp { 81 | color: #009926; 82 | } 83 | 84 | .hljs-symbol, 85 | .ruby .hljs-symbol .hljs-string, 86 | .lisp .hljs-keyword, 87 | .clojure .hljs-keyword, 88 | .scheme .hljs-keyword, 89 | .tex .hljs-special, 90 | .hljs-prompt { 91 | color: #990073; 92 | } 93 | 94 | .hljs-built_in { 95 | color: #0086b3; 96 | } 97 | 98 | .hljs-preprocessor, 99 | .hljs-pragma, 100 | .hljs-pi, 101 | .hljs-doctype, 102 | .hljs-shebang, 103 | .hljs-cdata { 104 | color: #999; 105 | font-weight: bold; 106 | } 107 | 108 | .hljs-deletion { 109 | background: #fdd; 110 | } 111 | 112 | .hljs-addition { 113 | background: #dfd; 114 | } 115 | 116 | .diff .hljs-change { 117 | background: #0086b3; 118 | } 119 | 120 | .hljs-chunk { 121 | color: #aaa; 122 | } 123 | -------------------------------------------------------------------------------- /docs-site/src/example_components.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import hljs from "highlight.js"; 3 | import Default from "./examples/default"; 4 | import ChangeLabel from "./examples/changeLabel"; 5 | import ChangeTemplate from "./examples/changeTemplate"; 6 | import TextOnlyTemplate from "./examples/textOnlyTemplate"; 7 | import TextOnlyDropdown from "./examples/textOnlyDropdown"; 8 | import ChangeDropdownOrder from "./examples/changeDropdownOrder"; 9 | import RemoveDropdownItem from "./examples/removeDropdownItem"; 10 | import ChangeDropdownLabels from "./examples/changeDropdownLabels"; 11 | import CodeExampleComponent from "./code_example_component"; 12 | 13 | import "react-add-to-calendar/dist/react-add-to-calendar.css"; 14 | import "./style.scss"; 15 | 16 | const examples = [ 17 | { 18 | title: "Default", 19 | component: Default 20 | }, 21 | { 22 | title: "Change Button Label", 23 | component: ChangeLabel 24 | }, 25 | { 26 | title: "Change Button Template", 27 | component: ChangeTemplate 28 | }, 29 | { 30 | title: "Text Only Button Template", 31 | component: TextOnlyTemplate 32 | }, 33 | { 34 | title: "Text Only Dropdown Items", 35 | component: TextOnlyDropdown 36 | }, 37 | { 38 | title: "Change Dropdown Order", 39 | component: ChangeDropdownOrder 40 | }, 41 | { 42 | title: "Remove Dropdown Item", 43 | component: RemoveDropdownItem 44 | }, 45 | { 46 | title: "Change Dropdown Labels", 47 | component: ChangeDropdownLabels 48 | } 49 | ]; 50 | 51 | export default class ExampleComponents extends React.Component { 52 | componentDidMount() { 53 | hljs.initHighlightingOnLoad(); 54 | } 55 | 56 | renderExamples() { 57 | return examples.map((example, index) => ( 58 | 62 | {} 63 | 64 | )); 65 | } 66 | 67 | renderLeftColumn() { 68 | return examples.map((example, index) => ( 69 |
  • 70 | 71 | {example.title} 72 | 73 |
  • 74 | )); 75 | } 76 | 77 | render() { 78 | return ( 79 |
    80 |

    Examples

    81 |
      82 | {this.renderLeftColumn()} 83 |
    84 |
    85 | {this.renderExamples()} 86 |
    87 |
    88 | ); 89 | } 90 | } 91 | 92 | ExampleComponents.displayName = "exampleComponents"; 93 | -------------------------------------------------------------------------------- /docs-site/src/root.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import ExampleComponents from "./example_components.jsx"; 3 | import HeroExample from "./hero_example.jsx"; 4 | 5 | export default class Root extends React.Component { 6 | render() { 7 | return ( 8 |
    9 |
    10 |
    11 |

    12 | React Add to Calendar Button 13 |

    14 | 19 |
    20 | 21 |
    22 |
    23 |
    24 |
    25 |

    React Add to Calendar Button

    26 |

    27 | 28 | 31 |    32 | 33 | 36 |    37 | 38 | 41 |    42 | 43 | 46 |    47 | 48 | 51 | 52 |

    53 |

    54 | A simple, customizable, and reusable Add to Calendar button component for React. 55 |

    56 | 57 |

    Installation

    58 |

    The package can be installed via NPM:

    59 |

    npm install react-add-to-calendar --save

    60 |
    61 |
    62 | 63 |
    64 | 65 | 66 | Fork me on GitHub 70 | 71 |
    72 | ); 73 | } 74 | } 75 | 76 | Root.displayName = "Root"; 77 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Jason Salzman", 3 | "name": "react-add-to-calendar", 4 | "description": 5 | "A simple and reusable add to calendar button component for React", 6 | "version": "0.1.5", 7 | "license": "MIT", 8 | "homepage": "https://github.com/jasonsalzman/react-add-to-calendar", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/jasonsalzman/react-add-to-calendar.git" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/jasonsalzman/react-add-to-calendar/issues" 15 | }, 16 | "main": "dist/react-add-to-calendar.min.js", 17 | "style": "dist/react-add-to-calendar.min.css", 18 | "files": ["*.md", "dist", "lib"], 19 | "keywords": [ 20 | "react", 21 | "add-to-calendar", 22 | "calendar", 23 | "event", 24 | "react-component" 25 | ], 26 | "devDependencies": { 27 | "babel-core": "^6.24.1", 28 | "babel-loader": "^6.4.1", 29 | "babel-plugin-react-transform": "^2.0.2", 30 | "babel-preset-airbnb": "^2.2.3", 31 | "babel-preset-es2015": "^6.24.1", 32 | "babel-preset-react": "^6.24.1", 33 | "babel-preset-stage-0": "^6.24.1", 34 | "chai": "^3.5.0", 35 | "codecov": "^2.2.0", 36 | "create-react-class": "^15.5.3", 37 | "css-loader": "^0.28.2", 38 | "enzyme": "^3.2.0", 39 | "eslint": "^3.19.0", 40 | "eslint-config-standard": "^10.2.1", 41 | "eslint-plugin-import": "^2.2.0", 42 | "eslint-plugin-node": "^4.2.2", 43 | "eslint-plugin-promise": "^3.5.0", 44 | "eslint-plugin-react": "^7.0.1", 45 | "eslint-plugin-standard": "^3.0.1", 46 | "express": "^4.15.3", 47 | "extract-text-webpack-plugin": "^1.0.1", 48 | "grunt": "1.0.1", 49 | "grunt-babel": "^6.0.0", 50 | "grunt-cli": "^1.2.0", 51 | "grunt-contrib-sass": "1.0.0", 52 | "grunt-contrib-watch": "1.0.0", 53 | "grunt-eslint": "^19.0.0", 54 | "grunt-karma": "^2.0.0", 55 | "grunt-scss-lint": "^0.5.0", 56 | "grunt-webpack": "^1.0.18", 57 | "highlight.js": "^9.11.0", 58 | "istanbul-instrumenter-loader": "^2.0.0", 59 | "jsdom": "^9.12.0", 60 | "karma": "^1.7.0", 61 | "karma-chai": "^0.1.0", 62 | "karma-chrome-launcher": "^2.1.1", 63 | "karma-coverage": "^1.1.1", 64 | "karma-firefox-launcher": "^1.0.1", 65 | "karma-mocha": "^1.3.0", 66 | "karma-safari-launcher": "^1.0.0", 67 | "karma-sinon": "^1.0.5", 68 | "karma-sourcemap-loader": "^0.3.7", 69 | "karma-webpack": "^1.8.1", 70 | "lodash": "^4.17.4", 71 | "mocha": "^3.4.1", 72 | "mocha-jsdom": "^1.1.0", 73 | "node-sass": "^4.7.2", 74 | "prop-types": "^15.5.10", 75 | "react": "^16.2.0", 76 | "react-docgen": "^2.15.0", 77 | "react-dom": "^16.2.0", 78 | "react-transform-hmr": "^1.0.4", 79 | "sass-loader": "^4.1.1", 80 | "sinon": "^1.17.7", 81 | "style-loader": "^0.18.0", 82 | "webpack": "^1.15.0", 83 | "webpack-dev-middleware": "^1.10.2", 84 | "webpack-dev-server": "^1.16.4", 85 | "webpack-hot-middleware": "^2.18.0" 86 | }, 87 | "peerDependencies": { 88 | "react": "^15.5.4 || ^16.0.0", 89 | "react-dom": "^15.5.4 || ^16.0.0" 90 | }, 91 | "optionalDependencies": { 92 | "moment": "^2.18.1" 93 | }, 94 | "scripts": { 95 | "build": "NODE_ENV=production grunt build", 96 | "start": "node server.js", 97 | "test": "NODE_ENV=test grunt travis", 98 | "eslint": "eslint **/*.js", 99 | "prepublish": "npm run build", 100 | "codecov": "cat coverage/*/lcov.info | ./node_modules/codecov/bin/codecov" 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration 2 | // Generated on Wed Oct 05 2016 15:34:05 GMT-0700 (PDT) 3 | var webpack = require('webpack') 4 | var path = require('path') 5 | 6 | var BROWSERS = (process.env.TRAVIS) ? ['Chrome_travis_ci', 'Firefox'] : ['Chrome', 'Firefox', 'Safari']; 7 | 8 | module.exports = function(config) { 9 | config.set({ 10 | 11 | // base path that will be used to resolve all patterns (eg. files, exclude) 12 | basePath: './', 13 | 14 | 15 | // frameworks to use 16 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 17 | frameworks: ['mocha', 'sinon', 'chai'], 18 | 19 | 20 | // list of files / patterns to load in the browser 21 | files: [ 22 | 'test/index.js' 23 | ], 24 | 25 | 26 | // list of files to exclude 27 | exclude: [ 28 | 'node_modules/' 29 | ], 30 | 31 | 32 | // preprocess matching files before serving them to the browser 33 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 34 | preprocessors: { 35 | 'test/index.js': ['webpack', 'sourcemap'] 36 | }, 37 | 38 | 39 | // test results reporter to use 40 | // possible values: 'dots', 'progress' 41 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter 42 | reporters: ['dots', 'coverage'], 43 | 44 | webpack: { 45 | devtool: 'inline-source-map', 46 | module: { 47 | loaders: [ 48 | { 49 | test: /\.js?$/, 50 | exclude: /node_modules/, 51 | loader: 'babel', 52 | query: { 53 | presets: ['airbnb'] 54 | } 55 | }, 56 | { 57 | test: /\.js?$/, 58 | include: path.resolve(__dirname, 'src'), 59 | loader: 'istanbul-instrumenter', 60 | query: { 61 | esModules: true 62 | } 63 | } 64 | ] 65 | }, 66 | plugins: [ 67 | new webpack.DefinePlugin({ 68 | 'process.env.NODE_ENV': JSON.stringify('test') 69 | }) 70 | ], 71 | resolve: { 72 | extensions: ['', '.jsx', '.js'] 73 | }, 74 | externals: { 75 | 'cheerio': 'window', 76 | 'react/addons': true, 77 | 'react/lib/ExecutionEnvironment': true, 78 | 'react/lib/ReactContext': true 79 | } 80 | }, 81 | 82 | coverageReporter: { 83 | reporters: [ 84 | { type: 'text-summary' }, 85 | { type: 'html', dir: 'coverage/' }, 86 | { type: 'lcov' } 87 | ] 88 | }, 89 | 90 | webpackServer: { 91 | noInfo: true 92 | }, 93 | 94 | 95 | // web server port 96 | port: 9876, 97 | 98 | 99 | // enable / disable colors in the output (reporters and logs) 100 | colors: true, 101 | 102 | 103 | // level of logging 104 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 105 | logLevel: config.LOG_INFO, 106 | 107 | 108 | // enable / disable watching file and executing tests whenever any file changes 109 | autoWatch: false, 110 | 111 | 112 | customLaunchers: { 113 | Chrome_travis_ci: { 114 | base: 'Chrome', 115 | flags: ['--no-sandbox'] 116 | } 117 | }, 118 | 119 | 120 | // start these browsers 121 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 122 | browsers: BROWSERS, 123 | 124 | 125 | // Continuous Integration mode 126 | // if true, Karma captures browsers, runs the tests and exits 127 | singleRun: true, 128 | 129 | // Concurrency level 130 | // how many browser should be started simultaneous 131 | concurrency: Infinity 132 | }) 133 | } -------------------------------------------------------------------------------- /gruntfile.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var _ = require('lodash') 4 | var webpack = require('webpack') 5 | 6 | var mergeWebpackConfig = function (config) { 7 | // Load webpackConfig only when using `grunt:webpack` 8 | // load of grunt tasks is faster 9 | var webpackConfig = require('./webpack.config') 10 | return _.merge({}, webpackConfig, config, function (a, b) { 11 | if (_.isArray(a)) { 12 | return a.concat(b) 13 | } 14 | }) 15 | } 16 | 17 | module.exports = function (grunt) { 18 | grunt.initConfig({ 19 | pkg: grunt.file.readJSON('package.json'), 20 | sass: { 21 | min: { 22 | files: { 23 | 'dist/react-add-to-calendar.css': 'src/styles/ReactAddToCalendar.scss' 24 | }, 25 | options: { 26 | sourcemap: 'none', 27 | style: 'expanded' 28 | } 29 | }, 30 | unmin: { 31 | files: { 32 | 'dist/react-add-to-calendar.min.css': 'src/styles/ReactAddToCalendar.scss' 33 | }, 34 | options: { 35 | sourcemap: 'none', 36 | style: 'compressed' 37 | } 38 | } 39 | }, 40 | 41 | watch: { 42 | eslint: { 43 | files: ['{src,test,docs-site/src}/**/*.{js,jsx}', '*.js'], 44 | tasks: ['eslint'] 45 | }, 46 | 47 | css: { 48 | files: '**/*.scss', 49 | tasks: ['sass'] 50 | }, 51 | 52 | karma: { 53 | files: [ 54 | 'src/**/*.jsx', 55 | 'src/**/*.js', 56 | 'test/**/*.jsx', 57 | 'test/**/*.js' 58 | ], 59 | tasks: ['karma'] 60 | }, 61 | 62 | webpack: { 63 | files: ['src/**/*.js', 'src/**/*.jsx'], 64 | tasks: ['webpack'] 65 | } 66 | }, 67 | 68 | scsslint: { 69 | files: ['src/styles/*.scss', 'docs-site/src/*.scss'], 70 | options: { 71 | config: '.scss-lint.yml', 72 | colorizeOutput: true, 73 | exclude: ['docs-site/src/higlight.scss', 'docs-site/src/reset.scss'] 74 | } 75 | }, 76 | 77 | karma: { 78 | unit: { 79 | configFile: 'karma.conf.js', 80 | singleRun: true 81 | } 82 | }, 83 | 84 | eslint: { 85 | files: ['{src,test,docs-site/src}/**/*.{js,jsx}', '*.js'], 86 | options: { 87 | configFile: '.eslintrc' 88 | } 89 | }, 90 | 91 | // standalone build for ./dist 92 | webpack: { 93 | unmin: mergeWebpackConfig({ 94 | output: { 95 | filename: 'react-add-to-calendar.js' 96 | } 97 | }), 98 | min: mergeWebpackConfig({ 99 | output: { 100 | filename: 'react-add-to-calendar.min.js' 101 | }, 102 | plugins: [ 103 | new webpack.optimize.UglifyJsPlugin({ 104 | compressor: { 105 | warnings: false 106 | } 107 | }) 108 | ] 109 | }), 110 | docs: require('./webpack.docs.config') 111 | }, 112 | 113 | // source build for ./lib 114 | babel: { 115 | lib: { 116 | files: [{ 117 | expand: true, 118 | cwd: 'src/', 119 | src: ['**/*.js', '**/*.jsx'], 120 | dest: 'lib/', 121 | ext: '.js' 122 | }] 123 | } 124 | } 125 | }) 126 | 127 | grunt.loadNpmTasks('grunt-contrib-sass') 128 | grunt.loadNpmTasks('grunt-scss-lint') 129 | grunt.loadNpmTasks('grunt-contrib-watch') 130 | grunt.loadNpmTasks('grunt-babel') 131 | grunt.loadNpmTasks('grunt-webpack') 132 | grunt.loadNpmTasks('grunt-karma') 133 | grunt.loadNpmTasks('grunt-eslint') 134 | 135 | grunt.registerTask('default', ['watch', 'scsslint']) 136 | grunt.registerTask('travis', ['eslint', 'karma', 'scsslint']) 137 | grunt.registerTask('build', ['scsslint', 'babel', 'webpack', 'sass']) 138 | } 139 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Add to Calendar Button 2 | 3 | [![npm version](https://badge.fury.io/js/react-add-to-calendar.svg)](https://badge.fury.io/js/react-add-to-calendar) 4 | [![Build Status](https://travis-ci.org/jasonsalzman/react-add-to-calendar.svg?branch=master)](https://travis-ci.org/jasonsalzman/react-add-to-calendar) 5 | [![Dependency Status](https://img.shields.io/david/strongloop/express.svg?maxAge=2592000)](https://david-dm.org/jasonsalzman/react-add-to-calendar) 6 | [![Peer Dependency Status](https://img.shields.io/david/peer/webcomponents/generator-element.svg?maxAge=2592000)](https://david-dm.org/jasonsalzman/react-add-to-calendar) 7 | [![codecov](https://codecov.io/gh/jasonsalzman/react-add-to-calendar/branch/master/graph/badge.svg)](https://codecov.io/gh/jasonsalzman/react-add-to-calendar) 8 | [![Downloads](http://img.shields.io/npm/dm/react-add-to-calendar.svg)](https://npmjs.org/package/react-add-to-calendar) 9 | 10 | A simple, customizable, and reusable Add to Calendar button component for React ([Demo](https://jasonsalzman.github.io/react-add-to-calendar/)) 11 | 12 | ## Installation 13 | 14 | The package can be installed via NPM: 15 | 16 | ``` 17 | npm install react-add-to-calendar --save 18 | ``` 19 | 20 | You’ll need to install React and Moment separately since they are not included in the package. Below is a simple example on how to use the Add to Calendar button in a React view. 21 | 22 | ```js 23 | import React from 'react'; 24 | import AddToCalendar from 'react-add-to-calendar'; 25 | 26 | class Example extends React.Component { 27 | static displayName = 'Example'; 28 | state = { 29 | event: { 30 | title: 'Sample Event', 31 | description: 'This is the sample event provided as an example only', 32 | location: 'Portland, OR', 33 | startTime: '2016-09-16T20:15:00-04:00', 34 | endTime: '2016-09-16T21:45:00-04:00' 35 | } 36 | }; 37 | 38 | render() { 39 | return ; 40 | }; 41 | } 42 | ``` 43 | 44 | ## Configuration 45 | 46 | The most basic use of the Add to Calendar button can be described with: 47 | 48 | ```js 49 | let event = { 50 | title: 'Sample Event', 51 | description: 'This is the sample event provided as an example only', 52 | location: 'Portland, OR', 53 | startTime: '2016-09-16T20:15:00-04:00', 54 | endTime: '2016-09-16T21:45:00-04:00' 55 | } 56 | 57 | 58 | ``` 59 | 60 | See [here](https://github.com/jasonsalzman/react-add-to-calendar/blob/master/docs/ReactAddToCalendar.md) for a full list of props that may be passed to the component. Examples are given on the [main website](https://jasonsalzman.github.io/react-add-to-calendar). 61 | 62 | ## Compatibility 63 | 64 | ### React 65 | 66 | I'll do my best to stay compatible with the latest version of React. I can't guarantee support for all older versions of React. 67 | 68 | Latest compatible versions: 69 | - React 16.2.0 or newer 70 | 71 | ### Browser Support 72 | 73 | The Add to Calendar button is compatible with the latest versions of Chrome, Firefox, Safari, and IE10+. 74 | 75 | Unfortunately it is difficult to support legacy browsers while maintaining the ability to develop new features in the future. For IE9 support, it is known that the [classlist polyfill](https://www.npmjs.com/package/classlist-polyfill) is needed, but this may change or break at any point in the future. 76 | 77 | ## Local Development 78 | 79 | The `master` branch contains the latest version of the Add to Calendar component. To start your example app, you can run `npm start`. This starts a simple webserver on http://localhost:8080. 80 | 81 | You can run `npm test` to execute the test suite and linters. To help you develop the component I’ve set up some tests that covers the basic functionality (can be found in `/tests`). I highly recommend you add tests when you’re adding new functionality. 82 | 83 | ### The examples 84 | The examples are hosted within the docs folder and are ran in the simple add that loads the Add to Calendar button. To extend the examples with a new example, you can simply duplicate one of the existing examples and change the unique properties of your example. 85 | 86 | ## License 87 | 88 | Copyright (c) 2016-2017 Jason Salzman. Licensed under MIT license, see [LICENSE](LICENSE) for the full license. 89 | -------------------------------------------------------------------------------- /.scss-lint.yml: -------------------------------------------------------------------------------- 1 | # Documentation about rules https://github.com/causes/scss-lint/blob/master/lib/scss_lint/linter/README.md 2 | 3 | scss_files: "**/*.scss" 4 | 5 | linters: 6 | BangFormat: 7 | enabled: true 8 | 9 | BemDepth: 10 | enabled: false 11 | max_elements: 1 12 | 13 | BorderZero: 14 | enabled: false 15 | 16 | ChainedClasses: 17 | enabled: false 18 | 19 | ColorKeyword: 20 | enabled: true 21 | 22 | ColorVariable: 23 | enabled: false 24 | 25 | Comment: 26 | enabled: false 27 | 28 | DebugStatement: 29 | enabled: true 30 | 31 | DeclarationOrder: 32 | enabled: true 33 | 34 | DisableLinterReason: 35 | enabled: false 36 | 37 | DuplicateProperty: 38 | enabled: true 39 | 40 | ElsePlacement: 41 | enabled: true 42 | style: same_line 43 | 44 | EmptyLineBetweenBlocks: 45 | enabled: true 46 | ignore_single_line_blocks: true 47 | 48 | EmptyRule: 49 | enabled: true 50 | 51 | ExtendDirective: 52 | enabled: false 53 | 54 | FinalNewline: 55 | enabled: true 56 | present: true 57 | 58 | HexLength: 59 | enaled: true 60 | style: short 61 | 62 | HexNotation: 63 | enabled: true 64 | style: lowercase 65 | 66 | HexValidation: 67 | enabled: true 68 | 69 | IdSelector: 70 | enabled: true 71 | 72 | ImportantRule: 73 | enabled: true 74 | 75 | ImportPath: 76 | enabled: true 77 | leading_underscore: false 78 | filename_extension: false 79 | 80 | Indentation: 81 | enabled: true 82 | allow_non_nested_indentation: false 83 | character: space # or 'tab' 84 | width: 4 85 | 86 | LeadingZero: 87 | enabled: true 88 | style: exclude_zero 89 | 90 | MergeableSelector: 91 | enabled: true 92 | force_nesting: true 93 | 94 | NameFormat: 95 | enabled: false 96 | convention: BEM 97 | 98 | NestingDepth: 99 | enabled: true 100 | max_depth: 6 101 | 102 | PlaceholderInExtend: 103 | enabled: true 104 | 105 | PropertyCount: 106 | enabled: false 107 | 108 | PropertySortOrder: 109 | enabled: false 110 | 111 | PropertySpelling: 112 | enabled: true 113 | 114 | PropertyUnits: 115 | enabled: true 116 | global: [ 117 | 'ch', 'em', 'ex', 'rem', # Font-relative lengths 118 | 'cm', 'in', 'mm', 'pc', 'pt', 'px', 'q', # Absolute lengths 119 | 'vh', 'vw', 'vmin', 'vmax', # Viewport-percentage lengths 120 | 'deg', 'grad', 'rad', 'turn', # Angle 121 | 'ms', 's', # Duration 122 | 'Hz', 'kHz', # Frequency 123 | 'dpi', 'dpcm', 'dppx', # Resolution 124 | '%'] # Other 125 | 126 | PseudoElement: 127 | enabled: true 128 | 129 | QualifyingElement: 130 | enabled: true 131 | allow_element_with_attribute: false 132 | allow_element_with_class: false 133 | allow_element_with_id: false 134 | 135 | SelectorDepth: 136 | enabled: true 137 | max_depth: 5 138 | 139 | SelectorFormat: 140 | enalbed: true 141 | convention: hyphenated_BEM 142 | 143 | Shorthand: 144 | enabled: true 145 | 146 | SingleLinePerProperty: 147 | enabled: true 148 | 149 | SingleLinePerSelector: 150 | enabled: true 151 | 152 | SpaceAfterComma: 153 | enabled: true 154 | style: one_space 155 | 156 | SpaceAfterPropertyColon: 157 | enabled: true 158 | style: one_space 159 | 160 | SpaceAfterPropertyName: 161 | enabled: true 162 | 163 | SpaceAfterVariableName: 164 | enabled: true 165 | 166 | SpaceAroundOperator: 167 | enabled: true 168 | style: one_space 169 | 170 | SpaceBeforeBrace: 171 | enabled: true 172 | style: space 173 | allow_single_line_padding: false 174 | 175 | SpaceBetweenParens: 176 | enabled: true 177 | spaces: 0 178 | 179 | StringQuotes: 180 | enabled: true 181 | style: double_quotes # or single_quotes 182 | 183 | TrailingSemicolon: 184 | enabled: true 185 | 186 | TrailingWhitespace: 187 | enabled: true 188 | 189 | TrailingZero: 190 | enabled: true 191 | 192 | TransitionAll: 193 | enabled: false 194 | 195 | UnnecessaryMantissa: 196 | enabled: true 197 | 198 | UnnecessaryParentReference: 199 | enabled: true 200 | 201 | UrlFormat: 202 | enabled: true 203 | 204 | UrlQuotes: 205 | enabled: true 206 | 207 | VariableForProperty: 208 | enabled: false 209 | 210 | VendorPrefix: 211 | enabled: false 212 | 213 | ZeroUnit: 214 | enabled: true 215 | 216 | Compass::*: 217 | enabled: false 218 | -------------------------------------------------------------------------------- /src/helpers/index.js: -------------------------------------------------------------------------------- 1 | import moment from "moment"; 2 | 3 | export default class helpers { 4 | getRandomKey() { 5 | let n = Math.floor(Math.random() * 999999999999).toString(); 6 | return new Date().getTime().toString() + "_" + n; 7 | } 8 | 9 | formatTime(date) { 10 | let formattedDate = moment.utc(date).format("YYYYMMDDTHHmmssZ"); 11 | return formattedDate.replace("+00:00", "Z"); 12 | } 13 | 14 | calculateDuration(startTime, endTime) { 15 | // snag parameters and format properly in UTC 16 | let end = moment.utc(endTime).format("DD/MM/YYYY HH:mm:ss"); 17 | let start = moment.utc(startTime).format("DD/MM/YYYY HH:mm:ss"); 18 | 19 | // calculate the difference in milliseconds between the start and end times 20 | let difference = moment(end, "DD/MM/YYYY HH:mm:ss").diff( 21 | moment(start, "DD/MM/YYYY HH:mm:ss") 22 | ); 23 | 24 | // convert difference from above to a proper momentJs duration object 25 | let duration = moment.duration(difference); 26 | 27 | return ( 28 | Math.floor(duration.asHours()) + moment.utc(difference).format(":mm") 29 | ); 30 | } 31 | 32 | buildUrl(event, type, isCrappyIE) { 33 | let calendarUrl = ""; 34 | 35 | // allow mobile browsers to open the gmail data URI within native calendar app 36 | // type = (type == "google" && this.isMobile()) ? "outlook" : type; 37 | 38 | switch (type) { 39 | case "google": 40 | calendarUrl = "https://calendar.google.com/calendar/render"; 41 | calendarUrl += "?action=TEMPLATE"; 42 | calendarUrl += "&dates=" + this.formatTime(event.startTime); 43 | calendarUrl += "/" + this.formatTime(event.endTime); 44 | calendarUrl += "&location=" + encodeURIComponent(event.location); 45 | calendarUrl += "&text=" + encodeURIComponent(event.title); 46 | calendarUrl += "&details=" + encodeURIComponent(event.description); 47 | break; 48 | 49 | case "yahoo": 50 | // yahoo doesn't utilize endTime so we need to calulate duration 51 | let duration = this.calculateDuration(event.startTime, event.endTime); 52 | calendarUrl = "https://calendar.yahoo.com/?v=60&view=d&type=20"; 53 | calendarUrl += "&title=" + encodeURIComponent(event.title); 54 | calendarUrl += "&st=" + this.formatTime(event.startTime); 55 | calendarUrl += "&dur=" + duration; 56 | calendarUrl += "&desc=" + encodeURIComponent(event.description); 57 | calendarUrl += "&in_loc=" + encodeURIComponent(event.location); 58 | break; 59 | 60 | case "outlookcom": 61 | calendarUrl = "https://outlook.live.com/owa/?rru=addevent"; 62 | calendarUrl += "&startdt=" + this.formatTime(event.startTime); 63 | calendarUrl += "&enddt=" + this.formatTime(event.endTime); 64 | calendarUrl += "&subject=" + encodeURIComponent(event.title); 65 | calendarUrl += "&location=" + encodeURIComponent(event.location); 66 | calendarUrl += "&body=" + encodeURIComponent(event.description); 67 | calendarUrl += "&allday=false"; 68 | calendarUrl += "&uid=" + this.getRandomKey(); 69 | calendarUrl += "&path=/calendar/view/Month"; 70 | break; 71 | 72 | default: 73 | calendarUrl = [ 74 | "BEGIN:VCALENDAR", 75 | "VERSION:2.0", 76 | "BEGIN:VEVENT", 77 | "URL:" + document.URL, 78 | "DTSTART:" + this.formatTime(event.startTime), 79 | "DTEND:" + this.formatTime(event.endTime), 80 | "SUMMARY:" + event.title, 81 | "DESCRIPTION:" + event.description, 82 | "LOCATION:" + event.location, 83 | "END:VEVENT", 84 | "END:VCALENDAR" 85 | ].join("\n"); 86 | 87 | if (!isCrappyIE && this.isMobile()) { 88 | calendarUrl = encodeURI( 89 | "data:text/calendar;charset=utf8," + calendarUrl 90 | ); 91 | } 92 | } 93 | 94 | return calendarUrl; 95 | } 96 | 97 | // determine if a mobile browser is being used 98 | isMobile() { 99 | let mobile = false; 100 | 101 | (function(a) { 102 | if ( 103 | /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test( 104 | a 105 | ) || 106 | /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test( 107 | a.substr(0, 4) 108 | ) 109 | ) 110 | mobile = true; 111 | })(window.navigator.userAgent || window.navigator.vendor || window.opera); 112 | 113 | return mobile; 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /src/ReactAddToCalendar.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | import helpersClass from "./helpers"; 5 | const helpers = new helpersClass(); 6 | 7 | export default class ReactAddToCalendar extends React.Component { 8 | constructor(props) { 9 | super(props); 10 | 11 | this.state = { 12 | optionsOpen: props.optionsOpen || false, 13 | isCrappyIE: false 14 | }; 15 | 16 | this.toggleCalendarDropdown = this.toggleCalendarDropdown.bind(this); 17 | this.handleDropdownLinkClick = this.handleDropdownLinkClick.bind(this); 18 | } 19 | 20 | componentWillMount() { 21 | // polyfill for startsWith to fix IE bug 22 | if (!String.prototype.startsWith) { 23 | String.prototype.startsWith = function(searchString, position) { 24 | position = position || 0; 25 | return this.indexOf(searchString, position) === position; 26 | }; 27 | } 28 | 29 | let isCrappyIE = false; 30 | if ( 31 | typeof window !== "undefined" && 32 | window.navigator.msSaveOrOpenBlob && 33 | window.Blob 34 | ) { 35 | isCrappyIE = true; 36 | } 37 | 38 | this.setState({ isCrappyIE: isCrappyIE }); 39 | } 40 | 41 | toggleCalendarDropdown() { 42 | let showOptions = !this.state.optionsOpen; 43 | 44 | if (showOptions) { 45 | document.addEventListener("click", this.toggleCalendarDropdown, false); 46 | } else { 47 | document.removeEventListener("click", this.toggleCalendarDropdown); 48 | } 49 | 50 | this.setState({ optionsOpen: showOptions }); 51 | } 52 | 53 | handleDropdownLinkClick(e) { 54 | e.preventDefault(); 55 | let url = e.currentTarget.getAttribute("href"); 56 | 57 | if ( 58 | !helpers.isMobile() && 59 | (url.startsWith("data") || url.startsWith("BEGIN")) 60 | ) { 61 | let filename = "download.ics"; 62 | let blob = new Blob([url], { type: "text/calendar;charset=utf-8" }); 63 | 64 | if (this.state.isCrappyIE) { 65 | window.navigator.msSaveOrOpenBlob(blob, filename); 66 | } else { 67 | /**************************************************************** 68 | // many browsers do not properly support downloading data URIs 69 | // (even with "download" attribute in use) so this solution 70 | // ensures the event will download cross-browser 71 | ****************************************************************/ 72 | let link = document.createElement("a"); 73 | link.href = window.URL.createObjectURL(blob); 74 | link.setAttribute("download", filename); 75 | document.body.appendChild(link); 76 | link.click(); 77 | document.body.removeChild(link); 78 | } 79 | } else { 80 | window.open(url, "_blank"); 81 | } 82 | 83 | this.toggleCalendarDropdown(); 84 | } 85 | 86 | renderDropdown() { 87 | let self = this; 88 | 89 | let items = this.props.listItems.map(listItem => { 90 | let currentItem = Object.keys(listItem)[0]; 91 | let currentLabel = listItem[currentItem]; 92 | 93 | let icon = null; 94 | if (self.props.displayItemIcons) { 95 | let currentIcon = 96 | currentItem === "outlook" || currentItem === "outlookcom" 97 | ? "windows" 98 | : currentItem; 99 | icon = ; 100 | } 101 | 102 | return ( 103 |
  • 104 | 114 | {icon} 115 | {currentLabel} 116 | 117 |
  • 118 | ); 119 | }); 120 | 121 | return ( 122 |
    123 |
      {items}
    124 |
    125 | ); 126 | } 127 | 128 | renderButton() { 129 | let buttonLabel = this.props.buttonLabel; 130 | let buttonIcon = null; 131 | let template = Object.keys(this.props.buttonTemplate); 132 | 133 | if (template[0] !== "textOnly") { 134 | const iconPlacement = this.props.buttonTemplate[template]; 135 | const buttonClassPrefix = 136 | this.props.buttonIconClass === "react-add-to-calendar__icon--" 137 | ? `${this.props.buttonIconClass}${iconPlacement}` 138 | : this.props.buttonIconClass; 139 | const iconPrefix = this.props.useFontAwesomeIcons ? "fa fa-" : ""; 140 | 141 | const mainButtonIconClass = 142 | template[0] === "caret" 143 | ? this.state.optionsOpen ? "caret-up" : "caret-down" 144 | : template[0]; 145 | 146 | let buttonIconClass = `${buttonClassPrefix} ${iconPrefix}${mainButtonIconClass}`; 147 | 148 | buttonIcon = ; 149 | buttonLabel = 150 | iconPlacement === "right" ? ( 151 | 152 | {buttonLabel + " "} 153 | {buttonIcon} 154 | 155 | ) : ( 156 | 157 | {buttonIcon} 158 | {" " + buttonLabel} 159 | 160 | ); 161 | } 162 | 163 | let buttonClass = this.state.optionsOpen 164 | ? this.props.buttonClassClosed + " " + this.props.buttonClassOpen 165 | : this.props.buttonClassClosed; 166 | 167 | return ( 168 | 173 | ); 174 | } 175 | 176 | render() { 177 | let options = null; 178 | if (this.state.optionsOpen) { 179 | options = this.renderDropdown(); 180 | } 181 | 182 | let addToCalendarBtn = null; 183 | if (this.props.event) { 184 | addToCalendarBtn = this.renderButton(); 185 | } 186 | 187 | return ( 188 |
    189 | {addToCalendarBtn} 190 | {options} 191 |
    192 | ); 193 | } 194 | } 195 | 196 | ReactAddToCalendar.displayName = "Add To Calendar"; 197 | 198 | ReactAddToCalendar.propTypes = { 199 | buttonClassClosed: PropTypes.string, 200 | buttonClassOpen: PropTypes.string, 201 | buttonLabel: PropTypes.string, 202 | buttonTemplate: PropTypes.object, 203 | buttonIconClass: PropTypes.string, 204 | useFontAwesomeIcons: PropTypes.bool, 205 | buttonWrapperClass: PropTypes.string, 206 | displayItemIcons: PropTypes.bool, 207 | optionsOpen: PropTypes.bool, 208 | dropdownClass: PropTypes.string, 209 | event: PropTypes.shape({ 210 | title: PropTypes.string, 211 | description: PropTypes.string, 212 | location: PropTypes.string, 213 | startTime: PropTypes.string, 214 | endTime: PropTypes.string 215 | }).isRequired, 216 | listItems: PropTypes.arrayOf(PropTypes.object), 217 | rootClass: PropTypes.string 218 | }; 219 | 220 | ReactAddToCalendar.defaultProps = { 221 | buttonClassClosed: "react-add-to-calendar__button", 222 | buttonClassOpen: "react-add-to-calendar__button--light", 223 | buttonLabel: "Add to My Calendar", 224 | buttonTemplate: { caret: "right" }, 225 | buttonIconClass: "react-add-to-calendar__icon--", 226 | useFontAwesomeIcons: true, 227 | buttonWrapperClass: "react-add-to-calendar__wrapper", 228 | displayItemIcons: true, 229 | optionsOpen: false, 230 | dropdownClass: "react-add-to-calendar__dropdown", 231 | event: { 232 | title: "Sample Event", 233 | description: "This is the sample event provided as an example only", 234 | location: "Portland, OR", 235 | startTime: "2016-09-16T20:15:00-04:00", 236 | endTime: "2016-09-16T21:45:00-04:00" 237 | }, 238 | listItems: [ 239 | { apple: "Apple Calendar" }, 240 | { google: "Google" }, 241 | { outlook: "Outlook" }, 242 | { outlookcom: "Outlook.com" }, 243 | { yahoo: "Yahoo" } 244 | ], 245 | rootClass: "react-add-to-calendar" 246 | }; 247 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "standard", 3 | 4 | "ecmaFeatures": { 5 | "arrowFunctions": true, // enable arrow functions 6 | "binaryLiterals": false, // enable binary literals 7 | "blockBindings": true, // enable let and const (aka block bindings) 8 | "classes": true, // enable classes 9 | "defaultParams": true, // enable default function parameters 10 | "destructuring": true, // enable destructuring 11 | "forOf": true, // enable for-of loops 12 | "generators": false, // enable generators 13 | "modules": true, // enable modules and global strict mode 14 | "objectLiteralComputedProperties": true, // enable computed object literal property names 15 | "objectLiteralDuplicateProperties": true, // enable duplicate object literal properties in strict mode 16 | "objectLiteralShorthandMethods": true, // enable object literal shorthand methods 17 | "objectLiteralShorthandProperties": true, // enable object literal shorthand properties 18 | "octalLiterals": false, // enable octal literals 19 | "regexUFlag": false, // enable the regular expression u flag 20 | "regexYFlag": false, // enable the regular expression y flag 21 | "restParams": false, // enable the rest parameters 22 | "spread": true, // enable the spread operator 23 | "superInFunctions": true, // enable super references inside of functions 24 | "templateStrings": true, // enable template strings 25 | "unicodeCodePointEscapes": false, // enable code point escapes 26 | "globalReturn": false, // allow return statements in the global scope 27 | "jsx": true // enable JSX 28 | }, 29 | 30 | "env": { 31 | "browser": true, // browser global variables 32 | "node": true, // Node.js global variables and Node.js-specific rules 33 | "mocha": true, // adds all of the Mocha testing global variables 34 | "es6": true, 35 | }, 36 | 37 | "plugins": [ 38 | "react" 39 | ], 40 | 41 | "parser": null, 42 | "rules": { 43 | "comma-dangle": 0, // disallow trailing commas in object literals 44 | "no-cond-assign": 0, // disallow assignment in conditional expressions 45 | "no-console": 0, // disallow use of console (off by default in the node environment) 46 | "no-constant-condition": 0, // disallow use of constant expressions in conditions 47 | "no-control-regex": 0, // disallow control characters in regular expressions 48 | "no-debugger": 0, // disallow use of debugger 49 | "no-dupe-args": 0, // disallow duplicate arguments in functions 50 | "no-dupe-keys": 0, // disallow duplicate keys when creating object literals 51 | "no-duplicate-case": 0, // disallow a duplicate case label 52 | "no-empty-character-class": 0, // disallow the use of empty character classes in regular expressions 53 | "no-empty": 0, // disallow empty statements 54 | "no-ex-assign": 0, // disallow assigning to the exception in a catch block 55 | "no-extra-boolean-cast": 0, // disallow double-negation boolean casts in a boolean context 56 | "no-extra-parens": 0, // disallow unnecessary parentheses (off by default) 57 | "no-extra-semi": 0, // disallow unnecessary semicolons 58 | "no-func-assign": 0, // disallow overwriting functions written as function declarations 59 | "no-inner-declarations": 0, // disallow function or variable declarations in nested blocks 60 | "no-invalid-regexp": 0, // disallow invalid regular expression strings in the RegExp constructor 61 | "no-irregular-whitespace": 0, // disallow irregular whitespace outside of strings and comments 62 | "no-negated-in-lhs": 0, // disallow negation of the left operand of an in expression 63 | "no-obj-calls": 0, // disallow the use of object properties of the global object (Math and JSON) as functions 64 | "no-regex-spaces": 0, // disallow multiple spaces in a regular expression literal 65 | "no-reserved-keys": 0, // disallow reserved words being used as object literal keys (off by default) 66 | "no-sparse-arrays": 0, // disallow sparse arrays 67 | "no-unreachable": 0, // disallow unreachable statements after a return, throw, continue, or break statement 68 | "no-useless-escape": 0, // disallow useless escape rule 69 | "use-isnan": 0, // disallow comparisons with the value NaN 70 | "valid-jsdoc": 0, // Ensure JSDoc comments are valid (off by default) 71 | "valid-typeof": 0, // Ensure that the results of typeof are compared against a valid string 72 | "no-unexpected-multiline": 0, // Avoid code that looks like two expressions but is actually one (off by default) 73 | 74 | "accessor-pairs": 0, // enforces getter/setter pairs in objects (off by default) 75 | "block-scoped-var": 0, // treat var statements as if they were block scoped (off by default) 76 | "complexity": 0, // specify the maximum cyclomatic complexity allowed in a program (off by default) 77 | "consistent-return": 0, // require return statements to either always or never specify values 78 | "curly": 0, // specify curly brace conventions for all control statements 79 | "default-case": 0, // require default case in switch statements (off by default) 80 | "dot-notation": 0, // encourages use of dot notation whenever possible 81 | "dot-location": 0, // enforces consistent newlines before or after dots (off by default) 82 | "eqeqeq": 0, // require the use of === and !== 83 | "guard-for-in": 0, // make sure for-in loops have an if statement (off by default) 84 | "no-alert": 0, // disallow the use of alert, confirm, and prompt 85 | "no-caller": 0, // disallow use of arguments.caller or arguments.callee 86 | "no-div-regex": 0, // disallow division operators explicitly at beginning of regular expression (off by default) 87 | "no-else-return": 0, // disallow else after a return in an if (off by default) 88 | "no-empty-label": 0, // disallow use of labels for anything other then loops and switches 89 | "no-eq-null": 0, // disallow comparisons to null without a type-checking operator (off by default) 90 | "no-eval": 0, // disallow use of eval() 91 | "no-extend-native": 0, // disallow adding to native types 92 | "no-extra-bind": 0, // disallow unnecessary function binding 93 | "no-fallthrough": 0, // disallow fallthrough of case statements 94 | "no-floating-decimal": 0, // disallow the use of leading or trailing decimal points in numeric literals (off by default) 95 | "no-implied-eval": 0, // disallow use of eval()-like methods 96 | "no-iterator": 0, // disallow usage of __iterator__ property 97 | "no-labels": 0, // disallow use of labeled statements 98 | "no-lone-blocks": 0, // disallow unnecessary nested blocks 99 | "no-loop-func": 0, // disallow creation of functions within loops 100 | "no-multi-spaces": 0, // disallow use of multiple spaces 101 | "no-multi-str": 0, // disallow use of multiline strings 102 | "no-native-reassign": 0, // disallow reassignments of native objects 103 | "no-new-func": 0, // disallow use of new operator for Function object 104 | "no-new-wrappers": 0, // disallows creating new instances of String, Number, and Boolean 105 | "no-new": 0, // disallow use of new operator when not part of the assignment or comparison 106 | "no-octal-escape": 0, // disallow use of octal escape sequences in string literals, such as var foo = "Copyright \251"; 107 | "no-octal": 0, // disallow use of octal literals 108 | "no-param-reassign": 0, // disallow reassignment of function parameters (off by default) 109 | "no-process-env": 0, // disallow use of process.env (off by default) 110 | "no-proto": 0, // disallow usage of __proto__ property 111 | "no-redeclare": 0, // disallow declaring the same variable more then once 112 | "no-return-assign": 0, // disallow use of assignment in return statement 113 | "no-script-url": 0, // disallow use of javascript: urls 114 | "no-self-compare": 0, // disallow comparisons where both sides are exactly the same (off by default) 115 | "no-sequences": 0, // disallow use of comma operator 116 | "no-throw-literal": 0, // restrict what can be thrown as an exception (off by default) 117 | "no-unused-expressions": 0, // disallow usage of expressions in statement position 118 | "no-void": 0, // disallow use of void operator (off by default) 119 | "no-warning-comments": 0, // disallow usage of configurable warning terms in comments, e.g. TODO or FIXME (off by default) 120 | "no-with": 0, // disallow use of the with statement 121 | "radix": 0, // require use of the second argument for parseInt() (off by default) 122 | "vars-on-top": 0, // requires to declare all vars on top of their containing scope (off by default) 123 | "wrap-iife": 0, // require immediate function invocation to be wrapped in parentheses (off by default) 124 | "yoda": 0, // require or disallow Yoda conditions 125 | 126 | "strict": 0, // controls location of Use Strict Directives 127 | 128 | "no-catch-shadow": 0, // disallow the catch clause parameter name being the same as a variable in the outer scope (off by default in the node environment) 129 | "no-delete-var": 0, // disallow deletion of variables 130 | "no-label-var": 0, // disallow labels that share a name with a variable 131 | "no-shadow": 0, // disallow declaration of variables already declared in the outer scope 132 | "no-shadow-restricted-names": 0, // disallow shadowing of names such as arguments 133 | "no-undef": 0, // disallow use of undeclared variables unless mentioned in a /*global */ block 134 | "no-undef-init": 0, // disallow use of undefined when initializing variables 135 | "no-undefined": 0, // disallow use of undefined variable (off by default) 136 | "no-unused-vars": 0, // disallow declaration of variables that are not used in the code 137 | "no-use-before-define": 0, // disallow use of variables before they are defined 138 | 139 | "handle-callback-err": 0, // enforces error handling in callbacks (off by default) (on by default in the node environment) 140 | "no-mixed-requires": 0, // disallow mixing regular variable and require declarations (off by default) (on by default in the node environment) 141 | "no-new-require": 0, // disallow use of new operator with the require function (off by default) (on by default in the node environment) 142 | "no-path-concat": 0, // disallow string concatenation with __dirname and __filename (off by default) (on by default in the node environment) 143 | "no-process-exit": 0, // disallow process.exit() (on by default in the node environment) 144 | "no-restricted-modules": 0, // restrict usage of specified node modules (off by default) 145 | "no-sync": 0, // disallow use of synchronous methods (off by default) 146 | 147 | "array-bracket-spacing": 0, // enforce spacing inside array brackets (off by default) 148 | "brace-style": 0, // enforce one true brace style (off by default) 149 | "camelcase": 0, // require camel case names 150 | "comma-spacing": 0, // enforce spacing before and after comma 151 | "comma-style": 0, // enforce one true comma style (off by default) 152 | "computed-property-spacing": 0, // require or disallow padding inside computed properties (off by default) 153 | "consistent-this": 0, // enforces consistent naming when capturing the current execution context (off by default) 154 | "eol-last": 0, // enforce newline at the end of file, with no multiple empty lines 155 | "func-names": 0, // require function expressions to have a name (off by default) 156 | "func-style": 0, // enforces use of function declarations or expressions (off by default) 157 | "indent": 0, // this option sets a specific tab width for your code (off by default) 158 | "key-spacing": 0, // enforces spacing between keys and values in object literal properties 159 | "lines-around-comment": 0, // enforces empty lines around comments (off by default) 160 | "linebreak-style": 0, // disallow mixed 'LF' and 'CRLF' as linebreaks (off by default) 161 | "max-nested-callbacks": 0, // specify the maximum depth callbacks can be nested (off by default) 162 | "new-cap": 0, // require a capital letter for constructors 163 | "new-parens": 0, // disallow the omission of parentheses when invoking a constructor with no arguments 164 | "newline-after-var": 0, // allow/disallow an empty newline after var statement (off by default) 165 | "no-array-constructor": 0, // disallow use of the Array constructor 166 | "no-continue": 0, // disallow use of the continue statement (off by default) 167 | "no-inline-comments": 0, // disallow comments inline after code (off by default) 168 | "no-lonely-if": 0, // disallow if as the only statement in an else block (off by default) 169 | "no-mixed-spaces-and-tabs": 0, // disallow mixed spaces and tabs for indentation 170 | "no-multiple-empty-lines": 0, // disallow multiple empty lines (off by default) 171 | "no-nested-ternary": 0, // disallow nested ternary expressions (off by default) 172 | "no-new-object": 0, // disallow use of the Object constructor 173 | "no-spaced-func": 0, // disallow space between function identifier and application 174 | "no-ternary": 0, // disallow the use of ternary operators (off by default) 175 | "no-trailing-spaces": 0, // disallow trailing whitespace at the end of lines 176 | "no-underscore-dangle": 0, // disallow dangling underscores in identifiers 177 | "one-var": 0, // allow just one var statement per function (off by default) 178 | "operator-assignment": 0, // require assignment operator shorthand where possible or prohibit it entirely (off by default) 179 | "operator-linebreak": 0, // enforce operators to be placed before or after line breaks (off by default) 180 | "padded-blocks": 0, // enforce padding within blocks (off by default) 181 | "quote-props": 0, // require quotes around object literal property names (off by default) 182 | "quotes": 0, // specify whether double or single quotes should be used 183 | "semi-spacing": 0, // enforce spacing before and after semicolons 184 | "semi": 0, // require or disallow use of semicolons instead of ASI 185 | "sort-vars": 0, // sort variables within the same declaration block (off by default) 186 | "space-after-keywords": 0, // require a space after certain keywords (off by default) 187 | "space-before-blocks": 0, // require or disallow space before blocks (off by default) 188 | "space-before-function-paren": 0, // require or disallow space before function opening parenthesis (off by default) 189 | "space-in-parens": 0, // require or disallow spaces inside parentheses (off by default) 190 | "space-infix-ops": 0, // require spaces around operators 191 | "space-return-throw-case": 0, // require a space after return, throw, and case 192 | "space-unary-ops": 0, // require or disallow spaces before/after unary operators (words on by default, nonwords off by default) 193 | "spaced-comment": 0, // require or disallow a space immediately following the // or /* in a comment (off by default) 194 | "wrap-regex": 0, // require regex literals to be wrapped in parentheses (off by default) 195 | 196 | "constructor-super": 0, // verify super() callings in constructors (off by default) 197 | "generator-star-spacing": 0, // enforce the spacing around the * in generator functions (off by default) 198 | "no-this-before-super": 0, // disallow to use this/super before super() calling in constructors (off by default) 199 | "no-var": 0, // require let or const instead of var (off by default) 200 | "object-shorthand": 0, // require method and property shorthand syntax for object literals (off by default) 201 | "prefer-const": 0, // suggest using of const declaration for variables that are never modified after declared (off by default) 202 | 203 | "max-depth": 0, // specify the maximum depth that blocks can be nested (off by default) 204 | "max-len": 0, // specify the maximum length of a line in your program (off by default) 205 | "max-params": 0, // limits the number of parameters that can be used in the function declaration. (off by default) 206 | "max-statements": 0, // specify the maximum number of statement allowed in a function (off by default) 207 | "no-bitwise": 0, // disallow use of bitwise operators (off by default) 208 | "no-plusplus": 0, // disallow use of unary operators, ++ and -- (off by default) 209 | 210 | "react/display-name": 2, 211 | "react/forbid-prop-types": 0, 212 | "react/jsx-boolean-value": 2, 213 | "react/jsx-closing-bracket-location": 0, 214 | "react/jsx-curly-spacing": [2, "never"], 215 | "react/jsx-indent-props": 0, 216 | "react/jsx-key": 2, 217 | "react/jsx-max-props-per-line": [2, { "maximum": 4 }], 218 | "react/jsx-no-duplicate-props": 2, 219 | "react/jsx-no-literals": 0, 220 | "react/jsx-no-undef": 2, 221 | "react/jsx-pascal-case": 2, 222 | "react/jsx-sort-prop-types": 0, 223 | "react/jsx-sort-props": 0, 224 | "react/jsx-uses-react": 2, 225 | "react/jsx-uses-vars": 2, 226 | "react/no-danger": 2, 227 | "react/no-deprecated": 2, 228 | "react/no-did-mount-set-state": 2, 229 | "react/no-did-update-set-state": 2, 230 | "react/no-direct-mutation-state": 2, 231 | "react/no-multi-comp": 2, 232 | "react/no-set-state": 0, 233 | "react/no-unknown-property": 2, 234 | "react/prefer-es6-class": 0, 235 | "react/prop-types": 2, 236 | "react/react-in-jsx-scope": 2, 237 | "react/require-extension": 0, 238 | "react/self-closing-comp": 2, 239 | "react/sort-comp": 2, 240 | "react/wrap-multilines": 0 241 | } 242 | } 243 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_variables.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | // -------------------------- 3 | 4 | /*$fa-font-path: "../fonts" !default;*/ 5 | $fa-font-size-base: 14px !default; 6 | $fa-line-height-base: 1 !default; 7 | $fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts" !default; // for referencing Bootstrap CDN font files directly 8 | $fa-css-prefix: fa !default; 9 | $fa-version: "4.6.3" !default; 10 | $fa-border-color: #eee !default; 11 | $fa-inverse: #fff !default; 12 | $fa-li-width: (30em / 14) !default; 13 | 14 | $fa-var-500px: "\f26e"; 15 | $fa-var-adjust: "\f042"; 16 | $fa-var-adn: "\f170"; 17 | $fa-var-align-center: "\f037"; 18 | $fa-var-align-justify: "\f039"; 19 | $fa-var-align-left: "\f036"; 20 | $fa-var-align-right: "\f038"; 21 | $fa-var-amazon: "\f270"; 22 | $fa-var-ambulance: "\f0f9"; 23 | $fa-var-american-sign-language-interpreting: "\f2a3"; 24 | $fa-var-anchor: "\f13d"; 25 | $fa-var-android: "\f17b"; 26 | $fa-var-angellist: "\f209"; 27 | $fa-var-angle-double-down: "\f103"; 28 | $fa-var-angle-double-left: "\f100"; 29 | $fa-var-angle-double-right: "\f101"; 30 | $fa-var-angle-double-up: "\f102"; 31 | $fa-var-angle-down: "\f107"; 32 | $fa-var-angle-left: "\f104"; 33 | $fa-var-angle-right: "\f105"; 34 | $fa-var-angle-up: "\f106"; 35 | $fa-var-apple: "\f179"; 36 | $fa-var-archive: "\f187"; 37 | $fa-var-area-chart: "\f1fe"; 38 | $fa-var-arrow-circle-down: "\f0ab"; 39 | $fa-var-arrow-circle-left: "\f0a8"; 40 | $fa-var-arrow-circle-o-down: "\f01a"; 41 | $fa-var-arrow-circle-o-left: "\f190"; 42 | $fa-var-arrow-circle-o-right: "\f18e"; 43 | $fa-var-arrow-circle-o-up: "\f01b"; 44 | $fa-var-arrow-circle-right: "\f0a9"; 45 | $fa-var-arrow-circle-up: "\f0aa"; 46 | $fa-var-arrow-down: "\f063"; 47 | $fa-var-arrow-left: "\f060"; 48 | $fa-var-arrow-right: "\f061"; 49 | $fa-var-arrow-up: "\f062"; 50 | $fa-var-arrows: "\f047"; 51 | $fa-var-arrows-alt: "\f0b2"; 52 | $fa-var-arrows-h: "\f07e"; 53 | $fa-var-arrows-v: "\f07d"; 54 | $fa-var-asl-interpreting: "\f2a3"; 55 | $fa-var-assistive-listening-systems: "\f2a2"; 56 | $fa-var-asterisk: "\f069"; 57 | $fa-var-at: "\f1fa"; 58 | $fa-var-audio-description: "\f29e"; 59 | $fa-var-automobile: "\f1b9"; 60 | $fa-var-backward: "\f04a"; 61 | $fa-var-balance-scale: "\f24e"; 62 | $fa-var-ban: "\f05e"; 63 | $fa-var-bank: "\f19c"; 64 | $fa-var-bar-chart: "\f080"; 65 | $fa-var-bar-chart-o: "\f080"; 66 | $fa-var-barcode: "\f02a"; 67 | $fa-var-bars: "\f0c9"; 68 | $fa-var-battery-0: "\f244"; 69 | $fa-var-battery-1: "\f243"; 70 | $fa-var-battery-2: "\f242"; 71 | $fa-var-battery-3: "\f241"; 72 | $fa-var-battery-4: "\f240"; 73 | $fa-var-battery-empty: "\f244"; 74 | $fa-var-battery-full: "\f240"; 75 | $fa-var-battery-half: "\f242"; 76 | $fa-var-battery-quarter: "\f243"; 77 | $fa-var-battery-three-quarters: "\f241"; 78 | $fa-var-bed: "\f236"; 79 | $fa-var-beer: "\f0fc"; 80 | $fa-var-behance: "\f1b4"; 81 | $fa-var-behance-square: "\f1b5"; 82 | $fa-var-bell: "\f0f3"; 83 | $fa-var-bell-o: "\f0a2"; 84 | $fa-var-bell-slash: "\f1f6"; 85 | $fa-var-bell-slash-o: "\f1f7"; 86 | $fa-var-bicycle: "\f206"; 87 | $fa-var-binoculars: "\f1e5"; 88 | $fa-var-birthday-cake: "\f1fd"; 89 | $fa-var-bitbucket: "\f171"; 90 | $fa-var-bitbucket-square: "\f172"; 91 | $fa-var-bitcoin: "\f15a"; 92 | $fa-var-black-tie: "\f27e"; 93 | $fa-var-blind: "\f29d"; 94 | $fa-var-bluetooth: "\f293"; 95 | $fa-var-bluetooth-b: "\f294"; 96 | $fa-var-bold: "\f032"; 97 | $fa-var-bolt: "\f0e7"; 98 | $fa-var-bomb: "\f1e2"; 99 | $fa-var-book: "\f02d"; 100 | $fa-var-bookmark: "\f02e"; 101 | $fa-var-bookmark-o: "\f097"; 102 | $fa-var-braille: "\f2a1"; 103 | $fa-var-briefcase: "\f0b1"; 104 | $fa-var-btc: "\f15a"; 105 | $fa-var-bug: "\f188"; 106 | $fa-var-building: "\f1ad"; 107 | $fa-var-building-o: "\f0f7"; 108 | $fa-var-bullhorn: "\f0a1"; 109 | $fa-var-bullseye: "\f140"; 110 | $fa-var-bus: "\f207"; 111 | $fa-var-buysellads: "\f20d"; 112 | $fa-var-cab: "\f1ba"; 113 | $fa-var-calculator: "\f1ec"; 114 | $fa-var-calendar: "\f073"; 115 | $fa-var-calendar-check-o: "\f274"; 116 | $fa-var-calendar-minus-o: "\f272"; 117 | $fa-var-calendar-o: "\f133"; 118 | $fa-var-calendar-plus-o: "\f271"; 119 | $fa-var-calendar-times-o: "\f273"; 120 | $fa-var-camera: "\f030"; 121 | $fa-var-camera-retro: "\f083"; 122 | $fa-var-car: "\f1b9"; 123 | $fa-var-caret-down: "\f0d7"; 124 | $fa-var-caret-left: "\f0d9"; 125 | $fa-var-caret-right: "\f0da"; 126 | $fa-var-caret-square-o-down: "\f150"; 127 | $fa-var-caret-square-o-left: "\f191"; 128 | $fa-var-caret-square-o-right: "\f152"; 129 | $fa-var-caret-square-o-up: "\f151"; 130 | $fa-var-caret-up: "\f0d8"; 131 | $fa-var-cart-arrow-down: "\f218"; 132 | $fa-var-cart-plus: "\f217"; 133 | $fa-var-cc: "\f20a"; 134 | $fa-var-cc-amex: "\f1f3"; 135 | $fa-var-cc-diners-club: "\f24c"; 136 | $fa-var-cc-discover: "\f1f2"; 137 | $fa-var-cc-jcb: "\f24b"; 138 | $fa-var-cc-mastercard: "\f1f1"; 139 | $fa-var-cc-paypal: "\f1f4"; 140 | $fa-var-cc-stripe: "\f1f5"; 141 | $fa-var-cc-visa: "\f1f0"; 142 | $fa-var-certificate: "\f0a3"; 143 | $fa-var-chain: "\f0c1"; 144 | $fa-var-chain-broken: "\f127"; 145 | $fa-var-check: "\f00c"; 146 | $fa-var-check-circle: "\f058"; 147 | $fa-var-check-circle-o: "\f05d"; 148 | $fa-var-check-square: "\f14a"; 149 | $fa-var-check-square-o: "\f046"; 150 | $fa-var-chevron-circle-down: "\f13a"; 151 | $fa-var-chevron-circle-left: "\f137"; 152 | $fa-var-chevron-circle-right: "\f138"; 153 | $fa-var-chevron-circle-up: "\f139"; 154 | $fa-var-chevron-down: "\f078"; 155 | $fa-var-chevron-left: "\f053"; 156 | $fa-var-chevron-right: "\f054"; 157 | $fa-var-chevron-up: "\f077"; 158 | $fa-var-child: "\f1ae"; 159 | $fa-var-chrome: "\f268"; 160 | $fa-var-circle: "\f111"; 161 | $fa-var-circle-o: "\f10c"; 162 | $fa-var-circle-o-notch: "\f1ce"; 163 | $fa-var-circle-thin: "\f1db"; 164 | $fa-var-clipboard: "\f0ea"; 165 | $fa-var-clock-o: "\f017"; 166 | $fa-var-clone: "\f24d"; 167 | $fa-var-close: "\f00d"; 168 | $fa-var-cloud: "\f0c2"; 169 | $fa-var-cloud-download: "\f0ed"; 170 | $fa-var-cloud-upload: "\f0ee"; 171 | $fa-var-cny: "\f157"; 172 | $fa-var-code: "\f121"; 173 | $fa-var-code-fork: "\f126"; 174 | $fa-var-codepen: "\f1cb"; 175 | $fa-var-codiepie: "\f284"; 176 | $fa-var-coffee: "\f0f4"; 177 | $fa-var-cog: "\f013"; 178 | $fa-var-cogs: "\f085"; 179 | $fa-var-columns: "\f0db"; 180 | $fa-var-comment: "\f075"; 181 | $fa-var-comment-o: "\f0e5"; 182 | $fa-var-commenting: "\f27a"; 183 | $fa-var-commenting-o: "\f27b"; 184 | $fa-var-comments: "\f086"; 185 | $fa-var-comments-o: "\f0e6"; 186 | $fa-var-compass: "\f14e"; 187 | $fa-var-compress: "\f066"; 188 | $fa-var-connectdevelop: "\f20e"; 189 | $fa-var-contao: "\f26d"; 190 | $fa-var-copy: "\f0c5"; 191 | $fa-var-copyright: "\f1f9"; 192 | $fa-var-creative-commons: "\f25e"; 193 | $fa-var-credit-card: "\f09d"; 194 | $fa-var-credit-card-alt: "\f283"; 195 | $fa-var-crop: "\f125"; 196 | $fa-var-crosshairs: "\f05b"; 197 | $fa-var-css3: "\f13c"; 198 | $fa-var-cube: "\f1b2"; 199 | $fa-var-cubes: "\f1b3"; 200 | $fa-var-cut: "\f0c4"; 201 | $fa-var-cutlery: "\f0f5"; 202 | $fa-var-dashboard: "\f0e4"; 203 | $fa-var-dashcube: "\f210"; 204 | $fa-var-database: "\f1c0"; 205 | $fa-var-deaf: "\f2a4"; 206 | $fa-var-deafness: "\f2a4"; 207 | $fa-var-dedent: "\f03b"; 208 | $fa-var-delicious: "\f1a5"; 209 | $fa-var-desktop: "\f108"; 210 | $fa-var-deviantart: "\f1bd"; 211 | $fa-var-diamond: "\f219"; 212 | $fa-var-digg: "\f1a6"; 213 | $fa-var-dollar: "\f155"; 214 | $fa-var-dot-circle-o: "\f192"; 215 | $fa-var-download: "\f019"; 216 | $fa-var-dribbble: "\f17d"; 217 | $fa-var-dropbox: "\f16b"; 218 | $fa-var-drupal: "\f1a9"; 219 | $fa-var-edge: "\f282"; 220 | $fa-var-edit: "\f044"; 221 | $fa-var-eject: "\f052"; 222 | $fa-var-ellipsis-h: "\f141"; 223 | $fa-var-ellipsis-v: "\f142"; 224 | $fa-var-empire: "\f1d1"; 225 | $fa-var-envelope: "\f0e0"; 226 | $fa-var-envelope-o: "\f003"; 227 | $fa-var-envelope-square: "\f199"; 228 | $fa-var-envira: "\f299"; 229 | $fa-var-eraser: "\f12d"; 230 | $fa-var-eur: "\f153"; 231 | $fa-var-euro: "\f153"; 232 | $fa-var-exchange: "\f0ec"; 233 | $fa-var-exclamation: "\f12a"; 234 | $fa-var-exclamation-circle: "\f06a"; 235 | $fa-var-exclamation-triangle: "\f071"; 236 | $fa-var-expand: "\f065"; 237 | $fa-var-expeditedssl: "\f23e"; 238 | $fa-var-external-link: "\f08e"; 239 | $fa-var-external-link-square: "\f14c"; 240 | $fa-var-eye: "\f06e"; 241 | $fa-var-eye-slash: "\f070"; 242 | $fa-var-eyedropper: "\f1fb"; 243 | $fa-var-fa: "\f2b4"; 244 | $fa-var-facebook: "\f09a"; 245 | $fa-var-facebook-f: "\f09a"; 246 | $fa-var-facebook-official: "\f230"; 247 | $fa-var-facebook-square: "\f082"; 248 | $fa-var-fast-backward: "\f049"; 249 | $fa-var-fast-forward: "\f050"; 250 | $fa-var-fax: "\f1ac"; 251 | $fa-var-feed: "\f09e"; 252 | $fa-var-female: "\f182"; 253 | $fa-var-fighter-jet: "\f0fb"; 254 | $fa-var-file: "\f15b"; 255 | $fa-var-file-archive-o: "\f1c6"; 256 | $fa-var-file-audio-o: "\f1c7"; 257 | $fa-var-file-code-o: "\f1c9"; 258 | $fa-var-file-excel-o: "\f1c3"; 259 | $fa-var-file-image-o: "\f1c5"; 260 | $fa-var-file-movie-o: "\f1c8"; 261 | $fa-var-file-o: "\f016"; 262 | $fa-var-file-pdf-o: "\f1c1"; 263 | $fa-var-file-photo-o: "\f1c5"; 264 | $fa-var-file-picture-o: "\f1c5"; 265 | $fa-var-file-powerpoint-o: "\f1c4"; 266 | $fa-var-file-sound-o: "\f1c7"; 267 | $fa-var-file-text: "\f15c"; 268 | $fa-var-file-text-o: "\f0f6"; 269 | $fa-var-file-video-o: "\f1c8"; 270 | $fa-var-file-word-o: "\f1c2"; 271 | $fa-var-file-zip-o: "\f1c6"; 272 | $fa-var-files-o: "\f0c5"; 273 | $fa-var-film: "\f008"; 274 | $fa-var-filter: "\f0b0"; 275 | $fa-var-fire: "\f06d"; 276 | $fa-var-fire-extinguisher: "\f134"; 277 | $fa-var-firefox: "\f269"; 278 | $fa-var-first-order: "\f2b0"; 279 | $fa-var-flag: "\f024"; 280 | $fa-var-flag-checkered: "\f11e"; 281 | $fa-var-flag-o: "\f11d"; 282 | $fa-var-flash: "\f0e7"; 283 | $fa-var-flask: "\f0c3"; 284 | $fa-var-flickr: "\f16e"; 285 | $fa-var-floppy-o: "\f0c7"; 286 | $fa-var-folder: "\f07b"; 287 | $fa-var-folder-o: "\f114"; 288 | $fa-var-folder-open: "\f07c"; 289 | $fa-var-folder-open-o: "\f115"; 290 | $fa-var-font: "\f031"; 291 | $fa-var-font-awesome: "\f2b4"; 292 | $fa-var-fonticons: "\f280"; 293 | $fa-var-fort-awesome: "\f286"; 294 | $fa-var-forumbee: "\f211"; 295 | $fa-var-forward: "\f04e"; 296 | $fa-var-foursquare: "\f180"; 297 | $fa-var-frown-o: "\f119"; 298 | $fa-var-futbol-o: "\f1e3"; 299 | $fa-var-gamepad: "\f11b"; 300 | $fa-var-gavel: "\f0e3"; 301 | $fa-var-gbp: "\f154"; 302 | $fa-var-ge: "\f1d1"; 303 | $fa-var-gear: "\f013"; 304 | $fa-var-gears: "\f085"; 305 | $fa-var-genderless: "\f22d"; 306 | $fa-var-get-pocket: "\f265"; 307 | $fa-var-gg: "\f260"; 308 | $fa-var-gg-circle: "\f261"; 309 | $fa-var-gift: "\f06b"; 310 | $fa-var-git: "\f1d3"; 311 | $fa-var-git-square: "\f1d2"; 312 | $fa-var-github: "\f09b"; 313 | $fa-var-github-alt: "\f113"; 314 | $fa-var-github-square: "\f092"; 315 | $fa-var-gitlab: "\f296"; 316 | $fa-var-gittip: "\f184"; 317 | $fa-var-glass: "\f000"; 318 | $fa-var-glide: "\f2a5"; 319 | $fa-var-glide-g: "\f2a6"; 320 | $fa-var-globe: "\f0ac"; 321 | $fa-var-google: "\f1a0"; 322 | $fa-var-google-plus: "\f0d5"; 323 | $fa-var-google-plus-circle: "\f2b3"; 324 | $fa-var-google-plus-official: "\f2b3"; 325 | $fa-var-google-plus-square: "\f0d4"; 326 | $fa-var-google-wallet: "\f1ee"; 327 | $fa-var-graduation-cap: "\f19d"; 328 | $fa-var-gratipay: "\f184"; 329 | $fa-var-group: "\f0c0"; 330 | $fa-var-h-square: "\f0fd"; 331 | $fa-var-hacker-news: "\f1d4"; 332 | $fa-var-hand-grab-o: "\f255"; 333 | $fa-var-hand-lizard-o: "\f258"; 334 | $fa-var-hand-o-down: "\f0a7"; 335 | $fa-var-hand-o-left: "\f0a5"; 336 | $fa-var-hand-o-right: "\f0a4"; 337 | $fa-var-hand-o-up: "\f0a6"; 338 | $fa-var-hand-paper-o: "\f256"; 339 | $fa-var-hand-peace-o: "\f25b"; 340 | $fa-var-hand-pointer-o: "\f25a"; 341 | $fa-var-hand-rock-o: "\f255"; 342 | $fa-var-hand-scissors-o: "\f257"; 343 | $fa-var-hand-spock-o: "\f259"; 344 | $fa-var-hand-stop-o: "\f256"; 345 | $fa-var-hard-of-hearing: "\f2a4"; 346 | $fa-var-hashtag: "\f292"; 347 | $fa-var-hdd-o: "\f0a0"; 348 | $fa-var-header: "\f1dc"; 349 | $fa-var-headphones: "\f025"; 350 | $fa-var-heart: "\f004"; 351 | $fa-var-heart-o: "\f08a"; 352 | $fa-var-heartbeat: "\f21e"; 353 | $fa-var-history: "\f1da"; 354 | $fa-var-home: "\f015"; 355 | $fa-var-hospital-o: "\f0f8"; 356 | $fa-var-hotel: "\f236"; 357 | $fa-var-hourglass: "\f254"; 358 | $fa-var-hourglass-1: "\f251"; 359 | $fa-var-hourglass-2: "\f252"; 360 | $fa-var-hourglass-3: "\f253"; 361 | $fa-var-hourglass-end: "\f253"; 362 | $fa-var-hourglass-half: "\f252"; 363 | $fa-var-hourglass-o: "\f250"; 364 | $fa-var-hourglass-start: "\f251"; 365 | $fa-var-houzz: "\f27c"; 366 | $fa-var-html5: "\f13b"; 367 | $fa-var-i-cursor: "\f246"; 368 | $fa-var-ils: "\f20b"; 369 | $fa-var-image: "\f03e"; 370 | $fa-var-inbox: "\f01c"; 371 | $fa-var-indent: "\f03c"; 372 | $fa-var-industry: "\f275"; 373 | $fa-var-info: "\f129"; 374 | $fa-var-info-circle: "\f05a"; 375 | $fa-var-inr: "\f156"; 376 | $fa-var-instagram: "\f16d"; 377 | $fa-var-institution: "\f19c"; 378 | $fa-var-internet-explorer: "\f26b"; 379 | $fa-var-intersex: "\f224"; 380 | $fa-var-ioxhost: "\f208"; 381 | $fa-var-italic: "\f033"; 382 | $fa-var-joomla: "\f1aa"; 383 | $fa-var-jpy: "\f157"; 384 | $fa-var-jsfiddle: "\f1cc"; 385 | $fa-var-key: "\f084"; 386 | $fa-var-keyboard-o: "\f11c"; 387 | $fa-var-krw: "\f159"; 388 | $fa-var-language: "\f1ab"; 389 | $fa-var-laptop: "\f109"; 390 | $fa-var-lastfm: "\f202"; 391 | $fa-var-lastfm-square: "\f203"; 392 | $fa-var-leaf: "\f06c"; 393 | $fa-var-leanpub: "\f212"; 394 | $fa-var-legal: "\f0e3"; 395 | $fa-var-lemon-o: "\f094"; 396 | $fa-var-level-down: "\f149"; 397 | $fa-var-level-up: "\f148"; 398 | $fa-var-life-bouy: "\f1cd"; 399 | $fa-var-life-buoy: "\f1cd"; 400 | $fa-var-life-ring: "\f1cd"; 401 | $fa-var-life-saver: "\f1cd"; 402 | $fa-var-lightbulb-o: "\f0eb"; 403 | $fa-var-line-chart: "\f201"; 404 | $fa-var-link: "\f0c1"; 405 | $fa-var-linkedin: "\f0e1"; 406 | $fa-var-linkedin-square: "\f08c"; 407 | $fa-var-linux: "\f17c"; 408 | $fa-var-list: "\f03a"; 409 | $fa-var-list-alt: "\f022"; 410 | $fa-var-list-ol: "\f0cb"; 411 | $fa-var-list-ul: "\f0ca"; 412 | $fa-var-location-arrow: "\f124"; 413 | $fa-var-lock: "\f023"; 414 | $fa-var-long-arrow-down: "\f175"; 415 | $fa-var-long-arrow-left: "\f177"; 416 | $fa-var-long-arrow-right: "\f178"; 417 | $fa-var-long-arrow-up: "\f176"; 418 | $fa-var-low-vision: "\f2a8"; 419 | $fa-var-magic: "\f0d0"; 420 | $fa-var-magnet: "\f076"; 421 | $fa-var-mail-forward: "\f064"; 422 | $fa-var-mail-reply: "\f112"; 423 | $fa-var-mail-reply-all: "\f122"; 424 | $fa-var-male: "\f183"; 425 | $fa-var-map: "\f279"; 426 | $fa-var-map-marker: "\f041"; 427 | $fa-var-map-o: "\f278"; 428 | $fa-var-map-pin: "\f276"; 429 | $fa-var-map-signs: "\f277"; 430 | $fa-var-mars: "\f222"; 431 | $fa-var-mars-double: "\f227"; 432 | $fa-var-mars-stroke: "\f229"; 433 | $fa-var-mars-stroke-h: "\f22b"; 434 | $fa-var-mars-stroke-v: "\f22a"; 435 | $fa-var-maxcdn: "\f136"; 436 | $fa-var-meanpath: "\f20c"; 437 | $fa-var-medium: "\f23a"; 438 | $fa-var-medkit: "\f0fa"; 439 | $fa-var-meh-o: "\f11a"; 440 | $fa-var-mercury: "\f223"; 441 | $fa-var-microphone: "\f130"; 442 | $fa-var-microphone-slash: "\f131"; 443 | $fa-var-minus: "\f068"; 444 | $fa-var-minus-circle: "\f056"; 445 | $fa-var-minus-square: "\f146"; 446 | $fa-var-minus-square-o: "\f147"; 447 | $fa-var-mixcloud: "\f289"; 448 | $fa-var-mobile: "\f10b"; 449 | $fa-var-mobile-phone: "\f10b"; 450 | $fa-var-modx: "\f285"; 451 | $fa-var-money: "\f0d6"; 452 | $fa-var-moon-o: "\f186"; 453 | $fa-var-mortar-board: "\f19d"; 454 | $fa-var-motorcycle: "\f21c"; 455 | $fa-var-mouse-pointer: "\f245"; 456 | $fa-var-music: "\f001"; 457 | $fa-var-navicon: "\f0c9"; 458 | $fa-var-neuter: "\f22c"; 459 | $fa-var-newspaper-o: "\f1ea"; 460 | $fa-var-object-group: "\f247"; 461 | $fa-var-object-ungroup: "\f248"; 462 | $fa-var-odnoklassniki: "\f263"; 463 | $fa-var-odnoklassniki-square: "\f264"; 464 | $fa-var-opencart: "\f23d"; 465 | $fa-var-openid: "\f19b"; 466 | $fa-var-opera: "\f26a"; 467 | $fa-var-optin-monster: "\f23c"; 468 | $fa-var-outdent: "\f03b"; 469 | $fa-var-pagelines: "\f18c"; 470 | $fa-var-paint-brush: "\f1fc"; 471 | $fa-var-paper-plane: "\f1d8"; 472 | $fa-var-paper-plane-o: "\f1d9"; 473 | $fa-var-paperclip: "\f0c6"; 474 | $fa-var-paragraph: "\f1dd"; 475 | $fa-var-paste: "\f0ea"; 476 | $fa-var-pause: "\f04c"; 477 | $fa-var-pause-circle: "\f28b"; 478 | $fa-var-pause-circle-o: "\f28c"; 479 | $fa-var-paw: "\f1b0"; 480 | $fa-var-paypal: "\f1ed"; 481 | $fa-var-pencil: "\f040"; 482 | $fa-var-pencil-square: "\f14b"; 483 | $fa-var-pencil-square-o: "\f044"; 484 | $fa-var-percent: "\f295"; 485 | $fa-var-phone: "\f095"; 486 | $fa-var-phone-square: "\f098"; 487 | $fa-var-photo: "\f03e"; 488 | $fa-var-picture-o: "\f03e"; 489 | $fa-var-pie-chart: "\f200"; 490 | $fa-var-pied-piper: "\f2ae"; 491 | $fa-var-pied-piper-alt: "\f1a8"; 492 | $fa-var-pied-piper-pp: "\f1a7"; 493 | $fa-var-pinterest: "\f0d2"; 494 | $fa-var-pinterest-p: "\f231"; 495 | $fa-var-pinterest-square: "\f0d3"; 496 | $fa-var-plane: "\f072"; 497 | $fa-var-play: "\f04b"; 498 | $fa-var-play-circle: "\f144"; 499 | $fa-var-play-circle-o: "\f01d"; 500 | $fa-var-plug: "\f1e6"; 501 | $fa-var-plus: "\f067"; 502 | $fa-var-plus-circle: "\f055"; 503 | $fa-var-plus-square: "\f0fe"; 504 | $fa-var-plus-square-o: "\f196"; 505 | $fa-var-power-off: "\f011"; 506 | $fa-var-print: "\f02f"; 507 | $fa-var-product-hunt: "\f288"; 508 | $fa-var-puzzle-piece: "\f12e"; 509 | $fa-var-qq: "\f1d6"; 510 | $fa-var-qrcode: "\f029"; 511 | $fa-var-question: "\f128"; 512 | $fa-var-question-circle: "\f059"; 513 | $fa-var-question-circle-o: "\f29c"; 514 | $fa-var-quote-left: "\f10d"; 515 | $fa-var-quote-right: "\f10e"; 516 | $fa-var-ra: "\f1d0"; 517 | $fa-var-random: "\f074"; 518 | $fa-var-rebel: "\f1d0"; 519 | $fa-var-recycle: "\f1b8"; 520 | $fa-var-reddit: "\f1a1"; 521 | $fa-var-reddit-alien: "\f281"; 522 | $fa-var-reddit-square: "\f1a2"; 523 | $fa-var-refresh: "\f021"; 524 | $fa-var-registered: "\f25d"; 525 | $fa-var-remove: "\f00d"; 526 | $fa-var-renren: "\f18b"; 527 | $fa-var-reorder: "\f0c9"; 528 | $fa-var-repeat: "\f01e"; 529 | $fa-var-reply: "\f112"; 530 | $fa-var-reply-all: "\f122"; 531 | $fa-var-resistance: "\f1d0"; 532 | $fa-var-retweet: "\f079"; 533 | $fa-var-rmb: "\f157"; 534 | $fa-var-road: "\f018"; 535 | $fa-var-rocket: "\f135"; 536 | $fa-var-rotate-left: "\f0e2"; 537 | $fa-var-rotate-right: "\f01e"; 538 | $fa-var-rouble: "\f158"; 539 | $fa-var-rss: "\f09e"; 540 | $fa-var-rss-square: "\f143"; 541 | $fa-var-rub: "\f158"; 542 | $fa-var-ruble: "\f158"; 543 | $fa-var-rupee: "\f156"; 544 | $fa-var-safari: "\f267"; 545 | $fa-var-save: "\f0c7"; 546 | $fa-var-scissors: "\f0c4"; 547 | $fa-var-scribd: "\f28a"; 548 | $fa-var-search: "\f002"; 549 | $fa-var-search-minus: "\f010"; 550 | $fa-var-search-plus: "\f00e"; 551 | $fa-var-sellsy: "\f213"; 552 | $fa-var-send: "\f1d8"; 553 | $fa-var-send-o: "\f1d9"; 554 | $fa-var-server: "\f233"; 555 | $fa-var-share: "\f064"; 556 | $fa-var-share-alt: "\f1e0"; 557 | $fa-var-share-alt-square: "\f1e1"; 558 | $fa-var-share-square: "\f14d"; 559 | $fa-var-share-square-o: "\f045"; 560 | $fa-var-shekel: "\f20b"; 561 | $fa-var-sheqel: "\f20b"; 562 | $fa-var-shield: "\f132"; 563 | $fa-var-ship: "\f21a"; 564 | $fa-var-shirtsinbulk: "\f214"; 565 | $fa-var-shopping-bag: "\f290"; 566 | $fa-var-shopping-basket: "\f291"; 567 | $fa-var-shopping-cart: "\f07a"; 568 | $fa-var-sign-in: "\f090"; 569 | $fa-var-sign-language: "\f2a7"; 570 | $fa-var-sign-out: "\f08b"; 571 | $fa-var-signal: "\f012"; 572 | $fa-var-signing: "\f2a7"; 573 | $fa-var-simplybuilt: "\f215"; 574 | $fa-var-sitemap: "\f0e8"; 575 | $fa-var-skyatlas: "\f216"; 576 | $fa-var-skype: "\f17e"; 577 | $fa-var-slack: "\f198"; 578 | $fa-var-sliders: "\f1de"; 579 | $fa-var-slideshare: "\f1e7"; 580 | $fa-var-smile-o: "\f118"; 581 | $fa-var-snapchat: "\f2ab"; 582 | $fa-var-snapchat-ghost: "\f2ac"; 583 | $fa-var-snapchat-square: "\f2ad"; 584 | $fa-var-soccer-ball-o: "\f1e3"; 585 | $fa-var-sort: "\f0dc"; 586 | $fa-var-sort-alpha-asc: "\f15d"; 587 | $fa-var-sort-alpha-desc: "\f15e"; 588 | $fa-var-sort-amount-asc: "\f160"; 589 | $fa-var-sort-amount-desc: "\f161"; 590 | $fa-var-sort-asc: "\f0de"; 591 | $fa-var-sort-desc: "\f0dd"; 592 | $fa-var-sort-down: "\f0dd"; 593 | $fa-var-sort-numeric-asc: "\f162"; 594 | $fa-var-sort-numeric-desc: "\f163"; 595 | $fa-var-sort-up: "\f0de"; 596 | $fa-var-soundcloud: "\f1be"; 597 | $fa-var-space-shuttle: "\f197"; 598 | $fa-var-spinner: "\f110"; 599 | $fa-var-spoon: "\f1b1"; 600 | $fa-var-spotify: "\f1bc"; 601 | $fa-var-square: "\f0c8"; 602 | $fa-var-square-o: "\f096"; 603 | $fa-var-stack-exchange: "\f18d"; 604 | $fa-var-stack-overflow: "\f16c"; 605 | $fa-var-star: "\f005"; 606 | $fa-var-star-half: "\f089"; 607 | $fa-var-star-half-empty: "\f123"; 608 | $fa-var-star-half-full: "\f123"; 609 | $fa-var-star-half-o: "\f123"; 610 | $fa-var-star-o: "\f006"; 611 | $fa-var-steam: "\f1b6"; 612 | $fa-var-steam-square: "\f1b7"; 613 | $fa-var-step-backward: "\f048"; 614 | $fa-var-step-forward: "\f051"; 615 | $fa-var-stethoscope: "\f0f1"; 616 | $fa-var-sticky-note: "\f249"; 617 | $fa-var-sticky-note-o: "\f24a"; 618 | $fa-var-stop: "\f04d"; 619 | $fa-var-stop-circle: "\f28d"; 620 | $fa-var-stop-circle-o: "\f28e"; 621 | $fa-var-street-view: "\f21d"; 622 | $fa-var-strikethrough: "\f0cc"; 623 | $fa-var-stumbleupon: "\f1a4"; 624 | $fa-var-stumbleupon-circle: "\f1a3"; 625 | $fa-var-subscript: "\f12c"; 626 | $fa-var-subway: "\f239"; 627 | $fa-var-suitcase: "\f0f2"; 628 | $fa-var-sun-o: "\f185"; 629 | $fa-var-superscript: "\f12b"; 630 | $fa-var-support: "\f1cd"; 631 | $fa-var-table: "\f0ce"; 632 | $fa-var-tablet: "\f10a"; 633 | $fa-var-tachometer: "\f0e4"; 634 | $fa-var-tag: "\f02b"; 635 | $fa-var-tags: "\f02c"; 636 | $fa-var-tasks: "\f0ae"; 637 | $fa-var-taxi: "\f1ba"; 638 | $fa-var-television: "\f26c"; 639 | $fa-var-tencent-weibo: "\f1d5"; 640 | $fa-var-terminal: "\f120"; 641 | $fa-var-text-height: "\f034"; 642 | $fa-var-text-width: "\f035"; 643 | $fa-var-th: "\f00a"; 644 | $fa-var-th-large: "\f009"; 645 | $fa-var-th-list: "\f00b"; 646 | $fa-var-themeisle: "\f2b2"; 647 | $fa-var-thumb-tack: "\f08d"; 648 | $fa-var-thumbs-down: "\f165"; 649 | $fa-var-thumbs-o-down: "\f088"; 650 | $fa-var-thumbs-o-up: "\f087"; 651 | $fa-var-thumbs-up: "\f164"; 652 | $fa-var-ticket: "\f145"; 653 | $fa-var-times: "\f00d"; 654 | $fa-var-times-circle: "\f057"; 655 | $fa-var-times-circle-o: "\f05c"; 656 | $fa-var-tint: "\f043"; 657 | $fa-var-toggle-down: "\f150"; 658 | $fa-var-toggle-left: "\f191"; 659 | $fa-var-toggle-off: "\f204"; 660 | $fa-var-toggle-on: "\f205"; 661 | $fa-var-toggle-right: "\f152"; 662 | $fa-var-toggle-up: "\f151"; 663 | $fa-var-trademark: "\f25c"; 664 | $fa-var-train: "\f238"; 665 | $fa-var-transgender: "\f224"; 666 | $fa-var-transgender-alt: "\f225"; 667 | $fa-var-trash: "\f1f8"; 668 | $fa-var-trash-o: "\f014"; 669 | $fa-var-tree: "\f1bb"; 670 | $fa-var-trello: "\f181"; 671 | $fa-var-tripadvisor: "\f262"; 672 | $fa-var-trophy: "\f091"; 673 | $fa-var-truck: "\f0d1"; 674 | $fa-var-try: "\f195"; 675 | $fa-var-tty: "\f1e4"; 676 | $fa-var-tumblr: "\f173"; 677 | $fa-var-tumblr-square: "\f174"; 678 | $fa-var-turkish-lira: "\f195"; 679 | $fa-var-tv: "\f26c"; 680 | $fa-var-twitch: "\f1e8"; 681 | $fa-var-twitter: "\f099"; 682 | $fa-var-twitter-square: "\f081"; 683 | $fa-var-umbrella: "\f0e9"; 684 | $fa-var-underline: "\f0cd"; 685 | $fa-var-undo: "\f0e2"; 686 | $fa-var-universal-access: "\f29a"; 687 | $fa-var-university: "\f19c"; 688 | $fa-var-unlink: "\f127"; 689 | $fa-var-unlock: "\f09c"; 690 | $fa-var-unlock-alt: "\f13e"; 691 | $fa-var-unsorted: "\f0dc"; 692 | $fa-var-upload: "\f093"; 693 | $fa-var-usb: "\f287"; 694 | $fa-var-usd: "\f155"; 695 | $fa-var-user: "\f007"; 696 | $fa-var-user-md: "\f0f0"; 697 | $fa-var-user-plus: "\f234"; 698 | $fa-var-user-secret: "\f21b"; 699 | $fa-var-user-times: "\f235"; 700 | $fa-var-users: "\f0c0"; 701 | $fa-var-venus: "\f221"; 702 | $fa-var-venus-double: "\f226"; 703 | $fa-var-venus-mars: "\f228"; 704 | $fa-var-viacoin: "\f237"; 705 | $fa-var-viadeo: "\f2a9"; 706 | $fa-var-viadeo-square: "\f2aa"; 707 | $fa-var-video-camera: "\f03d"; 708 | $fa-var-vimeo: "\f27d"; 709 | $fa-var-vimeo-square: "\f194"; 710 | $fa-var-vine: "\f1ca"; 711 | $fa-var-vk: "\f189"; 712 | $fa-var-volume-control-phone: "\f2a0"; 713 | $fa-var-volume-down: "\f027"; 714 | $fa-var-volume-off: "\f026"; 715 | $fa-var-volume-up: "\f028"; 716 | $fa-var-warning: "\f071"; 717 | $fa-var-wechat: "\f1d7"; 718 | $fa-var-weibo: "\f18a"; 719 | $fa-var-weixin: "\f1d7"; 720 | $fa-var-whatsapp: "\f232"; 721 | $fa-var-wheelchair: "\f193"; 722 | $fa-var-wheelchair-alt: "\f29b"; 723 | $fa-var-wifi: "\f1eb"; 724 | $fa-var-wikipedia-w: "\f266"; 725 | $fa-var-windows: "\f17a"; 726 | $fa-var-won: "\f159"; 727 | $fa-var-wordpress: "\f19a"; 728 | $fa-var-wpbeginner: "\f297"; 729 | $fa-var-wpforms: "\f298"; 730 | $fa-var-wrench: "\f0ad"; 731 | $fa-var-xing: "\f168"; 732 | $fa-var-xing-square: "\f169"; 733 | $fa-var-y-combinator: "\f23b"; 734 | $fa-var-y-combinator-square: "\f1d4"; 735 | $fa-var-yahoo: "\f19e"; 736 | $fa-var-yc: "\f23b"; 737 | $fa-var-yc-square: "\f1d4"; 738 | $fa-var-yelp: "\f1e9"; 739 | $fa-var-yen: "\f157"; 740 | $fa-var-yoast: "\f2b1"; 741 | $fa-var-youtube: "\f167"; 742 | $fa-var-youtube-play: "\f16a"; 743 | $fa-var-youtube-square: "\f166"; 744 | 745 | -------------------------------------------------------------------------------- /src/styles/font-awesome/_icons.scss: -------------------------------------------------------------------------------- 1 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 2 | readers do not read off random characters that represent icons */ 3 | 4 | .#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } 5 | .#{$fa-css-prefix}-music:before { content: $fa-var-music; } 6 | .#{$fa-css-prefix}-search:before { content: $fa-var-search; } 7 | .#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } 8 | .#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } 9 | .#{$fa-css-prefix}-star:before { content: $fa-var-star; } 10 | .#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } 11 | .#{$fa-css-prefix}-user:before { content: $fa-var-user; } 12 | .#{$fa-css-prefix}-film:before { content: $fa-var-film; } 13 | .#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } 14 | .#{$fa-css-prefix}-th:before { content: $fa-var-th; } 15 | .#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } 16 | .#{$fa-css-prefix}-check:before { content: $fa-var-check; } 17 | .#{$fa-css-prefix}-remove:before, 18 | .#{$fa-css-prefix}-close:before, 19 | .#{$fa-css-prefix}-times:before { content: $fa-var-times; } 20 | .#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } 21 | .#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } 22 | .#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } 23 | .#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } 24 | .#{$fa-css-prefix}-gear:before, 25 | .#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } 26 | .#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } 27 | .#{$fa-css-prefix}-home:before { content: $fa-var-home; } 28 | .#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } 29 | .#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } 30 | .#{$fa-css-prefix}-road:before { content: $fa-var-road; } 31 | .#{$fa-css-prefix}-download:before { content: $fa-var-download; } 32 | .#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } 33 | .#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } 34 | .#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } 35 | .#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } 36 | .#{$fa-css-prefix}-rotate-right:before, 37 | .#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } 38 | .#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } 39 | .#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } 40 | .#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } 41 | .#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } 42 | .#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } 43 | .#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } 44 | .#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } 45 | .#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } 46 | .#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } 47 | .#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } 48 | .#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } 49 | .#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } 50 | .#{$fa-css-prefix}-book:before { content: $fa-var-book; } 51 | .#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } 52 | .#{$fa-css-prefix}-print:before { content: $fa-var-print; } 53 | .#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } 54 | .#{$fa-css-prefix}-font:before { content: $fa-var-font; } 55 | .#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } 56 | .#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } 57 | .#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } 58 | .#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } 59 | .#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } 60 | .#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } 61 | .#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } 62 | .#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } 63 | .#{$fa-css-prefix}-list:before { content: $fa-var-list; } 64 | .#{$fa-css-prefix}-dedent:before, 65 | .#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } 66 | .#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } 67 | .#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } 68 | .#{$fa-css-prefix}-photo:before, 69 | .#{$fa-css-prefix}-image:before, 70 | .#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } 71 | .#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } 72 | .#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } 73 | .#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } 74 | .#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } 75 | .#{$fa-css-prefix}-edit:before, 76 | .#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } 77 | .#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } 78 | .#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } 79 | .#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } 80 | .#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } 81 | .#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } 82 | .#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } 83 | .#{$fa-css-prefix}-play:before { content: $fa-var-play; } 84 | .#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } 85 | .#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } 86 | .#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } 87 | .#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } 88 | .#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } 89 | .#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } 90 | .#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } 91 | .#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } 92 | .#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } 93 | .#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } 94 | .#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } 95 | .#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } 96 | .#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } 97 | .#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } 98 | .#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } 99 | .#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } 100 | .#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } 101 | .#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } 102 | .#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } 103 | .#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } 104 | .#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } 105 | .#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } 106 | .#{$fa-css-prefix}-mail-forward:before, 107 | .#{$fa-css-prefix}-share:before { content: $fa-var-share; } 108 | .#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } 109 | .#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } 110 | .#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } 111 | .#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } 112 | .#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } 113 | .#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } 114 | .#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } 115 | .#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } 116 | .#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } 117 | .#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } 118 | .#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } 119 | .#{$fa-css-prefix}-warning:before, 120 | .#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } 121 | .#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } 122 | .#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } 123 | .#{$fa-css-prefix}-random:before { content: $fa-var-random; } 124 | .#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } 125 | .#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } 126 | .#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } 127 | .#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } 128 | .#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } 129 | .#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } 130 | .#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } 131 | .#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } 132 | .#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } 133 | .#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } 134 | .#{$fa-css-prefix}-bar-chart-o:before, 135 | .#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } 136 | .#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } 137 | .#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } 138 | .#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } 139 | .#{$fa-css-prefix}-key:before { content: $fa-var-key; } 140 | .#{$fa-css-prefix}-gears:before, 141 | .#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } 142 | .#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } 143 | .#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } 144 | .#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } 145 | .#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } 146 | .#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } 147 | .#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } 148 | .#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } 149 | .#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } 150 | .#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } 151 | .#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } 152 | .#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } 153 | .#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } 154 | .#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } 155 | .#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } 156 | .#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } 157 | .#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } 158 | .#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } 159 | .#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } 160 | .#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } 161 | .#{$fa-css-prefix}-facebook-f:before, 162 | .#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } 163 | .#{$fa-css-prefix}-github:before { content: $fa-var-github; } 164 | .#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } 165 | .#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } 166 | .#{$fa-css-prefix}-feed:before, 167 | .#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } 168 | .#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } 169 | .#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } 170 | .#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } 171 | .#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } 172 | .#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } 173 | .#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } 174 | .#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } 175 | .#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } 176 | .#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } 177 | .#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } 178 | .#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } 179 | .#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } 180 | .#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } 181 | .#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } 182 | .#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } 183 | .#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } 184 | .#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } 185 | .#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } 186 | .#{$fa-css-prefix}-group:before, 187 | .#{$fa-css-prefix}-users:before { content: $fa-var-users; } 188 | .#{$fa-css-prefix}-chain:before, 189 | .#{$fa-css-prefix}-link:before { content: $fa-var-link; } 190 | .#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } 191 | .#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } 192 | .#{$fa-css-prefix}-cut:before, 193 | .#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } 194 | .#{$fa-css-prefix}-copy:before, 195 | .#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } 196 | .#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } 197 | .#{$fa-css-prefix}-save:before, 198 | .#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } 199 | .#{$fa-css-prefix}-square:before { content: $fa-var-square; } 200 | .#{$fa-css-prefix}-navicon:before, 201 | .#{$fa-css-prefix}-reorder:before, 202 | .#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } 203 | .#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } 204 | .#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } 205 | .#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } 206 | .#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } 207 | .#{$fa-css-prefix}-table:before { content: $fa-var-table; } 208 | .#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } 209 | .#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } 210 | .#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } 211 | .#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } 212 | .#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } 213 | .#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } 214 | .#{$fa-css-prefix}-money:before { content: $fa-var-money; } 215 | .#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } 216 | .#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } 217 | .#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } 218 | .#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } 219 | .#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } 220 | .#{$fa-css-prefix}-unsorted:before, 221 | .#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } 222 | .#{$fa-css-prefix}-sort-down:before, 223 | .#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } 224 | .#{$fa-css-prefix}-sort-up:before, 225 | .#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } 226 | .#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } 227 | .#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } 228 | .#{$fa-css-prefix}-rotate-left:before, 229 | .#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } 230 | .#{$fa-css-prefix}-legal:before, 231 | .#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } 232 | .#{$fa-css-prefix}-dashboard:before, 233 | .#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } 234 | .#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } 235 | .#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } 236 | .#{$fa-css-prefix}-flash:before, 237 | .#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } 238 | .#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } 239 | .#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } 240 | .#{$fa-css-prefix}-paste:before, 241 | .#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } 242 | .#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } 243 | .#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } 244 | .#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } 245 | .#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } 246 | .#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } 247 | .#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } 248 | .#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } 249 | .#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } 250 | .#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } 251 | .#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } 252 | .#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } 253 | .#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } 254 | .#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } 255 | .#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } 256 | .#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } 257 | .#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } 258 | .#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } 259 | .#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } 260 | .#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } 261 | .#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } 262 | .#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } 263 | .#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } 264 | .#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } 265 | .#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } 266 | .#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } 267 | .#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } 268 | .#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } 269 | .#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } 270 | .#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } 271 | .#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } 272 | .#{$fa-css-prefix}-mobile-phone:before, 273 | .#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } 274 | .#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } 275 | .#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } 276 | .#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } 277 | .#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } 278 | .#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } 279 | .#{$fa-css-prefix}-mail-reply:before, 280 | .#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } 281 | .#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } 282 | .#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } 283 | .#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } 284 | .#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } 285 | .#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } 286 | .#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } 287 | .#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } 288 | .#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } 289 | .#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } 290 | .#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } 291 | .#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } 292 | .#{$fa-css-prefix}-code:before { content: $fa-var-code; } 293 | .#{$fa-css-prefix}-mail-reply-all:before, 294 | .#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } 295 | .#{$fa-css-prefix}-star-half-empty:before, 296 | .#{$fa-css-prefix}-star-half-full:before, 297 | .#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } 298 | .#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } 299 | .#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } 300 | .#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } 301 | .#{$fa-css-prefix}-unlink:before, 302 | .#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } 303 | .#{$fa-css-prefix}-question:before { content: $fa-var-question; } 304 | .#{$fa-css-prefix}-info:before { content: $fa-var-info; } 305 | .#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } 306 | .#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } 307 | .#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } 308 | .#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } 309 | .#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } 310 | .#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } 311 | .#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } 312 | .#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } 313 | .#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } 314 | .#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } 315 | .#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } 316 | .#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } 317 | .#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } 318 | .#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } 319 | .#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } 320 | .#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } 321 | .#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } 322 | .#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } 323 | .#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } 324 | .#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } 325 | .#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } 326 | .#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } 327 | .#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } 328 | .#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } 329 | .#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } 330 | .#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } 331 | .#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } 332 | .#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } 333 | .#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } 334 | .#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } 335 | .#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } 336 | .#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } 337 | .#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } 338 | .#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } 339 | .#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } 340 | .#{$fa-css-prefix}-toggle-down:before, 341 | .#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } 342 | .#{$fa-css-prefix}-toggle-up:before, 343 | .#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } 344 | .#{$fa-css-prefix}-toggle-right:before, 345 | .#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } 346 | .#{$fa-css-prefix}-euro:before, 347 | .#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } 348 | .#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } 349 | .#{$fa-css-prefix}-dollar:before, 350 | .#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } 351 | .#{$fa-css-prefix}-rupee:before, 352 | .#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } 353 | .#{$fa-css-prefix}-cny:before, 354 | .#{$fa-css-prefix}-rmb:before, 355 | .#{$fa-css-prefix}-yen:before, 356 | .#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } 357 | .#{$fa-css-prefix}-ruble:before, 358 | .#{$fa-css-prefix}-rouble:before, 359 | .#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } 360 | .#{$fa-css-prefix}-won:before, 361 | .#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } 362 | .#{$fa-css-prefix}-bitcoin:before, 363 | .#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } 364 | .#{$fa-css-prefix}-file:before { content: $fa-var-file; } 365 | .#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } 366 | .#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } 367 | .#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } 368 | .#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } 369 | .#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } 370 | .#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } 371 | .#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } 372 | .#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } 373 | .#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } 374 | .#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } 375 | .#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } 376 | .#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } 377 | .#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } 378 | .#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } 379 | .#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } 380 | .#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } 381 | .#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } 382 | .#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } 383 | .#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } 384 | .#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } 385 | .#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } 386 | .#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } 387 | .#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } 388 | .#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } 389 | .#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } 390 | .#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } 391 | .#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } 392 | .#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } 393 | .#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } 394 | .#{$fa-css-prefix}-android:before { content: $fa-var-android; } 395 | .#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } 396 | .#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } 397 | .#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } 398 | .#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } 399 | .#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } 400 | .#{$fa-css-prefix}-female:before { content: $fa-var-female; } 401 | .#{$fa-css-prefix}-male:before { content: $fa-var-male; } 402 | .#{$fa-css-prefix}-gittip:before, 403 | .#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } 404 | .#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } 405 | .#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } 406 | .#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } 407 | .#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } 408 | .#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } 409 | .#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } 410 | .#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } 411 | .#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } 412 | .#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } 413 | .#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } 414 | .#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } 415 | .#{$fa-css-prefix}-toggle-left:before, 416 | .#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } 417 | .#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } 418 | .#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } 419 | .#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } 420 | .#{$fa-css-prefix}-turkish-lira:before, 421 | .#{$fa-css-prefix}-try:before { content: $fa-var-try; } 422 | .#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } 423 | .#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } 424 | .#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } 425 | .#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } 426 | .#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } 427 | .#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } 428 | .#{$fa-css-prefix}-institution:before, 429 | .#{$fa-css-prefix}-bank:before, 430 | .#{$fa-css-prefix}-university:before { content: $fa-var-university; } 431 | .#{$fa-css-prefix}-mortar-board:before, 432 | .#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } 433 | .#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } 434 | .#{$fa-css-prefix}-google:before { content: $fa-var-google; } 435 | .#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } 436 | .#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } 437 | .#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } 438 | .#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } 439 | .#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } 440 | .#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } 441 | .#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } 442 | .#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } 443 | .#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } 444 | .#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } 445 | .#{$fa-css-prefix}-language:before { content: $fa-var-language; } 446 | .#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } 447 | .#{$fa-css-prefix}-building:before { content: $fa-var-building; } 448 | .#{$fa-css-prefix}-child:before { content: $fa-var-child; } 449 | .#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } 450 | .#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } 451 | .#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } 452 | .#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } 453 | .#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } 454 | .#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } 455 | .#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } 456 | .#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } 457 | .#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } 458 | .#{$fa-css-prefix}-automobile:before, 459 | .#{$fa-css-prefix}-car:before { content: $fa-var-car; } 460 | .#{$fa-css-prefix}-cab:before, 461 | .#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } 462 | .#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } 463 | .#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } 464 | .#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } 465 | .#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } 466 | .#{$fa-css-prefix}-database:before { content: $fa-var-database; } 467 | .#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } 468 | .#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } 469 | .#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } 470 | .#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } 471 | .#{$fa-css-prefix}-file-photo-o:before, 472 | .#{$fa-css-prefix}-file-picture-o:before, 473 | .#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } 474 | .#{$fa-css-prefix}-file-zip-o:before, 475 | .#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } 476 | .#{$fa-css-prefix}-file-sound-o:before, 477 | .#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } 478 | .#{$fa-css-prefix}-file-movie-o:before, 479 | .#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } 480 | .#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } 481 | .#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } 482 | .#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } 483 | .#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } 484 | .#{$fa-css-prefix}-life-bouy:before, 485 | .#{$fa-css-prefix}-life-buoy:before, 486 | .#{$fa-css-prefix}-life-saver:before, 487 | .#{$fa-css-prefix}-support:before, 488 | .#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } 489 | .#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } 490 | .#{$fa-css-prefix}-ra:before, 491 | .#{$fa-css-prefix}-resistance:before, 492 | .#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } 493 | .#{$fa-css-prefix}-ge:before, 494 | .#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } 495 | .#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } 496 | .#{$fa-css-prefix}-git:before { content: $fa-var-git; } 497 | .#{$fa-css-prefix}-y-combinator-square:before, 498 | .#{$fa-css-prefix}-yc-square:before, 499 | .#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } 500 | .#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } 501 | .#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } 502 | .#{$fa-css-prefix}-wechat:before, 503 | .#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } 504 | .#{$fa-css-prefix}-send:before, 505 | .#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } 506 | .#{$fa-css-prefix}-send-o:before, 507 | .#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } 508 | .#{$fa-css-prefix}-history:before { content: $fa-var-history; } 509 | .#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } 510 | .#{$fa-css-prefix}-header:before { content: $fa-var-header; } 511 | .#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } 512 | .#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } 513 | .#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } 514 | .#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } 515 | .#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } 516 | .#{$fa-css-prefix}-soccer-ball-o:before, 517 | .#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } 518 | .#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } 519 | .#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } 520 | .#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } 521 | .#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } 522 | .#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } 523 | .#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } 524 | .#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } 525 | .#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } 526 | .#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } 527 | .#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } 528 | .#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } 529 | .#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } 530 | .#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } 531 | .#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } 532 | .#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } 533 | .#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } 534 | .#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } 535 | .#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } 536 | .#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } 537 | .#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } 538 | .#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } 539 | .#{$fa-css-prefix}-at:before { content: $fa-var-at; } 540 | .#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } 541 | .#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } 542 | .#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } 543 | .#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } 544 | .#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } 545 | .#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } 546 | .#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } 547 | .#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } 548 | .#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } 549 | .#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } 550 | .#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } 551 | .#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } 552 | .#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } 553 | .#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } 554 | .#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } 555 | .#{$fa-css-prefix}-shekel:before, 556 | .#{$fa-css-prefix}-sheqel:before, 557 | .#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } 558 | .#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } 559 | .#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } 560 | .#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } 561 | .#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } 562 | .#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } 563 | .#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } 564 | .#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } 565 | .#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } 566 | .#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } 567 | .#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } 568 | .#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } 569 | .#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } 570 | .#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } 571 | .#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } 572 | .#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } 573 | .#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } 574 | .#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } 575 | .#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } 576 | .#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } 577 | .#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } 578 | .#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } 579 | .#{$fa-css-prefix}-intersex:before, 580 | .#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } 581 | .#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } 582 | .#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } 583 | .#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } 584 | .#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } 585 | .#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } 586 | .#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } 587 | .#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } 588 | .#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } 589 | .#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } 590 | .#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } 591 | .#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } 592 | .#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } 593 | .#{$fa-css-prefix}-server:before { content: $fa-var-server; } 594 | .#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } 595 | .#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } 596 | .#{$fa-css-prefix}-hotel:before, 597 | .#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } 598 | .#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } 599 | .#{$fa-css-prefix}-train:before { content: $fa-var-train; } 600 | .#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } 601 | .#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } 602 | .#{$fa-css-prefix}-yc:before, 603 | .#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } 604 | .#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } 605 | .#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } 606 | .#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } 607 | .#{$fa-css-prefix}-battery-4:before, 608 | .#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } 609 | .#{$fa-css-prefix}-battery-3:before, 610 | .#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } 611 | .#{$fa-css-prefix}-battery-2:before, 612 | .#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } 613 | .#{$fa-css-prefix}-battery-1:before, 614 | .#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } 615 | .#{$fa-css-prefix}-battery-0:before, 616 | .#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } 617 | .#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } 618 | .#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } 619 | .#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } 620 | .#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } 621 | .#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } 622 | .#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } 623 | .#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } 624 | .#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } 625 | .#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } 626 | .#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } 627 | .#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } 628 | .#{$fa-css-prefix}-hourglass-1:before, 629 | .#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } 630 | .#{$fa-css-prefix}-hourglass-2:before, 631 | .#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } 632 | .#{$fa-css-prefix}-hourglass-3:before, 633 | .#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } 634 | .#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } 635 | .#{$fa-css-prefix}-hand-grab-o:before, 636 | .#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } 637 | .#{$fa-css-prefix}-hand-stop-o:before, 638 | .#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } 639 | .#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } 640 | .#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } 641 | .#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } 642 | .#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } 643 | .#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } 644 | .#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } 645 | .#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } 646 | .#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } 647 | .#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } 648 | .#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } 649 | .#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } 650 | .#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } 651 | .#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } 652 | .#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } 653 | .#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } 654 | .#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } 655 | .#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } 656 | .#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } 657 | .#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } 658 | .#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } 659 | .#{$fa-css-prefix}-tv:before, 660 | .#{$fa-css-prefix}-television:before { content: $fa-var-television; } 661 | .#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } 662 | .#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } 663 | .#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } 664 | .#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } 665 | .#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } 666 | .#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } 667 | .#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } 668 | .#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } 669 | .#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } 670 | .#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } 671 | .#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } 672 | .#{$fa-css-prefix}-map:before { content: $fa-var-map; } 673 | .#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } 674 | .#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } 675 | .#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } 676 | .#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } 677 | .#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } 678 | .#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } 679 | .#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } 680 | .#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } 681 | .#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } 682 | .#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } 683 | .#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } 684 | .#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } 685 | .#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } 686 | .#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } 687 | .#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } 688 | .#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } 689 | .#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } 690 | .#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } 691 | .#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } 692 | .#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } 693 | .#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } 694 | .#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } 695 | .#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } 696 | .#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } 697 | .#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } 698 | .#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } 699 | .#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } 700 | .#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } 701 | .#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } 702 | .#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } 703 | .#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } 704 | .#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } 705 | .#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } 706 | .#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } 707 | .#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } 708 | .#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } 709 | .#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } 710 | .#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } 711 | .#{$fa-css-prefix}-asl-interpreting:before, 712 | .#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } 713 | .#{$fa-css-prefix}-deafness:before, 714 | .#{$fa-css-prefix}-hard-of-hearing:before, 715 | .#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } 716 | .#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } 717 | .#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } 718 | .#{$fa-css-prefix}-signing:before, 719 | .#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } 720 | .#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } 721 | .#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } 722 | .#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } 723 | .#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } 724 | .#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } 725 | .#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } 726 | .#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } 727 | .#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } 728 | .#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } 729 | .#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } 730 | .#{$fa-css-prefix}-google-plus-circle:before, 731 | .#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } 732 | .#{$fa-css-prefix}-fa:before, 733 | .#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } 734 | --------------------------------------------------------------------------------