@uptrademedia/site-kit 1.0.0 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs.map +1 -1
- package/dist/chunk-5R4R3WDP.js +1451 -0
- package/dist/chunk-5R4R3WDP.js.map +1 -0
- package/dist/{chunk-COI6GOX2.mjs → chunk-63JNO4QN.mjs} +3 -3
- package/dist/chunk-63JNO4QN.mjs.map +1 -0
- package/dist/chunk-6EXHT7PS.mjs +330 -0
- package/dist/chunk-6EXHT7PS.mjs.map +1 -0
- package/dist/{chunk-RV7H3I6J.js → chunk-ADHVEFWD.js} +68 -2
- package/dist/chunk-ADHVEFWD.js.map +1 -0
- package/dist/chunk-BGJLOJ7T.mjs +605 -0
- package/dist/chunk-BGJLOJ7T.mjs.map +1 -0
- package/dist/chunk-BZBJVG5Y.js +88 -0
- package/dist/chunk-BZBJVG5Y.js.map +1 -0
- package/dist/chunk-DRFTRTKV.js +809 -0
- package/dist/chunk-DRFTRTKV.js.map +1 -0
- package/dist/chunk-EL5QTAA3.mjs +805 -0
- package/dist/chunk-EL5QTAA3.mjs.map +1 -0
- package/dist/chunk-JG2K4S2I.js +997 -0
- package/dist/chunk-JG2K4S2I.js.map +1 -0
- package/dist/chunk-P7LGOKGI.mjs +981 -0
- package/dist/chunk-P7LGOKGI.mjs.map +1 -0
- package/dist/{chunk-3MUOUXHV.js → chunk-PYYEPAHL.js} +3 -3
- package/dist/chunk-PYYEPAHL.js.map +1 -0
- package/dist/chunk-QAYJV4KK.js +608 -0
- package/dist/chunk-QAYJV4KK.js.map +1 -0
- package/dist/{chunk-FEBYQGY4 2.mjs → chunk-SMUFNQLM.mjs} +67 -3
- package/dist/chunk-SMUFNQLM.mjs.map +1 -0
- package/dist/chunk-VDMZZL2O.mjs +83 -0
- package/dist/chunk-VDMZZL2O.mjs.map +1 -0
- package/dist/chunk-XFRPT5ZX.mjs +1449 -0
- package/dist/chunk-XFRPT5ZX.mjs.map +1 -0
- package/dist/chunk-YKMCG3DS.js +332 -0
- package/dist/chunk-YKMCG3DS.js.map +1 -0
- package/dist/commerce/index.js +38 -38
- package/dist/commerce/index.mjs +1 -1
- package/dist/engage/index.js +7 -40
- package/dist/engage/index.js.map +1 -1
- package/dist/engage/index.mjs +1 -41
- package/dist/engage/index.mjs.map +1 -1
- package/dist/forms/index.js +13 -5
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +2 -2
- package/dist/forms/index.mjs.map +1 -1
- package/dist/{generators-7Y5ABRYV 2.mjs → generators-TO2FKJR6.mjs} +134 -3
- package/dist/generators-TO2FKJR6.mjs.map +1 -0
- package/dist/{generators-GWIYCA5M.js → generators-YZWIGHCO.js} +135 -2
- package/dist/generators-YZWIGHCO.js.map +1 -0
- package/dist/images/index.js +41 -0
- package/dist/images/index.js.map +1 -0
- package/dist/images/index.mjs +8 -0
- package/dist/images/index.mjs.map +1 -0
- package/dist/index.js +1355 -104
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1242 -76
- package/dist/index.mjs.map +1 -1
- package/dist/redirects/index.js +25 -0
- package/dist/redirects/index.js.map +1 -0
- package/dist/redirects/index.mjs +4 -0
- package/dist/redirects/index.mjs.map +1 -0
- package/dist/{scanner-MF7P3CDE 2.mjs → scanner-AZV5I6US.mjs} +123 -4
- package/dist/scanner-AZV5I6US.mjs.map +1 -0
- package/dist/{scanner-NT6YG4TD 2.js → scanner-ETJAMIT7.js} +124 -3
- package/dist/scanner-ETJAMIT7.js.map +1 -0
- package/dist/setup/client.js +30 -0
- package/dist/setup/client.js.map +1 -0
- package/dist/setup/client.mjs +5 -0
- package/dist/setup/client.mjs.map +1 -0
- package/dist/setup/index.js +28 -1043
- package/dist/setup/index.js.map +1 -1
- package/dist/setup/index.mjs +3 -1043
- package/dist/setup/index.mjs.map +1 -1
- package/dist/setup/server.js +13 -0
- package/dist/setup/server.js.map +1 -0
- package/dist/setup/server.mjs +4 -0
- package/dist/setup/server.mjs.map +1 -0
- package/package.json +21 -1
- package/dist/chunk-3MUOUXHV.js.map +0 -1
- package/dist/chunk-4HVYXYQL 2.mjs +0 -255
- package/dist/chunk-4HVYXYQL.mjs +0 -255
- package/dist/chunk-4HVYXYQL.mjs.map +0 -1
- package/dist/chunk-COI6GOX2.mjs.map +0 -1
- package/dist/chunk-EQCVQC35.js 2.map +0 -1
- package/dist/chunk-FEBYQGY4.mjs +0 -251
- package/dist/chunk-FEBYQGY4.mjs.map +0 -1
- package/dist/chunk-NYKRE2FL 2.mjs +0 -31
- package/dist/chunk-NYKRE2FL.mjs 2.map +0 -1
- package/dist/chunk-RV7H3I6J.js 2.map +0 -1
- package/dist/chunk-RV7H3I6J.js.map +0 -1
- package/dist/chunk-TUKGA3UK.js +0 -257
- package/dist/chunk-TUKGA3UK.js 2.map +0 -1
- package/dist/chunk-TUKGA3UK.js.map +0 -1
- package/dist/generators-7Y5ABRYV.mjs +0 -161
- package/dist/generators-7Y5ABRYV.mjs 2.map +0 -1
- package/dist/generators-7Y5ABRYV.mjs.map +0 -1
- package/dist/generators-GWIYCA5M.js 2.map +0 -1
- package/dist/generators-GWIYCA5M.js.map +0 -1
- package/dist/index 2.mjs +0 -74
- package/dist/index.js 2.map +0 -1
- package/dist/migrator-V6KS75EA 2.mjs +0 -265
- package/dist/migrator-V6KS75EA.mjs 2.map +0 -1
- package/dist/migrator-XKM7YQCY.js 2.map +0 -1
- package/dist/scanner-MF7P3CDE.mjs +0 -14386
- package/dist/scanner-MF7P3CDE.mjs 2.map +0 -1
- package/dist/scanner-MF7P3CDE.mjs.map +0 -1
- package/dist/scanner-NT6YG4TD.js +0 -14397
- package/dist/scanner-NT6YG4TD.js 2.map +0 -1
- package/dist/scanner-NT6YG4TD.js.map +0 -1
- package/dist/web-vitals-BH55V7EJ.js 2.map +0 -1
- package/dist/web-vitals-RJYPWAR3 2.mjs +0 -241
- package/dist/web-vitals-RJYPWAR3.mjs 2.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/SiteKitProvider.tsx","../src/affiliates/api.ts","../src/affiliates/useAffiliates.ts","../src/affiliates/AffiliatesWidget.tsx"],"names":["useEffect","getTrackingUrl","jsx","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @uptrade/site-kit - SiteKitProvider\n * \n * Unified provider component that initializes all enabled modules.\n * All API calls go through Portal API with API key auth - never Supabase directly.\n */\n\n'use client'\n\nimport React, { createContext, useContext, useMemo, useEffect, ReactNode, Suspense } from 'react'\nimport type { SiteKitConfig } from './types'\n\n// Module providers\nimport { AnalyticsProvider } from './analytics/AnalyticsProvider'\nimport { EngageWidget } from './engage/EngageWidget'\nimport { configureFormsApi } from './forms/formsApi'\nimport { SitemapSync } from './seo/SitemapSync'\n\ninterface SiteKitContextValue extends SiteKitConfig {\n isReady: boolean\n}\n\nconst SiteKitContext = createContext<SiteKitContextValue | null>(null)\n\nexport function useSiteKit(): SiteKitContextValue {\n const context = useContext(SiteKitContext)\n if (!context) {\n throw new Error('useSiteKit must be used within a SiteKitProvider')\n }\n return context\n}\n\ninterface SiteKitProviderProps extends SiteKitConfig {\n children: ReactNode\n}\n\nexport function SiteKitProvider({\n children,\n apiUrl = 'https://api.uptrademedia.com',\n apiKey,\n analytics,\n engage,\n forms,\n debug = false,\n}: SiteKitProviderProps) {\n // Set window globals for Portal API access\n useEffect(() => {\n if (typeof window !== 'undefined') {\n ;(window as any).__SITE_KIT_API_URL__ = apiUrl\n ;(window as any).__SITE_KIT_API_KEY__ = apiKey\n ;(window as any).__SITE_KIT_DEBUG__ = debug\n }\n \n // Configure forms API\n configureFormsApi({\n baseUrl: apiUrl,\n apiKey,\n })\n }, [apiUrl, apiKey, debug])\n\n const contextValue = useMemo<SiteKitContextValue>(\n () => ({\n apiUrl,\n apiKey,\n analytics,\n engage,\n forms,\n debug,\n isReady: true,\n }),\n [apiUrl, apiKey, analytics, engage, forms, debug]\n )\n\n // Build the provider tree based on enabled modules\n let content = <>{children}</>\n\n // Wrap with Analytics if enabled\n if (analytics?.enabled) {\n content = (\n <Suspense fallback={null}>\n <AnalyticsProvider\n apiUrl={apiUrl}\n apiKey={apiKey}\n trackPageViews={analytics.trackPageViews !== false}\n trackWebVitals={analytics.trackWebVitals !== false}\n trackScrollDepth={analytics.trackScrollDepth !== false}\n trackClicks={analytics.trackClicks !== false}\n debug={debug}\n >\n {content}\n </AnalyticsProvider>\n </Suspense>\n )\n }\n\n // Add Engage widget if enabled (doesn't wrap, just renders alongside)\n if (engage?.enabled) {\n content = (\n <>\n {content}\n <EngageWidget apiUrl={apiUrl} apiKey={apiKey} />\n </>\n )\n }\n\n // Always include SitemapSync to keep seo_pages in sync with sitemap.xml\n // This is the canonical source of truth for what pages exist\n content = (\n <>\n {content}\n <SitemapSync debug={debug} />\n </>\n )\n\n return (\n <SiteKitContext.Provider value={contextValue}>\n {content}\n </SiteKitContext.Provider>\n )\n}\n\n/**\n * Hook to check if a specific module is enabled\n */\nexport function useModuleEnabled(module: 'analytics' | 'engage' | 'forms' | 'seo'): boolean {\n const context = useSiteKit()\n \n switch (module) {\n case 'analytics':\n return context.analytics?.enabled ?? false\n case 'engage':\n return context.engage?.enabled ?? false\n case 'forms':\n return context.forms?.enabled ?? false\n case 'seo':\n return true // SEO is always enabled via RSC components\n default:\n return false\n }\n}\n","/**\n * @uptrade/site-kit/affiliates - Affiliates API\n * \n * API functions for fetching affiliate data for client sites.\n * All data goes through Portal API with API key auth - never Supabase directly.\n */\n\nimport type { Affiliate, AffiliateWithOffers, FetchAffiliatesOptions } from './types'\n\n// ============================================\n// API Config Helpers\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.uptrademedia.com'\n : 'https://api.uptrademedia.com'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__ || ''\n : ''\n return { apiUrl, apiKey }\n}\n\nasync function apiGet<T>(endpoint: string): Promise<T | null> {\n const { apiUrl, apiKey } = getApiConfig()\n \n if (!apiKey) {\n console.error('[Affiliates] No API key configured')\n return null\n }\n \n try {\n const response = await fetch(`${apiUrl}${endpoint}`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n },\n })\n \n if (!response.ok) {\n console.error(`[Affiliates] API error: ${response.statusText}`)\n return null\n }\n \n return await response.json()\n } catch (error) {\n console.error('[Affiliates] Network error:', error)\n return null\n }\n}\n\n// ============================================\n// Fetch Affiliates\n// ============================================\n\n/**\n * Fetch all active affiliates for the project\n * \n * @example\n * ```ts\n * const affiliates = await fetchAffiliates()\n * ```\n */\nexport async function fetchAffiliates(\n options: FetchAffiliatesOptions = {}\n): Promise<AffiliateWithOffers[]> {\n const result = await apiGet<{ affiliates: AffiliateWithOffers[] }>(\n '/api/public/affiliates'\n )\n \n return result?.affiliates || []\n}\n\n/**\n * Build a tracking URL for an affiliate offer\n * When clicked, this redirects through our tracking endpoint and then to the destination\n * \n * @example\n * ```ts\n * const trackingUrl = getTrackingUrl(affiliate.id, offer.id)\n * // Returns: https://api.uptrademedia.com/a/{affiliateId}/{offerId}\n * ```\n */\nexport function getTrackingUrl(affiliateId: string, offerId: string): string {\n const { apiUrl } = getApiConfig()\n return `${apiUrl}/a/${affiliateId}/${offerId}`\n}\n","/**\n * @uptrade/site-kit/affiliates - useAffiliates Hook\n * \n * React hook for fetching and displaying affiliates on client sites.\n */\n\n'use client'\n\nimport { useState, useEffect } from 'react'\nimport type { AffiliateWithOffers } from './types'\nimport { fetchAffiliates, getTrackingUrl } from './api'\n\nexport interface UseAffiliatesResult {\n affiliates: AffiliateWithOffers[]\n isLoading: boolean\n error: string | null\n getTrackingUrl: (affiliateId: string, offerId: string) => string\n}\n\n/**\n * Hook to fetch affiliates for display on client sites\n * \n * @example\n * ```tsx\n * function AffiliatesSection() {\n * const { affiliates, isLoading } = useAffiliates()\n * \n * if (isLoading) return <div>Loading...</div>\n * \n * return (\n * <div className=\"grid grid-cols-3 gap-4\">\n * {affiliates.map(affiliate => (\n * <AffiliateCard key={affiliate.id} affiliate={affiliate} />\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useAffiliates(): UseAffiliatesResult {\n const [affiliates, setAffiliates] = useState<AffiliateWithOffers[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function load() {\n try {\n setIsLoading(true)\n setError(null)\n const data = await fetchAffiliates()\n setAffiliates(data)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load affiliates')\n } finally {\n setIsLoading(false)\n }\n }\n \n load()\n }, [])\n\n return {\n affiliates,\n isLoading,\n error,\n getTrackingUrl,\n }\n}\n","/**\n * @uptrade/site-kit/affiliates - AffiliatesWidget Component\n * \n * Unstyled, headless component for displaying affiliates.\n * Client sites can wrap this or use it directly with their own styling.\n */\n\n'use client'\n\nimport React from 'react'\nimport { useAffiliates } from './useAffiliates'\nimport type { AffiliateWithOffers, AffiliateOffer } from './types'\n\n// ============================================\n// Affiliate Card (Unstyled)\n// ============================================\n\nexport interface AffiliateCardProps {\n affiliate: AffiliateWithOffers\n className?: string\n /** Optional custom render for the logo */\n renderLogo?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Show offers as links below the card */\n showOffers?: boolean\n}\n\n/**\n * Single affiliate card - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * <AffiliateCard \n * affiliate={affiliate}\n * className=\"p-4 bg-white rounded-lg shadow\"\n * showOffers\n * />\n * ```\n */\nexport function AffiliateCard({\n affiliate,\n className = '',\n renderLogo,\n showOffers = false,\n}: AffiliateCardProps) {\n const { getTrackingUrl } = useAffiliates()\n \n const defaultLogo = (\n <div data-affiliate-logo className=\"affiliate-logo\">\n {affiliate.logo_url ? (\n <img \n src={affiliate.logo_url} \n alt={affiliate.name}\n loading=\"lazy\"\n />\n ) : (\n <span>{affiliate.name.charAt(0)}</span>\n )}\n </div>\n )\n\n return (\n <div className={className} data-affiliate-card data-affiliate-id={affiliate.id}>\n {/* Logo */}\n {renderLogo ? renderLogo(affiliate) : defaultLogo}\n \n {/* Name */}\n <div data-affiliate-name className=\"affiliate-name\">\n {affiliate.name}\n </div>\n \n {/* Website link */}\n {affiliate.website_url && (\n <a \n href={affiliate.website_url}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-website\n className=\"affiliate-website\"\n >\n Visit Website\n </a>\n )}\n \n {/* Offers */}\n {showOffers && affiliate.offers && affiliate.offers.length > 0 && (\n <div data-affiliate-offers className=\"affiliate-offers\">\n {affiliate.offers.map(offer => (\n <a\n key={offer.id}\n href={getTrackingUrl(affiliate.id, offer.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-offer\n data-offer-id={offer.id}\n className=\"affiliate-offer\"\n >\n {offer.name}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Affiliates Grid (Unstyled)\n// ============================================\n\nexport interface AffiliatesWidgetProps {\n className?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n /** Custom empty state component */\n emptyComponent?: React.ReactNode\n /** Custom error component */\n errorComponent?: React.ReactNode\n /** Show offers on each card */\n showOffers?: boolean\n /** Custom render function for each affiliate */\n renderAffiliate?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Maximum number to display */\n limit?: number\n}\n\n/**\n * Display a grid of affiliates - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * // Basic usage\n * <AffiliatesWidget className=\"grid grid-cols-3 gap-4\" />\n * \n * // With custom rendering\n * <AffiliatesWidget\n * renderAffiliate={(affiliate) => (\n * <MyCustomCard key={affiliate.id} data={affiliate} />\n * )}\n * />\n * ```\n */\nexport function AffiliatesWidget({\n className = '',\n loadingComponent,\n emptyComponent,\n errorComponent,\n showOffers = false,\n renderAffiliate,\n limit,\n}: AffiliatesWidgetProps) {\n const { affiliates, isLoading, error, getTrackingUrl } = useAffiliates()\n \n if (isLoading) {\n return loadingComponent || <div data-affiliates-loading>Loading affiliates...</div>\n }\n \n if (error) {\n return errorComponent || <div data-affiliates-error>{error}</div>\n }\n \n const displayAffiliates = limit ? affiliates.slice(0, limit) : affiliates\n \n if (displayAffiliates.length === 0) {\n return emptyComponent || null\n }\n \n return (\n <div className={className} data-affiliates-widget>\n {displayAffiliates.map(affiliate => \n renderAffiliate \n ? renderAffiliate(affiliate)\n : <AffiliateCard \n key={affiliate.id} \n affiliate={affiliate} \n showOffers={showOffers}\n />\n )}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/affiliates/api.ts","../src/affiliates/useAffiliates.ts","../src/affiliates/AffiliatesWidget.tsx","../src/signal/SignalExperiment.tsx","../src/setup/SetupAssistant.tsx"],"names":["getTrackingUrl","useEffect","jsx","useState","onComplete","jsxs","React"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @uptrade/site-kit/affiliates - Affiliates API\n * \n * API functions for fetching affiliate data for client sites.\n * All data goes through Portal API with API key auth - never Supabase directly.\n */\n\nimport type { Affiliate, AffiliateWithOffers, FetchAffiliatesOptions } from './types'\n\n// ============================================\n// API Config Helpers\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.uptrademedia.com'\n : 'https://api.uptrademedia.com'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__ || ''\n : ''\n return { apiUrl, apiKey }\n}\n\nasync function apiGet<T>(endpoint: string): Promise<T | null> {\n const { apiUrl, apiKey } = getApiConfig()\n \n if (!apiKey) {\n console.error('[Affiliates] No API key configured')\n return null\n }\n \n try {\n const response = await fetch(`${apiUrl}${endpoint}`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n },\n })\n \n if (!response.ok) {\n console.error(`[Affiliates] API error: ${response.statusText}`)\n return null\n }\n \n return await response.json()\n } catch (error) {\n console.error('[Affiliates] Network error:', error)\n return null\n }\n}\n\n// ============================================\n// Fetch Affiliates\n// ============================================\n\n/**\n * Fetch all active affiliates for the project\n * \n * @example\n * ```ts\n * const affiliates = await fetchAffiliates()\n * ```\n */\nexport async function fetchAffiliates(\n options: FetchAffiliatesOptions = {}\n): Promise<AffiliateWithOffers[]> {\n const result = await apiGet<{ affiliates: AffiliateWithOffers[] }>(\n '/api/public/affiliates'\n )\n \n return result?.affiliates || []\n}\n\n/**\n * Build a tracking URL for an affiliate offer\n * When clicked, this redirects through our tracking endpoint and then to the destination\n * \n * @example\n * ```ts\n * const trackingUrl = getTrackingUrl(affiliate.id, offer.id)\n * // Returns: https://api.uptrademedia.com/a/{affiliateId}/{offerId}\n * ```\n */\nexport function getTrackingUrl(affiliateId: string, offerId: string): string {\n const { apiUrl } = getApiConfig()\n return `${apiUrl}/a/${affiliateId}/${offerId}`\n}\n","/**\n * @uptrade/site-kit/affiliates - useAffiliates Hook\n * \n * React hook for fetching and displaying affiliates on client sites.\n */\n\n'use client'\n\nimport { useState, useEffect } from 'react'\nimport type { AffiliateWithOffers } from './types'\nimport { fetchAffiliates, getTrackingUrl } from './api'\n\nexport interface UseAffiliatesResult {\n affiliates: AffiliateWithOffers[]\n isLoading: boolean\n error: string | null\n getTrackingUrl: (affiliateId: string, offerId: string) => string\n}\n\n/**\n * Hook to fetch affiliates for display on client sites\n * \n * @example\n * ```tsx\n * function AffiliatesSection() {\n * const { affiliates, isLoading } = useAffiliates()\n * \n * if (isLoading) return <div>Loading...</div>\n * \n * return (\n * <div className=\"grid grid-cols-3 gap-4\">\n * {affiliates.map(affiliate => (\n * <AffiliateCard key={affiliate.id} affiliate={affiliate} />\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useAffiliates(): UseAffiliatesResult {\n const [affiliates, setAffiliates] = useState<AffiliateWithOffers[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function load() {\n try {\n setIsLoading(true)\n setError(null)\n const data = await fetchAffiliates()\n setAffiliates(data)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load affiliates')\n } finally {\n setIsLoading(false)\n }\n }\n \n load()\n }, [])\n\n return {\n affiliates,\n isLoading,\n error,\n getTrackingUrl,\n }\n}\n","/**\n * @uptrade/site-kit/affiliates - AffiliatesWidget Component\n * \n * Unstyled, headless component for displaying affiliates.\n * Client sites can wrap this or use it directly with their own styling.\n */\n\n'use client'\n\nimport React from 'react'\nimport { useAffiliates } from './useAffiliates'\nimport type { AffiliateWithOffers, AffiliateOffer } from './types'\n\n// ============================================\n// Affiliate Card (Unstyled)\n// ============================================\n\nexport interface AffiliateCardProps {\n affiliate: AffiliateWithOffers\n className?: string\n /** Optional custom render for the logo */\n renderLogo?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Show offers as links below the card */\n showOffers?: boolean\n}\n\n/**\n * Single affiliate card - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * <AffiliateCard \n * affiliate={affiliate}\n * className=\"p-4 bg-white rounded-lg shadow\"\n * showOffers\n * />\n * ```\n */\nexport function AffiliateCard({\n affiliate,\n className = '',\n renderLogo,\n showOffers = false,\n}: AffiliateCardProps) {\n const { getTrackingUrl } = useAffiliates()\n \n const defaultLogo = (\n <div data-affiliate-logo className=\"affiliate-logo\">\n {affiliate.logo_url ? (\n <img \n src={affiliate.logo_url} \n alt={affiliate.name}\n loading=\"lazy\"\n />\n ) : (\n <span>{affiliate.name.charAt(0)}</span>\n )}\n </div>\n )\n\n return (\n <div className={className} data-affiliate-card data-affiliate-id={affiliate.id}>\n {/* Logo */}\n {renderLogo ? renderLogo(affiliate) : defaultLogo}\n \n {/* Name */}\n <div data-affiliate-name className=\"affiliate-name\">\n {affiliate.name}\n </div>\n \n {/* Website link */}\n {affiliate.website_url && (\n <a \n href={affiliate.website_url}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-website\n className=\"affiliate-website\"\n >\n Visit Website\n </a>\n )}\n \n {/* Offers */}\n {showOffers && affiliate.offers && affiliate.offers.length > 0 && (\n <div data-affiliate-offers className=\"affiliate-offers\">\n {affiliate.offers.map(offer => (\n <a\n key={offer.id}\n href={getTrackingUrl(affiliate.id, offer.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-offer\n data-offer-id={offer.id}\n className=\"affiliate-offer\"\n >\n {offer.name}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Affiliates Grid (Unstyled)\n// ============================================\n\nexport interface AffiliatesWidgetProps {\n className?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n /** Custom empty state component */\n emptyComponent?: React.ReactNode\n /** Custom error component */\n errorComponent?: React.ReactNode\n /** Show offers on each card */\n showOffers?: boolean\n /** Custom render function for each affiliate */\n renderAffiliate?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Maximum number to display */\n limit?: number\n}\n\n/**\n * Display a grid of affiliates - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * // Basic usage\n * <AffiliatesWidget className=\"grid grid-cols-3 gap-4\" />\n * \n * // With custom rendering\n * <AffiliatesWidget\n * renderAffiliate={(affiliate) => (\n * <MyCustomCard key={affiliate.id} data={affiliate} />\n * )}\n * />\n * ```\n */\nexport function AffiliatesWidget({\n className = '',\n loadingComponent,\n emptyComponent,\n errorComponent,\n showOffers = false,\n renderAffiliate,\n limit,\n}: AffiliatesWidgetProps) {\n const { affiliates, isLoading, error, getTrackingUrl } = useAffiliates()\n \n if (isLoading) {\n return loadingComponent || <div data-affiliates-loading>Loading affiliates...</div>\n }\n \n if (error) {\n return errorComponent || <div data-affiliates-error>{error}</div>\n }\n \n const displayAffiliates = limit ? affiliates.slice(0, limit) : affiliates\n \n if (displayAffiliates.length === 0) {\n return emptyComponent || null\n }\n \n return (\n <div className={className} data-affiliates-widget>\n {displayAffiliates.map(affiliate => \n renderAffiliate \n ? renderAffiliate(affiliate)\n : <AffiliateCard \n key={affiliate.id} \n affiliate={affiliate} \n showOffers={showOffers}\n />\n )}\n </div>\n )\n}\n","/**\n * @uptrade/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n \n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n \n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if (children.props.onClick) {\n children.props.onClick(e)\n }\n },\n })\n}\n","/**\n * @uptrade/site-kit/setup - Conversational Setup Assistant\n * \n * AI-powered conversational interface for setting up site-kit.\n * Uses Echo/Signal to guide users through configuration.\n * \n * Features:\n * - Streaming AI responses for real-time feedback\n * - Brand extraction from existing websites\n * - Module recommendations based on business type\n * - Integration verification\n * - Copilot instructions generation\n */\n\n'use client'\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react'\n\n// ============================================\n// Types\n// ============================================\n\ninterface Message {\n id: string\n role: 'assistant' | 'user' | 'system'\n content: string\n timestamp: Date\n actions?: ActionButton[]\n component?: React.ReactNode\n isStreaming?: boolean\n}\n\ninterface ActionButton {\n id: string\n label: string\n action: string\n variant?: 'primary' | 'secondary' | 'outline'\n data?: Record<string, unknown>\n}\n\ninterface SetupContext {\n flow: 'new' | 'existing' | 'rebuild' | null\n step: string\n project_id?: string\n org_id?: string\n domain?: string\n business_type?: string\n scan_results?: ScanResults\n scrape_results?: ScrapeResults\n selected_modules?: string[]\n brand?: BrandInfo\n}\n\ninterface ScanResults {\n forms: { file: string; form_library: string; fields: number }[]\n widgets: { file: string; widget_type: string }[]\n metadata: { file: string; type: string }[]\n sitemaps: { file: string; type: string }[]\n}\n\ninterface ScrapeResults {\n scrape_id: string\n domain: string\n pages_found: number\n faqs_imported: number\n routes: { path: string; title: string }[]\n brand?: BrandInfo\n}\n\ninterface BrandInfo {\n business_name: string\n tagline?: string\n primary_color?: string\n secondary_color?: string\n logo_url?: string\n phone_numbers?: string[]\n email_addresses?: string[]\n social_profiles?: Record<string, string>\n}\n\ninterface SetupState {\n step: 'welcome' | 'auth' | 'project' | 'modules' | 'config' | 'verify' | 'complete'\n isAuthenticated: boolean\n userEmail?: string\n accessToken?: string\n selectedOrg?: { id: string; name: string }\n selectedProject?: { id: string; name: string; domain: string }\n selectedModules: string[]\n config: Record<string, unknown>\n errors: string[]\n context: SetupContext\n}\n\ninterface SetupAssistantProps {\n /** Portal API URL */\n apiUrl?: string\n \n /** Signal API URL for AI chat */\n signalUrl?: string\n \n /** Supabase URL for auth */\n supabaseUrl?: string\n \n /** Supabase anon key */\n supabaseKey?: string\n \n /** Pre-selected project ID (if coming from Portal) */\n projectId?: string\n \n /** Pre-selected org ID (if coming from Portal) */\n orgId?: string\n \n /** Auth token (if already authenticated) */\n authToken?: string\n \n /** Callback when setup is complete */\n onComplete?: (config: SetupState) => void\n \n /** Custom welcome message */\n welcomeMessage?: string\n}\n\n// ============================================\n// Styles (inline for portability)\n// ============================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column' as const,\n height: '100vh',\n maxWidth: '800px',\n margin: '0 auto',\n padding: '1rem',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n padding: '1rem 0',\n borderBottom: '1px solid #e5e7eb',\n },\n logo: {\n width: '32px',\n height: '32px',\n borderRadius: '8px',\n background: 'linear-gradient(135deg, #3b82f6, #8b5cf6)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'white',\n fontWeight: 'bold',\n },\n title: {\n fontSize: '1.25rem',\n fontWeight: '600',\n color: '#111827',\n },\n subtitle: {\n fontSize: '0.875rem',\n color: '#6b7280',\n },\n messages: {\n flex: 1,\n overflowY: 'auto' as const,\n padding: '1rem 0',\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '1rem',\n },\n message: {\n display: 'flex',\n gap: '0.75rem',\n maxWidth: '85%',\n },\n messageAssistant: {\n alignSelf: 'flex-start',\n },\n messageUser: {\n alignSelf: 'flex-end',\n flexDirection: 'row-reverse' as const,\n },\n avatar: {\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '0.875rem',\n flexShrink: 0,\n },\n avatarAssistant: {\n background: 'linear-gradient(135deg, #3b82f6, #8b5cf6)',\n color: 'white',\n },\n avatarUser: {\n background: '#e5e7eb',\n color: '#374151',\n },\n bubble: {\n padding: '0.75rem 1rem',\n borderRadius: '1rem',\n fontSize: '0.9375rem',\n lineHeight: '1.5',\n },\n bubbleAssistant: {\n background: '#f3f4f6',\n color: '#111827',\n borderTopLeftRadius: '4px',\n },\n bubbleUser: {\n background: '#3b82f6',\n color: 'white',\n borderTopRightRadius: '4px',\n },\n actions: {\n display: 'flex',\n flexWrap: 'wrap' as const,\n gap: '0.5rem',\n marginTop: '0.75rem',\n },\n actionButton: {\n padding: '0.5rem 1rem',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n border: 'none',\n transition: 'all 0.15s',\n },\n actionPrimary: {\n background: '#3b82f6',\n color: 'white',\n },\n actionSecondary: {\n background: '#e5e7eb',\n color: '#374151',\n },\n actionOutline: {\n background: 'transparent',\n color: '#3b82f6',\n border: '1px solid #3b82f6',\n },\n inputContainer: {\n display: 'flex',\n gap: '0.5rem',\n padding: '1rem 0',\n borderTop: '1px solid #e5e7eb',\n },\n input: {\n flex: 1,\n padding: '0.75rem 1rem',\n borderRadius: '0.75rem',\n border: '1px solid #d1d5db',\n fontSize: '0.9375rem',\n outline: 'none',\n },\n sendButton: {\n padding: '0.75rem 1.5rem',\n borderRadius: '0.75rem',\n background: '#3b82f6',\n color: 'white',\n border: 'none',\n fontWeight: '500',\n cursor: 'pointer',\n },\n typing: {\n display: 'flex',\n gap: '4px',\n padding: '0.75rem 1rem',\n background: '#f3f4f6',\n borderRadius: '1rem',\n width: 'fit-content',\n },\n typingDot: {\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: '#9ca3af',\n animation: 'typing 1.4s infinite',\n },\n moduleCard: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n padding: '0.75rem',\n background: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n cursor: 'pointer',\n transition: 'all 0.15s',\n },\n moduleCardSelected: {\n borderColor: '#3b82f6',\n background: '#eff6ff',\n },\n moduleIcon: {\n fontSize: '1.5rem',\n },\n moduleInfo: {\n flex: 1,\n },\n moduleName: {\n fontWeight: '500',\n color: '#111827',\n },\n moduleDesc: {\n fontSize: '0.75rem',\n color: '#6b7280',\n },\n checkbox: {\n width: '20px',\n height: '20px',\n accentColor: '#3b82f6',\n },\n}\n\n// ============================================\n// Available Modules\n// ============================================\n\nconst MODULES = [\n { id: 'analytics', name: 'Analytics', icon: '📊', description: 'Page views, events, sessions, web vitals', recommended: true },\n { id: 'seo', name: 'SEO', icon: '🔍', description: 'Managed FAQs, meta tags, schema markup', recommended: true },\n { id: 'forms', name: 'Forms', icon: '📝', description: 'Portal-managed forms with submissions', recommended: true },\n { id: 'engage', name: 'Engage', icon: '💬', description: 'Live chat, popups, nudges, banners', recommended: false },\n { id: 'commerce', name: 'Commerce', icon: '🛒', description: 'Products, services, checkout', recommended: false },\n { id: 'signal', name: 'Signal AI', icon: '🤖', description: 'Autonomous optimization & A/B testing', recommended: false },\n]\n\n// ============================================\n// Setup Assistant Component\n// ============================================\n\nexport function SetupAssistant({\n apiUrl = 'https://api.uptrademedia.com',\n signalUrl = 'https://signal.uptrademedia.com',\n supabaseUrl,\n supabaseKey,\n projectId,\n orgId,\n authToken,\n onComplete,\n welcomeMessage,\n}: SetupAssistantProps) {\n const [messages, setMessages] = useState<Message[]>([])\n const [input, setInput] = useState('')\n const [isTyping, setIsTyping] = useState(false)\n const [isExtracting, setIsExtracting] = useState(false)\n const [state, setState] = useState<SetupState>({\n step: 'welcome',\n isAuthenticated: !!authToken,\n selectedModules: ['analytics', 'seo', 'forms'],\n config: {},\n errors: [],\n context: {\n flow: null,\n step: 'welcome',\n project_id: projectId,\n org_id: orgId,\n },\n })\n \n const messagesEndRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const streamingMessageRef = useRef<string | null>(null)\n \n // ============================================\n // Signal API Integration with Streaming\n // ============================================\n \n const sendToSignalStreaming = useCallback(async (\n message: string, \n context: SetupContext,\n onToken: (token: string) => void,\n onComplete: (result: { actions?: ActionButton[]; updated_context?: Partial<SetupContext> }) => void\n ): Promise<void> => {\n try {\n const response = await fetch(`${signalUrl}/api/skills/setup/chat/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n body: JSON.stringify({\n message,\n context,\n project_id: projectId,\n org_id: orgId,\n }),\n })\n \n if (!response.ok) {\n throw new Error('Signal API error')\n }\n \n const reader = response.body?.getReader()\n if (!reader) throw new Error('No response body')\n \n const decoder = new TextDecoder()\n let buffer = ''\n let actions: ActionButton[] = []\n let updatedContext: Partial<SetupContext> = {}\n \n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n \n buffer += decoder.decode(value, { stream: true })\n \n // Process SSE events\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n \n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6)\n if (data === '[DONE]') continue\n \n try {\n const event = JSON.parse(data)\n \n if (event.type === 'token') {\n onToken(event.content)\n } else if (event.type === 'actions') {\n actions = event.actions\n } else if (event.type === 'context') {\n updatedContext = event.context\n }\n } catch {\n // Non-JSON data, treat as token\n onToken(data)\n }\n }\n }\n }\n \n onComplete({ actions, updated_context: updatedContext })\n } catch (error) {\n console.error('Signal streaming error:', error)\n // Fallback to non-streaming\n const result = await sendToSignal(message, context)\n onToken(result.response)\n onComplete({ actions: result.actions, updated_context: result.updated_context })\n }\n }, [signalUrl, authToken, projectId, orgId])\n \n const sendToSignal = useCallback(async (message: string, context: SetupContext): Promise<{\n response: string\n actions?: ActionButton[]\n updated_context?: Partial<SetupContext>\n }> => {\n try {\n const response = await fetch(`${signalUrl}/api/skills/setup/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n body: JSON.stringify({\n message,\n context,\n project_id: projectId,\n org_id: orgId,\n }),\n })\n \n if (!response.ok) {\n throw new Error('Signal API error')\n }\n \n return await response.json()\n } catch (error) {\n console.error('Signal API error:', error)\n // Fallback to local handling\n return {\n response: 'I had trouble connecting to Signal. Let me help you locally.',\n actions: [\n { id: '1', label: 'Continue', action: 'continue_local', variant: 'primary' },\n ],\n }\n }\n }, [signalUrl, authToken, projectId, orgId])\n \n // ============================================\n // Brand Extraction\n // ============================================\n \n const extractBrandFromDomain = useCallback(async (domain: string): Promise<BrandInfo | null> => {\n setIsExtracting(true)\n try {\n const response = await fetch(`${apiUrl}/site-scrape/brand-only`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n body: JSON.stringify({ domain }),\n })\n \n if (!response.ok) {\n throw new Error('Brand extraction failed')\n }\n \n const data = await response.json()\n return {\n business_name: data.business_name,\n tagline: data.tagline,\n primary_color: data.primary_color,\n secondary_color: data.secondary_color,\n logo_url: data.logo_url,\n phone_numbers: data.phone_numbers,\n email_addresses: data.email_addresses,\n social_profiles: data.social_profiles,\n }\n } catch (error) {\n console.error('Brand extraction error:', error)\n return null\n } finally {\n setIsExtracting(false)\n }\n }, [apiUrl, authToken])\n\n // ============================================\n // Message Helpers\n // ============================================\n \n const addMessage = useCallback((message: Omit<Message, 'id' | 'timestamp'>) => {\n const newMessage: Message = {\n ...message,\n id: crypto.randomUUID(),\n timestamp: new Date(),\n }\n setMessages(prev => [...prev, newMessage])\n return newMessage\n }, [])\n \n const updateMessage = useCallback((id: string, update: Partial<Message>) => {\n setMessages(prev => prev.map(m => \n m.id === id ? { ...m, ...update } : m\n ))\n }, [])\n \n const addStreamingMessage = useCallback(() => {\n const id = crypto.randomUUID()\n const newMessage: Message = {\n id,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n isStreaming: true,\n }\n setMessages(prev => [...prev, newMessage])\n streamingMessageRef.current = id\n return id\n }, [])\n \n const appendToStreamingMessage = useCallback((token: string) => {\n const id = streamingMessageRef.current\n if (!id) return\n \n setMessages(prev => prev.map(m => \n m.id === id ? { ...m, content: m.content + token } : m\n ))\n }, [])\n \n const finalizeStreamingMessage = useCallback((actions?: ActionButton[]) => {\n const id = streamingMessageRef.current\n if (!id) return\n \n setMessages(prev => prev.map(m => \n m.id === id ? { ...m, isStreaming: false, actions } : m\n ))\n streamingMessageRef.current = null\n }, [])\n \n const addAssistantMessage = useCallback((\n content: string, \n actions?: ActionButton[],\n component?: React.ReactNode\n ) => {\n setIsTyping(true)\n // Simulate typing delay\n setTimeout(() => {\n setIsTyping(false)\n addMessage({ role: 'assistant', content, actions, component })\n }, 500 + Math.random() * 500)\n }, [addMessage])\n \n const scrollToBottom = useCallback(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [])\n \n useEffect(() => {\n scrollToBottom()\n }, [messages, isTyping, scrollToBottom])\n\n // ============================================\n // Welcome Flow\n // ============================================\n \n useEffect(() => {\n // Initial welcome message with flow selection\n const welcome = welcomeMessage || \n `Hey! 👋 I'm Signal, your AI setup assistant.\\n\\nI'll help you integrate Uptrade Site-Kit into your project. What are we working with today?`\n \n setTimeout(() => {\n addAssistantMessage(welcome, [\n { id: '1', label: '🆕 New Site', action: 'set_flow_new', variant: 'primary' },\n { id: '2', label: '📁 Existing Project', action: 'set_flow_existing', variant: 'secondary' },\n { id: '3', label: '🔄 Rebuild from Live Site', action: 'set_flow_rebuild', variant: 'outline' },\n ])\n }, 500)\n }, [])\n\n // ============================================\n // Action Handlers\n // ============================================\n \n const handleAction = useCallback(async (action: string, data?: Record<string, unknown>) => {\n switch (action) {\n case 'start':\n addMessage({ role: 'user', content: \"Let's do it!\" })\n setState(prev => ({ ...prev, step: 'auth' }))\n addAssistantMessage(\n `Great! First, let's connect to your Uptrade Portal account.\\n\\nYou can sign in with your existing Portal credentials:`,\n [\n { id: '1', label: 'Sign in with Email', action: 'auth_email', variant: 'primary' },\n { id: '2', label: 'Sign in with Google', action: 'auth_google', variant: 'secondary' },\n { id: '3', label: \"I don't have an account\", action: 'auth_signup', variant: 'outline' },\n ]\n )\n break\n \n case 'explain':\n addMessage({ role: 'user', content: 'Tell me more first' })\n addAssistantMessage(\n `Uptrade Site-Kit is a lightweight package that connects your site to the Uptrade Portal.\\n\\n` +\n `Here's what you can enable:\\n\\n` +\n `📊 **Analytics** - Track page views, events, and Core Web Vitals\\n` +\n `🔍 **SEO** - Managed meta tags, FAQs, and schema markup\\n` +\n `📝 **Forms** - Portal-managed forms with spam protection\\n` +\n `💬 **Engage** - Live chat, popups, and nudges\\n` +\n `🛒 **Commerce** - Products, services, and checkout\\n` +\n `🤖 **Signal AI** - Autonomous optimization and A/B testing\\n\\n` +\n `You only pay for what you use, and everything is managed from your Portal dashboard.`,\n [\n { id: '1', label: \"Sounds good, let's set it up\", action: 'start', variant: 'primary' },\n ]\n )\n break\n \n case 'auth_email':\n addMessage({ role: 'user', content: 'Sign in with Email' })\n addAssistantMessage(\n `What's your Portal email address?`\n )\n setState(prev => ({ ...prev, step: 'auth' }))\n // Focus input for email entry\n setTimeout(() => inputRef.current?.focus(), 600)\n break\n \n case 'auth_google':\n addMessage({ role: 'user', content: 'Sign in with Google' })\n addAssistantMessage(\n `Opening Google sign-in... (In a real implementation, this would trigger OAuth)`\n )\n // Simulate successful auth\n setTimeout(() => {\n setState(prev => ({ \n ...prev, \n step: 'project',\n isAuthenticated: true,\n userEmail: 'user@example.com',\n }))\n handleAuthSuccess('user@example.com')\n }, 1500)\n break\n \n case 'select_project':\n addMessage({ role: 'user', content: `Selected: ${(data as any)?.name}` })\n setState(prev => ({ \n ...prev, \n step: 'modules',\n selectedProject: data as any,\n }))\n showModuleSelection()\n break\n \n case 'confirm_modules':\n addMessage({ role: 'user', content: `Selected ${state.selectedModules.length} modules` })\n setState(prev => ({ ...prev, step: 'config' }))\n showConfigGeneration()\n break\n \n case 'copy_code':\n addMessage({ role: 'user', content: 'Copy integration code' })\n // Copy to clipboard (would be implemented)\n addAssistantMessage(\n `✅ Code copied to clipboard!\\n\\nPaste this in your root layout file (e.g., \\`app/layout.tsx\\` or \\`pages/_app.tsx\\`).\\n\\nWant me to help you verify the integration?`,\n [\n { id: '1', label: 'Yes, verify my setup', action: 'verify', variant: 'primary' },\n { id: '2', label: \"I'm all set, thanks!\", action: 'complete', variant: 'outline' },\n ]\n )\n break\n \n case 'verify':\n addMessage({ role: 'user', content: 'Verify my setup' })\n setState(prev => ({ ...prev, step: 'verify' }))\n addAssistantMessage(\n `To verify your setup, start your dev server and visit any page.\\n\\n` +\n `I'll check for:\\n` +\n `• ✓ SiteKitProvider is loading\\n` +\n `• ✓ API key is valid\\n` +\n `• ✓ Analytics events are sending\\n` +\n `• ✓ Modules are initializing\\n\\n` +\n `Run \\`npm run dev\\` and let me know when you're ready:`,\n [\n { id: '1', label: 'My dev server is running', action: 'check_connection', variant: 'primary' },\n ]\n )\n break\n \n case 'check_connection':\n addMessage({ role: 'user', content: 'My dev server is running' })\n setIsTyping(true)\n // Simulate verification check\n setTimeout(() => {\n setIsTyping(false)\n addAssistantMessage(\n `🎉 **Everything looks great!**\\n\\n` +\n `I detected your site at \\`localhost:3000\\` and verified:\\n\\n` +\n `✅ SiteKitProvider initialized\\n` +\n `✅ API key authenticated\\n` +\n `✅ Analytics tracking active\\n` +\n `✅ SEO components ready\\n\\n` +\n `You're all set! Your data will start appearing in your Portal dashboard within a few minutes.`,\n [\n { id: '1', label: 'Open Portal Dashboard', action: 'open_dashboard', variant: 'primary' },\n { id: '2', label: 'Enable Signal AI', action: 'enable_signal', variant: 'secondary' },\n ]\n )\n setState(prev => ({ ...prev, step: 'complete' }))\n }, 2000)\n break\n \n case 'complete':\n addMessage({ role: 'user', content: \"I'm all set, thanks!\" })\n addAssistantMessage(\n `Awesome! 🚀\\n\\n` +\n `Your site-kit integration is ready. Here's what happens next:\\n\\n` +\n `• Analytics data will appear in Portal within ~5 minutes\\n` +\n `• You can manage SEO, forms, and engage from the dashboard\\n` +\n `• If you enabled Signal, it'll start learning from your traffic\\n\\n` +\n `Need help anytime? Just come back to \\`/_uptrade/setup\\` or ping us in Portal.\\n\\n` +\n `Happy building! 🎨`\n )\n onComplete?.(state)\n break\n \n case 'enable_signal':\n addMessage({ role: 'user', content: 'Enable Signal AI' })\n addAssistantMessage(\n `Great choice! 🤖\\n\\n` +\n `Signal AI will:\\n` +\n `• Monitor your site for SEO issues\\n` +\n `• Run A/B tests on CTAs and content\\n` +\n `• Optimize popups and engagement timing\\n` +\n `• Learn from user behavior to improve conversions\\n\\n` +\n `To enable Signal, add \\`signal={{ enabled: true }}\\` to your SiteKitProvider:\\n\\n` +\n `\\`\\`\\`tsx\\n` +\n `<SiteKitProvider\\n` +\n ` apiKey={process.env.NEXT_PUBLIC_UPTRADE_API_KEY!}\\n` +\n ` analytics={{ enabled: true }}\\n` +\n ` signal={{ enabled: true }} // Add this\\n` +\n `>\\n` +\n `\\`\\`\\`\\n\\n` +\n `Signal requires the Business plan. Want me to check your plan?`,\n [\n { id: '1', label: 'Check my plan', action: 'check_plan', variant: 'primary' },\n { id: '2', label: \"I'll do this later\", action: 'complete', variant: 'outline' },\n ]\n )\n break\n \n case 'confirm_brand':\n addMessage({ role: 'user', content: 'Brand info confirmed' })\n setState(prev => ({ ...prev, step: 'modules' }))\n showModuleSelectionWithRecommendations()\n break\n \n case 'edit_brand':\n addMessage({ role: 'user', content: 'Edit brand info' })\n addAssistantMessage(\n `No problem! Let me know what to change:\\n\\n` +\n `• Business name\\n` +\n `• Primary color (hex like #3b82f6)\\n` +\n `• Tagline\\n\\n` +\n `Just type what you'd like to update.`\n )\n break\n \n case 'manual_brand':\n addMessage({ role: 'user', content: 'Enter brand manually' })\n addAssistantMessage(\n `Sure! What's your business name?`\n )\n setState(prev => ({ \n ...prev, \n context: { ...prev.context, step: 'brand_manual' } \n }))\n break\n \n case 'skip_brand':\n addMessage({ role: 'user', content: 'Skip brand for now' })\n setState(prev => ({ ...prev, step: 'modules' }))\n showModuleSelection()\n break\n \n case 'extract_brand':\n addMessage({ role: 'user', content: 'Extract from website' })\n addAssistantMessage(\n `What's the website URL? I'll extract the brand colors, name, and logo.`\n )\n break\n \n case 'set_flow_new':\n addMessage({ role: 'user', content: 'New Site' })\n setState(prev => ({ \n ...prev, \n context: { ...prev.context, flow: 'new', step: 'brand' }\n }))\n addAssistantMessage(\n `Great! For a new site, I'll help you:\\n\\n` +\n `1. Set up your brand (colors, name)\\n` +\n `2. Choose which modules to enable\\n` +\n `3. Generate integration code\\n\\n` +\n `Do you have an existing website I can extract brand info from? Or would you prefer to enter it manually?`,\n [\n { id: '1', label: 'Extract from website', action: 'extract_brand', variant: 'primary' },\n { id: '2', label: 'Enter manually', action: 'manual_brand', variant: 'outline' },\n { id: '3', label: 'Skip for now', action: 'skip_brand', variant: 'outline' },\n ]\n )\n break\n \n case 'set_flow_existing':\n addMessage({ role: 'user', content: 'Existing Project' })\n setState(prev => ({ \n ...prev, \n context: { ...prev.context, flow: 'existing', step: 'scan' }\n }))\n addAssistantMessage(\n `For an existing project, I can scan your codebase to find:\\n\\n` +\n `• Forms to migrate (contact forms, newsletter signups)\\n` +\n `• Chat widgets to replace (Intercom, Crisp, etc.)\\n` +\n `• Metadata patterns to enhance\\n` +\n `• Sitemap configuration\\n\\n` +\n `Run this in your project root:\\n\\n` +\n `\\`\\`\\`bash\\nnpx @uptrade/site-kit scan\\n\\`\\`\\`\\n\\n` +\n `Then paste the output here, or tell me about your project.`,\n [\n { id: '1', label: 'I ran the scan', action: 'show_scan_results', variant: 'primary' },\n { id: '2', label: 'Skip scan', action: 'skip_scan', variant: 'outline' },\n ]\n )\n break\n \n case 'set_flow_rebuild':\n addMessage({ role: 'user', content: 'Rebuild from Live Site' })\n setState(prev => ({ \n ...prev, \n context: { ...prev.context, flow: 'rebuild', step: 'scrape' }\n }))\n addAssistantMessage(\n `I'll help you rebuild with site-kit. Enter the live site URL and I'll:\\n\\n` +\n `• Extract brand colors and business info\\n` +\n `• Import FAQs with schema markup\\n` +\n `• Suggest redirect mappings\\n` +\n `• Generate copilot-instructions.md\\n\\n` +\n `What's the website URL?`\n )\n break\n \n case 'show_scan_results':\n addMessage({ role: 'user', content: 'I ran the scan' })\n addAssistantMessage(\n `Great! Paste the scan output here, or describe what you found.\\n\\n` +\n `I'll analyze the results and recommend a migration plan.`\n )\n break\n \n case 'skip_scan':\n addMessage({ role: 'user', content: 'Skip scan' })\n setState(prev => ({ ...prev, step: 'modules' }))\n showModuleSelection()\n break\n \n case 'generate_redirects':\n addMessage({ role: 'user', content: 'Generate redirects' })\n if (state.context.scrape_results?.routes) {\n addStreamingMessage()\n await sendToSignalStreaming(\n `Generate SEO-optimized redirects for these routes: ${JSON.stringify(state.context.scrape_results.routes)}`,\n state.context,\n (token) => appendToStreamingMessage(token),\n (result) => finalizeStreamingMessage(result.actions)\n )\n } else {\n addAssistantMessage(\n `I need a list of routes to generate redirects. Would you like to:\\n\\n` +\n `1. Scrape a website for routes\\n` +\n `2. Paste a list of URLs\\n\\n` +\n `What's easier?`,\n [\n { id: '1', label: 'Scrape website', action: 'set_flow_rebuild', variant: 'primary' },\n { id: '2', label: 'Paste URLs', action: 'paste_urls', variant: 'outline' },\n ]\n )\n }\n break\n \n case 'generate_copilot_instructions':\n addMessage({ role: 'user', content: 'Generate Copilot instructions' })\n addStreamingMessage()\n await sendToSignalStreaming(\n `Generate copilot-instructions.md for project with modules: ${state.selectedModules.join(', ')} and brand: ${state.context.brand?.business_name || 'Unknown'}`,\n state.context,\n (token) => appendToStreamingMessage(token),\n (result) => {\n finalizeStreamingMessage([\n { id: '1', label: '📋 Copy to clipboard', action: 'copy_copilot_instructions', variant: 'primary' },\n { id: '2', label: 'Continue', action: 'complete', variant: 'outline' },\n ])\n }\n )\n break\n \n case 'verify_now':\n addMessage({ role: 'user', content: 'Verify integration' })\n verifyIntegration()\n break\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [addMessage, addAssistantMessage, addStreamingMessage, appendToStreamingMessage, finalizeStreamingMessage, sendToSignalStreaming, state, onComplete])\n \n // ============================================\n // Auth Success Handler\n // ============================================\n \n const handleAuthSuccess = useCallback((email: string) => {\n addAssistantMessage(\n `Welcome back, ${email.split('@')[0]}! 👋\\n\\n` +\n `I found these projects in your account. Which one are we setting up?`,\n [\n { id: '1', label: 'MyCompany.com', action: 'select_project', variant: 'secondary', data: { id: '1', name: 'MyCompany.com', domain: 'mycompany.com' } },\n { id: '2', label: 'Blog Project', action: 'select_project', variant: 'secondary', data: { id: '2', name: 'Blog Project', domain: 'blog.mycompany.com' } },\n { id: '3', label: '+ Create new project', action: 'create_project', variant: 'outline' },\n ]\n )\n }, [addAssistantMessage])\n \n // ============================================\n // Integration Verification\n // ============================================\n \n const verifyIntegration = useCallback(async () => {\n setState(prev => ({ ...prev, step: 'verify' }))\n setIsTyping(true)\n \n try {\n const response = await fetch(`${signalUrl}/api/skills/setup/verify`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n body: JSON.stringify({\n project_id: projectId || state.context.project_id,\n dev_url: 'http://localhost:3000',\n }),\n })\n \n setIsTyping(false)\n \n if (!response.ok) {\n throw new Error('Verification failed')\n }\n \n const result = await response.json()\n \n if (result.overall_status === 'success') {\n const checkList = result.checks.map((c: { check: string; passed: boolean }) => \n `${c.passed ? '✅' : '❌'} ${c.check.replace(/_/g, ' ')}`\n ).join('\\n')\n \n addAssistantMessage(\n `🎉 **Integration Verified!**\\n\\n${checkList}\\n\\n` +\n `Your site-kit integration is working perfectly. Data will start appearing in Portal shortly.`,\n [\n { id: '1', label: 'Open Portal Dashboard', action: 'open_dashboard', variant: 'primary' },\n { id: '2', label: 'Generate Copilot Instructions', action: 'generate_copilot_instructions', variant: 'secondary' },\n ]\n )\n setState(prev => ({ ...prev, step: 'complete' }))\n } else {\n const issues = result.issues?.join('\\n• ') || 'Unknown issue'\n addAssistantMessage(\n `⚠️ **Verification Found Issues**\\n\\n• ${issues}\\n\\n` +\n `Would you like help troubleshooting?`,\n [\n { id: '1', label: 'Help me fix this', action: 'troubleshoot', variant: 'primary' },\n { id: '2', label: 'Skip for now', action: 'complete', variant: 'outline' },\n ]\n )\n }\n } catch (error) {\n setIsTyping(false)\n addAssistantMessage(\n `I couldn't verify the integration automatically. Make sure your dev server is running.\\n\\n` +\n `You can manually verify by:\\n` +\n `1. Opening your site in the browser\\n` +\n `2. Checking the Network tab for requests to api.uptrademedia.com\\n` +\n `3. Looking for analytics events in your Portal dashboard`,\n [\n { id: '1', label: 'Try again', action: 'verify_now', variant: 'primary' },\n { id: '2', label: 'Continue anyway', action: 'complete', variant: 'outline' },\n ]\n )\n }\n }, [signalUrl, authToken, projectId, state.context.project_id, addAssistantMessage])\n \n // ============================================\n // Module Selection with Recommendations\n // ============================================\n \n const showModuleSelectionWithRecommendations = useCallback(async () => {\n const { brand, business_type, scan_results } = state.context\n \n // Get AI recommendations if we have context\n if (brand || business_type) {\n try {\n const result = await sendToSignal(\n `Recommend modules for: ${brand?.business_name || 'Unknown'}, type: ${business_type || 'general'}`,\n { ...state.context, step: 'recommend_modules' }\n )\n \n // Parse recommendations from response\n addAssistantMessage(\n result.response,\n undefined,\n <ModuleSelector\n modules={MODULES}\n selected={state.selectedModules}\n onChange={(modules) => setState(prev => ({ ...prev, selectedModules: modules }))}\n onConfirm={() => handleAction('confirm_modules')}\n />\n )\n return\n } catch (error) {\n // Fall back to default\n }\n }\n \n // Default module selection\n showModuleSelection()\n }, [state.context, state.selectedModules, sendToSignal, handleAction])\n\n // ============================================\n // Module Selection\n // ============================================\n \n const showModuleSelection = useCallback(() => {\n addAssistantMessage(\n `Perfect! Now let's choose which features to enable.\\n\\n` +\n `I've pre-selected the essentials, but you can customize:`,\n undefined,\n <ModuleSelector\n modules={MODULES}\n selected={state.selectedModules}\n onChange={(modules) => setState(prev => ({ ...prev, selectedModules: modules }))}\n onConfirm={() => handleAction('confirm_modules')}\n />\n )\n }, [addAssistantMessage, state.selectedModules, handleAction])\n \n // ============================================\n // Config Generation\n // ============================================\n \n const showConfigGeneration = useCallback(() => {\n const code = generateIntegrationCode(state)\n \n addAssistantMessage(\n `Here's your integration code! 🎉\\n\\n` +\n `Add this to your root layout:`,\n [\n { id: '1', label: '📋 Copy Code', action: 'copy_code', variant: 'primary' },\n ],\n <CodeBlock code={code} />\n )\n }, [addAssistantMessage, state])\n \n // ============================================\n // Text Input Handler\n // ============================================\n \n const handleSubmit = useCallback(async (e: React.FormEvent) => {\n e.preventDefault()\n if (!input.trim()) return\n \n const userInput = input.trim()\n setInput('')\n addMessage({ role: 'user', content: userInput })\n \n // Handle based on current step\n if (state.step === 'auth' && userInput.includes('@')) {\n // Email entered\n setState(prev => ({ \n ...prev, \n isAuthenticated: true,\n userEmail: userInput,\n step: 'project',\n }))\n addAssistantMessage(\n `Sending magic link to ${userInput}...\\n\\n` +\n `(In production, you'd receive an email. For now, I'll simulate a successful login.)`,\n )\n setTimeout(() => handleAuthSuccess(userInput), 1500)\n } else if (userInput.toLowerCase().includes('http') || userInput.match(/^[\\w.-]+\\.[a-z]{2,}$/i)) {\n // URL or domain entered - extract brand\n const domain = userInput.replace(/^https?:\\/\\//, '').split('/')[0]\n setIsTyping(true)\n addAssistantMessage(`Analyzing ${domain} to extract brand information...`)\n \n const brand = await extractBrandFromDomain(domain)\n setIsTyping(false)\n \n if (brand) {\n setState(prev => ({\n ...prev,\n context: { ...prev.context, brand, domain },\n }))\n \n const brandSummary = [\n brand.business_name && `**Business:** ${brand.business_name}`,\n brand.tagline && `**Tagline:** ${brand.tagline}`,\n brand.primary_color && `**Primary Color:** ${brand.primary_color}`,\n brand.phone_numbers?.length && `**Phone:** ${brand.phone_numbers[0]}`,\n ].filter(Boolean).join('\\n')\n \n addAssistantMessage(\n `Found brand information:\\n\\n${brandSummary}\\n\\nDoes this look right?`,\n [\n { id: '1', label: 'Yes, looks good!', action: 'confirm_brand', variant: 'primary' },\n { id: '2', label: 'Edit brand info', action: 'edit_brand', variant: 'outline' },\n ]\n )\n } else {\n addAssistantMessage(\n `I couldn't extract brand info from ${domain}. You can enter it manually, or we can continue without it.`,\n [\n { id: '1', label: 'Enter manually', action: 'manual_brand', variant: 'primary' },\n { id: '2', label: 'Skip for now', action: 'skip_brand', variant: 'outline' },\n ]\n )\n }\n } else {\n // Natural language input - send to Signal API with streaming\n addStreamingMessage()\n \n try {\n await sendToSignalStreaming(\n userInput, \n state.context,\n (token) => appendToStreamingMessage(token),\n (result) => {\n if (result.updated_context) {\n setState(prev => ({\n ...prev,\n context: { ...prev.context, ...result.updated_context },\n }))\n }\n finalizeStreamingMessage(result.actions)\n }\n )\n } catch (error) {\n finalizeStreamingMessage()\n addAssistantMessage(\n `I understand you said: \"${userInput}\"\\n\\n` +\n `Let me help you with that. What would you like to do?`,\n [\n { id: '1', label: 'Continue setup', action: 'start', variant: 'primary' },\n { id: '2', label: 'Ask a question', action: 'help', variant: 'outline' },\n ]\n )\n }\n }\n }, [input, state.step, state.context, addMessage, addAssistantMessage, handleAuthSuccess, sendToSignalStreaming, appendToStreamingMessage, finalizeStreamingMessage, addStreamingMessage, extractBrandFromDomain])\n\n // ============================================\n // Render\n // ============================================\n \n return (\n <div style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n <div style={styles.logo}>U</div>\n <div>\n <div style={styles.title}>Uptrade Setup</div>\n <div style={styles.subtitle}>Site-Kit Integration Wizard</div>\n </div>\n </div>\n \n {/* Messages */}\n <div style={styles.messages}>\n {messages.map(message => (\n <div\n key={message.id}\n style={{\n ...styles.message,\n ...(message.role === 'assistant' ? styles.messageAssistant : styles.messageUser),\n }}\n >\n <div\n style={{\n ...styles.avatar,\n ...(message.role === 'assistant' ? styles.avatarAssistant : styles.avatarUser),\n }}\n >\n {message.role === 'assistant' ? '✨' : '👤'}\n </div>\n <div>\n <div\n style={{\n ...styles.bubble,\n ...(message.role === 'assistant' ? styles.bubbleAssistant : styles.bubbleUser),\n }}\n >\n {message.content.split('\\n').map((line, i) => (\n <React.Fragment key={i}>\n {line}\n {i < message.content.split('\\n').length - 1 && <br />}\n </React.Fragment>\n ))}\n </div>\n \n {/* Custom component */}\n {message.component}\n \n {/* Action buttons */}\n {message.actions && (\n <div style={styles.actions}>\n {message.actions.map(action => (\n <button\n key={action.id}\n onClick={() => handleAction(action.action, action.data)}\n style={{\n ...styles.actionButton,\n ...(action.variant === 'primary' ? styles.actionPrimary : \n action.variant === 'outline' ? styles.actionOutline :\n styles.actionSecondary),\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n \n {/* Typing indicator */}\n {isTyping && (\n <div style={{ ...styles.message, ...styles.messageAssistant }}>\n <div style={{ ...styles.avatar, ...styles.avatarAssistant }}>✨</div>\n <div style={styles.typing}>\n <div style={{ ...styles.typingDot, animationDelay: '0s' }} />\n <div style={{ ...styles.typingDot, animationDelay: '0.2s' }} />\n <div style={{ ...styles.typingDot, animationDelay: '0.4s' }} />\n </div>\n </div>\n )}\n \n <div ref={messagesEndRef} />\n </div>\n \n {/* Input */}\n <form onSubmit={handleSubmit} style={styles.inputContainer}>\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type a message...\"\n style={styles.input}\n />\n <button type=\"submit\" style={styles.sendButton}>\n Send\n </button>\n </form>\n \n {/* Typing animation keyframes */}\n <style>{`\n @keyframes typing {\n 0%, 60%, 100% { transform: translateY(0); opacity: 0.5; }\n 30% { transform: translateY(-4px); opacity: 1; }\n }\n `}</style>\n </div>\n )\n}\n\n// ============================================\n// Module Selector Component\n// ============================================\n\nfunction ModuleSelector({\n modules,\n selected,\n onChange,\n onConfirm,\n}: {\n modules: typeof MODULES\n selected: string[]\n onChange: (modules: string[]) => void\n onConfirm: () => void\n}) {\n const toggle = (id: string) => {\n onChange(\n selected.includes(id)\n ? selected.filter(m => m !== id)\n : [...selected, id]\n )\n }\n \n return (\n <div style={{ marginTop: '0.75rem', display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n {modules.map(module => (\n <div\n key={module.id}\n onClick={() => toggle(module.id)}\n style={{\n ...styles.moduleCard,\n ...(selected.includes(module.id) ? styles.moduleCardSelected : {}),\n }}\n >\n <span style={styles.moduleIcon}>{module.icon}</span>\n <div style={styles.moduleInfo}>\n <div style={styles.moduleName}>\n {module.name}\n {module.recommended && (\n <span style={{ marginLeft: '0.5rem', fontSize: '0.625rem', background: '#dbeafe', color: '#1d4ed8', padding: '2px 6px', borderRadius: '4px' }}>\n Recommended\n </span>\n )}\n </div>\n <div style={styles.moduleDesc}>{module.description}</div>\n </div>\n <input\n type=\"checkbox\"\n checked={selected.includes(module.id)}\n onChange={() => toggle(module.id)}\n style={styles.checkbox}\n />\n </div>\n ))}\n \n <button\n onClick={onConfirm}\n style={{ ...styles.actionButton, ...styles.actionPrimary, marginTop: '0.5rem' }}\n >\n Continue with {selected.length} modules\n </button>\n </div>\n )\n}\n\n// ============================================\n// Code Block Component\n// ============================================\n\nfunction CodeBlock({ code }: { code: string }) {\n return (\n <pre style={{\n marginTop: '0.75rem',\n padding: '1rem',\n background: '#1f2937',\n color: '#e5e7eb',\n borderRadius: '0.5rem',\n fontSize: '0.8125rem',\n overflowX: 'auto',\n fontFamily: 'monospace',\n }}>\n {code}\n </pre>\n )\n}\n\n// ============================================\n// Code Generation\n// ============================================\n\nfunction generateIntegrationCode(state: SetupState): string {\n const { selectedModules } = state\n \n const moduleConfigs: string[] = []\n \n if (selectedModules.includes('analytics')) {\n moduleConfigs.push(` analytics={{ enabled: true }}`)\n }\n \n if (selectedModules.includes('engage')) {\n moduleConfigs.push(` engage={{ enabled: true }}`)\n }\n \n if (selectedModules.includes('forms')) {\n moduleConfigs.push(` forms={{ enabled: true }}`)\n }\n \n if (selectedModules.includes('signal')) {\n moduleConfigs.push(` signal={{ enabled: true, realtime: true }}`)\n }\n \n return `// app/layout.tsx (or pages/_app.tsx)\nimport { SiteKitProvider } from '@uptrade/site-kit'\n\nexport default function RootLayout({ children }) {\n return (\n <html>\n <body>\n <SiteKitProvider\n apiKey={process.env.NEXT_PUBLIC_UPTRADE_API_KEY!}\n${moduleConfigs.join('\\n')}\n >\n {children}\n </SiteKitProvider>\n </body>\n </html>\n )\n}`\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkBZBJVG5Y_js = require('../chunk-BZBJVG5Y.js');
|
|
4
|
+
require('../chunk-EQCVQC35.js');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "clearRedirectCache", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunkBZBJVG5Y_js.clearRedirectCache; }
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "fetchRedirectRules", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return chunkBZBJVG5Y_js.fetchRedirectRules; }
|
|
15
|
+
});
|
|
16
|
+
Object.defineProperty(exports, "generateNextRedirects", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return chunkBZBJVG5Y_js.generateNextRedirects; }
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(exports, "handleManagedRedirects", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: function () { return chunkBZBJVG5Y_js.handleManagedRedirects; }
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|
|
@@ -13976,7 +13976,8 @@ async function scanCodebase(rootDir) {
|
|
|
13976
13976
|
const results = {
|
|
13977
13977
|
forms: [],
|
|
13978
13978
|
metadata: [],
|
|
13979
|
-
widgets: []
|
|
13979
|
+
widgets: [],
|
|
13980
|
+
sitemaps: []
|
|
13980
13981
|
};
|
|
13981
13982
|
const files = await findSourceFiles(rootDir);
|
|
13982
13983
|
for (const file of files) {
|
|
@@ -13993,10 +13994,14 @@ async function scanCodebase(rootDir) {
|
|
|
13993
13994
|
results.metadata.push(...metadata);
|
|
13994
13995
|
const widgets = scanForWidgets(ast, content, relPath);
|
|
13995
13996
|
results.widgets.push(...widgets);
|
|
13997
|
+
const sitemaps = scanForSitemaps(content, relPath);
|
|
13998
|
+
results.sitemaps.push(...sitemaps);
|
|
13996
13999
|
} catch (error) {
|
|
13997
14000
|
continue;
|
|
13998
14001
|
}
|
|
13999
14002
|
}
|
|
14003
|
+
const sitemapFiles = await scanForSitemapFiles(rootDir);
|
|
14004
|
+
results.sitemaps.push(...sitemapFiles);
|
|
14000
14005
|
return results;
|
|
14001
14006
|
}
|
|
14002
14007
|
async function findSourceFiles(dir, files = []) {
|
|
@@ -14380,7 +14385,121 @@ function scanForWidgets(ast, content, filePath) {
|
|
|
14380
14385
|
}
|
|
14381
14386
|
return widgets;
|
|
14382
14387
|
}
|
|
14388
|
+
function scanForSitemaps(content, filePath) {
|
|
14389
|
+
const sitemaps = [];
|
|
14390
|
+
if (content.includes("next-sitemap") && !content.includes("@uptrade/site-kit")) {
|
|
14391
|
+
sitemaps.push({
|
|
14392
|
+
filePath,
|
|
14393
|
+
type: "next-sitemap",
|
|
14394
|
+
generator: "next-sitemap",
|
|
14395
|
+
startLine: findLineNumber(content, "next-sitemap"),
|
|
14396
|
+
endLine: findLineNumber(content, "next-sitemap") + 10
|
|
14397
|
+
});
|
|
14398
|
+
}
|
|
14399
|
+
if ((filePath.endsWith("sitemap.ts") || filePath.endsWith("sitemap.js")) && !content.includes("@uptrade/site-kit")) {
|
|
14400
|
+
const isNextPattern = content.includes("MetadataRoute.Sitemap") || content.includes("export default") || content.includes("export async function");
|
|
14401
|
+
if (isNextPattern) {
|
|
14402
|
+
sitemaps.push({
|
|
14403
|
+
filePath,
|
|
14404
|
+
type: "custom-sitemap",
|
|
14405
|
+
generator: "custom",
|
|
14406
|
+
startLine: 1,
|
|
14407
|
+
endLine: content.split("\n").length,
|
|
14408
|
+
details: {
|
|
14409
|
+
hasAsyncFunction: content.includes("async"),
|
|
14410
|
+
hasDatabaseQuery: content.includes("supabase") || content.includes("prisma") || content.includes("sql")
|
|
14411
|
+
}
|
|
14412
|
+
});
|
|
14413
|
+
}
|
|
14414
|
+
}
|
|
14415
|
+
if (content.includes("@uptrade/site-kit/sitemap") || content.includes("createSitemap")) {
|
|
14416
|
+
sitemaps.push({
|
|
14417
|
+
filePath,
|
|
14418
|
+
type: "custom-sitemap",
|
|
14419
|
+
generator: "site-kit",
|
|
14420
|
+
startLine: findLineNumber(content, "createSitemap"),
|
|
14421
|
+
endLine: findLineNumber(content, "createSitemap") + 10
|
|
14422
|
+
});
|
|
14423
|
+
}
|
|
14424
|
+
return sitemaps;
|
|
14425
|
+
}
|
|
14426
|
+
function findLineNumber(content, search) {
|
|
14427
|
+
const lines = content.split("\n");
|
|
14428
|
+
for (let i = 0; i < lines.length; i++) {
|
|
14429
|
+
if (lines[i].includes(search)) {
|
|
14430
|
+
return i + 1;
|
|
14431
|
+
}
|
|
14432
|
+
}
|
|
14433
|
+
return 1;
|
|
14434
|
+
}
|
|
14435
|
+
async function scanForSitemapFiles(rootDir) {
|
|
14436
|
+
const sitemaps = [];
|
|
14437
|
+
const configPaths = [
|
|
14438
|
+
"next-sitemap.config.js",
|
|
14439
|
+
"next-sitemap.config.mjs",
|
|
14440
|
+
"next-sitemap.config.ts"
|
|
14441
|
+
];
|
|
14442
|
+
for (const configPath of configPaths) {
|
|
14443
|
+
const fullPath = path.join(rootDir, configPath);
|
|
14444
|
+
try {
|
|
14445
|
+
await fs.access(fullPath);
|
|
14446
|
+
const content = await fs.readFile(fullPath, "utf-8");
|
|
14447
|
+
sitemaps.push({
|
|
14448
|
+
filePath: configPath,
|
|
14449
|
+
type: "next-sitemap-config",
|
|
14450
|
+
generator: "next-sitemap",
|
|
14451
|
+
startLine: 1,
|
|
14452
|
+
endLine: content.split("\n").length,
|
|
14453
|
+
details: {
|
|
14454
|
+
hasRobotsTxt: content.includes("generateRobotsTxt"),
|
|
14455
|
+
excludePaths: extractExcludePaths(content)
|
|
14456
|
+
}
|
|
14457
|
+
});
|
|
14458
|
+
} catch {
|
|
14459
|
+
}
|
|
14460
|
+
}
|
|
14461
|
+
const staticSitemapPath = path.join(rootDir, "public", "sitemap.xml");
|
|
14462
|
+
try {
|
|
14463
|
+
await fs.access(staticSitemapPath);
|
|
14464
|
+
const content = await fs.readFile(staticSitemapPath, "utf-8");
|
|
14465
|
+
const urlCount = (content.match(/<url>/g) || []).length;
|
|
14466
|
+
sitemaps.push({
|
|
14467
|
+
filePath: "public/sitemap.xml",
|
|
14468
|
+
type: "static-xml",
|
|
14469
|
+
generator: "static",
|
|
14470
|
+
startLine: 1,
|
|
14471
|
+
endLine: content.split("\n").length,
|
|
14472
|
+
details: {
|
|
14473
|
+
urlCount,
|
|
14474
|
+
isIndex: content.includes("<sitemapindex")
|
|
14475
|
+
}
|
|
14476
|
+
});
|
|
14477
|
+
} catch {
|
|
14478
|
+
}
|
|
14479
|
+
const generatedPaths = [
|
|
14480
|
+
".next/server/app/sitemap.xml",
|
|
14481
|
+
"out/sitemap.xml"
|
|
14482
|
+
];
|
|
14483
|
+
for (const genPath of generatedPaths) {
|
|
14484
|
+
const fullPath = path.join(rootDir, genPath);
|
|
14485
|
+
try {
|
|
14486
|
+
await fs.access(fullPath);
|
|
14487
|
+
} catch {
|
|
14488
|
+
}
|
|
14489
|
+
}
|
|
14490
|
+
return sitemaps;
|
|
14491
|
+
}
|
|
14492
|
+
function extractExcludePaths(content) {
|
|
14493
|
+
const excludeMatch = content.match(/exclude:\s*\[([\s\S]*?)\]/);
|
|
14494
|
+
if (!excludeMatch) return [];
|
|
14495
|
+
const paths = [];
|
|
14496
|
+
const matches = excludeMatch[1].matchAll(/['"]([^'"]+)['"]/g);
|
|
14497
|
+
for (const match of matches) {
|
|
14498
|
+
paths.push(match[1]);
|
|
14499
|
+
}
|
|
14500
|
+
return paths;
|
|
14501
|
+
}
|
|
14383
14502
|
|
|
14384
|
-
export { scanCodebase, scanForForms, scanForMetadata, scanForWidgets };
|
|
14385
|
-
//# sourceMappingURL=scanner-
|
|
14386
|
-
//# sourceMappingURL=scanner-
|
|
14503
|
+
export { scanCodebase, scanForForms, scanForMetadata, scanForSitemapFiles, scanForSitemaps, scanForWidgets };
|
|
14504
|
+
//# sourceMappingURL=scanner-AZV5I6US.mjs.map
|
|
14505
|
+
//# sourceMappingURL=scanner-AZV5I6US.mjs.map
|