Added h1 tags to the top-level page 'Recommended'

<template>

{{ $tr('recommended') }}

    <template v-if="popular.length">
      <content-card-group-header
        :header="$tr('popularSectionHeader')"
        :viewMorePageLink="popularPageLink"
        :showViewMore="popular.length > trimmedPopular.length"
      />
      <content-card-group-grid
        v-if="isMobile"
        :genContentLink="genContentLink"
        :contents="trimmedPopular"
        :showContentKindFilter="false"
      />
      <content-card-group-carousel
        v-else
        :genContentLink="genContentLink"
        :contents="trimmedPopular"
      />
    </template>

    <template v-if="nextSteps.length">
      <content-card-group-header
        :header="$tr('suggestedNextStepsSectionHeader')"
        :viewMorePageLink="nextStepsPageLink"
        :showViewMore="nextSteps.length > trimmedNextSteps.length"
      />
      <content-card-group-grid
        v-if="isMobile"
        :genContentLink="genContentLink"
        :contents="trimmedNextSteps"
        :showContentKindFilter="false"
      />
      <content-card-group-carousel
        v-else
        :genContentLink="genContentLink"
        :contents="trimmedNextSteps"
      />
    </template>

    <template v-if="resume.length">
      <content-card-group-header
        :header="$tr('resumeSectionHeader')"
        :viewMorePageLink="resumePageLink"
        :showViewMore="resume.length > trimmedResume.length"
      />
      <content-card-group-grid
        v-if="isMobile"
        :genContentLink="genContentLink"
        :contents="trimmedResume"
        :showContentKindFilter="false"
      />
      <content-card-group-carousel
        v-else
        :genContentLink="genContentLink"
        :contents="trimmedResume"
      />
    </template>

    <template v-for="(contents, channelId) in featured" v-if="contents.length">

      <content-card-group-header
        :key="channelId"
        :header="$tr('featuredSectionHeader', { channelTitle: getChannelTitle(channelId) })"
        :viewMorePageLink="featuredPageLink(channelId)"
        :showViewMore="contents.length > trimContent(contents).length"
      />
      <content-card-group-grid
        v-if="isMobile"
        :key="channelId"
        :genContentLink="genContentLink"
        :contents="trimContent(contents)"
        :showContentKindFilter="false"
      />
      <content-card-group-carousel
        v-else
        :key="channelId"
        :genContentLink="genContentLink"
        :contents="trimContent(contents)"
      />
    </template>

</template>

<template>

  <div>

    <template v-if="popular.length">
      <content-card-group-header
        :header="$tr('popularSectionHeader')"
        :viewMorePageLink="popularPageLink"
        :showViewMore="popular.length > trimmedPopular.length"
      />
      <content-card-group-grid
        v-if="isMobile"
        :genContentLink="genContentLink"
        :contents="trimmedPopular"
        :showContentKindFilter="false"
      />
      <content-card-group-carousel
        v-else
        :genContentLink="genContentLink"
        :contents="trimmedPopular"
      />
    </template>

    <template v-if="nextSteps.length">
      <content-card-group-header
        :header="$tr('suggestedNextStepsSectionHeader')"
        :viewMorePageLink="nextStepsPageLink"
        :showViewMore="nextSteps.length > trimmedNextSteps.length"
      />
      <content-card-group-grid
        v-if="isMobile"
        :genContentLink="genContentLink"
        :contents="trimmedNextSteps"
        :showContentKindFilter="false"
      />
      <content-card-group-carousel
        v-else
        :genContentLink="genContentLink"
        :contents="trimmedNextSteps"
      />
    </template>

    <template v-if="resume.length">
      <content-card-group-header
        :header="$tr('resumeSectionHeader')"
        :viewMorePageLink="resumePageLink"
        :showViewMore="resume.length > trimmedResume.length"
      />
      <content-card-group-grid
        v-if="isMobile"
        :genContentLink="genContentLink"
        :contents="trimmedResume"
        :showContentKindFilter="false"
      />
      <content-card-group-carousel
        v-else
        :genContentLink="genContentLink"
        :contents="trimmedResume"
      />
    </template>

    <template v-for="(contents, channelId) in featured" v-if="contents.length">
      <!-- TODO: RTL - Do not interpolate strings -->
      <content-card-group-header
        :key="channelId"
        :header="$tr('featuredSectionHeader', { channelTitle: getChannelTitle(channelId) })"
        :viewMorePageLink="featuredPageLink(channelId)"
        :showViewMore="contents.length > trimContent(contents).length"
      />
      <content-card-group-grid
        v-if="isMobile"
        :key="channelId"
        :genContentLink="genContentLink"
        :contents="trimContent(contents)"
        :showContentKindFilter="false"
      />
      <content-card-group-carousel
        v-else
        :key="channelId"
        :genContentLink="genContentLink"
        :contents="trimContent(contents)"
      />
    </template>

  </div>

</template>

<script>

  import { PageNames } from '../../constants';
  import contentCardGroupCarousel from '../content-card-group-carousel';
  import contentCardGroupGrid from '../content-card-group-grid';
  import contentCardGroupHeader from '../content-card-group-header';
  import responsiveWindow from 'kolibri.coreVue.mixins.responsiveWindow';
  import { getChannels } from 'kolibri.coreVue.vuex.getters';

  const mobileCarouselLimit = 3;
  const desktopCarouselLimit = 15;

  export default {
    name: 'recommendedPage',
    $trs: {
      popularSectionHeader: 'Most popular',
      suggestedNextStepsSectionHeader: 'Next steps',
      resumeSectionHeader: 'Resume',
      featuredSectionHeader: 'Featured in { channelTitle }',
    },
    components: {
      contentCardGroupCarousel,
      contentCardGroupGrid,
      contentCardGroupHeader,
    },
    mixins: [responsiveWindow],
    computed: {
      isMobile() {
        return this.windowSize.breakpoint <= 1;
      },
      carouselLimit() {
        return this.isMobile ? mobileCarouselLimit : desktopCarouselLimit;
      },
      popularPageLink() {
        return {
          name: PageNames.RECOMMENDED_POPULAR,
        };
      },
      nextStepsPageLink() {
        return {
          name: PageNames.RECOMMENDED_NEXT_STEPS,
        };
      },
      resumePageLink() {
        return {
          name: PageNames.RECOMMENDED_RESUME,
        };
      },
      trimmedPopular() {
        return this.popular.slice(0, this.carouselLimit);
      },
      trimmedNextSteps() {
        return this.nextSteps.slice(0, this.carouselLimit);
      },
      trimmedResume() {
        return this.resume.slice(0, this.carouselLimit);
      },
      trimmedFeatured() {
        return this.featured.slice(0, this.carouselLimit);
      },
    },
    methods: {
      genContentLink(id) {
        return {
          name: PageNames.RECOMMENDED_CONTENT,
          params: { id },
        };
      },
      trimContent(content) {
        return content.slice(0, this.carouselLimit);
      },
      featuredPageLink(channel_id) {
        return {
          name: PageNames.RECOMMENDED_FEATURED,
          params: { channel_id },
        };
      },
      getChannelTitle(channel_id) {
        return this.channels.find(channel => channel.id === channel_id).title;
      },
    },
    vuex: {
      getters: {
        channels: getChannels,
        nextSteps: state => state.pageState.nextSteps,
        popular: state => state.pageState.popular,
        resume: state => state.pageState.resume,
        featured: state => state.pageState.featured,
      },
    },
  };

</script>

<style lang="stylus" scoped></style>


fix styling of next-content-btn for exercise

<template>

    <page-header :title="content.title"/>

    <content-renderer
      v-show="!searchOpen"
      class="content-renderer"
      :id="content.id"
      :kind="content.kind"
      :files="content.files"
      :contentId="content.content_id"
      :channelId="channelId"
      :available="content.available"
      :extraFields="content.extra_fields"/>

    <icon-button @click="nextContentClicked" v-if="progress >= 1 && showNextBtn" class="next-btn" :text="$tr('nextContent')">
      <mat-svg class="right-arrow" category="navigation" name="chevron_right"/>
    </icon-button>

{{ content.description }}

    <download-button v-if="canDownload" :files="content.files" class="download-button-left-align"/>

        {{ $tr('author') }}:
        {{ content.author }}
        -

        {{ $tr('license') }}:
        {{ content.license }}
        -

        {{ $tr('copyrightHolder') }}:
        {{ content.license_owner }}
        -

    <expandable-content-grid
      class="recommendation-section"
      v-if="pageMode === Constants.PageModes.LEARN"
      :title="recommendedText"
      :contents="recommended"/>

</template>

<template>

    <page-header :title="content.title"/>

    <content-renderer
      v-show="!searchOpen"
      class="content-renderer"
      :id="content.id"
      :kind="content.kind"
      :files="content.files"
      :contentId="content.content_id"
      :channelId="channelId"
      :available="content.available"
      :extraFields="content.extra_fields"/>

    <icon-button @click="nextContentClicked" v-if="progress >= 1 && showNextBtn" class="next-btn">
      {{ $tr('nextContent') }}
      <mat-svg class="right-arrow" category="navigation" name="chevron_right"/>
    </icon-button>

{{ content.description }}

    <download-button v-if="canDownload" :files="content.files" class="download-button-left-align"/>

        {{ $tr('author') }}:
        {{ content.author }}
        -

        {{ $tr('license') }}:
        {{ content.license }}
        -

        {{ $tr('copyrightHolder') }}:
        {{ content.license_owner }}
        -

    <expandable-content-grid
      class="recommendation-section"
      v-if="pageMode === Constants.PageModes.LEARN"
      :title="recommendedText"
      :contents="recommended"/>

</template>


docs(VSheet): improve usage example on mobile

