@burdenoff/website-sdk 2026.829.8 → 2026.921.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 (60) hide show
  1. package/README.md +112 -1
  2. package/dist/components/contact.js +4 -1
  3. package/dist/components/contact.js.map +1 -1
  4. package/dist/components/contact.mjs +4 -1
  5. package/dist/components/contact.mjs.map +1 -1
  6. package/dist/components/explore.d.mts +14 -1
  7. package/dist/components/explore.d.ts +14 -1
  8. package/dist/components/explore.js +217 -43
  9. package/dist/components/explore.js.map +1 -1
  10. package/dist/components/explore.mjs +217 -45
  11. package/dist/components/explore.mjs.map +1 -1
  12. package/dist/components/newsletter.js +4 -1
  13. package/dist/components/newsletter.js.map +1 -1
  14. package/dist/components/newsletter.mjs +4 -1
  15. package/dist/components/newsletter.mjs.map +1 -1
  16. package/dist/components/partners.js +23 -13
  17. package/dist/components/partners.js.map +1 -1
  18. package/dist/components/partners.mjs +23 -13
  19. package/dist/components/partners.mjs.map +1 -1
  20. package/dist/components/pricing.js +4 -1
  21. package/dist/components/pricing.js.map +1 -1
  22. package/dist/components/pricing.mjs +4 -1
  23. package/dist/components/pricing.mjs.map +1 -1
  24. package/dist/components/unsubscribe.js +4 -1
  25. package/dist/components/unsubscribe.js.map +1 -1
  26. package/dist/components/unsubscribe.mjs +4 -1
  27. package/dist/components/unsubscribe.mjs.map +1 -1
  28. package/dist/components/waitlist.js +4 -1
  29. package/dist/components/waitlist.js.map +1 -1
  30. package/dist/components/waitlist.mjs +4 -1
  31. package/dist/components/waitlist.mjs.map +1 -1
  32. package/dist/content/index.js +23 -13
  33. package/dist/content/index.js.map +1 -1
  34. package/dist/content/index.mjs +23 -13
  35. package/dist/content/index.mjs.map +1 -1
  36. package/dist/{use-explore-chat-BzXCz2UM.d.mts → explore-types-CLw19R76.d.mts} +1 -131
  37. package/dist/{use-explore-chat-BzXCz2UM.d.ts → explore-types-CLw19R76.d.ts} +1 -131
  38. package/dist/hooks/index.d.mts +2 -1
  39. package/dist/hooks/index.d.ts +2 -1
  40. package/dist/hooks/index.js +23 -7
  41. package/dist/hooks/index.js.map +1 -1
  42. package/dist/hooks/index.mjs +23 -7
  43. package/dist/hooks/index.mjs.map +1 -1
  44. package/dist/index.d.mts +143 -3
  45. package/dist/index.d.ts +143 -3
  46. package/dist/index.js +1552 -207
  47. package/dist/index.js.map +1 -1
  48. package/dist/index.mjs +1548 -210
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/seo/index.js +4 -1
  51. package/dist/seo/index.js.map +1 -1
  52. package/dist/seo/index.mjs +4 -1
  53. package/dist/seo/index.mjs.map +1 -1
  54. package/dist/store/index.js +23 -13
  55. package/dist/store/index.js.map +1 -1
  56. package/dist/store/index.mjs +23 -13
  57. package/dist/store/index.mjs.map +1 -1
  58. package/dist/use-explore-chat-CvW-kyIm.d.mts +145 -0
  59. package/dist/use-explore-chat-DdGBimiz.d.ts +145 -0
  60. package/package.json +1 -1
package/dist/index.d.mts CHANGED
@@ -5,6 +5,7 @@ export { PartnersPage, PartnersPageProps } from './components/partners.mjs';
5
5
  import { C as CareersPostingOption } from './index-BMWQNZDX.mjs';
