Repository files navigation

Paged.js examples

Showcase books paginated in the browser with Paged.js. Live site: https://pagedjs.github.io/pagedjs-examples/ (once published).

Each example is a self-contained folder — its own HTML, CSS, images and fonts, all referenced relatively. There is no build step: open a folder in a browser and it paginates itself.

Examples

ExampleStandaloneViewer
Auroræ: Their Characters and Spectraaurorae/viewer
Introductory Business Statistics, exported from Ketidaketida/viewer
Moby-Dickmoby-dick/viewer
Samplessamples/viewer
Samples, Gaia themesamples/gaia.htmlviewer
The Future of Ideasthe-future-of-ideas/viewer

Run locally

npm install
npm start

Then open http://localhost:9090/.

npm start runs serve with the options in serve.json: symlinks, so an npm linked pagedjs is followed instead of 404ing. Link to examples with a trailing slash (aurorae/); serve serves a bare /aurorae without redirecting, and relative paths then resolve against the root. serve also drops the .html extension, so the Gaia page is /samples/gaia locally and /samples/gaia.html on GitHub Pages.

Any static server that serves the tree works as well, for example python3 -m http.server.

Against a local Paged.js checkout

Until Paged.js 0.6 is on npm, this is the only way to run the examples — the published package does not have the source layout the import maps point at.

cd~/repos/pagedjs-combo && npm install && npm link # registers "pagedjs" globallycd~/repos/pagedjs-examples && npm install && npm link pagedjs && npm start

Caveats:

  • Any later npm install in this repo prunes the link. Re-run npm link pagedjs.
  • Other static servers need their own follow-symlinks option (python3 -m http.server follows symlinks; many others do not).
  • lit, css-tree and fragmentainers are dependencies of this repo, because the import map resolves them from this tree rather than from Paged.js's own node_modules. To run a local fragmentainers checkout too, npm link fragmentainers here as well.

How loading works

There is no bundler. Each page carries an inline import map naming the concrete files every bare specifier resolves to, followed by a module script that pulls in the polyfill:

<scripttype="importmap">{"imports": {"pagedjs": "../node_modules/pagedjs/src/index.js","pagedjs/polyfill": "../node_modules/pagedjs/src/polyfill/polyfill.js","pagedjs/components": "../node_modules/pagedjs/src/components/index.js","pagedjs/css-transformer": "../node_modules/pagedjs/src/css-transformer/CssTransformer.js","css-tree": "../node_modules/css-tree/dist/csstree.esm.js","lit": "../node_modules/lit/index.js","lit/": "../node_modules/lit/","lit-html": "../node_modules/lit-html/lit-html.js","lit-html/": "../node_modules/lit-html/","lit-element": "../node_modules/lit-element/index.js","lit-element/": "../node_modules/lit-element/","@lit/reactive-element": "../node_modules/@lit/reactive-element/reactive-element.js","@lit/reactive-element/": "../node_modules/@lit/reactive-element/","fragmentainers": "../node_modules/fragmentainers/src/index.js","fragmentainers/fragmentation": "../node_modules/fragmentainers/src/fragmentation/index.js","fragmentainers/layout": "../node_modules/fragmentainers/src/layout/index.js","fragmentainers/algorithms": "../node_modules/fragmentainers/src/algorithms/index.js","fragmentainers/styles": "../node_modules/fragmentainers/src/styles/index.js","fragmentainers/components": "../node_modules/fragmentainers/src/components/index.js","fragmentainers/handlers": "../node_modules/fragmentainers/src/handlers/index.js","fragmentainers/resolvers": "../node_modules/fragmentainers/src/resolvers/index.js","fragmentainers/debug/": "../node_modules/fragmentainers/debug/"}}</script><scripttype="module">import"pagedjs/polyfill";</script>

Notes on the shape of that block:

  • Import maps must be inline — <script type="importmap" src="..."> is not supported — and one map applies to one document. So the block is duplicated verbatim into every example page; paste it into a new one.
  • Browsers ignore the exports field in package.json, which is why the map names concrete files rather than package names.
  • css-tree resolves to dist/csstree.esm.js, its self-contained ES build; the package source is CommonJS-flavoured and would need a resolver.

Viewer

viewer/?url=<page> opens any example — or any same-origin HTML page — in a spread view with layout statistics and a fragment-outline toggle. Add &range=1-6 to paginate only part of a long book:

viewer/?url=../moby-dick/&range=1-6

Inline <style> blocks in a viewed page have their relative url()s resolved against the viewer's own document, not the page's, so examples should keep their CSS in linked stylesheets.

Add an example

Create <slug>/index.html plus book.css, and images/ / fonts/ as needed. All references must be relative, so the folder works both at the site root and under a project path.

In <head>, in this order:

  1. the stylesheet links;
  2. optionally a classic inline <script>window.PagedConfig = { … }</script> — it has to come before the module script, since the polyfill reads it on load;
  3. the import map;
  4. <script type="module">import "pagedjs/polyfill";</script>.

Then add a row to the landing page (index.html) and to the table below.

Provenance and licenses

ExampleText sourceText licenseMarkup / CSSNotes
auroraeProject Gutenberg, Auroræ: Their Characters and Spectra, J. Rand CapronPublic domain (Project Gutenberg License)MITFonts: Spectral (OFL 1.1), HK Grotesk (OFL 1.1), Daubenton (see aurorae/fonts/daubenton/LICENSE.txt)
ketidaOpenStax, Introductory Business Statistics (© 2018 Rice University), HTML exported from KetidaCC BY 4.0MITAttribution required — see the copyright page in ketida/index.html
samplesElectric Book Works, Samples, selection by Arthur Attwell (ISBN 978-1-928313-13-7)CC BY 4.0MITFrontmatter, images, code and mathematics, indexes
samples (Gaia theme)Same markup as samplesCC BY 4.0gaia.css ported from electricbookworks/paged-design (CC0 1.0)Fonts (Crimson Pro, Inter) are loaded from Google Fonts at runtime
moby-dickProject Gutenberg / Virginia Tech transcriptionPublic domainMITLong-document example
the-future-of-ideasLawrence Lessig, The Future of Ideas (2001)CC BY-NC (non-commercial only)MITThe text may not be reused commercially

License

The HTML structure, CSS and tooling in this repository are MIT — see LICENSE. The book texts, images and fonts keep their own licenses, listed above.

About

