@edrlab/thorium-web 1.3.0 → 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 (111) 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-BhG1wicI.d.mts → actionsReducer-B32cq2mB.d.mts} +11 -4
  5. package/dist/{chunk-L4XGZAZ5.mjs → chunk-2YRT7RNW.mjs} +20 -3
  6. package/dist/chunk-2YRT7RNW.mjs.map +1 -0
  7. package/dist/{chunk-UCTMVCW7.mjs → chunk-6MONB2DN.mjs} +91 -63
  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-OWHP7ONM.mjs → chunk-IVXRCKWR.mjs} +4 -4
  14. package/dist/{chunk-OWHP7ONM.mjs.map → chunk-IVXRCKWR.mjs.map} +1 -1
  15. package/dist/{chunk-RRVLWDT3.mjs → chunk-KVUG6BNI.mjs} +92 -27
  16. package/dist/chunk-KVUG6BNI.mjs.map +1 -0
  17. package/dist/{chunk-IYAFKTPL.mjs → chunk-NUXGQWED.mjs} +7 -5
  18. package/dist/chunk-NUXGQWED.mjs.map +1 -0
  19. package/dist/{chunk-4ODYHZKD.mjs → chunk-P6ILEQ5P.mjs} +49 -51
  20. package/dist/chunk-P6ILEQ5P.mjs.map +1 -0
  21. package/dist/{chunk-D7MFLHXV.mjs → chunk-PXXWEMNL.mjs} +951 -592
  22. package/dist/chunk-PXXWEMNL.mjs.map +1 -0
  23. package/dist/{chunk-T2E6MRVP.mjs → chunk-QUSGPT5M.mjs} +11 -12
  24. package/dist/chunk-QUSGPT5M.mjs.map +1 -0
  25. package/dist/{chunk-XBZWGRDM.mjs → chunk-SZAVAQ6S.mjs} +30 -6
  26. package/dist/chunk-SZAVAQ6S.mjs.map +1 -0
  27. package/dist/{chunk-3LDWKC5N.mjs → chunk-T5ENYSDJ.mjs} +5 -5
  28. package/dist/chunk-T5ENYSDJ.mjs.map +1 -0
  29. package/dist/{chunk-4TVEDX7L.mjs → chunk-TSLTLQ6O.mjs} +127 -41
  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-YZ3KCMKY.mjs → chunk-WLVE3WNW.mjs} +238 -58
  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 +14 -14
  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 +15 -15
  43. package/dist/components/Misc/index.css +2 -2
  44. package/dist/components/Misc/index.css.map +1 -1
  45. package/dist/components/Misc/index.mjs +4 -4
  46. package/dist/components/Reader/index.css +5 -5
  47. package/dist/components/Reader/index.css.map +1 -1
  48. package/dist/components/Reader/index.d.mts +11 -11
  49. package/dist/components/Reader/index.mjs +26 -24
  50. package/dist/components/Reader/index.mjs.map +1 -1
  51. package/dist/components/WebPub/index.css +3 -3
  52. package/dist/components/WebPub/index.css.map +1 -1
  53. package/dist/components/WebPub/index.d.mts +12 -12
  54. package/dist/components/WebPub/index.mjs +15 -15
  55. package/dist/core/Components/index.d.mts +11 -21
  56. package/dist/core/Components/index.mjs +1 -1
  57. package/dist/core/Helpers/index.d.mts +1 -1
  58. package/dist/core/Helpers/index.mjs +2 -3
  59. package/dist/core/Hooks/index.d.mts +12 -8
  60. package/dist/core/Hooks/index.mjs +1 -1
  61. package/dist/i18n/index.mjs +3 -6
  62. package/dist/lib/index.d.mts +49 -20
  63. package/dist/lib/index.mjs +3 -2
  64. package/dist/locales/da/thorium-shared.json +3 -0
  65. package/dist/locales/en/thorium-shared.json +24 -2
  66. package/dist/locales/en/thorium-web.json +2 -2
  67. package/dist/locales/es/thorium-shared.json +364 -0
  68. package/dist/locales/es/thorium-web.json +130 -0
  69. package/dist/locales/et/thorium-shared.json +121 -9
  70. package/dist/locales/et/thorium-web.json +32 -1
  71. package/dist/locales/fi/thorium-shared.json +42 -4
  72. package/dist/locales/fi/thorium-web.json +36 -2
  73. package/dist/locales/fr/thorium-shared.json +108 -1
  74. package/dist/locales/fr/thorium-web.json +121 -86
  75. package/dist/locales/it/thorium-shared.json +108 -1
  76. package/dist/locales/it/thorium-web.json +15 -2
  77. package/dist/locales/lt/thorium-web.json +10 -1
  78. package/dist/locales/pl/thorium-web.json +1 -1
  79. package/dist/locales/pt-BR/thorium-shared.json +6 -0
  80. package/dist/locales/pt-BR/thorium-web.json +88 -88
  81. package/dist/locales/pt-PT/thorium-shared.json +91 -0
  82. package/dist/locales/pt-PT/thorium-web.json +15 -3
  83. package/dist/locales/sv/thorium-shared.json +108 -2
  84. package/dist/locales/sv/thorium-web.json +15 -3
  85. package/dist/locales/tr/thorium-shared.json +42 -0
  86. package/dist/preferences/index.d.mts +59 -13
  87. package/dist/preferences/index.mjs +6 -6
  88. package/dist/{settingsReducer-Bu1zeveu.d.mts → settingsReducer-DLaT2wUB.d.mts} +14 -2
  89. package/dist/{ui-nBv8gfr0.d.mts → ui-DnZZhozX.d.mts} +1 -1
  90. package/dist/{useAudioNavigator-C5aW4-eT.d.mts → useAudioNavigator-CWXyNWq1.d.mts} +3 -1
  91. package/dist/{useContrast-2t429O9O.d.mts → useContrast-Bo7cDw_X.d.mts} +5 -1
  92. package/dist/{usePreferences-VaBf46eP.d.mts → usePreferences-D8NU1yhP.d.mts} +6 -8
  93. package/dist/{useReaderTransitions-JDzlBFsu.d.mts → useReaderTransitions-BQGzKeY2.d.mts} +61 -10
  94. package/package.json +12 -11
  95. package/dist/chunk-3LDWKC5N.mjs.map +0 -1
  96. package/dist/chunk-4ODYHZKD.mjs.map +0 -1
  97. package/dist/chunk-4TVEDX7L.mjs.map +0 -1
  98. package/dist/chunk-7CGMWOZN.mjs +0 -20
  99. package/dist/chunk-7CGMWOZN.mjs.map +0 -1
  100. package/dist/chunk-C236BQQB.mjs +0 -1725
  101. package/dist/chunk-C236BQQB.mjs.map +0 -1
  102. package/dist/chunk-D7MFLHXV.mjs.map +0 -1
  103. package/dist/chunk-IYAFKTPL.mjs.map +0 -1
  104. package/dist/chunk-L4XGZAZ5.mjs.map +0 -1
  105. package/dist/chunk-RRVLWDT3.mjs.map +0 -1
  106. package/dist/chunk-T2E6MRVP.mjs.map +0 -1
  107. package/dist/chunk-UCTMVCW7.mjs.map +0 -1
  108. package/dist/chunk-WECWPYZB.mjs +0 -1950
  109. package/dist/chunk-WECWPYZB.mjs.map +0 -1
  110. package/dist/chunk-XBZWGRDM.mjs.map +0 -1
  111. package/dist/chunk-YZ3KCMKY.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;
