@edrlab/thorium-web 1.5.0 → 1.5.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 (64) hide show
  1. package/dist/{chunk-GRYEOCGD.mjs → chunk-2B3HE57E.mjs} +36 -49
  2. package/dist/chunk-2B3HE57E.mjs.map +1 -0
  3. package/dist/{chunk-BBCSLDQT.mjs → chunk-3ITHCTDL.mjs} +61 -66
  4. package/dist/chunk-3ITHCTDL.mjs.map +1 -0
  5. package/dist/{chunk-PRQBFBJ7.mjs → chunk-3VB756GR.mjs} +19 -8
  6. package/dist/chunk-3VB756GR.mjs.map +1 -0
  7. package/dist/{chunk-ZD4LTF6G.mjs → chunk-AXX4U2FW.mjs} +25 -133
  8. package/dist/chunk-AXX4U2FW.mjs.map +1 -0
  9. package/dist/{chunk-2T65MDBR.mjs → chunk-CCHCCVSF.mjs} +3 -3
  10. package/dist/{chunk-2T65MDBR.mjs.map → chunk-CCHCCVSF.mjs.map} +1 -1
  11. package/dist/{chunk-63LKYJFG.mjs → chunk-J6XDICU2.mjs} +45 -15
  12. package/dist/chunk-J6XDICU2.mjs.map +1 -0
  13. package/dist/chunk-KQ3KS5O5.mjs +37 -0
  14. package/dist/chunk-KQ3KS5O5.mjs.map +1 -0
  15. package/dist/{chunk-DQDOOTCE.mjs → chunk-KT2QY5QU.mjs} +3 -3
  16. package/dist/{chunk-DQDOOTCE.mjs.map → chunk-KT2QY5QU.mjs.map} +1 -1
  17. package/dist/{chunk-Y5X74VW7.mjs → chunk-KXOIN35D.mjs} +9 -9
  18. package/dist/{chunk-Y5X74VW7.mjs.map → chunk-KXOIN35D.mjs.map} +1 -1
  19. package/dist/{chunk-BCXKBHU3.mjs → chunk-MTH2RF6V.mjs} +30 -15
  20. package/dist/chunk-MTH2RF6V.mjs.map +1 -0
  21. package/dist/{chunk-KJ55Q63A.mjs → chunk-THOJRBVD.mjs} +208 -59
  22. package/dist/chunk-THOJRBVD.mjs.map +1 -0
  23. package/dist/{chunk-VENFFPK2.mjs → chunk-VYSDLACR.mjs} +2 -2
  24. package/dist/{chunk-VENFFPK2.mjs.map → chunk-VYSDLACR.mjs.map} +1 -1
  25. package/dist/{chunk-KOR74F6M.mjs → chunk-X63WSMOH.mjs} +4 -36
  26. package/dist/chunk-X63WSMOH.mjs.map +1 -0
  27. package/dist/{chunk-PAFJZH7O.mjs → chunk-YE5QOQUT.mjs} +3 -3
  28. package/dist/{chunk-PAFJZH7O.mjs.map → chunk-YE5QOQUT.mjs.map} +1 -1
  29. package/dist/components/Audio/index.d.mts +3 -3
  30. package/dist/components/Audio/index.mjs +13 -12
  31. package/dist/components/Epub/index.d.mts +3 -3
  32. package/dist/components/Epub/index.mjs +14 -13
  33. package/dist/components/Misc/index.mjs +4 -4
  34. package/dist/components/Reader/index.d.mts +2 -2
  35. package/dist/components/Reader/index.mjs +20 -19
  36. package/dist/components/Reader/index.mjs.map +1 -1
  37. package/dist/components/WebPub/index.d.mts +3 -3
  38. package/dist/components/WebPub/index.mjs +14 -13
  39. package/dist/core/Components/index.d.mts +4 -20
  40. package/dist/core/Components/index.mjs +1 -1
  41. package/dist/core/Helpers/index.mjs +3 -2
  42. package/dist/core/Hooks/index.d.mts +10 -4
  43. package/dist/core/Hooks/index.mjs +2 -1
  44. package/dist/i18n/index.mjs +2 -2
  45. package/dist/lib/index.mjs +3 -2
  46. package/dist/locales/da/thorium-shared.json +217 -10
  47. package/dist/locales/he/thorium-shared.json +8 -0
  48. package/dist/locales/it/thorium-shared.json +2 -2
  49. package/dist/locales/it/thorium-web.json +3 -3
  50. package/dist/locales/lt/thorium-shared.json +85 -1
  51. package/dist/locales/sv/thorium-shared.json +5 -5
  52. package/dist/preferences/index.d.mts +2 -0
  53. package/dist/preferences/index.mjs +4 -3
  54. package/dist/{useAudioNavigator-pGwxhXLj.d.mts → useAudioNavigator-9RuOpLGB.d.mts} +4 -4
  55. package/dist/{useReaderTransitions-Zvomj9RQ.d.mts → useReaderTransitions-CpgrXS5g.d.mts} +25 -6
  56. package/package.json +5 -5
  57. package/dist/chunk-63LKYJFG.mjs.map +0 -1
  58. package/dist/chunk-BBCSLDQT.mjs.map +0 -1
  59. package/dist/chunk-BCXKBHU3.mjs.map +0 -1
  60. package/dist/chunk-GRYEOCGD.mjs.map +0 -1
  61. package/dist/chunk-KJ55Q63A.mjs.map +0 -1
  62. package/dist/chunk-KOR74F6M.mjs.map +0 -1
  63. package/dist/chunk-PRQBFBJ7.mjs.map +0 -1
  64. package/dist/chunk-ZD4LTF6G.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/preferences/globalPreferences.ts","../src/preferences/adapters/ThGlobalMemoryPreferencesAdapter.ts","../src/preferences/ThDirectionSetter.tsx","../src/preferences/ThGlobalPreferencesProvider.tsx","../src/preferences/models/actions.ts","../src/preferences/models/settings.ts","../src/preferences/models/audio.ts","../src/preferences/helpers/buildThemeObject.ts","../src/preferences/helpers/fontPref/bunnyFonts.ts","../src/preferences/helpers/fontPref/googleFonts.ts","../src/preferences/helpers/fontPref/localFonts.ts","../src/preferences/helpers/validateObjectKeys.ts","../src/preferences/models/fonts.ts","../src/preferences/models/protection.ts","../src/preferences/models/theme.ts","../src/preferences/audioPreferences.ts","../src/preferences/defaultAudioPreferences.ts","../src/preferences/ThAudioPreferencesContext.ts","../src/preferences/adapters/ThAudioMemoryPreferencesAdapter.ts","../src/preferences/ThAudioPreferencesProvider.tsx","../src/preferences/preferences.ts","../src/preferences/defaultPreferences.ts","../src/preferences/ThPreferencesContext.ts","../src/preferences/adapters/ThMemoryPreferencesAdapter.ts","../src/preferences/ThPreferencesProvider.tsx","../src/preferences/hooks/useActionsPreferences.ts","../src/preferences/hooks/useAudioPreferences.ts","../src/preferences/services/createBunnyFontResources.ts","../src/preferences/services/createGoogleFontResources.ts","../src/preferences/services/createLocalFontResources.ts","../src/preferences/services/fonts.ts","../src/preferences/hooks/usePreferences.ts","../src/preferences/hooks/usePreferenceKeys.ts","../src/preferences/hooks/useFilteredPreferenceKeys.ts","../src/core/Helpers/prefixString.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/color-space.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/color.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/pipeline.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/loaders/browser.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/loaders/node.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/worker/worker-script.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/worker/manager.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/api.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/progressive.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/swatches.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/quantizers/mmcq.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/sync.ts","../node_modules/.pnpm/colorthief@3.3.1_sharp@0.34.5/node_modules/colorthief/src/index.ts","../src/preferences/helpers/getDominantColor.ts","../src/preferences/helpers/themeGeneration.ts","../src/helpers/proxyUrl.ts","../src/core/Hooks/useContainerBreakpoints.ts","../src/preferences/hooks/useTheming.ts","../src/preferences/hooks/useSharedPreferences.ts"],"names":["useEffect","ThActionsKeys","ThDockingKeys","ThDockingTypes","ThSheetTypes","ThSheetHeaderVariant","ThSettingsKeys","ThTextSettingsKeys","ThSpacingSettingsKeys","ThSettingsContainerKeys","ThSettingsRangeVariant","ThSettingsRangePlaceholder","ThSpacingPresetKeys","ThLayoutOptions","ThTextAlignOptions","ThLineHeightOptions","ThAudioActionKeys","ThAudioKeys","ThSettingsTimerVariant","styles","DEFAULT_FALLBACK","ThThemeKeys","ThAudioAffordance","useMemo","useState","useCallback","jsx","validateRangePresets","createContext","useContext","contrastRatio"],"mappings":"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","file":"chunk-3VB756GR.mjs","sourcesContent":["import { isSupportedLocale, supportedLocales } from \"@/i18n/supported-locales\";\n\nexport interface ThGlobalPreferences {\n locale?: string;\n}\n\nexport const createGlobalPreferences = (params: ThGlobalPreferences): ThGlobalPreferences => {\n if (params.locale) {\n const languageCode = params.locale.split(\"-\")[0];\n if (!isSupportedLocale(languageCode)) {\n console.warn(`Locale \"${ params.locale }\" is not supported. Supported locales: ${ supportedLocales.join(\", \") }. Falling back to browser/OS language settings.`);\n return { ...params, locale: undefined };\n }\n }\n return params;\n};\n","import { ThGlobalPreferences } from \"../globalPreferences\";\nimport { ThGlobalPreferencesAdapter } from \"./ThGlobalPreferencesAdapter\";\n\nexport class ThGlobalMemoryPreferencesAdapter implements ThGlobalPreferencesAdapter {\n private preferences: ThGlobalPreferences;\n private listeners: Set<(prefs: ThGlobalPreferences) => void> = new Set();\n\n constructor(initialPreferences: ThGlobalPreferences = {}) {\n this.preferences = { ...initialPreferences };\n }\n\n getPreferences(): ThGlobalPreferences {\n return { ...this.preferences };\n }\n\n setPreferences(prefs: ThGlobalPreferences): void {\n this.preferences = { ...prefs };\n this.listeners.forEach(cb => cb({ ...this.preferences }));\n }\n\n subscribe(callback: (prefs: ThGlobalPreferences) => void): void {\n this.listeners.add(callback);\n callback(this.getPreferences());\n }\n\n unsubscribe(callback: (prefs: ThGlobalPreferences) => void): void {\n this.listeners.delete(callback);\n }\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useLocale } from \"react-aria\";\n\nexport const ThDirectionSetter = ({ children }: { children: React.ReactNode }) => {\n const { direction } = useLocale();\n\n useEffect(() => {\n document.documentElement.dir = direction;\n }, [direction]);\n\n return children;\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { I18nProvider } from \"react-aria\";\n\nimport { ThGlobalPreferences, createGlobalPreferences } from \"./globalPreferences\";\nimport { ThGlobalPreferencesContext } from \"./ThGlobalPreferencesContext\";\nimport { ThGlobalPreferencesAdapter } from \"./adapters/ThGlobalPreferencesAdapter\";\nimport { ThGlobalMemoryPreferencesAdapter } from \"./adapters/ThGlobalMemoryPreferencesAdapter\";\nimport { ThDirectionSetter } from \"./ThDirectionSetter\";\n\ntype Props = {\n adapter?: ThGlobalPreferencesAdapter;\n initialPreferences?: ThGlobalPreferences;\n children: React.ReactNode;\n};\n\nexport function ThGlobalPreferencesProvider({ adapter, initialPreferences, children }: Props) {\n const effectiveAdapter = useMemo(\n () => adapter || new ThGlobalMemoryPreferencesAdapter(initialPreferences),\n [adapter, initialPreferences]\n );\n\n const [preferences, setPreferences] = useState<ThGlobalPreferences>(\n () => createGlobalPreferences(initialPreferences ?? {})\n );\n\n const handlePreferenceChange = useCallback((newPrefs: ThGlobalPreferences) => {\n setPreferences(prev => {\n const validated = createGlobalPreferences(newPrefs);\n return JSON.stringify(prev) === JSON.stringify(validated) ? prev : validated;\n });\n }, []);\n\n useEffect(() => {\n effectiveAdapter.subscribe(handlePreferenceChange);\n return () => effectiveAdapter.unsubscribe(handlePreferenceChange);\n }, [effectiveAdapter, handlePreferenceChange]);\n\n const contextValue = useMemo(() => ({\n preferences,\n updatePreferences: (newPrefs: ThGlobalPreferences) => {\n effectiveAdapter.setPreferences(newPrefs);\n },\n }), [preferences, effectiveAdapter]);\n\n return (\n <ThGlobalPreferencesContext.Provider value={ contextValue }>\n <I18nProvider locale={ preferences.locale }>\n <ThDirectionSetter>\n { children }\n </ThDirectionSetter>\n </I18nProvider>\n </ThGlobalPreferencesContext.Provider>\n );\n}\n","import { ThCollapsibility, ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\nimport { BreakpointsMap } from \"@/core/Hooks/useBreakpoints\";\nimport { ThBreakpoints } from \"./ui\";\nimport type { KeyCombo } from \"@readium/navigator-html-injectables\";\nimport type { I18nValue } from \"./i18n\";\n\nexport interface ThShortcutConfig {\n keyCombos: KeyCombo[];\n label?: I18nValue<string>;\n}\n\nexport const TEXT_INPUT_SELECTORS: string[] = [\n \"input:not([type='button']):not([type='submit']):not([type='reset']):not([type='file']):not([type='checkbox']):not([type='radio'])\",\n \"textarea\",\n \"[contenteditable]\"\n];\n\nexport type ThBottomSheetDetent = \"content-height\" | \"full-height\";\n\nexport interface ThActionsTokens {\n visibility: ThCollapsibilityVisibility;\n shortcut: ThShortcutConfig | null;\n sheet?: {\n defaultSheet: Exclude<ThSheetTypes, ThSheetTypes.dockedStart | ThSheetTypes.dockedEnd | ThSheetTypes.compactPopover>;\n breakpoints: BreakpointsMap<Exclude<ThSheetTypes, ThSheetTypes.compactPopover>>;\n };\n docked?: ThActionsDockedPref;\n snapped?: ThActionsSnappedPref;\n}\n\nexport interface ThAudioActionsTokens {\n visibility: ThCollapsibilityVisibility;\n shortcut: ThShortcutConfig | null;\n sheet?: {\n defaultSheet: Exclude<ThSheetTypes, ThSheetTypes.dockedStart | ThSheetTypes.dockedEnd | ThSheetTypes.popover>;\n breakpoints: BreakpointsMap<Exclude<ThSheetTypes, ThSheetTypes.popover>>;\n };\n docked?: ThActionsDockedPref;\n snapped?: ThActionsSnappedPref;\n}\n\nexport interface ThActionsDockedPref {\n dockable: ThDockingTypes,\n dragIndicator?: boolean,\n width?: number,\n minWidth?: number,\n maxWidth?: number\n}\n\nexport interface ThActionsSnappedPref {\n scrim?: boolean | string;\n maxWidth?: number | null;\n maxHeight?: number | ThBottomSheetDetent;\n peekHeight?: number | ThBottomSheetDetent;\n minHeight?: number | ThBottomSheetDetent;\n}\n\nexport interface ThDockingPref<T extends string> {\n displayOrder: T[];\n collapse: ThCollapsibility;\n dock: BreakpointsMap<ThDockingTypes> | boolean;\n keys: {\n [key in T]: Pick<ThActionsTokens, \"visibility\" | \"shortcut\">;\n }\n};\n\nexport enum ThActionsKeys {\n fullscreen = \"fullscreen\",\n jumpToPosition = \"jumpToPosition\",\n settings = \"settings\",\n toc = \"toc\"\n}\n\nexport enum ThDockingKeys {\n start = \"dockingStart\",\n end = \"dockingEnd\",\n transient = \"dockingTransient\"\n}\n\nexport enum ThDockingTypes {\n none = \"none\",\n both = \"both\",\n start = \"start\",\n end = \"end\"\n}\n\nexport enum ThSheetTypes {\n popover = \"popover\",\n compactPopover = \"compactPopover\",\n modal = \"modal\",\n fullscreen = \"fullscreen\",\n dockedStart = \"docked start\",\n dockedEnd = \"docked end\",\n bottomSheet = \"bottomSheet\"\n}\n\nexport enum ThSheetHeaderVariant {\n close = \"close\",\n previous = \"previous\"\n}\n\nexport const defaultActionKeysObject: ThActionsTokens = {\n visibility: ThCollapsibilityVisibility.partially,\n shortcut: null\n};\n\nexport const defaultSettingsAction: ThActionsTokens = {\n visibility: ThCollapsibilityVisibility.partially,\n shortcut: {\n label: \"P\",\n keyCombos: [{ keyCode: 80, shift: true, alt: true, suppressOnInteractiveElement: TEXT_INPUT_SELECTORS }]\n },\n sheet: {\n defaultSheet: ThSheetTypes.popover,\n breakpoints: {\n [ThBreakpoints.compact]: ThSheetTypes.bottomSheet\n }\n },\n docked: {\n dockable: ThDockingTypes.none,\n width: 340\n },\n snapped: {\n scrim: true,\n peekHeight: 50,\n minHeight: 30,\n maxHeight: 100\n }\n};\n\nexport const defaultFullscreenAction: ThActionsTokens = {\n visibility: ThCollapsibilityVisibility.partially,\n shortcut: null\n}\n\nexport const defaultTocAction: ThActionsTokens = {\n visibility: ThCollapsibilityVisibility.partially,\n shortcut: {\n label: \"T\",\n keyCombos: [{ keyCode: 84, shift: true, alt: true, suppressOnInteractiveElement: TEXT_INPUT_SELECTORS }]\n },\n sheet: {\n defaultSheet: ThSheetTypes.popover,\n breakpoints: {\n [ThBreakpoints.compact]: ThSheetTypes.fullscreen,\n [ThBreakpoints.medium]: ThSheetTypes.fullscreen\n }\n },\n docked: {\n dockable: ThDockingTypes.both,\n dragIndicator: false,\n width: 360,\n minWidth: 320,\n maxWidth: 450\n }\n}\n\nexport const defaultJumpToPositionAction: ThActionsTokens = {\n visibility: ThCollapsibilityVisibility.overflow,\n shortcut: {\n label: \"J\",\n keyCombos: [{ keyCode: 74, shift: true, alt: true, suppressOnInteractiveElement: TEXT_INPUT_SELECTORS }]\n },\n sheet: {\n defaultSheet: ThSheetTypes.popover,\n breakpoints: {\n [ThBreakpoints.compact]: ThSheetTypes.bottomSheet\n }\n },\n docked: {\n dockable: ThDockingTypes.none\n },\n snapped: {\n scrim: true,\n minHeight: \"content-height\"\n }\n}","import { ThSheetHeaderVariant } from \"./actions\";\nimport { I18nValue } from \"./i18n\";\n\nexport interface ThSettingsGroupPref<T> {\n main: T[];\n subPanel: T[] | null;\n header?: ThSheetHeaderVariant;\n}\n\nexport interface ThSettingsRangePref {\n variant?: ThSettingsRangeVariant;\n placeholder?: I18nValue<ThSettingsRangePlaceholder>;\n range?: [number, number];\n step?: number;\n presets?: number[];\n}\n\n/**\n * Use instead of ThSettingsRangePrefRequired for default values,\n * so that presets remains optional.\n */\nexport type ThSettingsRangePrefRequired = Required<Omit<ThSettingsRangePref, \"presets\">> & Pick<ThSettingsRangePref, \"presets\">;\n\nexport interface ThSettingsRadioPref<T extends string> {\n allowUnset?: boolean;\n keys: {\n [key in T]: number;\n };\n}\n\nexport enum ThSettingsKeys {\n columns = \"columns\",\n fontFamily = \"fontFamily\",\n fontWeight = \"fontWeight\",\n hyphens = \"hyphens\",\n layout = \"layout\",\n letterSpacing = \"letterSpacing\",\n ligatures = \"ligatures\",\n lineHeight = \"lineHeight\",\n noRuby = \"noRuby\",\n paragraphIndent = \"paragraphIndent\",\n paragraphSpacing = \"paragraphSpacing\",\n publisherStyles = \"publisherStyles\",\n spacingGroup = \"spacingGroup\",\n spacingPresets = \"spacingPresets\",\n textAlign = \"textAlign\",\n textGroup = \"textGroup\",\n textNormalize = \"textNormalize\",\n theme = \"theme\",\n wordSpacing = \"wordSpacing\",\n zoom = \"zoom\"\n}\n\nexport enum ThTextSettingsKeys {\n fontFamily = \"fontFamily\",\n fontWeight = \"fontWeight\",\n hyphens = \"hyphens\",\n ligatures = \"ligatures\",\n noRuby = \"noRuby\",\n textAlign = \"textAlign\",\n textNormalize = \"textNormalize\"\n}\n\nexport enum ThSpacingSettingsKeys {\n letterSpacing = \"letterSpacing\",\n lineHeight = \"lineHeight\",\n paragraphIndent = \"paragraphIndent\",\n paragraphSpacing = \"paragraphSpacing\",\n publisherStyles = \"publisherStyles\",\n spacingPresets = \"spacingPresets\",\n wordSpacing = \"wordSpacing\"\n}\n\nexport enum ThSettingsContainerKeys {\n initial = \"initial\",\n text = \"text\",\n spacing = \"spacing\"\n}\n\nexport enum ThSettingsRangeVariant {\n slider = \"slider\",\n incrementedSlider = \"incrementedSlider\",\n numberField = \"numberField\",\n sliderWithPresets = \"sliderWithPresets\",\n presetsGroup = \"presetsGroup\"\n}\n\nexport enum ThSettingsRangePlaceholder {\n range = \"range\",\n none = \"none\"\n}\n\nexport enum ThSpacingPresetKeys {\n publisher = \"publisher\",\n tight = \"tight\",\n balanced = \"balanced\",\n loose = \"loose\",\n accessible = \"accessible\",\n custom = \"custom\"\n}\n\nexport enum ThLayoutOptions { \n scroll = \"scroll_option\",\n paginated = \"page_option\"\n}\n\nexport enum ThTextAlignOptions {\n publisher = \"publisher\",\n start = \"start\",\n justify = \"justify\"\n}\n\nexport enum ThLineHeightOptions {\n publisher = \"publisher\",\n small = \"small\",\n medium = \"medium\",\n large = \"large\"\n}\n\nexport const defaultTextSettingsMain = [ThTextSettingsKeys.fontFamily];\n\nexport const defaultTextSettingsSubpanel = [\n ThTextSettingsKeys.fontFamily,\n ThTextSettingsKeys.textAlign,\n ThTextSettingsKeys.hyphens,\n ThTextSettingsKeys.fontWeight,\n ThTextSettingsKeys.textNormalize,\n ThTextSettingsKeys.ligatures,\n ThTextSettingsKeys.noRuby\n]\n\nexport const defaultSpacingSettingsMain = [\n ThSpacingSettingsKeys.spacingPresets\n];\n\nexport const defaultSpacingSettingsSubpanel = [\n ThSpacingSettingsKeys.spacingPresets,\n ThSpacingSettingsKeys.lineHeight,\n ThSpacingSettingsKeys.paragraphSpacing,\n ThSpacingSettingsKeys.paragraphIndent,\n ThSpacingSettingsKeys.wordSpacing,\n ThSpacingSettingsKeys.letterSpacing\n];\n\nexport const defaultSpacingPresetsOrder = [\n ThSpacingPresetKeys.publisher,\n ThSpacingPresetKeys.accessible,\n ThSpacingPresetKeys.custom,\n ThSpacingPresetKeys.tight,\n ThSpacingPresetKeys.balanced,\n ThSpacingPresetKeys.loose\n]\n\nexport const defaultParagraphSpacing: ThSettingsRangePrefRequired = {\n variant: ThSettingsRangeVariant.numberField,\n placeholder: ThSettingsRangePlaceholder.range,\n range: [0, 3],\n step: 0.25\n}\n\nexport const defaultParagraphIndent: ThSettingsRangePrefRequired = {\n variant: ThSettingsRangeVariant.numberField,\n placeholder: ThSettingsRangePlaceholder.range,\n range: [0, 2],\n step: 0.25\n}\n\nexport const defaultWordSpacing: ThSettingsRangePrefRequired = {\n variant: ThSettingsRangeVariant.numberField,\n placeholder: ThSettingsRangePlaceholder.range,\n range: [0, 1],\n step: 0.1\n}\n\nexport const defaultLetterSpacing: ThSettingsRangePrefRequired = {\n variant: ThSettingsRangeVariant.numberField,\n placeholder: ThSettingsRangePlaceholder.range,\n range: [0, 0.5],\n step: 0.05\n}\n\nexport const defaultLineHeights = {\n [ThLineHeightOptions.small]: 1.35,\n [ThLineHeightOptions.medium]: 1.5,\n [ThLineHeightOptions.large]: 1.75\n}\n\nexport const defaultZoom: ThSettingsRangePrefRequired = {\n variant: ThSettingsRangeVariant.numberField,\n placeholder: ThSettingsRangePlaceholder.range,\n range: [0.7, 4],\n step: 0.05\n}\n\nexport const defaultSpacingPresets = {\n [ThSpacingPresetKeys.tight]: {\n [ThSpacingSettingsKeys.lineHeight]: ThLineHeightOptions.small,\n [ThSpacingSettingsKeys.paragraphSpacing]: 0.25,\n [ThSpacingSettingsKeys.paragraphIndent]: 1\n },\n [ThSpacingPresetKeys.balanced]: {\n [ThSpacingSettingsKeys.lineHeight]: ThLineHeightOptions.medium,\n [ThSpacingSettingsKeys.paragraphSpacing]: 1,\n [ThSpacingSettingsKeys.paragraphIndent]: 1\n },\n [ThSpacingPresetKeys.loose]: {\n [ThSpacingSettingsKeys.lineHeight]: ThLineHeightOptions.large,\n [ThSpacingSettingsKeys.paragraphSpacing]: 1.5,\n [ThSpacingSettingsKeys.paragraphIndent]: 1\n },\n [ThSpacingPresetKeys.accessible]: {\n [ThSpacingSettingsKeys.lineHeight]: ThLineHeightOptions.large,\n [ThSpacingSettingsKeys.paragraphSpacing]: 2.5,\n [ThSpacingSettingsKeys.paragraphIndent]: 1,\n [ThSpacingSettingsKeys.letterSpacing]: 0.1,\n [ThSpacingSettingsKeys.wordSpacing]: 0.3\n }\n}","import { ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\nimport { ThActionsTokens, ThAudioActionsTokens, ThDockingTypes, ThSheetTypes, TEXT_INPUT_SELECTORS } from \"./actions\";\nimport { ThBreakpoints } from \"./ui\";\nimport { ThSettingsRangePrefRequired, ThSettingsRangeVariant, ThSettingsRangePlaceholder } from \"./settings\";\n\nexport enum ThAudioActionKeys {\n toc = \"audio.toc\",\n volume = \"audio.volume\",\n playbackRate = \"audio.playbackRate\",\n sleepTimer = \"audio.sleepTimer\",\n remotePlayback = \"audio.remotePlayback\",\n}\n\nexport enum ThAudioKeys {\n theme = \"theme\",\n volume = \"volume\",\n playbackRate = \"playbackRate\",\n skipBackwardInterval = \"skipBackwardInterval\",\n skipForwardInterval = \"skipForwardInterval\",\n skipInterval = \"skipInterval\",\n autoPlay = \"autoPlay\",\n sleepTimer = \"sleepTimer\",\n}\n\nexport enum ThSettingsTimerVariant {\n presetList = \"presetList\",\n durationField = \"durationField\",\n}\n\nexport type ThSettingsTimerPref =\n | {\n variant: ThSettingsTimerVariant.presetList;\n /** Preset durations in minutes, or \"endOfResource\" to pause at end of track, or \"endOfFragment\" to pause at end of fragment. */\n presets: (number | \"endOfResource\" | \"endOfFragment\")[];\n }\n | {\n variant: ThSettingsTimerVariant.durationField;\n maxHours?: number;\n };\n\nexport type ThAudioSettingsKeys = Exclude<ThAudioKeys, ThAudioKeys.volume | ThAudioKeys.playbackRate>;\n\nexport const defaultAudioVolume: ThSettingsRangePrefRequired = {\n variant: ThSettingsRangeVariant.slider,\n range: [0, 1],\n step: 0.1,\n placeholder: ThSettingsRangePlaceholder.range\n}\n\nexport const defaultAudioPlaybackRate: ThSettingsRangePrefRequired = {\n variant: ThSettingsRangeVariant.sliderWithPresets,\n range: [0.5, 4],\n step: 0.05,\n placeholder: ThSettingsRangePlaceholder.range,\n presets: [0.75, 1, 1.25, 1.5, 1.75, 2]\n}\n\nexport const defaultAudioSkipBackwardInterval: ThSettingsRangePrefRequired = {\n variant: ThSettingsRangeVariant.presetsGroup,\n range: [5, 60],\n step: 5,\n placeholder: ThSettingsRangePlaceholder.range,\n presets: [5, 10, 30]\n}\n\nexport const defaultAudioSkipForwardInterval: ThSettingsRangePrefRequired = {\n variant: ThSettingsRangeVariant.presetsGroup,\n range: [5, 60],\n step: 5,\n placeholder: ThSettingsRangePlaceholder.range,\n presets: [5, 10, 30]\n}\n\nexport const defaultAudioSkipInterval: ThSettingsRangePrefRequired = {\n variant: ThSettingsRangeVariant.presetsGroup,\n range: [5, 60],\n step: 5,\n placeholder: ThSettingsRangePlaceholder.range,\n presets: [5, 10, 30]\n}\n\nexport const defaultAudioSleepTimer: ThSettingsTimerPref = {\n variant: ThSettingsTimerVariant.durationField,\n maxHours: 23,\n};\n\nexport const defaultAudioSleepTimerPresetList: ThSettingsTimerPref = {\n variant: ThSettingsTimerVariant.presetList,\n presets: [15, 30, 45, 60, 90, \"endOfFragment\", \"endOfResource\"],\n};\n\n// Action tokens for ThAudioActionKeys.\n// Primary-zone tokens (volume, playbackRate) live in actions.primary.keys and must use compactPopover\n// Secondary-zone tokens (toc, sleepTimer, remotePlayback) live in actions.secondary.keys and must use regular popover\nexport const defaultAudioVolumeAction: ThAudioActionsTokens = {\n visibility: ThCollapsibilityVisibility.always,\n shortcut: null,\n sheet: {\n defaultSheet: ThSheetTypes.compactPopover,\n breakpoints: {}\n },\n docked: { dockable: ThDockingTypes.none }\n};\n\nexport const defaultAudioPlaybackRateAction: ThAudioActionsTokens = {\n visibility: ThCollapsibilityVisibility.always,\n shortcut: {\n label: \"R\",\n keyCombos: [{ keyCode: 82, shift: true, alt: true, suppressOnInteractiveElement: TEXT_INPUT_SELECTORS }]\n },\n sheet: {\n defaultSheet: ThSheetTypes.compactPopover,\n breakpoints: { [ThBreakpoints.compact]: ThSheetTypes.bottomSheet }\n },\n snapped: {\n minHeight: \"content-height\"\n },\n docked: { dockable: ThDockingTypes.none }\n};\n\nexport const defaultAudioSleepTimerAction: ThAudioActionsTokens = {\n visibility: ThCollapsibilityVisibility.partially,\n shortcut: {\n label: \"S\",\n keyCombos: [{ keyCode: 83, shift: true, alt: true, suppressOnInteractiveElement: TEXT_INPUT_SELECTORS }]\n },\n sheet: {\n defaultSheet: ThSheetTypes.modal,\n breakpoints: { \n [ThBreakpoints.compact]: ThSheetTypes.bottomSheet,\n [ThBreakpoints.medium]: ThSheetTypes.bottomSheet\n }\n },\n snapped: {\n minHeight: \"content-height\"\n },\n docked: { dockable: ThDockingTypes.none }\n};\n\nexport const defaultAudioRemotePlaybackAction: ThActionsTokens = {\n visibility: ThCollapsibilityVisibility.always,\n shortcut: null\n};\n\nexport const defaultAudioTocAction: ThAudioActionsTokens = {\n visibility: ThCollapsibilityVisibility.partially,\n shortcut: {\n label: \"T\",\n keyCombos: [{ keyCode: 84, shift: true, alt: true, suppressOnInteractiveElement: TEXT_INPUT_SELECTORS }]\n },\n sheet: {\n defaultSheet: ThSheetTypes.modal,\n breakpoints: {\n [ThBreakpoints.compact]: ThSheetTypes.fullscreen,\n [ThBreakpoints.medium]: ThSheetTypes.fullscreen\n }\n },\n docked: {\n dockable: ThDockingTypes.both,\n dragIndicator: false,\n width: 360,\n minWidth: 320,\n maxWidth: 450\n }\n};\n","import { ThColorScheme } from \"@/core/Hooks/useColorScheme\";\nimport { ThemeTokens } from \"../hooks/useTheming\";\n\nexport interface buildThemeProps<T extends string> {\n theme?: string;\n themeKeys: { [key in T]?: ThemeTokens },\n systemThemes?: {\n light: T,\n dark: T\n },\n colorScheme?: ThColorScheme;\n}\n\nexport const buildThemeObject = <T extends string>({\n theme,\n themeKeys,\n systemThemes,\n colorScheme\n}: buildThemeProps<T>) => {\n if (!theme) {\n return {};\n }\n\n if (theme === \"auto\" && colorScheme && systemThemes) {\n theme = colorScheme === ThColorScheme.dark ? systemThemes.dark : systemThemes.light;\n }\n\n let themeProps = {};\n\n const themeToken = themeKeys[theme as T];\n if (themeToken) {\n themeProps = {\n backgroundColor: themeToken.background,\n textColor: themeToken.text,\n linkColor: themeToken.link,\n selectionBackgroundColor: themeToken.select,\n selectionTextColor: themeToken.onSelect,\n visitedColor: themeToken.visited\n };\n } else {\n // Fallback if theme doesn't exist\n console.warn(`Theme key \"${String(theme)}\" not found in themeKeys.`);\n themeProps = {\n backgroundColor: null,\n textColor: null,\n linkColor: null,\n selectionBackgroundColor: null,\n selectionTextColor: null,\n visitedColor: null\n };\n }\n\n return themeProps;\n};","import { FontCollection, FontDefinition } from \"@/preferences/models\";\n\ninterface BunnyFontDefinitionParams {\n cssUrl: string;\n options?: {\n labels?: Record<string, string>; // derived fontId -> label\n fallbacks?: Record<string, string[]>; // derived fontId -> fallback array\n order?: string[]; // array of font IDs in desired order\n };\n}\n\nconst DEFAULT_FALLBACK = \"sans-serif\";\n\n/**\n * Parses a Bunny Fonts CSS URL and creates font definitions for all families\n * @param params Bunny Fonts CSS URL and optional configuration\n * @returns FontCollection object with all font definitions\n * @throws Error if CSS URL is invalid or cannot be parsed\n */\nexport const createDefinitionsFromBunnyFonts = (params: BunnyFontDefinitionParams): FontCollection => {\n const { cssUrl, options } = params;\n const { fallbacks, order, labels } = options || {};\n \n // Extract URL from @import url() or href=\"\", otherwise use as-is\n const processedUrl = cssUrl.includes(\"@import\") \n ? cssUrl.match(/@import\\s+url\\(['\"]?([^'\")]+)['\"]?\\)/i)?.[1] || cssUrl\n : cssUrl.includes(\"href=\")\n ? cssUrl.match(/href=[\"']([^\"']+)[\"']/)?.[1] || cssUrl\n : cssUrl;\n \n // Parse the URL\n const url = new URL(processedUrl);\n if (!url.hostname.includes(\"fonts.bunny.net\")) {\n throw new Error(\"Invalid Bunny Fonts URL\");\n }\n\n // Get the family parameter\n const familyParam = url.searchParams.get(\"family\");\n if (!familyParam) {\n throw new Error(\"No family parameter found in Bunny Fonts URL\"); \n }\n\n // Split multiple font families and process each one\n const fontEntries = familyParam.split(\"|\").map((familyStr): [string, any] => {\n // Format: \"font-name:weight1,weight1i,weight2,weight3i,weight4,weight4i\"\n const [familyName, weightsStr = \"\"] = familyStr.split(\":\");\n if (!familyName) {\n throw new Error(`Invalid font family format: ${ familyStr }`);\n }\n\n // Track weights and their styles\n const weightStyles = new Map<number, Set<\"normal\" | \"italic\">>();\n\n // Parse weights and their styles\n if (weightsStr) {\n weightsStr.split(\",\").forEach(weightStr => {\n const isItalic = weightStr.endsWith(\"i\");\n const weightValue = parseInt(isItalic ? weightStr.slice(0, -1) : weightStr, 10);\n \n if (!isNaN(weightValue)) {\n if (!weightStyles.has(weightValue)) {\n weightStyles.set(weightValue, new Set());\n }\n weightStyles.get(weightValue)?.add(isItalic ? \"italic\" : \"normal\");\n }\n });\n }\n\n // Convert to arrays\n const weights = Array.from(weightStyles.keys()).sort((a, b) => a - b);\n const hasItalic = Array.from(weightStyles.values()).some(styles => styles.has(\"italic\"));\n const styles: Array<\"normal\" | \"italic\"> = hasItalic ? [\"normal\", \"italic\"] : [\"normal\"];\n\n const fontId = familyName; // Keep the original ID as is (e.g., \"advent-pro\")\n const familyDisplayName = familyName\n .split(\"-\")\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n\n return [\n fontId,\n {\n id: fontId,\n name: familyDisplayName,\n ...(labels?.[fontId] && { label: labels[fontId] }),\n source: {\n type: \"custom\",\n provider: \"bunny\"\n },\n spec: {\n family: familyDisplayName,\n fallbacks: fallbacks?.[fontId] || [DEFAULT_FALLBACK],\n weights: {\n type: \"static\",\n values: weights.length ? weights : [400],\n },\n styles\n },\n },\n ] as [string, FontDefinition];\n });\n\n // Convert to FontCollection format\n const result: FontCollection = Object.fromEntries(fontEntries);\n \n // Apply ordering if specified\n if (order && order.length > 0) {\n const orderedResult: FontCollection = {};\n order.forEach(fontId => {\n if (result[fontId]) {\n orderedResult[fontId] = result[fontId];\n }\n });\n \n // Add any remaining fonts that weren't in the order array\n Object.entries(result).forEach(([fontId, definition]) => {\n if (!orderedResult[fontId]) {\n orderedResult[fontId] = definition;\n }\n });\n \n return orderedResult;\n }\n \n return result;\n};","import { FontCollection, GoogleFontSource, VariableFontRangeConfig, WeightConfig } from \"@/preferences/models\";\n\n\nconst DEFAULT_FALLBACK = \"sans-serif\";\nconst DEFAULT_WIDTH_STEP = 20;\nconst DEFAULT_WEIGHT_STEP = 20;\n\ninterface GoogleFontFamily {\n name: string;\n styles: (\"normal\" | \"italic\")[];\n weights: WeightConfig;\n widths?: VariableFontRangeConfig;\n}\n\nexport interface GoogleFontDefinitionParams {\n cssUrl: string,\n options?: {\n widthStep?: number;\n weightStep?: number;\n display?: \"swap\" | \"block\" | \"fallback\" | \"optional\";\n labels?: Record<string, string>; // derived fontId -> label\n fallbacks?: Record<string, string[]>; // derived fontId -> fallback array\n order?: string[]; // array of font IDs in desired order\n }\n}\n\n/**\n * Parses a Google Fonts CSS URL and creates font definitions for all families\n * @param params Google Fonts CSS URL and optional configuration for step values and display\n * @returns FontCollection object with all font definitions\n * @throws Error if CSS URL is invalid or cannot be parsed\n */\nexport const createDefinitionsFromGoogleFonts = (params: GoogleFontDefinitionParams): FontCollection => {\n const { cssUrl, options } = params;\n const { widthStep = DEFAULT_WIDTH_STEP, weightStep = DEFAULT_WEIGHT_STEP, display, labels, fallbacks, order } = options || {};\n \n // Extract URL from @import url() or href=\"\", otherwise use as-is\n const processedUrl = cssUrl.includes(\"@import\") \n ? cssUrl.match(/@import\\s+url\\(['\"]?([^'\")]+)['\"]?\\)/i)?.[1] || cssUrl\n : cssUrl.includes(\"href=\")\n ? cssUrl.match(/href=[\"']([^\"']+)[\"']/)?.[1] || cssUrl\n : cssUrl;\n \n // Parse the URL using static method\n const url = new URL(processedUrl);\n if (!url.hostname.includes(\"fonts.googleapis.com\")) {\n throw new Error(\"Invalid Google Fonts URL\");\n }\n\n // Get all family parameters using searchParams\n const familyParams = url.searchParams.getAll(\"family\");\n if (familyParams.length === 0) {\n throw new Error(\"No family parameter found in Google Fonts URL\");\n }\n\n // Parse each family parameter\n const families = familyParams.map(familyParam => {\n const decodedFamily = decodeURIComponent(familyParam);\n const [familyName, axesStr] = decodedFamily.split(\":\");\n \n if (!familyName) {\n throw new Error(`Invalid family format: ${ familyParam }`);\n }\n\n const family: GoogleFontFamily = {\n name: familyName.replace(/\\+/g, \" \"),\n styles: [\"normal\"],\n weights: { type: \"static\", values: [400] } // Default weight\n };\n \n // Track if we've seen any explicit weights in the URL\n let hasExplicitWeights = false;\n\n // Parse axes if present\n if (axesStr) {\n const [axisNames, valuesStr] = axesStr.split(\"@\");\n if (axisNames && valuesStr) {\n const axes = axisNames.split(\",\");\n const variations = valuesStr.split(\";\");\n \n variations.forEach(variation => {\n const values = variation.split(\",\");\n axes.forEach((axis, index) => {\n const value = values[index];\n if (!value) return;\n \n switch (axis) {\n case \"ital\":\n if (value === \"1\") {\n family.styles = Array.from(new Set([...family.styles, \"italic\"]));\n }\n break;\n case \"wght\":\n if (value.includes(\"..\")) {\n // Variable font - use the range\n const [min, max] = value.split(\"..\").map(Number);\n if (!isNaN(min) && !isNaN(max)) {\n family.weights = {\n type: \"variable\",\n min,\n max,\n step: weightStep\n };\n }\n } else {\n // Handle explicit weight from URL\n const weight = Number(value);\n if (!isNaN(weight) && family.weights.type === \"static\") {\n const currentWeights = family.weights.values;\n const newWeights = !hasExplicitWeights \n ? [weight] // First weight replaces default\n : Array.from(new Set([...currentWeights, weight])).sort((a, b) => a - b); // Add to existing and deduplicate\n \n family.weights = {\n type: \"static\",\n values: newWeights\n };\n hasExplicitWeights = true;\n }\n }\n break;\n case \"wdth\":\n if (value.includes(\"..\")) {\n const [min, max] = value.split(\"..\").map(Number);\n if (!isNaN(min) && !isNaN(max)) {\n family.widths = {\n min,\n max,\n step: widthStep\n };\n }\n }\n break;\n }\n });\n });\n }\n }\n\n return family;\n });\n\n // Convert families to FontCollection object\n const fontEntries: [string, any][] = families.map(family => {\n const fontId = family.name.toLowerCase().replace(/\\s+/g, \"-\");\n return [\n fontId,\n {\n id: fontId,\n name: family.name,\n ...(labels?.[fontId] && { label: labels[fontId] }),\n source: { type: \"custom\", provider: \"google\" } as GoogleFontSource,\n spec: {\n family: family.name,\n fallbacks: fallbacks?.[fontId] || [DEFAULT_FALLBACK],\n weights: family.weights,\n styles: family.styles,\n ...(family.widths && { widths: family.widths }),\n ...(display && { display })\n }\n }\n ];\n });\n\n // If order is specified, sort the entries according to the order\n if (order && order.length > 0) {\n const orderedEntries: [string, any][] = [];\n const fontMap = new Map<string, any>(fontEntries);\n \n // Add fonts in the specified order (using font IDs directly)\n for (const fontId of order) {\n const fontEntry = fontMap.get(fontId);\n if (fontEntry) {\n orderedEntries.push([fontId, fontEntry]);\n fontMap.delete(fontId);\n }\n }\n \n // Add any remaining fonts that weren't in the order list\n for (const [fontId, fontEntry] of fontMap.entries()) {\n orderedEntries.push([fontId, fontEntry]);\n }\n \n return Object.fromEntries(orderedEntries);\n }\n\n // Default behavior - use original order from URL\n return Object.fromEntries(fontEntries); \n} \n","import { FontDefinition, FontSpec, LocalStaticFontFile, LocalStaticFontSource } from \"@/preferences/models\";\n\ninterface CreateFontDefinitionParams {\n id: string;\n name: string;\n files: LocalStaticFontFile[];\n family?: string;\n label?: string;\n fallbacks?: string[];\n}\n\n/**\n * Creates a complete font definition by inferring properties from static font files\n * @param params Font definition parameters\n * @returns Complete font definition with inferred spec\n * @throws Error if files are not static font files or if no files provided\n */\nexport const createDefinitionFromStaticFonts = (\n params: CreateFontDefinitionParams\n): FontDefinition => {\n const { id, name, files, family, label, fallbacks = [\"sans-serif\"] } = params;\n \n if (!files || files.length === 0) {\n throw new Error(\"No files provided to infer font specification\");\n }\n\n // Verify all files have weights (static fonts only)\n if (!files.every(file => file.weight !== undefined)) {\n throw new Error(\"All files must have explicit weights for static font specification inference\");\n }\n\n const weights = Array.from(new Set(files.map(file => file.weight))).sort((a, b) => a - b);\n const styles = Array.from(new Set(files.map(file => file.style)));\n \n const source: LocalStaticFontSource = {\n type: \"custom\",\n provider: \"local\",\n variant: \"static\",\n files\n };\n \n const spec: FontSpec = {\n family: family || name,\n fallbacks,\n weights: {\n type: \"static\",\n values: weights\n },\n styles: styles\n };\n \n return {\n id,\n name,\n ...(label && { label }),\n source,\n spec\n };\n}","export const validateObjectKeys = <K extends string, V>(\n orderArrays: K[][],\n keysObj: Record<string, V>,\n context: string,\n specialCase?: string | string[],\n fallback?: V\n): void => {\n const allOrders = new Set<K>(\n orderArrays.flatMap(arr => {\n if (!specialCase) return arr;\n return arr.filter(k => {\n if (Array.isArray(specialCase)) {\n return !specialCase.includes(k);\n } else {\n return k !== specialCase;\n }\n });\n })\n );\n\n const availableKeys = Object.keys(keysObj);\n\n allOrders.forEach(key => {\n if (!availableKeys.includes(key)) {\n if (fallback) keysObj[key] = fallback;\n console.warn(\n `Key \"${ key }\" in ${ context } order arrays not found in ${ context }.keys.${ fallback ? `\\nUsing fallback: ${ JSON.stringify(fallback) }` : \"\" }`\n );\n }\n });\n};\n","import fontStacks from \"@readium/css/css/vars/fontStacks.json\";\n\nimport { createDefinitionFromStaticFonts, createDefinitionsFromGoogleFonts } from \"../helpers\";\nimport { I18nValue } from \"./i18n\";\n\nexport interface SystemFontSource {\n type: \"system\";\n}\n\nexport interface BunnyFontSource {\n type: \"custom\";\n provider: \"bunny\";\n}\n\nexport interface GoogleFontSource {\n type: \"custom\";\n provider: \"google\";\n}\n\nexport interface LocalStaticFontFile {\n path: string;\n weight: number;\n style: \"normal\" | \"italic\";\n}\n\nexport interface LocalVariableFontFile {\n path: string;\n style?: \"normal\" | \"italic\";\n}\n\nexport interface LocalStaticFontSource {\n type: \"custom\";\n provider: \"local\";\n variant: \"static\";\n files: LocalStaticFontFile[];\n}\n\nexport interface LocalVariableFontSource {\n type: \"custom\";\n provider: \"local\";\n variant: \"variable\";\n files: LocalVariableFontFile[];\n}\n\nexport type LocalFontSource = LocalStaticFontSource | LocalVariableFontSource;\n\nexport type FontSource = SystemFontSource | BunnyFontSource | GoogleFontSource | LocalFontSource;\n\nexport type VariableFontRangeConfig = {\n min: number;\n max: number;\n step?: number;\n};\n\nexport type WeightConfig =\n | {\n type: \"static\";\n values: number[];\n }\n | {\n type: \"variable\";\n } & VariableFontRangeConfig;\n\nexport interface FontSpec {\n family: string;\n fallbacks: string[];\n weights: WeightConfig;\n styles?: (\"normal\" | \"italic\")[];\n widths?: VariableFontRangeConfig;\n display?: \"swap\" | \"block\" | \"fallback\" | \"optional\";\n}\n\nexport interface FontDefinition {\n id: string;\n name: string;\n label?: I18nValue<string>;\n source: FontSource;\n spec: FontSpec;\n}\n\nexport type FontCollection = Record<string, FontDefinition>;\n\nexport type ValidatedLanguageCollection = {\n fonts: FontCollection; \n supportedLanguages: string[] \n};\n\nexport type ThFontFamilyPref = {\n default: FontCollection;\n} | {\n [K in Exclude<string, \"default\">]: ValidatedLanguageCollection;\n};\n\nexport const readiumCSSFontCollection: FontCollection = {\n oldStyle: {\n id: \"oldStyle\",\n name: \"Old Style\",\n label: \"reader.preferences.fontFamily.oldStyle.descriptive\",\n source: { type: \"system\" },\n spec: {\n family: fontStacks.oldStyleTf,\n weights: { type: \"static\", values: [400, 700] },\n fallbacks: []\n }\n },\n modern: {\n id: \"modern\",\n name: \"Modern\",\n label: \"reader.preferences.fontFamily.modern.descriptive\",\n source: { type: \"system\" },\n spec: {\n family: fontStacks.modernTf,\n weights: { type: \"static\", values: [400, 700] },\n fallbacks: []\n }\n },\n sans: {\n id: \"sans\",\n name: \"Sans\",\n label: \"reader.preferences.fontFamily.sans\",\n source: { type: \"system\" },\n spec: {\n family: fontStacks.sansTf,\n weights: { type: \"static\", values: [400, 700] },\n fallbacks: []\n }\n },\n humanist: {\n id: \"humanist\",\n name: \"Humanist\",\n label: \"reader.preferences.fontFamily.humanist.descriptive\",\n source: { type: \"system\" },\n spec: {\n family: fontStacks.humanistTf,\n weights: { type: \"static\", values: [400, 700] },\n fallbacks: []\n }\n },\n monospace: {\n id: \"monospace\",\n name: \"Monospace\",\n label: \"reader.preferences.fontFamily.monospace\",\n source: { type: \"system\" },\n spec: {\n family: fontStacks.monospaceTf,\n weights: { type: \"static\", values: [400, 700] },\n fallbacks: []\n }\n }\n};\n\nexport const defaultFontCollection: FontCollection = {\n ...createDefinitionsFromGoogleFonts({\n cssUrl: \"https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible+Next:ital,wght@0,200..800;1,200..800&family=Literata:ital,opsz,wght@0,7..72,200..900;1,7..72,200..900\",\n options: {\n order: [\"literata\", \"atkinson-hyperlegible-next\"],\n fallbacks: {\n \"literata\": [\"serif\"],\n \"atkinson-hyperlegible-next\": [\"sans-serif\"]\n }\n }\n }),\n luciole: createDefinitionFromStaticFonts({\n id: \"luciole\",\n name: \"Luciole\",\n files: [\n { path: \"/fonts/Luciole/Luciole-Regular.woff2\", weight: 400, style: \"normal\" },\n { path: \"/fonts/Luciole/Luciole-Italic.woff2\", weight: 400, style: \"italic\" },\n { path: \"/fonts/Luciole/Luciole-Bold.woff2\", weight: 700, style: \"normal\" },\n { path: \"/fonts/Luciole/Luciole-BoldItalic.woff2\", weight: 700, style: \"italic\" }\n ]\n }),\n ...readiumCSSFontCollection,\n iAWriterDuo: createDefinitionFromStaticFonts({\n id: \"iAWriterDuo\",\n name: \"iA Writer Duo\",\n label: \"iA Writer Duospace\",\n fallbacks: [\"monospace\"],\n files: [\n { path: \"/fonts/iAWriterDuo/iAWriterDuoS-Regular.woff2\", weight: 400, style: \"normal\" },\n { path: \"/fonts/iAWriterDuo/iAWriterDuoS-Bold.woff2\", weight: 700, style: \"normal\" },\n { path: \"/fonts/iAWriterDuo/iAWriterDuoS-Italic.woff2\", weight: 400, style: \"italic\" },\n { path: \"/fonts/iAWriterDuo/iAWriterDuoS-BoldItalic.woff2\", weight: 700, style: \"italic\" }\n ]\n }),\n openDyslexic: createDefinitionFromStaticFonts({\n id: \"openDyslexic\",\n name: \"Open Dyslexic\",\n files: [\n { path: \"/fonts/OpenDyslexic/OpenDyslexic-Regular.otf\", weight: 400, style: \"normal\" },\n { path: \"/fonts/OpenDyslexic/OpenDyslexic-Italic.otf\", weight: 400, style: \"italic\" },\n { path: \"/fonts/OpenDyslexic/OpenDyslexic-Bold.otf\", weight: 700, style: \"normal\" },\n { path: \"/fonts/OpenDyslexic/OpenDyslexic-BoldItalic.otf\", weight: 700, style: \"italic\" }\n ]\n }),\n accessibleDfA: createDefinitionFromStaticFonts({\n id: \"accessibleDfA\",\n name: \"Accessible DfA\",\n files: [\n { path: \"/fonts/AccessibleDfA/AccessibleDfA-Regular.woff2\", weight: 400, style: \"normal\" },\n { path: \"/fonts/AccessibleDfA/AccessibleDfA-Italic.woff2\", weight: 400, style: \"italic\" },\n { path: \"/fonts/AccessibleDfA/AccessibleDfA-Bold.woff2\", weight: 700, style: \"normal\" }\n ]\n })\n};\n\nexport const tamilCollection = {\n ...createDefinitionsFromGoogleFonts({\n cssUrl: \"https://fonts.googleapis.com/css2?family=Anek+Tamil:wght@100..800&family=Catamaran:wght@100..900&family=Hind+Madurai:wght@400;700&family=Mukta+Malar:wght@400;700&family=Noto+Sans+Tamil:wght@100..900&family=Noto+Serif+Tamil:ital,wght@0,100..900;1,100..900\",\n options: {\n order: [\"noto-sans-tamil\", \"noto-serif-tamil\", \"anek-tamil\", \"catamaran\", \"hind-madurai\", \"mukta-malar\"],\n labels: {\n \"noto-sans-tamil\": \"Noto Sans\",\n \"noto-serif-tamil\": \"Noto Serif\",\n \"anek-tamil\": \"அனேக் தமிழ்\",\n \"catamaran\": \"கட்டுமரன்\",\n \"mukta-malar\": \"முக்த மலர்\"\n },\n fallbacks: {\n \"noto-serif-tamil\": [\"serif\"]\n }\n }\n })\n}\n\nconst sysFontDef = (id: string, name: string, family: string): FontDefinition => ({\n id,\n name,\n source: { type: \"system\" },\n spec: { family, fallbacks: [], weights: { type: \"static\", values: [400, 700] } }\n});\n\nexport const arabicFarsiCollection: FontCollection = {\n ...createDefinitionsFromGoogleFonts({\n cssUrl: \"https://fonts.googleapis.com/css2?family=Noto+Sans+Arabic:wght@100..900&family=Noto+Naskh+Arabic:wght@400..700&family=Scheherazade+New:wght@400..700\",\n options: {\n order: [\"noto-sans-arabic\", \"noto-naskh-arabic\", \"scheherazade-new\"],\n labels: {\n \"noto-sans-arabic\": \"Noto Sans\",\n \"noto-naskh-arabic\": \"Noto Naskh\"\n },\n fallbacks: {\n \"noto-naskh-arabic\": [\"serif\"],\n \"scheherazade-new\": [\"serif\"]\n }\n }\n })\n};\n\nexport const hebrewCollection: FontCollection = {\n ...createDefinitionsFromGoogleFonts({\n cssUrl: \"https://fonts.googleapis.com/css2?family=Noto+Sans+Hebrew:wght@100..900&family=Frank+Ruhl+Libre:wght@300..900&family=Heebo:wght@100..800\",\n options: {\n order: [\"noto-sans-hebrew\", \"frank-ruhl-libre\", \"heebo\"],\n labels: {\n \"frank-ruhl-libre\": \"Frank Rühl Libre\"\n },\n fallbacks: {\n \"frank-ruhl-libre\": [\"serif\"]\n }\n }\n })\n};\n\nexport const chineseSimplifiedCollection: FontCollection = {\n \"chinese-hans-sans\": sysFontDef(\"chinese-hans-sans\", \"Sans-Serif\", '\"PingFang SC\", \"Microsoft YaHei\", \"WenQuanYi Micro Hei\", sans-serif'),\n \"chinese-hans-serif\": sysFontDef(\"chinese-hans-serif\", \"Serif\", '\"STSong\", \"SimSun\", \"AR PL UMing CN\", serif'),\n ...createDefinitionsFromGoogleFonts({\n cssUrl: \"https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100..900&family=Noto+Serif+SC:wght@200..900\",\n options: {\n labels: {\n \"noto-sans-sc\": \"Noto Sans SC\",\n \"noto-serif-sc\": \"Noto Serif SC\"\n },\n fallbacks: {\n \"noto-serif-sc\": [\"serif\"]\n }\n }\n })\n};\n\nexport const chineseTraditionalCollection: FontCollection = {\n \"chinese-hant-sans\": sysFontDef(\"chinese-hant-sans\", \"Sans-Serif\", '\"PingFang TC\", \"Microsoft JhengHei\", \"WenQuanYi Micro Hei\", sans-serif'),\n \"chinese-hant-serif\": sysFontDef(\"chinese-hant-serif\", \"Serif\", '\"MingLiU\", \"AR PL UMing TW\", serif'),\n ...createDefinitionsFromGoogleFonts({\n cssUrl: \"https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100..900&family=Noto+Serif+TC:wght@200..900\",\n options: {\n labels: {\n \"noto-sans-tc\": \"Noto Sans TC\",\n \"noto-serif-tc\": \"Noto Serif TC\"\n },\n fallbacks: {\n \"noto-serif-tc\": [\"serif\"]\n }\n }\n })\n};\n\nexport const japaneseCollection: FontCollection = {\n \"japanese-sans\": sysFontDef(\"japanese-sans\", \"Sans-Serif\", fontStacks[\"sans-serif-ja\"]),\n \"japanese-serif\": sysFontDef(\"japanese-serif\", \"Serif\", fontStacks[\"serif-ja\"]),\n ...createDefinitionsFromGoogleFonts({\n cssUrl: \"https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100..900&family=Noto+Serif+JP:wght@200..900\",\n options: {\n labels: {\n \"noto-sans-jp\": \"Noto Sans JP\",\n \"noto-serif-jp\": \"Noto Serif JP\"\n },\n fallbacks: {\n \"noto-serif-jp\": [\"serif\"]\n }\n }\n })\n};\n\nexport const japaneseVerticalCollection: FontCollection = {\n \"japanese-v-sans\": sysFontDef(\"japanese-v-sans\", \"Sans-Serif\", fontStacks[\"sans-serif-ja-v\"]),\n \"japanese-v-serif\": sysFontDef(\"japanese-v-serif\", \"Serif\", fontStacks[\"serif-ja-v\"]),\n ...createDefinitionsFromGoogleFonts({\n cssUrl: \"https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@200..900&family=Shippori+Mincho:wght@400..800&family=Noto+Sans+JP:wght@100..900\",\n options: {\n order: [\"noto-serif-jp\", \"shippori-mincho\", \"noto-sans-jp\"],\n labels: {\n \"noto-serif-jp\": \"Noto Serif JP\",\n \"noto-sans-jp\": \"Noto Sans JP\"\n },\n fallbacks: {\n \"noto-serif-jp\": [\"serif\"],\n \"shippori-mincho\": [\"serif\"]\n }\n }\n })\n};\n\nexport const koreanCollection: FontCollection = {\n \"korean-sans\": sysFontDef(\"korean-sans\", \"Sans-Serif\", '\"Apple SD Gothic Neo\", \"Malgun Gothic\", \"Dotum\", sans-serif'),\n \"korean-serif\": sysFontDef(\"korean-serif\", \"Serif\", '\"Batang\", \"Gungsuh\", \"Apple Myungjo\", serif'),\n ...createDefinitionsFromGoogleFonts({\n cssUrl: \"https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&family=Noto+Serif+KR:wght@200..900&family=Nanum+Myeongjo:wght@400;700;800\",\n options: {\n order: [\"noto-sans-kr\", \"noto-serif-kr\", \"nanum-myeongjo\"],\n labels: {\n \"noto-sans-kr\": \"Noto Sans KR\",\n \"noto-serif-kr\": \"Noto Serif KR\"\n },\n fallbacks: {\n \"noto-serif-kr\": [\"serif\"],\n \"nanum-myeongjo\": [\"serif\"]\n }\n }\n })\n};","import { IContentProtectionConfig, IAudioContentProtectionConfig } from \"@readium/navigator\";\nimport { I18nValue } from \"./i18n\";\n\nexport interface CopyProtectionConfig {\n /** Maximum percentage of content that can be selected (0-1) */\n maxSelectionPercent: number;\n /** Minimum number of characters that can be selected before protection kicks in */\n minThreshold: number;\n /** Absolute maximum number of characters that can be copied in total */\n absoluteMaxChars: number;\n /** Number of recent copy attempts to keep in history for pattern analysis */\n historySize: number;\n}\n\nexport interface PrintProtectionConfig {\n /** Disable printing completely */\n disable?: boolean;\n /** Optional watermark text to show when printing is disabled */\n watermark?: I18nValue<string>;\n}\n\nexport interface ContentProtectionConfig {\n /**\n * Higher-level API will make use of the following from Content Protection API:\n * - checkAutomation\n * - checkIFrameEmbedding\n * - monitorSelection\n * - monitorDevTools\n * - monitorScrollingExperimental\n */\n\n /**\n * Configure copy protection\n * - boolean: true to enable with default settings, false to disable\n * - object: Fine-grained control over copy protection\n */\n protectCopy?: boolean | CopyProtectionConfig;\n\n /** Disable right-click context menu */\n disableContextMenu?: boolean;\n\n /** Disable drag and drop functionality */\n disableDragAndDrop?: boolean;\n\n /** Print protection configuration */\n protectPrinting?: PrintProtectionConfig;\n\n /** Disable Select All functionality (Ctrl+A/Cmd+A) */\n disableSelectAll?: boolean;\n\n /** Disable Save functionality (Ctrl+S/Cmd+S) */\n disableSave?: boolean;\n\n /** Monitor developer tools for suspicious activity. We need it for the shortcut protection */\n monitorDevTools?: boolean;\n\n /** Prevent casting to remote devices via the Remote Playback API. */\n disableRemotePlayback?: boolean;\n}\n\n/**\n * Resolves content protection configuration with localized strings\n * @param contentProtection The content protection config to resolve\n * @param t Translation function that supports defaultValue option\n * @returns Resolved content protection config compatible with navigator\n */\nexport const resolveContentProtectionConfig = (\n contentProtection: ContentProtectionConfig | undefined,\n t: (key: string, options?: { defaultValue?: string }) => string\n): IContentProtectionConfig | undefined => {\n if (!contentProtection) return undefined;\n \n // Resolve watermark localization following the StatefulFontFamily pattern\n let resolvedWatermark: string | undefined;\n if (contentProtection.protectPrinting?.watermark) {\n if (typeof contentProtection.protectPrinting.watermark === \"object\" && \"key\" in contentProtection.protectPrinting.watermark) {\n // Handle I18nValue object with key and fallback using t() defaultValue option\n resolvedWatermark = t(contentProtection.protectPrinting.watermark.key, {\n defaultValue: contentProtection.protectPrinting.watermark.fallback\n });\n } else if (typeof contentProtection.protectPrinting.watermark === \"string\") {\n // Handle plain string (should be a translation key)\n resolvedWatermark = t(contentProtection.protectPrinting.watermark);\n }\n }\n \n // Construct the resolved config with proper types matching IContentProtectionConfig\n const resolved: IContentProtectionConfig = {\n protectCopy: contentProtection.protectCopy,\n disableContextMenu: contentProtection.disableContextMenu,\n disableDragAndDrop: contentProtection.disableDragAndDrop,\n protectPrinting: contentProtection.protectPrinting?.disable ? {\n disable: true,\n watermark: resolvedWatermark\n } : undefined,\n disableSelectAll: contentProtection.disableSelectAll,\n disableSave: contentProtection.disableSave,\n monitorDevTools: contentProtection.monitorDevTools,\n // TODO: When we implement it in non-audio navigators, uncomment\n // disableRemotePlayback: contentProtection.disableRemotePlayback\n };\n\n return resolved;\n};\n\n/**\n * Audio-specific content protection configuration.\n * Differs from ContentProtectionConfig in that protectCopy is boolean only,\n * since audio does not support selection-based copy protection.\n */\nexport type AudioContentProtectionConfig = Omit<ContentProtectionConfig, \"protectCopy\"> & {\n /** Block copy events (Ctrl+C / Cmd+C) */\n protectCopy?: boolean;\n};\n\n/**\n * Resolves audio content protection configuration with localized strings\n */\nexport const resolveAudioContentProtectionConfig = (\n contentProtection: AudioContentProtectionConfig | undefined,\n t: (key: string, options?: { defaultValue?: string }) => string\n): IAudioContentProtectionConfig | undefined => {\n if (!contentProtection) return undefined;\n\n let resolvedWatermark: string | undefined;\n if (contentProtection.protectPrinting?.watermark) {\n if (typeof contentProtection.protectPrinting.watermark === \"object\" && \"key\" in contentProtection.protectPrinting.watermark) {\n resolvedWatermark = t(contentProtection.protectPrinting.watermark.key, {\n defaultValue: contentProtection.protectPrinting.watermark.fallback\n });\n } else if (typeof contentProtection.protectPrinting.watermark === \"string\") {\n resolvedWatermark = t(contentProtection.protectPrinting.watermark);\n }\n }\n\n return {\n protectCopy: contentProtection.protectCopy,\n disableContextMenu: contentProtection.disableContextMenu,\n disableDragAndDrop: contentProtection.disableDragAndDrop,\n protectPrinting: contentProtection.protectPrinting?.disable ? {\n disable: true,\n watermark: resolvedWatermark\n } : undefined,\n disableSelectAll: contentProtection.disableSelectAll,\n disableSave: contentProtection.disableSave,\n monitorDevTools: contentProtection.monitorDevTools,\n disableRemotePlayback: contentProtection.disableRemotePlayback,\n };\n};\n\n/**\n * Default content protection configuration\n */\nexport const defaultContentProtectionConfig: ContentProtectionConfig = {\n protectCopy: false,\n disableContextMenu: false,\n disableDragAndDrop: false,\n protectPrinting: {\n disable: false,\n watermark: \"reader.app.printingDisabled\"\n },\n disableSelectAll: false,\n disableSave: false,\n monitorDevTools: false\n};\n\n/**\n * Default audio content protection configuration\n */\nexport const defaultAudioContentProtectionConfig: AudioContentProtectionConfig = {\n protectCopy: false,\n disableContextMenu: false,\n disableDragAndDrop: false,\n protectPrinting: {\n disable: false,\n watermark: \"reader.app.printingDisabled\"\n },\n disableSelectAll: false,\n disableSave: false,\n monitorDevTools: false,\n disableRemotePlayback: false,\n};\n\n/**\n * Development content protection configuration - disables all protections\n */\nexport const devContentProtectionConfig = {\n protectCopy: false,\n disableContextMenu: false,\n disableDragAndDrop: false,\n protectPrinting: {\n disable: false\n },\n disableSelectAll: false,\n disableSave: false,\n monitorDevTools: false,\n disableRemotePlayback: false,\n};","import ReadiumCSSColors from \"@readium/css/css/vars/colors.json\";\n\nexport enum ThThemeKeys {\n light = \"light\",\n sepia = \"sepia\",\n dark = \"dark\",\n paper = \"paper\",\n contrast1 = \"contrast1\",\n contrast2 = \"contrast2\",\n contrast3 = \"contrast3\"\n}\n\nexport const lightTheme = {\n background: ReadiumCSSColors.backgroundColor, // Color of background\n text: ReadiumCSSColors.textColor, // Color of text\n link: \"#0000ee\", // Color of links\n visited: \"#551a8b\", // Color of visited links\n subdue: \"#808080\", // Color of subdued elements\n disable: \"#808080\", // color for :disabled\n hover: \"#d9d9d9\", // color of background for :hover\n onHover: ReadiumCSSColors.textColor, // color of text for :hover\n select: \"#b4d8fe\", // color of selected background\n onSelect: \"inherit\", // color of selected text\n focus: \"#0067f4\", // color of :focus-visible\n elevate: \"0px 0px 2px #808080\", // drop shadow of containers\n immerse: \"0.6\" // opacity of immersive mode\n}\n\nexport const darkTheme = {\n background: \"#000000\",\n text: \"#FEFEFE\",\n link: \"#63caff\",\n visited: \"#0099E5\",\n subdue: \"#808080\",\n disable: \"#808080\",\n hover: \"#404040\",\n onHover: \"#FEFEFE\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#0067f4\",\n elevate: \"0px 0px 2px #808080\",\n immerse: \"0.4\"\n}\n\nexport const paperTheme = {\n background: \"#faf4e8\",\n text: \"#121212\",\n link: \"#0000EE\",\n visited: \"#551A8B\",\n subdue: \"#8c8c8c\",\n disable: \"#8c8c8c\",\n hover: \"#edd7ab\",\n onHover: \"#121212\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#0067f4\",\n elevate: \"0px 0px 2px #8c8c8c\",\n immerse: \"0.5\"\n}\n\nexport const sepiaTheme = {\n background: \"#e9ddc8\",\n text: \"#000000\",\n link: \"#0000EE\",\n visited: \"#551A8B\",\n subdue: \"#8c8c8c\",\n disable: \"#8c8c8c\",\n hover: \"#ccb07f\",\n onHover: \"#000000\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#004099\",\n elevate: \"0px 0px 2px #8c8c8c\",\n immerse: \"0.45\"\n}\n\nexport const contrast1Theme = {\n background: \"#000000\",\n text: \"#ffff00\",\n link: \"#63caff\",\n visited: \"#0099E5\",\n subdue: \"#808000\",\n disable: \"#808000\",\n hover: \"#404040\",\n onHover: \"#ffff00\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#0067f4\",\n elevate: \"0px 0px 2px #808000\",\n immerse: \"0.4\"\n}\n\nexport const contrast2Theme = {\n background: \"#181842\",\n text: \"#ffffff\",\n link: \"#adcfff\",\n visited: \"#7ab2ff\",\n subdue: \"#808080\",\n disable: \"#808080\",\n hover: \"#4444bb\",\n onHover: \"#ffffff\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#6BA9FF\",\n elevate: \"0px 0px 2px #808080\",\n immerse: \"0.4\"\n}\n\nexport const contrast3Theme = {\n background: \"#c5e7cd\",\n text: \"#000000\",\n link: \"#0000EE\",\n visited: \"#551A8B\",\n subdue: \"#8c8c8c\",\n disable: \"#8c8c8c\",\n hover: \"#6fc383\",\n onHover: \"#000000\",\n select: \"#b4d8fe\",\n onSelect: \"inherit\",\n focus: \"#004099\",\n elevate: \"0px 0px 2px #8c8c8c\",\n immerse: \"0.45\"\n}","import { BreakpointsMap } from \"@/core/Hooks/useBreakpoints\";\nimport { ThemeTokens } from \"@/preferences/hooks/useTheming\";\nimport { ThCollapsibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\nimport {\n ThAudioActionKeys,\n ThAudioKeys,\n ThDockingKeys,\n ThSheetTypes,\n ThThemeKeys,\n ThActionsTokens,\n ThAudioActionsTokens,\n ThSettingsRangePrefRequired,\n ThSettingsRangeVariant,\n ThSettingsTimerPref,\n ThBackLinkPref,\n ThDockingPref,\n ThAudioPlayerComponent,\n ThAudioProgressBarVariant,\n ThAudioPublicationMetadataComponent,\n ThPublicationMetadataOrder,\n} from \"./models\";\nimport { AudioContentProtectionConfig } from \"./models/protection\";\nimport {\n ActionKey,\n ThShortcutsPref\n } from \"./preferences\";\nimport { validateObjectKeys } from \"./helpers\";\n\nexport type AudioCustomizableKeys = {\n audioAction?: string;\n audio?: string;\n theme?: string;\n};\n\nexport enum ThAudioAffordance {\n \"timeline\" = \"timeline\",\n \"readingOrder\" = \"readingOrder\",\n \"toc\" = \"toc\"\n};\n\nexport type ThAudioThemeKeys = ThThemeKeys.light | ThThemeKeys.dark;\n\nexport type ThAudioThemeKey<K extends AudioCustomizableKeys = {}> =\n K extends { theme: infer T }\n ? T extends string\n ? ThAudioThemeKeys | T\n : ThAudioThemeKeys\n : ThAudioThemeKeys;\n\nexport type AudioDefaultKeys = {\n audioAction: ThAudioActionKeys;\n theme: ThAudioThemeKeys;\n};\n\nexport type AudioSettingsKey<K extends AudioCustomizableKeys> =\n K extends { audio: infer A }\n ? A extends string\n ? ThAudioKeys | A\n : ThAudioKeys\n : ThAudioKeys;\n\ntype ThAudioSkipIntervalKeys =\n | {\n [ThAudioKeys.skipInterval]: ThSettingsRangePrefRequired;\n [ThAudioKeys.skipBackwardInterval]?: never;\n [ThAudioKeys.skipForwardInterval]?: never;\n }\n | {\n [ThAudioKeys.skipInterval]?: never;\n [ThAudioKeys.skipBackwardInterval]: ThSettingsRangePrefRequired;\n [ThAudioKeys.skipForwardInterval]: ThSettingsRangePrefRequired;\n };\n\nexport type ThAudioKeyTypes<K extends AudioCustomizableKeys = AudioDefaultKeys> = {\n [ThAudioKeys.volume]: ThSettingsRangePrefRequired;\n [ThAudioKeys.playbackRate]: ThSettingsRangePrefRequired;\n [ThAudioKeys.sleepTimer]: ThSettingsTimerPref;\n} & ThAudioSkipIntervalKeys & (\n K extends { audio: infer A }\n ? A extends string\n ? { [key in A]: ThSettingsRangePrefRequired }\n : {}\n : {}\n);\n\n// Key type for extensible audio primary/secondary actions\n\nexport type ThAudioActionKey<K extends AudioCustomizableKeys = {}> =\n K extends { audioAction: infer A }\n ? A extends string\n ? ThAudioActionKeys | A\n : ThAudioActionKeys\n : ThAudioActionKeys;\n\n// Actions preference\n\n/**\n * Primary zone (media controls bar). Components resolved via the plugin\n * registry's primaryAudioActions. No ThActionsTokens, no visibility.\n * Volume and playback rate are primary-only.\n *\n * Secondary zone (header collapsible bar). Keys resolved via the plugin\n * registry's actionsComponentsMap. Visibility applies here (collapse).\n * Compatible with CollapsiblePref.\n */\nexport interface ThAudioActionsPref<K extends AudioCustomizableKeys = {}> {\n primary: {\n displayOrder: Array<ThAudioActionKey<K>>;\n keys: Record<string, ThAudioActionsTokens>;\n };\n secondary: {\n displayOrder: Array<ActionKey<{ action: ThAudioActionKey<K> }> | ThAudioActionKey<K>>;\n collapse: ThCollapsibility;\n keys: Record<string, ThActionsTokens>;\n };\n}\n\n// Main audio preferences\n\nexport type ThAudioConstraintKeys = Extract<ThSheetTypes, ThSheetTypes.bottomSheet | ThSheetTypes.popover | ThSheetTypes.modal> | \"cover\";\n\nexport interface ThAudioPreferences<K extends AudioCustomizableKeys = {}> {\n theming: {\n header?: {\n backLink?: ThBackLinkPref | null;\n };\n icon: {\n size: number;\n tooltipOffset: number;\n tooltipDelay?: number;\n };\n layout: {\n compact: {\n /** Ordered list of player components in the single-column layout. */\n order: Array<ThAudioPlayerComponent>;\n };\n expanded: {\n /** Components in the inline-start column of the two-column layout. */\n start: Array<ThAudioPlayerComponent>;\n /** Components in the inline-end column of the two-column layout. */\n end: Array<ThAudioPlayerComponent>;\n };\n publicationMetadata: {\n /** Ordered list of metadata components (title, subtitle, authors). */\n order: ThPublicationMetadataOrder;\n };\n radius: number;\n spacing: number;\n progressBar?: {\n variant?: ThAudioProgressBarVariant;\n };\n defaults: {\n dockingWidth: number;\n scrim: string;\n };\n constraints?: {\n [key in ThAudioConstraintKeys]?: number | null;\n };\n };\n breakpoints: BreakpointsMap<number | null>;\n themes: {\n audioOrder: Array<ThAudioThemeKey<K> | \"auto\">;\n systemThemes?: {\n light: ThAudioThemeKey<K>;\n dark: ThAudioThemeKey<K>;\n };\n keys: Record<Exclude<ThAudioThemeKey<K>, \"auto\"> & string, ThemeTokens>;\n };\n };\n\n actions: ThAudioActionsPref<K>;\n\n settings: {\n order: Array<AudioSettingsKey<K>>;\n keys: ThAudioKeyTypes<K>;\n };\n\n contentProtection?: AudioContentProtectionConfig;\n\n affordances: {\n previous: ThAudioAffordance;\n next: ThAudioAffordance;\n };\n\n shortcuts: ThShortcutsPref;\n\n docking: ThDockingPref<ThDockingKeys>;\n}\n\n// Validation \n\nconst validateRangePresets = (pref: ThSettingsRangePrefRequired, context: string): void => {\n if (pref.variant !== ThSettingsRangeVariant.sliderWithPresets || !pref.presets?.length) return;\n const [min, max] = [Math.min(...pref.range), Math.max(...pref.range)];\n const step = pref.step;\n const tolerance = step * 1e-9;\n const invalid = pref.presets.filter(p => {\n if (p < min || p > max) return true;\n const offset = (p - min) / step;\n return Math.abs(offset - Math.round(offset)) > tolerance;\n });\n if (invalid.length > 0) {\n console.warn(\n `${ context }: presets [${ invalid.join(\", \") }] are not reachable with range=[${ min }, ${ max }] and step=${ step }.`\n );\n }\n};\n\nexport const createAudioPreferences = <K extends AudioCustomizableKeys = {}>(\n params: ThAudioPreferences<K>\n): ThAudioPreferences<K> => {\n // Validate secondary action keys\n if (params.actions?.secondary) {\n validateObjectKeys<string, ThActionsTokens>(\n [params.actions.secondary.displayOrder as string[]],\n params.actions.secondary.keys as Record<string, ThActionsTokens>,\n \"actions.secondary\"\n );\n }\n\n // Validate audio skip interval mutual exclusivity\n if (params.settings?.order) {\n const order = params.settings.order as string[];\n const hasSkipInterval = order.includes(ThAudioKeys.skipInterval);\n const hasSplitIntervals =\n order.includes(ThAudioKeys.skipBackwardInterval) ||\n order.includes(ThAudioKeys.skipForwardInterval);\n if (hasSkipInterval && hasSplitIntervals) {\n console.warn(\n `settings.order contains both \"${ ThAudioKeys.skipInterval }\" and split interval keys. Use one or the other.`\n );\n }\n }\n\n // Validate theme keys\n if (params.theming?.themes) {\n validateObjectKeys<ThAudioThemeKey<K> | \"auto\", ThemeTokens>(\n [params.theming.themes.audioOrder as Array<ThAudioThemeKey<K> | \"auto\">],\n params.theming.themes.keys as Record<string, ThemeTokens>,\n \"theming.themes\",\n \"auto\"\n );\n }\n\n // Validate publicationMetadata order - ensure only one title variant\n if (params.theming?.layout?.publicationMetadata?.order) {\n const order = params.theming.layout.publicationMetadata.order;\n const titleVariants: ThAudioPublicationMetadataComponent[] = [\n ThAudioPublicationMetadataComponent.title,\n ThAudioPublicationMetadataComponent.titleWithSubtitle,\n ThAudioPublicationMetadataComponent.subtitleWithTitle\n ];\n\n const titleVariantsInOrder = order.filter((c: ThAudioPublicationMetadataComponent) => titleVariants.includes(c));\n if (titleVariantsInOrder.length > 1) {\n console.warn(\n `publicationMetadata.order contains multiple title variants [${ titleVariantsInOrder.join(\", \") }]. Using first one only.`\n );\n const firstTitleIndex = order.findIndex((c: ThAudioPublicationMetadataComponent) => titleVariants.includes(c));\n params.theming.layout.publicationMetadata.order = order.filter((component: ThAudioPublicationMetadataComponent, index: number) => {\n if (component === ThAudioPublicationMetadataComponent.authors) return true;\n return index === firstTitleIndex;\n }) as ThPublicationMetadataOrder;\n }\n }\n\n // Validate range presets in settings keys\n Object.entries(params.settings?.keys ?? {}).forEach(([key, pref]) => {\n if (pref && typeof pref === \"object\" && \"variant\" in pref) {\n validateRangePresets(pref as ThSettingsRangePrefRequired, `settings.keys.${ key }`);\n }\n });\n\n return params;\n};","import { ShortcutRepresentation } from \"@/core/Helpers/keyboardUtilities\";\nimport { ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\nimport {\n ThActionsKeys,\n ThAudioActionKeys,\n ThAudioKeys,\n ThAudioPlayerComponent,\n ThAudioProgressBarVariant,\n ThAudioPublicationMetadataComponent,\n ThBreakpoints,\n ThDockingTypes,\n ThDockingKeys,\n ThSheetTypes,\n ThThemeKeys,\n ThBackLinkVariant,\n lightTheme,\n darkTheme,\n defaultSettingsAction,\n defaultAudioVolumeAction,\n defaultAudioPlaybackRateAction,\n defaultAudioTocAction,\n defaultAudioSleepTimerAction,\n defaultAudioRemotePlaybackAction,\n defaultAudioContentProtectionConfig,\n defaultAudioVolume,\n defaultAudioPlaybackRate,\n defaultAudioSkipBackwardInterval,\n defaultAudioSkipForwardInterval,\n defaultAudioSleepTimer\n} from \"./models\";\nimport { createAudioPreferences, ThAudioPreferences, AudioDefaultKeys, ThAudioAffordance } from \"./audioPreferences\";\n\nexport const defaultAudioPreferences: ThAudioPreferences<AudioDefaultKeys> =\n createAudioPreferences<AudioDefaultKeys>({\n theming: {\n header: {\n backLink: {\n variant: ThBackLinkVariant.arrow,\n visibility: \"partially\",\n href: \"/\"\n }\n },\n icon: {\n size: 24,\n tooltipOffset: 10\n },\n layout: {\n compact: {\n order: [\n ThAudioPlayerComponent.cover,\n ThAudioPlayerComponent.metadata,\n ThAudioPlayerComponent.playbackControls,\n ThAudioPlayerComponent.progressBar,\n ThAudioPlayerComponent.mediaActions\n ]\n },\n expanded: {\n start: [\n ThAudioPlayerComponent.cover,\n ThAudioPlayerComponent.metadata\n ],\n end: [\n ThAudioPlayerComponent.playbackControls,\n ThAudioPlayerComponent.progressBar,\n ThAudioPlayerComponent.mediaActions\n ]\n },\n publicationMetadata: {\n order: [\n ThAudioPublicationMetadataComponent.titleWithSubtitle\n ]\n },\n radius: 5,\n spacing: 20,\n progressBar: {\n variant: ThAudioProgressBarVariant.segmented\n },\n defaults: {\n dockingWidth: 340,\n scrim: \"rgba(0, 0, 0, 0.2)\"\n },\n constraints: {\n [ThSheetTypes.bottomSheet]: 600,\n [ThSheetTypes.popover]: 600,\n [ThSheetTypes.modal]: 600,\n cover: 300,\n }\n },\n breakpoints: {\n [ThBreakpoints.compact]: 600,\n [ThBreakpoints.medium]: 840,\n [ThBreakpoints.expanded]: 1200,\n [ThBreakpoints.large]: 1600,\n [ThBreakpoints.xLarge]: null\n },\n themes: {\n audioOrder: [\n \"auto\",\n ThThemeKeys.light,\n ThThemeKeys.dark\n ],\n systemThemes: {\n light: ThThemeKeys.light,\n dark: ThThemeKeys.dark\n },\n keys: {\n [ThThemeKeys.light]: lightTheme,\n [ThThemeKeys.dark]: darkTheme\n }\n }\n },\n\n actions: {\n primary: {\n displayOrder: [\n ThAudioActionKeys.volume,\n ThAudioActionKeys.playbackRate,\n ThAudioActionKeys.toc,\n ThAudioActionKeys.sleepTimer\n ],\n keys: {\n [ThAudioActionKeys.volume]: defaultAudioVolumeAction,\n [ThAudioActionKeys.playbackRate]: defaultAudioPlaybackRateAction,\n [ThAudioActionKeys.toc]: defaultAudioTocAction,\n [ThAudioActionKeys.sleepTimer]: defaultAudioSleepTimerAction,\n }\n },\n secondary: {\n displayOrder: [\n ThAudioActionKeys.remotePlayback,\n ThActionsKeys.settings\n ],\n collapse: {\n [ThBreakpoints.compact]: 2,\n [ThBreakpoints.medium]: 3\n },\n keys: {\n [ThAudioActionKeys.remotePlayback]: defaultAudioRemotePlaybackAction,\n [ThActionsKeys.settings]: defaultSettingsAction,\n }\n }\n },\n\n settings: {\n order: [\n ThAudioKeys.theme,\n ThAudioKeys.skipBackwardInterval,\n ThAudioKeys.skipForwardInterval,\n ThAudioKeys.autoPlay\n ],\n keys: {\n [ThAudioKeys.volume]: defaultAudioVolume,\n [ThAudioKeys.playbackRate]: defaultAudioPlaybackRate,\n [ThAudioKeys.skipBackwardInterval]: defaultAudioSkipBackwardInterval,\n [ThAudioKeys.skipForwardInterval]: defaultAudioSkipForwardInterval,\n [ThAudioKeys.sleepTimer]: defaultAudioSleepTimer\n }\n },\n\n contentProtection: defaultAudioContentProtectionConfig,\n\n affordances: {\n previous: ThAudioAffordance.toc,\n next: ThAudioAffordance.toc\n },\n\n shortcuts: {\n representation: ShortcutRepresentation.symbol,\n joiner: \"+\",\n displayIn: [\"tooltip\", \"menuItem\"]\n },\n\n docking: {\n displayOrder: [\n ThDockingKeys.transient,\n ThDockingKeys.start,\n ThDockingKeys.end\n ],\n // Only toc is dockable; others have dockable:none so dock panels are TOC-only\n // Matches EPUB config: no docking on compact/medium (mobile/tablet portrait)\n dock: {\n [ThBreakpoints.compact]: ThDockingTypes.none,\n [ThBreakpoints.medium]: ThDockingTypes.none,\n [ThBreakpoints.expanded]: ThDockingTypes.start,\n [ThBreakpoints.large]: ThDockingTypes.both,\n [ThBreakpoints.xLarge]: ThDockingTypes.both\n },\n collapse: true,\n keys: {\n [ThDockingKeys.start]: { \n visibility: ThCollapsibilityVisibility.overflow, \n shortcut: null \n },\n [ThDockingKeys.end]: { \n visibility: ThCollapsibilityVisibility.overflow, \n shortcut: null \n },\n [ThDockingKeys.transient]: { \n visibility: ThCollapsibilityVisibility.overflow, \n shortcut: null \n }\n }\n }\n });\n","\"use client\";\n\nimport { createContext } from \"react\";\nimport { defaultAudioPreferences } from \"./defaultAudioPreferences\";\nimport { ThAudioPreferences, AudioCustomizableKeys, AudioDefaultKeys } from \"./audioPreferences\";\n\nexport interface AudioPreferencesContextValue<K extends AudioCustomizableKeys = AudioDefaultKeys> {\n preferences: ThAudioPreferences<K>;\n updatePreferences: (prefs: ThAudioPreferences<K>) => void;\n}\n\nexport const ThAudioPreferencesContext = createContext<AudioPreferencesContextValue<any> | null>(null);\n\nexport const defaultAudioPreferencesContextValue: AudioPreferencesContextValue<AudioDefaultKeys> = {\n preferences: defaultAudioPreferences as ThAudioPreferences<AudioDefaultKeys>,\n updatePreferences: () => {\n throw new Error(\"updatePreferences must be used within a ThAudioPreferencesProvider\");\n },\n};\n","import { ThAudioPreferences, AudioCustomizableKeys } from \"../audioPreferences\";\nimport { ThAudioPreferencesAdapter } from \"./ThAudioPreferencesAdapter\";\n\nexport class ThAudioMemoryPreferencesAdapter<T extends AudioCustomizableKeys = AudioCustomizableKeys> implements ThAudioPreferencesAdapter<T> {\n private currentPreferences: ThAudioPreferences<T>;\n private listeners: Set<(prefs: ThAudioPreferences<T>) => void> = new Set();\n\n constructor(initialPreferences: ThAudioPreferences<T>) {\n this.currentPreferences = { ...initialPreferences };\n }\n\n public getPreferences(): ThAudioPreferences<T> {\n return { ...this.currentPreferences };\n }\n\n public setPreferences(prefs: ThAudioPreferences<T>): void {\n this.currentPreferences = { ...prefs };\n this.notifyListeners(this.currentPreferences);\n }\n\n public subscribe(listener: (prefs: ThAudioPreferences<T>) => void): void {\n this.listeners.add(listener);\n }\n\n public unsubscribe(listener: (prefs: ThAudioPreferences<T>) => void): void {\n this.listeners.delete(listener);\n }\n\n private notifyListeners(prefs: ThAudioPreferences<T>): void {\n this.listeners.forEach(listener => listener({ ...prefs }));\n }\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { ThAudioPreferences, AudioCustomizableKeys, AudioDefaultKeys } from \"./audioPreferences\";\nimport {\n ThAudioPreferencesContext,\n defaultAudioPreferencesContextValue,\n} from \"./ThAudioPreferencesContext\";\n\nimport { ThAudioMemoryPreferencesAdapter } from \"./adapters/ThAudioMemoryPreferencesAdapter\";\nimport { ThAudioPreferencesAdapter } from \"./adapters/ThAudioPreferencesAdapter\";\nimport { devContentProtectionConfig } from \"./models/protection\";\n\ntype Props<K extends AudioCustomizableKeys = AudioDefaultKeys> = {\n adapter?: ThAudioPreferencesAdapter<K>;\n initialPreferences?: ThAudioPreferences<K>;\n devMode?: boolean;\n children: React.ReactNode;\n};\n\nexport function ThAudioPreferencesProvider<K extends AudioCustomizableKeys = AudioDefaultKeys>({\n adapter,\n initialPreferences,\n devMode,\n children,\n}: Props<K>) {\n const effectiveAdapter = useMemo(() => {\n let fallback = defaultAudioPreferencesContextValue.preferences as ThAudioPreferences<K>;\n if (devMode && !initialPreferences) {\n fallback = { ...fallback, contentProtection: devContentProtectionConfig };\n }\n return adapter || new ThAudioMemoryPreferencesAdapter<K>(\n (initialPreferences as ThAudioPreferences<K>) || fallback\n );\n }, [adapter, initialPreferences, devMode]);\n\n const [preferences, setPreferences] = useState<ThAudioPreferences<K>>(\n (() => {\n let fallback = defaultAudioPreferencesContextValue.preferences as ThAudioPreferences<K>;\n if (devMode && !initialPreferences) {\n fallback = { ...fallback, contentProtection: devContentProtectionConfig };\n }\n return (initialPreferences as ThAudioPreferences<K>) || fallback;\n })()\n );\n\n const handlePreferenceChange = useCallback((newPrefs: ThAudioPreferences<K>) => {\n setPreferences(prev =>\n JSON.stringify(prev) === JSON.stringify(newPrefs) ? prev : newPrefs\n );\n }, []);\n\n useEffect(() => {\n effectiveAdapter.subscribe(handlePreferenceChange);\n return () => {\n effectiveAdapter.unsubscribe(handlePreferenceChange);\n };\n }, [effectiveAdapter, handlePreferenceChange]);\n\n const contextValue = useMemo(() => ({\n preferences,\n updatePreferences: (newPrefs: ThAudioPreferences<K>) => {\n effectiveAdapter.setPreferences(newPrefs);\n },\n }), [preferences, effectiveAdapter]);\n\n return (\n <ThAudioPreferencesContext.Provider value={ contextValue }>\n { children }\n </ThAudioPreferencesContext.Provider>\n );\n}\n","import { ShortcutRepresentation } from \"@/core/Helpers/keyboardUtilities\";\nimport { BreakpointsMap } from \"@/core/Hooks/useBreakpoints\";\nimport { ThemeTokens } from \"@/preferences/hooks/useTheming\";\nimport {\n ThActionsKeys,\n ThDocumentTitleFormat,\n ThDockingKeys,\n ThLayoutUI,\n ThLineHeightOptions,\n ThProgressionFormat,\n ThRunningHeadFormat,\n ThSettingsKeys,\n ThSheetTypes,\n ThTextSettingsKeys,\n ThSpacingSettingsKeys,\n ThThemeKeys,\n ThSpacingPresetKeys,\n ThActionsTokens,\n ThFontFamilyPref,\n ThSettingsRangePrefRequired,\n ThSettingsRangeVariant,\n ThSettingsRadioPref,\n I18nValue,\n ThBackLinkPref,\n ThFormatPref,\n ThPaginatedAffordancePref,\n ThDockingPref,\n ThSettingsGroupPref,\n ValidatedLanguageCollection,\n} from \"./models\";\nimport { ExperimentKey } from \"@readium/navigator\";\nimport { ThCollapsibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\nimport { ContentProtectionConfig } from \"./models/protection\";\nimport { validateObjectKeys } from \"./helpers\";\n\nexport type CustomizableKeys = {\n action?: string;\n theme?: string;\n settings?: string;\n text?: string;\n spacing?: string;\n};\n\n// Default internal keys alias for convenience\nexport type DefaultKeys = {\n action: ThActionsKeys;\n theme: ThThemeKeys;\n settings: ThSettingsKeys;\n text: ThTextSettingsKeys;\n spacing: ThSpacingSettingsKeys;\n};\n\n// Key types to better handle custom keys for external consumers\nexport type ActionKey<K extends CustomizableKeys> =\n K extends { action: infer A }\n ? A extends string\n ? ThActionsKeys | A\n : ThActionsKeys\n : ThActionsKeys;\n\nexport type ThemeKey<K extends CustomizableKeys> =\n K extends { theme: infer T } \n ? T extends string \n ? ThThemeKeys | T \n : ThThemeKeys\n : ThThemeKeys;\n\nexport type SettingsKey<K extends CustomizableKeys> = \n K extends { settings: infer S } \n ? S extends string \n ? ThSettingsKeys | S \n : ThSettingsKeys\n : ThSettingsKeys;\n\nexport type TextSettingsKey<K extends CustomizableKeys> = \n K extends { text: infer T } \n ? T extends string \n ? ThTextSettingsKeys | T \n : ThTextSettingsKeys\n : ThTextSettingsKeys;\n\nexport type SpacingSettingsKey<K extends CustomizableKeys> = \n K extends { spacing: infer S } \n ? S extends string \n ? ThSpacingSettingsKeys | S \n : ThSpacingSettingsKeys\n : ThSpacingSettingsKeys;\n\n\nexport interface ThSettingsSpacingPresets<K extends CustomizableKeys = DefaultKeys> {\n reflowOrder: Array<ThSpacingPresetKeys>;\n webPubOrder: Array<ThSpacingPresetKeys>;\n // Not customizable as the component is static radiogroup (icons), unlike themes\n // Publisher and custom are not included as they are special cases\n keys: {\n [key in Exclude<ThSpacingPresetKeys, \"publisher\" | \"custom\">]?: ThSpacingPreset<K>;\n };\n}\n\nexport type ThSpacingPreset<K extends CustomizableKeys = DefaultKeys> = {\n [ThSpacingSettingsKeys.letterSpacing]?: number;\n [ThSpacingSettingsKeys.lineHeight]?: ThLineHeightOptions;\n [ThSpacingSettingsKeys.paragraphIndent]?: number;\n [ThSpacingSettingsKeys.paragraphSpacing]?: number;\n [ThSpacingSettingsKeys.wordSpacing]?: number;\n} & (K extends { spacing: infer S } \n ? S extends string \n ? { [key in S]?: number | ThLineHeightOptions }\n : {}\n : {});\n\nexport interface ThActionsPref<K extends CustomizableKeys> {\n reflowOrder: Array<ActionKey<K>>;\n fxlOrder: Array<ActionKey<K>>;\n webPubOrder: Array<ActionKey<K>>;\n collapse: ThCollapsibility;\n keys: Record<ActionKey<K>, ThActionsTokens>;\n};\n\nexport type ThSettingsKeyTypes<K extends CustomizableKeys = DefaultKeys> = {\n [ThSettingsKeys.fontFamily]: ThFontFamilyPref;\n [ThSettingsKeys.letterSpacing]: ThSettingsRangePrefRequired;\n [ThSettingsKeys.lineHeight]: ThSettingsRadioPref<Exclude<ThLineHeightOptions, ThLineHeightOptions.publisher>>;\n [ThSettingsKeys.paragraphIndent]: ThSettingsRangePrefRequired;\n [ThSettingsKeys.paragraphSpacing]: ThSettingsRangePrefRequired;\n [ThSettingsKeys.wordSpacing]: ThSettingsRangePrefRequired;\n [ThSettingsKeys.zoom]: ThSettingsRangePrefRequired;\n} & (\n K extends { settings: infer S } \n ? S extends string \n ? { [key in S]: any }\n : {}\n : {}\n);\n\nexport type ThConstraintKeys = Extract<ThSheetTypes, ThSheetTypes.bottomSheet | ThSheetTypes.popover | ThSheetTypes.modal> | \"pagination\" | \"dropdown\";\n\nexport type ThShortcutsDisplayIn = \"tooltip\" | \"menuItem\";\n\nexport interface ThShortcutsPref {\n representation: ShortcutRepresentation;\n joiner?: string;\n displayIn?: ThShortcutsDisplayIn[];\n}\n\nexport interface ThIconPref {\n size: number;\n tooltipOffset: number;\n tooltipDelay?: number;\n}\n\nexport interface ThLayoutDefaultsPref {\n dockingWidth: number;\n scrim: string;\n}\n\n// Main preferences interface with simplified generics\nexport interface ThPreferences<K extends CustomizableKeys = {}> {\n experiments?: {\n reflow?: Array<ExperimentKey>;\n webPub?: Array<ExperimentKey>;\n };\n metadata?: {\n documentTitle?: {\n // TODO – Templating of custom\n format: I18nValue<ThDocumentTitleFormat>;\n };\n };\n typography: {\n minimalLineLength?: number | null;\n maximalLineLength?: number | null;\n optimalLineLength: number;\n pageGutter: number;\n };\n theming: {\n header?: {\n backLink?: ThBackLinkPref | null;\n runningHead?: {\n format?: {\n reflow?: ThFormatPref<ThRunningHeadFormat>;\n fxl?: ThFormatPref<ThRunningHeadFormat>;\n webPub?: ThFormatPref<ThRunningHeadFormat>;\n }\n }\n };\n progression?: {\n format?: {\n reflow?: ThFormatPref<ThProgressionFormat | Array<ThProgressionFormat>>;\n fxl?: ThFormatPref<ThProgressionFormat | Array<ThProgressionFormat>>;\n webPub?: ThFormatPref<ThProgressionFormat | Array<ThProgressionFormat>>;\n };\n };\n arrow: {\n size: number;\n offset: number;\n tooltipDelay?: number;\n };\n icon: ThIconPref;\n layout: {\n ui?: {\n reflow?: ThLayoutUI,\n fxl?: ThLayoutUI,\n webPub?: ThLayoutUI,\n };\n radius: number;\n spacing: number;\n defaults: ThLayoutDefaultsPref;\n constraints?: {\n [key in ThConstraintKeys]?: number | null\n }\n };\n breakpoints: BreakpointsMap<number | null>;\n themes: {\n reflowOrder: Array<ThemeKey<K> | \"auto\">;\n fxlOrder: Array<ThemeKey<K> | \"auto\">;\n systemThemes?: {\n light: ThemeKey<K>;\n dark: ThemeKey<K>;\n };\n // keys never includes \"auto\"\n keys: Record<Exclude<ThemeKey<K>, \"auto\"> & string, ThemeTokens>;\n };\n };\n contentProtection?: ContentProtectionConfig;\n affordances: {\n scroll: {\n hintInImmersive: boolean;\n toggleOnMiddlePointer: Array<\"tap\" | \"click\">;\n hideOnForwardScroll: boolean;\n showOnBackwardScroll: boolean;\n },\n paginated: {\n reflow: ThPaginatedAffordancePref;\n fxl: ThPaginatedAffordancePref;\n }\n };\n actions: ThActionsPref<K>;\n shortcuts: ThShortcutsPref;\n docking: ThDockingPref<ThDockingKeys>;\n settings: {\n reflowOrder: Array<SettingsKey<K>>;\n fxlOrder: Array<SettingsKey<K>>;\n webPubOrder: Array<SettingsKey<K>>;\n keys: ThSettingsKeyTypes<K>;\n text: ThSettingsGroupPref<TextSettingsKey<K>>;\n spacing: ThSettingsGroupPref<SpacingSettingsKey<K>> & { presets?: ThSettingsSpacingPresets<K> };\n };\n}\n\n/**\n * Creates a new preferences object with the provided parameters\n * @param params The preferences object to create\n * @returns A new preferences object\n */\nexport const createPreferences = <K extends CustomizableKeys = {}>(\n params: ThPreferences<K>\n): ThPreferences<K> => {\n // Validate actions\n if (params.actions) {\n validateObjectKeys<ActionKey<K>, ThActionsTokens>(\n [\n params.actions.reflowOrder as Array<ActionKey<K>>,\n params.actions.fxlOrder as Array<ActionKey<K>>,\n params.actions.webPubOrder as Array<ActionKey<K>>,\n ],\n params.actions.keys as Record<string, ThActionsTokens>,\n \"actions\"\n );\n }\n\n // Validate themes\n if (params.theming?.themes) {\n validateObjectKeys<ThemeKey<K> | \"auto\", ThemeTokens>(\n [params.theming.themes.reflowOrder as Array<ThemeKey<K> | \"auto\">, params.theming.themes.fxlOrder as Array<ThemeKey<K> | \"auto\">],\n params.theming.themes.keys as Record<string, ThemeTokens>,\n \"theming.themes\",\n \"auto\" // Special case for themes\n );\n }\n\n // Validate spacing presets\n if (params.settings.spacing?.presets) {\n validateObjectKeys<ThSpacingPresetKeys, ThSpacingPreset<K>>(\n [params.settings.spacing.presets.reflowOrder],\n params.settings.spacing.presets.keys as Record<string, ThSpacingPreset<K>>,\n \"settings.spacing.presets\",\n [\"publisher\", \"custom\"]\n );\n }\n\n // Validate spacing values in theming against settings\n if (params.settings?.spacing?.presets?.keys && params.settings?.keys) {\n const spacingSettings = params.settings.spacing.presets.keys;\n const spacingThemes = params.settings.spacing.presets.keys;\n \n // Helper function to adjust a value to the nearest valid step or range boundary\n const adjustSpacingValue = (key: string, value: number, context: string[]): number => {\n // Type-safe way to get the setting\n const settingKey = Object.values(ThSettingsKeys).find((k) => k === key);\n if (!settingKey) {\n return value; // Return as-is if no setting found\n }\n \n const setting = (spacingSettings as any)[settingKey];\n if (!setting) {\n return value; // Return as-is if no setting found\n }\n \n // Handle different setting types\n let range: [number, number] | undefined;\n let step: number | undefined;\n \n if (setting && typeof setting === \"object\" && \"range\" in setting) {\n range = setting.range;\n step = setting.step;\n } else if (setting && typeof setting === \"object\") {\n // Handle nested settings (like lineHeight and margin)\n // These will be validated when their parent key is validated\n return value;\n }\n \n let adjustedValue = value;\n \n // Adjust to range boundaries if needed\n if (range) {\n const [min, max] = range;\n if (adjustedValue < min) {\n console.warn(`Adjusting value ${ value } for ${ context.join(\".\") } to minimum allowed value ${ min }`);\n adjustedValue = min;\n } else if (adjustedValue > max) {\n console.warn(`Adjusting value ${ value } for ${ context.join(\".\") } to maximum allowed value ${ max }`);\n adjustedValue = max;\n }\n }\n \n // Adjust to nearest step if needed\n if (step && range) {\n const [min] = range;\n const steps = Math.round((adjustedValue - min) / step);\n const steppedValue = parseFloat((min + (steps * step)).toFixed(10));\n \n // Ensure the stepped value is within range (in case of floating point precision issues)\n const finalValue = Math.min(Math.max(steppedValue, range[0]), range[1]);\n \n if (Math.abs(finalValue - adjustedValue) > Number.EPSILON) {\n console.warn(`Adjusting value ${ value } for ${ context.join(\".\") } to nearest step value ${ finalValue }`);\n adjustedValue = finalValue;\n }\n }\n \n return adjustedValue;\n };\n \n // Process each spacing theme to adjust values to valid steps/ranges\n for (const [themeName, spacingTheme] of Object.entries(spacingThemes)) {\n if (spacingTheme && typeof spacingTheme === \"object\") {\n const adjustedTheme: Record<string, any> = {};\n let hasAdjustedValues = false;\n \n // Process each value in the theme\n for (const [key, value] of Object.entries(spacingTheme)) {\n if (typeof value === \"number\") {\n const context = [\"theming\", \"spacing\", \"keys\", themeName, key];\n const adjustedValue = adjustSpacingValue(key, value, context);\n adjustedTheme[key] = adjustedValue;\n \n if (adjustedValue !== value) {\n hasAdjustedValues = true;\n }\n } else {\n // Keep non-number values as-is\n adjustedTheme[key] = value;\n }\n }\n \n // Replace the theme with adjusted values if any changes were made\n if (hasAdjustedValues) {\n // @ts-ignore - We know spacingThemes[themeName] is mutable\n spacingThemes[themeName as keyof typeof spacingThemes] = adjustedTheme;\n }\n }\n }\n }\n \n // Validate font family preferences for language conflicts\n if (params.settings?.keys?.fontFamily) {\n const fontFamilyPref = params.settings.keys.fontFamily;\n const languageMap = new Map<string, string[]>();\n \n // Build a map of languages to the collections that support them\n Object.entries(fontFamilyPref).forEach(([collectionName, collectionData]) => {\n if (collectionName === \"default\") return;\n \n // Check if this collection has supportedLanguages (it's a ValidatedLanguageCollection)\n const supportedLangs = \"supportedLanguages\" in collectionData ? \n (collectionData as ValidatedLanguageCollection).supportedLanguages : null;\n \n if (supportedLangs && Array.isArray(supportedLangs)) {\n supportedLangs.forEach((lang: string) => {\n if (!languageMap.has(lang)) {\n languageMap.set(lang, []);\n }\n languageMap.get(lang)!.push(collectionName);\n });\n }\n });\n \n // Check for conflicts and warn about them\n languageMap.forEach((collections, language) => {\n if (collections.length > 1) {\n console.warn(`Language \"${ language }\" is supported by multiple font collections: ${ collections.join(\", \") }. This may cause ambiguous font selection. Consider consolidating to a single collection per language.`);\n }\n });\n }\n\n // Validate sliderWithPresets presets are reachable given range and step\n const validateRangePresets = (pref: ThSettingsRangePrefRequired, context: string): void => {\n if (pref.variant !== ThSettingsRangeVariant.sliderWithPresets || !pref.presets?.length) return;\n const [min, max] = [Math.min(...pref.range), Math.max(...pref.range)];\n const step = pref.step;\n const tolerance = step * 1e-9;\n const invalid = pref.presets.filter(p => {\n if (p < min || p > max) return true;\n const offset = (p - min) / step;\n return Math.abs(offset - Math.round(offset)) > tolerance;\n });\n if (invalid.length > 0) {\n console.warn(`${ context }: presets [${ invalid.join(\", \") }] are not reachable with range=[${ min }, ${ max }] and step=${ step }.`);\n }\n };\n\n Object.entries(params.settings?.keys ?? {}).forEach(([key, pref]) => {\n if (pref && typeof pref === \"object\" && \"variant\" in pref) {\n validateRangePresets(pref as ThSettingsRangePrefRequired, `settings.keys.${ key }`);\n }\n });\n\n return params;\n};\n\n// Type helpers that support both custom and default keys\nexport type ActionKeyType<K extends CustomizableKeys = DefaultKeys> = K[\"action\"] extends string ? K[\"action\"] : ThActionsKeys;\nexport type ThemeKeyType<K extends CustomizableKeys = DefaultKeys> = K[\"theme\"] extends string ? K[\"theme\"] : ThThemeKeys;\nexport type SettingsKeyType<K extends CustomizableKeys = DefaultKeys> = K[\"settings\"] extends string ? K[\"settings\"] : ThSettingsKeys;\nexport type TextSettingsKeyType<K extends CustomizableKeys = DefaultKeys> = K[\"text\"] extends string ? K[\"text\"] : ThTextSettingsKeys;\nexport type SpacingSettingsKeyType<K extends CustomizableKeys = DefaultKeys> = K[\"spacing\"] extends string ? K[\"spacing\"] : ThSpacingSettingsKeys;","import { ShortcutRepresentation } from \"@/core/Helpers/keyboardUtilities\";\nimport { ThCollapsibilityVisibility } from \"@/core/Components/Actions/hooks/useCollapsibility\";\nimport {\n ThActionsKeys,\n ThBreakpoints,\n ThDockingTypes,\n ThDockingKeys,\n ThSettingsKeys,\n ThSheetTypes,\n ThThemeKeys,\n ThSheetHeaderVariant,\n ThLayoutUI,\n ThBackLinkVariant,\n ThProgressionFormat,\n ThRunningHeadFormat,\n ThDocumentTitleFormat,\n ThArrowVariant,\n lightTheme,\n darkTheme,\n paperTheme,\n sepiaTheme,\n contrast1Theme,\n contrast2Theme,\n contrast3Theme,\n defaultSettingsAction,\n defaultFullscreenAction,\n defaultTocAction,\n defaultJumpToPositionAction,\n defaultContentProtectionConfig,\n defaultFontCollection,\n defaultLetterSpacing,\n defaultLineHeights,\n defaultParagraphIndent,\n defaultParagraphSpacing,\n defaultSpacingPresets,\n defaultSpacingPresetsOrder,\n defaultSpacingSettingsMain,\n defaultSpacingSettingsSubpanel,\n defaultTextSettingsMain,\n defaultTextSettingsSubpanel,\n defaultWordSpacing,\n defaultZoom,\n // Language-specific font collections\n arabicFarsiCollection,\n chineseSimplifiedCollection,\n chineseTraditionalCollection,\n hebrewCollection,\n japaneseCollection,\n japaneseVerticalCollection,\n koreanCollection,\n tamilCollection,\n} from \"./models\";\nimport { createPreferences, ThPreferences, DefaultKeys } from \"./preferences\";\n\nexport const defaultPreferences: ThPreferences<DefaultKeys> = createPreferences<DefaultKeys>({\n// direction: ThLayoutDirection.ltr,\n// locale: \"en\",\n experiments: {\n reflow: [\"experimentalHeaderFiltering\", \"experimentalZoom\"],\n webPub: [\"experimentalHeaderFiltering\", \"experimentalZoom\"]\n },\n metadata: {\n documentTitle: {\n format: ThDocumentTitleFormat.title\n }\n },\n typography: {\n minimalLineLength: 40, // undefined | null | number of characters. If 2 cols will switch to 1 based on this\n optimalLineLength: 55, // number of characters. If auto layout, picks colCount based on this\n maximalLineLength: 70, // undefined | null | number of characters.\n pageGutter: 20\n },\n theming: {\n header: {\n backLink: {\n variant: ThBackLinkVariant.arrow,\n visibility: \"partially\",\n href: \"/\"\n },\n runningHead: {\n format: {\n reflow: {\n default: {\n variants: ThRunningHeadFormat.chapter,\n displayInImmersive: true,\n displayInFullscreen: false\n },\n breakpoints: {\n [ThBreakpoints.compact]: {\n variants: ThRunningHeadFormat.chapter,\n displayInImmersive: false,\n displayInFullscreen: false\n }\n }\n },\n fxl: {\n default: {\n variants: ThRunningHeadFormat.title,\n displayInImmersive: true,\n displayInFullscreen: true\n },\n breakpoints: {\n [ThBreakpoints.compact]: {\n variants: ThRunningHeadFormat.title,\n displayInImmersive: false,\n displayInFullscreen: true\n }\n }\n },\n webPub: {\n default: {\n variants: ThRunningHeadFormat.chapter,\n displayInImmersive: true,\n displayInFullscreen: true\n }\n }\n }\n }\n },\n progression: {\n format: {\n reflow: {\n default: {\n variants: [\n ThProgressionFormat.positionsPercentOfTotal,\n ThProgressionFormat.progressionOfResource\n ],\n displayInImmersive: true,\n displayInFullscreen: false\n },\n breakpoints: {\n [ThBreakpoints.compact]: {\n variants: [\n ThProgressionFormat.positionsOfTotal, \n ThProgressionFormat.resourceProgression\n ],\n displayInImmersive: false,\n displayInFullscreen: false\n }\n }\n },\n fxl: {\n default: {\n variants: [\n ThProgressionFormat.positionsOfTotal, \n ThProgressionFormat.overallProgression,\n ThProgressionFormat.none\n ],\n displayInImmersive: true,\n displayInFullscreen: true\n },\n breakpoints: {\n [ThBreakpoints.compact]: {\n variants: [\n ThProgressionFormat.positions, \n ThProgressionFormat.overallProgression,\n ThProgressionFormat.none\n ],\n displayInImmersive: false,\n displayInFullscreen: true\n }\n }\n },\n webPub: {\n default: {\n variants: [\n ThProgressionFormat.readingOrderIndex, \n ThProgressionFormat.none\n ],\n displayInImmersive: true,\n displayInFullscreen: true\n }\n }\n }\n },\n arrow: {\n size: 40, // Size of the left and right arrows in px\n offset: 5 // offset of the arrows from the edges in px\n },\n icon: {\n size: 24, // Size of icons in px\n tooltipOffset: 10 // offset of tooltip in px\n },\n layout: {\n ui: {\n reflow: ThLayoutUI.layered,\n fxl: ThLayoutUI.layered,\n webPub: ThLayoutUI.stacked,\n },\n radius: 5, // border-radius of containers\n spacing: 20, // padding of containers/sheets\n defaults: {\n dockingWidth: 340, // default width of resizable panels\n scrim: \"rgba(0, 0, 0, 0.2)\" // default scrim/underlay bg-color\n },\n constraints: {\n [ThSheetTypes.bottomSheet]: 600, // Max-width of all bottom sheets\n [ThSheetTypes.popover]: 600, // Max-width of all popover sheets\n [ThSheetTypes.modal]: 600, // Max-width of all modal sheets\n pagination: 1024, // Max-width of pagination component\n dropdown: 250 // Max-height of main UI dropdowns\n }\n },\n breakpoints: {\n // See https://m3.material.io/foundations/layout/applying-layout/window-size-classes\n [ThBreakpoints.compact]: 600, // Phone in portrait\n [ThBreakpoints.medium]: 840, // Tablet in portrait, Foldable in portrait (unfolded)\n [ThBreakpoints.expanded]: 1200, // Phone in landscape, Tablet in landscape, Foldable in landscape (unfolded), Desktop\n [ThBreakpoints.large]: 1600, // Desktop\n [ThBreakpoints.xLarge]: null // Desktop Ultra-wide\n },\n themes: {\n reflowOrder: [\n \"auto\", \n ThThemeKeys.light, \n ThThemeKeys.paper,\n ThThemeKeys.sepia, \n ThThemeKeys.dark, \n ThThemeKeys.contrast1, \n ThThemeKeys.contrast2, \n ThThemeKeys.contrast3\n ],\n fxlOrder: [\n \"auto\",\n ThThemeKeys.light,\n ThThemeKeys.dark\n ],\n systemThemes: {\n light: ThThemeKeys.light,\n dark: ThThemeKeys.dark\n },\n keys: {\n [ThThemeKeys.light]: lightTheme,\n [ThThemeKeys.dark]: darkTheme,\n [ThThemeKeys.paper]: paperTheme,\n [ThThemeKeys.sepia]: sepiaTheme,\n [ThThemeKeys.contrast1]: contrast1Theme,\n [ThThemeKeys.contrast2]: contrast2Theme,\n [ThThemeKeys.contrast3]: contrast3Theme\n }\n },\n },\n contentProtection: defaultContentProtectionConfig,\n affordances: { \n scroll: {\n hintInImmersive: true,\n toggleOnMiddlePointer: [\"tap\", \"click\"],\n hideOnForwardScroll: true,\n showOnBackwardScroll: true\n },\n paginated: {\n reflow: {\n default: {\n variant: ThArrowVariant.layered,\n discard: [\"navigation\"],\n hint: [\"layoutChange\"]\n },\n breakpoints: {\n [ThBreakpoints.large]: {\n variant: ThArrowVariant.stacked\n },\n [ThBreakpoints.xLarge]: {\n variant: ThArrowVariant.stacked\n }\n }\n },\n fxl: {\n // Note FXL arrows are always layered\n // FXL navigator is using the window width to calculate the layout\n // so we need to force the layered variant to prevent layout issues\n default: {\n variant: ThArrowVariant.layered,\n discard: [\"navigation\"],\n hint: \"none\"\n }\n }\n }\n },\n shortcuts: {\n representation: ShortcutRepresentation.symbol,\n joiner: \"+\",\n displayIn: [\"tooltip\", \"menuItem\"]\n },\n actions: {\n reflowOrder: [\n ThActionsKeys.settings,\n ThActionsKeys.toc,\n ThActionsKeys.fullscreen,\n ThActionsKeys.jumpToPosition\n ],\n fxlOrder: [\n ThActionsKeys.settings,\n ThActionsKeys.toc,\n ThActionsKeys.fullscreen,\n ThActionsKeys.jumpToPosition\n ],\n webPubOrder: [\n ThActionsKeys.settings,\n ThActionsKeys.toc,\n ThActionsKeys.fullscreen\n ],\n collapse: true,\n keys: {\n [ThActionsKeys.settings]: defaultSettingsAction,\n [ThActionsKeys.fullscreen]: defaultFullscreenAction,\n [ThActionsKeys.toc]: defaultTocAction,\n [ThActionsKeys.jumpToPosition]: defaultJumpToPositionAction,\n }\n },\n docking: {\n displayOrder: [\n ThDockingKeys.transient,\n ThDockingKeys.start,\n ThDockingKeys.end\n ],\n dock: {\n [ThBreakpoints.compact]: ThDockingTypes.none,\n [ThBreakpoints.medium]: ThDockingTypes.none,\n [ThBreakpoints.expanded]: ThDockingTypes.start,\n [ThBreakpoints.large]: ThDockingTypes.both,\n [ThBreakpoints.xLarge]: ThDockingTypes.both\n },\n collapse: true,\n keys: {\n [ThDockingKeys.start]: {\n visibility: ThCollapsibilityVisibility.overflow,\n shortcut: null\n },\n [ThDockingKeys.end]: {\n visibility: ThCollapsibilityVisibility.overflow,\n shortcut: null\n },\n [ThDockingKeys.transient]: {\n visibility: ThCollapsibilityVisibility.overflow,\n shortcut: null\n }\n }\n },\n settings: {\n reflowOrder: [\n ThSettingsKeys.zoom,\n ThSettingsKeys.textGroup,\n ThSettingsKeys.theme,\n ThSettingsKeys.spacingGroup,\n ThSettingsKeys.layout,\n ThSettingsKeys.columns\n ],\n fxlOrder: [\n ThSettingsKeys.theme,\n ThSettingsKeys.columns\n ],\n webPubOrder: [\n ThSettingsKeys.zoom,\n ThSettingsKeys.textGroup,\n ThSettingsKeys.spacingGroup\n ],\n keys: {\n [ThSettingsKeys.fontFamily]: {\n default: defaultFontCollection,\n arabic: { supportedLanguages: [\"ar\", \"fa\"], fonts: arabicFarsiCollection },\n hebrew: { supportedLanguages: [\"he\"], fonts: hebrewCollection },\n \"chinese-simplified\": { supportedLanguages: [\"zh\", \"zh-hans\", \"zh-cn\"], fonts: chineseSimplifiedCollection },\n \"chinese-traditional\": { supportedLanguages: [\"zh-hant\", \"zh-tw\", \"zh-hk\"], fonts: chineseTraditionalCollection },\n japanese: { supportedLanguages: [\"ja\"], fonts: japaneseCollection },\n \"japanese-vertical\": { supportedLanguages: [\"ja-v\"], fonts: japaneseVerticalCollection },\n korean: { supportedLanguages: [\"ko\"], fonts: koreanCollection },\n tamil: { supportedLanguages: [\"ta\"], fonts: tamilCollection }\n },\n [ThSettingsKeys.letterSpacing]: defaultLetterSpacing,\n [ThSettingsKeys.lineHeight]: {\n allowUnset: false,\n keys: defaultLineHeights\n },\n [ThSettingsKeys.paragraphIndent]: defaultParagraphIndent,\n [ThSettingsKeys.paragraphSpacing]: defaultParagraphSpacing,\n [ThSettingsKeys.wordSpacing]: defaultWordSpacing,\n [ThSettingsKeys.zoom]: defaultZoom\n },\n text: {\n header: ThSheetHeaderVariant.previous,\n main: defaultTextSettingsMain,\n subPanel: defaultTextSettingsSubpanel\n },\n spacing: {\n header: ThSheetHeaderVariant.previous,\n main: defaultSpacingSettingsMain,\n subPanel: defaultSpacingSettingsSubpanel,\n presets: {\n reflowOrder: defaultSpacingPresetsOrder,\n webPubOrder: defaultSpacingPresetsOrder,\n keys: defaultSpacingPresets\n }\n }\n }\n})","\"use client\";\n\nimport { createContext } from \"react\";\nimport { defaultPreferences } from \"./defaultPreferences\";\nimport { ThPreferences, DefaultKeys, CustomizableKeys } from \"./preferences\";\n\nexport interface PreferencesContextValue<K extends CustomizableKeys = DefaultKeys> {\n preferences: ThPreferences<K>;\n updatePreferences: (prefs: ThPreferences<K>) => void;\n}\n\n// Create a context with a default value that will be overridden\nexport const ThPreferencesContext = createContext<PreferencesContextValue<any> | null>(null);\n\n// Keep the default export for backward compatibility\nexport const defaultPreferencesContextValue: PreferencesContextValue<DefaultKeys> = {\n preferences: defaultPreferences as ThPreferences<DefaultKeys>,\n updatePreferences: () => {\n throw new Error(\"updatePreferences must be used within a ThPreferencesProvider with an adapter\");\n },\n};","import { ThPreferences, CustomizableKeys } from \"../preferences\";\nimport { ThPreferencesAdapter } from \"./ThPreferencesAdapter\";\n\nexport class ThMemoryPreferencesAdapter<T extends CustomizableKeys = CustomizableKeys> implements ThPreferencesAdapter<T> {\n private currentPreferences: ThPreferences<T>;\n private listeners: Set<(prefs: ThPreferences<T>) => void> = new Set();\n\n constructor(initialPreferences: ThPreferences<T>) {\n this.currentPreferences = { ...initialPreferences };\n }\n\n public getPreferences(): ThPreferences<T> {\n return { ...this.currentPreferences };\n }\n\n public setPreferences(prefs: ThPreferences<T>): void {\n this.currentPreferences = { ...prefs };\n this.notifyListeners(this.currentPreferences);\n }\n\n public subscribe(listener: (prefs: ThPreferences<T>) => void): void {\n this.listeners.add(listener);\n }\n\n public unsubscribe(listener: (prefs: ThPreferences<T>) => void): void {\n this.listeners.delete(listener);\n }\n\n private notifyListeners(prefs: ThPreferences<T>): void {\n this.listeners.forEach(listener => listener({ ...prefs }));\n }\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { ThPreferences, CustomizableKeys, DefaultKeys } from \"./preferences\";\nimport { ThPreferencesContext, defaultPreferencesContextValue } from \"./ThPreferencesContext\";\nimport { devContentProtectionConfig } from \"./models/protection\";\n\nimport { ThPreferencesAdapter } from \"./adapters/ThPreferencesAdapter\";\nimport { ThMemoryPreferencesAdapter } from \"./adapters/ThMemoryPreferencesAdapter\";\ntype Props<K extends CustomizableKeys = DefaultKeys> = {\n adapter?: ThPreferencesAdapter<K>;\n initialPreferences?: ThPreferences<K>;\n devMode?: boolean;\n children: React.ReactNode;\n};\n\nexport function ThPreferencesProvider<K extends CustomizableKeys = DefaultKeys>({ \n adapter,\n initialPreferences,\n devMode,\n children, \n}: Props<K>) {\n // Create a default in-memory adapter if none is provided\n const effectiveAdapter = useMemo(() => {\n let fallbackPreferences = defaultPreferencesContextValue.preferences as ThPreferences<K>;\n \n // Apply dev mode modifications if needed and no initial preferences provided\n if (devMode && !initialPreferences) {\n fallbackPreferences = {\n ...fallbackPreferences,\n contentProtection: devContentProtectionConfig,\n };\n }\n\n return adapter || new ThMemoryPreferencesAdapter<K>(\n (initialPreferences as ThPreferences<K>) || fallbackPreferences\n );\n }, [adapter, initialPreferences, devMode]);\n\n const [preferences, setPreferences] = useState<ThPreferences<K>>(\n (() => {\n let fallbackPreferences = defaultPreferencesContextValue.preferences as ThPreferences<K>;\n\n if (devMode && !initialPreferences) {\n fallbackPreferences = {\n ...fallbackPreferences,\n contentProtection: devContentProtectionConfig,\n };\n }\n \n return (initialPreferences as ThPreferences<K>) || fallbackPreferences;\n })()\n );\n\n // Handle preference changes\n const handlePreferenceChange = useCallback((newPrefs: ThPreferences<K>) => {\n setPreferences(prev => {\n // Only update if preferences actually changed\n return JSON.stringify(prev) === JSON.stringify(newPrefs) ? prev : newPrefs;\n });\n }, []);\n\n // Set up and clean up subscription to preference changes\n useEffect(() => {\n // Set up the subscription\n effectiveAdapter.subscribe(handlePreferenceChange);\n \n // Clean up the subscription when the component unmounts or dependencies change\n return () => {\n effectiveAdapter.unsubscribe(handlePreferenceChange);\n };\n }, [effectiveAdapter, handlePreferenceChange]);\n\n // Provide current app context typing\n const contextValue = useMemo(() => ({\n preferences,\n updatePreferences: (newPrefs: ThPreferences<K>) => {\n effectiveAdapter.setPreferences(newPrefs);\n },\n }), [preferences, effectiveAdapter]);\n\n return (\n <ThPreferencesContext.Provider value={ contextValue }>\n { children }\n </ThPreferencesContext.Provider>\n );\n}","\"use client\";\n\nimport { useContext, useMemo } from \"react\";\nimport { ThActionsTokens, ThAudioActionsTokens, ThDockingKeys, ThDockingPref } from \"../models\";\nimport { ThAudioPreferencesContext } from \"../ThAudioPreferencesContext\";\nimport { ThPreferencesContext } from \"../ThPreferencesContext\";\n\nexport interface ActionsPreferences {\n docking: ThDockingPref<ThDockingKeys>;\n actionsKeys: Record<string, ThActionsTokens | ThAudioActionsTokens>;\n}\n\nexport interface AudioActionsPreferences {\n docking: ThDockingPref<ThDockingKeys>;\n primaryActionsKeys: Record<string, ThAudioActionsTokens>;\n secondaryActionsKeys: Record<string, ThActionsTokens>;\n primaryDisplayOrder: string[];\n secondaryDisplayOrder: string[];\n}\n\n/**\n * Context-agnostic hook for docking/actions infrastructure.\n * Resolves preferences from the audio context when available,\n * falling back to the reader context. This allows shared\n * components (docking, action containers) to work in both.\n */\nexport const useActionsPreferences = (): ActionsPreferences => {\n const audioCtx = useContext(ThAudioPreferencesContext);\n const readerCtx = useContext(ThPreferencesContext);\n\n const audioPrimaryKeys = audioCtx?.preferences.actions.primary.keys;\n const audioSecondaryKeys = audioCtx?.preferences.actions.secondary.keys;\n const audioDocking = audioCtx?.preferences.docking;\n\n const audioActionsKeys = useMemo(() => {\n if (!audioPrimaryKeys && !audioSecondaryKeys) return null;\n return { ...audioPrimaryKeys, ...audioSecondaryKeys };\n }, [audioPrimaryKeys, audioSecondaryKeys]);\n\n const audioResult = useMemo(() => {\n if (!audioCtx || !audioActionsKeys || !audioDocking) return null;\n return { docking: audioDocking, actionsKeys: audioActionsKeys };\n }, [audioCtx, audioDocking, audioActionsKeys]);\n\n const readerResult = useMemo(() => {\n if (!readerCtx) return null;\n return {\n docking: readerCtx.preferences.docking,\n actionsKeys: readerCtx.preferences.actions.keys as Record<string, ThActionsTokens>,\n };\n }, [readerCtx]);\n\n if (audioResult) return audioResult;\n if (readerResult) return readerResult;\n\n throw new Error(\"useActionsPreferences must be used within a ThPreferencesProvider or ThAudioPreferencesProvider\");\n};\n\nexport const useAudioActionsPreferences = (): AudioActionsPreferences => {\n const audioCtx = useContext(ThAudioPreferencesContext);\n\n if (!audioCtx) {\n throw new Error(\"useAudioActionsPreferences must be used within a ThAudioPreferencesProvider\");\n }\n\n return {\n docking: audioCtx.preferences.docking,\n primaryActionsKeys: audioCtx.preferences.actions.primary.keys,\n secondaryActionsKeys: audioCtx.preferences.actions.secondary.keys,\n primaryDisplayOrder: audioCtx.preferences.actions.primary.displayOrder as string[],\n secondaryDisplayOrder: audioCtx.preferences.actions.secondary.displayOrder as string[],\n };\n};\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ThAudioPreferencesContext } from \"../ThAudioPreferencesContext\";\nimport { ThAudioPreferences, AudioCustomizableKeys, AudioDefaultKeys } from \"../audioPreferences\";\n\nexport function useAudioPreferences<K extends AudioCustomizableKeys = AudioDefaultKeys>() {\n const context = useContext(ThAudioPreferencesContext);\n\n if (!context) {\n throw new Error(\"useAudioPreferences must be used within a ThAudioPreferencesProvider\");\n }\n\n return {\n preferences: context.preferences as ThAudioPreferences<K>,\n updatePreferences: context.updatePreferences as (prefs: ThAudioPreferences<K>) => void,\n };\n}\n","import { FontDefinition, FontSpec, WeightConfig } from \"../models\";\nimport { FontResource } from \"./fonts\";\n\n/**\n * Builds a Bunny Fonts API URL\n * @see https://fonts.bunny.net\n */\nconst buildBunnyFontsUrl = ({\n family,\n weights,\n styles = [\"normal\"]\n}: {\n family: string;\n weights: WeightConfig;\n styles?: FontSpec[\"styles\"];\n}): string => {\n if (weights.type !== \"static\") {\n throw new Error(\"Bunny Fonts only supports static fonts\");\n }\n const weightValues = weights.values;\n \n // For Bunny Fonts, we need to handle italic variants by appending \"i\" to the weight\n const variants = new Set<string>();\n \n for (const weight of weightValues) {\n // Always add the base weight\n variants.add(weight.toString());\n \n // Add italic variant if needed\n if (styles.includes(\"italic\")) {\n variants.add(`${ weight }i`);\n }\n }\n\n // Convert set to array and sort for consistent URLs\n const variantList = Array.from(variants).sort();\n \n const familyParam = family.replace(/ /g, \"-\").toLowerCase();\n const variantParam = variantList.join(\",\");\n\n return `https://fonts.bunny.net/css?family=${ familyParam }:${ variantParam }`;\n};\n\n/**\n * Creates Bunny Fonts resources for injection\n */\nexport const createBunnyFontResources = (font: FontDefinition): FontResource | null => {\n if (font.source.type !== \"custom\" || font.source.provider !== \"bunny\" || font.spec.weights.type !== \"static\") {\n return null;\n }\n\n const { family, weights, styles } = font.spec;\n\n const url = buildBunnyFontsUrl({\n family,\n weights,\n styles\n });\n\n return {\n as: \"link\",\n rel: \"stylesheet\",\n url\n };\n};","import { FontDefinition, WeightConfig, VariableFontRangeConfig, FontSpec } from \"../models\";\nimport { FontResource } from \"./fonts\";\n\n/**\n * Builds a Google Fonts API v2 URL according to the specification.\n * @see https://developers.google.com/fonts/docs/css2\n */\nconst buildGoogleFontsV2Url = ({\n family,\n weights,\n styles = [\"normal\"],\n widths,\n display = \"block\",\n text\n}: {\n family: string;\n weights: WeightConfig;\n styles?: FontSpec[\"styles\"];\n widths?: VariableFontRangeConfig;\n display?: FontSpec[\"display\"];\n text?: string;\n}): string => {\n // If optimizing with text, just load the font family with the text parameter\n if (text) {\n return `https://fonts.googleapis.com/css2?family=${ family.replace(/ /g, \"+\") }&text=${ encodeURIComponent(text) }`;\n }\n\n const hasItalic = styles.includes(\"italic\");\n const hasWidth = !!widths;\n const weightValues = weights.type === \"static\"\n ? weights.values.join(\",\")\n : `${ weights.min }..${ weights.max }`;\n const widthValues = hasWidth && widths ? `${ widths.min }..${ widths.max }` : undefined;\n\n const familyParam = family.replace(/ /g, \"+\");\n let axesParam: string;\n\n if (hasItalic && hasWidth) {\n // With italic and width: ital,wdth,wght@0,widthValues,weightValues;1,widthValues,weightValues\n const variants = [\n `0,${ widthValues },${ weightValues }`, // normal\n `1,${ widthValues },${ weightValues }` // italic\n ];\n axesParam = `:ital,wdth,wght@${ variants.join(\";\") }`;\n } else if (hasItalic) {\n // With italic only: ital,wght@0,weightValues;1,weightValues\n const variants = [\n `0,${ weightValues }`, // normal\n `1,${ weightValues }` // italic\n ];\n axesParam = `:ital,wght@${ variants.join(\";\") }`;\n } else if (hasWidth) {\n // With width only: wdth,wght@widthValues,weightValues\n axesParam = `:wdth,wght@${ widthValues },${ weightValues }`;\n } else {\n // Without italic or width: wght@weightValues\n axesParam = `:wght@${ weightValues }`;\n }\n const displayParam = display ? `&display=${ display }` : \"\";\n\n return `https://fonts.googleapis.com/css2?family=${ familyParam }${ axesParam }${ displayParam }`;\n};\n\n/**\n * Creates Google Font resources for injection\n */\nexport const createGoogleFontResources = (font: FontDefinition, text?: string): FontResource | null => {\n if (font.source.type !== \"custom\" || font.source.provider !== \"google\") {\n return null;\n }\n\n const { family, weights, display, styles, widths } = font.spec;\n\n const url = buildGoogleFontsV2Url({\n family,\n weights,\n display,\n styles,\n widths,\n text\n });\n\n return {\n as: \"link\",\n rel: \"stylesheet\",\n url\n };\n};\n","import { FontDefinition } from \"../models\";\nimport { FontResource } from \"./fonts\";\n\n/**\n * Determines the font format from a file path\n */\n const getFontFormat = (path: string): string => {\n const ext = path.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"woff\": return \"woff\";\n case \"woff2\": return \"woff2\";\n case \"ttf\": return \"truetype\";\n case \"otf\": return \"opentype\";\n case \"eot\": return \"embedded-opentype\";\n case \"svg\": return \"svg\";\n default: return \"woff2\"; // default to woff2 if unknown\n }\n };\n\n/**\n * Creates local font resources for injection\n */\n export const createLocalFontResources = (font: FontDefinition): FontResource | null => {\n if (font.source.type !== \"custom\" || font.source.provider !== \"local\") {\n return null;\n }\n\n const { family, weights, display, widths } = font.spec;\n const fontFiles = font.source.files || [];\n \n // Generate CSS for each font file\n const cssContent = fontFiles.map(fontFile => {\n const format = getFontFormat(fontFile.path);\n const fontUrl = new URL(fontFile.path, window.location.origin).toString();\n\n // Check if this is a variable font\n const isVariable = font.source.type === \"custom\" && \n font.source.provider === \"local\" && \n \"variant\" in font.source && \n font.source.variant === \"variable\";\n \n const rules = [\n `@font-face {`,\n ` font-family: \"${ family }\";`,\n ` src: url(\"${ fontUrl }\") format(\"${ format }\");`\n ];\n\n // Handle font weight\n if (isVariable && weights.type === \"variable\") {\n rules.push(` font-weight: ${ weights.min } ${ weights.max };`);\n } else if (\"weight\" in fontFile) {\n rules.push(` font-weight: ${ fontFile.weight };`);\n }\n\n // Handle font style\n if (\"style\" in fontFile) {\n rules.push(` font-style: ${ fontFile.style };`);\n }\n\n // Handle font width for variable fonts\n if (isVariable && widths) {\n rules.push(` font-stretch: ${ widths.min }% ${ widths.max }%;`);\n }\n \n if (display) {\n rules.push(` font-display: ${ display };`);\n } else {\n rules.push(` font-display: block;`);\n }\n \n return rules.join(\"\\n\") + \"\\n}\";\n }).filter(Boolean).join(\"\\n\\n\");\n \n const blob = new Blob([cssContent], { type: \"text/css\" });\n \n // Return the font face as a stylesheet resource\n return {\n as: \"link\",\n rel: \"stylesheet\",\n blob: blob\n };\n };\n","import { FontDefinition, VariableFontRangeConfig, WeightConfig, ThFontFamilyPref, FontCollection, ValidatedLanguageCollection } from \"../models\";\n\nimport { ILinkInjectable, IUrlInjectable, IBlobInjectable, ScriptMode } from \"@readium/navigator\";\n\nimport { createBunnyFontResources } from \"./createBunnyFontResources\";\nimport { createGoogleFontResources } from \"./createGoogleFontResources\";\nimport { createLocalFontResources } from \"./createLocalFontResources\";\n\nexport type FontResource = (ILinkInjectable & IUrlInjectable) | (ILinkInjectable & IBlobInjectable);\n\nexport interface InjectableFontResources {\n allowedDomains: string[];\n prepend: FontResource[];\n append: FontResource[];\n}\n\nexport interface FontMetadata {\n fontStack: string | null;\n fontFamily: string | null;\n weights: WeightConfig | null;\n widths: VariableFontRangeConfig | null;\n}\n\nexport interface FontService {\n getInjectables: (options?: { language?: string } | { key?: string }, optimize?: boolean) => InjectableFontResources | null;\n getFontMetadata: (fontId: string) => FontMetadata;\n getFontCollection: (options?: { language?: string } | { key?: string }) => FontCollection;\n resolveFontLanguage: (bcp47Tag: string | undefined, scriptMode: ScriptMode) => string;\n}\n\nexport const createFontService = (fontFamilyPref: ThFontFamilyPref): FontService => {\n const allSupportedLanguages: string[] = [];\n const parsedFonts = new Map<string, FontMetadata>();\n \n const bunnyFonts = new Map<string, FontDefinition[]>();\n const googleFonts = new Map<string, FontDefinition[]>();\n const localFonts = new Map<string, FontDefinition[]>();\n \n /**\n * Resolves a BCP47 language tag to a supported language format based on specific rules and available font collections.\n *\n * Rules:\n * - First checks if the full BCP47 tag exists in supportedLanguages\n * - If not found, checks for { language }-{ scriptOrRegion } format\n * - Special case for Japanese (ja):\n * - For cjk-vertical script mode, checks if \"ja-v\" is supported\n * - Otherwise falls back to \"ja\" if supported\n * - Filters out specific language-script combinations:\n * - Mongolian: \"mn-mong\" and \"mn-cyrl\"\n * - Chinese: \"zh-hant\", \"zh-tw\", \"zh-hk\"\n * - If not filtered, falls back to { language } if supported\n * - Returns \"default\" if no match is found\n *\n * @param bcp47Tag - The BCP47 language tag to resolve\n * @param scriptMode - Script mode of the publication\n * @returns The resolved language tag or \"default\" if no match found\n */\n const resolveFontLanguage = (\n bcp47Tag: string | undefined,\n scriptMode: ScriptMode = \"ltr\"\n ): string => {\n if (!bcp47Tag) return \"default\";\n\n // Check direct match of full BCP47 tag\n if (allSupportedLanguages.includes(bcp47Tag)) {\n return bcp47Tag;\n }\n\n const parts = bcp47Tag.split(/[-_]/);\n const language = parts[0].toLowerCase();\n const scriptOrRegion = parts[1]?.toLowerCase();\n\n // Check { language }-{ scriptOrRegion } format\n if (scriptOrRegion) {\n const langScriptOrRegion = `${ language }-${ scriptOrRegion }`;\n if (allSupportedLanguages.includes(langScriptOrRegion)) {\n return langScriptOrRegion;\n }\n }\n\n // Special case for Japanese\n if (language === \"ja\" && !scriptOrRegion) {\n if (scriptMode === \"cjk-vertical\" && allSupportedLanguages.includes(\"ja-v\")) {\n return \"ja-v\";\n }\n if (allSupportedLanguages.includes(\"ja\")) {\n return \"ja\";\n }\n }\n\n // Special cases that should be filtered out\n const shouldFilter =\n (language === \"mn\" && (scriptOrRegion === \"mong\" || scriptOrRegion === \"cyrl\")) ||\n (language === \"zh\" && (scriptOrRegion === \"hant\" || scriptOrRegion === \"tw\" || scriptOrRegion === \"hk\"));\n\n // If not filtered, check if just the language is supported\n if (!shouldFilter && allSupportedLanguages.includes(language)) {\n return language;\n }\n\n return \"default\";\n };\n\n // Parse ALL fonts upfront - index by collection\n Object.entries(fontFamilyPref).forEach(([collectionName, collectionData]) => {\n // Handle both FontCollection and ValidatedLanguageCollection\n const fontCollection = \"fonts\" in collectionData ? \n (collectionData as ValidatedLanguageCollection).fonts : \n collectionData as FontCollection;\n \n // Collect supported languages if this is a ValidatedLanguageCollection\n if (\"supportedLanguages\" in collectionData) {\n const reducedLanguages = collectionData.supportedLanguages.map((lang: string) => {\n const parts = lang.split(/[-_]/);\n const language = parts[0].toLowerCase();\n const scriptOrRegion = parts[1]?.toLowerCase();\n return scriptOrRegion ? `${ language }-${ scriptOrRegion }` : language;\n });\n allSupportedLanguages.push(...reducedLanguages);\n }\n \n // Initialize arrays for this collection\n bunnyFonts.set(collectionName, []);\n googleFonts.set(collectionName, []);\n localFonts.set(collectionName, []);\n \n const collectionBunnyFonts = bunnyFonts.get(collectionName)!;\n const collectionGoogleFonts = googleFonts.get(collectionName)!;\n const collectionLocalFonts = localFonts.get(collectionName)!;\n \n // Process each font in the collection\n Object.entries<FontDefinition>(fontCollection as Record<string, FontDefinition>).forEach(([id, font]) => {\n const fontFamily = font.spec.family;\n let fontStack = fontFamily;\n\n if (font.source.type === \"custom\") {\n switch (font.source.provider) {\n case \"bunny\":\n collectionBunnyFonts.push(font);\n break;\n case \"google\":\n collectionGoogleFonts.push(font);\n break;\n case \"local\":\n collectionLocalFonts.push(font);\n break;\n }\n }\n\n const wrapIfNeeded = (name: string): string => {\n const trimmed = name.trim();\n if (!trimmed) return \"\";\n \n // If the name has spaces and isn't already wrapped in quotes\n if (trimmed.includes(\" \") && !/^['\"].*['\"]$/.test(trimmed)) {\n return `\"${ trimmed }\"`;\n }\n return trimmed;\n };\n\n const wrappedFontFamily = wrapIfNeeded(fontFamily);\n \n if (font.spec.fallbacks?.length) {\n const uniqueFallbacks = [...new Set(\n font.spec.fallbacks\n .filter((fallback: string) => fallback.toLowerCase() !== fontFamily.toLowerCase())\n .map(wrapIfNeeded)\n )];\n if (uniqueFallbacks.length > 0) {\n fontStack = [wrappedFontFamily, ...uniqueFallbacks].join(\", \");\n }\n }\n\n parsedFonts.set(id, { \n fontStack: fontStack || wrappedFontFamily, \n fontFamily: wrappedFontFamily,\n weights: font.spec.weights || null,\n widths: font.spec.widths || null\n });\n });\n });\n\n // Get default collection for fallback\n const defaultBunnyFonts = bunnyFonts.get(\"default\") || [];\n const defaultGoogleFonts = googleFonts.get(\"default\") || [];\n const defaultLocalFonts = localFonts.get(\"default\") || [];\n \n // Helper function to process fonts into injectable resources\n const processFonts = (bunnyFontsList: FontDefinition[], googleFontsList: FontDefinition[], localFontsList: FontDefinition[], optimize: boolean = false): InjectableFontResources | null => {\n const result: InjectableFontResources = {\n allowedDomains: [],\n prepend: [],\n append: []\n };\n\n // Process Bunny Fonts\n const bunnyResources = bunnyFontsList\n .map(font => createBunnyFontResources(font))\n .filter((resource): resource is FontResource => resource !== null);\n\n if (bunnyResources.length > 0) {\n result.allowedDomains.push(\n \"https://fonts.bunny.net\"\n );\n\n result.prepend.push(\n { \n as: \"link\",\n rel: \"preconnect\",\n url: \"https://fonts.bunny.net\"\n }\n );\n\n result.append.push(...bunnyResources);\n }\n\n // Process Google Fonts\n const googleResources = googleFontsList\n .map(font => createGoogleFontResources(font, optimize ? font.name : undefined))\n .filter((resource): resource is FontResource => resource !== null);\n\n if (googleResources.length > 0) {\n result.allowedDomains.push(\n \"https://fonts.googleapis.com\",\n \"https://fonts.gstatic.com\"\n );\n \n result.prepend.push(\n { \n as: \"link\",\n rel: \"preconnect\",\n url: \"https://fonts.googleapis.com\"\n },\n { \n as: \"link\",\n rel: \"preconnect\",\n url: \"https://fonts.gstatic.com\",\n attributes: { crossOrigin: \"anonymous\" }\n }\n );\n \n result.append.push(...googleResources);\n }\n\n // Process Local Fonts\n const localResources = localFontsList\n .map(createLocalFontResources)\n .filter((resource): resource is FontResource => resource !== null);\n\n if (localResources.length > 0) {\n result.allowedDomains.push(window.location.origin);\n result.append.push(...localResources);\n }\n\n return result.append.length > 0 ? result : null;\n };\n\n /**\n * Returns injectable font resources based on the provided options.\n * \n * @param options - The options object containing either a language or a key.\n * @param optimize - Whether to optimize the font resources. This will use the font label/name to determine the letters to request from Google Fonts.\n * @returns The injectable font resources or null if no valid collection is found.\n */\n const getInjectables = (options?: { language?: string } | { key?: string }, optimize = false): InjectableFontResources | null => {\n // Handle key-based selection\n if (options && \"key\" in options) {\n const { key } = options;\n \n if (!key || !(key in fontFamilyPref)) {\n return null;\n }\n \n return processFonts(bunnyFonts.get(key) || [], googleFonts.get(key) || [], localFonts.get(key) || [], optimize);\n }\n \n // Handle language-based selection\n if (options && \"language\" in options) {\n const { language: publicationLanguage } = options;\n \n // Find the collection for this language (validation already done in createPreferences)\n for (const [collectionName, collectionData] of Object.entries(fontFamilyPref)) {\n if (collectionName === \"default\") continue;\n \n const supportedLangs = \"supportedLanguages\" in collectionData ? \n collectionData.supportedLanguages : null;\n \n if (supportedLangs && Array.isArray(supportedLangs) && publicationLanguage && supportedLangs.includes(publicationLanguage)) {\n return processFonts(bunnyFonts.get(collectionName) || [], googleFonts.get(collectionName) || [], localFonts.get(collectionName) || [], optimize);\n }\n }\n }\n \n // Default behavior - return default collection\n return processFonts(defaultBunnyFonts, defaultGoogleFonts, defaultLocalFonts, optimize);\n };\n \n /**\n * Returns metadata for a specific font.\n * \n * @param fontId - The ID of the font.\n * @returns The metadata for the font or null if the font is not found.\n */\n const getFontMetadata = (fontId: string) => {\n const parsed = parsedFonts.get(fontId);\n return parsed || { fontStack: null, fontFamily: null, weights: null, widths: null };\n };\n\n /**\n * Returns the font collection based on the provided options.\n * \n * @param options - The options object containing either a language or a key.\n * @returns The font collection or the default collection if no valid collection is found.\n */\n const getFontCollection = (options?: { language?: string } | { key?: string }): FontCollection => {\n // Handle key-based selection\n if (options && \"key\" in options) {\n const { key } = options;\n \n if (!key || !(key in fontFamilyPref)) {\n return fontFamilyPref.default as FontCollection;\n }\n \n // Check if we're accessing the default collection\n if (key === \"default\") {\n return fontFamilyPref.default as FontCollection;\n }\n \n // For non-default keys, we expect ValidatedLanguageCollection\n const prefRecord = fontFamilyPref as Record<string, FontCollection | ValidatedLanguageCollection>;\n const collection = prefRecord[key] as ValidatedLanguageCollection;\n if (collection && \"fonts\" in collection) {\n return collection.fonts;\n }\n \n // Fallback to default\n return fontFamilyPref.default as FontCollection;\n }\n \n // Handle language-based selection\n if (options && \"language\" in options) {\n const { language: publicationLanguage } = options;\n \n // Find the collection for this language (validation already done in createPreferences)\n for (const [collectionName, collectionData] of Object.entries(fontFamilyPref)) {\n if (collectionName === \"default\") continue;\n \n const collection = \"fonts\" in collectionData ? collectionData : { fonts: collectionData };\n const supportedLangs = \"supportedLanguages\" in collection ? \n collection.supportedLanguages : null;\n \n if (supportedLangs?.includes(publicationLanguage!)) {\n return collection.fonts;\n }\n }\n\n // Fall back to default if no collection supports this language\n return fontFamilyPref.default as FontCollection;\n }\n \n // Default behavior - return default collection\n return fontFamilyPref.default as FontCollection;\n };\n\n return {\n getInjectables,\n getFontMetadata,\n getFontCollection,\n resolveFontLanguage\n };\n};\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ScriptMode } from \"@readium/navigator\";\nimport { ThPreferencesContext } from \"../ThPreferencesContext\";\nimport { CustomizableKeys, DefaultKeys, ThPreferences } from \"../preferences\";\nimport { createFontService } from \"../services/fonts\";\n\nexport function usePreferences<K extends CustomizableKeys = DefaultKeys>() {\n const context = useContext(ThPreferencesContext);\n \n if (!context) {\n throw new Error(\"usePreferences must be used within a ThPreferencesProvider\");\n }\n\n // Create font service that handles the entire ThFontFamilyPref object\n const fontService = createFontService(context.preferences.settings.keys.fontFamily);\n \n return {\n preferences: context.preferences as ThPreferences<K>,\n updatePreferences: context.updatePreferences as (prefs: ThPreferences<K>) => void,\n \n getFontInjectables: (options?: { language?: string } | { key?: string }, optimize?: boolean) => {\n return fontService.getInjectables(options, optimize);\n },\n \n getFontsList: (options?: { language?: string } | { key?: string }) => {\n return fontService.getFontCollection(options);\n },\n \n getFontMetadata: (fontId: string) => {\n return fontService.getFontMetadata(fontId);\n },\n \n resolveFontLanguage: (bcp47Tag: string | undefined, scriptMode: ScriptMode) => {\n return fontService.resolveFontLanguage(bcp47Tag, scriptMode);\n }\n };\n}","\"use client\";\n\nimport { \n ThSpacingPresetKeys,\n defaultSpacingSettingsSubpanel,\n defaultTextSettingsMain,\n defaultTextSettingsSubpanel,\n defaultSpacingSettingsMain,\n defaultSpacingPresetsOrder\n} from \"@/preferences/models\";\n\nimport { usePreferences } from \"./usePreferences\";\n\nexport const usePreferenceKeys = () => {\n const { preferences } = usePreferences();\n\n const reflowActionKeys = preferences.actions.reflowOrder;\n const fxlActionKeys = preferences.actions.fxlOrder;\n const webPubActionKeys = preferences.actions.webPubOrder;\n\n const reflowThemeKeys = preferences.theming.themes.reflowOrder;\n const fxlThemeKeys = preferences.theming.themes.fxlOrder;\n\n const reflowSettingsKeys = preferences.settings.reflowOrder;\n const fxlSettingsKeys = preferences.settings.fxlOrder;\n const webPubSettingsKeys = preferences.settings.webPubOrder;\n\n const mainTextSettingsKeys = preferences.settings.text?.main ?? defaultTextSettingsMain;\n const subPanelTextSettingsKeys = preferences.settings.text?.subPanel ?? defaultTextSettingsSubpanel;\n const mainSpacingSettingsKeys = preferences.settings.spacing?.main ?? defaultSpacingSettingsMain;\n const subPanelSpacingSettingsKeys = preferences.settings.spacing?.subPanel ?? defaultSpacingSettingsSubpanel;\n\n const reflowSpacingPresetKeys = preferences.settings.spacing?.presets?.reflowOrder ?? defaultSpacingPresetsOrder;\n const fxlSpacingPresetKeys: ThSpacingPresetKeys[] = [];\n const webPubSpacingPresetKeys = preferences.settings.spacing?.presets?.webPubOrder ?? defaultSpacingPresetsOrder;\n\n return {\n reflowActionKeys,\n fxlActionKeys,\n webPubActionKeys,\n reflowThemeKeys,\n fxlThemeKeys,\n reflowSettingsKeys,\n fxlSettingsKeys,\n webPubSettingsKeys,\n mainTextSettingsKeys,\n subPanelTextSettingsKeys,\n mainSpacingSettingsKeys,\n subPanelSpacingSettingsKeys,\n reflowSpacingPresetKeys,\n fxlSpacingPresetKeys,\n webPubSpacingPresetKeys\n };\n}","\"use client\";\n\nimport { useMemo } from \"react\";\n\nimport { ScriptMode, RCSSSettingsEntry } from \"@readium/navigator\";\nimport { useAppSelector } from \"@/lib/hooks\";\nimport {\n ThSettingsKeys,\n ThTextSettingsKeys,\n ThSpacingSettingsKeys\n} from \"@/preferences/models\";\nimport { usePreferenceKeys } from \"./usePreferenceKeys\";\nimport ReadiumCSSSettings from \"@readium/css/css/vars/settings.json\";\n\n// Translates ReadiumCSS property names to ThSettingsKeys.\n// colCount is intentionally omitted — it's handled separately with the !isFXL guard below.\nconst READIUM_CSS_TO_SETTINGS_KEY: Record<string, string | undefined> = {\n bodyHyphens: ThTextSettingsKeys.hyphens,\n a11yNormalize: ThTextSettingsKeys.textNormalize,\n letterSpacing: ThSpacingSettingsKeys.letterSpacing,\n textAlign: ThTextSettingsKeys.textAlign,\n paraIndent: ThSpacingSettingsKeys.paragraphIndent,\n wordSpacing: ThSpacingSettingsKeys.wordSpacing,\n ligatures: ThTextSettingsKeys.ligatures,\n noRuby: ThTextSettingsKeys.noRuby\n};\n\n// Keys appearing in any mode's `added` are mode-specific — they should be excluded\n// from every mode that does not explicitly list them in `added`.\nconst globallyAdded = new Set(\n Object.values(ReadiumCSSSettings).flatMap(entry => entry.added)\n);\n\nconst deriveExcluded = (entry: RCSSSettingsEntry): string[] => {\n const fromDisabled = entry.disabled\n .map(k => READIUM_CSS_TO_SETTINGS_KEY[k])\n .filter((k): k is string => k !== undefined);\n\n const fromAddedInversion = [...globallyAdded]\n .filter(k => !entry.added.includes(k))\n .map(k => READIUM_CSS_TO_SETTINGS_KEY[k])\n .filter((k): k is string => k !== undefined);\n\n return [...fromDisabled, ...fromAddedInversion];\n};\n\n// ThSettingsKeys.layout is excluded for vertical modes but is not tracked in the JSON.\nconst CJK_VERTICAL_EXCLUDED = [...deriveExcluded(ReadiumCSSSettings[\"cjk-vertical\"]), ThSettingsKeys.layout];\n\n// Keys that are not applicable for each script mode and should be hidden from settings UI.\n// Derived from @readium/css settings.json; mongolian-vertical follows cjk-vertical.\nconst EXCLUDED_BY_SCRIPT_MODE: Record<ScriptMode, string[]> = {\n \"ltr\": deriveExcluded(ReadiumCSSSettings[\"ltr\"]),\n \"rtl\": deriveExcluded(ReadiumCSSSettings[\"rtl\"]),\n \"cjk-horizontal\": deriveExcluded(ReadiumCSSSettings[\"cjk-horizontal\"]),\n \"cjk-vertical\": CJK_VERTICAL_EXCLUDED,\n \"mongolian-vertical\": CJK_VERTICAL_EXCLUDED,\n};\n\n/**\n * Wraps usePreferenceKeys and filters out settings keys that are not applicable\n * for the current publication's script mode (RTL, CJK-horizontal, CJK-vertical).\n * Drop-in replacement for usePreferenceKeys at all call sites.\n */\nexport const useFilteredPreferenceKeys = () => {\n const keys = usePreferenceKeys();\n const scriptMode = useAppSelector(state => state.publication.scriptMode);\n const isFXL = useAppSelector(state => state.publication.isFXL);\n\n return useMemo(() => {\n const excluded = [\n ...(EXCLUDED_BY_SCRIPT_MODE[scriptMode] ?? []),\n ...((scriptMode === \"cjk-vertical\" || scriptMode === \"mongolian-vertical\") && !isFXL\n ? [ThSettingsKeys.columns]\n : []),\n ];\n if (excluded.length === 0) return keys;\n\n const filter = <T extends string>(arr: T[]): T[] =>\n arr.filter(k => !excluded.includes(k));\n\n return {\n ...keys,\n reflowSettingsKeys: filter(keys.reflowSettingsKeys),\n fxlSettingsKeys: filter(keys.fxlSettingsKeys),\n webPubSettingsKeys: filter(keys.webPubSettingsKeys),\n mainTextSettingsKeys: filter(keys.mainTextSettingsKeys),\n subPanelTextSettingsKeys: filter(keys.subPanelTextSettingsKeys),\n mainSpacingSettingsKeys: filter(keys.mainSpacingSettingsKeys),\n subPanelSpacingSettingsKeys: filter(keys.subPanelSpacingSettingsKeys),\n };\n }, [keys, scriptMode, isFXL]);\n};\n","const PREFIXES = {\n short: \"th\",\n full: \"thorium_web\"\n} as const;\n\ntype PrefixVariant = keyof typeof PREFIXES;\n\nexport const prefixString = (str: string, variant: PrefixVariant = \"short\") => {\n return `${ PREFIXES[variant] }-${ str }`;\n}","import type { OKLCH } from './types.js';\n\n// ---------------------------------------------------------------------------\n// sRGB ↔ Linear\n// ---------------------------------------------------------------------------\n\n/** Convert a single sRGB channel (0–255) to linear (0–1). */\nexport function srgbToLinear(c: number): number {\n const s = c / 255;\n return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n}\n\n/** Convert a linear channel (0–1) back to sRGB (0–255). */\nexport function linearToSrgb(c: number): number {\n const s = c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n return Math.round(Math.max(0, Math.min(255, s * 255)));\n}\n\n// ---------------------------------------------------------------------------\n// RGB → OKLab → OKLCH\n// ---------------------------------------------------------------------------\n\n/** Convert sRGB (0–255 each) to OKLCH. */\nexport function rgbToOklch(r: number, g: number, b: number): OKLCH {\n // sRGB → linear\n const lr = srgbToLinear(r);\n const lg = srgbToLinear(g);\n const lb = srgbToLinear(b);\n\n // Linear sRGB → LMS (using Oklab M1 matrix)\n const l_ = 0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb;\n const m_ = 0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb;\n const s_ = 0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb;\n\n // Cube root (LMS → Lab cone response)\n const l3 = Math.cbrt(l_);\n const m3 = Math.cbrt(m_);\n const s3 = Math.cbrt(s_);\n\n // LMS cone response → OKLab\n const L = 0.2104542553 * l3 + 0.7936177850 * m3 - 0.0040720468 * s3;\n const a = 1.9779984951 * l3 - 2.4285922050 * m3 + 0.4505937099 * s3;\n const bLab = 0.0259040371 * l3 + 0.7827717662 * m3 - 0.8086757660 * s3;\n\n // OKLab → OKLCH\n const C = Math.sqrt(a * a + bLab * bLab);\n let H = Math.atan2(bLab, a) * (180 / Math.PI);\n if (H < 0) H += 360;\n\n return { l: L, c: C, h: H };\n}\n\n// ---------------------------------------------------------------------------\n// OKLCH → OKLab → RGB\n// ---------------------------------------------------------------------------\n\n/** Convert OKLCH back to sRGB (0–255 each). Clamps out-of-gamut values. */\nexport function oklchToRgb(l: number, c: number, h: number): [number, number, number] {\n // OKLCH → OKLab\n const hRad = h * (Math.PI / 180);\n const a = c * Math.cos(hRad);\n const bLab = c * Math.sin(hRad);\n\n // OKLab → LMS cone response\n const l3 = l + 0.3963377774 * a + 0.2158037573 * bLab;\n const m3 = l - 0.1055613458 * a - 0.0638541728 * bLab;\n const s3 = l - 0.0894841775 * a - 1.2914855480 * bLab;\n\n // Cube (cone response → LMS)\n const l_ = l3 * l3 * l3;\n const m_ = m3 * m3 * m3;\n const s_ = s3 * s3 * s3;\n\n // LMS → linear sRGB (inverse of M1)\n const lr = +4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_;\n const lg = -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_;\n const lb = -0.0041960863 * l_ - 0.7034186147 * m_ + 1.7076147010 * s_;\n\n return [linearToSrgb(lr), linearToSrgb(lg), linearToSrgb(lb)];\n}\n\n// ---------------------------------------------------------------------------\n// Batch conversion helpers for OKLCH quantization pipeline\n// ---------------------------------------------------------------------------\n\n/**\n * Convert an array of RGB pixel triplets to OKLCH, scaled to 0–255 for\n * compatibility with the MMCQ quantizer (which expects integer ranges).\n *\n * Scaling: L (0–1) → 0–255, C (0–0.4) → 0–255, H (0–360) → 0–255\n */\nexport function pixelsRgbToOklchScaled(\n pixels: Array<[number, number, number]>,\n): Array<[number, number, number]> {\n const out: Array<[number, number, number]> = new Array(pixels.length);\n for (let i = 0; i < pixels.length; i++) {\n const [r, g, b] = pixels[i];\n const { l, c, h } = rgbToOklch(r, g, b);\n out[i] = [\n Math.round(l * 255),\n Math.round((c / 0.4) * 255),\n Math.round((h / 360) * 255),\n ];\n }\n return out;\n}\n\n/**\n * Convert scaled OKLCH palette entries back to RGB.\n */\nexport function paletteOklchScaledToRgb(\n colors: Array<{ color: [number, number, number]; population: number }>,\n): Array<{ color: [number, number, number]; population: number }> {\n return colors.map(({ color: [ls, cs, hs], population }) => {\n const l = ls / 255;\n const c = (cs / 255) * 0.4;\n const h = (hs / 255) * 360;\n return { color: oklchToRgb(l, c, h), population };\n });\n}\n","import type { RGB, HSL, OKLCH, Color, ContrastInfo, CssColorFormat } from './types.js';\nimport { rgbToOklch } from './color-space.js';\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction rgbToHsl(r: number, g: number, b: number): HSL {\n const r1 = r / 255;\n const g1 = g / 255;\n const b1 = b / 255;\n const max = Math.max(r1, g1, b1);\n const min = Math.min(r1, g1, b1);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n if (max === r1) {\n h = ((g1 - b1) / d + (g1 < b1 ? 6 : 0)) / 6;\n } else if (max === g1) {\n h = ((b1 - r1) / d + 2) / 6;\n } else {\n h = ((r1 - g1) / d + 4) / 6;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\n/** WCAG relative luminance from sRGB 0–255. */\nfunction relativeLuminance(r: number, g: number, b: number): number {\n const toLinear = (c: number) => {\n const s = c / 255;\n return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n };\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** WCAG contrast ratio between two luminances (always ≥ 1). */\nfunction contrastRatio(l1: number, l2: number): number {\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n// ---------------------------------------------------------------------------\n// ColorImpl\n// ---------------------------------------------------------------------------\n\nclass ColorImpl implements Color {\n private readonly _r: number;\n private readonly _g: number;\n private readonly _b: number;\n readonly population: number;\n readonly proportion: number;\n\n private _hsl: HSL | undefined;\n private _oklch: OKLCH | undefined;\n private _luminance: number | undefined;\n private _contrast: ContrastInfo | undefined;\n\n constructor(r: number, g: number, b: number, population: number, proportion: number) {\n this._r = r;\n this._g = g;\n this._b = b;\n this.population = population;\n this.proportion = proportion;\n }\n\n rgb(): RGB {\n return { r: this._r, g: this._g, b: this._b };\n }\n\n hex(): string {\n const toHex = (n: number) => n.toString(16).padStart(2, '0');\n return `#${toHex(this._r)}${toHex(this._g)}${toHex(this._b)}`;\n }\n\n hsl(): HSL {\n if (!this._hsl) {\n this._hsl = rgbToHsl(this._r, this._g, this._b);\n }\n return this._hsl;\n }\n\n oklch(): OKLCH {\n if (!this._oklch) {\n this._oklch = rgbToOklch(this._r, this._g, this._b);\n }\n return this._oklch;\n }\n\n css(format: CssColorFormat = 'rgb'): string {\n switch (format) {\n case 'hsl': {\n const { h, s, l } = this.hsl();\n return `hsl(${h}, ${s}%, ${l}%)`;\n }\n case 'oklch': {\n const { l, c, h } = this.oklch();\n return `oklch(${l.toFixed(3)} ${c.toFixed(3)} ${h.toFixed(1)})`;\n }\n case 'rgb':\n default:\n return `rgb(${this._r}, ${this._g}, ${this._b})`;\n }\n }\n\n array(): [number, number, number] {\n return [this._r, this._g, this._b];\n }\n\n toString(): string {\n return this.hex();\n }\n\n get textColor(): string {\n return this.isDark ? '#ffffff' : '#000000';\n }\n\n private get luminance(): number {\n if (this._luminance === undefined) {\n this._luminance = relativeLuminance(this._r, this._g, this._b);\n }\n return this._luminance;\n }\n\n get isDark(): boolean {\n return this.luminance <= 0.179;\n }\n\n get isLight(): boolean {\n return !this.isDark;\n }\n\n get contrast(): ContrastInfo {\n if (!this._contrast) {\n const lum = this.luminance;\n const white = contrastRatio(lum, 1); // white luminance = 1\n const black = contrastRatio(lum, 0); // black luminance = 0\n const foreground = this.isDark\n ? createColor(255, 255, 255, 0, 0)\n : createColor(0, 0, 0, 0, 0);\n this._contrast = {\n white: Math.round(white * 100) / 100,\n black: Math.round(black * 100) / 100,\n foreground,\n };\n }\n return this._contrast;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/** Create a Color object from RGB components, population count, and proportion. */\nexport function createColor(\n r: number,\n g: number,\n b: number,\n population: number,\n proportion: number = 0,\n): Color {\n return new ColorImpl(r, g, b, population, proportion);\n}\n","import type {\n Color,\n ExtractionOptions,\n FilterOptions,\n PixelBuffer,\n Quantizer,\n} from './types.js';\nimport { createColor } from './color.js';\nimport {\n pixelsRgbToOklchScaled,\n paletteOklchScaledToRgb,\n} from './color-space.js';\n\n// ---------------------------------------------------------------------------\n// Validate & normalize options\n// ---------------------------------------------------------------------------\n\nexport interface ValidatedOptions {\n colorCount: number;\n quality: number;\n ignoreWhite: boolean;\n whiteThreshold: number;\n alphaThreshold: number;\n minSaturation: number;\n colorSpace: 'rgb' | 'oklch';\n}\n\nexport function validateOptions(options: ExtractionOptions): ValidatedOptions {\n let { colorCount, quality } = options;\n\n if (typeof colorCount === 'undefined' || !Number.isInteger(colorCount)) {\n colorCount = 10;\n } else if (colorCount === 1) {\n throw new Error(\n 'colorCount should be between 2 and 20. To get one color, call getColor() instead of getPalette()',\n );\n } else {\n colorCount = Math.max(colorCount, 2);\n colorCount = Math.min(colorCount, 20);\n }\n\n if (\n typeof quality === 'undefined' ||\n !Number.isInteger(quality) ||\n quality < 1\n ) {\n quality = 10;\n }\n\n const ignoreWhite =\n options.ignoreWhite !== undefined ? !!options.ignoreWhite : true;\n const whiteThreshold =\n typeof options.whiteThreshold === 'number' ? options.whiteThreshold : 250;\n const alphaThreshold =\n typeof options.alphaThreshold === 'number' ? options.alphaThreshold : 125;\n const minSaturation =\n typeof options.minSaturation === 'number'\n ? Math.max(0, Math.min(1, options.minSaturation))\n : 0;\n const colorSpace = options.colorSpace ?? 'oklch';\n\n return {\n colorCount,\n quality,\n ignoreWhite,\n whiteThreshold,\n alphaThreshold,\n minSaturation,\n colorSpace,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pixel sampling\n// ---------------------------------------------------------------------------\n\nexport function createPixelArray(\n data: PixelBuffer,\n pixelCount: number,\n quality: number,\n filterOptions: FilterOptions,\n): Array<[number, number, number]> {\n const {\n ignoreWhite = true,\n whiteThreshold = 250,\n alphaThreshold = 125,\n minSaturation = 0,\n } = filterOptions;\n\n const pixelArray: Array<[number, number, number]> = [];\n\n for (let i = 0; i < pixelCount; i += quality) {\n const offset = i * 4;\n const r = data[offset];\n const g = data[offset + 1];\n const b = data[offset + 2];\n const a = data[offset + 3];\n\n // Skip transparent pixels\n if (a !== undefined && a < alphaThreshold) continue;\n\n // Skip white pixels\n if (\n ignoreWhite &&\n r > whiteThreshold &&\n g > whiteThreshold &&\n b > whiteThreshold\n )\n continue;\n\n // Skip low-saturation pixels\n if (minSaturation > 0) {\n const max = Math.max(r, g, b);\n if (max === 0 || (max - Math.min(r, g, b)) / max < minSaturation)\n continue;\n }\n\n pixelArray.push([r, g, b]);\n }\n\n return pixelArray;\n}\n\n// ---------------------------------------------------------------------------\n// Fallback color (average)\n// ---------------------------------------------------------------------------\n\nexport function computeFallbackColor(\n data: PixelBuffer,\n pixelCount: number,\n quality: number,\n): [number, number, number] | null {\n let rTotal = 0;\n let gTotal = 0;\n let bTotal = 0;\n let count = 0;\n\n for (let i = 0; i < pixelCount; i += quality) {\n const offset = i * 4;\n rTotal += data[offset];\n gTotal += data[offset + 1];\n bTotal += data[offset + 2];\n count++;\n }\n\n if (count === 0) return null;\n\n return [\n Math.round(rTotal / count),\n Math.round(gTotal / count),\n Math.round(bTotal / count),\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Main extraction pipeline\n// ---------------------------------------------------------------------------\n\nexport function extractPalette(\n data: PixelBuffer,\n width: number,\n height: number,\n opts: ValidatedOptions,\n quantizer: Quantizer,\n): Color[] | null {\n const pixelCount = width * height;\n const filterOptions: FilterOptions = {\n ignoreWhite: opts.ignoreWhite,\n whiteThreshold: opts.whiteThreshold,\n alphaThreshold: opts.alphaThreshold,\n minSaturation: opts.minSaturation,\n };\n\n let pixelArray = createPixelArray(data, pixelCount, opts.quality, filterOptions);\n\n // Progressively relax filters if all pixels were excluded\n if (pixelArray.length === 0) {\n pixelArray = createPixelArray(data, pixelCount, opts.quality, {\n ...filterOptions,\n ignoreWhite: false,\n });\n }\n if (pixelArray.length === 0) {\n pixelArray = createPixelArray(data, pixelCount, opts.quality, {\n ...filterOptions,\n ignoreWhite: false,\n alphaThreshold: 0,\n });\n }\n\n // OKLCH quantization path\n let quantized: Array<{ color: [number, number, number]; population: number }>;\n if (opts.colorSpace === 'oklch') {\n const scaled = pixelsRgbToOklchScaled(pixelArray);\n quantized = paletteOklchScaledToRgb(\n quantizer.quantize(scaled, opts.colorCount),\n );\n } else {\n quantized = quantizer.quantize(pixelArray, opts.colorCount);\n }\n\n if (quantized.length > 0) {\n const totalPopulation = quantized.reduce((sum, q) => sum + q.population, 0);\n return quantized.map(({ color: [r, g, b], population }) =>\n createColor(r, g, b, population, totalPopulation > 0 ? population / totalPopulation : 0),\n );\n }\n\n // Fallback: average all pixels\n const fallback = computeFallbackColor(data, pixelCount, opts.quality);\n return fallback ? [createColor(fallback[0], fallback[1], fallback[2], 1, 1)] : null;\n}\n","import type { BrowserSource, PixelData, PixelLoader } from '../types.js';\n\n/**\n * Browser pixel loader. Extracts RGBA pixel data from DOM image sources\n * using an off-screen canvas.\n */\nexport class BrowserPixelLoader implements PixelLoader<BrowserSource> {\n async load(source: BrowserSource): Promise<PixelData> {\n if (typeof HTMLImageElement !== 'undefined' && source instanceof HTMLImageElement) {\n return this.loadFromImage(source);\n }\n if (typeof HTMLCanvasElement !== 'undefined' && source instanceof HTMLCanvasElement) {\n return this.loadFromCanvas(source);\n }\n if (typeof ImageData !== 'undefined' && source instanceof ImageData) {\n return {\n data: source.data,\n width: source.width,\n height: source.height,\n };\n }\n if (typeof HTMLVideoElement !== 'undefined' && source instanceof HTMLVideoElement) {\n return this.loadFromVideo(source);\n }\n if (typeof ImageBitmap !== 'undefined' && source instanceof ImageBitmap) {\n return this.loadFromImageBitmap(source);\n }\n if (typeof OffscreenCanvas !== 'undefined' && source instanceof OffscreenCanvas) {\n return this.loadFromOffscreenCanvas(source);\n }\n throw new Error(\n 'Unsupported source type. Expected HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageData, ImageBitmap, or OffscreenCanvas.',\n );\n }\n\n private loadFromImage(img: HTMLImageElement): PixelData {\n if (!img.complete) {\n throw new Error(\n 'Image has not finished loading. Wait for the \"load\" event before calling getColor/getPalette.',\n );\n }\n if (!img.naturalWidth) {\n throw new Error(\n 'Image has no dimensions. It may not have loaded successfully.',\n );\n }\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n const width = (canvas.width = img.naturalWidth);\n const height = (canvas.height = img.naturalHeight);\n ctx.drawImage(img, 0, 0, width, height);\n try {\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n } catch (e: unknown) {\n if (e instanceof DOMException && e.name === 'SecurityError') {\n const err = new Error(\n 'Image is tainted by cross-origin data. Add crossorigin=\"anonymous\" to the <img> tag and ensure the server sends appropriate CORS headers.',\n );\n err.cause = e;\n throw err;\n }\n throw e;\n }\n }\n\n private loadFromCanvas(canvas: HTMLCanvasElement): PixelData {\n const ctx = canvas.getContext('2d')!;\n const { width, height } = canvas;\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n }\n\n private loadFromVideo(video: HTMLVideoElement): PixelData {\n if (video.readyState < 2) {\n throw new Error(\n 'Video is not ready. Wait for the \"loadeddata\" or \"canplay\" event before calling getColor/getPalette.',\n );\n }\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (!width || !height) {\n throw new Error(\n 'Video has no dimensions. It may not have loaded successfully.',\n );\n }\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(video, 0, 0, width, height);\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n }\n\n private loadFromOffscreenCanvas(canvas: OffscreenCanvas): PixelData {\n const ctx = canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\n 'Could not get 2D context from OffscreenCanvas.',\n );\n }\n const { width, height } = canvas;\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n }\n\n private loadFromImageBitmap(bitmap: ImageBitmap): PixelData {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n ctx.drawImage(bitmap, 0, 0);\n const imageData = ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n return { data: imageData.data, width: bitmap.width, height: bitmap.height };\n }\n}\n","import type { NodeSource, PixelData, PixelLoader } from '../types.js';\n\n/** Custom decoder signature for pluggable Node decoders. */\nexport type NodeImageDecoder = (\n input: string | Buffer,\n) => Promise<{ data: Uint8Array; width: number; height: number }>;\n\ninterface NodeLoaderOptions {\n /** Override the default sharp-based decoder. */\n decoder?: NodeImageDecoder;\n}\n\n/**\n * Node.js pixel loader. Uses `sharp` (dynamically imported) to decode images\n * into raw RGBA pixel buffers. Accepts file paths or Buffers.\n *\n * The sharp dependency is optional — use `createNodeLoader({ decoder })`\n * to supply a custom decoder if sharp is not available.\n */\nexport class NodePixelLoader implements PixelLoader<NodeSource> {\n private readonly decoder: NodeImageDecoder;\n\n constructor(options?: NodeLoaderOptions) {\n this.decoder = options?.decoder ?? defaultSharpDecoder;\n }\n\n async load(source: NodeSource): Promise<PixelData> {\n const result = await this.decoder(source);\n return {\n data: result.data,\n width: result.width,\n height: result.height,\n };\n }\n}\n\n/** Default decoder using sharp. Dynamically imports sharp so it stays optional. */\nasync function defaultSharpDecoder(\n input: string | Buffer,\n): Promise<{ data: Uint8Array; width: number; height: number }> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let sharpFn: any;\n try {\n const mod = await import('sharp');\n sharpFn = mod.default ?? mod;\n } catch {\n throw new Error(\n 'sharp is required for Node.js image loading. Install it with: npm install sharp',\n );\n }\n const image = sharpFn(input).ensureAlpha();\n const { width, height } = await image.metadata();\n if (!width || !height) {\n throw new Error('Could not determine image dimensions.');\n }\n const { data } = await image.raw().toBuffer({ resolveWithObject: true });\n return { data: new Uint8Array(data.buffer, data.byteOffset, data.byteLength), width, height };\n}\n\n/** Factory to create a NodePixelLoader with optional custom decoder. */\nexport function createNodeLoader(options?: NodeLoaderOptions): NodePixelLoader {\n return new NodePixelLoader(options);\n}\n","/**\n * Self-contained worker script that receives pixel data, runs quantization,\n * and returns the serialized palette.\n *\n * Message protocol:\n * Request: { id: number, pixels: number[][], maxColors: number }\n * Response: { id: number, palette: Array<{ color: [r,g,b], population: number }> }\n * Error: { id: number, error: string }\n */\n\n// This entire string is turned into a Blob URL by the worker manager.\n// It must be fully self-contained — no imports, no external dependencies.\nexport const WORKER_SOURCE = /* js */ `\n'use strict';\n\n// -------------------------------------------------------------------------\n// Inlined MMCQ (Modified Median Cut Quantization)\n// -------------------------------------------------------------------------\n\nvar SIGBITS = 5;\nvar RSHIFT = 3;\nvar MAX_ITER = 1000;\nvar FRACT_POP = 0.75;\nvar HISTO_SIZE = 32768;\n\nfunction colorIndex(r, g, b) {\n return (r << 10) + (g << 5) + b;\n}\n\nfunction getHisto(pixels) {\n var h = new Uint32Array(HISTO_SIZE);\n for (var i = 0; i < pixels.length; i++) {\n var p = pixels[i];\n h[colorIndex(p[0] >> RSHIFT, p[1] >> RSHIFT, p[2] >> RSHIFT)]++;\n }\n return h;\n}\n\nfunction VBox(r1, r2, g1, g2, b1, b2, histo) {\n this.r1 = r1; this.r2 = r2;\n this.g1 = g1; this.g2 = g2;\n this.b1 = b1; this.b2 = b2;\n this.histo = histo;\n this._count = -1;\n this._volume = -1;\n this._avg = null;\n}\n\nVBox.prototype.volume = function(force) {\n if (this._volume < 0 || force) {\n this._volume = (this.r2 - this.r1 + 1) * (this.g2 - this.g1 + 1) * (this.b2 - this.b1 + 1);\n }\n return this._volume;\n};\n\nVBox.prototype.count = function(force) {\n if (this._count < 0 || force) {\n var n = 0;\n for (var i = this.r1; i <= this.r2; i++)\n for (var j = this.g1; j <= this.g2; j++)\n for (var k = this.b1; k <= this.b2; k++)\n n += this.histo[colorIndex(i, j, k)] || 0;\n this._count = n;\n }\n return this._count;\n};\n\nVBox.prototype.copy = function() {\n return new VBox(this.r1, this.r2, this.g1, this.g2, this.b1, this.b2, this.histo);\n};\n\nVBox.prototype.avg = function(force) {\n if (!this._avg || force) {\n var mult = 1 << RSHIFT;\n if (this.r1 === this.r2 && this.g1 === this.g2 && this.b1 === this.b2) {\n this._avg = [this.r1 << RSHIFT, this.g1 << RSHIFT, this.b1 << RSHIFT];\n } else {\n var ntot = 0, rsum = 0, gsum = 0, bsum = 0;\n for (var i = this.r1; i <= this.r2; i++)\n for (var j = this.g1; j <= this.g2; j++)\n for (var k = this.b1; k <= this.b2; k++) {\n var hval = this.histo[colorIndex(i, j, k)] || 0;\n ntot += hval;\n rsum += hval * (i + 0.5) * mult;\n gsum += hval * (j + 0.5) * mult;\n bsum += hval * (k + 0.5) * mult;\n }\n this._avg = ntot\n ? [~~(rsum / ntot), ~~(gsum / ntot), ~~(bsum / ntot)]\n : [~~(mult * (this.r1 + this.r2 + 1) / 2), ~~(mult * (this.g1 + this.g2 + 1) / 2), ~~(mult * (this.b1 + this.b2 + 1) / 2)];\n }\n }\n return this._avg;\n};\n\nfunction PQueue(comparator) {\n this.contents = [];\n this.sorted = false;\n this.comparator = comparator;\n}\n\nPQueue.prototype.push = function(item) { this.contents.push(item); this.sorted = false; };\nPQueue.prototype.pop = function() {\n if (!this.sorted) { this.contents.sort(this.comparator); this.sorted = true; }\n return this.contents.pop();\n};\nPQueue.prototype.size = function() { return this.contents.length; };\n\nfunction vboxFromPixels(pixels, histo) {\n var rmin = 1e6, rmax = 0, gmin = 1e6, gmax = 0, bmin = 1e6, bmax = 0;\n for (var i = 0; i < pixels.length; i++) {\n var p = pixels[i];\n var rv = p[0] >> RSHIFT, gv = p[1] >> RSHIFT, bv = p[2] >> RSHIFT;\n if (rv < rmin) rmin = rv; if (rv > rmax) rmax = rv;\n if (gv < gmin) gmin = gv; if (gv > gmax) gmax = gv;\n if (bv < bmin) bmin = bv; if (bv > bmax) bmax = bv;\n }\n return new VBox(rmin, rmax, gmin, gmax, bmin, bmax, histo);\n}\n\nfunction medianCutApply(histo, vbox) {\n if (!vbox.count()) return undefined;\n if (vbox.count() === 1) return [vbox.copy(), null];\n\n var rw = vbox.r2 - vbox.r1 + 1;\n var gw = vbox.g2 - vbox.g1 + 1;\n var bw = vbox.b2 - vbox.b1 + 1;\n var maxw = Math.max(rw, gw, bw);\n var total = 0;\n var partialsum = [];\n var lookaheadsum = [];\n var i, j, k, sum;\n\n if (maxw === rw) {\n for (i = vbox.r1; i <= vbox.r2; i++) {\n sum = 0;\n for (j = vbox.g1; j <= vbox.g2; j++)\n for (k = vbox.b1; k <= vbox.b2; k++)\n sum += histo[colorIndex(i, j, k)] || 0;\n total += sum; partialsum[i] = total;\n }\n } else if (maxw === gw) {\n for (i = vbox.g1; i <= vbox.g2; i++) {\n sum = 0;\n for (j = vbox.r1; j <= vbox.r2; j++)\n for (k = vbox.b1; k <= vbox.b2; k++)\n sum += histo[colorIndex(j, i, k)] || 0;\n total += sum; partialsum[i] = total;\n }\n } else {\n for (i = vbox.b1; i <= vbox.b2; i++) {\n sum = 0;\n for (j = vbox.r1; j <= vbox.r2; j++)\n for (k = vbox.g1; k <= vbox.g2; k++)\n sum += histo[colorIndex(j, k, i)] || 0;\n total += sum; partialsum[i] = total;\n }\n }\n\n partialsum.forEach(function(d, idx) { lookaheadsum[idx] = total - d; });\n\n function doCut(color) {\n var dim1 = color + '1', dim2 = color + '2';\n for (var i = vbox[dim1]; i <= vbox[dim2]; i++) {\n if (partialsum[i] > total / 2) {\n var vbox1 = vbox.copy(), vbox2 = vbox.copy();\n var left = i - vbox[dim1], right = vbox[dim2] - i;\n var d2 = left <= right\n ? Math.min(vbox[dim2] - 1, ~~(i + right / 2))\n : Math.max(vbox[dim1], ~~(i - 1 - left / 2));\n while (!partialsum[d2]) d2++;\n var count2 = lookaheadsum[d2];\n while (!count2 && partialsum[d2 - 1]) count2 = lookaheadsum[--d2];\n vbox1[dim2] = d2;\n vbox2[dim1] = d2 + 1;\n return [vbox1, vbox2];\n }\n }\n }\n\n if (maxw === rw) return doCut('r');\n if (maxw === gw) return doCut('g');\n return doCut('b');\n}\n\nfunction iterate(pq, target, histo) {\n var ncolors = pq.size(), niters = 0;\n while (niters < MAX_ITER) {\n if (ncolors >= target) return;\n niters++;\n var vbox = pq.pop();\n if (!vbox.count()) { pq.push(vbox); continue; }\n var result = medianCutApply(histo, vbox);\n if (!result || !result[0]) return;\n pq.push(result[0]);\n if (result[1]) { pq.push(result[1]); ncolors++; }\n }\n}\n\nfunction quantize(pixels, maxColors) {\n if (!pixels.length || maxColors < 2 || maxColors > 256) return [];\n\n var histo = getHisto(pixels);\n var vbox = vboxFromPixels(pixels, histo);\n var pq = new PQueue(function(a, b) { return a.count() - b.count(); });\n pq.push(vbox);\n iterate(pq, FRACT_POP * maxColors, histo);\n\n var pq2 = new PQueue(function(a, b) { return a.count() * a.volume() - b.count() * b.volume(); });\n while (pq.size()) pq2.push(pq.pop());\n iterate(pq2, maxColors, histo);\n\n var results = [];\n while (pq2.size()) {\n var box = pq2.pop();\n results.push({ color: box.avg(), population: box.count() });\n }\n return results;\n}\n\n// -------------------------------------------------------------------------\n// Worker message handler\n// -------------------------------------------------------------------------\n\nself.onmessage = function (e) {\n var data = e.data;\n var id = data.id;\n try {\n var palette = quantize(data.pixels, data.maxColors);\n self.postMessage({ id: id, palette: palette });\n } catch (err) {\n self.postMessage({ id: id, error: err.message || 'Unknown worker error' });\n }\n};\n`;\n","import type { Color } from '../types.js';\nimport { createColor } from '../color.js';\nimport { WORKER_SOURCE } from './worker-script.js';\n\nlet worker: Worker | null = null;\nlet blobUrl: string | null = null;\nlet nextId = 0;\nconst pending = new Map<\n number,\n { resolve: (value: Color[]) => void; reject: (reason: unknown) => void }\n>();\n\n/** Check whether the current environment supports Web Workers. */\nexport function isWorkerSupported(): boolean {\n return typeof Worker !== 'undefined';\n}\n\nfunction getOrCreateWorker(): Worker {\n if (worker) return worker;\n if (!isWorkerSupported()) {\n throw new Error('Web Workers are not supported in this environment.');\n }\n blobUrl = URL.createObjectURL(\n new Blob([WORKER_SOURCE], { type: 'application/javascript' }),\n );\n worker = new Worker(blobUrl);\n worker.onmessage = (e: MessageEvent) => {\n const { id, palette, error } = e.data;\n const entry = pending.get(id);\n if (!entry) return;\n pending.delete(id);\n if (error) {\n entry.reject(new Error(error));\n } else {\n const raw = palette as Array<{ color: [number, number, number]; population: number }>;\n const totalPopulation = raw.reduce((sum: number, q: { population: number }) => sum + q.population, 0);\n const colors = raw.map(({ color: [r, g, b], population }) =>\n createColor(r, g, b, population, totalPopulation > 0 ? population / totalPopulation : 0));\n entry.resolve(colors);\n }\n };\n worker.onerror = (e) => {\n // Reject all pending\n for (const [, entry] of pending) {\n entry.reject(new Error(e.message));\n }\n pending.clear();\n };\n return worker;\n}\n\n/**\n * Run quantization in a Web Worker.\n * @param pixels - Sampled pixel array (RGB triplets).\n * @param maxColors - Maximum palette size.\n * @param signal - Optional AbortSignal.\n */\nexport function extractInWorker(\n pixels: Array<[number, number, number]>,\n maxColors: number,\n signal?: AbortSignal,\n): Promise<Color[]> {\n return new Promise<Color[]>((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));\n return;\n }\n\n const id = nextId++;\n pending.set(id, { resolve, reject });\n\n const onAbort = () => {\n pending.delete(id);\n reject(signal!.reason ?? new DOMException('Aborted', 'AbortError'));\n };\n\n signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n const w = getOrCreateWorker();\n w.postMessage({ id, pixels, maxColors });\n } catch (err) {\n pending.delete(id);\n signal?.removeEventListener('abort', onAbort);\n reject(err);\n }\n });\n}\n\n/** Terminate the worker and release the Blob URL. */\nexport function terminateWorker(): void {\n if (worker) {\n worker.terminate();\n worker = null;\n }\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n blobUrl = null;\n }\n // Reject any outstanding requests\n for (const [, entry] of pending) {\n entry.reject(new Error('Worker terminated'));\n }\n pending.clear();\n}\n","import type {\n Color,\n ExtractionOptions,\n ImageSource,\n PixelData,\n PixelLoader,\n ProgressiveResult,\n Quantizer,\n SwatchMap,\n} from './types.js';\nimport { validateOptions, extractPalette } from './pipeline.js';\nimport { extractProgressive } from './progressive.js';\nimport { classifySwatches } from './swatches.js';\nimport { MmcqQuantizer } from './quantizers/mmcq.js';\nimport { resolveDefaultLoader } from './resolve-loader.js';\n\n// ---------------------------------------------------------------------------\n// Global configuration\n// ---------------------------------------------------------------------------\n\nlet globalLoader: PixelLoader<ImageSource> | null = null;\nlet globalQuantizer: Quantizer | null = null;\n\n/**\n * Override the default pixel loader and/or quantizer.\n *\n * ```ts\n * import { configure } from 'colorthief';\n * import { WasmQuantizer } from 'colorthief/internals';\n * const q = new WasmQuantizer();\n * await q.init();\n * configure({ quantizer: q });\n * ```\n */\nexport function configure(opts: {\n loader?: PixelLoader<ImageSource>;\n quantizer?: Quantizer;\n}): void {\n if (opts.loader) globalLoader = opts.loader;\n if (opts.quantizer) globalQuantizer = opts.quantizer;\n}\n\n// ---------------------------------------------------------------------------\n// Lazy environment detection\n// ---------------------------------------------------------------------------\n\nasync function getLoader(perCall?: PixelLoader<ImageSource>): Promise<PixelLoader<ImageSource>> {\n if (perCall) return perCall;\n if (globalLoader) return globalLoader;\n globalLoader = await resolveDefaultLoader();\n return globalLoader;\n}\n\nasync function getQuantizer(perCall?: Quantizer): Promise<Quantizer> {\n if (perCall) {\n await perCall.init();\n return perCall;\n }\n if (globalQuantizer) return globalQuantizer;\n const q = new MmcqQuantizer();\n await q.init();\n globalQuantizer = q;\n return q;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction checkAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException('Aborted', 'AbortError');\n }\n}\n\nasync function loadPixels(\n source: ImageSource,\n options?: ExtractionOptions,\n): Promise<PixelData> {\n checkAborted(options?.signal);\n const loader = await getLoader(options?.loader);\n return loader.load(source, options?.signal);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Get the single dominant color from an image.\n *\n * ```ts\n * const color = await getColor(imgElement);\n * console.log(color.hex()); // '#e84393'\n * ```\n */\nexport async function getColor(\n source: ImageSource,\n options?: ExtractionOptions,\n): Promise<Color | null> {\n const palette = await getPalette(source, {\n colorCount: 5,\n ...options,\n });\n return palette ? palette[0] : null;\n}\n\n/**\n * Get a color palette from an image.\n *\n * ```ts\n * const palette = await getPalette(imgElement, { colorCount: 5 });\n * palette.forEach(c => console.log(c.hex()));\n * ```\n */\nexport async function getPalette(\n source: ImageSource,\n options?: ExtractionOptions,\n): Promise<Color[] | null> {\n const opts = validateOptions(options ?? {});\n\n checkAborted(options?.signal);\n\n // Worker path (browser only)\n if (options?.worker) {\n const { isWorkerSupported, extractInWorker } = await import(\n './worker/manager.js'\n );\n if (isWorkerSupported()) {\n const { data, width, height } = await loadPixels(source, options);\n const { createPixelArray } = await import('./pipeline.js');\n const pixelArray = createPixelArray(data, width * height, opts.quality, {\n ignoreWhite: opts.ignoreWhite,\n whiteThreshold: opts.whiteThreshold,\n alphaThreshold: opts.alphaThreshold,\n minSaturation: opts.minSaturation,\n });\n return extractInWorker(pixelArray, opts.colorCount, options?.signal);\n }\n // Fall through to main thread if workers not supported\n }\n\n const [pixels, quantizer] = await Promise.all([\n loadPixels(source, options),\n getQuantizer(options?.quantizer),\n ]);\n\n checkAborted(options?.signal);\n\n return extractPalette(\n pixels.data,\n pixels.width,\n pixels.height,\n opts,\n quantizer,\n );\n}\n\n/**\n * Get semantic swatches (Vibrant, Muted, etc.) from an image.\n *\n * ```ts\n * const swatches = await getSwatches(imgElement);\n * console.log(swatches.Vibrant?.color.hex());\n * ```\n */\nexport async function getSwatches(\n source: ImageSource,\n options?: ExtractionOptions,\n): Promise<SwatchMap> {\n const palette = await getPalette(source, {\n colorCount: 16,\n ...options,\n });\n return classifySwatches(palette ?? []);\n}\n\n/**\n * Progressively extract a palette with increasing quality.\n * Yields intermediate results so the UI can update incrementally.\n *\n * ```ts\n * for await (const { palette, progress, done } of getPaletteProgressive(img)) {\n * updateUI(palette, progress);\n * }\n * ```\n */\nexport async function* getPaletteProgressive(\n source: ImageSource,\n options?: ExtractionOptions,\n): AsyncGenerator<ProgressiveResult> {\n const opts = validateOptions(options ?? {});\n\n const [pixels, quantizer] = await Promise.all([\n loadPixels(source, options),\n getQuantizer(options?.quantizer),\n ]);\n\n yield* extractProgressive(\n pixels.data,\n pixels.width,\n pixels.height,\n opts,\n quantizer,\n options?.signal,\n );\n}\n","import type {\n Color,\n PixelBuffer,\n ProgressiveResult,\n Quantizer,\n} from './types.js';\nimport { extractPalette, type ValidatedOptions } from './pipeline.js';\n\n/** Quality divisors for the 3 progressive passes. */\nconst PASSES = [\n { divisor: 16, progress: 0.06 },\n { divisor: 4, progress: 0.25 },\n { divisor: 1, progress: 1.0 },\n];\n\n/** Yield between passes so the UI can repaint. */\nfunction yieldToMain(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\n/**\n * Progressive palette extraction. Runs 3 passes with increasing quality\n * (16x skip → 4x skip → full quality), yielding intermediate results.\n */\nexport async function* extractProgressive(\n data: PixelBuffer,\n width: number,\n height: number,\n opts: ValidatedOptions,\n quantizer: Quantizer,\n signal?: AbortSignal,\n): AsyncGenerator<ProgressiveResult> {\n for (let i = 0; i < PASSES.length; i++) {\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException('Aborted', 'AbortError');\n }\n\n const pass = PASSES[i];\n const passOpts: ValidatedOptions = {\n ...opts,\n quality: opts.quality * pass.divisor,\n };\n\n const palette = extractPalette(data, width, height, passOpts, quantizer);\n const done = i === PASSES.length - 1;\n\n yield {\n palette: palette ?? [],\n progress: pass.progress,\n done,\n };\n\n if (!done) {\n await yieldToMain();\n }\n }\n}\n","import type { Color, Swatch, SwatchMap, SwatchRole } from './types.js';\nimport { createColor } from './color.js';\n\n// ---------------------------------------------------------------------------\n// OKLCH target ranges for each swatch role\n// ---------------------------------------------------------------------------\n\ninterface SwatchTarget {\n role: SwatchRole;\n /** Target OKLCH lightness (0–1). */\n targetL: number;\n /** Min / max lightness. */\n minL: number;\n maxL: number;\n /** Target chroma (0–0.4). */\n targetC: number;\n /** Min chroma. */\n minC: number;\n}\n\nconst TARGETS: SwatchTarget[] = [\n { role: 'Vibrant', targetL: 0.65, minL: 0.40, maxL: 0.85, targetC: 0.20, minC: 0.08 },\n { role: 'Muted', targetL: 0.65, minL: 0.40, maxL: 0.85, targetC: 0.04, minC: 0.00 },\n { role: 'DarkVibrant', targetL: 0.30, minL: 0.00, maxL: 0.45, targetC: 0.20, minC: 0.08 },\n { role: 'DarkMuted', targetL: 0.30, minL: 0.00, maxL: 0.45, targetC: 0.04, minC: 0.00 },\n { role: 'LightVibrant', targetL: 0.85, minL: 0.70, maxL: 1.00, targetC: 0.20, minC: 0.08 },\n { role: 'LightMuted', targetL: 0.85, minL: 0.70, maxL: 1.00, targetC: 0.04, minC: 0.00 },\n];\n\n// ---------------------------------------------------------------------------\n// Scoring\n// ---------------------------------------------------------------------------\n\nconst WEIGHT_L = 6;\nconst WEIGHT_C = 3;\nconst WEIGHT_POP = 1;\n\nfunction score(\n color: Color,\n target: SwatchTarget,\n maxPopulation: number,\n): number {\n const { l, c } = color.oklch();\n\n // Out of lightness range → disqualified\n if (l < target.minL || l > target.maxL) return -Infinity;\n // Below minimum chroma → disqualified\n if (c < target.minC) return -Infinity;\n\n const lDist = 1 - Math.abs(l - target.targetL);\n const cDist = 1 - Math.min(Math.abs(c - target.targetC) / 0.2, 1);\n const pop = maxPopulation > 0 ? color.population / maxPopulation : 0;\n\n return lDist * WEIGHT_L + cDist * WEIGHT_C + pop * WEIGHT_POP;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nconst WHITE = createColor(255, 255, 255, 0);\nconst BLACK = createColor(0, 0, 0, 0);\n\nfunction textColors(color: Color): { title: Color; body: Color } {\n return {\n title: color.isDark ? WHITE : BLACK,\n body: color.isDark ? WHITE : BLACK,\n };\n}\n\n/**\n * Classify a palette into semantic swatch roles using OKLCH distance scoring.\n * Each role is matched to the best-scoring palette color. A color can only\n * be assigned to one role (the one where it scores highest).\n */\nexport function classifySwatches(palette: Color[]): SwatchMap {\n const maxPopulation = Math.max(...palette.map((c) => c.population), 1);\n\n // Score every (color, target) pair\n const assignments: Array<{\n role: SwatchRole;\n color: Color;\n score: number;\n }> = [];\n\n for (const target of TARGETS) {\n let bestColor: Color | null = null;\n let bestScore = -Infinity;\n\n for (const color of palette) {\n const s = score(color, target, maxPopulation);\n if (s > bestScore) {\n bestScore = s;\n bestColor = color;\n }\n }\n\n if (bestColor && bestScore > -Infinity) {\n assignments.push({ role: target.role, color: bestColor, score: bestScore });\n }\n }\n\n // Resolve conflicts: if the same color is best for multiple roles,\n // keep the role where it scored highest; re-pick the loser.\n const used = new Set<Color>();\n const result: Partial<SwatchMap> = {};\n\n // Sort assignments by score descending so highest-scoring role wins\n assignments.sort((a, b) => b.score - a.score);\n\n for (const assignment of assignments) {\n if (used.has(assignment.color)) {\n // Try to find next best unused color for this role\n const target = TARGETS.find((t) => t.role === assignment.role)!;\n let fallback: Color | null = null;\n let fallbackScore = -Infinity;\n for (const color of palette) {\n if (used.has(color)) continue;\n const s = score(color, target, maxPopulation);\n if (s > fallbackScore) {\n fallbackScore = s;\n fallback = color;\n }\n }\n if (fallback && fallbackScore > -Infinity) {\n used.add(fallback);\n const { title, body } = textColors(fallback);\n result[assignment.role] = {\n color: fallback,\n role: assignment.role,\n titleTextColor: title,\n bodyTextColor: body,\n };\n } else {\n result[assignment.role] = null;\n }\n } else {\n used.add(assignment.color);\n const { title, body } = textColors(assignment.color);\n result[assignment.role] = {\n color: assignment.color,\n role: assignment.role,\n titleTextColor: title,\n bodyTextColor: body,\n };\n }\n }\n\n // Fill any unassigned roles with null\n for (const target of TARGETS) {\n if (!(target.role in result)) {\n result[target.role] = null;\n }\n }\n\n return result as SwatchMap;\n}\n","import type { Quantizer } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Constants (match original quantize library)\n// ---------------------------------------------------------------------------\n\nconst SIGBITS = 5;\nconst RSHIFT = 8 - SIGBITS;\nconst MAX_ITERATIONS = 1000;\nconst FRACT_BY_POPULATIONS = 0.75;\nconst HISTO_SIZE = 1 << (3 * SIGBITS);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColorIndex(r: number, g: number, b: number): number {\n return (r << (2 * SIGBITS)) + (g << SIGBITS) + b;\n}\n\n// ---------------------------------------------------------------------------\n// VBox — a 3-D box in reduced (5-bit) RGB color space\n// ---------------------------------------------------------------------------\n\nclass VBox {\n r1: number;\n r2: number;\n g1: number;\n g2: number;\n b1: number;\n b2: number;\n\n private readonly histo: Uint32Array;\n private _volume: number | undefined;\n private _count: number | undefined;\n private _avg: [number, number, number] | undefined;\n\n constructor(\n r1: number,\n r2: number,\n g1: number,\n g2: number,\n b1: number,\n b2: number,\n histo: Uint32Array,\n ) {\n this.r1 = r1;\n this.r2 = r2;\n this.g1 = g1;\n this.g2 = g2;\n this.b1 = b1;\n this.b2 = b2;\n this.histo = histo;\n }\n\n volume(force = false): number {\n if (this._volume === undefined || force) {\n this._volume =\n (this.r2 - this.r1 + 1) *\n (this.g2 - this.g1 + 1) *\n (this.b2 - this.b1 + 1);\n }\n return this._volume;\n }\n\n count(force = false): number {\n if (this._count === undefined || force) {\n let npix = 0;\n for (let i = this.r1; i <= this.r2; i++) {\n for (let j = this.g1; j <= this.g2; j++) {\n for (let k = this.b1; k <= this.b2; k++) {\n npix += this.histo[getColorIndex(i, j, k)] || 0;\n }\n }\n }\n this._count = npix;\n }\n return this._count;\n }\n\n copy(): VBox {\n return new VBox(this.r1, this.r2, this.g1, this.g2, this.b1, this.b2, this.histo);\n }\n\n avg(force = false): [number, number, number] {\n if (this._avg === undefined || force) {\n const mult = 1 << RSHIFT;\n\n // Single-color box: return exact color\n if (this.r1 === this.r2 && this.g1 === this.g2 && this.b1 === this.b2) {\n this._avg = [\n this.r1 << RSHIFT,\n this.g1 << RSHIFT,\n this.b1 << RSHIFT,\n ];\n } else {\n let ntot = 0;\n let rsum = 0;\n let gsum = 0;\n let bsum = 0;\n\n for (let i = this.r1; i <= this.r2; i++) {\n for (let j = this.g1; j <= this.g2; j++) {\n for (let k = this.b1; k <= this.b2; k++) {\n const hval = this.histo[getColorIndex(i, j, k)] || 0;\n ntot += hval;\n rsum += hval * (i + 0.5) * mult;\n gsum += hval * (j + 0.5) * mult;\n bsum += hval * (k + 0.5) * mult;\n }\n }\n }\n\n if (ntot) {\n this._avg = [\n ~~(rsum / ntot),\n ~~(gsum / ntot),\n ~~(bsum / ntot),\n ];\n } else {\n this._avg = [\n ~~((mult * (this.r1 + this.r2 + 1)) / 2),\n ~~((mult * (this.g1 + this.g2 + 1)) / 2),\n ~~((mult * (this.b1 + this.b2 + 1)) / 2),\n ];\n }\n }\n }\n return this._avg;\n }\n}\n\n// ---------------------------------------------------------------------------\n// PQueue — lazy-sorted priority queue\n// ---------------------------------------------------------------------------\n\nclass PQueue<T> {\n private contents: T[] = [];\n private sorted = false;\n\n constructor(private comparator: (a: T, b: T) => number) {}\n\n private sort(): void {\n this.contents.sort(this.comparator);\n this.sorted = true;\n }\n\n push(item: T): void {\n this.contents.push(item);\n this.sorted = false;\n }\n\n peek(index?: number): T {\n if (!this.sorted) this.sort();\n return this.contents[index ?? this.contents.length - 1];\n }\n\n pop(): T {\n if (!this.sorted) this.sort();\n return this.contents.pop()!;\n }\n\n size(): number {\n return this.contents.length;\n }\n\n map<U>(fn: (item: T) => U): U[] {\n return this.contents.map(fn);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Histogram & initial VBox\n// ---------------------------------------------------------------------------\n\nfunction getHisto(pixels: Array<[number, number, number]>): Uint32Array {\n const histo = new Uint32Array(HISTO_SIZE);\n for (const pixel of pixels) {\n const rval = pixel[0] >> RSHIFT;\n const gval = pixel[1] >> RSHIFT;\n const bval = pixel[2] >> RSHIFT;\n histo[getColorIndex(rval, gval, bval)]++;\n }\n return histo;\n}\n\nfunction vboxFromPixels(\n pixels: Array<[number, number, number]>,\n histo: Uint32Array,\n): VBox {\n let rmin = 1000000;\n let rmax = 0;\n let gmin = 1000000;\n let gmax = 0;\n let bmin = 1000000;\n let bmax = 0;\n\n for (const pixel of pixels) {\n const rval = pixel[0] >> RSHIFT;\n const gval = pixel[1] >> RSHIFT;\n const bval = pixel[2] >> RSHIFT;\n if (rval < rmin) rmin = rval;\n else if (rval > rmax) rmax = rval;\n if (gval < gmin) gmin = gval;\n else if (gval > gmax) gmax = gval;\n if (bval < bmin) bmin = bval;\n else if (bval > bmax) bmax = bval;\n }\n\n return new VBox(rmin, rmax, gmin, gmax, bmin, bmax, histo);\n}\n\n// ---------------------------------------------------------------------------\n// Median-cut split\n// ---------------------------------------------------------------------------\n\nfunction medianCutApply(histo: Uint32Array, vbox: VBox): [VBox, VBox | null] | undefined {\n if (!vbox.count()) return undefined;\n\n // Only one pixel — no split possible\n if (vbox.count() === 1) return [vbox.copy(), null];\n\n const rw = vbox.r2 - vbox.r1 + 1;\n const gw = vbox.g2 - vbox.g1 + 1;\n const bw = vbox.b2 - vbox.b1 + 1;\n const maxw = Math.max(rw, gw, bw);\n\n let total = 0;\n const partialsum: number[] = [];\n const lookaheadsum: number[] = [];\n\n if (maxw === rw) {\n for (let i = vbox.r1; i <= vbox.r2; i++) {\n let sum = 0;\n for (let j = vbox.g1; j <= vbox.g2; j++) {\n for (let k = vbox.b1; k <= vbox.b2; k++) {\n sum += histo[getColorIndex(i, j, k)] || 0;\n }\n }\n total += sum;\n partialsum[i] = total;\n }\n } else if (maxw === gw) {\n for (let i = vbox.g1; i <= vbox.g2; i++) {\n let sum = 0;\n for (let j = vbox.r1; j <= vbox.r2; j++) {\n for (let k = vbox.b1; k <= vbox.b2; k++) {\n sum += histo[getColorIndex(j, i, k)] || 0;\n }\n }\n total += sum;\n partialsum[i] = total;\n }\n } else {\n for (let i = vbox.b1; i <= vbox.b2; i++) {\n let sum = 0;\n for (let j = vbox.r1; j <= vbox.r2; j++) {\n for (let k = vbox.g1; k <= vbox.g2; k++) {\n sum += histo[getColorIndex(j, k, i)] || 0;\n }\n }\n total += sum;\n partialsum[i] = total;\n }\n }\n\n partialsum.forEach((d, i) => {\n lookaheadsum[i] = total - d;\n });\n\n function doCut(color: 'r' | 'g' | 'b'): [VBox, VBox] | undefined {\n const dim1 = (color + '1') as 'r1' | 'g1' | 'b1';\n const dim2 = (color + '2') as 'r2' | 'g2' | 'b2';\n\n for (let i = vbox[dim1]; i <= vbox[dim2]; i++) {\n if (partialsum[i] > total / 2) {\n const vbox1 = vbox.copy();\n const vbox2 = vbox.copy();\n const left = i - vbox[dim1];\n const right = vbox[dim2] - i;\n\n let d2: number;\n if (left <= right) {\n d2 = Math.min(vbox[dim2] - 1, ~~(i + right / 2));\n } else {\n d2 = Math.max(vbox[dim1], ~~(i - 1 - left / 2));\n }\n\n // Avoid 0-count boxes\n while (!partialsum[d2]) d2++;\n let count2 = lookaheadsum[d2];\n while (!count2 && partialsum[d2 - 1]) count2 = lookaheadsum[--d2];\n\n // Set dimensions\n vbox1[dim2] = d2;\n vbox2[dim1] = vbox1[dim2] + 1;\n\n return [vbox1, vbox2];\n }\n }\n return undefined;\n }\n\n if (maxw === rw) return doCut('r');\n if (maxw === gw) return doCut('g');\n return doCut('b');\n}\n\n// ---------------------------------------------------------------------------\n// Iterative splitting\n// ---------------------------------------------------------------------------\n\nfunction iterate(pq: PQueue<VBox>, target: number, histo: Uint32Array): void {\n let ncolors = pq.size();\n let niters = 0;\n\n while (niters < MAX_ITERATIONS) {\n if (ncolors >= target) return;\n niters++;\n\n const vbox = pq.pop();\n\n if (!vbox.count()) {\n pq.push(vbox);\n continue;\n }\n\n const result = medianCutApply(histo, vbox);\n if (!result || !result[0]) return;\n\n pq.push(result[0]);\n if (result[1]) {\n pq.push(result[1]);\n ncolors++;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main quantize function\n// ---------------------------------------------------------------------------\n\nfunction quantize(\n pixels: Array<[number, number, number]>,\n maxColors: number,\n): Array<{ color: [number, number, number]; population: number }> {\n if (!pixels.length || maxColors < 2 || maxColors > 256) return [];\n\n // Short-circuit: if unique colors <= maxColors, return them directly\n const seenColors = new Set<string>();\n const uniqueColors: Array<[number, number, number]> = [];\n for (const color of pixels) {\n const key = color.join(',');\n if (!seenColors.has(key)) {\n seenColors.add(key);\n uniqueColors.push(color);\n }\n }\n if (uniqueColors.length <= maxColors) {\n // Count populations for unique colors\n const countMap = new Map<string, number>();\n for (const color of pixels) {\n const key = color.join(',');\n countMap.set(key, (countMap.get(key) || 0) + 1);\n }\n return uniqueColors.map((color) => ({\n color,\n population: countMap.get(color.join(','))!,\n }));\n }\n\n const histo = getHisto(pixels);\n\n // Get the initial vbox from the pixels\n const vbox = vboxFromPixels(pixels, histo);\n const pq = new PQueue<VBox>((a, b) => a.count() - b.count());\n pq.push(vbox);\n\n // Phase 1: split by population until FRACT_BY_POPULATIONS * maxColors\n iterate(pq, FRACT_BY_POPULATIONS * maxColors, histo);\n\n // Phase 2: re-sort by count * volume, continue splitting\n const pq2 = new PQueue<VBox>((a, b) => a.count() * a.volume() - b.count() * b.volume());\n while (pq.size()) {\n pq2.push(pq.pop());\n }\n iterate(pq2, maxColors, histo);\n\n // Extract palette with population counts\n const results: Array<{ color: [number, number, number]; population: number }> = [];\n while (pq2.size()) {\n const box = pq2.pop();\n results.push({\n color: box.avg(),\n population: box.count(),\n });\n }\n\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// Quantizer adapter\n// ---------------------------------------------------------------------------\n\n/**\n * MMCQ (Modified Median Cut Quantization) — inlined TypeScript implementation.\n * Port of the @lokesh.dhakar/quantize algorithm with population tracking.\n */\nexport class MmcqQuantizer implements Quantizer {\n async init(): Promise<void> {\n // No-op — pure TypeScript, ready to use.\n }\n\n quantize(\n pixels: Array<[number, number, number]>,\n maxColors: number,\n ): Array<{ color: [number, number, number]; population: number }> {\n return quantize(pixels, maxColors);\n }\n}\n","/**\n * Synchronous browser-only API.\n *\n * These functions accept only BrowserSource (HTMLImageElement, HTMLCanvasElement,\n * ImageData, ImageBitmap) and run entirely on the main thread with no async overhead.\n *\n * For Node.js sources (file paths, Buffers) or features like Web Workers and\n * AbortSignal, use the async API (getColor, getPalette, getSwatches).\n */\nimport type {\n BrowserSource,\n Color,\n FilterOptions,\n ColorSpace,\n Quantizer,\n SwatchMap,\n} from './types.js';\nimport { BrowserPixelLoader } from './loaders/browser.js';\nimport { MmcqQuantizer } from './quantizers/mmcq.js';\nimport { validateOptions, extractPalette } from './pipeline.js';\nimport { classifySwatches } from './swatches.js';\n\n// ---------------------------------------------------------------------------\n// Sync-specific options (subset — no worker, no signal, no loader)\n// ---------------------------------------------------------------------------\n\nexport interface SyncExtractionOptions extends FilterOptions {\n /** Number of colors in the palette (2–20). @default 10 */\n colorCount?: number;\n /** Sampling quality (1 = highest). @default 10 */\n quality?: number;\n /** Color space for quantization. @default 'rgb' */\n colorSpace?: ColorSpace;\n /** Override the quantizer for this call. Must already be init()'d. */\n quantizer?: Quantizer;\n}\n\n// ---------------------------------------------------------------------------\n// Shared singletons\n// ---------------------------------------------------------------------------\n\nconst loader = new BrowserPixelLoader();\nconst defaultQuantizer = new MmcqQuantizer();\n\n// ---------------------------------------------------------------------------\n// Public sync API\n// ---------------------------------------------------------------------------\n\n/**\n * Synchronously get the dominant color from a browser image source.\n *\n * ```ts\n * const color = getColorSync(imgElement);\n * console.log(color.hex()); // '#e84393'\n * ```\n */\nexport function getColorSync(\n source: BrowserSource,\n options?: SyncExtractionOptions,\n): Color | null {\n const palette = getPaletteSync(source, { colorCount: 5, ...options });\n return palette ? palette[0] : null;\n}\n\n/**\n * Synchronously get a color palette from a browser image source.\n *\n * ```ts\n * const palette = getPaletteSync(imgElement, { colorCount: 5 });\n * palette.forEach(c => console.log(c.hex()));\n * ```\n */\nexport function getPaletteSync(\n source: BrowserSource,\n options?: SyncExtractionOptions,\n): Color[] | null {\n const opts = validateOptions(options ?? {});\n const quantizer = options?.quantizer ?? defaultQuantizer;\n\n // BrowserPixelLoader.load is async in signature but synchronous in practice\n // for HTMLImageElement/Canvas/ImageData/ImageBitmap. We call the internal\n // methods directly to avoid the Promise wrapper.\n const pixels = loadPixelsSync(source);\n\n return extractPalette(\n pixels.data,\n pixels.width,\n pixels.height,\n opts,\n quantizer,\n );\n}\n\n/**\n * Synchronously get semantic swatches from a browser image source.\n *\n * ```ts\n * const swatches = getSwatchesSync(imgElement);\n * console.log(swatches.Vibrant?.color.hex());\n * ```\n */\nexport function getSwatchesSync(\n source: BrowserSource,\n options?: SyncExtractionOptions,\n): SwatchMap {\n const palette = getPaletteSync(source, { colorCount: 16, ...options });\n return classifySwatches(palette ?? []);\n}\n\n// ---------------------------------------------------------------------------\n// Internal sync pixel loading\n// ---------------------------------------------------------------------------\n\nfunction loadPixelsSync(source: BrowserSource) {\n if (typeof HTMLImageElement !== 'undefined' && source instanceof HTMLImageElement) {\n return loadFromImage(source);\n }\n if (typeof HTMLCanvasElement !== 'undefined' && source instanceof HTMLCanvasElement) {\n return loadFromCanvas(source);\n }\n if (typeof ImageData !== 'undefined' && source instanceof ImageData) {\n return { data: source.data, width: source.width, height: source.height };\n }\n if (typeof HTMLVideoElement !== 'undefined' && source instanceof HTMLVideoElement) {\n return loadFromVideo(source);\n }\n if (typeof ImageBitmap !== 'undefined' && source instanceof ImageBitmap) {\n return loadFromImageBitmap(source);\n }\n if (typeof OffscreenCanvas !== 'undefined' && source instanceof OffscreenCanvas) {\n return loadFromOffscreenCanvas(source);\n }\n throw new Error(\n 'Unsupported source type. Expected HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageData, ImageBitmap, or OffscreenCanvas.',\n );\n}\n\nfunction loadFromImage(img: HTMLImageElement) {\n if (!img.complete) {\n throw new Error(\n 'Image has not finished loading. Wait for the \"load\" event before calling getColorSync/getPaletteSync.',\n );\n }\n if (!img.naturalWidth) {\n throw new Error(\n 'Image has no dimensions. It may not have loaded successfully.',\n );\n }\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n const width = (canvas.width = img.naturalWidth);\n const height = (canvas.height = img.naturalHeight);\n ctx.drawImage(img, 0, 0, width, height);\n try {\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n } catch (e: unknown) {\n if (e instanceof DOMException && e.name === 'SecurityError') {\n const err = new Error(\n 'Image is tainted by cross-origin data. Add crossorigin=\"anonymous\" to the <img> tag and ensure the server sends appropriate CORS headers.',\n );\n err.cause = e;\n throw err;\n }\n throw e;\n }\n}\n\nfunction loadFromCanvas(canvas: HTMLCanvasElement) {\n const ctx = canvas.getContext('2d')!;\n const { width, height } = canvas;\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n}\n\nfunction loadFromVideo(video: HTMLVideoElement) {\n if (video.readyState < 2) {\n throw new Error(\n 'Video is not ready. Wait for the \"loadeddata\" or \"canplay\" event before calling getColorSync/getPaletteSync.',\n );\n }\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (!width || !height) {\n throw new Error(\n 'Video has no dimensions. It may not have loaded successfully.',\n );\n }\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = width;\n canvas.height = height;\n ctx.drawImage(video, 0, 0, width, height);\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n}\n\nfunction loadFromOffscreenCanvas(canvas: OffscreenCanvas) {\n const ctx = canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n if (!ctx) {\n throw new Error(\n 'Could not get 2D context from OffscreenCanvas.',\n );\n }\n const { width, height } = canvas;\n const imageData = ctx.getImageData(0, 0, width, height);\n return { data: imageData.data, width, height };\n}\n\nfunction loadFromImageBitmap(bitmap: ImageBitmap) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n ctx.drawImage(bitmap, 0, 0);\n const imageData = ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n return { data: imageData.data, width: bitmap.width, height: bitmap.height };\n}\n","// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\nexport {\n getColor,\n getPalette,\n getSwatches,\n getPaletteProgressive,\n configure,\n} from './api.js';\n\n// ---------------------------------------------------------------------------\n// Sync browser API\n// ---------------------------------------------------------------------------\nexport {\n getColorSync,\n getPaletteSync,\n getSwatchesSync,\n} from './sync.js';\n\n// ---------------------------------------------------------------------------\n// Live extraction (browser only)\n// ---------------------------------------------------------------------------\nexport { observe } from './observe.js';\nexport type { ObservableSource, ObserveOptions, ObserveController } from './observe.js';\n\n// ---------------------------------------------------------------------------\n// Color factory\n// ---------------------------------------------------------------------------\nexport { createColor } from './color.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\nexport type {\n RGB,\n HSL,\n OKLCH,\n FilterOptions,\n ColorSpace,\n ExtractionOptions,\n ContrastInfo,\n Color,\n CssColorFormat,\n SwatchRole,\n Swatch,\n SwatchMap,\n BrowserSource,\n NodeSource,\n ImageSource,\n ProgressiveResult,\n} from './types.js';\n\nexport type { SyncExtractionOptions } from './sync.js';\n","import { getColorSync } from 'colorthief';\n\n/**\n * Extracts the dominant color from an HTML image element using Color Thief\n * @param img - The HTML image element to analyze\n * @returns Promise that resolves to hex color string (e.g. \"#ff0000\")\n */\nexport const getDominantColor = (img: HTMLImageElement): Promise<string> => {\n return new Promise((resolve, reject) => {\n if (!img.complete || img.naturalWidth === 0) {\n reject(new Error(\"Image not loaded\"));\n return;\n }\n\n try {\n const color = getColorSync(img);\n if (color) {\n const hex = color.hex();\n if (!/^#[0-9a-fA-F]{6}$/.test(hex)) {\n reject(new Error(`Invalid color extracted: ${hex}`));\n } else {\n resolve(hex);\n }\n } else {\n reject(new Error(\"No color extracted\"));\n }\n } catch (error: any) {\n reject(new Error(`Color extraction failed: ${ error.message }`));\n }\n });\n};\n","import { ThemeTokens } from \"@/preferences/hooks/useTheming\";\nimport { getDominantColor } from \"@/preferences/helpers/getDominantColor\";\n\nconst hexToHsl = (hex: string): [number, number, number] => {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n const h = max === r ? ((g - b) / d + (g < b ? 6 : 0)) / 6\n : max === g ? ((b - r) / d + 2) / 6\n : ((r - g) / d + 4) / 6;\n return [h, s, l];\n};\n\nconst hslToHex = (h: number, s: number, l: number): string => {\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => {\n const k = (n + h * 12) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, \"0\");\n };\n return `#${ f(0) }${ f(8) }${ f(4) }`;\n};\n\n/** WCAG relative luminance of a hex color (0–1) */\nconst luminance = (hex: string): number => {\n const toLinear = (c: number) => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n const r = toLinear(parseInt(hex.slice(1, 3), 16) / 255);\n const g = toLinear(parseInt(hex.slice(3, 5), 16) / 255);\n const b = toLinear(parseInt(hex.slice(5, 7), 16) / 255);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/** WCAG contrast ratio between two hex colors */\nconst contrastRatio = (a: string, b: string): number => {\n const l1 = luminance(a), l2 = luminance(b);\n return (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05);\n};\n\n/**\n * Determines if a hex color is light or dark based on luminance\n */\nexport const isLightColor = (hexColor: string): boolean => luminance(hexColor) > 0.179;\n\n/**\n * Produces a muted shade of the dominant color suitable for use as a background.\n * Light variant: high lightness + low saturation (Spotify/Apple Music style).\n * Dark variant: low lightness + moderate saturation.\n */\nconst shadeColor = (hex: string, isLight: boolean): string => {\n const [h, s] = hexToHsl(hex);\n return isLight\n ? hslToHex(h, Math.min(s, 0.25), 0.93)\n : hslToHex(h, Math.min(s, 0.30), 0.13);\n};\n\n/**\n * Generates a complete ThemeTokens object from a dominant color.\n * Neutrals are derived from the background hue; accents use the dominant hue;\n * text is chosen by WCAG contrast ratio.\n */\nexport const generateThemeFromColor = (color: string): ThemeTokens => {\n const [h, s] = hexToHsl(color);\n const isLight = isLightColor(color);\n const background = shadeColor(color, isLight);\n\n // Text: pick black or white by whichever meets better WCAG contrast\n const text = contrastRatio(background, \"#ffffff\") >= contrastRatio(background, \"#000000\")\n ? \"#ffffff\"\n : \"#000000\";\n\n // Neutrals derived from the background hue\n const subdue = isLight ? hslToHex(h, Math.min(s, 0.15), 0.55) : hslToHex(h, Math.min(s, 0.15), 0.55);\n const hover = isLight ? hslToHex(h, Math.min(s, 0.20), 0.83) : hslToHex(h, Math.min(s, 0.20), 0.22);\n const elevate = `0px 0px 2px ${ isLight ? hslToHex(h, 0.10, 0.70) : hslToHex(h, 0.10, 0.08) }`;\n\n // Accents use the dominant hue\n const link = isLight ? hslToHex(h, 0.70, 0.35) : hslToHex(h, 0.80, 0.72);\n const visited = isLight ? hslToHex(h, 0.50, 0.28) : hslToHex(h, 0.55, 0.60);\n const select = hslToHex(h, 0.60, isLight ? 0.80 : 0.35);\n const focus = hslToHex(h, 0.90, isLight ? 0.40 : 0.65);\n\n return {\n background,\n text,\n link,\n visited,\n subdue,\n disable: subdue,\n hover,\n onHover: text,\n select,\n onSelect: \"inherit\",\n focus,\n elevate,\n immerse: isLight ? \"0.6\" : \"0.4\",\n };\n};\n\n/**\n * Extracts dominant color from an image URL and generates theme tokens\n */\nexport const extractThemeFromImage = async (imageUrl: string): Promise<ThemeTokens> => {\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n\n await new Promise<void>((resolve, reject) => {\n img.onload = () => {\n if (img.naturalWidth === 0) {\n reject(new Error(\"Image loaded but has no content (blocked or corrupt)\"));\n } else {\n resolve();\n }\n };\n img.onerror = () => reject(new Error(`Failed to load image: ${imageUrl}`));\n img.src = imageUrl;\n });\n\n const dominantColor = await getDominantColor(img);\n return generateThemeFromColor(dominantColor);\n};\n","/**\n * Rewrites an absolute external URL through the local proxy API to avoid CORS issues.\n * Relative URLs and non-http(s) URLs are returned unchanged.\n */\nexport const proxyUrl = (url: string | undefined): string | undefined => {\n if (!url) return undefined;\n\n try {\n const parsed = new URL(url);\n if (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") {\n return `/api/proxy?url=${ encodeURIComponent(url) }`;\n }\n } catch {\n // relative or invalid — return as-is\n }\n\n return url;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { ThBreakpoints } from \"@/preferences/models\";\nimport { BreakpointsMap } from \"./useBreakpoints\";\n\ntype ThBreakpointRange = {\n min: number | null;\n max: number | null;\n};\n\nconst initRanges = (prefs: BreakpointsMap<number | null>) => {\n const ranges: Partial<Record<ThBreakpoints, ThBreakpointRange>> = {};\n\n let prev: null | number = null;\n\n Object.entries(prefs).forEach(([key, value]) => {\n if (value && !isNaN(value)) {\n const max = value;\n const min = prev ? prev + 1 : null;\n ranges[key as ThBreakpoints] = { min, max };\n prev = value;\n } else if (!value && key === ThBreakpoints.xLarge && prev) {\n ranges[key as ThBreakpoints] = { min: prev + 1, max: null };\n }\n });\n\n return ranges;\n};\n\nconst resolveBreakpoint = (\n width: number,\n ranges: Partial<Record<ThBreakpoints, ThBreakpointRange>>\n): ThBreakpoints | null => {\n for (const [key, range] of Object.entries(ranges) as [ThBreakpoints, ThBreakpointRange][]) {\n const { min, max } = range;\n if (min !== null && width < min) continue;\n if (max !== null && width > max) continue;\n return key;\n }\n return null;\n};\n\nexport const useContainerBreakpoints = (\n map: BreakpointsMap<number | null>,\n onChange?: (breakpoint: ThBreakpoints | null) => void\n): (el: Element | null) => void => {\n const [containerEl, setContainerEl] = useState<Element | null>(null);\n\n useEffect(() => {\n if (!containerEl) return;\n\n const ranges = initRanges(map);\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n const width = entry.contentRect.width;\n const breakpoint = resolveBreakpoint(width, ranges);\n onChange?.(breakpoint);\n });\n\n observer.observe(containerEl);\n return () => observer.disconnect();\n }, [containerEl, map, onChange]);\n\n return useCallback((el: Element | null) => {\n setContainerEl(el);\n }, []);\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { ThBreakpoints, CSSColor } from \"../models\";\n\nimport { BreakpointsMap, useBreakpoints } from \"@/core/Hooks/useBreakpoints\";\nimport { useReducedMotion } from \"@/core/Hooks/useReducedMotion\";\nimport { useReducedTransparency } from \"@/core/Hooks/useReducedTransparency\";\nimport { ThColorScheme, useColorScheme } from \"@/core/Hooks/useColorScheme\";\nimport { ThContrast, useContrast } from \"@/core/Hooks/useContrast\";\nimport { useForcedColors } from \"@/core/Hooks/useForcedColors\";\nimport { useMonochrome } from \"@/core/Hooks/useMonochrome\";\n\nimport { propsToCSSVars } from \"@/core/Helpers/propsToCSSVars\";\nimport { prefixString } from \"@/core/Helpers/prefixString\";\nimport { extractThemeFromImage } from \"../helpers/themeGeneration\";\nimport { proxyUrl } from \"@/helpers/proxyUrl\";\nimport { useContainerBreakpoints } from \"@/core/Hooks/useContainerBreakpoints\";\n\nexport interface ThemeTokens {\n background: CSSColor;\n text: CSSColor;\n link: CSSColor;\n visited: CSSColor;\n subdue: CSSColor;\n disable: CSSColor;\n hover: CSSColor;\n onHover: CSSColor;\n select: CSSColor;\n onSelect: CSSColor;\n focus: CSSColor;\n elevate: string;\n immerse: string;\n}\n\nexport interface useThemingProps<T extends string> {\n theme?: string;\n themeKeys: { [key in T]?: ThemeTokens };\n systemKeys?: {\n light: T;\n dark: T;\n };\n breakpointsMap: BreakpointsMap<number | null>;\n initProps?: Record<string, any>;\n coverUrl?: string;\n autoThemeSource?: \"cover\" | \"system\";\n onCoverThemeGenerated?: (themeTokens: ThemeTokens) => void;\n onBreakpointChange?: (breakpoint: ThBreakpoints | null) => void;\n onColorSchemeChange?: (colorScheme: ThColorScheme) => void;\n onContrastChange?: (contrast: ThContrast) => void;\n onForcedColorsChange?: (forcedColors: boolean) => void;\n onMonochromeChange?: (isMonochrome: boolean) => void;\n onReducedMotionChange?: (reducedMotion: boolean) => void;\n onReducedTransparencyChange?: (reducedTransparency: boolean) => void;\n onContainerBreakpointChange?: (breakpoint: ThBreakpoints | null) => void;\n}\n\n// Takes care of the init of theming and side effects on :root/html\n// Reader still has to handle the side effects on Navigator\nexport const useTheming = <T extends string>({\n theme,\n systemKeys,\n themeKeys,\n breakpointsMap,\n initProps,\n coverUrl,\n autoThemeSource,\n onBreakpointChange,\n onColorSchemeChange,\n onContrastChange,\n onForcedColorsChange,\n onMonochromeChange,\n onReducedMotionChange,\n onReducedTransparencyChange,\n onCoverThemeGenerated,\n onContainerBreakpointChange,\n}: useThemingProps<T>) => {\n const [coverThemeTokens, setCoverThemeTokens] = useState<ThemeTokens | null>(null);\n const [coverThemeFailed, setCoverThemeFailed] = useState(false);\n \n const breakpoints = useBreakpoints(breakpointsMap, onBreakpointChange);\n const setContainerRef = useContainerBreakpoints(breakpointsMap, onContainerBreakpointChange);\n const colorScheme = useColorScheme(onColorSchemeChange);\n const colorSchemeRef = useRef(colorScheme);\n const contrast = useContrast(onContrastChange);\n const forcedColors = useForcedColors(onForcedColorsChange);\n const monochrome = useMonochrome(onMonochromeChange);\n const reducedMotion = useReducedMotion(onReducedMotionChange);\n const reducedTransparency = useReducedTransparency(onReducedTransparencyChange);\n \n // Extract theme from cover when needed\n useEffect(() => {\n if (autoThemeSource === \"cover\" && coverUrl && !coverThemeTokens) {\n const extractTheme = async () => {\n try {\n const themeTokens = await extractThemeFromImage(proxyUrl(coverUrl) ?? coverUrl);\n setCoverThemeTokens(themeTokens);\n onCoverThemeGenerated?.(themeTokens);\n } catch (error) {\n console.warn(\"Failed to extract cover theme:\", error);\n setCoverThemeFailed(true);\n }\n };\n \n extractTheme();\n }\n }, [autoThemeSource, coverUrl, coverThemeTokens, onCoverThemeGenerated]);\n\n const updateThemeColorMetaTag = useCallback((color: string): void => {\n if (typeof document === \"undefined\") return;\n \n let metaTag = document.querySelector(\"meta[name='theme-color']\");\n if (!metaTag) {\n metaTag = document.createElement(\"meta\");\n metaTag.setAttribute(\"name\", \"theme-color\");\n document.head.appendChild(metaTag);\n }\n metaTag.setAttribute(\"content\", color);\n }, []);\n\n const initThemingCustomProps = useCallback(() => {\n for (let p in initProps) {\n document.documentElement.style.setProperty(p, initProps[p])\n }\n }, [initProps]);\n\n const inferThemeAuto = useCallback(() => {\n if (autoThemeSource === \"cover\") {\n if (coverThemeTokens) return \"cover\" as T;\n // Pending: hold until resolved; failed: fall back to system\n if (!coverThemeFailed) return undefined;\n }\n // Default behavior: use colorScheme (system)\n return colorSchemeRef.current === ThColorScheme.dark ? systemKeys?.dark : systemKeys?.light;\n }, [systemKeys, autoThemeSource, coverThemeTokens, coverThemeFailed]);\n\n const setThemeCustomProps = useCallback((t?: string) => {\n if (!t) {\n return;\n }\n\n if (t === \"auto\") {\n const autoTheme = inferThemeAuto();\n if (!autoTheme) {\n // We are not removing properties cos iframes won't update\n // Removing here would consequently create a theme inconsistency\n // between the iframe and the main window\n return;\n }\n t = autoTheme;\n }\n \n let themeTokens: ThemeTokens | undefined;\n \n if (t === \"cover\" && coverThemeTokens) {\n // Use the generated cover theme tokens\n themeTokens = coverThemeTokens;\n } else {\n // Use predefined theme keys\n themeTokens = themeKeys[t as T];\n }\n \n if (!themeTokens) {\n // We are not removing properties cos iframes won't update\n // Removing here would consequently create a theme inconsistency\n // between the iframe and the main window\n return;\n }\n \n const props = propsToCSSVars(themeTokens, { prefix: prefixString(\"theme\") });\n \n for (let p in props) {\n document.documentElement.style.setProperty(p, props[p])\n }\n\n updateThemeColorMetaTag(themeTokens.background);\n }, [inferThemeAuto, updateThemeColorMetaTag, themeKeys, coverThemeTokens]);\n\n // On mount add custom props to :root/html\n useEffect(() => {\n initThemingCustomProps();\n }, [initThemingCustomProps]);\n\n // Update theme custom props\n useEffect(() => {\n colorSchemeRef.current = colorScheme;\n setThemeCustomProps(theme);\n }, [setThemeCustomProps, theme, colorScheme]);\n\n // Apply cover theme as soon as tokens are available\n useEffect(() => {\n if (!coverThemeTokens || theme !== \"auto\") return;\n const props = propsToCSSVars(coverThemeTokens, { prefix: prefixString(\"theme\") });\n for (let p in props) {\n document.documentElement.style.setProperty(p, props[p]);\n }\n updateThemeColorMetaTag(coverThemeTokens.background);\n }, [coverThemeTokens, theme, updateThemeColorMetaTag]);\n\n const themeResolved = autoThemeSource !== \"cover\" || !coverUrl || !!coverThemeTokens || coverThemeFailed;\n\n return {\n inferThemeAuto,\n theme,\n breakpoints,\n colorScheme,\n contrast,\n forcedColors,\n monochrome,\n reducedMotion,\n reducedTransparency,\n coverThemeTokens,\n themeResolved,\n setContainerRef\n }\n}\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ThIconPref, ThLayoutDefaultsPref, ThShortcutsPref } from \"../preferences\";\nimport { ThAudioPreferencesContext } from \"../ThAudioPreferencesContext\";\nimport { ThPreferencesContext } from \"../ThPreferencesContext\";\nimport { ThBackLinkPref, ThDockingKeys, ThDockingPref } from \"../models\";\nimport { ThemeTokens } from \"./useTheming\";\nimport { BreakpointsMap } from \"@/core/Hooks/useBreakpoints\";\n\nexport interface SharedPreferences {\n shortcuts: ThShortcutsPref;\n docking: ThDockingPref<ThDockingKeys>;\n theming: {\n icon: ThIconPref;\n header?: {\n backLink?: ThBackLinkPref | null;\n };\n themes: {\n systemThemes?: { light: string; dark: string };\n keys: Record<string, ThemeTokens>;\n audioOrder?: Array<string>;\n reflowOrder?: Array<string>;\n fxlOrder?: Array<string>;\n };\n layout: {\n defaults: ThLayoutDefaultsPref;\n };\n breakpoints: BreakpointsMap<number | null>;\n };\n}\n\n/**\n * Resolves preference values that are shared across both provider trees\n * (audio and reader). Both providers expose these fields — this hook picks\n * the active one so callers never need to touch the contexts directly.\n */\nexport const useSharedPreferences = (): SharedPreferences => {\n const audioCtx = useContext(ThAudioPreferencesContext);\n const readerCtx = useContext(ThPreferencesContext);\n\n const ctx = audioCtx ?? readerCtx;\n\n if (!ctx) throw new Error(\"useSharedPreferences must be used within a ThPreferencesProvider or ThAudioPreferencesProvider\");\n\n const prefs = ctx.preferences;\n\n return {\n shortcuts: prefs.shortcuts,\n docking: prefs.docking,\n theming: {\n icon: prefs.theming.icon,\n header: prefs.theming.header\n ? { backLink: prefs.theming.header.backLink }\n : undefined,\n themes: {\n systemThemes: prefs.theming.themes.systemThemes as { light: string; dark: string } | undefined,\n keys: prefs.theming.themes.keys as Record<string, ThemeTokens>,\n audioOrder: audioCtx?.preferences.theming.themes.audioOrder as Array<string> | undefined,\n reflowOrder: readerCtx?.preferences.theming.themes.reflowOrder as Array<string> | undefined,\n fxlOrder: readerCtx?.preferences.theming.themes.fxlOrder as Array<string> | undefined,\n },\n layout: {\n defaults: prefs.theming.layout.defaults,\n },\n breakpoints: prefs.theming.breakpoints,\n },\n };\n};\n"]}