@edrlab/thorium-web 1.4.1 → 1.5.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 (74) hide show
  1. package/dist/{ThPreferencesAdapter-_5AePKHa.d.mts → ThPreferencesAdapter-B3a-f5v-.d.mts} +22 -17
  2. package/dist/{ThSettingsWrapper-B_9klYXH.d.mts → ThSettingsWrapper-DtzcwzYX.d.mts} +4 -4
  3. package/dist/{actions-CuRRM3rp.d.mts → actions-C33UN3Ji.d.mts} +14 -3
  4. package/dist/{actionsReducer-VFR42qgL.d.mts → actionsReducer-Bzcj3wk3.d.mts} +1 -1
  5. package/dist/{chunk-WF2UOYO7.mjs → chunk-2T65MDBR.mjs} +3 -3
  6. package/dist/{chunk-WF2UOYO7.mjs.map → chunk-2T65MDBR.mjs.map} +1 -1
  7. package/dist/{chunk-RBEPH5E5.mjs → chunk-63LKYJFG.mjs} +50 -50
  8. package/dist/chunk-63LKYJFG.mjs.map +1 -0
  9. package/dist/{chunk-SI4FBFHM.mjs → chunk-BBCSLDQT.mjs} +132 -78
  10. package/dist/chunk-BBCSLDQT.mjs.map +1 -0
  11. package/dist/{chunk-E2JEGVVE.mjs → chunk-BCXKBHU3.mjs} +28 -10
  12. package/dist/chunk-BCXKBHU3.mjs.map +1 -0
  13. package/dist/{chunk-SZAVAQ6S.mjs → chunk-GRYEOCGD.mjs} +8 -5
  14. package/dist/chunk-GRYEOCGD.mjs.map +1 -0
  15. package/dist/{chunk-MSHUPSBI.mjs → chunk-KJ55Q63A.mjs} +173 -75
  16. package/dist/chunk-KJ55Q63A.mjs.map +1 -0
  17. package/dist/{chunk-44PEO3DS.mjs → chunk-KOR74F6M.mjs} +9 -41
  18. package/dist/chunk-KOR74F6M.mjs.map +1 -0
  19. package/dist/{chunk-YEVLT3AV.mjs → chunk-PAFJZH7O.mjs} +3 -3
  20. package/dist/{chunk-YEVLT3AV.mjs.map → chunk-PAFJZH7O.mjs.map} +1 -1
  21. package/dist/{chunk-OD75GC5N.mjs → chunk-PRQBFBJ7.mjs} +73 -46
  22. package/dist/chunk-PRQBFBJ7.mjs.map +1 -0
  23. package/dist/{chunk-KGSFTRCH.mjs → chunk-Y5X74VW7.mjs} +44 -116
  24. package/dist/chunk-Y5X74VW7.mjs.map +1 -0
  25. package/dist/{chunk-ETLIGONP.mjs → chunk-ZD4LTF6G.mjs} +2 -2
  26. package/dist/chunk-ZD4LTF6G.mjs.map +1 -0
  27. package/dist/components/Audio/index.css +10 -0
  28. package/dist/components/Audio/index.css.map +1 -1
  29. package/dist/components/Audio/index.d.mts +12 -11
  30. package/dist/components/Audio/index.mjs +7 -7
  31. package/dist/components/Epub/index.css +10 -0
  32. package/dist/components/Epub/index.css.map +1 -1
  33. package/dist/components/Epub/index.d.mts +12 -11
  34. package/dist/components/Epub/index.mjs +8 -8
  35. package/dist/components/Misc/index.mjs +2 -2
  36. package/dist/components/Reader/index.css +10 -0
  37. package/dist/components/Reader/index.css.map +1 -1
  38. package/dist/components/Reader/index.d.mts +11 -10
  39. package/dist/components/Reader/index.mjs +14 -14
  40. package/dist/components/Reader/index.mjs.map +1 -1
  41. package/dist/components/WebPub/index.css +10 -0
  42. package/dist/components/WebPub/index.css.map +1 -1
  43. package/dist/components/WebPub/index.d.mts +12 -11
  44. package/dist/components/WebPub/index.mjs +8 -8
  45. package/dist/core/Components/index.d.mts +6 -5
  46. package/dist/core/Components/index.mjs +1 -1
  47. package/dist/core/Helpers/index.d.mts +1 -1
  48. package/dist/core/Helpers/index.mjs +1 -1
  49. package/dist/core/Hooks/index.d.mts +6 -5
  50. package/dist/core/Hooks/index.mjs +1 -1
  51. package/dist/keyboardUtilities-BCP3UcLb.d.mts +30 -0
  52. package/dist/lib/index.d.mts +9 -8
  53. package/dist/lib/index.mjs +2 -2
  54. package/dist/locales/he/thorium-web.json +9 -0
  55. package/dist/locales/it/thorium-web.json +22 -0
  56. package/dist/locales/sv/thorium-web.json +22 -0
  57. package/dist/preferences/index.d.mts +14 -23
  58. package/dist/preferences/index.mjs +2 -2
  59. package/dist/{settingsReducer-VqBhLq50.d.mts → settingsReducer-Pp9aoiiC.d.mts} +1 -1
  60. package/dist/{useAudioNavigator-CWXyNWq1.d.mts → useAudioNavigator-pGwxhXLj.d.mts} +4 -1
  61. package/dist/{useContrast-Cbso7N1l.d.mts → useContrast-Bl08zDTU.d.mts} +2 -7
  62. package/dist/{usePreferences-9ZvbcbLW.d.mts → usePreferences-Cy7-JN2x.d.mts} +4 -8
  63. package/dist/{useReaderTransitions-0hKGCvMm.d.mts → useReaderTransitions-Zvomj9RQ.d.mts} +27 -19
  64. package/package.json +7 -7
  65. package/dist/chunk-44PEO3DS.mjs.map +0 -1
  66. package/dist/chunk-E2JEGVVE.mjs.map +0 -1
  67. package/dist/chunk-ETLIGONP.mjs.map +0 -1
  68. package/dist/chunk-KGSFTRCH.mjs.map +0 -1
  69. package/dist/chunk-MSHUPSBI.mjs.map +0 -1
  70. package/dist/chunk-OD75GC5N.mjs.map +0 -1
  71. package/dist/chunk-RBEPH5E5.mjs.map +0 -1
  72. package/dist/chunk-SI4FBFHM.mjs.map +0 -1
  73. package/dist/chunk-SZAVAQ6S.mjs.map +0 -1
  74. package/dist/keyboardUtilities-BWAyLS_D.d.mts +0 -56
