@edrlab/thorium-web 1.3.1 → 1.4.0

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 (109) hide show
  1. package/dist/{ThPreferencesAdapter-D0rzsGRl.d.mts → ThPreferencesAdapter-L1H6gzmu.d.mts} +23 -6
  2. package/dist/{ThSettingsWrapper-BXuRgdqp.d.mts → ThSettingsWrapper-DWEA4hYF.d.mts} +1 -1
  3. package/dist/{actions-BLAr0oaM.d.mts → actions-BjeRjaJU.d.mts} +1 -1
  4. package/dist/{actionsReducer-XWTGGNUd.d.mts → actionsReducer-B32cq2mB.d.mts} +1 -1
  5. package/dist/{chunk-L4XGZAZ5.mjs → chunk-2YRT7RNW.mjs} +20 -3
  6. package/dist/chunk-2YRT7RNW.mjs.map +1 -0
  7. package/dist/{chunk-6BUN7DEA.mjs → chunk-6MONB2DN.mjs} +63 -56
  8. package/dist/chunk-6MONB2DN.mjs.map +1 -0
  9. package/dist/chunk-A575ZW4A.mjs +10 -0
  10. package/dist/chunk-A575ZW4A.mjs.map +1 -0
  11. package/dist/chunk-AE6P4KJB.mjs +13 -0
  12. package/dist/chunk-AE6P4KJB.mjs.map +1 -0
  13. package/dist/{chunk-2ORXUOH3.mjs → chunk-IVXRCKWR.mjs} +4 -4
  14. package/dist/{chunk-2ORXUOH3.mjs.map → chunk-IVXRCKWR.mjs.map} +1 -1
  15. package/dist/{chunk-I4BKU5NN.mjs → chunk-KVUG6BNI.mjs} +90 -26
  16. package/dist/chunk-KVUG6BNI.mjs.map +1 -0
  17. package/dist/{chunk-6EHFW43Y.mjs → chunk-NUXGQWED.mjs} +4 -3
  18. package/dist/chunk-NUXGQWED.mjs.map +1 -0
  19. package/dist/{chunk-DETZMFZ7.mjs → chunk-P6ILEQ5P.mjs} +24 -26
  20. package/dist/chunk-P6ILEQ5P.mjs.map +1 -0
  21. package/dist/{chunk-LP3JFZ4A.mjs → chunk-PXXWEMNL.mjs} +666 -430
  22. package/dist/chunk-PXXWEMNL.mjs.map +1 -0
  23. package/dist/{chunk-SAUOY37Q.mjs → chunk-QUSGPT5M.mjs} +11 -12
  24. package/dist/chunk-QUSGPT5M.mjs.map +1 -0
  25. package/dist/{chunk-A3FZBEUL.mjs → chunk-SZAVAQ6S.mjs} +30 -6
  26. package/dist/chunk-SZAVAQ6S.mjs.map +1 -0
  27. package/dist/{chunk-NKO3K3QS.mjs → chunk-T5ENYSDJ.mjs} +5 -5
  28. package/dist/chunk-T5ENYSDJ.mjs.map +1 -0
  29. package/dist/{chunk-DMZFSOHK.mjs → chunk-TSLTLQ6O.mjs} +125 -40
  30. package/dist/chunk-TSLTLQ6O.mjs.map +1 -0
  31. package/dist/{chunk-ITDBOMY5.mjs → chunk-VENFFPK2.mjs} +3 -3
  32. package/dist/{chunk-ITDBOMY5.mjs.map → chunk-VENFFPK2.mjs.map} +1 -1
  33. package/dist/{chunk-EZG6SBSO.mjs → chunk-WLVE3WNW.mjs} +95 -25
  34. package/dist/chunk-WLVE3WNW.mjs.map +1 -0
  35. package/dist/chunk-XRFLDNAY.mjs +3913 -0
  36. package/dist/chunk-XRFLDNAY.mjs.map +1 -0
  37. package/dist/components/Audio/index.d.mts +12 -12
  38. package/dist/components/Audio/index.mjs +15 -15
  39. package/dist/components/Epub/index.css +3 -3
  40. package/dist/components/Epub/index.css.map +1 -1
  41. package/dist/components/Epub/index.d.mts +12 -12
  42. package/dist/components/Epub/index.mjs +16 -16
  43. package/dist/components/Misc/index.mjs +4 -4
  44. package/dist/components/Reader/index.css +3 -3
  45. package/dist/components/Reader/index.css.map +1 -1
  46. package/dist/components/Reader/index.d.mts +11 -11
  47. package/dist/components/Reader/index.mjs +26 -24
  48. package/dist/components/Reader/index.mjs.map +1 -1
  49. package/dist/components/WebPub/index.css +3 -3
  50. package/dist/components/WebPub/index.css.map +1 -1
  51. package/dist/components/WebPub/index.d.mts +12 -12
  52. package/dist/components/WebPub/index.mjs +16 -16
  53. package/dist/core/Components/index.d.mts +11 -21
  54. package/dist/core/Components/index.mjs +1 -1
  55. package/dist/core/Helpers/index.d.mts +1 -1
  56. package/dist/core/Helpers/index.mjs +2 -3
  57. package/dist/core/Hooks/index.d.mts +12 -8
  58. package/dist/core/Hooks/index.mjs +1 -1
  59. package/dist/i18n/index.mjs +3 -6
  60. package/dist/lib/index.d.mts +49 -20
  61. package/dist/lib/index.mjs +3 -2
  62. package/dist/locales/da/thorium-shared.json +3 -0
  63. package/dist/locales/en/thorium-shared.json +24 -2
  64. package/dist/locales/en/thorium-web.json +2 -2
  65. package/dist/locales/es/thorium-shared.json +364 -0
  66. package/dist/locales/es/thorium-web.json +130 -0
  67. package/dist/locales/et/thorium-shared.json +121 -9
  68. package/dist/locales/et/thorium-web.json +32 -1
  69. package/dist/locales/fi/thorium-shared.json +42 -4
  70. package/dist/locales/fi/thorium-web.json +36 -2
  71. package/dist/locales/fr/thorium-shared.json +108 -1
  72. package/dist/locales/fr/thorium-web.json +121 -86
  73. package/dist/locales/it/thorium-shared.json +108 -1
  74. package/dist/locales/it/thorium-web.json +15 -2
  75. package/dist/locales/lt/thorium-web.json +10 -1
  76. package/dist/locales/pl/thorium-web.json +1 -1
  77. package/dist/locales/pt-BR/thorium-shared.json +6 -0
  78. package/dist/locales/pt-BR/thorium-web.json +88 -88
  79. package/dist/locales/pt-PT/thorium-shared.json +91 -0
  80. package/dist/locales/pt-PT/thorium-web.json +15 -3
  81. package/dist/locales/sv/thorium-shared.json +108 -2
  82. package/dist/locales/sv/thorium-web.json +15 -3
  83. package/dist/locales/tr/thorium-shared.json +42 -0
  84. package/dist/preferences/index.d.mts +59 -13
  85. package/dist/preferences/index.mjs +6 -6
  86. package/dist/{settingsReducer-Bu1zeveu.d.mts → settingsReducer-DLaT2wUB.d.mts} +14 -2
  87. package/dist/{ui-nBv8gfr0.d.mts → ui-DnZZhozX.d.mts} +1 -1
  88. package/dist/{useAudioNavigator-C5aW4-eT.d.mts → useAudioNavigator-CWXyNWq1.d.mts} +3 -1
  89. package/dist/{useContrast-2t429O9O.d.mts → useContrast-Bo7cDw_X.d.mts} +5 -1
  90. package/dist/{usePreferences-VaBf46eP.d.mts → usePreferences-D8NU1yhP.d.mts} +6 -8
  91. package/dist/{useReaderTransitions-IBGdE7qi.d.mts → useReaderTransitions-BQGzKeY2.d.mts} +61 -10
  92. package/package.json +10 -9
  93. package/dist/chunk-6BUN7DEA.mjs.map +0 -1
  94. package/dist/chunk-6EHFW43Y.mjs.map +0 -1
  95. package/dist/chunk-7CGMWOZN.mjs +0 -20
  96. package/dist/chunk-7CGMWOZN.mjs.map +0 -1
  97. package/dist/chunk-A3FZBEUL.mjs.map +0 -1
  98. package/dist/chunk-DETZMFZ7.mjs.map +0 -1
  99. package/dist/chunk-DMZFSOHK.mjs.map +0 -1
  100. package/dist/chunk-DTPO3J2C.mjs +0 -1732
  101. package/dist/chunk-DTPO3J2C.mjs.map +0 -1
  102. package/dist/chunk-EZG6SBSO.mjs.map +0 -1
  103. package/dist/chunk-GPWW5OML.mjs +0 -1955
  104. package/dist/chunk-GPWW5OML.mjs.map +0 -1
  105. package/dist/chunk-I4BKU5NN.mjs.map +0 -1
  106. package/dist/chunk-L4XGZAZ5.mjs.map +0 -1
  107. package/dist/chunk-LP3JFZ4A.mjs.map +0 -1
  108. package/dist/chunk-NKO3K3QS.mjs.map +0 -1
  109. package/dist/chunk-SAUOY37Q.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { toEntryRef } from './chunk-TEZB4ULX.mjs';
2
2
  import { defaultPlatformModifier } from './chunk-5LUMM7FW.mjs';
3
3
  import { useRef } from 'react';
4
- import { useDispatch, useSelector, useStore, Provider } from 'react-redux';
4
+ import { Provider } from 'react-redux';
5
5
  import { createSlice, configureStore } from '@reduxjs/toolkit';
6
6
  import { jsx } from 'react/jsx-runtime';
7
7
 
