├── misc ├── modd.conf ├── dev.png ├── cookbook.txt ├── link-all.sh ├── init-demo.sh ├── icons.awk ├── ascii.txt └── icons.txt ├── fonts ├── DroidSansMono.ttf ├── RobotoMono-Regular.ttf ├── SpaceMono-Regular.ttf └── fontawesome-webfont.woff2 ├── scss ├── _panels.scss ├── index.scss ├── _colors.scss ├── _classes.scss ├── _app.scss ├── _tooltip.scss ├── _dialog.scss ├── _statusbar.scss └── _panel.scss ├── .gitignore ├── ts ├── main.ts ├── icons.ts ├── Settings.ts ├── files.ts ├── Filter.ts ├── shortway.ts ├── StatusBar.ts ├── Item.ts ├── Dialog.ts ├── JumpFm.ts ├── PluginManager.ts └── Panel.ts ├── tsconfig.json ├── settings.json ├── .vscode └── cSpell.json ├── appveyor.yml ├── updates.json ├── .travis.yml ├── app.js ├── index.html ├── README.md ├── package.json └── font-awesome.min.css /misc/modd.conf: -------------------------------------------------------------------------------- 1 | icons.awk { 2 | prep: ./icons.awk icons.txt 3 | } 4 | -------------------------------------------------------------------------------- /misc/dev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heywoodlh/jumpfm/HEAD/misc/dev.png -------------------------------------------------------------------------------- /fonts/DroidSansMono.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heywoodlh/jumpfm/HEAD/fonts/DroidSansMono.ttf -------------------------------------------------------------------------------- /misc/cookbook.txt: -------------------------------------------------------------------------------- 1 | find {{pwd}} -name {{input}} 2 | find {{sel}} -name {{input}} 3 | cat ~/favorits.txt -------------------------------------------------------------------------------- /fonts/RobotoMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heywoodlh/jumpfm/HEAD/fonts/RobotoMono-Regular.ttf -------------------------------------------------------------------------------- /fonts/SpaceMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heywoodlh/jumpfm/HEAD/fonts/SpaceMono-Regular.ttf -------------------------------------------------------------------------------- /scss/_panels.scss: -------------------------------------------------------------------------------- 1 | #panels { 2 | flex-grow: 1; 3 | display: flex; 4 | flex-direction: row; 5 | } -------------------------------------------------------------------------------- /fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heywoodlh/jumpfm/HEAD/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | .sass-cache/ 4 | css 5 | _config.yml 6 | js 7 | *.swp 8 | old 9 | *.log 10 | -------------------------------------------------------------------------------- /scss/index.scss: -------------------------------------------------------------------------------- 1 | @import 'app'; 2 | @import 'panels'; 3 | @import 'panel'; 4 | @import 'classes'; 5 | @import 'dialog'; 6 | @import 'statusbar'; 7 | @import 'tooltip'; -------------------------------------------------------------------------------- /misc/link-all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | npm link jumpfm-clock jumpfm-copy jumpfm-fs jumpfm-gist jumpfm-git-status jumpfm-history jumpfm-jump jumpfm-version jumpfm-weather jumpfm-zip jumpfm-file-ops jumpfm-key-nav jumpfm-flat-mode 3 | -------------------------------------------------------------------------------- /ts/main.ts: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', () => { 2 | console.time('main') 3 | new (require('./js/JumpFm.js').JumpFm)(require('electron').remote.getGlobal('argv')) 4 | console.timeEnd('main') 5 | }, false) -------------------------------------------------------------------------------- /misc/init-demo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | rm -rf ~/demo 4 | mkdir -p ~/demo/mybooklive/Tv.Show 5 | 6 | for i in {1..5}; do 7 | folder=~/demo/downloads/Tv.Show.S01E0$i 8 | mkdir -p $folder 9 | touch $folder/Tv.Show.S01E0$i.{mkv,srt,nfo} 10 | done 11 | -------------------------------------------------------------------------------- /scss/_colors.scss: -------------------------------------------------------------------------------- 1 | $color-border:#646464; 2 | $color-err:#F58E8E; 3 | $color-natural:#A9D3AB; 4 | $color-warn:#FED37E; 5 | $color-info:#7AABD4; 6 | $color-06:#D6ADD5; 7 | $color-07:#79D4D5; 8 | $color-08:#D4D4D4; 9 | $color-bg:lighten(#2D2D2D, 5%); 10 | $color-fg:#D4D4D4; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "js", 4 | "target": "es2017", 5 | "module": "commonjs", 6 | "sourceMap": true, 7 | "lib": [ 8 | "dom", 9 | "es2017", 10 | "es2015.promise" 11 | ] 12 | } 13 | } -------------------------------------------------------------------------------- /scss/_classes.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | .border { 3 | border: 1px solid $color-natural; 4 | } 5 | 6 | .txt-no-wrap { 7 | white-space: nowrap; 8 | text-overflow: ellipsis; 9 | overflow: hidden; 10 | } 11 | 12 | ::-webkit-scrollbar { 13 | display: none; 14 | } 15 | 16 | .file-icon { 17 | width: 1em; 18 | height: 1em; 19 | } -------------------------------------------------------------------------------- /ts/icons.ts: -------------------------------------------------------------------------------- 1 | 2 | const icons = require('../icons.json') 3 | const extensions = {} 4 | for (var icon in icons) { 5 | icons[icon].forEach(ext => { 6 | extensions[ext] = icon 7 | }); 8 | } 9 | 10 | export const getExtIcon = (ext: string) => { 11 | const icon = extensions[ext] 12 | if (icon) return 'file-icons/file_type_' + icon + '.svg' 13 | } -------------------------------------------------------------------------------- /settings.json: -------------------------------------------------------------------------------- 1 | ## This is a default ~/.jumpfm/settings.json file. Download it and move to ~/.jumpfm/ 2 | 3 | { 4 | "timeFormat": "HH:mm:ss", 5 | "dateFormat": "MM/DD/YYYY ", 6 | "flatModeMaxSize": 5000, 7 | "historyMaxSize": 20, 8 | "jumpMaxDbSize": 300, 9 | "jumpDbSaveInterval": 5, 10 | "weatherLocation": "Manti, UT", 11 | "editor": "open -a TextEdit" 12 | } 13 | -------------------------------------------------------------------------------- /misc/icons.awk: -------------------------------------------------------------------------------- 1 | #!/usr/bin/awk -f 2 | BEGIN { 3 | RS="}" 4 | print "{" 5 | } 6 | 7 | match($0, /icon: '([^']+)'.*extensions: (\[[^\].]+\])/, a){ 8 | print "\""a[1]"\"", ":", gensub(/'/,"\"", "g", a[2])"," 9 | } 10 | 11 | match($0, /icon: '([^']+)'.*languages: (\[[^\]]+\])/, a){ 12 | print "\""a[1]"\"", ":", gensub(/languages\.(\w+)/, "\"\\1\"", "g", a[2])"," 13 | } 14 | 15 | END { 16 | print "}" 17 | } 18 | -------------------------------------------------------------------------------- /misc/ascii.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | _ ______ 4 | | | | ____| 5 | | |_ _ _ __ ___ _ __ | |__ _ __ ___ 6 | _ | | | | | '_ ` _ \| '_ \| __| '_ ` _ \ 7 | | |__| | |_| | | | | | | |_) | | | | | | | | 8 | \____/ \__,_|_| |_| |_| .__/|_| |_| |_| |_| 9 | | | 10 | |_| 11 | 12 | 13 | -------------------------------------------------------------------------------- /ts/Settings.ts: -------------------------------------------------------------------------------- 1 | import { Settings as SettingsApi } from 'jumpfm-api' 2 | 3 | import { settings, saveSettings } from './files' 4 | 5 | type Type = 'string' | 'number' 6 | 7 | export class Settings implements SettingsApi { 8 | private get = (type: Type) => (key: string, defaultValue: T) => { 9 | const val = settings[key] 10 | if (val && (typeof val === type)) return val 11 | settings[key] = defaultValue 12 | saveSettings(settings) 13 | return defaultValue 14 | } 15 | 16 | getNum = this.get('number') 17 | getStr = this.get('string') 18 | } -------------------------------------------------------------------------------- /.vscode/cSpell.json: -------------------------------------------------------------------------------- 1 | // cSpell Settings 2 | { 3 | // Version of the setting file. Always 0.1 4 | "version": "0.1", 5 | // language - current active spelling language 6 | "language": "en", 7 | // words - list of words to be always considered correct 8 | "words": [ 9 | "Msgs", 10 | "jumpfm", 11 | "keyboardjs", 12 | "keycode", 13 | "pagedown", 14 | "pageup", 15 | "shortway" 16 | ], 17 | // flagWords - list of words to be always considered incorrect 18 | // This is useful for offensive words and common spelling errors. 19 | // For example "hte" should be "the" 20 | "flagWords": [ 21 | "hte" 22 | ] 23 | } -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | os: unstable 2 | branches: 3 | only: 4 | - master 5 | 6 | cache: 7 | - node_modules 8 | environment: 9 | GH_TOKEN: 10 | secure: RcYdy07RY6uQXRBSJWfJfNG7FzZd7Y62IOTQ1n1pYjKTh9sgklNfNB9DBHZdOCzA 11 | matrix: 12 | - nodejs_version: 6 13 | install: 14 | - ps: Install-Product node $env:nodejs_version 15 | - set CI=true 16 | - npm install -g npm@latest 17 | - npm i -g typescript 18 | - npm i -g node-sass 19 | - set PATH=%APPDATA%\npm;%PATH% 20 | - npm install 21 | matrix: 22 | fast_finish: true 23 | build: off 24 | version: '{build}' 25 | shallow_clone: true 26 | clone_depth: 1 27 | test_script: 28 | - tsc 29 | - node-sass scss -o css 30 | - npm run publish -------------------------------------------------------------------------------- /scss/_app.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | @font-face { 3 | font-family: DroidSansMono; 4 | src: url('../fonts/DroidSansMono.ttf'); 5 | } 6 | 7 | * { 8 | font-family: 'DroidSansMono'; 9 | box-sizing: border-box; 10 | } 11 | 12 | html, 13 | body { 14 | height: 100%; 15 | width: 100%; 16 | padding: 0; 17 | margin: 0; 18 | } 19 | 20 | #app { 21 | position: absolute; 22 | top: 0; 23 | bottom: 0; 24 | left: 0; 25 | right: 0; 26 | display: flex; 27 | flex-direction: column; 28 | } 29 | 30 | html, 31 | body, 32 | table, 33 | input { 34 | background-color: $color-bg; 35 | color: $color-fg; 36 | } 37 | 38 | input { 39 | font-size: inherit; 40 | padding: .2em; 41 | outline: none; 42 | border: none; 43 | background-color: $color-bg; 44 | } -------------------------------------------------------------------------------- /scss/_tooltip.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | [data-title] { 3 | &:before { 4 | position: absolute; 5 | content: attr(data-title); 6 | white-space: nowrap; 7 | color: $color-fg; 8 | background-color: $color-bg; 9 | width: auto; 10 | padding: .5em; 11 | border: 1px solid $color-border; 12 | border-radius: 3px; 13 | transform: translate(1em, -3.5em); 14 | opacity: 0; 15 | visibility: hidden; 16 | } 17 | &:hover:before { 18 | visibility: visible; 19 | transition: all .2s; 20 | opacity: 1; 21 | height: auto; 22 | } 23 | } 24 | 25 | #statusbar-buttons { 26 | [data-title] { 27 | &:before { 28 | font-size: 80%; 29 | transform: translate(-3em, -3em); 30 | } 31 | &:hover:before {} 32 | } 33 | } -------------------------------------------------------------------------------- /updates.json: -------------------------------------------------------------------------------- 1 | { 2 | "linux-x64-prod": { 3 | "readme": "JumpFm", 4 | "update": "https://github.com/JumpFm/jumpfm/releases/download/v1.0.5/JumpFm-1.0.5-x86_64.AppImage", 5 | "install": "https://github.com/JumpFm/jumpfm/releases/download/v1.0.5/JumpFm-1.0.5-x86_64.AppImage", 6 | "version": "1.0.5" 7 | }, 8 | "win32-x64-prod": { 9 | "readme": "JumpFm", 10 | "update": "https://github.com/JumpFm/jumpfm/releases/download/v1.0.5/jumpfm-setup-1.0.5.exe", 11 | "install": "https://github.com/JumpFm/jumpfm/releases/download/v1.0.5/jumpfm-setup-1.0.5.exe", 12 | "version": "1.0.5" 13 | }, 14 | "darwin-x64-prod": { 15 | "readme": "JumpFm", 16 | "update": "https://github.com/heywoodlh/jumpfm/releases/download/v1.0.2/jumpfm-1.0.2.dmg", 17 | "install": "https://github.com/heywoodlh/jumpfm/releases/download/v1.0.2/jumpfm-1.0.2.dmg", 18 | "version": "1.0.2" 19 | } 20 | } -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | dist: trusty 3 | language: node_js 4 | node_js: 6 5 | 6 | branches: 7 | only: 8 | - master 9 | 10 | before_install: 11 | - npm i -g npm@latest 12 | - npm i -g typescript 13 | - npm i -g node-sass 14 | 15 | install: 16 | - npm i 17 | 18 | cache: 19 | directories: 20 | - "node_modules" 21 | 22 | env: 23 | global: 24 | - secure: >- 25 | QdHr5mVFKOyS/SmQPd7X6TOGhi4XhlJU+2w0O+RubOo/h2i1wLXD/f0DbAjEc0XfpTBSt9IDtUtqSuTi1YIUbafrqUwLFBUZ5VGYsPcMA48pD6+nzflMuaaCf//+pM8WtIAfgOK1i5k30faRzRnvSIYgX/Yyf4vS9j9OmfwD6342d1eD2b+h24R9z+eLlG9QaoJx9EAYhr1UAFbERiBlN40ThGU7uSkehzuYtGaQil8J8cV/MRqPCTSMAcZvpiUM7yGri11AWxJ5bOmyn7yVTFRBVWZDb4XaREXVTaEIXhvi/g+NO0e9WFETkw2cR7/Q6lw3kr/DqGz6Ks9XCOGppb1xILbvkUID/7pW+UKuzt6hc4AdoJLR+p0QtMWQn51oh1npGXzaMwjGGQ36gr+rdzc3Lukh08URzAFC2kywCg1sCsNCfoEH0hVD8OUhNQIkVOz530isjkZ8q9S1Us0ib5uviSZeA9XmfPBKe7aRxMY98WUvaeDCRmHqtmWy0nl9+ys4aI0197+4XlXijWeezd/ESLcWlZozKysAvTavC+hZPIBYz3Hpd6JOVzDGDgxWTpF91nCOJ+/gz/kHztAcaIC/iIVwIH4NhovuZ8t0kCKraEOWCnVkrikw9yK8unxgQfGWqU38ywUR7dN5if+u6Y67ih4ASnJ/LCqvUQvzy1o= 26 | 27 | before_script: 28 | - tsc 29 | - node-sass scss -o css 30 | 31 | script: 32 | - npm run publish 33 | 34 | -------------------------------------------------------------------------------- /scss/_dialog.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | @import 'classes'; 3 | #dialog { 4 | display: none; 5 | position: absolute; 6 | top: 20%; 7 | left: 0; 8 | right: 0; 9 | width: 600px; 10 | margin: 0 auto; 11 | background-color: transparent; 12 | } 13 | 14 | #dialog-label, 15 | #dialog-input { 16 | padding: .8em; 17 | } 18 | 19 | #dialog-label, 20 | #dialog-input, 21 | #dialog-sug { 22 | @extend .border; 23 | background-color: $color-bg; 24 | } 25 | 26 | #dialog-input, 27 | #dialog-sug { 28 | width: 100%; 29 | } 30 | 31 | #dialog-content { 32 | display: flex; 33 | #dialog-label { 34 | color: $color-info; 35 | font-weight: bold; 36 | border-right: none; 37 | } 38 | } 39 | 40 | #dialog-left { 41 | flex-grow: 0; 42 | flex-shrink: 0; 43 | } 44 | 45 | #dialog-right { 46 | flex-grow: 1; 47 | overflow: hidden; 48 | #dialog-input { 49 | border-left: none; 50 | padding-left: 0; 51 | } 52 | #dialog-sug { 53 | border-top: none; 54 | line-height: 1.5; 55 | padding: 0; 56 | list-style-type: none; 57 | margin: 0; 58 | [cur] { 59 | background-color: $color-border; 60 | } 61 | b { 62 | color: $color-info; 63 | } 64 | li { 65 | @extend .txt-no-wrap; 66 | padding: 0 .2em; 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const updater = require('electron-simple-updater'); 2 | const electron = require('electron') 3 | const app = electron.app 4 | const BrowserWindow = electron.BrowserWindow 5 | 6 | const path = require('path') 7 | const url = require('url') 8 | 9 | // const log = require('electron-log'); 10 | 11 | app.on('window-all-closed', function() { 12 | if (process.platform != 'darwin') { 13 | app.quit(); 14 | } 15 | }); 16 | 17 | app.on('ready', function() { 18 | updater.init( 19 | 'https://raw.githubusercontent.com/Gilad-Kutiel-App/jumpfm/master/updates.json' 20 | ); 21 | 22 | const { width, height } = electron.screen.getPrimaryDisplay().workAreaSize; 23 | const w = parseInt(width * .8); 24 | const h = parseInt(height * .8); 25 | 26 | global.argv = process.argv 27 | // log.transports.file.level = 'debug'; 28 | // log.transports.console.level = 'debug'; 29 | 30 | // Create the browser window. 31 | let mainWindow = new BrowserWindow({ 32 | width: w, 33 | height: h, 34 | icon: path.join(__dirname, 'build/icons/64x64.png'), 35 | }); 36 | 37 | // mainWindow.setMenu(null); 38 | mainWindow.loadURL('file://' + __dirname + '/index.html'); 39 | 40 | mainWindow.on('closed', function() { 41 | mainWindow = null; 42 | }); 43 | }); -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | JumpFm 6 | 8 | 10 | 11 | 12 | 13 | 14 | 15 |
17 | 18 | 19 |
20 |
21 |
22 |
23 |
24 |
25 | 27 |
    29 |
  1. 32 |
