@edrlab/thorium-web 1.3.1 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ThPreferencesAdapter-D0rzsGRl.d.mts → ThPreferencesAdapter-_5AePKHa.d.mts} +26 -7
- package/dist/{ThSettingsWrapper-BXuRgdqp.d.mts → ThSettingsWrapper-B_9klYXH.d.mts} +1 -1
- package/dist/{actions-BLAr0oaM.d.mts → actions-CuRRM3rp.d.mts} +5 -2
- package/dist/{actionsReducer-XWTGGNUd.d.mts → actionsReducer-VFR42qgL.d.mts} +1 -1
- package/dist/{chunk-6EHFW43Y.mjs → chunk-2NCN2AG2.mjs} +5 -4
- package/dist/chunk-2NCN2AG2.mjs.map +1 -0
- package/dist/{chunk-L4XGZAZ5.mjs → chunk-2YRT7RNW.mjs} +20 -3
- package/dist/chunk-2YRT7RNW.mjs.map +1 -0
- package/dist/{chunk-5LUMM7FW.mjs → chunk-44PEO3DS.mjs} +2 -2
- package/dist/{chunk-5LUMM7FW.mjs.map → chunk-44PEO3DS.mjs.map} +1 -1
- package/dist/chunk-A575ZW4A.mjs +10 -0
- package/dist/chunk-A575ZW4A.mjs.map +1 -0
- package/dist/chunk-AE6P4KJB.mjs +13 -0
- package/dist/chunk-AE6P4KJB.mjs.map +1 -0
- package/dist/chunk-AQSJDL63.mjs +193 -0
- package/dist/chunk-AQSJDL63.mjs.map +1 -0
- package/dist/{chunk-NKO3K3QS.mjs → chunk-DQDOOTCE.mjs} +5 -5
- package/dist/chunk-DQDOOTCE.mjs.map +1 -0
- package/dist/{chunk-SAUOY37Q.mjs → chunk-E2JEGVVE.mjs} +15 -15
- package/dist/chunk-E2JEGVVE.mjs.map +1 -0
- package/dist/{chunk-DETZMFZ7.mjs → chunk-ETLIGONP.mjs} +39 -33
- package/dist/chunk-ETLIGONP.mjs.map +1 -0
- package/dist/chunk-GNROODJB.mjs +9 -0
- package/dist/chunk-GNROODJB.mjs.map +1 -0
- package/dist/{chunk-6BUN7DEA.mjs → chunk-KGSFTRCH.mjs} +69 -84
- package/dist/chunk-KGSFTRCH.mjs.map +1 -0
- package/dist/{chunk-LP3JFZ4A.mjs → chunk-MSHUPSBI.mjs} +718 -466
- package/dist/chunk-MSHUPSBI.mjs.map +1 -0
- package/dist/chunk-OD75GC5N.mjs +3953 -0
- package/dist/chunk-OD75GC5N.mjs.map +1 -0
- package/dist/{chunk-I4BKU5NN.mjs → chunk-RBEPH5E5.mjs} +100 -30
- package/dist/chunk-RBEPH5E5.mjs.map +1 -0
- package/dist/{chunk-DMZFSOHK.mjs → chunk-SI4FBFHM.mjs} +135 -46
- package/dist/chunk-SI4FBFHM.mjs.map +1 -0
- package/dist/{chunk-A3FZBEUL.mjs → chunk-SZAVAQ6S.mjs} +30 -6
- package/dist/chunk-SZAVAQ6S.mjs.map +1 -0
- package/dist/{chunk-ITDBOMY5.mjs → chunk-VENFFPK2.mjs} +3 -3
- package/dist/{chunk-ITDBOMY5.mjs.map → chunk-VENFFPK2.mjs.map} +1 -1
- package/dist/{chunk-2ORXUOH3.mjs → chunk-WF2UOYO7.mjs} +4 -4
- package/dist/{chunk-2ORXUOH3.mjs.map → chunk-WF2UOYO7.mjs.map} +1 -1
- package/dist/{chunk-EZG6SBSO.mjs → chunk-YEVLT3AV.mjs} +104 -29
- package/dist/chunk-YEVLT3AV.mjs.map +1 -0
- package/dist/components/Audio/index.css +2 -1
- package/dist/components/Audio/index.css.map +1 -1
- package/dist/components/Audio/index.d.mts +16 -15
- package/dist/components/Audio/index.mjs +16 -16
- package/dist/components/Epub/index.css +5 -4
- package/dist/components/Epub/index.css.map +1 -1
- package/dist/components/Epub/index.d.mts +13 -13
- package/dist/components/Epub/index.mjs +17 -17
- package/dist/components/Misc/index.mjs +5 -5
- package/dist/components/Reader/index.css +5 -4
- package/dist/components/Reader/index.css.map +1 -1
- package/dist/components/Reader/index.d.mts +11 -11
- package/dist/components/Reader/index.mjs +34 -30
- package/dist/components/Reader/index.mjs.map +1 -1
- package/dist/components/WebPub/index.css +5 -4
- package/dist/components/WebPub/index.css.map +1 -1
- package/dist/components/WebPub/index.d.mts +13 -13
- package/dist/components/WebPub/index.mjs +17 -17
- package/dist/core/Components/index.d.mts +12 -22
- package/dist/core/Components/index.mjs +2 -2
- package/dist/core/Helpers/index.d.mts +1 -1
- package/dist/core/Helpers/index.mjs +3 -4
- package/dist/core/Hooks/index.d.mts +12 -8
- package/dist/core/Hooks/index.mjs +1 -1
- package/dist/i18n/index.mjs +4 -7
- package/dist/lib/index.d.mts +56 -20
- package/dist/lib/index.mjs +3 -2
- package/dist/locales/da/thorium-shared.json +3 -0
- package/dist/locales/da/thorium-web.json +37 -2
- package/dist/locales/en/thorium-shared.json +24 -2
- package/dist/locales/en/thorium-web.json +2 -2
- package/dist/locales/es/thorium-shared.json +364 -0
- package/dist/locales/es/thorium-web.json +130 -0
- package/dist/locales/et/thorium-shared.json +121 -9
- package/dist/locales/et/thorium-web.json +32 -1
- package/dist/locales/fi/thorium-shared.json +42 -4
- package/dist/locales/fi/thorium-web.json +36 -2
- package/dist/locales/fr/thorium-shared.json +108 -1
- package/dist/locales/fr/thorium-web.json +121 -86
- package/dist/locales/it/thorium-shared.json +108 -1
- package/dist/locales/it/thorium-web.json +15 -2
- package/dist/locales/lt/thorium-web.json +36 -2
- package/dist/locales/pl/thorium-web.json +1 -1
- package/dist/locales/pt-BR/thorium-shared.json +6 -0
- package/dist/locales/pt-BR/thorium-web.json +88 -88
- package/dist/locales/pt-PT/thorium-shared.json +91 -0
- package/dist/locales/pt-PT/thorium-web.json +15 -3
- package/dist/locales/sv/thorium-shared.json +108 -2
- package/dist/locales/sv/thorium-web.json +15 -3
- package/dist/locales/tr/thorium-shared.json +42 -0
- package/dist/next-lib/index.mjs +1 -1
- package/dist/next-lib/index.mjs.map +1 -1
- package/dist/preferences/index.d.mts +59 -13
- package/dist/preferences/index.mjs +7 -7
- package/dist/{settingsReducer-Bu1zeveu.d.mts → settingsReducer-VqBhLq50.d.mts} +14 -2
- package/dist/{ui-nBv8gfr0.d.mts → ui-DnZZhozX.d.mts} +1 -1
- package/dist/{useAudioNavigator-C5aW4-eT.d.mts → useAudioNavigator-CWXyNWq1.d.mts} +3 -1
- package/dist/{useContrast-2t429O9O.d.mts → useContrast-Cbso7N1l.d.mts} +5 -1
- package/dist/{usePreferences-VaBf46eP.d.mts → usePreferences-9ZvbcbLW.d.mts} +6 -8
- package/dist/{useReaderTransitions-IBGdE7qi.d.mts → useReaderTransitions-0hKGCvMm.d.mts} +64 -12
- package/package.json +10 -9
- package/dist/chunk-6BUN7DEA.mjs.map +0 -1
- package/dist/chunk-6EHFW43Y.mjs.map +0 -1
- package/dist/chunk-7CGMWOZN.mjs +0 -20
- package/dist/chunk-7CGMWOZN.mjs.map +0 -1
- package/dist/chunk-A3FZBEUL.mjs.map +0 -1
- package/dist/chunk-B3WDMWCT.mjs +0 -9
- package/dist/chunk-B3WDMWCT.mjs.map +0 -1
- package/dist/chunk-DETZMFZ7.mjs.map +0 -1
- package/dist/chunk-DMZFSOHK.mjs.map +0 -1
- package/dist/chunk-DTPO3J2C.mjs +0 -1732
- package/dist/chunk-DTPO3J2C.mjs.map +0 -1
- package/dist/chunk-EZG6SBSO.mjs.map +0 -1
- package/dist/chunk-GPWW5OML.mjs +0 -1955
- package/dist/chunk-GPWW5OML.mjs.map +0 -1
- package/dist/chunk-I4BKU5NN.mjs.map +0 -1
- package/dist/chunk-L4XGZAZ5.mjs.map +0 -1
- package/dist/chunk-LP3JFZ4A.mjs.map +0 -1
- package/dist/chunk-MLEYTQGK.mjs +0 -60
- package/dist/chunk-MLEYTQGK.mjs.map +0 -1
- package/dist/chunk-NKO3K3QS.mjs.map +0 -1
- package/dist/chunk-SAUOY37Q.mjs.map +0 -1
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { useReaderHeaderBase, thorium_web_reader_app_default, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default, useNavigator } from './chunk-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
1
|
+
import { useReaderHeaderBase, thorium_web_reader_app_default, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default, useIsScroll, useNavigator } from './chunk-MSHUPSBI.mjs';
|
|
2
|
+
import { isInteractiveElement, makeBreakpointsMap, getBestMatchingProgressionFormat } from './chunk-VENFFPK2.mjs';
|
|
3
|
+
import { setHovering } from './chunk-YEVLT3AV.mjs';
|
|
4
|
+
import { usePreferences } from './chunk-OD75GC5N.mjs';
|
|
5
|
+
import { ThRunningHeadFormat, ThProgressionFormat } from './chunk-2YRT7RNW.mjs';
|
|
6
|
+
import { useAppSelector, useAppDispatch } from './chunk-A575ZW4A.mjs';
|
|
7
|
+
import { getPlatform, buildShortcut } from './chunk-44PEO3DS.mjs';
|
|
8
|
+
import { ThInteractiveOverlay, ThHeader, ThFooter, ThRunningHead, ThPagination } from './chunk-ETLIGONP.mjs';
|
|
9
|
+
import { useI18n } from './chunk-2NCN2AG2.mjs';
|
|
9
10
|
import { useRef, useCallback, useEffect, useMemo } from 'react';
|
|
10
11
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
11
12
|
import classNames from 'classnames';
|
|
12
|
-
import { useFocusWithin } from 'react-aria';
|
|
13
|
+
import { useLocale, useFocusWithin } from 'react-aria';
|
|
13
14
|
|
|
14
15
|
var StatefulReaderRunningHead = ({
|
|
15
16
|
formatPref
|
|
@@ -19,7 +20,7 @@ var StatefulReaderRunningHead = ({
|
|
|
19
20
|
const isImmersive = useAppSelector((state) => state.reader.isImmersive);
|
|
20
21
|
const isHovering = useAppSelector((state) => state.reader.isHovering);
|
|
21
22
|
const isFullscreen = useAppSelector((state) => state.reader.isFullscreen);
|
|
22
|
-
const breakpoint = useAppSelector((state) => state.theming.
|
|
23
|
+
const breakpoint = useAppSelector((state) => state.theming.containerBreakpoint);
|
|
23
24
|
const fallbackFormat = useMemo(() => ({
|
|
24
25
|
variants: "title" /* title */,
|
|
25
26
|
displayInImmersive: true,
|
|
@@ -126,9 +127,9 @@ var StatefulReaderHeader = ({
|
|
|
126
127
|
var thorium_web_reader_pagination_default = {
|
|
127
128
|
wrapper: "thorium_web_reader_pagination_wrapper",
|
|
128
129
|
listItem: "thorium_web_reader_pagination_listItem",
|
|
129
|
-
|
|
130
|
+
leftButton: "thorium_web_reader_pagination_leftButton",
|
|
130
131
|
progression: "thorium_web_reader_pagination_progression",
|
|
131
|
-
|
|
132
|
+
rightButton: "thorium_web_reader_pagination_rightButton",
|
|
132
133
|
label: "thorium_web_reader_pagination_label"
|
|
133
134
|
};
|
|
134
135
|
|
|
@@ -161,29 +162,6 @@ var StatefulReaderProgression = ({
|
|
|
161
162
|
const isFullscreen = useAppSelector((state) => state.reader.isFullscreen);
|
|
162
163
|
const isHovering = useAppSelector((state) => state.reader.isHovering);
|
|
163
164
|
const breakpoint = useAppSelector((state) => state.theming.breakpoint);
|
|
164
|
-
useMemo(() => {
|
|
165
|
-
if (!unstableTimeline?.progression) return "";
|
|
166
|
-
const {
|
|
167
|
-
currentPositions = [],
|
|
168
|
-
totalPositions,
|
|
169
|
-
relativeProgression,
|
|
170
|
-
totalProgression,
|
|
171
|
-
currentChapter,
|
|
172
|
-
positionsLeft,
|
|
173
|
-
totalItems,
|
|
174
|
-
currentIndex
|
|
175
|
-
} = unstableTimeline.progression;
|
|
176
|
-
return JSON.stringify({
|
|
177
|
-
currentPositions,
|
|
178
|
-
totalPositions,
|
|
179
|
-
relativeProgression,
|
|
180
|
-
totalProgression,
|
|
181
|
-
currentChapter,
|
|
182
|
-
positionsLeft,
|
|
183
|
-
totalItems,
|
|
184
|
-
currentIndex
|
|
185
|
-
});
|
|
186
|
-
}, [unstableTimeline?.progression]);
|
|
187
165
|
const fallbackFormat = useMemo(() => {
|
|
188
166
|
return {
|
|
189
167
|
variants: fallbackVariant,
|
|
@@ -321,25 +299,25 @@ var StatefulReaderPagination = ({
|
|
|
321
299
|
children,
|
|
322
300
|
...props
|
|
323
301
|
}) => {
|
|
324
|
-
const
|
|
325
|
-
const
|
|
302
|
+
const leftButtonRef = useRef(null);
|
|
303
|
+
const rightButtonRef = useRef(null);
|
|
326
304
|
const updatedCompounds = {
|
|
327
305
|
...compounds,
|
|
328
|
-
|
|
329
|
-
...compounds?.
|
|
330
|
-
ref:
|
|
306
|
+
leftButton: {
|
|
307
|
+
...compounds?.leftButton,
|
|
308
|
+
ref: leftButtonRef,
|
|
331
309
|
onKeyDown: (e) => {
|
|
332
310
|
if (e.key === "Escape") {
|
|
333
|
-
|
|
311
|
+
leftButtonRef.current?.blur();
|
|
334
312
|
}
|
|
335
313
|
}
|
|
336
314
|
},
|
|
337
|
-
|
|
338
|
-
...compounds?.
|
|
339
|
-
ref:
|
|
315
|
+
rightButton: {
|
|
316
|
+
...compounds?.rightButton,
|
|
317
|
+
ref: rightButtonRef,
|
|
340
318
|
onKeyDown: (e) => {
|
|
341
319
|
if (e.key === "Escape") {
|
|
342
|
-
|
|
320
|
+
rightButtonRef.current?.blur();
|
|
343
321
|
}
|
|
344
322
|
}
|
|
345
323
|
}
|
|
@@ -362,15 +340,15 @@ var StatefulReaderFooter = ({
|
|
|
362
340
|
progressionFormatFallback
|
|
363
341
|
}) => {
|
|
364
342
|
const { t } = useI18n();
|
|
343
|
+
const { direction } = useLocale();
|
|
365
344
|
const footerRef = useRef(null);
|
|
366
|
-
const readerProfile = useAppSelector((state) => state.reader.profile);
|
|
367
345
|
const isImmersive = useAppSelector((state) => state.reader.isImmersive);
|
|
368
346
|
const isHovering = useAppSelector((state) => state.reader.isHovering);
|
|
369
347
|
const hasScrollAffordance = useAppSelector((state) => state.reader.hasScrollAffordance);
|
|
370
|
-
const
|
|
348
|
+
const isRTL = useAppSelector((state) => state.publication.isRTL);
|
|
371
349
|
const isFXL = useAppSelector((state) => state.publication.isFXL);
|
|
372
|
-
const isScroll =
|
|
373
|
-
const breakpoint = useAppSelector((state) => state.theming.
|
|
350
|
+
const isScroll = useIsScroll();
|
|
351
|
+
const breakpoint = useAppSelector((state) => state.theming.containerBreakpoint);
|
|
374
352
|
const reducedMotion = useAppSelector((state) => state.theming.prefersReducedMotion);
|
|
375
353
|
const timeline = useAppSelector((state) => state.publication.unstableTimeline);
|
|
376
354
|
const dispatch = useAppDispatch();
|
|
@@ -393,35 +371,38 @@ var StatefulReaderFooter = ({
|
|
|
393
371
|
}
|
|
394
372
|
};
|
|
395
373
|
const { previousLocator, nextLocator, go } = useNavigator().unified;
|
|
374
|
+
const buildNode = useCallback((locator, title, compactKey, descriptiveKey) => {
|
|
375
|
+
if (!locator) return void 0;
|
|
376
|
+
return breakpoint !== "compact" /* compact */ && breakpoint !== "medium" /* medium */ ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
377
|
+
/* @__PURE__ */ jsx("span", { className: thorium_web_reader_app_default.srOnly, children: t(descriptiveKey) }),
|
|
378
|
+
/* @__PURE__ */ jsx("span", { className: thorium_web_reader_pagination_default.label, children: title || locator.title || t(compactKey) })
|
|
379
|
+
] }) : /* @__PURE__ */ jsx("span", { className: thorium_web_reader_pagination_default.label, children: t(compactKey) });
|
|
380
|
+
}, [t, breakpoint]);
|
|
396
381
|
const updateLinks = useCallback(() => {
|
|
397
|
-
const links = {
|
|
398
|
-
previous: void 0,
|
|
399
|
-
next: void 0
|
|
400
|
-
};
|
|
401
382
|
const previous = previousLocator();
|
|
402
383
|
const next = nextLocator();
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
return
|
|
424
|
-
}, [go, previousLocator, nextLocator,
|
|
384
|
+
const previousLink = previous ? {
|
|
385
|
+
node: buildNode(
|
|
386
|
+
previous,
|
|
387
|
+
timeline?.previousItem?.title,
|
|
388
|
+
isFXL ? "reader.actions.goToPreviousPage.compact" : "reader.actions.goToPreviousChapter.compact",
|
|
389
|
+
isFXL ? "reader.actions.goToPreviousPage.descriptive" : "reader.actions.goToPreviousChapter.descriptive"
|
|
390
|
+
),
|
|
391
|
+
onPress: () => go(previous, !reducedMotion, () => {
|
|
392
|
+
})
|
|
393
|
+
} : void 0;
|
|
394
|
+
const nextLink = next ? {
|
|
395
|
+
node: buildNode(
|
|
396
|
+
next,
|
|
397
|
+
timeline?.nextItem?.title,
|
|
398
|
+
isFXL ? "reader.actions.goToNextPage.compact" : "reader.actions.goToNextChapter.compact",
|
|
399
|
+
isFXL ? "reader.actions.goToNextPage.descriptive" : "reader.actions.goToNextChapter.descriptive"
|
|
400
|
+
),
|
|
401
|
+
onPress: () => go(next, !reducedMotion, () => {
|
|
402
|
+
})
|
|
403
|
+
} : void 0;
|
|
404
|
+
return isRTL ? { left: nextLink, right: previousLink } : { left: previousLink, right: nextLink };
|
|
405
|
+
}, [go, previousLocator, nextLocator, buildNode, timeline, reducedMotion, isFXL, isRTL]);
|
|
425
406
|
useEffect(() => {
|
|
426
407
|
updateLinks();
|
|
427
408
|
}, [timeline, updateLinks]);
|
|
@@ -452,21 +433,22 @@ var StatefulReaderFooter = ({
|
|
|
452
433
|
onMouseEnter: setHover,
|
|
453
434
|
onMouseLeave: removeHover,
|
|
454
435
|
...focusWithinProps,
|
|
455
|
-
children: isScroll
|
|
436
|
+
children: isScroll ? /* @__PURE__ */ jsx(
|
|
456
437
|
StatefulReaderPagination,
|
|
457
438
|
{
|
|
458
439
|
"aria-label": t("reader.navigation.scroll.wrapper"),
|
|
459
440
|
links: updateLinks(),
|
|
441
|
+
dir: direction,
|
|
460
442
|
compounds: {
|
|
461
443
|
listItem: {
|
|
462
444
|
className: thorium_web_reader_pagination_default.listItem
|
|
463
445
|
},
|
|
464
|
-
|
|
465
|
-
className: thorium_web_reader_pagination_default.
|
|
446
|
+
leftButton: {
|
|
447
|
+
className: thorium_web_reader_pagination_default.leftButton,
|
|
466
448
|
preventFocusOnPress: true
|
|
467
449
|
},
|
|
468
|
-
|
|
469
|
-
className: thorium_web_reader_pagination_default.
|
|
450
|
+
rightButton: {
|
|
451
|
+
className: thorium_web_reader_pagination_default.rightButton,
|
|
470
452
|
preventFocusOnPress: true
|
|
471
453
|
}
|
|
472
454
|
},
|
|
@@ -829,6 +811,7 @@ var LAYOUT_CLASSES = {
|
|
|
829
811
|
["stacked-ui" /* stacked */]: "thorium_web_stackedUI",
|
|
830
812
|
["layered-ui" /* layered */]: "thorium_web_layeredUI"
|
|
831
813
|
};
|
|
814
|
+
var toBreakpointClass = (prefix, bp) => `${prefix}${bp.charAt(0).toUpperCase() + bp.slice(1)}`;
|
|
832
815
|
function getReaderClassNames(options) {
|
|
833
816
|
const {
|
|
834
817
|
layoutUI,
|
|
@@ -836,7 +819,8 @@ function getReaderClassNames(options) {
|
|
|
836
819
|
isImmersive = false,
|
|
837
820
|
isHovering = false,
|
|
838
821
|
isFXL = false,
|
|
839
|
-
breakpoint
|
|
822
|
+
breakpoint,
|
|
823
|
+
containerBreakpoint
|
|
840
824
|
} = options;
|
|
841
825
|
return classNames(
|
|
842
826
|
thorium_web_reader_app_default.shell,
|
|
@@ -845,10 +829,11 @@ function getReaderClassNames(options) {
|
|
|
845
829
|
isHovering && "thorium_web_isHovering",
|
|
846
830
|
isFXL ? "thorium_web_isFXL" : "thorium_web_isReflow",
|
|
847
831
|
LAYOUT_CLASSES[layoutUI],
|
|
848
|
-
breakpoint ?
|
|
832
|
+
breakpoint ? toBreakpointClass("thorium_web_is", breakpoint) : void 0,
|
|
833
|
+
containerBreakpoint ? toBreakpointClass("thorium_web_container_is", containerBreakpoint) : void 0
|
|
849
834
|
);
|
|
850
835
|
}
|
|
851
836
|
|
|
852
837
|
export { Peripherals, StatefulReaderFooter, StatefulReaderHeader, getReaderClassNames, useFonts };
|
|
853
|
-
//# sourceMappingURL=chunk-
|
|
854
|
-
//# sourceMappingURL=chunk-
|
|
838
|
+
//# sourceMappingURL=chunk-KGSFTRCH.mjs.map
|
|
839
|
+
//# sourceMappingURL=chunk-KGSFTRCH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/StatefulReaderRunningHead.tsx","../src/components/StatefulReaderHeader.tsx","../src/components/assets/styles/thorium-web.reader.pagination.module.css","../src/components/assets/styles/thorium-web.reader.progression.module.css","../src/core/Components/Reader/ThProgression.tsx","../src/components/StatefulReaderProgression.tsx","../src/components/StatefulReaderPagination.tsx","../src/components/StatefulReaderFooter.tsx","../src/core/Hooks/fonts/androidPatchCss.ts","../src/core/Hooks/fonts/useFonts.ts","../src/helpers/peripherals.ts","../src/components/Helpers/getReaderClassNames.ts"],"names":["Fragment","jsx","wrapper","listItem","leftButton","progression","rightButton","label","useMemo","classNames","useRef","jsxs","useCallback","useEffect"],"mappings":"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","file":"chunk-KGSFTRCH.mjs","sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { ThRunningHeadFormat } from \"@/preferences/models\";\nimport { ThFormatPref, ThFormatPrefValue } from \"@/preferences\";\n\nimport { ThRunningHead } from \"@/core/Components\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\n\nexport const StatefulReaderRunningHead = ({ \n formatPref\n}: {\n formatPref?: ThFormatPref<ThRunningHeadFormat>;\n}) => {\n const { t } = useI18n();\n \n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n const breakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n\n // Get the fallback format based on isFXL\n const fallbackFormat = useMemo<ThFormatPrefValue<ThRunningHeadFormat>>(() => ({\n variants: ThRunningHeadFormat.title,\n displayInImmersive: true,\n displayInFullscreen: true\n }), []);\n\n const breakpointsMap = useMemo(() => {\n return makeBreakpointsMap<ThFormatPrefValue<ThRunningHeadFormat>>({\n defaultValue: formatPref?.default || fallbackFormat,\n fromEnum: ThRunningHeadFormat,\n pref: formatPref?.breakpoints,\n validateKey: \"variants\"\n });\n }, [formatPref, fallbackFormat]);\n \n // Get current preferences with proper fallback\n const currentPrefs = useMemo(() => {\n if (!breakpoint) return formatPref?.default || fallbackFormat;\n return breakpointsMap[breakpoint] || formatPref?.default || fallbackFormat;\n }, [breakpoint, breakpointsMap, formatPref?.default, fallbackFormat]);\n\n const { variants, displayInImmersive, displayInFullscreen } = currentPrefs;\n\n const displayFormat = useMemo(() => {\n if (!variants) return ThRunningHeadFormat.title;\n \n // Check if we should hide in immersive mode\n if (isImmersive && displayInImmersive === false && !isHovering) {\n return ThRunningHeadFormat.none;\n }\n \n // Check if we should hide in fullscreen mode\n if (isImmersive && isFullscreen && displayInFullscreen === false && !isHovering) {\n return ThRunningHeadFormat.none;\n }\n \n return variants;\n }, [variants, isImmersive, displayInImmersive, isHovering, isFullscreen, displayInFullscreen]);\n\n const runningHead = useMemo(() => {\n if (displayFormat === ThRunningHeadFormat.title) {\n return unstableTimeline?.title || \"\";\n } else if (displayFormat === ThRunningHeadFormat.chapter) {\n return unstableTimeline?.progression?.currentChapter || unstableTimeline?.title || \"\";\n }\n return \"\";\n }, [displayFormat, unstableTimeline]);\n\n if (!runningHead || displayFormat === ThRunningHeadFormat.none) return null;\n \n return (\n <>\n <ThRunningHead \n label={ runningHead } \n aria-label={ t(\"reader.app.header.runningHead\") }\n />\n </>\n );\n}","\"use client\";\n\nimport React from \"react\";\n\nimport { ActionKeyType } from \"@/preferences\";\nimport { ThLayoutUI, ThRunningHeadFormat } from \"@/preferences/models\";\nimport { ThFormatPref } from \"@/preferences\";\n\nimport readerStyles from \"./assets/styles/thorium-web.reader.app.module.css\";\nimport readerHeaderStyles from \"./assets/styles/thorium-web.reader.header.module.css\";\nimport overflowMenuStyles from \"./Actions/assets/styles/thorium-web.overflow.module.css\";\n\nimport { ThHeader } from \"@/core/Components/Reader/ThHeader\";\nimport { StatefulBackLink } from \"./StatefulBackLink\";\nimport { StatefulReaderRunningHead } from \"./StatefulReaderRunningHead\";\nimport { ThInteractiveOverlay } from \"../core/Components/Reader/ThInteractiveOverlay\";\nimport { StatefulCollapsibleActionsBar } from \"./Actions/StatefulCollapsibleActionsBar\";\n\nimport { useReaderHeaderBase } from \"./hooks/useReaderHeaderBase\";\nimport { usePreferences } from \"@/preferences/hooks\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderHeader = ({\n actionKeys,\n actionsOrder,\n layout,\n runningHeadFormatPref\n}: {\n actionKeys: ActionKeyType[];\n actionsOrder: ActionKeyType[];\n layout: ThLayoutUI;\n runningHeadFormatPref?: ThFormatPref<ThRunningHeadFormat>;\n}) => {\n const {\n headerRef, focusWithinProps, setHover, removeHover,\n listActionItems, isImmersive, isHovering, isScroll, t,\n } = useReaderHeaderBase(actionKeys);\n\n const { preferences } = usePreferences();\n\n return (\n <>\n <ThInteractiveOverlay\n className={ classNames(readerStyles.barOverlay, readerStyles.headerOverlay) }\n isActive={ layout === ThLayoutUI.layered && isImmersive && !isHovering }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n />\n\n <ThHeader\n ref={ headerRef }\n className={ classNames(readerStyles.topBar, readerHeaderStyles.header) }\n aria-label={ t(\"reader.app.header.label\") }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n { ...focusWithinProps }\n >\n { preferences.theming.header?.backLink && <StatefulBackLink className={ readerHeaderStyles.backlinkWrapper } /> }\n\n <StatefulReaderRunningHead formatPref={ runningHeadFormatPref } />\n\n <StatefulCollapsibleActionsBar\n id=\"reader-header-overflowMenu\"\n items={ listActionItems() }\n prefs={{ ...preferences.actions, displayOrder: actionsOrder }}\n className={ readerHeaderStyles.actionsWrapper }\n aria-label={ t(\"reader.app.header.actions\") }\n overflowMenuClassName={\n (!isScroll || preferences.affordances.scroll.hintInImmersive)\n ? overflowMenuStyles.hint\n : undefined\n }\n />\n </ThHeader>\n </>\n );\n};\n",".wrapper {\n box-sizing: border-box;\n display: grid;\n gap: calc(var(--th-layout-spacing) / 2);\n grid-template-areas: \"pagination-start pagination-center pagination-end\";\n grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);\n background-color: var(--th-theme-background);\n color: var(--th-theme-text);\n align-items: center;\n width: 100%;\n max-width: var(--th-layout-constraints-pagination, 100%);\n}\n\n.listItem {\n box-sizing: border-box;\n list-style: none;\n}\n\n.listItem:has(.leftButton) {\n grid-area: pagination-start;\n justify-self: start;\n}\n\n.listItem:has(.progression) {\n grid-area: pagination-center;\n justify-self: center;\n}\n\n.listItem:has(.rightButton) {\n grid-area: pagination-end;\n justify-self: end;\n}\n\n\n.listItem button {\n box-sizing: border-box;\n padding: calc(var(--th-icon-size, 24px) * (1/4)) calc(var(--th-layout-spacing) / 2);\n gap: calc(var(--th-layout-spacing) / 2);\n max-height: calc(var(--th-icon-size, 24px) * 2);\n max-width: 100%;\n border-radius: var(--th-layout-radius);\n display: flex;\n align-items: center;\n}\n\n.rightButton {\n margin-inline-start: auto;\n text-align: end;\n}\n\n.listItem button[data-hovered] {\n background-color: var(--th-theme-hover);\n color: var(--th-theme-onHover);\n}\n\n.listItem button[data-focus-visible] {\n outline: 2px solid var(--th-theme-focus);\n}\n\n.listItem button[data-disabled] {\n color: var(--th-theme-disable);\n}\n\n.listItem button .label {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n white-space: normal;\n -webkit-line-clamp: 1;\n line-clamp: 1;\n}\n\n.listItem button svg {\n flex: none;\n width: var(--th-icon-size, 24px);\n height: var(--th-icon-size, 24px);\n fill: currentColor;\n}",".wrapper {\n color: var(--th-theme-text);\n font-variant-numeric: lining-nums tabular-nums;\n text-align: center;\n}","\"use client\";\n\nimport React from \"react\";\n\nexport interface ThProgressionProps extends React.HTMLAttributes<HTMLDivElement> {\n ref?: React.RefObject<HTMLDivElement>\n}\n\nexport const ThProgression = ({ \n ref,\n children, \n ...props\n}: ThProgressionProps) => {\n return (\n <>\n <div \n ref={ ref } \n {...props }\n >\n { children }\n </div>\n </>\n )\n}","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport progressionStyles from \"./assets/styles/thorium-web.reader.progression.module.css\";\n\nimport { ThProgressionFormat } from \"@/preferences/models\";\nimport { ThFormatPref, ThFormatPrefValue } from \"@/preferences\";\n\nimport { ThProgression } from \"@/core/Components/Reader/ThProgression\";\n\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { useAppSelector } from \"@/lib/hooks\";\n\nimport { makeBreakpointsMap } from \"@/core/Helpers/breakpointsMap\";\nimport { getBestMatchingProgressionFormat } from \"@/core/Helpers/progressionFormat\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderProgression = ({ \n className,\n formatPref,\n fallbackVariant\n}: { \n className?: string,\n formatPref?: ThFormatPref<ThProgressionFormat | ThProgressionFormat[]>,\n fallbackVariant: ThProgressionFormat | Array<ThProgressionFormat>\n}) => {\n const { t } = useI18n();\n \n const unstableTimeline = useAppSelector(state => state.publication.unstableTimeline);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isFullscreen = useAppSelector(state => state.reader.isFullscreen);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n\n \n const fallbackFormat = useMemo(() => {\n return {\n variants: fallbackVariant,\n displayInImmersive: true,\n displayInFullscreen: true\n };\n }, [fallbackVariant]);\n \n const breakpointsMap = useMemo(() => {\n return makeBreakpointsMap<ThFormatPrefValue<ThProgressionFormat | ThProgressionFormat[]>>({\n defaultValue: formatPref?.default || fallbackFormat,\n fromEnum: ThProgressionFormat,\n pref: formatPref?.breakpoints,\n validateKey: \"variants\"\n });\n }, [formatPref, fallbackFormat]);\n \n // Get current preferences with proper fallback\n const currentPrefs = useMemo(() => {\n if (!breakpoint) return formatPref?.default || fallbackFormat;\n return breakpointsMap[breakpoint] || formatPref?.default || fallbackFormat;\n }, [breakpoint, breakpointsMap, formatPref?.default, fallbackFormat]);\n\n const { variants, displayInImmersive, displayInFullscreen } = currentPrefs;\n \n // Get the display format, handling both single format and array of formats\n const displayFormat = useMemo(() => {\n if (!variants) return fallbackFormat.variants;\n \n // Check if we should hide in immersive mode\n if (isImmersive && displayInImmersive === false && !isHovering) {\n return ThProgressionFormat.none;\n }\n \n // Check if we should hide in fullscreen mode\n if (isImmersive && isFullscreen && displayInFullscreen === false && !isHovering) {\n return ThProgressionFormat.none;\n }\n \n if (Array.isArray(variants)) {\n return getBestMatchingProgressionFormat(variants, unstableTimeline?.progression) || \n fallbackFormat.variants;\n }\n \n return variants;\n }, [variants, unstableTimeline?.progression, fallbackFormat, isImmersive, isHovering, isFullscreen, displayInImmersive, displayInFullscreen]);\n\n // Compute display text based on current position and timeline\n const displayText = useMemo(() => {\n if (displayFormat === ThProgressionFormat.none || !unstableTimeline?.progression) {\n return \"\";\n }\n\n const { \n currentPositions = [],\n totalPositions,\n relativeProgression,\n totalProgression,\n currentChapter,\n positionsLeft,\n totalItems,\n currentIndex\n } = unstableTimeline.progression;\n \n let text = \"\";\n \n // Format positions for display (handle array of two positions with a dash)\n const formatPositions = (positions: number[]) => {\n if (positions.length === 2) {\n return positions.join(\"–\");\n }\n return positions[0]?.toString() || \"\";\n };\n \n switch (displayFormat) {\n case ThProgressionFormat.positions:\n if (currentPositions.length > 0) {\n text = formatPositions(currentPositions);\n }\n break;\n \n case ThProgressionFormat.positionsOfTotal:\n if (currentPositions.length > 0 && totalPositions) {\n text = t(\"reader.progression.xOfY.compact\", { \n x: formatPositions(currentPositions),\n y: totalPositions\n });\n }\n break;\n\n case ThProgressionFormat.positionsPercentOfTotal:\n if (currentPositions.length > 0 && totalPositions) {\n const percentage = Math.round((totalProgression || 0) * 100);\n text = t(\"reader.progression.xOfY.descriptive\", { \n x: formatPositions(currentPositions),\n y: totalPositions,\n z: `${ percentage }%`\n });\n }\n break;\n \n case ThProgressionFormat.positionsLeft:\n if (positionsLeft !== undefined) {\n text = t(`reader.progression.positionsLeftInChapter.descriptive`, { \n count: positionsLeft\n });\n }\n break;\n \n case ThProgressionFormat.overallProgression:\n if (totalProgression !== undefined) {\n const percentage = Math.round(totalProgression * 100);\n text = `${ percentage }%`;\n }\n break;\n \n case ThProgressionFormat.resourceProgression:\n if (relativeProgression !== undefined) {\n const percentage = Math.round(relativeProgression * 100);\n text = `${ percentage }%`;\n }\n break;\n \n case ThProgressionFormat.progressionOfResource:\n if (relativeProgression !== undefined) {\n const percentage = Math.round(relativeProgression * 100);\n text = t(\"reader.progression.xOfY.compact\", {\n x: `${ percentage }%`,\n y: currentChapter || t(\"reader.app.progression.referenceFallback\")\n });\n }\n break;\n\n case ThProgressionFormat.readingOrderIndex:\n if (currentIndex !== undefined && totalItems !== undefined) {\n text = t(\"reader.progression.xOfY.compact\", {\n x: currentIndex,\n y: totalItems\n });\n }\n break;\n }\n \n return text;\n }, [displayFormat, unstableTimeline, t]);\n\n if (!displayText || displayFormat === ThProgressionFormat.none) {\n return null;\n }\n\n return (\n <ThProgression \n id=\"current-progression\" \n className={ classNames(progressionStyles.wrapper, className) }\n aria-label={ t(\"reader.app.progression.wrapper\") }\n >\n { displayText }\n </ThProgression>\n );\n};","\"use client\";\n\nimport { useRef, KeyboardEvent } from \"react\";\n\nimport { ThPagination, ThPaginationProps } from \"@/core/Components/Reader/ThPagination\";\n\nimport readerPaginationStyles from \"./assets/styles/thorium-web.reader.pagination.module.css\";\n\nexport const StatefulReaderPagination = ({\n ref,\n links,\n compounds,\n children,\n ...props\n}: ThPaginationProps) => {\n const leftButtonRef = useRef<HTMLButtonElement>(null);\n const rightButtonRef = useRef<HTMLButtonElement>(null);\n\n const updatedCompounds = {\n ...compounds,\n leftButton: {\n ...compounds?.leftButton,\n ref: leftButtonRef,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n leftButtonRef.current?.blur();\n }\n }\n },\n rightButton: {\n ...compounds?.rightButton,\n ref: rightButtonRef,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n rightButtonRef.current?.blur();\n }\n }\n }\n };\n\n return (\n <ThPagination\n ref={ ref }\n className={ readerPaginationStyles.wrapper }\n links={ links }\n compounds={ updatedCompounds }\n { ...props }\n >\n { children }\n </ThPagination>\n )\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport readerStyles from \"./assets/styles/thorium-web.reader.app.module.css\";\nimport readerPaginationStyles from \"./assets/styles/thorium-web.reader.pagination.module.css\";\n\nimport { ThBreakpoints, ThLayoutUI, ThFormatPref, ThProgressionFormat } from \"@/preferences/models\";\n\nimport { ThFooter } from \"@/core/Components/Reader/ThFooter\";\nimport { StatefulReaderProgression } from \"./StatefulReaderProgression\";\nimport { ThInteractiveOverlay } from \"../core/Components/Reader/ThInteractiveOverlay\";\nimport { StatefulReaderPagination } from \"./StatefulReaderPagination\";\nimport { ThPaginationLinkProps } from \"@/core/Components/Reader/ThPagination\";\n\nimport { useNavigator } from \"@/core/Navigator\";\nimport { useFocusWithin, useLocale } from \"react-aria\";\nimport { useI18n } from \"@/i18n/useI18n\";\n\nimport { setHovering } from \"@/lib/readerReducer\";\nimport { useAppDispatch, useAppSelector } from \"@/lib/hooks\";\nimport { useIsScroll } from \"@/hooks\";\n\nimport classNames from \"classnames\";\n\nexport const StatefulReaderFooter = ({\n layout,\n progressionFormatPref,\n progressionFormatFallback\n}: {\n layout: ThLayoutUI;\n progressionFormatPref?: ThFormatPref<ThProgressionFormat | ThProgressionFormat[]>;\n progressionFormatFallback: ThProgressionFormat | ThProgressionFormat[];\n}) => {\n const { t } = useI18n();\n const { direction } = useLocale();\n const footerRef = useRef<HTMLDivElement>(null);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const hasScrollAffordance = useAppSelector(state => state.reader.hasScrollAffordance);\n const isRTL = useAppSelector(state => state.publication.isRTL);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n const isScroll = useIsScroll();\n const breakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n const reducedMotion = useAppSelector(state => state.theming.prefersReducedMotion);\n const timeline = useAppSelector(state => state.publication.unstableTimeline);\n\n const dispatch = useAppDispatch();\n\n const { focusWithinProps } = useFocusWithin({\n onFocusWithin() {\n dispatch(setHovering(true));\n },\n onBlurWithin() {\n dispatch(setHovering(false));\n }\n });\n\n const setHover = () => {\n if (!hasScrollAffordance) {\n dispatch(setHovering(true));\n }\n };\n\n const removeHover = () => {\n if (!hasScrollAffordance) {\n dispatch(setHovering(false));\n }\n };\n\n const { previousLocator, nextLocator, go } = useNavigator().unified;\n\n const buildNode = useCallback((\n locator: ReturnType<typeof previousLocator>,\n title: string | undefined,\n compactKey: string,\n descriptiveKey: string\n ) => {\n if (!locator) return undefined;\n\n return breakpoint !== ThBreakpoints.compact && breakpoint !== ThBreakpoints.medium ? (\n <>\n <span className={ readerStyles.srOnly }>{ t(descriptiveKey) }</span>\n <span className={ readerPaginationStyles.label }>{ title || locator.title || t(compactKey) }</span>\n </>\n ) : (\n <span className={ readerPaginationStyles.label }>{ t(compactKey) }</span>\n );\n }, [t, breakpoint]);\n\n const updateLinks = useCallback(() => {\n const previous = previousLocator();\n const next = nextLocator();\n\n const previousLink: ThPaginationLinkProps | undefined = previous ? {\n node: buildNode(\n previous,\n timeline?.previousItem?.title,\n isFXL ? \"reader.actions.goToPreviousPage.compact\" : \"reader.actions.goToPreviousChapter.compact\",\n isFXL ? \"reader.actions.goToPreviousPage.descriptive\" : \"reader.actions.goToPreviousChapter.descriptive\"\n ),\n onPress: () => go(previous, !reducedMotion, () => {})\n } : undefined;\n\n const nextLink: ThPaginationLinkProps | undefined = next ? {\n node: buildNode(\n next,\n timeline?.nextItem?.title,\n isFXL ? \"reader.actions.goToNextPage.compact\" : \"reader.actions.goToNextChapter.compact\",\n isFXL ? \"reader.actions.goToNextPage.descriptive\" : \"reader.actions.goToNextChapter.descriptive\"\n ),\n onPress: () => go(next, !reducedMotion, () => {})\n } : undefined;\n\n return isRTL\n ? { left: nextLink, right: previousLink }\n : { left: previousLink, right: nextLink };\n }, [go, previousLocator, nextLocator, buildNode, timeline, reducedMotion, isFXL, isRTL]);\n\n useEffect(() => {\n updateLinks();\n }, [timeline, updateLinks]);\n\n useEffect(() => {\n // Blur any focused element when entering immersive mode\n if (isImmersive) {\n const focusElement = document.activeElement;\n if (focusElement && footerRef.current?.contains(focusElement)) {\n (focusElement as HTMLElement).blur();\n }\n }\n }, [isImmersive]);\n\n return(\n <>\n <ThInteractiveOverlay\n className={ classNames(readerStyles.barOverlay, readerStyles.footerOverlay) }\n isActive={ layout === ThLayoutUI.layered && isImmersive && !isHovering }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n />\n\n <ThFooter\n ref={ footerRef }\n className={ readerStyles.bottomBar }\n aria-label={ t(\"reader.app.footer.label\") }\n onMouseEnter={ setHover }\n onMouseLeave={ removeHover }\n { ...focusWithinProps }\n >\n { (isScroll)\n ? <StatefulReaderPagination\n aria-label={ t(\"reader.navigation.scroll.wrapper\") }\n links={ updateLinks() }\n dir={ direction }\n compounds={ {\n listItem: {\n className: readerPaginationStyles.listItem\n },\n leftButton: {\n className: readerPaginationStyles.leftButton,\n preventFocusOnPress: true\n },\n rightButton: {\n className: readerPaginationStyles.rightButton,\n preventFocusOnPress: true\n }\n } }\n >\n <StatefulReaderProgression\n className={ readerPaginationStyles.progression }\n formatPref={ progressionFormatPref }\n fallbackVariant={ progressionFormatFallback }\n />\n </StatefulReaderPagination>\n : <StatefulReaderProgression\n formatPref={ progressionFormatPref }\n fallbackVariant={ progressionFormatFallback }\n /> }\n </ThFooter>\n </>\n )\n}\n","export const getAndroidPatchCss = () => {\n if (typeof window === \"undefined\") {\n return \"\";\n }\n \n const origin = window.location.origin;\n \n return `/* Readium CSS\n Android Fonts Patch module\n\n A stylesheet aligning Android generic serif and sans-serif fonts on other platforms\n\n Repo: https://github.com/readium/css */\n\n/* Android resolves sans-serif to Roboto, and serif to Droid Serif \n This created issues for FXL EPUBs relying on Times (New Roman),\n Helvetica or Arial while not embedding the font files in the package.\n\n See https://github.com/readium/css/issues/149\n\n Unfortunately it is no possible to target generic family using @font-face,\n we have to target specific font-family names e.g. Times, Arial, etc.\n\n This stylesheet/patch should be loaded only for this case i.e.\n a Fixed-Layout EPUB with text but no embedded font on an Android device.\n The logic for checking these conditions are up to implementers.\n*/\n\n/* Serif (Times + Times New Roman) */\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Times;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n@font-face {\n font-family: \"Times New Roman\";\n src: url(\"${ new URL(\"/fonts/AndroidPatch/serif/NimbusRoman-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n/* Sans-serif (Helvetica + Arial) */\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Italic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: normal;\n font-style: italic;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-Bold.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: normal;\n}\n\n@font-face {\n font-family: Helvetica;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}\n\n@font-face {\n font-family: Arial;\n src: url(\"${ new URL(\"/fonts/AndroidPatch/sans-serif/NimbusSans-BoldItalic.woff\", origin).toString() }\") format(\"woff\");\n font-weight: bold;\n font-style: italic;\n}`;\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { InjectableFontResources } from \"@/preferences/services/fonts\";\nimport { ILinkInjectable, IUrlInjectable, IBlobInjectable } from \"@readium/navigator\";\n\nimport { getPlatform } from \"@/core/Helpers/getPlatform\";\nimport { getAndroidPatchCss } from \"./androidPatchCss\";\n\ntype FontResource = (ILinkInjectable & IUrlInjectable) | (ILinkInjectable & IBlobInjectable);\n\nexport const useFonts = (fontResources?: InjectableFontResources | null) => {\n const injectedElementsRef = useRef<{\n prepend: HTMLElement[];\n append: HTMLElement[];\n }>({\n prepend: [],\n append: []\n });\n\n const createLinkElement = useCallback((resource: FontResource): HTMLLinkElement => {\n const link = document.createElement(\"link\");\n \n // Set all custom attributes first to make sure they are\n // overridden by the core attributes\n if (\"attributes\" in resource && resource.attributes) {\n Object.entries(resource.attributes).forEach(([key, value]) => {\n link.setAttribute(key, value as string);\n });\n }\n \n link.rel = resource.rel;\n link.as = resource.as;\n \n if (\"url\" in resource) {\n link.href = resource.url;\n } else if (\"blob\" in resource && resource.blob) {\n link.href = URL.createObjectURL(resource.blob);\n }\n \n return link;\n }, []);\n\n const removeInjectedElements = useCallback(() => {\n const { prepend, append } = injectedElementsRef.current;\n \n [...prepend, ...append].forEach(element => {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n // Revoke blob URLs to prevent memory leaks\n if (element instanceof HTMLLinkElement && element.href.startsWith(\"blob:\")) {\n URL.revokeObjectURL(element.href);\n }\n });\n \n injectedElementsRef.current = {\n prepend: [],\n append: []\n };\n }, []);\n\n const injectFontResources = useCallback((resources: InjectableFontResources | null) => {\n if (typeof document === \"undefined\") return;\n \n removeInjectedElements();\n \n if (!resources) return;\n \n const { prepend, append } = resources;\n const injectedElements = injectedElementsRef.current;\n \n prepend.forEach(resource => {\n const element = createLinkElement(resource);\n document.head.insertBefore(element, document.head.firstChild);\n injectedElements.prepend.push(element);\n });\n \n append.forEach(resource => {\n const element = createLinkElement(resource);\n document.head.appendChild(element);\n injectedElements.append.push(element);\n });\n }, [createLinkElement, removeInjectedElements]);\n\n const getAndroidFXLPatch = useCallback((): (ILinkInjectable & IBlobInjectable) | null => {\n const platform = getPlatform();\n const isAndroid = platform === \"android\";\n \n if (!isAndroid) {\n return null;\n }\n \n const cssContent = getAndroidPatchCss();\n const blob = new Blob([cssContent], { type: \"text/css\" });\n \n return {\n as: \"link\",\n rel: \"stylesheet\",\n blob\n };\n }, []);\n\n useEffect(() => {\n injectFontResources(fontResources || null);\n \n return () => {\n removeInjectedElements();\n };\n }, [fontResources, injectFontResources, removeInjectedElements]);\n\n return {\n injectFontResources,\n removeFontResources: removeInjectedElements,\n getAndroidFXLPatch\n };\n};","// Peripherals based on XBReader\nimport { ThActionsPref, DefaultKeys } from \"@/preferences\";\n\nimport { ThActionsKeys } from \"@/preferences/models\";\n\nimport { buildShortcut, UnstablePShortcut } from \"@/core/Helpers/keyboardUtilities\";\nimport { isInteractiveElement } from \"@/core/Helpers/focusUtilities\";\n\nimport { useAppStore } from \"@/lib/hooks\";\n\nexport interface PCallbacks {\n moveTo: (direction: \"left\" | \"right\" | \"up\" | \"down\" | \"home\" | \"end\") => void;\n goProgression: (shiftKey?: boolean) => void;\n toggleAction: (action: ThActionsKeys) => void;\n}\n\nexport interface PShortcuts {\n [key: string]: {\n actionKey: ThActionsKeys;\n modifiers: UnstablePShortcut[\"modifiers\"];\n }\n}\n\nexport default class Peripherals {\n private readonly observers = [\"keydown\"];\n private targets: EventTarget[] = [];\n private readonly callbacks: PCallbacks;\n private readonly store: ReturnType<typeof useAppStore>;\n private readonly actionsPref: ThActionsPref<DefaultKeys> | undefined;\n private readonly shortcuts: PShortcuts;\n\n constructor(store: ReturnType<typeof useAppStore>, actionsPref: ThActionsPref<DefaultKeys> | undefined, callbacks: PCallbacks) {\n this.observers.forEach((method) => {\n (this as any)[\"on\" + method] = (this as any)[\"on\" + method].bind(this);\n });\n this.store = store;\n this.actionsPref = actionsPref;\n this.callbacks = callbacks;\n this.shortcuts = this.retrieveShortcuts();\n }\n\n private getPlatformModifier(): \"ctrlKey\" | \"metaKey\" {\n return this.store.getState().reader.platformModifier.modifier;\n }\n\n private retrieveShortcuts() {\n if (!this.actionsPref) return {};\n\n const shortcutsObj: PShortcuts = {};\n\n const displayOrder = this.store.getState().publication.isFXL\n ? this.actionsPref.fxlOrder\n : this.actionsPref.reflowOrder;\n\n for (const actionKey of displayOrder) {\n const shortcutString = this.actionsPref.keys[actionKey].shortcut;\n \n if (shortcutString) {\n const shortcutObj = buildShortcut(shortcutString);\n\n if (shortcutObj?.key) {\n Object.defineProperty(shortcutsObj, shortcutObj.key, {\n value: {\n actionKey: actionKey,\n modifiers: shortcutObj.modifiers\n },\n writable: false,\n enumerable: true\n });\n }\n }\n };\n \n return shortcutsObj;\n }\n\n destroy() {\n this.targets.forEach((t) => this.unobserve(t));\n }\n\n unobserve(item: EventTarget) {\n if (!item) return;\n this.observers.forEach((EventName) => {\n item.removeEventListener(\n EventName,\n (this as any)[\"on\" + EventName],\n false\n );\n });\n this.targets = this.targets.filter((t) => t !== item);\n }\n\n observe(item: EventTarget) {\n if (!item) return;\n if (this.targets.includes(item)) return;\n this.observers.forEach((EventName) => {\n item.addEventListener(EventName, (this as any)[\"on\" + EventName], false);\n });\n this.targets.push(item);\n }\n\n onkeydown(e: KeyboardEvent) {\n const focusIsSafe = !isInteractiveElement(document.activeElement);\n \n switch(e.code) {\n case \"Space\":\n focusIsSafe && this.callbacks.goProgression(e.shiftKey);\n break;\n case \"ArrowRight\":\n focusIsSafe && this.callbacks.moveTo(\"right\");\n break;\n case \"ArrowLeft\":\n focusIsSafe && this.callbacks.moveTo(\"left\");\n break;\n case \"ArrowUp\":\n case \"PageUp\":\n focusIsSafe && this.callbacks.moveTo(\"up\");\n break;\n case \"ArrowDown\":\n case \"PageDown\":\n focusIsSafe && this.callbacks.moveTo(\"down\");\n break;\n case \"Home\":\n focusIsSafe && this.callbacks.moveTo(\"home\");\n break;\n case \"End\":\n focusIsSafe && this.callbacks.moveTo(\"end\");\n break;\n default:\n if (this.shortcuts.hasOwnProperty(e.code)) {\n const customShortcutObj = this.shortcuts[e.code];\n const sendCallback = Object.entries(customShortcutObj.modifiers).every(( [modifier, value] ) => {\n if (modifier === \"platformKey\") {\n return e[this.getPlatformModifier()] === value;\n } else {\n return e[modifier as \"altKey\" | \"ctrlKey\" | \"metaKey\" | \"shiftKey\"] === value;\n }\n })\n \n if (sendCallback) {\n e.preventDefault();\n this.callbacks.toggleAction(customShortcutObj.actionKey)\n };\n }\n break;\n }\n }\n}","import { ThLayoutUI } from \"@/preferences\";\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\nimport classNames from \"classnames\";\n\ninterface ReaderStyleOptions {\n layoutUI: ThLayoutUI;\n isScroll: boolean;\n isImmersive?: boolean;\n isHovering?: boolean;\n isFXL?: boolean;\n breakpoint?: string;\n containerBreakpoint?: string;\n}\n\nconst LAYOUT_CLASSES = {\n [ThLayoutUI.stacked]: \"thorium_web_stackedUI\",\n [ThLayoutUI.layered]: \"thorium_web_layeredUI\",\n} as const;\n\nconst toBreakpointClass = (prefix: string, bp: string) =>\n `${ prefix }${ bp.charAt(0).toUpperCase() + bp.slice(1) }`;\n\nexport function getReaderClassNames(options: ReaderStyleOptions): string {\n const {\n layoutUI,\n isScroll,\n isImmersive = false,\n isHovering = false,\n isFXL = false,\n breakpoint,\n containerBreakpoint,\n } = options;\n\n return classNames(\n readerStyles.shell,\n isScroll ? \"thorium_web_isScroll\" : \"thorium_web_isPaged\",\n isImmersive && \"thorium_web_isImmersive\",\n isHovering && \"thorium_web_isHovering\",\n isFXL ? \"thorium_web_isFXL\" : \"thorium_web_isReflow\",\n LAYOUT_CLASSES[layoutUI],\n breakpoint ? toBreakpointClass(\"thorium_web_is\", breakpoint) : undefined,\n containerBreakpoint ? toBreakpointClass(\"thorium_web_container_is\", containerBreakpoint) : undefined\n );\n}"]}
|