# [Tutorial](https://medium.com/sicara/a-progressive-web-application-with-vue-js-webpack-material-design-part-1-c243e2e6e402) vue pwa
* Vue PWA template is built on top of Vue webpack template
* Webpack is a modern and powerful module bundler for Javascript application
* Project layout
* build: webpack and vue-loader configuration files
* config: app config (environments, parameters)
* src: application source code
* statis: images, css & other public assets
* test: unit test files (Karma & Mocha)
```sh
$ npm install -g vue-cli
// use pwa template to scaffold a project
$ vue init pwa cropchat
$ cd cropchat
$ npm install
$ npm run dev
// launch browser at http://localhost:8080
```
* Vue pwa template provide default `static/manifest.json`. Edit it to customize the project
```json
{
"name": "cropchat",
"short_name": "cropchat",
"icons": [
{
"src": "/static/img/icons/cropchat-icon-64x64.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/static/img/icons/cropchat-icon-128x128.png",
"sizes": "128x128",
"type": "image/png"
},
{
"src": "/static/img/icons/cropchat-icon-256x256.png",
"sizes": "256x256",
"type": "image/png"
},
{
"src": "/static/img/icons/cropchat-icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/",
"display": "fullscreen",
"orientation": "portrait",
"background_color": "#2196f3",
"theme_color": "#2196f3"
}
```
* `index.html` already provide the manifest link
```html
...
...
```
## Access from mobile
* use `ngrok` to forward internet address to localhost host
```sh
$ npm install -g ngrok
$ ngrok http 8080
```
```text
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Version 2.1.18
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://5ef29506.ngrok.io -> localhost:8080
Forwarding https://5ef29506.ngrok.io -> localhost:8080
Connections ttl opn rt1 rt5 p50 p90
39 3 0.01 0.01 120.01 881.89
```
* Access `https://5ef29506.ngrok.io` from mobile
## Develop Vue [App](https://medium.com/sicara/a-progressive-web-application-with-vue-js-webpack-material-design-part-1-c243e2e6e402)
* `src/components/HomeView.vue`
```vue
```
* `src/components/DetailView.vue`
```vue
```
* `src/components/PostView.vue`
```vue
Not yet available
```
* Update `src/router/index.js`
```js
import Vue from 'vue'
import Router from 'vue-router'
import HomeView from '@/components/HomeView'
import DetailView from '@/components/DetailView'
import PostView from '@/components/PostView'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'home',
component: HomeView
},
{
path: '/detail/:id',
name: 'detail',
component: DetailView
},
{
path: '/post',
name: 'post',
component: PostView
}
]
})
```
* Remove `Hello.vue`
### Layout Design
* install material Design
```sh
$ npm install material-design-lite --save
```
* Update `src/App.vue`
```vue
```
* Add Navigation Bar. Update `src/App.vue` template
```vue
```
* Hide burger menu upon click menu link
```vue
```
* Populate views
* Create `src/data.js`
```js
export default {
pictures: [
{
'id': 0,
'url': 'https://25.media.tumblr.com/tumblr_m40h4ksiUa1qbyxr0o1_400.gif',
'comment': 'A cat game',
'info': 'Posted by Kevin on Friday'
},
{
'id': 1,
'url': 'https://25.media.tumblr.com/tumblr_lhd7n9Qec01qgnva2o1_500.jpg',
'comment': 'Tatoo & cat',
'info': 'Posted by Charles on Tuesday'
},
{
'id': 2,
'url': 'https://24.media.tumblr.com/tumblr_m4j2atctRm1qejbiro1_1280.jpg',
'comment': 'Santa cat',
'info': 'Posted by Richard on Monday'
},
{
'id': 3,
'url': 'https://25.media.tumblr.com/tumblr_m3rmbwhVB51qhwmnpo1_1280.jpg',
'comment': 'Mexico cat',
'info': 'Posted by Richard on Monday'
},
{
'id': 4,
'url': 'https://24.media.tumblr.com/tumblr_mceknxs4Lo1qd477zo1_500.jpg',
'comment': 'Curious cat',
'info': 'Posted by Richard on Monday'
}
]
}
```
* Update `src/components/HomeView.vue` to display mocked data
```vue
```
* Update temple ans style
```vue
...
```