<template>
  <v-container grid-list-xl>
    <v-layout
      flex-child
      wrap
    >
      <v-flex
        xs12
        md4
        d-flex
      >
        <v-sheet
          class="d-flex"
          color="grey lighten-3"
          height="424"
        >
          <sheet-footer>
            #1: (3r x 2c)
          </sheet-footer>
        </v-sheet>
      </v-flex>

      <v-flex
        xs12
        md4
        d-flex
      >
        <v-layout wrap>
          <v-flex xs6>
            <v-sheet
              class="d-flex"
              color="green lighten-3"
              height="150"
            >
              <sheet-footer>
                #2: (1r x 1c)
              </sheet-footer>
            </v-sheet>
          </v-flex>
          <v-flex xs6>
            <v-sheet
              class="d-flex"
              color="yellow lighten-3"
              height="150"
            >
              <sheet-footer>
                #3: (1r x 1c)
              </sheet-footer>
            </v-sheet>
          </v-flex>
          <v-flex xs12>

            <v-sheet
              class="d-flex"
              color="red lighten-3"
              height="250"
            >
              <sheet-footer>
                #5: (2r x 2c)
              </sheet-footer>
            </v-sheet>
          </v-flex>
        </v-layout>
      </v-flex>
      <v-flex
        xs6
        md2
      >
        <v-sheet
          class="d-flex"
          color="teal lighten-3"
          height="300"
        >
          <sheet-footer>
            #4: (2r x 1c)
          </sheet-footer>
        </v-sheet>
      </v-flex>
      <v-flex
        xs6
        md2
        d-flex
      >
        <v-sheet
          class="d-flex mt-auto"
          color="purple lighten-3"
          height="300"
        >
          <sheet-footer>
            #6: (2r x 1c)
          </sheet-footer>
        </v-sheet>
      </v-flex>
    </v-layout>
  </v-container>
</template>

<script>
  export default {
    components: {
      SheetFooter: {
        functional: true,

        render (h, { children }) {
          return h('v-sheet', {
            staticClass: 'mt-auto align-center justify-center d-flex',
            props: {
              color: 'rgba(0, 0, 0, .36)',
              dark: true,
              height: 50
            }
          }, children)
        }
      }
    }
  }
</script>

<template>
  <v-container grid-list-xl>
    <v-layout flex-child>
      <v-flex
        xs12
        md4
        d-flex
      >
        <v-sheet
          class="d-flex"
          color="grey lighten-3"
          height="424"
        >
          <sheet-footer>
            #1: (3r x 2c)
          </sheet-footer>
        </v-sheet>
      </v-flex>

      <v-flex
        xs12
        md4
        d-flex
      >
        <v-layout wrap>
          <v-flex xs6>
            <v-sheet
              class="d-flex"
              color="green lighten-3"
              height="150"
            >
              <sheet-footer>
                #2: (1r x 1c)
              </sheet-footer>
            </v-sheet>
          </v-flex>
          <v-flex xs6>
            <v-sheet
              class="d-flex"
              color="yellow lighten-3"
              height="150"
            >
              <sheet-footer>
                #3: (1r x 1c)
              </sheet-footer>
            </v-sheet>
          </v-flex>
          <v-flex xs12>

            <v-sheet
              class="d-flex"
              color="red lighten-3"
              height="250"
            >
              <sheet-footer>
                #5: (2r x 2c)
              </sheet-footer>
            </v-sheet>
          </v-flex>
        </v-layout>
      </v-flex>
      <v-flex
        xs6
        md2
      >
        <v-sheet
          class="d-flex"
          color="teal lighten-3"
          height="300"
        >
          <sheet-footer>
            #4: (2r x 1c)
          </sheet-footer>
        </v-sheet>
      </v-flex>
      <v-flex
        xs6
        md2
        d-flex
      >
        <v-sheet
          class="d-flex mt-auto"
          color="purple lighten-3"
          height="300"
        >
          <sheet-footer>
            #6: (2r x 1c)
          </sheet-footer>
        </v-sheet>
      </v-flex>
    </v-layout>
  </v-container>
</template>

<script>
  export default {
    components: {
      SheetFooter: {
        functional: true,

        render (h, { children }) {
          return h('v-sheet', {
            staticClass: 'mt-auto align-center justify-center d-flex',
            props: {
              color: 'rgba(0, 0, 0, .36)',
              dark: true,
              height: 50
            }
          }, children)
        }
      }
    }
  }
</script>


adding filter and sort component CA-324

adding filter and sort component CA-324

<template>

            Filter and Sort

                Sort by

                <template v-if="option.enabled">
                    <input
                        class="is-checkradio"
                        :id="option.id"
                        type="radio"
                        v-model="option.checked"
                        :value="true"
                        :name="option.id">
                    {{ option.label }}
                </template>

                Quick Filters

                <template v-if="option.enabled">
                    <input
                        class="is-checkradio"
                        :id="option.id"
                        type="checkbox"
                        v-model="option.checked"
                        :name="option.id">
                    {{ option.label }}
                </template>

                Apply search term to

                <template v-if="option.enabled">
                    <input
                        class="is-checkradio"
                        :id="option.id"
                        v-model="option.checked"
                        type="checkbox"
                        :name="option.id">
                    {{ option.label }}
                </template>

</template>

error: pathspec 'src/components/frameworks/FilterAndSort.vue' did not match any file(s) known to git


fix data structure error

fix data structure error

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/notadd/administration.git/'


fixed remove on history being pushed onto the line below

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/codeweavers/Consign.git/'


Scroll on top survey on changing the page in vue platform.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/dmitrykurmanov/surveyjs.git/'


Update now page and fix typo

Update now page and fix typo

fatal: remote error: upload-pack: not our ref 4a22f0cdee69c90e67a69ff54301e21f125131b9
fatal: the remote end hung up unexpectedly


remove WIP for recent page

remove WIP for recent page

<template>

{{ $tr('title') }}

      <report-list :reports="pageState.reports" />

      <channel-list />

</template>

<template>

    <work-in-progress />

</template>


aside component

aside component

<script>
  export default {
    render: function (c) {
      var self = this;
      return c('div', {
        class: {
          [this.alignClass]: true
        }
      }, [self.$slots.default]);
    },
    props: {
      align: String
    },
    data () {
      return {
        alignClass: this.align + '_main'
      }
    }
  }
</script>

error: pathspec 'src/components/aside/aside.vue' did not match any file(s) known to git


update post view

update post view

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Luncher/BlogAdmin.git/'


Style change to use smaller button

Style change to use smaller button

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/PayBreak/basket.git/'


use account

use account

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tianzhiqi/vue-project.git/'


Finished the cost stuff

Finished the cost stuff

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JadoJodo/stoplight.git/'


location widget updated

location widget updated

<template>

    <form class="pk-panel-teaser uk-form uk-form-stacked" v-show="editing" v-on="submit: $event.preventDefault()">

            {{ 'Location' | trans }}

                    <input id="form-city" class="uk-width-1-1" type="text" placeholder="{{ location }}" v-el="location" v-on="blur: clear" autocomplete="off">

            {{ 'Unit' | trans }}

                    <input type="radio" value="metric" v-model="widget.units"> {{ 'Metric' | trans }}

                    <input type="radio" value="imperial" v-model="widget.units"> {{ 'Imperial' | trans }}

    </form>

{{ time | date format }}

{{ time | date 'long' }}

{{ widget.city }}

{{ temperature }}

        <v-loader></v-loader>

</template>


add:码本的添加编辑

add:码本的添加编辑

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ZHCS-CLUB/Hammer.git/'


fix link function

fix link function

<template>

    <router-link :to="classListPage">
{{ $tr('allClasses') }}
</router-link>
    >
    <ui-select
      :name="$tr('selectClass')"
      :value="currentClass"
      :options="classOptions"
      @change="changeClass"
      class="class-selector"
    />

</template>


Updated dependencies tool page to client-side pagination of tokens

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/04n0/goldfish.git/'


Fix global event handler leakage

Fix global event handler leakage

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/casid/mazebert-ladder.git/'


sss: fix Promises again

sss: fix Promises again

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/parksandwildlife/gokart.git/'


fixes #24

fixes #24

<template lang="pug">
  v-toolbar(
    color="primary"
    app
    dark
    fixed
    :inverted-scroll="isManualScrolling"
    :scroll-off-screen="isManualScrolling"
    ref="toolbar"
  )#app-toolbar
    v-toolbar-side-icon(@click="$store.commit('app/DRAWER_TOGGLE')").hidden-lg-and-up
    router-link(to="/").ml-3
      img(
        src="/static/v-alt.svg"
        height="38px"
      )
    v-toolbar-title.pb-1 Vuetify
    v-spacer
    v-toolbar-items
      v-menu(bottom offset-y)
        v-btn(
          slot="activator"
          flat
        )
          span Translations
          v-icon keyboard_arrow_down
      v-menu(bottom offset-y)
        v-btn(
          slot="activator"
          flat
        )
          span 0.17
          v-icon keyboard_arrow_down
      v-btn(
        flat
        v-if="$route.path === '/'"
        to="/getting-started/quick-start"
      )
        span.hidden-md-and-up Docs
        span.hidden-sm-and-down Documentation
</template>

<script>
  export default {
    name: 'app-toolbar',

    data: () => ({
      fixed: false,
      isManualScrolling: false
    }),

    watch: {
      $route (current) {
        const isManualScrolling = current.path === '/'
        const duration = !isManualScrolling ? 400 : 0

        setTimeout(() => {
          this.isManualScrolling = isManualScrolling
        }, duration)
      }
    },

    created () {
      const fixed = this.$route.path !== '/'
      this.isManualScrolling = !fixed
    }
  }
</script>