Showcase for books made with Paged.js

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Paged.js examples

Showcase books paginated in the browser with Paged.js. Live site: https://pagedjs.github.io/pagedjs-examples/ (once published).

Each example is a self-contained folder — its own HTML, CSS, images and fonts, all referenced relatively. There is no build step: open a folder in a browser and it paginates itself.

Examples

ExampleStandaloneViewer
Auroræ: Their Characters and Spectraaurorae/viewer
Introductory Business Statistics, exported from Ketidaketida/viewer
Moby-Dickmoby-dick/viewer
Samplessamples/viewer
Samples, Gaia themesamples/gaia.htmlviewer
The Future of Ideasthe-future-of-ideas/viewer

Run locally

npm install
npm start

Then open http://localhost:9090/.

npm start runs serve with the options in serve.json: symlinks, so an npm linked pagedjs is followed instead of 404ing. Link to examples with a trailing slash (aurorae/); serve serves a bare /aurorae without redirecting, and relative paths then resolve against the root. serve also drops the .html extension, so the Gaia page is /samples/gaia locally and /samples/gaia.html on GitHub Pages.

Any static server that serves the tree works as well, for example python3 -m http.server.

Against a local Paged.js checkout

Until Paged.js 0.6 is on npm, this is the only way to run the examples — the published package does not have the source layout the import maps point at.

cd~/repos/pagedjs-combo && npm install && npm link # registers "pagedjs" globallycd~/repos/pagedjs-examples && npm install && npm link pagedjs && npm start

Caveats:

  • Any later npm install in this repo prunes the link. Re-run npm link pagedjs.
  • Other static servers need their own follow-symlinks option (python3 -m http.server follows symlinks; many others do not).
  • lit, css-tree and fragmentainers are dependencies of this repo, because the import map resolves them from this tree rather than from Paged.js's own node_modules. To run a local fragmentainers checkout too, npm link fragmentainers here as well.

How loading works

There is no bundler. Each page carries an inline import map naming the concrete files every bare specifier resolves to, followed by a module script that pulls in the polyfill:

<scripttype="importmap">{"imports": {"pagedjs": "../node_modules/pagedjs/src/index.js","pagedjs/polyfill": "../node_modules/pagedjs/src/polyfill/polyfill.js","pagedjs/components": "../node_modules/pagedjs/src/components/index.js","pagedjs/css-transformer": "../node_modules/pagedjs/src/css-transformer/CssTransformer.js","css-tree": "../node_modules/css-tree/dist/csstree.esm.js","lit": "../node_modules/lit/index.js","lit/": "../node_modules/lit/","lit-html": "../node_modules/lit-html/lit-html.js","lit-html/": "../node_modules/lit-html/","lit-element": "../node_modules/lit-element/index.js","lit-element/": "../node_modules/lit-element/","@lit/reactive-element": "../node_modules/@lit/reactive-element/reactive-element.js","@lit/reactive-element/": "../node_modules/@lit/reactive-element/","fragmentainers": "../node_modules/fragmentainers/src/index.js","fragmentainers/fragmentation": "../node_modules/fragmentainers/src/fragmentation/index.js","fragmentainers/layout": "../node_modules/fragmentainers/src/layout/index.js","fragmentainers/algorithms": "../node_modules/fragmentainers/src/algorithms/index.js","fragmentainers/styles": "../node_modules/fragmentainers/src/styles/index.js","fragmentainers/components": "../node_modules/fragmentainers/src/components/index.js","fragmentainers/handlers": "../node_modules/fragmentainers/src/handlers/index.js","fragmentainers/resolvers": "../node_modules/fragmentainers/src/resolvers/index.js","fragmentainers/debug/": "../node_modules/fragmentainers/debug/"}}</script><scripttype="module">import"pagedjs/polyfill";</script>

Notes on the shape of that block:

  • Import maps must be inline — <script type="importmap" src="..."> is not supported — and one map applies to one document. So the block is duplicated verbatim into every example page; paste it into a new one.
  • Browsers ignore the exports field in package.json, which is why the map names concrete files rather than package names.
  • css-tree resolves to dist/csstree.esm.js, its self-contained ES build; the package source is CommonJS-flavoured and would need a resolver.

Viewer

viewer/?url=<page> opens any example — or any same-origin HTML page — in a spread view with layout statistics and a fragment-outline toggle. Add &range=1-6 to paginate only part of a long book:

viewer/?url=../moby-dick/&range=1-6

Inline <style> blocks in a viewed page have their relative url()s resolved against the viewer's own document, not the page's, so examples should keep their CSS in linked stylesheets.

Add an example

Create <slug>/index.html plus book.css, and images/ / fonts/ as needed. All references must be relative, so the folder works both at the site root and under a project path.

In <head>, in this order:

  1. the stylesheet links;
  2. optionally a classic inline <script>window.PagedConfig = { … }</script> — it has to come before the module script, since the polyfill reads it on load;
  3. the import map;
  4. <script type="module">import "pagedjs/polyfill";</script>.

Then add a row to the landing page (index.html) and to the table below.

Provenance and licenses

ExampleText sourceText licenseMarkup / CSSNotes
auroraeProject Gutenberg, Auroræ: Their Characters and Spectra, J. Rand CapronPublic domain (Project Gutenberg License)MITFonts: Spectral (OFL 1.1), HK Grotesk (OFL 1.1), Daubenton (see aurorae/fonts/daubenton/LICENSE.txt)
ketidaOpenStax, Introductory Business Statistics (© 2018 Rice University), HTML exported from KetidaCC BY 4.0MITAttribution required — see the copyright page in ketida/index.html
samplesElectric Book Works, Samples, selection by Arthur Attwell (ISBN 978-1-928313-13-7)CC BY 4.0MITFrontmatter, images, code and mathematics, indexes
samples (Gaia theme)Same markup as samplesCC BY 4.0gaia.css ported from electricbookworks/paged-design (CC0 1.0)Fonts (Crimson Pro, Inter) are loaded from Google Fonts at runtime
moby-dickProject Gutenberg / Virginia Tech transcriptionPublic domainMITLong-document example
the-future-of-ideasLawrence Lessig, The Future of Ideas (2001)CC BY-NC (non-commercial only)MITThe text may not be reused commercially

License

The HTML structure, CSS and tooling in this repository are MIT — see LICENSE. The book texts, images and fonts keep their own licenses, listed above.

About

