@burdenoff/website-sdk 2026.924.8 → 2026.924.9

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.
@@ -3857,6 +3857,9 @@ function toPayload(staged) {
3857
3857
  }));
3858
3858
  }
3859
3859
  var SHORT_VIEWPORT_PX = 420;
3860
+ var WELCOME_FIT_MIN_WIDTH_PX = 640;
3861
+ var WELCOME_FIT_STEP_PX = [700, 549, 505, 422];
3862
+ var toRem = (px) => `${px / 16}rem`;
3860
3863
  var EXPLORE_CSS = `
3861
3864
  @keyframes boff-explore-pulse {
3862
3865
  0%, 80%, 100% { opacity: 0.25; transform: translateY(0); }
@@ -4067,6 +4070,50 @@ var EXPLORE_CSS = `
4067
4070
  }
4068
4071
  }
4069
4072
 
4073
+ /* ---- Welcome fit ----------------------------------------------------------------------
4074
+ The ladder is documented at WELCOME_FIT_STEP_PX. The pane becomes a query container only
4075
+ in viewport mode and above the short-viewport threshold, because size containment sizes
4076
+ an element as if it had no content. That is safe exactly while the pane's height comes
4077
+ from its flex parent. In \`auto\` mode, and in the short-viewport fallback above, the pane
4078
+ grows WITH its content \u2014 and containment there would collapse it to zero height.
4079
+
4080
+ Selectors are two classes deep on purpose. The host sites' Tailwind puts \`py-5\`, \`mt-4\`
4081
+ and \`aspect-[2/1]\` on these same elements; unlayered SDK CSS already outranks a v4
4082
+ \`@layer utilities\` rule, and the extra class makes it outrank a v3 one too, whichever
4083
+ stylesheet happens to load last.
4084
+
4085
+ Nothing here hides the concept strip, and nothing here hides content the page does not
4086
+ also say elsewhere. Below the last step the pane scrolls, so every control stays
4087
+ reachable at every zoom level. */
4088
+ @media (min-height: ${SHORT_VIEWPORT_PX + 1}px) {
4089
+ .boff-explore-viewport .boff-explore-scroll {
4090
+ container: boff-explore-pane / size;
4091
+ }
4092
+ }
4093
+ @container boff-explore-pane (min-width: ${toRem(WELCOME_FIT_MIN_WIDTH_PX)}) and (max-height: ${toRem(WELCOME_FIT_STEP_PX[0])}) {
4094
+ /* Step 1. Each tile restates something the page already says in the badge, the intro or
4095
+ the composer footer, so this is the one block whose absence loses nothing. */
4096
+ .boff-explore-scroll .boff-explore-capabilities { display: none; }
4097
+ }
4098
+ @container boff-explore-pane (min-width: ${toRem(WELCOME_FIT_MIN_WIDTH_PX)}) and (max-height: ${toRem(WELCOME_FIT_STEP_PX[1])}) {
4099
+ /* Step 2. */
4100
+ .boff-explore-scroll .boff-explore-concept-media { aspect-ratio: 4 / 1; }
4101
+ }
4102
+ @container boff-explore-pane (min-width: ${toRem(WELCOME_FIT_MIN_WIDTH_PX)}) and (max-height: ${toRem(WELCOME_FIT_STEP_PX[2])}) {
4103
+ /* Step 3. Title-only cards. The "concept illustration" caveat lives on the picture, so it
4104
+ goes with it; the button's accessible name never depended on the image. Lazy images
4105
+ inside a display:none box are not fetched until there is room to show them. */
4106
+ .boff-explore-scroll .boff-explore-concept-media { display: none; }
4107
+ .boff-explore-scroll .boff-explore-aura { padding-top: 0.75rem; padding-bottom: 0.75rem; }
4108
+ .boff-explore-scroll .boff-explore-aura > :not(:first-child) { margin-top: 0.5rem; }
4109
+ }
4110
+ @container boff-explore-pane (min-width: ${toRem(WELCOME_FIT_MIN_WIDTH_PX)}) and (max-height: ${toRem(WELCOME_FIT_STEP_PX[3])}) {
4111
+ /* Step 4. The badge is the third statement on this screen that answers come from our
4112
+ documentation. The heading beneath it loses its top margin so the hero starts flush. */
4113
+ .boff-explore-scroll .boff-explore-hero-badge { display: none; }
4114
+ .boff-explore-scroll .boff-explore-hero-badge + h1 { margin-top: 0; }
4115
+ }
4116
+
4070
4117
  /* ---- Composer dock --------------------------------------------------------------------
4071
4118
  Three declarations, each the fallback for the one after it: a plain 1rem where \`max()\`
4072
4119
  is unknown, then the measured overlap of any FOREIGN fixed chrome sitting over the
@@ -5393,7 +5440,12 @@ function ConceptStrip({
5393
5440
  measureRail();
5394
5441
  const onResize = () => measureRail();
5395
5442
  window.addEventListener("resize", onResize);
5396
- return () => window.removeEventListener("resize", onResize);
5443
+ const observer = typeof ResizeObserver === "function" ? new ResizeObserver(onResize) : null;
5444
+ observer?.observe(el);
5445
+ return () => {
5446
+ window.removeEventListener("resize", onResize);
5447
+ observer?.disconnect();
5448
+ };
5397
5449
  }, [measureRail, highlights.length, failed]);
5398
5450
  const scrollRail = React.useCallback((direction) => {
5399
5451
  const el = railRef.current;
@@ -5473,7 +5525,7 @@ function ConceptStrip({
5473
5525
  ),
5474
5526
  className: "group flex w-40 flex-col overflow-hidden rounded-xl border border-border bg-card text-left shadow-sm transition-colors hover:border-primary/50 hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring sm:w-44",
5475
5527
  children: [
5476
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative block aspect-[2/1] w-full overflow-hidden bg-muted", children: [
5528
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "boff-explore-concept-media relative block aspect-[2/1] w-full overflow-hidden bg-muted", children: [
5477
5529
  /* @__PURE__ */ jsxRuntime.jsx(
5478
5530
  "img",
5479
5531
  {
@@ -5625,14 +5677,14 @@ function WelcomeState({
5625
5677
  }) {
5626
5678
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-aura mx-auto my-auto w-full max-w-3xl px-4 py-4 sm:py-5", children: [
5627
5679
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise text-center", children: [
5628
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1.5 rounded-full border border-border bg-muted px-3 py-1 text-xs font-medium text-muted-foreground", children: [
5680
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "boff-explore-hero-badge inline-flex items-center gap-1.5 rounded-full border border-border bg-muted px-3 py-1 text-xs font-medium text-muted-foreground", children: [
5629
5681
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "h-3.5 w-3.5" }),
5630
5682
  T.badge
5631
5683
  ] }),
5632
5684
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "mt-2 text-balance break-words text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
5633
5685
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mx-auto mt-2 max-w-2xl text-pretty text-sm leading-relaxed text-muted-foreground", children: body })
5634
5686
  ] }),
5635
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "boff-explore-rise boff-explore-rise-1 mt-4 grid grid-cols-3 gap-2 sm:gap-2.5", children: CAPABILITIES.map(({ icon: Icon, body: capBody }, i) => /* @__PURE__ */ jsxRuntime.jsxs(
5687
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "boff-explore-capabilities boff-explore-rise boff-explore-rise-1 mt-4 grid grid-cols-3 gap-2 sm:gap-2.5", children: CAPABILITIES.map(({ icon: Icon, body: capBody }, i) => /* @__PURE__ */ jsxRuntime.jsxs(
5636
5688
  "li",
5637
5689
  {
5638
5690
  className: "rounded-xl border border-border/70 bg-card/60 p-2.5 text-center transition-colors hover:border-border sm:p-2.5 sm:text-left",