paginar 0.2.8 → 0.3.0
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/LICENSE.md +21 -0
- package/README.md +234 -4
- package/demo/slot/slot-chapter1.html +34 -7
- package/demo/summary/_content/1chapter.html +3 -0
- package/demo/summary/index.html +11 -0
- package/dist/index.es.js +201 -136
- package/dist/index.es.js.map +1 -1
- package/dist/style.css +5 -8
- package/package.json +1 -1
- package/src/App.ce.vue +9 -14
- package/src/components/HeaderSlot/HeaderSlot.vue +3 -3
- package/src/components/HeaderSlot/OptionsButton/OptionsButton.vue +2 -2
- package/src/components/HeaderSlot/OptionsButton/OptionsColor.vue +2 -2
- package/src/components/HeaderSlot/OptionsButton/OptionsColumns.vue +3 -1
- package/src/components/HeaderSlot/OptionsButton/OptionsDropdown.vue +13 -9
- package/src/components/HeaderSlot/OptionsButton/OptionsFontFamily.vue +1 -1
- package/src/components/HeaderSlot/OptionsButton/OptionsFontSize.vue +2 -2
- package/src/components/HeaderSlot/SummaryButton/SummaryButton.vue +32 -27
- package/src/components/HeaderSlot/SummaryButton/SummaryDropdown.vue +1 -1
- package/src/composables/useReaderSettings.js +23 -2
- package/src/composables/useStyles.js +20 -3
- package/src/tailwind.css +5 -8
package/dist/style.css
CHANGED
|
@@ -608,10 +608,6 @@ video {
|
|
|
608
608
|
right: -0.5rem;
|
|
609
609
|
}
|
|
610
610
|
|
|
611
|
-
.-left-2 {
|
|
612
|
-
left: -0.5rem;
|
|
613
|
-
}
|
|
614
|
-
|
|
615
611
|
.z-20 {
|
|
616
612
|
z-index: 20;
|
|
617
613
|
}
|
|
@@ -917,6 +913,11 @@ video {
|
|
|
917
913
|
text-align: center;
|
|
918
914
|
}
|
|
919
915
|
|
|
916
|
+
.text-sm {
|
|
917
|
+
font-size: 0.875rem;
|
|
918
|
+
line-height: 1.25rem;
|
|
919
|
+
}
|
|
920
|
+
|
|
920
921
|
.text-xs {
|
|
921
922
|
font-size: 0.75rem;
|
|
922
923
|
line-height: 1rem;
|
|
@@ -1072,10 +1073,6 @@ video {
|
|
|
1072
1073
|
right: 4rem;
|
|
1073
1074
|
}
|
|
1074
1075
|
|
|
1075
|
-
.md\:left-16 {
|
|
1076
|
-
left: 4rem;
|
|
1077
|
-
}
|
|
1078
|
-
|
|
1079
1076
|
.md\:flex {
|
|
1080
1077
|
display: flex;
|
|
1081
1078
|
}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"description": "A flipping page web component for reading long texts on the brower",
|
|
5
5
|
"main": "dist/index.es.js",
|
|
6
6
|
"module": "dist/index.es.js",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.3.0",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "git+https://github.com/educkf/paginar.git"
|
package/src/App.ce.vue
CHANGED
|
@@ -30,8 +30,8 @@ const props = defineProps({
|
|
|
30
30
|
cssString: String
|
|
31
31
|
})
|
|
32
32
|
|
|
33
|
-
const {
|
|
34
|
-
const { currentPage, totalPages
|
|
33
|
+
const { baseFont, bookTitle, chapterTitle, textFont, fontSize, columns, setColumns, mode } = useReaderSettings
|
|
34
|
+
const { currentPage, totalPages } = usePagination
|
|
35
35
|
const { content, listenToClicks } = useTextContent
|
|
36
36
|
const { width, height } = useWindowSize()
|
|
37
37
|
|
|
@@ -40,31 +40,23 @@ const contentArea = ref(null)
|
|
|
40
40
|
const rootComponent = ref(null)
|
|
41
41
|
|
|
42
42
|
onMounted(async () => {
|
|
43
|
-
init(readerComponent, contentArea)
|
|
44
|
-
initSettings(props.readerSettings)
|
|
43
|
+
usePagination.init(readerComponent, contentArea)
|
|
44
|
+
useReaderSettings.initSettings(props.readerSettings)
|
|
45
|
+
useStyles.initStyles(props, rootComponent)
|
|
45
46
|
|
|
46
47
|
if (['string', 'boolean'].includes(typeof props.readerBlocked)) {
|
|
47
48
|
useReaderSettings.setBlocked(props.readerBlocked)
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
if (props.cssFile) {
|
|
51
|
-
useStyles.stylesheetLoader(props.cssFile, rootComponent)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (props.cssString) {
|
|
55
|
-
useStyles.applyStylesheet(props.cssString, rootComponent)
|
|
56
|
-
}
|
|
57
51
|
})
|
|
58
52
|
|
|
59
53
|
watch(
|
|
60
54
|
props,
|
|
61
55
|
() => {
|
|
62
|
-
console.log(props)
|
|
63
56
|
if (props.hasOwnProperty('readerBlocked')) {
|
|
64
57
|
const readerBlocked = typeof props.readerBlocked === 'boolean'
|
|
65
58
|
? props.readerBlocked
|
|
66
59
|
: props.readerBlocked === 'true'
|
|
67
|
-
console.log(readerBlocked)
|
|
68
60
|
useReaderSettings.setBlocked(readerBlocked)
|
|
69
61
|
}
|
|
70
62
|
}
|
|
@@ -103,8 +95,11 @@ watchDebounced(content,
|
|
|
103
95
|
<HeaderSlot>
|
|
104
96
|
<template #header>
|
|
105
97
|
<slot name="header">
|
|
98
|
+
<p class="text-white text-center text-sm">
|
|
99
|
+
{{ props.bookTitle || bookTitle }}
|
|
100
|
+
</p>
|
|
106
101
|
<p class="text-white text-center text-xs">
|
|
107
|
-
{{ props.
|
|
102
|
+
{{ props.chapterTitle || chapterTitle }}
|
|
108
103
|
</p>
|
|
109
104
|
</slot>
|
|
110
105
|
</template>
|
|
@@ -4,7 +4,7 @@ import OptionsButton from './OptionsButton/OptionsButton.vue';
|
|
|
4
4
|
</script>
|
|
5
5
|
|
|
6
6
|
<template>
|
|
7
|
-
<
|
|
7
|
+
<header id="component-header" class="bg-primary flex justify-between items-center p-4">
|
|
8
8
|
<summary-button>
|
|
9
9
|
<template #summaryTop>
|
|
10
10
|
<slot name="summaryTop" />
|
|
@@ -14,7 +14,7 @@ import OptionsButton from './OptionsButton/OptionsButton.vue';
|
|
|
14
14
|
</template>
|
|
15
15
|
</summary-button>
|
|
16
16
|
|
|
17
|
-
<div>
|
|
17
|
+
<div id="header-titles">
|
|
18
18
|
<slot name="header" />
|
|
19
19
|
</div>
|
|
20
20
|
|
|
@@ -26,5 +26,5 @@ import OptionsButton from './OptionsButton/OptionsButton.vue';
|
|
|
26
26
|
<slot name="optionsBottom" />
|
|
27
27
|
</template>
|
|
28
28
|
</options-button>
|
|
29
|
-
</
|
|
29
|
+
</header>
|
|
30
30
|
</template>
|
|
@@ -26,11 +26,11 @@ const { toggle: toggleFullScreen } = useFullscreen()
|
|
|
26
26
|
</script>
|
|
27
27
|
|
|
28
28
|
<template>
|
|
29
|
-
<div ref="button" class="relative">
|
|
29
|
+
<div id="options-menu" ref="button" class="relative">
|
|
30
30
|
<div class="flex">
|
|
31
31
|
<button @click.prevent="toggleSummary()"
|
|
32
32
|
class="border p-3 shadow flex items-center border-white text-white"
|
|
33
|
-
id="
|
|
33
|
+
id="options-button" aria-haspopup="true" :aria-expanded="show"
|
|
34
34
|
>
|
|
35
35
|
<span class="block mr-3">
|
|
36
36
|
Opções
|
|
@@ -8,7 +8,7 @@ const { mode, setMode } = useReaderSettings
|
|
|
8
8
|
</script>
|
|
9
9
|
|
|
10
10
|
<template>
|
|
11
|
-
<button @click.prevent="setMode('light')"
|
|
11
|
+
<button id="lightmode-button" @click.prevent="setMode('light')"
|
|
12
12
|
title="Leitura diurna"
|
|
13
13
|
class="font-light text-base border w-full h-10 flex justify-center items-center"
|
|
14
14
|
:class="{
|
|
@@ -17,7 +17,7 @@ const { mode, setMode } = useReaderSettings
|
|
|
17
17
|
<IconSun class="w-5 h-5" />
|
|
18
18
|
</button>
|
|
19
19
|
|
|
20
|
-
<button @click.prevent="setMode('dark')"
|
|
20
|
+
<button id="darkmode-button" @click.prevent="setMode('dark')"
|
|
21
21
|
title="Leitura noturna"
|
|
22
22
|
class="font-light text-base border w-full h-10 flex justify-center items-center"
|
|
23
23
|
:class="{
|
|
@@ -17,8 +17,9 @@ const isSafari = computed(() => {
|
|
|
17
17
|
</script>
|
|
18
18
|
|
|
19
19
|
<template>
|
|
20
|
-
<div class="w-full hidden md:grid grid-cols-3 gap-2 mt-3">
|
|
20
|
+
<div id="columns-menu" class="w-full hidden md:grid grid-cols-3 gap-2 mt-3">
|
|
21
21
|
<button
|
|
22
|
+
id="single-column-button"
|
|
22
23
|
class="col-span-1 text-primary text-center cursor-pointer py-3 rounded-sm border"
|
|
23
24
|
:class="{
|
|
24
25
|
'border-gray-300': columns !== 'single',
|
|
@@ -33,6 +34,7 @@ const isSafari = computed(() => {
|
|
|
33
34
|
</button>
|
|
34
35
|
|
|
35
36
|
<button
|
|
37
|
+
id="double-column-button"
|
|
36
38
|
class="col-span-2 text-primary text-center cursor-pointer py-3 rounded-sm border"
|
|
37
39
|
:class="{
|
|
38
40
|
'border-gray-300': columns !== 'double',
|
|
@@ -23,17 +23,21 @@ import useFootnotes from '../../../composables/useFootnotes'
|
|
|
23
23
|
|
|
24
24
|
<slot name="optionsTop" />
|
|
25
25
|
|
|
26
|
-
<
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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>
|
|
34
36
|
|
|
35
37
|
|
|
36
|
-
<div class="w-full flex justify-center items-center py-3 lowercase"
|
|
38
|
+
<div class="w-full flex justify-center items-center py-3 lowercase"
|
|
39
|
+
id="visualize-title"
|
|
40
|
+
>
|
|
37
41
|
<IconEye class="w-6 h-6" />
|
|
38
42
|
<span class="ml-4">Visualização</span>
|
|
39
43
|
</div>
|
|
@@ -5,7 +5,7 @@ const { textFont, fontsOptions, setTextFont } = useReaderSettings
|
|
|
5
5
|
</script>
|
|
6
6
|
|
|
7
7
|
<template>
|
|
8
|
-
<div class="w-full grid grid-cols-4 gap-2 my-3">
|
|
8
|
+
<div id="font-family-menu" class="w-full grid grid-cols-4 gap-2 my-3">
|
|
9
9
|
<button v-for="font in fontsOptions" :key="font.name" @click.prevent="setTextFont(font.name)"
|
|
10
10
|
class="font-light text-lg text-primary tracking-wide border border-urucum w-full h-10 flex justify-center items-center"
|
|
11
11
|
:class="{
|
|
@@ -5,12 +5,12 @@ const { fontSize, setFontSize } = useReaderSettings
|
|
|
5
5
|
</script>
|
|
6
6
|
|
|
7
7
|
<template>
|
|
8
|
-
<button @click.prevent="setFontSize(fontSize + 1)"
|
|
8
|
+
<button id="fontsize-add-button" @click.prevent="setFontSize(fontSize + 1)"
|
|
9
9
|
class="font-light text-base border border-urucum w-full h-10 flex justify-center items-center">
|
|
10
10
|
+ A
|
|
11
11
|
</button>
|
|
12
12
|
|
|
13
|
-
<button @click.prevent="setFontSize(fontSize - 1)"
|
|
13
|
+
<button id="fontsize-subtr-button" @click.prevent="setFontSize(fontSize - 1)"
|
|
14
14
|
class="font-light text-base border border-urucum w-full h-10 flex justify-center items-center">
|
|
15
15
|
- A
|
|
16
16
|
</button>
|
|
@@ -12,6 +12,8 @@ import SummaryDropdown from './SummaryDropdown.vue'
|
|
|
12
12
|
const show = ref(false)
|
|
13
13
|
const button = ref(null)
|
|
14
14
|
|
|
15
|
+
const { homeUrl } = useReaderSettings
|
|
16
|
+
|
|
15
17
|
const toggleSummary = () => show.value = !show.value
|
|
16
18
|
const hide = () => {
|
|
17
19
|
if (!useReaderSettings.blocked.value) {
|
|
@@ -24,42 +26,45 @@ onKeyStroke('Escape', () => hide())
|
|
|
24
26
|
</script>
|
|
25
27
|
|
|
26
28
|
<template>
|
|
27
|
-
<div ref="button" class="relative">
|
|
29
|
+
<div id="summary-menu" ref="button" class="relative">
|
|
28
30
|
<div class="flex">
|
|
29
|
-
<a
|
|
31
|
+
<a v-if="homeUrl"
|
|
32
|
+
:href="homeUrl" title="Homepage" id="home-button"
|
|
30
33
|
class="hidden md:flex items-center border p-3 shadow mr-3
|
|
31
34
|
border-white text-white"
|
|
32
35
|
>
|
|
33
36
|
<IconHome class="w-6 h-6"/>
|
|
34
37
|
</a>
|
|
35
38
|
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
<div class="position-relative">
|
|
40
|
+
<button
|
|
41
|
+
@click.prevent="toggleSummary()"
|
|
42
|
+
class="border p-3 shadow flex items-center border-white text-white"
|
|
43
|
+
id="summary-button" aria-haspopup="true" :aria-expanded="show"
|
|
44
|
+
>
|
|
45
|
+
<IconSummary v-if="!show" />
|
|
46
|
+
<IconClose v-else class="w-6 h-6" />
|
|
43
47
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
</div>
|
|
48
|
+
<span class="block ml-3">
|
|
49
|
+
Sumário
|
|
50
|
+
</span>
|
|
51
|
+
</button>
|
|
49
52
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
<transition enter-active-class="transition ease-out duration-100 transform" enter-class="opacity-0 scale-95"
|
|
54
|
+
enter-to-class="opacity-100 scale-100" leave-active-class="transition ease-in duration-75 transform"
|
|
55
|
+
leave-class="opacity-100 scale-100" leave-to-class="opacity-0 scale-95"
|
|
56
|
+
>
|
|
57
|
+
<SummaryDropdown v-if="show">
|
|
58
|
+
<template #summaryTop>
|
|
59
|
+
<slot name="summaryTop"/>
|
|
60
|
+
</template>
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
<template #summaryBottom>
|
|
63
|
+
<slot name="summaryBottom"/>
|
|
64
|
+
</template>
|
|
65
|
+
</SummaryDropdown>
|
|
66
|
+
</transition>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
64
69
|
</div>
|
|
65
70
|
</template>
|
|
@@ -12,7 +12,7 @@ async function getChapter(item) {
|
|
|
12
12
|
|
|
13
13
|
<template>
|
|
14
14
|
<div class="absolute top-14 py-4 px-3 shadow-lg w-60 md:w-104
|
|
15
|
-
text-areia
|
|
15
|
+
text-areia z-10 bg-white" :role="Sumário" aria-orientation="vertical"
|
|
16
16
|
aria-labelledby="summary-menu">
|
|
17
17
|
<nav>
|
|
18
18
|
<slot name="summaryTop" />
|
|
@@ -13,7 +13,11 @@ const state = reactive({
|
|
|
13
13
|
fontSize: 16,
|
|
14
14
|
columns: 'double',
|
|
15
15
|
mode: 'light',
|
|
16
|
-
blocked: false
|
|
16
|
+
blocked: false,
|
|
17
|
+
|
|
18
|
+
bookTitle: null,
|
|
19
|
+
chapterTitle: null,
|
|
20
|
+
homeUrl: null,
|
|
17
21
|
})
|
|
18
22
|
|
|
19
23
|
const baseFont = computed(() => state.baseFont)
|
|
@@ -24,6 +28,10 @@ const columns = computed(() => state.columns)
|
|
|
24
28
|
const mode = computed(() => state.mode)
|
|
25
29
|
const blocked = computed(() => state.blocked)
|
|
26
30
|
|
|
31
|
+
const bookTitle = computed(() => state.bookTitle)
|
|
32
|
+
const chapterTitle = computed(() => state.chapterTitle)
|
|
33
|
+
const homeUrl = computed(() => state.homeUrl)
|
|
34
|
+
|
|
27
35
|
watch(
|
|
28
36
|
[baseFont, textFont, fontSize, columns, mode],
|
|
29
37
|
() => saveSettings()
|
|
@@ -62,6 +70,15 @@ async function initSettings(settingsString) {
|
|
|
62
70
|
state.textFont = defaultTextFont.name
|
|
63
71
|
}
|
|
64
72
|
|
|
73
|
+
if (settings?.bookTitle)
|
|
74
|
+
state.bookTitle = settings.bookTitle
|
|
75
|
+
|
|
76
|
+
if (settings?.chapterTitle)
|
|
77
|
+
state.chapterTitle = settings.chapterTitle
|
|
78
|
+
|
|
79
|
+
if (settings?.homeUrl)
|
|
80
|
+
state.homeUrl = settings.homeUrl
|
|
81
|
+
|
|
65
82
|
loadSavedSettings(settings)
|
|
66
83
|
}
|
|
67
84
|
|
|
@@ -149,5 +166,9 @@ export default {
|
|
|
149
166
|
mode,
|
|
150
167
|
blocked,
|
|
151
168
|
setMode,
|
|
152
|
-
saveSettings
|
|
169
|
+
saveSettings,
|
|
170
|
+
|
|
171
|
+
bookTitle,
|
|
172
|
+
chapterTitle,
|
|
173
|
+
homeUrl
|
|
153
174
|
}
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
function initStyles(props, rootComponent) {
|
|
2
|
+
const settings = props.readerSettings
|
|
3
|
+
? JSON.parse(props.readerSettings)
|
|
4
|
+
: null
|
|
5
|
+
|
|
6
|
+
if (props.cssFile) {
|
|
7
|
+
stylesheetLoader(props.cssFile, rootComponent)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if (props.cssString) {
|
|
11
|
+
applyStylesheet(props.cssString, rootComponent)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (settings?.cssString) {
|
|
15
|
+
applyStylesheet(settings.cssString, rootComponent)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
1
19
|
function fontLoader(fontsOptions) {
|
|
2
20
|
const fontsToLoad = fontsOptions.filter(item => item.link)
|
|
3
21
|
|
|
@@ -23,9 +41,7 @@ async function stylesheetLoader(stylesheet, ref) {
|
|
|
23
41
|
|
|
24
42
|
applyStylesheet(cssText, ref)
|
|
25
43
|
|
|
26
|
-
} catch (
|
|
27
|
-
console.log({ err })
|
|
28
|
-
}
|
|
44
|
+
} catch (_) {}
|
|
29
45
|
}
|
|
30
46
|
}
|
|
31
47
|
|
|
@@ -37,6 +53,7 @@ async function applyStylesheet(stylesheet, ref) {
|
|
|
37
53
|
}
|
|
38
54
|
|
|
39
55
|
export default {
|
|
56
|
+
initStyles,
|
|
40
57
|
fontLoader,
|
|
41
58
|
stylesheetLoader,
|
|
42
59
|
applyStylesheet
|
package/src/tailwind.css
CHANGED
|
@@ -591,10 +591,6 @@ video {
|
|
|
591
591
|
right: -0.5rem;
|
|
592
592
|
}
|
|
593
593
|
|
|
594
|
-
.-left-2 {
|
|
595
|
-
left: -0.5rem;
|
|
596
|
-
}
|
|
597
|
-
|
|
598
594
|
.z-20 {
|
|
599
595
|
z-index: 20;
|
|
600
596
|
}
|
|
@@ -900,6 +896,11 @@ video {
|
|
|
900
896
|
text-align: center;
|
|
901
897
|
}
|
|
902
898
|
|
|
899
|
+
.text-sm {
|
|
900
|
+
font-size: 0.875rem;
|
|
901
|
+
line-height: 1.25rem;
|
|
902
|
+
}
|
|
903
|
+
|
|
903
904
|
.text-xs {
|
|
904
905
|
font-size: 0.75rem;
|
|
905
906
|
line-height: 1rem;
|
|
@@ -1055,10 +1056,6 @@ video {
|
|
|
1055
1056
|
right: 4rem;
|
|
1056
1057
|
}
|
|
1057
1058
|
|
|
1058
|
-
.md\:left-16 {
|
|
1059
|
-
left: 4rem;
|
|
1060
|
-
}
|
|
1061
|
-
|
|
1062
1059
|
.md\:flex {
|
|
1063
1060
|
display: flex;
|
|
1064
1061
|
}
|