{"version":3,"file":"index-Brt79MMs.cjs","sources":["../../lib/vowel/presets/index.ts"],"sourcesContent":["/**\n * @fileoverview Vowel Presets - Pre-configured setups for different platforms\n * \n * Presets provide quick configuration for common platforms like Shopify, WordPress, etc.\n * Each preset includes navigation adapter, automation adapter, floating cursor config,\n * and platform-specific settings.\n * \n * @module @vowel.to/client/presets\n * @author vowel.to\n * @license Proprietary\n */\n\nimport type { NavigationAdapter, AutomationAdapter, FloatingCursorConfig } from '../types';\n\n/**\n * Preset configuration for a platform\n */\nexport interface VowelPresetConfig {\n  /** Preset name */\n  name: string;\n  /** Preset description */\n  description: string;\n  /** Navigation adapter factory */\n  createNavigationAdapter: (options?: any) => NavigationAdapter | Promise<NavigationAdapter>;\n  /** Automation adapter factory */\n  createAutomationAdapter: (options?: any) => AutomationAdapter | Promise<AutomationAdapter>;\n  /** Floating cursor configuration */\n  floatingCursor?: FloatingCursorConfig;\n  /** Additional configuration */\n  additionalConfig?: Record<string, any>;\n}\n\n/**\n * Available preset names for public use\n */\nexport type PresetName = 'vanilla' | 'controlled' | 'extension';\n\n/**\n * Internal preset names (including platform-specific presets)\n * ⚠️ INTERNAL USE ONLY\n */\nexport type InternalPresetName = PresetName | 'shopify';\n\n/**\n * Shopify preset configuration\n *\n * ⚠️ INTERNAL USE ONLY - This preset is exclusively for the Vowel platform's\n * Shopify app extension and should never be exposed to or used by end users.\n * Regular users should use the \"controlled\" preset for Shopify stores.\n */\nexport const SHOPIFY_PRESET: VowelPresetConfig = {\n  name: 'shopify',\n  description: 'Optimized for Shopify storefronts with cross-tab navigation and automation',\n  \n  createNavigationAdapter: async (options?: { storeUrl?: string; channelName?: string }) => {\n    const { ShopifyNavigationAdapter } = await import('../platforms/shopify/adapters');\n    return new ShopifyNavigationAdapter(options || {});\n  },\n  \n  createAutomationAdapter: async (options?: { channelName?: string }) => {\n    const { ShopifyAutomationAdapter } = await import('../platforms/shopify/adapters');\n    return new ShopifyAutomationAdapter(options || {});\n  },\n  \n  floatingCursor: {\n    enabled: true,\n    appearance: {\n      cursorColor: '#000000',        // Black cursor\n      cursorSize: 24,                // Slightly smaller\n      badgeBackground: '#000000',    // Black pill background\n      badgeTextColor: '#ffffff',     // White text\n      badgeFontSize: 13,             // Smaller text\n      badgePadding: '6px 12px',      // Pill padding\n      badgeBorderRadius: '12px',     // Fully rounded pill\n      cursorShadow: '0 2px 8px rgba(0,0,0,0.15)',\n      badgeShadow: '0 2px 8px rgba(0,0,0,0.2)',\n    },\n    animation: {\n      enableTyping: true,\n      typingSpeed: 50,\n      enableBounce: true,\n    },\n    behavior: {\n      autoHideDelay: 0,          // NEVER auto-hide (always visible)\n      showDuringSearch: true,\n      hideOnNavigation: false,   // Stay visible during navigation\n    },\n  },\n  \n  additionalConfig: {\n    features: ['navigation', 'automation', 'addToCart', 'search'],\n  },\n};\n\n/**\n * Vanilla preset configuration (SPA navigation)\n */\nexport const VANILLA_PRESET: VowelPresetConfig = {\n  name: 'vanilla',\n  description: 'Basic setup for any website with SPA-style navigation using history.push',\n\n  createNavigationAdapter: async () => {\n    const { DirectNavigationAdapter } = await import('../adapters/navigation/direct-navigation-adapter');\n    return new DirectNavigationAdapter({\n      navigate: (path: string) => {\n        // Use history.push for SPA navigation\n        if (typeof window !== 'undefined' && window.history && window.history.pushState) {\n          window.history.pushState(null, '', path);\n          // Dispatch a popstate event to notify listeners (like routers)\n          window.dispatchEvent(new PopStateEvent('popstate', { state: null }));\n        } else {\n          // Fallback to location.href if history API not available\n          window.location.href = path;\n        }\n      },\n      getCurrentPath: () => window.location.pathname,\n    });\n  },\n  \n  createAutomationAdapter: async () => {\n    const { DirectAutomationAdapter } = await import('../adapters/automation/direct-automation-adapter');\n    return new DirectAutomationAdapter();\n  },\n  \n  floatingCursor: {\n    enabled: false, // Disabled by default for vanilla\n  },\n  \n  additionalConfig: {},\n};\n\n/**\n * Extension preset configuration\n */\nexport const EXTENSION_PRESET: VowelPresetConfig = {\n  name: 'extension',\n  description: 'Optimized for browser extensions with background script and proxy UI',\n  \n  createNavigationAdapter: async () => {\n    const { ExtensionNavigationAdapter } = await import('../platforms/extension/adapters/ExtensionNavigationAdapter');\n    return new ExtensionNavigationAdapter();\n  },\n  \n  createAutomationAdapter: async () => {\n    const { ExtensionAutomationAdapter } = await import('../platforms/extension/adapters/ExtensionAutomationAdapter');\n    return new ExtensionAutomationAdapter();\n  },\n  \n  floatingCursor: {\n    enabled: false, // Handled by proxy UI in content script\n  },\n  \n  additionalConfig: {\n    stateSync: {\n      broadcastToAllTabs: true,\n      persistSession: true,\n    },\n    audio: {\n      echoCancellation: true,\n      noiseSuppression: true,\n      autoGainControl: true,\n    },\n  },\n};\n\n/**\n * Controlled preset configuration (cross-tab navigation)\n */\nexport const CONTROLLED_PRESET: VowelPresetConfig = {\n  name: 'controlled',\n  description: 'Cross-tab navigation for any website that refreshes on navigate',\n\n  createNavigationAdapter: async (options?: { storeUrl?: string; channelName?: string }) => {\n    const { ControlledNavigationRouter } = await import('../platforms/generic/router');\n    const router = new ControlledNavigationRouter({\n      channelName: options?.channelName || 'vowel-controlled-navigation',\n      config: {\n        features: ['navigation', 'search'],\n        version: '1.0.0'\n      }\n    });\n\n    // Wrap RouterAdapter to NavigationAdapter interface\n    return {\n      navigate: (path: string) => router.navigate(path),\n      getCurrentPath: () => router.getCurrentPath(),\n      getRoutes: async () => router.getRoutes(),\n      getContext: () => router.getContext()\n    };\n  },\n\n  createAutomationAdapter: async (options?: { channelName?: string }) => {\n    const { ControlledAutomationAdapter } = await import('../adapters/automation/controlled-automation-adapter');\n    return new ControlledAutomationAdapter(options?.channelName || 'vowel-controlled-navigation');\n  },\n\n  floatingCursor: {\n    enabled: true,\n    appearance: {\n      cursorColor: '#007acc',        // Blue cursor for controlled tab\n      cursorSize: 24,\n      badgeBackground: '#007acc',    // Blue pill background\n      badgeTextColor: '#ffffff',     // White text\n      badgeFontSize: 13,\n      badgePadding: '6px 12px',\n      badgeBorderRadius: '12px',\n      cursorShadow: '0 2px 8px rgba(0,122,204,0.15)',\n      badgeShadow: '0 2px 8px rgba(0,122,204,0.2)',\n    },\n    animation: {\n      enableTyping: true,\n      typingSpeed: 50,\n      enableBounce: true,\n    },\n    behavior: {\n      autoHideDelay: 0,          // NEVER auto-hide (always visible)\n      showDuringSearch: true,\n      hideOnNavigation: false,   // Stay visible during navigation\n    },\n  },\n\n  additionalConfig: {\n    features: ['navigation', 'search', 'dom-interaction'],\n    requiresControlledTab: true,\n    channelName: 'vowel-controlled-navigation'\n  },\n};\n\n/**\n * Preset registry - includes both public and internal presets\n * ⚠️ The 'shopify' preset is INTERNAL USE ONLY and should never be exposed to end users\n */\nexport const PRESETS: Record<InternalPresetName, VowelPresetConfig> = {\n  shopify: SHOPIFY_PRESET, // ⚠️ INTERNAL USE ONLY - Vowel platform Shopify app extension\n  vanilla: VANILLA_PRESET,\n  extension: EXTENSION_PRESET,\n  controlled: CONTROLLED_PRESET,\n};\n\n/**\n * Get a preset by name\n *\n * @param name - Preset name (use InternalPresetName for platform-specific presets)\n * @returns Preset configuration\n * @throws Error if preset not found\n */\nexport function getPreset(name: InternalPresetName): VowelPresetConfig {\n  const preset = PRESETS[name];\n  \n  if (!preset) {\n    throw new Error(`Unknown preset: ${name}. Available presets: ${Object.keys(PRESETS).join(', ')}`);\n  }\n  \n  return preset;\n}\n\n/**\n * Initialize adapters from a preset\n * \n * @param presetName - Name of the preset to use\n * @param options - Platform-specific options\n * @returns Initialized navigation and automation adapters\n * \n * @example\n * ```ts\n * import { initializeFromPreset } from '@vowel.to/client/presets';\n *\n * const { navigationAdapter, automationAdapter, floatingCursor } =\n *   await initializeFromPreset('controlled', {\n *     storeUrl: 'https://mystore.com'\n *   });\n * ```\n */\nexport async function initializeFromPreset(\n  presetName: InternalPresetName,\n  options?: any\n): Promise<{\n  navigationAdapter: NavigationAdapter;\n  automationAdapter: AutomationAdapter;\n  floatingCursor?: FloatingCursorConfig;\n  additionalConfig: Record<string, any>;\n}> {\n  const preset = getPreset(presetName);\n  \n  console.log(`🎯 [Presets] Initializing from preset: ${preset.name}`);\n  console.log(`   📝 ${preset.description}`);\n  \n  const navigationAdapter = await preset.createNavigationAdapter(options);\n  const automationAdapter = await preset.createAutomationAdapter(options);\n  \n  console.log(`✅ [Presets] Initialized ${preset.name} preset`);\n  \n  return {\n    navigationAdapter,\n    automationAdapter,\n    floatingCursor: preset.floatingCursor,\n    additionalConfig: preset.additionalConfig || {},\n  };\n}\n\n"],"names":[],"mappings":"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"}