@edrlab/thorium-web 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/{ThPreferencesAdapter-L1H6gzmu.d.mts → ThPreferencesAdapter-_5AePKHa.d.mts} +5 -3
  2. package/dist/{ThSettingsWrapper-DWEA4hYF.d.mts → ThSettingsWrapper-B_9klYXH.d.mts} +1 -1
  3. package/dist/{actions-BjeRjaJU.d.mts → actions-CuRRM3rp.d.mts} +4 -1
  4. package/dist/{actionsReducer-B32cq2mB.d.mts → actionsReducer-VFR42qgL.d.mts} +1 -1
  5. package/dist/{chunk-NUXGQWED.mjs → chunk-2NCN2AG2.mjs} +3 -3
  6. package/dist/{chunk-NUXGQWED.mjs.map → chunk-2NCN2AG2.mjs.map} +1 -1
  7. package/dist/{chunk-5LUMM7FW.mjs → chunk-44PEO3DS.mjs} +2 -2
  8. package/dist/{chunk-5LUMM7FW.mjs.map → chunk-44PEO3DS.mjs.map} +1 -1
  9. package/dist/chunk-AQSJDL63.mjs +193 -0
  10. package/dist/chunk-AQSJDL63.mjs.map +1 -0
  11. package/dist/{chunk-T5ENYSDJ.mjs → chunk-DQDOOTCE.mjs} +3 -3
  12. package/dist/{chunk-T5ENYSDJ.mjs.map → chunk-DQDOOTCE.mjs.map} +1 -1
  13. package/dist/{chunk-QUSGPT5M.mjs → chunk-E2JEGVVE.mjs} +12 -11
  14. package/dist/chunk-E2JEGVVE.mjs.map +1 -0
  15. package/dist/{chunk-P6ILEQ5P.mjs → chunk-ETLIGONP.mjs} +17 -9
  16. package/dist/chunk-ETLIGONP.mjs.map +1 -0
  17. package/dist/chunk-GNROODJB.mjs +9 -0
  18. package/dist/chunk-GNROODJB.mjs.map +1 -0
  19. package/dist/{chunk-6MONB2DN.mjs → chunk-KGSFTRCH.mjs} +15 -37
  20. package/dist/chunk-KGSFTRCH.mjs.map +1 -0
  21. package/dist/{chunk-PXXWEMNL.mjs → chunk-MSHUPSBI.mjs} +54 -38
  22. package/dist/chunk-MSHUPSBI.mjs.map +1 -0
  23. package/dist/{chunk-XRFLDNAY.mjs → chunk-OD75GC5N.mjs} +52 -12
  24. package/dist/chunk-OD75GC5N.mjs.map +1 -0
  25. package/dist/{chunk-KVUG6BNI.mjs → chunk-RBEPH5E5.mjs} +19 -13
  26. package/dist/chunk-RBEPH5E5.mjs.map +1 -0
  27. package/dist/{chunk-TSLTLQ6O.mjs → chunk-SI4FBFHM.mjs} +20 -16
  28. package/dist/chunk-SI4FBFHM.mjs.map +1 -0
  29. package/dist/{chunk-IVXRCKWR.mjs → chunk-WF2UOYO7.mjs} +4 -4
  30. package/dist/{chunk-IVXRCKWR.mjs.map → chunk-WF2UOYO7.mjs.map} +1 -1
  31. package/dist/{chunk-WLVE3WNW.mjs → chunk-YEVLT3AV.mjs} +12 -7
  32. package/dist/chunk-YEVLT3AV.mjs.map +1 -0
  33. package/dist/components/Audio/index.css +2 -1
  34. package/dist/components/Audio/index.css.map +1 -1
  35. package/dist/components/Audio/index.d.mts +14 -13
  36. package/dist/components/Audio/index.mjs +10 -10
  37. package/dist/components/Epub/index.css +2 -1
  38. package/dist/components/Epub/index.css.map +1 -1
  39. package/dist/components/Epub/index.d.mts +11 -11
  40. package/dist/components/Epub/index.mjs +11 -11
  41. package/dist/components/Misc/index.mjs +5 -5
  42. package/dist/components/Reader/index.css +2 -1
  43. package/dist/components/Reader/index.css.map +1 -1
  44. package/dist/components/Reader/index.d.mts +9 -9
  45. package/dist/components/Reader/index.mjs +24 -22
  46. package/dist/components/Reader/index.mjs.map +1 -1
  47. package/dist/components/WebPub/index.css +2 -1
  48. package/dist/components/WebPub/index.css.map +1 -1
  49. package/dist/components/WebPub/index.d.mts +11 -11
  50. package/dist/components/WebPub/index.mjs +11 -11
  51. package/dist/core/Components/index.d.mts +6 -6
  52. package/dist/core/Components/index.mjs +2 -2
  53. package/dist/core/Helpers/index.mjs +1 -1
  54. package/dist/core/Hooks/index.d.mts +4 -4
  55. package/dist/i18n/index.mjs +3 -3
  56. package/dist/lib/index.d.mts +15 -8
  57. package/dist/lib/index.mjs +2 -2
  58. package/dist/locales/da/thorium-web.json +37 -2
  59. package/dist/locales/fi/thorium-web.json +1 -1
  60. package/dist/locales/fr/thorium-web.json +1 -1
  61. package/dist/locales/lt/thorium-web.json +26 -1
  62. package/dist/next-lib/index.mjs +1 -1
  63. package/dist/next-lib/index.mjs.map +1 -1
  64. package/dist/preferences/index.d.mts +8 -8
  65. package/dist/preferences/index.mjs +4 -4
  66. package/dist/{settingsReducer-DLaT2wUB.d.mts → settingsReducer-VqBhLq50.d.mts} +1 -1
  67. package/dist/{useContrast-Bo7cDw_X.d.mts → useContrast-Cbso7N1l.d.mts} +1 -1
  68. package/dist/{usePreferences-D8NU1yhP.d.mts → usePreferences-9ZvbcbLW.d.mts} +3 -3
  69. package/dist/{useReaderTransitions-BQGzKeY2.d.mts → useReaderTransitions-0hKGCvMm.d.mts} +10 -9
  70. package/package.json +5 -5
  71. package/dist/chunk-6MONB2DN.mjs.map +0 -1
  72. package/dist/chunk-B3WDMWCT.mjs +0 -9
  73. package/dist/chunk-B3WDMWCT.mjs.map +0 -1
  74. package/dist/chunk-KVUG6BNI.mjs.map +0 -1
  75. package/dist/chunk-MLEYTQGK.mjs +0 -60
  76. package/dist/chunk-MLEYTQGK.mjs.map +0 -1
  77. package/dist/chunk-P6ILEQ5P.mjs.map +0 -1
  78. package/dist/chunk-PXXWEMNL.mjs.map +0 -1
  79. package/dist/chunk-QUSGPT5M.mjs.map +0 -1
  80. package/dist/chunk-TSLTLQ6O.mjs.map +0 -1
  81. package/dist/chunk-WLVE3WNW.mjs.map +0 -1
  82. package/dist/chunk-XRFLDNAY.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { e as UnstableShortcutRepresentation } from './keyboardUtilities-BWAyLS_D.mjs';
2
2
  import { B as BreakpointsMap, d as ThBreakpoints, e as ThBreakpointsObject, f as ThDocumentTitleFormat, T as ThBackLinkPref, g as ThFormatPref, h as ThRunningHeadFormat, i as ThProgressionFormat, j as ThLayoutUI, k as ThPaginatedAffordancePref } from './ui-DnZZhozX.mjs';
3
- import { I as I18nValue, e as ThColorScheme, f as ThContrast, g as ThSettingsKeys, h as ThTextSettingsKeys, b as ThSpacingSettingsKeys, d as ThSettingsRangePrefRequired, i as ThSettingsRadioPref, T as ThLineHeightOptions, j as ThSettingsGroupPref, a as ThSpacingPresetKeys } from './useContrast-Bo7cDw_X.mjs';
4
- import { e as ThSheetTypes, g as ThActionsKeys, d as ThCollapsibility, c as ThActionsTokens, f as ThDockingPref, T as ThDockingKeys } from './actions-BjeRjaJU.mjs';
3
+ import { I as I18nValue, e as ThColorScheme, f as ThContrast, g as ThSettingsKeys, h as ThTextSettingsKeys, b as ThSpacingSettingsKeys, d as ThSettingsRangePrefRequired, i as ThSettingsRadioPref, T as ThLineHeightOptions, j as ThSettingsGroupPref, a as ThSpacingPresetKeys } from './useContrast-Cbso7N1l.mjs';
4
+ import { e as ThSheetTypes, g as ThActionsKeys, d as ThCollapsibility, c as ThActionsTokens, f as ThDockingPref, T as ThDockingKeys } from './actions-CuRRM3rp.mjs';
5
5
  import { IContentProtectionConfig, IAudioContentProtectionConfig, ExperimentKey } from '@readium/navigator';
6
6
 
7
7
  type CSSValueUnitless = `${number}`;
@@ -350,8 +350,9 @@ interface useThemingProps<T extends string> {
350
350
  onMonochromeChange?: (isMonochrome: boolean) => void;
351
351
  onReducedMotionChange?: (reducedMotion: boolean) => void;
352
352
  onReducedTransparencyChange?: (reducedTransparency: boolean) => void;
353
+ onContainerBreakpointChange?: (breakpoint: ThBreakpoints | null) => void;
353
354
  }
