@edrlab/thorium-web 1.4.1 → 1.5.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 (87) hide show
  1. package/dist/{ThPreferencesAdapter-_5AePKHa.d.mts → ThPreferencesAdapter-B3a-f5v-.d.mts} +22 -17
  2. package/dist/{ThSettingsWrapper-B_9klYXH.d.mts → ThSettingsWrapper-DtzcwzYX.d.mts} +4 -4
  3. package/dist/{actions-CuRRM3rp.d.mts → actions-C33UN3Ji.d.mts} +14 -3
  4. package/dist/{actionsReducer-VFR42qgL.d.mts → actionsReducer-Bzcj3wk3.d.mts} +1 -1
  5. package/dist/{chunk-SZAVAQ6S.mjs → chunk-2B3HE57E.mjs} +42 -52
  6. package/dist/chunk-2B3HE57E.mjs.map +1 -0
  7. package/dist/{chunk-SI4FBFHM.mjs → chunk-3ITHCTDL.mjs} +157 -108
  8. package/dist/chunk-3ITHCTDL.mjs.map +1 -0
  9. package/dist/{chunk-OD75GC5N.mjs → chunk-3VB756GR.mjs} +89 -51
  10. package/dist/chunk-3VB756GR.mjs.map +1 -0
  11. package/dist/{chunk-ETLIGONP.mjs → chunk-AXX4U2FW.mjs} +25 -133
  12. package/dist/chunk-AXX4U2FW.mjs.map +1 -0
  13. package/dist/{chunk-WF2UOYO7.mjs → chunk-CCHCCVSF.mjs} +3 -3
  14. package/dist/{chunk-WF2UOYO7.mjs.map → chunk-CCHCCVSF.mjs.map} +1 -1
  15. package/dist/{chunk-RBEPH5E5.mjs → chunk-J6XDICU2.mjs} +80 -50
  16. package/dist/chunk-J6XDICU2.mjs.map +1 -0
  17. package/dist/chunk-KQ3KS5O5.mjs +37 -0
  18. package/dist/chunk-KQ3KS5O5.mjs.map +1 -0
  19. package/dist/{chunk-DQDOOTCE.mjs → chunk-KT2QY5QU.mjs} +3 -3
  20. package/dist/{chunk-DQDOOTCE.mjs.map → chunk-KT2QY5QU.mjs.map} +1 -1
  21. package/dist/{chunk-KGSFTRCH.mjs → chunk-KXOIN35D.mjs} +45 -117
  22. package/dist/chunk-KXOIN35D.mjs.map +1 -0
  23. package/dist/{chunk-E2JEGVVE.mjs → chunk-MTH2RF6V.mjs} +45 -12
  24. package/dist/chunk-MTH2RF6V.mjs.map +1 -0
  25. package/dist/{chunk-MSHUPSBI.mjs → chunk-THOJRBVD.mjs} +337 -90
  26. package/dist/chunk-THOJRBVD.mjs.map +1 -0
  27. package/dist/{chunk-VENFFPK2.mjs → chunk-VYSDLACR.mjs} +2 -2
  28. package/dist/{chunk-VENFFPK2.mjs.map → chunk-VYSDLACR.mjs.map} +1 -1
  29. package/dist/chunk-X63WSMOH.mjs +57 -0
  30. package/dist/chunk-X63WSMOH.mjs.map +1 -0
  31. package/dist/{chunk-YEVLT3AV.mjs → chunk-YE5QOQUT.mjs} +3 -3
  32. package/dist/{chunk-YEVLT3AV.mjs.map → chunk-YE5QOQUT.mjs.map} +1 -1
  33. package/dist/components/Audio/index.css +10 -0
  34. package/dist/components/Audio/index.css.map +1 -1
  35. package/dist/components/Audio/index.d.mts +12 -11
  36. package/dist/components/Audio/index.mjs +13 -12
  37. package/dist/components/Epub/index.css +10 -0
  38. package/dist/components/Epub/index.css.map +1 -1
  39. package/dist/components/Epub/index.d.mts +12 -11
  40. package/dist/components/Epub/index.mjs +14 -13
  41. package/dist/components/Misc/index.mjs +4 -4
  42. package/dist/components/Reader/index.css +10 -0
  43. package/dist/components/Reader/index.css.map +1 -1
  44. package/dist/components/Reader/index.d.mts +11 -10
  45. package/dist/components/Reader/index.mjs +21 -20
  46. package/dist/components/Reader/index.mjs.map +1 -1
  47. package/dist/components/WebPub/index.css +10 -0
  48. package/dist/components/WebPub/index.css.map +1 -1
  49. package/dist/components/WebPub/index.d.mts +12 -11
  50. package/dist/components/WebPub/index.mjs +14 -13
  51. package/dist/core/Components/index.d.mts +10 -25
  52. package/dist/core/Components/index.mjs +1 -1
  53. package/dist/core/Helpers/index.d.mts +1 -1
  54. package/dist/core/Helpers/index.mjs +3 -2
  55. package/dist/core/Hooks/index.d.mts +14 -7
  56. package/dist/core/Hooks/index.mjs +2 -1
  57. package/dist/i18n/index.mjs +2 -2
  58. package/dist/keyboardUtilities-BCP3UcLb.d.mts +30 -0
  59. package/dist/lib/index.d.mts +9 -8
  60. package/dist/lib/index.mjs +3 -2
  61. package/dist/locales/da/thorium-shared.json +217 -10
  62. package/dist/locales/he/thorium-shared.json +8 -0
  63. package/dist/locales/he/thorium-web.json +9 -0
  64. package/dist/locales/it/thorium-shared.json +2 -2
  65. package/dist/locales/it/thorium-web.json +24 -2
  66. package/dist/locales/lt/thorium-shared.json +85 -1
  67. package/dist/locales/sv/thorium-shared.json +5 -5
  68. package/dist/locales/sv/thorium-web.json +22 -0
  69. package/dist/preferences/index.d.mts +16 -23
  70. package/dist/preferences/index.mjs +4 -3
  71. package/dist/{settingsReducer-VqBhLq50.d.mts → settingsReducer-Pp9aoiiC.d.mts} +1 -1
  72. package/dist/{useAudioNavigator-CWXyNWq1.d.mts → useAudioNavigator-9RuOpLGB.d.mts} +8 -5
  73. package/dist/{useContrast-Cbso7N1l.d.mts → useContrast-Bl08zDTU.d.mts} +2 -7
  74. package/dist/{usePreferences-9ZvbcbLW.d.mts → usePreferences-Cy7-JN2x.d.mts} +4 -8
  75. package/dist/{useReaderTransitions-0hKGCvMm.d.mts → useReaderTransitions-CpgrXS5g.d.mts} +50 -23
  76. package/package.json +7 -7
  77. package/dist/chunk-44PEO3DS.mjs +0 -121
  78. package/dist/chunk-44PEO3DS.mjs.map +0 -1
  79. package/dist/chunk-E2JEGVVE.mjs.map +0 -1
  80. package/dist/chunk-ETLIGONP.mjs.map +0 -1
  81. package/dist/chunk-KGSFTRCH.mjs.map +0 -1
  82. package/dist/chunk-MSHUPSBI.mjs.map +0 -1
  83. package/dist/chunk-OD75GC5N.mjs.map +0 -1
  84. package/dist/chunk-RBEPH5E5.mjs.map +0 -1
  85. package/dist/chunk-SI4FBFHM.mjs.map +0 -1
  86. package/dist/chunk-SZAVAQ6S.mjs.map +0 -1
  87. package/dist/keyboardUtilities-BWAyLS_D.d.mts +0 -56
