@salesmind-ai/design-system 0.2.0 → 0.3.0

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.
Files changed (123) hide show
  1. package/dist/AppearancePanel-UT57J69V.d.cts +51 -0
  2. package/dist/AppearancePanel-UT57J69V.d.ts +51 -0
  3. package/dist/AppearanceProvider-C36a8-eb.d.cts +45 -0
  4. package/dist/AppearanceProvider-C36a8-eb.d.ts +45 -0
  5. package/dist/Breadcrumb-RX-B_gDV.d.cts +44 -0
  6. package/dist/Breadcrumb-RX-B_gDV.d.ts +44 -0
  7. package/dist/ExportMenu-A2TLFiVv.d.cts +311 -0
  8. package/dist/ExportMenu-C8qck5AT.d.ts +311 -0
  9. package/dist/SectionShell-BfBw5q0Y.d.cts +18 -0
  10. package/dist/SectionShell-BfBw5q0Y.d.ts +18 -0
  11. package/dist/Select-BdZmK0Lt.d.cts +66 -0
  12. package/dist/Select-BdZmK0Lt.d.ts +66 -0
  13. package/dist/admin/index.cjs +2941 -0
  14. package/dist/admin/index.cjs.map +1 -0
  15. package/dist/admin/index.css +4145 -0
  16. package/dist/admin/index.css.map +1 -0
  17. package/dist/admin/index.d.cts +491 -0
  18. package/dist/admin/index.d.ts +491 -0
  19. package/dist/admin/index.js +2918 -0
  20. package/dist/admin/index.js.map +1 -0
  21. package/dist/{audit-CiyPkxk1.d.cts → audit-BS2fn7M4.d.ts} +2 -51
  22. package/dist/{audit-CiyPkxk1.d.ts → audit-DwCmg32J.d.cts} +2 -51
  23. package/dist/blog/index.cjs +1074 -0
  24. package/dist/blog/index.cjs.map +1 -0
  25. package/dist/blog/index.css +1422 -0
  26. package/dist/blog/index.css.map +1 -0
  27. package/dist/blog/index.d.cts +233 -0
  28. package/dist/blog/index.d.ts +233 -0
  29. package/dist/blog/index.js +1056 -0
  30. package/dist/blog/index.js.map +1 -0
  31. package/dist/chart-types-BGVVO-zl.d.cts +208 -0
  32. package/dist/chart-types-BGVVO-zl.d.ts +208 -0
  33. package/dist/charts/index.cjs +2698 -0
  34. package/dist/charts/index.cjs.map +1 -0
  35. package/dist/charts/index.css +1167 -0
  36. package/dist/charts/index.css.map +1 -0
  37. package/dist/charts/index.d.cts +453 -0
  38. package/dist/charts/index.d.ts +453 -0
  39. package/dist/charts/index.js +2682 -0
  40. package/dist/charts/index.js.map +1 -0
  41. package/dist/core/index.cjs +526 -395
  42. package/dist/core/index.cjs.map +1 -1
  43. package/dist/core/index.css +297 -2
  44. package/dist/core/index.css.map +1 -1
  45. package/dist/core/index.d.cts +7 -982
  46. package/dist/core/index.d.ts +7 -982
  47. package/dist/core/index.js +476 -351
  48. package/dist/core/index.js.map +1 -1
  49. package/dist/i18n/index.cjs +585 -0
  50. package/dist/i18n/index.cjs.map +1 -0
  51. package/dist/i18n/index.d.cts +855 -0
  52. package/dist/i18n/index.d.ts +855 -0
  53. package/dist/i18n/index.js +547 -0
  54. package/dist/i18n/index.js.map +1 -0
  55. package/dist/index.css +16 -6
  56. package/dist/index.css.map +1 -1
  57. package/dist/index.d.cts +22 -1290
  58. package/dist/index.d.ts +22 -1290
  59. package/dist/marketing/index.cjs +2144 -3023
  60. package/dist/marketing/index.cjs.map +1 -1
  61. package/dist/marketing/index.css +3729 -4824
  62. package/dist/marketing/index.css.map +1 -1
  63. package/dist/marketing/index.d.cts +1351 -4
  64. package/dist/marketing/index.d.ts +1351 -4
  65. package/dist/marketing/index.js +2190 -3054
  66. package/dist/marketing/index.js.map +1 -1
  67. package/dist/motion/index.cjs +1230 -0
  68. package/dist/motion/index.cjs.map +1 -0
  69. package/dist/motion/index.css +699 -0
  70. package/dist/motion/index.css.map +1 -0
  71. package/dist/motion/index.d.cts +68 -0
  72. package/dist/motion/index.d.ts +68 -0
  73. package/dist/motion/index.js +1218 -0
  74. package/dist/motion/index.js.map +1 -0
  75. package/dist/nav/index.cjs +1533 -0
  76. package/dist/nav/index.cjs.map +1 -0
  77. package/dist/nav/index.css +1984 -0
  78. package/dist/nav/index.css.map +1 -0
  79. package/dist/nav/index.d.cts +279 -0
  80. package/dist/nav/index.d.ts +279 -0
  81. package/dist/nav/index.js +1501 -0
  82. package/dist/nav/index.js.map +1 -0
  83. package/dist/report/index.cjs +26 -1649
  84. package/dist/report/index.cjs.map +1 -1
  85. package/dist/report/index.css +6 -968
  86. package/dist/report/index.css.map +1 -1
  87. package/dist/report/index.d.cts +4 -2
  88. package/dist/report/index.d.ts +4 -2
  89. package/dist/report/index.js +27 -1640
  90. package/dist/report/index.js.map +1 -1
  91. package/dist/sections/index.cjs +385 -0
  92. package/dist/sections/index.cjs.map +1 -0
  93. package/dist/sections/index.css +818 -0
  94. package/dist/sections/index.css.map +1 -0
  95. package/dist/sections/index.d.cts +69 -0
  96. package/dist/sections/index.d.ts +69 -0
  97. package/dist/sections/index.js +374 -0
  98. package/dist/sections/index.js.map +1 -0
  99. package/dist/social-proof/index.cjs +1254 -0
  100. package/dist/social-proof/index.cjs.map +1 -0
  101. package/dist/social-proof/index.css +1416 -0
  102. package/dist/social-proof/index.css.map +1 -0
  103. package/dist/social-proof/index.d.cts +258 -0
  104. package/dist/social-proof/index.d.ts +258 -0
  105. package/dist/social-proof/index.js +1237 -0
  106. package/dist/social-proof/index.js.map +1 -0
  107. package/dist/theme/index.cjs +573 -0
  108. package/dist/theme/index.cjs.map +1 -0
  109. package/dist/theme/index.css +464 -0
  110. package/dist/theme/index.css.map +1 -0
  111. package/dist/theme/index.d.cts +48 -0
  112. package/dist/theme/index.d.ts +48 -0
  113. package/dist/theme/index.js +558 -0
  114. package/dist/theme/index.js.map +1 -0
  115. package/dist/types-DAlgDGzw.d.cts +52 -0
  116. package/dist/types-DAlgDGzw.d.ts +52 -0
  117. package/dist/web/index.d.cts +3 -2
  118. package/dist/web/index.d.ts +3 -2
  119. package/package.json +68 -9
  120. package/dist/ExportMenu-hEe5MhLq.d.cts +0 -1027
  121. package/dist/ExportMenu-hEe5MhLq.d.ts +0 -1027
  122. package/dist/index-B64suAAc.d.cts +0 -1498
  123. package/dist/index-B64suAAc.d.ts +0 -1498
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/AuthorBio/AuthorBio.tsx","../../src/components/Avatar/Avatar.tsx","../../src/components/OutboundLink/OutboundLink.tsx","../../src/web/utm/useUtmDefaults.ts","../../src/web/utm/utm-context.ts","../../src/web/utm/builders.ts","../../src/web/utm/classifiers.ts","../../src/components/OutboundLink/outbound-link-utils.ts","../../src/components/TableOfContents/TableOfContents.tsx","../../src/i18n/useMessage.ts","../../src/i18n/index.ts","../../src/components/ReadingProgress/ReadingProgress.tsx","../../src/components/LongFormLayout/LongFormLayout.tsx","../../src/components/LongFormComponents/LongFormComponents.tsx","../../src/components/ArticleCard/ArticleCard.tsx","../../src/web/analytics/use-analytics.tsx","../../src/web/analytics/analytics-context.ts","../../src/components/ArticleLayout/ArticleLayout.tsx","../../src/components/RelatedContent/RelatedContent.tsx","../../src/components/SectionShell/SectionShell.tsx","../../src/components/LayoutPrimitives/Box.tsx","../../src/tokens/spacing.ts","../../src/components/LayoutPrimitives/utils.ts","../../src/components/LayoutPrimitives/Container.tsx","../../src/components/VersionedContent/VersionedContent.tsx","../../src/components/BrowserFrame/BrowserFrame.tsx"],"names":["forwardRef","clsx","jsx","useState","useEffect","jsxs","React","useContext","createContext"],"mappings":"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","sourcesContent":["import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { Avatar, AvatarImage, AvatarFallback } from '../Avatar/Avatar';\nimport { OutboundLink } from '../OutboundLink/OutboundLink';\nimport './AuthorBio.css';\n\n/* ============================================================================\n AUTHOR BIO\n ============================================================================\n Author biography card for blog posts and articles.\n\n Strategic objective: Authority (expert credibility signal)\n ============================================================================ */\n\n/** Social/external link */\nexport interface AuthorLink {\n /** Link label (e.g., \"Twitter\", \"LinkedIn\") */\n label: string;\n /** Link URL */\n href: string;\n /** Optional icon */\n icon?: React.ReactNode;\n}\n\nexport interface AuthorBioProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Author name */\n name: string;\n /** Author role or title */\n role?: string;\n /** Avatar image URL */\n avatar?: string;\n /** Biography text */\n bio?: string;\n /** External links */\n links?: AuthorLink[];\n /** Layout variant */\n variant?: 'inline' | 'card' | 'compact' | 'longform';\n}\n\n/**\n * Author biography card.\n *\n * @example\n * ```tsx\n * <AuthorBio\n * name=\"Alex Chen\"\n * role=\"Head of Growth at SalesMind AI\"\n * avatar=\"/team/alex.jpg\"\n * bio=\"Alex has 10+ years of experience in B2B growth...\"\n * links={[{ label: 'LinkedIn', href: 'https://linkedin.com/in/alexchen' }]}\n * variant=\"card\"\n * />\n * ```\n */\nexport const AuthorBio = forwardRef<HTMLDivElement, AuthorBioProps>(\n (\n {\n name,\n role,\n avatar,\n bio,\n links,\n variant = 'card',\n className,\n ...props\n },\n ref,\n ) => {\n const initials = name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .slice(0, 2);\n\n return (\n <div\n ref={ref}\n className={clsx('ds-author-bio', `ds-author-bio--${variant}`, className)}\n {...props}\n >\n <Avatar size={variant === 'compact' ? 'sm' : variant === 'longform' ? 'lg' : 'md'} className=\"ds-author-bio__avatar\">\n {avatar && <AvatarImage src={avatar} alt={name} />}\n <AvatarFallback>{initials}</AvatarFallback>\n </Avatar>\n\n <div className=\"ds-author-bio__info\">\n <span className=\"ds-author-bio__name\">{name}</span>\n {role && <span className=\"ds-author-bio__role\">{role}</span>}\n {bio && variant !== 'compact' && (\n <p className=\"ds-author-bio__bio\">{bio}</p>\n )}\n {links && links.length > 0 && variant !== 'compact' && (\n <div className=\"ds-author-bio__links\">\n {links.map((link, i) => (\n <OutboundLink\n key={i}\n href={link.href}\n context=\"author-bio-link\"\n className=\"ds-author-bio__link\"\n >\n {link.icon && <span className=\"ds-author-bio__link-icon\">{link.icon}</span>}\n {link.label}\n </OutboundLink>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nAuthorBio.displayName = 'AuthorBio';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './Avatar.css';\n\n/* ==========================================================================\n Context\n ========================================================================== */\n\ninterface AvatarContextValue {\n hasImage: boolean;\n imageError: boolean;\n onImageError: () => void;\n}\n\nconst AvatarContext = React.createContext<AvatarContextValue>({\n hasImage: false,\n imageError: false,\n onImageError: () => {},\n});\n\n/* ==========================================================================\n Avatar (root)\n ========================================================================== */\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * User avatar with image and fallback support.\n *\n * @example\n * <Avatar>\n * <AvatarImage src=\"/photo.jpg\" alt=\"User\" />\n * <AvatarFallback>JD</AvatarFallback>\n * </Avatar>\n */\nexport const Avatar = React.forwardRef<HTMLSpanElement, AvatarProps>(\n ({ size = 'md', className, children, ...props }, ref) => {\n const [imageError, setImageError] = React.useState(false);\n const [hasImage, setHasImage] = React.useState(false);\n\n // Scan children to detect if an AvatarImage is present\n React.useEffect(() => {\n let found = false;\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child) && child.type === AvatarImage) {\n found = true;\n }\n });\n setHasImage(found);\n }, [children]);\n\n const onImageError = React.useCallback(() => {\n setImageError(true);\n }, []);\n\n return (\n <AvatarContext.Provider value={{ hasImage, imageError, onImageError }}>\n <span\n ref={ref}\n className={clsx('ds-avatar', `ds-avatar--${size}`, className)}\n {...props}\n >\n {children}\n </span>\n </AvatarContext.Provider>\n );\n },\n);\n\nAvatar.displayName = 'Avatar';\n\n/* ==========================================================================\n AvatarImage\n ========================================================================== */\n\nexport const AvatarImage = React.forwardRef<\n HTMLImageElement,\n React.ImgHTMLAttributes<HTMLImageElement>\n>(({ className, onError, ...props }, ref) => {\n const { imageError, onImageError } = React.useContext(AvatarContext);\n\n const handleError = (e: React.SyntheticEvent<HTMLImageElement>) => {\n onImageError();\n onError?.(e);\n };\n\n if (imageError) return null;\n\n return (\n <img\n ref={ref}\n className={clsx('ds-avatar__image', className)}\n onError={handleError}\n {...props}\n />\n );\n});\n\nAvatarImage.displayName = 'AvatarImage';\n\n/* ==========================================================================\n AvatarFallback\n ========================================================================== */\n\nexport const AvatarFallback = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n const { hasImage, imageError } = React.useContext(AvatarContext);\n\n // Show fallback when there is no image, or the image failed to load\n if (hasImage && !imageError) return null;\n\n return (\n <span ref={ref} className={clsx('ds-avatar__fallback', className)} {...props} />\n );\n});\n\nAvatarFallback.displayName = 'AvatarFallback';\n","import React, { AnchorHTMLAttributes, forwardRef, MouseEvent, useState, useEffect } from 'react';\nimport type { UtmParams } from '../../web/utm/types';\nimport { useUtmDefaults } from '../../web/utm/useUtmDefaults';\nimport { isExemptUrl, appendUTMs, appendGovernedUTMs } from './outbound-link-utils';\n\nexport interface OutboundLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string;\n context: string;\n campaignOverride?: string;\n mediumOverride?: string;\n preserveExistingUTM?: boolean;\n openInNewTab?: boolean;\n disableTracking?: boolean;\n /**\n * Governed UTM parameters. When provided, the link uses the UTM governance\n * system (buildUtmUrl) instead of the legacy appendUTMs approach.\n *\n * Preferred for all new code. Existing usages without utmParams continue\n * to work via the legacy path.\n */\n utmParams?: UtmParams;\n children: React.ReactNode;\n}\n\nexport interface OutboundClickEventDetail {\n destination_domain: string;\n destination_url: string;\n utm_medium_type: string;\n page_slug: string;\n component_location: string;\n timestamp: string;\n is_cross_subdomain: boolean;\n}\n\nexport const OutboundLink = forwardRef<HTMLAnchorElement, OutboundLinkProps>(\n (\n {\n href,\n context,\n campaignOverride,\n mediumOverride = 'outbound_link',\n preserveExistingUTM = true,\n openInNewTab = true,\n disableTracking = false,\n utmParams,\n onClick,\n children,\n ...props\n },\n ref\n ) => {\n // ── Resolve UTM params: explicit prop > context > legacy fallback ──\n const contextParams = useUtmDefaults();\n const resolvedUtmParams = utmParams ?? contextParams;\n\n // Parse hostname for analytics events (safe on both server/client)\n let hostname = '';\n try {\n const url = new URL(href);\n hostname = url.hostname;\n } catch {\n // Relative URL or invalid — hostname stays empty\n }\n\n // SSR and initial client render use the plain href to avoid hydration\n // mismatches. UTM params are decorated after hydration via useEffect.\n const [finalHref, setFinalHref] = useState(href);\n\n useEffect(() => {\n let isExternal = false;\n let currentMedium = mediumOverride;\n\n try {\n const url = new URL(href);\n const currentHost = window.location.hostname;\n isExternal = url.hostname !== currentHost;\n\n if (isExternal && currentHost.includes('sales-mind.ai') && url.hostname.includes('sales-mind.ai')) {\n if (currentMedium === 'outbound_link') {\n currentMedium = 'cross_subdomain';\n }\n }\n } catch {\n isExternal = false;\n }\n\n const isExempt = isExemptUrl(href) || disableTracking;\n\n if (isExternal && !isExempt) {\n if (resolvedUtmParams) {\n // Governed path: use buildUtmUrl via appendGovernedUTMs\n setFinalHref(appendGovernedUTMs(href, resolvedUtmParams, preserveExistingUTM));\n } else {\n // Legacy path: use appendUTMs with non-governed defaults\n const pageSlug = window.location.pathname.replace(/^\\/|\\/$/g, '') || 'home';\n setFinalHref(appendUTMs(href, context, pageSlug, {\n mediumOverride: currentMedium,\n campaignOverride,\n preserveExisting: preserveExistingUTM,\n }));\n }\n } else {\n setFinalHref(href);\n }\n }, [href, context, mediumOverride, campaignOverride, preserveExistingUTM, disableTracking, resolvedUtmParams]);\n\n const handleClick = (e: MouseEvent<HTMLAnchorElement>) => {\n if (typeof window === 'undefined' || disableTracking) {\n onClick?.(e);\n return;\n }\n\n let clickExternal = false;\n let clickCrossSubdomain = false;\n let clickMedium = mediumOverride;\n\n try {\n const url = new URL(href);\n const currentHost = window.location.hostname;\n clickExternal = url.hostname !== currentHost;\n\n if (clickExternal && currentHost.includes('sales-mind.ai') && url.hostname.includes('sales-mind.ai')) {\n clickCrossSubdomain = true;\n if (clickMedium === 'outbound_link') {\n clickMedium = 'cross_subdomain';\n }\n }\n } catch { /* relative URL */ }\n\n if (clickExternal) {\n const detail: OutboundClickEventDetail = {\n destination_domain: hostname,\n destination_url: finalHref,\n utm_medium_type: clickMedium,\n page_slug: window.location.pathname,\n component_location: context,\n timestamp: new Date().toISOString(),\n is_cross_subdomain: clickCrossSubdomain,\n };\n\n const event = new CustomEvent('outbound_click', { detail });\n window.dispatchEvent(event);\n }\n\n onClick?.(e);\n };\n\n // Determine SEO attributes\n const relParts = [];\n \n // Check if it's cross-subdomain for target logic (usually open internal links in same tab, external in new)\n let shouldOpenNewTab = openInNewTab;\n try {\n const url = new URL(href);\n if (typeof window !== 'undefined') {\n const currentHost = window.location.hostname;\n if (url.hostname !== currentHost && currentHost.includes('sales-mind.ai') && url.hostname.includes('sales-mind.ai')) {\n shouldOpenNewTab = false; // By default, prefer same tab for cross-subdomain ecosystem links\n }\n }\n } catch { /* empty */ }\n\n if (shouldOpenNewTab) relParts.push('noopener', 'noreferrer');\n if (mediumOverride === 'citation') relParts.push('nofollow');\n const rel = relParts.length > 0 ? relParts.join(' ') : undefined;\n\n return (\n // eslint-disable-next-line no-restricted-syntax\n <a\n ref={ref}\n href={finalHref}\n target={shouldOpenNewTab ? '_blank' : undefined}\n rel={rel}\n onClick={handleClick}\n {...props}\n >\n {children}\n </a>\n );\n }\n);\n\nOutboundLink.displayName = 'OutboundLink';\n","import { useContext } from 'react';\nimport { UtmContext } from './utm-context';\nimport type { UtmParams } from './types';\n\n/**\n * Read the nearest UtmProvider's default params.\n * Returns `null` when no provider is present (callers should fall back gracefully).\n */\nexport function useUtmDefaults(): UtmParams | null {\n return useContext(UtmContext);\n}\n","import { createContext } from 'react';\nimport type { UtmParams } from './types';\n\n/** Internal React context instance. Import via UtmProvider / useUtmDefaults — do not use directly. */\nexport const UtmContext = createContext<UtmParams | null>(null);\n","/* ============================================================================\n UTM URL Builders\n ============================================================================ */\n\nimport type { UtmParams } from './types';\n\n/** Placeholder origin used internally to parse relative URLs. Never appears in output. */\nconst PLACEHOLDER_ORIGIN = 'https://__placeholder__.internal';\n\n/**\n * Build a URL with UTM parameters appended.\n *\n * - Supports both absolute and relative URLs.\n * - Preserves existing query parameters and hash fragments.\n * - Always emits params in canonical order: source → medium → campaign → term → content.\n * - Omits optional params (term, content) when undefined.\n *\n * @example\n * buildUtmUrl('https://app.sales-mind.ai/register', { source: 'linkedin', medium: 'dm', campaign: 'discoveryCall' })\n * // → 'https://app.sales-mind.ai/register?utm_source=linkedin&utm_medium=dm&utm_campaign=discoveryCall'\n *\n * buildUtmUrl('/pricing', { source: 'website', medium: 'webHome', campaign: 'trial' })\n * // → '/pricing?utm_source=website&utm_medium=webHome&utm_campaign=trial'\n */\nexport function buildUtmUrl(baseUrl: string, params: UtmParams): string {\n const isRelative = baseUrl.startsWith('/');\n\n let url: URL;\n try {\n url = isRelative ? new URL(baseUrl, PLACEHOLDER_ORIGIN) : new URL(baseUrl);\n } catch {\n // If URL parsing fails entirely, return the base URL unchanged.\n return baseUrl;\n }\n\n // Preserve existing params by collecting them first, then clearing and re-adding in order.\n const existingParams: [string, string][] = [];\n url.searchParams.forEach((value, key) => {\n existingParams.push([key, value]);\n });\n\n // Clear all params to rebuild in canonical order.\n for (const [key] of existingParams) {\n url.searchParams.delete(key);\n }\n\n // Re-add existing non-UTM params first.\n for (const [key, value] of existingParams) {\n if (!key.startsWith('utm_')) {\n url.searchParams.set(key, value);\n }\n }\n\n // Append UTM params in canonical order.\n url.searchParams.set('utm_source', params.source);\n url.searchParams.set('utm_medium', params.medium);\n url.searchParams.set('utm_campaign', params.campaign);\n if (params.term !== undefined) {\n url.searchParams.set('utm_term', params.term);\n }\n if (params.content !== undefined) {\n url.searchParams.set('utm_content', params.content);\n }\n\n if (isRelative) {\n // Strip placeholder origin to return a relative path.\n return url.href.replace(PLACEHOLDER_ORIGIN, '');\n }\n\n return url.href;\n}\n","/* ============================================================================\n URL Classification & UTM Enforcement Logic\n ============================================================================\n Determines whether a URL requires UTM parameters based on its type.\n No imports from validators — avoids circular dependency.\n ============================================================================ */\n\nimport type { UrlClassification } from './types';\n\n// ── Patterns ─────────────────────────────────────────────────────────────────\n\n/** Internal domains — UTMs not required for same-origin navigation. */\nconst INTERNAL_PATTERNS = [\n /^\\/(?!\\/)/, // Relative paths\n /^https?:\\/\\/(www\\.)?sales-mind\\.ai/i, // Marketing site\n /^https?:\\/\\/app\\.sales-mind\\.ai/i, // Web app\n /^https?:\\/\\/apps\\.sales-mind\\.ai/i, // Web app (legacy)\n /^https?:\\/\\/meet\\.sales-mind\\.ai/i, // Booking\n /^https?:\\/\\/docs\\.sales-mind\\.ai/i, // Docs\n];\n\n/** System endpoints — never receive UTMs. */\nconst SYSTEM_PATTERNS = [\n /^https?:\\/\\/.*\\/api\\//i, // API endpoints\n /^https?:\\/\\/.*\\/webhook/i, // Webhooks\n /^https?:\\/\\/.*\\/oauth/i, // OAuth callbacks\n /^https?:\\/\\/.*\\/callback/i, // Callbacks\n /^https?:\\/\\/.*\\.supabase\\.(co|com)/i, // Supabase\n /^https?:\\/\\/.*\\.firebaseapp\\.com/i, // Firebase\n /^https?:\\/\\/.*\\.cloudfunctions\\.net/i, // Cloud Functions\n];\n\n/** Static assets — never receive UTMs. */\nconst ASSET_PATTERNS = [\n /\\.(css|js|mjs|map|woff2?|ttf|eot|svg|png|jpe?g|gif|webp|avif|ico|pdf)(\\?.*)?$/i,\n];\n\n/** Conversion destinations — always require UTMs. */\nconst CONVERSION_PATTERNS = [\n /^https?:\\/\\/(www\\.)?calendly\\.com/i,\n /^https?:\\/\\/(checkout\\.)?stripe\\.com/i,\n /^https?:\\/\\/buy\\.stripe\\.com/i,\n /^https?:\\/\\/chromewebstore\\.google\\.com/i,\n /^https?:\\/\\/meet\\.sales-mind\\.ai/i,\n];\n\n/** Protocol-level links — never receive UTMs. */\nconst PROTOCOL_EXEMPT = [\n /^mailto:/i,\n /^tel:/i,\n /^#/,\n /^javascript:/i,\n];\n\n// ── Classification ───────────────────────────────────────────────────────────\n\n/**\n * Classify a URL to determine its type.\n *\n * Classification order (first match wins):\n * 1. Protocol links (mailto, tel, anchor)\n * 2. Static assets\n * 3. System endpoints (API, webhooks, OAuth)\n * 4. Conversion destinations (Calendly, Stripe, Chrome Store)\n * 5. Internal (*.sales-mind.ai)\n * 6. External (everything else)\n */\nexport function classifyUrl(url: string): UrlClassification {\n // Protocol links\n if (PROTOCOL_EXEMPT.some(p => p.test(url))) return 'protocol';\n\n // Static assets\n if (ASSET_PATTERNS.some(p => p.test(url))) return 'asset';\n\n // System endpoints\n if (SYSTEM_PATTERNS.some(p => p.test(url))) return 'system';\n\n // Conversion destinations\n if (CONVERSION_PATTERNS.some(p => p.test(url))) return 'conversion';\n\n // Internal\n if (INTERNAL_PATTERNS.some(p => p.test(url))) return 'internal';\n\n // Everything else is external\n return 'external';\n}\n\n/**\n * Determine whether a URL requires UTM parameters.\n *\n * UTMs are mandatory for:\n * - External third-party destinations\n * - Conversion destinations (Calendly, Stripe, Chrome Web Store)\n *\n * UTMs are NOT required for:\n * - Internal navigation\n * - System endpoints\n * - Static assets\n * - Protocol links\n */\nexport function requiresUtm(url: string): boolean {\n const classification = classifyUrl(url);\n return classification === 'external' || classification === 'conversion';\n}\n\n/**\n * Check if a URL is explicitly exempt from UTM requirements.\n */\nexport function isUtmExempt(url: string): boolean {\n const classification = classifyUrl(url);\n return classification === 'protocol'\n || classification === 'asset'\n || classification === 'system'\n || classification === 'internal';\n}\n","import type { UtmParams } from '../../web/utm/types';\nimport { buildUtmUrl } from '../../web/utm/builders';\nimport { classifyUrl } from '../../web/utm/classifiers';\n\n/**\n * @deprecated Use governed `utmParams` prop on OutboundLink instead.\n * Legacy default source — superseded by governed UTM_SOURCES enum.\n */\nconst LEGACY_UTM_SOURCE = 'salesmind';\n\nconst EXEMPT_PATTERNS = [\n /^https?:\\/\\/(www\\.)?(stripe\\.com|checkout\\.stripe\\.com|paypal\\.com)/i,\n /^https?:\\/\\/(www\\.)?github\\.com\\/login\\/oauth/i,\n];\n\n/**\n * Check if a URL is exempt from UTM tagging.\n * Uses both legacy patterns and governed URL classification.\n */\nexport const isExemptUrl = (urlStr: string): boolean => {\n if (urlStr.startsWith('mailto:') || urlStr.startsWith('tel:')) return true;\n\n // Governed classification: system/protocol/asset URLs are exempt\n const classification = classifyUrl(urlStr);\n if (classification === 'system' || classification === 'protocol' || classification === 'asset') {\n return true;\n }\n\n return EXEMPT_PATTERNS.some(pattern => pattern.test(urlStr));\n};\n\n/**\n * Append governed UTM parameters to a URL using `buildUtmUrl`.\n * Preferred over the legacy `appendUTMs` function.\n */\nexport const appendGovernedUTMs = (\n href: string,\n params: UtmParams,\n preserveExisting = true,\n): string => {\n try {\n const url = new URL(href);\n\n // If preserveExisting and all UTM params are already set, return unchanged\n if (preserveExisting) {\n const hasAll = url.searchParams.has('utm_source')\n && url.searchParams.has('utm_medium')\n && url.searchParams.has('utm_campaign');\n if (hasAll) return href;\n }\n\n return buildUtmUrl(href, params);\n } catch {\n return href;\n }\n};\n\n/**\n * @deprecated Prefer `appendGovernedUTMs` with governed `UtmParams`.\n *\n * Legacy UTM append function. Uses non-governed defaults:\n * - utm_source = 'salesmind' (not in governed enum)\n * - utm_medium = 'outbound_link' (snake_case, not in governed enum)\n *\n * Retained for backward compatibility. Consumers should migrate to\n * the `utmParams` prop on OutboundLink.\n */\nexport const appendUTMs = (\n href: string,\n context: string,\n pageSlug: string,\n options: {\n mediumOverride?: string;\n campaignOverride?: string;\n preserveExisting?: boolean;\n }\n): string => {\n try {\n const url = new URL(href);\n const { mediumOverride = 'outbound_link', campaignOverride, preserveExisting = true } = options;\n\n const utms = {\n utm_source: LEGACY_UTM_SOURCE,\n utm_medium: mediumOverride,\n utm_campaign: campaignOverride || pageSlug,\n utm_content: context,\n };\n\n Object.entries(utms).forEach(([key, value]) => {\n if (value) {\n if (preserveExisting && url.searchParams.has(key)) {\n // Do not override if preserve is true\n return;\n }\n url.searchParams.set(key, value);\n }\n });\n\n return url.toString();\n } catch {\n return href; // Return original if not valid URL (e.g. relative)\n }\n};\n","import React, { forwardRef, useState, useEffect } from 'react';\nimport clsx from 'clsx';\nimport { useMessage } from '../../i18n';\nimport './TableOfContents.css';\n\n/* ============================================================================\n TABLE OF CONTENTS\n ============================================================================\n Sticky article TOC with active heading detection via IntersectionObserver.\n\n Strategic objective: Distribution (increases article dwell time)\n ============================================================================ */\n\n/** A TOC item mapping to a heading */\nexport interface TOCItem {\n /** Heading element ID */\n id: string;\n /** Heading text */\n title: string;\n /** Heading level (2 = h2, 3 = h3, etc.) */\n level: number;\n}\n\nexport interface TableOfContentsProps extends React.HTMLAttributes<HTMLElement> {\n /** TOC items (typically extracted from article headings) */\n items: TOCItem[];\n /** Currently active heading ID (controlled) */\n activeId?: string;\n /** Position variant */\n position?: 'sidebar' | 'inline' | 'floating';\n /** Label text */\n label?: string;\n /** Callback when an item is clicked */\n onItemClick?: (id: string) => void;\n}\n\n/**\n * Sticky table of contents with active heading tracking.\n *\n * @example\n * ```tsx\n * <TableOfContents\n * items={[\n * { id: 'intro', title: 'Introduction', level: 2 },\n * { id: 'setup', title: 'Getting Started', level: 2 },\n * { id: 'config', title: 'Configuration', level: 3 },\n * ]}\n * position=\"sidebar\"\n * />\n * ```\n */\nexport const TableOfContents = forwardRef<HTMLElement, TableOfContentsProps>(\n (\n {\n items,\n activeId: controlledActiveId,\n position = 'sidebar',\n label,\n onItemClick,\n className,\n ...props\n },\n ref,\n ) => {\n const t = useMessage();\n const defaultLabel = t({ id: 'ds.toc.label', defaultMessage: 'On this page' });\n const finalLabel = label || defaultLabel;\n\n const [observedActiveId, setObservedActiveId] = useState<string>('');\n const activeId = controlledActiveId ?? observedActiveId;\n\n // Auto-detect active heading via Scroll Listener (more robust than IO for long sections)\n useEffect(() => {\n if (controlledActiveId !== undefined) return;\n if (items.length === 0) return;\n\n const handleScroll = () => {\n const headingElements = items\n .map((item) => ({\n id: item.id,\n el: document.getElementById(item.id),\n }))\n .filter((h): h is { id: string; el: HTMLElement } => !!h.el);\n\n if (headingElements.length === 0) return;\n\n // Offset for sticky header\n const topOffset = 120; \n\n // Find the first heading that is clearly below the top offset\n const firstBelowIndex = headingElements.findIndex((h) => {\n const rect = h.el.getBoundingClientRect();\n return rect.top > topOffset;\n });\n\n let newActiveId = '';\n if (firstBelowIndex === -1) {\n // All headings are above the offset -> last one is active\n newActiveId = headingElements[headingElements.length - 1].id;\n } else if (firstBelowIndex === 0) {\n // First heading is below offset -> none active (or first if we want to be generous)\n newActiveId = ''; // Or headingElements[0].id\n } else {\n // The heading immediately before the one that is below is the active one\n newActiveId = headingElements[firstBelowIndex - 1].id;\n }\n\n setObservedActiveId(newActiveId);\n };\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n // Initial check\n handleScroll();\n\n return () => window.removeEventListener('scroll', handleScroll);\n }, [items, controlledActiveId]);\n\n const handleClick = (id: string) => {\n const el = document.getElementById(id);\n if (el) {\n el.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n if (onItemClick) onItemClick(id);\n };\n\n if (items.length === 0) return null;\n\n return (\n <nav\n ref={ref}\n className={clsx('ds-toc', `ds-toc--${position}`, className)}\n aria-label={finalLabel}\n {...props}\n >\n <span className=\"ds-toc__label\">{finalLabel}</span>\n <ul className=\"ds-toc__list\">\n {items.map((item) => (\n <li key={item.id} className=\"ds-toc__item\" style={{ paddingLeft: `${(item.level - 2) * 12}px` }}>\n <button\n type=\"button\"\n className={clsx(\n 'ds-toc__link',\n activeId === item.id && 'ds-toc__link--active',\n )}\n onClick={() => handleClick(item.id)}\n >\n {item.title}\n </button>\n </li>\n ))}\n </ul>\n </nav>\n );\n },\n);\n\nTableOfContents.displayName = 'TableOfContents';\n","/**\n * Design System Message Hooks\n *\n * Provides hooks for accessing internationalized messages in components.\n * These hooks are optional - components can still accept string props directly.\n *\n * @example\n * ```tsx\n * import { useMessage, commonMessages } from '@salesmind-ai/design-system';\n *\n * function MyComponent() {\n * const t = useMessage();\n * return <button>{t(commonMessages.save)}</button>;\n * }\n * ```\n */\n\nimport { useIntl, MessageDescriptor, PrimitiveType } from 'react-intl';\nimport { useCallback } from 'react';\n\n/**\n * Format message values type\n */\nexport type MessageValues = Record<string, PrimitiveType>;\n\n/**\n * Hook to get a message formatter function\n *\n * @returns A function that formats messages\n *\n * @example\n * ```tsx\n * const t = useMessage();\n * return <span>{t(commonMessages.loading)}</span>;\n * ```\n */\nexport function useMessage() {\n const intl = useIntl();\n\n const formatMessage = useCallback(\n (descriptor: MessageDescriptor, values?: MessageValues): string => {\n return intl.formatMessage(descriptor, values);\n },\n [intl],\n );\n\n return formatMessage;\n}\n\n/**\n * Hook to get the current locale\n *\n * @returns The current locale string (e.g., 'en', 'fr')\n *\n * @example\n * ```tsx\n * const locale = useLocale();\n * console.log(locale); // 'en'\n * ```\n */\nexport function useLocale(): string {\n const intl = useIntl();\n return intl.locale;\n}\n\n/**\n * Hook to check if RTL is needed for current locale\n *\n * @returns true if the current locale is RTL\n *\n * @example\n * ```tsx\n * const isRTL = useIsRTL();\n * return <div style={{ direction: isRTL ? 'rtl' : 'ltr' }}>...</div>;\n * ```\n */\nexport function useIsRTL(): boolean {\n const locale = useLocale();\n\n // RTL locales\n const rtlLocales = [\n 'ar', // Arabic\n 'he', // Hebrew\n 'fa', // Persian/Farsi\n 'ur', // Urdu\n 'ps', // Pashto\n 'sd', // Sindhi\n 'yi', // Yiddish\n ];\n\n return rtlLocales.some((rtl) => locale === rtl || locale.startsWith(`${rtl}-`));\n}\n\n/**\n * Hook to get the current text direction\n *\n * @returns 'rtl' or 'ltr' based on locale\n *\n * @example\n * ```tsx\n * const dir = useTextDirection();\n * return <div dir={dir}>...</div>;\n * ```\n */\nexport function useTextDirection(): 'rtl' | 'ltr' {\n const isRTL = useIsRTL();\n return isRTL ? 'rtl' : 'ltr';\n}\n\n/**\n * Hook to format a number according to locale\n *\n * @returns A number formatter function\n *\n * @example\n * ```tsx\n * const formatNumber = useNumberFormat();\n * return <span>{formatNumber(1234.56)}</span>; // \"1,234.56\" in en-US\n * ```\n */\nexport function useNumberFormat() {\n const intl = useIntl();\n\n const formatNumber = useCallback(\n (value: number, options?: Intl.NumberFormatOptions): string => {\n return intl.formatNumber(value, options as Parameters<typeof intl.formatNumber>[1]);\n },\n [intl],\n );\n\n return formatNumber;\n}\n\n/**\n * Hook to format a date according to locale\n *\n * @returns A date formatter function\n *\n * @example\n * ```tsx\n * const formatDate = useDateFormat();\n * return <span>{formatDate(new Date())}</span>;\n * ```\n */\nexport function useDateFormat() {\n const intl = useIntl();\n\n const formatDate = useCallback(\n (value: Date | number, options?: Intl.DateTimeFormatOptions): string => {\n return intl.formatDate(value, options);\n },\n [intl],\n );\n\n return formatDate;\n}\n\n/**\n * Hook to format a relative time (e.g., \"2 days ago\")\n *\n * @returns A relative time formatter function\n *\n * @example\n * ```tsx\n * const formatRelative = useRelativeTime();\n * return <span>{formatRelative(-2, 'day')}</span>; // \"2 days ago\"\n * ```\n */\nexport function useRelativeTime() {\n const intl = useIntl();\n\n const formatRelativeTime = useCallback(\n (\n value: number,\n unit: Intl.RelativeTimeFormatUnit,\n options?: Intl.RelativeTimeFormatOptions,\n ): string => {\n return intl.formatRelativeTime(value, unit, options as Parameters<typeof intl.formatRelativeTime>[2]);\n },\n [intl],\n );\n\n return formatRelativeTime;\n}\n","/**\n * Design System Internationalization Module\n *\n * Provides i18n infrastructure for design system components.\n *\n * @module i18n\n */\n\n// Provider\nexport { DSIntlProvider, type DSIntlProviderProps } from './IntlProvider';\n\n// Hooks\nexport {\n useMessage,\n useLocale,\n useIsRTL,\n useTextDirection,\n useNumberFormat,\n useDateFormat,\n useRelativeTime,\n type MessageValues,\n} from './useMessage';\n\n// Messages\nexport {\n commonMessages,\n alertMessages,\n toastMessages,\n dialogMessages,\n formMessages,\n authMessages,\n navigationMessages,\n reportMessages,\n appearanceMessages,\n paginationMessages,\n calendarMessages,\n carouselMessages,\n methodologyMessages,\n allMessages,\n} from './messages';\n\n// Re-export react-intl types for convenience\nexport type { MessageDescriptor } from 'react-intl';\nexport { defineMessages, FormattedMessage, FormattedNumber, FormattedDate } from 'react-intl';\n","import React, { useEffect, useState, useRef } from 'react';\nimport clsx from 'clsx';\nimport './ReadingProgress.css';\n\nexport interface ReadingProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Reference to the container element whose scroll progress we're tracking */\n targetRef?: React.RefObject<HTMLElement | null>;\n}\n\nexport const ReadingProgress = React.forwardRef<HTMLDivElement, ReadingProgressProps>(\n ({ targetRef, className, ...props }, ref) => {\n const [progress, setProgress] = useState(0);\n const frameRef = useRef<number | null>(null);\n\n useEffect(() => {\n const handleScroll = () => {\n if (frameRef.current) cancelAnimationFrame(frameRef.current);\n\n frameRef.current = requestAnimationFrame(() => {\n let percentage = 0;\n\n if (targetRef && targetRef.current) {\n // Calculate progress relative to the specific container\n const el = targetRef.current;\n const rect = el.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n \n // If top is below viewport, 0%. If bottom is above viewport, 100%.\n if (rect.top > viewportHeight) {\n percentage = 0;\n } else if (rect.bottom < 0) {\n percentage = 100;\n } else {\n const scrollableDistance = rect.height - viewportHeight;\n if (scrollableDistance <= 0) {\n percentage = 100; // Fits entirely on screen\n } else {\n const scrolled = viewportHeight - rect.top;\n percentage = Math.max(0, Math.min(100, (scrolled / scrollableDistance) * 100));\n }\n }\n } else {\n // Fallback to full page scroll\n const scrollPosition = window.scrollY;\n const scrollHeight = document.body.scrollHeight - window.innerHeight;\n percentage = scrollHeight > 0 ? (scrollPosition / scrollHeight) * 100 : 0;\n percentage = Math.max(0, Math.min(100, percentage));\n }\n\n setProgress(percentage);\n });\n };\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n window.addEventListener('resize', handleScroll, { passive: true });\n \n // Initial calculation\n handleScroll();\n\n return () => {\n if (frameRef.current) cancelAnimationFrame(frameRef.current);\n window.removeEventListener('scroll', handleScroll);\n window.removeEventListener('resize', handleScroll);\n };\n }, [targetRef]);\n\n return (\n <div \n ref={ref} \n className={clsx('ds-reading-progress', className)} \n {...props}\n >\n <div \n className=\"ds-reading-progress__bar\" \n style={{ transform: `scaleX(${progress / 100})` }} \n />\n </div>\n );\n }\n);\nReadingProgress.displayName = 'ReadingProgress';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './LongFormLayout.css';\n\nexport interface LongFormLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Pass the TOC element here to render as a sticky sidebar on desktop */\n sidebar?: React.ReactNode;\n}\n\n/**\n * A layout primitive designed specifically for long-form content (e.g., blog posts, documentation).\n * Enforces maximum reading widths and manages the relationship between the main content and an optional sticky sidebar.\n */\nexport const LongFormLayout = React.forwardRef<HTMLDivElement, LongFormLayoutProps>(\n ({ children, sidebar, className, ...props }, ref) => {\n return (\n <div ref={ref} className={clsx('ds-longform-layout', className)} {...props}>\n <article className=\"ds-longform-layout__main\">{children}</article>\n {sidebar && <aside className=\"ds-longform-layout__sidebar\">{sidebar}</aside>}\n </div>\n );\n }\n);\n\nLongFormLayout.displayName = 'LongFormLayout';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './LongFormComponents.css';\n\nexport interface InsightCalloutProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n icon?: React.ReactNode;\n title?: string;\n}\n\nexport const InsightCallout = React.forwardRef<HTMLDivElement, InsightCalloutProps>(\n ({ children, icon, title, className, ...props }, ref) => {\n return (\n <aside ref={ref} className={clsx('ds-insight-callout', className)} {...props}>\n {icon && <div className=\"ds-insight-callout__icon\">{icon}</div>}\n <div className=\"ds-insight-callout__content\">\n {title && <h5 className=\"ds-insight-callout__title\">{title}</h5>}\n {children}\n </div>\n </aside>\n );\n }\n);\nInsightCallout.displayName = 'InsightCallout';\n\nexport interface DataHighlightProps extends React.HTMLAttributes<HTMLDivElement> {\n stat: string;\n label: string;\n children?: React.ReactNode;\n}\n\nexport const DataHighlight = React.forwardRef<HTMLDivElement, DataHighlightProps>(\n ({ stat, label, children, className, ...props }, ref) => {\n return (\n <figure ref={ref} className={clsx('ds-data-highlight', className)} {...props}>\n <div className=\"ds-data-highlight__stat-group\">\n <span className=\"ds-data-highlight__stat\">{stat}</span>\n <span className=\"ds-data-highlight__label\">{label}</span>\n </div>\n {children && <figcaption className=\"ds-data-highlight__caption\">{children}</figcaption>}\n </figure>\n );\n }\n);\nDataHighlight.displayName = 'DataHighlight';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { useAnalytics } from '../../web/analytics/use-analytics';\nimport { ArrowRight, Clock, FileText } from 'lucide-react';\nimport { OutboundLink } from '../OutboundLink/OutboundLink';\nimport './ArticleCard.css';\n\nexport interface ArticleCardProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n /** Target URL */\n href: string;\n /** Article title */\n title: string;\n /** Short excerpt or description */\n excerpt: string;\n /** Image URL for the thumbnail */\n imageUrl?: string;\n /** Image alt text */\n imageAlt?: string;\n /** Category or tag label */\n category?: string;\n /** Publication date */\n date?: string;\n /** Reading time in minutes */\n readingTime?: number;\n /** Author name */\n author?: string;\n /** Variant for different grid layouts */\n variant?: 'vertical' | 'horizontal' | 'featured';\n}\n\n/**\n * Standardized card for blog posts, resources, and case studies.\n * Acts as a block-level link.\n */\nexport const ArticleCard = forwardRef<HTMLAnchorElement, ArticleCardProps>(\n (\n {\n href,\n title,\n excerpt,\n imageUrl,\n imageAlt = '',\n category,\n date,\n readingTime,\n author,\n variant = 'vertical',\n className,\n onClick,\n ...props\n },\n ref\n ) => {\n const { track } = useAnalytics();\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n track('article_click', { url: href, title, category });\n if (onClick) onClick(e);\n };\n\n return (\n <OutboundLink\n ref={ref}\n href={href}\n context=\"article-card\"\n className={clsx(\n 'ds-article-card',\n `ds-article-card--${variant}`,\n !imageUrl && 'ds-article-card--no-image',\n className\n )}\n onClick={handleClick}\n {...props}\n >\n {imageUrl ? (\n <div className=\"ds-article-card__image-wrapper\">\n <img \n src={imageUrl} \n alt={imageAlt} \n className=\"ds-article-card__image\" \n loading=\"lazy\" \n />\n {category && (\n <span className=\"ds-article-card__category-badge\">{category}</span>\n )}\n </div>\n ) : (\n <div className=\"ds-article-card__placeholder\">\n <FileText className=\"ds-article-card__placeholder-icon\" aria-hidden=\"true\" />\n {category && (\n <span className=\"ds-article-card__category-badge\">{category}</span>\n )}\n </div>\n )}\n \n <div className=\"ds-article-card__content\">\n \n <h3 className=\"ds-article-card__title\">{title}</h3>\n <p className=\"ds-article-card__excerpt\">{excerpt}</p>\n \n <div className=\"ds-article-card__meta\">\n {(date || author) && (\n <div className=\"ds-article-card__meta-primary\">\n {author && <span className=\"ds-article-card__author\">{author}</span>}\n {author && date && <span className=\"ds-article-card__dot\" aria-hidden=\"true\">•</span>}\n {date && <time dateTime={date} className=\"ds-article-card__date\">{date}</time>}\n </div>\n )}\n \n {readingTime && (\n <div className=\"ds-article-card__meta-secondary\">\n <Clock size={14} aria-hidden=\"true\" />\n <span>{readingTime} min read</span>\n </div>\n )}\n </div>\n \n <div className=\"ds-article-card__footer\">\n <span className=\"ds-article-card__read-more\">\n Read article\n <ArrowRight size={16} className=\"ds-article-card__arrow\" />\n </span>\n </div>\n </div>\n </OutboundLink>\n );\n }\n);\n\nArticleCard.displayName = 'ArticleCard';\n","\"use client\";\nimport { useContext } from 'react';\nimport { AnalyticsContext } from './analytics-context';\nimport type { AnalyticsContextValue } from './analytics-context';\n\nconst NOOP_VALUE: AnalyticsContextValue = {\n track: () => {\n /* no-op when no provider is present */\n },\n};\n\n/**\n * Access the analytics tracking interface.\n * Returns a no-op tracker when used outside an AnalyticsProvider —\n * components never need to guard against missing providers.\n *\n * @example\n * ```tsx\n * const { track } = useAnalytics();\n * track('form_submit', { form: 'lead-capture', email: true });\n * ```\n */\nexport function useAnalytics(): AnalyticsContextValue {\n return useContext(AnalyticsContext) ?? NOOP_VALUE;\n}\n","import { createContext } from 'react';\n\n/* ============================================================================\n ANALYTICS CONTEXT — Shared types & context object\n ============================================================================ */\n\n/** Arbitrary properties bag attached to every analytics event. */\nexport type AnalyticsEventProps = Record<string, string | number | boolean | undefined>;\n\n/** Signature for the track function provided by AnalyticsProvider. */\nexport type TrackFn = (event: string, props?: AnalyticsEventProps) => void;\n\n/** Value exposed by the AnalyticsContext. */\nexport interface AnalyticsContextValue {\n track: TrackFn;\n}\n\n/**\n * React context for analytics event tracking.\n * When no provider is present the value is `null` — consumers should\n * fall back to a no-op so components remain safe in Storybook / tests / SSR.\n */\nexport const AnalyticsContext = createContext<AnalyticsContextValue | null>(null);\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { useAnalytics } from '../../web/analytics/use-analytics';\nimport './ArticleLayout.css';\n\nexport interface ArticleLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The main content of the article */\n children: React.ReactNode;\n /** Article title */\n title: string;\n /** Author name */\n author?: React.ReactNode;\n /** Publish date */\n date?: React.ReactNode;\n /** Main hero image */\n heroImage?: string;\n /** Sidebar content (like TOC or related articles) */\n sidebar?: React.ReactNode;\n}\n\n/**\n * Standardized layout for long-form content (blog posts, resources, case studies).\n * Handles responsive wrapping, prose width constraints, and sidebar positioning.\n */\nexport const ArticleLayout = forwardRef<HTMLDivElement, ArticleLayoutProps>(\n (\n {\n children,\n title,\n author,\n date,\n heroImage,\n sidebar,\n className,\n ...props\n },\n ref\n ) => {\n // Add scroll tracking\n const { track } = useAnalytics();\n \n React.useEffect(() => {\n let maxScroll = 0;\n \n const handleScroll = () => {\n const docHeight = document.documentElement.scrollHeight - window.innerHeight;\n if (docHeight > 0) {\n const scrollPercent = Math.round((window.scrollY / docHeight) * 100);\n \n if (scrollPercent > maxScroll) {\n maxScroll = scrollPercent;\n \n // Track milestones\n if (maxScroll === 25) track('article_scroll', { milestone: 25 });\n if (maxScroll === 50) track('article_scroll', { milestone: 50 });\n if (maxScroll === 75) track('article_scroll', { milestone: 75 });\n if (maxScroll === 100) track('article_scroll', { milestone: 100 });\n }\n }\n };\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n return () => window.removeEventListener('scroll', handleScroll);\n }, [track]);\n\n return (\n <article\n ref={ref}\n className={clsx('ds-article-layout', className)}\n {...props}\n >\n <header className=\"ds-article-layout__header\">\n <h1 className=\"ds-article-layout__title\">{title}</h1>\n \n {(author || date) && (\n <div className=\"ds-article-layout__meta\">\n {author && <div className=\"ds-article-layout__author\">{author}</div>}\n {author && date && <span className=\"ds-article-layout__dot\" aria-hidden=\"true\">•</span>}\n {date && <time className=\"ds-article-layout__date\">{date}</time>}\n </div>\n )}\n </header>\n\n {heroImage && (\n <div className=\"ds-article-layout__hero\">\n <img src={heroImage} alt=\"\" aria-hidden=\"true\" />\n </div>\n )}\n\n <div className={clsx(\n 'ds-article-layout__body',\n sidebar && 'ds-article-layout__body--with-sidebar'\n )}>\n <div className=\"ds-article-layout__content ds-prose\">\n {children}\n </div>\n \n {sidebar && (\n <aside className=\"ds-article-layout__sidebar\">\n <div className=\"ds-article-layout__sidebar-inner\">\n {sidebar}\n </div>\n </aside>\n )}\n </div>\n </article>\n );\n }\n);\n\nArticleLayout.displayName = 'ArticleLayout';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { SectionShell, type SectionShellProps } from '../SectionShell/SectionShell';\nimport { SectionHeader } from '../SectionShell/SectionShell';\nimport { ArticleCard, type ArticleCardProps } from '../ArticleCard/ArticleCard';\nimport './RelatedContent.css';\n\n/* ============================================================================\n RELATED CONTENT\n ============================================================================\n Related articles/resources section. Drives internal linking and increases\n session duration.\n\n Strategic objective: Distribution (internal linking + session depth)\n ============================================================================ */\n\nexport interface RelatedContentProps extends Omit<SectionShellProps, 'title'> {\n /** Section eyebrow */\n eyebrow?: React.ReactNode;\n /** Section title */\n title?: React.ReactNode;\n /** Related article items (uses ArticleCard props) */\n items: ArticleCardProps[];\n /** Max items to display */\n maxVisible?: number;\n}\n\n/**\n * Related articles section using ArticleCard grid.\n *\n * @example\n * ```tsx\n * <RelatedContent\n * title=\"Related Articles\"\n * items={[\n * { title: 'AI Outreach Guide', href: '/blog/ai-outreach', ... },\n * { title: 'Pipeline Automation', href: '/blog/pipeline', ... },\n * ]}\n * background=\"muted\"\n * />\n * ```\n */\nexport const RelatedContent = forwardRef<HTMLDivElement, RelatedContentProps>(\n (\n {\n eyebrow,\n title = 'Related Articles',\n items,\n maxVisible,\n className,\n ...props\n },\n ref,\n ) => {\n const visibleItems = maxVisible ? items.slice(0, maxVisible) : items;\n\n if (visibleItems.length === 0) return null;\n\n return (\n <SectionShell\n ref={ref}\n className={clsx('ds-related-content', className)}\n background=\"muted\"\n {...props}\n >\n <SectionHeader eyebrow={eyebrow} title={title} />\n\n <div className=\"ds-related-content__grid\">\n {visibleItems.map((item, i) => (\n <ArticleCard key={i} {...item} />\n ))}\n </div>\n </SectionShell>\n );\n },\n);\n\nRelatedContent.displayName = 'RelatedContent';\n","import React, { forwardRef, HTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { Container } from '../LayoutPrimitives';\nimport './SectionShell.css';\n\n/* ============================================================================\n Section Header Component\n ============================================================================ */\n\nexport interface SectionHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n eyebrow?: React.ReactNode;\n align?: 'left' | 'center' | 'right';\n}\n\nexport const SectionHeader = forwardRef<HTMLDivElement, SectionHeaderProps>(\n ({ title, subtitle, eyebrow, align = 'center', className, ...props }, ref) => {\n if (!title && !subtitle && !eyebrow) return null;\n\n return (\n <header\n ref={ref}\n className={clsx('ds-section-header', `ds-section-header--${align}`, className)}\n {...props}\n >\n {eyebrow && <span className=\"ds-section-header__eyebrow\">{eyebrow}</span>}\n {title && <h2 className=\"ds-section-header__title\">{title}</h2>}\n {subtitle && <p className=\"ds-section-header__subtitle\">{subtitle}</p>}\n </header>\n );\n },\n);\nSectionHeader.displayName = 'SectionHeader';\n\n/* ============================================================================\n Section Shell Component\n ============================================================================ */\n\nexport interface SectionShellProps extends HTMLAttributes<HTMLDivElement> {\n background?: 'default' | 'muted' | 'brand' | 'transparent';\n padding?: 'none' | 'sm' | 'md' | 'lg';\n containerSize?: 'sm' | 'md' | 'lg' | 'xl' | 'fluid'; // Maps to Container max-width\n containerFluid?: boolean;\n}\n\nexport const SectionShell = forwardRef<HTMLDivElement, SectionShellProps>(\n (\n {\n className,\n children,\n background = 'default',\n padding = 'md',\n containerSize,\n containerFluid = false,\n ...props\n },\n ref,\n ) => {\n return (\n <section\n ref={ref}\n className={clsx(\n 'ds-section',\n `ds-section--bg-${background}`,\n `ds-section--padding-${padding}`,\n className,\n )}\n {...props}\n >\n <Container\n size={containerSize === 'fluid' ? 'full' : (containerSize as 'sm' | 'md' | 'lg' | 'xl' | undefined)}\n fluid={containerFluid || containerSize === 'fluid'}\n >\n {children}\n </Container>\n </section>\n );\n },\n);\nSectionShell.displayName = 'SectionShell';\n","import { ElementType, HTMLAttributes, forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { SpacingProps, extractSpacingStyles } from './utils';\nimport './LayoutPrimitives.css';\n\nexport interface BoxProps extends HTMLAttributes<HTMLElement>, SpacingProps {\n as?: ElementType;\n}\n\nexport const Box = forwardRef<HTMLElement, BoxProps>(\n ({ as: Component = 'div', className, style, children, ...props }, ref) => {\n const spacingStyles = extractSpacingStyles(props);\n\n // Filter out spacing props from passing to DOM\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { m, mt, mb, ml, mr, mx, my, p, pt, pb, pl, pr, px, py, gap, ...domProps } = props;\n\n return (\n <Component\n ref={ref}\n className={clsx('ds-box', className)}\n style={{ ...spacingStyles, ...style }}\n {...domProps}\n >\n {children}\n </Component>\n );\n },\n);\n\nBox.displayName = 'Box';\n","export const SPACING = {\n 1: 'var(--space-1)',\n 2: 'var(--space-2)',\n 3: 'var(--space-3)',\n 4: 'var(--space-4)',\n 5: 'var(--space-5)',\n 6: 'var(--space-6)',\n 8: 'var(--space-8)',\n 10: 'var(--space-10)',\n 12: 'var(--space-12)',\n 16: 'var(--space-16)',\n 20: 'var(--space-20)',\n} as const;\n\nexport type SpacingToken = keyof typeof SPACING;\n","import { CSSProperties } from 'react';\nimport { SPACING } from '../../tokens/spacing';\n\ntype SpacingValue = keyof typeof SPACING | number | string;\n\n/**\n * Named spacing aliases that map semantic sizes to DS space tokens.\n * Allows consumers to pass gap=\"lg\" instead of gap={6}.\n */\nconst SPACING_ALIASES: Record<string, string> = {\n xs: 'var(--space-2)',\n sm: 'var(--space-3)',\n md: 'var(--space-4)',\n lg: 'var(--space-6)',\n xl: 'var(--space-8)',\n '2xl': 'var(--space-12)',\n};\n\nexport function resolveSpacing(value: SpacingValue | undefined): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value === 'number' && SPACING[value as keyof typeof SPACING]) {\n return SPACING[value as keyof typeof SPACING];\n }\n if (typeof value === 'string' && value in SPACING_ALIASES) {\n return SPACING_ALIASES[value];\n }\n return String(value);\n}\n\nexport interface SpacingProps {\n m?: SpacingValue;\n mt?: SpacingValue;\n mb?: SpacingValue;\n ml?: SpacingValue;\n mr?: SpacingValue;\n mx?: SpacingValue;\n my?: SpacingValue;\n p?: SpacingValue;\n pt?: SpacingValue;\n pb?: SpacingValue;\n pl?: SpacingValue;\n pr?: SpacingValue;\n px?: SpacingValue;\n py?: SpacingValue;\n gap?: SpacingValue;\n}\n\nexport function extractSpacingStyles(props: SpacingProps): CSSProperties {\n const styles: CSSProperties = {};\n\n if (props.m !== undefined) styles.margin = resolveSpacing(props.m);\n if (props.mt !== undefined) styles.marginTop = resolveSpacing(props.mt);\n if (props.mb !== undefined) styles.marginBottom = resolveSpacing(props.mb);\n if (props.ml !== undefined) styles.marginLeft = resolveSpacing(props.ml);\n if (props.mr !== undefined) styles.marginRight = resolveSpacing(props.mr);\n if (props.mx !== undefined) {\n styles.marginLeft = resolveSpacing(props.mx);\n styles.marginRight = resolveSpacing(props.mx);\n }\n if (props.my !== undefined) {\n styles.marginTop = resolveSpacing(props.my);\n styles.marginBottom = resolveSpacing(props.my);\n }\n\n if (props.p !== undefined) styles.padding = resolveSpacing(props.p);\n if (props.pt !== undefined) styles.paddingTop = resolveSpacing(props.pt);\n if (props.pb !== undefined) styles.paddingBottom = resolveSpacing(props.pb);\n if (props.pl !== undefined) styles.paddingLeft = resolveSpacing(props.pl);\n if (props.pr !== undefined) styles.paddingRight = resolveSpacing(props.pr);\n if (props.px !== undefined) {\n styles.paddingLeft = resolveSpacing(props.px);\n styles.paddingRight = resolveSpacing(props.px);\n }\n if (props.py !== undefined) {\n styles.paddingTop = resolveSpacing(props.py);\n styles.paddingBottom = resolveSpacing(props.py);\n }\n\n if (props.gap !== undefined) styles.gap = resolveSpacing(props.gap);\n\n return styles;\n}\n","import { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { Box, BoxProps } from './Box';\n\nexport type ContainerSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n/**\n * Maps named sizes to max-width values.\n * Aligns with common web breakpoints (Tailwind `max-w-*` scale).\n */\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CONTAINER_SIZE_MAP: Record<ContainerSize, string> = {\n sm: '768px', // 48rem — max-w-3xl\n md: '1024px', // 64rem — max-w-5xl\n lg: '1152px', // 72rem — max-w-6xl\n xl: '1280px', // 80rem — max-w-7xl\n full: '100%',\n};\n\nexport interface ContainerProps extends BoxProps {\n /**\n * Named size preset. Overrides `maxWidth` when set.\n * @example <Container size=\"lg\">…</Container>\n */\n size?: ContainerSize;\n /** Pass `true` to stretch to 100% width (same as `size=\"full\"`). */\n fluid?: boolean;\n /** Custom max-width value. Ignored when `size` or `fluid` is set. */\n maxWidth?: number | string;\n}\n\nexport const Container = forwardRef<HTMLElement, ContainerProps>(\n ({ size, fluid, maxWidth, className, style, ...props }, ref) => {\n let resolvedMaxWidth: string | number;\n if (fluid) {\n resolvedMaxWidth = '100%';\n } else if (size) {\n resolvedMaxWidth = CONTAINER_SIZE_MAP[size];\n } else {\n resolvedMaxWidth = maxWidth || 'var(--container-default-max, 1200px)';\n }\n\n return (\n <Box\n ref={ref}\n className={clsx('ds-container', className)}\n style={{\n maxWidth: resolvedMaxWidth,\n ...style,\n }}\n {...props}\n />\n );\n },\n);\n\nContainer.displayName = 'Container';\n","import React, { useState } from 'react';\nimport clsx from 'clsx';\nimport { OutboundLink } from '../OutboundLink/OutboundLink';\nimport './VersionedContent.css';\n\n// ============================================================================\n// VersionedUpgradeAlert\n// =============================================================================\n\nexport interface VersionedUpgradeAlertProps extends React.HTMLAttributes<HTMLDivElement> {\n seriesName: string;\n viewedYear: number;\n latestYear: number;\n latestUrl: string;\n deltaSummary?: string;\n}\n\nexport const VersionedUpgradeAlert = React.forwardRef<HTMLDivElement, VersionedUpgradeAlertProps>(\n ({ seriesName, viewedYear, latestYear, latestUrl, deltaSummary, className, ...props }, ref) => {\n const [dismissed, setDismissed] = useState(false);\n\n if (dismissed) return null;\n\n return (\n <div \n ref={ref} \n className={clsx('ds-versioned-alert', className)} \n role=\"alert\"\n {...props}\n >\n <div className=\"ds-versioned-alert__content\">\n <span className=\"ds-versioned-alert__icon\">⚠️</span>\n <div className=\"ds-versioned-alert__text\">\n <strong>Outdated Edition:</strong> You are viewing the {viewedYear} edition of {seriesName}. \n The <strong>{latestYear} edition</strong> is now available.\n {deltaSummary && <span className=\"ds-versioned-alert__delta\"> {deltaSummary}</span>}\n </div>\n </div>\n <div className=\"ds-versioned-alert__actions\">\n <OutboundLink href={latestUrl} context=\"versioned-alert-view-latest\" className=\"ds-versioned-alert__button ds-button ds-button--primary ds-button--sm\" openInNewTab={false}>\n View {latestYear} Edition\n </OutboundLink>\n <button \n className=\"ds-versioned-alert__close\" \n onClick={() => setDismissed(true)}\n aria-label=\"Dismiss alert\"\n >\n ×\n </button>\n </div>\n </div>\n );\n }\n);\nVersionedUpgradeAlert.displayName = 'VersionedUpgradeAlert';\n\n// ============================================================================\n// VersionedSeriesNavigator\n// =============================================================================\n\nexport interface SeriesEdition {\n year: number;\n url: string;\n isCurrent: boolean;\n}\n\nexport interface VersionedSeriesNavigatorProps extends React.HTMLAttributes<HTMLDivElement> {\n seriesName: string;\n hubUrl: string;\n editions: SeriesEdition[];\n}\n\nexport const VersionedSeriesNavigator = React.forwardRef<HTMLDivElement, VersionedSeriesNavigatorProps>(\n ({ seriesName, hubUrl, editions, className, ...props }, ref) => {\n const sortedEditions = [...editions].sort((a, b) => a.year - b.year);\n \n return (\n <div ref={ref} className={clsx('ds-versioned-navigator', className)} {...props}>\n <div className=\"ds-versioned-navigator__header\">\n <span className=\"ds-versioned-navigator__label\">Series</span>\n <OutboundLink href={hubUrl} context=\"versioned-navigator-hub\" className=\"ds-versioned-navigator__title\" openInNewTab={false}>{seriesName} Hub</OutboundLink>\n </div>\n \n <div className=\"ds-versioned-navigator__timeline\">\n {sortedEditions.map((edition, idx) => (\n <React.Fragment key={edition.year}>\n {idx > 0 && <div className=\"ds-versioned-navigator__connector\" />}\n <OutboundLink\n href={edition.url}\n context=\"versioned-navigator-edition\"\n className={clsx(\n 'ds-versioned-navigator__node',\n edition.isCurrent && 'ds-versioned-navigator__node--active'\n )}\n aria-current={edition.isCurrent ? 'page' : undefined}\n openInNewTab={false}\n >\n {edition.year}\n </OutboundLink>\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n }\n);\nVersionedSeriesNavigator.displayName = 'VersionedSeriesNavigator';\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport './BrowserFrame.css';\n\n/* ============================================================================\n BROWSER FRAME\n ============================================================================\n Realistic browser/device mockup frame for product screenshots and videos.\n Makes static screenshots feel like live product demos.\n\n Strategic objective: Trust (product visualization builds desire)\n ============================================================================ */\n\nexport interface BrowserFrameProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Frame type */\n variant?: 'browser' | 'app' | 'mobile' | 'minimal';\n /** Content to frame (image, video, or React element) */\n children: React.ReactNode;\n /** Optional URL bar text */\n url?: string;\n /** Show traffic light dots (default: true for browser/app) */\n showControls?: boolean;\n /** Optional glow effect behind frame */\n withGlow?: boolean;\n /** Aspect ratio */\n aspectRatio?: '16/9' | '4/3' | '3/2' | 'auto';\n}\n\n/**\n * Device mockup frame for product screenshots.\n *\n * @example\n * ```tsx\n * <BrowserFrame variant=\"browser\" url=\"app.sales-mind.ai\" withGlow>\n * <img src=\"/screenshot.png\" alt=\"SalesMind dashboard\" />\n * </BrowserFrame>\n * ```\n */\nexport const BrowserFrame = forwardRef<HTMLDivElement, BrowserFrameProps>(\n (\n {\n variant = 'browser',\n children,\n url,\n showControls,\n withGlow = false,\n aspectRatio = '16/9',\n className,\n ...props\n },\n ref,\n ) => {\n const hasControls = showControls ?? (variant === 'browser' || variant === 'app');\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-browser-frame',\n `ds-browser-frame--${variant}`,\n withGlow && 'ds-browser-frame--glow',\n className,\n )}\n {...props}\n >\n {/* Chrome header */}\n {variant !== 'minimal' && (\n <div className=\"ds-browser-frame__chrome\">\n {hasControls && (\n <div className=\"ds-browser-frame__controls\" aria-hidden=\"true\">\n <span className=\"ds-browser-frame__dot ds-browser-frame__dot--red\" />\n <span className=\"ds-browser-frame__dot ds-browser-frame__dot--yellow\" />\n <span className=\"ds-browser-frame__dot ds-browser-frame__dot--green\" />\n </div>\n )}\n {variant === 'browser' && url && (\n <div className=\"ds-browser-frame__url-bar\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\" className=\"ds-browser-frame__lock\">\n <path d=\"M3 5V4a3 3 0 116 0v1\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <rect x=\"2\" y=\"5\" width=\"8\" height=\"6\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n <span className=\"ds-browser-frame__url-text\">{url}</span>\n </div>\n )}\n </div>\n )}\n\n {/* Content area */}\n <div\n className=\"ds-browser-frame__content\"\n style={aspectRatio !== 'auto' ? { aspectRatio } : undefined}\n >\n {children}\n </div>\n\n {/* Mobile notch */}\n {variant === 'mobile' && (\n <div className=\"ds-browser-frame__notch\" aria-hidden=\"true\" />\n )}\n </div>\n );\n },\n);\n\nBrowserFrame.displayName = 'BrowserFrame';\n"]}