@salesmind-ai/design-system 0.3.11 → 0.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/index.css +3 -3
- package/dist/admin/index.css.map +1 -1
- package/dist/{chunk-OGKGIXFC.cjs → chunk-AFZW6GHI.cjs} +27 -25
- package/dist/chunk-AFZW6GHI.cjs.map +1 -0
- 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-U3LK2GID.js → chunk-PWVQPXW4.js} +5 -3
- package/dist/chunk-PWVQPXW4.js.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-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/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"]}
|
|
@@ -74,7 +74,7 @@ function createSchemaGenerators(brand, supportedLanguages = ["en", "fr", "es"])
|
|
|
74
74
|
"@type": "Person",
|
|
75
75
|
name: brand.founder
|
|
76
76
|
},
|
|
77
|
-
sameAs:
|
|
77
|
+
...brand.sameAs && brand.sameAs.length > 0 ? { sameAs: brand.sameAs } : {},
|
|
78
78
|
contactPoint: [],
|
|
79
79
|
areaServed: "Worldwide"
|
|
80
80
|
};
|
|
@@ -566,4 +566,4 @@ exports.canonicalUrl = canonicalUrl;
|
|
|
566
566
|
exports.createEntityIds = createEntityIds;
|
|
567
567
|
exports.createSchemaGenerators = createSchemaGenerators;
|
|
568
568
|
//# sourceMappingURL=out.js.map
|
|
569
|
-
//# sourceMappingURL=chunk-
|
|
569
|
+
//# sourceMappingURL=chunk-D2RHF2OE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/web/seo/schema-generators.ts","../src/web/seo/JsonLd.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Schema.org Generator System\n *\n * Pure functions that generate structured data objects for SEO.\n * Each generator accepts a `BrandConfig` and optional `locale` for `inLanguage` injection.\n *\n * Architecture:\n * - Each generator returns an object with its own `@context` (standalone-safe).\n * - `buildPageGraph()` strips individual `@context` and wraps all schemas\n * in a single `{\"@context\": \"...\", \"@graph\": [...]}` for unified output.\n * - Use `JsonLd` React component to render the @graph into a single <script> tag.\n *\n * @example\n * ```ts\n * import { createSchemaGenerators, buildPageGraph } from '@salesmind-ai/design-system/web';\n *\n * const seo = createSchemaGenerators({\n * name: 'SalesMind AI',\n * url: 'https://sales-mind.ai',\n * description: 'AI sales automation',\n * tagline: 'AI-powered sales',\n * founder: 'Julien Gadea',\n * });\n *\n * const graph = buildPageGraph(\n * seo.organization(),\n * seo.website(),\n * seo.webPage('/pricing', 'Pricing', '...'),\n * );\n * ```\n */\n\nimport type {\n BrandConfig,\n ArticleMeta,\n BreadcrumbItem,\n CareerForSchema,\n CustomerOrganizationMeta,\n FAQItem,\n GlossaryTermForSchema,\n HowToMeta,\n HowToStep,\n ItemForList,\n PersonMeta,\n PricingPlan,\n ServiceMotion,\n TestimonialForSchema,\n TranscriptForSchema,\n VideoObjectMeta,\n} from './types';\n\n// ─── Internal Helpers ────────────────────────────────────────────────────────\n\n/** Convert \"MM:SS\" or \"HH:MM:SS\" to ISO 8601 duration \"PT…\" */\nfunction toISO8601Duration(duration: string): string {\n if (duration.startsWith('PT')) return duration;\n const parts = duration.split(':').map(Number);\n if (parts.some(isNaN)) return duration;\n if (parts.length === 3) return `PT${parts[0]}H${parts[1]}M${parts[2]}S`;\n if (parts.length === 2) return `PT${parts[0]}M${parts[1]}S`;\n return `PT${parts[0]}S`;\n}\n\n/** Convert YouTube watch URL to embed URL */\nfunction toEmbedUrl(url: string): string | undefined {\n try {\n const parsed = new URL(url);\n if (parsed.hostname.includes('youtube.com') && parsed.searchParams.has('v')) {\n return `https://www.youtube.com/embed/${parsed.searchParams.get('v')}`;\n }\n if (parsed.hostname === 'youtu.be') {\n return `https://www.youtube.com/embed${parsed.pathname}`;\n }\n return url;\n } catch {\n return undefined;\n }\n}\n\n/** Map career type string to Schema.org employmentType */\nfunction mapEmploymentType(type?: string | null): string {\n if (!type) return 'FULL_TIME';\n const lower = type.toLowerCase();\n if (lower.includes('part')) return 'PART_TIME';\n if (lower.includes('contract')) return 'CONTRACTOR';\n if (lower.includes('intern')) return 'INTERN';\n if (lower.includes('temporary') || lower.includes('temp')) return 'TEMPORARY';\n return 'FULL_TIME';\n}\n\n// ─── Entity ID Factory ──────────────────────────────────────────────────────\n\n/**\n * Create stable entity ID anchors for @graph cross-referencing.\n * Every entity in the knowledge graph gets a permanent @id.\n * Google resolves @id references across the entire site.\n */\nexport function createEntityIds(brand: BrandConfig) {\n return {\n organization: `${brand.url}/#organization`,\n website: `${brand.url}/#website`,\n software: `${brand.url}/#software`,\n product: `${brand.url}/pricing#product`,\n webpage: (path: string) => `${brand.url}${path}#webpage`,\n article: (path: string) => `${brand.url}${path}#article`,\n faq: (path: string) => `${brand.url}${path}#faq`,\n breadcrumb: (path: string) => `${brand.url}${path}#breadcrumb`,\n person: (slug: string) => `${brand.url}/company/team#person-${slug}`,\n video: (path: string) => `${brand.url}${path}#video`,\n review: (id: string) => `${brand.url}/#review-${id}`,\n service: (slug: string) => `${brand.url}/#service-${slug}`,\n customerOrganization: (slug: string) => `${brand.url}/#customer-org-${slug}`,\n customerPerson: (slug: string) => `${brand.url}/#customer-person-${slug}`,\n } as const;\n}\n\n// ─── Schema Generator Factory ───────────────────────────────────────────────\n\n/**\n * Create all schema generators bound to a specific brand configuration.\n * Returns an object with methods for each schema type.\n */\nexport function createSchemaGenerators(\n brand: BrandConfig,\n supportedLanguages: readonly string[] = ['en', 'fr', 'es'],\n) {\n const ENTITY_IDS = createEntityIds(brand);\n\n return {\n /** Organization schema — Homepage + About page. */\n organization(locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n url: brand.url,\n logo: {\n '@type': 'ImageObject',\n url: `${brand.url}/logo.svg`,\n },\n description: brand.description,\n inLanguage: locale,\n availableLanguage: [...supportedLanguages],\n founder: {\n '@type': 'Person',\n name: brand.founder,\n },\n ...(brand.sameAs && brand.sameAs.length > 0 ? { sameAs: brand.sameAs } : {}),\n contactPoint: [] as Record<string, unknown>[],\n areaServed: 'Worldwide',\n };\n },\n\n /** WebSite schema — Homepage only (with SearchAction). */\n website(locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'WebSite',\n '@id': ENTITY_IDS.website,\n name: brand.name,\n url: brand.url,\n description: brand.tagline,\n inLanguage: locale,\n publisher: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n potentialAction: [\n {\n '@type': 'SearchAction',\n target: {\n '@type': 'EntryPoint',\n urlTemplate: `${brand.url}/blog?q={search_term_string}`,\n },\n 'query-input': 'required name=search_term_string',\n },\n {\n '@type': 'ReadAction',\n target: brand.url,\n },\n ],\n };\n },\n\n /** WebPage schema — Every public page. Links to WebSite + Breadcrumb via @id. */\n webPage(path: string, title: string, description: string, locale: string = 'en', speakable?: Record<string, unknown>) {\n return {\n '@context': 'https://schema.org',\n '@type': 'WebPage',\n '@id': ENTITY_IDS.webpage(path),\n url: `${brand.url}${path}`,\n name: title,\n description,\n inLanguage: locale,\n isPartOf: { '@type': 'WebSite', '@id': ENTITY_IDS.website },\n breadcrumb: { '@id': ENTITY_IDS.breadcrumb(path) },\n potentialAction: {\n '@type': 'ReadAction',\n target: `${brand.url}${path}`,\n },\n ...(speakable ? { speakable } : {}),\n };\n },\n\n /** SoftwareApplication schema — Platform Hub, Platform Feature, Pricing. */\n softwareApplication(\n name?: string,\n description?: string,\n url?: string,\n locale: string = 'en',\n ) {\n return {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n '@id': ENTITY_IDS.software,\n name: name || brand.name,\n description: description || brand.description,\n url: url || brand.url,\n applicationCategory: 'BusinessApplication',\n operatingSystem: 'Web',\n inLanguage: locale,\n availableLanguage: [...supportedLanguages],\n offers: {\n '@type': 'AggregateOffer',\n priceCurrency: 'USD',\n lowPrice: '0',\n highPrice: '0',\n offerCount: '2',\n priceSpecification: {\n '@type': 'PriceSpecification',\n description: 'Custom pricing — contact sales for a tailored quote',\n },\n },\n author: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n };\n },\n\n /** Article schema — Blog posts, Comparison pages. */\n article(meta: ArticleMeta, locale: string = 'en') {\n let path: string;\n try {\n path = new URL(meta.url).pathname;\n } catch {\n path = meta.url.startsWith('/') ? meta.url : `/${meta.url}`;\n }\n\n return {\n '@context': 'https://schema.org',\n '@type': 'Article',\n '@id': ENTITY_IDS.article(path),\n headline: meta.title,\n description: meta.description,\n url: meta.url.startsWith('http') ? meta.url : `${brand.url}${meta.url}`,\n image: meta.image || `${brand.url}/og-default.png`,\n datePublished: meta.publishedTime,\n dateModified: meta.modifiedTime,\n inLanguage: locale,\n author: meta.authorSlug\n ? { '@id': ENTITY_IDS.person(meta.authorSlug) }\n : {\n '@type': 'Person',\n name: meta.authorName,\n url: meta.authorUrl || `${brand.url}/company/team`,\n },\n publisher: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n logo: {\n '@type': 'ImageObject',\n url: `${brand.url}/logo.svg`,\n },\n },\n isPartOf: { '@type': 'WebSite', '@id': ENTITY_IDS.website },\n mainEntityOfPage: { '@id': ENTITY_IDS.webpage(path) },\n articleSection: meta.section,\n keywords: meta.tags?.join(', '),\n speakable: {\n '@type': 'SpeakableSpecification',\n cssSelector: meta.speakableCssSelectors || ['article h1', 'article .summary', 'article .lead'],\n },\n ...(meta.about ? { about: meta.about } : {}),\n ...(meta.video ? { video: meta.video } : {}),\n };\n },\n\n /** FAQPage schema — FAQ hub, Solutions, Platform Features, Comparisons, Integrations. */\n faqPage(items: FAQItem[], pageUrl: string, locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'FAQPage',\n '@id': ENTITY_IDS.faq(pageUrl),\n inLanguage: locale,\n mainEntity: items.map((item) => ({\n '@type': 'Question',\n name: item.question,\n acceptedAnswer: {\n '@type': 'Answer',\n text: item.answer,\n inLanguage: locale,\n },\n })),\n };\n },\n\n /** BreadcrumbList schema — Every public page. */\n breadcrumb(items: BreadcrumbItem[], locale: string = 'en') {\n const lastUrl = items.length > 0 ? items[items.length - 1].url : '/';\n const path = lastUrl.startsWith('http') ? new URL(lastUrl).pathname : lastUrl;\n\n return {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n '@id': ENTITY_IDS.breadcrumb(path),\n inLanguage: locale,\n itemListElement: items.map((item, index) => ({\n '@type': 'ListItem',\n position: index + 1,\n name: item.name,\n item: item.url.startsWith('http') ? item.url : `${brand.url}${item.url}`,\n })),\n };\n },\n\n /** Person schema — Team page, Blog author, Comparison author. */\n person(person: PersonMeta, locale: string = 'en') {\n const slug = person.slug || person.name.toLowerCase().replace(/\\s+/g, '-');\n\n return {\n '@context': 'https://schema.org',\n '@type': 'Person',\n '@id': person.entityIdOverride || ENTITY_IDS.person(slug),\n name: person.name,\n jobTitle: person.jobTitle,\n url: person.url,\n image: person.image,\n inLanguage: locale,\n worksFor: person.worksFor || {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n sameAs: person.sameAs || [],\n };\n },\n\n /** Review schema — Generated from testimonials. */\n review(testimonial: TestimonialForSchema) {\n return {\n '@context': 'https://schema.org',\n '@type': 'Review',\n '@id': ENTITY_IDS.review(testimonial.id),\n author: {\n '@type': 'Person',\n ...(testimonial.authorEntityId ? { '@id': testimonial.authorEntityId } : {}),\n name: testimonial.customer_name,\n ...(testimonial.occupation ? { jobTitle: testimonial.occupation } : {}),\n },\n reviewBody: testimonial.quote || '',\n ...(testimonial.star_rating\n ? {\n reviewRating: {\n '@type': 'Rating',\n ratingValue: String(testimonial.star_rating),\n bestRating: '5',\n worstRating: '1',\n },\n }\n : {}),\n ...(testimonial.review_date ? { datePublished: testimonial.review_date } : {}),\n itemReviewed: {\n '@type': 'SoftwareApplication',\n '@id': ENTITY_IDS.software,\n name: brand.name,\n },\n ...(testimonial.review_source\n ? {\n publisher: {\n '@type': 'Organization',\n name: testimonial.review_source,\n },\n }\n : {}),\n };\n },\n\n /** Product + multiple Offers schema — Pricing page. */\n productWithOffers(\n plans: PricingPlan[],\n testimonials: TestimonialForSchema[] = [],\n locale: string = 'en',\n ) {\n return {\n '@context': 'https://schema.org',\n '@type': 'Product',\n '@id': ENTITY_IDS.product,\n name: brand.name,\n description: brand.description,\n brand: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n inLanguage: locale,\n ...(testimonials.length > 0\n ? { aggregateRating: aggregateRatingFromTestimonials(testimonials) }\n : {}),\n offers: plans.map((plan) => ({\n '@type': 'Offer',\n name: plan.name,\n description: plan.description,\n price: plan.price.replace(/[^0-9.]/g, '') || '0',\n priceCurrency: plan.priceCurrency || 'USD',\n availability: 'https://schema.org/InStock',\n url: `${brand.url}/pricing`,\n ...(plan.billingPeriod\n ? {\n priceSpecification: {\n '@type': 'UnitPriceSpecification',\n price: plan.price.replace(/[^0-9.]/g, '') || '0',\n priceCurrency: plan.priceCurrency || 'USD',\n billingDuration: plan.billingPeriod,\n },\n }\n : {}),\n })),\n };\n },\n\n /** VideoObject schema — Transcript detail pages. */\n videoObject(transcript: TranscriptForSchema, locale: string = 'en') {\n const path = transcript.path || `/resources/transcripts/${transcript.slug}`;\n\n return {\n '@context': 'https://schema.org',\n '@type': 'VideoObject',\n '@id': ENTITY_IDS.video(path),\n name: transcript.title,\n description: transcript.summary || transcript.title,\n ...(transcript.video_link ? { contentUrl: transcript.video_link } : {}),\n ...(transcript.video_link ? { embedUrl: toEmbedUrl(transcript.video_link) } : {}),\n ...(transcript.duration\n ? { duration: toISO8601Duration(transcript.duration) }\n : {}),\n ...(transcript.published_at ? { uploadDate: transcript.published_at } : {}),\n ...(transcript.thumbnailUrl ? { thumbnailUrl: transcript.thumbnailUrl } : {}),\n inLanguage: locale,\n publisher: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n ...(transcript.transcript_text ? { transcript: transcript.transcript_text } : {}),\n };\n },\n\n /** CustomerOrganization schema — Customer's company for Success Story pages. */\n customerOrganization(meta: CustomerOrganizationMeta) {\n return {\n '@context': 'https://schema.org',\n '@type': 'Organization',\n '@id': ENTITY_IDS.customerOrganization(meta.slug),\n name: meta.name,\n ...(meta.url ? { url: meta.url } : {}),\n ...(meta.logo ? { logo: meta.logo } : {}),\n ...(meta.description ? { description: meta.description } : {}),\n ...(meta.industry ? { industry: meta.industry } : {}),\n ...(meta.sameAs && meta.sameAs.length > 0 ? { sameAs: meta.sameAs } : {}),\n };\n },\n\n /** Generic VideoObject — Success story main video and shorts. */\n videoObjectGeneric(meta: VideoObjectMeta, locale: string = 'en') {\n const videoId = meta.fragment\n ? `${brand.url}${meta.path}#${meta.fragment}`\n : ENTITY_IDS.video(meta.path);\n return {\n '@context': 'https://schema.org',\n '@type': 'VideoObject',\n '@id': videoId,\n name: meta.title,\n ...(meta.description ? { description: meta.description } : {}),\n ...(meta.videoUrl ? { contentUrl: meta.videoUrl } : {}),\n ...(meta.embedUrl ? { embedUrl: meta.embedUrl } : {}),\n ...(meta.thumbnailUrl ? { thumbnailUrl: meta.thumbnailUrl } : {}),\n ...(meta.duration ? { duration: meta.duration } : {}),\n ...(meta.uploadDate ? { uploadDate: meta.uploadDate } : {}),\n ...(meta.transcript ? { transcript: meta.transcript } : {}),\n inLanguage: locale,\n publisher: { '@id': ENTITY_IDS.organization },\n };\n },\n\n /** HowTo schema — Solution pages, tutorial blog posts. */\n howTo(steps: HowToStep[], meta: HowToMeta, locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'HowTo',\n name: meta.name,\n description: meta.description,\n inLanguage: locale,\n ...(meta.totalTime ? { totalTime: meta.totalTime } : {}),\n ...(meta.image ? { image: meta.image } : {}),\n step: steps.map((step, index) => ({\n '@type': 'HowToStep',\n position: index + 1,\n name: step.name,\n text: step.text,\n ...(step.url ? { url: step.url } : {}),\n ...(step.image ? { image: step.image } : {}),\n })),\n };\n },\n\n /** Service schema — Growth motion service offerings. */\n service(motion: ServiceMotion, locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'Service',\n '@id': ENTITY_IDS.service(motion.slug),\n name: motion.name,\n description: motion.description,\n url: motion.url.startsWith('http') ? motion.url : `${brand.url}${motion.url}`,\n provider: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n inLanguage: locale,\n availableLanguage: [...supportedLanguages],\n areaServed: 'Worldwide',\n ...(motion.price\n ? {\n offers: {\n '@type': 'Offer',\n price: motion.price.replace(/[^0-9.]/g, '') || '0',\n priceCurrency: motion.priceCurrency || 'USD',\n availability: 'https://schema.org/InStock',\n },\n }\n : {}),\n termsOfService: `${brand.url}/legal/terms`,\n };\n },\n\n /** JobPosting schema — Career detail pages. */\n jobPosting(job: CareerForSchema, locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'JobPosting',\n '@id': `${brand.url}/careers/${job.slug}#jobposting`,\n title: job.title,\n description: job.description || '',\n datePosted: job.published_at || job.created_at,\n employmentType: mapEmploymentType(job.type),\n hiringOrganization: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n sameAs: brand.url,\n },\n ...(job.location\n ? {\n jobLocation: {\n '@type': 'Place',\n address: {\n '@type': 'PostalAddress',\n addressLocality: job.location,\n },\n },\n }\n : {\n jobLocationType: 'TELECOMMUTE',\n }),\n inLanguage: locale,\n };\n },\n\n /** ItemList schema — Hub/listing pages. */\n itemList(items: ItemForList[], listName: string) {\n return {\n '@context': 'https://schema.org',\n '@type': 'ItemList',\n name: listName,\n numberOfItems: items.length,\n itemListElement: items.map((item, index) => ({\n '@type': 'ListItem',\n position: item.position ?? index + 1,\n name: item.name,\n url: item.url.startsWith('http') ? item.url : `${brand.url}${item.url}`,\n ...(item.description ? { description: item.description } : {}),\n ...(item.image ? { image: item.image } : {}),\n })),\n };\n },\n\n /** DefinedTermSet schema — Glossary page. */\n definedTermSet(terms: GlossaryTermForSchema[], locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'DefinedTermSet',\n '@id': `${brand.url}/resources/glossary#termset`,\n name: 'AI Sales Glossary',\n inLanguage: locale,\n hasDefinedTerm: terms.map((term) => ({\n '@type': 'DefinedTerm',\n name: term.term,\n description: term.definition,\n url: term.url || `${brand.url}/resources/glossary#${term.slug}`,\n })),\n };\n },\n\n /** Speakable — marks content sections suitable for voice assistant reading. */\n speakable(cssSelectors: string[]): Record<string, unknown> {\n return {\n '@type': 'SpeakableSpecification',\n cssSelector: cssSelectors,\n };\n },\n\n /** Access the entity IDs for cross-referencing */\n entityIds: ENTITY_IDS,\n };\n}\n\n// ─── Standalone Utilities ───────────────────────────────────────────────────\n\n/**\n * Compute AggregateRating from real testimonial data.\n * Falls back to hardcoded 4.7/150 when no rated testimonials exist.\n * Returns a fragment (no @context) — meant to be embedded in Product/SoftwareApp.\n */\nexport function aggregateRatingFromTestimonials(testimonials: TestimonialForSchema[]) {\n const rated = testimonials.filter((t) => t.star_rating != null && t.star_rating > 0);\n\n if (rated.length === 0) {\n return {\n '@type': 'AggregateRating',\n ratingValue: '4.7',\n ratingCount: '150',\n bestRating: '5',\n worstRating: '1',\n };\n }\n\n const sum = rated.reduce((acc, t) => acc + (t.star_rating || 0), 0);\n const avg = (sum / rated.length).toFixed(1);\n\n return {\n '@type': 'AggregateRating',\n ratingValue: avg,\n ratingCount: String(rated.length),\n bestRating: '5',\n worstRating: '1',\n };\n}\n\n/**\n * Assemble multiple schema entities into a single @graph array.\n * Strips individual `@context` from each schema — the wrapper provides it once.\n *\n * @example\n * ```ts\n * const graph = buildPageGraph(\n * seo.organization(),\n * seo.website(),\n * seo.webPage('/pricing', 'Pricing', '...'),\n * seo.breadcrumb(crumbs),\n * );\n * ```\n */\nexport function buildPageGraph(\n ...schemas: Record<string, unknown>[]\n): Record<string, unknown> {\n const graph = schemas.map((schema) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { '@context': _, ...rest } = schema;\n return rest;\n });\n\n return {\n '@context': 'https://schema.org',\n '@graph': graph,\n };\n}\n\n/**\n * Build canonical URL from pathname.\n * Removes trailing slash (except root) and query params.\n *\n * @param baseUrl - The site's base URL (e.g. \"https://sales-mind.ai\")\n * @param pathname - The route path (e.g. \"/pricing\", \"/blog/post/foo\")\n * @param locale - BCP-47 locale code. 'en' = no prefix (default). Others get /{locale}/ prefix.\n */\nexport function canonicalUrl(baseUrl: string, pathname: string, locale?: string): string {\n const clean = pathname === '/' ? '/' : pathname.replace(/\\/+$/, '');\n\n if (locale && locale !== 'en') {\n const stripped = clean.replace(new RegExp(`^/${locale}(/|$)`), '$1') || '/';\n const path = stripped === '/' ? '' : stripped;\n return `${baseUrl}/${locale}${path}`;\n }\n\n return `${baseUrl}${clean}`;\n}\n","/**\n * JsonLd — Renders structured data as a `<script type=\"application/ld+json\">` tag.\n *\n * Framework-agnostic: works with any React-based framework (Next.js, Vite, Remix, etc.).\n * Safely serializes the data object and escapes `</script>` sequences.\n *\n * @example\n * ```tsx\n * import { JsonLd, buildPageGraph } from '@salesmind-ai/design-system/web';\n *\n * <JsonLd data={buildPageGraph(seo.organization(), seo.website())} />\n * ```\n */\nexport interface JsonLdProps {\n /** The structured data object (schema.org format) */\n data: Record<string, unknown>;\n /** Optional nonce for CSP headers */\n nonce?: string;\n}\n\nexport function JsonLd({ data, nonce }: JsonLdProps) {\n const json = JSON.stringify(data).replace(/<\\/script>/gi, '<\\\\/script>');\n\n return (\n <script\n type=\"application/ld+json\"\n nonce={nonce}\n dangerouslySetInnerHTML={{ __html: json }}\n />\n );\n}\n"]}
|
|
@@ -72,7 +72,7 @@ function createSchemaGenerators(brand, supportedLanguages = ["en", "fr", "es"])
|
|
|
72
72
|
"@type": "Person",
|
|
73
73
|
name: brand.founder
|
|
74
74
|
},
|
|
75
|
-
sameAs:
|
|
75
|
+
...brand.sameAs && brand.sameAs.length > 0 ? { sameAs: brand.sameAs } : {},
|
|
76
76
|
contactPoint: [],
|
|
77
77
|
areaServed: "Worldwide"
|
|
78
78
|
};
|
|
@@ -559,4 +559,4 @@ function JsonLd({ data, nonce }) {
|
|
|
559
559
|
|
|
560
560
|
export { JsonLd, aggregateRatingFromTestimonials, buildPageGraph, canonicalUrl, createEntityIds, createSchemaGenerators };
|
|
561
561
|
//# sourceMappingURL=out.js.map
|
|
562
|
-
//# sourceMappingURL=chunk-
|
|
562
|
+
//# sourceMappingURL=chunk-DMRQPGQA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/web/seo/schema-generators.ts","../src/web/seo/JsonLd.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Schema.org Generator System\n *\n * Pure functions that generate structured data objects for SEO.\n * Each generator accepts a `BrandConfig` and optional `locale` for `inLanguage` injection.\n *\n * Architecture:\n * - Each generator returns an object with its own `@context` (standalone-safe).\n * - `buildPageGraph()` strips individual `@context` and wraps all schemas\n * in a single `{\"@context\": \"...\", \"@graph\": [...]}` for unified output.\n * - Use `JsonLd` React component to render the @graph into a single <script> tag.\n *\n * @example\n * ```ts\n * import { createSchemaGenerators, buildPageGraph } from '@salesmind-ai/design-system/web';\n *\n * const seo = createSchemaGenerators({\n * name: 'SalesMind AI',\n * url: 'https://sales-mind.ai',\n * description: 'AI sales automation',\n * tagline: 'AI-powered sales',\n * founder: 'Julien Gadea',\n * });\n *\n * const graph = buildPageGraph(\n * seo.organization(),\n * seo.website(),\n * seo.webPage('/pricing', 'Pricing', '...'),\n * );\n * ```\n */\n\nimport type {\n BrandConfig,\n ArticleMeta,\n BreadcrumbItem,\n CareerForSchema,\n CustomerOrganizationMeta,\n FAQItem,\n GlossaryTermForSchema,\n HowToMeta,\n HowToStep,\n ItemForList,\n PersonMeta,\n PricingPlan,\n ServiceMotion,\n TestimonialForSchema,\n TranscriptForSchema,\n VideoObjectMeta,\n} from './types';\n\n// ─── Internal Helpers ────────────────────────────────────────────────────────\n\n/** Convert \"MM:SS\" or \"HH:MM:SS\" to ISO 8601 duration \"PT…\" */\nfunction toISO8601Duration(duration: string): string {\n if (duration.startsWith('PT')) return duration;\n const parts = duration.split(':').map(Number);\n if (parts.some(isNaN)) return duration;\n if (parts.length === 3) return `PT${parts[0]}H${parts[1]}M${parts[2]}S`;\n if (parts.length === 2) return `PT${parts[0]}M${parts[1]}S`;\n return `PT${parts[0]}S`;\n}\n\n/** Convert YouTube watch URL to embed URL */\nfunction toEmbedUrl(url: string): string | undefined {\n try {\n const parsed = new URL(url);\n if (parsed.hostname.includes('youtube.com') && parsed.searchParams.has('v')) {\n return `https://www.youtube.com/embed/${parsed.searchParams.get('v')}`;\n }\n if (parsed.hostname === 'youtu.be') {\n return `https://www.youtube.com/embed${parsed.pathname}`;\n }\n return url;\n } catch {\n return undefined;\n }\n}\n\n/** Map career type string to Schema.org employmentType */\nfunction mapEmploymentType(type?: string | null): string {\n if (!type) return 'FULL_TIME';\n const lower = type.toLowerCase();\n if (lower.includes('part')) return 'PART_TIME';\n if (lower.includes('contract')) return 'CONTRACTOR';\n if (lower.includes('intern')) return 'INTERN';\n if (lower.includes('temporary') || lower.includes('temp')) return 'TEMPORARY';\n return 'FULL_TIME';\n}\n\n// ─── Entity ID Factory ──────────────────────────────────────────────────────\n\n/**\n * Create stable entity ID anchors for @graph cross-referencing.\n * Every entity in the knowledge graph gets a permanent @id.\n * Google resolves @id references across the entire site.\n */\nexport function createEntityIds(brand: BrandConfig) {\n return {\n organization: `${brand.url}/#organization`,\n website: `${brand.url}/#website`,\n software: `${brand.url}/#software`,\n product: `${brand.url}/pricing#product`,\n webpage: (path: string) => `${brand.url}${path}#webpage`,\n article: (path: string) => `${brand.url}${path}#article`,\n faq: (path: string) => `${brand.url}${path}#faq`,\n breadcrumb: (path: string) => `${brand.url}${path}#breadcrumb`,\n person: (slug: string) => `${brand.url}/company/team#person-${slug}`,\n video: (path: string) => `${brand.url}${path}#video`,\n review: (id: string) => `${brand.url}/#review-${id}`,\n service: (slug: string) => `${brand.url}/#service-${slug}`,\n customerOrganization: (slug: string) => `${brand.url}/#customer-org-${slug}`,\n customerPerson: (slug: string) => `${brand.url}/#customer-person-${slug}`,\n } as const;\n}\n\n// ─── Schema Generator Factory ───────────────────────────────────────────────\n\n/**\n * Create all schema generators bound to a specific brand configuration.\n * Returns an object with methods for each schema type.\n */\nexport function createSchemaGenerators(\n brand: BrandConfig,\n supportedLanguages: readonly string[] = ['en', 'fr', 'es'],\n) {\n const ENTITY_IDS = createEntityIds(brand);\n\n return {\n /** Organization schema — Homepage + About page. */\n organization(locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n url: brand.url,\n logo: {\n '@type': 'ImageObject',\n url: `${brand.url}/logo.svg`,\n },\n description: brand.description,\n inLanguage: locale,\n availableLanguage: [...supportedLanguages],\n founder: {\n '@type': 'Person',\n name: brand.founder,\n },\n ...(brand.sameAs && brand.sameAs.length > 0 ? { sameAs: brand.sameAs } : {}),\n contactPoint: [] as Record<string, unknown>[],\n areaServed: 'Worldwide',\n };\n },\n\n /** WebSite schema — Homepage only (with SearchAction). */\n website(locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'WebSite',\n '@id': ENTITY_IDS.website,\n name: brand.name,\n url: brand.url,\n description: brand.tagline,\n inLanguage: locale,\n publisher: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n potentialAction: [\n {\n '@type': 'SearchAction',\n target: {\n '@type': 'EntryPoint',\n urlTemplate: `${brand.url}/blog?q={search_term_string}`,\n },\n 'query-input': 'required name=search_term_string',\n },\n {\n '@type': 'ReadAction',\n target: brand.url,\n },\n ],\n };\n },\n\n /** WebPage schema — Every public page. Links to WebSite + Breadcrumb via @id. */\n webPage(path: string, title: string, description: string, locale: string = 'en', speakable?: Record<string, unknown>) {\n return {\n '@context': 'https://schema.org',\n '@type': 'WebPage',\n '@id': ENTITY_IDS.webpage(path),\n url: `${brand.url}${path}`,\n name: title,\n description,\n inLanguage: locale,\n isPartOf: { '@type': 'WebSite', '@id': ENTITY_IDS.website },\n breadcrumb: { '@id': ENTITY_IDS.breadcrumb(path) },\n potentialAction: {\n '@type': 'ReadAction',\n target: `${brand.url}${path}`,\n },\n ...(speakable ? { speakable } : {}),\n };\n },\n\n /** SoftwareApplication schema — Platform Hub, Platform Feature, Pricing. */\n softwareApplication(\n name?: string,\n description?: string,\n url?: string,\n locale: string = 'en',\n ) {\n return {\n '@context': 'https://schema.org',\n '@type': 'SoftwareApplication',\n '@id': ENTITY_IDS.software,\n name: name || brand.name,\n description: description || brand.description,\n url: url || brand.url,\n applicationCategory: 'BusinessApplication',\n operatingSystem: 'Web',\n inLanguage: locale,\n availableLanguage: [...supportedLanguages],\n offers: {\n '@type': 'AggregateOffer',\n priceCurrency: 'USD',\n lowPrice: '0',\n highPrice: '0',\n offerCount: '2',\n priceSpecification: {\n '@type': 'PriceSpecification',\n description: 'Custom pricing — contact sales for a tailored quote',\n },\n },\n author: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n };\n },\n\n /** Article schema — Blog posts, Comparison pages. */\n article(meta: ArticleMeta, locale: string = 'en') {\n let path: string;\n try {\n path = new URL(meta.url).pathname;\n } catch {\n path = meta.url.startsWith('/') ? meta.url : `/${meta.url}`;\n }\n\n return {\n '@context': 'https://schema.org',\n '@type': 'Article',\n '@id': ENTITY_IDS.article(path),\n headline: meta.title,\n description: meta.description,\n url: meta.url.startsWith('http') ? meta.url : `${brand.url}${meta.url}`,\n image: meta.image || `${brand.url}/og-default.png`,\n datePublished: meta.publishedTime,\n dateModified: meta.modifiedTime,\n inLanguage: locale,\n author: meta.authorSlug\n ? { '@id': ENTITY_IDS.person(meta.authorSlug) }\n : {\n '@type': 'Person',\n name: meta.authorName,\n url: meta.authorUrl || `${brand.url}/company/team`,\n },\n publisher: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n logo: {\n '@type': 'ImageObject',\n url: `${brand.url}/logo.svg`,\n },\n },\n isPartOf: { '@type': 'WebSite', '@id': ENTITY_IDS.website },\n mainEntityOfPage: { '@id': ENTITY_IDS.webpage(path) },\n articleSection: meta.section,\n keywords: meta.tags?.join(', '),\n speakable: {\n '@type': 'SpeakableSpecification',\n cssSelector: meta.speakableCssSelectors || ['article h1', 'article .summary', 'article .lead'],\n },\n ...(meta.about ? { about: meta.about } : {}),\n ...(meta.video ? { video: meta.video } : {}),\n };\n },\n\n /** FAQPage schema — FAQ hub, Solutions, Platform Features, Comparisons, Integrations. */\n faqPage(items: FAQItem[], pageUrl: string, locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'FAQPage',\n '@id': ENTITY_IDS.faq(pageUrl),\n inLanguage: locale,\n mainEntity: items.map((item) => ({\n '@type': 'Question',\n name: item.question,\n acceptedAnswer: {\n '@type': 'Answer',\n text: item.answer,\n inLanguage: locale,\n },\n })),\n };\n },\n\n /** BreadcrumbList schema — Every public page. */\n breadcrumb(items: BreadcrumbItem[], locale: string = 'en') {\n const lastUrl = items.length > 0 ? items[items.length - 1].url : '/';\n const path = lastUrl.startsWith('http') ? new URL(lastUrl).pathname : lastUrl;\n\n return {\n '@context': 'https://schema.org',\n '@type': 'BreadcrumbList',\n '@id': ENTITY_IDS.breadcrumb(path),\n inLanguage: locale,\n itemListElement: items.map((item, index) => ({\n '@type': 'ListItem',\n position: index + 1,\n name: item.name,\n item: item.url.startsWith('http') ? item.url : `${brand.url}${item.url}`,\n })),\n };\n },\n\n /** Person schema — Team page, Blog author, Comparison author. */\n person(person: PersonMeta, locale: string = 'en') {\n const slug = person.slug || person.name.toLowerCase().replace(/\\s+/g, '-');\n\n return {\n '@context': 'https://schema.org',\n '@type': 'Person',\n '@id': person.entityIdOverride || ENTITY_IDS.person(slug),\n name: person.name,\n jobTitle: person.jobTitle,\n url: person.url,\n image: person.image,\n inLanguage: locale,\n worksFor: person.worksFor || {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n sameAs: person.sameAs || [],\n };\n },\n\n /** Review schema — Generated from testimonials. */\n review(testimonial: TestimonialForSchema) {\n return {\n '@context': 'https://schema.org',\n '@type': 'Review',\n '@id': ENTITY_IDS.review(testimonial.id),\n author: {\n '@type': 'Person',\n ...(testimonial.authorEntityId ? { '@id': testimonial.authorEntityId } : {}),\n name: testimonial.customer_name,\n ...(testimonial.occupation ? { jobTitle: testimonial.occupation } : {}),\n },\n reviewBody: testimonial.quote || '',\n ...(testimonial.star_rating\n ? {\n reviewRating: {\n '@type': 'Rating',\n ratingValue: String(testimonial.star_rating),\n bestRating: '5',\n worstRating: '1',\n },\n }\n : {}),\n ...(testimonial.review_date ? { datePublished: testimonial.review_date } : {}),\n itemReviewed: {\n '@type': 'SoftwareApplication',\n '@id': ENTITY_IDS.software,\n name: brand.name,\n },\n ...(testimonial.review_source\n ? {\n publisher: {\n '@type': 'Organization',\n name: testimonial.review_source,\n },\n }\n : {}),\n };\n },\n\n /** Product + multiple Offers schema — Pricing page. */\n productWithOffers(\n plans: PricingPlan[],\n testimonials: TestimonialForSchema[] = [],\n locale: string = 'en',\n ) {\n return {\n '@context': 'https://schema.org',\n '@type': 'Product',\n '@id': ENTITY_IDS.product,\n name: brand.name,\n description: brand.description,\n brand: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n inLanguage: locale,\n ...(testimonials.length > 0\n ? { aggregateRating: aggregateRatingFromTestimonials(testimonials) }\n : {}),\n offers: plans.map((plan) => ({\n '@type': 'Offer',\n name: plan.name,\n description: plan.description,\n price: plan.price.replace(/[^0-9.]/g, '') || '0',\n priceCurrency: plan.priceCurrency || 'USD',\n availability: 'https://schema.org/InStock',\n url: `${brand.url}/pricing`,\n ...(plan.billingPeriod\n ? {\n priceSpecification: {\n '@type': 'UnitPriceSpecification',\n price: plan.price.replace(/[^0-9.]/g, '') || '0',\n priceCurrency: plan.priceCurrency || 'USD',\n billingDuration: plan.billingPeriod,\n },\n }\n : {}),\n })),\n };\n },\n\n /** VideoObject schema — Transcript detail pages. */\n videoObject(transcript: TranscriptForSchema, locale: string = 'en') {\n const path = transcript.path || `/resources/transcripts/${transcript.slug}`;\n\n return {\n '@context': 'https://schema.org',\n '@type': 'VideoObject',\n '@id': ENTITY_IDS.video(path),\n name: transcript.title,\n description: transcript.summary || transcript.title,\n ...(transcript.video_link ? { contentUrl: transcript.video_link } : {}),\n ...(transcript.video_link ? { embedUrl: toEmbedUrl(transcript.video_link) } : {}),\n ...(transcript.duration\n ? { duration: toISO8601Duration(transcript.duration) }\n : {}),\n ...(transcript.published_at ? { uploadDate: transcript.published_at } : {}),\n ...(transcript.thumbnailUrl ? { thumbnailUrl: transcript.thumbnailUrl } : {}),\n inLanguage: locale,\n publisher: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n ...(transcript.transcript_text ? { transcript: transcript.transcript_text } : {}),\n };\n },\n\n /** CustomerOrganization schema — Customer's company for Success Story pages. */\n customerOrganization(meta: CustomerOrganizationMeta) {\n return {\n '@context': 'https://schema.org',\n '@type': 'Organization',\n '@id': ENTITY_IDS.customerOrganization(meta.slug),\n name: meta.name,\n ...(meta.url ? { url: meta.url } : {}),\n ...(meta.logo ? { logo: meta.logo } : {}),\n ...(meta.description ? { description: meta.description } : {}),\n ...(meta.industry ? { industry: meta.industry } : {}),\n ...(meta.sameAs && meta.sameAs.length > 0 ? { sameAs: meta.sameAs } : {}),\n };\n },\n\n /** Generic VideoObject — Success story main video and shorts. */\n videoObjectGeneric(meta: VideoObjectMeta, locale: string = 'en') {\n const videoId = meta.fragment\n ? `${brand.url}${meta.path}#${meta.fragment}`\n : ENTITY_IDS.video(meta.path);\n return {\n '@context': 'https://schema.org',\n '@type': 'VideoObject',\n '@id': videoId,\n name: meta.title,\n ...(meta.description ? { description: meta.description } : {}),\n ...(meta.videoUrl ? { contentUrl: meta.videoUrl } : {}),\n ...(meta.embedUrl ? { embedUrl: meta.embedUrl } : {}),\n ...(meta.thumbnailUrl ? { thumbnailUrl: meta.thumbnailUrl } : {}),\n ...(meta.duration ? { duration: meta.duration } : {}),\n ...(meta.uploadDate ? { uploadDate: meta.uploadDate } : {}),\n ...(meta.transcript ? { transcript: meta.transcript } : {}),\n inLanguage: locale,\n publisher: { '@id': ENTITY_IDS.organization },\n };\n },\n\n /** HowTo schema — Solution pages, tutorial blog posts. */\n howTo(steps: HowToStep[], meta: HowToMeta, locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'HowTo',\n name: meta.name,\n description: meta.description,\n inLanguage: locale,\n ...(meta.totalTime ? { totalTime: meta.totalTime } : {}),\n ...(meta.image ? { image: meta.image } : {}),\n step: steps.map((step, index) => ({\n '@type': 'HowToStep',\n position: index + 1,\n name: step.name,\n text: step.text,\n ...(step.url ? { url: step.url } : {}),\n ...(step.image ? { image: step.image } : {}),\n })),\n };\n },\n\n /** Service schema — Growth motion service offerings. */\n service(motion: ServiceMotion, locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'Service',\n '@id': ENTITY_IDS.service(motion.slug),\n name: motion.name,\n description: motion.description,\n url: motion.url.startsWith('http') ? motion.url : `${brand.url}${motion.url}`,\n provider: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n },\n inLanguage: locale,\n availableLanguage: [...supportedLanguages],\n areaServed: 'Worldwide',\n ...(motion.price\n ? {\n offers: {\n '@type': 'Offer',\n price: motion.price.replace(/[^0-9.]/g, '') || '0',\n priceCurrency: motion.priceCurrency || 'USD',\n availability: 'https://schema.org/InStock',\n },\n }\n : {}),\n termsOfService: `${brand.url}/legal/terms`,\n };\n },\n\n /** JobPosting schema — Career detail pages. */\n jobPosting(job: CareerForSchema, locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'JobPosting',\n '@id': `${brand.url}/careers/${job.slug}#jobposting`,\n title: job.title,\n description: job.description || '',\n datePosted: job.published_at || job.created_at,\n employmentType: mapEmploymentType(job.type),\n hiringOrganization: {\n '@type': 'Organization',\n '@id': ENTITY_IDS.organization,\n name: brand.name,\n sameAs: brand.url,\n },\n ...(job.location\n ? {\n jobLocation: {\n '@type': 'Place',\n address: {\n '@type': 'PostalAddress',\n addressLocality: job.location,\n },\n },\n }\n : {\n jobLocationType: 'TELECOMMUTE',\n }),\n inLanguage: locale,\n };\n },\n\n /** ItemList schema — Hub/listing pages. */\n itemList(items: ItemForList[], listName: string) {\n return {\n '@context': 'https://schema.org',\n '@type': 'ItemList',\n name: listName,\n numberOfItems: items.length,\n itemListElement: items.map((item, index) => ({\n '@type': 'ListItem',\n position: item.position ?? index + 1,\n name: item.name,\n url: item.url.startsWith('http') ? item.url : `${brand.url}${item.url}`,\n ...(item.description ? { description: item.description } : {}),\n ...(item.image ? { image: item.image } : {}),\n })),\n };\n },\n\n /** DefinedTermSet schema — Glossary page. */\n definedTermSet(terms: GlossaryTermForSchema[], locale: string = 'en') {\n return {\n '@context': 'https://schema.org',\n '@type': 'DefinedTermSet',\n '@id': `${brand.url}/resources/glossary#termset`,\n name: 'AI Sales Glossary',\n inLanguage: locale,\n hasDefinedTerm: terms.map((term) => ({\n '@type': 'DefinedTerm',\n name: term.term,\n description: term.definition,\n url: term.url || `${brand.url}/resources/glossary#${term.slug}`,\n })),\n };\n },\n\n /** Speakable — marks content sections suitable for voice assistant reading. */\n speakable(cssSelectors: string[]): Record<string, unknown> {\n return {\n '@type': 'SpeakableSpecification',\n cssSelector: cssSelectors,\n };\n },\n\n /** Access the entity IDs for cross-referencing */\n entityIds: ENTITY_IDS,\n };\n}\n\n// ─── Standalone Utilities ───────────────────────────────────────────────────\n\n/**\n * Compute AggregateRating from real testimonial data.\n * Falls back to hardcoded 4.7/150 when no rated testimonials exist.\n * Returns a fragment (no @context) — meant to be embedded in Product/SoftwareApp.\n */\nexport function aggregateRatingFromTestimonials(testimonials: TestimonialForSchema[]) {\n const rated = testimonials.filter((t) => t.star_rating != null && t.star_rating > 0);\n\n if (rated.length === 0) {\n return {\n '@type': 'AggregateRating',\n ratingValue: '4.7',\n ratingCount: '150',\n bestRating: '5',\n worstRating: '1',\n };\n }\n\n const sum = rated.reduce((acc, t) => acc + (t.star_rating || 0), 0);\n const avg = (sum / rated.length).toFixed(1);\n\n return {\n '@type': 'AggregateRating',\n ratingValue: avg,\n ratingCount: String(rated.length),\n bestRating: '5',\n worstRating: '1',\n };\n}\n\n/**\n * Assemble multiple schema entities into a single @graph array.\n * Strips individual `@context` from each schema — the wrapper provides it once.\n *\n * @example\n * ```ts\n * const graph = buildPageGraph(\n * seo.organization(),\n * seo.website(),\n * seo.webPage('/pricing', 'Pricing', '...'),\n * seo.breadcrumb(crumbs),\n * );\n * ```\n */\nexport function buildPageGraph(\n ...schemas: Record<string, unknown>[]\n): Record<string, unknown> {\n const graph = schemas.map((schema) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { '@context': _, ...rest } = schema;\n return rest;\n });\n\n return {\n '@context': 'https://schema.org',\n '@graph': graph,\n };\n}\n\n/**\n * Build canonical URL from pathname.\n * Removes trailing slash (except root) and query params.\n *\n * @param baseUrl - The site's base URL (e.g. \"https://sales-mind.ai\")\n * @param pathname - The route path (e.g. \"/pricing\", \"/blog/post/foo\")\n * @param locale - BCP-47 locale code. 'en' = no prefix (default). Others get /{locale}/ prefix.\n */\nexport function canonicalUrl(baseUrl: string, pathname: string, locale?: string): string {\n const clean = pathname === '/' ? '/' : pathname.replace(/\\/+$/, '');\n\n if (locale && locale !== 'en') {\n const stripped = clean.replace(new RegExp(`^/${locale}(/|$)`), '$1') || '/';\n const path = stripped === '/' ? '' : stripped;\n return `${baseUrl}/${locale}${path}`;\n }\n\n return `${baseUrl}${clean}`;\n}\n","/**\n * JsonLd — Renders structured data as a `<script type=\"application/ld+json\">` tag.\n *\n * Framework-agnostic: works with any React-based framework (Next.js, Vite, Remix, etc.).\n * Safely serializes the data object and escapes `</script>` sequences.\n *\n * @example\n * ```tsx\n * import { JsonLd, buildPageGraph } from '@salesmind-ai/design-system/web';\n *\n * <JsonLd data={buildPageGraph(seo.organization(), seo.website())} />\n * ```\n */\nexport interface JsonLdProps {\n /** The structured data object (schema.org format) */\n data: Record<string, unknown>;\n /** Optional nonce for CSP headers */\n nonce?: string;\n}\n\nexport function JsonLd({ data, nonce }: JsonLdProps) {\n const json = JSON.stringify(data).replace(/<\\/script>/gi, '<\\\\/script>');\n\n return (\n <script\n type=\"application/ld+json\"\n nonce={nonce}\n dangerouslySetInnerHTML={{ __html: json }}\n />\n );\n}\n"]}
|
|
@@ -258,12 +258,7 @@ var NavbarV2 = react.forwardRef(
|
|
|
258
258
|
const [navHeight, setNavHeight] = react.useState(64);
|
|
259
259
|
const openLabel = mobileToggleLabels?.open ?? "Open menu";
|
|
260
260
|
const closeLabel = mobileToggleLabels?.close ?? "Close menu";
|
|
261
|
-
const [scrolled, setScrolled] = react.useState(
|
|
262
|
-
if (typeof window !== "undefined") {
|
|
263
|
-
return window.scrollY > scrollThreshold;
|
|
264
|
-
}
|
|
265
|
-
return false;
|
|
266
|
-
});
|
|
261
|
+
const [scrolled, setScrolled] = react.useState(false);
|
|
267
262
|
react.useEffect(() => {
|
|
268
263
|
if (!scrollBorder) return;
|
|
269
264
|
const lowerBound = scrollThreshold * HYSTERESIS_RATIO;
|
|
@@ -1040,4 +1035,4 @@ exports.NavbarV2TabMenu = NavbarV2TabMenu;
|
|
|
1040
1035
|
exports.NavbarV2Tabs = NavbarV2Tabs;
|
|
1041
1036
|
exports.SiteFooter = SiteFooter;
|
|
1042
1037
|
//# sourceMappingURL=out.js.map
|
|
1043
|
-
//# sourceMappingURL=chunk-
|
|
1038
|
+
//# sourceMappingURL=chunk-GQELL2MF.cjs.map
|