@@ -329,8 +339,49 @@ var {
329
339
  } = themeSlice.actions;
330
340
  var themeReducer_default = themeSlice.reducer;
331
341
  var initialState4 = {
332
- dock: {},
333
- keys: {},
342
+ dock: {
343
+ epub: {
344
+ ["dockingStart" /* start */]: {
345
+ actionKey: null,
346
+ active: false,
347
+ collapsed: false
348
+ },
349
+ ["dockingEnd" /* end */]: {
350
+ actionKey: null,
351
+ active: false,
352
+ collapsed: false
353
+ }
354
+ },
355
+ webPub: {
356
+ ["dockingStart" /* start */]: {
357
+ actionKey: null,
358
+ active: false,
359
+ collapsed: false
360
+ },
361
+ ["dockingEnd" /* end */]: {
362
+ actionKey: null,
363
+ active: false,
364
+ collapsed: false
365
+ }
366
+ },
367
+ audio: {
368
+ ["dockingStart" /* start */]: {
369
+ actionKey: null,
370
+ active: false,
371
+ collapsed: false
372
+ },
373
+ ["dockingEnd" /* end */]: {
374
+ actionKey: null,
375
+ active: false,
376
+ collapsed: false
377
+ }
378
+ }
379
+ },
380
+ keys: {
381
+ epub: {},
382
+ webPub: {},
383
+ audio: {}
384
+ },
334
385
  overflow: {}
335
386
  };