354
- declare const useTheming: <T extends string>({ theme, systemKeys, themeKeys, breakpointsMap, initProps, coverUrl, autoThemeSource, onBreakpointChange, onColorSchemeChange, onContrastChange, onForcedColorsChange, onMonochromeChange, onReducedMotionChange, onReducedTransparencyChange, onCoverThemeGenerated, }: useThemingProps<T>) => {
355
+ declare const useTheming: <T extends string>({ theme, systemKeys, themeKeys, breakpointsMap, initProps, coverUrl, autoThemeSource, onBreakpointChange, onColorSchemeChange, onContrastChange, onForcedColorsChange, onMonochromeChange, onReducedMotionChange, onReducedTransparencyChange, onCoverThemeGenerated, onContainerBreakpointChange, }: useThemingProps<T>) => {
355
356
  inferThemeAuto: () => T | undefined;
356
357
  theme: string | undefined;
357
358
  breakpoints: ThBreakpointsObject;
@@ -363,6 +364,7 @@ declare const useTheming: <T extends string>({ theme, systemKeys, themeKeys, bre
363
364
  reducedTransparency: boolean;
364
365
  coverThemeTokens: ThemeTokens | null;
365
366
  themeResolved: boolean;
367
+ setContainerRef: (el: Element | null) => void;
366
368
  };
367
369
 
368
370
  interface ThGlobalPreferences {
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React__default, { ComponentType, SVGProps } from 'react';
3
3
  import { TooltipTriggerProps, KeyboardProps } from 'react-aria';
4
4
  import { ButtonProps, TooltipProps, MenuItemProps, LabelProps, MenuProps, MenuTriggerProps, PopoverProps, NumberFieldProps, GroupProps, InputProps, RadioGroupProps, RadioProps, SliderProps, SliderOutputProps, SliderTrackProps, SliderThumbProps, SwitchProps, HeadingProps, SelectProps, Button, ListBoxProps, ListBox, ListBoxItemProps, Heading } from 'react-aria-components';
5
- import { h as ThActionEntry, i as ThActionsBarProps, C as CollapsiblePref } from './actions-BjeRjaJU.mjs';
5
+ import { h as ThActionEntry, i as ThActionsBarProps, C as CollapsiblePref } from './actions-CuRRM3rp.mjs';
6
6
 
7
7
  interface HTMLAttributesWithRef<T> extends React.HTMLAttributes<T> {
8
8
  ref?: React.ForwardedRef<T>;
@@ -1,3 +1,4 @@
1
+ import { RefObject } from 'react';
1
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
3
  import { ToolbarProps } from 'react-aria-components';
3
4
  import { B as BreakpointsMap } from './ui-DnZZhozX.mjs';
@@ -33,9 +34,11 @@ interface CollapsiblePref {
33
34
  };
34
35
  };
35
36
  }
36
- declare const useCollapsibility: (items: ThActionEntry<string>[], prefs: CollapsiblePref, breakpoint?: string) => {
37
+ declare const useCollapsibility: (items: ThActionEntry<string>[], prefs: CollapsiblePref, breakpoint?: string, containerRef?: RefObject<HTMLElement | null>) => {
37
38
  ActionIcons: ThActionEntry<string>[];
38
39
  MenuItems: ThActionEntry<string>[];
40
+ getItemRef: (key: string) => (el: HTMLElement | null) => void;
41
+ getGhostRef: (el: HTMLDivElement | null) => void;
39
42
  };
40
43
 
41
44
  type ThBottomSheetDetent = "content-height" | "full-height";
@@ -1,6 +1,6 @@
1
1
  import * as _reduxjs_toolkit from '@reduxjs/toolkit';
2
2
  import { W as WritableDraft } from './immer.d-CoRThNOF.mjs';
3
- import { T as ThDockingKeys } from './actions-BjeRjaJU.mjs';
3
+ import { T as ThDockingKeys } from './actions-CuRRM3rp.mjs';
4
4
 
5
5
  type ActionsStateKeys = string;
6
6
  type OverflowStateKeys = string;
@@ -1,4 +1,4 @@
1
- import { supportedLocales } from './chunk-B3WDMWCT.mjs';
1
+ import { supportedLocales } from './chunk-GNROODJB.mjs';
2
2
  import i18n from 'i18next';
3
3
  export { default as i18n } from 'i18next';
4
4
  import { initReactI18next, useTranslation } from 'react-i18next';
@@ -67,5 +67,5 @@ var useI18n = (ns) => {
67
67
  };
68
68
 
69
69
  export { DEFAULT_CONFIG, initI18n, useI18n };
70
- //# sourceMappingURL=chunk-NUXGQWED.mjs.map
71
- //# sourceMappingURL=chunk-NUXGQWED.mjs.map
70
+ //# sourceMappingURL=chunk-2NCN2AG2.mjs.map
71
+ //# sourceMappingURL=chunk-2NCN2AG2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/config.ts","../src/i18n/useI18n.ts"],"names":["i18n"],"mappings":";;;;;;;;AAOO,IAAM,cAAA,GAA8B;AAAA,EACzC,WAAA,EAAa,IAAA;AAAA,EACb,IAAA,EAAM,KAAA;AAAA,EACN,wBAAA,EAA0B,IAAA;AAAA,EAC1B,aAAA,EAAe,gBAAA;AAAA,EACf,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,IACnB,QAAQ;AAAC,GACX;AAAA,EACA,aAAA,EAAe;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI,CAAC,gBAAA,EAAkB,aAAa,CAAA;AAAA,EACpC,SAAA,EAAW,CAAC,aAAA,EAAe,gBAAgB,CAAA;AAAA,EAC3C,iBAAA,EAAmB;AACrB;AAEO,IAAM,QAAA,GAAW,OAAO,OAAA,GAAgC,EAAC,KAAM;AACpE,EAAA,IAAI,KAAK,aAAA,EAAe;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CACJ,GAAA,CAAI,OAAO,CAAA,CACX,GAAA,CAAI,gBAAgB,CAAA,CACpB,GAAA,CAAI,gBAAgB,CAAA,CACpB,IAAA,CAAK;AAAA,IACJ,GAAG,cAAA;AAAA,IACH,GAAG;AAAA,GACJ,CAAA;AACL;AC/BO,IAAM,OAAA,GAAU,CAAC,EAAA,KAA2B;AAGjD,EAAA,MAAM,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAAA,KAAAA,EAAM,OAAM,GAAI,cAAA,CAAe,EAAA,IAAM,cAAA,CAAe,EAAc,CAAA;AAGnF,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAgB;AACtC,IAAA,OAAOA,KAAAA,CAAK,eAAe,GAAG,CAAA;AAAA,EAChC,CAAA;AAGA,EAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAC,GAAA,EAAa,OAAA,KAA0B;AAC5D,IAAA,IAAI,EAAA,EAAI;AAEN,MAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,IAC1B,CAAA,MAAO;AAEL,MAAA,KAAA,MAAW,SAAA,IAAa,eAAe,EAAA,EAAgB;AACrD,QAAA,MAAM,MAAA,GAAS,KAAK,GAAA,EAAK,EAAE,GAAG,OAAA,EAAS,EAAA,EAAI,WAAW,CAAA;AACtD,QAAA,IAAI,MAAA,KAAW,KAAK,OAAO,MAAA;AAAA,MAC7B;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,EAAA,EAAI,IAAI,CAAC,CAAA;AAEb,EAAA,OAAO;AAAA;AAAA,IAEL,CAAA;AAAA;AAAA,IAEA,IAAA,EAAAA,KAAAA;AAAA;AAAA,IAEA,KAAA;AAAA;AAAA,IAEA,iBAAiBA,KAAAA,CAAK,QAAA;AAAA;AAAA,IAEtB,WAAWA,KAAAA,CAAK,SAAA;AAAA;AAAA,IAEhB;AAAA,GACF;AACF","file":"chunk-NUXGQWED.mjs","sourcesContent":["import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport Backend from \"i18next-http-backend\";\nimport { InitOptions } from \"i18next\";\nimport { supportedLocales } from \"./supported-locales\";\n\nexport const DEFAULT_CONFIG: InitOptions = {\n fallbackLng: \"en\",\n load: \"all\",\n nonExplicitSupportedLngs: true,\n supportedLngs: supportedLocales,\n detection: {\n order: [\"navigator\"],\n caches: []\n },\n interpolation: {\n escapeValue: false\n },\n backend: {\n loadPath: \"/locales/{{lng}}/{{ns}}.json\"\n },\n ns: [\"thorium-shared\", \"thorium-web\"],\n defaultNS: [\"thorium-web\", \"thorium-shared\"],\n returnEmptyString: false\n};\n\nexport const initI18n = async (options: Partial<InitOptions> = {}) => {\n if (i18n.isInitialized) {\n return i18n;\n }\n\n return i18n\n .use(Backend)\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n ...DEFAULT_CONFIG,\n ...options\n });\n};\n\nexport { i18n };","import { useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { DEFAULT_CONFIG } from \"./config\";\n\n/**\n * Hook to access the i18n instance and translation functions\n * @param ns Optional additional namespace(s) to include alongside the default namespaces\n * @returns Translation functions and i18n instance\n */\nexport const useI18n = (ns?: string | string[]) => {\n // If no namespace provided, use both defaults with fallback\n // If namespace provided, use only that (override behavior)\n const { t: tRaw, i18n, ready } = useTranslation(ns || DEFAULT_CONFIG.ns as string[]);\n \n // Helper function to change language\n const changeLanguage = (lng: string) => {\n return i18n.changeLanguage(lng);\n };\n\n // Enhanced t function that searches both namespaces only when using defaults\n const t = useCallback((key: string, options?: any): string => {\n if (ns) {\n // If custom namespace provided, use it directly (no fallback)\n return tRaw(key, options) as string;\n } else {\n // If no namespace provided, search all default namespaces\n for (const namespace of DEFAULT_CONFIG.ns as string[]) {\n const result = tRaw(key, { ...options, ns: namespace });\n if (result !== key) return result as string;\n }\n return key;\n }\n }, [ns, tRaw]);\n\n return {\n // Translation function\n t,\n // i18n instance\n i18n,\n // Whether translations are loaded\n ready,\n // Current language\n currentLanguage: i18n.language,\n // List of available languages\n languages: i18n.languages,\n // Function to change language\n changeLanguage\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/i18n/config.ts","../src/i18n/useI18n.ts"],"names":["i18n"],"mappings":";;;;;;;;AAOO,IAAM,cAAA,GAA8B;AAAA,EACzC,WAAA,EAAa,IAAA;AAAA,EACb,IAAA,EAAM,KAAA;AAAA,EACN,wBAAA,EAA0B,IAAA;AAAA,EAC1B,aAAA,EAAe,gBAAA;AAAA,EACf,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,IACnB,QAAQ;AAAC,GACX;AAAA,EACA,aAAA,EAAe;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,EAAA,EAAI,CAAC,gBAAA,EAAkB,aAAa,CAAA;AAAA,EACpC,SAAA,EAAW,CAAC,aAAA,EAAe,gBAAgB,CAAA;AAAA,EAC3C,iBAAA,EAAmB;AACrB;AAEO,IAAM,QAAA,GAAW,OAAO,OAAA,GAAgC,EAAC,KAAM;AACpE,EAAA,IAAI,KAAK,aAAA,EAAe;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,CACJ,GAAA,CAAI,OAAO,CAAA,CACX,GAAA,CAAI,gBAAgB,CAAA,CACpB,GAAA,CAAI,gBAAgB,CAAA,CACpB,IAAA,CAAK;AAAA,IACJ,GAAG,cAAA;AAAA,IACH,GAAG;AAAA,GACJ,CAAA;AACL;AC/BO,IAAM,OAAA,GAAU,CAAC,EAAA,KAA2B;AAGjD,EAAA,MAAM,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAAA,KAAAA,EAAM,OAAM,GAAI,cAAA,CAAe,EAAA,IAAM,cAAA,CAAe,EAAc,CAAA;AAGnF,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAgB;AACtC,IAAA,OAAOA,KAAAA,CAAK,eAAe,GAAG,CAAA;AAAA,EAChC,CAAA;AAGA,EAAA,MAAM,CAAA,GAAI,WAAA,CAAY,CAAC,GAAA,EAAa,OAAA,KAA0B;AAC5D,IAAA,IAAI,EAAA,EAAI;AAEN,MAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,IAC1B,CAAA,MAAO;AAEL,MAAA,KAAA,MAAW,SAAA,IAAa,eAAe,EAAA,EAAgB;AACrD,QAAA,MAAM,MAAA,GAAS,KAAK,GAAA,EAAK,EAAE,GAAG,OAAA,EAAS,EAAA,EAAI,WAAW,CAAA;AACtD,QAAA,IAAI,MAAA,KAAW,KAAK,OAAO,MAAA;AAAA,MAC7B;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,EAAA,EAAI,IAAI,CAAC,CAAA;AAEb,EAAA,OAAO;AAAA;AAAA,IAEL,CAAA;AAAA;AAAA,IAEA,IAAA,EAAAA,KAAAA;AAAA;AAAA,IAEA,KAAA;AAAA;AAAA,IAEA,iBAAiBA,KAAAA,CAAK,QAAA;AAAA;AAAA,IAEtB,WAAWA,KAAAA,CAAK,SAAA;AAAA;AAAA,IAEhB;AAAA,GACF;AACF","file":"chunk-2NCN2AG2.mjs","sourcesContent":["import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport Backend from \"i18next-http-backend\";\nimport { InitOptions } from \"i18next\";\nimport { supportedLocales } from \"./supported-locales\";\n\nexport const DEFAULT_CONFIG: InitOptions = {\n fallbackLng: \"en\",\n load: \"all\",\n nonExplicitSupportedLngs: true,\n supportedLngs: supportedLocales,\n detection: {\n order: [\"navigator\"],\n caches: []\n },\n interpolation: {\n escapeValue: false\n },\n backend: {\n loadPath: \"/locales/{{lng}}/{{ns}}.json\"\n },\n ns: [\"thorium-shared\", \"thorium-web\"],\n defaultNS: [\"thorium-web\", \"thorium-shared\"],\n returnEmptyString: false\n};\n\nexport const initI18n = async (options: Partial<InitOptions> = {}) => {\n if (i18n.isInitialized) {\n return i18n;\n }\n\n return i18n\n .use(Backend)\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n ...DEFAULT_CONFIG,\n ...options\n });\n};\n\nexport { i18n };","import { useCallback } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { DEFAULT_CONFIG } from \"./config\";\n\n/**\n * Hook to access the i18n instance and translation functions\n * @param ns Optional additional namespace(s) to include alongside the default namespaces\n * @returns Translation functions and i18n instance\n */\nexport const useI18n = (ns?: string | string[]) => {\n // If no namespace provided, use both defaults with fallback\n // If namespace provided, use only that (override behavior)\n const { t: tRaw, i18n, ready } = useTranslation(ns || DEFAULT_CONFIG.ns as string[]);\n \n // Helper function to change language\n const changeLanguage = (lng: string) => {\n return i18n.changeLanguage(lng);\n };\n\n // Enhanced t function that searches both namespaces only when using defaults\n const t = useCallback((key: string, options?: any): string => {\n if (ns) {\n // If custom namespace provided, use it directly (no fallback)\n return tRaw(key, options) as string;\n } else {\n // If no namespace provided, search all default namespaces\n for (const namespace of DEFAULT_CONFIG.ns as string[]) {\n const result = tRaw(key, { ...options, ns: namespace });\n if (result !== key) return result as string;\n }\n return key;\n }\n }, [ns, tRaw]);\n\n return {\n // Translation function\n t,\n // i18n instance\n i18n,\n // Whether translations are loaded\n ready,\n // Current language\n currentLanguage: i18n.language,\n // List of available languages\n languages: i18n.languages,\n // Function to change language\n changeLanguage\n };\n};\n"]}
@@ -117,5 +117,5 @@ var buildShortcut = (str) => {
117
117
  };
118
118
 
119
119
  export { UnstableShortcutMetaKeywords, UnstableShortcutRepresentation, buildShortcut, defaultPlatformModifier, getPlatform, getPlatformModifier, isIOSish, isIpadOS, isMacish, metaKeys };
120
- //# sourceMappingURL=chunk-5LUMM7FW.mjs.map
121
- //# sourceMappingURL=chunk-5LUMM7FW.mjs.map
120
+ //# sourceMappingURL=chunk-44PEO3DS.mjs.map
121
+ //# sourceMappingURL=chunk-44PEO3DS.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/Helpers/getPlatform.ts","../src/core/Helpers/keyboardUtilities.ts"],"names":["UnstableShortcutMetaKeywords","UnstableShortcutRepresentation"],"mappings":"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","file":"chunk-5LUMM7FW.mjs","sourcesContent":["\"use client\";\n\n// Extend Navigator interface to include userAgentData\ndeclare global {\n interface Navigator {\n userAgentData?: {\n brands: Array<{brand: string; version: string}>;\n mobile: boolean;\n platform: string;\n };\n }\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData\nexport const getPlatform = () => {\n if (typeof window !== \"undefined\") {\n const nav = window.navigator;\n\n if (nav.userAgentData) {\n return nav.userAgentData.platform.toLowerCase();\n }\n\n // Deprecated but userAgentData still experimental…\n if (typeof nav.platform !== \"undefined\") {\n // android navigator.platform is often set as \"linux\", so we have to check userAgent\n if (typeof nav.userAgent !== \"undefined\" && /android/.test(nav.userAgent.toLowerCase())) {\n return \"android\";\n }\n return nav.platform.toLowerCase();\n }\n }\n\n return \"unknown\";\n};\n\nexport const isMacish = () => {\n const MacOSPattern = /mac|ipod|iphone|ipad/i;\n const platform = getPlatform();\n return MacOSPattern.test(platform);\n}\n\n// “Desktop-class” iPadOS\nexport const isIpadOS = () => {\n return !!(navigator.maxTouchPoints \n && navigator.maxTouchPoints > 2 \n && navigator.userAgent.includes(\"Intel\"));\n}\n\n// Stopgap measure for fullscreen on iPadOS, do not use elsewhere\nexport const isIOSish = () => {\n const AppleMobilePattern = /ipod|iphone|ipad/i;\n const platform = getPlatform();\n if (AppleMobilePattern.test(platform)) {\n return true;\n } else {\n return isIpadOS();\n }\n}","\"use client\";\n\nimport { isMacish } from \"./getPlatform\";\n\nexport interface UnstableKey {\n [key: string]: string;\n longform: string;\n shortform: string;\n}\n\nexport interface UnstableMetaKey extends UnstableKey {\n modifier: \"altKey\" | \"ctrlKey\" | \"metaKey\" | \"shiftKey\";\n symbol: \"⌥\" | \"^\" | \"⌘\" | \"⊞\" | \"⇧\";\n}\n\nexport interface UnstablePlatformModifier extends UnstableKey {\n modifier: \"ctrlKey\" | \"metaKey\";\n symbol: \"^\" | \"⌘\";\n}\n\nexport interface UnstableMetaKeys {\n [key: string]: UnstableMetaKey;\n altKey: UnstableMetaKey;\n ctrlKey: UnstableMetaKey;\n metaKey: UnstableMetaKey;\n shiftKey: UnstableMetaKey;\n}\n\nexport enum UnstableShortcutMetaKeywords {\n alt = \"altKey\",\n ctrl = \"ctrlKey\",\n meta = \"metaKey\",\n platform = \"platformKey\",\n shift = \"shiftKey\"\n}\n\nexport enum UnstableShortcutRepresentation {\n symbol = \"symbol\",\n short = \"shortform\",\n long = \"longform\"\n};\n\nexport interface UnstableShortcut {\n className?: string;\n rawForm: string;\n representation?: UnstableShortcutRepresentation; \n joiner?: string;\n}\n\nexport interface UnstablePShortcut {\n key?: string;\n char?: string;\n modifiers: {\n [key: string]: boolean;\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n platformKey: boolean;\n shiftKey: boolean;\n }\n}\n\nconst altModifier: UnstableMetaKey = {\n longform: \"Option\",\n shortform: \"Alt\",\n modifier: \"altKey\",\n symbol: \"⌥\"\n}\n\nconst ctrlModifier: UnstableMetaKey & UnstablePlatformModifier = {\n longform: \"Control\",\n shortform: \"Ctrl\",\n modifier: \"ctrlKey\",\n symbol: \"^\"\n}\n\nconst metaModifierMac: UnstableMetaKey & UnstablePlatformModifier = {\n longform: \"Command\",\n shortform: \"Cmd\",\n modifier: \"metaKey\",\n symbol: \"⌘\" \n}\n\nconst metaModifierWin: UnstableMetaKey = {\n longform: \"Windows\",\n shortform: \"Win\",\n modifier: \"metaKey\",\n symbol: \"⊞\"\n}\n\nconst shiftModifier: UnstableMetaKey = {\n longform: \"Shift\",\n shortform: \"Shift\",\n modifier: \"shiftKey\",\n symbol: \"⇧\"\n}\n\nexport const metaKeys: UnstableMetaKeys = {\n altKey: altModifier,\n ctrlKey: ctrlModifier,\n metaKey: isMacish() ? metaModifierMac : metaModifierWin,\n shiftKey: shiftModifier\n}\n\n// Platform modifier differs from Mac to Windows so we have to get it dynamically\n\nexport const defaultPlatformModifier = ctrlModifier;\n\nexport const getPlatformModifier = (): UnstablePlatformModifier => {\n if (isMacish()) {\n return metaModifierMac;\n } else {\n return ctrlModifier;\n }\n}\n\nexport const buildShortcut = (str: string) => {\n let shortcutObj: UnstablePShortcut = {\n key: \"\",\n char: \"\",\n modifiers: {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n platformKey: false,\n shiftKey: false\n }\n }\n \n const shortcutArray = str.split(/\\s*?[+-]\\s*?/);\n\n shortcutArray.filter((val) => {\n if ((Object.values(UnstableShortcutMetaKeywords) as string[]).includes(val)) {\n const trimmedKey = val.trim();\n shortcutObj.modifiers[trimmedKey] = true;\n } else {\n shortcutObj.char = val.trim().toUpperCase();\n shortcutObj.key = `Key${ val.trim().toUpperCase() }`;\n }\n });\n\n return shortcutObj.key ? shortcutObj : null;\n}"]}
1
+ {"version":3,"sources":["../src/core/Helpers/getPlatform.ts","../src/core/Helpers/keyboardUtilities.ts"],"names":["UnstableShortcutMetaKeywords","UnstableShortcutRepresentation"],"mappings":";AAcO,IAAM,cAAc,MAAM;AAC/B,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,MAAM,MAAA,CAAO,SAAA;AAEnB,IAAA,IAAI,IAAI,aAAA,EAAe;AACrB,MAAA,OAAO,GAAA,CAAI,aAAA,CAAc,QAAA,CAAS,WAAA,EAAY;AAAA,IAChD;AAGA,IAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,WAAA,EAAa;AAEvC,MAAA,IAAI,OAAO,GAAA,CAAI,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,KAAK,GAAA,CAAI,SAAA,CAAU,WAAA,EAAa,CAAA,EAAG;AACvF,QAAA,OAAO,SAAA;AAAA,MACT;AACA,MAAA,OAAO,GAAA,CAAI,SAAS,WAAA,EAAY;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAEO,IAAM,WAAW,MAAM;AAC5B,EAAA,MAAM,YAAA,GAAe,uBAAA;AACrB,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,OAAO,YAAA,CAAa,KAAK,QAAQ,CAAA;AACnC;AAGO,IAAM,WAAW,MAAM;AAC5B,EAAA,OAAO,CAAC,EAAE,SAAA,CAAU,cAAA,IACX,SAAA,CAAU,iBAAiB,CAAA,IAC3B,SAAA,CAAU,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,CAAA;AAC/C;AAGO,IAAM,WAAW,MAAM;AAC5B,EAAA,MAAM,kBAAA,GAAqB,mBAAA;AAC3B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACrC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,OAAO,QAAA,EAAS;AAAA,EAClB;AACF;;;AC7BO,IAAK,4BAAA,qBAAAA,6BAAAA,KAAL;AACL,EAAAA,8BAAA,KAAA,CAAA,GAAM,QAAA;AACN,EAAAA,8BAAA,MAAA,CAAA,GAAO,SAAA;AACP,EAAAA,8BAAA,MAAA,CAAA,GAAO,SAAA;AACP,EAAAA,8BAAA,UAAA,CAAA,GAAW,aAAA;AACX,EAAAA,8BAAA,OAAA,CAAA,GAAQ,UAAA;AALE,EAAA,OAAAA,6BAAAA;AAAA,CAAA,EAAA,4BAAA,IAAA,EAAA;AAQL,IAAK,8BAAA,qBAAAC,+BAAAA,KAAL;AACL,EAAAA,gCAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,gCAAA,OAAA,CAAA,GAAQ,WAAA;AACR,EAAAA,gCAAA,MAAA,CAAA,GAAO,UAAA;AAHG,EAAA,OAAAA,+BAAAA;AAAA,CAAA,EAAA,8BAAA,IAAA,EAAA;AA0BZ,IAAM,WAAA,GAA+B;AAAA,EACnC,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,KAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,YAAA,GAA2D;AAAA,EAC/D,QAAA,EAAU,SAAA;AAAA,EACV,SAAA,EAAW,MAAA;AAAA,EACX,QAAA,EAAU,SAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,eAAA,GAA8D;AAAA,EAClE,QAAA,EAAU,SAAA;AAAA,EACV,SAAA,EAAW,KAAA;AAAA,EACX,QAAA,EAAU,SAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,eAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,SAAA;AAAA,EACV,SAAA,EAAW,KAAA;AAAA,EACX,QAAA,EAAU,SAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,aAAA,GAAiC;AAAA,EACrC,QAAA,EAAU,OAAA;AAAA,EACV,SAAA,EAAW,OAAA;AAAA,EACX,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAEO,IAAM,QAAA,GAA6B;AAAA,EACxC,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,QAAA,EAAS,GAAI,eAAA,GAAkB,eAAA;AAAA,EACxC,QAAA,EAAU;AACZ;AAIO,IAAM,uBAAA,GAA0B;AAEhC,IAAM,sBAAsB,MAAgC;AACjE,EAAA,IAAI,UAAS,EAAG;AACd,IAAA,OAAO,eAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,OAAO,YAAA;AAAA,EACT;AACF;AAEO,IAAM,aAAA,GAAgB,CAAC,GAAA,KAAgB;AAC5C,EAAA,IAAI,WAAA,GAAiC;AAAA,IACnC,GAAA,EAAK,EAAA;AAAA,IACL,IAAA,EAAM,EAAA;AAAA,IACN,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,KAAA;AAAA,MACT,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAa,KAAA;AAAA,MACb,QAAA,EAAU;AAAA;AACZ,GACF;AAEA,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,KAAA,CAAM,cAAc,CAAA;AAE9C,EAAA,aAAA,CAAc,MAAA,CAAO,CAAC,GAAA,KAAQ;AAC5B,IAAA,IAAK,OAAO,MAAA,CAAO,4BAA4B,CAAA,CAAe,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3E,MAAA,MAAM,UAAA,GAAa,IAAI,IAAA,EAAK;AAC5B,MAAA,WAAA,CAAY,SAAA,CAAU,UAAU,CAAA,GAAI,IAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,IAAA,GAAO,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAC1C,MAAA,WAAA,CAAY,MAAM,CAAA,GAAA,EAAO,GAAA,CAAI,IAAA,EAAK,CAAE,aAAc,CAAA,CAAA;AAAA,IACpD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,WAAA,CAAY,MAAM,WAAA,GAAc,IAAA;AACzC","file":"chunk-44PEO3DS.mjs","sourcesContent":["\"use client\";\n\n// Extend Navigator interface to include userAgentData\ndeclare global {\n interface Navigator {\n userAgentData?: {\n brands: Array<{brand: string; version: string}>;\n mobile: boolean;\n platform: string;\n };\n }\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData\nexport const getPlatform = () => {\n if (typeof window !== \"undefined\") {\n const nav = window.navigator;\n\n if (nav.userAgentData) {\n return nav.userAgentData.platform.toLowerCase();\n }\n\n // Deprecated but userAgentData still experimental…\n if (typeof nav.platform !== \"undefined\") {\n // android navigator.platform is often set as \"linux\", so we have to check userAgent\n if (typeof nav.userAgent !== \"undefined\" && /android/.test(nav.userAgent.toLowerCase())) {\n return \"android\";\n }\n return nav.platform.toLowerCase();\n }\n }\n\n return \"unknown\";\n};\n\nexport const isMacish = () => {\n const MacOSPattern = /mac|ipod|iphone|ipad/i;\n const platform = getPlatform();\n return MacOSPattern.test(platform);\n}\n\n// “Desktop-class” iPadOS\nexport const isIpadOS = () => {\n return !!(navigator.maxTouchPoints \n && navigator.maxTouchPoints > 2 \n && navigator.userAgent.includes(\"Intel\"));\n}\n\n// Covers all iOS/iPadOS: iPhone/iPod/iPad by platform string + desktop-class iPadOS by UA sniff\nexport const isIOSish = () => {\n const AppleMobilePattern = /ipod|iphone|ipad/i;\n const platform = getPlatform();\n if (AppleMobilePattern.test(platform)) {\n return true;\n } else {\n return isIpadOS();\n }\n}","\"use client\";\n\nimport { isMacish } from \"./getPlatform\";\n\nexport interface UnstableKey {\n [key: string]: string;\n longform: string;\n shortform: string;\n}\n\nexport interface UnstableMetaKey extends UnstableKey {\n modifier: \"altKey\" | \"ctrlKey\" | \"metaKey\" | \"shiftKey\";\n symbol: \"⌥\" | \"^\" | \"⌘\" | \"⊞\" | \"⇧\";\n}\n\nexport interface UnstablePlatformModifier extends UnstableKey {\n modifier: \"ctrlKey\" | \"metaKey\";\n symbol: \"^\" | \"⌘\";\n}\n\nexport interface UnstableMetaKeys {\n [key: string]: UnstableMetaKey;\n altKey: UnstableMetaKey;\n ctrlKey: UnstableMetaKey;\n metaKey: UnstableMetaKey;\n shiftKey: UnstableMetaKey;\n}\n\nexport enum UnstableShortcutMetaKeywords {\n alt = \"altKey\",\n ctrl = \"ctrlKey\",\n meta = \"metaKey\",\n platform = \"platformKey\",\n shift = \"shiftKey\"\n}\n\nexport enum UnstableShortcutRepresentation {\n symbol = \"symbol\",\n short = \"shortform\",\n long = \"longform\"\n};\n\nexport interface UnstableShortcut {\n className?: string;\n rawForm: string;\n representation?: UnstableShortcutRepresentation; \n joiner?: string;\n}\n\nexport interface UnstablePShortcut {\n key?: string;\n char?: string;\n modifiers: {\n [key: string]: boolean;\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n platformKey: boolean;\n shiftKey: boolean;\n }\n}\n\nconst altModifier: UnstableMetaKey = {\n longform: \"Option\",\n shortform: \"Alt\",\n modifier: \"altKey\",\n symbol: \"⌥\"\n}\n\nconst ctrlModifier: UnstableMetaKey & UnstablePlatformModifier = {\n longform: \"Control\",\n shortform: \"Ctrl\",\n modifier: \"ctrlKey\",\n symbol: \"^\"\n}\n\nconst metaModifierMac: UnstableMetaKey & UnstablePlatformModifier = {\n longform: \"Command\",\n shortform: \"Cmd\",\n modifier: \"metaKey\",\n symbol: \"⌘\" \n}\n\nconst metaModifierWin: UnstableMetaKey = {\n longform: \"Windows\",\n shortform: \"Win\",\n modifier: \"metaKey\",\n symbol: \"⊞\"\n}\n\nconst shiftModifier: UnstableMetaKey = {\n longform: \"Shift\",\n shortform: \"Shift\",\n modifier: \"shiftKey\",\n symbol: \"⇧\"\n}\n\nexport const metaKeys: UnstableMetaKeys = {\n altKey: altModifier,\n ctrlKey: ctrlModifier,\n metaKey: isMacish() ? metaModifierMac : metaModifierWin,\n shiftKey: shiftModifier\n}\n\n// Platform modifier differs from Mac to Windows so we have to get it dynamically\n\nexport const defaultPlatformModifier = ctrlModifier;\n\nexport const getPlatformModifier = (): UnstablePlatformModifier => {\n if (isMacish()) {\n return metaModifierMac;\n } else {\n return ctrlModifier;\n }\n}\n\nexport const buildShortcut = (str: string) => {\n let shortcutObj: UnstablePShortcut = {\n key: \"\",\n char: \"\",\n modifiers: {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n platformKey: false,\n shiftKey: false\n }\n }\n \n const shortcutArray = str.split(/\\s*?[+-]\\s*?/);\n\n shortcutArray.filter((val) => {\n if ((Object.values(UnstableShortcutMetaKeywords) as string[]).includes(val)) {\n const trimmedKey = val.trim();\n shortcutObj.modifiers[trimmedKey] = true;\n } else {\n shortcutObj.char = val.trim().toUpperCase();\n shortcutObj.key = `Key${ val.trim().toUpperCase() }`;\n }\n });\n\n return shortcutObj.key ? shortcutObj : null;\n}"]}
@@ -0,0 +1,193 @@
1
+ import { useState, useRef, useCallback, useLayoutEffect, useEffect, useMemo } from 'react';
2
+
3
+ // src/core/Components/Actions/hooks/useCollapsibility.ts
4
+ var ThCollapsibilityVisibility = /* @__PURE__ */ ((ThCollapsibilityVisibility2) => {
5
+ ThCollapsibilityVisibility2["always"] = "always";
6
+ ThCollapsibilityVisibility2["partially"] = "partially";
7
+ ThCollapsibilityVisibility2["overflow"] = "overflow";
8
+ return ThCollapsibilityVisibility2;
9
+ })(ThCollapsibilityVisibility || {});
10
+ var useCollapsibility = (items, prefs, breakpoint, containerRef) => {
11
+ const isSpaceFit = prefs.collapse === true;
12
+ const [partialInBar, setPartialInBar] = useState(Number.MAX_SAFE_INTEGER);
13
+ const lastCountRef = useRef(Number.MAX_SAFE_INTEGER);
14
+ const keyToElement = useRef(/* @__PURE__ */ new Map());
15
+ const itemWidthsRef = useRef(/* @__PURE__ */ new Map());
16
+ const alwaysKeysRef = useRef([]);
17
+ const orderedPartialKeysRef = useRef([]);
18
+ const hasOverflowRef = useRef(false);
19
+ const columnGapRef = useRef(0);
20
+ const rafIdRef = useRef(null);
21
+ const specRef = useRef("");
22
+ const computeLayout = useCallback((containerWidth) => {
23
+ if (!containerWidth) return;
24
+ const widths = itemWidthsRef.current;
25
+ const alwaysKeys = alwaysKeysRef.current;
26
+ const partialKeys = orderedPartialKeysRef.current;
27
+ const gap = columnGapRef.current;
28
+ const N_a = alwaysKeys.length;
29
+ const alwaysTotal = alwaysKeys.reduce((s, k) => s + (widths.get(k) ?? 0), 0);
30
+ const partialWidths = partialKeys.map((k) => widths.get(k) ?? 0);
31
+ const partialTotal = partialWidths.reduce((s, w) => s + w, 0);
32
+ let newCount;
33
+ const noMenuTotal = alwaysTotal + partialTotal + gap * Math.max(0, N_a + partialKeys.length - 1);
34
+ if (!hasOverflowRef.current && noMenuTotal <= containerWidth) {
35
+ newCount = partialKeys.length;
36
+ } else {
37
+ const menuW = widths.values().next().value ?? 0;
38
+ if (!menuW) return;
39
+ let count = 0, usedPartial = 0;
40
+ for (const w of partialWidths) {
41
+ const totalGap = gap * Math.max(0, N_a + count + 1);
42
+ if (alwaysTotal + usedPartial + w + menuW + totalGap <= containerWidth) {
43
+ usedPartial += w;
44
+ count++;
45
+ } else {
46
+ break;
47
+ }
48
+ }
49
+ newCount = count;
50
+ }
51
+ if (newCount !== lastCountRef.current) {
52
+ lastCountRef.current = newCount;
53
+ setPartialInBar(newCount);
54
+ }
55
+ }, []);
56
+ const remeasureAndCompute = useCallback((containerWidth) => {
57
+ if (!containerRef?.current) return;
58
+ for (const [key, el] of keyToElement.current) {
59
+ itemWidthsRef.current.set(key, el.getBoundingClientRect().width);
60
+ }
61
+ columnGapRef.current = parseFloat(getComputedStyle(containerRef.current).columnGap) || 0;
62
+ computeLayout(containerWidth ?? containerRef.current.getBoundingClientRect().width);
63
+ }, [containerRef, computeLayout]);
64
+ const remeasureAndComputeRef = useRef(remeasureAndCompute);
65
+ useLayoutEffect(() => {
66
+ remeasureAndComputeRef.current = remeasureAndCompute;
67
+ }, [remeasureAndCompute]);
68
+ useLayoutEffect(() => {
69
+ if (!isSpaceFit || !containerRef?.current) return;
70
+ const spec = items.map((i) => `${i.key}:${prefs.keys[i.key]?.visibility ?? ""}`).join(",");
71
+ const widthsMissing = items.some((i) => !(itemWidthsRef.current.get(i.key) ?? 0));
72
+ if (spec === specRef.current && !widthsMissing) return;
73
+ specRef.current = spec;
74
+ const always = [], partial = [];
75
+ let hasOverflow = false;
76
+ for (const item of items) {
77
+ const v = prefs.keys[item.key]?.visibility;
78
+ if (v === "overflow" /* overflow */) hasOverflow = true;
79
+ else if (v === "always" /* always */) always.push(item.key);
80
+ else partial.push(item.key);
81
+ }
82
+ alwaysKeysRef.current = always;
83
+ orderedPartialKeysRef.current = partial;
84
+ hasOverflowRef.current = hasOverflow;
85
+ remeasureAndCompute(containerRef.current.getBoundingClientRect().width);
86
+ }, [isSpaceFit, items, prefs, containerRef, remeasureAndCompute]);
87
+ useEffect(() => {
88
+ if (!isSpaceFit || !containerRef?.current) return;
89
+ const observer = new ResizeObserver((entries) => {
90
+ const w = entries[0]?.contentRect.width;
91
+ if (w === void 0) return;
92
+ if (rafIdRef.current !== null) cancelAnimationFrame(rafIdRef.current);
93
+ rafIdRef.current = requestAnimationFrame(() => {
94
+ rafIdRef.current = null;
95
+ remeasureAndCompute(w);
96
+ });
97
+ });
98
+ observer.observe(containerRef.current);
99
+ return () => {
100
+ observer.disconnect();
101
+ if (rafIdRef.current !== null) cancelAnimationFrame(rafIdRef.current);
102
+ };
103
+ }, [isSpaceFit, containerRef, remeasureAndCompute]);
104
+ const ghostObserverRef = useRef(null);
105
+ const getGhostRef = useCallback((el) => {
106
+ ghostObserverRef.current?.disconnect();
107
+ ghostObserverRef.current = null;
108
+ if (el && isSpaceFit) {
109
+ const observer = new ResizeObserver(() => {
110
+ if (rafIdRef.current !== null) cancelAnimationFrame(rafIdRef.current);
111
+ rafIdRef.current = requestAnimationFrame(() => {
112
+ rafIdRef.current = null;
113
+ remeasureAndComputeRef.current();
114
+ });
115
+ });
116
+ observer.observe(el);
117
+ ghostObserverRef.current = observer;
118
+ }
119
+ }, [isSpaceFit]);
120
+ const getItemRef = useCallback((key) => (el) => {
121
+ if (el) {
122
+ keyToElement.current.set(key, el);
123
+ } else {
124
+ keyToElement.current.delete(key);
125
+ itemWidthsRef.current.delete(key);
126
+ }
127
+ }, []);
128
+ const [actionIcons, menuItems] = useMemo(() => {
129
+ const actionIcons2 = [];
130
+ const menuItems2 = [];
131
+ if (!prefs.collapse) {
132
+ items.forEach((item) => actionIcons2.push(item));
133
+ return [actionIcons2, menuItems2];
134
+ }
135
+ if (prefs.collapse === true) {
136
+ const barPartialSet = /* @__PURE__ */ new Set();
137
+ let partialCount = 0;
138
+ for (const item of items) {
139
+ if (prefs.keys[item.key]?.visibility === "partially" /* partially */) {
140
+ if (partialCount < partialInBar) {
141
+ barPartialSet.add(item.key);
142
+ partialCount++;
143
+ }
144
+ }
145
+ }
146
+ for (const item of items) {
147
+ const v = prefs.keys[item.key]?.visibility;
148
+ if (v === "overflow" /* overflow */ || v === "partially" /* partially */ && !barPartialSet.has(item.key)) {
149
+ menuItems2.push(item);
150
+ } else {
151
+ actionIcons2.push(item);
152
+ }
153
+ }
154
+ return [actionIcons2, menuItems2];
155
+ }
156
+ let countdown = 0;
157
+ if (breakpoint) {
158
+ const prefForBreakpoint = prefs.collapse[breakpoint];
159
+ if (prefForBreakpoint) {
160
+ const partialCount = items.filter((i) => prefs.keys[i.key]?.visibility === "partially" /* partially */).length;
161
+ const overflowCount = items.filter((i) => prefs.keys[i.key]?.visibility === "overflow" /* overflow */).length;
162
+ const collapsibleCount = partialCount + overflowCount;
163
+ if (prefForBreakpoint === "all") {
164
+ countdown = overflowCount;
165
+ } else if (!isNaN(prefForBreakpoint)) {
166
+ countdown = Math.max(0, collapsibleCount - (prefForBreakpoint - 1));
167
+ }
168
+ }
169
+ }
170
+ [...items].reverse().forEach((item) => {
171
+ const actionPref = prefs.keys[item.key];
172
+ if (actionPref.visibility === "overflow" /* overflow */) {
173
+ menuItems2.unshift(item);
174
+ --countdown;
175
+ } else if (actionPref.visibility === "partially" /* partially */) {
176
+ if (countdown > 0) {
177
+ menuItems2.unshift(item);
178
+ --countdown;
179
+ } else {
180
+ actionIcons2.unshift(item);
181
+ }
182
+ } else {
183
+ actionIcons2.unshift(item);
184
+ }
185
+ });
186
+ return [actionIcons2, menuItems2];
187
+ }, [items, prefs, breakpoint, partialInBar]);
188
+ return { ActionIcons: actionIcons, MenuItems: menuItems, getItemRef, getGhostRef };
189
+ };
190
+
191
+ export { ThCollapsibilityVisibility, useCollapsibility };
192
+ //# sourceMappingURL=chunk-AQSJDL63.mjs.map
193
+ //# sourceMappingURL=chunk-AQSJDL63.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/Components/Actions/hooks/useCollapsibility.ts"],"names":["ThCollapsibilityVisibility","actionIcons","menuItems"],"mappings":"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","file":"chunk-AQSJDL63.mjs","sourcesContent":["\"use client\";\n\nimport { RefObject, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\n\nimport { ThActionEntry } from \"../ThActionsBar\";\n\nexport type ThCollapsibility = boolean | Record<string, number | \"all\">;\n\nexport enum ThCollapsibilityVisibility {\n always = \"always\",\n partially = \"partially\",\n overflow = \"overflow\"\n}\n\nexport interface CollapsiblePref {\n displayOrder: string[];\n collapse: ThCollapsibility;\n keys: {\n [key: string]: {\n [key: string]: any;\n visibility: ThCollapsibilityVisibility;\n };\n }\n}\n\nexport const useCollapsibility = (\n items: ThActionEntry<string>[],\n prefs: CollapsiblePref,\n breakpoint?: string,\n containerRef?: RefObject<HTMLElement | null>\n) => {\n const isSpaceFit = prefs.collapse === true;\n\n // --- Space-fit mode (collapse: true) ---\n // How many `partially` items currently fit in the bar.\n // MAX_SAFE_INTEGER = \"assume all fit\" — corrected by useLayoutEffect before first paint.\n const [partialInBar, setPartialInBar] = useState<number>(Number.MAX_SAFE_INTEGER);\n const lastCountRef = useRef<number>(Number.MAX_SAFE_INTEGER);\n\n // Ghost element tracking — spans wrapping each item in the hidden measurement clone.\n // The ghost always renders all items, so widths are stable regardless of bar state.\n const keyToElement = useRef(new Map<string, HTMLElement>());\n const itemWidthsRef = useRef(new Map<string, number>());\n\n // Inputs for computeLayout, kept in refs so the function is stable\n const alwaysKeysRef = useRef<string[]>([]);\n const orderedPartialKeysRef = useRef<string[]>([]);\n const hasOverflowRef = useRef<boolean>(false);\n const columnGapRef = useRef<number>(0);\n\n // Shared rAF handle — both ResizeObservers dequeue into the same frame slot.\n const rafIdRef = useRef<number | null>(null);\n\n // Tracks the last spec so categorization is skipped when nothing meaningful changed.\n const specRef = useRef<string>(\"\");\n\n // computeLayout reads only refs — no closure over props, truly stable.\n // Called from remeasureAndCompute after fresh DOM reads.\n const computeLayout = useCallback((containerWidth: number) => {\n if (!containerWidth) return;\n\n const widths = itemWidthsRef.current;\n const alwaysKeys = alwaysKeysRef.current;\n const partialKeys = orderedPartialKeysRef.current;\n const gap = columnGapRef.current;\n\n const N_a = alwaysKeys.length;\n const alwaysTotal = alwaysKeys.reduce((s, k) => s + (widths.get(k) ?? 0), 0);\n const partialWidths = partialKeys.map(k => widths.get(k) ?? 0);\n const partialTotal = partialWidths.reduce((s, w) => s + w, 0);\n\n let newCount: number;\n\n // Check if everything fits without an overflow menu trigger\n const noMenuTotal = alwaysTotal + partialTotal + gap * Math.max(0, N_a + partialKeys.length - 1);\n if (!hasOverflowRef.current && noMenuTotal <= containerWidth) {\n newCount = partialKeys.length;\n } else {\n // Need the overflow menu trigger — use first measured width as proxy\n // (all icon buttons are the same size)\n const menuW = widths.values().next().value ?? 0;\n if (!menuW) return;\n\n let count = 0, usedPartial = 0;\n for (const w of partialWidths) {\n // Items in bar at this step: N_a always + count partial + 1 new partial + 1 menu trigger\n const totalGap = gap * Math.max(0, N_a + count + 1);\n if (alwaysTotal + usedPartial + w + menuW + totalGap <= containerWidth) {\n usedPartial += w;\n count++;\n } else {\n break;\n }\n }\n newCount = count;\n }\n\n if (newCount !== lastCountRef.current) {\n lastCountRef.current = newCount;\n setPartialInBar(newCount);\n }\n }, []);\n\n // Re-measures all ghost item widths and the container gap, then calls computeLayout.\n // getBoundingClientRect and getComputedStyle are cheap when called from a rAF callback\n // or useLayoutEffect (layout is already computed by the browser at those points).\n // Passing containerWidth avoids a second getBoundingClientRect on the container when\n // the caller already has it (e.g. from ResizeObserver contentRect).\n const remeasureAndCompute = useCallback((containerWidth?: number) => {\n if (!containerRef?.current) return;\n for (const [key, el] of keyToElement.current) {\n itemWidthsRef.current.set(key, el.getBoundingClientRect().width);\n }\n columnGapRef.current = parseFloat(getComputedStyle(containerRef.current).columnGap) || 0;\n computeLayout(containerWidth ?? containerRef.current.getBoundingClientRect().width);\n }, [containerRef, computeLayout]);\n\n // Kept in a ref so the ghost observer's rAF closure is always current\n // without the observer needing to re-subscribe when the function identity changes.\n const remeasureAndComputeRef = useRef(remeasureAndCompute);\n useLayoutEffect(() => { remeasureAndComputeRef.current = remeasureAndCompute; }, [remeasureAndCompute]);\n\n // Categorize items by visibility and do initial measurement before first paint.\n // useLayoutEffect runs synchronously after DOM mutations — so the initial\n // correction happens before the user sees anything.\n // The spec guard skips the effect when items/prefs object references are unstable\n // but nothing meaningful changed, UNLESS widths haven't been populated yet\n // (ghost elements not yet measured on first mount).\n useLayoutEffect(() => {\n if (!isSpaceFit || !containerRef?.current) return;\n\n const spec = items.map(i => `${i.key}:${prefs.keys[i.key]?.visibility ?? \"\"}`).join(\",\");\n const widthsMissing = items.some(i => !(itemWidthsRef.current.get(i.key) ?? 0));\n if (spec === specRef.current && !widthsMissing) return;\n specRef.current = spec;\n\n const always: string[] = [], partial: string[] = [];\n let hasOverflow = false;\n\n for (const item of items) {\n const v = prefs.keys[item.key]?.visibility;\n if (v === ThCollapsibilityVisibility.overflow) hasOverflow = true;\n else if (v === ThCollapsibilityVisibility.always) always.push(item.key);\n else partial.push(item.key);\n }\n\n alwaysKeysRef.current = always;\n orderedPartialKeysRef.current = partial;\n hasOverflowRef.current = hasOverflow;\n\n remeasureAndCompute(containerRef.current.getBoundingClientRect().width);\n }, [isSpaceFit, items, prefs, containerRef, remeasureAndCompute]);\n\n // Container ResizeObserver — fires when the container width changes.\n // Batched via rAF so we compute at most once per frame, not once per pixel.\n // Re-measures item widths each time so icon size changes (e.g. zoom) that also\n // cause a container reflow are picked up automatically.\n useEffect(() => {\n if (!isSpaceFit || !containerRef?.current) return;\n\n const observer = new ResizeObserver(entries => {\n const w = entries[0]?.contentRect.width;\n if (w === undefined) return;\n\n if (rafIdRef.current !== null) cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n remeasureAndCompute(w);\n });\n });\n\n observer.observe(containerRef.current);\n return () => {\n observer.disconnect();\n if (rafIdRef.current !== null) cancelAnimationFrame(rafIdRef.current);\n };\n }, [isSpaceFit, containerRef, remeasureAndCompute]);\n\n // Ghost wrapper ResizeObserver — fires when icon sizes change independently of\n // container width (e.g. app-level zoom on a fixed-width container).\n // Implemented as a callback ref so the observer is set up directly on mount\n // without a separate state variable or useEffect dependency on a mutable ref.\n const ghostObserverRef = useRef<ResizeObserver | null>(null);\n const getGhostRef = useCallback((el: HTMLDivElement | null) => {\n ghostObserverRef.current?.disconnect();\n ghostObserverRef.current = null;\n if (el && isSpaceFit) {\n const observer = new ResizeObserver(() => {\n if (rafIdRef.current !== null) cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n remeasureAndComputeRef.current();\n });\n });\n observer.observe(el);\n ghostObserverRef.current = observer;\n }\n }, [isSpaceFit]);\n\n // Ref callback factory — attaches to ghost spans for width measurement.\n // Harmless noop in other modes.\n const getItemRef = useCallback((key: string) => (el: HTMLElement | null) => {\n if (el) {\n keyToElement.current.set(key, el);\n } else {\n keyToElement.current.delete(key);\n itemWidthsRef.current.delete(key);\n }\n }, []);\n\n // --- Triage ---\n\n const [actionIcons, menuItems] = useMemo(() => {\n const actionIcons: ThActionEntry<string>[] = [];\n const menuItems: ThActionEntry<string>[] = [];\n\n if (!prefs.collapse) {\n items.forEach((item) => actionIcons.push(item));\n return [actionIcons, menuItems];\n }\n\n if (prefs.collapse === true) {\n // Build the set of partial keys that fit in the bar (first N in displayOrder)\n const barPartialSet = new Set<string>();\n let partialCount = 0;\n for (const item of items) {\n if (prefs.keys[item.key]?.visibility === ThCollapsibilityVisibility.partially) {\n if (partialCount < partialInBar) {\n barPartialSet.add(item.key);\n partialCount++;\n }\n }\n }\n\n for (const item of items) {\n const v = prefs.keys[item.key]?.visibility;\n if (v === ThCollapsibilityVisibility.overflow || (v === ThCollapsibilityVisibility.partially && !barPartialSet.has(item.key))) {\n menuItems.push(item);\n } else {\n actionIcons.push(item);\n }\n }\n\n return [actionIcons, menuItems];\n }\n\n // collapse: Record — breakpoint-based triage (existing logic)\n let countdown: number = 0;\n\n if (breakpoint) {\n const prefForBreakpoint = prefs.collapse[breakpoint];\n if (prefForBreakpoint) {\n // `always` items are never collapsed, so count only partially + overflow items\n const partialCount = items.filter(i => prefs.keys[i.key]?.visibility === ThCollapsibilityVisibility.partially).length;\n const overflowCount = items.filter(i => prefs.keys[i.key]?.visibility === ThCollapsibilityVisibility.overflow).length;\n const collapsibleCount = partialCount + overflowCount;\n\n if (prefForBreakpoint === \"all\") {\n countdown = overflowCount;\n } else if (!isNaN(prefForBreakpoint)) {\n countdown = Math.max(0, collapsibleCount - (prefForBreakpoint - 1));\n }\n }\n }\n\n // Creating a shallow copy so that actionsOrder doesn't mutate between rerenders\n [...items].reverse().forEach((item) => {\n const actionPref = prefs.keys[item.key];\n if (actionPref.visibility === ThCollapsibilityVisibility.overflow) {\n menuItems.unshift(item);\n --countdown;\n } else if (actionPref.visibility === ThCollapsibilityVisibility.partially) {\n if (countdown > 0) {\n menuItems.unshift(item);\n --countdown;\n } else {\n actionIcons.unshift(item);\n }\n } else {\n actionIcons.unshift(item);\n }\n });\n\n return [actionIcons, menuItems];\n }, [items, prefs, breakpoint, partialInBar]);\n\n return { ActionIcons: actionIcons, MenuItems: menuItems, getItemRef, getGhostRef };\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { useGlobalPreferences } from './chunk-AE6P4KJB.mjs';
2
- import { i18n, initI18n } from './chunk-NUXGQWED.mjs';
2
+ import { i18n, initI18n } from './chunk-2NCN2AG2.mjs';
3
3
  import { I18nextProvider } from 'react-i18next';
4
4
  export { Trans } from 'react-i18next';
5
5
  import { useState, useEffect } from 'react';
@@ -36,5 +36,5 @@ var ThI18nProvider = ({
36
36
  };
37
37
 
38
38
  export { ThI18nProvider };
39
- //# sourceMappingURL=chunk-T5ENYSDJ.mjs.map
40
- //# sourceMappingURL=chunk-T5ENYSDJ.mjs.map
39
+ //# sourceMappingURL=chunk-DQDOOTCE.mjs.map
40
+ //# sourceMappingURL=chunk-DQDOOTCE.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/ThI18nProvider.tsx"],"names":[],"mappings":";;;;;;;AAYO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA2B;AACzB,EAAA,MAAM,EAAE,WAAA,EAAa,EAAE,MAAA,EAAO,KAAM,oBAAA,EAAqB;AACzD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAAS,KAAK,aAAa,CAAA;AAErE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,QAAA,CAAS;AAAA,QACP,GAAG,OAAA;AAAA,QACH,GAAA,EAAK,UAAU,OAAA,CAAQ;AAAA,OACxB,CAAA,CAAE,IAAA,CAAK,MAAM,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,IAAA,GAAO,MAAA,IAAU,IAAA,CAAK,gBAAA,IAAoB,KAAK,QAAA,IAAY,IAAA;AACjE,IAAA,QAAA,CAAS,gBAAgB,IAAA,GAAO,IAAA;AAAA,EAClC,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAgB,QAAA,EAAU,CAAA;AACpD","file":"chunk-T5ENYSDJ.mjs","sourcesContent":["\"use client\";\n\nimport React, { ReactNode, useEffect, useState } from \"react\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { i18n, initI18n } from \"./config\";\nimport { InitOptions } from \"i18next\";\nimport { useGlobalPreferences } from \"@/preferences/hooks/useGlobalPreferences\";\n\nexport type ThI18nProviderProps = {\n children: ReactNode;\n} & Partial<InitOptions>;\n\nexport const ThI18nProvider = ({\n children,\n ...options\n}: ThI18nProviderProps) => {\n const { preferences: { locale } } = useGlobalPreferences();\n const [isInitialized, setIsInitialized] = useState(i18n.isInitialized);\n \n useEffect(() => {\n if (!i18n.isInitialized) { \n initI18n({\n ...options,\n lng: locale || options.lng,\n }).then(() => setIsInitialized(true));\n }\n });\n\n useEffect(() => {\n if (isInitialized && locale) {\n i18n.changeLanguage(locale);\n }\n }, [locale, isInitialized]);\n\n useEffect(() => {\n if (!isInitialized) return;\n const lang = locale || i18n.resolvedLanguage || i18n.language || \"en\";\n document.documentElement.lang = lang;\n }, [locale, isInitialized]);\n\n if (!isInitialized) {\n return null;\n }\n\n return <I18nextProvider i18n={ i18n }>{ children }</I18nextProvider>;\n};\n\nexport default ThI18nProvider;\n"]}
1
+ {"version":3,"sources":["../src/i18n/ThI18nProvider.tsx"],"names":[],"mappings":";;;;;;;AAYO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAA2B;AACzB,EAAA,MAAM,EAAE,WAAA,EAAa,EAAE,MAAA,EAAO,KAAM,oBAAA,EAAqB;AACzD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAAS,KAAK,aAAa,CAAA;AAErE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,QAAA,CAAS;AAAA,QACP,GAAG,OAAA;AAAA,QACH,GAAA,EAAK,UAAU,OAAA,CAAQ;AAAA,OACxB,CAAA,CAAE,IAAA,CAAK,MAAM,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,IAAA,GAAO,MAAA,IAAU,IAAA,CAAK,gBAAA,IAAoB,KAAK,QAAA,IAAY,IAAA;AACjE,IAAA,QAAA,CAAS,gBAAgB,IAAA,GAAO,IAAA;AAAA,EAClC,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAgB,QAAA,EAAU,CAAA;AACpD","file":"chunk-DQDOOTCE.mjs","sourcesContent":["\"use client\";\n\nimport React, { ReactNode, useEffect, useState } from \"react\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { i18n, initI18n } from \"./config\";\nimport { InitOptions } from \"i18next\";\nimport { useGlobalPreferences } from \"@/preferences/hooks/useGlobalPreferences\";\n\nexport type ThI18nProviderProps = {\n children: ReactNode;\n} & Partial<InitOptions>;\n\nexport const ThI18nProvider = ({\n children,\n ...options\n}: ThI18nProviderProps) => {\n const { preferences: { locale } } = useGlobalPreferences();\n const [isInitialized, setIsInitialized] = useState(i18n.isInitialized);\n \n useEffect(() => {\n if (!i18n.isInitialized) { \n initI18n({\n ...options,\n lng: locale || options.lng,\n }).then(() => setIsInitialized(true));\n }\n });\n\n useEffect(() => {\n if (isInitialized && locale) {\n i18n.changeLanguage(locale);\n }\n }, [locale, isInitialized]);\n\n useEffect(() => {\n if (!isInitialized) return;\n const lang = locale || i18n.resolvedLanguage || i18n.language || \"en\";\n document.documentElement.lang = lang;\n }, [locale, isInitialized]);\n\n if (!isInitialized) {\n return null;\n }\n\n return <I18nextProvider i18n={ i18n }>{ children }</I18nextProvider>;\n};\n\nexport default ThI18nProvider;\n"]}
@@ -1,11 +1,11 @@
1
- import { useNavigator, StatefulActionIcon, createAudioDefaultPlugin, usePositionStorage, NavigatorProvider, StatefulDockingWrapper, useReaderHeaderBase, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default } from './chunk-PXXWEMNL.mjs';
1
+ import { useNavigator, StatefulActionIcon, createAudioDefaultPlugin, usePositionStorage, NavigatorProvider, StatefulDockingWrapper, useReaderHeaderBase, StatefulBackLink, thorium_web_reader_header_default, StatefulCollapsibleActionsBar, thorium_web_overflow_default } from './chunk-MSHUPSBI.mjs';
2
2
  import { useAudioNavigator, useDocumentTitle, useAudioSettingsCache } from './chunk-SZAVAQ6S.mjs';
3
- import { setTocEntry, setAdjacentTimelineItems, setSleepTimerOnFragmentEnd, setRemotePlaybackState, setStatus, setSeekableRanges, setSeeking, setStalled, setSleepTimerOnTrackEnd, setTrackReady, setPublicationStart, setPublicationEnd, debounce, setLoading } from './chunk-WLVE3WNW.mjs';
3
+ import { setTocEntry, setAdjacentTimelineItems, setSleepTimerOnFragmentEnd, setRemotePlaybackState, setStatus, setSeekableRanges, setSeeking, setStalled, setSleepTimerOnTrackEnd, setTrackReady, setPublicationStart, setPublicationEnd, debounce, setLoading } from './chunk-YEVLT3AV.mjs';
4
4
  import { findTocItemByHref } from './chunk-TEZB4ULX.mjs';
5
- import { useAudioPreferences, resolveAudioContentProtectionConfig, proxyUrl } from './chunk-XRFLDNAY.mjs';
5
+ import { useAudioPreferences, resolveAudioContentProtectionConfig, proxyUrl } from './chunk-OD75GC5N.mjs';
6
6
  import { useAppSelector, useAppDispatch } from './chunk-A575ZW4A.mjs';
7
- import { ThActionsBar, ThAudioProgress, usePlugins, ThPluginRegistry, ThPluginProvider } from './chunk-P6ILEQ5P.mjs';
8
- import { useI18n } from './chunk-NUXGQWED.mjs';
7
+ import { ThActionsBar, ThAudioProgress, usePlugins, ThPluginRegistry, ThPluginProvider } from './chunk-ETLIGONP.mjs';
8
+ import { useI18n } from './chunk-2NCN2AG2.mjs';
9
9
  import { useCallback, useState, useMemo, useLayoutEffect, useRef, useEffect, Fragment as Fragment$1 } from 'react';
10
10
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
11
11
  import { Link, Locator, LocatorLocations } from '@readium/shared';
@@ -574,7 +574,8 @@ var StatefulPlayer = ({
574
574
  localDataKey,
575
575
  plugins,
576
576
  positionStorage,
577
- coverUrl
577
+ coverUrl,
578
+ containerRefSetter
578
579
  }) => {
579
580
  const [pluginsRegistered, setPluginsRegistered] = useState(false);
580
581
  useLayoutEffect(() => {
@@ -590,9 +591,9 @@ var StatefulPlayer = ({
590
591
  if (!pluginsRegistered) {
591
592
  return null;
592
593
  }
593
- return /* @__PURE__ */ jsx(ThPluginProvider, { children: /* @__PURE__ */ jsx(StatefulPlayerInner, { publication, localDataKey, positionStorage, coverUrl }) });
594
+ return /* @__PURE__ */ jsx(ThPluginProvider, { children: /* @__PURE__ */ jsx(StatefulPlayerInner, { publication, localDataKey, positionStorage, coverUrl, containerRefSetter }) });
594
595
  };
595
- var StatefulPlayerInner = ({ publication, localDataKey, positionStorage, coverUrl }) => {
596
+ var StatefulPlayerInner = ({ publication, localDataKey, positionStorage, coverUrl, containerRefSetter }) => {
596
597
  const { preferences } = useAudioPreferences();
597
598
  const { t } = useI18n();
598
599
  const wrapperRef = useRef(null);
@@ -833,7 +834,7 @@ var StatefulPlayerInner = ({ publication, localDataKey, positionStorage, coverUr
833
834
  observer.disconnect();
834
835
  };
835
836
  }, [isExpanded]);
836
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(NavigatorProvider, { mediaNavigator: audioNavigator, children: /* @__PURE__ */ jsx("main", { className: thorium_web_audio_app_default.main, children: /* @__PURE__ */ jsx(StatefulDockingWrapper, { children: /* @__PURE__ */ jsxs("div", { className: thorium_web_audio_app_default.shell, children: [
837
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(NavigatorProvider, { mediaNavigator: audioNavigator, children: /* @__PURE__ */ jsx("main", { className: thorium_web_audio_app_default.main, children: /* @__PURE__ */ jsx(StatefulDockingWrapper, { children: /* @__PURE__ */ jsxs("div", { ref: containerRefSetter, className: thorium_web_audio_app_default.shell, children: [
837
838
  /* @__PURE__ */ jsx(
838
839
  StatefulPlayerHeader,
839
840
  {
@@ -857,5 +858,5 @@ var StatefulPlayerInner = ({ publication, localDataKey, positionStorage, coverUr
857
858
  };
858
859
 
859
860
  export { StatefulAudioMediaActions, StatefulAudioPlaybackControls, StatefulAudioProgressBar, StatefulNextButton, StatefulPlayPauseButton, StatefulPlayer, StatefulPreviousButton, StatefulSkipBackwardButton, StatefulSkipForwardButton };
860
- //# sourceMappingURL=chunk-QUSGPT5M.mjs.map
861
- //# sourceMappingURL=chunk-QUSGPT5M.mjs.map
861
+ //# sourceMappingURL=chunk-E2JEGVVE.mjs.map
862
+ //# sourceMappingURL=chunk-E2JEGVVE.mjs.map