[
  {
    "path": ".gitignore",
    "content": "node_modules\nbower_components\n"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  \"undef\": true,\n  \"unused\": true,\n  \"camelcase\": true,\n  \"curly\": true,\n  \"indent\": 2,\n  \"latedef\": true,\n  \"newcap\": true,\n  \"noarg\": true,\n  \"noempty\": true,\n  \"nonew\": true,\n  \"quotmark\": \"single\",\n  \"strict\": true,\n  \"trailing\": true,\n  \"maxlen\": 79,\n  \"browser\": true,\n  \"jquery\": true,\n  \"globals\": {\n      \"jQuery\": true,\n      \"module\": true,\n      \"document\": true,\n      \"describe\": true,\n      \"jasmine\": true,\n      \"it\": true,\n      \"loadFixtures\": true,\n      \"loadStyleFixtures\": true,\n      \"expect\": true,\n      \"beforeEach\": true\n   }\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# 0.3.0\n\n## BUg Fixes\n\n* Prevent bar from being partially visible after elastic scroll\n\n## Features\n\n* Add simplified fallback implementation for iOS devices\n* Add support for variable height bars\n* Add support for bars with offset top\n* Add visibility state handlers\n* Add `destroy` method\n\n# 0.2.0\n\n## Bug Fixes\n\n* Fix scrolling misbehaviour on IE\n* Fix bar positioning when scrolling for the first time through arrows or page down/up buttons\n\n## Features\n\n* Implement karma unit tests\n* Add HTTPS support for example page\n* Automate build and test tasks with Grunt, npm and bower\n* Change directory structure: there is a `dist` folder now\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n## Building\n\nDependencies for building from source and running tests:\n\n* [Git](http://git-scm.com/) - follow the [Github Guide to Installing Git](https://help.github.com/articles/set-up-git)\n* [Node.js](http://nodejs.org) - depending on your system, you can install Node either from source or as a pre-packaged bundle\n* [Grunt](http://gruntjs.com) - run: `sudo npm install -g grunt-cli`\n* [Bower](http://bower.io/): - run: `sudo npm install -g bower`\n\nUse Grunt to generate the non-minified and minified scroll-up-bar files:\n\n```shell\n# Clone your Github repository:\ngit clone git://github.com:<github username>/scroll-up-bar.git\n\n# Go to the scroll-up-bar directory:\ncd scroll-up-bar\n\n# Install node.js dependencies:\nnpm install\n\n# Install bower components:\nbower install\n\n# Build scroll-up-bar:\ngrunt build\n```\n\n## Code Style\n\n * JavaScript style should follow the [Google JS style guide](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml)\n * Wrap code at 80 chars\n * Check syntax with `grunt jshint`\n * Be consistent with the code around you!\n\n## Pull Request\n\n * Always have test coverage for new features or bug fixes, and never break existing tests. Use `grunt test` to run tests\n * Commits should represent one logical change each; if a feature goes through multiple iterations, squash your commits into to one\n * If you need to change a commit after the pull request was sent, ammend it and force the push instead of opening a new pull request\n\n## Commit Messages\n\nFollow the Tim Pope's [commit message format](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).\n\nIn summary, the rules are\n\n * Title: 50 chars or less.\n * Body: wrap it to about 72 characters or so.\n * Write your commit message in the imperative: \"Fix bug\" and not \"Fixed bug\".\n"
  },
  {
    "path": "Gruntfile.js",
    "content": "module.exports = function(grunt) {\n  'use strict';\n\n  grunt.initConfig({\n    pkg: grunt.file.readJSON('package.json'),\n    concat: {\n      options: {\n        separator: ';',\n        banner: '/* <%= pkg.name %> v<%= pkg.version %> (<%= pkg.homepage %>) */\\n'\n      },\n      dist: {\n        src: ['src/**/*.js'],\n        dest: 'dist/<%= pkg.name %>.js'\n      }\n    },\n    uglify: {\n      options: {\n        banner: '/* <%= pkg.name %> v<%= pkg.version %> (<%= pkg.homepage %>) */\\n'\n      },\n      dist: {\n        files: {\n          'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']\n        }\n      }\n    },\n    jshint: {\n      files: ['Gruntfile.js', 'src/**/*.js', 'test/**/*.js']\n    },\n    karma: {\n      unit: {\n        configFile: 'karma.conf.js'\n      },\n      continuous: {\n        configFile: 'karma.conf.js',\n        singleRun: true\n      }\n    },\n    watch: {\n      files: ['<%= jshint.files %>'],\n      tasks: ['jshint', 'karma']\n    }\n  });\n\n  grunt.loadNpmTasks('grunt-contrib-uglify');\n  grunt.loadNpmTasks('grunt-contrib-jshint');\n  grunt.loadNpmTasks('grunt-karma');\n  grunt.loadNpmTasks('grunt-contrib-watch');\n  grunt.loadNpmTasks('grunt-contrib-concat');\n\n  grunt.registerTask('test', ['karma:unit']);\n  grunt.registerTask('build', ['jshint', 'karma:continuous', 'concat',\n                               'uglify']);\n  grunt.registerTask('default', ['build']);\n};\n"
  },
  {
    "path": "LICENSE.md",
    "content": "Copyright (c) 2016\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# ScrollUpBar Plugin\n\nThe scroll up bar plugin (jQuery) hides the top bar when scrolling down, and\nshow it when scrolling up. It's specially useful on mobile interfaces to save\nsome precious space.\n\n## Demos\n\n* [Simple](http://eduardomb.github.io/scroll-up-bar)\n* [Bar with offset](http://eduardomb.github.io/scroll-up-bar/offset.html)\n* [Viewport callbacks](http://eduardomb.github.io/scroll-up-bar/callback.html)\n\n## Installation\n\nInclude [jQuery](http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js) and `scroll-up-bar.min.js` scripts:\n```html\n<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js\"></script>\n<script src=\"scroll-up-bar.min.js\"></script>\n```\n\n[Bower](https://github.com/bower/bower) users can get the source with:\n\n```sh\nbower install scroll-up-bar\n```\n\n## Basic Usage\n\nCreate a top bar using position absolute.\n```html\n<div id=\"topbar\" style=\"position: absolute; top: 0; left: 0; width: 100%; background: #ccc;\">\n  Top bar\n</div>\n```\n_Tip: you can also add top different than zero_\n\nAnd then invoke `scrollupbar()` on the element.\n```javascript\n$('#topbar').scrollupbar();\n```\n_Alternatively you can invoke with `$.scrollupbar($('#topbar'))`_\n\n## Options\n\nYou can pass callback functions in initialization to handle bar visibility events.\n\n* `enterViewport` - when the bar enters the viewport\n* `fullyEnterViewport` - when the bar is completely in the viewport\n* `exitViewport` - when the bar completely leaves the viewport\n* `partiallyExitViewport` - when the bar goes from being fully in the viewport to only partially\n\nCheckout the [callback example](http://eduardomb.github.io/scroll-up-bar/callback.html).\n\n\n## Properties\n\nThere are two global boolean properties that are updated according to bar visibility.\n\n* `$.scrollupbar.isInViewport` - true if any part of the bar is visible, false if not\n* `$.scrollupbar.isFullyInViewport` - true if the entire bar is visible\n\n## Methods\n\n* `$.scrollupbar.destroy` - restores bar to original position and disables plugin\n\n## Browser support\n\nThe plugin was tested on:\n\n* Chrome\n* Firefox\n* Safari\n* Opera\n* IE\n\n## Contributing\n\nRead the [Contributing document](CONTRIBUTING.md) for instructions on how to set up your development environment to build and test scroll-up-bar.\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"scroll-up-bar\",\n  \"main\": \"dist/scroll-up-bar.min.js\",\n  \"version\": \"0.3.0\",\n  \"homepage\": \"https://github.com/eduardomb/scroll-up-bar\",\n  \"authors\": [\n    \"Eduardo Barbosa <eduardomb@ufmg.br>\"\n  ],\n  \"description\": \"The scroll up bar plugin (jQuery) hides the top bar when scrolling down, and show it when scrolling up.\",\n  \"keywords\": [\n    \"scroll\",\n    \"up\",\n    \"bar\",\n    \"jquery\"\n  ],\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"test\",\n    \"tests\"\n  ],\n  \"dependencies\": {\n    \"jquery\": \"~2.1.1\"\n  },\n  \"devDependencies\" : {\n    \"jasmine-jquery\": \"~2.0.5\"\n  }\n}\n"
  },
  {
    "path": "dist/scroll-up-bar.js",
    "content": "/* scroll-up-bar v0.3.0 (https://github.com/eduardomb/scroll-up-bar) */\n(function($) {\n  'use strict';\n\n  var _destroyFn;\n\n  $.scrollupbar = function($bar, options) {\n    // Default options\n    options = $.extend({\n      enterViewport: $.noop,\n      fullyEnterViewport: $.noop,\n      exitViewport: $.noop,\n      partiallyExitViewport: $.noop\n    }, options);\n\n    function isFullyInViewport() {\n      return $window.scrollTop() <= $bar.offset().top;\n    }\n\n    function isInViewport() {\n      return $window.scrollTop() < $bar.offset().top + $bar.outerHeight();\n    }\n\n    var $window = $(window),\n        $document = $(document),\n        minY = $bar.css('position') == 'fixed' ? 0 : $bar.offset().top,\n        lastY = $window.scrollTop(), // Use last Y to detect scroll direction.\n        initialPosTop = $bar.position().top,\n        timeout;\n\n    $.scrollupbar.isInViewport = isInViewport();\n    $.scrollupbar.isFullyInViewport = isFullyInViewport();\n\n    $window.on('scroll.scrollupbar', function() {\n      var y = $window.scrollTop(),\n          barHeight = $bar.outerHeight();\n\n      // Ignore elastic scrolling.\n      if (y < 0 || y > ($document.height() - $window.height())) {\n        return;\n      }\n\n      // Cancel the event fired by the previous scroll.\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n\n      if (y < lastY) { // Scrolling up\n        // If the bar is hidden, place it right above the top frame.\n        if (!$.scrollupbar.isInViewport && lastY - barHeight >= minY) {\n          $bar.css('top', lastY - barHeight);\n          $.scrollupbar.isInViewport = true;\n          options.enterViewport();\n        }\n\n        // Scrolls up bigger than the bar's height fixes the bar on top.\n        if (isFullyInViewport()) {\n          if (y >= minY) {\n            $bar.css({\n              'position': 'fixed',\n              'top': 0\n            });\n          } else {\n            $bar.css({\n              'position': 'absolute',\n              'top': initialPosTop\n            });\n          }\n\n          if (!$.scrollupbar.isFullyInViewport) {\n            $.scrollupbar.isFullyInViewport = true;\n            options.fullyEnterViewport();\n          }\n        }\n\n        // Fire an event to reveal the entire bar after 400ms if the scroll\n        // wasn't big enough.\n        timeout = setTimeout(function() {\n          if (!$.scrollupbar.isFullyInViewport) {\n            $bar.css({\n              'position': 'fixed',\n              'top': $bar.offset().top - y\n            });\n\n            $bar.animate({'top': 0}, 100, function() {\n              $.scrollupbar.isFullyInViewport = true;\n              options.fullyEnterViewport();\n            });\n          }\n        }, 400);\n      } else if (y > lastY) { // Scrolling down\n        // Unfix the bar allowing it to scroll with the page.\n        if ($.scrollupbar.isFullyInViewport) {\n          $bar.css({\n            // translate3d fixes iOS invisible element bug when changing\n            // position values while scrolling.\n            'transform': 'translate3d(0, 0, 0)',\n            'position': 'absolute',\n            'top': lastY > minY ? lastY : initialPosTop\n          });\n\n          if (!isFullyInViewport()) {\n            $.scrollupbar.isFullyInViewport = false;\n            options.partiallyExitViewport();\n          }\n        }\n\n        if ($.scrollupbar.isInViewport && !isInViewport()) {\n          $.scrollupbar.isInViewport = false;\n          options.exitViewport();\n        }\n\n        // Fire an event to hide the entire bar after 400ms if the scroll\n        // wasn't big enough.\n        timeout = setTimeout(function() {\n          if (isInViewport() && y - barHeight >= minY) {\n            $bar.animate({'top': y - barHeight}, 100, function() {\n              $.scrollupbar.isInViewport = false;\n              options.exitViewport();\n            });\n          }\n        }, 400);\n      }\n\n      lastY = y;\n    });\n\n    _destroyFn = function() {\n      // Unbind all listeners added by scrollupbar plugin\n      $window.off('.scrollupbar');\n\n      // Restore original bar position.\n      $bar.css({\n        'position': 'absolute',\n        'top': initialPosTop\n      });\n    };\n\n    return $bar;\n  };\n\n  $.scrollupbar.destroy = function() {\n    if (_destroyFn) {\n      return _destroyFn();\n    }\n  };\n\n  $.fn.scrollupbar = function(options) {\n    return $.scrollupbar(this, options);\n  };\n})(jQuery);\n"
  },
  {
    "path": "example/callback.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Scroll up bar</title>\n  <style>\n    html,\n    body {\n      margin: 0;\n    }\n\n    body {\n      font-family: Arial;\n      font-size: 28px;\n      line-height: 1.6;\n    }\n\n    #topbar {\n      box-sizing: border-box;\n      position: absolute;\n      top: 0;\n      left: 0;\n      z-index: 1;\n      width: 100%;\n      padding: 10px;\n      text-align: center;\n      background: rgba(0, 0, 0, 0.8);\n      color: #fff;\n    }\n\n    #document {\n      max-width: 900px;\n      margin: 0 auto;\n      padding-top: 56px;\n    }\n\n    #footer {\n      position: fixed;\n      bottom: 0;\n      width: 100%;\n      background: rgba(255, 255, 255, 0.7);\n      background: #ccc;\n      text-align: center;\n    }\n\n    #is-in-viewport,\n    #is-fully-in-viewport,\n    #last-event {\n      font-weight: bold;\n    }\n  </style>\n</head>\n<body>\n  <div id=\"topbar\">Top bar with callbacks</div>\n  <div id=\"document\">\n    <h1>ScrollUpBar plugin example</h1>\n    <p>The scroll up bar plugin hides the top bar when scrolling down, and show\n    it when scrolling up.</p>\n    <p>Usage instructions available on\n    <a href=\"https://github.com/eduardomb/scroll-up-bar\">GitHub</a>. <b>Stop\n    reading now and scroll</b>.</p>\n    <p>Adipisicing harum quam consequatur deserunt minima. Eligendi quos iure\n    voluptatem corrupti amet ipsa a excepturi ratione sit ex est. Ducimus\n    perspiciatis sunt iusto architecto hic possimus tempore harum quasi\n    expedita!</p>\n    <p>Sit iste rerum fugit aliquid vero? In aut quos earum asperiores facilis\n    iste eius. Soluta voluptatum repudiandae dignissimos eius iste mollitia eos\n    veritatis magni commodi. Vero nulla vel error eius?</p>\n    <p>Dolor ab nesciunt deserunt quibusdam quaerat culpa dolor perspiciatis\n    laboriosam consequatur sed? Eligendi praesentium odit itaque assumenda rem\n    maxime ipsum quos pariatur deserunt commodi odio odit?  Quaerat minus illo\n    culpa.</p>\n    <p>Ipsum deleniti natus id assumenda dolore itaque ipsum. Eum nobis\n    necessitatibus eius unde modi. Inventore accusamus vero deleniti aspernatur\n    totam. Nam magni nostrum nesciunt consequatur delectus molestias eveniet\n    velit eveniet.</p>\n    <p>Adipisicing debitis amet repudiandae blanditiis consequatur libero.\n    Mollitia accusamus minima quam ad saepe minus! Et eum aliquam possimus iure\n    iste eveniet ex?  Consequatur repellendus ex architecto voluptate sapiente,\n    molestiae quam.</p>\n    <p>Consectetur numquam debitis commodi minima doloremque voluptas minima\n    sapiente obcaecati veritatis quia corrupti officia mollitia. Sunt modi\n    libero error possimus illo asperiores eum. Aspernatur voluptatem incidunt\n    officiis eos pariatur? Architecto!</p>\n    <p>Elit harum mollitia amet quod facilis! Repudiandae deserunt labore sint\n    officiis assumenda consequuntur sunt accusantium tempora. Officia\n    repellendus corrupti qui impedit ea minus quam magni. Praesentium\n    doloremque veniam delectus officiis.</p>\n    <p>Amet ut ullam ea magnam omnis quidem repellat facilis soluta. Deserunt\n    praesentium eius magnam sapiente beatae quae exercitationem dolores\n    reprehenderit iste facere commodi. Enim ipsa labore laborum adipisci illo\n    sapiente.</p>\n  </div>\n\n  <div id=\"footer\">\n    <p>Is in viewport? <span id=\"is-in-viewport\"></span> /\n    Is Fully in viewport? <span id=\"is-fully-in-viewport\"></span> /\n    Last event: <span id=\"last-event\"></span></p>\n  </div>\n  <script src=\"//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js\"></script>\n  <script src=\"../dist/scroll-up-bar.min.js\"></script>\n  <script>\n    // Update footer with current viewport state.\n    function updateFooter() {\n      $('#is-in-viewport').text($.scrollupbar.isInViewport ? 'yes' : 'no');\n      $('#is-fully-in-viewport').text($.scrollupbar.isFullyInViewport ? 'yes' : 'no');\n    }\n\n    $('#topbar').scrollupbar({\n      enterViewport: function() {\n        updateFooter();\n        $('#last-event').text('enterViewport');\n      },\n      fullyEnterViewport: function() {\n        updateFooter();\n        $('#last-event').text('fullyEnterViewport');\n      },\n      exitViewport: function() {\n        updateFooter();\n        $('#last-event').text('exitViewport');\n      },\n      partiallyExitViewport: function() {\n        updateFooter();\n        $('#last-event').text('partiallyExitViewport');\n      }\n    });\n\n    updateFooter();\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "example/offset.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Scroll up bar</title>\n  <style>\n    html,\n    body {\n      margin: 0;\n      padding: 0;\n    }\n\n    body {\n      font-family: Arial;\n      font-size: 28px;\n      line-height: 1.6;\n    }\n\n    #header {\n      height: 80px;\n      background: #ddd;\n      text-align: center;\n      padding-top: 20px;\n    }\n\n    #topbar {\n      box-sizing: border-box;\n      position: absolute;\n      top: 100px;\n      left: 0;\n      z-index: 1;\n      width: 100%;\n      padding: 10px;\n      text-align: center;\n      background: rgba(0, 0, 0, 0.8);\n      color: #fff;\n    }\n\n    #document {\n      max-width: 900px;\n      margin: 0 auto;\n      padding-top: 56px;\n    }\n  </style>\n</head>\n<body>\n  <div id=\"header\">\n    Header\n  </div>\n  <div id=\"topbar\">Top bar with offset top</div>\n  <div id=\"document\">\n    <h1>ScrollUpBar plugin example</h1>\n    <p>The scroll up bar plugin hides the top bar when scrolling down, and show\n    it when scrolling up.</p>\n    <p>Usage instructions available on\n    <a href=\"https://github.com/eduardomb/scroll-up-bar\">GitHub</a>. <b>Stop\n    reading now and scroll</b>.</p>\n    <p>Adipisicing harum quam consequatur deserunt minima. Eligendi quos iure\n    voluptatem corrupti amet ipsa a excepturi ratione sit ex est. Ducimus\n    perspiciatis sunt iusto architecto hic possimus tempore harum quasi\n    expedita!</p>\n    <p>Sit iste rerum fugit aliquid vero? In aut quos earum asperiores facilis\n    iste eius. Soluta voluptatum repudiandae dignissimos eius iste mollitia eos\n    veritatis magni commodi. Vero nulla vel error eius?</p>\n    <p>Dolor ab nesciunt deserunt quibusdam quaerat culpa dolor perspiciatis\n    laboriosam consequatur sed? Eligendi praesentium odit itaque assumenda rem\n    maxime ipsum quos pariatur deserunt commodi odio odit?  Quaerat minus illo\n    culpa.</p>\n    <p>Ipsum deleniti natus id assumenda dolore itaque ipsum. Eum nobis\n    necessitatibus eius unde modi. Inventore accusamus vero deleniti aspernatur\n    totam. Nam magni nostrum nesciunt consequatur delectus molestias eveniet\n    velit eveniet.</p>\n    <p>Adipisicing debitis amet repudiandae blanditiis consequatur libero.\n    Mollitia accusamus minima quam ad saepe minus! Et eum aliquam possimus iure\n    iste eveniet ex?  Consequatur repellendus ex architecto voluptate sapiente,\n    molestiae quam.</p>\n    <p>Consectetur numquam debitis commodi minima doloremque voluptas minima\n    sapiente obcaecati veritatis quia corrupti officia mollitia. Sunt modi\n    libero error possimus illo asperiores eum. Aspernatur voluptatem incidunt\n    officiis eos pariatur? Architecto!</p>\n    <p>Elit harum mollitia amet quod facilis! Repudiandae deserunt labore sint\n    officiis assumenda consequuntur sunt accusantium tempora. Officia\n    repellendus corrupti qui impedit ea minus quam magni. Praesentium\n    doloremque veniam delectus officiis.</p>\n    <p>Amet ut ullam ea magnam omnis quidem repellat facilis soluta. Deserunt\n    praesentium eius magnam sapiente beatae quae exercitationem dolores\n    reprehenderit iste facere commodi. Enim ipsa labore laborum adipisci illo\n    sapiente.</p>\n  </div>\n  <script src=\"//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js\"></script>\n  <script src=\"../dist/scroll-up-bar.min.js\"></script>\n  <script>\n    $('#topbar').scrollupbar();\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "example/simple.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Scroll up bar</title>\n  <style>\n    body {\n      font-family: Arial;\n      font-size: 28px;\n      line-height: 1.6;\n    }\n\n    #topbar {\n      box-sizing: border-box;\n      position: absolute;\n      top: 0;\n      left: 0;\n      z-index: 1;\n      width: 100%;\n      padding: 10px;\n      text-align: center;\n      background: rgba(0, 0, 0, 0.8);\n      color: #fff;\n    }\n\n    #document {\n      max-width: 900px;\n      margin: 0 auto;\n      padding-top: 56px;\n    }\n  </style>\n</head>\n<body>\n  <div id=\"topbar\">Top bar</div>\n  <div id=\"document\">\n    <h1>ScrollUpBar plugin example</h1>\n    <p>The scroll up bar plugin hides the top bar when scrolling down, and show\n    it when scrolling up.</p>\n    <p>Usage instructions available on\n    <a href=\"https://github.com/eduardomb/scroll-up-bar\">GitHub</a>. <b>Stop\n    reading now and scroll</b>.</p>\n    <p>Adipisicing harum quam consequatur deserunt minima. Eligendi quos iure\n    voluptatem corrupti amet ipsa a excepturi ratione sit ex est. Ducimus\n    perspiciatis sunt iusto architecto hic possimus tempore harum quasi\n    expedita!</p>\n    <p>Sit iste rerum fugit aliquid vero? In aut quos earum asperiores facilis\n    iste eius. Soluta voluptatum repudiandae dignissimos eius iste mollitia eos\n    veritatis magni commodi. Vero nulla vel error eius?</p>\n    <p>Dolor ab nesciunt deserunt quibusdam quaerat culpa dolor perspiciatis\n    laboriosam consequatur sed? Eligendi praesentium odit itaque assumenda rem\n    maxime ipsum quos pariatur deserunt commodi odio odit?  Quaerat minus illo\n    culpa.</p>\n    <p>Ipsum deleniti natus id assumenda dolore itaque ipsum. Eum nobis\n    necessitatibus eius unde modi. Inventore accusamus vero deleniti aspernatur\n    totam. Nam magni nostrum nesciunt consequatur delectus molestias eveniet\n    velit eveniet.</p>\n    <p>Adipisicing debitis amet repudiandae blanditiis consequatur libero.\n    Mollitia accusamus minima quam ad saepe minus! Et eum aliquam possimus iure\n    iste eveniet ex?  Consequatur repellendus ex architecto voluptate sapiente,\n    molestiae quam.</p>\n    <p>Consectetur numquam debitis commodi minima doloremque voluptas minima\n    sapiente obcaecati veritatis quia corrupti officia mollitia. Sunt modi\n    libero error possimus illo asperiores eum. Aspernatur voluptatem incidunt\n    officiis eos pariatur? Architecto!</p>\n    <p>Elit harum mollitia amet quod facilis! Repudiandae deserunt labore sint\n    officiis assumenda consequuntur sunt accusantium tempora. Officia\n    repellendus corrupti qui impedit ea minus quam magni. Praesentium\n    doloremque veniam delectus officiis.</p>\n    <p>Amet ut ullam ea magnam omnis quidem repellat facilis soluta. Deserunt\n    praesentium eius magnam sapiente beatae quae exercitationem dolores\n    reprehenderit iste facere commodi. Enim ipsa labore laborum adipisci illo\n    sapiente.</p>\n  </div>\n  <script src=\"//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js\"></script>\n  <script src=\"../dist/scroll-up-bar.min.js\"></script>\n  <script>\n    $('#topbar').scrollupbar();\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "karma.conf.js",
    "content": "// Karma configuration\n// Generated on Sat Jun 21 2014 16:23:42 GMT-0300 (BRT)\n\nmodule.exports = function(config) {\n  'use strict';\n\n  config.set({\n    // base path that will be used to resolve all patterns (eg. files, exclude)\n    basePath: '',\n\n    // frameworks to use\n    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter\n    frameworks: ['jasmine'],\n\n    // list of files / patterns to load in the browser\n    files: [\n      'bower_components/jquery/dist/jquery.min.js',\n      'bower_components/jasmine-jquery/lib/jasmine-jquery.js',\n      'src/*.js',\n      'test/fixtures/**/*.html',\n      'test/fixtures/**/*.css',\n      'test/**/*Spec.js'\n    ],\n\n    // list of files to exclude\n    exclude: [],\n\n    // preprocess matching files before serving them to the browser. Available\n    // preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor\n    preprocessors: {},\n\n    // test results reporter to use\n    // possible values: 'dots', 'progress'\n    // available reporters: https://npmjs.org/browse/keyword/karma-reporter\n    reporters: ['progress'],\n\n    // web server port\n    port: 9876,\n\n    // enable / disable colors in the output (reporters and logs)\n    colors: true,\n\n    // level of logging\n    // possible values: config.LOG_DISABLE || config.LOG_ERROR ||\n    // config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG\n    logLevel: config.LOG_INFO,\n\n    // enable / disable watching file and executing tests whenever any file\n    // changes\n    autoWatch: true,\n\n    // start these browsers. Available browser launchers:\n    // https://npmjs.org/browse/keyword/karma-launcher\n    browsers: ['Chrome', 'Firefox', 'Safari', 'Opera'],\n\n\n    // Continuous Integration mode\n    // if true, Karma captures browsers, runs the tests and exits\n    singleRun: false\n  });\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"scroll-up-bar\",\n  \"version\": \"0.3.0\",\n  \"description\": \"The scroll up bar plugin (jQuery) hides the top bar when scrolling down, and show it when scrolling up.\",\n  \"main\": \"src/scroll-up-bar.js\",\n  \"scripts\": {\n    \"test\": \"grunt test\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/eduardomb/scroll-up-bar.git\"\n  },\n  \"keywords\": [\n    \"scroll\",\n    \"up\",\n    \"bar\",\n    \"jquery\"\n  ],\n  \"author\": \"Eduardo Martins Barbosa\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/eduardomb/scroll-up-bar/issues\"\n  },\n  \"homepage\": \"https://github.com/eduardomb/scroll-up-bar\",\n  \"devDependencies\": {\n    \"karma\": \"^0.12.16\",\n    \"karma-chrome-launcher\": \"^0.1.4\",\n    \"karma-jasmine\": \"^0.2.2\",\n    \"karma-firefox-launcher\": \"^0.1.3\",\n    \"karma-safari-launcher\": \"^0.1.1\",\n    \"karma-opera-launcher\": \"^0.1.0\",\n    \"karma-ie-launcher\": \"^0.1.5\",\n    \"grunt\": \"^0.4.5\",\n    \"grunt-contrib-uglify\": \"^0.5.0\",\n    \"grunt-contrib-jshint\": \"^0.10.0\",\n    \"grunt-contrib-watch\": \"^0.6.1\",\n    \"grunt-contrib-concat\": \"^0.4.0\",\n    \"grunt-karma\": \"^0.8.3\"\n  },\n  \"dependencies\": {\n    \"bower\": \"^1.3.5\"\n  }\n}\n"
  },
  {
    "path": "scripts/release.sh",
    "content": "# Update version on package.json\n# Update version on bower.json\n# Update version on scroll-up-bar.jquery.json\n# Update changelog\n# Add IE to karma.conf.js browsers\n# Open karma test address in iPhone and Android\n# Build (Can't run before updating package.json to update dist files header comment)\n# Remove IE from karma.conf.js browsers\n# Commit 'Release x.x.x'\n# Add tag 'x.x.x'\n# Update branch gh-pages\n# push with tag\n"
  },
  {
    "path": "scroll-up-bar.jquery.json",
    "content": "{\n    \"name\": \"scroll-up-bar\",\n    \"version\": \"0.3.0\",\n    \"title\": \"Scroll up bar\",\n    \"author\": {\n        \"name\": \"Eduardo Martins Barbosa\",\n        \"email\": \"eduardomb@ufmg.br\"\n    },\n    \"licenses\": [{\n        \"type\": \"MIT\",\n        \"url\": \"http://opensource.org/licenses/MIT\"\n    }],\n    \"dependencies\": {\n      \"jquery\": \"~2.1.1\"\n    },\n    \"description\": \"The scroll up bar plugin (jQuery) hides the top bar when scrolling down, and show it when scrolling up.\",\n    \"keywords\": [\n      \"scroll\",\n      \"up\",\n      \"bar\",\n      \"jquery\"\n    ],\n    \"demo\": \"http://eduardomb.github.io/scroll-up-bar/\"\n}\n"
  },
  {
    "path": "src/scroll-up-bar.js",
    "content": "(function($) {\n  'use strict';\n\n  var _destroyFn;\n\n  $.scrollupbar = function($bar, options) {\n    // Default options\n    options = $.extend({\n      enterViewport: $.noop,\n      fullyEnterViewport: $.noop,\n      exitViewport: $.noop,\n      partiallyExitViewport: $.noop\n    }, options);\n\n    function isFullyInViewport() {\n      return $window.scrollTop() <= $bar.offset().top;\n    }\n\n    function isInViewport() {\n      return $window.scrollTop() < $bar.offset().top + $bar.outerHeight();\n    }\n\n    var $window = $(window),\n        $document = $(document),\n        minY = $bar.css('position') == 'fixed' ? 0 : $bar.offset().top,\n        lastY = $window.scrollTop(), // Use last Y to detect scroll direction.\n        initialPosTop = $bar.position().top,\n        timeout;\n\n    $.scrollupbar.isInViewport = isInViewport();\n    $.scrollupbar.isFullyInViewport = isFullyInViewport();\n\n    $window.on('scroll.scrollupbar', function() {\n      var y = $window.scrollTop(),\n          barHeight = $bar.outerHeight();\n\n      // Ignore elastic scrolling.\n      if (y < 0 || y > ($document.height() - $window.height())) {\n        return;\n      }\n\n      // Cancel the event fired by the previous scroll.\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n\n      if (y < lastY) { // Scrolling up\n        // If the bar is hidden, place it right above the top frame.\n        if (!$.scrollupbar.isInViewport && lastY - barHeight >= minY) {\n          $bar.css('top', lastY - barHeight);\n          $.scrollupbar.isInViewport = true;\n          options.enterViewport();\n        }\n\n        // Scrolls up bigger than the bar's height fixes the bar on top.\n        if (isFullyInViewport()) {\n          if (y >= minY) {\n            $bar.css({\n              'position': 'fixed',\n              'top': 0\n            });\n          } else {\n            $bar.css({\n              'position': 'absolute',\n              'top': initialPosTop\n            });\n          }\n\n          if (!$.scrollupbar.isFullyInViewport) {\n            $.scrollupbar.isFullyInViewport = true;\n            options.fullyEnterViewport();\n          }\n        }\n\n        // Fire an event to reveal the entire bar after 400ms if the scroll\n        // wasn't big enough.\n        timeout = setTimeout(function() {\n          if (!$.scrollupbar.isFullyInViewport) {\n            $bar.css({\n              'position': 'fixed',\n              'top': $bar.offset().top - y\n            });\n\n            $bar.animate({'top': 0}, 100, function() {\n              $.scrollupbar.isFullyInViewport = true;\n              options.fullyEnterViewport();\n            });\n          }\n        }, 400);\n      } else if (y > lastY) { // Scrolling down\n        // Unfix the bar allowing it to scroll with the page.\n        if ($.scrollupbar.isFullyInViewport) {\n          $bar.css({\n            // translate3d fixes iOS invisible element bug when changing\n            // position values while scrolling.\n            'transform': 'translate3d(0, 0, 0)',\n            'position': 'absolute',\n            'top': lastY > minY ? lastY : initialPosTop\n          });\n\n          if (!isFullyInViewport()) {\n            $.scrollupbar.isFullyInViewport = false;\n            options.partiallyExitViewport();\n          }\n        }\n\n        if ($.scrollupbar.isInViewport && !isInViewport()) {\n          $.scrollupbar.isInViewport = false;\n          options.exitViewport();\n        }\n\n        // Fire an event to hide the entire bar after 400ms if the scroll\n        // wasn't big enough.\n        timeout = setTimeout(function() {\n          if (isInViewport() && y - barHeight >= minY) {\n            $bar.animate({'top': y - barHeight}, 100, function() {\n              $.scrollupbar.isInViewport = false;\n              options.exitViewport();\n            });\n          }\n        }, 400);\n      }\n\n      lastY = y;\n    });\n\n    _destroyFn = function() {\n      // Unbind all listeners added by scrollupbar plugin\n      $window.off('.scrollupbar');\n\n      // Restore original bar position.\n      $bar.css({\n        'position': 'absolute',\n        'top': initialPosTop\n      });\n    };\n\n    return $bar;\n  };\n\n  $.scrollupbar.destroy = function() {\n    if (_destroyFn) {\n      return _destroyFn();\n    }\n  };\n\n  $.fn.scrollupbar = function(options) {\n    return $.scrollupbar(this, options);\n  };\n})(jQuery);\n"
  },
  {
    "path": "test/basicSpec.js",
    "content": "jasmine.getFixtures().fixturesPath = 'base/test/fixtures';\njasmine.getStyleFixtures().fixturesPath = 'base/test/fixtures';\n\ndescribe('Scrolling', function() {\n  'use strict';\n  // Returns page Y offset. Don't use window.scrollY or tests will crash on IE.\n  var pageY = function() {\n    return $(window).scrollTop();\n  };\n\n  // Perform the scroll up and fire the scroll event.\n  var scrollUp = function(px) {\n    window.scrollTo(0, pageY() - px);\n    $('html').trigger('scroll');\n  };\n\n  // Perform the scroll down and fire the scroll event.\n  var scrollDown = function(px) {\n    window.scrollTo(0, pageY() + px);\n    $('html').trigger('scroll');\n  };\n\n  beforeEach(function() {\n    loadFixtures('topbar.html');\n    loadStyleFixtures('styles.css');\n\n    // Disable animations.\n    jQuery.fx.off = true;\n\n    // Destroy plugin instances from previous tests.\n    $.scrollupbar.destroy();\n\n    // Reset scroll before each test.\n    window.scrollTo(0, 0);\n  });\n\n  it('scroll down should not affect bar before offset is reached', function() {\n    var $topbar = $('#topbar');\n\n    // Install the Jasmine Clock to mock setTimeout.\n    jasmine.clock().install();\n\n    // Invoke scroll-up-bar plugin on topbar.\n    $topbar.scrollupbar();\n\n    scrollDown(50);\n\n    // Expect the bar to be on its original position.\n    expect($topbar.offset().top).toBe(100);\n\n    // Wait 401ms, when the complete hiding will be triggered.\n    jasmine.clock().tick(401);\n\n    // Expect the bar to still be on its original position\n    expect($topbar.offset().top).toBe(100);\n\n    // Uninstall Jasmine Clock.\n    jasmine.clock().uninstall();\n  });\n\n  it('scroll up should not affect bar before offset is reached', function() {\n    var $topbar = $('#topbar');\n\n    // Install the Jasmine Clock to mock setTimeout.\n    jasmine.clock().install();\n\n    // Invoke scroll-up-bar plugin on topbar.\n    $topbar.scrollupbar();\n\n    scrollDown(120);\n\n    scrollUp(50);\n\n    // Expect the bar to be on its original position.\n    expect($topbar.offset().top).toBe(100);\n\n    // Wait 401ms, when the complete hiding will be triggered.\n    jasmine.clock().tick(401);\n\n    // Expect the bar to still be on its original position\n    expect($topbar.offset().top).toBe(100);\n\n    // Uninstall Jasmine Clock.\n    jasmine.clock().uninstall();\n  });\n\n  it('should hide the bar on scroll down', function() {\n    var $topbar = $('#topbar'),\n        topbarHeight = $topbar.outerHeight();\n\n    $topbar.scrollupbar();\n\n    // Scroll down 'till bar offset.\n    scrollDown(100);\n\n    scrollDown(topbarHeight);\n\n    // Expect the bar not to be visible.\n    expect($topbar.offset().top + topbarHeight <= pageY()).toBeTruthy();\n  });\n\n  it('should show the bar on scroll up', function() {\n    var $topbar = $('#topbar'),\n        topbarHeight = $topbar.outerHeight();\n\n    $topbar.scrollupbar();\n\n    // Scroll down 'till bar offset.\n    scrollDown(100);\n\n    // In order to scroll up, we need to scroll down first.\n    scrollDown(2 * topbarHeight);\n    scrollUp(topbarHeight);\n\n    // Expect the bar to be visible.\n    expect($topbar.offset().top).toBe(pageY());\n  });\n\n  it('should finish showing the bar after a tiny scroll up', function() {\n    var $topbar = $('#topbar'),\n        topbarHeight = $topbar.outerHeight();\n\n    // Install the Jasmine Clock to mock setTimeout.\n    jasmine.clock().install();\n\n    $topbar.scrollupbar();\n\n    // Scroll down 'till bar offset.\n    scrollDown(100);\n\n    // In order to scroll up, we need to scroll down first.\n    scrollDown(2 * topbarHeight);\n    scrollUp(0.5 * topbarHeight);\n\n    // Expect the bar to be partially visible.\n    expect($topbar.offset().top).toBe(pageY() - 0.5 * topbarHeight);\n\n    // Wait 401ms, when the complete showing will be triggered.\n    jasmine.clock().tick(401);\n\n    // Expect the bar to be fully visible.\n    expect($topbar.offset().top).toBe(pageY());\n\n    // Uninstall Jasmine Clock.\n    jasmine.clock().uninstall();\n  });\n\n  it('should finish hiding the bar after a tiny scroll down', function() {\n    var $topbar = $('#topbar'),\n        topbarHeight = $topbar.outerHeight();\n\n    // Install the Jasmine Clock to mock setTimeout.\n    jasmine.clock().install();\n\n    $topbar.scrollupbar();\n\n    // Scroll down 'till bar offset.\n    scrollDown(100);\n\n    // Scroll away from page top, then scroll up to reveal the bar and finally\n    // do a tiny scroll down.\n    scrollDown(2 * topbarHeight);\n    scrollUp(topbarHeight);\n    scrollDown(0.5 * topbarHeight);\n\n    // Expect the bar to be partially visible.\n    expect($topbar.offset().top).toBe(pageY() - 0.5 * topbarHeight);\n\n    // Wait 401ms, when the complete hiding will be triggered.\n    jasmine.clock().tick(401);\n\n    // Expect the bar not to be visible.\n    expect($topbar.offset().top + topbarHeight <= pageY()).toBeTruthy();\n\n    // Uninstall Jasmine Clock.\n    jasmine.clock().uninstall();\n  });\n\n  it('should not finish hiding the bar if it is near page top', function() {\n    var $topbar = $('#topbar'),\n        topbarHeight = $topbar.outerHeight();\n\n    // Install the Jasmine Clock to mock setTimeout.\n    jasmine.clock().install();\n\n    // Invoke scroll-up-bar plugin on topbar.\n    $topbar.scrollupbar();\n\n    // Scroll down 'till bar offset.\n    scrollDown(100);\n\n    scrollDown(0.5 * topbarHeight);\n\n    // Expect the bar to be partially visible.\n    expect($topbar.offset().top).toBe(pageY() - 0.5 * topbarHeight);\n\n    // Wait 401ms, when the complete hiding might be triggered.\n    jasmine.clock().tick(401);\n\n    // Expect the bar to still be partially visible.\n    expect($topbar.offset().top).toBe(pageY() - 0.5 * topbarHeight);\n\n    // Uninstall Jasmine Clock.\n    jasmine.clock().uninstall();\n  });\n});\n"
  },
  {
    "path": "test/callbackSpec.js",
    "content": "jasmine.getFixtures().fixturesPath = 'base/test/fixtures';\njasmine.getStyleFixtures().fixturesPath = 'base/test/fixtures';\n\ndescribe('Callbacks', function() {\n  'use strict';\n\n  // Returns page Y offset. Don't use window.scrollY or tests will crash on IE.\n  var pageY = function() {\n    return $(window).scrollTop();\n  };\n\n  // Perform the scroll up and fire the scroll event.\n  var scrollUp = function(px) {\n    window.scrollTo(0, pageY() - px);\n    $('html').trigger('scroll');\n  };\n\n  // Perform the scroll down and fire the scroll event.\n  var scrollDown = function(px) {\n    window.scrollTo(0, pageY() + px);\n    $('html').trigger('scroll');\n  };\n\n  beforeEach(function() {\n    loadFixtures('topbar.html');\n    loadStyleFixtures('styles.css');\n\n    // Disable animations.\n    jQuery.fx.off = true;\n\n    // Destroy plugin instances from previous tests.\n    $.scrollupbar.destroy();\n\n    // Reset scroll before each test.\n    window.scrollTo(0, 0);\n  });\n\n  it('should trigger enterViewport', function() {\n    var $topbar = $('#topbar'),\n        barHeight = $topbar.outerHeight(),\n        callback = jasmine.createSpy('callback');\n\n    // Invoke scroll-up-bar plugin on topbar.\n    $topbar.scrollupbar({enterViewport: callback});\n\n    // Scroll down enough to hide bar\n    scrollDown($topbar.offset().top + barHeight);\n\n    // Scroll up to make bar enter viewport\n    scrollUp(1);\n\n    // Expect the callback to have been called\n    expect(callback).toHaveBeenCalled();\n  });\n\n  it('should trigger fullyEnterViewport', function() {\n    var $topbar = $('#topbar'),\n        barHeight = $topbar.outerHeight(),\n        callback = jasmine.createSpy('callback');\n\n    // Invoke scroll-up-bar plugin on topbar.\n    $topbar.scrollupbar({fullyEnterViewport: callback});\n\n    // Scroll down enough to hide bar\n    scrollDown($topbar.offset().top + barHeight);\n\n    // Scroll up to make bar fully enter viewport\n    scrollUp(barHeight);\n\n    // Expect the callback to have been called\n    expect(callback).toHaveBeenCalled();\n  });\n\n  it('should trigger exitViewport', function() {\n    var $topbar = $('#topbar'),\n        barHeight = $topbar.outerHeight(),\n        callback = jasmine.createSpy('callback');\n\n    // Invoke scroll-up-bar plugin on topbar.\n    $topbar.scrollupbar({exitViewport: callback});\n\n    // Scroll down enough to hide bar\n    scrollDown($topbar.offset().top + barHeight);\n\n    // Expect the callback to have been called\n    expect(callback).toHaveBeenCalled();\n  });\n\n  it('should trigger partiallyExitViewport', function() {\n    var $topbar = $('#topbar'),\n        callback = jasmine.createSpy('callback');\n\n    // Invoke scroll-up-bar plugin on topbar.\n    $topbar.scrollupbar({partiallyExitViewport: callback});\n\n    // Scroll down enought to start hiding the bar.\n    scrollDown($topbar.offset().top + 1);\n\n    // Expect the callback to have been called\n    expect(callback).toHaveBeenCalled();\n  });\n});\n"
  },
  {
    "path": "test/fixtures/styles.css",
    "content": "#topbar,\n#document {\n  font-family: Arial;\n  font-size: 28px;\n  line-height: 1.6;\n}\n\n#topbar {\n  box-sizing: border-box;\n  position: absolute;\n  top: 100px;\n  left: 0;\n  z-index: 1;\n  width: 100%;\n  height: 64px;\n  padding: 10px;\n  text-align: center;\n  background: rgba(0, 0, 0, 0.8);\n  color: #fff;\n}\n\n#document {\n  max-width: 900px;\n  margin: 0 auto;\n  padding-top: 56px;\n}\n"
  },
  {
    "path": "test/fixtures/topbar.html",
    "content": "<div id=\"topbar\">Top bar</div>\n<div id=\"document\">\n  <h1>ScrollUpBar plugin example</h1>\n  <p>Adipisicing harum quam consequatur deserunt minima. Eligendi quos iure\n  voluptatem corrupti amet ipsa a excepturi ratione sit ex est. Ducimus\n  perspiciatis sunt iusto architecto hic possimus tempore harum quasi\n  expedita!</p>\n  <p>Sit iste rerum fugit aliquid vero? In aut quos earum asperiores facilis\n  iste eius. Soluta voluptatum repudiandae dignissimos eius iste mollitia eos\n  veritatis magni commodi. Vero nulla vel error eius?</p>\n  <p>Dolor ab nesciunt deserunt quibusdam quaerat culpa dolor perspiciatis\n  laboriosam consequatur sed? Eligendi praesentium odit itaque assumenda rem\n  maxime ipsum quos pariatur deserunt commodi odio odit?  Quaerat minus illo\n  culpa.</p>\n  <p>Ipsum deleniti natus id assumenda dolore itaque ipsum. Eum nobis\n  necessitatibus eius unde modi. Inventore accusamus vero deleniti aspernatur\n  totam. Nam magni nostrum nesciunt consequatur delectus molestias eveniet\n  velit eveniet.</p>\n  <p>Adipisicing debitis amet repudiandae blanditiis consequatur libero.\n  Mollitia accusamus minima quam ad saepe minus! Et eum aliquam possimus iure\n  iste eveniet ex?  Consequatur repellendus ex architecto voluptate sapiente,\n  molestiae quam.</p>\n  <p>Consectetur numquam debitis commodi minima doloremque voluptas minima\n  sapiente obcaecati veritatis quia corrupti officia mollitia. Sunt modi\n  libero error possimus illo asperiores eum. Aspernatur voluptatem incidunt\n  officiis eos pariatur? Architecto!</p>\n  <p>Sit iste rerum fugit aliquid vero? In aut quos earum asperiores facilis\n  iste eius. Soluta voluptatum repudiandae dignissimos eius iste mollitia eos\n  veritatis magni commodi. Vero nulla vel error eius?</p>\n  <p>Elit harum mollitia amet quod facilis! Repudiandae deserunt labore sint\n  officiis assumenda consequuntur sunt accusantium tempora. Officia\n  repellendus corrupti qui impedit ea minus quam magni. Praesentium\n  doloremque veniam delectus officiis.</p>\n  <p>Amet ut ullam ea magnam omnis quidem repellat facilis soluta. Deserunt\n  praesentium eius magnam sapiente beatae quae exercitationem dolores\n  reprehenderit iste facere commodi. Enim ipsa labore laborum adipisci illo\n  sapiente.</p>\n  <p>Sit iste rerum fugit aliquid vero? In aut quos earum asperiores facilis\n  iste eius. Soluta voluptatum repudiandae dignissimos eius iste mollitia eos\n  veritatis magni commodi. Vero nulla vel error eius?</p>\n</div>\n"
  }
]