@@ -1,11 +1,10 @@
1
- import { useFonts, Peripherals, StatefulReaderHeader, StatefulReaderFooter, getReaderClassNames } from './chunk-KGSFTRCH.mjs';
2
- import { createDefaultPlugin, useSpacingPresets, useSettingsComponentStatus, usePositionStorage, useLineHeight, NavigatorProvider, thorium_web_reader_app_default, StatefulDockingWrapper } from './chunk-MSHUPSBI.mjs';
3
- import { useWebPubSettingsCache, useFullscreen, useWebPubNavigator, useTimeline, useDocumentTitle } from './chunk-SZAVAQ6S.mjs';
4
- import { setFullscreen, setTimeline, setHovering, toggleImmersive, toggleActionOpen, setPublicationStart, setPublicationEnd, setLoading } from './chunk-YEVLT3AV.mjs';
5
- import { usePreferences, resolveContentProtectionConfig } from './chunk-OD75GC5N.mjs';
6
- import { useAppSelector, useAppDispatch, useAppStore } from './chunk-A575ZW4A.mjs';
7
- import { ThPluginRegistry, ThPluginProvider } from './chunk-ETLIGONP.mjs';
1
+ import { useFonts, useZoomCallbacks, StatefulReaderHeader, StatefulReaderFooter, getReaderClassNames } from './chunk-KXOIN35D.mjs';
2
+ import { ThPluginRegistry, createDefaultPlugin, ThPluginProvider, useSpacingPresets, useSettingsComponentStatus, useFocusedDockableKey, usePositionStorage, fromActionPeripheralType, fromDockingPeripheralType, NavPeripheralType, NavigatorProvider, thorium_web_reader_app_default, StatefulDockingWrapper, useActionComponentStatus, ZOOM_IN_KEY_COMBOS, ZOOM_OUT_KEY_COMBOS, toActionPeripheralType, toDockingPeripheralType, useLineHeight } from './chunk-THOJRBVD.mjs';
3
+ import { useWebPubSettingsCache, useFullscreen, useWebPubNavigator, useTimeline, useDocumentTitle } from './chunk-2B3HE57E.mjs';
8
4
  import { useI18n } from './chunk-2NCN2AG2.mjs';
5
+ import { setFullscreen, setTimeline, setHovering, toggleImmersive, toggleActionOpen, dockAction, setPublicationStart, setPublicationEnd, setLoading } from './chunk-YE5QOQUT.mjs';
6
+ import { usePreferences, resolveContentProtectionConfig, useActionsPreferences, useFilteredPreferenceKeys } from './chunk-3VB756GR.mjs';
7
+ import { useAppSelector, useAppDispatch } from './chunk-A575ZW4A.mjs';
9
8
  import { useState, useLayoutEffect, useRef, useCallback, useMemo, useEffect } from 'react';
10
9
  import { Locator } from '@readium/shared';
11
10
  import classNames from 'classnames';
