{"version":3,"file":"responsive-optimizer.mjs","sources":["../../../src/lib/ux/responsive-optimizer.ts"],"sourcesContent":["/**\n * @file Responsive Design Optimizer\n * @description Utilities for responsive design optimization including\n * breakpoint management, container queries, and adaptive loading.\n *\n * Features:\n * - Breakpoint management\n * - Container queries polyfill\n * - Responsive image handling\n * - Adaptive component loading\n * - Device capability detection\n * - Network-aware rendering\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Breakpoint definition\n */\nexport interface Breakpoint {\n  name: string;\n  minWidth: number;\n  maxWidth?: number;\n}\n\n/**\n * Device capability info\n */\nexport interface DeviceCapabilities {\n  touchScreen: boolean;\n  highDPI: boolean;\n  prefersReducedMotion: boolean;\n  prefersColorScheme: 'light' | 'dark' | 'no-preference';\n  saveData: boolean;\n  effectiveType: '4g' | '3g' | '2g' | 'slow-2g' | 'unknown';\n  deviceMemory: number | null;\n  hardwareConcurrency: number | null;\n}\n\n/**\n * Viewport info\n */\nexport interface ViewportInfo {\n  width: number;\n  height: number;\n  orientation: 'portrait' | 'landscape';\n  devicePixelRatio: number;\n}\n\n/**\n * Responsive configuration\n */\nexport interface ResponsiveConfig {\n  /** Custom breakpoints */\n  breakpoints?: Breakpoint[];\n  /** Enable network-aware features */\n  networkAware?: boolean;\n  /** Enable device capability detection */\n  detectCapabilities?: boolean;\n  /** Debounce resize events (ms) */\n  resizeDebounce?: number;\n}\n\n/**\n * Media query condition\n */\nexport type MediaQueryCondition = {\n  minWidth?: number;\n  maxWidth?: number;\n  minHeight?: number;\n  maxHeight?: number;\n  orientation?: 'portrait' | 'landscape';\n  prefersColorScheme?: 'light' | 'dark';\n  prefersReducedMotion?: 'reduce' | 'no-preference';\n  hover?: 'hover' | 'none';\n  pointer?: 'fine' | 'coarse' | 'none';\n};\n\n/**\n * Responsive callback\n */\nexport type ResponsiveCallback = (info: {\n  breakpoint: string;\n  viewport: ViewportInfo;\n  capabilities: DeviceCapabilities;\n}) => void;\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default breakpoints (similar to Tailwind CSS)\n */\nexport const DEFAULT_BREAKPOINTS: Breakpoint[] = [\n  { name: 'xs', minWidth: 0, maxWidth: 639 },\n  { name: 'sm', minWidth: 640, maxWidth: 767 },\n  { name: 'md', minWidth: 768, maxWidth: 1023 },\n  { name: 'lg', minWidth: 1024, maxWidth: 1279 },\n  { name: 'xl', minWidth: 1280, maxWidth: 1535 },\n  { name: '2xl', minWidth: 1536 },\n];\n\n// ============================================================================\n// Responsive Manager\n// ============================================================================\n\n/**\n * Manages responsive behavior\n */\nexport class ResponsiveManager {\n  private config: Required<ResponsiveConfig>;\n  private readonly breakpoints: Breakpoint[];\n  private currentBreakpoint: string = '';\n  private listeners: Set<ResponsiveCallback> = new Set();\n  private resizeObserver: ResizeObserver | null = null;\n  private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n  private mediaQueryLists: Map<string, MediaQueryList> = new Map();\n\n  constructor(config: ResponsiveConfig = {}) {\n    this.config = {\n      breakpoints: config.breakpoints ?? DEFAULT_BREAKPOINTS,\n      networkAware: config.networkAware ?? true,\n      detectCapabilities: config.detectCapabilities ?? true,\n      resizeDebounce: config.resizeDebounce ?? 100,\n    };\n    this.breakpoints = this.config.breakpoints;\n    this.init();\n  }\n\n  /**\n   * Get current breakpoint name\n   */\n  getBreakpoint(): string {\n    return this.currentBreakpoint;\n  }\n\n  /**\n   * Get viewport info\n   */\n  getViewport(): ViewportInfo {\n    if (typeof window === 'undefined') {\n      return {\n        width: 1024,\n        height: 768,\n        orientation: 'landscape',\n        devicePixelRatio: 1,\n      };\n    }\n\n    const width = window.innerWidth;\n    const height = window.innerHeight;\n\n    return {\n      width,\n      height,\n      orientation: width > height ? 'landscape' : 'portrait',\n      devicePixelRatio: window.devicePixelRatio || 1,\n    };\n  }\n\n  /**\n   * Get device capabilities\n   */\n  getCapabilities(): DeviceCapabilities {\n    if (typeof window === 'undefined') {\n      return {\n        touchScreen: false,\n        highDPI: false,\n        prefersReducedMotion: false,\n        prefersColorScheme: 'light',\n        saveData: false,\n        effectiveType: 'unknown',\n        deviceMemory: null,\n        hardwareConcurrency: null,\n      };\n    }\n\n    const nav = navigator as Navigator & {\n      connection?: {\n        effectiveType?: string;\n        saveData?: boolean;\n      };\n      deviceMemory?: number;\n    };\n\n    return {\n      touchScreen: 'ontouchstart' in window || navigator.maxTouchPoints > 0,\n      highDPI: window.devicePixelRatio > 1,\n      prefersReducedMotion: window.matchMedia('(prefers-reduced-motion: reduce)').matches,\n      prefersColorScheme: this.getColorScheme(),\n      saveData: nav.connection?.saveData ?? false,\n      effectiveType: (nav.connection?.effectiveType as DeviceCapabilities['effectiveType']) ?? 'unknown',\n      deviceMemory: nav.deviceMemory ?? null,\n      hardwareConcurrency: navigator.hardwareConcurrency ?? null,\n    };\n  }\n\n  /**\n   * Check if current breakpoint matches\n   */\n  isBreakpoint(name: string): boolean {\n    return this.currentBreakpoint === name;\n  }\n\n  /**\n   * Check if current breakpoint is at least the given size\n   */\n  isBreakpointAtLeast(name: string): boolean {\n    const currentIndex = this.breakpoints.findIndex(\n      (b) => b.name === this.currentBreakpoint\n    );\n    const targetIndex = this.breakpoints.findIndex((b) => b.name === name);\n    return currentIndex >= targetIndex;\n  }\n\n  /**\n   * Check if current breakpoint is at most the given size\n   */\n  isBreakpointAtMost(name: string): boolean {\n    const currentIndex = this.breakpoints.findIndex(\n      (b) => b.name === this.currentBreakpoint\n    );\n    const targetIndex = this.breakpoints.findIndex((b) => b.name === name);\n    return currentIndex <= targetIndex;\n  }\n\n  /**\n   * Create a media query from conditions\n   */\n  createMediaQuery(conditions: MediaQueryCondition): string {\n    const parts: string[] = [];\n\n    if (conditions.minWidth !== undefined) {\n      parts.push(`(min-width: ${conditions.minWidth}px)`);\n    }\n    if (conditions.maxWidth !== undefined) {\n      parts.push(`(max-width: ${conditions.maxWidth}px)`);\n    }\n    if (conditions.minHeight !== undefined) {\n      parts.push(`(min-height: ${conditions.minHeight}px)`);\n    }\n    if (conditions.maxHeight !== undefined) {\n      parts.push(`(max-height: ${conditions.maxHeight}px)`);\n    }\n    if (conditions.orientation) {\n      parts.push(`(orientation: ${conditions.orientation})`);\n    }\n    if (conditions.prefersColorScheme) {\n      parts.push(`(prefers-color-scheme: ${conditions.prefersColorScheme})`);\n    }\n    if (conditions.prefersReducedMotion) {\n      parts.push(`(prefers-reduced-motion: ${conditions.prefersReducedMotion})`);\n    }\n    if (conditions.hover) {\n      parts.push(`(hover: ${conditions.hover})`);\n    }\n    if (conditions.pointer) {\n      parts.push(`(pointer: ${conditions.pointer})`);\n    }\n\n    return parts.join(' and ');\n  }\n\n  /**\n   * Match a media query\n   */\n  matchMedia(query: string | MediaQueryCondition): boolean {\n    if (typeof window === 'undefined') return false;\n\n    const queryString = typeof query === 'string' ? query : this.createMediaQuery(query);\n    return window.matchMedia(queryString).matches;\n  }\n\n  /**\n   * Subscribe to media query changes\n   */\n  onMediaChange(\n    query: string | MediaQueryCondition,\n    callback: (matches: boolean) => void\n  ): () => void {\n    if (typeof window === 'undefined') return () => {};\n\n    const queryString = typeof query === 'string' ? query : this.createMediaQuery(query);\n\n    let mql = this.mediaQueryLists.get(queryString);\n    if (!mql) {\n      mql = window.matchMedia(queryString);\n      this.mediaQueryLists.set(queryString, mql);\n    }\n\n    const handler = (event: MediaQueryListEvent): void => {\n      callback(event.matches);\n    };\n\n    mql.addEventListener('change', handler);\n\n    // Initial call\n    callback(mql.matches);\n\n    return () => {\n      mql?.removeEventListener('change', handler);\n    };\n  }\n\n  /**\n   * Subscribe to responsive changes\n   */\n  subscribe(callback: ResponsiveCallback): () => void {\n    this.listeners.add(callback);\n\n    // Initial call\n    callback({\n      breakpoint: this.currentBreakpoint,\n      viewport: this.getViewport(),\n      capabilities: this.getCapabilities(),\n    });\n\n    return () => this.listeners.delete(callback);\n  }\n\n  /**\n   * Get responsive value based on breakpoint\n   */\n  getValue<T>(values: Partial<Record<string, T>>, defaultValue: T): T {\n    // Check current breakpoint first\n    if (this.currentBreakpoint in values) {\n      const value = values[this.currentBreakpoint];\n      if (value !== undefined) return value;\n    }\n\n    // Fall back to smaller breakpoints\n    for (let i = this.breakpoints.length - 1; i >= 0; i--) {\n      const bp = this.breakpoints[i];\n      if (!bp) continue;\n      if (bp.name in values) {\n        const value = values[bp.name];\n        if (value !== undefined) return value;\n      }\n    }\n\n    return defaultValue;\n  }\n\n  /**\n   * Destroy the manager\n   */\n  destroy(): void {\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n      this.resizeObserver = null;\n    }\n\n    if (this.resizeTimer) {\n      clearTimeout(this.resizeTimer);\n      this.resizeTimer = null;\n    }\n\n    this.listeners.clear();\n    this.mediaQueryLists.clear();\n  }\n\n  /**\n   * Get color scheme preference\n   */\n  private getColorScheme(): 'light' | 'dark' | 'no-preference' {\n    if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n      return 'dark';\n    }\n    if (window.matchMedia('(prefers-color-scheme: light)').matches) {\n      return 'light';\n    }\n    return 'no-preference';\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  private init(): void {\n    if (typeof window === 'undefined') return;\n\n    // Set initial breakpoint\n    this.updateBreakpoint();\n\n    // Listen for resize\n    window.addEventListener('resize', this.handleResize);\n\n    // Listen for orientation change\n    window.addEventListener('orientationchange', this.handleResize);\n  }\n\n  private handleResize = (): void => {\n    if (this.resizeTimer) {\n      clearTimeout(this.resizeTimer);\n    }\n\n    this.resizeTimer = setTimeout(() => {\n      this.updateBreakpoint();\n    }, this.config.resizeDebounce);\n  };\n\n  private updateBreakpoint(): void {\n    const viewport = this.getViewport();\n    const newBreakpoint = this.getBreakpointForWidth(viewport.width);\n\n    if (newBreakpoint !== this.currentBreakpoint) {\n      this.currentBreakpoint = newBreakpoint;\n      this.notifyListeners();\n    }\n  }\n\n  private getBreakpointForWidth(width: number): string {\n    for (const bp of this.breakpoints) {\n      if (bp.maxWidth !== undefined) {\n        if (width >= bp.minWidth && width <= bp.maxWidth) {\n          return bp.name;\n        }\n      } else {\n        if (width >= bp.minWidth) {\n          return bp.name;\n        }\n      }\n    }\n    return this.breakpoints[0]?.name ?? 'unknown';\n  }\n\n  private notifyListeners(): void {\n    const info = {\n      breakpoint: this.currentBreakpoint,\n      viewport: this.getViewport(),\n      capabilities: this.getCapabilities(),\n    };\n\n    this.listeners.forEach((callback) => callback(info));\n  }\n}\n\n// ============================================================================\n// Container Query Utilities\n// ============================================================================\n\n/**\n * Container query condition\n */\nexport interface ContainerQueryCondition {\n  minWidth?: number;\n  maxWidth?: number;\n  minHeight?: number;\n  maxHeight?: number;\n}\n\n/**\n * Create container query observer\n */\nexport function createContainerQueryObserver(\n  container: HTMLElement,\n  queries: Array<{\n    condition: ContainerQueryCondition;\n    className: string;\n  }>,\n  callback?: (matches: Map<string, boolean>) => void\n): { observe: () => void; disconnect: () => void } {\n  let resizeObserver: ResizeObserver | null = null;\n\n  const checkQueries = (): Map<string, boolean> => {\n    const rect = container.getBoundingClientRect();\n    const matches = new Map<string, boolean>();\n\n    for (const query of queries) {\n      const { condition, className } = query;\n      let match = true;\n\n      if (condition.minWidth !== undefined && rect.width < condition.minWidth) {\n        match = false;\n      }\n      if (condition.maxWidth !== undefined && rect.width > condition.maxWidth) {\n        match = false;\n      }\n      if (condition.minHeight !== undefined && rect.height < condition.minHeight) {\n        match = false;\n      }\n      if (condition.maxHeight !== undefined && rect.height > condition.maxHeight) {\n        match = false;\n      }\n\n      matches.set(className, match);\n\n      if (match) {\n        container.classList.add(className);\n      } else {\n        container.classList.remove(className);\n      }\n    }\n\n    return matches;\n  };\n\n  const observe = (): void => {\n    resizeObserver = new ResizeObserver(() => {\n      const matches = checkQueries();\n      callback?.(matches);\n    });\n\n    resizeObserver.observe(container);\n\n    // Initial check\n    const matches = checkQueries();\n    callback?.(matches);\n  };\n\n  const disconnect = (): void => {\n    resizeObserver?.disconnect();\n    resizeObserver = null;\n\n    // Remove all query classes\n    for (const query of queries) {\n      container.classList.remove(query.className);\n    }\n  };\n\n  return { observe, disconnect };\n}\n\n// ============================================================================\n// Responsive Image Utilities\n// ============================================================================\n\n/**\n * Generate srcset for responsive images\n */\nexport function generateSrcSet(\n  baseUrl: string,\n  widths: number[],\n  format?: string\n): string {\n  return widths\n    .map((width) => {\n      const url = baseUrl.replace('{w}', String(width)).replace('{width}', String(width));\n      const finalUrl = (format !== null && format !== undefined && format !== '') ? url.replace(/\\.[^.]+$/, `.${format}`) : url;\n      return `${finalUrl} ${width}w`;\n    })\n    .join(', ');\n}\n\n/**\n * Generate sizes attribute for responsive images\n */\nexport function generateSizes(\n  breakpointSizes: Array<{ breakpoint: number; size: string }>,\n  defaultSize: string\n): string {\n  const parts = breakpointSizes\n    .sort((a, b) => b.breakpoint - a.breakpoint)\n    .map(({ breakpoint, size }) => `(min-width: ${breakpoint}px) ${size}`);\n\n  return [...parts, defaultSize].join(', ');\n}\n\n/**\n * Get optimal image width for current viewport\n */\nexport function getOptimalImageWidth(\n  containerWidth: number,\n  devicePixelRatio: number = window.devicePixelRatio || 1,\n  widths: number[] = [320, 640, 768, 1024, 1280, 1536, 1920]\n): number {\n  const targetWidth = containerWidth * devicePixelRatio;\n\n  // Find the smallest width that's larger than target\n  for (const width of widths.sort((a, b) => a - b)) {\n    if (width >= targetWidth) {\n      return width;\n    }\n  }\n\n  // Return largest available\n  const lastWidth = widths[widths.length - 1];\n  if (lastWidth === undefined) {\n    throw new Error('No widths available');\n  }\n  return lastWidth;\n}\n\n// ============================================================================\n// Adaptive Loading\n// ============================================================================\n\n/**\n * Adaptive loading configuration\n */\nexport interface AdaptiveLoadingConfig {\n  /** Load high quality on fast connections */\n  highQualityOnFastConnection: boolean;\n  /** Use lite mode on slow connections */\n  liteModeOnSlowConnection: boolean;\n  /** Defer non-critical on slow connections */\n  deferOnSlowConnection: boolean;\n  /** Reduce animations on low memory devices */\n  reduceAnimationsOnLowMemory: boolean;\n  /** Memory threshold for low memory (GB) */\n  lowMemoryThreshold: number;\n}\n\nconst DEFAULT_ADAPTIVE_CONFIG: AdaptiveLoadingConfig = {\n  highQualityOnFastConnection: true,\n  liteModeOnSlowConnection: true,\n  deferOnSlowConnection: true,\n  reduceAnimationsOnLowMemory: true,\n  lowMemoryThreshold: 4,\n};\n\n/**\n * Get adaptive loading recommendations\n */\nexport function getAdaptiveLoadingRecommendations(\n  capabilities: DeviceCapabilities,\n  config: Partial<AdaptiveLoadingConfig> = {}\n): {\n  useHighQuality: boolean;\n  useLiteMode: boolean;\n  deferNonCritical: boolean;\n  reduceAnimations: boolean;\n} {\n  const fullConfig = { ...DEFAULT_ADAPTIVE_CONFIG, ...config };\n\n  const isFastConnection = capabilities.effectiveType === '4g';\n  const isSlowConnection =\n    capabilities.effectiveType === '2g' || capabilities.effectiveType === 'slow-2g';\n  const isLowMemory =\n    capabilities.deviceMemory !== null &&\n    capabilities.deviceMemory < fullConfig.lowMemoryThreshold;\n\n  return {\n    useHighQuality: fullConfig.highQualityOnFastConnection && isFastConnection && !capabilities.saveData,\n    useLiteMode:\n      fullConfig.liteModeOnSlowConnection && (isSlowConnection || capabilities.saveData),\n    deferNonCritical:\n      fullConfig.deferOnSlowConnection && (isSlowConnection || capabilities.saveData),\n    reduceAnimations:\n      fullConfig.reduceAnimationsOnLowMemory &&\n      (isLowMemory || capabilities.prefersReducedMotion),\n  };\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet managerInstance: ResponsiveManager | null = null;\n\n/**\n * Get or create the global responsive manager\n */\nexport function getResponsiveManager(config?: ResponsiveConfig): ResponsiveManager {\n  managerInstance ??= new ResponsiveManager(config);\n  return managerInstance;\n}\n\n/**\n * Reset the manager instance\n */\nexport function resetResponsiveManager(): void {\n  if (managerInstance) {\n    managerInstance.destroy();\n    managerInstance = null;\n  }\n}\n\n// ============================================================================\n// CSS Export\n// ============================================================================\n\nexport const responsiveStyles = `\n  /* Container query support */\n  .cq-container {\n    container-type: inline-size;\n  }\n\n  /* Responsive utilities */\n  .hide-on-mobile {\n    display: none;\n  }\n\n  @media (min-width: 768px) {\n    .hide-on-mobile {\n      display: block;\n    }\n  }\n\n  .hide-on-desktop {\n    display: block;\n  }\n\n  @media (min-width: 768px) {\n    .hide-on-desktop {\n      display: none;\n    }\n  }\n\n  /* Touch-friendly spacing */\n  @media (pointer: coarse) {\n    .touch-target {\n      min-height: 44px;\n      min-width: 44px;\n    }\n  }\n\n  /* High DPI adjustments */\n  @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {\n    .border-hairline {\n      border-width: 0.5px;\n    }\n  }\n`;\n"],"names":["DEFAULT_BREAKPOINTS","ResponsiveManager","config","width","height","nav","name","currentIndex","b","targetIndex","conditions","parts","query","queryString","callback","mql","handler","event","values","defaultValue","value","i","bp","viewport","newBreakpoint","info","createContainerQueryObserver","container","queries","resizeObserver","checkQueries","rect","matches","condition","className","match","generateSrcSet","baseUrl","widths","format","url","generateSizes","breakpointSizes","defaultSize","a","breakpoint","size","getOptimalImageWidth","containerWidth","devicePixelRatio","targetWidth","lastWidth","DEFAULT_ADAPTIVE_CONFIG","getAdaptiveLoadingRecommendations","capabilities","fullConfig","isFastConnection","isSlowConnection","isLowMemory","managerInstance","getResponsiveManager","resetResponsiveManager","responsiveStyles"],"mappings":"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"}