├── README.md ├── backend-database └── serverless.yml ├── backend-restapi ├── index.js ├── package-lock.json ├── package.json ├── serverless.test.yml └── serverless.yml ├── backend-tasks ├── handler.js ├── package-lock.json ├── package.json └── serverless.yml └── frontend ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── index.html └── manifest.json ├── serverless.yml └── src ├── DemoApp.css ├── DemoApp.js ├── images └── logo.png ├── index.css └── index.js /README.md: -------------------------------------------------------------------------------- 1 | # Serverless Framework - Workshop 2 | 3 | This includes a full-stack example application as well as a walkthrough, to help others learn how to *build*, *test* and *monitor* apps with the Serverless Framework. 4 | 5 | You will be building a landing page with an email submission form: 6 | 7 | ![Example Preview](https://s3.amazonaws.com/assets.github.serverless/workshop/serverless-framework-workshop-example.png) 8 | 9 | The landing page also has a Utility Panel, which contains ways to call your API, cause it to behave strangely, or even crash it. The purpose of this is to fill the [Serverless Framework Dashboard](https://dashboard.serverless.com) with data and alerts, for demonstration purposes: 10 | 11 | ![Example Preview 2](https://s3.amazonaws.com/assets.github.serverless/workshop/serverless-framework-workshop-example-utils.png) 12 | 13 |
14 | 15 | ## Prerequisites 16 | 17 | These are the items you will need for the Workshop. 18 | 19 | * **Amazon Web Services Accounts –** Each developer must have their own AWS account which they can freely deploy into and treat as a general sandbox. Sharing accounts can and most often will result in collision of infrastructure resource names as well as API throttle limits on provisioning of infrastructure resources. Every workshop we've ever done where the participants shared accounts has resulted in those problems mentioned, so please ensure your developers can have their own accounts, so we can focus our time on building and operating serverless applications. (Keep in mind these developer accounts are for sandbox use only. In the workshop, we will discuss how to control and govern access to the AWS accounts that run your mission critical infrastructure and environments.) Sign up for an AWS account here: https://aws.amazon.com/ 20 | 21 | * **Amazon Web Services Account Credentials** – Each developer must have Access Keys to their own AWS account with Admin Access. These Access Keys must be saved on the developer's machine. The Serverless Framework will use these to provision resources on the account. You can learn how to create these Access Keys here: https://serverless.com/framework/docs/providers/aws/guide/credentials/ 22 | 23 | * **Node.js** – Each developer must have the current LTS version of Node.js installed on their machine. You can find it here: https://nodejs.org/en/download/ 24 | 25 | * **Serverless Framework** – Each developer must have the current LTS version of Node.js installed on their machine. You can learn how to install the Serverless Framework here: https://serverless.com/framework/docs/providers/aws/guide/installation/ 26 | 27 |
28 | 29 | ## Setup 30 | 31 | Clone this repository 32 | 33 | ```text 34 | $ git clone https://www.github.com/serverless/workshop 35 | ``` 36 | 37 | In the repository, there are a few folders, each containing part of a serverless fullstack application demo. 38 | 39 | The demo use-case is a simple form for collecting and saving email signups. The demo includes a frontend built with React (via Create React App), a REST API containing 1 endpoint built on AWS Lambda and AWS Cloudfront, a DynamoDB database table, as well as a scheduled task. 40 | 41 | The frontend also includes a "Demo Utilities" panel which includes a way to send multiple requests to the backend as well as different buttons that will crash the backend, cause it to timeout, cause it to run for an unusually long duration. The purpose of these is to fill the Serverless Dashboard with data on invocations and errors, as well as to see how the Framework's auto-alerting features work. 42 | 43 | **Note:** The `backend-tasks` directory containing the scheduled task is an optional part. It contains an AWS Lambda that runs on a function and calls your back-end every 5 minutes, and once a day causes the function to generate different errors and alerts so you can see what they look like in the Serverless Dashboard. 44 | 45 | --- 46 | 47 | In `/backend-restapi` install npm dependencies. 48 | 49 | ```text 50 | $ npm i 51 | ``` 52 | 53 | --- 54 | 55 | In `/frontend` install npm dependencies. 56 | 57 | ```text 58 | $ npm i 59 | ``` 60 | 61 | --- 62 | 63 | The front-end application is a React application. Run `npm run build` to build the front-end application so that it's ready to deploy. 64 | 65 | ```text 66 | $ npm run build 67 | ``` 68 | 69 | The front-end application is a React application. Run `npm run start` to run the front-end application locally. 70 | 71 | ```text 72 | $ npm run start 73 | ``` 74 | 75 | --- 76 | 77 | In `/frontend` run `login` 78 | 79 | ```text 80 | $ serverless login 81 | ``` 82 | 83 | Login or register for Serverless Framework. Verify your email if you are just signing up for the first time. 84 | 85 | Make sure you create a `tenant` and then an `app`. 86 | 87 | --- 88 | 89 | In `/database/serverless.yml`, `/backend-restapi/serverless.yml` & `/frontend/serverless.yml` change the following... 90 | 91 | ```yaml 92 | tenant: mytenant # Put your Tenant name here from your Serverless Framework Enterprise account. 93 | app: myapp # put your App name here from your Serverless Framework Enterprise account. 94 | service: myservice # Customize your Service name 95 | ``` 96 | 97 | In `/frontend/serverless.yml` change the bucket name to be universally unique, since all AWS S3 buckets must have unique names. 98 | 99 | ```yaml 100 | custom: 101 | client: 102 | bucketName: myWebsiteBucket # put a universally unique bucket name here 103 | ``` 104 | 105 |
106 | 107 | ## Deployment 108 | 109 | Note: You may need to login twice if you registered for the first time and just verified your email address. 110 | 111 | In `/database` run `deploy` to deploy the backend database. 112 | 113 | ```text 114 | $ serverless deploy 115 | ``` 116 | 117 | You will need to deploy this first in order for the outputs to be available to `backend-restapi`. 118 | --- 119 | 120 | In `/backend-api` run `deploy` to deploy the backend code. 121 | 122 | ```text 123 | $ serverless deploy 124 | ``` 125 | 126 | Copy the URL of the function that is listed after successful deploy. 127 | 128 | --- 129 | 130 | In `/frontend` run `deploy` to deploy the frontend service to Serverless Framework. 131 | 132 | ```text 133 | $ serverless deploy 134 | ``` 135 | 136 | --- 137 | 138 | In `/frontend` run `client deploy` to deploy the website via the [Serverless Finch Plugin](https://github.com/fernando-mc/serverless-finch). Make sure you ran the build command first, in the step above. 139 | 140 | ```text 141 | $ serverless client deploy 142 | ``` 143 | 144 | After you deploy the front-end, go to the live website URL which is returned to you after you deploy with `serverless-finch`, click on `Demo Utilities` and add the API URL in the side panel. This is given to you after successful deploy of the `/functions` Service. Run `serverless info` in the `/functions` Service to see your API endpoint at any time. 145 | 146 | --- 147 | 148 | **See Everything In The Dashboard** 149 | 150 | View everything that was just deployed in the dashboard - https://dashboard.serverless.com 151 | 152 | Test the application by entering some information into the submission form. Review the Developer Tools and inspect the Network request. 153 | 154 | Check out the Serverless Framework Dashboard to see the invocation. The Dashboard link should appear in your `/backend-restapi` Service after deployment. Or, just go to [https://dashboard.serverless.com](https://dashboard.serverless.com) 155 | 156 |
157 | 158 | ## Development 159 | 160 | In `/backend-restapi`, check to see what has been deployed. 161 | 162 | ```text 163 | $ sls info 164 | ``` 165 | 166 | --- 167 | 168 | Here are some handy ways to develop and test your Serverless Application. 169 | 170 | In `/backend-restapi`, invoke the live function via this command: 171 | 172 | ```text 173 | $ sls invoke -f formSubmit --data '{"body":{"name":"jeff","email":"jeff@lebowski"}}' 174 | ``` 175 | 176 | --- 177 | 178 | In `/backend-restapi`, invoke the function locally. 179 | 180 | ```text 181 | $ sls invoke local -f formSubmit --data '{"body":{"name":"jeff2","email":"jeff@lebowski2"}}' 182 | ``` 183 | 184 | --- 185 | 186 | In `/backend-restapi`, add a log statement to the beginning of your function. 187 | 188 | ```javascript 189 | console.log('hello world') 190 | ``` 191 | 192 | Then run this command to deploy only your function and not trigger a CloudFormation update. This is a much faster way to deploy. 193 | 194 | ```text 195 | $ sls deploy function -f formSubmit 196 | ``` 197 | 198 | --- 199 | 200 | In `/backend-restapi`, invoke the live function, but also pass in the logs flag. 201 | 202 | ```text 203 | $ sls invoke -f formSubmit --data '{"body":{"name":"jeff3","email":"jeff@lebowski3"}}' -l 204 | ``` 205 | 206 | You should see the logs from Cloudwatch come with the response. 207 | 208 | --- 209 | 210 | In `/backend-restapi`, open up a new CLI session and run this command to stream logs into your CLI. 211 | 212 | ```text 213 | $ sls logs -f formSubmit -t 214 | ``` 215 | 216 | Call the function again to see logs stream in: 217 | 218 | ```text 219 | $ sls invoke -f formSubmit --data '{"body":{"name":"jeff4","email":"jeff@lebowski4"}}' -l 220 | ``` 221 | 222 | The logs should stream in. 223 | 224 | --- 225 | 226 | In `/backend-restapi`, remove the log statement and run a full deploy again. 227 | 228 | ```text 229 | $ sls deploy --force 230 | ``` 231 | 232 | (Use `--force` in case it tries to skip deployment because it hasn't detected a change.) 233 | 234 | --- 235 | 236 | In `/backend-restapi`, list recent deployments. 237 | 238 | ```text 239 | $ sls deploy list 240 | ``` 241 | 242 | Timestamps are used to identify deployments. The Framework saves old CloudFormation templates for you. You can use them to rollback. This is great if you get into trouble. 243 | 244 | Alternatively, you can also see recent deployments in the Serverless Dashboard. 245 | 246 | ```text 247 | $ sls rollback -t 1476790110568 248 | ``` 249 | 250 |
251 | 252 | ## Operations 253 | 254 | ### Deployment Difference 255 | 256 | Add `environment` variable `foo:bar` in serverless.yml and redeploy. Review the change in the deployment record in the dashboard. 257 | 258 | See the dashed lines on the charts in the Dashboard indicating deployments. 259 | 260 | ### Multiple Requests 261 | 262 | Use the Demo Utils to send multiple requests. 263 | 264 | See them in the Dashboard. 265 | 266 | ### Charts: Invocations & Errors 267 | 268 | Click on the invocations and errors charts 269 | 270 | ### Alert: Generate A Function Error 271 | 272 | ### Alert: Approaching Timeout Error 273 | 274 | ### Alert: Timeout Error 275 | 276 | ### Alert: Unusual Error Rate 277 | 278 | ### Invocation Explorer 279 | 280 |
281 | 282 | ## Stage Setup 283 | 284 | ### Profile 285 | 286 | Within Serverless Framework Enterprise, you can set Stages for each Application, which all of its Services can use. 287 | 288 | In each Stage, you can set Secrets (sensitive information, like keys), Safeguards (policies) and Notification settings for all Services. 289 | 290 | In (https://dashboard.serverless.com)[https://dashboard.serverless.com], create a `dev`, `qa` and `prod` Stage in your Application. 291 | 292 | --- 293 | 294 | In (https://dashboard.serverless.com)[https://dashboard.serverless.com], create a Profile for development called `profile-dev` and associate it with your Application's `dev` stage. 295 | 296 | --- 297 | 298 | ### Secrets 299 | 300 | In (https://dashboard.serverless.com)[https://dashboard.serverless.com], go to your Profile for development called `profile-dev` and create a Secret called `foo`. 301 | 302 | In `/backend-restapi`, put the Secret in the environment variables of the `formSubmit` functions, like this: 303 | 304 | ```yaml 305 | provider: 306 | name: aws 307 | runtime: nodejs8.10 308 | region: us-east-1 309 | environment: 310 | foo: ${secret:foo} 311 | ``` 312 | 313 | This changes across stages automatically. Deploy this. 314 | 315 | View the deployment record in Serverless Framework. 316 | 317 | ### Notifications 318 | 319 | --- 320 | 321 | In (https://dashboard.serverless.com)[https://dashboard.serverless.com], go to your Profile for development called `profile-dev` and add a Safeguard for `allowed-regions` 322 | 323 | In `/backend-restapi`, run a full deployment and look at the Safegaurds outputs. 324 | 325 | --- 326 | 327 | ### Safeguards 328 | 329 | 330 | # Q&A 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 |
347 | 348 | ## Testing 349 | 350 | In `/backend-restapi`, run the test command. 351 | 352 | ```text 353 | $ sls test 354 | ``` 355 | 356 | This uses `serverless.test.yml` to test the live cloud deployment and should return a successful response. 357 | 358 | --- 359 | 360 | Here is what a common configuration of Serverless Framework looks like in CI/CD. Source is here: (CI/CD Workflow For Serverless Apps with CircleCI)[https://serverless.com/blog/ci-cd-workflow-serverless-apps-with-circleci/] 361 | 362 | ```yaml 363 | jobs: 364 | build: 365 | ... 366 | 367 | steps: 368 | - checkout 369 | 370 | # Download and cache dependencies 371 | - restore_cache: 372 | keys: 373 | - dependencies-cache-{{ checksum "package.json" }} 374 | # fallback to using the latest cache if no exact match is found 375 | - dependencies-cache 376 | 377 | - run: 378 | name: Install Serverless CLI and dependencies 379 | command: | 380 | sudo npm i -g serverless 381 | npm install 382 | 383 | - run: 384 | name: Run tests with code coverage 385 | command: npm test --coverage 386 | 387 | - run: 388 | name: Deploy application 389 | command: sls deploy -v --stage qa # Add stage and -v flag to show CloudFormation activity 390 | 391 | - run: 392 | name: Deploy application 393 | command: sls test 394 | 395 | - save_cache: 396 | paths: 397 | - node_modules 398 | key: dependencies-cache-{{ checksum "package.json" }} 399 | ``` 400 | -------------------------------------------------------------------------------- /backend-database/serverless.yml: -------------------------------------------------------------------------------- 1 | org: ac360 # Enter your tenant name here 2 | app: demos # Enter your application name here 3 | service: fullstack-database 4 | 5 | provider: 6 | name: aws 7 | region: us-east-1 8 | 9 | custom: # Centralize variables here 10 | stage: ${opt:stage, self:provider.stage} 11 | database_submissions_name: submissions-${self:custom.stage} 12 | database_submissions_region: submissions-${self:provider.region} 13 | 14 | resources: 15 | Resources: 16 | Submissions: 17 | Type: 'AWS::DynamoDB::Table' 18 | DeletionPolicy: Retain 19 | Properties: 20 | AttributeDefinitions: 21 | - AttributeName: email 22 | AttributeType: S 23 | KeySchema: 24 | - AttributeName: email 25 | KeyType: HASH 26 | ProvisionedThroughput: 27 | ReadCapacityUnits: 1 28 | WriteCapacityUnits: 1 29 | TableName: ${self:custom.database_submissions_name} 30 | 31 | outputs: 32 | database_submissions_name: ${self:custom.database_submissions_name} 33 | database_submissions_region: ${self:custom.database_submissions_region} 34 | -------------------------------------------------------------------------------- /backend-restapi/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Form Submit 3 | */ 4 | 5 | const AWS = require('aws-sdk') 6 | const dynamoDb = new AWS.DynamoDB.DocumentClient() 7 | 8 | const submit = async (event, context) => { 9 | 10 | // If this query param is submitted, the function crashes... 11 | if (event && event['queryStringParameters'] && event['queryStringParameters']['error']) { 12 | crash() 13 | } 14 | 15 | // If this query param is submitted, the function runs for an unusually long time... 16 | if (event && event['queryStringParameters'] && event['queryStringParameters']['duration']) { 17 | await sleep(5800) 18 | } 19 | 20 | // If this query param is submitted, the function times out 21 | if (event && event['queryStringParameters'] && event['queryStringParameters']['timeout']) { 22 | await sleep(20000) 23 | } 24 | 25 | // Set default event body 26 | let data = event && event.body ? event.body : null 27 | // Parse, if necessary 28 | data = typeof data === 'string' ? JSON.parse(data) : data 29 | 30 | console.log(data) 31 | 32 | // If no data, throw an error 33 | if (!data || 34 | typeof data !== 'object' || 35 | !data.email || 36 | !data.name) { 37 | console.error('Data not included in response body.') 38 | return { 39 | statusCode: 400, 40 | headers: { 41 | 'Access-Control-Allow-Origin': '*', 42 | 'Access-Control-Allow-Credentials': true, 43 | }, 44 | body: JSON.stringify({ 45 | message: 'Email address is required' 46 | }), 47 | } 48 | } 49 | 50 | // If no database, throw an error 51 | if (!process.env.database_submissions_name) { 52 | console.error('Database not found.') 53 | return { 54 | statusCode: 500, 55 | headers: { 56 | 'Access-Control-Allow-Origin': '*', 57 | 'Access-Control-Allow-Credentials': true, 58 | }, 59 | body: JSON.stringify({ 60 | message: 'Database not found' 61 | }), 62 | } 63 | } 64 | 65 | const params = { 66 | TableName: process.env.database_submissions_name, 67 | Item: { 68 | email: data.email, 69 | name: data.name, 70 | createdAt: new Date().getTime(), 71 | updatedAt: new Date().getTime(), 72 | }, 73 | } 74 | 75 | let result 76 | try { 77 | result = await dynamoDb.put(params).promise() 78 | } catch(error) { 79 | console.error('DyanmoDB PUT error' + error.message) 80 | return { 81 | statusCode: 500, 82 | headers: { 83 | 'Access-Control-Allow-Origin': '*', 84 | 'Access-Control-Allow-Credentials': true, 85 | }, 86 | body: JSON.stringify({ 87 | message: error.message 88 | }) 89 | } 90 | } 91 | 92 | // Return the response 93 | return { 94 | statusCode: 200, 95 | headers: { 96 | 'Access-Control-Allow-Origin': '*', 97 | 'Access-Control-Allow-Credentials': true, 98 | }, 99 | body: JSON.stringify({ 100 | message: 'success', 101 | email: data.email, 102 | }), 103 | } 104 | } 105 | 106 | module.exports = { submit } 107 | 108 | /** 109 | * Demo Utility Functions 110 | */ 111 | 112 | const crash = () => { 113 | let r = Math.random().toString(36).substring(7) 114 | throw new Error(`Self-inflicted function crash: ${r}`) 115 | } 116 | 117 | const sleep = (ms) => { 118 | return new Promise(resolve => setTimeout(resolve, ms)) 119 | } 120 | -------------------------------------------------------------------------------- /backend-restapi/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fullstack-functions", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "aws-sdk": { 8 | "version": "2.475.0", 9 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.475.0.tgz", 10 | "integrity": "sha512-C8vRCYOrDxqlpx/HQUvIJteLwTllOQrGZBfGM6DuFBNmMJvkzoJi3MWKj1e+yWXkGzNmbOgpzyVLcKrXyntnTw==", 11 | "dev": true, 12 | "requires": { 13 | "buffer": "4.9.1", 14 | "events": "1.1.1", 15 | "ieee754": "1.1.8", 16 | "jmespath": "0.15.0", 17 | "querystring": "0.2.0", 18 | "sax": "1.2.1", 19 | "url": "0.10.3", 20 | "uuid": "3.3.2", 21 | "xml2js": "0.4.19" 22 | } 23 | }, 24 | "base64-js": { 25 | "version": "1.3.0", 26 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 27 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", 28 | "dev": true 29 | }, 30 | "buffer": { 31 | "version": "4.9.1", 32 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 33 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 34 | "dev": true, 35 | "requires": { 36 | "base64-js": "^1.0.2", 37 | "ieee754": "^1.1.4", 38 | "isarray": "^1.0.0" 39 | } 40 | }, 41 | "events": { 42 | "version": "1.1.1", 43 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 44 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", 45 | "dev": true 46 | }, 47 | "ieee754": { 48 | "version": "1.1.8", 49 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", 50 | "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", 51 | "dev": true 52 | }, 53 | "isarray": { 54 | "version": "1.0.0", 55 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 56 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 57 | "dev": true 58 | }, 59 | "jmespath": { 60 | "version": "0.15.0", 61 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", 62 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", 63 | "dev": true 64 | }, 65 | "punycode": { 66 | "version": "1.3.2", 67 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 68 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 69 | "dev": true 70 | }, 71 | "querystring": { 72 | "version": "0.2.0", 73 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 74 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 75 | "dev": true 76 | }, 77 | "sax": { 78 | "version": "1.2.1", 79 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 80 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", 81 | "dev": true 82 | }, 83 | "url": { 84 | "version": "0.10.3", 85 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 86 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 87 | "dev": true, 88 | "requires": { 89 | "punycode": "1.3.2", 90 | "querystring": "0.2.0" 91 | } 92 | }, 93 | "uuid": { 94 | "version": "3.3.2", 95 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 96 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 97 | "dev": true 98 | }, 99 | "xml2js": { 100 | "version": "0.4.19", 101 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 102 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 103 | "dev": true, 104 | "requires": { 105 | "sax": ">=0.6.0", 106 | "xmlbuilder": "~9.0.1" 107 | } 108 | }, 109 | "xmlbuilder": { 110 | "version": "9.0.7", 111 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 112 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", 113 | "dev": true 114 | } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /backend-restapi/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fullstack-functions", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": {}, 7 | "author": "Serverless.com", 8 | "license": "MIT", 9 | "dependencies": {}, 10 | "devDependencies": { 11 | "aws-sdk": "^2.475.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /backend-restapi/serverless.test.yml: -------------------------------------------------------------------------------- 1 | - name: form submission endpoint returns 200 2 | endpoint: 3 | function: formSubmit 4 | request: 5 | headers: 6 | Foo: bar 7 | body: 8 | email: jeff@lebowski.com 9 | name: Jeff Lebowski 10 | response: 11 | status: 200 12 | body: 13 | message: success 14 | email: jeff@lebowski.com 15 | -------------------------------------------------------------------------------- /backend-restapi/serverless.yml: -------------------------------------------------------------------------------- 1 | org: ac360 # Enter your tenant name here 2 | app: demos # Enter your application name here 3 | service: fullstack-restapi # update 4 | 5 | provider: 6 | name: aws 7 | runtime: nodejs8.10 8 | region: us-east-1 9 | environment: 10 | database_submissions_name: ${output::${param:env}::fullstack-database.database_submissions_name} 11 | database_submissions_region: ${output::${param:env}::fullstack-database.database_submissions_region} 12 | iamRoleStatements: 13 | - Effect: Allow 14 | Action: 15 | - dynamodb:PutItem 16 | Resource: "arn:aws:dynamodb:*:*:table/${output::${param:env}::fullstack-database.database_submissions_name}" 17 | 18 | functions: 19 | formSubmit: 20 | handler: index.submit 21 | timeout: 6 22 | events: 23 | - http: 24 | path: submit 25 | method: post 26 | cors: true 27 | 28 | resources: 29 | -------------------------------------------------------------------------------- /backend-tasks/handler.js: -------------------------------------------------------------------------------- 1 | const moment = require('moment') 2 | const fetch = require('node-fetch') 3 | 4 | /* 5 | * Test Endpoint 6 | */ 7 | 8 | const testEndpoint = (event, context, callback) => { 9 | 10 | let url = process.env.url 11 | let format = 'hh:mm:ss' 12 | let time = moment() 13 | let beforeTime = moment('04:50:00', format) 14 | let afterTime = moment('05:00:00', format) 15 | 16 | if (time.isBetween(beforeTime, afterTime)) { 17 | url += `?error=true` 18 | } 19 | 20 | // TODO: Add other query parameters to generate other function alerts. 21 | console.log('Testing URL: ', url) 22 | 23 | // API Request Function 24 | async function httpRequest() { 25 | let res = await fetch(url, { 26 | method: 'POST', 27 | body: JSON.stringify({ 28 | name: 'Scheduled Request', 29 | email: 'scheduled@request.com' 30 | }) 31 | }) 32 | if (res.ok) { 33 | return res 34 | } else { 35 | console.log(res.error) 36 | throw new Error(res.statusText) 37 | } 38 | } 39 | 40 | // Generate a random number between 1 and 10 41 | let x = Math.floor((Math.random() * 10) + 1) 42 | let y = 0 43 | 44 | let promises = [] 45 | while (y < x) { 46 | promises.push(httpRequest()) 47 | y++ 48 | } 49 | 50 | return Promise.all(promises) 51 | .then(function(values) { 52 | console.log(`Called the URL ${x} times successfully`) 53 | return callback(null , 'success') 54 | }) 55 | .catch((error) => { 56 | console.log(error) 57 | return callback(error, null) 58 | }) 59 | } 60 | 61 | module.exports = { 62 | testEndpoint, 63 | } 64 | -------------------------------------------------------------------------------- /backend-tasks/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webapp-users", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/polyfill": { 8 | "version": "7.4.0", 9 | "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.4.0.tgz", 10 | "integrity": "sha512-bVsjsrtsDflIHp5I6caaAa2V25Kzn50HKPL6g3X0P0ni1ks+58cPB8Mz6AOKVuRPgaVdq/OwEUc/1vKqX+Mo4A==", 11 | "dev": true, 12 | "requires": { 13 | "core-js": "^2.6.5", 14 | "regenerator-runtime": "^0.13.2" 15 | } 16 | }, 17 | "@serverless/enterprise-plugin": { 18 | "version": "0.3.1", 19 | "resolved": "https://registry.npmjs.org/@serverless/enterprise-plugin/-/enterprise-plugin-0.3.1.tgz", 20 | "integrity": "sha512-umtELkR3UB1MmUE/R+K14ZsS8rAJFsUVgLRY4c/SiPorZJxXWkBjQTpTflcB5Qxp5nNONlXIvjMaZZ+oMSZdwA==", 21 | "dev": true, 22 | "requires": { 23 | "@babel/polyfill": "^7.2.5", 24 | "@serverless/platform-sdk": "^0.7.0", 25 | "chalk": "^2.4.2", 26 | "flat": "^4.1.0", 27 | "fs-extra": "^7.0.1", 28 | "iso8601-duration": "^1.1.7", 29 | "lodash": "^4.17.11", 30 | "moment": "^2.24.0", 31 | "node-dir": "^0.1.17", 32 | "node-fetch": "^2.3.0", 33 | "semver": "^5.6.0", 34 | "yamljs": "^0.3.0" 35 | } 36 | }, 37 | "@serverless/platform-sdk": { 38 | "version": "0.7.0", 39 | "resolved": "https://registry.npmjs.org/@serverless/platform-sdk/-/platform-sdk-0.7.0.tgz", 40 | "integrity": "sha512-3VuXTkWSmfoGXiql0v/5lMHOMfRtk01C81w0QinmSZKpO49f+9UgSwJvLK1LaVJmOTBZidr1vBI5SZHTNZW2WA==", 41 | "dev": true, 42 | "requires": { 43 | "babel-polyfill": "^6.26.0", 44 | "body-parser": "^1.18.3", 45 | "chalk": "^2.4.1", 46 | "cors": "^2.8.4", 47 | "express": "^4.16.3", 48 | "is-docker": "^1.1.0", 49 | "isomorphic-fetch": "^2.2.1", 50 | "jwt-decode": "^2.2.0", 51 | "opn": "^5.3.0", 52 | "querystring": "^0.2.0", 53 | "ramda": "^0.25.0", 54 | "rc": "^1.2.8", 55 | "source-map-support": "^0.5.5", 56 | "uuid": "^3.3.2", 57 | "write-file-atomic": "^2.3.0" 58 | } 59 | }, 60 | "accepts": { 61 | "version": "1.3.5", 62 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 63 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 64 | "dev": true, 65 | "requires": { 66 | "mime-types": "~2.1.18", 67 | "negotiator": "0.6.1" 68 | } 69 | }, 70 | "ansi-styles": { 71 | "version": "3.2.1", 72 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 73 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 74 | "dev": true, 75 | "requires": { 76 | "color-convert": "^1.9.0" 77 | } 78 | }, 79 | "argparse": { 80 | "version": "1.0.10", 81 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 82 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 83 | "dev": true, 84 | "requires": { 85 | "sprintf-js": "~1.0.2" 86 | } 87 | }, 88 | "array-flatten": { 89 | "version": "1.1.1", 90 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 91 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", 92 | "dev": true 93 | }, 94 | "babel-polyfill": { 95 | "version": "6.26.0", 96 | "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", 97 | "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", 98 | "dev": true, 99 | "requires": { 100 | "babel-runtime": "^6.26.0", 101 | "core-js": "^2.5.0", 102 | "regenerator-runtime": "^0.10.5" 103 | }, 104 | "dependencies": { 105 | "regenerator-runtime": { 106 | "version": "0.10.5", 107 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", 108 | "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", 109 | "dev": true 110 | } 111 | } 112 | }, 113 | "babel-runtime": { 114 | "version": "6.26.0", 115 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 116 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 117 | "dev": true, 118 | "requires": { 119 | "core-js": "^2.4.0", 120 | "regenerator-runtime": "^0.11.0" 121 | }, 122 | "dependencies": { 123 | "regenerator-runtime": { 124 | "version": "0.11.1", 125 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 126 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", 127 | "dev": true 128 | } 129 | } 130 | }, 131 | "balanced-match": { 132 | "version": "1.0.0", 133 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 134 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 135 | "dev": true 136 | }, 137 | "body-parser": { 138 | "version": "1.18.3", 139 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 140 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 141 | "dev": true, 142 | "requires": { 143 | "bytes": "3.0.0", 144 | "content-type": "~1.0.4", 145 | "debug": "2.6.9", 146 | "depd": "~1.1.2", 147 | "http-errors": "~1.6.3", 148 | "iconv-lite": "0.4.23", 149 | "on-finished": "~2.3.0", 150 | "qs": "6.5.2", 151 | "raw-body": "2.3.3", 152 | "type-is": "~1.6.16" 153 | } 154 | }, 155 | "brace-expansion": { 156 | "version": "1.1.11", 157 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 158 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 159 | "dev": true, 160 | "requires": { 161 | "balanced-match": "^1.0.0", 162 | "concat-map": "0.0.1" 163 | } 164 | }, 165 | "buffer-from": { 166 | "version": "1.1.1", 167 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 168 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 169 | "dev": true 170 | }, 171 | "bytes": { 172 | "version": "3.0.0", 173 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 174 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", 175 | "dev": true 176 | }, 177 | "chalk": { 178 | "version": "2.4.2", 179 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 180 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 181 | "dev": true, 182 | "requires": { 183 | "ansi-styles": "^3.2.1", 184 | "escape-string-regexp": "^1.0.5", 185 | "supports-color": "^5.3.0" 186 | } 187 | }, 188 | "color-convert": { 189 | "version": "1.9.3", 190 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 191 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 192 | "dev": true, 193 | "requires": { 194 | "color-name": "1.1.3" 195 | } 196 | }, 197 | "color-name": { 198 | "version": "1.1.3", 199 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 200 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 201 | "dev": true 202 | }, 203 | "concat-map": { 204 | "version": "0.0.1", 205 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 206 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 207 | "dev": true 208 | }, 209 | "content-disposition": { 210 | "version": "0.5.2", 211 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 212 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", 213 | "dev": true 214 | }, 215 | "content-type": { 216 | "version": "1.0.4", 217 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 218 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 219 | "dev": true 220 | }, 221 | "cookie": { 222 | "version": "0.3.1", 223 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 224 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", 225 | "dev": true 226 | }, 227 | "cookie-signature": { 228 | "version": "1.0.6", 229 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 230 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", 231 | "dev": true 232 | }, 233 | "core-js": { 234 | "version": "2.6.5", 235 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", 236 | "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", 237 | "dev": true 238 | }, 239 | "cors": { 240 | "version": "2.8.5", 241 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 242 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 243 | "dev": true, 244 | "requires": { 245 | "object-assign": "^4", 246 | "vary": "^1" 247 | } 248 | }, 249 | "debug": { 250 | "version": "2.6.9", 251 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 252 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 253 | "dev": true, 254 | "requires": { 255 | "ms": "2.0.0" 256 | } 257 | }, 258 | "deep-extend": { 259 | "version": "0.6.0", 260 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 261 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 262 | "dev": true 263 | }, 264 | "depd": { 265 | "version": "1.1.2", 266 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 267 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 268 | "dev": true 269 | }, 270 | "destroy": { 271 | "version": "1.0.4", 272 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 273 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", 274 | "dev": true 275 | }, 276 | "ee-first": { 277 | "version": "1.1.1", 278 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 279 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", 280 | "dev": true 281 | }, 282 | "encodeurl": { 283 | "version": "1.0.2", 284 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 285 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 286 | "dev": true 287 | }, 288 | "encoding": { 289 | "version": "0.1.12", 290 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 291 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 292 | "dev": true, 293 | "requires": { 294 | "iconv-lite": "~0.4.13" 295 | } 296 | }, 297 | "escape-html": { 298 | "version": "1.0.3", 299 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 300 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", 301 | "dev": true 302 | }, 303 | "escape-string-regexp": { 304 | "version": "1.0.5", 305 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 306 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 307 | "dev": true 308 | }, 309 | "etag": { 310 | "version": "1.8.1", 311 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 312 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 313 | "dev": true 314 | }, 315 | "express": { 316 | "version": "4.16.4", 317 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 318 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 319 | "dev": true, 320 | "requires": { 321 | "accepts": "~1.3.5", 322 | "array-flatten": "1.1.1", 323 | "body-parser": "1.18.3", 324 | "content-disposition": "0.5.2", 325 | "content-type": "~1.0.4", 326 | "cookie": "0.3.1", 327 | "cookie-signature": "1.0.6", 328 | "debug": "2.6.9", 329 | "depd": "~1.1.2", 330 | "encodeurl": "~1.0.2", 331 | "escape-html": "~1.0.3", 332 | "etag": "~1.8.1", 333 | "finalhandler": "1.1.1", 334 | "fresh": "0.5.2", 335 | "merge-descriptors": "1.0.1", 336 | "methods": "~1.1.2", 337 | "on-finished": "~2.3.0", 338 | "parseurl": "~1.3.2", 339 | "path-to-regexp": "0.1.7", 340 | "proxy-addr": "~2.0.4", 341 | "qs": "6.5.2", 342 | "range-parser": "~1.2.0", 343 | "safe-buffer": "5.1.2", 344 | "send": "0.16.2", 345 | "serve-static": "1.13.2", 346 | "setprototypeof": "1.1.0", 347 | "statuses": "~1.4.0", 348 | "type-is": "~1.6.16", 349 | "utils-merge": "1.0.1", 350 | "vary": "~1.1.2" 351 | }, 352 | "dependencies": { 353 | "statuses": { 354 | "version": "1.4.0", 355 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 356 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 357 | "dev": true 358 | } 359 | } 360 | }, 361 | "finalhandler": { 362 | "version": "1.1.1", 363 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 364 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 365 | "dev": true, 366 | "requires": { 367 | "debug": "2.6.9", 368 | "encodeurl": "~1.0.2", 369 | "escape-html": "~1.0.3", 370 | "on-finished": "~2.3.0", 371 | "parseurl": "~1.3.2", 372 | "statuses": "~1.4.0", 373 | "unpipe": "~1.0.0" 374 | }, 375 | "dependencies": { 376 | "statuses": { 377 | "version": "1.4.0", 378 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 379 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 380 | "dev": true 381 | } 382 | } 383 | }, 384 | "flat": { 385 | "version": "4.1.0", 386 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 387 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 388 | "dev": true, 389 | "requires": { 390 | "is-buffer": "~2.0.3" 391 | } 392 | }, 393 | "forwarded": { 394 | "version": "0.1.2", 395 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 396 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", 397 | "dev": true 398 | }, 399 | "fresh": { 400 | "version": "0.5.2", 401 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 402 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 403 | "dev": true 404 | }, 405 | "fs-extra": { 406 | "version": "7.0.1", 407 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", 408 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", 409 | "dev": true, 410 | "requires": { 411 | "graceful-fs": "^4.1.2", 412 | "jsonfile": "^4.0.0", 413 | "universalify": "^0.1.0" 414 | } 415 | }, 416 | "fs.realpath": { 417 | "version": "1.0.0", 418 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 419 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 420 | "dev": true 421 | }, 422 | "glob": { 423 | "version": "7.1.3", 424 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 425 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 426 | "dev": true, 427 | "requires": { 428 | "fs.realpath": "^1.0.0", 429 | "inflight": "^1.0.4", 430 | "inherits": "2", 431 | "minimatch": "^3.0.4", 432 | "once": "^1.3.0", 433 | "path-is-absolute": "^1.0.0" 434 | } 435 | }, 436 | "graceful-fs": { 437 | "version": "4.1.15", 438 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 439 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 440 | "dev": true 441 | }, 442 | "has-flag": { 443 | "version": "3.0.0", 444 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 445 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 446 | "dev": true 447 | }, 448 | "http-errors": { 449 | "version": "1.6.3", 450 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 451 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 452 | "dev": true, 453 | "requires": { 454 | "depd": "~1.1.2", 455 | "inherits": "2.0.3", 456 | "setprototypeof": "1.1.0", 457 | "statuses": ">= 1.4.0 < 2" 458 | } 459 | }, 460 | "iconv-lite": { 461 | "version": "0.4.23", 462 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 463 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 464 | "dev": true, 465 | "requires": { 466 | "safer-buffer": ">= 2.1.2 < 3" 467 | } 468 | }, 469 | "imurmurhash": { 470 | "version": "0.1.4", 471 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 472 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 473 | "dev": true 474 | }, 475 | "inflight": { 476 | "version": "1.0.6", 477 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 478 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 479 | "dev": true, 480 | "requires": { 481 | "once": "^1.3.0", 482 | "wrappy": "1" 483 | } 484 | }, 485 | "inherits": { 486 | "version": "2.0.3", 487 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 488 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 489 | "dev": true 490 | }, 491 | "ini": { 492 | "version": "1.3.5", 493 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 494 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 495 | "dev": true 496 | }, 497 | "ipaddr.js": { 498 | "version": "1.8.0", 499 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 500 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", 501 | "dev": true 502 | }, 503 | "is-buffer": { 504 | "version": "2.0.3", 505 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", 506 | "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", 507 | "dev": true 508 | }, 509 | "is-docker": { 510 | "version": "1.1.0", 511 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", 512 | "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=", 513 | "dev": true 514 | }, 515 | "is-stream": { 516 | "version": "1.1.0", 517 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 518 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 519 | "dev": true 520 | }, 521 | "is-wsl": { 522 | "version": "1.1.0", 523 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 524 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", 525 | "dev": true 526 | }, 527 | "iso8601-duration": { 528 | "version": "1.2.0", 529 | "resolved": "https://registry.npmjs.org/iso8601-duration/-/iso8601-duration-1.2.0.tgz", 530 | "integrity": "sha512-ErTBd++b17E8nmWII1K1uZtBgD1E8RjyvwmxlCjPHNqHMD7gmcMHOw0E8Ro/6+QT4PhHRSnnMo7bxa1vFPkwhg==", 531 | "dev": true 532 | }, 533 | "isomorphic-fetch": { 534 | "version": "2.2.1", 535 | "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", 536 | "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", 537 | "dev": true, 538 | "requires": { 539 | "node-fetch": "^1.0.1", 540 | "whatwg-fetch": ">=0.10.0" 541 | }, 542 | "dependencies": { 543 | "node-fetch": { 544 | "version": "1.7.3", 545 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", 546 | "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", 547 | "dev": true, 548 | "requires": { 549 | "encoding": "^0.1.11", 550 | "is-stream": "^1.0.1" 551 | } 552 | } 553 | } 554 | }, 555 | "jsonfile": { 556 | "version": "4.0.0", 557 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 558 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 559 | "dev": true, 560 | "requires": { 561 | "graceful-fs": "^4.1.6" 562 | } 563 | }, 564 | "jwt-decode": { 565 | "version": "2.2.0", 566 | "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", 567 | "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk=", 568 | "dev": true 569 | }, 570 | "lodash": { 571 | "version": "4.17.11", 572 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 573 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", 574 | "dev": true 575 | }, 576 | "media-typer": { 577 | "version": "0.3.0", 578 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 579 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 580 | "dev": true 581 | }, 582 | "merge-descriptors": { 583 | "version": "1.0.1", 584 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 585 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", 586 | "dev": true 587 | }, 588 | "methods": { 589 | "version": "1.1.2", 590 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 591 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 592 | "dev": true 593 | }, 594 | "mime": { 595 | "version": "1.4.1", 596 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 597 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", 598 | "dev": true 599 | }, 600 | "mime-db": { 601 | "version": "1.38.0", 602 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 603 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", 604 | "dev": true 605 | }, 606 | "mime-types": { 607 | "version": "2.1.22", 608 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 609 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 610 | "dev": true, 611 | "requires": { 612 | "mime-db": "~1.38.0" 613 | } 614 | }, 615 | "minimatch": { 616 | "version": "3.0.4", 617 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 618 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 619 | "dev": true, 620 | "requires": { 621 | "brace-expansion": "^1.1.7" 622 | } 623 | }, 624 | "minimist": { 625 | "version": "1.2.0", 626 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 627 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 628 | "dev": true 629 | }, 630 | "moment": { 631 | "version": "2.24.0", 632 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", 633 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" 634 | }, 635 | "ms": { 636 | "version": "2.0.0", 637 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 638 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 639 | "dev": true 640 | }, 641 | "negotiator": { 642 | "version": "0.6.1", 643 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 644 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", 645 | "dev": true 646 | }, 647 | "node-dir": { 648 | "version": "0.1.17", 649 | "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", 650 | "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", 651 | "dev": true, 652 | "requires": { 653 | "minimatch": "^3.0.2" 654 | } 655 | }, 656 | "node-fetch": { 657 | "version": "2.6.0", 658 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 659 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" 660 | }, 661 | "object-assign": { 662 | "version": "4.1.1", 663 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 664 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 665 | "dev": true 666 | }, 667 | "on-finished": { 668 | "version": "2.3.0", 669 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 670 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 671 | "dev": true, 672 | "requires": { 673 | "ee-first": "1.1.1" 674 | } 675 | }, 676 | "once": { 677 | "version": "1.4.0", 678 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 679 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 680 | "dev": true, 681 | "requires": { 682 | "wrappy": "1" 683 | } 684 | }, 685 | "opn": { 686 | "version": "5.5.0", 687 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", 688 | "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", 689 | "dev": true, 690 | "requires": { 691 | "is-wsl": "^1.1.0" 692 | } 693 | }, 694 | "parseurl": { 695 | "version": "1.3.2", 696 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 697 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", 698 | "dev": true 699 | }, 700 | "path-is-absolute": { 701 | "version": "1.0.1", 702 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 703 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 704 | "dev": true 705 | }, 706 | "path-to-regexp": { 707 | "version": "0.1.7", 708 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 709 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", 710 | "dev": true 711 | }, 712 | "proxy-addr": { 713 | "version": "2.0.4", 714 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 715 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 716 | "dev": true, 717 | "requires": { 718 | "forwarded": "~0.1.2", 719 | "ipaddr.js": "1.8.0" 720 | } 721 | }, 722 | "qs": { 723 | "version": "6.5.2", 724 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 725 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 726 | "dev": true 727 | }, 728 | "querystring": { 729 | "version": "0.2.0", 730 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 731 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 732 | "dev": true 733 | }, 734 | "ramda": { 735 | "version": "0.25.0", 736 | "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", 737 | "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", 738 | "dev": true 739 | }, 740 | "range-parser": { 741 | "version": "1.2.0", 742 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 743 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", 744 | "dev": true 745 | }, 746 | "raw-body": { 747 | "version": "2.3.3", 748 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 749 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 750 | "dev": true, 751 | "requires": { 752 | "bytes": "3.0.0", 753 | "http-errors": "1.6.3", 754 | "iconv-lite": "0.4.23", 755 | "unpipe": "1.0.0" 756 | } 757 | }, 758 | "rc": { 759 | "version": "1.2.8", 760 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 761 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 762 | "dev": true, 763 | "requires": { 764 | "deep-extend": "^0.6.0", 765 | "ini": "~1.3.0", 766 | "minimist": "^1.2.0", 767 | "strip-json-comments": "~2.0.1" 768 | } 769 | }, 770 | "regenerator-runtime": { 771 | "version": "0.13.2", 772 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", 773 | "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", 774 | "dev": true 775 | }, 776 | "safe-buffer": { 777 | "version": "5.1.2", 778 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 779 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 780 | "dev": true 781 | }, 782 | "safer-buffer": { 783 | "version": "2.1.2", 784 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 785 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 786 | "dev": true 787 | }, 788 | "semver": { 789 | "version": "5.7.0", 790 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 791 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", 792 | "dev": true 793 | }, 794 | "send": { 795 | "version": "0.16.2", 796 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 797 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 798 | "dev": true, 799 | "requires": { 800 | "debug": "2.6.9", 801 | "depd": "~1.1.2", 802 | "destroy": "~1.0.4", 803 | "encodeurl": "~1.0.2", 804 | "escape-html": "~1.0.3", 805 | "etag": "~1.8.1", 806 | "fresh": "0.5.2", 807 | "http-errors": "~1.6.2", 808 | "mime": "1.4.1", 809 | "ms": "2.0.0", 810 | "on-finished": "~2.3.0", 811 | "range-parser": "~1.2.0", 812 | "statuses": "~1.4.0" 813 | }, 814 | "dependencies": { 815 | "statuses": { 816 | "version": "1.4.0", 817 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 818 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 819 | "dev": true 820 | } 821 | } 822 | }, 823 | "serve-static": { 824 | "version": "1.13.2", 825 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 826 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 827 | "dev": true, 828 | "requires": { 829 | "encodeurl": "~1.0.2", 830 | "escape-html": "~1.0.3", 831 | "parseurl": "~1.3.2", 832 | "send": "0.16.2" 833 | } 834 | }, 835 | "setprototypeof": { 836 | "version": "1.1.0", 837 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 838 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", 839 | "dev": true 840 | }, 841 | "signal-exit": { 842 | "version": "3.0.2", 843 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 844 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 845 | "dev": true 846 | }, 847 | "source-map": { 848 | "version": "0.6.1", 849 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 850 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 851 | "dev": true 852 | }, 853 | "source-map-support": { 854 | "version": "0.5.11", 855 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", 856 | "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", 857 | "dev": true, 858 | "requires": { 859 | "buffer-from": "^1.0.0", 860 | "source-map": "^0.6.0" 861 | } 862 | }, 863 | "sprintf-js": { 864 | "version": "1.0.3", 865 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 866 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 867 | "dev": true 868 | }, 869 | "statuses": { 870 | "version": "1.5.0", 871 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 872 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 873 | "dev": true 874 | }, 875 | "strip-json-comments": { 876 | "version": "2.0.1", 877 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 878 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 879 | "dev": true 880 | }, 881 | "supports-color": { 882 | "version": "5.5.0", 883 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 884 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 885 | "dev": true, 886 | "requires": { 887 | "has-flag": "^3.0.0" 888 | } 889 | }, 890 | "type-is": { 891 | "version": "1.6.16", 892 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 893 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 894 | "dev": true, 895 | "requires": { 896 | "media-typer": "0.3.0", 897 | "mime-types": "~2.1.18" 898 | } 899 | }, 900 | "universalify": { 901 | "version": "0.1.2", 902 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 903 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 904 | "dev": true 905 | }, 906 | "unpipe": { 907 | "version": "1.0.0", 908 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 909 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 910 | "dev": true 911 | }, 912 | "utils-merge": { 913 | "version": "1.0.1", 914 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 915 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 916 | "dev": true 917 | }, 918 | "uuid": { 919 | "version": "3.3.2", 920 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 921 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 922 | "dev": true 923 | }, 924 | "vary": { 925 | "version": "1.1.2", 926 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 927 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 928 | "dev": true 929 | }, 930 | "whatwg-fetch": { 931 | "version": "3.0.0", 932 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", 933 | "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", 934 | "dev": true 935 | }, 936 | "wrappy": { 937 | "version": "1.0.2", 938 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 939 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 940 | "dev": true 941 | }, 942 | "write-file-atomic": { 943 | "version": "2.4.2", 944 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", 945 | "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", 946 | "dev": true, 947 | "requires": { 948 | "graceful-fs": "^4.1.11", 949 | "imurmurhash": "^0.1.4", 950 | "signal-exit": "^3.0.2" 951 | } 952 | }, 953 | "yamljs": { 954 | "version": "0.3.0", 955 | "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", 956 | "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", 957 | "dev": true, 958 | "requires": { 959 | "argparse": "^1.0.7", 960 | "glob": "^7.0.5" 961 | } 962 | } 963 | } 964 | } 965 | -------------------------------------------------------------------------------- /backend-tasks/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webapp-users", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "handler.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "moment": "^2.24.0", 13 | "node-fetch": "^2.6.0" 14 | }, 15 | "devDependencies": { 16 | "@serverless/enterprise-plugin": "latest" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /backend-tasks/serverless.yml: -------------------------------------------------------------------------------- 1 | org: ac360 # Enter your tenant name here 2 | app: demos # Enter your application name here 3 | service: fullstack-tasks # update 4 | 5 | provider: 6 | name: aws 7 | runtime: nodejs8.10 8 | stage: dev 9 | region: us-east-1 10 | environment: 11 | url: ${param:test_endpoint} 12 | 13 | functions: 14 | testEndpoint: 15 | handler: handler.testEndpoint 16 | events: 17 | - schedule: rate(5 minutes) 18 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fullstack-frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "react": "^16.8.4", 7 | "react-dom": "^16.8.4", 8 | "react-scripts": "2.1.8" 9 | }, 10 | "devDependencies": { 11 | "serverless-finch": "^2.4.2" 12 | }, 13 | "scripts": { 14 | "start": "react-scripts start", 15 | "build": "react-scripts build", 16 | "test": "react-scripts test", 17 | "eject": "react-scripts eject" 18 | }, 19 | "eslintConfig": { 20 | "extends": "react-app" 21 | }, 22 | "browserslist": [ 23 | ">0.2%", 24 | "not dead", 25 | "not ie <= 11", 26 | "not op_mini all" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverless/workshop/f4cc42cdd9f0865347dbfa42f67ab0beb56e3edc/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 15 | 16 | 25 | Serverless Email Form 26 | 27 | 28 | 29 |
30 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /frontend/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /frontend/serverless.yml: -------------------------------------------------------------------------------- 1 | org: ac360 # Enter your tenant name here 2 | app: demos # Enter your application name here 3 | service: fullstack-website 4 | 5 | provider: 6 | name: aws 7 | runtime: nodejs8.10 8 | region: us-east-1 9 | 10 | plugins: 11 | - serverless-finch 12 | 13 | custom: 14 | client: 15 | bucketName: demo-fullstack-ja189j # Change this to a universally unique bucket name 16 | distributionFolder: ./build 17 | -------------------------------------------------------------------------------- /frontend/src/DemoApp.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; 4 | font-weight: 300; 5 | } 6 | 7 | html, body { 8 | display: flex; 9 | flex-direction: column; 10 | box-sizing: border-box; 11 | height: 100%; 12 | width: 100%; 13 | background: #000000; 14 | } 15 | 16 | .DemoApp { 17 | display: flex; 18 | flex-direction: column; 19 | height: 100%; 20 | width: 100%; 21 | min-height: 100vh; 22 | } 23 | 24 | /* Admin Menu */ 25 | 26 | .DemoApp-admin { 27 | z-index: 10; 28 | position: absolute; 29 | display: flex; 30 | flex-direction: column; 31 | box-sizing: border-box; 32 | height: 100vh; 33 | width: 700px; 34 | padding: 1em 1em 1em 1em; 35 | margin-left: -750px; 36 | background: #000000; 37 | font-size: calc(10px + 2vmin); 38 | color: white; 39 | box-shadow: 5px 0 2px 0px rgba(0,0,0,0.2); 40 | -webkit-transition:all 0.3s ease-in-out; 41 | -moz-transition:all 0.3s ease-in-out; 42 | -o-transition:all 0.3s ease-in-out; 43 | transition:all 0.3s ease-in-out; 44 | } 45 | 46 | .DemoApp-admin.visible { 47 | margin-left: 0; 48 | } 49 | 50 | .DemoApp-admin .admin-close { 51 | position: absolute; 52 | top: 0px; 53 | right: 0px; 54 | padding: 0.4em 0.8em; 55 | color: #ffffff; 56 | opacity: 0.5; 57 | font-size: 38px; 58 | user-select: none; 59 | transform: scaleX(1.1) scaleY(0.9); 60 | -webkit-transition:all 0.2s ease-in-out; 61 | -moz-transition:all 0.2s ease-in-out; 62 | -o-transition:all 0.2s ease-in-out; 63 | transition:all 0.2s ease-in-out; 64 | } 65 | 66 | .DemoApp-admin .admin-close:hover { 67 | opacity: 1; 68 | cursor: pointer; 69 | } 70 | 71 | .DemoApp-admin .admin-section { 72 | display: flex; 73 | flex-direction: column; 74 | margin: 0 0 0.8em 0; 75 | padding: 0.8em 0 0 0; 76 | border-top: 1px solid rgba(255,255,255,0.2); 77 | } 78 | 79 | .DemoApp-admin .admin-section-general { 80 | display: flex; 81 | flex-direction: row; 82 | } 83 | 84 | .DemoApp-admin .admin-section-general-description { 85 | display: flex; 86 | flex-direction: column; 87 | height: auto; 88 | width: 85%; 89 | font-size: 15px; 90 | line-height: 22px; 91 | font-weight: 200; 92 | color: rgba(255,255,255,0.55); 93 | letter-spacing: 0.5px; 94 | padding: 0 0.3em 0.3em 0; 95 | box-sizing: border-box; 96 | } 97 | 98 | .DemoApp-admin .admin-section-general-button { 99 | display: flex; 100 | height: auto; 101 | width: 15%; 102 | } 103 | 104 | .DemoApp-admin .admin-label { 105 | display: flex; 106 | height: auto; 107 | width: 100%; 108 | font-size: 16px; 109 | font-weight: 600; 110 | color: #FFFFFF; 111 | margin: 0em 0 0.6em 0; 112 | } 113 | 114 | .DemoApp-admin .admin-input-description { 115 | display: flex; 116 | height: auto; 117 | width: 100%; 118 | font-size: 15px; 119 | line-height: 22px; 120 | font-weight: 200; 121 | color: rgba(255,255,255,0.45); 122 | margin: 0.4em 0 0 0; 123 | letter-spacing: 0.5px; 124 | } 125 | 126 | .DemoApp-admin .admin-section-field { 127 | display: flex; 128 | flex-direction: row; 129 | align-items: center; 130 | width: 100%; 131 | height: 50px; 132 | } 133 | 134 | .DemoApp-admin .admin-section-field .admin-button { 135 | width: 15%; 136 | } 137 | 138 | .DemoApp-admin .admin-section-button { 139 | display: flex; 140 | flex-direction: column; 141 | align-items: flex-start; 142 | width: 100%; 143 | height: auto; 144 | margin-bottom: 1em; 145 | user-select: none; 146 | } 147 | 148 | .DemoApp-admin .admin-input { 149 | display: flex; 150 | align-items: center; 151 | justify-content: center; 152 | box-sizing: border-box; 153 | padding: 0.2em 0.7em; 154 | width: 85%; 155 | height: 100%; 156 | border: none; 157 | font-size: 18px; 158 | font-weight: 300; 159 | background-color: rgba(255,255,255,0.2); 160 | border-top: 1px solid rgba(255,255,255,0); 161 | border-left: 1px solid rgba(255,255,255,0); 162 | border-bottom: 1px solid rgba(255,255,255,0); 163 | border-right: none; 164 | color: #FFFFFF; 165 | line-height: normal; 166 | outline: none; 167 | -webkit-transition:all 0.2s ease-in-out; 168 | -moz-transition:all 0.2s ease-in-out; 169 | -o-transition:all 0.2s ease-in-out; 170 | transition:all 0.2s ease-in-out; 171 | } 172 | 173 | .DemoApp-admin .admin-input:hover { 174 | cursor: pointer; 175 | } 176 | 177 | .DemoApp-admin .admin-input:focus { 178 | border-top: 1px solid rgba(255,255,255,0.7); 179 | border-left: 1px solid rgba(255,255,255,0.7); 180 | border-bottom: 1px solid rgba(255,255,255,0.7); 181 | border-right: none; 182 | } 183 | 184 | .DemoApp-admin .admin-input::placeholder { 185 | color: rgba(255,255,255,0.6); 186 | } 187 | 188 | .DemoApp-admin .admin-button { 189 | display: flex; 190 | flex-direction: row; 191 | align-items: center; 192 | justify-content: center; 193 | width: auto; 194 | max-width: 100px; 195 | height: 50px; 196 | padding: 0.5em 1em 0.5em 1em; 197 | background: #F15953; 198 | color: white; 199 | font-size: 16px; 200 | font-weight: 600; 201 | border: none; 202 | user-select: none; 203 | } 204 | 205 | .DemoApp-admin .admin-button:focus { 206 | outline: none; 207 | } 208 | 209 | .DemoApp-admin .admin-button:hover { 210 | cursor: pointer; 211 | background: #F15953; 212 | color: white; 213 | } 214 | 215 | .DemoApp-admin .admin-button:active { 216 | outline: none; 217 | background: white; 218 | color: #F15953; 219 | } 220 | 221 | .DemoApp-admin .admin-logo { 222 | display: flex; 223 | flex-direction: row; 224 | align-items: center; 225 | margin: 0 0 1.5em 0; 226 | font-size: 16px; 227 | font-weight: 600; 228 | } 229 | 230 | .DemoApp-admin .admin-logo img { 231 | height: auto; 232 | width: 30px; 233 | margin-right: 20px;; 234 | } 235 | 236 | .DemoApp-admin .admin-status { 237 | margin: 0; 238 | padding: 0; 239 | font-size: 24px; 240 | } 241 | 242 | /* Message Thread */ 243 | 244 | .DemoApp-content { 245 | display: flex; 246 | flex-direction: column; 247 | align-items: center; 248 | justify-content: flex-start; 249 | height: 100vh; 250 | width: 100%; 251 | box-sizing: border-box; 252 | background: #eaeaea; 253 | overflow-y: scroll; 254 | padding: 4em 0.75em; 255 | font-size: calc(10px + 2vmin); 256 | color: white; 257 | } 258 | 259 | .DemoApp-content .admin-link { 260 | position: fixed; 261 | display: flex; 262 | justify-content: flex-end; 263 | top: 20px; 264 | right: 30px; 265 | height: 100px; 266 | width: 200px; 267 | font-size: 22px; 268 | color: rgba(0,0,0,0.4); 269 | user-select: none; 270 | -webkit-transition:all 0.3s ease-in-out; 271 | -moz-transition:all 0.3s ease-in-out; 272 | -o-transition:all 0.3s ease-in-out; 273 | transition:all 0.3s ease-in-out; 274 | } 275 | 276 | .DemoApp-content .admin-link:hover { 277 | cursor: pointer; 278 | color: rgba(0,0,0,1); 279 | } 280 | 281 | .DemoApp-content .container { 282 | display: flex; 283 | flex-direction: column; 284 | width: 100%; 285 | max-width: 1000px; 286 | height: auto; 287 | background: #ffffff; 288 | padding: 2em; 289 | box-shadow: 0px 4px 2px rgba(0,0,0,0.2); 290 | } 291 | 292 | .DemoApp-content .form-header { 293 | display: flex; 294 | flex-direction: row; 295 | justify-content: center; 296 | width: 100%; 297 | height: auto; 298 | margin: 0 0 1.5em 0; 299 | color: #000000; 300 | } 301 | 302 | .DemoApp-content .form { 303 | display: flex; 304 | flex-direction: column; 305 | justify-content: center; 306 | margin: 0 auto; 307 | width: 100%; 308 | max-width: 600px; 309 | height: auto; 310 | color: #000000; 311 | } 312 | 313 | .DemoApp-content .form-field-label { 314 | display: flex; 315 | flex-direction: row; 316 | justify-content: center; 317 | width: 100%; 318 | height: auto; 319 | margin: 0 0 1em 0; 320 | color: #000000; 321 | font-size: 18px; 322 | } 323 | 324 | .DemoApp-content .form-field-input { 325 | display: flex; 326 | flex-direction: row; 327 | justify-content: center; 328 | align-content: center; 329 | text-align: center; 330 | height: 60px; 331 | width: 100%; 332 | margin: 0 0 1em 0; 333 | color: #000000; 334 | font-size: 26px; 335 | box-shadow: none; 336 | border: none; 337 | background: rgba(0,0,0,0.05); 338 | } 339 | 340 | .DemoApp-content .form-field-input::placeholder { 341 | color: rgba(0,0,0,0.2); 342 | } 343 | 344 | .DemoApp-content .form-field-input:focus { 345 | outline: none; 346 | } 347 | 348 | .DemoApp-content .form-field-button { 349 | display: flex; 350 | flex-direction: row; 351 | align-items: center; 352 | justify-content: center; 353 | width: 200px; 354 | height: 50px; 355 | padding: 0.5em 1em 0.5em 1em; 356 | background: #F15953; 357 | color: white; 358 | font-size: 16px; 359 | font-weight: 600; 360 | border: none; 361 | user-select: none; 362 | } 363 | 364 | .DemoApp-content .form-field-button-container { 365 | display: flex; 366 | flex-direction: row; 367 | justify-content: center; 368 | width: 100%; 369 | height: auto; 370 | margin-top: 0.75em; 371 | } 372 | 373 | .DemoApp-content .form-field-button:focus { 374 | outline: none; 375 | user-select: none; 376 | } 377 | 378 | .DemoApp-content .form-field-button:hover { 379 | cursor: pointer; 380 | } 381 | 382 | .DemoApp-content .success { 383 | display: flex; 384 | flex-direction: column; 385 | align-items: center; 386 | font-size: 32px; 387 | margin: 5em 0 6.4em 0; 388 | color: #000; 389 | } 390 | 391 | 392 | 393 | /* 394 | * Animations 395 | */ 396 | 397 | @charset "UTF-8"; 398 | 399 | /*! 400 | * animate.css -http://daneden.me/animate 401 | * Version - 3.7.0 402 | * Licensed under the MIT license - http://opensource.org/licenses/MIT 403 | * 404 | * Copyright (c) 2018 Daniel Eden 405 | */ 406 | 407 | @-webkit-keyframes bounce { 408 | from, 409 | 20%, 410 | 53%, 411 | 80%, 412 | to { 413 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 414 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 415 | -webkit-transform: translate3d(0, 0, 0); 416 | transform: translate3d(0, 0, 0); 417 | } 418 | 419 | 40%, 420 | 43% { 421 | -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); 422 | animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); 423 | -webkit-transform: translate3d(0, -30px, 0); 424 | transform: translate3d(0, -30px, 0); 425 | } 426 | 427 | 70% { 428 | -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); 429 | animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); 430 | -webkit-transform: translate3d(0, -15px, 0); 431 | transform: translate3d(0, -15px, 0); 432 | } 433 | 434 | 90% { 435 | -webkit-transform: translate3d(0, -4px, 0); 436 | transform: translate3d(0, -4px, 0); 437 | } 438 | } 439 | 440 | @keyframes bounce { 441 | from, 442 | 20%, 443 | 53%, 444 | 80%, 445 | to { 446 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 447 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 448 | -webkit-transform: translate3d(0, 0, 0); 449 | transform: translate3d(0, 0, 0); 450 | } 451 | 452 | 40%, 453 | 43% { 454 | -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); 455 | animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); 456 | -webkit-transform: translate3d(0, -30px, 0); 457 | transform: translate3d(0, -30px, 0); 458 | } 459 | 460 | 70% { 461 | -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); 462 | animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); 463 | -webkit-transform: translate3d(0, -15px, 0); 464 | transform: translate3d(0, -15px, 0); 465 | } 466 | 467 | 90% { 468 | -webkit-transform: translate3d(0, -4px, 0); 469 | transform: translate3d(0, -4px, 0); 470 | } 471 | } 472 | 473 | .bounce { 474 | -webkit-animation-name: bounce; 475 | animation-name: bounce; 476 | -webkit-transform-origin: center bottom; 477 | transform-origin: center bottom; 478 | } 479 | 480 | @-webkit-keyframes flash { 481 | from, 482 | 50%, 483 | to { 484 | opacity: 1; 485 | } 486 | 487 | 25%, 488 | 75% { 489 | opacity: 0; 490 | } 491 | } 492 | 493 | @keyframes flash { 494 | from, 495 | 50%, 496 | to { 497 | opacity: 1; 498 | } 499 | 500 | 25%, 501 | 75% { 502 | opacity: 0; 503 | } 504 | } 505 | 506 | .flash { 507 | -webkit-animation-name: flash; 508 | animation-name: flash; 509 | } 510 | 511 | /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ 512 | 513 | @-webkit-keyframes pulse { 514 | from { 515 | -webkit-transform: scale3d(1, 1, 1); 516 | transform: scale3d(1, 1, 1); 517 | } 518 | 519 | 50% { 520 | -webkit-transform: scale3d(1.05, 1.05, 1.05); 521 | transform: scale3d(1.05, 1.05, 1.05); 522 | } 523 | 524 | to { 525 | -webkit-transform: scale3d(1, 1, 1); 526 | transform: scale3d(1, 1, 1); 527 | } 528 | } 529 | 530 | @keyframes pulse { 531 | from { 532 | -webkit-transform: scale3d(1, 1, 1); 533 | transform: scale3d(1, 1, 1); 534 | } 535 | 536 | 50% { 537 | -webkit-transform: scale3d(1.05, 1.05, 1.05); 538 | transform: scale3d(1.05, 1.05, 1.05); 539 | } 540 | 541 | to { 542 | -webkit-transform: scale3d(1, 1, 1); 543 | transform: scale3d(1, 1, 1); 544 | } 545 | } 546 | 547 | .pulse { 548 | -webkit-animation-name: pulse; 549 | animation-name: pulse; 550 | } 551 | 552 | @-webkit-keyframes rubberBand { 553 | from { 554 | -webkit-transform: scale3d(1, 1, 1); 555 | transform: scale3d(1, 1, 1); 556 | } 557 | 558 | 30% { 559 | -webkit-transform: scale3d(1.25, 0.75, 1); 560 | transform: scale3d(1.25, 0.75, 1); 561 | } 562 | 563 | 40% { 564 | -webkit-transform: scale3d(0.75, 1.25, 1); 565 | transform: scale3d(0.75, 1.25, 1); 566 | } 567 | 568 | 50% { 569 | -webkit-transform: scale3d(1.15, 0.85, 1); 570 | transform: scale3d(1.15, 0.85, 1); 571 | } 572 | 573 | 65% { 574 | -webkit-transform: scale3d(0.95, 1.05, 1); 575 | transform: scale3d(0.95, 1.05, 1); 576 | } 577 | 578 | 75% { 579 | -webkit-transform: scale3d(1.05, 0.95, 1); 580 | transform: scale3d(1.05, 0.95, 1); 581 | } 582 | 583 | to { 584 | -webkit-transform: scale3d(1, 1, 1); 585 | transform: scale3d(1, 1, 1); 586 | } 587 | } 588 | 589 | @keyframes rubberBand { 590 | from { 591 | -webkit-transform: scale3d(1, 1, 1); 592 | transform: scale3d(1, 1, 1); 593 | } 594 | 595 | 30% { 596 | -webkit-transform: scale3d(1.25, 0.75, 1); 597 | transform: scale3d(1.25, 0.75, 1); 598 | } 599 | 600 | 40% { 601 | -webkit-transform: scale3d(0.75, 1.25, 1); 602 | transform: scale3d(0.75, 1.25, 1); 603 | } 604 | 605 | 50% { 606 | -webkit-transform: scale3d(1.15, 0.85, 1); 607 | transform: scale3d(1.15, 0.85, 1); 608 | } 609 | 610 | 65% { 611 | -webkit-transform: scale3d(0.95, 1.05, 1); 612 | transform: scale3d(0.95, 1.05, 1); 613 | } 614 | 615 | 75% { 616 | -webkit-transform: scale3d(1.05, 0.95, 1); 617 | transform: scale3d(1.05, 0.95, 1); 618 | } 619 | 620 | to { 621 | -webkit-transform: scale3d(1, 1, 1); 622 | transform: scale3d(1, 1, 1); 623 | } 624 | } 625 | 626 | .rubberBand { 627 | -webkit-animation-name: rubberBand; 628 | animation-name: rubberBand; 629 | } 630 | 631 | @-webkit-keyframes shake { 632 | from, 633 | to { 634 | -webkit-transform: translate3d(0, 0, 0); 635 | transform: translate3d(0, 0, 0); 636 | } 637 | 638 | 10%, 639 | 30%, 640 | 50%, 641 | 70%, 642 | 90% { 643 | -webkit-transform: translate3d(-10px, 0, 0); 644 | transform: translate3d(-10px, 0, 0); 645 | } 646 | 647 | 20%, 648 | 40%, 649 | 60%, 650 | 80% { 651 | -webkit-transform: translate3d(10px, 0, 0); 652 | transform: translate3d(10px, 0, 0); 653 | } 654 | } 655 | 656 | @keyframes shake { 657 | from, 658 | to { 659 | -webkit-transform: translate3d(0, 0, 0); 660 | transform: translate3d(0, 0, 0); 661 | } 662 | 663 | 10%, 664 | 30%, 665 | 50%, 666 | 70%, 667 | 90% { 668 | -webkit-transform: translate3d(-10px, 0, 0); 669 | transform: translate3d(-10px, 0, 0); 670 | } 671 | 672 | 20%, 673 | 40%, 674 | 60%, 675 | 80% { 676 | -webkit-transform: translate3d(10px, 0, 0); 677 | transform: translate3d(10px, 0, 0); 678 | } 679 | } 680 | 681 | .shake { 682 | -webkit-animation-name: shake; 683 | animation-name: shake; 684 | } 685 | 686 | @-webkit-keyframes headShake { 687 | 0% { 688 | -webkit-transform: translateX(0); 689 | transform: translateX(0); 690 | } 691 | 692 | 6.5% { 693 | -webkit-transform: translateX(-6px) rotateY(-9deg); 694 | transform: translateX(-6px) rotateY(-9deg); 695 | } 696 | 697 | 18.5% { 698 | -webkit-transform: translateX(5px) rotateY(7deg); 699 | transform: translateX(5px) rotateY(7deg); 700 | } 701 | 702 | 31.5% { 703 | -webkit-transform: translateX(-3px) rotateY(-5deg); 704 | transform: translateX(-3px) rotateY(-5deg); 705 | } 706 | 707 | 43.5% { 708 | -webkit-transform: translateX(2px) rotateY(3deg); 709 | transform: translateX(2px) rotateY(3deg); 710 | } 711 | 712 | 50% { 713 | -webkit-transform: translateX(0); 714 | transform: translateX(0); 715 | } 716 | } 717 | 718 | @keyframes headShake { 719 | 0% { 720 | -webkit-transform: translateX(0); 721 | transform: translateX(0); 722 | } 723 | 724 | 6.5% { 725 | -webkit-transform: translateX(-6px) rotateY(-9deg); 726 | transform: translateX(-6px) rotateY(-9deg); 727 | } 728 | 729 | 18.5% { 730 | -webkit-transform: translateX(5px) rotateY(7deg); 731 | transform: translateX(5px) rotateY(7deg); 732 | } 733 | 734 | 31.5% { 735 | -webkit-transform: translateX(-3px) rotateY(-5deg); 736 | transform: translateX(-3px) rotateY(-5deg); 737 | } 738 | 739 | 43.5% { 740 | -webkit-transform: translateX(2px) rotateY(3deg); 741 | transform: translateX(2px) rotateY(3deg); 742 | } 743 | 744 | 50% { 745 | -webkit-transform: translateX(0); 746 | transform: translateX(0); 747 | } 748 | } 749 | 750 | .headShake { 751 | -webkit-animation-timing-function: ease-in-out; 752 | animation-timing-function: ease-in-out; 753 | -webkit-animation-name: headShake; 754 | animation-name: headShake; 755 | } 756 | 757 | @-webkit-keyframes swing { 758 | 20% { 759 | -webkit-transform: rotate3d(0, 0, 1, 15deg); 760 | transform: rotate3d(0, 0, 1, 15deg); 761 | } 762 | 763 | 40% { 764 | -webkit-transform: rotate3d(0, 0, 1, -10deg); 765 | transform: rotate3d(0, 0, 1, -10deg); 766 | } 767 | 768 | 60% { 769 | -webkit-transform: rotate3d(0, 0, 1, 5deg); 770 | transform: rotate3d(0, 0, 1, 5deg); 771 | } 772 | 773 | 80% { 774 | -webkit-transform: rotate3d(0, 0, 1, -5deg); 775 | transform: rotate3d(0, 0, 1, -5deg); 776 | } 777 | 778 | to { 779 | -webkit-transform: rotate3d(0, 0, 1, 0deg); 780 | transform: rotate3d(0, 0, 1, 0deg); 781 | } 782 | } 783 | 784 | @keyframes swing { 785 | 20% { 786 | -webkit-transform: rotate3d(0, 0, 1, 15deg); 787 | transform: rotate3d(0, 0, 1, 15deg); 788 | } 789 | 790 | 40% { 791 | -webkit-transform: rotate3d(0, 0, 1, -10deg); 792 | transform: rotate3d(0, 0, 1, -10deg); 793 | } 794 | 795 | 60% { 796 | -webkit-transform: rotate3d(0, 0, 1, 5deg); 797 | transform: rotate3d(0, 0, 1, 5deg); 798 | } 799 | 800 | 80% { 801 | -webkit-transform: rotate3d(0, 0, 1, -5deg); 802 | transform: rotate3d(0, 0, 1, -5deg); 803 | } 804 | 805 | to { 806 | -webkit-transform: rotate3d(0, 0, 1, 0deg); 807 | transform: rotate3d(0, 0, 1, 0deg); 808 | } 809 | } 810 | 811 | .swing { 812 | -webkit-transform-origin: top center; 813 | transform-origin: top center; 814 | -webkit-animation-name: swing; 815 | animation-name: swing; 816 | } 817 | 818 | @-webkit-keyframes tada { 819 | from { 820 | -webkit-transform: scale3d(1, 1, 1); 821 | transform: scale3d(1, 1, 1); 822 | } 823 | 824 | 10%, 825 | 20% { 826 | -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 827 | transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 828 | } 829 | 830 | 30%, 831 | 50%, 832 | 70%, 833 | 90% { 834 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 835 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 836 | } 837 | 838 | 40%, 839 | 60%, 840 | 80% { 841 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 842 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 843 | } 844 | 845 | to { 846 | -webkit-transform: scale3d(1, 1, 1); 847 | transform: scale3d(1, 1, 1); 848 | } 849 | } 850 | 851 | @keyframes tada { 852 | from { 853 | -webkit-transform: scale3d(1, 1, 1); 854 | transform: scale3d(1, 1, 1); 855 | } 856 | 857 | 10%, 858 | 20% { 859 | -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 860 | transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); 861 | } 862 | 863 | 30%, 864 | 50%, 865 | 70%, 866 | 90% { 867 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 868 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); 869 | } 870 | 871 | 40%, 872 | 60%, 873 | 80% { 874 | -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 875 | transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); 876 | } 877 | 878 | to { 879 | -webkit-transform: scale3d(1, 1, 1); 880 | transform: scale3d(1, 1, 1); 881 | } 882 | } 883 | 884 | .tada { 885 | -webkit-animation-name: tada; 886 | animation-name: tada; 887 | } 888 | 889 | /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ 890 | 891 | @-webkit-keyframes wobble { 892 | from { 893 | -webkit-transform: translate3d(0, 0, 0); 894 | transform: translate3d(0, 0, 0); 895 | } 896 | 897 | 15% { 898 | -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); 899 | transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); 900 | } 901 | 902 | 30% { 903 | -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); 904 | transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); 905 | } 906 | 907 | 45% { 908 | -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); 909 | transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); 910 | } 911 | 912 | 60% { 913 | -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); 914 | transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); 915 | } 916 | 917 | 75% { 918 | -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); 919 | transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); 920 | } 921 | 922 | to { 923 | -webkit-transform: translate3d(0, 0, 0); 924 | transform: translate3d(0, 0, 0); 925 | } 926 | } 927 | 928 | @keyframes wobble { 929 | from { 930 | -webkit-transform: translate3d(0, 0, 0); 931 | transform: translate3d(0, 0, 0); 932 | } 933 | 934 | 15% { 935 | -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); 936 | transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); 937 | } 938 | 939 | 30% { 940 | -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); 941 | transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); 942 | } 943 | 944 | 45% { 945 | -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); 946 | transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); 947 | } 948 | 949 | 60% { 950 | -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); 951 | transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); 952 | } 953 | 954 | 75% { 955 | -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); 956 | transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); 957 | } 958 | 959 | to { 960 | -webkit-transform: translate3d(0, 0, 0); 961 | transform: translate3d(0, 0, 0); 962 | } 963 | } 964 | 965 | .wobble { 966 | -webkit-animation-name: wobble; 967 | animation-name: wobble; 968 | } 969 | 970 | @-webkit-keyframes jello { 971 | from, 972 | 11.1%, 973 | to { 974 | -webkit-transform: translate3d(0, 0, 0); 975 | transform: translate3d(0, 0, 0); 976 | } 977 | 978 | 22.2% { 979 | -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); 980 | transform: skewX(-12.5deg) skewY(-12.5deg); 981 | } 982 | 983 | 33.3% { 984 | -webkit-transform: skewX(6.25deg) skewY(6.25deg); 985 | transform: skewX(6.25deg) skewY(6.25deg); 986 | } 987 | 988 | 44.4% { 989 | -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); 990 | transform: skewX(-3.125deg) skewY(-3.125deg); 991 | } 992 | 993 | 55.5% { 994 | -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); 995 | transform: skewX(1.5625deg) skewY(1.5625deg); 996 | } 997 | 998 | 66.6% { 999 | -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); 1000 | transform: skewX(-0.78125deg) skewY(-0.78125deg); 1001 | } 1002 | 1003 | 77.7% { 1004 | -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); 1005 | transform: skewX(0.390625deg) skewY(0.390625deg); 1006 | } 1007 | 1008 | 88.8% { 1009 | -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); 1010 | transform: skewX(-0.1953125deg) skewY(-0.1953125deg); 1011 | } 1012 | } 1013 | 1014 | @keyframes jello { 1015 | from, 1016 | 11.1%, 1017 | to { 1018 | -webkit-transform: translate3d(0, 0, 0); 1019 | transform: translate3d(0, 0, 0); 1020 | } 1021 | 1022 | 22.2% { 1023 | -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); 1024 | transform: skewX(-12.5deg) skewY(-12.5deg); 1025 | } 1026 | 1027 | 33.3% { 1028 | -webkit-transform: skewX(6.25deg) skewY(6.25deg); 1029 | transform: skewX(6.25deg) skewY(6.25deg); 1030 | } 1031 | 1032 | 44.4% { 1033 | -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); 1034 | transform: skewX(-3.125deg) skewY(-3.125deg); 1035 | } 1036 | 1037 | 55.5% { 1038 | -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); 1039 | transform: skewX(1.5625deg) skewY(1.5625deg); 1040 | } 1041 | 1042 | 66.6% { 1043 | -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); 1044 | transform: skewX(-0.78125deg) skewY(-0.78125deg); 1045 | } 1046 | 1047 | 77.7% { 1048 | -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); 1049 | transform: skewX(0.390625deg) skewY(0.390625deg); 1050 | } 1051 | 1052 | 88.8% { 1053 | -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); 1054 | transform: skewX(-0.1953125deg) skewY(-0.1953125deg); 1055 | } 1056 | } 1057 | 1058 | .jello { 1059 | -webkit-animation-name: jello; 1060 | animation-name: jello; 1061 | -webkit-transform-origin: center; 1062 | transform-origin: center; 1063 | } 1064 | 1065 | @-webkit-keyframes heartBeat { 1066 | 0% { 1067 | -webkit-transform: scale(1); 1068 | transform: scale(1); 1069 | } 1070 | 1071 | 14% { 1072 | -webkit-transform: scale(1.3); 1073 | transform: scale(1.3); 1074 | } 1075 | 1076 | 28% { 1077 | -webkit-transform: scale(1); 1078 | transform: scale(1); 1079 | } 1080 | 1081 | 42% { 1082 | -webkit-transform: scale(1.3); 1083 | transform: scale(1.3); 1084 | } 1085 | 1086 | 70% { 1087 | -webkit-transform: scale(1); 1088 | transform: scale(1); 1089 | } 1090 | } 1091 | 1092 | @keyframes heartBeat { 1093 | 0% { 1094 | -webkit-transform: scale(1); 1095 | transform: scale(1); 1096 | } 1097 | 1098 | 14% { 1099 | -webkit-transform: scale(1.3); 1100 | transform: scale(1.3); 1101 | } 1102 | 1103 | 28% { 1104 | -webkit-transform: scale(1); 1105 | transform: scale(1); 1106 | } 1107 | 1108 | 42% { 1109 | -webkit-transform: scale(1.3); 1110 | transform: scale(1.3); 1111 | } 1112 | 1113 | 70% { 1114 | -webkit-transform: scale(1); 1115 | transform: scale(1); 1116 | } 1117 | } 1118 | 1119 | .heartBeat { 1120 | -webkit-animation-name: heartBeat; 1121 | animation-name: heartBeat; 1122 | -webkit-animation-duration: 1.3s; 1123 | animation-duration: 1.3s; 1124 | -webkit-animation-timing-function: ease-in-out; 1125 | animation-timing-function: ease-in-out; 1126 | } 1127 | 1128 | @-webkit-keyframes bounceIn { 1129 | from, 1130 | 20%, 1131 | 40%, 1132 | 60%, 1133 | 80%, 1134 | to { 1135 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1136 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1137 | } 1138 | 1139 | 0% { 1140 | opacity: 0; 1141 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 1142 | transform: scale3d(0.3, 0.3, 0.3); 1143 | } 1144 | 1145 | 20% { 1146 | -webkit-transform: scale3d(1.1, 1.1, 1.1); 1147 | transform: scale3d(1.1, 1.1, 1.1); 1148 | } 1149 | 1150 | 40% { 1151 | -webkit-transform: scale3d(0.9, 0.9, 0.9); 1152 | transform: scale3d(0.9, 0.9, 0.9); 1153 | } 1154 | 1155 | 60% { 1156 | opacity: 1; 1157 | -webkit-transform: scale3d(1.03, 1.03, 1.03); 1158 | transform: scale3d(1.03, 1.03, 1.03); 1159 | } 1160 | 1161 | 80% { 1162 | -webkit-transform: scale3d(0.97, 0.97, 0.97); 1163 | transform: scale3d(0.97, 0.97, 0.97); 1164 | } 1165 | 1166 | to { 1167 | opacity: 1; 1168 | -webkit-transform: scale3d(1, 1, 1); 1169 | transform: scale3d(1, 1, 1); 1170 | } 1171 | } 1172 | 1173 | @keyframes bounceIn { 1174 | from, 1175 | 20%, 1176 | 40%, 1177 | 60%, 1178 | 80%, 1179 | to { 1180 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1181 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1182 | } 1183 | 1184 | 0% { 1185 | opacity: 0; 1186 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 1187 | transform: scale3d(0.3, 0.3, 0.3); 1188 | } 1189 | 1190 | 20% { 1191 | -webkit-transform: scale3d(1.1, 1.1, 1.1); 1192 | transform: scale3d(1.1, 1.1, 1.1); 1193 | } 1194 | 1195 | 40% { 1196 | -webkit-transform: scale3d(0.9, 0.9, 0.9); 1197 | transform: scale3d(0.9, 0.9, 0.9); 1198 | } 1199 | 1200 | 60% { 1201 | opacity: 1; 1202 | -webkit-transform: scale3d(1.03, 1.03, 1.03); 1203 | transform: scale3d(1.03, 1.03, 1.03); 1204 | } 1205 | 1206 | 80% { 1207 | -webkit-transform: scale3d(0.97, 0.97, 0.97); 1208 | transform: scale3d(0.97, 0.97, 0.97); 1209 | } 1210 | 1211 | to { 1212 | opacity: 1; 1213 | -webkit-transform: scale3d(1, 1, 1); 1214 | transform: scale3d(1, 1, 1); 1215 | } 1216 | } 1217 | 1218 | .bounceIn { 1219 | -webkit-animation-duration: 0.75s; 1220 | animation-duration: 0.75s; 1221 | -webkit-animation-name: bounceIn; 1222 | animation-name: bounceIn; 1223 | } 1224 | 1225 | @-webkit-keyframes bounceInDown { 1226 | from, 1227 | 60%, 1228 | 75%, 1229 | 90%, 1230 | to { 1231 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1232 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1233 | } 1234 | 1235 | 0% { 1236 | opacity: 0; 1237 | -webkit-transform: translate3d(0, -3000px, 0); 1238 | transform: translate3d(0, -3000px, 0); 1239 | } 1240 | 1241 | 60% { 1242 | opacity: 1; 1243 | -webkit-transform: translate3d(0, 25px, 0); 1244 | transform: translate3d(0, 25px, 0); 1245 | } 1246 | 1247 | 75% { 1248 | -webkit-transform: translate3d(0, -10px, 0); 1249 | transform: translate3d(0, -10px, 0); 1250 | } 1251 | 1252 | 90% { 1253 | -webkit-transform: translate3d(0, 5px, 0); 1254 | transform: translate3d(0, 5px, 0); 1255 | } 1256 | 1257 | to { 1258 | -webkit-transform: translate3d(0, 0, 0); 1259 | transform: translate3d(0, 0, 0); 1260 | } 1261 | } 1262 | 1263 | @keyframes bounceInDown { 1264 | from, 1265 | 60%, 1266 | 75%, 1267 | 90%, 1268 | to { 1269 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1270 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1271 | } 1272 | 1273 | 0% { 1274 | opacity: 0; 1275 | -webkit-transform: translate3d(0, -3000px, 0); 1276 | transform: translate3d(0, -3000px, 0); 1277 | } 1278 | 1279 | 60% { 1280 | opacity: 1; 1281 | -webkit-transform: translate3d(0, 25px, 0); 1282 | transform: translate3d(0, 25px, 0); 1283 | } 1284 | 1285 | 75% { 1286 | -webkit-transform: translate3d(0, -10px, 0); 1287 | transform: translate3d(0, -10px, 0); 1288 | } 1289 | 1290 | 90% { 1291 | -webkit-transform: translate3d(0, 5px, 0); 1292 | transform: translate3d(0, 5px, 0); 1293 | } 1294 | 1295 | to { 1296 | -webkit-transform: translate3d(0, 0, 0); 1297 | transform: translate3d(0, 0, 0); 1298 | } 1299 | } 1300 | 1301 | .bounceInDown { 1302 | -webkit-animation-name: bounceInDown; 1303 | animation-name: bounceInDown; 1304 | } 1305 | 1306 | @-webkit-keyframes bounceInLeft { 1307 | from, 1308 | 60%, 1309 | 75%, 1310 | 90%, 1311 | to { 1312 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1313 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1314 | } 1315 | 1316 | 0% { 1317 | opacity: 0; 1318 | -webkit-transform: translate3d(-3000px, 0, 0); 1319 | transform: translate3d(-3000px, 0, 0); 1320 | } 1321 | 1322 | 60% { 1323 | opacity: 1; 1324 | -webkit-transform: translate3d(25px, 0, 0); 1325 | transform: translate3d(25px, 0, 0); 1326 | } 1327 | 1328 | 75% { 1329 | -webkit-transform: translate3d(-10px, 0, 0); 1330 | transform: translate3d(-10px, 0, 0); 1331 | } 1332 | 1333 | 90% { 1334 | -webkit-transform: translate3d(5px, 0, 0); 1335 | transform: translate3d(5px, 0, 0); 1336 | } 1337 | 1338 | to { 1339 | -webkit-transform: translate3d(0, 0, 0); 1340 | transform: translate3d(0, 0, 0); 1341 | } 1342 | } 1343 | 1344 | @keyframes bounceInLeft { 1345 | from, 1346 | 60%, 1347 | 75%, 1348 | 90%, 1349 | to { 1350 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1351 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1352 | } 1353 | 1354 | 0% { 1355 | opacity: 0; 1356 | -webkit-transform: translate3d(-3000px, 0, 0); 1357 | transform: translate3d(-3000px, 0, 0); 1358 | } 1359 | 1360 | 60% { 1361 | opacity: 1; 1362 | -webkit-transform: translate3d(25px, 0, 0); 1363 | transform: translate3d(25px, 0, 0); 1364 | } 1365 | 1366 | 75% { 1367 | -webkit-transform: translate3d(-10px, 0, 0); 1368 | transform: translate3d(-10px, 0, 0); 1369 | } 1370 | 1371 | 90% { 1372 | -webkit-transform: translate3d(5px, 0, 0); 1373 | transform: translate3d(5px, 0, 0); 1374 | } 1375 | 1376 | to { 1377 | -webkit-transform: translate3d(0, 0, 0); 1378 | transform: translate3d(0, 0, 0); 1379 | } 1380 | } 1381 | 1382 | .bounceInLeft { 1383 | -webkit-animation-name: bounceInLeft; 1384 | animation-name: bounceInLeft; 1385 | } 1386 | 1387 | @-webkit-keyframes bounceInRight { 1388 | from, 1389 | 60%, 1390 | 75%, 1391 | 90%, 1392 | to { 1393 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1394 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1395 | } 1396 | 1397 | from { 1398 | opacity: 0; 1399 | -webkit-transform: translate3d(3000px, 0, 0); 1400 | transform: translate3d(3000px, 0, 0); 1401 | } 1402 | 1403 | 60% { 1404 | opacity: 1; 1405 | -webkit-transform: translate3d(-25px, 0, 0); 1406 | transform: translate3d(-25px, 0, 0); 1407 | } 1408 | 1409 | 75% { 1410 | -webkit-transform: translate3d(10px, 0, 0); 1411 | transform: translate3d(10px, 0, 0); 1412 | } 1413 | 1414 | 90% { 1415 | -webkit-transform: translate3d(-5px, 0, 0); 1416 | transform: translate3d(-5px, 0, 0); 1417 | } 1418 | 1419 | to { 1420 | -webkit-transform: translate3d(0, 0, 0); 1421 | transform: translate3d(0, 0, 0); 1422 | } 1423 | } 1424 | 1425 | @keyframes bounceInRight { 1426 | from, 1427 | 60%, 1428 | 75%, 1429 | 90%, 1430 | to { 1431 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1432 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1433 | } 1434 | 1435 | from { 1436 | opacity: 0; 1437 | -webkit-transform: translate3d(3000px, 0, 0); 1438 | transform: translate3d(3000px, 0, 0); 1439 | } 1440 | 1441 | 60% { 1442 | opacity: 1; 1443 | -webkit-transform: translate3d(-25px, 0, 0); 1444 | transform: translate3d(-25px, 0, 0); 1445 | } 1446 | 1447 | 75% { 1448 | -webkit-transform: translate3d(10px, 0, 0); 1449 | transform: translate3d(10px, 0, 0); 1450 | } 1451 | 1452 | 90% { 1453 | -webkit-transform: translate3d(-5px, 0, 0); 1454 | transform: translate3d(-5px, 0, 0); 1455 | } 1456 | 1457 | to { 1458 | -webkit-transform: translate3d(0, 0, 0); 1459 | transform: translate3d(0, 0, 0); 1460 | } 1461 | } 1462 | 1463 | .bounceInRight { 1464 | -webkit-animation-name: bounceInRight; 1465 | animation-name: bounceInRight; 1466 | } 1467 | 1468 | @-webkit-keyframes bounceInUp { 1469 | from, 1470 | 60%, 1471 | 75%, 1472 | 90%, 1473 | to { 1474 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1475 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1476 | } 1477 | 1478 | from { 1479 | opacity: 0; 1480 | -webkit-transform: translate3d(0, 3000px, 0); 1481 | transform: translate3d(0, 3000px, 0); 1482 | } 1483 | 1484 | 60% { 1485 | opacity: 1; 1486 | -webkit-transform: translate3d(0, -20px, 0); 1487 | transform: translate3d(0, -20px, 0); 1488 | } 1489 | 1490 | 75% { 1491 | -webkit-transform: translate3d(0, 10px, 0); 1492 | transform: translate3d(0, 10px, 0); 1493 | } 1494 | 1495 | 90% { 1496 | -webkit-transform: translate3d(0, -5px, 0); 1497 | transform: translate3d(0, -5px, 0); 1498 | } 1499 | 1500 | to { 1501 | -webkit-transform: translate3d(0, 0, 0); 1502 | transform: translate3d(0, 0, 0); 1503 | } 1504 | } 1505 | 1506 | @keyframes bounceInUp { 1507 | from, 1508 | 60%, 1509 | 75%, 1510 | 90%, 1511 | to { 1512 | -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1513 | animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); 1514 | } 1515 | 1516 | from { 1517 | opacity: 0; 1518 | -webkit-transform: translate3d(0, 3000px, 0); 1519 | transform: translate3d(0, 3000px, 0); 1520 | } 1521 | 1522 | 60% { 1523 | opacity: 1; 1524 | -webkit-transform: translate3d(0, -20px, 0); 1525 | transform: translate3d(0, -20px, 0); 1526 | } 1527 | 1528 | 75% { 1529 | -webkit-transform: translate3d(0, 10px, 0); 1530 | transform: translate3d(0, 10px, 0); 1531 | } 1532 | 1533 | 90% { 1534 | -webkit-transform: translate3d(0, -5px, 0); 1535 | transform: translate3d(0, -5px, 0); 1536 | } 1537 | 1538 | to { 1539 | -webkit-transform: translate3d(0, 0, 0); 1540 | transform: translate3d(0, 0, 0); 1541 | } 1542 | } 1543 | 1544 | .bounceInUp { 1545 | -webkit-animation-name: bounceInUp; 1546 | animation-name: bounceInUp; 1547 | } 1548 | 1549 | @-webkit-keyframes bounceOut { 1550 | 20% { 1551 | -webkit-transform: scale3d(0.9, 0.9, 0.9); 1552 | transform: scale3d(0.9, 0.9, 0.9); 1553 | } 1554 | 1555 | 50%, 1556 | 55% { 1557 | opacity: 1; 1558 | -webkit-transform: scale3d(1.1, 1.1, 1.1); 1559 | transform: scale3d(1.1, 1.1, 1.1); 1560 | } 1561 | 1562 | to { 1563 | opacity: 0; 1564 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 1565 | transform: scale3d(0.3, 0.3, 0.3); 1566 | } 1567 | } 1568 | 1569 | @keyframes bounceOut { 1570 | 20% { 1571 | -webkit-transform: scale3d(0.9, 0.9, 0.9); 1572 | transform: scale3d(0.9, 0.9, 0.9); 1573 | } 1574 | 1575 | 50%, 1576 | 55% { 1577 | opacity: 1; 1578 | -webkit-transform: scale3d(1.1, 1.1, 1.1); 1579 | transform: scale3d(1.1, 1.1, 1.1); 1580 | } 1581 | 1582 | to { 1583 | opacity: 0; 1584 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 1585 | transform: scale3d(0.3, 0.3, 0.3); 1586 | } 1587 | } 1588 | 1589 | .bounceOut { 1590 | -webkit-animation-duration: 0.75s; 1591 | animation-duration: 0.75s; 1592 | -webkit-animation-name: bounceOut; 1593 | animation-name: bounceOut; 1594 | } 1595 | 1596 | @-webkit-keyframes bounceOutDown { 1597 | 20% { 1598 | -webkit-transform: translate3d(0, 10px, 0); 1599 | transform: translate3d(0, 10px, 0); 1600 | } 1601 | 1602 | 40%, 1603 | 45% { 1604 | opacity: 1; 1605 | -webkit-transform: translate3d(0, -20px, 0); 1606 | transform: translate3d(0, -20px, 0); 1607 | } 1608 | 1609 | to { 1610 | opacity: 0; 1611 | -webkit-transform: translate3d(0, 2000px, 0); 1612 | transform: translate3d(0, 2000px, 0); 1613 | } 1614 | } 1615 | 1616 | @keyframes bounceOutDown { 1617 | 20% { 1618 | -webkit-transform: translate3d(0, 10px, 0); 1619 | transform: translate3d(0, 10px, 0); 1620 | } 1621 | 1622 | 40%, 1623 | 45% { 1624 | opacity: 1; 1625 | -webkit-transform: translate3d(0, -20px, 0); 1626 | transform: translate3d(0, -20px, 0); 1627 | } 1628 | 1629 | to { 1630 | opacity: 0; 1631 | -webkit-transform: translate3d(0, 2000px, 0); 1632 | transform: translate3d(0, 2000px, 0); 1633 | } 1634 | } 1635 | 1636 | .bounceOutDown { 1637 | -webkit-animation-name: bounceOutDown; 1638 | animation-name: bounceOutDown; 1639 | } 1640 | 1641 | @-webkit-keyframes bounceOutLeft { 1642 | 20% { 1643 | opacity: 1; 1644 | -webkit-transform: translate3d(20px, 0, 0); 1645 | transform: translate3d(20px, 0, 0); 1646 | } 1647 | 1648 | to { 1649 | opacity: 0; 1650 | -webkit-transform: translate3d(-2000px, 0, 0); 1651 | transform: translate3d(-2000px, 0, 0); 1652 | } 1653 | } 1654 | 1655 | @keyframes bounceOutLeft { 1656 | 20% { 1657 | opacity: 1; 1658 | -webkit-transform: translate3d(20px, 0, 0); 1659 | transform: translate3d(20px, 0, 0); 1660 | } 1661 | 1662 | to { 1663 | opacity: 0; 1664 | -webkit-transform: translate3d(-2000px, 0, 0); 1665 | transform: translate3d(-2000px, 0, 0); 1666 | } 1667 | } 1668 | 1669 | .bounceOutLeft { 1670 | -webkit-animation-name: bounceOutLeft; 1671 | animation-name: bounceOutLeft; 1672 | } 1673 | 1674 | @-webkit-keyframes bounceOutRight { 1675 | 20% { 1676 | opacity: 1; 1677 | -webkit-transform: translate3d(-20px, 0, 0); 1678 | transform: translate3d(-20px, 0, 0); 1679 | } 1680 | 1681 | to { 1682 | opacity: 0; 1683 | -webkit-transform: translate3d(2000px, 0, 0); 1684 | transform: translate3d(2000px, 0, 0); 1685 | } 1686 | } 1687 | 1688 | @keyframes bounceOutRight { 1689 | 20% { 1690 | opacity: 1; 1691 | -webkit-transform: translate3d(-20px, 0, 0); 1692 | transform: translate3d(-20px, 0, 0); 1693 | } 1694 | 1695 | to { 1696 | opacity: 0; 1697 | -webkit-transform: translate3d(2000px, 0, 0); 1698 | transform: translate3d(2000px, 0, 0); 1699 | } 1700 | } 1701 | 1702 | .bounceOutRight { 1703 | -webkit-animation-name: bounceOutRight; 1704 | animation-name: bounceOutRight; 1705 | } 1706 | 1707 | @-webkit-keyframes bounceOutUp { 1708 | 20% { 1709 | -webkit-transform: translate3d(0, -10px, 0); 1710 | transform: translate3d(0, -10px, 0); 1711 | } 1712 | 1713 | 40%, 1714 | 45% { 1715 | opacity: 1; 1716 | -webkit-transform: translate3d(0, 20px, 0); 1717 | transform: translate3d(0, 20px, 0); 1718 | } 1719 | 1720 | to { 1721 | opacity: 0; 1722 | -webkit-transform: translate3d(0, -2000px, 0); 1723 | transform: translate3d(0, -2000px, 0); 1724 | } 1725 | } 1726 | 1727 | @keyframes bounceOutUp { 1728 | 20% { 1729 | -webkit-transform: translate3d(0, -10px, 0); 1730 | transform: translate3d(0, -10px, 0); 1731 | } 1732 | 1733 | 40%, 1734 | 45% { 1735 | opacity: 1; 1736 | -webkit-transform: translate3d(0, 20px, 0); 1737 | transform: translate3d(0, 20px, 0); 1738 | } 1739 | 1740 | to { 1741 | opacity: 0; 1742 | -webkit-transform: translate3d(0, -2000px, 0); 1743 | transform: translate3d(0, -2000px, 0); 1744 | } 1745 | } 1746 | 1747 | .bounceOutUp { 1748 | -webkit-animation-name: bounceOutUp; 1749 | animation-name: bounceOutUp; 1750 | } 1751 | 1752 | @-webkit-keyframes fadeIn { 1753 | from { 1754 | opacity: 0; 1755 | } 1756 | 1757 | to { 1758 | opacity: 1; 1759 | } 1760 | } 1761 | 1762 | @keyframes fadeIn { 1763 | from { 1764 | opacity: 0; 1765 | } 1766 | 1767 | to { 1768 | opacity: 1; 1769 | } 1770 | } 1771 | 1772 | .fadeIn { 1773 | -webkit-animation-name: fadeIn; 1774 | animation-name: fadeIn; 1775 | } 1776 | 1777 | @-webkit-keyframes fadeInDown { 1778 | from { 1779 | opacity: 0; 1780 | -webkit-transform: translate3d(0, -100%, 0); 1781 | transform: translate3d(0, -100%, 0); 1782 | } 1783 | 1784 | to { 1785 | opacity: 1; 1786 | -webkit-transform: translate3d(0, 0, 0); 1787 | transform: translate3d(0, 0, 0); 1788 | } 1789 | } 1790 | 1791 | @keyframes fadeInDown { 1792 | from { 1793 | opacity: 0; 1794 | -webkit-transform: translate3d(0, -100%, 0); 1795 | transform: translate3d(0, -100%, 0); 1796 | } 1797 | 1798 | to { 1799 | opacity: 1; 1800 | -webkit-transform: translate3d(0, 0, 0); 1801 | transform: translate3d(0, 0, 0); 1802 | } 1803 | } 1804 | 1805 | .fadeInDown { 1806 | -webkit-animation-name: fadeInDown; 1807 | animation-name: fadeInDown; 1808 | } 1809 | 1810 | @-webkit-keyframes fadeInDownBig { 1811 | from { 1812 | opacity: 0; 1813 | -webkit-transform: translate3d(0, -2000px, 0); 1814 | transform: translate3d(0, -2000px, 0); 1815 | } 1816 | 1817 | to { 1818 | opacity: 1; 1819 | -webkit-transform: translate3d(0, 0, 0); 1820 | transform: translate3d(0, 0, 0); 1821 | } 1822 | } 1823 | 1824 | @keyframes fadeInDownBig { 1825 | from { 1826 | opacity: 0; 1827 | -webkit-transform: translate3d(0, -2000px, 0); 1828 | transform: translate3d(0, -2000px, 0); 1829 | } 1830 | 1831 | to { 1832 | opacity: 1; 1833 | -webkit-transform: translate3d(0, 0, 0); 1834 | transform: translate3d(0, 0, 0); 1835 | } 1836 | } 1837 | 1838 | .fadeInDownBig { 1839 | -webkit-animation-name: fadeInDownBig; 1840 | animation-name: fadeInDownBig; 1841 | } 1842 | 1843 | @-webkit-keyframes fadeInLeft { 1844 | from { 1845 | opacity: 0; 1846 | -webkit-transform: translate3d(-100%, 0, 0); 1847 | transform: translate3d(-100%, 0, 0); 1848 | } 1849 | 1850 | to { 1851 | opacity: 1; 1852 | -webkit-transform: translate3d(0, 0, 0); 1853 | transform: translate3d(0, 0, 0); 1854 | } 1855 | } 1856 | 1857 | @keyframes fadeInLeft { 1858 | from { 1859 | opacity: 0; 1860 | -webkit-transform: translate3d(-100%, 0, 0); 1861 | transform: translate3d(-100%, 0, 0); 1862 | } 1863 | 1864 | to { 1865 | opacity: 1; 1866 | -webkit-transform: translate3d(0, 0, 0); 1867 | transform: translate3d(0, 0, 0); 1868 | } 1869 | } 1870 | 1871 | .fadeInLeft { 1872 | -webkit-animation-name: fadeInLeft; 1873 | animation-name: fadeInLeft; 1874 | } 1875 | 1876 | @-webkit-keyframes fadeInLeftBig { 1877 | from { 1878 | opacity: 0; 1879 | -webkit-transform: translate3d(-2000px, 0, 0); 1880 | transform: translate3d(-2000px, 0, 0); 1881 | } 1882 | 1883 | to { 1884 | opacity: 1; 1885 | -webkit-transform: translate3d(0, 0, 0); 1886 | transform: translate3d(0, 0, 0); 1887 | } 1888 | } 1889 | 1890 | @keyframes fadeInLeftBig { 1891 | from { 1892 | opacity: 0; 1893 | -webkit-transform: translate3d(-2000px, 0, 0); 1894 | transform: translate3d(-2000px, 0, 0); 1895 | } 1896 | 1897 | to { 1898 | opacity: 1; 1899 | -webkit-transform: translate3d(0, 0, 0); 1900 | transform: translate3d(0, 0, 0); 1901 | } 1902 | } 1903 | 1904 | .fadeInLeftBig { 1905 | -webkit-animation-name: fadeInLeftBig; 1906 | animation-name: fadeInLeftBig; 1907 | } 1908 | 1909 | @-webkit-keyframes fadeInRight { 1910 | from { 1911 | opacity: 0; 1912 | -webkit-transform: translate3d(100%, 0, 0); 1913 | transform: translate3d(100%, 0, 0); 1914 | } 1915 | 1916 | to { 1917 | opacity: 1; 1918 | -webkit-transform: translate3d(0, 0, 0); 1919 | transform: translate3d(0, 0, 0); 1920 | } 1921 | } 1922 | 1923 | @keyframes fadeInRight { 1924 | from { 1925 | opacity: 0; 1926 | -webkit-transform: translate3d(100%, 0, 0); 1927 | transform: translate3d(100%, 0, 0); 1928 | } 1929 | 1930 | to { 1931 | opacity: 1; 1932 | -webkit-transform: translate3d(0, 0, 0); 1933 | transform: translate3d(0, 0, 0); 1934 | } 1935 | } 1936 | 1937 | .fadeInRight { 1938 | -webkit-animation-name: fadeInRight; 1939 | animation-name: fadeInRight; 1940 | } 1941 | 1942 | @-webkit-keyframes fadeInRightBig { 1943 | from { 1944 | opacity: 0; 1945 | -webkit-transform: translate3d(2000px, 0, 0); 1946 | transform: translate3d(2000px, 0, 0); 1947 | } 1948 | 1949 | to { 1950 | opacity: 1; 1951 | -webkit-transform: translate3d(0, 0, 0); 1952 | transform: translate3d(0, 0, 0); 1953 | } 1954 | } 1955 | 1956 | @keyframes fadeInRightBig { 1957 | from { 1958 | opacity: 0; 1959 | -webkit-transform: translate3d(2000px, 0, 0); 1960 | transform: translate3d(2000px, 0, 0); 1961 | } 1962 | 1963 | to { 1964 | opacity: 1; 1965 | -webkit-transform: translate3d(0, 0, 0); 1966 | transform: translate3d(0, 0, 0); 1967 | } 1968 | } 1969 | 1970 | .fadeInRightBig { 1971 | -webkit-animation-name: fadeInRightBig; 1972 | animation-name: fadeInRightBig; 1973 | } 1974 | 1975 | @-webkit-keyframes fadeInUp { 1976 | from { 1977 | opacity: 0; 1978 | -webkit-transform: translate3d(0, 100%, 0); 1979 | transform: translate3d(0, 100%, 0); 1980 | } 1981 | 1982 | to { 1983 | opacity: 1; 1984 | -webkit-transform: translate3d(0, 0, 0); 1985 | transform: translate3d(0, 0, 0); 1986 | } 1987 | } 1988 | 1989 | @keyframes fadeInUp { 1990 | from { 1991 | opacity: 0; 1992 | -webkit-transform: translate3d(0, 100%, 0); 1993 | transform: translate3d(0, 100%, 0); 1994 | } 1995 | 1996 | to { 1997 | opacity: 1; 1998 | -webkit-transform: translate3d(0, 0, 0); 1999 | transform: translate3d(0, 0, 0); 2000 | } 2001 | } 2002 | 2003 | .fadeInUp { 2004 | -webkit-animation-name: fadeInUp; 2005 | animation-name: fadeInUp; 2006 | } 2007 | 2008 | @-webkit-keyframes fadeInUpBig { 2009 | from { 2010 | opacity: 0; 2011 | -webkit-transform: translate3d(0, 2000px, 0); 2012 | transform: translate3d(0, 2000px, 0); 2013 | } 2014 | 2015 | to { 2016 | opacity: 1; 2017 | -webkit-transform: translate3d(0, 0, 0); 2018 | transform: translate3d(0, 0, 0); 2019 | } 2020 | } 2021 | 2022 | @keyframes fadeInUpBig { 2023 | from { 2024 | opacity: 0; 2025 | -webkit-transform: translate3d(0, 2000px, 0); 2026 | transform: translate3d(0, 2000px, 0); 2027 | } 2028 | 2029 | to { 2030 | opacity: 1; 2031 | -webkit-transform: translate3d(0, 0, 0); 2032 | transform: translate3d(0, 0, 0); 2033 | } 2034 | } 2035 | 2036 | .fadeInUpBig { 2037 | -webkit-animation-name: fadeInUpBig; 2038 | animation-name: fadeInUpBig; 2039 | } 2040 | 2041 | @-webkit-keyframes fadeOut { 2042 | from { 2043 | opacity: 1; 2044 | } 2045 | 2046 | to { 2047 | opacity: 0; 2048 | } 2049 | } 2050 | 2051 | @keyframes fadeOut { 2052 | from { 2053 | opacity: 1; 2054 | } 2055 | 2056 | to { 2057 | opacity: 0; 2058 | } 2059 | } 2060 | 2061 | .fadeOut { 2062 | -webkit-animation-name: fadeOut; 2063 | animation-name: fadeOut; 2064 | } 2065 | 2066 | @-webkit-keyframes fadeOutDown { 2067 | from { 2068 | opacity: 1; 2069 | } 2070 | 2071 | to { 2072 | opacity: 0; 2073 | -webkit-transform: translate3d(0, 100%, 0); 2074 | transform: translate3d(0, 100%, 0); 2075 | } 2076 | } 2077 | 2078 | @keyframes fadeOutDown { 2079 | from { 2080 | opacity: 1; 2081 | } 2082 | 2083 | to { 2084 | opacity: 0; 2085 | -webkit-transform: translate3d(0, 100%, 0); 2086 | transform: translate3d(0, 100%, 0); 2087 | } 2088 | } 2089 | 2090 | .fadeOutDown { 2091 | -webkit-animation-name: fadeOutDown; 2092 | animation-name: fadeOutDown; 2093 | } 2094 | 2095 | @-webkit-keyframes fadeOutDownBig { 2096 | from { 2097 | opacity: 1; 2098 | } 2099 | 2100 | to { 2101 | opacity: 0; 2102 | -webkit-transform: translate3d(0, 2000px, 0); 2103 | transform: translate3d(0, 2000px, 0); 2104 | } 2105 | } 2106 | 2107 | @keyframes fadeOutDownBig { 2108 | from { 2109 | opacity: 1; 2110 | } 2111 | 2112 | to { 2113 | opacity: 0; 2114 | -webkit-transform: translate3d(0, 2000px, 0); 2115 | transform: translate3d(0, 2000px, 0); 2116 | } 2117 | } 2118 | 2119 | .fadeOutDownBig { 2120 | -webkit-animation-name: fadeOutDownBig; 2121 | animation-name: fadeOutDownBig; 2122 | } 2123 | 2124 | @-webkit-keyframes fadeOutLeft { 2125 | from { 2126 | opacity: 1; 2127 | } 2128 | 2129 | to { 2130 | opacity: 0; 2131 | -webkit-transform: translate3d(-100%, 0, 0); 2132 | transform: translate3d(-100%, 0, 0); 2133 | } 2134 | } 2135 | 2136 | @keyframes fadeOutLeft { 2137 | from { 2138 | opacity: 1; 2139 | } 2140 | 2141 | to { 2142 | opacity: 0; 2143 | -webkit-transform: translate3d(-100%, 0, 0); 2144 | transform: translate3d(-100%, 0, 0); 2145 | } 2146 | } 2147 | 2148 | .fadeOutLeft { 2149 | -webkit-animation-name: fadeOutLeft; 2150 | animation-name: fadeOutLeft; 2151 | } 2152 | 2153 | @-webkit-keyframes fadeOutLeftBig { 2154 | from { 2155 | opacity: 1; 2156 | } 2157 | 2158 | to { 2159 | opacity: 0; 2160 | -webkit-transform: translate3d(-2000px, 0, 0); 2161 | transform: translate3d(-2000px, 0, 0); 2162 | } 2163 | } 2164 | 2165 | @keyframes fadeOutLeftBig { 2166 | from { 2167 | opacity: 1; 2168 | } 2169 | 2170 | to { 2171 | opacity: 0; 2172 | -webkit-transform: translate3d(-2000px, 0, 0); 2173 | transform: translate3d(-2000px, 0, 0); 2174 | } 2175 | } 2176 | 2177 | .fadeOutLeftBig { 2178 | -webkit-animation-name: fadeOutLeftBig; 2179 | animation-name: fadeOutLeftBig; 2180 | } 2181 | 2182 | @-webkit-keyframes fadeOutRight { 2183 | from { 2184 | opacity: 1; 2185 | } 2186 | 2187 | to { 2188 | opacity: 0; 2189 | -webkit-transform: translate3d(100%, 0, 0); 2190 | transform: translate3d(100%, 0, 0); 2191 | } 2192 | } 2193 | 2194 | @keyframes fadeOutRight { 2195 | from { 2196 | opacity: 1; 2197 | } 2198 | 2199 | to { 2200 | opacity: 0; 2201 | -webkit-transform: translate3d(100%, 0, 0); 2202 | transform: translate3d(100%, 0, 0); 2203 | } 2204 | } 2205 | 2206 | .fadeOutRight { 2207 | -webkit-animation-name: fadeOutRight; 2208 | animation-name: fadeOutRight; 2209 | } 2210 | 2211 | @-webkit-keyframes fadeOutRightBig { 2212 | from { 2213 | opacity: 1; 2214 | } 2215 | 2216 | to { 2217 | opacity: 0; 2218 | -webkit-transform: translate3d(2000px, 0, 0); 2219 | transform: translate3d(2000px, 0, 0); 2220 | } 2221 | } 2222 | 2223 | @keyframes fadeOutRightBig { 2224 | from { 2225 | opacity: 1; 2226 | } 2227 | 2228 | to { 2229 | opacity: 0; 2230 | -webkit-transform: translate3d(2000px, 0, 0); 2231 | transform: translate3d(2000px, 0, 0); 2232 | } 2233 | } 2234 | 2235 | .fadeOutRightBig { 2236 | -webkit-animation-name: fadeOutRightBig; 2237 | animation-name: fadeOutRightBig; 2238 | } 2239 | 2240 | @-webkit-keyframes fadeOutUp { 2241 | from { 2242 | opacity: 1; 2243 | } 2244 | 2245 | to { 2246 | opacity: 0; 2247 | -webkit-transform: translate3d(0, -100%, 0); 2248 | transform: translate3d(0, -100%, 0); 2249 | } 2250 | } 2251 | 2252 | @keyframes fadeOutUp { 2253 | from { 2254 | opacity: 1; 2255 | } 2256 | 2257 | to { 2258 | opacity: 0; 2259 | -webkit-transform: translate3d(0, -100%, 0); 2260 | transform: translate3d(0, -100%, 0); 2261 | } 2262 | } 2263 | 2264 | .fadeOutUp { 2265 | -webkit-animation-name: fadeOutUp; 2266 | animation-name: fadeOutUp; 2267 | } 2268 | 2269 | @-webkit-keyframes fadeOutUpBig { 2270 | from { 2271 | opacity: 1; 2272 | } 2273 | 2274 | to { 2275 | opacity: 0; 2276 | -webkit-transform: translate3d(0, -2000px, 0); 2277 | transform: translate3d(0, -2000px, 0); 2278 | } 2279 | } 2280 | 2281 | @keyframes fadeOutUpBig { 2282 | from { 2283 | opacity: 1; 2284 | } 2285 | 2286 | to { 2287 | opacity: 0; 2288 | -webkit-transform: translate3d(0, -2000px, 0); 2289 | transform: translate3d(0, -2000px, 0); 2290 | } 2291 | } 2292 | 2293 | .fadeOutUpBig { 2294 | -webkit-animation-name: fadeOutUpBig; 2295 | animation-name: fadeOutUpBig; 2296 | } 2297 | 2298 | @-webkit-keyframes flip { 2299 | from { 2300 | -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) 2301 | rotate3d(0, 1, 0, -360deg); 2302 | transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); 2303 | -webkit-animation-timing-function: ease-out; 2304 | animation-timing-function: ease-out; 2305 | } 2306 | 2307 | 40% { 2308 | -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) 2309 | rotate3d(0, 1, 0, -190deg); 2310 | transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) 2311 | rotate3d(0, 1, 0, -190deg); 2312 | -webkit-animation-timing-function: ease-out; 2313 | animation-timing-function: ease-out; 2314 | } 2315 | 2316 | 50% { 2317 | -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) 2318 | rotate3d(0, 1, 0, -170deg); 2319 | transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) 2320 | rotate3d(0, 1, 0, -170deg); 2321 | -webkit-animation-timing-function: ease-in; 2322 | animation-timing-function: ease-in; 2323 | } 2324 | 2325 | 80% { 2326 | -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) 2327 | rotate3d(0, 1, 0, 0deg); 2328 | transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) 2329 | rotate3d(0, 1, 0, 0deg); 2330 | -webkit-animation-timing-function: ease-in; 2331 | animation-timing-function: ease-in; 2332 | } 2333 | 2334 | to { 2335 | -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) 2336 | rotate3d(0, 1, 0, 0deg); 2337 | transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); 2338 | -webkit-animation-timing-function: ease-in; 2339 | animation-timing-function: ease-in; 2340 | } 2341 | } 2342 | 2343 | @keyframes flip { 2344 | from { 2345 | -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) 2346 | rotate3d(0, 1, 0, -360deg); 2347 | transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); 2348 | -webkit-animation-timing-function: ease-out; 2349 | animation-timing-function: ease-out; 2350 | } 2351 | 2352 | 40% { 2353 | -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) 2354 | rotate3d(0, 1, 0, -190deg); 2355 | transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) 2356 | rotate3d(0, 1, 0, -190deg); 2357 | -webkit-animation-timing-function: ease-out; 2358 | animation-timing-function: ease-out; 2359 | } 2360 | 2361 | 50% { 2362 | -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) 2363 | rotate3d(0, 1, 0, -170deg); 2364 | transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) 2365 | rotate3d(0, 1, 0, -170deg); 2366 | -webkit-animation-timing-function: ease-in; 2367 | animation-timing-function: ease-in; 2368 | } 2369 | 2370 | 80% { 2371 | -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) 2372 | rotate3d(0, 1, 0, 0deg); 2373 | transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) 2374 | rotate3d(0, 1, 0, 0deg); 2375 | -webkit-animation-timing-function: ease-in; 2376 | animation-timing-function: ease-in; 2377 | } 2378 | 2379 | to { 2380 | -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) 2381 | rotate3d(0, 1, 0, 0deg); 2382 | transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); 2383 | -webkit-animation-timing-function: ease-in; 2384 | animation-timing-function: ease-in; 2385 | } 2386 | } 2387 | 2388 | .animated.flip { 2389 | -webkit-backface-visibility: visible; 2390 | backface-visibility: visible; 2391 | -webkit-animation-name: flip; 2392 | animation-name: flip; 2393 | } 2394 | 2395 | @-webkit-keyframes flipInX { 2396 | from { 2397 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); 2398 | transform: perspective(400px) rotate3d(1, 0, 0, 90deg); 2399 | -webkit-animation-timing-function: ease-in; 2400 | animation-timing-function: ease-in; 2401 | opacity: 0; 2402 | } 2403 | 2404 | 40% { 2405 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); 2406 | transform: perspective(400px) rotate3d(1, 0, 0, -20deg); 2407 | -webkit-animation-timing-function: ease-in; 2408 | animation-timing-function: ease-in; 2409 | } 2410 | 2411 | 60% { 2412 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); 2413 | transform: perspective(400px) rotate3d(1, 0, 0, 10deg); 2414 | opacity: 1; 2415 | } 2416 | 2417 | 80% { 2418 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); 2419 | transform: perspective(400px) rotate3d(1, 0, 0, -5deg); 2420 | } 2421 | 2422 | to { 2423 | -webkit-transform: perspective(400px); 2424 | transform: perspective(400px); 2425 | } 2426 | } 2427 | 2428 | @keyframes flipInX { 2429 | from { 2430 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); 2431 | transform: perspective(400px) rotate3d(1, 0, 0, 90deg); 2432 | -webkit-animation-timing-function: ease-in; 2433 | animation-timing-function: ease-in; 2434 | opacity: 0; 2435 | } 2436 | 2437 | 40% { 2438 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); 2439 | transform: perspective(400px) rotate3d(1, 0, 0, -20deg); 2440 | -webkit-animation-timing-function: ease-in; 2441 | animation-timing-function: ease-in; 2442 | } 2443 | 2444 | 60% { 2445 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); 2446 | transform: perspective(400px) rotate3d(1, 0, 0, 10deg); 2447 | opacity: 1; 2448 | } 2449 | 2450 | 80% { 2451 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); 2452 | transform: perspective(400px) rotate3d(1, 0, 0, -5deg); 2453 | } 2454 | 2455 | to { 2456 | -webkit-transform: perspective(400px); 2457 | transform: perspective(400px); 2458 | } 2459 | } 2460 | 2461 | .flipInX { 2462 | -webkit-backface-visibility: visible !important; 2463 | backface-visibility: visible !important; 2464 | -webkit-animation-name: flipInX; 2465 | animation-name: flipInX; 2466 | } 2467 | 2468 | @-webkit-keyframes flipInY { 2469 | from { 2470 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); 2471 | transform: perspective(400px) rotate3d(0, 1, 0, 90deg); 2472 | -webkit-animation-timing-function: ease-in; 2473 | animation-timing-function: ease-in; 2474 | opacity: 0; 2475 | } 2476 | 2477 | 40% { 2478 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); 2479 | transform: perspective(400px) rotate3d(0, 1, 0, -20deg); 2480 | -webkit-animation-timing-function: ease-in; 2481 | animation-timing-function: ease-in; 2482 | } 2483 | 2484 | 60% { 2485 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); 2486 | transform: perspective(400px) rotate3d(0, 1, 0, 10deg); 2487 | opacity: 1; 2488 | } 2489 | 2490 | 80% { 2491 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); 2492 | transform: perspective(400px) rotate3d(0, 1, 0, -5deg); 2493 | } 2494 | 2495 | to { 2496 | -webkit-transform: perspective(400px); 2497 | transform: perspective(400px); 2498 | } 2499 | } 2500 | 2501 | @keyframes flipInY { 2502 | from { 2503 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); 2504 | transform: perspective(400px) rotate3d(0, 1, 0, 90deg); 2505 | -webkit-animation-timing-function: ease-in; 2506 | animation-timing-function: ease-in; 2507 | opacity: 0; 2508 | } 2509 | 2510 | 40% { 2511 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); 2512 | transform: perspective(400px) rotate3d(0, 1, 0, -20deg); 2513 | -webkit-animation-timing-function: ease-in; 2514 | animation-timing-function: ease-in; 2515 | } 2516 | 2517 | 60% { 2518 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); 2519 | transform: perspective(400px) rotate3d(0, 1, 0, 10deg); 2520 | opacity: 1; 2521 | } 2522 | 2523 | 80% { 2524 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); 2525 | transform: perspective(400px) rotate3d(0, 1, 0, -5deg); 2526 | } 2527 | 2528 | to { 2529 | -webkit-transform: perspective(400px); 2530 | transform: perspective(400px); 2531 | } 2532 | } 2533 | 2534 | .flipInY { 2535 | -webkit-backface-visibility: visible !important; 2536 | backface-visibility: visible !important; 2537 | -webkit-animation-name: flipInY; 2538 | animation-name: flipInY; 2539 | } 2540 | 2541 | @-webkit-keyframes flipOutX { 2542 | from { 2543 | -webkit-transform: perspective(400px); 2544 | transform: perspective(400px); 2545 | } 2546 | 2547 | 30% { 2548 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); 2549 | transform: perspective(400px) rotate3d(1, 0, 0, -20deg); 2550 | opacity: 1; 2551 | } 2552 | 2553 | to { 2554 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); 2555 | transform: perspective(400px) rotate3d(1, 0, 0, 90deg); 2556 | opacity: 0; 2557 | } 2558 | } 2559 | 2560 | @keyframes flipOutX { 2561 | from { 2562 | -webkit-transform: perspective(400px); 2563 | transform: perspective(400px); 2564 | } 2565 | 2566 | 30% { 2567 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); 2568 | transform: perspective(400px) rotate3d(1, 0, 0, -20deg); 2569 | opacity: 1; 2570 | } 2571 | 2572 | to { 2573 | -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); 2574 | transform: perspective(400px) rotate3d(1, 0, 0, 90deg); 2575 | opacity: 0; 2576 | } 2577 | } 2578 | 2579 | .flipOutX { 2580 | -webkit-animation-duration: 0.75s; 2581 | animation-duration: 0.75s; 2582 | -webkit-animation-name: flipOutX; 2583 | animation-name: flipOutX; 2584 | -webkit-backface-visibility: visible !important; 2585 | backface-visibility: visible !important; 2586 | } 2587 | 2588 | @-webkit-keyframes flipOutY { 2589 | from { 2590 | -webkit-transform: perspective(400px); 2591 | transform: perspective(400px); 2592 | } 2593 | 2594 | 30% { 2595 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); 2596 | transform: perspective(400px) rotate3d(0, 1, 0, -15deg); 2597 | opacity: 1; 2598 | } 2599 | 2600 | to { 2601 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); 2602 | transform: perspective(400px) rotate3d(0, 1, 0, 90deg); 2603 | opacity: 0; 2604 | } 2605 | } 2606 | 2607 | @keyframes flipOutY { 2608 | from { 2609 | -webkit-transform: perspective(400px); 2610 | transform: perspective(400px); 2611 | } 2612 | 2613 | 30% { 2614 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); 2615 | transform: perspective(400px) rotate3d(0, 1, 0, -15deg); 2616 | opacity: 1; 2617 | } 2618 | 2619 | to { 2620 | -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); 2621 | transform: perspective(400px) rotate3d(0, 1, 0, 90deg); 2622 | opacity: 0; 2623 | } 2624 | } 2625 | 2626 | .flipOutY { 2627 | -webkit-animation-duration: 0.75s; 2628 | animation-duration: 0.75s; 2629 | -webkit-backface-visibility: visible !important; 2630 | backface-visibility: visible !important; 2631 | -webkit-animation-name: flipOutY; 2632 | animation-name: flipOutY; 2633 | } 2634 | 2635 | @-webkit-keyframes lightSpeedIn { 2636 | from { 2637 | -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); 2638 | transform: translate3d(100%, 0, 0) skewX(-30deg); 2639 | opacity: 0; 2640 | } 2641 | 2642 | 60% { 2643 | -webkit-transform: skewX(20deg); 2644 | transform: skewX(20deg); 2645 | opacity: 1; 2646 | } 2647 | 2648 | 80% { 2649 | -webkit-transform: skewX(-5deg); 2650 | transform: skewX(-5deg); 2651 | } 2652 | 2653 | to { 2654 | -webkit-transform: translate3d(0, 0, 0); 2655 | transform: translate3d(0, 0, 0); 2656 | } 2657 | } 2658 | 2659 | @keyframes lightSpeedIn { 2660 | from { 2661 | -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); 2662 | transform: translate3d(100%, 0, 0) skewX(-30deg); 2663 | opacity: 0; 2664 | } 2665 | 2666 | 60% { 2667 | -webkit-transform: skewX(20deg); 2668 | transform: skewX(20deg); 2669 | opacity: 1; 2670 | } 2671 | 2672 | 80% { 2673 | -webkit-transform: skewX(-5deg); 2674 | transform: skewX(-5deg); 2675 | } 2676 | 2677 | to { 2678 | -webkit-transform: translate3d(0, 0, 0); 2679 | transform: translate3d(0, 0, 0); 2680 | } 2681 | } 2682 | 2683 | .lightSpeedIn { 2684 | -webkit-animation-name: lightSpeedIn; 2685 | animation-name: lightSpeedIn; 2686 | -webkit-animation-timing-function: ease-out; 2687 | animation-timing-function: ease-out; 2688 | } 2689 | 2690 | @-webkit-keyframes lightSpeedOut { 2691 | from { 2692 | opacity: 1; 2693 | } 2694 | 2695 | to { 2696 | -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); 2697 | transform: translate3d(100%, 0, 0) skewX(30deg); 2698 | opacity: 0; 2699 | } 2700 | } 2701 | 2702 | @keyframes lightSpeedOut { 2703 | from { 2704 | opacity: 1; 2705 | } 2706 | 2707 | to { 2708 | -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); 2709 | transform: translate3d(100%, 0, 0) skewX(30deg); 2710 | opacity: 0; 2711 | } 2712 | } 2713 | 2714 | .lightSpeedOut { 2715 | -webkit-animation-name: lightSpeedOut; 2716 | animation-name: lightSpeedOut; 2717 | -webkit-animation-timing-function: ease-in; 2718 | animation-timing-function: ease-in; 2719 | } 2720 | 2721 | @-webkit-keyframes rotateIn { 2722 | from { 2723 | -webkit-transform-origin: center; 2724 | transform-origin: center; 2725 | -webkit-transform: rotate3d(0, 0, 1, -200deg); 2726 | transform: rotate3d(0, 0, 1, -200deg); 2727 | opacity: 0; 2728 | } 2729 | 2730 | to { 2731 | -webkit-transform-origin: center; 2732 | transform-origin: center; 2733 | -webkit-transform: translate3d(0, 0, 0); 2734 | transform: translate3d(0, 0, 0); 2735 | opacity: 1; 2736 | } 2737 | } 2738 | 2739 | @keyframes rotateIn { 2740 | from { 2741 | -webkit-transform-origin: center; 2742 | transform-origin: center; 2743 | -webkit-transform: rotate3d(0, 0, 1, -200deg); 2744 | transform: rotate3d(0, 0, 1, -200deg); 2745 | opacity: 0; 2746 | } 2747 | 2748 | to { 2749 | -webkit-transform-origin: center; 2750 | transform-origin: center; 2751 | -webkit-transform: translate3d(0, 0, 0); 2752 | transform: translate3d(0, 0, 0); 2753 | opacity: 1; 2754 | } 2755 | } 2756 | 2757 | .rotateIn { 2758 | -webkit-animation-name: rotateIn; 2759 | animation-name: rotateIn; 2760 | } 2761 | 2762 | @-webkit-keyframes rotateInDownLeft { 2763 | from { 2764 | -webkit-transform-origin: left bottom; 2765 | transform-origin: left bottom; 2766 | -webkit-transform: rotate3d(0, 0, 1, -45deg); 2767 | transform: rotate3d(0, 0, 1, -45deg); 2768 | opacity: 0; 2769 | } 2770 | 2771 | to { 2772 | -webkit-transform-origin: left bottom; 2773 | transform-origin: left bottom; 2774 | -webkit-transform: translate3d(0, 0, 0); 2775 | transform: translate3d(0, 0, 0); 2776 | opacity: 1; 2777 | } 2778 | } 2779 | 2780 | @keyframes rotateInDownLeft { 2781 | from { 2782 | -webkit-transform-origin: left bottom; 2783 | transform-origin: left bottom; 2784 | -webkit-transform: rotate3d(0, 0, 1, -45deg); 2785 | transform: rotate3d(0, 0, 1, -45deg); 2786 | opacity: 0; 2787 | } 2788 | 2789 | to { 2790 | -webkit-transform-origin: left bottom; 2791 | transform-origin: left bottom; 2792 | -webkit-transform: translate3d(0, 0, 0); 2793 | transform: translate3d(0, 0, 0); 2794 | opacity: 1; 2795 | } 2796 | } 2797 | 2798 | .rotateInDownLeft { 2799 | -webkit-animation-name: rotateInDownLeft; 2800 | animation-name: rotateInDownLeft; 2801 | } 2802 | 2803 | @-webkit-keyframes rotateInDownRight { 2804 | from { 2805 | -webkit-transform-origin: right bottom; 2806 | transform-origin: right bottom; 2807 | -webkit-transform: rotate3d(0, 0, 1, 45deg); 2808 | transform: rotate3d(0, 0, 1, 45deg); 2809 | opacity: 0; 2810 | } 2811 | 2812 | to { 2813 | -webkit-transform-origin: right bottom; 2814 | transform-origin: right bottom; 2815 | -webkit-transform: translate3d(0, 0, 0); 2816 | transform: translate3d(0, 0, 0); 2817 | opacity: 1; 2818 | } 2819 | } 2820 | 2821 | @keyframes rotateInDownRight { 2822 | from { 2823 | -webkit-transform-origin: right bottom; 2824 | transform-origin: right bottom; 2825 | -webkit-transform: rotate3d(0, 0, 1, 45deg); 2826 | transform: rotate3d(0, 0, 1, 45deg); 2827 | opacity: 0; 2828 | } 2829 | 2830 | to { 2831 | -webkit-transform-origin: right bottom; 2832 | transform-origin: right bottom; 2833 | -webkit-transform: translate3d(0, 0, 0); 2834 | transform: translate3d(0, 0, 0); 2835 | opacity: 1; 2836 | } 2837 | } 2838 | 2839 | .rotateInDownRight { 2840 | -webkit-animation-name: rotateInDownRight; 2841 | animation-name: rotateInDownRight; 2842 | } 2843 | 2844 | @-webkit-keyframes rotateInUpLeft { 2845 | from { 2846 | -webkit-transform-origin: left bottom; 2847 | transform-origin: left bottom; 2848 | -webkit-transform: rotate3d(0, 0, 1, 45deg); 2849 | transform: rotate3d(0, 0, 1, 45deg); 2850 | opacity: 0; 2851 | } 2852 | 2853 | to { 2854 | -webkit-transform-origin: left bottom; 2855 | transform-origin: left bottom; 2856 | -webkit-transform: translate3d(0, 0, 0); 2857 | transform: translate3d(0, 0, 0); 2858 | opacity: 1; 2859 | } 2860 | } 2861 | 2862 | @keyframes rotateInUpLeft { 2863 | from { 2864 | -webkit-transform-origin: left bottom; 2865 | transform-origin: left bottom; 2866 | -webkit-transform: rotate3d(0, 0, 1, 45deg); 2867 | transform: rotate3d(0, 0, 1, 45deg); 2868 | opacity: 0; 2869 | } 2870 | 2871 | to { 2872 | -webkit-transform-origin: left bottom; 2873 | transform-origin: left bottom; 2874 | -webkit-transform: translate3d(0, 0, 0); 2875 | transform: translate3d(0, 0, 0); 2876 | opacity: 1; 2877 | } 2878 | } 2879 | 2880 | .rotateInUpLeft { 2881 | -webkit-animation-name: rotateInUpLeft; 2882 | animation-name: rotateInUpLeft; 2883 | } 2884 | 2885 | @-webkit-keyframes rotateInUpRight { 2886 | from { 2887 | -webkit-transform-origin: right bottom; 2888 | transform-origin: right bottom; 2889 | -webkit-transform: rotate3d(0, 0, 1, -90deg); 2890 | transform: rotate3d(0, 0, 1, -90deg); 2891 | opacity: 0; 2892 | } 2893 | 2894 | to { 2895 | -webkit-transform-origin: right bottom; 2896 | transform-origin: right bottom; 2897 | -webkit-transform: translate3d(0, 0, 0); 2898 | transform: translate3d(0, 0, 0); 2899 | opacity: 1; 2900 | } 2901 | } 2902 | 2903 | @keyframes rotateInUpRight { 2904 | from { 2905 | -webkit-transform-origin: right bottom; 2906 | transform-origin: right bottom; 2907 | -webkit-transform: rotate3d(0, 0, 1, -90deg); 2908 | transform: rotate3d(0, 0, 1, -90deg); 2909 | opacity: 0; 2910 | } 2911 | 2912 | to { 2913 | -webkit-transform-origin: right bottom; 2914 | transform-origin: right bottom; 2915 | -webkit-transform: translate3d(0, 0, 0); 2916 | transform: translate3d(0, 0, 0); 2917 | opacity: 1; 2918 | } 2919 | } 2920 | 2921 | .rotateInUpRight { 2922 | -webkit-animation-name: rotateInUpRight; 2923 | animation-name: rotateInUpRight; 2924 | } 2925 | 2926 | @-webkit-keyframes rotateOut { 2927 | from { 2928 | -webkit-transform-origin: center; 2929 | transform-origin: center; 2930 | opacity: 1; 2931 | } 2932 | 2933 | to { 2934 | -webkit-transform-origin: center; 2935 | transform-origin: center; 2936 | -webkit-transform: rotate3d(0, 0, 1, 200deg); 2937 | transform: rotate3d(0, 0, 1, 200deg); 2938 | opacity: 0; 2939 | } 2940 | } 2941 | 2942 | @keyframes rotateOut { 2943 | from { 2944 | -webkit-transform-origin: center; 2945 | transform-origin: center; 2946 | opacity: 1; 2947 | } 2948 | 2949 | to { 2950 | -webkit-transform-origin: center; 2951 | transform-origin: center; 2952 | -webkit-transform: rotate3d(0, 0, 1, 200deg); 2953 | transform: rotate3d(0, 0, 1, 200deg); 2954 | opacity: 0; 2955 | } 2956 | } 2957 | 2958 | .rotateOut { 2959 | -webkit-animation-name: rotateOut; 2960 | animation-name: rotateOut; 2961 | } 2962 | 2963 | @-webkit-keyframes rotateOutDownLeft { 2964 | from { 2965 | -webkit-transform-origin: left bottom; 2966 | transform-origin: left bottom; 2967 | opacity: 1; 2968 | } 2969 | 2970 | to { 2971 | -webkit-transform-origin: left bottom; 2972 | transform-origin: left bottom; 2973 | -webkit-transform: rotate3d(0, 0, 1, 45deg); 2974 | transform: rotate3d(0, 0, 1, 45deg); 2975 | opacity: 0; 2976 | } 2977 | } 2978 | 2979 | @keyframes rotateOutDownLeft { 2980 | from { 2981 | -webkit-transform-origin: left bottom; 2982 | transform-origin: left bottom; 2983 | opacity: 1; 2984 | } 2985 | 2986 | to { 2987 | -webkit-transform-origin: left bottom; 2988 | transform-origin: left bottom; 2989 | -webkit-transform: rotate3d(0, 0, 1, 45deg); 2990 | transform: rotate3d(0, 0, 1, 45deg); 2991 | opacity: 0; 2992 | } 2993 | } 2994 | 2995 | .rotateOutDownLeft { 2996 | -webkit-animation-name: rotateOutDownLeft; 2997 | animation-name: rotateOutDownLeft; 2998 | } 2999 | 3000 | @-webkit-keyframes rotateOutDownRight { 3001 | from { 3002 | -webkit-transform-origin: right bottom; 3003 | transform-origin: right bottom; 3004 | opacity: 1; 3005 | } 3006 | 3007 | to { 3008 | -webkit-transform-origin: right bottom; 3009 | transform-origin: right bottom; 3010 | -webkit-transform: rotate3d(0, 0, 1, -45deg); 3011 | transform: rotate3d(0, 0, 1, -45deg); 3012 | opacity: 0; 3013 | } 3014 | } 3015 | 3016 | @keyframes rotateOutDownRight { 3017 | from { 3018 | -webkit-transform-origin: right bottom; 3019 | transform-origin: right bottom; 3020 | opacity: 1; 3021 | } 3022 | 3023 | to { 3024 | -webkit-transform-origin: right bottom; 3025 | transform-origin: right bottom; 3026 | -webkit-transform: rotate3d(0, 0, 1, -45deg); 3027 | transform: rotate3d(0, 0, 1, -45deg); 3028 | opacity: 0; 3029 | } 3030 | } 3031 | 3032 | .rotateOutDownRight { 3033 | -webkit-animation-name: rotateOutDownRight; 3034 | animation-name: rotateOutDownRight; 3035 | } 3036 | 3037 | @-webkit-keyframes rotateOutUpLeft { 3038 | from { 3039 | -webkit-transform-origin: left bottom; 3040 | transform-origin: left bottom; 3041 | opacity: 1; 3042 | } 3043 | 3044 | to { 3045 | -webkit-transform-origin: left bottom; 3046 | transform-origin: left bottom; 3047 | -webkit-transform: rotate3d(0, 0, 1, -45deg); 3048 | transform: rotate3d(0, 0, 1, -45deg); 3049 | opacity: 0; 3050 | } 3051 | } 3052 | 3053 | @keyframes rotateOutUpLeft { 3054 | from { 3055 | -webkit-transform-origin: left bottom; 3056 | transform-origin: left bottom; 3057 | opacity: 1; 3058 | } 3059 | 3060 | to { 3061 | -webkit-transform-origin: left bottom; 3062 | transform-origin: left bottom; 3063 | -webkit-transform: rotate3d(0, 0, 1, -45deg); 3064 | transform: rotate3d(0, 0, 1, -45deg); 3065 | opacity: 0; 3066 | } 3067 | } 3068 | 3069 | .rotateOutUpLeft { 3070 | -webkit-animation-name: rotateOutUpLeft; 3071 | animation-name: rotateOutUpLeft; 3072 | } 3073 | 3074 | @-webkit-keyframes rotateOutUpRight { 3075 | from { 3076 | -webkit-transform-origin: right bottom; 3077 | transform-origin: right bottom; 3078 | opacity: 1; 3079 | } 3080 | 3081 | to { 3082 | -webkit-transform-origin: right bottom; 3083 | transform-origin: right bottom; 3084 | -webkit-transform: rotate3d(0, 0, 1, 90deg); 3085 | transform: rotate3d(0, 0, 1, 90deg); 3086 | opacity: 0; 3087 | } 3088 | } 3089 | 3090 | @keyframes rotateOutUpRight { 3091 | from { 3092 | -webkit-transform-origin: right bottom; 3093 | transform-origin: right bottom; 3094 | opacity: 1; 3095 | } 3096 | 3097 | to { 3098 | -webkit-transform-origin: right bottom; 3099 | transform-origin: right bottom; 3100 | -webkit-transform: rotate3d(0, 0, 1, 90deg); 3101 | transform: rotate3d(0, 0, 1, 90deg); 3102 | opacity: 0; 3103 | } 3104 | } 3105 | 3106 | .rotateOutUpRight { 3107 | -webkit-animation-name: rotateOutUpRight; 3108 | animation-name: rotateOutUpRight; 3109 | } 3110 | 3111 | @-webkit-keyframes hinge { 3112 | 0% { 3113 | -webkit-transform-origin: top left; 3114 | transform-origin: top left; 3115 | -webkit-animation-timing-function: ease-in-out; 3116 | animation-timing-function: ease-in-out; 3117 | } 3118 | 3119 | 20%, 3120 | 60% { 3121 | -webkit-transform: rotate3d(0, 0, 1, 80deg); 3122 | transform: rotate3d(0, 0, 1, 80deg); 3123 | -webkit-transform-origin: top left; 3124 | transform-origin: top left; 3125 | -webkit-animation-timing-function: ease-in-out; 3126 | animation-timing-function: ease-in-out; 3127 | } 3128 | 3129 | 40%, 3130 | 80% { 3131 | -webkit-transform: rotate3d(0, 0, 1, 60deg); 3132 | transform: rotate3d(0, 0, 1, 60deg); 3133 | -webkit-transform-origin: top left; 3134 | transform-origin: top left; 3135 | -webkit-animation-timing-function: ease-in-out; 3136 | animation-timing-function: ease-in-out; 3137 | opacity: 1; 3138 | } 3139 | 3140 | to { 3141 | -webkit-transform: translate3d(0, 700px, 0); 3142 | transform: translate3d(0, 700px, 0); 3143 | opacity: 0; 3144 | } 3145 | } 3146 | 3147 | @keyframes hinge { 3148 | 0% { 3149 | -webkit-transform-origin: top left; 3150 | transform-origin: top left; 3151 | -webkit-animation-timing-function: ease-in-out; 3152 | animation-timing-function: ease-in-out; 3153 | } 3154 | 3155 | 20%, 3156 | 60% { 3157 | -webkit-transform: rotate3d(0, 0, 1, 80deg); 3158 | transform: rotate3d(0, 0, 1, 80deg); 3159 | -webkit-transform-origin: top left; 3160 | transform-origin: top left; 3161 | -webkit-animation-timing-function: ease-in-out; 3162 | animation-timing-function: ease-in-out; 3163 | } 3164 | 3165 | 40%, 3166 | 80% { 3167 | -webkit-transform: rotate3d(0, 0, 1, 60deg); 3168 | transform: rotate3d(0, 0, 1, 60deg); 3169 | -webkit-transform-origin: top left; 3170 | transform-origin: top left; 3171 | -webkit-animation-timing-function: ease-in-out; 3172 | animation-timing-function: ease-in-out; 3173 | opacity: 1; 3174 | } 3175 | 3176 | to { 3177 | -webkit-transform: translate3d(0, 700px, 0); 3178 | transform: translate3d(0, 700px, 0); 3179 | opacity: 0; 3180 | } 3181 | } 3182 | 3183 | .hinge { 3184 | -webkit-animation-duration: 2s; 3185 | animation-duration: 2s; 3186 | -webkit-animation-name: hinge; 3187 | animation-name: hinge; 3188 | } 3189 | 3190 | @-webkit-keyframes jackInTheBox { 3191 | from { 3192 | opacity: 0; 3193 | -webkit-transform: scale(0.1) rotate(30deg); 3194 | transform: scale(0.1) rotate(30deg); 3195 | -webkit-transform-origin: center bottom; 3196 | transform-origin: center bottom; 3197 | } 3198 | 3199 | 50% { 3200 | -webkit-transform: rotate(-10deg); 3201 | transform: rotate(-10deg); 3202 | } 3203 | 3204 | 70% { 3205 | -webkit-transform: rotate(3deg); 3206 | transform: rotate(3deg); 3207 | } 3208 | 3209 | to { 3210 | opacity: 1; 3211 | -webkit-transform: scale(1); 3212 | transform: scale(1); 3213 | } 3214 | } 3215 | 3216 | @keyframes jackInTheBox { 3217 | from { 3218 | opacity: 0; 3219 | -webkit-transform: scale(0.1) rotate(30deg); 3220 | transform: scale(0.1) rotate(30deg); 3221 | -webkit-transform-origin: center bottom; 3222 | transform-origin: center bottom; 3223 | } 3224 | 3225 | 50% { 3226 | -webkit-transform: rotate(-10deg); 3227 | transform: rotate(-10deg); 3228 | } 3229 | 3230 | 70% { 3231 | -webkit-transform: rotate(3deg); 3232 | transform: rotate(3deg); 3233 | } 3234 | 3235 | to { 3236 | opacity: 1; 3237 | -webkit-transform: scale(1); 3238 | transform: scale(1); 3239 | } 3240 | } 3241 | 3242 | .jackInTheBox { 3243 | -webkit-animation-name: jackInTheBox; 3244 | animation-name: jackInTheBox; 3245 | } 3246 | 3247 | /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ 3248 | 3249 | @-webkit-keyframes rollIn { 3250 | from { 3251 | opacity: 0; 3252 | -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); 3253 | transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); 3254 | } 3255 | 3256 | to { 3257 | opacity: 1; 3258 | -webkit-transform: translate3d(0, 0, 0); 3259 | transform: translate3d(0, 0, 0); 3260 | } 3261 | } 3262 | 3263 | @keyframes rollIn { 3264 | from { 3265 | opacity: 0; 3266 | -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); 3267 | transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); 3268 | } 3269 | 3270 | to { 3271 | opacity: 1; 3272 | -webkit-transform: translate3d(0, 0, 0); 3273 | transform: translate3d(0, 0, 0); 3274 | } 3275 | } 3276 | 3277 | .rollIn { 3278 | -webkit-animation-name: rollIn; 3279 | animation-name: rollIn; 3280 | } 3281 | 3282 | /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ 3283 | 3284 | @-webkit-keyframes rollOut { 3285 | from { 3286 | opacity: 1; 3287 | } 3288 | 3289 | to { 3290 | opacity: 0; 3291 | -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); 3292 | transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); 3293 | } 3294 | } 3295 | 3296 | @keyframes rollOut { 3297 | from { 3298 | opacity: 1; 3299 | } 3300 | 3301 | to { 3302 | opacity: 0; 3303 | -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); 3304 | transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); 3305 | } 3306 | } 3307 | 3308 | .rollOut { 3309 | -webkit-animation-name: rollOut; 3310 | animation-name: rollOut; 3311 | } 3312 | 3313 | @-webkit-keyframes zoomIn { 3314 | from { 3315 | opacity: 0; 3316 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 3317 | transform: scale3d(0.3, 0.3, 0.3); 3318 | } 3319 | 3320 | 50% { 3321 | opacity: 1; 3322 | } 3323 | } 3324 | 3325 | @keyframes zoomIn { 3326 | from { 3327 | opacity: 0; 3328 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 3329 | transform: scale3d(0.3, 0.3, 0.3); 3330 | } 3331 | 3332 | 50% { 3333 | opacity: 1; 3334 | } 3335 | } 3336 | 3337 | .zoomIn { 3338 | -webkit-animation-name: zoomIn; 3339 | animation-name: zoomIn; 3340 | } 3341 | 3342 | @-webkit-keyframes zoomInDown { 3343 | from { 3344 | opacity: 0; 3345 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); 3346 | transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); 3347 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3348 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3349 | } 3350 | 3351 | 60% { 3352 | opacity: 1; 3353 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); 3354 | transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); 3355 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3356 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3357 | } 3358 | } 3359 | 3360 | @keyframes zoomInDown { 3361 | from { 3362 | opacity: 0; 3363 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); 3364 | transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); 3365 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3366 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3367 | } 3368 | 3369 | 60% { 3370 | opacity: 1; 3371 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); 3372 | transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); 3373 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3374 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3375 | } 3376 | } 3377 | 3378 | .zoomInDown { 3379 | -webkit-animation-name: zoomInDown; 3380 | animation-name: zoomInDown; 3381 | } 3382 | 3383 | @-webkit-keyframes zoomInLeft { 3384 | from { 3385 | opacity: 0; 3386 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); 3387 | transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); 3388 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3389 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3390 | } 3391 | 3392 | 60% { 3393 | opacity: 1; 3394 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); 3395 | transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); 3396 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3397 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3398 | } 3399 | } 3400 | 3401 | @keyframes zoomInLeft { 3402 | from { 3403 | opacity: 0; 3404 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); 3405 | transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); 3406 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3407 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3408 | } 3409 | 3410 | 60% { 3411 | opacity: 1; 3412 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); 3413 | transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); 3414 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3415 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3416 | } 3417 | } 3418 | 3419 | .zoomInLeft { 3420 | -webkit-animation-name: zoomInLeft; 3421 | animation-name: zoomInLeft; 3422 | } 3423 | 3424 | @-webkit-keyframes zoomInRight { 3425 | from { 3426 | opacity: 0; 3427 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); 3428 | transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); 3429 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3430 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3431 | } 3432 | 3433 | 60% { 3434 | opacity: 1; 3435 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); 3436 | transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); 3437 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3438 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3439 | } 3440 | } 3441 | 3442 | @keyframes zoomInRight { 3443 | from { 3444 | opacity: 0; 3445 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); 3446 | transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); 3447 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3448 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3449 | } 3450 | 3451 | 60% { 3452 | opacity: 1; 3453 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); 3454 | transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); 3455 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3456 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3457 | } 3458 | } 3459 | 3460 | .zoomInRight { 3461 | -webkit-animation-name: zoomInRight; 3462 | animation-name: zoomInRight; 3463 | } 3464 | 3465 | @-webkit-keyframes zoomInUp { 3466 | from { 3467 | opacity: 0; 3468 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); 3469 | transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); 3470 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3471 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3472 | } 3473 | 3474 | 60% { 3475 | opacity: 1; 3476 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); 3477 | transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); 3478 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3479 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3480 | } 3481 | } 3482 | 3483 | @keyframes zoomInUp { 3484 | from { 3485 | opacity: 0; 3486 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); 3487 | transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); 3488 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3489 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3490 | } 3491 | 3492 | 60% { 3493 | opacity: 1; 3494 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); 3495 | transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); 3496 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3497 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3498 | } 3499 | } 3500 | 3501 | .zoomInUp { 3502 | -webkit-animation-name: zoomInUp; 3503 | animation-name: zoomInUp; 3504 | } 3505 | 3506 | @-webkit-keyframes zoomOut { 3507 | from { 3508 | opacity: 1; 3509 | } 3510 | 3511 | 50% { 3512 | opacity: 0; 3513 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 3514 | transform: scale3d(0.3, 0.3, 0.3); 3515 | } 3516 | 3517 | to { 3518 | opacity: 0; 3519 | } 3520 | } 3521 | 3522 | @keyframes zoomOut { 3523 | from { 3524 | opacity: 1; 3525 | } 3526 | 3527 | 50% { 3528 | opacity: 0; 3529 | -webkit-transform: scale3d(0.3, 0.3, 0.3); 3530 | transform: scale3d(0.3, 0.3, 0.3); 3531 | } 3532 | 3533 | to { 3534 | opacity: 0; 3535 | } 3536 | } 3537 | 3538 | .zoomOut { 3539 | -webkit-animation-name: zoomOut; 3540 | animation-name: zoomOut; 3541 | } 3542 | 3543 | @-webkit-keyframes zoomOutDown { 3544 | 40% { 3545 | opacity: 1; 3546 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); 3547 | transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); 3548 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3549 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3550 | } 3551 | 3552 | to { 3553 | opacity: 0; 3554 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); 3555 | transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); 3556 | -webkit-transform-origin: center bottom; 3557 | transform-origin: center bottom; 3558 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3559 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3560 | } 3561 | } 3562 | 3563 | @keyframes zoomOutDown { 3564 | 40% { 3565 | opacity: 1; 3566 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); 3567 | transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); 3568 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3569 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3570 | } 3571 | 3572 | to { 3573 | opacity: 0; 3574 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); 3575 | transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); 3576 | -webkit-transform-origin: center bottom; 3577 | transform-origin: center bottom; 3578 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3579 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3580 | } 3581 | } 3582 | 3583 | .zoomOutDown { 3584 | -webkit-animation-name: zoomOutDown; 3585 | animation-name: zoomOutDown; 3586 | } 3587 | 3588 | @-webkit-keyframes zoomOutLeft { 3589 | 40% { 3590 | opacity: 1; 3591 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); 3592 | transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); 3593 | } 3594 | 3595 | to { 3596 | opacity: 0; 3597 | -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); 3598 | transform: scale(0.1) translate3d(-2000px, 0, 0); 3599 | -webkit-transform-origin: left center; 3600 | transform-origin: left center; 3601 | } 3602 | } 3603 | 3604 | @keyframes zoomOutLeft { 3605 | 40% { 3606 | opacity: 1; 3607 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); 3608 | transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); 3609 | } 3610 | 3611 | to { 3612 | opacity: 0; 3613 | -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); 3614 | transform: scale(0.1) translate3d(-2000px, 0, 0); 3615 | -webkit-transform-origin: left center; 3616 | transform-origin: left center; 3617 | } 3618 | } 3619 | 3620 | .zoomOutLeft { 3621 | -webkit-animation-name: zoomOutLeft; 3622 | animation-name: zoomOutLeft; 3623 | } 3624 | 3625 | @-webkit-keyframes zoomOutRight { 3626 | 40% { 3627 | opacity: 1; 3628 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); 3629 | transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); 3630 | } 3631 | 3632 | to { 3633 | opacity: 0; 3634 | -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); 3635 | transform: scale(0.1) translate3d(2000px, 0, 0); 3636 | -webkit-transform-origin: right center; 3637 | transform-origin: right center; 3638 | } 3639 | } 3640 | 3641 | @keyframes zoomOutRight { 3642 | 40% { 3643 | opacity: 1; 3644 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); 3645 | transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); 3646 | } 3647 | 3648 | to { 3649 | opacity: 0; 3650 | -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); 3651 | transform: scale(0.1) translate3d(2000px, 0, 0); 3652 | -webkit-transform-origin: right center; 3653 | transform-origin: right center; 3654 | } 3655 | } 3656 | 3657 | .zoomOutRight { 3658 | -webkit-animation-name: zoomOutRight; 3659 | animation-name: zoomOutRight; 3660 | } 3661 | 3662 | @-webkit-keyframes zoomOutUp { 3663 | 40% { 3664 | opacity: 1; 3665 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); 3666 | transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); 3667 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3668 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3669 | } 3670 | 3671 | to { 3672 | opacity: 0; 3673 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); 3674 | transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); 3675 | -webkit-transform-origin: center bottom; 3676 | transform-origin: center bottom; 3677 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3678 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3679 | } 3680 | } 3681 | 3682 | @keyframes zoomOutUp { 3683 | 40% { 3684 | opacity: 1; 3685 | -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); 3686 | transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); 3687 | -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3688 | animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); 3689 | } 3690 | 3691 | to { 3692 | opacity: 0; 3693 | -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); 3694 | transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); 3695 | -webkit-transform-origin: center bottom; 3696 | transform-origin: center bottom; 3697 | -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3698 | animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); 3699 | } 3700 | } 3701 | 3702 | .zoomOutUp { 3703 | -webkit-animation-name: zoomOutUp; 3704 | animation-name: zoomOutUp; 3705 | } 3706 | 3707 | @-webkit-keyframes slideInDown { 3708 | from { 3709 | -webkit-transform: translate3d(0, -100%, 0); 3710 | transform: translate3d(0, -100%, 0); 3711 | visibility: visible; 3712 | } 3713 | 3714 | to { 3715 | -webkit-transform: translate3d(0, 0, 0); 3716 | transform: translate3d(0, 0, 0); 3717 | } 3718 | } 3719 | 3720 | @keyframes slideInDown { 3721 | from { 3722 | -webkit-transform: translate3d(0, -100%, 0); 3723 | transform: translate3d(0, -100%, 0); 3724 | visibility: visible; 3725 | } 3726 | 3727 | to { 3728 | -webkit-transform: translate3d(0, 0, 0); 3729 | transform: translate3d(0, 0, 0); 3730 | } 3731 | } 3732 | 3733 | .slideInDown { 3734 | -webkit-animation-name: slideInDown; 3735 | animation-name: slideInDown; 3736 | } 3737 | 3738 | @-webkit-keyframes slideInLeft { 3739 | from { 3740 | -webkit-transform: translate3d(-100%, 0, 0); 3741 | transform: translate3d(-100%, 0, 0); 3742 | visibility: visible; 3743 | } 3744 | 3745 | to { 3746 | -webkit-transform: translate3d(0, 0, 0); 3747 | transform: translate3d(0, 0, 0); 3748 | } 3749 | } 3750 | 3751 | @keyframes slideInLeft { 3752 | from { 3753 | -webkit-transform: translate3d(-100%, 0, 0); 3754 | transform: translate3d(-100%, 0, 0); 3755 | visibility: visible; 3756 | } 3757 | 3758 | to { 3759 | -webkit-transform: translate3d(0, 0, 0); 3760 | transform: translate3d(0, 0, 0); 3761 | } 3762 | } 3763 | 3764 | .slideInLeft { 3765 | -webkit-animation-name: slideInLeft; 3766 | animation-name: slideInLeft; 3767 | } 3768 | 3769 | @-webkit-keyframes slideInRight { 3770 | from { 3771 | -webkit-transform: translate3d(100%, 0, 0); 3772 | transform: translate3d(100%, 0, 0); 3773 | visibility: visible; 3774 | } 3775 | 3776 | to { 3777 | -webkit-transform: translate3d(0, 0, 0); 3778 | transform: translate3d(0, 0, 0); 3779 | } 3780 | } 3781 | 3782 | @keyframes slideInRight { 3783 | from { 3784 | -webkit-transform: translate3d(100%, 0, 0); 3785 | transform: translate3d(100%, 0, 0); 3786 | visibility: visible; 3787 | } 3788 | 3789 | to { 3790 | -webkit-transform: translate3d(0, 0, 0); 3791 | transform: translate3d(0, 0, 0); 3792 | } 3793 | } 3794 | 3795 | .slideInRight { 3796 | -webkit-animation-name: slideInRight; 3797 | animation-name: slideInRight; 3798 | } 3799 | 3800 | @-webkit-keyframes slideInUp { 3801 | from { 3802 | -webkit-transform: translate3d(0, 100%, 0); 3803 | transform: translate3d(0, 100%, 0); 3804 | visibility: visible; 3805 | } 3806 | 3807 | to { 3808 | -webkit-transform: translate3d(0, 0, 0); 3809 | transform: translate3d(0, 0, 0); 3810 | } 3811 | } 3812 | 3813 | @keyframes slideInUp { 3814 | from { 3815 | -webkit-transform: translate3d(0, 100%, 0); 3816 | transform: translate3d(0, 100%, 0); 3817 | visibility: visible; 3818 | } 3819 | 3820 | to { 3821 | -webkit-transform: translate3d(0, 0, 0); 3822 | transform: translate3d(0, 0, 0); 3823 | } 3824 | } 3825 | 3826 | .slideInUp { 3827 | -webkit-animation-name: slideInUp; 3828 | animation-name: slideInUp; 3829 | } 3830 | 3831 | @-webkit-keyframes slideOutDown { 3832 | from { 3833 | -webkit-transform: translate3d(0, 0, 0); 3834 | transform: translate3d(0, 0, 0); 3835 | } 3836 | 3837 | to { 3838 | visibility: hidden; 3839 | -webkit-transform: translate3d(0, 100%, 0); 3840 | transform: translate3d(0, 100%, 0); 3841 | } 3842 | } 3843 | 3844 | @keyframes slideOutDown { 3845 | from { 3846 | -webkit-transform: translate3d(0, 0, 0); 3847 | transform: translate3d(0, 0, 0); 3848 | } 3849 | 3850 | to { 3851 | visibility: hidden; 3852 | -webkit-transform: translate3d(0, 100%, 0); 3853 | transform: translate3d(0, 100%, 0); 3854 | } 3855 | } 3856 | 3857 | .slideOutDown { 3858 | -webkit-animation-name: slideOutDown; 3859 | animation-name: slideOutDown; 3860 | } 3861 | 3862 | @-webkit-keyframes slideOutLeft { 3863 | from { 3864 | -webkit-transform: translate3d(0, 0, 0); 3865 | transform: translate3d(0, 0, 0); 3866 | } 3867 | 3868 | to { 3869 | visibility: hidden; 3870 | -webkit-transform: translate3d(-100%, 0, 0); 3871 | transform: translate3d(-100%, 0, 0); 3872 | } 3873 | } 3874 | 3875 | @keyframes slideOutLeft { 3876 | from { 3877 | -webkit-transform: translate3d(0, 0, 0); 3878 | transform: translate3d(0, 0, 0); 3879 | } 3880 | 3881 | to { 3882 | visibility: hidden; 3883 | -webkit-transform: translate3d(-100%, 0, 0); 3884 | transform: translate3d(-100%, 0, 0); 3885 | } 3886 | } 3887 | 3888 | .slideOutLeft { 3889 | -webkit-animation-name: slideOutLeft; 3890 | animation-name: slideOutLeft; 3891 | } 3892 | 3893 | @-webkit-keyframes slideOutRight { 3894 | from { 3895 | -webkit-transform: translate3d(0, 0, 0); 3896 | transform: translate3d(0, 0, 0); 3897 | } 3898 | 3899 | to { 3900 | visibility: hidden; 3901 | -webkit-transform: translate3d(100%, 0, 0); 3902 | transform: translate3d(100%, 0, 0); 3903 | } 3904 | } 3905 | 3906 | @keyframes slideOutRight { 3907 | from { 3908 | -webkit-transform: translate3d(0, 0, 0); 3909 | transform: translate3d(0, 0, 0); 3910 | } 3911 | 3912 | to { 3913 | visibility: hidden; 3914 | -webkit-transform: translate3d(100%, 0, 0); 3915 | transform: translate3d(100%, 0, 0); 3916 | } 3917 | } 3918 | 3919 | .slideOutRight { 3920 | -webkit-animation-name: slideOutRight; 3921 | animation-name: slideOutRight; 3922 | } 3923 | 3924 | @-webkit-keyframes slideOutUp { 3925 | from { 3926 | -webkit-transform: translate3d(0, 0, 0); 3927 | transform: translate3d(0, 0, 0); 3928 | } 3929 | 3930 | to { 3931 | visibility: hidden; 3932 | -webkit-transform: translate3d(0, -100%, 0); 3933 | transform: translate3d(0, -100%, 0); 3934 | } 3935 | } 3936 | 3937 | @keyframes slideOutUp { 3938 | from { 3939 | -webkit-transform: translate3d(0, 0, 0); 3940 | transform: translate3d(0, 0, 0); 3941 | } 3942 | 3943 | to { 3944 | visibility: hidden; 3945 | -webkit-transform: translate3d(0, -100%, 0); 3946 | transform: translate3d(0, -100%, 0); 3947 | } 3948 | } 3949 | 3950 | .slideOutUp { 3951 | -webkit-animation-name: slideOutUp; 3952 | animation-name: slideOutUp; 3953 | } 3954 | 3955 | .animated { 3956 | -webkit-animation-duration: 1s; 3957 | animation-duration: 1s; 3958 | -webkit-animation-fill-mode: both; 3959 | animation-fill-mode: both; 3960 | } 3961 | 3962 | .animated.infinite { 3963 | -webkit-animation-iteration-count: infinite; 3964 | animation-iteration-count: infinite; 3965 | } 3966 | 3967 | .animated.delay-1s { 3968 | -webkit-animation-delay: 1s; 3969 | animation-delay: 1s; 3970 | } 3971 | 3972 | .animated.delay-2s { 3973 | -webkit-animation-delay: 2s; 3974 | animation-delay: 2s; 3975 | } 3976 | 3977 | .animated.delay-3s { 3978 | -webkit-animation-delay: 3s; 3979 | animation-delay: 3s; 3980 | } 3981 | 3982 | .animated.delay-4s { 3983 | -webkit-animation-delay: 4s; 3984 | animation-delay: 4s; 3985 | } 3986 | 3987 | .animated.delay-5s { 3988 | -webkit-animation-delay: 5s; 3989 | animation-delay: 5s; 3990 | } 3991 | 3992 | .animated.fast { 3993 | -webkit-animation-duration: 800ms; 3994 | animation-duration: 800ms; 3995 | } 3996 | 3997 | .animated.faster { 3998 | -webkit-animation-duration: 500ms; 3999 | animation-duration: 500ms; 4000 | } 4001 | 4002 | .animated.slow { 4003 | -webkit-animation-duration: 2s; 4004 | animation-duration: 2s; 4005 | } 4006 | 4007 | .animated.slower { 4008 | -webkit-animation-duration: 3s; 4009 | animation-duration: 3s; 4010 | } 4011 | 4012 | @media (print), (prefers-reduced-motion) { 4013 | .animated { 4014 | -webkit-animation: unset !important; 4015 | animation: unset !important; 4016 | -webkit-transition: none !important; 4017 | transition: none !important; 4018 | } 4019 | } 4020 | -------------------------------------------------------------------------------- /frontend/src/DemoApp.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Demo App 3 | */ 4 | 5 | import React, { Component } from 'react' 6 | import logo from './images/logo.png' 7 | import './DemoApp.css' 8 | 9 | const INITIAL_API_REQUESTS = 50 10 | const INITIAL_STATUS = 'Ready for testing!' 11 | 12 | /* 13 | * Class – DemoApp 14 | */ 15 | 16 | class DemoApp extends Component { 17 | 18 | /* 19 | * Constructor 20 | */ 21 | 22 | constructor(props) { 23 | super(props) 24 | 25 | this.state = {} 26 | this.state.visible = {} 27 | this.state.visible.admin = false 28 | this.state.visible.success = false 29 | this.state.admin = {} 30 | this.state.admin.status = INITIAL_STATUS 31 | this.state.admin.invocations = INITIAL_API_REQUESTS 32 | this.state.admin.url = null 33 | 34 | // Refs 35 | this.refFormName = React.createRef() 36 | this.refFormEmail = React.createRef() 37 | this.refInputUrl = React.createRef() 38 | this.refInputInvocations = React.createRef() 39 | 40 | // Binders 41 | this.submitForm = this.submitForm.bind(this) 42 | this.toggleAdmin = this.toggleAdmin.bind(this) 43 | this.updateApi = this.updateApi.bind(this) 44 | this.generateInvocations = this.generateInvocations.bind(this) 45 | this.generateRandomError = this.generateRandomError.bind(this) 46 | this.generateDurationError = this.generateDurationError.bind(this) 47 | this.generateTimeoutError = this.generateTimeoutError.bind(this) 48 | } 49 | 50 | /** 51 | * Component Did Mount 52 | */ 53 | 54 | componentDidMount() { 55 | const self = this 56 | // Get Global State from local storage 57 | let data = localStorage.getItem('demoapp') 58 | data = data ? JSON.parse(data) : {} 59 | this.setState({ admin: { ...this.state.admin, ...{ url: data.url }}}, () => { 60 | console.log('Serverless Framework Demo App Initialized') 61 | console.log(this.state) 62 | 63 | // Initial Session Status 64 | let newState = { 65 | status: INITIAL_STATUS, 66 | invocations: INITIAL_API_REQUESTS, 67 | } 68 | if (!this.state.admin.url) { 69 | newState.status = 'Please insert the URL of your Form\'s API in the field below.' 70 | } 71 | 72 | this.setState({ admin: { ...self.state.admin, ...newState }}) 73 | }) 74 | } 75 | 76 | /** 77 | * Toggle Admin 78 | */ 79 | 80 | toggleAdmin() { 81 | let newState = { admin: !this.state.visible.admin } 82 | this.setState({ visible: { ...this.state.visible, ...newState }}) 83 | } 84 | 85 | /** 86 | * Set Status 87 | */ 88 | 89 | setStatus(status) { 90 | const self = this 91 | clearTimeout(this.timeout) 92 | this.setState({ admin: { ...this.state.admin, ...{ status }}}) 93 | this.timeout = setTimeout(() =>{ 94 | self.setState({ admin: { ...this.state.admin, ...{ status: `Ready for testing!` }}}) 95 | }, 6000) 96 | } 97 | 98 | /** 99 | * Submit Form 100 | */ 101 | 102 | submitForm(event) { 103 | 104 | event.preventDefault() 105 | 106 | const self = this 107 | const name = this.refFormName.current.value 108 | const email = this.refFormEmail.current.value 109 | 110 | if (!name || name === '' || !email || email === '') { 111 | alert('Form fields must be filled in') 112 | return 113 | } 114 | 115 | const callApi = () => { 116 | return fetch(this.state.admin.url, { 117 | method: 'POST', 118 | mode: 'cors', 119 | headers: { 120 | 'Content-Type': 'application/json', 121 | }, 122 | body: JSON.stringify({ name, email }), 123 | }) 124 | } 125 | 126 | return callApi() 127 | .then(() => { 128 | self.setState({ visible: { ...this.state.visible, ...{ success: true }}}) 129 | }) 130 | } 131 | 132 | /** 133 | * Update API 134 | */ 135 | 136 | updateApi(event) { 137 | 138 | event.preventDefault() 139 | 140 | const self = this 141 | let url = this.refInputUrl.current.value 142 | url = url.trim() || null 143 | 144 | function validURL(str) { 145 | var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol 146 | '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name 147 | '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address 148 | '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path 149 | '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string 150 | '(\\#[-a-z\\d_]*)?$','i'); // fragment locator 151 | return !!pattern.test(str); 152 | } 153 | 154 | if (!validURL(url)) { 155 | alert(`This is not a valid URL: ${url || '(Field is blank)'}`) 156 | return 157 | } 158 | 159 | const newState = { url: url } 160 | this.setState({ 161 | admin: { ...this.state.admin, ...newState } 162 | }, () => { 163 | localStorage.setItem('demoapp', JSON.stringify({ url })) 164 | self.setStatus('API URL successfully updated!') 165 | }) 166 | } 167 | 168 | /** 169 | * Generate Invocations 170 | */ 171 | 172 | generateInvocations(event) { 173 | 174 | event.preventDefault() 175 | 176 | const self = this 177 | 178 | let invocations = this.refInputInvocations.current.value || this.state.admin.invocations 179 | invocations = parseInt(invocations) || 0 180 | 181 | if (invocations > 999) { 182 | //eslint-disable-next-line 183 | const r = confirm(`\nThis will generate ${invocations} API requests. Are you sure you want to do this?\n`) 184 | if (!r) return 185 | } 186 | 187 | // Call API Function 188 | const callApi = () => { 189 | return fetch(this.state.admin.url, { 190 | method: 'POST', 191 | mode: 'cors', 192 | headers: { 193 | 'Content-Type': 'application/json', 194 | }, 195 | body: JSON.stringify({ 196 | name: 'Sample Invocation', 197 | email: 'sample@invocations.com' 198 | }), 199 | }) 200 | } 201 | 202 | // Runner Function 203 | const runner = async (cb) => { 204 | let array = [] 205 | for (let i = 0; i <= invocations; i++) { array.push(i) } 206 | for (const item of array) { 207 | await callApi() 208 | self.setStatus(`Performing API request ${item}/${invocations}...`) 209 | } 210 | if (cb) return cb() 211 | } 212 | 213 | runner(() => { 214 | self.setStatus(`Successfully completed ${invocations} requests!`) 215 | }) 216 | } 217 | 218 | /** 219 | * Generate Random Error 220 | */ 221 | 222 | generateRandomError(event) { 223 | 224 | event.preventDefault() 225 | 226 | const self = this 227 | 228 | // Call API Function 229 | const callApi = () => { 230 | return fetch(`${this.state.admin.url}?error=true`, { 231 | method: 'POST', 232 | mode: 'cors', 233 | headers: { 234 | 'Content-Type': 'application/json', 235 | }, 236 | body: JSON.stringify({ message: 'random error'}), 237 | }) 238 | } 239 | 240 | // Runner Function 241 | const runner = async (cb) => { 242 | try { await callApi() } 243 | catch (error) { console.log(error) } 244 | self.setStatus(`Generating a random function error...`) 245 | if (cb) return cb() 246 | } 247 | 248 | runner(() => { 249 | self.setStatus(`Successfully generated a random function error!`) 250 | }) 251 | } 252 | 253 | /** 254 | * Generate Duration Error 255 | */ 256 | 257 | generateDurationError(event) { 258 | 259 | event.preventDefault() 260 | 261 | const self = this 262 | 263 | // Call API Function 264 | const callApi = () => { 265 | return fetch(`${this.state.admin.url}?duration=true`, { 266 | method: 'POST', 267 | mode: 'cors', 268 | headers: { 269 | 'Content-Type': 'application/json', 270 | }, 271 | body: JSON.stringify({ message: 'duration error' }), 272 | }) 273 | } 274 | 275 | // Runner Function 276 | const runner = async (cb) => { 277 | try { await callApi() } 278 | catch (error) { console.log(error) } 279 | self.setStatus(`Generating a random function error...`) 280 | if (cb) return cb() 281 | } 282 | 283 | runner(() => { 284 | self.setStatus(`Successfully generated a duration error!`) 285 | }) 286 | } 287 | 288 | /** 289 | * Generate Timeout Error 290 | */ 291 | 292 | generateTimeoutError(event) { 293 | 294 | event.preventDefault() 295 | 296 | const self = this 297 | 298 | // Call API Function 299 | const callApi = () => { 300 | return fetch(`${this.state.admin.url}?timeout=true`, { 301 | method: 'POST', 302 | mode: 'cors', 303 | headers: { 304 | 'Content-Type': 'application/json', 305 | }, 306 | body: JSON.stringify({ message: 'timeout error' }), 307 | }) 308 | } 309 | 310 | // Runner Function 311 | const runner = async (cb) => { 312 | try { await callApi() } 313 | catch (error) { console.log(error) } 314 | self.setStatus(`Generating a random function error...`) 315 | if (cb) return cb() 316 | } 317 | 318 | runner(() => { 319 | self.setStatus(`Successfully generated a timeout error!`) 320 | }) 321 | } 322 | 323 | /* 324 | * Render 325 | */ 326 | 327 | render() { 328 | 329 | return ( 330 |
331 | 332 | { 333 | /* 334 | * DemoApp Admin Menu 335 | */ 336 | } 337 | 338 |
339 | 340 |
343 | x 344 |
345 | 346 |
347 | logo 348 | Serverless Framework - Demo Utilities 349 |
350 | 351 |
353 |
354 | Status 355 |
356 |