Showcase for books made with Paged.js

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Paged.js examples

Showcase books paginated in the browser with Paged.js. Live site: https://pagedjs.github.io/pagedjs-examples/ (once published).

Each example is a self-contained folder — its own HTML, CSS, images and fonts, all referenced relatively. There is no build step: open a folder in a browser and it paginates itself.

Examples

ExampleStandaloneViewer
Auroræ: Their Characters and Spectraaurorae/viewer
Introductory Business Statistics, exported from Ketidaketida/viewer
Moby-Dickmoby-dick/viewer
Samplessamples/viewer
Samples, Gaia themesamples/gaia.htmlviewer
The Future of Ideasthe-future-of-ideas/viewer

Run locally

npm install
npm start

Then open http://localhost:9090/.

npm start runs serve with the options in serve.json: symlinks, so an npm linked pagedjs is followed instead of 404ing. Link to examples with a trailing slash (aurorae/); serve serves a bare /aurorae without redirecting, and relative paths then resolve against the root. serve also drops the .html extension, so the Gaia page is /samples/gaia locally and /samples/gaia.html on GitHub Pages.

Any static server that serves the tree works as well, for example python3 -m http.server.

Against a local Paged.js checkout

Until Paged.js 0.6 is on npm, this is the only way to run the examples — the published package does not have the source layout the import maps point at.

cd~/repos/pagedjs-combo && npm install && npm link # registers "pagedjs" globallycd~/repos/pagedjs-examples && npm install && npm link pagedjs && npm start

Caveats:

  • Any later npm install in this repo prunes the link. Re-run npm link pagedjs.
  • Other static servers need their own follow-symlinks option (python3 -m http.server follows symlinks; many others do not).
  • lit, css-tree and fragmentainers are dependencies of this repo, because the import map resolves them from this tree rather than from Paged.js's own node_modules. To run a local fragmentainers checkout too, npm link fragmentainers here as well.

How loading works

There is no bundler. Each page carries an inline import map naming the concrete files every bare specifier resolves to, followed by a module script that pulls in the polyfill:

<scripttype="importmap">{"imports": {"pagedjs": "../node_modules/pagedjs/src/index.js","pagedjs/polyfill": "../node_modules/pagedjs/src/polyfill/polyfill.js","pagedjs/components": "../node_modules/pagedjs/src/components/index.js","pagedjs/css-transformer": "../node_modules/pagedjs/src/css-transformer/CssTransformer.js","css-tree": "../node_modules/css-tree/dist/csstree.esm.js","lit": "../node_modules/lit/index.js","lit/": "../node_modules/lit/","lit-html": "../node_modules/lit-html/lit-html.js","lit-html/": "../node_modules/lit-html/","lit-element": "../node_modules/lit-element/index.js","lit-element/": "../node_modules/lit-element/","@lit/reactive-element": "../node_modules/@lit/reactive-element/reactive-element.js","@lit/reactive-element/": "../node_modules/@lit/reactive-element/","fragmentainers": "../node_modules/fragmentainers/src/index.js","fragmentainers/fragmentation": "../node_modules/fragmentainers/src/fragmentation/index.js","fragmentainers/layout": "../node_modules/fragmentainers/src/layout/index.js","fragmentainers/algorithms": "../node_modules/fragmentainers/src/algorithms/index.js","fragmentainers/styles": "../node_modules/fragmentainers/src/styles/index.js","fragmentainers/components": "../node_modules/fragmentainers/src/components/index.js","fragmentainers/handlers": "../node_modules/fragmentainers/src/handlers/index.js","fragmentainers/resolvers": "../node_modules/fragmentainers/src/resolvers/index.js","fragmentainers/debug/": "../node_modules/fragmentainers/debug/"}}</script><scripttype="module">import"pagedjs/polyfill";</script>

Notes on the shape of that block:

  • Import maps must be inline — <script type="importmap" src="..."> is not supported — and one map applies to one document. So the block is duplicated verbatim into every example page; paste it into a new one.
  • Browsers ignore the exports field in package.json, which is why the map names concrete files rather than package names.
  • css-tree resolves to dist/csstree.esm.js, its self-contained ES build; the package source is CommonJS-flavoured and would need a resolver.

Viewer

viewer/?url=<page> opens any example — or any same-origin HTML page — in a spread view with layout statistics and a fragment-outline toggle. Add &range=1-6 to paginate only part of a long book:

viewer/?url=../moby-dick/&range=1-6

Inline <style> blocks in a viewed page have their relative url()s resolved against the viewer's own document, not the page's, so examples should keep their CSS in linked stylesheets.

Add an example

Create <slug>/index.html plus book.css, and images/ / fonts/ as needed. All references must be relative, so the folder works both at the site root and under a project path.

In <head>, in this order:

  1. the stylesheet links;
  2. optionally a classic inline <script>window.PagedConfig = { … }</script> — it has to come before the module script, since the polyfill reads it on load;
  3. the import map;
  4. <script type="module">import "pagedjs/polyfill";</script>.

Then add a row to the landing page (index.html) and to the table below.

Provenance and licenses

ExampleText sourceText licenseMarkup / CSSNotes
auroraeProject Gutenberg, Auroræ: Their Characters and Spectra, J. Rand CapronPublic domain (Project Gutenberg License)MITFonts: Spectral (OFL 1.1), HK Grotesk (OFL 1.1), Daubenton (see aurorae/fonts/daubenton/LICENSE.txt)
ketidaOpenStax, Introductory Business Statistics (© 2018 Rice University), HTML exported from KetidaCC BY 4.0MITAttribution required — see the copyright page in ketida/index.html
samplesElectric Book Works, Samples, selection by Arthur Attwell (ISBN 978-1-928313-13-7)CC BY 4.0MITFrontmatter, images, code and mathematics, indexes
samples (Gaia theme)Same markup as samplesCC BY 4.0gaia.css ported from electricbookworks/paged-design (CC0 1.0)Fonts (Crimson Pro, Inter) are loaded from Google Fonts at runtime
moby-dickProject Gutenberg / Virginia Tech transcriptionPublic domainMITLong-document example
the-future-of-ideasLawrence Lessig, The Future of Ideas (2001)CC BY-NC (non-commercial only)MITThe text may not be reused commercially

License

The HTML structure, CSS and tooling in this repository are MIT — see LICENSE. The book texts, images and fonts keep their own licenses, listed above.

About

