├── .browserslistrc ├── .prettierrc ├── src ├── shims-vue.d.ts ├── noop.ts ├── demo.ts ├── interfaces │ ├── plugin-options.interface.ts │ └── v-scroll-lock.interface.ts ├── index.html ├── assets │ └── close-icon.svg ├── Demo.vue ├── index.ts ├── components │ └── Modal.vue └── lorem-ipsum.ts ├── .eslintrc.js ├── .gitignore ├── tsconfig.json ├── .travis.yml ├── rollup.config.js ├── webpack.config.js ├── package.json ├── README.md └── LICENSE /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 0.5% 2 | last 2 versions 3 | Firefox ESR 4 | not dead -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true, 4 | "trailingComma": "es5" 5 | } 6 | -------------------------------------------------------------------------------- /src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import Vue from 'vue' 3 | export default Vue 4 | } 5 | -------------------------------------------------------------------------------- /src/noop.ts: -------------------------------------------------------------------------------- 1 | const NOOP = function() {} 2 | 3 | export const enableBodyScroll = NOOP 4 | export const disableBodyScroll = NOOP 5 | -------------------------------------------------------------------------------- /src/demo.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Demo from './Demo.vue' 3 | import VScrollLock from './index' 4 | 5 | Vue.use(VScrollLock) 6 | 7 | new Vue({ 8 | render: h => h(Demo), 9 | }).$mount('#app') 10 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true, 5 | }, 6 | extends: ['plugin:vue/essential', '@vue/prettier', '@vue/typescript'], 7 | rules: { 8 | 'vue/max-attributes-per-line': 'off', 9 | 'vue/html-self-closing': 'off', 10 | }, 11 | parserOptions: { 12 | parser: '@typescript-eslint/parser', 13 | }, 14 | } 15 | -------------------------------------------------------------------------------- /src/interfaces/plugin-options.interface.ts: -------------------------------------------------------------------------------- 1 | import { 2 | disableBodyScroll, 3 | enableBodyScroll, 4 | BodyScrollOptions, 5 | } from 'body-scroll-lock' 6 | 7 | export default interface PluginOptions { 8 | disableBodyScroll?: typeof disableBodyScroll 9 | enableBodyScroll?: typeof enableBodyScroll 10 | bodyScrollOptions?: Partial 11 | } 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | yarn-debug.log* 5 | yarn-error.log* 6 | 7 | # Dependency directories 8 | node_modules/ 9 | 10 | # TypeScript cache 11 | *.tsbuildinfo 12 | 13 | # Optional npm cache directory 14 | .npm 15 | 16 | # Optional eslint cache 17 | .eslintcache 18 | 19 | # Yarn Integrity file 20 | .yarn-integrity 21 | 22 | # Build artifacts 23 | dist 24 | 25 | # OS generated files 26 | .DS_Store 27 | .DS_Store? 28 | ._* 29 | .Spotlight-V100 30 | .Trashes 31 | ehthumbs.db 32 | Thumbs.db 33 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist", 4 | "sourceMap": true, 5 | "strict": true, 6 | "strictPropertyInitialization": false, 7 | "module": "es2015", 8 | "moduleResolution": "node", 9 | "target": "es5", 10 | "esModuleInterop": true, 11 | "experimentalDecorators": true, 12 | "noImplicitAny": true, 13 | "declaration": true, 14 | "types": ["vue", "node"], 15 | "lib": ["es5", "es6", "es7", "dom"] 16 | }, 17 | "exclude": ["node_modules"] 18 | } 19 | -------------------------------------------------------------------------------- /src/interfaces/v-scroll-lock.interface.ts: -------------------------------------------------------------------------------- 1 | import PluginOptions from './plugin-options.interface' 2 | import { PluginFunction, DirectiveFunction } from 'vue' 3 | import { 4 | enableBodyScroll, 5 | disableBodyScroll, 6 | BodyScrollOptions, 7 | } from 'body-scroll-lock' 8 | 9 | export default interface VScrollLock { 10 | enableBodyScroll: typeof enableBodyScroll 11 | disableBodyScroll: typeof disableBodyScroll 12 | install: PluginFunction 13 | inserted: DirectiveFunction 14 | componentUpdated: DirectiveFunction 15 | unbind: DirectiveFunction 16 | bodyScrollOptions?: Partial 17 | } 18 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | v-scroll-lock Demo 8 | 9 | 10 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '10' 4 | script: 5 | - yarn lint 6 | - yarn build 7 | deploy: 8 | - provider: npm 9 | email: $NPM_EMAIL 10 | api_key: $NPM_TOKEN 11 | skip_cleanup: true 12 | on: 13 | branch: master 14 | tags: true 15 | - provider: releases 16 | api_key: $GITHUB_OAUTH_TOKEN 17 | file_glob: true 18 | file: dist/* 19 | skip_cleanup: true 20 | on: 21 | branch: master 22 | tags: true 23 | - provider: pages 24 | skip_cleanup: true 25 | github_token: $GITHUB_PAGES_TOKEN 26 | local_dir: dist 27 | fqdn: v-scroll-lock.peterhegman.com 28 | on: 29 | branch: master 30 | tags: true 31 | -------------------------------------------------------------------------------- /src/assets/close-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/Demo.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | 25 | 47 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import * as path from 'path' 2 | import alias from 'rollup-plugin-alias' 3 | import babel from 'rollup-plugin-babel' 4 | import { terser } from 'rollup-plugin-terser' 5 | import resolve from 'rollup-plugin-node-resolve' 6 | import typescript from 'rollup-plugin-typescript2' 7 | 8 | export default { 9 | input: 'src/index.ts', 10 | output: { 11 | name: 'VShowSlide', 12 | exports: 'named', 13 | }, 14 | plugins: [ 15 | alias({ 16 | resolve: ['.js', '.ts'], 17 | entries: { 18 | 'body-scroll-lock': path.join( 19 | __dirname, 20 | process.env.NO_DEP 21 | ? '/src/noop' 22 | : '/node_modules/body-scroll-lock/lib/bodyScrollLock.es6' 23 | ), 24 | }, 25 | }), 26 | resolve(), 27 | typescript({ clean: true }), 28 | babel({ 29 | presets: ['@babel/preset-env'], 30 | }), 31 | terser(), 32 | ], 33 | } 34 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const VueLoaderPlugin = require('vue-loader/lib/plugin') 3 | const HtmlWebpackPlugin = require('html-webpack-plugin') 4 | 5 | module.exports = { 6 | entry: { 7 | index: path.resolve(__dirname, './src/demo.ts'), 8 | }, 9 | output: { 10 | path: path.resolve(__dirname, './dist'), 11 | filename: 'demo.min.js', 12 | }, 13 | module: { 14 | rules: [ 15 | { 16 | test: /\.vue$/, 17 | loader: 'vue-loader', 18 | }, 19 | { 20 | test: /\.tsx?$/, 21 | loader: 'ts-loader', 22 | exclude: [/node_modules/], 23 | options: { 24 | appendTsSuffixTo: [/\.vue$/], 25 | }, 26 | }, 27 | { 28 | test: /\.scss$/, 29 | use: ['vue-style-loader', 'css-loader', 'sass-loader'], 30 | }, 31 | { 32 | test: /\.(png|jpe?g|gif|svg)$/i, 33 | use: [ 34 | { 35 | loader: 'file-loader', 36 | }, 37 | ], 38 | }, 39 | ], 40 | }, 41 | resolve: { 42 | extensions: ['.ts', '.js', '.vue', '.json'], 43 | alias: { 44 | vue$: 'vue/dist/vue.esm.js', 45 | }, 46 | }, 47 | plugins: [ 48 | new VueLoaderPlugin(), 49 | new HtmlWebpackPlugin({ 50 | template: path.resolve(__dirname, './src/index.html'), 51 | }), 52 | ], 53 | devServer: { 54 | contentBase: path.resolve(__dirname, './dist'), 55 | port: 8080, 56 | hot: true, 57 | }, 58 | } 59 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { VueConstructor } from 'vue' 2 | import { enableBodyScroll, disableBodyScroll } from 'body-scroll-lock' 3 | import VScrollLockInterface from './interfaces/v-scroll-lock.interface' 4 | 5 | declare global { 6 | interface Window { 7 | Vue?: VueConstructor 8 | } 9 | } 10 | 11 | const VScrollLock: VScrollLockInterface = { 12 | enableBodyScroll, 13 | disableBodyScroll, 14 | install(Vue, options) { 15 | if (options) { 16 | const { 17 | enableBodyScroll: enableBodyScrollOption, 18 | disableBodyScroll: disableBodyScrollOption, 19 | bodyScrollOptions, 20 | } = options 21 | 22 | if (enableBodyScrollOption) { 23 | this.enableBodyScroll = enableBodyScrollOption 24 | } 25 | 26 | if (disableBodyScrollOption) { 27 | this.disableBodyScroll = disableBodyScrollOption 28 | } 29 | 30 | if (bodyScrollOptions) { 31 | this.bodyScrollOptions = bodyScrollOptions 32 | } 33 | } 34 | Vue.directive('scroll-lock', { 35 | inserted: this.inserted.bind(this), 36 | componentUpdated: this.componentUpdated.bind(this), 37 | unbind: this.unbind.bind(this), 38 | }) 39 | }, 40 | inserted(el, binding) { 41 | if (binding.value) { 42 | this.disableBodyScroll(el, this.bodyScrollOptions) 43 | } 44 | }, 45 | componentUpdated(el, binding) { 46 | if (binding.value) { 47 | this.disableBodyScroll(el, this.bodyScrollOptions) 48 | } else { 49 | this.enableBodyScroll(el) 50 | } 51 | }, 52 | unbind(el) { 53 | this.enableBodyScroll(el) 54 | }, 55 | } 56 | 57 | // Auto-install when vue is found (eg. in browser via 90 | 91 | 182 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![npm](https://img.shields.io/npm/dw/localeval.svg)](https://www.npmjs.com/package/v-scroll-lock) 2 | [![Build Status](https://travis-ci.org/phegman/v-scroll-lock.svg?branch=master)](https://travis-ci.org/phegman/v-scroll-lock) 3 | 4 | # v-scroll-lock 5 | 6 | A Vue.js directive for body scroll locking (for iOS Mobile and Tablet, Android, desktop Safari/Chrome/Firefox) without breaking scrolling of a target element (eg. modal/lightbox/flyouts/nav-menus). Built on top of [https://github.com/willmcpo/body-scroll-lock](https://github.com/willmcpo/body-scroll-lock) 7 | 8 | ## Table of Contents 9 | 10 | - [Overview](#overview) 11 | - [Demo](#demo) 12 | - [Installation](#installation) 13 | - [Usage](#usage) 14 | - [Support](#support) 15 | - [Contributing](#contributing) 16 | 17 | ## Overview 18 | 19 | Preventing the body from scrolling when you have a modal/lightbox/flyout/nav-menu open on all devices can be a huge pain. This package wraps [https://github.com/willmcpo/body-scroll-lock](https://github.com/willmcpo/body-scroll-lock) into an easy to use Vue.js directive. 20 | 21 | ## Demo 22 | 23 | Demo can be viewed here: [http://v-scroll-lock.peterhegman.com/](https://v-scroll-lock.peterhegman.com/) 24 | Source code for demo can be viewed in `src/Demo.vue` 25 | 26 | ## Installation 27 | 28 | ### Module Bundler (Webpack, Rollup, etc) 29 | 30 | #### Yarn 31 | 32 | ```bash 33 | yarn add v-scroll-lock 34 | ``` 35 | 36 | #### NPM 37 | 38 | ```bash 39 | npm install v-scroll-lock --save 40 | ``` 41 | 42 | #### Install the Directive 43 | 44 | ```js 45 | import VScrollLock from 'v-scroll-lock' 46 | 47 | Vue.use(VScrollLock) 48 | ``` 49 | 50 | ### [Vue CDN](https://vuejs.org/v2/guide/#Getting-Started) 51 | 52 | Download latest `v-scroll-lock.min.js` from [https://github.com/phegman/v-scroll-lock/releases](https://github.com/phegman/v-scroll-lock/releases) 53 | 54 | Include using a ` 58 | ``` 59 | 60 | ## Usage 61 | 62 | Once the plugin is installed the `v-scroll-lock` directive can be used in any of your components. When the value of the directive is `true` scrolling will be locked on all elements **except** the element the directive is bound to. 63 | 64 | Here is an example of how you may implement it in a basic modal. Please note the below example is to demonstrate usage of the `v-scroll-lock` directive and is not a complete implementation of a modal. See `src/components/Modal.vue` for a more in depth example. 65 | 66 | ```vue 67 | 75 | 76 | 94 | ``` 95 | 96 | ### [body-scroll-lock](https://github.com/willmcpo/body-scroll-lock#options) options 97 | 98 | Options can be passed when installing the directive: 99 | 100 | ```js 101 | import VScrollLock from 'v-scroll-lock' 102 | 103 | Vue.use(VScrollLock, { 104 | bodyScrollOptions: { 105 | reserveScrollBarGap: true, 106 | }, 107 | }) 108 | ``` 109 | 110 | See [https://github.com/willmcpo/body-scroll-lock#options](https://github.com/willmcpo/body-scroll-lock#options) for full list of options. 111 | 112 | ### Providing Your Own Version of [body-scroll-lock](https://github.com/willmcpo/body-scroll-lock) 113 | 114 | To make using this directive easier [body-scroll-lock](https://github.com/willmcpo/body-scroll-lock) is included in the package. In the case that you would like to use a version different than the packaged version this can be specified in the plugin options. Also note that `v-scroll-lock-no-dep.esm.js` should be imported to prevent duplicate code in your bundle. See example below: 115 | 116 | ```js 117 | import VScrollLock from 'v-scroll-lock/dist/v-scroll-lock-no-dep.esm' 118 | import { enableBodyScroll, disableBodyScroll } from 'body-scroll-lock' 119 | 120 | Vue.use(VScrollLock, { 121 | enableBodyScroll, 122 | disableBodyScroll, 123 | }) 124 | ``` 125 | 126 | ## Support 127 | 128 | Please [open an issue](https://github.com/phegman/v-scroll-lock/issues/new/) for support. 129 | 130 | ## Contributing 131 | 132 | Please contribute using [Github Flow](https://guides.github.com/introduction/flow/). Create a branch, add commits, and [open a pull request](https://github.com/phegman/v-scroll-lock/compare). 133 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2020 Peter Hegman 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /src/lorem-ipsum.ts: -------------------------------------------------------------------------------- 1 | const loremIpsum: string = 2 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras blandit mattis dui quis mollis. Suspendisse posuere justo at fermentum commodo. Duis sed vulputate ex. Pellentesque tortor odio, pretium id tortor id, sagittis efficitur orci. Maecenas nulla odio, laoreet sed mi sit amet, auctor dictum felis. Fusce condimentum aliquam erat. Pellentesque quis ultricies ligula, nec congue tellus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque ac erat convallis, dapibus tellus sed, eleifend ipsum. Donec porta ligula id risus laoreet, at tempus neque consectetur. Aliquam malesuada pharetra nisi sed hendrerit. Integer molestie turpis a fringilla molestie. Nulla vehicula mattis mi. Morbi ut pretium libero. Curabitur rutrum aliquam nulla quis luctus. Curabitur porta felis vel ex maximus condimentum. Nunc tristique congue tempor. Fusce quis quam interdum, eleifend mi at, congue diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam vitae tellus tempor, pellentesque ante vitae, aliquam felis. Phasellus arcu arcu, vestibulum ut vulputate facilisis, tristique at sapien. Nunc pharetra vulputate nisl, nec vestibulum mi commodo vitae. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed quam diam, mollis a odio quis, pretium pretium sapien. Integer ac leo sagittis, eleifend ex quis, semper sem. Etiam sed euismod ex, at mollis elit. Aliquam luctus, mauris id sollicitudin pharetra, mi eros aliquam nibh, sit amet bibendum ipsum mi nec sapien. Vestibulum sit amet enim eget velit hendrerit vestibulum. Vestibulum tempor imperdiet interdum. Aliquam tempus, ex feugiat finibus convallis, urna ex bibendum sapien, vel euismod turpis sapien ut tellus. Etiam a velit hendrerit tellus auctor ultrices ut facilisis elit. Proin varius feugiat tempus. Sed consectetur convallis velit, quis commodo enim lobortis in. Nunc eget ex quam. Duis rhoncus bibendum lacus, non rutrum ex molestie vel. In facilisis condimentum dapibus. Vestibulum ut turpis sed sem blandit tincidunt. Pellentesque vitae fermentum nisi, quis scelerisque orci. Ut iaculis ac neque vitae hendrerit. Aenean commodo erat et consequat dapibus. Integer convallis pellentesque fermentum. Integer sed congue eros, eget tincidunt odio. Pellentesque semper mattis elit, vitae condimentum nisi faucibus in. Sed pharetra leo eget justo scelerisque, ut mollis magna varius. Duis tincidunt eros id mollis scelerisque. Suspendisse eu vulputate massa, sit amet tincidunt sem. Donec id lacinia enim, vitae sollicitudin leo. Sed vitae mauris consequat, interdum massa eu, mollis dui. Ut suscipit semper semper. Praesent tincidunt malesuada metus nec tempus. Etiam ligula est, consequat vel quam ut, sollicitudin sollicitudin justo. Proin lorem sapien, hendrerit sollicitudin dictum vel, suscipit egestas augue. Sed auctor erat nisl, sed viverra elit hendrerit et. Quisque arcu dolor, pretium sit amet quam ac, iaculis dictum quam. Vestibulum porta, orci at ullamcorper imperdiet, ex augue blandit nunc, vitae bibendum massa turpis ut turpis. Morbi et nulla tellus. Proin placerat, diam eu lacinia vestibulum, eros risus varius dui, nec varius mi quam id dui. Quisque sit amet imperdiet dolor, quis feugiat quam. Nunc laoreet scelerisque diam ut tincidunt. Suspendisse potenti. Maecenas finibus diam est, sed placerat lectus elementum non. Phasellus tincidunt mauris lacus, sit amet vestibulum arcu ullamcorper tincidunt. Quisque dui orci, aliquam non est bibendum, rutrum sagittis lectus. Nullam tincidunt eu diam sed dapibus. Praesent interdum vestibulum nisi nec porta. Maecenas ut porttitor diam, a accumsan ligula. Fusce facilisis porta elit ac facilisis. Sed aliquam pretium tortor elementum pellentesque. Proin ut ligula leo. Nunc luctus augue vel purus tempus, et venenatis ligula rhoncus. Donec commodo scelerisque metus, eu rhoncus metus tristique at. Vivamus urna tellus, aliquet sit amet dolor a, pharetra finibus libero. Nulla non diam sit amet risus tempus convallis et sed ligula. Aenean cursus magna vel mauris euismod, et elementum magna placerat. Duis vehicula sagittis sem vestibulum posuere. Donec eu pellentesque ex, et aliquet arcu. Phasellus ac dolor ac sem rutrum pharetra. Suspendisse id justo in est ultrices bibendum. Morbi dictum lorem mattis ante imperdiet egestas. Mauris commodo diam sit amet posuere sodales. Curabitur fringilla placerat tellus a consectetur. Cras ut ipsum ut libero tempus suscipit sed fermentum quam. Proin quis erat turpis. Nam semper dictum augue id fermentum. Morbi vel nulla at nulla varius pulvinar. Nulla pretium viverra eros, vel ullamcorper enim aliquam in. Fusce sapien metus, luctus a purus ac, vulputate suscipit dolor. Mauris lectus justo, fringilla nec arcu sit amet, cursus sagittis metus. Vivamus semper enim a rhoncus faucibus. Suspendisse vel ornare ligula, quis ultricies tellus. Phasellus ultrices, magna tristique iaculis tincidunt, quam odio vestibulum ex, ut consequat lorem orci tincidunt dolor. Quisque rhoncus efficitur magna, et dictum sapien laoreet in. Quisque suscipit vehicula ipsum, congue luctus neque feugiat quis. Mauris porttitor molestie odio, nec aliquam elit fringilla ut. Maecenas sed felis eros. Aliquam sit amet velit sit amet sapien volutpat dignissim vel a nunc. Nunc quis urna feugiat nulla eleifend fringilla. Mauris laoreet dictum ex in vehicula. Ut sollicitudin diam lectus, ut mattis diam sagittis nec. Cras orci turpis, feugiat sit amet ornare sit amet, tristique ac massa. Aliquam tincidunt eu quam eu ullamcorper. Nunc finibus elit ac leo pretium, nec dictum nisl viverra. Nulla sit amet mollis sem, a ultrices urna. Curabitur sit amet tortor vehicula, interdum ante a, porta mauris. Curabitur accumsan, est at dapibus mattis, ipsum nunc venenatis urna, ac iaculis eros nulla at arcu. Duis sit amet magna non leo pretium consequat eget quis orci. Quisque in molestie diam, sed faucibus nisi. Sed tempus enim ut justo ultricies, nec facilisis ante iaculis. In bibendum faucibus nisl vitae lobortis. Fusce vitae sem auctor, pharetra nisl vel, volutpat turpis. Sed venenatis felis a tortor malesuada fringilla. Aenean sed arcu at erat convallis sodales. Aenean feugiat, lectus eu vehicula malesuada, nisi quam eleifend quam, sed faucibus urna eros sed ante. Nunc pretium, dui in laoreet gravida, nisl urna faucibus tortor, ut dignissim lorem tellus at lectus. Suspendisse lacinia tortor a sapien viverra sodales. Vestibulum id sapien feugiat massa mollis rhoncus varius eu odio. Pellentesque ut est euismod, faucibus felis et, tincidunt dolor. In hac habitasse platea dictumst. Morbi egestas, dolor quis sodales interdum, lacus odio malesuada justo, at luctus mauris mi vel eros. Ut ex odio, ultricies in sem placerat, ornare finibus tellus. Aliquam vel tincidunt sem. Aenean fringilla lacinia nisi, in scelerisque ante fermentum sed. Duis massa felis, tempus ut est ac, aliquam cursus magna. Vivamus malesuada finibus mi, in volutpat dui vehicula at. Sed arcu elit, fermentum dapibus sollicitudin eget, condimentum dapibus sem. Maecenas porta est a varius suscipit. Suspendisse potenti. Vestibulum at porta risus, egestas maximus tellus. Morbi at massa et lacus tempor eleifend. Praesent id volutpat arcu, in dictum justo. Cras lacinia sodales purus, faucibus ornare sem rutrum sed. Mauris tempus eros at quam efficitur dapibus. Donec in justo et lorem ultrices pellentesque. Ut consequat dolor velit, nec ultrices nunc fringilla in. Maecenas rhoncus velit vel dui porttitor varius. In id facilisis mauris, in dictum ante. Fusce hendrerit tristique dolor. Sed fermentum semper tempor. Ut facilisis volutpat magna id ornare. Praesent aliquam iaculis venenatis. Cras et erat ex. Donec pellentesque erat eget ante porttitor lacinia. Donec finibus odio at lacus sagittis finibus. Curabitur egestas massa orci, sit amet interdum risus dignissim vel. Cras sed quam a purus ornare lacinia ut eu sem. Praesent euismod luctus odio. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut tempus lorem erat, quis viverra ipsum rhoncus nec. Sed ac pharetra velit, non pellentesque sem. Etiam convallis posuere metus, in tempus ex hendrerit pellentesque. Curabitur est felis, molestie sit amet metus id, suscipit auctor erat. Fusce viverra mi nec luctus bibendum. Cras sodales orci vel urna tristique facilisis. Mauris pretium consequat ex nec finibus. Integer lectus dui, aliquet eget mi suscipit, blandit aliquam arcu. Mauris in aliquet eros, in gravida leo. Morbi id libero sed orci suscipit pharetra eget sit amet sapien. Maecenas non massa tincidunt, hendrerit mi vitae, semper nulla. Ut sapien nisi, porttitor sit amet consectetur at, molestie ut mi. In ac massa eros. In vehicula eleifend nibh, ut fringilla ante vulputate at. Sed gravida finibus iaculis. Integer consequat posuere elit in ultricies. Ut dignissim arcu lacinia sem euismod, vel ultrices eros bibendum. Integer lacinia aliquam ultrices. Phasellus nunc mi, cursus vitae euismod nec, luctus sit amet tellus. Pellentesque condimentum dui id justo tempus, quis posuere eros sollicitudin. Nam porttitor ornare sem, at maximus tellus bibendum vel. Nullam tempor urna orci. Sed vel sollicitudin magna. Curabitur lobortis sem at urna venenatis, id convallis elit congue. Quisque quam nulla, aliquet ac quam in, placerat gravida nisi. Curabitur tristique metus id efficitur malesuada. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis rutrum, lacus et dictum pharetra, velit leo consectetur metus, eu tincidunt orci elit vitae eros. Nulla eget tellus eget ipsum viverra iaculis nec ac ex. Nulla at leo pulvinar, maximus sapien quis, euismod lacus. Praesent quis risus molestie, sollicitudin massa sit amet, pulvinar neque. Cras volutpat, tortor nec posuere maximus, libero orci fringilla mauris, porttitor semper tellus massa ut eros. Donec dapibus non arcu sed congue. Maecenas fermentum, nulla molestie aliquet condimentum, ex mi egestas lorem, quis convallis ipsum libero a quam. Morbi in odio auctor nisl suscipit eleifend. Donec ultrices tempus consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque dapibus, tortor vitae pretium ultrices, tellus sapien hendrerit risus, eget vestibulum sem lorem eu mauris. Fusce convallis orci ac lacus pharetra vulputate. Sed fermentum egestas enim, in finibus mauris mattis eu. Sed pretium, urna id mollis pretium, risus neque pellentesque risus, id gravida tellus erat quis eros. Praesent aliquam nibh id erat sodales placerat. Etiam nec nibh vehicula mi eleifend vestibulum. Nunc et ante ac magna auctor pellentesque id tempor lacus. Mauris nec erat vitae magna posuere vehicula a non ipsum. Integer pharetra et urna id sollicitudin. Phasellus in mi vel risus sagittis ultricies. Aliquam quis ligula lacinia, pretium diam sagittis, pulvinar purus. Nulla ullamcorper est lectus, eu cursus leo imperdiet vitae. Nulla fringilla in ante et molestie. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur id scelerisque velit, vehicula lobortis metus. Donec ut enim et dui euismod maximus ac vel libero. Integer nec felis a mi aliquet euismod. Fusce pretium felis nec efficitur interdum. Praesent mattis dui nulla, sed tempus libero semper eu. Cras gravida malesuada nunc ut facilisis. Donec vehicula neque nec tellus posuere dapibus. Etiam id est eros. Nam in imperdiet nunc, at consequat massa. Praesent eu tellus in turpis auctor hendrerit sit amet non mauris. Nullam congue neque et turpis mattis, eu sollicitudin dolor suscipit. Vestibulum eget tortor metus. Curabitur metus nisl, tincidunt sollicitudin placerat vitae, dignissim et nisi. Etiam scelerisque nibh non tellus dapibus, sit amet maximus libero lobortis. Proin porttitor enim lacus, et dictum sem tristique ac. Proin porttitor enim quis elementum sagittis. Morbi consectetur, massa id ornare accumsan, ex metus porttitor ante, nec porta nisl urna nec nisi. Maecenas tristique arcu condimentum risus molestie auctor. Nulla magna massa, interdum vel iaculis sed, venenatis eleifend tortor. Etiam luctus gravida fringilla. Vestibulum lectus urna, tristique non interdum vitae, consectetur in est. Nullam eu ex feugiat, auctor tortor ac, aliquet urna. Phasellus et tincidunt elit. Donec sit amet hendrerit lorem. Mauris cursus eros augue, ut tristique nulla luctus et. Sed laoreet tempor ipsum, sed mollis nisi consequat id. Nullam cursus sem elit, sed posuere nisl molestie quis. Mauris bibendum sit amet mauris quis consectetur. Pellentesque eros eros, cursus eu ante nec, consectetur porta magna. Sed justo neque, ultricies ac libero eget, euismod scelerisque nisl. Aenean posuere mauris velit. Integer laoreet sagittis felis, quis tempus quam lobortis eu. Aenean dapibus massa sit amet elementum ornare. Praesent dolor tortor, maximus quis magna et, suscipit pellentesque odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In sit amet fermentum elit. Curabitur luctus, neque id rhoncus semper, nibh mi varius arcu, at maximus diam orci interdum neque. Nunc diam tortor, cursus et libero et, varius imperdiet metus. Aenean tincidunt justo at augue posuere accumsan. Vivamus vitae nibh tincidunt, sagittis neque venenatis, fermentum enim. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla hendrerit porta suscipit. Phasellus eleifend, mi sed semper posuere, augue felis feugiat lacus, a molestie eros ante non risus. Ut augue ante, ultrices vitae neque sit amet, euismod tristique leo. Donec arcu metus, laoreet sed semper eget, lacinia porta massa. Pellentesque condimentum justo ut metus aliquet, in sodales mauris blandit. Donec eget luctus magna. Fusce interdum orci id purus vehicula, pellentesque finibus massa accumsan. Nunc eleifend consequat nibh, placerat convallis urna accumsan eu. Nulla bibendum ipsum turpis, a sollicitudin turpis imperdiet in. Praesent vestibulum leo non nibh pulvinar faucibus. Donec dictum ligula eget efficitur pulvinar. Maecenas pulvinar ante vel urna rutrum tincidunt. Aliquam erat volutpat. In hac habitasse platea dictumst. Nulla eu magna quis nulla euismod viverra. Nulla semper diam eget convallis pulvinar. Nulla facilisi. Nulla condimentum gravida sollicitudin. Mauris scelerisque, ligula quis varius dignissim, libero tellus faucibus enim, id gravida nibh nisl vitae massa. Pellentesque auctor diam et dolor fringilla, sed tristique nunc pharetra. Cras quis gravida purus. Sed dignissim lobortis neque, vitae fringilla ex sagittis ut. Praesent dignissim placerat risus, in consectetur magna sollicitudin vitae. Proin blandit nisl vitae metus rhoncus pharetra. Phasellus elementum dolor at nunc dictum, vitae vulputate dui tempor. Praesent feugiat sit amet dolor eget scelerisque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nullam quis arcu nisl. In vehicula enim mauris, vitae viverra nisl rutrum molestie. Phasellus et erat eu felis tristique ultrices a eget metus. In pulvinar lectus nisl, sed volutpat neque viverra nec. Nam consequat eleifend leo, sagittis egestas est. Proin nulla dolor, eleifend sed sollicitudin et, dignissim id sapien. In lacinia tincidunt leo ut ultricies. Etiam ultrices euismod tortor. Sed rutrum aliquet maximus. Mauris at risus eu eros dapibus scelerisque eget vel eros. In non est sem. Duis at risus quam. Proin sed nibh sagittis, dapibus quam quis, posuere leo. Pellentesque ut eros ullamcorper, porttitor velit et, pharetra nunc. Morbi laoreet mollis diam quis vestibulum. Etiam at quam quis neque vulputate sodales. Praesent fringilla ligula sed vehicula scelerisque. Donec viverra eget libero faucibus dignissim. Vivamus nec nibh nisl. Mauris pretium finibus arcu. Nulla maximus, tortor sit amet tempor bibendum, dui nulla vehicula orci, et sodales massa arcu eu odio. Fusce semper ut ligula non feugiat. Aliquam condimentum ultrices nisl et malesuada. Maecenas sed neque metus. Vestibulum velit nunc, molestie placerat mattis non, consequat vitae purus. Duis id porttitor felis, ac elementum nunc. Nam ac aliquam nisl, et facilisis est. Phasellus lacinia mi a nulla hendrerit, a cursus nibh porttitor. Duis quis consequat nibh, ac interdum sem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus aliquet nunc a ex mollis, laoreet venenatis quam accumsan. Suspendisse sit amet sem non diam gravida pharetra a vitae velit. Donec tincidunt nulla non nisl accumsan, nec placerat arcu vehicula. Donec eget ante sollicitudin, ultrices lectus quis, facilisis libero. Phasellus accumsan ornare eros, vitae molestie urna placerat non. Etiam tempus leo ac purus varius ultricies. Donec libero lorem, interdum et risus sit amet, accumsan pellentesque justo. Pellentesque in odio dapibus, tempor est sit amet, iaculis sem. Curabitur id volutpat arcu. Sed sit amet nunc eu urna tincidunt lobortis. Nullam tempor, diam at scelerisque efficitur, quam mauris dignissim eros, nec scelerisque massa magna ut enim. Maecenas pretium, purus in cursus sagittis, mi nibh vulputate arcu, id rutrum nisl ipsum non dui. Quisque at massa eget libero ornare interdum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nunc interdum velit at ipsum congue, in venenatis orci euismod. Maecenas nec nibh a orci congue aliquet a eget quam. Integer ex mauris, porta at rutrum eu, pulvinar ut massa. Pellentesque ut turpis in ipsum finibus condimentum. Phasellus porttitor varius varius. Nunc ut dui et est posuere fringilla. Etiam vel sem eu mauris laoreet malesuada ac at sem. Fusce pharetra libero ante, sed euismod metus blandit in. Vestibulum quis luctus ligula. Maecenas et odio elementum, vestibulum purus tempus, laoreet risus. Ut vel viverra tortor, non lobortis neque. Vivamus tincidunt nibh quis magna tincidunt, id fringilla lacus viverra. In posuere ac libero et molestie. Donec sed enim egestas, gravida quam quis, sagittis augue. Sed arcu justo, aliquam sit amet pulvinar et, bibendum eget metus. Suspendisse lectus nisi, sagittis pellentesque tristique sed, tristique vitae nisl. Praesent non malesuada ipsum. Vivamus vehicula urna vitae libero consequat mattis. Pellentesque in mattis magna, in interdum lacus. Donec lacus velit, maximus ac nibh non, eleifend ultrices libero. Pellentesque in convallis orci. Nullam et massa felis. Maecenas tellus velit, viverra ut ligula vitae, dignissim eleifend tellus. Nam faucibus sem est, sed molestie magna scelerisque in. Maecenas ultrices metus at libero convallis facilisis. Nullam lacinia ut tortor sit amet placerat. Vestibulum efficitur mattis nibh sit amet hendrerit. Vivamus eget orci diam. Curabitur mauris lectus, bibendum luctus iaculis non, commodo eget justo. Maecenas diam risus, viverra in nisi placerat, ultrices pellentesque arcu. Proin lectus ante, consequat vel suscipit at, tempor at lectus. Aliquam nec nulla vitae dolor porta blandit ut non sapien. Nulla pretium arcu eu enim tincidunt finibus. In hac habitasse platea dictumst. Quisque ut faucibus tellus. Sed in erat ligula. Nam sodales posuere varius. Curabitur dapibus felis tortor, eleifend suscipit risus feugiat ut. Sed eget sapien nisl. Curabitur ante neque, condimentum non lacus sit amet, commodo gravida lorem. Praesent aliquam sodales blandit. Praesent quis purus tristique, ultrices orci nec, gravida ex. Mauris nulla urna, mollis non volutpat at, elementum non mauris. Ut hendrerit auctor tempor. Pellentesque dictum sagittis velit, a fermentum tortor mattis id. Cras pulvinar est quis augue posuere finibus. Fusce ullamcorper risus ac tortor rutrum, vitae lacinia orci euismod. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque dapibus, ipsum vel pellentesque efficitur, enim purus viverra lacus, ut auctor dui sapien nec elit. Donec egestas iaculis sodales. Vivamus id augue sed enim lobortis molestie in vel erat. Ut vitae mi ut neque venenatis consectetur. Phasellus varius mollis arcu at dapibus. Integer congue magna ipsum, vitae malesuada nibh tempus non. Nullam eu molestie elit, eget tincidunt lacus. Fusce eu imperdiet magna. Curabitur scelerisque elit at aliquam ullamcorper. Aenean tempus sem sit amet libero pellentesque, non tristique sem vestibulum. Fusce vestibulum eros ut neque posuere, a posuere tellus volutpat. Nunc ultricies eleifend nulla tempus mattis. Donec convallis suscipit mi, quis ornare ex fringilla quis. Nullam nec dui ut arcu interdum semper. Suspendisse sit amet augue eget leo rutrum varius. Integer euismod eget quam non vestibulum. Integer ornare ipsum ac erat placerat euismod. Sed eu arcu sed arcu pharetra ultrices. Sed mattis tincidunt lacinia. Vestibulum ut sodales ex. Pellentesque maximus ipsum magna, rhoncus pellentesque metus mattis nec. Pellentesque tincidunt quis lorem nec euismod. Ut in orci interdum, dignissim eros faucibus, gravida urna. Vestibulum rhoncus massa nec accumsan convallis. Nulla velit nisl, molestie quis libero in, semper congue magna. Aliquam sit amet eleifend nisi. Duis efficitur feugiat sollicitudin. Sed scelerisque augue vestibulum, condimentum sem vitae, ultricies odio. Integer porttitor vel ante in laoreet. Curabitur tempus lacus quis metus egestas, tempus pulvinar mi facilisis. Integer porttitor mattis ipsum, in accumsan felis. Morbi vestibulum urna lectus, sed gravida mauris laoreet in. Suspendisse maximus sodales pharetra. Etiam molestie auctor augue, et lacinia massa malesuada et. Etiam lobortis tellus et nisl posuere dictum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus luctus at turpis in semper. Aenean id volutpat lorem. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed vel egestas massa, eu cursus nulla. Nulla tellus nisl, tempus non semper non, molestie efficitur elit. Sed in pellentesque sapien, sit amet elementum odio. Aenean et velit nisl. Ut non neque metus. Nullam ornare elit vel mi maximus molestie. Quisque consequat efficitur leo, at ultrices libero consequat et. Maecenas a nunc at ligula interdum hendrerit in quis ligula. Duis condimentum nisi mi, id fermentum augue maximus non. Donec auctor porttitor ex id rutrum. Etiam efficitur augue in justo convallis, sed pellentesque risus tincidunt. Donec tincidunt lorem nec tellus porta, non efficitur augue auctor. Phasellus dignissim diam sapien, ut efficitur tortor mollis at. Donec faucibus, arcu eu tristique fringilla, ante purus lacinia diam, condimentum tempus lectus massa vitae nisl. Quisque vel sapien ac mi fringilla posuere. Nullam ac consectetur nibh. Aenean tristique metus id dui elementum mollis. Pellentesque a vestibulum risus, tempus suscipit mauris. Nullam vehicula vehicula malesuada. Curabitur sed molestie ipsum, non auctor nibh. Aenean ut enim sit amet velit feugiat consequat. In hac habitasse platea dictumst. Praesent eget maximus enim, nec malesuada felis. Maecenas at sapien nec ipsum dictum suscipit nec at felis. Vivamus aliquam velit at pretium porttitor. Cras lacus purus, commodo sed nulla quis, ultricies sodales turpis. Nullam faucibus ipsum in accumsan mollis. Maecenas ac laoreet odio. Praesent consectetur nisl non elementum cursus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum eu malesuada ipsum. Duis ligula justo, fringilla ut condimentum tempor, tincidunt rhoncus diam. Nunc sit amet libero porttitor, porta nibh sit amet, gravida nunc. Vestibulum cursus tincidunt odio. Quisque non massa et ipsum iaculis iaculis eu in est. Suspendisse potenti. Mauris quis consequat nulla. Vivamus dictum, nibh ac consequat volutpat, mi sapien maximus urna, vel congue metus lectus pretium arcu. Suspendisse eleifend ante sit amet tellus rhoncus aliquam. Aenean augue erat, bibendum a blandit eu, tincidunt ac purus. Curabitur luctus rutrum est sed dignissim. Morbi a gravida nunc. Vestibulum eleifend nulla felis, id bibendum lectus dapibus in. Duis lacinia hendrerit mi, ac posuere urna tincidunt sit amet. Pellentesque vitae pulvinar lacus, vitae ultrices ligula. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In consectetur, lectus id elementum tristique, lacus ipsum pharetra mauris, in dapibus sapien est sed velit. Etiam nec est id odio consectetur venenatis. Donec porttitor varius lacus, quis lacinia odio malesuada sit amet. Cras felis arcu, dictum eu ante hendrerit, consequat volutpat metus. Nulla facilisi. Aenean orci ligula, gravida nec maximus eget, faucibus sed nisl. Suspendisse potenti. Pellentesque viverra eget neque sed mollis. Morbi eget sapien sed est pretium sollicitudin. Quisque faucibus ex vitae scelerisque pharetra. Curabitur vitae dolor nulla. Cras non arcu quis justo tempor condimentum non at tellus. Nam sed pharetra metus, vitae pretium nisl. Maecenas commodo, mauris eu lacinia luctus, lacus justo vestibulum lectus, quis venenatis quam nulla sed dui. Donec efficitur odio ac dolor rhoncus tempor. Suspendisse vitae metus vitae odio feugiat vestibulum nec a augue. Sed a ligula interdum, aliquam leo non, bibendum ligula. Nulla eget turpis non lacus ultricies varius nec sit amet ligula. Nam sed ultrices nibh. Integer efficitur euismod ligula ut interdum. Phasellus nec consequat urna. Curabitur vitae aliquam tellus, vel sagittis nulla. Integer cursus purus ipsum, quis pellentesque turpis ultrices nec. Suspendisse mollis urna tristique vehicula ornare. Etiam in ex et dui lacinia sagittis. Donec sit amet laoreet arcu, tincidunt sollicitudin lacus. Suspendisse est tellus, euismod eget magna in, tempor consectetur eros. Cras rhoncus nisl ac pharetra cursus. Sed elementum odio et tellus tristique hendrerit. Phasellus consequat condimentum enim ac semper. Aenean congue ultricies ligula. Aenean at suscipit ligula. Proin non luctus mauris, fermentum vulputate dui. Praesent eu tincidunt odio, non feugiat risus. In hac habitasse platea dictumst. Vivamus varius ornare eros, vitae pretium enim eleifend at. Ut vestibulum nisi nec malesuada facilisis. Duis quis leo mattis mauris cursus bibendum sed quis mi. In sit amet sollicitudin velit, vel lacinia velit. Morbi posuere id massa at condimentum. Phasellus tristique quam quis pellentesque aliquet. Etiam quis suscipit nulla. Pellentesque tempor consequat massa lacinia scelerisque. Ut ut est nibh. Mauris mollis rhoncus aliquet. Quisque eget libero et augue volutpat tincidunt sit amet a mauris. Sed pellentesque cursus leo vitae mollis. Sed ut condimentum mi, id tincidunt nibh. Donec pharetra metus nibh, at tincidunt tortor mollis elementum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam ac tortor consequat, aliquet ligula nec, gravida massa. Etiam in lectus placerat, dapibus ex nec, lacinia risus. Sed interdum orci vitae augue malesuada, ut ullamcorper leo fermentum. Sed convallis tincidunt nisi nec dictum. In hac habitasse platea dictumst. Aliquam erat volutpat. Vivamus tincidunt turpis arcu, ac laoreet magna tempus nec. Fusce nisl purus, blandit in diam ac, dictum laoreet leo. Nunc dictum quam non est rutrum, quis pulvinar eros lacinia. Donec cursus libero non erat tristique, et ullamcorper ante pretium. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec turpis elit, ultrices non feugiat ut, feugiat eget ante. Nullam accumsan, quam et consectetur porttitor, urna purus eleifend erat, at hendrerit lacus sapien nec sem. Vestibulum sodales vestibulum felis a auctor. Aenean venenatis quam orci, id porta ipsum vulputate non. Mauris mattis tempus finibus. Nullam faucibus bibendum bibendum. Sed urna libero, mattis nec metus quis, aliquam ultrices elit. Maecenas semper convallis erat vitae rutrum. Proin malesuada enim a magna efficitur, ac sagittis quam consectetur. Suspendisse pulvinar id nulla eget aliquam. Curabitur metus ante, euismod eget risus et, elementum porta massa. Morbi aliquet malesuada augue, eget sagittis risus iaculis a. Aliquam nec leo purus. Pellentesque vel diam mi. Donec ac luctus velit. Integer tristique dui id dui luctus, vel tincidunt erat volutpat. Donec ultricies velit id tellus dapibus, quis consequat ante scelerisque. Cras finibus molestie ipsum non vehicula. Vivamus interdum aliquet metus quis dignissim. Etiam libero tortor, molestie quis consequat quis, aliquet in tellus. Etiam ut porttitor metus. Praesent eget est ullamcorper, eleifend augue in, dapibus ligula. Donec eu pretium neque. Sed ultrices tortor ut orci tempor, non tristique nunc tempus. Maecenas quis leo eu sem lobortis malesuada rutrum et odio. Etiam hendrerit placerat bibendum. Mauris posuere odio nisi, nec suscipit tortor finibus non. Sed porttitor tortor quis ante lacinia euismod. Mauris auctor pretium odio ac cursus. Curabitur varius mi ut mi porta, ut convallis nibh consequat. Etiam auctor rutrum nisi, sit amet rutrum dui efficitur at. Cras scelerisque accumsan rhoncus. Maecenas ut sapien non metus ultricies aliquam. Mauris at leo turpis. Morbi vel tellus eros. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam vestibulum commodo lobortis. Mauris vestibulum luctus consequat. Integer ut convallis enim, varius iaculis est. Nunc vulputate risus quis purus tempor, at tristique erat laoreet. Maecenas sodales nisl et urna fringilla, vitae blandit tortor elementum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Cras lorem ex, ultricies ac arcu quis, pretium convallis lorem. Praesent ut ligula aliquet, maximus justo quis, accumsan diam. Vivamus eleifend vitae dui ut egestas. Integer non cursus est. Maecenas viverra quis nisl vel euismod. Donec et quam eget nisi congue pulvinar. Phasellus bibendum scelerisque magna. Quisque eu tellus vulputate, pulvinar velit nec, euismod massa. Nullam ullamcorper quam ac luctus tincidunt. Quisque massa neque, tristique sed lorem vitae, sagittis lacinia tellus. Aliquam aliquam nisl nec placerat fringilla. Phasellus auctor velit nec elit consequat ultrices. Praesent eu sapien lobortis ipsum vehicula dictum ut eu nisi. Integer ut dictum felis. Nunc dictum sapien felis, nec gravida lorem porttitor id. Suspendisse gravida congue lacus, nec rutrum enim mattis nec. Vivamus nec tellus turpis. Nulla semper non odio ut consectetur. Fusce mattis massa enim, at congue sapien eleifend quis. Suspendisse varius urna in elit interdum, vitae viverra dui convallis. Curabitur quis iaculis nisi. Praesent varius cursus enim eu ullamcorper. Nullam ac tincidunt enim. Donec ut vehicula velit.' 3 | 4 | export default loremIpsum 5 | --------------------------------------------------------------------------------