├── .DS_Store ├── .gitignore ├── .idea ├── .gitignore ├── devriz-website.iml ├── inspectionProfiles │ └── Project_Default.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── .nuxt ├── App.js ├── client.js ├── components │ ├── index.js │ ├── nuxt-build-indicator.vue │ ├── nuxt-child.js │ ├── nuxt-error.vue │ ├── nuxt-link.client.js │ ├── nuxt-link.server.js │ ├── nuxt-loading.vue │ ├── nuxt.js │ ├── plugin.js │ ├── readme.md │ └── utils.js ├── empty.js ├── index.js ├── jsonp.js ├── layouts │ └── default.vue ├── loading.html ├── middleware.js ├── mixins │ ├── fetch.client.js │ └── fetch.server.js ├── router.js ├── router.scrollBehavior.js ├── routes.json ├── server.js ├── store.js ├── utils.js ├── vetur │ └── tags.json └── views │ ├── app.template.html │ └── error.html ├── README.md ├── assets ├── .DS_Store └── css │ └── tailwind.css ├── components ├── contact.vue ├── footer.vue ├── landing.vue ├── langs.vue ├── meet.vue ├── navbar.vue ├── overlay.vue ├── products.vue ├── sidebar.vue ├── stackCard.vue ├── techstackCard.vue └── whyUs.vue ├── jsconfig.json ├── layouts └── error.vue ├── nuxt.config.js ├── package.json ├── pages ├── form │ └── success.vue └── index.vue ├── static ├── .DS_Store ├── data │ └── menu │ │ └── main-drawer-menu.json ├── dummy-form │ └── index.html ├── favicon.ico └── images │ ├── android_phone_mock.png │ ├── contact_us.png │ ├── database_mock.png │ ├── error_hand.png │ ├── favicon.png │ ├── landing_bg.png │ ├── laptop_mock.png │ ├── logo_new_semi_fhd.png │ ├── logo_new_semi_fhd.svg │ ├── logo_new_semi_fhd_dark.png │ ├── logo_new_semi_fhd_dark_all_white.png │ ├── phone_mock.png │ ├── preview_photo.png │ └── success_hand.png ├── store └── drawer.js ├── tailwind.config.js ├── yarn-error.log └── yarn.lock /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevrizTech/website/c087f3022f302eb7f5beea133a8b0cfadc793931/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /.idea/devriz-website.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.nuxt/App.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import { decode, parsePath, withoutBase, withoutTrailingSlash, normalizeURL } from 'ufo' 3 | 4 | import { getMatchedComponentsInstances, getChildrenComponentInstancesUsingFetch, promisify, globalHandleError, urlJoin, sanitizeComponent } from './utils' 5 | import NuxtError from '..\\layouts\\error.vue' 6 | import NuxtLoading from './components/nuxt-loading.vue' 7 | import NuxtBuildIndicator from './components/nuxt-build-indicator' 8 | 9 | import '..\\assets\\css\\tailwind.css' 10 | 11 | import _6f6c098b from './layouts/default.vue' 12 | 13 | const layouts = { "_default": sanitizeComponent(_6f6c098b) } 14 | 15 | export default { 16 | render (h, props) { 17 | const loadingEl = h('NuxtLoading', { ref: 'loading' }) 18 | 19 | const layoutEl = h(this.layout || 'nuxt') 20 | const templateEl = h('div', { 21 | domProps: { 22 | id: '__layout' 23 | }, 24 | key: this.layoutName 25 | }, [layoutEl]) 26 | 27 | const transitionEl = h('transition', { 28 | props: { 29 | name: 'layout', 30 | mode: 'out-in' 31 | }, 32 | on: { 33 | beforeEnter (el) { 34 | // Ensure to trigger scroll event after calling scrollBehavior 35 | window.$nuxt.$nextTick(() => { 36 | window.$nuxt.$emit('triggerScroll') 37 | }) 38 | } 39 | } 40 | }, [templateEl]) 41 | 42 | return h('div', { 43 | domProps: { 44 | id: '__nuxt' 45 | } 46 | }, [ 47 | loadingEl, 48 | h(NuxtBuildIndicator), 49 | transitionEl 50 | ]) 51 | }, 52 | 53 | data: () => ({ 54 | isOnline: true, 55 | 56 | layout: null, 57 | layoutName: '', 58 | 59 | nbFetching: 0 60 | }), 61 | 62 | beforeCreate () { 63 | Vue.util.defineReactive(this, 'nuxt', this.$options.nuxt) 64 | }, 65 | created () { 66 | // Add this.$nuxt in child instances 67 | this.$root.$options.$nuxt = this 68 | 69 | if (process.client) { 70 | // add to window so we can listen when ready 71 | window.$nuxt = this 72 | 73 | this.refreshOnlineStatus() 74 | // Setup the listeners 75 | window.addEventListener('online', this.refreshOnlineStatus) 76 | window.addEventListener('offline', this.refreshOnlineStatus) 77 | } 78 | // Add $nuxt.error() 79 | this.error = this.nuxt.error 80 | // Add $nuxt.context 81 | this.context = this.$options.context 82 | }, 83 | 84 | async mounted () { 85 | this.$loading = this.$refs.loading 86 | }, 87 | 88 | watch: { 89 | 'nuxt.err': 'errorChanged' 90 | }, 91 | 92 | computed: { 93 | isOffline () { 94 | return !this.isOnline 95 | }, 96 | 97 | isFetching () { 98 | return this.nbFetching > 0 99 | }, 100 | 101 | isPreview () { 102 | return Boolean(this.$options.previewData) 103 | }, 104 | }, 105 | 106 | methods: { 107 | refreshOnlineStatus () { 108 | if (process.client) { 109 | if (typeof window.navigator.onLine === 'undefined') { 110 | // If the browser doesn't support connection status reports 111 | // assume that we are online because most apps' only react 112 | // when they now that the connection has been interrupted 113 | this.isOnline = true 114 | } else { 115 | this.isOnline = window.navigator.onLine 116 | } 117 | } 118 | }, 119 | 120 | async refresh () { 121 | const pages = getMatchedComponentsInstances(this.$route) 122 | 123 | if (!pages.length) { 124 | return 125 | } 126 | this.$loading.start() 127 | 128 | const promises = pages.map((page) => { 129 | const p = [] 130 | 131 | // Old fetch 132 | if (page.$options.fetch && page.$options.fetch.length) { 133 | p.push(promisify(page.$options.fetch, this.context)) 134 | } 135 | if (page.$fetch) { 136 | p.push(page.$fetch()) 137 | } else { 138 | // Get all component instance to call $fetch 139 | for (const component of getChildrenComponentInstancesUsingFetch(page.$vnode.componentInstance)) { 140 | p.push(component.$fetch()) 141 | } 142 | } 143 | 144 | if (page.$options.asyncData) { 145 | p.push( 146 | promisify(page.$options.asyncData, this.context) 147 | .then((newData) => { 148 | for (const key in newData) { 149 | Vue.set(page.$data, key, newData[key]) 150 | } 151 | }) 152 | ) 153 | } 154 | 155 | return Promise.all(p) 156 | }) 157 | try { 158 | await Promise.all(promises) 159 | } catch (error) { 160 | this.$loading.fail(error) 161 | globalHandleError(error) 162 | this.error(error) 163 | } 164 | this.$loading.finish() 165 | }, 166 | errorChanged () { 167 | if (this.nuxt.err) { 168 | if (this.$loading) { 169 | if (this.$loading.fail) { 170 | this.$loading.fail(this.nuxt.err) 171 | } 172 | if (this.$loading.finish) { 173 | this.$loading.finish() 174 | } 175 | } 176 | 177 | let errorLayout = (NuxtError.options || NuxtError).layout; 178 | 179 | if (typeof errorLayout === 'function') { 180 | errorLayout = errorLayout(this.context) 181 | } 182 | 183 | this.setLayout(errorLayout) 184 | } 185 | }, 186 | 187 | setLayout (layout) { 188 | if(layout && typeof layout !== 'string') { 189 | throw new Error('[nuxt] Avoid using non-string value as layout property.') 190 | } 191 | 192 | if (!layout || !layouts['_' + layout]) { 193 | layout = 'default' 194 | } 195 | this.layoutName = layout 196 | this.layout = layouts['_' + layout] 197 | return this.layout 198 | }, 199 | loadLayout (layout) { 200 | if (!layout || !layouts['_' + layout]) { 201 | layout = 'default' 202 | } 203 | return Promise.resolve(layouts['_' + layout]) 204 | }, 205 | }, 206 | 207 | components: { 208 | NuxtLoading 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /.nuxt/client.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import fetch from 'unfetch' 3 | import middleware from './middleware.js' 4 | import { 5 | applyAsyncData, 6 | promisify, 7 | middlewareSeries, 8 | sanitizeComponent, 9 | resolveRouteComponents, 10 | getMatchedComponents, 11 | getMatchedComponentsInstances, 12 | flatMapComponents, 13 | setContext, 14 | getLocation, 15 | compile, 16 | getQueryDiff, 17 | globalHandleError, 18 | isSamePath, 19 | urlJoin 20 | } from './utils.js' 21 | import { createApp, NuxtError } from './index.js' 22 | import fetchMixin from './mixins/fetch.client' 23 | import NuxtLink from './components/nuxt-link.client.js' // should be included after ./index.js 24 | 25 | // Fetch mixin 26 | if (!Vue.__nuxt__fetch__mixin__) { 27 | Vue.mixin(fetchMixin) 28 | Vue.__nuxt__fetch__mixin__ = true 29 | } 30 | 31 | // Component: 32 | Vue.component(NuxtLink.name, NuxtLink) 33 | Vue.component('NLink', NuxtLink) 34 | 35 | if (!global.fetch) { global.fetch = fetch } 36 | 37 | // Global shared references 38 | let _lastPaths = [] 39 | let app 40 | let router 41 | let store 42 | 43 | // Try to rehydrate SSR data from window 44 | const NUXT = window.__NUXT__ || {} 45 | 46 | const $config = NUXT.config || {} 47 | if ($config._app) { 48 | __webpack_public_path__ = urlJoin($config._app.cdnURL, $config._app.assetsPath) 49 | } 50 | 51 | Object.assign(Vue.config, {"silent":false,"performance":true}) 52 | 53 | const logs = NUXT.logs || [] 54 | if (logs.length > 0) { 55 | const ssrLogStyle = 'background: #2E495E;border-radius: 0.5em;color: white;font-weight: bold;padding: 2px 0.5em;' 56 | console.group && console.group ('%cNuxt SSR', ssrLogStyle) 57 | logs.forEach(logObj => (console[logObj.type] || console.log)(...logObj.args)) 58 | delete NUXT.logs 59 | console.groupEnd && console.groupEnd() 60 | } 61 | 62 | // Setup global Vue error handler 63 | if (!Vue.config.$nuxt) { 64 | const defaultErrorHandler = Vue.config.errorHandler 65 | Vue.config.errorHandler = async (err, vm, info, ...rest) => { 66 | // Call other handler if exist 67 | let handled = null 68 | if (typeof defaultErrorHandler === 'function') { 69 | handled = defaultErrorHandler(err, vm, info, ...rest) 70 | } 71 | if (handled === true) { 72 | return handled 73 | } 74 | 75 | if (vm && vm.$root) { 76 | const nuxtApp = Object.keys(Vue.config.$nuxt) 77 | .find(nuxtInstance => vm.$root[nuxtInstance]) 78 | 79 | // Show Nuxt Error Page 80 | if (nuxtApp && vm.$root[nuxtApp].error && info !== 'render function') { 81 | const currentApp = vm.$root[nuxtApp] 82 | 83 | // Load error layout 84 | let layout = (NuxtError.options || NuxtError).layout 85 | if (typeof layout === 'function') { 86 | layout = layout(currentApp.context) 87 | } 88 | if (layout) { 89 | await currentApp.loadLayout(layout).catch(() => {}) 90 | } 91 | currentApp.setLayout(layout) 92 | 93 | currentApp.error(err) 94 | } 95 | } 96 | 97 | if (typeof defaultErrorHandler === 'function') { 98 | return handled 99 | } 100 | 101 | // Log to console 102 | if (process.env.NODE_ENV !== 'production') { 103 | console.error(err) 104 | } else { 105 | console.error(err.message || err) 106 | } 107 | } 108 | Vue.config.$nuxt = {} 109 | } 110 | Vue.config.$nuxt.$nuxt = true 111 | 112 | const errorHandler = Vue.config.errorHandler || console.error 113 | 114 | // Create and mount App 115 | createApp(null, NUXT.config).then(mountApp).catch(errorHandler) 116 | 117 | function componentOption (component, key, ...args) { 118 | if (!component || !component.options || !component.options[key]) { 119 | return {} 120 | } 121 | const option = component.options[key] 122 | if (typeof option === 'function') { 123 | return option(...args) 124 | } 125 | return option 126 | } 127 | 128 | function mapTransitions (toComponents, to, from) { 129 | const componentTransitions = (component) => { 130 | const transition = componentOption(component, 'transition', to, from) || {} 131 | return (typeof transition === 'string' ? { name: transition } : transition) 132 | } 133 | 134 | const fromComponents = from ? getMatchedComponents(from) : [] 135 | const maxDepth = Math.max(toComponents.length, fromComponents.length) 136 | 137 | const mergedTransitions = [] 138 | for (let i=0; i typeof toTransitions[key] !== 'undefined' && !key.toLowerCase().includes('leave')) 146 | .forEach((key) => { transitions[key] = toTransitions[key] }) 147 | 148 | mergedTransitions.push(transitions) 149 | } 150 | return mergedTransitions 151 | } 152 | 153 | async function loadAsyncComponents (to, from, next) { 154 | // Check if route changed (this._routeChanged), only if the page is not an error (for validate()) 155 | this._routeChanged = Boolean(app.nuxt.err) || from.name !== to.name 156 | this._paramChanged = !this._routeChanged && from.path !== to.path 157 | this._queryChanged = !this._paramChanged && from.fullPath !== to.fullPath 158 | this._diffQuery = (this._queryChanged ? getQueryDiff(to.query, from.query) : []) 159 | 160 | if ((this._routeChanged || this._paramChanged) && this.$loading.start && !this.$loading.manual) { 161 | this.$loading.start() 162 | } 163 | 164 | try { 165 | if (this._queryChanged) { 166 | const Components = await resolveRouteComponents( 167 | to, 168 | (Component, instance) => ({ Component, instance }) 169 | ) 170 | // Add a marker on each component that it needs to refresh or not 171 | const startLoader = Components.some(({ Component, instance }) => { 172 | const watchQuery = Component.options.watchQuery 173 | if (watchQuery === true) { 174 | return true 175 | } 176 | if (Array.isArray(watchQuery)) { 177 | return watchQuery.some(key => this._diffQuery[key]) 178 | } 179 | if (typeof watchQuery === 'function') { 180 | return watchQuery.apply(instance, [to.query, from.query]) 181 | } 182 | return false 183 | }) 184 | 185 | if (startLoader && this.$loading.start && !this.$loading.manual) { 186 | this.$loading.start() 187 | } 188 | } 189 | // Call next() 190 | next() 191 | } catch (error) { 192 | const err = error || {} 193 | const statusCode = err.statusCode || err.status || (err.response && err.response.status) || 500 194 | const message = err.message || '' 195 | 196 | // Handle chunk loading errors 197 | // This may be due to a new deployment or a network problem 198 | if (/^Loading( CSS)? chunk (\d)+ failed\./.test(message)) { 199 | window.location.reload(true /* skip cache */) 200 | return // prevent error page blinking for user 201 | } 202 | 203 | this.error({ statusCode, message }) 204 | this.$nuxt.$emit('routeChanged', to, from, err) 205 | next() 206 | } 207 | } 208 | 209 | function applySSRData (Component, ssrData) { 210 | if (NUXT.serverRendered && ssrData) { 211 | applyAsyncData(Component, ssrData) 212 | } 213 | 214 | Component._Ctor = Component 215 | return Component 216 | } 217 | 218 | // Get matched components 219 | function resolveComponents (route) { 220 | return flatMapComponents(route, async (Component, _, match, key, index) => { 221 | // If component is not resolved yet, resolve it 222 | if (typeof Component === 'function' && !Component.options) { 223 | Component = await Component() 224 | } 225 | // Sanitize it and save it 226 | const _Component = applySSRData(sanitizeComponent(Component), NUXT.data ? NUXT.data[index] : null) 227 | match.components[key] = _Component 228 | return _Component 229 | }) 230 | } 231 | 232 | function callMiddleware (Components, context, layout) { 233 | let midd = [] 234 | let unknownMiddleware = false 235 | 236 | // If layout is undefined, only call global middleware 237 | if (typeof layout !== 'undefined') { 238 | midd = [] // Exclude global middleware if layout defined (already called before) 239 | layout = sanitizeComponent(layout) 240 | if (layout.options.middleware) { 241 | midd = midd.concat(layout.options.middleware) 242 | } 243 | Components.forEach((Component) => { 244 | if (Component.options.middleware) { 245 | midd = midd.concat(Component.options.middleware) 246 | } 247 | }) 248 | } 249 | 250 | midd = midd.map((name) => { 251 | if (typeof name === 'function') { 252 | return name 253 | } 254 | if (typeof middleware[name] !== 'function') { 255 | unknownMiddleware = true 256 | this.error({ statusCode: 500, message: 'Unknown middleware ' + name }) 257 | } 258 | return middleware[name] 259 | }) 260 | 261 | if (unknownMiddleware) { 262 | return 263 | } 264 | return middlewareSeries(midd, context) 265 | } 266 | 267 | async function render (to, from, next) { 268 | if (this._routeChanged === false && this._paramChanged === false && this._queryChanged === false) { 269 | return next() 270 | } 271 | // Handle first render on SPA mode 272 | let spaFallback = false 273 | if (to === from) { 274 | _lastPaths = [] 275 | spaFallback = true 276 | } else { 277 | const fromMatches = [] 278 | _lastPaths = getMatchedComponents(from, fromMatches).map((Component, i) => { 279 | return compile(from.matched[fromMatches[i]].path)(from.params) 280 | }) 281 | } 282 | 283 | // nextCalled is true when redirected 284 | let nextCalled = false 285 | const _next = (path) => { 286 | if (from.path === path.path && this.$loading.finish) { 287 | this.$loading.finish() 288 | } 289 | 290 | if (from.path !== path.path && this.$loading.pause) { 291 | this.$loading.pause() 292 | } 293 | 294 | if (nextCalled) { 295 | return 296 | } 297 | 298 | nextCalled = true 299 | next(path) 300 | } 301 | 302 | // Update context 303 | await setContext(app, { 304 | route: to, 305 | from, 306 | next: _next.bind(this) 307 | }) 308 | this._dateLastError = app.nuxt.dateErr 309 | this._hadError = Boolean(app.nuxt.err) 310 | 311 | // Get route's matched components 312 | const matches = [] 313 | const Components = getMatchedComponents(to, matches) 314 | 315 | // If no Components matched, generate 404 316 | if (!Components.length) { 317 | // Default layout 318 | await callMiddleware.call(this, Components, app.context) 319 | if (nextCalled) { 320 | return 321 | } 322 | 323 | // Load layout for error page 324 | const errorLayout = (NuxtError.options || NuxtError).layout 325 | const layout = await this.loadLayout( 326 | typeof errorLayout === 'function' 327 | ? errorLayout.call(NuxtError, app.context) 328 | : errorLayout 329 | ) 330 | 331 | await callMiddleware.call(this, Components, app.context, layout) 332 | if (nextCalled) { 333 | return 334 | } 335 | 336 | // Show error page 337 | app.context.error({ statusCode: 404, message: 'This page could not be found' }) 338 | return next() 339 | } 340 | 341 | // Update ._data and other properties if hot reloaded 342 | Components.forEach((Component) => { 343 | if (Component._Ctor && Component._Ctor.options) { 344 | Component.options.asyncData = Component._Ctor.options.asyncData 345 | Component.options.fetch = Component._Ctor.options.fetch 346 | } 347 | }) 348 | 349 | // Apply transitions 350 | this.setTransitions(mapTransitions(Components, to, from)) 351 | 352 | try { 353 | // Call middleware 354 | await callMiddleware.call(this, Components, app.context) 355 | if (nextCalled) { 356 | return 357 | } 358 | if (app.context._errored) { 359 | return next() 360 | } 361 | 362 | // Set layout 363 | let layout = Components[0].options.layout 364 | if (typeof layout === 'function') { 365 | layout = layout(app.context) 366 | } 367 | layout = await this.loadLayout(layout) 368 | 369 | // Call middleware for layout 370 | await callMiddleware.call(this, Components, app.context, layout) 371 | if (nextCalled) { 372 | return 373 | } 374 | if (app.context._errored) { 375 | return next() 376 | } 377 | 378 | // Call .validate() 379 | let isValid = true 380 | try { 381 | for (const Component of Components) { 382 | if (typeof Component.options.validate !== 'function') { 383 | continue 384 | } 385 | 386 | isValid = await Component.options.validate(app.context) 387 | 388 | if (!isValid) { 389 | break 390 | } 391 | } 392 | } catch (validationError) { 393 | // ...If .validate() threw an error 394 | this.error({ 395 | statusCode: validationError.statusCode || '500', 396 | message: validationError.message 397 | }) 398 | return next() 399 | } 400 | 401 | // ...If .validate() returned false 402 | if (!isValid) { 403 | this.error({ statusCode: 404, message: 'This page could not be found' }) 404 | return next() 405 | } 406 | 407 | let instances 408 | // Call asyncData & fetch hooks on components matched by the route. 409 | await Promise.all(Components.map(async (Component, i) => { 410 | // Check if only children route changed 411 | Component._path = compile(to.matched[matches[i]].path)(to.params) 412 | Component._dataRefresh = false 413 | const childPathChanged = Component._path !== _lastPaths[i] 414 | // Refresh component (call asyncData & fetch) when: 415 | // Route path changed part includes current component 416 | // Or route param changed part includes current component and watchParam is not `false` 417 | // Or route query is changed and watchQuery returns `true` 418 | if (this._routeChanged && childPathChanged) { 419 | Component._dataRefresh = true 420 | } else if (this._paramChanged && childPathChanged) { 421 | const watchParam = Component.options.watchParam 422 | Component._dataRefresh = watchParam !== false 423 | } else if (this._queryChanged) { 424 | const watchQuery = Component.options.watchQuery 425 | if (watchQuery === true) { 426 | Component._dataRefresh = true 427 | } else if (Array.isArray(watchQuery)) { 428 | Component._dataRefresh = watchQuery.some(key => this._diffQuery[key]) 429 | } else if (typeof watchQuery === 'function') { 430 | if (!instances) { 431 | instances = getMatchedComponentsInstances(to) 432 | } 433 | Component._dataRefresh = watchQuery.apply(instances[i], [to.query, from.query]) 434 | } 435 | } 436 | if (!this._hadError && this._isMounted && !Component._dataRefresh) { 437 | return 438 | } 439 | 440 | const promises = [] 441 | 442 | const hasAsyncData = ( 443 | Component.options.asyncData && 444 | typeof Component.options.asyncData === 'function' 445 | ) 446 | 447 | const hasFetch = Boolean(Component.options.fetch) && Component.options.fetch.length 448 | 449 | const loadingIncrease = (hasAsyncData && hasFetch) ? 30 : 45 450 | 451 | // Call asyncData(context) 452 | if (hasAsyncData) { 453 | const promise = promisify(Component.options.asyncData, app.context) 454 | 455 | promise.then((asyncDataResult) => { 456 | applyAsyncData(Component, asyncDataResult) 457 | 458 | if (this.$loading.increase) { 459 | this.$loading.increase(loadingIncrease) 460 | } 461 | }) 462 | promises.push(promise) 463 | } 464 | 465 | // Check disabled page loading 466 | this.$loading.manual = Component.options.loading === false 467 | 468 | // Call fetch(context) 469 | if (hasFetch) { 470 | let p = Component.options.fetch(app.context) 471 | if (!p || (!(p instanceof Promise) && (typeof p.then !== 'function'))) { 472 | p = Promise.resolve(p) 473 | } 474 | p.then((fetchResult) => { 475 | if (this.$loading.increase) { 476 | this.$loading.increase(loadingIncrease) 477 | } 478 | }) 479 | promises.push(p) 480 | } 481 | 482 | return Promise.all(promises) 483 | })) 484 | 485 | // If not redirected 486 | if (!nextCalled) { 487 | if (this.$loading.finish && !this.$loading.manual) { 488 | this.$loading.finish() 489 | } 490 | 491 | next() 492 | } 493 | } catch (err) { 494 | const error = err || {} 495 | if (error.message === 'ERR_REDIRECT') { 496 | return this.$nuxt.$emit('routeChanged', to, from, error) 497 | } 498 | _lastPaths = [] 499 | 500 | globalHandleError(error) 501 | 502 | // Load error layout 503 | let layout = (NuxtError.options || NuxtError).layout 504 | if (typeof layout === 'function') { 505 | layout = layout(app.context) 506 | } 507 | await this.loadLayout(layout) 508 | 509 | this.error(error) 510 | this.$nuxt.$emit('routeChanged', to, from, error) 511 | next() 512 | } 513 | } 514 | 515 | // Fix components format in matched, it's due to code-splitting of vue-router 516 | function normalizeComponents (to, ___) { 517 | flatMapComponents(to, (Component, _, match, key) => { 518 | if (typeof Component === 'object' && !Component.options) { 519 | // Updated via vue-router resolveAsyncComponents() 520 | Component = Vue.extend(Component) 521 | Component._Ctor = Component 522 | match.components[key] = Component 523 | } 524 | return Component 525 | }) 526 | } 527 | 528 | function setLayoutForNextPage (to) { 529 | // Set layout 530 | let hasError = Boolean(this.$options.nuxt.err) 531 | if (this._hadError && this._dateLastError === this.$options.nuxt.dateErr) { 532 | hasError = false 533 | } 534 | let layout = hasError 535 | ? (NuxtError.options || NuxtError).layout 536 | : to.matched[0].components.default.options.layout 537 | 538 | if (typeof layout === 'function') { 539 | layout = layout(app.context) 540 | } 541 | 542 | this.setLayout(layout) 543 | } 544 | 545 | function checkForErrors (app) { 546 | // Hide error component if no error 547 | if (app._hadError && app._dateLastError === app.$options.nuxt.dateErr) { 548 | app.error() 549 | } 550 | } 551 | 552 | // When navigating on a different route but the same component is used, Vue.js 553 | // Will not update the instance data, so we have to update $data ourselves 554 | function fixPrepatch (to, ___) { 555 | if (this._routeChanged === false && this._paramChanged === false && this._queryChanged === false) { 556 | return 557 | } 558 | 559 | const instances = getMatchedComponentsInstances(to) 560 | const Components = getMatchedComponents(to) 561 | 562 | let triggerScroll = false 563 | 564 | Vue.nextTick(() => { 565 | instances.forEach((instance, i) => { 566 | if (!instance || instance._isDestroyed) { 567 | return 568 | } 569 | 570 | if ( 571 | instance.constructor._dataRefresh && 572 | Components[i] === instance.constructor && 573 | instance.$vnode.data.keepAlive !== true && 574 | typeof instance.constructor.options.data === 'function' 575 | ) { 576 | const newData = instance.constructor.options.data.call(instance) 577 | for (const key in newData) { 578 | Vue.set(instance.$data, key, newData[key]) 579 | } 580 | 581 | triggerScroll = true 582 | } 583 | }) 584 | 585 | if (triggerScroll) { 586 | // Ensure to trigger scroll event after calling scrollBehavior 587 | window.$nuxt.$nextTick(() => { 588 | window.$nuxt.$emit('triggerScroll') 589 | }) 590 | } 591 | 592 | checkForErrors(this) 593 | 594 | // Hot reloading 595 | setTimeout(() => hotReloadAPI(this), 100) 596 | }) 597 | } 598 | 599 | function nuxtReady (_app) { 600 | window.onNuxtReadyCbs.forEach((cb) => { 601 | if (typeof cb === 'function') { 602 | cb(_app) 603 | } 604 | }) 605 | // Special JSDOM 606 | if (typeof window._onNuxtLoaded === 'function') { 607 | window._onNuxtLoaded(_app) 608 | } 609 | // Add router hooks 610 | router.afterEach((to, from) => { 611 | // Wait for fixPrepatch + $data updates 612 | Vue.nextTick(() => _app.$nuxt.$emit('routeChanged', to, from)) 613 | }) 614 | } 615 | 616 | const noopData = () => { return {} } 617 | const noopFetch = () => {} 618 | 619 | // Special hot reload with asyncData(context) 620 | function getNuxtChildComponents ($parent, $components = []) { 621 | $parent.$children.forEach(($child) => { 622 | if ($child.$vnode && $child.$vnode.data.nuxtChild && !$components.find(c =>(c.$options.__file === $child.$options.__file))) { 623 | $components.push($child) 624 | } 625 | if ($child.$children && $child.$children.length) { 626 | getNuxtChildComponents($child, $components) 627 | } 628 | }) 629 | 630 | return $components 631 | } 632 | 633 | function hotReloadAPI(_app) { 634 | if (!module.hot) return 635 | 636 | let $components = getNuxtChildComponents(_app.$nuxt, []) 637 | 638 | $components.forEach(addHotReload.bind(_app)) 639 | } 640 | 641 | function addHotReload ($component, depth) { 642 | if ($component.$vnode.data._hasHotReload) return 643 | $component.$vnode.data._hasHotReload = true 644 | 645 | var _forceUpdate = $component.$forceUpdate.bind($component.$parent) 646 | 647 | $component.$vnode.context.$forceUpdate = async () => { 648 | let Components = getMatchedComponents(router.currentRoute) 649 | let Component = Components[depth] 650 | if (!Component) { 651 | return _forceUpdate() 652 | } 653 | if (typeof Component === 'object' && !Component.options) { 654 | // Updated via vue-router resolveAsyncComponents() 655 | Component = Vue.extend(Component) 656 | Component._Ctor = Component 657 | } 658 | this.error() 659 | let promises = [] 660 | const next = function (path) { 661 | this.$loading.finish && this.$loading.finish() 662 | router.push(path) 663 | } 664 | await setContext(app, { 665 | route: router.currentRoute, 666 | isHMR: true, 667 | next: next.bind(this) 668 | }) 669 | const context = app.context 670 | 671 | if (this.$loading.start && !this.$loading.manual) { 672 | this.$loading.start() 673 | } 674 | 675 | callMiddleware.call(this, Components, context) 676 | .then(() => { 677 | // If layout changed 678 | if (depth !== 0) { 679 | return 680 | } 681 | 682 | let layout = Component.options.layout || 'default' 683 | if (typeof layout === 'function') { 684 | layout = layout(context) 685 | } 686 | if (this.layoutName === layout) { 687 | return 688 | } 689 | let promise = this.loadLayout(layout) 690 | promise.then(() => { 691 | this.setLayout(layout) 692 | Vue.nextTick(() => hotReloadAPI(this)) 693 | }) 694 | return promise 695 | }) 696 | 697 | .then(() => { 698 | return callMiddleware.call(this, Components, context, this.layout) 699 | }) 700 | 701 | .then(() => { 702 | // Call asyncData(context) 703 | let pAsyncData = promisify(Component.options.asyncData || noopData, context) 704 | pAsyncData.then((asyncDataResult) => { 705 | applyAsyncData(Component, asyncDataResult) 706 | this.$loading.increase && this.$loading.increase(30) 707 | }) 708 | promises.push(pAsyncData) 709 | 710 | // Call fetch() 711 | Component.options.fetch = Component.options.fetch || noopFetch 712 | let pFetch = Component.options.fetch.length && Component.options.fetch(context) 713 | if (!pFetch || (!(pFetch instanceof Promise) && (typeof pFetch.then !== 'function'))) { pFetch = Promise.resolve(pFetch) } 714 | pFetch.then(() => this.$loading.increase && this.$loading.increase(30)) 715 | promises.push(pFetch) 716 | 717 | return Promise.all(promises) 718 | }) 719 | .then(() => { 720 | this.$loading.finish && this.$loading.finish() 721 | _forceUpdate() 722 | setTimeout(() => hotReloadAPI(this), 100) 723 | }) 724 | } 725 | } 726 | 727 | async function mountApp (__app) { 728 | // Set global variables 729 | app = __app.app 730 | router = __app.router 731 | store = __app.store 732 | 733 | // Create Vue instance 734 | const _app = new Vue(app) 735 | 736 | // Mounts Vue app to DOM element 737 | const mount = () => { 738 | _app.$mount('#__nuxt') 739 | 740 | // Add afterEach router hooks 741 | router.afterEach(normalizeComponents) 742 | 743 | router.afterEach(setLayoutForNextPage.bind(_app)) 744 | 745 | router.afterEach(fixPrepatch.bind(_app)) 746 | 747 | // Listen for first Vue update 748 | Vue.nextTick(() => { 749 | // Call window.{{globals.readyCallback}} callbacks 750 | nuxtReady(_app) 751 | 752 | // Enable hot reloading 753 | hotReloadAPI(_app) 754 | }) 755 | } 756 | 757 | // Resolve route components 758 | const Components = await Promise.all(resolveComponents(app.context.route)) 759 | 760 | // Enable transitions 761 | _app.setTransitions = _app.$options.nuxt.setTransitions.bind(_app) 762 | if (Components.length) { 763 | _app.setTransitions(mapTransitions(Components, router.currentRoute)) 764 | _lastPaths = router.currentRoute.matched.map(route => compile(route.path)(router.currentRoute.params)) 765 | } 766 | 767 | // Initialize error handler 768 | _app.$loading = {} // To avoid error while _app.$nuxt does not exist 769 | if (NUXT.error) { 770 | _app.error(NUXT.error) 771 | } 772 | 773 | // Add beforeEach router hooks 774 | router.beforeEach(loadAsyncComponents.bind(_app)) 775 | router.beforeEach(render.bind(_app)) 776 | 777 | // Fix in static: remove trailing slash to force hydration 778 | // Full static, if server-rendered: hydrate, to allow custom redirect to generated page 779 | 780 | // Fix in static: remove trailing slash to force hydration 781 | if (NUXT.serverRendered && isSamePath(NUXT.routePath, _app.context.route.path)) { 782 | return mount() 783 | } 784 | 785 | // First render on client-side 786 | const clientFirstMount = () => { 787 | normalizeComponents(router.currentRoute, router.currentRoute) 788 | setLayoutForNextPage.call(_app, router.currentRoute) 789 | checkForErrors(_app) 790 | // Don't call fixPrepatch.call(_app, router.currentRoute, router.currentRoute) since it's first render 791 | mount() 792 | } 793 | 794 | // fix: force next tick to avoid having same timestamp when an error happen on spa fallback 795 | await new Promise(resolve => setTimeout(resolve, 0)) 796 | render.call(_app, router.currentRoute, router.currentRoute, (path) => { 797 | // If not redirected 798 | if (!path) { 799 | clientFirstMount() 800 | return 801 | } 802 | 803 | // Add a one-time afterEach hook to 804 | // mount the app wait for redirect and route gets resolved 805 | const unregisterHook = router.afterEach((to, from) => { 806 | unregisterHook() 807 | clientFirstMount() 808 | }) 809 | 810 | // Push the path and let route to be resolved 811 | router.push(path, undefined, (err) => { 812 | if (err) { 813 | errorHandler(err) 814 | } 815 | }) 816 | }) 817 | } 818 | -------------------------------------------------------------------------------- /.nuxt/components/index.js: -------------------------------------------------------------------------------- 1 | import { wrapFunctional } from './utils' 2 | 3 | export { default as Contact } from '../..\\components\\contact.vue' 4 | export { default as Footer } from '../..\\components\\footer.vue' 5 | export { default as Landing } from '../..\\components\\landing.vue' 6 | export { default as Langs } from '../..\\components\\langs.vue' 7 | export { default as Meet } from '../..\\components\\meet.vue' 8 | export { default as Navbar } from '../..\\components\\navbar.vue' 9 | export { default as Overlay } from '../..\\components\\overlay.vue' 10 | export { default as Products } from '../..\\components\\products.vue' 11 | export { default as Sidebar } from '../..\\components\\sidebar.vue' 12 | export { default as StackCard } from '../..\\components\\stackCard.vue' 13 | export { default as TechstackCard } from '../..\\components\\techstackCard.vue' 14 | export { default as WhyUs } from '../..\\components\\whyUs.vue' 15 | 16 | export const LazyContact = import('../..\\components\\contact.vue' /* webpackChunkName: "components/contact" */).then(c => wrapFunctional(c.default || c)) 17 | export const LazyFooter = import('../..\\components\\footer.vue' /* webpackChunkName: "components/footer" */).then(c => wrapFunctional(c.default || c)) 18 | export const LazyLanding = import('../..\\components\\landing.vue' /* webpackChunkName: "components/landing" */).then(c => wrapFunctional(c.default || c)) 19 | export const LazyLangs = import('../..\\components\\langs.vue' /* webpackChunkName: "components/langs" */).then(c => wrapFunctional(c.default || c)) 20 | export const LazyMeet = import('../..\\components\\meet.vue' /* webpackChunkName: "components/meet" */).then(c => wrapFunctional(c.default || c)) 21 | export const LazyNavbar = import('../..\\components\\navbar.vue' /* webpackChunkName: "components/navbar" */).then(c => wrapFunctional(c.default || c)) 22 | export const LazyOverlay = import('../..\\components\\overlay.vue' /* webpackChunkName: "components/overlay" */).then(c => wrapFunctional(c.default || c)) 23 | export const LazyProducts = import('../..\\components\\products.vue' /* webpackChunkName: "components/products" */).then(c => wrapFunctional(c.default || c)) 24 | export const LazySidebar = import('../..\\components\\sidebar.vue' /* webpackChunkName: "components/sidebar" */).then(c => wrapFunctional(c.default || c)) 25 | export const LazyStackCard = import('../..\\components\\stackCard.vue' /* webpackChunkName: "components/stack-card" */).then(c => wrapFunctional(c.default || c)) 26 | export const LazyTechstackCard = import('../..\\components\\techstackCard.vue' /* webpackChunkName: "components/techstack-card" */).then(c => wrapFunctional(c.default || c)) 27 | export const LazyWhyUs = import('../..\\components\\whyUs.vue' /* webpackChunkName: "components/why-us" */).then(c => wrapFunctional(c.default || c)) 28 | -------------------------------------------------------------------------------- /.nuxt/components/nuxt-build-indicator.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 112 | 113 | 144 | -------------------------------------------------------------------------------- /.nuxt/components/nuxt-child.js: -------------------------------------------------------------------------------- 1 | 2 | export default { 3 | name: 'NuxtChild', 4 | functional: true, 5 | props: { 6 | nuxtChildKey: { 7 | type: String, 8 | default: '' 9 | }, 10 | keepAlive: Boolean, 11 | keepAliveProps: { 12 | type: Object, 13 | default: undefined 14 | } 15 | }, 16 | render (_, { parent, data, props }) { 17 | const h = parent.$createElement 18 | 19 | data.nuxtChild = true 20 | const _parent = parent 21 | const transitions = parent.$nuxt.nuxt.transitions 22 | const defaultTransition = parent.$nuxt.nuxt.defaultTransition 23 | 24 | let depth = 0 25 | while (parent) { 26 | if (parent.$vnode && parent.$vnode.data.nuxtChild) { 27 | depth++ 28 | } 29 | parent = parent.$parent 30 | } 31 | data.nuxtChildDepth = depth 32 | const transition = transitions[depth] || defaultTransition 33 | const transitionProps = {} 34 | transitionsKeys.forEach((key) => { 35 | if (typeof transition[key] !== 'undefined') { 36 | transitionProps[key] = transition[key] 37 | } 38 | }) 39 | 40 | const listeners = {} 41 | listenersKeys.forEach((key) => { 42 | if (typeof transition[key] === 'function') { 43 | listeners[key] = transition[key].bind(_parent) 44 | } 45 | }) 46 | if (process.client) { 47 | // Add triggerScroll event on beforeEnter (fix #1376) 48 | const beforeEnter = listeners.beforeEnter 49 | listeners.beforeEnter = (el) => { 50 | // Ensure to trigger scroll event after calling scrollBehavior 51 | window.$nuxt.$nextTick(() => { 52 | window.$nuxt.$emit('triggerScroll') 53 | }) 54 | if (beforeEnter) { 55 | return beforeEnter.call(_parent, el) 56 | } 57 | } 58 | } 59 | 60 | // make sure that leave is called asynchronous (fix #5703) 61 | if (transition.css === false) { 62 | const leave = listeners.leave 63 | 64 | // only add leave listener when user didnt provide one 65 | // or when it misses the done argument 66 | if (!leave || leave.length < 2) { 67 | listeners.leave = (el, done) => { 68 | if (leave) { 69 | leave.call(_parent, el) 70 | } 71 | 72 | _parent.$nextTick(done) 73 | } 74 | } 75 | } 76 | 77 | let routerView = h('routerView', data) 78 | 79 | if (props.keepAlive) { 80 | routerView = h('keep-alive', { props: props.keepAliveProps }, [routerView]) 81 | } 82 | 83 | return h('transition', { 84 | props: transitionProps, 85 | on: listeners 86 | }, [routerView]) 87 | } 88 | } 89 | 90 | const transitionsKeys = [ 91 | 'name', 92 | 'mode', 93 | 'appear', 94 | 'css', 95 | 'type', 96 | 'duration', 97 | 'enterClass', 98 | 'leaveClass', 99 | 'appearClass', 100 | 'enterActiveClass', 101 | 'enterActiveClass', 102 | 'leaveActiveClass', 103 | 'appearActiveClass', 104 | 'enterToClass', 105 | 'leaveToClass', 106 | 'appearToClass' 107 | ] 108 | 109 | const listenersKeys = [ 110 | 'beforeEnter', 111 | 'enter', 112 | 'afterEnter', 113 | 'enterCancelled', 114 | 'beforeLeave', 115 | 'leave', 116 | 'afterLeave', 117 | 'leaveCancelled', 118 | 'beforeAppear', 119 | 'appear', 120 | 'afterAppear', 121 | 'appearCancelled' 122 | ] 123 | -------------------------------------------------------------------------------- /.nuxt/components/nuxt-error.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 53 | 54 | 99 | -------------------------------------------------------------------------------- /.nuxt/components/nuxt-link.client.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | const requestIdleCallback = window.requestIdleCallback || 4 | function (cb) { 5 | const start = Date.now() 6 | return setTimeout(function () { 7 | cb({ 8 | didTimeout: false, 9 | timeRemaining: () => Math.max(0, 50 - (Date.now() - start)) 10 | }) 11 | }, 1) 12 | } 13 | 14 | const cancelIdleCallback = window.cancelIdleCallback || function (id) { 15 | clearTimeout(id) 16 | } 17 | 18 | const observer = window.IntersectionObserver && new window.IntersectionObserver((entries) => { 19 | entries.forEach(({ intersectionRatio, target: link }) => { 20 | if (intersectionRatio <= 0 || !link.__prefetch) { 21 | return 22 | } 23 | link.__prefetch() 24 | }) 25 | }) 26 | 27 | export default { 28 | name: 'NuxtLink', 29 | extends: Vue.component('RouterLink'), 30 | props: { 31 | prefetch: { 32 | type: Boolean, 33 | default: true 34 | }, 35 | noPrefetch: { 36 | type: Boolean, 37 | default: false 38 | } 39 | }, 40 | mounted () { 41 | if (this.prefetch && !this.noPrefetch) { 42 | this.handleId = requestIdleCallback(this.observe, { timeout: 2e3 }) 43 | } 44 | }, 45 | beforeDestroy () { 46 | cancelIdleCallback(this.handleId) 47 | 48 | if (this.__observed) { 49 | observer.unobserve(this.$el) 50 | delete this.$el.__prefetch 51 | } 52 | }, 53 | methods: { 54 | observe () { 55 | // If no IntersectionObserver, avoid prefetching 56 | if (!observer) { 57 | return 58 | } 59 | // Add to observer 60 | if (this.shouldPrefetch()) { 61 | this.$el.__prefetch = this.prefetchLink.bind(this) 62 | observer.observe(this.$el) 63 | this.__observed = true 64 | } 65 | }, 66 | shouldPrefetch () { 67 | return this.getPrefetchComponents().length > 0 68 | }, 69 | canPrefetch () { 70 | const conn = navigator.connection 71 | const hasBadConnection = this.$nuxt.isOffline || (conn && ((conn.effectiveType || '').includes('2g') || conn.saveData)) 72 | 73 | return !hasBadConnection 74 | }, 75 | getPrefetchComponents () { 76 | const ref = this.$router.resolve(this.to, this.$route, this.append) 77 | const Components = ref.resolved.matched.map(r => r.components.default) 78 | 79 | return Components.filter(Component => typeof Component === 'function' && !Component.options && !Component.__prefetched) 80 | }, 81 | prefetchLink () { 82 | if (!this.canPrefetch()) { 83 | return 84 | } 85 | // Stop observing this link (in case of internet connection changes) 86 | observer.unobserve(this.$el) 87 | const Components = this.getPrefetchComponents() 88 | 89 | for (const Component of Components) { 90 | const componentOrPromise = Component() 91 | if (componentOrPromise instanceof Promise) { 92 | componentOrPromise.catch(() => {}) 93 | } 94 | Component.__prefetched = true 95 | } 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /.nuxt/components/nuxt-link.server.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export default { 4 | name: 'NuxtLink', 5 | extends: Vue.component('RouterLink'), 6 | props: { 7 | prefetch: { 8 | type: Boolean, 9 | default: true 10 | }, 11 | noPrefetch: { 12 | type: Boolean, 13 | default: false 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.nuxt/components/nuxt-loading.vue: -------------------------------------------------------------------------------- 1 | 155 | 156 | 178 | -------------------------------------------------------------------------------- /.nuxt/components/nuxt.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import { compile } from '../utils' 3 | 4 | import NuxtError from '../..\\layouts\\error.vue' 5 | 6 | import NuxtChild from './nuxt-child' 7 | 8 | export default { 9 | name: 'Nuxt', 10 | components: { 11 | NuxtChild, 12 | NuxtError 13 | }, 14 | props: { 15 | nuxtChildKey: { 16 | type: String, 17 | default: undefined 18 | }, 19 | keepAlive: Boolean, 20 | keepAliveProps: { 21 | type: Object, 22 | default: undefined 23 | }, 24 | name: { 25 | type: String, 26 | default: 'default' 27 | } 28 | }, 29 | errorCaptured (error) { 30 | // if we receive and error while showing the NuxtError component 31 | // capture the error and force an immediate update so we re-render 32 | // without the NuxtError component 33 | if (this.displayingNuxtError) { 34 | this.errorFromNuxtError = error 35 | this.$forceUpdate() 36 | } 37 | }, 38 | computed: { 39 | routerViewKey () { 40 | // If nuxtChildKey prop is given or current route has children 41 | if (typeof this.nuxtChildKey !== 'undefined' || this.$route.matched.length > 1) { 42 | return this.nuxtChildKey || compile(this.$route.matched[0].path)(this.$route.params) 43 | } 44 | 45 | const [matchedRoute] = this.$route.matched 46 | 47 | if (!matchedRoute) { 48 | return this.$route.path 49 | } 50 | 51 | const Component = matchedRoute.components.default 52 | 53 | if (Component && Component.options) { 54 | const { options } = Component 55 | 56 | if (options.key) { 57 | return (typeof options.key === 'function' ? options.key(this.$route) : options.key) 58 | } 59 | } 60 | 61 | const strict = /\/$/.test(matchedRoute.path) 62 | return strict ? this.$route.path : this.$route.path.replace(/\/$/, '') 63 | } 64 | }, 65 | beforeCreate () { 66 | Vue.util.defineReactive(this, 'nuxt', this.$root.$options.nuxt) 67 | }, 68 | render (h) { 69 | // if there is no error 70 | if (!this.nuxt.err) { 71 | // Directly return nuxt child 72 | return h('NuxtChild', { 73 | key: this.routerViewKey, 74 | props: this.$props 75 | }) 76 | } 77 | 78 | // if an error occurred within NuxtError show a simple 79 | // error message instead to prevent looping 80 | if (this.errorFromNuxtError) { 81 | this.$nextTick(() => (this.errorFromNuxtError = false)) 82 | 83 | return h('div', {}, [ 84 | h('h2', 'An error occurred while showing the error page'), 85 | h('p', 'Unfortunately an error occurred and while showing the error page another error occurred'), 86 | h('p', `Error details: ${this.errorFromNuxtError.toString()}`), 87 | h('nuxt-link', { props: { to: '/' } }, 'Go back to home') 88 | ]) 89 | } 90 | 91 | // track if we are showing the NuxtError component 92 | this.displayingNuxtError = true 93 | this.$nextTick(() => (this.displayingNuxtError = false)) 94 | 95 | return h(NuxtError, { 96 | props: { 97 | error: this.nuxt.err 98 | } 99 | }) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /.nuxt/components/plugin.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import { wrapFunctional } from './utils' 3 | 4 | const components = { 5 | Contact: () => import('../..\\components\\contact.vue' /* webpackChunkName: "components/contact" */).then(c => wrapFunctional(c.default || c)), 6 | Footer: () => import('../..\\components\\footer.vue' /* webpackChunkName: "components/footer" */).then(c => wrapFunctional(c.default || c)), 7 | Landing: () => import('../..\\components\\landing.vue' /* webpackChunkName: "components/landing" */).then(c => wrapFunctional(c.default || c)), 8 | Langs: () => import('../..\\components\\langs.vue' /* webpackChunkName: "components/langs" */).then(c => wrapFunctional(c.default || c)), 9 | Meet: () => import('../..\\components\\meet.vue' /* webpackChunkName: "components/meet" */).then(c => wrapFunctional(c.default || c)), 10 | Navbar: () => import('../..\\components\\navbar.vue' /* webpackChunkName: "components/navbar" */).then(c => wrapFunctional(c.default || c)), 11 | Overlay: () => import('../..\\components\\overlay.vue' /* webpackChunkName: "components/overlay" */).then(c => wrapFunctional(c.default || c)), 12 | Products: () => import('../..\\components\\products.vue' /* webpackChunkName: "components/products" */).then(c => wrapFunctional(c.default || c)), 13 | Sidebar: () => import('../..\\components\\sidebar.vue' /* webpackChunkName: "components/sidebar" */).then(c => wrapFunctional(c.default || c)), 14 | StackCard: () => import('../..\\components\\stackCard.vue' /* webpackChunkName: "components/stack-card" */).then(c => wrapFunctional(c.default || c)), 15 | TechstackCard: () => import('../..\\components\\techstackCard.vue' /* webpackChunkName: "components/techstack-card" */).then(c => wrapFunctional(c.default || c)), 16 | WhyUs: () => import('../..\\components\\whyUs.vue' /* webpackChunkName: "components/why-us" */).then(c => wrapFunctional(c.default || c)) 17 | } 18 | 19 | for (const name in components) { 20 | Vue.component(name, components[name]) 21 | Vue.component('Lazy' + name, components[name]) 22 | } 23 | -------------------------------------------------------------------------------- /.nuxt/components/readme.md: -------------------------------------------------------------------------------- 1 | # Discovered Components 2 | 3 | This is an auto-generated list of components discovered by [nuxt/components](https://github.com/nuxt/components). 4 | 5 | You can directly use them in pages and other components without the need to import them. 6 | 7 | **Tip:** If a component is conditionally rendered with `v-if` and is big, it is better to use `Lazy` or `lazy-` prefix to lazy load. 8 | 9 | - `` | `` (components/contact.vue) 10 | - `