123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <template lang="html">
- <div class="page" :class="'page-' + slug">
- <div class="btn-close-wrapper">
- <button-close @click="$emit('close')" />
- </div>
- <div class="page-wrapper" v-html="page.content" />
- </div>
- </template>
- <script>
- export default {
- name: 'PageView',
- props: {
- page: { type: Object, default: undefined },
- slug: { type: String, required: true }
- },
- methods: {
- addFootnotes () {
- const links = this.$el.querySelectorAll('.page-wrapper a')
- links.forEach((link, i) => {
- const number = parseInt(link.hash.replace('#', ''))
- if (!isNaN(number) && this.page.notes.find(note => note.number === number)) {
- link.classList.add('page-footnote-link')
- link.id = `footnote-${this.slug}-${number}`
- link.setAttribute('href', 'javascript:;')
- link.dataset.number = number
- link.textContent = i + 1
- if (link.parentElement.nodeName === 'SUP') {
- link.parentElement.replaceWith(link)
- }
- link.onclick = this.onFootnoteLinkClick
- this.addFootnoteContent(link, number)
- }
- })
- },
- addFootnoteContent (link, i) {
- const noteContainer = document.createElement('DIV')
- noteContainer.classList.add('page-footnote-content')
- noteContainer.id = link.id + '-content'
- noteContainer.innerHTML = this.page.notes.find(note => note.number === i).content
- link.insertAdjacentElement('afterend', noteContainer)
- },
- onFootnoteLinkClick (e) {
- const container = document.getElementById(e.target.id + '-content')
- if (container) {
- container.classList.toggle('show')
- }
- }
- },
- mounted () {
- if (this.page.notes) this.addFootnotes()
- }
- }
- </script>
- <style lang="scss">
- .page {
- font-size: 1rem;
- position: relative;
- .btn-close-wrapper {
- position: sticky;
- z-index: 2;
- float: right;
- height: 0;
- right: 0;
- top: $node-view-spacer-sm-y;
- @include media-breakpoint-up($size-bp) {
- top: $node-view-spacer-y;
- }
- .btn-close {
- position: absolute;
- padding: 0.5rem;
- width: 2.25rem;
- height: 2.25rem;
- top: -.5rem;
- right: -.5rem;
- background-color: $white;
- }
- }
- @include media-breakpoint-up($size-bp) {
- font-size: 1.5rem;
- }
- padding: $node-view-spacer-sm-y $node-view-spacer-sm-x;
- @include media-breakpoint-up($size-bp) {
- padding: $node-view-spacer-y $node-view-spacer-x;
- }
- p {
- margin-bottom: 1em;
- }
- blockquote {
- margin: 0 0 50px 50px;
- @include media-breakpoint-up($size-bp) {
- margin: 50px 0 110px 180px;
- }
- }
- &-footnote-link {
- display: inline-block;
- text-align: center;
- background-color: $black;
- color: $white;
- font-weight: $font-weight-bold;
- font-size: 0.8em;
- font-style: normal;
- text-decoration: none;
- border-radius: 1em;
- padding: 0 .5em;
- min-width: 1.25em;
- max-height: 1.4em;
- margin: 0 .2em;
- &:hover,
- &:active {
- color: $white;
- text-decoration: none;
- }
- }
- &-footnote-content {
- background-color: $black;
- color: $white;
- font-size: 1.5rem;
- font-style: normal;
- padding: $node-view-spacer-sm-y $node-view-spacer-sm-x;
- margin: $node-view-spacer-sm-y 0;
- @include media-breakpoint-up($size-bp) {
- padding: $node-view-spacer-y $node-view-spacer-x;
- margin: $node-view-spacer-y 0;
- }
- // @include media-breakpoint-up(lg) {
- // max-width: 50%;
- // }
- &:not(.show) {
- display: none;
- }
- p:last-of-type {
- margin-bottom: 0;
- }
- blockquote {
- margin: 0 0 1em 2em;
- }
- }
- }
- </style>
|