@burdenoff/website-sdk 2026.1013.1 → 2026.1013.2

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.
package/README.md CHANGED
@@ -211,7 +211,12 @@ end-to-end suite: `page`, `messages`, `composer`, `chip`, `thinking`, `user`,
211
211
  `ConceptsPage` and `ConceptDetailPage` render a product's concepts: each one a
212
212
  feature or flow, shown through the mockups drawn for it and explained in
213
213
  reviewed copy. Every image is labelled an **illustration of the concept, not a
214
- screenshot of the actual product** (`CONCEPT_ILLUSTRATION_NOTICE`).
214
+ screenshot of the actual product** (`CONCEPT_ILLUSTRATION_NOTICE`), and a
215
+ concept's numbered "How it works" steps carry the matching qualifier
216
+ (`CONCEPT_WORKFLOW_NOTICE`) — a numbered list under that heading otherwise reads
217
+ as a click-through procedure. Both render wherever their section does; neither
218
+ is keyed to a field of generated data, so neither can vanish when a generator
219
+ drops one.
215
220
 
216
221
  The data is a generated `src/data/concepts.ts` in each site — never hand-edit
217
222
  it; regenerate with
@@ -290,7 +295,8 @@ filter bar or zero counts.
290
295
  `className`.
291
296
 
292
297
  **Helpers**: `CONCEPTS_PATH` (`/concepts`), `CONCEPT_PATH_PREFIX` (`/concept`),
293
- `conceptPath(slug)`, `getConceptBySlug(concepts, slug)`; types `Concept`,
298
+ `conceptPath(slug)`, `getConceptBySlug(concepts, slug)`,
299
+ `CONCEPT_ILLUSTRATION_NOTICE`, `CONCEPT_WORKFLOW_NOTICE`; types `Concept`,
294
300
  `ConceptImage`, `ConceptCategory`, `ConceptLinkComponent`, `ConceptLinkProps`.
295
301
 
296
302
  **SEO and llms.** One `<h1>` per page, a self-canonical URL, absolute OG images
