@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.
Files changed (124) hide show
  1. package/dist/{ThPreferencesAdapter-D0rzsGRl.d.mts → ThPreferencesAdapter-_5AePKHa.d.mts} +26 -7
  2. package/dist/{ThSettingsWrapper-BXuRgdqp.d.mts → ThSettingsWrapper-B_9klYXH.d.mts} +1 -1
  3. package/dist/{actions-BLAr0oaM.d.mts → actions-CuRRM3rp.d.mts} +5 -2
  4. package/dist/{actionsReducer-XWTGGNUd.d.mts → actionsReducer-VFR42qgL.d.mts} +1 -1
  5. package/dist/{chunk-6EHFW43Y.mjs → chunk-2NCN2AG2.mjs} +5 -4
  6. package/dist/chunk-2NCN2AG2.mjs.map +1 -0
  7. package/dist/{chunk-L4XGZAZ5.mjs → chunk-2YRT7RNW.mjs} +20 -3
  8. package/dist/chunk-2YRT7RNW.mjs.map +1 -0
  9. package/dist/{chunk-5LUMM7FW.mjs → chunk-44PEO3DS.mjs} +2 -2
  10. package/dist/{chunk-5LUMM7FW.mjs.map → chunk-44PEO3DS.mjs.map} +1 -1
  11. package/dist/chunk-A575ZW4A.mjs +10 -0
  12. package/dist/chunk-A575ZW4A.mjs.map +1 -0
  13. package/dist/chunk-AE6P4KJB.mjs +13 -0
  14. package/dist/chunk-AE6P4KJB.mjs.map +1 -0
  15. package/dist/chunk-AQSJDL63.mjs +193 -0
  16. package/dist/chunk-AQSJDL63.mjs.map +1 -0
  17. package/dist/{chunk-NKO3K3QS.mjs → chunk-DQDOOTCE.mjs} +5 -5
  18. package/dist/chunk-DQDOOTCE.mjs.map +1 -0
  19. package/dist/{chunk-SAUOY37Q.mjs → chunk-E2JEGVVE.mjs} +15 -15
  20. package/dist/chunk-E2JEGVVE.mjs.map +1 -0
  21. package/dist/{chunk-DETZMFZ7.mjs → chunk-ETLIGONP.mjs} +39 -33
  22. package/dist/chunk-ETLIGONP.mjs.map +1 -0
  23. package/dist/chunk-GNROODJB.mjs +9 -0
  24. package/dist/chunk-GNROODJB.mjs.map +1 -0
  25. package/dist/{chunk-6BUN7DEA.mjs → chunk-KGSFTRCH.mjs} +69 -84
  26. package/dist/chunk-KGSFTRCH.mjs.map +1 -0
  27. package/dist/{chunk-LP3JFZ4A.mjs → chunk-MSHUPSBI.mjs} +718 -466
  28. package/dist/chunk-MSHUPSBI.mjs.map +1 -0
  29. package/dist/chunk-OD75GC5N.mjs +3953 -0
  30. package/dist/chunk-OD75GC5N.mjs.map +1 -0
  31. package/dist/{chunk-I4BKU5NN.mjs → chunk-RBEPH5E5.mjs} +100 -30
  32. package/dist/chunk-RBEPH5E5.mjs.map +1 -0
  33. package/dist/{chunk-DMZFSOHK.mjs → chunk-SI4FBFHM.mjs} +135 -46
  34. package/dist/chunk-SI4FBFHM.mjs.map +1 -0
  35. package/dist/{chunk-A3FZBEUL.mjs → chunk-SZAVAQ6S.mjs} +30 -6
  36. package/dist/chunk-SZAVAQ6S.mjs.map +1 -0
  37. package/dist/{chunk-ITDBOMY5.mjs → chunk-VENFFPK2.mjs} +3 -3
  38. package/dist/{chunk-ITDBOMY5.mjs.map → chunk-VENFFPK2.mjs.map} +1 -1
  39. package/dist/{chunk-2ORXUOH3.mjs → chunk-WF2UOYO7.mjs} +4 -4
  40. package/dist/{chunk-2ORXUOH3.mjs.map → chunk-WF2UOYO7.mjs.map} +1 -1
  41. package/dist/{chunk-EZG6SBSO.mjs → chunk-YEVLT3AV.mjs} +104 -29
  42. package/dist/chunk-YEVLT3AV.mjs.map +1 -0
  43. package/dist/components/Audio/index.css +2 -1
  44. package/dist/components/Audio/index.css.map +1 -1
  45. package/dist/components/Audio/index.d.mts +16 -15
  46. package/dist/components/Audio/index.mjs +16 -16
  47. package/dist/components/Epub/index.css +5 -4
  48. package/dist/components/Epub/index.css.map +1 -1
  49. package/dist/components/Epub/index.d.mts +13 -13
  50. package/dist/components/Epub/index.mjs +17 -17
  51. package/dist/components/Misc/index.mjs +5 -5
  52. package/dist/components/Reader/index.css +5 -4
  53. package/dist/components/Reader/index.css.map +1 -1
  54. package/dist/components/Reader/index.d.mts +11 -11
  55. package/dist/components/Reader/index.mjs +34 -30
  56. package/dist/components/Reader/index.mjs.map +1 -1
  57. package/dist/components/WebPub/index.css +5 -4
  58. package/dist/components/WebPub/index.css.map +1 -1
  59. package/dist/components/WebPub/index.d.mts +13 -13
  60. package/dist/components/WebPub/index.mjs +17 -17
  61. package/dist/core/Components/index.d.mts +12 -22
  62. package/dist/core/Components/index.mjs +2 -2
  63. package/dist/core/Helpers/index.d.mts +1 -1
  64. package/dist/core/Helpers/index.mjs +3 -4
  65. package/dist/core/Hooks/index.d.mts +12 -8
  66. package/dist/core/Hooks/index.mjs +1 -1
  67. package/dist/i18n/index.mjs +4 -7
  68. package/dist/lib/index.d.mts +56 -20
  69. package/dist/lib/index.mjs +3 -2
  70. package/dist/locales/da/thorium-shared.json +3 -0
  71. package/dist/locales/da/thorium-web.json +37 -2
  72. package/dist/locales/en/thorium-shared.json +24 -2
  73. package/dist/locales/en/thorium-web.json +2 -2
  74. package/dist/locales/es/thorium-shared.json +364 -0
  75. package/dist/locales/es/thorium-web.json +130 -0
  76. package/dist/locales/et/thorium-shared.json +121 -9
  77. package/dist/locales/et/thorium-web.json +32 -1
  78. package/dist/locales/fi/thorium-shared.json +42 -4
  79. package/dist/locales/fi/thorium-web.json +36 -2
  80. package/dist/locales/fr/thorium-shared.json +108 -1
  81. package/dist/locales/fr/thorium-web.json +121 -86
  82. package/dist/locales/it/thorium-shared.json +108 -1
  83. package/dist/locales/it/thorium-web.json +15 -2
  84. package/dist/locales/lt/thorium-web.json +36 -2
  85. package/dist/locales/pl/thorium-web.json +1 -1
  86. package/dist/locales/pt-BR/thorium-shared.json +6 -0
  87. package/dist/locales/pt-BR/thorium-web.json +88 -88
  88. package/dist/locales/pt-PT/thorium-shared.json +91 -0
  89. package/dist/locales/pt-PT/thorium-web.json +15 -3
  90. package/dist/locales/sv/thorium-shared.json +108 -2
  91. package/dist/locales/sv/thorium-web.json +15 -3
  92. package/dist/locales/tr/thorium-shared.json +42 -0
  93. package/dist/next-lib/index.mjs +1 -1
  94. package/dist/next-lib/index.mjs.map +1 -1
  95. package/dist/preferences/index.d.mts +59 -13
  96. package/dist/preferences/index.mjs +7 -7
  97. package/dist/{settingsReducer-Bu1zeveu.d.mts → settingsReducer-VqBhLq50.d.mts} +14 -2
  98. package/dist/{ui-nBv8gfr0.d.mts → ui-DnZZhozX.d.mts} +1 -1
  99. package/dist/{useAudioNavigator-C5aW4-eT.d.mts → useAudioNavigator-CWXyNWq1.d.mts} +3 -1
  100. package/dist/{useContrast-2t429O9O.d.mts → useContrast-Cbso7N1l.d.mts} +5 -1
  101. package/dist/{usePreferences-VaBf46eP.d.mts → usePreferences-9ZvbcbLW.d.mts} +6 -8
  102. package/dist/{useReaderTransitions-IBGdE7qi.d.mts → useReaderTransitions-0hKGCvMm.d.mts} +64 -12
  103. package/package.json +10 -9
  104. package/dist/chunk-6BUN7DEA.mjs.map +0 -1
  105. package/dist/chunk-6EHFW43Y.mjs.map +0 -1
  106. package/dist/chunk-7CGMWOZN.mjs +0 -20
  107. package/dist/chunk-7CGMWOZN.mjs.map +0 -1
  108. package/dist/chunk-A3FZBEUL.mjs.map +0 -1
  109. package/dist/chunk-B3WDMWCT.mjs +0 -9
  110. package/dist/chunk-B3WDMWCT.mjs.map +0 -1
  111. package/dist/chunk-DETZMFZ7.mjs.map +0 -1
  112. package/dist/chunk-DMZFSOHK.mjs.map +0 -1
  113. package/dist/chunk-DTPO3J2C.mjs +0 -1732
  114. package/dist/chunk-DTPO3J2C.mjs.map +0 -1
  115. package/dist/chunk-EZG6SBSO.mjs.map +0 -1
  116. package/dist/chunk-GPWW5OML.mjs +0 -1955
  117. package/dist/chunk-GPWW5OML.mjs.map +0 -1
  118. package/dist/chunk-I4BKU5NN.mjs.map +0 -1
  119. package/dist/chunk-L4XGZAZ5.mjs.map +0 -1
  120. package/dist/chunk-LP3JFZ4A.mjs.map +0 -1
  121. package/dist/chunk-MLEYTQGK.mjs +0 -60
  122. package/dist/chunk-MLEYTQGK.mjs.map +0 -1
  123. package/dist/chunk-NKO3K3QS.mjs.map +0 -1
  124. 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-LP3JFZ4A.mjs';