336
387
  var initializeProfileDock = (state, profile) => {
@@ -349,6 +400,11 @@ var initializeProfileDock = (state, profile) => {
349
400
  };
350
401
  }
351
402
  };
403
+ var initializeProfileKeys = (state, profile) => {
404
+ if (!state.keys[profile]) {
405
+ state.keys[profile] = {};
406
+ }
407
+ };
352
408
  var actionsSlice = createSlice({
353
409
  name: "actions",
354
410
  initialState: initialState4,
@@ -356,13 +412,15 @@ var actionsSlice = createSlice({
356
412
  dockAction: (state, action) => {
357
413
  const { key, dockingKey, profile } = action.payload;
358
414
  initializeProfileDock(state, profile);
415
+ initializeProfileKeys(state, profile);
359
416
  const profileDock = state.dock[profile];
417
+ const profileKeys = state.keys[profile];
360
418
  switch (dockingKey) {
361
419
  case "dockingStart" /* start */:
362
- for (const k in state.keys) {
363
- if (state.keys[k]?.docking === dockingKey) {
364
- state.keys[k] = {
365
- ...state.keys[k],
420
+ for (const k in profileKeys) {
421
+ if (profileKeys[k]?.docking === dockingKey) {
422
+ profileKeys[k] = {
423
+ ...profileKeys[k],
366
424
  docking: "dockingTransient" /* transient */,
367
425
  isOpen: false
368
426
  };
@@ -380,10 +438,10 @@ var actionsSlice = createSlice({
380
438
  }
381
439
  break;
382
440
  case "dockingEnd" /* end */:
383
- for (const k in state.keys) {
384
- if (state.keys[k]?.docking === dockingKey) {
385
- state.keys[k] = {
386
- ...state.keys[k],
441
+ for (const k in profileKeys) {
442
+ if (profileKeys[k]?.docking === dockingKey) {
443
+ profileKeys[k] = {
444
+ ...profileKeys[k],
387
445
  docking: "dockingTransient" /* transient */,
388
446
  isOpen: false
389
447
  };
@@ -417,21 +475,26 @@ var actionsSlice = createSlice({
417
475
  }
418
476
  break;
419
477
  }
420
- state.keys[key] = {
421
- ...state.keys[key],
478
+ profileKeys[key] = {
479
+ ...profileKeys[key],
422
480
  docking: dockingKey
423
481
  };
424
482
  },
425
483
  setActionOpen: (state, action) => {
426
- state.keys[action.payload.key] = {
427
- ...state.keys[action.payload.key],
428
- isOpen: action.payload.isOpen
484
+ const { key, isOpen, profile } = action.payload;
485
+ initializeProfileKeys(state, profile);
486
+ state.keys[profile][key] = {
487
+ ...state.keys[profile][key],
488
+ isOpen
429
489
  };
430
490
  },
431
491
  toggleActionOpen: (state, action) => {
492
+ const { key, profile } = action.payload;
493
+ initializeProfileKeys(state, profile);
432
494
  const payload = {
433
- key: action.payload.key,
434
- isOpen: state.keys[action.payload.key]?.isOpen ? !state.keys[action.payload.key]?.isOpen : true
495
+ key,
496
+ isOpen: state.keys[profile][key]?.isOpen ? !state.keys[profile][key]?.isOpen : true,
497
+ profile
435
498
  };
436
499
  actionsSlice.caseReducers.setActionOpen(state, {
437
500
  type: "toggleActionOpen",
@@ -479,10 +542,11 @@ var actionsSlice = createSlice({
479
542
  setDockPanelWidth: (state, action) => {
480
543
  const { key, width, profile } = action.payload;
481
544
  initializeProfileDock(state, profile);
545
+ initializeProfileKeys(state, profile);
482
546
  const dockKey = state.dock[profile][key].actionKey;
483
547
  if (dockKey) {
484
- state.keys[dockKey] = {
485
- ...state.keys[dockKey],
548
+ state.keys[profile][dockKey] = {
549
+ ...state.keys[profile][dockKey],
486
550
  dockedWidth: width
487
551
  };
488
552
  }
@@ -509,6 +573,7 @@ var initialState5 = {
509
573
  fontLanguage: "default",
510
574
  isFXL: false,
511
575
  isRTL: false,
576
+ scriptMode: "ltr",
512
577
  hasDisplayTransformability: false,
513
578
  positionsList: [],
514
579
  atPublicationStart: false,
@@ -529,6 +594,9 @@ var publicationSlice = createSlice({
529
594
  setRTL: (state, action) => {
530
595
  state.isRTL = action.payload;
531
596
  },
597
+ setScriptMode: (state, action) => {
598
+ state.scriptMode = action.payload;
599
+ },
532
600
  setHasDisplayTransformability: (state, action) => {
533
601
  state.hasDisplayTransformability = action.payload;
534
602
  },
@@ -579,6 +647,7 @@ var {
579
647
  setFontLanguage,
580
648
  setFXL,
581
649
  setRTL,
650
+ setScriptMode,
582
651
  setHasDisplayTransformability,
583
652
  setPositionsList,
584
653
  setPublicationStart,
@@ -623,10 +692,6 @@ var mapPaginatedAffordance = (format) => {
623
692
  };
624
693
  var mapPreferencesToState = (prefs) => {
625
694
  return {
626
- l10n: {
627
- locale: prefs.locale,
628
- direction: prefs.direction
629
- },
630
695
  progressionFormat: {
631
696
  reflow: mapRenditionFormat(
632
697
  prefs.theming?.progression?.format?.reflow
@@ -706,8 +771,6 @@ var mapStateToPreferences = (state, currentPrefs) => {
706
771
  };
707
772
  return {
708
773
  ...currentPrefs,
709
- locale: state.l10n?.locale ?? currentPrefs.locale,
710
- direction: state.l10n?.direction ?? currentPrefs.direction,
711
774
  theming: {
712
775
  ...currentPrefs.theming,
713
776
  ...state.progressionFormat && {
@@ -797,9 +860,6 @@ var preferencesSlice = createSlice({
797
860
  name: "preferences",
798
861
  initialState: initialState6,
799
862
  reducers: {
800
- setL10n: (state, action) => {
801
- state.l10n = action.payload;
802
- },
803
863
  setProgressionFormat: (state, action) => {
804
864
  const { key, value, breakpoint } = action.payload;
805
865
  state.progressionFormat = {
@@ -862,7 +922,6 @@ var preferencesSlice = createSlice({
862
922
  }
863
923
  });
864
924
  var {
865
- setL10n,
866
925
  setProgressionFormat,
867
926
  setRunningHeadFormat,
868
927
  setUI,
@@ -871,12 +930,26 @@ var {
871
930
  updateFromPreferences
872
931
  } = preferencesSlice.actions;
873
932
  var preferencesReducer_default = preferencesSlice.reducer;
874
- 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 = {
875
946
  fontFamily: { default: "publisher" },
876
947
  fontWeight: 400,
877
948
  hyphens: null,
878
949
  letterSpacing: null,
950
+ ligatures: null,
879
951
  lineHeight: "publisher" /* publisher */,
952
+ noRuby: null,
880
953
  paragraphIndent: null,
881
954
  paragraphSpacing: null,
882
955
  publisherStyles: true,
@@ -892,7 +965,7 @@ var initialState7 = {
892
965
  };
893
966
  var webPubSettingsSlice = createSlice({
894
967
  name: "webPubSettings",
895
- initialState: initialState7,
968
+ initialState: initialState8,
896
969
  reducers: {
897
970
  setWebPubFontFamily: (state, action) => {
898
971
  const { key, value } = action.payload;
@@ -904,6 +977,9 @@ var webPubSettingsSlice = createSlice({
904
977
  setWebPubHyphens: (state, action) => {
905
978
  state.hyphens = action.payload;
906
979
  },
980
+ setWebPubLigatures: (state, action) => {
981
+ state.ligatures = action.payload;
982
+ },
907
983
  setWebPubLetterSpacing: (state, action) => {
908
984
  handleSpacingSetting(state, action, "letterSpacing" /* letterSpacing */);
909
985
  },
@@ -944,6 +1020,9 @@ var webPubSettingsSlice = createSlice({
944
1020
  setWebPubTextNormalization: (state, action) => {
945
1021
  state.textNormalization = action.payload;
946
1022
  },
1023
+ setWebPubNoRuby: (state, action) => {
1024
+ state.noRuby = action.payload;
1025
+ },
947
1026
  setWebPubWordSpacing: (state, action) => {
948
1027
  handleSpacingSetting(state, action, "wordSpacing" /* wordSpacing */);
949
1028
  },
@@ -952,11 +1031,12 @@ var webPubSettingsSlice = createSlice({
952
1031
  }
953
1032
  }
954
1033
  });
955
- var initialWebPubSettingsState = initialState7;
1034
+ var initialWebPubSettingsState = initialState8;
956
1035
  var {
957
1036
  setWebPubFontFamily,
958
1037
  setWebPubFontWeight,
959
1038
  setWebPubHyphens,
1039
+ setWebPubLigatures,
960
1040
  setWebPubLetterSpacing,
961
1041
  setWebPubLineHeight,
962
1042
  setWebPubParagraphIndent,
@@ -965,11 +1045,12 @@ var {
965
1045
  setWebPubSpacingPreset,
966
1046
  setWebPubTextAlign,
967
1047
  setWebPubTextNormalization,
1048
+ setWebPubNoRuby,
968
1049
  setWebPubWordSpacing,
969
1050
  setWebPubZoom
970
1051
  } = webPubSettingsSlice.actions;
971
1052
  var webPubSettingsReducer_default = webPubSettingsSlice.reducer;
972
- var initialState8 = {
1053
+ var initialState9 = {
973
1054
  volume: 1,
974
1055
  playbackRate: 1,
975
1056
  preservePitch: true,
@@ -982,7 +1063,7 @@ var initialState8 = {
982
1063
  };
983
1064
  var audioSettingsSlice = createSlice({
984
1065
  name: "audioSettings",
985
- initialState: initialState8,
1066
+ initialState: initialState9,
986
1067
  reducers: {
987
1068
  setVolume: (state, action) => {
988
1069
  state.volume = action.payload;
@@ -1025,7 +1106,7 @@ var {
1025
1106
  setEnableMediaSession
1026
1107
  } = audioSettingsSlice.actions;
1027
1108
  var audioSettingsReducer_default = audioSettingsSlice.reducer;
1028
- var initialState9 = {
1109
+ var initialState10 = {
1029
1110
  status: "idle",
1030
1111
  isSeeking: false,
1031
1112
  isStalled: false,
@@ -1036,7 +1117,7 @@ var initialState9 = {
1036
1117
  };
1037
1118
  var playerSlice = createSlice({
1038
1119
  name: "player",
1039
- initialState: initialState9,
1120
+ initialState: initialState10,
1040
1121
  reducers: {
1041
1122
  setStatus: (state, action) => {
1042
1123
  state.status = action.payload;
@@ -1174,20 +1255,44 @@ var migrateFontFamily = (stateSlice) => {
1174
1255
  return stateSlice;
1175
1256
  };
1176
1257
  var updateActionsState = (state) => {
1177
- const updatedKeys = Object.fromEntries(
1178
- Object.entries(state.keys).map(([key, value]) => [
1179
- key,
1180
- {
1181
- ...value,
1182
- isOpen: value?.docking === "dockingTransient" /* transient */ || value?.docking == null && value?.isOpen === true ? false : value?.isOpen
1183
- }
1184
- ])
1185
- );
1186
- return {
1187
- ...state,
1188
- keys: updatedKeys,
1189
- overflow: {}
1190
- };
1258
+ if (state.keys && typeof state.keys === "object" && ("epub" in state.keys || "webPub" in state.keys || "audio" in state.keys)) {
1259
+ const updatedKeys = {};
1260
+ for (const profile in state.keys) {
1261
+ updatedKeys[profile] = Object.fromEntries(
1262
+ Object.entries(state.keys[profile]).map(([key, value]) => [
1263
+ key,
1264
+ {
1265
+ ...value,
1266
+ // Transient/undocked actions should never re-open on load
1267
+ // Docked actions reset to null so useDocking re-establishes open state
1268
+ // based on the actual breakpoint at load time (avoids opening docked
1269
+ // sheets in fullscreen/compact where docking is unavailable)
1270
+ isOpen: value?.docking === "dockingTransient" /* transient */ || value?.docking == null ? false : value?.docking === "dockingStart" /* start */ || value?.docking === "dockingEnd" /* end */ ? null : value?.isOpen
1271
+ }
1272
+ ])
1273
+ );
1274
+ }
1275
+ return {
1276
+ ...state,
1277
+ keys: updatedKeys,
1278
+ overflow: {}
1279
+ };
1280
+ } else {
1281
+ const updatedKeys = Object.fromEntries(
1282
+ Object.entries(state.keys).map(([key, value]) => [
1283
+ key,
1284
+ {
1285
+ ...value,
1286
+ isOpen: value?.docking === "dockingTransient" /* transient */ || value?.docking == null ? false : value?.docking === "dockingStart" /* start */ || value?.docking === "dockingEnd" /* end */ ? null : value?.isOpen
1287
+ }
1288
+ ])
1289
+ );
1290
+ return {
1291
+ ...state,
1292
+ keys: updatedKeys,
1293
+ overflow: {}
1294
+ };
1295
+ }
1191
1296
  };
1192
1297
  var migrateDockStateToProfileKeyed = (state) => {
1193
1298
  if (state.dock && typeof state.dock === "object" && !("epub" in state.dock || "webPub" in state.dock || "audio" in state.dock)) {
@@ -1206,6 +1311,33 @@ var migrateDockStateToProfileKeyed = (state) => {
1206
1311
  }
1207
1312
  return state;
1208
1313
  };
1314
+ var migrateKeysStateToProfileKeyed = (state) => {
1315
+ if (!state.keys) {
1316
+ return state;
1317
+ }
1318
+ const isProfileKeyed = "epub" in state.keys || "webPub" in state.keys || "audio" in state.keys;
1319
+ if (!isProfileKeyed) {
1320
+ const oldKeys = state.keys;
1321
+ const newKeys = {
1322
+ epub: { ...oldKeys },
1323
+ webPub: {},
1324
+ audio: {}
1325
+ };
1326
+ return {
1327
+ ...state,
1328
+ keys: newKeys
1329
+ };
1330
+ }
1331
+ const migratedKeys = {
1332
+ epub: state.keys.epub || {},
1333
+ webPub: state.keys.webPub || {},
1334
+ audio: state.keys.audio || {}
1335
+ };
1336
+ return {
1337
+ ...state,
1338
+ keys: migratedKeys
1339
+ };
1340
+ };
1209
1341
  var loadState = (storageKey = DEFAULT_STORAGE_KEY) => {
1210
1342
  try {
1211
1343
  const resolvedKey = storageKey || DEFAULT_STORAGE_KEY;
@@ -1216,11 +1348,17 @@ var loadState = (storageKey = DEFAULT_STORAGE_KEY) => {
1216
1348
  settings: void 0,
1217
1349
  theming: void 0,
1218
1350
  preferences: void 0,
1351
+ globalPreferences: void 0,
1219
1352
  webPubSettings: void 0,
1220
1353
  audioSettings: void 0
1221
1354
  };
1222
1355
  }
1223
1356
  let state = JSON.parse(serializedState);
1357
+ if (state && state.actions) {
1358
+ state.actions = migrateDockStateToProfileKeyed(state.actions);
1359
+ state.actions = migrateKeysStateToProfileKeyed(state.actions);
1360
+ state.actions = updateActionsState(state.actions);
1361
+ }
1224
1362
  if (state) {
1225
1363
  if (state.settings) {
1226
1364
  state.settings = migrateFontFamily(state.settings);
@@ -1240,6 +1378,7 @@ var loadState = (storageKey = DEFAULT_STORAGE_KEY) => {
1240
1378
  settings: void 0,
1241
1379
  theming: void 0,
1242
1380
  preferences: void 0,
1381
+ globalPreferences: void 0,
1243
1382
  webPubSettings: void 0
1244
1383
  };
1245
1384
  }
@@ -1252,6 +1391,7 @@ var saveState = (state, storageKey, externalReducers = {}) => {
1252
1391
  if (state.settings) stateToPersist.settings = state.settings;
1253
1392
  if (state.theming) stateToPersist.theming = state.theming;
1254
1393
  if (state.preferences) stateToPersist.preferences = state.preferences;
1394
+ if (state.globalPreferences) stateToPersist.globalPreferences = state.globalPreferences;
1255
1395
  if (state.webPubSettings) stateToPersist.webPubSettings = state.webPubSettings;
1256
1396
  if (state.audioSettings) stateToPersist.audioSettings = state.audioSettings;
1257
1397
  Object.entries(externalReducers).forEach(([key, config]) => {
@@ -1273,6 +1413,7 @@ var makeStore = (storageKey, externalReducers = {}) => {
1273
1413
  actions: actionsReducer_default,
1274
1414
  publication: publicationReducer_default,
1275
1415
  preferences: preferencesReducer_default,
1416
+ globalPreferences: globalPreferencesReducer_default,
1276
1417
  webPubSettings: webPubSettingsReducer_default,
1277
1418
  audioSettings: audioSettingsReducer_default,
1278
1419
  player: playerReducer_default,
@@ -1287,6 +1428,7 @@ var makeStore = (storageKey, externalReducers = {}) => {
1287
1428
  settings: persistedState.settings,
1288
1429
  theming: persistedState.theming,
1289
1430
  preferences: persistedState.preferences,
1431
+ globalPreferences: persistedState.globalPreferences,
1290
1432
  webPubSettings: persistedState.webPubSettings,
1291
1433
  audioSettings: persistedState.audioSettings,
1292
1434
  // Include persisted state for external reducers that have it
@@ -1330,7 +1472,10 @@ var ThReduxPreferencesAdapter = class {
1330
1472
  this.store.subscribe(() => {
1331
1473
  const state = this.store.getState();
1332
1474
  const prefs = this.mapStateToPreferences(state);
1333
- this.notifyListeners(prefs);
1475
+ if (JSON.stringify(prefs) !== JSON.stringify(this.currentPreferences)) {
1476
+ this.currentPreferences = prefs;
1477
+ this.notifyListeners(prefs);
1478
+ }
1334
1479
  });
1335
1480
  }
1336
1481
  getPreferences() {
@@ -1358,10 +1503,45 @@ var ThReduxPreferencesAdapter = class {
1358
1503
  this.listeners.forEach((callback) => callback(prefsCopy));
1359
1504
  }
1360
1505
  };
1361
- var useAppDispatch = useDispatch;
1362
- var useAppSelector = useSelector;
1363
- var useAppStore = useStore;
1364
1506
 
1365
- 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 };
1366
- //# sourceMappingURL=chunk-YZ3KCMKY.mjs.map
1367
- //# sourceMappingURL=chunk-YZ3KCMKY.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