@@ -305,7 +311,12 @@ never in the prerendered HTML.
305
311
  **Testing hooks.** `data-concepts="landing" | "card" (plus data-slug) | "filter"
306
312
  | "notice" | "empty" (filters match nothing) | "none" (no concepts at all) |
307
313
  "detail" | "category" | "hero" | "illustration" | "related" | "pager" | "cta" |
308
- "lightbox"`, and `data-concepts-notice` on the notice.
314
+ "lightbox" | "workflow-notice"`, plus `data-concepts-notice` on the illustration
315
+ notice and `data-concepts-workflow-notice` on the workflow one. The two
316
+ attributes are deliberately distinct: several assertions select
317
+ `[data-concepts-notice]` with `querySelector` and read the single node they get
318
+ back, so a second element wearing it would keep them green while describing the
319
+ wrong element.
309
320
 
310
321
  ### SEO Component
311
322
 
package/dist/index.d.mts CHANGED
@@ -166,6 +166,25 @@ type ConceptLinkComponent = ComponentType<ConceptLinkProps>;
166
166
  * picture shows the shipping product.
167
167
  */
168
168
  declare const CONCEPT_ILLUSTRATION_NOTICE = "These images are illustrations of the concept, not screenshots of the actual product.";
169
+ /**
170
+ * The disclaimer shown above every concept's "How it works" steps.
171
+ *
172
+ * A numbered list under that heading reads as a procedure — the sequence of screens a
173
+ * visitor would click through — when what it actually describes is how the pieces of the
174
+ * concept relate. The illustration notice covers the pictures; nothing covered the steps,
175
+ * so the most instruction-shaped part of the page was the least qualified.
176
+ *
177
+ * Rendered with NO data gate, exactly like CONCEPT_ILLUSTRATION_NOTICE. Keying a
178
+ * disclosure to a generated field is how it disappears silently the first time a
179
+ * generator omits that field, and the page would then look more authoritative, not less.
180
+ * The section's own `workflow.length > 0` check is the only condition: no steps, no
181
+ * heading, nothing to qualify.
182
+ *
183
+ * The sentence says nothing about launch or availability. Every product behind these
184
+ * pages is generally available, and a notice that hinted otherwise would be false on
185
+ * every site that renders it.
186
+ */
187
+ declare const CONCEPT_WORKFLOW_NOTICE = "These steps illustrate how the concept fits together \u2014 not a walkthrough of the product's current interface.";
169
188
  /** Where every industry solution is listed. */
170
189
  declare const DOMAINS_URL = "https://burdenoff.com/domains";
171
190
  /** The landing page route. */
@@ -815,4 +834,4 @@ declare const Textarea: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLP
815
834
  */
816
835
  declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
817
836
 
818
- export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, type AnswerDetailPageProps, type AnswerLinkComponent, type AnswerLinkProps, AnswerRendererStrings, type AnswerStrings, AnswersPage, type AnswersPageProps, 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, type ConceptSolution, ConceptsPage, type ConceptsPageProps, DOMAINS_URL, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, type ExploreLocale, type ExploreStrings, Input, Label, PUBLISHED_ANSWER_FIELDS, type PublishedAnswer, type PublishedAnswerSource, type PublishedAnswerTopic, Select, Textarea, WebsiteSwitcherProduct, answerPath, answerSourceHost, answerStrings, buttonVariants, conceptPath, formatAnswerDate, getAnswerBySlug, getConceptBySlug, isPublishedSourceUrl, isValidUrl, speechLocaleOf };
837
+ export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, type AnswerDetailPageProps, type AnswerLinkComponent, type AnswerLinkProps, AnswerRendererStrings, type AnswerStrings, AnswersPage, type AnswersPageProps, Button, type ButtonProps, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CONCEPT_WORKFLOW_NOTICE, CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, type Concept, type ConceptCategory, ConceptDetailPage, type ConceptDetailPageProps, type ConceptDevice, type ConceptImage, type ConceptLinkComponent, type ConceptLinkProps, type ConceptSolution, ConceptsPage, type ConceptsPageProps, DOMAINS_URL, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, type ExploreLocale, type ExploreStrings, Input, Label, PUBLISHED_ANSWER_FIELDS, type PublishedAnswer, type PublishedAnswerSource, type PublishedAnswerTopic, Select, Textarea, WebsiteSwitcherProduct, answerPath, answerSourceHost, answerStrings, buttonVariants, conceptPath, formatAnswerDate, getAnswerBySlug, getConceptBySlug, isPublishedSourceUrl, isValidUrl, speechLocaleOf };
package/dist/index.d.ts CHANGED
@@ -166,6 +166,25 @@ type ConceptLinkComponent = ComponentType<ConceptLinkProps>;
166
166
  * picture shows the shipping product.
167
167
  */
168
168
  declare const CONCEPT_ILLUSTRATION_NOTICE = "These images are illustrations of the concept, not screenshots of the actual product.";
169
+ /**
170
+ * The disclaimer shown above every concept's "How it works" steps.
171
+ *
172
+ * A numbered list under that heading reads as a procedure — the sequence of screens a
173
+ * visitor would click through — when what it actually describes is how the pieces of the
174
+ * concept relate. The illustration notice covers the pictures; nothing covered the steps,
175
+ * so the most instruction-shaped part of the page was the least qualified.
176
+ *
177
+ * Rendered with NO data gate, exactly like CONCEPT_ILLUSTRATION_NOTICE. Keying a
178
+ * disclosure to a generated field is how it disappears silently the first time a
179
+ * generator omits that field, and the page would then look more authoritative, not less.
180
+ * The section's own `workflow.length > 0` check is the only condition: no steps, no
181
+ * heading, nothing to qualify.
182
+ *
183
+ * The sentence says nothing about launch or availability. Every product behind these
184
+ * pages is generally available, and a notice that hinted otherwise would be false on
185
+ * every site that renders it.
186
+ */
187
+ declare const CONCEPT_WORKFLOW_NOTICE = "These steps illustrate how the concept fits together \u2014 not a walkthrough of the product's current interface.";
169
188
  /** Where every industry solution is listed. */
170
189
  declare const DOMAINS_URL = "https://burdenoff.com/domains";
171
190
  /** The landing page route. */
@@ -815,4 +834,4 @@ declare const Textarea: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLP
815
834
  */
816
835
  declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
817
836
 
818
- export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, type AnswerDetailPageProps, type AnswerLinkComponent, type AnswerLinkProps, AnswerRendererStrings, type AnswerStrings, AnswersPage, type AnswersPageProps, 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, type ConceptSolution, ConceptsPage, type ConceptsPageProps, DOMAINS_URL, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, type ExploreLocale, type ExploreStrings, Input, Label, PUBLISHED_ANSWER_FIELDS, type PublishedAnswer, type PublishedAnswerSource, type PublishedAnswerTopic, Select, Textarea, WebsiteSwitcherProduct, answerPath, answerSourceHost, answerStrings, buttonVariants, conceptPath, formatAnswerDate, getAnswerBySlug, getConceptBySlug, isPublishedSourceUrl, isValidUrl, speechLocaleOf };
837
+ export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, type AnswerDetailPageProps, type AnswerLinkComponent, type AnswerLinkProps, AnswerRendererStrings, type AnswerStrings, AnswersPage, type AnswersPageProps, Button, type ButtonProps, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CONCEPT_WORKFLOW_NOTICE, CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, type Concept, type ConceptCategory, ConceptDetailPage, type ConceptDetailPageProps, type ConceptDevice, type ConceptImage, type ConceptLinkComponent, type ConceptLinkProps, type ConceptSolution, ConceptsPage, type ConceptsPageProps, DOMAINS_URL, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, type ExploreLocale, type ExploreStrings, Input, Label, PUBLISHED_ANSWER_FIELDS, type PublishedAnswer, type PublishedAnswerSource, type PublishedAnswerTopic, Select, Textarea, WebsiteSwitcherProduct, answerPath, answerSourceHost, answerStrings, buttonVariants, conceptPath, formatAnswerDate, getAnswerBySlug, getConceptBySlug, isPublishedSourceUrl, isValidUrl, speechLocaleOf };
package/dist/index.js CHANGED
@@ -4858,6 +4858,7 @@ function ElectronDownloadLink({
4858
4858
 
4859
4859
  // src/components/concepts-types.ts
4860
4860
  var CONCEPT_ILLUSTRATION_NOTICE = "These images are illustrations of the concept, not screenshots of the actual product.";
4861
+ var CONCEPT_WORKFLOW_NOTICE = "These steps illustrate how the concept fits together \u2014 not a walkthrough of the product's current interface.";
4861
4862
  var DOMAINS_URL = "https://burdenoff.com/domains";
4862
4863
  var CONCEPTS_PATH = "/concepts";
4863
4864
  var CONCEPT_PATH_PREFIX = "/concept";
@@ -5160,6 +5161,30 @@ function IllustrationNotice({ className }) {
5160
5161
  }
5161
5162
  );
5162
5163
  }
5164
+ function WorkflowNotice({ className }) {
5165
+ return /* @__PURE__ */ jsxRuntime.jsxs(
5166
+ "div",
5167
+ {
5168
+ role: "note",
5169
+ "data-concepts": "workflow-notice",
5170
+ "data-concepts-workflow-notice": "",
5171
+ className: cn(
5172
+ "mt-4 flex items-start gap-3 rounded-xl border border-border bg-muted/50 px-4 py-3 text-sm leading-relaxed text-muted-foreground",
5173
+ className
5174
+ ),
5175
+ children: [
5176
+ /* @__PURE__ */ jsxRuntime.jsx(
5177
+ lucideReact.Info,
5178
+ {
5179
+ "aria-hidden": "true",
5180
+ className: "mt-0.5 h-4 w-4 shrink-0 text-muted-foreground"
5181
+ }
5182
+ ),
5183
+ /* @__PURE__ */ jsxRuntime.jsx("p", { children: CONCEPT_WORKFLOW_NOTICE })
5184
+ ]
5185
+ }
5186
+ );
5187
+ }
5163
5188
  function IllustrationBadge({ className }) {
5164
5189
  return /* @__PURE__ */ jsxRuntime.jsx(
5165
5190
  "span",
@@ -5985,6 +6010,7 @@ function ConceptDetail({
5985
6010
  ] }) : null,
5986
6011
  concept.workflow.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("section", { "aria-labelledby": `${headingId}-workflow`, children: [
5987
6012
  /* @__PURE__ */ jsxRuntime.jsx("h2", { id: `${headingId}-workflow`, className: SECTION_HEADING, children: "How it works" }),
6013
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowNotice, {}),
5988
6014
  /* @__PURE__ */ jsxRuntime.jsx("ol", { role: "list", className: "mt-4 space-y-4", children: concept.workflow.map((step, index) => /* @__PURE__ */ jsxRuntime.jsxs(
5989
6015
  "li",
5990
6016
  {
@@ -19053,6 +19079,7 @@ exports.Button = Button;
19053
19079
  exports.CONCEPTS_PATH = CONCEPTS_PATH;
19054
19080
  exports.CONCEPT_ILLUSTRATION_NOTICE = CONCEPT_ILLUSTRATION_NOTICE;
19055
19081
  exports.CONCEPT_PATH_PREFIX = CONCEPT_PATH_PREFIX;
19082
+ exports.CONCEPT_WORKFLOW_NOTICE = CONCEPT_WORKFLOW_NOTICE;
19056
19083
  exports.CareersApplyForm = CareersApplyForm;
19057
19084
  exports.CareersSubmissionForm = CareersSubmissionForm;
19058
19085
  exports.CaseStudiesListPage = CaseStudiesListPage;