@salesmind-ai/design-system 1.2.0 → 1.4.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.
@@ -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 SoftwareApplicationSchemaOptions,\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 */\n// Returns either `pathOrUrl` as-is (when it is an absolute http(s) URL) or\n// concatenated to `brand.url`. Defensive against callers that pass an absolute\n// URL where a relative path is expected — prevents the doubled-prefix bug\n// `https://brand.aihttps://brand.ai/page#anchor`.\nfunction normalizeEntityPath(brandUrl: string, pathOrUrl: string): string {\n if (/^https?:\\/\\//i.test(pathOrUrl)) return pathOrUrl;\n return `${brandUrl}${pathOrUrl}`;\n}\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) => `${normalizeEntityPath(brand.url, path)}#webpage`,\n article: (path: string) => `${normalizeEntityPath(brand.url, path)}#article`,\n faq: (path: string) => `${normalizeEntityPath(brand.url, path)}#faq`,\n breadcrumb: (path: string) => `${normalizeEntityPath(brand.url, path)}#breadcrumb`,\n person: (slug: string) => `${brand.url}/company/team#person-${slug}`,\n video: (path: string) => `${normalizeEntityPath(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 options: SoftwareApplicationSchemaOptions = {},\n ) {\n const aggregateRating = options.aggregateRating ?? brand.aggregateRating;\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 ...(aggregateRating\n ? {\n aggregateRating: {\n '@type': 'AggregateRating',\n ratingValue: String(aggregateRating.ratingValue),\n ratingCount: String(aggregateRating.reviewCount),\n bestRating: String(aggregateRating.bestRating ?? 5),\n worstRating: String(aggregateRating.worstRating ?? 1),\n },\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"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk2VVRZBUR_cjs = require('../../chunk-2VVRZBUR.cjs');
4
+ var chunkDXFMZ4ME_cjs = require('../../chunk-DXFMZ4ME.cjs');
5
5
  require('../../chunk-7EUR3AKV.cjs');
6
6
  var chunkVC5LMUVQ_cjs = require('../../chunk-VC5LMUVQ.cjs');
7
7
  require('../../chunk-LJADZITX.cjs');
@@ -10,35 +10,39 @@ require('../../chunk-LJADZITX.cjs');
10
10
 
11
11
  Object.defineProperty(exports, "AnalyticsProvider", {
12
12
  enumerable: true,
13
- get: function () { return chunk2VVRZBUR_cjs.AnalyticsProvider; }
13
+ get: function () { return chunkDXFMZ4ME_cjs.AnalyticsProvider; }
14
14
  });
15
15
  Object.defineProperty(exports, "COOKIE_CONSENT_EVENT", {
16
16
  enumerable: true,
17
- get: function () { return chunk2VVRZBUR_cjs.COOKIE_CONSENT_EVENT; }
17
+ get: function () { return chunkDXFMZ4ME_cjs.COOKIE_CONSENT_EVENT; }
18
18
  });
19
19
  Object.defineProperty(exports, "COOKIE_CONSENT_KEY", {
20
20
  enumerable: true,
21
- get: function () { return chunk2VVRZBUR_cjs.COOKIE_CONSENT_KEY; }
21
+ get: function () { return chunkDXFMZ4ME_cjs.COOKIE_CONSENT_KEY; }
22
22
  });
23
23
  Object.defineProperty(exports, "CookieConsent", {
24
24
  enumerable: true,
25
- get: function () { return chunk2VVRZBUR_cjs.CookieConsent; }
25
+ get: function () { return chunkDXFMZ4ME_cjs.CookieConsent; }
26
26
  });
27
27
  Object.defineProperty(exports, "createAnalyticsLoader", {
28
28
  enumerable: true,
29
- get: function () { return chunk2VVRZBUR_cjs.createAnalyticsLoader; }
29
+ get: function () { return chunkDXFMZ4ME_cjs.createAnalyticsLoader; }
30
+ });
31
+ Object.defineProperty(exports, "isEEAUser", {
32
+ enumerable: true,
33
+ get: function () { return chunkDXFMZ4ME_cjs.isEEAUser; }
30
34
  });
31
35
  Object.defineProperty(exports, "loadClarity", {
32
36
  enumerable: true,
33
- get: function () { return chunk2VVRZBUR_cjs.loadClarity; }
37
+ get: function () { return chunkDXFMZ4ME_cjs.loadClarity; }
34
38
  });
35
39
  Object.defineProperty(exports, "loadGoogleAnalytics", {
36
40
  enumerable: true,
37
- get: function () { return chunk2VVRZBUR_cjs.loadGoogleAnalytics; }
41
+ get: function () { return chunkDXFMZ4ME_cjs.loadGoogleAnalytics; }
38
42
  });
39
43
  Object.defineProperty(exports, "useCookieConsent", {
40
44
  enumerable: true,
41
- get: function () { return chunk2VVRZBUR_cjs.useCookieConsent; }
45
+ get: function () { return chunkDXFMZ4ME_cjs.useCookieConsent; }
42
46
  });
