@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.d.mts CHANGED
@@ -25,12 +25,12 @@ export { g as ESCALATE_EXPLORE_CONVERSATION_MUTATION, h as EXPLORE_CATALOG_QUERY
25
25
  export { D as DEFAULT_EXPLORE_EXAMPLE_PROMPTS, E as ExploreChatError, a as ExploreChatErrorKind, b as ExploreChatPhase, c as ExploreEscalateOutcome, d as ExploreEscalateResult, F as FALLBACK_EXPLORE_LIMITS, U as UseExploreChatOptions, e as UseExploreChatResult, f as UseSpeechOutputOptions, g as UseSpeechOutputResult, h as classifyExploreError, s as stopSpeaking, u as useExploreChat, i as useProgressiveReveal, j as useSpeechOutput } from './use-progressive-reveal-BBLRAnbU.mjs';
26
26
  export { RybbitAnalytics, RybbitAnalyticsProps } from './analytics/index.mjs';
27
27
  export { PageHead, PageHeadProps } from './seo/index.mjs';
28
- export { ProductData, ProductProvider, ProductProviderProps, useProduct, useProductConfig } from './product/index.mjs';
28
+ export { ProductData, ProductProvider, ProductProviderProps, PublicProductFetchResult, fetchPublicProduct, useProduct, useProductConfig } from './product/index.mjs';
29
29
  import * as class_variance_authority_types from 'class-variance-authority/types';
30
30
  import { VariantProps } from 'class-variance-authority';
31
31
  import * as LabelPrimitive from '@radix-ui/react-label';
32
32
  export { B as BrowseStoreResult, G as GroupedStoreProducts, P as ProductCard, a as ProductCategory, R as RatingDistribution, S as SearchSuggestion, b as StarRating, c as StoreBrowsePage, d as StoreBrowsePageProps, e as StoreFacet, f as StoreFacets, g as StoreHomePage, h as StoreHomePageProps, i as StorePageProps, j as StoreProduct, k as StoreProductDetailPage, l as StoreProductDetailPageProps, m as StoreProductDetails, n as StorePublisher, o as StoreReview, p as StoreTerminology, q as StoreTypeFilter, T as TypeBadge, r as formatDownloads, s as formatPrice } from './product-card-CGxETsFa.mjs';
33
- export { EXPLORE_RECAPTCHA_ACTION, FOOTERLESS_ROUTES, RecaptchaV3, cn, getRecaptchaV3Token, isFooterlessPath, loadRecaptchaV3, normalizeRoutePath, shouldRenderSiteFooter } from './utils/index.mjs';
33
+ export { EXPLORE_RECAPTCHA_ACTION, FOOTERLESS_ROUTES, PRODUCT_SLUG_ALIASES, PRODUCT_SLUG_EMIT, PRODUCT_SLUG_RENAMES, ProductSlugGeneration, ProductSlugRename, RecaptchaV3, cn, emitProductSlug, getRecaptchaV3Token, isFooterlessPath, isSameProductSlug, legacyProductSlug, loadRecaptchaV3, normalizeProductSlug, normalizeRoutePath, productSlugVariants, shouldRenderSiteFooter } from './utils/index.mjs';
34
34
  import 'clsx';
35
35
 
36
36
  interface CareersSubmissionFormProps {
package/dist/index.d.ts CHANGED
@@ -25,12 +25,12 @@ export { g as ESCALATE_EXPLORE_CONVERSATION_MUTATION, h as EXPLORE_CATALOG_QUERY
25
25
  export { D as DEFAULT_EXPLORE_EXAMPLE_PROMPTS, E as ExploreChatError, a as ExploreChatErrorKind, b as ExploreChatPhase, c as ExploreEscalateOutcome, d as ExploreEscalateResult, F as FALLBACK_EXPLORE_LIMITS, U as UseExploreChatOptions, e as UseExploreChatResult, f as UseSpeechOutputOptions, g as UseSpeechOutputResult, h as classifyExploreError, s as stopSpeaking, u as useExploreChat, i as useProgressiveReveal, j as useSpeechOutput } from './use-progressive-reveal-myNKWb6S.js';
26
26
  export { RybbitAnalytics, RybbitAnalyticsProps } from './analytics/index.js';
27
27
  export { PageHead, PageHeadProps } from './seo/index.js';
28
- export { ProductData, ProductProvider, ProductProviderProps, useProduct, useProductConfig } from './product/index.js';
28
+ export { ProductData, ProductProvider, ProductProviderProps, PublicProductFetchResult, fetchPublicProduct, useProduct, useProductConfig } from './product/index.js';
29
29
  import * as class_variance_authority_types from 'class-variance-authority/types';
30
30
  import { VariantProps } from 'class-variance-authority';
31
31
  import * as LabelPrimitive from '@radix-ui/react-label';
32
32
  export { B as BrowseStoreResult, G as GroupedStoreProducts, P as ProductCard, a as ProductCategory, R as RatingDistribution, S as SearchSuggestion, b as StarRating, c as StoreBrowsePage, d as StoreBrowsePageProps, e as StoreFacet, f as StoreFacets, g as StoreHomePage, h as StoreHomePageProps, i as StorePageProps, j as StoreProduct, k as StoreProductDetailPage, l as StoreProductDetailPageProps, m as StoreProductDetails, n as StorePublisher, o as StoreReview, p as StoreTerminology, q as StoreTypeFilter, T as TypeBadge, r as formatDownloads, s as formatPrice } from './product-card-CGxETsFa.js';
33
- export { EXPLORE_RECAPTCHA_ACTION, FOOTERLESS_ROUTES, RecaptchaV3, cn, getRecaptchaV3Token, isFooterlessPath, loadRecaptchaV3, normalizeRoutePath, shouldRenderSiteFooter } from './utils/index.js';
33
+ export { EXPLORE_RECAPTCHA_ACTION, FOOTERLESS_ROUTES, PRODUCT_SLUG_ALIASES, PRODUCT_SLUG_EMIT, PRODUCT_SLUG_RENAMES, ProductSlugGeneration, ProductSlugRename, RecaptchaV3, cn, emitProductSlug, getRecaptchaV3Token, isFooterlessPath, isSameProductSlug, legacyProductSlug, loadRecaptchaV3, normalizeProductSlug, normalizeRoutePath, productSlugVariants, shouldRenderSiteFooter } from './utils/index.js';
34
34
  import 'clsx';
35
35
 
36
36
  interface CareersSubmissionFormProps {
package/dist/index.js CHANGED
@@ -375,6 +375,40 @@ function useWebSDKConfig() {
375
375
  const client = useWebSDK();
376
376
  return client.getConfig();
377
377
  }
378
+
379
+ // src/utils/product-slug.ts
380
+ var PRODUCT_SLUG_RENAMES = Object.freeze(
381
+ [Object.freeze({ legacy: "botlit", current: "botmanor" })]
382
+ );
383
+ var PRODUCT_SLUG_ALIASES = Object.freeze(
384
+ Object.fromEntries(PRODUCT_SLUG_RENAMES.map((r) => [r.legacy, r.current]))
385
+ );
386
+ var PRODUCT_SLUG_EMIT = Object.freeze({ productSlug: "current" });
387
+ function findRename(slug) {
388
+ const wanted = slug.toLowerCase();
389
+ return PRODUCT_SLUG_RENAMES.find(
390
+ (r) => r.legacy === wanted || r.current === wanted
391
+ );
392
+ }
393
+ function normalizeProductSlug(slug) {
394
+ if (slug == null) return slug;
395
+ return findRename(slug)?.current ?? slug;
396
+ }
397
+ function legacyProductSlug(slug) {
398
+ return findRename(slug)?.legacy ?? slug;
399
+ }
400
+ function productSlugVariants(slug) {
401
+ return [
402
+ .../* @__PURE__ */ new Set([slug, normalizeProductSlug(slug), legacyProductSlug(slug)])
403
+ ];
404
+ }
405
+ function isSameProductSlug(a, b) {
406
+ if (a == null || b == null) return a === b;
407
+ return a === b || normalizeProductSlug(a) === normalizeProductSlug(b);
408
+ }
409
+ function emitProductSlug(slug) {
410
+ return PRODUCT_SLUG_EMIT.productSlug === "current" ? normalizeProductSlug(slug) : legacyProductSlug(slug);
411
+ }
378
412
  var PRODUCT_FIELDS_BASE = `
379
413
  id
380
414
  name
@@ -422,6 +456,35 @@ var ProductContext = React.createContext({
422
456
  refetch: () => {
423
457
  }
424
458
  });
459
+ async function queryPublicProduct(client, slug) {
460
+ const result = await client.query(
461
+ PUBLIC_PRODUCT_QUERY,
462
+ { slug }
463
+ );
464
+ const schemaMissingResourceLinks = result.errors?.some(
465
+ (e) => /Cannot query field ["']?resourceLinks["']?/i.test(e?.message ?? "")
466
+ );
467
+ if (!schemaMissingResourceLinks) return result;
468
+ return client.query(
469
+ PUBLIC_PRODUCT_QUERY_FALLBACK,
470
+ { slug }
471
+ );
472
+ }
473
+ async function fetchPublicProduct(client, slug) {
474
+ for (const candidate of productSlugVariants(slug)) {
475
+ const result = await queryPublicProduct(client, candidate);
476
+ if (result.errors?.length) {
477
+ return {
478
+ product: null,
479
+ error: result.errors[0]?.message ?? "Unknown error"
480
+ };
481
+ }
482
+ if (result.data?.publicProduct) {
483
+ return { product: result.data.publicProduct, error: null };
484
+ }
485
+ }
486
+ return { product: null, error: null };
487
+ }
425
488
  function ProductProvider({ children, fallback }) {
426
489
  const client = useWebSDK();
427
490
  const config = useWebSDKConfig();
@@ -438,23 +501,11 @@ function ProductProvider({ children, fallback }) {
438
501
  setLoading(true);
439
502
  setError(null);
440
503
  try {
441
- let result = await client.query(
442
- PUBLIC_PRODUCT_QUERY,
443
- { slug: config.productSlug }
444
- );
445
- const schemaMissingResourceLinks = result.errors?.some(
446
- (e) => /Cannot query field ["']?resourceLinks["']?/i.test(e?.message ?? "")
447
- );
448
- if (schemaMissingResourceLinks) {
449
- result = await client.query(
450
- PUBLIC_PRODUCT_QUERY_FALLBACK,
451
- { slug: config.productSlug }
452
- );
453
- }
454
- if (result.errors?.length) {
455
- setError(result.errors[0]?.message ?? "Unknown error");
456
- } else if (result.data?.publicProduct) {
457
- setProduct(result.data.publicProduct);
504
+ const outcome = await fetchPublicProduct(client, config.productSlug);
505
+ if (outcome.error) {
506
+ setError(outcome.error);
507
+ } else if (outcome.product) {
508
+ setProduct(outcome.product);
458
509
  }
459
510
  } catch (err) {
460
511
  setError(err instanceof Error ? err.message : "Failed to fetch product");
@@ -8179,7 +8230,12 @@ var ECOSYSTEM_PRODUCTS = [
8179
8230
  },
8180
8231
  // BotManor ships on www.botmanor.com (the apex redirects there; the old botlit.ai domain
8181
8232
  // still serves the same site but is no longer the name we link to).
8182
- { slug: "botlit", name: "BotManor", websiteUrl: "https://www.botmanor.com" },
8233
+ // The slug follows the botlit → botmanor rename switch (utils/product-slug.ts).
8234
+ {
8235
+ slug: emitProductSlug("botmanor"),
8236
+ name: "BotManor",
8237
+ websiteUrl: "https://www.botmanor.com"
8238
+ },
8183
8239
  {
8184
8240
  slug: "bigconsole",
8185
8241
  name: "BigConsole",
@@ -12906,21 +12962,24 @@ function ProductStrip({
12906
12962
  children: T.allProducts
12907
12963
  }
12908
12964
  ),
12909
- products.map((product) => /* @__PURE__ */ jsxRuntime.jsx(
12910
- "button",
12911
- {
12912
- "data-boff-explore": "chip",
12913
- "data-chip-kind": "product",
12914
- "data-product": product.slug,
12915
- type: "button",
12916
- "aria-pressed": focusProduct === product.slug,
12917
- title: product.tagline ?? product.name,
12918
- onClick: () => onFocus(focusProduct === product.slug ? null : product.slug),
12919
- className: chipClass(focusProduct === product.slug),
12920
- children: product.name
12921
- },
12922
- product.slug
12923
- ))
12965
+ products.map((product) => {
12966
+ const focused = isSameProductSlug(focusProduct, product.slug);
12967
+ return /* @__PURE__ */ jsxRuntime.jsx(
12968
+ "button",
12969
+ {
12970
+ "data-boff-explore": "chip",
12971
+ "data-chip-kind": "product",
12972
+ "data-product": product.slug,
12973
+ type: "button",
12974
+ "aria-pressed": focused,
12975
+ title: product.tagline ?? product.name,
12976
+ onClick: () => onFocus(focused ? null : product.slug),
12977
+ className: chipClass(focused),
12978
+ children: product.name
12979
+ },
12980
+ product.slug
12981
+ );
12982
+ })
12924
12983
  ]
12925
12984
  }
12926
12985
  ),
@@ -13378,11 +13437,11 @@ function ExplorePage({
13378
13437
  const resolvedBody = welcomeBody ?? catalog.welcomeBody;
13379
13438
  const prompts = catalog.examplePrompts;
13380
13439
  const focusedProductName = React.useMemo(
13381
- () => catalog.products.find((p) => p.slug === focusProduct)?.name ?? null,
13440
+ () => catalog.products.find((p) => isSameProductSlug(p.slug, focusProduct))?.name ?? null,
13382
13441
  [catalog.products, focusProduct]
13383
13442
  );
13384
13443
  const headProductName = React.useMemo(
13385
- () => productSlug ? catalog.products.find((p) => p.slug === productSlug)?.name ?? null : null,
13444
+ () => productSlug ? catalog.products.find((p) => isSameProductSlug(p.slug, productSlug))?.name ?? null : null,
13386
13445
  [catalog.products, productSlug]
13387
13446
  );
13388
13447
  const imageOrigins = React.useMemo(
@@ -19001,6 +19060,9 @@ exports.LaunchCountdown = LaunchCountdown;
19001
19060
  exports.Markdown = Markdown;
19002
19061
  exports.NewsletterForm = NewsletterForm;
19003
19062
  exports.NewsletterPage = NewsletterPage;
19063
+ exports.PRODUCT_SLUG_ALIASES = PRODUCT_SLUG_ALIASES;
19064
+ exports.PRODUCT_SLUG_EMIT = PRODUCT_SLUG_EMIT;
19065
+ exports.PRODUCT_SLUG_RENAMES = PRODUCT_SLUG_RENAMES;
19004
19066
  exports.PUBLISHED_ANSWER_FIELDS = PUBLISHED_ANSWER_FIELDS;
19005
19067
  exports.PageHead = PageHead;
19006
19068
  exports.PartnersPage = PartnersPage;
@@ -19037,10 +19099,12 @@ exports.classifyExploreError = classifyExploreError;
19037
19099
  exports.cn = cn;
19038
19100
  exports.conceptPath = conceptPath;
19039
19101
  exports.detectElectronPlatform = detectElectronPlatform;
19102
+ exports.emitProductSlug = emitProductSlug;
19040
19103
  exports.exploreQuestionHref = exploreQuestionHref;
19041
19104
  exports.fetchPublicJobPosting = fetchPublicJobPosting;
19042
19105
  exports.fetchPublicJobPostings = fetchPublicJobPostings;
19043
19106
  exports.fetchPublicJobPostingsForSubmission = fetchPublicJobPostingsForSubmission;
19107
+ exports.fetchPublicProduct = fetchPublicProduct;
19044
19108
  exports.formatAnswerDate = formatAnswerDate;
19045
19109
  exports.formatDownloads = formatDownloads;
19046
19110
  exports.formatPrice = formatPrice2;
@@ -19052,10 +19116,14 @@ exports.isFooterlessPath = isFooterlessPath;
19052
19116
  exports.isInlineImageAllowed = isInlineImageAllowed;
19053
19117
  exports.isInlineVideoAllowed = isInlineVideoAllowed;
19054
19118
  exports.isPublishedSourceUrl = isPublishedSourceUrl;
19119
+ exports.isSameProductSlug = isSameProductSlug;
19055
19120
  exports.isValidUrl = isValidUrl;
19121
+ exports.legacyProductSlug = legacyProductSlug;
19056
19122
  exports.loadRecaptchaV3 = loadRecaptchaV3;
19057
19123
  exports.looksLikeDeliverableEmail = looksLikeDeliverableEmail;
19124
+ exports.normalizeProductSlug = normalizeProductSlug;
19058
19125
  exports.normalizeRoutePath = normalizeRoutePath;
19126
+ exports.productSlugVariants = productSlugVariants;
19059
19127
  exports.productSlugsByOrigin = productSlugsByOrigin;
19060
19128
  exports.shouldRenderSiteFooter = shouldRenderSiteFooter;
19061
19129
  exports.speechLocaleOf = speechLocaleOf;