6
6
  export { B as BlogListPage, a as BlogListPageProps, b as BlogPostPage, c as BlogPostPageProps, d as CareersApplyForm, e as CareersApplyFormProps, f as CaseStudiesListPage, g as CaseStudiesListPageProps, h as CaseStudyPage, i as CaseStudyPageProps, j as ChangelogEntry, k as ChangelogPage, l as ChangelogPageProps, m as ContentPageData, n as ContentPageListData, o as ContentPageListItem, p as ContentRenderer, q as ContractAsset, r as ContractsPage, s as ContractsPageProps, M as Markdown, t as MarkdownProps, P as PressKitAsset, u as PressKitAssetCategory, v as PressKitPage, w as PressKitPageProps, x as PublicInterviewRoundConfig, y as PublicJobPosting, U as UsePublicJobPostingOptions, z as UsePublicJobPostingsOptions, A as fetchPublicJobPosting, D as fetchPublicJobPostings, E as fetchPublicJobPostingsForSubmission, F as useContentPage, G as useContentPages, H as usePublicJobPosting, I as usePublicJobPostings, J as usePublicJobPostingsForSubmission } from './index-BMWQNZDX.mjs';
7
7
  import * as react from 'react';
8
+ import { ComponentType, ReactNode } from 'react';
8
9
  export { NewsletterForm, NewsletterFormProps, NewsletterPage, NewsletterPageProps } from './components/newsletter.mjs';
9
10
  export { PlanCard, PricingPage, PricingProps, PricingSection } from './components/pricing.mjs';
10
11
  export { WaitlistForm, WaitlistFormProps, WaitlistPage, WaitlistPageProps } from './components/waitlist.mjs';
@@ -18,7 +19,8 @@ export { ProblemSolved, ProblemsSolvedSection, ProblemsSolvedSectionProps } from
18
19
  export { DetectedPlatform, ElectronDownloadLink, ElectronDownloadLinkProps, detectElectronPlatform } from './components/electron-download.mjs';
19
20
  export { ExplorePage, ExplorePageProps } from './components/explore.mjs';
20
21
  export { ExploreCta, ExploreCtaProps } from './components/explore-cta.mjs';
21
- export { D as DEFAULT_EXPLORE_EXAMPLE_PROMPTS, e as EXPLORE_CATALOG_QUERY, f as EXPLORE_MESSAGE_QUERY, g as ExploreCatalog, h as ExploreCatalogQueryData, E as ExploreChatError, a as ExploreChatErrorKind, b as ExploreChatPhase, i as ExploreConversation, j as ExploreCtaKind, k as ExploreCtaLink, l as ExploreErrorCode, m as ExploreLimits, n as ExploreMessage, o as ExploreMessageQueryData, p as ExploreMessageRole, q as ExploreMessageStatus, r as ExploreProduct, s as ExploreReference, F as FALLBACK_EXPLORE_LIMITS, S as SEND_EXPLORE_MESSAGE_MUTATION, t as SendExploreMessageInput, v as SendExploreMessageMutationData, w as SendExploreMessageResult, U as UseExploreChatOptions, c as UseExploreChatResult, d as classifyExploreError, u as useExploreChat } from './use-explore-chat-BzXCz2UM.mjs';
22
+ export { d as EXPLORE_CATALOG_QUERY, e as EXPLORE_MESSAGE_QUERY, b as ExploreCatalog, f as ExploreCatalogQueryData, g as ExploreConversation, h as ExploreCtaKind, i as ExploreCtaLink, j as ExploreErrorCode, a as ExploreLimits, c as ExploreMessage, k as ExploreMessageQueryData, l as ExploreMessageRole, m as ExploreMessageStatus, E as ExploreProduct, n as ExploreReference, S as SEND_EXPLORE_MESSAGE_MUTATION, o as SendExploreMessageInput, p as SendExploreMessageMutationData, q as SendExploreMessageResult } from './explore-types-CLw19R76.mjs';
23
+ export { D as DEFAULT_EXPLORE_EXAMPLE_PROMPTS, E as ExploreChatError, a as ExploreChatErrorKind, b as ExploreChatPhase, F as FALLBACK_EXPLORE_LIMITS, U as UseExploreChatOptions, c as UseExploreChatResult, d as classifyExploreError, u as useExploreChat } from './use-explore-chat-CvW-kyIm.mjs';
22
24
  export { RybbitAnalytics, RybbitAnalyticsProps } from './analytics/index.mjs';
23
25
  export { PageHead, PageHeadProps } from './seo/index.mjs';
24
26
  export { ProductData, ProductProvider, ProductProviderProps, useProduct, useProductConfig } from './product/index.mjs';
