@edrlab/thorium-web 1.5.6 → 1.6.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 (66) hide show
  1. package/dist/{ThPreferencesAdapter-GepvYoaL.d.mts → ThPreferencesAdapter-B39cxwAo.d.mts} +4 -22
  2. package/dist/{ThSettingsWrapper-DyYC678Q.d.mts → ThSettingsWrapper-DBrfTO6I.d.mts} +1 -1
  3. package/dist/{actions-CTg9C4C-.d.mts → actions-CN51OeyO.d.mts} +29 -6
  4. package/dist/{actionsReducer-Cnd7Cdh9.d.mts → actionsReducer-D3Ujx25n.d.mts} +5 -13
  5. package/dist/{chunk-LF6IMH7J.mjs → chunk-7X5KT42Z.mjs} +336 -310
  6. package/dist/chunk-7X5KT42Z.mjs.map +1 -0
  7. package/dist/{chunk-I765HTBI.mjs → chunk-GC7ENGE2.mjs} +49 -76
  8. package/dist/chunk-GC7ENGE2.mjs.map +1 -0
  9. package/dist/{chunk-VWKUZP5V.mjs → chunk-GGNTMKHK.mjs} +8 -8
  10. package/dist/chunk-GGNTMKHK.mjs.map +1 -0
  11. package/dist/{chunk-WOJR6ALR.mjs → chunk-GWL53CI4.mjs} +9 -9
  12. package/dist/chunk-GWL53CI4.mjs.map +1 -0
  13. package/dist/{chunk-DKF53WEQ.mjs → chunk-OOAZZ3IZ.mjs} +9 -9
  14. package/dist/chunk-OOAZZ3IZ.mjs.map +1 -0
  15. package/dist/{chunk-5IT53TCU.mjs → chunk-QME5CNAT.mjs} +5 -5
  16. package/dist/{chunk-5IT53TCU.mjs.map → chunk-QME5CNAT.mjs.map} +1 -1
  17. package/dist/{chunk-6DR4EAK3.mjs → chunk-WA35SQJK.mjs} +2 -2
  18. package/dist/chunk-WA35SQJK.mjs.map +1 -0
  19. package/dist/components/Audio/index.css +1 -1
  20. package/dist/components/Audio/index.css.map +1 -1
  21. package/dist/components/Audio/index.d.mts +9 -9
  22. package/dist/components/Audio/index.mjs +4 -4
  23. package/dist/components/Epub/index.css +1 -1
  24. package/dist/components/Epub/index.css.map +1 -1
  25. package/dist/components/Epub/index.d.mts +9 -9
  26. package/dist/components/Epub/index.mjs +5 -5
  27. package/dist/components/Reader/index.css +1 -1
  28. package/dist/components/Reader/index.css.map +1 -1
  29. package/dist/components/Reader/index.d.mts +8 -8
  30. package/dist/components/Reader/index.mjs +9 -9
  31. package/dist/components/WebPub/index.css +1 -1
  32. package/dist/components/WebPub/index.css.map +1 -1
  33. package/dist/components/WebPub/index.d.mts +9 -9
  34. package/dist/components/WebPub/index.mjs +5 -5
  35. package/dist/core/Components/index.d.mts +5 -5
  36. package/dist/core/Hooks/index.d.mts +4 -4
  37. package/dist/lib/index.d.mts +7 -7
  38. package/dist/lib/index.mjs +1 -1
  39. package/dist/locales/ar/thorium-shared.json +109 -14
  40. package/dist/locales/ar/thorium-web.json +67 -7
  41. package/dist/locales/en/thorium-shared.json +3 -0
  42. package/dist/locales/en/thorium-web.json +1 -2
  43. package/dist/locales/es/thorium-shared.json +2 -2
  44. package/dist/locales/es/thorium-web.json +1 -1
  45. package/dist/locales/et/thorium-shared.json +3 -0
  46. package/dist/locales/fi/thorium-shared.json +3 -0
  47. package/dist/locales/fr/thorium-shared.json +4 -1
  48. package/dist/locales/it/thorium-shared.json +3 -0
  49. package/dist/locales/lt/thorium-shared.json +12 -9
  50. package/dist/locales/pl/thorium-shared.json +6 -0
  51. package/dist/locales/sl/thorium-shared.json +380 -0
  52. package/dist/locales/sv/thorium-shared.json +6 -0
  53. package/dist/locales/sv/thorium-web.json +2 -2
  54. package/dist/preferences/index.d.mts +8 -8
  55. package/dist/preferences/index.mjs +1 -1
  56. package/dist/{settingsReducer-DRWEq8Cm.d.mts → settingsReducer-flD_zs4E.d.mts} +1 -1
  57. package/dist/{useContrast-Unp3534Z.d.mts → useContrast-BJlYqbPP.d.mts} +1 -1
  58. package/dist/{usePreferences-Bi-ptif0.d.mts → usePreferences-DZX-xVu2.d.mts} +4 -4
  59. package/dist/{useReaderTransitions-B9fOF61y.d.mts → useReaderTransitions-CIbMYwzs.d.mts} +7 -7
  60. package/package.json +13 -8
  61. package/dist/chunk-6DR4EAK3.mjs.map +0 -1
  62. package/dist/chunk-DKF53WEQ.mjs.map +0 -1
  63. package/dist/chunk-I765HTBI.mjs.map +0 -1
  64. package/dist/chunk-LF6IMH7J.mjs.map +0 -1
  65. package/dist/chunk-VWKUZP5V.mjs.map +0 -1
  66. package/dist/chunk-WOJR6ALR.mjs.map +0 -1