@@ -1,12 +1,12 @@
1
1
  import { makeBreakpointsMap, isKeyboardTriggered, isActiveElement } from './chunk-VENFFPK2.mjs';
2
- import { useFullscreen, useLocalStorage, useEpubNavigator } from './chunk-SZAVAQ6S.mjs';
3
- import { setFullscreen, setReaderProfile, setPositionsList, setTocTree, setScriptMode, setRTL, setFXL, setHasDisplayTransformability, setActionOpen, dockAction, setHovering, setSettingsContainer, debounce, setColumnCount, initialWebPubSettingsState, initialSettingsState, setWebPubFontFamily, setFontFamily, setWebPubFontWeight, setFontWeight, setWebPubHyphens, setHyphens, setScroll, setWebPubLetterSpacing, setLetterSpacing, setWebPubLineHeight, setLineHeight, setWebPubParagraphIndent, setParagraphIndent, setWebPubParagraphSpacing, setParagraphSpacing, setWebPubWordSpacing, setWordSpacing, setWebPubSpacingPreset, setWebPubPublisherStyles, setSpacingPreset, setPublisherStyles, setWebPubTextAlign, setTextAlign, setWebPubTextNormalization, setTextNormalization, setWebPubLigatures, setLigatures, setWebPubNoRuby, setNoRuby, setTheme, setWebPubZoom, setFontSize, setSkipBackwardInterval, setSkipForwardInterval, setSkipInterval, setAutoPlay, toggleActionOpen, setVolume, setPlaybackRate, setSleepTimerRemainingSeconds, setSleepTimerOnTrackEnd, setSleepTimerOnFragmentEnd, setRemotePlaybackState, ThReduxPreferencesAdapter, ThReduxGlobalPreferencesAdapter, setImmersive, setOverflow, setUserNavigated, setTocEntry, collapseDockPanel, expandDockPanel, activateDockPanel, deactivateDockPanel, setDockPanelWidth } from './chunk-YEVLT3AV.mjs';
2
+ import { useFullscreen, useLocalStorage, useEpubNavigator } from './chunk-GRYEOCGD.mjs';
3
+ import { setFullscreen, setReaderProfile, setPositionsList, setTocTree, setScriptMode, setRTL, setFXL, setHasDisplayTransformability, setActionOpen, dockAction, setHovering, setSettingsContainer, debounce, setColumnCount, initialWebPubSettingsState, initialSettingsState, setWebPubFontFamily, setFontFamily, setWebPubFontWeight, setFontWeight, setWebPubHyphens, setHyphens, setScroll, setWebPubLetterSpacing, setLetterSpacing, setWebPubLineHeight, setLineHeight, setWebPubParagraphIndent, setParagraphIndent, setWebPubParagraphSpacing, setParagraphSpacing, setWebPubWordSpacing, setWordSpacing, setWebPubSpacingPreset, setWebPubPublisherStyles, setSpacingPreset, setPublisherStyles, setWebPubTextAlign, setTextAlign, setWebPubTextNormalization, setTextNormalization, setWebPubLigatures, setLigatures, setWebPubNoRuby, setNoRuby, setTheme, setWebPubZoom, setFontSize, setSkipBackwardInterval, setSkipForwardInterval, setSkipInterval, setAutoPlay, toggleActionOpen, setVolume, setPlaybackRate, setSleepTimerRemainingSeconds, setSleepTimerOnTrackEnd, setSleepTimerOnFragmentEnd, setRemotePlaybackState, ThReduxPreferencesAdapter, ThReduxGlobalPreferencesAdapter, setImmersive, setOverflow, setUserNavigated, setTocEntry, collapseDockPanel, expandDockPanel, activateDockPanel, deactivateDockPanel, setDockPanelWidth } from './chunk-PAFJZH7O.mjs';
4
4
  import { buildTocTree, findTocItemById } from './chunk-TEZB4ULX.mjs';
5
- import { useSharedPreferences, useActionsPreferences, prefixString, ThDockingTypes, ThSheetTypes, useAudioPreferences, usePreferences, useFilteredPreferenceKeys, defaultSpacingSettingsSubpanel, defaultSpacingSettingsMain, defaultTextSettingsSubpanel, defaultTextSettingsMain, ThTextSettingsKeys, ThSpacingSettingsKeys, buildThemeObject, defaultAudioSkipBackwardInterval, defaultAudioSkipForwardInterval, defaultAudioSkipInterval, defaultPreferences, ThPreferencesProvider, ThGlobalPreferencesProvider } from './chunk-OD75GC5N.mjs';
5
+ import { useSharedPreferences, useActionsPreferences, prefixString, ThDockingTypes, ThSheetTypes, useAudioPreferences, usePreferences, useFilteredPreferenceKeys, defaultSpacingSettingsSubpanel, defaultSpacingSettingsMain, defaultTextSettingsSubpanel, defaultTextSettingsMain, ThTextSettingsKeys, ThSpacingSettingsKeys, buildThemeObject, defaultAudioSkipBackwardInterval, defaultAudioSkipForwardInterval, defaultAudioSkipInterval, defaultPreferences, ThPreferencesProvider, ThGlobalPreferencesProvider } from './chunk-PRQBFBJ7.mjs';
6
6
  import { useAppDispatch, useAppSelector } from './chunk-A575ZW4A.mjs';
7
- import { isIOSish, buildShortcut, metaKeys } from './chunk-44PEO3DS.mjs';
7
+ import { isIOSish, metaKeys } from './chunk-KOR74F6M.mjs';
8
8
  import { ErrorHandler } from './chunk-RRDEPGBK.mjs';
