paginar 0.3.4 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +288 -236
- package/dist/index.es.js +684 -244
- package/dist/index.es.js.map +1 -1
- package/dist/style.css +63 -0
- package/package.json +6 -3
- package/.editorconfig +0 -13
- package/.env +0 -1
- package/.vscode/extensions.json +0 -3
- package/demo/slot/slot-chapter1.html +0 -384
- package/demo/slot/slot-chapter2.html +0 -366
- package/demo/slot/slot-chapter3.html +0 -265
- package/demo/summary/_content/1chapter.html +0 -100
- package/demo/summary/_content/2chapter.html +0 -311
- package/demo/summary/_content/3chapter.html +0 -211
- package/demo/summary/index.html +0 -134
- package/index.html +0 -18
- package/postcss.config.js +0 -7
- package/public/favicon.ico +0 -0
- package/src/App.ce.vue +0 -166
- package/src/assets/main.css +0 -392
- package/src/components/BookContent.vue +0 -23
- package/src/components/EngineWrapper.vue +0 -15
- package/src/components/FooterSlot.vue +0 -32
- package/src/components/FootnotesAside.vue +0 -123
- package/src/components/HeaderSlot/HeaderSlot.vue +0 -30
- package/src/components/HeaderSlot/OptionsButton/OptionsButton.vue +0 -67
- package/src/components/HeaderSlot/OptionsButton/OptionsColor.vue +0 -28
- package/src/components/HeaderSlot/OptionsButton/OptionsColumns.vue +0 -51
- package/src/components/HeaderSlot/OptionsButton/OptionsDropdown.vue +0 -59
- package/src/components/HeaderSlot/OptionsButton/OptionsFontFamily.vue +0 -17
- package/src/components/HeaderSlot/OptionsButton/OptionsFontSize.vue +0 -17
- package/src/components/HeaderSlot/SummaryButton/SummaryButton.vue +0 -74
- package/src/components/HeaderSlot/SummaryButton/SummaryDropdown.vue +0 -30
- package/src/components/NavigationButton.vue +0 -34
- package/src/components/ReaderWrapper.vue +0 -37
- package/src/components/ReferencePopup.vue +0 -36
- package/src/components/icons/Close.vue +0 -6
- package/src/components/icons/DoubleColumn.vue +0 -15
- package/src/components/icons/Expand.vue +0 -7
- package/src/components/icons/Eye.vue +0 -9
- package/src/components/icons/Footnote.vue +0 -5
- package/src/components/icons/Home.vue +0 -6
- package/src/components/icons/Moon.vue +0 -5
- package/src/components/icons/Notes.vue +0 -5
- package/src/components/icons/SingleColumn.vue +0 -3
- package/src/components/icons/Summary.vue +0 -10
- package/src/components/icons/Sun.vue +0 -5
- package/src/components/icons/ThreeDots.vue +0 -8
- package/src/composables/useBrowser.js +0 -16
- package/src/composables/useEstimatePages.js +0 -31
- package/src/composables/useFootnotes.js +0 -50
- package/src/composables/usePagination.js +0 -125
- package/src/composables/useReaderSettings.js +0 -174
- package/src/composables/useReferences.js +0 -67
- package/src/composables/useStyles.js +0 -60
- package/src/composables/useTextContent.js +0 -113
- package/src/main.js +0 -19
- package/src/tailwind.css +0 -1082
- package/tailwind.config.js +0 -16
- package/vite.config.js +0 -36
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
import IconSun from '../../icons/Sun.vue'
|
|
3
|
-
import IconMoon from '../../icons/Moon.vue'
|
|
4
|
-
|
|
5
|
-
import useReaderSettings from '../../../composables/useReaderSettings'
|
|
6
|
-
const { mode, setMode } = useReaderSettings
|
|
7
|
-
|
|
8
|
-
</script>
|
|
9
|
-
|
|
10
|
-
<template>
|
|
11
|
-
<button id="lightmode-button" @click.prevent="setMode('light')"
|
|
12
|
-
title="Leitura diurna"
|
|
13
|
-
class="font-light text-base border w-full h-10 flex justify-center items-center"
|
|
14
|
-
:class="{
|
|
15
|
-
'bg-primary-extralight text-primary border-2 border-primary': mode === 'light'
|
|
16
|
-
}">
|
|
17
|
-
<IconSun class="w-5 h-5" />
|
|
18
|
-
</button>
|
|
19
|
-
|
|
20
|
-
<button id="darkmode-button" @click.prevent="setMode('dark')"
|
|
21
|
-
title="Leitura noturna"
|
|
22
|
-
class="font-light text-base border w-full h-10 flex justify-center items-center"
|
|
23
|
-
:class="{
|
|
24
|
-
'bg-primary-extralight text-primary border-2 border-primary': mode === 'dark'
|
|
25
|
-
}">
|
|
26
|
-
<IconMoon class="w-5 h-5" />
|
|
27
|
-
</button>
|
|
28
|
-
</template>
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
import { computed } from 'vue'
|
|
3
|
-
import { useWindowSize } from '@vueuse/core'
|
|
4
|
-
|
|
5
|
-
import SingleColumn from '../../icons/SingleColumn.vue'
|
|
6
|
-
import DoubleColumn from '../../icons/DoubleColumn.vue'
|
|
7
|
-
|
|
8
|
-
import useReaderSettings from '../../../composables/useReaderSettings'
|
|
9
|
-
const { columns, setColumns } = useReaderSettings
|
|
10
|
-
const { width } = useWindowSize()
|
|
11
|
-
|
|
12
|
-
const isSafari = computed(() => {
|
|
13
|
-
const ua = navigator.userAgent.toLowerCase()
|
|
14
|
-
return ua.indexOf('safari') !== -1 && ua.indexOf('chrome') === -1
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
</script>
|
|
18
|
-
|
|
19
|
-
<template>
|
|
20
|
-
<div id="columns-menu" class="w-full hidden md:grid grid-cols-3 gap-2 mt-3">
|
|
21
|
-
<button
|
|
22
|
-
id="single-column-button"
|
|
23
|
-
class="col-span-1 text-primary text-center cursor-pointer py-3 rounded-sm border"
|
|
24
|
-
:class="{
|
|
25
|
-
'border-gray-300': columns !== 'single',
|
|
26
|
-
'bg-primary-extralight border-2 border-primary': columns === 'single',
|
|
27
|
-
'opacity-30 cursor-default': isSafari
|
|
28
|
-
}"
|
|
29
|
-
@click.prevent="!isSafari ? setColumns('single') : null"
|
|
30
|
-
aria-label="Coluna única"
|
|
31
|
-
:title="isSafari ? 'O navegador Safari não aceita visualização de coluna única.' : 'Coluna única'"
|
|
32
|
-
>
|
|
33
|
-
<SingleColumn class="mx-auto h-10 opacity-75" />
|
|
34
|
-
</button>
|
|
35
|
-
|
|
36
|
-
<button
|
|
37
|
-
id="double-column-button"
|
|
38
|
-
class="col-span-2 text-primary text-center cursor-pointer py-3 rounded-sm border"
|
|
39
|
-
:class="{
|
|
40
|
-
'border-gray-300': columns !== 'double',
|
|
41
|
-
'bg-primary-extralight border-2 border-primary': columns === 'double',
|
|
42
|
-
'opacity-30': width < 1024
|
|
43
|
-
}"
|
|
44
|
-
@click.prevent="width >= 1024 && setColumns('double')"
|
|
45
|
-
aria-label="Coluna dupla"
|
|
46
|
-
title="Coluna dupla"
|
|
47
|
-
>
|
|
48
|
-
<DoubleColumn name="DoubleColumn" class="mx-auto h-10 divide-opacity-75" />
|
|
49
|
-
</button>
|
|
50
|
-
</div>
|
|
51
|
-
</template>
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
import IconEye from '../../icons/Eye.vue'
|
|
3
|
-
import IconFootnote from '../../icons/Footnote.vue'
|
|
4
|
-
|
|
5
|
-
import OptionsColumns from './OptionsColumns.vue';
|
|
6
|
-
import OptionsFontFamily from './OptionsFontFamily.vue';
|
|
7
|
-
import OptionsFontSize from './OptionsFontSize.vue';
|
|
8
|
-
import OptionsColor from './OptionsColor.vue'
|
|
9
|
-
|
|
10
|
-
import useFootnotes from '../../../composables/useFootnotes'
|
|
11
|
-
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
<template>
|
|
15
|
-
<div class="absolute top-14 py-4 px-3 shadow-lg w-60 md:w-104
|
|
16
|
-
text-areia -right-2 md:right-16 z-10 bg-white
|
|
17
|
-
"
|
|
18
|
-
role="Opções"
|
|
19
|
-
aria-orientation="vertical"
|
|
20
|
-
aria-labelledby="options-menu"
|
|
21
|
-
>
|
|
22
|
-
<div>
|
|
23
|
-
|
|
24
|
-
<slot name="optionsTop" />
|
|
25
|
-
|
|
26
|
-
<div id="footnotes-button">
|
|
27
|
-
<button @click.prevent="useFootnotes.setShowFootnotes(true)"
|
|
28
|
-
class="w-full flex justify-center items-center py-3 lowercase"
|
|
29
|
-
>
|
|
30
|
-
<IconFootnote class="w-6 h-6" />
|
|
31
|
-
<span class="ml-4">Notas de rodapé</span>
|
|
32
|
-
</button>
|
|
33
|
-
|
|
34
|
-
<div class="w-full border-b border-areia my-3"></div>
|
|
35
|
-
</div>
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
<div class="w-full flex justify-center items-center py-3 lowercase"
|
|
39
|
-
id="visualize-title"
|
|
40
|
-
>
|
|
41
|
-
<IconEye class="w-6 h-6" />
|
|
42
|
-
<span class="ml-4">Visualização</span>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
<OptionsColumns />
|
|
46
|
-
<OptionsFontFamily />
|
|
47
|
-
|
|
48
|
-
<div class="w-full grid grid-cols-4 gap-2 my-3">
|
|
49
|
-
|
|
50
|
-
<OptionsFontSize />
|
|
51
|
-
<OptionsColor />
|
|
52
|
-
</div>
|
|
53
|
-
|
|
54
|
-
<div class="hidden w-full border-b border-areia my-8"></div>
|
|
55
|
-
|
|
56
|
-
<slot name="optionsBottom" />
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
</template>
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
import useReaderSettings from '../../../composables/useReaderSettings'
|
|
3
|
-
const { textFont, fontsOptions, setTextFont } = useReaderSettings
|
|
4
|
-
|
|
5
|
-
</script>
|
|
6
|
-
|
|
7
|
-
<template>
|
|
8
|
-
<div id="font-family-menu" class="w-full grid grid-cols-4 gap-2 my-3">
|
|
9
|
-
<button v-for="font in fontsOptions" :key="font.name" @click.prevent="setTextFont(font.name)"
|
|
10
|
-
class="font-light text-lg text-primary tracking-wide border border-urucum w-full h-10 flex justify-center items-center"
|
|
11
|
-
:class="{
|
|
12
|
-
'bg-primary-extralight border-2 border-primary': textFont === font.name
|
|
13
|
-
}" :style="`font-family: ${font.name}`" :title="font.label ?? font.name">
|
|
14
|
-
Ff
|
|
15
|
-
</button>
|
|
16
|
-
</div>
|
|
17
|
-
</template>
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
import useReaderSettings from '../../../composables/useReaderSettings'
|
|
3
|
-
const { fontSize, setFontSize } = useReaderSettings
|
|
4
|
-
|
|
5
|
-
</script>
|
|
6
|
-
|
|
7
|
-
<template>
|
|
8
|
-
<button id="fontsize-add-button" @click.prevent="setFontSize(fontSize + 1)"
|
|
9
|
-
class="font-light text-base border border-urucum w-full h-10 flex justify-center items-center">
|
|
10
|
-
+ A
|
|
11
|
-
</button>
|
|
12
|
-
|
|
13
|
-
<button id="fontsize-subtr-button" @click.prevent="setFontSize(fontSize - 1)"
|
|
14
|
-
class="font-light text-base border border-urucum w-full h-10 flex justify-center items-center">
|
|
15
|
-
- A
|
|
16
|
-
</button>
|
|
17
|
-
</template>
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
import { ref } from 'vue'
|
|
3
|
-
import { onClickOutside, onKeyStroke } from '@vueuse/core'
|
|
4
|
-
|
|
5
|
-
import useReaderSettings from '../../../composables/useReaderSettings'
|
|
6
|
-
|
|
7
|
-
import IconHome from '../../icons/Home.vue'
|
|
8
|
-
import IconClose from '../../icons/Close.vue'
|
|
9
|
-
import IconSummary from '../../icons/Summary.vue'
|
|
10
|
-
import SummaryDropdown from './SummaryDropdown.vue'
|
|
11
|
-
|
|
12
|
-
const show = ref(false)
|
|
13
|
-
const button = ref(null)
|
|
14
|
-
|
|
15
|
-
const { homeUrl } = useReaderSettings
|
|
16
|
-
|
|
17
|
-
const toggleSummary = () => {
|
|
18
|
-
show.value = !show.value
|
|
19
|
-
useReaderSettings.setBlocked(show.value)
|
|
20
|
-
}
|
|
21
|
-
const hide = () => {
|
|
22
|
-
if (!useReaderSettings.blocked.value) {
|
|
23
|
-
show.value = false
|
|
24
|
-
useReaderSettings.setBlocked(false)
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
onClickOutside(button, () => hide())
|
|
29
|
-
onKeyStroke('Escape', () => hide())
|
|
30
|
-
</script>
|
|
31
|
-
|
|
32
|
-
<template>
|
|
33
|
-
<div id="summary-menu" ref="button" class="relative">
|
|
34
|
-
<div class="flex">
|
|
35
|
-
<a v-if="homeUrl"
|
|
36
|
-
:href="homeUrl" title="Homepage" id="home-button"
|
|
37
|
-
class="hidden md:flex items-center border p-3 shadow mr-3
|
|
38
|
-
border-white text-white"
|
|
39
|
-
>
|
|
40
|
-
<IconHome class="w-6 h-6"/>
|
|
41
|
-
</a>
|
|
42
|
-
|
|
43
|
-
<div class="position-relative">
|
|
44
|
-
<button
|
|
45
|
-
@click.prevent="toggleSummary()"
|
|
46
|
-
class="border p-3 shadow flex items-center border-white text-white"
|
|
47
|
-
id="summary-button" aria-haspopup="true" :aria-expanded="show"
|
|
48
|
-
>
|
|
49
|
-
<IconSummary v-if="!show" />
|
|
50
|
-
<IconClose v-else class="w-6 h-6" />
|
|
51
|
-
|
|
52
|
-
<span class="block ml-3">
|
|
53
|
-
Sumário
|
|
54
|
-
</span>
|
|
55
|
-
</button>
|
|
56
|
-
|
|
57
|
-
<transition enter-active-class="transition ease-out duration-100 transform" enter-class="opacity-0 scale-95"
|
|
58
|
-
enter-to-class="opacity-100 scale-100" leave-active-class="transition ease-in duration-75 transform"
|
|
59
|
-
leave-class="opacity-100 scale-100" leave-to-class="opacity-0 scale-95"
|
|
60
|
-
>
|
|
61
|
-
<SummaryDropdown v-if="show">
|
|
62
|
-
<template #summaryTop>
|
|
63
|
-
<slot name="summaryTop"/>
|
|
64
|
-
</template>
|
|
65
|
-
|
|
66
|
-
<template #summaryBottom>
|
|
67
|
-
<slot name="summaryBottom"/>
|
|
68
|
-
</template>
|
|
69
|
-
</SummaryDropdown>
|
|
70
|
-
</transition>
|
|
71
|
-
</div>
|
|
72
|
-
</div>
|
|
73
|
-
</div>
|
|
74
|
-
</template>
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
import useTextContent from '../../../composables/useTextContent'
|
|
3
|
-
import usePagination from '../../../composables/usePagination'
|
|
4
|
-
const { summary } = useTextContent
|
|
5
|
-
|
|
6
|
-
async function getChapter(item) {
|
|
7
|
-
const text = await useTextContent.getContent(item.file)
|
|
8
|
-
useTextContent.applyContent(text)
|
|
9
|
-
usePagination.set(1)
|
|
10
|
-
}
|
|
11
|
-
</script>
|
|
12
|
-
|
|
13
|
-
<template>
|
|
14
|
-
<div id="summary-menu-dropdown" class="absolute top-14 py-4 px-3 shadow-lg w-60 md:w-104
|
|
15
|
-
text-areia z-10 bg-white" :role="Sumário" aria-orientation="vertical" aria-labelledby="summary-menu">
|
|
16
|
-
<nav>
|
|
17
|
-
<slot name="summaryTop" />
|
|
18
|
-
|
|
19
|
-
<component v-for="item in summary" :is="item.link ? 'a' : 'button'" :key="item.link" :href="item.link"
|
|
20
|
-
:title="`Navegar para capítulo ${item.title}`"
|
|
21
|
-
class="w-full text-left block text-black py-2 px-3 hover:bg-gray-100 rounded mb-2"
|
|
22
|
-
@click="item.file ? getChapter(item) : null">
|
|
23
|
-
<span class="summary-menu-dropdown-item-title">{{ item.title }}</span>
|
|
24
|
-
<span v-if="item.author" class="summary-menu-dropdown-item-author">{{ item.author }}</span>
|
|
25
|
-
</component>
|
|
26
|
-
|
|
27
|
-
<slot name="summaryBottom" />
|
|
28
|
-
</nav>
|
|
29
|
-
</div>
|
|
30
|
-
</template>
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
export default {
|
|
3
|
-
name: "NavPrev",
|
|
4
|
-
|
|
5
|
-
props: {
|
|
6
|
-
target: String,
|
|
7
|
-
},
|
|
8
|
-
|
|
9
|
-
computed: {
|
|
10
|
-
type() {
|
|
11
|
-
return 'chapter'
|
|
12
|
-
},
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
</script>
|
|
16
|
-
|
|
17
|
-
<template>
|
|
18
|
-
<button @click.prevent="$emit('clicked')" class="[ viewer-nav ]"
|
|
19
|
-
:class="type === 'cover' ? 'text-white' : 'text-gray-dark'">
|
|
20
|
-
|
|
21
|
-
<svg v-if="target === 'prev'" viewBox="0 0 20 20" fill="currentColor" class="[ viewer-nav-icon nav-prev ] arrow-narrow-left">
|
|
22
|
-
<path fill-rule="evenodd"
|
|
23
|
-
d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z"
|
|
24
|
-
clip-rule="evenodd"></path>
|
|
25
|
-
</svg>
|
|
26
|
-
|
|
27
|
-
<svg v-if="target === 'next'" data-v-ef9c31bc="" viewBox="0 0 20 20" fill="currentColor"
|
|
28
|
-
class="[ viewer-nav-icon nav-next ] right-0 arrow-narrow-right">
|
|
29
|
-
<path fill-rule="evenodd"
|
|
30
|
-
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
|
|
31
|
-
clip-rule="evenodd"></path>
|
|
32
|
-
</svg>
|
|
33
|
-
</button>
|
|
34
|
-
</template>
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
import { ref } from 'vue'
|
|
3
|
-
import { usePointerSwipe, useWindowSize } from '@vueuse/core'
|
|
4
|
-
|
|
5
|
-
import usePagination from '../composables/usePagination'
|
|
6
|
-
import useReaderSettings from '../composables/useReaderSettings'
|
|
7
|
-
|
|
8
|
-
const { columns } = useReaderSettings
|
|
9
|
-
const { currentPage } = usePagination
|
|
10
|
-
|
|
11
|
-
const el = ref(null)
|
|
12
|
-
|
|
13
|
-
const { width } = useWindowSize()
|
|
14
|
-
const { distanceX } = usePointerSwipe(el, {
|
|
15
|
-
onSwipeEnd() {
|
|
16
|
-
if (width.value < 600) {
|
|
17
|
-
if (distanceX.value > 100) {
|
|
18
|
-
usePagination.next()
|
|
19
|
-
}
|
|
20
|
-
if (distanceX.value < -100) {
|
|
21
|
-
usePagination.prev()
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
</script>
|
|
28
|
-
|
|
29
|
-
<template>
|
|
30
|
-
<div ref="el" class="columnsArea" :style="`margin-left: -${100 * (currentPage - 1)}%`">
|
|
31
|
-
<div class="[ typeArea ] h-full relative
|
|
32
|
-
transition-opacity duration-100 opacity-100 px-2 md:px-24
|
|
33
|
-
">
|
|
34
|
-
<slot></slot>
|
|
35
|
-
</div>
|
|
36
|
-
</div>
|
|
37
|
-
</template>
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
<script setup>
|
|
2
|
-
import { onKeyStroke } from '@vueuse/core'
|
|
3
|
-
|
|
4
|
-
import useReaderSettings from '../composables/useReaderSettings'
|
|
5
|
-
import useReferences from '../composables/useReferences'
|
|
6
|
-
|
|
7
|
-
const { reference, setHighlightedReference } = useReferences
|
|
8
|
-
|
|
9
|
-
function closeRef() {
|
|
10
|
-
setHighlightedReference(null)
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
onKeyStroke('Escape', () => {
|
|
14
|
-
if (!useReaderSettings.blocked.value) {
|
|
15
|
-
setHighlightedReference(null)
|
|
16
|
-
}
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
</script>
|
|
20
|
-
|
|
21
|
-
<template>
|
|
22
|
-
<transition enter-active-class="transition ease-out duration-200" enter-from-class="transform opacity-0 scale-95"
|
|
23
|
-
enter-to-class="transform opacity-100 scale-100" leave-active-class="transition ease-in duration-200"
|
|
24
|
-
leave-from-class="transform opacity-100 scale-100" leave-to-class="transform opacity-0 scale-95">
|
|
25
|
-
<div v-if="reference" tabindex="0" class="[ reference-popup ] bg-gray-800 text-white fixed z-40 bottom-0 md:bottom-14 right-0 md:right-3
|
|
26
|
-
rounded flex justify-between
|
|
27
|
-
p-4 shadow w-full md:w-2/5
|
|
28
|
-
">
|
|
29
|
-
<p class="w-4/5" v-html="reference.ref"></p>
|
|
30
|
-
|
|
31
|
-
<div class="mt-3 flex self-end">
|
|
32
|
-
<button @click.prevent="closeRef()" class="button button-negative">OK</button>
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
35
|
-
</transition>
|
|
36
|
-
</template>
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<svg viewBox="0 0 653 441.2" fill="currentColor">
|
|
3
|
-
<rect x="73.2" y="143.7" width="195.2" height="20"></rect>
|
|
4
|
-
<rect x="73.2" y="82.7" width="195.2" height="20"></rect>
|
|
5
|
-
<rect x="73.2" y="203.7" width="195.2" height="20"></rect>
|
|
6
|
-
<rect x="73.2" y="263.7" width="195.2" height="20"></rect>
|
|
7
|
-
<rect x="73.2" y="319" width="195.2" height="20"></rect>
|
|
8
|
-
<rect x="384.7" y="143.7" width="195.2" height="20"></rect>
|
|
9
|
-
<rect x="384.7" y="82.7" width="195.2" height="20"></rect>
|
|
10
|
-
<rect x="384.7" y="203.7" width="195.2" height="20"></rect>
|
|
11
|
-
<rect x="384.7" y="263.7" width="195.2" height="20"></rect>
|
|
12
|
-
<rect x="384.7" y="319" width="195.2" height="20"></rect>
|
|
13
|
-
<path d="M0-0.6v7.5v7.5v411.8v14.4v0.6h653v-5v-10V14.4V2.5v-3.1H0z M638,426.2H15V14.4h623V426.2z"></path>
|
|
14
|
-
</svg>
|
|
15
|
-
</template>
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
<script setup></script>
|
|
2
|
-
<template>
|
|
3
|
-
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
4
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
5
|
-
d="M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4"></path>
|
|
6
|
-
</svg>
|
|
7
|
-
</template>
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<script setup></script>
|
|
2
|
-
<template>
|
|
3
|
-
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
4
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
|
5
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
6
|
-
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z">
|
|
7
|
-
</path>
|
|
8
|
-
</svg>
|
|
9
|
-
</template>
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
|
|
4
|
-
</svg>
|
|
5
|
-
</template>
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<svg fill="none" stroke="currentColor" viewBox="0 0 20 22" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
-
<path d="M1 8L10 1L19 8V19C19 19.5304 18.7893 20.0391 18.4142 20.4142C18.0391 20.7893 17.5304 21 17 21H3C2.46957 21 1.96086 20.7893 1.58579 20.4142C1.21071 20.0391 1 19.5304 1 19V8Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
4
|
-
<path d="M7 21V11H13V21" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
5
|
-
</svg>
|
|
6
|
-
</template>
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path>
|
|
4
|
-
</svg>
|
|
5
|
-
</template>
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
3
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" />
|
|
4
|
-
</svg>
|
|
5
|
-
</template>
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<svg viewBox="0 0 341.5 441.2" fill="currentColor"><rect data-v-acadaaca="" x="73.2" y="143.7" width="195.2" height="20"></rect><rect data-v-acadaaca="" x="73.2" y="82.7" width="195.2" height="20"></rect><rect data-v-acadaaca="" x="73.2" y="203.7" width="195.2" height="20"></rect><rect data-v-acadaaca="" x="73.2" y="263.7" width="195.2" height="20"></rect><rect data-v-acadaaca="" x="73.2" y="319" width="195.2" height="20"></rect><rect data-v-acadaaca="" x="0" y="-0.6" width="332.3" height="15"></rect><rect data-v-acadaaca="" x="0" y="426.2" width="332.3" height="15"></rect><rect data-v-acadaaca="" x="-209.4" y="216.2" transform="matrix(6.123234e-17 -1 1 6.123234e-17 -216.2339 231.2339)" width="433.7" height="15"></rect><rect data-v-acadaaca="" x="108" y="211.9" transform="matrix(6.123234e-17 -1 1 6.123234e-17 105.4808 544.1859)" width="433.7" height="15"></rect></svg>
|
|
3
|
-
</template>
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<svg width="24" height="19" viewBox="0 0 24 19" fill="none" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
-
<line x1="5" y1="1.08447" x2="1" y2="1.08447" stroke-width="2" stroke-linecap="round"/>
|
|
4
|
-
<line x1="23" y1="1.04248" x2="11" y2="1.04248" stroke-width="2" stroke-linecap="round"/>
|
|
5
|
-
<line x1="23" y1="9.08447" x2="14" y2="9.08447" stroke-width="2" stroke-linecap="round"/>
|
|
6
|
-
<line x1="8" y1="9.14905" x2="4" y2="9.14905" stroke-width="2" stroke-linecap="round"/>
|
|
7
|
-
<line x1="23" y1="17.149" x2="10.9993" y2="17.149" stroke-width="2" stroke-linecap="round"/>
|
|
8
|
-
<line x1="5" y1="17.2429" x2="1" y2="17.2429" stroke-width="2" stroke-linecap="round"/>
|
|
9
|
-
</svg>
|
|
10
|
-
</template>
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"></path>
|
|
4
|
-
</svg>
|
|
5
|
-
</template>
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
<script setup></script>
|
|
2
|
-
<template>
|
|
3
|
-
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
4
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
5
|
-
d="M5 12h.01M12 12h.01M19 12h.01M6 12a1 1 0 11-2 0 1 1 0 012 0zm7 0a1 1 0 11-2 0 1 1 0 012 0zm7 0a1 1 0 11-2 0 1 1 0 012 0z">
|
|
6
|
-
</path>
|
|
7
|
-
</svg>
|
|
8
|
-
</template>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
const isSafari = [
|
|
2
|
-
'iPad Simulator',
|
|
3
|
-
'iPhone Simulator',
|
|
4
|
-
'iPod Simulator',
|
|
5
|
-
'iPad',
|
|
6
|
-
'iPhone',
|
|
7
|
-
'iPod'
|
|
8
|
-
].includes(navigator.platform)
|
|
9
|
-
|| (navigator.userAgent.includes("Mac") && "ontouchend" in document)
|
|
10
|
-
|
|
11
|
-
const isApple = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);
|
|
12
|
-
|
|
13
|
-
export default {
|
|
14
|
-
isSafari,
|
|
15
|
-
isApple
|
|
16
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { computed, reactive } from 'vue'
|
|
2
|
-
|
|
3
|
-
const state = reactive({
|
|
4
|
-
totalPages: 1
|
|
5
|
-
})
|
|
6
|
-
|
|
7
|
-
function estimate(viewport, content) {
|
|
8
|
-
if (viewport && content) {
|
|
9
|
-
const { width: viewportWidth } = viewport.value.getBoundingClientRect()
|
|
10
|
-
const { width: contentWidth } = content.value.getBoundingClientRect()
|
|
11
|
-
|
|
12
|
-
if (contentWidth > viewportWidth) {
|
|
13
|
-
state.totalPages = Math.ceil(contentWidth / viewportWidth)
|
|
14
|
-
return Math.ceil(contentWidth / viewportWidth)
|
|
15
|
-
|
|
16
|
-
} else {
|
|
17
|
-
state.totalPages = 1
|
|
18
|
-
return 1
|
|
19
|
-
}
|
|
20
|
-
} else {
|
|
21
|
-
state.totalPages = 1
|
|
22
|
-
return 1
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const totalPages = computed(() => state.totalPages)
|
|
27
|
-
|
|
28
|
-
export default {
|
|
29
|
-
totalPages,
|
|
30
|
-
estimate
|
|
31
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { computed, reactive } from 'vue'
|
|
2
|
-
|
|
3
|
-
const state = reactive({
|
|
4
|
-
footnotes: [],
|
|
5
|
-
showFootnotes: false,
|
|
6
|
-
footnote: null
|
|
7
|
-
})
|
|
8
|
-
|
|
9
|
-
const footnotes = computed(() => state.footnotes)
|
|
10
|
-
function setFootnotes(footnotes) {
|
|
11
|
-
state.footnotes = footnotes
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const showFootnotes = computed(() => state.showFootnotes)
|
|
15
|
-
function setShowFootnotes(value) {
|
|
16
|
-
state.showFootnotes = value
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const footnote = computed(() => state.footnote)
|
|
20
|
-
function setHighlightedFootnote(footnote) {
|
|
21
|
-
state.footnote = footnote
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function applyFootnote(event) {
|
|
25
|
-
const classList = event.target.closest('.footnote')?.classList.value.split(' ')
|
|
26
|
-
|
|
27
|
-
if (classList.length === 0)
|
|
28
|
-
return
|
|
29
|
-
|
|
30
|
-
const footnoteTarget = classList.find(
|
|
31
|
-
item => item.includes('footnote') && item !== 'footnote'
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
if (footnoteTarget) {
|
|
35
|
-
const ref = state.footnotes.find(item => item.id === footnoteTarget)
|
|
36
|
-
if (ref) {
|
|
37
|
-
state.footnote = ref
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export default {
|
|
43
|
-
footnotes,
|
|
44
|
-
footnote,
|
|
45
|
-
setFootnotes,
|
|
46
|
-
applyFootnote,
|
|
47
|
-
setHighlightedFootnote,
|
|
48
|
-
setShowFootnotes,
|
|
49
|
-
showFootnotes
|
|
50
|
-
}
|