Showcase for books made with Paged.js

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Paged.js examples

Showcase books paginated in the browser with Paged.js. Live site: https://pagedjs.github.io/pagedjs-examples/ (once published).

Each example is a self-contained folder — its own HTML, CSS, images and fonts, all referenced relatively. There is no build step: open a folder in a browser and it paginates itself.

Examples

ExampleStandaloneViewer
Auroræ: Their Characters and Spectraaurorae/viewer
Introductory Business Statistics, exported from Ketidaketida/viewer
Moby-Dickmoby-dick/viewer
Samplessamples/viewer
Samples, Gaia themesamples/gaia.htmlviewer
The Future of Ideasthe-future-of-ideas/viewer

Run locally

npm install
npm start

Then open http://localhost:9090/.

npm start runs serve with the options in serve.json: symlinks, so an npm linked pagedjs is followed instead of 404ing. Link to examples with a trailing slash (aurorae/); serve serves a bare /aurorae without redirecting, and relative paths then resolve against the root. serve also drops the .html extension, so the Gaia page is /samples/gaia locally and /samples/gaia.html on GitHub Pages.

Any static server that serves the tree works as well, for example python3 -m http.server.

Against a local Paged.js checkout

Until Paged.js 0.6 is on npm, this is the only way to run the examples — the published package does not have the source layout the import maps point at.

cd~/repos/pagedjs-combo && npm install && npm link # registers "pagedjs" globallycd~/repos/pagedjs-examples && npm install && npm link pagedjs && npm start

Caveats:

  • Any later npm install in this repo prunes the link. Re-run npm link pagedjs.
  • Other static servers need their own follow-symlinks option (python3 -m http.server follows symlinks; many others do not).
  • lit, css-tree and fragmentainers are dependencies of this repo, because the import map resolves them from this tree rather than from Paged.js's own node_modules. To run a local fragmentainers checkout too, npm link fragmentainers here as well.

How loading works

There is no bundler. Each page carries an inline import map naming the concrete files every bare specifier resolves to, followed by a module script that pulls in the polyfill:

<scripttype="importmap">{"imports": {"pagedjs": "../node_modules/pagedjs/src/index.js","pagedjs/polyfill": "../node_modules/pagedjs/src/polyfill/polyfill.js","pagedjs/components": "../node_modules/pagedjs/src/components/index.js","pagedjs/css-transformer": "../node_modules/pagedjs/src/css-transformer/CssTransformer.js","css-tree": "../node_modules/css-tree/dist/csstree.esm.js","lit": "../node_modules/lit/index.js","lit/": "../node_modules/lit/","lit-html": "../node_modules/lit-html/lit-html.js","lit-html/": "../node_modules/lit-html/","lit-element": "../node_modules/lit-element/index.js","lit-element/": "../node_modules/lit-element/","@lit/reactive-element": "../node_modules/@lit/reactive-element/reactive-element.js","@lit/reactive-element/": "../node_modules/@lit/reactive-element/","fragmentainers": "../node_modules/fragmentainers/src/index.js","fragmentainers/fragmentation": "../node_modules/fragmentainers/src/fragmentation/index.js","fragmentainers/layout": "../node_modules/fragmentainers/src/layout/index.js","fragmentainers/algorithms": "../node_modules/fragmentainers/src/algorithms/index.js","fragmentainers/styles": "../node_modules/fragmentainers/src/styles/index.js","fragmentainers/components": "../node_modules/fragmentainers/src/components/index.js","fragmentainers/handlers": "../node_modules/fragmentainers/src/handlers/index.js","fragmentainers/resolvers": "../node_modules/fragmentainers/src/resolvers/index.js","fragmentainers/debug/": "../node_modules/fragmentainers/debug/"}}</script><scripttype="module">import"pagedjs/polyfill";</script>

Notes on the shape of that block:

  • Import maps must be inline — <script type="importmap" src="..."> is not supported — and one map applies to one document. So the block is duplicated verbatim into every example page; paste it into a new one.
  • Browsers ignore the exports field in package.json, which is why the map names concrete files rather than package names.
  • css-tree resolves to dist/csstree.esm.js, its self-contained ES build; the package source is CommonJS-flavoured and would need a resolver.

Viewer

viewer/?url=<page> opens any example — or any same-origin HTML page — in a spread view with layout statistics and a fragment-outline toggle. Add &range=1-6 to paginate only part of a long book:

viewer/?url=../moby-dick/&range=1-6

Inline <style> blocks in a viewed page have their relative url()s resolved against the viewer's own document, not the page's, so examples should keep their CSS in linked stylesheets.

Add an example

Create <slug>/index.html plus book.css, and images/ / fonts/ as needed. All references must be relative, so the folder works both at the site root and under a project path.

In <head>, in this order:

  1. the stylesheet links;
  2. optionally a classic inline <script>window.PagedConfig = { … }</script> — it has to come before the module script, since the polyfill reads it on load;
  3. the import map;
  4. <script type="module">import "pagedjs/polyfill";</script>.

Then add a row to the landing page (index.html) and to the table below.

Provenance and licenses

ExampleText sourceText licenseMarkup / CSSNotes
auroraeProject Gutenberg, Auroræ: Their Characters and Spectra, J. Rand CapronPublic domain (Project Gutenberg License)MITFonts: Spectral (OFL 1.1), HK Grotesk (OFL 1.1), Daubenton (see aurorae/fonts/daubenton/LICENSE.txt)
ketidaOpenStax, Introductory Business Statistics (© 2018 Rice University), HTML exported from KetidaCC BY 4.0MITAttribution required — see the copyright page in ketida/index.html
samplesElectric Book Works, Samples, selection by Arthur Attwell (ISBN 978-1-928313-13-7)CC BY 4.0MITFrontmatter, images, code and mathematics, indexes
samples (Gaia theme)Same markup as samplesCC BY 4.0gaia.css ported from electricbookworks/paged-design (CC0 1.0)Fonts (Crimson Pro, Inter) are loaded from Google Fonts at runtime
moby-dickProject Gutenberg / Virginia Tech transcriptionPublic domainMITLong-document example
the-future-of-ideasLawrence Lessig, The Future of Ideas (2001)CC BY-NC (non-commercial only)MITThe text may not be reused commercially

License

The HTML structure, CSS and tooling in this repository are MIT — see LICENSE. The book texts, images and fonts keep their own licenses, listed above.

About

Showcase for books made with Paged.js

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Paged.js examples

