├── test ├── fixtures │ ├── meNoScopes.json │ ├── meOnlyDisplayNameScope.json │ ├── meWithOnlyBitmojiAvatarUrl.json │ └── me.json ├── untypedFiles.ts ├── bootstrap │ └── node.ts ├── package.spec.ts ├── strategy.spec.ts ├── profile.spec.ts └── strategy.profile.spec.ts ├── docs └── assets │ ├── images │ ├── icons.png │ ├── widgets.png │ ├── icons@2x.png │ └── widgets@2x.png │ ├── js │ └── search.js │ └── css │ ├── main.css.map │ └── main.css ├── .gitignore ├── .prettierrc ├── src ├── index.ts ├── errors │ ├── SnapchatAPIError.ts │ └── SnapchatProfileParseError.ts ├── config.ts ├── profile.ts └── strategy.ts ├── .npmignore ├── tsconfig.docs.json ├── tsconfig.json ├── tsconfig.base.json ├── LICENSE ├── package.json ├── tslint.json └── README.md /test/fixtures/meNoScopes.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "me": { 4 | } 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /test/untypedFiles.ts: -------------------------------------------------------------------------------- 1 | declare module 'chai-passport-strategy'; 2 | 3 | declare module '*.json'; 4 | -------------------------------------------------------------------------------- /docs/assets/images/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Snapchat/passport-snapchat/HEAD/docs/assets/images/icons.png -------------------------------------------------------------------------------- /docs/assets/images/widgets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Snapchat/passport-snapchat/HEAD/docs/assets/images/widgets.png -------------------------------------------------------------------------------- /docs/assets/images/icons@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Snapchat/passport-snapchat/HEAD/docs/assets/images/icons@2x.png -------------------------------------------------------------------------------- /docs/assets/images/widgets@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Snapchat/passport-snapchat/HEAD/docs/assets/images/widgets@2x.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | reports/ 2 | lib/ 3 | 4 | # Mac OS X 5 | .DS_Store 6 | 7 | # Node.js 8 | node_modules 9 | npm-debug.log 10 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 80, 3 | "parser": "typescript", 4 | "singleQuote": true, 5 | "trailingComma": "all" 6 | } 7 | -------------------------------------------------------------------------------- /test/bootstrap/node.ts: -------------------------------------------------------------------------------- 1 | import chai from 'chai'; 2 | import passport from 'chai-passport-strategy'; 3 | 4 | chai.use(passport); 5 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import Strategy from './strategy'; 2 | 3 | export default Strategy; 4 | export { default as Strategy } from './strategy'; 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | docs/ 2 | example/ 3 | reports/ 4 | test/ 5 | lib/test/ 6 | docs 7 | 8 | tsconfig.json 9 | tslint.json 10 | .prettierrc 11 | -------------------------------------------------------------------------------- /tsconfig.docs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "exclude": [ 4 | "docs", 5 | "lib", 6 | "node_modules", 7 | "test" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /test/fixtures/meOnlyDisplayNameScope.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "me": { 4 | "displayName": "Ghostface Chillah", 5 | "externalId": "my-external-id" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "compilerOptions": { 4 | "declaration": true, 5 | }, 6 | "exclude": [ 7 | "docs", 8 | "lib", 9 | "node_modules", 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/errors/SnapchatAPIError.ts: -------------------------------------------------------------------------------- 1 | export default class SnapchatAPIError extends Error { 2 | constructor(public message: string, public code: string | number) { 3 | super(); 4 | SnapchatAPIError.captureStackTrace(this); 5 | this.name = 'SnapchatAPIError'; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/errors/SnapchatProfileParseError.ts: -------------------------------------------------------------------------------- 1 | export default class SnapchatProfileParseError extends Error { 2 | constructor(public message: string, public parseError: string) { 3 | super(); 4 | SnapchatProfileParseError.captureStackTrace(this); 5 | this.name = 'SnapchatProfileParseError'; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | SNAP_ACCOUNTS_AUTH_URL: 'https://accounts.snapchat.com/accounts/oauth2/auth', 3 | SNAP_ACCOUNTS_TOKEN_URL: 4 | 'https://accounts.snapchat.com/accounts/oauth2/token', 5 | SNAP_KIT_API_URL: 'https://kit.snapchat.com/v1', 6 | OAUTH_SCOPE_URL_PREFIX: 'https://auth.snapchat.com/oauth2/api/', 7 | }; 8 | -------------------------------------------------------------------------------- /test/fixtures/meWithOnlyBitmojiAvatarUrl.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "me": { 4 | "bitmoji": { 5 | "avatar": "https://render.bitstrips.com/v2/cpanel/sticker-circle-bitmoji-id.png?transparent=1&palette=1" 6 | }, 7 | "displayName": "Ghostface Chillah", 8 | "externalId": "my-external-id" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /test/fixtures/me.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "me": { 4 | "bitmoji": { 5 | "avatar": "https://render.bitstrips.com/v2/cpanel/sticker-circle-bitmoji-id.png?transparent=1&palette=1", 6 | "id": "my-bitmoji-id" 7 | }, 8 | "displayName": "Ghostface Chillah", 9 | "externalId": "my-external-id" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /test/package.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import SnapchatStrategy, { Strategy } from '../src/index'; 3 | 4 | describe('passport-snapchat', function() { 5 | 6 | it('should export Strategy constructor', function() { 7 | expect(SnapchatStrategy.Strategy).to.be.a('function'); 8 | }); 9 | 10 | it('should export Strategy constructor as module', function() { 11 | expect(SnapchatStrategy).to.be.a('function'); 12 | expect(SnapchatStrategy).to.equal(Strategy); 13 | }); 14 | 15 | }); 16 | -------------------------------------------------------------------------------- /tsconfig.base.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "compilerOptions": { 4 | "allowSyntheticDefaultImports": true, 5 | "declaration": true, 6 | "downlevelIteration": true, 7 | "esModuleInterop": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "lib": ["es6"], 10 | "listFiles": true, 11 | "module": "commonjs", 12 | "moduleResolution": "node", 13 | "noImplicitAny": true, 14 | "noImplicitReturns": true, 15 | "noImplicitThis": true, 16 | "noUnusedLocals": true, 17 | "noUnusedParameters": true, 18 | "outDir": "lib" , 19 | "preserveConstEnums": true, 20 | "removeComments": true, 21 | "rootDir": ".", 22 | "skipLibCheck": true, 23 | "sourceMap": true, 24 | "strictNullChecks": true, 25 | "suppressImplicitAnyIndexErrors": true, 26 | "target": "es5" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/profile.ts: -------------------------------------------------------------------------------- 1 | import { Profile } from 'passport'; 2 | 3 | export interface BitmojiData { 4 | /** 5 | * The user's unique bitmoji avatar id. 6 | */ 7 | avatarId?: string; 8 | /** 9 | * The URL for rendering the user's bitmoji avatar. 10 | */ 11 | avatarUrl?: string; 12 | } 13 | 14 | export interface SnapchatProfile extends Profile { 15 | bitmoji: BitmojiData; 16 | provider: 'snapchat'; 17 | } 18 | 19 | /** 20 | * Parses and normalizes a json string or JS object into 21 | * a `SnapchatProfile`. 22 | */ 23 | export function parse(jsonOrString: string | object): SnapchatProfile { 24 | let jsonProfile: any = jsonOrString; 25 | if (typeof jsonOrString === 'string') { 26 | jsonProfile = JSON.parse(jsonOrString); 27 | } 28 | 29 | const { bitmoji = {}, displayName, externalId } = jsonProfile; 30 | 31 | return { 32 | provider: 'snapchat', 33 | 34 | displayName, 35 | id: externalId, 36 | 37 | bitmoji: { 38 | avatarId: bitmoji.id, 39 | avatarUrl: bitmoji.avatar, 40 | }, 41 | }; 42 | } 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Snap Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "passport-snapchat", 3 | "version": "1.0.0", 4 | "description": "Snapchat (OAuth 2.0) authorization strategy for Passport.", 5 | "keywords": [ 6 | "passport", 7 | "snapchat", 8 | "auth", 9 | "authn", 10 | "authorization", 11 | "identity" 12 | ], 13 | "repository": { 14 | "type": "git", 15 | "url": "git://github.com/Snapchat/passport-snapchat.git" 16 | }, 17 | "bugs": { 18 | "url": "http://github.com/Snapchat/passport-snapchat/issues" 19 | }, 20 | "license": "MIT", 21 | "licenses": [ 22 | { 23 | "type": "MIT", 24 | "url": "http://opensource.org/licenses/MIT" 25 | } 26 | ], 27 | "main": "./lib/src/index.js", 28 | "types": "./lib/src/index.d.ts", 29 | "dependencies": { 30 | "passport-oauth2": "1.x.x" 31 | }, 32 | "devDependencies": { 33 | "@types/chai": "^4.1.7", 34 | "@types/expect": "^1.20.3", 35 | "@types/mocha": "^5.2.5", 36 | "@types/node": "^10.12.3", 37 | "@types/passport-oauth2": "^1.4.7", 38 | "@types/passport-strategy": "^0.2.35", 39 | "chai": "2.x.x", 40 | "chai-passport-strategy": "1.x.x", 41 | "husky": "^1.1.3", 42 | "lint-staged": "^8.0.4", 43 | "make-node": "0.3.x", 44 | "mocha": "5.2.0", 45 | "prettier": "^1.15.1", 46 | "tslint": "^5.11.0", 47 | "tslint-config-prettier": "^1.15.0", 48 | "typedoc": "^0.13.0", 49 | "typedoc-plugin-sourcefile-url": "^1.0.3", 50 | "typescript": "^3.1.6" 51 | }, 52 | "engines": { 53 | "node": ">= 0.4.0" 54 | }, 55 | "lint-staged": { 56 | "{src, test}/**/*.{ts,tsx}": [ 57 | "prettier --write", 58 | "git add" 59 | ] 60 | }, 61 | "config": { 62 | "prettier_cmd": "prettier --list-different" 63 | }, 64 | "scripts": { 65 | "build": "tsc --build", 66 | "build-docs": "./build-docs.sh", 67 | "lint-ts": "tslint -c ./tslint.json --project ./tsconfig.json", 68 | "lint-ts-fix": "tslint -c ./tslint.json --project ./tsconfig.json --fix", 69 | "pretty": "$npm_package_config_prettier_cmd --write '{src, test}/**/*.{ts,tsx}' || exit 0", 70 | "test": "rm -rf lib && tsc && mocha --require lib/test/bootstrap/node lib/test/*.spec.js lib/test/**/*.spec.js" 71 | }, 72 | "husky": { 73 | "hooks": { 74 | "pre-commit": "lint-staged" 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /test/strategy.spec.ts: -------------------------------------------------------------------------------- 1 | /* global describe, it, expect, before */ 2 | /* jshint expr: true */ 3 | 4 | import chai, { expect } from 'chai'; 5 | import SnapchatStrategy from '../src/strategy'; 6 | import config from '../src/config'; 7 | 8 | 9 | describe('Strategy', function() { 10 | 11 | describe('constructed', function() { 12 | var strategy = new SnapchatStrategy({ 13 | callbackURL: '', 14 | clientID: 'ABC123', 15 | clientSecret: 'secret', 16 | scope: ['user.display_name', 'user.bitmoji.avatar'], 17 | }, 18 | function() {}); 19 | 20 | it('should be named snapchat', function() { 21 | expect(strategy.name).to.equal('snapchat'); 22 | }); 23 | 24 | it('should have fully qualified scopes', function() { 25 | expect(strategy._scope[0]).to.equal(config.OAUTH_SCOPE_URL_PREFIX + 'user.display_name'); 26 | expect(strategy._scope[1]).to.equal(config.OAUTH_SCOPE_URL_PREFIX + 'user.bitmoji.avatar'); 27 | }); 28 | }) 29 | 30 | describe('constructed with undefined options', function() { 31 | it('should throw', function() { 32 | expect(function() { 33 | new SnapchatStrategy(undefined as any, function(){}); 34 | }).to.throw(Error); 35 | }); 36 | }); 37 | 38 | describe('authorization request with documented parameters', function() { 39 | var strategy = new SnapchatStrategy({ 40 | callbackURL: '', 41 | clientID: 'ABC123', 42 | clientSecret: 'secret', 43 | scope: ['user.display_name', 'user.bitmoji.avatar'], 44 | }, function() {}); 45 | 46 | 47 | let url: string; 48 | 49 | before(function(done) { 50 | (chai as any).passport.use(strategy) 51 | .redirect(function(u: string) { 52 | url = u; 53 | done(); 54 | }) 55 | .req(function(req: any) { 56 | req.session = {}; 57 | }) 58 | .authenticate({ }); 59 | }); 60 | 61 | it('should be redirected', function() { 62 | expect(url).to.equal( 63 | `${config.SNAP_ACCOUNTS_AUTH_URL}?response_type=code` + 64 | '&scope=' + encodeURIComponent(config.OAUTH_SCOPE_URL_PREFIX + 'user.display_name ') + 65 | encodeURIComponent(config.OAUTH_SCOPE_URL_PREFIX + 'user.bitmoji.avatar') + 66 | `&client_id=ABC123` 67 | ); 68 | }); 69 | }); // authorization request with documented parameters 70 | }); 71 | -------------------------------------------------------------------------------- /test/profile.spec.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import { parse, SnapchatProfile } from '../src/profile'; 3 | import { expect } from 'chai'; 4 | 5 | describe('parse', function() { 6 | 7 | describe('profile with user.display_name scope only', function() { 8 | let profile: SnapchatProfile; 9 | 10 | before(function(done) { 11 | fs.readFile('test/fixtures/meOnlyDisplayNameScope.json', 'utf8', function(err, data) { 12 | if (err) { return done(err); } 13 | const { data: { me } } = JSON.parse(data); 14 | profile = parse(me); 15 | done(); 16 | }); 17 | }); 18 | 19 | it('should parse profile', function() { 20 | expect(profile.provider).to.equal('snapchat'); 21 | expect(profile.id).to.equal('my-external-id'); 22 | expect(profile.displayName).to.equal('Ghostface Chillah'); 23 | expect(profile.bitmoji.avatarId).to.be.undefined; 24 | expect(profile.bitmoji.avatarUrl).to.be.undefined; 25 | 26 | expect(profile.name).to.be.undefined; 27 | expect(profile.username).to.be.undefined; 28 | expect(profile.emails).to.be.undefined; 29 | expect(profile.photos).to.be.undefined; 30 | }); 31 | }); 32 | 33 | describe('profile with user.display_name and user.bitmoji.avatar scope', function() { 34 | let profile: SnapchatProfile; 35 | 36 | before(function(done) { 37 | fs.readFile('test/fixtures/me.json', 'utf8', function(err, data) { 38 | if (err) { return done(err); } 39 | const { data: { me } } = JSON.parse(data); 40 | profile = parse(me); 41 | done(); 42 | }); 43 | }); 44 | 45 | it('should parse profile', function() { 46 | expect(profile.provider).to.equal('snapchat'); 47 | expect(profile.id).to.equal('my-external-id'); 48 | expect(profile.displayName).to.equal('Ghostface Chillah'); 49 | expect(profile.bitmoji.avatarId).to.equal('my-bitmoji-id'); 50 | expect(profile.bitmoji.avatarUrl).to.equal('https://render.bitstrips.com/v2/cpanel/sticker-circle-bitmoji-id.png?transparent=1&palette=1'); 51 | 52 | expect(profile.name).to.be.undefined; 53 | expect(profile.username).to.be.undefined; 54 | expect(profile.emails).to.be.undefined; 55 | expect(profile.photos).to.be.undefined; 56 | }); 57 | }); 58 | 59 | describe('profile with no scope', function() { 60 | let profile: SnapchatProfile; 61 | 62 | before(function(done) { 63 | fs.readFile('test/fixtures/meNoScopes.json', 'utf8', function(err, data) { 64 | if (err) { return done(err); } 65 | const { data: { me } } = JSON.parse(data); 66 | profile = parse(me); 67 | done(); 68 | }); 69 | }); 70 | 71 | it('should parse profile', function() { 72 | expect(profile.provider).to.equal('snapchat'); 73 | expect(profile.id).to.be.undefined; 74 | expect(profile.displayName).to.be.undefined; 75 | expect(profile.bitmoji.avatarId).to.be.undefined; 76 | expect(profile.bitmoji.avatarUrl).to.be.undefined; 77 | 78 | expect(profile.name).to.be.undefined; 79 | expect(profile.username).to.be.undefined; 80 | expect(profile.emails).to.be.undefined; 81 | expect(profile.photos).to.be.undefined; 82 | }); 83 | }); 84 | }); 85 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["tslint:latest", "tslint-react", "tslint-config-prettier"], 3 | "rules": { 4 | "align": false, 5 | "ban": false, 6 | "class-name": true, 7 | "comment-format": [ 8 | true, 9 | "check-space" 10 | ], 11 | "curly": true, 12 | "eofline": true, 13 | "forin": true, 14 | "indent": [ true, "spaces", 2 ], 15 | "interface-name": [true, "never-prefix"], 16 | "jsdoc-format": true, 17 | "jsx-no-lambda": true, 18 | "jsx-no-multiline-js": false, 19 | "label-position": true, 20 | "max-classes-per-file": false, 21 | "max-line-length": [ true, 120 ], 22 | "new-parens": true, 23 | "member-access": true, 24 | "member-ordering": false, 25 | "no-any": false, 26 | "no-arg": true, 27 | "no-bitwise": true, 28 | "no-consecutive-blank-lines": true, 29 | "no-console": false, 30 | "no-construct": true, 31 | "no-debugger": true, 32 | "no-duplicate-variable": true, 33 | "no-empty": true, 34 | "no-eval": true, 35 | "no-implicit-dependencies": [ 36 | true, 37 | "dev" 38 | ], 39 | "no-internal-module": true, 40 | "no-object-literal-type-assertion": false, 41 | "no-shadowed-variable": true, 42 | "no-string-literal": true, 43 | "no-switch-case-fall-through": true, 44 | "no-submodule-imports": false, 45 | "no-trailing-whitespace": true, 46 | "no-unsafe-finally": true, 47 | "no-unused-expression": true, 48 | "no-use-before-declare": true, 49 | "no-var-keyword": true, 50 | "object-literal-shorthand": true, 51 | "object-literal-sort-keys": true, 52 | "one-line": [ 53 | true, 54 | "check-catch", 55 | "check-finally", 56 | "check-else", 57 | "check-open-brace", 58 | "check-whitespace" 59 | ], 60 | "one-variable-per-declaration": [true], 61 | "ordered-imports": [true], 62 | "quotemark": [true, "single", "jsx-double"], 63 | "radix": true, 64 | "semicolon": [ 65 | true, 66 | "always", 67 | "ignore-bound-class-methods" 68 | ], 69 | "switch-default": true, 70 | 71 | "trailing-comma": [ 72 | true, 73 | { 74 | "esSpecCompliant": true, 75 | "multiline": "always", 76 | "singleline": "never" 77 | } 78 | ], 79 | 80 | "triple-equals": [ true, "allow-null-check" ], 81 | "typedef": [ 82 | true, 83 | "call-signature", 84 | "parameter", 85 | "property-declaration", 86 | "member-variable-declaration" 87 | ], 88 | "typedef-whitespace": [ 89 | true, 90 | { 91 | "call-signature": "nospace", 92 | "index-signature": "nospace", 93 | "parameter": "nospace", 94 | "property-declaration": "nospace", 95 | "variable-declaration": "nospace" 96 | } 97 | ], 98 | "variable-name": [ 99 | true, 100 | "allow-leading-underscore", 101 | "ban-keywords", 102 | "check-format" 103 | ], 104 | "whitespace": [ 105 | true, 106 | "check-branch", 107 | "check-decl", 108 | "check-operator", 109 | "check-separator", 110 | "check-type" 111 | ] 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # passport-snapchat 2 | 3 | [Passport](http://passportjs.org/) strategy for authenticating with [Snapchat](http://www.snapchat.com/) 4 | using the OAuth 2.0 API. 5 | 6 | This module lets you authenticate using Snapchat in your Node.js applications. 7 | By plugging into Passport, Snapchat authorization can easily and unobtrusively be integrated 8 | into any application or framework that supports 9 | [Connect](http://www.senchalabs.org/connect/)-style middleware, including 10 | [Express](http://expressjs.com/). 11 | 12 | ## Install 13 | 14 | $ npm install passport-snapchat 15 | 16 | ## [API Reference](https://snapchat.github.io/passport-snapchat/) 17 | 18 | ## Usage 19 | 20 | #### Create an Application 21 | 22 | Before using `passport-snapchat`, you must register an application with 23 | Snapchat. If you have not already done so, a new application can be created within the 24 | [Snap Kit Developer Portal](https://kit.snapchat.com/portal). Your application will 25 | be issued an app ID and app secret, which need to be provided to the strategy. 26 | You will also need to configure a redirect URI which matches the route in your 27 | application. 28 | 29 | #### Configure Strategy 30 | 31 | The Snapchat authorization strategy authenticates users using a Snapchat 32 | account and OAuth 2.0 tokens. The app ID and secret obtained when creating an 33 | application are supplied as options when creating the strategy. The strategy 34 | also requires a `verify` callback, which receives the access token and optional 35 | refresh token, as well as `profile` which contains the authenticated user's 36 | Snapchat profile. The `verify` callback must call `cb` providing a user to 37 | complete authorization. 38 | 39 | ```js 40 | passport.use(new SnapchatStrategy({ 41 | clientID: snapchat_APP_ID, 42 | clientSecret: snapchat_APP_SECRET, 43 | callbackURL: "http://localhost:3000/auth/snapchat/callback" 44 | }, 45 | function(accessToken, refreshToken, profile, cb) { 46 | User.findOrCreate({ snapchatId: profile.id }, function (err, user) { 47 | return cb(err, user); 48 | }); 49 | } 50 | )); 51 | ``` 52 | 53 | #### Authenticate Requests 54 | 55 | Use `passport.authenticate()`, specifying the `'snapchat'` strategy, to 56 | authenticate requests. 57 | 58 | For example, as route middleware in an [Express](http://expressjs.com/) 59 | application: 60 | 61 | ```js 62 | app.get('/auth/snapchat', 63 | passport.authenticate('snapchat')); 64 | 65 | app.get('/auth/snapchat/callback', 66 | passport.authenticate('snapchat', { failureRedirect: '/login' }), 67 | function(req, res) { 68 | // Successful authorization, redirect home. 69 | res.redirect('/'); 70 | }); 71 | ``` 72 | 73 | ## Examples 74 | 75 | Developers using the popular [Express](http://expressjs.com/) web framework can 76 | refer to an [example](https://github.com/Snapchat/express-4.x-passport-snapchat-example) 77 | as a starting point for their own web applications. 78 | 79 | ## FAQ 80 | 81 | ##### How do I ask a user for additional permissions? 82 | 83 | If you need additional permissions from the user, the permissions can be 84 | requested via the `scope` option to `passport.authenticate()`. 85 | 86 | ```js 87 | app.get('/auth/snapchat', 88 | passport.authenticate('snapchat', { scope: ['user.display_name', 'user.bitmoji.avatar'] })); 89 | ``` 90 | 91 | Refer to [permissions with Snapchat Login](https://docs.snapchat.com/docs/login-kit/) 92 | for further details. 93 | 94 | ##### How do I obtain a user profile with specific fields? 95 | 96 | The Snapchat profile contains information about a user. By default, 97 | NO fields in a profile are returned. The fields needed by an application 98 | can be indicated by setting the `profileFields` option. 99 | 100 | ```js 101 | new SnapchatStrategy({ 102 | clientID: snapchat_APP_ID, 103 | clientSecret: snapchat_APP_SECRET, 104 | callbackURL: "http://localhost:3000/auth/snapchat/callback", 105 | profileFields: ['id', 'displayName', 'bitmoji'] 106 | }), ...) 107 | ``` 108 | 109 | Refer to the [Login Kit](https://docs.snapchat.com/docs/login-kit) 110 | section of the docs for the complete set of available fields. 111 | 112 | ## Contributing 113 | 114 | #### Tests 115 | 116 | The test suite is located in the `test/` directory. All new features are 117 | expected to have corresponding test cases. Ensure that the complete test suite 118 | passes by executing: 119 | 120 | ```bash 121 | $ npm test 122 | ``` 123 | 124 | ## License 125 | 126 | [The MIT License](http://opensource.org/licenses/MIT) 127 | 128 | Copyright (c) 2018 Snap Inc. 129 | -------------------------------------------------------------------------------- /test/strategy.profile.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { InternalOAuthError } from 'passport-oauth2'; 3 | import { SnapchatProfile } from '../src/profile'; 4 | import config from '../src/config'; 5 | import fs from 'fs'; 6 | import SnapchatAPIError from '../src/errors/SnapchatAPIError'; 7 | import SnapchatStrategy from '../src/strategy'; 8 | import SnapchatProfileParseError from '../src/errors/SnapchatProfileParseError'; 9 | 10 | type AnyFunction = (...args: any[]) => any; 11 | 12 | describe('Strategy#userProfile', function() { 13 | 14 | describe('fetched from Snapchat API with profile fields mapped from Portable Contacts schema and Snapchat properties', function() { 15 | let strategy = new SnapchatStrategy({ 16 | callbackURL: '', 17 | clientID: 'ABC123', 18 | clientSecret: 'secret', 19 | profileFields: ['id', 'displayName', 'bitmoji'], 20 | }, function() {} as any); 21 | 22 | (strategy as any)._oauth2.get = function(url: string, accessToken: string, callback: AnyFunction) { 23 | if (url !== `${config.SNAP_KIT_API_URL}/me?query=${encodeURIComponent(`{me{externalId displayName bitmoji{avatar id}}}`)}`) { return callback(new Error('incorrect url argument')); } 24 | if (accessToken !== 'token') { return callback(new Error('incorrect token argument')); } 25 | fs.readFile('test/fixtures/me.json', 'utf8', function(err, data) { 26 | if (err) { return callback(err); } 27 | callback(null, data, undefined); 28 | }); 29 | }; 30 | 31 | let profile: SnapchatProfile; 32 | 33 | before(function(done) { 34 | strategy.userProfile('token', function(err, p) { 35 | if (err) { return done(err); } 36 | profile = p!; 37 | done(); 38 | }); 39 | }); 40 | 41 | it('should parse profile', function() { 42 | expect(profile.provider).to.equal('snapchat'); 43 | expect(profile.id).to.equal('my-external-id'); 44 | expect(profile.displayName).to.equal('Ghostface Chillah'); 45 | expect(profile.bitmoji.avatarId).to.equal('my-bitmoji-id'); 46 | expect(profile.bitmoji.avatarUrl).to.equal('https://render.bitstrips.com/v2/cpanel/sticker-circle-bitmoji-id.png?transparent=1&palette=1'); 47 | 48 | expect(profile.name).to.be.undefined; 49 | expect(profile.username).to.be.undefined; 50 | expect(profile.emails).to.be.undefined; 51 | expect(profile.photos).to.be.undefined; 52 | }); 53 | 54 | it('should set raw property', function() { 55 | expect((profile as any)._raw).to.be.a('string'); 56 | }); 57 | 58 | it('should set json property', function() { 59 | expect((profile as any)._json).to.be.an('object'); 60 | }); 61 | }); 62 | 63 | describe('fetched from Snapchat API with profile fields mapped from Portable Contacts and custom properties', function() { 64 | let strategy = new SnapchatStrategy({ 65 | callbackURL: '', 66 | clientID: 'ABC123', 67 | clientSecret: 'secret', 68 | profileFields: ['id', 'displayName', 'bitmoji{avatar}'], 69 | }, function() {} as any); 70 | 71 | (strategy as any)._oauth2.get = function(url: string, accessToken: string, callback: AnyFunction) { 72 | if (url !== `${config.SNAP_KIT_API_URL}/me?query=${encodeURIComponent(`{me{externalId displayName bitmoji{avatar}}}`)}`) { return callback(new Error('incorrect url argument')); } 73 | if (accessToken !== 'token') { return callback(new Error('incorrect token argument')); } 74 | fs.readFile('test/fixtures/meWithOnlyBitmojiAvatarUrl.json', 'utf8', function(err, data) { 75 | if (err) { return callback(err); } 76 | callback(null, data, undefined); 77 | }); 78 | }; 79 | 80 | let profile: SnapchatProfile; 81 | 82 | before(function(done) { 83 | strategy.userProfile('token', function(err, p) { 84 | if (err) { return done(err); } 85 | profile = p!; 86 | done(); 87 | }); 88 | }); 89 | 90 | it('should parse profile', function() { 91 | expect(profile.provider).to.equal('snapchat'); 92 | expect(profile.id).to.equal('my-external-id'); 93 | expect(profile.displayName).to.equal('Ghostface Chillah'); 94 | expect(profile.bitmoji.avatarId).to.be.undefined; 95 | expect(profile.bitmoji.avatarUrl).to.equal('https://render.bitstrips.com/v2/cpanel/sticker-circle-bitmoji-id.png?transparent=1&palette=1'); 96 | 97 | expect(profile.name).to.be.undefined; 98 | expect(profile.username).to.be.undefined; 99 | expect(profile.emails).to.be.undefined; 100 | expect(profile.photos).to.be.undefined; 101 | }); 102 | 103 | it('should set raw property', function() { 104 | expect((profile as any)._raw).to.be.a('string'); 105 | }); 106 | 107 | it('should set json property', function() { 108 | expect((profile as any)._json).to.be.an('object'); 109 | }); 110 | }); 111 | 112 | describe('error caused by invalid token when using Snapchat API', function() { 113 | let strategy = new SnapchatStrategy({ 114 | callbackURL: '', 115 | clientID: 'ABC123', 116 | clientSecret: 'secret' 117 | }, function() {} as any); 118 | 119 | (strategy as any)._oauth2.get = function(url: string, _accessToken: string, callback: AnyFunction) { 120 | if (url !== `${config.SNAP_KIT_API_URL}/me?query=${encodeURIComponent('{me{}}')}`) { return callback(new Error('incorrect url argument')); } 121 | 122 | var body = 'Message'; 123 | callback({ statusCode: 401, data: body }); 124 | }; 125 | 126 | let err: SnapchatAPIError; 127 | 128 | before(function(done) { 129 | strategy.userProfile('invalid-token', function(e: SnapchatAPIError) { 130 | err = e; 131 | done(); 132 | }); 133 | }); 134 | 135 | it('should error', function() { 136 | expect(err).to.be.an.instanceOf(Error); 137 | expect(err.name).to.equal('SnapchatAPIError'); 138 | expect(err.message).to.equal("Message"); 139 | }); 140 | }); // error caused by invalid token when using Snapchat API 141 | 142 | describe('error caused by malformed response', function() { 143 | let strategy = new SnapchatStrategy({ 144 | callbackURL: '', 145 | clientID: 'ABC123', 146 | clientSecret: 'secret' 147 | }, function() {} as any); 148 | 149 | (strategy as any)._oauth2.get = function(_url: string, _accessToken: string, callback: AnyFunction) { 150 | var body = 'Hello, world.'; 151 | callback(null, body, undefined); 152 | }; 153 | 154 | let err: SnapchatProfileParseError; 155 | 156 | before(function(done) { 157 | strategy.userProfile('token', function(e: SnapchatProfileParseError) { 158 | err = e!; 159 | done(); 160 | }); 161 | }); 162 | 163 | it('should error', function() { 164 | expect(err).to.be.an.instanceOf(Error); 165 | expect(err.message).to.contain('Failed to parse user profile'); 166 | }); 167 | }); // error caused by malformed response 168 | 169 | describe('internal error', function() { 170 | let strategy = new SnapchatStrategy({ 171 | callbackURL: '', 172 | clientID: 'ABC123', 173 | clientSecret: 'secret' 174 | }, function verify() {} as any); 175 | 176 | (strategy as any)._oauth2.get = function(_url: string, _accessToken: string, callback: AnyFunction) { 177 | return callback(new Error('something went wrong')); 178 | } 179 | 180 | let err: InternalOAuthError; 181 | let profile: undefined; 182 | 183 | before(function(done) { 184 | strategy.userProfile('token', function(e: InternalOAuthError, p: undefined) { 185 | err = e; 186 | profile = p; 187 | done(); 188 | }); 189 | }); 190 | 191 | it('should error', function() { 192 | expect(err).to.be.an.instanceOf(Error); 193 | expect(err.constructor.name).to.equal('InternalOAuthError'); 194 | expect(err.message).to.equal('Failed to fetch user profile'); 195 | expect(err.oauthError).to.be.an.instanceOf(Error); 196 | expect(err.oauthError.message).to.equal('something went wrong'); 197 | }); 198 | 199 | it('should not load profile', function() { 200 | expect(profile).to.be.undefined; 201 | }); 202 | }); // internal error 203 | 204 | }); 205 | -------------------------------------------------------------------------------- /src/strategy.ts: -------------------------------------------------------------------------------- 1 | import OAuth2Strategy, { InternalOAuthError } from 'passport-oauth2'; 2 | import { parse as parseProfile, SnapchatProfile } from './profile'; 3 | import uri from 'url'; 4 | import config from './config'; 5 | import SnapchatAPIError from './errors/SnapchatAPIError'; 6 | import SnapchatProfileParseError from './errors/SnapchatProfileParseError'; 7 | 8 | interface SnapchatStrategyOptions { 9 | /** 10 | * @optional 11 | * 12 | * URL used to obtain an authorization grant from Snapchat 13 | * 14 | * @default 'https://accounts.snapchat.com/accounts/oauth2/auth' 15 | */ 16 | authorizationURL?: string; 17 | /** 18 | * @required 19 | * URL to which Snapchat will redirect the user after granting authorization 20 | */ 21 | callbackURL: string; 22 | /** 23 | * @required 24 | * Your application's client ID. Your client ID can be found 25 | * within the Snap Kit Developer Portal (https://kit.snapchat.com/portal) 26 | */ 27 | clientID: string; 28 | /** 29 | * @required 30 | * Your application's client secret. You can generate a confidential client and secret 31 | * within the Snap Kit Developer Portal (https://kit.snapchat.com/portal) 32 | */ 33 | clientSecret: string; 34 | /** 35 | * @optional 36 | * Determines whether `req` is passed as the first argument to the verify callback 37 | * triggered when Snapchat redirects to the `callbackURL`. 38 | * 39 | * @default false 40 | */ 41 | passReqToCallback?: boolean; 42 | /** 43 | * @optional 44 | * 45 | * An array of profile fields indicating which fields to query within a Snapchat user profile 46 | * when requesting information from the user profile endpoint (`profileURL`). 47 | * Valid fields are: 48 | * - `'id'` 49 | * - `'displayName'` 50 | * - `'bitmoji'` 51 | * 52 | * @default [] 53 | */ 54 | profileFields?: string[]; 55 | /** 56 | * @optional 57 | * 58 | * Endpoint URL for retrieving Snapchat user profile information. 59 | * 60 | * @default 'https://kit.snapchat.com/v1/me' 61 | */ 62 | profileURL?: string; 63 | /** 64 | * @optional 65 | * 66 | * An array of Snapchat OAuth2 scopes. May also be a string of scopes separated by `scopeSeparator`. 67 | * Valid scopes include: 68 | * - `'user.display_name'` 69 | * - `'user.bitmoji.avatar'` 70 | * 71 | * @default [] 72 | */ 73 | scope?: string | string[]; 74 | /** 75 | * @optional 76 | * 77 | * String delimiter for scopes in `scopes`. 78 | * 79 | * @default ' ' 80 | */ 81 | scopeSeparator?: string; 82 | /** 83 | * @optional 84 | * 85 | * URL used to obtain an access token from Snapchat 86 | * 87 | * @default 'https://accounts.snapchat.com/accounts/oauth2/token' 88 | */ 89 | tokenURL?: string; 90 | } 91 | 92 | /** 93 | * `Strategy` constructor. 94 | * 95 | * The Snapchat authentication strategy authenticates requests by delegating to 96 | * Snapchat using the OAuth 2.0 protocol. 97 | * 98 | * Applications must supply a `verify` callback which accepts an `accessToken`, 99 | * `refreshToken` and service-specific `profile`, and then calls the `cb` 100 | * callback supplying a `user`, which should be set to `false` if the 101 | * credentials are not valid. If an exception occured, `err` should be set. 102 | * 103 | * Options: 104 | * - `clientID` your Snapchat application's App ID 105 | * - `clientSecret` your Snapchat application's App Secret 106 | * - `callbackURL` URL to which Snapchat will redirect the user after granting authorization 107 | * - `profileFields` array of fields to add to query. Valid fields are 'id', 'displayName', 'bitmoji'. 108 | * - `scope` array of scopes. Valid scopes are 'user.display_name' & 'user.bitmoji.avatar'. 109 | * 110 | * Examples: 111 | * 112 | * ```javascript 113 | * passport.use(new SnapchatStrategy({ 114 | * clientID: '123-456-789', // process.env.clientID 115 | * clientSecret: 'shhh-its-a-secret', // process.env.clientSecret 116 | * callbackURL: 'https://www.example.net/auth/Snapchat/callback', 117 | * profileFields: ['id', 'displayName', 'bitmoji'], 118 | * scope: ['user.display_name', 'user.bitmoji.avatar'], 119 | * }, 120 | * function(accessToken, refreshToken, profile, cb) { 121 | * User.findOrCreate(..., function (err, user) { 122 | * cb(err, user); 123 | * }); 124 | * } 125 | * )); 126 | * ``` 127 | */ 128 | export default class Strategy extends OAuth2Strategy { 129 | /** 130 | * @hidden 131 | */ 132 | public name: string = 'snapchat'; 133 | 134 | // The following fields need to be marked as public to avoid TS build errors. 135 | /** 136 | * @hidden 137 | */ 138 | public _clientSecret: string | undefined; 139 | /** 140 | * @hidden 141 | */ 142 | public _scope: string[]; 143 | 144 | private profileFields: string[]; 145 | private profileURL: string; 146 | 147 | constructor( 148 | options: SnapchatStrategyOptions, 149 | verify: OAuth2Strategy.VerifyFunction, 150 | ) { 151 | super(normalizeOptions(options) as any, verify); 152 | 153 | const { clientSecret, profileURL, profileFields, scope } = normalizeOptions( 154 | options, 155 | ); 156 | this._clientSecret = clientSecret; 157 | this._scope = scope as string[]; 158 | this.profileURL = profileURL; 159 | this.profileFields = profileFields; 160 | // The types for _oauth2 are incorrect. As a result, need to cast it to any 161 | // in order to avoid type errors when setting this field. 162 | (this._oauth2 as any)._useAuthorizationHeaderForGET = true; 163 | } 164 | 165 | /** 166 | * Retrieve user profile from Snapchat. 167 | * 168 | * This function constructs a normalized profile, with the following properties: 169 | * 170 | * - `provider` always set to `snapchat` 171 | * - `id` the user's Snapchat ID 172 | * - `displayName` the user's display name 173 | * - `bitmoji.avatarId` the bitmojiAvatarId for the user on Snapchat 174 | * - `bitmoji.avatarUrl` the url for rendering the bitmoji avatar for the user on Snapchat 175 | */ 176 | public userProfile( 177 | accessToken: string, 178 | done: (err: Error | null, snapchatProfile?: SnapchatProfile) => void, 179 | ) { 180 | const parsedUri = uri.parse(this.profileURL); 181 | // Choose the query based on the scopes passed in 182 | const query = `query=${encodeURIComponent( 183 | `{me{${this.profileFields.join(' ')}}}`, 184 | )}`; 185 | // Add the query to the existing search params if the uri already includes some 186 | parsedUri.search = parsedUri.search 187 | ? `${parsedUri.search}&${query}` 188 | : query; 189 | // Format the uri to be a string 190 | const url = uri.format(parsedUri) as string; 191 | 192 | // The types for _oauth2 are incorrect. As a result, need to cast it to any 193 | // in order to avoid type errors when making the GET request. 194 | (this._oauth2 as any).get(url, accessToken, function( 195 | err: any, 196 | body: any, 197 | _res: any, 198 | ): void { 199 | let json; 200 | if (err) { 201 | if (err.data) { 202 | try { 203 | json = JSON.parse(err.data); 204 | } catch (_) {} 205 | } 206 | 207 | if (json && json.error && json.error_description) { 208 | return done(new SnapchatAPIError(json.error_description, json.error)); 209 | } else if (err.data && err.statusCode) { 210 | return done(new SnapchatAPIError(err.data, err.statusCode)); 211 | } 212 | return done( 213 | new InternalOAuthError('Failed to fetch user profile', err), 214 | ); 215 | } 216 | 217 | try { 218 | json = JSON.parse(body); 219 | } catch (e) { 220 | return done( 221 | new SnapchatProfileParseError( 222 | `Failed to parse user profile with error: ${e.message}`, 223 | e, 224 | ), 225 | ); 226 | } 227 | 228 | const { data: { me: profileJson = {} } = {} } = json; 229 | const profile: SnapchatProfile & any = parseProfile(profileJson); 230 | profile._raw = body; 231 | profile._json = json; 232 | 233 | done(null, profile); 234 | }); 235 | } 236 | } 237 | 238 | /** 239 | * @hidden 240 | */ 241 | const fieldsToGraphField = { 242 | bitmoji: 'bitmoji{avatar id}', 243 | displayName: 'displayName', 244 | id: 'externalId', 245 | }; 246 | 247 | /** 248 | * @hidden 249 | */ 250 | function getGraphFieldForNormalizedFieldName(field: string): string { 251 | return fieldsToGraphField[field] || field; 252 | } 253 | 254 | /** 255 | * @hidden 256 | */ 257 | function normalizeScope(scope: string): string { 258 | return scope.startsWith('https:') 259 | ? scope 260 | : config.OAUTH_SCOPE_URL_PREFIX + scope; 261 | } 262 | 263 | /** 264 | * @hidden 265 | */ 266 | function normalizeOptions( 267 | options: any = {}, 268 | ): Required { 269 | const scopeSeparator = options.scopeSeparator || ' '; 270 | const scopesStringOrArray = options.scope || []; 271 | const scopes = 272 | typeof scopesStringOrArray === 'string' 273 | ? scopesStringOrArray.split(scopeSeparator) 274 | : scopesStringOrArray; 275 | const profileFields = options.profileFields || []; 276 | return { 277 | ...options, 278 | authorizationURL: options.authorizationURL || config.SNAP_ACCOUNTS_AUTH_URL, 279 | profileFields: profileFields 280 | .map(getGraphFieldForNormalizedFieldName) 281 | .filter(Boolean), 282 | profileURL: options.profileURL || `${config.SNAP_KIT_API_URL}/me`, 283 | scope: scopes.map(normalizeScope).filter(Boolean), 284 | scopeSeparator, 285 | tokenURL: options.tokenURL || config.SNAP_ACCOUNTS_TOKEN_URL, 286 | }; 287 | } 288 | -------------------------------------------------------------------------------- /docs/assets/js/search.js: -------------------------------------------------------------------------------- 1 | var typedoc = typedoc || {}; 2 | typedoc.search = typedoc.search || {}; 3 | typedoc.search.data = {"kinds":{"2":"Module","64":"Function","128":"Class","256":"Interface","512":"Constructor","1024":"Property","2048":"Method","65536":"Type literal","4194304":"Type alias"},"rows":[{"id":0,"kind":128,"name":"SnapchatAPIError","url":"classes/snapchatapierror.html","classes":"tsd-kind-class"},{"id":1,"kind":512,"name":"constructor","url":"classes/snapchatapierror.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"SnapchatAPIError"},{"id":2,"kind":1024,"name":"message","url":"classes/snapchatapierror.html#message","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-overwrite","parent":"SnapchatAPIError"},{"id":3,"kind":1024,"name":"code","url":"classes/snapchatapierror.html#code","classes":"tsd-kind-property tsd-parent-kind-class","parent":"SnapchatAPIError"},{"id":4,"kind":1024,"name":"name","url":"classes/snapchatapierror.html#name","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"SnapchatAPIError"},{"id":5,"kind":1024,"name":"stack","url":"classes/snapchatapierror.html#stack","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-overwrite tsd-is-inherited","parent":"SnapchatAPIError"},{"id":6,"kind":1024,"name":"Error","url":"classes/snapchatapierror.html#error","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-static","parent":"SnapchatAPIError"},{"id":7,"kind":128,"name":"SnapchatProfileParseError","url":"classes/snapchatprofileparseerror.html","classes":"tsd-kind-class"},{"id":8,"kind":512,"name":"constructor","url":"classes/snapchatprofileparseerror.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"SnapchatProfileParseError"},{"id":9,"kind":1024,"name":"message","url":"classes/snapchatprofileparseerror.html#message","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-overwrite","parent":"SnapchatProfileParseError"},{"id":10,"kind":1024,"name":"parseError","url":"classes/snapchatprofileparseerror.html#parseerror","classes":"tsd-kind-property tsd-parent-kind-class","parent":"SnapchatProfileParseError"},{"id":11,"kind":1024,"name":"name","url":"classes/snapchatprofileparseerror.html#name","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"SnapchatProfileParseError"},{"id":12,"kind":1024,"name":"stack","url":"classes/snapchatprofileparseerror.html#stack","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-overwrite tsd-is-inherited","parent":"SnapchatProfileParseError"},{"id":13,"kind":1024,"name":"Error","url":"classes/snapchatprofileparseerror.html#error","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-static","parent":"SnapchatProfileParseError"},{"id":14,"kind":256,"name":"BitmojiData","url":"interfaces/bitmojidata.html","classes":"tsd-kind-interface"},{"id":15,"kind":1024,"name":"avatarId","url":"interfaces/bitmojidata.html#avatarid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"BitmojiData"},{"id":16,"kind":1024,"name":"avatarUrl","url":"interfaces/bitmojidata.html#avatarurl","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"BitmojiData"},{"id":17,"kind":256,"name":"SnapchatProfile","url":"interfaces/snapchatprofile.html","classes":"tsd-kind-interface"},{"id":18,"kind":1024,"name":"bitmoji","url":"interfaces/snapchatprofile.html#bitmoji","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"SnapchatProfile"},{"id":19,"kind":1024,"name":"provider","url":"interfaces/snapchatprofile.html#provider","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-overwrite","parent":"SnapchatProfile"},{"id":20,"kind":1024,"name":"id","url":"interfaces/snapchatprofile.html#id","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"SnapchatProfile"},{"id":21,"kind":1024,"name":"displayName","url":"interfaces/snapchatprofile.html#displayname","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"SnapchatProfile"},{"id":22,"kind":1024,"name":"username","url":"interfaces/snapchatprofile.html#username","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"SnapchatProfile"},{"id":23,"kind":1024,"name":"name","url":"interfaces/snapchatprofile.html#name","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"SnapchatProfile"},{"id":24,"kind":1024,"name":"emails","url":"interfaces/snapchatprofile.html#emails","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"SnapchatProfile"},{"id":25,"kind":1024,"name":"photos","url":"interfaces/snapchatprofile.html#photos","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"SnapchatProfile"},{"id":26,"kind":64,"name":"parse","url":"globals.html#parse","classes":"tsd-kind-function"},{"id":27,"kind":256,"name":"SnapchatStrategyOptions","url":"interfaces/snapchatstrategyoptions.html","classes":"tsd-kind-interface tsd-is-not-exported"},{"id":28,"kind":1024,"name":"authorizationURL","url":"interfaces/snapchatstrategyoptions.html#authorizationurl","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-not-exported","parent":"SnapchatStrategyOptions"},{"id":29,"kind":1024,"name":"callbackURL","url":"interfaces/snapchatstrategyoptions.html#callbackurl","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-not-exported","parent":"SnapchatStrategyOptions"},{"id":30,"kind":1024,"name":"clientID","url":"interfaces/snapchatstrategyoptions.html#clientid","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-not-exported","parent":"SnapchatStrategyOptions"},{"id":31,"kind":1024,"name":"clientSecret","url":"interfaces/snapchatstrategyoptions.html#clientsecret","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-not-exported","parent":"SnapchatStrategyOptions"},{"id":32,"kind":1024,"name":"passReqToCallback","url":"interfaces/snapchatstrategyoptions.html#passreqtocallback","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-not-exported","parent":"SnapchatStrategyOptions"},{"id":33,"kind":1024,"name":"profileFields","url":"interfaces/snapchatstrategyoptions.html#profilefields","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-not-exported","parent":"SnapchatStrategyOptions"},{"id":34,"kind":1024,"name":"profileURL","url":"interfaces/snapchatstrategyoptions.html#profileurl","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-not-exported","parent":"SnapchatStrategyOptions"},{"id":35,"kind":1024,"name":"scope","url":"interfaces/snapchatstrategyoptions.html#scope","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-not-exported","parent":"SnapchatStrategyOptions"},{"id":36,"kind":1024,"name":"scopeSeparator","url":"interfaces/snapchatstrategyoptions.html#scopeseparator","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-not-exported","parent":"SnapchatStrategyOptions"},{"id":37,"kind":1024,"name":"tokenURL","url":"interfaces/snapchatstrategyoptions.html#tokenurl","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-not-exported","parent":"SnapchatStrategyOptions"},{"id":38,"kind":128,"name":"Strategy","url":"classes/strategy.html","classes":"tsd-kind-class"},{"id":39,"kind":512,"name":"constructor","url":"classes/strategy.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class tsd-is-overwrite","parent":"Strategy"},{"id":40,"kind":2048,"name":"userProfile","url":"classes/strategy.html#userprofile","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-overwrite","parent":"Strategy"},{"id":41,"kind":2048,"name":"authenticate","url":"classes/strategy.html#authenticate","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Strategy"},{"id":42,"kind":2048,"name":"authorizationParams","url":"classes/strategy.html#authorizationparams","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Strategy"},{"id":43,"kind":2048,"name":"tokenParams","url":"classes/strategy.html#tokenparams","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Strategy"},{"id":44,"kind":2048,"name":"parseErrorResponse","url":"classes/strategy.html#parseerrorresponse","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-inherited","parent":"Strategy"},{"id":45,"kind":2,"name":"OAuth2Strategy","url":"modules/strategy.oauth2strategy.html","classes":"tsd-kind-module tsd-parent-kind-class","parent":"Strategy"},{"id":46,"kind":256,"name":"_StrategyOptionsBase","url":"interfaces/strategy.oauth2strategy._strategyoptionsbase.html","classes":"tsd-kind-interface tsd-parent-kind-module","parent":"Strategy.OAuth2Strategy"},{"id":47,"kind":1024,"name":"authorizationURL","url":"interfaces/strategy.oauth2strategy._strategyoptionsbase.html#authorizationurl","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Strategy.OAuth2Strategy._StrategyOptionsBase"},{"id":48,"kind":1024,"name":"tokenURL","url":"interfaces/strategy.oauth2strategy._strategyoptionsbase.html#tokenurl","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Strategy.OAuth2Strategy._StrategyOptionsBase"},{"id":49,"kind":1024,"name":"clientID","url":"interfaces/strategy.oauth2strategy._strategyoptionsbase.html#clientid","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Strategy.OAuth2Strategy._StrategyOptionsBase"},{"id":50,"kind":1024,"name":"clientSecret","url":"interfaces/strategy.oauth2strategy._strategyoptionsbase.html#clientsecret","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Strategy.OAuth2Strategy._StrategyOptionsBase"},{"id":51,"kind":1024,"name":"callbackURL","url":"interfaces/strategy.oauth2strategy._strategyoptionsbase.html#callbackurl","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Strategy.OAuth2Strategy._StrategyOptionsBase"},{"id":52,"kind":256,"name":"StrategyOptions","url":"interfaces/strategy.oauth2strategy.strategyoptions.html","classes":"tsd-kind-interface tsd-parent-kind-module","parent":"Strategy.OAuth2Strategy"},{"id":53,"kind":1024,"name":"passReqToCallback","url":"interfaces/strategy.oauth2strategy.strategyoptions.html#passreqtocallback","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Strategy.OAuth2Strategy.StrategyOptions"},{"id":54,"kind":1024,"name":"authorizationURL","url":"interfaces/strategy.oauth2strategy.strategyoptions.html#authorizationurl","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Strategy.OAuth2Strategy.StrategyOptions"},{"id":55,"kind":1024,"name":"tokenURL","url":"interfaces/strategy.oauth2strategy.strategyoptions.html#tokenurl","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Strategy.OAuth2Strategy.StrategyOptions"},{"id":56,"kind":1024,"name":"clientID","url":"interfaces/strategy.oauth2strategy.strategyoptions.html#clientid","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Strategy.OAuth2Strategy.StrategyOptions"},{"id":57,"kind":1024,"name":"clientSecret","url":"interfaces/strategy.oauth2strategy.strategyoptions.html#clientsecret","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Strategy.OAuth2Strategy.StrategyOptions"},{"id":58,"kind":1024,"name":"callbackURL","url":"interfaces/strategy.oauth2strategy.strategyoptions.html#callbackurl","classes":"tsd-kind-property tsd-parent-kind-interface tsd-is-inherited","parent":"Strategy.OAuth2Strategy.StrategyOptions"},{"id":59,"kind":256,"name":"StrategyOptionsWithRequest","url":"interfaces/strategy.oauth2strategy.strategyoptionswithrequest.html","classes":"tsd-kind-interface tsd-parent-kind-module","parent":"Strategy.OAuth2Strategy"},{"id":60,"kind":1024,"name":"passReqToCallback","url":"interfaces/strategy.oauth2strategy.strategyoptionswithrequest.html#passreqtocallback","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"Strategy.OAuth2Strategy.StrategyOptionsWithRequest"},{"id":61,"kind":128,"name":"TokenError","url":"classes/strategy.oauth2strategy.tokenerror.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"Strategy.OAuth2Strategy"},{"id":62,"kind":512,"name":"constructor","url":"classes/strategy.oauth2strategy.tokenerror.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"Strategy.OAuth2Strategy.TokenError"},{"id":63,"kind":1024,"name":"code","url":"classes/strategy.oauth2strategy.tokenerror.html#code","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Strategy.OAuth2Strategy.TokenError"},{"id":64,"kind":1024,"name":"uri","url":"classes/strategy.oauth2strategy.tokenerror.html#uri","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Strategy.OAuth2Strategy.TokenError"},{"id":65,"kind":1024,"name":"status","url":"classes/strategy.oauth2strategy.tokenerror.html#status","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Strategy.OAuth2Strategy.TokenError"},{"id":66,"kind":1024,"name":"name","url":"classes/strategy.oauth2strategy.tokenerror.html#name","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"Strategy.OAuth2Strategy.TokenError"},{"id":67,"kind":1024,"name":"message","url":"classes/strategy.oauth2strategy.tokenerror.html#message","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-inherited","parent":"Strategy.OAuth2Strategy.TokenError"},{"id":68,"kind":1024,"name":"stack","url":"classes/strategy.oauth2strategy.tokenerror.html#stack","classes":"tsd-kind-property tsd-parent-kind-class tsd-is-overwrite tsd-is-inherited","parent":"Strategy.OAuth2Strategy.TokenError"},{"id":69,"kind":128,"name":"AuthorizationError","url":"classes/strategy.oauth2strategy.authorizationerror.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"Strategy.OAuth2Strategy"},{"id":70,"kind":512,"name":"constructor","url":"classes/strategy.oauth2strategy.authorizationerror.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"Strategy.OAuth2Strategy.AuthorizationError"},{"id":71,"kind":1024,"name":"code","url":"classes/strategy.oauth2strategy.authorizationerror.html#code","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Strategy.OAuth2Strategy.AuthorizationError"},{"id":72,"kind":1024,"name":"uri","url":"classes/strategy.oauth2strategy.authorizationerror.html#uri","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Strategy.OAuth2Strategy.AuthorizationError"},{"id":73,"kind":1024,"name":"status","url":"classes/strategy.oauth2strategy.authorizationerror.html#status","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Strategy.OAuth2Strategy.AuthorizationError"},{"id":74,"kind":128,"name":"InternalOAuthError","url":"classes/strategy.oauth2strategy.internaloautherror.html","classes":"tsd-kind-class tsd-parent-kind-module","parent":"Strategy.OAuth2Strategy"},{"id":75,"kind":512,"name":"constructor","url":"classes/strategy.oauth2strategy.internaloautherror.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"Strategy.OAuth2Strategy.InternalOAuthError"},{"id":76,"kind":1024,"name":"oauthError","url":"classes/strategy.oauth2strategy.internaloautherror.html#oautherror","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Strategy.OAuth2Strategy.InternalOAuthError"},{"id":77,"kind":4194304,"name":"VerifyCallback","url":"modules/strategy.oauth2strategy.html#verifycallback","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"Strategy.OAuth2Strategy"},{"id":78,"kind":65536,"name":"__type","url":"modules/strategy.oauth2strategy.html#verifycallback.__type","classes":"tsd-kind-type-literal tsd-parent-kind-type-alias","parent":"Strategy.OAuth2Strategy.VerifyCallback"},{"id":79,"kind":4194304,"name":"VerifyFunction","url":"modules/strategy.oauth2strategy.html#verifyfunction","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"Strategy.OAuth2Strategy"},{"id":80,"kind":4194304,"name":"VerifyFunctionWithRequest","url":"modules/strategy.oauth2strategy.html#verifyfunctionwithrequest","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"Strategy.OAuth2Strategy"},{"id":81,"kind":4194304,"name":"Strategy","url":"modules/strategy.oauth2strategy.html#strategy","classes":"tsd-kind-type-alias tsd-parent-kind-module","parent":"Strategy.OAuth2Strategy"}]}; -------------------------------------------------------------------------------- /docs/assets/css/main.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "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", 4 | "sources": ["../../../../src/default/assets/css/vendors/_normalize.sass","../../../../src/default/assets/css/vendors/_highlight.js.sass","../../../../src/default/assets/css/setup/_mixins.sass","../../../../src/default/assets/css/setup/_grid.sass","../../../../src/default/assets/css/setup/_icons.scss","../../../../src/default/assets/css/setup/_animations.sass","../../../../src/default/assets/css/setup/_typography.sass","../../../../src/default/assets/css/_constants.sass","../../../../src/default/assets/css/layouts/_default.sass","../../../../src/default/assets/css/layouts/_minimal.sass","../../../../src/default/assets/css/elements/_comment.sass","../../../../src/default/assets/css/elements/_filter.sass","../../../../src/default/assets/css/elements/_footer.sass","../../../../src/default/assets/css/elements/_hierarchy.sass","../../../../src/default/assets/css/elements/_index.sass","../../../../src/default/assets/css/elements/_member.sass","../../../../src/default/assets/css/elements/_navigation.sass","../../../../src/default/assets/css/elements/_panel.sass","../../../../src/default/assets/css/elements/_search.sass","../../../../src/default/assets/css/elements/_signatures.sass","../../../../src/default/assets/css/elements/_sources.sass","../../../../src/default/assets/css/elements/_toolbar.sass","../../../../src/default/assets/css/elements/_images.sass"], 5 | "names": [], 6 | "file": "main.css" 7 | } 8 | -------------------------------------------------------------------------------- /docs/assets/css/main.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v1.1.3 | MIT License | git.io/normalize */ 2 | /* ========================================================================== HTML5 display definitions ========================================================================== */ 3 | /** Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. */ 4 | article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } 5 | 6 | /** Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. */ 7 | audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } 8 | 9 | /** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */ 10 | audio:not([controls]) { display: none; height: 0; } 11 | 12 | /** Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. Known issue: no IE 6 support. */ 13 | [hidden] { display: none; } 14 | 15 | /* ========================================================================== Base ========================================================================== */ 16 | /** 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using `em` units. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */ 17 | html { font-size: 100%; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ font-family: sans-serif; } 18 | 19 | /** Address `font-family` inconsistency between `textarea` and other form elements. */ 20 | button, input, select, textarea { font-family: sans-serif; } 21 | 22 | /** Address margins handled incorrectly in IE 6/7. */ 23 | body { margin: 0; } 24 | 25 | /* ========================================================================== Links ========================================================================== */ 26 | /** Address `outline` inconsistency between Chrome and other browsers. */ 27 | a:focus { outline: thin dotted; } 28 | a:active, a:hover { outline: 0; } 29 | 30 | /** Improve readability when focused and also mouse hovered in all browsers. */ 31 | /* ========================================================================== Typography ========================================================================== */ 32 | /** Address font sizes and margins set differently in IE 6/7. Address font sizes within `section` and `article` in Firefox 4+, Safari 5, and Chrome. */ 33 | h1 { font-size: 2em; margin: 0.67em 0; } 34 | 35 | h2 { font-size: 1.5em; margin: 0.83em 0; } 36 | 37 | h3 { font-size: 1.17em; margin: 1em 0; } 38 | 39 | h4, .tsd-index-panel h3 { font-size: 1em; margin: 1.33em 0; } 40 | 41 | h5 { font-size: 0.83em; margin: 1.67em 0; } 42 | 43 | h6 { font-size: 0.67em; margin: 2.33em 0; } 44 | 45 | /** Address styling not present in IE 7/8/9, Safari 5, and Chrome. */ 46 | abbr[title] { border-bottom: 1px dotted; } 47 | 48 | /** Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. */ 49 | b, strong { font-weight: bold; } 50 | 51 | blockquote { margin: 1em 40px; } 52 | 53 | /** Address styling not present in Safari 5 and Chrome. */ 54 | dfn { font-style: italic; } 55 | 56 | /** Address differences between Firefox and other browsers. Known issue: no IE 6/7 normalization. */ 57 | hr { box-sizing: content-box; height: 0; } 58 | 59 | /** Address styling not present in IE 6/7/8/9. */ 60 | mark { background: #ff0; color: #000; } 61 | 62 | /** Address margins set differently in IE 6/7. */ 63 | p, pre { margin: 1em 0; } 64 | 65 | /** Correct font family set oddly in IE 6, Safari 4/5, and Chrome. */ 66 | code, kbd, pre, samp { font-family: monospace, serif; _font-family: "courier new", monospace; font-size: 1em; } 67 | 68 | /** Improve readability of pre-formatted text in all browsers. */ 69 | pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } 70 | 71 | /** Address CSS quotes not supported in IE 6/7. */ 72 | q { quotes: none; } 73 | q:before, q:after { content: ""; content: none; } 74 | 75 | /** Address `quotes` property not supported in Safari 4. */ 76 | /** Address inconsistent and variable font size in all browsers. */ 77 | small { font-size: 80%; } 78 | 79 | /** Prevent `sub` and `sup` affecting `line-height` in all browsers. */ 80 | sub { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } 81 | 82 | sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; top: -0.5em; } 83 | 84 | sub { bottom: -0.25em; } 85 | 86 | /* ========================================================================== Lists ========================================================================== */ 87 | /** Address margins set differently in IE 6/7. */ 88 | dl, menu, ol, ul { margin: 1em 0; } 89 | 90 | dd { margin: 0 0 0 40px; } 91 | 92 | /** Address paddings set differently in IE 6/7. */ 93 | menu, ol, ul { padding: 0 0 0 40px; } 94 | 95 | /** Correct list images handled incorrectly in IE 7. */ 96 | nav ul, nav ol { list-style: none; list-style-image: none; } 97 | 98 | /* ========================================================================== Embedded content ========================================================================== */ 99 | /** 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. 2. Improve image quality when scaled in IE 7. */ 100 | img { border: 0; /* 1 */ -ms-interpolation-mode: bicubic; } 101 | 102 | /* 2 */ 103 | /** Correct overflow displayed oddly in IE 9. */ 104 | svg:not(:root) { overflow: hidden; } 105 | 106 | /* ========================================================================== Figures ========================================================================== */ 107 | /** Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. */ 108 | figure, form { margin: 0; } 109 | 110 | /* ========================================================================== Forms ========================================================================== */ 111 | /** Correct margin displayed oddly in IE 6/7. */ 112 | /** Define consistent border, margin, and padding. */ 113 | fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } 114 | 115 | /** 1. Correct color not being inherited in IE 6/7/8/9. 2. Correct text not wrapping in Firefox 3. 3. Correct alignment displayed oddly in IE 6/7. */ 116 | legend { border: 0; /* 1 */ padding: 0; white-space: normal; /* 2 */ *margin-left: -7px; } 117 | 118 | /* 3 */ 119 | /** 1. Correct font size not being inherited in all browsers. 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, and Chrome. 3. Improve appearance and consistency in all browsers. */ 120 | button, input, select, textarea { font-size: 100%; /* 1 */ margin: 0; /* 2 */ vertical-align: baseline; /* 3 */ *vertical-align: middle; } 121 | 122 | /* 3 */ 123 | /** Address Firefox 3+ setting `line-height` on `input` using `!important` in the UA stylesheet. */ 124 | button, input { line-height: normal; } 125 | 126 | /** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. Correct `select` style inheritance in Firefox 4+ and Opera. */ 127 | button, select { text-transform: none; } 128 | 129 | /** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. 4. Remove inner spacing in IE 7 without affecting normal text inputs. Known issue: inner spacing remains in IE 6. */ 130 | button, html input[type="button"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ *overflow: visible; } 131 | 132 | /* 4 */ 133 | input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ *overflow: visible; } 134 | 135 | /* 4 */ 136 | /** Re-set default cursor for disabled elements. */ 137 | button[disabled], html input[disabled] { cursor: default; } 138 | 139 | /** 1. Address box sizing set to content-box in IE 8/9. 2. Remove excess padding in IE 8/9. 3. Remove excess padding in IE 7. Known issue: excess padding remains in IE 6. */ 140 | input { /* 3 */ } 141 | input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ *height: 13px; /* 3 */ *width: 13px; } 142 | input[type="search"] { -webkit-appearance: textfield; /* 1 */ /* 2 */ box-sizing: content-box; } 143 | input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } 144 | 145 | /** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */ 146 | /** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */ 147 | /** Remove inner padding and border in Firefox 3+. */ 148 | button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } 149 | 150 | /** 1. Remove default vertical scrollbar in IE 6/7/8/9. 2. Improve readability and alignment in all browsers. */ 151 | textarea { overflow: auto; /* 1 */ vertical-align: top; } 152 | 153 | /* 2 */ 154 | /* ========================================================================== Tables ========================================================================== */ 155 | /** Remove most spacing between table cells. */ 156 | table { border-collapse: collapse; border-spacing: 0; } 157 | 158 | /* Visual Studio-like style based on original C# coloring by Jason Diamond */ 159 | .hljs { display: inline-block; padding: 0.5em; background: white; color: black; } 160 | 161 | .hljs-comment, .hljs-annotation, .hljs-template_comment, .diff .hljs-header, .hljs-chunk, .apache .hljs-cbracket { color: #008000; } 162 | 163 | .hljs-keyword, .hljs-id, .hljs-built_in, .css .smalltalk .hljs-class, .hljs-winutils, .bash .hljs-variable, .tex .hljs-command, .hljs-request, .hljs-status, .nginx .hljs-title { color: #00f; } 164 | 165 | .xml .hljs-tag { color: #00f; } 166 | .xml .hljs-tag .hljs-value { color: #00f; } 167 | 168 | .hljs-string, .hljs-title, .hljs-parent, .hljs-tag .hljs-value, .hljs-rules .hljs-value { color: #a31515; } 169 | 170 | .ruby .hljs-symbol { color: #a31515; } 171 | .ruby .hljs-symbol .hljs-string { color: #a31515; } 172 | 173 | .hljs-template_tag, .django .hljs-variable, .hljs-addition, .hljs-flow, .hljs-stream, .apache .hljs-tag, .hljs-date, .tex .hljs-formula, .coffeescript .hljs-attribute { color: #a31515; } 174 | 175 | .ruby .hljs-string, .hljs-decorator, .hljs-filter .hljs-argument, .hljs-localvars, .hljs-array, .hljs-attr_selector, .hljs-pseudo, .hljs-pi, .hljs-doctype, .hljs-deletion, .hljs-envvar, .hljs-shebang, .hljs-preprocessor, .hljs-pragma, .userType, .apache .hljs-sqbracket, .nginx .hljs-built_in, .tex .hljs-special, .hljs-prompt { color: #2b91af; } 176 | 177 | .hljs-phpdoc, .hljs-javadoc, .hljs-xmlDocTag { color: #808080; } 178 | 179 | .vhdl .hljs-typename { font-weight: bold; } 180 | .vhdl .hljs-string { color: #666666; } 181 | .vhdl .hljs-literal { color: #a31515; } 182 | .vhdl .hljs-attribute { color: #00b0e8; } 183 | 184 | .xml .hljs-attribute { color: #f00; } 185 | 186 | .col > :first-child, .col-1 > :first-child, .col-2 > :first-child, .col-3 > :first-child, .col-4 > :first-child, .col-5 > :first-child, .col-6 > :first-child, .col-7 > :first-child, .col-8 > :first-child, .col-9 > :first-child, .col-10 > :first-child, .col-11 > :first-child, .tsd-panel > :first-child, ul.tsd-descriptions > li > :first-child, .col > :first-child > :first-child, .col-1 > :first-child > :first-child, .col-2 > :first-child > :first-child, .col-3 > :first-child > :first-child, .col-4 > :first-child > :first-child, .col-5 > :first-child > :first-child, .col-6 > :first-child > :first-child, .col-7 > :first-child > :first-child, .col-8 > :first-child > :first-child, .col-9 > :first-child > :first-child, .col-10 > :first-child > :first-child, .col-11 > :first-child > :first-child, .tsd-panel > :first-child > :first-child, ul.tsd-descriptions > li > :first-child > :first-child, .col > :first-child > :first-child > :first-child, .col-1 > :first-child > :first-child > :first-child, .col-2 > :first-child > :first-child > :first-child, .col-3 > :first-child > :first-child > :first-child, .col-4 > :first-child > :first-child > :first-child, .col-5 > :first-child > :first-child > :first-child, .col-6 > :first-child > :first-child > :first-child, .col-7 > :first-child > :first-child > :first-child, .col-8 > :first-child > :first-child > :first-child, .col-9 > :first-child > :first-child > :first-child, .col-10 > :first-child > :first-child > :first-child, .col-11 > :first-child > :first-child > :first-child, .tsd-panel > :first-child > :first-child > :first-child, ul.tsd-descriptions > li > :first-child > :first-child > :first-child { margin-top: 0; } 187 | .col > :last-child, .col-1 > :last-child, .col-2 > :last-child, .col-3 > :last-child, .col-4 > :last-child, .col-5 > :last-child, .col-6 > :last-child, .col-7 > :last-child, .col-8 > :last-child, .col-9 > :last-child, .col-10 > :last-child, .col-11 > :last-child, .tsd-panel > :last-child, ul.tsd-descriptions > li > :last-child, .col > :last-child > :last-child, .col-1 > :last-child > :last-child, .col-2 > :last-child > :last-child, .col-3 > :last-child > :last-child, .col-4 > :last-child > :last-child, .col-5 > :last-child > :last-child, .col-6 > :last-child > :last-child, .col-7 > :last-child > :last-child, .col-8 > :last-child > :last-child, .col-9 > :last-child > :last-child, .col-10 > :last-child > :last-child, .col-11 > :last-child > :last-child, .tsd-panel > :last-child > :last-child, ul.tsd-descriptions > li > :last-child > :last-child, .col > :last-child > :last-child > :last-child, .col-1 > :last-child > :last-child > :last-child, .col-2 > :last-child > :last-child > :last-child, .col-3 > :last-child > :last-child > :last-child, .col-4 > :last-child > :last-child > :last-child, .col-5 > :last-child > :last-child > :last-child, .col-6 > :last-child > :last-child > :last-child, .col-7 > :last-child > :last-child > :last-child, .col-8 > :last-child > :last-child > :last-child, .col-9 > :last-child > :last-child > :last-child, .col-10 > :last-child > :last-child > :last-child, .col-11 > :last-child > :last-child > :last-child, .tsd-panel > :last-child > :last-child > :last-child, ul.tsd-descriptions > li > :last-child > :last-child > :last-child { margin-bottom: 0; } 188 | 189 | .container { max-width: 1200px; margin: 0 auto; padding: 0 40px; } 190 | @media (max-width: 640px) { .container { padding: 0 20px; } } 191 | 192 | .container-main { padding-bottom: 200px; } 193 | 194 | .row { position: relative; margin: 0 -10px; } 195 | .row:after { visibility: hidden; display: block; content: ""; clear: both; height: 0; } 196 | 197 | .col, .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11 { box-sizing: border-box; float: left; padding: 0 10px; } 198 | 199 | .col-1 { width: 8.33333%; } 200 | 201 | .offset-1 { margin-left: 8.33333%; } 202 | 203 | .col-2 { width: 16.66667%; } 204 | 205 | .offset-2 { margin-left: 16.66667%; } 206 | 207 | .col-3 { width: 25%; } 208 | 209 | .offset-3 { margin-left: 25%; } 210 | 211 | .col-4 { width: 33.33333%; } 212 | 213 | .offset-4 { margin-left: 33.33333%; } 214 | 215 | .col-5 { width: 41.66667%; } 216 | 217 | .offset-5 { margin-left: 41.66667%; } 218 | 219 | .col-6 { width: 50%; } 220 | 221 | .offset-6 { margin-left: 50%; } 222 | 223 | .col-7 { width: 58.33333%; } 224 | 225 | .offset-7 { margin-left: 58.33333%; } 226 | 227 | .col-8 { width: 66.66667%; } 228 | 229 | .offset-8 { margin-left: 66.66667%; } 230 | 231 | .col-9 { width: 75%; } 232 | 233 | .offset-9 { margin-left: 75%; } 234 | 235 | .col-10 { width: 83.33333%; } 236 | 237 | .offset-10 { margin-left: 83.33333%; } 238 | 239 | .col-11 { width: 91.66667%; } 240 | 241 | .offset-11 { margin-left: 91.66667%; } 242 | 243 | .tsd-kind-icon { display: block; position: relative; padding-left: 20px; text-indent: -20px; } 244 | .tsd-kind-icon:before { content: ''; display: inline-block; vertical-align: middle; width: 17px; height: 17px; margin: 0 3px 2px 0; background-image: url(../images/icons.png); } 245 | @media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { .tsd-kind-icon:before { background-image: url(../images/icons@2x.png); background-size: 238px 204px; } } 246 | 247 | .tsd-signature.tsd-kind-icon:before { background-position: 0 -153px; } 248 | 249 | .tsd-kind-object-literal > .tsd-kind-icon:before { background-position: 0px -17px; } 250 | .tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -17px; } 251 | .tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -17px; } 252 | 253 | .tsd-kind-class > .tsd-kind-icon:before { background-position: 0px -34px; } 254 | .tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -34px; } 255 | .tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -34px; } 256 | 257 | .tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: 0px -51px; } 258 | .tsd-kind-class.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -51px; } 259 | .tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -51px; } 260 | 261 | .tsd-kind-interface > .tsd-kind-icon:before { background-position: 0px -68px; } 262 | .tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -68px; } 263 | .tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -68px; } 264 | 265 | .tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: 0px -85px; } 266 | .tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -85px; } 267 | .tsd-kind-interface.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -85px; } 268 | 269 | .tsd-kind-module > .tsd-kind-icon:before { background-position: 0px -102px; } 270 | .tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -102px; } 271 | .tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -102px; } 272 | 273 | .tsd-kind-external-module > .tsd-kind-icon:before { background-position: 0px -102px; } 274 | .tsd-kind-external-module.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -102px; } 275 | .tsd-kind-external-module.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -102px; } 276 | 277 | .tsd-kind-enum > .tsd-kind-icon:before { background-position: 0px -119px; } 278 | .tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -119px; } 279 | .tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -119px; } 280 | 281 | .tsd-kind-enum-member > .tsd-kind-icon:before { background-position: 0px -136px; } 282 | .tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -136px; } 283 | .tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -136px; } 284 | 285 | .tsd-kind-signature > .tsd-kind-icon:before { background-position: 0px -153px; } 286 | .tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -153px; } 287 | .tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -153px; } 288 | 289 | .tsd-kind-type-alias > .tsd-kind-icon:before { background-position: 0px -170px; } 290 | .tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { background-position: -17px -170px; } 291 | .tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { background-position: -34px -170px; } 292 | 293 | .tsd-kind-variable > .tsd-kind-icon:before { background-position: -136px -0px; } 294 | .tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -0px; } 295 | .tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 296 | .tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -0px; } 297 | .tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -0px; } 298 | .tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -0px; } 299 | .tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -0px; } 300 | .tsd-kind-variable.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 301 | .tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -0px; } 302 | .tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -0px; } 303 | .tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 304 | .tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -0px; } 305 | .tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -0px; } 306 | 307 | .tsd-kind-property > .tsd-kind-icon:before { background-position: -136px -0px; } 308 | .tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -0px; } 309 | .tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 310 | .tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -0px; } 311 | .tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -0px; } 312 | .tsd-kind-property.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -0px; } 313 | .tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -0px; } 314 | .tsd-kind-property.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 315 | .tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -0px; } 316 | .tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -0px; } 317 | .tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -0px; } 318 | .tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -0px; } 319 | .tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -0px; } 320 | 321 | .tsd-kind-get-signature > .tsd-kind-icon:before { background-position: -136px -17px; } 322 | .tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -17px; } 323 | .tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -17px; } 324 | .tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -17px; } 325 | .tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -17px; } 326 | .tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -17px; } 327 | .tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -17px; } 328 | .tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -17px; } 329 | .tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -17px; } 330 | .tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -17px; } 331 | .tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -17px; } 332 | .tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -17px; } 333 | .tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -17px; } 334 | 335 | .tsd-kind-set-signature > .tsd-kind-icon:before { background-position: -136px -34px; } 336 | .tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -34px; } 337 | .tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -34px; } 338 | .tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -34px; } 339 | .tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -34px; } 340 | .tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -34px; } 341 | .tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -34px; } 342 | .tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -34px; } 343 | .tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -34px; } 344 | .tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -34px; } 345 | .tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -34px; } 346 | .tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -34px; } 347 | .tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -34px; } 348 | 349 | .tsd-kind-accessor > .tsd-kind-icon:before { background-position: -136px -51px; } 350 | .tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -51px; } 351 | .tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -51px; } 352 | .tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -51px; } 353 | .tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -51px; } 354 | .tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -51px; } 355 | .tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -51px; } 356 | .tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -51px; } 357 | .tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -51px; } 358 | .tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -51px; } 359 | .tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -51px; } 360 | .tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -51px; } 361 | .tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -51px; } 362 | 363 | .tsd-kind-function > .tsd-kind-icon:before { background-position: -136px -68px; } 364 | .tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -68px; } 365 | .tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 366 | .tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -68px; } 367 | .tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -68px; } 368 | .tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -68px; } 369 | .tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -68px; } 370 | .tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 371 | .tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -68px; } 372 | .tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -68px; } 373 | .tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 374 | .tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -68px; } 375 | .tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -68px; } 376 | 377 | .tsd-kind-method > .tsd-kind-icon:before { background-position: -136px -68px; } 378 | .tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -68px; } 379 | .tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 380 | .tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -68px; } 381 | .tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -68px; } 382 | .tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -68px; } 383 | .tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -68px; } 384 | .tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 385 | .tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -68px; } 386 | .tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -68px; } 387 | .tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 388 | .tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -68px; } 389 | .tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -68px; } 390 | 391 | .tsd-kind-call-signature > .tsd-kind-icon:before { background-position: -136px -68px; } 392 | .tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -68px; } 393 | .tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 394 | .tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -68px; } 395 | .tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -68px; } 396 | .tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -68px; } 397 | .tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -68px; } 398 | .tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 399 | .tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -68px; } 400 | .tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -68px; } 401 | .tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -68px; } 402 | .tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -68px; } 403 | .tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -68px; } 404 | 405 | .tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: -136px -85px; } 406 | .tsd-kind-function.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -85px; } 407 | .tsd-kind-function.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 408 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -85px; } 409 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -85px; } 410 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -85px; } 411 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -85px; } 412 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 413 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -85px; } 414 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -85px; } 415 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 416 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -85px; } 417 | .tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -85px; } 418 | 419 | .tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { background-position: -136px -85px; } 420 | .tsd-kind-method.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -85px; } 421 | .tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 422 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -85px; } 423 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -85px; } 424 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -85px; } 425 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -85px; } 426 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 427 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -85px; } 428 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -85px; } 429 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -85px; } 430 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -85px; } 431 | .tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -85px; } 432 | 433 | .tsd-kind-constructor > .tsd-kind-icon:before { background-position: -136px -102px; } 434 | .tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -102px; } 435 | .tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 436 | .tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -102px; } 437 | .tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -102px; } 438 | .tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -102px; } 439 | .tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -102px; } 440 | .tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 441 | .tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -102px; } 442 | .tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -102px; } 443 | .tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 444 | .tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -102px; } 445 | .tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -102px; } 446 | 447 | .tsd-kind-constructor-signature > .tsd-kind-icon:before { background-position: -136px -102px; } 448 | .tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -102px; } 449 | .tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 450 | .tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -102px; } 451 | .tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -102px; } 452 | .tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -102px; } 453 | .tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -102px; } 454 | .tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 455 | .tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -102px; } 456 | .tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -102px; } 457 | .tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -102px; } 458 | .tsd-kind-constructor-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -102px; } 459 | .tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -102px; } 460 | 461 | .tsd-kind-index-signature > .tsd-kind-icon:before { background-position: -136px -119px; } 462 | .tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -119px; } 463 | .tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -119px; } 464 | .tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -119px; } 465 | .tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -119px; } 466 | .tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -119px; } 467 | .tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -119px; } 468 | .tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -119px; } 469 | .tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -119px; } 470 | .tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -119px; } 471 | .tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -119px; } 472 | .tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -119px; } 473 | .tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -119px; } 474 | 475 | .tsd-kind-event > .tsd-kind-icon:before { background-position: -136px -136px; } 476 | .tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -136px; } 477 | .tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -136px; } 478 | .tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -136px; } 479 | .tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -136px; } 480 | .tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -136px; } 481 | .tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -136px; } 482 | .tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -136px; } 483 | .tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -136px; } 484 | .tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -136px; } 485 | .tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -136px; } 486 | .tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -136px; } 487 | .tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -136px; } 488 | 489 | .tsd-is-static > .tsd-kind-icon:before { background-position: -136px -153px; } 490 | .tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -153px; } 491 | .tsd-is-static.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -153px; } 492 | .tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -153px; } 493 | .tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -153px; } 494 | .tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -153px; } 495 | .tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -153px; } 496 | .tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -153px; } 497 | .tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -153px; } 498 | .tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -153px; } 499 | .tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -153px; } 500 | .tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -153px; } 501 | .tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -153px; } 502 | 503 | .tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { background-position: -136px -170px; } 504 | .tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -170px; } 505 | .tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 506 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -170px; } 507 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -170px; } 508 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -170px; } 509 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -170px; } 510 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 511 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -170px; } 512 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -170px; } 513 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 514 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -170px; } 515 | .tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -170px; } 516 | 517 | .tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { background-position: -136px -170px; } 518 | .tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -170px; } 519 | .tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 520 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -170px; } 521 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -170px; } 522 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -170px; } 523 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -170px; } 524 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 525 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -170px; } 526 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -170px; } 527 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 528 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -170px; } 529 | .tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -170px; } 530 | 531 | .tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { background-position: -136px -170px; } 532 | .tsd-is-static.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -170px; } 533 | .tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 534 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -170px; } 535 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -170px; } 536 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -170px; } 537 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -170px; } 538 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 539 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -170px; } 540 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -170px; } 541 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -170px; } 542 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -170px; } 543 | .tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -170px; } 544 | 545 | .tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { background-position: -136px -187px; } 546 | .tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { background-position: -153px -187px; } 547 | .tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -187px; } 548 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { background-position: -51px -187px; } 549 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { background-position: -68px -187px; } 550 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { background-position: -85px -187px; } 551 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { background-position: -102px -187px; } 552 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -187px; } 553 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { background-position: -170px -187px; } 554 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { background-position: -187px -187px; } 555 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { background-position: -119px -187px; } 556 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { background-position: -204px -187px; } 557 | .tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { background-position: -221px -187px; } 558 | 559 | .no-transition { transition: none !important; } 560 | 561 | @-webkit-keyframes fade-in { from { opacity: 0; } 562 | to { opacity: 1; } } 563 | 564 | @keyframes fade-in { from { opacity: 0; } 565 | to { opacity: 1; } } 566 | @-webkit-keyframes fade-out { from { opacity: 1; visibility: visible; } 567 | to { opacity: 0; } } 568 | @keyframes fade-out { from { opacity: 1; visibility: visible; } 569 | to { opacity: 0; } } 570 | @-webkit-keyframes fade-in-delayed { 0% { opacity: 0; } 571 | 33% { opacity: 0; } 572 | 100% { opacity: 1; } } 573 | @keyframes fade-in-delayed { 0% { opacity: 0; } 574 | 33% { opacity: 0; } 575 | 100% { opacity: 1; } } 576 | @-webkit-keyframes fade-out-delayed { 0% { opacity: 1; visibility: visible; } 577 | 66% { opacity: 0; } 578 | 100% { opacity: 0; } } 579 | @keyframes fade-out-delayed { 0% { opacity: 1; visibility: visible; } 580 | 66% { opacity: 0; } 581 | 100% { opacity: 0; } } 582 | @-webkit-keyframes shift-to-left { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); } 583 | to { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } } 584 | @keyframes shift-to-left { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); } 585 | to { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } } 586 | @-webkit-keyframes unshift-to-left { from { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } 587 | to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } 588 | @keyframes unshift-to-left { from { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } 589 | to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } 590 | @-webkit-keyframes pop-in-from-right { from { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } 591 | to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } 592 | @keyframes pop-in-from-right { from { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } 593 | to { -webkit-transform: translate(0, 0); transform: translate(0, 0); } } 594 | @-webkit-keyframes pop-out-to-right { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); visibility: visible; } 595 | to { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } } 596 | @keyframes pop-out-to-right { from { -webkit-transform: translate(0, 0); transform: translate(0, 0); visibility: visible; } 597 | to { -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } } 598 | body { background: #fdfdfd; font-family: "Segoe UI", sans-serif; font-size: 16px; color: #222; } 599 | 600 | a { color: #4da6ff; text-decoration: none; } 601 | a:hover { text-decoration: underline; } 602 | 603 | code, pre { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; padding: 0.2em; margin: 0; font-size: 14px; background-color: rgba(0, 0, 0, 0.04); } 604 | 605 | pre { padding: 10px; } 606 | pre code { padding: 0; font-size: 100%; background-color: transparent; } 607 | 608 | .tsd-typography { line-height: 1.333em; } 609 | .tsd-typography ul { list-style: square; padding: 0 0 0 20px; margin: 0; } 610 | .tsd-typography h4, .tsd-typography .tsd-index-panel h3, .tsd-index-panel .tsd-typography h3, .tsd-typography h5, .tsd-typography h6 { font-size: 1em; margin: 0; } 611 | .tsd-typography h5, .tsd-typography h6 { font-weight: normal; } 612 | .tsd-typography p, .tsd-typography ul, .tsd-typography ol { margin: 1em 0; } 613 | 614 | @media (min-width: 901px) and (max-width: 1024px) { html.default .col-content { width: 72%; } 615 | html.default .col-menu { width: 28%; } 616 | html.default .tsd-navigation { padding-left: 10px; } } 617 | @media (max-width: 900px) { html.default .col-content { float: none; width: 100%; } 618 | html.default .col-menu { position: fixed !important; overflow: auto; -webkit-overflow-scrolling: touch; overflow-scrolling: touch; z-index: 1024; top: 0 !important; bottom: 0 !important; left: auto !important; right: 0 !important; width: 100%; padding: 20px 20px 0 0; max-width: 450px; visibility: hidden; background-color: #fff; -webkit-transform: translate(100%, 0); transform: translate(100%, 0); } 619 | html.default .col-menu > *:last-child { padding-bottom: 20px; } 620 | html.default .overlay { content: ""; display: block; position: fixed; z-index: 1023; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.75); visibility: hidden; } 621 | html.default.to-has-menu .overlay { -webkit-animation: fade-in 0.4s; animation: fade-in 0.4s; } 622 | html.default.to-has-menu header, html.default.to-has-menu footer, html.default.to-has-menu .col-content { -webkit-animation: shift-to-left 0.4s; animation: shift-to-left 0.4s; } 623 | html.default.to-has-menu .col-menu { -webkit-animation: pop-in-from-right 0.4s; animation: pop-in-from-right 0.4s; } 624 | html.default.from-has-menu .overlay { -webkit-animation: fade-out 0.4s; animation: fade-out 0.4s; } 625 | html.default.from-has-menu header, html.default.from-has-menu footer, html.default.from-has-menu .col-content { -webkit-animation: unshift-to-left 0.4s; animation: unshift-to-left 0.4s; } 626 | html.default.from-has-menu .col-menu { -webkit-animation: pop-out-to-right 0.4s; animation: pop-out-to-right 0.4s; } 627 | html.default.has-menu body { overflow: hidden; } 628 | html.default.has-menu .overlay { visibility: visible; } 629 | html.default.has-menu header, html.default.has-menu footer, html.default.has-menu .col-content { -webkit-transform: translate(-25%, 0); transform: translate(-25%, 0); } 630 | html.default.has-menu .col-menu { visibility: visible; -webkit-transform: translate(0, 0); transform: translate(0, 0); } } 631 | 632 | .tsd-page-title { padding: 70px 0 20px 0; margin: 0 0 40px 0; background: #fff; box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); } 633 | .tsd-page-title h1 { margin: 0; } 634 | 635 | .tsd-breadcrumb { margin: 0; padding: 0; color: #808080; } 636 | .tsd-breadcrumb a { color: #808080; text-decoration: none; } 637 | .tsd-breadcrumb a:hover { text-decoration: underline; } 638 | .tsd-breadcrumb li { display: inline; } 639 | .tsd-breadcrumb li:after { content: " / "; } 640 | 641 | html.minimal .container { margin: 0; } 642 | html.minimal .container-main { padding-top: 50px; padding-bottom: 0; } 643 | html.minimal .content-wrap { padding-left: 300px; } 644 | html.minimal .tsd-navigation { position: fixed !important; overflow: auto; -webkit-overflow-scrolling: touch; overflow-scrolling: touch; box-sizing: border-box; z-index: 1; left: 0; top: 40px; bottom: 0; width: 300px; padding: 20px; margin: 0; } 645 | html.minimal .tsd-member .tsd-member { margin-left: 0; } 646 | html.minimal .tsd-page-toolbar { position: fixed; z-index: 2; } 647 | html.minimal #tsd-filter .tsd-filter-group { right: 0; -webkit-transform: none; transform: none; } 648 | html.minimal footer { background-color: transparent; } 649 | html.minimal footer .container { padding: 0; } 650 | html.minimal .tsd-generator { padding: 0; } 651 | @media (max-width: 900px) { html.minimal .tsd-navigation { display: none; } 652 | html.minimal .content-wrap { padding-left: 0; } } 653 | 654 | dl.tsd-comment-tags { overflow: hidden; } 655 | dl.tsd-comment-tags dt { clear: both; float: left; padding: 1px 5px; margin: 0 10px 0 0; border-radius: 4px; border: 1px solid #808080; color: #808080; font-size: 0.8em; font-weight: normal; } 656 | dl.tsd-comment-tags dd { margin: 0 0 10px 0; } 657 | dl.tsd-comment-tags p { margin: 0; } 658 | 659 | .tsd-panel.tsd-comment .lead { font-size: 1.1em; line-height: 1.333em; margin-bottom: 2em; } 660 | .tsd-panel.tsd-comment .lead:last-child { margin-bottom: 0; } 661 | 662 | .toggle-protected .tsd-is-private { display: none; } 663 | 664 | .toggle-public .tsd-is-private, .toggle-public .tsd-is-protected, .toggle-public .tsd-is-private-protected { display: none; } 665 | 666 | .toggle-inherited .tsd-is-inherited { display: none; } 667 | 668 | .toggle-only-exported .tsd-is-not-exported { display: none; } 669 | 670 | .toggle-externals .tsd-is-external { display: none; } 671 | 672 | #tsd-filter { position: relative; display: inline-block; height: 40px; vertical-align: bottom; } 673 | .no-filter #tsd-filter { display: none; } 674 | #tsd-filter .tsd-filter-group { display: inline-block; height: 40px; vertical-align: bottom; white-space: nowrap; } 675 | #tsd-filter input { display: none; } 676 | @media (max-width: 900px) { #tsd-filter .tsd-filter-group { display: block; position: absolute; top: 40px; right: 20px; height: auto; background-color: #fff; visibility: hidden; -webkit-transform: translate(50%, 0); transform: translate(50%, 0); box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); } 677 | .has-options #tsd-filter .tsd-filter-group { visibility: visible; } 678 | .to-has-options #tsd-filter .tsd-filter-group { -webkit-animation: fade-in 0.2s; animation: fade-in 0.2s; } 679 | .from-has-options #tsd-filter .tsd-filter-group { -webkit-animation: fade-out 0.2s; animation: fade-out 0.2s; } 680 | #tsd-filter label, #tsd-filter .tsd-select { display: block; padding-right: 20px; } } 681 | 682 | footer { border-top: 1px solid #eee; background-color: #fff; } 683 | footer.with-border-bottom { border-bottom: 1px solid #eee; } 684 | footer .tsd-legend-group { font-size: 0; } 685 | footer .tsd-legend { display: inline-block; width: 25%; padding: 0; font-size: 16px; list-style: none; line-height: 1.333em; vertical-align: top; } 686 | @media (max-width: 900px) { footer .tsd-legend { width: 50%; } } 687 | 688 | .tsd-hierarchy { list-style: square; padding: 0 0 0 20px; margin: 0; } 689 | .tsd-hierarchy .target { font-weight: bold; } 690 | 691 | .tsd-index-panel .tsd-index-content { margin-bottom: -30px !important; } 692 | .tsd-index-panel .tsd-index-section { margin-bottom: 30px !important; } 693 | .tsd-index-panel h3 { margin: 0 -20px 10px -20px; padding: 0 20px 10px 20px; border-bottom: 1px solid #eee; } 694 | .tsd-index-panel ul.tsd-index-list { -webkit-column-count: 3; -moz-column-count: 3; -ms-column-count: 3; -o-column-count: 3; column-count: 3; -webkit-column-gap: 20px; -moz-column-gap: 20px; -ms-column-gap: 20px; -o-column-gap: 20px; column-gap: 20px; padding: 0; list-style: none; line-height: 1.333em; } 695 | @media (max-width: 900px) { .tsd-index-panel ul.tsd-index-list { -webkit-column-count: 1; -moz-column-count: 1; -ms-column-count: 1; -o-column-count: 1; column-count: 1; } } 696 | @media (min-width: 901px) and (max-width: 1024px) { .tsd-index-panel ul.tsd-index-list { -webkit-column-count: 2; -moz-column-count: 2; -ms-column-count: 2; -o-column-count: 2; column-count: 2; } } 697 | .tsd-index-panel ul.tsd-index-list li { -webkit-column-break-inside: avoid; -moz-column-break-inside: avoid; -ms-column-break-inside: avoid; -o-column-break-inside: avoid; column-break-inside: avoid; -webkit-page-break-inside: avoid; -moz-page-break-inside: avoid; -ms-page-break-inside: avoid; -o-page-break-inside: avoid; page-break-inside: avoid; } 698 | .tsd-index-panel a, .tsd-index-panel .tsd-parent-kind-module a { color: #9600ff; } 699 | .tsd-index-panel .tsd-parent-kind-interface a { color: #7da01f; } 700 | .tsd-index-panel .tsd-parent-kind-enum a { color: #cc9900; } 701 | .tsd-index-panel .tsd-parent-kind-class a { color: #4da6ff; } 702 | .tsd-index-panel .tsd-kind-module a { color: #9600ff; } 703 | .tsd-index-panel .tsd-kind-interface a { color: #7da01f; } 704 | .tsd-index-panel .tsd-kind-enum a { color: #cc9900; } 705 | .tsd-index-panel .tsd-kind-class a { color: #4da6ff; } 706 | .tsd-index-panel .tsd-is-private a { color: #808080; } 707 | 708 | .tsd-flag { display: inline-block; padding: 1px 5px; border-radius: 4px; color: #fff; background-color: #808080; text-indent: 0; font-size: 14px; font-weight: normal; } 709 | 710 | .tsd-anchor { position: absolute; top: -100px; } 711 | 712 | .tsd-member { position: relative; } 713 | .tsd-member .tsd-anchor + h3 { margin-top: 0; margin-bottom: 0; border-bottom: none; } 714 | 715 | .tsd-navigation { padding: 0 0 0 40px; } 716 | .tsd-navigation a { display: block; padding-top: 2px; padding-bottom: 2px; border-left: 2px solid transparent; color: #222; text-decoration: none; transition: border-left-color 0.1s; } 717 | .tsd-navigation a:hover { text-decoration: underline; } 718 | .tsd-navigation ul { margin: 0; padding: 0; list-style: none; } 719 | .tsd-navigation li { padding: 0; } 720 | 721 | .tsd-navigation.primary { padding-bottom: 40px; } 722 | .tsd-navigation.primary a { display: block; padding-top: 6px; padding-bottom: 6px; } 723 | .tsd-navigation.primary ul li a { padding-left: 5px; } 724 | .tsd-navigation.primary ul li li a { padding-left: 25px; } 725 | .tsd-navigation.primary ul li li li a { padding-left: 45px; } 726 | .tsd-navigation.primary ul li li li li a { padding-left: 65px; } 727 | .tsd-navigation.primary ul li li li li li a { padding-left: 85px; } 728 | .tsd-navigation.primary ul li li li li li li a { padding-left: 105px; } 729 | .tsd-navigation.primary > ul { border-bottom: 1px solid #eee; } 730 | .tsd-navigation.primary li { border-top: 1px solid #eee; } 731 | .tsd-navigation.primary li.current > a { font-weight: bold; } 732 | .tsd-navigation.primary li.label span { display: block; padding: 20px 0 6px 5px; color: #808080; } 733 | .tsd-navigation.primary li.globals + li > span, .tsd-navigation.primary li.globals + li > a { padding-top: 20px; } 734 | 735 | .tsd-navigation.secondary ul { transition: opacity 0.2s; } 736 | .tsd-navigation.secondary ul li a { padding-left: 25px; } 737 | .tsd-navigation.secondary ul li li a { padding-left: 45px; } 738 | .tsd-navigation.secondary ul li li li a { padding-left: 65px; } 739 | .tsd-navigation.secondary ul li li li li a { padding-left: 85px; } 740 | .tsd-navigation.secondary ul li li li li li a { padding-left: 105px; } 741 | .tsd-navigation.secondary ul li li li li li li a { padding-left: 125px; } 742 | .tsd-navigation.secondary ul.current a { border-left-color: #eee; } 743 | .tsd-navigation.secondary li.focus > a, .tsd-navigation.secondary ul.current li.focus > a { border-left-color: #000; } 744 | .tsd-navigation.secondary li.current { margin-top: 20px; margin-bottom: 20px; border-left-color: #eee; } 745 | .tsd-navigation.secondary li.current > a { font-weight: bold; } 746 | 747 | @media (min-width: 901px) { .menu-sticky-wrap { position: static; } 748 | .no-csspositionsticky .menu-sticky-wrap.sticky { position: fixed; } 749 | .no-csspositionsticky .menu-sticky-wrap.sticky-current { position: fixed; } 750 | .no-csspositionsticky .menu-sticky-wrap.sticky-current ul.before-current, .no-csspositionsticky .menu-sticky-wrap.sticky-current ul.after-current { opacity: 0; } 751 | .no-csspositionsticky .menu-sticky-wrap.sticky-bottom { position: absolute; top: auto !important; left: auto !important; bottom: 0; right: 0; } 752 | .csspositionsticky .menu-sticky-wrap.sticky { position: -webkit-sticky; position: sticky; } 753 | .csspositionsticky .menu-sticky-wrap.sticky-current { position: -webkit-sticky; position: sticky; } } 754 | 755 | .tsd-panel { margin: 20px 0; padding: 20px; background-color: #fff; box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); } 756 | .tsd-panel:empty { display: none; } 757 | .tsd-panel > h1, .tsd-panel > h2, .tsd-panel > h3 { margin: 1.5em -20px 10px -20px; padding: 0 20px 10px 20px; border-bottom: 1px solid #eee; } 758 | .tsd-panel > h1.tsd-before-signature, .tsd-panel > h2.tsd-before-signature, .tsd-panel > h3.tsd-before-signature { margin-bottom: 0; border-bottom: 0; } 759 | .tsd-panel table { display: block; width: 100%; overflow: auto; margin-top: 10px; word-break: normal; word-break: keep-all; } 760 | .tsd-panel table th { font-weight: bold; } 761 | .tsd-panel table th, .tsd-panel table td { padding: 6px 13px; border: 1px solid #ddd; } 762 | .tsd-panel table tr { background-color: #fff; border-top: 1px solid #ccc; } 763 | .tsd-panel table tr:nth-child(2n) { background-color: #f8f8f8; } 764 | 765 | .tsd-panel-group { margin: 60px 0; } 766 | .tsd-panel-group > h1, .tsd-panel-group > h2, .tsd-panel-group > h3 { padding-left: 20px; padding-right: 20px; } 767 | 768 | #tsd-search { transition: background-color 0.2s; } 769 | #tsd-search .title { position: relative; z-index: 2; } 770 | #tsd-search .field { position: absolute; left: 0; top: 0; right: 40px; height: 40px; } 771 | #tsd-search .field input { box-sizing: border-box; position: relative; top: -50px; z-index: 1; width: 100%; padding: 0 10px; opacity: 0; outline: 0; border: 0; background: transparent; color: #222; } 772 | #tsd-search .field label { position: absolute; overflow: hidden; right: -40px; } 773 | #tsd-search .field input, #tsd-search .title { transition: opacity 0.2s; } 774 | #tsd-search .results { position: absolute; visibility: hidden; top: 40px; width: 100%; margin: 0; padding: 0; list-style: none; box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); } 775 | #tsd-search .results li { padding: 0 10px; background-color: #fdfdfd; } 776 | #tsd-search .results li:nth-child(even) { background-color: #fff; } 777 | #tsd-search .results li.state { display: none; } 778 | #tsd-search .results li.current, #tsd-search .results li:hover { background-color: #eee; } 779 | #tsd-search .results a { display: block; } 780 | #tsd-search .results a:before { top: 10px; } 781 | #tsd-search .results span.parent { color: #808080; font-weight: normal; } 782 | #tsd-search.has-focus { background-color: #eee; } 783 | #tsd-search.has-focus .field input { top: 0; opacity: 1; } 784 | #tsd-search.has-focus .title { z-index: 0; opacity: 0; } 785 | #tsd-search.has-focus .results { visibility: visible; } 786 | #tsd-search.loading .results li.state.loading { display: block; } 787 | #tsd-search.failure .results li.state.failure { display: block; } 788 | 789 | .tsd-signature { margin: 0 0 1em 0; padding: 10px; border: 1px solid #eee; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; } 790 | .tsd-signature.tsd-kind-icon { padding-left: 30px; } 791 | .tsd-signature.tsd-kind-icon:before { top: 10px; left: 10px; } 792 | .tsd-panel > .tsd-signature { margin-left: -20px; margin-right: -20px; border-width: 1px 0; } 793 | .tsd-panel > .tsd-signature.tsd-kind-icon { padding-left: 40px; } 794 | .tsd-panel > .tsd-signature.tsd-kind-icon:before { left: 20px; } 795 | 796 | .tsd-signature-symbol { color: #808080; font-weight: normal; } 797 | 798 | .tsd-signature-type { font-style: italic; font-weight: normal; } 799 | 800 | .tsd-signatures { padding: 0; margin: 0 0 1em 0; border: 1px solid #eee; } 801 | .tsd-signatures .tsd-signature { margin: 0; border-width: 1px 0 0 0; transition: background-color 0.1s; } 802 | .tsd-signatures .tsd-signature:first-child { border-top-width: 0; } 803 | .tsd-signatures .tsd-signature.current { background-color: #eee; } 804 | .tsd-signatures.active > .tsd-signature { cursor: pointer; } 805 | .tsd-panel > .tsd-signatures { margin-left: -20px; margin-right: -20px; border-width: 1px 0; } 806 | .tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { padding-left: 40px; } 807 | .tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { left: 20px; } 808 | .tsd-panel > a.anchor + .tsd-signatures { border-top-width: 0; margin-top: -20px; } 809 | 810 | ul.tsd-descriptions { position: relative; overflow: hidden; transition: height 0.3s; padding: 0; list-style: none; } 811 | ul.tsd-descriptions.active > .tsd-description { display: none; } 812 | ul.tsd-descriptions.active > .tsd-description.current { display: block; } 813 | ul.tsd-descriptions.active > .tsd-description.fade-in { -webkit-animation: fade-in-delayed 0.3s; animation: fade-in-delayed 0.3s; } 814 | ul.tsd-descriptions.active > .tsd-description.fade-out { -webkit-animation: fade-out-delayed 0.3s; animation: fade-out-delayed 0.3s; position: absolute; display: block; top: 0; left: 0; right: 0; opacity: 0; visibility: hidden; } 815 | ul.tsd-descriptions h4, ul.tsd-descriptions .tsd-index-panel h3, .tsd-index-panel ul.tsd-descriptions h3 { font-size: 16px; margin: 1em 0 0.5em 0; } 816 | 817 | ul.tsd-parameters, ul.tsd-type-parameters { list-style: square; margin: 0; padding-left: 20px; } 818 | ul.tsd-parameters > li.tsd-parameter-siganture, ul.tsd-type-parameters > li.tsd-parameter-siganture { list-style: none; margin-left: -20px; } 819 | ul.tsd-parameters h5, ul.tsd-type-parameters h5 { font-size: 16px; margin: 1em 0 0.5em 0; } 820 | ul.tsd-parameters .tsd-comment, ul.tsd-type-parameters .tsd-comment { margin-top: -0.5em; } 821 | 822 | .tsd-sources { font-size: 14px; color: #808080; margin: 0 0 1em 0; } 823 | .tsd-sources a { color: #808080; text-decoration: underline; } 824 | .tsd-sources ul, .tsd-sources p { margin: 0 !important; } 825 | .tsd-sources ul { list-style: none; padding: 0; } 826 | 827 | .tsd-page-toolbar { position: absolute; z-index: 1; top: 0; left: 0; width: 100%; height: 40px; color: #333; background: #fff; border-bottom: 1px solid #eee; } 828 | .tsd-page-toolbar a { color: #333; text-decoration: none; } 829 | .tsd-page-toolbar a.title { font-weight: bold; } 830 | .tsd-page-toolbar a.title:hover { text-decoration: underline; } 831 | .tsd-page-toolbar .table-wrap { display: table; width: 100%; height: 40px; } 832 | .tsd-page-toolbar .table-cell { display: table-cell; position: relative; white-space: nowrap; line-height: 40px; } 833 | .tsd-page-toolbar .table-cell:first-child { width: 100%; } 834 | 835 | .tsd-widget:before, .tsd-select .tsd-select-label:before, .tsd-select .tsd-select-list li:before { content: ""; display: inline-block; width: 40px; height: 40px; margin: 0 -8px 0 0; background-image: url(../images/widgets.png); background-repeat: no-repeat; text-indent: -1024px; vertical-align: bottom; } 836 | @media (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { .tsd-widget:before, .tsd-select .tsd-select-label:before, .tsd-select .tsd-select-list li:before { background-image: url(../images/widgets@2x.png); background-size: 320px 40px; } } 837 | 838 | .tsd-widget { display: inline-block; overflow: hidden; opacity: 0.6; height: 40px; transition: opacity 0.1s, background-color 0.2s; vertical-align: bottom; cursor: pointer; } 839 | .tsd-widget:hover { opacity: 0.8; } 840 | .tsd-widget.active { opacity: 1; background-color: #eee; } 841 | .tsd-widget.no-caption { width: 40px; } 842 | .tsd-widget.no-caption:before { margin: 0; } 843 | .tsd-widget.search:before { background-position: 0 0; } 844 | .tsd-widget.menu:before { background-position: -40px 0; } 845 | .tsd-widget.options:before { background-position: -80px 0; } 846 | .tsd-widget.options, .tsd-widget.menu { display: none; } 847 | @media (max-width: 900px) { .tsd-widget.options, .tsd-widget.menu { display: inline-block; } } 848 | input[type=checkbox] + .tsd-widget:before { background-position: -120px 0; } 849 | input[type=checkbox]:checked + .tsd-widget:before { background-position: -160px 0; } 850 | 851 | .tsd-select { position: relative; display: inline-block; height: 40px; transition: opacity 0.1s, background-color 0.2s; vertical-align: bottom; cursor: pointer; } 852 | .tsd-select .tsd-select-label { opacity: 0.6; transition: opacity 0.2s; } 853 | .tsd-select .tsd-select-label:before { background-position: -240px 0; } 854 | .tsd-select.active .tsd-select-label { opacity: 0.8; } 855 | .tsd-select.active .tsd-select-list { visibility: visible; opacity: 1; transition-delay: 0s; } 856 | .tsd-select .tsd-select-list { position: absolute; visibility: hidden; top: 40px; left: 0; margin: 0; padding: 0; opacity: 0; list-style: none; box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); transition: visibility 0s 0.2s, opacity 0.2s; } 857 | .tsd-select .tsd-select-list li { padding: 0 20px 0 0; background-color: #fdfdfd; } 858 | .tsd-select .tsd-select-list li:before { background-position: 40px 0; } 859 | .tsd-select .tsd-select-list li:nth-child(even) { background-color: #fff; } 860 | .tsd-select .tsd-select-list li:hover { background-color: #eee; } 861 | .tsd-select .tsd-select-list li.selected:before { background-position: -200px 0; } 862 | @media (max-width: 900px) { .tsd-select .tsd-select-list { top: 0; left: auto; right: 100%; margin-right: -5px; } 863 | .tsd-select .tsd-select-label:before { background-position: -280px 0; } } 864 | 865 | img { max-width: 100%; } 866 | --------------------------------------------------------------------------------