<style lang="stylus">
  #app-toolbar
    .toolbar__title
      margin-left .5em
      font-weight 300
      font-size 21px
      position relative
      top 1px

    .toolbar__items
      .btn
        text-transform capitalize
        font-size 18px
        font-weight 300
</style>

<template lang="pug">
  v-toolbar(
    color="primary"
    app
    dark
    fixed
    :inverted-scroll="isManualScrolling"
    :scroll-off-screen="isManualScrolling"
    ref="toolbar"
  )#app-toolbar
    v-toolbar-side-icon(@click="$store.commit('app/DRAWER_TOGGLE')").hidden-sm-and-up
    router-link(to="/").ml-3
      img(
        src="/static/v-alt.svg"
        height="38px"
      )
    v-toolbar-title.pb-1 Vuetify
    v-spacer
    v-toolbar-items
      v-menu(bottom offset-y)
        v-btn(
          slot="activator"
          flat
        )
          span Translations
          v-icon keyboard_arrow_down
      v-menu(bottom offset-y)
        v-btn(
          slot="activator"
          flat
        )
          span 0.17
          v-icon keyboard_arrow_down
      v-btn(
        flat
        v-if="$route.path === '/'"
        to="/getting-started/quick-start"
      )
        span.hidden-md-and-up Docs
        span.hidden-sm-and-down Documentation
</template>

<script>
  export default {
    name: 'app-toolbar',

    data: () => ({
      fixed: false,
      isManualScrolling: false
    }),

    watch: {
      $route (current) {
        const isManualScrolling = current.path === '/'
        const duration = !isManualScrolling ? 400 : 0

        setTimeout(() => {
          this.isManualScrolling = isManualScrolling
        }, duration)
      }
    },

    created () {
      const fixed = this.$route.path !== '/'
      this.isManualScrolling = !fixed
    }
  }
</script>

<style lang="stylus">
  #app-toolbar
    .toolbar__title
      margin-left .5em
      font-weight 300
      font-size 21px
      position relative
      top 1px

    .toolbar__items
      .btn
        text-transform capitalize
        font-size 18px
        font-weight 300
</style>


Finished adding extra calcs

Finished adding extra calcs


docs(Search): temporarily disbable search input

<template>
  <v-navigation-drawer
    v-model="inputValue"
    clipped
    app
  >
    <v-container
      fluid
      pb-0
    >

Premiere sponsor

          One spot available

        <supporters-sponsor-btn
          large
          class="mb-4"
          href="https://www.patreon.com/join/vuetify"
        />

        <v-text-field
          id="search"
          key="search"
          ref="search"
          :disabled="isProd"
          v-model="search"
          label="Search"
          append-icon="search"
          clearable
          hide-details
          single-line
          solo
          light
        />

Under maintenance

    </v-container>

    <v-divider class="mt-3" />

    <v-layout pa-3>

        <v-img
          src="https://cdn.vuetifyjs.com/images/affiliates/vuejobs-logo.svg"
          alt="VueJobs"
          title="VueJobs"
          contain
          height="18"
          width="60"
        />

    </v-layout>
    <v-list
      class="pa-0"
      dense
      expand
    >
      <template v-for="(item, i) in items">
        <v-subheader
          v-if="item.header"
          :key="`subheader-${i}`"
          v-text="item.header"
        />
        <v-divider
          v-else-if="item.divider"
          :key="`divider-${i}`"
        />
        <core-group
          v-else-if="item.group"
          :key="`group-${i}`"
          :item="item"
        />
        <core-item
          v-else
          :chip="genChip(item)"
          :icon="item.icon"
          :key="`item-${i}`"
          :subtext="item.subtext"
          :text="item.text"
          :to="item.to"
        />
      </template>
    </v-list>
  </v-navigation-drawer>
</template>

<template>
  <v-navigation-drawer
    v-model="inputValue"
    clipped
    app
  >
    <v-container
      fluid
      pb-0
    >

Premiere sponsor

          One spot available

        <supporters-sponsor-btn
          large
          class="mb-4"
          href="https://www.patreon.com/join/vuetify"
        />

        <v-text-field
          id="search"
          key="search"
          ref="search"
          v-model="search"
          label="Search"
          append-icon="search"
          clearable
          hide-details
          single-line
          solo
          light
        />

    </v-container>

    <v-divider class="mt-3" />

    <v-layout pa-3>

        <v-img
          src="https://cdn.vuetifyjs.com/images/affiliates/vuejobs-logo.svg"
          alt="VueJobs"
          title="VueJobs"
          contain
          height="18"
          width="60"
        />

    </v-layout>
    <v-list
      class="pa-0"
      dense
      expand
    >
      <template v-for="(item, i) in items">
        <v-subheader
          v-if="item.header"
          :key="`subheader-${i}`"
          v-text="item.header"
        />
        <v-divider
          v-else-if="item.divider"
          :key="`divider-${i}`"
        />
        <core-group
          v-else-if="item.group"
          :key="`group-${i}`"
          :item="item"
        />
        <core-item
          v-else
          :chip="genChip(item)"
          :icon="item.icon"
          :key="`item-${i}`"
          :subtext="item.subtext"
          :text="item.text"
          :to="item.to"
        />
      </template>
    </v-list>
  </v-navigation-drawer>
</template>


docs: change heading to a regular component

<template>
  <v-subtitle-2 class="doc-heading">
    <doc-markdown><slot /></doc-markdown>
  </v-subtitle-2>
</template>

<style>
  .doc-heading p {
    margin-bottom: 4px;
  }
</style>

<template functional>
  <v-subtitle-2 class="doc-heading">
    <doc-markdown><slot /></doc-markdown>
  </v-subtitle-2>
</template>

<style>
  .doc-heading p {
    margin-bottom: 4px;
  }
</style>


projects now show vertically

projects now show vertically

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/axhon/axhon.github.io.git/'


Add tipp info component

Add tipp info component

<template>

Hesch e Reisetipp?

Weisch es feins Restaurant, es tolls Land oder eifach es schöns Plätzli? Mir si geng uf der Suechi nach guete Reisetipps, egau wo uf dere Wäut. Suech di Ort und gibnis di Tipp!

    <button
      class="tipp-info__close plain"
      @click="closeTippInfo"
    >

    </button>

</template>

error: pathspec 'src/components/TippInfo.vue' did not match any file(s) known to git


Methods reordered, renamed this.handleFilesChange()

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/LinusBorg/vue-component-droparea.git/'


Changed email validation on organization page

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/digitalideastudio/timeragent.git/'


Escape url parameters

Escape url parameters


Style shipment management

Style shipment management

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/modum-io/web.git/'


format

format

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/KyLeoHC/webpack-vue.git/'


Add required prop types.

Add required prop types.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/setholito/js-style-guide.git/'


Moved bot to layout

Moved bot to layout

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/LokeCarlsson/lokecarlsson.git/'


Put the update interval in the layout and added a refresh button

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/riggerthegeek/ci-menu.git/'


arreglo problema con badge de github

arreglo problema con badge de github

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/jesus-repos/VueToolBox.git/'


Fixed loading project error in task editor


detail

detail


translation: components/slider ALL DONE!

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/iview/iview-doc.git/'


add content-page

add content-page

<template>

CONTENT!!!

  <viewerslot kind="" url="">

  </viewerslot>

    {{ title }}

    {{ description }}

    <content-card v-for="content in recommended">

    </content-card>

</template>

error: pathspec 'kolibri/plugins/learn/assets/src/content-page.vue' did not match any file(s) known to git