Showcase books paginated in the browser with Paged.js. Live site: https://pagedjs.github.io/pagedjs-examples/ (once published).

Each example is a self-contained folder — its own HTML, CSS, images and fonts, all referenced relatively. There is no build step: open a folder in a browser and it paginates itself.

Examples

ExampleStandaloneViewer
Auroræ: Their Characters and Spectraaurorae/viewer
Introductory Business Statistics, exported from Ketidaketida/viewer
Moby-Dickmoby-dick/viewer
Samplessamples/viewer
Samples, Gaia themesamples/gaia.htmlviewer
The Future of Ideasthe-future-of-ideas/viewer

Run locally

npm install
npm start

Then open http://localhost:9090/.

npm start runs serve with the options in serve.json: symlinks, so an npm linked pagedjs is followed instead of 404ing. Link to examples with a trailing slash (aurorae/); serve serves a bare /aurorae without redirecting, and relative paths then resolve against the root. serve also drops the .html extension, so the Gaia page is /samples/gaia locally and /samples/gaia.html on GitHub Pages.

Any static server that serves the tree works as well, for example python3 -m http.server.

Against a local Paged.js checkout

Until Paged.js 0.6 is on npm, this is the only way to run the examples — the published package does not have the source layout the import maps point at.

cd~/repos/pagedjs-combo && npm install && npm link # registers "pagedjs" globallycd~/repos/pagedjs-examples && npm install && npm link pagedjs && npm start

Caveats:

  • Any later npm install in this repo prunes the link. Re-run npm link pagedjs.
  • Other static servers need their own follow-symlinks option (python3 -m http.server follows symlinks; many others do not).
  • lit, css-tree and fragmentainers are dependencies of this repo, because the import map resolves them from this tree rather than from Paged.js's own node_modules. To run a local fragmentainers checkout too, npm link fragmentainers here as well.

How loading works

There is no bundler. Each page carries an inline import map naming the concrete files every bare specifier resolves to, followed by a module script that pulls in the polyfill:

<scripttype="importmap">{"imports": {"pagedjs": "../node_modules/pagedjs/src/index.js","pagedjs/polyfill": "../node_modules/pagedjs/src/polyfill/polyfill.js","pagedjs/components": "../node_modules/pagedjs/src/components/index.js","pagedjs/css-transformer": "../node_modules/pagedjs/src/css-transformer/CssTransformer.js","css-tree": "../node_modules/css-tree/dist/csstree.esm.js","lit": "../node_modules/lit/index.js","lit/": "../node_modules/lit/","lit-html": "../node_modules/lit-html/lit-html.js","lit-html/": "../node_modules/lit-html/","lit-element": "../node_modules/lit-element/index.js","lit-element/": "../node_modules/lit-element/","@lit/reactive-element": "../node_modules/@lit/reactive-element/reactive-element.js","@lit/reactive-element/": "../node_modules/@lit/reactive-element/","fragmentainers": "../node_modules/fragmentainers/src/index.js","fragmentainers/fragmentation": "../node_modules/fragmentainers/src/fragmentation/index.js","fragmentainers/layout": "../node_modules/fragmentainers/src/layout/index.js","fragmentainers/algorithms": "../node_modules/fragmentainers/src/algorithms/index.js","fragmentainers/styles": "../node_modules/fragmentainers/src/styles/index.js","fragmentainers/components": "../node_modules/fragmentainers/src/components/index.js","fragmentainers/handlers": "../node_modules/fragmentainers/src/handlers/index.js","fragmentainers/resolvers": "../node_modules/fragmentainers/src/resolvers/index.js","fragmentainers/debug/": "../node_modules/fragmentainers/debug/"}}</script><scripttype="module">import"pagedjs/polyfill";</script>

Notes on the shape of that block:

  • Import maps must be inline — <script type="importmap" src="..."> is not supported — and one map applies to one document. So the block is duplicated verbatim into every example page; paste it into a new one.
  • Browsers ignore the exports field in package.json, which is why the map names concrete files rather than package names.
  • css-tree resolves to dist/csstree.esm.js, its self-contained ES build; the package source is CommonJS-flavoured and would need a resolver.

Viewer

viewer/?url=<page> opens any example — or any same-origin HTML page — in a spread view with layout statistics and a fragment-outline toggle. Add &range=1-6 to paginate only part of a long book:

viewer/?url=../moby-dick/&range=1-6

Inline <style> blocks in a viewed page have their relative url()s resolved against the viewer's own document, not the page's, so examples should keep their CSS in linked stylesheets.

Add an example

Create <slug>/index.html plus book.css, and images/ / fonts/ as needed. All references must be relative, so the folder works both at the site root and under a project path.

In <head>, in this order:

  1. the stylesheet links;
  2. optionally a classic inline <script>window.PagedConfig = { … }</script> — it has to come before the module script, since the polyfill reads it on load;
  3. the import map;
  4. <script type="module">import "pagedjs/polyfill";</script>.

Then add a row to the landing page (index.html) and to the table below.

Provenance and licenses

ExampleText sourceText licenseMarkup / CSSNotes
auroraeProject Gutenberg, Auroræ: Their Characters and Spectra, J. Rand CapronPublic domain (Project Gutenberg License)MITFonts: Spectral (OFL 1.1), HK Grotesk (OFL 1.1), Daubenton (see aurorae/fonts/daubenton/LICENSE.txt)
ketidaOpenStax, Introductory Business Statistics (© 2018 Rice University), HTML exported from KetidaCC BY 4.0MITAttribution required — see the copyright page in ketida/index.html
samplesElectric Book Works, Samples, selection by Arthur Attwell (ISBN 978-1-928313-13-7)CC BY 4.0MITFrontmatter, images, code and mathematics, indexes
samples (Gaia theme)Same markup as samplesCC BY 4.0gaia.css ported from electricbookworks/paged-design (CC0 1.0)Fonts (Crimson Pro, Inter) are loaded from Google Fonts at runtime
moby-dickProject Gutenberg / Virginia Tech transcriptionPublic domainMITLong-document example
the-future-of-ideasLawrence Lessig, The Future of Ideas (2001)CC BY-NC (non-commercial only)MITThe text may not be reused commercially

License

The HTML structure, CSS and tooling in this repository are MIT — see LICENSE. The book texts, images and fonts keep their own licenses, listed above.

About

Showcase for books made with Paged.js

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Paged.js examples

