shared-features 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ads/AdCarousel.d.ts +1 -1
- package/dist/components/ads/AdCarousel.d.ts.map +1 -1
- package/dist/components/ads/TopbarAdBanner.d.ts +1 -1
- package/dist/components/ads/TopbarAdBanner.d.ts.map +1 -1
- package/dist/components/index.cjs +1 -1
- package/dist/components/index.js +1 -1
- package/dist/{index-gXNz1Cox.js → index-BLOPy0iz.js} +616 -245
- package/dist/index-BLOPy0iz.js.map +1 -0
- package/dist/{index--8iNqKw6.cjs → index-CyHJYPl1.cjs} +614 -243
- package/dist/index-CyHJYPl1.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/index--8iNqKw6.cjs.map +0 -1
- package/dist/index-gXNz1Cox.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CyHJYPl1.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'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'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, 100px max height promotional banner for the very top of the site.\n * Displays ads in a carousel with 20 second rotation.\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, Sparkles } 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 (100px 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 trackedImpressions = useRef<Set<string>>(new Set());\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\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\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 timerRef.current = 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 () => {\n if (timerRef.current) clearInterval(timerRef.current);\n };\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 // 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 return (\n <Box\n className={className}\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: 100,\n maxHeight: 100,\n overflow: 'hidden',\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: '4' }}\n style={{\n height: '100%',\n padding: '0 16px',\n }}\n >\n {/* Left: Sparkle icon + Navigation arrows (desktop) */}\n <Flex gap=\"2\" align=\"center\" style={{ flexShrink: 0 }}>\n <Box\n style={{\n width: 28,\n height: 28,\n borderRadius: 6,\n background: `${displayColor}20`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Sparkles size={14} color={displayColor} />\n </Box>\n {campaigns.length > 1 && (\n <Box display={{ initial: 'none', md: 'block' }}>\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={16} />\n </IconButton>\n </Box>\n )}\n </Flex>\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(-8px)' : 'translateY(0)',\n transition: 'all 0.25s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n >\n {/* Icon */}\n <Box\n style={{\n width: 48,\n height: 48,\n borderRadius: 10,\n background: `linear-gradient(135deg, ${displayColor}25 0%, ${displayColor}15 100%)`,\n border: `1.5px solid ${displayColor}35`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n boxShadow: `0 2px 8px ${displayColor}20`,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n />\n\n {/* Text */}\n <Flex direction=\"column\" gap=\"0\" style={{ minWidth: 0, flex: 1 }}>\n <Text size=\"2\" weight=\"bold\" style={{ lineHeight: 1.3 }}>\n {displayTitle}\n </Text>\n <Text\n size=\"1\"\n color=\"gray\"\n style={{\n display: '-webkit-box',\n WebkitLineClamp: 1,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n lineHeight: 1.4,\n }}\n >\n {displayTagline}\n </Text>\n </Flex>\n\n {/* CTA Button */}\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 fontSize: '13px',\n padding: '0 16px',\n height: 32,\n flexShrink: 0,\n boxShadow: `0 2px 8px ${displayColor}40`,\n border: 'none',\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n {displayCta}\n <ExternalLink size={13} />\n </span>\n </Button>\n </Flex>\n\n {/* Right: Navigation + Dismiss */}\n <Flex gap=\"1\" align=\"center\" style={{ flexShrink: 0 }}>\n {campaigns.length > 1 && (\n <>\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={16} />\n </IconButton>\n </Box>\n {/* Slide indicators (desktop) */}\n <Flex gap=\"1\" mx=\"2\" display={{ initial: 'none', sm: 'flex' }}>\n {campaigns.map((_, i) => (\n <Box\n key={i}\n style={{\n width: i === currentIndex ? 16 : 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 </>\n )}\n <IconButton\n size=\"1\"\n variant=\"soft\"\n color=\"gray\"\n onClick={handleDismiss}\n style={{ cursor: 'pointer', marginLeft: 4 }}\n aria-label=\"Close banner\"\n >\n <X size={14} />\n </IconButton>\n </Flex>\n </Flex>\n </Container>\n\n {/* Mobile progress dots */}\n {campaigns.length > 1 && (\n <Flex\n justify=\"center\"\n gap=\"1\"\n style={{\n position: 'absolute',\n bottom: 6,\n left: 0,\n right: 0,\n }}\n display={{ initial: 'flex', sm: 'none' }}\n >\n {campaigns.map((_, i) => (\n <Box\n key={i}\n style={{\n width: 6,\n height: 6,\n borderRadius: '50%',\n background: i === currentIndex ? displayColor : 'var(--gray-a5)',\n transition: 'background 0.2s ease',\n }}\n />\n ))}\n </Flex>\n )}\n </Box>\n );\n}\n\nexport default TopbarAdBanner;\n","/**\n * AdCarousel Component\n *\n * A premium carousel slider for displaying ads after hero/title sections.\n * Height: 350px with rich content display.\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, Badge, Card, IconButton, Container } from '@radix-ui/themes';\nimport { ExternalLink, ChevronLeft, ChevronRight, Check, Star, Zap, 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 - Premium slider for after hero sections (350px 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 trackedImpressions = useRef<Set<string>>(new Set());\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\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\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 timerRef.current = 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 }, 250);\n }\n }, progressInterval);\n\n return () => {\n if (timerRef.current) clearInterval(timerRef.current);\n };\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 // 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 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 const displayDescription = product.description || displayTagline;\n\n const getProductTypeLabel = () => {\n switch (product.type) {\n case 'extension': return 'Browser Extension';\n case 'android': return 'Android App';\n case 'ios': return 'iOS App';\n case 'web': return 'Web App';\n default: return 'App';\n }\n };\n\n return (\n <Box\n className={className}\n style={{\n padding: '24px 0',\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: 16,\n overflow: 'hidden',\n height: 350,\n position: 'relative',\n }}\n >\n {/* Decorative background elements */}\n <Box\n style={{\n position: 'absolute',\n top: -100,\n right: -100,\n width: 300,\n height: 300,\n borderRadius: '50%',\n background: `radial-gradient(circle, ${displayColor}12 0%, transparent 70%)`,\n pointerEvents: 'none',\n }}\n />\n <Box\n style={{\n position: 'absolute',\n bottom: -50,\n left: -50,\n width: 200,\n height: 200,\n borderRadius: '50%',\n background: `radial-gradient(circle, ${displayColor}08 0%, transparent 70%)`,\n pointerEvents: 'none',\n }}\n />\n\n {/* Progress bar at top */}\n {campaigns.length > 1 && (\n <Box style={{ height: 4, 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 12px ${displayColor}50`,\n }}\n />\n </Box>\n )}\n\n {/* Main content */}\n <Box style={{ height: 'calc(100% - 4px)', position: 'relative', zIndex: 1 }}>\n <Flex\n direction={{ initial: 'column', md: 'row' }}\n align=\"stretch\"\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: 60, flexShrink: 0 }}\n display={{ initial: 'none', md: 'flex' }}\n >\n <IconButton\n size=\"3\"\n variant=\"ghost\"\n color=\"gray\"\n onClick={goToPrev}\n style={{\n cursor: 'pointer',\n width: 44,\n height: 44,\n borderRadius: 12,\n background: 'var(--gray-a3)',\n }}\n aria-label=\"Previous\"\n >\n <ChevronLeft size={24} />\n </IconButton>\n </Flex>\n )}\n\n {/* Content area */}\n <Flex\n direction={{ initial: 'column', md: 'row' }}\n align=\"center\"\n gap={{ initial: '4', md: '6' }}\n p={{ initial: '4', md: '5' }}\n style={{\n flex: 1,\n opacity: isAnimating ? 0 : 1,\n transform: isAnimating ? 'translateX(-20px) scale(0.98)' : 'translateX(0) scale(1)',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n >\n {/* Icon/Logo */}\n <Flex\n direction=\"column\"\n align=\"center\"\n gap=\"3\"\n style={{ flexShrink: 0 }}\n >\n <Box\n style={{\n width: 100,\n height: 100,\n borderRadius: 20,\n background: `linear-gradient(145deg, ${displayColor}20 0%, ${displayColor}10 100%)`,\n border: `2px solid ${displayColor}30`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: `0 8px 32px ${displayColor}20, inset 0 1px 0 ${displayColor}20`,\n }}\n dangerouslySetInnerHTML={{ __html: displayIcon }}\n />\n {/* Product type badge */}\n <Badge\n size=\"2\"\n style={{\n background: `${displayColor}15`,\n color: displayColor,\n fontWeight: 600,\n padding: '4px 12px',\n }}\n >\n <Zap size={12} style={{ marginRight: 4 }} />\n {getProductTypeLabel()}\n </Badge>\n </Flex>\n\n {/* Text content */}\n <Flex\n direction=\"column\"\n gap=\"3\"\n style={{ flex: 1, minWidth: 0, textAlign: 'left' }}\n >\n {/* Title with star */}\n <Flex align=\"center\" gap=\"2\" wrap=\"wrap\">\n <Text\n size={{ initial: '5', md: '6' }}\n weight=\"bold\"\n style={{ lineHeight: 1.2 }}\n >\n {displayTitle}\n </Text>\n <Flex\n align=\"center\"\n gap=\"1\"\n style={{\n background: `${displayColor}15`,\n padding: '4px 8px',\n borderRadius: 6,\n }}\n >\n <Star size={12} fill={displayColor} color={displayColor} />\n <Text size=\"1\" weight=\"medium\" style={{ color: displayColor }}>\n Featured\n </Text>\n </Flex>\n </Flex>\n\n {/* Tagline */}\n <Text\n size={{ initial: '2', md: '3' }}\n color=\"gray\"\n style={{\n lineHeight: 1.5,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {displayDescription}\n </Text>\n\n {/* Features grid */}\n {displayFeatures.length > 0 && (\n <Flex\n gap={{ initial: '2', md: '4' }}\n wrap=\"wrap\"\n mt=\"1\"\n >\n {displayFeatures.slice(0, 4).map((feature, i) => (\n <Flex\n key={i}\n align=\"center\"\n gap=\"2\"\n style={{\n background: 'var(--gray-a3)',\n padding: '6px 12px',\n borderRadius: 8,\n }}\n >\n <Box\n style={{\n width: 18,\n height: 18,\n borderRadius: 4,\n background: `${displayColor}20`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Check size={12} color={displayColor} strokeWidth={3} />\n </Box>\n <Text size=\"1\" weight=\"medium\">\n {feature}\n </Text>\n </Flex>\n ))}\n </Flex>\n )}\n\n {/* CTA Section */}\n <Flex\n gap=\"3\"\n align=\"center\"\n mt={{ initial: '2', md: '3' }}\n wrap=\"wrap\"\n >\n <Button\n size={{ initial: '2', md: '3' }}\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 24px',\n height: 44,\n boxShadow: `0 4px 16px ${displayColor}40`,\n border: 'none',\n cursor: 'pointer',\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {displayCta}\n <ArrowRight size={18} />\n </span>\n </Button>\n <Button\n size={{ initial: '2', md: '3' }}\n variant=\"ghost\"\n onClick={() => handleClick(campaign)}\n style={{\n color: displayColor,\n fontWeight: 500,\n cursor: 'pointer',\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n View Details\n <ExternalLink size={14} />\n </span>\n </Button>\n </Flex>\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: 60, flexShrink: 0 }}\n display={{ initial: 'none', md: 'flex' }}\n >\n <IconButton\n size=\"3\"\n variant=\"ghost\"\n color=\"gray\"\n onClick={goToNext}\n style={{\n cursor: 'pointer',\n width: 44,\n height: 44,\n borderRadius: 12,\n background: 'var(--gray-a3)',\n }}\n aria-label=\"Next\"\n >\n <ChevronRight size={24} />\n </IconButton>\n </Flex>\n )}\n </Flex>\n\n {/* Bottom navigation */}\n {campaigns.length > 1 && (\n <Flex\n justify=\"center\"\n align=\"center\"\n gap=\"3\"\n style={{\n position: 'absolute',\n bottom: 16,\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={16} />\n </IconButton>\n </Box>\n\n {/* Slide indicators */}\n <Flex gap=\"2\">\n {campaigns.map((c, i) => (\n <Box\n key={i}\n onClick={() => goToSlide(i)}\n style={{\n width: i === currentIndex ? 32 : 10,\n height: 10,\n borderRadius: 5,\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.3s cubic-bezier(0.4, 0, 0.2, 1)',\n boxShadow: i === currentIndex ? `0 2px 8px ${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={16} />\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","Zap","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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"}
|
package/dist/index.cjs
CHANGED
|
@@ -7,7 +7,7 @@ const broadcasts = require("./broadcasts-DZsQNd4R.cjs");
|
|
|
7
7
|
const adminCommonFeatures = require("./admin-commonFeatures-pnaXeix_.cjs");
|
|
8
8
|
const useCommonFeatures = require("./useCommonFeatures-CWqe4EhH.cjs");
|
|
9
9
|
const useFeatureFlags = require("./useFeatureFlags-9_E7gair.cjs");
|
|
10
|
-
const index = require("./index
|
|
10
|
+
const index = require("./index-CyHJYPl1.cjs");
|
|
11
11
|
const useNotificationEvents = require("./useNotificationEvents-BXeMqdak.cjs");
|
|
12
12
|
exports.checkFeatureAvailability = commonFeatures.checkFeatureAvailability;
|
|
13
13
|
exports.clearAddressInfoCache = commonFeatures.clearAddressInfoCache;
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { c as c3, a as a3, d as d3, f as f3, b as b3, e as e3, g as g3, i as i3,
|
|
|
5
5
|
import { a as a4, c as c4, b as b4, d as d4, e as e4, f as f4, g as g4, h as h4, i as i4, j as j4, k as k3, l as l2, m as m2, n as n2, o as o2, p as p2, q as q2, r as r3, s as s4, t as t3, u as u2, v as v2, w as w2, x as x2, y as y2, z as z2, A as A2, B as B2, C as C3, D as D3, E as E2, F as F3, G as G2, H as H2, I as I2, J as J2, K as K2, L as L2, M as M2, N as N2, O as O2, P as P3 } from "./admin-commonFeatures-CFhvjgp9.js";
|
|
6
6
|
import { u as u3, a as a5, b as b5, c as c5, d as d5, e as e5, f as f5, g as g5, h as h5, i as i5, j as j5, k as k4, l as l3, m as m3 } from "./useCommonFeatures-CnmI83Er.js";
|
|
7
7
|
import { u as u4, a as a6, b as b6, c as c6, d as d6, e as e6, f as f6, g as g6, h as h6, i as i6, j as j6, k as k5 } from "./useFeatureFlags-DhIb0HYi.js";
|
|
8
|
-
import { A as A3, a as a7, b as b7, c as c7, d as d7, e as e7, f as f7, g as g7, B as B3, h as h7, C as C4, i as i7, j as j7, D as D4, F as F4, k as k6, l as l4, G as G3, H as H3, L as L3, M as M3, S as S3, m as m4, n as n3, o as o3, T as T2, p as p3, q as q3, r as r4, V as V2, s as s5, t as t4 } from "./index-
|
|
8
|
+
import { A as A3, a as a7, b as b7, c as c7, d as d7, e as e7, f as f7, g as g7, B as B3, h as h7, C as C4, i as i7, j as j7, D as D4, F as F4, k as k6, l as l4, G as G3, H as H3, L as L3, M as M3, S as S3, m as m4, n as n3, o as o3, T as T2, p as p3, q as q3, r as r4, V as V2, s as s5, t as t4 } from "./index-BLOPy0iz.js";
|
|
9
9
|
import { A as A4, a as a8, b as b8, P as P4, R as R2, S as S4, c as c8, d as d8, e as e8, f as f8, g as g8, h as h8, i as i8, j as j8, k as k7, l as l5, m as m5, n as n4, r as r5, u as u5, v as v3 } from "./useNotificationEvents-DAmR7FYF.js";
|
|
10
10
|
export {
|
|
11
11
|
A4 as ACCOUNT_TEMPLATES,
|