43
47
  Object.defineProperty(exports, "useAnalytics", {
44
48
  enumerable: true,
@@ -111,23 +111,33 @@ declare function CookieConsent({ delay, privacyUrl, onAccept, onDecline, labels,
111
111
  /**
112
112
  * React hook that tracks cookie consent status.
113
113
  *
114
- * Returns `true` once the user has granted cookie consent,
115
- * `false` if denied, `null` if not yet decided.
114
+ * Returns `'granted'` once the user has granted cookie consent,
115
+ * `'denied'` if denied, `null` if not yet decided.
116
116
  *
117
- * Listens for the `cookie_consent_granted` window event dispatched
118
- * by the CookieConsent component.
117
+ * SOFT CONSENT: For non-EEA users (timezone-based detection), the default
118
+ * resolves to `'granted'` after mount so analytics fire without requiring a
119
+ * banner interaction. EEA users retain the strict `null → granted` flow via
120
+ * the banner.
121
+ *
122
+ * Server-side renders as `null` (no window). The mount effect computes the
123
+ * real status; this avoids hydration mismatches.
124
+ *
125
+ * Listens for the `cookie_consent_granted` window event dispatched by the
126
+ * CookieConsent component, plus the cross-tab `storage` event.
119
127
  *
120
128
  * @example
121
129
  * ```tsx
122
- * const hasConsent = useCookieConsent();
130
+ * const consent = useCookieConsent();
123
131
  *
124
132
  * useEffect(() => {
125
- * if (hasConsent) loadGoogleAnalytics('G-XXXX');
126
- * }, [hasConsent]);
133
+ * if (consent === 'granted') loadGoogleAnalytics('G-XXXX');
134
+ * }, [consent]);
127
135
  * ```
128
136
  */
129
137
  declare function useCookieConsent(): ConsentStatus;
130
138
 
139
+ declare function isEEAUser(): boolean;
140
+
131
141
  /** Arbitrary properties bag attached to every analytics event. */
132
142
  type AnalyticsEventProps = Record<string, string | number | boolean | undefined>;
133
143
  /** Signature for the track function provided by AnalyticsProvider. */
@@ -169,4 +179,4 @@ declare function AnalyticsProvider({ onTrack, debug, children }: AnalyticsProvid
169
179
  */
170
180
  declare function useAnalytics(): AnalyticsContextValue;
171
181
 
172
- export { type AnalyticsContextValue, type AnalyticsEventProps, type AnalyticsLoaderConfig, AnalyticsProvider, type AnalyticsProviderProps, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, type ConsentStatus, CookieConsent, type CookieConsentLabels, type CookieConsentProps, type TrackFn, createAnalyticsLoader, loadClarity, loadGoogleAnalytics, useAnalytics, useCookieConsent };
182
+ export { type AnalyticsContextValue, type AnalyticsEventProps, type AnalyticsLoaderConfig, AnalyticsProvider, type AnalyticsProviderProps, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, type ConsentStatus, CookieConsent, type CookieConsentLabels, type CookieConsentProps, type TrackFn, createAnalyticsLoader, isEEAUser, loadClarity, loadGoogleAnalytics, useAnalytics, useCookieConsent };
@@ -111,23 +111,33 @@ declare function CookieConsent({ delay, privacyUrl, onAccept, onDecline, labels,
111
111
  /**
112
112
  * React hook that tracks cookie consent status.
113
113
  *
114
- * Returns `true` once the user has granted cookie consent,
115
- * `false` if denied, `null` if not yet decided.
114
+ * Returns `'granted'` once the user has granted cookie consent,
115
+ * `'denied'` if denied, `null` if not yet decided.
116
116
  *
117
- * Listens for the `cookie_consent_granted` window event dispatched
118
- * by the CookieConsent component.
117
+ * SOFT CONSENT: For non-EEA users (timezone-based detection), the default
118
+ * resolves to `'granted'` after mount so analytics fire without requiring a
119
+ * banner interaction. EEA users retain the strict `null → granted` flow via
120
+ * the banner.
121
+ *
122
+ * Server-side renders as `null` (no window). The mount effect computes the
123
+ * real status; this avoids hydration mismatches.
124
+ *
125
+ * Listens for the `cookie_consent_granted` window event dispatched by the
126
+ * CookieConsent component, plus the cross-tab `storage` event.
119
127
  *
120
128
  * @example
121
129
  * ```tsx
122
- * const hasConsent = useCookieConsent();
130
+ * const consent = useCookieConsent();
123
131
  *
124
132
  * useEffect(() => {
125
- * if (hasConsent) loadGoogleAnalytics('G-XXXX');
126
- * }, [hasConsent]);
133
+ * if (consent === 'granted') loadGoogleAnalytics('G-XXXX');
134
+ * }, [consent]);
127
135
  * ```
128
136
  */
129
137
  declare function useCookieConsent(): ConsentStatus;
130
138
 
139
+ declare function isEEAUser(): boolean;
140
+
131
141
  /** Arbitrary properties bag attached to every analytics event. */
132
142
  type AnalyticsEventProps = Record<string, string | number | boolean | undefined>;
133
143
  /** Signature for the track function provided by AnalyticsProvider. */
@@ -169,4 +179,4 @@ declare function AnalyticsProvider({ onTrack, debug, children }: AnalyticsProvid
169
179
  */
170
180
  declare function useAnalytics(): AnalyticsContextValue;
171
181
 
172
- export { type AnalyticsContextValue, type AnalyticsEventProps, type AnalyticsLoaderConfig, AnalyticsProvider, type AnalyticsProviderProps, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, type ConsentStatus, CookieConsent, type CookieConsentLabels, type CookieConsentProps, type TrackFn, createAnalyticsLoader, loadClarity, loadGoogleAnalytics, useAnalytics, useCookieConsent };
182
+ export { type AnalyticsContextValue, type AnalyticsEventProps, type AnalyticsLoaderConfig, AnalyticsProvider, type AnalyticsProviderProps, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, type ConsentStatus, CookieConsent, type CookieConsentLabels, type CookieConsentProps, type TrackFn, createAnalyticsLoader, isEEAUser, loadClarity, loadGoogleAnalytics, useAnalytics, useCookieConsent };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- export { AnalyticsProvider, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, CookieConsent, createAnalyticsLoader, loadClarity, loadGoogleAnalytics, useCookieConsent } from '../../chunk-K526GN7P.js';
2
+ export { AnalyticsProvider, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, CookieConsent, createAnalyticsLoader, isEEAUser, loadClarity, loadGoogleAnalytics, useCookieConsent } from '../../chunk-FZJLTJZS.js';
3
3
  import '../../chunk-KJHPOB3J.js';
4
4
  export { useAnalytics } from '../../chunk-2GARWEJK.js';
5
5
  import '../../chunk-KJ2OXQF4.js';
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkH5BOCR5Z_cjs = require('../chunk-H5BOCR5Z.cjs');
5
- var chunk2VVRZBUR_cjs = require('../chunk-2VVRZBUR.cjs');
4
+ var chunkK7NQ7TQG_cjs = require('../chunk-K7NQ7TQG.cjs');
5
+ var chunkDXFMZ4ME_cjs = require('../chunk-DXFMZ4ME.cjs');
6
6
  var chunkMQDEE7HC_cjs = require('../chunk-MQDEE7HC.cjs');
7
7
  require('../chunk-7EUR3AKV.cjs');
8
8
  var chunkVC5LMUVQ_cjs = require('../chunk-VC5LMUVQ.cjs');
@@ -15,59 +15,63 @@ function UtmProvider({ params, children }) {
15
15
 
16
16
  Object.defineProperty(exports, "JsonLd", {
17
17
  enumerable: true,
18
- get: function () { return chunkH5BOCR5Z_cjs.JsonLd; }
18
+ get: function () { return chunkK7NQ7TQG_cjs.JsonLd; }
19
19
  });
20
20
  Object.defineProperty(exports, "aggregateRatingFromTestimonials", {
21
21
  enumerable: true,
22
- get: function () { return chunkH5BOCR5Z_cjs.aggregateRatingFromTestimonials; }
22
+ get: function () { return chunkK7NQ7TQG_cjs.aggregateRatingFromTestimonials; }
23
23
  });
24
24
  Object.defineProperty(exports, "buildPageGraph", {
25
25
  enumerable: true,
26
- get: function () { return chunkH5BOCR5Z_cjs.buildPageGraph; }
26
+ get: function () { return chunkK7NQ7TQG_cjs.buildPageGraph; }
27
27
  });
28
28
  Object.defineProperty(exports, "canonicalUrl", {
29
29
  enumerable: true,
30
- get: function () { return chunkH5BOCR5Z_cjs.canonicalUrl; }
30
+ get: function () { return chunkK7NQ7TQG_cjs.canonicalUrl; }
31
31
  });
32
32
  Object.defineProperty(exports, "createEntityIds", {
33
33
  enumerable: true,
34
- get: function () { return chunkH5BOCR5Z_cjs.createEntityIds; }
34
+ get: function () { return chunkK7NQ7TQG_cjs.createEntityIds; }
35
35
  });
36
36
  Object.defineProperty(exports, "createSchemaGenerators", {
37
37
  enumerable: true,
38
- get: function () { return chunkH5BOCR5Z_cjs.createSchemaGenerators; }
38
+ get: function () { return chunkK7NQ7TQG_cjs.createSchemaGenerators; }
39
39
  });
40
40
  Object.defineProperty(exports, "AnalyticsProvider", {
41
41
  enumerable: true,
42
- get: function () { return chunk2VVRZBUR_cjs.AnalyticsProvider; }
42
+ get: function () { return chunkDXFMZ4ME_cjs.AnalyticsProvider; }
43
43
  });
44
44
  Object.defineProperty(exports, "COOKIE_CONSENT_EVENT", {
45
45
  enumerable: true,
46
- get: function () { return chunk2VVRZBUR_cjs.COOKIE_CONSENT_EVENT; }
46
+ get: function () { return chunkDXFMZ4ME_cjs.COOKIE_CONSENT_EVENT; }
47
47
  });
48
48
  Object.defineProperty(exports, "COOKIE_CONSENT_KEY", {
49
49
  enumerable: true,
50
- get: function () { return chunk2VVRZBUR_cjs.COOKIE_CONSENT_KEY; }
50
+ get: function () { return chunkDXFMZ4ME_cjs.COOKIE_CONSENT_KEY; }
51
51
  });
52
52
  Object.defineProperty(exports, "CookieConsent", {
53
53
  enumerable: true,
54
- get: function () { return chunk2VVRZBUR_cjs.CookieConsent; }
54
+ get: function () { return chunkDXFMZ4ME_cjs.CookieConsent; }
55
55
  });
56
56
  Object.defineProperty(exports, "createAnalyticsLoader", {
57
57
  enumerable: true,
58
- get: function () { return chunk2VVRZBUR_cjs.createAnalyticsLoader; }
58
+ get: function () { return chunkDXFMZ4ME_cjs.createAnalyticsLoader; }
59
+ });
60
+ Object.defineProperty(exports, "isEEAUser", {
61
+ enumerable: true,
62
+ get: function () { return chunkDXFMZ4ME_cjs.isEEAUser; }
59
63
  });
60
64
  Object.defineProperty(exports, "loadClarity", {
61
65
  enumerable: true,
62
- get: function () { return chunk2VVRZBUR_cjs.loadClarity; }
66
+ get: function () { return chunkDXFMZ4ME_cjs.loadClarity; }
63
67
  });
64
68
  Object.defineProperty(exports, "loadGoogleAnalytics", {
65
69
  enumerable: true,
66
- get: function () { return chunk2VVRZBUR_cjs.loadGoogleAnalytics; }
70
+ get: function () { return chunkDXFMZ4ME_cjs.loadGoogleAnalytics; }
67
71
  });
68
72
  Object.defineProperty(exports, "useCookieConsent", {
69
73
  enumerable: true,
70
- get: function () { return chunk2VVRZBUR_cjs.useCookieConsent; }
74
+ get: function () { return chunkDXFMZ4ME_cjs.useCookieConsent; }
71
75
  });
72
76
  Object.defineProperty(exports, "UTM_CAMPAIGNS", {
73
77
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/web/utm/UtmContext.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCS;AADF,SAAS,YAAY,EAAE,QAAQ,SAAS,GAAqB;AAClE,SAAO,oBAAC,WAAW,UAAX,EAAoB,OAAO,QAAS,UAAS;AACvD","sourcesContent":["import { type ReactNode } from 'react';\nimport { UtmContext } from './utm-context';\n\n/* ============================================================================\n UTM Context — Page-Level Default UTM Parameters\n ============================================================================\n Provides default UtmParams to all downstream components (e.g. OutboundLink).\n Wrap a layout or page with <UtmProvider> so every outbound link on that page\n inherits governed UTM parameters without explicit prop drilling.\n\n Priority resolution in OutboundLink:\n 1. Explicit `utmParams` prop (highest)\n 2. UtmContext value (this provider)\n 3. Legacy fallback (lowest — deprecated)\n ============================================================================ */\n\nexport interface UtmProviderProps {\n /** Default UTM parameters for all descendants. */\n params: import('./types').UtmParams;\n children: ReactNode;\n}\n\n/**\n * Provides governed UTM defaults to all `OutboundLink` and UTM-aware\n * components in the subtree.\n *\n * @example\n * ```tsx\n * <UtmProvider params={{ source: 'website', medium: 'webBlogPost', campaign: 'demo' }}>\n * <BlogPostPage />\n * </UtmProvider>\n * ```\n */\nexport function UtmProvider({ params, children }: UtmProviderProps) {\n return <UtmContext.Provider value={params}>{children}</UtmContext.Provider>;\n}\n"]}
1
+ {"version":3,"sources":["../../src/web/utm/UtmContext.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCS;AADF,SAAS,YAAY,EAAE,QAAQ,SAAS,GAAqB;AAClE,SAAO,oBAAC,WAAW,UAAX,EAAoB,OAAO,QAAS,UAAS;AACvD","sourcesContent":["import { type ReactNode } from 'react';\nimport { UtmContext } from './utm-context';\n\n/* ============================================================================\n UTM Context — Page-Level Default UTM Parameters\n ============================================================================\n Provides default UtmParams to all downstream components (e.g. OutboundLink).\n Wrap a layout or page with <UtmProvider> so every outbound link on that page\n inherits governed UTM parameters without explicit prop drilling.\n\n Priority resolution in OutboundLink:\n 1. Explicit `utmParams` prop (highest)\n 2. UtmContext value (this provider)\n 3. Legacy fallback (lowest — deprecated)\n ============================================================================ */\n\nexport interface UtmProviderProps {\n /** Default UTM parameters for all descendants. */\n params: import('./types').UtmParams;\n children: ReactNode;\n}\n\n/**\n * Provides governed UTM defaults to all `OutboundLink` and UTM-aware\n * components in the subtree.\n *\n * @example\n * ```tsx\n * <UtmProvider params={{ source: 'website', medium: 'webBlogPost', campaign: 'demo' }}>\n * <BlogPostPage />\n * </UtmProvider>\n * ```\n */\nexport function UtmProvider({ params, children }: UtmProviderProps) {\n return <UtmContext.Provider value={params}>{children}</UtmContext.Provider>;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  export { ArticleMeta, BrandConfig, CareerForSchema, CustomerOrganizationMeta, FAQItem, GlossaryTermForSchema, HowToMeta, HowToStep, ItemForList, JsonLd, JsonLdProps, PersonMeta, PricingPlan, SeoBreadcrumbItem, ServiceMotion, TestimonialForSchema, TranscriptForSchema, VideoObjectMeta, aggregateRatingFromTestimonials, buildPageGraph, canonicalUrl, createEntityIds, createSchemaGenerators } from './server/index.cjs';
2
- export { AnalyticsContextValue, AnalyticsEventProps, AnalyticsLoaderConfig, AnalyticsProvider, AnalyticsProviderProps, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, ConsentStatus, CookieConsent, CookieConsentLabels, CookieConsentProps, TrackFn, createAnalyticsLoader, loadClarity, loadGoogleAnalytics, useAnalytics, useCookieConsent } from './client/index.cjs';
2
+ export { AnalyticsContextValue, AnalyticsEventProps, AnalyticsLoaderConfig, AnalyticsProvider, AnalyticsProviderProps, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, ConsentStatus, CookieConsent, CookieConsentLabels, CookieConsentProps, TrackFn, createAnalyticsLoader, isEEAUser, loadClarity, loadGoogleAnalytics, useAnalytics, useCookieConsent } from './client/index.cjs';
3
3
  import { U as UtmParams } from '../types-D5bPCZi6.cjs';
4
4
  export { F as FirstTouchAttribution, a as UrlClassification, b as UtmAuditEntry, c as UtmBlockedError, d as UtmCampaign, e as UtmComplianceResult, f as UtmComplianceStatus, g as UtmConfidence, h as UtmContent, i as UtmMedium, j as UtmMediumAppPage, k as UtmMediumMessaging, l as UtmMediumWebPage, m as UtmOverrides, n as UtmSource, o as UtmSourceRequiringSeller, p as UtmTerm } from '../types-D5bPCZi6.cjs';
5
5
  export { U as UTM_CAMPAIGNS, a as UTM_CONTENTS, b as UTM_MEDIUMS_ALL, c as UTM_MEDIUMS_APP, d as UTM_MEDIUMS_MESSAGING, e as UTM_MEDIUMS_WEB, f as UTM_SOURCES, g as UTM_SOURCES_REQUIRING_SELLER, h as UTM_TERMS, i as buildBlockedError, j as buildUtmUrl, k as classifyAndEnforce, l as classifyUrl, m as createAuditEntry, n as isUtmExempt, o as isValidUtmParams, p as parseUtmParams, r as requiresSellerAttribution, q as requiresUtm, t as toFirstTouchAttribution, v as validateCompliance, s as validateUtmField } from '../audit-CQvTUO39.cjs';
@@ -1,5 +1,5 @@
1
1
  export { ArticleMeta, BrandConfig, CareerForSchema, CustomerOrganizationMeta, FAQItem, GlossaryTermForSchema, HowToMeta, HowToStep, ItemForList, JsonLd, JsonLdProps, PersonMeta, PricingPlan, SeoBreadcrumbItem, ServiceMotion, TestimonialForSchema, TranscriptForSchema, VideoObjectMeta, aggregateRatingFromTestimonials, buildPageGraph, canonicalUrl, createEntityIds, createSchemaGenerators } from './server/index.js';
2
- export { AnalyticsContextValue, AnalyticsEventProps, AnalyticsLoaderConfig, AnalyticsProvider, AnalyticsProviderProps, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, ConsentStatus, CookieConsent, CookieConsentLabels, CookieConsentProps, TrackFn, createAnalyticsLoader, loadClarity, loadGoogleAnalytics, useAnalytics, useCookieConsent } from './client/index.js';
2
+ export { AnalyticsContextValue, AnalyticsEventProps, AnalyticsLoaderConfig, AnalyticsProvider, AnalyticsProviderProps, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, ConsentStatus, CookieConsent, CookieConsentLabels, CookieConsentProps, TrackFn, createAnalyticsLoader, isEEAUser, loadClarity, loadGoogleAnalytics, useAnalytics, useCookieConsent } from './client/index.js';
3
3
  import { U as UtmParams } from '../types-D5bPCZi6.js';
4
4
  export { F as FirstTouchAttribution, a as UrlClassification, b as UtmAuditEntry, c as UtmBlockedError, d as UtmCampaign, e as UtmComplianceResult, f as UtmComplianceStatus, g as UtmConfidence, h as UtmContent, i as UtmMedium, j as UtmMediumAppPage, k as UtmMediumMessaging, l as UtmMediumWebPage, m as UtmOverrides, n as UtmSource, o as UtmSourceRequiringSeller, p as UtmTerm } from '../types-D5bPCZi6.js';
5
5
  export { U as UTM_CAMPAIGNS, a as UTM_CONTENTS, b as UTM_MEDIUMS_ALL, c as UTM_MEDIUMS_APP, d as UTM_MEDIUMS_MESSAGING, e as UTM_MEDIUMS_WEB, f as UTM_SOURCES, g as UTM_SOURCES_REQUIRING_SELLER, h as UTM_TERMS, i as buildBlockedError, j as buildUtmUrl, k as classifyAndEnforce, l as classifyUrl, m as createAuditEntry, n as isUtmExempt, o as isValidUtmParams, p as parseUtmParams, r as requiresSellerAttribution, q as requiresUtm, t as toFirstTouchAttribution, v as validateCompliance, s as validateUtmField } from '../audit-oRc-Dccv.js';
package/dist/web/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- export { JsonLd, aggregateRatingFromTestimonials, buildPageGraph, canonicalUrl, createEntityIds, createSchemaGenerators } from '../chunk-NB3BDIQO.js';
3
- export { AnalyticsProvider, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, CookieConsent, createAnalyticsLoader, loadClarity, loadGoogleAnalytics, useCookieConsent } from '../chunk-K526GN7P.js';
2
+ export { JsonLd, aggregateRatingFromTestimonials, buildPageGraph, canonicalUrl, createEntityIds, createSchemaGenerators } from '../chunk-25TUCNN6.js';
3
+ export { AnalyticsProvider, COOKIE_CONSENT_EVENT, COOKIE_CONSENT_KEY, CookieConsent, createAnalyticsLoader, isEEAUser, loadClarity, loadGoogleAnalytics, useCookieConsent } from '../chunk-FZJLTJZS.js';
4
4
  export { UTM_CAMPAIGNS, UTM_CONTENTS, UTM_MEDIUMS_ALL, UTM_MEDIUMS_APP, UTM_MEDIUMS_MESSAGING, UTM_MEDIUMS_WEB, UTM_SOURCES, UTM_SOURCES_REQUIRING_SELLER, UTM_TERMS, buildBlockedError, classifyAndEnforce, createAuditEntry, isValidUtmParams, parseUtmParams, requiresSellerAttribution, toFirstTouchAttribution, validateCompliance, validateUtmField } from '../chunk-BILT5KD3.js';
5
5
  import '../chunk-KJHPOB3J.js';
6
6
  export { useAnalytics } from '../chunk-2GARWEJK.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/web/utm/UtmContext.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCS;AADF,SAAS,YAAY,EAAE,QAAQ,SAAS,GAAqB;AAClE,SAAO,oBAAC,WAAW,UAAX,EAAoB,OAAO,QAAS,UAAS;AACvD","sourcesContent":["import { type ReactNode } from 'react';\nimport { UtmContext } from './utm-context';\n\n/* ============================================================================\n UTM Context — Page-Level Default UTM Parameters\n ============================================================================\n Provides default UtmParams to all downstream components (e.g. OutboundLink).\n Wrap a layout or page with <UtmProvider> so every outbound link on that page\n inherits governed UTM parameters without explicit prop drilling.\n\n Priority resolution in OutboundLink:\n 1. Explicit `utmParams` prop (highest)\n 2. UtmContext value (this provider)\n 3. Legacy fallback (lowest — deprecated)\n ============================================================================ */\n\nexport interface UtmProviderProps {\n /** Default UTM parameters for all descendants. */\n params: import('./types').UtmParams;\n children: ReactNode;\n}\n\n/**\n * Provides governed UTM defaults to all `OutboundLink` and UTM-aware\n * components in the subtree.\n *\n * @example\n * ```tsx\n * <UtmProvider params={{ source: 'website', medium: 'webBlogPost', campaign: 'demo' }}>\n * <BlogPostPage />\n * </UtmProvider>\n * ```\n */\nexport function UtmProvider({ params, children }: UtmProviderProps) {\n return <UtmContext.Provider value={params}>{children}</UtmContext.Provider>;\n}\n"]}
1
+ {"version":3,"sources":["../../src/web/utm/UtmContext.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCS;AADF,SAAS,YAAY,EAAE,QAAQ,SAAS,GAAqB;AAClE,SAAO,oBAAC,WAAW,UAAX,EAAoB,OAAO,QAAS,UAAS;AACvD","sourcesContent":["import { type ReactNode } from 'react';\nimport { UtmContext } from './utm-context';\n\n/* ============================================================================\n UTM Context — Page-Level Default UTM Parameters\n ============================================================================\n Provides default UtmParams to all downstream components (e.g. OutboundLink).\n Wrap a layout or page with <UtmProvider> so every outbound link on that page\n inherits governed UTM parameters without explicit prop drilling.\n\n Priority resolution in OutboundLink:\n 1. Explicit `utmParams` prop (highest)\n 2. UtmContext value (this provider)\n 3. Legacy fallback (lowest — deprecated)\n ============================================================================ */\n\nexport interface UtmProviderProps {\n /** Default UTM parameters for all descendants. */\n params: import('./types').UtmParams;\n children: ReactNode;\n}\n\n/**\n * Provides governed UTM defaults to all `OutboundLink` and UTM-aware\n * components in the subtree.\n *\n * @example\n * ```tsx\n * <UtmProvider params={{ source: 'website', medium: 'webBlogPost', campaign: 'demo' }}>\n * <BlogPostPage />\n * </UtmProvider>\n * ```\n */\nexport function UtmProvider({ params, children }: UtmProviderProps) {\n return <UtmContext.Provider value={params}>{children}</UtmContext.Provider>;\n}\n"]}
@@ -1,32 +1,32 @@
1
1
  'use strict';
2
2
 
3
- var chunkH5BOCR5Z_cjs = require('../../chunk-H5BOCR5Z.cjs');
3
+ var chunkK7NQ7TQG_cjs = require('../../chunk-K7NQ7TQG.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "JsonLd", {
8
8
  enumerable: true,
9
- get: function () { return chunkH5BOCR5Z_cjs.JsonLd; }
9
+ get: function () { return chunkK7NQ7TQG_cjs.JsonLd; }
10
10
  });
11
11
  Object.defineProperty(exports, "aggregateRatingFromTestimonials", {
12
12
  enumerable: true,
13
- get: function () { return chunkH5BOCR5Z_cjs.aggregateRatingFromTestimonials; }
13
+ get: function () { return chunkK7NQ7TQG_cjs.aggregateRatingFromTestimonials; }
14
14
  });
15
15
  Object.defineProperty(exports, "buildPageGraph", {
16
16
  enumerable: true,
17
- get: function () { return chunkH5BOCR5Z_cjs.buildPageGraph; }
17
+ get: function () { return chunkK7NQ7TQG_cjs.buildPageGraph; }
18
18
  });
19
19
  Object.defineProperty(exports, "canonicalUrl", {
20
20
  enumerable: true,
21
- get: function () { return chunkH5BOCR5Z_cjs.canonicalUrl; }
21
+ get: function () { return chunkK7NQ7TQG_cjs.canonicalUrl; }
22
22
  });
23
23
  Object.defineProperty(exports, "createEntityIds", {
24
24
  enumerable: true,
25
- get: function () { return chunkH5BOCR5Z_cjs.createEntityIds; }
25
+ get: function () { return chunkK7NQ7TQG_cjs.createEntityIds; }
26
26
  });
27
27
  Object.defineProperty(exports, "createSchemaGenerators", {
28
28
  enumerable: true,
29
- get: function () { return chunkH5BOCR5Z_cjs.createSchemaGenerators; }
29
+ get: function () { return chunkK7NQ7TQG_cjs.createSchemaGenerators; }
30
30
  });
31
31
  //# sourceMappingURL=out.js.map
32
32
  //# sourceMappingURL=index.cjs.map
@@ -6,6 +6,17 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
6
6
  * Framework-agnostic types for structured data generation.
7
7
  * Extracted from website/src/lib/seo.ts for reuse across all consumers.
8
8
  */
9
+ /** Aggregate-rating defaults applied to the SoftwareApplication schema. */
10
+ interface SoftwareApplicationAggregateRatingConfig {
11
+ ratingValue: number;
12
+ reviewCount: number;
13
+ bestRating?: number;
14
+ worstRating?: number;
15
+ }
16
+ /** Per-call options for `softwareApplication()`. */
17
+ interface SoftwareApplicationSchemaOptions {
18
+ aggregateRating?: SoftwareApplicationAggregateRatingConfig;
19
+ }
9
20
  /** Brand configuration required by schema generators */
10
21
  interface BrandConfig {
11
22
  name: string;
@@ -14,6 +25,8 @@ interface BrandConfig {
14
25
  tagline: string;
15
26
  founder: string;
16
27
  sameAs?: string[];
28
+ /** Optional aggregate-rating defaults applied to SoftwareApplication schema. */
29
+ aggregateRating?: SoftwareApplicationAggregateRatingConfig;
17
30
  }
18
31
  interface BreadcrumbItem {
19
32
  name: string;
@@ -285,7 +298,19 @@ declare function createSchemaGenerators(brand: BrandConfig, supportedLanguages?:
285
298
  };
286
299
  };
287
300
  /** SoftwareApplication schema — Platform Hub, Platform Feature, Pricing. */
288
- softwareApplication(name?: string, description?: string, url?: string, locale?: string): {
301
+ softwareApplication(name?: string, description?: string, url?: string, locale?: string, options?: SoftwareApplicationSchemaOptions): {
302
+ author: {
303
+ '@type': string;
304
+ '@id': `${string}/#organization`;
305
+ name: string;
306
+ };
307
+ aggregateRating?: {
308
+ '@type': string;
309
+ ratingValue: string;
310
+ ratingCount: string;
311
+ bestRating: string;
312
+ worstRating: string;
313
+ } | undefined;
289
314
  '@context': string;
290
315
  '@type': string;
291
316
  '@id': `${string}/#software`;
@@ -296,22 +321,6 @@ declare function createSchemaGenerators(brand: BrandConfig, supportedLanguages?:
296
321
  operatingSystem: string;
297
322
  inLanguage: string;
298
323
  availableLanguage: string[];
299
- offers: {
300
- '@type': string;
301
- priceCurrency: string;
302
- lowPrice: string;
303
- highPrice: string;
304
- offerCount: string;
305
- priceSpecification: {
306
- '@type': string;
307
- description: string;
308
- };
309
- };
310
- author: {
311
- '@type': string;
312
- '@id': `${string}/#organization`;
313
- name: string;
314
- };
315
324
  };
316
325
  /** Article schema — Blog posts, Comparison pages. */
317
326
  article(meta: ArticleMeta, locale?: string): {
@@ -6,6 +6,17 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
6
6
  * Framework-agnostic types for structured data generation.
7
7
  * Extracted from website/src/lib/seo.ts for reuse across all consumers.
8
8
  */
9
+ /** Aggregate-rating defaults applied to the SoftwareApplication schema. */
10
+ interface SoftwareApplicationAggregateRatingConfig {
11
+ ratingValue: number;
12
+ reviewCount: number;
13
+ bestRating?: number;
14
+ worstRating?: number;
15
+ }
16
+ /** Per-call options for `softwareApplication()`. */
17
+ interface SoftwareApplicationSchemaOptions {
18
+ aggregateRating?: SoftwareApplicationAggregateRatingConfig;
19
+ }
9
20
  /** Brand configuration required by schema generators */
10
21
  interface BrandConfig {
11
22
  name: string;
@@ -14,6 +25,8 @@ interface BrandConfig {
14
25
  tagline: string;
15
26
  founder: string;
16
27
  sameAs?: string[];
28
+ /** Optional aggregate-rating defaults applied to SoftwareApplication schema. */
29
+ aggregateRating?: SoftwareApplicationAggregateRatingConfig;
17
30
  }
18
31
  interface BreadcrumbItem {
19
32
  name: string;
@@ -285,7 +298,19 @@ declare function createSchemaGenerators(brand: BrandConfig, supportedLanguages?:
285
298
  };
286
299
  };
287
300
  /** SoftwareApplication schema — Platform Hub, Platform Feature, Pricing. */
288
- softwareApplication(name?: string, description?: string, url?: string, locale?: string): {
301
+ softwareApplication(name?: string, description?: string, url?: string, locale?: string, options?: SoftwareApplicationSchemaOptions): {
302
+ author: {
303
+ '@type': string;
304
+ '@id': `${string}/#organization`;
305
+ name: string;
306
+ };
307
+ aggregateRating?: {
308
+ '@type': string;
309
+ ratingValue: string;
310
+ ratingCount: string;
311
+ bestRating: string;
312
+ worstRating: string;
313
+ } | undefined;
289
314
  '@context': string;
290
315
  '@type': string;
291
316
  '@id': `${string}/#software`;
@@ -296,22 +321,6 @@ declare function createSchemaGenerators(brand: BrandConfig, supportedLanguages?:
296
321
  operatingSystem: string;
297
322
  inLanguage: string;
298
323
  availableLanguage: string[];
299
- offers: {
300
- '@type': string;
301
- priceCurrency: string;
302
- lowPrice: string;
303
- highPrice: string;
304
- offerCount: string;
305
- priceSpecification: {
306
- '@type': string;
307
- description: string;
308
- };
309
- };
310
- author: {
311
- '@type': string;
312
- '@id': `${string}/#organization`;
313
- name: string;
314
- };
315
324
  };
316
325
  /** Article schema — Blog posts, Comparison pages. */
317
326
  article(meta: ArticleMeta, locale?: string): {
@@ -1,3 +1,3 @@
1
- export { JsonLd, aggregateRatingFromTestimonials, buildPageGraph, canonicalUrl, createEntityIds, createSchemaGenerators } from '../../chunk-NB3BDIQO.js';
1
+ export { JsonLd, aggregateRatingFromTestimonials, buildPageGraph, canonicalUrl, createEntityIds, createSchemaGenerators } from '../../chunk-25TUCNN6.js';
2
2
  //# sourceMappingURL=out.js.map
3
3
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesmind-ai/design-system",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "description": "Salesmind AI Design System",
5
5
  "license": "MIT",
6
6
  "type": "module",