@salesmind-ai/design-system 0.3.11 → 0.3.12
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/admin/index.css +3 -3
- package/dist/admin/index.css.map +1 -1
- package/dist/{chunk-KNQEIU7O.cjs → chunk-C4XSNMRU.cjs} +8 -4
- package/dist/chunk-C4XSNMRU.cjs.map +1 -0
- package/dist/{chunk-KVGSVGRK.cjs → chunk-D2RHF2OE.cjs} +2 -2
- package/dist/chunk-D2RHF2OE.cjs.map +1 -0
- package/dist/{chunk-IFRATNLU.js → chunk-DMRQPGQA.js} +2 -2
- package/dist/chunk-DMRQPGQA.js.map +1 -0
- package/dist/{chunk-B23AGGYI.cjs → chunk-GQELL2MF.cjs} +2 -7
- package/dist/chunk-GQELL2MF.cjs.map +1 -0
- package/dist/{chunk-W2WTP6HS.cjs → chunk-HCZW5AJN.cjs} +4 -3
- package/dist/chunk-HCZW5AJN.cjs.map +1 -0
- package/dist/{chunk-T343CCH5.js → chunk-KE7T2HQC.js} +8 -4
- package/dist/chunk-KE7T2HQC.js.map +1 -0
- package/dist/{chunk-OGKGIXFC.cjs → chunk-KR6T7N7W.cjs} +26 -25
- package/dist/chunk-KR6T7N7W.cjs.map +1 -0
- package/dist/{chunk-UIPEIRGT.js → chunk-QALDZ7WQ.js} +2 -7
- package/dist/chunk-QALDZ7WQ.js.map +1 -0
- package/dist/{chunk-HRENHNDJ.js → chunk-TCFC7XTB.js} +4 -3
- package/dist/chunk-TCFC7XTB.js.map +1 -0
- package/dist/{chunk-GEZDSEPV.cjs → chunk-UTVXGAQP.cjs} +5 -5
- package/dist/{chunk-U3LK2GID.js → chunk-WN626YNO.js} +4 -3
- package/dist/chunk-WN626YNO.js.map +1 -0
- package/dist/{chunk-MBRCWMAZ.js → chunk-XPTVHPCN.js} +2 -2
- package/dist/core/index.cjs +128 -128
- package/dist/core/index.css +3 -1
- package/dist/core/index.css.map +1 -1
- package/dist/core/index.d.cts +5 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.js +2 -2
- package/dist/index.cjs +186 -186
- package/dist/index.css +47 -20
- package/dist/index.css.map +1 -1
- package/dist/index.js +5 -5
- package/dist/marketing/index.cjs +36 -36
- package/dist/marketing/index.css +3 -0
- package/dist/marketing/index.css.map +1 -1
- package/dist/marketing/index.js +2 -2
- package/dist/motion/index.cjs +7 -7
- package/dist/motion/index.d.cts +1 -1
- package/dist/motion/index.d.ts +1 -1
- package/dist/motion/index.js +1 -1
- package/dist/nav/index.cjs +16 -16
- package/dist/nav/index.css +3 -3
- package/dist/nav/index.css.map +1 -1
- package/dist/nav/index.js +1 -1
- package/dist/social-proof/index.css +28 -6
- package/dist/social-proof/index.css.map +1 -1
- package/dist/styles/styles.css +10 -10
- package/dist/theme/index.css +7 -7
- package/dist/theme/index.css.map +1 -1
- package/dist/web/index.cjs +7 -7
- package/dist/web/index.js +1 -1
- package/dist/web/server/index.cjs +7 -7
- package/dist/web/server/index.d.cts +4 -3
- package/dist/web/server/index.d.ts +4 -3
- package/dist/web/server/index.js +1 -1
- package/package.json +16 -1
- package/dist/chunk-B23AGGYI.cjs.map +0 -1
- package/dist/chunk-HRENHNDJ.js.map +0 -1
- package/dist/chunk-IFRATNLU.js.map +0 -1
- package/dist/chunk-KNQEIU7O.cjs.map +0 -1
- package/dist/chunk-KVGSVGRK.cjs.map +0 -1
- package/dist/chunk-OGKGIXFC.cjs.map +0 -1
- package/dist/chunk-T343CCH5.js.map +0 -1
- package/dist/chunk-U3LK2GID.js.map +0 -1
- package/dist/chunk-UIPEIRGT.js.map +0 -1
- package/dist/chunk-W2WTP6HS.cjs.map +0 -1
- /package/dist/{chunk-GEZDSEPV.cjs.map → chunk-UTVXGAQP.cjs.map} +0 -0
- /package/dist/{chunk-MBRCWMAZ.js.map → chunk-XPTVHPCN.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Navbar/NavbarMobileHelpers.tsx","../src/components/Navbar/NavbarMegaMenu.tsx","../src/components/NavbarV2/NavbarV2.tsx","../src/components/SiteFooter/SiteFooter.tsx","../src/components/LocaleDropdown/LocaleDropdown.tsx","../src/components/OutboundLink/MDXOutboundLink.tsx"],"names":["forwardRef","clsx","jsx","useState","useRef","useEffect","useCallback","jsxs","ChevronDown","focusable","useId"],"mappings":"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","sourcesContent":["import React, { forwardRef, HTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport './Navbar.css';\n\n/* ============================================================================\n Mobile Menu Helpers — shared by NavbarV2 consumers\n ============================================================================\n These lightweight presentational components are used inside mobile menu\n overlays. They were originally part of Navbar V1 but are framework-agnostic\n and continue to be consumed by NavbarV2-based layouts.\n ============================================================================ */\n\nexport interface NavbarMobileNavItemProps extends HTMLAttributes<HTMLElement> {\n as?: React.ElementType;\n active?: boolean;\n href?: string;\n}\n\n/** Full-width touch-friendly nav item for the mobile menu. */\nexport const NavbarMobileNavItem = forwardRef<HTMLElement, NavbarMobileNavItemProps>(\n ({ as: Component = 'a', className, active, children, ...props }, ref) => (\n <Component\n ref={ref}\n className={clsx(\n 'ds-navbar__mobile-nav-item',\n active && 'ds-navbar__mobile-nav-item--active',\n className,\n )}\n aria-current={active ? 'page' : undefined}\n {...props}\n >\n {children}\n </Component>\n ),\n);\nNavbarMobileNavItem.displayName = 'NavbarMobileNavItem';\n\n/** Visual separator line inside the mobile menu. */\nexport function NavbarMobileSeparator({ className }: { className?: string }) {\n return <div className={clsx('ds-navbar__mobile-separator', className)} role=\"separator\" />;\n}\nNavbarMobileSeparator.displayName = 'NavbarMobileSeparator';\n\n/** Actions group at the bottom of the mobile menu (CTAs, auth). */\nexport const NavbarMobileActions = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={clsx('ds-navbar__mobile-actions', className)} {...props}>\n {children}\n </div>\n ),\n);\nNavbarMobileActions.displayName = 'NavbarMobileActions';\n","import React, { forwardRef, useState, useRef, useEffect, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { Container } from '../LayoutPrimitives';\nimport './NavbarMegaMenu.css';\n\n/* ============================================================================\n Icons\n ============================================================================ */\n\nconst ChevronDown = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/* ============================================================================\n NavbarMegaMenu\n ============================================================================ */\n\nexport interface NavbarMegaMenuProps {\n /** The text or element that toggles the menu */\n trigger: React.ReactNode;\n /** The content to display inside the mega menu */\n children: React.ReactNode;\n /** Optional class name */\n className?: string;\n /** Whether the menu is controlled */\n isOpen?: boolean;\n /** Change handler for controlled state */\n onOpenChange?: (isOpen: boolean) => void;\n /** Presentation style of the menu */\n variant?: 'fullWidth' | 'floating';\n}\n\nexport const NavbarMegaMenu = forwardRef<HTMLDivElement, NavbarMegaMenuProps>(\n (\n { trigger, children, className, isOpen: controlledOpen, onOpenChange, variant = 'fullWidth' },\n ref,\n ) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const timeoutRef = useRef<number | null>(null);\n\n const handleOpen = useCallback(() => {\n const newState = true;\n if (isOpen !== newState) {\n if (!isControlled) setInternalOpen(newState);\n onOpenChange?.(newState);\n }\n }, [isOpen, isControlled, onOpenChange]);\n\n const handleClose = useCallback(() => {\n const newState = false;\n if (isOpen !== newState) {\n if (!isControlled) setInternalOpen(newState);\n onOpenChange?.(newState);\n }\n }, [isOpen, isControlled, onOpenChange]);\n\n const handleToggle = useCallback(() => {\n if (isOpen) {\n handleClose();\n } else {\n handleOpen();\n }\n }, [isOpen, handleClose, handleOpen]);\n\n const handleMouseEnter = useCallback(() => {\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n handleOpen();\n }, [handleOpen]);\n\n const handleMouseLeave = useCallback(() => {\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n }\n timeoutRef.current = window.setTimeout(() => {\n handleClose();\n }, 150);\n }, [handleClose]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) window.clearTimeout(timeoutRef.current);\n };\n }, []);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node) &&\n triggerRef.current &&\n !triggerRef.current.contains(event.target as Node)\n ) {\n handleClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, handleClose]);\n\n // Close on Escape key\n useEffect(() => {\n if (!isOpen) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleClose();\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, handleClose]);\n\n return (\n <div\n className={clsx('ds-navbar-mega-menu', `ds-navbar-mega-menu--${variant}`, className)}\n ref={ref}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <button\n ref={triggerRef}\n className=\"ds-navbar-mega-menu__trigger\"\n onClick={handleToggle}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n >\n {trigger}\n <span\n className=\"ds-navbar-mega-menu__chevron\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n <ChevronDown />\n </span>\n </button>\n\n {/* Content panel — always mounted, CSS transitions handle show/hide */}\n <div ref={containerRef}>\n <div\n className={clsx(\n 'ds-navbar-mega-menu__content',\n `ds-navbar-mega-menu__content--${variant}`,\n )}\n data-state={isOpen ? 'open' : 'closed'}\n >\n {variant === 'fullWidth' ? <Container>{children}</Container> : children}\n </div>\n </div>\n </div>\n );\n },\n);\n\nNavbarMegaMenu.displayName = 'NavbarMegaMenu';\n\n/* ============================================================================\n NavbarMegaMenuSection — Column with heading\n ============================================================================ */\n\nexport interface NavbarMegaMenuSectionProps {\n /** Section heading */\n heading?: string;\n /** Section children (NavbarMegaMenuItems) */\n children: React.ReactNode;\n /** Optional class name */\n className?: string;\n}\n\nexport function NavbarMegaMenuSection({ heading, children, className }: NavbarMegaMenuSectionProps) {\n return (\n <div className={clsx('ds-navbar-mega-menu__section', className)}>\n {heading && <p className=\"ds-navbar-mega-menu__section-heading\">{heading}</p>}\n <div className=\"ds-navbar-mega-menu__section-items\">{children}</div>\n </div>\n );\n}\n\nNavbarMegaMenuSection.displayName = 'NavbarMegaMenuSection';\n\n/* ============================================================================\n NavbarMegaMenuItem — Link with icon, label, description\n ============================================================================ */\n\nexport interface NavbarMegaMenuItemProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Icon element (e.g. lucide-react icon) */\n icon?: React.ReactNode;\n /** Item label */\n label: string;\n /** Optional description */\n description?: string;\n /** Render as custom element (for Next.js Link) */\n as?: React.ElementType;\n /** Whether this item represents the current page */\n active?: boolean;\n}\n\nexport const NavbarMegaMenuItem = forwardRef<HTMLAnchorElement, NavbarMegaMenuItemProps>(\n ({ icon, label, description, className, as: Comp = 'a', active, ...rest }, ref) => {\n return (\n <div className=\"ds-navbar-mega-menu__item-wrapper\">\n <Comp\n ref={ref}\n className={clsx('ds-navbar-mega-menu__item', active && 'ds-navbar-mega-menu__item--active', className)}\n aria-current={active ? 'page' : undefined}\n {...rest}\n >\n {icon && <span className=\"ds-navbar-mega-menu__item-icon\">{icon}</span>}\n <span className=\"ds-navbar-mega-menu__item-text\">\n <span className=\"ds-navbar-mega-menu__item-label\">{label}</span>\n {description && (\n <span className=\"ds-navbar-mega-menu__item-description\">{description}</span>\n )}\n </span>\n </Comp>\n </div>\n );\n },\n);\n\nNavbarMegaMenuItem.displayName = 'NavbarMegaMenuItem';\n","import React, {\n forwardRef,\n useState,\n useRef,\n useEffect,\n useCallback,\n useContext,\n createContext,\n useMemo,\n useId,\n} from 'react';\nimport clsx from 'clsx';\nimport './NavbarV2.css';\n\n/* ============================================================================\n Icons\n ============================================================================ */\n\nconst ChevronDown = () => (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/* ============================================================================\n Scroll State Context — lets children (e.g. NavbarV2Tabs) know when\n the outer container has activated its glass surface, so they can\n demote their own glass to avoid glass-on-glass visual noise.\n ============================================================================ */\n\ninterface ScrollContextValue {\n /** Whether the navbar container is in the scrolled (glass) state. */\n scrolled: boolean;\n}\n\nconst ScrollContext = createContext<ScrollContextValue>({ scrolled: false });\n\n/* ============================================================================\n Mutual Exclusion Context — only one mega menu open at a time\n ============================================================================ */\n\ninterface TabsContextValue {\n /** ID of the currently open menu (null = all closed). */\n activeMenuId: string | null;\n /** Request to open a menu. Closes any other open menu. */\n openMenu: (id: string) => void;\n /** Request to close a specific menu. */\n closeMenu: (id: string) => void;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n activeMenuId: null,\n openMenu: () => {},\n closeMenu: () => {},\n});\n\n/* ============================================================================\n Focus Trap Hook — traps Tab/Shift+Tab inside a container\n ============================================================================ */\n\nfunction useFocusTrap(containerRef: React.RefObject<HTMLElement | null>, active: boolean) {\n useEffect(() => {\n if (!active || !containerRef.current) return;\n\n const container = containerRef.current;\n const FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n const focusable = Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (focusable.length === 0) {\n e.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n\n // Focus first element on trap activation\n const focusable = container.querySelectorAll<HTMLElement>(FOCUSABLE);\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n\n container.addEventListener('keydown', handleKeyDown);\n return () => container.removeEventListener('keydown', handleKeyDown);\n }, [active, containerRef]);\n}\n\n/* ============================================================================\n NavbarV2 — Floating Glass Pill Tab Navigation\n ============================================================================\n A centered floating glass pill with vertical icon+label tabs,\n flanked by brand (left) and actions (right).\n\n On scroll, an outer container activates a subtle glass surface with\n border, wrapping all content (brand + tabs + actions). The inner\n tabs pill demotes its own glass to avoid double-glass visual noise.\n\n Composition:\n <NavbarV2>\n <NavbarV2Brand />\n <NavbarV2Tabs>\n <NavbarV2Tab /> // simple link/button\n <NavbarV2TabMenu /> // tab with mega menu dropdown\n </NavbarV2Tabs>\n <NavbarV2Actions />\n </NavbarV2>\n ============================================================================ */\n\nexport interface NavbarV2Props extends React.HTMLAttributes<HTMLElement> {\n /** Content rendered inside the mobile menu overlay when open. */\n mobileContent?: React.ReactNode;\n /** Accessible labels for mobile toggle. Override for i18n. */\n mobileToggleLabels?: { open: string; close: string };\n /** Controlled mobile menu open state. */\n isMenuOpen?: boolean;\n /** Callback when mobile menu open state changes. */\n onMenuOpenChange?: (isOpen: boolean) => void;\n /** Enable scroll-aware glass container with border. @default true */\n scrollBorder?: boolean;\n /** Scroll distance (px) before glass activates. @default 32 */\n scrollThreshold?: number;\n}\n\n/** Hysteresis lower-bound ratio — glass disappears when scroll drops below threshold × this */\nconst HYSTERESIS_RATIO = 0.25;\n\nexport const NavbarV2 = forwardRef<HTMLElement, NavbarV2Props>(\n (\n {\n className,\n mobileContent,\n mobileToggleLabels,\n isMenuOpen,\n onMenuOpenChange,\n scrollBorder = true,\n scrollThreshold = 32,\n children,\n ...props\n },\n ref,\n ) => {\n const [internalMenuOpen, setInternalMenuOpen] = useState(false);\n const isMobileMenuOpen = isMenuOpen !== undefined ? isMenuOpen : internalMenuOpen;\n\n const navRef = useRef<HTMLElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n const [navHeight, setNavHeight] = useState(64);\n\n const openLabel = mobileToggleLabels?.open ?? 'Open menu';\n const closeLabel = mobileToggleLabels?.close ?? 'Close menu';\n\n /* ── Scroll detection with hysteresis ──────────────────────────────\n Glass appears at scrollThreshold (32px default).\n Glass disappears only when scrolling back above threshold × 0.25 (8px).\n This prevents flicker when hovering near the threshold.\n Initial state is always false to match SSR — the useEffect below\n corrects it on mount before the browser paints. */\n\n const [scrolled, setScrolled] = useState(false);\n\n useEffect(() => {\n if (!scrollBorder) return;\n\n const lowerBound = scrollThreshold * HYSTERESIS_RATIO;\n\n const handleScroll = () => {\n const y = window.scrollY;\n setScrolled((prev) => {\n if (!prev && y > scrollThreshold) return true;\n if (prev && y < lowerBound) return false;\n return prev;\n });\n };\n\n // SSR flash guard — set correct state on mount\n handleScroll();\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n return () => window.removeEventListener('scroll', handleScroll);\n }, [scrollBorder, scrollThreshold]);\n\n const isScrolled = scrollBorder && scrolled;\n\n const scrollCtx = useMemo<ScrollContextValue>(\n () => ({ scrolled: isScrolled }),\n [isScrolled],\n );\n\n const handleToggle = () => {\n const newState = !isMobileMenuOpen;\n setInternalMenuOpen(newState);\n onMenuOpenChange?.(newState);\n };\n\n /* Measure navbar height for mobile overlay positioning + CSS overlap var */\n useEffect(() => {\n const el = navRef.current;\n if (!el) return;\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const h = entry.contentRect.height;\n setNavHeight(h);\n /* Expose height as CSS custom property for layout overlap tricks */\n el.style.setProperty('--navbar-overlap', `${h}px`);\n }\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n /* Lock body scroll when mobile menu is open */\n useEffect(() => {\n if (isMobileMenuOpen) {\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = '';\n };\n }\n }, [isMobileMenuOpen]);\n\n /* Close on Escape */\n useEffect(() => {\n if (!isMobileMenuOpen) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setInternalMenuOpen(false);\n onMenuOpenChange?.(false);\n }\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isMobileMenuOpen, onMenuOpenChange]);\n\n /* Focus trap for mobile overlay */\n useFocusTrap(overlayRef, isMobileMenuOpen);\n\n /* Merge refs: forwardRef + internal navRef */\n const mergedRef = useMergedRef(ref, navRef);\n\n return (\n <ScrollContext.Provider value={scrollCtx}>\n <nav\n ref={mergedRef}\n className={clsx(\n 'ds-navbar-v2',\n isScrolled && 'ds-navbar-v2--scrolled',\n className,\n )}\n {...props}\n >\n {/* Inner container — receives glass treatment on scroll */}\n <div className=\"ds-navbar-v2__container\">\n {children}\n\n {/* Mobile Toggle */}\n <button\n className=\"ds-navbar-v2__toggle\"\n onClick={handleToggle}\n aria-label={isMobileMenuOpen ? closeLabel : openLabel}\n aria-expanded={isMobileMenuOpen}\n >\n {isMobileMenuOpen ? (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n ) : (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n )}\n </button>\n </div>\n\n {/* Mobile Menu Overlay — always mounted, CSS transitions handle show/hide */}\n <div\n ref={overlayRef}\n className=\"ds-navbar-v2__mobile-overlay\"\n style={{ top: navHeight }}\n data-state={isMobileMenuOpen ? 'open' : 'closed'}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={closeLabel}\n >\n <div className=\"ds-navbar-v2__mobile-content\">\n {mobileContent}\n </div>\n </div>\n </nav>\n </ScrollContext.Provider>\n );\n },\n);\n\nNavbarV2.displayName = 'NavbarV2';\n\n/* ============================================================================\n NavbarV2Brand — Logo area (left of pill)\n ============================================================================ */\n\nexport interface NavbarV2BrandProps extends React.HTMLAttributes<HTMLElement> {\n /** Render as custom element (e.g. Next.js Link). @default 'a' */\n as?: React.ElementType;\n href?: string;\n}\n\nexport const NavbarV2Brand = forwardRef<HTMLElement, NavbarV2BrandProps>(\n ({ as: Component = 'a', className, children, ...props }, ref) => (\n <Component ref={ref} className={clsx('ds-navbar-v2__brand', className)} {...props}>\n {children}\n </Component>\n ),\n);\n\nNavbarV2Brand.displayName = 'NavbarV2Brand';\n\n/* ============================================================================\n NavbarV2Tabs — The floating glass pill containing tab items\n Provides mutual-exclusion context so only one mega menu is open at a time.\n Reads ScrollContext to demote glass when outer container is active.\n ============================================================================ */\n\nexport const NavbarV2Tabs = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => {\n const [activeMenuId, setActiveMenuId] = useState<string | null>(null);\n const { scrolled } = useContext(ScrollContext);\n\n const ctxValue = useMemo<TabsContextValue>(\n () => ({\n activeMenuId,\n openMenu: (id: string) => setActiveMenuId(id),\n closeMenu: (id: string) =>\n setActiveMenuId((prev) => (prev === id ? null : prev)),\n }),\n [activeMenuId],\n );\n\n return (\n <TabsContext.Provider value={ctxValue}>\n {/* No role — parent <nav> already declares navigation landmark */}\n <div\n ref={ref}\n className={clsx(\n 'ds-navbar-v2__tabs',\n scrolled && 'ds-navbar-v2__tabs--demoted',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </TabsContext.Provider>\n );\n },\n);\n\nNavbarV2Tabs.displayName = 'NavbarV2Tabs';\n\n/* ============================================================================\n NavbarV2Tab — Vertical icon + label tab (simple link or button)\n ============================================================================ */\n\nexport interface NavbarV2TabProps extends React.HTMLAttributes<HTMLElement> {\n /** Render as custom element (e.g. Next.js Link). @default 'button' */\n as?: React.ElementType;\n /** Whether this tab is the current page. */\n active?: boolean;\n /** Icon element (rendered above label). */\n icon?: React.ReactNode;\n /** Tab label text (rendered below icon). */\n label?: string;\n href?: string;\n}\n\nexport const NavbarV2Tab = forwardRef<HTMLElement, NavbarV2TabProps>(\n ({ as: Component = 'button', active, icon, label, className, children, ...props }, ref) => (\n <Component\n ref={ref}\n className={clsx('ds-navbar-v2__tab', active && 'ds-navbar-v2__tab--active', className)}\n aria-current={active ? 'page' : undefined}\n {...(Component === 'button' ? { type: 'button' } : {})}\n {...props}\n >\n {icon && <span className=\"ds-navbar-v2__tab-icon\">{icon}</span>}\n {label && <span className=\"ds-navbar-v2__tab-label\">{label}</span>}\n {children}\n </Component>\n ),\n);\n\nNavbarV2Tab.displayName = 'NavbarV2Tab';\n\n/* ============================================================================\n NavbarV2TabMenu — Vertical tab that triggers a mega menu dropdown\n ============================================================================ */\n\nexport interface NavbarV2TabMenuProps {\n /** Icon for the tab trigger (rendered above label). */\n icon?: React.ReactNode;\n /** Label for the tab trigger (rendered below icon). */\n label: string;\n /** Whether this tab represents the current section. */\n active?: boolean;\n /** Mega menu panel content. */\n children: React.ReactNode;\n /** Optional class name. */\n className?: string;\n /** Controlled open state. */\n isOpen?: boolean;\n /** Controlled open change handler. */\n onOpenChange?: (isOpen: boolean) => void;\n}\n\nexport const NavbarV2TabMenu = forwardRef<HTMLDivElement, NavbarV2TabMenuProps>(\n (\n {\n icon,\n label,\n active,\n children,\n className,\n isOpen: controlledOpen,\n onOpenChange,\n },\n ref,\n ) => {\n /* Stable ID for mutual exclusion + aria-controls */\n const instanceId = useId();\n const panelId = `navbar-v2-panel-${instanceId}`;\n\n /* Mutual exclusion via context */\n const { activeMenuId, openMenu, closeMenu } = useContext(TabsContext);\n\n /* Support both controlled (isOpen prop) and context-driven state */\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : activeMenuId === instanceId;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<number | null>(null);\n\n const handleOpen = useCallback(() => {\n if (!isOpen) {\n if (!isControlled) openMenu(instanceId);\n onOpenChange?.(true);\n }\n }, [isOpen, isControlled, openMenu, instanceId, onOpenChange]);\n\n const handleClose = useCallback(() => {\n if (isOpen) {\n if (!isControlled) closeMenu(instanceId);\n onOpenChange?.(false);\n }\n }, [isOpen, isControlled, closeMenu, instanceId, onOpenChange]);\n\n const handleToggle = useCallback(() => {\n if (isOpen) handleClose();\n else handleOpen();\n }, [isOpen, handleClose, handleOpen]);\n\n const handleMouseEnter = useCallback(() => {\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n handleOpen();\n }, [handleOpen]);\n\n const handleMouseLeave = useCallback(() => {\n if (timeoutRef.current) window.clearTimeout(timeoutRef.current);\n timeoutRef.current = window.setTimeout(handleClose, 150);\n }, [handleClose]);\n\n /* Cleanup timeout on unmount */\n useEffect(() => {\n return () => {\n if (timeoutRef.current) window.clearTimeout(timeoutRef.current);\n };\n }, []);\n\n /* Click outside → close */\n useEffect(() => {\n if (!isOpen) return;\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node) &&\n triggerRef.current &&\n !triggerRef.current.contains(event.target as Node)\n ) {\n handleClose();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, handleClose]);\n\n /* Escape → close */\n useEffect(() => {\n if (!isOpen) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleClose();\n triggerRef.current?.focus();\n }\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, handleClose]);\n\n /* Viewport edge clamping — nudge panel so it doesn't overflow */\n useEffect(() => {\n if (!isOpen || !panelRef.current) return;\n\n const clampToViewport = () => {\n const panel = panelRef.current;\n if (!panel) return;\n\n // Reset any previous nudge\n panel.style.setProperty('--panel-nudge', '0px');\n\n const rect = panel.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const EDGE_PADDING = 16;\n\n if (rect.right > viewportWidth - EDGE_PADDING) {\n const overflow = rect.right - (viewportWidth - EDGE_PADDING);\n panel.style.setProperty('--panel-nudge', `${-overflow}px`);\n } else if (rect.left < EDGE_PADDING) {\n const overflow = EDGE_PADDING - rect.left;\n panel.style.setProperty('--panel-nudge', `${overflow}px`);\n }\n };\n\n // Clamp after render + animation start\n requestAnimationFrame(clampToViewport);\n window.addEventListener('resize', clampToViewport);\n return () => window.removeEventListener('resize', clampToViewport);\n }, [isOpen]);\n\n /* Merge refs for panel: containerRef (click-outside) + panelRef (clamping) */\n const panelRefCallback = useCallback((node: HTMLDivElement | null) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n (panelRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }, []);\n\n return (\n <div\n ref={ref}\n className={clsx('ds-navbar-v2__tab-menu', className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <button\n ref={triggerRef}\n className={clsx(\n 'ds-navbar-v2__tab',\n (active || isOpen) && 'ds-navbar-v2__tab--active',\n )}\n onClick={handleToggle}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n aria-controls={isOpen ? panelId : undefined}\n type=\"button\"\n >\n {icon && <span className=\"ds-navbar-v2__tab-icon\">{icon}</span>}\n <span className=\"ds-navbar-v2__tab-label-row\">\n <span className=\"ds-navbar-v2__tab-label\">{label}</span>\n <span\n className=\"ds-navbar-v2__tab-chevron\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n <ChevronDown />\n </span>\n </span>\n </button>\n\n {/* Mega panel — mount only when open to keep the global DOM budget low. */}\n {isOpen ? (\n <div\n ref={panelRefCallback}\n id={panelId}\n className=\"ds-navbar-v2__mega-panel\"\n data-state=\"open\"\n role=\"region\"\n aria-label={`${label} menu`}\n >\n {children}\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nNavbarV2TabMenu.displayName = 'NavbarV2TabMenu';\n\n/* ============================================================================\n NavbarV2Actions — Right-side actions (right of pill)\n ============================================================================ */\n\nexport const NavbarV2Actions = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={clsx('ds-navbar-v2__actions', className)} {...props}>\n {children}\n </div>\n ),\n);\n\nNavbarV2Actions.displayName = 'NavbarV2Actions';\n\n/* ============================================================================\n Utility — merge multiple refs (forwardRef + internal ref)\n ============================================================================ */\n\nfunction useMergedRef<T>(\n ...refs: (React.Ref<T> | React.MutableRefObject<T | null> | null | undefined)[]\n): React.RefCallback<T> {\n return useCallback(\n (value: T | null) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref && typeof ref === 'object') {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs,\n );\n}\n","import React, { forwardRef, HTMLAttributes, useState } from 'react';\nimport clsx from 'clsx';\nimport { Container } from '../LayoutPrimitives';\nimport './SiteFooter.css';\n\n/* ============================================================================\n Types\n ============================================================================ */\n\nexport interface FooterLink {\n label: string;\n href: string;\n /** Visual \"NEW\" indicator badge. */\n isNew?: boolean;\n}\n\nexport interface FooterSection {\n title: string;\n links: FooterLink[];\n}\n\nexport interface FooterCTA {\n /** Primary headline (e.g., \"Install Your Sales Operating System.\") */\n headline: string;\n /** Supporting subtext below the headline. */\n subtext?: string;\n /** Primary CTA slot (e.g., a <Button> component). */\n primaryCta?: React.ReactNode;\n /** Secondary CTA slot (e.g., a ghost <Button>). */\n secondaryCta?: React.ReactNode;\n /** Micro trust line below the CTA actions. */\n trustLine?: string;\n}\n\nexport interface FooterTrustBadge {\n /** Badge label (e.g., \"GDPR-ready\"). */\n label: string;\n}\n\nexport interface SiteFooterProps extends HTMLAttributes<HTMLElement> {\n /* ── Zone 1: Strategic CTA ─────────────────────────────────────────── */\n\n /** Strategic CTA rendered at the top of the footer. */\n cta?: FooterCTA;\n\n /* ── Zone 2: Structured Navigation Grid ────────────────────────────── */\n\n /** Navigation sections rendered as a 5-column grid on desktop. */\n sections?: FooterSection[];\n /** Quick orientation line above the navigation grid. */\n orientationLine?: React.ReactNode;\n /**\n * Custom element to render for each link (e.g., Next.js locale-aware Link).\n * Must accept `href`, `className`, and `children` props.\n * @default 'a'\n */\n linkAs?: React.ElementType;\n\n /* ── Zone 3: Authority Layer ───────────────────────────────────────── */\n\n /** Brand logo or name slot. */\n brand?: React.ReactNode;\n /** Tagline below the brand. */\n tagline?: React.ReactNode;\n /** Social icons slot. */\n socials?: React.ReactNode;\n /** Trust amplifier badges (e.g., \"Built for B2B Teams\", \"GDPR-ready\"). */\n trustBadges?: FooterTrustBadge[];\n\n /* ── Zone 4: System Controls ───────────────────────────────────────── */\n\n /** System controls slot (language switcher, theme toggle, etc.). */\n controls?: React.ReactNode;\n\n /* ── Zone 5: Legal + Ownership ─────────────────────────────────────── */\n\n /** Legal links rendered in the bottom bar. */\n legalLinks?: FooterLink[];\n /** Copyright text. Falls back to a default with the current year. */\n copyright?: React.ReactNode;\n /** Company registration or legal entity info line. */\n companyInfo?: string;\n /** Extra content rendered below the legal bar (e.g., AI summary links). */\n bottomExtra?: React.ReactNode;\n\n /* ── Deprecated ────────────────────────────────────────────────────── */\n\n /** @deprecated Use `controls` instead. Slot rendered in the bottom bar. */\n bottomActions?: React.ReactNode;\n}\n\n/* ============================================================================\n Internal: Mobile Accordion Item\n ============================================================================ */\n\ninterface FooterAccordionItemProps {\n section: FooterSection;\n LinkComponent: React.ElementType;\n}\n\nfunction FooterAccordionItem({ section, LinkComponent }: FooterAccordionItemProps) {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <div\n className={clsx(\n 'ds-footer__accordion-item',\n isOpen && 'ds-footer__accordion-item--open',\n )}\n >\n <button\n type=\"button\"\n className=\"ds-footer__accordion-trigger\"\n aria-expanded={isOpen}\n onClick={() => setIsOpen((prev) => !prev)}\n >\n <span>{section.title}</span>\n <svg\n className=\"ds-footer__accordion-chevron\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n <div className=\"ds-footer__accordion-panel\" hidden={!isOpen}>\n <ul className=\"ds-footer__links\">\n {section.links.map((link, idx) => (\n <li key={idx}>\n <LinkComponent href={link.href} className=\"ds-footer__link\">\n {link.label}\n {link.isNew && <span className=\"ds-footer__badge\">NEW</span>}\n </LinkComponent>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n\n/* ============================================================================\n Component\n ============================================================================ */\n\nexport const SiteFooter = forwardRef<HTMLElement, SiteFooterProps>(\n (\n {\n cta,\n sections = [],\n orientationLine,\n linkAs,\n brand,\n tagline,\n socials,\n trustBadges,\n controls,\n legalLinks = [],\n copyright,\n companyInfo,\n bottomExtra,\n bottomActions,\n className,\n ...props\n },\n ref,\n ) => {\n const currentYear = new Date().getFullYear();\n const defaultCopyright = copyright || `© ${currentYear}. All rights reserved.`;\n const resolvedControls = controls || bottomActions;\n const LinkComponent = linkAs || 'a';\n\n return (\n <footer ref={ref} className={clsx('ds-footer', className)} {...props}>\n {/* ── Zone 1: Strategic CTA ──────────────────────────────────── */}\n {cta && (\n <div className=\"ds-footer__cta\" data-footer-zone=\"cta\">\n <Container>\n <div className=\"ds-footer__cta-content\">\n <h2 className=\"ds-footer__cta-headline\">{cta.headline}</h2>\n {cta.subtext && (\n <p className=\"ds-footer__cta-subtext\">{cta.subtext}</p>\n )}\n {(cta.primaryCta || cta.secondaryCta) && (\n <div className=\"ds-footer__cta-actions\">\n {cta.primaryCta}\n {cta.secondaryCta}\n </div>\n )}\n {cta.trustLine && (\n <p className=\"ds-footer__cta-trust\">{cta.trustLine}</p>\n )}\n </div>\n </Container>\n </div>\n )}\n\n {/* ── Zone 2: Navigation Grid ────────────────────────────────── */}\n {sections.length > 0 && (\n <div className=\"ds-footer__nav\" data-footer-zone=\"navigation\">\n <Container>\n {orientationLine && (\n <div className=\"ds-footer__orientation\">\n {orientationLine}\n </div>\n )}\n\n {/* Desktop: Grid layout */}\n <nav\n className=\"ds-footer__grid\"\n aria-label=\"Footer navigation\"\n >\n {sections.map((section, idx) => (\n <div\n key={idx}\n className=\"ds-footer__column\"\n data-footer-section={section.title\n .toLowerCase()\n .replace(/\\s+/g, '-')}\n >\n <p className=\"ds-footer__heading\">{section.title}</p>\n <ul className=\"ds-footer__links\">\n {section.links.map((link, linkIdx) => (\n <li key={linkIdx}>\n <LinkComponent\n href={link.href}\n className=\"ds-footer__link\"\n >\n {link.label}\n {link.isNew && (\n <span className=\"ds-footer__badge\">NEW</span>\n )}\n </LinkComponent>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n\n {/* Mobile: Accordion layout */}\n <nav\n className=\"ds-footer__mobile-nav\"\n aria-label=\"Footer navigation (mobile)\"\n >\n {sections.map((section, idx) => (\n <FooterAccordionItem\n key={idx}\n section={section}\n LinkComponent={LinkComponent}\n />\n ))}\n </nav>\n </Container>\n </div>\n )}\n\n {/* ── Zone 3: Authority Layer ────────────────────────────────── */}\n {(brand || socials || trustBadges) && (\n <div className=\"ds-footer__authority\" data-footer-zone=\"authority\">\n <Container>\n <div className=\"ds-footer__authority-content\">\n <div className=\"ds-footer__brand\">\n {brand && <div className=\"ds-footer__logo\">{brand}</div>}\n {tagline && (\n <p className=\"ds-footer__tagline\">{tagline}</p>\n )}\n {socials && (\n <div className=\"ds-footer__socials\">{socials}</div>\n )}\n </div>\n {trustBadges && trustBadges.length > 0 && (\n <div className=\"ds-footer__trust-badges\">\n {trustBadges.map((badge, idx) => (\n <span key={idx} className=\"ds-footer__trust-badge\">\n {badge.label}\n </span>\n ))}\n </div>\n )}\n </div>\n </Container>\n </div>\n )}\n\n {/* ── Zone 4 + 5: Controls + Legal ───────────────────────────── */}\n <div className=\"ds-footer__bottom\" data-footer-zone=\"legal\">\n <Container>\n <div className=\"ds-footer__bottom-content\">\n <div className=\"ds-footer__copyright\">\n {copyright || defaultCopyright}\n </div>\n {resolvedControls && (\n <div className=\"ds-footer__controls\">\n {resolvedControls}\n </div>\n )}\n {legalLinks.length > 0 && (\n <div className=\"ds-footer__legal\">\n {legalLinks.map((link, idx) => (\n <LinkComponent\n key={idx}\n href={link.href}\n className=\"ds-footer__legal-link\"\n >\n {link.label}\n </LinkComponent>\n ))}\n </div>\n )}\n </div>\n {bottomExtra && (\n <div className=\"ds-footer__bottom-extra\">{bottomExtra}</div>\n )}\n {companyInfo && (\n <p className=\"ds-footer__company-info\">{companyInfo}</p>\n )}\n </Container>\n </div>\n </footer>\n );\n },\n);\nSiteFooter.displayName = 'SiteFooter';\n","import React, {\n forwardRef,\n useState,\n useRef,\n useEffect,\n useCallback,\n useId,\n} from 'react';\nimport clsx from 'clsx';\nimport './LocaleDropdown.css';\n\n/* ============================================================================\n Icons\n ============================================================================ */\n\nconst GlobeIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M2 12h20\" />\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\n </svg>\n);\n\nconst ChevronDownIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 6L8 10L12 6\" />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n);\n\n/* ============================================================================\n Types\n ============================================================================ */\n\nexport interface LocaleOption {\n /** ISO code, e.g. 'en', 'fr', 'es'. */\n code: string;\n /** Full display name, e.g. 'English', 'Français'. */\n label: string;\n /** Emoji flag or SVG component. Optional. */\n flag?: React.ReactNode;\n /** Short display code, e.g. 'EN', 'FR'. Used in the trigger. */\n shortLabel?: string;\n}\n\nexport interface LocaleDropdownProps {\n /** Available locales. */\n locales: LocaleOption[];\n /** Currently active locale code. */\n activeLocale: string;\n /** Called when user selects a locale. */\n onLocaleChange?: (code: string) => void;\n /**\n * Custom element for dropdown options (e.g. Next.js Link).\n * Receives `href` from `getHref`. @default 'button'\n */\n optionAs?: React.ElementType;\n /** Generate href for each locale option. Used with `optionAs`. */\n getHref?: (code: string) => string;\n /** Additional class name. */\n className?: string;\n /** Direction the dropdown should open. Defaults to 'down'. */\n direction?: 'up' | 'down';\n /** Alignment of the dropdown panel relative to the trigger. Defaults to 'right'. */\n align?: 'left' | 'right' | 'center';\n}\n\n/* ============================================================================\n LocaleDropdown — Globe + flag trigger with dropdown panel\n ============================================================================\n A compact locale selector showing the current locale with a globe icon\n and emoji flag. Clicking opens a dropdown with all available locales.\n\n Features:\n - Click outside / Escape to close\n - Keyboard navigation (ArrowUp/Down, Enter, Escape)\n - Active locale highlighted with checkmark\n - Animated chevron rotation via CSS\n - Supports polymorphic option elements (buttons or links)\n - Full ARIA: aria-haspopup, aria-expanded, aria-activedescendant\n - prefers-reduced-motion respected via CSS\n - Uses DS tokens only (no hardcoded colors)\n ============================================================================ */\n\nexport const LocaleDropdown = forwardRef<HTMLDivElement, LocaleDropdownProps>(\n (\n {\n locales,\n activeLocale,\n onLocaleChange,\n optionAs: OptionComponent = 'button',\n getHref,\n className,\n direction = 'down',\n align = 'right',\n },\n ref,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [focusIndex, setFocusIndex] = useState(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const instanceId = useId();\n const listboxId = `locale-dropdown-${instanceId}`;\n\n const currentLocale = locales.find((l) => l.code === activeLocale) ?? locales[0];\n\n const handleToggle = useCallback(() => {\n setIsOpen((prev) => {\n if (!prev) setFocusIndex(-1);\n return !prev;\n });\n }, []);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n setFocusIndex(-1);\n triggerRef.current?.focus();\n }, []);\n\n const handleSelect = useCallback(\n (code: string) => {\n onLocaleChange?.(code);\n handleClose();\n },\n [onLocaleChange, handleClose],\n );\n\n /* Click outside → close */\n useEffect(() => {\n if (!isOpen) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n handleClose();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, handleClose]);\n\n /* Keyboard navigation */\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!isOpen) {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsOpen(true);\n setFocusIndex(0);\n }\n return;\n }\n\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n handleClose();\n break;\n case 'ArrowDown':\n e.preventDefault();\n setFocusIndex((prev) => (prev + 1) % locales.length);\n break;\n case 'ArrowUp':\n e.preventDefault();\n setFocusIndex((prev) => (prev - 1 + locales.length) % locales.length);\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (focusIndex >= 0 && focusIndex < locales.length) {\n handleSelect(locales[focusIndex].code);\n }\n break;\n case 'Home':\n e.preventDefault();\n setFocusIndex(0);\n break;\n case 'End':\n e.preventDefault();\n setFocusIndex(locales.length - 1);\n break;\n case 'Tab':\n handleClose();\n break;\n }\n },\n [isOpen, focusIndex, locales, handleClose, handleSelect],\n );\n\n /* Scroll focused item into view */\n useEffect(() => {\n if (!isOpen || focusIndex < 0 || !listRef.current) return;\n const items = listRef.current.querySelectorAll('[role=\"option\"]');\n items[focusIndex]?.scrollIntoView({ block: 'nearest' });\n }, [isOpen, focusIndex]);\n\n const activeDescendantId =\n isOpen && focusIndex >= 0 ? `${listboxId}-option-${focusIndex}` : undefined;\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-locale-dropdown',\n direction === 'up' && 'ds-locale-dropdown--up',\n align === 'left' && 'ds-locale-dropdown--align-left',\n align === 'center' && 'ds-locale-dropdown--align-center',\n className\n )}\n >\n <div ref={containerRef} className=\"ds-locale-dropdown__wrapper\">\n {/* Trigger */}\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"ds-locale-dropdown__trigger\"\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n aria-activedescendant={activeDescendantId}\n aria-label={`Language: ${currentLocale.label}. Change language.`}\n >\n <span className=\"ds-locale-dropdown__trigger-icon\">\n <GlobeIcon />\n </span>\n {currentLocale.flag && (\n <span className=\"ds-locale-dropdown__trigger-flag\" aria-hidden=\"true\">\n {currentLocale.flag}\n </span>\n )}\n <span\n className=\"ds-locale-dropdown__trigger-chevron\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n <ChevronDownIcon />\n </span>\n </button>\n\n {/* Dropdown Panel — always mounted, CSS transitions handle show/hide */}\n <div\n ref={listRef}\n id={listboxId}\n className=\"ds-locale-dropdown__panel\"\n role=\"listbox\"\n aria-label=\"Select language\"\n data-state={isOpen ? 'open' : 'closed'}\n onKeyDown={handleKeyDown}\n >\n {locales.map((locale, index) => {\n const isActive = locale.code === activeLocale;\n const isFocused = index === focusIndex;\n const optionId = `${listboxId}-option-${index}`;\n\n const optionProps = {\n id: optionId,\n role: 'option' as const,\n 'aria-selected': isActive,\n className: clsx(\n 'ds-locale-dropdown__option',\n isActive && 'ds-locale-dropdown__option--active',\n isFocused && 'ds-locale-dropdown__option--focused',\n ),\n onClick: () => handleSelect(locale.code),\n ...(OptionComponent !== 'button' && getHref\n ? { href: getHref(locale.code) }\n : { type: 'button' as const }),\n };\n\n return (\n <OptionComponent key={locale.code} {...optionProps}>\n <span className=\"ds-locale-dropdown__option-content\">\n {locale.flag && (\n <span className=\"ds-locale-dropdown__option-flag\" aria-hidden=\"true\">\n {locale.flag}\n </span>\n )}\n <span className=\"ds-locale-dropdown__option-label\">\n {locale.label}\n </span>\n </span>\n {isActive && (\n <span className=\"ds-locale-dropdown__option-check\">\n <CheckIcon />\n </span>\n )}\n </OptionComponent>\n );\n })}\n </div>\n </div>\n </div>\n );\n },\n);\n\nLocaleDropdown.displayName = 'LocaleDropdown';\n","import React from 'react';\nimport { OutboundLink } from './OutboundLink';\n\n/**\n * A wrapper specifically designed to be passed into MDX component mappings.\n * It provides defaults suitable for markdown content.\n * \n * Usage:\n * <MDXRemote components={{ a: MDXOutboundLink }} />\n */\nexport const MDXOutboundLink = ({ \n href, \n children, \n ...props \n}: React.AnchorHTMLAttributes<HTMLAnchorElement> & { href?: string }) => {\n if (!href) {\n // eslint-disable-next-line no-restricted-syntax\n return <a {...props}>{children}</a>;\n }\n\n return (\n <OutboundLink \n href={href} \n context=\"cms_markdown\" \n preserveExistingUTM={true}\n openInNewTab={true}\n {...props}\n >\n {children}\n </OutboundLink>\n );\n};\n\nexport default MDXOutboundLink;"]}
|
|
@@ -117,6 +117,7 @@ var Slider = React2__default.default.forwardRef(
|
|
|
117
117
|
step = 1,
|
|
118
118
|
onValueChange,
|
|
119
119
|
disabled = false,
|
|
120
|
+
inputLabel,
|
|
120
121
|
...props
|
|
121
122
|
}, ref) => {
|
|
122
123
|
const [uncontrolledValue, setUncontrolledValue] = React2__default.default.useState(defaultValue);
|
|
@@ -149,7 +150,6 @@ var Slider = React2__default.default.forwardRef(
|
|
|
149
150
|
{
|
|
150
151
|
type: "range",
|
|
151
152
|
className: "ds-slider__thumb",
|
|
152
|
-
role: "slider",
|
|
153
153
|
min,
|
|
154
154
|
max,
|
|
155
155
|
step,
|
|
@@ -158,7 +158,8 @@ var Slider = React2__default.default.forwardRef(
|
|
|
158
158
|
onChange: handleChange,
|
|
159
159
|
"aria-valuemin": min,
|
|
160
160
|
"aria-valuemax": max,
|
|
161
|
-
"aria-valuenow": value
|
|
161
|
+
"aria-valuenow": value,
|
|
162
|
+
"aria-label": inputLabel
|
|
162
163
|
}
|
|
163
164
|
)
|
|
164
165
|
]
|
|
@@ -230,4 +231,4 @@ exports.TabsTrigger = TabsTrigger;
|
|
|
230
231
|
exports.ToggleGroup = ToggleGroup;
|
|
231
232
|
exports.ToggleGroupItem = ToggleGroupItem;
|
|
232
233
|
//# sourceMappingURL=out.js.map
|
|
233
|
-
//# sourceMappingURL=chunk-
|
|
234
|
+
//# sourceMappingURL=chunk-HCZW5AJN.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Dialog/Dialog.tsx","../src/components/ToggleGroup/ToggleGroup.tsx","../src/components/Slider/Slider.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Badge/Badge.tsx"],"names":["React","clsx","jsx","jsxs"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Dialog as BaseDialog } from '@base-ui/react/dialog';\nimport clsx from 'clsx';\nimport './Dialog.css';\n\nexport const Dialog = BaseDialog.Root;\nexport const DialogTrigger = BaseDialog.Trigger;\nexport const DialogClose = BaseDialog.Close;\nexport const DialogTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <BaseDialog.Title ref={ref} className={clsx('ds-dialog__title', className)} {...props} />\n));\nDialogTitle.displayName = 'DialogTitle';\n\nexport const DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <BaseDialog.Description\n ref={ref}\n className={clsx('ds-dialog__description', className)}\n {...props}\n />\n));\nDialogDescription.displayName = 'DialogDescription';\n\nexport const DialogContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <BaseDialog.Portal>\n <BaseDialog.Backdrop className=\"ds-dialog__backdrop\" />\n <BaseDialog.Popup ref={ref} className={clsx('ds-dialog__content', className)} {...props}>\n {children}\n </BaseDialog.Popup>\n </BaseDialog.Portal>\n ),\n);\nDialogContent.displayName = 'DialogContent';\n\n/**\n * Semantic header section for a dialog, typically containing\n * DialogTitle and DialogDescription.\n */\nexport const DialogHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={clsx('ds-dialog__header', className)} {...props} />\n ),\n);\nDialogHeader.displayName = 'DialogHeader';\n\n/**\n * Footer section for dialog actions (confirm, cancel, etc.).\n * Renders children in a right-aligned flex row with standard gap.\n */\nexport const DialogFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={clsx('ds-dialog__footer', className)} {...props} />\n ),\n);\nDialogFooter.displayName = 'DialogFooter';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './ToggleGroup.css';\n\n/* ==========================================================================\n Context\n ========================================================================== */\n\ninterface ToggleGroupContextValue {\n type: 'single' | 'multiple';\n value: string[];\n onItemToggle: (itemValue: string) => void;\n}\n\nconst ToggleGroupContext = React.createContext<ToggleGroupContextValue>({\n type: 'single',\n value: [],\n onItemToggle: () => {},\n});\n\n/* ==========================================================================\n ToggleGroup (div — role=\"group\")\n ========================================================================== */\n\nexport interface ToggleGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Whether a single or multiple items can be pressed at once. */\n type: 'single' | 'multiple';\n /** The controlled value(s). String for single, string[] for multiple. */\n value?: string | string[];\n /** Callback when value changes. */\n onValueChange?: (value: string | string[]) => void;\n}\n\n/**\n * A group of toggle buttons where one or more can be selected.\n *\n * @example\n * <ToggleGroup type=\"single\" value=\"center\" onValueChange={setValue}>\n * <ToggleGroupItem value=\"left\">Left</ToggleGroupItem>\n * <ToggleGroupItem value=\"center\">Center</ToggleGroupItem>\n * <ToggleGroupItem value=\"right\">Right</ToggleGroupItem>\n * </ToggleGroup>\n */\nexport const ToggleGroup = React.forwardRef<HTMLDivElement, ToggleGroupProps>(\n ({ className, type, value, onValueChange, children, ...props }, ref) => {\n const normalizedValue = React.useMemo<string[]>(() => {\n if (value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n }, [value]);\n\n const onItemToggle = React.useCallback(\n (itemValue: string) => {\n if (type === 'single') {\n const next = normalizedValue.includes(itemValue) ? '' : itemValue;\n onValueChange?.(next);\n } else {\n const next = normalizedValue.includes(itemValue)\n ? normalizedValue.filter((v) => v !== itemValue)\n : [...normalizedValue, itemValue];\n onValueChange?.(next);\n }\n },\n [type, normalizedValue, onValueChange],\n );\n\n const ctx = React.useMemo<ToggleGroupContextValue>(\n () => ({ type, value: normalizedValue, onItemToggle }),\n [type, normalizedValue, onItemToggle],\n );\n\n return (\n <ToggleGroupContext.Provider value={ctx}>\n <div\n ref={ref}\n role=\"group\"\n className={clsx('ds-toggle-group', className)}\n {...props}\n >\n {children}\n </div>\n </ToggleGroupContext.Provider>\n );\n },\n);\n\nToggleGroup.displayName = 'ToggleGroup';\n\n/* ==========================================================================\n ToggleGroupItem (button)\n ========================================================================== */\n\nexport interface ToggleGroupItemProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** The value this item represents. */\n value: string;\n}\n\nexport const ToggleGroupItem = React.forwardRef<\n HTMLButtonElement,\n ToggleGroupItemProps\n>(({ className, value, children, onClick, ...props }, ref) => {\n const ctx = React.useContext(ToggleGroupContext);\n const pressed = ctx.value.includes(value);\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.onItemToggle(value);\n onClick?.(e);\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={pressed}\n className={clsx(\n 'ds-toggle-group__item',\n pressed && 'ds-toggle-group__item--pressed',\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n );\n});\n\nToggleGroupItem.displayName = 'ToggleGroupItem';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './Slider.css';\n\nexport interface SliderProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Current value (controlled). */\n value?: number;\n /** Default value (uncontrolled). */\n defaultValue?: number;\n /** Minimum value. */\n min?: number;\n /** Maximum value. */\n max?: number;\n /** Step increment. */\n step?: number;\n /** Callback fired when the value changes. */\n onValueChange?: (value: number) => void;\n /** Whether the slider is disabled. */\n disabled?: boolean;\n /**\n * Accessible label forwarded to the inner `<input type=\"range\">`.\n * Required for accessibility when the Slider is not wrapped by a `<label>`.\n */\n inputLabel?: string;\n}\n\nexport const Slider = React.forwardRef<HTMLDivElement, SliderProps>(\n (\n {\n className,\n value: controlledValue,\n defaultValue = 50,\n min = 0,\n max = 100,\n step = 1,\n onValueChange,\n disabled = false,\n inputLabel,\n ...props\n },\n ref,\n ) => {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const next = Number(e.target.value);\n if (!isControlled) {\n setUncontrolledValue(next);\n }\n onValueChange?.(next);\n };\n\n const percentage = ((value - min) / (max - min)) * 100;\n\n return (\n <div\n ref={ref}\n className={clsx('ds-slider', disabled && 'ds-slider--disabled', className)}\n {...props}\n >\n <div className=\"ds-slider__track\">\n <div\n className=\"ds-slider__range\"\n style={{ width: `${percentage}%` }}\n />\n </div>\n <input\n type=\"range\"\n className=\"ds-slider__thumb\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n onChange={handleChange}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-label={inputLabel}\n />\n </div>\n );\n },\n);\n\nSlider.displayName = 'Slider';\n","import React from 'react';\nimport { Tabs as BaseTabs } from '@base-ui/react/tabs';\nimport clsx from 'clsx';\nimport './Tabs.css';\n\n/* ============================================================================\n TABS ROOT\n ============================================================================ */\n\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n defaultValue?: string | number;\n value?: string | number;\n onValueChange?: (value: string | number) => void;\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n ({ className, orientation = 'horizontal', ...props }, ref) => {\n return (\n <BaseTabs.Root\n ref={ref}\n className={clsx('ds-tabs', `ds-tabs--${orientation}`, className)}\n orientation={orientation}\n {...props}\n />\n );\n },\n);\n\nTabs.displayName = 'Tabs';\n\n/* ============================================================================\n TABS LIST\n ============================================================================ */\n\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {\n loop?: boolean;\n}\n\nexport const TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, ...props }, ref) => {\n return <BaseTabs.List ref={ref} className={clsx('ds-tabs__list', className)} {...props} />;\n },\n);\n\nTabsList.displayName = 'TabsList';\n\n/* ============================================================================\n TABS TRIGGER\n ============================================================================ */\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string | number;\n disabled?: boolean;\n}\n\nexport const TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <BaseTabs.Tab ref={ref} className={clsx('ds-tabs__trigger', className)} {...props}>\n {children}\n </BaseTabs.Tab>\n );\n },\n);\n\nTabsTrigger.displayName = 'TabsTrigger';\n\n/* ============================================================================\n TABS CONTENT\n ============================================================================ */\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string | number;\n}\n\nexport const TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, ...props }, ref) => {\n return <BaseTabs.Panel ref={ref} className={clsx('ds-tabs__content', className)} {...props} />;\n },\n);\n\nTabsContent.displayName = 'TabsContent';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './Badge.css';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Visual style variant */\n variant?: 'default' | 'secondary' | 'outline' | 'destructive';\n}\n\n/**\n * General-purpose badge for tags, labels, categories, and status indicators.\n *\n * For status-specific badges (success/warning/error/info), use `StatusBadge` instead.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"secondary\">Category</Badge>\n * <Badge variant=\"outline\">v2.1.0</Badge>\n * <Badge variant=\"destructive\">Breaking</Badge>\n */\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant = 'default', ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={clsx('ds-badge', `ds-badge--${variant}`, className)}\n {...props}\n />\n );\n },\n);\n\nBadge.displayName = 'Badge';\n"]}
|
|
@@ -140,6 +140,7 @@ var MotionContainer = ({
|
|
|
140
140
|
}
|
|
141
141
|
);
|
|
142
142
|
};
|
|
143
|
+
var normalizeMotionTextToken = (value) => value.replace(/[^a-zA-Z0-9\u00C0-\u024F]/g, "");
|
|
143
144
|
var MotionText = ({
|
|
144
145
|
text,
|
|
145
146
|
type = "word",
|
|
@@ -167,7 +168,7 @@ var MotionText = ({
|
|
|
167
168
|
}
|
|
168
169
|
};
|
|
169
170
|
return /* @__PURE__ */ jsx(
|
|
170
|
-
motion.
|
|
171
|
+
motion.span,
|
|
171
172
|
{
|
|
172
173
|
variants: containerVariants,
|
|
173
174
|
initial: "hidden",
|
|
@@ -182,7 +183,10 @@ var MotionText = ({
|
|
|
182
183
|
...props.style
|
|
183
184
|
},
|
|
184
185
|
children: items.map((item, i) => {
|
|
185
|
-
const
|
|
186
|
+
const cleanItem = normalizeMotionTextToken(item);
|
|
187
|
+
const isHighlighted = highlightWords.some(
|
|
188
|
+
(highlightWord) => normalizeMotionTextToken(highlightWord) === cleanItem
|
|
189
|
+
);
|
|
186
190
|
return /* @__PURE__ */ jsxs(
|
|
187
191
|
motion.span,
|
|
188
192
|
{
|
|
@@ -193,7 +197,7 @@ var MotionText = ({
|
|
|
193
197
|
},
|
|
194
198
|
children: [
|
|
195
199
|
item,
|
|
196
|
-
type === "word" && "\xA0"
|
|
200
|
+
type === "word" && i < items.length - 1 ? "\xA0" : ""
|
|
197
201
|
]
|
|
198
202
|
},
|
|
199
203
|
i
|
|
@@ -1187,4 +1191,4 @@ FunnelScalingSender.displayName = "FunnelScalingSender";
|
|
|
1187
1191
|
|
|
1188
1192
|
export { CursorSpotlight, FunnelScalingSender, MotionContainer, MotionText, RevenueAutomationLoop, SpotlightCard };
|
|
1189
1193
|
//# sourceMappingURL=out.js.map
|
|
1190
|
-
//# sourceMappingURL=chunk-
|
|
1194
|
+
//# sourceMappingURL=chunk-KE7T2HQC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/CursorSpotlight/CursorSpotlight.tsx","../src/components/Motion/MotionContainer.tsx","../src/components/Motion/MotionText.tsx","../src/components/HeroAnimation/RevenueAutomationLoop.tsx","../src/components/FunnelScalingSender/FunnelScalingSender.tsx"],"names":["useRef","jsx","motion","jsxs","React","useEffect","useState","useCallback","useInView","clsx"],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState, useCallback } from 'react';\nimport './CursorSpotlight.css';\n\n/* ============================================================================\n CURSOR SPOTLIGHT — \"The Glow\" Effect\n ============================================================================\n \n A mouse-following spotlight effect that creates a premium, interactive feel\n on cards, buttons, and other surfaces. The spotlight reveals a subtle glow\n that follows the cursor position.\n \n Usage:\n <CursorSpotlight>\n <YourCard />\n </CursorSpotlight>\n \n ============================================================================ */\n\nexport interface CursorSpotlightProps {\n /** Children to wrap with spotlight effect */\n children: React.ReactNode;\n /** Spotlight color (CSS color or rgb values) */\n color?: string;\n /** Spotlight size in pixels */\n size?: number;\n /** Spotlight opacity (0-1) */\n opacity?: number;\n /** Enable border glow effect */\n borderGlow?: boolean;\n /** Custom class name */\n className?: string;\n /** Disable the effect */\n disabled?: boolean;\n}\n\nexport const CursorSpotlight: React.FC<CursorSpotlightProps> = ({\n children,\n color = 'var(--accent-rgb)',\n size = 400,\n opacity = 0.15,\n borderGlow = true,\n className,\n disabled = false,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [isHovering, setIsHovering] = useState(false);\n const [reducedMotion, setReducedMotion] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n setReducedMotion(mediaQuery.matches);\n\n const handler = (e: MediaQueryListEvent) => setReducedMotion(e.matches);\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }, []);\n\n const isDisabled = disabled || reducedMotion;\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!containerRef.current || isDisabled) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n setPosition({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n });\n },\n [isDisabled],\n );\n\n const handleMouseEnter = useCallback(() => {\n if (!isDisabled) setIsHovering(true);\n }, [isDisabled]);\n\n const handleMouseLeave = useCallback(() => {\n setIsHovering(false);\n }, []);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || isDisabled) return;\n\n container.addEventListener('mousemove', handleMouseMove);\n container.addEventListener('mouseenter', handleMouseEnter);\n container.addEventListener('mouseleave', handleMouseLeave);\n\n return () => {\n container.removeEventListener('mousemove', handleMouseMove);\n container.removeEventListener('mouseenter', handleMouseEnter);\n container.removeEventListener('mouseleave', handleMouseLeave);\n };\n }, [handleMouseMove, handleMouseEnter, handleMouseLeave, isDisabled]);\n\n // Parse color to handle both CSS variables and rgb values\n const spotlightColor = color.startsWith('var(')\n ? `rgba(${color.replace('var(', '').replace(')', '')}, ${opacity})`\n : color.includes(',')\n ? `rgba(${color}, ${opacity})`\n : color;\n\n const borderColor = color.startsWith('var(')\n ? `rgba(${color.replace('var(', '').replace(')', '')}, 0.5)`\n : color.includes(',')\n ? `rgba(${color}, 0.5)`\n : color;\n\n return (\n <div\n ref={containerRef}\n className={`ds-cursor-spotlight ${className || ''}`}\n style={\n {\n '--spotlight-x': `${position.x}px`,\n '--spotlight-y': `${position.y}px`,\n '--spotlight-size': `${size}px`,\n '--spotlight-color': spotlightColor,\n '--spotlight-border-color': borderColor,\n '--spotlight-opacity': isHovering ? 1 : 0,\n } as React.CSSProperties\n }\n data-hovering={isHovering}\n data-border-glow={borderGlow}\n >\n {/* Spotlight overlay */}\n <div className=\"ds-cursor-spotlight__glow\" aria-hidden=\"true\" />\n\n {/* Border glow */}\n {borderGlow && <div className=\"ds-cursor-spotlight__border\" aria-hidden=\"true\" />}\n\n {/* Content */}\n <div className=\"ds-cursor-spotlight__content\">{children}</div>\n </div>\n );\n};\n\nCursorSpotlight.displayName = 'CursorSpotlight';\n\n/* ============================================================================\n SPOTLIGHT CARD — Pre-styled card with spotlight effect\n ============================================================================ */\n\nexport interface SpotlightCardProps extends Omit<CursorSpotlightProps, 'children'> {\n /** Card title */\n title?: string;\n /** Card description */\n description?: string;\n /** Card icon */\n icon?: React.ReactNode;\n /** Card children */\n children?: React.ReactNode;\n /** Click handler */\n onClick?: () => void;\n}\n\nexport const SpotlightCard: React.FC<SpotlightCardProps> = ({\n title,\n description,\n icon,\n children,\n onClick,\n ...spotlightProps\n}) => {\n return (\n <CursorSpotlight {...spotlightProps} className=\"ds-spotlight-card\">\n <div\n className=\"ds-spotlight-card__inner\"\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={\n onClick\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick();\n }\n }\n : undefined\n }\n >\n {icon && <div className=\"ds-spotlight-card__icon\">{icon}</div>}\n {title && <h3 className=\"ds-spotlight-card__title\">{title}</h3>}\n {description && <p className=\"ds-spotlight-card__description\">{description}</p>}\n {children}\n </div>\n </CursorSpotlight>\n );\n};\n\nSpotlightCard.displayName = 'SpotlightCard';\n","import React, { useRef } from 'react';\nimport { motion, useInView, HTMLMotionProps } from 'framer-motion';\nimport { VARIANTS } from '../../tokens/motion';\n\nexport interface MotionContainerProps extends HTMLMotionProps<'div'> {\n children: React.ReactNode;\n viewportMargin?: string;\n once?: boolean;\n stagger?: boolean;\n delay?: number;\n}\n\nexport const MotionContainer = ({\n children,\n viewportMargin = '-10%',\n once = true,\n stagger = false,\n delay = 0,\n className,\n ...props\n}: MotionContainerProps) => {\n const ref = useRef(null);\n // viewportMargin is typed as string for consumer convenience; framer-motion\n // expects an unexported MarginType template literal — safe to assert here.\n const isInView = useInView(ref, {\n once,\n margin: viewportMargin as Parameters<typeof useInView>[1] extends\n | { margin?: infer M }\n | undefined\n ? M\n : string,\n });\n\n const variants = stagger ? VARIANTS.staggerContainer : VARIANTS.fadeIn;\n\n return (\n <motion.div\n ref={ref}\n initial=\"hidden\"\n animate={isInView ? 'visible' : 'hidden'}\n variants={variants}\n transition={{ delay }}\n className={className}\n {...props}\n >\n {children}\n </motion.div>\n );\n};\n","import { motion, HTMLMotionProps } from 'framer-motion';\nimport { MOTION } from '../../tokens/motion';\n\nconst normalizeMotionTextToken = (value: string) => value.replace(/[^a-zA-Z0-9\\u00C0-\\u024F]/g, '');\n\nexport interface MotionTextProps extends HTMLMotionProps<'span'> {\n text: string;\n type?: 'word' | 'char';\n highlightWords?: string[]; // Words to highlight (color/bold)\n className?: string;\n}\n\nexport const MotionText = ({\n text,\n type = 'word',\n highlightWords = [],\n className,\n ...props\n}: MotionTextProps) => {\n // Split text based on type\n const items = type === 'word' ? text.split(' ') : text.split('');\n\n const containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: type === 'word' ? 0.05 : 0.02,\n delayChildren: 0.1,\n },\n },\n };\n\n const itemVariants = {\n hidden: { opacity: 0, y: 10 },\n visible: {\n opacity: 1,\n y: 0,\n transition: { duration: MOTION.DURATION.short, ease: MOTION.EASING.standard },\n },\n };\n\n return (\n <motion.span\n variants={containerVariants}\n initial=\"hidden\"\n whileInView=\"visible\"\n viewport={{ once: true, margin: '-10%' }}\n className={className}\n {...props}\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: type === 'word' ? '0.25em' : '0.05em',\n ...props.style,\n }}\n >\n {items.map((item, i) => {\n const cleanItem = normalizeMotionTextToken(item);\n const isHighlighted = highlightWords.some(\n (highlightWord) => normalizeMotionTextToken(highlightWord) === cleanItem,\n );\n\n return (\n <motion.span\n key={i}\n variants={itemVariants}\n style={{\n color: isHighlighted ? 'var(--brand-pink)' : 'inherit',\n fontWeight: isHighlighted ? 600 : 'inherit',\n }}\n >\n {item}\n {type === 'word' && i < items.length - 1 ? '\\u00A0' : ''}\n </motion.span>\n );\n })}\n </motion.span>\n );\n};\n","import React from 'react';\nimport { motion } from 'framer-motion';\nimport clsx from 'clsx';\nimport './RevenueAutomationLoop.css';\n\nexport interface RevenueAutomationLoopProps {\n className?: string;\n}\n\nconst steps = [\n {\n id: 'test',\n label: 'Test Audience & Messaging',\n icon: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21 21L15 15M17 10C17 13.866 13.866 17 10 17C6.13401 17 3 13.866 3 10C3 6.13401 6.13401 3 10 3C13.866 3 17 6.13401 17 10Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n },\n {\n id: 'execute',\n label: 'Execute Outreach',\n icon: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M22 2L11 13M22 2L15 22L11 13M11 13L2 9L22 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n },\n {\n id: 'results',\n label: 'Book Meetings',\n icon: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 7V3M16 7V3M7 11H17M5 21H19C20.1046 21 21 20.1046 21 19V7C21 5.89543 20.1046 5 19 5H5C3.89543 5 3 5.89543 3 7V19C3 20.1046 3.89543 21 5 21Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n },\n];\n\nexport const RevenueAutomationLoop: React.FC<RevenueAutomationLoopProps> = ({ className }) => {\n return (\n <div className={clsx('ds-revenue-loop', className)}>\n <div className=\"ds-revenue-loop__circle\">\n {/* Animated ring */}\n <svg\n className=\"ds-revenue-loop__ring\"\n viewBox=\"0 0 400 400\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <linearGradient id=\"loopGradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"var(--brand-pink)\" />\n <stop offset=\"50%\" stopColor=\"var(--brand-yellow)\" />\n <stop offset=\"100%\" stopColor=\"var(--brand-pink)\" />\n </linearGradient>\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"url(#loopGradient)\" />\n </marker>\n </defs>\n <circle\n cx=\"200\"\n cy=\"200\"\n r=\"190\"\n stroke=\"var(--rim-light-bottom)\"\n strokeWidth=\"1\"\n strokeDasharray=\"4 4\"\n className=\"ds-revenue-loop__track\"\n />\n <motion.circle\n cx=\"200\"\n cy=\"200\"\n r=\"190\"\n stroke=\"url(#loopGradient)\"\n strokeWidth=\"2\"\n fill=\"none\"\n strokeLinecap=\"round\"\n initial={{ pathLength: 0, rotate: -90 }}\n animate={{ pathLength: 1, rotate: -90 }}\n transition={{\n duration: 4,\n ease: 'linear',\n repeat: Infinity,\n }}\n />\n </svg>\n\n {/* Central Hub */}\n <div className=\"ds-revenue-loop__hub\">\n <div className=\"ds-revenue-loop__hub-glow\" />\n <div className=\"ds-revenue-loop__hub-content\">\n <span className=\"ds-revenue-loop__logo\">AI</span>\n </div>\n </div>\n\n {/* Steps */}\n {steps.map((step, index) => {\n // Calculate position on circle\n // 3 steps = 0, 120, 240 degrees\n // Offset by -90 to start at top\n const angle = (index * 360) / steps.length - 90;\n const radius = 190; // Match circle radius\n const x = 200 + radius * Math.cos((angle * Math.PI) / 180);\n const y = 200 + radius * Math.sin((angle * Math.PI) / 180);\n\n return (\n <motion.div\n key={step.id}\n className=\"ds-revenue-loop__node\"\n style={{\n left: `${(x / 400) * 100}%`,\n top: `${(y / 400) * 100}%`,\n }}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ delay: index * 0.5 }}\n >\n <div className=\"ds-revenue-loop__icon\">{step.icon}</div>\n <div className=\"ds-revenue-loop__label\">{step.label}</div>\n </motion.div>\n );\n })}\n </div>\n </div>\n );\n};\n","/* ============================================================================\n FUNNEL SCALING SENDER — Animated Illustration\n Asset ID: FUNNEL_04_SCALING_SENDER_PERSPECTIVE_ANIMATION_V1\n\n 10-second loopable motion illustration. 6-scene timeline state machine.\n Orchestrates: Winning Combination card, LinkedIn flow pipeline,\n Qualification loop, Meeting conversion, 6-stage funnel mapping,\n and Scaling Mode lock with ant mascot swarm.\n ============================================================================ */\n\nimport React, { useEffect, useState, useCallback, useRef } from 'react';\nimport { motion, useInView, useReducedMotion } from 'framer-motion';\nimport clsx from 'clsx';\nimport './FunnelScalingSender.css';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface FunnelScalingSenderProps {\n /** Additional CSS class */\n className?: string;\n /** Auto-play on viewport entry (default: true) */\n autoPlay?: boolean;\n /** Loop the animation (default: true) */\n loop?: boolean;\n}\n\n/** Timeline scene identifiers */\ntype Scene =\n | 'idle'\n | 'init' // 0–1.5s\n | 'funnel' // 1.5–3.5s\n | 'qualification' // 3.5–5.5s\n | 'meeting' // 5.5–6.5s\n | 'mapping' // 6.5–8.5s\n | 'scaling'; // 8.5–10s\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst EASE_PREMIUM: [number, number, number, number] = [0.22, 1, 0.36, 1];\n\n/** Scene timing in ms — total 10s */\nconst SCENE_TIMING: Record<Exclude<Scene, 'idle'>, number> = {\n init: 0,\n funnel: 1500,\n qualification: 3500,\n meeting: 5500,\n mapping: 6500,\n scaling: 8500,\n};\n\nconst HOLD_DURATION = 1200; // Final hold before loop restart\nconst TOTAL_DURATION = 10000 + HOLD_DURATION;\n\nconst LINKEDIN_STEPS = [\n { id: 'follow', label: 'Profile Follow' },\n { id: 'visit', label: 'Profile Visit' },\n { id: 'connect', label: 'Connection Request' },\n { id: 'msg1', label: 'Message 1' },\n { id: 'msg2', label: 'Message 2' },\n { id: 'msg3', label: 'Message 3' },\n] as const;\n\nconst FUNNEL_STAGES = [\n { id: 'awareness', label: 'Awareness', num: 1 },\n { id: 'discovery', label: 'Discovery', num: 2 },\n { id: 'evaluation', label: 'Evaluation', num: 3 },\n { id: 'intent', label: 'Intent', num: 4 },\n { id: 'negotiation', label: 'Negotiation', num: 5 },\n { id: 'purchase', label: 'Purchase', num: 6 },\n] as const;\n\nconst WINNING_BULLETS = [\n 'Target audience validated & segmented',\n 'Messaging sequence A/B tested',\n 'Optimal send times confirmed',\n 'Response rate > benchmark threshold',\n 'Conversion path verified end-to-end',\n];\n\nconst SCALING_CHECKS = [\n 'Volume multiplied to 9 senders',\n 'All sequences templated & locked',\n 'Auto-qualification active',\n 'Meeting pipeline on autopilot',\n];\n\n// ---------------------------------------------------------------------------\n// Sub-components: SVG Primitives\n// ---------------------------------------------------------------------------\n\n/** Geometric ant mascot — premium, minimal, thin strokes */\nconst AntSVG: React.FC<{ size?: number; className?: string }> = ({ size = 28, className }) => (\n <svg\n className={className}\n width={size}\n height={size}\n viewBox=\"0 0 28 28\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <defs>\n <linearGradient id=\"antGrad\" x1=\"0\" y1=\"0\" x2=\"28\" y2=\"28\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0%\" stopColor=\"var(--brand-pink)\" />\n <stop offset=\"100%\" stopColor=\"var(--brand-yellow)\" />\n </linearGradient>\n </defs>\n {/* Head */}\n <circle cx=\"14\" cy=\"6\" r=\"4\" stroke=\"url(#antGrad)\" strokeWidth=\"1.2\" fill=\"none\" />\n {/* Antennae */}\n <line\n x1=\"11\"\n y1=\"3\"\n x2=\"7\"\n y2=\"0.5\"\n stroke=\"rgba(255,255,255,0.1)\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"17\"\n y1=\"3\"\n x2=\"21\"\n y2=\"0.5\"\n stroke=\"rgba(255,255,255,0.1)\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n />\n {/* Thorax */}\n <ellipse cx=\"14\" cy=\"13\" rx=\"3.5\" ry=\"3\" stroke=\"url(#antGrad)\" strokeWidth=\"1.2\" fill=\"none\" />\n {/* Abdomen */}\n <ellipse cx=\"14\" cy=\"22\" rx=\"5\" ry=\"5\" stroke=\"url(#antGrad)\" strokeWidth=\"1.2\" fill=\"none\" />\n {/* Legs (3 pairs) */}\n <line\n x1=\"10.5\"\n y1=\"11\"\n x2=\"5\"\n y2=\"9\"\n stroke=\"rgba(255,255,255,0.1)\"\n strokeWidth=\"0.8\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"17.5\"\n y1=\"11\"\n x2=\"23\"\n y2=\"9\"\n stroke=\"rgba(255,255,255,0.1)\"\n strokeWidth=\"0.8\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"10.5\"\n y1=\"13\"\n x2=\"4\"\n y2=\"14\"\n stroke=\"rgba(255,255,255,0.1)\"\n strokeWidth=\"0.8\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"17.5\"\n y1=\"13\"\n x2=\"24\"\n y2=\"14\"\n stroke=\"rgba(255,255,255,0.1)\"\n strokeWidth=\"0.8\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"10.5\"\n y1=\"15\"\n x2=\"5\"\n y2=\"18\"\n stroke=\"rgba(255,255,255,0.1)\"\n strokeWidth=\"0.8\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"17.5\"\n y1=\"15\"\n x2=\"23\"\n y2=\"18\"\n stroke=\"rgba(255,255,255,0.1)\"\n strokeWidth=\"0.8\"\n strokeLinecap=\"round\"\n />\n {/* Eyes */}\n <circle cx=\"12.5\" cy=\"5.5\" r=\"0.8\" fill=\"url(#antGrad)\" />\n <circle cx=\"15.5\" cy=\"5.5\" r=\"0.8\" fill=\"url(#antGrad)\" />\n </svg>\n);\n\n/** Small ant for swarm (16px) */\nconst SwarmAntSVG: React.FC = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"8\" cy=\"3.5\" r=\"2.5\" stroke=\"url(#antGrad)\" strokeWidth=\"0.8\" fill=\"none\" />\n <ellipse cx=\"8\" cy=\"8\" rx=\"2\" ry=\"1.8\" stroke=\"url(#antGrad)\" strokeWidth=\"0.8\" fill=\"none\" />\n <ellipse cx=\"8\" cy=\"13\" rx=\"3\" ry=\"3\" stroke=\"url(#antGrad)\" strokeWidth=\"0.8\" fill=\"none\" />\n </svg>\n);\n\n/** Calendar tile icon */\nconst CalendarIcon: React.FC = () => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <rect x=\"2\" y=\"4\" width=\"16\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line x1=\"2\" y1=\"8\" x2=\"18\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <line\n x1=\"6\"\n y1=\"2\"\n x2=\"6\"\n y2=\"6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"14\"\n y1=\"2\"\n x2=\"14\"\n y2=\"6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <rect x=\"5\" y=\"10\" width=\"3\" height=\"3\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.5\" />\n </svg>\n);\n\n/** Lock icon for validated state */\nconst LockIcon: React.FC = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <rect x=\"2\" y=\"5\" width=\"8\" height=\"6\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path\n d=\"M4 5V3.5C4 2.4 4.9 1.5 6 1.5C7.1 1.5 8 2.4 8 3.5V5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n/** Check icon for scaling checklist */\nconst CheckIcon: React.FC = () => (\n <svg\n className=\"ds-funnel-scaling__scaling-check\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <polyline\n points=\"4,7 6,9.5 10,4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n);\n\n/** LinkedIn step icon (generic node dot) */\nconst NodeDot: React.FC = () => (\n <svg\n className=\"ds-funnel-scaling__flow-icon\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"10\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n);\n\n// ---------------------------------------------------------------------------\n// Framer Motion Variant Definitions (spec-aligned)\n// ---------------------------------------------------------------------------\n\nconst containerStagger = {\n hidden: { opacity: 0 },\n show: {\n opacity: 1,\n transition: { staggerChildren: 0.1 },\n },\n};\n\nconst cardReveal = {\n hidden: { opacity: 0, y: 40 },\n show: {\n opacity: 1,\n y: 0,\n transition: { duration: 0.6, ease: EASE_PREMIUM },\n },\n};\n\nconst bulletStagger = {\n hidden: { opacity: 0, x: -8 },\n show: {\n opacity: 1,\n x: 0,\n transition: { duration: 0.3, ease: EASE_PREMIUM },\n },\n};\n\nconst stepNode = {\n hidden: { opacity: 0, scaleY: 0.85 },\n show: {\n opacity: 1,\n scaleY: 1,\n transition: { duration: 0.35, ease: EASE_PREMIUM },\n },\n};\n\nconst funnelLayer = {\n hidden: { opacity: 0, y: 20 },\n show: {\n opacity: 1,\n y: 0,\n transition: { duration: 0.4, ease: EASE_PREMIUM },\n },\n};\n\nconst fadeSlideUp = {\n hidden: { opacity: 0, y: 30 },\n show: {\n opacity: 1,\n y: 0,\n transition: { duration: 0.5, ease: EASE_PREMIUM },\n },\n};\n\nconst scalePulse = {\n hidden: { scale: 1 },\n show: {\n scale: [1, 1.04, 1],\n transition: { duration: 0.6, ease: EASE_PREMIUM },\n },\n};\n\nconst swarmEntry = {\n hidden: { opacity: 0, scale: 0.8 },\n show: {\n opacity: 1,\n scale: 1,\n transition: { duration: 0.35, ease: EASE_PREMIUM },\n },\n};\n\nconst qualBlockLeft = {\n hidden: { opacity: 0, x: -60 },\n show: {\n opacity: 1,\n x: 0,\n transition: { duration: 0.5, ease: EASE_PREMIUM },\n },\n};\n\nconst qualBlockRight = {\n hidden: { opacity: 0, x: 60 },\n show: {\n opacity: 1,\n x: 0,\n transition: { duration: 0.5, ease: EASE_PREMIUM },\n },\n};\n\n// ---------------------------------------------------------------------------\n// Timeline Hook\n// ---------------------------------------------------------------------------\n\nfunction useSceneTimeline(\n isInView: boolean,\n autoPlay: boolean,\n loop: boolean,\n reducedMotion: boolean | null,\n): Scene {\n const [scene, setScene] = useState<Scene>('idle');\n const timerRef = useRef<ReturnType<typeof setTimeout>[]>([]);\n\n const clearTimers = useCallback(() => {\n timerRef.current.forEach(clearTimeout);\n timerRef.current = [];\n }, []);\n\n const startTimeline = useCallback(() => {\n clearTimers();\n\n const scenes: Exclude<Scene, 'idle'>[] = [\n 'init',\n 'funnel',\n 'qualification',\n 'meeting',\n 'mapping',\n 'scaling',\n ];\n\n // In reduced-motion, skip to final state immediately\n if (reducedMotion) {\n setScene('scaling');\n return;\n }\n\n scenes.forEach((s) => {\n const id = setTimeout(() => setScene(s), SCENE_TIMING[s]);\n timerRef.current.push(id);\n });\n\n if (loop) {\n const loopId = setTimeout(() => {\n setScene('idle');\n // On loop restart, skip init scene — start at funnel\n const restartId = setTimeout(() => startTimeline(), 100);\n timerRef.current.push(restartId);\n }, TOTAL_DURATION);\n timerRef.current.push(loopId);\n }\n }, [clearTimers, loop, reducedMotion]);\n\n useEffect(() => {\n if (isInView && autoPlay) {\n startTimeline();\n }\n return clearTimers;\n }, [isInView, autoPlay, startTimeline, clearTimers]);\n\n return scene;\n}\n\n// ---------------------------------------------------------------------------\n// Scene-active helpers\n// ---------------------------------------------------------------------------\n\n/** Returns true if the current scene is at or past the given scene */\nfunction isAtOrPast(current: Scene, target: Exclude<Scene, 'idle'>): boolean {\n const order: Scene[] = [\n 'idle',\n 'init',\n 'funnel',\n 'qualification',\n 'meeting',\n 'mapping',\n 'scaling',\n ];\n return order.indexOf(current) >= order.indexOf(target);\n}\n\n// ---------------------------------------------------------------------------\n// Main Component\n// ---------------------------------------------------------------------------\n\nexport const FunnelScalingSender: React.FC<FunnelScalingSenderProps> = ({\n className,\n autoPlay = true,\n loop = true,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const isInView = useInView(containerRef, { once: false, amount: 0.3 });\n const reducedMotion = useReducedMotion();\n const scene = useSceneTimeline(isInView, autoPlay, loop, reducedMotion);\n\n const isActive = scene !== 'idle';\n const showInit = isAtOrPast(scene, 'init');\n const showFunnel = isAtOrPast(scene, 'funnel');\n const showQualification = isAtOrPast(scene, 'qualification');\n const showMeeting = isAtOrPast(scene, 'meeting');\n const showMapping = isAtOrPast(scene, 'mapping');\n const showScaling = isAtOrPast(scene, 'scaling');\n\n return (\n <div\n ref={containerRef}\n className={clsx('ds-funnel-scaling', className)}\n role=\"img\"\n aria-label=\"Animated illustration: SalesMind scaling funnel from the sender perspective — showing how validated outreach becomes an automated pipeline machine\"\n >\n {/* Background */}\n <motion.div\n className=\"ds-funnel-scaling__bg\"\n initial={{ opacity: 0 }}\n animate={{ opacity: isActive ? 1 : 0 }}\n transition={{ duration: 0.4 }}\n />\n <motion.div\n className=\"ds-funnel-scaling__grid\"\n initial={{ opacity: 0 }}\n animate={{ opacity: isActive ? 1 : 0 }}\n transition={{ duration: 0.4, delay: 0.6 }}\n />\n\n {/* SVG Defs (shared gradients) */}\n <svg width=\"0\" height=\"0\" aria-hidden=\"true\" style={{ position: 'absolute' }}>\n <defs>\n <linearGradient id=\"antGrad\" x1=\"0\" y1=\"0\" x2=\"28\" y2=\"28\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0%\" stopColor=\"var(--brand-pink)\" />\n <stop offset=\"100%\" stopColor=\"var(--brand-yellow)\" />\n </linearGradient>\n <linearGradient id=\"fscFlowGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"var(--brand-pink)\" />\n <stop offset=\"100%\" stopColor=\"var(--brand-yellow)\" />\n </linearGradient>\n <linearGradient id=\"fscQualGrad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"var(--brand-pink)\" />\n <stop offset=\"100%\" stopColor=\"var(--brand-yellow)\" />\n </linearGradient>\n </defs>\n </svg>\n\n <div className=\"ds-funnel-scaling__canvas\">\n {/* ================================================================\n SCENE 01 — Winning Combination Card (left column)\n ================================================================ */}\n <motion.div\n className=\"ds-funnel-scaling__winning-card\"\n variants={cardReveal}\n initial=\"hidden\"\n animate={showInit ? 'show' : 'hidden'}\n >\n <div className=\"ds-funnel-scaling__winning-header\">Solution</div>\n <div className=\"ds-funnel-scaling__winning-title\">Winning Combination</div>\n\n <motion.ul\n className=\"ds-funnel-scaling__winning-bullets\"\n variants={containerStagger}\n initial=\"hidden\"\n animate={showInit ? 'show' : 'hidden'}\n >\n {WINNING_BULLETS.map((bullet) => (\n <motion.li\n key={bullet}\n className=\"ds-funnel-scaling__winning-bullet\"\n variants={bulletStagger}\n >\n {bullet}\n </motion.li>\n ))}\n </motion.ul>\n\n <motion.div\n className=\"ds-funnel-scaling__winning-lock\"\n initial={{ opacity: 0 }}\n animate={{ opacity: showInit ? 1 : 0 }}\n transition={{ delay: 0.8, duration: 0.4 }}\n >\n <LockIcon /> Validated & Locked\n </motion.div>\n </motion.div>\n\n {/* ================================================================\n SCENE 02 — LinkedIn Flow (center column, top)\n ================================================================ */}\n <motion.div\n className=\"ds-funnel-scaling__flow\"\n variants={containerStagger}\n initial=\"hidden\"\n animate={showFunnel ? 'show' : 'hidden'}\n >\n {LINKEDIN_STEPS.map((step, i) => (\n <React.Fragment key={step.id}>\n <motion.div\n className={clsx(\n 'ds-funnel-scaling__flow-node',\n showFunnel && 'ds-funnel-scaling__flow-node--active',\n )}\n variants={stepNode}\n custom={i}\n >\n <NodeDot />\n <span className=\"ds-funnel-scaling__flow-label\">{step.label}</span>\n </motion.div>\n\n {i < LINKEDIN_STEPS.length - 1 && (\n <motion.svg\n className=\"ds-funnel-scaling__flow-connector\"\n width=\"2\"\n height=\"12\"\n viewBox=\"0 0 2 12\"\n initial={{ scaleY: 0, opacity: 0 }}\n animate={showFunnel ? { scaleY: 1, opacity: 1 } : { scaleY: 0, opacity: 0 }}\n transition={{ duration: 0.3, delay: 0.1 * (i + 1), ease: EASE_PREMIUM }}\n style={{ transformOrigin: 'top' }}\n >\n <rect width=\"2\" height=\"12\" fill=\"url(#fscFlowGrad)\" rx=\"1\" />\n </motion.svg>\n )}\n </React.Fragment>\n ))}\n\n {/* Ghost ants appear at Message 3 to signal scaling */}\n {showFunnel && (\n <div style={{ position: 'relative', height: 0 }}>\n {[0, 1, 2].map((i) => (\n <motion.div\n key={`ghost-${i}`}\n className=\"ds-funnel-scaling__ant ds-funnel-scaling__ant--ghost\"\n initial={{ opacity: 0, x: -20 + i * 15, y: -10 }}\n animate={showFunnel ? { opacity: 0.35, x: -10 + i * 18, y: 0 } : { opacity: 0 }}\n transition={{ delay: 1.2 + i * 0.15, duration: 0.4, ease: EASE_PREMIUM }}\n style={{ position: 'absolute' }}\n >\n <AntSVG size={20} />\n </motion.div>\n ))}\n </div>\n )}\n </motion.div>\n\n {/* ================================================================\n SCENE 03 — Qualification Loop (center column, bottom)\n ================================================================ */}\n <motion.div\n className=\"ds-funnel-scaling__qualification\"\n initial={{ opacity: 0, scale: 0.9 }}\n animate={showQualification ? { opacity: 1, scale: 1 } : { opacity: 0, scale: 0.9 }}\n transition={{ duration: 0.6, ease: EASE_PREMIUM }}\n >\n <div className=\"ds-funnel-scaling__qual-ring\">\n <svg viewBox=\"0 0 180 180\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n {/* Track ring */}\n <circle cx=\"90\" cy=\"90\" r=\"70\" stroke=\"rgba(255,255,255,0.06)\" strokeWidth=\"1\" />\n {/* Animated circular arrows */}\n <motion.circle\n cx=\"90\"\n cy=\"90\"\n r=\"70\"\n stroke=\"url(#fscQualGrad)\"\n strokeWidth=\"2\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeDasharray=\"440\"\n initial={{ strokeDashoffset: 440 }}\n animate={showQualification ? { strokeDashoffset: 0 } : { strokeDashoffset: 440 }}\n transition={{ duration: 0.8, ease: EASE_PREMIUM }}\n />\n {/* Arrowhead indicators */}\n <motion.polygon\n points=\"155,80 165,90 155,100\"\n fill=\"var(--brand-pink)\"\n initial={{ opacity: 0 }}\n animate={showQualification ? { opacity: 0.7 } : { opacity: 0 }}\n transition={{ delay: 0.6, duration: 0.3 }}\n />\n <motion.polygon\n points=\"25,100 15,90 25,80\"\n fill=\"var(--brand-yellow)\"\n initial={{ opacity: 0 }}\n animate={showQualification ? { opacity: 0.7 } : { opacity: 0 }}\n transition={{ delay: 0.7, duration: 0.3 }}\n />\n </svg>\n\n {/* Center text */}\n <motion.div\n className=\"ds-funnel-scaling__qual-center\"\n initial={{ opacity: 0 }}\n animate={showQualification ? { opacity: 1 } : { opacity: 0 }}\n transition={{ delay: 0.8, duration: 0.4 }}\n >\n <span className=\"ds-funnel-scaling__qual-text\">\n Qualification happens during the conversation\n </span>\n </motion.div>\n\n {/* Swarm ants orbiting (3 initially, 9 when scaling) */}\n {showQualification && !reducedMotion && (\n <>\n {Array.from({ length: showScaling ? 9 : 3 }).map((_, i) => (\n <motion.div\n key={`swarm-${i}`}\n className=\"ds-funnel-scaling__swarm-ant\"\n variants={swarmEntry}\n initial=\"hidden\"\n animate=\"show\"\n transition={{ delay: i * 0.08 }}\n style={{\n animationDelay: `${-(i * (3 / (showScaling ? 9 : 3)))}s`,\n }}\n >\n <SwarmAntSVG />\n </motion.div>\n ))}\n </>\n )}\n </div>\n\n {/* Reply / Follow-up blocks */}\n <div className=\"ds-funnel-scaling__qual-blocks\">\n <motion.div\n className=\"ds-funnel-scaling__qual-block\"\n variants={qualBlockLeft}\n initial=\"hidden\"\n animate={showQualification ? 'show' : 'hidden'}\n >\n Reply Handling\n </motion.div>\n <motion.div\n className=\"ds-funnel-scaling__qual-block\"\n variants={qualBlockRight}\n initial=\"hidden\"\n animate={showQualification ? 'show' : 'hidden'}\n >\n Follow-up Sequence\n </motion.div>\n </div>\n </motion.div>\n\n {/* ================================================================\n SCENE 05 — 6-Stage Funnel (right column)\n ================================================================ */}\n <motion.div\n className=\"ds-funnel-scaling__funnel\"\n variants={containerStagger}\n initial=\"hidden\"\n animate={showMapping ? 'show' : 'hidden'}\n >\n <div className=\"ds-funnel-scaling__funnel-header\">Sales Funnel Stages</div>\n {FUNNEL_STAGES.map((stage) => {\n const isHighlight = stage.id === 'evaluation' || stage.id === 'intent';\n const isDim = showMapping && !isHighlight;\n\n return (\n <motion.div\n key={stage.id}\n className={clsx(\n 'ds-funnel-scaling__funnel-stage',\n isHighlight && showMapping && 'ds-funnel-scaling__funnel-stage--highlight',\n isDim && 'ds-funnel-scaling__funnel-stage--dim',\n )}\n variants={funnelLayer}\n >\n <span className=\"ds-funnel-scaling__funnel-num\">{stage.num}</span>\n <span className=\"ds-funnel-scaling__funnel-label\">{stage.label}</span>\n </motion.div>\n );\n })}\n </motion.div>\n </div>\n\n {/* ==================================================================\n SCENE 04 — Meeting Booked (absolute positioned, center-bottom)\n ================================================================== */}\n <motion.div\n className=\"ds-funnel-scaling__meeting\"\n variants={fadeSlideUp}\n initial=\"hidden\"\n animate={showMeeting ? 'show' : 'hidden'}\n >\n <motion.div\n variants={scalePulse}\n initial=\"hidden\"\n animate={showMeeting ? 'show' : 'hidden'}\n style={{ display: 'flex', alignItems: 'center', gap: '12px' }}\n >\n <div className=\"ds-funnel-scaling__meeting-icon\">\n <CalendarIcon />\n </div>\n <span className=\"ds-funnel-scaling__meeting-label\">Meeting Booked</span>\n </motion.div>\n </motion.div>\n\n {/* Data line from Meeting to Funnel */}\n {showMeeting && showMapping && (\n <motion.svg\n className=\"ds-funnel-scaling__data-line\"\n style={{ right: 240, bottom: 80, width: 120, height: 200 }}\n viewBox=\"0 0 120 200\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 0.4 }}\n transition={{ delay: 0.3, duration: 0.5 }}\n >\n <motion.path\n d=\"M 0 200 C 20 150, 80 100, 120 40\"\n stroke=\"url(#fscFlowGrad)\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n initial={{ pathLength: 0 }}\n animate={{ pathLength: 1 }}\n transition={{ duration: 0.8, ease: EASE_PREMIUM, delay: 0.2 }}\n />\n {/* Terminal dot */}\n <motion.circle\n cx=\"120\"\n cy=\"40\"\n r=\"3\"\n fill=\"var(--brand-pink)\"\n initial={{ opacity: 0, scale: 0 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ delay: 1, duration: 0.3 }}\n />\n </motion.svg>\n )}\n\n {/* ==================================================================\n SCENE 06 — Scaling Mode Panel (absolute, bottom-right)\n ================================================================== */}\n <motion.div\n className=\"ds-funnel-scaling__scaling-panel\"\n initial={{ opacity: 0, y: 20 }}\n animate={showScaling ? { opacity: 1, y: 0 } : { opacity: 0, y: 20 }}\n transition={{ duration: 0.5, ease: EASE_PREMIUM }}\n >\n <div className=\"ds-funnel-scaling__scaling-header\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M6 1L11 6L6 11L1 6Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n Scaling Mode\n </div>\n\n {SCALING_CHECKS.map((item, i) => (\n <motion.div\n key={item}\n className=\"ds-funnel-scaling__scaling-item\"\n initial={{ opacity: 0, x: -10 }}\n animate={showScaling ? { opacity: 1, x: 0 } : { opacity: 0, x: -10 }}\n transition={{ delay: 0.15 + i * 0.12, duration: 0.35, ease: EASE_PREMIUM }}\n >\n <motion.div\n initial={{ scale: 0 }}\n animate={showScaling ? { scale: 1 } : { scale: 0 }}\n transition={{ delay: 0.25 + i * 0.12, duration: 0.3, ease: EASE_PREMIUM }}\n >\n <CheckIcon />\n </motion.div>\n {item}\n </motion.div>\n ))}\n </motion.div>\n\n {/* Main Ant Mascot — follows scenes positionally via framer-motion */}\n <motion.div\n className=\"ds-funnel-scaling__ant\"\n initial={{ opacity: 0, x: -40, y: 100 }}\n animate={\n showScaling\n ? { opacity: 1, x: 280, y: 60 }\n : showMapping\n ? { opacity: 1, x: 240, y: 160 }\n : showMeeting\n ? { opacity: 1, x: 400, y: 280 }\n : showQualification\n ? { opacity: 1, x: 380, y: 200 }\n : showFunnel\n ? { opacity: 1, x: 320, y: 40 }\n : showInit\n ? { opacity: 1, x: 220, y: 30 }\n : { opacity: 0, x: -40, y: 100 }\n }\n transition={{\n duration: 0.8,\n ease: EASE_PREMIUM,\n opacity: { duration: 0.4 },\n }}\n >\n <AntSVG />\n </motion.div>\n </div>\n );\n};\n\nFunnelScalingSender.displayName = 'FunnelScalingSender';\n"]}
|