فهرست منبع

添加动画效果

htc 4 ماه پیش
والد
کامیت
c44bed16d1
82فایلهای تغییر یافته به همراه9703 افزوده شده و 228 حذف شده
  1. 9 0
      main.js
  2. 25 0
      node_modules/.package-lock.json
  3. 4 0
      node_modules/aos/.babelrc
  4. 14 0
      node_modules/aos/.editorconfig
  5. 10 0
      node_modules/aos/.gitattributes
  6. 21 0
      node_modules/aos/.travis.yml
  7. 72 0
      node_modules/aos/CHANGELOG.md
  8. 45 0
      node_modules/aos/CONTRIBUTING.md
  9. 22 0
      node_modules/aos/LICENSE
  10. 303 0
      node_modules/aos/README.md
  11. 40 0
      node_modules/aos/bower.json
  12. 35 0
      node_modules/aos/demo/async.html
  13. 40 0
      node_modules/aos/demo/css/styles.css
  14. 163 0
      node_modules/aos/demo/simple.html
  15. 1 0
      node_modules/aos/dist/aos.css
  16. 1 0
      node_modules/aos/dist/aos.js
  17. 63 0
      node_modules/aos/karma.conf.js
  18. 52 0
      node_modules/aos/package.json
  19. 5 0
      node_modules/aos/postcss.config.js
  20. 193 0
      node_modules/aos/src/js/aos.js
  21. 70 0
      node_modules/aos/src/js/helpers/calculateOffset.js
  22. 33 0
      node_modules/aos/src/js/helpers/detector.js
  23. 11 0
      node_modules/aos/src/js/helpers/elements.js
  24. 39 0
      node_modules/aos/src/js/helpers/handleScroll.js
  25. 13 0
      node_modules/aos/src/js/helpers/prepare.js
  26. 61 0
      node_modules/aos/src/js/libs/observer.js
  27. 24 0
      node_modules/aos/src/js/libs/offset.js
  28. 177 0
      node_modules/aos/src/sass/_animations.scss
  29. 18 0
      node_modules/aos/src/sass/_core.scss
  30. 40 0
      node_modules/aos/src/sass/_easing.scss
  31. 3 0
      node_modules/aos/src/sass/aos.scss
  32. 51 0
      node_modules/aos/test/aos.spec.js
  33. 241 0
      node_modules/aos/test/calculateOffset.spec.js
  34. 56 0
      node_modules/aos/test/elements.spec.js
  35. 35 0
      node_modules/aos/test/fixtures/aos-offset.fixture.html
  36. 35 0
      node_modules/aos/test/fixtures/aos.fixture.html
  37. 3 0
      node_modules/aos/test/index.js
  38. 33 0
      node_modules/aos/webpack.config.js
  39. 5660 0
      node_modules/aos/yarn.lock
  40. 4 0
      node_modules/classlist-polyfill/.travis.yml
  41. 26 0
      node_modules/classlist-polyfill/CHANGELOG.md
  42. 24 0
      node_modules/classlist-polyfill/LICENSE
  43. 35 0
      node_modules/classlist-polyfill/README.md
  44. 24 0
      node_modules/classlist-polyfill/bower.json
  45. 32 0
      node_modules/classlist-polyfill/package.json
  46. 23 0
      node_modules/classlist-polyfill/script/test
  47. 240 0
      node_modules/classlist-polyfill/src/index.js
  48. 16 0
      node_modules/classlist-polyfill/tests/qunit.html
  49. 10 0
      node_modules/classlist-polyfill/tests/remove.js
  50. 46 0
      node_modules/classlist-polyfill/tests/runner.coffee
  51. 82 0
      node_modules/classlist-polyfill/tests/tests.js
  52. 47 0
      node_modules/lodash.debounce/LICENSE
  53. 18 0
      node_modules/lodash.debounce/README.md
  54. 377 0
      node_modules/lodash.debounce/index.js
  55. 17 0
      node_modules/lodash.debounce/package.json
  56. 47 0
      node_modules/lodash.throttle/LICENSE
  57. 18 0
      node_modules/lodash.throttle/README.md
  58. 439 0
      node_modules/lodash.throttle/index.js
  59. 17 0
      node_modules/lodash.throttle/package.json
  60. 51 0
      package-lock.json
  61. 1 0
      package.json
  62. 30 18
      pages/consult/index.vue
  63. 5 5
      pages/index/index.vue
  64. 19 11
      pages/plan/details.vue
  65. 15 6
      pages/plan/index.vue
  66. 19 9
      pages/solution/fmcs.vue
  67. 23 10
      pages/solution/ioc.vue
  68. 25 18
      pages/solution/lampSms.vue
  69. 2 2
      pages/solution/ltzhxy.vue
  70. 22 8
      pages/solution/ltzhyq.vue
  71. 19 11
      pages/solution/smartOpration.vue
  72. 2 2
      pages/solution/smartVideo.vue
  73. 10 9
      pages/solution/stgz.vue
  74. 26 26
      pages/solution/szks.vue
  75. 29 15
      pages/solution/zhly.vue
  76. 2 2
      pages/solution/zhnt.vue
  77. 2 2
      pages/solution/zhtc.vue
  78. 25 17
      pages/solution/zhwb.vue
  79. 37 19
      pages/solution/zhwl.vue
  80. 32 14
      pages/solution/zhxf.vue
  81. 20 13
      pages/solution/zncc.vue
  82. 24 11
      pages/solution/znpc.vue

+ 9 - 0
main.js

@@ -50,6 +50,15 @@ Vue.component('uFunction',uFunction);
 //uForm
 import uForm from '@/components/common/uForm'
 Vue.component('uForm',uForm);
+
+/* 引入aos动画库相关文件 */
+import AOS from 'aos'
+import 'aos/dist/aos.css'
+/* aos动画初始化 */
+AOS.init({
+    duration: 300,
+    easing:"linear"
+});
 
 // #endif
 

+ 25 - 0
node_modules/.package-lock.json

@@ -348,6 +348,16 @@
         "node": ">= 8"
       }
     },
+    "node_modules/aos": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmmirror.com/aos/-/aos-2.3.4.tgz",
+      "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==",
+      "dependencies": {
+        "classlist-polyfill": "^1.0.3",
+        "lodash.debounce": "^4.0.6",
+        "lodash.throttle": "^4.0.1"
+      }
+    },
     "node_modules/big.js": {
       "version": "5.2.2",
       "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
@@ -476,6 +486,11 @@
         "node": ">=6.0"
       }
     },
+    "node_modules/classlist-polyfill": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz",
+      "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ=="
+    },
     "node_modules/commander": {
       "version": "2.20.3",
       "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
@@ -858,6 +873,16 @@
         "node": ">=8.9.0"
       }
     },
+    "node_modules/lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+    },
+    "node_modules/lodash.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+    },
     "node_modules/make-dir": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",

+ 4 - 0
node_modules/aos/.babelrc

@@ -0,0 +1,4 @@
+{
+  "presets": ["es2015"],
+  "plugins": ["transform-object-assign"]
+}

+ 14 - 0
node_modules/aos/.editorconfig

@@ -0,0 +1,14 @@
+# editorconfig.org
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false

+ 10 - 0
node_modules/aos/.gitattributes

@@ -0,0 +1,10 @@
+# Enforce Unix newlines
+*.css   text eol=lf
+*.scss  text eol=lf
+*.html  text eol=lf
+*.js    text eol=lf
+*.md    text eol=lf
+*.svg   text eol=lf
+*.yml   text eol=lf
+# Don't diff or textually merge source maps
+*.map   binary

+ 21 - 0
node_modules/aos/.travis.yml

@@ -0,0 +1,21 @@
+language: node_js
+sudo: false
+node_js:
+- '8'
+
+env:
+  global:
+
+before_install:
+- export CHROME_BIN=chromium-browser
+- export DISPLAY=:99.0
+- sh -e /etc/init.d/xvfb start
+
+install:
+- npm config set registry http://registry.npmjs.org/
+- npm install -g karma
+- npm install
+
+cache:
+  directories:
+  - "$HOME/.nvm"

+ 72 - 0
node_modules/aos/CHANGELOG.md

@@ -0,0 +1,72 @@
+# Change Log
+
+## [2.1.1]
+- Clean styles, prefix variables, use !default, separate files for core and animations
+
+## [2.1.0]
+- Attach event listener to window instead of document for event `load`
+
+## [2.0.4]
+
+### Fixed
+- Fix device detector (tablet setting)
+
+### Changed
+- Disable AOS on not supported browsers (<= IE9)
+- Clean code around `disable` option
+- Rewrite device detector using ES6 Class
+
+## [2.0.3]
+
+### Added
+- Add `transform-object-assign` plugin for babel, so Object.assign works in IE
+
+## [2.0.2]
+
+### Fixed
+- Fix include in arrays, so it works in IE
+
+## [2.0.1]
+
+### Fixed
+- Add easings, after they were accidentaly ignored
+
+## [2.0.0]
+
+### Added
+- Add new CHANGELOG
+- Add contribution guide
+- Add emojis in README
+- Add map file for styles
+
+### Changed
+- Make `data-aos` attributes the default and only proper ones
+- Use maps and loops in Sass
+- Replace gulp with webpack
+- Rewrite Karma config and use webpack to bundle tests
+- Upgrade to ES6
+- Update documentation
+- Update demos
+
+### Removed
+- Remove `aos` attributes
+- Remove gulp from build tools
+
+### Fixed
+- Improve animations performance
+- Fix styles loading in tests
+
+## [1.2.2]
+### Fixed
+- Fix AOS refreshing on asynchronously loaded elements
+
+## [1.2.1]
+### Fixed
+- Fix problem with using AOS as node package by setting main file in package.json
+
+## [1.2.0]
+### Added
+- Add compatibility with module systems
+
+### Fixed
+- Fix AOS initializing when DOM is already loaded

+ 45 - 0
node_modules/aos/CONTRIBUTING.md

@@ -0,0 +1,45 @@
+# Contributing to AOS
+
+## Bugs
+
+Found a bug? Have a problem with AOS? Please check past issues, maybe someone already had that problem. If you don't find similar issue create new, but remember to add accurate informations so that I can dig into it straight away. If it's possible add CodePen example that presents called issue.
+
+## Development process
+
+AOS is built using webpack.
+
+### Setup
+
+- Install all dependencies: 
+  
+  ```
+  npm install
+  ```
+
+- Run dev server:
+  
+  ```
+  npm run dev
+  ```
+
+  This will run local webpack-dev-server and build AOS automatically.
+
+- Open browser and head to: 
+  [http://localhost:8080/webpack-dev-server/](http://localhost:8080/webpack-dev-server/)
+  Server loads content from `demo` folder.
+  
+Now you are ready to play with AOS. Browser should reload automatically as you change code in `src` folder.
+
+### Testing
+
+Before you create Pull Request make sure all tests are passing.
+
+In order to do so run:
+```
+npm test
+```
+
+### Commiting changes
+
+If all tests are passing then you're good to go. Commit your changes, but remember to **not commit `dist` folder**.
+Create well described Pull Request with as many informations as possible and wait for my answer :) I'd be happy to make a code review and put some thougths.

+ 22 - 0
node_modules/aos/LICENSE

@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Michał Sajnóg
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+

+ 303 - 0
node_modules/aos/README.md

