From 5ddbc3e61f2004821295a5db33efe37c1cd275b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Mon, 16 Jun 2025 18:27:52 +0200 Subject: [PATCH 01/11] Add script to automatically update Readium CSS --- Makefile | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Makefile b/Makefile index 3f66b6af4..34713617e 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ SCRIPTS_PATH := Sources/Navigator/EPUB/Scripts +CSS_PATH := Sources/Navigator/EPUB/Assets/Static/readium-css help: @echo "Usage: make \n\n\ @@ -32,6 +33,14 @@ update-scripts: @which corepack >/dev/null 2>&1 || (echo "ERROR: corepack is required, please install it first\nhttps://pnpm.io/installation#using-corepack"; exit 1) pnpm install --dir "$(SCRIPTS_PATH)" +.PHONY: update-css +update-css: + git clone https://github.com/readium/css.git readium-css + rm -rf "$(CSS_PATH)" + cp -r readium-css/css/dist "$(CSS_PATH)" + git -C readium-css rev-parse HEAD > "$(CSS_PATH)/HEAD" + rm -rf readium-css + .PHONY: test test: # To limit to a particular test suite: -only-testing:ReadiumSharedTests From 2a1e6e50d35c60939a413b9540ed6f21f0014df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Tue, 17 Jun 2025 17:37:07 +0200 Subject: [PATCH 02/11] Update Readium CSS --- Makefile | 1 + .../EPUB/Assets/Static/readium-css/HEAD | 1 + .../EPUB/Assets/Static/readium-css/ReadMe.md | 18 +- .../Static/readium-css/ReadiumCSS-after.css | 1138 +++++++---------- .../Static/readium-css/ReadiumCSS-before.css | 752 ++++------- .../Static/readium-css/ReadiumCSS-default.css | 225 ++-- .../ReadiumCSS-ebpaj_fonts_patch.css | 95 +- .../cjk-horizontal/ReadiumCSS-after.css | 896 ++++++------- .../cjk-horizontal/ReadiumCSS-before.css | 708 ++++------ .../cjk-horizontal/ReadiumCSS-default.css | 251 ++-- .../cjk-vertical/ReadiumCSS-after.css | 861 ++++++------- .../cjk-vertical/ReadiumCSS-before.css | 705 ++++------ .../cjk-vertical/ReadiumCSS-default.css | 257 ++-- .../fonts/AccessibleDfA-Bold.woff2 | Bin 0 -> 66864 bytes .../fonts/AccessibleDfA-Italic.woff2 | Bin 0 -> 73504 bytes .../fonts/AccessibleDfA-Regular.woff | Bin 0 -> 89336 bytes .../fonts/AccessibleDfA-Regular.woff2 | Bin 0 -> 65592 bytes .../readium-css/fonts/AccessibleDfA.otf | Bin 145384 -> 0 bytes .../readium-css/rtl/ReadiumCSS-after.css | 967 ++++++-------- .../readium-css/rtl/ReadiumCSS-before.css | 708 ++++------ .../readium-css/rtl/ReadiumCSS-default.css | 225 ++-- 21 files changed, 3062 insertions(+), 4746 deletions(-) create mode 100644 Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD create mode 100644 Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA-Bold.woff2 create mode 100644 Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA-Italic.woff2 create mode 100644 Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA-Regular.woff create mode 100644 Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA-Regular.woff2 delete mode 100755 Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA.otf diff --git a/Makefile b/Makefile index 34713617e..c068e75bc 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,7 @@ update-css: cp -r readium-css/css/dist "$(CSS_PATH)" git -C readium-css rev-parse HEAD > "$(CSS_PATH)/HEAD" rm -rf readium-css + rm -rf "$(CSS_PATH)/android-fonts-patch" .PHONY: test test: diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD b/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD new file mode 100644 index 000000000..715487afe --- /dev/null +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD @@ -0,0 +1 @@ +74c2ad1e1b98279549f32bea1001bdf88f5be907 diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadMe.md b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadMe.md index b9d6ef6ee..518fe6289 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadMe.md +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadMe.md @@ -25,7 +25,6 @@ Finally, page progression is impacted: Disabled user settings: - `hyphens`; -- `word-spacing`; - `letter-spacing`. Added user settings: @@ -54,8 +53,11 @@ Disabled user settings: - `text-align`; - `hyphens`; - paragraphs’ indent; -- `word-spacing`; -- `letter-spacing`. +- `word-spacing`. + +Added user settings: + +- hiding/disabling ruby (mapped to `--USER__noRuby: readium-noRuby-on` flag). ### Vertical @@ -87,8 +89,11 @@ Disabled user settings: - `text-align`; - `hyphens`; - paragraphs’ indent; -- `word-spacing`; -- `letter-spacing`. +- `word-spacing`. + +Added user settings: + +- hiding/disabling ruby (mapped to `--USER__noRuby: readium-noRuby-on` flag). ### EBPAJ Polyfill @@ -110,3 +115,6 @@ This is currently an edge case as we still have to see whether we want to suppor - if `mn-Cyrl` is set, then the publication is in cyrillic and it is `horizontal-tb`. - We don’t currently support the `mn` language, and we can’t rely on system fonts to do so, we’ll have to embed one. +## Android Fonts Patch + +See [the specific ReadMe](android-fonts-patch/ReadMe.md) for further information. \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css index 7950ef544..9feb56ece 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css @@ -1,923 +1,653 @@ -/* Readium CSS - Config module - - A file allowing implementers to customize flags for reading modes, - user settings, etc. - - Repo: https://github.com/readium/readium-css */ - -/* Custom medias - Syntax: @custom-media --variable (prop: value) */ - -/* Responsive columns - The minimum width for which responsive columns (2 -> 1 and vice versa, - depending on the current font-size) must be enabled */ - -/* Mobile columns - The minimum and maximum width for mobile devices. - We’re forcing the landscape orientation by default, - and must still investigate large tablets (iPad Pro, Surface Pro 3, etc.). */ - -/* Custom selectors - Syntax: @custom-selector :--variable selector - The selectors you will use for flags/switches - You can alternatively use classes or custom data-* attributes */ - -/* User view = paged | scrolled */ - -/* Font-family override */ - -/* Advanced settings */ - -/* Reading Modes */ - -/* Filters (images) */ - -/* Accessibility normalization */ - -/* Accessibility font. You can add selectors, using “, ” as a separator, if you have multiple fonts */ - -/* Direction i.e. ltr and rtl */ - -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Pagination module - - A set of styles to paginate ePublications +:root{ - Repo: https://github.com/readium/readium-css */ + --RS__viewportWidth:100%; -/* Config */ + --RS__pageGutter:0; -/* Columns are responsive by default, even if column-width is set in pixels, - which means two-page spread will switch to single page depending on current font-size. - If you want more control, I’m afraid you’ll have to update colWidth/colGap dynamically, - which is how a significant amount of RS do at the moment. */ + --RS__defaultLineLength:40rem; -/* Default for smartphone portrait (small screens) */ + --RS__colGap:0; -:root { - /* Your columns’ width floor */ - --RS__colWidth: 45em; /* The width at which we’ll switch to 2 columns by default. PS: you can’t set it in rem */ + --RS__colCount:1; - /* Ideal number of columns (depending on columns’ width floor) */ - --RS__colCount: 1; - - /* Gap between columns (in pixels so that it won’t resize with font-size) */ - --RS__colGap: 0; - - /* Optimal line-length (rem will take :root font-size into account, whatever the body’s font-size) */ - --RS__maxLineLength: 40rem; - - /* Default page horizontal margins (in pixels so that it won’t resize with font-size) */ - --RS__pageGutter: 20px; /* See if colGap and pageGutter can be the same var */ + --RS__colWidth:100vw; } -/* Reset page margins for Forward compatibility */ - -@page { - margin: 0 !important; +@page{ + margin:0 !important; } -/* :root selector has same specificity as a class i.e. 0010 - We might have to change that to html / context - -> https://css-tricks.com/almanac/selectors/r/root/ */ - -:root { - - /* In case you use left position to scroll, can be removed if using transform: translateX() */ - position: relative; - - -webkit-column-width: var(--RS__colWidth); - -moz-column-width: var(--RS__colWidth); - column-width: var(--RS__colWidth); - - /* Init pagination */ - /* TODO: document columns’ logic cos it might feel weird at first */ - -webkit-column-count: var(--RS__colCount); - -moz-column-count: var(--RS__colCount); - column-count: var(--RS__colCount); - - -webkit-column-gap: var(--RS__colGap); - -moz-column-gap: var(--RS__colGap); - column-gap: var(--RS__colGap); +:root{ + position:relative; - /* Default is balance and we want columns to be filled entirely (100vh) */ - -moz-column-fill: auto; - column-fill: auto; - width: 100%; - height: 100vh; - max-width: 100%; - max-height: 100vh; - min-width: 100%; - min-height: 100vh; - padding: 0 !important; - margin: 0 !important; + -webkit-column-width:var(--RS__colWidth); + -moz-column-width:var(--RS__colWidth); + column-width:var(--RS__colWidth); + -webkit-column-count:var(--RS__colCount); + -moz-column-count:var(--RS__colCount); + column-count:var(--RS__colCount); - /* Column size will depend on this if we want to make it responsive */ - font-size: 100% !important; - - -webkit-text-size-adjust: 100%; - - /* Switch to newer box model (not inherited by authors’ styles) */ - box-sizing: border-box; - - /* Fix bug for older Chrome */ - -webkit-perspective: 1; - /* Prevents options pop-up when long tap in webkit */ - -webkit-touch-callout: none; + -webkit-column-gap:var(--RS__colGap); + -moz-column-gap:var(--RS__colGap); + column-gap:var(--RS__colGap); + -moz-column-fill:auto; + column-fill:auto; + width:var(--RS__viewportWidth); + height:100vh; + max-width:var(--RS__viewportWidth); + max-height:100vh; + min-width:var(--RS__viewportWidth); + min-height:100vh; + padding:0 !important; + margin:0 !important; + font-size:1rem !important; + box-sizing:border-box; + -webkit-touch-callout:none; } -body { - /* overflow: hidden; bugfix: contents won’t paginate in Firefox and one sample in Safari */ - width: 100%; - - /* Limit line-length but we have to reset when 2 columns and control the viewport. - By using max-width + margin auto, margins will shrink when font-size increases, - which is what would be expected in terms of typography. */ - max-width: var(--RS__maxLineLength) !important; - padding: 0 var(--RS__pageGutter) !important; - margin: 0 auto !important; - - /* We need a minimum padding on body so that descandants/ascendants in italic/script are not cut-off. - Drawback: we have to use border-box so that it doesn’t screw the box model, - which means it impacts colWidth and max-width */ - box-sizing: border-box; +body{ + width:100%; + max-width:var(--RS__defaultLineLength) !important; + padding:0 var(--RS__pageGutter) !important; + margin:0 auto !important; + overflow:hidden; + box-sizing:border-box; } -/* We’ll now redefine margins and columns depending on the minimum width available - The goal is having the simplest model possible and avoid targeting devices */ +@supports (overflow: clip){ -/* Smartphone landscape */ + :root{ + overflow:clip; + } -@media screen and (min-width: 35em) { - :root { - --RS__pageGutter: 30px; - } + body{ + overflow:clip; + overflow-clip-margin:content-box; + } } -/* Tablet portrait */ - -@media screen and (min-width: 45em) { - :root { - --RS__pageGutter: 40px; - } +:root[style*="readium-scroll-on"]{ + -webkit-columns:auto auto !important; + -moz-columns:auto auto !important; + columns:auto auto !important; + width:auto !important; + height:auto !important; + max-width:none !important; + max-height:none !important; + min-width:0 !important; + min-height:0 !important; } -/* Desktop + tablet large */ - -/* We get the previous settings, we just change the margins */ - -@media screen and (min-width: 75em) { - :root { - --RS__pageGutter: 50px; - } +:root[style*="readium-scroll-on"] body{ + max-width:var(--RS__defaultLineLength) !important; + overflow:auto; } -/* At this point (80em or so), constraining line length must be done at the web view/iframe level, or by limiting the size of :root itself */ - -/* Responsive columns */ +@supports (overflow: clip){ -@media screen and (min-width: 60em), screen and (min-device-width: 36em) and (max-device-width: 47em) and (orientation: landscape) { - :root { - /* The size at which we want 2 columns to switch to 1 (depending on font-size) */ - --RS__colWidth: 20em; /* 20 * 16 = 320px but 20 * 28 = 560px so it will switch to 1 col @ 175% font-size (user-setting) on an iPad */ - /* We constrain to 2 columns so that we can never get 3 or 4, etc. */ - --RS__colCount: 2; - --RS__maxLineLength: 39.99rem; /* If we don’t use this, colNumber user setting won’t work in Safari… */ + :root[style*="readium-scroll-on"]{ + overflow:auto; } -} - -/* Readium CSS - Scroll module - - A set of styles to scroll ePublications - This module overrides pagination - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-scroll-on"] { - - /* Reset columns, auto + auto = columns can’t be created */ - -webkit-columns: auto auto !important; - -moz-columns: auto auto !important; - columns: auto auto !important; - width: auto !important; - height: auto !important; - max-width: none !important; - max-height: none !important; - /* Reset html size so that the user can scroll */ - min-width: 0 !important; - min-height: 0 !important; -} - -/* Make sure line-length is limited in all configs */ -:root[style*="readium-scroll-on"] body { - --RS__maxLineLength: 40rem !important; + :root[style*="readium-scroll-on"] body{ + overflow:clip; + } } -/* Readium CSS - Night mode +:root[style*="readium-night-on"]{ - A preset theme for night mode + --RS__selectionTextColor:inherit; - Repo: https://github.com/readium/readium-css */ + --RS__selectionBackgroundColor:#b4d8fe; -/* CONFIG */ + --RS__visitedColor:#0099E5; -/* [style*="--USER__appearance"] can be used to increase specificity but performance hit */ + --RS__linkColor:#63caff; -:root[style*="readium-night-on"] { - --RS__backgroundColor: #000000; - --RS__textColor: #FEFEFE; + --RS__textColor:#FEFEFE; - --RS__linkColor: #63caff; - --RS__visitedColor: #0099E5; - - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; + --RS__backgroundColor:#000000; } -/* we don’t need to redeclare bg-color and color for :root since we will inherit and update from day/default mode */ - -:root[style*="readium-night-on"] *:not(a) { - color: inherit !important; - background-color: transparent !important; - border-color: currentColor !important; +:root[style*="readium-night-on"] *:not(a){ + color:inherit !important; + background-color:transparent !important; + border-color:currentcolor !important; } -:root[style*="readium-night-on"] svg text { - fill: currentColor !important; - stroke: none !important; +:root[style*="readium-night-on"] svg text{ + fill:currentcolor !important; + stroke:none !important; } :root[style*="readium-night-on"] a:link, -:root[style*="readium-night-on"] a:link * { - color: var(--RS__linkColor) !important; +:root[style*="readium-night-on"] a:link *{ + color:var(--RS__linkColor) !important; } :root[style*="readium-night-on"] a:visited, -:root[style*="readium-night-on"] a:visited * { - color: var(--RS__visitedColor) !important; +:root[style*="readium-night-on"] a:visited *{ + color:var(--RS__visitedColor) !important; } -/* For epub:type, in case the contents are served as text/html, namespaces won’t work hence why we’re using both syntax */ - :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, -:root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: invert(100%); - filter: invert(100%); -} - -/* Darken all images on user’s demand */ - -:root[style*="readium-night-on"][style*="readium-darken-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); +:root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:invert(100%); + filter:invert(100%); } -/* Invert all images on user’s demand */ +:root[style*="readium-sepia-on"]{ -:root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: invert(100%); - filter: invert(100%); -} - -/* Darken and invert on user’s demand */ - -:root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%) invert(100%); - filter: brightness(80%) invert(100%); -} - -/* Readium CSS - Sepia mode + --RS__selectionTextColor:inherit; - A preset theme for sepia mode + --RS__selectionBackgroundColor:#b4d8fe; - Repo: https://github.com/readium/readium-css */ + --RS__visitedColor:#551A8B; -/* CONFIG */ + --RS__linkColor:#0000EE; -:root[style*="readium-sepia-on"] { - --RS__backgroundColor: #faf4e8; - --RS__textColor: #121212; + --RS__textColor:#121212; - --RS__linkColor: #0000EE; - --RS__visitedColor: #551A8B; - - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; - - --RS__maxLineLength: 40.01rem; /* Forcing a reflow in Blink/Webkit so that blend mode can work */ + --RS__backgroundColor:#faf4e8; } -/* we don’t need to redeclare bg-color and color for :root since we will inherit and update from day/default mode */ - -:root[style*="readium-sepia-on"] *:not(a) { - color: inherit !important; - background-color: transparent !important; +:root[style*="readium-sepia-on"] *:not(a){ + color:inherit !important; + background-color:transparent !important; } :root[style*="readium-sepia-on"] a:link, -:root[style*="readium-sepia-on"] a:link * { - color: var(--RS__linkColor); +:root[style*="readium-sepia-on"] a:link *{ + color:var(--RS__linkColor); } :root[style*="readium-sepia-on"] a:visited, -:root[style*="readium-sepia-on"] a:visited * { - color: var(--RS__visitedColor); -} - -:root[style*="readium-sepia-on"] svg, -:root[style*="readium-sepia-on"] img { - /* Make sure the proper bg-color is used for the blend mode */ - background-color: transparent !important; - mix-blend-mode: multiply; +:root[style*="readium-sepia-on"] a:visited *{ + color:var(--RS__visitedColor); } -/* Readium CSS - OS Accessibility Modes - - A stylesheet to deal with OS accessibility settings - - Repo: https://github.com/readium/readium-css */ +@media screen and (-ms-high-contrast: active){ -/* Windows high contrast colors are mapped to CSS system color keywords - See http://www.gwhitworth.com/blog/2017/04/how-to-use-ms-high-contrast */ - -@media screen and (-ms-high-contrast: active) { - :root { - color: windowText !important; - background-color: window !important; + :root{ + color:windowText !important; + background-color:window !important; } - /* The following selectors are super funky but it makes sure everything is inherited, this is indeed critical for this mode */ :root :not(#\#):not(#\#):not(#\#), :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) - :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) { - color: inherit !important; - background-color: inherit !important; + :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#){ + color:inherit !important; + background-color:inherit !important; } - .readiumCSS-mo-active-default { - color: highlightText !important; - background-color: highlight !important; + .readiumCSS-mo-active-default{ + color:highlightText !important; + background-color:highlight !important; } - - /* For links, hyperlink keyword is automatically set */ - - /* Should we also set user highlights? */ } -@media screen and (-ms-high-contrast: white-on-black) { +@media screen and (-ms-high-contrast: white-on-black){ + :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, - :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: none !important; - filter: none !important; + :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: none !important; - filter: none !important; + + :root[style*="readium-night-on"][style*="readium-invert-on"] img{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); + + :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%); + filter:brightness(80%); } } -/* Will be true on recent versions of iOS and MacOS if inverted setting enabled by the user */ +@media screen and (inverted-colors){ -@media screen and (inverted-colors) { :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, - :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: none !important; - filter: none !important; + :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: none !important; - filter: none !important; + + :root[style*="readium-night-on"][style*="readium-invert-on"] img{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); + + :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%); + filter:brightness(80%); } } -@media screen and (monochrome) { - /* Grayscale (Implemented in Safari, what about eInk?) */ - /* Must deal with anything color (contrast) so must be managed at the night/sepia/theme level :( */ +@media screen and (monochrome){ } -@media screen and (prefers-reduced-motion) { - /* If reduced motion is set on MacOS, in case we have animation/transition */ +@media screen and (prefers-reduced-motion){ } -/* Readium CSS - Columns number pref - - A submodule managing columns number for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -/* Number of columns = 1 | 2 */ - -/* We still need to see if we allow users to force number of columns for all configs, currently it behaves as an "auto" setting */ - -/* apply col setting except for mobile portrait */ - -@media screen and (min-width: 60em), screen and (min-device-width: 36em) and (max-device-width: 47em) and (orientation: landscape) { - :root[style*="--USER__colCount: 1"], - :root[style*="--USER__colCount:1"], - :root[style*="--USER__colCount: 2"], - :root[style*="--USER__colCount:2"] { - -webkit-column-count: var(--USER__colCount); - -moz-column-count: var(--USER__colCount); - column-count: var(--USER__colCount); - } - - /* If one column, make sure we limit line-length */ - :root[style*="--USER__colCount: 1"], - :root[style*="--USER__colCount:1"] { - --RS__maxLineLength: 40rem !important; /* This is the only way for the user setting to work in webkit… */ - --RS__colWidth: 100vw; - } - - /* If smartphone landscape, and 2 columns, col width the same as iPad landscape + desktop */ - :root[style*="--USER__colCount: 2"], - :root[style*="--USER__colCount:2"] { - --RS__colWidth: auto; /* User explicitely tells he/she wants 2 columns, we reset floor value */ - } +:root[style*="--USER__backgroundColor"]{ + background-color:var(--USER__backgroundColor) !important; } -/* Readium CSS - Page margins pref - - A submodule managing page margins for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -/* Page Margins: the user margin is a factor of the page gutter e.g. 0.5, 0.75, 1, 1.25, 1.5, etc. */ - -:root[style*="--USER__pageMargins"] body { - padding: 0 calc(var(--RS__pageGutter) * var(--USER__pageMargins)) !important; +:root[style*="--USER__backgroundColor"] *{ + background-color:transparent !important; } -/* Readium CSS - Custom colors pref - - A submodule managing custom colors for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="--USER__backgroundColor"] { - background-color: var(--USER__backgroundColor) !important; +:root[style*="--USER__textColor"]{ + color:var(--USER__textColor) !important; } -:root[style*="--USER__backgroundColor"] * { - background-color: transparent !important; +:root[style*="--USER__textColor"] *:not(a){ + color:inherit !important; + background-color:transparent !important; + border-color:currentcolor !important; } -:root[style*="--USER__textColor"] { - color: var(--USER__textColor) !important; +:root[style*="--USER__textColor"] svg text{ + fill:currentcolor !important; + stroke:none !important; } -:root[style*="--USER__textColor"] *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(pre) { - color: inherit !important; +:root[style*="--USER__linkColor"] a:link, +:root[style*="--USER__linkColor"] a:link *{ + color:var(--USER__linkColor) !important; } -/* Readium CSS - Text align pref - - A submodule managing text-align for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-advanced-on"][style*="--USER__textAlign"] { - text-align: var(--USER__textAlign); +:root[style*="--USER__visitedColor"] a:visited, +:root[style*="--USER__visitedColor"] a:visited *{ + color:var(--USER__visitedColor) !important; } -:root[style*="readium-advanced-on"][style*="--USER__textAlign"] body, -:root[style*="readium-advanced-on"][style*="--USER__textAlign"] *:not(blockquote):not(figcaption) p, -:root[style*="readium-advanced-on"][style*="--USER__textAlign"] li { - text-align: inherit !important; - -moz-text-align-last: auto !important; - -epub-text-align-last: auto !important; - text-align-last: auto !important; +:root[style*="--USER__selectionBackgroundColor"][style*="--USER__selectionTextColor"] ::-moz-selection{ + color:var(--USER__selectionTextColor) !important; + background-color:var(--USER__selectionBackgroundColor) !important; } -/* In case something goes wrong at the programmatic level + rtl for body + rtl in ltr */ - -:root[style*="readium-advanced-on"][dir="rtl"][style*="--USER__textAlign: left"], -:root[style*="readium-advanced-on"][dir="rtl"][style*="--USER__textAlign:left"], -:root[style*="readium-advanced-on"][style*="--USER__textAlign: left"] *[dir="rtl"], -:root[style*="readium-advanced-on"][style*="--USER__textAlign:left"] *[dir="rtl"] { - text-align: right; +:root[style*="--USER__selectionBackgroundColor"][style*="--USER__selectionTextColor"] ::selection{ + color:var(--USER__selectionTextColor) !important; + background-color:var(--USER__selectionBackgroundColor) !important; } -/* Edge, if logical value is used, think of it as a polyfill. For LTR, it will fall back to the default, which is left */ +:root[style*="--USER__colCount"]{ + -webkit-column-count:var(--USER__colCount); + -moz-column-count:var(--USER__colCount); + column-count:var(--USER__colCount); -:root[style*="readium-advanced-on"][dir="rtl"][style*="--USER__textAlign: start"], -:root[style*="readium-advanced-on"][dir="rtl"][style*="--USER__textAlign:start"] { - text-align: right; + --RS__colWidth:auto; } -/* Readium CSS - Hyphenation pref - - A submodule managing hyphens for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. - - Repo: https://github.com/readium/readium-css */ - -/* Managing hyphenation automatically for text-align values */ - -:root[style*="readium-advanced-on"][style*="--USER__textAlign: justify"] body, -:root[style*="readium-advanced-on"][style*="--USER__textAlign:justify"] body { - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - -epub-hyphens: auto; - hyphens: auto; +:root[style*="--USER__colCount: 0"], +:root[style*="--USER__colCount:0"]{ + -webkit-column-count:1; + -moz-column-count:1; + column-count:1; } -:root[style*="readium-advanced-on"][style*="--USER__textAlign: left"] body, -:root[style*="readium-advanced-on"][style*="--USER__textAlign:left"] body, -:root[style*="readium-advanced-on"][style*="--USER__textAlign: right"] body, -:root[style*="readium-advanced-on"][style*="--USER__textAlign:right"] body { - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - -epub-hyphens: none; - hyphens: none; +:root[style*="--USER__colCount: 0"], +:root[style*="--USER__colCount:0"], +:root[style*="--USER__colCount: 1"], +:root[style*="--USER__colCount:1"]{ + --RS__colWidth:100vw; } -/* Managing the user override */ +:root[style*="--USER__lineLength"] body{ + max-width:var(--USER__lineLength) !important; + } -:root[style*="readium-advanced-on"][style*="--USER__bodyHyphens"] { - -webkit-hyphens: var(--USER__bodyHyphens) !important; - -moz-hyphens: var(--USER__bodyHyphens) !important; - -ms-hyphens: var(--USER__bodyHyphens) !important; - -epub-hyphens: var(--USER__bodyHyphens) !important; - hyphens: var(--USER__bodyHyphens) !important; +:root[style*="--USER__textAlign"]{ + text-align:var(--USER__textAlign); } -/* Sorry, we can’t use `:matches`, `:-moz-any` or `:-webkit-any` because MS doesn’t support it yet */ - -:root[style*="readium-advanced-on"][style*="--USER__bodyHyphens"] body, -:root[style*="readium-advanced-on"][style*="--USER__bodyHyphens"] p, -:root[style*="readium-advanced-on"][style*="--USER__bodyHyphens"] li, -:root[style*="readium-advanced-on"][style*="--USER__bodyHyphens"] div, -:root[style*="readium-advanced-on"][style*="--USER__bodyHyphens"] dd { - -webkit-hyphens: inherit; - -moz-hyphens: inherit; - -ms-hyphens: inherit; - -epub-hyphens: inherit; - hyphens: inherit; +:root[style*="--USER__textAlign"] body, +:root[style*="--USER__textAlign"] p:not(blockquote p):not(figcaption p):not(hgroup p), +:root[style*="--USER__textAlign"] li, +:root[style*="--USER__textAlign"] dd{ + text-align:var(--USER__textAlign) !important; + -moz-text-align-last:auto !important; + -epub-text-align-last:auto !important; + text-align-last:auto !important; } -/* Readium CSS - Font Family pref - - A submodule managing font-family for user settings - Part of “User Overrides” class – “font override” flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-font-on"][style*="--USER__fontFamily"] { - font-family: var(--USER__fontFamily) !important; +:root[style*="--USER__bodyHyphens"]{ + -webkit-hyphens:var(--USER__bodyHyphens) !important; + -moz-hyphens:var(--USER__bodyHyphens) !important; + -ms-hyphens:var(--USER__bodyHyphens) !important; + -epub-hyphens:var(--USER__bodyHyphens) !important; + hyphens:var(--USER__bodyHyphens) !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] body, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] p, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] li, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] div, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] dt, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] dd { - font-family: inherit !important; +:root[style*="--USER__bodyHyphens"] body, +:root[style*="--USER__bodyHyphens"] p, +:root[style*="--USER__bodyHyphens"] li, +:root[style*="--USER__bodyHyphens"] div, +:root[style*="--USER__bodyHyphens"] dd{ + -webkit-hyphens:inherit; + -moz-hyphens:inherit; + -ms-hyphens:inherit; + -epub-hyphens:inherit; + hyphens:inherit; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] i:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] i:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] em:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] em:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] cite:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] cite:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] b:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] b:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] strong:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] strong:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] span:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] span:not([xml\:lang]) { - font-family: inherit !important; +:root[style*="readium-font-on"][style*="--USER__fontFamily"]{ + font-family:var(--USER__fontFamily) !important; } -/* Readium CSS - A11y font pref - - A submodule managing a11y text normalization for user settings - Part of “User Overrides” class – “font override” flag required. - - Repo: https://github.com/readium/readium-css */ - -/* For AccessibleDfA, we need to normalize font-weight and font-style since only the normal style is available */ - -:root[style*="readium-font-on"][style*="AccessibleDfA"] { - /* We won’t use the variable there since we need fallbacks for missing characters */ - font-family: AccessibleDfA, Verdana, Tahoma, "Trebuchet MS", sans-serif !important; - --RS__lineHeightCompensation: 1.167; +:root[style*="readium-font-on"][style*="--USER__fontFamily"] *{ + font-family:revert !important; } -:root[style*="readium-font-on"][style*="IA Writer Duospace"] { - /* We won’t use the variable there since we need fallbacks for missing characters */ - font-family: "IA Writer Duospace", Menlo, "DejaVu Sans Mono", "Bitstream Vera Sans Mono", Courier, monospace !important; - --RS__lineHeightCompensation: 1.167; +:root[style*="readium-font-on"][style*="AccessibleDfA"]{ + font-family:AccessibleDfA, Verdana, Tahoma, "Trebuchet MS", sans-serif !important; } -:root[style*="readium-font-on"][style*="readium-a11y-on"] { - font-family: var(--USER__fontFamily) !important; - --RS__lineHeightCompensation: 1.167; +:root[style*="readium-font-on"][style*="IA Writer Duospace"]{ + font-family:"IA Writer Duospace", Menlo, "DejaVu Sans Mono", "Bitstream Vera Sans Mono", Courier, monospace !important; } -/* Maybe users want a setting to normalize any font offered so there is a “a11y Normalize” flag for it */ - -:root[style*="readium-font-on"][style*="AccessibleDfA"], -:root[style*="readium-font-on"][style*="IA Writer Duospace"], -:root[style*="readium-font-on"][style*="readium-a11y-on"] { - font-style: normal !important; - font-weight: normal !important; +:root[style*="readium-font-on"][style*="AccessibleDfA"],:root[style*="readium-font-on"][style*="IA Writer Duospace"], +:root[style*="readium-a11y-on"]{ + font-style:normal !important; + font-weight:normal !important; } -/* Targeting everything except code. Note that Open Dyslexic has a monospaced font for code */ - -:root[style*="readium-font-on"][style*="AccessibleDfA"] *:not(code):not(var):not(kbd):not(samp), -:root[style*="readium-font-on"][style*="IA Writer Duospace"] *:not(code):not(var):not(kbd):not(samp), -:root[style*="readium-font-on"][style*="readium-a11y-on"] *:not(code):not(var):not(kbd):not(samp) { - font-family: inherit !important; - font-style: inherit !important; - font-weight: inherit !important; +:root[style*="readium-font-on"][style*="AccessibleDfA"] *:not(code):not(var):not(kbd):not(samp),:root[style*="readium-font-on"][style*="IA Writer Duospace"] *:not(code):not(var):not(kbd):not(samp), +:root[style*="readium-a11y-on"] *:not(code):not(var):not(kbd):not(samp){ + font-family:inherit !important; + font-style:inherit !important; + font-weight:inherit !important; } -/* Normalizing text-decoration, subs and sups */ - -:root[style*="readium-font-on"][style*="AccessibleDfA"] *, -:root[style*="readium-font-on"][style*="IA Writer Duospace"] *, -:root[style*="readium-font-on"][style*="readium-a11y-on"] * { - text-decoration: none !important; - font-variant-caps: normal !important; - font-variant-numeric: normal !important; - font-variant-position: normal !important; +:root[style*="readium-font-on"][style*="AccessibleDfA"] *,:root[style*="readium-font-on"][style*="IA Writer Duospace"] *, +:root[style*="readium-a11y-on"] *{ + text-decoration:none !important; + font-variant-caps:normal !important; + font-variant-numeric:normal !important; + font-variant-position:normal !important; } -:root[style*="readium-font-on"][style*="AccessibleDfA"] sup, -:root[style*="readium-font-on"][style*="IA Writer Duospace"] sup, -:root[style*="readium-font-on"][style*="readium-a11y-on"] sup, +:root[style*="readium-font-on"][style*="AccessibleDfA"] sup,:root[style*="readium-font-on"][style*="IA Writer Duospace"] sup, +:root[style*="readium-a11y-on"] sup, :root[style*="readium-font-on"][style*="AccessibleDfA"] sub, :root[style*="readium-font-on"][style*="IA Writer Duospace"] sub, -:root[style*="readium-font-on"][style*="readium-a11y-on"] sub { - font-size: 1rem !important; - vertical-align: baseline !important; +:root[style*="readium-a11y-on"] sub{ + font-size:1rem !important; + vertical-align:baseline !important; } -/* Readium CSS - Font size pref - - A submodule managing font-size for user settings - Part of “User Overrides” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="--USER__fontSize"] { - font-size: var(--USER__fontSize) !important; +:root:not([style*="readium-deprecatedFontSize-on"])[style*="--USER__fontSize"] body{ + zoom:var(--USER__fontSize) !important; } -/* Readium CSS - Line height pref - - A submodule managing line-height for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. - - Repo: https://github.com/readium/readium-css */ +@supports not (zoom: 1){ -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] { - line-height: var(--USER__lineHeight) !important; + :root[style*="--USER__fontSize"]{ + font-size:var(--USER__fontSize) !important; + } } -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] body, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] p, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] li, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] div { - line-height: inherit; +:root[style*="readium-deprecatedFontSize-on"][style*="--USER__fontSize"]{ + font-size:var(--USER__fontSize) !important; } -/* Readium CSS - Para spacing pref - - A submodule managing paragraphs’ top and bottom margins for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-advanced-on"][style*="--USER__paraSpacing"] p { - margin-top: var(--USER__paraSpacing) !important; - margin-bottom: var(--USER__paraSpacing) !important; +:root[style*="--USER__lineHeight"]{ + line-height:var(--USER__lineHeight) !important; } -/* Readium CSS - Para indent pref - - A submodule managing paragraphs’ text-indent for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-advanced-on"][style*="--USER__paraIndent"] p { - text-indent: var(--USER__paraIndent) !important; +:root[style*="--USER__lineHeight"] body, +:root[style*="--USER__lineHeight"] p, +:root[style*="--USER__lineHeight"] li, +:root[style*="--USER__lineHeight"] div{ + line-height:inherit; } -/* If there are inline-block elements in paragraphs, text-indent will inherit so we must reset it */ - -:root[style*="readium-advanced-on"][style*="--USER__paraIndent"] p *, -:root[style*="readium-advanced-on"][style*="--USER__paraIndent"] p:first-letter { - text-indent: 0 !important; +:root[style*="--USER__paraSpacing"] p{ + margin-top:var(--USER__paraSpacing) !important; + margin-bottom:var(--USER__paraSpacing) !important; } -/* Readium CSS - Word spacing pref - - A submodule managing word-spacing for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-advanced-on"][style*="--USER__wordSpacing"] h1, -:root[style*="readium-advanced-on"][style*="--USER__wordSpacing"] h2, -:root[style*="readium-advanced-on"][style*="--USER__wordSpacing"] h3, -:root[style*="readium-advanced-on"][style*="--USER__wordSpacing"] h4, -:root[style*="readium-advanced-on"][style*="--USER__wordSpacing"] h5, -:root[style*="readium-advanced-on"][style*="--USER__wordSpacing"] h6, -:root[style*="readium-advanced-on"][style*="--USER__wordSpacing"] p, -:root[style*="readium-advanced-on"][style*="--USER__wordSpacing"] li, -:root[style*="readium-advanced-on"][style*="--USER__wordSpacing"] div { - word-spacing: var(--USER__wordSpacing); +:root[style*="--USER__paraIndent"] p{ + text-indent:var(--USER__paraIndent) !important; } -/* Readium CSS - Letter spacing pref +:root[style*="--USER__paraIndent"] p *, +:root[style*="--USER__paraIndent"] p:first-letter{ + text-indent:0 !important; +} - A submodule managing letter-spacing for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. +:root[style*="--USER__wordSpacing"] h1, +:root[style*="--USER__wordSpacing"] h2, +:root[style*="--USER__wordSpacing"] h3, +:root[style*="--USER__wordSpacing"] h4, +:root[style*="--USER__wordSpacing"] h5, +:root[style*="--USER__wordSpacing"] h6, +:root[style*="--USER__wordSpacing"] p, +:root[style*="--USER__wordSpacing"] li, +:root[style*="--USER__wordSpacing"] div, +:root[style*="--USER__wordSpacing"] dt, +:root[style*="--USER__wordSpacing"] dd{ + word-spacing:var(--USER__wordSpacing); +} - Repo: https://github.com/readium/readium-css */ +:root[style*="--USER__letterSpacing"] h1, +:root[style*="--USER__letterSpacing"] h2, +:root[style*="--USER__letterSpacing"] h3, +:root[style*="--USER__letterSpacing"] h4, +:root[style*="--USER__letterSpacing"] h5, +:root[style*="--USER__letterSpacing"] h6, +:root[style*="--USER__letterSpacing"] p, +:root[style*="--USER__letterSpacing"] li, +:root[style*="--USER__letterSpacing"] div, +:root[style*="--USER__letterSpacing"] dt, +:root[style*="--USER__letterSpacing"] dd{ + letter-spacing:var(--USER__letterSpacing); + font-variant:none; +} -:root[style*="readium-advanced-on"][style*="--USER__letterSpacing"] h1, -:root[style*="readium-advanced-on"][style*="--USER__letterSpacing"] h2, -:root[style*="readium-advanced-on"][style*="--USER__letterSpacing"] h3, -:root[style*="readium-advanced-on"][style*="--USER__letterSpacing"] h4, -:root[style*="readium-advanced-on"][style*="--USER__letterSpacing"] h5, -:root[style*="readium-advanced-on"][style*="--USER__letterSpacing"] h6, -:root[style*="readium-advanced-on"][style*="--USER__letterSpacing"] p, -:root[style*="readium-advanced-on"][style*="--USER__letterSpacing"] li, -:root[style*="readium-advanced-on"][style*="--USER__letterSpacing"] div { - letter-spacing: var(--USER__letterSpacing); - font-variant: none; +:root[style*="readium-font-on"][style*="--USER__fontWeight"] body{ + font-weight:var(--USER__fontWeight) !important; } -/* Readium CSS - Font size normalize +:root[style*="readium-font-on"][style*="--USER__fontWeight"] b, +:root[style*="readium-font-on"][style*="--USER__fontWeight"] strong{ + font-weight:bolder; +} - A stylesheet to normalize font-size +:root[style*="readium-font-on"][style*="--USER__fontWidth"] body{ + font-stretch:var(--USER__fontWidth) !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-font-on"][style*="--USER__fontOpticalSizing"] body{ + font-optical-sizing:var(--USER__fontOpticalSizing) !important; +} -/* STYLES */ +:root[style*="readium-blend-on"] svg, +:root[style*="readium-blend-on"] img{ + background-color:transparent !important; + mix-blend-mode:multiply !important; +} -/* :root is used so that you can quickly add a class or attribute if you prefer e.g. `:root[data-rs-normalize]` */ +:root[style*="--USER__darkenImages"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) !important; + filter:brightness(var(--USER__darkenImages)) !important; +} -/* We create a default so that you don’t need to explicitly set one in the DOM. - Once the “Publisher’s styles” checkbox is unchecked, the normalize is applied automatically */ +:root[style*="readium-darken-on"] img{ + -webkit-filter:brightness(80%) !important; + filter:brightness(80%) !important; +} -:root[style*="readium-advanced-on"] { - --USER__typeScale: 1.2; /* This is the default type scale you’ll find in most publications */ +:root[style*="--USER__invertImages"] img{ + -webkit-filter:invert(var(--USER__invertImages)) !important; + filter:invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] p, -:root[style*="readium-advanced-on"] li, -:root[style*="readium-advanced-on"] div, -:root[style*="readium-advanced-on"] pre, -:root[style*="readium-advanced-on"] dd { - font-size: 1rem !important; +:root[style*="readium-invert-on"] img{ + -webkit-filter:invert(100%) !important; + filter:invert(100%) !important; } -:root[style*="readium-advanced-on"] h1 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.75rem !important; - font-size: calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="--USER__darkenImages"][style*="--USER__invertImages"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) invert(var(--USER__invertImages)) !important; + filter:brightness(var(--USER__darkenImages)) invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] h2 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.5rem !important; - font-size: calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-darken-on"][style*="--USER__invertImages"] img{ + -webkit-filter:brightness(80%) invert(var(--USER__invertImages)) !important; + filter:brightness(80%) invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] h3 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.25rem !important; - font-size: calc(1rem * var(--USER__typeScale)) !important; +:root[style*="--USER__darkenImages"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) invert(100%) !important; + filter:brightness(var(--USER__darkenImages)) invert(100%) !important; } -:root[style*="readium-advanced-on"] h4, -:root[style*="readium-advanced-on"] h5, -:root[style*="readium-advanced-on"] h6 { - font-size: 1rem !important; +:root[style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%) invert(100%) !important; + filter:brightness(80%) invert(100%) !important; } -:root[style*="readium-advanced-on"] small { - font-size: smaller !important; +:root[style*="--USER__invertGaiji"] img[class*="gaiji"]{ + -webkit-filter:invert(var(--USER__invertGaiji)) !important; + filter:invert(var(--USER__invertGaiji)) !important; } -:root[style*="readium-advanced-on"] sub, -:root[style*="readium-advanced-on"] sup { - font-size: 67.5% !important; +:root[style*="readium-invertGaiji-on"] img[class*="gaiji"]{ + -webkit-filter:invert(100%) !important; + filter:invert(100%) !important; } -/* The following styles kick in if you define the typeScale variable in the DOM. - No need to repeat declarations which don’t make use of the variable */ +:root[style*="readium-normalize-on"]{ + --USER__typeScale:1.2; +} -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h1 { - font-size: calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] p, +:root[style*="readium-normalize-on"] li, +:root[style*="readium-normalize-on"] div, +:root[style*="readium-normalize-on"] pre, +:root[style*="readium-normalize-on"] dd{ + font-size:1rem !important; } -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h2 { - font-size: calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] h1{ + font-size:1.75rem !important; + font-size:calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h3 { - font-size: calc(1rem * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] h2{ + font-size:1.5rem !important; + font-size:calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -/* Readium CSS - Default highlights +:root[style*="readium-normalize-on"] h3{ + font-size:1.25rem !important; + font-size:calc(1rem * var(--USER__typeScale)) !important; +} - A stylesheet for user highlights +:root[style*="readium-normalize-on"] h4, +:root[style*="readium-normalize-on"] h5, +:root[style*="readium-normalize-on"] h6{ + font-size:1rem !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-normalize-on"] small{ + font-size:smaller !important; +} -/* User Highlights */ +:root[style*="readium-normalize-on"] sub, +:root[style*="readium-normalize-on"] sup{ + font-size:67.5% !important; +} -.readiumCSS-yellow-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-yellow-highlight, -:root[style*="readium-night-on"] .readiumCSS-yellow-highlight { - background-color: rgba(255, 255, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h1{ + font-size:calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -.readiumCSS-green-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-green-highlight, -:root[style*="readium-night-on"] .readiumCSS-green-highlight { - background-color: rgba(0, 255, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h2{ + font-size:calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -.readiumCSS-orange-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-orange-highlight, -:root[style*="readium-night-on"] .readiumCSS-orange-highlight { - background-color: rgba(255, 165, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h3{ + font-size:calc(1rem * var(--USER__typeScale)) !important; } -.readiumCSS-pink-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-pink-highlight, -:root[style*="readium-night-on"] .readiumCSS-pink-highlight { - background-color: rgba(255, 105, 180, 0.5) !important; +:root[style*="readium-iPadOSPatch-on"] body{ + -webkit-text-size-adjust:none; } -/* Media overlays */ +:root[style*="readium-iPadOSPatch-on"] p, +:root[style*="readium-iPadOSPatch-on"] h1, +:root[style*="readium-iPadOSPatch-on"] h2, +:root[style*="readium-iPadOSPatch-on"] h3, +:root[style*="readium-iPadOSPatch-on"] h4, +:root[style*="readium-iPadOSPatch-on"] h5, +:root[style*="readium-iPadOSPatch-on"] h6, +:root[style*="readium-iPadOSPatch-on"] li, +:root[style*="readium-iPadOSPatch-on"] th, +:root[style*="readium-iPadOSPatch-on"] td, +:root[style*="readium-iPadOSPatch-on"] dt, +:root[style*="readium-iPadOSPatch-on"] dd, +:root[style*="readium-iPadOSPatch-on"] pre, +:root[style*="readium-iPadOSPatch-on"] address, +:root[style*="readium-iPadOSPatch-on"] details, +:root[style*="readium-iPadOSPatch-on"] summary, +:root[style*="readium-iPadOSPatch-on"] figcaption, +:root[style*="readium-iPadOSPatch-on"] div:not(:has(p, h1, h2, h3, h4, h5, h6, li, th, td, dt, dd, pre, address, aside, details, figcaption, summary)), +:root[style*="readium-iPadOSPatch-on"] aside:not(:has(p, h1, h2, h3, h4, h5, h6, li, th, td, dt, dd, pre, address, aside, details, figcaption, summary)){ + -webkit-text-zoom:reset; +} -.readiumCSS-mo-active-default { - color: black !important; - background-color: yellow !important; +:root[style*="readium-iPadOSPatch-on"] abbr, +:root[style*="readium-iPadOSPatch-on"] b, +:root[style*="readium-iPadOSPatch-on"] bdi, +:root[style*="readium-iPadOSPatch-on"] bdo, +:root[style*="readium-iPadOSPatch-on"] cite, +:root[style*="readium-iPadOSPatch-on"] code, +:root[style*="readium-iPadOSPatch-on"] dfn, +:root[style*="readium-iPadOSPatch-on"] em, +:root[style*="readium-iPadOSPatch-on"] i, +:root[style*="readium-iPadOSPatch-on"] kbd, +:root[style*="readium-iPadOSPatch-on"] mark, +:root[style*="readium-iPadOSPatch-on"] q, +:root[style*="readium-iPadOSPatch-on"] rp, +:root[style*="readium-iPadOSPatch-on"] rt, +:root[style*="readium-iPadOSPatch-on"] ruby, +:root[style*="readium-iPadOSPatch-on"] s, +:root[style*="readium-iPadOSPatch-on"] samp, +:root[style*="readium-iPadOSPatch-on"] small, +:root[style*="readium-iPadOSPatch-on"] span, +:root[style*="readium-iPadOSPatch-on"] strong, +:root[style*="readium-iPadOSPatch-on"] sub, +:root[style*="readium-iPadOSPatch-on"] sup, +:root[style*="readium-iPadOSPatch-on"] time, +:root[style*="readium-iPadOSPatch-on"] u, +:root[style*="readium-iPadOSPatch-on"] var{ + -webkit-text-zoom:normal; } -/*# sourceMappingURL=ReadiumCSS-after.css.map */ \ No newline at end of file + +:root[style*="readium-iPadOSPatch-on"] p:not(:has(b, cite, em, i, q, s, small, span, strong)):first-line{ + -webkit-text-zoom:normal; +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css index 6511e6d58..0cc5938f7 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css @@ -1,643 +1,439 @@ -/* Readium CSS - Config module - - A file allowing implementers to customize flags for reading modes, - user settings, etc. - - Repo: https://github.com/readium/readium-css */ - -/* Custom medias - Syntax: @custom-media --variable (prop: value) */ - -/* Responsive columns - The minimum width for which responsive columns (2 -> 1 and vice versa, - depending on the current font-size) must be enabled */ - -/* Mobile columns - The minimum and maximum width for mobile devices. - We’re forcing the landscape orientation by default, - and must still investigate large tablets (iPad Pro, Surface Pro 3, etc.). */ - -/* Custom selectors - Syntax: @custom-selector :--variable selector - The selectors you will use for flags/switches - You can alternatively use classes or custom data-* attributes */ - -/* User view = paged | scrolled */ - -/* Font-family override */ - -/* Advanced settings */ - -/* Reading Modes */ - -/* Filters (images) */ - -/* Accessibility normalization */ - -/* Accessibility font. You can add selectors, using “, ” as a separator, if you have multiple fonts */ - -/* Direction i.e. ltr and rtl */ - -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Base module - - A minimal stylesheet for all ebooks - - Repo: https://github.com/readium/readium-css */ - -/* Define viewport, HTML5-style */ - -@-ms-viewport { - width: device-width; +@-ms-viewport{ + width:device-width; } -@viewport { - width: device-width; - zoom: 1; +@viewport{ + width:device-width; + zoom:1; } -:root { - /* Default font-stacks */ - --RS__oldStyleTf: "Iowan Old Style", "Sitka Text", Palatino, "Book Antiqua", serif; - --RS__modernTf: Athelas, Constantia, Georgia, serif; - --RS__sansTf: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; - --RS__humanistTf: Seravek, Calibri, Roboto, Arial, sans-serif; - --RS__monospaceTf: "Andale Mono", Consolas, monospace; +:root{ - /* Config */ - --RS__baseFontFamily: var(--RS__oldStyleTf); + --RS__monospaceTf:ui-monospace, 'Andale Mono', 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace; - /* For square-ish fonts (CJK, Indic, etc.), we must apply some compensation in dynamic leading. Default is 1 i.e. no compensation */ - --RS__lineHeightCompensation: 1; + --RS__humanistTf:Seravek, Calibri, 'Gill Sans Nova', Roboto, Ubuntu, 'DejaVu Sans', source-sans-pro, sans-serif; - /* Dynamic leading based on typeface metrics + font-size setting */ - --RS__baseLineHeight: calc((1em + (2ex - 1ch) - ((1rem - 16px) * 0.1667)) * var(--RS__lineHeightCompensation)); -} + --RS__sansTf:-ui-sans-serif, -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI Variable', 'Segoe UI', Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Liberation Sans', Arial, sans-serif; + + --RS__modernTf:Athelas, Constantia, Charter, 'Bitstream Charter', Cambria, 'Georgia Pro', Georgia, serif; -/* Set default font for the html doc, so that it can be overridden by the authors’s stylesheet */ + --RS__oldStyleTf:'Iowan Old Style', Sitka, 'Sitka Text', Palatino, 'Book Antiqua', 'URW Palladio L', P052, serif; + --RS__baseFontFamily:var(--RS__oldStyleTf); + --RS__lineHeightCompensation:1; -html { - font-family: var(--RS__baseFontFamily); - /* Fallback line-height */ - line-height: 1.6; /* Fits a little bit better for all languages than 1.5 */ - line-height: var(--RS__baseLineHeight); - text-rendering: optimizeLegibility; + --RS__baseLineHeight:calc(1.5 * var(--RS__lineHeightCompensation)); } -/* 1.5 being too loose with larger font-sizes, we reset headings to normal (which value is 1.125–1.375 for our font-stacks) */ +html{ + font-family:var(--RS__baseFontFamily); + line-height:1.6; + line-height:var(--RS__baseLineHeight); + text-rendering:optimizelegibility; +} -h1, h2, h3 { - line-height: normal; +h1, h2, h3{ + line-height:normal; } :lang(ja), :lang(zh), -:lang(ko) { - word-wrap: break-word; - -webkit-line-break: strict; - -epub-line-break: strict; - line-break: strict; +:lang(ko){ + word-wrap:break-word; + -webkit-line-break:strict; + -epub-line-break:strict; + line-break:strict; } -/* Set default font for Math */ - -math { - font-family: "Latin Modern Math", "STIX Two Math", "XITS Math", "STIX Math", "Libertinus Math", "TeX Gyre Termes Math", "TeX Gyre Bonum Math", "TeX Gyre Schola", "DejaVu Math TeX Gyre", "TeX Gyre Pagella Math", "Asana Math", "Cambria Math", "Lucida Bright Math", "Minion Math", STIXGeneral, STIXSizeOneSym, Symbol, "Times New Roman", serif; +math{ + font-family:"Latin Modern Math", "STIX Two Math", "XITS Math", "STIX Math", "Libertinus Math", "TeX Gyre Termes Math", "TeX Gyre Bonum Math", "TeX Gyre Schola", "DejaVu Math TeX Gyre", "TeX Gyre Pagella Math", "Asana Math", "Cambria Math", "Lucida Bright Math", "Minion Math", STIXGeneral, STIXSizeOneSym, Symbol, "Times New Roman", serif; } -/* Language Overrides - That will only work if either html or body have a (xml:)lang attribute, not for inline overrides */ - -:lang(am) { - --RS__baseFontFamily: Kefa, Nyala, Roboto, Noto, "Noto Sans Ethiopic", serif; - --RS__lineHeightCompensation: 1.167; +:lang(am){ + --RS__baseFontFamily:kefa, nyala, roboto, noto, "Noto Sans Ethiopic", serif; + --RS__lineHeightCompensation:1.167; } -:lang(ar) { - --RS__baseFontFamily: "Geeza Pro", "Arabic Typesetting", Roboto, Noto, "Noto Naskh Arabic", "Times New Roman", serif; +:lang(ar){ + --RS__baseFontFamily:"Geeza Pro", "Arabic Typesetting", roboto, noto, "Noto Naskh Arabic", "Times New Roman", serif; } -:lang(bn) { - --RS__baseFontFamily: "Kohinoor Bangla", "Bangla Sangam MN", Vrinda, Roboto, Noto, "Noto Sans Bengali", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(bn){ + --RS__baseFontFamily:"Kohinoor Bangla", "Bangla Sangam MN", vrinda, roboto, noto, "Noto Sans Bengali", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(bo) { - --RS__baseFontFamily: Kailasa, "Microsoft Himalaya", Roboto, Noto, "Noto Sans Tibetan", sans-serif; +:lang(bo){ + --RS__baseFontFamily:kailasa, "Microsoft Himalaya", roboto, noto, "Noto Sans Tibetan", sans-serif; } -:lang(chr) { - --RS__baseFontFamily: "Plantagenet Cherokee", Roboto, Noto, "Noto Sans Cherokee"; - --RS__lineHeightCompensation: 1.167; +:lang(chr){ + --RS__baseFontFamily:"Plantagenet Cherokee", roboto, noto, "Noto Sans Cherokee"; + --RS__lineHeightCompensation:1.167; } -:lang(fa) { - --RS__baseFontFamily: "Geeza Pro", "Arabic Typesetting", Roboto, Noto, "Noto Naskh Arabic", "Times New Roman", serif; +:lang(fa){ + --RS__baseFontFamily:"Geeza Pro", "Arabic Typesetting", roboto, noto, "Noto Naskh Arabic", "Times New Roman", serif; } -:lang(gu) { - --RS__baseFontFamily: "Gujarati Sangam MN", "Nirmala UI", Shruti, Roboto, Noto, "Noto Sans Gujarati", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(gu){ + --RS__baseFontFamily:"Gujarati Sangam MN", "Nirmala UI", shruti, roboto, noto, "Noto Sans Gujarati", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(he) { - --RS__baseFontFamily: "New Peninim MT", "Arial Hebrew", Gisha, "Times New Roman", Roboto, Noto, "Noto Sans Hebrew" sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(he){ + --RS__baseFontFamily:"New Peninim MT", "Arial Hebrew", gisha, "Times New Roman", roboto, noto, "Noto Sans Hebrew" sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(hi) { - --RS__baseFontFamily: "Kohinoor Devanagari", "Devanagari Sangam MN", Kokila, "Nirmala UI", Roboto, Noto, "Noto Sans Devanagari", sans-serif; +:lang(hi){ + --RS__baseFontFamily:"Kohinoor Devanagari", "Devanagari Sangam MN", kokila, "Nirmala UI", roboto, noto, "Noto Sans Devanagari", sans-serif; - --RS__lineHeightCompensation: 1.1; + --RS__lineHeightCompensation:1.1; } -:lang(hy) { - --RS__baseFontFamily: Mshtakan, Sylfaen, Roboto, Noto, "Noto Serif Armenian", serif; +:lang(hy){ + --RS__baseFontFamily:mshtakan, sylfaen, roboto, noto, "Noto Serif Armenian", serif; } -:lang(iu) { - --RS__baseFontFamily: "Euphemia UCAS", Euphemia, Roboto, Noto, "Noto Sans Canadian Aboriginal", sans-serif; +:lang(iu){ + --RS__baseFontFamily:"Euphemia UCAS", euphemia, roboto, noto, "Noto Sans Canadian Aboriginal", sans-serif; } -:lang(ja) { - --RS__baseFontFamily: "游ゴシック体", YuGothic, "ヒラギノ丸ゴ", "Hiragino Sans", "Yu Gothic UI", "Meiryo UI", "MS Gothic", Roboto, Noto, "Noto Sans CJK JP", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; - - /* Extra variables for Japanese font-stacks as we may want to reuse them for user settings + default */ - --RS__serif-ja: "MS P明朝", "MS PMincho", "Hiragino Mincho Pro", "ヒラギノ明朝 Pro W3", "游明朝", "YuMincho", "MS 明朝", "MS Mincho", "Hiragino Mincho ProN", serif; - --RS__sans-serif-ja: "MS Pゴシック", "MS PGothic", "Hiragino Kaku Gothic Pro W3", "ヒラギノ角ゴ Pro W3", "Hiragino Sans GB", "ヒラギノ角ゴシック W3", "游ゴシック", "YuGothic", "MS ゴシック", "MS Gothic", "Hiragino Sans", sans-serif; - --RS__serif-ja-v: "MS 明朝", "MS Mincho", "Hiragino Mincho Pro", "ヒラギノ明朝 Pro W3", "游明朝", "YuMincho", "MS P明朝", "MS PMincho", "Hiragino Mincho ProN", serif; - --RS__sans-serif-ja-v: "MS ゴシック", "MS Gothic", "Hiragino Kaku Gothic Pro W3", "ヒラギノ角ゴ Pro W3", "Hiragino Sans GB", "ヒラギノ角ゴシック W3", "游ゴシック", "YuGothic", "MS Pゴシック", "MS PGothic", "Hiragino Sans", sans-serif; +:lang(ja){ + --RS__baseFontFamily:yugothic, "Hiragino Maru Gothic ProN", "Hiragino Sans", "Yu Gothic UI", "Meiryo UI", "MS Gothic", roboto, noto, "Noto Sans CJK JP", sans-serif; + --RS__lineHeightCompensation:1.167; + --RS__serif-ja:"Hiragino Mincho ProN", "Hiragino Mincho Pro", "YuMincho", "BIZ UDPMincho", "Yu Mincho", "MS P明朝", "MS PMincho", serif; + --RS__sans-serif-ja:"Hiragino Sans", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ W3", "YuGothic", "Yu Gothic Medium", "BIZ UDPGothic", "Yu Gothic", "MS Pゴシック", "MS PGothic", sans-serif; + --RS__serif-ja-v:"Hiragino Mincho ProN", "Hiragino Mincho Pro", "YuMincho", "BIZ UDMincho", "Yu Mincho", "MS明朝", "MS Mincho", serif; + --RS__sans-serif-ja-v:"Hiragino Sans", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ W3", "YuGothic", "Yu Gothic Medium", "BIZ UDGothic", "Yu Gothic", "MSゴシック", "MS Gothic", sans-serif; } -:lang(km) { - --RS__baseFontFamily: "Khmer Sangam MN", "Leelawadee UI", "Khmer UI", Roboto, Noto, "Noto Sans Khmer", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(km){ + --RS__baseFontFamily:"Khmer Sangam MN", "Leelawadee UI", "Khmer UI", roboto, noto, "Noto Sans Khmer", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(kn) { - --RS__baseFontFamily: "Kannada Sangam MN", "Nirmala UI", Tunga, Roboto, Noto, "Noto Sans Kannada", sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(kn){ + --RS__baseFontFamily:"Kannada Sangam MN", "Nirmala UI", tunga, roboto, noto, "Noto Sans Kannada", sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(ko) { - --RS__baseFontFamily: "Nanum Gothic", "Apple SD Gothic Neo", "Malgun Gothic", Roboto, Noto, "Noto Sans CJK KR", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(ko){ + --RS__baseFontFamily:"Nanum Gothic", "Apple SD Gothic Neo", "Malgun Gothic", roboto, noto, "Noto Sans CJK KR", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(lo) { - --RS__baseFontFamily: "Lao Sangam MN", "Leelawadee UI", "Lao UI", Roboto, Noto, "Noto Sans Lao", sans-serif; +:lang(lo){ + --RS__baseFontFamily:"Lao Sangam MN", "Leelawadee UI", "Lao UI", roboto, noto, "Noto Sans Lao", sans-serif; } -:lang(ml) { - --RS__baseFontFamily: "Malayalam Sangam MN", "Nirmala UI", Kartika, Roboto, Noto, "Noto Sans Malayalam", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(ml){ + --RS__baseFontFamily:"Malayalam Sangam MN", "Nirmala UI", kartika, roboto, noto, "Noto Sans Malayalam", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(or) { - --RS__baseFontFamily: "Oriya Sangam MN", "Nirmala UI", Kalinga, Roboto, Noto, "Noto Sans Oriya", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(or){ + --RS__baseFontFamily:"Oriya Sangam MN", "Nirmala UI", kalinga, roboto, noto, "Noto Sans Oriya", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(pa) { - --RS__baseFontFamily: "Gurmukhi MN", "Nirmala UI", Kartika, Roboto, Noto, "Noto Sans Gurmukhi", sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(pa){ + --RS__baseFontFamily:"Gurmukhi MN", "Nirmala UI", kartika, roboto, noto, "Noto Sans Gurmukhi", sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(si) { - --RS__baseFontFamily: "Sinhala Sangam MN", "Nirmala UI", "Iskoola Pota", Roboto, Noto, "Noto Sans Sinhala", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(si){ + --RS__baseFontFamily:"Sinhala Sangam MN", "Nirmala UI", "Iskoola Pota", roboto, noto, "Noto Sans Sinhala", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(ta) { - --RS__baseFontFamily: "Tamil Sangam MN", "Nirmala UI", Latha, Roboto, Noto, "Noto Sans Tamil", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(ta){ + --RS__baseFontFamily:"Tamil Sangam MN", "Nirmala UI", latha, roboto, noto, "Noto Sans Tamil", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(te) { - --RS__baseFontFamily: "Kohinoor Telugu", "Telugu Sangam MN", "Nirmala UI", Gautami, Roboto, Noto, "Noto Sans Telugu", sans-serif; +:lang(te){ + --RS__baseFontFamily:"Kohinoor Telugu", "Telugu Sangam MN", "Nirmala UI", gautami, roboto, noto, "Noto Sans Telugu", sans-serif; } -:lang(th) { - --RS__baseFontFamily: "Thonburi", "Leelawadee UI", "Cordia New", Roboto, Noto, "Noto Sans Thai", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(th){ + --RS__baseFontFamily:"Thonburi", "Leelawadee UI", "Cordia New", roboto, noto, "Noto Sans Thai", sans-serif; + --RS__lineHeightCompensation:1.067; } -/* The following will also work for zh-Hans */ - -:lang(zh) { - --RS__baseFontFamily: "方体", "PingFang SC", "黑体", "Heiti SC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK SC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh){ + --RS__baseFontFamily:"方体", "PingFang SC", "黑体", "Heiti SC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK SC", sans-serif; + --RS__lineHeightCompensation:1.167; } :lang(zh-Hant), -:lang(zh-TW) { - --RS__baseFontFamily: "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK TC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh-TW){ + --RS__baseFontFamily:"方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK TC", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(zh-HK) { - --RS__baseFontFamily: "方體", "PingFang HK", "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK TC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh-HK){ + --RS__baseFontFamily:"方體", "PingFang HK", "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK TC", sans-serif; + --RS__lineHeightCompensation:1.167; } -/* Readium CSS - Day/Default mode +:root{ - A preset theme for day mode, which is the default + --RS__selectionTextColor:inherit; - Repo: https://github.com/readium/readium-css */ + --RS__selectionBackgroundColor:#b4d8fe; -/* CONFIG */ + --RS__visitedColor:#551A8B; -:root { - --RS__backgroundColor: #FFFFFF; - --RS__textColor: #121212; + --RS__linkColor:#0000EE; - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; -} + --RS__textColor:#121212; -:root { - color: var(--RS__textColor) !important; - background-color: var(--RS__backgroundColor) !important; + --RS__backgroundColor:#FFFFFF; } -/* Note: Though `::selection` was present in drafts of CSS Selectors Level 3, it was removed during the Candidate Recommendation phase because its behavior was under-specified (especially with nested elements) and interoperability wasn’t achieved. Source: https://developer.mozilla.org/en-US/docs/Web/CSS/::selection */ - -::-moz-selection { - color: var(--RS__selectionTextColor); - background-color: var(--RS__selectionBackgroundColor); +:root{ + color:var(--RS__textColor) !important; + background-color:var(--RS__backgroundColor) !important; } -::selection { - color: var(--RS__selectionTextColor); - background-color: var(--RS__selectionBackgroundColor); +::-moz-selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } -/* Readium CSS - Fonts module - - A stylesheet for embedded fonts - - Repo: https://github.com/readium/readium-css */ - -/* /!\ Mind the path (relative to the folders in which you have stylesheets and the fonts) */ - -@font-face { - font-family: AccessibleDfA; - font-style: normal; - font-weight: normal; - src: local("AccessibleDfA"), - url("fonts/AccessibleDfA.otf") format("opentype"); +::selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } -@font-face { - font-family: "IA Writer Duospace"; - font-style: normal; - font-weight: normal; - src: local("iAWriterDuospace-Regular"), - url("fonts/iAWriterDuospace-Regular.ttf") format("truetype"); +@font-face{ + font-family:AccessibleDfA; + font-style:normal; + font-weight:normal; + src:local("AccessibleDfA"), url("fonts/AccessibleDfA-Regular.woff2") format("woff2"), url("fonts/AccessibleDfA-Regular.woff") format("woff"); } -/* If you have different weights/styles, - use `font-weight` and `font-style`, - not prefixes in the font-family name, - or else it will be a nightmare to manage in user settings. */ - -/* Readium CSS - HTML5 SR Patch stylesheet - - A set of style to adjust HTML5 Suggested Rendering to paginated content - - Repo: https://github.com/readium/readium-css */ - -/* Fragmentation */ - -body { - widows: 2; - orphans: 2; +@font-face{ + font-family:AccessibleDfA; + font-style:normal; + font-weight:bold; + src:local("AccessibleDfA"), url("fonts/AccessibleDfA-Bold.woff2") format("woff2"); } -figcaption, th, td { - widows: 1; - orphans: 1; +@font-face{ + font-family:AccessibleDfA; + font-style:italic; + font-weight:normal; + src:local("AccessibleDfA"), url("fonts/AccessibleDfA-Italic.woff2") format("woff2"); } -h2, -h3, -h4, -h5, -h6, -dt, -hr, -caption { - -webkit-column-break-after: avoid; - page-break-after: avoid; - break-after: avoid; +@font-face{ + font-family:"IA Writer Duospace"; + font-style:normal; + font-weight:normal; + src:local("iAWriterDuospace-Regular"), url("fonts/iAWriterDuospace-Regular.ttf") format("truetype"); } -h1, -h2, -h3, -h4, -h5, -h6, -dt, -figure, -tr { - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid; +body{ + widows:2; + orphans:2; } -/* Hyphenation */ - -body { - -webkit-hyphenate-character: "\002D"; - -moz-hyphenate-character: "\002D"; - -ms-hyphenate-character: "\002D"; - hyphenate-character: "\002D"; - -webkit-hyphenate-limit-lines: 3; - -ms-hyphenate-limit-lines: 3; - hyphenate-limit-lines: 3; -} - -h1, -h2, -h3, -h4, -h5, -h6, -dt, -figcaption, -pre, -caption, -address, -center, -code, -var { - -ms-hyphens: none; - -moz-hyphens: none; - -webkit-hyphens: none; - -epub-hyphens: none; - hyphens: none; +figcaption, th, td{ + widows:1; + orphans:1; } -/* OTF */ - -body { - font-variant-numeric: oldstyle-nums proportional-nums; +h2, h3, h4, h5, h6, dt, +hr, caption{ + -webkit-column-break-after:avoid; + page-break-after:avoid; + break-after:avoid; } -:lang(ja) body, -:lang(zh) body, -:lang(ko) body { - font-variant-numeric: lining-nums proportional-nums; +h1, h2, h3, h4, h5, h6, dt, +figure, tr{ + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; } -h1, h2, h3, h4, h5, h6, dt { - font-variant-numeric: lining-nums proportional-nums; +body{ + -webkit-hyphenate-character:"\002D"; + -moz-hyphenate-character:"\002D"; + -ms-hyphenate-character:"\002D"; + hyphenate-character:"\002D"; + -webkit-hyphenate-limit-lines:3; + -ms-hyphenate-limit-lines:3; + hyphenate-limit-lines:3; } -table { - font-variant-numeric: lining-nums tabular-nums; +h1, h2, h3, h4, h5, h6, dt, +figcaption, pre, caption, address, +center, code, var{ + -ms-hyphens:none; + -moz-hyphens:none; + -webkit-hyphens:none; + -epub-hyphens:none; + hyphens:none; } -code, var { - font-variant-ligatures: none; - font-variant-numeric: lining-nums tabular-nums slashed-zero; +body{ + font-variant-numeric:oldstyle-nums proportional-nums; } -rt { - font-variant-east-asian: ruby; +:lang(ja) body, +:lang(zh) body, +:lang(ko) body{ + font-variant-numeric:lining-nums proportional-nums; } -:lang(ar) { - font-variant-ligatures: common-ligatures; +h1, h2, h3, h4, h5, h6, dt{ + font-variant-numeric:lining-nums proportional-nums; } -:lang(ko) { - font-kerning: normal; +table{ + font-variant-numeric:lining-nums tabular-nums; } -/* Night mode */ - -hr { - color: inherit; - border-color: currentColor; +code, var{ + font-variant-ligatures:none; + font-variant-numeric:lining-nums tabular-nums slashed-zero; } -table, th, td { - border-color: currentColor; +rt{ + font-variant-east-asian:ruby; } -/* Horizontal Spacing */ - -figure, blockquote { - margin: 1em 5%; +:lang(ar){ + font-variant-ligatures:common-ligatures; } -/* - -:lang(ja) figure, :lang(ja) blockquote, -:lang(zh-Hant) figure, :lang(zh-Hant) blockquote, -:lang(zh-TW) figure, :lang(zh-TW) blockquote, -:lang(mn) figure, :lang(mn) blockquote { - margin: 5% 1em; +:lang(ko){ + font-kerning:normal; } -*/ - -ul, ol { - padding-left: 5%; +hr{ + color:inherit; + border-color:currentcolor; } -/* - -:lang(ja) ul, :lang(ja) ol, -:lang(zh-Hant) ul, :lang(zh-Hant) ol, -:lang(zh-TW) ul, :lang(zh-TW) ol, -:lang(mn) ul, :lang(mn) ol { - padding-top: 5%; +table, th, td{ + border-color:currentcolor; } -*/ - -dd { - margin-left: 5%; +figure, blockquote{ + margin:1em 5%; } -/* - -:lang(ja) dd, -:lang(zh-Hant) dd, -:lang(zh-TW) dd, -:lang(mn) dd { - margin-top: 5%; +ul, ol{ + padding-left:5%; } -*/ - -pre { - white-space: pre-wrap; - -ms-tab-size: 2; - -moz-tab-size: 2; - -webkit-tab-size: 2; - tab-size: 2; +dd{ + margin-left:5%; } -/* Normalization */ - -abbr[title], acronym[title] { - text-decoration: dotted underline; +pre{ + white-space:pre-wrap; + -ms-tab-size:2; + -moz-tab-size:2; + -webkit-tab-size:2; + tab-size:2; } -nobr wbr { - white-space: normal; +abbr[title], acronym[title]{ + text-decoration:dotted underline; } -/* Make ruby text and parentheses non-selectable (TBC) */ - -ruby > rt, ruby > rp { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; +nobr wbr{ + white-space:normal; } -/* Internationalization */ +ruby > rt, ruby > rp{ + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; +} -*:lang(ja), -*:lang(zh), -*:lang(ko), -:lang(ja) cite, -:lang(ja) dfn, -:lang(ja) em, -:lang(ja) i, -:lang(zh) cite, -:lang(zh) dfn, -:lang(zh) em, -:lang(zh) i, -:lang(ko) cite, -:lang(ko) dfn, -:lang(ko) em, -:lang(ko) i { - font-style: normal; +*:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)), +*:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)), +*:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)), +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) cite, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) dfn, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) em, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) i, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) cite, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) dfn, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) em, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) i, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) cite, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) dfn, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) em, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) i{ + font-style:normal; } :lang(ja) a, :lang(zh) a, -:lang(ko) a { - text-decoration: none; -} - -/* Readium CSS - Safeguards module - - A set of styles to prevent common issues in pagination - - Repo: https://github.com/readium/readium-css */ - -/* Config */ - -/* We’ll be using an "RS__" prefix so that we can prevent collisions with authors’ CSS */ - -:root { - /* max-width for media, you can override that via JS if not compiled to static */ - --RS__maxMediaWidth: 100%; - - /* max-height for media, you can override that via JS if not compiled to static - Please consider figures might have a figcaption, which is why 95vh in the first place */ - --RS__maxMediaHeight: 95vh; - - /* value for medias’ box-sizing */ - --RS__boxSizingMedia: border-box; - - /* value for table’s box-sizing */ - --RS__boxSizingTable: border-box; +:lang(ko) a{ + text-decoration:none; } -/* Sanitize line-heights in webkit e.g. raised cap without a declared line-height - See effect by checking this demo in Safari: https://codepen.io/JayPanoz/pen/gRmzrE - Note: glyphs has to be reset to inline for CJK */ - -html { - -webkit-line-box-contain: block glyphs replaced; -} - -:lang(ja) { - -webkit-line-box-contain: block inline replaced; +:root{ + --RS__maxMediaWidth:100%; + --RS__maxMediaHeight:95vh; + --RS__boxSizingMedia:border-box; + --RS__boxSizingTable:border-box; } -/* Wrap long strings if larger than line-length */ - -a, h1, h2, h3, h4, h5, h6 { - word-wrap: break-word; +a, a span, span a, h1, h2, h3, h4, h5, h6{ + word-wrap:break-word; } -div { - max-width: var(--RS__maxMediaWidth); +div{ + max-width:var(--RS__maxMediaWidth); } -/* Size medias */ - -/* You can override CSS variables by re-defining it for all elements or a specific one */ - -img, svg, audio, video { +img, svg|svg, video{ + object-fit:contain; - /* Object-fit allows us to keep the correct aspect-ratio */ - object-fit: contain; - - width: auto; - height: auto; - - /* Some files don’t have max-width */ - max-width: var(--RS__maxMediaWidth); - - /* We’re setting a max-height, especially for covers */ - max-height: var(--RS__maxMediaHeight) !important; - /* We probably don’t need to use modern box-sizing as auto behaves like it */ - box-sizing: var(--RS__boxSizingMedia); - - /* For page-break, we must use those 3 - We can’t use a variable there, webkit seems to no support them for those properties */ - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid; + width:auto; + height:auto; + max-width:var(--RS__maxMediaWidth); + max-height:var(--RS__maxMediaHeight) !important; + box-sizing:var(--RS__boxSizingMedia); + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; } -/* Try preventing border being cut-off, webkit + blink have content-box by default */ +audio{ + max-width:100%; + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; + } -table { - max-width: var(--RS__maxMediaWidth); - box-sizing: var(--RS__boxSizingTable); -} -/*# sourceMappingURL=ReadiumCSS-before.css.map */ \ No newline at end of file +table{ + max-width:var(--RS__maxMediaWidth); + box-sizing:var(--RS__boxSizingTable); +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css index 78aa0172b..c05d1d8ec 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css @@ -1,189 +1,152 @@ -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Default module - - A stylesheet for unstyled ebooks based on HTML5 Suggested Rendering - Note: works in combination with Base module - - Repo: https://github.com/readium/readium-css */ +:root{ + --RS__compFontFamily:var(--RS__baseFontFamily); + --RS__codeFontFamily:var(--RS__monospaceTf); -/* CONFIG */ + --RS__typeScale:1.125; + --RS__baseFontSize:100%; -:root { - --RS__compFontFamily: var(--RS__baseFontFamily); - --RS__codeFontFamily: var(--RS__monospaceTf); + --RS__flowSpacing:1.5rem; + --RS__paraSpacing:0; + --RS__paraIndent:1em; - --RS__typeScale: 1.125; /* 1.067 | 1.125 | 1.2 | 1.25 | 1.333 | 1.414 | 1.5 | 1.618 */ - --RS__baseFontSize: 100%; + --RS__linkColor:#0000EE; + --RS__visitedColor:#551A8B; - --RS__flowSpacing: 1.5rem; - --RS__paraSpacing: 0; - --RS__paraIndent: 1em; - - --RS__linkColor: #0000EE; - --RS__visitedColor: #551A8B; - - --RS__primaryColor: ; - --RS__secondaryColor: ; + --RS__primaryColor:; + --RS__secondaryColor:; } -/* STYLES */ - -/* Typo */ - -body { - font-size: var(--RS__baseFontSize); +body{ + font-size:var(--RS__baseFontSize); } -h1, h2, h3, h4, h5, h6 { - font-family: var(--RS__compFontFamily); +h1, h2, h3, h4, h5, h6{ + font-family:var(--RS__compFontFamily); } -/* Flow content */ - -blockquote, -figure, -p, -pre, -aside, -footer, -form, -hr { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); +blockquote, figure, p, pre, +aside, footer, form, hr{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); } -p { - margin-top: var(--RS__paraSpacing); - margin-bottom: var(--RS__paraSpacing); - text-indent: var(--RS__paraIndent); +p{ + margin-top:var(--RS__paraSpacing); + margin-bottom:var(--RS__paraSpacing); + text-indent:var(--RS__paraIndent); } -h1 + p, -h2 + p, -h3 + p, -h4 + p, -h5 + p, -h6 + p, -hr + p { - text-indent: 0; +h1 + p, h2 + p, h3 + p, h4 + p, h5 + p, h6 + p, +hr + p{ + text-indent:0; } -pre { - font-family: var(--RS__codeFontFamily); +pre{ + font-family:var(--RS__codeFontFamily); } -/* Phrasing content */ - -code, kbd, samp, tt { - font-family: var(--RS__codeFontFamily); +code, kbd, samp, tt{ + font-family:var(--RS__codeFontFamily); } -sub, sup { - position: relative; - font-size: 67.5%; - line-height: 1; +sub, sup{ + position:relative; + font-size:67.5%; + line-height:1; } -sub { - bottom: -0.2ex; +sub{ + bottom:-0.2ex; } -sup { - bottom: 0; +sup{ + bottom:0; } -:link { - color: var(--RS__linkColor); +:link{ + color:var(--RS__linkColor); } -:visited { - color: var(--RS__visitedColor); +:visited{ + color:var(--RS__visitedColor); } -/* Headings */ - -h1 { - margin-top: calc(var(--RS__flowSpacing) * 2); - margin-bottom: calc(var(--RS__flowSpacing) * 2); - /* The following is base font size * typescale power of 3 */ - font-size: calc(((1em * var(--RS__typeScale)) * var(--RS__typeScale)) * var(--RS__typeScale)); +h1{ + margin-top:calc(var(--RS__flowSpacing) * 2); + margin-bottom:calc(var(--RS__flowSpacing) * 2); + font-size:calc(((1em * var(--RS__typeScale)) * var(--RS__typeScale)) * var(--RS__typeScale)); } -h2 { - margin-top: calc(var(--RS__flowSpacing) * 2); - margin-bottom: var(--RS__flowSpacing); - /* The following is base font size * typescale power of 2 */ - font-size: calc((1em * var(--RS__typeScale)) * var(--RS__typeScale)); +h2{ + margin-top:calc(var(--RS__flowSpacing) * 2); + margin-bottom:var(--RS__flowSpacing); + font-size:calc((1em * var(--RS__typeScale)) * var(--RS__typeScale)); } -h3 { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); - font-size: calc(1em * var(--RS__typeScale)); +h3{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); + font-size:calc(1em * var(--RS__typeScale)); } -h4 { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); - font-size: 1em; +h4{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); + font-size:1em; } -h5 { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); - font-size: 1em; - font-variant: small-caps; +h5{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); + font-size:1em; + font-variant:small-caps; } -h6 { - margin-top: var(--RS__flowSpacing); - margin-bottom: 0; - font-size: 1em; - text-transform: lowercase; - font-variant: small-caps; +h6{ + margin-top:var(--RS__flowSpacing); + margin-bottom:0; + font-size:1em; + text-transform:lowercase; + font-variant:small-caps; } -/* Lists */ - -dl, ol, ul { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); +dl, ol, ul{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); } -/* Table */ - -table { - margin: var(--RS__flowSpacing) 0; - border: 1px solid currentColor; - border-collapse: collapse; - empty-cells: show; +table{ + margin:var(--RS__flowSpacing) 0; + border:1px solid currentcolor; + border-collapse:collapse; + empty-cells:show; } -thead, tbody, tfoot, table > tr { - vertical-align: top; +thead, tbody, tfoot, table > tr{ + vertical-align:top; } -th { - text-align: left; +th{ + text-align:left; } -th, td { - padding: 4px; - border: 1px solid currentColor; -} -/*# sourceMappingURL=ReadiumCSS-default.css.map */ \ No newline at end of file +th, td{ + padding:4px; + border:1px solid currentcolor; +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-ebpaj_fonts_patch.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-ebpaj_fonts_patch.css index b73eb6744..16da6be42 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-ebpaj_fonts_patch.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-ebpaj_fonts_patch.css @@ -1,80 +1,79 @@ -/* Readium CSS +/* Readium CSS EBPAJ Fonts Patch module A stylesheet improving EBPAJ @font-face declarations to cover all platforms - Repo: https://github.com/readium/readium-css */ + Repo: https://github.com/readium/css */ /* EBPAJ template only references fonts from MS Windows… - so we must reference fonts from other platforms + so we must reference fonts from other platforms and override authors’ stylesheets. What we do there is keeping their default value and providing fallbacks. - + /!\ /!\ /!\ /!\ /!\ FYI, you might want to load this polyfill only if you find one of the following metadata items in the OPF package: - - version 1: + - version 1: ebpaj-guide-1.0 - - version 1.1: - 1.1 - */ + - version 1.1: + 1.1 +*/ + +/* + Hiragino PostScript Font name lists: + https://www.screen.co.jp/ga_product/sento/support/QA/ss_psname.html +*/ /* 横組み用 (horizontal writing) */ @font-face { font-family: "serif-ja"; - src: local("MS P明朝"), - local("MS PMincho"), - local("Hiragino Mincho Pro"), - local("ヒラギノ明朝 Pro W3"), - local("游明朝"), - local("YuMincho"), - local("MS 明朝"), - local("MS Mincho"), - local("Hiragino Mincho ProN"); + src: local("MS P明朝"), /* for IE */ + local("MS PMincho"), /* MS P明朝 */ + local("HiraMinProN-W3"), local("Hiragino Mincho ProN"), /* ヒラギノ明朝 ProN W3 */ + local("HiraMinPro-W3"), local("Hiragino Mincho Pro"), /* ヒラギノ明朝 Pro W3 */ + local("YuMin-Medium"), local("YuMincho"), /* 游明朝体(macOS) */ + local("Yu Mincho"), /* 游明朝(Windows) */ + local("BIZ UDPMincho"); /* BIZ UDP明朝 */ } @font-face { font-family: "sans-serif-ja"; - src: local("MS Pゴシック"), - local("MS PGothic"), - local("Hiragino Kaku Gothic Pro W3"), - local("ヒラギノ角ゴ Pro W3"), - local("Hiragino Sans GB"), - local("ヒラギノ角ゴシック W3"), - local("游ゴシック"), - local("YuGothic"), - local("MS ゴシック"), - local("MS Gothic"), - local("Hiragino Sans"); + src: local("MS Pゴシック"), /* for IE */ + local("MS PGothic"), /* MS Pゴシック */ + local("HiraginoSans-W3"), local("Hiragino Sans"), /* ヒラギノ角ゴシック */ + local("HiraKakuProN-W3"), local("Hiragino Kaku Gothic ProN"), /* ヒラギノ角ゴ ProN W3 */ + local("HiraKakuPro-W3"), local("Hiragino Kaku Gothic Pro"), /* ヒラギノ角ゴ Pro W3 */ + local("ヒラギノ角ゴ W3"), /* for old Safari */ + local("HiraginoKaku-W3-90msp-RKSJ-H"), /* ヒラギノ角ゴ W3(TrueType) */ + local("YuGothic-Medium"), local("YuGothic"), /* 游ゴシック体(macOS) */ + local("Yu Gothic Medium"), local("Yu Gothic"), /* 游ゴシック(Windows) "Yu Gothic" is a fallback. */ + local("BIZ UDPGothic"); /* BIZ UDPゴシック */ } /* 縦組み用 (vertical writing) */ @font-face { font-family: "serif-ja-v"; - src: local("MS 明朝"), - local("MS Mincho"), - local("Hiragino Mincho Pro"), - local("ヒラギノ明朝 Pro W3"), - local("游明朝"), - local("YuMincho"), - local("MS P明朝"), - local("MS PMincho"), - local("Hiragino Mincho ProN"); + src: local("MS 明朝"), /* for IE */ + local("MS Mincho"), /* MS 明朝 */ + local("HiraMinProN-W3"), local("Hiragino Mincho ProN"), /* ヒラギノ明朝 ProN W3 */ + local("HiraMinPro-W3"), local("Hiragino Mincho Pro"), /* ヒラギノ明朝 Pro W3 */ + local("YuMin-Medium"), local("YuMincho"), /* 游明朝体(macOS) */ + local("Yu Mincho"), /* 游明朝(Windows) */ + local("BIZ UDMincho"); /* BIZ UD明朝 */ } @font-face { font-family: "sans-serif-ja-v"; - src: local("MS ゴシック"), - local("MS Gothic"), - local("Hiragino Kaku Gothic Pro W3"), - local("ヒラギノ角ゴ Pro W3"), - local("Hiragino Sans GB"), - local("ヒラギノ角ゴシック W3"), - local("游ゴシック"), - local("YuGothic"), - local("MS Pゴシック"), - local("MS PGothic"), - local("Hiragino Sans"); + src: local("MS ゴシック"), /* for IE */ + local("MS Gothic"), /* MS ゴシック */ + local("HiraginoSans-W3"), local("Hiragino Sans"), /* ヒラギノ角ゴシック */ + local("HiraKakuProN-W3"), local("Hiragino Kaku Gothic ProN"), /* ヒラギノ角ゴ ProN W3 */ + local("HiraKakuPro-W3"), local("Hiragino Kaku Gothic Pro"), /* ヒラギノ角ゴ Pro W3 */ + local("ヒラギノ角ゴ W3"), /* for old Safari */ + local("HiraKakuDS-W3-83pv-RKSJ-H"), /* ヒラギノ角ゴ W3(TrueType) */ + local("YuGothic-Medium"), local("YuGothic"), /* 游ゴシック体(macOS) */ + local("Yu Gothic Medium"), local("Yu Gothic"), /* 游ゴシック(Windows) "Yu Gothic" is a fallback. */ + local("BIZ UDGothic"); /* BIZ UDゴシック */ } \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css index 47867bfd5..a43234fc6 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css @@ -1,705 +1,563 @@ -/* Readium CSS - Config module - - A file allowing implementers to customize flags for reading modes, - user settings, etc. - - Repo: https://github.com/readium/readium-css */ - -/* Custom medias - Syntax: @custom-media --variable (prop: value) */ - -/* Responsive columns - The minimum width for which responsive columns (2 -> 1 and vice versa, - depending on the current font-size) must be enabled */ - -/* Mobile columns - The minimum and maximum width for mobile devices. - We’re forcing the landscape orientation by default, - and must still investigate large tablets (iPad Pro, Surface Pro 3, etc.). */ - -/* Custom selectors - Syntax: @custom-selector :--variable selector - The selectors you will use for flags/switches - You can alternatively use classes or custom data-* attributes */ - -/* User view = paged | scrolled */ - -/* Font-family override */ - -/* Advanced settings */ - -/* Reading Modes */ - -/* Filters (images) */ - -/* Accessibility normalization */ - -/* Accessibility font. You can add selectors, using “, ” as a separator, if you have multiple fonts */ - -/* Direction i.e. ltr and rtl */ - -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Pagination module - - A set of styles to paginate ePublications - - Repo: https://github.com/readium/readium-css */ +:root{ -/* Config */ + --RS__viewportWidth:100%; -/* Columns are responsive by default, even if column-width is set in pixels, - which means two-page spread will switch to single page depending on current font-size. - If you want more control, I’m afraid you’ll have to update colWidth/colGap dynamically, - which is how a significant amount of RS do at the moment. */ + --RS__pageGutter:0; -/* Default for smartphone portrait (small screens) */ + --RS__defaultLineLength:40rem; -:root { - /* Your columns’ width floor */ - --RS__colWidth: 45em; /* The width at which we’ll switch to 2 columns by default. PS: you can’t set it in rem */ + --RS__colGap:0; - /* Ideal number of columns (depending on columns’ width floor) */ - --RS__colCount: 1; + --RS__colCount:1; - /* Gap between columns (in pixels so that it won’t resize with font-size) */ - --RS__colGap: 0; - - /* Optimal line-length (rem will take :root font-size into account, whatever the body’s font-size) */ - --RS__maxLineLength: 40rem; - - /* Default page horizontal margins (in pixels so that it won’t resize with font-size) */ - --RS__pageGutter: 20px; /* See if colGap and pageGutter can be the same var */ + --RS__colWidth:100vw; } -/* Reset page margins for Forward compatibility */ - -@page { - margin: 0 !important; +@page{ + margin:0 !important; } -/* :root selector has same specificity as a class i.e. 0010 - We might have to change that to html / context - -> https://css-tricks.com/almanac/selectors/r/root/ */ - -:root { - - /* In case you use left position to scroll, can be removed if using transform: translateX() */ - position: relative; - - -webkit-column-width: var(--RS__colWidth); - -moz-column-width: var(--RS__colWidth); - column-width: var(--RS__colWidth); - - /* Init pagination */ - /* TODO: document columns’ logic cos it might feel weird at first */ - -webkit-column-count: var(--RS__colCount); - -moz-column-count: var(--RS__colCount); - column-count: var(--RS__colCount); - - -webkit-column-gap: var(--RS__colGap); - -moz-column-gap: var(--RS__colGap); - column-gap: var(--RS__colGap); - - /* Default is balance and we want columns to be filled entirely (100vh) */ - -moz-column-fill: auto; - column-fill: auto; - width: 100%; - height: 100vh; - max-width: 100%; - max-height: 100vh; - min-width: 100%; - min-height: 100vh; - padding: 0 !important; - margin: 0 !important; - - /* Column size will depend on this if we want to make it responsive */ - font-size: 100% !important; +:root{ + position:relative; - -webkit-text-size-adjust: 100%; + -webkit-column-width:var(--RS__colWidth); + -moz-column-width:var(--RS__colWidth); + column-width:var(--RS__colWidth); + -webkit-column-count:var(--RS__colCount); + -moz-column-count:var(--RS__colCount); + column-count:var(--RS__colCount); - /* Switch to newer box model (not inherited by authors’ styles) */ - box-sizing: border-box; - - /* Fix bug for older Chrome */ - -webkit-perspective: 1; - /* Prevents options pop-up when long tap in webkit */ - -webkit-touch-callout: none; + -webkit-column-gap:var(--RS__colGap); + -moz-column-gap:var(--RS__colGap); + column-gap:var(--RS__colGap); + -moz-column-fill:auto; + column-fill:auto; + width:var(--RS__viewportWidth); + height:100vh; + max-width:var(--RS__viewportWidth); + max-height:100vh; + min-width:var(--RS__viewportWidth); + min-height:100vh; + padding:0 !important; + margin:0 !important; + font-size:1rem !important; + box-sizing:border-box; + -webkit-touch-callout:none; } -body { - /* overflow: hidden; bugfix: contents won’t paginate in Firefox and one sample in Safari */ - width: 100%; - - /* Limit line-length but we have to reset when 2 columns and control the viewport. - By using max-width + margin auto, margins will shrink when font-size increases, - which is what would be expected in terms of typography. */ - max-width: var(--RS__maxLineLength) !important; - padding: 0 var(--RS__pageGutter) !important; - margin: 0 auto !important; - - /* We need a minimum padding on body so that descandants/ascendants in italic/script are not cut-off. - Drawback: we have to use border-box so that it doesn’t screw the box model, - which means it impacts colWidth and max-width */ - box-sizing: border-box; +body{ + width:100%; + max-width:var(--RS__defaultLineLength) !important; + padding:0 var(--RS__pageGutter) !important; + margin:0 auto !important; + overflow:hidden; + box-sizing:border-box; } -/* We’ll now redefine margins and columns depending on the minimum width available - The goal is having the simplest model possible and avoid targeting devices */ +@supports (overflow: clip){ -/* Smartphone landscape */ + :root{ + overflow:clip; + } -@media screen and (min-width: 35em) { - :root { - --RS__pageGutter: 30px; - } + body{ + overflow:clip; + overflow-clip-margin:content-box; + } } -/* Tablet portrait */ - -@media screen and (min-width: 45em) { - :root { - --RS__pageGutter: 40px; - } +:root[style*="readium-scroll-on"]{ + -webkit-columns:auto auto !important; + -moz-columns:auto auto !important; + columns:auto auto !important; + width:auto !important; + height:auto !important; + max-width:none !important; + max-height:none !important; + min-width:0 !important; + min-height:0 !important; } -/* Desktop + tablet large */ - -/* We get the previous settings, we just change the margins */ - -@media screen and (min-width: 75em) { - :root { - --RS__pageGutter: 50px; - } +:root[style*="readium-scroll-on"] body{ + max-width:var(--RS__defaultLineLength) !important; + overflow:auto; } -/* At this point (80em or so), constraining line length must be done at the web view/iframe level, or by limiting the size of :root itself */ - -/* Responsive columns */ +@supports (overflow: clip){ -@media screen and (min-width: 60em), screen and (min-device-width: 36em) and (max-device-width: 47em) and (orientation: landscape) { - :root { - /* The size at which we want 2 columns to switch to 1 (depending on font-size) */ - --RS__colWidth: 20em; /* 20 * 16 = 320px but 20 * 28 = 560px so it will switch to 1 col @ 175% font-size (user-setting) on an iPad */ - /* We constrain to 2 columns so that we can never get 3 or 4, etc. */ - --RS__colCount: 2; - --RS__maxLineLength: 39.99rem; /* If we don’t use this, colNumber user setting won’t work in Safari… */ + :root[style*="readium-scroll-on"]{ + overflow:auto; } -} - -/* Readium CSS - Scroll module - - A set of styles to scroll ePublications - This module overrides pagination - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-scroll-on"] { - /* Reset columns, auto + auto = columns can’t be created */ - -webkit-columns: auto auto !important; - -moz-columns: auto auto !important; - columns: auto auto !important; - width: auto !important; - height: auto !important; - max-width: none !important; - max-height: none !important; - /* Reset html size so that the user can scroll */ - min-width: 0 !important; - min-height: 0 !important; -} - -/* Make sure line-length is limited in all configs */ - -:root[style*="readium-scroll-on"] body { - --RS__maxLineLength: 40rem !important; + :root[style*="readium-scroll-on"] body{ + overflow:clip; + } } -/* Readium CSS - Night mode +:root[style*="readium-night-on"]{ - A preset theme for night mode + --RS__selectionTextColor:inherit; - Repo: https://github.com/readium/readium-css */ + --RS__selectionBackgroundColor:#b4d8fe; -/* CONFIG */ + --RS__visitedColor:#0099E5; -/* [style*="--USER__appearance"] can be used to increase specificity but performance hit */ + --RS__linkColor:#63caff; -:root[style*="readium-night-on"] { - --RS__backgroundColor: #000000; - --RS__textColor: #FEFEFE; + --RS__textColor:#FEFEFE; - --RS__linkColor: #63caff; - --RS__visitedColor: #0099E5; - - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; + --RS__backgroundColor:#000000; } -/* we don’t need to redeclare bg-color and color for :root since we will inherit and update from day/default mode */ - -:root[style*="readium-night-on"] *:not(a) { - color: inherit !important; - background-color: transparent !important; - border-color: currentColor !important; +:root[style*="readium-night-on"] *:not(a){ + color:inherit !important; + background-color:transparent !important; + border-color:currentcolor !important; } -:root[style*="readium-night-on"] svg text { - fill: currentColor !important; - stroke: none !important; +:root[style*="readium-night-on"] svg text{ + fill:currentcolor !important; + stroke:none !important; } :root[style*="readium-night-on"] a:link, -:root[style*="readium-night-on"] a:link * { - color: var(--RS__linkColor) !important; +:root[style*="readium-night-on"] a:link *{ + color:var(--RS__linkColor) !important; } :root[style*="readium-night-on"] a:visited, -:root[style*="readium-night-on"] a:visited * { - color: var(--RS__visitedColor) !important; +:root[style*="readium-night-on"] a:visited *{ + color:var(--RS__visitedColor) !important; } -/* For epub:type, in case the contents are served as text/html, namespaces won’t work hence why we’re using both syntax */ - :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, -:root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: invert(100%); - filter: invert(100%); -} - -/* Darken all images on user’s demand */ - -:root[style*="readium-night-on"][style*="readium-darken-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); -} - -/* Invert all images on user’s demand */ - -:root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: invert(100%); - filter: invert(100%); -} - -/* Darken and invert on user’s demand */ - -:root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%) invert(100%); - filter: brightness(80%) invert(100%); +:root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:invert(100%); + filter:invert(100%); } -/* Readium CSS - Sepia mode +:root[style*="readium-sepia-on"]{ - A preset theme for sepia mode + --RS__selectionTextColor:inherit; - Repo: https://github.com/readium/readium-css */ + --RS__selectionBackgroundColor:#b4d8fe; -/* CONFIG */ + --RS__visitedColor:#551A8B; -:root[style*="readium-sepia-on"] { - --RS__backgroundColor: #faf4e8; - --RS__textColor: #121212; + --RS__linkColor:#0000EE; - --RS__linkColor: #0000EE; - --RS__visitedColor: #551A8B; + --RS__textColor:#121212; - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; - - --RS__maxLineLength: 40.01rem; /* Forcing a reflow in Blink/Webkit so that blend mode can work */ + --RS__backgroundColor:#faf4e8; } -/* we don’t need to redeclare bg-color and color for :root since we will inherit and update from day/default mode */ - -:root[style*="readium-sepia-on"] *:not(a) { - color: inherit !important; - background-color: transparent !important; +:root[style*="readium-sepia-on"] *:not(a){ + color:inherit !important; + background-color:transparent !important; } :root[style*="readium-sepia-on"] a:link, -:root[style*="readium-sepia-on"] a:link * { - color: var(--RS__linkColor); +:root[style*="readium-sepia-on"] a:link *{ + color:var(--RS__linkColor); } :root[style*="readium-sepia-on"] a:visited, -:root[style*="readium-sepia-on"] a:visited * { - color: var(--RS__visitedColor); +:root[style*="readium-sepia-on"] a:visited *{ + color:var(--RS__visitedColor); } -:root[style*="readium-sepia-on"] svg, -:root[style*="readium-sepia-on"] img { - /* Make sure the proper bg-color is used for the blend mode */ - background-color: transparent !important; - mix-blend-mode: multiply; -} - -/* Readium CSS - OS Accessibility Modes - - A stylesheet to deal with OS accessibility settings - - Repo: https://github.com/readium/readium-css */ +@media screen and (-ms-high-contrast: active){ -/* Windows high contrast colors are mapped to CSS system color keywords - See http://www.gwhitworth.com/blog/2017/04/how-to-use-ms-high-contrast */ - -@media screen and (-ms-high-contrast: active) { - :root { - color: windowText !important; - background-color: window !important; + :root{ + color:windowText !important; + background-color:window !important; } - /* The following selectors are super funky but it makes sure everything is inherited, this is indeed critical for this mode */ :root :not(#\#):not(#\#):not(#\#), :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) - :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) { - color: inherit !important; - background-color: inherit !important; + :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#){ + color:inherit !important; + background-color:inherit !important; } - .readiumCSS-mo-active-default { - color: highlightText !important; - background-color: highlight !important; + .readiumCSS-mo-active-default{ + color:highlightText !important; + background-color:highlight !important; } - - /* For links, hyperlink keyword is automatically set */ - - /* Should we also set user highlights? */ } -@media screen and (-ms-high-contrast: white-on-black) { +@media screen and (-ms-high-contrast: white-on-black){ + :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, - :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: none !important; - filter: none !important; + :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: none !important; - filter: none !important; + + :root[style*="readium-night-on"][style*="readium-invert-on"] img{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); + + :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%); + filter:brightness(80%); } } -/* Will be true on recent versions of iOS and MacOS if inverted setting enabled by the user */ +@media screen and (inverted-colors){ -@media screen and (inverted-colors) { :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, - :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: none !important; - filter: none !important; + :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: none !important; - filter: none !important; + + :root[style*="readium-night-on"][style*="readium-invert-on"] img{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); + + :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%); + filter:brightness(80%); } } -@media screen and (monochrome) { - /* Grayscale (Implemented in Safari, what about eInk?) */ - /* Must deal with anything color (contrast) so must be managed at the night/sepia/theme level :( */ +@media screen and (monochrome){ } -@media screen and (prefers-reduced-motion) { - /* If reduced motion is set on MacOS, in case we have animation/transition */ +@media screen and (prefers-reduced-motion){ } -/* Readium CSS - Columns number pref - - A submodule managing columns number for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -/* Number of columns = 1 | 2 */ - -/* We still need to see if we allow users to force number of columns for all configs, currently it behaves as an "auto" setting */ - -/* apply col setting except for mobile portrait */ - -@media screen and (min-width: 60em), screen and (min-device-width: 36em) and (max-device-width: 47em) and (orientation: landscape) { - :root[style*="--USER__colCount: 1"], - :root[style*="--USER__colCount:1"], - :root[style*="--USER__colCount: 2"], - :root[style*="--USER__colCount:2"] { - -webkit-column-count: var(--USER__colCount); - -moz-column-count: var(--USER__colCount); - column-count: var(--USER__colCount); - } - - /* If one column, make sure we limit line-length */ - :root[style*="--USER__colCount: 1"], - :root[style*="--USER__colCount:1"] { - --RS__maxLineLength: 40rem !important; /* This is the only way for the user setting to work in webkit… */ - --RS__colWidth: 100vw; - } - - /* If smartphone landscape, and 2 columns, col width the same as iPad landscape + desktop */ - :root[style*="--USER__colCount: 2"], - :root[style*="--USER__colCount:2"] { - --RS__colWidth: auto; /* User explicitely tells he/she wants 2 columns, we reset floor value */ - } +:root[style*="--USER__backgroundColor"]{ + background-color:var(--USER__backgroundColor) !important; } -/* Readium CSS - Page margins pref - - A submodule managing page margins for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -/* Page Margins: the user margin is a factor of the page gutter e.g. 0.5, 0.75, 1, 1.25, 1.5, etc. */ - -:root[style*="--USER__pageMargins"] body { - padding: 0 calc(var(--RS__pageGutter) * var(--USER__pageMargins)) !important; +:root[style*="--USER__backgroundColor"] *{ + background-color:transparent !important; } -/* Readium CSS - Custom colors pref - - A submodule managing custom colors for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ +:root[style*="--USER__textColor"]{ + color:var(--USER__textColor) !important; +} -:root[style*="--USER__backgroundColor"] { - background-color: var(--USER__backgroundColor) !important; +:root[style*="--USER__textColor"] *:not(a){ + color:inherit !important; + background-color:transparent !important; + border-color:currentcolor !important; } -:root[style*="--USER__backgroundColor"] * { - background-color: transparent !important; +:root[style*="--USER__textColor"] svg text{ + fill:currentcolor !important; + stroke:none !important; } -:root[style*="--USER__textColor"] { - color: var(--USER__textColor) !important; +:root[style*="--USER__linkColor"] a:link, +:root[style*="--USER__linkColor"] a:link *{ + color:var(--USER__linkColor) !important; } -:root[style*="--USER__textColor"] *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(pre) { - color: inherit !important; +:root[style*="--USER__visitedColor"] a:visited, +:root[style*="--USER__visitedColor"] a:visited *{ + color:var(--USER__visitedColor) !important; } -/* Readium CSS - Font Family pref +:root[style*="--USER__selectionBackgroundColor"][style*="--USER__selectionTextColor"] ::-moz-selection{ + color:var(--USER__selectionTextColor) !important; + background-color:var(--USER__selectionBackgroundColor) !important; +} - A submodule managing font-family for user settings - Part of “User Overrides” class – “font override” flag required. +:root[style*="--USER__selectionBackgroundColor"][style*="--USER__selectionTextColor"] ::selection{ + color:var(--USER__selectionTextColor) !important; + background-color:var(--USER__selectionBackgroundColor) !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="--USER__colCount"]{ + -webkit-column-count:var(--USER__colCount); + -moz-column-count:var(--USER__colCount); + column-count:var(--USER__colCount); -:root[style*="readium-font-on"][style*="--USER__fontFamily"] { - font-family: var(--USER__fontFamily) !important; + --RS__colWidth:auto; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] body, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] p, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] li, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] div, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] dt, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] dd { - font-family: inherit !important; +:root[style*="--USER__colCount: 0"], +:root[style*="--USER__colCount:0"]{ + -webkit-column-count:1; + -moz-column-count:1; + column-count:1; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] i:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] i:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] em:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] em:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] cite:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] cite:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] b:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] b:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] strong:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] strong:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] span:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] span:not([xml\:lang]) { - font-family: inherit !important; +:root[style*="--USER__colCount: 0"], +:root[style*="--USER__colCount:0"], +:root[style*="--USER__colCount: 1"], +:root[style*="--USER__colCount:1"]{ + --RS__colWidth:100vw; } -/* Readium CSS - Font size pref +:root[style*="--USER__lineLength"] body{ + max-width:var(--USER__lineLength) !important; + } - A submodule managing font-size for user settings - Part of “User Overrides” class – no flag required. +:root[style*="readium-font-on"][style*="--USER__fontFamily"]{ + font-family:var(--USER__fontFamily) !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-font-on"][style*="--USER__fontFamily"] *{ + font-family:revert !important; +} -:root[style*="--USER__fontSize"] { - font-size: var(--USER__fontSize) !important; +:root:not([style*="readium-deprecatedFontSize-on"])[style*="--USER__fontSize"] body{ + zoom:var(--USER__fontSize) !important; } -/* Readium CSS - Line height pref +@supports not (zoom: 1){ - A submodule managing line-height for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. + :root[style*="--USER__fontSize"]{ + font-size:var(--USER__fontSize) !important; + } +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-deprecatedFontSize-on"][style*="--USER__fontSize"]{ + font-size:var(--USER__fontSize) !important; +} -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] { - line-height: var(--USER__lineHeight) !important; +:root[style*="--USER__lineHeight"]{ + line-height:var(--USER__lineHeight) !important; } -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] body, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] p, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] li, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] div { - line-height: inherit; +:root[style*="--USER__lineHeight"] body, +:root[style*="--USER__lineHeight"] p, +:root[style*="--USER__lineHeight"] li, +:root[style*="--USER__lineHeight"] div{ + line-height:inherit; } -/* Readium CSS - Para spacing pref +:root[style*="--USER__paraSpacing"] p{ + margin-top:var(--USER__paraSpacing) !important; + margin-bottom:var(--USER__paraSpacing) !important; +} - A submodule managing paragraphs’ top and bottom margins for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. +:root[style*="readium-font-on"][style*="--USER__fontWeight"] body{ + font-weight:var(--USER__fontWeight) !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-font-on"][style*="--USER__fontWeight"] b, +:root[style*="readium-font-on"][style*="--USER__fontWeight"] strong{ + font-weight:bolder; +} -:root[style*="readium-advanced-on"][style*="--USER__paraSpacing"] p { - margin-top: var(--USER__paraSpacing) !important; - margin-bottom: var(--USER__paraSpacing) !important; +:root[style*="readium-font-on"][style*="--USER__fontWidth"] body{ + font-stretch:var(--USER__fontWidth) !important; } -/* Readium CSS - Font size normalize +:root[style*="readium-font-on"][style*="--USER__fontOpticalSizing"] body{ + font-optical-sizing:var(--USER__fontOpticalSizing) !important; +} - A stylesheet to normalize font-size +:root[style*="--USER__letterSpacing"] h1, +:root[style*="--USER__letterSpacing"] h2, +:root[style*="--USER__letterSpacing"] h3, +:root[style*="--USER__letterSpacing"] h4, +:root[style*="--USER__letterSpacing"] h5, +:root[style*="--USER__letterSpacing"] h6, +:root[style*="--USER__letterSpacing"] p, +:root[style*="--USER__letterSpacing"] li, +:root[style*="--USER__letterSpacing"] div, +:root[style*="--USER__letterSpacing"] dt, +:root[style*="--USER__letterSpacing"] dd{ + letter-spacing:var(--USER__letterSpacing); + font-variant:none; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-noRuby-on"] body rt, +:root[style*="readium-noRuby-on"] body rp{ + display:none; +} -/* STYLES */ +:root[style*="readium-blend-on"] svg, +:root[style*="readium-blend-on"] img{ + background-color:transparent !important; + mix-blend-mode:multiply !important; +} -/* :root is used so that you can quickly add a class or attribute if you prefer e.g. `:root[data-rs-normalize]` */ +:root[style*="--USER__darkenImages"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) !important; + filter:brightness(var(--USER__darkenImages)) !important; +} -/* We create a default so that you don’t need to explicitly set one in the DOM. - Once the “Publisher’s styles” checkbox is unchecked, the normalize is applied automatically */ +:root[style*="readium-darken-on"] img{ + -webkit-filter:brightness(80%) !important; + filter:brightness(80%) !important; +} -:root[style*="readium-advanced-on"] { - --USER__typeScale: 1.2; /* This is the default type scale you’ll find in most publications */ +:root[style*="--USER__invertImages"] img{ + -webkit-filter:invert(var(--USER__invertImages)) !important; + filter:invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] p, -:root[style*="readium-advanced-on"] li, -:root[style*="readium-advanced-on"] div, -:root[style*="readium-advanced-on"] pre, -:root[style*="readium-advanced-on"] dd { - font-size: 1rem !important; +:root[style*="readium-invert-on"] img{ + -webkit-filter:invert(100%) !important; + filter:invert(100%) !important; } -:root[style*="readium-advanced-on"] h1 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.75rem !important; - font-size: calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="--USER__darkenImages"][style*="--USER__invertImages"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) invert(var(--USER__invertImages)) !important; + filter:brightness(var(--USER__darkenImages)) invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] h2 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.5rem !important; - font-size: calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-darken-on"][style*="--USER__invertImages"] img{ + -webkit-filter:brightness(80%) invert(var(--USER__invertImages)) !important; + filter:brightness(80%) invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] h3 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.25rem !important; - font-size: calc(1rem * var(--USER__typeScale)) !important; +:root[style*="--USER__darkenImages"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) invert(100%) !important; + filter:brightness(var(--USER__darkenImages)) invert(100%) !important; } -:root[style*="readium-advanced-on"] h4, -:root[style*="readium-advanced-on"] h5, -:root[style*="readium-advanced-on"] h6 { - font-size: 1rem !important; +:root[style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%) invert(100%) !important; + filter:brightness(80%) invert(100%) !important; } -:root[style*="readium-advanced-on"] small { - font-size: smaller !important; +:root[style*="--USER__invertGaiji"] img[class*="gaiji"]{ + -webkit-filter:invert(var(--USER__invertGaiji)) !important; + filter:invert(var(--USER__invertGaiji)) !important; } -:root[style*="readium-advanced-on"] sub, -:root[style*="readium-advanced-on"] sup { - font-size: 67.5% !important; +:root[style*="readium-invertGaiji-on"] img[class*="gaiji"]{ + -webkit-filter:invert(100%) !important; + filter:invert(100%) !important; } -/* The following styles kick in if you define the typeScale variable in the DOM. - No need to repeat declarations which don’t make use of the variable */ +:root[style*="readium-normalize-on"]{ + --USER__typeScale:1.2; +} -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h1 { - font-size: calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] p, +:root[style*="readium-normalize-on"] li, +:root[style*="readium-normalize-on"] div, +:root[style*="readium-normalize-on"] pre, +:root[style*="readium-normalize-on"] dd{ + font-size:1rem !important; } -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h2 { - font-size: calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] h1{ + font-size:1.75rem !important; + font-size:calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h3 { - font-size: calc(1rem * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] h2{ + font-size:1.5rem !important; + font-size:calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -/* Readium CSS - Default highlights +:root[style*="readium-normalize-on"] h3{ + font-size:1.25rem !important; + font-size:calc(1rem * var(--USER__typeScale)) !important; +} - A stylesheet for user highlights +:root[style*="readium-normalize-on"] h4, +:root[style*="readium-normalize-on"] h5, +:root[style*="readium-normalize-on"] h6{ + font-size:1rem !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-normalize-on"] small{ + font-size:smaller !important; +} -/* User Highlights */ +:root[style*="readium-normalize-on"] sub, +:root[style*="readium-normalize-on"] sup{ + font-size:67.5% !important; +} -.readiumCSS-yellow-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-yellow-highlight, -:root[style*="readium-night-on"] .readiumCSS-yellow-highlight { - background-color: rgba(255, 255, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h1{ + font-size:calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -.readiumCSS-green-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-green-highlight, -:root[style*="readium-night-on"] .readiumCSS-green-highlight { - background-color: rgba(0, 255, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h2{ + font-size:calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -.readiumCSS-orange-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-orange-highlight, -:root[style*="readium-night-on"] .readiumCSS-orange-highlight { - background-color: rgba(255, 165, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h3{ + font-size:calc(1rem * var(--USER__typeScale)) !important; } -.readiumCSS-pink-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-pink-highlight, -:root[style*="readium-night-on"] .readiumCSS-pink-highlight { - background-color: rgba(255, 105, 180, 0.5) !important; +:root[style*="readium-iPadOSPatch-on"] body{ + -webkit-text-size-adjust:none; } -/* Media overlays */ +:root[style*="readium-iPadOSPatch-on"] p, +:root[style*="readium-iPadOSPatch-on"] h1, +:root[style*="readium-iPadOSPatch-on"] h2, +:root[style*="readium-iPadOSPatch-on"] h3, +:root[style*="readium-iPadOSPatch-on"] h4, +:root[style*="readium-iPadOSPatch-on"] h5, +:root[style*="readium-iPadOSPatch-on"] h6, +:root[style*="readium-iPadOSPatch-on"] li, +:root[style*="readium-iPadOSPatch-on"] th, +:root[style*="readium-iPadOSPatch-on"] td, +:root[style*="readium-iPadOSPatch-on"] dt, +:root[style*="readium-iPadOSPatch-on"] dd, +:root[style*="readium-iPadOSPatch-on"] pre, +:root[style*="readium-iPadOSPatch-on"] address, +:root[style*="readium-iPadOSPatch-on"] details, +:root[style*="readium-iPadOSPatch-on"] summary, +:root[style*="readium-iPadOSPatch-on"] figcaption, +:root[style*="readium-iPadOSPatch-on"] div:not(:has(p, h1, h2, h3, h4, h5, h6, li, th, td, dt, dd, pre, address, aside, details, figcaption, summary)), +:root[style*="readium-iPadOSPatch-on"] aside:not(:has(p, h1, h2, h3, h4, h5, h6, li, th, td, dt, dd, pre, address, aside, details, figcaption, summary)){ + -webkit-text-zoom:reset; +} -.readiumCSS-mo-active-default { - color: black !important; - background-color: yellow !important; +:root[style*="readium-iPadOSPatch-on"] abbr, +:root[style*="readium-iPadOSPatch-on"] b, +:root[style*="readium-iPadOSPatch-on"] bdi, +:root[style*="readium-iPadOSPatch-on"] bdo, +:root[style*="readium-iPadOSPatch-on"] cite, +:root[style*="readium-iPadOSPatch-on"] code, +:root[style*="readium-iPadOSPatch-on"] dfn, +:root[style*="readium-iPadOSPatch-on"] em, +:root[style*="readium-iPadOSPatch-on"] i, +:root[style*="readium-iPadOSPatch-on"] kbd, +:root[style*="readium-iPadOSPatch-on"] mark, +:root[style*="readium-iPadOSPatch-on"] q, +:root[style*="readium-iPadOSPatch-on"] rp, +:root[style*="readium-iPadOSPatch-on"] rt, +:root[style*="readium-iPadOSPatch-on"] ruby, +:root[style*="readium-iPadOSPatch-on"] s, +:root[style*="readium-iPadOSPatch-on"] samp, +:root[style*="readium-iPadOSPatch-on"] small, +:root[style*="readium-iPadOSPatch-on"] span, +:root[style*="readium-iPadOSPatch-on"] strong, +:root[style*="readium-iPadOSPatch-on"] sub, +:root[style*="readium-iPadOSPatch-on"] sup, +:root[style*="readium-iPadOSPatch-on"] time, +:root[style*="readium-iPadOSPatch-on"] u, +:root[style*="readium-iPadOSPatch-on"] var{ + -webkit-text-zoom:normal; } -/*# sourceMappingURL=ReadiumCSS-after.css.map */ \ No newline at end of file + +:root[style*="readium-iPadOSPatch-on"] p:not(:has(b, cite, em, i, q, s, small, span, strong)):first-line{ + -webkit-text-zoom:normal; +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css index dcb79fffd..935895930 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css @@ -1,615 +1,411 @@ -/* Readium CSS - Config module - - A file allowing implementers to customize flags for reading modes, - user settings, etc. - - Repo: https://github.com/readium/readium-css */ - -/* Custom medias - Syntax: @custom-media --variable (prop: value) */ - -/* Responsive columns - The minimum width for which responsive columns (2 -> 1 and vice versa, - depending on the current font-size) must be enabled */ - -/* Mobile columns - The minimum and maximum width for mobile devices. - We’re forcing the landscape orientation by default, - and must still investigate large tablets (iPad Pro, Surface Pro 3, etc.). */ - -/* Custom selectors - Syntax: @custom-selector :--variable selector - The selectors you will use for flags/switches - You can alternatively use classes or custom data-* attributes */ - -/* User view = paged | scrolled */ - -/* Font-family override */ - -/* Advanced settings */ - -/* Reading Modes */ - -/* Filters (images) */ - -/* Accessibility normalization */ - -/* Accessibility font. You can add selectors, using “, ” as a separator, if you have multiple fonts */ - -/* Direction i.e. ltr and rtl */ - -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Base module - - A minimal stylesheet for all ebooks - - Repo: https://github.com/readium/readium-css */ - -/* Define viewport, HTML5-style */ - -@-ms-viewport { - width: device-width; +@-ms-viewport{ + width:device-width; } -@viewport { - width: device-width; - zoom: 1; +@viewport{ + width:device-width; + zoom:1; } -:root { - /* Default font-stacks */ - --RS__oldStyleTf: "Iowan Old Style", "Sitka Text", Palatino, "Book Antiqua", serif; - --RS__modernTf: Athelas, Constantia, Georgia, serif; - --RS__sansTf: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; - --RS__humanistTf: Seravek, Calibri, Roboto, Arial, sans-serif; - --RS__monospaceTf: "Andale Mono", Consolas, monospace; +:root{ - /* Config */ - --RS__baseFontFamily: var(--RS__oldStyleTf); + --RS__monospaceTf:ui-monospace, 'Andale Mono', 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace; - /* For square-ish fonts (CJK, Indic, etc.), we must apply some compensation in dynamic leading. Default is 1 i.e. no compensation */ - --RS__lineHeightCompensation: 1; + --RS__humanistTf:Seravek, Calibri, 'Gill Sans Nova', Roboto, Ubuntu, 'DejaVu Sans', source-sans-pro, sans-serif; - /* Dynamic leading based on typeface metrics + font-size setting */ - --RS__baseLineHeight: calc((1em + (2ex - 1ch) - ((1rem - 16px) * 0.1667)) * var(--RS__lineHeightCompensation)); -} + --RS__sansTf:-ui-sans-serif, -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI Variable', 'Segoe UI', Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Liberation Sans', Arial, sans-serif; + + --RS__modernTf:Athelas, Constantia, Charter, 'Bitstream Charter', Cambria, 'Georgia Pro', Georgia, serif; -/* Set default font for the html doc, so that it can be overridden by the authors’s stylesheet */ + --RS__oldStyleTf:'Iowan Old Style', Sitka, 'Sitka Text', Palatino, 'Book Antiqua', 'URW Palladio L', P052, serif; + --RS__baseFontFamily:var(--RS__oldStyleTf); + --RS__lineHeightCompensation:1; -html { - font-family: var(--RS__baseFontFamily); - /* Fallback line-height */ - line-height: 1.6; /* Fits a little bit better for all languages than 1.5 */ - line-height: var(--RS__baseLineHeight); - text-rendering: optimizeLegibility; + --RS__baseLineHeight:calc(1.5 * var(--RS__lineHeightCompensation)); } -/* 1.5 being too loose with larger font-sizes, we reset headings to normal (which value is 1.125–1.375 for our font-stacks) */ +html{ + font-family:var(--RS__baseFontFamily); + line-height:1.6; + line-height:var(--RS__baseLineHeight); + text-rendering:optimizelegibility; +} -h1, h2, h3 { - line-height: normal; +h1, h2, h3{ + line-height:normal; } :lang(ja), :lang(zh), -:lang(ko) { - word-wrap: break-word; - -webkit-line-break: strict; - -epub-line-break: strict; - line-break: strict; +:lang(ko){ + word-wrap:break-word; + -webkit-line-break:strict; + -epub-line-break:strict; + line-break:strict; } -/* Set default font for Math */ - -math { - font-family: "Latin Modern Math", "STIX Two Math", "XITS Math", "STIX Math", "Libertinus Math", "TeX Gyre Termes Math", "TeX Gyre Bonum Math", "TeX Gyre Schola", "DejaVu Math TeX Gyre", "TeX Gyre Pagella Math", "Asana Math", "Cambria Math", "Lucida Bright Math", "Minion Math", STIXGeneral, STIXSizeOneSym, Symbol, "Times New Roman", serif; +math{ + font-family:"Latin Modern Math", "STIX Two Math", "XITS Math", "STIX Math", "Libertinus Math", "TeX Gyre Termes Math", "TeX Gyre Bonum Math", "TeX Gyre Schola", "DejaVu Math TeX Gyre", "TeX Gyre Pagella Math", "Asana Math", "Cambria Math", "Lucida Bright Math", "Minion Math", STIXGeneral, STIXSizeOneSym, Symbol, "Times New Roman", serif; } -/* Language Overrides - That will only work if either html or body have a (xml:)lang attribute, not for inline overrides */ - -:lang(am) { - --RS__baseFontFamily: Kefa, Nyala, Roboto, Noto, "Noto Sans Ethiopic", serif; - --RS__lineHeightCompensation: 1.167; +:lang(am){ + --RS__baseFontFamily:kefa, nyala, roboto, noto, "Noto Sans Ethiopic", serif; + --RS__lineHeightCompensation:1.167; } -:lang(ar) { - --RS__baseFontFamily: "Geeza Pro", "Arabic Typesetting", Roboto, Noto, "Noto Naskh Arabic", "Times New Roman", serif; +:lang(ar){ + --RS__baseFontFamily:"Geeza Pro", "Arabic Typesetting", roboto, noto, "Noto Naskh Arabic", "Times New Roman", serif; } -:lang(bn) { - --RS__baseFontFamily: "Kohinoor Bangla", "Bangla Sangam MN", Vrinda, Roboto, Noto, "Noto Sans Bengali", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(bn){ + --RS__baseFontFamily:"Kohinoor Bangla", "Bangla Sangam MN", vrinda, roboto, noto, "Noto Sans Bengali", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(bo) { - --RS__baseFontFamily: Kailasa, "Microsoft Himalaya", Roboto, Noto, "Noto Sans Tibetan", sans-serif; +:lang(bo){ + --RS__baseFontFamily:kailasa, "Microsoft Himalaya", roboto, noto, "Noto Sans Tibetan", sans-serif; } -:lang(chr) { - --RS__baseFontFamily: "Plantagenet Cherokee", Roboto, Noto, "Noto Sans Cherokee"; - --RS__lineHeightCompensation: 1.167; +:lang(chr){ + --RS__baseFontFamily:"Plantagenet Cherokee", roboto, noto, "Noto Sans Cherokee"; + --RS__lineHeightCompensation:1.167; } -:lang(fa) { - --RS__baseFontFamily: "Geeza Pro", "Arabic Typesetting", Roboto, Noto, "Noto Naskh Arabic", "Times New Roman", serif; +:lang(fa){ + --RS__baseFontFamily:"Geeza Pro", "Arabic Typesetting", roboto, noto, "Noto Naskh Arabic", "Times New Roman", serif; } -:lang(gu) { - --RS__baseFontFamily: "Gujarati Sangam MN", "Nirmala UI", Shruti, Roboto, Noto, "Noto Sans Gujarati", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(gu){ + --RS__baseFontFamily:"Gujarati Sangam MN", "Nirmala UI", shruti, roboto, noto, "Noto Sans Gujarati", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(he) { - --RS__baseFontFamily: "New Peninim MT", "Arial Hebrew", Gisha, "Times New Roman", Roboto, Noto, "Noto Sans Hebrew" sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(he){ + --RS__baseFontFamily:"New Peninim MT", "Arial Hebrew", gisha, "Times New Roman", roboto, noto, "Noto Sans Hebrew" sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(hi) { - --RS__baseFontFamily: "Kohinoor Devanagari", "Devanagari Sangam MN", Kokila, "Nirmala UI", Roboto, Noto, "Noto Sans Devanagari", sans-serif; +:lang(hi){ + --RS__baseFontFamily:"Kohinoor Devanagari", "Devanagari Sangam MN", kokila, "Nirmala UI", roboto, noto, "Noto Sans Devanagari", sans-serif; - --RS__lineHeightCompensation: 1.1; + --RS__lineHeightCompensation:1.1; } -:lang(hy) { - --RS__baseFontFamily: Mshtakan, Sylfaen, Roboto, Noto, "Noto Serif Armenian", serif; +:lang(hy){ + --RS__baseFontFamily:mshtakan, sylfaen, roboto, noto, "Noto Serif Armenian", serif; } -:lang(iu) { - --RS__baseFontFamily: "Euphemia UCAS", Euphemia, Roboto, Noto, "Noto Sans Canadian Aboriginal", sans-serif; +:lang(iu){ + --RS__baseFontFamily:"Euphemia UCAS", euphemia, roboto, noto, "Noto Sans Canadian Aboriginal", sans-serif; } -:lang(ja) { - --RS__baseFontFamily: "游ゴシック体", YuGothic, "ヒラギノ丸ゴ", "Hiragino Sans", "Yu Gothic UI", "Meiryo UI", "MS Gothic", Roboto, Noto, "Noto Sans CJK JP", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; - - /* Extra variables for Japanese font-stacks as we may want to reuse them for user settings + default */ - --RS__serif-ja: "MS P明朝", "MS PMincho", "Hiragino Mincho Pro", "ヒラギノ明朝 Pro W3", "游明朝", "YuMincho", "MS 明朝", "MS Mincho", "Hiragino Mincho ProN", serif; - --RS__sans-serif-ja: "MS Pゴシック", "MS PGothic", "Hiragino Kaku Gothic Pro W3", "ヒラギノ角ゴ Pro W3", "Hiragino Sans GB", "ヒラギノ角ゴシック W3", "游ゴシック", "YuGothic", "MS ゴシック", "MS Gothic", "Hiragino Sans", sans-serif; - --RS__serif-ja-v: "MS 明朝", "MS Mincho", "Hiragino Mincho Pro", "ヒラギノ明朝 Pro W3", "游明朝", "YuMincho", "MS P明朝", "MS PMincho", "Hiragino Mincho ProN", serif; - --RS__sans-serif-ja-v: "MS ゴシック", "MS Gothic", "Hiragino Kaku Gothic Pro W3", "ヒラギノ角ゴ Pro W3", "Hiragino Sans GB", "ヒラギノ角ゴシック W3", "游ゴシック", "YuGothic", "MS Pゴシック", "MS PGothic", "Hiragino Sans", sans-serif; +:lang(ja){ + --RS__baseFontFamily:yugothic, "Hiragino Maru Gothic ProN", "Hiragino Sans", "Yu Gothic UI", "Meiryo UI", "MS Gothic", roboto, noto, "Noto Sans CJK JP", sans-serif; + --RS__lineHeightCompensation:1.167; + --RS__serif-ja:"Hiragino Mincho ProN", "Hiragino Mincho Pro", "YuMincho", "BIZ UDPMincho", "Yu Mincho", "MS P明朝", "MS PMincho", serif; + --RS__sans-serif-ja:"Hiragino Sans", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ W3", "YuGothic", "Yu Gothic Medium", "BIZ UDPGothic", "Yu Gothic", "MS Pゴシック", "MS PGothic", sans-serif; + --RS__serif-ja-v:"Hiragino Mincho ProN", "Hiragino Mincho Pro", "YuMincho", "BIZ UDMincho", "Yu Mincho", "MS明朝", "MS Mincho", serif; + --RS__sans-serif-ja-v:"Hiragino Sans", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ W3", "YuGothic", "Yu Gothic Medium", "BIZ UDGothic", "Yu Gothic", "MSゴシック", "MS Gothic", sans-serif; } -:lang(km) { - --RS__baseFontFamily: "Khmer Sangam MN", "Leelawadee UI", "Khmer UI", Roboto, Noto, "Noto Sans Khmer", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(km){ + --RS__baseFontFamily:"Khmer Sangam MN", "Leelawadee UI", "Khmer UI", roboto, noto, "Noto Sans Khmer", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(kn) { - --RS__baseFontFamily: "Kannada Sangam MN", "Nirmala UI", Tunga, Roboto, Noto, "Noto Sans Kannada", sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(kn){ + --RS__baseFontFamily:"Kannada Sangam MN", "Nirmala UI", tunga, roboto, noto, "Noto Sans Kannada", sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(ko) { - --RS__baseFontFamily: "Nanum Gothic", "Apple SD Gothic Neo", "Malgun Gothic", Roboto, Noto, "Noto Sans CJK KR", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(ko){ + --RS__baseFontFamily:"Nanum Gothic", "Apple SD Gothic Neo", "Malgun Gothic", roboto, noto, "Noto Sans CJK KR", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(lo) { - --RS__baseFontFamily: "Lao Sangam MN", "Leelawadee UI", "Lao UI", Roboto, Noto, "Noto Sans Lao", sans-serif; +:lang(lo){ + --RS__baseFontFamily:"Lao Sangam MN", "Leelawadee UI", "Lao UI", roboto, noto, "Noto Sans Lao", sans-serif; } -:lang(ml) { - --RS__baseFontFamily: "Malayalam Sangam MN", "Nirmala UI", Kartika, Roboto, Noto, "Noto Sans Malayalam", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(ml){ + --RS__baseFontFamily:"Malayalam Sangam MN", "Nirmala UI", kartika, roboto, noto, "Noto Sans Malayalam", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(or) { - --RS__baseFontFamily: "Oriya Sangam MN", "Nirmala UI", Kalinga, Roboto, Noto, "Noto Sans Oriya", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(or){ + --RS__baseFontFamily:"Oriya Sangam MN", "Nirmala UI", kalinga, roboto, noto, "Noto Sans Oriya", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(pa) { - --RS__baseFontFamily: "Gurmukhi MN", "Nirmala UI", Kartika, Roboto, Noto, "Noto Sans Gurmukhi", sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(pa){ + --RS__baseFontFamily:"Gurmukhi MN", "Nirmala UI", kartika, roboto, noto, "Noto Sans Gurmukhi", sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(si) { - --RS__baseFontFamily: "Sinhala Sangam MN", "Nirmala UI", "Iskoola Pota", Roboto, Noto, "Noto Sans Sinhala", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(si){ + --RS__baseFontFamily:"Sinhala Sangam MN", "Nirmala UI", "Iskoola Pota", roboto, noto, "Noto Sans Sinhala", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(ta) { - --RS__baseFontFamily: "Tamil Sangam MN", "Nirmala UI", Latha, Roboto, Noto, "Noto Sans Tamil", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(ta){ + --RS__baseFontFamily:"Tamil Sangam MN", "Nirmala UI", latha, roboto, noto, "Noto Sans Tamil", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(te) { - --RS__baseFontFamily: "Kohinoor Telugu", "Telugu Sangam MN", "Nirmala UI", Gautami, Roboto, Noto, "Noto Sans Telugu", sans-serif; +:lang(te){ + --RS__baseFontFamily:"Kohinoor Telugu", "Telugu Sangam MN", "Nirmala UI", gautami, roboto, noto, "Noto Sans Telugu", sans-serif; } -:lang(th) { - --RS__baseFontFamily: "Thonburi", "Leelawadee UI", "Cordia New", Roboto, Noto, "Noto Sans Thai", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(th){ + --RS__baseFontFamily:"Thonburi", "Leelawadee UI", "Cordia New", roboto, noto, "Noto Sans Thai", sans-serif; + --RS__lineHeightCompensation:1.067; } -/* The following will also work for zh-Hans */ - -:lang(zh) { - --RS__baseFontFamily: "方体", "PingFang SC", "黑体", "Heiti SC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK SC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh){ + --RS__baseFontFamily:"方体", "PingFang SC", "黑体", "Heiti SC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK SC", sans-serif; + --RS__lineHeightCompensation:1.167; } :lang(zh-Hant), -:lang(zh-TW) { - --RS__baseFontFamily: "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK TC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh-TW){ + --RS__baseFontFamily:"方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK TC", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(zh-HK) { - --RS__baseFontFamily: "方體", "PingFang HK", "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK TC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh-HK){ + --RS__baseFontFamily:"方體", "PingFang HK", "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK TC", sans-serif; + --RS__lineHeightCompensation:1.167; } -/* Readium CSS - Day/Default mode +:root{ - A preset theme for day mode, which is the default + --RS__selectionTextColor:inherit; - Repo: https://github.com/readium/readium-css */ + --RS__selectionBackgroundColor:#b4d8fe; -/* CONFIG */ + --RS__visitedColor:#551A8B; -:root { - --RS__backgroundColor: #FFFFFF; - --RS__textColor: #121212; + --RS__linkColor:#0000EE; - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; -} + --RS__textColor:#121212; -:root { - color: var(--RS__textColor) !important; - background-color: var(--RS__backgroundColor) !important; + --RS__backgroundColor:#FFFFFF; } -/* Note: Though `::selection` was present in drafts of CSS Selectors Level 3, it was removed during the Candidate Recommendation phase because its behavior was under-specified (especially with nested elements) and interoperability wasn’t achieved. Source: https://developer.mozilla.org/en-US/docs/Web/CSS/::selection */ - -::-moz-selection { - color: var(--RS__selectionTextColor); - background-color: var(--RS__selectionBackgroundColor); +:root{ + color:var(--RS__textColor) !important; + background-color:var(--RS__backgroundColor) !important; } -::selection { - color: var(--RS__selectionTextColor); - background-color: var(--RS__selectionBackgroundColor); +::-moz-selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } -/* @import "modules/ReadiumCSS-fonts.css"; */ - -/* Readium CSS - HTML5 SR Patch stylesheet - - A set of style to adjust HTML5 Suggested Rendering to paginated content - - Repo: https://github.com/readium/readium-css */ - -/* Fragmentation */ - -body { - widows: 2; - orphans: 2; +::selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } -figcaption, th, td { - widows: 1; - orphans: 1; +body{ + widows:2; + orphans:2; } -h2, -h3, -h4, -h5, -h6, -dt, -hr, -caption { - -webkit-column-break-after: avoid; - page-break-after: avoid; - break-after: avoid; +figcaption, th, td{ + widows:1; + orphans:1; } -h1, -h2, -h3, -h4, -h5, -h6, -dt, -figure, -tr { - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid; +h2, h3, h4, h5, h6, dt, +hr, caption{ + -webkit-column-break-after:avoid; + page-break-after:avoid; + break-after:avoid; } -/* Hyphenation */ - -body { - -webkit-hyphenate-character: "\002D"; - -moz-hyphenate-character: "\002D"; - -ms-hyphenate-character: "\002D"; - hyphenate-character: "\002D"; - -webkit-hyphenate-limit-lines: 3; - -ms-hyphenate-limit-lines: 3; - hyphenate-limit-lines: 3; +h1, h2, h3, h4, h5, h6, dt, +figure, tr{ + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; } -h1, -h2, -h3, -h4, -h5, -h6, -dt, -figcaption, -pre, -caption, -address, -center, -code, -var { - -ms-hyphens: none; - -moz-hyphens: none; - -webkit-hyphens: none; - -epub-hyphens: none; - hyphens: none; +body{ + -webkit-hyphenate-character:"\002D"; + -moz-hyphenate-character:"\002D"; + -ms-hyphenate-character:"\002D"; + hyphenate-character:"\002D"; + -webkit-hyphenate-limit-lines:3; + -ms-hyphenate-limit-lines:3; + hyphenate-limit-lines:3; } -/* OTF */ +h1, h2, h3, h4, h5, h6, dt, +figcaption, pre, caption, address, +center, code, var{ + -ms-hyphens:none; + -moz-hyphens:none; + -webkit-hyphens:none; + -epub-hyphens:none; + hyphens:none; +} -body { - font-variant-numeric: oldstyle-nums proportional-nums; +body{ + font-variant-numeric:oldstyle-nums proportional-nums; } :lang(ja) body, :lang(zh) body, -:lang(ko) body { - font-variant-numeric: lining-nums proportional-nums; +:lang(ko) body{ + font-variant-numeric:lining-nums proportional-nums; } -h1, h2, h3, h4, h5, h6, dt { - font-variant-numeric: lining-nums proportional-nums; +h1, h2, h3, h4, h5, h6, dt{ + font-variant-numeric:lining-nums proportional-nums; } -table { - font-variant-numeric: lining-nums tabular-nums; +table{ + font-variant-numeric:lining-nums tabular-nums; } -code, var { - font-variant-ligatures: none; - font-variant-numeric: lining-nums tabular-nums slashed-zero; +code, var{ + font-variant-ligatures:none; + font-variant-numeric:lining-nums tabular-nums slashed-zero; } -rt { - font-variant-east-asian: ruby; +rt{ + font-variant-east-asian:ruby; } -:lang(ar) { - font-variant-ligatures: common-ligatures; +:lang(ar){ + font-variant-ligatures:common-ligatures; } -:lang(ko) { - font-kerning: normal; +:lang(ko){ + font-kerning:normal; } -/* Night mode */ - -hr { - color: inherit; - border-color: currentColor; -} - -table, th, td { - border-color: currentColor; -} - -/* Horizontal Spacing */ - -figure, blockquote { - margin: 1em 5%; +hr{ + color:inherit; + border-color:currentcolor; } -/* - -:lang(ja) figure, :lang(ja) blockquote, -:lang(zh-Hant) figure, :lang(zh-Hant) blockquote, -:lang(zh-TW) figure, :lang(zh-TW) blockquote, -:lang(mn) figure, :lang(mn) blockquote { - margin: 5% 1em; -} - -*/ - -ul, ol { - padding-left: 5%; +table, th, td{ + border-color:currentcolor; } -/* - -:lang(ja) ul, :lang(ja) ol, -:lang(zh-Hant) ul, :lang(zh-Hant) ol, -:lang(zh-TW) ul, :lang(zh-TW) ol, -:lang(mn) ul, :lang(mn) ol { - padding-top: 5%; +figure, blockquote{ + margin:1em 5%; } -*/ - -dd { - margin-left: 5%; +ul, ol{ + padding-left:5%; } -/* - -:lang(ja) dd, -:lang(zh-Hant) dd, -:lang(zh-TW) dd, -:lang(mn) dd { - margin-top: 5%; +dd{ + margin-left:5%; } -*/ - -pre { - white-space: pre-wrap; - -ms-tab-size: 2; - -moz-tab-size: 2; - -webkit-tab-size: 2; - tab-size: 2; +pre{ + white-space:pre-wrap; + -ms-tab-size:2; + -moz-tab-size:2; + -webkit-tab-size:2; + tab-size:2; } -/* Normalization */ - -abbr[title], acronym[title] { - text-decoration: dotted underline; +abbr[title], acronym[title]{ + text-decoration:dotted underline; } -nobr wbr { - white-space: normal; +nobr wbr{ + white-space:normal; } -/* Make ruby text and parentheses non-selectable (TBC) */ - -ruby > rt, ruby > rp { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; +ruby > rt, ruby > rp{ + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; } -/* Internationalization */ - -*:lang(ja), -*:lang(zh), -*:lang(ko), -:lang(ja) cite, -:lang(ja) dfn, -:lang(ja) em, -:lang(ja) i, -:lang(zh) cite, -:lang(zh) dfn, -:lang(zh) em, -:lang(zh) i, -:lang(ko) cite, -:lang(ko) dfn, -:lang(ko) em, -:lang(ko) i { - font-style: normal; +*:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)), +*:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)), +*:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)), +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) cite, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) dfn, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) em, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) i, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) cite, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) dfn, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) em, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) i, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) cite, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) dfn, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) em, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) i{ + font-style:normal; } :lang(ja) a, :lang(zh) a, -:lang(ko) a { - text-decoration: none; -} - -/* Readium CSS - Safeguards module - - A set of styles to prevent common issues in pagination - - Repo: https://github.com/readium/readium-css */ - -/* Config */ - -/* We’ll be using an "RS__" prefix so that we can prevent collisions with authors’ CSS */ - -:root { - /* max-width for media, you can override that via JS if not compiled to static */ - --RS__maxMediaWidth: 100%; - - /* max-height for media, you can override that via JS if not compiled to static - Please consider figures might have a figcaption, which is why 95vh in the first place */ - --RS__maxMediaHeight: 95vh; - - /* value for medias’ box-sizing */ - --RS__boxSizingMedia: border-box; - - /* value for table’s box-sizing */ - --RS__boxSizingTable: border-box; +:lang(ko) a{ + text-decoration:none; } -/* Sanitize line-heights in webkit e.g. raised cap without a declared line-height - See effect by checking this demo in Safari: https://codepen.io/JayPanoz/pen/gRmzrE - Note: glyphs has to be reset to inline for CJK */ - -html { - -webkit-line-box-contain: block glyphs replaced; -} - -:lang(ja) { - -webkit-line-box-contain: block inline replaced; +:root{ + --RS__maxMediaWidth:100%; + --RS__maxMediaHeight:95vh; + --RS__boxSizingMedia:border-box; + --RS__boxSizingTable:border-box; } -/* Wrap long strings if larger than line-length */ - -a, h1, h2, h3, h4, h5, h6 { - word-wrap: break-word; +a, a span, span a, h1, h2, h3, h4, h5, h6{ + word-wrap:break-word; } -div { - max-width: var(--RS__maxMediaWidth); +div{ + max-width:var(--RS__maxMediaWidth); } -/* Size medias */ - -/* You can override CSS variables by re-defining it for all elements or a specific one */ - -img, svg, audio, video { +img, svg|svg, video{ + object-fit:contain; - /* Object-fit allows us to keep the correct aspect-ratio */ - object-fit: contain; - - width: auto; - height: auto; - - /* Some files don’t have max-width */ - max-width: var(--RS__maxMediaWidth); - - /* We’re setting a max-height, especially for covers */ - max-height: var(--RS__maxMediaHeight) !important; - /* We probably don’t need to use modern box-sizing as auto behaves like it */ - box-sizing: var(--RS__boxSizingMedia); - - /* For page-break, we must use those 3 - We can’t use a variable there, webkit seems to no support them for those properties */ - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid; + width:auto; + height:auto; + max-width:var(--RS__maxMediaWidth); + max-height:var(--RS__maxMediaHeight) !important; + box-sizing:var(--RS__boxSizingMedia); + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; } -/* Try preventing border being cut-off, webkit + blink have content-box by default */ +audio{ + max-width:100%; + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; + } -table { - max-width: var(--RS__maxMediaWidth); - box-sizing: var(--RS__boxSizingTable); -} -/*# sourceMappingURL=ReadiumCSS-before.css.map */ \ No newline at end of file +table{ + max-width:var(--RS__maxMediaWidth); + box-sizing:var(--RS__boxSizingTable); +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css index 37530d830..c1954250a 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css @@ -1,207 +1,170 @@ -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Default module for CJK horizontal writing - - A stylesheet for unstyled ebooks based on HTML5 Suggested Rendering - Note: works in combination with Base module - - Repo: https://github.com/readium/readium-css */ +:root{ -/* CONFIG */ + --RS__compFontFamily:var(--RS__baseFontFamily); + --RS__codeFontFamily:var(--RS__monospaceTf); -:root { - /* Extra variables for Japanese font-stacks: - • --RS__serif-ja; - • --RS__sans-serif-ja. + --RS__typeScale:1.125; + --RS__baseFontSize:87.5%; - They can be used instead of --RS__baseFontFamily and --RS__compFontFamily */ + --RS__flowSpacing:1.5rem; + --RS__paraSpacing:0; + --RS__paraIndent:1em; - --RS__compFontFamily: var(--RS__baseFontFamily); - --RS__codeFontFamily: var(--RS__monospaceTf); + --RS__linkColor:#0000EE; + --RS__visitedColor:#551A8B; - --RS__typeScale: 1.125; /* 1.067 | 1.125 | 1.2 | 1.25 | 1.333 | 1.414 | 1.5 | 1.618 */ - --RS__baseFontSize: 87.5%; - - --RS__flowSpacing: 1.5rem; - --RS__paraSpacing: 0; - --RS__paraIndent: 1em; - - --RS__linkColor: #0000EE; - --RS__visitedColor: #551A8B; - - --RS__primaryColor: ; - --RS__secondaryColor: ; + --RS__primaryColor:; + --RS__secondaryColor:; } -:root:lang(zh) { - --RS__paraIndent: 2em; +:root:lang(zh){ + --RS__paraIndent:2em; } -/* STYLES */ - -/* Typo */ - -:root { - quotes: "\201c" "\201d" "\2018" "\2019"; +:root{ + quotes:"\201c" "\201d" "\2018" "\2019"; } -body { - font-size: var(--RS__baseFontSize); - text-align: justify; - text-justify: inter-character; +body{ + font-size:var(--RS__baseFontSize); + text-align:justify; + text-justify:inter-character; } -h1, h2, h3, h4, h5, h6 { - font-family: var(--RS__baseFontFamily); - text-align: left; - text-align: start; +h1, h2, h3, h4, h5, h6{ + font-family:var(--RS__baseFontFamily); + text-align:left; + text-align:start; } -/* Flow content */ - -blockquote, -figure, -p, -pre, -aside, -footer, -form, -hr { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); +blockquote, figure, p, pre, +aside, footer, form, hr{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); } -p { - margin-top: var(--RS__paraSpacing); - margin-bottom: var(--RS__paraSpacing); - text-indent: var(--RS__paraIndent); +p{ + margin-top:var(--RS__paraSpacing); + margin-bottom:var(--RS__paraSpacing); + text-indent:var(--RS__paraIndent); } -pre { - font-family: var(--RS__codeFontFamily); +pre{ + font-family:var(--RS__codeFontFamily); } -/* Phrasing content */ - -code, kbd, samp, tt { - font-family: var(--RS__codeFontFamily); +code, kbd, samp, tt{ + font-family:var(--RS__codeFontFamily); } -sub, sup { - position: relative; - font-size: 67.5%; - line-height: 1; +sub, sup{ + position:relative; + font-size:67.5%; + line-height:1; } -sub { - bottom: -0.2ex; +sub{ + bottom:-0.2ex; } -sup { - bottom: 0; +sup{ + bottom:0; } -em { - -webkit-text-emphasis: dot; - -epub-text-emphasis: dot; - text-emphasis: dot; +em{ + -webkit-text-emphasis:dot; + -epub-text-emphasis:dot; + text-emphasis:dot; } -:link { - color: var(--RS__linkColor); +:link{ + color:var(--RS__linkColor); } -:visited { - color: var(--RS__visitedColor); +:visited{ + color:var(--RS__visitedColor); } -/* Headings */ - -h1 { - margin-top: calc(var(--RS__flowSpacing) * 2); - margin-bottom: calc(var(--RS__flowSpacing) * 2); - /* The following is base font size * typescale power of 3 */ - font-size: calc(((1em * var(--RS__typeScale)) * var(--RS__typeScale)) * var(--RS__typeScale)); - text-align: center; +h1{ + margin-top:calc(var(--RS__flowSpacing) * 2); + margin-bottom:calc(var(--RS__flowSpacing) * 2); + font-size:calc(((1em * var(--RS__typeScale)) * var(--RS__typeScale)) * var(--RS__typeScale)); + text-align:center; } -h2 { - margin-top: calc(var(--RS__flowSpacing) * 2); - margin-bottom: var(--RS__flowSpacing); - /* The following is base font size * typescale power of 2 */ - font-size: calc((1em * var(--RS__typeScale)) * var(--RS__typeScale)); - text-align: center; +h2{ + margin-top:calc(var(--RS__flowSpacing) * 2); + margin-bottom:var(--RS__flowSpacing); + font-size:calc((1em * var(--RS__typeScale)) * var(--RS__typeScale)); + text-align:center; } -h3 { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); - font-size: calc(1em * var(--RS__typeScale)); - text-align: center; +h3{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); + font-size:calc(1em * var(--RS__typeScale)); + text-align:center; } -h4 { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); - font-family: var(--RS__compFontFamily); - font-size: 1em; +h4{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); + font-family:var(--RS__compFontFamily); + font-size:1em; } -h5 { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); - font-family: var(--RS__compFontFamily); - font-size: smaller; +h5{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); + font-family:var(--RS__compFontFamily); + font-size:smaller; } -h6 { - margin-top: var(--RS__flowSpacing); - margin-bottom: 0; - font-family: var(--RS__compFontFamily); - font-size: smaller; - font-weight: normal; +h6{ + margin-top:var(--RS__flowSpacing); + margin-bottom:0; + font-family:var(--RS__compFontFamily); + font-size:smaller; + font-weight:normal; } -/* Lists */ - -dl, ol, ul { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); +dl, ol, ul{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); } -/* Table */ - -table { - margin: var(--RS__flowSpacing) 0; - border: 1px solid currentColor; - border-collapse: collapse; - empty-cells: show; +table{ + margin:var(--RS__flowSpacing) 0; + border:1px solid currentcolor; + border-collapse:collapse; + empty-cells:show; } -thead, tbody, tfoot, table > tr { - vertical-align: top; +thead, tbody, tfoot, table > tr{ + vertical-align:top; } -th { - text-align: left; +th{ + text-align:left; } -th, td { - padding: 4px; - border: 1px solid currentColor; -} -/*# sourceMappingURL=ReadiumCSS-default.css.map */ \ No newline at end of file +th, td{ + padding:4px; + border:1px solid currentcolor; +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css index d60d264dc..958fbca96 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css @@ -1,680 +1,551 @@ -/* Readium CSS - Config module - - A file allowing implementers to customize flags for reading modes, - user settings, etc. - - Repo: https://github.com/readium/readium-css */ - -/* Custom medias - Syntax: @custom-media --variable (prop: value) */ - -/* Responsive columns - The minimum width for which responsive columns (2 -> 1 and vice versa, - depending on the current font-size) must be enabled */ - -/* Mobile columns - The minimum and maximum width for mobile devices. - We’re forcing the landscape orientation by default, - and must still investigate large tablets (iPad Pro, Surface Pro 3, etc.). */ - -/* Custom selectors - Syntax: @custom-selector :--variable selector - The selectors you will use for flags/switches - You can alternatively use classes or custom data-* attributes */ - -/* User view = paged | scrolled */ - -/* Font-family override */ - -/* Advanced settings */ - -/* Reading Modes */ - -/* Filters (images) */ - -/* Accessibility normalization */ - -/* Accessibility font. You can add selectors, using “, ” as a separator, if you have multiple fonts */ - -/* Direction i.e. ltr and rtl */ - -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Pagination module for vertical writing - - A set of styles to paginate ePublications in “writing-mode: vertical-*” - - Repo: https://github.com/readium/readium-css */ - -/* Config */ - -/* We must simplify the pagination model for vertical writing, and can’t fake spreads. */ +:root{ -/* Default for smartphone portrait (small screens) */ + --RS__viewportWidth:100%; -:root { - /* The column will be the height of the web view/iframe */ - --RS__colWidth: 100vh; + --RS__pageGutter:0; - /* Since columns are laid out on the y-axis in vertical-*, we can only use 1 */ - --RS__colCount: 1; + --RS__defaultLineLength:40rem; - /* Gap between columns (in pixels so that it won’t resize with font-size) */ - --RS__colGap: 0; + --RS__colGap:0; - /* Optimal line-length (rem will take :root font-size into account, whatever the body’s font-size) */ - --RS__maxLineLength: 40rem; + --RS__colCount:1; - /* Default page vertical margins (in pixels so that it won’t resize with font-size) */ - --RS__pageGutter: 20px; /* See if colGap and pageGutter can be the same var */ + --RS__colWidth:100vw; } -/* Reset page margins for Forward compatibility */ - -@page { - margin: 0 !important; +@page{ + margin:0 !important; } -/* :root selector has same specificity as a class i.e. 0010 - We might have to change that to html / context - -> https://css-tricks.com/almanac/selectors/r/root/ */ - -:root { - - /* In case you use left position to scroll, can be removed if using transform: translateX() */ - position: relative; - - -webkit-column-width: var(--RS__colWidth); - -moz-column-width: var(--RS__colWidth); - column-width: var(--RS__colWidth); - - /* Init pagination */ - /* TODO: document columns’ logic cos it might feel weird at first */ - -webkit-column-count: var(--RS__colCount); - -moz-column-count: var(--RS__colCount); - column-count: var(--RS__colCount); - - -webkit-column-gap: var(--RS__colGap); - -moz-column-gap: var(--RS__colGap); - column-gap: var(--RS__colGap); - - /* Default is balance and we want columns to be filled entirely (100vh) */ - -moz-column-fill: auto; - column-fill: auto; - width: 100%; - height: 100vh; - max-width: 100%; - max-height: 100vh; - min-width: 100%; - min-height: 100vh; - padding: 0 var(--RS__pageGutter) !important; - margin: 0 !important; +:root{ + position:relative; - /* Column size will depend on this if we want to make it responsive */ - font-size: 100% !important; + -webkit-column-width:var(--RS__colWidth); + -moz-column-width:var(--RS__colWidth); + column-width:var(--RS__colWidth); + -webkit-column-count:var(--RS__colCount); + -moz-column-count:var(--RS__colCount); + column-count:var(--RS__colCount); - -webkit-text-size-adjust: 100%; + -webkit-column-gap:var(--RS__colGap); + -moz-column-gap:var(--RS__colGap); + column-gap:var(--RS__colGap); + -moz-column-fill:auto; + column-fill:auto; + width:100%; + height:100vh; + max-width:100%; + max-height:100vh; + min-width:100%; + min-height:100vh; + padding:0 !important; + margin:0 !important; + font-size:1rem !important; + box-sizing:border-box; - /* Switch to newer box model (not inherited by authors’ styles) */ - box-sizing: border-box; - - hanging-punctuation: last allow-end; - - /* Fix bug for older Chrome */ - -webkit-perspective: 1; - /* Prevents options pop-up when long tap in webkit */ - -webkit-touch-callout: none; - - /* The reason why we don’t force -webkit-column-axis is that it switches the column-box model to a paged overflow model. - In other words, columns become useless, the sizing of the :root itself will be used for pagination */ - - /* Ensure the correct writing-mode is used */ - -ms-writing-mode: tb-rl; - -webkit-writing-mode: vertical-rl; - writing-mode: vertical-rl; + hanging-punctuation:last allow-end; + -webkit-touch-callout:none; + -ms-writing-mode:tb-rl; + -webkit-writing-mode:vertical-rl; + writing-mode:vertical-rl; } -:root:lang(mn-Mong) { - /* Ensure the correct writing-mode is used for mongolian if vertical */ - -ms-writing-mode: tb; - -webkit-writing-mode: vertical-lr; - writing-mode: vertical-lr; +:root:lang(mn-Mong){ + -ms-writing-mode:tb; + -webkit-writing-mode:vertical-lr; + writing-mode:vertical-lr; } -body { - /* overflow: hidden; bugfix: contents won’t paginate in Firefox and one sample in Safari */ - width: 100%; - - /* Limit line-length but we have to reset when 2 columns and control the viewport. - By using max-width + margin auto, margins will shrink when font-size increases, - which is what would be expected in terms of typography. */ - max-height: var(--RS__maxLineLength) !important; - padding: var(--RS__pageGutter) 0 !important; - margin: auto 0 !important; - - /* We need a minimum padding on body so that descandants/ascendants in italic/script are not cut-off. - Drawback: we have to use border-box so that it doesn’t screw the box model, - which means it impacts colWidth and max-width */ - box-sizing: border-box; +body{ + width:100%; + max-height:var(--RS__defaultLineLength) !important; + padding:var(--RS__pageGutter) 0 !important; + margin:auto 0 !important; + overflow:hidden; + box-sizing:border-box; } -/* We’ll now redefine margins and columns depending on the minimum width available - The goal is having the simplest model possible and avoid targeting devices */ - -/* Smartphone landscape */ +@supports (overflow: clip){ -@media screen and (min-width: 35em) { - :root { - --RS__pageGutter: 30px; + :root{ + overflow:clip; } -} - -/* Tablet portrait */ -@media screen and (min-width: 45em) { - :root { - --RS__pageGutter: 40px; + body{ + overflow:clip; + overflow-clip-margin:content-box; } } -/* Desktop small + phablet + tablet landscape */ - -@media screen and (min-width: 60em) { - :root { - --RS__pageGutter: 50px; - } +:root[style*="readium-scroll-on"], +:root[style*="readium-noVerticalPagination-on"]{ + -webkit-columns:auto auto !important; + -moz-columns:auto auto !important; + columns:auto auto !important; + width:auto !important; + max-width:none !important; + max-height:100vh !important; + min-width:0 !important; } -/* Desktop + tablet large */ - -/* We get the previous settings, we just change the margins */ - -@media screen and (min-width: 75em) { - :root { - --RS__pageGutter: 60px; - } +:root[style*="readium-scroll-on"] body, +:root[style*="readium-noVerticalPagination-on"] body{ + max-width:var(--RS__defaultLineLength) !important; } -/* At this point (80em or so), constraining line length must be done at the web view/iframe level, or by limiting the size of :root itself */ +@supports (overflow: clip){ -/* Readium CSS - Scroll module for vertical-writing - - A set of styles to scroll ePublications in “writing-mode: vertical-*” - This module overrides pagination - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-scroll-on"] { - - /* Reset columns, auto + auto = columns can’t be created */ - /* There is a weird gap in Safari/Webkit, as if overflow paged-x… */ - -webkit-columns: auto auto !important; - -moz-columns: auto auto !important; - columns: auto auto !important; - width: auto !important; - max-width: none !important; - max-height: 100vh !important; - /* Reset html size so that the user can scroll */ - min-width: 0 !important; -} - -/* Make sure line-length is limited in all configs */ + :root[style*="readium-scroll-on"]{ + overflow:auto; + } -:root[style*="readium-scroll-on"] body { - --RS__maxLineLength: 40.01rem !important; /* Fixes fragmentation update issues in Webkit i.e. value must be slightly different than the one for pagination */ + :root[style*="readium-scroll-on"] body{ + overflow:clip; + } } -/* Scroll mode horizontal */ - -/* Do we add a top/bottom margin for body in vertical scroll or not? */ - -/* Readium CSS - Night mode +:root[style*="readium-night-on"]{ - A preset theme for night mode + --RS__selectionTextColor:inherit; - Repo: https://github.com/readium/readium-css */ + --RS__selectionBackgroundColor:#b4d8fe; -/* CONFIG */ + --RS__visitedColor:#0099E5; -/* [style*="--USER__appearance"] can be used to increase specificity but performance hit */ + --RS__linkColor:#63caff; -:root[style*="readium-night-on"] { - --RS__backgroundColor: #000000; - --RS__textColor: #FEFEFE; + --RS__textColor:#FEFEFE; - --RS__linkColor: #63caff; - --RS__visitedColor: #0099E5; - - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; + --RS__backgroundColor:#000000; } -/* we don’t need to redeclare bg-color and color for :root since we will inherit and update from day/default mode */ - -:root[style*="readium-night-on"] *:not(a) { - color: inherit !important; - background-color: transparent !important; - border-color: currentColor !important; +:root[style*="readium-night-on"] *:not(a){ + color:inherit !important; + background-color:transparent !important; + border-color:currentcolor !important; } -:root[style*="readium-night-on"] svg text { - fill: currentColor !important; - stroke: none !important; +:root[style*="readium-night-on"] svg text{ + fill:currentcolor !important; + stroke:none !important; } :root[style*="readium-night-on"] a:link, -:root[style*="readium-night-on"] a:link * { - color: var(--RS__linkColor) !important; +:root[style*="readium-night-on"] a:link *{ + color:var(--RS__linkColor) !important; } :root[style*="readium-night-on"] a:visited, -:root[style*="readium-night-on"] a:visited * { - color: var(--RS__visitedColor) !important; +:root[style*="readium-night-on"] a:visited *{ + color:var(--RS__visitedColor) !important; } -/* For epub:type, in case the contents are served as text/html, namespaces won’t work hence why we’re using both syntax */ - :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, -:root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: invert(100%); - filter: invert(100%); +:root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:invert(100%); + filter:invert(100%); } -/* Darken all images on user’s demand */ +:root[style*="readium-sepia-on"]{ -:root[style*="readium-night-on"][style*="readium-darken-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); -} - -/* Invert all images on user’s demand */ - -:root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: invert(100%); - filter: invert(100%); -} - -/* Darken and invert on user’s demand */ - -:root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%) invert(100%); - filter: brightness(80%) invert(100%); -} + --RS__selectionTextColor:inherit; -/* Readium CSS - Sepia mode + --RS__selectionBackgroundColor:#b4d8fe; - A preset theme for sepia mode + --RS__visitedColor:#551A8B; - Repo: https://github.com/readium/readium-css */ + --RS__linkColor:#0000EE; -/* CONFIG */ + --RS__textColor:#121212; -:root[style*="readium-sepia-on"] { - --RS__backgroundColor: #faf4e8; - --RS__textColor: #121212; - - --RS__linkColor: #0000EE; - --RS__visitedColor: #551A8B; - - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; - - --RS__maxLineLength: 40.01rem; /* Forcing a reflow in Blink/Webkit so that blend mode can work */ + --RS__backgroundColor:#faf4e8; } -/* we don’t need to redeclare bg-color and color for :root since we will inherit and update from day/default mode */ - -:root[style*="readium-sepia-on"] *:not(a) { - color: inherit !important; - background-color: transparent !important; +:root[style*="readium-sepia-on"] *:not(a){ + color:inherit !important; + background-color:transparent !important; } :root[style*="readium-sepia-on"] a:link, -:root[style*="readium-sepia-on"] a:link * { - color: var(--RS__linkColor); +:root[style*="readium-sepia-on"] a:link *{ + color:var(--RS__linkColor); } :root[style*="readium-sepia-on"] a:visited, -:root[style*="readium-sepia-on"] a:visited * { - color: var(--RS__visitedColor); +:root[style*="readium-sepia-on"] a:visited *{ + color:var(--RS__visitedColor); } -:root[style*="readium-sepia-on"] svg, -:root[style*="readium-sepia-on"] img { - /* Make sure the proper bg-color is used for the blend mode */ - background-color: transparent !important; - mix-blend-mode: multiply; -} - -/* Readium CSS - OS Accessibility Modes - - A stylesheet to deal with OS accessibility settings +@media screen and (-ms-high-contrast: active){ - Repo: https://github.com/readium/readium-css */ - -/* Windows high contrast colors are mapped to CSS system color keywords - See http://www.gwhitworth.com/blog/2017/04/how-to-use-ms-high-contrast */ - -@media screen and (-ms-high-contrast: active) { - :root { - color: windowText !important; - background-color: window !important; + :root{ + color:windowText !important; + background-color:window !important; } - /* The following selectors are super funky but it makes sure everything is inherited, this is indeed critical for this mode */ :root :not(#\#):not(#\#):not(#\#), :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) - :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) { - color: inherit !important; - background-color: inherit !important; + :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#){ + color:inherit !important; + background-color:inherit !important; } - .readiumCSS-mo-active-default { - color: highlightText !important; - background-color: highlight !important; + .readiumCSS-mo-active-default{ + color:highlightText !important; + background-color:highlight !important; } - - /* For links, hyperlink keyword is automatically set */ - - /* Should we also set user highlights? */ } -@media screen and (-ms-high-contrast: white-on-black) { +@media screen and (-ms-high-contrast: white-on-black){ + :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, - :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: none !important; - filter: none !important; + :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: none !important; - filter: none !important; + + :root[style*="readium-night-on"][style*="readium-invert-on"] img{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); + + :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%); + filter:brightness(80%); } } -/* Will be true on recent versions of iOS and MacOS if inverted setting enabled by the user */ +@media screen and (inverted-colors){ -@media screen and (inverted-colors) { :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, - :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: none !important; - filter: none !important; + :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: none !important; - filter: none !important; + + :root[style*="readium-night-on"][style*="readium-invert-on"] img{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); + + :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%); + filter:brightness(80%); } } -@media screen and (monochrome) { - /* Grayscale (Implemented in Safari, what about eInk?) */ - /* Must deal with anything color (contrast) so must be managed at the night/sepia/theme level :( */ +@media screen and (monochrome){ } -@media screen and (prefers-reduced-motion) { - /* If reduced motion is set on MacOS, in case we have animation/transition */ +@media screen and (prefers-reduced-motion){ } -/* Readium CSS - Page margins pref - - A submodule managing page margins for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -/* Page Margins: the user margin is a factor of the page gutter e.g. 0.5, 0.75, 1, 1.25, 1.5, etc. */ - -:root[style*="--USER__pageMargins"] body { - padding: calc(var(--RS__pageGutter) * var(--USER__pageMargins)) 0 !important; +:root[style*="--USER__backgroundColor"]{ + background-color:var(--USER__backgroundColor) !important; } -/* Readium CSS - Custom colors pref - - A submodule managing custom colors for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="--USER__backgroundColor"] { - background-color: var(--USER__backgroundColor) !important; +:root[style*="--USER__backgroundColor"] *{ + background-color:transparent !important; } -:root[style*="--USER__backgroundColor"] * { - background-color: transparent !important; +:root[style*="--USER__textColor"]{ + color:var(--USER__textColor) !important; } -:root[style*="--USER__textColor"] { - color: var(--USER__textColor) !important; +:root[style*="--USER__textColor"] *:not(a){ + color:inherit !important; + background-color:transparent !important; + border-color:currentcolor !important; } -:root[style*="--USER__textColor"] *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(pre) { - color: inherit !important; +:root[style*="--USER__textColor"] svg text{ + fill:currentcolor !important; + stroke:none !important; } -/* Readium CSS - Font Family pref - - A submodule managing font-family for user settings - Part of “User Overrides” class – “font override” flag required. - - Repo: https://github.com/readium/readium-css */ +:root[style*="--USER__linkColor"] a:link, +:root[style*="--USER__linkColor"] a:link *{ + color:var(--USER__linkColor) !important; +} -:root[style*="readium-font-on"][style*="--USER__fontFamily"] { - font-family: var(--USER__fontFamily) !important; +:root[style*="--USER__visitedColor"] a:visited, +:root[style*="--USER__visitedColor"] a:visited *{ + color:var(--USER__visitedColor) !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] body, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] p, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] li, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] div, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] dt, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] dd { - font-family: inherit !important; +:root[style*="--USER__selectionBackgroundColor"][style*="--USER__selectionTextColor"] ::-moz-selection{ + color:var(--USER__selectionTextColor) !important; + background-color:var(--USER__selectionBackgroundColor) !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] i:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] i:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] em:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] em:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] cite:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] cite:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] b:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] b:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] strong:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] strong:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] span:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] span:not([xml\:lang]) { - font-family: inherit !important; +:root[style*="--USER__selectionBackgroundColor"][style*="--USER__selectionTextColor"] ::selection{ + color:var(--USER__selectionTextColor) !important; + background-color:var(--USER__selectionBackgroundColor) !important; } -/* Readium CSS - Font size pref +:root[style*="--USER__lineLength"] body{ + max-height:var(--USER__lineLength) !important; + } - A submodule managing font-size for user settings - Part of “User Overrides” class – no flag required. +:root[style*="readium-font-on"][style*="--USER__fontFamily"]{ + font-family:var(--USER__fontFamily) !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-font-on"][style*="--USER__fontFamily"] *{ + font-family:revert !important; +} -:root[style*="--USER__fontSize"] { - font-size: var(--USER__fontSize) !important; +:root:not([style*="readium-deprecatedFontSize-on"])[style*="--USER__fontSize"] body{ + zoom:var(--USER__fontSize) !important; } -/* Readium CSS - Line height pref +@supports not (zoom: 1){ - A submodule managing line-height for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. + :root[style*="--USER__fontSize"]{ + font-size:var(--USER__fontSize) !important; + } +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-deprecatedFontSize-on"][style*="--USER__fontSize"]{ + font-size:var(--USER__fontSize) !important; +} -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] { - line-height: var(--USER__lineHeight) !important; +:root[style*="--USER__lineHeight"]{ + line-height:var(--USER__lineHeight) !important; } -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] body, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] p, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] li, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] div { - line-height: inherit; +:root[style*="--USER__lineHeight"] body, +:root[style*="--USER__lineHeight"] p, +:root[style*="--USER__lineHeight"] li, +:root[style*="--USER__lineHeight"] div{ + line-height:inherit; } -/* Readium CSS - Para spacing pref +:root[style*="--USER__paraSpacing"] p{ + margin-right:var(--USER__paraSpacing) !important; + margin-left:var(--USER__paraSpacing) !important; +} - A submodule managing paragraphs’ top and bottom margins for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. +:root[style*="readium-font-on"][style*="--USER__fontWeight"] body{ + font-weight:var(--USER__fontWeight) !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-font-on"][style*="--USER__fontWeight"] b, +:root[style*="readium-font-on"][style*="--USER__fontWeight"] strong{ + font-weight:bolder; +} -:root[style*="readium-advanced-on"][style*="--USER__paraSpacing"] p { - margin-right: var(--USER__paraSpacing) !important; - margin-left: var(--USER__paraSpacing) !important; +:root[style*="readium-font-on"][style*="--USER__fontWidth"] body{ + font-stretch:var(--USER__fontWidth) !important; } -/* Readium CSS - Font size normalize +:root[style*="readium-font-on"][style*="--USER__fontOpticalSizing"] body{ + font-optical-sizing:var(--USER__fontOpticalSizing) !important; +} - A stylesheet to normalize font-size +:root[style*="--USER__letterSpacing"] h1, +:root[style*="--USER__letterSpacing"] h2, +:root[style*="--USER__letterSpacing"] h3, +:root[style*="--USER__letterSpacing"] h4, +:root[style*="--USER__letterSpacing"] h5, +:root[style*="--USER__letterSpacing"] h6, +:root[style*="--USER__letterSpacing"] p, +:root[style*="--USER__letterSpacing"] li, +:root[style*="--USER__letterSpacing"] div, +:root[style*="--USER__letterSpacing"] dt, +:root[style*="--USER__letterSpacing"] dd{ + letter-spacing:var(--USER__letterSpacing); + font-variant:none; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-noRuby-on"] body rt, +:root[style*="readium-noRuby-on"] body rp{ + display:none; +} -/* STYLES */ +:root[style*="readium-blend-on"] svg, +:root[style*="readium-blend-on"] img{ + background-color:transparent !important; + mix-blend-mode:multiply !important; +} -/* :root is used so that you can quickly add a class or attribute if you prefer e.g. `:root[data-rs-normalize]` */ +:root[style*="--USER__darkenImages"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) !important; + filter:brightness(var(--USER__darkenImages)) !important; +} -/* We create a default so that you don’t need to explicitly set one in the DOM. - Once the “Publisher’s styles” checkbox is unchecked, the normalize is applied automatically */ +:root[style*="readium-darken-on"] img{ + -webkit-filter:brightness(80%) !important; + filter:brightness(80%) !important; +} -:root[style*="readium-advanced-on"] { - --USER__typeScale: 1.2; /* This is the default type scale you’ll find in most publications */ +:root[style*="--USER__invertImages"] img{ + -webkit-filter:invert(var(--USER__invertImages)) !important; + filter:invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] p, -:root[style*="readium-advanced-on"] li, -:root[style*="readium-advanced-on"] div, -:root[style*="readium-advanced-on"] pre, -:root[style*="readium-advanced-on"] dd { - font-size: 1rem !important; +:root[style*="readium-invert-on"] img{ + -webkit-filter:invert(100%) !important; + filter:invert(100%) !important; } -:root[style*="readium-advanced-on"] h1 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.75rem !important; - font-size: calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="--USER__darkenImages"][style*="--USER__invertImages"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) invert(var(--USER__invertImages)) !important; + filter:brightness(var(--USER__darkenImages)) invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] h2 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.5rem !important; - font-size: calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-darken-on"][style*="--USER__invertImages"] img{ + -webkit-filter:brightness(80%) invert(var(--USER__invertImages)) !important; + filter:brightness(80%) invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] h3 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.25rem !important; - font-size: calc(1rem * var(--USER__typeScale)) !important; +:root[style*="--USER__darkenImages"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) invert(100%) !important; + filter:brightness(var(--USER__darkenImages)) invert(100%) !important; } -:root[style*="readium-advanced-on"] h4, -:root[style*="readium-advanced-on"] h5, -:root[style*="readium-advanced-on"] h6 { - font-size: 1rem !important; +:root[style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%) invert(100%) !important; + filter:brightness(80%) invert(100%) !important; } -:root[style*="readium-advanced-on"] small { - font-size: smaller !important; +:root[style*="--USER__invertGaiji"] img[class*="gaiji"]{ + -webkit-filter:invert(var(--USER__invertGaiji)) !important; + filter:invert(var(--USER__invertGaiji)) !important; } -:root[style*="readium-advanced-on"] sub, -:root[style*="readium-advanced-on"] sup { - font-size: 67.5% !important; +:root[style*="readium-invertGaiji-on"] img[class*="gaiji"]{ + -webkit-filter:invert(100%) !important; + filter:invert(100%) !important; } -/* The following styles kick in if you define the typeScale variable in the DOM. - No need to repeat declarations which don’t make use of the variable */ +:root[style*="readium-normalize-on"]{ + --USER__typeScale:1.2; +} -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h1 { - font-size: calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] p, +:root[style*="readium-normalize-on"] li, +:root[style*="readium-normalize-on"] div, +:root[style*="readium-normalize-on"] pre, +:root[style*="readium-normalize-on"] dd{ + font-size:1rem !important; } -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h2 { - font-size: calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] h1{ + font-size:1.75rem !important; + font-size:calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h3 { - font-size: calc(1rem * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] h2{ + font-size:1.5rem !important; + font-size:calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -/* Readium CSS - Default highlights +:root[style*="readium-normalize-on"] h3{ + font-size:1.25rem !important; + font-size:calc(1rem * var(--USER__typeScale)) !important; +} - A stylesheet for user highlights +:root[style*="readium-normalize-on"] h4, +:root[style*="readium-normalize-on"] h5, +:root[style*="readium-normalize-on"] h6{ + font-size:1rem !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-normalize-on"] small{ + font-size:smaller !important; +} -/* User Highlights */ +:root[style*="readium-normalize-on"] sub, +:root[style*="readium-normalize-on"] sup{ + font-size:67.5% !important; +} -.readiumCSS-yellow-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-yellow-highlight, -:root[style*="readium-night-on"] .readiumCSS-yellow-highlight { - background-color: rgba(255, 255, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h1{ + font-size:calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -.readiumCSS-green-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-green-highlight, -:root[style*="readium-night-on"] .readiumCSS-green-highlight { - background-color: rgba(0, 255, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h2{ + font-size:calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -.readiumCSS-orange-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-orange-highlight, -:root[style*="readium-night-on"] .readiumCSS-orange-highlight { - background-color: rgba(255, 165, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h3{ + font-size:calc(1rem * var(--USER__typeScale)) !important; } -.readiumCSS-pink-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-pink-highlight, -:root[style*="readium-night-on"] .readiumCSS-pink-highlight { - background-color: rgba(255, 105, 180, 0.5) !important; +:root[style*="readium-iPadOSPatch-on"] body{ + -webkit-text-size-adjust:none; } -/* Media overlays */ +:root[style*="readium-iPadOSPatch-on"] p, +:root[style*="readium-iPadOSPatch-on"] h1, +:root[style*="readium-iPadOSPatch-on"] h2, +:root[style*="readium-iPadOSPatch-on"] h3, +:root[style*="readium-iPadOSPatch-on"] h4, +:root[style*="readium-iPadOSPatch-on"] h5, +:root[style*="readium-iPadOSPatch-on"] h6, +:root[style*="readium-iPadOSPatch-on"] li, +:root[style*="readium-iPadOSPatch-on"] th, +:root[style*="readium-iPadOSPatch-on"] td, +:root[style*="readium-iPadOSPatch-on"] dt, +:root[style*="readium-iPadOSPatch-on"] dd, +:root[style*="readium-iPadOSPatch-on"] pre, +:root[style*="readium-iPadOSPatch-on"] address, +:root[style*="readium-iPadOSPatch-on"] details, +:root[style*="readium-iPadOSPatch-on"] summary, +:root[style*="readium-iPadOSPatch-on"] figcaption, +:root[style*="readium-iPadOSPatch-on"] div:not(:has(p, h1, h2, h3, h4, h5, h6, li, th, td, dt, dd, pre, address, aside, details, figcaption, summary)), +:root[style*="readium-iPadOSPatch-on"] aside:not(:has(p, h1, h2, h3, h4, h5, h6, li, th, td, dt, dd, pre, address, aside, details, figcaption, summary)){ + -webkit-text-zoom:reset; +} -.readiumCSS-mo-active-default { - color: black !important; - background-color: yellow !important; +:root[style*="readium-iPadOSPatch-on"] abbr, +:root[style*="readium-iPadOSPatch-on"] b, +:root[style*="readium-iPadOSPatch-on"] bdi, +:root[style*="readium-iPadOSPatch-on"] bdo, +:root[style*="readium-iPadOSPatch-on"] cite, +:root[style*="readium-iPadOSPatch-on"] code, +:root[style*="readium-iPadOSPatch-on"] dfn, +:root[style*="readium-iPadOSPatch-on"] em, +:root[style*="readium-iPadOSPatch-on"] i, +:root[style*="readium-iPadOSPatch-on"] kbd, +:root[style*="readium-iPadOSPatch-on"] mark, +:root[style*="readium-iPadOSPatch-on"] q, +:root[style*="readium-iPadOSPatch-on"] rp, +:root[style*="readium-iPadOSPatch-on"] rt, +:root[style*="readium-iPadOSPatch-on"] ruby, +:root[style*="readium-iPadOSPatch-on"] s, +:root[style*="readium-iPadOSPatch-on"] samp, +:root[style*="readium-iPadOSPatch-on"] small, +:root[style*="readium-iPadOSPatch-on"] span, +:root[style*="readium-iPadOSPatch-on"] strong, +:root[style*="readium-iPadOSPatch-on"] sub, +:root[style*="readium-iPadOSPatch-on"] sup, +:root[style*="readium-iPadOSPatch-on"] time, +:root[style*="readium-iPadOSPatch-on"] u, +:root[style*="readium-iPadOSPatch-on"] var{ + -webkit-text-zoom:normal; } -/*# sourceMappingURL=ReadiumCSS-after.css.map */ \ No newline at end of file + +:root[style*="readium-iPadOSPatch-on"] p:not(:has(b, cite, em, i, q, s, small, span, strong)):first-line{ + -webkit-text-zoom:normal; +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css index 2c8d03df4..0072752b1 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css @@ -1,614 +1,411 @@ -/* Readium CSS - Config module - - A file allowing implementers to customize flags for reading modes, - user settings, etc. - - Repo: https://github.com/readium/readium-css */ - -/* Custom medias - Syntax: @custom-media --variable (prop: value) */ - -/* Responsive columns - The minimum width for which responsive columns (2 -> 1 and vice versa, - depending on the current font-size) must be enabled */ - -/* Mobile columns - The minimum and maximum width for mobile devices. - We’re forcing the landscape orientation by default, - and must still investigate large tablets (iPad Pro, Surface Pro 3, etc.). */ - -/* Custom selectors - Syntax: @custom-selector :--variable selector - The selectors you will use for flags/switches - You can alternatively use classes or custom data-* attributes */ - -/* User view = paged | scrolled */ - -/* Font-family override */ - -/* Advanced settings */ - -/* Reading Modes */ - -/* Filters (images) */ - -/* Accessibility normalization */ - -/* Accessibility font. You can add selectors, using “, ” as a separator, if you have multiple fonts */ - -/* Direction i.e. ltr and rtl */ - -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Base module - - A minimal stylesheet for all ebooks - - Repo: https://github.com/readium/readium-css */ - -/* Define viewport, HTML5-style */ - -@-ms-viewport { - width: device-width; +@-ms-viewport{ + width:device-width; } -@viewport { - width: device-width; - zoom: 1; +@viewport{ + width:device-width; + zoom:1; } -:root { - /* Default font-stacks */ - --RS__oldStyleTf: "Iowan Old Style", "Sitka Text", Palatino, "Book Antiqua", serif; - --RS__modernTf: Athelas, Constantia, Georgia, serif; - --RS__sansTf: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; - --RS__humanistTf: Seravek, Calibri, Roboto, Arial, sans-serif; - --RS__monospaceTf: "Andale Mono", Consolas, monospace; +:root{ - /* Config */ - --RS__baseFontFamily: var(--RS__oldStyleTf); + --RS__monospaceTf:ui-monospace, 'Andale Mono', 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace; - /* For square-ish fonts (CJK, Indic, etc.), we must apply some compensation in dynamic leading. Default is 1 i.e. no compensation */ - --RS__lineHeightCompensation: 1; + --RS__humanistTf:Seravek, Calibri, 'Gill Sans Nova', Roboto, Ubuntu, 'DejaVu Sans', source-sans-pro, sans-serif; - /* Dynamic leading based on typeface metrics + font-size setting */ - --RS__baseLineHeight: calc((1em + (2ex - 1ch) - ((1rem - 16px) * 0.1667)) * var(--RS__lineHeightCompensation)); -} + --RS__sansTf:-ui-sans-serif, -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI Variable', 'Segoe UI', Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Liberation Sans', Arial, sans-serif; + + --RS__modernTf:Athelas, Constantia, Charter, 'Bitstream Charter', Cambria, 'Georgia Pro', Georgia, serif; -/* Set default font for the html doc, so that it can be overridden by the authors’s stylesheet */ + --RS__oldStyleTf:'Iowan Old Style', Sitka, 'Sitka Text', Palatino, 'Book Antiqua', 'URW Palladio L', P052, serif; + --RS__baseFontFamily:var(--RS__oldStyleTf); + --RS__lineHeightCompensation:1; -html { - font-family: var(--RS__baseFontFamily); - /* Fallback line-height */ - line-height: 1.6; /* Fits a little bit better for all languages than 1.5 */ - line-height: var(--RS__baseLineHeight); - text-rendering: optimizeLegibility; + --RS__baseLineHeight:calc(1.5 * var(--RS__lineHeightCompensation)); } -/* 1.5 being too loose with larger font-sizes, we reset headings to normal (which value is 1.125–1.375 for our font-stacks) */ +html{ + font-family:var(--RS__baseFontFamily); + line-height:1.6; + line-height:var(--RS__baseLineHeight); + text-rendering:optimizelegibility; +} -h1, h2, h3 { - line-height: normal; +h1, h2, h3{ + line-height:normal; } :lang(ja), :lang(zh), -:lang(ko) { - word-wrap: break-word; - -webkit-line-break: strict; - -epub-line-break: strict; - line-break: strict; +:lang(ko){ + word-wrap:break-word; + -webkit-line-break:strict; + -epub-line-break:strict; + line-break:strict; } -/* Set default font for Math */ - -math { - font-family: "Latin Modern Math", "STIX Two Math", "XITS Math", "STIX Math", "Libertinus Math", "TeX Gyre Termes Math", "TeX Gyre Bonum Math", "TeX Gyre Schola", "DejaVu Math TeX Gyre", "TeX Gyre Pagella Math", "Asana Math", "Cambria Math", "Lucida Bright Math", "Minion Math", STIXGeneral, STIXSizeOneSym, Symbol, "Times New Roman", serif; +math{ + font-family:"Latin Modern Math", "STIX Two Math", "XITS Math", "STIX Math", "Libertinus Math", "TeX Gyre Termes Math", "TeX Gyre Bonum Math", "TeX Gyre Schola", "DejaVu Math TeX Gyre", "TeX Gyre Pagella Math", "Asana Math", "Cambria Math", "Lucida Bright Math", "Minion Math", STIXGeneral, STIXSizeOneSym, Symbol, "Times New Roman", serif; } -/* Language Overrides - That will only work if either html or body have a (xml:)lang attribute, not for inline overrides */ - -:lang(am) { - --RS__baseFontFamily: Kefa, Nyala, Roboto, Noto, "Noto Sans Ethiopic", serif; - --RS__lineHeightCompensation: 1.167; +:lang(am){ + --RS__baseFontFamily:kefa, nyala, roboto, noto, "Noto Sans Ethiopic", serif; + --RS__lineHeightCompensation:1.167; } -:lang(ar) { - --RS__baseFontFamily: "Geeza Pro", "Arabic Typesetting", Roboto, Noto, "Noto Naskh Arabic", "Times New Roman", serif; +:lang(ar){ + --RS__baseFontFamily:"Geeza Pro", "Arabic Typesetting", roboto, noto, "Noto Naskh Arabic", "Times New Roman", serif; } -:lang(bn) { - --RS__baseFontFamily: "Kohinoor Bangla", "Bangla Sangam MN", Vrinda, Roboto, Noto, "Noto Sans Bengali", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(bn){ + --RS__baseFontFamily:"Kohinoor Bangla", "Bangla Sangam MN", vrinda, roboto, noto, "Noto Sans Bengali", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(bo) { - --RS__baseFontFamily: Kailasa, "Microsoft Himalaya", Roboto, Noto, "Noto Sans Tibetan", sans-serif; +:lang(bo){ + --RS__baseFontFamily:kailasa, "Microsoft Himalaya", roboto, noto, "Noto Sans Tibetan", sans-serif; } -:lang(chr) { - --RS__baseFontFamily: "Plantagenet Cherokee", Roboto, Noto, "Noto Sans Cherokee"; - --RS__lineHeightCompensation: 1.167; +:lang(chr){ + --RS__baseFontFamily:"Plantagenet Cherokee", roboto, noto, "Noto Sans Cherokee"; + --RS__lineHeightCompensation:1.167; } -:lang(fa) { - --RS__baseFontFamily: "Geeza Pro", "Arabic Typesetting", Roboto, Noto, "Noto Naskh Arabic", "Times New Roman", serif; +:lang(fa){ + --RS__baseFontFamily:"Geeza Pro", "Arabic Typesetting", roboto, noto, "Noto Naskh Arabic", "Times New Roman", serif; } -:lang(gu) { - --RS__baseFontFamily: "Gujarati Sangam MN", "Nirmala UI", Shruti, Roboto, Noto, "Noto Sans Gujarati", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(gu){ + --RS__baseFontFamily:"Gujarati Sangam MN", "Nirmala UI", shruti, roboto, noto, "Noto Sans Gujarati", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(he) { - --RS__baseFontFamily: "New Peninim MT", "Arial Hebrew", Gisha, "Times New Roman", Roboto, Noto, "Noto Sans Hebrew" sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(he){ + --RS__baseFontFamily:"New Peninim MT", "Arial Hebrew", gisha, "Times New Roman", roboto, noto, "Noto Sans Hebrew" sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(hi) { - --RS__baseFontFamily: "Kohinoor Devanagari", "Devanagari Sangam MN", Kokila, "Nirmala UI", Roboto, Noto, "Noto Sans Devanagari", sans-serif; +:lang(hi){ + --RS__baseFontFamily:"Kohinoor Devanagari", "Devanagari Sangam MN", kokila, "Nirmala UI", roboto, noto, "Noto Sans Devanagari", sans-serif; - --RS__lineHeightCompensation: 1.1; + --RS__lineHeightCompensation:1.1; } -:lang(hy) { - --RS__baseFontFamily: Mshtakan, Sylfaen, Roboto, Noto, "Noto Serif Armenian", serif; +:lang(hy){ + --RS__baseFontFamily:mshtakan, sylfaen, roboto, noto, "Noto Serif Armenian", serif; } -:lang(iu) { - --RS__baseFontFamily: "Euphemia UCAS", Euphemia, Roboto, Noto, "Noto Sans Canadian Aboriginal", sans-serif; +:lang(iu){ + --RS__baseFontFamily:"Euphemia UCAS", euphemia, roboto, noto, "Noto Sans Canadian Aboriginal", sans-serif; } -:lang(ja) { - --RS__baseFontFamily: "游ゴシック体", YuGothic, "ヒラギノ丸ゴ", "Hiragino Sans", "Yu Gothic UI", "Meiryo UI", "MS Gothic", Roboto, Noto, "Noto Sans CJK JP", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; - - /* Extra variables for Japanese font-stacks as we may want to reuse them for user settings + default */ - --RS__serif-ja: "MS P明朝", "MS PMincho", "Hiragino Mincho Pro", "ヒラギノ明朝 Pro W3", "游明朝", "YuMincho", "MS 明朝", "MS Mincho", "Hiragino Mincho ProN", serif; - --RS__sans-serif-ja: "MS Pゴシック", "MS PGothic", "Hiragino Kaku Gothic Pro W3", "ヒラギノ角ゴ Pro W3", "Hiragino Sans GB", "ヒラギノ角ゴシック W3", "游ゴシック", "YuGothic", "MS ゴシック", "MS Gothic", "Hiragino Sans", sans-serif; - --RS__serif-ja-v: "MS 明朝", "MS Mincho", "Hiragino Mincho Pro", "ヒラギノ明朝 Pro W3", "游明朝", "YuMincho", "MS P明朝", "MS PMincho", "Hiragino Mincho ProN", serif; - --RS__sans-serif-ja-v: "MS ゴシック", "MS Gothic", "Hiragino Kaku Gothic Pro W3", "ヒラギノ角ゴ Pro W3", "Hiragino Sans GB", "ヒラギノ角ゴシック W3", "游ゴシック", "YuGothic", "MS Pゴシック", "MS PGothic", "Hiragino Sans", sans-serif; +:lang(ja){ + --RS__baseFontFamily:yugothic, "Hiragino Maru Gothic ProN", "Hiragino Sans", "Yu Gothic UI", "Meiryo UI", "MS Gothic", roboto, noto, "Noto Sans CJK JP", sans-serif; + --RS__lineHeightCompensation:1.167; + --RS__serif-ja:"Hiragino Mincho ProN", "Hiragino Mincho Pro", "YuMincho", "BIZ UDPMincho", "Yu Mincho", "MS P明朝", "MS PMincho", serif; + --RS__sans-serif-ja:"Hiragino Sans", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ W3", "YuGothic", "Yu Gothic Medium", "BIZ UDPGothic", "Yu Gothic", "MS Pゴシック", "MS PGothic", sans-serif; + --RS__serif-ja-v:"Hiragino Mincho ProN", "Hiragino Mincho Pro", "YuMincho", "BIZ UDMincho", "Yu Mincho", "MS明朝", "MS Mincho", serif; + --RS__sans-serif-ja-v:"Hiragino Sans", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ W3", "YuGothic", "Yu Gothic Medium", "BIZ UDGothic", "Yu Gothic", "MSゴシック", "MS Gothic", sans-serif; } -:lang(km) { - --RS__baseFontFamily: "Khmer Sangam MN", "Leelawadee UI", "Khmer UI", Roboto, Noto, "Noto Sans Khmer", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(km){ + --RS__baseFontFamily:"Khmer Sangam MN", "Leelawadee UI", "Khmer UI", roboto, noto, "Noto Sans Khmer", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(kn) { - --RS__baseFontFamily: "Kannada Sangam MN", "Nirmala UI", Tunga, Roboto, Noto, "Noto Sans Kannada", sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(kn){ + --RS__baseFontFamily:"Kannada Sangam MN", "Nirmala UI", tunga, roboto, noto, "Noto Sans Kannada", sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(ko) { - --RS__baseFontFamily: "Nanum Gothic", "Apple SD Gothic Neo", "Malgun Gothic", Roboto, Noto, "Noto Sans CJK KR", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(ko){ + --RS__baseFontFamily:"Nanum Gothic", "Apple SD Gothic Neo", "Malgun Gothic", roboto, noto, "Noto Sans CJK KR", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(lo) { - --RS__baseFontFamily: "Lao Sangam MN", "Leelawadee UI", "Lao UI", Roboto, Noto, "Noto Sans Lao", sans-serif; +:lang(lo){ + --RS__baseFontFamily:"Lao Sangam MN", "Leelawadee UI", "Lao UI", roboto, noto, "Noto Sans Lao", sans-serif; } -:lang(ml) { - --RS__baseFontFamily: "Malayalam Sangam MN", "Nirmala UI", Kartika, Roboto, Noto, "Noto Sans Malayalam", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(ml){ + --RS__baseFontFamily:"Malayalam Sangam MN", "Nirmala UI", kartika, roboto, noto, "Noto Sans Malayalam", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(or) { - --RS__baseFontFamily: "Oriya Sangam MN", "Nirmala UI", Kalinga, Roboto, Noto, "Noto Sans Oriya", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(or){ + --RS__baseFontFamily:"Oriya Sangam MN", "Nirmala UI", kalinga, roboto, noto, "Noto Sans Oriya", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(pa) { - --RS__baseFontFamily: "Gurmukhi MN", "Nirmala UI", Kartika, Roboto, Noto, "Noto Sans Gurmukhi", sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(pa){ + --RS__baseFontFamily:"Gurmukhi MN", "Nirmala UI", kartika, roboto, noto, "Noto Sans Gurmukhi", sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(si) { - --RS__baseFontFamily: "Sinhala Sangam MN", "Nirmala UI", "Iskoola Pota", Roboto, Noto, "Noto Sans Sinhala", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(si){ + --RS__baseFontFamily:"Sinhala Sangam MN", "Nirmala UI", "Iskoola Pota", roboto, noto, "Noto Sans Sinhala", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(ta) { - --RS__baseFontFamily: "Tamil Sangam MN", "Nirmala UI", Latha, Roboto, Noto, "Noto Sans Tamil", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(ta){ + --RS__baseFontFamily:"Tamil Sangam MN", "Nirmala UI", latha, roboto, noto, "Noto Sans Tamil", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(te) { - --RS__baseFontFamily: "Kohinoor Telugu", "Telugu Sangam MN", "Nirmala UI", Gautami, Roboto, Noto, "Noto Sans Telugu", sans-serif; +:lang(te){ + --RS__baseFontFamily:"Kohinoor Telugu", "Telugu Sangam MN", "Nirmala UI", gautami, roboto, noto, "Noto Sans Telugu", sans-serif; } -:lang(th) { - --RS__baseFontFamily: "Thonburi", "Leelawadee UI", "Cordia New", Roboto, Noto, "Noto Sans Thai", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(th){ + --RS__baseFontFamily:"Thonburi", "Leelawadee UI", "Cordia New", roboto, noto, "Noto Sans Thai", sans-serif; + --RS__lineHeightCompensation:1.067; } -/* The following will also work for zh-Hans */ - -:lang(zh) { - --RS__baseFontFamily: "方体", "PingFang SC", "黑体", "Heiti SC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK SC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh){ + --RS__baseFontFamily:"方体", "PingFang SC", "黑体", "Heiti SC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK SC", sans-serif; + --RS__lineHeightCompensation:1.167; } :lang(zh-Hant), -:lang(zh-TW) { - --RS__baseFontFamily: "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK TC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh-TW){ + --RS__baseFontFamily:"方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK TC", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(zh-HK) { - --RS__baseFontFamily: "方體", "PingFang HK", "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK TC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh-HK){ + --RS__baseFontFamily:"方體", "PingFang HK", "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK TC", sans-serif; + --RS__lineHeightCompensation:1.167; } -/* Readium CSS - Day/Default mode +:root{ - A preset theme for day mode, which is the default + --RS__selectionTextColor:inherit; - Repo: https://github.com/readium/readium-css */ + --RS__selectionBackgroundColor:#b4d8fe; -/* CONFIG */ + --RS__visitedColor:#551A8B; -:root { - --RS__backgroundColor: #FFFFFF; - --RS__textColor: #121212; + --RS__linkColor:#0000EE; - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; -} + --RS__textColor:#121212; -:root { - color: var(--RS__textColor) !important; - background-color: var(--RS__backgroundColor) !important; + --RS__backgroundColor:#FFFFFF; } -/* Note: Though `::selection` was present in drafts of CSS Selectors Level 3, it was removed during the Candidate Recommendation phase because its behavior was under-specified (especially with nested elements) and interoperability wasn’t achieved. Source: https://developer.mozilla.org/en-US/docs/Web/CSS/::selection */ - -::-moz-selection { - color: var(--RS__selectionTextColor); - background-color: var(--RS__selectionBackgroundColor); +:root{ + color:var(--RS__textColor) !important; + background-color:var(--RS__backgroundColor) !important; } -::selection { - color: var(--RS__selectionTextColor); - background-color: var(--RS__selectionBackgroundColor); +::-moz-selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } -/* @import "modules/ReadiumCSS-fonts.css"; */ - -/* Readium CSS - HTML5 SR Patch stylesheet - - A set of style to adjust HTML5 Suggested Rendering to paginated content - - Repo: https://github.com/readium/readium-css */ - -/* Fragmentation */ - -body { - widows: 2; - orphans: 2; +::selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } -figcaption, th, td { - widows: 1; - orphans: 1; +body{ + widows:2; + orphans:2; } -h2, -h3, -h4, -h5, -h6, -dt, -hr, -caption { - -webkit-column-break-after: avoid; - page-break-after: avoid; - break-after: avoid; +figcaption, th, td{ + widows:1; + orphans:1; } -h1, -h2, -h3, -h4, -h5, -h6, -dt, -figure, -tr { - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid; +h2, h3, h4, h5, h6, dt, +hr, caption{ + -webkit-column-break-after:avoid; + page-break-after:avoid; + break-after:avoid; } -/* Hyphenation */ - -body { - -webkit-hyphenate-character: "\002D"; - -moz-hyphenate-character: "\002D"; - -ms-hyphenate-character: "\002D"; - hyphenate-character: "\002D"; - -webkit-hyphenate-limit-lines: 3; - -ms-hyphenate-limit-lines: 3; - hyphenate-limit-lines: 3; +h1, h2, h3, h4, h5, h6, dt, +figure, tr{ + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; } -h1, -h2, -h3, -h4, -h5, -h6, -dt, -figcaption, -pre, -caption, -address, -center, -code, -var { - -ms-hyphens: none; - -moz-hyphens: none; - -webkit-hyphens: none; - -epub-hyphens: none; - hyphens: none; +body{ + -webkit-hyphenate-character:"\002D"; + -moz-hyphenate-character:"\002D"; + -ms-hyphenate-character:"\002D"; + hyphenate-character:"\002D"; + -webkit-hyphenate-limit-lines:3; + -ms-hyphenate-limit-lines:3; + hyphenate-limit-lines:3; } -/* OTF */ +h1, h2, h3, h4, h5, h6, dt, +figcaption, pre, caption, address, +center, code, var{ + -ms-hyphens:none; + -moz-hyphens:none; + -webkit-hyphens:none; + -epub-hyphens:none; + hyphens:none; +} -body { - font-variant-numeric: oldstyle-nums proportional-nums; +body{ + font-variant-numeric:oldstyle-nums proportional-nums; } :lang(ja) body, :lang(zh) body, -:lang(ko) body { - font-variant-numeric: lining-nums proportional-nums; +:lang(ko) body{ + font-variant-numeric:lining-nums proportional-nums; } -h1, h2, h3, h4, h5, h6, dt { - font-variant-numeric: lining-nums proportional-nums; +h1, h2, h3, h4, h5, h6, dt{ + font-variant-numeric:lining-nums proportional-nums; } -table { - font-variant-numeric: lining-nums tabular-nums; +table{ + font-variant-numeric:lining-nums tabular-nums; } -code, var { - font-variant-ligatures: none; - font-variant-numeric: lining-nums tabular-nums slashed-zero; +code, var{ + font-variant-ligatures:none; + font-variant-numeric:lining-nums tabular-nums slashed-zero; } -rt { - font-variant-east-asian: ruby; +rt{ + font-variant-east-asian:ruby; } -:lang(ar) { - font-variant-ligatures: common-ligatures; +:lang(ar){ + font-variant-ligatures:common-ligatures; } -:lang(ko) { - font-kerning: normal; +:lang(ko){ + font-kerning:normal; } -/* Night mode */ - -hr { - color: inherit; - border-color: currentColor; -} - -table, th, td { - border-color: currentColor; +hr{ + color:inherit; + border-color:currentcolor; } -/* Horizontal Spacing */ - -figure, blockquote { - margin: 1em 5%; +table, th, td{ + border-color:currentcolor; } -/* - -:lang(ja) figure, :lang(ja) blockquote, -:lang(zh-Hant) figure, :lang(zh-Hant) blockquote, -:lang(zh-TW) figure, :lang(zh-TW) blockquote, -:lang(mn) figure, :lang(mn) blockquote { - margin: 5% 1em; +figure, blockquote{ + margin:1em 5%; } -*/ - -ul, ol { - padding-left: 5%; -} - -/* - -:lang(ja) ul, :lang(ja) ol, -:lang(zh-Hant) ul, :lang(zh-Hant) ol, -:lang(zh-TW) ul, :lang(zh-TW) ol, -:lang(mn) ul, :lang(mn) ol { - padding-top: 5%; +ul, ol{ + padding-left:5%; } -*/ - -dd { - margin-left: 5%; +dd{ + margin-left:5%; } -/* - -:lang(ja) dd, -:lang(zh-Hant) dd, -:lang(zh-TW) dd, -:lang(mn) dd { - margin-top: 5%; +pre{ + white-space:pre-wrap; + -ms-tab-size:2; + -moz-tab-size:2; + -webkit-tab-size:2; + tab-size:2; } -*/ - -pre { - white-space: pre-wrap; - -ms-tab-size: 2; - -moz-tab-size: 2; - -webkit-tab-size: 2; - tab-size: 2; +abbr[title], acronym[title]{ + text-decoration:dotted underline; } -/* Normalization */ - -abbr[title], acronym[title] { - text-decoration: dotted underline; +nobr wbr{ + white-space:normal; } -nobr wbr { - white-space: normal; +ruby > rt, ruby > rp{ + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; } -/* Make ruby text and parentheses non-selectable (TBC) */ - -ruby > rt, ruby > rp { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -/* Internationalization */ - -*:lang(ja), -*:lang(zh), -*:lang(ko), -:lang(ja) cite, -:lang(ja) dfn, -:lang(ja) em, -:lang(ja) i, -:lang(zh) cite, -:lang(zh) dfn, -:lang(zh) em, -:lang(zh) i, -:lang(ko) cite, -:lang(ko) dfn, -:lang(ko) em, -:lang(ko) i { - font-style: normal; +*:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)), +*:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)), +*:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)), +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) cite, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) dfn, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) em, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) i, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) cite, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) dfn, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) em, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) i, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) cite, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) dfn, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) em, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) i{ + font-style:normal; } :lang(ja) a, :lang(zh) a, -:lang(ko) a { - text-decoration: none; +:lang(ko) a{ + text-decoration:none; } -/* Readium CSS - Safeguards module for vertical writing - - A set of styles to prevent common issues in pagination - - Repo: https://github.com/readium/readium-css */ - -/* Config */ - -/* We’ll be using an "RS__" prefix so that we can prevent collisions with authors’ CSS */ - -:root { - /* max-width for media, you can override that via JS if not compiled to static */ - --RS__maxMediaWidth: 100%; - - /* max-height for media, you can override that via JS if not compiled to static */ - --RS__maxMediaHeight: 100vw; - - /* value for medias’ box-sizing */ - --RS__boxSizingMedia: border-box; - - /* value for table’s box-sizing */ - --RS__boxSizingTable: border-box; +:root{ + --RS__maxMediaWidth:100%; + --RS__maxMediaHeight:100vw; + --RS__boxSizingMedia:border-box; + --RS__boxSizingTable:border-box; } -/* Sanitize line-heights in webkit e.g. raised cap without a declared line-height - See effect by checking this demo in Safari: https://codepen.io/JayPanoz/pen/gRmzrE - Note: glyphs has to be reset to inline for CJK */ - -html { - -webkit-line-box-contain: block glyphs replaced; +a, a span, span a, h1, h2, h3, h4, h5, h6{ + word-wrap:break-word; } -:lang(ja) { - -webkit-line-box-contain: block inline replaced; +div{ + max-width:var(--RS__maxMediaHeight); } -/* Wrap long strings if larger than line-length */ +img, svg|svg, video{ + object-fit:contain; -a, h1, h2, h3, h4, h5, h6 { - word-wrap: break-word; + width:auto; + height:auto; + max-width:var(--RS__maxMediaHeight); + max-height:var(--RS__maxMediaWidth) !important; + box-sizing:var(--RS__boxSizingMedia); + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; } -div { - max-width: var(--RS__maxMediaHeight); +audio{ + max-width:100%; + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; } -/* Size medias */ - -/* You can override CSS variables by re-defining it for all elements or a specific one */ - -img, svg, audio, video { - - /* Object-fit allows us to keep the correct aspect-ratio */ - object-fit: contain; - - width: auto; - height: auto; - - /* We’re setting a max-height, especially for covers */ - max-width: var(--RS__maxMediaHeight); - - /* Some files don’t have max-width */ - max-height: var(--RS__maxMediaWidth) !important; - /* We probably don’t need to use modern box-sizing as auto behaves like it */ - box-sizing: var(--RS__boxSizingMedia); - - /* For page-break, we must use those 3 - We can’t use a variable there, webkit seems to no support them for those properties */ - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid; -} - -/* Try preventing border being cut-off, webkit + blink have content-box by default */ - -table { - max-height: var(--RS__maxMediaWidth); - box-sizing: var(--RS__boxSizingTable) -} -/*# sourceMappingURL=ReadiumCSS-before.css.map */ \ No newline at end of file +table{ + max-height:var(--RS__maxMediaWidth); + box-sizing:var(--RS__boxSizingTable) +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css index 7122cfa6c..08e7b95fd 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css @@ -1,210 +1,173 @@ -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Default module for CJK vertical writing - - A stylesheet for unstyled ebooks based on HTML5 Suggested Rendering - Note: works in combination with Base module - - Repo: https://github.com/readium/readium-css */ +:root{ -/* CONFIG */ + --RS__compFontFamily:var(--RS__baseFontFamily); + --RS__codeFontFamily:var(--RS__monospaceTf); -:root { - /* Extra variables for Japanese font-stacks: - • --RS__serif-ja-v; - • --RS__sans-serif-ja-v. + --RS__typeScale:1.125; + --RS__baseFontSize:87.5%; - They can be used instead of --RS__baseFontFamily and --RS__compFontFamily */ + --RS__flowSpacing:1.5rem; + --RS__paraSpacing:0; + --RS__paraIndent:1em; - --RS__compFontFamily: var(--RS__baseFontFamily); - --RS__codeFontFamily: var(--RS__monospaceTf); + --RS__linkColor:#0000EE; + --RS__visitedColor:#551A8B; - --RS__typeScale: 1.125; /* 1.067 | 1.125 | 1.2 | 1.25 | 1.333 | 1.414 | 1.5 | 1.618 */ - --RS__baseFontSize: 87.5%; - - --RS__flowSpacing: 1.5rem; - --RS__paraSpacing: 0; - --RS__paraIndent: 1em; - - --RS__linkColor: #0000EE; - --RS__visitedColor: #551A8B; - - --RS__primaryColor: ; - --RS__secondaryColor: ; + --RS__primaryColor:; + --RS__secondaryColor:; } -:root:lang(zh) { - --RS__paraIndent: 2em; +:root:lang(zh){ + --RS__paraIndent:2em; } -:lang("mn-Mong") { - --RS__baseFontSize: 100%; +:lang("mn-Mong"){ + --RS__baseFontSize:100%; } -/* STYLES */ - -/* Typo */ - -body { - font-size: var(--RS__baseFontSize); - text-align: justify; - text-justify: inter-character; +body{ + font-size:var(--RS__baseFontSize); + text-align:justify; + text-justify:inter-character; } -h1, h2, h3, h4, h5, h6 { - font-family: var(--RS__baseFontFamily); - text-align: left; - text-align: start; +h1, h2, h3, h4, h5, h6{ + font-family:var(--RS__baseFontFamily); + text-align:left; + text-align:start; } -/* Flow content */ - -blockquote, -figure, -p, -pre, -aside, -footer, -form, -hr { - margin-right: var(--RS__flowSpacing); - margin-left: var(--RS__flowSpacing); +blockquote, figure, p, pre, +aside, footer, form, hr{ + margin-right:var(--RS__flowSpacing); + margin-left:var(--RS__flowSpacing); } -p { - margin-right: var(--RS__paraSpacing); - margin-left: var(--RS__paraSpacing); - text-indent: var(--RS__paraIndent); +p{ + margin-right:var(--RS__paraSpacing); + margin-left:var(--RS__paraSpacing); + text-indent:var(--RS__paraIndent); } -pre { - font-family: var(--RS__codeFontFamily); +pre{ + font-family:var(--RS__codeFontFamily); } -/* Phrasing content */ - -code, kbd, samp, tt { - font-family: var(--RS__codeFontFamily); +code, kbd, samp, tt{ + font-family:var(--RS__codeFontFamily); } -sub, sup { - position: relative; - font-size: 67.5%; - line-height: 1; +sub, sup{ + position:relative; + font-size:67.5%; + line-height:1; } -sub { - left: -0.2ex; +sub{ + left:-0.2ex; } -sup { - right: 0; +sup{ + right:0; } -em { - -webkit-text-emphasis: sesame; - -epub-text-emphasis: sesame; - text-emphasis: sesame; +em{ + -webkit-text-emphasis:sesame; + -epub-text-emphasis:sesame; + text-emphasis:sesame; } -:link { - color: var(--RS__linkColor); +:link{ + color:var(--RS__linkColor); } -:visited { - color: var(--RS__visitedColor); +:visited{ + color:var(--RS__visitedColor); } -/* Headings */ - -h1 { - margin-right: calc(var(--RS__flowSpacing) * 2); - margin-left: calc(var(--RS__flowSpacing) * 2); - /* The following is base font size * typescale power of 3 */ - font-size: calc(((1em * var(--RS__typeScale)) * var(--RS__typeScale)) * var(--RS__typeScale)); - text-indent: 2rem; +h1{ + margin-right:calc(var(--RS__flowSpacing) * 2); + margin-left:calc(var(--RS__flowSpacing) * 2); + font-size:calc(((1em * var(--RS__typeScale)) * var(--RS__typeScale)) * var(--RS__typeScale)); + text-indent:2rem; } -h2 { - margin-right: calc(var(--RS__flowSpacing) * 2); - margin-left: var(--RS__flowSpacing); - /* The following is base font size * typescale power of 2 */ - font-size: calc((1em * var(--RS__typeScale)) * var(--RS__typeScale)); - text-indent: 3rem; +h2{ + margin-right:calc(var(--RS__flowSpacing) * 2); + margin-left:var(--RS__flowSpacing); + font-size:calc((1em * var(--RS__typeScale)) * var(--RS__typeScale)); + text-indent:3rem; } -h3 { - margin-right: var(--RS__flowSpacing); - margin-left: var(--RS__flowSpacing); - font-size: calc(1em * var(--RS__typeScale)); - text-indent: 4rem; +h3{ + margin-right:var(--RS__flowSpacing); + margin-left:var(--RS__flowSpacing); + font-size:calc(1em * var(--RS__typeScale)); + text-indent:4rem; } -h4 { - margin-right: var(--RS__flowSpacing); - margin-left: var(--RS__flowSpacing); - font-family: var(--RS__compFontFamily); - font-size: 1em; - text-indent: 4rem; +h4{ + margin-right:var(--RS__flowSpacing); + margin-left:var(--RS__flowSpacing); + font-family:var(--RS__compFontFamily); + font-size:1em; + text-indent:4rem; } -h5 { - margin-right: var(--RS__flowSpacing); - margin-left: var(--RS__flowSpacing); - font-family: var(--RS__compFontFamily); - font-size: smaller; - text-indent: 4rem; +h5{ + margin-right:var(--RS__flowSpacing); + margin-left:var(--RS__flowSpacing); + font-family:var(--RS__compFontFamily); + font-size:smaller; + text-indent:4rem; } -h6 { - margin-right: var(--RS__flowSpacing); - margin-left: 0; - font-family: var(--RS__compFontFamily); - font-size: smaller; - font-weight: normal; - text-indent: 4rem; +h6{ + margin-right:var(--RS__flowSpacing); + margin-left:0; + font-family:var(--RS__compFontFamily); + font-size:smaller; + font-weight:normal; + text-indent:4rem; } -/* Lists */ - -dl, ol, ul { - margin-right: var(--RS__flowSpacing); - margin-left: var(--RS__flowSpacing); +dl, ol, ul{ + margin-right:var(--RS__flowSpacing); + margin-left:var(--RS__flowSpacing); } -/* Table */ - -table { - margin: 0 var(--RS__flowSpacing); - border: 1px solid currentColor; - border-collapse: collapse; - empty-cells: show; +table{ + margin:0 var(--RS__flowSpacing); + border:1px solid currentcolor; + border-collapse:collapse; + empty-cells:show; } -thead, tbody, tfoot, table > tr { - vertical-align: top; +thead, tbody, tfoot, table > tr{ + vertical-align:top; } -th { - text-align: left; +th{ + text-align:left; } -th, td { - padding: 4px; - border: 1px solid currentColor; -} -/*# sourceMappingURL=ReadiumCSS-default.css.map */ \ No newline at end of file +th, td{ + padding:4px; + border:1px solid currentcolor; +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA-Bold.woff2 b/Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..781eecd96cbc04f03a25c257a42acad096c0c785 GIT binary patch literal 66864 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 Hzf%AJm62my literal 0 HcmV?d00001 diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA-Regular.woff b/Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..20988e0de039de36677662c9a82d37ab64652605 GIT binary patch literal 89336 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 literal 0 HcmV?d00001 diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA-Regular.woff2 b/Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..14dafdf7e1e4552c627334aff9efc28f5b29a251 GIT binary patch literal 65592 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 literal 0 HcmV?d00001 diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA.otf b/Sources/Navigator/EPUB/Assets/Static/readium-css/fonts/AccessibleDfA.otf deleted file mode 100755 index 69c02218a5ab163c634edcc34b14e8a735513f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145384 zcmeFa2Y40L);GS-^hxi%ob+DK%$yXlkaC79AWgvnAqgZB5=fybSU^R z|DYmc{zIECVa!!b{K(pIHRHRjy_I&e@);Aq8&lIZo<*?~D(_0l3~8vZsmpu(>{!}= zm9~-w$_RD`Tu9eT#HTlmYo9##nimffPlaUMHLhmzc>S3HbjX!WUrKY$xcaC&GhbmW zFM%=X-0>}K?Wa6!GL=vFz}(E`oEp1$rS;gkBZANV$?ei8gRxzUE-!cJyCa)NozQ+i z?vBf?y|!s=~DSkB5r5j zHPiVPlNb};VNSa+`8{^E_=+o3dY64E-@%fklWd%JGaIIy$Hs}f**3{?rAsy&DsN*i zDc`UU#0BgkX)60d9Le61R2g07D!p*( zki7ELJK_pUZH3mGKR$mwU2jq}i-d&SnkLAvQ`J&C2CqHbx%L zHVbF7DPrKMC!~Yyd7*)AQ{Q3t$!@krj%DNJGPYihptjn>?w9J>7;4nfatK=??PMNh zHR~m9WTx~qE0PwlP&#kDxWYA+=q6<@ZL6s-GT9Gw&&z15p>4K2pSAOIqS!h)%H`I} zU4hc2>`uC`Rdmf;H0qpl4@yJXV&dN>`nt0TKe29dD%(QGZWInuUq-p!k%qd`=-MfC z?SpjP+Rkk*xVy`kBT@6njce;M*)YoM;qlp!R%9 zT}d>6ZIafp3#ILBp0pQKyox<3&Z7HR%|gUMY>2dvT~6)%wDd8JN7|@AnmhNeb=ryc zFQwy;oViKQuydr}=^CQ)cU0e48oN$AB(PaZJg8H5>0-8t)4NzRZwtB~PUF}%C70^_ zA#39GpUawf8^y94IgMnuJJh-Nzf#3RbM=y{*x8bso})SJH7e(Mr%dSx+aY{HW6z=Kr+#**G?3bs zs94HYOGi!(5DZs0ryuE>r=4q@PZuwbKlK=LNQY5>O6@HBuT;B*O;$gmzWA2P+{kX| zI^W?XgWBO0wqA;67t0Gc?Qxn%{wR4Zs}r}en;j}20VVztK5m@;bH>oWLA5%zg8F@^ zyo1J=)6X>4NY7Ntk*wce=tW8kyQAwq{}pxm_+K4&j*$-e^B?Wv z>ACoak4pOH%uK2Se@^6??6IzKeCF}4ePQpZ6J7iNC(_g7ymNea-6OThpPsd@{4Uzn z#$EcOE5D0&wRsmWPr-Qa;vITs+wk&Mk}h_1>LTWM=6Qd&FOeSlyL@>ws}eVoZkob| z((_gJcjx@C%%kU~n^T_fBpdqglq>aM3;vz+{#TqM?`3EIJLO1jc5T;rQrI8+;@f}U z#$D(BJ5)T#RyyYi5iCyliZ#)8pTkRiT|Be@LB5Z4C{=z(VldzK23Cr0oVG$#H z{lEU9c3{HDQ^%xWRz>x?k+#MEsuXD$yXvpU#VM>8mGh?PX3r@-r4HH}{(8>e@xmU~ zEY|)pR)zQ2gI(tdSFzs05T-D8^0dyxu@hvvQGdL}CK1M7Kz%ey8u;h_AiHyXS2_Q? zsj&3V?JlgQzMwp+8{Nh~|B#*PjH7>f&Og8UKS%zjT0maICj3vy`j4Fdw7`E_;QzfA zaD24?TWc+iWhpB8H7dg~dwU+4a&Gc9!xM@}()Pl3(*7 z%Xg?ekSUIT?d*4b&MZTUB0KL0>(_P6p;9YrRECm`(4TqE%>O@eziWP_>)vQSatF=P zoc2MT`Ia+z=R9YA6}mb2RoB|sU41Q-$|eR z>($B@wnN>)o>of!OleM&`+r^Zuh;!6-kE>-XUEAu7-rx|5KFYPb8i2PyMQYHn;KD`|I+b|C;~*Do^8`&!7Ew>;HH23;*4+{&U@b zTHrq|@PAJW(7cWxZHs7fVo?BN`(@`{g!4{qD$Uc(_+yjDGJj|8=JXcD7SMGY=sncw zcMeXgsJj?{V;PXo<~zKQ$y&%hYEg!>7KcCc(=~79psngo}S-PcF?

!C0KHonOXtp~cd3Rl*L5LL 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%0A_=a#T64x>QXKCd^D! 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 diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css index 280c34ac5..2d9b79405 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css @@ -1,777 +1,588 @@ -/* Readium CSS - Config module - - A file allowing implementers to customize flags for reading modes, - user settings, etc. - - Repo: https://github.com/readium/readium-css */ - -/* Custom medias - Syntax: @custom-media --variable (prop: value) */ - -/* Responsive columns - The minimum width for which responsive columns (2 -> 1 and vice versa, - depending on the current font-size) must be enabled */ - -/* Mobile columns - The minimum and maximum width for mobile devices. - We’re forcing the landscape orientation by default, - and must still investigate large tablets (iPad Pro, Surface Pro 3, etc.). */ - -/* Custom selectors - Syntax: @custom-selector :--variable selector - The selectors you will use for flags/switches - You can alternatively use classes or custom data-* attributes */ - -/* User view = paged | scrolled */ - -/* Font-family override */ - -/* Advanced settings */ - -/* Reading Modes */ - -/* Filters (images) */ - -/* Accessibility normalization */ - -/* Accessibility font. You can add selectors, using “, ” as a separator, if you have multiple fonts */ - -/* Direction i.e. ltr and rtl */ - -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Pagination module - - A set of styles to paginate ePublications - - Repo: https://github.com/readium/readium-css */ - -/* Config */ +:root{ -/* Columns are responsive by default, even if column-width is set in pixels, - which means two-page spread will switch to single page depending on current font-size. - If you want more control, I’m afraid you’ll have to update colWidth/colGap dynamically, - which is how a significant amount of RS do at the moment. */ + --RS__viewportWidth:100%; -/* Default for smartphone portrait (small screens) */ + --RS__pageGutter:0; -:root { - /* Your columns’ width floor */ - --RS__colWidth: 45em; /* The width at which we’ll switch to 2 columns by default. PS: you can’t set it in rem */ + --RS__defaultLineLength:40rem; - /* Ideal number of columns (depending on columns’ width floor) */ - --RS__colCount: 1; + --RS__colGap:0; - /* Gap between columns (in pixels so that it won’t resize with font-size) */ - --RS__colGap: 0; + --RS__colCount:1; - /* Optimal line-length (rem will take :root font-size into account, whatever the body’s font-size) */ - --RS__maxLineLength: 40rem; - - /* Default page horizontal margins (in pixels so that it won’t resize with font-size) */ - --RS__pageGutter: 20px; /* See if colGap and pageGutter can be the same var */ + --RS__colWidth:100vw; } -/* Reset page margins for Forward compatibility */ - -@page { - margin: 0 !important; +@page{ + margin:0 !important; } -/* :root selector has same specificity as a class i.e. 0010 - We might have to change that to html / context - -> https://css-tricks.com/almanac/selectors/r/root/ */ - -:root { - - /* In case you use left position to scroll, can be removed if using transform: translateX() */ - position: relative; +:root{ + position:relative; - -webkit-column-width: var(--RS__colWidth); - -moz-column-width: var(--RS__colWidth); - column-width: var(--RS__colWidth); + -webkit-column-width:var(--RS__colWidth); + -moz-column-width:var(--RS__colWidth); + column-width:var(--RS__colWidth); + -webkit-column-count:var(--RS__colCount); + -moz-column-count:var(--RS__colCount); + column-count:var(--RS__colCount); - /* Init pagination */ - /* TODO: document columns’ logic cos it might feel weird at first */ - -webkit-column-count: var(--RS__colCount); - -moz-column-count: var(--RS__colCount); - column-count: var(--RS__colCount); - - -webkit-column-gap: var(--RS__colGap); - -moz-column-gap: var(--RS__colGap); - column-gap: var(--RS__colGap); - - /* Default is balance and we want columns to be filled entirely (100vh) */ - -moz-column-fill: auto; - column-fill: auto; - width: 100%; - height: 100vh; - max-width: 100%; - max-height: 100vh; - min-width: 100%; - min-height: 100vh; - padding: 0 !important; - margin: 0 !important; - - /* Column size will depend on this if we want to make it responsive */ - font-size: 100% !important; - - -webkit-text-size-adjust: 100%; - - /* Switch to newer box model (not inherited by authors’ styles) */ - box-sizing: border-box; - - /* Fix bug for older Chrome */ - -webkit-perspective: 1; - /* Prevents options pop-up when long tap in webkit */ - -webkit-touch-callout: none; + -webkit-column-gap:var(--RS__colGap); + -moz-column-gap:var(--RS__colGap); + column-gap:var(--RS__colGap); + -moz-column-fill:auto; + column-fill:auto; + width:var(--RS__viewportWidth); + height:100vh; + max-width:var(--RS__viewportWidth); + max-height:100vh; + min-width:var(--RS__viewportWidth); + min-height:100vh; + padding:0 !important; + margin:0 !important; + font-size:1rem !important; + box-sizing:border-box; + -webkit-touch-callout:none; } -body { - /* overflow: hidden; bugfix: contents won’t paginate in Firefox and one sample in Safari */ - width: 100%; - - /* Limit line-length but we have to reset when 2 columns and control the viewport. - By using max-width + margin auto, margins will shrink when font-size increases, - which is what would be expected in terms of typography. */ - max-width: var(--RS__maxLineLength) !important; - padding: 0 var(--RS__pageGutter) !important; - margin: 0 auto !important; - - /* We need a minimum padding on body so that descandants/ascendants in italic/script are not cut-off. - Drawback: we have to use border-box so that it doesn’t screw the box model, - which means it impacts colWidth and max-width */ - box-sizing: border-box; +body{ + width:100%; + max-width:var(--RS__defaultLineLength) !important; + padding:0 var(--RS__pageGutter) !important; + margin:0 auto !important; + overflow:hidden; + box-sizing:border-box; } -/* We’ll now redefine margins and columns depending on the minimum width available - The goal is having the simplest model possible and avoid targeting devices */ +@supports (overflow: clip){ -/* Smartphone landscape */ + :root{ + overflow:clip; + } -@media screen and (min-width: 35em) { - :root { - --RS__pageGutter: 30px; - } + body{ + overflow:clip; + overflow-clip-margin:content-box; + } } -/* Tablet portrait */ - -@media screen and (min-width: 45em) { - :root { - --RS__pageGutter: 40px; - } +:root[style*="readium-scroll-on"]{ + -webkit-columns:auto auto !important; + -moz-columns:auto auto !important; + columns:auto auto !important; + width:auto !important; + height:auto !important; + max-width:none !important; + max-height:none !important; + min-width:0 !important; + min-height:0 !important; } -/* Desktop + tablet large */ - -/* We get the previous settings, we just change the margins */ - -@media screen and (min-width: 75em) { - :root { - --RS__pageGutter: 50px; - } +:root[style*="readium-scroll-on"] body{ + max-width:var(--RS__defaultLineLength) !important; + overflow:auto; } -/* At this point (80em or so), constraining line length must be done at the web view/iframe level, or by limiting the size of :root itself */ +@supports (overflow: clip){ -/* Responsive columns */ - -@media screen and (min-width: 60em), screen and (min-device-width: 36em) and (max-device-width: 47em) and (orientation: landscape) { - :root { - /* The size at which we want 2 columns to switch to 1 (depending on font-size) */ - --RS__colWidth: 20em; /* 20 * 16 = 320px but 20 * 28 = 560px so it will switch to 1 col @ 175% font-size (user-setting) on an iPad */ - /* We constrain to 2 columns so that we can never get 3 or 4, etc. */ - --RS__colCount: 2; - --RS__maxLineLength: 39.99rem; /* If we don’t use this, colNumber user setting won’t work in Safari… */ + :root[style*="readium-scroll-on"]{ + overflow:auto; } -} -/* Readium CSS - Scroll module - - A set of styles to scroll ePublications - This module overrides pagination - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-scroll-on"] { - - /* Reset columns, auto + auto = columns can’t be created */ - -webkit-columns: auto auto !important; - -moz-columns: auto auto !important; - columns: auto auto !important; - width: auto !important; - height: auto !important; - max-width: none !important; - max-height: none !important; - /* Reset html size so that the user can scroll */ - min-width: 0 !important; - min-height: 0 !important; -} - -/* Make sure line-length is limited in all configs */ - -:root[style*="readium-scroll-on"] body { - --RS__maxLineLength: 40rem !important; + :root[style*="readium-scroll-on"] body{ + overflow:clip; + } } -/* Readium CSS - Night mode +:root[style*="readium-night-on"]{ - A preset theme for night mode + --RS__selectionTextColor:inherit; - Repo: https://github.com/readium/readium-css */ + --RS__selectionBackgroundColor:#b4d8fe; -/* CONFIG */ + --RS__visitedColor:#0099E5; -/* [style*="--USER__appearance"] can be used to increase specificity but performance hit */ + --RS__linkColor:#63caff; -:root[style*="readium-night-on"] { - --RS__backgroundColor: #000000; - --RS__textColor: #FEFEFE; + --RS__textColor:#FEFEFE; - --RS__linkColor: #63caff; - --RS__visitedColor: #0099E5; - - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; + --RS__backgroundColor:#000000; } -/* we don’t need to redeclare bg-color and color for :root since we will inherit and update from day/default mode */ - -:root[style*="readium-night-on"] *:not(a) { - color: inherit !important; - background-color: transparent !important; - border-color: currentColor !important; +:root[style*="readium-night-on"] *:not(a){ + color:inherit !important; + background-color:transparent !important; + border-color:currentcolor !important; } -:root[style*="readium-night-on"] svg text { - fill: currentColor !important; - stroke: none !important; +:root[style*="readium-night-on"] svg text{ + fill:currentcolor !important; + stroke:none !important; } :root[style*="readium-night-on"] a:link, -:root[style*="readium-night-on"] a:link * { - color: var(--RS__linkColor) !important; +:root[style*="readium-night-on"] a:link *{ + color:var(--RS__linkColor) !important; } :root[style*="readium-night-on"] a:visited, -:root[style*="readium-night-on"] a:visited * { - color: var(--RS__visitedColor) !important; +:root[style*="readium-night-on"] a:visited *{ + color:var(--RS__visitedColor) !important; } -/* For epub:type, in case the contents are served as text/html, namespaces won’t work hence why we’re using both syntax */ - :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, -:root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: invert(100%); - filter: invert(100%); -} - -/* Darken all images on user’s demand */ - -:root[style*="readium-night-on"][style*="readium-darken-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); -} - -/* Invert all images on user’s demand */ - -:root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: invert(100%); - filter: invert(100%); -} - -/* Darken and invert on user’s demand */ - -:root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%) invert(100%); - filter: brightness(80%) invert(100%); +:root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:invert(100%); + filter:invert(100%); } -/* Readium CSS - Sepia mode +:root[style*="readium-sepia-on"]{ - A preset theme for sepia mode + --RS__selectionTextColor:inherit; - Repo: https://github.com/readium/readium-css */ + --RS__selectionBackgroundColor:#b4d8fe; -/* CONFIG */ + --RS__visitedColor:#551A8B; -:root[style*="readium-sepia-on"] { - --RS__backgroundColor: #faf4e8; - --RS__textColor: #121212; + --RS__linkColor:#0000EE; - --RS__linkColor: #0000EE; - --RS__visitedColor: #551A8B; + --RS__textColor:#121212; - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; - - --RS__maxLineLength: 40.01rem; /* Forcing a reflow in Blink/Webkit so that blend mode can work */ + --RS__backgroundColor:#faf4e8; } -/* we don’t need to redeclare bg-color and color for :root since we will inherit and update from day/default mode */ - -:root[style*="readium-sepia-on"] *:not(a) { - color: inherit !important; - background-color: transparent !important; +:root[style*="readium-sepia-on"] *:not(a){ + color:inherit !important; + background-color:transparent !important; } :root[style*="readium-sepia-on"] a:link, -:root[style*="readium-sepia-on"] a:link * { - color: var(--RS__linkColor); +:root[style*="readium-sepia-on"] a:link *{ + color:var(--RS__linkColor); } :root[style*="readium-sepia-on"] a:visited, -:root[style*="readium-sepia-on"] a:visited * { - color: var(--RS__visitedColor); -} - -:root[style*="readium-sepia-on"] svg, -:root[style*="readium-sepia-on"] img { - /* Make sure the proper bg-color is used for the blend mode */ - background-color: transparent !important; - mix-blend-mode: multiply; +:root[style*="readium-sepia-on"] a:visited *{ + color:var(--RS__visitedColor); } -/* Readium CSS - OS Accessibility Modes +@media screen and (-ms-high-contrast: active){ - A stylesheet to deal with OS accessibility settings - - Repo: https://github.com/readium/readium-css */ - -/* Windows high contrast colors are mapped to CSS system color keywords - See http://www.gwhitworth.com/blog/2017/04/how-to-use-ms-high-contrast */ - -@media screen and (-ms-high-contrast: active) { - :root { - color: windowText !important; - background-color: window !important; + :root{ + color:windowText !important; + background-color:window !important; } - /* The following selectors are super funky but it makes sure everything is inherited, this is indeed critical for this mode */ :root :not(#\#):not(#\#):not(#\#), :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) - :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) { - color: inherit !important; - background-color: inherit !important; + :root :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#) :not(#\#):not(#\#):not(#\#){ + color:inherit !important; + background-color:inherit !important; } - .readiumCSS-mo-active-default { - color: highlightText !important; - background-color: highlight !important; + .readiumCSS-mo-active-default{ + color:highlightText !important; + background-color:highlight !important; } - - /* For links, hyperlink keyword is automatically set */ - - /* Should we also set user highlights? */ } -@media screen and (-ms-high-contrast: white-on-black) { +@media screen and (-ms-high-contrast: white-on-black){ + :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, - :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: none !important; - filter: none !important; + :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: none !important; - filter: none !important; + + :root[style*="readium-night-on"][style*="readium-invert-on"] img{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); + + :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%); + filter:brightness(80%); } } -/* Will be true on recent versions of iOS and MacOS if inverted setting enabled by the user */ +@media screen and (inverted-colors){ -@media screen and (inverted-colors) { :root[style*="readium-night-on"] img[class*="gaiji"], :root[style*="readium-night-on"] *[epub\:type~="titlepage"] img:only-child, - :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child { - -webkit-filter: none !important; - filter: none !important; + :root[style*="readium-night-on"] *[epub|type~="titlepage"] img:only-child{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-invert-on"] img { - -webkit-filter: none !important; - filter: none !important; + + :root[style*="readium-night-on"][style*="readium-invert-on"] img{ + -webkit-filter:none !important; + filter:none !important; } - :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img { - -webkit-filter: brightness(80%); - filter: brightness(80%); + + :root[style*="readium-night-on"][style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%); + filter:brightness(80%); } } -@media screen and (monochrome) { - /* Grayscale (Implemented in Safari, what about eInk?) */ - /* Must deal with anything color (contrast) so must be managed at the night/sepia/theme level :( */ +@media screen and (monochrome){ } -@media screen and (prefers-reduced-motion) { - /* If reduced motion is set on MacOS, in case we have animation/transition */ +@media screen and (prefers-reduced-motion){ } -/* Readium CSS - Columns number pref - - A submodule managing columns number for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -/* Number of columns = 1 | 2 */ - -/* We still need to see if we allow users to force number of columns for all configs, currently it behaves as an "auto" setting */ - -/* apply col setting except for mobile portrait */ - -@media screen and (min-width: 60em), screen and (min-device-width: 36em) and (max-device-width: 47em) and (orientation: landscape) { - :root[style*="--USER__colCount: 1"], - :root[style*="--USER__colCount:1"], - :root[style*="--USER__colCount: 2"], - :root[style*="--USER__colCount:2"] { - -webkit-column-count: var(--USER__colCount); - -moz-column-count: var(--USER__colCount); - column-count: var(--USER__colCount); - } - - /* If one column, make sure we limit line-length */ - :root[style*="--USER__colCount: 1"], - :root[style*="--USER__colCount:1"] { - --RS__maxLineLength: 40rem !important; /* This is the only way for the user setting to work in webkit… */ - --RS__colWidth: 100vw; - } - - /* If smartphone landscape, and 2 columns, col width the same as iPad landscape + desktop */ - :root[style*="--USER__colCount: 2"], - :root[style*="--USER__colCount:2"] { - --RS__colWidth: auto; /* User explicitely tells he/she wants 2 columns, we reset floor value */ - } +:root[style*="--USER__backgroundColor"]{ + background-color:var(--USER__backgroundColor) !important; } -/* Readium CSS - Page margins pref - - A submodule managing page margins for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -/* Page Margins: the user margin is a factor of the page gutter e.g. 0.5, 0.75, 1, 1.25, 1.5, etc. */ - -:root[style*="--USER__pageMargins"] body { - padding: 0 calc(var(--RS__pageGutter) * var(--USER__pageMargins)) !important; +:root[style*="--USER__backgroundColor"] *{ + background-color:transparent !important; } -/* Readium CSS - Custom colors pref - - A submodule managing custom colors for user settings - Part of “Chrome Advanced” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="--USER__backgroundColor"] { - background-color: var(--USER__backgroundColor) !important; +:root[style*="--USER__textColor"]{ + color:var(--USER__textColor) !important; } -:root[style*="--USER__backgroundColor"] * { - background-color: transparent !important; +:root[style*="--USER__textColor"] *:not(a){ + color:inherit !important; + background-color:transparent !important; + border-color:currentcolor !important; } -:root[style*="--USER__textColor"] { - color: var(--USER__textColor) !important; +:root[style*="--USER__textColor"] svg text{ + fill:currentcolor !important; + stroke:none !important; } -:root[style*="--USER__textColor"] *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(pre) { - color: inherit !important; +:root[style*="--USER__linkColor"] a:link, +:root[style*="--USER__linkColor"] a:link *{ + color:var(--USER__linkColor) !important; } -/* Readium CSS - Text align pref - - A submodule managing text-align for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-advanced-on"][style*="--USER__textAlign"] { - text-align: var(--USER__textAlign); +:root[style*="--USER__visitedColor"] a:visited, +:root[style*="--USER__visitedColor"] a:visited *{ + color:var(--USER__visitedColor) !important; } -:root[style*="readium-advanced-on"][style*="--USER__textAlign"] body, -:root[style*="readium-advanced-on"][style*="--USER__textAlign"] *:not(blockquote):not(figcaption) p, -:root[style*="readium-advanced-on"][style*="--USER__textAlign"] li { - text-align: inherit !important; - -moz-text-align-last: auto !important; - -epub-text-align-last: auto !important; - text-align-last: auto !important; +:root[style*="--USER__selectionBackgroundColor"][style*="--USER__selectionTextColor"] ::-moz-selection{ + color:var(--USER__selectionTextColor) !important; + background-color:var(--USER__selectionBackgroundColor) !important; } -/* In case something goes wrong at the programmatic level + rtl for body + rtl in ltr */ - -:root[style*="readium-advanced-on"][dir="rtl"][style*="--USER__textAlign: left"], -:root[style*="readium-advanced-on"][dir="rtl"][style*="--USER__textAlign:left"], -:root[style*="readium-advanced-on"][style*="--USER__textAlign: left"] *[dir="rtl"], -:root[style*="readium-advanced-on"][style*="--USER__textAlign:left"] *[dir="rtl"] { - text-align: right; +:root[style*="--USER__selectionBackgroundColor"][style*="--USER__selectionTextColor"] ::selection{ + color:var(--USER__selectionTextColor) !important; + background-color:var(--USER__selectionBackgroundColor) !important; } -/* Edge, if logical value is used, think of it as a polyfill. For LTR, it will fall back to the default, which is left */ +:root[style*="--USER__colCount"]{ + -webkit-column-count:var(--USER__colCount); + -moz-column-count:var(--USER__colCount); + column-count:var(--USER__colCount); -:root[style*="readium-advanced-on"][dir="rtl"][style*="--USER__textAlign: start"], -:root[style*="readium-advanced-on"][dir="rtl"][style*="--USER__textAlign:start"] { - text-align: right; + --RS__colWidth:auto; } -/* Readium CSS - Font Family pref +:root[style*="--USER__colCount: 0"], +:root[style*="--USER__colCount:0"]{ + -webkit-column-count:1; + -moz-column-count:1; + column-count:1; +} - A submodule managing font-family for user settings - Part of “User Overrides” class – “font override” flag required. +:root[style*="--USER__colCount: 0"], +:root[style*="--USER__colCount:0"], +:root[style*="--USER__colCount: 1"], +:root[style*="--USER__colCount:1"]{ + --RS__colWidth:100vw; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="--USER__lineLength"] body{ + max-width:var(--USER__lineLength) !important; + } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] { - font-family: var(--USER__fontFamily) !important; +:root[style*="--USER__textAlign"]{ + text-align:var(--USER__textAlign); } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] body, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] p, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] li, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] div, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] dt, -:root[style*="readium-font-on"][style*="--USER__fontFamily"] dd { - font-family: inherit !important; +:root[style*="--USER__textAlign"] body, +:root[style*="--USER__textAlign"] p:not(blockquote p):not(figcaption p):not(hgroup p), +:root[style*="--USER__textAlign"] li, +:root[style*="--USER__textAlign"] dd{ + text-align:var(--USER__textAlign) !important; + -moz-text-align-last:auto !important; + -epub-text-align-last:auto !important; + text-align-last:auto !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] i:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] i:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] em:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] em:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] cite:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] cite:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] b:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] b:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] strong:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] strong:not([xml\:lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] span:not([lang]), -:root[style*="readium-font-on"][style*="--USER__fontFamily"] span:not([xml\:lang]) { - font-family: inherit !important; +:root[style*="readium-font-on"][style*="--USER__fontFamily"]{ + font-family:var(--USER__fontFamily) !important; } -/* Readium CSS - Font size pref - - A submodule managing font-size for user settings - Part of “User Overrides” class – no flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="--USER__fontSize"] { - font-size: var(--USER__fontSize) !important; +:root[style*="readium-font-on"][style*="--USER__fontFamily"] *{ + font-family:revert !important; } -/* Readium CSS - Line height pref - - A submodule managing line-height for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. +:root:not([style*="readium-deprecatedFontSize-on"])[style*="--USER__fontSize"] body{ + zoom:var(--USER__fontSize) !important; +} - Repo: https://github.com/readium/readium-css */ +@supports not (zoom: 1){ -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] { - line-height: var(--USER__lineHeight) !important; + :root[style*="--USER__fontSize"]{ + font-size:var(--USER__fontSize) !important; + } } -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] body, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] p, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] li, -:root[style*="readium-advanced-on"][style*="--USER__lineHeight"] div { - line-height: inherit; +:root[style*="readium-deprecatedFontSize-on"][style*="--USER__fontSize"]{ + font-size:var(--USER__fontSize) !important; } -/* Readium CSS - Para spacing pref - - A submodule managing paragraphs’ top and bottom margins for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-advanced-on"][style*="--USER__paraSpacing"] p { - margin-top: var(--USER__paraSpacing) !important; - margin-bottom: var(--USER__paraSpacing) !important; +:root[style*="--USER__lineHeight"]{ + line-height:var(--USER__lineHeight) !important; } -/* Readium CSS - Para indent pref - - A submodule managing paragraphs’ text-indent for user settings - Part of “User Overrides Advanced” class – “advanced settings” flag required. - - Repo: https://github.com/readium/readium-css */ - -:root[style*="readium-advanced-on"][style*="--USER__paraIndent"] p { - text-indent: var(--USER__paraIndent) !important; +:root[style*="--USER__lineHeight"] body, +:root[style*="--USER__lineHeight"] p, +:root[style*="--USER__lineHeight"] li, +:root[style*="--USER__lineHeight"] div{ + line-height:inherit; } -/* If there are inline-block elements in paragraphs, text-indent will inherit so we must reset it */ +:root[style*="--USER__paraSpacing"] p{ + margin-top:var(--USER__paraSpacing) !important; + margin-bottom:var(--USER__paraSpacing) !important; +} -:root[style*="readium-advanced-on"][style*="--USER__paraIndent"] p *, -:root[style*="readium-advanced-on"][style*="--USER__paraIndent"] p:first-letter { - text-indent: 0 !important; +:root[style*="--USER__paraIndent"] p{ + text-indent:var(--USER__paraIndent) !important; } -/* Readium CSS - Ligatures pref +:root[style*="--USER__paraIndent"] p *, +:root[style*="--USER__paraIndent"] p:first-letter{ + text-indent:0 !important; +} - A submodule managing ligatures for user settings in the Arabic Script (can help with a11y) - Part of “User Overrides Advanced” class – “advanced settings” flag required. +:root[style*="--USER__wordSpacing"] h1, +:root[style*="--USER__wordSpacing"] h2, +:root[style*="--USER__wordSpacing"] h3, +:root[style*="--USER__wordSpacing"] h4, +:root[style*="--USER__wordSpacing"] h5, +:root[style*="--USER__wordSpacing"] h6, +:root[style*="--USER__wordSpacing"] p, +:root[style*="--USER__wordSpacing"] li, +:root[style*="--USER__wordSpacing"] div, +:root[style*="--USER__wordSpacing"] dt, +:root[style*="--USER__wordSpacing"] dd{ + word-spacing:var(--USER__wordSpacing); +} - Repo: https://github.com/readium/readium-css */ +:root[style*="--USER__ligatures"]{ + font-variant-ligatures:var(--USER__ligatures) !important; +} -:root[style*="readium-advanced-on"][style*="--USER__arabicLigatures"] { - font-variant-ligatures: var(--USER__ligatures) !important; +:root[style*="--USER__ligatures"] *{ + font-variant-ligatures:inherit !important; } -:root[style*="readium-advanced-on"][style*="--USER__arabicLigatures"] * { - font-variant-ligatures: inherit !important; +:root[style*="readium-font-on"][style*="--USER__fontWeight"] body{ + font-weight:var(--USER__fontWeight) !important; } -/* Readium CSS - Font size normalize +:root[style*="readium-font-on"][style*="--USER__fontWeight"] b, +:root[style*="readium-font-on"][style*="--USER__fontWeight"] strong{ + font-weight:bolder; +} - A stylesheet to normalize font-size +:root[style*="readium-font-on"][style*="--USER__fontWidth"] body{ + font-stretch:var(--USER__fontWidth) !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-font-on"][style*="--USER__fontOpticalSizing"] body{ + font-optical-sizing:var(--USER__fontOpticalSizing) !important; +} -/* STYLES */ +:root[style*="readium-blend-on"] svg, +:root[style*="readium-blend-on"] img{ + background-color:transparent !important; + mix-blend-mode:multiply !important; +} -/* :root is used so that you can quickly add a class or attribute if you prefer e.g. `:root[data-rs-normalize]` */ +:root[style*="--USER__darkenImages"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) !important; + filter:brightness(var(--USER__darkenImages)) !important; +} -/* We create a default so that you don’t need to explicitly set one in the DOM. - Once the “Publisher’s styles” checkbox is unchecked, the normalize is applied automatically */ +:root[style*="readium-darken-on"] img{ + -webkit-filter:brightness(80%) !important; + filter:brightness(80%) !important; +} -:root[style*="readium-advanced-on"] { - --USER__typeScale: 1.2; /* This is the default type scale you’ll find in most publications */ +:root[style*="--USER__invertImages"] img{ + -webkit-filter:invert(var(--USER__invertImages)) !important; + filter:invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] p, -:root[style*="readium-advanced-on"] li, -:root[style*="readium-advanced-on"] div, -:root[style*="readium-advanced-on"] pre, -:root[style*="readium-advanced-on"] dd { - font-size: 1rem !important; +:root[style*="readium-invert-on"] img{ + -webkit-filter:invert(100%) !important; + filter:invert(100%) !important; } -:root[style*="readium-advanced-on"] h1 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.75rem !important; - font-size: calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="--USER__darkenImages"][style*="--USER__invertImages"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) invert(var(--USER__invertImages)) !important; + filter:brightness(var(--USER__darkenImages)) invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] h2 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.5rem !important; - font-size: calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-darken-on"][style*="--USER__invertImages"] img{ + -webkit-filter:brightness(80%) invert(var(--USER__invertImages)) !important; + filter:brightness(80%) invert(var(--USER__invertImages)) !important; } -:root[style*="readium-advanced-on"] h3 { - /* Fallback if browser doesn’t support vars */ - font-size: 1.25rem !important; - font-size: calc(1rem * var(--USER__typeScale)) !important; +:root[style*="--USER__darkenImages"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(var(--USER__darkenImages)) invert(100%) !important; + filter:brightness(var(--USER__darkenImages)) invert(100%) !important; } -:root[style*="readium-advanced-on"] h4, -:root[style*="readium-advanced-on"] h5, -:root[style*="readium-advanced-on"] h6 { - font-size: 1rem !important; +:root[style*="readium-darken-on"][style*="readium-invert-on"] img{ + -webkit-filter:brightness(80%) invert(100%) !important; + filter:brightness(80%) invert(100%) !important; } -:root[style*="readium-advanced-on"] small { - font-size: smaller !important; +:root[style*="--USER__invertGaiji"] img[class*="gaiji"]{ + -webkit-filter:invert(var(--USER__invertGaiji)) !important; + filter:invert(var(--USER__invertGaiji)) !important; } -:root[style*="readium-advanced-on"] sub, -:root[style*="readium-advanced-on"] sup { - font-size: 67.5% !important; +:root[style*="readium-invertGaiji-on"] img[class*="gaiji"]{ + -webkit-filter:invert(100%) !important; + filter:invert(100%) !important; } -/* The following styles kick in if you define the typeScale variable in the DOM. - No need to repeat declarations which don’t make use of the variable */ +:root[style*="readium-normalize-on"]{ + --USER__typeScale:1.2; +} -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h1 { - font-size: calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] p, +:root[style*="readium-normalize-on"] li, +:root[style*="readium-normalize-on"] div, +:root[style*="readium-normalize-on"] pre, +:root[style*="readium-normalize-on"] dd{ + font-size:1rem !important; } -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h2 { - font-size: calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] h1{ + font-size:1.75rem !important; + font-size:calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -:root[style*="readium-advanced-on"][style*="--USER__typeScale"] h3 { - font-size: calc(1rem * var(--USER__typeScale)) !important; +:root[style*="readium-normalize-on"] h2{ + font-size:1.5rem !important; + font-size:calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -/* Readium CSS - Default highlights +:root[style*="readium-normalize-on"] h3{ + font-size:1.25rem !important; + font-size:calc(1rem * var(--USER__typeScale)) !important; +} - A stylesheet for user highlights +:root[style*="readium-normalize-on"] h4, +:root[style*="readium-normalize-on"] h5, +:root[style*="readium-normalize-on"] h6{ + font-size:1rem !important; +} - Repo: https://github.com/readium/readium-css */ +:root[style*="readium-normalize-on"] small{ + font-size:smaller !important; +} -/* User Highlights */ +:root[style*="readium-normalize-on"] sub, +:root[style*="readium-normalize-on"] sup{ + font-size:67.5% !important; +} -.readiumCSS-yellow-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-yellow-highlight, -:root[style*="readium-night-on"] .readiumCSS-yellow-highlight { - background-color: rgba(255, 255, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h1{ + font-size:calc(((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -.readiumCSS-green-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-green-highlight, -:root[style*="readium-night-on"] .readiumCSS-green-highlight { - background-color: rgba(0, 255, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h2{ + font-size:calc((1rem * var(--USER__typeScale)) * var(--USER__typeScale)) !important; } -.readiumCSS-orange-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-orange-highlight, -:root[style*="readium-night-on"] .readiumCSS-orange-highlight { - background-color: rgba(255, 165, 0, 0.5) !important; +:root[style*="readium-normalize-on"][style*="--USER__typeScale"] h3{ + font-size:calc(1rem * var(--USER__typeScale)) !important; } -.readiumCSS-pink-highlight, -:root[style*="readium-sepia-on"] .readiumCSS-pink-highlight, -:root[style*="readium-night-on"] .readiumCSS-pink-highlight { - background-color: rgba(255, 105, 180, 0.5) !important; +:root[style*="readium-iPadOSPatch-on"] body{ + -webkit-text-size-adjust:none; } -/* Media overlays */ +:root[style*="readium-iPadOSPatch-on"] p, +:root[style*="readium-iPadOSPatch-on"] h1, +:root[style*="readium-iPadOSPatch-on"] h2, +:root[style*="readium-iPadOSPatch-on"] h3, +:root[style*="readium-iPadOSPatch-on"] h4, +:root[style*="readium-iPadOSPatch-on"] h5, +:root[style*="readium-iPadOSPatch-on"] h6, +:root[style*="readium-iPadOSPatch-on"] li, +:root[style*="readium-iPadOSPatch-on"] th, +:root[style*="readium-iPadOSPatch-on"] td, +:root[style*="readium-iPadOSPatch-on"] dt, +:root[style*="readium-iPadOSPatch-on"] dd, +:root[style*="readium-iPadOSPatch-on"] pre, +:root[style*="readium-iPadOSPatch-on"] address, +:root[style*="readium-iPadOSPatch-on"] details, +:root[style*="readium-iPadOSPatch-on"] summary, +:root[style*="readium-iPadOSPatch-on"] figcaption, +:root[style*="readium-iPadOSPatch-on"] div:not(:has(p, h1, h2, h3, h4, h5, h6, li, th, td, dt, dd, pre, address, aside, details, figcaption, summary)), +:root[style*="readium-iPadOSPatch-on"] aside:not(:has(p, h1, h2, h3, h4, h5, h6, li, th, td, dt, dd, pre, address, aside, details, figcaption, summary)){ + -webkit-text-zoom:reset; +} -.readiumCSS-mo-active-default { - color: black !important; - background-color: yellow !important; +:root[style*="readium-iPadOSPatch-on"] abbr, +:root[style*="readium-iPadOSPatch-on"] b, +:root[style*="readium-iPadOSPatch-on"] bdi, +:root[style*="readium-iPadOSPatch-on"] bdo, +:root[style*="readium-iPadOSPatch-on"] cite, +:root[style*="readium-iPadOSPatch-on"] code, +:root[style*="readium-iPadOSPatch-on"] dfn, +:root[style*="readium-iPadOSPatch-on"] em, +:root[style*="readium-iPadOSPatch-on"] i, +:root[style*="readium-iPadOSPatch-on"] kbd, +:root[style*="readium-iPadOSPatch-on"] mark, +:root[style*="readium-iPadOSPatch-on"] q, +:root[style*="readium-iPadOSPatch-on"] rp, +:root[style*="readium-iPadOSPatch-on"] rt, +:root[style*="readium-iPadOSPatch-on"] ruby, +:root[style*="readium-iPadOSPatch-on"] s, +:root[style*="readium-iPadOSPatch-on"] samp, +:root[style*="readium-iPadOSPatch-on"] small, +:root[style*="readium-iPadOSPatch-on"] span, +:root[style*="readium-iPadOSPatch-on"] strong, +:root[style*="readium-iPadOSPatch-on"] sub, +:root[style*="readium-iPadOSPatch-on"] sup, +:root[style*="readium-iPadOSPatch-on"] time, +:root[style*="readium-iPadOSPatch-on"] u, +:root[style*="readium-iPadOSPatch-on"] var{ + -webkit-text-zoom:normal; } -/*# sourceMappingURL=ReadiumCSS-after.css.map */ \ No newline at end of file + +:root[style*="readium-iPadOSPatch-on"] p:not(:has(b, cite, em, i, q, s, small, span, strong)):first-line{ + -webkit-text-zoom:normal; +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css index dcb79fffd..935895930 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css @@ -1,615 +1,411 @@ -/* Readium CSS - Config module - - A file allowing implementers to customize flags for reading modes, - user settings, etc. - - Repo: https://github.com/readium/readium-css */ - -/* Custom medias - Syntax: @custom-media --variable (prop: value) */ - -/* Responsive columns - The minimum width for which responsive columns (2 -> 1 and vice versa, - depending on the current font-size) must be enabled */ - -/* Mobile columns - The minimum and maximum width for mobile devices. - We’re forcing the landscape orientation by default, - and must still investigate large tablets (iPad Pro, Surface Pro 3, etc.). */ - -/* Custom selectors - Syntax: @custom-selector :--variable selector - The selectors you will use for flags/switches - You can alternatively use classes or custom data-* attributes */ - -/* User view = paged | scrolled */ - -/* Font-family override */ - -/* Advanced settings */ - -/* Reading Modes */ - -/* Filters (images) */ - -/* Accessibility normalization */ - -/* Accessibility font. You can add selectors, using “, ” as a separator, if you have multiple fonts */ - -/* Direction i.e. ltr and rtl */ - -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Base module - - A minimal stylesheet for all ebooks - - Repo: https://github.com/readium/readium-css */ - -/* Define viewport, HTML5-style */ - -@-ms-viewport { - width: device-width; +@-ms-viewport{ + width:device-width; } -@viewport { - width: device-width; - zoom: 1; +@viewport{ + width:device-width; + zoom:1; } -:root { - /* Default font-stacks */ - --RS__oldStyleTf: "Iowan Old Style", "Sitka Text", Palatino, "Book Antiqua", serif; - --RS__modernTf: Athelas, Constantia, Georgia, serif; - --RS__sansTf: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; - --RS__humanistTf: Seravek, Calibri, Roboto, Arial, sans-serif; - --RS__monospaceTf: "Andale Mono", Consolas, monospace; +:root{ - /* Config */ - --RS__baseFontFamily: var(--RS__oldStyleTf); + --RS__monospaceTf:ui-monospace, 'Andale Mono', 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace; - /* For square-ish fonts (CJK, Indic, etc.), we must apply some compensation in dynamic leading. Default is 1 i.e. no compensation */ - --RS__lineHeightCompensation: 1; + --RS__humanistTf:Seravek, Calibri, 'Gill Sans Nova', Roboto, Ubuntu, 'DejaVu Sans', source-sans-pro, sans-serif; - /* Dynamic leading based on typeface metrics + font-size setting */ - --RS__baseLineHeight: calc((1em + (2ex - 1ch) - ((1rem - 16px) * 0.1667)) * var(--RS__lineHeightCompensation)); -} + --RS__sansTf:-ui-sans-serif, -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI Variable', 'Segoe UI', Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Liberation Sans', Arial, sans-serif; + + --RS__modernTf:Athelas, Constantia, Charter, 'Bitstream Charter', Cambria, 'Georgia Pro', Georgia, serif; -/* Set default font for the html doc, so that it can be overridden by the authors’s stylesheet */ + --RS__oldStyleTf:'Iowan Old Style', Sitka, 'Sitka Text', Palatino, 'Book Antiqua', 'URW Palladio L', P052, serif; + --RS__baseFontFamily:var(--RS__oldStyleTf); + --RS__lineHeightCompensation:1; -html { - font-family: var(--RS__baseFontFamily); - /* Fallback line-height */ - line-height: 1.6; /* Fits a little bit better for all languages than 1.5 */ - line-height: var(--RS__baseLineHeight); - text-rendering: optimizeLegibility; + --RS__baseLineHeight:calc(1.5 * var(--RS__lineHeightCompensation)); } -/* 1.5 being too loose with larger font-sizes, we reset headings to normal (which value is 1.125–1.375 for our font-stacks) */ +html{ + font-family:var(--RS__baseFontFamily); + line-height:1.6; + line-height:var(--RS__baseLineHeight); + text-rendering:optimizelegibility; +} -h1, h2, h3 { - line-height: normal; +h1, h2, h3{ + line-height:normal; } :lang(ja), :lang(zh), -:lang(ko) { - word-wrap: break-word; - -webkit-line-break: strict; - -epub-line-break: strict; - line-break: strict; +:lang(ko){ + word-wrap:break-word; + -webkit-line-break:strict; + -epub-line-break:strict; + line-break:strict; } -/* Set default font for Math */ - -math { - font-family: "Latin Modern Math", "STIX Two Math", "XITS Math", "STIX Math", "Libertinus Math", "TeX Gyre Termes Math", "TeX Gyre Bonum Math", "TeX Gyre Schola", "DejaVu Math TeX Gyre", "TeX Gyre Pagella Math", "Asana Math", "Cambria Math", "Lucida Bright Math", "Minion Math", STIXGeneral, STIXSizeOneSym, Symbol, "Times New Roman", serif; +math{ + font-family:"Latin Modern Math", "STIX Two Math", "XITS Math", "STIX Math", "Libertinus Math", "TeX Gyre Termes Math", "TeX Gyre Bonum Math", "TeX Gyre Schola", "DejaVu Math TeX Gyre", "TeX Gyre Pagella Math", "Asana Math", "Cambria Math", "Lucida Bright Math", "Minion Math", STIXGeneral, STIXSizeOneSym, Symbol, "Times New Roman", serif; } -/* Language Overrides - That will only work if either html or body have a (xml:)lang attribute, not for inline overrides */ - -:lang(am) { - --RS__baseFontFamily: Kefa, Nyala, Roboto, Noto, "Noto Sans Ethiopic", serif; - --RS__lineHeightCompensation: 1.167; +:lang(am){ + --RS__baseFontFamily:kefa, nyala, roboto, noto, "Noto Sans Ethiopic", serif; + --RS__lineHeightCompensation:1.167; } -:lang(ar) { - --RS__baseFontFamily: "Geeza Pro", "Arabic Typesetting", Roboto, Noto, "Noto Naskh Arabic", "Times New Roman", serif; +:lang(ar){ + --RS__baseFontFamily:"Geeza Pro", "Arabic Typesetting", roboto, noto, "Noto Naskh Arabic", "Times New Roman", serif; } -:lang(bn) { - --RS__baseFontFamily: "Kohinoor Bangla", "Bangla Sangam MN", Vrinda, Roboto, Noto, "Noto Sans Bengali", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(bn){ + --RS__baseFontFamily:"Kohinoor Bangla", "Bangla Sangam MN", vrinda, roboto, noto, "Noto Sans Bengali", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(bo) { - --RS__baseFontFamily: Kailasa, "Microsoft Himalaya", Roboto, Noto, "Noto Sans Tibetan", sans-serif; +:lang(bo){ + --RS__baseFontFamily:kailasa, "Microsoft Himalaya", roboto, noto, "Noto Sans Tibetan", sans-serif; } -:lang(chr) { - --RS__baseFontFamily: "Plantagenet Cherokee", Roboto, Noto, "Noto Sans Cherokee"; - --RS__lineHeightCompensation: 1.167; +:lang(chr){ + --RS__baseFontFamily:"Plantagenet Cherokee", roboto, noto, "Noto Sans Cherokee"; + --RS__lineHeightCompensation:1.167; } -:lang(fa) { - --RS__baseFontFamily: "Geeza Pro", "Arabic Typesetting", Roboto, Noto, "Noto Naskh Arabic", "Times New Roman", serif; +:lang(fa){ + --RS__baseFontFamily:"Geeza Pro", "Arabic Typesetting", roboto, noto, "Noto Naskh Arabic", "Times New Roman", serif; } -:lang(gu) { - --RS__baseFontFamily: "Gujarati Sangam MN", "Nirmala UI", Shruti, Roboto, Noto, "Noto Sans Gujarati", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(gu){ + --RS__baseFontFamily:"Gujarati Sangam MN", "Nirmala UI", shruti, roboto, noto, "Noto Sans Gujarati", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(he) { - --RS__baseFontFamily: "New Peninim MT", "Arial Hebrew", Gisha, "Times New Roman", Roboto, Noto, "Noto Sans Hebrew" sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(he){ + --RS__baseFontFamily:"New Peninim MT", "Arial Hebrew", gisha, "Times New Roman", roboto, noto, "Noto Sans Hebrew" sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(hi) { - --RS__baseFontFamily: "Kohinoor Devanagari", "Devanagari Sangam MN", Kokila, "Nirmala UI", Roboto, Noto, "Noto Sans Devanagari", sans-serif; +:lang(hi){ + --RS__baseFontFamily:"Kohinoor Devanagari", "Devanagari Sangam MN", kokila, "Nirmala UI", roboto, noto, "Noto Sans Devanagari", sans-serif; - --RS__lineHeightCompensation: 1.1; + --RS__lineHeightCompensation:1.1; } -:lang(hy) { - --RS__baseFontFamily: Mshtakan, Sylfaen, Roboto, Noto, "Noto Serif Armenian", serif; +:lang(hy){ + --RS__baseFontFamily:mshtakan, sylfaen, roboto, noto, "Noto Serif Armenian", serif; } -:lang(iu) { - --RS__baseFontFamily: "Euphemia UCAS", Euphemia, Roboto, Noto, "Noto Sans Canadian Aboriginal", sans-serif; +:lang(iu){ + --RS__baseFontFamily:"Euphemia UCAS", euphemia, roboto, noto, "Noto Sans Canadian Aboriginal", sans-serif; } -:lang(ja) { - --RS__baseFontFamily: "游ゴシック体", YuGothic, "ヒラギノ丸ゴ", "Hiragino Sans", "Yu Gothic UI", "Meiryo UI", "MS Gothic", Roboto, Noto, "Noto Sans CJK JP", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; - - /* Extra variables for Japanese font-stacks as we may want to reuse them for user settings + default */ - --RS__serif-ja: "MS P明朝", "MS PMincho", "Hiragino Mincho Pro", "ヒラギノ明朝 Pro W3", "游明朝", "YuMincho", "MS 明朝", "MS Mincho", "Hiragino Mincho ProN", serif; - --RS__sans-serif-ja: "MS Pゴシック", "MS PGothic", "Hiragino Kaku Gothic Pro W3", "ヒラギノ角ゴ Pro W3", "Hiragino Sans GB", "ヒラギノ角ゴシック W3", "游ゴシック", "YuGothic", "MS ゴシック", "MS Gothic", "Hiragino Sans", sans-serif; - --RS__serif-ja-v: "MS 明朝", "MS Mincho", "Hiragino Mincho Pro", "ヒラギノ明朝 Pro W3", "游明朝", "YuMincho", "MS P明朝", "MS PMincho", "Hiragino Mincho ProN", serif; - --RS__sans-serif-ja-v: "MS ゴシック", "MS Gothic", "Hiragino Kaku Gothic Pro W3", "ヒラギノ角ゴ Pro W3", "Hiragino Sans GB", "ヒラギノ角ゴシック W3", "游ゴシック", "YuGothic", "MS Pゴシック", "MS PGothic", "Hiragino Sans", sans-serif; +:lang(ja){ + --RS__baseFontFamily:yugothic, "Hiragino Maru Gothic ProN", "Hiragino Sans", "Yu Gothic UI", "Meiryo UI", "MS Gothic", roboto, noto, "Noto Sans CJK JP", sans-serif; + --RS__lineHeightCompensation:1.167; + --RS__serif-ja:"Hiragino Mincho ProN", "Hiragino Mincho Pro", "YuMincho", "BIZ UDPMincho", "Yu Mincho", "MS P明朝", "MS PMincho", serif; + --RS__sans-serif-ja:"Hiragino Sans", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ W3", "YuGothic", "Yu Gothic Medium", "BIZ UDPGothic", "Yu Gothic", "MS Pゴシック", "MS PGothic", sans-serif; + --RS__serif-ja-v:"Hiragino Mincho ProN", "Hiragino Mincho Pro", "YuMincho", "BIZ UDMincho", "Yu Mincho", "MS明朝", "MS Mincho", serif; + --RS__sans-serif-ja-v:"Hiragino Sans", "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ W3", "YuGothic", "Yu Gothic Medium", "BIZ UDGothic", "Yu Gothic", "MSゴシック", "MS Gothic", sans-serif; } -:lang(km) { - --RS__baseFontFamily: "Khmer Sangam MN", "Leelawadee UI", "Khmer UI", Roboto, Noto, "Noto Sans Khmer", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(km){ + --RS__baseFontFamily:"Khmer Sangam MN", "Leelawadee UI", "Khmer UI", roboto, noto, "Noto Sans Khmer", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(kn) { - --RS__baseFontFamily: "Kannada Sangam MN", "Nirmala UI", Tunga, Roboto, Noto, "Noto Sans Kannada", sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(kn){ + --RS__baseFontFamily:"Kannada Sangam MN", "Nirmala UI", tunga, roboto, noto, "Noto Sans Kannada", sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(ko) { - --RS__baseFontFamily: "Nanum Gothic", "Apple SD Gothic Neo", "Malgun Gothic", Roboto, Noto, "Noto Sans CJK KR", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(ko){ + --RS__baseFontFamily:"Nanum Gothic", "Apple SD Gothic Neo", "Malgun Gothic", roboto, noto, "Noto Sans CJK KR", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(lo) { - --RS__baseFontFamily: "Lao Sangam MN", "Leelawadee UI", "Lao UI", Roboto, Noto, "Noto Sans Lao", sans-serif; +:lang(lo){ + --RS__baseFontFamily:"Lao Sangam MN", "Leelawadee UI", "Lao UI", roboto, noto, "Noto Sans Lao", sans-serif; } -:lang(ml) { - --RS__baseFontFamily: "Malayalam Sangam MN", "Nirmala UI", Kartika, Roboto, Noto, "Noto Sans Malayalam", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(ml){ + --RS__baseFontFamily:"Malayalam Sangam MN", "Nirmala UI", kartika, roboto, noto, "Noto Sans Malayalam", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(or) { - --RS__baseFontFamily: "Oriya Sangam MN", "Nirmala UI", Kalinga, Roboto, Noto, "Noto Sans Oriya", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(or){ + --RS__baseFontFamily:"Oriya Sangam MN", "Nirmala UI", kalinga, roboto, noto, "Noto Sans Oriya", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(pa) { - --RS__baseFontFamily: "Gurmukhi MN", "Nirmala UI", Kartika, Roboto, Noto, "Noto Sans Gurmukhi", sans-serif; - --RS__lineHeightCompensation: 1.1; +:lang(pa){ + --RS__baseFontFamily:"Gurmukhi MN", "Nirmala UI", kartika, roboto, noto, "Noto Sans Gurmukhi", sans-serif; + --RS__lineHeightCompensation:1.1; } -:lang(si) { - --RS__baseFontFamily: "Sinhala Sangam MN", "Nirmala UI", "Iskoola Pota", Roboto, Noto, "Noto Sans Sinhala", sans-serif; - --RS__lineHeightCompensation: 1.167; +:lang(si){ + --RS__baseFontFamily:"Sinhala Sangam MN", "Nirmala UI", "Iskoola Pota", roboto, noto, "Noto Sans Sinhala", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(ta) { - --RS__baseFontFamily: "Tamil Sangam MN", "Nirmala UI", Latha, Roboto, Noto, "Noto Sans Tamil", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(ta){ + --RS__baseFontFamily:"Tamil Sangam MN", "Nirmala UI", latha, roboto, noto, "Noto Sans Tamil", sans-serif; + --RS__lineHeightCompensation:1.067; } -:lang(te) { - --RS__baseFontFamily: "Kohinoor Telugu", "Telugu Sangam MN", "Nirmala UI", Gautami, Roboto, Noto, "Noto Sans Telugu", sans-serif; +:lang(te){ + --RS__baseFontFamily:"Kohinoor Telugu", "Telugu Sangam MN", "Nirmala UI", gautami, roboto, noto, "Noto Sans Telugu", sans-serif; } -:lang(th) { - --RS__baseFontFamily: "Thonburi", "Leelawadee UI", "Cordia New", Roboto, Noto, "Noto Sans Thai", sans-serif; - --RS__lineHeightCompensation: 1.067; +:lang(th){ + --RS__baseFontFamily:"Thonburi", "Leelawadee UI", "Cordia New", roboto, noto, "Noto Sans Thai", sans-serif; + --RS__lineHeightCompensation:1.067; } -/* The following will also work for zh-Hans */ - -:lang(zh) { - --RS__baseFontFamily: "方体", "PingFang SC", "黑体", "Heiti SC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK SC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh){ + --RS__baseFontFamily:"方体", "PingFang SC", "黑体", "Heiti SC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK SC", sans-serif; + --RS__lineHeightCompensation:1.167; } :lang(zh-Hant), -:lang(zh-TW) { - --RS__baseFontFamily: "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK TC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh-TW){ + --RS__baseFontFamily:"方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK TC", sans-serif; + --RS__lineHeightCompensation:1.167; } -:lang(zh-HK) { - --RS__baseFontFamily: "方體", "PingFang HK", "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", Roboto, Noto, "Noto Sans CJK TC", sans-serif; - - /* For CJK, the line-height is usually 15–20% more than for Latin */ - --RS__lineHeightCompensation: 1.167; +:lang(zh-HK){ + --RS__baseFontFamily:"方體", "PingFang HK", "方體", "PingFang TC", "黑體", "Heiti TC", "Microsoft JhengHei UI", "Microsoft JhengHei", roboto, noto, "Noto Sans CJK TC", sans-serif; + --RS__lineHeightCompensation:1.167; } -/* Readium CSS - Day/Default mode +:root{ - A preset theme for day mode, which is the default + --RS__selectionTextColor:inherit; - Repo: https://github.com/readium/readium-css */ + --RS__selectionBackgroundColor:#b4d8fe; -/* CONFIG */ + --RS__visitedColor:#551A8B; -:root { - --RS__backgroundColor: #FFFFFF; - --RS__textColor: #121212; + --RS__linkColor:#0000EE; - /* This can be customized but initial will re-use default value of the browser */ - --RS__selectionBackgroundColor: #b4d8fe; - --RS__selectionTextColor: inherit; -} + --RS__textColor:#121212; -:root { - color: var(--RS__textColor) !important; - background-color: var(--RS__backgroundColor) !important; + --RS__backgroundColor:#FFFFFF; } -/* Note: Though `::selection` was present in drafts of CSS Selectors Level 3, it was removed during the Candidate Recommendation phase because its behavior was under-specified (especially with nested elements) and interoperability wasn’t achieved. Source: https://developer.mozilla.org/en-US/docs/Web/CSS/::selection */ - -::-moz-selection { - color: var(--RS__selectionTextColor); - background-color: var(--RS__selectionBackgroundColor); +:root{ + color:var(--RS__textColor) !important; + background-color:var(--RS__backgroundColor) !important; } -::selection { - color: var(--RS__selectionTextColor); - background-color: var(--RS__selectionBackgroundColor); +::-moz-selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } -/* @import "modules/ReadiumCSS-fonts.css"; */ - -/* Readium CSS - HTML5 SR Patch stylesheet - - A set of style to adjust HTML5 Suggested Rendering to paginated content - - Repo: https://github.com/readium/readium-css */ - -/* Fragmentation */ - -body { - widows: 2; - orphans: 2; +::selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } -figcaption, th, td { - widows: 1; - orphans: 1; +body{ + widows:2; + orphans:2; } -h2, -h3, -h4, -h5, -h6, -dt, -hr, -caption { - -webkit-column-break-after: avoid; - page-break-after: avoid; - break-after: avoid; +figcaption, th, td{ + widows:1; + orphans:1; } -h1, -h2, -h3, -h4, -h5, -h6, -dt, -figure, -tr { - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid; +h2, h3, h4, h5, h6, dt, +hr, caption{ + -webkit-column-break-after:avoid; + page-break-after:avoid; + break-after:avoid; } -/* Hyphenation */ - -body { - -webkit-hyphenate-character: "\002D"; - -moz-hyphenate-character: "\002D"; - -ms-hyphenate-character: "\002D"; - hyphenate-character: "\002D"; - -webkit-hyphenate-limit-lines: 3; - -ms-hyphenate-limit-lines: 3; - hyphenate-limit-lines: 3; +h1, h2, h3, h4, h5, h6, dt, +figure, tr{ + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; } -h1, -h2, -h3, -h4, -h5, -h6, -dt, -figcaption, -pre, -caption, -address, -center, -code, -var { - -ms-hyphens: none; - -moz-hyphens: none; - -webkit-hyphens: none; - -epub-hyphens: none; - hyphens: none; +body{ + -webkit-hyphenate-character:"\002D"; + -moz-hyphenate-character:"\002D"; + -ms-hyphenate-character:"\002D"; + hyphenate-character:"\002D"; + -webkit-hyphenate-limit-lines:3; + -ms-hyphenate-limit-lines:3; + hyphenate-limit-lines:3; } -/* OTF */ +h1, h2, h3, h4, h5, h6, dt, +figcaption, pre, caption, address, +center, code, var{ + -ms-hyphens:none; + -moz-hyphens:none; + -webkit-hyphens:none; + -epub-hyphens:none; + hyphens:none; +} -body { - font-variant-numeric: oldstyle-nums proportional-nums; +body{ + font-variant-numeric:oldstyle-nums proportional-nums; } :lang(ja) body, :lang(zh) body, -:lang(ko) body { - font-variant-numeric: lining-nums proportional-nums; +:lang(ko) body{ + font-variant-numeric:lining-nums proportional-nums; } -h1, h2, h3, h4, h5, h6, dt { - font-variant-numeric: lining-nums proportional-nums; +h1, h2, h3, h4, h5, h6, dt{ + font-variant-numeric:lining-nums proportional-nums; } -table { - font-variant-numeric: lining-nums tabular-nums; +table{ + font-variant-numeric:lining-nums tabular-nums; } -code, var { - font-variant-ligatures: none; - font-variant-numeric: lining-nums tabular-nums slashed-zero; +code, var{ + font-variant-ligatures:none; + font-variant-numeric:lining-nums tabular-nums slashed-zero; } -rt { - font-variant-east-asian: ruby; +rt{ + font-variant-east-asian:ruby; } -:lang(ar) { - font-variant-ligatures: common-ligatures; +:lang(ar){ + font-variant-ligatures:common-ligatures; } -:lang(ko) { - font-kerning: normal; +:lang(ko){ + font-kerning:normal; } -/* Night mode */ - -hr { - color: inherit; - border-color: currentColor; -} - -table, th, td { - border-color: currentColor; -} - -/* Horizontal Spacing */ - -figure, blockquote { - margin: 1em 5%; +hr{ + color:inherit; + border-color:currentcolor; } -/* - -:lang(ja) figure, :lang(ja) blockquote, -:lang(zh-Hant) figure, :lang(zh-Hant) blockquote, -:lang(zh-TW) figure, :lang(zh-TW) blockquote, -:lang(mn) figure, :lang(mn) blockquote { - margin: 5% 1em; -} - -*/ - -ul, ol { - padding-left: 5%; +table, th, td{ + border-color:currentcolor; } -/* - -:lang(ja) ul, :lang(ja) ol, -:lang(zh-Hant) ul, :lang(zh-Hant) ol, -:lang(zh-TW) ul, :lang(zh-TW) ol, -:lang(mn) ul, :lang(mn) ol { - padding-top: 5%; +figure, blockquote{ + margin:1em 5%; } -*/ - -dd { - margin-left: 5%; +ul, ol{ + padding-left:5%; } -/* - -:lang(ja) dd, -:lang(zh-Hant) dd, -:lang(zh-TW) dd, -:lang(mn) dd { - margin-top: 5%; +dd{ + margin-left:5%; } -*/ - -pre { - white-space: pre-wrap; - -ms-tab-size: 2; - -moz-tab-size: 2; - -webkit-tab-size: 2; - tab-size: 2; +pre{ + white-space:pre-wrap; + -ms-tab-size:2; + -moz-tab-size:2; + -webkit-tab-size:2; + tab-size:2; } -/* Normalization */ - -abbr[title], acronym[title] { - text-decoration: dotted underline; +abbr[title], acronym[title]{ + text-decoration:dotted underline; } -nobr wbr { - white-space: normal; +nobr wbr{ + white-space:normal; } -/* Make ruby text and parentheses non-selectable (TBC) */ - -ruby > rt, ruby > rp { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; +ruby > rt, ruby > rp{ + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; } -/* Internationalization */ - -*:lang(ja), -*:lang(zh), -*:lang(ko), -:lang(ja) cite, -:lang(ja) dfn, -:lang(ja) em, -:lang(ja) i, -:lang(zh) cite, -:lang(zh) dfn, -:lang(zh) em, -:lang(zh) i, -:lang(ko) cite, -:lang(ko) dfn, -:lang(ko) em, -:lang(ko) i { - font-style: normal; +*:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)), +*:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)), +*:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)), +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) cite, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) dfn, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) em, +:lang(ja):not(:lang(ja-Latn)):not(:lang(ja-Cyrl)) i, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) cite, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) dfn, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) em, +:lang(zh):not(:lang(zh-Latn)):not(:lang(zh-Cyrl)) i, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) cite, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) dfn, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) em, +:lang(ko):not(:lang(ko-Latn)):not(:lang(ko-Cyrl)) i{ + font-style:normal; } :lang(ja) a, :lang(zh) a, -:lang(ko) a { - text-decoration: none; -} - -/* Readium CSS - Safeguards module - - A set of styles to prevent common issues in pagination - - Repo: https://github.com/readium/readium-css */ - -/* Config */ - -/* We’ll be using an "RS__" prefix so that we can prevent collisions with authors’ CSS */ - -:root { - /* max-width for media, you can override that via JS if not compiled to static */ - --RS__maxMediaWidth: 100%; - - /* max-height for media, you can override that via JS if not compiled to static - Please consider figures might have a figcaption, which is why 95vh in the first place */ - --RS__maxMediaHeight: 95vh; - - /* value for medias’ box-sizing */ - --RS__boxSizingMedia: border-box; - - /* value for table’s box-sizing */ - --RS__boxSizingTable: border-box; +:lang(ko) a{ + text-decoration:none; } -/* Sanitize line-heights in webkit e.g. raised cap without a declared line-height - See effect by checking this demo in Safari: https://codepen.io/JayPanoz/pen/gRmzrE - Note: glyphs has to be reset to inline for CJK */ - -html { - -webkit-line-box-contain: block glyphs replaced; -} - -:lang(ja) { - -webkit-line-box-contain: block inline replaced; +:root{ + --RS__maxMediaWidth:100%; + --RS__maxMediaHeight:95vh; + --RS__boxSizingMedia:border-box; + --RS__boxSizingTable:border-box; } -/* Wrap long strings if larger than line-length */ - -a, h1, h2, h3, h4, h5, h6 { - word-wrap: break-word; +a, a span, span a, h1, h2, h3, h4, h5, h6{ + word-wrap:break-word; } -div { - max-width: var(--RS__maxMediaWidth); +div{ + max-width:var(--RS__maxMediaWidth); } -/* Size medias */ - -/* You can override CSS variables by re-defining it for all elements or a specific one */ - -img, svg, audio, video { +img, svg|svg, video{ + object-fit:contain; - /* Object-fit allows us to keep the correct aspect-ratio */ - object-fit: contain; - - width: auto; - height: auto; - - /* Some files don’t have max-width */ - max-width: var(--RS__maxMediaWidth); - - /* We’re setting a max-height, especially for covers */ - max-height: var(--RS__maxMediaHeight) !important; - /* We probably don’t need to use modern box-sizing as auto behaves like it */ - box-sizing: var(--RS__boxSizingMedia); - - /* For page-break, we must use those 3 - We can’t use a variable there, webkit seems to no support them for those properties */ - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid; + width:auto; + height:auto; + max-width:var(--RS__maxMediaWidth); + max-height:var(--RS__maxMediaHeight) !important; + box-sizing:var(--RS__boxSizingMedia); + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; } -/* Try preventing border being cut-off, webkit + blink have content-box by default */ +audio{ + max-width:100%; + -webkit-column-break-inside:avoid; + page-break-inside:avoid; + break-inside:avoid; + } -table { - max-width: var(--RS__maxMediaWidth); - box-sizing: var(--RS__boxSizingTable); -} -/*# sourceMappingURL=ReadiumCSS-before.css.map */ \ No newline at end of file +table{ + max-width:var(--RS__maxMediaWidth); + box-sizing:var(--RS__boxSizingTable); +} \ No newline at end of file diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css index 18bb89311..c54777b89 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css @@ -1,189 +1,152 @@ -/* Readium CSS - Namespaces module - - Namespaces to import in all 3 dist stylesheets - - Repo: https://github.com/readium/readium-css */ +/* + * Readium CSS (v. 2.0.0-beta.13) + * Developers: Jiminy Panoz + * Copyright (c) 2017. Readium Foundation. All rights reserved. + * Use of this source code is governed by a BSD-style license which is detailed in the + * LICENSE file present in the project repository where this source code is maintained. +*/ @namespace url("http://www.w3.org/1999/xhtml"); @namespace epub url("http://www.idpf.org/2007/ops"); -@namespace m url("http://www.w3.org/1998/Math/MathML/"); +@namespace m url("http://www.w3.org/1998/Math/MathML"); @namespace svg url("http://www.w3.org/2000/svg"); -/* Readium CSS - Default module for RTL scripts - - A stylesheet for unstyled ebooks based on HTML5 Suggested Rendering - Note: works in combination with Base module - - Repo: https://github.com/readium/readium-css */ +:root{ + --RS__compFontFamily:var(--RS__baseFontFamily); + --RS__codeFontFamily:var(--RS__monospaceTf); -/* CONFIG */ + --RS__typeScale:1.125; + --RS__baseFontSize:100%; -:root { - --RS__compFontFamily: var(--RS__baseFontFamily); - --RS__codeFontFamily: var(--RS__monospaceTf); + --RS__flowSpacing:1.5rem; + --RS__paraSpacing:0; + --RS__paraIndent:1em; - --RS__typeScale: 1.125; /* 1.067 | 1.125 | 1.2 | 1.25 | 1.333 | 1.414 | 1.5 | 1.618 */ - --RS__baseFontSize: 100%; + --RS__linkColor:#0000EE; + --RS__visitedColor:#551A8B; - --RS__flowSpacing: 1.5rem; - --RS__paraSpacing: 0; - --RS__paraIndent: 1em; - - --RS__linkColor: #0000EE; - --RS__visitedColor: #551A8B; - - --RS__primaryColor: ; - --RS__secondaryColor: ; + --RS__primaryColor:; + --RS__secondaryColor:; } -/* STYLES */ - -/* Typo */ - -body { - font-size: var(--RS__baseFontSize); - text-align: justify; +body{ + font-size:var(--RS__baseFontSize); + text-align:justify; } -h1, h2, h3, h4, h5, h6 { - font-family: var(--RS__compFontFamily); - text-align: right; +h1, h2, h3, h4, h5, h6{ + font-family:var(--RS__compFontFamily); + text-align:right; } -/* Flow content */ - -blockquote, -figure, -p, -pre, -aside, -footer, -form, -hr { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); +blockquote, figure, p, pre, +aside, footer, form, hr{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); } -p { - margin-top: var(--RS__paraSpacing); - margin-bottom: var(--RS__paraSpacing); - text-indent: var(--RS__paraIndent); +p{ + margin-top:var(--RS__paraSpacing); + margin-bottom:var(--RS__paraSpacing); + text-indent:var(--RS__paraIndent); } -h1 + p, -h2 + p, -h3 + p, -h4 + p, -h5 + p, -h6 + p, -hr + p { - text-indent: 0; +h1 + p, h2 + p, h3 + p, h4 + p, h5 + p, h6 + p, +hr + p{ + text-indent:0; } -pre { - font-family: var(--RS__codeFontFamily); +pre{ + font-family:var(--RS__codeFontFamily); } -/* Phrasing content */ - -code, kbd, samp, tt { - font-family: var(--RS__codeFontFamily); +code, kbd, samp, tt{ + font-family:var(--RS__codeFontFamily); } -sub, sup { - position: relative; - font-size: 67.5%; - line-height: 1; +sub, sup{ + position:relative; + font-size:67.5%; + line-height:1; } -sub { - bottom: -0.2ex; +sub{ + bottom:-0.2ex; } -sup { - bottom: 0; +sup{ + bottom:0; } -:link { - color: var(--RS__linkColor); +:link{ + color:var(--RS__linkColor); } -:visited { - color: var(--RS__visitedColor); +:visited{ + color:var(--RS__visitedColor); } -/* Headings */ - -h1 { - margin-top: calc(var(--RS__flowSpacing) * 2); - margin-bottom: calc(var(--RS__flowSpacing) * 2); - /* The following is base font size * typescale power of 3 */ - font-size: calc(((1em * var(--RS__typeScale)) * var(--RS__typeScale)) * var(--RS__typeScale)); +h1{ + margin-top:calc(var(--RS__flowSpacing) * 2); + margin-bottom:calc(var(--RS__flowSpacing) * 2); + font-size:calc(((1em * var(--RS__typeScale)) * var(--RS__typeScale)) * var(--RS__typeScale)); } -h2 { - margin-top: calc(var(--RS__flowSpacing) * 2); - margin-bottom: var(--RS__flowSpacing); - /* The following is base font size * typescale power of 2 */ - font-size: calc((1em * var(--RS__typeScale)) * var(--RS__typeScale)); +h2{ + margin-top:calc(var(--RS__flowSpacing) * 2); + margin-bottom:var(--RS__flowSpacing); + font-size:calc((1em * var(--RS__typeScale)) * var(--RS__typeScale)); } -h3 { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); - font-size: calc(1em * var(--RS__typeScale)); +h3{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); + font-size:calc(1em * var(--RS__typeScale)); } -h4 { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); - font-size: 1em; +h4{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); + font-size:1em; } -h5 { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); - font-size: smaller; +h5{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); + font-size:smaller; } -h6 { - margin-top: var(--RS__flowSpacing); - margin-bottom: 0; - font-size: smaller; - font-weight: normal; +h6{ + margin-top:var(--RS__flowSpacing); + margin-bottom:0; + font-size:smaller; + font-weight:normal; } -/* Lists */ - -dl, ol, ul { - margin-top: var(--RS__flowSpacing); - margin-bottom: var(--RS__flowSpacing); +dl, ol, ul{ + margin-top:var(--RS__flowSpacing); + margin-bottom:var(--RS__flowSpacing); } -/* Table */ - -table { - margin: var(--RS__flowSpacing) 0; - border: 1px solid currentColor; - border-collapse: collapse; - empty-cells: show; +table{ + margin:var(--RS__flowSpacing) 0; + border:1px solid currentcolor; + border-collapse:collapse; + empty-cells:show; } -thead, tbody, tfoot, table > tr { - vertical-align: top; +thead, tbody, tfoot, table > tr{ + vertical-align:top; } -th { - text-align: initial; +th{ + text-align:initial; } -th, td { - padding: 4px; - border: 1px solid currentColor; -} -/*# sourceMappingURL=ReadiumCSS-default.css.map */ \ No newline at end of file +th, td{ + padding:4px; + border:1px solid currentcolor; +} \ No newline at end of file From 5004259d8d4610f973afd46cccd1eb58e4fa3f45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Tue, 17 Jun 2025 17:38:20 +0200 Subject: [PATCH 03/11] Update some of the Readium CSS properties --- .../Navigator/EPUB/CSS/CSSProperties.swift | 42 ++++----- Sources/Navigator/EPUB/CSS/ReadiumCSS.swift | 20 +++-- .../Preferences/EPUBPreferences+Legacy.swift | 6 +- .../EPUB/Preferences/EPUBPreferences.swift | 49 ++++++++-- .../Preferences/EPUBPreferencesEditor.swift | 39 ++++---- .../EPUB/Preferences/EPUBSettings.swift | 89 +++++++++++++++---- .../Common/Preferences/UserPreferences.swift | 23 ++--- 7 files changed, 178 insertions(+), 90 deletions(-) diff --git a/Sources/Navigator/EPUB/CSS/CSSProperties.swift b/Sources/Navigator/EPUB/CSS/CSSProperties.swift index c68e4b13b..4f9a2ac2d 100644 --- a/Sources/Navigator/EPUB/CSS/CSSProperties.swift +++ b/Sources/Navigator/EPUB/CSS/CSSProperties.swift @@ -34,7 +34,7 @@ public extension CSSProperties { /// User settings properties. /// -/// See https://readium.org/readium-css/docs/CSS19-api.html#user-settings +/// See https://readium.org/css/docs/CSS19-api.html#user-settings public struct CSSUserProperties: CSSProperties { // View mode @@ -43,18 +43,8 @@ public struct CSSUserProperties: CSSProperties { // Pagination - /// The number of columns (column-count) the user wants displayed (one-page view or two-page - /// spread). - /// - /// To reset, change the value to auto. - public var colCount: CSSColCount? - - /// A factor applied to horizontal margins (padding-left and padding-right) the user wants to - /// set. - /// - /// Recommended values: a range from 0.5 to 2. Increments are left to implementers’ judgment. - /// To reset, change the value to 1. - public var pageMargins: Double? + /// The number of columns (column-count) the user wants displayed. + public var colCount: Int? // Appearance @@ -120,6 +110,11 @@ public struct CSSUserProperties: CSSProperties { /// Requires: advancedSettings public var lineHeight: CSSLineHeight? + /// The `max-width` of `body` (to shrink or grow the line-length of body copy). + /// + /// Possible values: any value CSS property `max-width|height` accepts. + public var lineLength: CSSLength? + /// The vertical margins (margin-top and margin-bottom) for paragraphs. /// /// Recommended values: a range from 0 to 2rem. Increments are left to implementers’ judgment. @@ -167,8 +162,7 @@ public struct CSSUserProperties: CSSProperties { public init( view: CSSView? = nil, - colCount: CSSColCount? = nil, - pageMargins: Double? = nil, + colCount: Int? = nil, appearance: CSSAppearance? = nil, darkenImages: Bool? = nil, invertImages: Bool? = nil, @@ -181,6 +175,7 @@ public struct CSSUserProperties: CSSProperties { typeScale: Double? = nil, textAlign: CSSTextAlign? = nil, lineHeight: CSSLineHeight? = nil, + lineLength: CSSLength? = nil, paraSpacing: CSSLength? = nil, paraIndent: CSSRemLength? = nil, wordSpacing: CSSRemLength? = nil, @@ -192,7 +187,6 @@ public struct CSSUserProperties: CSSProperties { ) { self.view = view self.colCount = colCount - self.pageMargins = pageMargins self.appearance = appearance self.darkenImages = darkenImages self.invertImages = invertImages @@ -205,6 +199,7 @@ public struct CSSUserProperties: CSSProperties { self.typeScale = typeScale self.textAlign = textAlign self.lineHeight = lineHeight + self.lineLength = lineLength self.paraSpacing = paraSpacing self.paraIndent = paraIndent self.wordSpacing = wordSpacing @@ -222,7 +217,6 @@ public struct CSSUserProperties: CSSProperties { // Pagination props.putCSS(name: "--USER__colCount", value: colCount) - props.putCSS(name: "--USER__pageMargins", value: pageMargins) // Appearance props.putCSS(name: "--USER__appearance", value: appearance) @@ -238,11 +232,11 @@ public struct CSSUserProperties: CSSProperties { props.putCSS(name: "--USER__fontFamily", value: fontFamily) props.putCSS(name: "--USER__fontSize", value: fontSize) - // Advanced settings props.putCSS(name: "--USER__advancedSettings", value: CSSFlag(name: "advanced", isEnabled: advancedSettings)) props.putCSS(name: "--USER__typeScale", value: typeScale) props.putCSS(name: "--USER__textAlign", value: textAlign) props.putCSS(name: "--USER__lineHeight", value: lineHeight) + props.putCSS(name: "--USER__lineLength", value: lineLength) props.putCSS(name: "--USER__paraSpacing", value: paraSpacing) props.putCSS(name: "--USER__paraIndent", value: paraIndent) props.putCSS(name: "--USER__wordSpacing", value: wordSpacing) @@ -260,7 +254,7 @@ public struct CSSUserProperties: CSSProperties { /// Reading System properties. /// -/// See https://readium.org/readium-css/docs/CSS19-api.html#reading-system-styles +/// See https://readium.org/css/docs/CSS19-api.html#reading-system-styles public struct CSSRSProperties: CSSProperties { // Pagination @@ -268,7 +262,7 @@ public struct CSSRSProperties: CSSProperties { public var colWidth: CSSLength? /// @param colCount The optimal number of columns (depending on the columns’ width). - public var colCount: CSSColCount? + public var colCount: Int? /// @param colGap The gap between columns. You must account for this gap when scrolling. public var colGap: CSSAbsoluteLength? @@ -399,7 +393,7 @@ public struct CSSRSProperties: CSSProperties { public init( colWidth: CSSLength? = nil, - colCount: CSSColCount? = nil, + colCount: Int? = nil, colGap: CSSAbsoluteLength? = nil, pageGutter: CSSAbsoluteLength? = nil, flowSpacing: CSSLength? = nil, @@ -537,6 +531,7 @@ public enum CSSView: String, CSSConvertible { public func css() -> String? { rawValue } } +@available(*, unavailable, message: "Column count is now an integer") public enum CSSColCount: String, CSSConvertible { case auto case one = "1" @@ -838,6 +833,11 @@ private extension Dictionary where Key == String, Value == String? { self[name] = value?.css() } + mutating func putCSS(name: String, value: Int?) { + let css = value.map { String(format: "%d", $0) } + self[name] = css + } + mutating func putCSS(name: String, value: Double?) { let css = value.map { String(format: "%.5f", $0) } self[name] = css diff --git a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift index 4a3c94179..74864a134 100644 --- a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift +++ b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift @@ -25,14 +25,7 @@ extension ReadiumCSS { layout = settings.cssLayout userProperties = CSSUserProperties( view: settings.scroll ? .scroll : .paged, - colCount: { - switch settings.columnCount { - case .auto: return .auto - case .one: return .one - case .two: return .two - } - }(), - pageMargins: settings.pageMargins, + colCount: settings.columnCount, appearance: { switch settings.theme { case .light: return nil @@ -59,6 +52,7 @@ extension ReadiumCSS { } }(), lineHeight: settings.lineHeight.map { .unitless($0) }, + lineLength: CSSPercentLength(settings.horizontalMargins), paraSpacing: settings.paragraphSpacing.map { CSSRemLength($0) }, paraIndent: settings.paragraphIndent.map { CSSRemLength($0) }, wordSpacing: settings.wordSpacing.map { CSSRemLength($0) }, @@ -130,6 +124,16 @@ extension ReadiumCSS: HTMLInjectable { // https://github.com/readium/readium-css/issues/94 // https://github.com/readium/r2-navigator-kotlin/issues/193 inj.append(.style("audio[controls] { width: revert; height: revert; }")) + + // Fix broken pagination when a book contains `overflow-x: hidden`. + // https://github.com/readium/kotlin-toolkit/issues/292 + // Inspired by https://github.com/readium/readium-css/issues/119#issuecomment-1302348238 + inj.append(.style( + """ + :root[style], :root { overflow: visible !important; } + :root[style] > body, :root > body { overflow: visible !important; } + """ + )) return inj } diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift index 5dd2036db..bc23b92c6 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift @@ -33,19 +33,17 @@ public extension EPUBPreferences { return EPUBPreferences( backgroundColor: defaults.optString(for: .backgroundColor) .flatMap { Color(hex: $0) }, - columnCount: defaults.optInt(for: .columnCount) - .flatMap { (columnCountValues ?? defaultColumnCountValues).getOrNil($0) } - .flatMap { ColumnCount(rawValue: $0) }, + columnCount: defaults.optInt(for: .columnCount), fontFamily: defaults.optInt(for: .fontFamily) .takeIf { $0 != 0 } // Original .flatMap { (fontFamilyValues ?? defaultFontFamilyValues).getOrNil($0) } .map { FontFamily(rawValue: $0) }, fontSize: defaults.optDouble(for: .fontSize) .map { $0 / 100 }, + horizontalMargins: defaults.optDouble(for: .pageMargins), hyphens: defaults.optBool(for: .hyphens), letterSpacing: defaults.optDouble(for: .letterSpacing), lineHeight: defaults.optDouble(for: .lineHeight), - pageMargins: defaults.optDouble(for: .pageMargins), paragraphSpacing: defaults.optDouble(for: .paragraphMargins), publisherStyles: defaults.optBool(for: .publisherDefault), scroll: defaults.optBool(for: .scroll), diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift index ec9289a09..f63a3021b 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift @@ -14,9 +14,8 @@ public struct EPUBPreferences: ConfigurablePreferences { /// Default page background color. public var backgroundColor: Color? - /// Number of reflowable columns to display (one-page view or two-page - /// spread). - public var columnCount: ColumnCount? + /// Number of reflowable columns to display. + public var columnCount: Int? /// Default typeface for the text. public var fontFamily: FontFamily? @@ -44,9 +43,9 @@ public struct EPUBPreferences: ConfigurablePreferences { /// Leading line height. public var lineHeight: Double? - + /// Factor applied to horizontal margins. - public var pageMargins: Double? + public var horizontalMargins: Double? /// Text indentation for paragraphs. public var paragraphIndent: Double? @@ -96,17 +95,17 @@ public struct EPUBPreferences: ConfigurablePreferences { public init( backgroundColor: Color? = nil, - columnCount: ColumnCount? = nil, + columnCount: Int? = nil, fontFamily: FontFamily? = nil, fontSize: Double? = nil, fontWeight: Double? = nil, + horizontalMargins: Double? = nil, hyphens: Bool? = nil, imageFilter: ImageFilter? = nil, language: Language? = nil, letterSpacing: Double? = nil, ligatures: Bool? = nil, lineHeight: Double? = nil, - pageMargins: Double? = nil, paragraphIndent: Double? = nil, paragraphSpacing: Double? = nil, publisherStyles: Bool? = nil, @@ -126,13 +125,13 @@ public struct EPUBPreferences: ConfigurablePreferences { self.fontFamily = fontFamily self.fontSize = fontSize.map { max($0, 0) } self.fontWeight = fontWeight?.clamped(to: 0.0 ... 2.5) + self.horizontalMargins = horizontalMargins.map { max($0, 0) } self.hyphens = hyphens self.imageFilter = imageFilter self.language = language self.letterSpacing = letterSpacing.map { max($0, 0) } self.ligatures = ligatures self.lineHeight = lineHeight - self.pageMargins = pageMargins.map { max($0, 0) } self.paragraphIndent = paragraphIndent self.paragraphSpacing = paragraphSpacing.map { max($0, 0) } self.publisherStyles = publisherStyles @@ -155,13 +154,13 @@ public struct EPUBPreferences: ConfigurablePreferences { fontFamily: other.fontFamily ?? fontFamily, fontSize: other.fontSize ?? fontSize, fontWeight: other.fontWeight ?? fontWeight, + horizontalMargins: other.horizontalMargins ?? horizontalMargins, hyphens: other.hyphens ?? hyphens, imageFilter: other.imageFilter ?? imageFilter, language: other.language ?? language, letterSpacing: other.letterSpacing ?? letterSpacing, ligatures: other.ligatures ?? ligatures, lineHeight: other.lineHeight ?? lineHeight, - pageMargins: other.pageMargins ?? pageMargins, paragraphIndent: other.paragraphIndent ?? paragraphIndent, paragraphSpacing: other.paragraphSpacing ?? paragraphSpacing, publisherStyles: other.publisherStyles ?? publisherStyles, @@ -199,4 +198,36 @@ public struct EPUBPreferences: ConfigurablePreferences { verticalText: verticalText ) } + + @available(*, unavailable, renamed: "horizontalMargins") + public var pageMargins: Double? { nil } + + @available(*, unavailable, message: "Use the other initializer") + public init( + backgroundColor: Color? = nil, + columnCount: ColumnCount? = nil, + fontFamily: FontFamily? = nil, + fontSize: Double? = nil, + fontWeight: Double? = nil, + hyphens: Bool? = nil, + imageFilter: ImageFilter? = nil, + language: Language? = nil, + letterSpacing: Double? = nil, + ligatures: Bool? = nil, + lineHeight: Double? = nil, + pageMargins: Double? = nil, + paragraphIndent: Double? = nil, + paragraphSpacing: Double? = nil, + publisherStyles: Bool? = nil, + readingProgression: ReadingProgression? = nil, + scroll: Bool? = nil, + spread: Spread? = nil, + textAlign: TextAlignment? = nil, + textColor: Color? = nil, + textNormalization: Bool? = nil, + theme: Theme? = nil, + typeScale: Double? = nil, + verticalText: Bool? = nil, + wordSpacing: Double? = nil + ) { fatalError() } } diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift index 28180192a..99525f214 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift @@ -53,16 +53,18 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = - enumPreference( + public lazy var columnCount: AnyRangePreference = + rangePreference( preference: \.columnCount, setting: \.columnCount, - defaultEffectiveValue: defaults.columnCount ?? .auto, + defaultEffectiveValue: defaults.columnCount ?? 1, isEffective: { [layout] in layout == .reflowable && !$0.settings.scroll }, - supportedValues: [.auto, .one, .two] + supportedRange: 1...8, + progressionStrategy: .increment(1), + format: { String(format: "%d", $0) } ) /// Default typeface for the text. @@ -112,6 +114,18 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = + rangePreference( + preference: \.horizontalMargins, + setting: \.horizontalMargins, + defaultEffectiveValue: defaults.horizontalMargins ?? 1.0, + isEffective: { _ in true }, + supportedRange: 0.0 ... 4.0, + progressionStrategy: .increment(0.3), + format: { $0.formatDecimal(maximumFractionDigits: 5) } + ) + /// Enable hyphenation for latin languages. /// /// Only effective when: @@ -215,20 +229,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = - rangePreference( - preference: \.pageMargins, - setting: \.pageMargins, - defaultEffectiveValue: defaults.pageMargins ?? 1.0, - isEffective: { [layout] _ in layout == .reflowable }, - supportedRange: 0.0 ... 4.0, - progressionStrategy: .increment(0.3), - format: { $0.formatDecimal(maximumFractionDigits: 5) } - ) - /// Text indentation for paragraphs. /// /// Only effective when: @@ -435,4 +435,7 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor { fatalError() } } diff --git a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift index 65bbd6a33..6c42173bb 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift @@ -12,17 +12,17 @@ import ReadiumShared /// See `EPUBPreferences` public struct EPUBSettings: ConfigurableSettings { public var backgroundColor: Color? - public var columnCount: ColumnCount + public var columnCount: Int public var fontFamily: FontFamily? public var fontSize: Double public var fontWeight: Double? + public var horizontalMargins: Double public var hyphens: Bool? public var imageFilter: ImageFilter? public var language: Language? public var letterSpacing: Double? public var ligatures: Bool? public var lineHeight: Double? - public var pageMargins: Double public var paragraphIndent: Double? public var paragraphSpacing: Double? public var publisherStyles: Bool @@ -45,17 +45,17 @@ public struct EPUBSettings: ConfigurableSettings { public init( backgroundColor: Color?, - columnCount: ColumnCount, + columnCount: Int, fontFamily: FontFamily?, fontSize: Double, fontWeight: Double?, + horizontalMargins: Double, hyphens: Bool?, imageFilter: ImageFilter?, language: Language?, letterSpacing: Double?, ligatures: Bool?, lineHeight: Double?, - pageMargins: Double, paragraphIndent: Double?, paragraphSpacing: Double?, publisherStyles: Bool, @@ -75,13 +75,13 @@ public struct EPUBSettings: ConfigurableSettings { self.fontFamily = fontFamily self.fontSize = fontSize self.fontWeight = fontWeight + self.horizontalMargins = horizontalMargins self.hyphens = hyphens self.imageFilter = imageFilter self.language = language self.letterSpacing = letterSpacing self.ligatures = ligatures self.lineHeight = lineHeight - self.pageMargins = pageMargins self.paragraphIndent = paragraphIndent self.paragraphSpacing = paragraphSpacing self.publisherStyles = publisherStyles @@ -138,13 +138,16 @@ public struct EPUBSettings: ConfigurableSettings { backgroundColor: preferences.backgroundColor, columnCount: preferences.columnCount ?? defaults.columnCount - ?? .auto, + ?? 1, fontFamily: preferences.fontFamily, fontSize: preferences.fontSize ?? defaults.fontSize ?? 1.0, fontWeight: preferences.fontWeight ?? defaults.fontWeight, + horizontalMargins: preferences.horizontalMargins + ?? defaults.horizontalMargins + ?? 1.0, hyphens: preferences.hyphens ?? defaults.hyphens, imageFilter: preferences.imageFilter @@ -156,9 +159,6 @@ public struct EPUBSettings: ConfigurableSettings { ?? defaults.ligatures, lineHeight: preferences.lineHeight ?? defaults.lineHeight, - pageMargins: preferences.pageMargins - ?? defaults.pageMargins - ?? 1.0, paragraphIndent: preferences.paragraphIndent ?? defaults.paragraphIndent, paragraphSpacing: preferences.paragraphSpacing @@ -187,6 +187,38 @@ public struct EPUBSettings: ConfigurableSettings { ?? defaults.wordSpacing ) } + + @available(*, unavailable, renamed: "horizontalMargins") + public var pageMargins: Double? { nil } + + @available(*, unavailable, message: "Use the other initializer") + public init( + backgroundColor: Color?, + columnCount: ColumnCount, + fontFamily: FontFamily?, + fontSize: Double, + fontWeight: Double?, + hyphens: Bool?, + imageFilter: ImageFilter?, + language: Language?, + letterSpacing: Double?, + ligatures: Bool?, + lineHeight: Double?, + pageMargins: Double, + paragraphIndent: Double?, + paragraphSpacing: Double?, + publisherStyles: Bool, + readingProgression: ReadingProgression, + scroll: Bool, + spread: Spread, + textAlign: TextAlignment?, + textColor: Color?, + textNormalization: Bool, + theme: Theme, + typeScale: Double?, + verticalText: Bool, + wordSpacing: Double? + ) { fatalError() } } /// Default setting values for the EPUB navigator. @@ -196,16 +228,16 @@ public struct EPUBSettings: ConfigurableSettings { /// /// See `EPUBPreferences`. public struct EPUBDefaults { - public var columnCount: ColumnCount? + public var columnCount: Int? public var fontSize: Double? public var fontWeight: Double? + public var horizontalMargins: Double? public var hyphens: Bool? public var imageFilter: ImageFilter? public var language: Language? public var letterSpacing: Double? public var ligatures: Bool? public var lineHeight: Double? - public var pageMargins: Double? public var paragraphIndent: Double? public var paragraphSpacing: Double? public var publisherStyles: Bool? @@ -216,18 +248,18 @@ public struct EPUBDefaults { public var textNormalization: Bool? public var typeScale: Double? public var wordSpacing: Double? - + public init( - columnCount: ColumnCount? = nil, + columnCount: Int? = nil, fontSize: Double? = nil, fontWeight: Double? = nil, + horizontalMargins: Double? = nil, hyphens: Bool? = nil, imageFilter: ImageFilter? = nil, language: Language? = nil, letterSpacing: Double? = nil, ligatures: Bool? = nil, lineHeight: Double? = nil, - pageMargins: Double? = nil, paragraphIndent: Double? = nil, paragraphSpacing: Double? = nil, publisherStyles: Bool? = nil, @@ -242,13 +274,13 @@ public struct EPUBDefaults { self.columnCount = columnCount self.fontSize = fontSize self.fontWeight = fontWeight + self.horizontalMargins = horizontalMargins self.hyphens = hyphens self.imageFilter = imageFilter self.language = language self.letterSpacing = letterSpacing self.ligatures = ligatures self.lineHeight = lineHeight - self.pageMargins = pageMargins self.paragraphIndent = paragraphIndent self.paragraphSpacing = paragraphSpacing self.publisherStyles = publisherStyles @@ -260,6 +292,33 @@ public struct EPUBDefaults { self.typeScale = typeScale self.wordSpacing = wordSpacing } + + @available(*, unavailable, renamed: "horizontalMargins") + public var pageMargins: Double? { nil } + + @available(*, unavailable, message: "Use the other initializer") + public init( + columnCount: ColumnCount? = nil, + fontSize: Double? = nil, + fontWeight: Double? = nil, + hyphens: Bool? = nil, + imageFilter: ImageFilter? = nil, + language: Language? = nil, + letterSpacing: Double? = nil, + ligatures: Bool? = nil, + lineHeight: Double? = nil, + pageMargins: Double? = nil, + paragraphIndent: Double? = nil, + paragraphSpacing: Double? = nil, + publisherStyles: Bool? = nil, + readingProgression: ReadingProgression? = nil, + scroll: Bool? = nil, + spread: Spread? = nil, + textAlign: TextAlignment? = nil, + textNormalization: Bool? = nil, + typeScale: Double? = nil, + wordSpacing: Double? = nil + ) { fatalError() } } private extension Language { diff --git a/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift b/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift index 759b30341..b5bc8692b 100644 --- a/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift +++ b/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift @@ -98,13 +98,13 @@ struct UserPreferences< fontFamily: editor.fontFamily, fontSize: editor.fontSize, fontWeight: editor.fontWeight, + horizontalMargins: editor.horizontalMargins, hyphens: editor.hyphens, imageFilter: editor.imageFilter, language: editor.language, letterSpacing: editor.letterSpacing, ligatures: editor.ligatures, lineHeight: editor.lineHeight, - pageMargins: editor.pageMargins, paragraphIndent: editor.paragraphIndent, paragraphSpacing: editor.paragraphSpacing, publisherStyles: editor.publisherStyles, @@ -299,17 +299,17 @@ struct UserPreferences< @ViewBuilder func reflowableUserPreferences( commit: @escaping () -> Void, backgroundColor: AnyPreference? = nil, - columnCount: AnyEnumPreference? = nil, + columnCount: AnyRangePreference? = nil, fontFamily: AnyPreference? = nil, fontSize: AnyRangePreference? = nil, fontWeight: AnyRangePreference? = nil, + horizontalMargins: AnyRangePreference? = nil, hyphens: AnyPreference? = nil, imageFilter: AnyEnumPreference? = nil, language: AnyPreference? = nil, letterSpacing: AnyRangePreference? = nil, ligatures: AnyPreference? = nil, lineHeight: AnyRangePreference? = nil, - pageMargins: AnyRangePreference? = nil, paragraphIndent: AnyRangePreference? = nil, paragraphSpacing: AnyRangePreference? = nil, publisherStyles: AnyPreference? = nil, @@ -357,7 +357,7 @@ struct UserPreferences< } } - if scroll != nil || columnCount != nil || pageMargins != nil { + if scroll != nil || columnCount != nil || horizontalMargins != nil { Section { if let scroll = scroll { toggleRow( @@ -368,24 +368,17 @@ struct UserPreferences< } if let columnCount = columnCount { - pickerRow( + stepperRow( title: "Columns", preference: columnCount, commit: commit, - formatValue: { v in - switch v { - case .auto: return "Auto" - case .one: return "1" - case .two: return "2" - } - } ) } - if let pageMargins = pageMargins { + if let horizontalMargins = horizontalMargins { stepperRow( - title: "Page margins", - preference: pageMargins, + title: "Horizontal margins", + preference: horizontalMargins, commit: commit ) } From a68d909ec0b46fab5ca44b03d12a1a36c4cdb7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Tue, 17 Jun 2025 18:31:32 +0200 Subject: [PATCH 04/11] Remove typeScale --- .../Navigator/EPUB/CSS/CSSProperties.swift | 18 --------------- Sources/Navigator/EPUB/CSS/ReadiumCSS.swift | 1 - .../EPUB/Preferences/EPUBPreferences.swift | 9 +++----- .../Preferences/EPUBPreferencesEditor.swift | 23 +++---------------- .../EPUB/Preferences/EPUBSettings.swift | 13 +++++------ .../Common/Preferences/UserPreferences.swift | 10 -------- 6 files changed, 12 insertions(+), 62 deletions(-) diff --git a/Sources/Navigator/EPUB/CSS/CSSProperties.swift b/Sources/Navigator/EPUB/CSS/CSSProperties.swift index 4f9a2ac2d..15c5945a7 100644 --- a/Sources/Navigator/EPUB/CSS/CSSProperties.swift +++ b/Sources/Navigator/EPUB/CSS/CSSProperties.swift @@ -91,13 +91,6 @@ public struct CSSUserProperties: CSSProperties { /// This flag is required to apply the font-size and/or advanced user settings. public var advancedSettings: Bool? - /// The type scale the user wants to use for the publication. It impacts headings, p, li, div, - /// pre, dd, small, sub, and sup. - /// - /// Recommended values: a range from 75% to 250%. Increments are left to implementers’ judgment. - /// Requires: advancedSettings - public var typeScale: Double? - /// The alignment (text-align) the user prefers. It impacts body, li, and p which are not /// children of blockquote and figcaption. /// @@ -172,7 +165,6 @@ public struct CSSUserProperties: CSSProperties { fontFamily: [String]? = nil, fontSize: CSSLength? = nil, advancedSettings: Bool? = nil, - typeScale: Double? = nil, textAlign: CSSTextAlign? = nil, lineHeight: CSSLineHeight? = nil, lineLength: CSSLength? = nil, @@ -196,7 +188,6 @@ public struct CSSUserProperties: CSSProperties { self.fontFamily = fontFamily self.fontSize = fontSize self.advancedSettings = advancedSettings - self.typeScale = typeScale self.textAlign = textAlign self.lineHeight = lineHeight self.lineLength = lineLength @@ -233,7 +224,6 @@ public struct CSSUserProperties: CSSProperties { props.putCSS(name: "--USER__fontSize", value: fontSize) props.putCSS(name: "--USER__advancedSettings", value: CSSFlag(name: "advanced", isEnabled: advancedSettings)) - props.putCSS(name: "--USER__typeScale", value: typeScale) props.putCSS(name: "--USER__textAlign", value: textAlign) props.putCSS(name: "--USER__lineHeight", value: lineHeight) props.putCSS(name: "--USER__lineLength", value: lineLength) @@ -330,11 +320,6 @@ public struct CSSRSProperties: CSSProperties { // Typography - /// @param typeScale The scale to be used for computing all elements’ font-size. Since those font - /// sizes are computed dynamically, you can set a smaller type scale when the user sets one - /// of the largest font sizes. - public var typeScale: Double? - /// @param baseFontFamily The default typeface for body copy in case the ebook doesn’t have one /// declared. Please note some languages have a specific font-stack (japanese, hindi, etc.) public var baseFontFamily: [String]? @@ -412,7 +397,6 @@ public struct CSSRSProperties: CSSProperties { visitedColor: CSSColor? = nil, primaryColor: CSSColor? = nil, secondaryColor: CSSColor? = nil, - typeScale: Double? = nil, baseFontFamily: [String]? = nil, baseLineHeight: CSSLineHeight? = nil, oldStyleTf: [String]? = nil, @@ -448,7 +432,6 @@ public struct CSSRSProperties: CSSProperties { self.visitedColor = visitedColor self.primaryColor = primaryColor self.secondaryColor = secondaryColor - self.typeScale = typeScale self.baseFontFamily = baseFontFamily self.baseLineHeight = baseLineHeight self.oldStyleTf = oldStyleTf @@ -497,7 +480,6 @@ public struct CSSRSProperties: CSSProperties { props.putCSS(name: "--RS__secondaryColor", value: secondaryColor) // Typography - props.putCSS(name: "--RS__typeScale", value: typeScale) props.putCSS(name: "--RS__baseFontFamily", value: baseFontFamily) props.putCSS(name: "--RS__baseLineHeight", value: baseLineHeight) diff --git a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift index 74864a134..34139b7d8 100644 --- a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift +++ b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift @@ -41,7 +41,6 @@ extension ReadiumCSS { fontFamily: settings.fontFamily.map(resolveFontStack), fontSize: CSSPercentLength(settings.fontSize), advancedSettings: !settings.publisherStyles, - typeScale: settings.typeScale, textAlign: { switch settings.textAlign { case .justify: return .justify diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift index f63a3021b..46711531f 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift @@ -81,9 +81,6 @@ public struct EPUBPreferences: ConfigurablePreferences { /// Reader theme. public var theme: Theme? - /// Scale applied to all element font sizes. - public var typeScale: Double? - /// Indicates whether the text should be laid out vertically. /// /// This is used for example with CJK languages. This setting is @@ -116,7 +113,6 @@ public struct EPUBPreferences: ConfigurablePreferences { textColor: Color? = nil, textNormalization: Bool? = nil, theme: Theme? = nil, - typeScale: Double? = nil, verticalText: Bool? = nil, wordSpacing: Double? = nil ) { @@ -142,7 +138,6 @@ public struct EPUBPreferences: ConfigurablePreferences { self.textColor = textColor self.textNormalization = textNormalization self.theme = theme - self.typeScale = typeScale.map { max($0, 0) } self.verticalText = verticalText self.wordSpacing = wordSpacing.map { max($0, 0) } } @@ -171,7 +166,6 @@ public struct EPUBPreferences: ConfigurablePreferences { textColor: other.textColor ?? textColor, textNormalization: other.textNormalization ?? textNormalization, theme: other.theme ?? theme, - typeScale: other.typeScale ?? typeScale, verticalText: other.verticalText ?? verticalText, wordSpacing: other.wordSpacing ?? wordSpacing ) @@ -202,6 +196,9 @@ public struct EPUBPreferences: ConfigurablePreferences { @available(*, unavailable, renamed: "horizontalMargins") public var pageMargins: Double? { nil } + @available(*, unavailable, message: "Not available anymore") + public var typeScale: Double? { nil } + @available(*, unavailable, message: "Use the other initializer") public init( backgroundColor: Color? = nil, diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift index 99525f214..c8caae29c 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift @@ -382,26 +382,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = - rangePreference( - preference: \.typeScale, - effectiveValue: { $0.settings.typeScale }, - defaultEffectiveValue: defaults.typeScale ?? 1.2, - isEffective: { [layout] in - layout == .reflowable - && !$0.settings.publisherStyles - && $0.preferences.typeScale != nil - }, - supportedRange: 1.0 ... 2.0, - progressionStrategy: .steps(1.0, 1.067, 1.125, 1.2, 1.25, 1.333, 1.414, 1.5, 1.618), - format: { $0.formatDecimal(maximumFractionDigits: 5) } - ) - /// Indicates whether the text should be laid out vertically. This is used /// for example with CJK languages. This setting is automatically derived /// from the language if no preference is given. @@ -438,4 +418,7 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor { fatalError() } + + @available(*, unavailable, message: "Not available anymore") + public var typeScale: AnyRangePreference { fatalError() } } diff --git a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift index 6c42173bb..ed78a3da2 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift @@ -33,7 +33,6 @@ public struct EPUBSettings: ConfigurableSettings { public var textColor: Color? public var textNormalization: Bool public var theme: Theme - public var typeScale: Double? public var verticalText: Bool public var wordSpacing: Double? @@ -66,7 +65,6 @@ public struct EPUBSettings: ConfigurableSettings { textColor: Color?, textNormalization: Bool, theme: Theme, - typeScale: Double?, verticalText: Bool, wordSpacing: Double? ) { @@ -92,7 +90,6 @@ public struct EPUBSettings: ConfigurableSettings { self.textColor = textColor self.textNormalization = textNormalization self.theme = theme - self.typeScale = typeScale self.verticalText = verticalText self.wordSpacing = wordSpacing cssLayout = CSSLayout(verticalText: verticalText, language: language, readingProgression: readingProgression) @@ -180,14 +177,15 @@ public struct EPUBSettings: ConfigurableSettings { ?? false, theme: preferences.theme ?? .light, - typeScale: preferences.typeScale - ?? defaults.typeScale, verticalText: verticalText, wordSpacing: preferences.wordSpacing ?? defaults.wordSpacing ) } + @available(*, unavailable, message: "Not supported anymore") + public var typeScale: Double? { nil } + @available(*, unavailable, renamed: "horizontalMargins") public var pageMargins: Double? { nil } @@ -246,7 +244,6 @@ public struct EPUBDefaults { public var spread: Spread? public var textAlign: TextAlignment? public var textNormalization: Bool? - public var typeScale: Double? public var wordSpacing: Double? public init( @@ -289,13 +286,15 @@ public struct EPUBDefaults { self.spread = spread self.textAlign = textAlign self.textNormalization = textNormalization - self.typeScale = typeScale self.wordSpacing = wordSpacing } @available(*, unavailable, renamed: "horizontalMargins") public var pageMargins: Double? { nil } + @available(*, unavailable, message: "Not supported anymore") + public var typeScale: Double? { nil } + @available(*, unavailable, message: "Use the other initializer") public init( columnCount: ColumnCount? = nil, diff --git a/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift b/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift index b5bc8692b..da80abd5b 100644 --- a/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift +++ b/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift @@ -114,7 +114,6 @@ struct UserPreferences< textColor: editor.textColor, textNormalization: editor.textNormalization, theme: editor.theme, - typeScale: editor.typeScale, verticalText: editor.verticalText, wordSpacing: editor.wordSpacing ) @@ -319,7 +318,6 @@ struct UserPreferences< textColor: AnyPreference? = nil, textNormalization: AnyPreference? = nil, theme: AnyEnumPreference? = nil, - typeScale: AnyRangePreference? = nil, verticalText: AnyPreference? = nil, wordSpacing: AnyRangePreference? = nil ) -> some View { @@ -521,14 +519,6 @@ struct UserPreferences< ) } - if let typeScale = typeScale { - stepperRow( - title: "Type scale", - preference: typeScale, - commit: commit - ) - } - if let lineHeight = lineHeight { stepperRow( title: "Line height", From fbe50076b96867d5940789496a4b443f6d11c72c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Tue, 17 Jun 2025 18:31:42 +0200 Subject: [PATCH 05/11] Image filter works in day mode too --- .../Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift index c8caae29c..e9bef44f7 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift @@ -147,14 +147,12 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = enumPreference( preference: \.imageFilter, setting: \.imageFilter, - isEffective: { $0.settings.theme == .dark }, + isEffective: { _ in true }, supportedValues: [nil, .darken, .invert] ) From c03731093f4b61db387204360ad0b3f0b937572d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Wed, 18 Jun 2025 10:22:53 +0200 Subject: [PATCH 06/11] Fix font size on iPadOS --- Sources/Navigator/EPUB/CSS/CSSProperties.swift | 14 +++++++++++++- Sources/Navigator/EPUB/CSS/ReadiumCSS.swift | 4 +++- .../EPUB/Preferences/EPUBPreferences.swift | 6 +++--- .../EPUB/Preferences/EPUBPreferencesEditor.swift | 6 +++--- .../Navigator/EPUB/Preferences/EPUBSettings.swift | 10 +++++----- 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/Sources/Navigator/EPUB/CSS/CSSProperties.swift b/Sources/Navigator/EPUB/CSS/CSSProperties.swift index 15c5945a7..4d93abccf 100644 --- a/Sources/Navigator/EPUB/CSS/CSSProperties.swift +++ b/Sources/Navigator/EPUB/CSS/CSSProperties.swift @@ -150,6 +150,14 @@ public struct CSSUserProperties: CSSProperties { /// Requires: fontOverride public var a11yNormalize: Bool? + /// Acts as an explicit switch to force iPadOS patching of zoom issues so + /// that `--USER__fontSize` can work as expected. This should be applied + /// only when the site is requested in its desktop version on iPadOS – + /// mobile version is completely fine. + /// + /// See https://bugs.webkit.org/show_bug.cgi?id=293617 + public var iPadOSPatch: Bool? + // Additional overrides for extensions and adjustments. public var overrides: [String: String?] @@ -175,6 +183,7 @@ public struct CSSUserProperties: CSSProperties { bodyHyphens: CSSHyphens? = nil, ligatures: CSSLigatures? = nil, a11yNormalize: Bool? = nil, + iPadOSPatch: Bool? = nil, overrides: [String: String?] = [:] ) { self.view = view @@ -198,6 +207,7 @@ public struct CSSUserProperties: CSSProperties { self.bodyHyphens = bodyHyphens self.ligatures = ligatures self.a11yNormalize = a11yNormalize + self.iPadOSPatch = iPadOSPatch self.overrides = overrides } @@ -237,6 +247,8 @@ public struct CSSUserProperties: CSSProperties { // Accessibility props.putCSS(name: "--USER__a11yNormalize", value: CSSFlag(name: "a11y", isEnabled: a11yNormalize)) + props.putCSS(name: "--USER__iPadOSPatch", value: CSSFlag(name: "iPadOSPatch", isEnabled: iPadOSPatch)) + props.merge(overrides, uniquingKeysWith: { _, n in n }) return props } @@ -819,7 +831,7 @@ private extension Dictionary where Key == String, Value == String? { let css = value.map { String(format: "%d", $0) } self[name] = css } - + mutating func putCSS(name: String, value: Double?) { let css = value.map { String(format: "%.5f", $0) } self[name] = css diff --git a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift index 34139b7d8..5ef9ab1dd 100644 --- a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift +++ b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift @@ -8,6 +8,7 @@ import Foundation import ReadiumInternal import ReadiumShared import SwiftSoup +import UIKit struct ReadiumCSS { var layout: CSSLayout = .init() @@ -59,6 +60,7 @@ extension ReadiumCSS { bodyHyphens: settings.hyphens.map { $0 ? .auto : .none }, ligatures: settings.ligatures.map { $0 ? .common : .none }, a11yNormalize: settings.textNormalization, + iPadOSPatch: UIDevice.current.userInterfaceIdiom == .pad, overrides: [ "font-weight": settings.fontWeight .map { String(format: "%.0f", (Double(CSSStandardFontWeight.normal.rawValue) * $0).clamped(to: 1 ... 1000)) } @@ -123,7 +125,7 @@ extension ReadiumCSS: HTMLInjectable { // https://github.com/readium/readium-css/issues/94 // https://github.com/readium/r2-navigator-kotlin/issues/193 inj.append(.style("audio[controls] { width: revert; height: revert; }")) - + // Fix broken pagination when a book contains `overflow-x: hidden`. // https://github.com/readium/kotlin-toolkit/issues/292 // Inspired by https://github.com/readium/readium-css/issues/119#issuecomment-1302348238 diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift index 46711531f..2d1abc52e 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift @@ -43,7 +43,7 @@ public struct EPUBPreferences: ConfigurablePreferences { /// Leading line height. public var lineHeight: Double? - + /// Factor applied to horizontal margins. public var horizontalMargins: Double? @@ -195,10 +195,10 @@ public struct EPUBPreferences: ConfigurablePreferences { @available(*, unavailable, renamed: "horizontalMargins") public var pageMargins: Double? { nil } - + @available(*, unavailable, message: "Not available anymore") public var typeScale: Double? { nil } - + @available(*, unavailable, message: "Use the other initializer") public init( backgroundColor: Color? = nil, diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift index e9bef44f7..6b6a00fcf 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift @@ -62,7 +62,7 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor { fatalError() } - + @available(*, unavailable, message: "Not available anymore") public var typeScale: AnyRangePreference { fatalError() } } diff --git a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift index ed78a3da2..ed0a09751 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift @@ -182,13 +182,13 @@ public struct EPUBSettings: ConfigurableSettings { ?? defaults.wordSpacing ) } - + @available(*, unavailable, message: "Not supported anymore") public var typeScale: Double? { nil } @available(*, unavailable, renamed: "horizontalMargins") public var pageMargins: Double? { nil } - + @available(*, unavailable, message: "Use the other initializer") public init( backgroundColor: Color?, @@ -245,7 +245,7 @@ public struct EPUBDefaults { public var textAlign: TextAlignment? public var textNormalization: Bool? public var wordSpacing: Double? - + public init( columnCount: Int? = nil, fontSize: Double? = nil, @@ -291,10 +291,10 @@ public struct EPUBDefaults { @available(*, unavailable, renamed: "horizontalMargins") public var pageMargins: Double? { nil } - + @available(*, unavailable, message: "Not supported anymore") public var typeScale: Double? { nil } - + @available(*, unavailable, message: "Use the other initializer") public init( columnCount: ColumnCount? = nil, From 3bf5cdfb23ca8e40c8abe56a9f351bfef553d30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Fri, 20 Jun 2025 18:17:05 +0200 Subject: [PATCH 07/11] Update Readium CSS --- .../EPUB/Assets/Static/readium-css/HEAD | 2 +- .../Static/readium-css/ReadiumCSS-after.css | 48 +++++++++------- .../Static/readium-css/ReadiumCSS-before.css | 57 +++++++++---------- .../Static/readium-css/ReadiumCSS-default.css | 2 +- .../cjk-horizontal/ReadiumCSS-after.css | 32 ++++++----- .../cjk-horizontal/ReadiumCSS-before.css | 57 +++++++++---------- .../cjk-horizontal/ReadiumCSS-default.css | 2 +- .../cjk-vertical/ReadiumCSS-after.css | 29 +++++----- .../cjk-vertical/ReadiumCSS-before.css | 57 +++++++++---------- .../cjk-vertical/ReadiumCSS-default.css | 2 +- .../readium-css/rtl/ReadiumCSS-after.css | 32 ++++++----- .../readium-css/rtl/ReadiumCSS-before.css | 57 +++++++++---------- .../readium-css/rtl/ReadiumCSS-default.css | 2 +- .../Navigator/EPUB/CSS/CSSProperties.swift | 12 ---- Sources/Navigator/EPUB/CSS/ReadiumCSS.swift | 31 +++++----- 15 files changed, 205 insertions(+), 217 deletions(-) diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD b/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD index 715487afe..29a47fba8 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD @@ -1 +1 @@ -74c2ad1e1b98279549f32bea1001bdf88f5be907 +cb51601207286f2d2b6b50e4e993614673a4c0de diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css index 9feb56ece..c0697e1e7 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -66,17 +66,20 @@ body{ max-width:var(--RS__defaultLineLength) !important; padding:0 var(--RS__pageGutter) !important; margin:0 auto !important; - overflow:hidden; box-sizing:border-box; } +:root:not([style*="readium-noOverflow-on"]) body{ + overflow:hidden; +} + @supports (overflow: clip){ - :root{ + :root:not([style*="readium-noOverflow-on"]){ overflow:clip; } - body{ + :root:not([style*="readium-noOverflow-on"]) body{ overflow:clip; overflow-clip-margin:content-box; } @@ -96,16 +99,19 @@ body{ :root[style*="readium-scroll-on"] body{ max-width:var(--RS__defaultLineLength) !important; +} + +:root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]) body{ overflow:auto; } @supports (overflow: clip){ - :root[style*="readium-scroll-on"]{ + :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]){ overflow:auto; } - :root[style*="readium-scroll-on"] body{ + :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]) body{ overflow:clip; } } @@ -352,36 +358,36 @@ body{ hyphens:inherit; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"]{ +:root[style*="--USER__fontFamily"]{ font-family:var(--USER__fontFamily) !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] *{ +:root[style*="--USER__fontFamily"] *{ font-family:revert !important; } -:root[style*="readium-font-on"][style*="AccessibleDfA"]{ +:root[style*="AccessibleDfA"]{ font-family:AccessibleDfA, Verdana, Tahoma, "Trebuchet MS", sans-serif !important; } -:root[style*="readium-font-on"][style*="IA Writer Duospace"]{ +:root[style*="IA Writer Duospace"]{ font-family:"IA Writer Duospace", Menlo, "DejaVu Sans Mono", "Bitstream Vera Sans Mono", Courier, monospace !important; } -:root[style*="readium-font-on"][style*="AccessibleDfA"],:root[style*="readium-font-on"][style*="IA Writer Duospace"], +:root[style*="AccessibleDfA"],:root[style*="IA Writer Duospace"], :root[style*="readium-a11y-on"]{ font-style:normal !important; font-weight:normal !important; } -:root[style*="readium-font-on"][style*="AccessibleDfA"] *:not(code):not(var):not(kbd):not(samp),:root[style*="readium-font-on"][style*="IA Writer Duospace"] *:not(code):not(var):not(kbd):not(samp), +:root[style*="AccessibleDfA"] *:not(code):not(var):not(kbd):not(samp),:root[style*="IA Writer Duospace"] *:not(code):not(var):not(kbd):not(samp), :root[style*="readium-a11y-on"] *:not(code):not(var):not(kbd):not(samp){ font-family:inherit !important; font-style:inherit !important; font-weight:inherit !important; } -:root[style*="readium-font-on"][style*="AccessibleDfA"] *,:root[style*="readium-font-on"][style*="IA Writer Duospace"] *, +:root[style*="AccessibleDfA"] *,:root[style*="IA Writer Duospace"] *, :root[style*="readium-a11y-on"] *{ text-decoration:none !important; font-variant-caps:normal !important; @@ -389,10 +395,10 @@ body{ font-variant-position:normal !important; } -:root[style*="readium-font-on"][style*="AccessibleDfA"] sup,:root[style*="readium-font-on"][style*="IA Writer Duospace"] sup, +:root[style*="AccessibleDfA"] sup,:root[style*="IA Writer Duospace"] sup, :root[style*="readium-a11y-on"] sup, -:root[style*="readium-font-on"][style*="AccessibleDfA"] sub, -:root[style*="readium-font-on"][style*="IA Writer Duospace"] sub, +:root[style*="AccessibleDfA"] sub, +:root[style*="IA Writer Duospace"] sub, :root[style*="readium-a11y-on"] sub{ font-size:1rem !important; vertical-align:baseline !important; @@ -467,20 +473,20 @@ body{ font-variant:none; } -:root[style*="readium-font-on"][style*="--USER__fontWeight"] body{ +:root[style*="--USER__fontWeight"] body{ font-weight:var(--USER__fontWeight) !important; } -:root[style*="readium-font-on"][style*="--USER__fontWeight"] b, -:root[style*="readium-font-on"][style*="--USER__fontWeight"] strong{ +:root[style*="--USER__fontWeight"] b, +:root[style*="--USER__fontWeight"] strong{ font-weight:bolder; } -:root[style*="readium-font-on"][style*="--USER__fontWidth"] body{ +:root[style*="--USER__fontWidth"] body{ font-stretch:var(--USER__fontWidth) !important; } -:root[style*="readium-font-on"][style*="--USER__fontOpticalSizing"] body{ +:root[style*="--USER__fontOpticalSizing"] body{ font-optical-sizing:var(--USER__fontOpticalSizing) !important; } diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css index 0cc5938f7..dcb2dfd64 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -38,6 +38,31 @@ --RS__lineHeightCompensation:1; --RS__baseLineHeight:calc(1.5 * var(--RS__lineHeightCompensation)); + + --RS__selectionTextColor:inherit; + + --RS__selectionBackgroundColor:#b4d8fe; + + --RS__visitedColor:#551A8B; + + --RS__linkColor:#0000EE; + + --RS__textColor:#121212; + + --RS__backgroundColor:#FFFFFF; + color:var(--RS__textColor) !important; + + background-color:var(--RS__backgroundColor) !important; +} + +::-moz-selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); +} + +::selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } html{ @@ -193,36 +218,6 @@ math{ --RS__lineHeightCompensation:1.167; } -:root{ - - --RS__selectionTextColor:inherit; - - --RS__selectionBackgroundColor:#b4d8fe; - - --RS__visitedColor:#551A8B; - - --RS__linkColor:#0000EE; - - --RS__textColor:#121212; - - --RS__backgroundColor:#FFFFFF; -} - -:root{ - color:var(--RS__textColor) !important; - background-color:var(--RS__backgroundColor) !important; -} - -::-moz-selection{ - color:var(--RS__selectionTextColor); - background-color:var(--RS__selectionBackgroundColor); -} - -::selection{ - color:var(--RS__selectionTextColor); - background-color:var(--RS__selectionBackgroundColor); -} - @font-face{ font-family:AccessibleDfA; font-style:normal; diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css index c05d1d8ec..8348d1b4c 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css index a43234fc6..482fd5414 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -66,17 +66,20 @@ body{ max-width:var(--RS__defaultLineLength) !important; padding:0 var(--RS__pageGutter) !important; margin:0 auto !important; - overflow:hidden; box-sizing:border-box; } +:root:not([style*="readium-noOverflow-on"]) body{ + overflow:hidden; +} + @supports (overflow: clip){ - :root{ + :root:not([style*="readium-noOverflow-on"]){ overflow:clip; } - body{ + :root:not([style*="readium-noOverflow-on"]) body{ overflow:clip; overflow-clip-margin:content-box; } @@ -96,16 +99,19 @@ body{ :root[style*="readium-scroll-on"] body{ max-width:var(--RS__defaultLineLength) !important; +} + +:root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]) body{ overflow:auto; } @supports (overflow: clip){ - :root[style*="readium-scroll-on"]{ + :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]){ overflow:auto; } - :root[style*="readium-scroll-on"] body{ + :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]) body{ overflow:clip; } } @@ -318,11 +324,11 @@ body{ max-width:var(--USER__lineLength) !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"]{ +:root[style*="--USER__fontFamily"]{ font-family:var(--USER__fontFamily) !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] *{ +:root[style*="--USER__fontFamily"] *{ font-family:revert !important; } @@ -357,20 +363,20 @@ body{ margin-bottom:var(--USER__paraSpacing) !important; } -:root[style*="readium-font-on"][style*="--USER__fontWeight"] body{ +:root[style*="--USER__fontWeight"] body{ font-weight:var(--USER__fontWeight) !important; } -:root[style*="readium-font-on"][style*="--USER__fontWeight"] b, -:root[style*="readium-font-on"][style*="--USER__fontWeight"] strong{ +:root[style*="--USER__fontWeight"] b, +:root[style*="--USER__fontWeight"] strong{ font-weight:bolder; } -:root[style*="readium-font-on"][style*="--USER__fontWidth"] body{ +:root[style*="--USER__fontWidth"] body{ font-stretch:var(--USER__fontWidth) !important; } -:root[style*="readium-font-on"][style*="--USER__fontOpticalSizing"] body{ +:root[style*="--USER__fontOpticalSizing"] body{ font-optical-sizing:var(--USER__fontOpticalSizing) !important; } diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css index 935895930..603978198 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -38,6 +38,31 @@ --RS__lineHeightCompensation:1; --RS__baseLineHeight:calc(1.5 * var(--RS__lineHeightCompensation)); + + --RS__selectionTextColor:inherit; + + --RS__selectionBackgroundColor:#b4d8fe; + + --RS__visitedColor:#551A8B; + + --RS__linkColor:#0000EE; + + --RS__textColor:#121212; + + --RS__backgroundColor:#FFFFFF; + color:var(--RS__textColor) !important; + + background-color:var(--RS__backgroundColor) !important; +} + +::-moz-selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); +} + +::selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } html{ @@ -193,36 +218,6 @@ math{ --RS__lineHeightCompensation:1.167; } -:root{ - - --RS__selectionTextColor:inherit; - - --RS__selectionBackgroundColor:#b4d8fe; - - --RS__visitedColor:#551A8B; - - --RS__linkColor:#0000EE; - - --RS__textColor:#121212; - - --RS__backgroundColor:#FFFFFF; -} - -:root{ - color:var(--RS__textColor) !important; - background-color:var(--RS__backgroundColor) !important; -} - -::-moz-selection{ - color:var(--RS__selectionTextColor); - background-color:var(--RS__selectionBackgroundColor); -} - -::selection{ - color:var(--RS__selectionTextColor); - background-color:var(--RS__selectionBackgroundColor); -} - body{ widows:2; orphans:2; diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css index c1954250a..630d012bb 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css index 958fbca96..8a43a58a7 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -77,17 +77,20 @@ body{ max-height:var(--RS__defaultLineLength) !important; padding:var(--RS__pageGutter) 0 !important; margin:auto 0 !important; - overflow:hidden; box-sizing:border-box; } +:root:not([style*="readium-noOverflow-on"]) body{ + overflow:hidden; +} + @supports (overflow: clip){ - :root{ + :root:not([style*="readium-noOverflow-on"]){ overflow:clip; } - body{ + :root:not([style*="readium-noOverflow-on"]) body{ overflow:clip; overflow-clip-margin:content-box; } @@ -111,11 +114,11 @@ body{ @supports (overflow: clip){ - :root[style*="readium-scroll-on"]{ + :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]){ overflow:auto; } - :root[style*="readium-scroll-on"] body{ + :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]) body{ overflow:clip; } } @@ -306,11 +309,11 @@ body{ max-height:var(--USER__lineLength) !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"]{ +:root[style*="--USER__fontFamily"]{ font-family:var(--USER__fontFamily) !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] *{ +:root[style*="--USER__fontFamily"] *{ font-family:revert !important; } @@ -345,20 +348,20 @@ body{ margin-left:var(--USER__paraSpacing) !important; } -:root[style*="readium-font-on"][style*="--USER__fontWeight"] body{ +:root[style*="--USER__fontWeight"] body{ font-weight:var(--USER__fontWeight) !important; } -:root[style*="readium-font-on"][style*="--USER__fontWeight"] b, -:root[style*="readium-font-on"][style*="--USER__fontWeight"] strong{ +:root[style*="--USER__fontWeight"] b, +:root[style*="--USER__fontWeight"] strong{ font-weight:bolder; } -:root[style*="readium-font-on"][style*="--USER__fontWidth"] body{ +:root[style*="--USER__fontWidth"] body{ font-stretch:var(--USER__fontWidth) !important; } -:root[style*="readium-font-on"][style*="--USER__fontOpticalSizing"] body{ +:root[style*="--USER__fontOpticalSizing"] body{ font-optical-sizing:var(--USER__fontOpticalSizing) !important; } diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css index 0072752b1..d0e19f7dd 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -38,6 +38,31 @@ --RS__lineHeightCompensation:1; --RS__baseLineHeight:calc(1.5 * var(--RS__lineHeightCompensation)); + + --RS__selectionTextColor:inherit; + + --RS__selectionBackgroundColor:#b4d8fe; + + --RS__visitedColor:#551A8B; + + --RS__linkColor:#0000EE; + + --RS__textColor:#121212; + + --RS__backgroundColor:#FFFFFF; + color:var(--RS__textColor) !important; + + background-color:var(--RS__backgroundColor) !important; +} + +::-moz-selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); +} + +::selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } html{ @@ -193,36 +218,6 @@ math{ --RS__lineHeightCompensation:1.167; } -:root{ - - --RS__selectionTextColor:inherit; - - --RS__selectionBackgroundColor:#b4d8fe; - - --RS__visitedColor:#551A8B; - - --RS__linkColor:#0000EE; - - --RS__textColor:#121212; - - --RS__backgroundColor:#FFFFFF; -} - -:root{ - color:var(--RS__textColor) !important; - background-color:var(--RS__backgroundColor) !important; -} - -::-moz-selection{ - color:var(--RS__selectionTextColor); - background-color:var(--RS__selectionBackgroundColor); -} - -::selection{ - color:var(--RS__selectionTextColor); - background-color:var(--RS__selectionBackgroundColor); -} - body{ widows:2; orphans:2; diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css index 08e7b95fd..e7c023172 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css index 2d9b79405..a1b5ad9df 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -66,17 +66,20 @@ body{ max-width:var(--RS__defaultLineLength) !important; padding:0 var(--RS__pageGutter) !important; margin:0 auto !important; - overflow:hidden; box-sizing:border-box; } +:root:not([style*="readium-noOverflow-on"]) body{ + overflow:hidden; +} + @supports (overflow: clip){ - :root{ + :root:not([style*="readium-noOverflow-on"]){ overflow:clip; } - body{ + :root:not([style*="readium-noOverflow-on"]) body{ overflow:clip; overflow-clip-margin:content-box; } @@ -96,16 +99,19 @@ body{ :root[style*="readium-scroll-on"] body{ max-width:var(--RS__defaultLineLength) !important; +} + +:root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]) body{ overflow:auto; } @supports (overflow: clip){ - :root[style*="readium-scroll-on"]{ + :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]){ overflow:auto; } - :root[style*="readium-scroll-on"] body{ + :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]) body{ overflow:clip; } } @@ -332,11 +338,11 @@ body{ text-align-last:auto !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"]{ +:root[style*="--USER__fontFamily"]{ font-family:var(--USER__fontFamily) !important; } -:root[style*="readium-font-on"][style*="--USER__fontFamily"] *{ +:root[style*="--USER__fontFamily"] *{ font-family:revert !important; } @@ -402,20 +408,20 @@ body{ font-variant-ligatures:inherit !important; } -:root[style*="readium-font-on"][style*="--USER__fontWeight"] body{ +:root[style*="--USER__fontWeight"] body{ font-weight:var(--USER__fontWeight) !important; } -:root[style*="readium-font-on"][style*="--USER__fontWeight"] b, -:root[style*="readium-font-on"][style*="--USER__fontWeight"] strong{ +:root[style*="--USER__fontWeight"] b, +:root[style*="--USER__fontWeight"] strong{ font-weight:bolder; } -:root[style*="readium-font-on"][style*="--USER__fontWidth"] body{ +:root[style*="--USER__fontWidth"] body{ font-stretch:var(--USER__fontWidth) !important; } -:root[style*="readium-font-on"][style*="--USER__fontOpticalSizing"] body{ +:root[style*="--USER__fontOpticalSizing"] body{ font-optical-sizing:var(--USER__fontOpticalSizing) !important; } diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css index 935895930..603978198 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -38,6 +38,31 @@ --RS__lineHeightCompensation:1; --RS__baseLineHeight:calc(1.5 * var(--RS__lineHeightCompensation)); + + --RS__selectionTextColor:inherit; + + --RS__selectionBackgroundColor:#b4d8fe; + + --RS__visitedColor:#551A8B; + + --RS__linkColor:#0000EE; + + --RS__textColor:#121212; + + --RS__backgroundColor:#FFFFFF; + color:var(--RS__textColor) !important; + + background-color:var(--RS__backgroundColor) !important; +} + +::-moz-selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); +} + +::selection{ + color:var(--RS__selectionTextColor); + background-color:var(--RS__selectionBackgroundColor); } html{ @@ -193,36 +218,6 @@ math{ --RS__lineHeightCompensation:1.167; } -:root{ - - --RS__selectionTextColor:inherit; - - --RS__selectionBackgroundColor:#b4d8fe; - - --RS__visitedColor:#551A8B; - - --RS__linkColor:#0000EE; - - --RS__textColor:#121212; - - --RS__backgroundColor:#FFFFFF; -} - -:root{ - color:var(--RS__textColor) !important; - background-color:var(--RS__backgroundColor) !important; -} - -::-moz-selection{ - color:var(--RS__selectionTextColor); - background-color:var(--RS__selectionBackgroundColor); -} - -::selection{ - color:var(--RS__selectionTextColor); - background-color:var(--RS__selectionBackgroundColor); -} - body{ widows:2; orphans:2; diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css index c54777b89..f8db389de 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.13) + * Readium CSS (v. 2.0.0-beta.14) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/CSS/CSSProperties.swift b/Sources/Navigator/EPUB/CSS/CSSProperties.swift index 4d93abccf..f74b3d7e9 100644 --- a/Sources/Navigator/EPUB/CSS/CSSProperties.swift +++ b/Sources/Navigator/EPUB/CSS/CSSProperties.swift @@ -150,14 +150,6 @@ public struct CSSUserProperties: CSSProperties { /// Requires: fontOverride public var a11yNormalize: Bool? - /// Acts as an explicit switch to force iPadOS patching of zoom issues so - /// that `--USER__fontSize` can work as expected. This should be applied - /// only when the site is requested in its desktop version on iPadOS – - /// mobile version is completely fine. - /// - /// See https://bugs.webkit.org/show_bug.cgi?id=293617 - public var iPadOSPatch: Bool? - // Additional overrides for extensions and adjustments. public var overrides: [String: String?] @@ -183,7 +175,6 @@ public struct CSSUserProperties: CSSProperties { bodyHyphens: CSSHyphens? = nil, ligatures: CSSLigatures? = nil, a11yNormalize: Bool? = nil, - iPadOSPatch: Bool? = nil, overrides: [String: String?] = [:] ) { self.view = view @@ -207,7 +198,6 @@ public struct CSSUserProperties: CSSProperties { self.bodyHyphens = bodyHyphens self.ligatures = ligatures self.a11yNormalize = a11yNormalize - self.iPadOSPatch = iPadOSPatch self.overrides = overrides } @@ -247,8 +237,6 @@ public struct CSSUserProperties: CSSProperties { // Accessibility props.putCSS(name: "--USER__a11yNormalize", value: CSSFlag(name: "a11y", isEnabled: a11yNormalize)) - props.putCSS(name: "--USER__iPadOSPatch", value: CSSFlag(name: "iPadOSPatch", isEnabled: iPadOSPatch)) - props.merge(overrides, uniquingKeysWith: { _, n in n }) return props } diff --git a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift index 5ef9ab1dd..11b17196b 100644 --- a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift +++ b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift @@ -24,6 +24,20 @@ struct ReadiumCSS { extension ReadiumCSS { mutating func update(with settings: EPUBSettings) { layout = settings.cssLayout + + var overrides: [String: String] = [ + // See https://github.com/readium/css/issues/183 + "--RS__disableOverflow": "readium-noOverflow-on", + + "font-weight": settings.fontWeight + .map { String(format: "%.0f", (Double(CSSStandardFontWeight.normal.rawValue) * $0).clamped(to: 1 ... 1000)) } + ?? "", + ] + + if UIDevice.current.userInterfaceIdiom == .pad { + overrides["--USER__iPadOSPatch"] = "readium-iPadOSPatch-on" + } + userProperties = CSSUserProperties( view: settings.scroll ? .scroll : .paged, colCount: settings.columnCount, @@ -60,12 +74,7 @@ extension ReadiumCSS { bodyHyphens: settings.hyphens.map { $0 ? .auto : .none }, ligatures: settings.ligatures.map { $0 ? .common : .none }, a11yNormalize: settings.textNormalization, - iPadOSPatch: UIDevice.current.userInterfaceIdiom == .pad, - overrides: [ - "font-weight": settings.fontWeight - .map { String(format: "%.0f", (Double(CSSStandardFontWeight.normal.rawValue) * $0).clamped(to: 1 ... 1000)) } - ?? "", - ] + overrides: overrides ) } @@ -126,16 +135,6 @@ extension ReadiumCSS: HTMLInjectable { // https://github.com/readium/r2-navigator-kotlin/issues/193 inj.append(.style("audio[controls] { width: revert; height: revert; }")) - // Fix broken pagination when a book contains `overflow-x: hidden`. - // https://github.com/readium/kotlin-toolkit/issues/292 - // Inspired by https://github.com/readium/readium-css/issues/119#issuecomment-1302348238 - inj.append(.style( - """ - :root[style], :root { overflow: visible !important; } - :root[style] > body, :root > body { overflow: visible !important; } - """ - )) - return inj } From c7087c6d50f4f07a4a61c555e5d03f6c85cb38f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Mon, 23 Jun 2025 16:19:40 +0200 Subject: [PATCH 08/11] Horizontal margins -> line length --- .../Navigator/EPUB/CSS/CSSProperties.swift | 12 +++++----- Sources/Navigator/EPUB/CSS/ReadiumCSS.swift | 2 +- .../Preferences/EPUBPreferences+Legacy.swift | 2 +- .../EPUB/Preferences/EPUBPreferences.swift | 14 +++++------ .../Preferences/EPUBPreferencesEditor.swift | 24 +++++++++---------- .../EPUB/Preferences/EPUBSettings.swift | 22 ++++++++--------- .../Common/Preferences/UserPreferences.swift | 22 ++++++++--------- 7 files changed, 49 insertions(+), 49 deletions(-) diff --git a/Sources/Navigator/EPUB/CSS/CSSProperties.swift b/Sources/Navigator/EPUB/CSS/CSSProperties.swift index f74b3d7e9..b0cff1711 100644 --- a/Sources/Navigator/EPUB/CSS/CSSProperties.swift +++ b/Sources/Navigator/EPUB/CSS/CSSProperties.swift @@ -97,17 +97,17 @@ public struct CSSUserProperties: CSSProperties { /// Requires: advancedSettings public var textAlign: CSSTextAlign? + /// The `max-width` of `body` (to shrink or grow the line-length of body copy). + /// + /// Possible values: any value CSS property `max-width|height` accepts. + public var lineLength: CSSLength? + /// Increasing and decreasing leading (line-height). It impacts body, p, li and div. /// /// Recommended values: a range from 1 to 2. Increments are left to implementers’ judgment. /// Requires: advancedSettings public var lineHeight: CSSLineHeight? - /// The `max-width` of `body` (to shrink or grow the line-length of body copy). - /// - /// Possible values: any value CSS property `max-width|height` accepts. - public var lineLength: CSSLength? - /// The vertical margins (margin-top and margin-bottom) for paragraphs. /// /// Recommended values: a range from 0 to 2rem. Increments are left to implementers’ judgment. @@ -166,8 +166,8 @@ public struct CSSUserProperties: CSSProperties { fontSize: CSSLength? = nil, advancedSettings: Bool? = nil, textAlign: CSSTextAlign? = nil, - lineHeight: CSSLineHeight? = nil, lineLength: CSSLength? = nil, + lineHeight: CSSLineHeight? = nil, paraSpacing: CSSLength? = nil, paraIndent: CSSRemLength? = nil, wordSpacing: CSSRemLength? = nil, diff --git a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift index 11b17196b..cf9fc29cb 100644 --- a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift +++ b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift @@ -65,8 +65,8 @@ extension ReadiumCSS { default: return nil } }(), + lineLength: CSSPercentLength(settings.lineLength), lineHeight: settings.lineHeight.map { .unitless($0) }, - lineLength: CSSPercentLength(settings.horizontalMargins), paraSpacing: settings.paragraphSpacing.map { CSSRemLength($0) }, paraIndent: settings.paragraphIndent.map { CSSRemLength($0) }, wordSpacing: settings.wordSpacing.map { CSSRemLength($0) }, diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift index bc23b92c6..6bf1914bd 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift @@ -40,9 +40,9 @@ public extension EPUBPreferences { .map { FontFamily(rawValue: $0) }, fontSize: defaults.optDouble(for: .fontSize) .map { $0 / 100 }, - horizontalMargins: defaults.optDouble(for: .pageMargins), hyphens: defaults.optBool(for: .hyphens), letterSpacing: defaults.optDouble(for: .letterSpacing), + lineLength: defaults.optDouble(for: .lineHeight), lineHeight: defaults.optDouble(for: .lineHeight), paragraphSpacing: defaults.optDouble(for: .paragraphMargins), publisherStyles: defaults.optBool(for: .publisherDefault), diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift index 2d1abc52e..80a8375fc 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift @@ -41,12 +41,12 @@ public struct EPUBPreferences: ConfigurablePreferences { /// Enable ligatures in Arabic. public var ligatures: Bool? + /// The maximum length of the content. + public var lineLength: Double? + /// Leading line height. public var lineHeight: Double? - /// Factor applied to horizontal margins. - public var horizontalMargins: Double? - /// Text indentation for paragraphs. public var paragraphIndent: Double? @@ -96,12 +96,12 @@ public struct EPUBPreferences: ConfigurablePreferences { fontFamily: FontFamily? = nil, fontSize: Double? = nil, fontWeight: Double? = nil, - horizontalMargins: Double? = nil, hyphens: Bool? = nil, imageFilter: ImageFilter? = nil, language: Language? = nil, letterSpacing: Double? = nil, ligatures: Bool? = nil, + lineLength: Double? = nil, lineHeight: Double? = nil, paragraphIndent: Double? = nil, paragraphSpacing: Double? = nil, @@ -121,12 +121,12 @@ public struct EPUBPreferences: ConfigurablePreferences { self.fontFamily = fontFamily self.fontSize = fontSize.map { max($0, 0) } self.fontWeight = fontWeight?.clamped(to: 0.0 ... 2.5) - self.horizontalMargins = horizontalMargins.map { max($0, 0) } self.hyphens = hyphens self.imageFilter = imageFilter self.language = language self.letterSpacing = letterSpacing.map { max($0, 0) } self.ligatures = ligatures + self.lineLength = lineLength.map { max($0, 0) } self.lineHeight = lineHeight self.paragraphIndent = paragraphIndent self.paragraphSpacing = paragraphSpacing.map { max($0, 0) } @@ -149,12 +149,12 @@ public struct EPUBPreferences: ConfigurablePreferences { fontFamily: other.fontFamily ?? fontFamily, fontSize: other.fontSize ?? fontSize, fontWeight: other.fontWeight ?? fontWeight, - horizontalMargins: other.horizontalMargins ?? horizontalMargins, hyphens: other.hyphens ?? hyphens, imageFilter: other.imageFilter ?? imageFilter, language: other.language ?? language, letterSpacing: other.letterSpacing ?? letterSpacing, ligatures: other.ligatures ?? ligatures, + lineLength: other.lineLength ?? lineLength, lineHeight: other.lineHeight ?? lineHeight, paragraphIndent: other.paragraphIndent ?? paragraphIndent, paragraphSpacing: other.paragraphSpacing ?? paragraphSpacing, @@ -193,7 +193,7 @@ public struct EPUBPreferences: ConfigurablePreferences { ) } - @available(*, unavailable, renamed: "horizontalMargins") + @available(*, unavailable, message: "Use lineLength instead") public var pageMargins: Double? { nil } @available(*, unavailable, message: "Not available anymore") diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift index 6b6a00fcf..7033e1634 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift @@ -114,18 +114,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = - rangePreference( - preference: \.horizontalMargins, - setting: \.horizontalMargins, - defaultEffectiveValue: defaults.horizontalMargins ?? 1.0, - isEffective: { _ in true }, - supportedRange: 0.0 ... 4.0, - progressionStrategy: .increment(0.3), - format: { $0.formatDecimal(maximumFractionDigits: 5) } - ) - /// Enable hyphenation for latin languages. /// /// Only effective when: @@ -227,6 +215,18 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = + rangePreference( + preference: \.lineLength, + setting: \.lineLength, + defaultEffectiveValue: defaults.lineLength ?? 1.0, + isEffective: { _ in true }, + supportedRange: 0.0 ... 1.0, + progressionStrategy: .increment(0.1), + format: { $0.formatDecimal(maximumFractionDigits: 5) } + ) + /// Text indentation for paragraphs. /// /// Only effective when: diff --git a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift index ed0a09751..c9b639e1d 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift @@ -16,12 +16,12 @@ public struct EPUBSettings: ConfigurableSettings { public var fontFamily: FontFamily? public var fontSize: Double public var fontWeight: Double? - public var horizontalMargins: Double public var hyphens: Bool? public var imageFilter: ImageFilter? public var language: Language? public var letterSpacing: Double? public var ligatures: Bool? + public var lineLength: Double public var lineHeight: Double? public var paragraphIndent: Double? public var paragraphSpacing: Double? @@ -48,12 +48,12 @@ public struct EPUBSettings: ConfigurableSettings { fontFamily: FontFamily?, fontSize: Double, fontWeight: Double?, - horizontalMargins: Double, hyphens: Bool?, imageFilter: ImageFilter?, language: Language?, letterSpacing: Double?, ligatures: Bool?, + lineLength: Double, lineHeight: Double?, paragraphIndent: Double?, paragraphSpacing: Double?, @@ -73,12 +73,12 @@ public struct EPUBSettings: ConfigurableSettings { self.fontFamily = fontFamily self.fontSize = fontSize self.fontWeight = fontWeight - self.horizontalMargins = horizontalMargins self.hyphens = hyphens self.imageFilter = imageFilter self.language = language self.letterSpacing = letterSpacing self.ligatures = ligatures + self.lineLength = lineLength self.lineHeight = lineHeight self.paragraphIndent = paragraphIndent self.paragraphSpacing = paragraphSpacing @@ -142,9 +142,6 @@ public struct EPUBSettings: ConfigurableSettings { ?? 1.0, fontWeight: preferences.fontWeight ?? defaults.fontWeight, - horizontalMargins: preferences.horizontalMargins - ?? defaults.horizontalMargins - ?? 1.0, hyphens: preferences.hyphens ?? defaults.hyphens, imageFilter: preferences.imageFilter @@ -154,6 +151,9 @@ public struct EPUBSettings: ConfigurableSettings { ?? defaults.letterSpacing, ligatures: preferences.ligatures ?? defaults.ligatures, + lineLength: preferences.lineLength + ?? defaults.lineLength + ?? 1.0, lineHeight: preferences.lineHeight ?? defaults.lineHeight, paragraphIndent: preferences.paragraphIndent @@ -186,7 +186,7 @@ public struct EPUBSettings: ConfigurableSettings { @available(*, unavailable, message: "Not supported anymore") public var typeScale: Double? { nil } - @available(*, unavailable, renamed: "horizontalMargins") + @available(*, unavailable, message: "Use lineLength") public var pageMargins: Double? { nil } @available(*, unavailable, message: "Use the other initializer") @@ -229,12 +229,12 @@ public struct EPUBDefaults { public var columnCount: Int? public var fontSize: Double? public var fontWeight: Double? - public var horizontalMargins: Double? public var hyphens: Bool? public var imageFilter: ImageFilter? public var language: Language? public var letterSpacing: Double? public var ligatures: Bool? + public var lineLength: Double? public var lineHeight: Double? public var paragraphIndent: Double? public var paragraphSpacing: Double? @@ -250,12 +250,12 @@ public struct EPUBDefaults { columnCount: Int? = nil, fontSize: Double? = nil, fontWeight: Double? = nil, - horizontalMargins: Double? = nil, hyphens: Bool? = nil, imageFilter: ImageFilter? = nil, language: Language? = nil, letterSpacing: Double? = nil, ligatures: Bool? = nil, + lineLength: Double? = nil, lineHeight: Double? = nil, paragraphIndent: Double? = nil, paragraphSpacing: Double? = nil, @@ -271,12 +271,12 @@ public struct EPUBDefaults { self.columnCount = columnCount self.fontSize = fontSize self.fontWeight = fontWeight - self.horizontalMargins = horizontalMargins self.hyphens = hyphens self.imageFilter = imageFilter self.language = language self.letterSpacing = letterSpacing self.ligatures = ligatures + self.lineLength = lineLength self.lineHeight = lineHeight self.paragraphIndent = paragraphIndent self.paragraphSpacing = paragraphSpacing @@ -289,7 +289,7 @@ public struct EPUBDefaults { self.wordSpacing = wordSpacing } - @available(*, unavailable, renamed: "horizontalMargins") + @available(*, unavailable, message: "Use lineLength instead") public var pageMargins: Double? { nil } @available(*, unavailable, message: "Not supported anymore") diff --git a/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift b/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift index da80abd5b..6ece5c7ee 100644 --- a/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift +++ b/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift @@ -98,13 +98,13 @@ struct UserPreferences< fontFamily: editor.fontFamily, fontSize: editor.fontSize, fontWeight: editor.fontWeight, - horizontalMargins: editor.horizontalMargins, hyphens: editor.hyphens, imageFilter: editor.imageFilter, language: editor.language, letterSpacing: editor.letterSpacing, ligatures: editor.ligatures, lineHeight: editor.lineHeight, + lineLength: editor.lineLength, paragraphIndent: editor.paragraphIndent, paragraphSpacing: editor.paragraphSpacing, publisherStyles: editor.publisherStyles, @@ -302,13 +302,13 @@ struct UserPreferences< fontFamily: AnyPreference? = nil, fontSize: AnyRangePreference? = nil, fontWeight: AnyRangePreference? = nil, - horizontalMargins: AnyRangePreference? = nil, hyphens: AnyPreference? = nil, imageFilter: AnyEnumPreference? = nil, language: AnyPreference? = nil, letterSpacing: AnyRangePreference? = nil, ligatures: AnyPreference? = nil, lineHeight: AnyRangePreference? = nil, + lineLength: AnyRangePreference? = nil, paragraphIndent: AnyRangePreference? = nil, paragraphSpacing: AnyRangePreference? = nil, publisherStyles: AnyPreference? = nil, @@ -355,7 +355,7 @@ struct UserPreferences< } } - if scroll != nil || columnCount != nil || horizontalMargins != nil { + if scroll != nil || columnCount != nil { Section { if let scroll = scroll { toggleRow( @@ -372,14 +372,6 @@ struct UserPreferences< commit: commit, ) } - - if let horizontalMargins = horizontalMargins { - stepperRow( - title: "Horizontal margins", - preference: horizontalMargins, - commit: commit - ) - } } } @@ -518,6 +510,14 @@ struct UserPreferences< } ) } + + if let lineLength = lineLength { + stepperRow( + title: "Line length", + preference: lineLength, + commit: commit + ) + } if let lineHeight = lineHeight { stepperRow( From abd4d80b1ed0da4dfe2466bc21ba090bc5d0692d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Mon, 23 Jun 2025 17:10:34 +0200 Subject: [PATCH 09/11] Remove font override and publisher styles preferences --- .../Navigator/EPUB/CSS/CSSProperties.swift | 26 --- Sources/Navigator/EPUB/CSS/ReadiumCSS.swift | 2 - .../Preferences/EPUBPreferences+Legacy.swift | 2 - .../EPUB/Preferences/EPUBPreferences.swift | 11 +- .../Preferences/EPUBPreferencesEditor.swift | 30 +--- .../EPUB/Preferences/EPUBSettings.swift | 15 +- .../Common/Preferences/UserPreferences.swift | 161 ++++++++---------- 7 files changed, 85 insertions(+), 162 deletions(-) diff --git a/Sources/Navigator/EPUB/CSS/CSSProperties.swift b/Sources/Navigator/EPUB/CSS/CSSProperties.swift index b0cff1711..6a19b7c58 100644 --- a/Sources/Navigator/EPUB/CSS/CSSProperties.swift +++ b/Sources/Navigator/EPUB/CSS/CSSProperties.swift @@ -71,14 +71,10 @@ public struct CSSUserProperties: CSSProperties { // Typography - /// This flag is required to change the font-family user setting. - public var fontOverride: Bool? - /// The typeface (font-family) the user wants to read with. It impacts body, p, li, div, dt, dd /// and phrasing elements which don’t have a lang or xml:lang attribute. /// /// To reset, remove the required flag. - /// Requires: fontOverride public var fontFamily: [String]? /// Increasing and decreasing the root font-size. It will serve as a reference for the cascade. @@ -88,13 +84,8 @@ public struct CSSUserProperties: CSSProperties { // Advanced settings - /// This flag is required to apply the font-size and/or advanced user settings. - public var advancedSettings: Bool? - /// The alignment (text-align) the user prefers. It impacts body, li, and p which are not /// children of blockquote and figcaption. - /// - /// Requires: advancedSettings public var textAlign: CSSTextAlign? /// The `max-width` of `body` (to shrink or grow the line-length of body copy). @@ -105,49 +96,38 @@ public struct CSSUserProperties: CSSProperties { /// Increasing and decreasing leading (line-height). It impacts body, p, li and div. /// /// Recommended values: a range from 1 to 2. Increments are left to implementers’ judgment. - /// Requires: advancedSettings public var lineHeight: CSSLineHeight? /// The vertical margins (margin-top and margin-bottom) for paragraphs. /// /// Recommended values: a range from 0 to 2rem. Increments are left to implementers’ judgment. - /// Requires: advancedSettings = true public var paraSpacing: CSSLength? /// The text-indent for paragraphs. /// /// Recommended values: a range from 0 to 3rem. Increments are left to implementers’ judgment. - /// Requires: advancedSettings public var paraIndent: CSSRemLength? /// Increasing space between words (word-spacing, related to a11y). /// /// Recommended values: a range from 0 to 1rem. Increments are left to implementers’ judgment. - /// Requires: advancedSettings public var wordSpacing: CSSRemLength? /// Increasing space between letters (letter-spacing, related to a11y). /// /// Recommended values: a range from 0 to 0.5rem. Increments are left to implementers’ /// judgment. - /// Requires: advancedSettings public var letterSpacing: CSSRemLength? /// Enabling and disabling hyphenation. It impacts body, p, li, div and dd. - /// - /// Requires: advancedSettings public var bodyHyphens: CSSHyphens? /// Enabling and disabling ligatures in Arabic (related to a11y). - /// - /// Requires: advancedSettings public var ligatures: CSSLigatures? // Accessibility /// It impacts font style, weight and variant, text decoration, super and subscripts. - /// - /// Requires: fontOverride public var a11yNormalize: Bool? // Additional overrides for extensions and adjustments. @@ -161,10 +141,8 @@ public struct CSSUserProperties: CSSProperties { invertImages: Bool? = nil, textColor: CSSColor? = nil, backgroundColor: CSSColor? = nil, - fontOverride: Bool? = nil, fontFamily: [String]? = nil, fontSize: CSSLength? = nil, - advancedSettings: Bool? = nil, textAlign: CSSTextAlign? = nil, lineLength: CSSLength? = nil, lineHeight: CSSLineHeight? = nil, @@ -184,10 +162,8 @@ public struct CSSUserProperties: CSSProperties { self.invertImages = invertImages self.textColor = textColor self.backgroundColor = backgroundColor - self.fontOverride = fontOverride self.fontFamily = fontFamily self.fontSize = fontSize - self.advancedSettings = advancedSettings self.textAlign = textAlign self.lineHeight = lineHeight self.lineLength = lineLength @@ -219,11 +195,9 @@ public struct CSSUserProperties: CSSProperties { props.putCSS(name: "--USER__backgroundColor", value: backgroundColor) // Typography - props.putCSS(name: "--USER__fontOverride", value: CSSFlag(name: "font", isEnabled: fontOverride)) props.putCSS(name: "--USER__fontFamily", value: fontFamily) props.putCSS(name: "--USER__fontSize", value: fontSize) - props.putCSS(name: "--USER__advancedSettings", value: CSSFlag(name: "advanced", isEnabled: advancedSettings)) props.putCSS(name: "--USER__textAlign", value: textAlign) props.putCSS(name: "--USER__lineHeight", value: lineHeight) props.putCSS(name: "--USER__lineLength", value: lineLength) diff --git a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift index cf9fc29cb..6838a1d4a 100644 --- a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift +++ b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift @@ -52,10 +52,8 @@ extension ReadiumCSS { invertImages: settings.imageFilter == .invert, textColor: settings.textColor.map { CSSIntColor($0.rawValue) }, backgroundColor: settings.backgroundColor.map { CSSIntColor($0.rawValue) }, - fontOverride: settings.fontFamily != nil || settings.textNormalization, fontFamily: settings.fontFamily.map(resolveFontStack), fontSize: CSSPercentLength(settings.fontSize), - advancedSettings: !settings.publisherStyles, textAlign: { switch settings.textAlign { case .justify: return .justify diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift index 6bf1914bd..fbac10c66 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferences+Legacy.swift @@ -45,7 +45,6 @@ public extension EPUBPreferences { lineLength: defaults.optDouble(for: .lineHeight), lineHeight: defaults.optDouble(for: .lineHeight), paragraphSpacing: defaults.optDouble(for: .paragraphMargins), - publisherStyles: defaults.optBool(for: .publisherDefault), scroll: defaults.optBool(for: .scroll), // Used to be merged with column-count spread: defaults.optInt(for: .columnCount) @@ -127,7 +126,6 @@ private enum ReadiumCSSName: String { case fontOverride = "--USER__fontOverride" case appearance = "--USER__appearance" case scroll = "--USER__scroll" - case publisherDefault = "--USER__advancedSettings" case textAlignment = "--USER__textAlign" case columnCount = "--USER__colCount" case wordSpacing = "--USER__wordSpacing" diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift index 80a8375fc..438dcf51b 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift @@ -53,11 +53,6 @@ public struct EPUBPreferences: ConfigurablePreferences { /// Vertical margins for paragraphs. public var paragraphSpacing: Double? - /// Indicates whether the original publisher styles should be observed. - /// - /// Many settings require this to be off. - public var publisherStyles: Bool? - /// Direction of the reading progression across resources. public var readingProgression: ReadingProgression? @@ -105,7 +100,6 @@ public struct EPUBPreferences: ConfigurablePreferences { lineHeight: Double? = nil, paragraphIndent: Double? = nil, paragraphSpacing: Double? = nil, - publisherStyles: Bool? = nil, readingProgression: ReadingProgression? = nil, scroll: Bool? = nil, spread: Spread? = nil, @@ -130,7 +124,6 @@ public struct EPUBPreferences: ConfigurablePreferences { self.lineHeight = lineHeight self.paragraphIndent = paragraphIndent self.paragraphSpacing = paragraphSpacing.map { max($0, 0) } - self.publisherStyles = publisherStyles self.readingProgression = readingProgression self.scroll = scroll self.spread = [nil, .never, .always].contains(spread) ? spread : nil @@ -158,7 +151,6 @@ public struct EPUBPreferences: ConfigurablePreferences { lineHeight: other.lineHeight ?? lineHeight, paragraphIndent: other.paragraphIndent ?? paragraphIndent, paragraphSpacing: other.paragraphSpacing ?? paragraphSpacing, - publisherStyles: other.publisherStyles ?? publisherStyles, readingProgression: other.readingProgression ?? readingProgression, scroll: other.scroll ?? scroll, spread: other.spread ?? spread, @@ -199,6 +191,9 @@ public struct EPUBPreferences: ConfigurablePreferences { @available(*, unavailable, message: "Not available anymore") public var typeScale: Double? { nil } + @available(*, unavailable, message: "Not needed anymore") + public var publisherStyles: Bool? { nil } + @available(*, unavailable, message: "Use the other initializer") public init( backgroundColor: Color? = nil, diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift index 7033e1634..f334fd6d2 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift @@ -118,7 +118,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = preference( @@ -128,7 +127,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = rangePreference( @@ -168,7 +165,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = preference( @@ -190,7 +185,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = rangePreference( preference: \.lineHeight, @@ -207,7 +200,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = rangePreference( @@ -241,7 +232,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = rangePreference( preference: \.paragraphSpacing, @@ -261,7 +250,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = - preference( - preference: \.publisherStyles, - setting: \.publisherStyles, - defaultEffectiveValue: defaults.publisherStyles ?? true, - isEffective: { [layout] _ in layout == .reflowable } - ) - /// Direction of the reading progression across resources. /// /// This can be changed to influence directly the layout (e.g. LTR or RTL). @@ -324,7 +300,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = enumPreference( @@ -333,7 +308,6 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor { fatalError() } + + @available(*, unavailable, message: "Not needed anymore") + public var publisherStyles: AnyPreference { fatalError() } } diff --git a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift index c9b639e1d..b3f4f9c42 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift @@ -25,7 +25,6 @@ public struct EPUBSettings: ConfigurableSettings { public var lineHeight: Double? public var paragraphIndent: Double? public var paragraphSpacing: Double? - public var publisherStyles: Bool public var readingProgression: ReadingProgression public var scroll: Bool public var spread: Spread @@ -57,7 +56,6 @@ public struct EPUBSettings: ConfigurableSettings { lineHeight: Double?, paragraphIndent: Double?, paragraphSpacing: Double?, - publisherStyles: Bool, readingProgression: ReadingProgression, scroll: Bool, spread: Spread, @@ -82,7 +80,6 @@ public struct EPUBSettings: ConfigurableSettings { self.lineHeight = lineHeight self.paragraphIndent = paragraphIndent self.paragraphSpacing = paragraphSpacing - self.publisherStyles = publisherStyles self.readingProgression = readingProgression self.scroll = scroll self.spread = spread @@ -160,9 +157,6 @@ public struct EPUBSettings: ConfigurableSettings { ?? defaults.paragraphIndent, paragraphSpacing: preferences.paragraphSpacing ?? defaults.paragraphSpacing, - publisherStyles: preferences.publisherStyles - ?? defaults.publisherStyles - ?? true, readingProgression: readingProgression, scroll: scroll, spread: preferences.spread @@ -189,6 +183,9 @@ public struct EPUBSettings: ConfigurableSettings { @available(*, unavailable, message: "Use lineLength") public var pageMargins: Double? { nil } + @available(*, unavailable, message: "Not needed anymore") + public var publisherStyles: Bool? { nil } + @available(*, unavailable, message: "Use the other initializer") public init( backgroundColor: Color?, @@ -238,7 +235,6 @@ public struct EPUBDefaults { public var lineHeight: Double? public var paragraphIndent: Double? public var paragraphSpacing: Double? - public var publisherStyles: Bool? public var readingProgression: ReadingProgression? public var scroll: Bool? public var spread: Spread? @@ -259,7 +255,6 @@ public struct EPUBDefaults { lineHeight: Double? = nil, paragraphIndent: Double? = nil, paragraphSpacing: Double? = nil, - publisherStyles: Bool? = nil, readingProgression: ReadingProgression? = nil, scroll: Bool? = nil, spread: Spread? = nil, @@ -280,7 +275,6 @@ public struct EPUBDefaults { self.lineHeight = lineHeight self.paragraphIndent = paragraphIndent self.paragraphSpacing = paragraphSpacing - self.publisherStyles = publisherStyles self.readingProgression = readingProgression self.scroll = scroll self.spread = spread @@ -295,6 +289,9 @@ public struct EPUBDefaults { @available(*, unavailable, message: "Not supported anymore") public var typeScale: Double? { nil } + @available(*, unavailable, message: "Not needed anymore") + public var publisherStyles: Bool? { nil } + @available(*, unavailable, message: "Use the other initializer") public init( columnCount: ColumnCount? = nil, diff --git a/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift b/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift index 6ece5c7ee..4770b5f72 100644 --- a/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift +++ b/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift @@ -107,7 +107,6 @@ struct UserPreferences< lineLength: editor.lineLength, paragraphIndent: editor.paragraphIndent, paragraphSpacing: editor.paragraphSpacing, - publisherStyles: editor.publisherStyles, readingProgression: editor.readingProgression, scroll: editor.scroll, textAlign: editor.textAlign, @@ -311,7 +310,6 @@ struct UserPreferences< lineLength: AnyRangePreference? = nil, paragraphIndent: AnyRangePreference? = nil, paragraphSpacing: AnyRangePreference? = nil, - publisherStyles: AnyPreference? = nil, readingProgression: AnyEnumPreference? = nil, scroll: AnyPreference? = nil, textAlign: AnyEnumPreference? = nil, @@ -480,101 +478,88 @@ struct UserPreferences< } } - if let publisherStyles = publisherStyles { - Section { - toggleRow( - title: "Publisher styles", - preference: publisherStyles, - commit: commit + Section { + if let textAlign = textAlign { + pickerRow( + title: "Text alignment", + preference: textAlign, + commit: commit, + formatValue: { v in + switch v { + case nil: return "Default" + case .center: return "Center" + case .left: return "Left" + case .right: return "Right" + case .justify: return "Justify" + case .start: return "Start" + case .end: return "End" + } + } ) + } - // The following settings all require the publisher styles to - // be disabled for EPUB. To simplify the interface, they are - // hidden when the publisher styles are on. - if !publisherStyles.effectiveValue { - if let textAlign = textAlign { - pickerRow( - title: "Text alignment", - preference: textAlign, - commit: commit, - formatValue: { v in - switch v { - case nil: return "Default" - case .center: return "Center" - case .left: return "Left" - case .right: return "Right" - case .justify: return "Justify" - case .start: return "Start" - case .end: return "End" - } - } - ) - } - - if let lineLength = lineLength { - stepperRow( - title: "Line length", - preference: lineLength, - commit: commit - ) - } + if let lineLength = lineLength { + stepperRow( + title: "Line length", + preference: lineLength, + commit: commit + ) + } - if let lineHeight = lineHeight { - stepperRow( - title: "Line height", - preference: lineHeight, - commit: commit - ) - } + if let lineHeight = lineHeight { + stepperRow( + title: "Line height", + preference: lineHeight, + commit: commit + ) + } - if let paragraphIndent = paragraphIndent { - stepperRow( - title: "Paragraph indent", - preference: paragraphIndent, - commit: commit - ) - } + if let paragraphIndent = paragraphIndent { + stepperRow( + title: "Paragraph indent", + preference: paragraphIndent, + commit: commit + ) + } - if let paragraphSpacing = paragraphSpacing { - stepperRow( - title: "Paragraph spacing", - preference: paragraphSpacing, - commit: commit - ) - } + if let paragraphSpacing = paragraphSpacing { + stepperRow( + title: "Paragraph spacing", + preference: paragraphSpacing, + commit: commit + ) + } - if let wordSpacing = wordSpacing { - stepperRow( - title: "Word spacing", - preference: wordSpacing, - commit: commit - ) - } + if let wordSpacing = wordSpacing { + stepperRow( + title: "Word spacing", + preference: wordSpacing, + commit: commit + ) + } - if let letterSpacing = letterSpacing { - stepperRow( - title: "Letter spacing", - preference: letterSpacing, - commit: commit - ) - } + if let letterSpacing = letterSpacing { + stepperRow( + title: "Letter spacing", + preference: letterSpacing, + commit: commit + ) + } - if let hyphens = hyphens { - toggleRow( - title: "Hyphens", - preference: hyphens, - commit: commit - ) - } + if let hyphens = hyphens { + toggleRow( + title: "Hyphens", + preference: hyphens, + commit: commit + ) + } - if let ligatures = ligatures { - toggleRow( - title: "Ligatures", - preference: ligatures, - commit: commit - ) - } - } + if let ligatures = ligatures { + toggleRow( + title: "Ligatures", + preference: ligatures, + commit: commit + ) } } } From fbb49d3f4083684911a62c7a0fbb7de2bd7a2052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Mon, 23 Jun 2025 18:42:38 +0200 Subject: [PATCH 10/11] Add new image filters --- .../Navigator/EPUB/CSS/CSSProperties.swift | 46 ++- Sources/Navigator/EPUB/CSS/ReadiumCSS.swift | 6 +- .../EPUB/Preferences/EPUBPreferences.swift | 31 +- .../Preferences/EPUBPreferencesEditor.swift | 83 ++++- .../EPUB/Preferences/EPUBSettings.swift | 27 +- Sources/Navigator/Preferences/Types.swift | 1 + .../Common/Preferences/UserPreferences.swift | 291 ++++++++++-------- 7 files changed, 314 insertions(+), 171 deletions(-) diff --git a/Sources/Navigator/EPUB/CSS/CSSProperties.swift b/Sources/Navigator/EPUB/CSS/CSSProperties.swift index 6a19b7c58..952568057 100644 --- a/Sources/Navigator/EPUB/CSS/CSSProperties.swift +++ b/Sources/Navigator/EPUB/CSS/CSSProperties.swift @@ -51,15 +51,21 @@ public struct CSSUserProperties: CSSProperties { /// This flag applies a reading mode (sepia or night). public var appearance: CSSAppearance? - /// This will only apply in night mode to darken images and impact img. - /// - /// Requires: appearance = Appearance.Night - public var darkenImages: Bool? + /// This will apply a mix-blend-mode of multiply with a transparent + /// background to blend images with a white background with the + /// background-color of your theme. + public var blendImages: Bool? - /// This will only apply in night mode to invert images and impact img. - /// - /// Requires: appearance = Appearance.Night - public var invertImages: Bool? + /// This will apply a brightness filter with the percentage value it's + /// given. + public var darkenImages: CSSPercent? + + /// This will apply an invert filter with the percentage value it's given. + public var invertImages: CSSPercent? + + /// This will apply an invert filter with the percentage value it's given, + /// only to img class="gaiji". + public var invertGaiji: CSSPercent? /// The color for textual contents. It impacts all elements but headings and pre in the DOM. /// @@ -137,8 +143,10 @@ public struct CSSUserProperties: CSSProperties { view: CSSView? = nil, colCount: Int? = nil, appearance: CSSAppearance? = nil, - darkenImages: Bool? = nil, - invertImages: Bool? = nil, + blendImages: Bool? = nil, + darkenImages: CSSPercent? = nil, + invertImages: CSSPercent? = nil, + invertGaiji: CSSPercent? = nil, textColor: CSSColor? = nil, backgroundColor: CSSColor? = nil, fontFamily: [String]? = nil, @@ -158,8 +166,10 @@ public struct CSSUserProperties: CSSProperties { self.view = view self.colCount = colCount self.appearance = appearance + self.blendImages = blendImages self.darkenImages = darkenImages self.invertImages = invertImages + self.invertGaiji = invertGaiji self.textColor = textColor self.backgroundColor = backgroundColor self.fontFamily = fontFamily @@ -187,8 +197,10 @@ public struct CSSUserProperties: CSSProperties { // Appearance props.putCSS(name: "--USER__appearance", value: appearance) - props.putCSS(name: "--USER__darkenImages", value: CSSFlag(name: "darken", isEnabled: darkenImages)) - props.putCSS(name: "--USER__invertImages", value: CSSFlag(name: "invert", isEnabled: invertImages)) + props.putCSS(name: "--USER__blendImages", value: CSSFlag(name: "blend", isEnabled: blendImages)) + props.putCSS(name: "--USER__darkenImages", value: darkenImages) + props.putCSS(name: "--USER__invertImages", value: invertImages) + props.putCSS(name: "--USER__invertGaiji", value: invertGaiji) // Colors props.putCSS(name: "--USER__textColor", value: textColor) @@ -503,6 +515,16 @@ public enum CSSAppearance: String, CSSConvertible { public func css() -> String? { rawValue } } +public struct CSSPercent: CSSConvertible { + public let value: Double + + public init(_ value: Double) { + self.value = value + } + + public func css() -> String? { (value * 100).css(unit: "%") } +} + public protocol CSSColor: CSSConvertible {} public struct CSSRGBColor: CSSColor { diff --git a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift index 6838a1d4a..0f3f8d99f 100644 --- a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift +++ b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift @@ -48,8 +48,10 @@ extension ReadiumCSS { case .sepia: return .sepia } }(), - darkenImages: settings.imageFilter == .darken, - invertImages: settings.imageFilter == .invert, + blendImages: settings.blendImages, + darkenImages: settings.darkenImages.map { CSSPercent(1 - $0) }, + invertImages: settings.invertImages.map { CSSPercent($0) }, + invertGaiji: settings.invertGaiji.map { CSSPercent($0) }, textColor: settings.textColor.map { CSSIntColor($0.rawValue) }, backgroundColor: settings.backgroundColor.map { CSSIntColor($0.rawValue) }, fontFamily: settings.fontFamily.map(resolveFontStack), diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift index 438dcf51b..7b1957677 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferences.swift @@ -14,9 +14,15 @@ public struct EPUBPreferences: ConfigurablePreferences { /// Default page background color. public var backgroundColor: Color? + /// Blends the images with the background color. + public var blendImages: Bool? + /// Number of reflowable columns to display. public var columnCount: Int? + /// Darkens images by the given percentage. + public var darkenImages: Double? + /// Default typeface for the text. public var fontFamily: FontFamily? @@ -29,8 +35,11 @@ public struct EPUBPreferences: ConfigurablePreferences { /// Enable hyphenation. public var hyphens: Bool? - /// Filter applied to images in dark theme. - public var imageFilter: ImageFilter? + /// Inverts the color of gaiji images by the given percentage. + public var invertGaiji: Double? + + /// Inverts the color of images by the given percentage. + public var invertImages: Double? /// Language of the publication content. public var language: Language? @@ -87,12 +96,15 @@ public struct EPUBPreferences: ConfigurablePreferences { public init( backgroundColor: Color? = nil, + blendImages: Bool? = nil, columnCount: Int? = nil, + darkenImages: Double? = nil, fontFamily: FontFamily? = nil, fontSize: Double? = nil, fontWeight: Double? = nil, hyphens: Bool? = nil, - imageFilter: ImageFilter? = nil, + invertGaiji: Double? = nil, + invertImages: Double? = nil, language: Language? = nil, letterSpacing: Double? = nil, ligatures: Bool? = nil, @@ -111,12 +123,15 @@ public struct EPUBPreferences: ConfigurablePreferences { wordSpacing: Double? = nil ) { self.backgroundColor = backgroundColor + self.blendImages = blendImages self.columnCount = columnCount + self.darkenImages = darkenImages self.fontFamily = fontFamily self.fontSize = fontSize.map { max($0, 0) } self.fontWeight = fontWeight?.clamped(to: 0.0 ... 2.5) self.hyphens = hyphens - self.imageFilter = imageFilter + self.invertGaiji = invertGaiji + self.invertImages = invertImages self.language = language self.letterSpacing = letterSpacing.map { max($0, 0) } self.ligatures = ligatures @@ -138,12 +153,15 @@ public struct EPUBPreferences: ConfigurablePreferences { public func merging(_ other: EPUBPreferences) -> EPUBPreferences { EPUBPreferences( backgroundColor: other.backgroundColor ?? backgroundColor, + blendImages: other.blendImages ?? blendImages, columnCount: other.columnCount ?? columnCount, + darkenImages: other.darkenImages ?? darkenImages, fontFamily: other.fontFamily ?? fontFamily, fontSize: other.fontSize ?? fontSize, fontWeight: other.fontWeight ?? fontWeight, hyphens: other.hyphens ?? hyphens, - imageFilter: other.imageFilter ?? imageFilter, + invertGaiji: other.invertGaiji ?? invertGaiji, + invertImages: other.invertImages ?? invertImages, language: other.language ?? language, letterSpacing: other.letterSpacing ?? letterSpacing, ligatures: other.ligatures ?? ligatures, @@ -194,6 +212,9 @@ public struct EPUBPreferences: ConfigurablePreferences { @available(*, unavailable, message: "Not needed anymore") public var publisherStyles: Bool? { nil } + @available(*, unavailable, message: "Use invertImages or darkenImages instead") + public var imageFilter: ImageFilter? { nil } + @available(*, unavailable, message: "Use the other initializer") public init( backgroundColor: Color? = nil, diff --git a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift index f334fd6d2..578a37b34 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBPreferencesEditor.swift @@ -47,6 +47,20 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = + preference( + preference: \.blendImages, + effectiveValue: { $0.settings.blendImages }, + defaultEffectiveValue: false, + isEffective: { [layout] in + layout == .reflowable + && $0.preferences.blendImages != nil + } + ) + /// Number of reflowable columns to display (one-page view or two-page /// spread). /// @@ -67,6 +81,23 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = + rangePreference( + preference: \.darkenImages, + effectiveValue: { $0.settings.darkenImages }, + defaultEffectiveValue: 0, + isEffective: { [layout] in + layout == .reflowable + && $0.preferences.darkenImages != nil + }, + supportedRange: 0.0 ... 1.0, + progressionStrategy: .increment(0.1), + format: \.percentageString + ) + /// Default typeface for the text. /// /// Only effective with reflowable publications. @@ -131,16 +162,49 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor = - enumPreference( - preference: \.imageFilter, - setting: \.imageFilter, - isEffective: { _ in true }, - supportedValues: [nil, .darken, .invert] + public lazy var invertGaiji: AnyPreference = + rangePreference( + preference: \.invertGaiji, + effectiveValue: { $0.settings.invertGaiji }, + defaultEffectiveValue: 0, + isEffective: { [layout] in + layout == .reflowable + && $0.preferences.invertGaiji != nil + }, + supportedRange: 0.0 ... 1.0, + progressionStrategy: .increment(0.1), + format: \.percentageString + ) + .map( + from: { $0 > 0 }, + to: { $0 ? 1.0 : 0.0 } + ) + .eraseToAnyPreference() + + /// Inverts the color of images by the given percentage. + /// + /// Only effective when the publication is reflowable. + public lazy var invertImages: AnyPreference = + rangePreference( + preference: \.invertImages, + effectiveValue: { $0.settings.invertImages }, + defaultEffectiveValue: 0, + isEffective: { [layout] in + layout == .reflowable + && $0.preferences.invertImages != nil + }, + supportedRange: 0.0 ... 1.0, + progressionStrategy: .increment(0.1), + format: \.percentageString + ) + .map( + from: { $0 > 0 }, + to: { $0 ? 1.0 : 0.0 } ) + .eraseToAnyPreference() /// Language of the publication content. /// @@ -216,7 +280,7 @@ public final class EPUBPreferencesEditor: StatefulPreferencesEditor { fatalError() } + + @available(*, unavailable, message: "Use darkenImages and invertImages instead") + public var imageFilter: AnyEnumPreference { fatalError() } } diff --git a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift index b3f4f9c42..bd987255b 100644 --- a/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift +++ b/Sources/Navigator/EPUB/Preferences/EPUBSettings.swift @@ -12,12 +12,15 @@ import ReadiumShared /// See `EPUBPreferences` public struct EPUBSettings: ConfigurableSettings { public var backgroundColor: Color? + public var blendImages: Bool? public var columnCount: Int + public var darkenImages: Double? public var fontFamily: FontFamily? public var fontSize: Double public var fontWeight: Double? public var hyphens: Bool? - public var imageFilter: ImageFilter? + public var invertGaiji: Double? + public var invertImages: Double? public var language: Language? public var letterSpacing: Double? public var ligatures: Bool? @@ -43,12 +46,15 @@ public struct EPUBSettings: ConfigurableSettings { public init( backgroundColor: Color?, + blendImages: Bool?, columnCount: Int, + darkenImages: Double?, fontFamily: FontFamily?, fontSize: Double, fontWeight: Double?, hyphens: Bool?, - imageFilter: ImageFilter?, + invertGaiji: Double?, + invertImages: Double?, language: Language?, letterSpacing: Double?, ligatures: Bool?, @@ -67,12 +73,15 @@ public struct EPUBSettings: ConfigurableSettings { wordSpacing: Double? ) { self.backgroundColor = backgroundColor + self.blendImages = blendImages self.columnCount = columnCount + self.darkenImages = darkenImages self.fontFamily = fontFamily self.fontSize = fontSize self.fontWeight = fontWeight self.hyphens = hyphens - self.imageFilter = imageFilter + self.invertGaiji = invertGaiji + self.invertImages = invertImages self.language = language self.letterSpacing = letterSpacing self.ligatures = ligatures @@ -130,9 +139,11 @@ public struct EPUBSettings: ConfigurableSettings { self.init( backgroundColor: preferences.backgroundColor, + blendImages: preferences.blendImages, columnCount: preferences.columnCount ?? defaults.columnCount ?? 1, + darkenImages: preferences.darkenImages, fontFamily: preferences.fontFamily, fontSize: preferences.fontSize ?? defaults.fontSize @@ -141,8 +152,8 @@ public struct EPUBSettings: ConfigurableSettings { ?? defaults.fontWeight, hyphens: preferences.hyphens ?? defaults.hyphens, - imageFilter: preferences.imageFilter - ?? defaults.imageFilter, + invertGaiji: preferences.invertGaiji, + invertImages: preferences.invertImages, language: language, letterSpacing: preferences.letterSpacing ?? defaults.letterSpacing, @@ -227,7 +238,6 @@ public struct EPUBDefaults { public var fontSize: Double? public var fontWeight: Double? public var hyphens: Bool? - public var imageFilter: ImageFilter? public var language: Language? public var letterSpacing: Double? public var ligatures: Bool? @@ -247,7 +257,6 @@ public struct EPUBDefaults { fontSize: Double? = nil, fontWeight: Double? = nil, hyphens: Bool? = nil, - imageFilter: ImageFilter? = nil, language: Language? = nil, letterSpacing: Double? = nil, ligatures: Bool? = nil, @@ -267,7 +276,6 @@ public struct EPUBDefaults { self.fontSize = fontSize self.fontWeight = fontWeight self.hyphens = hyphens - self.imageFilter = imageFilter self.language = language self.letterSpacing = letterSpacing self.ligatures = ligatures @@ -292,6 +300,9 @@ public struct EPUBDefaults { @available(*, unavailable, message: "Not needed anymore") public var publisherStyles: Bool? { nil } + @available(*, unavailable, message: "Not supported anymore as a defaults") + public var imageFilter: ImageFilter? { nil } + @available(*, unavailable, message: "Use the other initializer") public init( columnCount: ColumnCount? = nil, diff --git a/Sources/Navigator/Preferences/Types.swift b/Sources/Navigator/Preferences/Types.swift index a49b1c0cb..a9172f33a 100644 --- a/Sources/Navigator/Preferences/Types.swift +++ b/Sources/Navigator/Preferences/Types.swift @@ -121,6 +121,7 @@ public enum ColumnCount: String, Codable, Hashable { } /// Filter used to render images in a reflowable document. +@available(*, unavailable) public enum ImageFilter: String, Codable, Hashable { case darken case invert diff --git a/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift b/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift index 4770b5f72..407a25193 100644 --- a/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift +++ b/TestApp/Sources/Reader/Common/Preferences/UserPreferences.swift @@ -94,12 +94,15 @@ struct UserPreferences< reflowableUserPreferences( commit: commit, backgroundColor: editor.backgroundColor, + blendImages: editor.blendImages, columnCount: editor.columnCount, + darkenImages: editor.darkenImages, fontFamily: editor.fontFamily, fontSize: editor.fontSize, fontWeight: editor.fontWeight, hyphens: editor.hyphens, - imageFilter: editor.imageFilter, + invertGaiji: editor.invertGaiji, + invertImages: editor.invertImages, language: editor.language, letterSpacing: editor.letterSpacing, ligatures: editor.ligatures, @@ -297,12 +300,15 @@ struct UserPreferences< @ViewBuilder func reflowableUserPreferences( commit: @escaping () -> Void, backgroundColor: AnyPreference? = nil, + blendImages: AnyPreference? = nil, columnCount: AnyRangePreference? = nil, + darkenImages: AnyRangePreference? = nil, fontFamily: AnyPreference? = nil, fontSize: AnyRangePreference? = nil, fontWeight: AnyRangePreference? = nil, hyphens: AnyPreference? = nil, - imageFilter: AnyEnumPreference? = nil, + invertGaiji: AnyPreference? = nil, + invertImages: AnyPreference? = nil, language: AnyPreference? = nil, letterSpacing: AnyRangePreference? = nil, ligatures: AnyPreference? = nil, @@ -319,162 +325,173 @@ struct UserPreferences< verticalText: AnyPreference? = nil, wordSpacing: AnyRangePreference? = nil ) -> some View { - if language != nil || readingProgression != nil || verticalText != nil { - Section { - if let language = language { - languageRow( - title: "Language", - preference: language, - commit: commit - ) - } + Section { + if let language = language { + languageRow( + title: "Language", + preference: language, + commit: commit + ) + } - if let readingProgression = readingProgression { - pickerRow( - title: "Reading progression", - preference: readingProgression, - commit: commit, - formatValue: { v in - switch v { - case .ltr: return "LTR" - case .rtl: return "RTL" - } + if let readingProgression = readingProgression { + pickerRow( + title: "Reading progression", + preference: readingProgression, + commit: commit, + formatValue: { v in + switch v { + case .ltr: return "LTR" + case .rtl: return "RTL" } - ) - } + } + ) + } - if let verticalText = verticalText { - toggleRow( - title: "Vertical text", - preference: verticalText, - commit: commit - ) - } + if let verticalText = verticalText { + toggleRow( + title: "Vertical text", + preference: verticalText, + commit: commit + ) } } - if scroll != nil || columnCount != nil { - Section { - if let scroll = scroll { - toggleRow( - title: "Scroll", - preference: scroll, - commit: commit - ) - } + Section { + if let scroll = scroll { + toggleRow( + title: "Scroll", + preference: scroll, + commit: commit + ) + } - if let columnCount = columnCount { - stepperRow( - title: "Columns", - preference: columnCount, - commit: commit, - ) - } + if let columnCount = columnCount { + stepperRow( + title: "Columns", + preference: columnCount, + commit: commit, + ) } } - if theme != nil || imageFilter != nil || textColor != nil || backgroundColor != nil { - Section { - if let theme = theme { - pickerRow( - title: "Theme", - preference: theme, - commit: commit, - formatValue: { v in - switch v { - case .light: return "Light" - case .dark: return "Dark" - case .sepia: return "Sepia" - } + Section { + if let theme = theme { + pickerRow( + title: "Theme", + preference: theme, + commit: commit, + formatValue: { v in + switch v { + case .light: return "Light" + case .dark: return "Dark" + case .sepia: return "Sepia" } - ) - } + } + ) + } - if let imageFilter = imageFilter { - pickerRow( - title: "Image filter", - preference: imageFilter, - commit: commit, - formatValue: { v in - switch v { - case nil: return "None" - case .darken: return "Darken colors" - case .invert: return "Invert colors" - } - } - ) - } + if let textColor = textColor { + colorRow( + title: "Text color", + preference: textColor, + commit: commit + ) + } - if let textColor = textColor { - colorRow( - title: "Text color", - preference: textColor, - commit: commit - ) - } + if let backgroundColor = backgroundColor { + colorRow( + title: "Background color", + preference: backgroundColor, + commit: commit + ) + } + } - if let backgroundColor = backgroundColor { - colorRow( - title: "Background color", - preference: backgroundColor, - commit: commit - ) - } + Section { + if let blendImages = blendImages { + toggleRow( + title: "Blend images", + preference: blendImages, + commit: commit + ) + } + + if let darkenImages = darkenImages { + stepperRow( + title: "Darken images", + preference: darkenImages, + commit: commit + ) + } + + if let invertImages = invertImages { + toggleRow( + title: "Invert images", + preference: invertImages, + commit: commit + ) + } + + if let invertGaiji = invertGaiji { + toggleRow( + title: "Invert gaiji", + preference: invertGaiji, + commit: commit + ) } } - if fontFamily != nil || fontSize != nil || fontWeight != nil || textNormalization != nil { - Section { - if let fontFamily = fontFamily { - pickerRow( - title: "Typeface", - preference: fontFamily - .with(supportedValues: [ - nil, - .sansSerif, - .iaWriterDuospace, - .accessibleDfA, - .openDyslexic, - .literata, - ]) - .eraseToAnyPreference(), - commit: commit, - formatValue: { ff in - if let ff = ff { - switch ff { - case .sansSerif: return "Sans serif" - default: return ff.rawValue - } - } else { - return "Original" + Section { + if let fontFamily = fontFamily { + pickerRow( + title: "Typeface", + preference: fontFamily + .with(supportedValues: [ + nil, + .sansSerif, + .iaWriterDuospace, + .accessibleDfA, + .openDyslexic, + .literata, + ]) + .eraseToAnyPreference(), + commit: commit, + formatValue: { ff in + if let ff = ff { + switch ff { + case .sansSerif: return "Sans serif" + default: return ff.rawValue } + } else { + return "Original" } - ) - } + } + ) + } - if let fontSize = fontSize { - stepperRow( - title: "Font size", - preference: fontSize, - commit: commit - ) - } + if let fontSize = fontSize { + stepperRow( + title: "Font size", + preference: fontSize, + commit: commit + ) + } - if let fontWeight = fontWeight { - stepperRow( - title: "Font weight", - preference: fontWeight, - commit: commit - ) - } + if let fontWeight = fontWeight { + stepperRow( + title: "Font weight", + preference: fontWeight, + commit: commit + ) + } - if let textNormalization = textNormalization { - toggleRow( - title: "Text normalization", - preference: textNormalization, - commit: commit - ) - } + if let textNormalization = textNormalization { + toggleRow( + title: "Text normalization", + preference: textNormalization, + commit: commit + ) } } @@ -545,7 +562,9 @@ struct UserPreferences< commit: commit ) } + } + Section { if let hyphens = hyphens { toggleRow( title: "Hyphens", From 6d76b8092167dfcf6d8dc2cfd47b0d4713c214ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Fri, 11 Jul 2025 16:20:56 +0200 Subject: [PATCH 11/11] Apply the iOS patch for font size --- .../EPUB/Assets/Static/readium-css/HEAD | 2 +- .../Static/readium-css/ReadiumCSS-after.css | 25 +++++++++++++++++-- .../Static/readium-css/ReadiumCSS-before.css | 2 +- .../Static/readium-css/ReadiumCSS-default.css | 2 +- .../cjk-horizontal/ReadiumCSS-after.css | 25 +++++++++++++++++-- .../cjk-horizontal/ReadiumCSS-before.css | 2 +- .../cjk-horizontal/ReadiumCSS-default.css | 2 +- .../cjk-vertical/ReadiumCSS-after.css | 25 +++++++++++++++++-- .../cjk-vertical/ReadiumCSS-before.css | 2 +- .../cjk-vertical/ReadiumCSS-default.css | 2 +- .../readium-css/rtl/ReadiumCSS-after.css | 25 +++++++++++++++++-- .../readium-css/rtl/ReadiumCSS-before.css | 2 +- .../readium-css/rtl/ReadiumCSS-default.css | 2 +- Sources/Navigator/EPUB/CSS/ReadiumCSS.swift | 13 +++++++++- 14 files changed, 113 insertions(+), 18 deletions(-) diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD b/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD index 29a47fba8..30337eb51 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/HEAD @@ -1 +1 @@ -cb51601207286f2d2b6b50e4e993614673a4c0de +aa73c5c47ad5281be43fc707c050464841d88081 diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css index c0697e1e7..9f837f48a 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-after.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -99,6 +99,7 @@ body{ :root[style*="readium-scroll-on"] body{ max-width:var(--RS__defaultLineLength) !important; + box-sizing:border-box !important; } :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]) body{ @@ -116,6 +117,22 @@ body{ } } +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingTop"] body{ + padding-top:var(--RS__scrollPaddingTop) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingBottom"] body{ + padding-bottom:var(--RS__scrollPaddingBottom) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingLeft"] body{ + padding-left:var(--RS__scrollPaddingLeft) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingRight"] body{ + padding-right:var(--RS__scrollPaddingRight) !important; +} + :root[style*="readium-night-on"]{ --RS__selectionTextColor:inherit; @@ -404,10 +421,14 @@ body{ vertical-align:baseline !important; } -:root:not([style*="readium-deprecatedFontSize-on"])[style*="--USER__fontSize"] body{ +:root:not([style*="readium-deprecatedFontSize-on"]):not([style*="readium-iOSPatch-on"])[style*="--USER__fontSize"] body{ zoom:var(--USER__fontSize) !important; } +:root[style*="readium-iOSPatch-on"][style*="--USER__fontSize"] body{ + -webkit-text-size-adjust:var(--USER__fontSize) !important; +} + @supports not (zoom: 1){ :root[style*="--USER__fontSize"]{ diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css index dcb2dfd64..99ea6292f 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-before.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css index 8348d1b4c..a95fcd4bc 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/ReadiumCSS-default.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css index 482fd5414..f4bcc17f6 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-after.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -99,6 +99,7 @@ body{ :root[style*="readium-scroll-on"] body{ max-width:var(--RS__defaultLineLength) !important; + box-sizing:border-box !important; } :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]) body{ @@ -116,6 +117,22 @@ body{ } } +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingTop"] body{ + padding-top:var(--RS__scrollPaddingTop) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingBottom"] body{ + padding-bottom:var(--RS__scrollPaddingBottom) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingLeft"] body{ + padding-left:var(--RS__scrollPaddingLeft) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingRight"] body{ + padding-right:var(--RS__scrollPaddingRight) !important; +} + :root[style*="readium-night-on"]{ --RS__selectionTextColor:inherit; @@ -332,10 +349,14 @@ body{ font-family:revert !important; } -:root:not([style*="readium-deprecatedFontSize-on"])[style*="--USER__fontSize"] body{ +:root:not([style*="readium-deprecatedFontSize-on"]):not([style*="readium-iOSPatch-on"])[style*="--USER__fontSize"] body{ zoom:var(--USER__fontSize) !important; } +:root[style*="readium-iOSPatch-on"][style*="--USER__fontSize"] body{ + -webkit-text-size-adjust:var(--USER__fontSize) !important; +} + @supports not (zoom: 1){ :root[style*="--USER__fontSize"]{ diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css index 603978198..6a99eca10 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-before.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css index 630d012bb..83c9fce6b 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-horizontal/ReadiumCSS-default.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css index 8a43a58a7..601def5e8 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-after.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -110,6 +110,7 @@ body{ :root[style*="readium-scroll-on"] body, :root[style*="readium-noVerticalPagination-on"] body{ max-width:var(--RS__defaultLineLength) !important; + box-sizing:border-box !important; } @supports (overflow: clip){ @@ -123,6 +124,22 @@ body{ } } +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingTop"] body{ + padding-top:var(--RS__scrollPaddingTop) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingBottom"] body{ + padding-bottom:var(--RS__scrollPaddingBottom) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingLeft"] body{ + padding-left:var(--RS__scrollPaddingLeft) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingRight"] body{ + padding-right:var(--RS__scrollPaddingRight) !important; +} + :root[style*="readium-night-on"]{ --RS__selectionTextColor:inherit; @@ -317,10 +334,14 @@ body{ font-family:revert !important; } -:root:not([style*="readium-deprecatedFontSize-on"])[style*="--USER__fontSize"] body{ +:root:not([style*="readium-deprecatedFontSize-on"]):not([style*="readium-iOSPatch-on"])[style*="--USER__fontSize"] body{ zoom:var(--USER__fontSize) !important; } +:root[style*="readium-iOSPatch-on"][style*="--USER__fontSize"] body{ + -webkit-text-size-adjust:var(--USER__fontSize) !important; +} + @supports not (zoom: 1){ :root[style*="--USER__fontSize"]{ diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css index d0e19f7dd..004a75a63 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-before.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css index e7c023172..065c8c1b4 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/cjk-vertical/ReadiumCSS-default.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css index a1b5ad9df..1a2c8fa2c 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-after.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the @@ -99,6 +99,7 @@ body{ :root[style*="readium-scroll-on"] body{ max-width:var(--RS__defaultLineLength) !important; + box-sizing:border-box !important; } :root[style*="readium-scroll-on"]:not([style*="readium-noOverflow-on"]) body{ @@ -116,6 +117,22 @@ body{ } } +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingTop"] body{ + padding-top:var(--RS__scrollPaddingTop) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingBottom"] body{ + padding-bottom:var(--RS__scrollPaddingBottom) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingLeft"] body{ + padding-left:var(--RS__scrollPaddingLeft) !important; +} + +:root[style*="readium-scroll-on"][style*="--RS__scrollPaddingRight"] body{ + padding-right:var(--RS__scrollPaddingRight) !important; +} + :root[style*="readium-night-on"]{ --RS__selectionTextColor:inherit; @@ -346,10 +363,14 @@ body{ font-family:revert !important; } -:root:not([style*="readium-deprecatedFontSize-on"])[style*="--USER__fontSize"] body{ +:root:not([style*="readium-deprecatedFontSize-on"]):not([style*="readium-iOSPatch-on"])[style*="--USER__fontSize"] body{ zoom:var(--USER__fontSize) !important; } +:root[style*="readium-iOSPatch-on"][style*="--USER__fontSize"] body{ + -webkit-text-size-adjust:var(--USER__fontSize) !important; +} + @supports not (zoom: 1){ :root[style*="--USER__fontSize"]{ diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css index 603978198..6a99eca10 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-before.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css index f8db389de..f2702105b 100644 --- a/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css +++ b/Sources/Navigator/EPUB/Assets/Static/readium-css/rtl/ReadiumCSS-default.css @@ -1,5 +1,5 @@ /* - * Readium CSS (v. 2.0.0-beta.14) + * Readium CSS (v. 2.0.0-beta.18) * Developers: Jiminy Panoz * Copyright (c) 2017. Readium Foundation. All rights reserved. * Use of this source code is governed by a BSD-style license which is detailed in the diff --git a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift index 0f3f8d99f..78b7a98ca 100644 --- a/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift +++ b/Sources/Navigator/EPUB/CSS/ReadiumCSS.swift @@ -34,8 +34,19 @@ extension ReadiumCSS { ?? "", ] - if UIDevice.current.userInterfaceIdiom == .pad { + // Applies WebKit patches, ideally: + // - iOS patch for iOS and iPadOS when the site is requested as mobile. + // - iPadOSPatch for iPadOS when the site is requested as desktop. + // - Nothing if MacOS. + // + // See https://github.com/readium/css/issues/189 + switch UIDevice.current.userInterfaceIdiom { + case .pad: overrides["--USER__iPadOSPatch"] = "readium-iPadOSPatch-on" + case .phone: + overrides["--USER__iOSPatch"] = "readium-iOSPatch-on" + default: + break } userProperties = CSSUserProperties(