shared-features 0.1.12 → 0.1.13

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-LBaVvWGt.cjs","sources":["../src/components/ads/AdPanel.tsx","../src/components/ads/variants/SmallPanelVariants.tsx","../src/components/ads/AdSlider.tsx","../src/components/ads/AdModal.tsx","../src/components/ads/variants/LargePanelVariants.tsx","../src/components/ads/AdUpdateModal.tsx","../src/components/ads/AdBanner.tsx","../src/components/ads/TopbarAdBanner.tsx","../src/components/ads/AdCarousel.tsx","../src/components/notifications/BroadcastBanner.tsx","../src/components/notifications/AnnouncementModal.tsx","../src/components/common/index.tsx"],"sourcesContent":["/**\n * AdPanel Component\n *\n * A simple ad panel component that displays a single campaign.\n * Can be placed in sidebars, footers, or other static locations.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useEffect, useRef } from 'react';\nimport { Box, Flex, Text, Button, IconButton } from '@radix-ui/themes';\nimport { Cross2Icon } from '@radix-ui/react-icons';\nimport { useCampaign } from '../../hooks/useCampaigns';\nimport type { AdPanelProps } from '../../types/campaigns';\n\n/**\n * AdPanel displays a single campaign in a compact panel format.\n *\n * @example\n * ```tsx\n * <AdPanel placement=\"sidebar_panel\" variant=\"small_panel_2\" />\n * ```\n */\nexport function AdPanel({\n placement,\n variant: _variant = 'small_panel_2',\n className,\n}: AdPanelProps) {\n // TODO: variant will be used for different display styles in future variants\n const { campaign, loading, error, recordImpression, recordClick, recordClose } =\n useCampaign({ placement });\n\n const hasRecordedImpression = useRef(false);\n\n // Record impression when campaign is first displayed\n useEffect(() => {\n if (campaign && !hasRecordedImpression.current) {\n hasRecordedImpression.current = true;\n recordImpression(campaign);\n }\n }, [campaign, recordImpression]);\n\n if (loading || error || !campaign) {\n return null;\n }\n\n const handleClick = () => {\n recordClick(campaign);\n const url = campaign.customCtaUrl || campaign.product.url;\n window.open(url, '_blank', 'noopener,noreferrer');\n };\n\n const handleClose = () => {\n recordClose(campaign);\n // Hide the panel (could use state or CSS)\n };\n\n const title = campaign.customTitle || campaign.product.name;\n const tagline = campaign.customTagline || campaign.product.tagline;\n const ctaText = campaign.customCta || 'Learn More';\n const color = campaign.customProductColor || campaign.product.color;\n\n return (\n <Box\n className={className}\n style={{\n border: `1px solid ${color}`,\n borderRadius: '8px',\n padding: '12px',\n backgroundColor: `${color}10`,\n position: 'relative',\n }}\n >\n <IconButton\n size=\"1\"\n variant=\"ghost\"\n onClick={handleClose}\n style={{\n position: 'absolute',\n top: '4px',\n right: '4px',\n }}\n >\n <Cross2Icon />\n </IconButton>\n\n <Flex direction=\"column\" gap=\"2\">\n <Flex align=\"center\" gap=\"2\">\n {campaign.product.icon64 && (\n <Box\n dangerouslySetInnerHTML={{ __html: campaign.product.icon64 }}\n style={{ width: 32, height: 32 }}\n />\n )}\n <Text weight=\"bold\" size=\"3\" style={{ color }}>\n {title}\n </Text>\n </Flex>\n\n <Text size=\"2\" color=\"gray\">\n {tagline}\n </Text>\n\n <Button\n size=\"2\"\n onClick={handleClick}\n style={{ backgroundColor: color }}\n >\n {ctaText}\n </Button>\n </Flex>\n </Box>\n );\n}\n\nexport default AdPanel;\n","/**\n * Small Panel Variants for Advertising\n *\n * 5 variants for small promotional panels:\n * 1. Minimal - Icon + Name + Link\n * 2. Tagline - Icon + Name + Tagline + CTA\n * 3. Features - Icon + Name + Feature pills + CTA\n * 4. Gradient - Full gradient background\n * 5. Card - Elevated card with shadow\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { Box, Flex, Text, Button, Link, Card, Badge } from '@radix-ui/themes';\nimport { ExternalLink, Check, X, Sparkles } from 'lucide-react';\nimport type { CampaignWithProduct, SmallPanelProps } from '../../../types/campaigns';\n\n/**\n * Helper to get display values from campaign\n */\nfunction getDisplayValues(campaign: CampaignWithProduct) {\n const isCustomProduct = !campaign.product.icon64 && campaign.customIcon;\n\n return {\n displayTitle: campaign.customTitle || campaign.product.name,\n displayTagline: campaign.customTagline || campaign.product.tagline,\n displayCta: campaign.customCta || 'Learn More',\n displayUrl: campaign.customCtaUrl || campaign.product.url,\n displayIcon: campaign.customIcon || campaign.product.icon64 || '',\n displayColor: campaign.customProductColor || campaign.product.color || '#3B82F6',\n displayFeatures: campaign.customFeatures || campaign.product.features || [],\n isCustomProduct,\n };\n}\n\n/**\n * Variant 1: Minimal - Icon + Name + Link\n */\nexport function MinimalVariant({ campaign, onCTAClick, onClose }: SmallPanelProps) {\n const { displayTitle, displayCta, displayUrl, displayIcon, displayColor } = getDisplayValues(campaign);\n\n return (\n <Card size=\"1\">\n <Flex align=\"center\" justify=\"between\" gap=\"3\" p=\"2\">\n <Flex align=\"center\" gap=\"3\">\n <Box\n style={{\n width: 32,\n height: 32,\n borderRadius: 'var(--radius-2)',\n background: `color-mix(in srgb, ${displayColor} 15%, transparent)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n />\n <Text size=\"2\" weight=\"medium\">\n {displayTitle}\n </Text>\n </Flex>\n <Flex align=\"center\" gap=\"2\">\n <Link\n href={displayUrl}\n target=\"_blank\"\n onClick={onCTAClick}\n style={{ textDecoration: 'none' }}\n >\n <Flex align=\"center\" gap=\"1\">\n <Text size=\"2\" color=\"blue\">\n {displayCta}\n </Text>\n <ExternalLink size={14} />\n </Flex>\n </Link>\n <Button variant=\"ghost\" size=\"1\" color=\"gray\" onClick={onClose}>\n <X size={14} />\n </Button>\n </Flex>\n </Flex>\n </Card>\n );\n}\n\n/**\n * Variant 2: Tagline - Icon + Name + Tagline + CTA Button\n */\nexport function TaglineVariant({ campaign, onCTAClick, onClose }: SmallPanelProps) {\n const { displayTitle, displayTagline, displayCta, displayUrl, displayIcon, displayColor } = getDisplayValues(campaign);\n\n return (\n <Card size=\"1\">\n <Flex align=\"center\" justify=\"between\" gap=\"3\" p=\"3\">\n <Flex align=\"center\" gap=\"3\">\n <Box\n style={{\n width: 40,\n height: 40,\n borderRadius: 'var(--radius-2)',\n background: `color-mix(in srgb, ${displayColor} 15%, transparent)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n />\n <Box>\n <Text size=\"2\" weight=\"bold\">\n {displayTitle}\n </Text>\n <Text size=\"1\" color=\"gray\">\n {displayTagline}\n </Text>\n </Box>\n </Flex>\n <Flex align=\"center\" gap=\"2\">\n <Button\n size=\"1\"\n style={{ background: displayColor }}\n onClick={() => {\n onCTAClick?.();\n window.open(displayUrl, '_blank');\n }}\n >\n {displayCta}\n </Button>\n <Button variant=\"ghost\" size=\"1\" color=\"gray\" onClick={onClose}>\n <X size={14} />\n </Button>\n </Flex>\n </Flex>\n </Card>\n );\n}\n\n/**\n * Variant 3: Features - Icon + Name + Feature pills + CTA\n */\nexport function FeaturesVariant({ campaign, onCTAClick, onClose }: SmallPanelProps) {\n const { displayTitle, displayCta, displayUrl, displayIcon, displayColor, displayFeatures } = getDisplayValues(campaign);\n const features = displayFeatures.slice(0, 2);\n\n return (\n <Card size=\"1\">\n <Flex align=\"center\" justify=\"between\" gap=\"3\" p=\"3\">\n <Flex align=\"center\" gap=\"3\">\n <Box\n style={{\n width: 40,\n height: 40,\n borderRadius: 'var(--radius-2)',\n background: `color-mix(in srgb, ${displayColor} 15%, transparent)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n />\n <Box>\n <Text size=\"2\" weight=\"bold\" mb=\"1\">\n {displayTitle}\n </Text>\n <Flex gap=\"1\" wrap=\"wrap\">\n {features.map((feature, i) => (\n <Badge key={i} size=\"1\" variant=\"soft\" color=\"gray\">\n <Check size={10} style={{ marginRight: 2 }} />\n {feature}\n </Badge>\n ))}\n </Flex>\n </Box>\n </Flex>\n <Flex align=\"center\" gap=\"2\">\n <Button\n size=\"1\"\n style={{ background: displayColor }}\n onClick={() => {\n onCTAClick?.();\n window.open(displayUrl, '_blank');\n }}\n >\n {displayCta}\n </Button>\n <Button variant=\"ghost\" size=\"1\" color=\"gray\" onClick={onClose}>\n <X size={14} />\n </Button>\n </Flex>\n </Flex>\n </Card>\n );\n}\n\n/**\n * Variant 4: Gradient - Full gradient background\n */\nexport function GradientVariant({ campaign, onCTAClick, onClose }: SmallPanelProps) {\n const { displayTitle, displayTagline, displayCta, displayUrl, displayIcon, displayColor } = getDisplayValues(campaign);\n\n return (\n <Box\n style={{\n background: `linear-gradient(135deg, ${displayColor} 0%, color-mix(in srgb, ${displayColor} 80%, black) 100%)`,\n borderRadius: 'var(--radius-3)',\n padding: 'var(--space-3)',\n color: 'white',\n }}\n >\n <Flex align=\"center\" justify=\"between\" gap=\"3\">\n <Flex align=\"center\" gap=\"3\">\n <Box\n style={{\n width: 40,\n height: 40,\n borderRadius: 'var(--radius-2)',\n background: 'rgba(255, 255, 255, 0.2)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n <Box\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n style={{\n color: 'white',\n }}\n />\n </Box>\n <Box>\n <Text size=\"2\" weight=\"bold\" style={{ color: 'white' }}>\n {displayTitle}\n </Text>\n <Text size=\"1\" style={{ color: 'rgba(255, 255, 255, 0.8)' }}>\n {displayTagline}\n </Text>\n </Box>\n </Flex>\n <Flex align=\"center\" gap=\"2\">\n <Button\n size=\"1\"\n variant=\"soft\"\n style={{\n background: 'white',\n color: displayColor,\n }}\n onClick={() => {\n onCTAClick?.();\n window.open(displayUrl, '_blank');\n }}\n >\n {displayCta}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"1\"\n onClick={onClose}\n style={{ color: 'rgba(255, 255, 255, 0.8)' }}\n >\n <X size={14} />\n </Button>\n </Flex>\n </Flex>\n </Box>\n );\n}\n\n/**\n * Variant 5: Card - Elevated card with shadow and animation\n */\nexport function CardVariant({ campaign, onCTAClick, onClose }: SmallPanelProps) {\n const { displayTitle, displayTagline, displayCta, displayUrl, displayIcon, displayColor } = getDisplayValues(campaign);\n\n return (\n <Card\n size=\"2\"\n style={{\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.1)',\n transition: 'all 0.2s ease',\n border: `1px solid ${displayColor}20`,\n }}\n >\n <Flex direction=\"column\" gap=\"3\" p=\"1\">\n <Flex align=\"center\" justify=\"between\">\n <Flex align=\"center\" gap=\"1\">\n <Sparkles size={14} color={displayColor} />\n <Text size=\"1\" color=\"gray\" weight=\"medium\">\n RECOMMENDED\n </Text>\n </Flex>\n <Button variant=\"ghost\" size=\"1\" color=\"gray\" onClick={onClose}>\n <X size={14} />\n </Button>\n </Flex>\n\n <Flex align=\"center\" gap=\"3\">\n <Box\n style={{\n width: 48,\n height: 48,\n borderRadius: 'var(--radius-3)',\n background: `color-mix(in srgb, ${displayColor} 15%, transparent)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n />\n <Box style={{ flex: 1 }}>\n <Text size=\"2\" weight=\"bold\">\n {displayTitle}\n </Text>\n <Text size=\"1\" color=\"gray\">\n {displayTagline}\n </Text>\n </Box>\n </Flex>\n\n <Button\n size=\"2\"\n style={{ background: displayColor, width: '100%' }}\n onClick={() => {\n onCTAClick?.();\n window.open(displayUrl, '_blank');\n }}\n >\n {displayCta}\n <ExternalLink size={14} />\n </Button>\n </Flex>\n </Card>\n );\n}\n\n/**\n * Get variant component by name\n */\nexport const SMALL_PANEL_VARIANTS = {\n small_panel_1: MinimalVariant,\n small_panel_2: TaglineVariant,\n small_panel_3: FeaturesVariant,\n small_panel_4: GradientVariant,\n small_panel_5: CardVariant,\n};\n\nexport type SmallPanelVariantName = keyof typeof SMALL_PANEL_VARIANTS;\n\nexport function getSmallPanelVariant(variantName: string) {\n return SMALL_PANEL_VARIANTS[variantName as SmallPanelVariantName] || TaglineVariant;\n}\n","/**\n * AdSlider Component\n *\n * Small promotional slider panel for consumer apps.\n * Displays eligible ad campaigns using 5 small panel variants.\n *\n * Placement: Footer, sidebar, between sections\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport { Box } from '@radix-ui/themes';\nimport { useCampaign } from '../../hooks/useCampaigns';\nimport { getSmallPanelVariant } from './variants/SmallPanelVariants';\nimport type { AdPlacement } from '../../types/campaigns';\n\nexport interface AdSliderProps {\n /** Ad placement (defaults to footer_slider) */\n placement?: AdPlacement;\n /** Custom CSS class */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n/**\n * AdSlider - Small promotional panel\n *\n * @example\n * ```tsx\n * <AdSlider placement=\"footer_slider\" />\n * <AdSlider placement=\"sidebar_panel\" className=\"my-ad\" />\n * ```\n */\nexport function AdSlider({\n placement = 'footer_slider',\n className,\n style,\n}: AdSliderProps) {\n const hasTrackedImpression = useRef(false);\n\n const {\n campaign,\n loading,\n recordImpression,\n recordClick,\n recordClose,\n } = useCampaign({ placement });\n\n // Track impression on mount when campaign is available\n useEffect(() => {\n if (campaign && !hasTrackedImpression.current) {\n hasTrackedImpression.current = true;\n recordImpression(campaign);\n }\n }, [campaign, recordImpression]);\n\n // Handle CTA click\n const handleCTAClick = useCallback(() => {\n if (!campaign) return;\n recordClick(campaign);\n }, [campaign, recordClick]);\n\n // Handle close\n const handleClose = useCallback(() => {\n if (!campaign) return;\n recordClose(campaign);\n }, [campaign, recordClose]);\n\n // Don't render if loading or no campaign\n if (loading || !campaign) {\n return null;\n }\n\n // Get variant component\n const variantName = campaign.variant || 'small_panel_2';\n const VariantComponent = getSmallPanelVariant(variantName);\n\n return (\n <Box className={className} style={style}>\n <VariantComponent\n campaign={campaign}\n onCTAClick={handleCTAClick}\n onClose={handleClose}\n />\n </Box>\n );\n}\n\nexport default AdSlider;\n","/**\n * AdModal Component\n *\n * One-time promotional modal for consumer apps.\n * Displays on first visit to promote products.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useEffect, useCallback, useState, useRef } from 'react';\nimport { Box, Flex, Text, Heading, Button, Dialog, Checkbox } from '@radix-ui/themes';\nimport { ExternalLink, X, Gift } from 'lucide-react';\nimport { useCampaign, useOneTimeAdModal } from '../../hooks/useCampaigns';\nimport type { AdPlacement } from '../../types/campaigns';\nimport { getConfig, isInitialized } from '../../firebase/config';\n\nexport interface AdModalProps {\n /** Ad placement (defaults to onetime_modal) */\n placement?: AdPlacement;\n /** Callback when modal closes */\n onClose?: () => void;\n /** Custom welcome title (when no campaign) */\n welcomeTitle?: string;\n /** Custom welcome description (when no campaign) */\n welcomeDescription?: string;\n}\n\n/**\n * AdModal - One-time promotional modal\n *\n * @example\n * ```tsx\n * <AdModal />\n * <AdModal\n * placement=\"onetime_modal\"\n * welcomeTitle=\"Welcome to My App!\"\n * welcomeDescription=\"Discover amazing features...\"\n * />\n * ```\n */\nexport function AdModal({\n placement = 'onetime_modal',\n onClose,\n welcomeTitle,\n welcomeDescription,\n}: AdModalProps) {\n const [dontShowAgain, setDontShowAgain] = useState(false);\n const hasTrackedImpression = useRef(false);\n\n const { shouldShow, markAsShown } = useOneTimeAdModal();\n\n const {\n campaign,\n loading,\n recordImpression,\n recordClick,\n recordClose,\n } = useCampaign({ placement });\n\n // Track impression when modal shows\n useEffect(() => {\n if (shouldShow && campaign && !hasTrackedImpression.current) {\n hasTrackedImpression.current = true;\n recordImpression(campaign);\n }\n }, [shouldShow, campaign, recordImpression]);\n\n // Handle CTA click\n const handleCTAClick = useCallback(() => {\n if (!campaign) return;\n recordClick(campaign);\n const targetUrl = campaign.customCtaUrl || campaign.product.url;\n window.open(targetUrl, '_blank');\n }, [campaign, recordClick]);\n\n // Handle close\n const handleClose = useCallback(() => {\n if (campaign) {\n recordClose(campaign);\n }\n markAsShown();\n onClose?.();\n }, [campaign, recordClose, markAsShown, onClose]);\n\n // Don't render if shared-features not initialized\n if (!isInitialized()) {\n return null;\n }\n\n // Don't show if not eligible or loading\n if (!shouldShow || loading) {\n return null;\n }\n\n // Show welcome modal without campaign\n if (!campaign) {\n const config = getConfig();\n const defaultTitle = welcomeTitle || `Welcome to ${config.projectName}!`;\n const defaultDesc = welcomeDescription || 'Discover amazing features and tools at your fingertips.';\n\n return (\n <Dialog.Root open={true} onOpenChange={(open) => !open && handleClose()}>\n <Dialog.Content style={{ maxWidth: 450 }}>\n <Dialog.Title>\n <Flex align=\"center\" gap=\"2\">\n <Gift size={24} />\n {defaultTitle}\n </Flex>\n </Dialog.Title>\n <Dialog.Description size=\"2\" mb=\"4\">\n {defaultDesc}\n </Dialog.Description>\n\n <Flex gap=\"3\" mt=\"4\" justify=\"end\">\n <Dialog.Close>\n <Button variant=\"soft\" color=\"gray\">\n Start Exploring\n </Button>\n </Dialog.Close>\n </Flex>\n </Dialog.Content>\n </Dialog.Root>\n );\n }\n\n const { product } = campaign;\n const displayTitle = campaign.customTitle || product.name;\n const displayTagline = campaign.customTagline || product.tagline;\n const displayDescription = campaign.customDescription || product.description;\n const displayCta = campaign.customCta || 'Learn More';\n const displayIcon = campaign.customIcon || product.icon128 || product.icon64 || '';\n const displayColor = campaign.customProductColor || product.color || '#3B82F6';\n const displayFeatures = campaign.customFeatures || product.features || [];\n\n return (\n <Dialog.Root open={true} onOpenChange={(open) => !open && handleClose()}>\n <Dialog.Content style={{ maxWidth: 500 }}>\n <Flex justify=\"end\" mb=\"2\">\n <Dialog.Close>\n <Button variant=\"ghost\" size=\"1\" color=\"gray\">\n <X size={16} />\n </Button>\n </Dialog.Close>\n </Flex>\n\n <Flex direction=\"column\" align=\"center\" gap=\"4\" p=\"4\" style={{ textAlign: 'center' }}>\n <Box\n style={{\n width: 96,\n height: 96,\n borderRadius: 'var(--radius-4)',\n background: `color-mix(in srgb, ${displayColor} 15%, transparent)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n />\n\n <Box>\n <Heading size=\"5\" weight=\"bold\" mb=\"2\">\n {displayTitle}\n </Heading>\n <Text size=\"3\" color=\"gray\">\n {displayTagline}\n </Text>\n </Box>\n\n <Text size=\"2\" color=\"gray\" style={{ maxWidth: 350, lineHeight: 1.6 }}>\n {displayDescription}\n </Text>\n\n <Flex wrap=\"wrap\" gap=\"2\" justify=\"center\">\n {displayFeatures.slice(0, 4).map((feature, i) => (\n <Box\n key={i}\n style={{\n padding: 'var(--space-1) var(--space-2)',\n borderRadius: 'var(--radius-2)',\n background: 'var(--gray-a3)',\n fontSize: 'var(--font-size-1)',\n }}\n >\n {feature}\n </Box>\n ))}\n </Flex>\n\n <Button\n size=\"3\"\n style={{ background: displayColor, marginTop: 'var(--space-2)' }}\n onClick={handleCTAClick}\n >\n {displayCta}\n <ExternalLink size={16} />\n </Button>\n\n <Flex align=\"center\" gap=\"2\" mt=\"2\">\n <Checkbox\n checked={dontShowAgain}\n onCheckedChange={(checked) => setDontShowAgain(checked === true)}\n />\n <Text size=\"1\" color=\"gray\">\n Don&apos;t show this again\n </Text>\n </Flex>\n </Flex>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\nexport default AdModal;\n","/**\n * Large Panel Variants for Advertising\n *\n * 5 variants for large promotional panels (modals, sliders):\n * 1. Hero - Large icon + description + CTA\n * 2. Feature Grid - 2x2 grid of features\n * 3. Testimonial - Quote + product info\n * 4. Comparison - Before/After comparison\n * 5. Video - Animated preview + play button\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { Box, Flex, Text, Heading, Button, Card, Grid } from '@radix-ui/themes';\nimport { ExternalLink, Check, X, Play, Quote } from 'lucide-react';\nimport type { CampaignWithProduct, LargePanelProps } from '../../../types/campaigns';\n\n/**\n * Helper to get display values from campaign\n */\nfunction getDisplayValues(campaign: CampaignWithProduct) {\n const isCustomProduct = !campaign.product.icon64 && campaign.customIcon;\n\n return {\n displayTitle: campaign.customTitle || campaign.product.name,\n displayTagline: campaign.customTagline || campaign.product.tagline,\n displayDescription: campaign.customDescription || campaign.product.description,\n displayCta: campaign.customCta || 'Learn More',\n displayUrl: campaign.customCtaUrl || campaign.product.url,\n displayIcon64: campaign.customIcon || campaign.product.icon64 || '',\n displayIcon128: campaign.customIcon || campaign.product.icon128 || campaign.product.icon64 || '',\n displayColor: campaign.customProductColor || campaign.product.color || '#3B82F6',\n displayFeatures: campaign.customFeatures || campaign.product.features || [],\n isCustomProduct,\n };\n}\n\n// Default testimonial quotes (can be overridden by campaign data)\nconst DEFAULT_TESTIMONIALS: Record<string, string> = {\n 'video-controls-plus':\n '\"Finally, I have complete control over video playback. The keyboard shortcuts save me so much time!\"',\n 'ztools-web':\n '\"300+ tools in one place. I use it daily for encoding, formatting, and data conversion tasks.\"',\n 'ztools-extension': '\"Quick access to all my favorite tools right from the browser. Super convenient!\"',\n 'pregnancy-pal-android':\n '\"The weekly updates and kick counter are amazing. Best pregnancy tracking app!\"',\n 'pregnancy-pal-web':\n '\"Love being able to access my pregnancy data from any device. The sync is seamless.\"',\n 'lab-system-web': '\"Streamlined our entire lab workflow. Sample tracking has never been easier.\"',\n};\n\n// Default comparison data (can be overridden by campaign data)\nconst DEFAULT_COMPARISONS: Record<string, { before: string[]; after: string[] }> = {\n 'video-controls-plus': {\n before: ['Limited playback control', 'No keyboard shortcuts', 'Manual ad skipping', 'No speed control'],\n after: ['Full playback control', 'Custom shortcuts', 'Auto ad skip', '0.1x - 16x speed'],\n },\n 'ztools-web': {\n before: ['Multiple websites', 'Scattered tools', 'No offline access', 'Ads everywhere'],\n after: ['One destination', '300+ tools', 'Works offline', 'Ad-free experience'],\n },\n 'ztools-extension': {\n before: ['Open new tabs', 'Search for tools', 'Copy/paste repeatedly', 'Time wasted'],\n after: ['Instant access', 'Quick search', 'One-click actions', 'Time saved'],\n },\n 'pregnancy-pal-android': {\n before: ['Paper tracking', 'Forget updates', 'Manual counting', 'Scattered info'],\n after: ['Digital diary', 'Weekly reminders', 'Auto tracking', 'All in one app'],\n },\n 'pregnancy-pal-web': {\n before: ['Phone only', 'No backup', 'Limited access', 'Data silos'],\n after: ['Any device', 'Cloud sync', 'Always available', 'Unified data'],\n },\n 'lab-system-web': {\n before: ['Paper records', 'Manual tracking', 'Error prone', 'Slow reports'],\n after: ['Digital records', 'Auto tracking', 'Accurate data', 'Instant reports'],\n },\n};\n\n/**\n * Variant 1: Hero - Large icon + description + CTA\n */\nexport function HeroVariant({\n campaign,\n onCTAClick,\n showIndicator,\n currentIndex,\n totalCount,\n}: LargePanelProps) {\n const { displayTitle, displayTagline, displayDescription, displayCta, displayUrl, displayIcon128, displayColor } = getDisplayValues(campaign);\n\n return (\n <Flex direction=\"column\" align=\"center\" gap=\"4\" p=\"5\" style={{ textAlign: 'center' }}>\n {showIndicator && currentIndex !== undefined && totalCount !== undefined && (\n <Text size=\"1\" color=\"gray\" style={{ position: 'absolute', top: 16, right: 16 }}>\n {currentIndex + 1} / {totalCount}\n </Text>\n )}\n\n <Box\n style={{\n width: 80,\n height: 80,\n borderRadius: 'var(--radius-4)',\n background: `color-mix(in srgb, ${displayColor} 15%, transparent)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon128 }}\n />\n\n <Heading size=\"5\" weight=\"bold\">\n {displayTitle}\n </Heading>\n\n <Text size=\"3\" color=\"gray\">\n {displayTagline}\n </Text>\n\n <Text size=\"2\" color=\"gray\" style={{ maxWidth: 300, lineHeight: 1.6 }}>\n {displayDescription}\n </Text>\n\n <Button\n size=\"3\"\n style={{ background: displayColor, marginTop: 'var(--space-2)' }}\n onClick={() => {\n onCTAClick?.();\n window.open(displayUrl, '_blank');\n }}\n >\n {displayCta}\n <ExternalLink size={16} />\n </Button>\n </Flex>\n );\n}\n\n/**\n * Variant 2: Feature Grid - 2x2 grid of features\n */\nexport function FeatureGridVariant({\n campaign,\n onCTAClick,\n showIndicator,\n currentIndex,\n totalCount,\n}: LargePanelProps) {\n const { displayTitle, displayCta, displayUrl, displayIcon64, displayColor, displayFeatures } = getDisplayValues(campaign);\n const features = displayFeatures.slice(0, 4);\n\n return (\n <Flex direction=\"column\" gap=\"4\" p=\"5\">\n {showIndicator && currentIndex !== undefined && totalCount !== undefined && (\n <Text size=\"1\" color=\"gray\" style={{ position: 'absolute', top: 16, right: 16 }}>\n {currentIndex + 1} / {totalCount}\n </Text>\n )}\n\n <Flex align=\"center\" gap=\"3\">\n <Box\n style={{\n width: 48,\n height: 48,\n borderRadius: 'var(--radius-3)',\n background: `color-mix(in srgb, ${displayColor} 15%, transparent)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon64 }}\n />\n <Heading size=\"4\" weight=\"bold\">\n {displayTitle}\n </Heading>\n </Flex>\n\n <Grid columns=\"2\" gap=\"3\">\n {features.map((feature, i) => (\n <Card key={i} size=\"1\" style={{ background: 'var(--gray-a2)' }}>\n <Flex align=\"center\" gap=\"2\" p=\"2\">\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n width: 24,\n height: 24,\n borderRadius: '50%',\n background: displayColor,\n color: 'white',\n fontSize: 12,\n fontWeight: 'bold',\n flexShrink: 0,\n }}\n >\n {i + 1}\n </Flex>\n <Text size=\"2\">{feature}</Text>\n </Flex>\n </Card>\n ))}\n </Grid>\n\n <Button\n size=\"3\"\n style={{ background: displayColor, width: '100%' }}\n onClick={() => {\n onCTAClick?.();\n window.open(displayUrl, '_blank');\n }}\n >\n {displayCta}\n <ExternalLink size={16} />\n </Button>\n </Flex>\n );\n}\n\n/**\n * Variant 3: Testimonial - Quote + product info\n */\nexport function TestimonialVariant({\n campaign,\n onCTAClick,\n showIndicator,\n currentIndex,\n totalCount,\n}: LargePanelProps) {\n const { product } = campaign;\n const { displayTitle, displayTagline, displayCta, displayUrl, displayIcon64, displayColor } = getDisplayValues(campaign);\n const quote = DEFAULT_TESTIMONIALS[product.id] || '\"An amazing tool that makes my work easier every day.\"';\n\n return (\n <Flex direction=\"column\" gap=\"4\" p=\"5\" style={{ background: 'var(--gray-a2)', borderRadius: 'var(--radius-3)' }}>\n {showIndicator && currentIndex !== undefined && totalCount !== undefined && (\n <Text size=\"1\" color=\"gray\" style={{ position: 'absolute', top: 16, right: 16 }}>\n {currentIndex + 1} / {totalCount}\n </Text>\n )}\n\n <Box style={{ position: 'relative', padding: 'var(--space-3)' }}>\n <Quote\n size={32}\n style={{\n position: 'absolute',\n top: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n opacity: 0.15,\n color: displayColor,\n }}\n />\n <Text size=\"3\" style={{ fontStyle: 'italic', textAlign: 'center', lineHeight: 1.6 }}>\n {quote}\n </Text>\n <Text size=\"2\" color=\"gray\" style={{ textAlign: 'center', marginTop: 'var(--space-2)' }}>\n — Happy User\n </Text>\n </Box>\n\n <Card size=\"1\">\n <Flex align=\"center\" gap=\"3\" p=\"3\">\n <Box\n style={{\n width: 48,\n height: 48,\n borderRadius: 'var(--radius-3)',\n background: `color-mix(in srgb, ${displayColor} 15%, transparent)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon64 }}\n />\n <Box>\n <Text size=\"2\" weight=\"bold\">\n {displayTitle}\n </Text>\n <Text size=\"1\" color=\"gray\">\n {displayTagline}\n </Text>\n </Box>\n </Flex>\n </Card>\n\n <Button\n size=\"3\"\n style={{ background: displayColor, width: '100%' }}\n onClick={() => {\n onCTAClick?.();\n window.open(displayUrl, '_blank');\n }}\n >\n {displayCta}\n <ExternalLink size={16} />\n </Button>\n </Flex>\n );\n}\n\n/**\n * Variant 4: Comparison - Before/After comparison\n */\nexport function ComparisonVariant({\n campaign,\n onCTAClick,\n showIndicator,\n currentIndex,\n totalCount,\n}: LargePanelProps) {\n const { product } = campaign;\n const { displayTitle, displayCta, displayUrl, displayIcon64, displayColor } = getDisplayValues(campaign);\n const comparison = DEFAULT_COMPARISONS[product.id] || {\n before: ['Old way', 'Manual process', 'Time consuming', 'Limited features'],\n after: ['Better way', 'Automated', 'Fast & easy', 'Full features'],\n };\n\n return (\n <Flex direction=\"column\" gap=\"4\" p=\"5\">\n {showIndicator && currentIndex !== undefined && totalCount !== undefined && (\n <Text size=\"1\" color=\"gray\" style={{ position: 'absolute', top: 16, right: 16 }}>\n {currentIndex + 1} / {totalCount}\n </Text>\n )}\n\n <Flex align=\"center\" gap=\"3\">\n <Box\n style={{\n width: 48,\n height: 48,\n borderRadius: 'var(--radius-3)',\n background: `color-mix(in srgb, ${displayColor} 15%, transparent)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon64 }}\n />\n <Heading size=\"4\" weight=\"bold\">\n {displayTitle}\n </Heading>\n </Flex>\n\n <Flex gap=\"3\">\n <Box\n style={{\n flex: 1,\n padding: 'var(--space-3)',\n borderRadius: 'var(--radius-2)',\n background: 'rgba(239, 68, 68, 0.1)',\n }}\n >\n <Text size=\"1\" weight=\"bold\" color=\"red\" mb=\"2\" style={{ textTransform: 'uppercase' }}>\n Before\n </Text>\n {comparison.before.map((item, i) => (\n <Flex key={i} align=\"center\" gap=\"2\" mb=\"1\">\n <X size={12} color=\"var(--red-9)\" />\n <Text size=\"1\">{item}</Text>\n </Flex>\n ))}\n </Box>\n\n <Box\n style={{\n flex: 1,\n padding: 'var(--space-3)',\n borderRadius: 'var(--radius-2)',\n background: 'rgba(16, 185, 129, 0.1)',\n }}\n >\n <Text size=\"1\" weight=\"bold\" color=\"green\" mb=\"2\" style={{ textTransform: 'uppercase' }}>\n After\n </Text>\n {comparison.after.map((item, i) => (\n <Flex key={i} align=\"center\" gap=\"2\" mb=\"1\">\n <Check size={12} color=\"var(--green-9)\" />\n <Text size=\"1\">{item}</Text>\n </Flex>\n ))}\n </Box>\n </Flex>\n\n <Button\n size=\"3\"\n style={{ background: displayColor, width: '100%' }}\n onClick={() => {\n onCTAClick?.();\n window.open(displayUrl, '_blank');\n }}\n >\n {displayCta}\n <ExternalLink size={16} />\n </Button>\n </Flex>\n );\n}\n\n/**\n * Variant 5: Video - Animated preview + play button\n */\nexport function VideoVariant({\n campaign,\n onCTAClick,\n showIndicator,\n currentIndex,\n totalCount,\n}: LargePanelProps) {\n const { displayTitle, displayTagline, displayCta, displayUrl, displayIcon128, displayColor } = getDisplayValues(campaign);\n\n return (\n <Flex direction=\"column\" align=\"center\" gap=\"4\" p=\"5\" style={{ textAlign: 'center' }}>\n {showIndicator && currentIndex !== undefined && totalCount !== undefined && (\n <Text size=\"1\" color=\"gray\" style={{ position: 'absolute', top: 16, right: 16 }}>\n {currentIndex + 1} / {totalCount}\n </Text>\n )}\n\n <Box\n style={{\n position: 'relative',\n width: 140,\n height: 140,\n borderRadius: 'var(--radius-4)',\n background: `linear-gradient(135deg, color-mix(in srgb, ${displayColor} 20%, transparent), color-mix(in srgb, ${displayColor} 40%, transparent))`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}\n >\n <Box\n style={{\n animation: 'shared-features-pulse 2s ease-in-out infinite',\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon128 }}\n />\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{\n position: 'absolute',\n width: 56,\n height: 56,\n borderRadius: '50%',\n background: 'rgba(255, 255, 255, 0.95)',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.2)',\n cursor: 'pointer',\n transition: 'transform 0.2s ease',\n }}\n onClick={() => {\n onCTAClick?.();\n window.open(displayUrl, '_blank');\n }}\n >\n <Play size={24} fill={displayColor} color={displayColor} />\n </Flex>\n </Box>\n\n <Heading size=\"5\" weight=\"bold\">\n {displayTitle}\n </Heading>\n\n <Text size=\"2\" color=\"gray\">\n {displayTagline}\n </Text>\n\n <Button\n size=\"3\"\n style={{ background: displayColor, marginTop: 'var(--space-2)' }}\n onClick={() => {\n onCTAClick?.();\n window.open(displayUrl, '_blank');\n }}\n >\n {displayCta}\n <ExternalLink size={16} />\n </Button>\n\n <style>{`\n @keyframes shared-features-pulse {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.1); }\n }\n `}</style>\n </Flex>\n );\n}\n\n/**\n * Get variant component by name\n */\nexport const LARGE_PANEL_VARIANTS = {\n large_slider_1: HeroVariant,\n large_slider_2: FeatureGridVariant,\n large_slider_3: TestimonialVariant,\n large_slider_4: ComparisonVariant,\n large_slider_5: VideoVariant,\n};\n\nexport type LargePanelVariantName = keyof typeof LARGE_PANEL_VARIANTS;\n\nexport function getLargePanelVariant(variantName: string) {\n return LARGE_PANEL_VARIANTS[variantName as LargePanelVariantName] || HeroVariant;\n}\n","/**\n * AdUpdateModal Component\n *\n * Big slider modal shown when the app updates.\n * Displays a carousel of promotional campaigns with 5 large variants.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useEffect, useCallback, useState, useRef } from 'react';\nimport { Box, Flex, Text, Button, Dialog, IconButton } from '@radix-ui/themes';\nimport { ChevronLeft, ChevronRight, X } from 'lucide-react';\nimport { useCampaigns, useUpdateAdModal } from '../../hooks/useCampaigns';\nimport { getLargePanelVariant } from './variants/LargePanelVariants';\nimport type { AdPlacement } from '../../types/campaigns';\n\nexport interface AdUpdateModalProps {\n /** Ad placement (defaults to update_modal) */\n placement?: AdPlacement;\n /** Maximum number of campaigns to show */\n maxCampaigns?: number;\n /** Auto-advance interval in ms (0 to disable) */\n autoAdvanceInterval?: number;\n /** Callback when modal closes */\n onClose?: () => void;\n}\n\n/**\n * AdUpdateModal - Big slider promotional modal\n *\n * @example\n * ```tsx\n * <AdUpdateModal />\n * <AdUpdateModal\n * placement=\"update_modal\"\n * maxCampaigns={5}\n * autoAdvanceInterval={5000}\n * />\n * ```\n */\nexport function AdUpdateModal({\n placement = 'update_modal',\n maxCampaigns = 5,\n autoAdvanceInterval = 5000,\n onClose,\n}: AdUpdateModalProps) {\n const [currentIndex, setCurrentIndex] = useState(0);\n const autoAdvanceRef = useRef<NodeJS.Timeout | null>(null);\n const trackedImpressions = useRef<Set<string>>(new Set());\n\n const { shouldShow, currentVersion, markAsShown } = useUpdateAdModal();\n\n const {\n campaigns,\n loading,\n recordImpression,\n recordClick,\n recordClose,\n } = useCampaigns({ placement, maxCampaigns });\n\n // Track impression for current campaign\n useEffect(() => {\n if (shouldShow && campaigns.length > 0 && currentIndex < campaigns.length) {\n const campaign = campaigns[currentIndex];\n if (campaign && !trackedImpressions.current.has(campaign.id)) {\n trackedImpressions.current.add(campaign.id);\n recordImpression(campaign);\n }\n }\n }, [shouldShow, campaigns, currentIndex, recordImpression]);\n\n // Auto-advance carousel\n useEffect(() => {\n if (!shouldShow || campaigns.length <= 1 || autoAdvanceInterval <= 0) return;\n\n autoAdvanceRef.current = setInterval(() => {\n setCurrentIndex((prev) => (prev + 1) % campaigns.length);\n }, autoAdvanceInterval);\n\n return () => {\n if (autoAdvanceRef.current) {\n clearInterval(autoAdvanceRef.current);\n }\n };\n }, [shouldShow, campaigns.length, autoAdvanceInterval]);\n\n // Reset auto-advance on manual navigation\n const resetAutoAdvance = useCallback(() => {\n if (autoAdvanceRef.current) {\n clearInterval(autoAdvanceRef.current);\n }\n if (autoAdvanceInterval > 0 && campaigns.length > 1) {\n autoAdvanceRef.current = setInterval(() => {\n setCurrentIndex((prev) => (prev + 1) % campaigns.length);\n }, autoAdvanceInterval);\n }\n }, [autoAdvanceInterval, campaigns.length]);\n\n // Navigate to previous slide\n const goToPrevious = useCallback(() => {\n setCurrentIndex((prev) => (prev - 1 + campaigns.length) % campaigns.length);\n resetAutoAdvance();\n }, [campaigns.length, resetAutoAdvance]);\n\n // Navigate to next slide\n const goToNext = useCallback(() => {\n setCurrentIndex((prev) => (prev + 1) % campaigns.length);\n resetAutoAdvance();\n }, [campaigns.length, resetAutoAdvance]);\n\n // Navigate to specific slide\n const goToSlide = useCallback(\n (index: number) => {\n setCurrentIndex(index);\n resetAutoAdvance();\n },\n [resetAutoAdvance]\n );\n\n // Handle keyboard navigation\n useEffect(() => {\n if (!shouldShow) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowLeft') {\n goToPrevious();\n } else if (e.key === 'ArrowRight') {\n goToNext();\n } else if (e.key === 'Escape') {\n handleClose();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n \n }, [shouldShow, goToPrevious, goToNext]);\n\n // Handle CTA click\n const handleCTAClick = useCallback(() => {\n const campaign = campaigns[currentIndex];\n if (!campaign) return;\n recordClick(campaign);\n }, [campaigns, currentIndex, recordClick]);\n\n // Handle close\n const handleClose = useCallback(() => {\n campaigns.forEach((campaign) => {\n recordClose(campaign);\n });\n markAsShown();\n onClose?.();\n }, [campaigns, recordClose, markAsShown, onClose]);\n\n // Don't show if not eligible or loading\n if (!shouldShow || loading || campaigns.length === 0) {\n return null;\n }\n\n const currentCampaign = campaigns[currentIndex];\n if (!currentCampaign) return null;\n\n const variantName = currentCampaign.variant || 'large_slider_1';\n const VariantComponent = getLargePanelVariant(variantName);\n\n return (\n <Dialog.Root open={true} onOpenChange={(open) => !open && handleClose()}>\n <Dialog.Content\n style={{\n maxWidth: 550,\n padding: 0,\n overflow: 'hidden',\n }}\n >\n {/* Header */}\n <Flex\n align=\"center\"\n justify=\"between\"\n p=\"3\"\n style={{\n borderBottom: '1px solid var(--gray-a5)',\n }}\n >\n <Text size=\"2\" color=\"gray\">\n What&apos;s New in v{currentVersion}\n </Text>\n <Dialog.Close>\n <IconButton variant=\"ghost\" size=\"1\" color=\"gray\">\n <X size={16} />\n </IconButton>\n </Dialog.Close>\n </Flex>\n\n {/* Slider Content */}\n <Box style={{ position: 'relative', minHeight: 350 }}>\n <VariantComponent\n campaign={currentCampaign}\n onCTAClick={handleCTAClick}\n showIndicator={campaigns.length > 1}\n currentIndex={currentIndex}\n totalCount={campaigns.length}\n />\n\n {/* Navigation Arrows */}\n {campaigns.length > 1 && (\n <>\n <IconButton\n variant=\"soft\"\n size=\"2\"\n style={{\n position: 'absolute',\n left: 8,\n top: '50%',\n transform: 'translateY(-50%)',\n opacity: 0.8,\n }}\n onClick={goToPrevious}\n >\n <ChevronLeft size={20} />\n </IconButton>\n <IconButton\n variant=\"soft\"\n size=\"2\"\n style={{\n position: 'absolute',\n right: 8,\n top: '50%',\n transform: 'translateY(-50%)',\n opacity: 0.8,\n }}\n onClick={goToNext}\n >\n <ChevronRight size={20} />\n </IconButton>\n </>\n )}\n </Box>\n\n {/* Footer with Dots */}\n {campaigns.length > 1 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n gap=\"2\"\n p=\"3\"\n style={{\n borderTop: '1px solid var(--gray-a5)',\n }}\n >\n {campaigns.map((_, index) => (\n <Box\n key={index}\n onClick={() => goToSlide(index)}\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background:\n index === currentIndex ? 'var(--accent-9)' : 'var(--gray-a6)',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n }}\n />\n ))}\n </Flex>\n )}\n\n {/* Skip All Button */}\n <Flex justify=\"center\" pb=\"3\">\n <Button variant=\"ghost\" size=\"1\" color=\"gray\" onClick={handleClose}>\n Skip All\n </Button>\n </Flex>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\nexport default AdUpdateModal;\n","/**\n * AdBanner Component\n *\n * A sleek, modern advertising banner that showcases products.\n * Clean design with smooth animations and auto-rotation.\n * Supports dismissible mode for topbar banners.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useEffect, useState, useCallback, useRef } from 'react';\nimport { Box, Flex, Text, Button, Badge, IconButton } from '@radix-ui/themes';\nimport { ExternalLink, Sparkles, Check, X } from 'lucide-react';\nimport { useCampaigns } from '../../hooks/useCampaigns';\nimport type { AdPlacement, CampaignWithProduct } from '../../types/campaigns';\n\n// Storage key for dismissed banners (per session or persistent)\nconst DISMISSED_BANNERS_KEY = 'sf_dismissed_banners';\n\nexport interface AdBannerProps {\n /** Ad placement (defaults to home_banner) */\n placement?: AdPlacement;\n /** Rotation interval in ms (default: 10000 = 10 seconds) */\n rotationInterval?: number;\n /** Maximum number of campaigns to fetch */\n maxCampaigns?: number;\n /** Whether the banner can be dismissed/closed by user */\n dismissible?: boolean;\n /** How long to remember dismissal: 'session' (until tab close) or 'persistent' (localStorage) */\n dismissDuration?: 'session' | 'persistent';\n /** Custom CSS class */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n/**\n * AdBanner - Promotional banner with rotation\n *\n * @example\n * ```tsx\n * <AdBanner />\n * <AdBanner placement=\"home_banner\" rotationInterval={5000} />\n * <AdBanner placement=\"topbar_banner\" dismissible dismissDuration=\"session\" />\n * ```\n */\nexport function AdBanner({\n placement = 'home_banner',\n rotationInterval = 10000,\n maxCampaigns = 5,\n dismissible = false,\n dismissDuration = 'session',\n className,\n style,\n}: AdBannerProps) {\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isAnimating, setIsAnimating] = useState(false);\n const [progress, setProgress] = useState(0);\n const [isDismissed, setIsDismissed] = useState(false);\n const trackedImpressions = useRef<Set<string>>(new Set());\n\n // Check if banner was previously dismissed\n useEffect(() => {\n if (!dismissible) return;\n\n const checkDismissed = () => {\n if (dismissDuration === 'persistent') {\n try {\n const dismissed = localStorage.getItem(DISMISSED_BANNERS_KEY);\n if (dismissed) {\n const dismissedPlacements = JSON.parse(dismissed) as string[];\n if (dismissedPlacements.includes(placement)) {\n setIsDismissed(true);\n }\n }\n } catch {\n // Ignore localStorage errors\n }\n } else {\n // Session storage\n try {\n const dismissed = sessionStorage.getItem(DISMISSED_BANNERS_KEY);\n if (dismissed) {\n const dismissedPlacements = JSON.parse(dismissed) as string[];\n if (dismissedPlacements.includes(placement)) {\n setIsDismissed(true);\n }\n }\n } catch {\n // Ignore sessionStorage errors\n }\n }\n };\n\n checkDismissed();\n }, [dismissible, dismissDuration, placement]);\n\n // Handle dismiss\n const handleDismiss = useCallback(() => {\n setIsDismissed(true);\n\n const storage = dismissDuration === 'persistent' ? localStorage : sessionStorage;\n try {\n const existing = storage.getItem(DISMISSED_BANNERS_KEY);\n const dismissedPlacements: string[] = existing ? JSON.parse(existing) : [];\n if (!dismissedPlacements.includes(placement)) {\n dismissedPlacements.push(placement);\n storage.setItem(DISMISSED_BANNERS_KEY, JSON.stringify(dismissedPlacements));\n }\n } catch {\n // Ignore storage errors\n }\n }, [dismissDuration, placement]);\n\n const {\n campaigns,\n loading,\n recordImpression,\n recordClick,\n } = useCampaigns({ placement, maxCampaigns });\n\n // Track impression for current campaign\n useEffect(() => {\n if (campaigns.length === 0) return;\n const campaign = campaigns[currentIndex];\n if (!campaign || trackedImpressions.current.has(campaign.id)) return;\n\n trackedImpressions.current.add(campaign.id);\n recordImpression(campaign);\n }, [currentIndex, campaigns, recordImpression]);\n\n // Progress bar animation\n useEffect(() => {\n if (campaigns.length <= 1) return;\n\n setProgress(0);\n const progressInterval = 50;\n const steps = rotationInterval / progressInterval;\n let currentStep = 0;\n\n const progressTimer = setInterval(() => {\n currentStep++;\n setProgress((currentStep / steps) * 100);\n\n if (currentStep >= steps) {\n setIsAnimating(true);\n setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % campaigns.length);\n setProgress(0);\n currentStep = 0;\n setTimeout(() => setIsAnimating(false), 50);\n }, 200);\n }\n }, progressInterval);\n\n return () => clearInterval(progressTimer);\n }, [campaigns.length, rotationInterval, currentIndex]);\n\n // Handle click\n const handleClick = useCallback(\n (campaign: CampaignWithProduct) => {\n recordClick(campaign);\n const targetUrl = campaign.customCtaUrl || campaign.product.url;\n window.open(targetUrl, '_blank');\n },\n [recordClick]\n );\n\n // Go to specific slide\n const goToSlide = useCallback((index: number) => {\n if (index === currentIndex) return;\n setIsAnimating(true);\n setTimeout(() => {\n setCurrentIndex(index);\n setProgress(0);\n setTimeout(() => setIsAnimating(false), 50);\n }, 200);\n }, [currentIndex]);\n\n if (loading || campaigns.length === 0 || isDismissed) return null;\n\n const campaign = campaigns[currentIndex];\n if (!campaign) return null;\n\n const { product } = campaign;\n const displayTitle = campaign.customTitle || product.name;\n const displayTagline = campaign.customTagline || product.tagline;\n const displayCta = campaign.customCta || 'Learn More';\n const displayColor = campaign.customProductColor || product.color || '#3B82F6';\n const displayIcon = campaign.customIcon || product.icon64 || '';\n const displayFeatures = campaign.customFeatures || product.features || [];\n\n return (\n <Box\n className={className}\n style={{\n background: 'var(--color-background)',\n borderBottom: '1px solid var(--gray-a4)',\n position: 'relative',\n ...style,\n }}\n >\n {/* Dismiss button */}\n {dismissible && (\n <IconButton\n size=\"1\"\n variant=\"ghost\"\n color=\"gray\"\n onClick={handleDismiss}\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 10,\n cursor: 'pointer',\n }}\n aria-label=\"Close banner\"\n >\n <X size={16} />\n </IconButton>\n )}\n\n {/* Colored accent bar */}\n <Box style={{ height: 3, background: displayColor }} />\n\n {/* Main content wrapper */}\n <Box\n style={{\n background: `linear-gradient(90deg, ${displayColor}08 0%, ${displayColor}12 50%, ${displayColor}08 100%)`,\n }}\n >\n {/* Label */}\n <Flex align=\"center\" justify=\"center\" gap=\"2\" py=\"2\">\n <Sparkles size={12} color={displayColor} />\n <Text\n size=\"1\"\n weight=\"medium\"\n style={{\n color: displayColor,\n fontSize: '11px',\n letterSpacing: '1.5px',\n textTransform: 'uppercase',\n }}\n >\n Discover Our Products\n </Text>\n <Sparkles size={12} color={displayColor} />\n </Flex>\n\n {/* Content */}\n <Box px=\"4\" py=\"3\">\n <Flex\n direction={{ initial: 'column', sm: 'row' }}\n align=\"center\"\n justify=\"between\"\n gap={{ initial: '3', sm: '4' }}\n style={{\n opacity: isAnimating ? 0 : 1,\n transform: isAnimating ? 'translateX(-10px)' : 'translateX(0)',\n transition: 'all 0.2s ease-out',\n }}\n >\n {/* Left: Product Info */}\n <Flex align=\"center\" gap=\"3\" style={{ flex: 1, minWidth: 0 }}>\n {/* Icon */}\n <Box\n style={{\n width: 56,\n height: 56,\n borderRadius: 12,\n background: `${displayColor}15`,\n border: `1.5px solid ${displayColor}30`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n />\n\n {/* Text */}\n <Flex direction=\"column\" gap=\"0\" style={{ minWidth: 0 }}>\n <Flex align=\"center\" gap=\"2\">\n <Text size=\"3\" weight=\"bold\">\n {displayTitle}\n </Text>\n <Badge\n size=\"1\"\n style={{\n background: `${displayColor}18`,\n color: displayColor,\n fontSize: '11px',\n fontWeight: 600,\n padding: '3px 8px',\n }}\n >\n {product.type === 'extension' ? 'Extension' : product.type === 'android' ? 'App' : 'Web'}\n </Badge>\n </Flex>\n\n <Text\n size=\"2\"\n color=\"gray\"\n style={{\n marginTop: 4,\n display: '-webkit-box',\n WebkitLineClamp: 1,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {displayTagline}\n </Text>\n\n {/* Features - Desktop */}\n <Flex gap=\"4\" mt=\"2\" display={{ initial: 'none', md: 'flex' }}>\n {displayFeatures.slice(0, 3).map((feature, i) => (\n <Flex key={i} align=\"center\" gap=\"1\">\n <Check size={12} color={displayColor} strokeWidth={3} />\n <Text size=\"2\" style={{ color: 'var(--gray-10)' }}>\n {feature}\n </Text>\n </Flex>\n ))}\n </Flex>\n </Flex>\n </Flex>\n\n {/* Right: CTA Button */}\n <Flex align=\"center\" style={{ flexShrink: 0 }}>\n <Button\n size=\"2\"\n onClick={() => handleClick(campaign)}\n style={{\n background: displayColor,\n color: 'white',\n fontWeight: 600,\n fontSize: '14px',\n padding: '0 20px',\n height: 38,\n boxShadow: `0 2px 8px ${displayColor}40`,\n }}\n >\n {displayCta}\n <ExternalLink size={14} style={{ marginLeft: 6 }} />\n </Button>\n </Flex>\n </Flex>\n </Box>\n\n {/* Progress dots with progress bar */}\n {campaigns.length > 1 && (\n <Flex justify=\"center\" align=\"center\" gap=\"2\" py=\"3\">\n {campaigns.map((c, i) => (\n <Box\n key={i}\n onClick={() => goToSlide(i)}\n style={{\n width: 40,\n height: 4,\n borderRadius: 2,\n background: 'var(--gray-a4)',\n cursor: 'pointer',\n overflow: 'hidden',\n position: 'relative',\n }}\n >\n {/* Progress fill */}\n <Box\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n width: i === currentIndex ? `${progress}%` : i < currentIndex ? '100%' : '0%',\n background: c.product?.color || displayColor,\n borderRadius: 2,\n transition: i === currentIndex ? 'none' : 'width 0.3s ease',\n }}\n />\n </Box>\n ))}\n </Flex>\n )}\n </Box>\n </Box>\n );\n}\n\nexport default AdBanner;\n","/**\n * TopbarAdBanner Component\n *\n * A compact, 60px max height promotional banner for the very top of the site.\n * Displays ads in a carousel with 20 second rotation.\n * Features: progress bar on top, dots navigation, pause on hover.\n * Dismissible per session with smooth animations.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useEffect, useState, useCallback, useRef } from 'react';\nimport { Box, Flex, Text, Button, IconButton, Container } from '@radix-ui/themes';\nimport { ExternalLink, X, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useCampaigns } from '../../hooks/useCampaigns';\nimport type { AdPlacement, CampaignWithProduct } from '../../types/campaigns';\n\n// Storage key for dismissed banners\nconst DISMISSED_TOPBAR_KEY = 'sf_topbar_dismissed';\n\nexport interface TopbarAdBannerProps {\n /** Ad placement (defaults to topbar_banner) */\n placement?: AdPlacement;\n /** Rotation interval in ms (default: 20000 = 20 seconds) */\n rotationInterval?: number;\n /** Maximum number of campaigns to fetch */\n maxCampaigns?: number;\n /** Custom CSS class */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n/**\n * TopbarAdBanner - Compact carousel banner for top of site (60px max)\n *\n * @example\n * ```tsx\n * <TopbarAdBanner />\n * <TopbarAdBanner rotationInterval={15000} />\n * ```\n */\nexport function TopbarAdBanner({\n placement = 'topbar_banner',\n rotationInterval = 20000,\n maxCampaigns = 5,\n className,\n style,\n}: TopbarAdBannerProps) {\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isAnimating, setIsAnimating] = useState(false);\n const [isDismissed, setIsDismissed] = useState(false);\n const [progress, setProgress] = useState(0);\n const [isPaused, setIsPaused] = useState(false);\n const trackedImpressions = useRef<Set<string>>(new Set());\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const progressRef = useRef(0);\n\n // Check if banner was dismissed this session\n useEffect(() => {\n try {\n const dismissed = sessionStorage.getItem(DISMISSED_TOPBAR_KEY);\n if (dismissed === 'true') {\n setIsDismissed(true);\n }\n } catch {\n // Ignore storage errors\n }\n }, []);\n\n // Handle dismiss with animation\n const handleDismiss = useCallback(() => {\n setIsDismissed(true);\n try {\n sessionStorage.setItem(DISMISSED_TOPBAR_KEY, 'true');\n } catch {\n // Ignore storage errors\n }\n }, []);\n\n const {\n campaigns,\n loading,\n recordImpression,\n recordClick,\n } = useCampaigns({ placement, maxCampaigns });\n\n // Track impression for current campaign\n useEffect(() => {\n if (campaigns.length === 0) return;\n const campaign = campaigns[currentIndex];\n if (!campaign || trackedImpressions.current.has(campaign.id)) return;\n\n trackedImpressions.current.add(campaign.id);\n recordImpression(campaign);\n }, [currentIndex, campaigns, recordImpression]);\n\n // Progress bar and auto-rotation (pauses on hover)\n useEffect(() => {\n if (campaigns.length <= 1) return;\n\n const progressInterval = 50;\n const steps = rotationInterval / progressInterval;\n\n timerRef.current = setInterval(() => {\n if (isPaused) return; // Skip updates when paused\n\n progressRef.current++;\n setProgress((progressRef.current / steps) * 100);\n\n if (progressRef.current >= steps) {\n setIsAnimating(true);\n setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % campaigns.length);\n setProgress(0);\n progressRef.current = 0;\n setTimeout(() => setIsAnimating(false), 50);\n }, 200);\n }\n }, progressInterval);\n\n return () => {\n if (timerRef.current) clearInterval(timerRef.current);\n };\n }, [campaigns.length, rotationInterval, isPaused]);\n\n // Reset progress when slide changes manually\n useEffect(() => {\n progressRef.current = 0;\n setProgress(0);\n }, [currentIndex]);\n\n // Handle click\n const handleClick = useCallback(\n (campaign: CampaignWithProduct) => {\n recordClick(campaign);\n const targetUrl = campaign.customCtaUrl || campaign.product.url;\n window.open(targetUrl, '_blank');\n },\n [recordClick]\n );\n\n // Navigate to previous/next\n const resetTimer = useCallback(() => {\n if (timerRef.current) clearInterval(timerRef.current);\n setProgress(0);\n }, []);\n\n const goToPrev = useCallback(() => {\n resetTimer();\n setIsAnimating(true);\n setTimeout(() => {\n setCurrentIndex((prev) => (prev - 1 + campaigns.length) % campaigns.length);\n setTimeout(() => setIsAnimating(false), 50);\n }, 200);\n }, [campaigns.length, resetTimer]);\n\n const goToNext = useCallback(() => {\n resetTimer();\n setIsAnimating(true);\n setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % campaigns.length);\n setTimeout(() => setIsAnimating(false), 50);\n }, 200);\n }, [campaigns.length, resetTimer]);\n\n if (loading || campaigns.length === 0 || isDismissed) return null;\n\n const campaign = campaigns[currentIndex];\n if (!campaign) return null;\n\n const { product } = campaign;\n const displayTitle = campaign.customTitle || product.name;\n const displayTagline = campaign.customTagline || product.tagline;\n const displayCta = campaign.customCta || 'Learn More';\n const displayColor = campaign.customProductColor || product.color || '#3B82F6';\n const displayIcon = campaign.customIcon || product.icon64 || '';\n\n // Hover handlers for pause functionality\n const handleMouseEnter = useCallback(() => {\n setIsPaused(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsPaused(false);\n }, []);\n\n return (\n <Box\n className={className}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n style={{\n background: `linear-gradient(135deg, ${displayColor}12 0%, ${displayColor}08 50%, ${displayColor}12 100%)`,\n borderBottom: `1px solid ${displayColor}30`,\n position: 'relative',\n height: 60,\n maxHeight: 60,\n overflow: 'hidden',\n cursor: 'default',\n ...style,\n }}\n >\n {/* Animated gradient background */}\n <Box\n style={{\n position: 'absolute',\n inset: 0,\n background: `radial-gradient(ellipse at 50% 0%, ${displayColor}15 0%, transparent 70%)`,\n pointerEvents: 'none',\n }}\n />\n\n {/* Progress bar at top */}\n <Box style={{ height: 3, background: 'var(--gray-a3)', position: 'relative', zIndex: 1 }}>\n <Box\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n width: `${progress}%`,\n background: `linear-gradient(90deg, ${displayColor}, ${displayColor}cc)`,\n transition: 'width 50ms linear',\n boxShadow: `0 0 10px ${displayColor}60`,\n }}\n />\n </Box>\n\n {/* Main content container */}\n <Container size=\"4\" style={{ height: 'calc(100% - 3px)' }}>\n <Flex\n align=\"center\"\n justify=\"between\"\n gap={{ initial: '2', sm: '3' }}\n style={{\n height: '100%',\n padding: '0 12px',\n }}\n >\n {/* Left: Navigation arrows (desktop) */}\n {campaigns.length > 1 && (\n <Box display={{ initial: 'none', md: 'block' }} style={{ flexShrink: 0 }}>\n <IconButton\n size=\"1\"\n variant=\"ghost\"\n color=\"gray\"\n onClick={goToPrev}\n style={{ cursor: 'pointer' }}\n aria-label=\"Previous ad\"\n >\n <ChevronLeft size={14} />\n </IconButton>\n </Box>\n )}\n\n {/* Center: Product Info */}\n <Flex\n align=\"center\"\n gap={{ initial: '2', sm: '3' }}\n style={{\n flex: 1,\n minWidth: 0,\n opacity: isAnimating ? 0 : 1,\n transform: isAnimating ? 'translateY(-6px)' : 'translateY(0)',\n transition: 'all 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n >\n {/* Icon - smaller for 60px height */}\n <Box\n style={{\n width: 36,\n height: 36,\n borderRadius: 8,\n background: `linear-gradient(135deg, ${displayColor}25 0%, ${displayColor}15 100%)`,\n border: `1px solid ${displayColor}35`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n boxShadow: `0 2px 6px ${displayColor}20`,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n />\n\n {/* Text - single line */}\n <Flex align=\"center\" gap=\"2\" style={{ minWidth: 0, flex: 1 }}>\n <Text size=\"2\" weight=\"bold\" style={{ whiteSpace: 'nowrap' }}>\n {displayTitle}\n </Text>\n <Box display={{ initial: 'none', sm: 'block' }} style={{ minWidth: 0, flex: 1 }}>\n <Text\n size=\"1\"\n color=\"gray\"\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n display: 'block',\n }}\n >\n {displayTagline}\n </Text>\n </Box>\n </Flex>\n\n {/* CTA Button - compact */}\n <Button\n size=\"1\"\n onClick={() => handleClick(campaign)}\n style={{\n background: `linear-gradient(135deg, ${displayColor} 0%, ${displayColor}dd 100%)`,\n color: 'white',\n fontWeight: 600,\n fontSize: '12px',\n padding: '0 12px',\n height: 28,\n flexShrink: 0,\n boxShadow: `0 2px 6px ${displayColor}40`,\n border: 'none',\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {displayCta}\n <ExternalLink size={11} />\n </span>\n </Button>\n </Flex>\n\n {/* Right: Dots + Navigation + Dismiss */}\n <Flex gap=\"1\" align=\"center\" style={{ flexShrink: 0 }}>\n {campaigns.length > 1 && (\n <>\n {/* Dot indicators - always visible */}\n <Flex gap=\"1\" mx=\"1\">\n {campaigns.map((_, i) => (\n <Box\n key={i}\n style={{\n width: i === currentIndex ? 14 : 6,\n height: 6,\n borderRadius: 3,\n background: i === currentIndex ? displayColor : 'var(--gray-a5)',\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n }}\n onClick={() => {\n resetTimer();\n setCurrentIndex(i);\n }}\n />\n ))}\n </Flex>\n <Box display={{ initial: 'none', md: 'block' }}>\n <IconButton\n size=\"1\"\n variant=\"ghost\"\n color=\"gray\"\n onClick={goToNext}\n style={{ cursor: 'pointer' }}\n aria-label=\"Next ad\"\n >\n <ChevronRight size={14} />\n </IconButton>\n </Box>\n </>\n )}\n <IconButton\n size=\"1\"\n variant=\"soft\"\n color=\"gray\"\n onClick={handleDismiss}\n style={{ cursor: 'pointer', marginLeft: 2 }}\n aria-label=\"Close banner\"\n >\n <X size={12} />\n </IconButton>\n </Flex>\n </Flex>\n </Container>\n </Box>\n );\n}\n\nexport default TopbarAdBanner;\n","/**\n * AdCarousel Component\n *\n * A compact carousel slider for displaying ads after hero/title sections.\n * Height: 200px max with content display.\n * Features: progress bar on top, dots navigation, pause on hover.\n * Rotates through campaigns every 20 seconds by default.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useEffect, useState, useCallback, useRef } from 'react';\nimport { Box, Flex, Text, Button, Card, IconButton, Container } from '@radix-ui/themes';\nimport { ExternalLink, ChevronLeft, ChevronRight, Check, Star, ArrowRight } from 'lucide-react';\nimport { useCampaigns } from '../../hooks/useCampaigns';\nimport type { AdPlacement, CampaignWithProduct } from '../../types/campaigns';\n\nexport interface AdCarouselProps {\n /** Ad placement (defaults to home_banner) */\n placement?: AdPlacement;\n /** Rotation interval in ms (default: 20000 = 20 seconds) */\n rotationInterval?: number;\n /** Maximum number of campaigns to fetch */\n maxCampaigns?: number;\n /** Custom CSS class */\n className?: string;\n /** Custom styles */\n style?: React.CSSProperties;\n}\n\n/**\n * AdCarousel - Compact slider for after hero sections (200px height)\n *\n * @example\n * ```tsx\n * <AdCarousel />\n * <AdCarousel placement=\"home_banner\" rotationInterval={15000} />\n * ```\n */\nexport function AdCarousel({\n placement = 'home_banner',\n rotationInterval = 20000,\n maxCampaigns = 5,\n className,\n style,\n}: AdCarouselProps) {\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isAnimating, setIsAnimating] = useState(false);\n const [progress, setProgress] = useState(0);\n const [isPaused, setIsPaused] = useState(false);\n const trackedImpressions = useRef<Set<string>>(new Set());\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const progressRef = useRef(0);\n\n const {\n campaigns,\n loading,\n recordImpression,\n recordClick,\n } = useCampaigns({ placement, maxCampaigns });\n\n // Track impression for current campaign\n useEffect(() => {\n if (campaigns.length === 0) return;\n const campaign = campaigns[currentIndex];\n if (!campaign || trackedImpressions.current.has(campaign.id)) return;\n\n trackedImpressions.current.add(campaign.id);\n recordImpression(campaign);\n }, [currentIndex, campaigns, recordImpression]);\n\n // Progress bar and auto-rotation (pauses on hover)\n useEffect(() => {\n if (campaigns.length <= 1) return;\n\n const progressInterval = 50;\n const steps = rotationInterval / progressInterval;\n\n timerRef.current = setInterval(() => {\n if (isPaused) return; // Skip updates when paused\n\n progressRef.current++;\n setProgress((progressRef.current / steps) * 100);\n\n if (progressRef.current >= steps) {\n setIsAnimating(true);\n setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % campaigns.length);\n setProgress(0);\n progressRef.current = 0;\n setTimeout(() => setIsAnimating(false), 50);\n }, 250);\n }\n }, progressInterval);\n\n return () => {\n if (timerRef.current) clearInterval(timerRef.current);\n };\n }, [campaigns.length, rotationInterval, isPaused]);\n\n // Reset progress when slide changes manually\n useEffect(() => {\n progressRef.current = 0;\n setProgress(0);\n }, [currentIndex]);\n\n // Handle click\n const handleClick = useCallback(\n (campaign: CampaignWithProduct) => {\n recordClick(campaign);\n const targetUrl = campaign.customCtaUrl || campaign.product.url;\n window.open(targetUrl, '_blank');\n },\n [recordClick]\n );\n\n // Navigate to previous/next\n const resetTimer = useCallback(() => {\n if (timerRef.current) clearInterval(timerRef.current);\n setProgress(0);\n }, []);\n\n const goToPrev = useCallback(() => {\n resetTimer();\n setIsAnimating(true);\n setTimeout(() => {\n setCurrentIndex((prev) => (prev - 1 + campaigns.length) % campaigns.length);\n setTimeout(() => setIsAnimating(false), 50);\n }, 250);\n }, [campaigns.length, resetTimer]);\n\n const goToNext = useCallback(() => {\n resetTimer();\n setIsAnimating(true);\n setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % campaigns.length);\n setTimeout(() => setIsAnimating(false), 50);\n }, 250);\n }, [campaigns.length, resetTimer]);\n\n const goToSlide = useCallback((index: number) => {\n if (index === currentIndex) return;\n resetTimer();\n setIsAnimating(true);\n setTimeout(() => {\n setCurrentIndex(index);\n setTimeout(() => setIsAnimating(false), 50);\n }, 250);\n }, [currentIndex, resetTimer]);\n\n // Hover handlers for pause functionality\n const handleMouseEnter = useCallback(() => {\n setIsPaused(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsPaused(false);\n }, []);\n\n if (loading || campaigns.length === 0) return null;\n\n const campaign = campaigns[currentIndex];\n if (!campaign) return null;\n\n const { product } = campaign;\n const displayTitle = campaign.customTitle || product.name;\n const displayTagline = campaign.customTagline || product.tagline;\n const displayCta = campaign.customCta || 'Learn More';\n const displayColor = campaign.customProductColor || product.color || '#3B82F6';\n const displayIcon = campaign.customIcon || product.icon64 || '';\n const displayFeatures = campaign.customFeatures || product.features || [];\n\n return (\n <Box\n className={className}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n style={{\n padding: '16px 0',\n cursor: 'default',\n ...style,\n }}\n >\n <Container size=\"4\">\n <Card\n style={{\n background: `linear-gradient(145deg, var(--color-background) 0%, ${displayColor}08 100%)`,\n border: `1px solid ${displayColor}20`,\n borderRadius: 12,\n overflow: 'hidden',\n height: 200,\n maxHeight: 200,\n position: 'relative',\n }}\n >\n {/* Decorative background element */}\n <Box\n style={{\n position: 'absolute',\n top: -50,\n right: -50,\n width: 150,\n height: 150,\n borderRadius: '50%',\n background: `radial-gradient(circle, ${displayColor}12 0%, transparent 70%)`,\n pointerEvents: 'none',\n }}\n />\n\n {/* Progress bar at top */}\n <Box style={{ height: 3, background: 'var(--gray-a3)', position: 'relative', zIndex: 2 }}>\n <Box\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n width: `${progress}%`,\n background: `linear-gradient(90deg, ${displayColor} 0%, ${displayColor}cc 100%)`,\n transition: 'width 50ms linear',\n boxShadow: `0 0 10px ${displayColor}50`,\n }}\n />\n </Box>\n\n {/* Main content */}\n <Box style={{ height: 'calc(100% - 3px)', position: 'relative', zIndex: 1 }}>\n <Flex\n align=\"center\"\n style={{ height: '100%' }}\n >\n {/* Left navigation arrow (desktop) */}\n {campaigns.length > 1 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{ width: 48, flexShrink: 0 }}\n display={{ initial: 'none', md: 'flex' }}\n >\n <IconButton\n size=\"2\"\n variant=\"ghost\"\n color=\"gray\"\n onClick={goToPrev}\n style={{\n cursor: 'pointer',\n width: 36,\n height: 36,\n borderRadius: 8,\n background: 'var(--gray-a3)',\n }}\n aria-label=\"Previous\"\n >\n <ChevronLeft size={20} />\n </IconButton>\n </Flex>\n )}\n\n {/* Content area - horizontal layout */}\n <Flex\n align=\"center\"\n gap={{ initial: '3', md: '4' }}\n px={{ initial: '3', md: '4' }}\n py=\"3\"\n style={{\n flex: 1,\n opacity: isAnimating ? 0 : 1,\n transform: isAnimating ? 'translateX(-16px) scale(0.98)' : 'translateX(0) scale(1)',\n transition: 'all 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n >\n {/* Icon/Logo - compact */}\n <Box\n style={{\n width: 64,\n height: 64,\n borderRadius: 12,\n background: `linear-gradient(145deg, ${displayColor}20 0%, ${displayColor}10 100%)`,\n border: `1.5px solid ${displayColor}30`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n boxShadow: `0 4px 16px ${displayColor}15`,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n />\n\n {/* Text content - compact */}\n <Flex\n direction=\"column\"\n gap=\"1\"\n style={{ flex: 1, minWidth: 0 }}\n >\n {/* Title with featured badge */}\n <Flex align=\"center\" gap=\"2\">\n <Text\n size={{ initial: '3', md: '4' }}\n weight=\"bold\"\n style={{ lineHeight: 1.2 }}\n >\n {displayTitle}\n </Text>\n <Flex\n align=\"center\"\n gap=\"1\"\n display={{ initial: 'none', sm: 'flex' }}\n style={{\n background: `${displayColor}15`,\n padding: '2px 6px',\n borderRadius: 4,\n }}\n >\n <Star size={10} fill={displayColor} color={displayColor} />\n <Text size=\"1\" weight=\"medium\" style={{ color: displayColor, fontSize: 10 }}>\n Featured\n </Text>\n </Flex>\n </Flex>\n\n {/* Tagline - single line */}\n <Text\n size=\"2\"\n color=\"gray\"\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {displayTagline}\n </Text>\n\n {/* Features - horizontal, max 3 on desktop */}\n {displayFeatures.length > 0 && (\n <Flex\n gap=\"2\"\n display={{ initial: 'none', md: 'flex' }}\n style={{ marginTop: 4 }}\n >\n {displayFeatures.slice(0, 3).map((feature, i) => (\n <Flex\n key={i}\n align=\"center\"\n gap=\"1\"\n style={{\n background: 'var(--gray-a3)',\n padding: '3px 8px',\n borderRadius: 4,\n }}\n >\n <Check size={10} color={displayColor} strokeWidth={3} />\n <Text size=\"1\" style={{ fontSize: 11 }}>\n {feature}\n </Text>\n </Flex>\n ))}\n </Flex>\n )}\n </Flex>\n\n {/* CTA Button - compact */}\n <Flex direction=\"column\" gap=\"2\" align=\"center\" style={{ flexShrink: 0 }}>\n <Button\n size=\"2\"\n onClick={() => handleClick(campaign)}\n style={{\n background: `linear-gradient(135deg, ${displayColor} 0%, ${displayColor}dd 100%)`,\n color: 'white',\n fontWeight: 600,\n padding: '0 16px',\n height: 36,\n boxShadow: `0 3px 12px ${displayColor}40`,\n border: 'none',\n cursor: 'pointer',\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n {displayCta}\n <ArrowRight size={14} />\n </span>\n </Button>\n <Button\n size=\"1\"\n variant=\"ghost\"\n onClick={() => handleClick(campaign)}\n style={{\n color: displayColor,\n fontWeight: 500,\n cursor: 'pointer',\n fontSize: 11,\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n Details\n <ExternalLink size={11} />\n </span>\n </Button>\n </Flex>\n </Flex>\n\n {/* Right navigation arrow (desktop) */}\n {campaigns.length > 1 && (\n <Flex\n align=\"center\"\n justify=\"center\"\n style={{ width: 48, flexShrink: 0 }}\n display={{ initial: 'none', md: 'flex' }}\n >\n <IconButton\n size=\"2\"\n variant=\"ghost\"\n color=\"gray\"\n onClick={goToNext}\n style={{\n cursor: 'pointer',\n width: 36,\n height: 36,\n borderRadius: 8,\n background: 'var(--gray-a3)',\n }}\n aria-label=\"Next\"\n >\n <ChevronRight size={20} />\n </IconButton>\n </Flex>\n )}\n </Flex>\n\n {/* Bottom navigation - dots always visible */}\n {campaigns.length > 1 && (\n <Flex\n justify=\"center\"\n align=\"center\"\n gap=\"2\"\n style={{\n position: 'absolute',\n bottom: 8,\n left: 0,\n right: 0,\n }}\n >\n {/* Mobile arrows */}\n <Box display={{ initial: 'block', md: 'none' }}>\n <IconButton\n size=\"1\"\n variant=\"soft\"\n color=\"gray\"\n onClick={goToPrev}\n style={{ cursor: 'pointer' }}\n aria-label=\"Previous\"\n >\n <ChevronLeft size={14} />\n </IconButton>\n </Box>\n\n {/* Dot indicators */}\n <Flex gap=\"1\">\n {campaigns.map((c, i) => (\n <Box\n key={i}\n onClick={() => goToSlide(i)}\n style={{\n width: i === currentIndex ? 20 : 8,\n height: 8,\n borderRadius: 4,\n background: i === currentIndex\n ? `linear-gradient(90deg, ${c.product?.color || displayColor}, ${c.product?.color || displayColor}cc)`\n : 'var(--gray-a4)',\n cursor: 'pointer',\n transition: 'all 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n boxShadow: i === currentIndex ? `0 2px 6px ${c.product?.color || displayColor}40` : 'none',\n }}\n />\n ))}\n </Flex>\n\n {/* Mobile arrows */}\n <Box display={{ initial: 'block', md: 'none' }}>\n <IconButton\n size=\"1\"\n variant=\"soft\"\n color=\"gray\"\n onClick={goToNext}\n style={{ cursor: 'pointer' }}\n aria-label=\"Next\"\n >\n <ChevronRight size={14} />\n </IconButton>\n </Box>\n </Flex>\n )}\n </Box>\n </Card>\n </Container>\n </Box>\n );\n}\n\nexport default AdCarousel;\n","/**\n * BroadcastBanner Component\n *\n * A sleek, dismissible banner for displaying broadcast notifications.\n * Supports different notification types with appropriate styling.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { Box, Flex, Text, Button, IconButton } from '@radix-ui/themes';\nimport {\n Info,\n CheckCircle,\n AlertTriangle,\n AlertCircle,\n X,\n ExternalLink,\n Megaphone,\n} from 'lucide-react';\nimport { isInitialized } from '../../firebase/config';\nimport type {\n BroadcastNotification,\n BroadcastBannerProps,\n NotificationType,\n} from '../../types/notifications';\n\n// ============================================================================\n// TYPE STYLING\n// ============================================================================\n\nconst TYPE_STYLES: Record<\n NotificationType,\n {\n icon: typeof Info;\n bgColor: string;\n borderColor: string;\n textColor: string;\n iconColor: string;\n }\n> = {\n info: {\n icon: Info,\n bgColor: 'var(--blue-2)',\n borderColor: 'var(--blue-6)',\n textColor: 'var(--blue-11)',\n iconColor: 'var(--blue-9)',\n },\n success: {\n icon: CheckCircle,\n bgColor: 'var(--green-2)',\n borderColor: 'var(--green-6)',\n textColor: 'var(--green-11)',\n iconColor: 'var(--green-9)',\n },\n warning: {\n icon: AlertTriangle,\n bgColor: 'var(--yellow-2)',\n borderColor: 'var(--yellow-6)',\n textColor: 'var(--yellow-11)',\n iconColor: 'var(--yellow-9)',\n },\n error: {\n icon: AlertCircle,\n bgColor: 'var(--red-2)',\n borderColor: 'var(--red-6)',\n textColor: 'var(--red-11)',\n iconColor: 'var(--red-9)',\n },\n reminder: {\n icon: AlertTriangle,\n bgColor: 'var(--orange-2)',\n borderColor: 'var(--orange-6)',\n textColor: 'var(--orange-11)',\n iconColor: 'var(--orange-9)',\n },\n milestone: {\n icon: CheckCircle,\n bgColor: 'var(--violet-2)',\n borderColor: 'var(--violet-6)',\n textColor: 'var(--violet-11)',\n iconColor: 'var(--violet-9)',\n },\n announcement: {\n icon: Megaphone,\n bgColor: 'var(--iris-2)',\n borderColor: 'var(--iris-6)',\n textColor: 'var(--iris-11)',\n iconColor: 'var(--iris-9)',\n },\n};\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * BroadcastBanner - Dismissible notification banner\n *\n * @example\n * ```tsx\n * const { broadcasts, dismissBroadcast, trackClick } = useBannerBroadcasts();\n *\n * return (\n * <div>\n * {broadcasts.map(broadcast => (\n * <BroadcastBanner\n * key={broadcast.id}\n * broadcast={broadcast}\n * onDismiss={() => dismissBroadcast(broadcast.id)}\n * onActionClick={() => trackClick(broadcast.id)}\n * />\n * ))}\n * </div>\n * );\n * ```\n */\nexport function BroadcastBanner({\n broadcast,\n onActionClick,\n onDismiss,\n className,\n}: BroadcastBannerProps) {\n const impressionTrackedRef = useRef(false);\n\n // Track impression on mount\n useEffect(() => {\n if (!impressionTrackedRef.current) {\n impressionTrackedRef.current = true;\n // Impression tracking is handled by the hook\n }\n }, []);\n\n // Handle action click\n const handleActionClick = useCallback(() => {\n onActionClick?.();\n if (broadcast.actionUrl) {\n window.open(broadcast.actionUrl, '_blank');\n }\n }, [broadcast.actionUrl, onActionClick]);\n\n // Handle dismiss\n const handleDismiss = useCallback(() => {\n onDismiss?.();\n }, [onDismiss]);\n\n // Don't render if not initialized\n if (!isInitialized()) {\n return null;\n }\n\n const typeStyle = TYPE_STYLES[broadcast.type] || TYPE_STYLES.info;\n const Icon = typeStyle.icon;\n\n return (\n <Box\n className={className}\n style={{\n background: typeStyle.bgColor,\n borderBottom: `1px solid ${typeStyle.borderColor}`,\n position: 'relative',\n }}\n >\n {/* Accent bar */}\n <Box\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: 4,\n background: typeStyle.iconColor,\n }}\n />\n\n <Flex\n align=\"center\"\n justify=\"between\"\n gap=\"3\"\n py=\"3\"\n px=\"4\"\n style={{ paddingLeft: 20 }}\n >\n {/* Left: Icon + Content */}\n <Flex align=\"center\" gap=\"3\" style={{ flex: 1, minWidth: 0 }}>\n <Box\n style={{\n width: 32,\n height: 32,\n borderRadius: 8,\n background: `color-mix(in srgb, ${typeStyle.iconColor} 15%, transparent)`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n <Icon size={18} color={typeStyle.iconColor} />\n </Box>\n\n <Flex direction=\"column\" gap=\"0\" style={{ minWidth: 0 }}>\n <Text\n size=\"2\"\n weight=\"bold\"\n style={{\n color: typeStyle.textColor,\n display: '-webkit-box',\n WebkitLineClamp: 1,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {broadcast.title}\n </Text>\n <Text\n size=\"2\"\n style={{\n color: 'var(--gray-11)',\n display: '-webkit-box',\n WebkitLineClamp: 1,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {broadcast.message}\n </Text>\n </Flex>\n </Flex>\n\n {/* Right: Action + Dismiss */}\n <Flex align=\"center\" gap=\"2\" style={{ flexShrink: 0 }}>\n {broadcast.actionUrl && (\n <Button\n size=\"1\"\n variant=\"soft\"\n onClick={handleActionClick}\n style={{\n background: `color-mix(in srgb, ${typeStyle.iconColor} 15%, transparent)`,\n color: typeStyle.iconColor,\n }}\n >\n {broadcast.actionText || 'Learn More'}\n <ExternalLink size={12} />\n </Button>\n )}\n\n {broadcast.dismissible && (\n <IconButton\n size=\"1\"\n variant=\"ghost\"\n color=\"gray\"\n onClick={handleDismiss}\n style={{ opacity: 0.7 }}\n >\n <X size={16} />\n </IconButton>\n )}\n </Flex>\n </Flex>\n </Box>\n );\n}\n\n// ============================================================================\n// MULTIPLE BANNERS COMPONENT\n// ============================================================================\n\nexport interface BroadcastBannersProps {\n /** List of broadcasts to display */\n broadcasts: BroadcastNotification[];\n /** Called when a broadcast is dismissed */\n onDismiss?: (broadcastId: string) => void;\n /** Called when action is clicked */\n onActionClick?: (broadcastId: string) => void;\n /** Maximum number of banners to show */\n maxBanners?: number;\n /** Custom CSS class */\n className?: string;\n}\n\n/**\n * BroadcastBanners - Display multiple broadcast banners stacked\n *\n * @example\n * ```tsx\n * const { broadcasts, dismissBroadcast, trackClick } = useBannerBroadcasts();\n *\n * return (\n * <BroadcastBanners\n * broadcasts={broadcasts}\n * onDismiss={dismissBroadcast}\n * onActionClick={trackClick}\n * maxBanners={3}\n * />\n * );\n * ```\n */\nexport function BroadcastBanners({\n broadcasts,\n onDismiss,\n onActionClick,\n maxBanners = 3,\n className,\n}: BroadcastBannersProps) {\n const displayBroadcasts = broadcasts.slice(0, maxBanners);\n\n if (displayBroadcasts.length === 0) {\n return null;\n }\n\n return (\n <Box className={className}>\n {displayBroadcasts.map((broadcast) => (\n <BroadcastBanner\n key={broadcast.id}\n broadcast={broadcast}\n onDismiss={() => onDismiss?.(broadcast.id)}\n onActionClick={() => onActionClick?.(broadcast.id)}\n />\n ))}\n </Box>\n );\n}\n\nexport default BroadcastBanner;\n","/**\n * AnnouncementModal Component\n *\n * A modal dialog for displaying important broadcast announcements.\n * Supports rich content with action buttons and dismissal.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { Box, Flex, Text, Heading, Button, Dialog } from '@radix-ui/themes';\nimport {\n Info,\n CheckCircle,\n AlertTriangle,\n AlertCircle,\n X,\n ExternalLink,\n Megaphone,\n Bell,\n Sparkles,\n} from 'lucide-react';\nimport { isInitialized } from '../../firebase/config';\nimport type {\n AnnouncementModalProps,\n NotificationType,\n} from '../../types/notifications';\n\n// ============================================================================\n// TYPE STYLING\n// ============================================================================\n\nconst TYPE_CONFIG: Record<\n NotificationType,\n {\n icon: typeof Info;\n gradient: string;\n accentColor: string;\n iconBg: string;\n }\n> = {\n info: {\n icon: Info,\n gradient: 'linear-gradient(135deg, var(--blue-3) 0%, var(--blue-2) 100%)',\n accentColor: 'var(--blue-9)',\n iconBg: 'var(--blue-4)',\n },\n success: {\n icon: CheckCircle,\n gradient: 'linear-gradient(135deg, var(--green-3) 0%, var(--green-2) 100%)',\n accentColor: 'var(--green-9)',\n iconBg: 'var(--green-4)',\n },\n warning: {\n icon: AlertTriangle,\n gradient: 'linear-gradient(135deg, var(--yellow-3) 0%, var(--yellow-2) 100%)',\n accentColor: 'var(--yellow-9)',\n iconBg: 'var(--yellow-4)',\n },\n error: {\n icon: AlertCircle,\n gradient: 'linear-gradient(135deg, var(--red-3) 0%, var(--red-2) 100%)',\n accentColor: 'var(--red-9)',\n iconBg: 'var(--red-4)',\n },\n reminder: {\n icon: Bell,\n gradient: 'linear-gradient(135deg, var(--orange-3) 0%, var(--orange-2) 100%)',\n accentColor: 'var(--orange-9)',\n iconBg: 'var(--orange-4)',\n },\n milestone: {\n icon: Sparkles,\n gradient: 'linear-gradient(135deg, var(--violet-3) 0%, var(--violet-2) 100%)',\n accentColor: 'var(--violet-9)',\n iconBg: 'var(--violet-4)',\n },\n announcement: {\n icon: Megaphone,\n gradient: 'linear-gradient(135deg, var(--iris-3) 0%, var(--iris-2) 100%)',\n accentColor: 'var(--iris-9)',\n iconBg: 'var(--iris-4)',\n },\n};\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\n/**\n * AnnouncementModal - Modal dialog for important announcements\n *\n * @example\n * ```tsx\n * const { broadcast, isOpen, close, handleAction } = useAnnouncementModal();\n *\n * return (\n * <AnnouncementModal\n * broadcast={broadcast}\n * isOpen={isOpen}\n * onClose={close}\n * onActionClick={handleAction}\n * />\n * );\n * ```\n */\nexport function AnnouncementModal({\n broadcast,\n isOpen,\n onClose,\n onActionClick,\n}: AnnouncementModalProps) {\n const impressionTrackedRef = useRef(false);\n\n // Track impression when modal opens\n useEffect(() => {\n if (isOpen && broadcast && !impressionTrackedRef.current) {\n impressionTrackedRef.current = true;\n // Impression tracking is handled by the hook\n }\n }, [isOpen, broadcast]);\n\n // Handle action click\n const handleActionClick = useCallback(() => {\n onActionClick?.();\n if (broadcast?.actionUrl) {\n window.open(broadcast.actionUrl, '_blank');\n }\n onClose();\n }, [broadcast, onActionClick, onClose]);\n\n // Handle close\n const handleClose = useCallback(() => {\n onClose();\n }, [onClose]);\n\n // Don't render if not initialized or no broadcast\n if (!isInitialized() || !broadcast) {\n return null;\n }\n\n const typeConfig = TYPE_CONFIG[broadcast.type] || TYPE_CONFIG.announcement;\n const Icon = typeConfig.icon;\n\n return (\n <Dialog.Root open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <Dialog.Content\n style={{\n maxWidth: 480,\n padding: 0,\n overflow: 'hidden',\n }}\n >\n {/* Header with gradient background */}\n <Box\n style={{\n background: typeConfig.gradient,\n padding: 'var(--space-6)',\n position: 'relative',\n }}\n >\n {/* Close button */}\n {broadcast.dismissible && (\n <Box\n style={{\n position: 'absolute',\n top: 'var(--space-3)',\n right: 'var(--space-3)',\n }}\n >\n <Dialog.Close>\n <Button variant=\"ghost\" size=\"1\" color=\"gray\">\n <X size={18} />\n </Button>\n </Dialog.Close>\n </Box>\n )}\n\n {/* Icon */}\n <Flex direction=\"column\" align=\"center\" gap=\"4\">\n <Box\n style={{\n width: 72,\n height: 72,\n borderRadius: 'var(--radius-4)',\n background: typeConfig.iconBg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)',\n }}\n >\n <Icon size={36} color={typeConfig.accentColor} />\n </Box>\n\n {/* Title */}\n <Heading\n size=\"5\"\n weight=\"bold\"\n align=\"center\"\n style={{ color: 'var(--gray-12)' }}\n >\n {broadcast.title}\n </Heading>\n </Flex>\n </Box>\n\n {/* Content */}\n <Box p=\"5\">\n <Text\n as=\"p\"\n size=\"3\"\n align=\"center\"\n style={{\n color: 'var(--gray-11)',\n lineHeight: 1.6,\n }}\n >\n {broadcast.message}\n </Text>\n\n {/* Important badge */}\n {broadcast.isImportant && (\n <Flex justify=\"center\" mt=\"4\">\n <Box\n style={{\n padding: 'var(--space-1) var(--space-3)',\n borderRadius: 'var(--radius-2)',\n background: typeConfig.iconBg,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 'var(--space-1)',\n }}\n >\n <Sparkles size={12} color={typeConfig.accentColor} />\n <Text size=\"1\" weight=\"medium\" style={{ color: typeConfig.accentColor }}>\n Important\n </Text>\n </Box>\n </Flex>\n )}\n </Box>\n\n {/* Actions */}\n <Flex\n gap=\"3\"\n p=\"4\"\n justify=\"center\"\n style={{\n borderTop: '1px solid var(--gray-4)',\n background: 'var(--gray-2)',\n }}\n >\n {broadcast.actionUrl ? (\n <>\n <Dialog.Close>\n <Button variant=\"soft\" color=\"gray\" size=\"2\">\n Maybe Later\n </Button>\n </Dialog.Close>\n <Button\n size=\"2\"\n onClick={handleActionClick}\n style={{\n background: typeConfig.accentColor,\n }}\n >\n {broadcast.actionText || 'Learn More'}\n <ExternalLink size={14} />\n </Button>\n </>\n ) : (\n <Dialog.Close>\n <Button\n size=\"2\"\n style={{\n background: typeConfig.accentColor,\n minWidth: 120,\n }}\n >\n Got It\n </Button>\n </Dialog.Close>\n )}\n </Flex>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\nexport default AnnouncementModal;\n","/**\n * Common Features Components\n *\n * Reusable UI components for displaying common features.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport React from 'react';\nimport { Box, Text, Flex, Link, Card, Avatar, Badge, Grid, Separator } from '@radix-ui/themes';\nimport {\n Mail,\n Phone,\n MessageCircle,\n MapPin,\n Globe,\n Github,\n Linkedin,\n Twitter,\n ExternalLink,\n Star,\n Briefcase,\n Code,\n} from 'lucide-react';\nimport {\n useContactInfo,\n useDeveloperInfo,\n useSocialLinks,\n useAddressInfo,\n useSkills,\n useTestimonials,\n useServices,\n useProjects,\n} from '../../hooks/useCommonFeatures';\nimport type {\n ContactInfo,\n DeveloperInfo,\n SocialLink,\n AddressInfo,\n Skill,\n Testimonial,\n Service,\n Project,\n SocialPlatform,\n} from '../../types/commonFeatures';\n\n// ============================================================================\n// ICONS\n// ============================================================================\n\nconst socialIcons: Record<SocialPlatform, React.ReactNode> = {\n github: <Github size={18} />,\n linkedin: <Linkedin size={18} />,\n twitter: <Twitter size={18} />,\n facebook: <Globe size={18} />,\n instagram: <Globe size={18} />,\n youtube: <Globe size={18} />,\n tiktok: <Globe size={18} />,\n discord: <MessageCircle size={18} />,\n telegram: <MessageCircle size={18} />,\n whatsapp: <MessageCircle size={18} />,\n medium: <Globe size={18} />,\n devto: <Code size={18} />,\n stackoverflow: <Code size={18} />,\n dribbble: <Globe size={18} />,\n behance: <Globe size={18} />,\n codepen: <Code size={18} />,\n npm: <Code size={18} />,\n website: <Globe size={18} />,\n email: <Mail size={18} />,\n other: <ExternalLink size={18} />,\n};\n\n// ============================================================================\n// CONTACT CARD\n// ============================================================================\n\ninterface ContactCardProps {\n data?: ContactInfo | null;\n compact?: boolean;\n showFreelance?: boolean;\n}\n\nexport function ContactCard({ data: propData, compact = false, showFreelance = true }: ContactCardProps) {\n const { data: hookData, loading } = useContactInfo({ autoFetch: !propData });\n const data = propData ?? hookData;\n\n if (loading) return <ContactCardSkeleton />;\n if (!data) return null;\n\n return (\n <Card size={compact ? '1' : '2'}>\n <Flex direction=\"column\" gap=\"3\">\n <Text size=\"3\" weight=\"bold\">Contact</Text>\n\n {showFreelance && data.freelanceAvailable && (\n <Badge color=\"green\" size=\"1\">Available for Freelance</Badge>\n )}\n\n <Flex direction=\"column\" gap=\"2\">\n {data.email && (\n <Link href={`mailto:${data.email}`} size=\"2\">\n <Flex align=\"center\" gap=\"2\">\n <Mail size={16} />\n <Text>{data.email}</Text>\n </Flex>\n </Link>\n )}\n\n {data.phone && (\n <Link href={`tel:${data.phone}`} size=\"2\">\n <Flex align=\"center\" gap=\"2\">\n <Phone size={16} />\n <Text>{data.phone}</Text>\n </Flex>\n </Link>\n )}\n\n {data.whatsapp && (\n <Link href={`https://wa.me/${data.whatsapp.replace(/\\D/g, '')}`} target=\"_blank\" size=\"2\">\n <Flex align=\"center\" gap=\"2\">\n <MessageCircle size={16} />\n <Text>WhatsApp</Text>\n </Flex>\n </Link>\n )}\n </Flex>\n\n {!compact && data.workingHours && (\n <>\n <Separator size=\"4\" />\n <Text size=\"1\" color=\"gray\">{data.workingHours}</Text>\n </>\n )}\n </Flex>\n </Card>\n );\n}\n\nfunction ContactCardSkeleton() {\n return (\n <Card>\n <Flex direction=\"column\" gap=\"3\">\n <Box style={{ height: 20, width: 80, background: 'var(--gray-4)', borderRadius: 4 }} />\n <Box style={{ height: 16, width: 180, background: 'var(--gray-3)', borderRadius: 4 }} />\n <Box style={{ height: 16, width: 120, background: 'var(--gray-3)', borderRadius: 4 }} />\n </Flex>\n </Card>\n );\n}\n\n// ============================================================================\n// DEVELOPER CARD\n// ============================================================================\n\ninterface DeveloperCardProps {\n data?: DeveloperInfo | null;\n compact?: boolean;\n showBio?: boolean;\n}\n\nexport function DeveloperCard({ data: propData, compact = false, showBio = true }: DeveloperCardProps) {\n const { data: hookData, loading } = useDeveloperInfo({ autoFetch: !propData });\n const data = propData ?? hookData;\n\n if (loading) return <DeveloperCardSkeleton />;\n if (!data) return null;\n\n return (\n <Card size={compact ? '1' : '2'}>\n <Flex direction=\"column\" gap=\"3\">\n <Flex align=\"center\" gap=\"3\">\n {data.avatar && (\n <Avatar src={data.avatar} fallback={data.name?.[0] || '?'} size=\"4\" radius=\"full\" />\n )}\n <Box>\n <Text size=\"4\" weight=\"bold\">{data.name}</Text>\n <Text size=\"2\" color=\"gray\">{data.title}</Text>\n </Box>\n </Flex>\n\n {data.availableForHire && (\n <Badge color=\"green\" size=\"1\">Available for Hire</Badge>\n )}\n\n {showBio && !compact && data.bio && (\n <Text size=\"2\" color=\"gray\">{data.shortBio || data.bio}</Text>\n )}\n\n <Flex gap=\"2\" wrap=\"wrap\">\n {data.website && (\n <Link href={data.website} target=\"_blank\" size=\"1\">\n <Flex align=\"center\" gap=\"1\">\n <Globe size={14} />\n Website\n </Flex>\n </Link>\n )}\n {data.github && (\n <Link href={data.github} target=\"_blank\" size=\"1\">\n <Flex align=\"center\" gap=\"1\">\n <Github size={14} />\n GitHub\n </Flex>\n </Link>\n )}\n {data.linkedin && (\n <Link href={data.linkedin} target=\"_blank\" size=\"1\">\n <Flex align=\"center\" gap=\"1\">\n <Linkedin size={14} />\n LinkedIn\n </Flex>\n </Link>\n )}\n </Flex>\n </Flex>\n </Card>\n );\n}\n\nfunction DeveloperCardSkeleton() {\n return (\n <Card>\n <Flex align=\"center\" gap=\"3\">\n <Box style={{ height: 48, width: 48, background: 'var(--gray-4)', borderRadius: '50%' }} />\n <Box>\n <Box style={{ height: 20, width: 120, background: 'var(--gray-4)', borderRadius: 4, marginBottom: 4 }} />\n <Box style={{ height: 16, width: 80, background: 'var(--gray-3)', borderRadius: 4 }} />\n </Box>\n </Flex>\n </Card>\n );\n}\n\n// ============================================================================\n// SOCIAL LINKS BAR\n// ============================================================================\n\ninterface SocialLinksBarProps {\n data?: SocialLink[];\n showIn?: ('footer' | 'contact' | 'about' | 'header')[];\n gap?: '1' | '2' | '3' | '4';\n}\n\nexport function SocialLinksBar({ data: propData, showIn, gap = '3' }: SocialLinksBarProps) {\n const { data: hookData, loading } = useSocialLinks({ autoFetch: !propData, showIn });\n const data = propData ?? hookData;\n\n if (loading || data.length === 0) return null;\n\n return (\n <Flex gap={gap} align=\"center\" wrap=\"wrap\">\n {data.map((link) => (\n <Link\n key={link.id}\n href={link.url}\n target=\"_blank\"\n title={link.displayName || link.platform}\n style={{ color: 'inherit' }}\n >\n {socialIcons[link.platform]}\n </Link>\n ))}\n </Flex>\n );\n}\n\n// ============================================================================\n// ADDRESS CARD\n// ============================================================================\n\ninterface AddressCardProps {\n data?: AddressInfo | null;\n compact?: boolean;\n}\n\nexport function AddressCard({ data: propData, compact = false }: AddressCardProps) {\n const { data: hookData, loading } = useAddressInfo({ autoFetch: !propData });\n const data = propData ?? hookData;\n\n if (loading || !data) return null;\n\n const address = data.fullAddress || [data.streetAddress, data.city, data.state, data.country].filter(Boolean).join(', ');\n\n return (\n <Card size={compact ? '1' : '2'}>\n <Flex align=\"start\" gap=\"2\">\n <MapPin size={18} style={{ flexShrink: 0, marginTop: 2 }} />\n <Box>\n {data.label && <Text size=\"2\" weight=\"bold\">{data.label}</Text>}\n <Text size=\"2\" color=\"gray\">{address}</Text>\n {data.googleMapsUrl && (\n <Link href={data.googleMapsUrl} target=\"_blank\" size=\"1\">\n View on Maps\n </Link>\n )}\n </Box>\n </Flex>\n </Card>\n );\n}\n\n// ============================================================================\n// SKILLS DISPLAY\n// ============================================================================\n\ninterface SkillsDisplayProps {\n data?: Skill[];\n featuredOnly?: boolean;\n showLevel?: boolean;\n maxItems?: number;\n}\n\nexport function SkillsDisplay({ data: propData, featuredOnly = false, showLevel = true, maxItems }: SkillsDisplayProps) {\n const { data: hookData, loading } = useSkills({ autoFetch: !propData, featuredOnly });\n let data = propData ?? hookData;\n\n if (maxItems && data.length > maxItems) {\n data = data.slice(0, maxItems);\n }\n\n if (loading || data.length === 0) return null;\n\n const levelColors: Record<string, 'gray' | 'blue' | 'green' | 'orange'> = {\n beginner: 'gray',\n intermediate: 'blue',\n advanced: 'green',\n expert: 'orange',\n };\n\n return (\n <Flex gap=\"2\" wrap=\"wrap\">\n {data.map((skill) => (\n <Badge key={skill.id} color={showLevel ? levelColors[skill.level] : undefined} size=\"2\">\n {skill.name}\n </Badge>\n ))}\n </Flex>\n );\n}\n\n// ============================================================================\n// TESTIMONIALS CAROUSEL (Simple Grid)\n// ============================================================================\n\ninterface TestimonialsGridProps {\n data?: Testimonial[];\n featuredOnly?: boolean;\n maxItems?: number;\n columns?: '1' | '2' | '3';\n}\n\nexport function TestimonialsGrid({ data: propData, featuredOnly = false, maxItems, columns = '2' }: TestimonialsGridProps) {\n const { data: hookData, loading } = useTestimonials({ autoFetch: !propData, featuredOnly, limit: maxItems });\n const data = propData ?? hookData;\n\n if (loading || data.length === 0) return null;\n\n return (\n <Grid columns={columns} gap=\"4\">\n {data.map((testimonial) => (\n <Card key={testimonial.id}>\n <Flex direction=\"column\" gap=\"3\">\n {testimonial.rating && (\n <Flex gap=\"1\">\n {Array.from({ length: testimonial.rating }).map((_, i) => (\n <Star key={i} size={14} fill=\"var(--amber-9)\" color=\"var(--amber-9)\" />\n ))}\n </Flex>\n )}\n\n <Text size=\"2\" style={{ fontStyle: 'italic' }}>\n \"{testimonial.shortContent || testimonial.content}\"\n </Text>\n\n <Flex align=\"center\" gap=\"2\">\n {testimonial.authorAvatar && (\n <Avatar src={testimonial.authorAvatar} fallback={testimonial.authorName?.[0] || '?'} size=\"2\" radius=\"full\" />\n )}\n <Box>\n <Text size=\"2\" weight=\"bold\">{testimonial.authorName}</Text>\n {(testimonial.authorTitle || testimonial.authorCompany) && (\n <Text size=\"1\" color=\"gray\">\n {[testimonial.authorTitle, testimonial.authorCompany].filter(Boolean).join(' at ')}\n </Text>\n )}\n </Box>\n </Flex>\n </Flex>\n </Card>\n ))}\n </Grid>\n );\n}\n\n// ============================================================================\n// SERVICES GRID\n// ============================================================================\n\ninterface ServicesGridProps {\n data?: Service[];\n featuredOnly?: boolean;\n maxItems?: number;\n columns?: '1' | '2' | '3';\n}\n\nexport function ServicesGrid({ data: propData, featuredOnly = false, maxItems, columns = '3' }: ServicesGridProps) {\n const { data: hookData, loading } = useServices({ autoFetch: !propData, featuredOnly });\n let data = propData ?? hookData;\n\n if (maxItems && data.length > maxItems) {\n data = data.slice(0, maxItems);\n }\n\n if (loading || data.length === 0) return null;\n\n return (\n <Grid columns={columns} gap=\"4\">\n {data.map((service) => (\n <Card key={service.id}>\n <Flex direction=\"column\" gap=\"2\">\n <Flex align=\"center\" gap=\"2\">\n <Briefcase size={18} />\n <Text size=\"3\" weight=\"bold\">{service.title}</Text>\n </Flex>\n\n <Text size=\"2\" color=\"gray\">\n {service.shortDescription || service.description}\n </Text>\n\n {service.technologies && service.technologies.length > 0 && (\n <Flex gap=\"1\" wrap=\"wrap\">\n {service.technologies.slice(0, 5).map((tech, i) => (\n <Badge key={i} size=\"1\" color=\"gray\">{tech}</Badge>\n ))}\n </Flex>\n )}\n </Flex>\n </Card>\n ))}\n </Grid>\n );\n}\n\n// ============================================================================\n// PROJECTS GRID\n// ============================================================================\n\ninterface ProjectsGridProps {\n data?: Project[];\n featuredOnly?: boolean;\n maxItems?: number;\n columns?: '1' | '2' | '3';\n}\n\nexport function ProjectsGrid({ data: propData, featuredOnly = false, maxItems, columns = '3' }: ProjectsGridProps) {\n const { data: hookData, loading } = useProjects({ autoFetch: !propData, featuredOnly });\n let data = propData ?? hookData;\n\n if (maxItems && data.length > maxItems) {\n data = data.slice(0, maxItems);\n }\n\n if (loading || data.length === 0) return null;\n\n return (\n <Grid columns={columns} gap=\"4\">\n {data.map((project) => (\n <Card key={project.id}>\n <Flex direction=\"column\" gap=\"2\">\n {project.thumbnailUrl && (\n <Box\n style={{\n height: 140,\n borderRadius: 'var(--radius-2)',\n overflow: 'hidden',\n marginBottom: 'var(--space-2)',\n }}\n >\n <img\n src={project.thumbnailUrl}\n alt={project.title}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n </Box>\n )}\n\n <Flex align=\"center\" gap=\"2\">\n <Code size={18} />\n <Text size=\"3\" weight=\"bold\">{project.title}</Text>\n </Flex>\n\n <Text size=\"2\" color=\"gray\">\n {project.shortDescription || project.description}\n </Text>\n\n {project.technologies && project.technologies.length > 0 && (\n <Flex gap=\"1\" wrap=\"wrap\">\n {project.technologies.slice(0, 5).map((tech, i) => (\n <Badge key={i} size=\"1\" color=\"gray\">{tech}</Badge>\n ))}\n </Flex>\n )}\n\n {project.links && project.links.length > 0 && (\n <Flex gap=\"2\" mt=\"2\">\n {project.links.map((link, i) => (\n <Link key={i} href={link.url} target=\"_blank\" size=\"1\">\n {link.label || link.type}\n </Link>\n ))}\n </Flex>\n )}\n </Flex>\n </Card>\n ))}\n </Grid>\n );\n}\n\n// ============================================================================\n// COMBINED FOOTER SECTION\n// ============================================================================\n\ninterface FooterSectionProps {\n showContact?: boolean;\n showSocialLinks?: boolean;\n showAddress?: boolean;\n}\n\nexport function FooterSection({ showContact = true, showSocialLinks = true, showAddress = false }: FooterSectionProps) {\n return (\n <Flex direction=\"column\" gap=\"4\" align=\"center\">\n {showSocialLinks && <SocialLinksBar showIn={['footer']} />}\n\n <Flex gap=\"4\" wrap=\"wrap\" justify=\"center\">\n {showContact && <ContactCard compact />}\n {showAddress && <AddressCard compact />}\n </Flex>\n </Flex>\n );\n}\n"],"names":["useCampaign","useRef","useEffect","jsxs","Box","jsx","IconButton","Cross2Icon","Flex","Text","Button","getDisplayValues","Card","Link","ExternalLink","X","Badge","Check","Sparkles","useCallback","useState","useOneTimeAdModal","isInitialized","getConfig","Dialog","Gift","Heading","Checkbox","Grid","Quote","Play","useUpdateAdModal","useCampaigns","Fragment","ChevronLeft","ChevronRight","campaign","Container","Star","ArrowRight","Info","CheckCircle","AlertTriangle","AlertCircle","Megaphone","Bell","Github","Linkedin","Twitter","Globe","MessageCircle","Code","Mail","useContactInfo","Phone","Separator","useDeveloperInfo","Avatar","useSocialLinks","useAddressInfo","MapPin","useSkills","useTestimonials","useServices","Briefcase"],"mappings":"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"}