@burdenoff/website-sdk 2026.925.3 → 2026.927.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 (59) hide show
  1. package/dist/components/contact.js +8 -0
  2. package/dist/components/contact.js.map +1 -1
  3. package/dist/components/contact.mjs +8 -0
  4. package/dist/components/contact.mjs.map +1 -1
  5. package/dist/components/explore.js +55 -18
  6. package/dist/components/explore.js.map +1 -1
  7. package/dist/components/explore.mjs +55 -18
  8. package/dist/components/explore.mjs.map +1 -1
  9. package/dist/components/newsletter.js +8 -0
  10. package/dist/components/newsletter.js.map +1 -1
  11. package/dist/components/newsletter.mjs +8 -0
  12. package/dist/components/newsletter.mjs.map +1 -1
  13. package/dist/components/partners.js +8 -0
  14. package/dist/components/partners.js.map +1 -1
  15. package/dist/components/partners.mjs +8 -0
  16. package/dist/components/partners.mjs.map +1 -1
  17. package/dist/components/resource-links.js +8 -0
  18. package/dist/components/resource-links.js.map +1 -1
  19. package/dist/components/resource-links.mjs +8 -0
  20. package/dist/components/resource-links.mjs.map +1 -1
  21. package/dist/components/social-links.js +8 -0
  22. package/dist/components/social-links.js.map +1 -1
  23. package/dist/components/social-links.mjs +8 -0
  24. package/dist/components/social-links.mjs.map +1 -1
  25. package/dist/components/waitlist.js +8 -0
  26. package/dist/components/waitlist.js.map +1 -1
  27. package/dist/components/waitlist.mjs +8 -0
  28. package/dist/components/waitlist.mjs.map +1 -1
  29. package/dist/content/index.js +8 -0
  30. package/dist/content/index.js.map +1 -1
  31. package/dist/content/index.mjs +8 -0
  32. package/dist/content/index.mjs.map +1 -1
  33. package/dist/hooks/index.js +30 -1
  34. package/dist/hooks/index.js.map +1 -1
  35. package/dist/hooks/index.mjs +30 -1
  36. package/dist/hooks/index.mjs.map +1 -1
  37. package/dist/index.d.mts +2 -2
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.js +103 -35
  40. package/dist/index.js.map +1 -1
  41. package/dist/index.mjs +95 -36
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/product/index.d.mts +16 -1
  44. package/dist/product/index.d.ts +16 -1
  45. package/dist/product/index.js +61 -17
  46. package/dist/product/index.js.map +1 -1
  47. package/dist/product/index.mjs +61 -18
  48. package/dist/product/index.mjs.map +1 -1
  49. package/dist/store/index.js +8 -0
  50. package/dist/store/index.js.map +1 -1
  51. package/dist/store/index.mjs +8 -0
  52. package/dist/store/index.mjs.map +1 -1
  53. package/dist/utils/index.d.mts +43 -1
  54. package/dist/utils/index.d.ts +43 -1
  55. package/dist/utils/index.js +42 -0
  56. package/dist/utils/index.js.map +1 -1
  57. package/dist/utils/index.mjs +35 -1
  58. package/dist/utils/index.mjs.map +1 -1
  59. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -345,6 +345,40 @@ function useWebSDKConfig() {
345
345
  const client = useWebSDK();
346
346
  return client.getConfig();
347
347
  }
