Timeline.vue 3.87 KB
<template>
  <div class="timeline-wrapper">
    <ul class="timeline-content">
      <MyTransition>
        <li class="desc">{{ hint }}</li>
      </MyTransition>
      <Anchor :items="anchorConfig" />
      <MyTransition
        v-for="(item, index) in $timeline"
        :key="index"
        :delay="0.08 * (index + 1)"
      >
        <li>
          <h3 :id="item.year" class="year">
            <span>{{ item.year }}</span>
          </h3>
          <ul class="year-wrapper">
            <li
              v-for="(article, articleIndex) in item.articles"
              :key="articleIndex"
            >
              <span class="date">{{ article.frontmatter.parsedDate }}</span>
              <span class="title" @click="navigate(article.path)">
                {{ article.title }}
              </span>
            </li>
          </ul>
        </li>
      </MyTransition>
    </ul>
  </div>
</template>

<script src="./Timeline" />

<style lang="stylus">
.timeline-wrapper
  max-width 740px
  margin 0 auto
  padding 40px 0
  --dot-color #fff
  --dot-bar-color #eaecef
  --dot-border-color #ddd

  .theme-dark &
    --dot-color #444
    --dot-bar-color #333
    --dot-border-color #555

  #anchor
    left unset
    right 0
    min-width 0

  .anchor-wrapper
    position relative
    z-index 10

  .timeline-content
    box-sizing border-box
    position relative
    padding-left 76px
    list-style none

    &::after
      content ' '
      position absolute
      top 14px
      left 64px
      z-index -1
      width 4px
      height calc(100% - 38px)
      margin-left -2px
      background var(--dot-bar-color)

    .desc
      position relative
      color var(--text-color)
      font-size 18px

      @media (min-width $MQNormal)
        font-size 20px

      &:before
        content ' '
        position absolute
        z-index 2
        left -12px
        top 50%
        width 8px
        height 8px
        margin-left -6px
        margin-top -6px
        background var(--dot-color)
        border 2px solid var(--dot-border-color)
        border-radius 50%

    .year
      margin-top 0.5rem - $navbarHeight
      margin-bottom 0.5rem
      padding-top: ($navbarHeight + 3rem)
      color var(--text-color)
      font-size 26px
      font-weight 700

      span
        position relative

        &:before
          content ' '
          position absolute
          z-index 2
          left -12px
          top 50%
          width 8px
          height 8px
          margin-left -6px
          margin-top -6px
          background var(--dot-color)
          border 2px solid var(--dot-border-color)
          border-radius 50%

    .year-wrapper
      padding-left 0 !important

      li
        position relative
        display flex
        padding 30px 0 10px
        border-bottom 1px dashed var(--border-color)
        list-style none

        &:hover
          cursor pointer

          .date
            font-size 16px
            transition font-size 0.3s ease-out

            &::before
              background-color var(--bgcolor)
              border-color var(--accent-color)

          .title
            color var(--accent-color)
            font-size 18px
            transition font-size 0.3s ease-out

        .date
          position absolute
          right calc(100% + 24px)
          text-align right
          width 40px
          font-size 14px
          line-height 30px

          &::before
            content ' '
            position absolute
            z-index 2
            right -16px
            top 50%
            width 6px
            height 6px
            margin-left -6px
            margin-top -6px
            background var(--dot-color)
            border 2px solid var(--dot-border-color)
            border-radius 50%

        .title
          position relative
          font-size 16px
          line-height 30px

@media (max-width $MQMobile)
  .timeline-wrapper
    margin 0 1.2rem
</style>
D