@@ -60,9 +62,144 @@ interface CareersSubmissionFormProps {
60
62
  declare function isValidUrl(value: string): boolean;
61
63
  declare function CareersSubmissionForm({ productName, recaptchaSiteKey, postings, heroTitle, heroDescription, headingLevel, className, seo, }: CareersSubmissionFormProps): react.JSX.Element;
62
64
 
65
+ /**
66
+ * Concept pages — the shared data contract.
67
+ *
68
+ * Every product website renders `/concepts` and `/concept/:slug` from a GENERATED
69
+ * `src/data/concepts.ts` (`dev/scripts/concepts/build_site_concepts.py`), which types its
70
+ * exports against these interfaces. The explore backend parses the same pages out of each
71
+ * site's `llms-full.txt`, so a field renamed here breaks 37 site builds and the corpus at
72
+ * once — change the generator and this file together, never one of them alone.
73
+ *
74
+ * Canonical source: `dev/platform/context/concepts/01-architecture.md` → "Contracts".
75
+ */
76
+
77
+ /** The frame a mockup was drawn for. Drives nothing but layout hints. */
78
+ type ConceptDevice = "desktop" | "mobile" | "tablet" | "wide" | "other";
79
+ /** One mockup image. Paths are site-relative; the pages absolutise them for SEO. */
80
+ interface ConceptImage {
81
+ /** Stable id: the source path under the mockups folder, extension dropped, `/` → `--`. */
82
+ key: string;
83
+ /** Full-size image, e.g. `/mockups/15-sessions-list.webp`. */
84
+ src: string;
85
+ /** 640px-wide thumbnail, e.g. `/mockups/thumbs/15-sessions-list.webp`. */
86
+ thumb: string;
87
+ /** Intrinsic size of `src`. */
88
+ width: number;
89
+ height: number;
90
+ /** Intrinsic size of `thumb`. */
91
+ thumbWidth: number;
92
+ thumbHeight: number;
93
+ /** Short screen title. */
94
+ title: string;
95
+ /** Alt text. Always starts "Concept illustration of". */
96
+ alt: string;
97
+ /** One-line caption. */
98
+ caption: string;
99
+ /** 80–170 words describing what the illustration shows. */
100
+ description: string;
101
+ device: ConceptDevice;
102
+ }
103
+ /** A feature or flow, illustrated by one or more mockups. */
104
+ interface Concept {
105
+ slug: string;
106
+ /** 1-based position across the product's concepts; drives listing and prev/next. */
107
+ order: number;
108
+ title: string;
109
+ /** Matches a `ConceptCategory.name`. */
110
+ category: string;
111
+ tagline: string;
112
+ metaDescription: string;
113
+ overview: string[];
114
+ highlights: string[];
115
+ workflow: string[];
116
+ audience: string[];
117
+ keywords: string[];
118
+ /** Slugs of related concepts on the same site. */
119
+ related: string[];
120
+ images: ConceptImage[];
121
+ }
122
+ interface ConceptCategory {
123
+ name: string;
124
+ description: string;
125
+ }
126
+ /** Props the pages pass to a site's link adapter. */
127
+ interface ConceptLinkProps {
128
+ href: string;
129
+ className?: string;
130
+ children: ReactNode;
131
+ "aria-label"?: string;
132
+ }
133
+ /**
134
+ * The link the pages render for every internal URL. Sites pass a tiny adapter around their
135
+ * router's `Link` so moving between concepts stays a client-side navigation; without one the
136
+ * pages fall back to a plain `<a href>`.
137
+ */
138
+ type ConceptLinkComponent = ComponentType<ConceptLinkProps>;
139
+ /**
140
+ * The disclaimer shown beside every concept image. The same sentence applies to all of them
141
+ * — including the few that began as real captures — so a visitor never has to guess which
142
+ * picture shows the shipping product.
143
+ */
144
+ declare const CONCEPT_ILLUSTRATION_NOTICE = "These images are illustrations of the concept, not screenshots of the actual product.";
145
+ /** The landing page route. */
146
+ declare const CONCEPTS_PATH = "/concepts";
147
+ /** Prefix of every concept detail route: `/concept/<slug>`. */
148
+ declare const CONCEPT_PATH_PREFIX = "/concept";
149
+ /** Site-relative URL of a concept's detail page. */
150
+ declare function conceptPath(slug: string): string;
151
+ /**
152
+ * Resolve a route parameter to its concept. Returns `undefined` for an unknown slug — the
153
+ * site then redirects to `/concepts` rather than rendering a soft 404.
154
+ */
155
+ declare function getConceptBySlug(concepts: readonly Concept[], slug: string | null | undefined): Concept | undefined;
156
+
157
+ interface ConceptsPageProps {
158
+ /** Product display name, e.g. `"VibeControls"`. */
159
+ productName: string;
160
+ /** Public origin of the site, e.g. `"https://vibecontrols.com"`. Used for absolute URLs. */
161
+ siteUrl: string;
162
+ concepts: readonly Concept[];
163
+ /** Section order and descriptions. Concepts in an unlisted category still render, last. */
164
+ categories?: readonly ConceptCategory[];
165
+ /** Call to action rendered in the hero (e.g. the site's primary buttons). */
166
+ cta?: ReactNode;
167
+ /** Router adapter for internal links. Defaults to a plain `<a href>`. */
168
+ linkComponent?: ConceptLinkComponent;
169
+ /** Overrides the `<h1>`. Default: `"<productName> concepts"`. */
170
+ title?: string;
171
+ /** Overrides the meta description (and the hero lead). Default: built from the counts. */
172
+ description?: string;
173
+ /** Extra classes for the page root. */
174
+ className?: string;
175
+ }
176
+ interface ConceptDetailPageProps {
177
+ productName: string;
178
+ siteUrl: string;
179
+ /** The concept to render. The site resolves the slug and redirects when it is unknown. */
180
+ concept: Concept;
181
+ /** Every concept on the site — for related concepts and previous / next. */
182
+ concepts: readonly Concept[];
183
+ categories?: readonly ConceptCategory[];
184
+ /** Call to action rendered as a band at the end of the page. */
185
+ cta?: ReactNode;
186
+ linkComponent?: ConceptLinkComponent;
187
+ className?: string;
188
+ }
189
+ /**
190
+ * `/concepts` — every concept on the site, grouped by category, with a client-side search
191
+ * and category filter. Filters start at "All", so the prerendered page lists everything.
192
+ */
193
+ declare function ConceptsPage({ productName, siteUrl, concepts, categories, cta, linkComponent, title, description, className, }: ConceptsPageProps): react.JSX.Element;
194
+ /**
195
+ * `/concept/:slug` — one concept: hero illustration, the copy, every illustration with its
196
+ * caption and description, related concepts and previous / next by `order`.
197
+ */
198
+ declare function ConceptDetailPage(props: ConceptDetailPageProps): react.JSX.Element;
199
+
63
200
  declare const buttonVariants: (props?: ({
64
201
  variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
65
- size?: "default" | "sm" | "lg" | "icon" | null | undefined;
202
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
66
203
  } & class_variance_authority_types.ClassProp) | undefined) => string;
67
204
  interface ButtonProps extends react.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
68
205
  asChild?: boolean;
@@ -143,11 +280,14 @@ interface ExploreStrings {
143
280
  attachmentTooLarge: string;
144
281
  attachmentTooMany: string;
145
282
  noAnswer: string;
283
+ answerDidNotArrive: string;
146
284
  askHuman: string;
147
285
  prevSuggestion: string;
148
286
  nextSuggestion: string;
287
+ conceptIllustration: string;
288
+ opensInNewTab: string;
149
289
  capabilities: [string, string, string];
150
290
  prompts: string[];
151
291
  }
152
292
 
153
- export { Button, type ButtonProps, CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, type ExploreLocale, type ExploreStrings, Input, Label, Select, Textarea, WebsiteSwitcherProduct, buttonVariants, isValidUrl };
293
+ export { Button, type ButtonProps, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, type Concept, type ConceptCategory, ConceptDetailPage, type ConceptDetailPageProps, type ConceptDevice, type ConceptImage, type ConceptLinkComponent, type ConceptLinkProps, ConceptsPage, type ConceptsPageProps, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, type ExploreLocale, type ExploreStrings, Input, Label, Select, Textarea, WebsiteSwitcherProduct, buttonVariants, conceptPath, getConceptBySlug, isValidUrl };
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export { PartnersPage, PartnersPageProps } from './components/partners.js';
5
5
  import { C as CareersPostingOption } from './index-BqHF-G-S.js';
6
6
  export { B as BlogListPage, a as BlogListPageProps, b as BlogPostPage, c as BlogPostPageProps, d as CareersApplyForm, e as CareersApplyFormProps, f as CaseStudiesListPage, g as CaseStudiesListPageProps, h as CaseStudyPage, i as CaseStudyPageProps, j as ChangelogEntry, k as ChangelogPage, l as ChangelogPageProps, m as ContentPageData, n as ContentPageListData, o as ContentPageListItem, p as ContentRenderer, q as ContractAsset, r as ContractsPage, s as ContractsPageProps, M as Markdown, t as MarkdownProps, P as PressKitAsset, u as PressKitAssetCategory, v as PressKitPage, w as PressKitPageProps, x as PublicInterviewRoundConfig, y as PublicJobPosting, U as UsePublicJobPostingOptions, z as UsePublicJobPostingsOptions, A as fetchPublicJobPosting, D as fetchPublicJobPostings, E as fetchPublicJobPostingsForSubmission, F as useContentPage, G as useContentPages, H as usePublicJobPosting, I as usePublicJobPostings, J as usePublicJobPostingsForSubmission } from './index-BqHF-G-S.js';
7
7
  import * as react from 'react';
8
+ import { ComponentType, ReactNode } from 'react';
8
9
  export { NewsletterForm, NewsletterFormProps, NewsletterPage, NewsletterPageProps } from './components/newsletter.js';
9
10
  export { PlanCard, PricingPage, PricingProps, PricingSection } from './components/pricing.js';
10
11
  export { WaitlistForm, WaitlistFormProps, WaitlistPage, WaitlistPageProps } from './components/waitlist.js';
@@ -18,7 +19,8 @@ export { ProblemSolved, ProblemsSolvedSection, ProblemsSolvedSectionProps } from
18
19
  export { DetectedPlatform, ElectronDownloadLink, ElectronDownloadLinkProps, detectElectronPlatform } from './components/electron-download.js';
19
20
  export { ExplorePage, ExplorePageProps } from './components/explore.js';
20
21
  export { ExploreCta, ExploreCtaProps } from './components/explore-cta.js';
21
- export { D as DEFAULT_EXPLORE_EXAMPLE_PROMPTS, e as EXPLORE_CATALOG_QUERY, f as EXPLORE_MESSAGE_QUERY, g as ExploreCatalog, h as ExploreCatalogQueryData, E as ExploreChatError, a as ExploreChatErrorKind, b as ExploreChatPhase, i as ExploreConversation, j as ExploreCtaKind, k as ExploreCtaLink, l as ExploreErrorCode, m as ExploreLimits, n as ExploreMessage, o as ExploreMessageQueryData, p as ExploreMessageRole, q as ExploreMessageStatus, r as ExploreProduct, s as ExploreReference, F as FALLBACK_EXPLORE_LIMITS, S as SEND_EXPLORE_MESSAGE_MUTATION, t as SendExploreMessageInput, v as SendExploreMessageMutationData, w as SendExploreMessageResult, U as UseExploreChatOptions, c as UseExploreChatResult, d as classifyExploreError, u as useExploreChat } from './use-explore-chat-BzXCz2UM.js';
22
+ export { d as EXPLORE_CATALOG_QUERY, e as EXPLORE_MESSAGE_QUERY, b as ExploreCatalog, f as ExploreCatalogQueryData, g as ExploreConversation, h as ExploreCtaKind, i as ExploreCtaLink, j as ExploreErrorCode, a as ExploreLimits, c as ExploreMessage, k as ExploreMessageQueryData, l as ExploreMessageRole, m as ExploreMessageStatus, E as ExploreProduct, n as ExploreReference, S as SEND_EXPLORE_MESSAGE_MUTATION, o as SendExploreMessageInput, p as SendExploreMessageMutationData, q as SendExploreMessageResult } from './explore-types-CLw19R76.js';
23
+ export { D as DEFAULT_EXPLORE_EXAMPLE_PROMPTS, E as ExploreChatError, a as ExploreChatErrorKind, b as ExploreChatPhase, F as FALLBACK_EXPLORE_LIMITS, U as UseExploreChatOptions, c as UseExploreChatResult, d as classifyExploreError, u as useExploreChat } from './use-explore-chat-DdGBimiz.js';
22
24
  export { RybbitAnalytics, RybbitAnalyticsProps } from './analytics/index.js';
23
25
  export { PageHead, PageHeadProps } from './seo/index.js';
24
26
  export { ProductData, ProductProvider, ProductProviderProps, useProduct, useProductConfig } from './product/index.js';
@@ -60,9 +62,144 @@ interface CareersSubmissionFormProps {
60
62
  declare function isValidUrl(value: string): boolean;
61
63
  declare function CareersSubmissionForm({ productName, recaptchaSiteKey, postings, heroTitle, heroDescription, headingLevel, className, seo, }: CareersSubmissionFormProps): react.JSX.Element;
62
64
 
65
+ /**
66
+ * Concept pages — the shared data contract.
67
+ *
68
+ * Every product website renders `/concepts` and `/concept/:slug` from a GENERATED
69
+ * `src/data/concepts.ts` (`dev/scripts/concepts/build_site_concepts.py`), which types its
70
+ * exports against these interfaces. The explore backend parses the same pages out of each
71
+ * site's `llms-full.txt`, so a field renamed here breaks 37 site builds and the corpus at
72
+ * once — change the generator and this file together, never one of them alone.
73
+ *
74
+ * Canonical source: `dev/platform/context/concepts/01-architecture.md` → "Contracts".
75
+ */
76
+
77
+ /** The frame a mockup was drawn for. Drives nothing but layout hints. */
78
+ type ConceptDevice = "desktop" | "mobile" | "tablet" | "wide" | "other";
79
+ /** One mockup image. Paths are site-relative; the pages absolutise them for SEO. */
80
+ interface ConceptImage {
81
+ /** Stable id: the source path under the mockups folder, extension dropped, `/` → `--`. */
82
+ key: string;
83
+ /** Full-size image, e.g. `/mockups/15-sessions-list.webp`. */
84
+ src: string;
85
+ /** 640px-wide thumbnail, e.g. `/mockups/thumbs/15-sessions-list.webp`. */
86
+ thumb: string;
87
+ /** Intrinsic size of `src`. */
88
+ width: number;
89
+ height: number;
90
+ /** Intrinsic size of `thumb`. */
91
+ thumbWidth: number;
92
+ thumbHeight: number;
93
+ /** Short screen title. */
94
+ title: string;
95
+ /** Alt text. Always starts "Concept illustration of". */
96
+ alt: string;
97
+ /** One-line caption. */
98
+ caption: string;
99
+ /** 80–170 words describing what the illustration shows. */
100
+ description: string;
101
+ device: ConceptDevice;
102
+ }
103
+ /** A feature or flow, illustrated by one or more mockups. */
104
+ interface Concept {
105
+ slug: string;
106
+ /** 1-based position across the product's concepts; drives listing and prev/next. */
107
+ order: number;
108
+ title: string;
109
+ /** Matches a `ConceptCategory.name`. */
110
+ category: string;
111
+ tagline: string;
112
+ metaDescription: string;
113
+ overview: string[];
114
+ highlights: string[];
115
+ workflow: string[];
116
+ audience: string[];
117
+ keywords: string[];
118
+ /** Slugs of related concepts on the same site. */
119
+ related: string[];
120
+ images: ConceptImage[];
121
+ }
122
+ interface ConceptCategory {
123
+ name: string;
124
+ description: string;
125
+ }
126
+ /** Props the pages pass to a site's link adapter. */
127
+ interface ConceptLinkProps {
128
+ href: string;
129
+ className?: string;
130
+ children: ReactNode;
131
+ "aria-label"?: string;
132
+ }
133
+ /**
134
+ * The link the pages render for every internal URL. Sites pass a tiny adapter around their
135
+ * router's `Link` so moving between concepts stays a client-side navigation; without one the
136
+ * pages fall back to a plain `<a href>`.
137
+ */
138
+ type ConceptLinkComponent = ComponentType<ConceptLinkProps>;
139
+ /**
140
+ * The disclaimer shown beside every concept image. The same sentence applies to all of them
141
+ * — including the few that began as real captures — so a visitor never has to guess which
142
+ * picture shows the shipping product.
143
+ */
144
+ declare const CONCEPT_ILLUSTRATION_NOTICE = "These images are illustrations of the concept, not screenshots of the actual product.";
145
+ /** The landing page route. */
146
+ declare const CONCEPTS_PATH = "/concepts";
147
+ /** Prefix of every concept detail route: `/concept/<slug>`. */
148
+ declare const CONCEPT_PATH_PREFIX = "/concept";
149
+ /** Site-relative URL of a concept's detail page. */
150
+ declare function conceptPath(slug: string): string;
151
+ /**
152
+ * Resolve a route parameter to its concept. Returns `undefined` for an unknown slug — the
153
+ * site then redirects to `/concepts` rather than rendering a soft 404.
154
+ */
155
+ declare function getConceptBySlug(concepts: readonly Concept[], slug: string | null | undefined): Concept | undefined;
156
+
157
+ interface ConceptsPageProps {
158
+ /** Product display name, e.g. `"VibeControls"`. */
159
+ productName: string;
160
+ /** Public origin of the site, e.g. `"https://vibecontrols.com"`. Used for absolute URLs. */
161
+ siteUrl: string;
162
+ concepts: readonly Concept[];
163
+ /** Section order and descriptions. Concepts in an unlisted category still render, last. */
164
+ categories?: readonly ConceptCategory[];
165
+ /** Call to action rendered in the hero (e.g. the site's primary buttons). */
166
+ cta?: ReactNode;
167
+ /** Router adapter for internal links. Defaults to a plain `<a href>`. */
168
+ linkComponent?: ConceptLinkComponent;
169
+ /** Overrides the `<h1>`. Default: `"<productName> concepts"`. */
170
+ title?: string;
171
+ /** Overrides the meta description (and the hero lead). Default: built from the counts. */
172
+ description?: string;
173
+ /** Extra classes for the page root. */
174
+ className?: string;
175
+ }
176
+ interface ConceptDetailPageProps {
177
+ productName: string;
178
+ siteUrl: string;
179
+ /** The concept to render. The site resolves the slug and redirects when it is unknown. */
180
+ concept: Concept;
181
+ /** Every concept on the site — for related concepts and previous / next. */
182
+ concepts: readonly Concept[];
183
+ categories?: readonly ConceptCategory[];
184
+ /** Call to action rendered as a band at the end of the page. */
185
+ cta?: ReactNode;
186
+ linkComponent?: ConceptLinkComponent;
187
+ className?: string;
188
+ }
189
+ /**
190
+ * `/concepts` — every concept on the site, grouped by category, with a client-side search
191
+ * and category filter. Filters start at "All", so the prerendered page lists everything.
192
+ */
193
+ declare function ConceptsPage({ productName, siteUrl, concepts, categories, cta, linkComponent, title, description, className, }: ConceptsPageProps): react.JSX.Element;
194
+ /**
195
+ * `/concept/:slug` — one concept: hero illustration, the copy, every illustration with its
196
+ * caption and description, related concepts and previous / next by `order`.
197
+ */
198
+ declare function ConceptDetailPage(props: ConceptDetailPageProps): react.JSX.Element;
199
+
63
200
  declare const buttonVariants: (props?: ({
64
201
  variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
65
- size?: "default" | "sm" | "lg" | "icon" | null | undefined;
202
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
66
203
  } & class_variance_authority_types.ClassProp) | undefined) => string;
67
204
  interface ButtonProps extends react.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
68
205
  asChild?: boolean;
@@ -143,11 +280,14 @@ interface ExploreStrings {
143
280
  attachmentTooLarge: string;
144
281
  attachmentTooMany: string;
145
282
  noAnswer: string;
283
+ answerDidNotArrive: string;
146
284
  askHuman: string;
147
285
  prevSuggestion: string;
148
286
  nextSuggestion: string;
287
+ conceptIllustration: string;
288
+ opensInNewTab: string;
149
289
  capabilities: [string, string, string];
150
290
  prompts: string[];
151
291
  }
152
292
 
153
- export { Button, type ButtonProps, CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, type ExploreLocale, type ExploreStrings, Input, Label, Select, Textarea, WebsiteSwitcherProduct, buttonVariants, isValidUrl };
293
+ export { Button, type ButtonProps, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, type Concept, type ConceptCategory, ConceptDetailPage, type ConceptDetailPageProps, type ConceptDevice, type ConceptImage, type ConceptLinkComponent, type ConceptLinkProps, ConceptsPage, type ConceptsPageProps, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, type ExploreLocale, type ExploreStrings, Input, Label, Select, Textarea, WebsiteSwitcherProduct, buttonVariants, conceptPath, getConceptBySlug, isValidUrl };