├── .editorconfig ├── .eslintrc.js ├── .github ├── FUNDING.yml └── assets │ ├── cover.gif │ └── cover.jpg ├── .gitignore ├── .prettierignore ├── .prettierrc.js ├── .vscode ├── extensions.json └── settings.json ├── LICENSE ├── README.md ├── assets ├── favicons │ └── icon.png ├── images │ ├── facebook-img.jpg │ └── twitter-img.jpg └── styles │ ├── base.css │ ├── main.css │ └── tailwind.css ├── components ├── CursorFollower.vue └── SmoothScroll.vue ├── config ├── default.js ├── development.js ├── index.js └── production.js ├── dist ├── .nojekyll ├── 404.html ├── _nuxt │ ├── 0b8b86d.modern.js │ ├── 1630bc5.js │ ├── 19b4308.js │ ├── 2cc4024.js │ ├── 48435ac.modern.js │ ├── 93ad886.modern.js │ ├── LICENSES │ ├── b003ad5.js │ ├── b22a4c5.modern.js │ ├── b2cf17e.modern.js │ ├── b7881bf.js │ ├── b79eeca.modern.js │ ├── css │ │ ├── 22d8d18.css │ │ └── 51b4c1b.css │ ├── fa10ddf.js │ ├── icons │ │ ├── icon_192x192.d205f9.png │ │ ├── icon_512x512.d205f9.png │ │ ├── icon_64x64.d205f9.png │ │ ├── splash_ipad_1536x2048.d205f9.png │ │ ├── splash_ipadpro10_1668x2224.d205f9.png │ │ ├── splash_ipadpro12_2048x2732.d205f9.png │ │ ├── splash_ipadpro9_1536x2048.d205f9.png │ │ ├── splash_iphone6_50x1334.d205f9.png │ │ ├── splash_iphoneplus_1080x1920.d205f9.png │ │ ├── splash_iphonese_640x1136.d205f9.png │ │ ├── splash_iphonex_1125x2436.d205f9.png │ │ ├── splash_iphonexr_828x1792.d205f9.png │ │ └── splash_iphonexsmax_1242x2688.d205f9.png │ ├── img │ │ ├── facebook-img.893c889.jpg │ │ └── twitter-img.1c3e460.jpg │ ├── manifest.5622242a.json │ └── static │ │ └── 1656164883 │ │ ├── manifest.js │ │ ├── payload.js │ │ └── state.js ├── favicon.ico ├── fonts │ ├── I-300.woff2 │ ├── I-400.woff2 │ ├── I-500.woff2 │ ├── I-600.woff2 │ └── font-face.css ├── images │ ├── grain.gif │ └── star.png ├── index.html ├── netlify.toml ├── robots.txt ├── sitemap.xml ├── sitemap.xml.gz └── sw.js ├── layouts ├── default.vue ├── error.vue └── errorLayout.vue ├── nuxt.config.js ├── package.json ├── pages ├── home │ ├── SectionHero │ │ ├── SvgTitle.vue │ │ └── index.vue │ ├── SectionItemLeft │ │ └── index.vue │ ├── SectionItemRight │ │ └── index.vue │ ├── SectionSpace │ │ └── index.vue │ └── index.vue └── routes.js ├── plugins └── locomotiveScroll.client.js ├── public ├── favicon.ico ├── fonts │ ├── I-300.woff2 │ ├── I-400.woff2 │ ├── I-500.woff2 │ ├── I-600.woff2 │ └── font-face.css └── images │ ├── grain.gif │ └── star.png ├── tailwind.config.js ├── templates └── app.html ├── utils └── getHeadData.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_size = 2 8 | indent_style = space 9 | insert_final_newline = true 10 | max_line_length = 80 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | max_line_length = 0 15 | trim_trailing_whitespace = false 16 | 17 | [COMMIT_EDITMSG] 18 | max_line_length = 0 19 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | 4 | env: { 5 | browser: true, 6 | node: true 7 | }, 8 | 9 | extends: ['@nuxtjs', 'eslint-config-prettier'], 10 | 11 | ignorePatterns: ['node_modules', '.nuxt', 'dist', 'sw.js'] 12 | } 13 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | github: ivodolenc 3 | custom: ['https://revolut.me/ivodolenc', 'https://paypal.me/ivodolenc'] 4 | -------------------------------------------------------------------------------- /.github/assets/cover.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/.github/assets/cover.gif -------------------------------------------------------------------------------- /.github/assets/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/.github/assets/cover.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # MacOS 2 | .DS_Store 3 | 4 | # Logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | 10 | # Dependency directories 11 | node_modules/ 12 | package-lock.json 13 | 14 | # Optional npm cache directory 15 | .npm 16 | 17 | # Optional eslint cache 18 | .eslintcache 19 | 20 | # Dotenv 21 | .env 22 | 23 | # Nuxt build output 24 | .nuxt 25 | 26 | # Nuxt generate 27 | # dist 28 | 29 | # Service worker 30 | static/sw.* 31 | public/sw.* 32 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .nuxt 3 | dist 4 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | arrowParens: 'avoid', 3 | semi: false, 4 | singleQuote: true, 5 | trailingComma: 'none' 6 | } 7 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "EditorConfig.EditorConfig", 4 | "dbaeumer.vscode-eslint", 5 | "esbenp.prettier-vscode" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "javascript.validate.enable": false, 4 | "javascript.format.enable": false, 5 | "css.validate": false, 6 | "eslint.alwaysShowStatus": true, 7 | "eslint.options": { 8 | "extensions": [".html", ".js", ".ts", ".vue"] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Ivo Dolenc 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 |

Nuxt + Locomotive Scroll

5 |

Starter template for parallax effects & smooth scrolling experience. Empower your Nuxt project in no time.

6 |

See it in action → LIVE DEMO