Showcase books paginated in the browser with Paged.js. Live site: https://pagedjs.github.io/pagedjs-examples/ (once published).

Each example is a self-contained folder — its own HTML, CSS, images and fonts, all referenced relatively. There is no build step: open a folder in a browser and it paginates itself.

Examples

ExampleStandaloneViewer
Auroræ: Their Characters and Spectraaurorae/viewer
Introductory Business Statistics, exported from Ketidaketida/viewer
Moby-Dickmoby-dick/viewer
Samplessamples/viewer
Samples, Gaia themesamples/gaia.htmlviewer
The Future of Ideasthe-future-of-ideas/viewer

Run locally

npm install
npm start

Then open http://localhost:9090/.

npm start runs serve with the options in serve.json: symlinks, so an npm linked pagedjs is followed instead of 404ing. Link to examples with a trailing slash (aurorae/); serve serves a bare /aurorae without redirecting, and relative paths then resolve against the root. serve also drops the .html extension, so the Gaia page is /samples/gaia locally and /samples/gaia.html on GitHub Pages.

Any static server that serves the tree works as well, for example python3 -m http.server.

Against a local Paged.js checkout

Until Paged.js 0.6 is on npm, this is the only way to run the examples — the published package does not have the source layout the import maps point at.

cd~/repos/pagedjs-combo && npm install && npm link # registers "pagedjs" globallycd~/repos/pagedjs-examples && npm install && npm link pagedjs && npm start

Caveats:

  • Any later npm install in this repo prunes the link. Re-run npm link pagedjs.
  • Other static servers need their own follow-symlinks option (python3 -m http.server follows symlinks; many others do not).
  • lit, css-tree and fragmentainers are dependencies of this repo, because the import map resolves them from this tree rather than from Paged.js's own node_modules. To run a local fragmentainers checkout too, npm link fragmentainers here as well.

How loading works

There is no bundler. Each page carries an inline import map naming the concrete files every bare specifier resolves to, followed by a module script that pulls in the polyfill:

<scripttype="importmap">{"imports": {"pagedjs": "../node_modules/pagedjs/src/index.js","pagedjs/polyfill": "../node_modules/pagedjs/src/polyfill/polyfill.js","pagedjs/components": "../node_modules/pagedjs/src/components/index.js","pagedjs/css-transformer": "../node_modules/pagedjs/src/css-transformer/CssTransformer.js","css-tree": "../node_modules/css-tree/dist/csstree.esm.js","lit": "../node_modules/lit/index.js","lit/": "../node_modules/lit/","lit-html": "../node_modules/lit-html/lit-html.js","lit-html/": "../node_modules/lit-html/","lit-element": "../node_modules/lit-element/index.js","lit-element/": "../node_modules/lit-element/","@lit/reactive-element": "../node_modules/@lit/reactive-element/reactive-element.js","@lit/reactive-element/": "../node_modules/@lit/reactive-element/","fragmentainers": "../node_modules/fragmentainers/src/index.js","fragmentainers/fragmentation": "../node_modules/fragmentainers/src/fragmentation/index.js","fragmentainers/layout": "../node_modules/fragmentainers/src/layout/index.js","fragmentainers/algorithms": "../node_modules/fragmentainers/src/algorithms/index.js","fragmentainers/styles": "../node_modules/fragmentainers/src/styles/index.js","fragmentainers/components": "../node_modules/fragmentainers/src/components/index.js","fragmentainers/handlers": "../node_modules/fragmentainers/src/handlers/index.js","fragmentainers/resolvers": "../node_modules/fragmentainers/src/resolvers/index.js","fragmentainers/debug/": "../node_modules/fragmentainers/debug/"}}</script><scripttype="module">import"pagedjs/polyfill";</script>

Notes on the shape of that block:

  • Import maps must be inline — <script type="importmap" src="..."> is not supported — and one map applies to one document. So the block is duplicated verbatim into every example page; paste it into a new one.
  • Browsers ignore the exports field in package.json, which is why the map names concrete files rather than package names.
  • css-tree resolves to dist/csstree.esm.js, its self-contained ES build; the package source is CommonJS-flavoured and would need a resolver.

Viewer

viewer/?url=<page> opens any example — or any same-origin HTML page — in a spread view with layout statistics and a fragment-outline toggle. Add &range=1-6 to paginate only part of a long book:

viewer/?url=../moby-dick/&range=1-6

Inline <style> blocks in a viewed page have their relative url()s resolved against the viewer's own document, not the page's, so examples should keep their CSS in linked stylesheets.

Add an example

Create <slug>/index.html plus book.css, and images/ / fonts/ as needed. All references must be relative, so the folder works both at the site root and under a project path.

In <head>, in this order:

  1. the stylesheet links;
  2. optionally a classic inline <script>window.PagedConfig = { … }</script> — it has to come before the module script, since the polyfill reads it on load;
  3. the import map;
  4. <script type="module">import "pagedjs/polyfill";</script>.

Then add a row to the landing page (index.html) and to the table below.

Provenance and licenses

ExampleText sourceText licenseMarkup / CSSNotes
auroraeProject Gutenberg, Auroræ: Their Characters and Spectra, J. Rand CapronPublic domain (Project Gutenberg License)MITFonts: Spectral (OFL 1.1), HK Grotesk (OFL 1.1), Daubenton (see aurorae/fonts/daubenton/LICENSE.txt)
ketidaOpenStax, Introductory Business Statistics (© 2018 Rice University), HTML exported from KetidaCC BY 4.0MITAttribution required — see the copyright page in ketida/index.html
samplesElectric Book Works, Samples, selection by Arthur Attwell (ISBN 978-1-928313-13-7)CC BY 4.0MITFrontmatter, images, code and mathematics, indexes
samples (Gaia theme)Same markup as samplesCC BY 4.0gaia.css ported from electricbookworks/paged-design (CC0 1.0)Fonts (Crimson Pro, Inter) are loaded from Google Fonts at runtime
moby-dickProject Gutenberg / Virginia Tech transcriptionPublic domainMITLong-document example
the-future-of-ideasLawrence Lessig, The Future of Ideas (2001)CC BY-NC (non-commercial only)MITThe text may not be reused commercially

License

The HTML structure, CSS and tooling in this repository are MIT — see LICENSE. The book texts, images and fonts keep their own licenses, listed above.

About

Showcase for books made with Paged.js

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Paged.js examples