@@ -343,37 +343,31 @@ var initialState4 = {
343
343
  epub: {
344
344
  ["dockingStart" /* start */]: {
345
345
  actionKey: null,
346
- active: false,
347
- collapsed: false
346
+ active: false
348
347
  },
349
348
  ["dockingEnd" /* end */]: {
350
349
  actionKey: null,
351
- active: false,
352
- collapsed: false
350
+ active: false
353
351
  }
354
352
  },
355
353
  webPub: {
356
354
  ["dockingStart" /* start */]: {
357
355
  actionKey: null,
358
- active: false,
359
- collapsed: false
356
+ active: false
360
357
  },
361
358
  ["dockingEnd" /* end */]: {
362
359
  actionKey: null,
363
- active: false,
364
- collapsed: false
360
+ active: false
365
361
  }
366
362
  },
367
363
  audio: {
368
364
  ["dockingStart" /* start */]: {
369
365
  actionKey: null,
370
- active: false,
371
- collapsed: false
366
+ active: false
372
367
  },
373
368
  ["dockingEnd" /* end */]: {
374
369
  actionKey: null,
375
- active: false,
376
- collapsed: false
370
+ active: false
377
371
  }
378
372
  }
379
373
  },
@@ -389,13 +383,11 @@ var initializeProfileDock = (state, profile) => {
389
383
  state.dock[profile] = {
390
384
  ["dockingStart" /* start */]: {
391
385
  actionKey: null,
392
- active: false,
393
- collapsed: false
386
+ active: false
394
387
  },
395
388
  ["dockingEnd" /* end */]: {
396
389
  actionKey: null,
397
- active: false,
398
- collapsed: false
390
+ active: false
399
391
  }
400
392
  };
401
393
  }