33 |
34 |
35 |
36 | 37 | 38 | 39 |
40 | 41 | 42 | 43 |
44 | 45 | 46 |
47 | 48 | 49 |
50 |
51 | 52 |
53 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://travis-ci.org/Gilad-Kutiel-App/jumpfm.svg?branch=master)](https://travis-ci.org/Gilad-Kutiel-App/jumpfm) [![Build status](https://ci.appveyor.com/api/projects/status/g9ggpk5578fq56x2?svg=true)](https://ci.appveyor.com/project/gkutiel/jumpfm) 2 | 3 | # About 4 | 5 | JumpFm is a cross platform dual panel file manager with builtin superpowers. This fork contains the OS X release. 6 | 7 | 8 | 9 | ## Installation 10 | 11 | Download the latest release here: 12 | 13 | [Releases](https://github.com/heywoodlh/jumpfm/releases) 14 | 15 | ### Usage 16 | Please refer to the [wiki](https://github.com/heywoodlh/jumpfm/wiki) for usage information including keyboard shortcuts. 17 | 18 | 19 | ### Change default editor to TextEdit 20 | Run this command after running jumpfm the first time: 21 | `sed -i '' 's/gedit/open -a TextEdit/g' "$HOME"/.jumpfm/settings.json` 22 | 23 | # Development 24 | 25 | ## Build instructions: 26 | ``` 27 | git clone git@github.com:heywoodlh/jumpfm.git 28 | npm i -g typescript electron 29 | cd jumpfm 30 | npm i 31 | tsc -w 32 | sass --watch scss:css 33 | electron . 34 | ``` 35 | --- 36 | 37 | ## Other information: 38 | 39 | JumpFm is an [Electron](https://electron.atom.io/) based app. 40 | It is written in [TypeScript](https://www.typescriptlang.org/). 41 | To hack the code all you need is [node.js](https://nodejs.org/en/) a 42 | [decent editor](http://bit.ly/2wHIoSz) and a [sass compiler](http://sass-lang.com/). 43 | 44 | 45 | -------------------------------------------------------------------------------- /scss/_statusbar.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | // 3 | #statusbar { 4 | display: flex; 5 | flex-shrink: 0; 6 | padding: .1em 0; 7 | border-top: 3px solid $color-border; 8 | } 9 | 10 | #statusbar-msgs { 11 | display: flex; 12 | flex-grow: 1; 13 | align-items: center; 14 | font-size: 90%; 15 | padding-right: 1em; 16 | overflow: hidden; 17 | .msg { 18 | cursor: default; 19 | flex-shrink: 0; 20 | border-right: 1px solid $color-border; 21 | padding: 0 .5em; 22 | &:last-child { 23 | border-right: none; 24 | } 25 | &:empty { 26 | padding: 0; 27 | } 28 | } 29 | } 30 | 31 | #statusbar-buttons { 32 | display: flex; 33 | flex-direction: row-reverse; 34 | flex-shrink: 0; 35 | font-size: 120%; 36 | .btn { 37 | padding-right: .5em; 38 | } 39 | } 40 | 41 | .btn { 42 | font-size: 1em; 43 | display: inline-block; 44 | cursor: pointer; 45 | padding: 0; 46 | margin: 0; 47 | color: $color-natural; 48 | border: none; 49 | outline: none; 50 | opacity: .5; 51 | text-decoration: none; 52 | &:hover { 53 | opacity: 1; 54 | } 55 | } 56 | 57 | [type=info], 58 | [type=info][data-title]:before { 59 | color: $color-info; 60 | } 61 | 62 | [type=warn], 63 | [type=warn][data-title]:before { 64 | color: $color-warn; 65 | } 66 | 67 | [type=err], 68 | [type=err][data-title]:before { 69 | color: $color-err; 70 | } -------------------------------------------------------------------------------- /ts/files.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs-extra'; 2 | import * as homedir from 'homedir'; 3 | import * as path from 'path'; 4 | 5 | export interface Plugins { 6 | name: string 7 | version: string 8 | dependencies: { [name: string]: string } 9 | } 10 | 11 | const load = (path: string) => { 12 | try { 13 | return require(path) 14 | } catch (e) { 15 | console.log(e) 16 | return {} 17 | } 18 | } 19 | 20 | const save = (path: string) => (obj: T) => { 21 | fs.writeFileSync(path, JSON.stringify(obj, null, 4)) 22 | return obj; 23 | } 24 | 25 | export const packageJson = require('../package.json') 26 | 27 | export const root = path.join(homedir(), ".jumpfm") 28 | export const pluginsPath = path.join(root, 'plugins') 29 | if (!fs.existsSync(pluginsPath)) 30 | fs.mkdirpSync(pluginsPath) 31 | 32 | export const pluginsPackageJson = path.join(pluginsPath, 'package.json') 33 | export const settingsPath = path.join(root, 'settings.json') 34 | export const keyboardPath = path.join(root, 'keyboard.json') 35 | 36 | export const settings = load(settingsPath) 37 | export const keyboard = load(keyboardPath) 38 | 39 | export const saveSettings = save(settingsPath) 40 | export const saveKeyboard = () => save(keyboardPath)(keyboard) 41 | export const savePlugins = save(pluginsPackageJson) 42 | 43 | 44 | export const getKeys = (actionName: string, defaultKeys: string[]): string[] => { 45 | const keys = keyboard[actionName] 46 | if (keys && Array.isArray(keys)) return keys 47 | keyboard[actionName] = defaultKeys 48 | return defaultKeys 49 | } 50 | -------------------------------------------------------------------------------- /ts/Filter.ts: -------------------------------------------------------------------------------- 1 | import { FilterBox as FilterApi } from 'jumpfm-api' 2 | import { getKeys } from "./files"; 3 | import { shortway } from "./shortway"; 4 | 5 | export class Filter implements FilterApi { 6 | readonly input: HTMLInputElement = document.createElement('input') 7 | 8 | private readonly handlers: ((val: string) => void)[] = [] 9 | 10 | 11 | constructor() { 12 | this.input.className = 'filter' 13 | this.input.addEventListener('keydown', e => e.stopPropagation(), false) 14 | this.input.addEventListener('input', () => { 15 | this.notifyAll() 16 | }, false) 17 | 18 | this.input.addEventListener('blur', this.hide, false) 19 | this.hide() 20 | } 21 | 22 | private notifyAll(): any { 23 | this.handlers.forEach(handler => { 24 | handler(this.input.value) 25 | }); 26 | } 27 | 28 | set = (val: string) => { 29 | this.input.value = val 30 | this.notifyAll() 31 | } 32 | 33 | get = () => { 34 | return this.input.value 35 | } 36 | 37 | onChange = (handler: (val: string) => void) => this.handlers.push(handler) 38 | 39 | focus = () => { 40 | this.input.style.display = 'block' 41 | this.input.focus() 42 | } 43 | 44 | hide = () => this.input.style.display = 'none' 45 | 46 | bind = (actionName: string, defaultKeys: string[], action: () => void) => { 47 | getKeys(actionName, defaultKeys).forEach(combo => { 48 | const cb = shortway(combo, (e) => { 49 | e.preventDefault() 50 | action() 51 | }) 52 | this.input.addEventListener('keydown', cb, false) 53 | }) 54 | } 55 | } -------------------------------------------------------------------------------- /scss/_panel.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | @import 'classes'; 3 | .panel { 4 | display: flex; 5 | flex-direction: column; 6 | flex-grow: 1; 7 | width: 50%; 8 | border: 0 solid $color-border; 9 | &:first-child { 10 | border-right-width: 2px 11 | } 12 | &:nth-child(2) { 13 | border-left-width: 2px 14 | } 15 | } 16 | 17 | .panel>title { 18 | @extend .txt-no-wrap; 19 | flex-shrink: 0; 20 | display: block; 21 | width: 100%; 22 | } 23 | 24 | .panel[active]>title { 25 | background-color: darken($color-info, 20%); 26 | font-weight: bold; 27 | } 28 | 29 | .panel tr[hidden] { 30 | display: none; 31 | } 32 | 33 | .panel tr[cur] { 34 | background-color: $color-border; 35 | font-weight: bold; 36 | } 37 | 38 | .panel[active] tr[selected] { 39 | background-color: darken($color-warn, 55%); 40 | } 41 | 42 | .panel[active] tr[cur] { 43 | background-color: darken($color-warn, 45%); 44 | } 45 | 46 | table { 47 | width: 100%; 48 | display: flex; 49 | flex-direction: column; 50 | table-layout: fixed; 51 | flex-grow: 1; 52 | border-collapse: collapse; 53 | text-align: left; 54 | } 55 | 56 | thead { 57 | background-image: linear-gradient($color-border, $color-bg); 58 | } 59 | 60 | tbody { 61 | display: block; 62 | overflow-y: auto; 63 | flex-grow: 1; 64 | } 65 | 66 | thead, 67 | tbody tr { 68 | display: table; 69 | width: 100%; 70 | table-layout: fixed; 71 | } 72 | 73 | th:first-child, 74 | td:first-child { 75 | width: 1.5em; 76 | } 77 | 78 | th:nth-child(3), 79 | td:nth-child(3) { 80 | width: 6em; 81 | } 82 | 83 | th:nth-child(4), 84 | td:nth-child(4) { 85 | width: 10.5em; 86 | } 87 | 88 | th, 89 | td { 90 | @extend .txt-no-wrap; 91 | padding: .1em .2em; 92 | &:first-child { 93 | padding-left: .5em; 94 | padding-right: 1.5em; 95 | } 96 | &:last-child { 97 | padding-right: .5em; 98 | } 99 | } 100 | 101 | .filter { 102 | border-top: 1px solid $color-border; 103 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jumpfm", 3 | "version": "1.0.6", 4 | "description": "A file manager that lets you jump", 5 | "author": { 6 | "name": "Gilad Kutiel", 7 | "email": "gilad.kutiel@gmail.com" 8 | }, 9 | "license": "ISC", 10 | "dependencies": { 11 | "check-dependencies": "^1.1.0", 12 | "electron-simple-updater": "^1.2.1", 13 | "filesize": "^3.5.10", 14 | "fs-extra": "^4.0.1", 15 | "homedir": "^0.6.0", 16 | "moment": "^2.18.1", 17 | "node-cmd": "^3.0.0", 18 | "node-watch": "^0.5.5", 19 | "node.os": "^1.2.4", 20 | "npm": "^6.2.0" 21 | }, 22 | "devDependencies": { 23 | "@types/electron": "^1.6.10", 24 | "@types/fs-extra": "^4.0.8", 25 | "@types/keyboardjs": "^2.2.31", 26 | "@types/node": "^8.10.21", 27 | "@types/npm": "^2.0.29", 28 | "@types/watch": "^1.0.0", 29 | "electron-builder": "^19.56.2", 30 | "jumpfm-api": "^1.1.4" 31 | }, 32 | "optionalDependencies": { 33 | "7zip-bin-win": "^2.1.0" 34 | }, 35 | "homepage": "https://jumpfm.org", 36 | "repository": { 37 | "type": "git", 38 | "url": "git+https://github.com/Gilad-Kutiel-App/jumpfm.git" 39 | }, 40 | "bugs": { 41 | "url": "https://github.com/Gilad-Kutiel-App/jumpfm/issues" 42 | }, 43 | "main": "app.js", 44 | "build": { 45 | "appId": "com.github.gkutiel.jumpfm", 46 | "compression": "maximum", 47 | "electronVersion": "1.7.5", 48 | "linux": { 49 | "files": [ 50 | "**/*", 51 | "build/icons/*" 52 | ], 53 | "target": [ 54 | "AppImage" 55 | ], 56 | "category": "Utility", 57 | "publish": "github" 58 | }, 59 | "win": { 60 | "target": "nsis" 61 | } 62 | }, 63 | "scripts": { 64 | "test": "mocha js", 65 | "pack": "build --dir", 66 | "dist": "build", 67 | "publish": "build --publish always", 68 | "postinstall": "electron-builder install-app-deps" 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /ts/shortway.ts: -------------------------------------------------------------------------------- 1 | const keyCodes: { [name: string]: number } = { 2 | backspace: 8, 3 | tab: 9, 4 | enter: 13, 5 | pause: 19, 6 | esc: 27, 7 | space: 32, 8 | pageup: 33, 9 | pagedown: 34, 10 | end: 35, 11 | home: 36, 12 | left: 37, 13 | up: 38, 14 | right: 39, 15 | down: 40, 16 | insert: 45, 17 | del: 46, 18 | slash: 191, 19 | 0: 48, 20 | 1: 49, 21 | 2: 50, 22 | 3: 51, 23 | 4: 52, 24 | 5: 53, 25 | 6: 54, 26 | 7: 55, 27 | 8: 56, 28 | 9: 57, 29 | a: 65, 30 | b: 66, 31 | c: 67, 32 | d: 68, 33 | e: 69, 34 | f: 70, 35 | g: 71, 36 | h: 72, 37 | i: 73, 38 | j: 74, 39 | k: 75, 40 | l: 76, 41 | m: 77, 42 | n: 78, 43 | o: 79, 44 | p: 80, 45 | q: 81, 46 | r: 82, 47 | s: 83, 48 | t: 84, 49 | u: 85, 50 | v: 86, 51 | w: 87, 52 | x: 88, 53 | y: 89, 54 | z: 90, 55 | f1: 112, 56 | f2: 113, 57 | f3: 114, 58 | f4: 115, 59 | f5: 116, 60 | f6: 117, 61 | f7: 118, 62 | f8: 119, 63 | f9: 120, 64 | f10: 121, 65 | f11: 122, 66 | f12: 123, 67 | numLock: 144, 68 | scrollLock: 145, 69 | ';': 186, 70 | '=': 187, 71 | ',': 188, 72 | '-': 189, 73 | '.': 190, 74 | '/': 191, 75 | '`': 192, 76 | '[': 219, 77 | '\\': 220, 78 | ']': 221, 79 | "'": 221 80 | } 81 | 82 | const includes = (array, item) => array.indexOf(item) > -1 83 | 84 | export const shortway = (command, callback) => { 85 | const keys = command.split('+') 86 | const key = keys.filter(key => keyCodes[key])[0] 87 | const keyCode = keyCodes[key] 88 | const ctrl = keys.some(key => key === 'ctrl') 89 | const shift = keys.some(key => key === 'shift') 90 | const alt = keys.some(key => key === 'alt') 91 | 92 | if (!keyCode) throw new Error(`can't find keycode for command ${command}`) 93 | return function (e) { 94 | if (e.ctrlKey === ctrl && 95 | e.shiftKey === shift && 96 | e.altKey === alt && 97 | e.keyCode === keyCode) { 98 | callback(e) 99 | return false 100 | } 101 | } 102 | } -------------------------------------------------------------------------------- /ts/StatusBar.ts: -------------------------------------------------------------------------------- 1 | import { StatusBar as StatusBarApi, Msg as MsgAPi } from 'jumpfm-api' 2 | 3 | class Msg implements MsgAPi { 4 | readonly divMsg: HTMLDivElement = document.createElement('div') 5 | 6 | constructor() { 7 | this.divMsg.className = 'msg' 8 | } 9 | 10 | setType = (type: "info" | "warn" | "err") => { 11 | this.divMsg.setAttribute('type', type) 12 | return this 13 | } 14 | 15 | setText = (txt: string) => { 16 | this.divMsg.textContent = txt 17 | return this 18 | } 19 | 20 | setTooltip = (txt: string) => { 21 | this.divMsg.setAttribute('data-title', txt) 22 | return this 23 | } 24 | 25 | setClearTimeout = (timeout: number) => { 26 | setTimeout(() => this.setText(''), timeout) 27 | return this 28 | } 29 | 30 | setAttr = (name: string, b: boolean) => { 31 | if (b) 32 | this.divMsg.setAttribute(name, '') 33 | else 34 | this.divMsg.removeAttribute(name) 35 | 36 | return this 37 | } 38 | } 39 | 40 | class Button { 41 | readonly a: HTMLAnchorElement = document.createElement('a') 42 | private readonly i = document.createElement('i') 43 | 44 | constructor(faIcon: string, tooltip: string) { 45 | this.a.className = 'btn' 46 | this.a.setAttribute('data-title', tooltip) 47 | this.a.target = 'about:blank' 48 | this.i.className = `fa ${faIcon}` 49 | this.a.appendChild(this.i) 50 | } 51 | } 52 | 53 | export class StatusBar implements StatusBarApi { 54 | private readonly divMsgs: HTMLDivElement = document 55 | .getElementById('statusbar-msgs') as HTMLDivElement 56 | 57 | private readonly divButtons: HTMLDivElement = document 58 | .getElementById('statusbar-buttons') as HTMLDivElement 59 | 60 | private readonly msgs: { [name: string]: Msg } = {} 61 | 62 | msg = (name: string): MsgAPi => { 63 | if (this.msgs[name]) return this.msgs[name] 64 | const msg = new Msg() 65 | this.msgs[name] = msg 66 | this.divMsgs.appendChild(msg.divMsg) 67 | return msg 68 | } 69 | 70 | clear = (name: string) => { 71 | const msg = this.msgs[name] 72 | if (!msg) return 73 | msg.setText('') 74 | } 75 | msgClear = this.clear 76 | 77 | buttonAdd(faIcon: string, tooltip: string, action: () => void) { 78 | const a = new Button(faIcon, tooltip).a 79 | this.divButtons.appendChild(a) 80 | a.addEventListener('click', action, false) 81 | } 82 | } -------------------------------------------------------------------------------- /ts/Item.ts: -------------------------------------------------------------------------------- 1 | import { Item as ItemApi, File } from 'jumpfm-api' 2 | 3 | import * as moment from 'moment' 4 | import * as fileSize from 'filesize' 5 | 6 | type attr = 'cur' | 'hidden' | 'selected' 7 | 8 | export class Item implements ItemApi { 9 | private hidden: boolean = false 10 | private selected: boolean = false 11 | 12 | private readonly icon = document.createElement('img') 13 | 14 | private readonly tdIcon = document.createElement('td') 15 | private readonly tdName = document.createElement('td') 16 | private readonly tdSize = document.createElement('td') 17 | private readonly tdTime = document.createElement('td') 18 | 19 | readonly tr = document.createElement('tr') 20 | 21 | constructor(item: File) { 22 | this.icon.className = 'file-icon' 23 | this.tdIcon.appendChild(this.icon) 24 | 25 | this.tr.appendChild(this.tdIcon) 26 | this.tr.appendChild(this.tdName) 27 | this.tr.appendChild(this.tdSize) 28 | this.tr.appendChild(this.tdTime) 29 | 30 | this.path = item.path 31 | this.name = item.name 32 | 33 | this.tdName.textContent = 34 | item.name || '--' 35 | } 36 | 37 | readonly path: string; 38 | readonly name: string; 39 | 40 | private readonly attrs: { [attr: string]: boolean } = {} 41 | 42 | private set = (attr: attr) => (b: boolean) => { 43 | this.attrs[attr] = b 44 | if (b) 45 | this.tr.setAttribute(attr, '') 46 | else 47 | this.tr.removeAttribute(attr) 48 | return this 49 | } 50 | 51 | private is = (attr: attr) => this.attrs[attr] 52 | 53 | setCur: (b: boolean) => void = this.set('cur') 54 | setHidden: (b: boolean) => void = this.set('hidden') 55 | setSelected: (b: boolean) => void = this.set('selected') 56 | 57 | hide = () => this.setHidden(true) 58 | show = () => this.setHidden(false) 59 | 60 | isSelected = () => this.is('selected') 61 | isHidden = () => this.is('hidden') 62 | 63 | setAttribute(name: string, val: string = '') { 64 | this.tr.setAttribute(name, val) 65 | return this 66 | } 67 | 68 | setIcon = (src: string) => { 69 | this.icon.src = src 70 | return this 71 | } 72 | 73 | setTime = (time: number) => { 74 | this.tdTime.textContent = 75 | (time && moment(time).format('DD/MM/YYYY hh:mm') || '--') 76 | return this 77 | } 78 | 79 | setSize = (size: number) => { 80 | this.tdSize.textContent = 81 | (size && fileSize(size) || '--') 82 | return this 83 | } 84 | } -------------------------------------------------------------------------------- /ts/Dialog.ts: -------------------------------------------------------------------------------- 1 | import { Dialog as DialogApi, DialogSpec, Suggestion } from 'jumpfm-api' 2 | import { shortway } from "./shortway"; 3 | 4 | interface SuggestionLi extends Suggestion { 5 | li: HTMLLIElement 6 | } 7 | 8 | export class Dialog implements DialogApi { 9 | private readonly divDialog: HTMLDivElement = 10 | document.getElementById('dialog') as HTMLDivElement 11 | 12 | private readonly divLabel: HTMLDivElement = 13 | document.getElementById('dialog-label') as HTMLDivElement 14 | 15 | private readonly input: HTMLInputElement = 16 | document.getElementById('dialog-input') as HTMLInputElement 17 | 18 | private readonly olSug: HTMLOListElement = 19 | document.getElementById('dialog-sug') as HTMLOListElement 20 | 21 | private suggestions: SuggestionLi[] = [] 22 | 23 | private onAccept = (val: string, sug: Suggestion) => { } 24 | private suggest = val => [] 25 | private cur: number 26 | 27 | constructor() { 28 | const on = (type, action, capture = false) => 29 | this.input.addEventListener(type, action, capture) 30 | 31 | on('keydown', e => { 32 | e.stopPropagation() 33 | }) 34 | on('blur', this.close) 35 | on('keydown', shortway('esc', this.close)) 36 | on('keydown', shortway('enter', () => { 37 | this.close() 38 | this.onAccept( 39 | this.input.value, 40 | this.suggestions[this.cur] 41 | ) 42 | })) 43 | 44 | 45 | on('keydown', shortway('down', () => 46 | this.setCur(this.cur + 1) 47 | )) 48 | 49 | on('keydown', shortway('up', () => 50 | this.setCur(this.cur - 1) 51 | )) 52 | 53 | on('input', this.updateSuggestions) 54 | } 55 | 56 | private updateSuggestions = () => { 57 | this.suggestions = 58 | this.suggest(this.input.value) 59 | .map(sug => { 60 | const li = document.createElement('li') 61 | li.innerHTML = sug.html 62 | sug.li = li 63 | return sug 64 | }) 65 | this.clearSuggestions() 66 | this.suggestions.forEach(sug => { 67 | this.olSug.appendChild(sug.li) 68 | }) 69 | const curSuggestion = this.suggestions[this.cur = 0] 70 | if (curSuggestion) curSuggestion.li.setAttribute('cur', '') 71 | } 72 | 73 | private setCur = (i: number) => { 74 | if (!this.suggestions.length) return 75 | const curSug = this.suggestions[this.cur] 76 | if (curSug) curSug.li.removeAttribute('cur') 77 | this.cur = Math.max(0, Math.min(i, this.suggestions.length - 1)) 78 | this.suggestions[this.cur].li.setAttribute('cur', '') 79 | } 80 | 81 | private clearSuggestions = () => { 82 | while (this.olSug.lastChild) this.olSug.removeChild(this.olSug.lastChild) 83 | } 84 | 85 | 86 | private close = () => { 87 | this.divDialog.style.display = 'none' 88 | } 89 | 90 | open = (spec: DialogSpec) => { 91 | this.suggestions = [] 92 | this.clearSuggestions() 93 | this.divLabel.textContent = spec.label 94 | this.cur = 0 95 | 96 | this.divDialog.style.display = 'block' 97 | this.input.value = '' 98 | this.input.select() 99 | 100 | spec.onOpen && spec.onOpen(this.input) 101 | this.suggest = spec.suggest || (val => []) 102 | this.onAccept = spec.onAccept 103 | } 104 | } -------------------------------------------------------------------------------- /ts/JumpFm.ts: -------------------------------------------------------------------------------- 1 | import { } from 'electron' 2 | import { JumpFm as JumpFmApi } from 'jumpfm-api' 3 | import { Panel } from "./Panel" 4 | import { StatusBar } from "./StatusBar" 5 | import { PluginManager } from "./PluginManager"; 6 | import { Dialog } from "./Dialog"; 7 | import { shortway } from "./shortway"; 8 | import { Settings } from "./Settings"; 9 | import { 10 | getKeys 11 | , saveKeyboard 12 | , root 13 | , packageJson 14 | , keyboardPath 15 | , settingsPath 16 | , pluginsPackageJson 17 | } from "./files"; 18 | 19 | import * as homedir from 'homedir' 20 | import * as fs from 'fs' 21 | import * as watch from 'node-watch' 22 | 23 | export class JumpFm implements JumpFmApi { 24 | private active: 0 | 1 = 0 25 | private readonly divPanels = document.getElementById('panels') 26 | private readonly pluginManager = new PluginManager(this) 27 | private readonly watchers: { [name: string]: fs.FSWatcher } = {} 28 | 29 | readonly package = packageJson 30 | readonly root = root 31 | readonly settings = new Settings() 32 | readonly dialog = new Dialog() 33 | readonly electron: Electron.AllElectron = require('electron') 34 | readonly panels: Panel[] = [new Panel(), new Panel()] 35 | readonly statusBar: StatusBar = new StatusBar() 36 | readonly argv: string[] 37 | 38 | private passive = (): 0 | 1 => (this.active + 1) % 2 as 0 | 1 39 | 40 | private setActive = (i: 0 | 1) => { 41 | this.active = i 42 | this.panels[this.active].setActive(true) 43 | this.panels[this.passive()].setActive(false) 44 | } 45 | 46 | watchStart = (name, path, then, recursive = false) => { 47 | this.watchStop(name) 48 | console.log('WATCH START', name, path) 49 | setImmediate(() => { 50 | let to 51 | this.watchers[name] = watch(path, { recursive: recursive }, () => { 52 | clearTimeout(to) 53 | to = setTimeout(then, 10) 54 | }) 55 | }) 56 | } 57 | 58 | watchStop = (name: string) => { 59 | if (this.watchers[name]) { 60 | console.log('WATCH STOP', name) 61 | this.watchers[name].close() 62 | } 63 | } 64 | 65 | getPanelActive = () => 66 | this.panels[this.active] 67 | 68 | getPanelPassive = () => 69 | this.panels[this.passive()] 70 | 71 | panelsSwap = () => { 72 | this.active = this.passive() 73 | const tmp = this.panels[0] 74 | this.panels[0] = this.panels[1] 75 | this.panels[1] = tmp 76 | this.divPanels.insertBefore(this.panels[0].divPanel, this.panels[1].divPanel) 77 | } 78 | 79 | panelsSwitch = () => 80 | this.setActive(this.passive()) 81 | 82 | bind = (actionName: string, defaultKeys: string[], action: () => void) => { 83 | getKeys(actionName, defaultKeys).forEach(combo => { 84 | const cb = shortway(combo, (e) => { 85 | e.preventDefault() 86 | action() 87 | }) 88 | document.addEventListener('keydown', cb, false) 89 | }) 90 | } 91 | 92 | constructor(argv: string[]) { 93 | this.argv = argv 94 | this.panels.forEach(panel => { 95 | this.divPanels.appendChild(panel.divPanel) 96 | }) 97 | 98 | const opn = (url) => () => this.electron.shell.openItem(url) 99 | this.statusBar.buttonAdd('fa-info', 'About', opn('http://jumpfm.org')) 100 | this.statusBar.buttonAdd('fa-key', 'Keyboard', opn(keyboardPath)) 101 | this.statusBar.buttonAdd('fa-gear', 'Settings', opn(settingsPath)) 102 | this.statusBar.buttonAdd('fa-plug', 'Plugins', opn(pluginsPackageJson)) 103 | 104 | this.pluginManager.loadAndUpdatePlugins(() => { 105 | saveKeyboard() 106 | this.panels.forEach(panel => panel.cd(homedir())) 107 | this.setActive(0) 108 | }) 109 | } 110 | } -------------------------------------------------------------------------------- /ts/PluginManager.ts: -------------------------------------------------------------------------------- 1 | import { JumpFm } from 'jumpfm-api' 2 | 3 | import { 4 | pluginsPath, 5 | pluginsPackageJson, 6 | packageJson, 7 | savePlugins 8 | } from './files'; 9 | 10 | import * as check from 'check-dependencies' 11 | import * as fs from 'fs-extra' 12 | import * as npm from 'npm' 13 | import * as path from 'path' 14 | import * as watch from 'node-watch' 15 | 16 | interface checkRes { 17 | status: number, // 0 if successful, 1 otherwise 18 | depsWereOk: boolean, // true if dependencies were already satisfied 19 | log: string[], // array of logged messages 20 | error: string[], // array of logged errors 21 | } 22 | 23 | const defaultPlugins = { 24 | dependencies: { 25 | "jumpfm-font-size": "latest", 26 | "jumpfm-clock": "latest", 27 | "jumpfm-copy": "latest", 28 | "jumpfm-file-ops": "latest", 29 | "jumpfm-filter": "latest", 30 | "jumpfm-flat-mode": "latest", 31 | "jumpfm-fs": "latest", 32 | "jumpfm-gist": "latest", 33 | "jumpfm-git-status": "latest", 34 | "jumpfm-history": "latest", 35 | "jumpfm-icons": "latest", 36 | "jumpfm-jump": "latest", 37 | "jumpfm-key-nav": "latest", 38 | "jumpfm-version": "latest", 39 | "jumpfm-weather": "latest", 40 | "jumpfm-zip": "latest" 41 | } 42 | } 43 | 44 | class PluginsLoader { 45 | jumpFm: JumpFm; 46 | done: (err?: any) => void; 47 | private loaded = {} 48 | 49 | constructor(jumpFm: JumpFm, done: (err?) => void) { 50 | this.jumpFm = jumpFm 51 | this.done = () => { 52 | jumpFm.statusBar.msg('plugins').setText('') 53 | done() 54 | } 55 | } 56 | 57 | private loadCss = (href) => { 58 | if (!href) return 59 | const link = document.createElement('link') 60 | link.setAttribute('rel', 'stylesheet') 61 | link.setAttribute('href', href) 62 | document.head.appendChild(link) 63 | } 64 | 65 | private loadPlugin = (name: string) => { 66 | try { 67 | console.time(name) 68 | 69 | if (this.loaded[name]) return 70 | this.loaded[name] = true 71 | 72 | const pluginDir = path.join(pluginsPath, 'node_modules', name) 73 | const plugin = require(pluginDir) 74 | 75 | if (plugin.css) 76 | plugin.css.forEach(css => 77 | this.loadCss(path.join(pluginDir, css)) 78 | ) 79 | 80 | plugin.load(this.jumpFm) 81 | 82 | console.timeEnd(name) 83 | } catch (e) { 84 | console.log(e) 85 | } 86 | } 87 | 88 | private getPackage = () => { 89 | try { 90 | return fs.readJsonSync(pluginsPackageJson) 91 | } catch (e) { 92 | fs.writeFileSync( 93 | pluginsPackageJson 94 | , JSON.stringify(defaultPlugins, null, 4) 95 | ) 96 | return defaultPlugins 97 | } 98 | } 99 | 100 | loadPlugins(pkg) { 101 | try { 102 | Object.keys(pkg.dependencies).forEach(name => { 103 | this.loadPlugin(name) 104 | }) 105 | this.done() 106 | } catch (e) { 107 | console.log(e) 108 | this.done(e) 109 | } 110 | } 111 | 112 | load() { 113 | const pkg = this.getPackage() 114 | const checkRes: checkRes = check.sync({ 115 | packageDir: pluginsPath 116 | }) 117 | if (checkRes.depsWereOk) { 118 | this.loadPlugins(pkg) 119 | } 120 | process.chdir(pluginsPath) 121 | npm.load({ 122 | save: true 123 | }, (err, res) => { 124 | if (err) return this.done(err) 125 | npm.commands.update([], (err, res) => { 126 | if (err) return this.done(err) 127 | if (!checkRes.depsWereOk) this.loadPlugins(pkg) 128 | }) 129 | }) 130 | } 131 | } 132 | 133 | export class PluginManager { 134 | readonly jumpFm: JumpFm 135 | 136 | constructor(jumpFm) { 137 | this.jumpFm = jumpFm 138 | } 139 | 140 | loadAndUpdatePlugins = (done: (err?) => void) => { 141 | this.jumpFm.statusBar.msg('plugins') 142 | .setType('info') 143 | .setText('Downloading plugins (can take a while)...') 144 | .setTooltip('This might take some time') 145 | 146 | const pluginLoader = new PluginsLoader(this.jumpFm, done) 147 | 148 | pluginLoader.load() 149 | watch(pluginsPackageJson, () => { 150 | pluginLoader.load() 151 | }) 152 | } 153 | } -------------------------------------------------------------------------------- /ts/Panel.ts: -------------------------------------------------------------------------------- 1 | import { Panel as PanelApi, Url, File } from 'jumpfm-api' 2 | 3 | import { Item } from './Item' 4 | import { Filter } from './Filter' 5 | import { getKeys } from "./files"; 6 | import { shortway } from "./shortway"; 7 | 8 | export class Panel implements PanelApi { 9 | private readonly table: HTMLTableElement = document.createElement('table') 10 | private readonly tbody: HTMLTableSectionElement = document.createElement('tbody') 11 | private readonly thead: HTMLTableSectionElement = document.createElement('thead') 12 | private readonly title: HTMLTitleElement = document.createElement('title') 13 | private readonly trHead: HTMLTableRowElement = document.createElement('tr') 14 | 15 | readonly divPanel: HTMLDivElement = document.createElement('div') 16 | readonly filterBox: Filter = new Filter() 17 | 18 | private readonly filters: { [name: string]: ((item: Item) => boolean) } = {} 19 | private readonly onCds: (() => void)[] = [] 20 | private readonly onItemsAddeds: ((newItems: Item[]) => void)[] = [] 21 | private readonly onLoads: (() => void)[] = [] 22 | 23 | private active = false 24 | private url: Url 25 | private cur: number = 0 26 | private items: Item[] = [] 27 | private visibleItems: Item[] = [] 28 | 29 | constructor() { 30 | ['', 'Name', 'Size', 'Time'].forEach(head => { 31 | const td = document.createElement('td') 32 | td.textContent = head 33 | this.trHead.appendChild(td) 34 | }) 35 | 36 | this.divPanel.className = 'panel' 37 | this.divPanel.appendChild(this.title) 38 | this.divPanel.appendChild(this.table) 39 | this.thead.appendChild(this.trHead) 40 | this.table.appendChild(this.thead) 41 | this.table.appendChild(this.tbody) 42 | this.divPanel.appendChild(this.filterBox.input) 43 | 44 | this.filterBox.onChange(this.setTitle) 45 | } 46 | 47 | private clearItems = () => { 48 | while (this.tbody.lastChild) this.tbody.removeChild(this.tbody.lastChild) 49 | } 50 | 51 | private addItems = (items: Item[]) => { 52 | items.forEach(item => this.tbody.appendChild(item.tr)) 53 | } 54 | 55 | private setTitle = () => { 56 | const filter = this.filterBox.get() 57 | const protocol = this.url.protocol 58 | this.title.textContent = 59 | (protocol ? protocol + ':' : '') 60 | + this.url.path 61 | + (filter ? ' [' + filter + ']' : '') 62 | } 63 | 64 | private scrollToCur = () => { 65 | const curItem = this.getCurrentItem() 66 | if (!curItem) return 67 | const tr = curItem.tr 68 | const trRect = tr.getBoundingClientRect() 69 | const tbodyRect = this.tbody.getBoundingClientRect() 70 | if (trRect.bottom > tbodyRect.bottom) 71 | tr.scrollIntoView(false) 72 | if (trRect.top < tbodyRect.top) 73 | tr.scrollIntoView(true) 74 | } 75 | 76 | private safeUpdateCurrent = (b: boolean) => { 77 | const item = this.getCurrentItem() 78 | if (item) item.setCur(b) 79 | } 80 | 81 | private setCur = (i) => { 82 | this.safeUpdateCurrent(false) 83 | this.cur = Math.max(0, Math.min(i, this.visibleItems.length - 1)) 84 | this.safeUpdateCurrent(true) 85 | } 86 | 87 | private progressiveProcessItems = 88 | (process: (items: Item[]) => void) => 89 | (from: number, done?: () => void) => { 90 | 91 | if (from > this.items.length) return done && done() 92 | const to = from + 100 93 | 94 | process(this.items.slice(from, to)) 95 | 96 | setImmediate(() => { 97 | this.progressiveProcessItems(process)(to, done) 98 | }) 99 | } 100 | 101 | private progressiveAddItems = this.progressiveProcessItems(items => { 102 | this.addItems(items) 103 | 104 | this.onItemsAddeds.forEach(f => 105 | setImmediate(() => f(items)) 106 | ) 107 | }) 108 | 109 | private progressiveUpdateVisibility = this.progressiveProcessItems(items => { 110 | items.forEach(item => { 111 | const visible = 112 | Object.values(this.filters) 113 | .every(filter => filter(item)) 114 | 115 | if (visible) { 116 | this.visibleItems.push(item) 117 | item.show() 118 | } else { 119 | item.hide() 120 | } 121 | }) 122 | }) 123 | 124 | 125 | private updateVisibility = () => { 126 | console.log('updateVisibility') 127 | this.safeUpdateCurrent(false) 128 | this.visibleItems = [] 129 | this.progressiveUpdateVisibility(0, () => { 130 | console.log('progressiveUpdateVisibility') 131 | this.setCur(this.cur) 132 | this.scrollToCur() 133 | }) 134 | } 135 | 136 | private selectRange = (from: number, to: number) => { 137 | if (from > to) return this.selectRange(to, from) 138 | for (let i = from 139 | ; i <= Math.min(to, this.visibleItems.length - 1) 140 | ; i++ 141 | ) { 142 | const item = this.visibleItems[i] 143 | if (item) item.setSelected(true) 144 | } 145 | } 146 | 147 | private rowsInView = () => { 148 | return Math.floor(this.tbody.clientHeight / this.visibleItems[0].tr.scrollHeight) 149 | } 150 | 151 | private stepTo = (i, select: boolean = false) => { 152 | if (select) this.selectRange(this.cur, i) 153 | this.setCur(i) 154 | this.scrollToCur() 155 | } 156 | 157 | setActive = (b: boolean) => { 158 | this.active = b 159 | if (b) 160 | this.divPanel.setAttribute('active', '') 161 | else 162 | this.divPanel.removeAttribute('active') 163 | } 164 | 165 | cd(path: string): void; 166 | cd(url: Url): void; 167 | cd(pathOrUrl: any) { 168 | if (typeof pathOrUrl == 'string') return this.cd({ 169 | protocol: '', 170 | path: pathOrUrl, 171 | query: {} 172 | }) 173 | 174 | this.url = pathOrUrl as Url 175 | console.log('cd', this.url) 176 | this.setTitle() 177 | this.onCds.forEach(f => setImmediate(f)) 178 | } 179 | 180 | onCd = (then: () => void) => 181 | this.onCds.push(then) 182 | 183 | onItemsAdded = (then: (newItems: Item[]) => void) => 184 | this.onItemsAddeds.push(then) 185 | 186 | onLoad = (then: () => void) => { 187 | this.onLoads.push(then) 188 | } 189 | 190 | step = (d: number, select?: boolean) => { 191 | const newCur 192 | = d < 0 193 | ? Math.max(0, this.cur + d) 194 | : Math.min(this.cur + d, this.visibleItems.length - 1) 195 | 196 | this.stepTo(newCur, select) 197 | } 198 | 199 | stepPgUp = (select?: boolean) => { 200 | this.step(-this.rowsInView(), select) 201 | } 202 | 203 | stepPgDown = (select?: boolean) => { 204 | this.step(this.rowsInView(), select) 205 | } 206 | 207 | stepStart = (select?: boolean) => { 208 | this.stepTo(0, select) 209 | } 210 | 211 | stepEnd = (select?: boolean) => { 212 | this.stepTo(this.visibleItems.length - 1, select) 213 | } 214 | 215 | selectNone = () => 216 | this.items.forEach(item => item.setSelected(false)) 217 | 218 | selectAll = () => 219 | this.items.forEach(item => item.setSelected(true)) 220 | 221 | selectToggleCurrent = () => { 222 | const item = this.getCurrentItem() 223 | item.setSelected(!item.isSelected()) 224 | } 225 | 226 | getUrl = () => 227 | this.url 228 | 229 | getItems = () => 230 | this.items 231 | 232 | getSelectedItems = () => 233 | this.visibleItems.filter((item, i) => 234 | i === this.cur || item.isSelected() 235 | ) 236 | 237 | getCurrentItem = () => 238 | this.visibleItems[this.cur] 239 | 240 | setItems = (items: File[]) => { 241 | console.log('setItems') 242 | this.items = items.map(item => new Item(item)) 243 | 244 | this.clearItems() 245 | this.progressiveAddItems(0, () => { 246 | this.onLoads.forEach(onLoad => { 247 | setImmediate(onLoad) 248 | }) 249 | }) 250 | this.updateVisibility() 251 | return this 252 | } 253 | 254 | filterSet = (name: string, filter: (item: Item) => boolean) => { 255 | console.log('filterSet', filter) 256 | this.filters[name] = filter 257 | this.updateVisibility() 258 | } 259 | 260 | filterRemove = (name: string) => { 261 | delete this.filters[name] 262 | this.updateVisibility() 263 | } 264 | 265 | bind = (actionName: string, defaultKeys: string[], action: () => void) => { 266 | getKeys(actionName, defaultKeys).forEach(combo => { 267 | const cb = shortway(combo, (e) => { 268 | if (!this.active) return 269 | e.preventDefault() 270 | action() 271 | }) 272 | document.addEventListener('keydown', cb, false) 273 | }) 274 | } 275 | } -------------------------------------------------------------------------------- /misc/icons.txt: -------------------------------------------------------------------------------- 1 | /* tslint:disable max-line-length */ 2 | import { languages } from './languages'; 3 | import { FileFormat, IFileCollection } from '../models'; 4 | 5 | export const extensions: IFileCollection = { 6 | default: { 7 | file: { icon: 'file', format: FileFormat.svg }, 8 | }, 9 | supported: [ 10 | { icon: 'access', extensions: ['accdb', 'accdt', 'mdb', 'accda', 'accdc', 'accde', 'accdp', 'accdr', 'accdu', 'ade', 'adp', 'laccdb', 'ldb', 'mam', 'maq', 'mdw'], format: FileFormat.svg }, 11 | { icon: 'actionscript', extensions: [], languages: [languages.actionscript], format: FileFormat.svg }, 12 | { icon: 'ai', extensions: ['ai'], format: FileFormat.svg }, 13 | { icon: 'ai2', extensions: ['ai'], format: FileFormat.svg, disabled: true }, 14 | { icon: 'org', extensions: ['org'], format: FileFormat.svg }, 15 | { icon: 'angular', extensions: ['.angular-cli.json', 'angular-cli.json'], filename: true, format: FileFormat.svg }, 16 | { icon: 'ng_component_ts', extensions: ['component.ts'], format: FileFormat.svg, disabled: true }, 17 | { icon: 'ng_component_js', extensions: ['component.js'], format: FileFormat.svg, disabled: true }, 18 | { icon: 'ng_controller_ts', extensions: ['controller.ts'], format: FileFormat.svg, disabled: true }, 19 | { icon: 'ng_controller_js', extensions: ['controller.js'], format: FileFormat.svg, disabled: true }, 20 | { icon: 'ng_directive_ts', extensions: ['directive.ts'], format: FileFormat.svg, disabled: true }, 21 | { icon: 'ng_directive_js', extensions: ['directive.js'], format: FileFormat.svg, disabled: true }, 22 | { icon: 'ng_guard_ts', extensions: ['guard.ts'], format: FileFormat.svg, disabled: true }, 23 | { icon: 'ng_guard_js', extensions: ['guard.js'], format: FileFormat.svg, disabled: true }, 24 | { icon: 'ng_module_ts', extensions: ['module.ts'], format: FileFormat.svg, disabled: true }, 25 | { icon: 'ng_module_js', extensions: ['module.js'], format: FileFormat.svg, disabled: true }, 26 | { icon: 'ng_pipe_ts', extensions: ['pipe.ts'], format: FileFormat.svg, disabled: true }, 27 | { icon: 'ng_pipe_js', extensions: ['pipe.js'], format: FileFormat.svg, disabled: true }, 28 | { icon: 'ng_routing_ts', extensions: ['routing.ts'], format: FileFormat.svg, disabled: true }, 29 | { icon: 'ng_routing_js', extensions: ['routing.js'], format: FileFormat.svg, disabled: true }, 30 | { icon: 'ng_routing_ts', extensions: ['app-routing.module.ts'], filename: true, format: FileFormat.svg, disabled: true }, 31 | { icon: 'ng_routing_js', extensions: ['app-routing.module.js'], filename: true, format: FileFormat.svg, disabled: true }, 32 | { icon: 'ng_smart_component_ts', extensions: ['page.ts', 'container.ts'], format: FileFormat.svg, disabled: true }, 33 | { icon: 'ng_smart_component_js', extensions: ['page.js', 'container.js'], format: FileFormat.svg, disabled: true }, 34 | { icon: 'ng_service_ts', extensions: ['service.ts'], format: FileFormat.svg, disabled: true }, 35 | { icon: 'ng_service_js', extensions: ['service.js'], format: FileFormat.svg, disabled: true }, 36 | { icon: 'ng_component_ts2', extensions: ['component.ts'], format: FileFormat.svg, disabled: true }, 37 | { icon: 'ng_component_js2', extensions: ['component.js'], format: FileFormat.svg, disabled: true }, 38 | { icon: 'ng_directive_ts2', extensions: ['directive.ts'], format: FileFormat.svg, disabled: true }, 39 | { icon: 'ng_directive_js2', extensions: ['directive.js'], format: FileFormat.svg, disabled: true }, 40 | { icon: 'ng_module_ts2', extensions: ['module.ts'], format: FileFormat.svg, disabled: true }, 41 | { icon: 'ng_module_js2', extensions: ['module.js'], format: FileFormat.svg, disabled: true }, 42 | { icon: 'ng_pipe_ts2', extensions: ['pipe.ts'], format: FileFormat.svg, disabled: true }, 43 | { icon: 'ng_pipe_js2', extensions: ['pipe.js'], format: FileFormat.svg, disabled: true }, 44 | { icon: 'ng_routing_ts2', extensions: ['routing.ts'], format: FileFormat.svg, disabled: true }, 45 | { icon: 'ng_routing_js2', extensions: ['routing.js'], format: FileFormat.svg, disabled: true }, 46 | { icon: 'ng_routing_ts2', extensions: ['app-routing.module.ts'], filename: true, format: FileFormat.svg, disabled: true }, 47 | { icon: 'ng_routing_js2', extensions: ['app-routing.module.js'], filename: true, format: FileFormat.svg, disabled: true }, 48 | { icon: 'ng_smart_component_ts2', extensions: ['page.ts', 'container.ts'], format: FileFormat.svg, disabled: true }, 49 | { icon: 'ng_smart_component_js2', extensions: ['page.js', 'container.js'], format: FileFormat.svg, disabled: true }, 50 | { icon: 'ng_service_ts2', extensions: ['service.ts'], format: FileFormat.svg, disabled: true }, 51 | { icon: 'ng_service_js2', extensions: ['service.js'], format: FileFormat.svg, disabled: true }, 52 | { icon: 'ansible', extensions: [], languages: [languages.ansible], format: FileFormat.svg }, 53 | { icon: 'anyscript', extensions: [], languages: [languages.anyscript], format: FileFormat.svg }, 54 | { icon: 'apache', extensions: [], languages: [languages.apache], format: FileFormat.svg }, 55 | { icon: 'apib', extensions: [], languages: [languages.apib], format: FileFormat.svg }, 56 | { icon: 'applescript', extensions: [], languages: [languages.applescript], format: FileFormat.svg }, 57 | { icon: 'appveyor', extensions: ['appveyor.yml', '.appveyor.yml'], filename: true, format: FileFormat.svg }, 58 | { icon: 'asp', extensions: [], languages: [languages.asp], format: FileFormat.svg }, 59 | { icon: 'aspx', extensions: ['aspx', 'ascx'], format: FileFormat.svg }, 60 | { icon: 'assembly', extensions: [], languages: [languages.assembly], format: FileFormat.svg }, 61 | { // https://en.wikipedia.org/wiki/Audio_file_format 62 | icon: 'audio', 63 | extensions: ['aac', 'act', 'aiff', 'amr', 'ape', 'au', 'dct', 'dss', 'dvf', 'flac', 'gsm', 64 | 'iklax', 'ivs', 'm4a', 'm4b', 'm4p', 'mmf', 'mogg', 'mp3', 'mpc', 'msv', 'oga', 'ogg', 'opus', 65 | 'ra', 'raw', 'tta', 'vox', 'wav', 'wma'], 66 | format: FileFormat.svg, 67 | }, 68 | { icon: 'aurelia', extensions: ['aurelia.json'], filename: true, format: FileFormat.svg }, 69 | { icon: 'autohotkey', extensions: [], languages: [languages.autohotkey], format: FileFormat.svg }, 70 | { icon: 'autoit', extensions: [], languages: [languages.autoit], format: FileFormat.svg }, 71 | { icon: 'aws', extensions: [], format: FileFormat.svg }, 72 | { icon: 'babel', extensions: ['.babelrc', 'babelrc.js'], light: true, filename: true, format: FileFormat.svg }, 73 | { icon: 'babel2', extensions: ['.babelrc', 'babelrc.js'], light: true, filename: true, format: FileFormat.svg, disabled: true }, 74 | { icon: 'bat', extensions: [], languages: [languages.bat], format: FileFormat.svg }, 75 | { // http://www.file-extensions.org/filetype/extension/name/binary-files 76 | icon: 'binary', 77 | extensions: ['a', 'app', 'bin', 'cmo', 'cmx', 'cma', 'cmxa', 'cmi', 'dll', 'exe', 'hl', 'ilk', 78 | 'lib', 'n', 'ndll', 'o', 'obj', 'pyc', 'pyd', 'pyo', 'pdb', 'scpt', 'scptd', 'so'], 79 | format: FileFormat.svg, 80 | }, 81 | { icon: 'bithound', extensions: ['.bithoundrc'], filename: true, format: FileFormat.svg }, 82 | { icon: 'blade', extensions: [], languages: [languages.blade], format: FileFormat.svg }, 83 | { icon: 'bolt', extensions: [], languages: [languages.bolt], filename: true, format: FileFormat.svg }, 84 | { icon: 'bower', extensions: ['.bowerrc', 'bower.json'], filename: true, format: FileFormat.svg }, 85 | { icon: 'buckbuild', extensions: ['.buckconfig'], filename: true, format: FileFormat.svg }, 86 | { icon: 'bundler', extensions: ['gemfile', 'gemfile.lock'], filename: true, format: FileFormat.svg }, 87 | { icon: 'c', extensions: [], languages: [languages.c], format: FileFormat.svg }, 88 | { icon: 'c2', extensions: [], languages: [languages.c], format: FileFormat.svg, disabled: true }, 89 | { icon: 'cabal', extensions: [], languages: [languages.cabal], format: FileFormat.svg }, 90 | { icon: 'cake', extensions: [], languages: [languages.cake], format: FileFormat.svg }, 91 | { icon: 'cakephp', extensions: [], format: FileFormat.svg }, 92 | { icon: 'cert', extensions: ['csr', 'crt', 'cer', 'der', 'pfx', 'p12', 'p7b', 'p7r', 'src', 'crl', 'sst', 'stl'], format: FileFormat.svg }, 93 | { icon: 'cf', extensions: ['lucee'], languages: [languages.coldfusion], format: FileFormat.svg }, 94 | { icon: 'cf2', extensions: ['lucee'], languages: [languages.coldfusion], format: FileFormat.svg, disabled: true }, 95 | { icon: 'cfc', extensions: [], languages: [languages.cfc], format: FileFormat.svg }, 96 | { icon: 'cfc2', extensions: [], languages: [languages.cfc], format: FileFormat.svg, disabled: true }, 97 | { icon: 'cfm', extensions: [], languages: [languages.cfm], format: FileFormat.svg }, 98 | { icon: 'cfm2', extensions: [], languages: [languages.cfm], format: FileFormat.svg, disabled: true }, 99 | { icon: 'cheader', extensions: ['h'], format: FileFormat.svg }, 100 | { icon: 'chef', extensions: ['chefignore', 'berksfile', 'berksfile.lock', 'policyfile'], filename: true, format: FileFormat.svg }, 101 | { icon: 'class', extensions: ['class'], format: FileFormat.svg }, 102 | { icon: 'circleci', extensions: ['circle.yml'], light: true, filename: true, format: FileFormat.svg }, 103 | { icon: 'clojure', extensions: ['cjm', 'cljc'], languages: [languages.clojure], format: FileFormat.svg }, 104 | { icon: 'cmake', extensions: [], languages: [languages.cmake, languages.cmakecache], format: FileFormat.svg }, 105 | { icon: 'cobol', extensions: [], languages: [languages.cobol], format: FileFormat.svg }, 106 | { icon: 'codeclimate', extensions: ['.codeclimate.yml'], light: true, filename: true, format: FileFormat.svg }, 107 | { icon: 'codecov', extensions: ['codecov.yml', '.codecov.yml'], filename: true, format: FileFormat.svg }, 108 | { icon: 'codekit', extensions: ['kit'], format: FileFormat.svg }, 109 | { icon: 'codekit', extensions: ['config.codekit', 'config.codekit2', 'config.codekit3'], filename: true, format: FileFormat.svg }, 110 | { icon: 'coffeescript', extensions: [], languages: [languages.coffeescript], format: FileFormat.svg }, 111 | { icon: 'config', extensions: ['env'], light: true, languages: [languages.properties], format: FileFormat.svg }, 112 | { icon: 'config', extensions: ['.env.example'], light: true, filename: true, format: FileFormat.svg }, 113 | { icon: 'compass', extensions: [], format: FileFormat.svg }, 114 | { icon: 'composer', extensions: ['composer.json', 'composer.lock'], filename: true, format: FileFormat.svg }, 115 | { icon: 'cpp', extensions: [], languages: [languages.cpp], format: FileFormat.svg }, 116 | { icon: 'cpp2', extensions: [], languages: [languages.cpp], format: FileFormat.svg, disabled: true }, 117 | { icon: 'cppheader', extensions: ['hpp'], format: FileFormat.svg }, 118 | { icon: 'crystal', extensions: [], languages: [languages.crystal], format: FileFormat.svg }, 119 | { icon: 'csharp', extensions: ['csx'], languages: [languages.csharp], format: FileFormat.svg }, 120 | { icon: 'csproj', extensions: ['csproj'], format: FileFormat.svg }, 121 | { icon: 'css', extensions: [], languages: [languages.css], format: FileFormat.svg }, 122 | { icon: 'csslint', extensions: ['.csslintrc'], filename: true, format: FileFormat.svg }, 123 | { icon: 'cssmap', extensions: ['css.map'], format: FileFormat.svg }, 124 | { icon: 'cucumber', extensions: [], languages: [languages.cucumber], format: FileFormat.svg }, 125 | { icon: 'dartlang', extensions: [], languages: [languages.dart], format: FileFormat.svg }, 126 | { icon: 'db', extensions: ['db'], light: true, format: FileFormat.svg }, 127 | { icon: 'delphi', extensions: [], languages: [languages.pascal], format: FileFormat.svg }, 128 | { icon: 'dlang', extensions: [], languages: [languages.dlang], format: FileFormat.svg }, 129 | { icon: 'diff', extensions: [], languages: [languages.diff], format: FileFormat.svg }, 130 | { icon: 'docker', extensions: ['.dockerignore', 'docker-compose.yml', 'docker-compose.ci-build.yml', 'docker-compose.override.yml', 'docker-compose.vs.debug.yml', 'docker-compose.vs.release.yml', 'docker-cloud.yml'], filename: true, languages: [languages.dockerfile], format: FileFormat.svg }, 131 | { icon: 'docker2', extensions: ['.dockerignore', 'docker-compose.yml', 'docker-compose.ci-build.yml', 'docker-compose.override.yml', 'docker-compose.vs.debug.yml', 'docker-compose.vs.release.yml', 'docker-cloud.yml'], filename: true, languages: [languages.dockerfile], format: FileFormat.svg, disabled: true }, 132 | { icon: 'doxygen', extensions: [], languages: [languages.doxygen], format: FileFormat.svg }, 133 | { icon: 'drone', extensions: ['.drone.yml', '.drone.yml.sig'], light: true, filename: true, format: FileFormat.svg }, 134 | { icon: 'editorconfig', extensions: ['.editorconfig'], filename: true, format: FileFormat.svg }, 135 | { icon: 'ejs', extensions: ['ejs'], format: FileFormat.svg }, 136 | { icon: 'elasticbeanstalk', extensions: [], format: FileFormat.svg }, 137 | { icon: 'elixir', extensions: [], languages: [languages.elixir], format: FileFormat.svg }, 138 | { icon: 'elm', extensions: ['elm-package.json'], filename: true, languages: [languages.elm], format: FileFormat.svg }, 139 | { icon: 'elm2', extensions: ['elm-package.json'], filename: true, languages: [languages.elm], format: FileFormat.svg, disabled: true }, 140 | { icon: 'emacs', extensions: ['el', 'elc'], format: FileFormat.svg }, 141 | { icon: 'ember', extensions: ['.ember-cli'], filename: true, format: FileFormat.svg }, 142 | { icon: 'ensime', extensions: ['ensime'], format: FileFormat.svg }, 143 | { icon: 'eps', extensions: ['eps'], format: FileFormat.svg }, 144 | { icon: 'erb', extensions: [], languages: [languages.erb], format: FileFormat.svg }, 145 | { icon: 'erlang', extensions: ['emakefile', '.emakerfile'], filename: true, languages: [languages.erlang], format: FileFormat.svg }, 146 | { icon: 'eslint', extensions: ['.eslintrc', '.eslintignore', '.eslintrc.js', '.eslintrc.json', '.eslintrc.yaml', '.eslintrc.yml'], filename: true, format: FileFormat.svg }, 147 | { icon: 'eslint2', extensions: ['.eslintrc', '.eslintignore', '.eslintrc.js', '.eslintrc.json', '.eslintrc.yaml', '.eslintrc.yml'], filename: true, format: FileFormat.svg, disabled: true }, 148 | { icon: 'excel', extensions: ['xls', 'xlsx', 'xlsm', 'ods'], format: FileFormat.svg }, 149 | { icon: 'favicon', extensions: ['favicon.ico'], filename: true, format: FileFormat.svg }, 150 | { icon: 'firebase', extensions: ['.firebaserc'], filename: true, format: FileFormat.svg }, 151 | { icon: 'flash', extensions: ['swf', 'swc'], format: FileFormat.svg }, 152 | { icon: 'flow', extensions: ['js.flow'], format: FileFormat.svg }, 153 | { icon: 'flow', extensions: ['.flowconfig'], filename: true, format: FileFormat.svg }, 154 | { icon: 'font', extensions: ['woff', 'woff2', 'ttf', 'otf', 'eot', 'pfa', 'pfb', 'sfd'], light: true, format: FileFormat.svg }, 155 | { icon: 'fortran', extensions: [], languages: [languages.fortran], format: FileFormat.svg }, 156 | { icon: 'fsharp', extensions: [], languages: [languages.fsharp], format: FileFormat.svg }, 157 | { icon: 'fsproj', extensions: ['fsproj'], format: FileFormat.svg }, 158 | { icon: 'freemarker', extensions: [], languages: [languages.freemarker], format: FileFormat.svg }, 159 | { icon: 'fusebox', extensions: ['fuse.js'], filename: true, format: FileFormat.svg }, 160 | { icon: 'galen', extensions: [], languages: [languages.galen], format: FileFormat.svg }, 161 | { icon: 'galen2', extensions: [], languages: [languages.galen], format: FileFormat.svg, disabled: true }, 162 | { icon: 'git', extensions: ['.gitattributes', '.gitconfig', '.gitignore', '.gitmodules', '.gitkeep'], filename: true, languages: [languages.git], format: FileFormat.svg }, 163 | { icon: 'gamemaker', extensions: ['gmx'], languages: [languages.gamemaker], format: FileFormat.svg }, 164 | { icon: 'gamemaker2', extensions: ['yy', 'yyp'], light: true, languages: [languages.gamemaker2], format: FileFormat.svg }, 165 | { icon: 'gamemaker81', extensions: [], languages: [languages.gamemaker81], format: FileFormat.svg }, 166 | { icon: 'gitlab', extensions: ['.gitlab-ci.yml'], filename: true, format: FileFormat.svg }, 167 | { icon: 'glsl', extensions: [], languages: [languages.glsl], format: FileFormat.svg }, 168 | { icon: 'go', extensions: [], languages: [languages.go], format: FileFormat.svg }, 169 | { icon: 'godot', extensions: [], languages: [languages.godot], format: FileFormat.svg }, 170 | { icon: 'gradle', extensions: ['gradle'], format: FileFormat.svg }, 171 | { icon: 'graphql', extensions: ['.gqlconfig'], filename: true, languages: [languages.graphql], format: FileFormat.svg }, 172 | { icon: 'graphviz', extensions: [], languages: [languages.graphviz], format: FileFormat.svg }, 173 | { icon: 'groovy', extensions: [], languages: [languages.groovy], format: FileFormat.svg }, 174 | { icon: 'groovy2', extensions: [], languages: [languages.groovy], format: FileFormat.svg, disabled: true }, 175 | { 176 | icon: 'grunt', extensions: [ 177 | 'gruntfile.coffee', 178 | 'gruntfile.babel.coffee', 179 | 'gruntfile.js', 180 | 'gruntfile.babel.js', 181 | 'gruntfile.ts', 182 | 'gruntfile.babel.ts', 183 | ], 184 | filename: true, format: FileFormat.svg, 185 | }, 186 | { 187 | icon: 'gulp', extensions: [ 188 | 'gulpfile.coffee', 189 | 'gulpfile.babel.coffee', 190 | 'gulpfile.js', 191 | 'gulpfile.babel.js', 192 | 'gulpfile.ts', 193 | 'gulpfile.babel.ts', 194 | ], 195 | filename: true, format: FileFormat.svg, 196 | }, 197 | { icon: 'haml', extensions: [], languages: [languages.haml], format: FileFormat.svg }, 198 | { icon: 'handlebars', extensions: [], languages: [languages.handlebars], format: FileFormat.svg }, 199 | { icon: 'handlebars2', extensions: [], languages: [languages.handlebars], format: FileFormat.svg, disabled: true }, 200 | { icon: 'harbour', extensions: [], languages: [languages.harbour], format: FileFormat.svg }, 201 | { icon: 'haskell', extensions: [], languages: [languages.haskell, languages.literatehaskell], format: FileFormat.svg }, 202 | { icon: 'haskell2', extensions: [], languages: [languages.haskell, languages.literatehaskell], format: FileFormat.svg, disabled: true }, 203 | { icon: 'haxe', extensions: ['haxelib.json'], filename: true, languages: [languages.haxe], format: FileFormat.svg }, 204 | { icon: 'haxecheckstyle', extensions: ['checkstyle.json'], filename: true, format: FileFormat.svg }, 205 | { icon: 'haxedevelop', extensions: ['hxproj'], format: FileFormat.svg }, 206 | { icon: 'hlsl', extensions: [], languages: [languages.hlsl], format: FileFormat.svg }, 207 | { icon: 'html', extensions: [], languages: [languages.html], format: FileFormat.svg }, 208 | { icon: 'idris', extensions: ['idr', 'lidr'], format: FileFormat.svg }, 209 | { icon: 'idrisbin', extensions: ['ibc'], format: FileFormat.svg }, 210 | { icon: 'idrispkg', extensions: ['ipkg'], format: FileFormat.svg }, 211 | { icon: 'image', extensions: ['jpeg', 'jpg', 'gif', 'png', 'bmp', 'tiff', 'ico'], format: FileFormat.svg }, 212 | { icon: 'ini', extensions: [], languages: [languages.ini], light: true, format: FileFormat.svg }, 213 | { icon: 'infopath', extensions: ['infopathxml', 'xsn', 'xsf', 'xtp2'], format: FileFormat.svg }, 214 | { icon: 'ionic', extensions: ['ionic.project', 'ionic.config.json'], filename: true, format: FileFormat.svg }, 215 | { icon: 'jar', extensions: ['jar'], format: FileFormat.svg }, 216 | { icon: 'java', extensions: [], languages: [languages.java], format: FileFormat.svg }, 217 | { icon: 'jbuilder', extensions: ['jbuilder'], format: FileFormat.svg }, 218 | { icon: 'jenkins', extensions: ['jenkinsfile'], filename: true, format: FileFormat.svg }, 219 | { icon: 'jest', extensions: ['jest.config.js', 'jest.json', 'jest.config.json', '.jestrc'], filename: true, format: FileFormat.svg }, 220 | { icon: 'jinja', extensions: [], languages: [languages.jinja], format: FileFormat.svg }, 221 | { icon: 'js', extensions: [], light: true, languages: [languages.javascript], format: FileFormat.svg }, 222 | { icon: 'js_official', extensions: [], languages: [languages.javascript], format: FileFormat.svg, disabled: true }, 223 | { icon: 'jsconfig', extensions: ['jsconfig.json'], light: true, filename: true, format: FileFormat.svg }, 224 | { icon: 'jshint', extensions: ['.jshintrc', '.jshintignore'], filename: true, format: FileFormat.svg }, 225 | { icon: 'jsmap', extensions: ['js.map'], light: true, format: FileFormat.svg }, 226 | { icon: 'json', extensions: [], light: true, languages: [languages.json, languages.textmatejson], format: FileFormat.svg }, 227 | { icon: 'json_official', extensions: [], languages: [languages.json, languages.textmatejson], format: FileFormat.svg, disabled: true }, 228 | { icon: 'json2', extensions: [], languages: [languages.json, languages.textmatejson], format: FileFormat.svg, disabled: true }, 229 | { icon: 'jsonld', extensions: ['jsonld', 'json-ld'], light: true, format: FileFormat.svg }, 230 | { icon: 'jsp', extensions: ['jsp'], format: FileFormat.svg }, 231 | { icon: 'julia', extensions: [], languages: [languages.julia], format: FileFormat.svg }, 232 | { icon: 'julia2', extensions: [], languages: [languages.julia], format: FileFormat.svg, disabled: true }, 233 | { icon: 'karma', extensions: ['karma.conf.js', 'karma.conf.coffee'], filename: true, format: FileFormat.svg }, 234 | { icon: 'key', extensions: ['key', 'pem'], format: FileFormat.svg }, 235 | { icon: 'kite', extensions: ['.kiteignore'], light: true, filename: true, format: FileFormat.svg }, 236 | { icon: 'kitchenci', extensions: ['.kitchen.yml'], filename: true, format: FileFormat.svg }, 237 | { icon: 'kotlin', extensions: [], languages: [languages.kotlin], format: FileFormat.svg }, 238 | { icon: 'layout', extensions: ['master', 'layout.html', 'layout.htm'], format: FileFormat.svg }, 239 | { icon: 'layout', extensions: ['layout.html', 'layout.htm'], filename: true, format: FileFormat.svg }, 240 | { icon: 'lerna', extensions: ['lerna.json'], light: true, filename: true, format: FileFormat.svg }, 241 | { icon: 'less', extensions: [], languages: [languages.less], format: FileFormat.svg }, 242 | { icon: 'license', extensions: ['enc'], format: FileFormat.svg }, 243 | { icon: 'license', extensions: ['license', 'licence', 'license.md', 'licence.md', 'license.txt', 'licence.txt'], filename: true, format: FileFormat.svg }, 244 | { icon: 'lisp', extensions: [], languages: [languages.lisp], format: FileFormat.svg }, 245 | { icon: 'lime', extensions: ['hxp'], format: FileFormat.svg }, 246 | { icon: 'lime', extensions: ['include.xml'], filename: true, format: FileFormat.svg }, 247 | { icon: 'liquid', extensions: ['liquid'], format: FileFormat.svg }, 248 | { icon: 'locale', extensions: [], format: FileFormat.svg }, 249 | { icon: 'log', extensions: ['log'], format: FileFormat.svg }, 250 | { icon: 'lsl', extensions: ['lsl'], format: FileFormat.svg }, 251 | { icon: 'lua', extensions: [], languages: [languages.lua], format: FileFormat.svg }, 252 | { icon: 'lync', extensions: ['crec', 'ocrec'], format: FileFormat.svg }, 253 | { icon: 'makefile', extensions: ['makefile'], format: FileFormat.svg }, 254 | { icon: 'makefile', extensions: [], languages: [languages.makefile], format: FileFormat.svg }, 255 | { icon: 'map', extensions: ['map'], format: FileFormat.svg }, 256 | { icon: 'markdown', extensions: ['mdown', 'markdown'], languages: [languages.markdown], format: FileFormat.svg }, 257 | { icon: 'markdownlint', extensions: ['.markdownlint.json'], filename: true, format: FileFormat.svg }, 258 | { icon: 'marko', extensions: [], languages: [languages.marko], format: FileFormat.svg }, 259 | { icon: 'markojs', extensions: ['marko.js'], format: FileFormat.svg }, 260 | { icon: 'matlab', extensions: ['fig', 'mex', 'mexn', 'mexrs6', 'mn', 'mum', 'mx', 'mx3', 'rwd', 'slx', 'slddc', 'smv', 'tikz', 'xvc'], languages: [languages.matlab], format: FileFormat.png }, 261 | { icon: 'meteor', extensions: [], format: FileFormat.svg }, 262 | { icon: 'mjml', extensions: [], languages: [languages.mjml], format: FileFormat.svg }, 263 | { icon: 'mustache', extensions: ['mustache', 'mst'], light: true, format: FileFormat.svg }, 264 | { icon: 'nim', extensions: [], languages: [languages.nim], format: FileFormat.svg }, 265 | { icon: 'njsproj', extensions: ['njsproj'], format: FileFormat.svg }, 266 | { icon: 'node', extensions: ['.nvmrc'], filename: true, format: FileFormat.svg }, 267 | { icon: 'node2', extensions: [], format: FileFormat.svg, disabled: true }, 268 | { icon: 'npm', extensions: ['.npmignore', '.npmrc', 'package.json', 'package-lock.json'], filename: true, format: FileFormat.svg }, 269 | { icon: 'nsi', extensions: [], languages: [languages.nsis], format: FileFormat.svg }, 270 | { icon: 'nuget', extensions: ['nupkg', 'nuspec', 'psmdcp'], format: FileFormat.svg }, 271 | { icon: 'nunjucks', extensions: ['nunj', 'njs'], languages: [languages.nunjucks], format: FileFormat.svg }, 272 | { icon: 'objectivec', extensions: [], languages: [languages.objectivec], format: FileFormat.svg }, 273 | { icon: 'objectivecpp', extensions: [], languages: [languages.objectivecpp], format: FileFormat.svg }, 274 | { icon: 'ocaml', extensions: ['.merlin'], filename: true, languages: [languages.ocaml], format: FileFormat.svg }, 275 | { icon: 'onenote', extensions: ['one', 'onepkg', 'onetoc', 'onetoc2', 'sig'], format: FileFormat.svg }, 276 | { icon: 'opencl', extensions: ['cl', 'opencl'], format: FileFormat.svg }, 277 | { icon: 'outlook', extensions: ['pst', 'bcmx', 'otm', 'msg', 'oft'], format: FileFormat.svg }, 278 | { icon: 'package', extensions: ['pkg'], format: FileFormat.svg }, 279 | { icon: 'paket', extensions: ['paket.dependencies', 'paket.lock', 'paket.references', 'paket.template', 'paket.local'], filename: true, format: FileFormat.svg }, 280 | { icon: 'patch', extensions: ['patch'], format: FileFormat.svg }, 281 | { icon: 'pcl', extensions: ['pcd'], light: true, format: FileFormat.svg }, 282 | { icon: 'pdf', extensions: ['pdf'], format: FileFormat.svg }, 283 | { icon: 'pdf2', extensions: ['pdf'], format: FileFormat.svg, disabled: true }, 284 | { icon: 'perl', extensions: [], languages: [languages.perl], format: FileFormat.svg }, 285 | { icon: 'perl2', extensions: [], languages: [languages.perl], format: FileFormat.svg, disabled: true }, 286 | { icon: 'perl6', extensions: [], languages: [languages.perl6], format: FileFormat.svg }, 287 | { icon: 'photoshop', extensions: ['psd'], format: FileFormat.svg }, 288 | { icon: 'photoshop2', extensions: ['psd'], format: FileFormat.svg, disabled: true }, 289 | { icon: 'php', extensions: ['php1', 'php2', 'php3', 'php4', 'php5', 'php6', 'phps', 'phpsa', 'phpt', 'phtml', 'phar'], languages: [languages.php], format: FileFormat.svg }, 290 | { icon: 'php2', extensions: ['php1', 'php2', 'php3', 'php4', 'php5', 'php6', 'phps', 'phpsa', 'phpt', 'phtml', 'phar'], languages: [languages.php], format: FileFormat.svg, disabled: true }, 291 | { icon: 'php3', extensions: ['php1', 'php2', 'php3', 'php4', 'php5', 'php6', 'phps', 'phpsa', 'phpt', 'phtml', 'phar'], languages: [languages.php], format: FileFormat.svg, disabled: true }, 292 | { icon: 'phpunit', extensions: ['phpunit', 'phpunit.xml', 'phpunit.xml.dist'], filename: true, format: FileFormat.svg }, 293 | { icon: 'plantuml', extensions: ['pu', 'plantuml', 'iuml', 'puml'], format: FileFormat.svg }, 294 | { icon: 'plsql', extensions: [], languages: [languages.plsql], format: FileFormat.svg }, 295 | { icon: 'plsql_package', extensions: ['pck'], format: FileFormat.svg }, 296 | { icon: 'plsql_package_body', extensions: ['pkb'], format: FileFormat.svg }, 297 | { icon: 'plsql_package_header', extensions: ['pkh'], format: FileFormat.svg }, 298 | { icon: 'plsql_package_spec', extensions: ['pks'], format: FileFormat.svg }, 299 | { icon: 'poedit', extensions: ['po', 'mo'], format: FileFormat.svg }, 300 | { icon: 'polymer', extensions: [], languages: [languages.polymer], format: FileFormat.svg }, 301 | { icon: 'postcss', extensions: ['.postcssrc.js', 'postcss.config.js'], filename: true, languages: [languages.postcss], format: FileFormat.svg }, 302 | { icon: 'powerpoint', extensions: ['pot', 'potx', 'potm', 'pps', 'ppsx', 'ppsm', 'ppt', 'pptx', 'pptm', 'pa', 'ppa', 'ppam', 'sldm', 'sldx'], format: FileFormat.svg }, 303 | { icon: 'powershell', extensions: [], languages: [languages.powershell], format: FileFormat.svg }, 304 | { icon: 'procfile', extensions: ['procfile'], filename: true, format: FileFormat.svg }, 305 | { icon: 'progress', extensions: [], languages: [languages.openEdge], format: FileFormat.svg }, 306 | { icon: 'prolog', extensions: ['pro', 'P'], languages: [languages.prolog], format: FileFormat.svg }, 307 | { icon: 'protobuf', extensions: [], languages: [languages.protobuf], format: FileFormat.svg }, 308 | { icon: 'protractor', extensions: ['protractor.conf.js'], filename: true, format: FileFormat.svg }, 309 | { icon: 'publisher', extensions: ['pub', 'puz'], format: FileFormat.svg }, 310 | { icon: 'puppet', extensions: [], languages: [languages.puppet], format: FileFormat.svg }, 311 | { icon: 'pug', extensions: ['.jade-lintrc', '.pug-lintrc', '.jade-lint.json', '.pug-lintrc.js', '.pug-lintrc.json'], filename: true, languages: [languages.pug], format: FileFormat.svg }, 312 | { icon: 'purescript', extensions: [], light: true, languages: [languages.purescript], format: FileFormat.svg }, 313 | { icon: 'python', extensions: [], languages: [languages.python], format: FileFormat.svg }, 314 | { icon: 'qlikview', extensions: ['qvd', 'qvw'], languages: [languages.qlik], format: FileFormat.svg }, 315 | { icon: 'r', extensions: [], languages: [languages.r], format: FileFormat.svg }, 316 | { icon: 'rails', extensions: [], format: FileFormat.svg }, 317 | { icon: 'rake', extensions: ['rake'], format: FileFormat.svg }, 318 | { icon: 'rake', extensions: ['rakefile'], filename: true, format: FileFormat.svg }, 319 | { icon: 'raml', extensions: [], languages: [languages.raml], format: FileFormat.svg }, 320 | { icon: 'razor', extensions: [], languages: [languages.razor], format: FileFormat.svg }, 321 | { icon: 'reactjs', extensions: [], languages: [languages.javascriptreact], format: FileFormat.svg }, 322 | { icon: 'reacttemplate', extensions: ['rt'], format: FileFormat.svg }, 323 | { icon: 'reactts', extensions: [], languages: [languages.typescriptreact], format: FileFormat.svg }, 324 | { icon: 'reason', extensions: [], languages: [languages.reason], format: FileFormat.svg }, 325 | { icon: 'rest', extensions: [], languages: [languages.restructuredtext], format: FileFormat.svg }, 326 | { icon: 'registry', extensions: ['reg'], format: FileFormat.svg }, 327 | { icon: 'riot', extensions: [], languages: [languages.riot], format: FileFormat.svg }, 328 | { icon: 'robotframework', extensions: [], languages: [languages.robot], format: FileFormat.svg }, 329 | { icon: 'rollup', extensions: ['rollup.config.js', 'rollup.config.ts'], filename: true, format: FileFormat.svg }, 330 | { icon: 'rspec', extensions: ['.rspec'], filename: true, format: FileFormat.svg }, 331 | { icon: 'ruby', extensions: [], languages: [languages.ruby], format: FileFormat.svg }, 332 | { icon: 'rust', extensions: [], languages: [languages.rust], format: FileFormat.svg }, 333 | { icon: 'saltstack', extensions: ['sls'], format: FileFormat.svg }, 334 | { icon: 'sass', extensions: ['sass'], format: FileFormat.svg }, 335 | { icon: 'sbt', extensions: [], languages: [languages.sbt], format: FileFormat.svg }, 336 | { icon: 'scala', extensions: [], languages: [languages.scala], format: FileFormat.svg }, 337 | { icon: 'script', extensions: [], languages: [languages.vbscript], format: FileFormat.svg }, 338 | { icon: 'scss', extensions: ['scssm'], languages: [languages.scss], format: FileFormat.svg }, 339 | { icon: 'sequelize', extensions: ['.sequelizerc'], filename: true, format: FileFormat.svg }, 340 | { icon: 'shaderlab', extensions: [], languages: [languages.shaderlab], light: true, format: FileFormat.svg }, 341 | { icon: 'shell', extensions: ['fish'], languages: [languages.shellscript], format: FileFormat.svg }, 342 | { icon: 'slim', extensions: [], languages: [languages.slim], format: FileFormat.svg }, 343 | { icon: 'sln', extensions: ['sln'], format: FileFormat.svg }, 344 | { icon: 'smarty', extensions: [], languages: [languages.smarty], format: FileFormat.svg }, 345 | { icon: 'snyk', extensions: ['.snyk'], filename: true, format: FileFormat.svg }, 346 | { icon: 'solidity', extensions: [], light: true, languages: [languages.solidity], format: FileFormat.svg }, 347 | { icon: 'source', extensions: [], format: FileFormat.svg }, 348 | { icon: 'sqf', extensions: [], languages: [languages.sqf], format: FileFormat.svg }, 349 | { icon: 'sql', extensions: [], languages: [languages.sql], format: FileFormat.svg }, 350 | { icon: 'sqlite', extensions: ['sqlite', 'sqlite3', 'db3'], format: FileFormat.svg }, 351 | { icon: 'sss', extensions: ['sss'], format: FileFormat.svg }, 352 | { icon: 'style', extensions: [], format: FileFormat.svg }, 353 | { icon: 'stylelint', extensions: ['.stylelintrc', 'stylelint.config.js', '.stylelintignore'], light: true, filename: true, format: FileFormat.svg }, 354 | { icon: 'stylus', extensions: [], languages: [languages.stylus], format: FileFormat.svg }, 355 | { icon: 'storyboard', extensions: ['storyboard'], format: FileFormat.svg }, 356 | { icon: 'storybook', extensions: ['story.js', 'stories.js'], format: FileFormat.svg }, 357 | { icon: 'svg', extensions: ['svg'], format: FileFormat.svg }, 358 | { icon: 'swagger', extensions: [], languages: [languages.swagger], format: FileFormat.svg }, 359 | { icon: 'swift', extensions: ['package.pins'], filename: true, languages: [languages.swift], format: FileFormat.svg }, 360 | { icon: 'tcl', extensions: ['tcl', 'exp'], format: FileFormat.svg }, 361 | { icon: 'terraform', extensions: ['tfstate'], languages: [languages.terraform], format: FileFormat.svg }, 362 | { icon: 'test', extensions: ['tst'], format: FileFormat.svg }, 363 | { icon: 'testjs', extensions: ['test.js', 'spec.js', 'test.jsx', 'spec.jsx'], light: true, format: FileFormat.svg }, 364 | { icon: 'testts', extensions: ['test.ts', 'test.tsx', 'spec.ts', 'spec.tsx'], format: FileFormat.svg }, 365 | { icon: 'tex', extensions: ['texi'], languages: [languages.tex, languages.latex], light: true, format: FileFormat.svg }, 366 | { icon: 'text', extensions: ['csv'], languages: [languages.plaintext], format: FileFormat.svg }, 367 | { icon: 'textile', extensions: [], languages: [languages.textile], format: FileFormat.svg }, 368 | { icon: 'tfs', extensions: ['.tfignore'], filename: true, format: FileFormat.svg }, 369 | { icon: 'todo', extensions: ['todo'], light: true, format: FileFormat.svg }, 370 | { icon: 'toml', extensions: [], languages: [languages.toml], format: FileFormat.svg }, 371 | { icon: 'travis', extensions: ['.travis.yml'], filename: true, format: FileFormat.svg }, 372 | { icon: 'tsconfig', extensions: ['tsconfig.json', 'tsconfig.app.json', 'tsconfig.spec.json', 'tsconfig.e2e.json'], filename: true, format: FileFormat.svg }, 373 | { icon: 'tslint', extensions: ['tslint.json'], filename: true, format: FileFormat.svg }, 374 | { icon: 'twig', extensions: [], languages: [languages.twig], format: FileFormat.svg }, 375 | { icon: 'typescript', extensions: [], languages: [languages.typescript], format: FileFormat.svg }, 376 | { icon: 'typescript_official', extensions: [], languages: [languages.typescript], format: FileFormat.svg, disabled: true }, 377 | { icon: 'typescriptdef', extensions: ['d.ts'], format: FileFormat.svg }, 378 | { icon: 'typescriptdef_official', extensions: ['d.ts'], format: FileFormat.svg, disabled: true }, 379 | { icon: 'vagrant', extensions: ['vagrantfile'], filename: true, format: FileFormat.svg }, 380 | { icon: 'vash', extensions: ['vash'], light: true, format: FileFormat.svg }, 381 | { icon: 'vb', extensions: [], languages: [languages.vb], format: FileFormat.svg }, 382 | { icon: 'vbhtml', extensions: ['vbhtml'], format: FileFormat.svg }, 383 | { icon: 'vbproj', extensions: ['vbproj'], format: FileFormat.svg }, 384 | { icon: 'vcxproj', extensions: ['vcxproj'], format: FileFormat.svg }, 385 | { icon: 'vhdl', extensions: [], languages: [languages.vhdl], format: FileFormat.svg }, 386 | { // https://en.wikipedia.org/wiki/Video_file_format 387 | icon: 'video', 388 | extensions: ['3g2', '3gp', 'asf', 'amv', 'avi', 'divx', 'qt', 'f4a', 'f4b', 'f4p', 'f4v', 'flv', 389 | 'm2v', 'm4v', 'mkv', 'mk3d', 'mov', 'mp2', 'mp4', 'mpe', 'mpeg', 'mpeg2', 'mpg', 'mpv', 'nsv', 390 | 'ogv', 'rm', 'rmvb', 'svi', 'vob', 'webm', 'wmv'], 391 | format: FileFormat.svg, 392 | }, 393 | { icon: 'view', extensions: [], format: FileFormat.svg }, 394 | { icon: 'vim', extensions: ['.vimrc', '.gvimrc'], filename: true, languages: [languages.viml], format: FileFormat.svg }, 395 | { icon: 'volt', extensions: [], languages: [languages.volt], format: FileFormat.svg }, 396 | { 397 | icon: 'vscode', 398 | extensions: [ 399 | 'vscodeignore.json', 400 | 'launch.json', 401 | 'tasks.json', 402 | '.vscodeignore', 403 | ], 404 | filename: true, 405 | format: FileFormat.svg, 406 | }, 407 | { icon: 'vsix', extensions: ['vsix'], light: true, format: FileFormat.svg }, 408 | { icon: 'vue', extensions: [], languages: [languages.vue], format: FileFormat.svg }, 409 | { icon: 'watchmanconfig', extensions: ['.watchmanconfig'], filename: true, format: FileFormat.svg }, 410 | { 411 | icon: 'webpack', 412 | extensions: [ 413 | 'webpack.base.conf.coffee', 414 | 'webpack.base.conf.js', 415 | 'webpack.base.conf.ts', 416 | 'webpack.common.coffee', 417 | 'webpack.common.js', 418 | 'webpack.common.ts', 419 | 'webpack.config.coffee', 420 | 'webpack.config.base.coffee', 421 | 'webpack.config.common.coffee', 422 | 'webpack.config.dev.coffee', 423 | 'webpack.config.development.coffee', 424 | 'webpack.config.staging.coffee', 425 | 'webpack.config.test.coffee', 426 | 'webpack.config.prod.coffee', 427 | 'webpack.config.production.coffee', 428 | 'webpack.config.js', 429 | 'webpack.config.base.js', 430 | 'webpack.config.common.js', 431 | 'webpack.config.dev.js', 432 | 'webpack.config.development.js', 433 | 'webpack.config.staging.js', 434 | 'webpack.config.test.js', 435 | 'webpack.config.prod.js', 436 | 'webpack.config.production.js', 437 | 'webpack.config.ts', 438 | 'webpack.config.base.ts', 439 | 'webpack.config.common.ts', 440 | 'webpack.config.dev.ts', 441 | 'webpack.config.development.ts', 442 | 'webpack.config.staging.ts', 443 | 'webpack.config.test.ts', 444 | 'webpack.config.prod.ts', 445 | 'webpack.config.production.ts', 446 | 'webpack.config.babel.js', 447 | 'webpack.config.base.babel.js', 448 | 'webpack.config.common.babel.js', 449 | 'webpack.config.dev.babel.js', 450 | 'webpack.config.development.babel.js', 451 | 'webpack.config.staging.babel.js', 452 | 'webpack.config.test.babel.js', 453 | 'webpack.config.prod.babel.js', 454 | 'webpack.config.production.babel.js', 455 | 'webpack.dev.coffee', 456 | 'webpack.dev.js', 457 | 'webpack.dev.ts', 458 | 'webpack.dev.conf.coffee', 459 | 'webpack.dev.conf.js', 460 | 'webpack.dev.conf.ts', 461 | 'webpack.prod.coffee', 462 | 'webpack.prod.js', 463 | 'webpack.prod.ts', 464 | 'webpack.prod.conf.coffee', 465 | 'webpack.prod.conf.js', 466 | 'webpack.prod.conf.ts', 467 | 'webpack.mix.coffee', 468 | 'webpack.mix.js', 469 | 'webpack.mix.ts', 470 | 'webpack.test.conf.coffee', 471 | 'webpack.test.conf.js', 472 | 'webpack.test.conf.ts', 473 | ], 474 | filename: true, 475 | format: FileFormat.svg, 476 | }, 477 | { icon: 'wercker', extensions: ['wercker.yml'], filename: true, format: FileFormat.svg }, 478 | { icon: 'word', extensions: ['doc', 'docx', 'docm', 'dot', 'dotx', 'dotm', 'wll'], format: FileFormat.svg }, 479 | { icon: 'wxml', extensions: ['wxml'], format: FileFormat.svg }, 480 | { icon: 'wxss', extensions: ['wxss'], format: FileFormat.svg }, 481 | { icon: 'xcode', extensions: ['xcodeproj'], format: FileFormat.svg }, 482 | { icon: 'xib', extensions: ['xib'], format: FileFormat.svg }, 483 | { icon: 'xliff', extensions: ['xliff', 'xlf'], format: FileFormat.svg }, 484 | { icon: 'xml', extensions: ['pex', 'tmlanguage'], languages: [languages.xml], format: FileFormat.svg }, 485 | { icon: 'xsl', extensions: [], languages: [languages.xsl], format: FileFormat.svg }, 486 | { icon: 'yaml', extensions: ['yml'], light: true, languages: [languages.yaml, languages.textmateyaml], format: FileFormat.svg }, 487 | { icon: 'yang', extensions: [], languages: [languages.yang], format: FileFormat.svg }, 488 | { icon: 'yarn', extensions: ['yarn.lock', '.yarnrc', '.yarnclean', '.yarn-integrity', '.yarn-metadata.json', '.yarnignore'], filename: true, format: FileFormat.svg }, 489 | { icon: 'yeoman', extensions: ['.yo-rc.json'], filename: true, format: FileFormat.svg }, 490 | { icon: 'zip', extensions: ['zip', 'rar', '7z', 'tar', 'gz', 'bzip2', 'xz', 'bz2'], format: FileFormat.svg }, 491 | { icon: 'zip2', extensions: ['zip', 'rar', '7z', 'tar', 'gz', 'bzip2', 'xz', 'bz2'], format: FileFormat.svg, disabled: true }, 492 | ], 493 | }; 494 | -------------------------------------------------------------------------------- /font-awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @font-face { 7 | font-family: 'FontAwesome'; 8 | src: url('fonts/fontawesome-webfont.woff2') format('woff2'); 9 | font-weight: normal; 10 | font-style: normal 11 | } 12 | 13 | .fa { 14 | display: inline-block; 15 | font: normal normal normal 14px/1 FontAwesome; 16 | font-size: inherit; 17 | text-rendering: auto; 18 | -webkit-font-smoothing: antialiased; 19 | -moz-osx-font-smoothing: grayscale 20 | } 21 | 22 | .fa-lg { 23 | font-size: 1.33333333em; 24 | line-height: .75em; 25 | vertical-align: -15% 26 | } 27 | 28 | .fa-2x { 29 | font-size: 2em 30 | } 31 | 32 | .fa-3x { 33 | font-size: 3em 34 | } 35 | 36 | .fa-4x { 37 | font-size: 4em 38 | } 39 | 40 | .fa-5x { 41 | font-size: 5em 42 | } 43 | 44 | .fa-fw { 45 | width: 1.28571429em; 46 | text-align: center 47 | } 48 | 49 | .fa-ul { 50 | padding-left: 0; 51 | margin-left: 2.14285714em; 52 | list-style-type: none 53 | } 54 | 55 | .fa-ul>li { 56 | position: relative 57 | } 58 | 59 | .fa-li { 60 | position: absolute; 61 | left: -2.14285714em; 62 | width: 2.14285714em; 63 | top: .14285714em; 64 | text-align: center 65 | } 66 | 67 | .fa-li.fa-lg { 68 | left: -1.85714286em 69 | } 70 | 71 | .fa-border { 72 | padding: .2em .25em .15em; 73 | border: solid .08em #eee; 74 | border-radius: .1em 75 | } 76 | 77 | .fa-pull-left { 78 | float: left 79 | } 80 | 81 | .fa-pull-right { 82 | float: right 83 | } 84 | 85 | .fa.fa-pull-left { 86 | margin-right: .3em 87 | } 88 | 89 | .fa.fa-pull-right { 90 | margin-left: .3em 91 | } 92 | 93 | .pull-right { 94 | float: right 95 | } 96 | 97 | .pull-left { 98 | float: left 99 | } 100 | 101 | .fa.pull-left { 102 | margin-right: .3em 103 | } 104 | 105 | .fa.pull-right { 106 | margin-left: .3em 107 | } 108 | 109 | .fa-spin { 110 | -webkit-animation: fa-spin 2s infinite linear; 111 | animation: fa-spin 2s infinite linear 112 | } 113 | 114 | .fa-pulse { 115 | -webkit-animation: fa-spin 1s infinite steps(8); 116 | animation: fa-spin 1s infinite steps(8) 117 | } 118 | 119 | @-webkit-keyframes fa-spin { 120 | 0% { 121 | -webkit-transform: rotate(0deg); 122 | transform: rotate(0deg) 123 | } 124 | 100% { 125 | -webkit-transform: rotate(359deg); 126 | transform: rotate(359deg) 127 | } 128 | } 129 | 130 | @keyframes fa-spin { 131 | 0% { 132 | -webkit-transform: rotate(0deg); 133 | transform: rotate(0deg) 134 | } 135 | 100% { 136 | -webkit-transform: rotate(359deg); 137 | transform: rotate(359deg) 138 | } 139 | } 140 | 141 | .fa-rotate-90 { 142 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; 143 | -webkit-transform: rotate(90deg); 144 | -ms-transform: rotate(90deg); 145 | transform: rotate(90deg) 146 | } 147 | 148 | .fa-rotate-180 { 149 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; 150 | -webkit-transform: rotate(180deg); 151 | -ms-transform: rotate(180deg); 152 | transform: rotate(180deg) 153 | } 154 | 155 | .fa-rotate-270 { 156 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; 157 | -webkit-transform: rotate(270deg); 158 | -ms-transform: rotate(270deg); 159 | transform: rotate(270deg) 160 | } 161 | 162 | .fa-flip-horizontal { 163 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; 164 | -webkit-transform: scale(-1, 1); 165 | -ms-transform: scale(-1, 1); 166 | transform: scale(-1, 1) 167 | } 168 | 169 | .fa-flip-vertical { 170 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; 171 | -webkit-transform: scale(1, -1); 172 | -ms-transform: scale(1, -1); 173 | transform: scale(1, -1) 174 | } 175 | 176 | :root .fa-rotate-90, 177 | :root .fa-rotate-180, 178 | :root .fa-rotate-270, 179 | :root .fa-flip-horizontal, 180 | :root .fa-flip-vertical { 181 | filter: none 182 | } 183 | 184 | .fa-stack { 185 | position: relative; 186 | display: inline-block; 187 | width: 2em; 188 | height: 2em; 189 | line-height: 2em; 190 | vertical-align: middle 191 | } 192 | 193 | .fa-stack-1x, 194 | .fa-stack-2x { 195 | position: absolute; 196 | left: 0; 197 | width: 100%; 198 | text-align: center 199 | } 200 | 201 | .fa-stack-1x { 202 | line-height: inherit 203 | } 204 | 205 | .fa-stack-2x { 206 | font-size: 2em 207 | } 208 | 209 | .fa-inverse { 210 | color: #fff 211 | } 212 | 213 | .fa-glass:before { 214 | content: "\f000" 215 | } 216 | 217 | .fa-music:before { 218 | content: "\f001" 219 | } 220 | 221 | .fa-search:before { 222 | content: "\f002" 223 | } 224 | 225 | .fa-envelope-o:before { 226 | content: "\f003" 227 | } 228 | 229 | .fa-heart:before { 230 | content: "\f004" 231 | } 232 | 233 | .fa-star:before { 234 | content: "\f005" 235 | } 236 | 237 | .fa-star-o:before { 238 | content: "\f006" 239 | } 240 | 241 | .fa-user:before { 242 | content: "\f007" 243 | } 244 | 245 | .fa-film:before { 246 | content: "\f008" 247 | } 248 | 249 | .fa-th-large:before { 250 | content: "\f009" 251 | } 252 | 253 | .fa-th:before { 254 | content: "\f00a" 255 | } 256 | 257 | .fa-th-list:before { 258 | content: "\f00b" 259 | } 260 | 261 | .fa-check:before { 262 | content: "\f00c" 263 | } 264 | 265 | .fa-remove:before, 266 | .fa-close:before, 267 | .fa-times:before { 268 | content: "\f00d" 269 | } 270 | 271 | .fa-search-plus:before { 272 | content: "\f00e" 273 | } 274 | 275 | .fa-search-minus:before { 276 | content: "\f010" 277 | } 278 | 279 | .fa-power-off:before { 280 | content: "\f011" 281 | } 282 | 283 | .fa-signal:before { 284 | content: "\f012" 285 | } 286 | 287 | .fa-gear:before, 288 | .fa-cog:before { 289 | content: "\f013" 290 | } 291 | 292 | .fa-trash-o:before { 293 | content: "\f014" 294 | } 295 | 296 | .fa-home:before { 297 | content: "\f015" 298 | } 299 | 300 | .fa-file-o:before { 301 | content: "\f016" 302 | } 303 | 304 | .fa-clock-o:before { 305 | content: "\f017" 306 | } 307 | 308 | .fa-road:before { 309 | content: "\f018" 310 | } 311 | 312 | .fa-download:before { 313 | content: "\f019" 314 | } 315 | 316 | .fa-arrow-circle-o-down:before { 317 | content: "\f01a" 318 | } 319 | 320 | .fa-arrow-circle-o-up:before { 321 | content: "\f01b" 322 | } 323 | 324 | .fa-inbox:before { 325 | content: "\f01c" 326 | } 327 | 328 | .fa-play-circle-o:before { 329 | content: "\f01d" 330 | } 331 | 332 | .fa-rotate-right:before, 333 | .fa-repeat:before { 334 | content: "\f01e" 335 | } 336 | 337 | .fa-refresh:before { 338 | content: "\f021" 339 | } 340 | 341 | .fa-list-alt:before { 342 | content: "\f022" 343 | } 344 | 345 | .fa-lock:before { 346 | content: "\f023" 347 | } 348 | 349 | .fa-flag:before { 350 | content: "\f024" 351 | } 352 | 353 | .fa-headphones:before { 354 | content: "\f025" 355 | } 356 | 357 | .fa-volume-off:before { 358 | content: "\f026" 359 | } 360 | 361 | .fa-volume-down:before { 362 | content: "\f027" 363 | } 364 | 365 | .fa-volume-up:before { 366 | content: "\f028" 367 | } 368 | 369 | .fa-qrcode:before { 370 | content: "\f029" 371 | } 372 | 373 | .fa-barcode:before { 374 | content: "\f02a" 375 | } 376 | 377 | .fa-tag:before { 378 | content: "\f02b" 379 | } 380 | 381 | .fa-tags:before { 382 | content: "\f02c" 383 | } 384 | 385 | .fa-book:before { 386 | content: "\f02d" 387 | } 388 | 389 | .fa-bookmark:before { 390 | content: "\f02e" 391 | } 392 | 393 | .fa-print:before { 394 | content: "\f02f" 395 | } 396 | 397 | .fa-camera:before { 398 | content: "\f030" 399 | } 400 | 401 | .fa-font:before { 402 | content: "\f031" 403 | } 404 | 405 | .fa-bold:before { 406 | content: "\f032" 407 | } 408 | 409 | .fa-italic:before { 410 | content: "\f033" 411 | } 412 | 413 | .fa-text-height:before { 414 | content: "\f034" 415 | } 416 | 417 | .fa-text-width:before { 418 | content: "\f035" 419 | } 420 | 421 | .fa-align-left:before { 422 | content: "\f036" 423 | } 424 | 425 | .fa-align-center:before { 426 | content: "\f037" 427 | } 428 | 429 | .fa-align-right:before { 430 | content: "\f038" 431 | } 432 | 433 | .fa-align-justify:before { 434 | content: "\f039" 435 | } 436 | 437 | .fa-list:before { 438 | content: "\f03a" 439 | } 440 | 441 | .fa-dedent:before, 442 | .fa-outdent:before { 443 | content: "\f03b" 444 | } 445 | 446 | .fa-indent:before { 447 | content: "\f03c" 448 | } 449 | 450 | .fa-video-camera:before { 451 | content: "\f03d" 452 | } 453 | 454 | .fa-photo:before, 455 | .fa-image:before, 456 | .fa-picture-o:before { 457 | content: "\f03e" 458 | } 459 | 460 | .fa-pencil:before { 461 | content: "\f040" 462 | } 463 | 464 | .fa-map-marker:before { 465 | content: "\f041" 466 | } 467 | 468 | .fa-adjust:before { 469 | content: "\f042" 470 | } 471 | 472 | .fa-tint:before { 473 | content: "\f043" 474 | } 475 | 476 | .fa-edit:before, 477 | .fa-pencil-square-o:before { 478 | content: "\f044" 479 | } 480 | 481 | .fa-share-square-o:before { 482 | content: "\f045" 483 | } 484 | 485 | .fa-check-square-o:before { 486 | content: "\f046" 487 | } 488 | 489 | .fa-arrows:before { 490 | content: "\f047" 491 | } 492 | 493 | .fa-step-backward:before { 494 | content: "\f048" 495 | } 496 | 497 | .fa-fast-backward:before { 498 | content: "\f049" 499 | } 500 | 501 | .fa-backward:before { 502 | content: "\f04a" 503 | } 504 | 505 | .fa-play:before { 506 | content: "\f04b" 507 | } 508 | 509 | .fa-pause:before { 510 | content: "\f04c" 511 | } 512 | 513 | .fa-stop:before { 514 | content: "\f04d" 515 | } 516 | 517 | .fa-forward:before { 518 | content: "\f04e" 519 | } 520 | 521 | .fa-fast-forward:before { 522 | content: "\f050" 523 | } 524 | 525 | .fa-step-forward:before { 526 | content: "\f051" 527 | } 528 | 529 | .fa-eject:before { 530 | content: "\f052" 531 | } 532 | 533 | .fa-chevron-left:before { 534 | content: "\f053" 535 | } 536 | 537 | .fa-chevron-right:before { 538 | content: "\f054" 539 | } 540 | 541 | .fa-plus-circle:before { 542 | content: "\f055" 543 | } 544 | 545 | .fa-minus-circle:before { 546 | content: "\f056" 547 | } 548 | 549 | .fa-times-circle:before { 550 | content: "\f057" 551 | } 552 | 553 | .fa-check-circle:before { 554 | content: "\f058" 555 | } 556 | 557 | .fa-question-circle:before { 558 | content: "\f059" 559 | } 560 | 561 | .fa-info-circle:before { 562 | content: "\f05a" 563 | } 564 | 565 | .fa-crosshairs:before { 566 | content: "\f05b" 567 | } 568 | 569 | .fa-times-circle-o:before { 570 | content: "\f05c" 571 | } 572 | 573 | .fa-check-circle-o:before { 574 | content: "\f05d" 575 | } 576 | 577 | .fa-ban:before { 578 | content: "\f05e" 579 | } 580 | 581 | .fa-arrow-left:before { 582 | content: "\f060" 583 | } 584 | 585 | .fa-arrow-right:before { 586 | content: "\f061" 587 | } 588 | 589 | .fa-arrow-up:before { 590 | content: "\f062" 591 | } 592 | 593 | .fa-arrow-down:before { 594 | content: "\f063" 595 | } 596 | 597 | .fa-mail-forward:before, 598 | .fa-share:before { 599 | content: "\f064" 600 | } 601 | 602 | .fa-expand:before { 603 | content: "\f065" 604 | } 605 | 606 | .fa-compress:before { 607 | content: "\f066" 608 | } 609 | 610 | .fa-plus:before { 611 | content: "\f067" 612 | } 613 | 614 | .fa-minus:before { 615 | content: "\f068" 616 | } 617 | 618 | .fa-asterisk:before { 619 | content: "\f069" 620 | } 621 | 622 | .fa-exclamation-circle:before { 623 | content: "\f06a" 624 | } 625 | 626 | .fa-gift:before { 627 | content: "\f06b" 628 | } 629 | 630 | .fa-leaf:before { 631 | content: "\f06c" 632 | } 633 | 634 | .fa-fire:before { 635 | content: "\f06d" 636 | } 637 | 638 | .fa-eye:before { 639 | content: "\f06e" 640 | } 641 | 642 | .fa-eye-slash:before { 643 | content: "\f070" 644 | } 645 | 646 | .fa-warning:before, 647 | .fa-exclamation-triangle:before { 648 | content: "\f071" 649 | } 650 | 651 | .fa-plane:before { 652 | content: "\f072" 653 | } 654 | 655 | .fa-calendar:before { 656 | content: "\f073" 657 | } 658 | 659 | .fa-random:before { 660 | content: "\f074" 661 | } 662 | 663 | .fa-comment:before { 664 | content: "\f075" 665 | } 666 | 667 | .fa-magnet:before { 668 | content: "\f076" 669 | } 670 | 671 | .fa-chevron-up:before { 672 | content: "\f077" 673 | } 674 | 675 | .fa-chevron-down:before { 676 | content: "\f078" 677 | } 678 | 679 | .fa-retweet:before { 680 | content: "\f079" 681 | } 682 | 683 | .fa-shopping-cart:before { 684 | content: "\f07a" 685 | } 686 | 687 | .fa-folder:before { 688 | content: "\f07b" 689 | } 690 | 691 | .fa-folder-open:before { 692 | content: "\f07c" 693 | } 694 | 695 | .fa-arrows-v:before { 696 | content: "\f07d" 697 | } 698 | 699 | .fa-arrows-h:before { 700 | content: "\f07e" 701 | } 702 | 703 | .fa-bar-chart-o:before, 704 | .fa-bar-chart:before { 705 | content: "\f080" 706 | } 707 | 708 | .fa-twitter-square:before { 709 | content: "\f081" 710 | } 711 | 712 | .fa-facebook-square:before { 713 | content: "\f082" 714 | } 715 | 716 | .fa-camera-retro:before { 717 | content: "\f083" 718 | } 719 | 720 | .fa-key:before { 721 | content: "\f084" 722 | } 723 | 724 | .fa-gears:before, 725 | .fa-cogs:before { 726 | content: "\f085" 727 | } 728 | 729 | .fa-comments:before { 730 | content: "\f086" 731 | } 732 | 733 | .fa-thumbs-o-up:before { 734 | content: "\f087" 735 | } 736 | 737 | .fa-thumbs-o-down:before { 738 | content: "\f088" 739 | } 740 | 741 | .fa-star-half:before { 742 | content: "\f089" 743 | } 744 | 745 | .fa-heart-o:before { 746 | content: "\f08a" 747 | } 748 | 749 | .fa-sign-out:before { 750 | content: "\f08b" 751 | } 752 | 753 | .fa-linkedin-square:before { 754 | content: "\f08c" 755 | } 756 | 757 | .fa-thumb-tack:before { 758 | content: "\f08d" 759 | } 760 | 761 | .fa-external-link:before { 762 | content: "\f08e" 763 | } 764 | 765 | .fa-sign-in:before { 766 | content: "\f090" 767 | } 768 | 769 | .fa-trophy:before { 770 | content: "\f091" 771 | } 772 | 773 | .fa-github-square:before { 774 | content: "\f092" 775 | } 776 | 777 | .fa-upload:before { 778 | content: "\f093" 779 | } 780 | 781 | .fa-lemon-o:before { 782 | content: "\f094" 783 | } 784 | 785 | .fa-phone:before { 786 | content: "\f095" 787 | } 788 | 789 | .fa-square-o:before { 790 | content: "\f096" 791 | } 792 | 793 | .fa-bookmark-o:before { 794 | content: "\f097" 795 | } 796 | 797 | .fa-phone-square:before { 798 | content: "\f098" 799 | } 800 | 801 | .fa-twitter:before { 802 | content: "\f099" 803 | } 804 | 805 | .fa-facebook-f:before, 806 | .fa-facebook:before { 807 | content: "\f09a" 808 | } 809 | 810 | .fa-github:before { 811 | content: "\f09b" 812 | } 813 | 814 | .fa-unlock:before { 815 | content: "\f09c" 816 | } 817 | 818 | .fa-credit-card:before { 819 | content: "\f09d" 820 | } 821 | 822 | .fa-feed:before, 823 | .fa-rss:before { 824 | content: "\f09e" 825 | } 826 | 827 | .fa-hdd-o:before { 828 | content: "\f0a0" 829 | } 830 | 831 | .fa-bullhorn:before { 832 | content: "\f0a1" 833 | } 834 | 835 | .fa-bell:before { 836 | content: "\f0f3" 837 | } 838 | 839 | .fa-certificate:before { 840 | content: "\f0a3" 841 | } 842 | 843 | .fa-hand-o-right:before { 844 | content: "\f0a4" 845 | } 846 | 847 | .fa-hand-o-left:before { 848 | content: "\f0a5" 849 | } 850 | 851 | .fa-hand-o-up:before { 852 | content: "\f0a6" 853 | } 854 | 855 | .fa-hand-o-down:before { 856 | content: "\f0a7" 857 | } 858 | 859 | .fa-arrow-circle-left:before { 860 | content: "\f0a8" 861 | } 862 | 863 | .fa-arrow-circle-right:before { 864 | content: "\f0a9" 865 | } 866 | 867 | .fa-arrow-circle-up:before { 868 | content: "\f0aa" 869 | } 870 | 871 | .fa-arrow-circle-down:before { 872 | content: "\f0ab" 873 | } 874 | 875 | .fa-globe:before { 876 | content: "\f0ac" 877 | } 878 | 879 | .fa-wrench:before { 880 | content: "\f0ad" 881 | } 882 | 883 | .fa-tasks:before { 884 | content: "\f0ae" 885 | } 886 | 887 | .fa-filter:before { 888 | content: "\f0b0" 889 | } 890 | 891 | .fa-briefcase:before { 892 | content: "\f0b1" 893 | } 894 | 895 | .fa-arrows-alt:before { 896 | content: "\f0b2" 897 | } 898 | 899 | .fa-group:before, 900 | .fa-users:before { 901 | content: "\f0c0" 902 | } 903 | 904 | .fa-chain:before, 905 | .fa-link:before { 906 | content: "\f0c1" 907 | } 908 | 909 | .fa-cloud:before { 910 | content: "\f0c2" 911 | } 912 | 913 | .fa-flask:before { 914 | content: "\f0c3" 915 | } 916 | 917 | .fa-cut:before, 918 | .fa-scissors:before { 919 | content: "\f0c4" 920 | } 921 | 922 | .fa-copy:before, 923 | .fa-files-o:before { 924 | content: "\f0c5" 925 | } 926 | 927 | .fa-paperclip:before { 928 | content: "\f0c6" 929 | } 930 | 931 | .fa-save:before, 932 | .fa-floppy-o:before { 933 | content: "\f0c7" 934 | } 935 | 936 | .fa-square:before { 937 | content: "\f0c8" 938 | } 939 | 940 | .fa-navicon:before, 941 | .fa-reorder:before, 942 | .fa-bars:before { 943 | content: "\f0c9" 944 | } 945 | 946 | .fa-list-ul:before { 947 | content: "\f0ca" 948 | } 949 | 950 | .fa-list-ol:before { 951 | content: "\f0cb" 952 | } 953 | 954 | .fa-strikethrough:before { 955 | content: "\f0cc" 956 | } 957 | 958 | .fa-underline:before { 959 | content: "\f0cd" 960 | } 961 | 962 | .fa-table:before { 963 | content: "\f0ce" 964 | } 965 | 966 | .fa-magic:before { 967 | content: "\f0d0" 968 | } 969 | 970 | .fa-truck:before { 971 | content: "\f0d1" 972 | } 973 | 974 | .fa-pinterest:before { 975 | content: "\f0d2" 976 | } 977 | 978 | .fa-pinterest-square:before { 979 | content: "\f0d3" 980 | } 981 | 982 | .fa-google-plus-square:before { 983 | content: "\f0d4" 984 | } 985 | 986 | .fa-google-plus:before { 987 | content: "\f0d5" 988 | } 989 | 990 | .fa-money:before { 991 | content: "\f0d6" 992 | } 993 | 994 | .fa-caret-down:before { 995 | content: "\f0d7" 996 | } 997 | 998 | .fa-caret-up:before { 999 | content: "\f0d8" 1000 | } 1001 | 1002 | .fa-caret-left:before { 1003 | content: "\f0d9" 1004 | } 1005 | 1006 | .fa-caret-right:before { 1007 | content: "\f0da" 1008 | } 1009 | 1010 | .fa-columns:before { 1011 | content: "\f0db" 1012 | } 1013 | 1014 | .fa-unsorted:before, 1015 | .fa-sort:before { 1016 | content: "\f0dc" 1017 | } 1018 | 1019 | .fa-sort-down:before, 1020 | .fa-sort-desc:before { 1021 | content: "\f0dd" 1022 | } 1023 | 1024 | .fa-sort-up:before, 1025 | .fa-sort-asc:before { 1026 | content: "\f0de" 1027 | } 1028 | 1029 | .fa-envelope:before { 1030 | content: "\f0e0" 1031 | } 1032 | 1033 | .fa-linkedin:before { 1034 | content: "\f0e1" 1035 | } 1036 | 1037 | .fa-rotate-left:before, 1038 | .fa-undo:before { 1039 | content: "\f0e2" 1040 | } 1041 | 1042 | .fa-legal:before, 1043 | .fa-gavel:before { 1044 | content: "\f0e3" 1045 | } 1046 | 1047 | .fa-dashboard:before, 1048 | .fa-tachometer:before { 1049 | content: "\f0e4" 1050 | } 1051 | 1052 | .fa-comment-o:before { 1053 | content: "\f0e5" 1054 | } 1055 | 1056 | .fa-comments-o:before { 1057 | content: "\f0e6" 1058 | } 1059 | 1060 | .fa-flash:before, 1061 | .fa-bolt:before { 1062 | content: "\f0e7" 1063 | } 1064 | 1065 | .fa-sitemap:before { 1066 | content: "\f0e8" 1067 | } 1068 | 1069 | .fa-umbrella:before { 1070 | content: "\f0e9" 1071 | } 1072 | 1073 | .fa-paste:before, 1074 | .fa-clipboard:before { 1075 | content: "\f0ea" 1076 | } 1077 | 1078 | .fa-lightbulb-o:before { 1079 | content: "\f0eb" 1080 | } 1081 | 1082 | .fa-exchange:before { 1083 | content: "\f0ec" 1084 | } 1085 | 1086 | .fa-cloud-download:before { 1087 | content: "\f0ed" 1088 | } 1089 | 1090 | .fa-cloud-upload:before { 1091 | content: "\f0ee" 1092 | } 1093 | 1094 | .fa-user-md:before { 1095 | content: "\f0f0" 1096 | } 1097 | 1098 | .fa-stethoscope:before { 1099 | content: "\f0f1" 1100 | } 1101 | 1102 | .fa-suitcase:before { 1103 | content: "\f0f2" 1104 | } 1105 | 1106 | .fa-bell-o:before { 1107 | content: "\f0a2" 1108 | } 1109 | 1110 | .fa-coffee:before { 1111 | content: "\f0f4" 1112 | } 1113 | 1114 | .fa-cutlery:before { 1115 | content: "\f0f5" 1116 | } 1117 | 1118 | .fa-file-text-o:before { 1119 | content: "\f0f6" 1120 | } 1121 | 1122 | .fa-building-o:before { 1123 | content: "\f0f7" 1124 | } 1125 | 1126 | .fa-hospital-o:before { 1127 | content: "\f0f8" 1128 | } 1129 | 1130 | .fa-ambulance:before { 1131 | content: "\f0f9" 1132 | } 1133 | 1134 | .fa-medkit:before { 1135 | content: "\f0fa" 1136 | } 1137 | 1138 | .fa-fighter-jet:before { 1139 | content: "\f0fb" 1140 | } 1141 | 1142 | .fa-beer:before { 1143 | content: "\f0fc" 1144 | } 1145 | 1146 | .fa-h-square:before { 1147 | content: "\f0fd" 1148 | } 1149 | 1150 | .fa-plus-square:before { 1151 | content: "\f0fe" 1152 | } 1153 | 1154 | .fa-angle-double-left:before { 1155 | content: "\f100" 1156 | } 1157 | 1158 | .fa-angle-double-right:before { 1159 | content: "\f101" 1160 | } 1161 | 1162 | .fa-angle-double-up:before { 1163 | content: "\f102" 1164 | } 1165 | 1166 | .fa-angle-double-down:before { 1167 | content: "\f103" 1168 | } 1169 | 1170 | .fa-angle-left:before { 1171 | content: "\f104" 1172 | } 1173 | 1174 | .fa-angle-right:before { 1175 | content: "\f105" 1176 | } 1177 | 1178 | .fa-angle-up:before { 1179 | content: "\f106" 1180 | } 1181 | 1182 | .fa-angle-down:before { 1183 | content: "\f107" 1184 | } 1185 | 1186 | .fa-desktop:before { 1187 | content: "\f108" 1188 | } 1189 | 1190 | .fa-laptop:before { 1191 | content: "\f109" 1192 | } 1193 | 1194 | .fa-tablet:before { 1195 | content: "\f10a" 1196 | } 1197 | 1198 | .fa-mobile-phone:before, 1199 | .fa-mobile:before { 1200 | content: "\f10b" 1201 | } 1202 | 1203 | .fa-circle-o:before { 1204 | content: "\f10c" 1205 | } 1206 | 1207 | .fa-quote-left:before { 1208 | content: "\f10d" 1209 | } 1210 | 1211 | .fa-quote-right:before { 1212 | content: "\f10e" 1213 | } 1214 | 1215 | .fa-spinner:before { 1216 | content: "\f110" 1217 | } 1218 | 1219 | .fa-circle:before { 1220 | content: "\f111" 1221 | } 1222 | 1223 | .fa-mail-reply:before, 1224 | .fa-reply:before { 1225 | content: "\f112" 1226 | } 1227 | 1228 | .fa-github-alt:before { 1229 | content: "\f113" 1230 | } 1231 | 1232 | .fa-folder-o:before { 1233 | content: "\f114" 1234 | } 1235 | 1236 | .fa-folder-open-o:before { 1237 | content: "\f115" 1238 | } 1239 | 1240 | .fa-smile-o:before { 1241 | content: "\f118" 1242 | } 1243 | 1244 | .fa-frown-o:before { 1245 | content: "\f119" 1246 | } 1247 | 1248 | .fa-meh-o:before { 1249 | content: "\f11a" 1250 | } 1251 | 1252 | .fa-gamepad:before { 1253 | content: "\f11b" 1254 | } 1255 | 1256 | .fa-keyboard-o:before { 1257 | content: "\f11c" 1258 | } 1259 | 1260 | .fa-flag-o:before { 1261 | content: "\f11d" 1262 | } 1263 | 1264 | .fa-flag-checkered:before { 1265 | content: "\f11e" 1266 | } 1267 | 1268 | .fa-terminal:before { 1269 | content: "\f120" 1270 | } 1271 | 1272 | .fa-code:before { 1273 | content: "\f121" 1274 | } 1275 | 1276 | .fa-mail-reply-all:before, 1277 | .fa-reply-all:before { 1278 | content: "\f122" 1279 | } 1280 | 1281 | .fa-star-half-empty:before, 1282 | .fa-star-half-full:before, 1283 | .fa-star-half-o:before { 1284 | content: "\f123" 1285 | } 1286 | 1287 | .fa-location-arrow:before { 1288 | content: "\f124" 1289 | } 1290 | 1291 | .fa-crop:before { 1292 | content: "\f125" 1293 | } 1294 | 1295 | .fa-code-fork:before { 1296 | content: "\f126" 1297 | } 1298 | 1299 | .fa-unlink:before, 1300 | .fa-chain-broken:before { 1301 | content: "\f127" 1302 | } 1303 | 1304 | .fa-question:before { 1305 | content: "\f128" 1306 | } 1307 | 1308 | .fa-info:before { 1309 | content: "\f129" 1310 | } 1311 | 1312 | .fa-exclamation:before { 1313 | content: "\f12a" 1314 | } 1315 | 1316 | .fa-superscript:before { 1317 | content: "\f12b" 1318 | } 1319 | 1320 | .fa-subscript:before { 1321 | content: "\f12c" 1322 | } 1323 | 1324 | .fa-eraser:before { 1325 | content: "\f12d" 1326 | } 1327 | 1328 | .fa-puzzle-piece:before { 1329 | content: "\f12e" 1330 | } 1331 | 1332 | .fa-microphone:before { 1333 | content: "\f130" 1334 | } 1335 | 1336 | .fa-microphone-slash:before { 1337 | content: "\f131" 1338 | } 1339 | 1340 | .fa-shield:before { 1341 | content: "\f132" 1342 | } 1343 | 1344 | .fa-calendar-o:before { 1345 | content: "\f133" 1346 | } 1347 | 1348 | .fa-fire-extinguisher:before { 1349 | content: "\f134" 1350 | } 1351 | 1352 | .fa-rocket:before { 1353 | content: "\f135" 1354 | } 1355 | 1356 | .fa-maxcdn:before { 1357 | content: "\f136" 1358 | } 1359 | 1360 | .fa-chevron-circle-left:before { 1361 | content: "\f137" 1362 | } 1363 | 1364 | .fa-chevron-circle-right:before { 1365 | content: "\f138" 1366 | } 1367 | 1368 | .fa-chevron-circle-up:before { 1369 | content: "\f139" 1370 | } 1371 | 1372 | .fa-chevron-circle-down:before { 1373 | content: "\f13a" 1374 | } 1375 | 1376 | .fa-html5:before { 1377 | content: "\f13b" 1378 | } 1379 | 1380 | .fa-css3:before { 1381 | content: "\f13c" 1382 | } 1383 | 1384 | .fa-anchor:before { 1385 | content: "\f13d" 1386 | } 1387 | 1388 | .fa-unlock-alt:before { 1389 | content: "\f13e" 1390 | } 1391 | 1392 | .fa-bullseye:before { 1393 | content: "\f140" 1394 | } 1395 | 1396 | .fa-ellipsis-h:before { 1397 | content: "\f141" 1398 | } 1399 | 1400 | .fa-ellipsis-v:before { 1401 | content: "\f142" 1402 | } 1403 | 1404 | .fa-rss-square:before { 1405 | content: "\f143" 1406 | } 1407 | 1408 | .fa-play-circle:before { 1409 | content: "\f144" 1410 | } 1411 | 1412 | .fa-ticket:before { 1413 | content: "\f145" 1414 | } 1415 | 1416 | .fa-minus-square:before { 1417 | content: "\f146" 1418 | } 1419 | 1420 | .fa-minus-square-o:before { 1421 | content: "\f147" 1422 | } 1423 | 1424 | .fa-level-up:before { 1425 | content: "\f148" 1426 | } 1427 | 1428 | .fa-level-down:before { 1429 | content: "\f149" 1430 | } 1431 | 1432 | .fa-check-square:before { 1433 | content: "\f14a" 1434 | } 1435 | 1436 | .fa-pencil-square:before { 1437 | content: "\f14b" 1438 | } 1439 | 1440 | .fa-external-link-square:before { 1441 | content: "\f14c" 1442 | } 1443 | 1444 | .fa-share-square:before { 1445 | content: "\f14d" 1446 | } 1447 | 1448 | .fa-compass:before { 1449 | content: "\f14e" 1450 | } 1451 | 1452 | .fa-toggle-down:before, 1453 | .fa-caret-square-o-down:before { 1454 | content: "\f150" 1455 | } 1456 | 1457 | .fa-toggle-up:before, 1458 | .fa-caret-square-o-up:before { 1459 | content: "\f151" 1460 | } 1461 | 1462 | .fa-toggle-right:before, 1463 | .fa-caret-square-o-right:before { 1464 | content: "\f152" 1465 | } 1466 | 1467 | .fa-euro:before, 1468 | .fa-eur:before { 1469 | content: "\f153" 1470 | } 1471 | 1472 | .fa-gbp:before { 1473 | content: "\f154" 1474 | } 1475 | 1476 | .fa-dollar:before, 1477 | .fa-usd:before { 1478 | content: "\f155" 1479 | } 1480 | 1481 | .fa-rupee:before, 1482 | .fa-inr:before { 1483 | content: "\f156" 1484 | } 1485 | 1486 | .fa-cny:before, 1487 | .fa-rmb:before, 1488 | .fa-yen:before, 1489 | .fa-jpy:before { 1490 | content: "\f157" 1491 | } 1492 | 1493 | .fa-ruble:before, 1494 | .fa-rouble:before, 1495 | .fa-rub:before { 1496 | content: "\f158" 1497 | } 1498 | 1499 | .fa-won:before, 1500 | .fa-krw:before { 1501 | content: "\f159" 1502 | } 1503 | 1504 | .fa-bitcoin:before, 1505 | .fa-btc:before { 1506 | content: "\f15a" 1507 | } 1508 | 1509 | .fa-file:before { 1510 | content: "\f15b" 1511 | } 1512 | 1513 | .fa-file-text:before { 1514 | content: "\f15c" 1515 | } 1516 | 1517 | .fa-sort-alpha-asc:before { 1518 | content: "\f15d" 1519 | } 1520 | 1521 | .fa-sort-alpha-desc:before { 1522 | content: "\f15e" 1523 | } 1524 | 1525 | .fa-sort-amount-asc:before { 1526 | content: "\f160" 1527 | } 1528 | 1529 | .fa-sort-amount-desc:before { 1530 | content: "\f161" 1531 | } 1532 | 1533 | .fa-sort-numeric-asc:before { 1534 | content: "\f162" 1535 | } 1536 | 1537 | .fa-sort-numeric-desc:before { 1538 | content: "\f163" 1539 | } 1540 | 1541 | .fa-thumbs-up:before { 1542 | content: "\f164" 1543 | } 1544 | 1545 | .fa-thumbs-down:before { 1546 | content: "\f165" 1547 | } 1548 | 1549 | .fa-youtube-square:before { 1550 | content: "\f166" 1551 | } 1552 | 1553 | .fa-youtube:before { 1554 | content: "\f167" 1555 | } 1556 | 1557 | .fa-xing:before { 1558 | content: "\f168" 1559 | } 1560 | 1561 | .fa-xing-square:before { 1562 | content: "\f169" 1563 | } 1564 | 1565 | .fa-youtube-play:before { 1566 | content: "\f16a" 1567 | } 1568 | 1569 | .fa-dropbox:before { 1570 | content: "\f16b" 1571 | } 1572 | 1573 | .fa-stack-overflow:before { 1574 | content: "\f16c" 1575 | } 1576 | 1577 | .fa-instagram:before { 1578 | content: "\f16d" 1579 | } 1580 | 1581 | .fa-flickr:before { 1582 | content: "\f16e" 1583 | } 1584 | 1585 | .fa-adn:before { 1586 | content: "\f170" 1587 | } 1588 | 1589 | .fa-bitbucket:before { 1590 | content: "\f171" 1591 | } 1592 | 1593 | .fa-bitbucket-square:before { 1594 | content: "\f172" 1595 | } 1596 | 1597 | .fa-tumblr:before { 1598 | content: "\f173" 1599 | } 1600 | 1601 | .fa-tumblr-square:before { 1602 | content: "\f174" 1603 | } 1604 | 1605 | .fa-long-arrow-down:before { 1606 | content: "\f175" 1607 | } 1608 | 1609 | .fa-long-arrow-up:before { 1610 | content: "\f176" 1611 | } 1612 | 1613 | .fa-long-arrow-left:before { 1614 | content: "\f177" 1615 | } 1616 | 1617 | .fa-long-arrow-right:before { 1618 | content: "\f178" 1619 | } 1620 | 1621 | .fa-apple:before { 1622 | content: "\f179" 1623 | } 1624 | 1625 | .fa-windows:before { 1626 | content: "\f17a" 1627 | } 1628 | 1629 | .fa-android:before { 1630 | content: "\f17b" 1631 | } 1632 | 1633 | .fa-linux:before { 1634 | content: "\f17c" 1635 | } 1636 | 1637 | .fa-dribbble:before { 1638 | content: "\f17d" 1639 | } 1640 | 1641 | .fa-skype:before { 1642 | content: "\f17e" 1643 | } 1644 | 1645 | .fa-foursquare:before { 1646 | content: "\f180" 1647 | } 1648 | 1649 | .fa-trello:before { 1650 | content: "\f181" 1651 | } 1652 | 1653 | .fa-female:before { 1654 | content: "\f182" 1655 | } 1656 | 1657 | .fa-male:before { 1658 | content: "\f183" 1659 | } 1660 | 1661 | .fa-gittip:before, 1662 | .fa-gratipay:before { 1663 | content: "\f184" 1664 | } 1665 | 1666 | .fa-sun-o:before { 1667 | content: "\f185" 1668 | } 1669 | 1670 | .fa-moon-o:before { 1671 | content: "\f186" 1672 | } 1673 | 1674 | .fa-archive:before { 1675 | content: "\f187" 1676 | } 1677 | 1678 | .fa-bug:before { 1679 | content: "\f188" 1680 | } 1681 | 1682 | .fa-vk:before { 1683 | content: "\f189" 1684 | } 1685 | 1686 | .fa-weibo:before { 1687 | content: "\f18a" 1688 | } 1689 | 1690 | .fa-renren:before { 1691 | content: "\f18b" 1692 | } 1693 | 1694 | .fa-pagelines:before { 1695 | content: "\f18c" 1696 | } 1697 | 1698 | .fa-stack-exchange:before { 1699 | content: "\f18d" 1700 | } 1701 | 1702 | .fa-arrow-circle-o-right:before { 1703 | content: "\f18e" 1704 | } 1705 | 1706 | .fa-arrow-circle-o-left:before { 1707 | content: "\f190" 1708 | } 1709 | 1710 | .fa-toggle-left:before, 1711 | .fa-caret-square-o-left:before { 1712 | content: "\f191" 1713 | } 1714 | 1715 | .fa-dot-circle-o:before { 1716 | content: "\f192" 1717 | } 1718 | 1719 | .fa-wheelchair:before { 1720 | content: "\f193" 1721 | } 1722 | 1723 | .fa-vimeo-square:before { 1724 | content: "\f194" 1725 | } 1726 | 1727 | .fa-turkish-lira:before, 1728 | .fa-try:before { 1729 | content: "\f195" 1730 | } 1731 | 1732 | .fa-plus-square-o:before { 1733 | content: "\f196" 1734 | } 1735 | 1736 | .fa-space-shuttle:before { 1737 | content: "\f197" 1738 | } 1739 | 1740 | .fa-slack:before { 1741 | content: "\f198" 1742 | } 1743 | 1744 | .fa-envelope-square:before { 1745 | content: "\f199" 1746 | } 1747 | 1748 | .fa-wordpress:before { 1749 | content: "\f19a" 1750 | } 1751 | 1752 | .fa-openid:before { 1753 | content: "\f19b" 1754 | } 1755 | 1756 | .fa-institution:before, 1757 | .fa-bank:before, 1758 | .fa-university:before { 1759 | content: "\f19c" 1760 | } 1761 | 1762 | .fa-mortar-board:before, 1763 | .fa-graduation-cap:before { 1764 | content: "\f19d" 1765 | } 1766 | 1767 | .fa-yahoo:before { 1768 | content: "\f19e" 1769 | } 1770 | 1771 | .fa-google:before { 1772 | content: "\f1a0" 1773 | } 1774 | 1775 | .fa-reddit:before { 1776 | content: "\f1a1" 1777 | } 1778 | 1779 | .fa-reddit-square:before { 1780 | content: "\f1a2" 1781 | } 1782 | 1783 | .fa-stumbleupon-circle:before { 1784 | content: "\f1a3" 1785 | } 1786 | 1787 | .fa-stumbleupon:before { 1788 | content: "\f1a4" 1789 | } 1790 | 1791 | .fa-delicious:before { 1792 | content: "\f1a5" 1793 | } 1794 | 1795 | .fa-digg:before { 1796 | content: "\f1a6" 1797 | } 1798 | 1799 | .fa-pied-piper-pp:before { 1800 | content: "\f1a7" 1801 | } 1802 | 1803 | .fa-pied-piper-alt:before { 1804 | content: "\f1a8" 1805 | } 1806 | 1807 | .fa-drupal:before { 1808 | content: "\f1a9" 1809 | } 1810 | 1811 | .fa-joomla:before { 1812 | content: "\f1aa" 1813 | } 1814 | 1815 | .fa-language:before { 1816 | content: "\f1ab" 1817 | } 1818 | 1819 | .fa-fax:before { 1820 | content: "\f1ac" 1821 | } 1822 | 1823 | .fa-building:before { 1824 | content: "\f1ad" 1825 | } 1826 | 1827 | .fa-child:before { 1828 | content: "\f1ae" 1829 | } 1830 | 1831 | .fa-paw:before { 1832 | content: "\f1b0" 1833 | } 1834 | 1835 | .fa-spoon:before { 1836 | content: "\f1b1" 1837 | } 1838 | 1839 | .fa-cube:before { 1840 | content: "\f1b2" 1841 | } 1842 | 1843 | .fa-cubes:before { 1844 | content: "\f1b3" 1845 | } 1846 | 1847 | .fa-behance:before { 1848 | content: "\f1b4" 1849 | } 1850 | 1851 | .fa-behance-square:before { 1852 | content: "\f1b5" 1853 | } 1854 | 1855 | .fa-steam:before { 1856 | content: "\f1b6" 1857 | } 1858 | 1859 | .fa-steam-square:before { 1860 | content: "\f1b7" 1861 | } 1862 | 1863 | .fa-recycle:before { 1864 | content: "\f1b8" 1865 | } 1866 | 1867 | .fa-automobile:before, 1868 | .fa-car:before { 1869 | content: "\f1b9" 1870 | } 1871 | 1872 | .fa-cab:before, 1873 | .fa-taxi:before { 1874 | content: "\f1ba" 1875 | } 1876 | 1877 | .fa-tree:before { 1878 | content: "\f1bb" 1879 | } 1880 | 1881 | .fa-spotify:before { 1882 | content: "\f1bc" 1883 | } 1884 | 1885 | .fa-deviantart:before { 1886 | content: "\f1bd" 1887 | } 1888 | 1889 | .fa-soundcloud:before { 1890 | content: "\f1be" 1891 | } 1892 | 1893 | .fa-database:before { 1894 | content: "\f1c0" 1895 | } 1896 | 1897 | .fa-file-pdf-o:before { 1898 | content: "\f1c1" 1899 | } 1900 | 1901 | .fa-file-word-o:before { 1902 | content: "\f1c2" 1903 | } 1904 | 1905 | .fa-file-excel-o:before { 1906 | content: "\f1c3" 1907 | } 1908 | 1909 | .fa-file-powerpoint-o:before { 1910 | content: "\f1c4" 1911 | } 1912 | 1913 | .fa-file-photo-o:before, 1914 | .fa-file-picture-o:before, 1915 | .fa-file-image-o:before { 1916 | content: "\f1c5" 1917 | } 1918 | 1919 | .fa-file-zip-o:before, 1920 | .fa-file-archive-o:before { 1921 | content: "\f1c6" 1922 | } 1923 | 1924 | .fa-file-sound-o:before, 1925 | .fa-file-audio-o:before { 1926 | content: "\f1c7" 1927 | } 1928 | 1929 | .fa-file-movie-o:before, 1930 | .fa-file-video-o:before { 1931 | content: "\f1c8" 1932 | } 1933 | 1934 | .fa-file-code-o:before { 1935 | content: "\f1c9" 1936 | } 1937 | 1938 | .fa-vine:before { 1939 | content: "\f1ca" 1940 | } 1941 | 1942 | .fa-codepen:before { 1943 | content: "\f1cb" 1944 | } 1945 | 1946 | .fa-jsfiddle:before { 1947 | content: "\f1cc" 1948 | } 1949 | 1950 | .fa-life-bouy:before, 1951 | .fa-life-buoy:before, 1952 | .fa-life-saver:before, 1953 | .fa-support:before, 1954 | .fa-life-ring:before { 1955 | content: "\f1cd" 1956 | } 1957 | 1958 | .fa-circle-o-notch:before { 1959 | content: "\f1ce" 1960 | } 1961 | 1962 | .fa-ra:before, 1963 | .fa-resistance:before, 1964 | .fa-rebel:before { 1965 | content: "\f1d0" 1966 | } 1967 | 1968 | .fa-ge:before, 1969 | .fa-empire:before { 1970 | content: "\f1d1" 1971 | } 1972 | 1973 | .fa-git-square:before { 1974 | content: "\f1d2" 1975 | } 1976 | 1977 | .fa-git:before { 1978 | content: "\f1d3" 1979 | } 1980 | 1981 | .fa-y-combinator-square:before, 1982 | .fa-yc-square:before, 1983 | .fa-hacker-news:before { 1984 | content: "\f1d4" 1985 | } 1986 | 1987 | .fa-tencent-weibo:before { 1988 | content: "\f1d5" 1989 | } 1990 | 1991 | .fa-qq:before { 1992 | content: "\f1d6" 1993 | } 1994 | 1995 | .fa-wechat:before, 1996 | .fa-weixin:before { 1997 | content: "\f1d7" 1998 | } 1999 | 2000 | .fa-send:before, 2001 | .fa-paper-plane:before { 2002 | content: "\f1d8" 2003 | } 2004 | 2005 | .fa-send-o:before, 2006 | .fa-paper-plane-o:before { 2007 | content: "\f1d9" 2008 | } 2009 | 2010 | .fa-history:before { 2011 | content: "\f1da" 2012 | } 2013 | 2014 | .fa-circle-thin:before { 2015 | content: "\f1db" 2016 | } 2017 | 2018 | .fa-header:before { 2019 | content: "\f1dc" 2020 | } 2021 | 2022 | .fa-paragraph:before { 2023 | content: "\f1dd" 2024 | } 2025 | 2026 | .fa-sliders:before { 2027 | content: "\f1de" 2028 | } 2029 | 2030 | .fa-share-alt:before { 2031 | content: "\f1e0" 2032 | } 2033 | 2034 | .fa-share-alt-square:before { 2035 | content: "\f1e1" 2036 | } 2037 | 2038 | .fa-bomb:before { 2039 | content: "\f1e2" 2040 | } 2041 | 2042 | .fa-soccer-ball-o:before, 2043 | .fa-futbol-o:before { 2044 | content: "\f1e3" 2045 | } 2046 | 2047 | .fa-tty:before { 2048 | content: "\f1e4" 2049 | } 2050 | 2051 | .fa-binoculars:before { 2052 | content: "\f1e5" 2053 | } 2054 | 2055 | .fa-plug:before { 2056 | content: "\f1e6" 2057 | } 2058 | 2059 | .fa-slideshare:before { 2060 | content: "\f1e7" 2061 | } 2062 | 2063 | .fa-twitch:before { 2064 | content: "\f1e8" 2065 | } 2066 | 2067 | .fa-yelp:before { 2068 | content: "\f1e9" 2069 | } 2070 | 2071 | .fa-newspaper-o:before { 2072 | content: "\f1ea" 2073 | } 2074 | 2075 | .fa-wifi:before { 2076 | content: "\f1eb" 2077 | } 2078 | 2079 | .fa-calculator:before { 2080 | content: "\f1ec" 2081 | } 2082 | 2083 | .fa-paypal:before { 2084 | content: "\f1ed" 2085 | } 2086 | 2087 | .fa-google-wallet:before { 2088 | content: "\f1ee" 2089 | } 2090 | 2091 | .fa-cc-visa:before { 2092 | content: "\f1f0" 2093 | } 2094 | 2095 | .fa-cc-mastercard:before { 2096 | content: "\f1f1" 2097 | } 2098 | 2099 | .fa-cc-discover:before { 2100 | content: "\f1f2" 2101 | } 2102 | 2103 | .fa-cc-amex:before { 2104 | content: "\f1f3" 2105 | } 2106 | 2107 | .fa-cc-paypal:before { 2108 | content: "\f1f4" 2109 | } 2110 | 2111 | .fa-cc-stripe:before { 2112 | content: "\f1f5" 2113 | } 2114 | 2115 | .fa-bell-slash:before { 2116 | content: "\f1f6" 2117 | } 2118 | 2119 | .fa-bell-slash-o:before { 2120 | content: "\f1f7" 2121 | } 2122 | 2123 | .fa-trash:before { 2124 | content: "\f1f8" 2125 | } 2126 | 2127 | .fa-copyright:before { 2128 | content: "\f1f9" 2129 | } 2130 | 2131 | .fa-at:before { 2132 | content: "\f1fa" 2133 | } 2134 | 2135 | .fa-eyedropper:before { 2136 | content: "\f1fb" 2137 | } 2138 | 2139 | .fa-paint-brush:before { 2140 | content: "\f1fc" 2141 | } 2142 | 2143 | .fa-birthday-cake:before { 2144 | content: "\f1fd" 2145 | } 2146 | 2147 | .fa-area-chart:before { 2148 | content: "\f1fe" 2149 | } 2150 | 2151 | .fa-pie-chart:before { 2152 | content: "\f200" 2153 | } 2154 | 2155 | .fa-line-chart:before { 2156 | content: "\f201" 2157 | } 2158 | 2159 | .fa-lastfm:before { 2160 | content: "\f202" 2161 | } 2162 | 2163 | .fa-lastfm-square:before { 2164 | content: "\f203" 2165 | } 2166 | 2167 | .fa-toggle-off:before { 2168 | content: "\f204" 2169 | } 2170 | 2171 | .fa-toggle-on:before { 2172 | content: "\f205" 2173 | } 2174 | 2175 | .fa-bicycle:before { 2176 | content: "\f206" 2177 | } 2178 | 2179 | .fa-bus:before { 2180 | content: "\f207" 2181 | } 2182 | 2183 | .fa-ioxhost:before { 2184 | content: "\f208" 2185 | } 2186 | 2187 | .fa-angellist:before { 2188 | content: "\f209" 2189 | } 2190 | 2191 | .fa-cc:before { 2192 | content: "\f20a" 2193 | } 2194 | 2195 | .fa-shekel:before, 2196 | .fa-sheqel:before, 2197 | .fa-ils:before { 2198 | content: "\f20b" 2199 | } 2200 | 2201 | .fa-meanpath:before { 2202 | content: "\f20c" 2203 | } 2204 | 2205 | .fa-buysellads:before { 2206 | content: "\f20d" 2207 | } 2208 | 2209 | .fa-connectdevelop:before { 2210 | content: "\f20e" 2211 | } 2212 | 2213 | .fa-dashcube:before { 2214 | content: "\f210" 2215 | } 2216 | 2217 | .fa-forumbee:before { 2218 | content: "\f211" 2219 | } 2220 | 2221 | .fa-leanpub:before { 2222 | content: "\f212" 2223 | } 2224 | 2225 | .fa-sellsy:before { 2226 | content: "\f213" 2227 | } 2228 | 2229 | .fa-shirtsinbulk:before { 2230 | content: "\f214" 2231 | } 2232 | 2233 | .fa-simplybuilt:before { 2234 | content: "\f215" 2235 | } 2236 | 2237 | .fa-skyatlas:before { 2238 | content: "\f216" 2239 | } 2240 | 2241 | .fa-cart-plus:before { 2242 | content: "\f217" 2243 | } 2244 | 2245 | .fa-cart-arrow-down:before { 2246 | content: "\f218" 2247 | } 2248 | 2249 | .fa-diamond:before { 2250 | content: "\f219" 2251 | } 2252 | 2253 | .fa-ship:before { 2254 | content: "\f21a" 2255 | } 2256 | 2257 | .fa-user-secret:before { 2258 | content: "\f21b" 2259 | } 2260 | 2261 | .fa-motorcycle:before { 2262 | content: "\f21c" 2263 | } 2264 | 2265 | .fa-street-view:before { 2266 | content: "\f21d" 2267 | } 2268 | 2269 | .fa-heartbeat:before { 2270 | content: "\f21e" 2271 | } 2272 | 2273 | .fa-venus:before { 2274 | content: "\f221" 2275 | } 2276 | 2277 | .fa-mars:before { 2278 | content: "\f222" 2279 | } 2280 | 2281 | .fa-mercury:before { 2282 | content: "\f223" 2283 | } 2284 | 2285 | .fa-intersex:before, 2286 | .fa-transgender:before { 2287 | content: "\f224" 2288 | } 2289 | 2290 | .fa-transgender-alt:before { 2291 | content: "\f225" 2292 | } 2293 | 2294 | .fa-venus-double:before { 2295 | content: "\f226" 2296 | } 2297 | 2298 | .fa-mars-double:before { 2299 | content: "\f227" 2300 | } 2301 | 2302 | .fa-venus-mars:before { 2303 | content: "\f228" 2304 | } 2305 | 2306 | .fa-mars-stroke:before { 2307 | content: "\f229" 2308 | } 2309 | 2310 | .fa-mars-stroke-v:before { 2311 | content: "\f22a" 2312 | } 2313 | 2314 | .fa-mars-stroke-h:before { 2315 | content: "\f22b" 2316 | } 2317 | 2318 | .fa-neuter:before { 2319 | content: "\f22c" 2320 | } 2321 | 2322 | .fa-genderless:before { 2323 | content: "\f22d" 2324 | } 2325 | 2326 | .fa-facebook-official:before { 2327 | content: "\f230" 2328 | } 2329 | 2330 | .fa-pinterest-p:before { 2331 | content: "\f231" 2332 | } 2333 | 2334 | .fa-whatsapp:before { 2335 | content: "\f232" 2336 | } 2337 | 2338 | .fa-server:before { 2339 | content: "\f233" 2340 | } 2341 | 2342 | .fa-user-plus:before { 2343 | content: "\f234" 2344 | } 2345 | 2346 | .fa-user-times:before { 2347 | content: "\f235" 2348 | } 2349 | 2350 | .fa-hotel:before, 2351 | .fa-bed:before { 2352 | content: "\f236" 2353 | } 2354 | 2355 | .fa-viacoin:before { 2356 | content: "\f237" 2357 | } 2358 | 2359 | .fa-train:before { 2360 | content: "\f238" 2361 | } 2362 | 2363 | .fa-subway:before { 2364 | content: "\f239" 2365 | } 2366 | 2367 | .fa-medium:before { 2368 | content: "\f23a" 2369 | } 2370 | 2371 | .fa-yc:before, 2372 | .fa-y-combinator:before { 2373 | content: "\f23b" 2374 | } 2375 | 2376 | .fa-optin-monster:before { 2377 | content: "\f23c" 2378 | } 2379 | 2380 | .fa-opencart:before { 2381 | content: "\f23d" 2382 | } 2383 | 2384 | .fa-expeditedssl:before { 2385 | content: "\f23e" 2386 | } 2387 | 2388 | .fa-battery-4:before, 2389 | .fa-battery:before, 2390 | .fa-battery-full:before { 2391 | content: "\f240" 2392 | } 2393 | 2394 | .fa-battery-3:before, 2395 | .fa-battery-three-quarters:before { 2396 | content: "\f241" 2397 | } 2398 | 2399 | .fa-battery-2:before, 2400 | .fa-battery-half:before { 2401 | content: "\f242" 2402 | } 2403 | 2404 | .fa-battery-1:before, 2405 | .fa-battery-quarter:before { 2406 | content: "\f243" 2407 | } 2408 | 2409 | .fa-battery-0:before, 2410 | .fa-battery-empty:before { 2411 | content: "\f244" 2412 | } 2413 | 2414 | .fa-mouse-pointer:before { 2415 | content: "\f245" 2416 | } 2417 | 2418 | .fa-i-cursor:before { 2419 | content: "\f246" 2420 | } 2421 | 2422 | .fa-object-group:before { 2423 | content: "\f247" 2424 | } 2425 | 2426 | .fa-object-ungroup:before { 2427 | content: "\f248" 2428 | } 2429 | 2430 | .fa-sticky-note:before { 2431 | content: "\f249" 2432 | } 2433 | 2434 | .fa-sticky-note-o:before { 2435 | content: "\f24a" 2436 | } 2437 | 2438 | .fa-cc-jcb:before { 2439 | content: "\f24b" 2440 | } 2441 | 2442 | .fa-cc-diners-club:before { 2443 | content: "\f24c" 2444 | } 2445 | 2446 | .fa-clone:before { 2447 | content: "\f24d" 2448 | } 2449 | 2450 | .fa-balance-scale:before { 2451 | content: "\f24e" 2452 | } 2453 | 2454 | .fa-hourglass-o:before { 2455 | content: "\f250" 2456 | } 2457 | 2458 | .fa-hourglass-1:before, 2459 | .fa-hourglass-start:before { 2460 | content: "\f251" 2461 | } 2462 | 2463 | .fa-hourglass-2:before, 2464 | .fa-hourglass-half:before { 2465 | content: "\f252" 2466 | } 2467 | 2468 | .fa-hourglass-3:before, 2469 | .fa-hourglass-end:before { 2470 | content: "\f253" 2471 | } 2472 | 2473 | .fa-hourglass:before { 2474 | content: "\f254" 2475 | } 2476 | 2477 | .fa-hand-grab-o:before, 2478 | .fa-hand-rock-o:before { 2479 | content: "\f255" 2480 | } 2481 | 2482 | .fa-hand-stop-o:before, 2483 | .fa-hand-paper-o:before { 2484 | content: "\f256" 2485 | } 2486 | 2487 | .fa-hand-scissors-o:before { 2488 | content: "\f257" 2489 | } 2490 | 2491 | .fa-hand-lizard-o:before { 2492 | content: "\f258" 2493 | } 2494 | 2495 | .fa-hand-spock-o:before { 2496 | content: "\f259" 2497 | } 2498 | 2499 | .fa-hand-pointer-o:before { 2500 | content: "\f25a" 2501 | } 2502 | 2503 | .fa-hand-peace-o:before { 2504 | content: "\f25b" 2505 | } 2506 | 2507 | .fa-trademark:before { 2508 | content: "\f25c" 2509 | } 2510 | 2511 | .fa-registered:before { 2512 | content: "\f25d" 2513 | } 2514 | 2515 | .fa-creative-commons:before { 2516 | content: "\f25e" 2517 | } 2518 | 2519 | .fa-gg:before { 2520 | content: "\f260" 2521 | } 2522 | 2523 | .fa-gg-circle:before { 2524 | content: "\f261" 2525 | } 2526 | 2527 | .fa-tripadvisor:before { 2528 | content: "\f262" 2529 | } 2530 | 2531 | .fa-odnoklassniki:before { 2532 | content: "\f263" 2533 | } 2534 | 2535 | .fa-odnoklassniki-square:before { 2536 | content: "\f264" 2537 | } 2538 | 2539 | .fa-get-pocket:before { 2540 | content: "\f265" 2541 | } 2542 | 2543 | .fa-wikipedia-w:before { 2544 | content: "\f266" 2545 | } 2546 | 2547 | .fa-safari:before { 2548 | content: "\f267" 2549 | } 2550 | 2551 | .fa-chrome:before { 2552 | content: "\f268" 2553 | } 2554 | 2555 | .fa-firefox:before { 2556 | content: "\f269" 2557 | } 2558 | 2559 | .fa-opera:before { 2560 | content: "\f26a" 2561 | } 2562 | 2563 | .fa-internet-explorer:before { 2564 | content: "\f26b" 2565 | } 2566 | 2567 | .fa-tv:before, 2568 | .fa-television:before { 2569 | content: "\f26c" 2570 | } 2571 | 2572 | .fa-contao:before { 2573 | content: "\f26d" 2574 | } 2575 | 2576 | .fa-500px:before { 2577 | content: "\f26e" 2578 | } 2579 | 2580 | .fa-amazon:before { 2581 | content: "\f270" 2582 | } 2583 | 2584 | .fa-calendar-plus-o:before { 2585 | content: "\f271" 2586 | } 2587 | 2588 | .fa-calendar-minus-o:before { 2589 | content: "\f272" 2590 | } 2591 | 2592 | .fa-calendar-times-o:before { 2593 | content: "\f273" 2594 | } 2595 | 2596 | .fa-calendar-check-o:before { 2597 | content: "\f274" 2598 | } 2599 | 2600 | .fa-industry:before { 2601 | content: "\f275" 2602 | } 2603 | 2604 | .fa-map-pin:before { 2605 | content: "\f276" 2606 | } 2607 | 2608 | .fa-map-signs:before { 2609 | content: "\f277" 2610 | } 2611 | 2612 | .fa-map-o:before { 2613 | content: "\f278" 2614 | } 2615 | 2616 | .fa-map:before { 2617 | content: "\f279" 2618 | } 2619 | 2620 | .fa-commenting:before { 2621 | content: "\f27a" 2622 | } 2623 | 2624 | .fa-commenting-o:before { 2625 | content: "\f27b" 2626 | } 2627 | 2628 | .fa-houzz:before { 2629 | content: "\f27c" 2630 | } 2631 | 2632 | .fa-vimeo:before { 2633 | content: "\f27d" 2634 | } 2635 | 2636 | .fa-black-tie:before { 2637 | content: "\f27e" 2638 | } 2639 | 2640 | .fa-fonticons:before { 2641 | content: "\f280" 2642 | } 2643 | 2644 | .fa-reddit-alien:before { 2645 | content: "\f281" 2646 | } 2647 | 2648 | .fa-edge:before { 2649 | content: "\f282" 2650 | } 2651 | 2652 | .fa-credit-card-alt:before { 2653 | content: "\f283" 2654 | } 2655 | 2656 | .fa-codiepie:before { 2657 | content: "\f284" 2658 | } 2659 | 2660 | .fa-modx:before { 2661 | content: "\f285" 2662 | } 2663 | 2664 | .fa-fort-awesome:before { 2665 | content: "\f286" 2666 | } 2667 | 2668 | .fa-usb:before { 2669 | content: "\f287" 2670 | } 2671 | 2672 | .fa-product-hunt:before { 2673 | content: "\f288" 2674 | } 2675 | 2676 | .fa-mixcloud:before { 2677 | content: "\f289" 2678 | } 2679 | 2680 | .fa-scribd:before { 2681 | content: "\f28a" 2682 | } 2683 | 2684 | .fa-pause-circle:before { 2685 | content: "\f28b" 2686 | } 2687 | 2688 | .fa-pause-circle-o:before { 2689 | content: "\f28c" 2690 | } 2691 | 2692 | .fa-stop-circle:before { 2693 | content: "\f28d" 2694 | } 2695 | 2696 | .fa-stop-circle-o:before { 2697 | content: "\f28e" 2698 | } 2699 | 2700 | .fa-shopping-bag:before { 2701 | content: "\f290" 2702 | } 2703 | 2704 | .fa-shopping-basket:before { 2705 | content: "\f291" 2706 | } 2707 | 2708 | .fa-hashtag:before { 2709 | content: "\f292" 2710 | } 2711 | 2712 | .fa-bluetooth:before { 2713 | content: "\f293" 2714 | } 2715 | 2716 | .fa-bluetooth-b:before { 2717 | content: "\f294" 2718 | } 2719 | 2720 | .fa-percent:before { 2721 | content: "\f295" 2722 | } 2723 | 2724 | .fa-gitlab:before { 2725 | content: "\f296" 2726 | } 2727 | 2728 | .fa-wpbeginner:before { 2729 | content: "\f297" 2730 | } 2731 | 2732 | .fa-wpforms:before { 2733 | content: "\f298" 2734 | } 2735 | 2736 | .fa-envira:before { 2737 | content: "\f299" 2738 | } 2739 | 2740 | .fa-universal-access:before { 2741 | content: "\f29a" 2742 | } 2743 | 2744 | .fa-wheelchair-alt:before { 2745 | content: "\f29b" 2746 | } 2747 | 2748 | .fa-question-circle-o:before { 2749 | content: "\f29c" 2750 | } 2751 | 2752 | .fa-blind:before { 2753 | content: "\f29d" 2754 | } 2755 | 2756 | .fa-audio-description:before { 2757 | content: "\f29e" 2758 | } 2759 | 2760 | .fa-volume-control-phone:before { 2761 | content: "\f2a0" 2762 | } 2763 | 2764 | .fa-braille:before { 2765 | content: "\f2a1" 2766 | } 2767 | 2768 | .fa-assistive-listening-systems:before { 2769 | content: "\f2a2" 2770 | } 2771 | 2772 | .fa-asl-interpreting:before, 2773 | .fa-american-sign-language-interpreting:before { 2774 | content: "\f2a3" 2775 | } 2776 | 2777 | .fa-deafness:before, 2778 | .fa-hard-of-hearing:before, 2779 | .fa-deaf:before { 2780 | content: "\f2a4" 2781 | } 2782 | 2783 | .fa-glide:before { 2784 | content: "\f2a5" 2785 | } 2786 | 2787 | .fa-glide-g:before { 2788 | content: "\f2a6" 2789 | } 2790 | 2791 | .fa-signing:before, 2792 | .fa-sign-language:before { 2793 | content: "\f2a7" 2794 | } 2795 | 2796 | .fa-low-vision:before { 2797 | content: "\f2a8" 2798 | } 2799 | 2800 | .fa-viadeo:before { 2801 | content: "\f2a9" 2802 | } 2803 | 2804 | .fa-viadeo-square:before { 2805 | content: "\f2aa" 2806 | } 2807 | 2808 | .fa-snapchat:before { 2809 | content: "\f2ab" 2810 | } 2811 | 2812 | .fa-snapchat-ghost:before { 2813 | content: "\f2ac" 2814 | } 2815 | 2816 | .fa-snapchat-square:before { 2817 | content: "\f2ad" 2818 | } 2819 | 2820 | .fa-pied-piper:before { 2821 | content: "\f2ae" 2822 | } 2823 | 2824 | .fa-first-order:before { 2825 | content: "\f2b0" 2826 | } 2827 | 2828 | .fa-yoast:before { 2829 | content: "\f2b1" 2830 | } 2831 | 2832 | .fa-themeisle:before { 2833 | content: "\f2b2" 2834 | } 2835 | 2836 | .fa-google-plus-circle:before, 2837 | .fa-google-plus-official:before { 2838 | content: "\f2b3" 2839 | } 2840 | 2841 | .fa-fa:before, 2842 | .fa-font-awesome:before { 2843 | content: "\f2b4" 2844 | } 2845 | 2846 | .fa-handshake-o:before { 2847 | content: "\f2b5" 2848 | } 2849 | 2850 | .fa-envelope-open:before { 2851 | content: "\f2b6" 2852 | } 2853 | 2854 | .fa-envelope-open-o:before { 2855 | content: "\f2b7" 2856 | } 2857 | 2858 | .fa-linode:before { 2859 | content: "\f2b8" 2860 | } 2861 | 2862 | .fa-address-book:before { 2863 | content: "\f2b9" 2864 | } 2865 | 2866 | .fa-address-book-o:before { 2867 | content: "\f2ba" 2868 | } 2869 | 2870 | .fa-vcard:before, 2871 | .fa-address-card:before { 2872 | content: "\f2bb" 2873 | } 2874 | 2875 | .fa-vcard-o:before, 2876 | .fa-address-card-o:before { 2877 | content: "\f2bc" 2878 | } 2879 | 2880 | .fa-user-circle:before { 2881 | content: "\f2bd" 2882 | } 2883 | 2884 | .fa-user-circle-o:before { 2885 | content: "\f2be" 2886 | } 2887 | 2888 | .fa-user-o:before { 2889 | content: "\f2c0" 2890 | } 2891 | 2892 | .fa-id-badge:before { 2893 | content: "\f2c1" 2894 | } 2895 | 2896 | .fa-drivers-license:before, 2897 | .fa-id-card:before { 2898 | content: "\f2c2" 2899 | } 2900 | 2901 | .fa-drivers-license-o:before, 2902 | .fa-id-card-o:before { 2903 | content: "\f2c3" 2904 | } 2905 | 2906 | .fa-quora:before { 2907 | content: "\f2c4" 2908 | } 2909 | 2910 | .fa-free-code-camp:before { 2911 | content: "\f2c5" 2912 | } 2913 | 2914 | .fa-telegram:before { 2915 | content: "\f2c6" 2916 | } 2917 | 2918 | .fa-thermometer-4:before, 2919 | .fa-thermometer:before, 2920 | .fa-thermometer-full:before { 2921 | content: "\f2c7" 2922 | } 2923 | 2924 | .fa-thermometer-3:before, 2925 | .fa-thermometer-three-quarters:before { 2926 | content: "\f2c8" 2927 | } 2928 | 2929 | .fa-thermometer-2:before, 2930 | .fa-thermometer-half:before { 2931 | content: "\f2c9" 2932 | } 2933 | 2934 | .fa-thermometer-1:before, 2935 | .fa-thermometer-quarter:before { 2936 | content: "\f2ca" 2937 | } 2938 | 2939 | .fa-thermometer-0:before, 2940 | .fa-thermometer-empty:before { 2941 | content: "\f2cb" 2942 | } 2943 | 2944 | .fa-shower:before { 2945 | content: "\f2cc" 2946 | } 2947 | 2948 | .fa-bathtub:before, 2949 | .fa-s15:before, 2950 | .fa-bath:before { 2951 | content: "\f2cd" 2952 | } 2953 | 2954 | .fa-podcast:before { 2955 | content: "\f2ce" 2956 | } 2957 | 2958 | .fa-window-maximize:before { 2959 | content: "\f2d0" 2960 | } 2961 | 2962 | .fa-window-minimize:before { 2963 | content: "\f2d1" 2964 | } 2965 | 2966 | .fa-window-restore:before { 2967 | content: "\f2d2" 2968 | } 2969 | 2970 | .fa-times-rectangle:before, 2971 | .fa-window-close:before { 2972 | content: "\f2d3" 2973 | } 2974 | 2975 | .fa-times-rectangle-o:before, 2976 | .fa-window-close-o:before { 2977 | content: "\f2d4" 2978 | } 2979 | 2980 | .fa-bandcamp:before { 2981 | content: "\f2d5" 2982 | } 2983 | 2984 | .fa-grav:before { 2985 | content: "\f2d6" 2986 | } 2987 | 2988 | .fa-etsy:before { 2989 | content: "\f2d7" 2990 | } 2991 | 2992 | .fa-imdb:before { 2993 | content: "\f2d8" 2994 | } 2995 | 2996 | .fa-ravelry:before { 2997 | content: "\f2d9" 2998 | } 2999 | 3000 | .fa-eercast:before { 3001 | content: "\f2da" 3002 | } 3003 | 3004 | .fa-microchip:before { 3005 | content: "\f2db" 3006 | } 3007 | 3008 | .fa-snowflake-o:before { 3009 | content: "\f2dc" 3010 | } 3011 | 3012 | .fa-superpowers:before { 3013 | content: "\f2dd" 3014 | } 3015 | 3016 | .fa-wpexplorer:before { 3017 | content: "\f2de" 3018 | } 3019 | 3020 | .fa-meetup:before { 3021 | content: "\f2e0" 3022 | } 3023 | 3024 | .sr-only { 3025 | position: absolute; 3026 | width: 1px; 3027 | height: 1px; 3028 | padding: 0; 3029 | margin: -1px; 3030 | overflow: hidden; 3031 | clip: rect(0, 0, 0, 0); 3032 | border: 0 3033 | } 3034 | 3035 | .sr-only-focusable:active, 3036 | .sr-only-focusable:focus { 3037 | position: static; 3038 | width: auto; 3039 | height: auto; 3040 | margin: 0; 3041 | overflow: visible; 3042 | clip: auto 3043 | } --------------------------------------------------------------------------------