9
- import { ThMenuItem, ThActionButton, ThMenu, ThCollapsibleActionsBar, ThPopover, ThContainerHeader, ThNavigationButton, ThContainerBody, ThModal, ThBottomSheet, ThCloseButton, ThDockedPanel, useFirstFocusable, ThTypedComponentRenderer, useActions, useActionComponentStatus, ThForm, ThFormNumberField, usePlugins, ThSettingsWrapper, ThRadioGroup, ThDropdown, ThSwitch, ThNumberField, ThSlider, ThSliderWithPresets, ThLink, ThLibrary, ThHome, ThBackArrow, ThFormSearchField } from './chunk-ETLIGONP.mjs';
9
+ import { ThMenuItem, ThActionButton, ThMenu, ThCollapsibleActionsBar, ThPopover, ThContainerHeader, ThNavigationButton, ThContainerBody, ThModal, ThBottomSheet, ThCloseButton, ThDockedPanel, useFirstFocusable, ThTypedComponentRenderer, useActions, useActionComponentStatus, ThForm, ThFormNumberField, usePlugins, ThSettingsWrapper, ThRadioGroup, ThDropdown, ThSwitch, ThNumberField, ThSlider, ThSliderWithPresets, ThLink, ThLibrary, ThHome, ThBackArrow, ThFormSearchField } from './chunk-ZD4LTF6G.mjs';
10
10
  import { usePrevious } from './chunk-YZ73DHRU.mjs';
11
11
  import { useI18n } from './chunk-2NCN2AG2.mjs';
12
12
  import { Text, Popover, Dialog, ListBox, ListBoxItem, Radio, Button, Keyboard, Toolbar, useFilter, Tree, TreeItem, TreeItemContent, Collection } from 'react-aria-components';