@@ -410,36 +402,21 @@ var actionsSlice = createSlice({
410
402
  initialState: initialState4,
411
403
  reducers: {
412
404
  dockAction: (state, action) => {
413
- const { key, dockingKey, profile } = action.payload;
405
+ const { key, dockingKey, profile, reserved } = action.payload;
414
406
  initializeProfileDock(state, profile);
415
407
  initializeProfileKeys(state, profile);
416
408
  const profileDock = state.dock[profile];
417
409
  const profileKeys = state.keys[profile];
418
410
  switch (dockingKey) {
419
411
  case "dockingStart" /* start */:
420
- for (const k in profileKeys) {
421
- if (profileKeys[k]?.docking === dockingKey) {
422
- profileKeys[k] = {
423
- ...profileKeys[k],
424
- docking: "dockingTransient" /* transient */,
425
- isOpen: false
426
- };
427
- }
428
- }
429
- profileDock["dockingStart" /* start */] = {
430
- ...profileDock["dockingStart" /* start */],
431
- actionKey: key
432
- };
433
- if (profileDock["dockingEnd" /* end */].actionKey === key) {
434
- profileDock["dockingEnd" /* end */] = {
435
- ...profileDock["dockingEnd" /* end */],
436
- actionKey: null
437
- };
412
+ case "dockingEnd" /* end */: {
413
+ const otherSlot = dockingKey === "dockingStart" /* start */ ? "dockingEnd" /* end */ : "dockingStart" /* start */;
414
+ const occupant = profileDock[dockingKey];
415
+ if (occupant.actionKey && occupant.actionKey !== key && occupant.reserved && !reserved) {
416
+ return;
438
417
  }
439
- break;
440
- case "dockingEnd" /* end */:
441
418
  for (const k in profileKeys) {
442
- if (profileKeys[k]?.docking === dockingKey) {
419
+ if (k !== key && profileKeys[k]?.docking === dockingKey) {
443
420
  profileKeys[k] = {
444
421
  ...profileKeys[k],
445
422
  docking: "dockingTransient" /* transient */,
@@ -447,30 +424,35 @@ var actionsSlice = createSlice({
447
424
  };
448
425
  }
449
426
  }
450
- profileDock["dockingEnd" /* end */] = {
451
- ...profileDock["dockingEnd" /* end */],
452
- actionKey: key
427
+ profileDock[dockingKey] = {
428
+ ...profileDock[dockingKey],
429
+ actionKey: key,
430
+ reserved: !!reserved
453
431
  };
454
- if (profileDock["dockingStart" /* start */].actionKey === key) {
455
- profileDock["dockingStart" /* start */] = {
456
- ...profileDock["dockingStart" /* start */],
457
- actionKey: null
432
+ if (profileDock[otherSlot].actionKey === key) {
433
+ profileDock[otherSlot] = {
434
+ ...profileDock[otherSlot],
435
+ actionKey: null,
436
+ reserved: false
458
437
  };
459
438
  }
460
439
  break;
440
+ }
461
441
  // We don’t need to sync another action
462
442
  case "dockingTransient" /* transient */:
463
443
  default:
464
444
  if (profileDock["dockingStart" /* start */].actionKey === key) {
465
445
  profileDock["dockingStart" /* start */] = {
466
446
  ...profileDock["dockingStart" /* start */],
467
- actionKey: null
447
+ actionKey: null,
448
+ reserved: false
468
449
  };
469
450
  }
470
451
  if (profileDock["dockingEnd" /* end */].actionKey === key) {
471
452
  profileDock["dockingEnd" /* end */] = {
472
453
  ...profileDock["dockingEnd" /* end */],
473
- actionKey: null
454
+ actionKey: null,
455
+ reserved: false
474
456
  };
475
457
  }
476
458
  break;
@@ -483,6 +465,7 @@ var actionsSlice = createSlice({
483
465
  setActionOpen: (state, action) => {
484
466
  const { key, isOpen, profile } = action.payload;
485
467
  initializeProfileKeys(state, profile);
468
+ if (state.keys[profile][key]?.isOpen === isOpen) return;
486
469
  state.keys[profile][key] = {
487
470
  ...state.keys[profile][key],
488
471
  isOpen
@@ -507,9 +490,13 @@ var actionsSlice = createSlice({
507
490
  isOpen: action.payload.isOpen
508
491
  };
509
492
  },
493
+ // Each mutation below replaces the slot object, changing the identity of
494
+ // `state.dock[profile]` and waking every effect keyed on it. Bail out when
495
+ // the value is already correct so redundant dispatches stay inert
510
496
  activateDockPanel: (state, action) => {
511
497
  const { slot, profile } = action.payload;
512
498
  initializeProfileDock(state, profile);
499
+ if (state.dock[profile][slot].active) return;
513
500
  state.dock[profile][slot] = {
514
501
  ...state.dock[profile][slot],
515
502
  active: true
@@ -518,32 +505,18 @@ var actionsSlice = createSlice({
518
505
  deactivateDockPanel: (state, action) => {
519
506
  const { slot, profile } = action.payload;
520
507
  initializeProfileDock(state, profile);
508
+ if (!state.dock[profile][slot].active) return;
521
509
  state.dock[profile][slot] = {
522
510
  ...state.dock[profile][slot],
523
511
  active: false
524
512
  };
525
513
  },
526
- collapseDockPanel: (state, action) => {
527
- const { slot, profile } = action.payload;
528
- initializeProfileDock(state, profile);
529
- state.dock[profile][slot] = {
530
- ...state.dock[profile][slot],
531
- collapsed: true
532
- };
533
- },
534
- expandDockPanel: (state, action) => {
535
- const { slot, profile } = action.payload;
536
- initializeProfileDock(state, profile);
537
- state.dock[profile][slot] = {
538
- ...state.dock[profile][slot],
539
- collapsed: false
540
- };
541
- },
542
514
  setDockPanelWidth: (state, action) => {
543
515
  const { key, width, profile } = action.payload;
544
516
  initializeProfileDock(state, profile);
545
517
  initializeProfileKeys(state, profile);
546
518
  const dockKey = state.dock[profile][key].actionKey;
519
+ if (state.dock[profile][key].width === width && (!dockKey || state.keys[profile][dockKey]?.dockedWidth === width)) return;
547
520
  if (dockKey) {
548
521
  state.keys[profile][dockKey] = {
549
522
  ...state.keys[profile][dockKey],
@@ -564,8 +537,6 @@ var {
564
537
  setOverflow,
565
538
  activateDockPanel,
566
539
  deactivateDockPanel,
567
- collapseDockPanel,
568
- expandDockPanel,
569
540
  setDockPanelWidth
570
541
  } = actionsSlice.actions;
571
542
  var actionsReducer_default = actionsSlice.reducer;
@@ -1174,11 +1145,13 @@ var updateActionsState = (state) => {
1174
1145
  key,
1175
1146
  {
1176
1147
  ...value,
1177
- // Transient/undocked actions should never re-open on load
1178
- // Docked actions reset to null so useDocking re-establishes open state
1179
- // based on the actual breakpoint at load time (avoids opening docked
1180
- // sheets in fullscreen/compact where docking is unavailable)
1181
- isOpen: value?.docking === "dockingTransient" /* transient */ || value?.docking == null ? false : value?.docking === "dockingStart" /* start */ || value?.docking === "dockingEnd" /* end */ ? null : value?.isOpen
1148
+ // Transient/undocked actions should never re-open on load.
1149
+ // Docked actions keep whatever isOpen the user last left them
1150
+ // with useDocking only fills the gap when isOpen was never
1151
+ // set (see docked.reopenOnLoad), and separately guards against
1152
+ // a remembered "open" leaking into a breakpoint where docking
1153
+ // isn't even available
1154
+ isOpen: value?.docking === "dockingTransient" /* transient */ || value?.docking == null ? false : value?.isOpen
1182
1155
  }
1183
1156
  ])
1184
1157
  );
@@ -1194,7 +1167,7 @@ var updateActionsState = (state) => {
1194
1167
  key,
1195
1168
  {
1196
1169
  ...value,
1197
- isOpen: value?.docking === "dockingTransient" /* transient */ || value?.docking == null ? false : value?.docking === "dockingStart" /* start */ || value?.docking === "dockingEnd" /* end */ ? null : value?.isOpen
1170
+ isOpen: value?.docking === "dockingTransient" /* transient */ || value?.docking == null ? false : value?.isOpen
1198
1171
  }
1199
1172
  ])
1200
1173
  );
@@ -1211,8 +1184,8 @@ var migrateDockStateToProfileKeyed = (state) => {
1211
1184
  if (oldDock["dockingStart" /* start */] || oldDock["dockingEnd" /* end */]) {
1212
1185
  const newDock = {};
1213
1186
  newDock["epub"] = {
1214
- ["dockingStart" /* start */]: oldDock["dockingStart" /* start */] || { actionKey: null, active: false, collapsed: false },
1215
- ["dockingEnd" /* end */]: oldDock["dockingEnd" /* end */] || { actionKey: null, active: false, collapsed: false }
1187
+ ["dockingStart" /* start */]: oldDock["dockingStart" /* start */] || { actionKey: null, active: false },
1188
+ ["dockingEnd" /* end */]: oldDock["dockingEnd" /* end */] || { actionKey: null, active: false }
1216
1189
  };
1217
1190
  return {
1218
1191
  ...state,
@@ -1453,6 +1426,6 @@ var ThReduxGlobalPreferencesAdapter = class {
1453
1426
  }
1454
1427
  };
1455
1428
 
1456
- export { ThReduxGlobalPreferencesAdapter, ThReduxPreferencesAdapter, ThStoreProvider, actionsSlice, activateDockPanel, audioSettingsSlice, collapseDockPanel, deactivateDockPanel, debounce, dockAction, expandDockPanel, globalPreferencesSlice, handleSpacingSetting, initialSettingsState, initialWebPubSettingsState, makeStore, playerSlice, preferencesSlice, readerSlice, setActionOpen, setAutoPlay, setBreakpoint, setColorScheme, setColumnCount, setContainerBreakpoint, setContrast, setDirection, setDockPanelWidth, setEnableMediaSession, setFontFamily, setFontSize, setFontWeight, setForcedColors, setFullscreen, setHasArrows, setHovering, setHyphens, setImmersive, setLetterSpacing, setLigatures, setLineHeight, setLineLength, setLoading, setLocale, setMonochrome, setNoRuby, setOverflow, setPaginatedAffordance, setParagraphIndent, setParagraphSpacing, setPlatformModifier, setPlaybackRate, setPollInterval, setPreservePitch, setProgressionFormat, setPublisherStyles, setReaderProfile, setReducedMotion, setReducedTransparency, setRemotePlaybackState, setRunningHeadFormat, setScroll, setScrollAffordance, setScrollAffordances, setSeekableRanges, setSeeking, setSettingsContainer, setSkipBackwardInterval, setSkipForwardInterval, setSkipInterval, setSleepTimerOnFragmentEnd, setSleepTimerOnTrackEnd, setSleepTimerRemainingSeconds, setSpacingPreset, setStalled, setStatus, setTextAlign, setTextNormalization, setTheme, 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 };
1457
- //# sourceMappingURL=chunk-I765HTBI.mjs.map
1458
- //# sourceMappingURL=chunk-I765HTBI.mjs.map
1429
+ export { ThReduxGlobalPreferencesAdapter, ThReduxPreferencesAdapter, ThStoreProvider, actionsSlice, activateDockPanel, audioSettingsSlice, deactivateDockPanel, debounce, dockAction, globalPreferencesSlice, handleSpacingSetting, initialSettingsState, initialWebPubSettingsState, makeStore, playerSlice, preferencesSlice, readerSlice, setActionOpen, setAutoPlay, setBreakpoint, setColorScheme, setColumnCount, setContainerBreakpoint, setContrast, setDirection, setDockPanelWidth, setEnableMediaSession, setFontFamily, setFontSize, setFontWeight, setForcedColors, setFullscreen, setHasArrows, setHovering, setHyphens, setImmersive, setLetterSpacing, setLigatures, setLineHeight, setLineLength, setLoading, setLocale, setMonochrome, setNoRuby, setOverflow, setPaginatedAffordance, setParagraphIndent, setParagraphSpacing, setPlatformModifier, setPlaybackRate, setPollInterval, setPreservePitch, setProgressionFormat, setPublisherStyles, setReaderProfile, setReducedMotion, setReducedTransparency, setRemotePlaybackState, setRunningHeadFormat, setScroll, setScrollAffordance, setScrollAffordances, setSeekableRanges, setSeeking, setSettingsContainer, setSkipBackwardInterval, setSkipForwardInterval, setSkipInterval, setSleepTimerOnFragmentEnd, setSleepTimerOnTrackEnd, setSleepTimerRemainingSeconds, setSpacingPreset, setStalled, setStatus, setTextAlign, setTextNormalization, setTheme, 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 };
1430
+ //# sourceMappingURL=chunk-GC7ENGE2.mjs.map
1431
+ //# sourceMappingURL=chunk-GC7ENGE2.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/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-GC7ENGE2.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\";\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 prefersReducedMotion: boolean;\n prefersReducedTransparency: boolean;\n prefersContrast: ThContrast;\n forcedColors: boolean;\n breakpoint?: ThBreakpoints;\n containerBreakpoint?: 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 prefersReducedMotion: false,\n prefersReducedTransparency: false, \n prefersContrast: ThContrast.none,\n forcedColors: false, \n breakpoint: undefined,\n containerBreakpoint: 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 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 setContainerBreakpoint: (state, action) => {\n state.containerBreakpoint = 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 setReducedMotion, \n setReducedTransparency, \n setContrast, \n setForcedColors, \n setBreakpoint,\n setContainerBreakpoint,\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 width?: number;\n reserved?: boolean;\n}\n\nexport interface ActionStateDockPayload {\n type: string;\n payload: {\n key: ActionsStateKeys;\n dockingKey: ThDockingKeys;\n profile: string;\n reserved?: boolean;\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 },\n [ThDockingKeys.end]: {\n actionKey: null,\n active: false\n }\n },\n webPub: {\n [ThDockingKeys.start]: {\n actionKey: null,\n active: false\n },\n [ThDockingKeys.end]: {\n actionKey: null,\n active: false\n }\n },\n audio: {\n [ThDockingKeys.start]: {\n actionKey: null,\n active: false\n },\n [ThDockingKeys.end]: {\n actionKey: null,\n active: 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 },\n [ThDockingKeys.end]: {\n actionKey: null,\n active: 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, reserved } = 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 case ThDockingKeys.end: {\n const otherSlot = dockingKey === ThDockingKeys.start ? ThDockingKeys.end : ThDockingKeys.start;\n\n // A reserved occupant can't be evicted by a non-reserved action:\n // bail out entirely so the requester's own state stays untouched\n const occupant = profileDock[dockingKey];\n if (occupant.actionKey && occupant.actionKey !== key && occupant.reserved && !reserved) {\n return;\n }\n\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. The requester is\n // skipped: re-docking in place must not close it by evicting itself\n for (const k in profileKeys) {\n if (k !== key && 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[dockingKey] = {\n ...profileDock[dockingKey],\n actionKey: key,\n reserved: !!reserved\n }\n // And remove it from the other one\n if (profileDock[otherSlot].actionKey === key) {\n profileDock[otherSlot] = {\n ...profileDock[otherSlot],\n actionKey: null,\n reserved: false\n }\n }\n break;\n }\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 reserved: false\n }\n }\n if (profileDock[ThDockingKeys.end].actionKey === key) {\n profileDock[ThDockingKeys.end] = {\n ...profileDock[ThDockingKeys.end],\n actionKey: null,\n reserved: false\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 if (state.keys[profile][key]?.isOpen === isOpen) return;\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 // Each mutation below replaces the slot object, changing the identity of\n // `state.dock[profile]` and waking every effect keyed on it. Bail out when\n // the value is already correct so redundant dispatches stay inert\n activateDockPanel: (state, action: ActionStateSlotPayloadWithProfile) => {\n const { slot, profile } = action.payload;\n initializeProfileDock(state, profile);\n if (state.dock[profile][slot].active) return;\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 if (!state.dock[profile][slot].active) return;\n state.dock[profile][slot] = {\n ...state.dock[profile][slot],\n active: 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 // The slot's own width can already match (e.g. a new occupant renders\n // at the same default width the previous one left behind), while the\n // occupant's own persisted width is still unset — both must agree for\n // there to be nothing to do\n const dockKey: ActionsStateKeys | null = state.dock[profile][key].actionKey;\n if (state.dock[profile][key].width === width && (!dockKey || state.keys[profile][dockKey]?.dockedWidth === width)) return;\n\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 setDockPanelWidth\n} = actionsSlice.actions;\n\nexport default actionsSlice.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 keep whatever isOpen the user last left them\n // with — useDocking only fills the gap when isOpen was never\n // set (see docked.reopenOnLoad), and separately guards against\n // a remembered \"open\" leaking into a breakpoint where docking\n // isn't even available\n isOpen: (value?.docking === ThDockingKeys.transient || value?.docking == null)\n ? false\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?.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 },\n [ThDockingKeys.end]: oldDock[ThDockingKeys.end] || { actionKey: null, active: 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"]}
@@ -1,8 +1,8 @@
1
- import { useNavigator, StatefulActionIcon, usePlugins, ThPluginRegistry, createAudioDefaultPlugin, ThPluginProvider, useFocusedDockableKey, usePositionStorage, useTocEntryTracking, fromActionPeripheralType, fromDockingPeripheralType, useTocTreeBuilder, NavigatorProvider, StatefulDockingWrapper, toActionPeripheralType, toDockingPeripheralType, useReaderHeaderBase, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default } from './chunk-LF6IMH7J.mjs';
1
+ import { useNavigator, StatefulActionIcon, usePlugins, ThPluginRegistry, createAudioDefaultPlugin, ThPluginProvider, useFocusedDockableKey, usePositionStorage, useTocEntryTracking, fromActionPeripheralType, fromDockingPeripheralType, useTocTreeBuilder, NavigatorProvider, StatefulDockingWrapper, toActionPeripheralType, toDockingPeripheralType, useReaderHeaderBase, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default } from './chunk-7X5KT42Z.mjs';
2
2
  import { useAudioNavigator, useDocumentTitle, useTimelineAdjacency, useAudioSettingsCache } from './chunk-CXKDZVAV.mjs';
3
- import { setSleepTimerOnFragmentEnd, toggleActionOpen, dockAction, setRemotePlaybackState, setStatus, setSeekableRanges, setSeeking, setStalled, setSleepTimerOnTrackEnd, setTrackReady, debounce, setLoading } from './chunk-I765HTBI.mjs';
3
+ import { setSleepTimerOnFragmentEnd, toggleActionOpen, dockAction, setRemotePlaybackState, setStatus, setSeekableRanges, setSeeking, setStalled, setSleepTimerOnTrackEnd, setTrackReady, debounce, setLoading } from './chunk-GC7ENGE2.mjs';
4
4
  import { setPublicationStart, setPublicationEnd } from './chunk-7SMOXFAF.mjs';
5
- import { useAudioPreferences, ThAudioAffordance, resolveAudioContentProtectionConfig, useAudioActionsPreferences, proxyUrl } from './chunk-6DR4EAK3.mjs';
5
+ import { useAudioPreferences, ThAudioAffordance, resolveAudioContentProtectionConfig, useAudioActionsPreferences, proxyUrl } from './chunk-WA35SQJK.mjs';
6
6
  import { useAppSelector, useAppDispatch } from './chunk-MFVZ5AEN.mjs';
7
7
  import { ThActionsBar, ThAudioProgress } from './chunk-ES2Y5MC7.mjs';
8
8
  import { useI18n } from './chunk-2NCN2AG2.mjs';
@@ -765,9 +765,9 @@ var StatefulPlayerInner = ({ publication, localDataKey, positionStorage, coverUr
765
765
  }
766
766
  const dockingKey = fromDockingPeripheralType(data.type);
767
767
  if (dockingKey && profile) {
768
- const actionKey2 = getFocusedDockableKey(dockingKey);
769
- if (actionKey2) {
770
- dispatch(dockAction({ key: actionKey2, dockingKey, profile }));
768
+ const focused = getFocusedDockableKey(dockingKey);
769
+ if (focused) {
770
+ dispatch(dockAction({ key: focused.key, dockingKey, profile, reserved: focused.reserved }));
771
771
  }
772
772
  }
773
773
  },
@@ -886,5 +886,5 @@ var StatefulPlayerInner = ({ publication, localDataKey, positionStorage, coverUr
886
886
  };
887
887
 
888
888
  export { StatefulAudioMediaActions, StatefulAudioPlaybackControls, StatefulAudioProgressBar, StatefulNextButton, StatefulPlayPauseButton, StatefulPlayer, StatefulPreviousButton, StatefulSkipBackwardButton, StatefulSkipForwardButton };
889
- //# sourceMappingURL=chunk-VWKUZP5V.mjs.map
890
- //# sourceMappingURL=chunk-VWKUZP5V.mjs.map
889
+ //# sourceMappingURL=chunk-GGNTMKHK.mjs.map
890
+ //# sourceMappingURL=chunk-GGNTMKHK.mjs.map