Showcase books paginated in the browser with Paged.js. Live site: https://pagedjs.github.io/pagedjs-examples/ (once published).

Each example is a self-contained folder — its own HTML, CSS, images and fonts, all referenced relatively. There is no build step: open a folder in a browser and it paginates itself.

Examples

ExampleStandaloneViewer
Auroræ: Their Characters and Spectraaurorae/viewer
Introductory Business Statistics, exported from Ketidaketida/viewer
Moby-Dickmoby-dick/viewer
Samplessamples/viewer
Samples, Gaia themesamples/gaia.htmlviewer
The Future of Ideasthe-future-of-ideas/viewer

Run locally

npm install
npm start

Then open http://localhost:9090/.

npm start runs serve with the options in serve.json: symlinks, so an npm linked pagedjs is followed instead of 404ing. Link to examples with a trailing slash (aurorae/); serve serves a bare /aurorae without redirecting, and relative paths then resolve against the root. serve also drops the .html extension, so the Gaia page is /samples/gaia locally and /samples/gaia.html on GitHub Pages.

Any static server that serves the tree works as well, for example python3 -m http.server.

Against a local Paged.js checkout

Until Paged.js 0.6 is on npm, this is the only way to run the examples — the published package does not have the source layout the import maps point at.

cd~/repos/pagedjs-combo && npm install && npm link # registers "pagedjs" globallycd~/repos/pagedjs-examples && npm install && npm link pagedjs && npm start

Caveats:

  • Any later npm install in this repo prunes the link. Re-run npm link pagedjs.
  • Other static servers need their own follow-symlinks option (python3 -m http.server follows symlinks; many others do not).
  • lit, css-tree and fragmentainers are dependencies of this repo, because the import map resolves them from this tree rather than from Paged.js's own node_modules. To run a local fragmentainers checkout too, npm link fragmentainers here as well.

How loading works

There is no bundler. Each page carries an inline import map naming the concrete files every bare specifier resolves to, followed by a module script that pulls in the polyfill:

<scripttype="importmap">{"imports": {"pagedjs": "../node_modules/pagedjs/src/index.js","pagedjs/polyfill": "../node_modules/pagedjs/src/polyfill/polyfill.js","pagedjs/components": "../node_modules/pagedjs/src/components/index.js","pagedjs/css-transformer": "../node_modules/pagedjs/src/css-transformer/CssTransformer.js","css-tree": "../node_modules/css-tree/dist/csstree.esm.js","lit": "../node_modules/lit/index.js","lit/": "../node_modules/lit/","lit-html": "../node_modules/lit-html/lit-html.js","lit-html/": "../node_modules/lit-html/","lit-element": "../node_modules/lit-element/index.js","lit-element/": "../node_modules/lit-element/","@lit/reactive-element": "../node_modules/@lit/reactive-element/reactive-element.js","@lit/reactive-element/": "../node_modules/@lit/reactive-element/","fragmentainers": "../node_modules/fragmentainers/src/index.js","fragmentainers/fragmentation": "../node_modules/fragmentainers/src/fragmentation/index.js","fragmentainers/layout": "../node_modules/fragmentainers/src/layout/index.js","fragmentainers/algorithms": "../node_modules/fragmentainers/src/algorithms/index.js","fragmentainers/styles": "../node_modules/fragmentainers/src/styles/index.js","fragmentainers/components": "../node_modules/fragmentainers/src/components/index.js","fragmentainers/handlers": "../node_modules/fragmentainers/src/handlers/index.js","fragmentainers/resolvers": "../node_modules/fragmentainers/src/resolvers/index.js","fragmentainers/debug/": "../node_modules/fragmentainers/debug/"}}</script><scripttype="module">import"pagedjs/polyfill";</script>

Notes on the shape of that block:

  • Import maps must be inline — <script type="importmap" src="..."> is not supported — and one map applies to one document. So the block is duplicated verbatim into every example page; paste it into a new one.
  • Browsers ignore the exports field in package.json, which is why the map names concrete files rather than package names.
  • css-tree resolves to dist/csstree.esm.js, its self-contained ES build; the package source is CommonJS-flavoured and would need a resolver.

Viewer

viewer/?url=<page> opens any example — or any same-origin HTML page — in a spread view with layout statistics and a fragment-outline toggle. Add &range=1-6 to paginate only part of a long book:

viewer/?url=../moby-dick/&range=1-6

Inline <style> blocks in a viewed page have their relative url()s resolved against the viewer's own document, not the page's, so examples should keep their CSS in linked stylesheets.

Add an example

Create <slug>/index.html plus book.css, and images/ / fonts/ as needed. All references must be relative, so the folder works both at the site root and under a project path.

In <head>, in this order:

  1. the stylesheet links;
  2. optionally a classic inline <script>window.PagedConfig = { … }</script> — it has to come before the module script, since the polyfill reads it on load;
  3. the import map;
  4. <script type="module">import "pagedjs/polyfill";</script>.

Then add a row to the landing page (index.html) and to the table below.

Provenance and licenses

ExampleText sourceText licenseMarkup / CSSNotes
auroraeProject Gutenberg, Auroræ: Their Characters and Spectra, J. Rand CapronPublic domain (Project Gutenberg License)MITFonts: Spectral (OFL 1.1), HK Grotesk (OFL 1.1), Daubenton (see aurorae/fonts/daubenton/LICENSE.txt)
ketidaOpenStax, Introductory Business Statistics (© 2018 Rice University), HTML exported from KetidaCC BY 4.0MITAttribution required — see the copyright page in ketida/index.html
samplesElectric Book Works, Samples, selection by Arthur Attwell (ISBN 978-1-928313-13-7)CC BY 4.0MITFrontmatter, images, code and mathematics, indexes
samples (Gaia theme)Same markup as samplesCC BY 4.0gaia.css ported from electricbookworks/paged-design (CC0 1.0)Fonts (Crimson Pro, Inter) are loaded from Google Fonts at runtime
moby-dickProject Gutenberg / Virginia Tech transcriptionPublic domainMITLong-document example
the-future-of-ideasLawrence Lessig, The Future of Ideas (2001)CC BY-NC (non-commercial only)MITThe text may not be reused commercially

License

The HTML structure, CSS and tooling in this repository are MIT — see LICENSE. The book texts, images and fonts keep their own licenses, listed above.

About

Showcase for books made with Paged.js

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Paged.js examples