Fix subtotal not updating (#625)

Fix subtotal not updating (#625)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/jaceks-iRonin/vue-material-test.git/'


Update PI copy

Update PI copy

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/wappulehti-apy/diilikone-front-2017.git/'


feature: notify when pandoc fail

feature: notify when pandoc fail

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/CodeOfCinders/roleplaymanager.git/'


docs(toolbar): fix togglebutton visibility

<template>
  <v-toolbar
    id="app-toolbar"
    app
    clipped-left
    clipped-right
    class="elevation-6"
    color="primary"
    dark
    fixed
    height="58"
    extension-height="48"
  >
    <v-toolbar-side-icon
      v-if="$route.name !== 'home/Home'"
      class="hidden-lg-and-up"
      @click="toggleDrawer"
    />

    <router-link
      :to="{ name: 'home/Home' }"
      class="mr-3"
    >
      <v-img
        alt="Vuetify Logo"
        src="https://cdn.vuetifyjs.com/images/logos/v-alt.svg"
        contain
        transition="scale-transition"
        height="38px"
        width="38px"
      />
    </router-link>

    <v-toolbar-items class="hidden-sm-and-down">
      <v-btn
        v-for="(item, i) in items"
        :key="i"
        :input-value="params.namespace === item.to.params.namespace"
        :to="item.to"
        flat
        style="min-width: 0;"
      >
        {{ item.text }}
      </v-btn>
    </v-toolbar-items>

    <v-spacer />

    <v-toolbar-items>
      <core-versions />
      <core-social />
      <core-locales />
      <core-github />
    </v-toolbar-items>
  </v-toolbar>
</template>

<script>
  // Utilities
  import {
    mapMutations,
    mapState
  } from 'vuex'
  import languages from '@/data/i18n/languages.json'

  export default {
    name: 'CoreToolbar',

    data: vm => ({
      items: [
        {
          text: vm.$t('Vuetify.AppToolbar.docs'),
          to: {
            name: 'Documentation',
            params: {
              namespace: 'getting-started',
              page: 'quick-start'
            }
          }
        },
        {
          text: vm.$t('Vuetify.AppToolbar.framework'),
          to: {
            name: 'Documentation',
            params: {
              namespace: 'framework',
              page: 'a-la-carte'
            }
          }
        },
        {
          text: vm.$t('Vuetify.AppToolbar.components'),
          to: {
            name: 'Documentation',
            params: {
              namespace: 'components',
              page: 'api-explorer'
            }
          }
        },
        {
          text: vm.$t('Vuetify.AppToolbar.directives'),
          to: {
            name: 'Documentation',
            params: {
              namespace: 'directives',
              page: 'resizing'
            }
          }
        }
      ],
      languages
    }),

    computed: {
      ...mapState('route', ['params'])
    },

    methods: {
      ...mapMutations('app', ['toggleDrawer']),
      changeToRelease (release) {
        // Remove language setting
        const path = this.$route.fullPath.split('/')
          .slice(2)
          .join('/')
        window.location.href = `${window.location.origin}/releases/${release}/#/${path}`
      }
    }
  }
</script>

<style lang="stylus">
  #app-toolbar
    .v-toolbar__title
      margin-left .5em
      font-weight 300
      font-size 21px
      position relative
      top 1px

    .v-toolbar__items
      .v-btn
        text-transform capitalize
        font-size 16px
        font-weight 300

    .v-toolbar__extension
      padding: 0
</style>

<template>
  <v-toolbar
    id="app-toolbar"
    app
    clipped-left
    clipped-right
    class="elevation-6"
    color="primary"
    dark
    fixed
    height="58"
    extension-height="48"
  >
    <v-toolbar-side-icon
      class="hidden-md-and-up"
      @click="toggleDrawer"
    />

    <router-link
      :to="{ name: 'home/Home' }"
      class="mr-3"
    >
      <v-img
        alt="Vuetify Logo"
        src="https://cdn.vuetifyjs.com/images/logos/v-alt.svg"
        contain
        transition="scale-transition"
        height="38px"
        width="38px"
      />
    </router-link>

    <v-toolbar-items class="hidden-sm-and-down">
      <v-btn
        v-for="(item, i) in items"
        :key="i"
        :input-value="params.namespace === item.to.params.namespace"
        :to="item.to"
        flat
        style="min-width: 0;"
      >
        {{ item.text }}
      </v-btn>
    </v-toolbar-items>

    <v-spacer />

    <v-toolbar-items>
      <core-versions />
      <core-social />
      <core-locales />
      <core-github />
    </v-toolbar-items>
  </v-toolbar>
</template>

<script>
  // Utilities
  import {
    mapMutations,
    mapState
  } from 'vuex'
  import languages from '@/data/i18n/languages.json'

  export default {
    name: 'CoreToolbar',

    data: vm => ({
      items: [
        {
          text: vm.$t('Vuetify.AppToolbar.docs'),
          to: {
            name: 'Documentation',
            params: {
              namespace: 'getting-started',
              page: 'quick-start'
            }
          }
        },
        {
          text: vm.$t('Vuetify.AppToolbar.framework'),
          to: {
            name: 'Documentation',
            params: {
              namespace: 'framework',
              page: 'a-la-carte'
            }
          }
        },
        {
          text: vm.$t('Vuetify.AppToolbar.components'),
          to: {
            name: 'Documentation',
            params: {
              namespace: 'components',
              page: 'api-explorer'
            }
          }
        },
        {
          text: vm.$t('Vuetify.AppToolbar.directives'),
          to: {
            name: 'Documentation',
            params: {
              namespace: 'directives',
              page: 'resizing'
            }
          }
        }
      ],
      languages
    }),

    computed: {
      ...mapState('route', ['params'])
    },

    methods: {
      ...mapMutations('app', ['toggleDrawer']),
      changeToRelease (release) {
        // Remove language setting
        const path = this.$route.fullPath.split('/')
          .slice(2)
          .join('/')
        window.location.href = `${window.location.origin}/releases/${release}/#/${path}`
      }
    }
  }
</script>

<style lang="stylus">
  #app-toolbar
    .v-toolbar__title
      margin-left .5em
      font-weight 300
      font-size 21px
      position relative
      top 1px

    .v-toolbar__items
      .v-btn
        text-transform capitalize
        font-size 16px
        font-weight 300

    .v-toolbar__extension
      padding: 0
</style>


Removes name prop

Removes name prop

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NathanielDavid/Sumie.git/'


Sets first filter item to active

Sets first filter item to active


Remove padding from labels

Remove padding from labels

<template>
    <button class="p0 bg-white c-gray brdr-1 brdr-gray" :class="{ active: active }" @click="switchFilter(id, label)">
        {{ label }}
    </button>
</template>

<script>
import { coreComponent } from 'lib/themes'

export default {
  data () {
    return {
      active: false
    }
  },
  beforeMount () {
    this.$bus.$on('filter-changed-' + this.context, (filterOption) => {
      if (filterOption.attribute_code === this.code) {
        if (filterOption.id === this.id) {
          if (this.active) {
            this.active = false
            return
          } else {
            this.active = true
          }
        } else {
          this.active = false
        }
        // filterOption.id === this.id ? this.active = true : this.active = false
      }
    })
  },
  methods: {
    switchFilter (id, label) {
      this.$bus.$emit('filter-changed-' + this.context, { attribute_code: this.code, id: id, label: label })
    }
  },
  mixins: [coreComponent('core/SizeButton')]
}
</script>

<style scoped>

    button {
      width: 40px;
      height: 40px;
      cursor: pointer;
      border-radius: 0;
      border-color: #BDBDBD;
      font-size: 14px;
      color: #BDBDBD;
    }
    button.active {
      border-color: #828282;
      border-width: 2px;
      color: #828282;
    }
    button:disabled {
      border-color: #E0E0E0;
      color: #E0E0E0;
      cursor: not-allowed;
    }

</style>

<template>
    <button class="bg-white c-gray brdr-1 brdr-gray" :class="{ active: active }" @click="switchFilter(id, label)">
        {{ label }}
    </button>
</template>

<script>
import { coreComponent } from 'lib/themes'

export default {
  data () {
    return {
      active: false
    }
  },
  beforeMount () {
    this.$bus.$on('filter-changed-' + this.context, (filterOption) => {
      if (filterOption.attribute_code === this.code) {
        if (filterOption.id === this.id) {
          if (this.active) {
            this.active = false
            return
          } else {
            this.active = true
          }
        } else {
          this.active = false
        }
        // filterOption.id === this.id ? this.active = true : this.active = false
      }
    })
  },
  methods: {
    switchFilter (id, label) {
      this.$bus.$emit('filter-changed-' + this.context, { attribute_code: this.code, id: id, label: label })
    }
  },
  mixins: [coreComponent('core/SizeButton')]
}
</script>

<style scoped>

    button {
      width: 40px;
      height: 40px;
      cursor: pointer;
      border-radius: 0;
      border-color: #BDBDBD;
      font-size: 14px;
      color: #BDBDBD;
    }
    button.active {
      border-color: #828282;
      border-width: 2px;
      color: #828282;
    }
    button:disabled {
      border-color: #E0E0E0;
      color: #E0E0E0;
      cursor: not-allowed;
    }

</style>


fetching data from graphql for extension page

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/notadd/administration.git/'


Fix coding style

Fix coding style

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stefanjudis/stefan-judis-website.git/'


Reverting the trs. This illness has me commiting gibberish.

<template>

 {{header}}

       {{subheader}}

    <ui-select
      v-if="filter"
      :label="$tr('display')"
      :options="filterOptions"
      v-model="selectedFilter"
      class="filter"
    />

      <slot
        :title="content.title"
        :thumbnail="content.thumnail"
        :kind="content.kind"
        :progress="content.progress"
        :id="content.id">

        <content-card
          :title="content.title"
          :thumbnail="content.thumbnail"
          :kind="content.kind"
          :progress="content.progress"
          :link="genLink(content.id, content.kind)"/>

      </slot>

</template>


udpate:同步成功后跳转

udpate:同步成功后跳转

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/o2team/deploy.git/'


feature: add error page

feature: add error page

error: pathspec 'layouts/error.vue' did not match any file(s) known to git


Switch: compatible with vue ssr, fixed #3752 (#3820)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/iamnewsea/element-pzx.git/'


Make sure all images fit.

Make sure all images fit.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Franky47/piertotum-locomotor.git/'


añadido el componente contact

añadido el componente contact


Prevent unused grid columns

Prevent unused grid columns

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mplusmuseum/mplusmuseum-stories.git/'


Fix spacing

Fix spacing

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/praneetloke/vue-material.git/'


fix(MdChips): improve alignment with other regular fields like md-input

<template>
  <div class="md-chips" :class="[$mdActiveTheme, chipsClasses]">
    <md-chip
      v-for="(chip, key) in value"
      :key="chip"
      :md-deletable="!isStatic"
      :md-clickable="!isStatic"
      :md-duplicated="duplicatedChip === chip"
      @keydown.enter="$emit('md-click', chip, key)"
      @click.native="$emit('md-click', chip, key)"
      @md-delete.stop="removeChip(chip)">
      <slot name="md-chip" :chip="chip" v-if="$scopedSlots['md-chip']">{{ chip }}</slot>
      <template v-else>{{ chip }}</template>
    </md-chip>

    <input
      class="md-input"
      ref="input"
      v-model.trim="inputValue"
      v-if="!isStatic && modelRespectLimit"
      :type="mdInputType"
      :id="id"
      :placeholder="placeholder"
      @input="handleInput"
      @focus="onFocus"
      @blur="onBlur"
      @keydown.enter="insertChip"
      @keydown.8="handleBackRemove" />
  </div>
</template>

<script>
  import MdComponent from 'core/MdComponent'
  import MdField from 'components/MdField/MdField'
  import MdInput from 'components/MdField/MdInput/MdInput'
  import MdUuid from 'core/utils/MdUuid'
  import MdPropValidator from 'core/utils/MdPropValidator'
  import MdFieldMixin from '../MdField/MdFieldMixin'

  export default new MdComponent({
    name: 'MdChips',
    components: {
      MdField,
      MdInput
    },
    props: {
      value: Array,
      id: {
        type: [String, Number],
        default: () => 'md-chips-' + MdUuid()
      },
      mdInputType: {
        type: [String, Number],
        ...MdPropValidator('md-input-type', ['email', 'number', 'password', 'search', 'tel', 'text', 'url'])
      },
      mdStatic: Boolean,
      mdLimit: Number,
      mdCheckDuplicated: {
        type: Boolean,
        default: false
      },
      mdFormat: {
        type: Function
      }
    },
    mixins: [MdFieldMixin],
    inject: ['MdField'],
    data: () => ({
      inputValue: '',
      duplicatedChip: null
    }),
    computed: {
      chipsClasses () {
        return {
          'md-has-value': this.value && this.value.length
        }
      },

      modelRespectLimit () {
        return !this.mdLimit || this.value.length < this.MdField.maxlength
      },

      formattedInputValue () {
        if (!this.mdFormat) {
          return this.inputValue
        }
        return this.mdFormat(this.inputValue)
      },

      stringInputValue () {
        return (this.inputValue || this.inputValue === 0) && this.inputValue.toString()
      },

      hasInputValue () {
        return this.stringInputValue && this.stringInputValue.length > 0
      },

      isStatic () {
        return this.disabled || this.readonly || this.mdStatic
      }
    },
    methods: {
      clearField () {
        this.inputValue = ''
        this.model = []
        this.setFieldValue()
      },
      setMaxlength () {
        if (this.mdLimit) {
          this.MdField.maxlength = parseInt(this.mdLimit, 10)
        } else if (this.mdCounter) {
          this.MdField.counter = parseInt(this.mdCounter, 10)
        } else {
          this.MdField.maxlength = parseInt(this.maxlength, 10)
        }
      },
      insertChip ({ target }) {
        let isArray = Array.isArray(this.localValue)
        if(!isArray) this.localValue = []

        let inputValue = this.formattedInputValue

        if (!inputValue || !this.modelRespectLimit) {
          return
        }

        if (this.value.includes(inputValue)) {
          this.duplicatedChip = null
          // to trigger animate
          this.$nextTick(() => {
            this.duplicatedChip = inputValue
          })
          return
        }

        this.localValue.push(inputValue)
        this.setFieldValue(this.value)
        this.$emit('md-insert', inputValue)
        this.inputValue = ''
      },
      removeChip (chip) {
        const index = this.localValue.indexOf(chip)

        this.localValue.splice(index, 1)
        this.setFieldValue(this.value)
        this.$emit('md-delete', chip, index)
        this.$nextTick(() => this.$refs.input.focus())
      },
      handleBackRemove () {
        if (!this.inputValue) {
          this.removeChip(this.value[this.value.length - 1])
        }
      },
      handleInput () {
        if (this.mdCheckDuplicated) {
          this.checkDuplicated()
        } else {
          this.duplicatedChip = null
        }
      },
      checkDuplicated () {
        if (!this.value.includes(this.formattedInputValue)) {
          this.duplicatedChip = null
          return false
        }

        if (!this.mdCheckDuplicated) {
          return false
        }

        this.duplicatedChip = this.formattedInputValue
      }
    },
    watch: {
      mdLimit () {
        this.setMaxlength()
      },
      hasInputValue () {
        this.MdField.typing = this.hasInputValue
      },
      value () {
        this.checkDuplicated()
      }
    },
    created () {
      this.MdField.chips = true
    },
    beforeDestroy () {
      this.MdField.chips = false
    }
  })
</script>

<style lang="scss">
  @import "~components/MdAnimation/variables";

  .md-chips {
    flex-wrap: wrap;
    flex: 1;
    display: flex;
    transition: $md-transition-stand;
    transition-property: padding-top, padding-bottom;

    &.md-has-value {
      label {
        top: -6px;
      }
    }

    .md-chip {
      margin: 1px 4px 3px 0;

      &:last-of-type {
        margin-right: 8px;
      }
    }

    .md-input {
      min-width: 128px;
    }
  }

  .md-field.md-has-chips.md-field-bottom-line {
    .md-chips {
      .md-input {
        height: 36px;
        line-height: 36px;
      }
    }

    label {
      margin-top: 2px;
    }

    > .md-icon {
      margin-top: 8px;
    }

    &:not(.md-inline) {
      padding-top: 12px;

      &.md-typing {
        label {
          pointer-events: auto;
          font-size: 12px;
          opacity: 1;
        }
      }

      &.md-typing,
      &.md-focused,
      &.md-has-value {
        label {
          top: -4px;
        }
      }
    }

    &.md-inline {
      &.md-has-placeholder,
      &.md-typing {
        label {
          opacity: 0;
        }
      }
    }
  }

  .md-field.md-has-chips.md-field-box {
    .md-chips {
      padding: 20px 0 0;

      .md-input {
        height: 36px;
        padding: 0;
      }
    }

    &.md-has-placeholder {
      .md-chips {
        padding-top: 10px;
        padding-bottom: 10px;

        .md-input {
          height: 36px;
          padding: 0;
        }
      }

      &.md-typing,
      &.md-focused,
      &.md-has-value {
        .md-chips {
          padding-top: 20px;
          padding-bottom: 0;

          .md-input {
            height: 36px;
            padding: 0;
          }
        }
      }
    }

    &.md-typing {
      label {
        pointer-events: auto;
        opacity: 1;
        font-size: 12px;
      }
    }

    &.md-typing,
    &.md-focused,
    &.md-has-value {
      label {
        top: 6px;
      }

      .md-input,
      .md-textarea {
        font-size: 16px;
      }

      .md-prefix,
      .md-suffix {
        padding-top: 20px;
      }
    }

    &.md-inline {
      .md-chips {
        padding-top: 10px;
      }

      &.md-typing,
      &.md-focused,
      &.md-has-value {
        label {
          top: 20px;
          font-size: 16px;
        }

        .md-chips {
          padding-top: 10px;
          padding-bottom: 10px;

          .md-input {
            height: 36px;
            padding: 0;
          }
        }

        .md-prefix,
        .md-suffix {
          padding-top: 0;
        }
      }

      &.md-typing {
        label {
          opacity: 0;
        }
      }

      &.md-has-placeholder {
        label {
          opacity: 0;
        }
      }
    }
  }

  .md-field.md-has-chips.md-field-raised {
    min-height: 48px;

    .md-chips {
      .md-input {
        height: 36px;
        line-height: 36px;
        padding: 0;
      }
    }
  }

  .md-field.md-has-chips.md-field-raised.md-dense {
    min-height: 48px;
  }
</style>

<template>
  <div class="md-chips" :class="[$mdActiveTheme, chipsClasses]">

    <md-chip
      v-for="(chip, key) in value"
      :key="chip"
      :md-deletable="!isStatic"
      :md-clickable="!isStatic"
      :md-duplicated="duplicatedChip === chip"
      @keydown.enter="$emit('md-click', chip, key)"
      @click.native="$emit('md-click', chip, key)"
      @md-delete.stop="removeChip(chip)">
      <slot name="md-chip" :chip="chip" v-if="$scopedSlots['md-chip']">{{ chip }}</slot>
      <template v-else>{{ chip }}</template>
    </md-chip>

    <input
      class="md-input"
      ref="input"
      v-model.trim="inputValue"
      v-if="!isStatic && modelRespectLimit"
      :type="mdInputType"
      :id="id"
      :placeholder="placeholder"
      @input="handleInput"
      @focus="onFocus"
      @blur="onBlur"
      @keydown.enter="insertChip"
      @keydown.8="handleBackRemove" />
  </div>
</template>

<script>
  import MdComponent from 'core/MdComponent'
  import MdField from 'components/MdField/MdField'
  import MdInput from 'components/MdField/MdInput/MdInput'
  import MdUuid from 'core/utils/MdUuid'
  import MdPropValidator from 'core/utils/MdPropValidator'
  import MdFieldMixin from '../MdField/MdFieldMixin'

  export default new MdComponent({
    name: 'MdChips',
    components: {
      MdField,
      MdInput
    },
    props: {
      value: Array,
      id: {
        type: [String, Number],
        default: () => 'md-chips-' + MdUuid()
      },
      mdInputType: {
        type: [String, Number],
        ...MdPropValidator('md-input-type', ['email', 'number', 'password', 'search', 'tel', 'text', 'url'])
      },
      mdStatic: Boolean,
      mdLimit: Number,
      mdCheckDuplicated: {
        type: Boolean,
        default: false
      },
      mdFormat: {
        type: Function
      }
    },
    mixins: [MdFieldMixin],
    inject: ['MdField'],
    data: () => ({
      inputValue: '',
      duplicatedChip: null
    }),
    computed: {
      chipsClasses () {
        return {
          'md-has-value': this.value && this.value.length
        }
      },

      modelRespectLimit () {
        return !this.mdLimit || this.value.length < this.MdField.maxlength
      },

      formattedInputValue () {
        if (!this.mdFormat) {
          return this.inputValue
        }
        return this.mdFormat(this.inputValue)
      },

      stringInputValue () {
        return (this.inputValue || this.inputValue === 0) && this.inputValue.toString()
      },

      hasInputValue () {
        return this.stringInputValue && this.stringInputValue.length > 0
      },

      isStatic () {
        return this.disabled || this.readonly || this.mdStatic
      }
    },
    methods: {
      clearField () {
        this.inputValue = ''
        this.model = []
        this.setFieldValue()
      },
      setMaxlength () {
        if (this.mdLimit) {
          this.MdField.maxlength = parseInt(this.mdLimit, 10)
        } else if (this.mdCounter) {
          this.MdField.counter = parseInt(this.mdCounter, 10)
        } else {
          this.MdField.maxlength = parseInt(this.maxlength, 10)
        }
      },
      insertChip ({ target }) {
        let isArray = Array.isArray(this.localValue)
        if(!isArray) this.localValue = []

        let inputValue = this.formattedInputValue

        if (!inputValue || !this.modelRespectLimit) {
          return
        }

        if (this.value.includes(inputValue)) {
          this.duplicatedChip = null
          // to trigger animate
          this.$nextTick(() => {
            this.duplicatedChip = inputValue
          })
          return
        }

        this.localValue.push(inputValue)
        this.setFieldValue(this.value)
        this.$emit('md-insert', inputValue)
        this.inputValue = ''
      },
      removeChip (chip) {
        const index = this.localValue.indexOf(chip)

        this.localValue.splice(index, 1)
        this.setFieldValue(this.value)
        this.$emit('md-delete', chip, index)
        this.$nextTick(() => this.$refs.input.focus())
      },
      handleBackRemove () {
        if (!this.inputValue) {
          this.removeChip(this.value[this.value.length - 1])
        }
      },
      handleInput () {
        if (this.mdCheckDuplicated) {
          this.checkDuplicated()
        } else {
          this.duplicatedChip = null
        }
      },
      checkDuplicated () {
        if (!this.value.includes(this.formattedInputValue)) {
          this.duplicatedChip = null
          return false
        }

        if (!this.mdCheckDuplicated) {
          return false
        }

        this.duplicatedChip = this.formattedInputValue
      }
    },
    watch: {
      mdLimit () {
        this.setMaxlength()
      },
      hasInputValue () {
        this.MdField.typing = this.hasInputValue
      },
      value () {
        this.checkDuplicated()
      }
    },
    created () {
      this.MdField.chips = true
    },
    beforeDestroy () {
      this.MdField.chips = false
    }
  })
</script>

<style lang="scss">
  @import "~components/MdAnimation/variables";

  .md-chips {
    flex-wrap: wrap;
    flex: 1;
    display: flex;
    transition: $md-transition-stand;
    transition-property: padding-top, padding-bottom;

    &.md-has-value {
      label {
        top: -6px;
      }
    }

    .md-chip {
      margin: 2px 4px 2px 0;

      &:last-of-type {
        margin-right: 8px;
      }
    }

    .md-input {
      min-width: 128px;
    }
  }

  .md-field.md-has-chips.md-field-bottom-line {
    .md-chips {
      .md-input {
        height: 36px;
        line-height: 36px;
      }
    }

    label {
      margin-top: 2px;
    }

    > .md-icon {
      margin-top: 8px;
    }

    &:not(.md-inline) {
      padding-top: 12px;

      &.md-typing {
        label {
          pointer-events: auto;
          font-size: 12px;
          opacity: 1;
        }
      }

      &.md-typing,
      &.md-focused,
      &.md-has-value {
        label {
          top: -4px;
        }
      }
    }

    &.md-inline {
      &.md-has-placeholder,
      &.md-typing {
        label {
          opacity: 0;
        }
      }
    }
  }

  .md-field.md-has-chips.md-field-box {
    .md-chips {
      padding: 20px 0 0;

      .md-input {
        height: 36px;
        padding: 0;
      }
    }

    &.md-has-placeholder {
      .md-chips {
        padding-top: 10px;
        padding-bottom: 10px;

        .md-input {
          height: 36px;
          padding: 0;
        }
      }

      &.md-typing,
      &.md-focused,
      &.md-has-value {
        .md-chips {
          padding-top: 20px;
          padding-bottom: 0;

          .md-input {
            height: 36px;
            padding: 0;
          }
        }
      }
    }

    &.md-typing {
      label {
        pointer-events: auto;
        opacity: 1;
        font-size: 12px;
      }
    }

    &.md-typing,
    &.md-focused,
    &.md-has-value {
      label {
        top: 6px;
      }

      .md-input,
      .md-textarea {
        font-size: 16px;
      }

      .md-prefix,
      .md-suffix {
        padding-top: 20px;
      }
    }

    &.md-inline {
      .md-chips {
        padding-top: 10px;
      }

      &.md-typing,
      &.md-focused,
      &.md-has-value {
        label {
          top: 20px;
          font-size: 16px;
        }

        .md-chips {
          padding-top: 10px;
          padding-bottom: 10px;

          .md-input {
            height: 36px;
            padding: 0;
          }
        }

        .md-prefix,
        .md-suffix {
          padding-top: 0;
        }
      }

      &.md-typing {
        label {
          opacity: 0;
        }
      }

      &.md-has-placeholder {
        label {
          opacity: 0;
        }
      }
    }
  }

  .md-field.md-has-chips.md-field-raised {
    min-height: 48px;

    .md-chips {
      .md-input {
        height: 36px;
        line-height: 36px;
        padding: 0;
      }
    }
  }

  .md-field.md-has-chips.md-field-raised.md-dense {
    min-height: 48px;
  }
</style>


Fix a minor issue 'only set targetFeatureFound to ture if targetOnly is true' in bfrs.importList

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/parksandwildlife/gokart.git/'


사이드바 css 변경 및 배열 수정 fix #2

사이드바 css 변경 및 배열 수정 fix #2

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/HedwigProject/Hedwig.git/'


fix lint error.

fix lint error.

<template>

Temporarily disabled

      Please develop on the

        external plugin

</template>


Fix the product grid in the search on mobile

<template>

        close

        {{ $t('Search') }}

      <input
        ref="search"
        id="search"
        v-model="search"
        @input="makeSearch"
        class="mr20 py10 brdr-none brdr-bottom brdr-cl-primary no-outline h4"
        :placeholder="$t('Type what you are looking for...')"
        type="text"
      >

      <product-tile @click.native="closeSearchpanel" :key="product.id" v-for="product in products" :product="product"/>
      <transition name="fade">

          {{ $t('No results were found.') }}

      </transition>

</template>


Fixed linting errors

Fixed linting errors

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nodedb/core.git/'


order state list

order state list

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NewDadaFE/newdada-daojia.git/'


fix: change posting date

fix: change posting date

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ICJIA/icjia-gata.git/'


Proper height measurements

Proper height measurements


refactor v-validate with validity in component Sitemap


fix(view): fix postlist view route change bug

fix postlist view route switch bug

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Luncher/BlogAdmin.git/'


Fixing image width bug

Fixing image width bug

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/pestbarn/beertasting.git/'


Prepping for lazy loading more content

Prepping for lazy loading more content

<template>

 {{header}}

         {{subheader}}

      <ui-icon-button
      v-if="!isFirstSet"
      icon="arrow_back"
      size="large"
      class="previous"
      @click="previousSet" />
      <ui-icon-button
      v-if="!isLastSet"
      icon="arrow_forward"
      size="large"
      class="next" @click="nextSet" />

          <transition-group
            :name="animation"
            tag="div"
            @before-enter="beforeEnterStyle"
            @enter="enterStyle"
            @leave="leaveStyle">

            <slot
              v-for="content in contentSet"
              :title="content.title"
              :thumbnail="content.thumnail"
              :kind="content.kind"
              :progress="content.progress"
              :id="content.id">

                <content-card
                  class="content-card"
                  :key="content.id"
                  :title="content.title"
                  :thumbnail="content.thumbnail"
                  :kind="content.kind"
                  :progress="content.progress"
                  :link="genLink(content.id, content.kind)"/>

            </slot>

          </transition-group>

</template>


Apply pointer cursor to refresh button

Apply pointer cursor to refresh button

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/PayBreak/basket.git/'


add data of domians

add data of domians


select-tree 代码初始化 ，学会阅读别人的代码

select-tree 代码初始化 ，学会阅读别人的代码

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kobeCan/practices.git/'


fix locale name for Edge browser (#644)

fix locale name for Edge browser (#644)

<template lang="pug">
  views-doc
    section#api
      helpers-section-head(value="Generic.Pages.api")
      v-card(class="mb-5")
        div(class="py-1")
          helpers-parameters(
            :headers="headers"
            :items="items"
            namespace="Guides"
            type="Internationalization"
            target="api"
          )

    section#getting-started
      helpers-section-head(value="Framework.Internationalization.gettingStarted")
      helpers-section-text(value="Framework.Internationalization.gettingStartedText")
      helpers-section-text(value="Framework.Internationalization.availableLocalesText")
      helpers-markup(lang="js")
        | import Vuetify from 'vuetify'
        |
        | // Translation provided by Vuetify (javascript)
        | import zhHans from 'vuetify/es5/locale/zh-Hans'
        |
        | // Translation provided by Vuetify (typescript)
        | import pl from 'vuetify/src/locale/pl'
        |
        | // Your own translation file
        | import sv from './i18n/vuetify/sv'
        |
        | Vue.use(Vuetify, {
        |   lang: {
        |     locales: { 'zh-Hans': zhHans, pl, sv },
        |     current: 'zh-Hans'
        |   }
        | })
        |
        | ...
        |
        | Vue.component('my-component', {
        |   methods: {
        |     changeLocale () {
        |       this.$vuetify.lang.current = 'sv'
        |     }
        |   }
        |})

    section#create-translation
      helpers-section-head(value="Framework.Internationalization.createTranslation")
      helpers-section-text(value="Framework.Internationalization.createTranslationText")

      helpers-markup(lang="js")
        | export default {{ enLocale }}

    section#custom-components
      helpers-section-head(value="Framework.Internationalization.customComponents")
      helpers-section-text(value="Framework.Internationalization.customComponentsText")

      helpers-markup(lang="vue")
        | <template>
        |   <div class="my-component">
        |     {{ '{{ $vuetify.t(\'my-component.text\') \}\}' }}
        |   </div>
        | </template>

    section#vue-i18n
      helpers-section-head(value="Framework.Internationalization.vueI18nHeader")
      helpers-section-text(value="Framework.Internationalization.vueI18nText1")
      helpers-section-text(value="Framework.Internationalization.vueI18nText2")

      helpers-markup(lang="js")
        | import VueI18n from 'vue-i18n'

        | Vue.use(VueI18n)

        | const messages = {
        |   en: {
        |     $vuetify: {
        |       dataIterator: {
        |         rowsPerPageText: 'Items per page:',
        |         pageText: '{0}-{1} of {2}'
        |       }
        |     },
        |   },
        |   sv: {
        |     $vuetify: {
        |       dataIterator: {
        |         rowsPerPageText: 'Element per sida:',
        |         pageText: '{0}-{1} av {2}'
        |       }
        |     },
        |   }
        | }

        | // Create VueI18n instance with options
        | const i18n = new VueI18n({
        |   locale: 'sv', // set locale
        |   messages, // set locale messages
        | })

        | Vue.use(Vuetify, {
        |   lang: {
        |     t: (key, ...params) => i18n.t(key, params)
        |   }
        | })

    section#rtl
      helpers-section-head(value="Framework.Internationalization.rtlHeader")
      helpers-section-text(value="Framework.Internationalization.rtlText1")

      helpers-markup(lang="js")
        | import Vue from 'vue'
        | import Vuetify from 'vuetify'
        |
        | Vue.use(Vuetify, {
        |   rtl: true
        | })

      helpers-section-text(value="Framework.Internationalization.rtlText2")
</template>

<script>
  import enLocale from 'vuetify/es5/locale/en'

  export default {
    data: vm => ({
      enLocale,
      headers: [
        { value: 'name', size: 1 },
        { value: 'default', size: 7 },
        { value: 'type', size: 4 }
      ],
      items: [
        {
          name: 'locales',
          default: '{ en: VuetifyLocale }',
          type: 'Record<string, VuetifyLocale>'
        },
        {
          name: 'current',
          default: 'en',
          type: 'string'
        },
        {
          name: 't',
          default: '(key: string, ...params: Array<string | number>): string',
          type: 'Function'
        }
      ]
    })
  }
</script>

<template lang="pug">
  views-doc
    section#api
      helpers-section-head(value="Generic.Pages.api")
      v-card(class="mb-5")
        div(class="py-1")
          helpers-parameters(
            :headers="headers"
            :items="items"
            namespace="Guides"
            type="Internationalization"
            target="api"
          )

    section#getting-started
      helpers-section-head(value="Framework.Internationalization.gettingStarted")
      helpers-section-text(value="Framework.Internationalization.gettingStartedText")
      helpers-section-text(value="Framework.Internationalization.availableLocalesText")
      helpers-markup(lang="js")
        | import Vuetify from 'vuetify'
        |
        | // Translation provided by Vuetify (javascript)
        | import zhHans from 'vuetify/es5/locale/zh-Hans'
        |
        | // Translation provided by Vuetify (typescript)
        | import pl from 'vuetify/src/locale/pl'
        |
        | // Your own translation file
        | import sv from './i18n/vuetify/sv'
        |
        | Vue.use(Vuetify, {
        |   lang: {
        |     locales: { zhHans, pl, sv },
        |     current: 'zhHans'
        |   }
        | })
        |
        | ...
        |
        | Vue.component('my-component', {
        |   methods: {
        |     changeLocale () {
        |       this.$vuetify.lang.current = 'sv'
        |     }
        |   }
        |})

    section#create-translation
      helpers-section-head(value="Framework.Internationalization.createTranslation")
      helpers-section-text(value="Framework.Internationalization.createTranslationText")

      helpers-markup(lang="js")
        | export default {{ enLocale }}

    section#custom-components
      helpers-section-head(value="Framework.Internationalization.customComponents")
      helpers-section-text(value="Framework.Internationalization.customComponentsText")

      helpers-markup(lang="vue")
        | <template>
        |   <div class="my-component">
        |     {{ '{{ $vuetify.t(\'my-component.text\') \}\}' }}
        |   </div>
        | </template>

    section#vue-i18n
      helpers-section-head(value="Framework.Internationalization.vueI18nHeader")
      helpers-section-text(value="Framework.Internationalization.vueI18nText1")
      helpers-section-text(value="Framework.Internationalization.vueI18nText2")

      helpers-markup(lang="js")
        | import VueI18n from 'vue-i18n'

        | Vue.use(VueI18n)

        | const messages = {
        |   en: {
        |     $vuetify: {
        |       dataIterator: {
        |         rowsPerPageText: 'Items per page:',
        |         pageText: '{0}-{1} of {2}'
        |       }
        |     },
        |   },
        |   sv: {
        |     $vuetify: {
        |       dataIterator: {
        |         rowsPerPageText: 'Element per sida:',
        |         pageText: '{0}-{1} av {2}'
        |       }
        |     },
        |   }
        | }

        | // Create VueI18n instance with options
        | const i18n = new VueI18n({
        |   locale: 'sv', // set locale
        |   messages, // set locale messages
        | })

        | Vue.use(Vuetify, {
        |   lang: {
        |     t: (key, ...params) => i18n.t(key, params)
        |   }
        | })

    section#rtl
      helpers-section-head(value="Framework.Internationalization.rtlHeader")
      helpers-section-text(value="Framework.Internationalization.rtlText1")

      helpers-markup(lang="js")
        | import Vue from 'vue'
        | import Vuetify from 'vuetify'
        |
        | Vue.use(Vuetify, {
        |   rtl: true
        | })

      helpers-section-text(value="Framework.Internationalization.rtlText2")
</template>

<script>
  import enLocale from 'vuetify/es5/locale/en'

  export default {
    data: vm => ({
      enLocale,
      headers: [
        { value: 'name', size: 1 },
        { value: 'default', size: 7 },
        { value: 'type', size: 4 }
      ],
      items: [
        {
          name: 'locales',
          default: '{ en: VuetifyLocale }',
          type: 'Record<string, VuetifyLocale>'
        },
        {
          name: 'current',
          default: 'en',
          type: 'string'
        },
        {
          name: 't',
          default: '(key: string, ...params: Array<string | number>): string',
          type: 'Function'
        }
      ]
    })
  }
</script>


修改添加文章页面

修改添加文章页面

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/3tnet/t-cms.git/'


slight tweak to link

slight tweak to link

<template>

No Content Channels Available

Download content channels from the Content Management page

You need to log in as an administrator to manage your content channels.

</template>

<template>

No Content Channels Available

Download content channels from the Manage Content Page.

You need to log in as an administrator to manage your content channels.

</template>


add new toolbar component

add new toolbar component

<template>

PWA Builder

      <button id="manifestButton">Manifest</button>
      <button id="helpButton">Help</button>

</template>

error: pathspec 'components/Toolbar.vue' did not match any file(s) known to git


增加affix组件

增加affix组件

<template>
  <div>
    <div v-bind:class="{'affix': affixed}"
         v-bind:style="styles">
      <slot></slot>
    </div>
  </div>
</template>

<script>
  export default {
    props: {
      offset: {
        type: Number,
        default: 0
      }
    },
    data () {
      return {
        affixed: false,
        styles: {},
        flag: null
      }
    },
    methods: {
      scrolling () {
        const scrollTop = this.getScroll(window, true)
        const elementOffset = this.getOffset(this.$el)

        if (!this.affixed && scrollTop > elementOffset.top) {
          this.affixed = true
          this.styles = {
            top: this.offset + 'px',
            left: elementOffset.left + 'px',
            width: this.$el.offsetWidth + 'px'
          }
        }
        if (this.affixed && scrollTop < elementOffset.top) {
          this.affixed = false
          this.styles = {}
        }
      },
      getScroll (w, top) {
        let ret = w['page' + (top ? 'Y' : 'X') + 'Offset']
        const method = 'scroll' + (top ? 'Top' : 'Left')
        if (typeof ret !== 'number') {
          const d = w.document
          // ie6,7,8 standard mode
          ret = d.documentElement[method]
          if (typeof ret !== 'number') {
            // quirks mode
            ret = d.body[method]
          }
        }
        return ret
      },
      getOffset (element) {
        const rect = element.getBoundingClientRect()
        const body = document.body
        const clientTop = element.clientTop || body.clientTop || 0
        const clientLeft = element.clientLeft || body.clientLeft || 0
        const scrollTop = this.getScroll(window, true)
        const scrollLeft = this.getScroll(window)
        return {
          top: rect.top + scrollTop - clientTop,
          left: rect.left + scrollLeft - clientLeft
        }
      },
      delay () {
        // 优化滚动
        if (this.flag) {
          clearTimeout(this.flag)
          this.flag = null
        } else {
          this.flag = setTimeout(this.scrolling, 14)
        }
      }

    },
    ready () {
      window.addEventListener('scroll', this.delay)
      window.addEventListener('resize', this.delay)
    },
    destroyed () {
      window.removeEventListener('scroll', this.delay)
      window.removeEventListener('resize', this.delay)
    }

  }
</script>

<style lang="scss">
.affix {
  position: fixed;
}
</style>

error: pathspec 'src/components/Affix.vue' did not match any file(s) known to git


Rights management (#60)

Rights management (#60)

* Display user's rights

* Right deletion

* Right addition and modification

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/buckless-team/admin.git/'


Adjust the height when choosing different text note to edit in annotation module


Select: exec removeResizeListener in beforeDestroy hook, fixed #3797

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/iamnewsea/element-pzx.git/'


feat: create va-file-upload demo

feat: create va-file-upload demo

<template>
  <VbDemo class="file-upload">
      <VbCard title="basic">
        <va-file-upload v-model="basic" type="single"/>
      </VbCard>
      <VbCard :title="$t('fileUpload.advancedMediaGallery')">
        <va-file-upload
          type="gallery"
          :file-types="'.png, .jpg, .jpeg, .gif'"
          dropzone
          v-model="advancedGallery"
        />
      </VbCard>
      <VbCard :title="$t('fileUpload.advancedUploadList')">
        <va-file-upload
          dropzone
          v-model="advancedList"
        />
      </VbCard>
      <VbCard :title="$t('fileUpload.single')">
        <va-file-upload
          type="single"
          v-model="single"
        />
      </VbCard>
      <VbCard :title="$t('fileUpload.mediaGallery')">
        <va-file-upload
          type="gallery"
          :file-types="'.png, .jpg, .jpeg, .gif'"
          v-model="gallery"
        />
      </VbCard>
      <VbCard :title="$t('fileUpload.uploadList')">
        <va-file-upload
          v-model="list"
        />
      </VbCard>
  </VbDemo>
</template>

<script>
import VaFileUpload from './VaFileUpload'
export default {
  components: { VaFileUpload },
  data () {
    return {
      basic: [],
      advancedGallery: [],
      advancedList: [],
      single: [],
      gallery: [],
      list: [],
    }
  },
}
</script>

error: pathspec 'src/vuestic-theme/vuestic-components/va-file-upload/VaFileUpload.demo.vue' did not match any file(s) known to git


Remove hover

Remove hover


Exam fix

Exam fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JimmehCai/VTIC.git/'


Change back title of main page

Change back title of main page

It reflects better what the website primary purpose is. Choose ingredients, make cocktails

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/barprive/barprive.com.git/'


Removes bounceIn

Removes bounceIn

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NathanielDavid/Sumie.git/'


Update FAQ page

Update FAQ page

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/wappulehti-apy/diilikone-front-2017.git/'


[refactor] Ported react filesize component to vue

<template>

    <span v-if="size == null || size < 0">

        {{ formattedSize }}

        {{ formattedUnits }}

</template>

error: pathspec 'src/components/filesize.vue' did not match any file(s) known to git


Fix blog sidebar styling for smaller devices

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mplusmuseum/mplusmuseum-stories.git/'


List Button

List Button

<script>
  import Utils from '../utils/utils';

  export default {
    render(c) {
      const self = this;
      const linkEl = c('a', {
        staticClass: 'item-link list-button',
        attrs: self.attrs,
        class: self.classes,
        on: {
          click: self.onClick,
        },
      }, [self.title, self.$slots.default]);
      return c('li', {}, [linkEl]);
    },
    props: {
      title: [String, Number],
      link: [Boolean, String],
      href: [Boolean, String],
      tabindex: [Number, String],
      external: Boolean,
      back: Boolean,
      linkBack: Boolean,
      noFastclick: Boolean,

      color: String,
      rippleColor: String,
      textColor: String,

      // Router
      force: Boolean,
      reload: Boolean,
      animate: Boolean,
      ignoreCache: Boolean,
      pageName: String,
      template: String,

      // View
      view: String,

      // Panel
      panelOpen: [Boolean, String],
      panelClose: [Boolean, String],

      // Popup
      popupOpen: [Boolean, String],
      popupClose: [Boolean, String],

      // Popover
      popoverOpen: [Boolean, String],
      popoverClose: [Boolean, String],

      // Login Screen
      loginScreenOpen: [Boolean, String],
      loginScreenClose: [Boolean, String],

      // Picker
      sheetOpen: [Boolean, String],
      sheetClose: [Boolean, String],

      // Tab
      tabLink: [Boolean, String],

      // Sortable
      sortableEnable: [Boolean, String],
      sortableDisable: [Boolean, String],
      sortableToggle: [Boolean, String],
    },
    computed: {
      attrs() {
        const self = this;
        // Link Props
        const {
          link,
          href,
          force,
          reloadCurrent,
          reloadAll,
          reloadPrevious,
          animate,
          ignoreCache,
          target,
          view,
          panelOpen,
          popupOpen,
          popupClose,
          popoverOpen,
          popoverClose,
          loginScreenOpen,
          loginScreenClose,
          sheetOpen,
          sheetClose,
          sortableEnable,
          sortableDisable,
          sortableToggle,
          tabLink,
        } = self;

        const ao = {
          href: ((typeof link === 'boolean' && typeof href === 'boolean') ? '#' : (link || href)),
          target,
          'data-force': force,
          'data-reload-current': reloadCurrent,
          'data-reload-all': reloadAll,
          'data-reload-previous': reloadPrevious,
          'data-animate': ('animate' in self.$options.propsData) ? animate.toString() : undefined,
          'data-ignore-cache': ignoreCache,
          'data-view': Utils.isStringProp(view) ? view : false,
          'data-panel': Utils.isStringProp(panelOpen),
          'data-tab': Utils.isStringProp(tabLink),
        };

        if (Utils.isStringProp(popupOpen)) ao['data-popup'] = popupOpen;
        if (Utils.isStringProp(popoverOpen)) ao['data-popover'] = popoverOpen;
        if (Utils.isStringProp(sheetOpen)) ao['data-sheet'] = sheetOpen;
        if (Utils.isStringProp(loginScreenOpen)) ao['data-login-screen'] = loginScreenOpen;
        if (Utils.isStringProp(sortableEnable)) ao['data-sortable'] = sortableEnable;
        if (Utils.isStringProp(sortableToggle)) ao['data-sortable'] = sortableToggle;

        if (Utils.isStringProp(popupClose)) ao['data-popup'] = popupClose;
        if (Utils.isStringProp(popoverClose)) ao['data-popover'] = popoverClose;
        if (Utils.isStringProp(sheetClose)) ao['data-picker'] = sheetClose;
        if (Utils.isStringProp(loginScreenClose)) ao['data-login-screen'] = loginScreenClose;
        if (Utils.isStringProp(sortableDisable)) ao['data-sortable'] = sortableDisable;

        return ao;
      },
      classes() {
        const self = this;

        const {
          external,
          back,
          linkBack,
          noFastclick,
          panelOpen,
          panelClose,
          popupOpen,
          popupClose,
          popoverOpen,
          popoverClose,
          loginScreenOpen,
          loginScreenClose,
          sheetOpen,
          sheetClose,
          sortableEnable,
          sortableDisable,
          sortableToggle,
          tabLink,
          rippleColor,
          color,
          textColor,
        } = self;

        const co = {
          external,
          back: back || linkBack,
          [`color-${color}`]: color,
          [`ripple-color-${rippleColor}`]: rippleColor,
          [`text-color-${textColor}`]: textColor,
          'tab-link': tabLink || tabLink === '',
          'no-fastclick': noFastclick,
          'panel-close': Utils.isTrueProp(panelClose),
          'panel-open': panelOpen || panelOpen === '',
          'popup-close': Utils.isTrueProp(popupClose),
          'popup-open': popupOpen || popupOpen === '',
          'popover-close': Utils.isTrueProp(popoverClose),
          'popover-open': popoverOpen || popoverOpen === '',
          'sheet-close': Utils.isTrueProp(sheetClose),
          'sheet-open': sheetOpen || sheetOpen === '',
          'login-screen-close': Utils.isTrueProp(loginScreenClose),
          'login-screen-open': loginScreenOpen || loginScreenOpen === '',
          'sortable-enable': Utils.isTrueProp(sortableEnable),
          'sortable-disable': Utils.isTrueProp(sortableDisable),
          'sortable-toggle': Utils.isTrueProp(sortableToggle),
        };

        return co;
      },
    },
    methods: {
      onClick(event) {
        this.$emit('click', event);
      },
    },
  };
</script>

error: pathspec 'src/components/list-button.vue' did not match any file(s) known to git


Step support for questions

Step support for questions

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JosefFriedrich-nodejs/baldr.git/'


Paginated Prepared Shipment

Paginated Prepared Shipment

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/modum-io/web.git/'


get groups list in hook beforeRouteEnter, and add progress status

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/notadd/administration.git/'


Adding event bus notification into the Loader.


Prevent names and cities from wrapping.

Prevent names and cities from wrapping.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ux4c/ux4c-admin.git/'


updated timeout into just init

updated timeout into just init

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stephane/vuetify.git/'


Routes to Signin view

Routes to Signin view


add footer component.

add footer component.

<template>

© Copyright 2017.

</template>

error: pathspec 'src/components/Footnotes.vue' did not match any file(s) known to git


Add vertical-align middle for flavored text and math

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tum-rt/web-quiz.git/'


- switch back to transparent border on open dropdown toggle - pull font-family up to .v-select - add default box-shadow and background to dropdown menu

<template>

        {{ getOptionLabel(option) }}
        <button v-if="multiple" @click="deselect(option)" type="button" class="close">
          ×
        </button>

      <input
              ref="search"
              v-model="search"
              @keydown.delete="maybeDeleteValue"
              @keyup.esc="onEscape"
              @keydown.up.prevent="typeAheadUp"
              @keydown.down.prevent="typeAheadDown"
              @keyup.enter.prevent="typeAheadSelect"
              @blur="onSearchBlur"
              @focus="onSearchFocus"
              type="search"
              class="form-control"
              :placeholder="searchPlaceholder"
              :readonly="!searchable"
              :style="{ width: isValueEmpty ? '100%' : 'auto' }"
      >

      <slot name="spinner">

Loading...

      </slot>

    <transition :name="transition">

            {{ getOptionLabel(option) }}

          <slot name="no-options">Sorry, no matching options.</slot>

    </transition>

</template>