├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .travis.yml ├── README.md ├── assets ├── README.md ├── fonts │ └── exo │ │ ├── Exo-Black.eot │ │ ├── Exo-Black.svg │ │ ├── Exo-Black.woff │ │ ├── Exo-Black.woff2 │ │ ├── Exo-Bold.eot │ │ ├── Exo-Bold.svg │ │ ├── Exo-Bold.woff │ │ ├── Exo-Bold.woff2 │ │ ├── Exo-ExtraBold.eot │ │ ├── Exo-ExtraBold.svg │ │ ├── Exo-ExtraBold.woff │ │ ├── Exo-ExtraBold.woff2 │ │ ├── Exo-Medium.eot │ │ ├── Exo-Medium.svg │ │ ├── Exo-Medium.woff │ │ ├── Exo-Medium.woff2 │ │ ├── Exo-Regular.eot │ │ ├── Exo-Regular.svg │ │ ├── Exo-Regular.woff │ │ └── Exo-Regular.woff2 ├── images │ ├── contact.jpg │ ├── header.svg │ ├── icon.svg │ ├── lines.svg │ ├── logo-full.svg │ ├── logo.svg │ ├── speakers │ │ ├── carlos.jpg │ │ ├── daniel.jpg │ │ ├── elder.jpg │ │ ├── guilherme.jpg │ │ ├── heitor.jpg │ │ ├── paulo.jpg │ │ ├── pedro.jpg │ │ └── turicas.jpg │ ├── sponsors │ │ ├── contaazul.png │ │ ├── db1.png │ │ ├── devparana.png │ │ ├── elotech.png │ │ ├── locaweb.png │ │ ├── mandic.png │ │ ├── oracle.png │ │ ├── tecnospeed.png │ │ └── toptal.png │ ├── support │ │ ├── devparana.png │ │ ├── podtag.png │ │ ├── sbm.png │ │ ├── sebrae.png │ │ ├── sicoob.png │ │ ├── srm.png │ │ └── umbler.png │ ├── t-shirt-blue.jpg │ └── t-shirt.jpg └── sass │ ├── base │ ├── _animations.scss │ ├── _base.scss │ ├── _buttons.scss │ ├── _colors.scss │ ├── _form.scss │ ├── _layout.scss │ ├── _reset.scss │ ├── _text.scss │ └── _variables.scss │ ├── components │ ├── _speakers.scss │ ├── _sponsor.scss │ └── _support.scss │ └── main.scss ├── components ├── README.md ├── buytickets.vue ├── c4p.vue ├── footer.vue ├── header.vue ├── menu.vue └── social-fixed.vue ├── layouts ├── README.md └── default.vue ├── middleware └── README.md ├── nuxt.config.js ├── package.json ├── pages ├── README.md ├── home │ └── components │ │ ├── about.vue │ │ ├── call4papers.vue │ │ ├── contact.vue │ │ ├── location.vue │ │ ├── schedule.vue │ │ ├── speakers.vue │ │ ├── sponsors.vue │ │ ├── support.vue │ │ ├── tickets.vue │ │ └── users.vue ├── index.vue ├── palestrantes │ └── _id.vue └── styleguide │ └── index.vue ├── plugins ├── README.md ├── ga.js ├── rellax.js ├── smooth-scroll.js └── vue-countdown.js ├── server.js ├── static ├── README.md ├── favicon.ico └── pdf │ ├── mediakit-en.pdf │ └── mediakit.pdf └── store ├── README.md └── index.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_size = 2 6 | indent_style = space 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | browser: true, 5 | node: true 6 | }, 7 | parserOptions: { 8 | parser: 'babel-eslint' 9 | }, 10 | extends: [ 11 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention 12 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. 13 | 'plugin:vue/essential' 14 | ], 15 | // required to lint *.vue files 16 | plugins: [ 17 | 'vue' 18 | ], 19 | // add your custom rules here 20 | rules: {} 21 | } 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | node_modules 3 | 4 | # logs 5 | npm-debug.log 6 | 7 | # Nuxt build 8 | .nuxt 9 | 10 | # Nuxt generate 11 | dist 12 | 13 | yarn.lock 14 | package-lock.json 15 | 16 | .DS_Store 17 | */**/.DS_Store 18 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "8" 4 | 5 | cache: 6 | directories: 7 | - "node_modules" 8 | 9 | branches: 10 | only: 11 | - master 12 | 13 | install: 14 | - npm install 15 | - npm run build 16 | - npm run generate 17 | 18 | script: 19 | - echo "Skipping tests" 20 | 21 | deploy: 22 | provider: pages 23 | skip-cleanup: true 24 | github-token: $GITHUB_ACCESS_TOKEN # Set in travis-ci.org dashboard, marked secure https://docs.travis-ci.com/user/deployment/pages/#Setting-the-GitHub-token 25 | target-branch: gh-pages 26 | local-dir: dist 27 | on: 28 | branch: master 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # conf-2018 2 | 3 | > Dev Paraná Conference 2018 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | $ npm install # Or yarn install 10 | 11 | # serve with hot reload at localhost:3000 12 | $ npm run dev 13 | 14 | # build for production and launch server 15 | $ npm run build 16 | $ npm start 17 | 18 | # generate static project 19 | $ npm run generate 20 | ``` 21 | 22 | For detailed explanation on how things work, checkout the [Nuxt.js docs](https://github.com/nuxt/nuxt.js). 23 | 24 | ## Colors 25 | > green/black 26 | - $color-primary: #15a04b; 27 | - $color-primary-light: #a0d8b6; 28 | - $color-white: #ffffff; 29 | - $color-dark: #072211; 30 | 31 | > red/blue 32 | - $color-primary: #f53855; 33 | - $color-primary-light: #F98E9E; 34 | - $color-white: #fff; 35 | - $color-dark: #10145b; 36 | -------------------------------------------------------------------------------- /assets/README.md: -------------------------------------------------------------------------------- 1 | # ASSETS 2 | 3 | This directory contains your un-compiled assets such as LESS, SASS, or JavaScript. 4 | 5 | More information about the usage of this directory in the documentation: 6 | https://nuxtjs.org/guide/assets#webpacked 7 | 8 | **This directory is not required, you can delete it if you don't want to use it.** 9 | -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Black.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Black.eot -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Black.woff -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Black.woff2 -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Bold.eot -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Bold.woff -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Bold.woff2 -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-ExtraBold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-ExtraBold.eot -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-ExtraBold.woff -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-ExtraBold.woff2 -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Medium.eot -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Medium.woff -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Medium.woff2 -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Regular.eot -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Regular.woff -------------------------------------------------------------------------------- /assets/fonts/exo/Exo-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/fonts/exo/Exo-Regular.woff2 -------------------------------------------------------------------------------- /assets/images/contact.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/contact.jpg -------------------------------------------------------------------------------- /assets/images/header.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 28 | 47 | 65 | 66 | -------------------------------------------------------------------------------- /assets/images/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 26 | 27 | -------------------------------------------------------------------------------- /assets/images/lines.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /assets/images/logo-full.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 17 | 18 | 20 | 39 | 40 | 41 | 43 | 48 | 49 | 51 | 52 | 54 | 55 | 56 | 58 | 59 | 60 | 63 | 66 | 67 | 69 | 74 | 76 | 81 | 82 | 84 | 89 | 90 | 91 | 93 | 98 | 99 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /assets/images/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 14 | 16 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /assets/images/speakers/carlos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/speakers/carlos.jpg -------------------------------------------------------------------------------- /assets/images/speakers/daniel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/speakers/daniel.jpg -------------------------------------------------------------------------------- /assets/images/speakers/elder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/speakers/elder.jpg -------------------------------------------------------------------------------- /assets/images/speakers/guilherme.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/speakers/guilherme.jpg -------------------------------------------------------------------------------- /assets/images/speakers/heitor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/speakers/heitor.jpg -------------------------------------------------------------------------------- /assets/images/speakers/paulo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/speakers/paulo.jpg -------------------------------------------------------------------------------- /assets/images/speakers/pedro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/speakers/pedro.jpg -------------------------------------------------------------------------------- /assets/images/speakers/turicas.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/speakers/turicas.jpg -------------------------------------------------------------------------------- /assets/images/sponsors/contaazul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/sponsors/contaazul.png -------------------------------------------------------------------------------- /assets/images/sponsors/db1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/sponsors/db1.png -------------------------------------------------------------------------------- /assets/images/sponsors/devparana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/sponsors/devparana.png -------------------------------------------------------------------------------- /assets/images/sponsors/elotech.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/sponsors/elotech.png -------------------------------------------------------------------------------- /assets/images/sponsors/locaweb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/sponsors/locaweb.png -------------------------------------------------------------------------------- /assets/images/sponsors/mandic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/sponsors/mandic.png -------------------------------------------------------------------------------- /assets/images/sponsors/oracle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/sponsors/oracle.png -------------------------------------------------------------------------------- /assets/images/sponsors/tecnospeed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/sponsors/tecnospeed.png -------------------------------------------------------------------------------- /assets/images/sponsors/toptal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/sponsors/toptal.png -------------------------------------------------------------------------------- /assets/images/support/devparana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/support/devparana.png -------------------------------------------------------------------------------- /assets/images/support/podtag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/support/podtag.png -------------------------------------------------------------------------------- /assets/images/support/sbm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/support/sbm.png -------------------------------------------------------------------------------- /assets/images/support/sebrae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/support/sebrae.png -------------------------------------------------------------------------------- /assets/images/support/sicoob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/support/sicoob.png -------------------------------------------------------------------------------- /assets/images/support/srm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/support/srm.png -------------------------------------------------------------------------------- /assets/images/support/umbler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/support/umbler.png -------------------------------------------------------------------------------- /assets/images/t-shirt-blue.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/t-shirt-blue.jpg -------------------------------------------------------------------------------- /assets/images/t-shirt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/assets/images/t-shirt.jpg -------------------------------------------------------------------------------- /assets/sass/base/_animations.scss: -------------------------------------------------------------------------------- 1 | @keyframes showRect { 2 | from { 3 | opacity: 0; 4 | } 5 | 6 | to {} 7 | } 8 | 9 | .rect-animation { 10 | animation-name: showRect; 11 | animation-duration: 0.5s; 12 | animation-fill-mode: backwards; 13 | animation-delay: 1s; 14 | transition: 0.5s; 15 | width: 200px; 16 | height: 15px; 17 | background: $color-primary; 18 | position: absolute; 19 | z-index: 9; 20 | @media (max-width: 480px) { 21 | display: none; 22 | } 23 | 24 | &.light { 25 | background: $color-white; 26 | } 27 | 28 | &.dark { 29 | background: $color-dark; 30 | } 31 | } 32 | 33 | .fade-bottom-enter-active { 34 | transition:.3s; 35 | } 36 | 37 | .fade-bottom-leave-active { 38 | transition: .3s 39 | } 40 | .fade-bottom-enter, 41 | .fade-bottom-leave-to { 42 | transform: translateY(100px); 43 | opacity: 0; 44 | } 45 | -------------------------------------------------------------------------------- /assets/sass/base/_base.scss: -------------------------------------------------------------------------------- 1 | .size { 2 | width: 1200px; 3 | max-width: 90%; 4 | } 5 | 6 | .size-padding { 7 | width: calc(1200px + 40px); 8 | max-width: 90%; 9 | } 10 | 11 | .margin { 12 | margin: 0 auto; 13 | } 14 | 15 | .relative { 16 | position: relative; 17 | } 18 | 19 | .overflow-hidden { 20 | overflow: hidden; 21 | } 22 | 23 | .full-width { 24 | width: 100%; 25 | } 26 | -------------------------------------------------------------------------------- /assets/sass/base/_buttons.scss: -------------------------------------------------------------------------------- 1 | .btn { 2 | font-size: 16px; 3 | line-height: 100%; 4 | font-weight: bold; 5 | text-decoration: none; 6 | white-space: nowrap; 7 | padding: 15px 30px; 8 | border-radius: $radius; 9 | cursor: pointer; 10 | border: 1px solid transparent; 11 | background: $color-white; 12 | color: $color-dark; 13 | display: inline-flex; 14 | align-items: center; 15 | justify-content: center; 16 | outline: none; 17 | transition: 0.2s; 18 | font-family: inherit; 19 | 20 | a { 21 | text-decoration: none; 22 | } 23 | 24 | &.btn-active, 25 | &:hover { 26 | background-color: darken($color-white, 20); 27 | } 28 | 29 | // sizes 30 | &.btn-sm { 31 | font-size: 14px; 32 | padding: 10px 20px; 33 | } 34 | 35 | &.btn-lg { 36 | font-size: 18px; 37 | padding: 25px 40px; 38 | } 39 | 40 | &.btn-full { 41 | width: 100%; 42 | } 43 | 44 | // colors 45 | &.btn-primary { 46 | background: $color-primary; 47 | color: $color-white; 48 | 49 | &:hover { 50 | background: darken($color-primary, 10); 51 | } 52 | } 53 | &.btn-secundary { 54 | background: $color-dark; 55 | color: $color-white; 56 | border: 2px solid $color-primary; 57 | 58 | &:hover { 59 | background: darken($color-primary, 10); 60 | border-color: darken($color-primary, 10); 61 | } 62 | } 63 | 64 | &.btn-outline { 65 | background: transparent; 66 | border: 2px solid $color-white; 67 | color: $color-white; 68 | 69 | &:hover { 70 | background: $color-white; 71 | color: $color-dark; 72 | } 73 | 74 | &.btn-primary { 75 | border-color: $color-primary; 76 | color: $color-primary; 77 | 78 | &:hover { 79 | color: $color-white; 80 | background: $color-primary; 81 | } 82 | } 83 | 84 | &.btn-secundary { 85 | border-color: $color-dark; 86 | color: $color-dark; 87 | 88 | &:hover { 89 | color: $color-white; 90 | background: $color-dark; 91 | } 92 | } 93 | } 94 | 95 | &.btn-rounded { 96 | border-radius: 50px; 97 | } 98 | 99 | // disabled 100 | &.btn.disabled, 101 | &.btn:disabled, 102 | &.btn[disabled] { 103 | cursor: not-allowed; 104 | opacity: 0.5; 105 | background: $color-grey; 106 | color: $color-dark; 107 | 108 | &:hover { 109 | filter: none; 110 | } 111 | } 112 | 113 | &.btn-min-width { 114 | width: 150px; 115 | } 116 | 117 | &.btn-link { 118 | padding: 20px; 119 | } 120 | 121 | &.btn-transparent { 122 | background: transparent; 123 | 124 | &:hover { 125 | opacity: 0.5; 126 | } 127 | } 128 | } 129 | 130 | // .btn { 131 | // border-radius: 6px; 132 | // 133 | // &:hover { 134 | // background-color: darken(#ddd, 20); 135 | // } 136 | // 137 | // &.btn-primary { 138 | // background: $color-primary; 139 | // 140 | // &:hover { 141 | // background-color: darken($color-primary, 20); 142 | // } 143 | // } 144 | // 145 | // &.btn-secundary { 146 | // background: $color-dark; 147 | // 148 | // &:hover { 149 | // background-color: darken($color-dark, 10); 150 | // } 151 | // } 152 | // } 153 | // 154 | // .btn:hover { 155 | // filter: brightness(100%); 156 | // } 157 | -------------------------------------------------------------------------------- /assets/sass/base/_colors.scss: -------------------------------------------------------------------------------- 1 | .color-primary { 2 | color: $color-primary; 3 | } 4 | 5 | .background-primary { 6 | background: $color-primary; 7 | } 8 | 9 | .color-secundary { 10 | color: $color-dark; 11 | } 12 | 13 | .background-secundary { 14 | background: $color-dark; 15 | } 16 | 17 | .color-third { 18 | color: $color-white; 19 | } 20 | 21 | .background-third { 22 | background: $color-white; 23 | } 24 | -------------------------------------------------------------------------------- /assets/sass/base/_form.scss: -------------------------------------------------------------------------------- 1 | .container--form-block { 2 | .form-block { 3 | margin-bottom: 30px; 4 | 5 | &:last-child { 6 | margin-bottom: 0; 7 | } 8 | } 9 | } 10 | 11 | .form-block { 12 | display: flex; 13 | flex-direction: column; 14 | 15 | label { 16 | font-size: 16px; 17 | font-weight: bold; 18 | margin-bottom: 10px; 19 | } 20 | } 21 | 22 | .input { 23 | border: 1px solid #fff; 24 | border-radius: 4px; 25 | padding-left: 10px; 26 | box-sizing: border-box; 27 | min-height: 60px; 28 | background: transparent; 29 | font-size: 18px; 30 | color: #fff; 31 | outline: none; 32 | background: $color-dark; 33 | } 34 | 35 | .input.text-area { 36 | padding-top: 10px; 37 | } 38 | -------------------------------------------------------------------------------- /assets/sass/base/_layout.scss: -------------------------------------------------------------------------------- 1 | html { 2 | background: $color-dark; 3 | background: url(~/assets/images/lines.svg), $color-dark; 4 | background-position: center center; 5 | background-attachment: fixed; 6 | color: $color-white; 7 | } 8 | 9 | .content { 10 | padding: 100px 0; 11 | position: relative; 12 | // border: 1px solid #ddd; 13 | } 14 | 15 | .padding-top-100 { 16 | padding-top: 100px; 17 | } 18 | 19 | .padding-bottom-100 { 20 | padding-bottom: 100px; 21 | } 22 | -------------------------------------------------------------------------------- /assets/sass/base/_reset.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Exo'; 3 | src: url('~/assets/fonts/exo/Exo-Medium.eot'); 4 | src: local('Exo Medium'), local('Exo-Medium'), url('~/assets/fonts/exo/Exo-Medium.eot?#iefix') format('embedded-opentype'), url('~/assets/fonts/exo/Exo-Medium.woff2') format('woff2'), url('~/assets/fonts/exo/Exo-Medium.woff') format('woff'), url('~/assets/fonts/exo/Exo-Medium.svg#Exo-Medium') format('svg'); 5 | font-weight: 500; 6 | font-style: normal; 7 | } 8 | 9 | @font-face { 10 | font-family: 'Exo'; 11 | src: url('~/assets/fonts/exo/Exo-ExtraBold.eot'); 12 | src: local('Exo ExtraBold'), local('Exo-ExtraBold'), url('~/assets/fonts/exo/Exo-ExtraBold.eot?#iefix') format('embedded-opentype'), url('~/assets/fonts/exo/Exo-ExtraBold.woff2') format('woff2'), url('~/assets/fonts/exo/Exo-ExtraBold.woff') format('woff'), url('~/assets/fonts/exo/Exo-ExtraBold.svg#Exo-ExtraBold') format('svg'); 13 | font-weight: 800; 14 | font-style: normal; 15 | } 16 | 17 | @font-face { 18 | font-family: 'Exo'; 19 | src: url('~/assets/fonts/exo/Exo-Regular.eot'); 20 | src: local('Exo Regular'), local('Exo-Regular'), url('~/assets/fonts/exo/Exo-Regular.eot?#iefix') format('embedded-opentype'), url('~/assets/fonts/exo/Exo-Regular.woff2') format('woff2'), url('~/assets/fonts/exo/Exo-Regular.woff') format('woff'), url('~/assets/fonts/exo/Exo-Regular.svg#Exo-Regular') format('svg'); 21 | font-weight: normal; 22 | font-style: normal; 23 | } 24 | 25 | @font-face { 26 | font-family: 'Exo'; 27 | src: url('~/assets/fonts/exo/Exo-Bold.eot'); 28 | src: local('Exo Bold'), local('Exo-Bold'), url('~/assets/fonts/exo/Exo-Bold.eot?#iefix') format('embedded-opentype'), url('~/assets/fonts/exo/Exo-Bold.woff2') format('woff2'), url('~/assets/fonts/exo/Exo-Bold.woff') format('woff'), url('~/assets/fonts/exo/Exo-Bold.svg#Exo-Bold') format('svg'); 29 | font-weight: bold; 30 | font-style: normal; 31 | } 32 | 33 | @font-face { 34 | font-family: 'Exo'; 35 | src: url('~/assets/fonts/exo/Exo-Black.eot'); 36 | src: local('Exo Black'), local('Exo-Black'), url('~/assets/fonts/exo/Exo-Black.eot?#iefix') format('embedded-opentype'), url('~/assets/fonts/exo/Exo-Black.woff2') format('woff2'), url('~/assets/fonts/exo/Exo-Black.woff') format('woff'), url('~/assets/fonts/exo/Exo-Black.svg#Exo-Black') format('svg'); 37 | font-weight: 900; 38 | font-style: normal; 39 | } 40 | 41 | * { 42 | box-sizing: border-box; 43 | text-rendering: optimizeLegibility; 44 | -webkit-font-smoothing: antialiased; 45 | -moz-osx-font-smoothing: grayscale; 46 | font-kerning: auto; 47 | } 48 | 49 | html { 50 | font-family: sans-serif; 51 | -webkit-text-size-adjust: 100%; 52 | font-family: 'Exo'; 53 | } 54 | 55 | body { 56 | margin: 0; 57 | } 58 | 59 | a { 60 | text-decoration: none; 61 | } 62 | -------------------------------------------------------------------------------- /assets/sass/base/_text.scss: -------------------------------------------------------------------------------- 1 | h1, 2 | h2 { 3 | font-size: 5rem; 4 | } 5 | 6 | h3 { 7 | font-size: 4rem; 8 | } 9 | 10 | h4 { 11 | font-size: 3rem; 12 | } 13 | 14 | h5 { 15 | font-size: 2rem; 16 | } 17 | 18 | h6 { 19 | font-size: 1rem; 20 | } 21 | 22 | p { 23 | font-size: 1.2rem; 24 | line-height: 1.7em; 25 | font-weight: 300; 26 | } 27 | 28 | .span-uppercase { 29 | font-size: 18px; 30 | letter-spacing: 3px; 31 | text-transform: uppercase; 32 | } 33 | 34 | .box-data { 35 | margin-right: 50px; 36 | 37 | span { 38 | font-size: 18px; 39 | line-height: 1.5; 40 | } 41 | 42 | &:last-child { 43 | margin-right: 0; 44 | } 45 | 46 | @media (max-width: 720px) { 47 | margin-right: 20px; 48 | } 49 | } 50 | 51 | .box-title { 52 | text-transform: uppercase; 53 | margin-bottom: 100px; 54 | 55 | h2 span { 56 | display: block; 57 | } 58 | @media (max-width: 720px) { 59 | h2 { 60 | font-size: 10vw; 61 | } 62 | } 63 | } 64 | 65 | .list-style-none { 66 | list-style: none; 67 | } 68 | 69 | h2 span { 70 | display: block; 71 | @media screen and (max-width: 720px) { 72 | font-size: 7vw; 73 | } 74 | } 75 | 76 | .font-strong { 77 | font-weight: bold; 78 | } 79 | -------------------------------------------------------------------------------- /assets/sass/base/_variables.scss: -------------------------------------------------------------------------------- 1 | // green/black 2 | $color-primary: #15a04b; 3 | $color-primary-light: #a0d8b6; 4 | $color-white: #ffffff; 5 | $color-dark: #072211; 6 | $color-grey: #ddd; 7 | 8 | $radius: 4px; 9 | 10 | // red/blue 11 | // $color-primary: #f53855; 12 | // $color-primary-light: #F98E9E; 13 | // $color-white: #fff; 14 | // $color-dark: #10145b; 15 | -------------------------------------------------------------------------------- /assets/sass/components/_speakers.scss: -------------------------------------------------------------------------------- 1 | .speakers { 2 | .speakers--item { 3 | padding: 20px; 4 | box-sizing: border-box; 5 | } 6 | } 7 | 8 | .speakers--item.active { 9 | .speakers--item--content--image { 10 | border-color: $color-primary; 11 | box-shadow: 0 0 20px 0 $color-primary; 12 | 13 | .speakers--item--content--description { 14 | display: block; 15 | } 16 | } 17 | } 18 | 19 | .speakers--item--content { 20 | cursor: pointer; 21 | } 22 | 23 | .speakers--item--content--image { 24 | background: $color-primary; 25 | width: 100%; 26 | max-width: 400px; 27 | margin: 0 auto; 28 | overflow: hidden; 29 | position: relative; 30 | transition: 0.3s; 31 | border: 5px solid $color-dark; 32 | img { 33 | object-fit: cover; 34 | height: 400px; 35 | width: 100%; 36 | margin-bottom: 0; 37 | padding-bottom: 0; 38 | } 39 | 40 | } 41 | 42 | .speakers--item--content--title { 43 | text-align: right; 44 | transform: translateY(-40px) translateX(-40px); 45 | 46 | p { 47 | font-size: 22px; 48 | } 49 | @media (max-width: 720px) { 50 | transform: translateY(0) translateX(0); 51 | text-align: center; 52 | 53 | } 54 | } 55 | 56 | .speakers--item--content--description { 57 | position: absolute; 58 | bottom: 0; 59 | left: 0; 60 | padding: 20px; 61 | box-sizing: border-box; 62 | display: none; 63 | max-height: 400px; 64 | overflow-y: auto; 65 | 66 | p { 67 | font-weight: 700; 68 | } 69 | 70 | @keyframes showDescription { 71 | from { 72 | opacity: 0; 73 | transform: translateY(50px); 74 | } 75 | 76 | to {} 77 | } 78 | animation: 0.3s showDescription backwards; 79 | } 80 | 81 | .social { 82 | list-style: none; 83 | 84 | li a { 85 | margin: 5px; 86 | width: 35px; 87 | height: 35px; 88 | border: 1px solid $color-white; 89 | border-radius: 50%; 90 | display: flex; 91 | justify-content: center; 92 | align-items: center; 93 | color: #fff; 94 | transition: 0.3s; 95 | 96 | &:hover { 97 | background: $color-white; 98 | color: $color-primary; 99 | } 100 | } 101 | } 102 | 103 | .rotate--box-title { 104 | position: relative; 105 | width: 100px; 106 | 107 | .box-title { 108 | position: absolute; 109 | left: -250px; 110 | top: 250px; 111 | transform: rotate(90deg); 112 | transition: 0.3s; 113 | } 114 | @media (max-width: 720px) { 115 | width: 100%; 116 | 117 | .box-title { 118 | text-align: center; 119 | margin-bottom: 0; 120 | margin-top: 100px; 121 | position: relative; 122 | left: 0; 123 | top: 0; 124 | transform: rotate(0deg); 125 | } 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /assets/sass/components/_sponsor.scss: -------------------------------------------------------------------------------- 1 | .diamond { 2 | max-width: 200px; 3 | } 4 | 5 | .gold { 6 | max-width: 175px; 7 | } 8 | 9 | .silver { 10 | max-width: 150px; 11 | } 12 | -------------------------------------------------------------------------------- /assets/sass/components/_support.scss: -------------------------------------------------------------------------------- 1 | .support--block { 2 | @extend .background-third; 3 | padding: 50px 0; 4 | position: relative; 5 | } 6 | 7 | .support--title { 8 | color: $color-dark; 9 | font-size: 40px; 10 | text-transform: uppercase; 11 | text-align: left; 12 | margin-bottom: 60px; 13 | } 14 | 15 | .support--type { 16 | color: $color-dark; 17 | font-size: 16px; 18 | text-transform: uppercase; 19 | text-align: left; 20 | } 21 | 22 | .support--list { 23 | display: flex; 24 | // justify-content: space-between; 25 | overflow-x: auto; 26 | } 27 | 28 | .support--item { 29 | padding: 20px; 30 | } 31 | 32 | .support--image { 33 | max-width: 150px; 34 | } 35 | -------------------------------------------------------------------------------- /assets/sass/main.scss: -------------------------------------------------------------------------------- 1 | @import "base/variables"; 2 | @import "base/reset"; 3 | @import "base/base"; 4 | @import "base/colors"; 5 | @import "base/text"; 6 | @import "base/layout"; 7 | @import "base/animations"; 8 | @import "base/form"; 9 | @import "base/buttons"; 10 | 11 | @import "components/support"; 12 | @import "components/speakers"; 13 | @import "components/sponsor"; 14 | 15 | // *::-webkit-scrollbar { 16 | // width: 1em; 17 | // } 18 | // 19 | // *::-webkit-scrollbar-track { 20 | // -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); 21 | // background: $color-dark; 22 | // } 23 | // 24 | // *::-webkit-scrollbar-thumb { 25 | // background-color: $color-primary; 26 | // box-shadow: inset 0px 0px 0px 3px $color-dark; 27 | // } 28 | -------------------------------------------------------------------------------- /components/README.md: -------------------------------------------------------------------------------- 1 | # COMPONENTS 2 | 3 | The components directory contains your Vue.js Components. 4 | Nuxt.js doesn't supercharge these components. 5 | 6 | **This directory is not required, you can delete it if you don't want to use it.** 7 | -------------------------------------------------------------------------------- /components/buytickets.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 22 | 23 | 74 | -------------------------------------------------------------------------------- /components/c4p.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 27 | 28 | 59 | -------------------------------------------------------------------------------- /components/footer.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 35 | 36 | 92 | -------------------------------------------------------------------------------- /components/header.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | 74 | 75 | 123 | -------------------------------------------------------------------------------- /components/menu.vue: -------------------------------------------------------------------------------- 1 | 53 | 54 | 101 | 102 | 218 | -------------------------------------------------------------------------------- /components/social-fixed.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 18 | 19 | 48 | -------------------------------------------------------------------------------- /layouts/README.md: -------------------------------------------------------------------------------- 1 | # LAYOUTS 2 | 3 | This directory contains your Application Layouts. 4 | 5 | More information about the usage of this directory in the documentation: 6 | https://nuxtjs.org/guide/views#layouts 7 | 8 | **This directory is not required, you can delete it if you don't want to use it.** 9 | -------------------------------------------------------------------------------- /layouts/default.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | 19 | 42 | -------------------------------------------------------------------------------- /middleware/README.md: -------------------------------------------------------------------------------- 1 | # MIDDLEWARE 2 | 3 | This directory contains your Application Middleware. 4 | The middleware lets you define custom function to be ran before rendering a page or a group of pages (layouts). 5 | 6 | More information about the usage of this directory in the documentation: 7 | https://nuxtjs.org/guide/routing#middleware 8 | 9 | **This directory is not required, you can delete it if you don't want to use it.** 10 | -------------------------------------------------------------------------------- /nuxt.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | router: { 3 | base: "/conf/" 4 | }, 5 | /* 6 | ** Headers of the page 7 | */ 8 | head: { 9 | title: "DevParaná Conference 2018", 10 | meta: [ 11 | { charset: "utf-8" }, 12 | { name: "viewport", content: "width=device-width, initial-scale=1" }, 13 | { 14 | hid: "description", 15 | name: "description", 16 | content: "Dev Paraná Conference 2018" 17 | } 18 | ], 19 | link: [ 20 | { rel: "icon", type: "image/x-icon", href: "/conf/favicon.ico" }, 21 | { 22 | rel: "stylesheet", 23 | href: "https://use.fontawesome.com/releases/v5.0.10/css/all.css" 24 | } 25 | ], 26 | script: [ 27 | { 28 | src: "https://cdnjs.cloudflare.com/ajax/libs/rellax/1.5.1/rellax.min.js" 29 | }, 30 | { 31 | src: 32 | "https://stc.pagseguro.uol.com.br/pagseguro/api/v2/checkout/pagseguro.lightbox.js" 33 | } 34 | ] 35 | }, 36 | css: [ 37 | { src: "@/assets/sass/main.scss", lang: "scss" }, 38 | { src: "node_modules/the-grid-flexbox/css/the-grid.min.css", lang: "css" }, 39 | { 40 | src: "node_modules/alerts-css/assets/css/alerts-css.min.css", 41 | lang: "css" 42 | } 43 | ], 44 | plugins: [ 45 | { src: "~plugins/smooth-scroll.js", ssr: false }, 46 | { src: "~plugins/ga.js", ssr: false }, 47 | { src: "~plugins/vue-countdown.js", ssr: false } 48 | ], 49 | /* 50 | ** Customize the progress bar color 51 | */ 52 | loading: { color: "#15a04b" }, 53 | /* 54 | ** Build configuration 55 | */ 56 | build: { 57 | /* 58 | ** Run ESLint on save 59 | */ 60 | extend(config, { isDev, isClient }) { 61 | if (isDev && isClient) { 62 | config.module.rules.push({ 63 | enforce: "pre", 64 | test: /\.(js|vue)$/, 65 | loader: "eslint-loader", 66 | exclude: /(node_modules)/ 67 | }); 68 | } 69 | config.module.rules.forEach(rule => { 70 | if (rule.test.toString() === "/\\.vue$/") { 71 | rule.options.loaders.scss[2].options.data = 72 | '@import "./assets/sass/base/variables.scss";@import "./assets/sass/base/colors.scss";'; 73 | } 74 | }); 75 | } 76 | }, 77 | modules: [ 78 | 'nuxt-facebook-pixel-module' 79 | ], 80 | facebook: { 81 | track: 'PageView', 82 | pixelId: '244754419595080' 83 | } 84 | }; 85 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "conf-2018", 3 | "version": "1.0.0", 4 | "description": "Dev Paraná Conference 2018", 5 | "private": true, 6 | "scripts": { 7 | "dev": "nuxt", 8 | "build": "nuxt build", 9 | "start-nuxt": "nuxt start", 10 | "start": "node server.js", 11 | "generate": "nuxt generate", 12 | "lint": "eslint --ext .js,.vue --ignore-path .gitignore .", 13 | "precommit": "npm run lint", 14 | "deploy": "push-dir --dir=dist --branch=gh-pages --cleanup", 15 | "heroku": "npm run build && npm run generate", 16 | "postinstall": "if [ $BUILD ]; then npm run heroku; fi" 17 | }, 18 | "engines": { 19 | "node": "8.x" 20 | }, 21 | "main": "index.js", 22 | "author": "Leonardo Elias ", 23 | "contributors": [ 24 | { 25 | "name": "Gustavo Quinalha", 26 | "email": "gusquinalha@gmail.com" 27 | } 28 | ], 29 | "dependencies": { 30 | "@xkeshi/vue-countdown": "^0.6.0", 31 | "alerts-css": "^1.0.2", 32 | "express": "^4.16.3", 33 | "nuxt": "^1.0.0", 34 | "nuxt-facebook-pixel-module": "^1.0.0", 35 | "push-dir": "^0.4.1", 36 | "vee-validate": "^2.0.9" 37 | }, 38 | "devDependencies": { 39 | "@gustavoquinalha/buttons-css": "^1.0.1", 40 | "babel-eslint": "^8.2.1", 41 | "eslint": "^4.15.0", 42 | "eslint-friendly-formatter": "^3.0.0", 43 | "eslint-loader": "^1.7.1", 44 | "eslint-plugin-vue": "^4.2.2", 45 | "node-sass": "^4.7.2", 46 | "sass-loader": "^6.0.6", 47 | "the-grid-flexbox": "^2.0.1" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /pages/README.md: -------------------------------------------------------------------------------- 1 | # PAGES 2 | 3 | This directory contains your Application Views and Routes. 4 | The framework reads all the .vue files inside this directory and creates the router of your application. 5 | 6 | More information about the usage of this directory in the documentation: 7 | https://nuxtjs.org/guide/routing 8 | -------------------------------------------------------------------------------- /pages/home/components/about.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 25 | 26 | 58 | -------------------------------------------------------------------------------- /pages/home/components/call4papers.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 71 | -------------------------------------------------------------------------------- /pages/home/components/contact.vue: -------------------------------------------------------------------------------- 1 | 128 | 129 | 189 | 190 | 224 | -------------------------------------------------------------------------------- /pages/home/components/location.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 45 | 46 | 68 | -------------------------------------------------------------------------------- /pages/home/components/schedule.vue: -------------------------------------------------------------------------------- 1 | 35 | 36 | 53 | 54 | 110 | -------------------------------------------------------------------------------- /pages/home/components/speakers.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 59 | 60 | 62 | -------------------------------------------------------------------------------- /pages/home/components/sponsors.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 44 | -------------------------------------------------------------------------------- /pages/home/components/support.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 30 | 31 | 34 | -------------------------------------------------------------------------------- /pages/home/components/tickets.vue: -------------------------------------------------------------------------------- 1 | 67 | 68 | 91 | 92 | 283 | -------------------------------------------------------------------------------- /pages/home/components/users.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 25 | 30 | -------------------------------------------------------------------------------- /pages/index.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 45 | 46 | 53 | -------------------------------------------------------------------------------- /pages/palestrantes/_id.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 59 | 60 | 63 | -------------------------------------------------------------------------------- /pages/styleguide/index.vue: -------------------------------------------------------------------------------- 1 | 96 | 97 | 100 | 101 | 123 | -------------------------------------------------------------------------------- /plugins/README.md: -------------------------------------------------------------------------------- 1 | # PLUGINS 2 | 3 | This directory contains your Javascript plugins that you want to run before instantiating the root vue.js application. 4 | 5 | More information about the usage of this directory in the documentation: 6 | https://nuxtjs.org/guide/plugins 7 | 8 | **This directory is not required, you can delete it if you don't want to use it.** 9 | -------------------------------------------------------------------------------- /plugins/ga.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | export default ({ app }) => { 4 | /* 5 | ** Only run on client-side and only in production mode 6 | */ 7 | if (process.env.NODE_ENV !== 'production') return 8 | /* 9 | ** Include Google Analytics Script 10 | */ 11 | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 12 | (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 13 | m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 14 | })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); 15 | /* 16 | ** Set the current page 17 | */ 18 | ga('create', 'UA-69209115-4', 'auto') 19 | /* 20 | ** Every time the route changes (fired on initialization too) 21 | */ 22 | app.router.afterEach((to, from) => { 23 | /* 24 | ** We tell Google Analytics to add a `pageview` 25 | */ 26 | ga('set', 'page', to.fullPath) 27 | ga('send', 'pageview') 28 | }) 29 | } 30 | -------------------------------------------------------------------------------- /plugins/rellax.js: -------------------------------------------------------------------------------- 1 | 2 | // ------------------------------------------ 3 | // Rellax.js 4 | // Buttery smooth parallax library 5 | // Copyright (c) 2016 Moe Amaya (@moeamaya) 6 | // MIT license 7 | // 8 | // Thanks to Paraxify.js and Jaime Cabllero 9 | // for parallax concepts 10 | // ------------------------------------------ 11 | 12 | (function (root, factory) { 13 | if (typeof define === 'function' && define.amd) { 14 | // AMD. Register as an anonymous module. 15 | define([], factory); 16 | } else if (typeof module === 'object' && module.exports) { 17 | // Node. Does not work with strict CommonJS, but 18 | // only CommonJS-like environments that support module.exports, 19 | // like Node. 20 | module.exports = factory(); 21 | } else { 22 | // Browser globals (root is window) 23 | root.Rellax = factory(); 24 | } 25 | }(this, function () { 26 | var Rellax = function(el, options){ 27 | "use strict"; 28 | 29 | var self = Object.create(Rellax.prototype); 30 | 31 | var posY = 0; 32 | var screenY = 0; 33 | var posX = 0; 34 | var screenX = 0; 35 | var blocks = []; 36 | var pause = false; 37 | 38 | // check what requestAnimationFrame to use, and if 39 | // it's not supported, use the onscroll event 40 | var loop = window.requestAnimationFrame || 41 | window.webkitRequestAnimationFrame || 42 | window.mozRequestAnimationFrame || 43 | window.msRequestAnimationFrame || 44 | window.oRequestAnimationFrame || 45 | function(callback){ setTimeout(callback, 1000 / 60); }; 46 | 47 | // check which transform property to use 48 | var transformProp = window.transformProp || (function(){ 49 | var testEl = document.createElement('div'); 50 | if (testEl.style.transform === null) { 51 | var vendors = ['Webkit', 'Moz', 'ms']; 52 | for (var vendor in vendors) { 53 | if (testEl.style[ vendors[vendor] + 'Transform' ] !== undefined) { 54 | return vendors[vendor] + 'Transform'; 55 | } 56 | } 57 | } 58 | return 'transform'; 59 | })(); 60 | 61 | // Default Settings 62 | self.options = { 63 | speed: -2, 64 | center: false, 65 | round: true, 66 | vertical: true, 67 | horizontal: false, 68 | callback: function() {}, 69 | }; 70 | 71 | // User defined options (might have more in the future) 72 | if (options){ 73 | Object.keys(options).forEach(function(key){ 74 | self.options[key] = options[key]; 75 | }); 76 | } 77 | 78 | // By default, rellax class 79 | if (!el) { 80 | el = '.rellax'; 81 | } 82 | 83 | // check if el is a className or a node 84 | var elements = typeof el === 'string' ? document.querySelectorAll(el) : [el]; 85 | 86 | // Now query selector 87 | if (elements.length > 0) { 88 | self.elems = elements; 89 | } 90 | 91 | // The elements don't exist 92 | else { 93 | throw new Error("The elements you're trying to select don't exist."); 94 | } 95 | 96 | // Let's kick this script off 97 | // Build array for cached element values 98 | var init = function() { 99 | for (var i = 0; i < blocks.length; i++){ 100 | self.elems[i].style.cssText = blocks[i].style; 101 | } 102 | 103 | blocks = []; 104 | 105 | screenY = window.innerHeight; 106 | screenX = window.innerWidth; 107 | setPosition(); 108 | 109 | // Get and cache initial position of all elements 110 | for (var i = 0; i < self.elems.length; i++){ 111 | var block = createBlock(self.elems[i]); 112 | blocks.push(block); 113 | } 114 | 115 | animate(); 116 | }; 117 | 118 | // We want to cache the parallax blocks' 119 | // values: base, top, height, speed 120 | // el: is dom object, return: el cache values 121 | var createBlock = function(el) { 122 | var dataPercentage = el.getAttribute( 'data-rellax-percentage' ); 123 | var dataSpeed = el.getAttribute( 'data-rellax-speed' ); 124 | var dataZindex = el.getAttribute( 'data-rellax-zindex' ) || 0; 125 | 126 | // initializing at scrollY = 0 (top of browser), scrollX = 0 (left of browser) 127 | // ensures elements are positioned based on HTML layout. 128 | // 129 | // If the element has the percentage attribute, the posY and posX needs to be 130 | // the current scroll position's value, so that the elements are still positioned based on HTML layout 131 | var posY = self.options.vertical ? ( dataPercentage || self.options.center ? (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop) : 0 ) : 0; 132 | var posX = self.options.horizontal ? ( dataPercentage || self.options.center ? (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft) : 0 ) : 0; 133 | 134 | var blockTop = posY + el.getBoundingClientRect().top; 135 | var blockHeight = el.clientHeight || el.offsetHeight || el.scrollHeight; 136 | 137 | var blockLeft = posX + el.getBoundingClientRect().left; 138 | var blockWidth = el.clientWidth || el.offsetWidth || el.scrollWidth; 139 | 140 | // apparently parallax equation everyone uses 141 | var percentageY = dataPercentage ? dataPercentage : (posY - blockTop + screenY) / (blockHeight + screenY); 142 | var percentageX = dataPercentage ? dataPercentage : (posX - blockLeft + screenX) / (blockWidth + screenX); 143 | if(self.options.center){ percentageX = 0.5; percentageY = 0.5; } 144 | 145 | // Optional individual block speed as data attr, otherwise global speed 146 | var speed = dataSpeed ? dataSpeed : self.options.speed; 147 | 148 | var bases = updatePosition(percentageX, percentageY, speed); 149 | 150 | // ~~Store non-translate3d transforms~~ 151 | // Store inline styles and extract transforms 152 | var style = el.style.cssText; 153 | var transform = ''; 154 | 155 | // Check if there's an inline styled transform 156 | if (style.indexOf('transform') >= 0) { 157 | // Get the index of the transform 158 | var index = style.indexOf('transform'); 159 | 160 | // Trim the style to the transform point and get the following semi-colon index 161 | var trimmedStyle = style.slice(index); 162 | var delimiter = trimmedStyle.indexOf(';'); 163 | 164 | // Remove "transform" string and save the attribute 165 | if (delimiter) { 166 | transform = " " + trimmedStyle.slice(11, delimiter).replace(/\s/g,''); 167 | } else { 168 | transform = " " + trimmedStyle.slice(11).replace(/\s/g,''); 169 | } 170 | } 171 | 172 | return { 173 | baseX: bases.x, 174 | baseY: bases.y, 175 | top: blockTop, 176 | left: blockLeft, 177 | height: blockHeight, 178 | width: blockWidth, 179 | speed: speed, 180 | style: style, 181 | transform: transform, 182 | zindex: dataZindex 183 | }; 184 | }; 185 | 186 | // set scroll position (posY, posX) 187 | // side effect method is not ideal, but okay for now 188 | // returns true if the scroll changed, false if nothing happened 189 | var setPosition = function() { 190 | var oldY = posY; 191 | var oldX = posX; 192 | 193 | posY = (document.documentElement || document.body.parentNode || document.body).scrollTop || window.pageYOffset; 194 | 195 | posX = (document.documentElement || document.body.parentNode || document.body).scrollLeft || window.pageXOffset; 196 | 197 | if (oldY != posY && self.options.vertical) { 198 | // scroll changed, return true 199 | return true; 200 | } 201 | 202 | if (oldX != posX && self.options.horizontal) { 203 | // scroll changed, return true 204 | return true; 205 | } 206 | 207 | // scroll did not change 208 | return false; 209 | }; 210 | 211 | // Ahh a pure function, gets new transform value 212 | // based on scrollPosition and speed 213 | // Allow for decimal pixel values 214 | var updatePosition = function(percentageX, percentageY, speed) { 215 | var result = {}; 216 | var valueX = (speed * (100 * (1 - percentageX))); 217 | var valueY = (speed * (100 * (1 - percentageY))); 218 | 219 | result.x = self.options.round ? Math.round(valueX) : Math.round(valueX * 100) / 100; 220 | result.y = self.options.round ? Math.round(valueY) : Math.round(valueY * 100) / 100; 221 | 222 | return result; 223 | }; 224 | 225 | // Loop 226 | var update = function() { 227 | if (setPosition() && pause === false) { 228 | animate(); 229 | } 230 | 231 | // loop again 232 | loop(update); 233 | }; 234 | 235 | // Transform3d on parallax element 236 | var animate = function() { 237 | var positions; 238 | for (var i = 0; i < self.elems.length; i++){ 239 | var percentageY = ((posY - blocks[i].top + screenY) / (blocks[i].height + screenY)); 240 | var percentageX = ((posX - blocks[i].left + screenX) / (blocks[i].width + screenX)); 241 | 242 | // Subtracting initialize value, so element stays in same spot as HTML 243 | positions = updatePosition(percentageX, percentageY, blocks[i].speed);// - blocks[i].baseX; 244 | var positionY = positions.y - blocks[i].baseY; 245 | var positionX = positions.x - blocks[i].baseX; 246 | 247 | var zindex = blocks[i].zindex; 248 | 249 | // Move that element 250 | // (Set the new translation and append initial inline transforms.) 251 | var translate = 'translate3d(' + (self.options.horizontal ? positionX : '0') + 'px,' + (self.options.vertical ? positionY : '0') + 'px,' + zindex + 'px) ' + blocks[i].transform; 252 | self.elems[i].style[transformProp] = translate; 253 | } 254 | self.options.callback(positions); 255 | }; 256 | 257 | self.destroy = function() { 258 | for (var i = 0; i < self.elems.length; i++){ 259 | self.elems[i].style.cssText = blocks[i].style; 260 | } 261 | pause = true; 262 | }; 263 | 264 | // Init 265 | init(); 266 | 267 | // Re-init on window resize 268 | window.addEventListener('resize', function() { 269 | init(); 270 | }); 271 | 272 | // Start the loop 273 | update(); 274 | 275 | // Allow to recalculate the initial values whenever we want 276 | self.refresh = init; 277 | 278 | return self; 279 | }; 280 | return Rellax; 281 | })); 282 | -------------------------------------------------------------------------------- /plugins/smooth-scroll.js: -------------------------------------------------------------------------------- 1 | (function (root, factory) { 2 | if ( typeof define === 'function' && define.amd ) { 3 | define([], function () { 4 | return factory(root); 5 | }); 6 | } else if ( typeof exports === 'object' ) { 7 | module.exports = factory(root); 8 | } else { 9 | root.SmoothScroll = factory(root); 10 | } 11 | })(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, function (window) { 12 | 13 | 'use strict'; 14 | 15 | // 16 | // Feature Test 17 | // 18 | 19 | var supports = 20 | 'querySelector' in document && 21 | 'addEventListener' in window && 22 | 'requestAnimationFrame' in window && 23 | 'closest' in window.Element.prototype; 24 | 25 | 26 | // 27 | // Default settings 28 | // 29 | 30 | var defaults = { 31 | // Selectors 32 | ignore: '[data-scroll-ignore]', 33 | header: null, 34 | 35 | // Speed & Easing 36 | speed: 500, 37 | offset: 0, 38 | easing: 'easeInOutCubic', 39 | customEasing: null, 40 | 41 | // Callback API 42 | before: function () {}, 43 | after: function () {} 44 | }; 45 | 46 | 47 | // 48 | // Utility Methods 49 | // 50 | 51 | /** 52 | * Merge two or more objects. Returns a new object. 53 | * @param {Object} objects The objects to merge together 54 | * @returns {Object} Merged values of defaults and options 55 | */ 56 | var extend = function () { 57 | 58 | // Variables 59 | var extended = {}; 60 | var i = 0; 61 | var length = arguments.length; 62 | 63 | // Merge the object into the extended object 64 | var merge = function (obj) { 65 | for (var prop in obj) { 66 | if (obj.hasOwnProperty(prop)) { 67 | extended[prop] = obj[prop]; 68 | } 69 | } 70 | }; 71 | 72 | // Loop through each object and conduct a merge 73 | for ( ; i < length; i++ ) { 74 | var obj = arguments[i]; 75 | merge(obj); 76 | } 77 | 78 | return extended; 79 | 80 | }; 81 | 82 | /** 83 | * Get the height of an element. 84 | * @param {Node} elem The element to get the height of 85 | * @return {Number} The element's height in pixels 86 | */ 87 | var getHeight = function (elem) { 88 | return parseInt(window.getComputedStyle(elem).height, 10); 89 | }; 90 | 91 | /** 92 | * Escape special characters for use with querySelector 93 | * @param {String} id The anchor ID to escape 94 | * @author Mathias Bynens 95 | * @link https://github.com/mathiasbynens/CSS.escape 96 | */ 97 | var escapeCharacters = function (id) { 98 | 99 | // Remove leading hash 100 | if (id.charAt(0) === '#') { 101 | id = id.substr(1); 102 | } 103 | 104 | var string = String(id); 105 | var length = string.length; 106 | var index = -1; 107 | var codeUnit; 108 | var result = ''; 109 | var firstCodeUnit = string.charCodeAt(0); 110 | while (++index < length) { 111 | codeUnit = string.charCodeAt(index); 112 | // Note: there’s no need to special-case astral symbols, surrogate 113 | // pairs, or lone surrogates. 114 | 115 | // If the character is NULL (U+0000), then throw an 116 | // `InvalidCharacterError` exception and terminate these steps. 117 | if (codeUnit === 0x0000) { 118 | throw new InvalidCharacterError( 119 | 'Invalid character: the input contains U+0000.' 120 | ); 121 | } 122 | 123 | if ( 124 | // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is 125 | // U+007F, […] 126 | (codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F || 127 | // If the character is the first character and is in the range [0-9] 128 | // (U+0030 to U+0039), […] 129 | (index === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) || 130 | // If the character is the second character and is in the range [0-9] 131 | // (U+0030 to U+0039) and the first character is a `-` (U+002D), […] 132 | ( 133 | index === 1 && 134 | codeUnit >= 0x0030 && codeUnit <= 0x0039 && 135 | firstCodeUnit === 0x002D 136 | ) 137 | ) { 138 | // http://dev.w3.org/csswg/cssom/#escape-a-character-as-code-point 139 | result += '\\' + codeUnit.toString(16) + ' '; 140 | continue; 141 | } 142 | 143 | // If the character is not handled by one of the above rules and is 144 | // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or 145 | // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to 146 | // U+005A), or [a-z] (U+0061 to U+007A), […] 147 | if ( 148 | codeUnit >= 0x0080 || 149 | codeUnit === 0x002D || 150 | codeUnit === 0x005F || 151 | codeUnit >= 0x0030 && codeUnit <= 0x0039 || 152 | codeUnit >= 0x0041 && codeUnit <= 0x005A || 153 | codeUnit >= 0x0061 && codeUnit <= 0x007A 154 | ) { 155 | // the character itself 156 | result += string.charAt(index); 157 | continue; 158 | } 159 | 160 | // Otherwise, the escaped character. 161 | // http://dev.w3.org/csswg/cssom/#escape-a-character 162 | result += '\\' + string.charAt(index); 163 | 164 | } 165 | 166 | return '#' + result; 167 | 168 | }; 169 | 170 | /** 171 | * Calculate the easing pattern 172 | * @link https://gist.github.com/gre/1650294 173 | * @param {String} type Easing pattern 174 | * @param {Number} time Time animation should take to complete 175 | * @returns {Number} 176 | */ 177 | var easingPattern = function (settings, time) { 178 | var pattern; 179 | 180 | // Default Easing Patterns 181 | if (settings.easing === 'easeInQuad') pattern = time * time; // accelerating from zero velocity 182 | if (settings.easing === 'easeOutQuad') pattern = time * (2 - time); // decelerating to zero velocity 183 | if (settings.easing === 'easeInOutQuad') pattern = time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time; // acceleration until halfway, then deceleration 184 | if (settings.easing === 'easeInCubic') pattern = time * time * time; // accelerating from zero velocity 185 | if (settings.easing === 'easeOutCubic') pattern = (--time) * time * time + 1; // decelerating to zero velocity 186 | if (settings.easing === 'easeInOutCubic') pattern = time < 0.5 ? 4 * time * time * time : (time - 1) * (2 * time - 2) * (2 * time - 2) + 1; // acceleration until halfway, then deceleration 187 | if (settings.easing === 'easeInQuart') pattern = time * time * time * time; // accelerating from zero velocity 188 | if (settings.easing === 'easeOutQuart') pattern = 1 - (--time) * time * time * time; // decelerating to zero velocity 189 | if (settings.easing === 'easeInOutQuart') pattern = time < 0.5 ? 8 * time * time * time * time : 1 - 8 * (--time) * time * time * time; // acceleration until halfway, then deceleration 190 | if (settings.easing === 'easeInQuint') pattern = time * time * time * time * time; // accelerating from zero velocity 191 | if (settings.easing === 'easeOutQuint') pattern = 1 + (--time) * time * time * time * time; // decelerating to zero velocity 192 | if (settings.easing === 'easeInOutQuint') pattern = time < 0.5 ? 16 * time * time * time * time * time : 1 + 16 * (--time) * time * time * time * time; // acceleration until halfway, then deceleration 193 | 194 | // Custom Easing Patterns 195 | if (!!settings.customEasing) pattern = settings.customEasing(time); 196 | 197 | return pattern || time; // no easing, no acceleration 198 | }; 199 | 200 | /** 201 | * Determine the document's height 202 | * @returns {Number} 203 | */ 204 | var getDocumentHeight = function () { 205 | return Math.max( 206 | document.body.scrollHeight, document.documentElement.scrollHeight, 207 | document.body.offsetHeight, document.documentElement.offsetHeight, 208 | document.body.clientHeight, document.documentElement.clientHeight 209 | ); 210 | }; 211 | 212 | /** 213 | * Calculate how far to scroll 214 | * @param {Element} anchor The anchor element to scroll to 215 | * @param {Number} headerHeight Height of a fixed header, if any 216 | * @param {Number} offset Number of pixels by which to offset scroll 217 | * @returns {Number} 218 | */ 219 | var getEndLocation = function (anchor, headerHeight, offset) { 220 | var location = 0; 221 | if (anchor.offsetParent) { 222 | do { 223 | location += anchor.offsetTop; 224 | anchor = anchor.offsetParent; 225 | } while (anchor); 226 | } 227 | location = Math.max(location - headerHeight - offset, 0); 228 | return location; 229 | }; 230 | 231 | /** 232 | * Get the height of the fixed header 233 | * @param {Node} header The header 234 | * @return {Number} The height of the header 235 | */ 236 | var getHeaderHeight = function (header) { 237 | return !header ? 0 : (getHeight(header) + header.offsetTop); 238 | }; 239 | 240 | /** 241 | * Bring the anchored element into focus 242 | * @param {Node} anchor The anchor element 243 | * @param {Number} endLocation The end location to scroll to 244 | * @param {Boolean} isNum If true, scroll is to a position rather than an element 245 | */ 246 | var adjustFocus = function (anchor, endLocation, isNum) { 247 | 248 | // Don't run if scrolling to a number on the page 249 | if (isNum) return; 250 | 251 | // Otherwise, bring anchor element into focus 252 | anchor.focus(); 253 | if (document.activeElement.id !== anchor.id) { 254 | anchor.setAttribute('tabindex', '-1'); 255 | anchor.focus(); 256 | anchor.style.outline = 'none'; 257 | } 258 | window.scrollTo(0 , endLocation); 259 | 260 | }; 261 | 262 | /** 263 | * Check to see if user prefers reduced motion 264 | * @param {Object} settings Script settings 265 | */ 266 | var reduceMotion = function (settings) { 267 | if ('matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches) { 268 | return true; 269 | } 270 | return false; 271 | }; 272 | 273 | 274 | // 275 | // SmoothScroll Constructor 276 | // 277 | 278 | var SmoothScroll = function (selector, options) { 279 | 280 | // 281 | // Variables 282 | // 283 | 284 | var smoothScroll = {}; // Object for public APIs 285 | var settings, anchor, toggle, fixedHeader, headerHeight, eventTimeout, animationInterval; 286 | 287 | 288 | // 289 | // Methods 290 | // 291 | 292 | /** 293 | * Cancel a scroll-in-progress 294 | */ 295 | smoothScroll.cancelScroll = function () { 296 | // clearInterval(animationInterval); 297 | cancelAnimationFrame(animationInterval); 298 | }; 299 | 300 | /** 301 | * Start/stop the scrolling animation 302 | * @param {Node|Number} anchor The element or position to scroll to 303 | * @param {Element} toggle The element that toggled the scroll event 304 | * @param {Object} options 305 | */ 306 | smoothScroll.animateScroll = function (anchor, toggle, options) { 307 | 308 | // Local settings 309 | var animateSettings = extend(settings || defaults, options || {}); // Merge user options with defaults 310 | 311 | // Selectors and variables 312 | var isNum = Object.prototype.toString.call(anchor) === '[object Number]' ? true : false; 313 | var anchorElem = isNum || !anchor.tagName ? null : anchor; 314 | if (!isNum && !anchorElem) return; 315 | var startLocation = window.pageYOffset; // Current location on the page 316 | if (animateSettings.header && !fixedHeader) { 317 | // Get the fixed header if not already set 318 | fixedHeader = document.querySelector( animateSettings.header ); 319 | } 320 | if (!headerHeight) { 321 | // Get the height of a fixed header if one exists and not already set 322 | headerHeight = getHeaderHeight(fixedHeader); 323 | } 324 | var endLocation = isNum ? anchor : getEndLocation(anchorElem, headerHeight, parseInt((typeof animateSettings.offset === 'function' ? animateSettings.offset() : animateSettings.offset), 10)); // Location to scroll to 325 | var distance = endLocation - startLocation; // distance to travel 326 | var documentHeight = getDocumentHeight(); 327 | var timeLapsed = 0; 328 | var start, percentage, position; 329 | 330 | /** 331 | * Stop the scroll animation when it reaches its target (or the bottom/top of page) 332 | * @param {Number} position Current position on the page 333 | * @param {Number} endLocation Scroll to location 334 | * @param {Number} animationInterval How much to scroll on this loop 335 | */ 336 | var stopAnimateScroll = function (position, endLocation) { 337 | 338 | // Get the current location 339 | var currentLocation = window.pageYOffset; 340 | 341 | // Check if the end location has been reached yet (or we've hit the end of the document) 342 | if ( position == endLocation || currentLocation == endLocation || ((startLocation < endLocation && window.innerHeight + currentLocation) >= documentHeight )) { 343 | 344 | // Clear the animation timer 345 | smoothScroll.cancelScroll(); 346 | 347 | // Bring the anchored element into focus 348 | adjustFocus(anchor, endLocation, isNum); 349 | 350 | // Run callback after animation complete 351 | animateSettings.after(anchor, toggle); 352 | 353 | // Reset start 354 | start = null; 355 | 356 | return true; 357 | 358 | } 359 | }; 360 | 361 | /** 362 | * Loop scrolling animation 363 | */ 364 | var loopAnimateScroll = function (timestamp) { 365 | if (!start) { start = timestamp; } 366 | timeLapsed += timestamp - start; 367 | percentage = (timeLapsed / parseInt(animateSettings.speed, 10)); 368 | percentage = (percentage > 1) ? 1 : percentage; 369 | position = startLocation + (distance * easingPattern(animateSettings, percentage)); 370 | window.scrollTo(0, Math.floor(position)); 371 | if (!stopAnimateScroll(position, endLocation)) { 372 | window.requestAnimationFrame(loopAnimateScroll); 373 | start = timestamp; 374 | } 375 | }; 376 | 377 | /** 378 | * Reset position to fix weird iOS bug 379 | * @link https://github.com/cferdinandi/smooth-scroll/issues/45 380 | */ 381 | if (window.pageYOffset === 0) { 382 | window.scrollTo( 0, 0 ); 383 | } 384 | 385 | // Run callback before animation starts 386 | animateSettings.before(anchor, toggle); 387 | 388 | // Start scrolling animation 389 | smoothScroll.cancelScroll(); 390 | window.requestAnimationFrame(loopAnimateScroll); 391 | 392 | 393 | }; 394 | 395 | /** 396 | * Handle has change event 397 | */ 398 | var hashChangeHandler = function (event) { 399 | 400 | // Only run if there's an anchor element to scroll to 401 | if (!anchor) return; 402 | 403 | // Reset the anchor element's ID 404 | anchor.id = anchor.getAttribute('data-scroll-id'); 405 | 406 | // Scroll to the anchored content 407 | smoothScroll.animateScroll(anchor, toggle); 408 | 409 | // Reset anchor and toggle 410 | anchor = null; 411 | toggle = null; 412 | 413 | }; 414 | 415 | /** 416 | * If smooth scroll element clicked, animate scroll 417 | */ 418 | var clickHandler = function (event) { 419 | 420 | // Don't run if the user prefers reduced motion 421 | if (reduceMotion(settings)) return; 422 | 423 | // Don't run if right-click or command/control + click 424 | if (event.button !== 0 || event.metaKey || event.ctrlKey) return; 425 | 426 | // Check if a smooth scroll link was clicked 427 | toggle = event.target.closest(selector); 428 | if (!toggle || toggle.tagName.toLowerCase() !== 'a' || event.target.closest(settings.ignore)) return; 429 | 430 | // Only run if link is an anchor and points to the current page 431 | if (toggle.hostname !== window.location.hostname || toggle.pathname !== window.location.pathname || !/#/.test(toggle.href)) return; 432 | 433 | // Get the sanitized hash 434 | var hash; 435 | try { 436 | hash = escapeCharacters(decodeURIComponent(toggle.hash)); 437 | } catch(e) { 438 | hash = escapeCharacters(toggle.hash); 439 | } 440 | 441 | // If the hash is empty, scroll to the top of the page 442 | if (hash === '#') { 443 | 444 | // Prevent default link behavior 445 | event.preventDefault(); 446 | 447 | // Set the anchored element 448 | anchor = document.body; 449 | 450 | // Save or create the ID as a data attribute and remove it (prevents scroll jump) 451 | var id = anchor.id ? anchor.id : 'smooth-scroll-top'; 452 | anchor.setAttribute('data-scroll-id', id); 453 | anchor.id = ''; 454 | 455 | // If no hash change event will happen, fire manually 456 | // Otherwise, update the hash 457 | if (window.location.hash.substring(1) === id) { 458 | hashChangeHandler(); 459 | } else { 460 | window.location.hash = id; 461 | } 462 | 463 | return; 464 | 465 | } 466 | 467 | // Get the anchored element 468 | anchor = document.querySelector(hash); 469 | 470 | // If anchored element exists, save the ID as a data attribute and remove it (prevents scroll jump) 471 | if (!anchor) return; 472 | anchor.setAttribute('data-scroll-id', anchor.id); 473 | anchor.id = ''; 474 | 475 | // If no hash change event will happen, fire manually 476 | if (toggle.hash === window.location.hash) { 477 | event.preventDefault(); 478 | hashChangeHandler(); 479 | } 480 | 481 | }; 482 | 483 | /** 484 | * On window scroll and resize, only run events at a rate of 15fps for better performance 485 | */ 486 | var resizeThrottler = function (event) { 487 | if (!eventTimeout) { 488 | eventTimeout = setTimeout(function() { 489 | eventTimeout = null; // Reset timeout 490 | headerHeight = getHeaderHeight(fixedHeader); // Get the height of a fixed header if one exists 491 | }, 66); 492 | } 493 | }; 494 | 495 | /** 496 | * Destroy the current initialization. 497 | */ 498 | smoothScroll.destroy = function () { 499 | 500 | // If plugin isn't already initialized, stop 501 | if (!settings) return; 502 | 503 | // Remove event listeners 504 | document.removeEventListener('click', clickHandler, false); 505 | window.removeEventListener('resize', resizeThrottler, false); 506 | 507 | // Cancel any scrolls-in-progress 508 | smoothScroll.cancelScroll(); 509 | 510 | // Reset variables 511 | settings = null; 512 | anchor = null; 513 | toggle = null; 514 | fixedHeader = null; 515 | headerHeight = null; 516 | eventTimeout = null; 517 | animationInterval = null; 518 | }; 519 | 520 | /** 521 | * Initialize Smooth Scroll 522 | * @param {Object} options User settings 523 | */ 524 | smoothScroll.init = function (options) { 525 | 526 | // feature test 527 | if (!supports) return; 528 | 529 | // Destroy any existing initializations 530 | smoothScroll.destroy(); 531 | 532 | // Selectors and variables 533 | settings = extend(defaults, options || {}); // Merge user options with defaults 534 | fixedHeader = settings.header ? document.querySelector(settings.header) : null; // Get the fixed header 535 | headerHeight = getHeaderHeight(fixedHeader); 536 | 537 | // When a toggle is clicked, run the click handler 538 | document.addEventListener('click', clickHandler, false); 539 | 540 | // Listen for hash changes 541 | window.addEventListener('hashchange', hashChangeHandler, false); 542 | 543 | // If window is resized and there's a fixed header, recalculate its size 544 | if (fixedHeader) { 545 | window.addEventListener('resize', resizeThrottler, false); 546 | } 547 | 548 | }; 549 | 550 | 551 | // 552 | // Initialize plugin 553 | // 554 | 555 | smoothScroll.init(options); 556 | 557 | 558 | // 559 | // Public APIs 560 | // 561 | 562 | return smoothScroll; 563 | 564 | }; 565 | 566 | return SmoothScroll; 567 | 568 | }); 569 | -------------------------------------------------------------------------------- /plugins/vue-countdown.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import VueCountdown from "@xkeshi/vue-countdown"; 3 | 4 | Vue.component("countdown", VueCountdown); 5 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const app = express() 3 | const path = require('path') 4 | 5 | app.use('/conf', express.static(path.join(__dirname, '/dist'))) 6 | app.all('/', (req, res, next) => { 7 | res.redirect('/conf') 8 | next() 9 | }) 10 | 11 | app.listen(process.env.PORT || 3000, () => console.log(`Listening on port ${process.env.PORT || 3000}`)) 12 | -------------------------------------------------------------------------------- /static/README.md: -------------------------------------------------------------------------------- 1 | # STATIC 2 | 3 | This directory contains your static files. 4 | Each file inside this directory is mapped to /. 5 | 6 | Example: /static/robots.txt is mapped as /robots.txt. 7 | 8 | More information about the usage of this directory in the documentation: 9 | https://nuxtjs.org/guide/assets#static 10 | 11 | **This directory is not required, you can delete it if you don't want to use it.** 12 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/static/favicon.ico -------------------------------------------------------------------------------- /static/pdf/mediakit-en.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/static/pdf/mediakit-en.pdf -------------------------------------------------------------------------------- /static/pdf/mediakit.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DeveloperParana/conf-2018/257f60f899b78d93b8f8b9744d4a02e9c7e4ab53/static/pdf/mediakit.pdf -------------------------------------------------------------------------------- /store/README.md: -------------------------------------------------------------------------------- 1 | # STORE 2 | 3 | This directory contains your Vuex Store files. 4 | Vuex Store option is implemented in the Nuxt.js framework. 5 | Creating a index.js file in this directory activate the option in the framework automatically. 6 | 7 | More information about the usage of this directory in the documentation: 8 | https://nuxtjs.org/guide/vuex-store 9 | 10 | **This directory is not required, you can delete it if you don't want to use it.** 11 | -------------------------------------------------------------------------------- /store/index.js: -------------------------------------------------------------------------------- 1 | export const state = () => ({ 2 | speakers: [{ 3 | id: 1, 4 | name: 'Elder Moraes', 5 | image: 'elder', 6 | role: 'Oracle, São Paulo/SP - Brasil', 7 | description: 'Apaixonado por arquitetura de software, cloud e Java EE, ele compartilha suas experiências através de conteúdo online e eventos internacionais como JavaOne, TDC, Oracle Code e Campus Party.', 8 | twitter: 'https://twitter.com/@elderjava', 9 | github: 'https://github.com/eldermoraes', 10 | linkedin: 'https://br.linkedin.com/in/eldermoraes' 11 | }, { 12 | id: 2, 13 | name: 'Turicas (aka Álvaro Justen)', 14 | image: 'turicas', 15 | role: 'Curitiba/PR - Brasil', 16 | description: 'Turicas (aka Álvaro Justen) é programador, professor, hipnotista e dependente químico de cafés especiais.', 17 | twitter: 'https://twitter.com/turicas', 18 | github: 'https://github.com/turicas' 19 | },{ 20 | id: 3, 21 | name: 'Guilherme Souza', 22 | image: 'guilherme', 23 | role: 'São Paulo/SP - Brasil', 24 | description: 'CTO na Revmob e tem 10 anos de experiência com EcmaScript' 25 | },{ 26 | id: 4, 27 | name: 'Carlos dos Santos', 28 | image: 'carlos', 29 | role: 'Cornélio Procópio/PR - Brasil', 30 | description: `Sócio fundador da CDS Informática, moderador das traduções do site MSDN e WIKI, Microsoft MVP desde 2008, Ganhou o prêmio Advisory Council Member Top Award 2012, Membro fundador do projeto Code Cracker (www.github.com/code-cracker)`, 31 | twitter: 'https://twitter.com/cdssoftware', 32 | facebook: 'https://facebook.com/carloscds', 33 | github: 'https://github.com/carloscds' 34 | }, 35 | { 36 | id: 5, 37 | name: 'Heitor Gouvêa', 38 | image: 'heitor', 39 | role: 'Campinas/SP - Brasil', 40 | description: 'Instrutor e Pesquisador de Cibersegurança com mais de 3 anos de experiência na área de segurança ofensiva. Autor da ferramenta de anonimato Nipe, presente em várias distribuições Linux focadas em segurança da informação como por exemplo o BlackArch, LionSec e WeakNet. https: //heitorgouvea.me', 41 | facebook: 'https://fb.com/GouveaHeitor', 42 | github: 'https://github.com/GouveaHeitor' 43 | }, 44 | { 45 | id: 6, 46 | name: 'Paulo Rogério da Silva Antiquera', 47 | image: 'paulo', 48 | role: 'Florianópolis/SC - Brasil', 49 | description: 'Tenho desenvolvido software por quase toda minha vida, profissionalmente a uns 20 anos. Na última década venho procurando formas mais eficazes de gerar valor aos clientes. Nesta jornada já misturei práticas de diversas fontes: Xp, Kanban, Scrum, PMI. Sou apaixonado por software já fiz de tudo um pouco: iniciando pela programação, devops, facilitação de times, gestão de projetos, produtos, contas... Já conversei bastante, sobre excelência técnica, testes automatizados, ciclos de feedback curtos, débitos técnicos, autonomia, entrega contínua, fluxo, melhoria contínua. E o melhor, tudo isto continua fazendo parte da minha vida, mas não ao mesmo tempo.Agora gosto de fazer uma coisa por vez, a coisa certa e somente a coisa certa!', 50 | twitter: 'https://twitter.com/@pauloantiquera', 51 | github: 'https://github.com/pauloantiquera' 52 | }, 53 | { 54 | id: 7, 55 | name: 'Daniel Leite', 56 | image: 'daniel', 57 | role: 'Florianópolis/SC - Brasil', 58 | description: 'Desenvolvedor Front-End formado em Engenharia de Computação pela Univali, atua na área desde 2006. Fã da cultura open-source e colaborador da Cheesecake Labs desde 2016', 59 | twitter: 'https://twitter.com/dleitee', 60 | github: 'https://github.com/dleitee', 61 | linkedin: 'https://www.linkedin.com/in/dleitee/' 62 | }, 63 | { 64 | id: 8, 65 | name: 'Pedro Gomes Tavares', 66 | role: 'São Paulo/SP - Brasil', 67 | description: 'Engenheiro de software remoto para Locaweb na equipe de um dos principais projetos da Locaweb.', 68 | image: 'pedro' 69 | } 70 | ], 71 | schedules: [{ 72 | id: 1, 73 | time: '8:00', 74 | title: 'COFFEE', 75 | name: '', 76 | tag: [], 77 | description: 'Café da manhã / Credenciamento / Networking' 78 | }, { 79 | id: 2, 80 | time: '9:00', 81 | title: 'ABERTURA', 82 | name: '', 83 | tag: [], 84 | description: '' 85 | }, { 86 | id: 3, 87 | time: '9:10', 88 | title: 'Pentest em aplicações Mobile', 89 | name: 'Heitor Gouvêa', 90 | tag: ['pentest', 'mobile', 'android', 'ios', 'hacking', 'segurança', 'cybersecurity', 'offensive'], 91 | description: 'Nos últimos anos o desenvolvimento de aplicações mobile para as plataformas Android e iOS cresceram absurdamente e em paralelo a isto começou a surgir os incidentes de segurança envolvendo estas tecnologias. O objetivo desta palestra é mostrar como é realizado o pentest em aplicações desta categoria.' 92 | }, { 93 | id: 4, 94 | time: '10:00', 95 | title: 'Você se preocupa com performance ou é sempre problema da infra?', 96 | name: 'Carlos dos Santos', 97 | tag: ['desenvolvimento', 'performance'], 98 | description: 'Como melhorar a performance de sua aplicação, olhando para os problemas e não para os sintomas!' 99 | }, 100 | { 101 | id: 5, 102 | time: '10:50', 103 | title: 'Consistência de dados entre microservices utilizando serverless e FaaS', 104 | name: 'Elder Moraes', 105 | tag: ['faas', 'devops', 'microservice', 'consistencia'], 106 | description: `Eba! Temos microservices! Agora tudo está resolvido: podemos escalar, distribuir e orquestrar nossos serviços sem qualquer preocupação! 107 | 108 | Será ? Já parou para pensar nos dados de cada serviço ? E nos dados compartilhados entre eles ? E pior : já pensou nas transações entre serviços ? 109 | 110 | Transações ACID não servem mais.Transações distribuídas menos ainda.Como fazer então ? 111 | 112 | Para isso existe o padrão de Sagas!Com ele é possível resolver esse problema de uma forma inteligente, consistente e alinhado ao paradigma de microservices. 113 | 114 | Afinal, de que adianta dezenas, centenas...milhares de microservices, se os dados não forem confiáveis ?` 115 | }, { 116 | id: 6, 117 | time: '11:40', 118 | title: 'ALMOÇO', 119 | name: '', 120 | tag: [], 121 | description: '' 122 | }, { 123 | id: 7, 124 | time: '13:30', 125 | title: 'Bots além do hype: Como bots estão revolucionando a interação homem X maquina', 126 | name: 'Guilherme Souza', 127 | tag: ['chatbos', 'bots'], 128 | description: 'A interface gráfica permitiu que indústria de software atingisse a grande massa de consumidores, dando abertura a novas possibilidades de negócios e tornando a compra de software antes feita somente por empresas, algo tão simples quanto a AppStore, criou áreas, mercados e profissões, UX, Ui Designer, Front-End Developers, moldou comportamentos de compra, fez com que você escolhesse seu novo smartphone pelo tamanho da tela. Este, é o poder de uma nova interface com o usuário. Chatbots, não são brinquedos.' 129 | }, { 130 | id: 8, 131 | time: '14:20', 132 | title: '3 Pilares de uma Cultura de Engenharia Eficaz', 133 | name: 'Paulo Rogério da Silva Antiquera', 134 | tag: ['Engenharia de Software', 'Cultura, Boas Práticas', 'Eficácia', 'XP', 'Agilidade'], 135 | description: `"Cultura, dentro das organizações, é algo até meio místico. Mas é a cultura que faz com que as pessoas tomem decisões eficazes, sem nenhuma necessidade de micro-gerenciamento. Quando falamos de cultura de engenharia, neste caso engenharia de software, estamos nos referindo ao conjunto de valores técnicos que definem a identidade do time de desenvolvimento de uma companhia. 136 | 137 | Se esta identidade é adaptada a dinâmica do negócio, consegue ser facilmente escalada, e for intrinsicamente ligada a excelência técnica, esta cultura entrega para a companhia: tempo adequado de resposta, confiança nas soluções, satisfação interna e externa além do tão buscado resultado econômico. De maneira contrária, quando a cultura de engenharia não consegue se conectar às necessidades do negócio, traz problemas de rentabilidade, insatisfação de clientes e colaboradores entre outros problemas graves. 138 | 139 | A cultura de engenharia de software pode contribuir e até definir o sucesso ou fracasso de um negócio. 140 | 141 | Mas como nós engenheiros de software podemos construir e fortalecer a cultura? Vamos falar sobre isto, assumir a nossa responsabilidade e fazer a coisa acontecer. 142 | 143 | Nesta apresentação vamos discutir três elementos essenciais para construção de uma cultura de engenharia realmente eficaz. 144 | 145 | * Excelência 146 | * Colaboração e Ownership 147 | * Liderança 148 | 149 | Nosso foco será o conjunto de práticas e princípios que podemos seguir no nosso dia-a-dia para que a cultura cresça e atenda as expectativas do negócio, orgulhe os engenheiros e, seja transmitida e respeitada por todas as áreas da companhia."` 150 | }, { 151 | id: 9, 152 | time: '15:10', 153 | title: 'Jornalismo de Dados: Programando a Democracia no Brasil', 154 | name: 'Turicas (aka Álvaro Justen)', 155 | tag: ['ia', 'jornalismo'], 156 | description: `Com a quantidade absurda de dados disponíveis hoje é praticamente 157 | impossível fazer uma matéria jornalística sem, no mínimo, utilizar uma 158 | planilha eletrônica e é por isso que programadores jornalistas e 159 | jornalistas programadores estão ganhando as redações do mundo inteiro. 160 | Nessa palestra Álvaro Justen mostrará matérias jornalísticas que foram 161 | feitas utilizando código, o estado dos dados abertos no Brasil e 162 | algumas ferramentas que vem desenvolvendo para tornar esses dados mais 163 | acessíveis a leigos, além de bases de dados que ele mesmo libertou de 164 | formatos ingratos e o portal Brasil.IO, que concentra diversas bases 165 | de dados públicas em formatos acessíveis.` 166 | 167 | }, { 168 | id: 10, 169 | time: '16:00', 170 | title: 'COFFEE', 171 | name: '', 172 | tag: [], 173 | description: 'Café / Sorteios / Networking' 174 | }, { 175 | id: 11, 176 | time: '16:30', 177 | title: 'Virtual DOM "Creating your own Virtual DOM from strach"', 178 | name: 'Daniel Leite', 179 | tag: ['frontend', 'virtualdom'], 180 | description: 'Para entender o funcionamento do Virtual DOM, iremos construir juntos um protótipo com as principais funcionalidades. Com isso iremos ter uma ideia geral de como as bibliotecas reativas funcionam.' 181 | }, { 182 | id: 12, 183 | time: '17:20', 184 | title: 'Remote work - The good, the bad and the ugly', 185 | name: 'Pedro Gomes Tavares', 186 | tag: ['remote', 'trabalho remoto'], 187 | description: 'Apesar de ter muitos benefícios, trabalho remoto não é um mar de rosas. Existem diversas complexidades adicionais enfrentadas por uma equipe que trabalha remotamente, principalmente em projetos complexos. Inicar trabalho remoto em uma equipe que trabalhava localmente pode ser um desafio ainda maior. Nessa talk vou falar sobre como lidar com esses problemas, e demonstrar como temos resolvido as complexidades que envolvem o trabalho remoto na engenharia de produtos da Locaweb.' 188 | }, { 189 | id: 12, 190 | time: '18:20', 191 | title: 'ENCERRAMENTO', 192 | name: '', 193 | tag: [], 194 | description: 'Encerramento / Sorteios / Foto oficial' 195 | } 196 | ], 197 | tickets: [{ 198 | id: 1, 199 | value: 40, 200 | title: 'Lote Promocional', 201 | date: '05 de Maio até acabar', 202 | link: 'https://www.sympla.com.br/devparana-conference-2018__281357', 203 | soldout: true 204 | }, { 205 | id: 2, 206 | value: 50, 207 | title: '1° Lote', 208 | date: '05 de Maio até 31 de Maio', 209 | link: 'https://www.sympla.com.br/devparana-conference-2018__281357', 210 | soldout: true 211 | }, { 212 | id: 3, 213 | value: 65, 214 | title: '2° Lote', 215 | date: '01 de Junho até 30 de Junho', 216 | link: 'https://www.sympla.com.br/devparana-conference-2018__281357', 217 | soldout: true 218 | }, 219 | { 220 | id: 4, 221 | value: 80, 222 | title: '3° Lote', 223 | date: '01 de Julho até 26 de Julho', 224 | link: 'https://www.sympla.com.br/devparana-conference-2018__281357', 225 | soldout: true 226 | } 227 | ], 228 | sponsors: [{ 229 | id: 1, 230 | name: 'DB1', 231 | address: 'https://db1.com.br', 232 | image: 'db1', 233 | type: 'diamond' 234 | }, 235 | { 236 | id: 2, 237 | name: 'Mandic Cloud Solutions', 238 | address: 'https://www.mandic.com.br/', 239 | image: 'mandic', 240 | type: 'diamond' 241 | }, 242 | { 243 | id: 3, 244 | name: 'Elotech', 245 | address: 'https://www.elotech.com.br/', 246 | image: 'elotech', 247 | type: 'diamond' 248 | }, 249 | { 250 | id: 4, 251 | name: 'Locaweb', 252 | address: 'https://locaweb.com.br', 253 | image: 'locaweb', 254 | type: 'silver' 255 | }, 256 | { 257 | id: 5, 258 | name: 'oracle', 259 | address: 'https://cloud.oracle.com/home', 260 | image: 'oracle', 261 | type: 'silver' 262 | }, 263 | { 264 | id: 6, 265 | name: 'Conta Azul', 266 | address: 'https://contaazul.com/', 267 | image: 'contaazul', 268 | type: 'silver' 269 | }, 270 | { 271 | id: 7, 272 | name: 'Tecnospeed', 273 | address: 'https://tecnospeed.com.br/', 274 | image: 'tecnospeed', 275 | type: 'diamond' 276 | }, 277 | { 278 | id: 8, 279 | name: 'Toptal', 280 | address: 'https://toptal.com', 281 | image: 'toptal', 282 | type: 'silver' 283 | } 284 | ], 285 | support: [{ 286 | id: 1, 287 | name: 'Sicoob', 288 | address: 'http://www.sicoob.com.br/', 289 | image: 'sicoob' 290 | }, { 291 | id: 2, 292 | name: 'Sebrae', 293 | address: 'http://www.sebraepr.com.br/PortalSebrae', 294 | image: 'sebrae' 295 | }, { 296 | id: 3, 297 | name: 'PodTag', 298 | address: 'https://podtag.com.br/', 299 | image: 'podtag' 300 | }, { 301 | id: 4, 302 | name: 'Sociedade Rural de Maringá', 303 | address: 'http://www.srm.org.br/', 304 | image: 'srm' 305 | }, { 306 | id: 5, 307 | name: 'Software by Maringá', 308 | address: 'http://www.softwarebymaringa.com.br/', 309 | image: 'sbm' 310 | }, { 311 | id: 6, 312 | name: 'Umbler', 313 | address: 'https://www.umbler.com/br', 314 | image: 'umbler' 315 | }] 316 | }) 317 | --------------------------------------------------------------------------------