paginar 0.3.5 → 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 CHANGED
@@ -1,274 +1,296 @@
1
- # Paginar
2
-
3
- ## Manutenção e contribuição
4
-
5
- Para trabalhar no projeto, comece pelo [AGENTS.md](AGENTS.md). Consulte também o
6
- [mapa da arquitetura](docs/architecture.md), o [guia de desenvolvimento e validação](docs/development.md)
7
- e o [roteiro de publicação no npm](docs/releasing.md). Tarefas pequenas podem seguir
8
- esse fluxo diretamente; o uso de Specify / Spec Kit é opcional.
9
-
10
- Esses documentos estão no [repositório público](https://github.com/sabia-publisher/paginar).
11
-
12
- Web Component para transformar conteúdos HTML em uma visualização paginada, melhorando a leitura no browser, navegação, customização etc.
13
-
14
- -----
15
-
16
- ### Exemplo real em uso (com alguma complexidade)
17
-
18
- [link](https://sabia.pub/book/okabayashi-uma-perspectiva-decolonial-para-o-design-no-brasil/read/haDxQvbtIIX4Hh5cOyee/content)
19
-
20
-
21
- ## Como usar
22
-
23
- Via CDN, basta incluir ao final do html, antes do fechamento da tag body, o script:
24
-
25
- ```html
26
- <script type="module" src="https://cdn.jsdelivr.net/gh/sabia-publisher/paginar/dist/index.es.js"></script>
27
- ```
28
-
29
- Esse link acima sempre puxa a última versão disponível para o software, e também as melhorias que eventualmente fazemos.
30
-
31
- Para apontar para uma versão estável, e assim evitar possíveis bugs ou desconfigurações vindas das melhorias, pode ser da seguinte maneira:
32
-
33
- ```html
34
- <script type="module" src="https://unpkg.com/paginar@0.3.1/dist/index.es.js"></script>
35
- ```
36
-
37
- No corpo do html, no local onde deseja que seja renderizado o leitor, utilizar o Web Component conforme abaixo, e inclua o conteúdo que deseja paginar dentro de um div com propriedade slot="content":
38
-
39
- ```html
40
- <paginate-content id="pagination-el">
41
- <div slot="content">
42
- <p>Conteúdo HTML para paginar</p>
43
- </div>
44
- </paginate-content>
45
- ```
46
-
47
- ## Customização
48
-
49
- ### Parametros de customização disponíveis
50
-
51
- O web component disponibiliza algumas interfaces de customização por via de um objeto a ser linkado ao web component, conforme o exemplo:
52
-
53
- ```html
54
- <paginate-content id="pagination-el">
55
- <div slot="content">
56
- <p>Conteúdo de uma pagina.</p>
57
- </div>
58
- </paginate-content>
59
-
60
- <script>
61
- const settings = {
62
- fontSize: 19, // number
63
- }
64
-
65
- const paginationEl = document.getElementById('pagination-el')
66
- if (paginationEl) {
67
- paginationEl.setAttribute("reader-settings", JSON.stringify(settings))
68
- }
69
- </script>
70
- ```
71
-
72
- Nesse exemplo, configuramos o tamanho padrão de `font-size` da interface e texto como `19px`. As demais configurações disponíveis até o momento são:
73
-
74
- ```js
75
- const settings = {
76
- // fontSize
77
- // tamanho da fonte
78
- // tipagem: número
79
- fontSize: 19,
80
-
81
- // textFont
82
- // designa a fonte base a ser usada no corpo do texto
83
- textFont: 'Times New Roman',
84
-
85
- // baseFont
86
- // designa a fonte padrão para a interface do paginador como um todo
87
- baseFont: '"Inter", sans-serif',
88
-
89
- // homeUrl
90
- // URL a ser direcionado pelo botao de home ao lado do sumário.
91
- // se nao for adicionada a opcao aqui, o botao de home nao aparecerá
92
- homeUrl: 'https://sabia.pub',
93
-
94
- // bookTitle
95
- // titulo do livro, a ser mostrado no cabeçalho do paginador
96
- bookTitle: 'A Tale of Two Cities',
97
-
98
- // chapterTitle
99
- // titulo do capítulo, a ser mostrado no cabeçalho do paginador
100
- chapterTitle: 'Chapter One - The Period',
101
-
102
- // readingProgress
103
- // disponibiliza no menu a retomada da leitura e salva a posição por percentual.
104
- // use um id estável e exclusivo para evitar misturar o progresso entre obras.
105
- // enabled define o estado inicial; a escolha posterior do leitor prevalece.
106
- readingProgress: {
107
- id: 'a-tale-of-two-cities',
108
- enabled: true
109
- },
110
-
111
- // fontsOptions
112
- // customização da lista de fontes disponíveis para o usuário customizar
113
- // a tela de leitura. Deve ser uma lista de até 4 opções, com o nome
114
- // da fonte, o label a ser apresentado para o leitur, se é default ou nao
115
- // e um link de onde essa fonte deve ser importada, caso não seja uma
116
- // fonte de sistema
117
- fontsOptions: [
118
- {
119
- label: 'Times New Roman',
120
- name: 'TimesNewRoman, Times New Roman, Times, Baskerville, Georgia,serif',
121
- defaultTextFont: true // fonte padrão do corpo do texto
122
- },
123
- {
124
- label: 'Inter',
125
- name: '"Inter", sans-serif',
126
- link: 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;700&display=swap',
127
- defaultBaseFont: true // fonte padrão da interface de paginação
128
- },
129
- {
130
- label: 'Open Dyslexic',
131
- name: '"Open-Dyslexic", sans-serif',
132
- link: 'https://fonts.cdnfonts.com/css/open-dyslexic'
133
- },
134
- {
135
- label: 'Atkinson Hyperlegible',
136
- name: 'Atkinson Hyperlegible',
137
- link: 'https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:ital,wght@0,400;0,700;1,400;1,700&display=swap'
138
- }
139
- ],
140
-
141
- // cssString
142
- // possibilita que CSS seja enxertado no escopo do web component
143
- // para a customização da interface em si (conceito explicado abaixo,
144
- // no item de "Aplicando estilos na interface do paginador")
145
- // no exemplo abaixo, mudamos a cor do cabeçalho para transparente
146
- // e o padding do cabeçalho. Existem diversas classes e ids auxiliares na
147
- // interface, que podem ser explorados pelo inspetor de elementos do
148
- // navegador.
149
- // no segundo estilo, escondemos o menu de "Notas de rodapé" do menu
150
- // de opções
151
- cssString: `
152
- header#component-header {
153
- background-color: transparent;
154
- padding: 5px;
155
- }
156
-
157
- #footnotes-button {
158
- display: none;
159
- }
160
- `
161
-
162
- }
163
- ```
164
-
165
- `readingProgress` é opcional. Quando ausente ou `false`, o componente não salva
166
- nem restaura posições e não mostra o controle **Retomar leitura**. Quando o objeto
167
- é informado, `enabled` assume `true` se omitido. O progresso fica somente no
168
- `localStorage` da origem atual, não é sincronizado entre dispositivos e é isolado
169
- por obra e contexto de capítulo. Sem `id`, o componente usa o título e o caminho
170
- da página como alternativa; para publicações duradouras, prefira sempre um `id`
171
- explícito e estável.
172
-
1
+ # Paginar
2
+
3
+ ## Manutenção e contribuição
4
+
5
+ Para trabalhar no projeto, comece pelo [AGENTS.md](AGENTS.md). Consulte também o
6
+ [mapa da arquitetura](docs/architecture.md), o [guia de desenvolvimento e validação](docs/development.md)
7
+ e o [roteiro de publicação no npm](docs/releasing.md). Tarefas pequenas podem seguir
8
+ esse fluxo diretamente; o uso de Specify / Spec Kit é opcional.
9
+
10
+ Esses documentos estão no [repositório público](https://github.com/sabia-publisher/paginar).
11
+
12
+ Web Component para transformar conteúdos HTML em uma visualização paginada, melhorando a leitura no browser, navegação, customização etc.
13
+
14
+ -----
15
+
16
+ ### Exemplo real em uso (com alguma complexidade)
17
+
18
+ [link](https://sabia.pub/book/okabayashi-uma-perspectiva-decolonial-para-o-design-no-brasil/read/haDxQvbtIIX4Hh5cOyee/content)
19
+
20
+
21
+ ## Como usar
22
+
23
+ Via CDN, basta incluir ao final do html, antes do fechamento da tag body, o script:
24
+
25
+ ```html
26
+ <script type="module" src="https://cdn.jsdelivr.net/gh/sabia-publisher/paginar/dist/index.es.js"></script>
27
+ ```
28
+
29
+ Esse link acima sempre puxa a última versão disponível para o software, e também as melhorias que eventualmente fazemos.
30
+
31
+ Para apontar para uma versão estável, e assim evitar possíveis bugs ou desconfigurações vindas das melhorias, pode ser da seguinte maneira:
32
+
33
+ ```html
34
+ <script type="module" src="https://unpkg.com/paginar@0.3.6/dist/index.es.js"></script>
35
+ ```
36
+
37
+ No corpo do html, no local onde deseja que seja renderizado o leitor, utilizar o Web Component conforme abaixo, e inclua o conteúdo que deseja paginar dentro de um div com propriedade slot="content":
38
+
39
+ ```html
40
+ <paginate-content id="pagination-el">
41
+ <div slot="content">
42
+ <p>Conteúdo HTML para paginar</p>
43
+ </div>
44
+ </paginate-content>
45
+ ```
46
+
47
+ ## Customização
48
+
49
+ ### Parametros de customização disponíveis
50
+
51
+ O web component disponibiliza algumas interfaces de customização por via de um objeto a ser linkado ao web component, conforme o exemplo:
52
+
53
+ ```html
54
+ <paginate-content id="pagination-el">
55
+ <div slot="content">
56
+ <p>Conteúdo de uma pagina.</p>
57
+ </div>
58
+ </paginate-content>
59
+
60
+ <script>
61
+ const settings = {
62
+ fontSize: 19, // number
63
+ }
64
+
65
+ const paginationEl = document.getElementById('pagination-el')
66
+ if (paginationEl) {
67
+ paginationEl.setAttribute("reader-settings", JSON.stringify(settings))
68
+ }
69
+ </script>
70
+ ```
71
+
72
+ Nesse exemplo, configuramos o tamanho padrão de `font-size` da interface e texto como `19px`. As demais configurações disponíveis até o momento são:
73
+
74
+ ```js
75
+ const settings = {
76
+ // fontSize
77
+ // tamanho da fonte
78
+ // tipagem: número
79
+ fontSize: 19,
80
+
81
+ // textFont
82
+ // designa a fonte base a ser usada no corpo do texto
83
+ textFont: 'Times New Roman',
84
+
85
+ // baseFont
86
+ // designa a fonte padrão para a interface do paginador como um todo
87
+ baseFont: '"Inter", sans-serif',
88
+
89
+ // homeUrl
90
+ // URL a ser direcionado pelo botao de home ao lado do sumário.
91
+ // se nao for adicionada a opcao aqui, o botao de home nao aparecerá
92
+ homeUrl: 'https://sabia.pub',
93
+
94
+ // bookTitle
95
+ // titulo do livro, a ser mostrado no cabeçalho do paginador
96
+ bookTitle: 'A Tale of Two Cities',
97
+
98
+ // chapterTitle
99
+ // titulo do capítulo, a ser mostrado no cabeçalho do paginador
100
+ chapterTitle: 'Chapter One - The Period',
101
+
102
+ // readingProgress
103
+ // disponibiliza no menu a retomada da leitura e salva a posição por percentual.
104
+ // use um id estável e exclusivo para evitar misturar o progresso entre obras.
105
+ // enabled define o estado inicial; a escolha posterior do leitor prevalece.
106
+ readingProgress: {
107
+ id: 'a-tale-of-two-cities',
108
+ enabled: true
109
+ },
110
+
111
+ // fontsOptions
112
+ // customização da lista de fontes disponíveis para o usuário customizar
113
+ // a tela de leitura. Deve ser uma lista de até 4 opções, com o nome
114
+ // da fonte, o label a ser apresentado para o leitur, se é default ou nao
115
+ // e um link de onde essa fonte deve ser importada, caso não seja uma
116
+ // fonte de sistema
117
+ fontsOptions: [
118
+ {
119
+ label: 'Times New Roman',
120
+ name: 'TimesNewRoman, Times New Roman, Times, Baskerville, Georgia,serif',
121
+ defaultTextFont: true // fonte padrão do corpo do texto
122
+ },
123
+ {
124
+ label: 'Inter',
125
+ name: '"Inter", sans-serif',
126
+ link: 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;700&display=swap',
127
+ defaultBaseFont: true // fonte padrão da interface de paginação
128
+ },
129
+ {
130
+ label: 'Open Dyslexic',
131
+ name: '"Open-Dyslexic", sans-serif',
132
+ link: 'https://fonts.cdnfonts.com/css/open-dyslexic'
133
+ },
134
+ {
135
+ label: 'Atkinson Hyperlegible',
136
+ name: 'Atkinson Hyperlegible',
137
+ link: 'https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:ital,wght@0,400;0,700;1,400;1,700&display=swap'
138
+ }
139
+ ],
140
+
141
+ // cssString
142
+ // possibilita que CSS seja enxertado no escopo do web component
143
+ // para a customização da interface em si (conceito explicado abaixo,
144
+ // no item de "Aplicando estilos na interface do paginador")
145
+ // no exemplo abaixo, mudamos a cor do cabeçalho para transparente
146
+ // e o padding do cabeçalho. Existem diversas classes e ids auxiliares na
147
+ // interface, que podem ser explorados pelo inspetor de elementos do
148
+ // navegador.
149
+ // no segundo estilo, escondemos o menu de "Notas de rodapé" do menu
150
+ // de opções
151
+ cssString: `
152
+ header#component-header {
153
+ background-color: transparent;
154
+ padding: 5px;
155
+ }
156
+
157
+ #footnotes-button {
158
+ display: none;
159
+ }
160
+ `
161
+
162
+ }
163
+ ```
164
+
165
+ `readingProgress` é opcional. Quando ausente ou `false`, o componente não salva
166
+ nem restaura posições e não mostra o controle **Retomar leitura**. Quando o objeto
167
+ é informado, `enabled` assume `true` se omitido. O progresso fica somente no
168
+ `localStorage` da origem atual, não é sincronizado entre dispositivos e é isolado
169
+ por obra e contexto de capítulo. Sem `id`, o componente usa o título e o caminho
170
+ da página como alternativa; para publicações duradouras, prefira sempre um `id`
171
+ explícito e estável.
172
+
173
173
  Ao alterar fonte, tamanho, colunas ou dimensões da janela, o leitor preserva o
