浏览代码

misc: migrate to vuetify 2.0 (wip)

NGPixel 5 年之前
父节点
当前提交
27e0a37dbe
共有 47 个文件被更改,包括 728 次插入600 次删除
  1. 7 7
      client/components/admin/admin-analytics.vue
  2. 1 1
      client/components/admin/admin-api.vue
  3. 42 41
      client/components/admin/admin-auth.vue
  4. 47 51
      client/components/admin/admin-contribute.vue
  5. 2 2
      client/components/admin/admin-dashboard.vue
  6. 3 3
      client/components/admin/admin-dev-flags.vue
  7. 1 1
      client/components/admin/admin-dev-graphiql.vue
  8. 1 1
      client/components/admin/admin-dev-voyager.vue
  9. 1 1
      client/components/admin/admin-editor.vue
  10. 5 5
      client/components/admin/admin-general.vue
  11. 1 1
      client/components/admin/admin-groups-edit.vue
  12. 1 1
      client/components/admin/admin-groups.vue
  13. 1 1
      client/components/admin/admin-locale.vue
  14. 3 6
      client/components/admin/admin-logging.vue
  15. 30 31
      client/components/admin/admin-mail.vue
  16. 2 2
      client/components/admin/admin-navigation.vue
  17. 1 1
      client/components/admin/admin-pages-edit.vue
  18. 1 1
      client/components/admin/admin-pages.vue
  19. 3 3
      client/components/admin/admin-rendering.vue
  20. 3 3
      client/components/admin/admin-search.vue
  21. 1 1
      client/components/admin/admin-stats.vue
  22. 5 5
      client/components/admin/admin-storage.vue
  23. 38 41
      client/components/admin/admin-system.vue
  24. 1 1
      client/components/admin/admin-theme.vue
  25. 1 1
      client/components/admin/admin-users-edit.vue
  26. 1 1
      client/components/admin/admin-users.vue
  27. 11 11
      client/components/admin/admin-utilities-auth.vue
  28. 17 17
      client/components/admin/admin-utilities-cache.vue
  29. 9 9
      client/components/admin/admin-utilities-content.vue
  30. 1 1
      client/components/admin/admin-utilities-importv1.vue
  31. 40 39
      client/components/admin/admin-utilities-telemetry.vue
  32. 10 10
      client/components/admin/admin-utilities.vue
  33. 4 4
      client/components/admin/admin-webhooks.vue
  34. 4 4
      client/components/common/nav-header.vue
  35. 6 6
      client/components/common/page-delete.vue
  36. 4 4
      client/components/common/page-selector.vue
  37. 6 6
      client/components/editor.vue
  38. 26 25
      client/components/editor/editor-markdown.vue
  39. 17 24
      client/components/editor/editor-modal-properties.vue
  40. 二进制
      client/static/favicons/android-icon-72x72.png
  41. 二进制
      client/static/favicons/apple-icon-72x72.png
  42. 9 3
      client/themes/default/components/page.vue
  43. 4 0
      dev/index.js
  44. 3 4
      dev/webpack/webpack.dev.js
  45. 26 11
      dev/webpack/webpack.prod.js
  46. 16 15
      package.json
  47. 312 194
      yarn.lock

+ 7 - 7
client/components/admin/admin-analytics.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-line-chart.svg', alt='Analytics', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{ $t('admin:analytics.title') }}
-            .subheading.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:analytics.subtitle') }}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:analytics.subtitle') }}
           v-spacer
           v-btn.animated.fadeInDown.wait-p2s.mr-3(outlined, color='grey', @click='refresh', large)
             v-icon mdi-refresh
@@ -17,7 +17,7 @@
       v-flex(lg3, xs12)
         v-card.animated.fadeInUp
           v-toolbar(flat, color='primary', dark, dense)
-            .subheading {{$t('admin:analytics.providers')}}
+            .subtitle-1 {{$t('admin:analytics.providers')}}
           v-list(two-line, dense).py-0
             template(v-for='(str, idx) in providers')
               v-list-item(:key='str.key', @click='selectedProvider = str.key', :disabled='!str.isAvailable')
@@ -36,15 +36,15 @@
 
         v-card.animated.fadeInUp.wait-p2s
           v-toolbar(color='primary', dense, flat, dark)
-            .subheading {{provider.title}}
+            .subtitle-1 {{provider.title}}
           v-card-text
             v-form
               .analytic-provider-logo
                 img(:src='provider.logo', :alt='provider.title')
-              .caption.pt-3 {{provider.description}}
-              .caption.pb-3: a(:href='provider.website') {{provider.website}}
-              v-divider.mt-3
-              .overline.py-4 {{$t('admin:analytics.providerConfiguration')}}
+              .body-2.pt-3 {{provider.description}}
+              .body-2.pt-3: a(:href='provider.website') {{provider.website}}
+              v-divider.mt-5
+              .overline.py-5 {{$t('admin:analytics.providerConfiguration')}}
               .body-1.ml-3(v-if='!provider.config || provider.config.length < 1'): em {{$t('admin:analytics.providerNoConfiguration')}}
               template(v-else, v-for='cfg in provider.config')
                 v-select(

+ 1 - 1
client/components/admin/admin-api.vue

@@ -6,7 +6,7 @@
           img(src='/svg/icon-rest-api.svg', alt='API', style='width: 80px;')
           .admin-header-title
             .headline.blue--text.text--darken-2 API Access
-            .subheading.grey--text Manage keys to access the API #[v-chip(label, color='primary', small).white--text coming soon]
+            .subtitle-1.grey--text Manage keys to access the API #[v-chip(label, color='primary', small).white--text coming soon]
           v-spacer
           v-btn(outline, color='grey', large, @click='refresh', disabled)
             v-icon refresh

+ 42 - 41
client/components/admin/admin-auth.vue

@@ -6,41 +6,41 @@
           img.animated.fadeInUp(src='/svg/icon-unlock.svg', alt='Authentication', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{ $t('admin:auth.title') }}
-            .subheading.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:auth.subtitle') }}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:auth.subtitle') }}
           v-spacer
           v-btn.animated.fadeInDown.wait-p2s.mr-3(outlined, color='grey', @click='refresh', large)
-            v-icon refresh
+            v-icon mdi-refresh
           v-btn.animated.fadeInDown(color='success', @click='save', depressed, large)
-            v-icon(left) check
+            v-icon(left) mdi-check
             span {{$t('common:actions.apply')}}
 
       v-flex(lg3, xs12)
         v-card.animated.fadeInUp
           v-toolbar(flat, color='primary', dark, dense)
-            .subheading {{$t('admin:auth.strategies')}}
+            .subtitle-1 {{$t('admin:auth.strategies')}}
           v-list(two-line, dense).py-0
             template(v-for='(str, idx) in strategies')
               v-list-item(:key='str.key', @click='selectedStrategy = str.key', :disabled='!str.isAvailable')
-                v-list-item-avatar
-                  v-icon(color='grey', v-if='!str.isAvailable') indeterminate_check_box
-                  v-icon(color='primary', v-else-if='str.isEnabled && str.key !== `local`', v-ripple, @click='str.isEnabled = false') check_box
-                  v-icon(color='primary', v-else-if='str.isEnabled && str.key === `local`') check_box
-                  v-icon(color='grey', v-else, v-ripple, @click='str.isEnabled = true') check_box_outline_blank
+                v-list-item-avatar(size='24')
+                  v-icon(color='grey', v-if='!str.isAvailable') mdi-minus-box-outline
+                  v-icon(color='primary', v-else-if='str.isEnabled && str.key !== `local`', v-ripple, @click='str.isEnabled = false') mdi-checkbox-marked-outline
+                  v-icon(color='primary', v-else-if='str.isEnabled && str.key === `local`') mdi-checkbox-marked-outline
+                  v-icon(color='grey', v-else, v-ripple, @click='str.isEnabled = true') mdi-checkbox-blank-outline
                 v-list-item-content
                   v-list-item-title.body-2(:class='!str.isAvailable ? `grey--text` : (selectedStrategy === str.key ? `primary--text` : ``)') {{ str.title }}
-                  v-list-item-sub-title.caption(:class='!str.isAvailable ? `grey--text text--lighten-1` : (selectedStrategy === str.key ? `blue--text ` : ``)') {{ str.description }}
+                  v-list-item-subtitle: .caption(:class='!str.isAvailable ? `grey--text text--lighten-1` : (selectedStrategy === str.key ? `blue--text ` : ``)') {{ str.description }}
                 v-list-item-avatar(v-if='selectedStrategy === str.key')
-                  v-icon.animated.fadeInLeft(color='primary') arrow_forward_ios
+                  v-icon.animated.fadeInLeft(color='primary', large) mdi-chevron-right
               v-divider(v-if='idx < strategies.length - 1')
 
         v-card.wiki-form.mt-3.animated.fadeInUp.wait-p2s
           v-toolbar(flat, color='primary', dark, dense)
