@salesmind-ai/design-system 0.3.3 → 0.3.4

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 (215) hide show
  1. package/dist/{SectionShell-BfBw5q0Y.d.cts → SectionShell-GlglHCzz.d.cts} +1 -0
  2. package/dist/{SectionShell-BfBw5q0Y.d.ts → SectionShell-GlglHCzz.d.ts} +1 -0
  3. package/dist/StatsSection-B8iD9L-o.d.ts +68 -0
  4. package/dist/StatsSection-wgd8Vge1.d.cts +68 -0
  5. package/dist/admin/index.cjs +2928 -68
  6. package/dist/admin/index.cjs.map +1 -1
  7. package/dist/admin/index.js +2915 -5
  8. package/dist/admin/index.js.map +1 -1
  9. package/dist/blog/index.cjs +1064 -53
  10. package/dist/blog/index.cjs.map +1 -1
  11. package/dist/blog/index.d.cts +1 -1
  12. package/dist/blog/index.d.ts +1 -1
  13. package/dist/blog/index.js +1054 -8
  14. package/dist/blog/index.js.map +1 -1
  15. package/dist/charts/index.cjs +2694 -46
  16. package/dist/charts/index.cjs.map +1 -1
  17. package/dist/charts/index.js +2680 -3
  18. package/dist/charts/index.js.map +1 -1
  19. package/dist/core/index.cjs +4333 -807
  20. package/dist/core/index.cjs.map +1 -1
  21. package/dist/core/index.js +4130 -14
  22. package/dist/core/index.js.map +1 -1
  23. package/dist/i18n/index.cjs +558 -86
  24. package/dist/i18n/index.cjs.map +1 -1
  25. package/dist/i18n/index.js +544 -1
  26. package/dist/i18n/index.js.map +1 -1
  27. package/dist/index.cjs +17140 -1432
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.css +24 -13
  30. package/dist/index.css.map +1 -1
  31. package/dist/index.d.cts +2 -2
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +16785 -31
  34. package/dist/index.js.map +1 -1
  35. package/dist/marketing/index.cjs +3072 -142
  36. package/dist/marketing/index.cjs.map +1 -1
  37. package/dist/marketing/index.d.cts +1 -1
  38. package/dist/marketing/index.d.ts +1 -1
  39. package/dist/marketing/index.js +3042 -11
  40. package/dist/marketing/index.js.map +1 -1
  41. package/dist/motion/index.cjs +1222 -26
  42. package/dist/motion/index.cjs.map +1 -1
  43. package/dist/motion/index.js +1215 -2
  44. package/dist/motion/index.js.map +1 -1
  45. package/dist/nav/index.cjs +1518 -101
  46. package/dist/nav/index.cjs.map +1 -1
  47. package/dist/nav/index.css +24 -13
  48. package/dist/nav/index.css.map +1 -1
  49. package/dist/nav/index.js +1498 -4
  50. package/dist/nav/index.js.map +1 -1
  51. package/dist/report/index.cjs +2403 -171
  52. package/dist/report/index.cjs.map +1 -1
  53. package/dist/report/index.js +2363 -3
  54. package/dist/report/index.js.map +1 -1
  55. package/dist/sections/index.cjs +382 -28
  56. package/dist/sections/index.cjs.map +1 -1
  57. package/dist/sections/index.d.cts +15 -69
  58. package/dist/sections/index.d.ts +15 -69
  59. package/dist/sections/index.js +376 -4
  60. package/dist/sections/index.js.map +1 -1
  61. package/dist/social-proof/index.cjs +1250 -53
  62. package/dist/social-proof/index.cjs.map +1 -1
  63. package/dist/social-proof/index.d.cts +1 -1
  64. package/dist/social-proof/index.d.ts +1 -1
  65. package/dist/social-proof/index.js +1235 -6
  66. package/dist/social-proof/index.js.map +1 -1
  67. package/dist/theme/index.cjs +565 -38
  68. package/dist/theme/index.cjs.map +1 -1
  69. package/dist/theme/index.js +555 -2
  70. package/dist/theme/index.js.map +1 -1
  71. package/dist/web/client/index.cjs +491 -38
  72. package/dist/web/client/index.cjs.map +1 -1
  73. package/dist/web/client/index.js +483 -4
  74. package/dist/web/client/index.js.map +1 -1
  75. package/dist/web/index.cjs +1346 -158
  76. package/dist/web/index.cjs.map +1 -1
  77. package/dist/web/index.js +1305 -9
  78. package/dist/web/index.js.map +1 -1
  79. package/dist/web/server/index.cjs +563 -26
  80. package/dist/web/server/index.cjs.map +1 -1
  81. package/dist/web/server/index.js +560 -1
  82. package/dist/web/server/index.js.map +1 -1
  83. package/package.json +1 -1
  84. package/dist/chunk-2GARWEJK.js +0 -17
  85. package/dist/chunk-2GARWEJK.js.map +0 -1
  86. package/dist/chunk-3NKRFUAR.js +0 -37
  87. package/dist/chunk-3NKRFUAR.js.map +0 -1
  88. package/dist/chunk-3TGSIILM.cjs +0 -201
  89. package/dist/chunk-3TGSIILM.cjs.map +0 -1
  90. package/dist/chunk-4GM5BGBN.cjs +0 -801
  91. package/dist/chunk-4GM5BGBN.cjs.map +0 -1
  92. package/dist/chunk-5LGDEZWY.cjs +0 -2434
  93. package/dist/chunk-5LGDEZWY.cjs.map +0 -1
  94. package/dist/chunk-6H4DSTXR.js +0 -786
  95. package/dist/chunk-6H4DSTXR.js.map +0 -1
  96. package/dist/chunk-6UNG76Y2.js +0 -153
  97. package/dist/chunk-6UNG76Y2.js.map +0 -1
  98. package/dist/chunk-7PX2AZ6Y.js +0 -39
  99. package/dist/chunk-7PX2AZ6Y.js.map +0 -1
  100. package/dist/chunk-B6AVAX4F.js +0 -1415
  101. package/dist/chunk-B6AVAX4F.js.map +0 -1
  102. package/dist/chunk-BILT5KD3.js +0 -264
  103. package/dist/chunk-BILT5KD3.js.map +0 -1
  104. package/dist/chunk-C2BCDNAV.js +0 -24
  105. package/dist/chunk-C2BCDNAV.js.map +0 -1
  106. package/dist/chunk-CH42VPWE.cjs +0 -421
  107. package/dist/chunk-CH42VPWE.cjs.map +0 -1
  108. package/dist/chunk-CJ2MKVAF.cjs +0 -46
  109. package/dist/chunk-CJ2MKVAF.cjs.map +0 -1
  110. package/dist/chunk-DP74LUXG.cjs +0 -98
  111. package/dist/chunk-DP74LUXG.cjs.map +0 -1
  112. package/dist/chunk-E7D6EKJ4.cjs +0 -44
  113. package/dist/chunk-E7D6EKJ4.cjs.map +0 -1
  114. package/dist/chunk-ECXBTUH6.cjs +0 -584
  115. package/dist/chunk-ECXBTUH6.cjs.map +0 -1
  116. package/dist/chunk-EFRAP5ES.js +0 -157
  117. package/dist/chunk-EFRAP5ES.js.map +0 -1
  118. package/dist/chunk-F6YYWMME.js +0 -485
  119. package/dist/chunk-F6YYWMME.js.map +0 -1
  120. package/dist/chunk-FAFAP4L5.js +0 -183
  121. package/dist/chunk-FAFAP4L5.js.map +0 -1
  122. package/dist/chunk-GUZIMHWS.js +0 -1608
  123. package/dist/chunk-GUZIMHWS.js.map +0 -1
  124. package/dist/chunk-H2Y6BSTL.cjs +0 -69
  125. package/dist/chunk-H2Y6BSTL.cjs.map +0 -1
  126. package/dist/chunk-HN4PHABT.js +0 -126
  127. package/dist/chunk-HN4PHABT.js.map +0 -1
  128. package/dist/chunk-HRENHNDJ.js +0 -211
  129. package/dist/chunk-HRENHNDJ.js.map +0 -1
  130. package/dist/chunk-I75BFEYT.cjs +0 -2561
  131. package/dist/chunk-I75BFEYT.cjs.map +0 -1
  132. package/dist/chunk-IFRATNLU.js +0 -562
  133. package/dist/chunk-IFRATNLU.js.map +0 -1
  134. package/dist/chunk-IYPXJ6YC.cjs +0 -69
  135. package/dist/chunk-IYPXJ6YC.cjs.map +0 -1
  136. package/dist/chunk-JPJN4YBC.js +0 -409
  137. package/dist/chunk-JPJN4YBC.js.map +0 -1
  138. package/dist/chunk-KBA2LFBG.js +0 -62
  139. package/dist/chunk-KBA2LFBG.js.map +0 -1
  140. package/dist/chunk-KCKUSU2M.cjs +0 -166
  141. package/dist/chunk-KCKUSU2M.cjs.map +0 -1
  142. package/dist/chunk-KJ2OXQF4.js +0 -287
  143. package/dist/chunk-KJ2OXQF4.js.map +0 -1
  144. package/dist/chunk-KNQEIU7O.cjs +0 -1202
  145. package/dist/chunk-KNQEIU7O.cjs.map +0 -1
  146. package/dist/chunk-KVGSVGRK.cjs +0 -569
  147. package/dist/chunk-KVGSVGRK.cjs.map +0 -1
  148. package/dist/chunk-L352JRV6.cjs +0 -105
  149. package/dist/chunk-L352JRV6.cjs.map +0 -1
  150. package/dist/chunk-LJADZITX.cjs +0 -298
  151. package/dist/chunk-LJADZITX.cjs.map +0 -1
  152. package/dist/chunk-LMJPWXTZ.cjs +0 -194
  153. package/dist/chunk-LMJPWXTZ.cjs.map +0 -1
  154. package/dist/chunk-LOWEAQST.js +0 -701
  155. package/dist/chunk-LOWEAQST.js.map +0 -1
  156. package/dist/chunk-MDB2WCRQ.cjs +0 -137
  157. package/dist/chunk-MDB2WCRQ.cjs.map +0 -1
  158. package/dist/chunk-MQDEE7HC.cjs +0 -283
  159. package/dist/chunk-MQDEE7HC.cjs.map +0 -1
  160. package/dist/chunk-MQRB634A.cjs +0 -34
  161. package/dist/chunk-MQRB634A.cjs.map +0 -1
  162. package/dist/chunk-MTI27RDV.js +0 -185
  163. package/dist/chunk-MTI27RDV.js.map +0 -1
  164. package/dist/chunk-MU6GW5ZV.js +0 -2317
  165. package/dist/chunk-MU6GW5ZV.js.map +0 -1
  166. package/dist/chunk-NN3TUHIH.js +0 -28
  167. package/dist/chunk-NN3TUHIH.js.map +0 -1
  168. package/dist/chunk-NT4LBP7D.cjs +0 -111
  169. package/dist/chunk-NT4LBP7D.cjs.map +0 -1
  170. package/dist/chunk-OLV7OD3X.cjs +0 -502
  171. package/dist/chunk-OLV7OD3X.cjs.map +0 -1
  172. package/dist/chunk-OXNXEQY7.js +0 -2538
  173. package/dist/chunk-OXNXEQY7.js.map +0 -1
  174. package/dist/chunk-P5BOFE5A.js +0 -546
  175. package/dist/chunk-P5BOFE5A.js.map +0 -1
  176. package/dist/chunk-Q2MFGYTE.cjs +0 -1449
  177. package/dist/chunk-Q2MFGYTE.cjs.map +0 -1
  178. package/dist/chunk-Q75DBVDY.cjs +0 -68
  179. package/dist/chunk-Q75DBVDY.cjs.map +0 -1
  180. package/dist/chunk-REQ5Q6ZI.js +0 -1022
  181. package/dist/chunk-REQ5Q6ZI.js.map +0 -1
  182. package/dist/chunk-SICKWUWB.js +0 -62
  183. package/dist/chunk-SICKWUWB.js.map +0 -1
  184. package/dist/chunk-T343CCH5.js +0 -1190
  185. package/dist/chunk-T343CCH5.js.map +0 -1
  186. package/dist/chunk-TEC62D4A.cjs +0 -1624
  187. package/dist/chunk-TEC62D4A.cjs.map +0 -1
  188. package/dist/chunk-TW5JB35D.js +0 -2122
  189. package/dist/chunk-TW5JB35D.js.map +0 -1
  190. package/dist/chunk-VC5LMUVQ.cjs +0 -20
  191. package/dist/chunk-VC5LMUVQ.cjs.map +0 -1
  192. package/dist/chunk-VM7WFMKI.cjs +0 -76
  193. package/dist/chunk-VM7WFMKI.cjs.map +0 -1
  194. package/dist/chunk-W2WTP6HS.cjs +0 -233
  195. package/dist/chunk-W2WTP6HS.cjs.map +0 -1
  196. package/dist/chunk-WH7PYHZY.cjs +0 -35
  197. package/dist/chunk-WH7PYHZY.cjs.map +0 -1
  198. package/dist/chunk-XQZVY7JJ.cjs +0 -717
  199. package/dist/chunk-XQZVY7JJ.cjs.map +0 -1
  200. package/dist/chunk-XU3OMQ7V.js +0 -98
  201. package/dist/chunk-XU3OMQ7V.js.map +0 -1
  202. package/dist/chunk-XWPDRMZG.js +0 -62
  203. package/dist/chunk-XWPDRMZG.js.map +0 -1
  204. package/dist/chunk-Y3CPKNB7.js +0 -67
  205. package/dist/chunk-Y3CPKNB7.js.map +0 -1
  206. package/dist/chunk-YNVRDD2P.js +0 -98
  207. package/dist/chunk-YNVRDD2P.js.map +0 -1
  208. package/dist/chunk-YSYR54XR.js +0 -92
  209. package/dist/chunk-YSYR54XR.js.map +0 -1
  210. package/dist/chunk-YTYDQBVY.cjs +0 -162
  211. package/dist/chunk-YTYDQBVY.cjs.map +0 -1
  212. package/dist/chunk-ZDLOA2UT.cjs +0 -1042
  213. package/dist/chunk-ZDLOA2UT.cjs.map +0 -1
  214. package/dist/chunk-ZWUKRCOJ.cjs +0 -2162
  215. package/dist/chunk-ZWUKRCOJ.cjs.map +0 -1
@@ -1,32 +1,569 @@
1
1
  'use strict';
2
2
 
3
- var chunkKVGSVGRK_cjs = require('../../chunk-KVGSVGRK.cjs');
3
+ var jsxRuntime = require('react/jsx-runtime');
4
4
 
5
+ // src/web/seo/schema-generators.ts
6
+ function toISO8601Duration(duration) {
7
+ if (duration.startsWith("PT")) return duration;
8
+ const parts = duration.split(":").map(Number);
9
+ if (parts.some(isNaN)) return duration;
10
+ if (parts.length === 3) return `PT${parts[0]}H${parts[1]}M${parts[2]}S`;
11
+ if (parts.length === 2) return `PT${parts[0]}M${parts[1]}S`;
12
+ return `PT${parts[0]}S`;
13
+ }
14
+ function toEmbedUrl(url) {
15
+ try {
16
+ const parsed = new URL(url);
17
+ if (parsed.hostname.includes("youtube.com") && parsed.searchParams.has("v")) {
18
+ return `https://www.youtube.com/embed/${parsed.searchParams.get("v")}`;
19
+ }
20
+ if (parsed.hostname === "youtu.be") {
21
+ return `https://www.youtube.com/embed${parsed.pathname}`;
22
+ }
23
+ return url;
24
+ } catch {
25
+ return void 0;
26
+ }
27
+ }
28
+ function mapEmploymentType(type) {
29
+ if (!type) return "FULL_TIME";
30
+ const lower = type.toLowerCase();
31
+ if (lower.includes("part")) return "PART_TIME";
32
+ if (lower.includes("contract")) return "CONTRACTOR";
33
+ if (lower.includes("intern")) return "INTERN";
34
+ if (lower.includes("temporary") || lower.includes("temp")) return "TEMPORARY";
35
+ return "FULL_TIME";
36
+ }
37
+ function createEntityIds(brand) {
38
+ return {
39
+ organization: `${brand.url}/#organization`,
40
+ website: `${brand.url}/#website`,
41
+ software: `${brand.url}/#software`,
42
+ product: `${brand.url}/pricing#product`,
43
+ webpage: (path) => `${brand.url}${path}#webpage`,
44
+ article: (path) => `${brand.url}${path}#article`,
45
+ faq: (path) => `${brand.url}${path}#faq`,
46
+ breadcrumb: (path) => `${brand.url}${path}#breadcrumb`,
47
+ person: (slug) => `${brand.url}/company/team#person-${slug}`,
48
+ video: (path) => `${brand.url}${path}#video`,
49
+ review: (id) => `${brand.url}/#review-${id}`,
50
+ service: (slug) => `${brand.url}/#service-${slug}`,
51
+ customerOrganization: (slug) => `${brand.url}/#customer-org-${slug}`,
52
+ customerPerson: (slug) => `${brand.url}/#customer-person-${slug}`
53
+ };
54
+ }
55
+ function createSchemaGenerators(brand, supportedLanguages = ["en", "fr", "es"]) {
56
+ const ENTITY_IDS = createEntityIds(brand);
57
+ return {
58
+ /** Organization schema — Homepage + About page. */
59
+ organization(locale = "en") {
60
+ return {
61
+ "@context": "https://schema.org",
62
+ "@type": "Organization",
63
+ "@id": ENTITY_IDS.organization,
64
+ name: brand.name,
65
+ url: brand.url,
66
+ logo: {
67
+ "@type": "ImageObject",
68
+ url: `${brand.url}/logo.svg`
69
+ },
70
+ description: brand.description,
71
+ inLanguage: locale,
72
+ availableLanguage: [...supportedLanguages],
73
+ founder: {
74
+ "@type": "Person",
75
+ name: brand.founder
76
+ },
77
+ sameAs: [],
78
+ contactPoint: [],
79
+ areaServed: "Worldwide"
80
+ };
81
+ },
82
+ /** WebSite schema — Homepage only (with SearchAction). */
83
+ website(locale = "en") {
84
+ return {
85
+ "@context": "https://schema.org",
86
+ "@type": "WebSite",
87
+ "@id": ENTITY_IDS.website,
88
+ name: brand.name,
89
+ url: brand.url,
90
+ description: brand.tagline,
91
+ inLanguage: locale,
92
+ publisher: {
93
+ "@type": "Organization",
94
+ "@id": ENTITY_IDS.organization,
95
+ name: brand.name
96
+ },
97
+ potentialAction: [
98
+ {
99
+ "@type": "SearchAction",
100
+ target: {
101
+ "@type": "EntryPoint",
102
+ urlTemplate: `${brand.url}/blog?q={search_term_string}`
103
+ },
104
+ "query-input": "required name=search_term_string"
105
+ },
106
+ {
107
+ "@type": "ReadAction",
108
+ target: brand.url
109
+ }
110
+ ]
111
+ };
112
+ },
113
+ /** WebPage schema — Every public page. Links to WebSite + Breadcrumb via @id. */
114
+ webPage(path, title, description, locale = "en", speakable) {
115
+ return {
116
+ "@context": "https://schema.org",
117
+ "@type": "WebPage",
118
+ "@id": ENTITY_IDS.webpage(path),
119
+ url: `${brand.url}${path}`,
120
+ name: title,
121
+ description,
122
+ inLanguage: locale,
123
+ isPartOf: { "@type": "WebSite", "@id": ENTITY_IDS.website },
124
+ breadcrumb: { "@id": ENTITY_IDS.breadcrumb(path) },
125
+ potentialAction: {
126
+ "@type": "ReadAction",
127
+ target: `${brand.url}${path}`
128
+ },
129
+ ...speakable ? { speakable } : {}
130
+ };
131
+ },
132
+ /** SoftwareApplication schema — Platform Hub, Platform Feature, Pricing. */
133
+ softwareApplication(name, description, url, locale = "en") {
134
+ return {
135
+ "@context": "https://schema.org",
136
+ "@type": "SoftwareApplication",
137
+ "@id": ENTITY_IDS.software,
138
+ name: name || brand.name,
139
+ description: description || brand.description,
140
+ url: url || brand.url,
141
+ applicationCategory: "BusinessApplication",
142
+ operatingSystem: "Web",
143
+ inLanguage: locale,
144
+ availableLanguage: [...supportedLanguages],
145
+ offers: {
146
+ "@type": "AggregateOffer",
147
+ priceCurrency: "USD",
148
+ lowPrice: "0",
149
+ highPrice: "0",
150
+ offerCount: "2",
151
+ priceSpecification: {
152
+ "@type": "PriceSpecification",
153
+ description: "Custom pricing \u2014 contact sales for a tailored quote"
154
+ }
155
+ },
156
+ author: {
157
+ "@type": "Organization",
158
+ "@id": ENTITY_IDS.organization,
159
+ name: brand.name
160
+ }
161
+ };
162
+ },
163
+ /** Article schema — Blog posts, Comparison pages. */
164
+ article(meta, locale = "en") {
165
+ let path;
166
+ try {
167
+ path = new URL(meta.url).pathname;
168
+ } catch {
169
+ path = meta.url.startsWith("/") ? meta.url : `/${meta.url}`;
170
+ }
171
+ return {
172
+ "@context": "https://schema.org",
173
+ "@type": "Article",
174
+ "@id": ENTITY_IDS.article(path),
175
+ headline: meta.title,
176
+ description: meta.description,
177
+ url: meta.url.startsWith("http") ? meta.url : `${brand.url}${meta.url}`,
178
+ image: meta.image || `${brand.url}/og-default.png`,
179
+ datePublished: meta.publishedTime,
180
+ dateModified: meta.modifiedTime,
181
+ inLanguage: locale,
182
+ author: meta.authorSlug ? { "@id": ENTITY_IDS.person(meta.authorSlug) } : {
183
+ "@type": "Person",
184
+ name: meta.authorName,
185
+ url: meta.authorUrl || `${brand.url}/company/team`
186
+ },
187
+ publisher: {
188
+ "@type": "Organization",
189
+ "@id": ENTITY_IDS.organization,
190
+ name: brand.name,
191
+ logo: {
192
+ "@type": "ImageObject",
193
+ url: `${brand.url}/logo.svg`
194
+ }
195
+ },
196
+ isPartOf: { "@type": "WebSite", "@id": ENTITY_IDS.website },
197
+ mainEntityOfPage: { "@id": ENTITY_IDS.webpage(path) },
198
+ articleSection: meta.section,
199
+ keywords: meta.tags?.join(", "),
200
+ speakable: {
201
+ "@type": "SpeakableSpecification",
202
+ cssSelector: meta.speakableCssSelectors || ["article h1", "article .summary", "article .lead"]
203
+ },
204
+ ...meta.about ? { about: meta.about } : {},
205
+ ...meta.video ? { video: meta.video } : {}
206
+ };
207
+ },
208
+ /** FAQPage schema — FAQ hub, Solutions, Platform Features, Comparisons, Integrations. */
209
+ faqPage(items, pageUrl, locale = "en") {
210
+ return {
211
+ "@context": "https://schema.org",
212
+ "@type": "FAQPage",
213
+ "@id": ENTITY_IDS.faq(pageUrl),
214
+ inLanguage: locale,
215
+ mainEntity: items.map((item) => ({
216
+ "@type": "Question",
217
+ name: item.question,
218
+ acceptedAnswer: {
219
+ "@type": "Answer",
220
+ text: item.answer,
221
+ inLanguage: locale
222
+ }
223
+ }))
224
+ };
225
+ },
226
+ /** BreadcrumbList schema — Every public page. */
227
+ breadcrumb(items, locale = "en") {
228
+ const lastUrl = items.length > 0 ? items[items.length - 1].url : "/";
229
+ const path = lastUrl.startsWith("http") ? new URL(lastUrl).pathname : lastUrl;
230
+ return {
231
+ "@context": "https://schema.org",
232
+ "@type": "BreadcrumbList",
233
+ "@id": ENTITY_IDS.breadcrumb(path),
234
+ inLanguage: locale,
235
+ itemListElement: items.map((item, index) => ({
236
+ "@type": "ListItem",
237
+ position: index + 1,
238
+ name: item.name,
239
+ item: item.url.startsWith("http") ? item.url : `${brand.url}${item.url}`
240
+ }))
241
+ };
242
+ },
243
+ /** Person schema — Team page, Blog author, Comparison author. */
244
+ person(person, locale = "en") {
245
+ const slug = person.slug || person.name.toLowerCase().replace(/\s+/g, "-");
246
+ return {
247
+ "@context": "https://schema.org",
248
+ "@type": "Person",
249
+ "@id": person.entityIdOverride || ENTITY_IDS.person(slug),
250
+ name: person.name,
251
+ jobTitle: person.jobTitle,
252
+ url: person.url,
253
+ image: person.image,
254
+ inLanguage: locale,
255
+ worksFor: person.worksFor || {
256
+ "@type": "Organization",
257
+ "@id": ENTITY_IDS.organization,
258
+ name: brand.name
259
+ },
260
+ sameAs: person.sameAs || []
261
+ };
262
+ },
263
+ /** Review schema — Generated from testimonials. */
264
+ review(testimonial) {
265
+ return {
266
+ "@context": "https://schema.org",
267
+ "@type": "Review",
268
+ "@id": ENTITY_IDS.review(testimonial.id),
269
+ author: {
270
+ "@type": "Person",
271
+ ...testimonial.authorEntityId ? { "@id": testimonial.authorEntityId } : {},
272
+ name: testimonial.customer_name,
273
+ ...testimonial.occupation ? { jobTitle: testimonial.occupation } : {}
274
+ },
275
+ reviewBody: testimonial.quote || "",
276
+ ...testimonial.star_rating ? {
277
+ reviewRating: {
278
+ "@type": "Rating",
279
+ ratingValue: String(testimonial.star_rating),
280
+ bestRating: "5",
281
+ worstRating: "1"
282
+ }
283
+ } : {},
284
+ ...testimonial.review_date ? { datePublished: testimonial.review_date } : {},
285
+ itemReviewed: {
286
+ "@type": "SoftwareApplication",
287
+ "@id": ENTITY_IDS.software,
288
+ name: brand.name
289
+ },
290
+ ...testimonial.review_source ? {
291
+ publisher: {
292
+ "@type": "Organization",
293
+ name: testimonial.review_source
294
+ }
295
+ } : {}
296
+ };
297
+ },
298
+ /** Product + multiple Offers schema — Pricing page. */
299
+ productWithOffers(plans, testimonials = [], locale = "en") {
300
+ return {
301
+ "@context": "https://schema.org",
302
+ "@type": "Product",
303
+ "@id": ENTITY_IDS.product,
304
+ name: brand.name,
305
+ description: brand.description,
306
+ brand: {
307
+ "@type": "Organization",
308
+ "@id": ENTITY_IDS.organization,
309
+ name: brand.name
310
+ },
311
+ inLanguage: locale,
312
+ ...testimonials.length > 0 ? { aggregateRating: aggregateRatingFromTestimonials(testimonials) } : {},
313
+ offers: plans.map((plan) => ({
314
+ "@type": "Offer",
315
+ name: plan.name,
316
+ description: plan.description,
317
+ price: plan.price.replace(/[^0-9.]/g, "") || "0",
318
+ priceCurrency: plan.priceCurrency || "USD",
319
+ availability: "https://schema.org/InStock",
320
+ url: `${brand.url}/pricing`,
321
+ ...plan.billingPeriod ? {
322
+ priceSpecification: {
323
+ "@type": "UnitPriceSpecification",
324
+ price: plan.price.replace(/[^0-9.]/g, "") || "0",
325
+ priceCurrency: plan.priceCurrency || "USD",
326
+ billingDuration: plan.billingPeriod
327
+ }
328
+ } : {}
329
+ }))
330
+ };
331
+ },
332
+ /** VideoObject schema — Transcript detail pages. */
333
+ videoObject(transcript, locale = "en") {
334
+ const path = transcript.path || `/resources/transcripts/${transcript.slug}`;
335
+ return {
336
+ "@context": "https://schema.org",
337
+ "@type": "VideoObject",
338
+ "@id": ENTITY_IDS.video(path),
339
+ name: transcript.title,
340
+ description: transcript.summary || transcript.title,
341
+ ...transcript.video_link ? { contentUrl: transcript.video_link } : {},
342
+ ...transcript.video_link ? { embedUrl: toEmbedUrl(transcript.video_link) } : {},
343
+ ...transcript.duration ? { duration: toISO8601Duration(transcript.duration) } : {},
344
+ ...transcript.published_at ? { uploadDate: transcript.published_at } : {},
345
+ ...transcript.thumbnailUrl ? { thumbnailUrl: transcript.thumbnailUrl } : {},
346
+ inLanguage: locale,
347
+ publisher: {
348
+ "@type": "Organization",
349
+ "@id": ENTITY_IDS.organization,
350
+ name: brand.name
351
+ },
352
+ ...transcript.transcript_text ? { transcript: transcript.transcript_text } : {}
353
+ };
354
+ },
355
+ /** CustomerOrganization schema — Customer's company for Success Story pages. */
356
+ customerOrganization(meta) {
357
+ return {
358
+ "@context": "https://schema.org",
359
+ "@type": "Organization",
360
+ "@id": ENTITY_IDS.customerOrganization(meta.slug),
361
+ name: meta.name,
362
+ ...meta.url ? { url: meta.url } : {},
363
+ ...meta.logo ? { logo: meta.logo } : {},
364
+ ...meta.description ? { description: meta.description } : {},
365
+ ...meta.industry ? { industry: meta.industry } : {},
366
+ ...meta.sameAs && meta.sameAs.length > 0 ? { sameAs: meta.sameAs } : {}
367
+ };
368
+ },
369
+ /** Generic VideoObject — Success story main video and shorts. */
370
+ videoObjectGeneric(meta, locale = "en") {
371
+ const videoId = meta.fragment ? `${brand.url}${meta.path}#${meta.fragment}` : ENTITY_IDS.video(meta.path);
372
+ return {
373
+ "@context": "https://schema.org",
374
+ "@type": "VideoObject",
375
+ "@id": videoId,
376
+ name: meta.title,
377
+ ...meta.description ? { description: meta.description } : {},
378
+ ...meta.videoUrl ? { contentUrl: meta.videoUrl } : {},
379
+ ...meta.embedUrl ? { embedUrl: meta.embedUrl } : {},
380
+ ...meta.thumbnailUrl ? { thumbnailUrl: meta.thumbnailUrl } : {},
381
+ ...meta.duration ? { duration: meta.duration } : {},
382
+ ...meta.uploadDate ? { uploadDate: meta.uploadDate } : {},
383
+ ...meta.transcript ? { transcript: meta.transcript } : {},
384
+ inLanguage: locale,
385
+ publisher: { "@id": ENTITY_IDS.organization }
386
+ };
387
+ },
388
+ /** HowTo schema — Solution pages, tutorial blog posts. */
389
+ howTo(steps, meta, locale = "en") {
390
+ return {
391
+ "@context": "https://schema.org",
392
+ "@type": "HowTo",
393
+ name: meta.name,
394
+ description: meta.description,
395
+ inLanguage: locale,
396
+ ...meta.totalTime ? { totalTime: meta.totalTime } : {},
397
+ ...meta.image ? { image: meta.image } : {},
398
+ step: steps.map((step, index) => ({
399
+ "@type": "HowToStep",
400
+ position: index + 1,
401
+ name: step.name,
402
+ text: step.text,
403
+ ...step.url ? { url: step.url } : {},
404
+ ...step.image ? { image: step.image } : {}
405
+ }))
406
+ };
407
+ },
408
+ /** Service schema — Growth motion service offerings. */
409
+ service(motion, locale = "en") {
410
+ return {
411
+ "@context": "https://schema.org",
412
+ "@type": "Service",
413
+ "@id": ENTITY_IDS.service(motion.slug),
414
+ name: motion.name,
415
+ description: motion.description,
416
+ url: motion.url.startsWith("http") ? motion.url : `${brand.url}${motion.url}`,
417
+ provider: {
418
+ "@type": "Organization",
419
+ "@id": ENTITY_IDS.organization,
420
+ name: brand.name
421
+ },
422
+ inLanguage: locale,
423
+ availableLanguage: [...supportedLanguages],
424
+ areaServed: "Worldwide",
425
+ ...motion.price ? {
426
+ offers: {
427
+ "@type": "Offer",
428
+ price: motion.price.replace(/[^0-9.]/g, "") || "0",
429
+ priceCurrency: motion.priceCurrency || "USD",
430
+ availability: "https://schema.org/InStock"
431
+ }
432
+ } : {},
433
+ termsOfService: `${brand.url}/legal/terms`
434
+ };
435
+ },
436
+ /** JobPosting schema — Career detail pages. */
437
+ jobPosting(job, locale = "en") {
438
+ return {
439
+ "@context": "https://schema.org",
440
+ "@type": "JobPosting",
441
+ "@id": `${brand.url}/careers/${job.slug}#jobposting`,
442
+ title: job.title,
443
+ description: job.description || "",
444
+ datePosted: job.published_at || job.created_at,
445
+ employmentType: mapEmploymentType(job.type),
446
+ hiringOrganization: {
447
+ "@type": "Organization",
448
+ "@id": ENTITY_IDS.organization,
449
+ name: brand.name,
450
+ sameAs: brand.url
451
+ },
452
+ ...job.location ? {
453
+ jobLocation: {
454
+ "@type": "Place",
455
+ address: {
456
+ "@type": "PostalAddress",
457
+ addressLocality: job.location
458
+ }
459
+ }
460
+ } : {
461
+ jobLocationType: "TELECOMMUTE"
462
+ },
463
+ inLanguage: locale
464
+ };
465
+ },
466
+ /** ItemList schema — Hub/listing pages. */
467
+ itemList(items, listName) {
468
+ return {
469
+ "@context": "https://schema.org",
470
+ "@type": "ItemList",
471
+ name: listName,
472
+ numberOfItems: items.length,
473
+ itemListElement: items.map((item, index) => ({
474
+ "@type": "ListItem",
475
+ position: item.position ?? index + 1,
476
+ name: item.name,
477
+ url: item.url.startsWith("http") ? item.url : `${brand.url}${item.url}`,
478
+ ...item.description ? { description: item.description } : {},
479
+ ...item.image ? { image: item.image } : {}
480
+ }))
481
+ };
482
+ },
483
+ /** DefinedTermSet schema — Glossary page. */
484
+ definedTermSet(terms, locale = "en") {
485
+ return {
486
+ "@context": "https://schema.org",
487
+ "@type": "DefinedTermSet",
488
+ "@id": `${brand.url}/resources/glossary#termset`,
489
+ name: "AI Sales Glossary",
490
+ inLanguage: locale,
491
+ hasDefinedTerm: terms.map((term) => ({
492
+ "@type": "DefinedTerm",
493
+ name: term.term,
494
+ description: term.definition,
495
+ url: term.url || `${brand.url}/resources/glossary#${term.slug}`
496
+ }))
497
+ };
498
+ },
499
+ /** Speakable — marks content sections suitable for voice assistant reading. */
500
+ speakable(cssSelectors) {
501
+ return {
502
+ "@type": "SpeakableSpecification",
503
+ cssSelector: cssSelectors
504
+ };
505
+ },
506
+ /** Access the entity IDs for cross-referencing */
507
+ entityIds: ENTITY_IDS
508
+ };
509
+ }
510
+ function aggregateRatingFromTestimonials(testimonials) {
511
+ const rated = testimonials.filter((t) => t.star_rating != null && t.star_rating > 0);
512
+ if (rated.length === 0) {
513
+ return {
514
+ "@type": "AggregateRating",
515
+ ratingValue: "4.7",
516
+ ratingCount: "150",
517
+ bestRating: "5",
518
+ worstRating: "1"
519
+ };
520
+ }
521
+ const sum = rated.reduce((acc, t) => acc + (t.star_rating || 0), 0);
522
+ const avg = (sum / rated.length).toFixed(1);
523
+ return {
524
+ "@type": "AggregateRating",
525
+ ratingValue: avg,
526
+ ratingCount: String(rated.length),
527
+ bestRating: "5",
528
+ worstRating: "1"
529
+ };
530
+ }
531
+ function buildPageGraph(...schemas) {
532
+ const graph = schemas.map((schema) => {
533
+ const { "@context": _, ...rest } = schema;
534
+ return rest;
535
+ });
536
+ return {
537
+ "@context": "https://schema.org",
538
+ "@graph": graph
539
+ };
540
+ }
541
+ function canonicalUrl(baseUrl, pathname, locale) {
542
+ const clean = pathname === "/" ? "/" : pathname.replace(/\/+$/, "");
543
+ if (locale && locale !== "en") {
544
+ const stripped = clean.replace(new RegExp(`^/${locale}(/|$)`), "$1") || "/";
545
+ const path = stripped === "/" ? "" : stripped;
546
+ return `${baseUrl}/${locale}${path}`;
547
+ }
548
+ return `${baseUrl}${clean}`;
549
+ }
550
+ function JsonLd({ data, nonce }) {
551
+ const json = JSON.stringify(data).replace(/<\/script>/gi, "<\\/script>");
552
+ return /* @__PURE__ */ jsxRuntime.jsx(
553
+ "script",
554
+ {
555
+ type: "application/ld+json",
556
+ nonce,
557
+ dangerouslySetInnerHTML: { __html: json }
558
+ }
559
+ );
560
+ }
5
561
 
6
-
7
- Object.defineProperty(exports, "JsonLd", {
8
- enumerable: true,
9
- get: function () { return chunkKVGSVGRK_cjs.JsonLd; }
10
- });
11
- Object.defineProperty(exports, "aggregateRatingFromTestimonials", {
12
- enumerable: true,
13
- get: function () { return chunkKVGSVGRK_cjs.aggregateRatingFromTestimonials; }
14
- });
15
- Object.defineProperty(exports, "buildPageGraph", {
16
- enumerable: true,
17
- get: function () { return chunkKVGSVGRK_cjs.buildPageGraph; }
18
- });
19
- Object.defineProperty(exports, "canonicalUrl", {
20
- enumerable: true,
21
- get: function () { return chunkKVGSVGRK_cjs.canonicalUrl; }
22
- });
23
- Object.defineProperty(exports, "createEntityIds", {
24
- enumerable: true,
25
- get: function () { return chunkKVGSVGRK_cjs.createEntityIds; }
26
- });
27
- Object.defineProperty(exports, "createSchemaGenerators", {
28
- enumerable: true,
29
- get: function () { return chunkKVGSVGRK_cjs.createSchemaGenerators; }
30
- });
562
+ exports.JsonLd = JsonLd;
563
+ exports.aggregateRatingFromTestimonials = aggregateRatingFromTestimonials;
564
+ exports.buildPageGraph = buildPageGraph;
565
+ exports.canonicalUrl = canonicalUrl;
566
+ exports.createEntityIds = createEntityIds;
567
+ exports.createSchemaGenerators = createSchemaGenerators;
31
568
  //# sourceMappingURL=out.js.map
32
569
  //# sourceMappingURL=index.cjs.map