357 | {this.state.admin.status} 358 |

359 |
360 | 361 |
362 |
363 | Form Submit URL 364 |
365 |
366 | 372 | 378 | 379 |
380 |
381 | Enter the formSubmit function's API URL returned upon deployment with the Framework. 382 |
383 |
384 | 385 |
386 |
387 | Generate A Sample Number Of API Requests 388 |
389 |
390 | 396 | 402 | 403 |
404 |
405 | This generates fake form submissions to give you sample invocation data. 406 |
407 |
408 | 409 |
410 |
411 |
412 |
413 | Generate A New Function Code Error 414 |
415 |
416 | This generates a new Function Code Error. 417 |
418 |
419 |
420 |
Generate
423 |
424 |
425 |
426 | 427 |
428 |
429 |
430 |
431 | Generate An Unusual Duration 432 |
433 |
434 | This makes the function run for a long time and generates an "unusual duration" and "appraoching timeout" error. 435 |
436 |
437 |
438 |
Generate
440 |
441 |
442 |
443 | 444 |
445 |
446 |
447 |
448 | Generate A Timeout Error 449 |
450 |
451 | This makes the function run for longer than the set timeout. 452 |
453 |
454 |
455 |
Generate
457 |
458 |
459 |
460 | 461 | 462 |
463 | 464 | { 465 | /* 466 | * DemoApp Content 467 | */ 468 | } 469 | 470 |
471 | 472 |
473 | Demo Utilities 474 |
475 | 476 |
477 | 478 |
479 | Serverless Email Sign-Up Form 480 |
481 | 482 |
483 |
484 | Full Name 485 |
486 | 491 | 492 |
493 | Email 494 |
495 | 500 | 501 |
502 | 503 |
504 |
505 | 506 |
507 | Thank you for your submission! 508 |
509 | 510 |
511 | 512 |
513 |
514 | ) 515 | } 516 | } 517 | 518 | export default DemoApp 519 | -------------------------------------------------------------------------------- /frontend/src/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/serverless/workshop/f4cc42cdd9f0865347dbfa42f67ab0beb56e3edc/frontend/src/images/logo.png -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 5 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 6 | sans-serif; 7 | -webkit-font-smoothing: antialiased; 8 | -moz-osx-font-smoothing: grayscale; 9 | } 10 | 11 | code { 12 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", 13 | monospace; 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import DemoApp from './DemoApp' 4 | import './index.css' 5 | 6 | window.demoapp = {} 7 | 8 | ReactDOM.render(, document.getElementById('root')) 9 | --------------------------------------------------------------------------------