-            .subheading {{$t('admin:auth.globalAdvSettings')}}
+            .subtitle-1 {{$t('admin:auth.globalAdvSettings')}}
           v-card-text
             v-text-field.md2(
               v-model='jwtAudience'
               outlined
-              prepend-icon='account_balance'
+              prepend-icon='mdi-account-group-outline'
               :label='$t(`admin:auth.jwtAudience`)'
               :hint='$t(`admin:auth.jwtAudienceHint`)'
               persistent-hint
@@ -48,7 +48,7 @@
             v-text-field.mt-3.md2(
               v-model='jwtExpiration'
               outlined
-              prepend-icon='schedule'
+              prepend-icon='mdi-clock-outline'
               :label='$t(`admin:auth.tokenExpiration`)'
               :hint='$t(`admin:auth.tokenExpirationHint`)'
               persistent-hint
@@ -56,7 +56,7 @@
             v-text-field.mt-3.md2(
               v-model='jwtRenewablePeriod'
               outlined
-              prepend-icon='update'
+              prepend-icon='mdi-update'
               :label='$t(`admin:auth.tokenRenewalPeriod`)'
               :hint='$t(`admin:auth.tokenRenewalPeriodHint`)'
               persistent-hint
@@ -66,13 +66,13 @@
 
         v-card.wiki-form.animated.fadeInUp.wait-p2s
           v-toolbar(color='primary', dense, flat, dark)
-            .subheading {{strategy.title}}
+            .subtitle-1 {{strategy.title}}
           v-card-text
             v-form
               .authlogo
                 img(:src='strategy.logo', :alt='strategy.title')
-              .caption.pt-3 {{strategy.description}}
-              .caption.pb-3: a(:href='strategy.website') {{strategy.website}}
+              .body-2.pt-3 {{strategy.description}}
+              .body-2.pt-3.pb-5: a(:href='strategy.website') {{strategy.website}}
               i18next.body-2(path='admin:auth.strategyState', tag='div', v-if='strategy.isEnabled')
                 v-chip(color='green', small, dark, label, place='state') {{$t('admin:auth.strategyStateActive')}}
                 span(v-if='selectedStrategy === `local`', place='locked') {{$t('admin:auth.strategyStateLocked')}}
@@ -80,8 +80,8 @@
               i18next.body-2(path='admin:auth.strategyState', tag='div', v-else)
                 v-chip(color='red', small, dark, label, place='state') {{$t('admin:auth.strategyStateInactive')}}
               v-divider.mt-3
-              v-subheader.pl-0 {{$t('admin:auth.strategyConfiguration')}}
-              .body-1.ml-3(v-if='!strategy.config || strategy.config.length < 1'): em {{$t('admin:auth.strategyNoConfiguration')}}
+              .overline.my-5 {{$t('admin:auth.strategyConfiguration')}}
+              .body-2.ml-3(v-if='!strategy.config || strategy.config.length < 1'): em {{$t('admin:auth.strategyNoConfiguration')}}
               template(v-else, v-for='cfg in strategy.config')
                 v-select(
                   v-if='cfg.value.type === "string" && cfg.value.enum'
@@ -90,7 +90,7 @@
                   :key='cfg.key'
                   :label='cfg.value.title'
                   v-model='cfg.value.value'
-                  prepend-icon='settings_applications'
+                  prepend-icon='mdi-settings-box'
                   :hint='cfg.value.hint ? cfg.value.hint : ""'
                   persistent-hint
                   :class='cfg.value.hint ? "mb-2" : ""'
@@ -101,7 +101,7 @@
                   :label='cfg.value.title'
                   v-model='cfg.value.value'
                   color='primary'
-                  prepend-icon='settings_applications'
+                  prepend-icon='mdi-settings-box'
                   :hint='cfg.value.hint ? cfg.value.hint : ""'
                   persistent-hint
                   )
@@ -111,7 +111,7 @@
                   :key='cfg.key'
                   :label='cfg.value.title'
                   v-model='cfg.value.value'
-                  prepend-icon='settings_applications'
+                  prepend-icon='mdi-settings-box'
                   :hint='cfg.value.hint ? cfg.value.hint : ""'
                   persistent-hint
                   :class='cfg.value.hint ? "mb-2" : ""'
@@ -122,13 +122,13 @@
                   :key='cfg.key'
                   :label='cfg.value.title'
                   v-model='cfg.value.value'
-                  prepend-icon='settings_applications'
+                  prepend-icon='mdi-settings-box'
                   :hint='cfg.value.hint ? cfg.value.hint : ""'
                   persistent-hint
                   :class='cfg.value.hint ? "mb-2" : ""'
                   )
               v-divider.mt-3
-              v-subheader.pl-0 {{$t('admin:auth.registration')}}
+              .overline.my-5 {{$t('admin:auth.registration')}}
               .pr-3
                 v-switch.ml-3(
                   v-model='strategy.selfRegistration'
@@ -149,7 +149,7 @@
                 v-combobox.ml-3.mt-3(
                   :label='$t(`admin:auth.domainsWhitelist`)'
                   v-model='strategy.domainWhitelist'
-                  prepend-icon='mail_outline'
+                  prepend-icon='mdi-email-check-outline'
                   outlined
                   :disabled='!strategy.selfRegistration'
                   :hint='$t(`admin:auth.domainsWhitelistHint`)'
@@ -168,7 +168,7 @@
                   item-value='id'
                   :label='$t(`admin:auth.autoEnrollGroups`)'
                   v-model='strategy.autoEnrollGroups'
-                  prepend-icon='people'
+                  prepend-icon='mdi-account-group'
                   :hint='$t(`admin:auth.autoEnrollGroupsHint`)'
                   small-chips
                   persistent-hint
@@ -179,7 +179,7 @@
                   )
               template(v-if='strategy.useForm')
                 v-divider.mt-3
-                v-subheader.pl-0 {{$t('admin:auth.security')}}
+                .overline.my-5 {{$t('admin:auth.security')}}
                 v-switch.ml-3(
                   v-model='strategy.recaptcha'
                   :disabled='true'
@@ -189,30 +189,30 @@
                   persistent-hint
                 )
 
-        v-card.mt-3.wiki-form.animated.fadeInUp.wait-p4s
+        v-card.mt-4.wiki-form.animated.fadeInUp.wait-p4s
           v-toolbar(color='primary', dense, flat, dark)
-            .subheading {{$t('admin:auth.configReference')}}
+            .subtitle-1 {{$t('admin:auth.configReference')}}
           v-card-text
-            .body-1 {{$t('admin:auth.configReferenceSubtitle')}}
+            .body-2 {{$t('admin:auth.configReferenceSubtitle')}}
             v-alert.mt-3.radius-7(v-if='host.length < 8', color='red', outline, :value='true', icon='warning')
               i18next(path='admin:auth.siteUrlNotSetup', tag='span')
                 strong(place='siteUrl') {{$t('admin:general.siteUrl')}}
                 strong(place='general') {{$t('admin:general.title')}}
             .pa-3.mt-3.radius-7.grey(v-else, :class='$vuetify.dark ? `darken-3-d5` : `lighten-3`')
-              .body-2 {{$t('admin:auth.allowedWebOrigins')}}
-              .body-1 {{host}}
+              .body-2: strong {{$t('admin:auth.allowedWebOrigins')}}
+              .body-2 {{host}}
               v-divider.my-3
-              .body-2 {{$t('admin:auth.callbackUrl')}}
-              .body-1 {{host}}/login/{{strategy.key}}/callback
+              .body-2: strong {{$t('admin:auth.callbackUrl')}}
+              .body-2 {{host}}/login/{{strategy.key}}/callback
               v-divider.my-3
-              .body-2 {{$t('admin:auth.loginUrl')}}
-              .body-1 {{host}}/login
+              .body-2: strong {{$t('admin:auth.loginUrl')}}
+              .body-2 {{host}}/login
               v-divider.my-3
-              .body-2 {{$t('admin:auth.logoutUrl')}}
-              .body-1 {{host}}
+              .body-2: strong {{$t('admin:auth.logoutUrl')}}
+              .body-2 {{host}}
               v-divider.my-3
-              .body-2 {{$t('admin:auth.tokenEndpointAuthMethod')}}
-              .body-1 HTTP-POST
+              .body-2: strong {{$t('admin:auth.tokenEndpointAuthMethod')}}
+              .body-2 HTTP-POST
 </template>
 
 <script>
@@ -337,6 +337,7 @@ export default {
   display: flex;
   justify-content: flex-end;
   align-items: center;
+  margin-left: 16px;
 
   img {
     max-width: 100%;

+ 47 - 51
client/components/admin/admin-contribute.vue

@@ -6,49 +6,50 @@
           img.animated.fadeInUp(src='/svg/icon-heart-health.svg', alt='Contribute', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{ $t('admin:contribute.title') }}
-            .subheading.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:contribute.subtitle') }}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:contribute.subtitle') }}
         v-card.mt-3.animated.fadeInUp
           v-card-text
-            i18next.body-1.pl-3(path='admin:contribute.openSource', tag='div')
-              v-icon(color='red') favorite
+            i18next.body-2.pl-3(path='admin:contribute.openSource', tag='div')
+              v-icon(color='red') mdi-heart
               a(href='https://requarks.io', target='_blank') requarks.io
               a(href='https://github.com/Requarks/wiki/graphs/contributors', target='_blank') {{ $t('admin:contribute.openSourceContributors') }}
-            .body-1.pt-3.pl-3 {{ $t('admin:contribute.needYourHelp') }}
+            .body-2.pt-3.pl-3 {{ $t('admin:contribute.needYourHelp') }}
             v-divider.mt-3
-            v-subheader {{ $t('admin:contribute.fundOurWork') }}
+            v-subheader.subtitle-2 {{ $t('admin:contribute.fundOurWork') }}
             v-tabs.mx-3.radius-7.admin-contribute-tabs(
               centered
               fixed-tabs
-              color='primary'
+              background-color='primary'
+              color='white'
               dark
               slider-color='#FFF'
               icons-and-text
               )
               v-tab
                 span Patreon
-                img(src='/svg/icon-patreon.svg')
+                img.my-1(src='/svg/icon-patreon.svg', style='height: 24px;')
               v-tab
                 span OpenCollective
-                img(src='/svg/icon-opencollective.svg')
+                img.my-1(src='/svg/icon-opencollective.svg', style='height: 24px;')
               v-tab
                 span PayPal
-                img(src='/svg/icon-paypal.svg')
+                img.my-1(src='/svg/icon-paypal.svg', style='height: 24px;')
               v-tab
                 span Ethereum
-                img(src='/svg/icon-ethereum.svg')
+                img.my-1(src='/svg/icon-ethereum.svg', style='height: 24px;')
               v-tab
                 span T-Shirts
-                img(src='/svg/icon-t-shirt.svg')
+                img.my-1(src='/svg/icon-t-shirt.svg', style='height: 24px;')
               v-tab-item(:transition='false', :reverse-transition='false')
-                .body-1.pa-3 {{ $t('admin:contribute.patreon') }}
+                .body-2.pa-3 {{ $t('admin:contribute.patreon') }}
                 a.ml-3(href='https://www.patreon.com/bePatron?u=16744039', :title='$t(`admin:contribute.becomeAPatron`)')
                   img(src='/img/donate_patreon.png', :alt='$t(`admin:contribute.becomeAPatron`)' style='width:200px;')
               v-tab-item(:transition='false', :reverse-transition='false')
-                .body-1.pa-3 {{ $t('admin:contribute.openCollective') }}
+                .body-2.pa-3 {{ $t('admin:contribute.openCollective') }}
                 a.ml-3(href='https://opencollective.com/wikijs/donate', :title='$t(`admin:contribute.makeADonation`)')
                   img(src='/img/donate_opencollective.png', :alt='$t(`admin:contribute.makeADonation`)' style='width:300px;')
               v-tab-item(:transition='false', :reverse-transition='false')
-                .body-1.pa-3 {{ $t('admin:contribute.paypal') }}
+                .body-2.pa-3 {{ $t('admin:contribute.paypal') }}
                 .ml-3
                   form(action='https://www.paypal.com/cgi-bin/webscr', method='post', target='_top')
                     input(type='hidden', name='cmd', value='_s-xclick')
@@ -66,11 +67,11 @@
                 .body-1.pa-3 {{ $t('admin:contribute.tshirts') }}
                 v-card-actions.ml-2
                   v-btn(outline, :color='darkMode ? `blue lighten-1` : `primary`', href='https://wikijs.threadless.com', large)
-                    v-icon(left) shopping_cart
+                    v-icon(left) mdi-tshirt-crew
                     span {{ $t('admin:contribute.shop') }}
             v-divider.mt-3
-            v-subheader {{ $t('admin:contribute.contribute') }}
-            .body-1.pl-3
+            v-subheader.subtitle-2  {{ $t('admin:contribute.contribute') }}
+            .body-2.pl-3
               ul
                 i18next(path='admin:contribute.submitAnIdea', tag='li')
                   a(href='https://wiki.js.org/feedback', target='_blank') {{ $t('admin:contribute.submitAnIdeaLink') }}
@@ -79,126 +80,126 @@
                 i18next(path='admin:contribute.helpTranslate', tag='li')
                   a(href='https://wiki.requarks.io/slack', target='_blank') Slack
             v-divider.mt-3
-            v-subheader {{ $t('admin:contribute.spreadTheWord') }}
-            .body-1.pl-3
+            v-subheader.subtitle-2  {{ $t('admin:contribute.spreadTheWord') }}
+            .body-2.pl-3
               ul
                 li {{ $t('admin:contribute.talkToFriends') }}
                 i18next(path='admin:contribute.followUsOnTwitter', tag='li')
                   a(href='https://twitter.com/requarks', target='_blank') Twitter
           v-toolbar(color='teal', dense, dark)
-            .subheading Sponsors
+            .subtitle-1 Sponsors
             v-spacer
-            v-btn(outline, small, href='https://opencollective.com/wikijs/order/1273') Become a Sponsor
+            v-btn(outlined, small, href='https://opencollective.com/wikijs/order/1273') Become a Sponsor
           v-list(two-line)
             template(v-for='(sponsor, idx) in sponsors')
               v-list-item(:key='sponsor.id')
                 v-list-item-avatar
                   img(v-if='sponsor.image', :src='sponsor.image')
                   v-avatar(v-else, color='teal', size='40')
-                    span.white--text.subheading {{sponsor.name[0].toUpperCase()}}
+                    span.white--text.subtitle-1 {{sponsor.name[0].toUpperCase()}}
                 v-list-item-content
                   v-list-item-title {{sponsor.name}}
-                  v-list-item-sub-title {{sponsor.description}}
+                  v-list-item-subtitle {{sponsor.description}}
                 v-list-item-action(v-if='sponsor.twitter')
                   v-btn(icon, :href='sponsor.twitter', target='_blank')
-                    icon-twitter(fillColor='#9e9e9e')
+                    v-icon mdi-twitter
                 v-list-item-action(v-if='sponsor.website')
                   v-btn(icon, :href='sponsor.website', target='_blank')
-                    v-icon(color='grey') public
+                    v-icon(color='grey') mdi-earth
               v-divider(v-if='idx < sponsors.length - 1')
           v-toolbar(color='blue-grey', dense, dark)
-            .subheading Backers
+            .subtitle-1 Backers
             v-spacer
-            v-btn(outline, small, href='https://opencollective.com/wikijs/order/1272') Become a Backer
+            v-btn(outlined, small, href='https://opencollective.com/wikijs/order/1272') Become a Backer
           v-list(two-line, dense)
             template(v-for='(backer, idx) in backers')
               v-list-item(:key='backer.id')
                 v-list-item-avatar
                   img(v-if='backer.image', :src='backer.image')
                   v-avatar(v-else, color='blue-grey', size='40')
-                    span.white--text.subheading {{backer.name[0].toUpperCase()}}
+                    span.white--text.subtitle-1 {{backer.name[0].toUpperCase()}}
                 v-list-item-content
                   v-list-item-title {{backer.name}}
-                  v-list-item-sub-title {{backer.description}}
+                  v-list-item-subtitle {{backer.description}}
                 v-list-item-action(v-if='backer.twitter')
                   v-btn(icon, :href='backer.twitter', target='_blank')
-                    icon-twitter(fillColor='#9e9e9e')
+                    v-icon mdi-twitter
                 v-list-item-action(v-if='backer.website')
                   v-btn(icon, :href='backer.website', target='_blank')
-                    v-icon(color='grey') public
+                    v-icon(color='grey') mdi-earth
               v-divider(v-if='idx < backers.length - 1')
           v-toolbar(color='primary', dense, dark)
-            .subheading Special Thanks
+            .subtitle-1 Special Thanks
           v-list(two-line)
             v-list-item
               v-list-item-avatar
                 img(src='https://static.requarks.io/logo/algolia.svg', alt='Algolia')
               v-list-item-content
                 v-list-item-title Algolia
-                v-list-item-sub-title Algolia is a powerful search-as-a-service solution, made easy to use with API clients, UI libraries, and pre-built integrations.
+                v-list-item-subtitle Algolia is a powerful search-as-a-service solution, made easy to use with API clients, UI libraries, and pre-built integrations.
               v-list-item-action
                 v-btn(icon, href='https://www.algolia.com/', target='_blank')
-                  v-icon(color='grey') public
+                  v-icon(color='grey') mdi-earth
             v-divider
             v-list-item
               v-list-item-avatar
                 img(src='https://static.requarks.io/logo/browserstack.svg', alt='Browserstack')
               v-list-item-content
                 v-list-item-title BrowserStack
-                v-list-item-sub-title BrowserStack is a cloud web and mobile testing platform that enables developers to test their websites and mobile applications.
+                v-list-item-subtitle BrowserStack is a cloud web and mobile testing platform that enables developers to test their websites and mobile applications.
               v-list-item-action
                 v-btn(icon, href='https://www.browserstack.com/', target='_blank')
-                  v-icon(color='grey') public
+                  v-icon(color='grey') mdi-earth
             v-divider
             v-list-item
               v-list-item-avatar
                 img(src='https://static.requarks.io/logo/cloudflare.svg', alt='Cloudflare')
               v-list-item-content
                 v-list-item-title Cloudflare
-                v-list-item-sub-title Providing content delivery network services, DDoS mitigation, Internet security and distributed domain name server services.
+                v-list-item-subtitle Providing content delivery network services, DDoS mitigation, Internet security and distributed domain name server services.
               v-list-item-action
                 v-btn(icon, href='https://www.cloudflare.com/', target='_blank')
-                  v-icon(color='grey') public
+                  v-icon(color='grey') mdi-earth
             v-divider
             v-list-item
               v-list-item-avatar
                 img(src='https://static.requarks.io/logo/digitalocean.svg', alt='DigitalOcean')
               v-list-item-content
                 v-list-item-title DigitalOcean
-                v-list-item-sub-title Providing developers and businesses a reliable, easy-to-use cloud computing platform of virtual servers (Droplets), object storage (Spaces), and more.
+                v-list-item-subtitle Providing developers and businesses a reliable, easy-to-use cloud computing platform of virtual servers (Droplets), object storage (Spaces), and more.
               v-list-item-action
                 v-btn(icon, href='https://m.do.co/c/5f7445bfa4d0', target='_blank')
-                  v-icon(color='grey') public
+                  v-icon(color='grey') mdi-earth
             v-divider
             v-list-item
               v-list-item-avatar(tile)
                 img(src='/svg/logo-icons8.svg', alt='Icons8')
               v-list-item-content
                 v-list-item-title Icons8
-                v-list-item-sub-title All the Icons You Need. Guaranteed.
+                v-list-item-subtitle All the Icons You Need. Guaranteed.
               v-list-item-action
                 v-btn(icon, href='https://icons8.com', target='_blank')
-                  v-icon(color='grey') public
+                  v-icon(color='grey') mdi-earth
             v-divider
             v-list-item
               v-list-item-avatar(tile)
                 img(src='https://static.requarks.io/logo/lokalise.png', alt='Lokalise')
               v-list-item-content
                 v-list-item-title Lokalise
-                v-list-item-sub-title Lokalise is a translation management system built for agile teams who want to automate their localization process.
+                v-list-item-subtitle Lokalise is a translation management system built for agile teams who want to automate their localization process.
               v-list-item-action
                 v-btn(icon, href='https://lokalise.co', target='_blank')
-                  v-icon(color='grey') public
+                  v-icon(color='grey') mdi-earth
             v-divider
             v-list-item
               v-list-item-avatar(tile)
                 img(src='https://static.requarks.io/logo/netlify.svg', alt='Netlify')
               v-list-item-content
                 v-list-item-title Netlify
-                v-list-item-sub-title Deploy modern static websites with Netlify. Get CDN, Continuous deployment, 1-click HTTPS, and all the services you need.
+                v-list-item-subtitle Deploy modern static websites with Netlify. Get CDN, Continuous deployment, 1-click HTTPS, and all the services you need.
               v-list-item-action
                 v-btn(icon, href='https://wwwnetlify.com', target='_blank')
-                  v-icon(color='grey') public
+                  v-icon(color='grey') mdi-earth
 
 </template>
 
@@ -208,12 +209,7 @@ import { get } from 'vuex-pathify'
 
 import groupsQuery from 'gql/admin/contribute/contribute-query-contributors.gql'
 
-import IconTwitter from 'mdi/Twitter'
-
 export default {
-  components: {
-    IconTwitter
-  },
   data() {
     return {
       contributors: []

+ 2 - 2
client/components/admin/admin-dashboard.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-browse-page.svg', alt='Dashboard', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{ $t('admin:dashboard.title') }}
-            .subheading.grey--text.animated.fadeInLeft.wait-p2s {{ $t('admin:dashboard.subtitle') }}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p2s {{ $t('admin:dashboard.subtitle') }}
       v-flex(xs12 md6 lg4 xl3 d-flex)
         v-card.primary.dashboard-card.animated.fadeInUp(dark)
           v-card-text
@@ -49,7 +49,7 @@
             v-icon(:color='isLatestVersion ? `teal` : `red darken-4`', small) mdi-wrench
           v-card-text
             v-icon.dashboard-icon mdi-blur
-            .subheading Wiki.js {{info.currentVersion}}
+            .subtitle-1 Wiki.js {{info.currentVersion}}
             .body-2(v-if='isLatestVersion') {{$t('admin:dashboard.versionLatest')}}
             .body-2(v-else) {{$t('admin:dashboard.versionNew', { version: info.latestVersion })}}
       v-flex(xs12, xl6)

+ 3 - 3
client/components/admin/admin-dev-flags.vue

@@ -6,14 +6,14 @@
           img(src='/svg/icon-console.svg', alt='Developer Tools', style='width: 80px;')
           .admin-header-title
             .headline.primary--text Developer Tools
-            .subheading.grey--text Flags
+            .subtitle-1.grey--text Flags
           v-spacer
           v-btn(color='success', depressed, @click='save', large)
-            v-icon(left) check
+            v-icon(left) mdi-check
             span {{$t('common:actions.apply')}}
 
         v-card.mt-3.white.grey--text.text--darken-3
-          v-alert(color='red', value='true', icon='warning')
+          v-alert(color='red', value='true', icon='mdi-alert', dark, prominent)
             span Do NOT enable these flags unless you know what you're doing!
             .caption Doing so may result in data loss or broken installation!
           v-card-text

+ 1 - 1
client/components/admin/admin-dev-graphiql.vue

@@ -6,7 +6,7 @@
           img(src='/svg/icon-console.svg', alt='Developer Tools', style='width: 80px;')
           .admin-header-title
             .headline.primary--text Developer Tools
-            .subheading.grey--text GraphiQL
+            .subtitle-1.grey--text GraphiQL
 
         v-card.mt-3.white.grey--text.text--darken-3
           #graphiql

+ 1 - 1
client/components/admin/admin-dev-voyager.vue

@@ -6,7 +6,7 @@
           img(src='/svg/icon-console.svg', alt='Developer Tools', style='width: 80px;')
           .admin-header-title
             .headline.primary--text Developer Tools
-            .subheading.grey--text Voyager
+            .subtitle-1.grey--text Voyager
 
         v-card.mt-3.white.grey--text.text--darken-3
           #voyager

+ 1 - 1
client/components/admin/admin-editor.vue

@@ -6,7 +6,7 @@
           img(src='/svg/icon-web-design.svg', alt='Editor', style='width: 80px;')
           .admin-header-title
             .headline.primary--text Editor
-            .subheading.grey--text Configure the content editors #[v-chip(label, color='primary', small).white--text coming soon]
+            .subtitle-1.grey--text Configure the content editors #[v-chip(label, color='primary', small).white--text coming soon]
           v-spacer
           v-btn(outline, color='grey', @click='refresh', large)
             v-icon refresh

+ 5 - 5
client/components/admin/admin-general.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-categorize.svg', alt='General', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{ $t('admin:general.title') }}
-            .subheading.grey--text.animated.fadeInLeft {{ $t('admin:general.subtitle') }}
+            .subtitle-1.grey--text.animated.fadeInLeft {{ $t('admin:general.subtitle') }}
           v-spacer
           v-btn.animated.fadeInDown(color='success', depressed, @click='save', large)
             v-icon(left) mdi-check
@@ -18,7 +18,7 @@
                 v-card.animated.fadeInUp
                   v-toolbar(color='primary', dark, dense, flat)
                     v-toolbar-title.subtitle-1 {{ $t('admin:general.siteInfo') }}
-                  v-subheader {{$t('admin:general.general')}}
+                  .overline.grey--text.pa-4 {{$t('admin:general.general')}}
                   .px-3.pb-3
                     v-text-field(
                       outlined
@@ -41,7 +41,7 @@
                       persistent-hint
                       )
                   v-divider
-                  v-subheader {{$t('admin:general.logo')}} #[v-chip.ml-2(label, color='grey', small, outlined) coming soon]
+                  .overline.grey--text.pa-4 {{$t('admin:general.logo')}} #[v-chip.ml-2(label, color='grey', small, outlined) coming soon]
                   v-card-text.pb-4.pl-5
                     v-layout.px-3(row, align-center)
                       v-avatar(size='100', :color='$vuetify.dark ? `grey darken-2` : `grey lighten-3`', :tile='config.logoIsSquare')
@@ -55,7 +55,7 @@
                         .caption.mt-3.grey--text {{$t('admin:general.uploadSizeHint', { size: '120x120' })}}
                         .caption.grey--text {{$t('admin:general.uploadTypesHint', { typeList: 'SVG, PNG', lastType: 'JPG' })}}.
                   v-divider
-                  v-subheader {{$t('admin:general.footerCopyright')}}
+                  .overline.grey--text.pa-4 {{$t('admin:general.footerCopyright')}}
                   .px-3.pb-3
                     v-text-field(
                       outlined
@@ -67,7 +67,7 @@
                       :hint='$t(`admin:general.companyNameHint`)'
                       )
                   v-divider
-                  v-subheader SEO
+                  .overline.grey--text.pa-4 SEO
                   .px-3.pb-3
                     v-text-field(
                       outlined

+ 1 - 1
client/components/admin/admin-groups-edit.vue

@@ -6,7 +6,7 @@
           img(src='/svg/icon-social-group.svg', alt='Edit Group', style='width: 80px;')
           .admin-header-title
             .headline.blue--text.text--darken-2 Edit Group
-            .subheading.grey--text {{group.name}}
+            .subtitle-1.grey--text {{group.name}}
           v-spacer
           .caption.grey--text ID #[strong {{group.id}}]
           v-divider.mx-3(vertical)

+ 1 - 1
client/components/admin/admin-groups.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-people.svg', alt='Groups', style='width: 80px;')
           .admin-header-title
             .headline.blue--text.text--darken-2.animated.fadeInLeft Groups
-            .subheading.grey--text.animated.fadeInLeft.wait-p4s Manage groups and their permissions
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p4s Manage groups and their permissions
           v-spacer
           v-btn.animated.fadeInDown.wait-p2s.mr-3(color='grey', outlined, @click='refresh', large)
             v-icon mdi-refresh

+ 1 - 1
client/components/admin/admin-locale.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-globe-earth.svg', alt='Locale', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{ $t('admin:locale.title') }}
-            .subheading.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:locale.subtitle') }}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:locale.subtitle') }}
           v-spacer
           v-btn.animated.fadeInDown(color='success', depressed, @click='save', large, :loading='loading')
             v-icon(left) mdi-check

+ 3 - 6
client/components/admin/admin-logging.vue

@@ -6,12 +6,12 @@
           img(src='/svg/icon-registry-editor.svg', alt='Logging', style='width: 80px;')
           .admin-header-title
             .headline.primary--text Logging
-            .subheading.grey--text Configure the system logger(s) #[v-chip(label, color='primary', small).white--text coming soon]
+            .subtitle-1.grey--text Configure the system logger(s) #[v-chip(label, color='primary', small).white--text coming soon]
           v-spacer
           v-btn(outline, color='grey', @click='refresh', large)
             v-icon refresh
           v-btn(color='black', disabled, depressed, @click='toggleConsole', large)
-            ConsoleLineIcon.mr-3
+            v-icon check
             span Live Trail
           v-btn(color='success', @click='save', depressed, large)
             v-icon(left) check
@@ -113,12 +113,9 @@ import LoggingConsole from './admin-logging-console.vue'
 import loggersQuery from 'gql/admin/logging/logging-query-loggers.gql'
 import loggersSaveMutation from 'gql/admin/logging/logging-mutation-save-loggers.gql'
 
-import ConsoleLineIcon from 'mdi/ConsoleLine'
-
 export default {
   components: {
-    LoggingConsole,
-    ConsoleLineIcon
+    LoggingConsole
   },
   data() {
     return {

+ 30 - 31
client/components/admin/admin-mail.vue

@@ -6,28 +6,27 @@
           img.animated.fadeInUp(src='/svg/icon-new-post.svg', alt='Mail', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{ $t('admin:mail.title') }}
-            .subheading.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:mail.subtitle') }}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:mail.subtitle') }}
           v-spacer
           v-btn.animated.fadeInDown(color='success', depressed, @click='save', large)
-            v-icon(left) check
+            v-icon(left) mdi-check
             span {{$t('common:actions.apply')}}
         v-form.pt-3
           v-layout(row wrap)
             v-flex(lg6 xs12)
               v-form
-                v-card.wiki-form.animated.fadeInUp
+                v-card.animated.fadeInUp
                   v-toolbar(color='primary', dark, dense, flat)
-                    v-toolbar-title
-                      .subheading {{ $t('admin:mail.configuration') }}
-                  v-subheader {{ $t('admin:mail.sender') }}
-                  .px-3.pb-3
+                    v-toolbar-title.subtitle-1 {{ $t('admin:mail.configuration') }}
+                  .overline.pa-4.grey--text {{ $t('admin:mail.sender') }}
+                  .px-4
                     v-text-field(
                       outlined
                       v-model='config.senderName'
                       :label='$t(`admin:mail.senderName`)'
                       required
                       :counter='255'
-                      prepend-icon='person'
+                      prepend-icon='mdi-contact-mail'
                       )
                     v-text-field(
                       outlined
@@ -35,25 +34,25 @@
                       :label='$t(`admin:mail.senderEmail`)'
                       required
                       :counter='255'
-                      prepend-icon='email'
+                      prepend-icon='mdi-at'
                       )
                   v-divider
-                  v-subheader {{ $t('admin:mail.smtp') }}
-                  .px-3.pb-3
+                  .overline.pa-4.grey--text {{ $t('admin:mail.smtp') }}
+                  .px-4
                     v-text-field(
                       outlined
                       v-model='config.host'
                       :label='$t(`admin:mail.smtpHost`)'
                       required
                       :counter='255'
-                      prepend-icon='memory'
+                      prepend-icon='mdi-memory'
                       )
                     v-text-field(
                       outlined
                       v-model='config.port'
                       :label='$t(`admin:mail.smtpPort`)'
                       required
-                      prepend-icon='router'
+                      prepend-icon='mdi-serial-port'
                       persistent-hint
                       :hint='$t(`admin:mail.smtpPortHint`)'
                       style='max-width: 300px;'
@@ -64,7 +63,7 @@
                       color='primary'
                       persistent-hint
                       :hint='$t(`admin:mail.smtpTLSHint`)'
-                      prepend-icon='vpn_lock'
+                      prepend-icon='mdi-security-network'
                       )
                     v-text-field.mt-3(
                       outlined
@@ -72,37 +71,36 @@
                       :label='$t(`admin:mail.smtpUser`)'
                       required
                       :counter='255'
-                      prepend-icon='lock_outline'
+                      prepend-icon='mdi-shield-account-outline'
                       )
                     v-text-field(
                       outlined
                       v-model='config.pass'
                       :label='$t(`admin:mail.smtpPwd`)'
                       required
-                      prepend-icon='lock'
+                      prepend-icon='mdi-textbox-password'
                       type='password'
                       )
 
             v-flex(lg6 xs12)
-              v-card.wiki-form.animated.fadeInUp.wait-p2s
+              v-card.animated.fadeInUp.wait-p2s
                 v-form
                   v-toolbar(color='primary', dark, dense, flat)
-                    v-toolbar-title
-                      .subheading {{ $t('admin:mail.dkim') }}
-                  .pa-3
+                    v-toolbar-title.subtitle-1 {{ $t('admin:mail.dkim') }}
+                  .pa-4
                     .body-2.grey--text.text--darken-2 {{ $t('admin:mail.dkimHint') }}
                     v-switch(
                       v-model='config.useDKIM'
                       :label='$t(`admin:mail.dkimUse`)'
                       color='primary'
-                      prepend-icon='vpn_key'
+                      prepend-icon='mdi-key'
                       )
                     v-text-field(
                       outlined
                       v-model='config.dkimDomainName'
                       :label='$t(`admin:mail.dkimDomainName`)'
                       :counter='255'
-                      prepend-icon='vpn_key'
+                      prepend-icon='mdi-key'
                       :disabled='!config.useDKIM'
                       )
                     v-text-field(
@@ -110,37 +108,38 @@
                       v-model='config.dkimKeySelector'
                       :label='$t(`admin:mail.dkimKeySelector`)'
                       :counter='255'
-                      prepend-icon='vpn_key'
+                      prepend-icon='mdi-key'
                       :disabled='!config.useDKIM'
                       )
-                    v-text-field(
+                    v-textarea(
                       outlined
                       v-model='config.dkimPrivateKey'
                       :label='$t(`admin:mail.dkimPrivateKey`)'
-                      prepend-icon='vpn_key'
+                      prepend-icon='mdi-key'
                       persistent-hint
                       :hint='$t(`admin:mail.dkimPrivateKeyHint`)'
                       :disabled='!config.useDKIM'
                       )
 
-              v-card.mt-3.wiki-form.animated.fadeInUp.wait-p3s
+              v-card.mt-3.animated.fadeInUp.wait-p3s
                 v-form
                   v-toolbar(color='teal', dark, dense, flat)
-                    v-toolbar-title
-                      .subheading {{ $t('admin:mail.test') }}
-                  .pa-3
+                    v-toolbar-title.subtitle-1 {{ $t('admin:mail.test') }}
+                  .pa-4
                     .body-2.grey--text.text--darken-2 {{ $t('admin:mail.testHint') }}
                     v-text-field.mt-3(
                       outlined
                       v-model='testEmail'
                       :label='$t(`admin:mail.testRecipient`)'
                       :counter='255'
-                      prepend-icon='mail'
+                      prepend-icon='mdi-email-outline'
                       :disabled='testLoading'
                       )
                   v-card-chin
                     v-spacer
-                    v-btn(color='teal', dark, @click='sendTest', :loading='testLoading') {{ $t('admin:mail.testSend') }}
+                    v-btn.px-4(color='teal', dark, @click='sendTest', :loading='testLoading')
+                      v-icon(left) mdi-send
+                      span {{ $t('admin:mail.testSend') }}
 
 </template>
 

+ 2 - 2
client/components/admin/admin-navigation.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-triangle-arrow.svg', alt='Navigation', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{$t('navigation.title')}}
-            .subheading.grey--text.animated.fadeInLeft.wait-p4s {{$t('navigation.subtitle')}}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p4s {{$t('navigation.subtitle')}}
           v-spacer
           v-btn.animated.fadeInDown.wait-p2s.mr-3(outlined, color='grey', @click='refresh', large)
             v-icon mdi-refresh
@@ -123,7 +123,7 @@
                     span {{$t('navigation.delete', { kind: $t('navigation.link') })}}
               v-card(v-else-if='current.kind === "header"')
                 v-toolbar(dense, color='blue', flat, dark)
-                  .subheading {{$t('navigation.edit', { kind: $t('navigation.header') })}}
+                  .subtitle-1 {{$t('navigation.edit', { kind: $t('navigation.header') })}}
                 v-card-text
                   v-text-field(
                     outlined

+ 1 - 1
client/components/admin/admin-pages-edit.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-view-details.svg', alt='Edit Page', style='width: 80px;')
           .admin-header-title
             .headline.blue--text.text--darken-2.animated.fadeInLeft Page Details
-            .subheading.grey--text.animated.fadeInLeft.wait-p2s
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p2s
               v-chip.ml-0.mr-2(label, small).caption ID {{page.id}}
               span /{{page.locale}}/{{page.path}}
           v-spacer

+ 1 - 1
client/components/admin/admin-pages.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-file.svg', alt='Page', style='width: 80px;')
           .admin-header-title
             .headline.blue--text.text--darken-2.animated.fadeInLeft Pages
-            .subheading.grey--text.animated.fadeInLeft.wait-p2s Manage pages
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p2s Manage pages
           v-spacer
           v-btn.animated.fadeInDown.wait-p1s(color='grey', outlined, @click='refresh', large)
             v-icon.grey--text mdi-refresh

+ 3 - 3
client/components/admin/admin-rendering.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-process.svg', alt='Rendering', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft Rendering
-            .subheading.grey--text.animated.fadeInLeft.wait-p4s Configure how content is rendered #[v-chip(label, color='primary', small).white--text coming soon]
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p4s Configure how content is rendered #[v-chip(label, color='primary', small).white--text coming soon]
           v-spacer
           v-btn.animated.fadeInDown.wait-p2s(outline, color='grey', @click='refresh', large)
             v-icon refresh
@@ -22,7 +22,7 @@
           dark
           )
           v-icon.mr-2 line_weight
-          .subheading Pipeline
+          .subtitle-1 Pipeline
         v-expansion-panel.adm-rendering-pipeline(v-model='selectedCore')
           v-expansion-panel-content(
             hide-actions
@@ -68,7 +68,7 @@
             dense
             )
             v-icon.mr-2 {{currentRenderer.icon}}
-            .subheading {{currentRenderer.title}}
+            .subtitle-1 {{currentRenderer.title}}
             v-spacer
             .pt-3.mt-1
               v-switch(

+ 3 - 3
client/components/admin/admin-search.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-search.svg', alt='Search Engine', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{$t('admin:search.title')}}
-            .subheading.grey--text.animated.fadeInLeft.wait-p2s {{$t('admin:search.subtitle')}}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p2s {{$t('admin:search.subtitle')}}
           v-spacer
           v-btn.animated.fadeInDown.wait-p2s(outline, color='grey', @click='refresh', large)
             v-icon refresh
@@ -20,7 +20,7 @@
       v-flex(lg3, xs12)
         v-card.animated.fadeInUp
           v-toolbar(flat, color='primary', dark, dense)
-            .subheading {{$t('admin:search.searchEngine')}}
+            .subtitle-1 {{$t('admin:search.searchEngine')}}
           v-list.py-0(two-line, dense)
             template(v-for='(eng, idx) in engines')
               v-list-item(:key='eng.key', @click='selectedEngine = eng.key', :disabled='!eng.isAvailable')
@@ -38,7 +38,7 @@
       v-flex(lg9, xs12)
         v-card.wiki-form.animated.fadeInUp.wait-p2s
           v-toolbar(color='primary', dense, flat, dark)
-            .subheading {{engine.title}}
+            .subtitle-1 {{engine.title}}
           v-card-text
             .enginelogo
               img(:src='engine.logo', :alt='engine.title')

+ 1 - 1
client/components/admin/admin-stats.vue

@@ -4,7 +4,7 @@
       v-flex(xs12)
         .admin-header-icon: v-icon(size='80', color='grey lighten-2') show_chart
         .headline.primary--text Statistics
-        .subheading.grey--text Useful information about your wiki
+        .subtitle-1.grey--text Useful information about your wiki
         .pa-3
           fingerprint-spinner(
             :animation-duration='1500'

+ 5 - 5
client/components/admin/admin-storage.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-cloud-storage.svg', alt='Storage', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{$t('admin:storage.title')}}
-            .subheading.grey--text.animated.fadeInLeft.wait-p4s {{$t('admin:storage.subtitle')}}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p4s {{$t('admin:storage.subtitle')}}
           v-spacer
           v-btn.animated.fadeInDown.wait-p2s(outline, color='grey', @click='refresh', large)
             v-icon refresh
@@ -17,7 +17,7 @@
       v-flex(lg3, xs12)
         v-card.animated.fadeInUp
           v-toolbar(flat, color='primary', dark, dense)
-            .subheading {{$t('admin:storage.targets')}}
+            .subtitle-1 {{$t('admin:storage.targets')}}
           v-list(two-line, dense).py-0
             template(v-for='(tgt, idx) in targets')
               v-list-item(:key='tgt.key', @click='selectedTarget = tgt.key', :disabled='!tgt.isAvailable')
@@ -34,7 +34,7 @@
 
         v-card.mt-3.animated.fadeInUp.wait-p2s
           v-toolbar(flat, :color='$vuetify.dark ? `grey darken-3-l5` : `grey darken-3`', dark, dense)
-            .subheading {{$t('admin:storage.status')}}
+            .subtitle-1 {{$t('admin:storage.status')}}
             v-spacer
             looping-rhombuses-spinner(
               :animation-duration='5000'
@@ -79,7 +79,7 @@
       v-flex(xs12, lg9)
         v-card.wiki-form.animated.fadeInUp.wait-p2s
           v-toolbar(color='primary', dense, flat, dark)
-            .subheading {{target.title}}
+            .subtitle-1 {{target.title}}
           v-card-text
             v-form
               .targetlogo
@@ -188,7 +188,7 @@
                     v-flex(xs12, lg6, xl4, v-for='act of target.actions', :key='act.handler')
                       v-card.radius-7.grey(flat, :class='$vuetify.dark ? `darken-3-d5` : `lighten-3`', height='100%')
                         v-card-text
-                          .subheading(v-html='act.label')
+                          .subtitle-1(v-html='act.label')
                           .body-1.mt-2(v-html='act.hint')
                           v-btn.mx-0.mt-3(
                             @click='executeAction(target.key, act.handler)'

+ 38 - 41
client/components/admin/admin-system.vue

@@ -6,107 +6,100 @@
           img.animated.fadeInUp(src='/svg/icon-tune.svg', alt='System Info', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{ $t('admin:system.title') }}
-            .subheading.grey--text.animated.fadeInLeft.wait-p2s {{ $t('admin:system.subtitle') }}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p2s {{ $t('admin:system.subtitle') }}
         v-layout.mt-3(row wrap)
           v-flex(lg6 xs12)
             v-card.animated.fadeInUp
-              v-btn.animated.fadeInLeft.wait-p2s.btn-animate-rotate(fab, absolute, right, top, small, light, @click='refresh'): v-icon refresh
+              v-btn.animated.fadeInLeft.wait-p2s.btn-animate-rotate(fab, absolute, right, top, small, light, @click='refresh'): v-icon(color='grey') mdi-refresh
+              v-subheader Wiki.js
               v-list(two-line, dense)
-                v-subheader Wiki.js
                 v-list-item(avatar)
                   v-list-item-avatar
-                    v-icon.blue.white--text system_update_alt
+                    v-icon.blue.white--text mdi-application-export
                   v-list-item-content
                     v-list-item-title {{ $t('admin:system.currentVersion') }}
-                    v-list-item-sub-title {{ info.currentVersion }}
+                    v-list-item-subtitle {{ info.currentVersion }}
                 v-list-item(avatar)
                   v-list-item-avatar
-                    v-icon.blue.white--text open_in_browser
+                    v-icon.blue.white--text mdi-inbox-arrow-up
                   v-list-item-content
                     v-list-item-title {{ $t('admin:system.latestVersion') }}
-                    v-list-item-sub-title {{ info.latestVersion }}
+                    v-list-item-subtitle {{ info.latestVersion }}
                   v-list-item-action
                     v-list-item-action-text {{ $t('admin:system.published') }} {{ info.latestVersionReleaseDate | moment('from') }}
 
-                v-divider.mt-3
-
-                v-subheader {{ $t('admin:system.hostInfo') }}
+              v-divider.mt-3
+              v-subheader {{ $t('admin:system.hostInfo') }}
+              v-list(two-line, dense)
                 v-list-item(avatar)
                   v-list-item-avatar
                     v-avatar.blue-grey(size='40')
-                      img(:src='`/svg/icon-` + platformLogo + `-logo.svg`', alt='Platform', style='width: 24px;')
+                      v-icon(color='white') {{platformLogo}}
                   v-list-item-content
                     v-list-item-title {{ $t('admin:system.os') }}
-                    v-list-item-sub-title {{ (info.platform === 'docker') ? 'Docker Container (Linux)' : info.operatingSystem }}
+                    v-list-item-subtitle {{ (info.platform === 'docker') ? 'Docker Container (Linux)' : info.operatingSystem }}
                 v-list-item(avatar)
                   v-list-item-avatar
-                    v-icon.blue-grey.white--text computer
+                    v-icon.blue-grey.white--text mdi-desktop-classic
                   v-list-item-content
                     v-list-item-title {{ $t('admin:system.hostname') }}
-                    v-list-item-sub-title {{ info.hostname }}
+                    v-list-item-subtitle {{ info.hostname }}
                 v-list-item(avatar)
                   v-list-item-avatar
-                    v-icon.blue-grey.white--text nfc
+                    v-icon.blue-grey.white--text mdi-cpu-64-bit
                   v-list-item-content
                     v-list-item-title {{ $t('admin:system.cpuCores') }}
-                    v-list-item-sub-title {{ info.cpuCores }}
+                    v-list-item-subtitle {{ info.cpuCores }}
                 v-list-item(avatar)
                   v-list-item-avatar
-                    v-icon.blue-grey.white--text memory
+                    v-icon.blue-grey.white--text mdi-memory
                   v-list-item-content
                     v-list-item-title {{ $t('admin:system.totalRAM') }}
-                    v-list-item-sub-title {{ info.ramTotal }}
+                    v-list-item-subtitle {{ info.ramTotal }}
                 v-list-item(avatar)
                   v-list-item-avatar
-                    v-icon.blue-grey.white--text last_page
+                    v-icon.blue-grey.white--text mdi-iframe-outline
                   v-list-item-content
                     v-list-item-title {{ $t('admin:system.workingDirectory') }}
-                    v-list-item-sub-title {{ info.workingDirectory }}
+                    v-list-item-subtitle {{ info.workingDirectory }}
                 v-list-item(avatar)
                   v-list-item-avatar
-                    v-icon.blue-grey.white--text settings
+                    v-icon.blue-grey.white--text mdi-card-bulleted-settings-outline
                   v-list-item-content
                     v-list-item-title {{ $t('admin:system.configFile') }}
-                    v-list-item-sub-title {{ info.configFile }}
+                    v-list-item-subtitle {{ info.configFile }}
 
           v-flex(lg6 xs12)
             v-card.pb-3.animated.fadeInUp.wait-p4s
+              v-subheader Node.js
               v-list(dense)
-                v-subheader Node.js
                 v-list-item(avatar)
                   v-list-item-avatar
                     v-avatar.light-green(size='40')
-                      icon-node-js(fillColor='#FFFFFF')
+                      v-icon(color='white') mdi-nodejs
                   v-list-item-content
                     v-list-item-title {{ info.nodeVersion }}
 
-                v-divider.mt-3
-
-                v-subheader {{ info.dbType }}
+              v-divider.mt-3
+              v-subheader {{ info.dbType }}
+              v-list(dense)
                 v-list-item(avatar)
                   v-list-item-avatar
                     v-avatar.indigo.darken-1(size='40')
-                      icon-database(fillColor='#FFFFFF')
+                      v-icon(color='white') mdi-database
                   v-list-item-content
                     v-list-item-title(v-html='dbVersion')
-                    v-list-item-sub-title {{ info.dbHost }}
+                    v-list-item-subtitle {{ info.dbHost }}
 
-                v-alert.mt-3(:value='isDbLimited', color='deep-orange', icon='warning') {{ $t('admin:system.dbPartialSupport') }}
+                v-alert.mt-3.mx-4(:value='isDbLimited', color='deep-orange darken-2', icon='mdi-alert', dark) {{ $t('admin:system.dbPartialSupport') }}
 </template>
 
 <script>
 import _ from 'lodash'
 
-import IconDatabase from 'mdi/Database'
-import IconNodeJs from 'mdi/Nodejs'
-
 import systemInfoQuery from 'gql/admin/system/system-query-info.gql'
 
 export default {
-  components: {
-    IconDatabase,
-    IconNodeJs
-  },
   data() {
     return {
       info: {}
@@ -119,13 +112,17 @@ export default {
     platformLogo() {
       switch (this.info.platform) {
         case 'docker':
-          return 'docker'
+          return 'mdi-docker'
         case 'darwin':
-          return 'apple'
+          return 'mdi-apple'
         case 'linux':
-          return 'linux'
+          if (this.info.operatingSystem.indexOf('Ubuntu')) {
+            return 'mdi-ubuntu'
+          } else {
+            return 'mdi-linux'
+          }
         case 'win32':
-          return 'windows'
+          return 'mdi-windows'
         default:
           return ''
       }

+ 1 - 1
client/components/admin/admin-theme.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-paint-palette.svg', alt='Theme', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{$t('admin:theme.title')}}
-            .subheading.grey--text.animated.fadeInLeft.wait-p2s {{$t('admin:theme.subtitle')}}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p2s {{$t('admin:theme.subtitle')}}
           v-spacer
           v-btn.animated.fadeInRight(color='success', depressed, @click='save', large, :loading='loading')
             v-icon(left) mdi-check

+ 1 - 1
client/components/admin/admin-users-edit.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-male-user.svg', alt='Edit User', style='width: 80px;')
           .admin-header-title
             .headline.blue--text.text--darken-2.animated.fadeInLeft Edit User
-            .subheading.grey--text.animated.fadeInLeft.wait-p2s {{user.name}}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p2s {{user.name}}
           v-spacer
           .caption.grey--text.animated.fadeInRight.wait-p5s ID #[strong {{user.id}}]
           v-divider.animated.fadeInRight.wait-p3s.mx-3(vertical)

+ 1 - 1
client/components/admin/admin-users.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-customer.svg', alt='Users', style='width: 80px;')
           .admin-header-title
             .headline.blue--text.text--darken-2.animated.fadeInLeft Users
-            .subheading.grey--text.animated.fadeInLeft.wait-p2s Manage users
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p2s Manage users
           v-spacer
           v-btn.animated.fadeInDown.wait-p2s.mr-3(outlined, color='grey', large, @click='refresh')
             v-icon mdi-refresh

+ 11 - 11
client/components/admin/admin-utilities-auth.vue

@@ -1,19 +1,19 @@
 <template lang='pug'>
   v-card
     v-toolbar(flat, color='primary', dark, dense)
-      .subheading {{ $t('admin:utilities.authTitle') }}
+      .subtitle-1 {{ $t('admin:utilities.authTitle') }}
     v-card-text
-      v-subheader.pl-0.primary--text Generate New Authentication Public / Private Key Certificates
-      .body-1 This will invalidate all current session tokens and cause all users to be logged out.
-      .body-1.red--text You will need to log back in after the operation.
-      v-btn(outline, color='primary', @click='regenCerts', :disabled='loading').ml-0.mt-3
-        v-icon(left) build
+      .subtitle-1.pb-3.primary--text Generate New Authentication Public / Private Key Certificates
+      .body-2 This will invalidate all current session tokens and cause all users to be logged out.
+      .body-2.red--text You will need to log back in after the operation.
+      v-btn(outlined, color='primary', @click='regenCerts', :disabled='loading').ml-0.mt-3
+        v-icon(left) mdi-gesture-double-tap
         span Proceed
-      v-divider.my-3
-      v-subheader.pl-0.primary--text Reset Guest User
-      .body-1 This will reset the guest user to its default parameters and permissions.
-      v-btn(outline, color='primary', @click='resetGuest', :disabled='loading').ml-0.mt-3
-        v-icon(left) build
+      v-divider.my-5
+      .subtitle-1.pb-3.primary--text Reset Guest User
+      .body-2 This will reset the guest user to its default parameters and permissions.
+      v-btn(outlined, color='primary', @click='resetGuest', :disabled='loading').ml-0.mt-3
+        v-icon(left) mdi-gesture-double-tap
         span Proceed
 </template>
 

+ 17 - 17
client/components/admin/admin-utilities-cache.vue

@@ -1,26 +1,26 @@
 <template lang='pug'>
   v-card
     v-toolbar(flat, color='primary', dark, dense)
-      .subheading {{ $t('admin:utilities.cacheTitle') }}
+      .subtitle-1 {{ $t('admin:utilities.cacheTitle') }}
     v-card-text
-      v-subheader.pl-0.primary--text Flush Pages and Assets Cache
-      .body-1 Pages and Assets are cached to disk for better performance. You can flush the cache to force all content to be fetched from the DB again.
-      v-btn(outline, color='primary', @click='flushCache', :disabled='loading').ml-0.mt-3
-        v-icon(left) build
+      .subtitle-1.pb-3.primary--text Flush Pages and Assets Cache
+      .body-2 Pages and Assets are cached to disk for better performance. You can flush the cache to force all content to be fetched from the DB again.
+      v-btn(outlined, color='primary', @click='flushCache', :disabled='loading').ml-0.mt-3
+        v-icon(left) mdi-gesture-double-tap
         span Proceed
-      v-divider.my-3
-      v-subheader.pl-0.primary--text Flush Temporary Uploads
-      .body-1 New uploads are temporarily saved to disk while they are being processed. They are automatically deleted after processing, but you can force an immediate cleanup using this tool.
-      .body-1.red--text Note that performing this action while an upload is in progress can result in a failed upload.
-      v-btn(outline, color='primary', @click='flushUploads', :disabled='loading').ml-0.mt-3
-        v-icon(left) build
+      v-divider.my-5
+      .subtitle-1.pb-3.primary--text Flush Temporary Uploads
+      .body-2 New uploads are temporarily saved to disk while they are being processed. They are automatically deleted after processing, but you can force an immediate cleanup using this tool.
+      .body-2.red--text Note that performing this action while an upload is in progress can result in a failed upload.
+      v-btn(outlined, color='primary', @click='flushUploads', :disabled='loading').ml-0.mt-3
+        v-icon(left) mdi-gesture-double-tap
         span Proceed
-      v-divider.my-3
-      v-subheader.pl-0.primary--text Flush Client-Side Locale Cache
-      .body-1 Locale strings are cached in the browser local storage for 24h. You can delete your current cache in order to fetch the latest data during the next page load.
-      .body-1 Note that this affects only #[strong your own browser] and not everyone.
-      v-btn(outline, color='primary', @click='flushClientLocaleCache', :disabled='loading').ml-0.mt-3
-        v-icon(left) build
+      v-divider.my-5
+      .subtitle-1.pb-3.primary--text Flush Client-Side Locale Cache
+      .body-2 Locale strings are cached in the browser local storage for 24h. You can delete your current cache in order to fetch the latest data during the next page load.
+      .body-2 Note that this affects only #[strong your own browser] and not everyone.
+      v-btn(outlined, color='primary', @click='flushClientLocaleCache', :disabled='loading').ml-0.mt-3
+        v-icon(left) mdi-gesture-double-tap
         span Proceed
 </template>
 

+ 9 - 9
client/components/admin/admin-utilities-content.vue

@@ -1,12 +1,12 @@
 <template lang='pug'>
   v-card
     v-toolbar(flat, color='primary', dark, dense)
-      .subheading {{ $t('admin:utilities.contentTitle') }}
+      .subtitle-1 {{ $t('admin:utilities.contentTitle') }}
     v-card-text
-      v-subheader.pl-0.primary--text Migrate all pages to target locale
-      .body-1 If you created content before selecting a different locale and activating the namespacing capabilities, you may want to transfer all content to the base locale.
-      .body-1.red--text: strong This operation is destructive and cannot be reversed! Make sure you have proper backups!
-      v-toolbar.radius-7.mt-3.wiki-form(flat, color='grey lighten-4', height='80')
+      .subtitle-1.pb-3.pl-0.primary--text Migrate all pages to target locale
+      .body-2 If you created content before selecting a different locale and activating the namespacing capabilities, you may want to transfer all content to the base locale.
+      .body-2.red--text: strong This operation is destructive and cannot be reversed! Make sure you have proper backups!
+      v-toolbar.mt-5(flat, color='grey lighten-4', height='80')
         v-select(
           label='Source Locale'
           outlined
@@ -16,7 +16,7 @@
           item-value='code'
           v-model='sourceLocale'
         )
-        v-icon.mx-3(large) arrow_forward
+        v-icon.mx-3(large) mdi-chevron-right-box-outline
         v-select(
           label='Target Locale'
           outlined
@@ -26,9 +26,9 @@
           item-value='code'
           v-model='targetLocale'
         )
-      .body-1.mt-3 Pages that are already in the target locale will not be touched. If a page already exists at the target, the source page will not be modified as it would create a conflict. If you want to overwrite the target page, you must first delete it.
-      v-btn(outline, color='primary', @click='migrateToLocale', :disabled='loading').ml-0.mt-3
-        v-icon(left) build
+      .body-2.mt-5 Pages that are already in the target locale will not be touched. If a page already exists at the target, the source page will not be modified as it would create a conflict. If you want to overwrite the target page, you must first delete it.
+      v-btn(outlined, color='primary', @click='migrateToLocale', :disabled='loading').ml-0.mt-3
+        v-icon(left) mdi-gesture-double-tap
         span Proceed
 </template>
 

+ 1 - 1
client/components/admin/admin-utilities-importv1.vue

@@ -1,7 +1,7 @@
 <template lang='pug'>
   v-card.wiki-form
     v-toolbar(flat, color='primary', dark, dense)
-      .subheading {{ $t('admin:utilities.importv1Title') }}
+      .subtitle-1 {{ $t('admin:utilities.importv1Title') }}
     v-card-text
       .text-xs-center
         img.animated.fadeInUp.wait-p1s(src='/svg/icon-software.svg')

+ 40 - 39
client/components/admin/admin-utilities-telemetry.vue

@@ -1,54 +1,54 @@
 <template lang='pug'>
   v-card
     v-toolbar(flat, color='primary', dark, dense)
-      .subheading {{ $t('admin:utilities.telemetryTitle') }}
+      .subtitle-1 {{ $t('admin:utilities.telemetryTitle') }}
     v-form
       v-card-text
-        v-subheader What is telemetry?
-        .body-1.pl-3 Telemetry allows the developers of Wiki.js to improve the software by collecting basic anonymized data about its usage and the host info. #[br] This is entirely optional and #[strong absolutely no] private data (such as content or personal data) is collected.
-        .body-1.pt-3.pl-3 For maximum privacy, a random client ID is generated during setup. This ID is used to group requests together while keeping complete anonymity. You can reset and generate a new one below at any time.
-        v-divider.my-3
-        v-subheader What is collected?
-        .body-1.pl-3 When telemetry is enabled, only the following data is transmitted:
+        .subtitle-2 What is telemetry?
+        .body-2.mt-3 Telemetry allows the developers of Wiki.js to improve the software by collecting basic anonymized data about its usage and the host info. #[br] This is entirely optional and #[strong absolutely no] private data (such as content or personal data) is collected.
+        .body-2.mt-3 For maximum privacy, a random client ID is generated during setup. This ID is used to group requests together while keeping complete anonymity. You can reset and generate a new one below at any time.
+        v-divider.my-4
+        .subtitle-2 What is collected?
+        .body-2.mt-3 When telemetry is enabled, only the following data is transmitted:
         v-list
           v-list-item
-            v-list-item-avatar: v-icon info_outline
+            v-list-item-avatar: v-icon mdi-information-outline
             v-list-item-content
-              v-list-item-title.body-1 Version of Wiki.js installed
-              v-list-item-sub-title.caption: em e.g. v2.0.123
+              v-list-item-title.body-2 Version of Wiki.js installed
+              v-list-item-subtitle.caption: em e.g. v2.0.123
           v-list-item
-            v-list-item-avatar: v-icon info_outline
+            v-list-item-avatar: v-icon mdi-information-outline
             v-list-item-content
-              v-list-item-title.body-1 Basic OS information
-              v-list-item-sub-title.caption: em Platform (Linux, macOS or Windows), Total CPU cores and DB type (PostgreSQL, MySQL, MariaDB, SQLite or SQL Server)
+              v-list-item-title.body-2 Basic OS information
+              v-list-item-subtitle.caption: em Platform (Linux, macOS or Windows), Total CPU cores and DB type (PostgreSQL, MySQL, MariaDB, SQLite or SQL Server)
           v-list-item
-            v-list-item-avatar: v-icon info_outline
+            v-list-item-avatar: v-icon mdi-information-outline
             v-list-item-content
-              v-list-item-title.body-1 Crash debug data
-              v-list-item-sub-title.caption: em Stack trace of the error
+              v-list-item-title.body-2 Crash debug data
+              v-list-item-subtitle.caption: em Stack trace of the error
           v-list-item
-            v-list-item-avatar: v-icon info_outline
+            v-list-item-avatar: v-icon mdi-information-outline
             v-list-item-content
-              v-list-item-title.body-1 Setup analytics
-              v-list-item-sub-title.caption: em Installation checkpoint reached
-        .body-1.pl-3 Note that crash debug data is stored for a maximum of 30 days while analytics are stored for a maximum of 16 months, after which it is permanently deleted.
-        v-divider.my-3
-        v-subheader What is it used for?
-        .body-1.pl-3 Telemetry is used by developers to improve Wiki.js, mostly for the following reasons:
+              v-list-item-title.body-2 Setup analytics
+              v-list-item-subtitle.caption: em Installation checkpoint reached
+        .body-2 Note that crash debug data is stored for a maximum of 30 days while analytics are stored for a maximum of 16 months, after which it is permanently deleted.
+        v-divider.my-4
+        .subtitle-2 What is it used for?
+        .body-2.mt-3 Telemetry is used by developers to improve Wiki.js, mostly for the following reasons:
         v-list(dense)
           v-list-item
-            v-list-item-avatar: v-icon chevron_right
-            v-list-item-content: v-list-item-title.body-1 Identify critical bugs more easily and fix them in a timely manner.
+            v-list-item-avatar: v-icon mdi-chevron-right
+            v-list-item-content: v-list-item-title: .body-2 Identify critical bugs more easily and fix them in a timely manner.
           v-list-item
-            v-list-item-avatar: v-icon chevron_right
-            v-list-item-content: v-list-item-title.body-1 Understand the upgrade rate of current installations.
+            v-list-item-avatar: v-icon mdi-chevron-right
+            v-list-item-content: v-list-item-title: .body-2 Understand the upgrade rate of current installations.
           v-list-item
-            v-list-item-avatar: v-icon chevron_right
-            v-list-item-content: v-list-item-title.body-1  Optimize performance and testing scenarios based on most popular environments.
-        .body-1.pl-3 Only authorized developers have access to the data. It is not shared to any 3rd party nor is it used for any other application than improving Wiki.js.
-        v-divider.my-3
-        v-subheader Settings
-        .pl-3
+            v-list-item-avatar: v-icon mdi-chevron-right
+            v-list-item-content: v-list-item-title: .body-2  Optimize performance and testing scenarios based on most popular environments.
+        .body-2 Only authorized developers have access to the data. It is not shared to any 3rd party nor is it used for any other application than improving Wiki.js.
+        v-divider.my-4
+        .subtitle-2 Settings
+        .mt-3
           v-switch.mt-0(
             v-model='telemetry',
             label='Enable Telemetry',
@@ -56,15 +56,16 @@
             hint='Allow Wiki.js to transmit telemetry data.',
             persistent-hint
           )
-          .subheading.mt-3.grey--text.text--darken-1 Client ID
-          .body-1 {{clientId}}
+        v-divider.my-4
+        .subtitle-2.mt-3.grey--text.text--darken-1 Client ID
+        .body-2.mt-2 {{clientId}}
       v-card-chin
-        v-btn(depressed, color='success', @click='updateTelemetry')
-          v-icon(left) chevron_right
+        v-btn.px-3(depressed, color='success', @click='updateTelemetry')
+          v-icon(left) mdi-chevron-right
           | Save Changes
         v-spacer
-        v-btn(outline, color='grey', @click='resetClientId')
-          v-icon(left) autorenew
+        v-btn.px-3(outlined, color='grey', @click='resetClientId')
+          v-icon(left) mdi-autorenew
           span Reset Client ID
 
 </template>

+ 10 - 10
client/components/admin/admin-utilities.vue

@@ -6,12 +6,12 @@
           img(src='/svg/icon-maintenance.svg', alt='Utilities', style='width: 80px;')
           .admin-header-title
             .headline.primary--text {{$t('admin:utilities.title')}}
-            .subheading.grey--text {{$t('admin:utilities.subtitle')}}
+            .subtitle-1.grey--text {{$t('admin:utilities.subtitle')}}
 
       v-flex(lg3, xs12)
         v-card.animated.fadeInUp
           v-toolbar(flat, color='primary', dark, dense)
-            .subheading {{$t('admin:utilities.tools')}}
+            .subtitle-1 {{$t('admin:utilities.tools')}}
           v-list(two-line, dense).py-0
             template(v-for='(tool, idx) in tools')
               v-list-item(:key='tool.key', @click='selectedTool = tool.key', :disabled='!tool.isAvailable')
@@ -19,9 +19,9 @@
                   v-icon(:color='!tool.isAvailable ? `grey lighten-1` : (selectedTool === tool.key ? `blue ` : `grey darken-1`)') {{ tool.icon }}
                 v-list-item-content
                   v-list-item-title.body-2(:class='!tool.isAvailable ? `grey--text` : (selectedTool === tool.key ? `primary--text` : ``)') {{ $t('admin:utilities.' + tool.i18nKey + 'Title') }}
-                  v-list-item-sub-title.caption(:class='!tool.isAvailable ? `grey--text text--lighten-1` : (selectedTool === tool.key ? `blue--text ` : ``)') {{ $t('admin:utilities.' + tool.i18nKey + 'Subtitle') }}
+                  v-list-item-subtitle: .caption(:class='!tool.isAvailable ? `grey--text text--lighten-1` : (selectedTool === tool.key ? `blue--text ` : ``)') {{ $t('admin:utilities.' + tool.i18nKey + 'Subtitle') }}
                 v-list-item-avatar(v-if='selectedTool === tool.key')
-                  v-icon.animated.fadeInLeft(color='primary') arrow_forward_ios
+                  v-icon.animated.fadeInLeft(color='primary', large) mdi-chevron-right
               v-divider(v-if='idx < tools.length - 1')
 
       v-flex.animated.fadeInUp.wait-p2s(xs12, lg9)
@@ -46,37 +46,37 @@ export default {
       tools: [
         {
           key: 'UtilityAuth',
-          icon: 'lock_outline',
+          icon: 'mdi-lock-open-outline',
           i18nKey: 'auth',
           isAvailable: true
         },
         {
           key: 'UtilityContent',
-          icon: 'insert_drive_file',
+          icon: 'mdi-content-duplicate',
           i18nKey: 'content',
           isAvailable: true
         },
         {
           key: 'UtilityCache',
-          icon: 'invert_colors',
+          icon: 'mdi-database-refresh',
           i18nKey: 'cache',
           isAvailable: true
         },
         {
           key: 'UtilityGraphEndpoint',
-          icon: 'settings_ethernet',
+          icon: 'mdi-graphql',
           i18nKey: 'graphEndpoint',
           isAvailable: false
         },
         {
           key: 'UtilityImportv1',
-          icon: 'present_to_all',
+          icon: 'mdi-database-import',
           i18nKey: 'importv1',
           isAvailable: false
         },
         {
           key: 'UtilityTelemetry',
-          icon: 'wifi_tethering',
+          icon: 'mdi-math-compass',
           i18nKey: 'telemetry',
           isAvailable: true
         }

+ 4 - 4
client/components/admin/admin-webhooks.vue

@@ -6,7 +6,7 @@
           img.animated.fadeInUp(src='/svg/icon-winter.svg', alt='Mail', style='width: 80px;')
           .admin-header-title
             .headline.primary--text.animated.fadeInLeft {{ $t('admin:webhooks.title') }}
-            .subheading.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:webhooks.subtitle') }}
+            .subtitle-1.grey--text.animated.fadeInLeft.wait-p4s {{ $t('admin:webhooks.subtitle') }}
           v-spacer
           v-btn.animated.fadeInDown(color='success', depressed, @click='save', large, disabled)
             v-icon(left) check
@@ -15,7 +15,7 @@
       v-flex(lg3, xs12)
         v-card.animated.fadeInUp
           v-toolbar(flat, color='primary', dark, dense)
-            .subheading Webhooks
+            .subtitle-1 Webhooks
             v-spacer
             v-btn(outline, small)
               v-icon.mr-2 add
@@ -36,7 +36,7 @@
       v-flex(xs12, lg9)
         v-card.wiki-form.animated.fadeInUp.wait-p2s
           v-toolbar(color='primary', dense, flat, dark)
-            .subheading {{hook.title}}
+            .subtitle-1 {{hook.title}}
           v-card-text
             v-form
               .authlogo
@@ -50,7 +50,7 @@
 
 <script>
 import _ from 'lodash'
-import { get } from 'vuex-pathify'
+// import { get } from 'vuex-pathify'
 import mailConfigQuery from 'gql/admin/mail/mail-query-config.gql'
 import mailUpdateConfigMutation from 'gql/admin/mail/mail-mutation-save-config.gql'
 

+ 4 - 4
client/components/common/nav-header.vue

@@ -32,7 +32,7 @@
                 v-list-item-title.body-2 {{$t('common:header.newPage')}}
               template(v-if='path && path.length')
                 v-divider.my-0
-                v-subheader {{$t('common:header.currentPage')}}
+                .overline.pa-4.grey--text {{$t('common:header.currentPage')}}
                 v-list-item.pl-4(@click='pageView', v-if='mode !== `view`')
                   v-list-item-avatar(size='24'): v-icon(color='indigo') subject
                   v-list-item-title.body-2 {{$t('common:header.view')}}
@@ -52,7 +52,7 @@
                   v-list-item-avatar(size='24'): v-icon(color='red darken-2') mdi-trash-can-outline
                   v-list-item-title.body-2 {{$t('common:header.delete')}}
               v-divider.my-0
-              v-subheader {{$t('common:header.assets')}}
+              .overline.pa-4.grey--text {{$t('common:header.assets')}}
               v-list-item.pl-4(@click='assets')
                 v-list-item-avatar(size='24'): v-icon(color='grey lighten-2') mdi-folder-multiple-image
                 v-list-item-title.body-2.grey--text.text--ligten-2 {{$t('common:header.imagesFiles')}}
@@ -318,7 +318,7 @@ export default {
       this.$store.commit('showNotification', {
         style: 'indigo',
         message: `Coming soon...`,
-        icon: 'directions_boat'
+        icon: 'ferry'
       })
     },
     pageDelete () {
@@ -329,7 +329,7 @@ export default {
       this.$store.commit('showNotification', {
         style: 'indigo',
         message: `Coming soon...`,
-        icon: 'directions_boat'
+        icon: 'ferry'
       })
     },
     async changeLocale(locale) {

+ 6 - 6
client/components/common/page-delete.vue

@@ -2,20 +2,20 @@
   v-dialog(v-model='isShown', max-width='550', persistent)
     v-card.wiki-form
       .dialog-header.is-short.is-red
-        v-icon.mr-2(color='white') highlight_off
+        v-icon.mr-2(color='white') mdi-file-document-box-remove-outline
         span {{$t('common:page.delete')}}
       v-card-text
-        i18next.body-2(path='common:page.deleteTitle', tag='div')
+        i18next.body-1(path='common:page.deleteTitle', tag='div')
           span.red--text.text--darken-2(place='title') {{pageTitle}}
         .caption {{$t('common:page.deleteSubtitle')}}
-        v-chip.mt-3.ml-0.mr-1(label, color='red lighten-4', disabled, small)
+        v-chip.mt-3.ml-0.mr-1(label, color='red lighten-4', small)
           .caption.red--text.text--darken-2 {{pageLocale.toUpperCase()}}
-        v-chip.mt-3.mx-0(label, color='red lighten-5', disabled, small)
+        v-chip.mt-3.mx-0(label, color='red lighten-5', small)
           span.red--text.text--darken-2 /{{pagePath}}
       v-card-chin
         v-spacer
-        v-btn(flat, @click='discard', :disabled='loading') {{$t('common:actions.cancel')}}
-        v-btn(color='red darken-2', @click='deletePage', :loading='loading').white--text {{$t('common:actions.delete')}}
+        v-btn(text, @click='discard', :disabled='loading') {{$t('common:actions.cancel')}}
+        v-btn.px-4(color='red darken-2', @click='deletePage', :loading='loading').white--text {{$t('common:actions.delete')}}
 </template>
 
 <script>

+ 4 - 4
client/components/common/page-selector.vue

@@ -2,7 +2,7 @@
   v-dialog(v-model='isShown', max-width='850px')
     v-card.page-selector
       .dialog-header.is-dark
-        v-icon.mr-2(color='white') find_in_page
+        v-icon.mr-3(color='white') mdi-page-next-outline
         span Select Page Location
         v-spacer
         v-progress-circular(
@@ -71,9 +71,9 @@
         )
       v-card-chin
         v-spacer
-        v-btn(outline, @click='close') Cancel
-        v-btn(color='primary', @click='open')
-          v-icon(left) check
+        v-btn(text, @click='close') Cancel
+        v-btn.px-4(color='primary', @click='open')
+          v-icon(left) mdi-check
           span Select
 </template>
 

+ 6 - 6
client/components/editor.vue

@@ -7,29 +7,29 @@
         v-spacer
       template(slot='actions')
         v-btn.animated.fadeInDown(
-          flat
+          text
           color='green'
           @click.native.stop='save'
           :class='{ "is-icon": $vuetify.breakpoint.mdAndDown }'
           )
-          v-icon(color='green', :left='$vuetify.breakpoint.lgAndUp') check
+          v-icon(color='green', :left='$vuetify.breakpoint.lgAndUp') mdi-check
           span.white--text(v-if='$vuetify.breakpoint.lgAndUp') {{ mode === 'create' ? $t('common:actions.create') : $t('common:actions.save') }}
         v-btn.animated.fadeInDown.wait-p1s(
-          flat
+          text
           color='blue'
           @click.native.stop='openPropsModal'
           :class='{ "is-icon": $vuetify.breakpoint.mdAndDown, "mx-0": !welcomeMode, "ml-0": welcomeMode }'
           )
-          v-icon(color='blue', :left='$vuetify.breakpoint.lgAndUp') sort_by_alpha
+          v-icon(color='blue', :left='$vuetify.breakpoint.lgAndUp') mdi-tag-text-outline
           span.white--text(v-if='$vuetify.breakpoint.lgAndUp') {{ $t('common:actions.page') }}
         v-btn.animated.fadeInDown.wait-p2s(
           v-if='!welcomeMode'
-          flat
+          text
           color='red'
           :class='{ "is-icon": $vuetify.breakpoint.mdAndDown }'
           @click.native.stop='exit'
           )
-          v-icon(color='red', :left='$vuetify.breakpoint.lgAndUp') close
+          v-icon(color='red', :left='$vuetify.breakpoint.lgAndUp') mdi-close
           span.white--text(v-if='$vuetify.breakpoint.lgAndUp') {{ $t('common:actions.close') }}
     v-content
       component(:is='currentEditor', :save='save')

+ 26 - 25
client/components/editor/editor-markdown.vue

@@ -9,37 +9,38 @@
       template(v-else)
         v-tooltip(bottom, color='primary')
           v-btn.animated.fadeIn(icon, slot='activator', @click='toggleMarkup({ start: `**` })').mx-0
-            v-icon format_bold
+            v-icon mdi-format-bold
           span {{$t('editor:markup.bold')}}
         v-tooltip(bottom, color='primary')
           v-btn.animated.fadeIn.wait-p1s(icon, slot='activator', @click='toggleMarkup({ start: `*` })').mx-0
-            v-icon format_italic
+            v-icon mdi-format-italic
           span {{$t('editor:markup.italic')}}
         v-tooltip(bottom, color='primary')
           v-btn.animated.fadeIn.wait-p2s(icon, slot='activator', @click='toggleMarkup({ start: `~~` })').mx-0
-            v-icon format_strikethrough
+            v-icon mdi-format-strikethrough
           span {{$t('editor:markup.strikethrough')}}
         v-menu(offset-y, open-on-hover)
-          v-btn.animated.fadeIn.wait-p3s(icon, slot='activator').mx-0
-            v-icon text_fields
+          template(v-slot:activator='{ on }')
+            v-btn.animated.fadeIn.wait-p3s(icon, v-on='on').mx-0
+              v-icon mdi-format-header-pound
           v-list.py-0
             template(v-for='(n, idx) in 6')
               v-list-item(@click='setHeaderLine(n)', :key='idx')
                 v-list-item-action
-                  v-icon(:size='24 - (idx - 1) * 2') title
+                  v-icon(:size='24 - (idx - 1) * 2') mdi-format-header-{{n}}
                 v-list-item-title {{$t('editor:markup.heading', { level: n })}}
               v-divider(v-if='idx < 5')
         v-tooltip(bottom, color='primary')
           v-btn.animated.fadeIn.wait-p4s(icon, slot='activator', @click='toggleMarkup({ start: `~` })').mx-0
-            v-icon vertical_align_bottom
+            v-icon mdi-format-subscript
           span {{$t('editor:markup.subscript')}}
         v-tooltip(bottom, color='primary')
           v-btn.animated.fadeIn.wait-p5s(icon, slot='activator', @click='toggleMarkup({ start: `^` })').mx-0
-            v-icon vertical_align_top
+            v-icon mdi-format-superscript
           span {{$t('editor:markup.superscript')}}
         v-menu(offset-y, open-on-hover)
           v-btn.animated.fadeIn.wait-p6s(icon, slot='activator').mx-0
-            v-icon format_quote
+            v-icon mdi-alpha-t-box-outline
           v-list.py-0
             v-list-item(@click='insertBeforeEachLine({ content: `> `})')
               v-list-item-action
@@ -68,73 +69,73 @@
             v-divider
         v-tooltip(bottom, color='primary')
           v-btn.animated.fadeIn.wait-p7s(icon, slot='activator', @click='insertBeforeEachLine({ content: `- `})').mx-0
-            v-icon format_list_bulleted
+            v-icon mdi-format-list-bulleted
           span {{$t('editor:markup.unorderedList')}}
         v-tooltip(bottom, color='primary')
           v-btn.animated.fadeIn.wait-p8s(icon, slot='activator', @click='insertBeforeEachLine({ content: `1. `})').mx-0
-            v-icon format_list_numbered
+            v-icon mdi-format-list-numbered
           span {{$t('editor:markup.orderedList')}}
         v-tooltip(bottom, color='primary')
           v-btn.animated.fadeIn.wait-p9s(icon, slot='activator', @click='toggleMarkup({ start: "`" })').mx-0
-            v-icon space_bar
+            v-icon mdi-code-tags
           span {{$t('editor:markup.inlineCode')}}
         v-tooltip(bottom, color='primary')
           v-btn.animated.fadeIn.wait-p10s(icon, slot='activator', @click='toggleMarkup({ start: `<kbd>`, end: `</kbd>` })').mx-0
-            v-icon font_download
+            v-icon mdi-keyboard-variant
           span {{$t('editor:markup.keyboardKey')}}
         v-tooltip(bottom, color='primary')
           v-btn.animated.fadeIn.wait-p11s(icon, slot='activator', @click='insertAfter({ content: `---`, newLine: true })').mx-0
-            v-icon remove
+            v-icon mdi-minus
           span {{$t('editor:markup.horizontalBar')}}
         template(v-if='$vuetify.breakpoint.mdAndUp')
           v-spacer
           v-tooltip(bottom, color='primary')
             v-btn.animated.fadeIn.wait-p11s(icon, slot='activator', @click='previewShown = !previewShown').mx-0
-              v-icon flip
+              v-icon mdi-book-open-outline
             span {{$t('editor:markup.togglePreviewPane')}}
     .editor-markdown-main
       .editor-markdown-sidebar
         v-tooltip(right, color='teal')
           v-btn.animated.fadeInLeft(icon, slot='activator', dark, disabled).mx-0
-            v-icon link
+            v-icon mdi-link-plus
           span {{$t('editor:markup.insertLink')}}
         v-tooltip(right, color='teal')
           v-btn.animated.fadeInLeft.wait-p1s(icon, slot='activator', dark, @click='toggleModal(`editorModalMedia`)').mx-0
-            v-icon(:color='activeModal === `editorModalMedia` ? `teal` : ``') burst_mode
+            v-icon(:color='activeModal === `editorModalMedia` ? `teal` : ``') mdi-folder-multiple-image
           span {{$t('editor:markup.insertAssets')}}
         v-tooltip(right, color='teal')
           v-btn.animated.fadeInLeft.wait-p2s(icon, slot='activator', dark, @click='toggleModal(`editorModalBlocks`)').mx-0
-            v-icon(:color='activeModal === `editorModalBlocks` ? `teal` : ``') dashboard
+            v-icon(:color='activeModal === `editorModalBlocks` ? `teal` : ``') mdi-post
           span {{$t('editor:markup.insertBlock')}}
         v-tooltip(right, color='teal')
           v-btn.animated.fadeInLeft.wait-p3s(icon, slot='activator', dark, disabled).mx-0
-            v-icon code
+            v-icon mdi-code-braces
           span {{$t('editor:markup.insertCodeBlock')}}
         v-tooltip(right, color='teal')
           v-btn.animated.fadeInLeft.wait-p4s(icon, slot='activator', dark, disabled).mx-0
-            v-icon play_circle_outline
+            v-icon mdi-library-video
           span {{$t('editor:markup.insertVideoAudio')}}
         v-tooltip(right, color='teal')
           v-btn.animated.fadeInLeft.wait-p5s(icon, slot='activator', dark, disabled).mx-0
-            v-icon multiline_chart
+            v-icon mdi-chart-multiline
           span {{$t('editor:markup.insertDiagram')}}
         v-tooltip(right, color='teal')
           v-btn.animated.fadeInLeft.wait-p6s(icon, slot='activator', dark, disabled).mx-0
-            v-icon functions
+            v-icon mdi-function-variant
           span {{$t('editor:markup.insertMathExpression')}}
         v-tooltip(right, color='teal')
           v-btn.animated.fadeInLeft.wait-p7s(icon, slot='activator', dark, disabled).mx-0
-            v-icon border_outer
+            v-icon mdi-table-plus
           span {{$t('editor:markup.tableHelper')}}
         template(v-if='$vuetify.breakpoint.mdAndUp')
           v-spacer
           v-tooltip(right, color='teal')
             v-btn.animated.fadeInLeft.wait-p8s(icon, slot='activator', dark, @click='toggleFullscreen').mx-0
-              v-icon crop_free
+              v-icon mdi-overscan
             span {{$t('editor:markup.distractionFreeMode')}}
           v-tooltip(right, color='teal')
             v-btn.animated.fadeInLeft.wait-p9s(icon, slot='activator', dark, @click='toggleHelp').mx-0
-              v-icon(:color='helpShown ? `teal` : ``') help
+              v-icon(:color='helpShown ? `teal` : ``') mdi-help-circle
             span {{$t('editor:markup.markdownFormattingHelp')}}
       .editor-markdown-editor
         codemirror(ref='cm', v-model='code', :options='cmOptions', @ready='onCmReady', @input='onCmInput')

+ 17 - 24
client/components/editor/editor-modal-properties.vue

@@ -7,30 +7,28 @@
     :fullscreen='$vuetify.breakpoint.smAndDown'
     )
     .dialog-header
-      v-icon(color='white') sort_by_alpha
-      .subheading.white--text.ml-2 {{$t('editor:props.pageProperties')}}
+      v-icon(color='white') mdi-tag-text-outline
+      .subheading.white--text.ml-3 {{$t('editor:props.pageProperties')}}
       v-spacer
       v-btn.mx-0(
-        outline
+        outlined
         dark
         @click.native='close'
         )
-        v-icon(left) check
+        v-icon(left) mdi-check
         span {{ $t('common:actions.ok') }}
     v-card.wiki-form(tile)
       v-card-text
-        v-subheader.pl-0 {{$t('editor:props.pageInfo')}}
+        .overline.pb-5 {{$t('editor:props.pageInfo')}}
         v-text-field(
           ref='iptTitle'
-          outline
-          background-color='grey lighten-2'
+          outlined
           :label='$t(`editor:props.title`)'
           counter='255'
           v-model='title'
           )
         v-text-field(
-          outline
-          background-color='grey lighten-2'
+          outlined
           :label='$t(`editor:props.shortDescription`)'
           counter='255'
           v-model='description'
@@ -39,13 +37,12 @@
           )
       v-divider
       v-card-text.grey(:class='darkMode ? `darken-3-d3` : `lighten-5`')
-        v-subheader.pl-0 {{$t('editor:props.pathCategorization')}}
+        .overline.pb-5 {{$t('editor:props.pathCategorization')}}
         v-container.pa-0(fluid, grid-list-lg)
           v-layout(row, wrap)
             v-flex(xs12, md2)
               v-select(
-                outline
-                background-color='grey lighten-2'
+                outlined
                 :label='$t(`editor:props.locale`)'
                 suffix='/'
                 :items='namespaces'
@@ -55,10 +52,9 @@
               )
             v-flex(xs12, md10)
               v-text-field(
-                outline
-                background-color='grey lighten-2'
+                outlined
                 :label='$t(`editor:props.path`)'
-                append-icon='folder'
+                append-icon='mdi-folder-search'
                 v-model='path'
                 :hint='$t(`editor:props.pathHint`)'
                 persistent-hint
@@ -66,11 +62,10 @@
                 :disabled='mode !== "create"'
                 )
         v-combobox(
-          background-color='grey lighten-2'
           chips
           deletable-chips
           :label='$t(`editor:props.tags`)'
-          outline
+          outlined
           multiple
           v-model='tags'
           single-line
@@ -80,7 +75,7 @@
           )
       v-divider
       v-card-text.pb-5.grey(:class='darkMode ? `darken-3-d5` : `lighten-4`')
-        v-subheader.pl-0 {{$t('editor:props.publishState')}} #[v-chip.ml-3(label, color='grey', small, outline).white--text coming soon]
+        .overline.pb-5 {{$t('editor:props.publishState')}} #[v-chip.ml-3(label, color='grey', small, outline).white--text coming soon]
         v-container.pa-0(fluid, grid-list-lg)
           v-layout(row, wrap)
             v-flex(xs12, md4)
@@ -107,10 +102,9 @@
                   slot='activator'
                   :label='$t(`editor:props.publishStart`)'
                   v-model='publishStartDate'
-                  prepend-icon='event'
+                  prepend-icon='mdi-calendar-check'
                   readonly
-                  outline
-                  background-color='grey lighten-2'
+                  outlined
                   clearable
                   :hint='$t(`editor:props.publishStartHint`)'
                   persistent-hint
@@ -150,10 +144,9 @@
                   slot='activator'
                   :label='$t(`editor:props.publishEnd`)'
                   v-model='publishEndDate'
-                  prepend-icon='event'
+                  prepend-icon='mdi-calendar-remove'
                   readonly
-                  outline
-                  background-color='grey lighten-2'
+                  outlined
                   clearable
                   :hint='$t(`editor:props.publishEndHint`)'
                   persistent-hint

二进制
client/static/favicons/android-icon-72x72.png


二进制
client/static/favicons/apple-icon-72x72.png


+ 9 - 3
client/themes/default/components/page.vue

@@ -76,7 +76,12 @@
                 .overline.indigo--text.d-flex.align-center
                   span {{$t('common:page.lastEditedBy')}}
                   v-spacer
-                  v-tooltip(left, v-if='isAuthenticated')
+                  v-tooltip(top, v-if='isAuthenticated')
+                    template(v-slot:activator='{ on }')
+                      v-btn.btn-animate-edit(icon, :href='"/h/" + locale + "/" + path', v-on='on', x-small)
+                        v-icon(color='grey', dense) mdi-history
+                    span History
+                  v-tooltip(top, v-if='isAuthenticated')
                     template(v-slot:activator='{ on }')
                       v-btn.btn-animate-edit(icon, :href='"/e/" + locale + "/" + path', v-on='on', x-small)
                         v-icon(color='grey', dense) mdi-pencil
@@ -84,7 +89,7 @@
                 .body-2.grey--text(:class='darkMode ? `` : `text--darken-3`') {{ authorName }}
                 .caption.grey--text.text--darken-1 {{ updatedAt | moment('calendar') }}
 
-            v-card.mt-5
+            v-card.mt-5(v-if='tags.length > 0')
               .pa-5
                 .overline.teal--text.pb-2 Tags
                 v-chip.mr-1(
@@ -96,7 +101,8 @@
                   )
                   v-icon(color='teal', left, small) mdi-label
                   span.teal--text.text--darken-2 {{tag.text}}
-              v-divider
+
+            v-card.mt-5
               .pa-5
                 .overline.pb-2.yellow--text.text--darken-4 Rating
                 .text-center

+ 4 - 0
dev/index.js

@@ -14,6 +14,10 @@ const init = {
     const webpack = require('webpack')
     const chokidar = require('chokidar')
 
+    console.info(chalk.yellow.bold('--- ====================== ---'))
+    console.info(chalk.yellow.bold('--- Wiki.js DEVELOPER MODE ---'))
+    console.info(chalk.yellow.bold('--- ====================== ---'))
+
     global.DEV = true
     global.WP_CONFIG = require('./webpack/webpack.dev.js')
     global.WP = webpack(global.WP_CONFIG)

+ 3 - 4
dev/webpack/webpack.dev.js

@@ -9,10 +9,10 @@ const { VueLoaderPlugin } = require('vue-loader')
 const CopyWebpackPlugin = require('copy-webpack-plugin')
 const HtmlWebpackPlugin = require('html-webpack-plugin')
 const HtmlWebpackPugPlugin = require('html-webpack-pug-plugin')
-const SimpleProgressWebpackPlugin = require('simple-progress-webpack-plugin')
 const SriWebpackPlugin = require('webpack-subresource-integrity')
 const VuetifyLoaderPlugin = require('vuetify-loader/lib/plugin')
 const WriteFilePlugin = require('write-file-webpack-plugin')
+const WebpackBarPlugin = require('webpackbar')
 
 const babelConfig = fs.readJsonSync(path.join(process.cwd(), '.babelrc'))
 const cacheDir = '.webpack-cache/cache'
@@ -235,8 +235,8 @@ module.exports = {
       hashFuncNames: ['sha256', 'sha512'],
       enabled: false
     }),
-    new SimpleProgressWebpackPlugin({
-      format: 'compact'
+    new WebpackBarPlugin({
+      name: 'Client Assets'
     }),
     new webpack.DefinePlugin({
       'process.env.NODE_ENV': JSON.stringify('development'),
@@ -275,7 +275,6 @@ module.exports = {
       '@': path.join(process.cwd(), 'client'),
       'vue$': 'vue/dist/vue.esm.js',
       'gql': path.join(process.cwd(), 'client/graph'),
-      'mdi': path.join(process.cwd(), 'node_modules/vue-material-design-icons'),
       // Duplicates fixes:
       'apollo-link': path.join(process.cwd(), 'node_modules/apollo-link'),
       'apollo-utilities': path.join(process.cwd(), 'node_modules/apollo-utilities'),

+ 26 - 11
dev/webpack/webpack.prod.js

@@ -3,6 +3,7 @@ const path = require('path')
 const fs = require('fs-extra')
 const yargs = require('yargs').argv
 const _ = require('lodash')
+const Fiber = require('fibers')
 
 const { CleanWebpackPlugin } = require('clean-webpack-plugin')
 const CopyWebpackPlugin = require('copy-webpack-plugin')
@@ -69,7 +70,7 @@ module.exports = {
         ]
       },
       {
-        test: /\.scss$/,
+        test: /\.sass$/,
         use: [
           {
             loader: 'cache-loader',
@@ -78,31 +79,45 @@ module.exports = {
             }
           },
           'style-loader',
-          MiniCssExtractPlugin.loader,
           'css-loader',
           'postcss-loader',
           {
             loader: 'sass-loader',
             options: {
+              implementation: require('sass'),
+              fiber: Fiber,
               sourceMap: false
             }
-          },
-          {
-            loader: 'sass-resources-loader',
-            options: {
-              resources: path.join(process.cwd(), '/client/scss/global.scss')
-            }
           }
         ]
       },
       {
-        test: /\.styl$/,
+        test: /\.scss$/,
         use: [
+          {
+            loader: 'cache-loader',
+            options: {
+              cacheDirectory: cacheDir
+            }
+          },
           'style-loader',
           MiniCssExtractPlugin.loader,
           'css-loader',
           'postcss-loader',
-          'stylus-loader'
+          {
+            loader: 'sass-loader',
+            options: {
+              implementation: require('sass'),
+              fiber: Fiber,
+              sourceMap: false
+            }
+          },
+          {
+            loader: 'sass-resources-loader',
+            options: {
+              resources: path.join(process.cwd(), '/client/scss/global.scss')
+            }
+          }
         ]
       },
       {
@@ -194,6 +209,7 @@ module.exports = {
     new webpack.BannerPlugin('Wiki.js - wiki.js.org - Licensed under AGPL'),
     new CopyWebpackPlugin([
       { from: 'client/static' },
+      { from: './node_modules/prismjs/components', to: 'js/prism' },
       { from: './node_modules/graphql-voyager/dist/voyager.worker.js', to: 'js/' }
     ], {}),
     new MiniCssExtractPlugin({
@@ -260,7 +276,6 @@ module.exports = {
       '@': path.join(process.cwd(), 'client'),
       'vue$': 'vue/dist/vue.esm.js',
       'gql': path.join(process.cwd(), 'client/graph'),
-      'mdi': path.resolve(process.cwd(), 'node_modules/vue-material-design-icons'),
       // Duplicates fixes:
       'apollo-link': path.join(process.cwd(), 'node_modules/apollo-link'),
       'apollo-utilities': path.join(process.cwd(), 'node_modules/apollo-utilities'),

+ 16 - 15
package.json

@@ -38,10 +38,10 @@
     "@bugsnag/js": "6.3.2",
     "algoliasearch": "3.33.0",
     "apollo-fetch": "0.7.0",
-    "apollo-server": "2.7.2",
-    "apollo-server-express": "2.7.2",
+    "apollo-server": "2.8.1",
+    "apollo-server-express": "2.8.1",
     "auto-load": "3.0.4",
-    "aws-sdk": "2.501.0",
+    "aws-sdk": "2.503.0",
     "axios": "0.19.0",
     "azure-search-client": "3.1.5",
     "bcryptjs-then": "1.0.1",
@@ -76,8 +76,8 @@
     "graphql-rate-limit-directive": "1.1.0",
     "graphql-subscriptions": "1.1.0",
     "graphql-tools": "4.0.5",
-    "highlight.js": "9.15.8",
-    "i18next": "17.0.6",
+    "highlight.js": "9.15.9",
+    "i18next": "17.0.8",
     "i18next-express-middleware": "1.8.0",
     "i18next-node-fs-backend": "2.1.3",
     "image-size": "0.7.4",
@@ -91,7 +91,7 @@
     "markdown-it": "9.0.1",
     "markdown-it-abbr": "1.0.4",
     "markdown-it-anchor": "5.2.4",
-    "markdown-it-attrs": "2.4.1",
+    "markdown-it-attrs": "3.0.0",
     "markdown-it-emoji": "1.4.0",
     "markdown-it-expand-tabs": "1.0.13",
     "markdown-it-external-links": "0.0.6",
@@ -116,7 +116,7 @@
     "nodemailer": "6.3.0",
     "objection": "1.6.9",
     "passport": "0.4.0",
-    "passport-auth0": "1.1.0",
+    "passport-auth0": "1.2.0",
     "passport-azure-ad": "4.1.0",
     "passport-cas": "0.1.1",
     "passport-discord": "0.1.3",
@@ -146,11 +146,11 @@
     "request": "2.88.0",
     "request-promise": "4.2.4",
     "safe-regex": "2.0.2",
-    "sanitize-filename": "1.6.1",
+    "sanitize-filename": "1.6.2",
     "scim-query-filter-parser": "1.1.0",
     "semver": "6.3.0",
     "serve-favicon": "2.5.0",
-    "simple-git": "1.123.0",
+    "simple-git": "1.124.0",
     "solr-node": "1.2.1",
     "sqlite3": "4.0.9",
     "striptags": "3.1.1",
@@ -221,7 +221,7 @@
     "eslint-plugin-vue": "5.2.3",
     "fibers": "4.0.1",
     "file-loader": "4.1.0",
-    "filepond": "4.4.11",
+    "filepond": "4.4.12",
     "filepond-plugin-file-validate-type": "1.2.4",
     "filesize.js": "1.0.2",
     "grapesjs": "0.14.62",
@@ -256,7 +256,7 @@
     "react": "16.8.6",
     "react-dom": "16.8.6",
     "resolve-url-loader": "3.1.0",
-    "sass": "1.22.7",
+    "sass": "1.22.9",
     "sass-loader": "7.1.0",
     "sass-resources-loader": "2.0.1",
     "script-ext-html-webpack-plugin": "2.1.4",
@@ -286,20 +286,21 @@
     "vue2-animate": "2.1.0",
     "vuedraggable": "2.23.0",
     "vuescroll": "4.13.1",
-    "vuetify": "2.0.1",
+    "vuetify": "2.0.4",
     "vuetify-loader": "1.3.0",
     "vuex": "3.1.1",
     "vuex-pathify": "1.2.4",
     "vuex-persistedstate": "2.5.4",
-    "webpack": "4.38.0",
-    "webpack-bundle-analyzer": "3.3.2",
+    "webpack": "4.39.1",
+    "webpack-bundle-analyzer": "3.4.1",
     "webpack-cli": "3.3.6",
     "webpack-dev-middleware": "3.7.0",
     "webpack-hot-middleware": "2.25.0",
     "webpack-merge": "4.2.1",
     "webpack-subresource-integrity": "1.3.2",
+    "webpackbar": "3.2.0",
     "whatwg-fetch": "3.0.0",
-    "write-file-webpack-plugin": "4.5.0",
+    "write-file-webpack-plugin": "4.5.1",
     "xterm": "3.14.5",
     "zxcvbn": "4.4.2"
   },

+ 312 - 194
yarn.lock

@@ -1486,7 +1486,7 @@
   resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
   integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
 
-"@types/accepts@^1.3.5":
+"@types/accepts@*", "@types/accepts@^1.3.5":
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
   integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==
@@ -1568,6 +1568,16 @@
   resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.1.tgz#90b68446364baf9efd8e8349bb36bd3852b75b80"
   integrity sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==
 
+"@types/cookies@*":
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.2.tgz#5e0560d46ed9998082dce799af1058dd6a49780a"
+  integrity sha512-jnihWgshWystcJKrz8C9hV+Ot9lqOUyAh2RF+o3BEo6K6AS2l4zYCb9GYaBuZ3C6Il59uIGqpE3HvCun4KKeJA==
+  dependencies:
+    "@types/connect" "*"
+    "@types/express" "*"
+    "@types/keygrip" "*"
+    "@types/node" "*"
+
 "@types/cors@^2.8.4":
   version "2.8.4"
   resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.4.tgz#50991a759a29c0b89492751008c6af7a7c8267b0"
@@ -1620,6 +1630,20 @@
     "@types/minimatch" "*"
     "@types/node" "*"
 
+"@types/graphql-upload@^8.0.0":
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/@types/graphql-upload/-/graphql-upload-8.0.0.tgz#cf1a464e1ad3d185d6e1d77b5df0ca26057a572c"
+  integrity sha512-xeDYfZb0SeRpCRuivN9TXLEVsbG0F4inFtx03yadZeaTXr1kC224/ZvlV6NKqQ//HNvUxneYcEoUB5ugJc8dnA==
+  dependencies:
+    "@types/express" "*"
+    "@types/graphql" "*"
+    "@types/koa" "*"
+
+"@types/graphql@*":
+  version "14.2.3"
+  resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-14.2.3.tgz#cfc6420a67eb20420786f90112357921974593b9"
+  integrity sha512-UoCovaxbJIxagCvVfalfK7YaNhmxj3BQFRQ2RHQKLiu+9wNXhJnlbspsLHt/YQM99IaLUUFJNzCwzc6W0ypMeQ==
+
 "@types/graphql@0.10.2":
   version "0.10.2"
   resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.10.2.tgz#d7c79acbaa17453b6681c80c34b38fcb10c4c08c"
@@ -1630,6 +1654,11 @@
   resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.9.4.tgz#cdeb6bcbef9b6c584374b81aa7f48ecf3da404fa"
   integrity sha512-ob2dps4itT/Le5DbxjssBXtBnloDIRUbkgtAvaB42mJ8pVIWMRuURD9WjnhaEGZ4Ql/EryXMQWeU8Y0EU73QLw==
 
+"@types/http-assert@*":
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.0.tgz#56c95c69b51e7168b0d6727005d1fb2a00aaef94"
+  integrity sha512-8CBLG8RmxSvoY07FE6M/QpvJ7J5KzeKqF8eWN7Dq6Ks+lBTQae8Roc2G81lUu2Kw5Ju1gymOuvgyUsussbjAaA==
+
 "@types/isomorphic-fetch@0.0.34":
   version "0.0.34"
   resolved "https://registry.yarnpkg.com/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.34.tgz#3c3483e606c041378438e951464f00e4e60706d6"
@@ -1663,6 +1692,30 @@
     csstype "^2.0.0"
     indefinite-observable "^1.0.1"
 
+"@types/keygrip@*":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.1.tgz#ff540462d2fb4d0a88441ceaf27d287b01c3d878"
+  integrity sha1-/1QEYtL7TQqIRBzq8n0oewHD2Hg=
+
+"@types/koa-compose@*":
+  version "3.2.4"
+  resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.4.tgz#76a461634a59c3e13449831708bb9b355fb1548e"
+  integrity sha512-ioou0rxkuWL+yBQYsHUQAzRTfVxAg8Y2VfMftU+Y3RA03/MzuFL0x/M2sXXj3PkfnENbHsjeHR1aMdezLYpTeA==
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa@*":
+  version "2.0.49"
+  resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.0.49.tgz#8ffc2ddbdd715a2c392a218c67e116cb07007234"
+  integrity sha512-WQWpCH8O4Dslk8IcXfazff40aM1jXX7BQRbADIj/fKozVPu76P/wQE4sRe2SCWMn8yNkOcare2MkDrnZqLMkPQ==
+  dependencies:
+    "@types/accepts" "*"
+    "@types/cookies" "*"
+    "@types/http-assert" "*"
+    "@types/keygrip" "*"
+    "@types/koa-compose" "*"
+    "@types/node" "*"
+
 "@types/ldapjs@^1.0.0":
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/@types/ldapjs/-/ldapjs-1.0.3.tgz#eb2acbe603845136196dd25fba77e476d6d7db56"
@@ -2150,10 +2203,10 @@ acorn@^6.0.7:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
   integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
 
-acorn@^6.2.0:
-  version "6.2.0"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3"
-  integrity sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==
+acorn@^6.2.1:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51"
+  integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==
 
 adal-node@^0.1.22:
   version "0.1.28"
@@ -2196,6 +2249,11 @@ ajv-keywords@^3.1.0:
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.3.0.tgz#cb6499da9b83177af8bc1732b2f0a1a1a3aacf8c"
   integrity sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==
 
+ajv-keywords@^3.4.1:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
+  integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
+
 ajv@^6.1.0, ajv@^6.1.1, ajv@^6.5.5:
   version "6.8.1"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.8.1.tgz#0890b93742985ebf8973cd365c5b23920ce3cb20"
@@ -2216,6 +2274,16 @@ ajv@^6.10.0, ajv@^6.9.1:
     json-schema-traverse "^0.4.1"
     uri-js "^4.2.2"
 
+ajv@^6.10.2:
+  version "6.10.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
+  integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
+  dependencies:
+    fast-deep-equal "^2.0.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
 algoliasearch@3.33.0:
   version "3.33.0"
   resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.33.0.tgz#83b541124ebb0db54643009d4e660866b3177cdf"
@@ -2279,6 +2347,13 @@ ansi-escapes@^3.0.0, ansi-escapes@^3.2.0:
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
   integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
 
+ansi-escapes@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228"
+  integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==
+  dependencies:
+    type-fest "^0.5.2"
+
 ansi-html@0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
@@ -2403,17 +2478,18 @@ apollo-engine-reporting-protobuf@0.4.0:
   dependencies:
     protobufjs "^6.8.6"
 
-apollo-engine-reporting@1.4.2:
-  version "1.4.2"
-  resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.4.2.tgz#f6c1e964c3c2c09bdb25c449f6b7ab05952ff459"
-  integrity sha512-Srw6Roqx38P82c5If6NmWdM/HVETLwcCGIl4x6a+DDcuPJl6n6ef+Sluoz4QAGrqQDJhMYk3jL9xOnEysgtonA==
+apollo-engine-reporting@1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.4.3.tgz#0fcb67de7a24bef4e7e59990981f923267ffdd00"
+  integrity sha512-xv27qfc9dhi1yaWOhNQRmfF+SoLy74hl+M42arpIWdkoDe22fVTmTIqxqGwo4TFR3Z2OkAV5tNzuuOI/icd0Rg==
   dependencies:
     apollo-engine-reporting-protobuf "0.4.0"
     apollo-graphql "^0.3.3"
+    apollo-server-caching "0.5.0"
     apollo-server-env "2.4.1"
     apollo-server-types "0.2.1"
     async-retry "^1.2.1"
-    graphql-extensions "0.8.2"
+    graphql-extensions "0.9.1"
 
 apollo-env@0.5.1:
   version "0.5.1"
@@ -2533,17 +2609,18 @@ apollo-server-caching@0.5.0:
   dependencies:
     lru-cache "^5.0.0"
 
-apollo-server-core@2.7.2:
-  version "2.7.2"
-  resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.7.2.tgz#4acd9f4d0d235bef0e596e2a821326dfc07ae7b2"
-  integrity sha512-Dv6ZMMf8Y+ovkj1ioMtcYvjbcsSMqnZblbPPzOWo29vvKEjMXAL1OTSL1WBYxGA/WSBSCTnxAzipn71XZkYoCw==
+apollo-server-core@2.8.1:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.8.1.tgz#e5fadb3fe1fadd009d1b06a46cb44ec8692bf3fb"
+  integrity sha512-BpvhKdycTI1v5n8biJ5c/DVF7MCbTL3JtB9llHGkqYgHaTH1gXguh2qD8Vcki+rpUNO5P1lcj5V6oVXoSUFXlA==
   dependencies:
     "@apollographql/apollo-tools" "^0.4.0"
     "@apollographql/graphql-playground-html" "1.6.24"
+    "@types/graphql-upload" "^8.0.0"
     "@types/ws" "^6.0.0"
     apollo-cache-control "0.8.1"
     apollo-datasource "0.6.1"
-    apollo-engine-reporting "1.4.2"
+    apollo-engine-reporting "1.4.3"
     apollo-server-caching "0.5.0"
     apollo-server-env "2.4.1"
     apollo-server-errors "2.3.1"
@@ -2551,7 +2628,7 @@ apollo-server-core@2.7.2:
     apollo-server-types "0.2.1"
     apollo-tracing "0.8.1"
     fast-json-stable-stringify "^2.0.0"
-    graphql-extensions "0.8.2"
+    graphql-extensions "0.9.1"
     graphql-tag "^2.9.2"
     graphql-tools "^4.0.0"
     graphql-upload "^8.0.2"
@@ -2572,10 +2649,10 @@ apollo-server-errors@2.3.1:
   resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.1.tgz#033cf331463ebb99a563f8354180b41ac6714eb6"
   integrity sha512-errZvnh0vUQChecT7M4A/h94dnBSRL213dNxpM5ueMypaLYgnp4hiCTWIEaooo9E4yMGd1qA6WaNbLDG2+bjcg==
 
-apollo-server-express@2.7.2:
-  version "2.7.2"
-  resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.7.2.tgz#a6b9514f42463c9514d2dda34e07ee240b73f764"
-  integrity sha512-XW+MTKyjJDrHqeLJt9Z3OzLTCRxp53XzVVhF0f/Bs9GCODPlTiBaoiMwY2mXQ7WqK6gkYAH1kRp7d/psPFKE5w==
+apollo-server-express@2.8.1:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.8.1.tgz#955708efdcae8201b7941f0b5c5895e76997b4a3"
+  integrity sha512-XoWqSuNQkL8ivBq5LXJW6wV0/Ef+m8w4fAK/7PBspLHVfDAbHRyRr6zraotim2Kl7NOnzcqHtb6sB9yozjL0hA==
   dependencies:
     "@apollographql/graphql-playground-html" "1.6.24"
     "@types/accepts" "^1.3.5"
@@ -2583,7 +2660,7 @@ apollo-server-express@2.7.2:
     "@types/cors" "^2.8.4"
     "@types/express" "4.17.0"
     accepts "^1.3.5"
-    apollo-server-core "2.7.2"
+    apollo-server-core "2.8.1"
     apollo-server-types "0.2.1"
     body-parser "^1.18.3"
     cors "^2.8.4"
@@ -2608,13 +2685,13 @@ apollo-server-types@0.2.1:
     apollo-server-caching "0.5.0"
     apollo-server-env "2.4.1"
 
-apollo-server@2.7.2:
-  version "2.7.2"
-  resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.7.2.tgz#a3eeb6916f11802502ab40819e9f06a4c553c84a"
-  integrity sha512-0FkNi2ViLJoTglTuBTZ8OeUSK2/LOk4sMGmojDYUYkyVuM5lZX+GWVf3pDNvhrnC2po6TkntkNL4EJLXfKwNMA==
+apollo-server@2.8.1:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.8.1.tgz#e86733d74d91000694f5c27117a6f756de51b5a5"
+  integrity sha512-PILoFNKoRfC6pqVVQ42hYwFjM49l+9jjPeb+kqVmmcSDAwQIlcq3EPK5x65E3pmkPSaEOhGxU9a47cyu/PdJvg==
   dependencies:
-    apollo-server-core "2.7.2"
-    apollo-server-express "2.7.2"
+    apollo-server-core "2.8.1"
+    apollo-server-express "2.8.1"
     express "^4.0.0"
     graphql-subscriptions "^1.0.0"
     graphql-tools "^4.0.0"
@@ -2880,10 +2957,10 @@ autoprefixer@^7.1.1:
     postcss "^6.0.17"
     postcss-value-parser "^3.2.3"
 
-aws-sdk@2.501.0:
-  version "2.501.0"
-  resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.501.0.tgz#611d900fae284bfe8175fe9ee3d101e01a877f06"
-  integrity sha512-eFihkJEsDia9LPfVh8AVc7KXiL6KARRTdop/P3bwVv+sAxi2cfeX231WNeeBLCGBnITL1MmyndkG8gaCg6UgbQ==
+aws-sdk@2.503.0:
+  version "2.503.0"
+  resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.503.0.tgz#983b8c03aa919060a81127cb9d94fbb1667f4cf2"
+  integrity sha512-DPwRxhPYCGNvKL9rUhpAoOVpMRyISbVMlXykLQknYo7wyOI+jYcyA7t8H7IFPAqj4ZG+R+Au9tO/KT4im+2gbg==
   dependencies:
     buffer "4.9.1"
     events "1.1.1"
@@ -3532,36 +3609,37 @@ bytes@3.1.0:
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
   integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 
-cacache@^11.0.2:
-  version "11.3.2"
-  resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa"
-  integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==
+cacache@^11.3.3:
+  version "11.3.3"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc"
+  integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==
   dependencies:
-    bluebird "^3.5.3"
+    bluebird "^3.5.5"
     chownr "^1.1.1"
     figgy-pudding "^3.5.1"
-    glob "^7.1.3"
+    glob "^7.1.4"
     graceful-fs "^4.1.15"
     lru-cache "^5.1.1"
     mississippi "^3.0.0"
     mkdirp "^0.5.1"
     move-concurrently "^1.0.1"
     promise-inflight "^1.0.1"
-    rimraf "^2.6.2"
+    rimraf "^2.6.3"
     ssri "^6.0.1"
     unique-filename "^1.1.1"
     y18n "^4.0.0"
 
-cacache@^11.3.3:
-  version "11.3.3"
-  resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc"
-  integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==
+cacache@^12.0.2:
+  version "12.0.2"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.2.tgz#8db03205e36089a3df6954c66ce92541441ac46c"
+  integrity sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==
   dependencies:
     bluebird "^3.5.5"
     chownr "^1.1.1"
     figgy-pudding "^3.5.1"
     glob "^7.1.4"
     graceful-fs "^4.1.15"
+    infer-owner "^1.0.3"
     lru-cache "^5.1.1"
     mississippi "^3.0.0"
     mkdirp "^0.5.1"
@@ -3855,13 +3933,18 @@ chownr@^1.1.1:
   resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
   integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==
 
-chrome-trace-event@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48"
-  integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==
+chrome-trace-event@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
+  integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
   dependencies:
     tslib "^1.9.0"
 
+ci-info@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
+  integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
+
 ci-info@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
@@ -4150,11 +4233,6 @@ commander@^2.19.0, commander@^2.20.0, commander@~2.20.0:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
   integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
 
-commander@~2.17.1:
-  version "2.17.1"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
-  integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
-
 commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -4222,6 +4300,11 @@ connect-session-knex@1.4.0:
   resolved "https://registry.yarnpkg.com/connect-session-knex/-/connect-session-knex-1.4.0.tgz#93d46bab8cb664750aec665e55bf71e54beac665"
   integrity sha512-TjBESV6CY/SC4SRQP0hsYBLfR20bmj370+T+YpYgiC3kgOgL5x8z0bDgFddnUFZS//rgj+5Ps7pPQeP0ANq55w==
 
+consola@^2.6.0:
+  version "2.9.0"
+  resolved "https://registry.yarnpkg.com/consola/-/consola-2.9.0.tgz#57760e3a65a53ec27337f4add31505802d902278"
+  integrity sha512-34Iue+LRcWbndFIfZc5boNizWlsrRjqIBJZTe591vImgbnq7nx2EzlrLtANj9TH2Fxm7puFJBJAOk5BhvZOddQ==
+
 console-browserify@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
@@ -5247,9 +5330,9 @@ ejs@^2.3.4, ejs@^2.5.6, ejs@^2.6.1:
   integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
 
 "elasticsearch6@npm:@elastic/elasticsearch@6":
-  version "6.8.1"
-  resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-6.8.1.tgz#c3cbf0bc17b4b429c901ba1939551614fbbec2f6"
-  integrity sha512-Vy8sXmE0L6fHSNMsocy/qnxYMiPiJWKBZUgL3i9OIfaN65qvw63+khU/L7RIuLUgZmlmBtfNsBU0u7SNqkubnQ==
+  version "6.8.2"
+  resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-6.8.2.tgz#ab0085fd57cfa43493c6878d4c2d06dcd7ce63ba"
+  integrity sha512-TF449H2O1aWL1vSZAOAdDCpviWFyVMvyn7Dt3guNhYgQwGpYy9yzYRbtqWtsynMvqjCS3alis5Zksz/r74a5og==
   dependencies:
     debug "^4.1.1"
     decompress-response "^4.2.0"
@@ -5259,9 +5342,9 @@ ejs@^2.3.4, ejs@^2.5.6, ejs@^2.6.1:
     pump "^3.0.0"
 
 "elasticsearch7@npm:@elastic/elasticsearch@7":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-7.2.0.tgz#c200090b3164733affc960c6e09a8c650dc7a45a"
-  integrity sha512-n4t7XX5NLf4KuFVx7h/0V3WgF5BLRWUDvRyYMf+iRbR2dvZSD3BFYSqw757uDcXOE5lnxhJHBoT6CptpA6HW0g==
+  version "7.3.0"
+  resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-7.3.0.tgz#d62508cc03e91dd0676914a50af6500b45bfb199"
+  integrity sha512-CA8V4txIS+BPZg37ZVtOi5mN2xnXYAeQUCvgkjdtc2CzTd5pJrjdPzdmaDDATNc8nhlHMrqxMZZmpKD3OUkjAg==
   dependencies:
     debug "^4.1.1"
     decompress-response "^4.2.0"
@@ -5580,6 +5663,14 @@ eslint-scope@^4.0.0:
     esrecurse "^4.1.0"
     estraverse "^4.1.1"
 
+eslint-scope@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+  integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
 eslint-scope@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9"
@@ -5975,6 +6066,13 @@ figures@2.0.x, figures@^2.0.0:
   dependencies:
     escape-string-regexp "^1.0.5"
 
+figures@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9"
+  integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
 file-entry-cache@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
@@ -6000,10 +6098,10 @@ filepond-plugin-file-validate-type@1.2.4:
   resolved "https://registry.yarnpkg.com/filepond-plugin-file-validate-type/-/filepond-plugin-file-validate-type-1.2.4.tgz#ce7f5f469dbc7ce0da12fdef7b0f24e4c263c410"
   integrity sha512-K1qD8mfahJoz2zRlWWvYoHuy4k/8tHggsoGbm/blpTp63OyahOdJBzMN3VK7USYn5OZ58uOFdMTMyi8ibFpW/Q==
 
-filepond@4.4.11:
-  version "4.4.11"
-  resolved "https://registry.yarnpkg.com/filepond/-/filepond-4.4.11.tgz#8b3e370164c39a5e299bde591d26060240ba2871"
-  integrity sha512-eQPJiqKYQQNccjZ9jTZfqHeKvWXJ7Wq2fuicSQDCiG/bfEWmksaTeaQ51Vce5cNVTjXKfXuWhS4mNE6gzLwGhQ==
+filepond@4.4.12:
+  version "4.4.12"
+  resolved "https://registry.yarnpkg.com/filepond/-/filepond-4.4.12.tgz#8c7319efcbd080f1b4d01087c5605eb168db6fad"
+  integrity sha512-LW2gdZgxTTQqK9V4DWQwRbeQzmxmqJ+vFtKGIjxA8l+aui1FLGZ3Nmx+hpSysYgcY4iGIY+a8nK6C7RlEKoFrQ==
 
 filesize.js@1.0.2:
   version "1.0.2"
@@ -6603,10 +6701,10 @@ graphql-extensions@0.8.1:
     apollo-server-env "2.4.1"
     apollo-server-types "0.2.1"
 
-graphql-extensions@0.8.2:
-  version "0.8.2"
-  resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.8.2.tgz#071f29b111b16b359eb9994b0a036bdeec106492"
-  integrity sha512-d0nbxMfMe7wxdsVdCn0OBx2rX0sbcIjo9TOud38i9OgNa9eeS23OxbNfe+ezTCkEvSVqgPzpy5DAOvM4HNDV4Q==
+graphql-extensions@0.9.1:
+  version "0.9.1"
+  resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.9.1.tgz#5d40b2c2cf57a35b686121d5e63783369dade5ef"
+  integrity sha512-JR/KStdwALd48B/xSG/Mi85zamuJd8THvVlzGM5juznPDN0wTYG5SARGzzvoqHxgxuUHYdzpvESwMAisORJdCQ==
   dependencies:
     "@apollographql/apollo-tools" "^0.4.0"
     apollo-server-env "2.4.1"
@@ -6886,10 +6984,10 @@ hex-color-regex@^1.1.0:
   resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
   integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
 
-highlight.js@9.15.8:
-  version "9.15.8"
-  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.8.tgz#f344fda123f36f1a65490e932cf90569e4999971"
-  integrity sha512-RrapkKQWwE+wKdF73VsOa2RQdIoO3mxwJ4P8mhbI6KYJUraUHRKM5w5zQQKXNk0xNL4UVRdulV9SBJcmzJNzVA==
+highlight.js@9.15.9:
+  version "9.15.9"
+  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.9.tgz#865257da1dbb4a58c4552d46c4b3854f77f0e6d5"
+  integrity sha512-M0zZvfLr5p0keDMCAhNBp03XJbKBxUx5AfyfufMdFMEP4N/Xj6dh0IqC75ys7BAzceR34NgcvXjupRVaHBPPVQ==
 
 hmac-drbg@^1.0.0:
   version "1.0.1"
@@ -7113,10 +7211,10 @@ i18next-xhr-backend@3.0.0:
   dependencies:
     "@babel/runtime" "^7.4.5"
 
-i18next@17.0.6:
-  version "17.0.6"
-  resolved "https://registry.yarnpkg.com/i18next/-/i18next-17.0.6.tgz#01079cc2bcef408139ea8ce24d18ac0d512fbe85"
-  integrity sha512-bdNhzhcM6RG5m82RypVguCrAQNie/ycxW0Q5C6K9UDWD5hqApZfdJFbj4Ikz9jxIR+Ja1eg0yCQLhlCT+opwIg==
+i18next@17.0.8:
+  version "17.0.8"
+  resolved "https://registry.yarnpkg.com/i18next/-/i18next-17.0.8.tgz#0c7113a88ad156eb37b9025d83a7684e1bbc2e18"
+  integrity sha512-oojOrqEPQzKo1HDMDDOl19zTM/EaDwBRPobUSD4kEjNoTi2oERvUbngK2lkIm9nOGddh55jbMGbm6fusMBeoKQ==
   dependencies:
     "@babel/runtime" "^7.3.1"
 
@@ -7243,10 +7341,10 @@ indexes-of@^1.0.1:
   resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
   integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
 
-indexof@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
-  integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
+infer-owner@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+  integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
 
 inflight@^1.0.4:
   version "1.0.6"
@@ -7681,6 +7779,11 @@ is-windows@^1.0.1, is-windows@^1.0.2:
   resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
   integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
 
+is-wsl@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+  integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
 isarray@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -8366,7 +8469,7 @@ load-script@^1.0.0:
   resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4"
   integrity sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ=
 
-loader-runner@^2.3.0:
+loader-runner@^2.4.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
   integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
@@ -8678,10 +8781,10 @@ markdown-it-anchor@5.2.4:
   resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.2.4.tgz#d39306fe4c199705b4479d3036842cf34dcba24f"
   integrity sha512-n8zCGjxA3T+Mx1pG8HEgbJbkB8JFUuRkeTZQuIM8iPY6oQ8sWOPRZJDFC9a/pNg2QkHEjjGkhBEl/RSyzaDZ3A==
 
-markdown-it-attrs@2.4.1:
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/markdown-it-attrs/-/markdown-it-attrs-2.4.1.tgz#4868d067b0615568afc027bb99dfa2badb7ca1bc"
-  integrity sha512-BASnIYS+JLpjlhDf7jLV8VOuccxjfDDnQcz5dLfgPsYw8OsgbASexADdIkF7tIdGn+jaQSA4qOZXM3v3W3JBCg==
+markdown-it-attrs@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/markdown-it-attrs/-/markdown-it-attrs-3.0.0.tgz#e4c383f9ad00f733e8e868776db4fd6dd07cf1c8"
+  integrity sha512-DTIDzAQuQ9eEqq0y8GhdWB458vt0zYMp3M1R+IBMYlsMGY+oFOlZ/Gwk5Lg74v1ffYQ0kbDULqEbIbCowerJOA==
 
 markdown-it-emoji@1.4.0:
   version "1.4.0"
@@ -8818,7 +8921,7 @@ mem@^4.0.0:
     mimic-fn "^1.0.0"
     p-is-promise "^2.0.0"
 
-memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1:
+memory-fs@^0.4.0, memory-fs@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
   integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
@@ -8860,7 +8963,7 @@ methods@^1.1.1, methods@~1.1.2:
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
   integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
 
-micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
   version "3.1.10"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
   integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
@@ -9037,7 +9140,7 @@ mkdirp@0.3.0:
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
   integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=
 
-mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
   integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
@@ -9310,10 +9413,10 @@ node-int64@^0.4.0:
   resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
   integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
 
-node-libs-browser@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77"
-  integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==
+node-libs-browser@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
+  integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
   dependencies:
     assert "^1.1.1"
     browserify-zlib "^0.2.0"
@@ -9325,7 +9428,7 @@ node-libs-browser@^2.0.0:
     events "^3.0.0"
     https-browserify "^1.0.0"
     os-browserify "^0.3.0"
-    path-browserify "0.0.0"
+    path-browserify "0.0.1"
     process "^0.11.10"
     punycode "^1.2.4"
     querystring-es3 "^0.2.0"
@@ -9337,7 +9440,7 @@ node-libs-browser@^2.0.0:
     tty-browserify "0.0.0"
     url "^0.11.0"
     util "^0.11.0"
-    vm-browserify "0.0.4"
+    vm-browserify "^1.0.1"
 
 node-pre-gyp@^0.10.0:
   version "0.10.3"
@@ -9950,14 +10053,13 @@ pascalcase@^0.1.1:
   resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
   integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
 
-passport-auth0@1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/passport-auth0/-/passport-auth0-1.1.0.tgz#fc6fac83ae3ec5a3e5d462c05d145a4fbdad6703"
-  integrity sha512-3iN2X9fWRJUpvrag8gv3QrtrtZaOShft30XM50VvgUc78DT478z7txgk3cIhwjv8/crBrrG/Gu8KH99dg1CC2A==
+passport-auth0@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/passport-auth0/-/passport-auth0-1.2.0.tgz#270c337dbdfdf0eca12a270028fce11b930c1e19"
+  integrity sha512-+j2XQzRJqKkyfJvdke1YTnivqEAXQdr5Mrv9u0ZPCYnkmtp4J9uMmFbASjW6EAK7Rqo9y8cByLa8ZLqF8JXzcg==
   dependencies:
     passport-oauth "^1.0.0"
-    request "^2.61.0"
-    xtend "^4.0.0"
+    request "^2.83.0"
 
 passport-azure-ad@4.1.0:
   version "4.1.0"
@@ -10170,10 +10272,10 @@ passport@^0.3.2:
     passport-strategy "1.x.x"
     pause "0.0.1"
 
-path-browserify@0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
-  integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=
+path-browserify@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
+  integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
 
 path-dirname@^1.0.0:
   version "1.0.2"
@@ -11455,6 +11557,11 @@ pretty-error@^2.1.1:
     renderkid "^2.0.1"
     utila "~0.4"
 
+pretty-time@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e"
+  integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==
+
 prismjs@1.17.1:
   version "1.17.1"
   resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.17.1.tgz#e669fcbd4cdd873c35102881c33b14d0d68519be"
@@ -12321,7 +12428,7 @@ request-promise@4.2.4:
     stealthy-require "^1.1.1"
     tough-cookie "^2.3.3"
 
-request@2.88.0, "request@>= 2.52.0", request@^2.61.0, request@^2.72.0, request@^2.75.0, request@^2.87.0:
+request@2.88.0, "request@>= 2.52.0", request@^2.72.0, request@^2.75.0, request@^2.83.0, request@^2.87.0:
   version "2.88.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
   integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
@@ -12515,7 +12622,7 @@ right-align@^0.1.1:
   dependencies:
     align-text "^0.1.1"
 
-rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
+rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3:
   version "2.6.3"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
   integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
@@ -12612,10 +12719,10 @@ sane@^4.0.3:
     minimist "^1.1.1"
     walker "~1.0.5"
 
-sanitize-filename@1.6.1:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a"
-  integrity sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=
+sanitize-filename@1.6.2:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.2.tgz#01b4fc8809f14e9d22761fe70380fe7f3f902185"
+  integrity sha512-cmTzND7RMxUB+f7gI+4+KAVHWEg0lfXvQJdko+FXDP5bNbGIdx4KMP5pX6lv5jfT9jSf6OBbjyxjFtZQwYA/ig==
   dependencies:
     truncate-utf8-bytes "^1.0.0"
 
@@ -12648,10 +12755,10 @@ sass-resources-loader@2.0.1:
     glob "^7.1.1"
     loader-utils "^1.0.4"
 
-sass@1.22.7:
-  version "1.22.7"
-  resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.7.tgz#5a1a77dc11aa659db4e782d238bf9f3d44a60546"
-  integrity sha512-ahREi0AdG7RTovSv14+yd1prQSfIvFcrDpOsth5EQf1+RM7SvOxsSttzNQaFmK1aa/k/3vyYwlYF5l0Xl+6c+g==
+sass@1.22.9:
+  version "1.22.9"
+  resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.9.tgz#41a2ed6038027f58be2bd5041293452a29c2cb84"
+  integrity sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ==
   dependencies:
     chokidar ">=2.0.0 <4.0.0"
 
@@ -12780,11 +12887,6 @@ seq-queue@^0.0.5:
   resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e"
   integrity sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=
 
-serialize-javascript@^1.4.0:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879"
-  integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==
-
 serialize-javascript@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65"
@@ -12905,10 +13007,10 @@ simple-breakpoints@^1.1.1:
   resolved "https://registry.yarnpkg.com/simple-breakpoints/-/simple-breakpoints-1.1.3.tgz#5b5b09f1e96c5f8873e8ac23915323fbd7051516"
   integrity sha512-Io4J/9HyjAp6ITTBgOLU0BAronZKPC36znZoiiUSq5zlOfGPSdDFgWbpKyt9ASxGj5WXm2fhGx9+XtK3a+4dHw==
 
-simple-git@1.123.0:
-  version "1.123.0"
-  resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.123.0.tgz#5b1ab2673181ca6e3dcc5cc99ad82a75a49cd41a"
-  integrity sha512-PRXbTcLgrhOuC6N1dRxzqFkygEgWlTKce8SPoCyOm95b1tkgx4Vpf0WFzFsY/ppxNRgOHTVA57J42OKhj73gAg==
+simple-git@1.124.0:
+  version "1.124.0"
+  resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.124.0.tgz#10a73cc1af303832b5c11720d4256e134fba35ca"
+  integrity sha512-ks9mBoO4ODQy/xGLC8Cc+YDvj/hho/IKgPhi6h5LI/sA+YUdHc3v0DEoHzM29VmulubpGCxMJUSFmyXNsjNMEA==
   dependencies:
     debug "^4.0.1"
 
@@ -13022,14 +13124,6 @@ source-map-support@~0.5.12:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
-source-map-support@~0.5.6:
-  version "0.5.10"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c"
-  integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==
-  dependencies:
-    buffer-from "^1.0.0"
-    source-map "^0.6.0"
-
 source-map-url@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
@@ -13188,6 +13282,13 @@ statuses@~1.4.0:
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
   integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
 
+std-env@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.2.1.tgz#2ffa0fdc9e2263e0004c1211966e960948a40f6b"
+  integrity sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ==
+  dependencies:
+    ci-info "^1.6.0"
+
 stealthy-require@^1.1.0, stealthy-require@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
@@ -13467,7 +13568,7 @@ table@^5.2.3:
     slice-ansi "^2.1.0"
     string-width "^3.0.0"
 
-tapable@^1.0.0, tapable@^1.1.0:
+tapable@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e"
   integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==
@@ -13536,21 +13637,22 @@ tedious@^4.2.0:
     readable-stream "^3.0.3"
     sprintf-js "^1.1.1"
 
-terser-webpack-plugin@^1.1.0:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26"
-  integrity sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==
+terser-webpack-plugin@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4"
+  integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==
   dependencies:
-    cacache "^11.0.2"
-    find-cache-dir "^2.0.0"
+    cacache "^12.0.2"
+    find-cache-dir "^2.1.0"
+    is-wsl "^1.1.0"
     schema-utils "^1.0.0"
-    serialize-javascript "^1.4.0"
+    serialize-javascript "^1.7.0"
     source-map "^0.6.1"
-    terser "^3.8.1"
-    webpack-sources "^1.1.0"
-    worker-farm "^1.5.2"
+    terser "^4.1.2"
+    webpack-sources "^1.4.0"
+    worker-farm "^1.7.0"
 
-terser@4.1.2:
+terser@4.1.2, terser@^4.1.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/terser/-/terser-4.1.2.tgz#b2656c8a506f7ce805a3f300a2ff48db022fa391"
   integrity sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==
@@ -13559,15 +13661,6 @@ terser@4.1.2:
     source-map "~0.6.1"
     source-map-support "~0.5.12"
 
-terser@^3.8.1:
-  version "3.14.1"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-3.14.1.tgz#cc4764014af570bc79c79742358bd46926018a32"
-  integrity sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw==
-  dependencies:
-    commander "~2.17.1"
-    source-map "~0.6.1"
-    source-map-support "~0.5.6"
-
 test-exclude@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.0.0.tgz#cdce7cece785e0e829cd5c2b27baf18bc583cfb7"
@@ -13829,6 +13922,11 @@ type-check@~0.3.2:
   dependencies:
     prelude-ls "~1.1.2"
 
+type-fest@^0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2"
+  integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==
+
 type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.16:
   version "1.6.16"
   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
@@ -14216,12 +14314,10 @@ viz.js@2.1.2:
   resolved "https://registry.yarnpkg.com/viz.js/-/viz.js-2.1.2.tgz#6f09cd4e10af28754a6d50b055bd2e4a7693983a"
   integrity sha512-UO6CPAuEMJ8oNR0gLLNl+wUiIzQUsyUOp8SyyDKTqVRBtq7kk1VnFmIZW8QufjxGrGEuI+LVR7p/C7uEKy0LQw==
 
-vm-browserify@0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
-  integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=
-  dependencies:
-    indexof "0.0.1"
+vm-browserify@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
+  integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==
 
 void-elements@^2.0.1:
   version "2.0.1"
@@ -14396,10 +14492,10 @@ vuetify-loader@1.3.0:
   dependencies:
     loader-utils "^1.2.0"
 
-vuetify@2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-2.0.1.tgz#27b2ea314f5eba7eff9993d4d97110d5563a4b57"
-  integrity sha512-UOBpJQdEwvoqH7zXEVo0YGLT5bKKXZxa8+MzBKaQK/Evbo5XjbEt5mxbO7f/9bCO5XqM825u4eNxcEUhV4sT1Q==
+vuetify@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-2.0.4.tgz#0f751ba1d257212de16e30f3e1e9c4b8a8a93353"
+  integrity sha512-StXzJUph//ZJ1UTQNoJBmjAcC71Goeeg5Ag392z85dyertihy/3BIzPPxMqFTOJuDzst6oGQ3uQCfkIIqJvtfA==
 
 vuex-pathify@1.2.4:
   version "1.2.4"
@@ -14449,7 +14545,7 @@ warning@^4.0.1:
   dependencies:
     loose-envify "^1.0.0"
 
-watchpack@^1.5.0:
+watchpack@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
   integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==
@@ -14471,10 +14567,10 @@ webidl-conversions@^4.0.2:
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
   integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
 
-webpack-bundle-analyzer@3.3.2:
-  version "3.3.2"
-  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz#3da733a900f515914e729fcebcd4c40dde71fc6f"
-  integrity sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==
+webpack-bundle-analyzer@3.4.1:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.4.1.tgz#430544c7ba1631baccf673475ca8300cb74a3c47"
+  integrity sha512-Bs8D/1zF+17lhqj2OYmzi7HEVYqEVxu7lCO9Ff8BwajenOU0vAwEoV8e4ICCPNZAcqR1PCR/7o2SkW+cnCmF0A==
   dependencies:
     acorn "^6.0.7"
     acorn-walk "^6.1.1"
@@ -14485,7 +14581,7 @@ webpack-bundle-analyzer@3.3.2:
     express "^4.16.3"
     filesize "^3.6.1"
     gzip-size "^5.0.0"
-    lodash "^4.17.10"
+    lodash "^4.17.15"
     mkdirp "^0.5.1"
     opener "^1.5.1"
     ws "^6.0.0"
@@ -14550,6 +14646,14 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0:
     source-list-map "^2.0.0"
     source-map "~0.6.1"
 
+webpack-sources@^1.4.0, webpack-sources@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.1.tgz#b91b2c5b1c4e890ff50d1d35b7fa3657040da1da"
+  integrity sha512-XSz38193PTo/1csJabKaV4b53uRVotlMgqJXm3s3eje0Bu6gQTxYDqpD38CmQfDBA+gN+QqaGjasuC8I/7eW3Q==
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
 webpack-subresource-integrity@1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.2.tgz#38fdcbdd9b90b224500626efa1e6d17fc650800f"
@@ -14557,34 +14661,48 @@ webpack-subresource-integrity@1.3.2:
   dependencies:
     webpack-sources "^1.3.0"
 
-webpack@4.38.0:
-  version "4.38.0"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.38.0.tgz#6d77108404b08883c78f4e7e45a43c4e5c47c931"
-  integrity sha512-lbuFsVOq8PZY+1Ytz/mYOvYOo+d4IJ31hHk/7iyoeWtwN33V+5HYotSH+UIb9tq914ey0Hot7z6HugD+je3sWw==
+webpack@4.39.1:
+  version "4.39.1"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.39.1.tgz#60ed9fb2b72cd60f26ea526c404d2a4cc97a1bd8"
+  integrity sha512-/LAb2TJ2z+eVwisldp3dqTEoNhzp/TLCZlmZm3GGGAlnfIWDgOEE758j/9atklNLfRyhKbZTCOIoPqLJXeBLbQ==
   dependencies:
     "@webassemblyjs/ast" "1.8.5"
     "@webassemblyjs/helper-module-context" "1.8.5"
     "@webassemblyjs/wasm-edit" "1.8.5"
     "@webassemblyjs/wasm-parser" "1.8.5"
-    acorn "^6.2.0"
-    ajv "^6.1.0"
-    ajv-keywords "^3.1.0"
-    chrome-trace-event "^1.0.0"
+    acorn "^6.2.1"
+    ajv "^6.10.2"
+    ajv-keywords "^3.4.1"
+    chrome-trace-event "^1.0.2"
     enhanced-resolve "^4.1.0"
-    eslint-scope "^4.0.0"
+    eslint-scope "^4.0.3"
     json-parse-better-errors "^1.0.2"
-    loader-runner "^2.3.0"
-    loader-utils "^1.1.0"
-    memory-fs "~0.4.1"
-    micromatch "^3.1.8"
-    mkdirp "~0.5.0"
-    neo-async "^2.5.0"
-    node-libs-browser "^2.0.0"
+    loader-runner "^2.4.0"
+    loader-utils "^1.2.3"
+    memory-fs "^0.4.1"
+    micromatch "^3.1.10"
+    mkdirp "^0.5.1"
+    neo-async "^2.6.1"
+    node-libs-browser "^2.2.1"
     schema-utils "^1.0.0"
-    tapable "^1.1.0"
-    terser-webpack-plugin "^1.1.0"
-    watchpack "^1.5.0"
-    webpack-sources "^1.3.0"
+    tapable "^1.1.3"
+    terser-webpack-plugin "^1.4.1"
+    watchpack "^1.6.0"
+    webpack-sources "^1.4.1"
+
+webpackbar@3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-3.2.0.tgz#bdaad103fad11a4e612500e72aaae98b08ba493f"
+  integrity sha512-PC4o+1c8gWWileUfwabe0gqptlXUDJd5E0zbpr2xHP1VSOVlZVPBZ8j6NCR8zM5zbKdxPhctHXahgpNK1qFDPw==
+  dependencies:
+    ansi-escapes "^4.1.0"
+    chalk "^2.4.1"
+    consola "^2.6.0"
+    figures "^3.0.0"
+    pretty-time "^1.1.0"
+    std-env "^2.2.1"
+    text-table "^0.2.0"
+    wrap-ansi "^5.1.0"
 
 whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
   version "1.0.5"
@@ -14701,10 +14819,10 @@ wordwrap@~1.0.0:
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
   integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
 
-worker-farm@^1.5.2:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
-  integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==
+worker-farm@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
+  integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
   dependencies:
     errno "~0.1.7"
 
@@ -14756,15 +14874,15 @@ write-file-atomic@^2.3.0:
     imurmurhash "^0.1.4"
     signal-exit "^3.0.2"
 
-write-file-webpack-plugin@4.5.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/write-file-webpack-plugin/-/write-file-webpack-plugin-4.5.0.tgz#b53ccf01c346342a131c73a2ddd27049e90c5b44"
-  integrity sha512-k46VeERtaezbmjpDcMWATjKUWBrVe/ZEEm0cyvUm8FFP8A/r+dw5x3psRvkUOhqh9bqBLUlGYYbtr6luI+HeAg==
+write-file-webpack-plugin@4.5.1:
+  version "4.5.1"
+  resolved "https://registry.yarnpkg.com/write-file-webpack-plugin/-/write-file-webpack-plugin-4.5.1.tgz#aeeb68889194da5ec8a864667d46da9e00ee92d5"
+  integrity sha512-AZ7qJUvhTCBiOtG21aFJUcNuLVo2FFM6JMGKvaUGAH+QDqQAp2iG0nq3GcuXmJOFQR2JjpjhyYkyPrbFKhdjNQ==
   dependencies:
     chalk "^2.4.0"
     debug "^3.1.0"
     filesize "^3.6.1"
-    lodash "^4.17.5"
+    lodash "^4.17.13"
     mkdirp "^0.5.1"
     moment "^2.22.1"
     write-file-atomic "^2.3.0"