@@ -15,9 +14,9 @@ var useWebPubPreferencesConfig = ({
15
14
  settings,
16
15
  fontLanguage,
17
16
  hasDisplayTransformability,
18
- getFontMetadata,
19
- lineHeightOptions
17
+ getFontMetadata
20
18
  }) => {
19
+ const { processedValues: lineHeightOptions } = useLineHeight();
21
20
  const { isComponentUsed: isFontFamilyUsed } = useSettingsComponentStatus({
22
21
  settingsKey: "fontFamily" /* fontFamily */,
23
22
  publicationType: "webpub"
@@ -90,7 +89,6 @@ var useWebPubPreferencesConfig = ({
90
89
  fontLanguage,
91
90
  hasDisplayTransformability,
92
91
  getFontMetadata,
93
- lineHeightOptions,
94
92
  isFontFamilyUsed,
95
93
  isFontWeightUsed,
96
94
  isHyphensUsed,
@@ -102,7 +100,8 @@ var useWebPubPreferencesConfig = ({
102
100
  isParagraphSpacingUsed,
103
101
  isTextAlignUsed,
104
102
  isTextNormalizeUsed,
105
- isWordSpacingUsed
103
+ isWordSpacingUsed,
104
+ lineHeightOptions
106
105
  ]);
107
106
  return { webPubPreferences };
108
107
  };
@@ -146,8 +145,8 @@ var useWebPubReaderInit = ({
146
145
  injectFontResources,
147
146
  removeFontResources,
148
147
  getFontInjectables,
149
- lineHeightOptions,
150
148
  contentProtectionConfig,
149
+ keyboardPeripherals,
151
150
  onNavigatorReady,
152
151
  onNavigatorLoaded,
153
152
  onCleanup
@@ -157,8 +156,7 @@ var useWebPubReaderInit = ({
157
156
  settings: cache.current.settings,
158
157
  fontLanguage,
159
158
  hasDisplayTransformability,
160
- getFontMetadata,
161
- lineHeightOptions
159
+ getFontMetadata
162
160
  });
163
161
  const { injectables } = useWebPubInjectablesConfig({
164
162
  isFontFamilyUsed,
@@ -187,7 +185,8 @@ var useWebPubReaderInit = ({
187
185
  experiments: preferences.experiments?.webPub || null
188
186
  },
189
187
  injectables,
190
- contentProtection: contentProtectionConfig
188
+ contentProtection: contentProtectionConfig,
189
+ keyboardPeripherals
191
190
  };
192
191
  isNavigatorLoadedWebPub.current = true;
193
192
  onNavigatorReady?.();
@@ -217,6 +216,36 @@ var useWebPubReaderInit = ({
217
216
  navigatorReady
218
217
  };
219
218
  };
219
+ var useWebPubKeyboardPeripherals = () => {
220
+ const { actionsKeys, docking } = useActionsPreferences();
221
+ const { isSupported: isFullscreenSupported } = useFullscreen();
222
+ const { webPubActionKeys } = useFilteredPreferenceKeys();
223
+ const { isComponentAvailable: isFullscreenAvailable } = useActionComponentStatus({ actionKey: "fullscreen" /* fullscreen */, orderArray: webPubActionKeys, additionalCondition: isFullscreenSupported });
224
+ const { isComponentAvailable: isTocAvailable } = useActionComponentStatus({ actionKey: "toc" /* toc */, orderArray: webPubActionKeys });
225
+ const { isComponentAvailable: isSettingsAvailable } = useActionComponentStatus({ actionKey: "settings" /* settings */, orderArray: webPubActionKeys });
226
+ const { isComponentAvailable: isJumpToPositionAvailable } = useActionComponentStatus({ actionKey: "jumpToPosition" /* jumpToPosition */, orderArray: webPubActionKeys });
227
+ return useMemo(() => {
228
+ const actionAvailability = {
229
+ ["fullscreen" /* fullscreen */]: isFullscreenAvailable,
230
+ ["toc" /* toc */]: isTocAvailable,
231
+ ["settings" /* settings */]: isSettingsAvailable,
232
+ ["jumpToPosition" /* jumpToPosition */]: isJumpToPositionAvailable
233
+ };
234
+ const config = [
235
+ { type: NavPeripheralType.zoomIn, keyCombos: [...ZOOM_IN_KEY_COMBOS] },
236
+ { type: NavPeripheralType.zoomOut, keyCombos: [...ZOOM_OUT_KEY_COMBOS] }
237
+ ];
238
+ for (const [key, tokens] of Object.entries(actionsKeys)) {
239
+ const shortcut = tokens?.shortcut;
240
+ const isAvailable = actionAvailability[key] ?? true;
241
+ if (shortcut && isAvailable) config.push({ type: toActionPeripheralType(key), keyCombos: shortcut.keyCombos });
242
+ }
243
+ for (const [key, tokens] of Object.entries(docking.keys)) {
244
+ if (tokens?.shortcut) config.push({ type: toDockingPeripheralType(key), keyCombos: tokens.shortcut.keyCombos });
245
+ }
246
+ return config;
247
+ }, [actionsKeys, docking.keys, isFullscreenAvailable, isTocAvailable, isSettingsAvailable, isJumpToPositionAvailable]);
248
+ };
220
249
  var ExperimentalWebPubStatefulReader = ({
221
250
  publication,
222
251
  localDataKey,
@@ -288,10 +317,13 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
288
317
  );
289
318
  const layoutUI = preferences.theming.layout.ui?.webPub || "stacked-ui" /* stacked */;
290
319
  const dispatch = useAppDispatch();
320
+ const getFocusedDockableKey = useFocusedDockableKey();
321
+ const profile = useAppSelector((state) => state.reader.profile);
322
+ const keyboardPeripherals = useWebPubKeyboardPeripherals();
291
323
  const onFsChange = useCallback((isFullscreen) => {
292
324
  dispatch(setFullscreen(isFullscreen));
293
325
  }, [dispatch]);
294
- const fs = useFullscreen(onFsChange);
326
+ const { handleFullscreen } = useFullscreen(onFsChange);
295
327
  const webPubNavigator = useWebPubNavigator();
296
328
  const {
297
329
  currentPositions,
@@ -308,7 +340,6 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
308
340
  dispatch(setTimeline(timeline2));
309
341
  }
310
342
  });
311
- const lineHeightOptions = useLineHeight();
312
343
  const documentTitleFormat = preferences.metadata?.documentTitle?.format;
313
344
  let documentTitle;
314
345
  if (documentTitleFormat) {
@@ -342,30 +373,9 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
342
373
  dispatch(setHovering(false));
343
374
  dispatch(toggleImmersive());
344
375
  }, [dispatch]);
345
- const appStore = useAppStore();
346
- const p = useMemo(() => new Peripherals(appStore, preferences.actions, {
347
- moveTo: () => {
348
- },
349
- goProgression: () => {
350
- },
351
- toggleAction: (actionKey) => {
352
- switch (actionKey) {
353
- case "fullscreen" /* fullscreen */:
354
- fs.handleFullscreen();
355
- break;
356
- case "settings" /* settings */:
357
- case "toc" /* toc */:
358
- dispatch(toggleActionOpen({
359
- key: actionKey,
360
- profile: "webPub"
361
- }));
362
- break;
363
- }
364
- }
365
- }), [appStore, preferences.actions, fs, dispatch]);
376
+ const { zoomIn, zoomOut } = useZoomCallbacks(webPubNavigator);
366
377
  const listeners = useMemo(() => ({
367
378
  frameLoaded: async function(_wnd) {
368
- p.observe(window);
369
379
  },
370
380
  positionChanged: async function(locator) {
371
381
  setLocalData(locator);
@@ -408,9 +418,35 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
408
418
  },
409
419
  contextMenu: function(_data) {
410
420
  },
411
- peripheral: function(_data) {
421
+ peripheral: function(data) {
422
+ switch (data.type) {
423
+ case NavPeripheralType.zoomIn:
424
+ zoomIn();
425
+ break;
426
+ case NavPeripheralType.zoomOut:
427
+ zoomOut();
428
+ break;
429
+ default: {
430
+ const actionKey = fromActionPeripheralType(data.type);
431
+ if (actionKey === "fullscreen" /* fullscreen */) {
432
+ handleFullscreen();
433
+ return;
434
+ }
435
+ if (actionKey && profile) {
436
+ dispatch(toggleActionOpen({ key: actionKey, profile }));
437
+ return;
438
+ }
439
+ const dockingKey = fromDockingPeripheralType(data.type);
440
+ if (dockingKey && profile) {
441
+ const actionKey2 = getFocusedDockableKey(dockingKey);
442
+ if (actionKey2) {
443
+ dispatch(dockAction({ key: actionKey2, dockingKey, profile }));
444
+ }
445
+ }
446
+ }
447
+ }
412
448
  }
413
- }), [p, setLocalData, canGoBackward, canGoForward, dispatch, toggleIsImmersive]);
449
+ }), [setLocalData, canGoBackward, canGoForward, dispatch, toggleIsImmersive, zoomIn, zoomOut, profile, handleFullscreen, getFocusedDockableKey]);
414
450
  const initialPosition = useMemo(() => getLocalData(), [getLocalData]);
415
451
  useWebPubReaderInit({
416
452
  container,
@@ -426,16 +462,10 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
426
462
  injectFontResources,
427
463
  removeFontResources,
428
464
  getFontInjectables,
429
- lineHeightOptions,
430
465
  contentProtectionConfig: resolveContentProtectionConfig(preferences.contentProtection, t),
466
+ keyboardPeripherals,
431
467
  onNavigatorReady: () => {
432
468
  dispatch(setLoading(false));
433
- },
434
- onNavigatorLoaded: () => {
435
- p.observe(window);
436
- },
437
- onCleanup: () => {
438
- p.destroy();
439
469
  }
440
470
  });
441
471
  return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(NavigatorProvider, { visualNavigator: webPubNavigator, children: /* @__PURE__ */ jsx("main", { className: thorium_web_reader_app_default.main, children: /* @__PURE__ */ jsx(StatefulDockingWrapper, { children: /* @__PURE__ */ jsxs(
@@ -477,5 +507,5 @@ var StatefulReaderInner = ({ publication, localDataKey, positionStorage, contain
477
507
  };
478
508
 
479
509
  export { ExperimentalWebPubStatefulReader };
480
- //# sourceMappingURL=chunk-RBEPH5E5.mjs.map
481
- //# sourceMappingURL=chunk-RBEPH5E5.mjs.map
510
+ //# sourceMappingURL=chunk-J6XDICU2.mjs.map
511
+ //# sourceMappingURL=chunk-J6XDICU2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/WebPub/Hooks/usePreferencesConfig.ts","../src/components/WebPub/Hooks/useInjectablesConfig.ts","../src/components/WebPub/Hooks/useReaderInit.ts","../src/components/WebPub/Hooks/useWebPubKeyboardPeripherals.ts","../src/components/WebPub/StatefulReader.tsx"],"names":["useMemo","useState","useRef","useCallback","timeline","actionKey"],"mappings":"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","file":"chunk-J6XDICU2.mjs","sourcesContent":["\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { IWebPubPreferences, TextAlignment } from \"@readium/navigator\";\nimport { ThLineHeightOptions, ThSettingsKeys } from \"@/preferences/models\";\nimport { FontMetadata } from \"@/preferences/services/fonts\";\nimport { WebPubCSSSettings } from \"@/core/Hooks/WebPub/useWebPubSettingsCache\";\nimport { useSettingsComponentStatus } from \"@/components/Settings/hooks/useSettingsComponentStatus\";\nimport { useLineHeight } from \"@/components/Settings/Spacing/hooks/useLineHeight\";\n\ninterface UseWebPubPreferencesConfigProps {\n settings: WebPubCSSSettings;\n fontLanguage: string;\n hasDisplayTransformability: boolean;\n getFontMetadata: (fontFamily: string) => FontMetadata;\n}\n\nexport const useWebPubPreferencesConfig = ({\n settings,\n fontLanguage,\n hasDisplayTransformability,\n getFontMetadata,\n}: UseWebPubPreferencesConfigProps) => {\n const { processedValues: lineHeightOptions } = useLineHeight();\n const { isComponentUsed: isFontFamilyUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.fontFamily,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isFontWeightUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.fontWeight,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isHyphensUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.hyphens,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isLigaturesUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.ligatures,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isNoRubyUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.noRuby,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isLetterSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.letterSpacing,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isLineHeightUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.lineHeight,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isParagraphIndentUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.paragraphIndent,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isParagraphSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.paragraphSpacing,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isTextAlignUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.textAlign,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isTextNormalizeUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.textNormalize,\n publicationType: \"webpub\",\n });\n\n const { isComponentUsed: isWordSpacingUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.wordSpacing,\n publicationType: \"webpub\",\n });\n\n const webPubPreferences = useMemo(() => {\n const preferences: IWebPubPreferences = {\n zoom: settings.zoom\n };\n\n if (hasDisplayTransformability) {\n if (isFontFamilyUsed) preferences.fontFamily = getFontMetadata(settings.fontFamily[fontLanguage] ?? \"\")?.fontStack || null;\n if (isFontWeightUsed) preferences.fontWeight = settings.fontWeight;\n if (isLigaturesUsed) preferences.ligatures = settings.ligatures;\n if (isNoRubyUsed) preferences.noRuby = settings.noRuby;\n if (isLetterSpacingUsed) preferences.letterSpacing = settings.letterSpacing;\n if (isLineHeightUsed) preferences.lineHeight = settings.lineHeight === null\n ? null\n : lineHeightOptions[settings.lineHeight as ThLineHeightOptions.small | ThLineHeightOptions.medium | ThLineHeightOptions.large];\n if (isParagraphIndentUsed) preferences.paragraphIndent = settings.paragraphIndent;\n if (isParagraphSpacingUsed) preferences.paragraphSpacing = settings.paragraphSpacing;\n if (isTextAlignUsed) preferences.textAlign = settings.textAlign as TextAlignment | null | undefined;\n if (isHyphensUsed && settings.textAlign !== \"publisher\") preferences.hyphens = settings.hyphens;\n if (isTextNormalizeUsed) preferences.textNormalization = settings.textNormalization;\n if (isWordSpacingUsed) preferences.wordSpacing = settings.wordSpacing;\n }\n\n return preferences;\n }, [\n settings,\n fontLanguage,\n hasDisplayTransformability,\n getFontMetadata,\n isFontFamilyUsed,\n isFontWeightUsed,\n isHyphensUsed,\n isLigaturesUsed,\n isNoRubyUsed,\n isLetterSpacingUsed,\n isLineHeightUsed,\n isParagraphIndentUsed,\n isParagraphSpacingUsed,\n isTextAlignUsed,\n isTextNormalizeUsed,\n isWordSpacingUsed,\n lineHeightOptions\n ]);\n\n return { webPubPreferences };\n};\n","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { IInjectablesConfig } from \"@readium/navigator\";\nimport { InjectableFontResources } from \"@/preferences/services/fonts\";\n\ninterface UseWebPubInjectablesConfigProps {\n isFontFamilyUsed: boolean;\n fontLanguage: string;\n getFontInjectables: (options?: { language?: string } | { key?: string }, optimize?: boolean) => InjectableFontResources | null;\n}\n\nexport const useWebPubInjectablesConfig = ({\n isFontFamilyUsed,\n fontLanguage,\n getFontInjectables,\n}: UseWebPubInjectablesConfigProps) => {\n const injectables = useMemo(() => {\n let injectablesConfig: IInjectablesConfig | undefined;\n\n if (isFontFamilyUsed) {\n const fontResources = getFontInjectables({ language: fontLanguage });\n if (fontResources) {\n injectablesConfig = {\n allowedDomains: fontResources.allowedDomains,\n rules: [{\n resources: [/\\.xhtml$/, /\\.html$/],\n prepend: fontResources.prepend,\n append: fontResources.append\n }]\n };\n }\n }\n\n return injectablesConfig;\n }, [isFontFamilyUsed, fontLanguage, getFontInjectables]);\n\n return { injectables };\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useState, useRef } from \"react\";\n\nimport { Locator, Publication } from \"@readium/shared\";\nimport { WebPubNavigatorListeners, IContentProtectionConfig } from \"@readium/navigator\";\nimport { ThPreferences } from \"@/preferences\";\nimport { FontMetadata, InjectableFontResources } from \"@/preferences/services/fonts\";\nimport { WebPubStatelessCache } from \"@/core/Hooks/WebPub/useWebPubSettingsCache\";\n\nimport { useWebPubPreferencesConfig } from \"./usePreferencesConfig\";\nimport { useWebPubInjectablesConfig } from \"./useInjectablesConfig\";\nimport { useWebPubNavigator, WebPubNavigatorLoadProps } from \"@/core/Hooks/WebPub/useWebPubNavigator\";\nimport { IKeyboardPeripheralsConfig } from \"@readium/navigator\";\n\ninterface UseWebPubReaderInitProps {\n container: React.RefObject<HTMLDivElement | null>;\n publication: Publication | null;\n initialPosition: Locator | null;\n listeners: WebPubNavigatorListeners;\n preferences: ThPreferences;\n cache: React.RefObject<WebPubStatelessCache>;\n isFontFamilyUsed: boolean;\n fontLanguage: string;\n hasDisplayTransformability: boolean;\n getFontMetadata: (fontId: string) => FontMetadata;\n injectFontResources: (resources: InjectableFontResources | null) => void;\n removeFontResources: () => void;\n getFontInjectables: (options?: { language?: string } | { key?: string }, optimize?: boolean) => InjectableFontResources | null;\n contentProtectionConfig?: IContentProtectionConfig;\n keyboardPeripherals?: IKeyboardPeripheralsConfig;\n onNavigatorReady?: () => void;\n onNavigatorLoaded?: () => void;\n onCleanup?: () => void;\n}\n\nexport const useWebPubReaderInit = ({\n container,\n publication,\n initialPosition,\n listeners,\n preferences,\n cache,\n isFontFamilyUsed,\n fontLanguage,\n hasDisplayTransformability,\n getFontMetadata,\n injectFontResources,\n removeFontResources,\n getFontInjectables,\n contentProtectionConfig,\n keyboardPeripherals,\n onNavigatorReady,\n onNavigatorLoaded,\n onCleanup,\n}: UseWebPubReaderInitProps) => {\n const [navigatorReady, setNavigatorReady] = useState(false);\n\n const { webPubPreferences } = useWebPubPreferencesConfig({\n settings: cache.current.settings,\n fontLanguage,\n hasDisplayTransformability,\n getFontMetadata,\n });\n\n const { injectables } = useWebPubInjectablesConfig({\n isFontFamilyUsed,\n fontLanguage,\n getFontInjectables,\n });\n\n const handleCleanup = useCallback(() => {\n removeFontResources();\n onCleanup?.();\n }, [removeFontResources, onCleanup]);\n\n const { WebPubNavigatorLoad, WebPubNavigatorDestroy } = useWebPubNavigator();\n const isNavigatorLoadedWebPub = useRef(false);\n \n useEffect(() => {\n // Only initialize once, never re-render\n if (!publication || isNavigatorLoadedWebPub.current) return;\n\n // Add container protection\n if (!container.current) {\n console.error(\"Container ref is not available for navigator initialization\");\n return;\n }\n\n const config: WebPubNavigatorLoadProps = {\n container: container.current,\n publication,\n listeners,\n initialPosition: initialPosition ? new Locator(initialPosition) : undefined,\n preferences: webPubPreferences,\n defaults: {\n experiments: preferences.experiments?.webPub || null\n },\n injectables,\n contentProtection: contentProtectionConfig,\n keyboardPeripherals,\n };\n\n isNavigatorLoadedWebPub.current = true;\n \n // Call onNavigatorReady outside of navigator load\n onNavigatorReady?.();\n \n // Pass onNavigatorLoaded as the callback to WebPubNavigatorLoad\n WebPubNavigatorLoad(config, () => {\n // Set navigatorReady to true only after navigator actually loads\n setNavigatorReady(true);\n onNavigatorLoaded?.();\n });\n\n return () => {\n if (isNavigatorLoadedWebPub.current) {\n setNavigatorReady(false);\n WebPubNavigatorDestroy(() => {\n isNavigatorLoadedWebPub.current = false;\n handleCleanup();\n });\n }\n };\n }, []);\n\n // Handle font resource injection\n useEffect(() => {\n if (isFontFamilyUsed) {\n const fontResources = getFontInjectables({ language: fontLanguage });\n if (fontResources) {\n injectFontResources(getFontInjectables(undefined, true));\n }\n }\n }, [isFontFamilyUsed, fontLanguage, getFontInjectables, injectFontResources]);\n\n return {\n navigatorReady,\n };\n};\n","import { useMemo } from \"react\";\n\nimport { IKeyboardPeripheralsConfig } from \"@readium/navigator\";\nimport { ThActionsKeys } from \"@/preferences/models\";\n\nimport { useActionsPreferences } from \"@/preferences/hooks/useActionsPreferences\";\nimport { useFullscreen } from \"@/core/Hooks/useFullscreen\";\nimport { useFilteredPreferenceKeys } from \"@/preferences/hooks/useFilteredPreferenceKeys\";\nimport { useActionComponentStatus } from \"../../Actions/hooks/useActionComponentStatus\";\n\nimport { NavPeripheralType, toActionPeripheralType, toDockingPeripheralType, ZOOM_IN_KEY_COMBOS, ZOOM_OUT_KEY_COMBOS } from \"@/helpers/peripherals\";\n\nexport const useWebPubKeyboardPeripherals = (): IKeyboardPeripheralsConfig => {\n const { actionsKeys, docking } = useActionsPreferences();\n const { isSupported: isFullscreenSupported } = useFullscreen();\n const { webPubActionKeys } = useFilteredPreferenceKeys();\n\n const { isComponentAvailable: isFullscreenAvailable } = useActionComponentStatus({ actionKey: ThActionsKeys.fullscreen, orderArray: webPubActionKeys, additionalCondition: isFullscreenSupported });\n const { isComponentAvailable: isTocAvailable } = useActionComponentStatus({ actionKey: ThActionsKeys.toc, orderArray: webPubActionKeys });\n const { isComponentAvailable: isSettingsAvailable } = useActionComponentStatus({ actionKey: ThActionsKeys.settings, orderArray: webPubActionKeys });\n const { isComponentAvailable: isJumpToPositionAvailable } = useActionComponentStatus({ actionKey: ThActionsKeys.jumpToPosition, orderArray: webPubActionKeys });\n\n return useMemo(() => {\n const actionAvailability: Record<string, boolean> = {\n [ThActionsKeys.fullscreen]: isFullscreenAvailable,\n [ThActionsKeys.toc]: isTocAvailable,\n [ThActionsKeys.settings]: isSettingsAvailable,\n [ThActionsKeys.jumpToPosition]: isJumpToPositionAvailable,\n };\n\n const config: IKeyboardPeripheralsConfig = [\n { type: NavPeripheralType.zoomIn, keyCombos: [...ZOOM_IN_KEY_COMBOS] },\n { type: NavPeripheralType.zoomOut, keyCombos: [...ZOOM_OUT_KEY_COMBOS] },\n ];\n\n for (const [key, tokens] of Object.entries(actionsKeys)) {\n const shortcut = tokens?.shortcut;\n const isAvailable = actionAvailability[key] ?? true;\n if (shortcut && isAvailable) config.push({ type: toActionPeripheralType(key), keyCombos: shortcut.keyCombos });\n }\n\n for (const [key, tokens] of Object.entries(docking.keys)) {\n if (tokens?.shortcut) config.push({ type: toDockingPeripheralType(key), keyCombos: tokens.shortcut.keyCombos });\n }\n\n return config;\n }, [actionsKeys, docking.keys, isFullscreenAvailable, isTocAvailable, isSettingsAvailable, isJumpToPositionAvailable]);\n};\n","\"use client\";\n\nimport { useState, useRef, useCallback, useMemo, useLayoutEffect } from \"react\";\n\nimport readerStyles from \"../assets/styles/thorium-web.reader.app.module.css\";\n\nimport { StatefulReaderProps } from \"../Reader/StatefulReaderWrapper\";\n\nimport {\n ThLayoutUI,\n ThDocumentTitleFormat,\n ThProgressionFormat,\n ThSpacingSettingsKeys,\n ThSettingsKeys,\n ThDockingKeys,\n ThActionsKeys\n} from \"@/preferences/models\";\n\nimport { ThPluginRegistry } from \"../Plugins/PluginRegistry\";\n\nimport { ThPluginProvider } from \"../Plugins/PluginProvider\";\nimport { NavigatorProvider } from \"@/core/Navigator\";\n\nimport {\n BasicTextSelection,\n ContextMenuEvent,\n FrameClickEvent,\n SuspiciousActivityEvent,\n} from \"@readium/navigator-html-injectables\";\nimport { WebPubNavigatorListeners } from \"@readium/navigator\";\nimport {\n Locator,\n Publication\n} from \"@readium/shared\";\n\nimport { StatefulDockingWrapper } from \"../Docking/StatefulDockingWrapper\";\nimport { StatefulReaderHeader } from \"../StatefulReaderHeader\";\nimport { StatefulReaderFooter } from \"../StatefulReaderFooter\";\nimport { PositionStorage } from \"../Reader/StatefulReaderWrapper\";\n\nimport { usePreferences } from \"@/preferences/hooks/usePreferences\";\nimport { useSettingsComponentStatus } from \"@/components/Settings/hooks/useSettingsComponentStatus\";\nimport { useWebPubNavigator } from \"@/core/Hooks/WebPub\";\nimport { useWebPubSettingsCache } from \"@/core/Hooks/WebPub/useWebPubSettingsCache\";\nimport { useWebPubReaderInit } from \"./Hooks/useReaderInit\";\nimport { useWebPubKeyboardPeripherals } from \"./Hooks/useWebPubKeyboardPeripherals\";\nimport { useFullscreen } from \"@/core/Hooks/useFullscreen\";\nimport { useI18n } from \"@/i18n/useI18n\";\nimport { useTimeline } from \"@/core/Hooks/useTimeline\";\nimport { usePositionStorage } from \"@/hooks/usePositionStorage\";\nimport { useDocumentTitle } from \"@/core/Hooks/useDocumentTitle\";\nimport { useSpacingPresets } from \"../Settings/Spacing/hooks/useSpacingPresets\";\nimport { useFonts } from \"@/core/Hooks/fonts/useFonts\";\nimport { useZoomCallbacks } from \"@/components/Settings/hooks/useZoomCallbacks\";\nimport { useFocusedDockableKey } from \"../Docking/hooks/useFocusedDockableKey\";\n\nimport { useAppSelector, useAppDispatch } from \"@/lib/hooks\";\nimport { \n setLoading,\n setHovering, \n toggleImmersive, \n setFullscreen,\n} from \"@/lib/readerReducer\";\nimport { \n setTimeline,\n setPublicationStart,\n setPublicationEnd\n} from \"@/lib/publicationReducer\";\nimport { toggleActionOpen, dockAction } from \"@/lib/actionsReducer\";\n\nimport classNames from \"classnames\";\nimport { createDefaultPlugin } from \"../Plugins/helpers/createDefaultPlugin\";\nimport { getReaderClassNames } from \"../Helpers/getReaderClassNames\";\nimport { resolveContentProtectionConfig } from \"@/preferences/models/protection\";\nimport { NavPeripheralType, fromActionPeripheralType, fromDockingPeripheralType } from \"@/helpers/peripherals\";\n\nexport const ExperimentalWebPubStatefulReader = ({\n publication,\n localDataKey,\n plugins,\n positionStorage,\n containerRefSetter\n}: StatefulReaderProps) => {\n const [pluginsRegistered, setPluginsRegistered] = useState(false);\n\n useLayoutEffect(() => {\n if (plugins && plugins.length > 0) {\n plugins.forEach(plugin => {\n ThPluginRegistry.register(plugin);\n });\n } else {\n ThPluginRegistry.register(createDefaultPlugin());\n }\n setPluginsRegistered(true);\n }, [plugins]);\n\n if (!pluginsRegistered) {\n return null;\n }\n\n return (\n <>\n <ThPluginProvider>\n <StatefulReaderInner publication={ publication } localDataKey={ localDataKey } positionStorage={ positionStorage } containerRefSetter={ containerRefSetter } />\n </ThPluginProvider>\n </>\n );\n};\n\nconst StatefulReaderInner = ({ publication, localDataKey, positionStorage, containerRefSetter }: { publication: Publication; localDataKey: string | null; positionStorage?: PositionStorage; containerRefSetter?: (el: Element | null) => void }) => {\n const { preferences, getFontMetadata, getFontInjectables } = usePreferences();\n const { t } = useI18n();\n const { getEffectiveSpacingValue } = useSpacingPresets();\n const { injectFontResources, removeFontResources } = useFonts();\n\n // Check if font family component is being used\n const { isComponentUsed: isFontFamilyUsed } = useSettingsComponentStatus({\n settingsKey: ThSettingsKeys.fontFamily,\n publicationType: \"webpub\",\n });\n\n const container = useRef<HTMLDivElement>(null);\n\n const textAlign = useAppSelector(state => state.webPubSettings.textAlign);\n const fontFamily = useAppSelector(state => state.webPubSettings.fontFamily);\n const fontWeight = useAppSelector(state => state.webPubSettings.fontWeight);\n const hyphens = useAppSelector(state => state.webPubSettings.hyphens);\n const ligatures = useAppSelector(state => state.webPubSettings.ligatures);\n const noRuby = useAppSelector(state => state.webPubSettings.noRuby);\n const letterSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.letterSpacing);\n const lineHeight = getEffectiveSpacingValue(ThSpacingSettingsKeys.lineHeight);\n const paragraphIndent = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphIndent);\n const paragraphSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.paragraphSpacing);\n const publisherStyles = useAppSelector(state => state.webPubSettings.publisherStyles);\n const textNormalization = useAppSelector(state => state.webPubSettings.textNormalization);\n const wordSpacing = getEffectiveSpacingValue(ThSpacingSettingsKeys.wordSpacing);\n const zoom = useAppSelector(state => state.webPubSettings.zoom);\n const fontLanguage = useAppSelector(state => state.publication.fontLanguage);\n const hasDisplayTransformability = useAppSelector(state => state.publication.hasDisplayTransformability);\n const isImmersive = useAppSelector(state => state.reader.isImmersive);\n const isHovering = useAppSelector(state => state.reader.isHovering);\n const breakpoint = useAppSelector(state => state.theming.breakpoint);\n const containerBreakpoint = useAppSelector(state => state.theming.containerBreakpoint);\n\n const cache = useWebPubSettingsCache(\n fontFamily,\n fontWeight,\n hyphens,\n letterSpacing,\n ligatures,\n lineHeight,\n noRuby,\n paragraphIndent,\n paragraphSpacing,\n publisherStyles,\n textAlign,\n textNormalization,\n wordSpacing,\n zoom\n );\n\n const layoutUI = preferences.theming.layout.ui?.webPub || ThLayoutUI.stacked;\n\n const dispatch = useAppDispatch();\n const getFocusedDockableKey = useFocusedDockableKey();\n const profile = useAppSelector(state => state.reader.profile);\n const keyboardPeripherals = useWebPubKeyboardPeripherals();\n\n const onFsChange = useCallback((isFullscreen: boolean) => {\n dispatch(setFullscreen(isFullscreen));\n }, [dispatch]);\n \n const { handleFullscreen } = useFullscreen(onFsChange);\n\n const webPubNavigator = useWebPubNavigator();\n const { \n currentPositions,\n canGoBackward,\n canGoForward,\n } = webPubNavigator;\n\n const { setLocalData, getLocalData, localData } = usePositionStorage(localDataKey, positionStorage);\n\n const timeline = useTimeline({\n publication: publication,\n currentLocation: localData,\n currentPositions: currentPositions() || [],\n positionsList: undefined,\n onChange: (timeline) => {\n dispatch(setTimeline(timeline));\n }\n });\n\n const documentTitleFormat = preferences.metadata?.documentTitle?.format;\n\n let documentTitle: string | undefined;\n\n if (documentTitleFormat) {\n if (typeof documentTitleFormat === \"object\" && \"key\" in documentTitleFormat) {\n const translatedTitle = t(documentTitleFormat.key);\n documentTitle = translatedTitle !== documentTitleFormat.key \n ? translatedTitle \n : documentTitleFormat.fallback;\n } else {\n switch (documentTitleFormat) {\n case ThDocumentTitleFormat.title:\n documentTitle = timeline?.title;\n break;\n case ThDocumentTitleFormat.chapter:\n documentTitle = timeline?.progression?.currentChapter;\n break;\n case ThDocumentTitleFormat.titleAndChapter:\n if (timeline?.title && timeline?.progression?.currentChapter) {\n documentTitle = `${ timeline.title } – ${ timeline.progression.currentChapter }`;\n }\n break;\n case ThDocumentTitleFormat.none:\n documentTitle = undefined;\n break;\n default: \n documentTitle = documentTitleFormat;\n break;\n }\n }\n }\n\n useDocumentTitle(documentTitle);\n\n const toggleIsImmersive = useCallback(() => {\n // If tap/click in iframe, then header/footer no longer hoovering\n dispatch(setHovering(false));\n dispatch(toggleImmersive());\n }, [dispatch]);\n\n const { zoomIn, zoomOut } = useZoomCallbacks(webPubNavigator);\n\n const listeners: WebPubNavigatorListeners = useMemo(() => ({\n frameLoaded: async function (_wnd: Window): Promise<void> {},\n positionChanged: async function (locator: Locator): Promise<void> {\n setLocalData(locator);\n\n if (canGoBackward()) {\n dispatch(setPublicationStart(false));\n } else {\n dispatch(setPublicationStart(true));\n }\n\n if (canGoForward()) {\n dispatch(setPublicationEnd(false));\n } else {\n dispatch(setPublicationEnd(true));\n }\n },\n tap: function (_e: FrameClickEvent): boolean {\n toggleIsImmersive();\n return true;\n },\n click: function (_e: FrameClickEvent): boolean {\n return false;\n },\n zoom: function (_scale: number): void { },\n scroll: function (_delta: number): void { },\n customEvent: function (_key: string, _data: unknown): void { },\n handleLocator: function (locator: Locator): boolean {\n const href = locator.href;\n\n if (\n href.startsWith(\"http://\") ||\n href.startsWith(\"https://\") ||\n href.startsWith(\"mailto:\") ||\n href.startsWith(\"tel:\")\n ) {\n if (confirm(`Open \"${href}\" ?`)) window.open(href, \"_blank\");\n } else {\n console.warn(\"Unhandled locator\", locator);\n }\n return false;\n },\n textSelected: function (_selection: BasicTextSelection): void {},\n contentProtection: function (_type: string, _data: SuspiciousActivityEvent): void {},\n contextMenu: function (_data: ContextMenuEvent): void {},\n peripheral: function (data): void {\n switch (data.type) {\n case NavPeripheralType.zoomIn: zoomIn(); break;\n case NavPeripheralType.zoomOut: zoomOut(); break;\n default: {\n const actionKey = fromActionPeripheralType(data.type);\n\n if (actionKey === ThActionsKeys.fullscreen) {\n handleFullscreen();\n return;\n }\n\n if (actionKey && profile) {\n dispatch(toggleActionOpen({ key: actionKey, profile }));\n return;\n }\n\n const dockingKey = fromDockingPeripheralType(data.type);\n\n if (dockingKey && profile) {\n const actionKey = getFocusedDockableKey(dockingKey as ThDockingKeys);\n if (actionKey) {\n dispatch(dockAction({ key: actionKey, dockingKey: dockingKey as ThDockingKeys, profile }));\n }\n }\n }\n }\n },\n }), [setLocalData, canGoBackward, canGoForward, dispatch, toggleIsImmersive, zoomIn, zoomOut, profile, handleFullscreen, getFocusedDockableKey]);\n\n const initialPosition = useMemo(() => getLocalData(), [getLocalData]);\n\n // Initialize reader using the new composite hook\n useWebPubReaderInit({\n container,\n publication,\n initialPosition,\n listeners,\n preferences,\n cache,\n isFontFamilyUsed,\n fontLanguage,\n hasDisplayTransformability,\n getFontMetadata,\n injectFontResources,\n removeFontResources,\n getFontInjectables,\n contentProtectionConfig: resolveContentProtectionConfig(preferences.contentProtection, t),\n keyboardPeripherals,\n onNavigatorReady: () => {\n dispatch(setLoading(false));\n },\n });\n\n return (\n <>\n <NavigatorProvider visualNavigator={ webPubNavigator }>\n <main className={ readerStyles.main }>\n <StatefulDockingWrapper>\n <div\n ref={ containerRefSetter }\n className={\n classNames(\n getReaderClassNames({\n isScroll: true,\n isImmersive,\n isHovering,\n layoutUI,\n breakpoint,\n containerBreakpoint\n })\n )\n }\n >\n <StatefulReaderHeader \n actionKeys={ preferences.actions.webPubOrder }\n actionsOrder={ preferences.actions.webPubOrder }\n layout={ layoutUI } \n runningHeadFormatPref={ preferences.theming.header?.runningHead?.format?.webPub }\n />\n\n <article className={ readerStyles.wrapper } aria-label={ t(\"reader.app.publicationWrapper\") }>\n <div id=\"thorium-web-container\" className={ readerStyles.iframeContainer } ref={ container }></div>\n </article>\n\n <StatefulReaderFooter \n layout={ layoutUI } \n progressionFormatPref={ preferences.theming.progression?.format?.webPub }\n progressionFormatFallback={ ThProgressionFormat.readingOrderIndex }\n />\n </div>\n </StatefulDockingWrapper>\n </main>\n </NavigatorProvider>\n </>\n)};"]}
@@ -0,0 +1,37 @@
1
+ // src/core/Helpers/getPlatform.ts
2
+ var getPlatform = () => {
3
+ if (typeof window !== "undefined") {
4
+ const nav = window.navigator;
5
+ if (nav.userAgentData) {
6
+ return nav.userAgentData.platform.toLowerCase();
7
+ }
8
+ if (typeof nav.platform !== "undefined") {
9
+ if (typeof nav.userAgent !== "undefined" && /android/.test(nav.userAgent.toLowerCase())) {
10
+ return "android";
11
+ }
12
+ return nav.platform.toLowerCase();
13
+ }
14
+ }
15
+ return "unknown";
16
+ };
17
+ var isMacish = () => {
18
+ const MacOSPattern = /mac|ipod|iphone|ipad/i;
19
+ const platform = getPlatform();
20
+ return MacOSPattern.test(platform);
21
+ };
22
+ var isIpadOS = () => {
23
+ return !!(navigator.maxTouchPoints && navigator.maxTouchPoints > 2 && navigator.userAgent.includes("Intel"));
24
+ };
25
+ var isIOSish = () => {
26
+ const AppleMobilePattern = /ipod|iphone|ipad/i;
27
+ const platform = getPlatform();
28
+ if (AppleMobilePattern.test(platform)) {
29
+ return true;
30
+ } else {
31
+ return isIpadOS();
32
+ }
33
+ };
34
+
35
+ export { getPlatform, isIOSish, isIpadOS, isMacish };
36
+ //# sourceMappingURL=chunk-KQ3KS5O5.mjs.map
37
+ //# sourceMappingURL=chunk-KQ3KS5O5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/Helpers/getPlatform.ts"],"names":[],"mappings":";AAcO,IAAM,cAAc,MAAM;AAC/B,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,MAAM,MAAA,CAAO,SAAA;AAEnB,IAAA,IAAI,IAAI,aAAA,EAAe;AACrB,MAAA,OAAO,GAAA,CAAI,aAAA,CAAc,QAAA,CAAS,WAAA,EAAY;AAAA,IAChD;AAGA,IAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,WAAA,EAAa;AAEvC,MAAA,IAAI,OAAO,GAAA,CAAI,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,KAAK,GAAA,CAAI,SAAA,CAAU,WAAA,EAAa,CAAA,EAAG;AACvF,QAAA,OAAO,SAAA;AAAA,MACT;AACA,MAAA,OAAO,GAAA,CAAI,SAAS,WAAA,EAAY;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAEO,IAAM,WAAW,MAAM;AAC5B,EAAA,MAAM,YAAA,GAAe,uBAAA;AACrB,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,OAAO,YAAA,CAAa,KAAK,QAAQ,CAAA;AACnC;AAGO,IAAM,WAAW,MAAM;AAC5B,EAAA,OAAO,CAAC,EAAE,SAAA,CAAU,cAAA,IACX,SAAA,CAAU,iBAAiB,CAAA,IAC3B,SAAA,CAAU,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,CAAA;AAC/C;AAGO,IAAM,WAAW,MAAM;AAC5B,EAAA,MAAM,kBAAA,GAAqB,mBAAA;AAC3B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACrC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,OAAO,QAAA,EAAS;AAAA,EAClB;AACF","file":"chunk-KQ3KS5O5.mjs","sourcesContent":["\"use client\";\n\n// Extend Navigator interface to include userAgentData\ndeclare global {\n interface Navigator {\n userAgentData?: {\n brands: Array<{brand: string; version: string}>;\n mobile: boolean;\n platform: string;\n };\n }\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData\nexport const getPlatform = () => {\n if (typeof window !== \"undefined\") {\n const nav = window.navigator;\n\n if (nav.userAgentData) {\n return nav.userAgentData.platform.toLowerCase();\n }\n\n // Deprecated but userAgentData still experimental…\n if (typeof nav.platform !== \"undefined\") {\n // android navigator.platform is often set as \"linux\", so we have to check userAgent\n if (typeof nav.userAgent !== \"undefined\" && /android/.test(nav.userAgent.toLowerCase())) {\n return \"android\";\n }\n return nav.platform.toLowerCase();\n }\n }\n\n return \"unknown\";\n};\n\nexport const isMacish = () => {\n const MacOSPattern = /mac|ipod|iphone|ipad/i;\n const platform = getPlatform();\n return MacOSPattern.test(platform);\n}\n\n// “Desktop-class” iPadOS\nexport const isIpadOS = () => {\n return !!(navigator.maxTouchPoints \n && navigator.maxTouchPoints > 2 \n && navigator.userAgent.includes(\"Intel\"));\n}\n\n// Covers all iOS/iPadOS: iPhone/iPod/iPad by platform string + desktop-class iPadOS by UA sniff\nexport const isIOSish = () => {\n const AppleMobilePattern = /ipod|iphone|ipad/i;\n const platform = getPlatform();\n if (AppleMobilePattern.test(platform)) {\n return true;\n } else {\n return isIpadOS();\n }\n}"]}
@@ -1,5 +1,5 @@
1
- import { useGlobalPreferences } from './chunk-AE6P4KJB.mjs';
2
1
  import { i18n, initI18n } from './chunk-2NCN2AG2.mjs';
2
+ import { useGlobalPreferences } from './chunk-AE6P4KJB.mjs';
3
3
  import { I18nextProvider } from 'react-i18next';
4
4
  export { Trans } from 'react-i18next';
5
5
  import { useState, useEffect } from 'react';
@@ -36,5 +36,5 @@ var ThI18nProvider = ({
36
36
  };
37
37
 
38
38
  export { ThI18nProvider };
39
- //# sourceMappingURL=chunk-DQDOOTCE.mjs.map
40
- //# sourceMappingURL=chunk-DQDOOTCE.mjs.map
39
+ //# sourceMappingURL=chunk-KT2QY5QU.mjs.map
40
+ //# sourceMappingURL=chunk-KT2QY5QU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/ThI18nProvider.tsx"],"names":[],"mappings":";;;;;;;AAYO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA2B;AACzB,EAAA,MAAM,EAAE,WAAA,EAAa,EAAE,MAAA,EAAO,KAAM,oBAAA,EAAqB;AACzD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAAS,KAAK,aAAa,CAAA;AAErE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,QAAA,CAAS;AAAA,QACP,GAAG,OAAA;AAAA,QACH,GAAA,EAAK,UAAU,OAAA,CAAQ;AAAA,OACxB,CAAA,CAAE,IAAA,CAAK,MAAM,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,IAAA,GAAO,MAAA,IAAU,IAAA,CAAK,gBAAA,IAAoB,KAAK,QAAA,IAAY,IAAA;AACjE,IAAA,QAAA,CAAS,gBAAgB,IAAA,GAAO,IAAA;AAAA,EAClC,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAgB,QAAA,EAAU,CAAA;AACpD","file":"chunk-DQDOOTCE.mjs","sourcesContent":["\"use client\";\n\nimport React, { ReactNode, useEffect, useState } from \"react\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { i18n, initI18n } from \"./config\";\nimport { InitOptions } from \"i18next\";\nimport { useGlobalPreferences } from \"@/preferences/hooks/useGlobalPreferences\";\n\nexport type ThI18nProviderProps = {\n children: ReactNode;\n} & Partial<InitOptions>;\n\nexport const ThI18nProvider = ({\n children,\n ...options\n}: ThI18nProviderProps) => {\n const { preferences: { locale } } = useGlobalPreferences();\n const [isInitialized, setIsInitialized] = useState(i18n.isInitialized);\n \n useEffect(() => {\n if (!i18n.isInitialized) { \n initI18n({\n ...options,\n lng: locale || options.lng,\n }).then(() => setIsInitialized(true));\n }\n });\n\n useEffect(() => {\n if (isInitialized && locale) {\n i18n.changeLanguage(locale);\n }\n }, [locale, isInitialized]);\n\n useEffect(() => {\n if (!isInitialized) return;\n const lang = locale || i18n.resolvedLanguage || i18n.language || \"en\";\n document.documentElement.lang = lang;\n }, [locale, isInitialized]);\n\n if (!isInitialized) {\n return null;\n }\n\n return <I18nextProvider i18n={ i18n }>{ children }</I18nextProvider>;\n};\n\nexport default ThI18nProvider;\n"]}
1
+ {"version":3,"sources":["../src/i18n/ThI18nProvider.tsx"],"names":[],"mappings":";;;;;;;AAYO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA2B;AACzB,EAAA,MAAM,EAAE,WAAA,EAAa,EAAE,MAAA,EAAO,KAAM,oBAAA,EAAqB;AACzD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAAS,KAAK,aAAa,CAAA;AAErE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,QAAA,CAAS;AAAA,QACP,GAAG,OAAA;AAAA,QACH,GAAA,EAAK,UAAU,OAAA,CAAQ;AAAA,OACxB,CAAA,CAAE,IAAA,CAAK,MAAM,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,IAAA,GAAO,MAAA,IAAU,IAAA,CAAK,gBAAA,IAAoB,KAAK,QAAA,IAAY,IAAA;AACjE,IAAA,QAAA,CAAS,gBAAgB,IAAA,GAAO,IAAA;AAAA,EAClC,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAgB,QAAA,EAAU,CAAA;AACpD","file":"chunk-KT2QY5QU.mjs","sourcesContent":["\"use client\";\n\nimport React, { ReactNode, useEffect, useState } from \"react\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { i18n, initI18n } from \"./config\";\nimport { InitOptions } from \"i18next\";\nimport { useGlobalPreferences } from \"@/preferences/hooks/useGlobalPreferences\";\n\nexport type ThI18nProviderProps = {\n children: ReactNode;\n} & Partial<InitOptions>;\n\nexport const ThI18nProvider = ({\n children,\n ...options\n}: ThI18nProviderProps) => {\n const { preferences: { locale } } = useGlobalPreferences();\n const [isInitialized, setIsInitialized] = useState(i18n.isInitialized);\n \n useEffect(() => {\n if (!i18n.isInitialized) { \n initI18n({\n ...options,\n lng: locale || options.lng,\n }).then(() => setIsInitialized(true));\n }\n });\n\n useEffect(() => {\n if (isInitialized && locale) {\n i18n.changeLanguage(locale);\n }\n }, [locale, isInitialized]);\n\n useEffect(() => {\n if (!isInitialized) return;\n const lang = locale || i18n.resolvedLanguage || i18n.language || \"en\";\n document.documentElement.lang = lang;\n }, [locale, isInitialized]);\n\n if (!isInitialized) {\n return null;\n }\n\n return <I18nextProvider i18n={ i18n }>{ children }</I18nextProvider>;\n};\n\nexport default ThI18nProvider;\n"]}
@@ -1,12 +1,12 @@
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';
1
+ import { useReaderHeaderBase, thorium_web_reader_app_default, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default, useIsScroll, useNavigator, useEffectiveRange } from './chunk-THOJRBVD.mjs';
2
+ import { makeBreakpointsMap, getBestMatchingProgressionFormat } from './chunk-VYSDLACR.mjs';
3
+ import { useI18n } from './chunk-2NCN2AG2.mjs';
4
+ import { setHovering, setWebPubZoom, setFontSize } from './chunk-YE5QOQUT.mjs';
5
+ import { usePreferences } from './chunk-3VB756GR.mjs';
5
6
  import { ThRunningHeadFormat, ThProgressionFormat } from './chunk-2YRT7RNW.mjs';
6
7
  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';
8
+ import { getPlatform } from './chunk-KQ3KS5O5.mjs';
9
+ import { ThInteractiveOverlay, ThHeader, ThFooter, ThRunningHead, ThPagination } from './chunk-AXX4U2FW.mjs';
10
10
  import { useRef, useCallback, useEffect, useMemo } from 'react';
11
11
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
12
12
  import classNames from 'classnames';
@@ -697,115 +697,43 @@ var useFonts = (fontResources) => {
697
697
  getAndroidFXLPatch
698
698
  };
699
699
  };
700
-
701
- // src/helpers/peripherals.ts
702
- var Peripherals = class {
703
- observers = ["keydown"];
704
- targets = [];
705
- callbacks;
706
- store;
707
- actionsPref;
708
- shortcuts;
709
- constructor(store, actionsPref, callbacks) {
710
- this.observers.forEach((method) => {
711
- this["on" + method] = this["on" + method].bind(this);
712
- });
713
- this.store = store;
714
- this.actionsPref = actionsPref;
715
- this.callbacks = callbacks;
716
- this.shortcuts = this.retrieveShortcuts();
717
- }
718
- getPlatformModifier() {
719
- return this.store.getState().reader.platformModifier.modifier;
720
- }
721
- retrieveShortcuts() {
722
- if (!this.actionsPref) return {};
723
- const shortcutsObj = {};
724
- const displayOrder = this.store.getState().publication.isFXL ? this.actionsPref.fxlOrder : this.actionsPref.reflowOrder;
725
- for (const actionKey of displayOrder) {
726
- const shortcutString = this.actionsPref.keys[actionKey].shortcut;
727
- if (shortcutString) {
728
- const shortcutObj = buildShortcut(shortcutString);
729
- if (shortcutObj?.key) {
730
- Object.defineProperty(shortcutsObj, shortcutObj.key, {
731
- value: {
732
- actionKey,
733
- modifiers: shortcutObj.modifiers
734
- },
735
- writable: false,
736
- enumerable: true
737
- });
738
- }
739
- }
700
+ var useZoomCallbacks = (navigator) => {
701
+ const { preferences } = usePreferences();
702
+ const readerProfile = useAppSelector((state) => state.reader.profile);
703
+ const isFXL = useAppSelector((state) => state.publication.isFXL);
704
+ const dispatch = useAppDispatch();
705
+ const isWebPub = readerProfile === "webPub";
706
+ const getSetting = navigator.getSetting;
707
+ const submitPreferences = navigator.submitPreferences;
708
+ const { preferencesEditor } = navigator;
709
+ const supportedRange = isWebPub ? preferencesEditor?.zoom?.supportedRange : isFXL ? preferencesEditor?.zoom?.supportedRange : preferencesEditor?.fontSize?.supportedRange;
710
+ const zoomConfig = preferences.settings.keys["zoom" /* zoom */];
711
+ const { range } = useEffectiveRange(zoomConfig.range, supportedRange);
712
+ const [min, max] = range;
713
+ const step = zoomConfig.step ?? 0.05;
714
+ const zoomIn = useCallback(async () => {
715
+ if (isWebPub) {
716
+ const next = Math.min(max, (getSetting("zoom") ?? 1) + step);
717
+ await submitPreferences({ zoom: next });
718
+ dispatch(setWebPubZoom(getSetting("zoom")));
719
+ } else {
720
+ const next = Math.min(max, (getSetting("fontSize") ?? 1) + step);
721
+ await submitPreferences({ fontSize: next });
722
+ dispatch(setFontSize(getSetting("fontSize")));
740
723
  }
741
- return shortcutsObj;
742
- }
743
- destroy() {
744
- this.targets.forEach((t) => this.unobserve(t));
745
- }
746
- unobserve(item) {
747
- if (!item) return;
748
- this.observers.forEach((EventName) => {
749
- item.removeEventListener(
750
- EventName,
751
- this["on" + EventName],
752
- false
753
- );
754
- });
755
- this.targets = this.targets.filter((t) => t !== item);
756
- }
757
- observe(item) {
758
- if (!item) return;
759
- if (this.targets.includes(item)) return;
760
- this.observers.forEach((EventName) => {
761
- item.addEventListener(EventName, this["on" + EventName], false);
762
- });
763
- this.targets.push(item);
764
- }
765
- onkeydown(e) {
766
- const focusIsSafe = !isInteractiveElement(document.activeElement);
767
- switch (e.code) {
768
- case "Space":
769
- focusIsSafe && this.callbacks.goProgression(e.shiftKey);
770
- break;
771
- case "ArrowRight":
772
- focusIsSafe && this.callbacks.moveTo("right");
773
- break;
774
- case "ArrowLeft":
775
- focusIsSafe && this.callbacks.moveTo("left");
776
- break;
777
- case "ArrowUp":
778
- case "PageUp":
779
- focusIsSafe && this.callbacks.moveTo("up");
780
- break;
781
- case "ArrowDown":
782
- case "PageDown":
783
- focusIsSafe && this.callbacks.moveTo("down");
784
- break;
785
- case "Home":
786
- focusIsSafe && this.callbacks.moveTo("home");
787
- break;
788
- case "End":
789
- focusIsSafe && this.callbacks.moveTo("end");
790
- break;
791
- default:
792
- if (this.shortcuts.hasOwnProperty(e.code)) {
793
- const customShortcutObj = this.shortcuts[e.code];
794
- const sendCallback = Object.entries(customShortcutObj.modifiers).every(([modifier, value]) => {
795
- if (modifier === "platformKey") {
796
- return e[this.getPlatformModifier()] === value;
797
- } else {
798
- return e[modifier] === value;
799
- }
800
- });
801
- if (sendCallback) {
802
- e.preventDefault();
803
- this.callbacks.toggleAction(customShortcutObj.actionKey);
804
- }
805
- }
806
- break;
724
+ }, [isWebPub, getSetting, max, step, submitPreferences, dispatch]);
725
+ const zoomOut = useCallback(async () => {
726
+ if (isWebPub) {
727
+ const next = Math.max(min, (getSetting("zoom") ?? 1) - step);
728
+ await submitPreferences({ zoom: next });
729
+ dispatch(setWebPubZoom(getSetting("zoom")));
730
+ } else {
731
+ const next = Math.max(min, (getSetting("fontSize") ?? 1) - step);
732
+ await submitPreferences({ fontSize: next });
733
+ dispatch(setFontSize(getSetting("fontSize")));
807
734
  }
808
- }
735
+ }, [isWebPub, getSetting, min, step, submitPreferences, dispatch]);
736
+ return { zoomIn, zoomOut };
809
737
  };
810
738
  var LAYOUT_CLASSES = {
811
739
  ["stacked-ui" /* stacked */]: "thorium_web_stackedUI",
@@ -834,6 +762,6 @@ function getReaderClassNames(options) {
834
762
  );
835
763
  }
836
764
 
837
- export { Peripherals, StatefulReaderFooter, StatefulReaderHeader, getReaderClassNames, useFonts };
838
- //# sourceMappingURL=chunk-KGSFTRCH.mjs.map
839
- //# sourceMappingURL=chunk-KGSFTRCH.mjs.map
765
+ export { StatefulReaderFooter, StatefulReaderHeader, getReaderClassNames, useFonts, useZoomCallbacks };
766
+ //# sourceMappingURL=chunk-KXOIN35D.mjs.map
767
+ //# sourceMappingURL=chunk-KXOIN35D.mjs.map