{"version":3,"file":"progressive-enhancement-utils.mjs","sources":["../../../src/lib/ux/progressive-enhancement-utils.ts"],"sourcesContent":["/**\n * @file Progressive Enhancement Utilities\n * @description Utility functions and constants for progressive enhancement\n */\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default browser capabilities for SSR\n */\nexport const DEFAULT_CAPABILITIES = {\n  esModules: true,\n  asyncAwait: true,\n  webGL: true,\n  webGL2: true,\n  webP: true,\n  avif: true,\n  serviceWorker: true,\n  webWorker: true,\n  sharedArrayBuffer: false,\n  intersectionObserver: true,\n  resizeObserver: true,\n  cssGrid: true,\n  containerQueries: true,\n  cssHas: true,\n  viewTransitions: true,\n  navigationAPI: true,\n  broadcastChannel: true,\n  webLocks: true,\n  storage: true,\n  indexedDB: true,\n  webAssembly: true,\n  bigInt: true,\n  proxy: true,\n  weakMap: true,\n  fetch: true,\n  streams: true,\n  modules: true,\n  dynamicImport: true,\n  topLevelAwait: true,\n  popoverAPI: true,\n  webAnimations: true,\n  idleCallback: true,\n  intl: true,\n} as const;\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get default capabilities\n */\nexport function getDefaultCapabilities(): typeof DEFAULT_CAPABILITIES {\n  return DEFAULT_CAPABILITIES;\n}\n\n/**\n * Check WebP support asynchronously\n */\nexport async function checkWebPSupport(): Promise<boolean> {\n  return new Promise((resolve) => {\n    const img = new Image();\n    img.onload = () => resolve(img.width > 0 && img.height > 0);\n    img.onerror = () => resolve(false);\n    img.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n  });\n}\n\n/**\n * Check AVIF support asynchronously\n */\nexport async function checkAVIFSupport(): Promise<boolean> {\n  return new Promise((resolve) => {\n    const img = new Image();\n    img.onload = () => resolve(img.width > 0 && img.height > 0);\n    img.onerror = () => resolve(false);\n    img.src =\n      'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKBzgADlAgIGkyCR/wAABAAACvcA==';\n  });\n}\n\n/**\n * Check async/await support\n */\nexport function hasAsyncAwait(): boolean {\n  try {\n    // Check if async/await is supported by testing constructor\n    return typeof async function () {}.constructor === 'function';\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check WebGL support\n */\nexport function hasWebGL(): boolean {\n  try {\n    const canvas = document.createElement('canvas');\n    return !!(canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl'));\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check WebGL2 support\n */\nexport function hasWebGL2(): boolean {\n  try {\n    const canvas = document.createElement('canvas');\n    return !!canvas.getContext('webgl2');\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Create a progressive feature definition\n */\nexport function createFeature(\n  id: string,\n  config: {\n    loader: () => Promise<unknown>;\n    dependencies?: string[];\n    polyfill?: () => Promise<void>;\n    requirements?: Array<keyof typeof DEFAULT_CAPABILITIES>;\n    fallback?: () => Promise<unknown>;\n    priority?: 'critical' | 'high' | 'normal' | 'low';\n    preload?: boolean;\n  }\n): {\n  id: string;\n  loader: () => Promise<unknown>;\n  dependencies?: string[];\n  polyfill?: () => Promise<void>;\n  requirements?: Array<keyof typeof DEFAULT_CAPABILITIES>;\n  fallback?: () => Promise<unknown>;\n  priority?: 'critical' | 'high' | 'normal' | 'low';\n  preload?: boolean;\n} {\n  return { id, ...config };\n}\n\n// ============================================================================\n// Browser Capability Detection\n// ============================================================================\n\n/**\n * Browser capabilities interface\n */\nexport interface BrowserCapabilities {\n  /** Supports ES modules */\n  esModules: boolean;\n  /** Supports async/await */\n  asyncAwait: boolean;\n  /** Supports WebGL */\n  webGL: boolean;\n  /** Supports WebGL2 */\n  webGL2: boolean;\n  /** Supports WebP images */\n  webP: boolean;\n  /** Supports AVIF images */\n  avif: boolean;\n  /** Supports Service Workers */\n  serviceWorker: boolean;\n  /** Supports Web Workers */\n  webWorker: boolean;\n  /** Supports SharedArrayBuffer */\n  sharedArrayBuffer: boolean;\n  /** Supports IntersectionObserver */\n  intersectionObserver: boolean;\n  /** Supports ResizeObserver */\n  resizeObserver: boolean;\n  /** Supports CSS Grid */\n  cssGrid: boolean;\n  /** Supports CSS Container Queries */\n  containerQueries: boolean;\n  /** Supports CSS :has() */\n  cssHas: boolean;\n  /** Supports View Transitions API */\n  viewTransitions: boolean;\n  /** Supports Navigation API */\n  navigationAPI: boolean;\n  /** Supports Popover API */\n  popoverAPI: boolean;\n  /** Supports Web Animations API */\n  webAnimations: boolean;\n  /** Supports requestIdleCallback */\n  idleCallback: boolean;\n  /** Supports Intl API */\n  intl: boolean;\n}\n\n/**\n * Detect browser capabilities\n */\nexport function detectCapabilities(): BrowserCapabilities {\n  if (typeof window === 'undefined') {\n    // SSR - assume modern browser\n    return getDefaultCapabilities();\n  }\n\n  return {\n    esModules: 'noModule' in HTMLScriptElement.prototype,\n    asyncAwait: hasAsyncAwait(),\n    webGL: hasWebGL(),\n    webGL2: hasWebGL2(),\n    webP: false, // Detected asynchronously\n    avif: false, // Detected asynchronously\n    serviceWorker: 'serviceWorker' in navigator,\n    webWorker: 'Worker' in window,\n    sharedArrayBuffer: 'SharedArrayBuffer' in window,\n    intersectionObserver: 'IntersectionObserver' in window,\n    resizeObserver: 'ResizeObserver' in window,\n    cssGrid: CSS.supports('display', 'grid'),\n    containerQueries: CSS.supports('container-type', 'inline-size'),\n    cssHas: CSS.supports('selector(:has(*))'),\n    viewTransitions: 'startViewTransition' in document,\n    navigationAPI: 'navigation' in window,\n    popoverAPI: 'popover' in HTMLElement.prototype,\n    webAnimations: 'animate' in Element.prototype,\n    idleCallback: 'requestIdleCallback' in window,\n    intl: 'Intl' in window,\n  };\n}\n\n/**\n * Get capabilities without React\n */\nexport function getCapabilities(): BrowserCapabilities {\n  return detectCapabilities();\n}\n"],"names":["DEFAULT_CAPABILITIES","getDefaultCapabilities","checkWebPSupport","resolve","img","checkAVIFSupport","hasAsyncAwait","hasWebGL","canvas","hasWebGL2","createFeature","id","config","detectCapabilities","getCapabilities"],"mappings":"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"}