174
174
  percentual anterior e seleciona a página mais próxima no novo total. Quando a
175
175
  posição fica exatamente entre duas páginas, a página seguinte é escolhida.
176
176
 
177
+ ## Eventos, estado e navegação por JavaScript
177
178
 
178
- ### Aplicando estilo no corpo do texto
179
-
180
- O conteúdo que vai dentro do `<div slot="content"></div>` pode ser customizado por CSS, seja por importação de um link p/ arquivo CSS, ou seja por uma tag `<style>` fora do componente de `<page-content>`.
179
+ O componente emite eventos públicos ao mudar de página, usar o slider, abrir o
180
+ sumário ou as opções, trocar capítulo e alterar fonte, tamanho, colunas ou tema.
181
+ Também oferece `getState()`, `goToPage()`, `nextPage()` e `previousPage()` no
182
+ elemento. Todos os detalhes, nomes e formatos estão no guia de
183
+ [eventos e estado público](docs/events-and-state.md).
181
184
 
182
- No exemplo abaixo, na classe `.page-break` criamos uma classe-auxiliar que força uma quebra de coluna/página. E também aplicamos uma classe geral em todos os parágrafos, para controlar a indentação:
183
-
184
- ```html
185
- <style>
186
- .page-break {
187
- break-before: column;
188
- }
189
-
190
- p {
191
- text-indent: 4rem;
192
- }
193
- </style>
194
-
195
- <paginate-content id="pagination-el" book-title="Título do livro">
196
- <div slot="content">
197
- <p>Conteúdo de uma pagina.</p>
198
- <div class="page-break"></div>
199
- <p>Conteúdo da próxima página.</div>
200
- </div>
201
- </paginate-content>
202
-
203
- ```
204
-
205
- ### Aplicando estilos na interface do paginador
206
-
207
- No entanto, a maneira acima demonstrada não possibilita alterar o estilo da interface em sí do paginador. Isso porque o escopo do CSS do paginador está dentro de um [**web component**](https://developer.mozilla.org/en-US/docs/Web/API/Web_components), que possui escopo isolado do restante da página, aninhados no `shadow dom` daquele componente.
208
-
209
- Para alterar o estilo da interface do web component, precisamos inserir o CSS almejado no escopo do web component. Para isso, disponibilizamos uma interface via parametros da configuração do componente, conforme exemplo a seguir:
185
+ ```js
186
+ const reader = document.querySelector('paginate-content')
210
187
 
211
- ```html
212
- <paginate-content id="pagination-el" book-title="Título do livro">
213
- <div slot="content">
214
- <p>Conteúdo de uma pagina.</p>
215
- </div>
216
- </paginate-content>
188
+ reader.addEventListener('paginar:page-change', event => {
189
+ console.log(event.detail.source, event.detail.state)
190
+ })
217
191
 
218
- <script>
219
- const settings = {
220
- // outras opções
221
- cssString: `
222
- main#rootComponent {
223
- transition: background-color 200ms linear;
224
- }
225
- `
226
- }
227
-
228
- const paginationEl = document.getElementById('pagination-el')
229
- if (paginationEl) {
230
- paginationEl.setAttribute("reader-settings", JSON.stringify(settings))
231
- }
232
- </script>
192
+ reader.addEventListener('paginar:ready', () => {
193
+ console.log(reader.getState())
194
+ })
233
195
  ```
234
-
235
-
236
- -----
237
-
196
+
197
+
198
+ ### Aplicando estilo no corpo do texto
199
+
200
+ O conteúdo que vai dentro do `<div slot="content"></div>` pode ser customizado por CSS, seja por importação de um link p/ arquivo CSS, ou seja por uma tag `<style>` fora do componente de `<page-content>`.
201
+
202
+ No exemplo abaixo, na classe `.page-break` criamos uma classe-auxiliar que força uma quebra de coluna/página. E também aplicamos uma classe geral em todos os parágrafos, para controlar a indentação:
203
+
204
+ ```html
205
+ <style>
206
+ .page-break {
207
+ break-before: column;
208
+ }
209
+
210
+ p {
211
+ text-indent: 4rem;
212
+ }
213
+ </style>
214
+
215
+ <paginate-content id="pagination-el" book-title="Título do livro">
216
+ <div slot="content">
217
+ <p>Conteúdo de uma pagina.</p>
218
+ <div class="page-break"></div>
219
+ <p>Conteúdo da próxima página.</div>
220
+ </div>
221
+ </paginate-content>
222
+
223
+ ```
224
+
225
+ ### Aplicando estilos na interface do paginador
226
+
227
+ No entanto, a maneira acima demonstrada não possibilita alterar o estilo da interface em sí do paginador. Isso porque o escopo do CSS do paginador está dentro de um [**web component**](https://developer.mozilla.org/en-US/docs/Web/API/Web_components), que possui escopo isolado do restante da página, aninhados no `shadow dom` daquele componente.
228
+
229
+ Para alterar o estilo da interface do web component, precisamos inserir o CSS almejado no escopo do web component. Para isso, disponibilizamos uma interface via parametros da configuração do componente, conforme exemplo a seguir:
230
+
231
+ ```html
232
+ <paginate-content id="pagination-el" book-title="Título do livro">
233
+ <div slot="content">
234
+ <p>Conteúdo de uma pagina.</p>
235
+ </div>
236
+ </paginate-content>
237
+
238
+ <script>
239
+ const settings = {
240
+ // outras opções
241
+ cssString: `
242
+ main#rootComponent {
243
+ transition: background-color 200ms linear;
244
+ }
245
+ `
246
+ }
247
+
248
+ const paginationEl = document.getElementById('pagination-el')
249
+ if (paginationEl) {
250
+ paginationEl.setAttribute("reader-settings", JSON.stringify(settings))
251
+ }
252
+ </script>
253
+ ```
254
+
255
+
256
+ -----
257
+
238
258
  ### Exemplos didáticos
239
-
259
+
240
260
  Para customizações especiais, navegue pelos exemplos abaixo e inspecione o código como ele funciona.
241
261
 
242
- [Uso básico](https://educkf.github.io/paginar-exemplos/exemplo1/exemplo1.html)
243
-
244
- [Mostrar logo no cabeçalho](https://educkf.github.io/paginar-exemplos/exemplo1/exemplo1-com-logo-no-cabecalho.html)
245
-
246
- [Com sumário](https://educkf.github.io/paginar-exemplos/exemplo2/exemplo2-cap1.html)
247
-
248
- [Fontes especiais p/ menu de opções](https://educkf.github.io/paginar-exemplos/exemplo3/exemplo3.html)
249
-
250
- Notas de rodapé (em breve)
251
-
252
- Referências bibliográficas (em breve)
253
-
254
- Customizar cores (em breve)
255
-
256
- Customizar apresentaçào de páginas (abertura, cores de fundo, quebra de pagina etc. Em breve)
257
-
258
- -----
259
-
260
- ### Exemplo real em uso (com alguma complexidade)
261
-
262
- [link](https://sabia.pub/book/okabayashi-uma-perspectiva-decolonial-para-o-design-no-brasil/read/haDxQvbtIIX4Hh5cOyee/content)
263
-
264
-
265
- ### Desenvolvimento
266
-
267
- - [X] Custom Component (or Web Component) to be used in any environment
268
- - [X] Paginate html/markdown content
269
- - [X] Auto-generate Summary
270
- - [X] Auto-recognize references and link accordingly
271
- - [ ] Navigate to specific point in content
272
- - [X] Customize options and summary menu
273
- - [X] Customize header
274
- - [X] CSS-theme structure
262
+ [Eventos e estado público (exemplo neste repositório)](https://sabia-publisher.github.io/paginar/demo/events/)
263
+
264
+ [Uso básico](https://educkf.github.io/paginar-exemplos/exemplo1/exemplo1.html)
265
+
266
+ [Mostrar logo no cabeçalho](https://educkf.github.io/paginar-exemplos/exemplo1/exemplo1-com-logo-no-cabecalho.html)
267
+
268
+ [Com sumário](https://educkf.github.io/paginar-exemplos/exemplo2/exemplo2-cap1.html)
269
+
270
+ [Fontes especiais p/ menu de opções](https://educkf.github.io/paginar-exemplos/exemplo3/exemplo3.html)
271
+
272
+ Notas de rodapé (em breve)
273
+
274
+ Referências bibliográficas (em breve)
275
+
276
+ Customizar cores (em breve)
277
+
278
+ Customizar apresentaçào de páginas (abertura, cores de fundo, quebra de pagina etc. Em breve)
279
+
280
+ -----
281
+
282
+ ### Exemplo real em uso (com alguma complexidade)
283
+
284
+ [link](https://sabia.pub/book/okabayashi-uma-perspectiva-decolonial-para-o-design-no-brasil/read/haDxQvbtIIX4Hh5cOyee/content)
285
+
286
+
287
+ ### Desenvolvimento
288
+
289
+ - [X] Custom Component (or Web Component) to be used in any environment
290
+ - [X] Paginate html/markdown content
291
+ - [X] Auto-generate Summary
292
+ - [X] Auto-recognize references and link accordingly
293
+ - [ ] Navigate to specific point in content
294
+ - [X] Customize options and summary menu
295
+ - [X] Customize header
296
+ - [X] CSS-theme structure