Pārlūkot izejas kodu

feat: scaffolding of docs-generator done and first "live" docs (#28)

* feat(docs): scaffolding docs-generator

* fix: typo in build (script) and fix copy folder command

* chore(docs): update
Jeff Galbraith 6 gadi atpakaļ
vecāks
revīzija
bab276fcf3
66 mainītis faili ar 2461 papildinājumiem un 27 dzēšanām
  1. 1 0
      docs-generator/.eslintignore
  2. 8 3
      docs-generator/package.json
  3. 13 3
      docs-generator/quasar.conf.js
  4. 3 1
      docs-generator/quasar.extensions.json
  5. 23 0
      docs-generator/src/404.html
  6. 26 0
      docs-generator/src/assets/page-utils.js
  7. 124 0
      docs-generator/src/components/ExampleCard.vue
  8. 28 0
      docs-generator/src/components/ExampleTitle.vue
  9. 24 0
      docs-generator/src/components/Hero.vue
  10. 280 0
      docs-generator/src/css/app.styl
  11. 0 0
      docs-generator/src/examples/.gitkeep
  12. 23 0
      docs-generator/src/examples/TauriAdvanced.vue
  13. 22 0
      docs-generator/src/examples/TauriBasic.vue
  14. 1468 0
      docs-generator/src/json/tauri.json
  15. 82 8
      docs-generator/src/layouts/MainLayout.vue
  16. 53 0
      docs-generator/src/layouts/OtherLayout.vue
  17. 32 0
      docs-generator/src/markdown/tauri.md
  18. 85 0
      docs-generator/src/pages/Examples.vue
  19. 62 7
      docs-generator/src/pages/Index.vue
  20. 13 1
      docs-generator/src/router/routes.js
  21. 4 0
      docs-generator/src/store/common/actions.js
  22. 2 0
      docs-generator/src/store/common/getters.js
  23. 12 0
      docs-generator/src/store/common/index.js
  24. 6 0
      docs-generator/src/store/common/mutations.js
  25. 4 0
      docs-generator/src/store/common/state.js
  26. 2 2
      docs-generator/src/store/index.js
  27. 32 2
      docs-generator/yarn.lock
  28. 23 0
      docs/404.html
  29. 1 0
      docs/css/26b7cbd2.97bb784a.css
  30. 1 0
      docs/css/41b4ae5e.79381a9e.css
  31. 1 0
      docs/css/4e8dcd81.79381a9e.css
  32. 0 0
      docs/css/app.d8a3568f.css
  33. BIN
      docs/fonts/KFOkCnqEu92Fr1MmgVxIIzQ.5cb7edfc.woff
  34. BIN
      docs/fonts/KFOlCnqEu92Fr1MmEU9fBBc-.87284894.woff
  35. BIN
      docs/fonts/KFOlCnqEu92Fr1MmSU5fBBc-.b00849e0.woff
  36. BIN
      docs/fonts/KFOlCnqEu92Fr1MmWUlfBBc-.adcde98f.woff
  37. BIN
      docs/fonts/KFOlCnqEu92Fr1MmYUtfBBc-.bb1e4dc6.woff
  38. BIN
      docs/fonts/KFOmCnqEu92Fr1Mu4mxM.60fa3c06.woff
  39. BIN
      docs/fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.29b882f0.woff
  40. BIN
      docs/fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.0509ab09.woff2
  41. 1 0
      docs/index.html
  42. 0 0
      docs/js/26b7cbd2.ab56db38.js
  43. 0 0
      docs/js/36a33e16.f0b60e78.js
  44. 1 0
      docs/js/41b4ae5e.3a9b3c65.js
  45. 0 0
      docs/js/4b47640d.487f7fb3.js
  46. 1 0
      docs/js/4e8dcd81.b5cebbed.js
  47. 0 0
      docs/js/app.33d68068.js
  48. 0 0
      docs/js/bfc1f58c.4d92919e.js
  49. 0 0
      docs/js/runtime.5d312108.js
  50. 0 0
      docs/js/vendor.927dd664.js
  51. BIN
      docs/statics/app-logo-128x128.png
  52. BIN
      docs/statics/icons/apple-icon-120x120.png
  53. BIN
      docs/statics/icons/apple-icon-152x152.png
  54. BIN
      docs/statics/icons/apple-icon-167x167.png
  55. BIN
      docs/statics/icons/apple-icon-180x180.png
  56. BIN
      docs/statics/icons/favicon-16x16.png
  57. BIN
      docs/statics/icons/favicon-32x32.png
  58. BIN
      docs/statics/icons/favicon-96x96.png
  59. BIN
      docs/statics/icons/favicon.ico
  60. BIN
      docs/statics/icons/icon-128x128.png
  61. BIN
      docs/statics/icons/icon-192x192.png
  62. BIN
      docs/statics/icons/icon-256x256.png
  63. BIN
      docs/statics/icons/icon-384x384.png
  64. BIN
      docs/statics/icons/icon-512x512.png
  65. BIN
      docs/statics/icons/ms-icon-144x144.png
  66. 0 0
      docs/statics/icons/safari-pinned-tab.svg

+ 1 - 0
docs-generator/.eslintignore

@@ -1 +1,2 @@
 /dist
+/src/markdown

+ 8 - 3
docs-generator/package.json

@@ -1,13 +1,15 @@
 {
   "name": "docs-generator",
   "version": "0.0.1",
-  "description": "A Quasar Framework app",
-  "productName": "Quasar App",
+  "description": "Tauri Documentation",
+  "productName": "Tauri Documentation",
   "cordovaId": "org.cordova.quasar.app",
   "author": "Daniel Thompson-Yvetot <denjell@quasar.dev>",
   "private": true,
   "scripts": {
+    "build": "quasar build && cp ./src/404.html ./dist/spa && cp -r ./dist/spa/. ../docs",
     "lint": "eslint --ext .js,.vue src",
+    "lint-fix": "eslint --ext .js,.vue src --fix",
     "test": "echo \"No test specified\" && exit 0"
   },
   "dependencies": {
@@ -17,11 +19,14 @@
   "devDependencies": {
     "@quasar/app": "^1.0.0",
     "@quasar/quasar-app-extension-qmarkdown": "^1.0.0-beta.18",
+    "@quasar/quasar-app-extension-qpublish": "^1.0.0-alpha.5",
+    "@quasar/quasar-app-extension-qribbon": "^1.0.0-beta.3",
     "@vue/eslint-config-standard": "^4.0.0",
     "babel-eslint": "^10.0.1",
     "eslint": "^5.10.0",
     "eslint-loader": "^2.1.1",
-    "eslint-plugin-vue": "^5.0.0"
+    "eslint-plugin-vue": "^5.0.0",
+    "quasar-app-extension-qautomate": "^1.0.0-alpha.5"
   },
   "engines": {
     "node": ">= 8.9.0",

+ 13 - 3
docs-generator/quasar.conf.js

@@ -31,6 +31,8 @@ module.exports = function (ctx) {
       // all: true, // --- includes everything; for dev only!
 
       components: [
+        'QCard',
+        'QExpansionItem',
         'QLayout',
         'QHeader',
         'QDrawer',
@@ -43,7 +45,14 @@ module.exports = function (ctx) {
         'QList',
         'QItem',
         'QItemSection',
-        'QItemLabel'
+        'QItemLabel',
+        'QPageScroller',
+        'QScrollArea',
+        'QSeparator',
+        'QTabs',
+        'QTab',
+        'QTabPanels',
+        'QTabPanel'
       ],
 
       directives: [
@@ -56,11 +65,12 @@ module.exports = function (ctx) {
       ]
     },
 
-    supportIE: false,
+    supportIE: true,
 
     build: {
       scopeHoisting: true,
-      // vueRouterMode: 'history',
+      vueRouterMode: 'history',
+      publicPath: 'tauri',
       // vueCompiler: true,
       // gzip: true,
       // analyze: true,

+ 3 - 1
docs-generator/quasar.extensions.json

@@ -1,3 +1,5 @@
 {
-  "@quasar/qmarkdown": {}
+  "@quasar/qmarkdown": {},
+  "@quasar/qribbon": {},
+  "@quasar/qpublish": {}
 }

+ 23 - 0
docs-generator/src/404.html

@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="utf-8" />
+
+  <title>404 Redirect</title>
+
+  <script>
+    sessionStorage.redirect = location.href;
+  </script>
+
+  <meta http-equiv="refresh" content="0;URL='/tauri'"></meta>
+</head>
+
+<body>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+</body>
+
+
+</html>

+ 26 - 0
docs-generator/src/assets/page-utils.js

@@ -0,0 +1,26 @@
+export function copyHeading (id) {
+  const text = window.location.origin + window.location.pathname + '#' + id
+
+  var textArea = document.createElement('textarea')
+  textArea.className = 'fixed-top'
+  textArea.value = text
+  document.body.appendChild(textArea)
+  textArea.focus()
+  textArea.select()
+
+  document.execCommand('copy')
+  document.body.removeChild(textArea)
+
+  this.$q.notify({
+    message: 'Anchor has been copied to clipboard.',
+    color: 'white',
+    textColor: 'primary',
+    icon: 'done',
+    position: 'top',
+    timeout: 2000
+  })
+}
+
+export function slugify (str) {
+  return encodeURIComponent(String(str).trim().replace(/\s+/g, '-'))
+}

+ 124 - 0
docs-generator/src/components/ExampleCard.vue

@@ -0,0 +1,124 @@
+<template>
+  <section :id="slugifiedTitle" class="q-pa-md overflow-auto">
+    <q-card flat bordered class="no-shadow">
+      <q-toolbar>
+        <q-ribbon
+          position="left"
+          color="rgba(0,0,0,.58)"
+          background-color="#c0c0c0"
+          leaf-color="#a0a0a0"
+          leaf-position="bottom"
+          decoration="rounded-out"
+        >
+          <q-toolbar-title
+          class="example-title"
+          style="padding: 5px 20px;"
+          @click="copyHeading(slugifiedTitle)"><span class="ellipsis">{{ title }}</span></q-toolbar-title>
+        </q-ribbon>
+      </q-toolbar>
+      <q-separator v-if="this.$slots.default" />
+      <q-card-section v-if="this.$slots.default">
+        <slot></slot>
+      </q-card-section>
+      <q-separator />
+      <q-expansion-item
+        group="someGroup"
+        caption="Code"
+      >
+        <q-card>
+          <q-tabs
+            v-model="tab"
+            dense
+            class="text-grey"
+            active-color="primary"
+            indicator-color="primary"
+            align="left"
+            narrow-indicator
+          >
+            <q-tab name="template" v-if="parts.template" label="Template" />
+            <q-tab name="script" v-if="parts.script" label="Script" />
+            <q-tab name="style" v-if="parts.style" label="Style" />
+          </q-tabs>
+
+          <q-separator />
+
+          <q-tab-panels v-model="tab" animated>
+            <q-tab-panel v-if="parts.template" name="template">
+              <q-markdown :src="parts.template" />
+            </q-tab-panel>
+
+            <q-tab-panel v-if="parts.script" name="script">
+              <q-markdown :src="parts.script" />
+            </q-tab-panel>
+
+            <q-tab-panel v-if="parts.style" name="style">
+              <q-markdown :src="parts.style" />
+            </q-tab-panel>
+
+          </q-tab-panels>
+        </q-card>
+      </q-expansion-item>
+      <q-separator />
+
+      <component v-bind:is="name" style="overflow: hidden;" />
+
+    </q-card>
+  </section>
+</template>
+
+<script>
+import { copyHeading, slugify } from 'assets/page-utils'
+
+export default {
+  name: 'ExampleCard',
+
+  components: {
+    TauriBasic: () => import('../examples/TauriBasic'),
+    TauriAdvanced: () => import('../examples/TauriAdvanced')
+  },
+
+  props: {
+    title: {
+      type: String,
+      required: true
+    },
+    name: {
+      type: String,
+      required: true
+    },
+    tagParts: {
+      type: Object,
+      default: () => {}
+    }
+  },
+
+  data () {
+    return {
+      tab: 'template',
+      parts: {}
+    }
+  },
+
+  mounted () {
+    this.updateParts()
+  },
+
+  computed: {
+    slugifiedTitle () {
+      return slugify(this.title)
+    }
+  },
+
+  methods: {
+    copyHeading,
+    updateParts () {
+      this.parts = {}
+      Object.keys(this.tagParts).forEach(key => {
+        if (this.tagParts[key] !== '') {
+          this.parts[key] = '```\n' + this.tagParts[key] + '\n```'
+        }
+      })
+    }
+  }
+}
+</script>

+ 28 - 0
docs-generator/src/components/ExampleTitle.vue

@@ -0,0 +1,28 @@
+<template>
+  <h1 :id="slugifiedTitle" class="q-markdown--heading-h1 q-markdown--title-heavy example-title" @click="copyHeading(slugifiedTitle)">{{ title }}</h1>
+</template>
+
+<script>
+import { copyHeading, slugify } from 'assets/page-utils'
+
+export default {
+  name: 'ExampleTitle',
+
+  props: {
+    title: {
+      type: String,
+      required: true
+    }
+  },
+
+  computed: {
+    slugifiedTitle () {
+      return slugify(this.title)
+    }
+  },
+
+  methods: {
+    copyHeading
+  }
+}
+</script>

+ 24 - 0
docs-generator/src/components/Hero.vue

@@ -0,0 +1,24 @@
+<template>
+  <div>
+    <section class="page-header">
+      <h1 class="project-name">Tauri</h1>
+      <h2 class="project-tagline"></h2>
+      <q-btn type="a" href="https://github.com/quasarframework/tauri" target="_blank" class="btn" label="View on GitHub" no-caps flat/>
+      <q-btn to="/docs" class="btn" label="Docs" no-caps flat/>
+      <q-btn to="/examples" class="btn" label="Examples" no-caps flat/>
+      <q-btn type="a" href="https://donate.quasar.dev" target="_blank" class="btn" label="Donate" no-caps flat/>
+    </section>
+    <main class="flex flex-start justify-center inset-shadow">
+      <div class="q-pa-md col-12-sm col-8-md col-6-lg inset-shadow" style="width: 100%; height: 3px;" />
+      <div class="q-pa-md col-12-sm col-8-md col-6-lg bg-white shadow-1" style="max-width: 800px; width: 100%;">
+        <slot></slot>
+      </div>
+    </main>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Hero'
+}
+</script>

+ 280 - 0
docs-generator/src/css/app.styl

@@ -1 +1,281 @@
 // app global css
+
+// Tauri color scheme
+// background: #231F20
+// highlight: #FFFCDF
+// text: #283238
+
+$fgColor ?= #FFFCDF
+$bgColor ?= #231F20
+
+.qribbon__container
+  position relative
+
+.qribbon__horizontal--left
+  position unset !important
+  padding unset !important
+  margin-left -22px !important
+  z-index 1 !important
+
+  &:before
+    margin-left -22px
+
+.example-title
+  cursor pointer
+  &:after
+    content ' #'
+    opacity 0
+  &:hover:after
+    opacity 1
+
+.example-page
+  padding 16px 46px
+  font-weight 300
+  max-width 900px
+  margin-left auto
+  margin-right auto
+
+body {
+  padding 0
+  margin 0
+  font-family "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif
+  /* font-size 16px */
+  line-height 1.5
+  background-color #f8f8ff
+  color #606c71 }
+
+a
+  color #1e6bb8
+  text-decoration none
+  &:hover
+    text-decoration underline
+
+.btn
+  display inline-block
+  margin-bottom 1rem
+  color rgba(255, 255, 255, 0.7)
+  background-color rgba(255, 255, 255, 0.08)
+  border-color rgba(255, 255, 255, 0.2)
+  border-style solid
+  border-width 1px
+  border-radius 0.3rem
+  transition color 0.2s, background-color 0.2s, border-color 0.2s
+  &:hover
+    color rgba(255, 255, 255, 0.8)
+    text-decoration none
+    background-color rgba(255, 255, 255, 0.2)
+    border-color rgba(255, 255, 255, 0.3)
+
+.btn + .btn
+  margin-left 1rem
+
+
+@media screen and (min-width 64em)
+  .btn
+    padding 0.75rem 1rem
+
+@media screen and (min-width 42em) and (max-width 64em)
+  .btn
+    padding 0.6rem 0.9rem
+    font-size 0.9rem
+
+@media screen and (max-width 42em)
+  .btn
+    display block
+    width 100%
+    padding 0.75rem
+    font-size 0.9rem
+  .btn + .btn
+      margin-left 0
+
+.page-header
+  color #fff
+  text-align center
+  background-color $bgColor
+  background-image linear-gradient(120deg, $bgColor, $fgColor)
+
+@media screen and (min-width 64em)
+  .page-header
+    padding 5rem 6rem
+
+@media screen and (min-width 42em) and (max-width 64em)
+  .page-header
+    padding 3rem 4rem
+
+@media screen and (max-width 42em)
+  .page-header
+    padding 2rem 1rem 1rem 1rem
+
+.project-name
+  font-weight 700
+  margin-top 0
+  margin-bottom 0.1rem
+
+@media screen and (min-width 64em)
+  .project-name
+    font-size 3.25rem
+
+@media screen and (min-width 42em) and (max-width 64em)
+  .project-name
+    font-size 2.25rem
+
+@media screen and (max-width 42em)
+  .project-name
+    font-size 1.75rem
+
+.project-tagline
+  margin-bottom 2rem
+  font-weight normal
+  opacity 0.7
+
+@media screen and (min-width 64em)
+  .project-tagline
+    font-size 1.25rem
+
+@media screen and (min-width 42em) and (max-width 64em)
+  .project-tagline
+    font-size 1.15rem
+
+@media screen and (max-width 42em)
+  .project-tagline
+    font-size 1rem
+
+.main-content :first-child
+  margin-top 0
+.main-content img
+  max-width 100%
+.main-content h1, .main-content h2, .main-content h3, .main-content h4, .main-content h5, .main-content h6
+  margin-top 2rem
+  margin-bottom 1rem
+  font-weight normal
+  color $fgColor
+.main-content p
+  margin-bottom 1em
+.main-content code
+  padding 2px 4px
+  font-family Consolas, "Liberation Mono", Menlo, Courier, monospace
+  font-size 0.9rem
+  color #383e41
+  background-color #f3f6fa
+  border-radius 0.3rem
+.main-content pre
+  padding 0.8rem
+  margin-top 0
+  margin-bottom 1rem
+  font 1rem Consolas, "Liberation Mono", Menlo, Courier, monospace
+  color #567482
+  word-wrap normal
+  background-color #f3f6fa
+  border solid 1px #dce6f0
+  border-radius 0.3rem
+.main-content pre > code
+  padding 0
+  margin 0
+  font-size 0.9rem
+  color #567482
+  word-break normal
+  white-space pre
+  background transparent
+  border 0
+.main-content .highlight
+  margin-bottom 1rem
+.main-content .highlight pre
+  margin-bottom 0
+  word-break normal
+.main-content .highlight pre, .main-content pre
+  padding 0.8rem
+  overflow auto
+  font-size 0.9rem
+  line-height 1.45
+  border-radius 0.3rem
+.main-content pre code, .main-content pre tt
+  display inline
+  max-width initial
+  padding 0
+  margin 0
+  overflow initial
+  line-height inherit
+  word-wrap normal
+  background-color transparent
+  border 0
+.main-content pre code:before, .main-content pre code:after, .main-content pre tt:before, .main-content pre tt:after
+  content normal
+.main-content ul, .main-content ol
+  margin-top 0
+.main-content blockquote
+  padding 0 1rem
+  margin-left 0
+  color #819198
+  border-left 0.3rem solid #dce6f0
+.main-content blockquote > :first-child
+  margin-top 0
+.main-content blockquote > :last-child
+  margin-bottom 0
+.main-content table
+  display block
+  width 100%
+  overflow auto
+  word-break normal
+  word-break keep-all
+.main-content table th
+  font-weight bold
+.main-content table th, .main-content table td
+  padding 0.5rem 1rem
+  border 1px solid #e9ebec
+.main-content dl
+  padding 0
+.main-content dl dt
+  padding 0
+  margin-top 1rem
+  font-size 1rem
+  font-weight bold
+.main-content dl dd
+  padding 0
+  margin-bottom 1rem
+.main-content hr
+  height 2px
+  padding 0
+  margin 1rem 0
+  background-color #eff0f1
+  border 0
+
+@media screen and (min-width 64em)
+  .main-content
+    max-width 64rem
+    padding 2rem 6rem
+    margin 0 auto
+    font-size 1.1rem
+
+@media screen and (min-width 42em) and (max-width 64em)
+  .main-content
+    padding 2rem 4rem
+    font-size 1.1rem
+
+@media screen and (max-width 42em)
+  .main-content
+    padding 2rem 1rem
+    font-size 1rem
+
+.site-footer
+  padding-top 2rem
+  margin-top 2rem
+  border-top solid 1px #eff0f1
+
+.site-footer-owner
+  display block
+  font-weight bold
+
+.site-footer-credits
+  color #819198
+
+@media screen and (min-width 64em)
+  .site-footer
+    font-size 1rem
+
+@media screen and (min-width 42em) and (max-width 64em)
+  .site-footer
+    font-size 1rem
+
+@media screen and (max-width 42em)
+  .site-footer
+    font-size 0.9rem

+ 0 - 0
docs-generator/src/examples/.gitkeep


+ 23 - 0
docs-generator/src/examples/TauriAdvanced.vue

@@ -0,0 +1,23 @@
+<template>
+  <div class="q-pa-md">
+    <p>You can put any regular Vue code (SFC) into one of these files.</p>
+    <p>It will be displayed as an example.</p>
+    <p>template, script, and css will be separated out into 3 parts and each will have a tab.</p>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      var1: 10,
+      var2: 'string'
+    }
+  }
+}
+</script>
+
+<style lang="stylus">
+.my-class
+  background-color black
+</style>

+ 22 - 0
docs-generator/src/examples/TauriBasic.vue

@@ -0,0 +1,22 @@
+<template>
+  <div class="q-pa-md">
+    <p>You can put any regular Vue code (SFC) into one of these files.</p>
+    <p>It will be displayed as an example.</p>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      var1: 10,
+      var2: 'string'
+    }
+  }
+}
+</script>
+
+<style lang="stylus">
+.my-class
+  background-color black
+</style>

+ 1468 - 0
docs-generator/src/json/tauri.json

@@ -0,0 +1,1468 @@
+{
+  "type": "component",
+  "props": {
+    "value": {
+      "type": "String",
+      "category": "model",
+      "desc": "v-model; When set as YYYY-mm-dd, the calendar will display the current view on this date. If empty, then it will be changed to the current date",
+      "required": true,
+      "default": "now",
+      "applicable": [
+        "All"
+      ],
+      "examples": [
+        "v-model=\"2019-04-01\"",
+        "v-model=\"2020-08-08\""
+      ]
+    },
+    "view": {
+      "type": "String",
+      "category": "model",
+      "desc": "The type of calendar view to be displayed",
+      "applicable": [
+        "All"
+      ],
+      "values": [
+        "day",
+        "2day",
+        "3day",
+        "4day",
+        "5day",
+        "6day",
+        "week",
+        "month",
+        "month-interval",
+        "custom-interval",
+        "scheduler",
+        "month-scheduler",
+        "custom-scheduler"
+      ],
+      "examples": [
+        "view=\"week\"",
+        "view=\"month\""
+      ]
+    },
+    "now": {
+      "type": "String",
+      "category": "model",
+      "desc": "This is the currently displayed date (highlighted). If not set, then the current date is used",
+      "applicable": [
+        "All"
+      ],
+      "examples": [
+        "now=\"2019-04-01\"",
+        "now=\"2020-08-08\""
+      ]
+    },
+    "weekdays": {
+      "type": "String",
+      "category": "model",
+      "desc": "This is the days of the week and in which order they are displayed. If you want Monday as the first day of the week, you would use [1,2,3,4,5,6,0]",
+      "default": "[0,1,2,3,4,5,6]",
+      "applicable": [
+        "All"
+      ],
+      "examples": [
+        ":weekdays=\"[1,2,3,4,5,6,0]\"",
+        ":weekdays=\"[1,2,3,4,5]\""
+      ]
+    },
+    "disabled-days": {
+      "type": "Array",
+      "category": "model",
+      "desc": "An array of string dates in the form YYYY-mm-dd that will be disabled",
+      "applicable": [
+        "All"
+      ],
+      "examples": [
+        ":disabled-days=\"['2019-04-01', '2019-04-02', '2019-04-03', '2019-04-04']\""
+      ]
+    },
+    "locale": {
+      "type": "String",
+      "category": "model",
+      "desc": "Used to change the locale of the calendar",
+      "default": "en-us",
+      "applicable": [
+        "All"
+      ],
+      "examples": [
+        "locale=\"de-de\"",
+        "locale=\"de\"",
+        "locale=\"fr\"",
+        "locale=\"pl\""
+      ]
+    },
+    "max-days": {
+      "type": "String",
+      "category": "model",
+      "desc": "The number of days to be displayed. Applicable only for custom-interval and scheduler views",
+      "default": 7,
+      "applicable": [
+        "Custom",
+        "Scheduler"
+      ],
+      "examples": [
+        "max-days=\"14\"",
+        "max-days=\"10\""
+      ]
+    },
+    "color": {
+      "type": "String",
+      "category": "style",
+      "desc": "This is the color used current day (now) highlighting. It can be from the Quasar color palette or a CSS hash value (ie: '#0000FF')",
+      "default": "",
+      "applicable": [
+        "All"
+      ],
+      "examples": [
+        "color=\"orange-7\"",
+        "color=\"blue-grey-4\"",
+        "color=\"#00CCFC\""
+      ]
+    },
+    "enable-theme": {
+      "type": "Boolean",
+      "category": "style",
+      "desc": "Turn on theme support",
+      "default": false,
+      "applicable": [
+        "All"
+      ]
+    },
+    "theme": {
+      "type": "Object",
+      "category": "style",
+      "desc": "Object containing keys and values that overrides the calendar's color properties. See online demo for format of a theme",
+      "default": "{}",
+      "applicable": [
+        "All"
+      ]
+    },
+    "hide-header": {
+      "type": "Boolean",
+      "category": "style",
+      "desc": "Hide the calendar header. Applicable to all views",
+      "applicable": [
+        "All"
+      ]
+    },
+    "short-weekday-label": {
+      "type": "Boolean",
+      "category": "style",
+      "desc": "Displays the weekday label in short format. For instance, 'Monday' would become 'Mon'",
+      "applicable": [
+        "All"
+      ]
+    },
+    "animated": {
+      "type": "Boolean",
+      "category": "behavior",
+      "desc": "Turns on animation",
+      "applicable": [
+        "All"
+      ]
+    },
+    "transition-prev": {
+      "type": "String",
+      "category": "behavior",
+      "desc": "When animated property is true, transition to use for previous calendar view",
+      "default": "slide-right",
+      "applicable": [
+        "All"
+      ],
+      "examples": [
+        "transition-prev=\"flip-right\""
+      ]
+    },
+    "transition-next": {
+      "type": "String",
+      "category": "behavior",
+      "desc": "When animated property is true, transition to use for next calendar view",
+      "default": "slide-left",
+      "applicable": [
+        "All"
+      ],
+      "examples": [
+        "transition-next=\"flip-left\""
+      ]
+    },
+    "drag-over-func": {
+      "type": "Function",
+      "category": "behavior",
+      "desc": "The function to handle ondragover events",
+      "params": {
+        "event": {
+          "type": "Object",
+          "desc": "The event associated with the ondragover"
+        },
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object associated with the date and optional time (if an interval)"
+        },
+        "type": {
+          "type": "String",
+          "desc": "This can be 'day', 'interval' or 'resource'"
+        },
+        "index": {
+          "type": "Number",
+          "desc": "The column-count index location of the start of the drag (only available if property column-count is set)"
+        }
+      },
+      "applicable": [
+        "All"
+      ],
+      "examples": [
+        ":drag-over-func=\"onDragOver\""
+      ]
+    },
+    "drop-func": {
+      "type": "Function",
+      "category": "behavior",
+      "desc": "The function to handle drop events",
+      "params": {
+        "event": {
+          "type": "Object",
+          "desc": "The event associated with the ondrop"
+        },
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object associated with the date and optional time (if an interval) of the drop"
+        },
+        "type": {
+          "type": "String",
+          "desc": "This can be 'day', 'interval' or 'resource'"
+        },
+        "index": {
+          "type": "Number",
+          "desc": "The column-count index location of the start of the drag (only available if property column-count is set)"
+        }
+      },
+      "applicable": [
+        "All"
+      ],
+      "examples": [
+        ":drop-func=\"onDrop\""
+      ]
+    },
+    "no-scroll": {
+      "type": "Boolean",
+      "category": "style",
+      "desc": "Turns off the internal scrollbar. Useful if you want to handle your own scrolling",
+      "default": "",
+      "applicable": [
+        "Day"
+      ]
+    },
+    "column-header-before": {
+      "type": "Boolean",
+      "category": "style",
+      "desc": "Turns on the column-header-before scoped slot",
+      "applicable": [
+        "Day"
+      ]
+    },
+    "column-header-after": {
+      "type": "Boolean",
+      "category": "style",
+      "desc": "Turns on the column-header-after scoped slot",
+      "applicable": [
+        "Day"
+      ]
+    },
+    "column-count": {
+      "type": [
+        "Number",
+        "String"
+      ],
+      "category": "behavior",
+      "desc": "Applicable only for day view. Show the same day x number of times in columns. Scoped slots get this data as index in passed object",
+      "default": 1,
+      "applicable": [
+        "Day"
+      ],
+      "examples": [
+        "column-count=\"3\"",
+        "column-count=\"5\""
+      ]
+    },
+    "column-index-start": {
+      "type": [
+        "Number",
+        "String"
+      ],
+      "category": "content",
+      "desc": "Applicable only for day view. This is the starting index. This allows you to create a paging system (next/prev) when using column-count property",
+      "default": 0,
+      "applicable": [
+        "Day"
+      ],
+      "examples": [
+        "column-index-start=\"0\"",
+        "column-index-start=\"2\""
+      ]
+    },
+    "short-interval-label": {
+      "type": "Boolean",
+      "category": "style",
+      "desc": "Makes interval labels short",
+      "applicable": [
+        "Day"
+      ]
+    },
+    "interval-height": {
+      "type": [
+        "Number",
+        "String"
+      ],
+      "category": "behavior",
+      "desc": "The maximum height in pixels for the interval height",
+      "default": "40",
+      "applicable": [
+        "Day"
+      ],
+      "examples": [
+        "interval-height=\"60\"",
+        "interval-height=\"100\""
+      ]
+    },
+    "interval-style": {
+      "type": "Function",
+      "category": "style",
+      "desc": "Gets called to provide custom styling of an interval",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "A timestamp object associated with the interval"
+        }
+      },
+      "returns": "A Vue style object",
+      "default": "{}",
+      "applicable": [
+        "Day"
+      ],
+      "examples": [
+        "interval-style=\"background-color: #c0c0c0\"",
+        ":interval-style=\"myIntervalStyle\""
+      ]
+    },
+    "interval-minutes": {
+      "type": [
+        "Number",
+        "String"
+      ],
+      "category": "behavior",
+      "desc": "The number of minutes in an interval",
+      "default": "60",
+      "applicable": [
+        "Day"
+      ],
+      "examples": [
+        "interval-minutes=\"15\"",
+        "interval-minutes=\"30\""
+      ]
+    },
+    "interval-count": {
+      "type": [
+        "Number",
+        "String"
+      ],
+      "category": "behavior",
+      "desc": "The number intervals to use. If interval-minutes is set to 30 then you would set interval count to 48 – double that of regular",
+      "default": "24",
+      "applicable": [
+        "Day"
+      ],
+      "examples": [
+        "interval-count=\"48\"",
+        "interval-count=\"96\""
+      ]
+    },
+    "interval-start": {
+      "type": [
+        "Number",
+        "String"
+      ],
+      "category": "behavior",
+      "desc": "The starting interval",
+      "default": "0",
+      "applicable": [
+        "Day"
+      ],
+      "examples": [
+        "interval-start=\"6\"",
+        "interval-start=\"8\""
+      ]
+    },
+    "hour24-format": {
+      "type": "Boolean",
+      "category": "style",
+      "desc": "Show intervals in 24 hour format",
+      "applicable": [
+        "Day"
+      ]
+    },
+    "day-height": {
+      "type": [
+        "Number",
+        "String"
+      ],
+      "category": "behavior",
+      "desc": "The maximum height in pixels for the day height",
+      "default": "50",
+      "applicable": [
+        "Month"
+      ],
+      "examples": [
+        "day-height=\"80\"",
+        "day-height=\"100\""
+      ]
+    },
+    "day-padding": {
+      "type": "String",
+      "category": "style",
+      "desc": "Overrides the padding to be used for a day element. You can use any CSS padding format",
+      "default": "48px 2px",
+      "applicable": [
+        "Month"
+      ],
+      "examples": [
+        "day-padding=\"20px 5px\""
+      ]
+    },
+    "day-style": {
+      "type": "Function",
+      "category": "style",
+      "desc": "Gets called to provide custom styling of a day",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "A timestamp object associated with the day"
+        }
+      },
+      "returns": "A Vue style object",
+      "default": "{}",
+      "applicable": [
+        "Month"
+      ],
+      "examples": [
+        "day-style=\"background-color: #c0c0c0\"",
+        ":day-style=\"dayStyle\""
+      ]
+    },
+    "min-weeks": {
+      "type": [
+        "Number",
+        "String"
+      ],
+      "category": "model",
+      "desc": "The minimum number of weeks to be displayed",
+      "default": 1,
+      "applicable": [
+        "Month"
+      ],
+      "examples": [
+        "min-weeks=\"2\""
+      ]
+    },
+    "short-month-label": {
+      "type": "Boolean",
+      "category": "style",
+      "desc": "Makes the month label short. January becomes Jan...",
+      "applicable": [
+        "Month"
+      ]
+    },
+    "show-work-weeks": {
+      "type": "Boolean",
+      "category": "content",
+      "desc": "Show work weeks",
+      "applicable": [
+        "Month"
+      ]
+    },
+    "show-month-label": {
+      "type": "Boolean",
+      "category": "content",
+      "desc": "Shows the month label - this occurs on the 1st of the month",
+      "applicable": [
+        "Month"
+      ]
+    },
+    "show-day-of-year-label": {
+      "type": "Boolean",
+      "category": "content",
+      "desc": "Show the say of the year - this occurs in the top right of each day element. If show-month-label is true, then that day is skipped",
+      "applicable": [
+        "Month"
+      ]
+    },
+    "resources": {
+      "type": "Array",
+      "category": "model",
+      "desc": "Required when view is of type scheduler. An array of objects with a single key of label. You can add other keys if you like, which will be passed in on the appropriate scoped slots",
+      "applicable": [
+        "Scheduler"
+      ]
+    },
+    "resource-height": {
+      "type": [
+        "Number",
+        "String"
+      ],
+      "category": "behavior",
+      "desc": "The maximum height in pixels for the resource height",
+      "default": "70",
+      "applicable": [
+        "Scheduler"
+      ],
+      "examples": [
+        "resource-height=\"80\"",
+        "resource-height=\"100\""
+      ]
+    },
+    "resource-width": {
+      "type": [
+        "Number",
+        "String"
+      ],
+      "category": "style",
+      "desc": "The maximum width in pixels for the resource width",
+      "applicable": [
+        "Scheduler"
+      ],
+      "examples": [
+        "resource-width=\"120\"",
+        "resource-width=\"200\""
+      ]
+    },
+    "resource-style": {
+      "type": "Function",
+      "category": "style",
+      "desc": "Gets called to provide custom styling of a resource",
+      "params": {
+        "data": {
+          "type": "Object",
+          "desc": "The data passed to the function",
+          "params": {
+            "timestamp": {
+              "type": "Object",
+              "desc": "A timestamp object associated with the interval"
+            },
+            "index": {
+              "type": "Number",
+              "desc": "The resource index"
+            },
+            "resource": {
+              "type": "Object",
+              "desc": "The resource object"
+            }
+          }
+        }
+      },
+      "returns": "A Vue style object",
+      "default": "{}",
+      "applicable": [
+        "Scheduler"
+      ],
+      "examples": [
+        ":resource-style=\"resourceStyle\""
+      ]
+    }
+  },
+  "events": {
+    "input": {
+      "desc": "Emitted when calendar date changes",
+      "params": {
+        "value": {
+          "type": "String",
+          "desc": "In YYYY-mm-dd format",
+          "required": true,
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "change": {
+      "desc": "Emitted when the calendar dates change. For instance, if in `month` view, the `start` contains the timestamp object for the 1st of the month, and `end` contains the timestamp object for the last day of the month",
+      "params": {
+        "start": {
+          "type": "Object",
+          "desc": "The timestamp object for the first valid date being displayed",
+          "__exemption": [ "examples" ]
+        },
+        "end": {
+          "type": "Object",
+          "desc": "The timestamp object for the last valid date being displayed",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "moved": {
+      "desc": "Emitted when the date is moved",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object of the move. For instance, if in month view, this will be the timestamp object containing the 1st of the month",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "click:date": {
+      "desc": "Occurs on date button",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "contextmenu:date": {
+      "desc": "Occurs on date button",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousedown:date": {
+      "desc": "Occurs on date button",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseup:date": {
+      "desc": "Occurs on date button",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseenter:date": {
+      "desc": "Occurs on date button",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseleave:date": {
+      "desc": "Occurs on date button",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousemove:date": {
+      "desc": "Occurs on date button",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchstart:date": {
+      "desc": "Occurs on date button",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchend:date": {
+      "desc": "Occurs on date button",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchmove:date": {
+      "desc": "Occurs on date button",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+
+    "click:day": {
+      "desc": "Occurs on day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "contextmenu:day": {
+      "desc": "Occurs on day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousedown:day": {
+      "desc": "Occurs on day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseup:day": {
+      "desc": "Occurs on day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseenter:day": {
+      "desc": "Occurs on day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseleave:day": {
+      "desc": "Occurs on day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousemove:day": {
+      "desc": "Occurs on day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchstart:day": {
+      "desc": "Occurs on day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchend:day": {
+      "desc": "Occurs on day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchmove:day": {
+      "desc": "Occurs on day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+
+    "click:interval": {
+      "desc": "Occurs on interval area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "contextmenu:interval": {
+      "desc": "Occurs on interval area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousedown:interval": {
+      "desc": "Occurs on interval area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseup:interval": {
+      "desc": "Occurs on interval area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseenter:interval": {
+      "desc": "Occurs on interval area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseleave:interval": {
+      "desc": "Occurs on interval area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousemove:interval": {
+      "desc": "Occurs on interval area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchstart:interval": {
+      "desc": "Occurs on interval area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchend:interval": {
+      "desc": "Occurs on interval area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchmove:interval": {
+      "desc": "Occurs on interval area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+
+    "click:time": {
+      "desc": "Occurs on interval time area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "contextmenu:time": {
+      "desc": "Occurs on interval time area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousedown:time": {
+      "desc": "Occurs on interval time area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseup:time": {
+      "desc": "Occurs on interval time area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseenter:time": {
+      "desc": "Occurs on interval time area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseleave:time": {
+      "desc": "Occurs on interval time area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousemove:time": {
+      "desc": "Occurs on interval time area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchstart:time": {
+      "desc": "Occurs on interval time area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchend:time": {
+      "desc": "Occurs on interval time area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchmove:time": {
+      "desc": "Occurs on interval time area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "The timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+
+    "click:resource": {
+      "desc": "Occurs on resource area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object and resource index",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "contextmenu:resource": {
+      "desc": "Occurs on resource area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object and resource index",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousedown:resource": {
+      "desc": "Occurs on resource area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object and resource index",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseup:resource": {
+      "desc": "Occurs on resource area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object and resource index",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseenter:resource": {
+      "desc": "Occurs on resource area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object and resource index",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseleave:resource": {
+      "desc": "Occurs on resource area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object and resource index",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousemove:resource": {
+      "desc": "Occurs on resource area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object and resource index",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchstart:resource": {
+      "desc": "Occurs on resource area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object and resource index",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchend:resource": {
+      "desc": "Occurs on resource area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object and resource index",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchmove:resource": {
+      "desc": "Occurs on resource area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object and resource index",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+
+    "click:resource:day": {
+      "desc": "Occurs on resource day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object, resource index and the timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "contextmenu:resource:day": {
+      "desc": "Occurs on resource day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object, resource index and the timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousedown:resource:day": {
+      "desc": "Occurs on resource day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object, resource index and the timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseup:resource:day": {
+      "desc": "Occurs on resource day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object, resource index and the timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseenter:resource:day": {
+      "desc": "Occurs on resource day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object, resource index and the timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mouseleave:resource:day": {
+      "desc": "Occurs on resource day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object, resource index and the timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "mousemove:resource:day": {
+      "desc": "Occurs on resource day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object, resource index and the timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchstart:resource:day": {
+      "desc": "Occurs on resource day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object, resource index and the timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchend:resource:day": {
+      "desc": "Occurs on resource day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object, resource index and the timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "touchmove:resource:day": {
+      "desc": "Occurs on resource day area",
+      "params": {
+        "timestamp": {
+          "type": "Object",
+          "desc": "Object contains resource object, resource index and the timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      }
+    }
+  },
+  "methods": {
+    "prev": {
+      "desc": "Triggers component to display previous",
+      "__exemption": [ "examples" ]
+    },
+    "next": {
+      "desc": "Triggers component to display next",
+      "__exemption": [ "examples" ]
+    },
+    "move": {
+      "desc": "Triggers component to move for count iterations, depending on positive (forwards) or negative (backwards) value",
+      "params": {
+        "count": {
+          "type": "Number",
+          "__exemption": [ "examples" ]
+        }
+      }
+    },
+    "updateCurrent": {
+      "desc": "Update various values to be consistent with current date",
+      "__exemption": [ "examples" ]
+    }
+  },
+  "scopedSlots": {
+    "day-header": {
+      "desc": "index is added if using `column-count` property",
+      "params": {
+        "day": {
+          "value": "Object",
+          "desc": "Timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Day"
+      ]
+    },
+    "day-body": {
+      "desc": "index is added if using `column-count` property",
+      "params": {
+        "day": {
+          "value": "Object",
+          "desc": "Timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Day",
+        "Month"
+      ]
+    },
+    "intervals-header": {
+      "desc": "",
+      "params": {
+        "days": {
+          "value": "Array",
+          "desc": "An array of Timestamp objects",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Day"
+      ]
+    },
+    "interval": {
+      "desc": "index is added if using `column-count` property",
+      "data": "",
+      "params": {
+        "timeStartPos": {
+          "value": "Function",
+          "desc": "Given a time, will return the css top value",
+          "params": {
+            "time": {
+              "type": "String",
+              "desc": "Format is HH:mm (24 hour format)",
+              "__exemption": [ "examples" ]
+            }
+          }
+        },
+        "timeDurationHeight": {
+          "value": "Function",
+          "desc": "Given a duration (in seconds), will return the css height value",
+          "params": {
+            "duration": {
+              "type": "Number",
+              "desc": "The number of seconds for the event",
+              "__exemption": [ "examples" ]
+            }
+          }
+        }
+      },
+      "applicable": [
+        "Day"
+      ]
+    },
+    "column-header-before": {
+      "desc": "",
+      "params": {
+        "day": {
+          "value": "Object",
+          "desc": "Timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Day"
+      ]
+    },
+    "column-header-after": {
+      "desc": "",
+      "params": {
+        "day": {
+          "value": "Object",
+          "desc": "Timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Day"
+      ]
+    },
+    "day": {
+      "desc": "",
+      "params": {
+        "day": {
+          "value": "Object",
+          "desc": "Timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Month"
+      ]
+    },
+    "month-label": {
+      "desc": "",
+      "params": {
+        "data": {
+          "value": "Object",
+          "desc": "Timestamp object with monthLabel",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Month"
+      ]
+    },
+    "day-of-year": {
+      "desc": "",
+      "params": {
+        "data": {
+          "value": "Object",
+          "desc": "Timestamp object",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Month"
+      ]
+    },
+    "work-week-label": {
+      "desc": "",
+      "params": {
+        "data": {
+          "value": "Object",
+          "desc": "Timestamp object with workWeekLabel",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Month"
+      ]
+    },
+    "scheduler-resources-header": {
+      "desc": "",
+      "params": {
+        "data": {
+          "value": "Object",
+          "desc": "",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Scheduler"
+      ]
+    },
+    "scheduler-day-header": {
+      "desc": "",
+      "params": {
+        "data": {
+          "value": "Object",
+          "desc": "",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Scheduler"
+      ]
+    },
+    "scheduler-column-header-before": {
+      "desc": "",
+      "params": {
+        "data": {
+          "value": "Object",
+          "desc": "",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Scheduler"
+      ]
+    },
+    "scheduler-column-header-after": {
+      "desc": "",
+      "params": {
+        "data": {
+          "value": "Object",
+          "desc": "",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Scheduler"
+      ]
+    },
+    "scheduler-resource-day": {
+      "desc": "",
+      "params": {
+        "data": {
+          "value": "Object",
+          "desc": "",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Scheduler"
+      ]
+    },
+    "scheduler-resource": {
+      "desc": "",
+      "params": {
+        "data": {
+          "value": "Object",
+          "desc": "",
+          "__exemption": [ "examples" ]
+        }
+      },
+      "applicable": [
+        "Scheduler"
+      ]
+    }
+  }
+}

+ 82 - 8
docs-generator/src/layouts/MyLayout.vue → docs-generator/src/layouts/MainLayout.vue

@@ -1,5 +1,5 @@
 <template>
-  <q-layout view="lHh Lpr lFf">
+  <q-layout view="HHh LpR fFf">
     <q-header elevated>
       <q-toolbar>
         <q-btn
@@ -13,17 +13,28 @@
         </q-btn>
 
         <q-toolbar-title>
-          Quasar App
+          Tauri <!-- <span class="text-subtitle2">v{{ version }}</span> -->
         </q-toolbar-title>
 
         <div>Quasar v{{ $q.version }}</div>
+
+        <q-btn
+          flat
+          dense
+          round
+          @click="rightDrawerOpen = !rightDrawerOpen"
+          aria-label="Table of Contents"
+        >
+          <q-icon name="menu" />
+        </q-btn>
+
       </q-toolbar>
     </q-header>
 
     <q-drawer
       v-model="leftDrawerOpen"
       bordered
-      content-class="bg-grey-2"
+      content-style="background-color: #f8f8ff"
     >
       <q-list>
         <q-item-label header>Essential Links</q-item-label>
@@ -84,6 +95,32 @@
       </q-list>
     </q-drawer>
 
+    <q-drawer
+      v-model="rightDrawerOpen"
+      side="right"
+      bordered
+      content-style="background-color: #f8f8ff"
+    >
+      <q-scroll-area class="fit">
+        <q-list dense>
+          <q-item
+            v-for="item in toc"
+            :key="item.id"
+            clickable
+            v-ripple
+            dense
+            @click="scrollTo(item.id)"
+            :active="activeToc === item.id"
+          >
+          <q-item-section v-if="item.level > 1" side> • </q-item-section>
+            <q-item-section
+              :class="`toc-item toc-level-${item.level}`"
+            >{{ item.label }}</q-item-section>
+          </q-item>
+        </q-list>
+      </q-scroll-area>
+    </q-drawer>
+
     <q-page-container>
       <router-view />
     </q-page-container>
@@ -91,20 +128,57 @@
 </template>
 
 <script>
-import { openURL } from 'quasar'
+import { mapGetters } from 'vuex'
+import { scroll } from 'quasar'
 
 export default {
-  name: 'MyLayout',
+  name: 'MainLayout',
+
   data () {
     return {
-      leftDrawerOpen: this.$q.platform.is.desktop
+      leftDrawerOpen: this.$q.platform.is.desktop,
+      rightDrawerOpen: this.$q.platform.is.desktop,
+      activeToc: 0
     }
   },
+
+  computed: {
+    ...mapGetters({
+      toc: 'common/toc'
+    })
+  },
+
+  mounted () {
+    // code to handle anchor link on refresh/new page, etc
+    if (location.hash !== '') {
+      const id = location.hash.substring(1, location.hash.length)
+      setTimeout(() => {
+        this.scrollTo(id)
+      }, 200)
+    }
+  },
+
   methods: {
-    openURL
+    scrollTo (id) {
+      this.activeToc = id
+      const el = document.getElementById(id)
+
+      if (el) {
+        this.scrollPage(el)
+      }
+    },
+    scrollPage (el) {
+      const offset = el.offsetTop - 50
+      scroll.setScrollPosition(window, offset, 500)
+    }
   }
 }
 </script>
 
-<style>
+<style lang="stylus">
+.toc-level
+  &-2
+    margin-left 0
+  &-3
+    margin-left 10px
 </style>

+ 53 - 0
docs-generator/src/layouts/OtherLayout.vue

@@ -0,0 +1,53 @@
+<template>
+  <q-layout view="lHh Lpr lFf">
+
+    <q-header elevated class="glossy">
+      <q-toolbar>
+        <q-btn
+          flat
+          dense
+          round
+          @click="leftDrawerOpen = !leftDrawerOpen"
+          aria-label="Menu"
+        >
+          <q-icon name="menu"></q-icon>
+        </q-btn>
+
+        <q-toolbar-title v-if="$q.screen.width > 500">
+          Tauri <!-- <span class="text-subtitle2">v{{ version }}</span> -->
+        </q-toolbar-title>
+
+        <div>Quasar v{{ $q.version }}</div>
+      </q-toolbar>
+    </q-header>
+
+    <q-drawer
+      v-model="leftDrawerOpen"
+      bordered
+      content-class="bg-grey-2"
+    >
+      <!-- QScrollArea is optional -->
+      <q-scroll-area class="fit q-pa-sm">
+        <!-- Content here -->
+      </q-scroll-area>
+    </q-drawer>
+
+    <q-page-container>
+      <!-- This is where pages get injected -->
+      <router-view />
+    </q-page-container>
+
+  </q-layout>
+</template>
+
+<script>
+export default {
+  // name: 'LayoutName',
+
+  data () {
+    return {
+      leftDrawer: true
+    }
+  }
+}
+</script>

+ 32 - 0
docs-generator/src/markdown/tauri.md

@@ -0,0 +1,32 @@
+Tauri
+===
+
+You can add any markdown to this file. It is your opening page.
+
+> All levels (headings) must have a unique name or browser will complain about identical keys
+
+# Lorem Ipsum
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pharetra et ultrices neque ornare aenean euismod elementum. Ac tincidunt vitae semper quis. Sodales neque sodales ut etiam sit. Ut morbi tincidunt augue interdum velit euismod in. Fames ac turpis egestas sed tempus urna. Nec feugiat in fermentum posuere urna nec tincidunt. Non consectetur a erat nam. Habitant morbi tristique senectus et netus et malesuada. At urna condimentum mattis pellentesque id nibh tortor id. Aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Quam id leo in vitae. Viverra suspendisse potenti nullam ac tortor. Nisl nunc mi ipsum faucibus vitae. Lorem donec massa sapien faucibus et. Orci dapibus ultrices in iaculis nunc sed. Est pellentesque elit ullamcorper dignissim cras tincidunt. Viverra ipsum nunc aliquet bibendum. Erat imperdiet sed euismod nisi porta.
+
+In egestas erat imperdiet sed euismod nisi porta. Nunc mi ipsum faucibus vitae. Arcu cursus vitae congue mauris rhoncus aenean. In fermentum posuere urna nec. Dis parturient montes nascetur ridiculus mus. Aliquet enim tortor at auctor urna nunc id cursus metus. Praesent semper feugiat nibh sed pulvinar proin gravida hendrerit lectus. Vestibulum lorem sed risus ultricies tristique nulla aliquet. Varius duis at consectetur lorem donec. Fusce ut placerat orci nulla pellentesque dignissim enim.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pharetra et ultrices neque ornare aenean euismod elementum. Ac tincidunt vitae semper quis. Sodales neque sodales ut etiam sit. Ut morbi tincidunt augue interdum velit euismod in. Fames ac turpis egestas sed tempus urna. Nec feugiat in fermentum posuere urna nec tincidunt. Non consectetur a erat nam. Habitant morbi tristique senectus et netus et malesuada. At urna condimentum mattis pellentesque id nibh tortor id. Aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Quam id leo in vitae. Viverra suspendisse potenti nullam ac tortor. Nisl nunc mi ipsum faucibus vitae. Lorem donec massa sapien faucibus et. Orci dapibus ultrices in iaculis nunc sed. Est pellentesque elit ullamcorper dignissim cras tincidunt. Viverra ipsum nunc aliquet bibendum. Erat imperdiet sed euismod nisi porta.
+
+## Second level
+
+In egestas erat imperdiet sed euismod nisi porta. Nunc mi ipsum faucibus vitae. Arcu cursus vitae congue mauris rhoncus aenean. In fermentum posuere urna nec. Dis parturient montes nascetur ridiculus mus. Aliquet enim tortor at auctor urna nunc id cursus metus. Praesent semper feugiat nibh sed pulvinar proin gravida hendrerit lectus. Vestibulum lorem sed risus ultricies tristique nulla aliquet. Varius duis at consectetur lorem donec. Fusce ut placerat orci nulla pellentesque dignissim enim.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pharetra et ultrices neque ornare aenean euismod elementum. Ac tincidunt vitae semper quis. Sodales neque sodales ut etiam sit. Ut morbi tincidunt augue interdum velit euismod in. Fames ac turpis egestas sed tempus urna. Nec feugiat in fermentum posuere urna nec tincidunt. Non consectetur a erat nam. Habitant morbi tristique senectus et netus et malesuada. At urna condimentum mattis pellentesque id nibh tortor id. Aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Quam id leo in vitae. Viverra suspendisse potenti nullam ac tortor. Nisl nunc mi ipsum faucibus vitae. Lorem donec massa sapien faucibus et. Orci dapibus ultrices in iaculis nunc sed. Est pellentesque elit ullamcorper dignissim cras tincidunt. Viverra ipsum nunc aliquet bibendum. Erat imperdiet sed euismod nisi porta.
+
+### Level III
+
+In egestas erat imperdiet sed euismod nisi porta. Nunc mi ipsum faucibus vitae. Arcu cursus vitae congue mauris rhoncus aenean. In fermentum posuere urna nec. Dis parturient montes nascetur ridiculus mus. Aliquet enim tortor at auctor urna nunc id cursus metus. Praesent semper feugiat nibh sed pulvinar proin gravida hendrerit lectus. Vestibulum lorem sed risus ultricies tristique nulla aliquet. Varius duis at consectetur lorem donec. Fusce ut placerat orci nulla pellentesque dignissim enim.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pharetra et ultrices neque ornare aenean euismod elementum. Ac tincidunt vitae semper quis. Sodales neque sodales ut etiam sit. Ut morbi tincidunt augue interdum velit euismod in. Fames ac turpis egestas sed tempus urna. Nec feugiat in fermentum posuere urna nec tincidunt. Non consectetur a erat nam. Habitant morbi tristique senectus et netus et malesuada. At urna condimentum mattis pellentesque id nibh tortor id. Aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Quam id leo in vitae. Viverra suspendisse potenti nullam ac tortor. Nisl nunc mi ipsum faucibus vitae. Lorem donec massa sapien faucibus et. Orci dapibus ultrices in iaculis nunc sed. Est pellentesque elit ullamcorper dignissim cras tincidunt. Viverra ipsum nunc aliquet bibendum. Erat imperdiet sed euismod nisi porta.
+
+In egestas erat imperdiet sed euismod nisi porta. Nunc mi ipsum faucibus vitae. Arcu cursus vitae congue mauris rhoncus aenean. In fermentum posuere urna nec. Dis parturient montes nascetur ridiculus mus. Aliquet enim tortor at auctor urna nunc id cursus metus. Praesent semper feugiat nibh sed pulvinar proin gravida hendrerit lectus. Vestibulum lorem sed risus ultricies tristique nulla aliquet. Varius duis at consectetur lorem donec. Fusce ut placerat orci nulla pellentesque dignissim enim.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pharetra et ultrices neque ornare aenean euismod elementum. Ac tincidunt vitae semper quis. Sodales neque sodales ut etiam sit. Ut morbi tincidunt augue interdum velit euismod in. Fames ac turpis egestas sed tempus urna. Nec feugiat in fermentum posuere urna nec tincidunt. Non consectetur a erat nam. Habitant morbi tristique senectus et netus et malesuada. At urna condimentum mattis pellentesque id nibh tortor id. Aenean vel elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi. Penatibus et magnis dis parturient montes nascetur ridiculus mus. Quam id leo in vitae. Viverra suspendisse potenti nullam ac tortor. Nisl nunc mi ipsum faucibus vitae. Lorem donec massa sapien faucibus et. Orci dapibus ultrices in iaculis nunc sed. Est pellentesque elit ullamcorper dignissim cras tincidunt. Viverra ipsum nunc aliquet bibendum. Erat imperdiet sed euismod nisi porta.
+
+In egestas erat imperdiet sed euismod nisi porta. Nunc mi ipsum faucibus vitae. Arcu cursus vitae congue mauris rhoncus aenean. In fermentum posuere urna nec. Dis parturient montes nascetur ridiculus mus. Aliquet enim tortor at auctor urna nunc id cursus metus. Praesent semper feugiat nibh sed pulvinar proin gravida hendrerit lectus. Vestibulum lorem sed risus ultricies tristique nulla aliquet. Varius duis at consectetur lorem donec. Fusce ut placerat orci nulla pellentesque dignissim enim.

+ 85 - 0
docs-generator/src/pages/Examples.vue

@@ -0,0 +1,85 @@
+<template>
+  <hero>
+    <q-markdown>
+You can add markdown to your page by surrounding it with `q-markdown` tag.
+Be aware, markdown is sensitive to being on left side, otherwise will wrap it in blocks (indented).
+    </q-markdown>
+
+    <q-markdown>
+This is an exampe of a title. It calls outside of the markdown, so be to register the label in the TOC below.
+    </q-markdown>
+
+    <example-title title="Basic" />
+    <example-card title="Tauri - Basic" name="TauriBasic" :tag-parts="getTagParts(require('!!raw-loader!../examples/TauriBasic.vue').default)" />
+    <example-card title="Tauri - Advanced" name="TauriAdvanced" :tag-parts="getTagParts(require('!!raw-loader!../examples/TauriAdvanced.vue').default)" />
+
+  </hero>
+</template>
+
+<script>
+import Hero from '../components/Hero'
+import ExampleTitle from '../components/ExampleTitle'
+import ExampleCard from '../components/ExampleCard'
+import { slugify } from 'assets/page-utils'
+import getTagParts from '@quasar/quasar-app-extension-qmarkdown/src/lib/getTagParts'
+
+export default {
+  name: 'Examples',
+
+  components: {
+    Hero,
+    ExampleTitle,
+    ExampleCard
+  },
+
+  data () {
+    return {
+      tempToc: []
+    }
+  },
+
+  mounted () {
+    this.toc = []
+    this.tempToc = []
+
+    // example of top-level toc
+    this.addToToc('Basic')
+
+    // example of second-level toc
+    this.addToToc('Tauri - Basic', 2)
+
+    this.addToToc('Tauri - Advanced', 2)
+
+    // add the toc to right drawer
+    this.toc = this.tempToc
+  },
+
+  computed: {
+    toc:
+    {
+      get () {
+        return this.$store.state.common.toc
+      },
+      set (toc) {
+        this.$store.commit('common/toc', toc)
+      }
+    }
+  },
+
+  methods: {
+    getTagParts,
+    addToToc (name, level = 1) {
+      const slug = slugify(name)
+      this.tempToc.push({
+        children: [],
+        id: slug,
+        label: name,
+        level: level
+      })
+    }
+  }
+}
+</script>
+
+<style>
+</style>

+ 62 - 7
docs-generator/src/pages/Index.vue

@@ -1,14 +1,69 @@
 <template>
-  <q-page class="flex flex-center">
-    <img alt="Quasar logo" src="~assets/quasar-logo-full.svg">
-  </q-page>
-</template>
+  <hero>
+    <q-markdown :src="markdown" toc @data="onToc" />
+
+    <component-api
+      title="Tauri API"
+      :json="json"
+    />
+
+    <!-- You can specify any amount of APIs here -->
 
-<style>
-</style>
+    <q-markdown>
+# Donate
+If you appreciate the work that went into this App Extension, please consider [donating to Quasar](https://donate.quasar.dev).
+
+---
+This page created with [QMarkdown](https://quasarframework.github.io/app-extension-qmarkdown), another great Quasar App Extension.
+    </q-markdown>
+    <q-page-scroller position="bottom-right" :scroll-offset="150" :offset="[18, 18]">
+      <q-btn fab icon="keyboard_arrow_up" color="primary" />
+    </q-page-scroller>
+  </hero>
+</template>
 
 <script>
+import Hero from '../components/Hero'
+import markdown from '../markdown/tauri.md'
+// import json from '@quasar/tauri/src/Tauri.json'
+import json from '../json/tauri.json'
+
 export default {
-  name: 'PageIndex'
+  name: 'PageIndex',
+
+  components: {
+    Hero
+  },
+
+  data () {
+    return {
+      markdown: markdown,
+      json: json
+    }
+  },
+
+  computed: {
+    toc:
+    {
+      get () {
+        return this.$store.state.common.toc
+      },
+      set (toc) {
+        // console.log('toc:', toc)
+        this.$store.commit('common/toc', toc)
+      }
+    }
+  },
+
+  methods: {
+    onToc (toc) {
+      // add anything not picked uip by the markdown processor
+      toc.push({ id: 'Tauri-API', label: 'Tauri API', level: 1, children: Array(0) })
+      toc.push({ id: 'Donate', label: 'Donate', level: 1, children: Array(0) })
+
+      this.toc = toc
+    }
+  }
+
 }
 </script>

+ 13 - 1
docs-generator/src/router/routes.js

@@ -1,11 +1,23 @@
 
 const routes = [
   {
+    // redirect to docs
     path: '/',
-    component: () => import('layouts/MyLayout.vue'),
+    redirect: '/docs'
+  },
+  {
+    path: '/docs',
+    component: () => import('layouts/MainLayout.vue'),
     children: [
       { path: '', component: () => import('pages/Index.vue') }
     ]
+  },
+  {
+    path: '/examples',
+    component: () => import('layouts/MainLayout.vue'),
+    children: [
+      { path: '', component: () => import('pages/Examples.vue') }
+    ]
   }
 ]
 

+ 4 - 0
docs-generator/src/store/common/actions.js

@@ -0,0 +1,4 @@
+/*
+export function someAction (context) {
+}
+*/

+ 2 - 0
docs-generator/src/store/common/getters.js

@@ -0,0 +1,2 @@
+export const titlebarHeight = (state) => state.titlebarHeight
+export const toc = (state) => state.toc

+ 12 - 0
docs-generator/src/store/common/index.js

@@ -0,0 +1,12 @@
+import state from './state'
+import * as getters from './getters'
+import * as mutations from './mutations'
+import * as actions from './actions'
+
+export default {
+  namespaced: true,
+  state,
+  getters,
+  mutations,
+  actions
+}

+ 6 - 0
docs-generator/src/store/common/mutations.js

@@ -0,0 +1,6 @@
+export const titlebarHeight = (state, height) => {
+  state.titlebarHeight = height
+}
+export const toc = (state, toc) => {
+  state.toc = toc
+}

+ 4 - 0
docs-generator/src/store/common/state.js

@@ -0,0 +1,4 @@
+export default {
+  titlebarHeight: 0,
+  toc: []
+}

+ 2 - 2
docs-generator/src/store/index.js

@@ -1,7 +1,7 @@
 import Vue from 'vue'
 import Vuex from 'vuex'
 
-// import example from './module-example'
+import common from './common'
 
 Vue.use(Vuex)
 
@@ -13,7 +13,7 @@ Vue.use(Vuex)
 export default function (/* { ssrContext } */) {
   const Store = new Vuex.Store({
     modules: {
-      // example
+      common
     },
 
     // enable strict mode (adds overhead!)

+ 32 - 2
docs-generator/yarn.lock

@@ -954,6 +954,20 @@
     raw-loader "^3.1.0"
     ware-loader "^0.2.4"
 
+"@quasar/quasar-app-extension-qpublish@^1.0.0-alpha.5":
+  version "1.0.0-alpha.5"
+  resolved "https://registry.yarnpkg.com/@quasar/quasar-app-extension-qpublish/-/quasar-app-extension-qpublish-1.0.0-alpha.5.tgz#ee4ade92b69b41114d94d9dff9c99d113fab6d8d"
+  integrity sha512-Ity//otADASULVdgqn4lXtFavg8dHssrnLQ6n5/FWSAs3O7PtHqvUGklU0dzgxv+j+2sbTV4Bi+XFg4gKpKqPQ==
+  dependencies:
+    quasar-mixin-colorize "^1.0.0-alpha.6"
+
+"@quasar/quasar-app-extension-qribbon@^1.0.0-beta.3":
+  version "1.0.0-beta.3"
+  resolved "https://registry.yarnpkg.com/@quasar/quasar-app-extension-qribbon/-/quasar-app-extension-qribbon-1.0.0-beta.3.tgz#4c49b0020b039668d08291a7e21cf1efdc4aa578"
+  integrity sha512-jSRHzY3t6Bl64XlWfpe2CQdvrhTvSxxZSQ6t7qVMFKsIxp2C0wCM0aLO9lvIcWB6Q6m+iYs1ZKUhQj7FKTcBAw==
+  dependencies:
+    quasar-mixin-colorize "^1.0.0-alpha.4"
+
 "@types/events@*":
   version "3.0.0"
   resolved "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
@@ -3550,7 +3564,7 @@ front-matter@^3.0.2:
   dependencies:
     js-yaml "^3.13.1"
 
-fs-extra@8.1.0:
+fs-extra@8.1.0, fs-extra@^8.1.0:
   version "8.1.0"
   resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
   integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
@@ -4144,7 +4158,7 @@ inquirer@6.5.0:
     strip-ansi "^5.1.0"
     through "^2.3.6"
 
-inquirer@^6.2.2:
+inquirer@^6.2.2, inquirer@^6.4.1:
   version "6.5.1"
   resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz#8bfb7a5ac02dac6ff641ac4c5ff17da112fcdb42"
   integrity sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==
@@ -6453,6 +6467,22 @@ qs@6.7.0:
   resolved "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
   integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
 
+quasar-app-extension-qautomate@^1.0.0-alpha.5:
+  version "1.0.0-alpha.5"
+  resolved "https://registry.yarnpkg.com/quasar-app-extension-qautomate/-/quasar-app-extension-qautomate-1.0.0-alpha.5.tgz#05c3ba95d17b78d180d2dae043c86a6b60629d99"
+  integrity sha512-VjClH4OJWEHOR3/rVj2jAl4pT/Mg/UBRtAruGDtbOtq09bmEiKEcbzET2tHOC2cMn3GjYA/7HQQpXBCC82ZSOQ==
+  dependencies:
+    chalk "^2.4.2"
+    fs-extra "^8.1.0"
+    inquirer "^6.4.1"
+    param-case "^2.1.1"
+    ware-loader "^0.2.4"
+
+quasar-mixin-colorize@^1.0.0-alpha.4, quasar-mixin-colorize@^1.0.0-alpha.6:
+  version "1.0.0-alpha.9"
+  resolved "https://registry.yarnpkg.com/quasar-mixin-colorize/-/quasar-mixin-colorize-1.0.0-alpha.9.tgz#e19c433a5b3f40c4ce4ab5c6e8506f7cb6eb83bb"
+  integrity sha512-xg49b7Z68D2+zdDOgq/XntKKAd2Anl1kIsLI3dKS26CCNGARB1JjPH9+tKd+r2MCcMf3R6qf775/vPKbsDZ4BQ==
+
 quasar@^1.0.0:
   version "1.0.5"
   resolved "https://registry.npmjs.org/quasar/-/quasar-1.0.5.tgz#caddfac55fca0779c996dc1b3977a045ae1426e6"

+ 23 - 0
docs/404.html

@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="utf-8" />
+
+  <title>404 Redirect</title>
+
+  <script>
+    sessionStorage.redirect = location.href;
+  </script>
+
+  <meta http-equiv="refresh" content="0;URL='/tauri'"></meta>
+</head>
+
+<body>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+</body>
+
+
+</html>

+ 1 - 0
docs/css/26b7cbd2.97bb784a.css

@@ -0,0 +1 @@
+.toc-level-2{margin-left:0}.toc-level-3{margin-left:10px}

+ 1 - 0
docs/css/41b4ae5e.79381a9e.css

@@ -0,0 +1 @@
+.my-class{background-color:#000}

+ 1 - 0
docs/css/4e8dcd81.79381a9e.css

@@ -0,0 +1 @@
+.my-class{background-color:#000}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
docs/css/app.d8a3568f.css


BIN
docs/fonts/KFOkCnqEu92Fr1MmgVxIIzQ.5cb7edfc.woff


BIN
docs/fonts/KFOlCnqEu92Fr1MmEU9fBBc-.87284894.woff


BIN
docs/fonts/KFOlCnqEu92Fr1MmSU5fBBc-.b00849e0.woff


BIN
docs/fonts/KFOlCnqEu92Fr1MmWUlfBBc-.adcde98f.woff


BIN
docs/fonts/KFOlCnqEu92Fr1MmYUtfBBc-.bb1e4dc6.woff


BIN
docs/fonts/KFOmCnqEu92Fr1Mu4mxM.60fa3c06.woff


BIN
docs/fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.29b882f0.woff


BIN
docs/fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.0509ab09.woff2


+ 1 - 0
docs/index.html

@@ -0,0 +1 @@
+<!DOCTYPE html><html><head><title>Tauri Documentation</title><meta charset=utf-8><meta name=description content="Tauri Documentation"><meta name=format-detection content="telephone=no"><meta name=msapplication-tap-highlight content=no><meta name=viewport content="user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1,width=device-width"><link rel=icon type=image/png href=statics/app-logo-128x128.png><link rel=icon type=image/png sizes=16x16 href=statics/icons/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=statics/icons/favicon-32x32.png><link rel=icon type=image/png sizes=96x96 href=statics/icons/favicon-96x96.png><link rel=icon type=image/ico href=statics/icons/favicon.ico><link href=/tauri/css/26b7cbd2.97bb784a.css rel=prefetch><link href=/tauri/css/41b4ae5e.79381a9e.css rel=prefetch><link href=/tauri/css/4e8dcd81.79381a9e.css rel=prefetch><link href=/tauri/js/26b7cbd2.ab56db38.js rel=prefetch><link href=/tauri/js/36a33e16.f0b60e78.js rel=prefetch><link href=/tauri/js/41b4ae5e.3a9b3c65.js rel=prefetch><link href=/tauri/js/4b47640d.487f7fb3.js rel=prefetch><link href=/tauri/js/4e8dcd81.b5cebbed.js rel=prefetch><link href=/tauri/js/bfc1f58c.4d92919e.js rel=prefetch><link href=/tauri/css/app.d8a3568f.css rel=preload as=style><link href=/tauri/js/app.33d68068.js rel=preload as=script><link href=/tauri/js/runtime.5d312108.js rel=preload as=script><link href=/tauri/js/vendor.927dd664.js rel=preload as=script><link href=/tauri/css/app.d8a3568f.css rel=stylesheet><base href=/tauri/ ></head><body><div id=q-app></div><script type=text/javascript src=/tauri/js/app.33d68068.js></script><script type=text/javascript src=/tauri/js/runtime.5d312108.js></script><script type=text/javascript src=/tauri/js/vendor.927dd664.js></script></body></html>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
docs/js/26b7cbd2.ab56db38.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
docs/js/36a33e16.f0b60e78.js


+ 1 - 0
docs/js/41b4ae5e.3a9b3c65.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["41b4ae5e"],{"515a":function(e,n,a){},"76d6":function(e,n,a){"use strict";a.r(n);var t=function(){var e=this,n=e.$createElement;e._self._c;return e._m(0)},r=[function(){var e=this,n=e.$createElement,a=e._self._c||n;return a("div",{staticClass:"q-pa-md"},[a("p",[e._v("You can put any regular Vue code (SFC) into one of these files.")]),a("p",[e._v("It will be displayed as an example.")])])}],s={data:function(){return{var1:10,var2:"string"}}},u=s,i=(a("a445"),a("2877")),c=Object(i["a"])(u,t,r,!1,null,null,null);n["default"]=c.exports},a445:function(e,n,a){"use strict";var t=a("515a"),r=a.n(t);r.a}}]);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
docs/js/4b47640d.487f7fb3.js


+ 1 - 0
docs/js/4e8dcd81.b5cebbed.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["4e8dcd81"],{"153d":function(e,t,a){"use strict";var n=a("64e9"),s=a.n(n);s.a},"1be3":function(e,t,a){"use strict";a.r(t);var n=function(){var e=this,t=e.$createElement;e._self._c;return e._m(0)},s=[function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"q-pa-md"},[a("p",[e._v("You can put any regular Vue code (SFC) into one of these files.")]),a("p",[e._v("It will be displayed as an example.")]),a("p",[e._v("template, script, and css will be separated out into 3 parts and each will have a tab.")])])}],r={data:function(){return{var1:10,var2:"string"}}},i=r,l=(a("153d"),a("2877")),c=Object(l["a"])(i,n,s,!1,null,null,null);t["default"]=c.exports},"64e9":function(e,t,a){}}]);

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
docs/js/app.33d68068.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
docs/js/bfc1f58c.4d92919e.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
docs/js/runtime.5d312108.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
docs/js/vendor.927dd664.js


BIN
docs/statics/app-logo-128x128.png


BIN
docs/statics/icons/apple-icon-120x120.png


BIN
docs/statics/icons/apple-icon-152x152.png


BIN
docs/statics/icons/apple-icon-167x167.png


BIN
docs/statics/icons/apple-icon-180x180.png


BIN
docs/statics/icons/favicon-16x16.png


BIN
docs/statics/icons/favicon-32x32.png


BIN
docs/statics/icons/favicon-96x96.png


BIN
docs/statics/icons/favicon.ico


BIN
docs/statics/icons/icon-128x128.png


BIN
docs/statics/icons/icon-192x192.png


BIN
docs/statics/icons/icon-256x256.png


BIN
docs/statics/icons/icon-384x384.png


BIN
docs/statics/icons/icon-512x512.png


BIN
docs/statics/icons/ms-icon-144x144.png


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
docs/statics/icons/safari-pinned-tab.svg


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels