{"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-UOFADXXI.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      // Only hold while actively fetching; no URL or fetch failed → fall through to system\n      if (!coverThemeFailed && coverUrl) return undefined;\n    }\n    // Default behavior: use colorScheme (system)\n    return colorSchemeRef.current === ThColorScheme.dark ? systemKeys?.dark : systemKeys?.light;\n  }, [systemKeys, autoThemeSource, coverThemeTokens, coverThemeFailed, coverUrl]);\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"]}