2
- import { useAppSelector, useAppDispatch, setHovering } from './chunk-EZG6SBSO.mjs';
3
- import { usePreferences } from './chunk-GPWW5OML.mjs';
4
- import { useI18n } from './chunk-6EHFW43Y.mjs';
5
- import { ThInteractiveOverlay, ThHeader, ThFooter, ThRunningHead, ThPagination } from './chunk-DETZMFZ7.mjs';
6
- import { isInteractiveElement, makeBreakpointsMap, getBestMatchingProgressionFormat } from './chunk-ITDBOMY5.mjs';
7
- import { ThRunningHeadFormat, ThProgressionFormat } from './chunk-L4XGZAZ5.mjs';
8
- import { getPlatform, buildShortcut } from './chunk-5LUMM7FW.mjs';
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.breakpoint);
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
- previousButton: "thorium_web_reader_pagination_previousButton",
130
+ leftButton: "thorium_web_reader_pagination_leftButton",
130
131
  progression: "thorium_web_reader_pagination_progression",
131
- nextButton: "thorium_web_reader_pagination_nextButton",
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 previousButtonRef = useRef(null);
325
- const nextButtonRef = useRef(null);
302
+ const leftButtonRef = useRef(null);
303
+ const rightButtonRef = useRef(null);
326
304
  const updatedCompounds = {
327
305
  ...compounds,
328
- previousButton: {
329
- ...compounds?.previousButton,
330
- ref: previousButtonRef,
306
+ leftButton: {
307
+ ...compounds?.leftButton,
308
+ ref: leftButtonRef,
331
309
  onKeyDown: (e) => {
332
310
  if (e.key === "Escape") {
333
- previousButtonRef.current?.blur();
311
+ leftButtonRef.current?.blur();
334
312
  }
335
313
  }
336
314
  },
337
- nextButton: {
338
- ...compounds?.nextButton,
339
- ref: nextButtonRef,
315
+ rightButton: {
316
+ ...compounds?.rightButton,
317
+ ref: rightButtonRef,
340
318
  onKeyDown: (e) => {
341
319
  if (e.key === "Escape") {
342
- nextButtonRef.current?.blur();
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 scroll = useAppSelector((state) => state.settings.scroll);
348
+ const isRTL = useAppSelector((state) => state.publication.isRTL);
371
349
  const isFXL = useAppSelector((state) => state.publication.isFXL);
372
- const isScroll = scroll && !isFXL;
373
- const breakpoint = useAppSelector((state) => state.theming.breakpoint);
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
- if (previous) {
404
- links.previous = {
405
- node: breakpoint !== "compact" /* compact */ && breakpoint !== "medium" /* medium */ ? /* @__PURE__ */ jsxs(Fragment, { children: [
406
- /* @__PURE__ */ jsx("span", { className: thorium_web_reader_app_default.srOnly, children: t(isFXL ? "reader.actions.goToPreviousPage.descriptive" : "reader.actions.goToPreviousChapter.descriptive") }),
407
- /* @__PURE__ */ jsx("span", { className: thorium_web_reader_pagination_default.label, children: timeline?.previousItem?.title || previous.title || t(isFXL ? "reader.actions.goToPreviousPage.compact" : "reader.actions.goToPreviousChapter.compact") })
408
- ] }) : /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("span", { className: thorium_web_reader_pagination_default.label, children: t(isFXL ? "reader.actions.goToPreviousPage.compact" : "reader.actions.goToPreviousChapter.compact") }) }),
409
- onPress: () => go(previous, !reducedMotion, () => {
410
- })
411
- };
412
- }
413
- if (next) {
414
- links.next = {
415
- node: breakpoint !== "compact" /* compact */ && breakpoint !== "medium" /* medium */ ? /* @__PURE__ */ jsxs(Fragment, { children: [
416
- /* @__PURE__ */ jsx("span", { className: thorium_web_reader_app_default.srOnly, children: t(isFXL ? "reader.actions.goToNextPage.descriptive" : "reader.actions.goToNextChapter.descriptive") }),
417
- /* @__PURE__ */ jsx("span", { className: thorium_web_reader_pagination_default.label, children: timeline?.nextItem?.title || next.title || t(isFXL ? "reader.actions.goToNextPage.compact" : "reader.actions.goToNextChapter.compact") })
418
- ] }) : /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("span", { className: thorium_web_reader_pagination_default.label, children: t(isFXL ? "reader.actions.goToNextPage.compact" : "reader.actions.goToNextChapter.compact") }) }),
419
- onPress: () => go(next, !reducedMotion, () => {
420
- })
421
- };
422
- }
423
- return links;
424
- }, [go, previousLocator, nextLocator, t, timeline, breakpoint, reducedMotion, isFXL]);
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 || readerProfile === "webPub" ? /* @__PURE__ */ jsx(
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
- previousButton: {
465
- className: thorium_web_reader_pagination_default.previousButton,
446
+ leftButton: {
447
+ className: thorium_web_reader_pagination_default.leftButton,
466
448
  preventFocusOnPress: true
467
449
  },
468
- nextButton: {
469
- className: thorium_web_reader_pagination_default.nextButton,
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 ? `thorium_web_is${breakpoint.charAt(0).toUpperCase() + breakpoint.slice(1)}` : void 0
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-6BUN7DEA.mjs.map
854
- //# sourceMappingURL=chunk-6BUN7DEA.mjs.map
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}"]}