7 | 8 |
9 | 10 | ## What's included 11 | 12 | Boilerplate provides many pre-configured modules such as 13 | 14 | - [Locomotive Scroll](https://github.com/locomotivemtl/locomotive-scroll) → A smooth-scroll library with powerfull built-in solutions 15 | - [GSAP](https://github.com/ivodolenc/nuxt-gsap-module) → Professional-grade animation for the modern web 16 | - [Tailwind CSS](https://github.com/tailwindlabs/tailwindcss) → A utility-first CSS framework for rapid UI development 17 | - [LazySizes](https://github.com/ivodolenc/nuxt-lazysizes) → High performance and SEO friendly lazy loader for images 18 | - [PWA module](https://github.com/nuxt-community/pwa-module) → Zero config PWA solution for Nuxt.js 19 | - [Font Loader](https://github.com/ivodolenc/nuxt-font-loader) → Simple, modern and lightweight font loader for Nuxt projects 20 | - and more... 21 | 22 | ## Quick Start 23 | 24 | 1. Clone this repo to your working directory: 25 | 26 | ```sh 27 | $ git clone https://github.com/ivodolenc/nuxt-locomotive.git 28 | ``` 29 | 30 | 2. Move to the project directory: 31 | 32 | ```sh 33 | $ cd 34 | ``` 35 | 36 | 3. Install all dependencies: 37 | 38 | ```sh 39 | $ yarn # or npm install 40 | ``` 41 | 42 | ## Build Setup 43 | 44 | Start the local `dev` server: 45 | 46 | ```sh 47 | $ yarn dev # or npm run dev 48 | ``` 49 | 50 | ## Static Deployment 51 | 52 | Nuxt.js will create a `dist/` directory with everything inside ready to be deployed on a static hosting service. 53 | 54 | Generate your static application: 55 | 56 | ```sh 57 | $ yarn generate # or npm run generate 58 | ``` 59 | 60 | Once your application is built you can use the `start` command to see a production version of your application. 61 | 62 | Serve the generated static application from a `dist/` directory: 63 | 64 | ```sh 65 | $ yarn start # or npm run start 66 | ``` 67 | 68 | This is useful for final testing before deploying. 69 | 70 | ## Related 71 | 72 | [Nuxt Static Boilerplate](https://github.com/ivodolenc/nuxt-static-boilerplate) → A well-organized Nuxt template for creating fast static applications. 73 | 74 | ## License 75 | 76 | **Locomotive Scroll** 77 | 78 | [MIT License](https://github.com/locomotivemtl/locomotive-scroll/blob/master/LICENSE) 79 | 80 | Copyright (c) Locomotive 81 | 82 | **Nuxt + Locomotive** 83 | 84 | [MIT License](LICENSE) 85 | 86 | Copyright (c) Ivo Dolenc 87 | -------------------------------------------------------------------------------- /assets/favicons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/assets/favicons/icon.png -------------------------------------------------------------------------------- /assets/images/facebook-img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/assets/images/facebook-img.jpg -------------------------------------------------------------------------------- /assets/images/twitter-img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/assets/images/twitter-img.jpg -------------------------------------------------------------------------------- /assets/styles/base.css: -------------------------------------------------------------------------------- 1 | html.has-scroll-smooth, 2 | .has-scroll-smooth body { 3 | @apply overflow-hidden; 4 | } 5 | 6 | html.has-scroll-dragging { 7 | @apply select-none; 8 | } 9 | 10 | .has-scroll-smooth [data-scroll-container] { 11 | @apply min-h-screen; 12 | } 13 | 14 | [data-scroll-direction='horizontal'] [data-scroll-container] { 15 | @apply h-screen inline-block whitespace-nowrap; 16 | } 17 | 18 | [data-scroll-direction='horizontal'] [data-scroll-section] { 19 | @apply inline-block align-top whitespace-nowrap h-full; 20 | } 21 | 22 | html { 23 | @apply bg-dark text-white; 24 | } 25 | 26 | .lazyload, 27 | .lazyloading { 28 | @apply opacity-0; 29 | } 30 | 31 | .lazyloaded { 32 | @apply opacity-100 transition-opacity duration-500; 33 | } 34 | -------------------------------------------------------------------------------- /assets/styles/main.css: -------------------------------------------------------------------------------- 1 | @import 'tailwind.css'; 2 | @import 'base.css'; 3 | -------------------------------------------------------------------------------- /assets/styles/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /components/CursorFollower.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 53 | 54 | 70 | -------------------------------------------------------------------------------- /components/SmoothScroll.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /config/default.js: -------------------------------------------------------------------------------- 1 | export default { 2 | isDev: process.env.NODE_ENV === 'development', 3 | 4 | nuxt: { 5 | routerBase: '/', 6 | globalName: 'nuxt', 7 | publicPath: '/_nuxt/' 8 | }, 9 | 10 | app: { 11 | name: 'Nuxt + Locomotive', 12 | shortName: 'Nuxt Locomotive', 13 | description: 14 | 'Starter template for parallax effects & smooth scrolling experience', 15 | author: 'namesurname', 16 | 17 | title: 'Nuxt + Locomotive', 18 | titleSeparator: ' — ', 19 | titleTemplate: 20 | 'Starter template for parallax effects & smooth scrolling experience', 21 | 22 | charset: 'utf-8', 23 | lang: 'en-US', 24 | locale: 'en_US', 25 | type: 'website', 26 | themeColor: '#030303', 27 | backgroundColor: '#030303' 28 | }, 29 | 30 | breakpoints: { 31 | sm: '640px', 32 | md: '768px', 33 | lg: '1024px', 34 | xl: '1280px', 35 | '2xl': '1536px' 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /config/development.js: -------------------------------------------------------------------------------- 1 | export default { 2 | server: { 3 | hostname: 'localhost', 4 | port: '3003' 5 | }, 6 | 7 | app: { 8 | baseUrl: 'http://localhost:3003', 9 | url: 'http://localhost:3003' 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | import defu from 'defu' 2 | import defaults from './default' 3 | import development from './development' 4 | import production from './production' 5 | 6 | const environment = defaults.isDev ? development : production 7 | const config = defu({}, environment, defaults) 8 | 9 | export default config 10 | -------------------------------------------------------------------------------- /config/production.js: -------------------------------------------------------------------------------- 1 | export default { 2 | server: { 3 | hostname: 'localhost', 4 | port: '8008' 5 | }, 6 | 7 | app: { 8 | baseUrl: 'https://nuxt-locomotive.netlify.app', 9 | url: 'https://nuxt-locomotive.netlify.app' 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /dist/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/.nojekyll -------------------------------------------------------------------------------- /dist/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Loading...
8 | 9 | 10 | -------------------------------------------------------------------------------- /dist/_nuxt/1630bc5.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[0],{123:function(t,e,o){"use strict";var r=o(52),n=(o(16),o(117)),c={isDev:!1,nuxt:{routerBase:"/",globalName:"nuxt",publicPath:"/_nuxt/"},app:{name:"Nuxt + Locomotive",shortName:"Nuxt Locomotive",description:"Starter template for parallax effects & smooth scrolling experience",author:"namesurname",title:"Nuxt + Locomotive",titleSeparator:" — ",titleTemplate:"Starter template for parallax effects & smooth scrolling experience",charset:"utf-8",lang:"en-US",locale:"en_US",type:"website",themeColor:"#030303",backgroundColor:"#030303"},breakpoints:{sm:"640px",md:"768px",lg:"1024px",xl:"1280px","2xl":"1536px"}},l=c.isDev?{server:{hostname:"localhost",port:"3003"},app:{baseUrl:"http://localhost:3003",url:"http://localhost:3003"}}:{server:{hostname:"localhost",port:"8008"},app:{baseUrl:"https://nuxt-locomotive.netlify.app",url:"https://nuxt-locomotive.netlify.app"}},h=Object(n.a)({},l,c),m=function(){var path=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return[{rel:"canonical",href:h.app.url+path}]},d=function(){var path=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return[{hid:"og:title",property:"og:title",content:h.app.title},{hid:"og:description",property:"og:description",content:h.app.description},{hid:"og:type",property:"og:type",content:h.app.type},{hid:"og:site_name",property:"og:site_name",content:h.app.title},{hid:"og:locale",property:"og:locale",content:h.app.locale},{hid:"og:url",property:"og:url",content:h.app.url+path},{hid:"og:image",property:"og:image",content:h.app.url+o(167)}]},f=function(){var path=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return[{hid:"application/ld+json",type:"application/ld+json",json:{"@context":"https://schema.org","@type":h.app.type,name:h.app.name,url:h.app.url+path,sameAs:["https://www.facebook.com/","https://www.instagram.com/","https://www.twitter.com/"]}}]},v={head:function(){var path=this.$route.path;return{meta:[].concat(Object(r.a)(d(path)),Object(r.a)([{hid:"twitter:card",name:"twitter:card",content:"summary_large_image"},{hid:"twitter:title",name:"twitter:title",content:h.app.title},{hid:"twitter:description",name:"twitter:description",content:h.app.description},{hid:"twitter:image:src",name:"twitter:image:src",content:h.app.url+o(168)}])),link:Object(r.a)(m(path)),script:Object(r.a)(f(path))}}},x=o(32),component=Object(x.a)(v,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{attrs:{id:"__default"}},[e("Nuxt")],1)}),[],!1,null,null,null);e.a=component.exports},124:function(t,e,o){"use strict";var r={},n=o(32),component=Object(n.a)(r,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{attrs:{id:"__error"}},[e("Nuxt")],1)}),[],!1,null,null,null);e.a=component.exports},125:function(t,e,o){t.exports=o(126)},166:function(t,e,o){t.exports={}},167:function(t,e,o){t.exports=o.p+"img/facebook-img.893c889.jpg"},168:function(t,e,o){t.exports=o.p+"img/twitter-img.1c3e460.jpg"},24:function(t,e,o){"use strict";var r={layout:"errorLayout",props:{error:{type:Object,required:!0}},head:function(){return{title:"Error"+this.$config.app.titleSeparator+"404 Not Found"}}},n=o(32),component=Object(n.a)(r,(function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("div",[404===t.error.statusCode?o("h1",[t._v("Page not found")]):o("h1",[t._v("An error occurred")]),t._v(" "),o("NuxtLink",{attrs:{to:"/"}},[t._v("BACK TO HOME")])],1)}),[],!1,null,null,null);e.a=component.exports},90:function(t,e,o){"use strict";var r=o(120);e.a=function(t,e){t.app;e("LocomotiveScroll",r.a)}}},[[125,2,1,3]]]); -------------------------------------------------------------------------------- /dist/_nuxt/48435ac.modern.js: -------------------------------------------------------------------------------- 1 | !function(e){function t(data){for(var t,n,o=data[0],f=data[1],d=data[2],i=0,h=[];i 24 | * Released under the MIT License. 25 | */ 26 | 27 | /*! 28 | * vue-no-ssr v1.1.1 29 | * (c) 2018-present egoist <0x142857@gmail.com> 30 | * Released under the MIT License. 31 | */ 32 | 33 | 34 | /*! 35 | * vue-router v3.5.4 36 | * (c) 2022 Evan You 37 | * @license MIT 38 | */ 39 | 40 | /*! 41 | * Vue.js v2.6.14 42 | * (c) 2014-2021 Evan You 43 | * Released under the MIT License. 44 | */ 45 | -------------------------------------------------------------------------------- /dist/_nuxt/b003ad5.js: -------------------------------------------------------------------------------- 1 | !function(e){function t(data){for(var t,n,o=data[0],f=data[1],d=data[2],i=0,h=[];i{l.x=e.x,l.y=e.y,t.set(".cursor-follower",{opacity:1,duration:2,ease:"expo.out"})})),t.ticker.add(((time,t)=>{var e=.06*t,dt=1-Math.pow(.87,e);c.x+=(l.x-c.x)*dt,c.y+=(l.y-c.y)*dt,n(c.x),o(c.y)}))}}},y=(c(124),{components:{SectionHero:r,SectionSpace:m,SectionItemLeft:v,SectionItemRight:_,SmoothScroll:S,CursorFollower:Object(n.a)(w,(function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"cursor-follower"})}),[],!1,null,"b7c0cda2",null).exports},data:()=>({scroll:null}),head(){return{title:this.$config.app.title+this.$config.app.titleSeparator+this.$config.app.titleTemplate,meta:[{hid:"description",name:"description",content:this.$config.app.description}]}},mounted(){this.locomotiveScrollInit(),this.setHeroAnimation(),this.setItemAnimation()},beforeDestroy(){this.scroll.destroy()},methods:{locomotiveScrollInit(){this.scroll=new this.$LocomotiveScroll({el:document.querySelector("[data-scroll-container]"),smooth:!0,getDirection:!0}),this.scroll.stop()},setHeroAnimation(){var t=document.querySelector("[data-img-star]");this.$gsap.timeline({defaults:{duration:3,ease:"expo.out"}}).to("[data-svg-title]",{y:0,opacity:1}).to("[data-img-star]",{opacity:1,scale:1,rotation:360,onComplete:()=>{this.scroll.update(),this.scroll.start(),this.scroll.on("scroll",(e=>{t.style.transform="rotate(".concat(.05*e.scroll.y,"deg)")}))}},"-=2.5")},setItemAnimation(){this.scroll.on("call",((t,e,c)=>{"itemAnimation"===t&&"enter"===e&&this.$gsap.to(c.el,{scaleX:1,ease:"expo.out",duration:3})}))}}}),C=Object(n.a)(y,(function(){var t=this,e=t.$createElement,c=t._self._c||e;return c("main",[c("SectionHero"),t._v(" "),c("SmoothScroll",[c("SectionSpace"),t._v(" "),c("SectionItemLeft"),t._v(" "),c("SectionItemRight"),t._v(" "),c("SectionItemLeft"),t._v(" "),c("SectionItemRight"),t._v(" "),c("SectionItemLeft"),t._v(" "),c("SectionItemRight"),t._v(" "),c("SectionItemLeft"),t._v(" "),c("SectionSpace")],1),t._v(" "),c("CursorFollower")],1)}),[],!1,null,null,null);e.default=C.exports}}]); -------------------------------------------------------------------------------- /dist/_nuxt/b2cf17e.modern.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[5],{116:function(e,t,n){"use strict";n.r(t),n.d(t,"Workbox",(function(){return h})),n.d(t,"messageSW",(function(){return r}));try{self["workbox:window:5.1.4"]&&_()}catch(r){}function r(e,t){return new Promise((function(n){var r=new MessageChannel;r.port1.onmessage=function(e){n(e.data)},e.postMessage(t,[r.port2])}))}function o(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}try{self["workbox:core:5.1.4"]&&_()}catch(r){}var i=function(){var e=this;this.promise=new Promise((function(t,n){e.resolve=t,e.reject=n}))};function f(e,t){var n=location.href;return new URL(e,n).href===new URL(t,n).href}var u=function(e,t){this.type=e,Object.assign(this,t)};function a(e,t,n){return n?t?t(e):e:(e&&e.then||(e=Promise.resolve(e)),t?e.then(t):e)}function l(){}var h=function(e){var t,n;function c(t,n){var r,o;return void 0===n&&(n={}),(r=e.call(this)||this).t={},r.i=0,r.o=new i,r.u=new i,r.s=new i,r.v=0,r.h=new Set,r.l=function(){var e=r.m,t=e.installing;r.i>0||!f(t.scriptURL,r.g)||performance.now()>r.v+6e4?(r.p=t,e.removeEventListener("updatefound",r.l)):(r.P=t,r.h.add(t),r.o.resolve(t)),++r.i,t.addEventListener("statechange",r.S)},r.S=function(e){var t=r.m,n=e.target,i=n.state,o=n===r.p,a=o?"external":"",c={sw:n,originalEvent:e};!o&&r.j&&(c.isUpdate=!0),r.dispatchEvent(new u(a+i,c)),"installed"===i?r.A=self.setTimeout((function(){"installed"===i&&t.waiting===n&&r.dispatchEvent(new u(a+"waiting",c))}),200):"activating"===i&&(clearTimeout(r.A),o||r.u.resolve(n))},r.O=function(e){var t=r.P;t===navigator.serviceWorker.controller&&(r.dispatchEvent(new u("controlling",{sw:t,originalEvent:e,isUpdate:r.j})),r.s.resolve(t))},r.U=(o=function(e){var t=e.data,n=e.source;return a(r.getSW(),(function(){r.h.has(n)&&r.dispatchEvent(new u("message",{data:t,sw:n,originalEvent:e}))}))},function(){for(var e=[],t=0;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(n=e[Symbol.iterator]()).next.bind(n)}try{self["workbox:core:5.1.4"]&&_()}catch(r){}var i=function(){var e=this;this.promise=new Promise((function(t,n){e.resolve=t,e.reject=n}))};function f(e,t){var n=location.href;return new URL(e,n).href===new URL(t,n).href}var u=function(e,t){this.type=e,Object.assign(this,t)};function a(e,t,n){return n?t?t(e):e:(e&&e.then||(e=Promise.resolve(e)),t?e.then(t):e)}function l(){}var h=function(e){var t,n;function c(t,n){var r,o;return void 0===n&&(n={}),(r=e.call(this)||this).t={},r.i=0,r.o=new i,r.u=new i,r.s=new i,r.v=0,r.h=new Set,r.l=function(){var e=r.m,t=e.installing;r.i>0||!f(t.scriptURL,r.g)||performance.now()>r.v+6e4?(r.p=t,e.removeEventListener("updatefound",r.l)):(r.P=t,r.h.add(t),r.o.resolve(t)),++r.i,t.addEventListener("statechange",r.S)},r.S=function(e){var t=r.m,n=e.target,i=n.state,o=n===r.p,a=o?"external":"",c={sw:n,originalEvent:e};!o&&r.j&&(c.isUpdate=!0),r.dispatchEvent(new u(a+i,c)),"installed"===i?r.A=self.setTimeout((function(){"installed"===i&&t.waiting===n&&r.dispatchEvent(new u(a+"waiting",c))}),200):"activating"===i&&(clearTimeout(r.A),o||r.u.resolve(n))},r.O=function(e){var t=r.P;t===navigator.serviceWorker.controller&&(r.dispatchEvent(new u("controlling",{sw:t,originalEvent:e,isUpdate:r.j})),r.s.resolve(t))},r.U=(o=function(e){var t=e.data,n=e.source;return a(r.getSW(),(function(){r.h.has(n)&&r.dispatchEvent(new u("message",{data:t,sw:n,originalEvent:e}))}))},function(){for(var e=[],t=0;t{var{app:r}=t;e("LocomotiveScroll",o.a)}},79:function(t,e,r){"use strict";var o=r(73),n={isDev:!1,nuxt:{routerBase:"/",globalName:"nuxt",publicPath:"/_nuxt/"},app:{name:"Nuxt + Locomotive",shortName:"Nuxt Locomotive",description:"Starter template for parallax effects & smooth scrolling experience",author:"namesurname",title:"Nuxt + Locomotive",titleSeparator:" — ",titleTemplate:"Starter template for parallax effects & smooth scrolling experience",charset:"utf-8",lang:"en-US",locale:"en_US",type:"website",themeColor:"#030303",backgroundColor:"#030303"},breakpoints:{sm:"640px",md:"768px",lg:"1024px",xl:"1280px","2xl":"1536px"}},l=n.isDev?{server:{hostname:"localhost",port:"3003"},app:{baseUrl:"http://localhost:3003",url:"http://localhost:3003"}}:{server:{hostname:"localhost",port:"8008"},app:{baseUrl:"https://nuxt-locomotive.netlify.app",url:"https://nuxt-locomotive.netlify.app"}},c=Object(o.a)({},l,n),h=function(){var path=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return[{rel:"canonical",href:c.app.url+path}]},m=function(){var path=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return[{hid:"og:title",property:"og:title",content:c.app.title},{hid:"og:description",property:"og:description",content:c.app.description},{hid:"og:type",property:"og:type",content:c.app.type},{hid:"og:site_name",property:"og:site_name",content:c.app.title},{hid:"og:locale",property:"og:locale",content:c.app.locale},{hid:"og:url",property:"og:url",content:c.app.url+path},{hid:"og:image",property:"og:image",content:c.app.url+r(113)}]},d=function(){var path=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return[{hid:"application/ld+json",type:"application/ld+json",json:{"@context":"https://schema.org","@type":c.app.type,name:c.app.name,url:c.app.url+path,sameAs:["https://www.facebook.com/","https://www.instagram.com/","https://www.twitter.com/"]}}]},f={head(){var{path:path}=this.$route;return{meta:[...m(path),{hid:"twitter:card",name:"twitter:card",content:"summary_large_image"},{hid:"twitter:title",name:"twitter:title",content:c.app.title},{hid:"twitter:description",name:"twitter:description",content:c.app.description},{hid:"twitter:image:src",name:"twitter:image:src",content:c.app.url+r(114)}],link:[...h(path)],script:[...d(path)]}}},v=r(19),component=Object(v.a)(f,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{attrs:{id:"__default"}},[e("Nuxt")],1)}),[],!1,null,null,null);e.a=component.exports},80:function(t,e,r){"use strict";var o={},n=r(19),component=Object(n.a)(o,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{attrs:{id:"__error"}},[e("Nuxt")],1)}),[],!1,null,null,null);e.a=component.exports},81:function(t,e,r){t.exports=r(82)}},[[81,2,1,3]]]); -------------------------------------------------------------------------------- /dist/_nuxt/css/22d8d18.css: -------------------------------------------------------------------------------- 1 | /*! tailwindcss v3.1.4 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:I,Helvetica,Arial,sans-serif}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scroll-snap-strictness:proximity;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent}::-webkit-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scroll-snap-strictness:proximity;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent}::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scroll-snap-strictness:proximity;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.top-0{top:0}.left-0{left:0}.z-50{z-index:50}.z-30{z-index:30}.z-10{z-index:10}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.h-full{height:100%}.h-screen{height:100vh}.w-full{width:100%}.max-w-\[60vw\]{max-width:60vw}.max-w-screen-xl{max-width:1280px}.translate-y-\[150\%\]{--tw-translate-y:150%}.scale-0,.translate-y-\[150\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-0{--tw-scale-x:0;--tw-scale-y:0}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.items-center{align-items:center}.justify-center{justify-content:center}.overflow-hidden{overflow:hidden}.object-cover{-o-object-fit:cover;object-fit:cover}.p-10{padding:2.5rem}.pt-\[100\%\]{padding-top:100%}.opacity-0{opacity:0}.transition{transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.has-scroll-smooth body,html.has-scroll-smooth{overflow:hidden}html.has-scroll-dragging{-webkit-user-select:none;-moz-user-select:none;user-select:none}.has-scroll-smooth [data-scroll-container]{min-height:100vh}[data-scroll-direction=horizontal] [data-scroll-container]{display:inline-block;height:100vh;white-space:nowrap}[data-scroll-direction=horizontal] [data-scroll-section]{display:inline-block;height:100%;white-space:nowrap;vertical-align:top}html{--tw-bg-opacity:1;background-color:rgb(3 3 3/var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.lazyload,.lazyloading{opacity:0}.lazyloaded{opacity:1;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.5s}@media (min-width:1024px){.lg\:max-w-\[40vw\]{max-width:40vw}}@media (min-width:1280px){.xl\:max-w-\[80vw\]{max-width:80vw}} -------------------------------------------------------------------------------- /dist/_nuxt/css/51b4c1b.css: -------------------------------------------------------------------------------- 1 | [data-section-hero][data-v-1c90a4cf]:after{content:"";position:fixed;top:0;left:0;height:100%;width:100%;opacity:.13;background-image:url(/images/grain.gif)}[data-scroll-section][data-v-d9ee93bc]{display:flex;padding:30vh 5vw}[data-block-item][data-v-d9ee93bc]{width:100%;max-width:30vw;background-color:#232323;height:65vh;transform:scaleX(0);transform-origin:top left}[data-scroll-section][data-v-b60031ee]{display:flex;padding:30vh 5vw}[data-block-item][data-v-b60031ee]{width:100%;max-width:30vw;background-color:#232323;height:65vh;transform:scaleX(0);transform-origin:top left}.cursor-follower[data-v-b7c0cda2]{z-index:1000;position:fixed;width:3.3rem;height:3.3rem;top:0;left:0;background-color:grey;border-radius:50%;opacity:0;mix-blend-mode:difference;pointer-events:none;transform:translate3d(-50%,-50%,0)} -------------------------------------------------------------------------------- /dist/_nuxt/fa10ddf.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[4],{172:function(t,e,c){t.exports={}},173:function(t,e,c){t.exports={}},174:function(t,e,c){t.exports={}},175:function(t,e,c){t.exports={}},176:function(t,e,c){"use strict";c(172)},177:function(t,e,c){"use strict";c(173)},178:function(t,e,c){"use strict";c(174)},179:function(t,e,c){"use strict";c(175)},180:function(t,e,c){"use strict";c.r(e);var n={},o=c(32),l={components:{SvgTitle:Object(o.a)(n,(function(){var t=this,e=t.$createElement,c=t._self._c||e;return c("svg",{attrs:{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1000 64"}},[c("style",{attrs:{type:"text/css"}},[t._v("\n .st0 {\n fill: url(#SVGID_1_);\n }\n ")]),t._v(" "),c("linearGradient",{attrs:{id:"SVGID_1_",gradientUnits:"userSpaceOnUse",x1:"0",y1:"31.9626",x2:"999.9999",y2:"31.9626"}},[c("stop",{staticStyle:{"stop-color":"#232323"},attrs:{offset:"0"}}),t._v(" "),c("stop",{staticStyle:{"stop-color":"#fff"},attrs:{offset:"0.5"}}),t._v(" "),c("stop",{staticStyle:{"stop-color":"#232323"},attrs:{offset:"1"}})],1),t._v(" "),c("path",{staticClass:"st0",attrs:{d:"M65.4,1.7h1.2v60.6H53.9L12.2,12.9v49.4h-1.1V11.7L0,1.7h19.3l46.3,52.8L65.4,1.7z M130.7,33.8\n\tc0,9.4-2.3,16.6-7.1,21.4s-10.5,7.2-17.2,7.2c-5.8,0-10.3-2.7-13.5-8S88,42.2,87.8,33.8V1.7H75v32.1c0,8.3,3,15.3,8.7,20.9\n\tc5.8,5.7,13.4,8.5,22.7,8.6c7.9,0.1,14-2.8,18.6-8.4c4.5-5.6,6.8-12.6,6.8-21.1V1.7h-1.1V33.8z M202.8,1.7h-1.5l-26.7,26.8L151,1.7\n\th-15.3l30.9,34.9l-25.8,25.8h1.2l25.2-25.1l22.2,25.1h15.2l-29.3-33.2L202.8,1.7z M208.9,1.7l-2.6,22.4\n\tc11.5-14.3,18.3-21.5,20.1-21.5h4.5v59.8h11.2V2.6h4.7c1.8,0,8.6,7.2,20.1,21.4l-2.6-22.3H208.9z M315.7,13.5h-1.6v21.6H293v1.6\n\th21.1v21h1.6v-21h21.5v-1.6h-21.5V13.5z M393.1,56.6c-3.9,3.4-6.5,5-7.7,5h-5.8V1.7H368v60.7h37.1l13.7-29c-2.4,2-6.3,5.5-11.8,10.6\n\tC401.6,49.1,397,53.2,393.1,56.6z M480.6,14.2c5.4,7.3,7.5,15.2,6.4,23.8c-1.1,8.6-5.1,15.3-12,20.3c-6.9,4.9-14.7,6.7-23.4,5\n\tc-8.7-1.7-15.7-6.2-21-13.3c-5.4-7.2-7.5-15.2-6.4-23.8c1-8.7,5-15.5,11.9-20.5c6.8-4.9,14.7-6.6,23.5-4.9\n\tC468.3,2.4,475.4,7,480.6,14.2z M480.3,41c-1.2-6.9-4.9-13.9-10.9-20.9c-6.2-7.2-11.2-11.6-16.7-14.6s-10.8-2.9-15.8,0.7\n\tc-6.6,4.8-7.7,13.4-4.2,22.7c1.6,4.7,4.3,9.4,7.9,14.3c10.5,14.2,24,21.4,34.2,14.1C479.7,53.4,481.6,48,480.3,41z M546,47.6\n\tc-2.8,2.5-5.8,5-9.2,7.5c-3.3,2.5-6.6,4.2-10,5.1c-3.4,1-6.5,1-9.3,0.1c-5.6-1.8-9.4-11.3-9.4-28c0-21,7.4-31.5,20.9-31\n\tc2.3,0.1,4.5,0.4,6.5,1.2c4,1.5,6.2,3.4,9,7c1.3,1.9,2.4,3.4,3.3,4.9c1.5,2.7,4.8,8.5,6.4,11l-0.5-19.5c-12.1-5-22.7-6.7-31.8-5.1\n\tc-5.8,1-10.9,3.2-15.2,6.6c-8.7,7-12.8,16-12.8,24.9c0,5.5,1.7,10.7,5.2,15.5c3.4,4.8,8,8.6,13.7,11.4s11.8,4.2,18.3,4.2\n\tc5.6,0,11.5-1.5,15.1-3c1.7-0.8,3.4-1.6,5-2.6c3.2-2,3.8-2.6,4.2-3V38l-2.6,2.9C551,42.9,548.8,45.1,546,47.6z M619.5,14.2\n\tc5.4,7.3,7.5,15.2,6.4,23.8c-1.1,8.6-5.1,15.3-12,20.3c-6.9,4.9-14.7,6.7-23.4,5c-8.7-1.7-15.7-6.2-21-13.3\n\tc-5.4-7.2-7.5-15.2-6.4-23.8s5.1-15.5,11.9-20.5c6.8-4.9,14.7-6.6,23.5-4.9C607.2,2.4,614.3,7,619.5,14.2z M619.2,41\n\tc-1.2-6.9-4.9-13.9-10.9-20.9c-6.2-7.2-11.2-11.6-16.7-14.6s-10.8-2.9-15.8,0.7c-6.6,4.8-7.7,13.4-4.2,22.7\n\tc1.6,4.7,4.3,9.4,7.9,14.3c10.6,14.2,24,21.4,34.2,14.1C618.6,53.4,620.5,48,619.2,41z M674.8,45.3L644,1.7h-17.7l7.2,8.4v52.2h22.7\n\tc-6.8-2.4-12.1-5.6-15.9-9.8c-3.8-4.1-5.7-7.9-5.7-11.5V11.2L671,62.3h16.4l-12-16.1l29.4-42.4l0.1,58.5h12.6V1.7h-12.6L674.8,45.3z\n\t M782.5,14.2c5.4,7.3,7.5,15.2,6.4,23.8c-1.1,8.6-5.1,15.3-12,20.3c-6.9,4.9-14.7,6.7-23.4,5c-8.7-1.7-15.7-6.2-21-13.3\n\tc-5.4-7.2-7.5-15.2-6.4-23.8c1.1-8.7,5.1-15.5,11.9-20.5c6.8-4.9,14.7-6.6,23.5-4.9C770.2,2.4,777.3,7,782.5,14.2z M782.3,41\n\tc-1.2-6.9-4.9-13.9-10.9-20.9c-6.2-7.2-11.2-11.6-16.7-14.6s-10.8-2.9-15.8,0.7c-6.6,4.8-7.7,13.4-4.2,22.7\n\tc1.6,4.7,4.3,9.4,7.9,14.3c10.5,14.2,23.9,21.4,34.2,14.1C781.7,53.4,783.6,48,782.3,41z M850.8,0.7c-1.7,0.7-2.7,1-4,1h-45.7\n\tc-1.7,0-4.4-1.3-5.7-1.7l-2.6,27.4c2-3.2,4.2-6.6,6.7-10c2.5-3.4,5.3-6.7,8.5-9.8c3.1-3.1,5.6-4.7,7.5-4.7h2.8v59.5h11.2V2.9h2.8\n\tc2.4,0,5.8,2.5,10.2,7.5S851,21.1,855,27.3L852.4,0C852.1,0.1,851.6,0.4,850.8,0.7z M863.1,62.3h11.3V1.7h-11.3V62.3z M932.7,16.2\n\tl-16.4,32.2L892.5,1.7h-13.8l31.9,60.8l30.3-60.8h-32.3L932.7,16.2z M993.3,49.5c-3.2,1.9-6.2,3.7-9.1,5.3\n\tc-2.8,1.6-6.2,3.1-10.1,4.4c-3.9,1.4-7.4,2.1-10.6,2.1H959V42.2l32.2-18.5h-19c-1.3,1.5-3.3,4.3-5.8,8.5s-5,7.3-7.4,9.1V2.8h10\n\tc2.5,0,5.2,0.9,8.2,2.5c2.9,1.7,6.3,3.9,10,6.6c3.7,2.7,7,4.6,9.9,5.9V1.7h-50.4v60.7h48.7l4.6-16.6\n\tC998.7,46.4,996.5,47.6,993.3,49.5z"}})],1)}),[],!1,null,null,null).exports}},r=(c(176),Object(o.a)(l,(function(){var t=this,e=t.$createElement,c=t._self._c||e;return c("div",{staticClass:"fixed z-50 top-0 left-0 w-full h-full flex items-center justify-center pointer-events-none p-10",attrs:{"data-section-hero":""}},[t._m(0),t._v(" "),c("div",{staticClass:"z-10 absolute w-full max-w-screen-xl xl:max-w-[80vw] overflow-hidden p-10"},[c("SvgTitle",{staticClass:"opacity-0 transform translate-y-[150%]",attrs:{"data-svg-title":""}})],1)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"z-30 w-full max-w-[60vw] lg:max-w-[40vw]"},[e("figure",{staticClass:"relative block pt-[100%]"},[e("img",{staticClass:"lazyload absolute top-0 left-0 w-full h-full object-cover opacity-0 transform scale-0",attrs:{"data-img-star":"","data-src":"/images/star.png",alt:"",draggable:"false"}})])])}],!1,null,"1c90a4cf",null).exports),h={},f=Object(o.a)(h,(function(){var t=this.$createElement;return(this._self._c||t)("section",{staticClass:"h-screen",attrs:{"data-scroll-section":""}})}),[],!1,null,null,null).exports,m={},v=(c(177),Object(o.a)(m,(function(){var t=this,e=t.$createElement;t._self._c;return t._m(0)}),[function(){var t=this.$createElement,e=this._self._c||t;return e("section",{attrs:{"data-scroll-section":""}},[e("div",{attrs:{"data-scroll":"","data-scroll-call":"itemAnimation","data-block-item":""}})])}],!1,null,"d9ee93bc",null).exports),d={},_=(c(178),Object(o.a)(d,(function(){var t=this,e=t.$createElement;t._self._c;return t._m(0)}),[function(){var t=this.$createElement,e=this._self._c||t;return e("section",{attrs:{"data-scroll-section":""}},[e("div",{staticClass:"ml-auto",attrs:{"data-scroll":"","data-scroll-call":"itemAnimation","data-block-item":""}})])}],!1,null,"b60031ee",null).exports),x={},S=Object(o.a)(x,(function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",{attrs:{"data-scroll-container":""}},[t._t("default")],2)}),[],!1,null,null,null).exports,w={mounted:function(){this.setCursorAnimation()},methods:{setCursorAnimation:function(){var t=this.$gsap,e=document.querySelector(".cursor-follower"),c={x:window.innerWidth/2,y:window.innerHeight/2},n={x:c.x,y:c.y},o=t.quickSetter(e,"x","px"),l=t.quickSetter(e,"y","px");window.addEventListener("mousemove",(function(e){n.x=e.x,n.y=e.y,t.set(".cursor-follower",{opacity:1,duration:2,ease:"expo.out"})})),t.ticker.add((function(time,t){var e=.06*t,dt=1-Math.pow(.87,e);c.x+=(n.x-c.x)*dt,c.y+=(n.y-c.y)*dt,o(c.x),l(c.y)}))}}},y=(c(179),{components:{SectionHero:r,SectionSpace:f,SectionItemLeft:v,SectionItemRight:_,SmoothScroll:S,CursorFollower:Object(o.a)(w,(function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"cursor-follower"})}),[],!1,null,"b7c0cda2",null).exports},data:function(){return{scroll:null}},head:function(){return{title:this.$config.app.title+this.$config.app.titleSeparator+this.$config.app.titleTemplate,meta:[{hid:"description",name:"description",content:this.$config.app.description}]}},mounted:function(){this.locomotiveScrollInit(),this.setHeroAnimation(),this.setItemAnimation()},beforeDestroy:function(){this.scroll.destroy()},methods:{locomotiveScrollInit:function(){this.scroll=new this.$LocomotiveScroll({el:document.querySelector("[data-scroll-container]"),smooth:!0,getDirection:!0}),this.scroll.stop()},setHeroAnimation:function(){var t=this,e=document.querySelector("[data-img-star]");this.$gsap.timeline({defaults:{duration:3,ease:"expo.out"}}).to("[data-svg-title]",{y:0,opacity:1}).to("[data-img-star]",{opacity:1,scale:1,rotation:360,onComplete:function(){t.scroll.update(),t.scroll.start(),t.scroll.on("scroll",(function(t){e.style.transform="rotate(".concat(.05*t.scroll.y,"deg)")}))}},"-=2.5")},setItemAnimation:function(){var t=this;this.scroll.on("call",(function(e,c,n){"itemAnimation"===e&&"enter"===c&&t.$gsap.to(n.el,{scaleX:1,ease:"expo.out",duration:3})}))}}}),C=Object(o.a)(y,(function(){var t=this,e=t.$createElement,c=t._self._c||e;return c("main",[c("SectionHero"),t._v(" "),c("SmoothScroll",[c("SectionSpace"),t._v(" "),c("SectionItemLeft"),t._v(" "),c("SectionItemRight"),t._v(" "),c("SectionItemLeft"),t._v(" "),c("SectionItemRight"),t._v(" "),c("SectionItemLeft"),t._v(" "),c("SectionItemRight"),t._v(" "),c("SectionItemLeft"),t._v(" "),c("SectionSpace")],1),t._v(" "),c("CursorFollower")],1)}),[],!1,null,null,null);e.default=C.exports}}]); -------------------------------------------------------------------------------- /dist/_nuxt/icons/icon_192x192.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/icon_192x192.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/icon_512x512.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/icon_512x512.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/icon_64x64.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/icon_64x64.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/splash_ipad_1536x2048.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/splash_ipad_1536x2048.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/splash_ipadpro10_1668x2224.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/splash_ipadpro10_1668x2224.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/splash_ipadpro12_2048x2732.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/splash_ipadpro12_2048x2732.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/splash_ipadpro9_1536x2048.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/splash_ipadpro9_1536x2048.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/splash_iphone6_50x1334.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/splash_iphone6_50x1334.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/splash_iphoneplus_1080x1920.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/splash_iphoneplus_1080x1920.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/splash_iphonese_640x1136.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/splash_iphonese_640x1136.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/splash_iphonex_1125x2436.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/splash_iphonex_1125x2436.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/splash_iphonexr_828x1792.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/splash_iphonexr_828x1792.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/icons/splash_iphonexsmax_1242x2688.d205f9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/icons/splash_iphonexsmax_1242x2688.d205f9.png -------------------------------------------------------------------------------- /dist/_nuxt/img/facebook-img.893c889.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/img/facebook-img.893c889.jpg -------------------------------------------------------------------------------- /dist/_nuxt/img/twitter-img.1c3e460.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/_nuxt/img/twitter-img.1c3e460.jpg -------------------------------------------------------------------------------- /dist/_nuxt/manifest.5622242a.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Nuxt + Locomotive", 3 | "short_name": "Nuxt Locomotive", 4 | "description": "Starter template for parallax effects & smooth scrolling experience", 5 | "icons": [ 6 | { 7 | "src": "/_nuxt/icons/icon_64x64.d205f9.png", 8 | "sizes": "64x64", 9 | "type": "image/png", 10 | "purpose": "any maskable" 11 | }, 12 | { 13 | "src": "/_nuxt/icons/icon_192x192.d205f9.png", 14 | "sizes": "192x192", 15 | "type": "image/png", 16 | "purpose": "any maskable" 17 | }, 18 | { 19 | "src": "/_nuxt/icons/icon_512x512.d205f9.png", 20 | "sizes": "512x512", 21 | "type": "image/png", 22 | "purpose": "any maskable" 23 | } 24 | ], 25 | "start_url": "/?standalone=true", 26 | "display": "standalone", 27 | "background_color": "#030303", 28 | "theme_color": "#030303", 29 | "lang": "en-US" 30 | } -------------------------------------------------------------------------------- /dist/_nuxt/static/1656164883/manifest.js: -------------------------------------------------------------------------------- 1 | __NUXT_JSONP__("manifest.js", {routes:["\u002F"]}) -------------------------------------------------------------------------------- /dist/_nuxt/static/1656164883/payload.js: -------------------------------------------------------------------------------- 1 | __NUXT_JSONP__("/", {data:[{}],fetch:{},mutations:void 0}); -------------------------------------------------------------------------------- /dist/_nuxt/static/1656164883/state.js: -------------------------------------------------------------------------------- 1 | window.__NUXT__=(function(a,b,c,d){return {staticAssetsBase:"\u002F_nuxt\u002Fstatic\u002F1656164883",layout:"default",error:a,serverRendered:true,routePath:b,config:{app:{url:"https:\u002F\u002Fnuxt-locomotive.netlify.app",name:c,title:c,titleSeparator:" — ",titleTemplate:d,description:d,type:"website"},breakpoints:{sm:"640px",md:"768px",lg:"1024px",xl:"1280px","2xl":"1536px"},_app:{basePath:b,assetsPath:"\u002F_nuxt\u002F",cdnURL:a}}}}(null,"\u002F","Nuxt + Locomotive","Starter template for parallax effects & smooth scrolling experience")); -------------------------------------------------------------------------------- /dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/favicon.ico -------------------------------------------------------------------------------- /dist/fonts/I-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/fonts/I-300.woff2 -------------------------------------------------------------------------------- /dist/fonts/I-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/fonts/I-400.woff2 -------------------------------------------------------------------------------- /dist/fonts/I-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/fonts/I-500.woff2 -------------------------------------------------------------------------------- /dist/fonts/I-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/fonts/I-600.woff2 -------------------------------------------------------------------------------- /dist/fonts/font-face.css: -------------------------------------------------------------------------------- 1 | /** 2 | * The Inter typeface family 3 | * Version: 3.15 4 | * 5 | * Inter is a typeface carefully crafted & designed for computer screens. 6 | * @link https://rsms.me/inter/ 7 | * 8 | */ 9 | 10 | @font-face { 11 | font-family: 'I'; 12 | font-style: normal; 13 | font-weight: 300; 14 | font-display: swap; 15 | src: url('/fonts/I-300.woff2') format('woff2'); 16 | } 17 | 18 | @font-face { 19 | font-family: 'I'; 20 | font-style: normal; 21 | font-weight: 400; 22 | font-display: swap; 23 | src: url('/fonts/I-400.woff2') format('woff2'); 24 | } 25 | 26 | @font-face { 27 | font-family: 'I'; 28 | font-style: normal; 29 | font-weight: 500; 30 | font-display: swap; 31 | src: url('/fonts/I-500.woff2') format('woff2'); 32 | } 33 | 34 | @font-face { 35 | font-family: 'I'; 36 | font-style: normal; 37 | font-weight: 600; 38 | font-display: swap; 39 | src: url('/fonts/I-600.woff2') format('woff2'); 40 | } 41 | -------------------------------------------------------------------------------- /dist/images/grain.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/images/grain.gif -------------------------------------------------------------------------------- /dist/images/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/images/star.png -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Nuxt + Locomotive — Starter template for parallax effects & smooth scrolling experience 5 | 6 | 7 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /dist/netlify.toml: -------------------------------------------------------------------------------- 1 | [[headers]] 2 | for = "/*" 3 | 4 | [headers.values] 5 | Referrer-Policy = "origin" 6 | X-Content-Type-Options = "nosniff" 7 | X-Frame-Options = "DENY" 8 | X-XSS-Protection = "1; mode=block" 9 | 10 | [[headers]] 11 | for = "/_nuxt/*" 12 | 13 | [headers.values] 14 | Cache-Control = "public, max-age=31536000, immutable" 15 | 16 | [[headers]] 17 | for = "/sw.js" 18 | 19 | [headers.values] 20 | Cache-Control = "no-cache" 21 | 22 | [[headers]] 23 | for = "/favicon.ico" 24 | 25 | [headers.values] 26 | Cache-Control = "public, max-age=86400" 27 | 28 | [[redirects]] 29 | from = "https://nuxt-locomotive.netlify.app/*" 30 | to = "https://nuxt-locomotive.netlify.app/:splat" 31 | status = 301 32 | -------------------------------------------------------------------------------- /dist/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | Sitemap: https://nuxt-locomotive.netlify.app/sitemap.xml -------------------------------------------------------------------------------- /dist/sitemap.xml: -------------------------------------------------------------------------------- 1 | https://nuxt-locomotive.netlify.app/2022-06-25T13:48:03.165Zdaily1.0 -------------------------------------------------------------------------------- /dist/sitemap.xml.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/dist/sitemap.xml.gz -------------------------------------------------------------------------------- /dist/sw.js: -------------------------------------------------------------------------------- 1 | const options = {"workboxURL":"https://cdn.jsdelivr.net/npm/workbox-cdn@5.1.4/workbox/workbox-sw.js","importScripts":[],"config":{"debug":false},"cacheOptions":{"cacheId":"nuxt-locomotive-prod","directoryIndex":"/","revision":"JPBGh9ZyOh7I"},"clientsClaim":true,"skipWaiting":true,"cleanupOutdatedCaches":true,"offlineAnalytics":false,"preCaching":[{"revision":"JPBGh9ZyOh7I","url":"/?standalone=true"}],"runtimeCaching":[{"urlPattern":"/_nuxt/","handler":"CacheFirst","method":"GET","strategyPlugins":[]},{"urlPattern":"/","handler":"NetworkFirst","method":"GET","strategyPlugins":[]}],"offlinePage":null,"pagesURLPattern":"/","offlineStrategy":"NetworkFirst"} 2 | 3 | importScripts(...[options.workboxURL, ...options.importScripts]) 4 | 5 | initWorkbox(workbox, options) 6 | workboxExtensions(workbox, options) 7 | precacheAssets(workbox, options) 8 | cachingExtensions(workbox, options) 9 | runtimeCaching(workbox, options) 10 | offlinePage(workbox, options) 11 | routingExtensions(workbox, options) 12 | 13 | function getProp(obj, prop) { 14 | return prop.split('.').reduce((p, c) => p[c], obj) 15 | } 16 | 17 | function initWorkbox(workbox, options) { 18 | if (options.config) { 19 | // Set workbox config 20 | workbox.setConfig(options.config) 21 | } 22 | 23 | if (options.cacheNames) { 24 | // Set workbox cache names 25 | workbox.core.setCacheNameDetails(options.cacheNames) 26 | } 27 | 28 | if (options.clientsClaim) { 29 | // Start controlling any existing clients as soon as it activates 30 | workbox.core.clientsClaim() 31 | } 32 | 33 | if (options.skipWaiting) { 34 | workbox.core.skipWaiting() 35 | } 36 | 37 | if (options.cleanupOutdatedCaches) { 38 | workbox.precaching.cleanupOutdatedCaches() 39 | } 40 | 41 | if (options.offlineAnalytics) { 42 | // Enable offline Google Analytics tracking 43 | workbox.googleAnalytics.initialize() 44 | } 45 | } 46 | 47 | function precacheAssets(workbox, options) { 48 | if (options.preCaching.length) { 49 | workbox.precaching.precacheAndRoute(options.preCaching, options.cacheOptions) 50 | } 51 | } 52 | 53 | 54 | function runtimeCaching(workbox, options) { 55 | const requestInterceptor = { 56 | requestWillFetch({ request }) { 57 | if (request.cache === 'only-if-cached' && request.mode === 'no-cors') { 58 | return new Request(request.url, { ...request, cache: 'default', mode: 'no-cors' }) 59 | } 60 | return request 61 | }, 62 | fetchDidFail(ctx) { 63 | ctx.error.message = 64 | '[workbox] Network request for ' + ctx.request.url + ' threw an error: ' + ctx.error.message 65 | console.error(ctx.error, 'Details:', ctx) 66 | }, 67 | handlerDidError(ctx) { 68 | ctx.error.message = 69 | `[workbox] Network handler threw an error: ` + ctx.error.message 70 | console.error(ctx.error, 'Details:', ctx) 71 | return null 72 | } 73 | } 74 | 75 | for (const entry of options.runtimeCaching) { 76 | const urlPattern = new RegExp(entry.urlPattern) 77 | const method = entry.method || 'GET' 78 | 79 | const plugins = (entry.strategyPlugins || []) 80 | .map(p => new (getProp(workbox, p.use))(...p.config)) 81 | 82 | plugins.unshift(requestInterceptor) 83 | 84 | const strategyOptions = { ...entry.strategyOptions, plugins } 85 | 86 | const strategy = new workbox.strategies[entry.handler](strategyOptions) 87 | 88 | workbox.routing.registerRoute(urlPattern, strategy, method) 89 | } 90 | } 91 | 92 | function offlinePage(workbox, options) { 93 | if (options.offlinePage) { 94 | // Register router handler for offlinePage 95 | workbox.routing.registerRoute(new RegExp(options.pagesURLPattern), ({ request, event }) => { 96 | const strategy = new workbox.strategies[options.offlineStrategy] 97 | return strategy 98 | .handle({ request, event }) 99 | .catch(() => caches.match(options.offlinePage)) 100 | }) 101 | } 102 | } 103 | 104 | function workboxExtensions(workbox, options) { 105 | 106 | } 107 | 108 | function cachingExtensions(workbox, options) { 109 | 110 | } 111 | 112 | function routingExtensions(workbox, options) { 113 | 114 | } 115 | -------------------------------------------------------------------------------- /layouts/default.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 24 | -------------------------------------------------------------------------------- /layouts/error.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 27 | -------------------------------------------------------------------------------- /layouts/errorLayout.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /nuxt.config.js: -------------------------------------------------------------------------------- 1 | import config from './config' 2 | import routes from './pages/routes' 3 | 4 | export default { 5 | target: 'static', 6 | 7 | modern: !config.isDev && 'client', 8 | 9 | components: false, 10 | 11 | loading: false, 12 | 13 | telemetry: false, 14 | 15 | globalName: config.nuxt.globalName, 16 | 17 | dir: { 18 | static: 'public' 19 | }, 20 | 21 | server: { 22 | port: config.server.port, 23 | host: config.server.hostname 24 | }, 25 | 26 | watch: ['~/config/*', '~/tailwind.config.js'], 27 | 28 | modules: ['@nuxtjs/pwa', '@nuxtjs/svg', '@nuxtjs/robots', '@nuxtjs/sitemap'], 29 | 30 | buildModules: [ 31 | '@nuxt/postcss8', 32 | '@nuxtjs/netlify-files', 33 | 'nuxt-font-loader', 34 | 'nuxt-gsap-module', 35 | 'nuxt-lazysizes' 36 | ], 37 | 38 | css: ['~/assets/styles/main.css'], 39 | 40 | plugins: ['~/plugins/locomotiveScroll.client.js'], 41 | 42 | /** 43 | * @link https://github.com/nuxt/nuxt.js/issues/6028 44 | */ 45 | layoutTransition: { 46 | name: 'layout', 47 | mode: 'out-in' 48 | }, 49 | 50 | pageTransition: { 51 | name: 'page', 52 | mode: 'out-in' 53 | }, 54 | 55 | head: { 56 | htmlAttrs: { 57 | lang: config.app.lang 58 | }, 59 | 60 | /** 61 | * Corrects the page title when routes have a delayed transition 62 | * @link https://github.com/nuxt/vue-meta/issues/621 63 | */ 64 | title: null, 65 | titleTemplate: null, 66 | 67 | meta: [ 68 | { 69 | hid: 'charset', 70 | charset: config.app.charset 71 | }, 72 | { 73 | hid: 'http-equiv', 74 | 'http-equiv': 'X-UA-Compatible', 75 | content: 'IE=edge' 76 | }, 77 | { 78 | hid: 'viewport', 79 | name: 'viewport', 80 | content: 'width=device-width,initial-scale=1' 81 | }, 82 | { 83 | hid: 'description', 84 | name: 'description', 85 | content: config.app.description 86 | }, 87 | { 88 | hid: 'robots', 89 | name: 'robots', 90 | content: 91 | 'index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1' 92 | } 93 | ] 94 | }, 95 | 96 | router: { 97 | linkActiveClass: 'link-active', 98 | linkExactActiveClass: 'link-exact-active', 99 | 100 | extendRoutes() { 101 | return routes 102 | } 103 | }, 104 | 105 | build: { 106 | publicPath: config.nuxt.publicPath, 107 | 108 | extractCSS: true, 109 | 110 | templates: [ 111 | { 112 | src: 'templates/app.html', 113 | dst: 'views/app.template.html' 114 | } 115 | ], 116 | 117 | postcss: { 118 | plugins: { 119 | 'postcss-import': true, 120 | tailwindcss: {}, 121 | autoprefixer: {} 122 | } 123 | } 124 | }, 125 | 126 | generate: { 127 | dir: 'dist', 128 | fallback: true // Error 404 page 129 | }, 130 | 131 | publicRuntimeConfig: { 132 | app: { 133 | url: config.app.url, 134 | name: config.app.name, 135 | title: config.app.title, 136 | titleSeparator: config.app.titleSeparator, 137 | titleTemplate: config.app.titleTemplate, 138 | description: config.app.description, 139 | type: config.app.type 140 | }, 141 | breakpoints: config.breakpoints 142 | }, 143 | 144 | privateRuntimeConfig: {}, 145 | 146 | pwa: { 147 | icon: { 148 | source: 'assets/favicons/icon.png', 149 | sizes: [64, 192, 512] 150 | }, 151 | 152 | meta: { 153 | author: config.app.author 154 | }, 155 | 156 | manifest: { 157 | name: config.app.name, 158 | short_name: config.app.shortName, 159 | description: config.app.description, 160 | lang: config.app.lang, 161 | theme_color: config.app.themeColor, 162 | background_color: config.app.backgroundColor 163 | } 164 | }, 165 | 166 | robots: { 167 | UserAgent: () => ['*'], 168 | Sitemap: () => [`${config.app.url}/sitemap.xml`] 169 | }, 170 | 171 | sitemap: { 172 | hostname: config.app.url, 173 | gzip: true, 174 | defaults: { 175 | changefreq: 'daily', 176 | priority: 1, 177 | lastmod: new Date(), 178 | lastmodrealtime: true 179 | } 180 | }, 181 | 182 | netlifyFiles: { 183 | copyExistingFiles: false, 184 | 185 | netlifyToml: { 186 | headers: [ 187 | { 188 | for: '/*', 189 | values: { 190 | 'Referrer-Policy': 'origin', 191 | 'X-Content-Type-Options': 'nosniff', 192 | 'X-Frame-Options': 'DENY', 193 | 'X-XSS-Protection': '1; mode=block' 194 | } 195 | }, 196 | { 197 | for: `${config.nuxt.publicPath}*`, 198 | values: { 199 | 'Cache-Control': 'public, max-age=31536000, immutable' 200 | } 201 | }, 202 | { 203 | for: '/sw.js', 204 | values: { 205 | 'Cache-Control': 'no-cache' 206 | } 207 | }, 208 | { 209 | for: '/favicon.ico', 210 | values: { 211 | 'Cache-Control': 'public, max-age=86400' 212 | } 213 | } 214 | ], 215 | 216 | redirects: [ 217 | { 218 | from: `${config.app.baseUrl}/*`, 219 | to: `${config.app.url}/:splat`, 220 | status: 301 221 | } 222 | ] 223 | } 224 | }, 225 | 226 | fontLoader: { 227 | url: '/fonts/font-face.css' 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nuxt-locomotive", 3 | "version": "1.0.0", 4 | "description": "Starter template for parallax effects & smooth scrolling experience.", 5 | "author": "Ivo Dolenc", 6 | "license": "MIT", 7 | "homepage": "https://github.com/ivodolenc/nuxt-locomotive", 8 | "keywords": [ 9 | "nuxt", 10 | "boilerplate", 11 | "nuxt-boilerplate", 12 | "nuxt-locomotive-scroll", 13 | "locomotive-scroll", 14 | "nuxt-locomotive", 15 | "nuxt-template", 16 | "smooth-scroll", 17 | "locomotive", 18 | "template" 19 | ], 20 | "scripts": { 21 | "dev": "nuxt", 22 | "generate": "nuxt generate", 23 | "start": "nuxt start", 24 | "lint:eslint": "eslint --ext .js,.vue .", 25 | "lint:fix:eslint": "yarn lint:eslint --fix" 26 | }, 27 | "dependencies": { 28 | "@nuxtjs/pwa": "^3.3.5", 29 | "@nuxtjs/robots": "^2.5.0", 30 | "@nuxtjs/sitemap": "^2.4.0", 31 | "nuxt": "^2.15.8" 32 | }, 33 | "devDependencies": { 34 | "@nuxt/postcss8": "^1.1.3", 35 | "@nuxtjs/eslint-config": "^10.0.0", 36 | "@nuxtjs/netlify-files": "^1.2.0", 37 | "@nuxtjs/svg": "^0.4.0", 38 | "autoprefixer": "^10.4.7", 39 | "eslint": "^8.18.0", 40 | "eslint-config-prettier": "^8.5.0", 41 | "locomotive-scroll": "^4.1.4", 42 | "nuxt-font-loader": "^1.1.5", 43 | "nuxt-gsap-module": "^1.7.1", 44 | "nuxt-lazysizes": "^1.4.2", 45 | "postcss": "^8.4.14", 46 | "prettier": "^2.7.1", 47 | "tailwindcss": "^3.1.4" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /pages/home/SectionHero/SvgTitle.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 58 | -------------------------------------------------------------------------------- /pages/home/SectionHero/index.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 34 | 35 | 47 | -------------------------------------------------------------------------------- /pages/home/SectionItemLeft/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 26 | -------------------------------------------------------------------------------- /pages/home/SectionItemRight/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 15 | 16 | 31 | -------------------------------------------------------------------------------- /pages/home/SectionSpace/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /pages/home/index.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 129 | -------------------------------------------------------------------------------- /pages/routes.js: -------------------------------------------------------------------------------- 1 | const routes = [ 2 | { 3 | name: 'home', 4 | path: '/', 5 | component: 'pages/home/index.vue' 6 | } 7 | ] 8 | 9 | export default routes 10 | -------------------------------------------------------------------------------- /plugins/locomotiveScroll.client.js: -------------------------------------------------------------------------------- 1 | import LocomotiveScroll from 'locomotive-scroll' 2 | 3 | export default ({ app }, inject) => { 4 | inject('LocomotiveScroll', LocomotiveScroll) 5 | } 6 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/I-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/public/fonts/I-300.woff2 -------------------------------------------------------------------------------- /public/fonts/I-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/public/fonts/I-400.woff2 -------------------------------------------------------------------------------- /public/fonts/I-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/public/fonts/I-500.woff2 -------------------------------------------------------------------------------- /public/fonts/I-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/public/fonts/I-600.woff2 -------------------------------------------------------------------------------- /public/fonts/font-face.css: -------------------------------------------------------------------------------- 1 | /** 2 | * The Inter typeface family 3 | * Version: 3.15 4 | * 5 | * Inter is a typeface carefully crafted & designed for computer screens. 6 | * @link https://rsms.me/inter/ 7 | * 8 | */ 9 | 10 | @font-face { 11 | font-family: 'I'; 12 | font-style: normal; 13 | font-weight: 300; 14 | font-display: swap; 15 | src: url('/fonts/I-300.woff2') format('woff2'); 16 | } 17 | 18 | @font-face { 19 | font-family: 'I'; 20 | font-style: normal; 21 | font-weight: 400; 22 | font-display: swap; 23 | src: url('/fonts/I-400.woff2') format('woff2'); 24 | } 25 | 26 | @font-face { 27 | font-family: 'I'; 28 | font-style: normal; 29 | font-weight: 500; 30 | font-display: swap; 31 | src: url('/fonts/I-500.woff2') format('woff2'); 32 | } 33 | 34 | @font-face { 35 | font-family: 'I'; 36 | font-style: normal; 37 | font-weight: 600; 38 | font-display: swap; 39 | src: url('/fonts/I-600.woff2') format('woff2'); 40 | } 41 | -------------------------------------------------------------------------------- /public/images/grain.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/public/images/grain.gif -------------------------------------------------------------------------------- /public/images/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivodolenc/nuxt-locomotive/4124730afb81ccb0a3d8acb58ed335e9f7d46683/public/images/star.png -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: [ 3 | './components/**/*.{js,vue}', 4 | './layouts/**/*.vue', 5 | './pages/**/*.vue', 6 | './plugins/**/*.js', 7 | './nuxt.config.js' 8 | ], 9 | 10 | theme: { 11 | fontFamily: { 12 | sans: ['I', 'Helvetica', 'Arial', 'sans-serif'] 13 | }, 14 | 15 | extend: { 16 | colors: { 17 | dark: '#030303' 18 | } 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /templates/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ HEAD }} 5 | 6 | 7 | {{ APP }} 8 | 9 | 10 | -------------------------------------------------------------------------------- /utils/getHeadData.js: -------------------------------------------------------------------------------- 1 | import config from '../config' 2 | 3 | export const canonical = (path = []) => { 4 | return [ 5 | { 6 | rel: 'canonical', 7 | href: config.app.url + path 8 | } 9 | ] 10 | } 11 | 12 | export const facebook = (path = []) => { 13 | return [ 14 | { 15 | hid: 'og:title', 16 | property: 'og:title', 17 | content: config.app.title 18 | }, 19 | { 20 | hid: 'og:description', 21 | property: 'og:description', 22 | content: config.app.description 23 | }, 24 | { 25 | hid: 'og:type', 26 | property: 'og:type', 27 | content: config.app.type 28 | }, 29 | { 30 | hid: 'og:site_name', 31 | property: 'og:site_name', 32 | content: config.app.title 33 | }, 34 | { 35 | hid: 'og:locale', 36 | property: 'og:locale', 37 | content: config.app.locale 38 | }, 39 | { 40 | hid: 'og:url', 41 | property: 'og:url', 42 | content: config.app.url + path 43 | }, 44 | { 45 | hid: 'og:image', 46 | property: 'og:image', 47 | content: config.app.url + require('~/assets/images/facebook-img.jpg') 48 | } 49 | ] 50 | } 51 | 52 | export const twitter = () => { 53 | return [ 54 | { 55 | hid: 'twitter:card', 56 | name: 'twitter:card', 57 | content: 'summary_large_image' 58 | }, 59 | { 60 | hid: 'twitter:title', 61 | name: 'twitter:title', 62 | content: config.app.title 63 | }, 64 | { 65 | hid: 'twitter:description', 66 | name: 'twitter:description', 67 | content: config.app.description 68 | }, 69 | { 70 | hid: 'twitter:image:src', 71 | name: 'twitter:image:src', 72 | content: config.app.url + require('~/assets/images/twitter-img.jpg') 73 | } 74 | ] 75 | } 76 | 77 | export const appLdJson = (path = []) => { 78 | return [ 79 | { 80 | hid: 'application/ld+json', 81 | type: 'application/ld+json', 82 | json: { 83 | '@context': 'https://schema.org', 84 | '@type': config.app.type, 85 | name: config.app.name, 86 | url: config.app.url + path, 87 | sameAs: [ 88 | 'https://www.facebook.com/', 89 | 'https://www.instagram.com/', 90 | 'https://www.twitter.com/' 91 | ] 92 | } 93 | } 94 | ] 95 | } 96 | --------------------------------------------------------------------------------