page-toc-item.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <template lang="pug">
  2. div
  3. template(v-if='level >= minTocLevel')
  4. v-list-item(@click='click(item.anchor)', v-if='(item.children.length === 0 && tocCollapseLevel > level) || tocCollapseLevel > level',
  5. :key='item.anchor', :class='isNestedLevel ? `pl-9` : `pl-6`')
  6. v-icon.pl-0(small, color='grey lighten-1') {{ $vuetify.rtl ? `mdi-chevron-left` : `mdi-chevron-right` }}
  7. v-list-item-title.pl-4(v-bind:class='titleClasses') {{item.title}}
  8. v-list-group(sub-group, v-else, v-bind:class='{"pl-3": isNestedLevel}')
  9. template(v-slot:activator)
  10. v-list-item.pl-0(@click='click(item.anchor)', :key='item.anchor')
  11. v-list-item-title(v-bind:class='titleClasses') {{item.title}}
  12. template(v-if='item.children.length !== 0', v-for='subItem in item.children')
  13. page-toc-item(:item='subItem', :level='level + 1', :tocLevel='tocLevel', :minTocLevel='minTocLevel', :tocCollapseLevel='tocCollapseLevel')
  14. template(v-if='tocCollapseLevel > level', v-for='subItem in item.children')
  15. page-toc-item(:item='subItem', :level='level + 1', :tocLevel='tocLevel', :minTocLevel='minTocLevel', :tocCollapseLevel='tocCollapseLevel')
  16. template(v-else, v-for='subItem in item.children')
  17. page-toc-item(:item='subItem', :level='level + 1', :tocLevel='tocLevel', :minTocLevel='minTocLevel', :tocCollapseLevel='tocCollapseLevel')
  18. </template>
  19. <script>
  20. export default {
  21. name: 'PageTocItem',
  22. props: {
  23. item: {
  24. type: Object,
  25. default: () => {}
  26. },
  27. minTocLevel: {
  28. type: Number,
  29. default: 0
  30. },
  31. tocLevel: {
  32. type: Number,
  33. default: 2
  34. },
  35. tocCollapseLevel: {
  36. type: Number,
  37. default: 2
  38. },
  39. level: {
  40. type: Number,
  41. default: 1
  42. }
  43. },
  44. data() {
  45. return {
  46. scrollOpts: {
  47. duration: 1500,
  48. offset: 0,
  49. easing: 'easeInOutCubic'
  50. }
  51. }
  52. },
  53. computed: {
  54. isNestedLevel() {
  55. return this.level > this.minTocLevel
  56. },
  57. titleClasses() {
  58. return {
  59. 'caption': this.isNestedLevel,
  60. 'grey--text': this.isNestedLevel,
  61. 'text--lighten-1': this.$vuetify.theme.dark && this.isNestedLevel,
  62. 'text--darken-1': !this.$vuetify.theme.dark && this.isNestedLevel
  63. }
  64. }
  65. },
  66. methods: {
  67. click (anchor) {
  68. this.$vuetify.goTo(anchor, this.scrollOpts)
  69. }
  70. }
  71. }
  72. </script>
  73. <style lang='scss'>
  74. // Hack to fix animations of multi level nesting v-list-group
  75. .v-list-group--sub-group.v-list-group--active .v-list-item:not(.v-list-item--active) .v-list-item__icon.v-list-group__header__prepend-icon .v-icon {
  76. transform: rotate(0deg)!important;
  77. }
  78. </style>