Showcase books paginated in the browser with Paged.js. Live site: https://pagedjs.github.io/pagedjs-examples/ (once published).

Each example is a self-contained folder — its own HTML, CSS, images and fonts, all referenced relatively. There is no build step: open a folder in a browser and it paginates itself.

Examples

ExampleStandaloneViewer
Auroræ: Their Characters and Spectraaurorae/viewer
Introductory Business Statistics, exported from Ketidaketida/viewer
Moby-Dickmoby-dick/viewer
Samplessamples/viewer
Samples, Gaia themesamples/gaia.htmlviewer
The Future of Ideasthe-future-of-ideas/viewer

Run locally

npm install
npm start

Then open http://localhost:9090/.

npm start runs serve with the options in serve.json: symlinks, so an npm linked pagedjs is followed instead of 404ing. Link to examples with a trailing slash (aurorae/); serve serves a bare /aurorae without redirecting, and relative paths then resolve against the root. serve also drops the .html extension, so the Gaia page is /samples/gaia locally and /samples/gaia.html on GitHub Pages.

Any static server that serves the tree works as well, for example python3 -m http.server.

Against a local Paged.js checkout

Until Paged.js 0.6 is on npm, this is the only way to run the examples — the published package does not have the source layout the import maps point at.

cd~/repos/pagedjs-combo && npm install && npm link # registers "pagedjs" globallycd~/repos/pagedjs-examples && npm install && npm link pagedjs && npm start

Caveats:

  • Any later npm install in this repo prunes the link. Re-run npm link pagedjs.
  • Other static servers need their own follow-symlinks option (python3 -m http.server follows symlinks; many others do not).
  • lit, css-tree and fragmentainers are dependencies of this repo, because the import map resolves them from this tree rather than from Paged.js's own node_modules. To run a local fragmentainers checkout too, npm link fragmentainers here as well.

How loading works

There is no bundler. Each page carries an inline import map naming the concrete files every bare specifier resolves to, followed by a module script that pulls in the polyfill:

<scripttype="importmap">{"imports": {"pagedjs": "../node_modules/pagedjs/src/index.js","pagedjs/polyfill": "../node_modules/pagedjs/src/polyfill/polyfill.js","pagedjs/components": "../node_modules/pagedjs/src/components/index.js","pagedjs/css-transformer": "../node_modules/pagedjs/src/css-transformer/CssTransformer.js","css-tree": "../node_modules/css-tree/dist/csstree.esm.js","lit": "../node_modules/lit/index.js","lit/": "../node_modules/lit/","lit-html": "../node_modules/lit-html/lit-html.js","lit-html/": "../node_modules/lit-html/","lit-element": "../node_modules/lit-element/index.js","lit-element/": "../node_modules/lit-element/","@lit/reactive-element": "../node_modules/@lit/reactive-element/reactive-element.js","@lit/reactive-element/": "../node_modules/@lit/reactive-element/","fragmentainers": "../node_modules/fragmentainers/src/index.js","fragmentainers/fragmentation": "../node_modules/fragmentainers/src/fragmentation/index.js","fragmentainers/layout": "../node_modules/fragmentainers/src/layout/index.js","fragmentainers/algorithms": "../node_modules/fragmentainers/src/algorithms/index.js","fragmentainers/styles": "../node_modules/fragmentainers/src/styles/index.js","fragmentainers/components": "../node_modules/fragmentainers/src/components/index.js","fragmentainers/handlers": "../node_modules/fragmentainers/src/handlers/index.js","fragmentainers/resolvers": "../node_modules/fragmentainers/src/resolvers/index.js","fragmentainers/debug/": "../node_modules/fragmentainers/debug/"}}</script><scripttype="module">import"pagedjs/polyfill";</script>

Notes on the shape of that block:

  • Import maps must be inline — <script type="importmap" src="..."> is not supported — and one map applies to one document. So the block is duplicated verbatim into every example page; paste it into a new one.
  • Browsers ignore the exports field in package.json, which is why the map names concrete files rather than package names.
  • css-tree resolves to dist/csstree.esm.js, its self-contained ES build; the package source is CommonJS-flavoured and would need a resolver.

Viewer

viewer/?url=<page> opens any example — or any same-origin HTML page — in a spread view with layout statistics and a fragment-outline toggle. Add &range=1-6 to paginate only part of a long book:

viewer/?url=../moby-dick/&range=1-6

Inline <style> blocks in a viewed page have their relative url()s resolved against the viewer's own document, not the page's, so examples should keep their CSS in linked stylesheets.

Add an example

Create <slug>/index.html plus book.css, and images/ / fonts/ as needed. All references must be relative, so the folder works both at the site root and under a project path.

In <head>, in this order:

  1. the stylesheet links;
  2. optionally a classic inline <script>window.PagedConfig = { … }</script> — it has to come before the module script, since the polyfill reads it on load;
  3. the import map;
  4. <script type="module">import "pagedjs/polyfill";</script>.

Then add a row to the landing page (index.html) and to the table below.

Provenance and licenses

ExampleText sourceText licenseMarkup / CSSNotes
auroraeProject Gutenberg, Auroræ: Their Characters and Spectra, J. Rand CapronPublic domain (Project Gutenberg License)MITFonts: Spectral (OFL 1.1), HK Grotesk (OFL 1.1), Daubenton (see aurorae/fonts/daubenton/LICENSE.txt)
ketidaOpenStax, Introductory Business Statistics (© 2018 Rice University), HTML exported from KetidaCC BY 4.0MITAttribution required — see the copyright page in ketida/index.html
samplesElectric Book Works, Samples, selection by Arthur Attwell (ISBN 978-1-928313-13-7)CC BY 4.0MITFrontmatter, images, code and mathematics, indexes
samples (Gaia theme)Same markup as samplesCC BY 4.0gaia.css ported from electricbookworks/paged-design (CC0 1.0)Fonts (Crimson Pro, Inter) are loaded from Google Fonts at runtime
moby-dickProject Gutenberg / Virginia Tech transcriptionPublic domainMITLong-document example
the-future-of-ideasLawrence Lessig, The Future of Ideas (2001)CC BY-NC (non-commercial only)MITThe text may not be reused commercially

License

The HTML structure, CSS and tooling in this repository are MIT — see LICENSE. The book texts, images and fonts keep their own licenses, listed above.

About

Showcase for books made with Paged.js

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages