@salesmind-ai/design-system 0.2.1 → 0.3.1

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 (142) hide show
  1. package/README.md +32 -2
  2. package/dist/AppearancePanel-UT57J69V.d.cts +51 -0
  3. package/dist/AppearancePanel-UT57J69V.d.ts +51 -0
  4. package/dist/AppearanceProvider-C36a8-eb.d.cts +45 -0
  5. package/dist/AppearanceProvider-C36a8-eb.d.ts +45 -0
  6. package/dist/Breadcrumb-RX-B_gDV.d.cts +44 -0
  7. package/dist/Breadcrumb-RX-B_gDV.d.ts +44 -0
  8. package/dist/ExportMenu-A2TLFiVv.d.cts +311 -0
  9. package/dist/ExportMenu-C8qck5AT.d.ts +311 -0
  10. package/dist/SectionShell-BfBw5q0Y.d.cts +18 -0
  11. package/dist/SectionShell-BfBw5q0Y.d.ts +18 -0
  12. package/dist/Select-BdZmK0Lt.d.cts +66 -0
  13. package/dist/Select-BdZmK0Lt.d.ts +66 -0
  14. package/dist/admin/index.cjs +2941 -0
  15. package/dist/admin/index.cjs.map +1 -0
  16. package/dist/admin/index.css +4145 -0
  17. package/dist/admin/index.css.map +1 -0
  18. package/dist/admin/index.d.cts +491 -0
  19. package/dist/admin/index.d.ts +491 -0
  20. package/dist/admin/index.js +2918 -0
  21. package/dist/admin/index.js.map +1 -0
  22. package/dist/{audit-CiyPkxk1.d.cts → audit-BS2fn7M4.d.ts} +2 -51
  23. package/dist/{audit-CiyPkxk1.d.ts → audit-DwCmg32J.d.cts} +2 -51
  24. package/dist/blog/index.cjs +1074 -0
  25. package/dist/blog/index.cjs.map +1 -0
  26. package/dist/blog/index.css +1422 -0
  27. package/dist/blog/index.css.map +1 -0
  28. package/dist/blog/index.d.cts +233 -0
  29. package/dist/blog/index.d.ts +233 -0
  30. package/dist/blog/index.js +1056 -0
  31. package/dist/blog/index.js.map +1 -0
  32. package/dist/chart-types-BGVVO-zl.d.cts +208 -0
  33. package/dist/chart-types-BGVVO-zl.d.ts +208 -0
  34. package/dist/charts/index.cjs +2698 -0
  35. package/dist/charts/index.cjs.map +1 -0
  36. package/dist/charts/index.css +1167 -0
  37. package/dist/charts/index.css.map +1 -0
  38. package/dist/charts/index.d.cts +453 -0
  39. package/dist/charts/index.d.ts +453 -0
  40. package/dist/charts/index.js +2682 -0
  41. package/dist/charts/index.js.map +1 -0
  42. package/dist/core/index.cjs +526 -395
  43. package/dist/core/index.cjs.map +1 -1
  44. package/dist/core/index.css +294 -0
  45. package/dist/core/index.css.map +1 -1
  46. package/dist/core/index.d.cts +7 -982
  47. package/dist/core/index.d.ts +7 -982
  48. package/dist/core/index.js +476 -351
  49. package/dist/core/index.js.map +1 -1
  50. package/dist/i18n/index.cjs +585 -0
  51. package/dist/i18n/index.cjs.map +1 -0
  52. package/dist/i18n/index.d.cts +855 -0
  53. package/dist/i18n/index.d.ts +855 -0
  54. package/dist/i18n/index.js +547 -0
  55. package/dist/i18n/index.js.map +1 -0
  56. package/dist/index.cjs +3 -2
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.css +11 -7
  59. package/dist/index.css.map +1 -1
  60. package/dist/index.d.cts +22 -1290
  61. package/dist/index.d.ts +22 -1290
  62. package/dist/index.js +3 -2
  63. package/dist/index.js.map +1 -1
  64. package/dist/marketing/index.cjs +2144 -3023
  65. package/dist/marketing/index.cjs.map +1 -1
  66. package/dist/marketing/index.css +3729 -4824
  67. package/dist/marketing/index.css.map +1 -1
  68. package/dist/marketing/index.d.cts +1351 -4
  69. package/dist/marketing/index.d.ts +1351 -4
  70. package/dist/marketing/index.js +2190 -3054
  71. package/dist/marketing/index.js.map +1 -1
  72. package/dist/motion/index.cjs +1230 -0
  73. package/dist/motion/index.cjs.map +1 -0
  74. package/dist/motion/index.css +699 -0
  75. package/dist/motion/index.css.map +1 -0
  76. package/dist/motion/index.d.cts +68 -0
  77. package/dist/motion/index.d.ts +68 -0
  78. package/dist/motion/index.js +1218 -0
  79. package/dist/motion/index.js.map +1 -0
  80. package/dist/nav/index.cjs +1533 -0
  81. package/dist/nav/index.cjs.map +1 -0
  82. package/dist/nav/index.css +1984 -0
  83. package/dist/nav/index.css.map +1 -0
  84. package/dist/nav/index.d.cts +279 -0
  85. package/dist/nav/index.d.ts +279 -0
  86. package/dist/nav/index.js +1501 -0
  87. package/dist/nav/index.js.map +1 -0
  88. package/dist/report/index.cjs +26 -1649
  89. package/dist/report/index.cjs.map +1 -1
  90. package/dist/report/index.css +0 -963
  91. package/dist/report/index.css.map +1 -1
  92. package/dist/report/index.d.cts +4 -2
  93. package/dist/report/index.d.ts +4 -2
  94. package/dist/report/index.js +27 -1640
  95. package/dist/report/index.js.map +1 -1
  96. package/dist/sections/index.cjs +385 -0
  97. package/dist/sections/index.cjs.map +1 -0
  98. package/dist/sections/index.css +815 -0
  99. package/dist/sections/index.css.map +1 -0
  100. package/dist/sections/index.d.cts +69 -0
  101. package/dist/sections/index.d.ts +69 -0
  102. package/dist/sections/index.js +374 -0
  103. package/dist/sections/index.js.map +1 -0
  104. package/dist/social-proof/index.cjs +1255 -0
  105. package/dist/social-proof/index.cjs.map +1 -0
  106. package/dist/social-proof/index.css +1423 -0
  107. package/dist/social-proof/index.css.map +1 -0
  108. package/dist/social-proof/index.d.cts +258 -0
  109. package/dist/social-proof/index.d.ts +258 -0
  110. package/dist/social-proof/index.js +1238 -0
  111. package/dist/social-proof/index.js.map +1 -0
  112. package/dist/theme/index.cjs +573 -0
  113. package/dist/theme/index.cjs.map +1 -0
  114. package/dist/theme/index.css +464 -0
  115. package/dist/theme/index.css.map +1 -0
  116. package/dist/theme/index.d.cts +48 -0
  117. package/dist/theme/index.d.ts +48 -0
  118. package/dist/theme/index.js +558 -0
  119. package/dist/theme/index.js.map +1 -0
  120. package/dist/types-DAlgDGzw.d.cts +52 -0
  121. package/dist/types-DAlgDGzw.d.ts +52 -0
  122. package/dist/web/client/index.cjs +501 -0
  123. package/dist/web/client/index.cjs.map +1 -0
  124. package/dist/web/client/index.css +456 -0
  125. package/dist/web/client/index.css.map +1 -0
  126. package/dist/web/client/index.d.cts +172 -0
  127. package/dist/web/client/index.d.ts +172 -0
  128. package/dist/web/client/index.js +486 -0
  129. package/dist/web/client/index.js.map +1 -0
  130. package/dist/web/index.d.cts +6 -893
  131. package/dist/web/index.d.ts +6 -893
  132. package/dist/web/server/index.cjs +569 -0
  133. package/dist/web/server/index.cjs.map +1 -0
  134. package/dist/web/server/index.d.cts +725 -0
  135. package/dist/web/server/index.d.ts +725 -0
  136. package/dist/web/server/index.js +562 -0
  137. package/dist/web/server/index.js.map +1 -0
  138. package/package.json +81 -9
  139. package/dist/ExportMenu-hEe5MhLq.d.cts +0 -1027
  140. package/dist/ExportMenu-hEe5MhLq.d.ts +0 -1027
  141. package/dist/index-B64suAAc.d.cts +0 -1498
  142. package/dist/index-B64suAAc.d.ts +0 -1498
@@ -0,0 +1,725 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * Schema.org SEO Generator Types
5
+ *
6
+ * Framework-agnostic types for structured data generation.
7
+ * Extracted from website/src/lib/seo.ts for reuse across all consumers.
8
+ */
9
+ /** Brand configuration required by schema generators */
10
+ interface BrandConfig {
11
+ name: string;
12
+ url: string;
13
+ description: string;
14
+ tagline: string;
15
+ founder: string;
16
+ }
17
+ interface BreadcrumbItem {
18
+ name: string;
19
+ url: string;
20
+ }
21
+ interface ArticleMeta {
22
+ title: string;
23
+ description: string;
24
+ url: string;
25
+ image?: string;
26
+ publishedTime: string;
27
+ modifiedTime: string;
28
+ authorName: string;
29
+ authorUrl?: string;
30
+ authorSlug?: string;
31
+ section: string;
32
+ tags?: string[];
33
+ speakableCssSelectors?: string[];
34
+ about?: Record<string, unknown> | {
35
+ '@id': string;
36
+ };
37
+ video?: Record<string, unknown> | {
38
+ '@id': string;
39
+ };
40
+ }
41
+ interface FAQItem {
42
+ question: string;
43
+ answer: string;
44
+ }
45
+ interface PersonMeta {
46
+ name: string;
47
+ jobTitle: string;
48
+ slug?: string;
49
+ url?: string;
50
+ image?: string;
51
+ sameAs?: string[];
52
+ worksFor?: {
53
+ name: string;
54
+ '@id'?: string;
55
+ };
56
+ entityIdOverride?: string;
57
+ }
58
+ interface PricingPlan {
59
+ name: string;
60
+ description: string;
61
+ price: string;
62
+ priceCurrency?: string;
63
+ billingPeriod?: string;
64
+ }
65
+ /** Lightweight testimonial shape for schema generation */
66
+ interface TestimonialForSchema {
67
+ id: string;
68
+ customer_name: string;
69
+ occupation?: string | null;
70
+ star_rating?: number | null;
71
+ review_date?: string | null;
72
+ review_source?: string | null;
73
+ review_link?: string | null;
74
+ quote?: string | null;
75
+ company?: string | null;
76
+ authorEntityId?: string;
77
+ }
78
+ /** Lightweight career/job shape for schema generation */
79
+ interface CareerForSchema {
80
+ title: string;
81
+ slug: string;
82
+ department?: string | null;
83
+ location?: string | null;
84
+ type?: string | null;
85
+ description?: string | null;
86
+ created_at: string;
87
+ published_at?: string | null;
88
+ }
89
+ /** Lightweight transcript shape for schema generation */
90
+ interface TranscriptForSchema {
91
+ title: string;
92
+ slug: string;
93
+ summary?: string | null;
94
+ video_link?: string | null;
95
+ transcript_text?: string | null;
96
+ duration?: string | null;
97
+ published_at?: string | null;
98
+ path?: string;
99
+ thumbnailUrl?: string;
100
+ }
101
+ /** Glossary term for DefinedTermSet schema */
102
+ interface GlossaryTermForSchema {
103
+ term: string;
104
+ slug: string;
105
+ definition: string;
106
+ url?: string;
107
+ }
108
+ /** Single step in a HowTo schema */
109
+ interface HowToStep {
110
+ name: string;
111
+ text: string;
112
+ url?: string;
113
+ image?: string;
114
+ }
115
+ /** HowTo metadata */
116
+ interface HowToMeta {
117
+ name: string;
118
+ description: string;
119
+ /** ISO 8601 duration, e.g. "PT30M" */
120
+ totalTime?: string;
121
+ image?: string;
122
+ }
123
+ /** Service/growth motion for Service schema */
124
+ interface ServiceMotion {
125
+ name: string;
126
+ slug: string;
127
+ description: string;
128
+ url: string;
129
+ price?: string;
130
+ priceCurrency?: string;
131
+ }
132
+ /** Item for ItemList schema (hub/listing pages) */
133
+ interface ItemForList {
134
+ name: string;
135
+ url: string;
136
+ description?: string;
137
+ image?: string;
138
+ position?: number;
139
+ }
140
+ interface CustomerOrganizationMeta {
141
+ name: string;
142
+ slug: string;
143
+ url?: string;
144
+ logo?: string;
145
+ industry?: string;
146
+ description?: string;
147
+ sameAs?: string[];
148
+ }
149
+ interface VideoObjectMeta {
150
+ title: string;
151
+ path: string;
152
+ fragment?: string;
153
+ description?: string;
154
+ videoUrl?: string;
155
+ embedUrl?: string;
156
+ thumbnailUrl?: string;
157
+ duration?: string;
158
+ uploadDate?: string;
159
+ transcript?: string;
160
+ }
161
+
162
+ /**
163
+ * Schema.org Generator System
164
+ *
165
+ * Pure functions that generate structured data objects for SEO.
166
+ * Each generator accepts a `BrandConfig` and optional `locale` for `inLanguage` injection.
167
+ *
168
+ * Architecture:
169
+ * - Each generator returns an object with its own `@context` (standalone-safe).
170
+ * - `buildPageGraph()` strips individual `@context` and wraps all schemas
171
+ * in a single `{"@context": "...", "@graph": [...]}` for unified output.
172
+ * - Use `JsonLd` React component to render the @graph into a single <script> tag.
173
+ *
174
+ * @example
175
+ * ```ts
176
+ * import { createSchemaGenerators, buildPageGraph } from '@salesmind-ai/design-system/web';
177
+ *
178
+ * const seo = createSchemaGenerators({
179
+ * name: 'SalesMind AI',
180
+ * url: 'https://sales-mind.ai',
181
+ * description: 'AI sales automation',
182
+ * tagline: 'AI-powered sales',
183
+ * founder: 'Julien Gadea',
184
+ * });
185
+ *
186
+ * const graph = buildPageGraph(
187
+ * seo.organization(),
188
+ * seo.website(),
189
+ * seo.webPage('/pricing', 'Pricing', '...'),
190
+ * );
191
+ * ```
192
+ */
193
+
194
+ /**
195
+ * Create stable entity ID anchors for @graph cross-referencing.
196
+ * Every entity in the knowledge graph gets a permanent @id.
197
+ * Google resolves @id references across the entire site.
198
+ */
199
+ declare function createEntityIds(brand: BrandConfig): {
200
+ readonly organization: `${string}/#organization`;
201
+ readonly website: `${string}/#website`;
202
+ readonly software: `${string}/#software`;
203
+ readonly product: `${string}/pricing#product`;
204
+ readonly webpage: (path: string) => string;
205
+ readonly article: (path: string) => string;
206
+ readonly faq: (path: string) => string;
207
+ readonly breadcrumb: (path: string) => string;
208
+ readonly person: (slug: string) => string;
209
+ readonly video: (path: string) => string;
210
+ readonly review: (id: string) => string;
211
+ readonly service: (slug: string) => string;
212
+ readonly customerOrganization: (slug: string) => string;
213
+ readonly customerPerson: (slug: string) => string;
214
+ };
215
+ /**
216
+ * Create all schema generators bound to a specific brand configuration.
217
+ * Returns an object with methods for each schema type.
218
+ */
219
+ declare function createSchemaGenerators(brand: BrandConfig, supportedLanguages?: readonly string[]): {
220
+ /** Organization schema — Homepage + About page. */
221
+ organization(locale?: string): {
222
+ '@context': string;
223
+ '@type': string;
224
+ '@id': `${string}/#organization`;
225
+ name: string;
226
+ url: string;
227
+ logo: {
228
+ '@type': string;
229
+ url: string;
230
+ };
231
+ description: string;
232
+ inLanguage: string;
233
+ availableLanguage: string[];
234
+ founder: {
235
+ '@type': string;
236
+ name: string;
237
+ };
238
+ sameAs: string[];
239
+ contactPoint: Record<string, unknown>[];
240
+ areaServed: string;
241
+ };
242
+ /** WebSite schema — Homepage only (with SearchAction). */
243
+ website(locale?: string): {
244
+ '@context': string;
245
+ '@type': string;
246
+ '@id': `${string}/#website`;
247
+ name: string;
248
+ url: string;
249
+ description: string;
250
+ inLanguage: string;
251
+ publisher: {
252
+ '@type': string;
253
+ '@id': `${string}/#organization`;
254
+ name: string;
255
+ };
256
+ potentialAction: ({
257
+ '@type': string;
258
+ target: {
259
+ '@type': string;
260
+ urlTemplate: string;
261
+ };
262
+ 'query-input': string;
263
+ } | {
264
+ '@type': string;
265
+ target: string;
266
+ 'query-input'?: undefined;
267
+ })[];
268
+ };
269
+ /** WebPage schema — Every public page. Links to WebSite + Breadcrumb via @id. */
270
+ webPage(path: string, title: string, description: string, locale?: string, speakable?: Record<string, unknown>): {
271
+ speakable?: Record<string, unknown> | undefined;
272
+ '@context': string;
273
+ '@type': string;
274
+ '@id': string;
275
+ url: string;
276
+ name: string;
277
+ description: string;
278
+ inLanguage: string;
279
+ isPartOf: {
280
+ '@type': string;
281
+ '@id': `${string}/#website`;
282
+ };
283
+ breadcrumb: {
284
+ '@id': string;
285
+ };
286
+ potentialAction: {
287
+ '@type': string;
288
+ target: string;
289
+ };
290
+ };
291
+ /** SoftwareApplication schema — Platform Hub, Platform Feature, Pricing. */
292
+ softwareApplication(name?: string, description?: string, url?: string, locale?: string): {
293
+ '@context': string;
294
+ '@type': string;
295
+ '@id': `${string}/#software`;
296
+ name: string;
297
+ description: string;
298
+ url: string;
299
+ applicationCategory: string;
300
+ operatingSystem: string;
301
+ inLanguage: string;
302
+ availableLanguage: string[];
303
+ offers: {
304
+ '@type': string;
305
+ priceCurrency: string;
306
+ lowPrice: string;
307
+ highPrice: string;
308
+ offerCount: string;
309
+ priceSpecification: {
310
+ '@type': string;
311
+ description: string;
312
+ };
313
+ };
314
+ author: {
315
+ '@type': string;
316
+ '@id': `${string}/#organization`;
317
+ name: string;
318
+ };
319
+ };
320
+ /** Article schema — Blog posts, Comparison pages. */
321
+ article(meta: ArticleMeta, locale?: string): {
322
+ video?: Record<string, unknown> | {
323
+ '@id': string;
324
+ } | undefined;
325
+ about?: Record<string, unknown> | {
326
+ '@id': string;
327
+ } | undefined;
328
+ '@context': string;
329
+ '@type': string;
330
+ '@id': string;
331
+ headline: string;
332
+ description: string;
333
+ url: string;
334
+ image: string;
335
+ datePublished: string;
336
+ dateModified: string;
337
+ inLanguage: string;
338
+ author: {
339
+ '@id': string;
340
+ '@type'?: undefined;
341
+ name?: undefined;
342
+ url?: undefined;
343
+ } | {
344
+ '@type': string;
345
+ name: string;
346
+ url: string;
347
+ '@id'?: undefined;
348
+ };
349
+ publisher: {
350
+ '@type': string;
351
+ '@id': `${string}/#organization`;
352
+ name: string;
353
+ logo: {
354
+ '@type': string;
355
+ url: string;
356
+ };
357
+ };
358
+ isPartOf: {
359
+ '@type': string;
360
+ '@id': `${string}/#website`;
361
+ };
362
+ mainEntityOfPage: {
363
+ '@id': string;
364
+ };
365
+ articleSection: string;
366
+ keywords: string | undefined;
367
+ speakable: {
368
+ '@type': string;
369
+ cssSelector: string[];
370
+ };
371
+ };
372
+ /** FAQPage schema — FAQ hub, Solutions, Platform Features, Comparisons, Integrations. */
373
+ faqPage(items: FAQItem[], pageUrl: string, locale?: string): {
374
+ '@context': string;
375
+ '@type': string;
376
+ '@id': string;
377
+ inLanguage: string;
378
+ mainEntity: {
379
+ '@type': string;
380
+ name: string;
381
+ acceptedAnswer: {
382
+ '@type': string;
383
+ text: string;
384
+ inLanguage: string;
385
+ };
386
+ }[];
387
+ };
388
+ /** BreadcrumbList schema — Every public page. */
389
+ breadcrumb(items: BreadcrumbItem[], locale?: string): {
390
+ '@context': string;
391
+ '@type': string;
392
+ '@id': string;
393
+ inLanguage: string;
394
+ itemListElement: {
395
+ '@type': string;
396
+ position: number;
397
+ name: string;
398
+ item: string;
399
+ }[];
400
+ };
401
+ /** Person schema — Team page, Blog author, Comparison author. */
402
+ person(person: PersonMeta, locale?: string): {
403
+ '@context': string;
404
+ '@type': string;
405
+ '@id': string;
406
+ name: string;
407
+ jobTitle: string;
408
+ url: string | undefined;
409
+ image: string | undefined;
410
+ inLanguage: string;
411
+ worksFor: {
412
+ name: string;
413
+ '@id'?: string | undefined;
414
+ } | {
415
+ '@type': string;
416
+ '@id': `${string}/#organization`;
417
+ name: string;
418
+ };
419
+ sameAs: string[];
420
+ };
421
+ /** Review schema — Generated from testimonials. */
422
+ review(testimonial: TestimonialForSchema): {
423
+ publisher?: {
424
+ '@type': string;
425
+ name: string;
426
+ } | undefined;
427
+ itemReviewed: {
428
+ '@type': string;
429
+ '@id': `${string}/#software`;
430
+ name: string;
431
+ };
432
+ datePublished?: string | undefined;
433
+ reviewRating?: {
434
+ '@type': string;
435
+ ratingValue: string;
436
+ bestRating: string;
437
+ worstRating: string;
438
+ } | undefined;
439
+ '@context': string;
440
+ '@type': string;
441
+ '@id': string;
442
+ author: {
443
+ jobTitle?: string | undefined;
444
+ name: string;
445
+ '@id'?: string | undefined;
446
+ '@type': string;
447
+ };
448
+ reviewBody: string;
449
+ };
450
+ /** Product + multiple Offers schema — Pricing page. */
451
+ productWithOffers(plans: PricingPlan[], testimonials?: TestimonialForSchema[], locale?: string): {
452
+ offers: {
453
+ priceSpecification?: {
454
+ '@type': string;
455
+ price: string;
456
+ priceCurrency: string;
457
+ billingDuration: string;
458
+ } | undefined;
459
+ '@type': string;
460
+ name: string;
461
+ description: string;
462
+ price: string;
463
+ priceCurrency: string;
464
+ availability: string;
465
+ url: string;
466
+ }[];
467
+ aggregateRating?: {
468
+ '@type': string;
469
+ ratingValue: string;
470
+ ratingCount: string;
471
+ bestRating: string;
472
+ worstRating: string;
473
+ } | undefined;
474
+ '@context': string;
475
+ '@type': string;
476
+ '@id': `${string}/pricing#product`;
477
+ name: string;
478
+ description: string;
479
+ brand: {
480
+ '@type': string;
481
+ '@id': `${string}/#organization`;
482
+ name: string;
483
+ };
484
+ inLanguage: string;
485
+ };
486
+ /** VideoObject schema — Transcript detail pages. */
487
+ videoObject(transcript: TranscriptForSchema, locale?: string): {
488
+ transcript?: string | undefined;
489
+ inLanguage: string;
490
+ publisher: {
491
+ '@type': string;
492
+ '@id': `${string}/#organization`;
493
+ name: string;
494
+ };
495
+ thumbnailUrl?: string | undefined;
496
+ uploadDate?: string | undefined;
497
+ duration?: string | undefined;
498
+ embedUrl?: string | undefined;
499
+ contentUrl?: string | undefined;
500
+ '@context': string;
501
+ '@type': string;
502
+ '@id': string;
503
+ name: string;
504
+ description: string;
505
+ };
506
+ /** CustomerOrganization schema — Customer's company for Success Story pages. */
507
+ customerOrganization(meta: CustomerOrganizationMeta): {
508
+ sameAs?: string[] | undefined;
509
+ industry?: string | undefined;
510
+ description?: string | undefined;
511
+ logo?: string | undefined;
512
+ url?: string | undefined;
513
+ '@context': string;
514
+ '@type': string;
515
+ '@id': string;
516
+ name: string;
517
+ };
518
+ /** Generic VideoObject — Success story main video and shorts. */
519
+ videoObjectGeneric(meta: VideoObjectMeta, locale?: string): {
520
+ inLanguage: string;
521
+ publisher: {
522
+ '@id': `${string}/#organization`;
523
+ };
524
+ transcript?: string | undefined;
525
+ uploadDate?: string | undefined;
526
+ duration?: string | undefined;
527
+ thumbnailUrl?: string | undefined;
528
+ embedUrl?: string | undefined;
529
+ contentUrl?: string | undefined;
530
+ description?: string | undefined;
531
+ '@context': string;
532
+ '@type': string;
533
+ '@id': string;
534
+ name: string;
535
+ };
536
+ /** HowTo schema — Solution pages, tutorial blog posts. */
537
+ howTo(steps: HowToStep[], meta: HowToMeta, locale?: string): {
538
+ step: {
539
+ image?: string | undefined;
540
+ url?: string | undefined;
541
+ '@type': string;
542
+ position: number;
543
+ name: string;
544
+ text: string;
545
+ }[];
546
+ image?: string | undefined;
547
+ totalTime?: string | undefined;
548
+ '@context': string;
549
+ '@type': string;
550
+ name: string;
551
+ description: string;
552
+ inLanguage: string;
553
+ };
554
+ /** Service schema — Growth motion service offerings. */
555
+ service(motion: ServiceMotion, locale?: string): {
556
+ termsOfService: string;
557
+ offers?: {
558
+ '@type': string;
559
+ price: string;
560
+ priceCurrency: string;
561
+ availability: string;
562
+ } | undefined;
563
+ '@context': string;
564
+ '@type': string;
565
+ '@id': string;
566
+ name: string;
567
+ description: string;
568
+ url: string;
569
+ provider: {
570
+ '@type': string;
571
+ '@id': `${string}/#organization`;
572
+ name: string;
573
+ };
574
+ inLanguage: string;
575
+ availableLanguage: string[];
576
+ areaServed: string;
577
+ };
578
+ /** JobPosting schema — Career detail pages. */
579
+ jobPosting(job: CareerForSchema, locale?: string): {
580
+ inLanguage: string;
581
+ jobLocation: {
582
+ '@type': string;
583
+ address: {
584
+ '@type': string;
585
+ addressLocality: string;
586
+ };
587
+ };
588
+ '@context': string;
589
+ '@type': string;
590
+ '@id': string;
591
+ title: string;
592
+ description: string;
593
+ datePosted: string;
594
+ employmentType: string;
595
+ hiringOrganization: {
596
+ '@type': string;
597
+ '@id': `${string}/#organization`;
598
+ name: string;
599
+ sameAs: string;
600
+ };
601
+ } | {
602
+ inLanguage: string;
603
+ jobLocationType: string;
604
+ '@context': string;
605
+ '@type': string;
606
+ '@id': string;
607
+ title: string;
608
+ description: string;
609
+ datePosted: string;
610
+ employmentType: string;
611
+ hiringOrganization: {
612
+ '@type': string;
613
+ '@id': `${string}/#organization`;
614
+ name: string;
615
+ sameAs: string;
616
+ };
617
+ };
618
+ /** ItemList schema — Hub/listing pages. */
619
+ itemList(items: ItemForList[], listName: string): {
620
+ '@context': string;
621
+ '@type': string;
622
+ name: string;
623
+ numberOfItems: number;
624
+ itemListElement: {
625
+ image?: string | undefined;
626
+ description?: string | undefined;
627
+ '@type': string;
628
+ position: number;
629
+ name: string;
630
+ url: string;
631
+ }[];
632
+ };
633
+ /** DefinedTermSet schema — Glossary page. */
634
+ definedTermSet(terms: GlossaryTermForSchema[], locale?: string): {
635
+ '@context': string;
636
+ '@type': string;
637
+ '@id': string;
638
+ name: string;
639
+ inLanguage: string;
640
+ hasDefinedTerm: {
641
+ '@type': string;
642
+ name: string;
643
+ description: string;
644
+ url: string;
645
+ }[];
646
+ };
647
+ /** Speakable — marks content sections suitable for voice assistant reading. */
648
+ speakable(cssSelectors: string[]): Record<string, unknown>;
649
+ /** Access the entity IDs for cross-referencing */
650
+ entityIds: {
651
+ readonly organization: `${string}/#organization`;
652
+ readonly website: `${string}/#website`;
653
+ readonly software: `${string}/#software`;
654
+ readonly product: `${string}/pricing#product`;
655
+ readonly webpage: (path: string) => string;
656
+ readonly article: (path: string) => string;
657
+ readonly faq: (path: string) => string;
658
+ readonly breadcrumb: (path: string) => string;
659
+ readonly person: (slug: string) => string;
660
+ readonly video: (path: string) => string;
661
+ readonly review: (id: string) => string;
662
+ readonly service: (slug: string) => string;
663
+ readonly customerOrganization: (slug: string) => string;
664
+ readonly customerPerson: (slug: string) => string;
665
+ };
666
+ };
667
+ /**
668
+ * Compute AggregateRating from real testimonial data.
669
+ * Falls back to hardcoded 4.7/150 when no rated testimonials exist.
670
+ * Returns a fragment (no @context) — meant to be embedded in Product/SoftwareApp.
671
+ */
672
+ declare function aggregateRatingFromTestimonials(testimonials: TestimonialForSchema[]): {
673
+ '@type': string;
674
+ ratingValue: string;
675
+ ratingCount: string;
676
+ bestRating: string;
677
+ worstRating: string;
678
+ };
679
+ /**
680
+ * Assemble multiple schema entities into a single @graph array.
681
+ * Strips individual `@context` from each schema — the wrapper provides it once.
682
+ *
683
+ * @example
684
+ * ```ts
685
+ * const graph = buildPageGraph(
686
+ * seo.organization(),
687
+ * seo.website(),
688
+ * seo.webPage('/pricing', 'Pricing', '...'),
689
+ * seo.breadcrumb(crumbs),
690
+ * );
691
+ * ```
692
+ */
693
+ declare function buildPageGraph(...schemas: Record<string, unknown>[]): Record<string, unknown>;
694
+ /**
695
+ * Build canonical URL from pathname.
696
+ * Removes trailing slash (except root) and query params.
697
+ *
698
+ * @param baseUrl - The site's base URL (e.g. "https://sales-mind.ai")
699
+ * @param pathname - The route path (e.g. "/pricing", "/blog/post/foo")
700
+ * @param locale - BCP-47 locale code. 'en' = no prefix (default). Others get /{locale}/ prefix.
701
+ */
702
+ declare function canonicalUrl(baseUrl: string, pathname: string, locale?: string): string;
703
+
704
+ /**
705
+ * JsonLd — Renders structured data as a `<script type="application/ld+json">` tag.
706
+ *
707
+ * Framework-agnostic: works with any React-based framework (Next.js, Vite, Remix, etc.).
708
+ * Safely serializes the data object and escapes `</script>` sequences.
709
+ *
710
+ * @example
711
+ * ```tsx
712
+ * import { JsonLd, buildPageGraph } from '@salesmind-ai/design-system/web';
713
+ *
714
+ * <JsonLd data={buildPageGraph(seo.organization(), seo.website())} />
715
+ * ```
716
+ */
717
+ interface JsonLdProps {
718
+ /** The structured data object (schema.org format) */
719
+ data: Record<string, unknown>;
720
+ /** Optional nonce for CSP headers */
721
+ nonce?: string;
722
+ }
723
+ declare function JsonLd({ data, nonce }: JsonLdProps): react_jsx_runtime.JSX.Element;
724
+
725
+ export { type ArticleMeta, type BrandConfig, type CareerForSchema, type CustomerOrganizationMeta, type FAQItem, type GlossaryTermForSchema, type HowToMeta, type HowToStep, type ItemForList, JsonLd, type JsonLdProps, type PersonMeta, type PricingPlan, type BreadcrumbItem as SeoBreadcrumbItem, type ServiceMotion, type TestimonialForSchema, type TranscriptForSchema, type VideoObjectMeta, aggregateRatingFromTestimonials, buildPageGraph, canonicalUrl, createEntityIds, createSchemaGenerators };