@@ -0,0 +1,303 @@
+[![AOS - Animate on scroll library](https://s32.postimg.org/ktvt59hol/aos_header.png)](http://michalsnik.github.io/aos/)
+
+[![NPM version](https://img.shields.io/npm/v/aos.svg?style=flat)](https://npmjs.org/package/aos)
+[![NPM downloads](https://img.shields.io/npm/dm/aos.svg?style=flat)](https://npmjs.org/package/aos)
+[![Build Status](https://travis-ci.org/michalsnik/aos.svg?branch=master)](https://travis-ci.org/michalsnik/aos)
+[![Gitter](https://badges.gitter.im/michalsnik/aos.svg)](https://gitter.im/michalsnik/aos?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+
+[![Twitter Follow](https://img.shields.io/twitter/follow/michalsnik.svg?style=social)](https://twitter.com/michalsnik) [![Twitter URL](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/home?status=AOS%20-%20Animate%20on%20Scroll%20library%0Ahttps%3A//github.com/michalsnik/aos)
+
+Small library to animate elements on your page as you scroll.
+
+You may say it's like WOWJS, yeah - you're right, effect is similar to WOWJS, but I had a different idea how to make such a plugin, so here it is. CSS3 driven scroll animation library.
+
+AOS allows you to animate elements as you scroll down, and up.
+If you scroll back to top, elements will animate to it's previous state and are ready to animate again if you scroll down.
+
+👉 To get a better understanding how this actually works, I encourage you to check [my post on CSS-tricks](https://css-tricks.com/aos-css-driven-scroll-animation-library/).
+
+---
+
+### 🚀 [Demo](http://michalsnik.github.io/aos/)
+
+### 🌟 Codepen Examples
+- [Different build in animations](http://codepen.io/michalsnik/pen/WxNdvq)
+- [With anchor setting in use](http://codepen.io/michalsnik/pen/jrOYVO)
+- [With anchor-placement and different easing](http://codepen.io/michalsnik/pen/EyxoNm)
+- [With simple custom animations](http://codepen.io/michalsnik/pen/WxvNvE)
+
+---
+
+## ❗ Attention
+From version `2.0.0` attributes `aos` are no longer supported, always use `data-aos`.
+
+## ⚙ Setup
+
+### Install AOS
+
+- Using `bower`
+
+    ```bash
+      bower install aos --save
+    ```
+
+- Using `npm`
+
+    ```bash
+      npm install aos --save
+    ```
+
+- Direct download -> [click here](https://github.com/michalsnik/aos/archive/master.zip)
+
+
+### Link styles
+
+```html
+  <link rel="stylesheet" href="bower_components/aos/dist/aos.css" />
+```
+
+### Add scripts
+
+```html
+  <script src="bower_components/aos/dist/aos.js"></script>
+```
+
+AOS from version `1.2.0` is available as UMD module, so you can use it as AMD, Global, Node or ES6 module.
+
+### Init AOS
+
+```javascript
+  <script>
+    AOS.init();
+  </script>
+```
+
+## 🤔 How to use it?
+
+### Basic usage
+
+  All you have to do is to add `data-aos` attribute to html element, like so:
+
+```html
+  <div data-aos="animation_name">
+```
+
+  Script will trigger "animation_name" animation on this element, if you scroll to it.
+
+  [Down below](https://github.com/michalsnik/aos#-animations) is a list of all available animations for now :)
+
+### 🔥 Advanced settings
+
+These settings can be set both on certain elements, or as default while initializing script (in options object without `data-` part).
+
+| Attribute | Description | Example value | Default value |
+|---------------------------|-------------|---------------|---------|
+| *`data-aos-offset`* | Change offset to trigger animations sooner or later (px) | 200 | 120 |
+| *`data-aos-duration`* | *Duration of animation (ms) | 600 | 400 |
+| *`data-aos-easing`* | Choose timing function to ease elements in different ways | ease-in-sine | ease |
+| *`data-aos-delay`* | Delay animation (ms) | 300 | 0 |
+| *`data-aos-anchor`* | Anchor element, whose offset will be counted to trigger animation instead of actual elements offset | #selector | null |
+| *`data-aos-anchor-placement`* | Anchor placement - which one position of element on the screen should trigger animation | top-center | top-bottom |
+| *`data-aos-once`* | Choose wheter animation should fire once, or every time you scroll up/down to element | true | false |
+
+*Duration accept values from 50 to 3000, with step 50ms, it's because duration of animation is handled by css, and to not make css longer than it is already I created implementations only in this range. I think this should be good for almost all cases.
+
+If not, you may write simple CSS on your page that will add another duration option value available, for example:
+
+```css
+  body[data-aos-duration='4000'] [data-aos], [data-aos][data-aos][data-aos-duration='4000']{
+    transition-duration: 4000ms;
+  }
+```
+
+This code will add 4000ms duration available for you to set on AOS elements, or to set as global duration while initializing AOS script.
+
+Notice that double `[data-aos][data-aos]` - it's not a mistake, it is a trick, to make individual settings more important than global, without need to write ugly "!important" there :)
+
+`data-aos-anchor-placement` - You can set different placement option on each element, the principle is pretty simple, each anchor-placement option contains two words i.e. `top-center`. This means that animation will be triggered when `top` of element will reach `center` of the window.
+`bottom-top` means that animation will be triggered when `bottom` of an element reach `top` of the window, and so on.
+Down below you can find list of all anchor-placement options.
+
+#### Examples:
+
+```html
+  <div data-aos="fade-zoom-in" data-aos-offset="200" data-aos-easing="ease-in-sine" data-aos-duration="600">
+```
+```html
+  <div data-aos="flip-left" data-aos-delay="100" data-aos-anchor=".example-selector">
+```
+```html
+  <div data-aos="fade-up" data-aos-anchor-placement="top-center">
+```
+
+
+#### API
+
+AOS object is exposed as a global variable, for now there are three methods available:
+
+  * `init` - initialize AOS
+  * `refresh` - recalculate all offsets and positions of elements (called on window resize)
+  * `refreshHard` - reinit array with AOS elements and trigger `refresh` (called on DOM changes that are related to `aos` elements)
+
+Example execution:
+```javascript
+  AOS.refresh();
+```
+
+By default AOS is watching for DOM changes and if there are any new elements loaded asynchronously or when something is removed from DOM it calls `refreshHard` automatically. In browsers that don't support `MutationObserver` like IE you might need to call `AOS.refreshHard()` by yourself.
+
+`refresh` method is called on window resize and so on, as it doesn't require to build new store with AOS elements and should be as light as possible.
+
+### Global settings
+
+If you don't want to change setting for each element separately, you can change it globally.
+
+To do this, pass options object to `init()` function, like so:
+
+```javascript
+  <script>
+    AOS.init({
+      offset: 200,
+      duration: 600,
+      easing: 'ease-in-sine',
+      delay: 100,
+    });
+  </script>
+```
+
+#### Additional configuration
+
+These settings can be set only in options object while initializing AOS.
+
+| Setting | Description | Example value | Default value |
+|---------------------------|-------------|---------------|---------|
+| *`disable`* | Condition when AOS should be disabled | mobile | false |
+| *`startEvent`* | Name of event, on which AOS should be initialized | exampleEvent | DOMContentLoaded |
+
+##### Disabling AOS
+
+If you want to disable AOS on certain device or under any statement you can set `disable` option. Like so:
+
+```javascript
+  <script>
+    AOS.init({
+      disable: 'mobile'
+    });
+  </script>
+```
+
+There are several options that you can use to fit AOS perfectly into your project, you can pass one of three device types:
+`mobile` (phones and tablets), `phone` or `tablet`. This will disable AOS on those certains devices. But if you want make your own condition, simple type your statement instead of device type name:
+
+```javascript
+  disable: window.innerWidth < 1024
+```
+
+There is also posibility to pass a `function`, which should at the end return `true` or `false`:
+
+```javascript
+  disable: function () {
+    var maxWidth = 1024;
+    return window.innerWidth < maxWidth;
+  }
+```
+
+##### Start event
+
+If you don't want to initialize AOS on `DOMContentLoaded` event, you can pass your own event name and trigger it whenever you want. AOS is listening for this event on `document` element.
+
+```javascript
+  <script>
+    AOS.init({
+      startEvent: 'someCoolEvent'
+    });
+  </script>
+```
+
+**Important note:** If you set `startEvent: 'load'` it will add event listener on `window` instead of `document`.
+
+
+### 👻 Animations
+
+There are serveral predefined animations you can use already:
+
+  * Fade animations:
+    * fade
+    * fade-up
+    * fade-down
+    * fade-left
+    * fade-right
+    * fade-up-right
+    * fade-up-left
+    * fade-down-right
+    * fade-down-left
+
+  * Flip animations:
+    * flip-up
+    * flip-down
+    * flip-left
+    * flip-right
+
+  * Slide animations:
+    * slide-up
+    * slide-down
+    * slide-left
+    * slide-right
+
+  * Zoom animations:
+    * zoom-in
+    * zoom-in-up
+    * zoom-in-down
+    * zoom-in-left
+    * zoom-in-right
+    * zoom-out
+    * zoom-out-up
+    * zoom-out-down
+    * zoom-out-left
+    * zoom-out-right
+
+### Anchor placement:
+
+  * top-bottom
+  * top-center
+  * top-top
+  * center-bottom
+  * center-center
+  * center-top
+  * bottom-bottom
+  * bottom-center
+  * bottom-top
+
+
+### Easing functions:
+
+You can choose one of these timing function to animate elements nicely:
+
+  * linear
+  * ease
+  * ease-in
+  * ease-out
+  * ease-in-out
+  * ease-in-back
+  * ease-out-back
+  * ease-in-out-back
+  * ease-in-sine
+  * ease-out-sine
+  * ease-in-out-sine
+  * ease-in-quad
+  * ease-out-quad
+  * ease-in-out-quad
+  * ease-in-cubic
+  * ease-out-cubic
+  * ease-in-out-cubic
+  * ease-in-quart
+  * ease-out-quart
+  * ease-in-out-quart
+
+## ✌️ [Contributing](CONTRIBUTING.md)
+
+## 📝 [Changelog](CHANGELOG.md)
+
+## ❔Questions
+
+If you have any questions, ideas or whatsoever, please check [AOS contribution guide](CONTRIBUTING.md) and don't hesitate to create new issues.

+ 40 - 0
node_modules/aos/bower.json

@@ -0,0 +1,40 @@
+{
+  "name": "aos",
+  "version": "2.1.1",
+  "homepage": "git://github.com/michalsnik/aos.git",
+  "authors": [
+    "Michał Sajnóg <michal.sajnog@hotmail.com>"
+  ],
+  "main": [
+    "dist/aos.js",
+    "dist/aos.css"
+  ],
+  "moduleType": [
+    "amd",
+    "globals",
+    "node",
+    "es6"
+  ],
+  "keywords": [
+    "scroll",
+    "css3",
+    "transition",
+    "transform",
+    "mousewheel",
+    "smooth",
+    "wow",
+    "animate"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests",
+    ".gitignore",
+    "gulpfile.js",
+    "package.json"
+  ],
+  "dependencies": {}
+}

+ 35 - 0
node_modules/aos/demo/async.html

@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>AOS - Animate on scroll library</title>
+    <meta name="viewport" content="width=device-width">
+    <link rel="stylesheet" href="css/styles.css" />
+    <link rel="stylesheet" href="../dist/aos.css" />
+  </head>
+  <body>
+    <div id="aos-demo" class="aos-all"></div>
+
+    <script src="../dist/aos.js"></script>
+    <script>
+      AOS.init({
+        easing: 'ease-in-out-sine'
+      });
+
+      setInterval(addItem, 300);
+
+      var itemsCounter = 1;
+      var container = document.getElementById('aos-demo');
+
+      function addItem () {
+        if (itemsCounter > 42) return;
+        var item = document.createElement('div');
+        item.classList.add('aos-item');
+        item.setAttribute('data-aos', 'fade-up');
+        item.innerHTML = '<div class="aos-item__inner"><h3>' + itemsCounter + '</h3></div>';
+        container.appendChild(item);
+        itemsCounter++;
+      }
+    </script>
+  </body>
+</html>

+ 40 - 0
node_modules/aos/demo/css/styles.css

@@ -0,0 +1,40 @@
+body {
+  font-family: Helvetica,Tahoma;
+}
+
+*,
+*:before,
+*:after {
+  box-sizing: border-box;
+}
+
+.aos-all {
+  width: 1000px;
+  max-width: 98%;
+  margin: 10vh auto 0 auto;
+}
+
+.aos-item {
+  display: inline-block;
+  float: left;
+  width: 33.3333%;
+  height: 300px;
+  padding: 20px;
+}
+
+.aos-item__inner {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  float: left;
+  background: #1da4e2;
+  line-height: 260px;
+  text-align: center;
+  color: #fff;
+}
+
+@media screen and (max-width: 800px) {
+  .aos-item {
+    width: 50%;
+  }
+}

+ 163 - 0
node_modules/aos/demo/simple.html

@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>AOS - Animate on scroll library</title>
+    <meta name="viewport" content="width=device-width">
+    <link rel="stylesheet" href="css/styles.css" />
+    <link rel="stylesheet" href="../dist/aos.css" />
+    <!--[if lt IE 9]>
+    <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+  </head>
+  <body>
+    <div id="transcroller-body" class="aos-all">
+      <div class="aos-item" data-aos="fade-up">
+        <div class="aos-item__inner"><h3>1</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-down">
+        <div class="aos-item__inner"><h3>2</h3></div>
+      </div>
+      <div class="aos-item" data-aos="zoom-out-down">
+        <div class="aos-item__inner"><h3>3</h3></div>
+      </div>
+      <div class="aos-item" data-aos="flip-down">
+        <div class="aos-item__inner"><h3>4</h3></div>
+      </div>
+      <div class="aos-item" data-aos="flip-up">
+        <div class="aos-item__inner"><h3>5</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-down">
+        <div class="aos-item__inner"><h3>6</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>7</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-down">
+        <div class="aos-item__inner"><h3>8</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>9</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-down">
+        <div class="aos-item__inner"><h3>10</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-up">
+        <div class="aos-item__inner"><h3>11</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-down">
+        <div class="aos-item__inner"><h3>12</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>13</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-up">
+        <div class="aos-item__inner"><h3>14</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>15</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-up">
+        <div class="aos-item__inner"><h3>16</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-down">
+        <div class="aos-item__inner"><h3>17</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-up">
+        <div class="aos-item__inner"><h3>18</h3></div>
+      </div>
+      <div class="aos-item" data-aos="zoom-out">
+        <div class="aos-item__inner"><h3>19</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-up">
+        <div class="aos-item__inner"><h3>20</h3></div>
+      </div>
+      <div class="aos-item" data-aos="zoom-out">
+        <div class="aos-item__inner"><h3>21</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>22</h3></div>
+      </div>
+      <div class="aos-item" data-aos="zoom-out-up">
+        <div class="aos-item__inner"><h3>23</h3></div>
+      </div>
+      <div class="aos-item" data-aos="zoom-out-down">
+        <div class="aos-item__inner"><h3>24</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>25</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>26</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>27</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>28</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>29</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>30</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>31</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>32</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>33</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>34</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>35</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>36</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>37</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>38</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>39</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>40</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>41</h3></div>
+      </div>
+      <div class="aos-item" data-aos="fade-in">
+        <div class="aos-item__inner"><h3>42</h3></div>
+      </div>
+    </div>
+
+    <script src="../dist/aos.js"></script>
+    <script>
+      AOS.init({
+        easing: 'ease-in-out-sine'
+      });
+    </script>
+
+    <!-- <script src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.11/require.min.js"></script>
+    <script>
+      requirejs.config({
+          baseUrl: '../dist',
+      });
+
+      require(['aos'], function(AOS){
+          AOS.init({
+              easing: 'ease-in-out-sine'
+          });
+      });
+    </script> -->
+  </body>
+</html>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
node_modules/aos/dist/aos.css


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 0
node_modules/aos/dist/aos.js


+ 63 - 0
node_modules/aos/karma.conf.js

@@ -0,0 +1,63 @@
+// Karma configuration
+// Generated on Mon Oct 19 2015 01:12:15 GMT+0200 (CEST)
+var isTravis = process.env.TRAVIS || false;
+var browsers = isTravis ? ['Chrome_travis_ci'] : ['Chrome'];
+var singleRun = isTravis;
+
+module.exports = function(config) {
+  config.set({
+    basePath: '',
+    browsers: browsers,
+    frameworks: ['jasmine-jquery', 'jasmine'],
+
+    files: [
+      'node_modules/babel-polyfill/dist/polyfill.js',
+      'test/index.js',
+      {
+        pattern: 'test/fixtures/**/*.html',
+        watched: true,
+        included: false,
+        served: true
+      }
+    ],
+
+    preprocessors: {
+      'test/index.js': ['webpack']
+    },
+
+    webpack: {
+      devtool: 'inline-source-map',
+      module: {
+        loaders: [{
+          test: /\.js?$/,
+          exclude: [/bower_components/, /node_modules/],
+          loader: 'babel'
+        }, {
+          test: /\.scss$/,
+          loader: "css-loader?sourceMap!sass-loader"
+        }]
+      }
+    },
+
+    plugins: [
+      'karma-chrome-launcher',
+      'karma-jasmine-jquery',
+      'karma-jasmine',
+      'karma-webpack'
+    ],
+
+    reporters: ['dots'],
+
+    customLaunchers: {
+      Chrome_travis_ci: {
+        base: 'Chrome',
+        flags: ['--no-sandbox']
+      }
+    },
+
+    port: 9876,
+    singleRun: singleRun,
+    colors: true,
+    logLevel: config.LOG_WARN
+  })
+}

+ 52 - 0
node_modules/aos/package.json

@@ -0,0 +1,52 @@
+{
+  "name": "aos",
+  "version": "2.3.4",
+  "description": "Animate on scroll library",
+  "homepage": "https://michalsnik.github.io/aos/",
+  "author": "Michał Sajnóg <michal.sajnog@hotmail.com>",
+  "license": "MIT",
+  "main": "dist/aos.js",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/michalsnik/aos.git"
+  },
+  "bugs": {
+    "url": "https://github.com/michalsnik/aos/issues"
+  },
+  "devDependencies": {
+    "autoprefixer": "^7.1.2",
+    "babel-core": "^6.9.1",
+    "babel-loader": "^6.2.4",
+    "babel-plugin-transform-object-assign": "^6.8.0",
+    "babel-polyfill": "^6.9.1",
+    "babel-preset-es2015": "^6.9.0",
+    "css-loader": "^0.28.0",
+    "extract-text-webpack-plugin": "^1.0.1",
+    "jasmine-core": "^2.3.4",
+    "jasmine-fixture": "^2.0.0",
+    "jasmine-jquery": "^2.1.1",
+    "jquery": "^3.1.1",
+    "karma": "^1.4.0",
+    "karma-chrome-launcher": "^2.0.0",
+    "karma-jasmine": "^1.1.0",
+    "karma-jasmine-jquery": "^0.1.1",
+    "karma-webpack": "^2.0.1",
+    "node-sass": "^4.3.0",
+    "phantomjs": "^2.1.7",
+    "postcss-loader": "^2.0.6",
+    "sass-loader": "^4.1.1",
+    "style-loader": "^0.18.2",
+    "webpack": "^1.13.1",
+    "webpack-dev-server": "^1.14.1"
+  },
+  "dependencies": {
+    "classlist-polyfill": "^1.0.3",
+    "lodash.debounce": "^4.0.6",
+    "lodash.throttle": "^4.0.1"
+  },
+  "scripts": {
+    "test": "node ./node_modules/karma/bin/karma start karma.conf.js",
+    "build": "webpack",
+    "dev": "node ./node_modules/webpack-dev-server/bin/webpack-dev-server.js"
+  }
+}

+ 5 - 0
node_modules/aos/postcss.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  plugins: [
+    require('autoprefixer')
+  ]
+}

+ 193 - 0
node_modules/aos/src/js/aos.js

@@ -0,0 +1,193 @@
+/**
+ * *******************************************************
+ * AOS (Animate on scroll) - wowjs alternative
+ * made to animate elements on scroll in both directions
+ * *******************************************************
+ */
+
+import styles from './../sass/aos.scss';
+
+// Modules & helpers
+import throttle from 'lodash.throttle';
+import debounce from 'lodash.debounce';
+
+import observer from './libs/observer';
+
+import detect from './helpers/detector';
+import handleScroll from './helpers/handleScroll';
+import prepare from './helpers/prepare';
+import elements from './helpers/elements';
+
+/**
+ * Private variables
+ */
+let $aosElements = [];
+let initialized = false;
+
+/**
+ * Default options
+ */
+let options = {
+  offset: 120,
+  delay: 0,
+  easing: 'ease',
+  duration: 400,
+  disable: false,
+  once: false,
+  startEvent: 'DOMContentLoaded',
+  throttleDelay: 99,
+  debounceDelay: 50,
+  disableMutationObserver: false,
+};
+
+/**
+ * Refresh AOS
+ */
+const refresh = function refresh(initialize = false) {
+  // Allow refresh only when it was first initialized on startEvent
+  if (initialize) initialized = true;
+
+  if (initialized) {
+    // Extend elements objects in $aosElements with their positions
+    $aosElements = prepare($aosElements, options);
+    // Perform scroll event, to refresh view and show/hide elements
+    handleScroll($aosElements, options.once);
+
+    return $aosElements;
+  }
+};
+
+/**
+ * Hard refresh
+ * create array with new elements and trigger refresh
+ */
+const refreshHard = function refreshHard() {
+  $aosElements = elements();
+  refresh();
+};
+
+/**
+ * Disable AOS
+ * Remove all attributes to reset applied styles
+ */
+const disable = function() {
+  $aosElements.forEach(function(el, i) {
+    el.node.removeAttribute('data-aos');
+    el.node.removeAttribute('data-aos-easing');
+    el.node.removeAttribute('data-aos-duration');
+    el.node.removeAttribute('data-aos-delay');
+  });
+};
+
+
+/**
+ * Check if AOS should be disabled based on provided setting
+ */
+const isDisabled = function(optionDisable) {
+  return optionDisable === true ||
+  (optionDisable === 'mobile' && detect.mobile()) ||
+  (optionDisable === 'phone' && detect.phone()) ||
+  (optionDisable === 'tablet' && detect.tablet()) ||
+  (typeof optionDisable === 'function' && optionDisable() === true);
+};
+
+/**
+ * Initializing AOS
+ * - Create options merging defaults with user defined options
+ * - Set attributes on <body> as global setting - css relies on it
+ * - Attach preparing elements to options.startEvent,
+ *   window resize and orientation change
+ * - Attach function that handle scroll and everything connected to it
+ *   to window scroll event and fire once document is ready to set initial state
+ */
+const init = function init(settings) {
+  options = Object.assign(options, settings);
+
+  // Create initial array with elements -> to be fullfilled later with prepare()
+  $aosElements = elements();
+
+  // Detect not supported browsers (<=IE9)
+  // http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
+  const browserNotSupported = document.all && !window.atob;
+
+  /**
+   * Don't init plugin if option `disable` is set
+   * or when browser is not supported
+   */
+  if (isDisabled(options.disable) || browserNotSupported) {
+    return disable();
+  }
+
+  /**
+   * Disable mutation observing if not supported
+   */
+  if (!options.disableMutationObserver && !observer.isSupported()) {
+    console.info(`
+      aos: MutationObserver is not supported on this browser,
+      code mutations observing has been disabled.
+      You may have to call "refreshHard()" by yourself.
+    `);
+    options.disableMutationObserver = true;
+  }
+
+  /**
+   * Set global settings on body, based on options
+   * so CSS can use it
+   */
+  document.querySelector('body').setAttribute('data-aos-easing', options.easing);
+  document.querySelector('body').setAttribute('data-aos-duration', options.duration);
+  document.querySelector('body').setAttribute('data-aos-delay', options.delay);
+
+  /**
+   * Handle initializing
+   */
+  if (options.startEvent === 'DOMContentLoaded' &&
+    ['complete', 'interactive'].indexOf(document.readyState) > -1) {
+    // Initialize AOS if default startEvent was already fired
+    refresh(true);
+  } else if (options.startEvent === 'load') {
+    // If start event is 'Load' - attach listener to window
+    window.addEventListener(options.startEvent, function() {
+      refresh(true);
+    });
+  } else {
+    // Listen to options.startEvent and initialize AOS
+    document.addEventListener(options.startEvent, function() {
+      refresh(true);
+    });
+  }
+
+  /**
+   * Refresh plugin on window resize or orientation change
+   */
+  window.addEventListener('resize', debounce(refresh, options.debounceDelay, true));
+  window.addEventListener('orientationchange', debounce(refresh, options.debounceDelay, true));
+
+  /**
+   * Handle scroll event to animate elements on scroll
+   */
+  window.addEventListener('scroll', throttle(() => {
+    handleScroll($aosElements, options.once);
+  }, options.throttleDelay));
+
+  /**
+   * Observe [aos] elements
+   * If something is loaded by AJAX
+   * it'll refresh plugin automatically
+   */
+  if (!options.disableMutationObserver) {
+    observer.ready('[data-aos]', refreshHard);
+  }
+
+  return $aosElements;
+};
+
+/**
+ * Export Public API
+ */
+
+module.exports = {
+  init,
+  refresh,
+  refreshHard
+};

+ 70 - 0
node_modules/aos/src/js/helpers/calculateOffset.js

@@ -0,0 +1,70 @@
+/**
+ * Calculate offset
+ * basing on element's settings like:
+ * - anchor
+ * - offset
+ *
+ * @param  {Node} el [Dom element]
+ * @return {Integer} [Final offset that will be used to trigger animation in good position]
+ */
+
+import getOffset from './../libs/offset';
+
+const calculateOffset = function (el, optionalOffset) {
+  let elementOffsetTop = 0;
+  let additionalOffset = 0;
+  const windowHeight = window.innerHeight;
+  const attrs = {
+    offset: el.getAttribute('data-aos-offset'),
+    anchor: el.getAttribute('data-aos-anchor'),
+    anchorPlacement: el.getAttribute('data-aos-anchor-placement')
+  };
+
+  if (attrs.offset && !isNaN(attrs.offset)) {
+    additionalOffset = parseInt(attrs.offset);
+  }
+
+  if (attrs.anchor && document.querySelectorAll(attrs.anchor)) {
+    el = document.querySelectorAll(attrs.anchor)[0];
+  }
+
+  elementOffsetTop = getOffset(el).top;
+
+  switch (attrs.anchorPlacement) {
+    case 'top-bottom':
+      // Default offset
+      break;
+    case 'center-bottom':
+      elementOffsetTop += el.offsetHeight / 2;
+      break;
+    case 'bottom-bottom':
+      elementOffsetTop += el.offsetHeight;
+      break;
+    case 'top-center':
+      elementOffsetTop += windowHeight / 2;
+      break;
+    case 'bottom-center':
+      elementOffsetTop += windowHeight / 2 + el.offsetHeight;
+      break;
+    case 'center-center':
+      elementOffsetTop += windowHeight / 2 + el.offsetHeight / 2;
+      break;
+    case 'top-top':
+      elementOffsetTop += windowHeight;
+      break;
+    case 'bottom-top':
+      elementOffsetTop += el.offsetHeight + windowHeight;
+      break;
+    case 'center-top':
+      elementOffsetTop += el.offsetHeight / 2 + windowHeight;
+      break;
+  }
+
+  if (!attrs.anchorPlacement && !attrs.offset && !isNaN(optionalOffset)) {
+    additionalOffset = optionalOffset;
+  }
+
+  return elementOffsetTop + additionalOffset;
+};
+
+export default calculateOffset;

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 33 - 0
node_modules/aos/src/js/helpers/detector.js


+ 11 - 0
node_modules/aos/src/js/helpers/elements.js

@@ -0,0 +1,11 @@
+/**
+ * Generate initial array with elements as objects
+ * This array will be extended later with elements attributes values
+ * like 'position'
+ */
+const createArrayWithElements = function (elements) {
+  elements = elements || document.querySelectorAll('[data-aos]');
+  return Array.prototype.map.call(elements, node => ({ node }));
+};
+
+export default createArrayWithElements;

+ 39 - 0
node_modules/aos/src/js/helpers/handleScroll.js

@@ -0,0 +1,39 @@
+/**
+ * Set or remove aos-animate class
+ * @param {node} el         element
+ * @param {int}  top        scrolled distance
+ * @param {void} once
+ */
+const setState = function (el, top, once) {
+  const attrOnce = el.node.getAttribute('data-aos-once');
+
+  if (top > el.position) {
+    el.node.classList.add('aos-animate');
+  } else if (typeof attrOnce !== 'undefined') {
+    if (attrOnce === 'false' || (!once && attrOnce !== 'true')) {
+      el.node.classList.remove('aos-animate');
+    }
+  }
+};
+
+
+/**
+ * Scroll logic - add or remove 'aos-animate' class on scroll
+ *
+ * @param  {array} $elements         array of elements nodes
+ * @param  {bool} once               plugin option
+ * @return {void}
+ */
+const handleScroll = function ($elements, once) {
+  const scrollTop = window.pageYOffset;
+  const windowHeight = window.innerHeight;
+  /**
+   * Check all registered elements positions
+   * and animate them on scroll
+   */
+  $elements.forEach((el, i) => {
+    setState(el, windowHeight + scrollTop, once);
+  });
+};
+
+export default handleScroll;

+ 13 - 0
node_modules/aos/src/js/helpers/prepare.js

@@ -0,0 +1,13 @@
+/* Clearing variables */
+
+import calculateOffset from './calculateOffset';
+
+const prepare = function ($elements, options) {
+  $elements.forEach((el, i) => {
+    el.node.classList.add('aos-init');
+    el.position = calculateOffset(el.node, options.offset);
+  });
+  return $elements;
+};
+
+export default prepare;

+ 61 - 0
node_modules/aos/src/js/libs/observer.js

@@ -0,0 +1,61 @@
+let callback = () => {};
+
+function containsAOSNode(nodes) {
+  let i, currentNode, result;
+
+  for (i = 0; i < nodes.length; i += 1) {
+    currentNode = nodes[i];
+
+    if (currentNode.dataset && currentNode.dataset.aos) {
+      return true;
+    }
+
+    result = currentNode.children && containsAOSNode(currentNode.children);
+
+    if (result) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+function getMutationObserver() {
+  return window.MutationObserver ||
+    window.WebKitMutationObserver ||
+    window.MozMutationObserver;
+}
+
+function isSupported() {
+  return !!getMutationObserver();
+}
+
+function ready(selector, fn) {
+  const doc = window.document;
+  const MutationObserver = getMutationObserver();
+
+  const observer = new MutationObserver(check);
+  callback = fn;
+
+  observer.observe(doc.documentElement, {
+    childList: true,
+    subtree: true,
+    removedNodes: true
+  });
+}
+
+function check(mutations) {
+  if (!mutations) return;
+
+  mutations.forEach(mutation => {
+    const addedNodes = Array.prototype.slice.call(mutation.addedNodes);
+    const removedNodes = Array.prototype.slice.call(mutation.removedNodes);
+    const allNodes = addedNodes.concat(removedNodes);
+
+    if (containsAOSNode(allNodes)) {
+      return callback();
+    }
+  });
+}
+
+export default { isSupported, ready };

+ 24 - 0
node_modules/aos/src/js/libs/offset.js

@@ -0,0 +1,24 @@
+/**
+ * Get offset of DOM element Helper
+ * including these with translation
+ *
+ * @param  {Node} el [DOM element]
+ * @return {Object} [top and left offset]
+ */
+const offset = function (el) {
+  let _x = 0;
+  let _y = 0;
+
+  while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {
+    _x += el.offsetLeft - (el.tagName != 'BODY' ? el.scrollLeft : 0);
+    _y += el.offsetTop - (el.tagName != 'BODY' ? el.scrollTop : 0);
+    el = el.offsetParent;
+  }
+
+  return {
+    top: _y,
+    left: _x
+  };
+};
+
+export default offset;

+ 177 - 0
node_modules/aos/src/sass/_animations.scss

@@ -0,0 +1,177 @@
+// Animations variables
+$aos-distance: 100px !default;
+
+
+
+
+/**
+ * Fade animations:
+ * fade
+ * fade-up, fade-down, fade-left, fade-right
+ * fade-up-right, fade-up-left, fade-down-right, fade-down-left
+ */
+
+[data-aos^='fade'][data-aos^='fade'] {
+  opacity: 0;
+  transition-property: opacity, transform;
+
+  &.aos-animate {
+    opacity: 1;
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+[data-aos='fade-up'] {
+  transform: translate3d(0, $aos-distance, 0);
+}
+
+[data-aos='fade-down'] {
+  transform: translate3d(0, -$aos-distance, 0);
+}
+
+[data-aos='fade-right'] {
+  transform: translate3d(-$aos-distance, 0, 0);
+}
+
+[data-aos='fade-left'] {
+  transform: translate3d($aos-distance, 0, 0);
+}
+
+[data-aos='fade-up-right'] {
+  transform: translate3d(-$aos-distance, $aos-distance, 0);
+}
+
+[data-aos='fade-up-left'] {
+  transform: translate3d($aos-distance, $aos-distance, 0);
+}
+
+[data-aos='fade-down-right'] {
+  transform: translate3d(-$aos-distance, -$aos-distance, 0);
+}
+
+[data-aos='fade-down-left'] {
+  transform: translate3d($aos-distance, -$aos-distance, 0);
+}
+
+
+
+
+/**
+ * Zoom animations:
+ * zoom-in, zoom-in-up, zoom-in-down, zoom-in-left, zoom-in-right
+ * zoom-out, zoom-out-up, zoom-out-down, zoom-out-left, zoom-out-right
+ */
+
+[data-aos^='zoom'][data-aos^='zoom'] {
+  opacity: 0;
+  transition-property: opacity, transform;
+
+  &.aos-animate {
+    opacity: 1;
+    transform: translate3d(0, 0, 0) scale(1);
+  }
+}
+
+[data-aos='zoom-in'] {
+  transform: scale(.6);
+}
+
+[data-aos='zoom-in-up'] {
+  transform: translate3d(0, $aos-distance, 0) scale(.6);
+}
+
+[data-aos='zoom-in-down'] {
+  transform: translate3d(0, -$aos-distance, 0) scale(.6);
+}
+
+[data-aos='zoom-in-right'] {
+  transform: translate3d(-$aos-distance, 0, 0) scale(.6);
+}
+
+[data-aos='zoom-in-left'] {
+  transform: translate3d($aos-distance, 0, 0) scale(.6);
+}
+
+[data-aos='zoom-out'] {
+  transform: scale(1.2);
+}
+
+[data-aos='zoom-out-up'] {
+  transform: translate3d(0, $aos-distance, 0) scale(1.2);
+}
+
+[data-aos='zoom-out-down'] {
+  transform: translate3d(0, -$aos-distance, 0) scale(1.2);
+}
+
+[data-aos='zoom-out-right'] {
+  transform: translate3d(-$aos-distance, 0, 0) scale(1.2);
+}
+
+[data-aos='zoom-out-left'] {
+  transform: translate3d($aos-distance, 0, 0) scale(1.2);
+}
+
+
+
+
+/**
+ * Slide animations
+ */
+
+[data-aos^='slide'][data-aos^='slide'] {
+  transition-property: transform;
+
+  &.aos-animate {
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+[data-aos='slide-up'] {
+  transform: translate3d(0, 100%, 0);
+}
+
+[data-aos='slide-down'] {
+  transform: translate3d(0, -100%, 0);
+}
+
+[data-aos='slide-right'] {
+  transform: translate3d(-100%, 0, 0);
+}
+
+[data-aos='slide-left'] {
+  transform: translate3d(100%, 0, 0);
+}
+
+
+
+
+/**
+ * Flip animations:
+ * flip-left, flip-right, flip-up, flip-down
+ */
+
+[data-aos^='flip'][data-aos^='flip'] {
+  backface-visibility: hidden;
+  transition-property: transform;
+}
+
+[data-aos='flip-left'] {
+  transform: perspective(2500px) rotateY(-100deg);
+  &.aos-animate {transform: perspective(2500px) rotateY(0);}
+}
+
+[data-aos='flip-right'] {
+  transform: perspective(2500px) rotateY(100deg);
+  &.aos-animate {transform: perspective(2500px) rotateY(0);}
+}
+
+[data-aos='flip-up'] {
+  transform: perspective(2500px) rotateX(-100deg);
+  &.aos-animate {transform: perspective(2500px) rotateX(0);}
+}
+
+[data-aos='flip-down'] {
+  transform: perspective(2500px) rotateX(100deg);
+  &.aos-animate {transform: perspective(2500px) rotateX(0);}
+}

+ 18 - 0
node_modules/aos/src/sass/_core.scss

@@ -0,0 +1,18 @@
+// Generate Duration && Delay
+[data-aos] {
+  @for $i from 1 through 60 {
+    body[data-aos-duration='#{$i * 50}'] &,
+    &[data-aos][data-aos-duration='#{$i * 50}'] {
+      transition-duration: #{$i * 50}ms;
+    }
+
+    body[data-aos-delay='#{$i * 50}'] &,
+    &[data-aos][data-aos-delay='#{$i * 50}'] {
+      transition-delay: 0;
+
+      &.aos-animate {
+        transition-delay: #{$i * 50}ms;
+      }
+    }
+  }
+}

+ 40 - 0
node_modules/aos/src/sass/_easing.scss

@@ -0,0 +1,40 @@
+$aos-easing: (
+  linear: cubic-bezier(.250, .250, .750, .750),
+
+  ease: cubic-bezier(.250, .100, .250, 1),
+  ease-in: cubic-bezier(.420, 0, 1, 1),
+  ease-out: cubic-bezier(.000, 0, .580, 1),
+  ease-in-out: cubic-bezier(.420, 0, .580, 1),
+
+  ease-in-back: cubic-bezier(.6, -.28, .735, .045),
+  ease-out-back: cubic-bezier(.175, .885, .32, 1.275),
+  ease-in-out-back: cubic-bezier(.68, -.55, .265, 1.55),
+
+  ease-in-sine: cubic-bezier(.47, 0, .745, .715),
+  ease-out-sine: cubic-bezier(.39, .575, .565, 1),
+  ease-in-out-sine: cubic-bezier(.445, .05, .55, .95),
+
+  ease-in-quad: cubic-bezier(.55, .085, .68, .53),
+  ease-out-quad: cubic-bezier(.25, .46, .45, .94),
+  ease-in-out-quad: cubic-bezier(.455, .03, .515, .955),
+
+  ease-in-cubic: cubic-bezier(.55, .085, .68, .53),
+  ease-out-cubic: cubic-bezier(.25, .46, .45, .94),
+  ease-in-out-cubic: cubic-bezier(.455, .03, .515, .955),
+
+  ease-in-quart: cubic-bezier(.55, .085, .68, .53),
+  ease-out-quart: cubic-bezier(.25, .46, .45, .94),
+  ease-in-out-quart: cubic-bezier(.455, .03, .515, .955)
+);
+
+// Easings implementations
+// Default timing function: 'ease'
+
+[data-aos] {
+  @each $key, $val in $aos-easing {
+    body[data-aos-easing="#{$key}"] &,
+    &[data-aos][data-aos-easing="#{$key}"] {
+      transition-timing-function: $val;
+    }
+  }
+}

+ 3 - 0
node_modules/aos/src/sass/aos.scss

@@ -0,0 +1,3 @@
+@import 'core';
+@import 'easing';
+@import 'animations';

+ 51 - 0
node_modules/aos/test/aos.spec.js

@@ -0,0 +1,51 @@
+import $ from 'jquery';
+import AOS from '../src/js/aos';
+
+jasmine.getStyleFixtures().fixturesPath = 'base/dist';
+jasmine.getFixtures().fixturesPath = 'base/test/fixtures';
+
+describe('AOS -> ', function() {
+
+  beforeEach(function() {
+    jasmine.getStyleFixtures().load = 'aos.css';
+    jasmine.getFixtures().load('aos.fixture.html');
+  });
+
+  afterEach(function() {
+    jasmine.getStyleFixtures().cleanUp();
+    jasmine.getFixtures().cleanUp();
+  });
+
+  it('Should be defined', function() {
+    expect(AOS).toBeDefined();
+  });
+
+  it('Should have init method', function() {
+    expect(AOS.init).toBeDefined();
+  });
+
+  it('Should have refresh method', function() {
+    expect(AOS.refresh).toBeDefined();
+  });
+
+  it('Should have same number of elements after init', function() {
+    var elementsCount = $('.aos-item').length;
+    var elements = AOS.init();
+    expect(elementsCount).toEqual(elements.length);
+  });
+
+  it('Should have same number of elements after refresh', function() {
+    var elementsCount = $('.aos-item').length;
+    var elements = AOS.init();
+    elements = AOS.refresh(true);
+    expect(elements.length).toEqual(elementsCount);
+  });
+
+  it('Should add aos-init class on all elements', function() {
+    var elementsCount = $('.aos-item').length;
+    AOS.init();
+    var elementsWithClass = $('.aos-init');
+    expect(elementsCount).toEqual(elementsWithClass.length);
+  });
+
+});

+ 241 - 0
node_modules/aos/test/calculateOffset.spec.js

@@ -0,0 +1,241 @@
+import $ from 'jquery';
+import calculateOffset from '../src/js/helpers/calculateOffset';
+
+const delay = 50;
+
+jasmine.getStyleFixtures().fixturesPath = 'base/dist';
+jasmine.getFixtures().fixturesPath = 'base/test/fixtures';
+
+describe('Offset -> ', function() {
+
+  beforeEach(function() {
+    jasmine.getStyleFixtures().load = 'aos.css';
+    jasmine.getFixtures().load('aos.fixture.html');
+  });
+
+  afterEach(function() {
+    jasmine.getStyleFixtures().cleanUp();
+    jasmine.getFixtures().cleanUp();
+  });
+
+  describe('with default option set to "0" -> ', function() {
+    var offset = 0;
+
+    it('on aos-item--1 should equal 0', function(done) {
+      var node = document.querySelector('.aos-item--1');
+
+      setTimeout(function() {
+        expect(calculateOffset(node, offset)).toBe(0);
+        done();
+      }, delay);
+    });
+
+    it('on aos-item--2 should equal 150', function(done) {
+      var node = document.querySelector('.aos-item--2');
+
+      setTimeout(function() {
+        expect(calculateOffset(node, offset)).toBe(150);
+        done();
+      }, delay);
+    });
+
+    it('on aos-item--6 should equal 750', function(done) {
+      var node = document.querySelector('.aos-item--6');
+
+      setTimeout(function() {
+        expect(calculateOffset(node, offset)).toBe(750);
+        done();
+      }, delay);
+    });
+
+  });
+
+  describe('with default option set to "50" => ', function() {
+    var offset = 50;
+
+    it('on aos-item--1 should equal 50', function(done) {
+      var node = document.querySelector('.aos-item--1');
+
+      setTimeout(function() {
+        expect(calculateOffset(node, offset)).toBe(50);
+        done();
+      }, delay);
+    });
+
+    it('on aos-item--2 should equal 200', function(done) {
+      var node = document.querySelector('.aos-item--2');
+
+      setTimeout(function() {
+        expect(calculateOffset(node, offset)).toBe(200);
+        done();
+      }, delay);
+    });
+
+    it('on aos-item--6 should equal 800', function(done) {
+      var node = document.querySelector('.aos-item--6');
+
+      setTimeout(function() {
+        expect(calculateOffset(node, offset)).toBe(800);
+        done();
+      }, delay);
+    });
+
+  });
+
+  describe('after AOS init -> ', function() {
+
+    beforeEach(function() {
+      $('.aos-item').addClass('aos-init');
+    });
+
+    describe('with option "offset" set to "50" => ', function() {
+      var offset = 50;
+
+      it('on aos-item--1 should equal 50', function(done) {
+        var node = document.querySelector('.aos-item--1');
+
+        setTimeout(function() {
+          expect(calculateOffset(node, offset)).toBe(50);
+          done();
+        }, delay);
+      });
+
+      it('on aos-item--2 should equal 200', function(done) {
+        var node = document.querySelector('.aos-item--2');
+
+        setTimeout(function() {
+          expect(calculateOffset(node, offset)).toBe(200);
+          done();
+        }, delay);
+      });
+
+      it('on aos-item--6 should equal 800', function(done) {
+        var node = document.querySelector('.aos-item--6');
+
+        setTimeout(function() {
+          expect(calculateOffset(node, offset)).toBe(800);
+          done();
+        }, delay);
+      });
+
+    });
+
+    describe('with option "offset" set to "0" => ', function() {
+      var offset = 0;
+
+      it('on aos-item--1 should equal 0', function(done) {
+        var node = document.querySelector('.aos-item--1');
+
+        setTimeout(function() {
+          expect(calculateOffset(node, offset)).toBe(0);
+          done();
+        }, delay);
+      });
+
+      it('on aos-item--2 should equal 150', function(done) {
+        var node = document.querySelector('.aos-item--2');
+
+        setTimeout(function() {
+          expect(calculateOffset(node, offset)).toBe(150);
+          done();
+        }, delay);
+      });
+
+      it('on aos-item--6 should equal 750', function(done) {
+        var node = document.querySelector('.aos-item--6');
+
+        setTimeout(function() {
+          expect(calculateOffset(node, offset)).toBe(750);
+          done();
+        }, delay);
+      });
+
+    });
+
+  });
+
+});
+
+
+describe('Offset on element with attr [aos-offset] -> set to "50" ', function() {
+
+  beforeEach(function() {
+    jasmine.getStyleFixtures().load = 'aos.css';
+    jasmine.getFixtures().load('aos-offset.fixture.html');
+  });
+
+  afterEach(function() {
+    jasmine.getStyleFixtures().cleanUp();
+    jasmine.getFixtures().cleanUp();
+  });
+
+  it('on aos-item--1 should equal 50', function(done) {
+    var node = document.querySelector('.aos-item--1');
+
+    setTimeout(function() {
+      expect(calculateOffset(node)).toBe(50);
+      done();
+    }, delay);
+  });
+
+  it('on aos-item--2 should equal 200', function(done) {
+    var node = document.querySelector('.aos-item--2');
+
+    setTimeout(function() {
+      expect(calculateOffset(node)).toBe(200);
+      done();
+    }, delay);
+  });
+
+  it('on aos-item--6 should equal 800', function(done) {
+    var node = document.querySelector('.aos-item--6');
+
+    setTimeout(function() {
+      expect(calculateOffset(node)).toBe(800);
+      done();
+    }, delay);
+  });
+
+});
+
+describe('Offset on element with attr [aos-offset] after AOS init -> set to "50" ', function() {
+
+  beforeEach(function() {
+    jasmine.getStyleFixtures().load = 'aos.css';
+    jasmine.getFixtures().load('aos-offset.fixture.html');
+    $('.aos-item').addClass('aos-init');
+  });
+
+  afterEach(function() {
+    jasmine.getStyleFixtures().cleanUp();
+    jasmine.getFixtures().cleanUp();
+  });
+
+  it('on aos-item--1 should equal 50', function(done) {
+    var node = document.querySelector('.aos-item--1');
+
+    setTimeout(function() {
+      expect(calculateOffset(node)).toBe(50);
+      done();
+    }, delay);
+  });
+
+  it('on aos-item--2 should equal 200', function(done) {
+    var node = document.querySelector('.aos-item--2');
+
+    setTimeout(function() {
+      expect(calculateOffset(node)).toBe(200);
+      done();
+    }, delay);
+  });
+
+  it('on aos-item--6 should equal 800', function(done) {
+    var node = document.querySelector('.aos-item--6');
+
+    setTimeout(function() {
+      expect(calculateOffset(node)).toBe(800);
+      done();
+    }, delay);
+  });
+
+});

+ 56 - 0
node_modules/aos/test/elements.spec.js

@@ -0,0 +1,56 @@
+import $ from 'jquery';
+import elements from '../src/js/helpers/elements';
+
+jasmine.getStyleFixtures().fixturesPath = 'base/dist';
+jasmine.getFixtures().fixturesPath = 'base/test/fixtures';
+
+describe('Elements helper (elements.js) -> ', function() {
+
+  beforeEach(function() {
+    jasmine.getStyleFixtures().load = 'aos.css';
+    jasmine.getFixtures().load('aos.fixture.html');
+  });
+
+  afterEach(function() {
+    jasmine.getStyleFixtures().cleanUp();
+    jasmine.getFixtures().cleanUp();
+  });
+
+  it('Should return array with objects that coresponds to elements in aos.fixture.html', function() {
+    var aosElements = elements();
+    expect(aosElements.length).toBe($('[data-aos]').length);
+  });
+
+  it('Should return array of objects', function() {
+    var aosElements = elements();
+
+    for (var i = 0; i < aosElements.length; i++) {
+      if (aosElements[i].node) {
+        expect(typeof aosElements[i]).toEqual('object');
+      }
+    }
+  });
+
+  it('Each object in returned array should have "node" attribute', function() {
+    var aosElements = elements();
+
+    for (var i = 0; i < aosElements.length; i++) {
+      expect(aosElements[i].hasOwnProperty('node')).toBe(true);
+    }
+  });
+
+  it('Each objects node in returned array should be a DOMNode', function() {
+    var aosElements = elements();
+
+    function isNode(obj) {
+      return (typeof obj === "object") && (obj.nodeType === 1) && (typeof obj.style === "object") && (typeof obj.ownerDocument === "object");
+    }
+
+    for (var i = 0; i < aosElements.length; i++) {
+      if (aosElements[i].node) {
+        expect(isNode(aosElements[i].node)).toBe(true);
+      }
+    }
+  });
+
+});

+ 35 - 0
node_modules/aos/test/fixtures/aos-offset.fixture.html

@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title></title>
+    <style type="text/css">
+      * {box-sizing: border-box;}
+      body {
+        margin: 0; padding: 0 20px; text-align: center;
+      }
+      .aos-item {
+        width: 100%; height: 130px; margin: 0 0 20px 0; background: #ccc;
+      }
+    </style>
+  </head>
+  <body class="body">
+    <div class="aos-item aos-item--1" data-aos-offset="50" data-aos="fade"></div>
+    <div class="aos-item aos-item--2" data-aos-offset="50" data-aos="fade-up"></div>
+    <div class="aos-item aos-item--3" data-aos-offset="50" data-aos="fade-down"></div>
+    <div class="aos-item aos-item--4" data-aos-offset="50" data-aos="fade-left"></div>
+    <div class="aos-item aos-item--5" data-aos-offset="50" data-aos="fade-right"></div>
+    <div class="aos-item aos-item--6" data-aos-offset="50" data-aos="flip-up"></div>
+    <div class="aos-item aos-item--7" data-aos-offset="50" data-aos="flip-down"></div>
+    <div class="aos-item aos-item--8" data-aos-offset="50" data-aos="flip-left"></div>
+    <div class="aos-item aos-item--9" data-aos-offset="50" data-aos="flip-right"></div>
+    <div class="aos-item aos-item--10" data-aos-offset="50" data-aos="zoom-in"></div>
+    <div class="aos-item aos-item--11" data-aos-offset="50" data-aos="zoom-in-up"></div>
+    <div class="aos-item aos-item--12" data-aos-offset="50" data-aos="zoom-in-down"></div>
+    <div class="aos-item aos-item--13" data-aos-offset="50" data-aos="zoom-in-left"></div>
+    <div class="aos-item aos-item--14" data-aos-offset="50" data-aos="zoom-in-right"></div>
+    <div class="aos-item aos-item--15" data-aos-offset="50" data-aos="slide-up"></div>
+    <div class="aos-item aos-item--16" data-aos-offset="50" data-aos="slide-down"></div>
+    <div class="aos-item aos-item--17" data-aos-offset="50" data-aos="slide-left"></div>
+    <div class="aos-item aos-item--18" data-aos-offset="50" data-aos="slide-right"></div>
+  </body>
+</html>

+ 35 - 0
node_modules/aos/test/fixtures/aos.fixture.html

@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title></title>
+    <style type="text/css">
+      * {box-sizing: border-box;}
+      body {
+        margin: 0; padding: 0 20px; text-align: center;
+      }
+      .aos-item {
+        width: 100%; height: 130px; margin: 0 0 20px 0; background: #ccc;
+      }
+    </style>
+  </head>
+  <body class="body">
+    <div class="aos-item aos-item--1" data-aos="fade"></div>
+    <div class="aos-item aos-item--2" data-aos="fade-up"></div>
+    <div class="aos-item aos-item--3" data-aos="fade-down"></div>
+    <div class="aos-item aos-item--4" data-aos="fade-left"></div>
+    <div class="aos-item aos-item--5" data-aos="fade-right"></div>
+    <div class="aos-item aos-item--6" data-aos="flip-up"></div>
+    <div class="aos-item aos-item--7" data-aos="flip-down"></div>
+    <div class="aos-item aos-item--8" data-aos="flip-left"></div>
+    <div class="aos-item aos-item--9" data-aos="flip-right"></div>
+    <div class="aos-item aos-item--10" data-aos="zoom-in"></div>
+    <div class="aos-item aos-item--11" data-aos="zoom-in-up"></div>
+    <div class="aos-item aos-item--12" data-aos="zoom-in-down"></div>
+    <div class="aos-item aos-item--13" data-aos="zoom-in-left"></div>
+    <div class="aos-item aos-item--14" data-aos="zoom-in-right"></div>
+    <div class="aos-item aos-item--15" data-aos="slide-up"></div>
+    <div class="aos-item aos-item--16" data-aos="slide-down"></div>
+    <div class="aos-item aos-item--17" data-aos="slide-left"></div>
+    <div class="aos-item aos-item--18" data-aos="slide-right"></div>
+  </body>
+</html>

+ 3 - 0
node_modules/aos/test/index.js

@@ -0,0 +1,3 @@
+import './aos.spec.js';
+import './elements.spec.js';
+import './calculateOffset.spec.js';

+ 33 - 0
node_modules/aos/webpack.config.js

@@ -0,0 +1,33 @@
+var webpack = require('webpack');
+var ExtractTextPlugin = require('extract-text-webpack-plugin');
+var autoprefixer = require('autoprefixer');
+
+module.exports = {
+  entry: './src/js/aos.js',
+  output: {
+    path: './dist',
+    publicPath: 'dist/',
+    filename: 'aos.js',
+    library: 'AOS',
+    libraryTarget: 'umd',
+  },
+  devServer: {
+    contentBase: 'demo/'
+  },
+  module: {
+    loaders: [
+      {
+        test: /\.js$/,
+        loader: 'babel-loader'
+      },
+      {
+        test: /\.scss$/,
+        loader: ExtractTextPlugin.extract("style-loader", "css-loader?sourceMap!sass-loader!postcss-loader")
+      }
+    ]
+  },
+  plugins: [
+    new ExtractTextPlugin('aos.css'),
+    new webpack.optimize.UglifyJsPlugin()
+  ]
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 5660 - 0
node_modules/aos/yarn.lock


+ 4 - 0
node_modules/classlist-polyfill/.travis.yml

@@ -0,0 +1,4 @@
+script: script/test
+language: node_js
+node_js:
+- '0.10'

+ 26 - 0
node_modules/classlist-polyfill/CHANGELOG.md

@@ -0,0 +1,26 @@
+# Changelog
+
+## 1.2.0
+
+* Rewrite history for [yola/classlist-polyfill][], branching and rebasing
+  from [eligrey/classList][].
+* Update fork
+  * Update package.json to use Unlicense [eligrey#56][]
+  * Fixes add/remove/toggle in IE10 and IE11 [eligrey#57][]
+  * IE8 fixes [eligrey#43][]
+
+[yola/classlist-polyfill]: https://github.com/yola/classlist-polyfill
+[eligrey/classList]: https://github.com/eligrey/classList.js
+[eligrey#57]: https://github.com/eligrey/classList.js/pull/57
+[eligrey#56]: https://github.com/eligrey/classList.js/pull/56
+[eligrey#43]: https://github.com/eligrey/classList.js/pull/43
+
+
+## 1.0.3
+
+* Add support for missing SVGElement.classList in IE
+
+
+## 1.0.2
+
+* Fix issue with `self` not being defined in CommonJS

+ 24 - 0
node_modules/classlist-polyfill/LICENSE

@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>

+ 35 - 0
node_modules/classlist-polyfill/README.md

@@ -0,0 +1,35 @@
+# classlist-polyfill
+
+Polyfill for [`element.classList`][docs].
+
+This is a published fork of [classList.js][].
+
+[classList.js]:https://github.com/eligrey/classList.js
+[docs]: https://developer.mozilla.org/en/DOM/element.classList
+
+
+## Installation
+
+Download using [NPM](https://www.npmjs.com/package/classlist-polyfill):
+
+```shell
+npm install classlist-polyfill
+```
+
+Download using [Bower](http://bower.io/):
+
+```shell
+bower install classlist-polyfill
+```
+
+
+## What is the purpose of this repo?
+
+The upstream maintainer has decided [not to publish][comment].
+
+[comment]: https://github.com/eligrey/classList.js/pull/46#issuecomment-189782600
+
+
+## Contributing
+
+Preferably all changes are made upstream.

+ 24 - 0
node_modules/classlist-polyfill/bower.json

@@ -0,0 +1,24 @@
+{
+  "name": "classlist-polyfill",
+  "description": "MDN's ClassList Polyfill",
+  "main": "src/index.js",
+  "authors": [
+    "Eli Grey <me@eligrey.com>",
+    "Yola Engineering <engineers@yola.com> (https://www.yola.com/)"
+  ],
+  "license": "Unlicense",
+  "keywords": [
+    "classList",
+    "polyfill",
+    "shim",
+    "cross-browser"
+  ],
+  "homepage": "https://github.com/yola/classlist-polyfill",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ]
+}

+ 32 - 0
node_modules/classlist-polyfill/package.json

@@ -0,0 +1,32 @@
+{
+  "name": "classlist-polyfill",
+  "version": "1.2.0",
+  "description": "Cross-browser JavaScript shim that fully implements element.classList (referenced on MDN)",
+  "main": "src/index.js",
+  "directories": {
+    "test": "tests"
+  },
+  "scripts": {
+    "test": "bash ./script/test"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/yola/classlist-polyfill.git"
+  },
+  "keywords": [
+    "classList",
+    "polyfill",
+    "shim",
+    "cross-browser"
+  ],
+  "author": "Eli Grey <me@eligrey.com>",
+  "contributors": [
+    "Eli Grey <me@eligrey.com>",
+    "Yola Engineering <engineers@yola.com> (https://www.yola.com/)"
+  ],
+  "license": "Unlicense",
+  "bugs": {
+    "url": "https://github.com/eligrey/classList.js/issues"
+  },
+  "homepage": "https://github.com/yola/classlist-polyfill"
+}

+ 23 - 0
node_modules/classlist-polyfill/script/test

@@ -0,0 +1,23 @@
+#!/bin/bash
+set -e
+
+if [ -t 1 ]; then
+  red="$(printf "\033[31m")"
+  brightred="$(printf "\033[31;1m")"
+  green="$(printf "\033[32m")"
+  reset="$(printf "\033[m")"
+else
+  red=
+  brightred=
+  green=
+  reset=
+fi
+
+phantomjs tests/runner.coffee tests/qunit.html | sed -E "
+  # failure line:
+  s/^(✘.+)/${red}\\1${reset}/
+  # failure details:
+  s/^(  .+)/${brightred}\\1${reset}/
+  # success marker:
+  s/(✔︎)/${green}\\1${reset}/
+"

+ 240 - 0
node_modules/classlist-polyfill/src/index.js

@@ -0,0 +1,240 @@
+/*
+ * classList.js: Cross-browser full element.classList implementation.
+ * 1.1.20170427
+ *
+ * By Eli Grey, http://eligrey.com
+ * License: Dedicated to the public domain.
+ *   See https://github.com/eligrey/classList.js/blob/master/LICENSE.md
+ */
+
+/*global self, document, DOMException */
+
+/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */
+
+if ("document" in window.self) {
+
+// Full polyfill for browsers with no classList support
+// Including IE < Edge missing SVGElement.classList
+if (!("classList" in document.createElement("_")) 
+	|| document.createElementNS && !("classList" in document.createElementNS("http://www.w3.org/2000/svg","g"))) {
+
+(function (view) {
+
+"use strict";
+
+if (!('Element' in view)) return;
+
+var
+	  classListProp = "classList"
+	, protoProp = "prototype"
+	, elemCtrProto = view.Element[protoProp]
+	, objCtr = Object
+	, strTrim = String[protoProp].trim || function () {
+		return this.replace(/^\s+|\s+$/g, "");
+	}
+	, arrIndexOf = Array[protoProp].indexOf || function (item) {
+		var
+			  i = 0
+			, len = this.length
+		;
+		for (; i < len; i++) {
+			if (i in this && this[i] === item) {
+				return i;
+			}
+		}
+		return -1;
+	}
+	// Vendors: please allow content code to instantiate DOMExceptions
+	, DOMEx = function (type, message) {
+		this.name = type;
+		this.code = DOMException[type];
+		this.message = message;
+	}
+	, checkTokenAndGetIndex = function (classList, token) {
+		if (token === "") {
+			throw new DOMEx(
+				  "SYNTAX_ERR"
+				, "An invalid or illegal string was specified"
+			);
+		}
+		if (/\s/.test(token)) {
+			throw new DOMEx(
+				  "INVALID_CHARACTER_ERR"
+				, "String contains an invalid character"
+			);
+		}
+		return arrIndexOf.call(classList, token);
+	}
+	, ClassList = function (elem) {
+		var
+			  trimmedClasses = strTrim.call(elem.getAttribute("class") || "")
+			, classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
+			, i = 0
+			, len = classes.length
+		;
+		for (; i < len; i++) {
+			this.push(classes[i]);
+		}
+		this._updateClassName = function () {
+			elem.setAttribute("class", this.toString());
+		};
+	}
+	, classListProto = ClassList[protoProp] = []
+	, classListGetter = function () {
+		return new ClassList(this);
+	}
+;
+// Most DOMException implementations don't allow calling DOMException's toString()
+// on non-DOMExceptions. Error's toString() is sufficient here.
+DOMEx[protoProp] = Error[protoProp];
+classListProto.item = function (i) {
+	return this[i] || null;
+};
+classListProto.contains = function (token) {
+	token += "";
+	return checkTokenAndGetIndex(this, token) !== -1;
+};
+classListProto.add = function () {
+	var
+		  tokens = arguments
+		, i = 0
+		, l = tokens.length
+		, token
+		, updated = false
+	;
+	do {
+		token = tokens[i] + "";
+		if (checkTokenAndGetIndex(this, token) === -1) {
+			this.push(token);
+			updated = true;
+		}
+	}
+	while (++i < l);
+
+	if (updated) {
+		this._updateClassName();
+	}
+};
+classListProto.remove = function () {
+	var
+		  tokens = arguments
+		, i = 0
+		, l = tokens.length
+		, token
+		, updated = false
+		, index
+	;
+	do {
+		token = tokens[i] + "";
+		index = checkTokenAndGetIndex(this, token);
+		while (index !== -1) {
+			this.splice(index, 1);
+			updated = true;
+			index = checkTokenAndGetIndex(this, token);
+		}
+	}
+	while (++i < l);
+
+	if (updated) {
+		this._updateClassName();
+	}
+};
+classListProto.toggle = function (token, force) {
+	token += "";
+
+	var
+		  result = this.contains(token)
+		, method = result ?
+			force !== true && "remove"
+		:
+			force !== false && "add"
+	;
+
+	if (method) {
+		this[method](token);
+	}
+
+	if (force === true || force === false) {
+		return force;
+	} else {
+		return !result;
+	}
+};
+classListProto.toString = function () {
+	return this.join(" ");
+};
+
+if (objCtr.defineProperty) {
+	var classListPropDesc = {
+		  get: classListGetter
+		, enumerable: true
+		, configurable: true
+	};
+	try {
+		objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+	} catch (ex) { // IE 8 doesn't support enumerable:true
+		// adding undefined to fight this issue https://github.com/eligrey/classList.js/issues/36
+		// modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected
+		if (ex.number === undefined || ex.number === -0x7FF5EC54) {
+			classListPropDesc.enumerable = false;
+			objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+		}
+	}
+} else if (objCtr[protoProp].__defineGetter__) {
+	elemCtrProto.__defineGetter__(classListProp, classListGetter);
+}
+
+}(window.self));
+
+}
+
+// There is full or partial native classList support, so just check if we need
+// to normalize the add/remove and toggle APIs.
+
+(function () {
+	"use strict";
+
+	var testElement = document.createElement("_");
+
+	testElement.classList.add("c1", "c2");
+
+	// Polyfill for IE 10/11 and Firefox <26, where classList.add and
+	// classList.remove exist but support only one argument at a time.
+	if (!testElement.classList.contains("c2")) {
+		var createMethod = function(method) {
+			var original = DOMTokenList.prototype[method];
+
+			DOMTokenList.prototype[method] = function(token) {
+				var i, len = arguments.length;
+
+				for (i = 0; i < len; i++) {
+					token = arguments[i];
+					original.call(this, token);
+				}
+			};
+		};
+		createMethod('add');
+		createMethod('remove');
+	}
+
+	testElement.classList.toggle("c3", false);
+
+	// Polyfill for IE 10 and Firefox <24, where classList.toggle does not
+	// support the second argument.
+	if (testElement.classList.contains("c3")) {
+		var _toggle = DOMTokenList.prototype.toggle;
+
+		DOMTokenList.prototype.toggle = function(token, force) {
+			if (1 in arguments && !this.contains(token) === !force) {
+				return force;
+			} else {
+				return _toggle.call(this, token);
+			}
+		};
+
+	}
+
+	testElement = null;
+}());
+
+}

+ 16 - 0
node_modules/classlist-polyfill/tests/qunit.html

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>QUnit Tests</title>
+  <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.14.0.css">
+</head>
+<body>
+<div id="qunit"></div>
+<div id="qunit-fixture"></div>
+<script src="http://code.jquery.com/qunit/qunit-1.14.0.js"></script>
+<script src="../classList.js"></script>
+<script src="tests.js"></script>
+<script src="remove.js"></script>
+</body>
+</html>

+ 10 - 0
node_modules/classlist-polyfill/tests/remove.js

@@ -0,0 +1,10 @@
+QUnit.module("classList.remove");
+
+QUnit.test("Removes duplicated instances of class", function(assert) {
+	var el = document.createElement("p"), cList = el.classList;
+	el.className = "ho ho ho"
+
+	cList.remove("ho");
+	assert.ok(!cList.contains("ho"), "Should remove all instances of 'ho'");
+	assert.strictEqual(el.className, "")
+});

+ 46 - 0
node_modules/classlist-polyfill/tests/runner.coffee

@@ -0,0 +1,46 @@
+urls = require('system').args.slice(1)
+page = require('webpage').create()
+timeout = 3000
+
+qunitHooks = ->
+  window.document.addEventListener 'DOMContentLoaded', ->
+    for callback in ['log', 'testDone', 'done']
+      do (callback) ->
+        QUnit[callback] (result) ->
+          window.callPhantom
+            name: "QUnit.#{callback}"
+            data: result
+
+page.onInitialized = -> page.evaluate qunitHooks
+
+page.onConsoleMessage = (msg) -> console.log msg
+
+page.onCallback = (event) ->
+  if event.name is 'QUnit.log'
+    details = event.data
+    if details.result is false
+      console.log "✘ #{details.module}: #{details.name}"
+      if details.message and details.message isnt "failed"
+        console.log "  #{details.message}"
+      if "actual" of details
+        console.log "  expected: #{details.expected}"
+        console.log "    actual: #{details.actual}"
+  else if event.name is 'QUnit.testDone'
+    result = event.data
+    unless result.failed
+      console.log "✔︎ #{result.module}: #{result.name}"
+  else if event.name is 'QUnit.done'
+    res = event.data
+    console.log "#{res.total} tests, #{res.failed} failed. Done in #{res.runtime} ms"
+    phantom.exit if !res.total or res.failed then 1 else 0
+
+for url in urls
+  page.open url, (status) ->
+    if status isnt 'success'
+      console.error "failed opening #{url}: #{status}"
+      phantom.exit 1
+    else
+      setTimeout ->
+        console.error "ERROR: Test execution has timed out"
+        phantom.exit 1
+      , timeout

+ 82 - 0
node_modules/classlist-polyfill/tests/tests.js

@@ -0,0 +1,82 @@
+QUnit.module("classList.toggle");
+
+QUnit.test("Adds a class", function(assert) {
+	var cList = document.createElement("p").classList;
+
+	cList.toggle("c1");
+	assert.ok(cList.contains("c1"), "Adds a class that is not present");
+
+	assert.strictEqual(
+		cList.toggle("c2"),
+		true,
+		"Returns true when class is added"
+	);
+});
+
+QUnit.test("Removes a class", function(assert) {
+	var cList = document.createElement("p").classList;
+
+	cList.add("c1");
+	cList.toggle("c1");
+	assert.ok(!cList.contains("c1"), "Removes a class that is present");
+
+	cList.add("c2");
+	assert.strictEqual(
+		cList.toggle("c2"),
+		false,
+		"Return false when class is removed"
+	);
+});
+
+QUnit.test("Adds class with second argument", function(assert) {
+	var cList = document.createElement("p").classList;
+
+	cList.toggle("c1", true);
+	assert.ok(cList.contains("c1"), "Adds a class");
+
+	assert.strictEqual(
+		cList.toggle("c2", true),
+		true,
+		"Returns true when class is added"
+	);
+
+	cList.add("c3");
+	cList.toggle("c3", true);
+	assert.ok(
+		cList.contains("c3"),
+		"Does not remove a class that is already present"
+	);
+
+	cList.add("c4");
+	assert.strictEqual(
+		cList.toggle("c4", true),
+		true,
+		"Returns true when class is already present"
+	);
+});
+
+QUnit.test("Removes class with second argument", function(assert) {
+	var cList = document.createElement("p").classList;
+
+	cList.add("c1");
+	cList.toggle("c1", false);
+	assert.ok(!cList.contains("c1"), "Removes a class");
+
+	assert.strictEqual(
+		cList.toggle("c2", false),
+		false,
+		"Returns false when class is removed"
+	);
+
+	cList.toggle("c3", false);
+	assert.ok(
+		!cList.contains("c3"),
+		"Does not add a class that is not present"
+	);
+
+	assert.strictEqual(
+		cList.toggle("c4", false),
+		false,
+		"Returns false when class was not present"
+	);
+});

+ 47 - 0
node_modules/lodash.debounce/LICENSE

@@ -0,0 +1,47 @@
+Copyright jQuery Foundation and other contributors <https://jquery.org/>
+
+Based on Underscore.js, copyright Jeremy Ashkenas,
+DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/lodash/lodash
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code displayed within the prose of the
+documentation.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+Files located in the node_modules and vendor directories are externally
+maintained libraries used by this software which have their own
+licenses; we recommend you read them, as their terms may differ from the
+terms above.

+ 18 - 0
node_modules/lodash.debounce/README.md

@@ -0,0 +1,18 @@
+# lodash.debounce v4.0.8
+
+The [lodash](https://lodash.com/) method `_.debounce` exported as a [Node.js](https://nodejs.org/) module.
+
+## Installation
+
+Using npm:
+```bash
+$ {sudo -H} npm i -g npm
+$ npm i --save lodash.debounce
+```
+
+In Node.js:
+```js
+var debounce = require('lodash.debounce');
+```
+
+See the [documentation](https://lodash.com/docs#debounce) or [package source](https://github.com/lodash/lodash/blob/4.0.8-npm-packages/lodash.debounce) for more details.

+ 377 - 0
node_modules/lodash.debounce/index.js

@@ -0,0 +1,377 @@
+/**
+ * lodash (Custom Build) <https://lodash.com/>
+ * Build: `lodash modularize exports="npm" -o ./`
+ * Copyright jQuery Foundation and other contributors <https://jquery.org/>
+ * Released under MIT license <https://lodash.com/license>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+
+/** Used as the `TypeError` message for "Functions" methods. */
+var FUNC_ERROR_TEXT = 'Expected a function';
+
+/** Used as references for various `Number` constants. */
+var NAN = 0 / 0;
+
+/** `Object#toString` result references. */
+var symbolTag = '[object Symbol]';
+
+/** Used to match leading and trailing whitespace. */
+var reTrim = /^\s+|\s+$/g;
+
+/** Used to detect bad signed hexadecimal string values. */
+var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+
+/** Used to detect binary string values. */
+var reIsBinary = /^0b[01]+$/i;
+
+/** Used to detect octal string values. */
+var reIsOctal = /^0o[0-7]+$/i;
+
+/** Built-in method references without a dependency on `root`. */
+var freeParseInt = parseInt;
+
+/** Detect free variable `global` from Node.js. */
+var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+/** Detect free variable `self`. */
+var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+/** Used as a reference to the global object. */
+var root = freeGlobal || freeSelf || Function('return this')();
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeMax = Math.max,
+    nativeMin = Math.min;
+
+/**
+ * Gets the timestamp of the number of milliseconds that have elapsed since
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Date
+ * @returns {number} Returns the timestamp.
+ * @example
+ *
+ * _.defer(function(stamp) {
+ *   console.log(_.now() - stamp);
+ * }, _.now());
+ * // => Logs the number of milliseconds it took for the deferred invocation.
+ */
+var now = function() {
+  return root.Date.now();
+};
+
+/**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked. The debounced function comes with a `cancel` method to cancel
+ * delayed `func` invocations and a `flush` method to immediately invoke them.
+ * Provide `options` to indicate whether `func` should be invoked on the
+ * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+ * with the last arguments provided to the debounced function. Subsequent
+ * calls to the debounced function return the result of the last `func`
+ * invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.debounce` and `_.throttle`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0] The number of milliseconds to delay.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ *  Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ *  The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ *  Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', _.debounce(sendMail, 300, {
+ *   'leading': true,
+ *   'trailing': false
+ * }));
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+ * var source = new EventSource('/stream');
+ * jQuery(source).on('message', debounced);
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel);
+ */
+function debounce(func, wait, options) {
+  var lastArgs,
+      lastThis,
+      maxWait,
+      result,
+      timerId,
+      lastCallTime,
+      lastInvokeTime = 0,
+      leading = false,
+      maxing = false,
+      trailing = true;
+
+  if (typeof func != 'function') {
+    throw new TypeError(FUNC_ERROR_TEXT);
+  }
+  wait = toNumber(wait) || 0;
+  if (isObject(options)) {
+    leading = !!options.leading;
+    maxing = 'maxWait' in options;
+    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
+    trailing = 'trailing' in options ? !!options.trailing : trailing;
+  }
+
+  function invokeFunc(time) {
+    var args = lastArgs,
+        thisArg = lastThis;
+
+    lastArgs = lastThis = undefined;
+    lastInvokeTime = time;
+    result = func.apply(thisArg, args);
+    return result;
+  }
+
+  function leadingEdge(time) {
+    // Reset any `maxWait` timer.
+    lastInvokeTime = time;
+    // Start the timer for the trailing edge.
+    timerId = setTimeout(timerExpired, wait);
+    // Invoke the leading edge.
+    return leading ? invokeFunc(time) : result;
+  }
+
+  function remainingWait(time) {
+    var timeSinceLastCall = time - lastCallTime,
+        timeSinceLastInvoke = time - lastInvokeTime,
+        result = wait - timeSinceLastCall;
+
+    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
+  }
+
+  function shouldInvoke(time) {
+    var timeSinceLastCall = time - lastCallTime,
+        timeSinceLastInvoke = time - lastInvokeTime;
+
+    // Either this is the first call, activity has stopped and we're at the
+    // trailing edge, the system time has gone backwards and we're treating
+    // it as the trailing edge, or we've hit the `maxWait` limit.
+    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
+      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
+  }
+
+  function timerExpired() {
+    var time = now();
+    if (shouldInvoke(time)) {
+      return trailingEdge(time);
+    }
+    // Restart the timer.
+    timerId = setTimeout(timerExpired, remainingWait(time));
+  }
+
+  function trailingEdge(time) {
+    timerId = undefined;
+
+    // Only invoke if we have `lastArgs` which means `func` has been
+    // debounced at least once.
+    if (trailing && lastArgs) {
+      return invokeFunc(time);
+    }
+    lastArgs = lastThis = undefined;
+    return result;
+  }
+
+  function cancel() {
+    if (timerId !== undefined) {
+      clearTimeout(timerId);
+    }
+    lastInvokeTime = 0;
+    lastArgs = lastCallTime = lastThis = timerId = undefined;
+  }
+
+  function flush() {
+    return timerId === undefined ? result : trailingEdge(now());
+  }
+
+  function debounced() {
+    var time = now(),
+        isInvoking = shouldInvoke(time);
+
+    lastArgs = arguments;
+    lastThis = this;
+    lastCallTime = time;
+
+    if (isInvoking) {
+      if (timerId === undefined) {
+        return leadingEdge(lastCallTime);
+      }
+      if (maxing) {
+        // Handle invocations in a tight loop.
+        timerId = setTimeout(timerExpired, wait);
+        return invokeFunc(lastCallTime);
+      }
+    }
+    if (timerId === undefined) {
+      timerId = setTimeout(timerExpired, wait);
+    }
+    return result;
+  }
+  debounced.cancel = cancel;
+  debounced.flush = flush;
+  return debounced;
+}
+
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+function isObject(value) {
+  var type = typeof value;
+  return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+function isObjectLike(value) {
+  return !!value && typeof value == 'object';
+}
+
+/**
+ * Checks if `value` is classified as a `Symbol` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+ * @example
+ *
+ * _.isSymbol(Symbol.iterator);
+ * // => true
+ *
+ * _.isSymbol('abc');
+ * // => false
+ */
+function isSymbol(value) {
+  return typeof value == 'symbol' ||
+    (isObjectLike(value) && objectToString.call(value) == symbolTag);
+}
+
+/**
+ * Converts `value` to a number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ * @example
+ *
+ * _.toNumber(3.2);
+ * // => 3.2
+ *
+ * _.toNumber(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toNumber(Infinity);
+ * // => Infinity
+ *
+ * _.toNumber('3.2');
+ * // => 3.2
+ */
+function toNumber(value) {
+  if (typeof value == 'number') {
+    return value;
+  }
+  if (isSymbol(value)) {
+    return NAN;
+  }
+  if (isObject(value)) {
+    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+    value = isObject(other) ? (other + '') : other;
+  }
+  if (typeof value != 'string') {
+    return value === 0 ? value : +value;
+  }
+  value = value.replace(reTrim, '');
+  var isBinary = reIsBinary.test(value);
+  return (isBinary || reIsOctal.test(value))
+    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
+    : (reIsBadHex.test(value) ? NAN : +value);
+}
+
+module.exports = debounce;

+ 17 - 0
node_modules/lodash.debounce/package.json

@@ -0,0 +1,17 @@
+{
+  "name": "lodash.debounce",
+  "version": "4.0.8",
+  "description": "The lodash method `_.debounce` exported as a module.",
+  "homepage": "https://lodash.com/",
+  "icon": "https://lodash.com/icon.svg",
+  "license": "MIT",
+  "keywords": "lodash-modularized, debounce",
+  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
+  "contributors": [
+    "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
+    "Blaine Bublitz <blaine.bublitz@gmail.com> (https://github.com/phated)",
+    "Mathias Bynens <mathias@qiwi.be> (https://mathiasbynens.be/)"
+  ],
+  "repository": "lodash/lodash",
+  "scripts": { "test": "echo \"See https://travis-ci.org/lodash/lodash-cli for testing details.\"" }
+}

+ 47 - 0
node_modules/lodash.throttle/LICENSE

@@ -0,0 +1,47 @@
+Copyright jQuery Foundation and other contributors <https://jquery.org/>
+
+Based on Underscore.js, copyright Jeremy Ashkenas,
+DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/lodash/lodash
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code displayed within the prose of the
+documentation.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+Files located in the node_modules and vendor directories are externally
+maintained libraries used by this software which have their own
+licenses; we recommend you read them, as their terms may differ from the
+terms above.

+ 18 - 0
node_modules/lodash.throttle/README.md

@@ -0,0 +1,18 @@
+# lodash.throttle v4.1.1
+
+The [lodash](https://lodash.com/) method `_.throttle` exported as a [Node.js](https://nodejs.org/) module.
+
+## Installation
+
+Using npm:
+```bash
+$ {sudo -H} npm i -g npm
+$ npm i --save lodash.throttle
+```
+
+In Node.js:
+```js
+var throttle = require('lodash.throttle');
+```
+
+See the [documentation](https://lodash.com/docs#throttle) or [package source](https://github.com/lodash/lodash/blob/4.1.1-npm-packages/lodash.throttle) for more details.

+ 439 - 0
node_modules/lodash.throttle/index.js

@@ -0,0 +1,439 @@
+/**
+ * lodash (Custom Build) <https://lodash.com/>
+ * Build: `lodash modularize exports="npm" -o ./`
+ * Copyright jQuery Foundation and other contributors <https://jquery.org/>
+ * Released under MIT license <https://lodash.com/license>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+
+/** Used as the `TypeError` message for "Functions" methods. */
+var FUNC_ERROR_TEXT = 'Expected a function';
+
+/** Used as references for various `Number` constants. */
+var NAN = 0 / 0;
+
+/** `Object#toString` result references. */
+var symbolTag = '[object Symbol]';
+
+/** Used to match leading and trailing whitespace. */
+var reTrim = /^\s+|\s+$/g;
+
+/** Used to detect bad signed hexadecimal string values. */
+var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+
+/** Used to detect binary string values. */
+var reIsBinary = /^0b[01]+$/i;
+
+/** Used to detect octal string values. */
+var reIsOctal = /^0o[0-7]+$/i;
+
+/** Built-in method references without a dependency on `root`. */
+var freeParseInt = parseInt;
+
+/** Detect free variable `global` from Node.js. */
+var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+/** Detect free variable `self`. */
+var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+/** Used as a reference to the global object. */
+var root = freeGlobal || freeSelf || Function('return this')();
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objectToString = objectProto.toString;
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeMax = Math.max,
+    nativeMin = Math.min;
+
+/**
+ * Gets the timestamp of the number of milliseconds that have elapsed since
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Date
+ * @returns {number} Returns the timestamp.
+ * @example
+ *
+ * _.defer(function(stamp) {
+ *   console.log(_.now() - stamp);
+ * }, _.now());
+ * // => Logs the number of milliseconds it took for the deferred invocation.
+ */
+var now = function() {
+  return root.Date.now();
+};
+
+/**
+ * Creates a debounced function that delays invoking `func` until after `wait`
+ * milliseconds have elapsed since the last time the debounced function was
+ * invoked. The debounced function comes with a `cancel` method to cancel
+ * delayed `func` invocations and a `flush` method to immediately invoke them.
+ * Provide `options` to indicate whether `func` should be invoked on the
+ * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+ * with the last arguments provided to the debounced function. Subsequent
+ * calls to the debounced function return the result of the last `func`
+ * invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the debounced function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.debounce` and `_.throttle`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to debounce.
+ * @param {number} [wait=0] The number of milliseconds to delay.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=false]
+ *  Specify invoking on the leading edge of the timeout.
+ * @param {number} [options.maxWait]
+ *  The maximum time `func` is allowed to be delayed before it's invoked.
+ * @param {boolean} [options.trailing=true]
+ *  Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new debounced function.
+ * @example
+ *
+ * // Avoid costly calculations while the window size is in flux.
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+ *
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+ * jQuery(element).on('click', _.debounce(sendMail, 300, {
+ *   'leading': true,
+ *   'trailing': false
+ * }));
+ *
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+ * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+ * var source = new EventSource('/stream');
+ * jQuery(source).on('message', debounced);
+ *
+ * // Cancel the trailing debounced invocation.
+ * jQuery(window).on('popstate', debounced.cancel);
+ */
+function debounce(func, wait, options) {
+  var lastArgs,
+      lastThis,
+      maxWait,
+      result,
+      timerId,
+      lastCallTime,
+      lastInvokeTime = 0,
+      leading = false,
+      maxing = false,
+      trailing = true;
+
+  if (typeof func != 'function') {
+    throw new TypeError(FUNC_ERROR_TEXT);
+  }
+  wait = toNumber(wait) || 0;
+  if (isObject(options)) {
+    leading = !!options.leading;
+    maxing = 'maxWait' in options;
+    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
+    trailing = 'trailing' in options ? !!options.trailing : trailing;
+  }
+
+  function invokeFunc(time) {
+    var args = lastArgs,
+        thisArg = lastThis;
+
+    lastArgs = lastThis = undefined;
+    lastInvokeTime = time;
+    result = func.apply(thisArg, args);
+    return result;
+  }
+
+  function leadingEdge(time) {
+    // Reset any `maxWait` timer.
+    lastInvokeTime = time;
+    // Start the timer for the trailing edge.
+    timerId = setTimeout(timerExpired, wait);
+    // Invoke the leading edge.
+    return leading ? invokeFunc(time) : result;
+  }
+
+  function remainingWait(time) {
+    var timeSinceLastCall = time - lastCallTime,
+        timeSinceLastInvoke = time - lastInvokeTime,
+        result = wait - timeSinceLastCall;
+
+    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
+  }
+
+  function shouldInvoke(time) {
+    var timeSinceLastCall = time - lastCallTime,
+        timeSinceLastInvoke = time - lastInvokeTime;
+
+    // Either this is the first call, activity has stopped and we're at the
+    // trailing edge, the system time has gone backwards and we're treating
+    // it as the trailing edge, or we've hit the `maxWait` limit.
+    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
+      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
+  }
+
+  function timerExpired() {
+    var time = now();
+    if (shouldInvoke(time)) {
+      return trailingEdge(time);
+    }
+    // Restart the timer.
+    timerId = setTimeout(timerExpired, remainingWait(time));
+  }
+
+  function trailingEdge(time) {
+    timerId = undefined;
+
+    // Only invoke if we have `lastArgs` which means `func` has been
+    // debounced at least once.
+    if (trailing && lastArgs) {
+      return invokeFunc(time);
+    }
+    lastArgs = lastThis = undefined;
+    return result;
+  }
+
+  function cancel() {
+    if (timerId !== undefined) {
+      clearTimeout(timerId);
+    }
+    lastInvokeTime = 0;
+    lastArgs = lastCallTime = lastThis = timerId = undefined;
+  }
+
+  function flush() {
+    return timerId === undefined ? result : trailingEdge(now());
+  }
+
+  function debounced() {
+    var time = now(),
+        isInvoking = shouldInvoke(time);
+
+    lastArgs = arguments;
+    lastThis = this;
+    lastCallTime = time;
+
+    if (isInvoking) {
+      if (timerId === undefined) {
+        return leadingEdge(lastCallTime);
+      }
+      if (maxing) {
+        // Handle invocations in a tight loop.
+        timerId = setTimeout(timerExpired, wait);
+        return invokeFunc(lastCallTime);
+      }
+    }
+    if (timerId === undefined) {
+      timerId = setTimeout(timerExpired, wait);
+    }
+    return result;
+  }
+  debounced.cancel = cancel;
+  debounced.flush = flush;
+  return debounced;
+}
+
+/**
+ * Creates a throttled function that only invokes `func` at most once per
+ * every `wait` milliseconds. The throttled function comes with a `cancel`
+ * method to cancel delayed `func` invocations and a `flush` method to
+ * immediately invoke them. Provide `options` to indicate whether `func`
+ * should be invoked on the leading and/or trailing edge of the `wait`
+ * timeout. The `func` is invoked with the last arguments provided to the
+ * throttled function. Subsequent calls to the throttled function return the
+ * result of the last `func` invocation.
+ *
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
+ * invoked on the trailing edge of the timeout only if the throttled function
+ * is invoked more than once during the `wait` timeout.
+ *
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+ *
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+ * for details over the differences between `_.throttle` and `_.debounce`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to throttle.
+ * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
+ * @param {Object} [options={}] The options object.
+ * @param {boolean} [options.leading=true]
+ *  Specify invoking on the leading edge of the timeout.
+ * @param {boolean} [options.trailing=true]
+ *  Specify invoking on the trailing edge of the timeout.
+ * @returns {Function} Returns the new throttled function.
+ * @example
+ *
+ * // Avoid excessively updating the position while scrolling.
+ * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
+ *
+ * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+ * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
+ * jQuery(element).on('click', throttled);
+ *
+ * // Cancel the trailing throttled invocation.
+ * jQuery(window).on('popstate', throttled.cancel);
+ */
+function throttle(func, wait, options) {
+  var leading = true,
+      trailing = true;
+
+  if (typeof func != 'function') {
+    throw new TypeError(FUNC_ERROR_TEXT);
+  }
+  if (isObject(options)) {
+    leading = 'leading' in options ? !!options.leading : leading;
+    trailing = 'trailing' in options ? !!options.trailing : trailing;
+  }
+  return debounce(func, wait, {
+    'leading': leading,
+    'maxWait': wait,
+    'trailing': trailing
+  });
+}
+
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+function isObject(value) {
+  var type = typeof value;
+  return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+function isObjectLike(value) {
+  return !!value && typeof value == 'object';
+}
+
+/**
+ * Checks if `value` is classified as a `Symbol` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+ * @example
+ *
+ * _.isSymbol(Symbol.iterator);
+ * // => true
+ *
+ * _.isSymbol('abc');
+ * // => false
+ */
+function isSymbol(value) {
+  return typeof value == 'symbol' ||
+    (isObjectLike(value) && objectToString.call(value) == symbolTag);
+}
+
+/**
+ * Converts `value` to a number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ * @example
+ *
+ * _.toNumber(3.2);
+ * // => 3.2
+ *
+ * _.toNumber(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toNumber(Infinity);
+ * // => Infinity
+ *
+ * _.toNumber('3.2');
+ * // => 3.2
+ */
+function toNumber(value) {
+  if (typeof value == 'number') {
+    return value;
+  }
+  if (isSymbol(value)) {
+    return NAN;
+  }
+  if (isObject(value)) {
+    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+    value = isObject(other) ? (other + '') : other;
+  }
+  if (typeof value != 'string') {
+    return value === 0 ? value : +value;
+  }
+  value = value.replace(reTrim, '');
+  var isBinary = reIsBinary.test(value);
+  return (isBinary || reIsOctal.test(value))
+    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
+    : (reIsBadHex.test(value) ? NAN : +value);
+}
+
+module.exports = throttle;

+ 17 - 0
node_modules/lodash.throttle/package.json

@@ -0,0 +1,17 @@
+{
+  "name": "lodash.throttle",
+  "version": "4.1.1",
+  "description": "The lodash method `_.throttle` exported as a module.",
+  "homepage": "https://lodash.com/",
+  "icon": "https://lodash.com/icon.svg",
+  "license": "MIT",
+  "keywords": "lodash-modularized, throttle",
+  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
+  "contributors": [
+    "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
+    "Blaine Bublitz <blaine.bublitz@gmail.com> (https://github.com/phated)",
+    "Mathias Bynens <mathias@qiwi.be> (https://mathiasbynens.be/)"
+  ],
+  "repository": "lodash/lodash",
+  "scripts": { "test": "echo \"See https://travis-ci.org/lodash/lodash-cli for testing details.\"" }
+}

+ 51 - 0
package-lock.json

@@ -5,6 +5,7 @@
   "packages": {
     "": {
       "dependencies": {
+        "aos": "^2.3.4",
         "echarts": "^4.9.0",
         "uview-ui": "^2.0.36"
       },
@@ -359,6 +360,16 @@
         "node": ">= 8"
       }
     },
+    "node_modules/aos": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmmirror.com/aos/-/aos-2.3.4.tgz",
+      "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==",
+      "dependencies": {
+        "classlist-polyfill": "^1.0.3",
+        "lodash.debounce": "^4.0.6",
+        "lodash.throttle": "^4.0.1"
+      }
+    },
     "node_modules/big.js": {
       "version": "5.2.2",
       "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
@@ -487,6 +498,11 @@
         "node": ">=6.0"
       }
     },
+    "node_modules/classlist-polyfill": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz",
+      "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ=="
+    },
     "node_modules/commander": {
       "version": "2.20.3",
       "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
@@ -883,6 +899,16 @@
         "node": ">=8.9.0"
       }
     },
+    "node_modules/lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+    },
+    "node_modules/lodash.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+    },
     "node_modules/make-dir": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",
@@ -1774,6 +1800,16 @@
         "picomatch": "^2.0.4"
       }
     },
+    "aos": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmmirror.com/aos/-/aos-2.3.4.tgz",
+      "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==",
+      "requires": {
+        "classlist-polyfill": "^1.0.3",
+        "lodash.debounce": "^4.0.6",
+        "lodash.throttle": "^4.0.1"
+      }
+    },
     "big.js": {
       "version": "5.2.2",
       "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
@@ -1845,6 +1881,11 @@
       "dev": true,
       "peer": true
     },
+    "classlist-polyfill": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz",
+      "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ=="
+    },
     "commander": {
       "version": "2.20.3",
       "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
@@ -2150,6 +2191,16 @@
         "json5": "^2.1.2"
       }
     },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+    },
+    "lodash.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+    },
     "make-dir": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz",

+ 1 - 0
package.json

@@ -1,5 +1,6 @@
 {
   "dependencies": {
+    "aos": "^2.3.4",
     "echarts": "^4.9.0",
     "uview-ui": "^2.0.36"
   },

+ 30 - 18
pages/consult/index.vue

@@ -1,24 +1,28 @@
 <template>
 	<view class="page">
-		<view class="banner">
+		<view class="banner" data-aos="zoom-in">
 			<img src="../../static/imgs/concat.png" />
 		</view>
-		<view class="box">
-			<view class="tit">合作与咨询</view>
-			<view class="txt">
-				请于工作日的08:30至17:30期间来电咨询我们的产品和服务。
-			</view>
-			<view class="btn" @click="callPhone('0551-68992527')">
-				<img src="../../static/imgs/call.png" />0551-68992527
+		<view class="box">
+			<view class="box2" data-aos="slide-left" data-aos-delay="300">
+				<view class="tit">合作与咨询</view>
+				<view class="txt">
+					请于工作日的08:30至17:30期间来电咨询我们的产品和服务。
+				</view>
+				<view class="btn" @click="callPhone('0551-68992527')">
+					<img src="../../static/imgs/call.png" />0551-68992527
+				</view>
 			</view>
 		</view>
-		<view class="box">
-			<view class="tit">演示与在线试用</view>
-			<view class="txt">
-				我们将适时与您取得联系,并为您量身打造适合企业需求的专项演示方案。
-			</view>
-			<view class="btn" @click="toApply">
-				立即申请
+		<view class="box">
+			<view class="box2" data-aos="slide-right" data-aos-delay="600">
+				<view class="tit">演示与在线试用</view>
+				<view class="txt">
+					我们将适时与您取得联系,并为您量身打造适合企业需求的专项演示方案。
+				</view>
+				<view class="btn" @click="toApply">
+					立即申请
+				</view>
 			</view>
 		</view>
 		<tabbar :tabbarIndex="2"></tabbar>
@@ -64,10 +68,18 @@
 	.box {
 		width: calc(100% - 48rpx);
 		margin: 0 auto;
-		background-color: #fff;
-		padding: 36rpx 0;
+		// background-color: #fff;
+		// padding: 36rpx 0;
 		border-radius: 12rpx;
-		margin-bottom: 40rpx;
+		margin-bottom: 40rpx;
+		overflow-y: hidden;
+		
+		.box2{
+			width: 100%;
+			height: 100%;
+			background-color: #fff;
+			padding: 36rpx 0;
+		}
 
 		.tit {
 			font-size: 32rpx;

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 5 - 5
pages/index/index.vue


+ 19 - 11
pages/plan/details.vue

@@ -2,18 +2,20 @@
 	<view class="content">
 		<block v-if="detail">
 			<!-- 顶部图片 -->
-			<image class="top" v-if="detail.img" :src="detail.img" mode="widthFix"></image>
+			<image class="top" v-if="detail.img" :src="detail.img" mode="widthFix" data-aos="fade-down"></image>
 			<view class="headline">
-				<view class="title" v-if="detail.industry">行业:<span>{{detail.industry}}</span></view>
-				<view class="title" v-if="detail.scheme">方案:<span>{{detail.scheme}}</span></view>
-				<view class="title" v-if="detail.client">客户:<span>{{detail.client}}</span></view>
+				<view class="title" v-if="detail.industry" data-aos="slide-right" data-aos-delay="200">行业:<span>{{detail.industry}}</span></view>
+				<view class="title" v-if="detail.scheme" data-aos="slide-right" data-aos-delay="400">方案:<span>{{detail.scheme}}</span></view>
+				<view class="title" v-if="detail.client" data-aos="slide-right" data-aos-delay="600">客户:<span>{{detail.client}}</span></view>
 			</view>
 			<image class="line" src="../../static/imgs/line.png"></image>
 			<view class="boxs" v-if="detail.descriptions&&detail.descriptions.length">
-				<view class="box" v-for="(item,index) in detail.descriptions" :key="index">
-					<view class="b_title">{{item.title}}</view>
-					<view class="intro">
-						<u-parse :content="item.content"></u-parse>
+				<view class="box">
+					<view class="box2" v-for="(item,index) in detail.descriptions" :key="index" data-aos="slide-left">
+						<view class="b_title">{{item.title}}</view>
+						<view class="intro">
+							<u-parse :content="item.content"></u-parse>
+						</view>
 					</view>
 				</view>
 			</view>
@@ -91,9 +93,15 @@
 			box-sizing: border-box;
 			
 			.box{
-				margin-top: 48rpx;
-				&:first-child{
-					margin-top: 0;
+				overflow: hidden;
+				.box2{
+					width: 100%;
+					height: 100%;
+					margin-top: 48rpx;
+					overflow: hidden;
+					&:first-child{
+						margin-top: 0;
+					}
 				}
 				
 				.b_title{

+ 15 - 6
pages/plan/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="page" :style="{'height':h+'px'}">
-		<view class="left">
+		<view class="left" data-aos="slide-right">
 			<view class="item" :class="[(index===nIndex)?'active':'',index===(nIndex+1)?'rtb':'']" 
 			v-for="(item,index) in navList" :key="index" @click="changeType(index,item.name)">
 				{{item.name}}
@@ -8,8 +8,8 @@
 		</view>
 		<view class="right">
 			<block v-if="solutionList.length">
-				<u-list class="ulist" @scrolltolower="scrolltolower">
-					<u-list-item class="item" :class="index===0?'item1':''" v-for="(item, index) in solutionList" :key="index">
+				<view class="ulist">
+					<view class="item" :class="index===0?'item1':''" v-for="(item, index) in solutionList" :key="index" data-aos="slide-left" :data-aos-delay="150*index">
 						<view @click="toDetails(item)">
 							<view class="top">
 								<image :src="item.img"></image>
@@ -18,8 +18,8 @@
 								{{item.name}}
 							</view>
 						</view>
-					</u-list-item>
-				</u-list>
+					</view>
+				</view>
 			</block>
 			<block v-else></block>
 		</view>
@@ -94,6 +94,10 @@
 			width: 168rpx;
 			height: 100%;
 			overflow-y: auto;
+			position: fixed;
+			left: 0;
+			top: 0;
+			z-index: 2;
 			.item{
 				width: 100%;
 				height: 98rpx;
@@ -124,9 +128,14 @@
 			width: calc(100% - 168rpx);
 			padding: 0 30rpx 20rpx;
 			box-sizing: border-box;
+			position: relative;
+			left: 168rpx;
 			
 			.ulist{
-				height: 100% !important;
+				// height: 100% !important;
+				padding-bottom: 200rpx;
+				box-sizing: border-box;
+				overflow-y: hidden;
 				.item{
 					width: 100%;
 					margin-top: 44rpx;

+ 19 - 9
pages/solution/fmcs.vue

@@ -1,12 +1,12 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		<view class="boxs">
 			<!-- 方案特征 -->
-			<view class="fatz box">
+			<view class="fatz box" data-aos="zoom-in" data-aos-delay="600">
 				<view class="title">方案特征</view>
 				<view class="items">
 					<view class="item">
@@ -28,20 +28,22 @@
 				</view>
 			</view>
 			<!-- 方案架构 -->
-			<view class="fajg box">
+			<view class="fajg box" data-aos="zoom-in" data-aos-delay="900" data-aos-offset="-100">
 				<view class="title">方案架构</view>
 				<image src="../../static/imgs/fmcs_fajg.png" mode="widthFix" @click="showBigImg"></image>
 			</view>
 			<!-- 产品功能 -->
 			<view class="box">
-				<view class="title">产品功能</view>
-				<block v-if="functionList.length">
-					<uFunction :title="item.title" :list="item.list" v-for="(item,index) in functionList" :key="index"></uFunction>
-				</block>
+				<view class="box2">
+					<view class="title" data-aos="slide-left">产品功能</view>
+					<block v-if="functionList.length">
+						<uFunction :title="item.title" :list="item.list" v-for="(item,index) in functionList" :key="index" data-aos="slide-left"></uFunction>
+					</block>
+				</view>
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -240,16 +242,24 @@
 
 <style scoped lang="less">
 	.content{
+		width: 100%;
 		padding-bottom: 104rpx;
+		overflow-y: hidden;
 		.boxs{
 			width: 100%;
 			padding: 0 30rpx;
 			box-sizing: border-box;
 			background: #FFFFFF;
+			overflow: hidden;
 			
 			.box{
 				width: 100%;
 				margin-top: 48rpx;
+				overflow: hidden;
+				
+				.box2{
+					width: 100%;
+				}
 				
 				.title{
 					font-family: PingFang-SC, PingFang-SC;

+ 23 - 10
pages/solution/ioc.vue

@@ -1,12 +1,12 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="descBg"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" :bg="descBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		<view class="boxs">
 			<!-- 方案特征 -->
-			<view class="fatz box">
+			<view class="fatz box" data-aos="zoom-in" data-aos-delay="600">
 				<view class="b_title">方案特征</view>
 				<view class="items">
 					<view class="item">
@@ -32,18 +32,22 @@
 				</view>
 			</view>
 			<view class="box2">
-				<view class="b_title">服务场景</view>
-				<block v-if="fwcjList.length">
-					<uFunction :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in fwcjList" :key="index"></uFunction>
-				</block>
+				<view class="boxTwo">
+					<view data-aos="slide-left" data-aos-delay="900" data-aos-offset="10" class="b_title">服务场景</view>
+					<block v-if="fwcjList.length">
+						<uFunction data-aos="slide-left" :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in fwcjList" :key="index"></uFunction>
+					</block>
+				</view>
 			</view>
 			<view class="box3">
-				<view class="b_title">数字孪生中台</view>
-				<image class="img" src="../../static/imgs/ioc_img1.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/ioc_img1.png')"></image>
+				<view class="boxTwo">
+					<view data-aos="slide-left" class="b_title">数字孪生中台</view>
+					<image data-aos="slide-left" class="img" src="../../static/imgs/ioc_img1.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/ioc_img1.png')"></image>
+				</view>
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -145,6 +149,15 @@
 	
 	.content{
 		padding-bottom: 90rpx;
+		overflow: hidden;
+		
+		.boxTwo{
+			width: 100%;
+			overflow: hidden;
+		}
+		.box2,.box3{
+			overflow: hidden;
+		}
 		
 		.boxs{
 			width: 100%;

+ 25 - 18
pages/solution/lampSms.vue

@@ -1,41 +1,43 @@
 <template>
 	<view class="content">
-		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<!-- 顶部logo和菜单 -->
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg"></uDesc>
-		<view class="quesTitle">工厂设备的维修管理,您是否有以下烦恼?</view>
+		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
+		<view class="quesTitle" data-aos="zoom-in" data-aos-delay="600">工厂设备的维修管理,您是否有以下烦恼?</view>
 		<view class="boxs">
 			<block v-if="functionList.length">
-				<uFunction :showTitle="false" :list="functionList[0]">
+				<uFunction :showTitle="false" :list="functionList[0]" data-aos="zoom-in" data-aos-delay="600">
 				</uFunction>
 			</block>
-			<view class="fajg box">
-				<view class="title">解决方案</view>
-				<view class="subtit">帮助<span>工厂</span>快速识别堵点,并<span>大幅消除生产异常浪费</span></view>
-				<image src="../../static/imgs/jjfa.png" mode="widthFix" @click="showBigImg"></image>
+			<view class="fajg box">
+				<view class="fajg2" data-aos="slide-left" data-aos-delay="900">
+					<view class="title">解决方案</view>
+					<view class="subtit">帮助<span>工厂</span>快速识别堵点,并<span>大幅消除生产异常浪费</span></view>
+					<image src="../../static/imgs/jjfa.png" mode="widthFix" @click="showBigImg"></image>
+				</view>
 			</view>
 			<block v-if="functionList.length">
-				<uFunction :showTitle="false" :list="functionList[1]">
+				<uFunction :showTitle="false" :list="functionList[1]" data-aos="slide-right">
 				</uFunction>
 			</block>
 			<!-- 产品优势 -->
 			<view class="fatz box">
-				<view class="title">产品优势</view>
+				<view class="title" data-aos="slide-left">产品优势</view>
 				<view class="items">
-					<view class="item">
+					<view class="item" data-aos="slide-right">
 						<image src="../../static/imgs/fmcs_fatz1.png"></image>
 						<p>精益理念+数字化系统 - 推动精益化生产,提升现场管理水平</p>
 					</view>
-					<view class="item">
+					<view class="item" data-aos="slide-right">
 						<image src="../../static/imgs/fmcs_fatz2.png"></image>
 						<p>优化生产现场异常信息的反馈流程,有效考核支援人员解决问题的能力及工作态度</p>
 					</view>
-					<view class="item">
+					<view class="item" data-aos="slide-right">
 						<image src="../../static/imgs/fmcs_fatz3.png"></image>
 						<p>建立生产现场异常状况的处理机制,引入异常逐层上报机制</p>
 					</view>
-					<view class="item">
+					<view class="item" data-aos="slide-right">
 						<image src="../../static/imgs/fmcs_fatz4.png"></image>
 						<p>存储异常处理过程的完整信息</p>
 					</view>
@@ -43,7 +45,7 @@
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -153,7 +155,8 @@
 	}
 
 	.content {
-		padding-bottom: 80rpx;
+		padding-bottom: 80rpx;
+		overflow: hidden;
 		.boxs {
 			width: 100%;
 			padding: 0 30rpx;
@@ -210,7 +213,11 @@
 				}
 
 				&.fajg {
-					margin: 48rpx 0;
+					margin: 48rpx 0;
+					overflow: hidden;
+					.fajg2{
+						width: 100%;
+					}
 
 					.subtit {
 						font-size: 24rpx;

+ 2 - 2
pages/solution/ltzhxy.vue

@@ -1,9 +1,9 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="descBg"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" :bg="descBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		<view class="box">
 			<view class="box1">
 				<view class="b_title">建设路径</view>

+ 22 - 8
pages/solution/ltzhyq.vue

@@ -1,32 +1,36 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="descBg"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" :bg="descBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		<view class="box">
-			<view class="box1">
+			<view class="box1" data-aos="zoom-in" data-aos-delay="600">
 				<view class="b_title">建设路径</view>
 				<block v-if="jsljList.length">
 					<uFunction :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in jsljList" :key="index"></uFunction>
 				</block>
 			</view>
-			<view class="box2">
+			<view class="box2" data-aos="zoom-in">
 				<view class="b_title">场景模块</view>
 				<image class="img" src="../../static/imgs/ltzhyq_img1.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/ltzhyq_img1.png')"></image>
 			</view>
 			<view class="box3">
 				<block v-if="functionList.length">
-					<uFunction :title="item.title" :list="item.list" v-for="(item,index) in functionList" :key="index"></uFunction>
+					<view class="boxTwo">
+						<uFunction :title="item.title" :list="item.list" v-for="(item,index) in functionList" :key="index" data-aos="slide-left"></uFunction>
+					</view>
 				</block>
 			</view>
 			<view class="box4">
-				<view class="b_title">方案架构</view>
-				<image class="img" src="../../static/imgs/ltzhyq_img2.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/ltzhyq_img2.png')"></image>
+				<view class="boxTwo" data-aos="slide-right">
+					<view class="b_title">方案架构</view>
+					<image class="img" src="../../static/imgs/ltzhyq_img2.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/ltzhyq_img2.png')"></image>
+				</view>
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -225,6 +229,16 @@
 	
 	.content{
 		padding-bottom: 40rpx;
+		overflow: hidden;
+		
+		.boxTwo{
+			width: 100%;
+			overflow: hidden;
+		}
+		
+		.box4{
+			overflow: hidden;
+		}
 		
 		.box{
 			width: 100%;

+ 19 - 11
pages/solution/smartOpration.vue

@@ -1,13 +1,12 @@
 <template>
 	<view class="content">
-		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<!-- 顶部logo和菜单 -->
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		<view class="boxs">
-			
 			<!-- 产品功能 -->
-			<view class="fatz box">
+			<view class="fatz box" data-aos="zoom-in" data-aos-delay="600">
 				<view class="title">方案特征</view>
 				<view class="items">
 					<view class="item">
@@ -34,15 +33,17 @@
 				</view>
 			</view>
 			<view class="box">
-				<view class="title">产品功能</view>
-				<block v-if="functionList.length">
-					<uFunction :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in functionList" :key="index">
-					</uFunction>
+				<view class="title" data-aos="slide-left" data-aos-delay="900" data-aos-offset="10">产品功能</view>
+				<block v-if="functionList.length">
+					<view class="boxTwo">
+						<uFunction :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in functionList" :key="index" data-aos="slide-left">
+						</uFunction>
+					</view>
 				</block>
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -151,7 +152,14 @@
 
 <style scoped lang="less">
 	.content {
-		padding-bottom: 68rpx;
+		padding-bottom: 68rpx;
+		overflow: hidden;
+		
+		.boxTwo{
+			width: 100%;
+			overflow: hidden;
+		}
+		
 		.boxs {
 			width: 100%;
 			padding: 0 30rpx;

+ 2 - 2
pages/solution/smartVideo.vue

@@ -1,9 +1,9 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="descBg"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" :bg="descBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		
 		<view class="boxs">
 			<!-- 产品服务 -->

+ 10 - 9
pages/solution/stgz.vue

@@ -1,12 +1,12 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		<view class="boxs">
 			<!-- 双碳实现路径 -->
-			<view class="box1 stsxlj">
+			<view class="box1 stsxlj" data-aos="zoom-in" data-aos-delay="600">
 				<view class="b_title">双碳实现路径</view>
 				<view class="items">
 					<view class="item">
@@ -32,12 +32,12 @@
 				</view>
 			</view>
 			<!-- 系统架构 -->
-			<view class="box2">
+			<view class="box2" data-aos="zoom-in" data-aos-delay="900">
 				<view class="b_title">系统架构</view>
 				<image class="b_img" src="../../static/imgs/stgz_img1.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/stgz_img1.png')"></image>
 			</view>
 			<!-- 碳排放管理 -->
-			<view class="box2 tpfgl">
+			<view class="box2 tpfgl" data-aos="slide-left">
 				<view class="b_title">碳排放管理</view>
 				<view class="b_tip">摸清企业碳家底,挖掘减排潜力</view>
 				<view class="b_items">
@@ -50,7 +50,7 @@
 				</view>
 			</view>
 			<!-- 碳减排管理 -->
-			<view class="box1">
+			<view class="box1" data-aos="slide-right">
 				<view class="b_title">碳减排管理</view>
 				<view class="b_tip">节能降碳,结合能源管控,通过节能诊断及优化控制减少碳排放</view>
 				<image class="b_img2" src="../../static/imgs/stgz_img3.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/stgz_img3.png')"></image>
@@ -60,14 +60,14 @@
 				<image class="b_img" src="../../static/imgs/stgz_img4.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/stgz_img4.png')"></image>
 			</view>
 			<!-- 节能降碳-智能照明 -->
-			<view class="box1 jnjt">
+			<view class="box1 jnjt" data-aos="slide-left">
 				<view class="b_title">节能降碳-智能照明</view>
 				<block v-if="functionList2.length">
 					<uFunction :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in functionList2" :key="index"></uFunction>
 				</block>
 			</view>
 			<!-- 碳资产管理 -->
-			<view class="box1">
+			<view class="box1" data-aos="slide-right">
 				<view class="b_title">碳资产管理</view>
 				<view class="b_tip2">测算碳配额,结合碳排放数据分析配额盈缺情况,为企业履约或开展碳交易提供决策辅助,支持碳排放目标制定和分解,标记目标考核缺口,挖掘改善空间,实现企业碳排放的精细化管理</view>
 				<block v-if="functionList3.length">
@@ -76,7 +76,7 @@
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -217,6 +217,7 @@
 	.content{
 		width: 100%;
 		padding-bottom: 220rpx;
+		overflow-y: hidden;
 		
 		.boxs{
 			.b_title{

+ 26 - 26
pages/solution/szks.vue

@@ -1,35 +1,35 @@
 <template>
 	<view class="page">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
-		<image class="v_img" src="../../static/imgs/szks_img1.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img1.png')"></image>
-		<view class="v_text vtext1">
+		<uTop data-aos="fade-down"></uTop>
+		<image class="v_img" src="../../static/imgs/szks_img1.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img1.png')" data-aos="zoom-in" data-aos-delay="200"></image>
+		<view class="v_text vtext1" data-aos="zoom-in" data-aos-delay="400">
 			XIM, 基于中国新型工业化和能源高质量发展阶段的刚需51WORLD携手传秀科技为传统产业提供数字赋能和工艺升级。通过数字技术与实体经济的结合,提供高精度工业与能源行业数字基建、数据融合及驱动、数字化管理升级等服务,致力于全行业数智化转型升级。
 		</view>
-		<view class="v_title" style="margin-top: 48rpx;">平台架构</view>
-		<image class="v_img" style="margin-top: 20rpx;" src="../../static/imgs/szks_img2.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img2.png')"></image>
-		<view class="v_title" style="margin-top: 88rpx;">数字孪生应用</view>
-		<view class="v_imgs">
+		<view data-aos="zoom-in" data-aos-delay="600" class="v_title" style="margin-top: 48rpx;">平台架构</view>
+		<image data-aos="zoom-in" data-aos-delay="800" class="v_img" style="margin-top: 20rpx;" src="../../static/imgs/szks_img2.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img2.png')"></image>
+		<view data-aos="zoom-in" data-aos-delay="1000" data-aos-offset="10" class="v_title" style="margin-top: 88rpx;">数字孪生应用</view>
+		<view class="v_imgs" data-aos="zoom-in">
 			<image class="v_img" v-for="(img,idx) in szlsyyImgs" :key="idx" :src="img" mode="widthFix"></image>
 		</view>
-		<view class="v_img_title">
+		<view class="v_img_title" data-aos="zoom-in">
 			<image class="v_img" src="../../static/imgs/szks_img3.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img3.png')"></image>
 			<view class="v_title vtitle1" style="top: 100rpx;">数字矿山</view>
 		</view>
-		<view class="v_text vtext2">
+		<view class="v_text vtext2" data-aos="zoom-in">
 			<span>以数字孪生为核心、数据整合为基础,从传统多系统烟囱式架构到可视化应用一体化数字化转型,</span>形成集可视化高度融合的生产指挥调度平台、高可靠安全监测及设备保障平台、高效率信息化管理平台为一体的【流程贯通、业务融合、场景监控】的智慧矿山系统。
 		</view>
-		<view class="v_title" style="margin-top: 128rpx;">数字矿山宏观架构</view>
-		<image class="v_img" style="margin-top: 48rpx;" src="../../static/imgs/szks_img4.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img4.png')"></image>
-		<view class="v_img_title" style="margin-top: 88rpx;">
+		<view data-aos="zoom-in" class="v_title" style="margin-top: 128rpx;">数字矿山宏观架构</view>
+		<image data-aos="zoom-in" class="v_img" style="margin-top: 48rpx;" src="../../static/imgs/szks_img4.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img4.png')"></image>
+		<view data-aos="zoom-in" class="v_img_title" style="margin-top: 88rpx;">
 			<image class="v_img" src="../../static/imgs/szks_img5.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img5.png')"></image>
 			<view class="v_title vtitle1" style="top: 49rpx;">矿区地质</view>
 		</view>
 		<view class="v_bg">
-			<view class="v_title">矿区设备</view>
-			<view class="v_tip" style="margin-top: 20rpx;">完备的远程监控指标,减少现场人工监控作业<span style="font-size: 32rpx;font-weight: bold;">30%</span></view>
+			<view data-aos="zoom-in" class="v_title">矿区设备</view>
+			<view data-aos="zoom-in" class="v_tip" style="margin-top: 20rpx;">完备的远程监控指标,减少现场人工监控作业<span style="font-size: 32rpx;font-weight: bold;">30%</span></view>
 			<view class="vb_items">
-				<view class="vb_item" v-for="(item,index) in kqsbList" :key="index">
+				<view class="vb_item" v-for="(item,index) in kqsbList" :key="index" data-aos="zoom-in">
 					<image class="left" :src="item.img" @click="e=>showBigImg(e,item.img)"></image>
 					<view class="right">
 						<view class="rtop">
@@ -40,18 +40,18 @@
 					</view>
 				</view>
 			</view>
-			<image class="v_img" style="margin-top: 16rpx;" src="../../static/imgs/szks_img6.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img6.png')"></image>
+			<image data-aos="zoom-in" class="v_img" style="margin-top: 16rpx;" src="../../static/imgs/szks_img6.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img6.png')"></image>
 		</view>
-		<view class="v_bg v_kqzy">
+		<view class="v_bg v_kqzy" data-aos="zoom-in">
 			<view class="v_title">矿区作业</view>
 			<view class="v_tip" style="margin-top: 20rpx;">孪生矿山:实时监测作业质量和进度,提升安全保障</view>
 			<image class="v_img" style="margin-top: 20rpx;" src="../../static/imgs/szks_img7.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img7.png')"></image>
 			<image class="v_img" style="margin-top: 46rpx;" src="../../static/imgs/szks_img8.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img8.png')"></image>
 			<image class="v_img" style="margin-top: 6rpx;" src="../../static/imgs/szks_img9.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img9.png')"></image>
 		</view>
-		<view class="v_title" style="margin-top: 128rpx;">人员(定位)管理</view>
-		<image class="v_img" style="margin-top: 48rpx;" src="../../static/imgs/szks_img10.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img10.png')"></image>
-		<view class="v_bg v_hbfl">
+		<view data-aos="zoom-in" class="v_title" style="margin-top: 128rpx;">人员(定位)管理</view>
+		<image data-aos="zoom-in" class="v_img" style="margin-top: 48rpx;" src="../../static/imgs/szks_img10.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img10.png')"></image>
+		<view class="v_bg v_hbfl" data-aos="zoom-in">
 			<view class="v_title">环保及复绿</view>
 			<view class="vh_title">能源监测</view>
 			<view class="vh_items">
@@ -60,7 +60,7 @@
 			<image class="v_img" style="margin-top: 42rpx;" src="../../static/imgs/szks_img11.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img11.png')"></image>
 			<image class="v_img" style="margin-top: 30rpx;" src="../../static/imgs/szks_img12.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img11.png')"></image>
 		</view>
-		<view class="v_bg v_ksdlcc">
+		<view class="v_bg v_ksdlcc" data-aos="zoom-in">
 			<view class="v_title">矿石堆料存储</view>
 			<view class="vk_boxs">
 				<view class="vk_box" v-for="(item,index) in ksdlccList" :key="index">
@@ -72,12 +72,12 @@
 			</view>
 			<image class="v_img" style="margin-top: 20rpx;" src="../../static/imgs/szks_img13.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img13.png')"></image>
 		</view>
-		<view class="v_title" style="margin-top: 128rpx;">综合运输管理</view>
-		<image class="v_img" style="margin-top: 48rpx;" src="../../static/imgs/szks_img14.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img14.png')"></image>
-		<view class="v_title" style="margin-top: 128rpx;">应急方案响应</view>
-		<image class="v_img" style="margin-top: 48rpx;" src="../../static/imgs/szks_img15.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img15.png')"></image>
+		<view data-aos="zoom-in" class="v_title" style="margin-top: 128rpx;">综合运输管理</view>
+		<image data-aos="zoom-in" class="v_img" style="margin-top: 48rpx;" src="../../static/imgs/szks_img14.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img14.png')"></image>
+		<view data-aos="zoom-in" class="v_title" style="margin-top: 128rpx;">应急方案响应</view>
+		<image data-aos="zoom-in" class="v_img" style="margin-top: 48rpx;" src="../../static/imgs/szks_img15.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/szks_img15.png')"></image>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 

+ 29 - 15
pages/solution/zhly.vue

@@ -1,10 +1,10 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="descBg"></uDesc>
-		<view class="question">
+		<uDesc :title="dTitle" :description="dMemo" :bg="descBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
+		<view class="question" data-aos="zoom-in" data-aos-delay="600">
 			<div class="title">楼宇系统面临的问题?</div>
 			<block v-if="quetionList.length">
 				<uFunction :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in quetionList" :key="index"></uFunction>
@@ -12,23 +12,27 @@
 		</view>
 		<view class="box">
 			<view class="box1">
-				<view class="b_title">方案亮点</view>
-				<block v-if="faldList.length">
-					<uFunction :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in faldList" :key="index"></uFunction>
-				</block>
+				<view class="boxTwo" data-aos="slide-left" data-aos-delay="900" data-aos-offset="10">
+					<view class="b_title">方案亮点</view>
+					<block v-if="faldList.length">
+						<uFunction :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in faldList" :key="index"></uFunction>
+					</block>
+				</view>
 			</view>
 			<view class="box2">
-				<view class="b_title">智慧楼宇5A架构</view>
-				<image style="margin-top: 48rpx;" class="img" src="../../static/imgs/zhly_img2.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhly_img2.png')"></image>
-				<view class="b_head">可视、可控、可管智慧化管理平台</view>
-				<image class="img" src="../../static/imgs/zhly_img3.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhly_img3.png')"></image>
-				<view class="b_head">构建可知可视可控、万物互联的智慧楼宇</view>
-				<view class="b_tip">通过大屏和3D可视化系统的配合,颠覆传统,提升宣传展示能力,彰显综合实力;<br>通过可视化的智能设备管理,直感交互,可视管控,有效的提升运营与管理水平,帮助综合楼降本增效。</view>
-				<image class="img" src="../../static/imgs/zhly_img4.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhly_img4.png')"></image>
+				<view class="boxTwo">
+					<view class="b_title" data-aos="slide-left">智慧楼宇5A架构</view>
+					<image style="margin-top: 48rpx;" class="img" src="../../static/imgs/zhly_img2.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhly_img2.png')" data-aos="slide-left"></image>
+					<view class="b_head" data-aos="slide-left">可视、可控、可管智慧化管理平台</view>
+					<image class="img" src="../../static/imgs/zhly_img3.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhly_img3.png')" data-aos="slide-left"></image>
+					<view class="b_head" data-aos="slide-left">构建可知可视可控、万物互联的智慧楼宇</view>
+					<view class="b_tip" data-aos="slide-left">通过大屏和3D可视化系统的配合,颠覆传统,提升宣传展示能力,彰显综合实力;<br>通过可视化的智能设备管理,直感交互,可视管控,有效的提升运营与管理水平,帮助综合楼降本增效。</view>
+					<image class="img" src="../../static/imgs/zhly_img4.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhly_img4.png')" data-aos="slide-left"></image>
+				</view>
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -137,6 +141,7 @@
 	
 	.content{
 		padding-bottom: 44rpx;
+		overflow: hidden;
 		.question{
 			width: 100%;
 			height: 770rpx;
@@ -156,10 +161,19 @@
 			}
 		}
 	
+		.boxTwo{
+			width: 100%;
+			overflow: hidden;
+		}
+		.box1,.box2{
+			overflow: hidden;
+		}
+	
 		.box{
 			width: 100%;
 			padding: 0 30rpx;
 			box-sizing: border-box;
+			overflow: hidden;
 			
 			.b_title{
 				font-family: PingFang-SC, PingFang-SC;

+ 2 - 2
pages/solution/zhnt.vue

@@ -1,9 +1,9 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="descBg"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" :bg="descBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		<view class="boxs">
 			<!-- 方案特征 -->
 			<view class="fatz box">

+ 2 - 2
pages/solution/zhtc.vue

@@ -1,9 +1,9 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="descBg"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" :bg="descBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		<view class="boxs">
 			<!-- 方案特征 -->
 			<view class="fatz box">

+ 25 - 17
pages/solution/zhwb.vue

@@ -1,10 +1,10 @@
 <template>
 	<view class="content">
-		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<!-- 顶部logo和菜单 -->
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg"></uDesc>
-		<view class="ques">
+		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
+		<view class="ques" data-aos="slide-left" data-aos-delay="600">
 			<view class="quesTitle">工厂设备的维修管理,您是否有以下烦恼?</view>
 			<view class="quesContent">
 				<view class="li" v-for="(item,index) in qiesContent" :key="index">{{item}}</view>
@@ -13,38 +13,40 @@
 		<view class="boxs">
 			<!-- 产品功能 -->
 			<view class="box">
-				<view class="title">产品功能</view>
-				<block v-if="functionList.length">
-					<uFunction :title="item.title" :list="item.list" v-for="(item,index) in functionList" :key="index">
-					</uFunction>
+				<view class="title" data-aos="slide-right" data-aos-delay="900">产品功能</view>
+				<block v-if="functionList.length">
+					<view class="box2">
+						<uFunction :title="item.title" :list="item.list" v-for="(item,index) in functionList" :key="index" data-aos="slide-left">
+						</uFunction>
+					</view>
 				</block>
 			</view>
 			<image class="line" src="../../static/imgs/line.png"></image>
 			<view class="fajg box">
-				<view class="title">模块展示</view>
+				<view class="title" data-aos="slide-right">模块展示</view>
 				<view class="list">
-					<view class="li">
+					<view class="li" data-aos="slide-left">
 						<image src="../../static/imgs/znwb1.png" ></image>
 						<view class="right">
 							<view class="tit">设备状态 快速感知</view>
 							<view class="txt">对接Lighthouse系统,将设备监视、维修、保养、备件管理、人员考核紧密联动,生成设备智能工单,提高设备管理效率和精准性。</view>
 						</view>
 					</view>
-					<view class="li">
+					<view class="li" data-aos="slide-left">
 						<image src="../../static/imgs/znwb2.png" ></image>
 						<view class="right">
 							<view class="tit">只需1s 智能派单</view>
 							<view class="txt">设备发生故障时,采集维修人员位置信息、负荷情况,通过UWB手环进行智能派单通知、预警通知、维修超时通知。</view>
 						</view>
 					</view>
-					<view class="li">
+					<view class="li" data-aos="slide-left">
 						<image src="../../static/imgs/znwb3.png"></image>
 						<view class="right">
 							<view class="tit">闭环管理 全程可视</view>
 							<view class="txt">联动设备监控、维修、通知各环节,打造设备智能化维修保养解决方案,设备数据智能采集,并生成可视化报表,助力工厂管理者随时了解设备状态。</view>
 						</view>
 					</view>
-					<view class="li">
+					<view class="li" data-aos="slide-left">
 						<image src="../../static/imgs/znwb4.png"></image>
 						<view class="right">
 							<view class="tit">设备状态</view>
@@ -55,7 +57,7 @@
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -189,13 +191,15 @@
 
 	}
 	.content {
-		padding-bottom: 103rpx;
+		padding-bottom: 103rpx;
+		overflow: hidden;
 		.boxs {
 			width: 100%;
 			padding: 0 30rpx;
 			box-sizing: border-box;
 			background: #FFFFFF;
-			font-size: 0;
+			font-size: 0;
+			overflow: hidden;
 			.line{
 				width: 100%;
 				height:10rpx ;
@@ -203,7 +207,11 @@
 			}
 			.box {
 				width: 100%;
-				margin-top: 48rpx;
+				margin-top: 48rpx;
+				overflow: hidden;
+				.box2{
+					width: 100%;
+				}
 
 				.title {
 					font-family: PingFang-SC, PingFang-SC;

+ 37 - 19
pages/solution/zhwl.vue

@@ -1,12 +1,12 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		<view class="boxs">
 			<!-- “互联网+全域旅游” -->
-			<view class="box box1">
+			<view class="box box1" data-aos="zoom-in" data-aos-delay="600">
 				<view class="b_title">“互联网+全域旅游”</view>
 				<view class="items">
 					<view class="item">
@@ -43,40 +43,52 @@
 			</view>
 			<!-- 总体框架 -->
 			<view class="box box2">
-				<view class="b_title">总体框架</view>
-				<view class="b_tip">以"智能化建设"为基础、"大数据分析"为主线、"互联网运营"为核心,为全域文旅建立起"管理智慧化"、"服务智慧化"、"营销智慧化"和"体验智慧化"的智慧化发展体系。</view>
-				<image class="b_img" src="../../static/imgs/zhwl_img1.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img1.png')"></image>
+				<view class="boxTwo">
+					<view class="b_title" data-aos="slide-left">总体框架</view>
+					<view class="b_tip" data-aos="slide-left">以"智能化建设"为基础、"大数据分析"为主线、"互联网运营"为核心,为全域文旅建立起"管理智慧化"、"服务智慧化"、"营销智慧化"和"体验智慧化"的智慧化发展体系。</view>
+					<image data-aos="slide-left" class="b_img" src="../../static/imgs/zhwl_img1.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img1.png')"></image>
+				</view>
 			</view>
 			<!-- 服务对象 -->
 			<view class="box box3">
-				<view class="b_title">服务对象</view>
-				<view class="b_tip">构建支撑智慧化决策的旅游大数据中心,建立数据标准规范,通过对游客、涉旅产业、政府相关委办产生的庞杂、多元的数据的整理、分析、挖掘,实现全域数据融合。</view>
-				<image class="b_img2" src="../../static/imgs/zhwl_img2.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img2.png')"></image>
+				<view class="boxTwo">
+					<view data-aos="slide-left" class="b_title">服务对象</view>
+					<view data-aos="slide-left" class="b_tip">构建支撑智慧化决策的旅游大数据中心,建立数据标准规范,通过对游客、涉旅产业、政府相关委办产生的庞杂、多元的数据的整理、分析、挖掘,实现全域数据融合。</view>
+					<image data-aos="slide-left" class="b_img2" src="../../static/imgs/zhwl_img2.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img2.png')"></image>
+				</view>
 			</view>
 			<!-- 指挥调度 -->
 			<view class="box box4">
-				<view class="b_title">指挥调度</view>
-				<view class="b_tip">以旅游安全监管和应急指挥指挥、分级调度和处置为目的,通过应急预案、应急保障、应急调度指挥功能,实现面向目的地客流超载、人员伤亡、交通事故、群体事件、财产损失、自然灾害等突发应急 事件的协同处理。</view>
-				<image class="b_img" src="../../static/imgs/zhwl_img3.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img3.png')"></image>
+				<view class="boxTwp">
+					<view data-aos="slide-left" class="b_title">指挥调度</view>
+					<view data-aos="slide-left" class="b_tip">以旅游安全监管和应急指挥指挥、分级调度和处置为目的,通过应急预案、应急保障、应急调度指挥功能,实现面向目的地客流超载、人员伤亡、交通事故、群体事件、财产损失、自然灾害等突发应急 事件的协同处理。</view>
+					<image data-aos="slide-left" class="b_img" src="../../static/imgs/zhwl_img3.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img3.png')"></image>
+				</view>
 			</view>
 			<!-- 业务门户 -->
 			<view class="box box5">
-				<view class="b_title">业务门户</view>
-				<image class="b_img" src="../../static/imgs/zhwl_img4.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img4.png')"></image>
+				<view class="boxTwo">
+					<view data-aos="slide-left" class="b_title">业务门户</view>
+					<image data-aos="slide-left" class="b_img" src="../../static/imgs/zhwl_img4.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img4.png')"></image>
+				</view>
 			</view>
 			<!-- 四类应用 -->
 			<view class="box box6">
-				<view class="b_title">四类应用</view>
-				<image class="b_img" src="../../static/imgs/zhwl_img5.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img5.png')"></image>
+				<view class="boxTwo">
+					<view data-aos="slide-left" class="b_title">四类应用</view>
+					<image data-aos="slide-left" class="b_img" src="../../static/imgs/zhwl_img5.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img5.png')"></image>
+				</view>
 			</view>
 			<!-- 整体架构 -->
 			<view class="box box7">
-				<view class="b_title">整体架构</view>
-				<image class="b_img" src="../../static/imgs/zhwl_img6.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img6.png')"></image>
+				<view class="boxTwo">
+					<view data-aos="slide-left" class="b_title">整体架构</view>
+					<image data-aos="slide-left" class="b_img" src="../../static/imgs/zhwl_img6.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/zhwl_img6.png')"></image>
+				</view>
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -146,6 +158,12 @@
 	.content{
 		width: 100%;
 		padding-bottom: 272rpx;
+		overflow: hidden;
+		
+		.boxTwo{
+			width: 100%;
+			overflow: hidden;
+		}
 		
 		.boxs{
 			.b_title{

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 32 - 14
pages/solution/zhxf.vue


+ 20 - 13
pages/solution/zncc.vue

@@ -1,34 +1,36 @@
 <template>
 	<view class="content">
-		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<!-- 顶部logo和菜单 -->
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg"></uDesc>
-		<view class="ques">
+		<uDesc :title="dTitle" :description="dMemo" :bg="bannerBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
+		<view class="ques" data-aos="slide-left" data-aos-delay="600">
 			<view class="quesTitle">仓储的管理,您是否有以下烦恼?</view>
 			<view class="quesContent">
 				<view class="li" v-for="(item,index) in qiesContent" :key="index">{{item}}</view>
 			</view>
 		</view>
 		<view class="boxs">
-			<view class="fajg box">
+			<view class="fajg box" data-aos="slide-right" data-aos-delay="900">
 				<view class="title">智能仓储架构图</view>
 				<image src="../../static/imgs/zncc0.png" mode="widthFix" @click="showBigImg"></image>
 			</view>
 
 			<view class="ggld box">
-				<view class="title">功能亮点</view>
-				<view class="list">
-					<view class="li" v-for="(item,index) in gnlds" :key="index">
-						<view class="tit">{{item.txt}}</view>
-						<view class="subtit">{{item.subtit}}</view>
-						<image :src="item.img"></image>
+				<view class="title" data-aos="slide-left">功能亮点</view>
+				<view class="list">
+					<view class="li2">
+						<view class="li" v-for="(item,index) in gnlds" :key="index" data-aos="slide-left">
+							<view class="tit">{{item.txt}}</view>
+							<view class="subtit">{{item.subtit}}</view>
+							<image :src="item.img"></image>
+						</view>
 					</view>
 				</view>
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -148,7 +150,8 @@
 	}
 
 	.content {
-		padding-bottom: 98rpx;
+		padding-bottom: 98rpx;
+		overflow: hidden;
 		.boxs {
 			width: 100%;
 			padding: 0 0;
@@ -182,6 +185,10 @@
 					margin-bottom: -66rpx;
 					.title{
 						padding: 48rpx 0;
+					}
+					.li2{
+						width: 100%;
+						overflow: hidden;
 					}
 					.li{
 						padding: 36rpx 40rpx;

+ 24 - 11
pages/solution/znpc.vue

@@ -1,39 +1,43 @@
 <template>
 	<view class="content">
 		<!-- 顶部logo和菜单 -->
-		<uTop></uTop>
+		<uTop data-aos="fade-down"></uTop>
 		<!-- 标题和介绍 -->
-		<uDesc :title="dTitle" :description="dMemo" :bg="descBg"></uDesc>
+		<uDesc :title="dTitle" :description="dMemo" :bg="descBg" data-aos="slide-right" data-aos-delay="300"></uDesc>
 		
-		<view class="box1">
+		<view class="box1" data-aos="zoom-in" data-aos-delay="600">
 			<view class="title">您的企业是否正面临以下烦恼?</view>
 		</view>
-		<view class="box2">
+		<view class="box2" :bg="descBg" data-aos="slide-left">
 			<div class="title">智能排产方案</div>
 			<image src="../../static/imgs/znpc_img2.png" mode="widthFix" @click="e=>showBigImg(e,'../../static/imgs/znpc_img2.png')"></image>
 		</view>
 		<view class="box3">
 			<block v-if="functionList.length">
-				<uFunction :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in functionList" :key="index"></uFunction>
+				<view class="boxTwo">
+					<uFunction :showTitle="false" :title="item.title" :list="item.list" v-for="(item,index) in functionList" :key="index" data-aos="slide-right"></uFunction>
+				</view>
 			</block>
 		</view>
 		<view class="box4">
 			<image src="../../static/imgs/line.png" mode=""></image>
 		</view>
 		<view class="box5">
-			<view class="title">应用场景</view>
+			<view class="title" data-aos="slide-left">应用场景</view>
 			<view class="items">
 				<view class="item" v-for="(item,index) in yycjList" :key="index">
-					<view class="img">
-						<image :src="item.img" mode=""></image>
+					<view class="boxTwo" data-aos="slide-right">
+						<view class="img">
+							<image :src="item.img" mode=""></image>
+						</view>
+						<view class="title">{{item.title}}</view>
+						<view class="desc">{{item.desc}}</view>
 					</view>
-					<view class="title">{{item.title}}</view>
-					<view class="desc">{{item.desc}}</view>
 				</view>
 			</view>
 		</view>
 		<!-- 合作与咨询 -->
-		<uForm></uForm>
+		<uForm data-aos="zoom-in"></uForm>
 	</view>
 </template>
 
@@ -166,6 +170,13 @@
 	
 	.content{
 		padding-bottom: 44rpx;
+		overflow: hidden;
+			
+		.boxTwo{
+			width: 100%;
+			overflow: hidden;
+		}
+		
 		.box1{
 			width: 100%;
 			height: 940rpx;
@@ -203,6 +214,7 @@
 			padding: 0 30rpx;
 			box-sizing: border-box;
 			margin-top: -16rpx;
+			overflow: hidden;
 		}
 		
 		.box4{
@@ -235,6 +247,7 @@
 				.item{
 					width: calc(50% - 25rpx);
 					margin-top: 48rpx;
+					overflow: hidden;
 					.img{
 						width: 320rpx;
 						height: 200rpx;