348
+
349
+ // src/utils/product-slug.ts
350
+ var PRODUCT_SLUG_RENAMES = Object.freeze(
351
+ [Object.freeze({ legacy: "botlit", current: "botmanor" })]
352
+ );
353
+ var PRODUCT_SLUG_ALIASES = Object.freeze(
354
+ Object.fromEntries(PRODUCT_SLUG_RENAMES.map((r) => [r.legacy, r.current]))
355
+ );
356
+ var PRODUCT_SLUG_EMIT = Object.freeze({ productSlug: "current" });
357
+ function findRename(slug) {
358
+ const wanted = slug.toLowerCase();
359
+ return PRODUCT_SLUG_RENAMES.find(
360
+ (r) => r.legacy === wanted || r.current === wanted
361
+ );
362
+ }
363
+ function normalizeProductSlug(slug) {
364
+ if (slug == null) return slug;
365
+ return findRename(slug)?.current ?? slug;
366
+ }
367
+ function legacyProductSlug(slug) {
368
+ return findRename(slug)?.legacy ?? slug;
369
+ }
370
+ function productSlugVariants(slug) {
371
+ return [
372
+ .../* @__PURE__ */ new Set([slug, normalizeProductSlug(slug), legacyProductSlug(slug)])
373
+ ];
374
+ }
375
+ function isSameProductSlug(a, b) {
376
+ if (a == null || b == null) return a === b;
377
+ return a === b || normalizeProductSlug(a) === normalizeProductSlug(b);
378
+ }
379
+ function emitProductSlug(slug) {
380
+ return PRODUCT_SLUG_EMIT.productSlug === "current" ? normalizeProductSlug(slug) : legacyProductSlug(slug);
381
+ }
348
382
  var PRODUCT_FIELDS_BASE = `
349
383
  id
350
384
  name
@@ -392,6 +426,35 @@ var ProductContext = createContext({
392
426
  refetch: () => {
393
427
  }
394
428
  });
429
+ async function queryPublicProduct(client, slug) {
430
+ const result = await client.query(
431
+ PUBLIC_PRODUCT_QUERY,
432
+ { slug }
433
+ );
434
+ const schemaMissingResourceLinks = result.errors?.some(
435
+ (e) => /Cannot query field ["']?resourceLinks["']?/i.test(e?.message ?? "")
436
+ );
437
+ if (!schemaMissingResourceLinks) return result;
438
+ return client.query(
439
+ PUBLIC_PRODUCT_QUERY_FALLBACK,
440
+ { slug }
441
+ );
442
+ }
443
+ async function fetchPublicProduct(client, slug) {
444
+ for (const candidate of productSlugVariants(slug)) {
445
+ const result = await queryPublicProduct(client, candidate);
446
+ if (result.errors?.length) {
447
+ return {
448
+ product: null,
449
+ error: result.errors[0]?.message ?? "Unknown error"
450
+ };
451
+ }
452
+ if (result.data?.publicProduct) {
453
+ return { product: result.data.publicProduct, error: null };
454
+ }
455
+ }
456
+ return { product: null, error: null };
457
+ }
395
458
  function ProductProvider({ children, fallback }) {
396
459
  const client = useWebSDK();
397
460
  const config = useWebSDKConfig();
@@ -408,23 +471,11 @@ function ProductProvider({ children, fallback }) {
408
471
  setLoading(true);
409
472
  setError(null);
410
473
  try {
411
- let result = await client.query(
412
- PUBLIC_PRODUCT_QUERY,
413
- { slug: config.productSlug }
414
- );
415
- const schemaMissingResourceLinks = result.errors?.some(
416
- (e) => /Cannot query field ["']?resourceLinks["']?/i.test(e?.message ?? "")
417
- );
418
- if (schemaMissingResourceLinks) {
419
- result = await client.query(
420
- PUBLIC_PRODUCT_QUERY_FALLBACK,
421
- { slug: config.productSlug }
422
- );
423
- }
424
- if (result.errors?.length) {
425
- setError(result.errors[0]?.message ?? "Unknown error");
426
- } else if (result.data?.publicProduct) {
427
- setProduct(result.data.publicProduct);
474
+ const outcome = await fetchPublicProduct(client, config.productSlug);
475
+ if (outcome.error) {
476
+ setError(outcome.error);
477
+ } else if (outcome.product) {
478
+ setProduct(outcome.product);
428
479
  }
429
480
  } catch (err) {
430
481
  setError(err instanceof Error ? err.message : "Failed to fetch product");
@@ -8149,7 +8200,12 @@ var ECOSYSTEM_PRODUCTS = [
8149
8200
  },
8150
8201
  // BotManor ships on www.botmanor.com (the apex redirects there; the old botlit.ai domain
8151
8202
  // still serves the same site but is no longer the name we link to).
8152
- { slug: "botlit", name: "BotManor", websiteUrl: "https://www.botmanor.com" },
8203
+ // The slug follows the botlit → botmanor rename switch (utils/product-slug.ts).
8204
+ {
8205
+ slug: emitProductSlug("botmanor"),
8206
+ name: "BotManor",
8207
+ websiteUrl: "https://www.botmanor.com"
8208
+ },
8153
8209
  {
8154
8210
  slug: "bigconsole",
8155
8211
  name: "BigConsole",
@@ -12876,21 +12932,24 @@ function ProductStrip({
12876
12932
  children: T.allProducts
12877
12933
  }
12878
12934
  ),
12879
- products.map((product) => /* @__PURE__ */ jsx(
12880
- "button",
12881
- {
12882
- "data-boff-explore": "chip",
12883
- "data-chip-kind": "product",
12884
- "data-product": product.slug,
12885
- type: "button",
12886
- "aria-pressed": focusProduct === product.slug,
12887
- title: product.tagline ?? product.name,
12888
- onClick: () => onFocus(focusProduct === product.slug ? null : product.slug),
12889
- className: chipClass(focusProduct === product.slug),
12890
- children: product.name
12891
- },
12892
- product.slug
12893
- ))
12935
+ products.map((product) => {
12936
+ const focused = isSameProductSlug(focusProduct, product.slug);
12937
+ return /* @__PURE__ */ jsx(
12938
+ "button",
12939
+ {
12940
+ "data-boff-explore": "chip",
12941
+ "data-chip-kind": "product",
12942
+ "data-product": product.slug,
12943
+ type: "button",
12944
+ "aria-pressed": focused,
12945
+ title: product.tagline ?? product.name,
12946
+ onClick: () => onFocus(focused ? null : product.slug),
12947
+ className: chipClass(focused),
12948
+ children: product.name
12949
+ },
12950
+ product.slug
12951
+ );
12952
+ })
12894
12953
  ]
12895
12954
  }
12896
12955
  ),
@@ -13348,11 +13407,11 @@ function ExplorePage({
13348
13407
  const resolvedBody = welcomeBody ?? catalog.welcomeBody;
13349
13408
  const prompts = catalog.examplePrompts;
13350
13409
  const focusedProductName = useMemo(
13351
- () => catalog.products.find((p) => p.slug === focusProduct)?.name ?? null,
13410
+ () => catalog.products.find((p) => isSameProductSlug(p.slug, focusProduct))?.name ?? null,
13352
13411
  [catalog.products, focusProduct]
13353
13412
  );
13354
13413
  const headProductName = useMemo(
13355
- () => productSlug ? catalog.products.find((p) => p.slug === productSlug)?.name ?? null : null,
13414
+ () => productSlug ? catalog.products.find((p) => isSameProductSlug(p.slug, productSlug))?.name ?? null : null,
13356
13415
  [catalog.products, productSlug]
13357
13416
  );
13358
13417
  const imageOrigins = useMemo(
@@ -18925,6 +18984,6 @@ function shouldRenderSiteFooter(pathname) {
18925
18984
  return !isFooterlessPath(pathname);
18926
18985
  }
18927
18986
 
18928
- export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, AnswersPage, BlogListPage, BlogPostPage, Button, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CareersApplyForm, CareersSubmissionForm, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ConceptDetailPage, ConceptsPage, ContactPage, ContentRenderer, ContractsPage, DEFAULT_CONTACT_CATEGORIES, DEFAULT_EXPLORE_EXAMPLE_PROMPTS, DOMAINS_URL, ECOSYSTEM_PRODUCTS, ESCALATE_EXPLORE_CONVERSATION_MUTATION, EXPLORE_CATALOG_QUERY, EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS, EXPLORE_ESCALATION_NOTE_SOFT_MAX, EXPLORE_LOCALES, EXPLORE_MESSAGE_QUERY, EXPLORE_PREFILL_MAX_LENGTH, EXPLORE_RECAPTCHA_ACTION, ElectronDownloadLink, ExploreAnswerBody, ExploreAnswerStyles, ExploreCta, ExplorePage, FALLBACK_EXPLORE_LIMITS, FOOTERLESS_ROUTES, Input, Label, LaunchCountdown, Markdown, NewsletterForm, NewsletterPage, PUBLISHED_ANSWER_FIELDS, PageHead, PartnersPage, PressKitPage, PricingPage, PricingSection, ProblemsSolvedSection, ProductCard, ProductProvider, ResourceLinks, RybbitAnalytics, SEND_EXPLORE_MESSAGE_MUTATION, Select, SocialLinks, StarRating, StoreBrowsePage, StoreHomePage, StoreProductDetailPage, Textarea, TypeBadge, UnsubscribePage, WaitlistForm, WaitlistPage, WebSDKClient, WebSDKProvider, WebsiteSwitcher, answerPath, answerPlainText, answerSourceHost, answerSpeechText, answerStrings, buttonVariants, classifyExploreError, cn, conceptPath, detectElectronPlatform, exploreQuestionHref, fetchPublicJobPosting, fetchPublicJobPostings, fetchPublicJobPostingsForSubmission, formatAnswerDate, formatDownloads, formatPrice2 as formatPrice, getAnswerBySlug, getConceptBySlug, getRecaptchaV3Token, inlineImageOrigins, isFooterlessPath, isInlineImageAllowed, isInlineVideoAllowed, isPublishedSourceUrl, isValidUrl, loadRecaptchaV3, looksLikeDeliverableEmail, normalizeRoutePath, productSlugsByOrigin, shouldRenderSiteFooter, speechLocaleOf, stopSpeaking, useContentPage, useContentPages, useExploreChat, useProduct, useProductConfig, useProgressiveReveal, usePublicJobPosting, usePublicJobPostings, usePublicJobPostingsForSubmission, useSpeechOutput, useWebSDK, useWebSDKConfig };
18987
+ export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, AnswersPage, BlogListPage, BlogPostPage, Button, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CareersApplyForm, CareersSubmissionForm, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ConceptDetailPage, ConceptsPage, ContactPage, ContentRenderer, ContractsPage, DEFAULT_CONTACT_CATEGORIES, DEFAULT_EXPLORE_EXAMPLE_PROMPTS, DOMAINS_URL, ECOSYSTEM_PRODUCTS, ESCALATE_EXPLORE_CONVERSATION_MUTATION, EXPLORE_CATALOG_QUERY, EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS, EXPLORE_ESCALATION_NOTE_SOFT_MAX, EXPLORE_LOCALES, EXPLORE_MESSAGE_QUERY, EXPLORE_PREFILL_MAX_LENGTH, EXPLORE_RECAPTCHA_ACTION, ElectronDownloadLink, ExploreAnswerBody, ExploreAnswerStyles, ExploreCta, ExplorePage, FALLBACK_EXPLORE_LIMITS, FOOTERLESS_ROUTES, Input, Label, LaunchCountdown, Markdown, NewsletterForm, NewsletterPage, PRODUCT_SLUG_ALIASES, PRODUCT_SLUG_EMIT, PRODUCT_SLUG_RENAMES, PUBLISHED_ANSWER_FIELDS, PageHead, PartnersPage, PressKitPage, PricingPage, PricingSection, ProblemsSolvedSection, ProductCard, ProductProvider, ResourceLinks, RybbitAnalytics, SEND_EXPLORE_MESSAGE_MUTATION, Select, SocialLinks, StarRating, StoreBrowsePage, StoreHomePage, StoreProductDetailPage, Textarea, TypeBadge, UnsubscribePage, WaitlistForm, WaitlistPage, WebSDKClient, WebSDKProvider, WebsiteSwitcher, answerPath, answerPlainText, answerSourceHost, answerSpeechText, answerStrings, buttonVariants, classifyExploreError, cn, conceptPath, detectElectronPlatform, emitProductSlug, exploreQuestionHref, fetchPublicJobPosting, fetchPublicJobPostings, fetchPublicJobPostingsForSubmission, fetchPublicProduct, formatAnswerDate, formatDownloads, formatPrice2 as formatPrice, getAnswerBySlug, getConceptBySlug, getRecaptchaV3Token, inlineImageOrigins, isFooterlessPath, isInlineImageAllowed, isInlineVideoAllowed, isPublishedSourceUrl, isSameProductSlug, isValidUrl, legacyProductSlug, loadRecaptchaV3, looksLikeDeliverableEmail, normalizeProductSlug, normalizeRoutePath, productSlugVariants, productSlugsByOrigin, shouldRenderSiteFooter, speechLocaleOf, stopSpeaking, useContentPage, useContentPages, useExploreChat, useProduct, useProductConfig, useProgressiveReveal, usePublicJobPosting, usePublicJobPostings, usePublicJobPostingsForSubmission, useSpeechOutput, useWebSDK, useWebSDKConfig };
18929
18988
  //# sourceMappingURL=index.mjs.map
18930
18989
  //# sourceMappingURL=index.mjs.map