@@ -15,7 +15,8 @@ import { useObjectRef, useNumberFormatter, FocusScope, useLocale, useFocusWithin
15
15
  import classNames4 from 'classnames';
16
16
  import React22, { createContext, useCallback, useRef, useMemo, useContext, useState, useEffect } from 'react';
17
17
  import { Link, HttpFetcher, Manifest, Publication, ReadingProgression, Layout, Feature, Profile } from '@readium/shared';
18
- import { getScriptMode, TextAlignment } from '@readium/navigator';
18
+ import { getScriptMode, lineHeightRangeConfig, TextAlignment } from '@readium/navigator';
19
+ import i18nData from '@readium/css/css/vars/i18n.json';
19
20
  import { useStore } from 'react-redux';
20
21
  import { PanelGroup, Panel, PanelResizeHandle } from 'react-resizable-panels';
21
22
 
@@ -28,40 +29,47 @@ var thorium_web_overflow_default = {
28
29
  menuItemLabel: "thorium_web_overflow_menuItemLabel",
29
30
  menuItemShortcut: "thorium_web_overflow_menuItemShortcut"
30
31
  };
31
- var UnstableStatefulShortcut = ({
32
+ var DIGIT_OFFSET = 48;
33
+ var F_KEY_OFFSET = 112;
34
+ var resolveKeyLabel = (keyCode, label, t) => {
35
+ if (label !== void 0) {
36
+ if (typeof label === "string") return label;
37
+ return t(label.key, { defaultValue: label.fallback });
38
+ }
39
+ if (keyCode >= 65 && keyCode <= 90) return String.fromCharCode(keyCode);
40
+ if (keyCode >= DIGIT_OFFSET && keyCode <= 57) return String.fromCharCode(keyCode);
41
+ if (keyCode >= F_KEY_OFFSET && keyCode <= 123) return `F${keyCode - F_KEY_OFFSET + 1}`;
42
+ return "";
43
+ };
44
+ var pickCombo = (keyCombos, platformModifier) => {
45
+ if (keyCombos.length === 1) return keyCombos[0];
46
+ const wantsCtrl = platformModifier.modifier === "ctrlKey";
47
+ const preferred = keyCombos.find((c) => wantsCtrl ? c.ctrl : c.meta);
48
+ return preferred ?? keyCombos[0];
49
+ };
50
+ var StatefulShortcut = ({
32
51
  className,
33
- rawForm,
52
+ combo,
34
53
  representation,
35
54
  joiner
36
55
  }) => {
37
56
  const { shortcuts } = useSharedPreferences();
38
57
  const platformModifier = useAppSelector((state) => state.reader.platformModifier);
39
- representation = representation ? representation : shortcuts.representation || "symbol" /* symbol */;
40
- joiner = joiner ? joiner : shortcuts.joiner || " + ";
41
- const shortcutObj = buildShortcut(rawForm);
42
- if (shortcutObj) {
43
- let shortcutRepresentation = [];
44
- for (const prop in shortcutObj.modifiers) {
45
- if (shortcutObj.modifiers[prop]) {
46
- if (prop === "platformKey") {
47
- shortcutRepresentation.push(platformModifier[representation]);
48
- } else {
49
- const metaKey = metaKeys[prop];
50
- shortcutRepresentation.push(metaKey[representation]);
51
- }
52
- }
53
- }
54
- if (shortcutObj.char) {
55
- shortcutRepresentation.push(shortcutObj.char);
56
- }
57
- if (shortcutRepresentation.length > 0) {
58
- const displayShortcut = shortcutRepresentation.join(joiner);
59
- return /* @__PURE__ */ jsx(Keyboard, { className, children: displayShortcut });
60
- } else {
61
- return /* @__PURE__ */ jsx(Fragment, {});
62
- }
63
- }
64
- return /* @__PURE__ */ jsx(Fragment, {});
58
+ const { t } = useI18n();
59
+ const rep = representation ?? shortcuts.representation ?? "symbol" /* symbol */;
60
+ const sep = joiner ?? shortcuts.joiner ?? " + ";
61
+ const { keyCombos, label } = combo;
62
+ if (!keyCombos.length) return /* @__PURE__ */ jsx(Fragment, {});
63
+ const chosen = pickCombo(keyCombos, platformModifier);
64
+ const parts = [];
65
+ if (chosen.ctrl) parts.push(metaKeys.ctrlKey[rep]);
66
+ if (chosen.alt) parts.push(metaKeys.altKey[rep]);
67
+ if (chosen.shift) parts.push(metaKeys.shiftKey[rep]);
68
+ if (chosen.meta) parts.push(metaKeys.metaKey[rep]);
69
+ const keyLabel = resolveKeyLabel(chosen.keyCode, label, t);
70
+ if (keyLabel) parts.push(keyLabel);
71
+ if (!parts.length) return /* @__PURE__ */ jsx(Fragment, {});
72
+ return /* @__PURE__ */ jsx(Keyboard, { className, children: parts.join(sep) });
65
73
  };
66
74
  var StatefulOverflowMenuItem = ({
67
75
  id,
@@ -70,6 +78,7 @@ var StatefulOverflowMenuItem = ({
70
78
  shortcut = void 0,
71
79
  ...props
72
80
  }) => {
81
+ const { shortcuts } = useSharedPreferences();
73
82
  const menuItemLabelId = `${id}-label`;
74
83
  return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
75
84
  ThMenuItem,
@@ -90,11 +99,11 @@ var StatefulOverflowMenuItem = ({
90
99
  children: label
91
100
  }
92
101
  ),
93
- shortcut && /* @__PURE__ */ jsx(
94
- UnstableStatefulShortcut,
102
+ shortcut && shortcuts.displayIn?.includes("menuItem") && /* @__PURE__ */ jsx(
103
+ StatefulShortcut,
95
104
  {
96
105
  className: thorium_web_overflow_default.menuItemShortcut,
97
- rawForm: shortcut
106
+ combo: shortcut
98
107
  }
99
108
  )
100
109
  ]
@@ -109,6 +118,7 @@ var thorium_web_button_default = {
109
118
  closeButton: "thorium_web_button_closeButton",
110
119
  backButton: "thorium_web_button_backButton",
111
120
  tooltip: "thorium_web_button_tooltip",
121
+ tooltipShortcut: "thorium_web_button_tooltipShortcut",
112
122
  alwaysVisible: "thorium_web_button_alwaysVisible",
113
123
  partiallyVisible: "thorium_web_button_partiallyVisible",
114
124
  iconCompSm: "thorium_web_button_iconCompSm",
@@ -120,10 +130,11 @@ var StatefulActionIcon = ({
120
130
  visibility,
121
131
  placement,
122
132
  tooltipLabel,
133
+ shortcut,
123
134
  children,
124
135
  ...props
125
136
  }) => {
126
- const { theming } = useSharedPreferences();
137
+ const { theming, shortcuts } = useSharedPreferences();
127
138
  const triggerRef = useObjectRef(externalRef ?? null);
128
139
  const dispatch = useAppDispatch();
129
140
  const handleClassNameFromState = () => {
@@ -169,7 +180,10 @@ var StatefulActionIcon = ({
169
180
  placement,
170
181
  offset: theming.icon.tooltipOffset || 0
171
182
  },
172
- label: tooltipLabel
183
+ label: /* @__PURE__ */ jsxs(Fragment, { children: [
184
+ tooltipLabel,
185
+ shortcut && shortcuts.displayIn?.includes("tooltip") && /* @__PURE__ */ jsx(StatefulShortcut, { className: thorium_web_button_default.tooltipShortcut, combo: shortcut })
186
+ ] })
173
187
  } : void 0,
174
188
  ...Object.fromEntries(Object.entries(props).filter(([key]) => key !== "className")),
175
189
  children
@@ -2052,6 +2066,7 @@ var StatefulJumpToPositionTrigger = ({ variant }) => {
2052
2066
  "aria-label": t("reader.actions.goToPosition.descriptive"),
2053
2067
  placement: "bottom",
2054
2068
  tooltipLabel: t("reader.actions.goToPosition.compact"),
2069
+ shortcut: preferences.actionsKeys["jumpToPosition" /* jumpToPosition */].shortcut,
2055
2070
  onPress: () => setOpen(!actionState?.isOpen),
2056
2071
  children: /* @__PURE__ */ jsx(pin_drop_default, { "aria-hidden": "true", focusable: "false" })
2057
2072
  }
@@ -2480,6 +2495,7 @@ var StatefulSettingsTrigger = ({ variant }) => {
2480
2495
  "aria-label": isAudio ? t("reader.playback.preferences.audio.title") : t("reader.preferences.title"),
2481
2496
  placement: "bottom",
2482
2497
  tooltipLabel: isAudio ? t("reader.playback.preferences.audio.title") : t("reader.preferences.title"),
2498
+ shortcut: preferences.actionsKeys["settings" /* settings */].shortcut,
2483
2499
  onPress: () => setOpen(!actionState?.isOpen),
2484
2500
  children: isAudio ? /* @__PURE__ */ jsx(instant_mix_default, { "aria-hidden": "true", focusable: "false" }) : /* @__PURE__ */ jsx(match_case_default, { "aria-hidden": "true", focusable: "false" })
2485
2501
  }
@@ -2766,6 +2782,7 @@ var StatefulTocTrigger = ({ variant }) => {
2766
2782
  "aria-label": t("reader.tableOfContents.title"),
2767
2783
  placement: "bottom",
2768
2784
  tooltipLabel: t("reader.tableOfContents.title"),
2785
+ shortcut: preferences.actionsKeys["toc" /* toc */].shortcut,
2769
2786
  onPress: () => setOpen(!actionState?.isOpen),
2770
2787
  children: /* @__PURE__ */ jsx(toc_default, { "aria-hidden": "true", focusable: "false" })
2771
2788
  }
@@ -3858,14 +3875,55 @@ var StatefulLetterSpacing = ({ standalone = true }) => {
3858
3875
  }
3859
3876
  ) });
3860
3877
  };
3878
+ var ORDERED_LINE_HEIGHT_OPTIONS = ["small" /* small */, "medium" /* medium */, "large" /* large */];
3879
+ function spreadValues(values, globalMin, globalMax) {
3880
+ const n = values.length;
3881
+ if (n <= 1) return values;
3882
+ const indexed = values.map((v, i) => ({ v, i })).sort((a, b) => a.v - b.v);
3883
+ if (indexed.every((item, i) => i === 0 || item.v !== indexed[i - 1].v)) return values;
3884
+ const lo = indexed[0].v === indexed[n - 1].v ? globalMin : indexed[0].v;
3885
+ const hi = indexed[0].v === indexed[n - 1].v ? globalMax : indexed[n - 1].v;
3886
+ const step = (hi - lo) / (n - 1);
3887
+ const result = new Array(n);
3888
+ for (let i = 0; i < n; i++) result[indexed[i].i] = lo + i * step;
3889
+ return result;
3890
+ }
3891
+ var getLineHeightCompensation = (language) => {
3892
+ const data = i18nData;
3893
+ if (data[language]?.lineHeightCompensation !== void 0) return data[language].lineHeightCompensation;
3894
+ const stripped = language.split("-").slice(0, -1).join("-");
3895
+ if (stripped && data[stripped]?.lineHeightCompensation !== void 0) return data[stripped].lineHeightCompensation;
3896
+ return data.default?.lineHeightCompensation ?? 1;
3897
+ };
3861
3898
  var useLineHeight = () => {
3862
3899
  const { preferences } = usePreferences();
3863
- return useMemo(() => ({
3864
- ["publisher" /* publisher */]: null,
3865
- ["small" /* small */]: preferences.settings.keys["lineHeight" /* lineHeight */].keys["small" /* small */],
3866
- ["medium" /* medium */]: preferences.settings.keys["lineHeight" /* lineHeight */].keys["medium" /* medium */],
3867
- ["large" /* large */]: preferences.settings.keys["lineHeight" /* lineHeight */].keys["large" /* large */]
3868
- }), [preferences.settings.keys]);
3900
+ const fontLanguage = useAppSelector((state) => state.publication.fontLanguage);
3901
+ return useMemo(() => {
3902
+ const keys = preferences.settings.keys["lineHeight" /* lineHeight */].keys;
3903
+ const factor = getLineHeightCompensation(fontLanguage);
3904
+ const values = {
3905
+ ["publisher" /* publisher */]: null,
3906
+ ["small" /* small */]: keys["small" /* small */],
3907
+ ["medium" /* medium */]: keys["medium" /* medium */],
3908
+ ["large" /* large */]: keys["large" /* large */]
3909
+ };
3910
+ const compensate = (v) => v !== null ? v * factor : null;
3911
+ const compensatedValues = {
3912
+ ["publisher" /* publisher */]: null,
3913
+ ["small" /* small */]: compensate(values["small" /* small */]),
3914
+ ["medium" /* medium */]: compensate(values["medium" /* medium */]),
3915
+ ["large" /* large */]: compensate(values["large" /* large */])
3916
+ };
3917
+ const [minRange, maxRange] = lineHeightRangeConfig.range;
3918
+ const clamp = (v) => v === null ? minRange : Math.min(Math.max(v, minRange), maxRange);
3919
+ const ordered = ORDERED_LINE_HEIGHT_OPTIONS;
3920
+ const clamped = ordered.map((key) => clamp(compensatedValues[key]));
3921
+ const processed = spreadValues(clamped, minRange, maxRange);
3922
+ const processedValues = Object.fromEntries(
3923
+ ordered.map((key, i) => [key, processed[i]])
3924
+ );
3925
+ return { values, compensatedValues, processedValues, compensate };
3926
+ }, [preferences.settings.keys, fontLanguage]);
3869
3927
  };
3870
3928
  var SvgBook = (props) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", height: "24px", viewBox: "0 -960 960 960", width: "24px", fill: "inherit", ...props, children: /* @__PURE__ */ jsx("path", { d: "M240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h480q33 0 56.5 23.5T800-800v640q0 33-23.5 56.5T720-80H240Zm0-80h480v-640h-80v280l-100-60-100 60v-280H240v640Zm0 0v-640 640Zm200-360 100-60 100 60-100-60-100 60Z" }) });
3871
3929
  var book_default = SvgBook;
@@ -3881,20 +3939,18 @@ var StatefulLineHeight = ({ standalone = true }) => {
3881
3939
  const profile = useAppSelector((state) => state.reader.profile);
3882
3940
  const isWebPub = profile === "webPub";
3883
3941
  const publisherStyles = useReaderSetting("publisherStyles");
3884
- const { getSetting, submitPreferences, preferencesEditor } = useNavigator().visual;
3942
+ const { getSetting, submitPreferences } = useNavigator().visual;
3885
3943
  const prefKey = SETTINGS_KEY_TO_PREFERENCE["lineHeight" /* lineHeight */];
3886
3944
  const { getEffectiveSpacingValue, setLineHeight: setLineHeight2 } = useSpacingPresets();
3887
3945
  const lineHeight = getEffectiveSpacingValue("lineHeight" /* lineHeight */);
3888
- const lineHeightOptions = useLineHeight();
3889
- const lineHeightNumericValues = useMemo(
3890
- () => Object.values(lineHeightOptions).filter((v) => v !== null),
3891
- [lineHeightOptions]
3892
- );
3893
- const { presets: effectivePresets } = useEffectiveRange(
3894
- [Math.min(...lineHeightNumericValues), Math.max(...lineHeightNumericValues)],
3895
- preferencesEditor?.lineHeight?.supportedRange,
3896
- lineHeightNumericValues
3897
- );
3946
+ const { processedValues } = useLineHeight();
3947
+ const processedPresets = useMemo(() => {
3948
+ const result = /* @__PURE__ */ new Map();
3949
+ result.set("small" /* small */, processedValues["small" /* small */]);
3950
+ result.set("medium" /* medium */, processedValues["medium" /* medium */]);
3951
+ result.set("large" /* large */, processedValues["large" /* large */]);
3952
+ return result;
3953
+ }, [processedValues]);
3898
3954
  const items = useMemo(() => {
3899
3955
  const baseItems = [
3900
3956
  {
@@ -3915,10 +3971,7 @@ var StatefulLineHeight = ({ standalone = true }) => {
3915
3971
  label: t("reader.preferences.lineHeight.large"),
3916
3972
  value: "large" /* large */
3917
3973
  }
3918
- ].filter((item) => {
3919
- const v = lineHeightOptions[item.id];
3920
- return effectivePresets === void 0 || effectivePresets.includes(v);
3921
- });
3974
+ ].filter((item) => processedPresets.has(item.id));
3922
3975
  if (preferences.settings.keys["lineHeight" /* lineHeight */].allowUnset !== false) {
3923
3976
  baseItems.unshift({
3924
3977
  id: "publisher" /* publisher */,
@@ -3928,16 +3981,16 @@ var StatefulLineHeight = ({ standalone = true }) => {
3928
3981
  });
3929
3982
  }
3930
3983
  return baseItems;
3931
- }, [preferences.settings.keys, lineHeightOptions, effectivePresets, t]);
3984
+ }, [preferences.settings.keys, processedPresets, t]);
3932
3985
  const updatePreference = useCallback(async (value) => {
3933
- const computedValue = value === "publisher" /* publisher */ ? null : lineHeightOptions[value];
3986
+ const submitValue = value === "publisher" /* publisher */ ? null : processedPresets.get(value) ?? null;
3934
3987
  await submitPreferences({
3935
- [prefKey]: computedValue
3988
+ [prefKey]: submitValue
3936
3989
  });
3937
- const currentLineHeight = getSetting(prefKey);
3938
- const currentDisplayLineHeightOption = Object.entries(lineHeightOptions).find(([_key, value2]) => value2 === currentLineHeight)?.[0];
3990
+ const storedLineHeight = getSetting(prefKey);
3991
+ const currentDisplayLineHeightOption = [...processedPresets.entries()].find(([, v]) => v === storedLineHeight)?.[0];
3939
3992
  setLineHeight2(currentDisplayLineHeightOption);
3940
- }, [prefKey, submitPreferences, getSetting, setLineHeight2, lineHeightOptions]);
3993
+ }, [prefKey, submitPreferences, getSetting, setLineHeight2, processedPresets]);
3941
3994
  return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
3942
3995
  StatefulRadioGroup,
3943
3996
  {
@@ -4113,7 +4166,7 @@ var StatefulPublisherStyles = ({ standalone = true }) => {
4113
4166
  const paragraphSpacing = getEffectiveSpacingValue("paragraphSpacing" /* paragraphSpacing */);
4114
4167
  const letterSpacing = getEffectiveSpacingValue("letterSpacing" /* letterSpacing */);
4115
4168
  const wordSpacing = getEffectiveSpacingValue("wordSpacing" /* wordSpacing */);
4116
- const lineHeightOptions = useLineHeight();
4169
+ const { compensatedValues: lineHeightOptions } = useLineHeight();
4117
4170
  const { submitPreferences } = useNavigator().visual;
4118
4171
  const lineHeightPrefKey = SETTINGS_KEY_TO_PREFERENCE["lineHeight" /* lineHeight */];
4119
4172
  const paragraphIndentPrefKey = SETTINGS_KEY_TO_PREFERENCE["paragraphIndent" /* paragraphIndent */];
@@ -4206,7 +4259,7 @@ var StatefulSpacingPresets = ({ standalone }) => {
4206
4259
  const paragraphIndentPrefKey = SETTINGS_KEY_TO_PREFERENCE["paragraphIndent" /* paragraphIndent */];
4207
4260
  const paragraphSpacingPrefKey = SETTINGS_KEY_TO_PREFERENCE["paragraphSpacing" /* paragraphSpacing */];
4208
4261
  const wordSpacingPrefKey = SETTINGS_KEY_TO_PREFERENCE["wordSpacing" /* wordSpacing */];
4209
- const lineHeightOptions = useLineHeight();
4262
+ const { values: lineHeightOptions, compensate: compensateLineHeight } = useLineHeight();
4210
4263
  const { getPresetValues } = useSpacingPresets();
4211
4264
  const publicationType = isWebPub ? "webpub" : isFXL ? "fxl" : "reflow";
4212
4265
  const { isComponentUsed: isLetterSpacingUsed } = useSettingsComponentStatus({
@@ -4240,7 +4293,7 @@ var StatefulSpacingPresets = ({ standalone }) => {
4240
4293
  ["wordSpacing" /* wordSpacing */]: presetValues?.["wordSpacing" /* wordSpacing */] ?? null
4241
4294
  };
4242
4295
  const lineHeightValue = reduxValues["lineHeight" /* lineHeight */];
4243
- const lineHeightValueNumber = lineHeightValue && lineHeightValue !== "publisher" /* publisher */ ? lineHeightOptions[lineHeightValue] : null;
4296
+ const lineHeightValueNumber = lineHeightValue && lineHeightValue !== "publisher" /* publisher */ ? compensateLineHeight(lineHeightOptions[lineHeightValue]) : null;
4244
4297
  const preferencesToSubmit = {};
4245
4298
  if (isLetterSpacingUsed) {
4246
4299
  preferencesToSubmit[letterSpacingPrefKey] = reduxValues["letterSpacing" /* letterSpacing */];
@@ -4269,7 +4322,7 @@ var StatefulSpacingPresets = ({ standalone }) => {
4269
4322
  values: reduxValues
4270
4323
  }));
4271
4324
  }
4272
- }, [isWebPub, dispatch, submitPreferences, getPresetValues, lineHeightOptions, letterSpacingPrefKey, lineHeightPrefKey, paragraphIndentPrefKey, paragraphSpacingPrefKey, wordSpacingPrefKey, isLetterSpacingUsed, isLineHeightUsed, isParagraphIndentUsed, isParagraphSpacingUsed, isWordSpacingUsed]);
4325
+ }, [isWebPub, dispatch, submitPreferences, getPresetValues, lineHeightOptions, compensateLineHeight, letterSpacingPrefKey, lineHeightPrefKey, paragraphIndentPrefKey, paragraphSpacingPrefKey, wordSpacingPrefKey, isLetterSpacingUsed, isLineHeightUsed, isParagraphIndentUsed, isParagraphSpacingUsed, isWordSpacingUsed]);
4273
4326
  const spacingKeys = useMemo(() => {
4274
4327
  const baseKeys = isWebPub ? webPubSpacingPresetKeys : isFXL ? fxlSpacingPresetKeys : reflowSpacingPresetKeys;
4275
4328
  const subPanelKeys = subPanelSpacingSettingsKeys || [];
@@ -4750,7 +4803,7 @@ var createDefaultPlugin = () => {
4750
4803
  id: "core",
4751
4804
  name: "Core Components",
4752
4805
  description: "Default components for Thorium Web Epub StatefulReader",
4753
- version: "1.4.0",
4806
+ version: "1.5.0",
4754
4807
  components: {
4755
4808
  actions: {
4756
4809
  ["fullscreen" /* fullscreen */]: {
@@ -5344,6 +5397,8 @@ var StatefulAudioVolumeTrigger = ({ ref }) => {
5344
5397
  const { t } = useI18n();
5345
5398
  const profile = useAppSelector((state) => state.reader.profile);
5346
5399
  const { preferences } = useAudioPreferences();
5400
+ const { actionsKeys } = useActionsPreferences();
5401
+ const shortcut = actionsKeys["audio.volume" /* volume */]?.shortcut;
5347
5402
  const { preferencesEditor } = useNavigator().media;
5348
5403
  const volume = useAppSelector((state) => state.audioSettings.volume);
5349
5404
  const isTrackReady = useAppSelector((state) => state.player.isTrackReady);
@@ -5365,6 +5420,7 @@ var StatefulAudioVolumeTrigger = ({ ref }) => {
5365
5420
  {
5366
5421
  ref,
5367
5422
  tooltipLabel: t("reader.playback.preferences.audio.volume"),
5423
+ shortcut,
5368
5424
  placement: "top",
5369
5425
  onPress: () => {
5370
5426
  if (profile) {
@@ -5448,6 +5504,8 @@ var thorium_web_playbackRate_default = {
5448
5504
  var StatefulAudioPlaybackRateTrigger = ({ ref }) => {
5449
5505
  const { t } = useI18n();
5450
5506
  const profile = useAppSelector((state) => state.reader.profile);
5507
+ const { actionsKeys } = useActionsPreferences();
5508
+ const shortcut = actionsKeys["audio.playbackRate" /* playbackRate */]?.shortcut;
5451
5509
  const playbackRate = useAppSelector((state) => state.audioSettings.playbackRate);
5452
5510
  const isTrackReady = useAppSelector((state) => state.player.isTrackReady);
5453
5511
  const isStalled = useAppSelector((state) => state.player.isStalled);
@@ -5458,6 +5516,7 @@ var StatefulAudioPlaybackRateTrigger = ({ ref }) => {
5458
5516
  {
5459
5517
  ref,
5460
5518
  tooltipLabel: t("reader.playback.preferences.playbackRate.descriptive"),
5519
+ shortcut,
5461
5520
  placement: "top",
5462
5521
  onPress: () => {
5463
5522
  if (profile) {
@@ -5563,6 +5622,8 @@ var thorium_web_audioToc_default = {
5563
5622
  var StatefulAudioTocTrigger = ({ ref }) => {
5564
5623
  const { t } = useI18n();
5565
5624
  const profile = useAppSelector((state) => state.reader.profile);
5625
+ const { actionsKeys } = useActionsPreferences();
5626
+ const shortcut = actionsKeys["audio.toc" /* toc */]?.shortcut;
5566
5627
  const isTrackReady = useAppSelector((state) => state.player.isTrackReady);
5567
5628
  const isStalled = useAppSelector((state) => state.player.isStalled);
5568
5629
  const isDisabled = !isTrackReady || isStalled;
@@ -5572,6 +5633,7 @@ var StatefulAudioTocTrigger = ({ ref }) => {
5572
5633
  {
5573
5634
  ref,
5574
5635
  tooltipLabel: t("reader.tableOfContents.title"),
5636
+ shortcut,
5575
5637
  placement: "top",
5576
5638
  onPress: () => {
5577
5639
  if (profile) {
@@ -5691,6 +5753,8 @@ var thorium_web_sleepTimer_default = {
5691
5753
  var StatefulAudioSleepTimerTrigger = ({ ref }) => {
5692
5754
  const { t } = useI18n();
5693
5755
  const profile = useAppSelector((state) => state.reader.profile);
5756
+ const { actionsKeys } = useActionsPreferences();
5757
+ const shortcut = actionsKeys["audio.sleepTimer" /* sleepTimer */]?.shortcut;
5694
5758
  const remainingSeconds = useAppSelector((state) => state.player.sleepTimer.remainingSeconds);
5695
5759
  const onTrackEnd = useAppSelector((state) => state.player.sleepTimer.onTrackEnd);
5696
5760
  const onFragmentEnd = useAppSelector((state) => state.player.sleepTimer.onFragmentEnd);
@@ -5713,6 +5777,7 @@ var StatefulAudioSleepTimerTrigger = ({ ref }) => {
5713
5777
  {
5714
5778
  ref,
5715
5779
  tooltipLabel: t("reader.playback.preferences.sleepTimer.descriptive"),
5780
+ shortcut,
5716
5781
  placement: "top",
5717
5782
  onPress: () => {
5718
5783
  if (profile) {
@@ -6014,7 +6079,7 @@ var createAudioDefaultPlugin = () => {
6014
6079
  id: "audio-core",
6015
6080
  name: "Audio Core Components",
6016
6081
  description: "Default components for Thorium Web Audio StatefulReader",
6017
- version: "1.4.0",
6082
+ version: "1.5.0",
6018
6083
  components: {
6019
6084
  actions: {
6020
6085
  ["settings" /* settings */]: {
@@ -6080,6 +6145,39 @@ var StatefulGlobalPreferencesProvider = ({
6080
6145
  return /* @__PURE__ */ jsx(ThGlobalPreferencesProvider, { adapter, initialPreferences, children });
6081
6146
  };
6082
6147
 
6148
+ // src/helpers/peripherals.ts
6149
+ var NavPeripheralType = {
6150
+ progressForward: "th_nav_progress_forward",
6151
+ progressBackward: "th_nav_progress_backward",
6152
+ moveRight: "th_nav_move_right",
6153
+ moveLeft: "th_nav_move_left",
6154
+ moveUp: "th_nav_move_up",
6155
+ moveDown: "th_nav_move_down",
6156
+ moveHome: "th_nav_move_home",
6157
+ moveEnd: "th_nav_move_end",
6158
+ zoomIn: "th_nav_zoom_in",
6159
+ zoomOut: "th_nav_zoom_out"
6160
+ };
6161
+ var ZOOM_IN_KEY_COMBOS = [
6162
+ { keyCode: 187, ctrl: true },
6163
+ { keyCode: 61, ctrl: true },
6164
+ { keyCode: 107, ctrl: true },
6165
+ { keyCode: 187, meta: true },
6166
+ { keyCode: 61, meta: true },
6167
+ { keyCode: 107, meta: true }
6168
+ ];
6169
+ var ZOOM_OUT_KEY_COMBOS = [
6170
+ { keyCode: 189, ctrl: true },
6171
+ { keyCode: 173, ctrl: true },
6172
+ { keyCode: 109, ctrl: true },
6173
+ { keyCode: 189, meta: true },
6174
+ { keyCode: 173, meta: true },
6175
+ { keyCode: 109, meta: true }
6176
+ ];
6177
+ var ACTION_PERIPHERAL_PREFIX = "th_action_";
6178
+ var toActionPeripheralType = (key) => `${ACTION_PERIPHERAL_PREFIX}${key}`;
6179
+ var fromActionPeripheralType = (type) => type.startsWith(ACTION_PERIPHERAL_PREFIX) ? type.slice(ACTION_PERIPHERAL_PREFIX.length) : null;
6180
+
6083
6181
  // src/components/assets/styles/thorium-web.reader.app.module.css
6084
6182
  var thorium_web_reader_app_default = {
6085
6183
  wrapper: "thorium_web_reader_app_wrapper",
@@ -6572,6 +6670,6 @@ var useReaderHeaderBase = (actionKeys) => {
6572
6670
  };
6573
6671
  };
6574
6672
 
6575
- export { NavigatorProvider, StatefulActionIcon, StatefulAudioAutoPlay, StatefulAudioPlaybackRateContainer, StatefulAudioPlaybackRateTrigger, StatefulAudioRemotePlaybackTrigger, StatefulAudioSettingsContainer, StatefulAudioSkipBackwardInterval, StatefulAudioSkipForwardInterval, StatefulAudioSkipInterval, StatefulAudioSleepTimerContainer, StatefulAudioSleepTimerTrigger, StatefulAudioTocContainer, StatefulAudioTocTrigger, StatefulAudioVolumeContainer, StatefulAudioVolumeTrigger, StatefulBackLink, StatefulBottomSheet, StatefulCollapsibleActionsBar, StatefulColumns, StatefulCompactPopoverSheet, StatefulDockedSheet, StatefulDockingWrapper, StatefulDropdown, StatefulFontFamily, StatefulFullScreenSheet, StatefulFullscreenTrigger, StatefulGlobalPreferencesProvider, StatefulGroupWrapper, StatefulHyphens, StatefulJumpToPositionContainer, StatefulJumpToPositionTrigger, StatefulLayout, StatefulLetterSpacing, StatefulLigatures, StatefulLineHeight, StatefulModalBase, StatefulModalSheet, StatefulNoRuby, StatefulNumberField, StatefulOverflowMenu, StatefulOverflowMenuItem, StatefulParagraphIndent, StatefulParagraphSpacing, StatefulPopoverSheet, StatefulPreferencesProvider, StatefulPublisherStyles, StatefulRadioGroup, StatefulSettingsTrigger, StatefulSettingsWrapper, StatefulSheetWrapper, StatefulSlider, StatefulSliderWithPresets, StatefulSpacingGroup, StatefulSpacingGroupContainer, StatefulSpacingPresets, StatefulSwitch, StatefulTextAlign, StatefulTextGroup, StatefulTextGroupContainer, StatefulTextNormalize, StatefulTheme, StatefulTocContainer, StatefulTocTrigger, StatefulVisualSettingsContainer, StatefulWordSpacing, StatefulZoom, UnstableStatefulFontWeight, createAudioDefaultPlugin, createDefaultPlugin, thorium_web_button_default, thorium_web_overflow_default, thorium_web_reader_app_default, thorium_web_reader_header_default, useDocking, useEffectiveRange, useGridNavigation, useGridTemplate, useIsScroll, useLineHeight, useNavigator, usePlaceholder, usePositionStorage, usePublication, useReaderHeaderBase, useReaderSetting, useReaderTransitions, useSettingsComponentStatus, useSpacingPresets };
6576
- //# sourceMappingURL=chunk-MSHUPSBI.mjs.map
6577
- //# sourceMappingURL=chunk-MSHUPSBI.mjs.map
6673
+ export { NavPeripheralType, NavigatorProvider, ORDERED_LINE_HEIGHT_OPTIONS, StatefulActionIcon, StatefulAudioAutoPlay, StatefulAudioPlaybackRateContainer, StatefulAudioPlaybackRateTrigger, StatefulAudioRemotePlaybackTrigger, StatefulAudioSettingsContainer, StatefulAudioSkipBackwardInterval, StatefulAudioSkipForwardInterval, StatefulAudioSkipInterval, StatefulAudioSleepTimerContainer, StatefulAudioSleepTimerTrigger, StatefulAudioTocContainer, StatefulAudioTocTrigger, StatefulAudioVolumeContainer, StatefulAudioVolumeTrigger, StatefulBackLink, StatefulBottomSheet, StatefulCollapsibleActionsBar, StatefulColumns, StatefulCompactPopoverSheet, StatefulDockedSheet, StatefulDockingWrapper, StatefulDropdown, StatefulFontFamily, StatefulFullScreenSheet, StatefulFullscreenTrigger, StatefulGlobalPreferencesProvider, StatefulGroupWrapper, StatefulHyphens, StatefulJumpToPositionContainer, StatefulJumpToPositionTrigger, StatefulLayout, StatefulLetterSpacing, StatefulLigatures, StatefulLineHeight, StatefulModalBase, StatefulModalSheet, StatefulNoRuby, StatefulNumberField, StatefulOverflowMenu, StatefulOverflowMenuItem, StatefulParagraphIndent, StatefulParagraphSpacing, StatefulPopoverSheet, StatefulPreferencesProvider, StatefulPublisherStyles, StatefulRadioGroup, StatefulSettingsTrigger, StatefulSettingsWrapper, StatefulSheetWrapper, StatefulSlider, StatefulSliderWithPresets, StatefulSpacingGroup, StatefulSpacingGroupContainer, StatefulSpacingPresets, StatefulSwitch, StatefulTextAlign, StatefulTextGroup, StatefulTextGroupContainer, StatefulTextNormalize, StatefulTheme, StatefulTocContainer, StatefulTocTrigger, StatefulVisualSettingsContainer, StatefulWordSpacing, StatefulZoom, UnstableStatefulFontWeight, ZOOM_IN_KEY_COMBOS, ZOOM_OUT_KEY_COMBOS, createAudioDefaultPlugin, createDefaultPlugin, fromActionPeripheralType, thorium_web_button_default, thorium_web_overflow_default, thorium_web_reader_app_default, thorium_web_reader_header_default, toActionPeripheralType, useDocking, useEffectiveRange, useGridNavigation, useGridTemplate, useIsScroll, useLineHeight, useNavigator, usePlaceholder, usePositionStorage, usePublication, useReaderHeaderBase, useReaderSetting, useReaderTransitions, useSettingsComponentStatus, useSpacingPresets };
6674
+ //# sourceMappingURL=chunk-KJ55Q63A.mjs.map
6675
+ //# sourceMappingURL=chunk-KJ55Q63A.mjs.map