@@ -94,8 +94,10 @@ var initialState2 = {
94
94
  fontWeight: 400,
95
95
  hyphens: null,
96
96
  letterSpacing: null,
97
+ ligatures: null,
97
98
  lineHeight: "publisher" /* publisher */,
98
99
  lineLength: null,
100
+ noRuby: null,
99
101
  paragraphIndent: null,
100
102
  paragraphSpacing: null,
101
103
  publisherStyles: true,
@@ -163,6 +165,9 @@ var settingsSlice = createSlice({
163
165
  setHyphens: (state, action) => {
164
166
  state.hyphens = action.payload;
165
167
  },
168
+ setLigatures: (state, action) => {
169
+ state.ligatures = action.payload;
170
+ },
166
171
  setLetterSpacing: (state, action) => {
167
172
  handleSpacingSetting(state, action, "letterSpacing" /* letterSpacing */);
168
173
  },
@@ -243,6 +248,9 @@ var settingsSlice = createSlice({
243
248
  setTextNormalization: (state, action) => {
244
249
  state.textNormalization = action.payload;
245
250
  },
251
+ setNoRuby: (state, action) => {
252
+ state.noRuby = action.payload;
253
+ },
246
254
  setWordSpacing: (state, action) => {
247
255
  handleSpacingSetting(state, action, "wordSpacing" /* wordSpacing */);
248
256
  }
@@ -255,6 +263,7 @@ var {
255
263
  setFontWeight,
256
264
  setFontFamily,
257
265
  setHyphens,
266
+ setLigatures,
258
267
  setLetterSpacing,
259
268
  setLineHeight,
260
269
  setLineLength,
@@ -265,6 +274,7 @@ var {
265
274
  setSpacingPreset,
266
275
  setTextAlign,
267
276
  setTextNormalization,
277
+ setNoRuby,
268
278
  setWordSpacing
269
279
  } = settingsSlice.actions;
270
280
  var settingsReducer_default = settingsSlice.reducer;
@@ -563,6 +573,7 @@ var initialState5 = {
563
573
  fontLanguage: "default",
564
574
  isFXL: false,
565
575
  isRTL: false,
576
+ scriptMode: "ltr",
566
577
  hasDisplayTransformability: false,
567
578
  positionsList: [],
568
579
  atPublicationStart: false,
@@ -583,6 +594,9 @@ var publicationSlice = createSlice({
583
594
  setRTL: (state, action) => {
584
595
  state.isRTL = action.payload;
585
596
  },
597
+ setScriptMode: (state, action) => {
598
+ state.scriptMode = action.payload;
599
+ },
586
600
  setHasDisplayTransformability: (state, action) => {
587
601
  state.hasDisplayTransformability = action.payload;
588
602
  },
@@ -633,6 +647,7 @@ var {
633
647
  setFontLanguage,
634
648
  setFXL,
635
649
  setRTL,
650
+ setScriptMode,
636
651
  setHasDisplayTransformability,
637
652
  setPositionsList,
638
653
  setPublicationStart,
@@ -677,10 +692,6 @@ var mapPaginatedAffordance = (format) => {
677
692
  };
678
693
  var mapPreferencesToState = (prefs) => {
679
694
  return {
680
- l10n: {
681
- locale: prefs.locale,
682
- direction: prefs.direction
683
- },
684
695
  progressionFormat: {
685
696
  reflow: mapRenditionFormat(
686
697
  prefs.theming?.progression?.format?.reflow
@@ -760,8 +771,6 @@ var mapStateToPreferences = (state, currentPrefs) => {
760
771
  };
761
772
  return {
762
773
  ...currentPrefs,
763
- locale: state.l10n?.locale ?? currentPrefs.locale,
764
- direction: state.l10n?.direction ?? currentPrefs.direction,
765
774
  theming: {
766
775
  ...currentPrefs.theming,
767
776
  ...state.progressionFormat && {
@@ -851,9 +860,6 @@ var preferencesSlice = createSlice({
851
860
  name: "preferences",
852
861
  initialState: initialState6,
853
862
  reducers: {
854
- setL10n: (state, action) => {
855
- state.l10n = action.payload;
856
- },
857
863
  setProgressionFormat: (state, action) => {
858
864
  const { key, value, breakpoint } = action.payload;
859
865
  state.progressionFormat = {
@@ -916,7 +922,6 @@ var preferencesSlice = createSlice({
916
922
  }
917
923
  });
918
924
  var {
919
- setL10n,
920
925
  setProgressionFormat,
921
926
  setRunningHeadFormat,
922
927
  setUI,
@@ -925,12 +930,26 @@ var {
925
930
  updateFromPreferences
926
931
  } = preferencesSlice.actions;
927
932
  var preferencesReducer_default = preferencesSlice.reducer;
928
- var initialState7 = {
933
+ var initialState7 = {};
934
+ var globalPreferencesSlice = createSlice({
935
+ name: "globalPreferences",
936
+ initialState: initialState7,
937
+ reducers: {
938
+ setLocale: (state, action) => {
939
+ state.locale = action.payload;
940
+ }
941
+ }
942
+ });
943
+ var { setLocale } = globalPreferencesSlice.actions;
944
+ var globalPreferencesReducer_default = globalPreferencesSlice.reducer;
945
+ var initialState8 = {
929
946
  fontFamily: { default: "publisher" },
930
947
  fontWeight: 400,
931
948
  hyphens: null,
932
949
  letterSpacing: null,
950
+ ligatures: null,
933
951
  lineHeight: "publisher" /* publisher */,
952
+ noRuby: null,
934
953
  paragraphIndent: null,
935
954
  paragraphSpacing: null,
936
955
  publisherStyles: true,
@@ -946,7 +965,7 @@ var initialState7 = {
946
965
  };
947
966
  var webPubSettingsSlice = createSlice({
948
967
  name: "webPubSettings",
949
- initialState: initialState7,
968
+ initialState: initialState8,
950
969
  reducers: {
951
970
  setWebPubFontFamily: (state, action) => {
952
971
  const { key, value } = action.payload;
@@ -958,6 +977,9 @@ var webPubSettingsSlice = createSlice({
958
977
  setWebPubHyphens: (state, action) => {
959
978
  state.hyphens = action.payload;
960
979
  },
980
+ setWebPubLigatures: (state, action) => {
981
+ state.ligatures = action.payload;
982
+ },
961
983
  setWebPubLetterSpacing: (state, action) => {
962
984
  handleSpacingSetting(state, action, "letterSpacing" /* letterSpacing */);
963
985
  },
@@ -998,6 +1020,9 @@ var webPubSettingsSlice = createSlice({
998
1020
  setWebPubTextNormalization: (state, action) => {
999
1021
  state.textNormalization = action.payload;
1000
1022
  },
1023
+ setWebPubNoRuby: (state, action) => {
1024
+ state.noRuby = action.payload;
1025
+ },
1001
1026
  setWebPubWordSpacing: (state, action) => {
1002
1027
  handleSpacingSetting(state, action, "wordSpacing" /* wordSpacing */);
1003
1028
  },
@@ -1006,11 +1031,12 @@ var webPubSettingsSlice = createSlice({
1006
1031
  }
1007
1032
  }
1008
1033
  });
1009
- var initialWebPubSettingsState = initialState7;
1034
+ var initialWebPubSettingsState = initialState8;
1010
1035
  var {
1011
1036
  setWebPubFontFamily,
1012
1037
  setWebPubFontWeight,
1013
1038
  setWebPubHyphens,
1039
+ setWebPubLigatures,
1014
1040
  setWebPubLetterSpacing,
1015
1041
  setWebPubLineHeight,
1016
1042
  setWebPubParagraphIndent,
@@ -1019,11 +1045,12 @@ var {
1019
1045
  setWebPubSpacingPreset,
1020
1046
  setWebPubTextAlign,
1021
1047
  setWebPubTextNormalization,
1048
+ setWebPubNoRuby,
1022
1049
  setWebPubWordSpacing,
1023
1050
  setWebPubZoom
1024
1051
  } = webPubSettingsSlice.actions;
1025
1052
  var webPubSettingsReducer_default = webPubSettingsSlice.reducer;
1026
- var initialState8 = {
1053
+ var initialState9 = {
1027
1054
  volume: 1,
1028
1055
  playbackRate: 1,
1029
1056
  preservePitch: true,
@@ -1036,7 +1063,7 @@ var initialState8 = {
1036
1063
  };
1037
1064
  var audioSettingsSlice = createSlice({
1038
1065
  name: "audioSettings",
1039
- initialState: initialState8,
1066
+ initialState: initialState9,
1040
1067
  reducers: {
1041
1068
  setVolume: (state, action) => {
1042
1069
  state.volume = action.payload;
@@ -1079,7 +1106,7 @@ var {
1079
1106
  setEnableMediaSession
1080
1107
  } = audioSettingsSlice.actions;
1081
1108
  var audioSettingsReducer_default = audioSettingsSlice.reducer;
1082
- var initialState9 = {
1109
+ var initialState10 = {
1083
1110
  status: "idle",
1084
1111
  isSeeking: false,
1085
1112
  isStalled: false,
@@ -1090,7 +1117,7 @@ var initialState9 = {
1090
1117
  };
1091
1118
  var playerSlice = createSlice({
1092
1119
  name: "player",
1093
- initialState: initialState9,
1120
+ initialState: initialState10,
1094
1121
  reducers: {
1095
1122
  setStatus: (state, action) => {
1096
1123
  state.status = action.payload;
@@ -1321,6 +1348,7 @@ var loadState = (storageKey = DEFAULT_STORAGE_KEY) => {
1321
1348
  settings: void 0,
1322
1349
  theming: void 0,
1323
1350
  preferences: void 0,
1351
+ globalPreferences: void 0,
1324
1352
  webPubSettings: void 0,
1325
1353
  audioSettings: void 0
1326
1354
  };
@@ -1350,6 +1378,7 @@ var loadState = (storageKey = DEFAULT_STORAGE_KEY) => {
1350
1378
  settings: void 0,
1351
1379
  theming: void 0,
1352
1380
  preferences: void 0,
1381
+ globalPreferences: void 0,
1353
1382
  webPubSettings: void 0
1354
1383
  };
1355
1384
  }
@@ -1362,6 +1391,7 @@ var saveState = (state, storageKey, externalReducers = {}) => {
1362
1391
  if (state.settings) stateToPersist.settings = state.settings;
1363
1392
  if (state.theming) stateToPersist.theming = state.theming;
1364
1393
  if (state.preferences) stateToPersist.preferences = state.preferences;
1394
+ if (state.globalPreferences) stateToPersist.globalPreferences = state.globalPreferences;
1365
1395
  if (state.webPubSettings) stateToPersist.webPubSettings = state.webPubSettings;
1366
1396
  if (state.audioSettings) stateToPersist.audioSettings = state.audioSettings;
1367
1397
  Object.entries(externalReducers).forEach(([key, config]) => {
@@ -1383,6 +1413,7 @@ var makeStore = (storageKey, externalReducers = {}) => {
1383
1413
  actions: actionsReducer_default,
1384
1414
  publication: publicationReducer_default,
1385
1415
  preferences: preferencesReducer_default,
1416
+ globalPreferences: globalPreferencesReducer_default,
1386
1417
  webPubSettings: webPubSettingsReducer_default,
1387
1418
  audioSettings: audioSettingsReducer_default,
1388
1419
  player: playerReducer_default,
@@ -1397,6 +1428,7 @@ var makeStore = (storageKey, externalReducers = {}) => {
1397
1428
  settings: persistedState.settings,
1398
1429
  theming: persistedState.theming,
1399
1430
  preferences: persistedState.preferences,
1431
+ globalPreferences: persistedState.globalPreferences,
1400
1432
  webPubSettings: persistedState.webPubSettings,
1401
1433
  audioSettings: persistedState.audioSettings,
1402
1434
  // Include persisted state for external reducers that have it
@@ -1440,7 +1472,10 @@ var ThReduxPreferencesAdapter = class {
1440
1472
  this.store.subscribe(() => {
1441
1473
  const state = this.store.getState();
1442
1474
  const prefs = this.mapStateToPreferences(state);
1443
- this.notifyListeners(prefs);
1475
+ if (JSON.stringify(prefs) !== JSON.stringify(this.currentPreferences)) {
1476
+ this.currentPreferences = prefs;
1477
+ this.notifyListeners(prefs);
1478
+ }
1444
1479
  });
1445
1480
  }
1446
1481
  getPreferences() {
@@ -1468,10 +1503,45 @@ var ThReduxPreferencesAdapter = class {
1468
1503
  this.listeners.forEach((callback) => callback(prefsCopy));
1469
1504
  }
1470
1505
  };
1471
- var useAppDispatch = useDispatch;
1472
- var useAppSelector = useSelector;
1473
- var useAppStore = useStore;
1474
1506
 
1475
- export { ThReduxPreferencesAdapter, ThStoreProvider, actionsSlice, activateDockPanel, audioSettingsSlice, collapseDockPanel, deactivateDockPanel, debounce, dockAction, expandDockPanel, handleSpacingSetting, initialSettingsState, initialWebPubSettingsState, makeStore, playerSlice, preferencesSlice, publicationSlice, readerSlice, setActionOpen, setAdjacentTimelineItems, setAutoPlay, setBreakpoint, setColorScheme, setColumnCount, setContrast, setCoverTheme, setDirection, setDockPanelWidth, setEnableMediaSession, setFXL, setFontFamily, setFontLanguage, setFontSize, setFontWeight, setForcedColors, setFullscreen, setHasArrows, setHasDisplayTransformability, setHovering, setHyphens, setImmersive, setL10n, setLetterSpacing, setLineHeight, setLineLength, setLoading, setMonochrome, setOverflow, setPaginatedAffordance, setParagraphIndent, setParagraphSpacing, setPlatformModifier, setPlaybackRate, setPollInterval, setPositionsList, setPreservePitch, setProgressionFormat, setPublicationEnd, setPublicationStart, setPublisherStyles, setRTL, setReaderProfile, setReducedMotion, setReducedTransparency, setRemotePlaybackState, setRunningHeadFormat, setScroll, setScrollAffordance, setScrollAffordances, setSeekableRanges, setSeeking, setSettingsContainer, setSkipBackwardInterval, setSkipForwardInterval, setSkipInterval, setSleepTimerOnFragmentEnd, setSleepTimerOnTrackEnd, setSleepTimerRemainingSeconds, setSpacingPreset, setStalled, setStatus, setTextAlign, setTextNormalization, setTheme, setTimeline, setTocEntry, setTocTree, setTrackReady, setUI, setUserNavigated, setVolume, setWebPubFontFamily, setWebPubFontWeight, setWebPubHyphens, setWebPubLetterSpacing, setWebPubLineHeight, setWebPubParagraphIndent, setWebPubParagraphSpacing, setWebPubPublisherStyles, setWebPubSpacingPreset, setWebPubTextAlign, setWebPubTextNormalization, setWebPubWordSpacing, setWebPubZoom, setWordSpacing, settingsSlice, themeSlice, toggleActionOpen, toggleImmersive, updateFromPreferences, useAppDispatch, useAppSelector, useAppStore, webPubSettingsSlice };
1476
- //# sourceMappingURL=chunk-EZG6SBSO.mjs.map
1477
- //# sourceMappingURL=chunk-EZG6SBSO.mjs.map
1507
+ // src/lib/ThReduxGlobalPreferencesAdapter.ts
1508
+ var ThReduxGlobalPreferencesAdapter = class {
1509
+ store;
1510
+ listeners = /* @__PURE__ */ new Set();
1511
+ currentPreferences;
1512
+ constructor(store, initialPreferences = {}) {
1513
+ this.store = store;
1514
+ this.currentPreferences = initialPreferences;
1515
+ this.store.subscribe(() => {
1516
+ const locale = this.store.getState().globalPreferences?.locale;
1517
+ const next = { locale };
1518
+ if (JSON.stringify(next) !== JSON.stringify(this.currentPreferences)) {
1519
+ this.currentPreferences = next;
1520
+ this.notifyListeners(next);
1521
+ }
1522
+ });
1523
+ }
1524
+ getPreferences() {
1525
+ return { ...this.currentPreferences };
1526
+ }
1527
+ setPreferences(prefs) {
1528
+ this.currentPreferences = { ...prefs };
1529
+ this.store.dispatch(setLocale(prefs.locale));
1530
+ this.notifyListeners(this.currentPreferences);
1531
+ }
1532
+ subscribe(callback) {
1533
+ this.listeners.add(callback);
1534
+ callback(this.getPreferences());
1535
+ }
1536
+ unsubscribe(callback) {
1537
+ this.listeners.delete(callback);
1538
+ }
1539
+ notifyListeners(prefs) {
1540
+ const copy = { ...prefs };
1541
+ this.listeners.forEach((cb) => cb(copy));
1542
+ }
1543
+ };
1544
+
1545
+ export { ThReduxGlobalPreferencesAdapter, ThReduxPreferencesAdapter, ThStoreProvider, actionsSlice, activateDockPanel, audioSettingsSlice, collapseDockPanel, deactivateDockPanel, debounce, dockAction, expandDockPanel, globalPreferencesSlice, handleSpacingSetting, initialSettingsState, initialWebPubSettingsState, makeStore, playerSlice, preferencesSlice, publicationSlice, readerSlice, setActionOpen, setAdjacentTimelineItems, setAutoPlay, setBreakpoint, setColorScheme, setColumnCount, setContrast, setCoverTheme, setDirection, setDockPanelWidth, setEnableMediaSession, setFXL, setFontFamily, setFontLanguage, setFontSize, setFontWeight, setForcedColors, setFullscreen, setHasArrows, setHasDisplayTransformability, setHovering, setHyphens, setImmersive, setLetterSpacing, setLigatures, setLineHeight, setLineLength, setLoading, setLocale, setMonochrome, setNoRuby, setOverflow, setPaginatedAffordance, setParagraphIndent, setParagraphSpacing, setPlatformModifier, setPlaybackRate, setPollInterval, setPositionsList, setPreservePitch, setProgressionFormat, setPublicationEnd, setPublicationStart, setPublisherStyles, setRTL, setReaderProfile, setReducedMotion, setReducedTransparency, setRemotePlaybackState, setRunningHeadFormat, setScriptMode, setScroll, setScrollAffordance, setScrollAffordances, setSeekableRanges, setSeeking, setSettingsContainer, setSkipBackwardInterval, setSkipForwardInterval, setSkipInterval, setSleepTimerOnFragmentEnd, setSleepTimerOnTrackEnd, setSleepTimerRemainingSeconds, setSpacingPreset, setStalled, setStatus, setTextAlign, setTextNormalization, setTheme, setTimeline, setTocEntry, setTocTree, setTrackReady, setUI, setUserNavigated, setVolume, setWebPubFontFamily, setWebPubFontWeight, setWebPubHyphens, setWebPubLetterSpacing, setWebPubLigatures, setWebPubLineHeight, setWebPubNoRuby, setWebPubParagraphIndent, setWebPubParagraphSpacing, setWebPubPublisherStyles, setWebPubSpacingPreset, setWebPubTextAlign, setWebPubTextNormalization, setWebPubWordSpacing, setWebPubZoom, setWordSpacing, settingsSlice, themeSlice, toggleActionOpen, toggleImmersive, updateFromPreferences, webPubSettingsSlice };
1546
+ //# sourceMappingURL=chunk-WLVE3WNW.mjs.map
1547
+ //# sourceMappingURL=chunk-WLVE3WNW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/readerReducer.ts","../src/lib/settingsReducer.ts","../src/lib/themeReducer.ts","../src/lib/actionsReducer.ts","../src/lib/publicationReducer.ts","../src/lib/helpers/mapPreferences.ts","../src/lib/preferencesReducer.ts","../src/lib/globalPreferencesReducer.ts","../src/lib/webPubSettingsReducer.ts","../src/lib/audioSettingsReducer.ts","../src/lib/playerReducer.ts","../node_modules/.pnpm/debounce@3.0.0/node_modules/debounce/index.js","../src/lib/store.ts","../src/lib/ThStoreProvider.tsx","../src/lib/ThReduxPreferencesAdapter.ts","../src/lib/ThReduxGlobalPreferencesAdapter.ts"],"names":["initialState","createSlice"],"mappings":"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","file":"chunk-WLVE3WNW.mjs","sourcesContent":["import { createSlice } from \"@reduxjs/toolkit\";\n\nimport { defaultPlatformModifier, UnstablePlatformModifier } from \"@/core/Helpers/keyboardUtilities\";\nimport { ThSettingsContainerKeys, ThLayoutDirection } from \"@/preferences/models\";\n\n// Export the profile type for use in other components\nexport type ReaderProfile = \"epub\" | \"webPub\" | \"audio\" | undefined;\n\nexport interface ReaderReducerState {\n profile: ReaderProfile;\n direction: ThLayoutDirection;\n isLoading: boolean;\n isImmersive: boolean;\n isHovering: boolean;\n hasScrollAffordance: boolean;\n hasArrows: boolean;\n hasUserNavigated: boolean;\n isFullscreen: boolean;\n settingsContainer: ThSettingsContainerKeys;\n platformModifier: UnstablePlatformModifier;\n}\n\nconst initialState: ReaderReducerState = {\n profile: undefined,\n direction: ThLayoutDirection.ltr,\n isLoading: true,\n isImmersive: false,\n isHovering: false,\n hasScrollAffordance: false,\n hasArrows: true,\n hasUserNavigated: false,\n isFullscreen: false,\n settingsContainer: ThSettingsContainerKeys.initial,\n platformModifier: defaultPlatformModifier\n}\n\nexport const readerSlice = createSlice({\n name: \"reader\",\n initialState,\n reducers: {\n setReaderProfile: (state, action) => {\n state.profile = action.payload\n },\n setDirection: (state, action) => {\n state.direction = action.payload\n },\n setLoading: (state, action) => {\n state.isLoading = action.payload\n },\n setPlatformModifier: (state, action) => {\n state.platformModifier = action.payload\n },\n setImmersive: (state, action) => {\n state.isImmersive = action.payload\n if (action.payload === true) {\n state.isHovering = false;\n state.hasScrollAffordance = false;\n }\n },\n toggleImmersive: (state) => {\n state.isImmersive = !state.isImmersive;\n if (state.isImmersive === true) {\n state.isHovering = false;\n state.hasScrollAffordance = false;\n }\n },\n setHovering: (state, action) => {\n state.isHovering = action.payload\n },\n setScrollAffordance: (state, action) => {\n state.hasScrollAffordance = action.payload\n if (action.payload === true) {\n state.isHovering = false;\n state.isImmersive = false;\n }\n },\n setHasArrows: (state, action) => {\n state.hasArrows = action.payload\n },\n setUserNavigated: (state, action) => {\n state.hasUserNavigated = action.payload;\n },\n setFullscreen: (state, action) => {\n state.isFullscreen = action.payload\n },\n setSettingsContainer: (state, action) => {\n state.settingsContainer = action.payload\n }\n }\n})\n\n// Action creators are generated for each case reducer function\nexport const { \n setReaderProfile, \n setDirection, \n setLoading,\n setPlatformModifier, \n setImmersive, \n toggleImmersive, \n setHovering,\n setScrollAffordance,\n setHasArrows, \n setUserNavigated,\n setFullscreen,\n setSettingsContainer\n} = readerSlice.actions;\n\nexport default readerSlice.reducer;","import { createSlice } from \"@reduxjs/toolkit\";\n\nimport { \n ThLineHeightOptions, \n ThSpacingPresetKeys, \n ThSpacingSettingsKeys, \n ThTextAlignOptions \n} from \"@/preferences/models\";\n\nexport interface FontFamilyStateObject {\n default: string;\n [language: string]: string;\n}\n\nexport interface SetFontFamilyPayload {\n type: string;\n payload: {\n key: \"default\" | string;\n value: string;\n }\n}\n\nexport interface LineLengthStateObject {\n optimal?: number | null;\n min?: {\n chars?: number | null;\n isDisabled?: boolean;\n },\n max?: {\n chars?: number | null;\n isDisabled?: boolean;\n }\n}\n\nexport interface SetLineLengthPayload {\n type: string;\n payload: {\n key: \"optimal\" | \"min\" | \"max\";\n value?: number | null;\n isDisabled?: boolean;\n }\n}\n\nexport interface SetSpacingSettingPayload<T = number | ThLineHeightOptions | null> {\n type: string;\n payload: {\n value: T;\n preset?: ThSpacingPresetKeys;\n }\n}\n\nexport interface SetSpacingPresetPayload {\n type: string;\n payload: {\n preset: ThSpacingPresetKeys;\n values: Partial<Record<SpacingStateKey, number | ThLineHeightOptions | null>>;\n }\n}\n\nexport type SpacingStateKey = Exclude<ThSpacingSettingsKeys, ThSpacingSettingsKeys.spacingPresets | ThSpacingSettingsKeys.publisherStyles>;\n\nexport interface SpacingStateObject {\n preset: ThSpacingPresetKeys;\n custom: Partial<Record<SpacingStateKey, number | ThLineHeightOptions | null>>;\n baseline: Partial<Record<SpacingStateKey, number | ThLineHeightOptions | null>>;\n}\n\nexport interface SettingsReducerState {\n columnCount: string;\n fontFamily: FontFamilyStateObject;\n fontSize: number;\n fontWeight: number;\n hyphens: boolean | null;\n letterSpacing: number | null;\n ligatures: boolean | null;\n lineHeight: ThLineHeightOptions | null;\n lineLength: LineLengthStateObject | null;\n noRuby: boolean | null;\n paragraphIndent: number | null;\n paragraphSpacing: number | null;\n publisherStyles: boolean;\n scroll: boolean;\n spacing: SpacingStateObject;\n textAlign: ThTextAlignOptions;\n textNormalization: boolean;\n wordSpacing: number | null;\n}\n\nconst initialState: SettingsReducerState = {\n columnCount: \"auto\",\n fontFamily: { default: \"publisher\" },\n fontSize: 1,\n fontWeight: 400,\n hyphens: null,\n letterSpacing: null,\n ligatures: null,\n lineHeight: ThLineHeightOptions.publisher,\n lineLength: null,\n noRuby: null,\n paragraphIndent: null,\n paragraphSpacing: null,\n publisherStyles: true,\n scroll: false,\n spacing: {\n preset: ThSpacingPresetKeys.publisher,\n custom: {},\n baseline: {}\n },\n textAlign: ThTextAlignOptions.publisher,\n textNormalization: false,\n wordSpacing: null,\n}\n\nconst checkRootSpacingSettingsAtInit = (state: SettingsReducerState) => {\n return (\n state.letterSpacing === null &&\n state.lineHeight === ThLineHeightOptions.publisher &&\n state.paragraphIndent === null &&\n state.paragraphSpacing === null &&\n state.wordSpacing === null\n );\n}\n\nexport const handleSpacingSetting = (state: any, action: SetSpacingSettingPayload, settingKey: ThSpacingSettingsKeys) => {\n const { value, preset } = action.payload;\n\n state.publisherStyles = false;\n\n if (!preset) {\n state[settingKey] = value;\n\n if (checkRootSpacingSettingsAtInit(state)) {\n state.publisherStyles = true;\n }\n\n return;\n }\n\n // Initialize spacing state if needed\n if (!state.spacing) {\n state.spacing = {\n preset: ThSpacingPresetKeys.custom,\n custom: {\n [settingKey]: value\n }\n };\n }\n\n // Ensure custom exist for backward compatibility\n if (!state.spacing.custom) {\n state.spacing.custom = {};\n }\n\n if (state.spacing.preset !== ThSpacingPresetKeys.custom) {\n state.spacing.preset = ThSpacingPresetKeys.custom;\n state.spacing.custom = state.spacing.baseline;\n } \n\n if (value === null) {\n delete state.spacing.custom[settingKey];\n } else {\n state.spacing.custom[settingKey] = value;\n }\n};\n\nexport const settingsSlice = createSlice({\n name: \"settings\",\n initialState,\n reducers: {\n setColumnCount: (state, action) => {\n state.columnCount = action.payload\n },\n setFontFamily: (state, action: SetFontFamilyPayload) => {\n const { key, value } = action.payload;\n state.fontFamily[key] = value;\n },\n setFontSize: (state, action) => {\n state.fontSize = action.payload\n },\n setFontWeight: (state, action) => {\n state.fontWeight = action.payload\n },\n setHyphens: (state, action) => {\n state.hyphens = action.payload\n },\n setLigatures: (state, action) => {\n state.ligatures = action.payload\n },\n setLetterSpacing: (state, action) => {\n handleSpacingSetting(state, action, ThSpacingSettingsKeys.letterSpacing);\n },\n setLineHeight: (state, action) => {\n handleSpacingSetting(state, action, ThSpacingSettingsKeys.lineHeight);\n },\n setLineLength: (state, action: SetLineLengthPayload) => {\n // For min and max, we need to spread and handle isDisabled\n // when it is directly set, or depending on the payload value\n const deriveIsDisabled = (value: number | null | undefined, isDisabled?: boolean): boolean => {\n if (value === null) return true;\n if (isDisabled !== undefined) return isDisabled;\n return false;\n };\n\n switch (action.payload.key) {\n case \"optimal\":\n if (action.payload.value) {\n state.lineLength = {\n ...state.lineLength,\n optimal: action.payload.value\n };\n }\n break;\n \n case \"min\":\n state.lineLength = {\n ...state.lineLength,\n min: {\n ...state.lineLength?.min,\n chars: action.payload.value !== undefined \n ? action.payload.value \n : state.lineLength?.min?.chars,\n isDisabled: deriveIsDisabled(action.payload.value, action.payload.isDisabled)\n }\n };\n break;\n \n case \"max\":\n state.lineLength = {\n ...state.lineLength,\n max: {\n ...state.lineLength?.max,\n chars: action.payload.value !== undefined \n ? action.payload.value \n : state.lineLength?.max?.chars,\n isDisabled: deriveIsDisabled(action.payload.value, action.payload.isDisabled)\n }\n };\n break;\n default:\n break;\n }\n },\n setParagraphIndent: (state, action) => {\n handleSpacingSetting(state, action, ThSpacingSettingsKeys.paragraphIndent);\n },\n setParagraphSpacing: (state, action) => {\n handleSpacingSetting(state, action, ThSpacingSettingsKeys.paragraphSpacing);\n },\n setPublisherStyles: (state, action) => {\n state.publisherStyles = action.payload\n },\n setScroll: (state, action) => {\n state.scroll = action.payload\n },\n setSpacingPreset: (state, action: SetSpacingPresetPayload) => {\n const { preset, values } = action.payload;\n\n // Initialize spacing state if needed\n if (!state.spacing) {\n state.spacing = {\n preset: preset,\n custom: {},\n baseline: {}\n };\n }\n\n state.spacing.preset = preset;\n\n if (preset !== ThSpacingPresetKeys.custom) {\n state.spacing.baseline = values;\n }\n\n if (preset === ThSpacingPresetKeys.publisher) {\n state.publisherStyles = true;\n } else {\n state.publisherStyles = false;\n }\n },\n setTextAlign: (state, action) => {\n state.textAlign = action.payload\n },\n setTextNormalization: (state, action) => {\n state.textNormalization = action.payload\n },\n setNoRuby: (state, action) => {\n state.noRuby = action.payload\n },\n setWordSpacing: (state, action) => {\n handleSpacingSetting(state, action, ThSpacingSettingsKeys.wordSpacing);\n }\n }\n});\n\nexport const initialSettingsState = initialState;\n\n// Action creators are generated for each case reducer function\nexport const { \n setColumnCount,\n setFontSize,\n setFontWeight, \n setFontFamily,\n setHyphens,\n setLigatures,\n setLetterSpacing,\n setLineHeight,\n setLineLength,\n setParagraphIndent,\n setParagraphSpacing,\n setPublisherStyles,\n setScroll,\n setSpacingPreset,\n setTextAlign,\n setTextNormalization,\n setNoRuby,\n setWordSpacing\n} = settingsSlice.actions;\n\nexport default settingsSlice.reducer;","import { createSlice } from \"@reduxjs/toolkit\";\n\nimport { ThColorScheme } from \"@/core/Hooks/useColorScheme\";\nimport { ThContrast } from \"@/core/Hooks/useContrast\";\nimport { ThBreakpoints } from \"@/preferences/models\";\nimport { ThemeTokens } from \"@/preferences/hooks/useTheming\";\n\nexport interface ThemeStateObject {\n reflow?: string;\n fxl?: string;\n audio?: string;\n}\n\nexport interface ThemeStateChangePayload {\n type: string;\n payload: {\n key: \"reflow\" | \"fxl\" | \"audio\";\n value?: string;\n }\n}\n\nexport interface ThemeReducerState {\n monochrome: boolean;\n colorScheme: ThColorScheme;\n theme: ThemeStateObject;\n coverTheme?: ThemeTokens;\n prefersReducedMotion: boolean;\n prefersReducedTransparency: boolean;\n prefersContrast: ThContrast;\n forcedColors: boolean;\n breakpoint?: ThBreakpoints;\n}\n\nconst initialState: ThemeReducerState = {\n monochrome: false,\n colorScheme: ThColorScheme.light,\n theme: {\n reflow: \"auto\",\n fxl: \"auto\",\n audio: \"auto\"\n },\n coverTheme: undefined,\n prefersReducedMotion: false,\n prefersReducedTransparency: false, \n prefersContrast: ThContrast.none,\n forcedColors: false, \n breakpoint: undefined\n}\n\nexport const themeSlice = createSlice({\n name: \"theming\",\n initialState,\n reducers: {\n setMonochrome: (state, action) => {\n state.monochrome = action.payload\n },\n setColorScheme: (state, action) => {\n state.colorScheme = action.payload\n },\n setTheme: (state, action: ThemeStateChangePayload) => {\n state.theme[action.payload.key] = action.payload.value || \"auto\"\n },\n setCoverTheme: (state, action) => {\n state.coverTheme = action.payload\n },\n setReducedMotion: (state, action) => {\n state.prefersReducedMotion = action.payload\n },\n setReducedTransparency: (state, action) => {\n state.prefersReducedTransparency = action.payload\n },\n setContrast: (state, action) => {\n state.prefersContrast = action.payload\n },\n setForcedColors: (state, action) => {\n state.forcedColors = action.payload\n },\n setBreakpoint: (state, action) => {\n state.breakpoint = action.payload\n }\n }\n})\n\n// Action creators are generated for each case reducer function\nexport const { \n setMonochrome, \n setColorScheme, \n setTheme, \n setCoverTheme,\n setReducedMotion, \n setReducedTransparency, \n setContrast, \n setForcedColors, \n setBreakpoint,\n} = themeSlice.actions;\n\nexport default themeSlice.reducer;","import { createSlice } from \"@reduxjs/toolkit\";\n\nimport { ThDockingKeys } from \"../preferences/models\";\n\nexport type ActionsStateKeys = string;\nexport type OverflowStateKeys = string; \n\nexport interface ActionStateObject {\n isOpen?: boolean | null;\n docking?: ThDockingKeys | null;\n dockedWidth?: number;\n}\n\nexport interface OverflowStateObject {\n isOpen: boolean;\n}\n\nexport interface DockStateObject {\n actionKey: ActionsStateKeys | null;\n active: boolean;\n collapsed: boolean;\n width?: number;\n}\n\nexport interface ActionStateDockPayload {\n type: string;\n payload: {\n key: ActionsStateKeys;\n dockingKey: ThDockingKeys;\n profile: string;\n }\n}\n\nexport interface ActionStateOpenPayload {\n type: string;\n payload: {\n key: ActionsStateKeys;\n isOpen: boolean;\n profile: string;\n }\n}\n\nexport interface ActionStateTogglePayload {\n type: string;\n payload: {\n key: ActionsStateKeys;\n profile: string;\n }\n}\n\nexport interface ActionOverflowOpenPayload {\n type: string;\n payload: {\n key: OverflowStateKeys;\n isOpen: boolean;\n }\n}\n\nexport interface ActionStateDockedPayload {\n type: string;\n payload: { \n slot: ThDockingKeys.start | ThDockingKeys.end;\n docked: DockStateObject;\n }\n}\n\nexport interface ActionStateSlotPayload {\n type: string;\n payload: ThDockingKeys.start | ThDockingKeys.end;\n}\n\nexport interface ActionStateSlotPayloadWithProfile {\n type: string;\n payload: {\n slot: ThDockingKeys.start | ThDockingKeys.end;\n profile: string;\n };\n}\n\nexport interface ActionStateSlotWidthPayload {\n type: string;\n payload: { \n key: ThDockingKeys.start | ThDockingKeys.end;\n width: number;\n profile: string;\n }\n}\n\nexport interface DockState {\n [profile: string]: {\n [ThDockingKeys.start]: DockStateObject;\n [ThDockingKeys.end]: DockStateObject;\n }\n}\n\nexport interface ActionKeysState {\n [profile: string]: {\n [key in ActionsStateKeys]?: ActionStateObject;\n };\n}\n\nexport type ActionsReducerState = {\n keys: ActionKeysState;\n dock: DockState,\n overflow: {\n [key in OverflowStateKeys]?: OverflowStateObject;\n }\n}\n\nconst initialState: ActionsReducerState = {\n dock: {\n epub: {\n [ThDockingKeys.start]: {\n actionKey: null,\n active: false,\n collapsed: false\n },\n [ThDockingKeys.end]: {\n actionKey: null,\n active: false,\n collapsed: false\n }\n },\n webPub: {\n [ThDockingKeys.start]: {\n actionKey: null,\n active: false,\n collapsed: false\n },\n [ThDockingKeys.end]: {\n actionKey: null,\n active: false,\n collapsed: false\n }\n },\n audio: {\n [ThDockingKeys.start]: {\n actionKey: null,\n active: false,\n collapsed: false\n },\n [ThDockingKeys.end]: {\n actionKey: null,\n active: false,\n collapsed: false\n }\n }\n },\n keys: {\n epub: {},\n webPub: {},\n audio: {}\n },\n overflow: {}\n}\n\nconst initializeProfileDock = (state: ActionsReducerState, profile: string) => {\n if (!state.dock[profile]) {\n state.dock[profile] = {\n [ThDockingKeys.start]: {\n actionKey: null,\n active: false,\n collapsed: false\n },\n [ThDockingKeys.end]: {\n actionKey: null,\n active: false,\n collapsed: false\n }\n };\n }\n};\n\nconst initializeProfileKeys = (state: ActionsReducerState, profile: string) => {\n if (!state.keys[profile]) {\n state.keys[profile] = {};\n }\n};\n\nexport const actionsSlice = createSlice({\n name: \"actions\",\n initialState,\n reducers: {\n dockAction: (state, action: ActionStateDockPayload) => {\n const { key, dockingKey, profile } = action.payload;\n \n // Initialize dock and keys state for profile if they don't exist\n initializeProfileDock(state, profile);\n initializeProfileKeys(state, profile);\n \n const profileDock = state.dock[profile];\n const profileKeys = state.keys[profile];\n \n // The user should be able to override the dock slot\n // so we override the previous value, and sync \n // any other action with the same docking key\n switch(dockingKey) {\n case ThDockingKeys.start:\n // We need to find if any other action has the same docking key. \n // If it does, we also have to close it so that its transient sheet \n // doesn’t pop over on the screen when it’s replaced\n for (const k in profileKeys) {\n if (profileKeys[k as ActionsStateKeys]?.docking === dockingKey) {\n profileKeys[k as ActionsStateKeys] = { \n ...profileKeys[k as ActionsStateKeys],\n docking: ThDockingKeys.transient,\n isOpen: false\n };\n }\n }\n\n // We need to populate the docking slot\n profileDock[ThDockingKeys.start] = {\n ...profileDock[ThDockingKeys.start],\n actionKey: key\n }\n // And remove it from the other one\n if (profileDock[ThDockingKeys.end].actionKey === key) {\n profileDock[ThDockingKeys.end] = {\n ...profileDock[ThDockingKeys.end],\n actionKey: null\n }\n }\n break;\n\n case ThDockingKeys.end:\n // We need to find if any other action has the same docking key. \n // If it does, we also have to close it so that its transient sheet \n // doesn’t pop over on the screen when it’s replaced\n for (const k in profileKeys) {\n if (profileKeys[k as ActionsStateKeys]?.docking === dockingKey) {\n profileKeys[k as ActionsStateKeys] = { \n ...profileKeys[k as ActionsStateKeys],\n docking: ThDockingKeys.transient,\n isOpen: false\n };\n }\n }\n\n // We need to populate the docking slot\n profileDock[ThDockingKeys.end] = {\n ...profileDock[ThDockingKeys.end],\n actionKey: key\n }\n // And remove it from the other one\n if (profileDock[ThDockingKeys.start].actionKey === key) {\n profileDock[ThDockingKeys.start] = {\n ...profileDock[ThDockingKeys.start],\n actionKey: null\n }\n }\n break;\n\n // We don’t need to sync another action\n case ThDockingKeys.transient:\n default: \n // We need to empty the docking slot\n if (profileDock[ThDockingKeys.start].actionKey === key) {\n profileDock[ThDockingKeys.start] = {\n ...profileDock[ThDockingKeys.start],\n actionKey: null\n }\n }\n if (profileDock[ThDockingKeys.end].actionKey === key) {\n profileDock[ThDockingKeys.end] = {\n ...profileDock[ThDockingKeys.end],\n actionKey: null\n }\n } \n break;\n }\n\n profileKeys[key] = { \n ...profileKeys[key],\n docking: dockingKey \n };\n },\n setActionOpen: (state, action: ActionStateOpenPayload) => { \n const { key, isOpen, profile } = action.payload;\n \n initializeProfileKeys(state, profile);\n \n state.keys[profile][key] = {\n ...state.keys[profile][key],\n isOpen \n };\n },\n toggleActionOpen: (state, action: ActionStateTogglePayload) => {\n const { key, profile } = action.payload;\n \n initializeProfileKeys(state, profile);\n \n const payload = {\n key,\n isOpen: state.keys[profile][key]?.isOpen ? !state.keys[profile][key]?.isOpen : true,\n profile\n };\n actionsSlice.caseReducers.setActionOpen(state, {\n type: \"toggleActionOpen\",\n payload: payload\n });\n },\n setOverflow: (state, action: ActionOverflowOpenPayload) => {\n state.overflow[action.payload.key] = {\n ...state.overflow[action.payload.key],\n isOpen: action.payload.isOpen \n }\n },\n activateDockPanel: (state, action: ActionStateSlotPayloadWithProfile) => {\n const { slot, profile } = action.payload;\n initializeProfileDock(state, profile);\n state.dock[profile][slot] = {\n ...state.dock[profile][slot],\n active: true\n }\n },\n deactivateDockPanel: (state, action: ActionStateSlotPayloadWithProfile) => {\n const { slot, profile } = action.payload;\n initializeProfileDock(state, profile);\n state.dock[profile][slot] = {\n ...state.dock[profile][slot],\n active: false\n }\n },\n collapseDockPanel: (state, action: ActionStateSlotPayloadWithProfile) => {\n const { slot, profile } = action.payload;\n initializeProfileDock(state, profile);\n state.dock[profile][slot] = {\n ...state.dock[profile][slot],\n collapsed: true\n }\n },\n expandDockPanel: (state, action: ActionStateSlotPayloadWithProfile) => {\n const { slot, profile } = action.payload;\n initializeProfileDock(state, profile);\n state.dock[profile][slot] = {\n ...state.dock[profile][slot],\n collapsed: false\n }\n },\n setDockPanelWidth: (state, action: ActionStateSlotWidthPayload) => {\n const { key, width, profile } = action.payload;\n \n initializeProfileDock(state, profile);\n initializeProfileKeys(state, profile);\n \n // Copy the value in the action state \n // in case we do something with it later.\n\n const dockKey: ActionsStateKeys | null = state.dock[profile][key].actionKey;\n if (dockKey) {\n state.keys[profile][dockKey] = {\n ...state.keys[profile][dockKey],\n dockedWidth: width\n }\n }\n\n // We only care if it's populated.\n state.dock[profile][key] = {\n ...state.dock[profile][key],\n width: width\n }\n }\n }\n})\n\nexport const { \n dockAction, \n setActionOpen, \n toggleActionOpen, \n setOverflow, \n activateDockPanel, \n deactivateDockPanel, \n collapseDockPanel,\n expandDockPanel, \n setDockPanelWidth\n} = actionsSlice.actions;\n\nexport default actionsSlice.reducer;","import { createSlice } from \"@reduxjs/toolkit\";\n\nimport { Locator } from \"@readium/shared\";\nimport { ScriptMode } from \"@readium/navigator\";\nimport { UnstableTimeline } from \"@/core/Hooks/useTimeline\";\nimport { TocItem, toEntryRef } from \"@/helpers/buildTocTree\";\n\nexport interface AdjacentTimelineItem {\n title: string;\n href: string;\n}\n\nexport interface PublicationReducerState {\n fontLanguage: string;\n isFXL: boolean;\n isRTL: boolean;\n scriptMode: ScriptMode;\n hasDisplayTransformability: boolean;\n positionsList: Locator[],\n atPublicationStart: boolean;\n atPublicationEnd: boolean;\n unstableTimeline?: UnstableTimeline;\n adjacentTimelineItems: {\n previous: AdjacentTimelineItem | null;\n next: AdjacentTimelineItem | null;\n };\n}\n\nconst initialState: PublicationReducerState = {\n fontLanguage: \"default\",\n isFXL: false,\n isRTL: false,\n scriptMode: \"ltr\",\n hasDisplayTransformability: false,\n positionsList: [],\n atPublicationStart: false,\n atPublicationEnd: false,\n unstableTimeline: undefined,\n adjacentTimelineItems: { previous: null, next: null }\n}\n\nexport const publicationSlice = createSlice({\n name: \"publication\",\n initialState,\n reducers: {\n setFontLanguage: (state, action) => {\n state.fontLanguage = action.payload\n },\n setFXL: (state, action) => {\n state.isFXL = action.payload\n },\n setRTL: (state, action) => {\n state.isRTL = action.payload\n },\n setScriptMode: (state, action) => {\n state.scriptMode = action.payload\n },\n setHasDisplayTransformability: (state, action) => {\n state.hasDisplayTransformability = action.payload\n },\n setPositionsList: (state, action) => {\n state.positionsList = action.payload\n },\n setPublicationStart: (state, action) => {\n state.atPublicationStart = action.payload\n },\n setPublicationEnd: (state, action) => {\n state.atPublicationEnd = action.payload\n },\n setTimeline: (state, action) => {\n state.unstableTimeline = {\n ...action.payload,\n toc: action.payload.toc || { tree: undefined, currentEntry: undefined }\n };\n },\n setTocTree: (state, action) => {\n if (!state.unstableTimeline) {\n state.unstableTimeline = {\n toc: { tree: action.payload, currentEntry: undefined }\n };\n } else if (state.unstableTimeline.toc) {\n state.unstableTimeline.toc.tree = action.payload;\n } else {\n state.unstableTimeline.toc = { tree: action.payload, currentEntry: undefined };\n }\n },\n setAdjacentTimelineItems: (state, action: { payload: { previous: AdjacentTimelineItem | null; next: AdjacentTimelineItem | null } }) => {\n state.adjacentTimelineItems = action.payload;\n },\n setTocEntry: (state, action: { payload: TocItem | null }) => {\n const entry = action.payload ? toEntryRef(action.payload) : null;\n if (!state.unstableTimeline) {\n state.unstableTimeline = {\n toc: { tree: undefined, currentEntry: entry }\n };\n } else if (state.unstableTimeline.toc) {\n state.unstableTimeline.toc.currentEntry = entry;\n } else {\n state.unstableTimeline.toc = { tree: undefined, currentEntry: entry };\n }\n }\n }\n});\n\n// Action creators are generated for each case reducer function\nexport const {\n setFontLanguage,\n setFXL,\n setRTL,\n setScriptMode,\n setHasDisplayTransformability,\n setPositionsList,\n setPublicationStart,\n setPublicationEnd,\n setTimeline,\n setTocTree,\n setTocEntry,\n setAdjacentTimelineItems,\n} = publicationSlice.actions;\n\nexport default publicationSlice.reducer;","import { PreferencesReducerState } from \"../preferencesReducer\";\nimport { ThPreferences, CustomizableKeys } from \"@/preferences/preferences\";\nimport { ThProgressionFormat, ThRunningHeadFormat, ThBreakpoints, ThPaginatedAffordancePrefValue } from \"@/preferences/models\";\n\nconst mapRenditionFormat = <T>(\n format: { default?: { variants: T }, breakpoints?: { [key in ThBreakpoints]?: { variants: T } } } | undefined\n) => {\n const result: {\n default?: T;\n breakpoints?: { [key in ThBreakpoints]?: T };\n } = {};\n\n if (format?.default?.variants !== undefined) {\n result.default = format.default.variants;\n }\n\n if (format?.breakpoints) {\n result.breakpoints = Object.entries(format.breakpoints).reduce((acc, [bp, value]) => {\n if (value?.variants !== undefined) {\n acc[bp as ThBreakpoints] = value.variants;\n }\n return acc;\n }, {} as { [key in ThBreakpoints]?: T });\n }\n\n return result;\n};\n\nconst mapPaginatedAffordance = (\n format: { default?: ThPaginatedAffordancePrefValue, breakpoints?: { [key in ThBreakpoints]?: ThPaginatedAffordancePrefValue } } | undefined\n) => {\n const result: {\n default?: ThPaginatedAffordancePrefValue;\n breakpoints?: { [key in ThBreakpoints]?: ThPaginatedAffordancePrefValue };\n } = {};\n\n if (format?.default) {\n result.default = format.default;\n }\n\n if (format?.breakpoints) {\n result.breakpoints = Object.entries(format.breakpoints).reduce((acc, [bp, value]) => {\n if (value) {\n acc[bp as ThBreakpoints] = value;\n }\n return acc;\n }, {} as { [key in ThBreakpoints]?: ThPaginatedAffordancePrefValue });\n }\n\n return result;\n};\n\nexport const mapPreferencesToState = <T extends CustomizableKeys>(prefs: ThPreferences<T>): PreferencesReducerState => {\n return {\n progressionFormat: {\n reflow: mapRenditionFormat<ThProgressionFormat | ThProgressionFormat[]>(\n prefs.theming?.progression?.format?.reflow\n ),\n fxl: mapRenditionFormat<ThProgressionFormat | ThProgressionFormat[]>(\n prefs.theming?.progression?.format?.fxl\n ),\n webPub: mapRenditionFormat<ThProgressionFormat | ThProgressionFormat[]>(\n prefs.theming?.progression?.format?.webPub\n )\n },\n runningHeadFormat: {\n reflow: mapRenditionFormat<ThRunningHeadFormat>(\n prefs.theming?.header?.runningHead?.format?.reflow\n ),\n fxl: mapRenditionFormat<ThRunningHeadFormat>(\n prefs.theming?.header?.runningHead?.format?.fxl\n ),\n webPub: mapRenditionFormat<ThRunningHeadFormat>(\n prefs.theming?.header?.runningHead?.format?.webPub\n )\n },\n ui: prefs.theming?.layout?.ui,\n scrollAffordances: {\n hintInImmersive: prefs.affordances?.scroll?.hintInImmersive ?? false,\n toggleOnMiddlePointer: prefs.affordances?.scroll?.toggleOnMiddlePointer ?? [],\n hideOnForwardScroll: prefs.affordances?.scroll?.hideOnForwardScroll ?? false,\n showOnBackwardScroll: prefs.affordances?.scroll?.showOnBackwardScroll ?? false\n },\n paginatedAffordances: {\n reflow: mapPaginatedAffordance(prefs.affordances?.paginated?.reflow),\n fxl: mapPaginatedAffordance(prefs.affordances?.paginated?.fxl)\n }\n };\n}\n\nexport const mapStateToPreferences = <T extends CustomizableKeys = CustomizableKeys>(\n state: PreferencesReducerState, \n currentPrefs: ThPreferences<T>\n): ThPreferences<T> => {\n const updateVariants = (stateValue: any, prefValue: any) => {\n if (!stateValue) return prefValue;\n \n return {\n ...prefValue,\n default: {\n ...prefValue?.default,\n variants: stateValue.default || prefValue?.default?.variants\n },\n ...(stateValue.breakpoints && {\n breakpoints: {\n ...prefValue?.breakpoints,\n ...Object.entries(stateValue.breakpoints).reduce((acc, [bp, value]) => {\n const existing = prefValue?.breakpoints?.[bp as ThBreakpoints] || {};\n return {\n ...acc,\n [bp]: {\n ...existing,\n variants: value\n }\n };\n }, {})\n }\n })\n };\n };\n\n const updatePaginatedAffordance = (stateValue: any, prefValue: any) => {\n if (!stateValue) return prefValue;\n \n return {\n ...prefValue,\n default: stateValue.default || prefValue?.default,\n ...(stateValue.breakpoints && {\n breakpoints: {\n ...prefValue?.breakpoints,\n ...Object.entries(stateValue.breakpoints).reduce((acc, [bp, value]) => ({\n ...acc,\n [bp]: value\n }), {})\n }\n })\n };\n };\n\n return {\n ...currentPrefs,\n theming: {\n ...currentPrefs.theming,\n ...(state.progressionFormat && {\n progression: {\n ...currentPrefs.theming.progression,\n format: {\n ...currentPrefs.theming.progression?.format,\n ...(state.progressionFormat.reflow !== undefined && {\n reflow: updateVariants(\n state.progressionFormat.reflow,\n currentPrefs.theming.progression?.format?.reflow\n )\n }),\n ...(state.progressionFormat.fxl !== undefined && {\n fxl: updateVariants(\n state.progressionFormat.fxl,\n currentPrefs.theming.progression?.format?.fxl\n )\n }),\n ...(state.progressionFormat.webPub !== undefined && {\n webPub: updateVariants(\n state.progressionFormat.webPub,\n currentPrefs.theming.progression?.format?.webPub\n )\n })\n }\n }\n }),\n ...(state.runningHeadFormat && {\n header: {\n ...currentPrefs.theming.header,\n runningHead: {\n ...currentPrefs.theming.header?.runningHead,\n format: {\n ...currentPrefs.theming.header?.runningHead?.format,\n ...(state.runningHeadFormat.reflow !== undefined && {\n reflow: updateVariants(\n state.runningHeadFormat.reflow,\n currentPrefs.theming.header?.runningHead?.format?.reflow\n )\n }),\n ...(state.runningHeadFormat.fxl !== undefined && {\n fxl: updateVariants(\n state.runningHeadFormat.fxl,\n currentPrefs.theming.header?.runningHead?.format?.fxl\n )\n }),\n ...(state.runningHeadFormat.webPub !== undefined && {\n webPub: updateVariants(\n state.runningHeadFormat.webPub,\n currentPrefs.theming.header?.runningHead?.format?.webPub\n )\n })\n }\n }\n }\n }),\n layout: {\n ...currentPrefs.theming.layout,\n ui: state.ui \n ? { \n ...currentPrefs.theming.layout?.ui,\n ...state.ui \n } \n : currentPrefs.theming.layout?.ui\n }\n },\n affordances: {\n ...currentPrefs.affordances,\n ...(state.scrollAffordances && {\n scroll: {\n ...currentPrefs.affordances.scroll,\n ...state.scrollAffordances\n }\n }),\n ...(state.paginatedAffordances && {\n paginated: {\n reflow: updatePaginatedAffordance(state.paginatedAffordances.reflow, currentPrefs.affordances?.paginated?.reflow),\n fxl: updatePaginatedAffordance(state.paginatedAffordances.fxl, currentPrefs.affordances?.paginated?.fxl)\n }\n })\n }\n };\n};","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\n\nimport {\n ThLayoutUI,\n ThProgressionFormat,\n ThRunningHeadFormat,\n ThPreferences,\n CustomizableKeys,\n ThBreakpoints,\n ThPaginatedAffordancePrefValue\n} from \"@/preferences\";\n\nimport { mapPreferencesToState } from \"./helpers/mapPreferences\";\n\nexport interface RenditionProperties<T extends string | Array<string>> {\n default?: T;\n breakpoints?: {\n [key in ThBreakpoints]?: T;\n };\n}\n\nexport interface RenditionObject<T extends string | Array<string>> {\n reflow?: RenditionProperties<T>;\n fxl?: RenditionProperties<T>;\n webPub?: RenditionProperties<T>;\n}\n\nexport interface RenditionChangePayload<T extends string | Array<string>> {\n type: string;\n payload: {\n key: \"reflow\" | \"fxl\" | \"webPub\";\n value?: T;\n breakpoint?: ThBreakpoints;\n }\n}\n\nexport interface UIChangePayload {\n type: string;\n payload: {\n key: \"reflow\" | \"fxl\" | \"webPub\";\n value?: ThLayoutUI;\n }\n}\n\nexport interface PaginatedAffordanceProperties {\n default?: ThPaginatedAffordancePrefValue;\n breakpoints?: {\n [key in ThBreakpoints]?: ThPaginatedAffordancePrefValue;\n };\n}\n\nexport interface PaginatedAffordanceObject {\n reflow?: PaginatedAffordanceProperties;\n fxl?: PaginatedAffordanceProperties;\n}\n\nexport interface PaginatedAffordancePayload {\n type: string;\n payload: {\n key: \"reflow\" | \"fxl\";\n value: ThPaginatedAffordancePrefValue;\n breakpoint?: ThBreakpoints;\n };\n}\n\nexport interface PreferencesReducerState {\n progressionFormat?: RenditionObject<ThProgressionFormat | Array<ThProgressionFormat>>;\n runningHeadFormat?: RenditionObject<ThRunningHeadFormat>;\n paginatedAffordances?: PaginatedAffordanceObject;\n ui?: {\n reflow?: ThLayoutUI;\n fxl?: ThLayoutUI;\n webPub?: ThLayoutUI;\n };\n scrollAffordances?: {\n hintInImmersive?: boolean;\n toggleOnMiddlePointer?: Array<\"tap\" | \"click\">;\n hideOnForwardScroll?: boolean;\n showOnBackwardScroll?: boolean;\n }\n}\n\nconst initialState: PreferencesReducerState = {}\n\nexport const preferencesSlice = createSlice({\n name: \"preferences\",\n initialState,\n reducers: {\n setProgressionFormat: (state, action: RenditionChangePayload<ThProgressionFormat | Array<ThProgressionFormat>>) => {\n const { key, value, breakpoint } = action.payload;\n state.progressionFormat = {\n ...state.progressionFormat,\n [key]: {\n ...state.progressionFormat?.[key],\n ...(breakpoint ? {\n breakpoints: {\n ...state.progressionFormat?.[key]?.breakpoints,\n [breakpoint]: value\n }\n } : { default: value })\n }\n };\n },\n setRunningHeadFormat: (state, action: RenditionChangePayload<ThRunningHeadFormat>) => {\n const { key, value, breakpoint } = action.payload;\n state.runningHeadFormat = {\n ...state.runningHeadFormat,\n [key]: {\n ...state.runningHeadFormat?.[key],\n ...(breakpoint ? {\n breakpoints: {\n ...state.runningHeadFormat?.[key]?.breakpoints,\n [breakpoint]: value\n }\n } : { default: value })\n }\n };\n },\n setUI: (state, action: UIChangePayload) => {\n const { key, value } = action.payload;\n state.ui = {\n ...state.ui,\n [key]: value\n };\n },\n setScrollAffordances: (state, action) => {\n state.scrollAffordances = action.payload;\n },\n setPaginatedAffordance: (state, action: PaginatedAffordancePayload) => {\n const { key, value, breakpoint } = action.payload;\n state.paginatedAffordances = {\n ...state.paginatedAffordances,\n [key]: {\n ...state.paginatedAffordances?.[key],\n ...(breakpoint ? {\n breakpoints: {\n ...state.paginatedAffordances?.[key]?.breakpoints,\n [breakpoint]: value\n }\n } : { default: value })\n }\n };\n },\n updateFromPreferences(state, action: PayloadAction<ThPreferences<CustomizableKeys>>) {\n const prefs = action.payload;\n return mapPreferencesToState(prefs);\n }\n }\n})\n\n// Action creators are generated for each case reducer function\nexport const {\n setProgressionFormat,\n setRunningHeadFormat,\n setUI,\n setScrollAffordances,\n setPaginatedAffordance,\n updateFromPreferences\n} = preferencesSlice.actions;\n\nexport default preferencesSlice.reducer;","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\n\nexport interface GlobalPreferencesReducerState {\n locale?: string;\n}\n\nconst initialState: GlobalPreferencesReducerState = {};\n\nexport const globalPreferencesSlice = createSlice({\n name: \"globalPreferences\",\n initialState,\n reducers: {\n setLocale: (state, action: PayloadAction<string | undefined>) => {\n state.locale = action.payload;\n },\n },\n});\n\nexport const { setLocale } = globalPreferencesSlice.actions;\n\nexport default globalPreferencesSlice.reducer;\n","import { createSlice } from \"@reduxjs/toolkit\";\n\nimport { \n ThLineHeightOptions, \n ThSpacingPresetKeys, \n ThSpacingSettingsKeys, \n ThTextAlignOptions \n} from \"@/preferences/models\";\n\nimport { \n FontFamilyStateObject, \n SetFontFamilyPayload, \n handleSpacingSetting, \n SetSpacingPresetPayload, \n SpacingStateObject \n} from \"./settingsReducer\";\n\nexport interface WebPubSettingsReducerState {\n fontFamily: FontFamilyStateObject;\n fontWeight: number;\n hyphens: boolean | null;\n letterSpacing: number | null;\n ligatures: boolean | null;\n lineHeight: ThLineHeightOptions | null;\n noRuby: boolean | null;\n paragraphIndent: number | null;\n paragraphSpacing: number | null;\n publisherStyles: boolean;\n spacing: SpacingStateObject;\n textAlign: ThTextAlignOptions;\n textNormalization: boolean;\n wordSpacing: number | null;\n zoom: number;\n}\n\nconst initialState: WebPubSettingsReducerState = {\n fontFamily: { default: \"publisher\" },\n fontWeight: 400,\n hyphens: null,\n letterSpacing: null,\n ligatures: null,\n lineHeight: ThLineHeightOptions.publisher,\n noRuby: null,\n paragraphIndent: null,\n paragraphSpacing: null,\n publisherStyles: true,\n spacing: {\n preset: ThSpacingPresetKeys.publisher,\n custom: {},\n baseline: {}\n },\n textAlign: ThTextAlignOptions.publisher,\n textNormalization: false,\n wordSpacing: null,\n zoom: 1\n}\n\nexport const webPubSettingsSlice = createSlice({\n name: \"webPubSettings\",\n initialState,\n reducers: {\n setWebPubFontFamily: (state, action: SetFontFamilyPayload) => {\n const { key, value } = action.payload;\n state.fontFamily[key] = value;\n },\n setWebPubFontWeight: (state, action) => {\n state.fontWeight = action.payload\n },\n setWebPubHyphens: (state, action) => {\n state.hyphens = action.payload\n },\n setWebPubLigatures: (state, action) => {\n state.ligatures = action.payload\n },\n setWebPubLetterSpacing: (state, action) => {\n handleSpacingSetting(state, action, ThSpacingSettingsKeys.letterSpacing);\n },\n setWebPubLineHeight: (state, action) => {\n handleSpacingSetting(state, action, ThSpacingSettingsKeys.lineHeight);\n },\n setWebPubParagraphIndent: (state, action) => {\n handleSpacingSetting(state, action, ThSpacingSettingsKeys.paragraphIndent);\n },\n setWebPubParagraphSpacing: (state, action) => {\n handleSpacingSetting(state, action, ThSpacingSettingsKeys.paragraphSpacing);\n },\n setWebPubPublisherStyles: (state, action) => {\n state.publisherStyles = action.payload\n },\n setWebPubSpacingPreset: (state, action: SetSpacingPresetPayload) => {\n const { preset, values } = action.payload;\n\n // Initialize spacing state if needed\n if (!state.spacing) {\n state.spacing = {\n preset: preset,\n custom: {},\n baseline: {}\n };\n }\n\n state.spacing.preset = preset;\n\n if (preset !== ThSpacingPresetKeys.custom) {\n state.spacing.baseline = values;\n }\n\n if (preset === ThSpacingPresetKeys.publisher) {\n state.publisherStyles = true;\n } else {\n state.publisherStyles = false;\n }\n },\n setWebPubTextAlign: (state, action) => {\n state.textAlign = action.payload\n },\n setWebPubTextNormalization: (state, action) => {\n state.textNormalization = action.payload\n },\n setWebPubNoRuby: (state, action) => {\n state.noRuby = action.payload\n },\n setWebPubWordSpacing: (state, action) => {\n handleSpacingSetting(state, action, ThSpacingSettingsKeys.wordSpacing);\n },\n setWebPubZoom: (state, action) => {\n state.zoom = action.payload\n }\n }\n});\n\nexport const initialWebPubSettingsState = initialState;\n\n// Action creators are generated for each case reducer function\nexport const {\n setWebPubFontFamily,\n setWebPubFontWeight,\n setWebPubHyphens,\n setWebPubLigatures,\n setWebPubLetterSpacing,\n setWebPubLineHeight,\n setWebPubParagraphIndent,\n setWebPubParagraphSpacing,\n setWebPubPublisherStyles,\n setWebPubSpacingPreset,\n setWebPubTextAlign,\n setWebPubTextNormalization,\n setWebPubNoRuby,\n setWebPubWordSpacing,\n setWebPubZoom\n} = webPubSettingsSlice.actions;\n\nexport default webPubSettingsSlice.reducer;","import { createSlice } from \"@reduxjs/toolkit\";\n\nexport interface AudioSettingsState {\n volume: number;\n playbackRate: number;\n preservePitch: boolean;\n skipBackwardInterval: number;\n skipForwardInterval: number;\n skipInterval: number;\n pollInterval: number;\n autoPlay: boolean;\n enableMediaSession: boolean;\n}\n\nconst initialState: AudioSettingsState = {\n volume: 1,\n playbackRate: 1,\n preservePitch: true,\n skipBackwardInterval: 10,\n skipForwardInterval: 10,\n skipInterval: 10,\n pollInterval: 1000,\n autoPlay: true,\n enableMediaSession: true,\n};\n\nexport const audioSettingsSlice = createSlice({\n name: \"audioSettings\",\n initialState,\n reducers: {\n setVolume: (state, action) => {\n state.volume = action.payload;\n },\n setPlaybackRate: (state, action) => {\n state.playbackRate = action.payload;\n },\n setPreservePitch: (state, action) => {\n state.preservePitch = action.payload;\n },\n setSkipBackwardInterval: (state, action) => {\n state.skipBackwardInterval = action.payload;\n },\n setSkipForwardInterval: (state, action) => {\n state.skipForwardInterval = action.payload;\n },\n setSkipInterval: (state, action) => {\n state.skipInterval = action.payload;\n },\n setPollInterval: (state, action) => {\n state.pollInterval = action.payload;\n },\n setAutoPlay: (state, action) => {\n state.autoPlay = action.payload;\n },\n setEnableMediaSession: (state, action) => {\n state.enableMediaSession = action.payload;\n },\n },\n});\n\nexport const {\n setVolume,\n setPlaybackRate,\n setPreservePitch,\n setSkipBackwardInterval,\n setSkipForwardInterval,\n setSkipInterval,\n setPollInterval,\n setAutoPlay,\n setEnableMediaSession,\n} = audioSettingsSlice.actions;\n\nexport default audioSettingsSlice.reducer;\n","import { createSlice } from \"@reduxjs/toolkit\";\n\nexport type PlayerStatus = \"idle\" | \"playing\" | \"paused\";\n\nexport interface SeekableRange {\n start: number;\n end: number;\n}\n\nexport interface SleepTimerState {\n remainingSeconds: number | null;\n onTrackEnd: boolean;\n onFragmentEnd: boolean;\n}\n\nexport type RemotePlaybackState = \"connecting\" | \"connected\" | \"disconnected\" | \"error\";\n\nexport interface PlayerReducerState {\n status: PlayerStatus;\n isSeeking: boolean;\n isStalled: boolean;\n isTrackReady: boolean;\n sleepTimer: SleepTimerState;\n remotePlaybackState: RemotePlaybackState | null;\n seekableRanges: SeekableRange[];\n}\n\nconst initialState: PlayerReducerState = {\n status: \"idle\",\n isSeeking: false,\n isStalled: false,\n isTrackReady: false,\n sleepTimer: { remainingSeconds: null, onTrackEnd: false, onFragmentEnd: false },\n remotePlaybackState: null,\n seekableRanges: [],\n};\n\nexport const playerSlice = createSlice({\n name: \"player\",\n initialState,\n reducers: {\n setStatus: (state, action: { payload: PlayerStatus }) => {\n state.status = action.payload;\n },\n setSeeking: (state, action: { payload: boolean }) => {\n state.isSeeking = action.payload;\n },\n setStalled: (state, action: { payload: boolean }) => {\n state.isStalled = action.payload;\n },\n setTrackReady: (state, action: { payload: boolean }) => {\n state.isTrackReady = action.payload;\n },\n setSleepTimerRemainingSeconds: (state, action: { payload: number | null }) => {\n state.sleepTimer.remainingSeconds = action.payload;\n },\n setSleepTimerOnTrackEnd: (state, action: { payload: boolean }) => {\n state.sleepTimer.onTrackEnd = action.payload;\n },\n setSleepTimerOnFragmentEnd: (state, action: { payload: boolean }) => {\n state.sleepTimer.onFragmentEnd = action.payload;\n },\n setRemotePlaybackState: (state, action: { payload: RemotePlaybackState | null }) => {\n state.remotePlaybackState = action.payload;\n },\n setSeekableRanges: (state, action: { payload: SeekableRange[] }) => {\n state.seekableRanges = action.payload;\n },\n },\n});\n\nexport const {\n setStatus,\n setSeeking,\n setStalled,\n setTrackReady,\n setSleepTimerRemainingSeconds,\n setSleepTimerOnTrackEnd,\n setSleepTimerOnFragmentEnd,\n setRemotePlaybackState,\n setSeekableRanges\n} = playerSlice.actions;\n\nexport default playerSlice.reducer;\n","export default function debounce(function_, wait = 100, options = {}) {\n\tif (typeof function_ !== 'function') {\n\t\tthrow new TypeError(`Expected the first parameter to be a function, got \\`${typeof function_}\\`.`);\n\t}\n\n\tif (wait < 0) {\n\t\tthrow new RangeError('`wait` must not be negative.');\n\t}\n\n\tif (typeof options === 'boolean') {\n\t\tthrow new TypeError('The `options` parameter must be an object, not a boolean. Use `{immediate: true}` instead.');\n\t}\n\n\tconst {immediate} = options;\n\n\tlet storedContext;\n\tlet storedArguments;\n\tlet timeoutId;\n\tlet timestamp;\n\tlet result;\n\n\tfunction run() {\n\t\tconst callContext = storedContext;\n\t\tconst callArguments = storedArguments;\n\t\tstoredContext = undefined;\n\t\tstoredArguments = undefined;\n\t\tresult = function_.apply(callContext, callArguments);\n\t\treturn result;\n\t}\n\n\tfunction later() {\n\t\tconst last = Date.now() - timestamp;\n\n\t\tif (last < wait && last >= 0) {\n\t\t\ttimeoutId = setTimeout(later, wait - last);\n\t\t} else {\n\t\t\ttimeoutId = undefined;\n\n\t\t\tif (!immediate) {\n\t\t\t\tresult = run();\n\t\t\t}\n\t\t}\n\t}\n\n\tconst debounced = function (...arguments_) {\n\t\tif (\n\t\t\tstoredContext\n\t\t\t&& this !== storedContext\n\t\t\t&& Object.getPrototypeOf(this) === Object.getPrototypeOf(storedContext)\n\t\t) {\n\t\t\tthrow new Error('Debounced method called with different contexts of the same prototype.');\n\t\t}\n\n\t\tstoredContext = this; // eslint-disable-line unicorn/no-this-assignment\n\t\tstoredArguments = arguments_;\n\t\ttimestamp = Date.now();\n\n\t\tconst callNow = immediate && !timeoutId;\n\n\t\tif (!timeoutId) {\n\t\t\ttimeoutId = setTimeout(later, wait);\n\t\t}\n\n\t\tif (callNow) {\n\t\t\tresult = run();\n\t\t\treturn result;\n\t\t}\n\n\t\treturn undefined;\n\t};\n\n\tObject.defineProperty(debounced, 'isPending', {\n\t\tget() {\n\t\t\treturn timeoutId !== undefined;\n\t\t},\n\t});\n\n\tdebounced.clear = () => {\n\t\tif (!timeoutId) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout(timeoutId);\n\t\ttimeoutId = undefined;\n\t\tstoredContext = undefined;\n\t\tstoredArguments = undefined;\n\t};\n\n\tdebounced.flush = () => {\n\t\tif (!timeoutId) {\n\t\t\treturn;\n\t\t}\n\n\t\tdebounced.trigger();\n\t};\n\n\tdebounced.trigger = () => {\n\t\tresult = run();\n\n\t\tdebounced.clear();\n\t};\n\n\treturn debounced;\n}\n","import { ThDockingKeys } from \"@/preferences/models\";\n\nimport { configureStore, Reducer } from \"@reduxjs/toolkit\";\n\nimport readerReducer, { ReaderReducerState } from \"@/lib/readerReducer\";\nimport settingsReducer, { SettingsReducerState } from \"@/lib/settingsReducer\";\nimport themeReducer, { ThemeReducerState } from \"@/lib/themeReducer\";\nimport actionsReducer, { ActionsReducerState, ActionStateObject } from \"@/lib/actionsReducer\";\nimport publicationReducer, { PublicationReducerState } from \"./publicationReducer\";\nimport preferencesReducer, { PreferencesReducerState } from \"./preferencesReducer\";\nimport globalPreferencesReducer, { GlobalPreferencesReducerState } from \"./globalPreferencesReducer\";\nimport webPubSettingsReducer, { WebPubSettingsReducerState } from \"./webPubSettingsReducer\";\nimport audioSettingsReducer, { AudioSettingsState } from \"./audioSettingsReducer\";\nimport playerReducer, { PlayerReducerState } from \"./playerReducer\";\n\nimport debounce from \"debounce\";\n\ninterface ExternalReducerConfig {\n reducer: any;\n persist?: boolean;\n}\n\n// Define the shape of the root state\nexport type RootState = {\n reader: ReaderReducerState;\n settings: SettingsReducerState;\n theming: ThemeReducerState;\n actions: ActionsReducerState;\n publication: PublicationReducerState;\n preferences: PreferencesReducerState;\n globalPreferences: GlobalPreferencesReducerState;\n webPubSettings: WebPubSettingsReducerState;\n audioSettings: AudioSettingsState;\n player: PlayerReducerState;\n [key: string]: any; // For external reducers\n};\n\nconst DEFAULT_STORAGE_KEY = \"thorium-web-state\";\n\n// Migrate font family state\nconst migrateFontFamily = (stateSlice: SettingsReducerState | WebPubSettingsReducerState) => {\n if (stateSlice?.fontFamily && typeof stateSlice.fontFamily === \"string\") {\n return {\n ...stateSlice,\n fontFamily: {\n default: stateSlice.fontFamily\n }\n };\n }\n return stateSlice;\n};\n\n\nconst updateActionsState = (state: ActionsReducerState) => {\n // Check if keys are already profile-keyed\n if (state.keys && typeof state.keys === \"object\" && (\"epub\" in state.keys || \"webPub\" in state.keys || \"audio\" in state.keys)) {\n // Keys are already profile-keyed, update each profile\n const updatedKeys: any = {};\n for (const profile in state.keys) {\n updatedKeys[profile] = Object.fromEntries(\n Object.entries(state.keys[profile]).map(([key, value]: [string, ActionStateObject | undefined]) => [\n key,\n {\n ...value,\n // Transient/undocked actions should never re-open on load\n // Docked actions reset to null so useDocking re-establishes open state\n // based on the actual breakpoint at load time (avoids opening docked\n // sheets in fullscreen/compact where docking is unavailable)\n isOpen: (value?.docking === ThDockingKeys.transient || value?.docking == null)\n ? false\n : (value?.docking === ThDockingKeys.start || value?.docking === ThDockingKeys.end)\n ? null\n : value?.isOpen,\n },\n ])\n );\n }\n return {\n ...state,\n keys: updatedKeys,\n overflow: {}\n };\n } else {\n // Keys are still flat, update them\n const updatedKeys = Object.fromEntries(\n Object.entries(state.keys).map(([key, value]: [string, ActionStateObject | undefined]) => [\n key,\n {\n ...value,\n isOpen: (value?.docking === ThDockingKeys.transient || value?.docking == null)\n ? false\n : (value?.docking === ThDockingKeys.start || value?.docking === ThDockingKeys.end)\n ? null\n : value?.isOpen,\n },\n ])\n );\n return {\n ...state,\n keys: updatedKeys,\n overflow: {}\n };\n }\n};\n\nconst migrateDockStateToProfileKeyed = (state: ActionsReducerState): ActionsReducerState => {\n // Check if dock state is in old format (not profile-keyed)\n if (state.dock && typeof state.dock === \"object\" && !(\"epub\" in state.dock || \"webPub\" in state.dock || \"audio\" in state.dock)) {\n // Old format: dock has direct start/end keys\n const oldDock = state.dock as any;\n if (oldDock[ThDockingKeys.start] || oldDock[ThDockingKeys.end]) {\n // Migrate to new profile-keyed format, only for epub profile\n const newDock: any = {};\n newDock[\"epub\"] = {\n [ThDockingKeys.start]: oldDock[ThDockingKeys.start] || { actionKey: null, active: false, collapsed: false },\n [ThDockingKeys.end]: oldDock[ThDockingKeys.end] || { actionKey: null, active: false, collapsed: false }\n };\n return {\n ...state,\n dock: newDock\n };\n }\n }\n return state;\n};\n\nconst migrateKeysStateToProfileKeyed = (state: ActionsReducerState): ActionsReducerState => {\n // If keys is not profile-keyed, migrate to profile-keyed format\n // Old format: keys is a flat object like { [key]: ActionStateObject }\n // New format: keys is profile-keyed like { epub: { [key]: ActionStateObject }, webPub: { ... }, audio: { ... } }\n if (!state.keys) {\n return state;\n }\n \n // Check if keys is already profile-keyed by looking for known profile keys\n const isProfileKeyed = \"epub\" in state.keys || \"webPub\" in state.keys || \"audio\" in state.keys;\n \n if (!isProfileKeyed) {\n // Old flat format - migrate to epub profile\n const oldKeys = state.keys as any;\n const newKeys: any = {\n epub: { ...oldKeys },\n webPub: {},\n audio: {}\n };\n return {\n ...state,\n keys: newKeys\n };\n }\n \n // Ensure all profile keys exist even if some are missing\n const migratedKeys: any = {\n epub: state.keys.epub || {},\n webPub: state.keys.webPub || {},\n audio: state.keys.audio || {}\n };\n \n return {\n ...state,\n keys: migratedKeys\n };\n};\n\nconst loadState = (storageKey: string = DEFAULT_STORAGE_KEY) => {\n try {\n const resolvedKey = storageKey || DEFAULT_STORAGE_KEY;\n const serializedState = localStorage.getItem(resolvedKey);\n if (serializedState === null) {\n return {\n actions: undefined,\n settings: undefined,\n theming: undefined,\n preferences: undefined,\n globalPreferences: undefined,\n webPubSettings: undefined,\n audioSettings: undefined\n };\n }\n \n // Parse the state\n let state = JSON.parse(serializedState);\n \n // Apply migrations\n if (state && state.actions) {\n state.actions = migrateDockStateToProfileKeyed(state.actions);\n state.actions = migrateKeysStateToProfileKeyed(state.actions);\n state.actions = updateActionsState(state.actions);\n }\n if (state) {\n if (state.settings) {\n state.settings = migrateFontFamily(state.settings);\n }\n if (state.webPubSettings) {\n state.webPubSettings = migrateFontFamily(state.webPubSettings);\n }\n if (state.actions) {\n state.actions = updateActionsState(state.actions);\n // Migrate dock state to profile-keyed format if needed\n // Old dock state only applied to epub profile\n state.actions = migrateDockStateToProfileKeyed(state.actions);\n }\n }\n \n return state;\n } catch (err) {\n return {\n actions: undefined,\n settings: undefined,\n theming: undefined,\n preferences: undefined,\n globalPreferences: undefined,\n webPubSettings: undefined\n };\n }\n};\n\nconst saveState = (state: any, storageKey?: string, externalReducers: Record<string, ExternalReducerConfig> = {}) => {\n try {\n const resolvedKey = storageKey || DEFAULT_STORAGE_KEY;\n \n // Only persist the state of reducers that are marked for persistence\n const stateToPersist: any = {};\n \n // Internal reducers to persist\n if (state.actions) stateToPersist.actions = state.actions;\n if (state.settings) stateToPersist.settings = state.settings;\n if (state.theming) stateToPersist.theming = state.theming;\n if (state.preferences) stateToPersist.preferences = state.preferences;\n if (state.globalPreferences) stateToPersist.globalPreferences = state.globalPreferences;\n if (state.webPubSettings) stateToPersist.webPubSettings = state.webPubSettings;\n if (state.audioSettings) stateToPersist.audioSettings = state.audioSettings;\n \n // External reducers to persist\n Object.entries(externalReducers).forEach(([key, config]) => {\n if (config.persist && state[key] !== undefined) {\n stateToPersist[key] = state[key];\n }\n });\n \n const serializedState = JSON.stringify(stateToPersist);\n localStorage.setItem(resolvedKey, serializedState);\n } catch (err) {\n console.error(err);\n }\n};\n\nexport const makeStore = (storageKey?: string, externalReducers: Record<string, ExternalReducerConfig> = {}) => {\n // Combine internal and external reducers\n const combinedReducers = {\n reader: readerReducer,\n settings: settingsReducer,\n theming: themeReducer,\n actions: actionsReducer,\n publication: publicationReducer,\n preferences: preferencesReducer,\n globalPreferences: globalPreferencesReducer,\n webPubSettings: webPubSettingsReducer,\n audioSettings: audioSettingsReducer,\n player: playerReducer,\n ...Object.entries(externalReducers).reduce((acc, [key, config]) => ({\n ...acc,\n [key]: config.reducer\n }), {})\n };\n\n // Get persisted state for internal reducers\n const persistedState = loadState(storageKey);\n \n // Create preloaded state with persisted values\n const preloadedState: any = {\n actions: persistedState.actions,\n settings: persistedState.settings,\n theming: persistedState.theming,\n preferences: persistedState.preferences,\n globalPreferences: persistedState.globalPreferences,\n webPubSettings: persistedState.webPubSettings,\n audioSettings: persistedState.audioSettings,\n // Include persisted state for external reducers that have it\n ...Object.entries(externalReducers).reduce((acc, [key, config]) => {\n if (config.persist && persistedState[key] !== undefined) {\n return { ...acc, [key]: persistedState[key] };\n }\n return acc;\n }, {})\n };\n\n const store = configureStore({\n reducer: combinedReducers as unknown as Reducer<RootState>,\n preloadedState,\n });\n\n const saveStateDebounced = debounce(() => {\n saveState(store.getState(), storageKey, externalReducers);\n }, 250);\n\n store.subscribe(saveStateDebounced);\n\n return store;\n}\n\n// Infer the type of makeStore\nexport type AppStore = ReturnType<typeof makeStore>;\n// Infer the `RootState` and `AppDispatch` types from the store itself\n// Export the RootState type for external use\nexport type AppState = RootState;\nexport type AppDispatch = AppStore[\"dispatch\"];","\"use client\";\n\nimport { useRef } from \"react\";\nimport { Provider } from \"react-redux\";\nimport { makeStore, AppStore } from \"./store\";\n\nexport const ThStoreProvider = ({\n storageKey,\n store,\n children\n}: {\n storageKey?: string,\n store?: AppStore,\n children: React.ReactNode\n}) => {\n const storeRef = useRef<AppStore | null>(null);\n if (!storeRef.current) {\n storeRef.current = store || makeStore(storageKey);\n }\n\n return <Provider store={ storeRef.current }>{ children }</Provider>\n}\n\nexport default ThStoreProvider;","import { Store } from \"@reduxjs/toolkit\";\n\nimport { ThPreferences, CustomizableKeys } from \"../preferences/preferences\";\n\nimport { ThPreferencesAdapter } from \"../preferences/adapters/ThPreferencesAdapter\";\n\nimport { AppState } from \"@/lib/store\";\nimport { preferencesSlice } from \"@/lib/preferencesReducer\";\nimport { mapStateToPreferences } from \"@/lib/helpers/mapPreferences\";\n\nexport class ThReduxPreferencesAdapter<T extends CustomizableKeys = CustomizableKeys> implements ThPreferencesAdapter<T> {\n private store: Store<AppState>;\n private listeners: Set<(prefs: ThPreferences<T>) => void> = new Set();\n private currentPreferences: ThPreferences<T>;\n\n constructor(store: Store<AppState>, initialPreferences: ThPreferences<T>) {\n this.store = store;\n this.currentPreferences = initialPreferences;\n \n this.store.subscribe(() => {\n const state = this.store.getState();\n const prefs = this.mapStateToPreferences(state);\n if (JSON.stringify(prefs) !== JSON.stringify(this.currentPreferences)) {\n this.currentPreferences = prefs;\n this.notifyListeners(prefs);\n }\n });\n }\n\n public getPreferences(): ThPreferences<T> {\n return { ...this.currentPreferences };\n }\n\n public setPreferences(prefs: ThPreferences<T>): void {\n this.currentPreferences = prefs;\n this.store.dispatch(preferencesSlice.actions.updateFromPreferences(prefs as any));\n this.notifyListeners(prefs);\n }\n\n public subscribe(listener: (prefs: ThPreferences<T>) => void): void {\n this.listeners.add(listener);\n listener(this.getPreferences());\n }\n\n public unsubscribe(listener: (prefs: ThPreferences<T>) => void): void {\n this.listeners.delete(listener);\n }\n\n private mapStateToPreferences(state: AppState): ThPreferences<T> {\n if (!state.preferences) return this.currentPreferences;\n \n const updatedPrefs = mapStateToPreferences<T>(state.preferences, { ...this.currentPreferences });\n return updatedPrefs;\n }\n\n private notifyListeners(prefs: ThPreferences<T>): void {\n const prefsCopy = JSON.parse(JSON.stringify(prefs));\n this.listeners.forEach(callback => callback(prefsCopy));\n }\n}\n","import { Store } from \"@reduxjs/toolkit\";\n\nimport { ThGlobalPreferences } from \"@/preferences/globalPreferences\";\nimport { ThGlobalPreferencesAdapter } from \"@/preferences/adapters/ThGlobalPreferencesAdapter\";\nimport { AppState } from \"@/lib/store\";\nimport { setLocale } from \"@/lib/globalPreferencesReducer\";\n\nexport class ThReduxGlobalPreferencesAdapter implements ThGlobalPreferencesAdapter {\n private store: Store<AppState>;\n private listeners: Set<(prefs: ThGlobalPreferences) => void> = new Set();\n private currentPreferences: ThGlobalPreferences;\n\n constructor(store: Store<AppState>, initialPreferences: ThGlobalPreferences = {}) {\n this.store = store;\n this.currentPreferences = initialPreferences;\n\n this.store.subscribe(() => {\n const locale = this.store.getState().globalPreferences?.locale;\n const next: ThGlobalPreferences = { locale };\n if (JSON.stringify(next) !== JSON.stringify(this.currentPreferences)) {\n this.currentPreferences = next;\n this.notifyListeners(next);\n }\n });\n }\n\n getPreferences(): ThGlobalPreferences {\n return { ...this.currentPreferences };\n }\n\n setPreferences(prefs: ThGlobalPreferences): void {\n this.currentPreferences = { ...prefs };\n this.store.dispatch(setLocale(prefs.locale));\n this.notifyListeners(this.currentPreferences);\n }\n\n subscribe(callback: (prefs: ThGlobalPreferences) => void): void {\n this.listeners.add(callback);\n callback(this.getPreferences());\n }\n\n unsubscribe(callback: (prefs: ThGlobalPreferences) => void): void {\n this.listeners.delete(callback);\n }\n\n private notifyListeners(prefs: ThGlobalPreferences): void {\n const copy = { ...prefs };\n this.listeners.forEach(cb => cb(copy));\n }\n}\n"]}