@boost33/ui 0.7.0 → 0.7.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.
package/CHANGELOG.md CHANGED
@@ -309,11 +309,73 @@ most consumers meet first.
309
309
  still gains no `aria-haspopup`, and it still opens nothing. Connecting the two is
310
310
  Stage B.
311
311
 
312
- ## 0.7.0 — not yet published
312
+ ## 0.7.1 — 2026-11-02
313
+
314
+ **Not breaking. Nothing to do on upgrade unless you want the link home**, which
315
+ is one prop on `AppShell`. New optional props only; with none of them passed,
316
+ every component renders exactly what 0.7.0 rendered. A patch rather than a minor
317
+ by decision (Jamal, 2 November 2026): under `0.x` either is allowed, and the
318
+ entry below is what tells you what changed.
319
+
320
+ **Held back, as in 0.6.0 and 0.7.0:** the Stage A entries under Unreleased
321
+ (`CommandPalette`, `AccountMenu`, `NotificationCenter`) have still not passed
322
+ their fidelity gate and are not part of this release, even though their exports
323
+ are present in `dist/`.
324
+
325
+ ### Added — the Boost33 wordmark can be the link home: `hubHref` on `AppShell`, `Wordmark` and `Boost33Mark` (B33-1699)
326
+
327
+ **Not breaking. Nothing changes until you pass `hubHref`.** Every new prop is
328
+ optional, and with none of them set the wordmark renders the same `div` it did
329
+ before.
330
+
331
+ **Why you want it.** Until now the only way back to the hub from Score, Voice or
332
+ the Wallet was the "Hub" row inside the switcher's panel, and a founder testing
333
+ as a new user could not find it: *"How do I come back to the different
334
+ features... I don't see the button."* The lockup in the top-left corner is where
335
+ people look for that link.
336
+
337
+ **What to do on upgrade.** Pass the hub URL to the shell. The package does not
338
+ know it and never will: Identity owns where the hub lives, and it differs per
339
+ environment.
340
+
341
+ ```tsx
342
+ <AppShell hubHref={hubUrl} linkComponent={Link} /* …everything you pass today */ />
343
+ ```
344
+
345
+ | Prop | On | What it does |
346
+ | --- | --- | --- |
347
+ | `hubHref?: string` | `AppShell` | Links the sidebar's wordmark to the hub, through the `linkComponent` you already pass the shell. On the rail the mark alone is the link. |
348
+ | `hubHref?: string`, `linkComponent?: ElementType` | `Wordmark` | The same, for a consumer rendering the lockup itself. Same contract as `NavItem` (ADR-0011). |
349
+ | `hubHref?: string`, `linkComponent?: ElementType` | `Boost33Mark` | The mark standing alone as a link. **`title` becomes required** when `hubHref` is set, and the compiler enforces it: a link whose only content is artwork has no accessible name otherwise. |
350
+
351
+ **What you will see.** Nothing, until someone tabs to it. The linked wordmark
352
+ draws the same pixels as the plain one: the `wordmark`, `wordmark-rail` and
353
+ `mark-boost33` baselines pass unchanged with the specimen rendering the linked
354
+ form. Keyboard focus draws the nav rows' ring, a 2px `--color-primary` outline,
355
+ around the lockup. That focus ring is new and is not captured by any baseline.
356
+
357
+ **Three things to check in your app:**
358
+
359
+ - **The link's accessible name is "Boost33"**, the lockup's own text, in every
360
+ locale. That is a brand name, not a phrase, so it is not translated.
361
+ - **Do not also link the mark you pass in.** `mark={<Boost33Mark />}` stays
362
+ unlinked; a linked mark inside a linked lockup nests one anchor in another.
363
+ - **The hub URL is usually on another origin.** `linkComponent` still receives
364
+ it, as the switcher's hub row already does. Next's `Link` and next-intl's
365
+ localised `Link` both pass an absolute URL through as an ordinary navigation.
366
+
367
+ #### Not in `dist/`
368
+
369
+ The Wordmark and AppShell specimen routes render the linked form, new behaviour
370
+ tests in `tests/wordmark.test.tsx`, `tests/boost33-mark.test.tsx` and
371
+ `tests/app-shell.test.tsx`, and a compile-time guard,
372
+ `tests/boost33-mark-link.type-test.tsx`. No baseline changed.
373
+
374
+ ## 0.7.0 — 2026-10-29
313
375
 
314
376
  **The redrawn marks' baselines were approved by Jamal on 29 October 2026**
315
- (`tests/baselines/README.md`, "The 29 October redraw"), so nothing holds this
316
- release on that account. Date the heading when it is published.
377
+ (`tests/baselines/README.md`, "The 29 October redraw"), and the release was
378
+ published the same day.
317
379
 
318
380
  **Not breaking. Nothing to do on upgrade, and every product mark looks
319
381
  different.** A minor: no export, prop or type changes. `ProductMark` draws new
@@ -69,8 +69,16 @@ export interface AppShellProps {
69
69
  nav: AppShellNavSection[];
70
70
  /** The top bar's content -- the breadcrumb and the shell actions on its right. */
71
71
  topBar: TopBarProps;
72
- /** The Boost33 mark for the wordmark lockup. Passed in, the way Wordmark takes it; on the rail it is all that shows. */
72
+ /** The Boost33 mark for the wordmark lockup. Passed in, the way Wordmark takes it; on the rail it is all that shows. Pass it unlinked -- `hubHref` links the whole lockup. */
73
73
  mark?: ReactNode;
74
+ /**
75
+ * Where the hub lives. Set it and the wordmark in the sidebar's top-left
76
+ * corner becomes a link home, rendered through `linkComponent`; omit it and
77
+ * the wordmark is the plain lockup it always was (B33-1699). The consumer
78
+ * supplies the URL -- Identity owns where the hub is and it differs per
79
+ * environment, so the package never hardcodes it. See `Wordmark.hubHref`.
80
+ */
81
+ hubHref?: string;
74
82
  /**
75
83
  * The product switcher, sitting under the wordmark. A slot: the registry it
76
84
  * draws is served by Identity (ADR-0003), not owned here. Render its own
@@ -94,14 +102,16 @@ export interface AppShellProps {
94
102
  /**
95
103
  * The element every linked nav row renders through. Defaults to a plain `a`;
96
104
  * a consumer whose router owns navigation passes its own here and the shell
97
- * threads it to every row of `nav`, so the whole nav goes client-side with the
98
- * locale prefix intact rather than full-page-reloading (B33-847). This is the
99
- * shell's one nod to how a consumer routes -- it renders the element, never
100
- * knowing what it is. See docs/adr/0011.
105
+ * threads it to every row of `nav`, and to the wordmark when `hubHref` links
106
+ * it, so the whole nav goes client-side with the locale prefix intact rather
107
+ * than full-page-reloading (B33-847). This is the shell's one nod to how a
108
+ * consumer routes -- it renders the element, never knowing what it is. See
109
+ * docs/adr/0011.
101
110
  *
102
- * **It reaches the rows of `nav` and nothing else.** The slots (`switcher`,
103
- * `wallet`, `footer`, `topBar.actions`) are `ReactNode`s the consumer has
104
- * already created, so the shell cannot put a prop on what is inside one. A
111
+ * **It reaches the rows of `nav` and the wordmark, and nothing else.** The
112
+ * slots (`switcher`, `wallet`, `footer`, `topBar.actions`) are `ReactNode`s
113
+ * the consumer has already created, so the shell cannot put a prop on what is
114
+ * inside one. A
105
115
  * consumer composing a link-bearing component into a slot -- `AppSwitcher`,
106
116
  * `AccountMenu`, `NotificationCenter` -- passes `linkComponent` to that
107
117
  * component as well, or its rows stay bare anchors and reload the page. The
@@ -130,4 +140,4 @@ export interface AppShellProps {
130
140
  */
131
141
  children: ReactNode;
132
142
  }
133
- export declare function AppShell({ label, navLabel, nav, topBar, mark, switcher, wallet, footer, collapsed, linkComponent, children, }: AppShellProps): import("react").JSX.Element;
143
+ export declare function AppShell({ label, navLabel, nav, topBar, mark, hubHref, switcher, wallet, footer, collapsed, linkComponent, children, }: AppShellProps): import("react").JSX.Element;
@@ -1,57 +1,58 @@
1
1
  import { jsxs as i, jsx as r } from "react/jsx-runtime";
2
- import { Sidebar as b } from "../Sidebar/Sidebar.js";
3
- import { NavSection as k } from "../NavSection/NavSection.js";
4
- import { NavItem as x } from "../NavItem/NavItem.js";
5
- import { TopBar as S } from "../TopBar/TopBar.js";
6
- import { Wordmark as g } from "../Wordmark/Wordmark.js";
2
+ import { Sidebar as x } from "../Sidebar/Sidebar.js";
3
+ import { NavSection as S } from "../NavSection/NavSection.js";
4
+ import { NavItem as g } from "../NavItem/NavItem.js";
5
+ import { TopBar as j } from "../TopBar/TopBar.js";
6
+ import { Wordmark as k } from "../Wordmark/Wordmark.js";
7
7
  import a from "./AppShell.module.css.js";
8
- function T({
8
+ function W({
9
9
  label: e,
10
10
  navLabel: t,
11
- nav: d,
12
- topBar: h,
13
- mark: v,
11
+ nav: h,
12
+ topBar: v,
13
+ mark: f,
14
+ hubHref: p,
14
15
  switcher: m,
15
- wallet: o,
16
- footer: c,
17
- collapsed: l = !1,
18
- linkComponent: f,
19
- children: p
16
+ wallet: c,
17
+ footer: o,
18
+ collapsed: n = !1,
19
+ linkComponent: s,
20
+ children: u
20
21
  }) {
21
22
  return /* @__PURE__ */ i("div", { className: a.shell, children: [
22
- /* @__PURE__ */ i(b, { landmarkLabel: e, collapsed: l, children: [
23
- /* @__PURE__ */ r("div", { className: a.wordmark, children: /* @__PURE__ */ r(g, { mark: v, collapsed: l }) }),
23
+ /* @__PURE__ */ i(x, { landmarkLabel: e, collapsed: n, children: [
24
+ /* @__PURE__ */ r("div", { className: a.wordmark, children: /* @__PURE__ */ r(k, { mark: f, collapsed: n, hubHref: p, linkComponent: s }) }),
24
25
  m != null && /* @__PURE__ */ r("div", { className: a.switcher, children: m }),
25
- /* @__PURE__ */ r("nav", { "aria-label": t ?? e, className: a.nav, children: d.map((s, u) => (
26
+ /* @__PURE__ */ r("nav", { "aria-label": t ?? e, className: a.nav, children: h.map((d, N) => (
26
27
  // No room for a header at 56px, so on the rail every section renders
27
28
  // headerless -- its rows collapse to their icons and line up.
28
- /* @__PURE__ */ r(k, { label: l ? void 0 : s.label, children: s.items.map((n, N) => /* @__PURE__ */ r(
29
- x,
29
+ /* @__PURE__ */ r(S, { label: n ? void 0 : d.label, children: d.items.map((l, b) => /* @__PURE__ */ r(
30
+ g,
30
31
  {
31
- icon: n.icon,
32
- active: n.active,
33
- collapsed: l,
34
- count: n.count,
35
- countUrgent: n.countUrgent,
36
- href: n.href,
37
- linkComponent: f,
38
- children: n.label
32
+ icon: l.icon,
33
+ active: l.active,
34
+ collapsed: n,
35
+ count: l.count,
36
+ countUrgent: l.countUrgent,
37
+ href: l.href,
38
+ linkComponent: s,
39
+ children: l.label
39
40
  },
40
- N
41
- )) }, u)
41
+ b
42
+ )) }, N)
42
43
  )) }),
43
- (o != null || c != null) && /* @__PURE__ */ i("div", { className: a.foot, children: [
44
- o,
45
- c
44
+ (c != null || o != null) && /* @__PURE__ */ i("div", { className: a.foot, children: [
45
+ c,
46
+ o
46
47
  ] })
47
48
  ] }),
48
49
  /* @__PURE__ */ i("div", { className: a.main, children: [
49
- /* @__PURE__ */ r(S, { ...h }),
50
- /* @__PURE__ */ r("main", { className: a.content, children: p })
50
+ /* @__PURE__ */ r(j, { ...v }),
51
+ /* @__PURE__ */ r("main", { className: a.content, children: u })
51
52
  ] })
52
53
  ] });
53
54
  }
54
55
  export {
55
- T as AppShell
56
+ W as AppShell
56
57
  };
57
58
  //# sourceMappingURL=AppShell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.js","sources":["../../../src/components/AppShell/AppShell.tsx"],"sourcesContent":["import type { ElementType, ReactNode } from 'react'\nimport { Sidebar } from '../Sidebar/Sidebar'\nimport { NavSection } from '../NavSection/NavSection'\nimport { NavItem } from '../NavItem/NavItem'\nimport { TopBar, type TopBarProps } from '../TopBar/TopBar'\nimport { Wordmark } from '../Wordmark/Wordmark'\nimport styles from './AppShell.module.css'\n\n/** One nav row, described as data. The consumer never hands the shell markup. */\nexport interface AppShellNavItem {\n /** The row's name. Truncates rather than wrapping; on the rail it collapses to the accessibility tree. */\n label: string\n /** The leading icon. Decorative -- the label carries the name. On the rail it is all that shows. */\n icon?: ReactNode\n /** Marks this row as the current page. Sets `aria-current=\"page\"`. */\n active?: boolean\n /** Trailing-slot count. Omit to leave the slot empty; it still reserves its width so counts line up. */\n count?: number\n /** Renders `count` in the primary color instead of muted. */\n countUrgent?: boolean\n /** Where the row goes. A nav row's destination is data; the shell renders it as a link. */\n href?: string\n}\n\n/** One nav section: an optional header over a run of rows. */\nexport interface AppShellNavSection {\n /** The section header. Omit for a headerless section (the nav's first section has none). On the rail every header drops. */\n label?: string\n /** The section's rows, as data. */\n items: AppShellNavItem[]\n}\n\nexport interface AppShellProps {\n /**\n * The accessible name of the sidebar landmark. A display string in the\n * consumer's own language -- usually the product's name -- that reaches\n * `aria-label` on the `<aside>` and is never rendered as text.\n *\n * **It is an accessible name, not product-awareness.** This prop was called\n * `product` and its comment claimed it was \"the whole of the shell's\n * product-awareness\" (B33-1272). Nothing branches on it, nothing is looked up\n * with it, and no artwork or copy changes because of it -- so the comment\n * described a mechanism that did not exist and sent the next reader looking\n * for the rest of it. The shell is product-aware through `nav`, `switcher`,\n * `wallet` and `footer`, which are the product's own data.\n *\n * **Not the Identity slug.** `AppSwitcher.currentSlug` takes that\n * (`\"wallet\"`, `\"boostscore\"`); this takes what a person would read\n * (\"Wallet\"). The shell carries two names for one product and nothing in the\n * types connects them, so check which kind of string each prop wants.\n */\n label: string\n /**\n * The accessible name of the navigation landmark inside the sidebar.\n * **Defaults to `label`, which is today's behaviour and not the fix.**\n *\n * Pass a distinct string here. Without one the `<aside>` and the `<nav>`\n * nested inside it carry the same accessible name, and a screen-reader user\n * moving by landmark hears \"Wallet complementary\" then \"Wallet navigation\" --\n * the name doing none of the distinguishing that is the one job a landmark\n * label has (B33-1272). Something like \"Wallet sections\" or \"Wallet pages\",\n * in your language, resolves it.\n *\n * **The package cannot default this to anything better, which is why the\n * fallback is the default.** A sensible default would have to compose a word\n * -- \"navigation\", \"sections\" -- and that word is user-facing text a screen\n * reader reads aloud, so it would have to be in the consumer's language. Both\n * consumers default to French. This package hardcodes no user-facing English\n * (`tests/no-hardcoded-strings.test.ts`), and a composed English default would\n * ship an untranslatable word into assistive output for every consumer that\n * never noticed the prop. Repeating `label` is at least a name the consumer\n * chose and wrote in their own language. So the duplicate name is only fully\n * resolved by a consumer passing this.\n */\n navLabel?: string\n /** The navigation, as data. No product hardcodes rows; the shell composes them. */\n nav: AppShellNavSection[]\n /** The top bar's content -- the breadcrumb and the shell actions on its right. */\n topBar: TopBarProps\n /** The Boost33 mark for the wordmark lockup. Passed in, the way Wordmark takes it; on the rail it is all that shows. */\n mark?: ReactNode\n /**\n * The product switcher, sitting under the wordmark. A slot: the registry it\n * draws is served by Identity (ADR-0003), not owned here. Render its own\n * collapsed form for the rail.\n */\n switcher?: ReactNode\n /**\n * The wallet chip, pinned above the footer. A slot: the balance comes from\n * `@boost33/ledger-client`, never read here. Render its own collapsed form\n * for the rail.\n */\n wallet?: ReactNode\n /** The sidebar footer, below the wallet chip. A slot -- the product's own. */\n footer?: ReactNode\n /**\n * The sidebar collapsed to the 56px rail. A state of the shell: the sidebar\n * narrows and every piece it owns collapses off this one flag. The slots\n * (switcher, wallet, footer) render their own collapsed form.\n */\n collapsed?: boolean\n /**\n * The element every linked nav row renders through. Defaults to a plain `a`;\n * a consumer whose router owns navigation passes its own here and the shell\n * threads it to every row of `nav`, so the whole nav goes client-side with the\n * locale prefix intact rather than full-page-reloading (B33-847). This is the\n * shell's one nod to how a consumer routes -- it renders the element, never\n * knowing what it is. See docs/adr/0011.\n *\n * **It reaches the rows of `nav` and nothing else.** The slots (`switcher`,\n * `wallet`, `footer`, `topBar.actions`) are `ReactNode`s the consumer has\n * already created, so the shell cannot put a prop on what is inside one. A\n * consumer composing a link-bearing component into a slot -- `AppSwitcher`,\n * `AccountMenu`, `NotificationCenter` -- passes `linkComponent` to that\n * component as well, or its rows stay bare anchors and reload the page. The\n * Wallet shipped exactly that defect (B33-1281) by reading this prop as the\n * single place, which is the 2026-10-06 correction on docs/adr/0011.\n */\n linkComponent?: ElementType\n /**\n * The page body. Sits on white, below the top bar, and the shell renders it\n * inside the page's `<main>` -- so a consumer adds no wrapper of its own.\n *\n * **The page's title goes here too.** A screen with a title renders\n * `PageHeader` as the first thing in its own body; a screen with none renders\n * nothing and the top bar's hairline sits straight on the content, which is\n * what the Wallet's overview does and what its 9 Sep baseline shows. The\n * shell used to take a `pageHeader` prop and draw the header itself, above\n * this; B33-1267 removed it, because no consumer ever passed it and Score\n * forbids it by test (the page below owns the sole `h1`).\n *\n * **Everything here scrolls.** This box is the shell's one scrolling element,\n * so the sidebar and top bar stay pinned and the page header goes up with the\n * body. The removed prop sat outside the scroll box and pinned the header\n * instead -- the one real difference between the two spellings, and the\n * reason the choice was worth collapsing to one rather than leaving to a\n * consumer to discover on a long page.\n */\n children: ReactNode\n}\n\n// The shell every authenticated Boost33 screen renders inside. It composes the\n// pieces built in the earlier tickets -- sidebar, wordmark, switcher, nav,\n// wallet chip, top bar -- into one thing a product imports instead of building a\n// sidebar. Everything that differs between products is the product's own data --\n// `nav`, `switcher`, `wallet`, `footer` -- and nothing above the nav (the Boost33\n// wordmark and brand) changes at all. `label` and `navLabel` name the two\n// landmarks and decide nothing; B33-1272 corrected the claim that `label` (then\n// `product`) was the whole of the shell's product-awareness.\n//\n// `PageHeader` is deliberately not in that list. The shell drew it from a\n// `pageHeader` prop until B33-1267; a page's title is the page's, rendered at\n// the top of `children`, which is what both consumers already did.\nexport function AppShell({\n label,\n navLabel,\n nav,\n topBar,\n mark,\n switcher,\n wallet,\n footer,\n collapsed = false,\n linkComponent,\n children,\n}: AppShellProps) {\n return (\n <div className={styles.shell}>\n <Sidebar landmarkLabel={label} collapsed={collapsed}>\n <div className={styles.wordmark}>\n <Wordmark mark={mark} collapsed={collapsed} />\n </div>\n {switcher != null && <div className={styles.switcher}>{switcher}</div>}\n {/* Falls back to the sidebar's name rather than composing one. The\n composed string would be a word a screen reader reads aloud, so it\n would have to be in the consumer's language, and this package\n hardcodes no user-facing English. Falling back repeats a name the\n consumer wrote; it does not invent one. See `navLabel`. */}\n <nav aria-label={navLabel ?? label} className={styles.nav}>\n {nav.map((section, sectionIndex) => (\n // No room for a header at 56px, so on the rail every section renders\n // headerless -- its rows collapse to their icons and line up.\n <NavSection key={sectionIndex} label={collapsed ? undefined : section.label}>\n {section.items.map((item, itemIndex) => (\n <NavItem\n key={itemIndex}\n icon={item.icon}\n active={item.active}\n collapsed={collapsed}\n count={item.count}\n countUrgent={item.countUrgent}\n href={item.href}\n linkComponent={linkComponent}\n >\n {item.label}\n </NavItem>\n ))}\n </NavSection>\n ))}\n </nav>\n {(wallet != null || footer != null) && (\n <div className={styles.foot}>\n {wallet}\n {footer}\n </div>\n )}\n </Sidebar>\n {/* `.main` is the product's column -- the top bar over the body. The\n landmark is the body alone, one level down: jumping to main has to\n skip the chrome, and a <main> around the top bar would swallow the\n breadcrumb, the search box and the avatar. */}\n <div className={styles.main}>\n <TopBar {...topBar} />\n {/* The page's main landmark, and the shell's to supply. This was a plain\n div, so no route of any consumer had one unless that consumer\n remembered a wrapper of its own -- the Wallet did\n (`boostledger/src/app/(wallet)/layout.tsx`), and three products each\n having to remember it is three chances to ship without one. What the\n absence costs a screen-reader user is the first move they make on an\n unfamiliar screen: jump to main and start reading. Without one they\n land at the top of the document and walk the wordmark, the switcher,\n every nav row, the wallet chip, the footer links, the sidebar toggle,\n the search box and the avatar before the first word of the page -- on\n every navigation, because the shell is a layout and does not remount.\n\n The landmark is the body alone, which is the half that matters: a\n <main> drawn around `.main` would satisfy any \"has a landmark\" check\n and buy the reader nothing, because jumping to it would land them\n back on the breadcrumb.\n\n A consumer that already wraps `children` now has two, which is worse\n than none -- B33-1265 drops the Wallet's as it takes this version,\n and the CHANGELOG entry tells both consumers to.\n\n An element swap and nothing else: `main` and `div` are both\n `display: block`, the class and every declaration behind it are\n untouched, and all 27 gated screenshot states came back at the ratios\n they held before. */}\n <main className={styles.content}>{children}</main>\n </div>\n </div>\n )\n}\n"],"names":["AppShell","label","navLabel","nav","topBar","mark","switcher","wallet","footer","collapsed","linkComponent","children","jsxs","styles","Sidebar","jsx","Wordmark","section","sectionIndex","NavSection","item","itemIndex","NavItem","TopBar"],"mappings":";;;;;;;AAyJO,SAASA,EAAS;AAAA,EACvB,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,KAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,eAAAC;AAAA,EACA,UAAAC;AACF,GAAkB;AAChB,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAWC,EAAO,OACrB,UAAA;AAAA,IAAA,gBAAAD,EAACE,GAAA,EAAQ,eAAeb,GAAO,WAAAQ,GAC7B,UAAA;AAAA,MAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWF,EAAO,UACrB,4BAACG,GAAA,EAAS,MAAAX,GAAY,WAAAI,GAAsB,EAAA,CAC9C;AAAA,MACCH,KAAY,QAAQ,gBAAAS,EAAC,SAAI,WAAWF,EAAO,UAAW,UAAAP,GAAS;AAAA,MAMhE,gBAAAS,EAAC,OAAA,EAAI,cAAYb,KAAYD,GAAO,WAAWY,EAAO,KACnD,UAAAV,EAAI,IAAI,CAACc,GAASC;AAAA;AAAA;AAAA,QAGjB,gBAAAH,EAACI,GAAA,EAA8B,OAAOV,IAAY,SAAYQ,EAAQ,OACnE,UAAAA,EAAQ,MAAM,IAAI,CAACG,GAAMC,MACxB,gBAAAN;AAAA,UAACO;AAAA,UAAA;AAAA,YAEC,MAAMF,EAAK;AAAA,YACX,QAAQA,EAAK;AAAA,YACb,WAAAX;AAAA,YACA,OAAOW,EAAK;AAAA,YACZ,aAAaA,EAAK;AAAA,YAClB,MAAMA,EAAK;AAAA,YACX,eAAAV;AAAA,YAEC,UAAAU,EAAK;AAAA,UAAA;AAAA,UATDC;AAAA,QAAA,CAWR,KAdcH,CAejB;AAAA,OACD,GACH;AAAA,OACEX,KAAU,QAAQC,KAAU,2BAC3B,OAAA,EAAI,WAAWK,EAAO,MACpB,UAAA;AAAA,QAAAN;AAAA,QACAC;AAAA,MAAA,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,IAKA,gBAAAI,EAAC,OAAA,EAAI,WAAWC,EAAO,MACrB,UAAA;AAAA,MAAA,gBAAAE,EAACQ,GAAA,EAAQ,GAAGnB,GAAQ;AAAA,MA0BpB,gBAAAW,EAAC,QAAA,EAAK,WAAWF,EAAO,SAAU,UAAAF,EAAA,CAAS;AAAA,IAAA,EAAA,CAC7C;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"AppShell.js","sources":["../../../src/components/AppShell/AppShell.tsx"],"sourcesContent":["import type { ElementType, ReactNode } from 'react'\nimport { Sidebar } from '../Sidebar/Sidebar'\nimport { NavSection } from '../NavSection/NavSection'\nimport { NavItem } from '../NavItem/NavItem'\nimport { TopBar, type TopBarProps } from '../TopBar/TopBar'\nimport { Wordmark } from '../Wordmark/Wordmark'\nimport styles from './AppShell.module.css'\n\n/** One nav row, described as data. The consumer never hands the shell markup. */\nexport interface AppShellNavItem {\n /** The row's name. Truncates rather than wrapping; on the rail it collapses to the accessibility tree. */\n label: string\n /** The leading icon. Decorative -- the label carries the name. On the rail it is all that shows. */\n icon?: ReactNode\n /** Marks this row as the current page. Sets `aria-current=\"page\"`. */\n active?: boolean\n /** Trailing-slot count. Omit to leave the slot empty; it still reserves its width so counts line up. */\n count?: number\n /** Renders `count` in the primary color instead of muted. */\n countUrgent?: boolean\n /** Where the row goes. A nav row's destination is data; the shell renders it as a link. */\n href?: string\n}\n\n/** One nav section: an optional header over a run of rows. */\nexport interface AppShellNavSection {\n /** The section header. Omit for a headerless section (the nav's first section has none). On the rail every header drops. */\n label?: string\n /** The section's rows, as data. */\n items: AppShellNavItem[]\n}\n\nexport interface AppShellProps {\n /**\n * The accessible name of the sidebar landmark. A display string in the\n * consumer's own language -- usually the product's name -- that reaches\n * `aria-label` on the `<aside>` and is never rendered as text.\n *\n * **It is an accessible name, not product-awareness.** This prop was called\n * `product` and its comment claimed it was \"the whole of the shell's\n * product-awareness\" (B33-1272). Nothing branches on it, nothing is looked up\n * with it, and no artwork or copy changes because of it -- so the comment\n * described a mechanism that did not exist and sent the next reader looking\n * for the rest of it. The shell is product-aware through `nav`, `switcher`,\n * `wallet` and `footer`, which are the product's own data.\n *\n * **Not the Identity slug.** `AppSwitcher.currentSlug` takes that\n * (`\"wallet\"`, `\"boostscore\"`); this takes what a person would read\n * (\"Wallet\"). The shell carries two names for one product and nothing in the\n * types connects them, so check which kind of string each prop wants.\n */\n label: string\n /**\n * The accessible name of the navigation landmark inside the sidebar.\n * **Defaults to `label`, which is today's behaviour and not the fix.**\n *\n * Pass a distinct string here. Without one the `<aside>` and the `<nav>`\n * nested inside it carry the same accessible name, and a screen-reader user\n * moving by landmark hears \"Wallet complementary\" then \"Wallet navigation\" --\n * the name doing none of the distinguishing that is the one job a landmark\n * label has (B33-1272). Something like \"Wallet sections\" or \"Wallet pages\",\n * in your language, resolves it.\n *\n * **The package cannot default this to anything better, which is why the\n * fallback is the default.** A sensible default would have to compose a word\n * -- \"navigation\", \"sections\" -- and that word is user-facing text a screen\n * reader reads aloud, so it would have to be in the consumer's language. Both\n * consumers default to French. This package hardcodes no user-facing English\n * (`tests/no-hardcoded-strings.test.ts`), and a composed English default would\n * ship an untranslatable word into assistive output for every consumer that\n * never noticed the prop. Repeating `label` is at least a name the consumer\n * chose and wrote in their own language. So the duplicate name is only fully\n * resolved by a consumer passing this.\n */\n navLabel?: string\n /** The navigation, as data. No product hardcodes rows; the shell composes them. */\n nav: AppShellNavSection[]\n /** The top bar's content -- the breadcrumb and the shell actions on its right. */\n topBar: TopBarProps\n /** The Boost33 mark for the wordmark lockup. Passed in, the way Wordmark takes it; on the rail it is all that shows. Pass it unlinked -- `hubHref` links the whole lockup. */\n mark?: ReactNode\n /**\n * Where the hub lives. Set it and the wordmark in the sidebar's top-left\n * corner becomes a link home, rendered through `linkComponent`; omit it and\n * the wordmark is the plain lockup it always was (B33-1699). The consumer\n * supplies the URL -- Identity owns where the hub is and it differs per\n * environment, so the package never hardcodes it. See `Wordmark.hubHref`.\n */\n hubHref?: string\n /**\n * The product switcher, sitting under the wordmark. A slot: the registry it\n * draws is served by Identity (ADR-0003), not owned here. Render its own\n * collapsed form for the rail.\n */\n switcher?: ReactNode\n /**\n * The wallet chip, pinned above the footer. A slot: the balance comes from\n * `@boost33/ledger-client`, never read here. Render its own collapsed form\n * for the rail.\n */\n wallet?: ReactNode\n /** The sidebar footer, below the wallet chip. A slot -- the product's own. */\n footer?: ReactNode\n /**\n * The sidebar collapsed to the 56px rail. A state of the shell: the sidebar\n * narrows and every piece it owns collapses off this one flag. The slots\n * (switcher, wallet, footer) render their own collapsed form.\n */\n collapsed?: boolean\n /**\n * The element every linked nav row renders through. Defaults to a plain `a`;\n * a consumer whose router owns navigation passes its own here and the shell\n * threads it to every row of `nav`, and to the wordmark when `hubHref` links\n * it, so the whole nav goes client-side with the locale prefix intact rather\n * than full-page-reloading (B33-847). This is the shell's one nod to how a\n * consumer routes -- it renders the element, never knowing what it is. See\n * docs/adr/0011.\n *\n * **It reaches the rows of `nav` and the wordmark, and nothing else.** The\n * slots (`switcher`, `wallet`, `footer`, `topBar.actions`) are `ReactNode`s\n * the consumer has already created, so the shell cannot put a prop on what is\n * inside one. A\n * consumer composing a link-bearing component into a slot -- `AppSwitcher`,\n * `AccountMenu`, `NotificationCenter` -- passes `linkComponent` to that\n * component as well, or its rows stay bare anchors and reload the page. The\n * Wallet shipped exactly that defect (B33-1281) by reading this prop as the\n * single place, which is the 2026-10-06 correction on docs/adr/0011.\n */\n linkComponent?: ElementType\n /**\n * The page body. Sits on white, below the top bar, and the shell renders it\n * inside the page's `<main>` -- so a consumer adds no wrapper of its own.\n *\n * **The page's title goes here too.** A screen with a title renders\n * `PageHeader` as the first thing in its own body; a screen with none renders\n * nothing and the top bar's hairline sits straight on the content, which is\n * what the Wallet's overview does and what its 9 Sep baseline shows. The\n * shell used to take a `pageHeader` prop and draw the header itself, above\n * this; B33-1267 removed it, because no consumer ever passed it and Score\n * forbids it by test (the page below owns the sole `h1`).\n *\n * **Everything here scrolls.** This box is the shell's one scrolling element,\n * so the sidebar and top bar stay pinned and the page header goes up with the\n * body. The removed prop sat outside the scroll box and pinned the header\n * instead -- the one real difference between the two spellings, and the\n * reason the choice was worth collapsing to one rather than leaving to a\n * consumer to discover on a long page.\n */\n children: ReactNode\n}\n\n// The shell every authenticated Boost33 screen renders inside. It composes the\n// pieces built in the earlier tickets -- sidebar, wordmark, switcher, nav,\n// wallet chip, top bar -- into one thing a product imports instead of building a\n// sidebar. Everything that differs between products is the product's own data --\n// `nav`, `switcher`, `wallet`, `footer` -- and nothing above the nav (the Boost33\n// wordmark and brand) changes at all. `label` and `navLabel` name the two\n// landmarks and decide nothing; B33-1272 corrected the claim that `label` (then\n// `product`) was the whole of the shell's product-awareness.\n//\n// `PageHeader` is deliberately not in that list. The shell drew it from a\n// `pageHeader` prop until B33-1267; a page's title is the page's, rendered at\n// the top of `children`, which is what both consumers already did.\nexport function AppShell({\n label,\n navLabel,\n nav,\n topBar,\n mark,\n hubHref,\n switcher,\n wallet,\n footer,\n collapsed = false,\n linkComponent,\n children,\n}: AppShellProps) {\n return (\n <div className={styles.shell}>\n <Sidebar landmarkLabel={label} collapsed={collapsed}>\n <div className={styles.wordmark}>\n <Wordmark mark={mark} collapsed={collapsed} hubHref={hubHref} linkComponent={linkComponent} />\n </div>\n {switcher != null && <div className={styles.switcher}>{switcher}</div>}\n {/* Falls back to the sidebar's name rather than composing one. The\n composed string would be a word a screen reader reads aloud, so it\n would have to be in the consumer's language, and this package\n hardcodes no user-facing English. Falling back repeats a name the\n consumer wrote; it does not invent one. See `navLabel`. */}\n <nav aria-label={navLabel ?? label} className={styles.nav}>\n {nav.map((section, sectionIndex) => (\n // No room for a header at 56px, so on the rail every section renders\n // headerless -- its rows collapse to their icons and line up.\n <NavSection key={sectionIndex} label={collapsed ? undefined : section.label}>\n {section.items.map((item, itemIndex) => (\n <NavItem\n key={itemIndex}\n icon={item.icon}\n active={item.active}\n collapsed={collapsed}\n count={item.count}\n countUrgent={item.countUrgent}\n href={item.href}\n linkComponent={linkComponent}\n >\n {item.label}\n </NavItem>\n ))}\n </NavSection>\n ))}\n </nav>\n {(wallet != null || footer != null) && (\n <div className={styles.foot}>\n {wallet}\n {footer}\n </div>\n )}\n </Sidebar>\n {/* `.main` is the product's column -- the top bar over the body. The\n landmark is the body alone, one level down: jumping to main has to\n skip the chrome, and a <main> around the top bar would swallow the\n breadcrumb, the search box and the avatar. */}\n <div className={styles.main}>\n <TopBar {...topBar} />\n {/* The page's main landmark, and the shell's to supply. This was a plain\n div, so no route of any consumer had one unless that consumer\n remembered a wrapper of its own -- the Wallet did\n (`boostledger/src/app/(wallet)/layout.tsx`), and three products each\n having to remember it is three chances to ship without one. What the\n absence costs a screen-reader user is the first move they make on an\n unfamiliar screen: jump to main and start reading. Without one they\n land at the top of the document and walk the wordmark, the switcher,\n every nav row, the wallet chip, the footer links, the sidebar toggle,\n the search box and the avatar before the first word of the page -- on\n every navigation, because the shell is a layout and does not remount.\n\n The landmark is the body alone, which is the half that matters: a\n <main> drawn around `.main` would satisfy any \"has a landmark\" check\n and buy the reader nothing, because jumping to it would land them\n back on the breadcrumb.\n\n A consumer that already wraps `children` now has two, which is worse\n than none -- B33-1265 drops the Wallet's as it takes this version,\n and the CHANGELOG entry tells both consumers to.\n\n An element swap and nothing else: `main` and `div` are both\n `display: block`, the class and every declaration behind it are\n untouched, and all 27 gated screenshot states came back at the ratios\n they held before. */}\n <main className={styles.content}>{children}</main>\n </div>\n </div>\n )\n}\n"],"names":["AppShell","label","navLabel","nav","topBar","mark","hubHref","switcher","wallet","footer","collapsed","linkComponent","children","jsxs","styles","Sidebar","jsx","Wordmark","section","sectionIndex","NavSection","item","itemIndex","NavItem","TopBar"],"mappings":";;;;;;;AAmKO,SAASA,EAAS;AAAA,EACvB,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,KAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,eAAAC;AAAA,EACA,UAAAC;AACF,GAAkB;AAChB,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAWC,EAAO,OACrB,UAAA;AAAA,IAAA,gBAAAD,EAACE,GAAA,EAAQ,eAAed,GAAO,WAAAS,GAC7B,UAAA;AAAA,MAAA,gBAAAM,EAAC,OAAA,EAAI,WAAWF,EAAO,UACrB,UAAA,gBAAAE,EAACC,KAAS,MAAAZ,GAAY,WAAAK,GAAsB,SAAAJ,GAAkB,eAAAK,EAAA,CAA8B,EAAA,CAC9F;AAAA,MACCJ,KAAY,QAAQ,gBAAAS,EAAC,SAAI,WAAWF,EAAO,UAAW,UAAAP,GAAS;AAAA,MAMhE,gBAAAS,EAAC,OAAA,EAAI,cAAYd,KAAYD,GAAO,WAAWa,EAAO,KACnD,UAAAX,EAAI,IAAI,CAACe,GAASC;AAAA;AAAA;AAAA,QAGjB,gBAAAH,EAACI,GAAA,EAA8B,OAAOV,IAAY,SAAYQ,EAAQ,OACnE,UAAAA,EAAQ,MAAM,IAAI,CAACG,GAAMC,MACxB,gBAAAN;AAAA,UAACO;AAAA,UAAA;AAAA,YAEC,MAAMF,EAAK;AAAA,YACX,QAAQA,EAAK;AAAA,YACb,WAAAX;AAAA,YACA,OAAOW,EAAK;AAAA,YACZ,aAAaA,EAAK;AAAA,YAClB,MAAMA,EAAK;AAAA,YACX,eAAAV;AAAA,YAEC,UAAAU,EAAK;AAAA,UAAA;AAAA,UATDC;AAAA,QAAA,CAWR,KAdcH,CAejB;AAAA,OACD,GACH;AAAA,OACEX,KAAU,QAAQC,KAAU,2BAC3B,OAAA,EAAI,WAAWK,EAAO,MACpB,UAAA;AAAA,QAAAN;AAAA,QACAC;AAAA,MAAA,EAAA,CACH;AAAA,IAAA,GAEJ;AAAA,IAKA,gBAAAI,EAAC,OAAA,EAAI,WAAWC,EAAO,MACrB,UAAA;AAAA,MAAA,gBAAAE,EAACQ,GAAA,EAAQ,GAAGpB,GAAQ;AAAA,MA0BpB,gBAAAY,EAAC,QAAA,EAAK,WAAWF,EAAO,SAAU,UAAAF,EAAA,CAAS;AAAA,IAAA,EAAA,CAC7C;AAAA,EAAA,GACF;AAEJ;"}
@@ -1,3 +1,4 @@
1
+ import { ElementType } from 'react';
1
2
  /**
2
3
  * The smallest size the artwork survives, in px. Recorded, not enforced — the
3
4
  * charte's brand guide warns the monogram stops working below about 20px: the
@@ -11,12 +12,17 @@
11
12
  * when the second mark lands.
12
13
  */
13
14
  export declare const BOOST33_MARK_MIN_LEGIBLE_PX = 20;
14
- export interface Boost33MarkProps {
15
+ interface Boost33MarkBaseProps {
15
16
  /**
16
17
  * Rendered width and height in px. Read BOOST33_MARK_MIN_LEGIBLE_PX before
17
18
  * going small.
18
19
  */
19
20
  size?: number;
21
+ /** Escape hatch for a consumer that needs to position the mark. */
22
+ className?: string;
23
+ }
24
+ /** The mark as artwork alone -- the default, and the only form inside a `Wordmark`. */
25
+ interface Boost33MarkStaticProps extends Boost33MarkBaseProps {
20
26
  /**
21
27
  * An accessible name. Omit it — the default — and the mark is decorative:
22
28
  * `aria-hidden`, contributing nothing to the accessibility tree. That is the
@@ -25,9 +31,35 @@ export interface Boost33MarkProps {
25
31
  * the mark stands alone as the sole carrier of meaning.
26
32
  */
27
33
  title?: string;
28
- /** Escape hatch for a consumer that needs to position the mark. */
29
- className?: string;
34
+ hubHref?: undefined;
35
+ linkComponent?: undefined;
36
+ }
37
+ /**
38
+ * The mark standing alone as the way home (B33-1699). **`title` is required
39
+ * here**, because a link whose only content is decorative artwork has no
40
+ * accessible name and a screen reader announces it as a bare "link". The
41
+ * consumer writes the name in its own language; this package hardcodes no
42
+ * user-facing English.
43
+ *
44
+ * Inside a `Wordmark`, link the `Wordmark` instead and pass the mark unlinked:
45
+ * a linked mark in a linked lockup nests one anchor inside another.
46
+ */
47
+ interface Boost33MarkLinkedProps extends Boost33MarkBaseProps {
48
+ /** The link's accessible name, e.g. "Boost33 home". */
49
+ title: string;
50
+ /**
51
+ * Where the hub lives. The consumer supplies it; the package never hardcodes
52
+ * it -- Identity owns where the hub is, and it differs per environment.
53
+ */
54
+ hubHref: string;
55
+ /**
56
+ * The element the link renders through. Defaults to a plain `a`; a consumer
57
+ * whose router owns navigation passes its own (ADR-0011, B33-847). Receives
58
+ * `href` and `className` unchanged.
59
+ */
60
+ linkComponent?: ElementType;
30
61
  }
62
+ export type Boost33MarkProps = Boost33MarkStaticProps | Boost33MarkLinkedProps;
31
63
  /**
32
64
  * The Boost33 mark — the "Bo" squircle monogram.
33
65
  *
@@ -62,4 +94,5 @@ export interface Boost33MarkProps {
62
94
  * it to `0 0 …` without re-deriving the paths; they carry absolute coordinates
63
95
  * and translating one without the other silently crops the mark.
64
96
  */
65
- export declare function Boost33Mark({ size, title, className }: Boost33MarkProps): import("react").JSX.Element;
97
+ export declare function Boost33Mark({ size, title, className, hubHref, linkComponent }: Boost33MarkProps): import("react").JSX.Element;
98
+ export {};
@@ -1,21 +1,20 @@
1
- import { jsxs as o, jsx as t } from "react/jsx-runtime";
2
- import { useId as r } from "react";
1
+ import { jsx as t, jsxs as d } from "react/jsx-runtime";
2
+ import { useId as m } from "react";
3
3
  import a from "./Boost33Mark.module.css.js";
4
- const d = 24, p = 20;
5
- function M({ size: i = d, title: s, className: l }) {
6
- const c = r(), e = s == null;
7
- return /* @__PURE__ */ o(
4
+ const h = 24, N = 20;
5
+ function k({ size: e = h, title: s, className: c, hubHref: l, linkComponent: n }) {
6
+ const r = m(), i = s == null, o = /* @__PURE__ */ d(
8
7
  "svg",
9
8
  {
10
- className: l != null ? `${a.mark} ${l}` : a.mark,
11
- width: i,
12
- height: i,
9
+ className: c != null ? `${a.mark} ${c}` : a.mark,
10
+ width: e,
11
+ height: e,
13
12
  viewBox: "402.17 34.21 234.9 235",
14
- role: e ? void 0 : "img",
15
- "aria-hidden": e ? "true" : void 0,
16
- "aria-labelledby": e ? void 0 : c,
13
+ role: i ? void 0 : "img",
14
+ "aria-hidden": i ? "true" : void 0,
15
+ "aria-labelledby": i ? void 0 : r,
17
16
  children: [
18
- !e && /* @__PURE__ */ t("title", { id: c, children: s }),
17
+ !i && /* @__PURE__ */ t("title", { id: r, children: s }),
19
18
  /* @__PURE__ */ t(
20
19
  "path",
21
20
  {
@@ -54,9 +53,10 @@ function M({ size: i = d, title: s, className: l }) {
54
53
  ]
55
54
  }
56
55
  );
56
+ return l ? /* @__PURE__ */ t(n ?? "a", { className: a.link, href: l, children: o }) : o;
57
57
  }
58
58
  export {
59
- p as BOOST33_MARK_MIN_LEGIBLE_PX,
60
- M as Boost33Mark
59
+ N as BOOST33_MARK_MIN_LEGIBLE_PX,
60
+ k as Boost33Mark
61
61
  };
62
62
  //# sourceMappingURL=Boost33Mark.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Boost33Mark.js","sources":["../../../src/components/Boost33Mark/Boost33Mark.tsx"],"sourcesContent":["import { useId } from 'react'\nimport styles from './Boost33Mark.module.css'\n\n/**\n * The size the mark renders at unless a caller says otherwise. 24px is the\n * Wallet's own default at both of its call sites, and it is the size\n * tests/baselines/mark-boost33.png, wordmark.png and wordmark-rail.png were\n * captured at.\n */\nconst DEFAULT_SIZE = 24\n\n/**\n * The smallest size the artwork survives, in px. Recorded, not enforced — the\n * charte's brand guide warns the monogram stops working below about 20px: the\n * bowls of the B and the hole in the o close up and the whole thing reads as a\n * dark blob. Anything smaller needs a simplified variant from the parent, not\n * this scaled down. Nothing in this package ships below it.\n *\n * This floor is the **monogram's alone**. The product marks have the opposite\n * requirement — they are drawn on a grid chosen so one path renders correctly\n * from 96px down to 20px — so do not generalise this number into a shared rule\n * when the second mark lands.\n */\nexport const BOOST33_MARK_MIN_LEGIBLE_PX = 20\n\nexport interface Boost33MarkProps {\n /**\n * Rendered width and height in px. Read BOOST33_MARK_MIN_LEGIBLE_PX before\n * going small.\n */\n size?: number\n /**\n * An accessible name. Omit it — the default — and the mark is decorative:\n * `aria-hidden`, contributing nothing to the accessibility tree. That is the\n * right answer in the lockup, where the word \"Boost33\" sits beside it and a\n * name here would only make a screen reader say it twice. Pass one only where\n * the mark stands alone as the sole carrier of meaning.\n */\n title?: string\n /** Escape hatch for a consumer that needs to position the mark. */\n className?: string\n}\n\n/**\n * The Boost33 mark — the \"Bo\" squircle monogram.\n *\n * **This artwork is not ours.** The monogram and the wordmark are set by the\n * Boost33 charte graphique and a product cannot change them; the parent's brand\n * documentation lists the monogram as \"black tile, orange letterform\" under what\n * it owns. The paths below are lifted verbatim out of the official lockup at\n * `docs/brand/logo-of-noir-orange.svg` in the Wallet repo (`boostledger`), by way\n * of its `src/ui/primitives/icons.tsx` — reproduced, not redrawn. If the mark\n * ever changes, it changes in that SVG first and this is re-extracted from it.\n * Nobody here gets to nudge a curve.\n *\n * What stood in for it in this package until B33-556 was a Stage A placeholder in\n * the specimen: an orange tile with a `<text>B</text>` typed on top. The Wallet\n * carried the same mistake — tile and letterform the wrong way round — until\n * 9 Sep 2026, which is why the original fidelity baselines showed it too. It had\n * been wrong against the charte the whole time, not just against Paper.\n *\n * How it is built, since the fills are not obvious from the path list: the first\n * path is the black squircle with the B, the o and the underscore knocked out of\n * it as counter-wound subpaths, so those three show through as white. The orange\n * ring is then drawn into the o, and the last three paths fill the B's two bowls\n * and the o's centre back to black. **Order matters between the ring and the\n * centre** — swap them and the o fills solid orange. Nothing else overlaps.\n *\n * The two `fill: none` paths in the source SVG are omitted. They are export\n * artefacts that render nothing, and dropping them does not affect the winding of\n * the path above them.\n *\n * The viewBox is the monogram's own bounding box **inside the lockup**, which is\n * why it is an offset rectangle rather than starting at the origin. Do not \"tidy\"\n * it to `0 0 …` without re-deriving the paths; they carry absolute coordinates\n * and translating one without the other silently crops the mark.\n */\nexport function Boost33Mark({ size = DEFAULT_SIZE, title, className }: Boost33MarkProps) {\n const titleId = useId()\n const decorative = title == null\n\n return (\n <svg\n className={className != null ? `${styles.mark} ${className}` : styles.mark}\n width={size}\n height={size}\n viewBox=\"402.17 34.21 234.9 235\"\n role={decorative ? undefined : 'img'}\n aria-hidden={decorative ? 'true' : undefined}\n aria-labelledby={decorative ? undefined : titleId}\n >\n {!decorative && <title id={titleId}>{title}</title>}\n {/* Tile, with the B / o / underscore knocked out of it. */}\n <path\n className={styles.tile}\n d=\"M404.19,97c3.79-36.53,38.18-62.45,74.88-62.79q40-.37,80,0c43.66.4,77.69,34.58,78,78.28q.27,38.63,0,77.27c-.35,45.47-34.21,79.19-79.71,79.45q-38.62.23-77.24,0c-43.46-.34-77.66-34.79-77.95-78.34-.09-13,0-26.07,0-39.1m42.93-56V207c23.4,0,46.31.89,69.1-.33,14.41-.77,25.11-13.75,26.36-28.3,1.37-16-6.92-26.34-20.61-33.54,1.15-2.88,2.34-5.37,3.16-8C529,118.35,517,97.73,497.72,96,480.55,94.49,463.15,95.7,445.11,95.7Zm127.65,63.44a31.89,31.89,0,1,0-31.21-32.47A31.87,31.87,0,0,0,572.76,159.14ZM597.12,183V168.11H550.05V183Z\"\n />\n {/* The o, and the only orange in the mark. */}\n <path\n className={styles.ring}\n d=\"M572.76,159.14a31.89,31.89,0,1,1,32.47-31.31A31.62,31.62,0,0,1,572.76,159.14Zm.56-47.42a15.53,15.53,0,1,0,15.61,16A15.44,15.44,0,0,0,573.32,111.72Z\"\n />\n {/* The B's two bowls and the o's centre, returned to the tile's black. */}\n <path\n className={styles.tile}\n d=\"M460.7,190.94V160.11c17.05,0,33.68-.53,50.25.23,8.11.37,13.22,7.7,13,15.5s-5.75,14.69-13.73,14.94C493.9,191.3,477.58,190.94,460.7,190.94Z\"\n />\n <path\n className={styles.tile}\n d=\"M460.65,142.62V112.36c12.1,0,24.4-.89,36.5.33,7.46.76,11.4,7.3,11.05,15-.37,8.1-5,14-12.95,14.64C484,143.3,472.52,142.62,460.65,142.62Z\"\n />\n <path\n className={styles.tile}\n d=\"M573.32,111.72a15.53,15.53,0,1,1,0,31.06,15.53,15.53,0,1,1,0-31.06Z\"\n />\n </svg>\n )\n}\n"],"names":["DEFAULT_SIZE","BOOST33_MARK_MIN_LEGIBLE_PX","Boost33Mark","size","title","className","titleId","useId","decorative","jsxs","styles","jsx"],"mappings":";;;AASA,MAAMA,IAAe,IAcRC,IAA8B;AAsDpC,SAASC,EAAY,EAAE,MAAAC,IAAOH,GAAc,OAAAI,GAAO,WAAAC,KAA+B;AACvF,QAAMC,IAAUC,EAAA,GACVC,IAAaJ,KAAS;AAE5B,SACE,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWJ,KAAa,OAAO,GAAGK,EAAO,IAAI,IAAIL,CAAS,KAAKK,EAAO;AAAA,MACtE,OAAOP;AAAA,MACP,QAAQA;AAAA,MACR,SAAQ;AAAA,MACR,MAAMK,IAAa,SAAY;AAAA,MAC/B,eAAaA,IAAa,SAAS;AAAA,MACnC,mBAAiBA,IAAa,SAAYF;AAAA,MAEzC,UAAA;AAAA,QAAA,CAACE,KAAc,gBAAAG,EAAC,SAAA,EAAM,IAAIL,GAAU,UAAAF,GAAM;AAAA,QAE3C,gBAAAO;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJ,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJ,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,QAEJ,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,QAEJ,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"Boost33Mark.js","sources":["../../../src/components/Boost33Mark/Boost33Mark.tsx"],"sourcesContent":["import { useId, type ElementType } from 'react'\nimport styles from './Boost33Mark.module.css'\n\n/**\n * The size the mark renders at unless a caller says otherwise. 24px is the\n * Wallet's own default at both of its call sites, and it is the size\n * tests/baselines/mark-boost33.png, wordmark.png and wordmark-rail.png were\n * captured at.\n */\nconst DEFAULT_SIZE = 24\n\n/**\n * The smallest size the artwork survives, in px. Recorded, not enforced — the\n * charte's brand guide warns the monogram stops working below about 20px: the\n * bowls of the B and the hole in the o close up and the whole thing reads as a\n * dark blob. Anything smaller needs a simplified variant from the parent, not\n * this scaled down. Nothing in this package ships below it.\n *\n * This floor is the **monogram's alone**. The product marks have the opposite\n * requirement — they are drawn on a grid chosen so one path renders correctly\n * from 96px down to 20px — so do not generalise this number into a shared rule\n * when the second mark lands.\n */\nexport const BOOST33_MARK_MIN_LEGIBLE_PX = 20\n\ninterface Boost33MarkBaseProps {\n /**\n * Rendered width and height in px. Read BOOST33_MARK_MIN_LEGIBLE_PX before\n * going small.\n */\n size?: number\n /** Escape hatch for a consumer that needs to position the mark. */\n className?: string\n}\n\n/** The mark as artwork alone -- the default, and the only form inside a `Wordmark`. */\ninterface Boost33MarkStaticProps extends Boost33MarkBaseProps {\n /**\n * An accessible name. Omit it — the default — and the mark is decorative:\n * `aria-hidden`, contributing nothing to the accessibility tree. That is the\n * right answer in the lockup, where the word \"Boost33\" sits beside it and a\n * name here would only make a screen reader say it twice. Pass one only where\n * the mark stands alone as the sole carrier of meaning.\n */\n title?: string\n hubHref?: undefined\n linkComponent?: undefined\n}\n\n/**\n * The mark standing alone as the way home (B33-1699). **`title` is required\n * here**, because a link whose only content is decorative artwork has no\n * accessible name and a screen reader announces it as a bare \"link\". The\n * consumer writes the name in its own language; this package hardcodes no\n * user-facing English.\n *\n * Inside a `Wordmark`, link the `Wordmark` instead and pass the mark unlinked:\n * a linked mark in a linked lockup nests one anchor inside another.\n */\ninterface Boost33MarkLinkedProps extends Boost33MarkBaseProps {\n /** The link's accessible name, e.g. \"Boost33 home\". */\n title: string\n /**\n * Where the hub lives. The consumer supplies it; the package never hardcodes\n * it -- Identity owns where the hub is, and it differs per environment.\n */\n hubHref: string\n /**\n * The element the link renders through. Defaults to a plain `a`; a consumer\n * whose router owns navigation passes its own (ADR-0011, B33-847). Receives\n * `href` and `className` unchanged.\n */\n linkComponent?: ElementType\n}\n\nexport type Boost33MarkProps = Boost33MarkStaticProps | Boost33MarkLinkedProps\n\n/**\n * The Boost33 mark — the \"Bo\" squircle monogram.\n *\n * **This artwork is not ours.** The monogram and the wordmark are set by the\n * Boost33 charte graphique and a product cannot change them; the parent's brand\n * documentation lists the monogram as \"black tile, orange letterform\" under what\n * it owns. The paths below are lifted verbatim out of the official lockup at\n * `docs/brand/logo-of-noir-orange.svg` in the Wallet repo (`boostledger`), by way\n * of its `src/ui/primitives/icons.tsx` — reproduced, not redrawn. If the mark\n * ever changes, it changes in that SVG first and this is re-extracted from it.\n * Nobody here gets to nudge a curve.\n *\n * What stood in for it in this package until B33-556 was a Stage A placeholder in\n * the specimen: an orange tile with a `<text>B</text>` typed on top. The Wallet\n * carried the same mistake — tile and letterform the wrong way round — until\n * 9 Sep 2026, which is why the original fidelity baselines showed it too. It had\n * been wrong against the charte the whole time, not just against Paper.\n *\n * How it is built, since the fills are not obvious from the path list: the first\n * path is the black squircle with the B, the o and the underscore knocked out of\n * it as counter-wound subpaths, so those three show through as white. The orange\n * ring is then drawn into the o, and the last three paths fill the B's two bowls\n * and the o's centre back to black. **Order matters between the ring and the\n * centre** — swap them and the o fills solid orange. Nothing else overlaps.\n *\n * The two `fill: none` paths in the source SVG are omitted. They are export\n * artefacts that render nothing, and dropping them does not affect the winding of\n * the path above them.\n *\n * The viewBox is the monogram's own bounding box **inside the lockup**, which is\n * why it is an offset rectangle rather than starting at the origin. Do not \"tidy\"\n * it to `0 0 …` without re-deriving the paths; they carry absolute coordinates\n * and translating one without the other silently crops the mark.\n */\nexport function Boost33Mark({ size = DEFAULT_SIZE, title, className, hubHref, linkComponent }: Boost33MarkProps) {\n const titleId = useId()\n const decorative = title == null\n\n const svg = (\n <svg\n className={className != null ? `${styles.mark} ${className}` : styles.mark}\n width={size}\n height={size}\n viewBox=\"402.17 34.21 234.9 235\"\n role={decorative ? undefined : 'img'}\n aria-hidden={decorative ? 'true' : undefined}\n aria-labelledby={decorative ? undefined : titleId}\n >\n {!decorative && <title id={titleId}>{title}</title>}\n {/* Tile, with the B / o / underscore knocked out of it. */}\n <path\n className={styles.tile}\n d=\"M404.19,97c3.79-36.53,38.18-62.45,74.88-62.79q40-.37,80,0c43.66.4,77.69,34.58,78,78.28q.27,38.63,0,77.27c-.35,45.47-34.21,79.19-79.71,79.45q-38.62.23-77.24,0c-43.46-.34-77.66-34.79-77.95-78.34-.09-13,0-26.07,0-39.1m42.93-56V207c23.4,0,46.31.89,69.1-.33,14.41-.77,25.11-13.75,26.36-28.3,1.37-16-6.92-26.34-20.61-33.54,1.15-2.88,2.34-5.37,3.16-8C529,118.35,517,97.73,497.72,96,480.55,94.49,463.15,95.7,445.11,95.7Zm127.65,63.44a31.89,31.89,0,1,0-31.21-32.47A31.87,31.87,0,0,0,572.76,159.14ZM597.12,183V168.11H550.05V183Z\"\n />\n {/* The o, and the only orange in the mark. */}\n <path\n className={styles.ring}\n d=\"M572.76,159.14a31.89,31.89,0,1,1,32.47-31.31A31.62,31.62,0,0,1,572.76,159.14Zm.56-47.42a15.53,15.53,0,1,0,15.61,16A15.44,15.44,0,0,0,573.32,111.72Z\"\n />\n {/* The B's two bowls and the o's centre, returned to the tile's black. */}\n <path\n className={styles.tile}\n d=\"M460.7,190.94V160.11c17.05,0,33.68-.53,50.25.23,8.11.37,13.22,7.7,13,15.5s-5.75,14.69-13.73,14.94C493.9,191.3,477.58,190.94,460.7,190.94Z\"\n />\n <path\n className={styles.tile}\n d=\"M460.65,142.62V112.36c12.1,0,24.4-.89,36.5.33,7.46.76,11.4,7.3,11.05,15-.37,8.1-5,14-12.95,14.64C484,143.3,472.52,142.62,460.65,142.62Z\"\n />\n <path\n className={styles.tile}\n d=\"M573.32,111.72a15.53,15.53,0,1,1,0,31.06,15.53,15.53,0,1,1,0-31.06Z\"\n />\n </svg>\n )\n\n if (hubHref) {\n // The link wraps the artwork and takes its name from the svg's <title>, so\n // the mark's own accessibility handling is unchanged inside it.\n const Link = linkComponent ?? 'a'\n return (\n <Link className={styles.link} href={hubHref}>\n {svg}\n </Link>\n )\n }\n\n return svg\n}\n"],"names":["DEFAULT_SIZE","BOOST33_MARK_MIN_LEGIBLE_PX","Boost33Mark","size","title","className","hubHref","linkComponent","titleId","useId","decorative","svg","jsxs","styles","jsx"],"mappings":";;;AASA,MAAMA,IAAe,IAcRC,IAA8B;AAwFpC,SAASC,EAAY,EAAE,MAAAC,IAAOH,GAAc,OAAAI,GAAO,WAAAC,GAAW,SAAAC,GAAS,eAAAC,KAAmC;AAC/G,QAAMC,IAAUC,EAAA,GACVC,IAAaN,KAAS,MAEtBO,IACJ,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWP,KAAa,OAAO,GAAGQ,EAAO,IAAI,IAAIR,CAAS,KAAKQ,EAAO;AAAA,MACtE,OAAOV;AAAA,MACP,QAAQA;AAAA,MACR,SAAQ;AAAA,MACR,MAAMO,IAAa,SAAY;AAAA,MAC/B,eAAaA,IAAa,SAAS;AAAA,MACnC,mBAAiBA,IAAa,SAAYF;AAAA,MAEzC,UAAA;AAAA,QAAA,CAACE,KAAc,gBAAAI,EAAC,SAAA,EAAM,IAAIN,GAAU,UAAAJ,GAAM;AAAA,QAE3C,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJ,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJ,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,QAEJ,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,QAEJ,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EAAA;AAIJ,SAAIP,sBAGWC,KAAiB,KAE3B,EAAK,WAAWM,EAAO,MAAM,MAAMP,GACjC,UAAAK,GACH,IAIGA;AACT;"}
@@ -1,12 +1,14 @@
1
- const r = "_tile_5vhrh_12", t = "_ring_5vhrh_16", _ = "_mark_5vhrh_24", n = {
2
- tile: r,
3
- ring: t,
4
- mark: _
1
+ const _ = "_tile_w89ja_12", n = "_ring_w89ja_16", t = "_mark_w89ja_24", a = "_link_w89ja_33", i = {
2
+ tile: _,
3
+ ring: n,
4
+ mark: t,
5
+ link: a
5
6
  };
6
7
  export {
7
- n as default,
8
- _ as mark,
9
- t as ring,
10
- r as tile
8
+ i as default,
9
+ a as link,
10
+ t as mark,
11
+ n as ring,
12
+ _ as tile
11
13
  };
12
14
  //# sourceMappingURL=Boost33Mark.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Boost33Mark.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
1
+ {"version":3,"file":"Boost33Mark.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,12 +1,39 @@
1
- import { ReactNode } from 'react';
1
+ import { ElementType, ReactNode } from 'react';
2
2
  export interface WordmarkProps {
3
3
  /**
4
4
  * The Boost33 mark -- the logo artwork, owned by its own ticket. Passed in
5
5
  * rather than hardcoded here so the wordmark does not carry a second copy of
6
6
  * the mark. On the rail it is all that shows.
7
+ *
8
+ * **Pass it unlinked.** With `hubHref` set the whole lockup is already the
9
+ * link; a `Boost33Mark` given its own `hubHref` here would nest one anchor
10
+ * inside another, which is invalid HTML and two tab stops for one place.
7
11
  */
8
12
  mark?: ReactNode;
9
13
  /** Sidebar-on-the-rail state. Hides the "Boost33" name; the mark stays. */
10
14
  collapsed?: boolean;
15
+ /**
16
+ * Where the hub lives. Set it and the whole lockup -- mark and name, or the
17
+ * mark alone on the rail -- renders as a link there; omit it and the lockup
18
+ * renders exactly as it did before, a plain `div` (B33-1699).
19
+ *
20
+ * **The consumer supplies the URL; the package never does.** Identity owns
21
+ * where the hub lives, and the estate already resolves it per environment
22
+ * (Score from a validated env var, Voice from a zod-defaulted one), so a
23
+ * literal here would point every staging build at production.
24
+ *
25
+ * The link's accessible name is the "Boost33" name, which stays in the
26
+ * accessibility tree on the rail as well, so the rail's mark-only link is
27
+ * still named.
28
+ */
29
+ hubHref?: string;
30
+ /**
31
+ * The element the linked lockup renders through. Defaults to a plain `a`; a
32
+ * consumer whose router owns navigation passes its own so a same-app hub
33
+ * routes client-side with the locale prefix intact (ADR-0011, B33-847).
34
+ * Receives `href`, `className` and the `data-collapsed` attribute unchanged.
35
+ * Only used when `hubHref` is set.
36
+ */
37
+ linkComponent?: ElementType;
11
38
  }
12
- export declare function Wordmark({ mark, collapsed }: WordmarkProps): import("react").JSX.Element;
39
+ export declare function Wordmark({ mark, collapsed, hubHref, linkComponent }: WordmarkProps): import("react").JSX.Element;
@@ -1,12 +1,13 @@
1
- import { jsxs as l, jsx as s } from "react/jsx-runtime";
2
- import a from "./Wordmark.module.css.js";
3
- function n({ mark: r, collapsed: e = !1 }) {
4
- return /* @__PURE__ */ l("div", { className: a.wordmark, "data-collapsed": e ? "true" : void 0, children: [
5
- r != null && /* @__PURE__ */ s("span", { className: a.mark, "aria-hidden": "true", children: r }),
6
- /* @__PURE__ */ s("span", { className: a.name, children: "Boost33" })
7
- ] });
1
+ import { jsx as a, jsxs as d, Fragment as c } from "react/jsx-runtime";
2
+ import r from "./Wordmark.module.css.js";
3
+ function h({ mark: e, collapsed: o = !1, hubHref: s, linkComponent: t }) {
4
+ const n = /* @__PURE__ */ d(c, { children: [
5
+ e != null && /* @__PURE__ */ a("span", { className: r.mark, "aria-hidden": "true", children: e }),
6
+ /* @__PURE__ */ a("span", { className: r.name, children: "Boost33" })
7
+ ] }), l = o ? "true" : void 0;
8
+ return s ? /* @__PURE__ */ a(t ?? "a", { className: r.wordmark, href: s, "data-collapsed": l, children: n }) : /* @__PURE__ */ a("div", { className: r.wordmark, "data-collapsed": l, children: n });
8
9
  }
9
10
  export {
10
- n as Wordmark
11
+ h as Wordmark
11
12
  };
12
13
  //# sourceMappingURL=Wordmark.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Wordmark.js","sources":["../../../src/components/Wordmark/Wordmark.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport styles from './Wordmark.module.css'\n\nexport interface WordmarkProps {\n /**\n * The Boost33 mark -- the logo artwork, owned by its own ticket. Passed in\n * rather than hardcoded here so the wordmark does not carry a second copy of\n * the mark. On the rail it is all that shows.\n */\n mark?: ReactNode\n /** Sidebar-on-the-rail state. Hides the \"Boost33\" name; the mark stays. */\n collapsed?: boolean\n}\n\n// The lockup at the top of the sidebar: the Boost33 mark and the \"Boost33\"\n// name beside it. On the rail the name drops to the accessibility tree and the\n// mark stands alone.\nexport function Wordmark({ mark, collapsed = false }: WordmarkProps) {\n return (\n <div className={styles.wordmark} data-collapsed={collapsed ? 'true' : undefined}>\n {mark != null && (\n <span className={styles.mark} aria-hidden=\"true\">\n {mark}\n </span>\n )}\n <span className={styles.name}>Boost33</span>\n </div>\n )\n}\n"],"names":["Wordmark","mark","collapsed","jsxs","styles","jsx"],"mappings":";;AAiBO,SAASA,EAAS,EAAE,MAAAC,GAAM,WAAAC,IAAY,MAAwB;AACnE,SACE,gBAAAC,EAAC,SAAI,WAAWC,EAAO,UAAU,kBAAgBF,IAAY,SAAS,QACnE,UAAA;AAAA,IAAAD,KAAQ,0BACN,QAAA,EAAK,WAAWG,EAAO,MAAM,eAAY,QACvC,UAAAH,EAAA,CACH;AAAA,IAEF,gBAAAI,EAAC,QAAA,EAAK,WAAWD,EAAO,MAAM,UAAA,UAAA,CAAO;AAAA,EAAA,GACvC;AAEJ;"}
1
+ {"version":3,"file":"Wordmark.js","sources":["../../../src/components/Wordmark/Wordmark.tsx"],"sourcesContent":["import type { ElementType, ReactNode } from 'react'\nimport styles from './Wordmark.module.css'\n\nexport interface WordmarkProps {\n /**\n * The Boost33 mark -- the logo artwork, owned by its own ticket. Passed in\n * rather than hardcoded here so the wordmark does not carry a second copy of\n * the mark. On the rail it is all that shows.\n *\n * **Pass it unlinked.** With `hubHref` set the whole lockup is already the\n * link; a `Boost33Mark` given its own `hubHref` here would nest one anchor\n * inside another, which is invalid HTML and two tab stops for one place.\n */\n mark?: ReactNode\n /** Sidebar-on-the-rail state. Hides the \"Boost33\" name; the mark stays. */\n collapsed?: boolean\n /**\n * Where the hub lives. Set it and the whole lockup -- mark and name, or the\n * mark alone on the rail -- renders as a link there; omit it and the lockup\n * renders exactly as it did before, a plain `div` (B33-1699).\n *\n * **The consumer supplies the URL; the package never does.** Identity owns\n * where the hub lives, and the estate already resolves it per environment\n * (Score from a validated env var, Voice from a zod-defaulted one), so a\n * literal here would point every staging build at production.\n *\n * The link's accessible name is the \"Boost33\" name, which stays in the\n * accessibility tree on the rail as well, so the rail's mark-only link is\n * still named.\n */\n hubHref?: string\n /**\n * The element the linked lockup renders through. Defaults to a plain `a`; a\n * consumer whose router owns navigation passes its own so a same-app hub\n * routes client-side with the locale prefix intact (ADR-0011, B33-847).\n * Receives `href`, `className` and the `data-collapsed` attribute unchanged.\n * Only used when `hubHref` is set.\n */\n linkComponent?: ElementType\n}\n\n// The lockup at the top of the sidebar: the Boost33 mark and the \"Boost33\"\n// name beside it. On the rail the name drops to the accessibility tree and the\n// mark stands alone.\n//\n// With `hubHref` it is also the way home. Before B33-1699 the trip back to the\n// hub existed only as a row inside the switcher's panel, and a founder testing\n// as a new user could not find it (\"I don't see the button\"). The lockup in the\n// top-left corner is where people look for that link, so the lockup becomes it.\n// The linked and unlinked forms draw the same pixels; only focus differs.\nexport function Wordmark({ mark, collapsed = false, hubHref, linkComponent }: WordmarkProps) {\n const content = (\n <>\n {mark != null && (\n <span className={styles.mark} aria-hidden=\"true\">\n {mark}\n </span>\n )}\n <span className={styles.name}>Boost33</span>\n </>\n )\n const dataCollapsed = collapsed ? 'true' : undefined\n\n if (hubHref) {\n const Link = linkComponent ?? 'a'\n return (\n <Link className={styles.wordmark} href={hubHref} data-collapsed={dataCollapsed}>\n {content}\n </Link>\n )\n }\n\n return (\n <div className={styles.wordmark} data-collapsed={dataCollapsed}>\n {content}\n </div>\n )\n}\n"],"names":["Wordmark","mark","collapsed","hubHref","linkComponent","content","jsxs","Fragment","styles","jsx","dataCollapsed"],"mappings":";;AAkDO,SAASA,EAAS,EAAE,MAAAC,GAAM,WAAAC,IAAY,IAAO,SAAAC,GAAS,eAAAC,KAAgC;AAC3F,QAAMC,IACJ,gBAAAC,EAAAC,GAAA,EACG,UAAA;AAAA,IAAAN,KAAQ,0BACN,QAAA,EAAK,WAAWO,EAAO,MAAM,eAAY,QACvC,UAAAP,EAAA,CACH;AAAA,IAEF,gBAAAQ,EAAC,QAAA,EAAK,WAAWD,EAAO,MAAM,UAAA,UAAA,CAAO;AAAA,EAAA,GACvC,GAEIE,IAAgBR,IAAY,SAAS;AAE3C,SAAIC,IAGA,gBAAAM,EAFWL,KAAiB,OAEtB,WAAWI,EAAO,UAAU,MAAML,GAAS,kBAAgBO,GAC9D,UAAAL,EAAA,CACH,sBAKD,OAAA,EAAI,WAAWG,EAAO,UAAU,kBAAgBE,GAC9C,UAAAL,GACH;AAEJ;"}
@@ -1,12 +1,12 @@
1
- const r = "_wordmark_1k88r_4", a = "_mark_1k88r_17", k = "_name_1k88r_35", m = {
2
- wordmark: r,
3
- mark: a,
4
- name: k
1
+ const a = "_wordmark_ccf4z_4", c = "_mark_ccf4z_32", r = "_name_ccf4z_50", m = {
2
+ wordmark: a,
3
+ mark: c,
4
+ name: r
5
5
  };
6
6
  export {
7
7
  m as default,
8
- a as mark,
9
- k as name,
10
- r as wordmark
8
+ c as mark,
9
+ r as name,
10
+ a as wordmark
11
11
  };
12
12
  //# sourceMappingURL=Wordmark.module.css.js.map
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .btn-primary,.btn-quiet,.btn-danger{cursor:pointer;transition:background-color var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),transform var(--dur-instant) var(--ease-out)}.btn-primary{border:none;background:var(--color-primary);color:var(--color-primary-foreground)}.btn-primary:hover:not(:disabled){background:var(--color-primary-hover)}.btn-quiet{background:transparent;color:var(--color-foreground-secondary)}.btn-quiet:hover:not(:disabled){background:var(--color-surface-muted)}.btn-danger{border:1px solid var(--color-danger);background:var(--color-danger);color:var(--color-neutral-0)}.btn-danger:hover:not(:disabled){border-color:color-mix(in srgb,var(--color-danger) 85%,var(--color-neutral-950));background:color-mix(in srgb,var(--color-danger) 85%,var(--color-neutral-950))}.btn-primary:disabled,.btn-quiet:disabled,.btn-danger:disabled{opacity:.55;cursor:not-allowed}.spinner{box-sizing:border-box;width:var(--spacing-4_5);height:var(--spacing-4_5);border:2px solid var(--color-neutral-0);border-right-color:transparent;border-radius:var(--radius-full);animation:boost33-spin var(--dur-spin) linear infinite}.spinner--sm{width:var(--spacing-3_5);height:var(--spacing-3_5)}.spinner--primary{border-color:var(--color-primary);border-right-color:transparent}@keyframes boost33-spin{to{transform:rotate(360deg)}}.sk{display:block;border-radius:var(--radius-md);background:var(--color-surface-muted);animation:boost33-pulse var(--dur-pulse) ease-in-out infinite}.sk-group{animation:boost33-appear var(--dur-base) var(--ease-out) var(--dur-fast) both}.reveal{animation:boost33-appear var(--dur-base) var(--ease-out) both}@keyframes boost33-pulse{50%{opacity:.55}}@keyframes boost33-appear{0%{opacity:0}}@media(prefers-reduced-motion:no-preference){.btn-primary:active:not(:disabled),.btn-quiet:active:not(:disabled),.btn-danger:active:not(:disabled){transform:scale(.98)}}@media(prefers-reduced-motion:reduce){.sk,.sk-group,.reveal,.spinner{animation:none}*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:0s!important;scroll-behavior:auto!important}}._sidebar_17kel_7{display:flex;flex-direction:column;box-sizing:border-box;width:var(--container-sidebar);height:100%;padding-inline:var(--spacing-3);border-right:1px solid var(--color-border);background:var(--color-background);font-family:var(--font-sans)}._sidebar_17kel_7[data-collapsed=true]{width:var(--container-sidebar-rail)}._sidebar_17kel_7>nav{flex-shrink:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;margin:calc(-1 * var(--spacing-1));padding:var(--spacing-1);scroll-padding:var(--spacing-1)}@media(prefers-reduced-motion:reduce){._sidebar_17kel_7>nav{scroll-behavior:auto}}._section_3sxsg_5{display:flex;flex-direction:column}._header_3sxsg_13{margin:0;padding:var(--spacing-2) var(--spacing-2_5);color:var(--color-foreground-muted);font-family:var(--font-sans);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-caps);text-transform:uppercase}._wordmark_1k88r_4{display:flex;align-items:center;gap:var(--spacing-2_5);font-family:var(--font-display)}._mark_1k88r_17{display:inline-flex;flex:0 0 var(--spacing-6);align-items:center;justify-content:center;width:var(--spacing-6);height:var(--spacing-6)}._mark_1k88r_17 svg{width:100%;height:100%}._name_1k88r_35{color:var(--color-foreground);font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-tight)}._wordmark_1k88r_4[data-collapsed=true] ._name_1k88r_35{position:absolute;overflow:hidden;clip-path:inset(50%);width:1px;height:1px;white-space:nowrap}._wordmark_1k88r_4[data-collapsed=true]{justify-content:center}._tile_5vhrh_12{fill:var(--color-neutral-950)}._ring_5vhrh_16{fill:var(--color-primary)}._mark_5vhrh_24{display:block}._mark_1jt5g_6{display:block}._ground_1jt5g_17{rx:var(--radius-product-tile)}._row_w21mf_4{display:flex;align-items:center;width:100%;gap:var(--spacing-2_5);padding:var(--spacing-2) var(--spacing-2_5);border:none;border-radius:var(--radius-lg);background:transparent;font-family:var(--font-sans);text-align:left;text-decoration:none;cursor:pointer;transition:background-color var(--dur-fast) var(--ease-out)}._row_w21mf_4:hover{background:var(--color-surface-muted)}._row_w21mf_4[data-active=true]{background:var(--color-surface)}._row_w21mf_4:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._icon_w21mf_41{display:inline-flex;flex:0 0 var(--spacing-4);align-items:center;justify-content:center;width:var(--spacing-4);height:var(--spacing-4);color:var(--color-foreground-secondary)}._icon_w21mf_41 svg{width:100%;height:100%}._row_w21mf_4[data-active=true] ._icon_w21mf_41{color:var(--color-foreground)}._row_w21mf_4[data-collapsed=true]{justify-content:center}._label_w21mf_66{flex:1 1 auto;min-width:0;overflow:hidden;color:var(--color-foreground-secondary);font-size:var(--text-nav-label);font-weight:var(--font-weight-regular);text-overflow:ellipsis;white-space:nowrap}._row_w21mf_4[data-active=true] ._label_w21mf_66{color:var(--color-foreground);font-weight:var(--font-weight-semibold)}._row_w21mf_4[data-collapsed=true] ._label_w21mf_66{position:absolute;overflow:hidden;clip-path:inset(50%);width:1px;height:1px;white-space:nowrap}._trailingSlot_w21mf_92{display:flex;flex:0 0 var(--spacing-5_5);align-items:center;justify-content:center;width:var(--spacing-5_5);font-family:var(--font-sans);font-size:var(--text-nav-label)}._row_w21mf_4[data-collapsed=true] ._trailingSlot_w21mf_92{display:none}._count_w21mf_106{color:var(--color-foreground-muted)}._countUrgent_w21mf_110{color:var(--color-primary)}@media(prefers-reduced-motion:reduce){._row_w21mf_4{transition:none}}._chip_xxga2_37{--chip-lift: 0px;position:relative;box-sizing:border-box;width:100%;padding:calc(var(--spacing-3) + var(--chip-lift));border:1px solid var(--color-border);border-radius:var(--radius-2xl);background:transparent;font-family:var(--font-sans)}._chip_xxga2_37:not([data-unknown]):hover,._chip_xxga2_37:not([data-unknown]):focus-within,._chip_xxga2_37[data-threshold]{--chip-lift: var(--spacing-0_5);box-shadow:var(--shadow-overlay)}._chip_xxga2_37:not([data-threshold]):not([data-unknown]):hover,._chip_xxga2_37:not([data-threshold]):not([data-unknown]):focus-within{background:var(--color-surface)}._chip_xxga2_37:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._header_xxga2_74{display:flex;align-items:center;gap:var(--spacing-2)}._chip_xxga2_37:not([data-threshold]):not([data-unknown]) ._header_xxga2_74{padding-right:var(--spacing-topup-reserve)}._name_xxga2_83{min-width:0;overflow:hidden;color:var(--color-foreground-muted);font-size:var(--text-xs);font-weight:var(--font-weight-medium);line-height:var(--leading-tight);text-overflow:ellipsis;white-space:nowrap}._pill_xxga2_162{padding:var(--spacing-0_5) var(--spacing-2);border-radius:var(--radius-full);background:var(--color-warning-subtle);color:var(--color-warning);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold)}._figure_xxga2_171{display:flex;align-items:baseline;gap:var(--spacing-1_5);margin-top:calc(var(--spacing-2_5) + var(--chip-lift))}._amount_xxga2_186{color:var(--color-foreground);font-family:var(--font-mono);font-size:var(--text-2xl);font-weight:var(--font-weight-bold);letter-spacing:var(--tracking-tight);line-height:var(--leading-none)}._unit_xxga2_195{color:var(--color-foreground-muted);font-size:var(--text-xs)}._retry_xxga2_200{width:var(--spacing-3);height:var(--spacing-3);color:var(--color-foreground-muted)}._bar_xxga2_209{display:flex;overflow:hidden;width:100%;height:calc(var(--spacing-1_25) + var(--chip-lift));margin-top:calc(var(--spacing-2_5) + var(--chip-lift));border-radius:var(--radius-full)}._bar_xxga2_209[data-tone=rest]{background:var(--color-surface-muted)}._bar_xxga2_209[data-tone=threshold]{background:var(--color-warning-subtle)}._bar_xxga2_209[data-tone=unknown]{background:var(--color-surface-muted)}._segmentGranted_xxga2_230,._segmentPurchased_xxga2_231{height:100%;transition:width var(--dur-fast) var(--ease-out)}._segmentGranted_xxga2_230{background:var(--color-grant)}._segmentPurchased_xxga2_231{background:var(--color-purchased)}._details_xxga2_275{display:none}._chip_xxga2_37:hover ._details_xxga2_275,._chip_xxga2_37:focus-within ._details_xxga2_275{display:block}._split_xxga2_284{display:flex;flex-direction:column;gap:var(--spacing-1);margin:var(--spacing-2_5) 0 0}._splitRow_xxga2_291{display:flex;align-items:center;justify-content:space-between}._splitLabel_xxga2_297{display:flex;align-items:center;gap:var(--spacing-1_5);color:var(--color-foreground);font-size:var(--text-xs)}._splitAmount_xxga2_305{margin:0;color:var(--color-foreground);font-family:var(--font-mono);font-size:var(--text-xs);font-variant-numeric:tabular-nums}._dotGranted_xxga2_313,._dotPurchased_xxga2_314{width:var(--spacing-1_5);height:var(--spacing-1_5);border-radius:var(--radius-full)}._dotGranted_xxga2_313{background:var(--color-grant)}._dotPurchased_xxga2_314{background:var(--color-purchased)}._footer_xxga2_328{margin:var(--spacing-3) 0 0;padding-top:var(--spacing-1);border-top:1px solid var(--color-border);color:var(--color-foreground-muted);font-size:var(--text-2xs)}._burnNote_xxga2_336{margin:var(--spacing-2_5) 0 0;color:var(--color-foreground-secondary);font-size:var(--text-2xs);line-height:var(--leading-snug)}._topUp_xxga2_87{position:absolute;top:calc(var(--spacing-3) + var(--chip-lift));right:calc(var(--spacing-3) + var(--chip-lift));padding:0;border:none;background:transparent;color:var(--color-primary);font-family:var(--font-sans);font-size:var(--text-xs);font-weight:var(--font-weight-semibold);opacity:0;cursor:pointer;transition:opacity var(--dur-fast) var(--ease-out)}._chip_xxga2_37:hover ._topUp_xxga2_87,._chip_xxga2_37:focus-within ._topUp_xxga2_87,._topUp_xxga2_87:focus-visible{opacity:1}._topUp_xxga2_87:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._topUp_xxga2_87[data-grown=true]{position:static;width:100%;margin-top:var(--spacing-2_5);padding:var(--spacing-2);border-radius:var(--radius-lg);background:var(--color-primary);color:var(--color-primary-foreground);font-size:var(--text-sm);opacity:1}._topUp_xxga2_87[data-grown=true]:hover{background:var(--color-primary-hover)}._rail_xxga2_402{--chip-lift: 0px;position:relative;display:flex;box-sizing:border-box;width:100%;flex-direction:column;align-items:center;gap:var(--spacing-2);padding:var(--spacing-2);font-family:var(--font-sans)}._railIcon_xxga2_416{width:var(--spacing-6);height:var(--spacing-6);color:var(--color-foreground-secondary)}._railFigure_xxga2_422{color:var(--color-foreground);font-family:var(--font-mono);font-size:var(--text-sm);font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}._rail_xxga2_402 ._bar_xxga2_209{height:var(--spacing-0_5);margin-top:0}._srOnly_xxga2_435{position:absolute;overflow:hidden;clip-path:inset(50%);width:1px;height:1px;white-space:nowrap}@media(prefers-reduced-motion:reduce){._segmentGranted_xxga2_230,._segmentPurchased_xxga2_231,._topUp_xxga2_87{transition:none}}._bar_194bx_7{display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-4);box-sizing:border-box;height:var(--spacing-12);padding:0 var(--spacing-8);border-bottom:1px solid var(--color-border);background:var(--color-surface);font-family:var(--font-sans)}._breadcrumb_194bx_20{display:flex;min-width:0;align-items:center;gap:var(--spacing-2);overflow:hidden;color:var(--color-foreground);font-size:var(--text-sm);font-weight:var(--font-weight-medium);text-overflow:ellipsis;white-space:nowrap}._actions_194bx_33{display:flex;flex:0 0 auto;align-items:center;gap:var(--spacing-2)}@supports (animation-timeline: --a) and (timeline-scope: --a){@container style(--boost33-shell-timeline: on){._bar_194bx_7{position:relative;z-index:1;animation:_scrolled_194bx_1 linear both;animation-timeline:--boost33-shell-scroll;animation-range:0 var(--spacing-10)}}}@keyframes _scrolled_194bx_1{to{box-shadow:var(--shadow-scrolled)}}._header_i17td_42{display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-8);padding:var(--spacing-4_5) var(--spacing-8) var(--spacing-4);background:var(--color-surface);font-family:var(--font-sans)}._headings_i17td_52{display:flex;min-width:0;flex-direction:column;gap:var(--spacing-1)}._title_i17td_33{margin:0;color:var(--color-foreground);font-family:var(--font-display);font-size:var(--text-2xl);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-tight);line-height:var(--leading-tight)}._subtitle_i17td_74{margin:0;color:var(--color-foreground-secondary);font-size:var(--text-base);font-weight:var(--font-weight-regular);line-height:var(--leading-snug)}._actions_i17td_82{display:flex;flex:0 0 auto;align-items:center;gap:var(--spacing-2)}._shell_10chf_10{display:flex;height:100%;background:var(--color-surface);font-family:var(--font-sans)}._wordmark_10chf_20{padding:var(--spacing-3) var(--spacing-2_5) var(--spacing-5)}._switcher_10chf_26{padding-bottom:var(--spacing-4)}._foot_10chf_33{display:flex;flex-direction:column;gap:var(--spacing-4);margin-block-start:auto;padding-block-start:var(--spacing-4)}._nav_10chf_45{display:flex;flex-direction:column;gap:var(--spacing-4)}._main_10chf_54{display:flex;min-width:0;flex:1;flex-direction:column}._content_10chf_75{flex:1;min-height:0;overflow-y:auto;background:var(--color-surface)}@supports (animation-timeline: --a) and (timeline-scope: --a){._main_10chf_54{timeline-scope:--boost33-shell-scroll;--boost33-shell-timeline: on}._content_10chf_75{scroll-timeline:--boost33-shell-scroll block}}._root_15f7d_8{position:relative;font-family:var(--font-sans)}._trigger_15f7d_17{display:flex;box-sizing:border-box;width:100%;align-items:center;gap:var(--spacing-2);padding:var(--spacing-2_25) var(--spacing-2);border:1px solid var(--color-border-strong);border-radius:var(--radius-lg);background:transparent;font-family:var(--font-sans);cursor:pointer}._trigger_15f7d_17[aria-expanded=true]{background:var(--color-surface-muted)}._trigger_15f7d_17:focus-visible,._railTrigger_15f7d_46:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._triggerName_15f7d_56{overflow:hidden;flex:1;color:var(--color-foreground);font-size:var(--text-nav-label);font-weight:var(--font-weight-semibold);text-align:left;text-overflow:ellipsis;white-space:nowrap}._chevron_15f7d_67{width:var(--spacing-3);height:var(--spacing-3);flex-shrink:0;color:var(--color-foreground-muted);transition:transform var(--dur-fast) var(--ease-out)}._trigger_15f7d_17[aria-expanded=true] ._chevron_15f7d_67{transform:rotate(180deg)}._railTrigger_15f7d_46{display:flex;box-sizing:border-box;width:100%;min-height:var(--spacing-6);align-items:flex-start;justify-content:center;padding:0;border:none;background:transparent;cursor:pointer}._panel_15f7d_109{position:absolute;z-index:1;top:100%;left:0;width:var(--container-sidebar);box-sizing:border-box;margin-top:var(--spacing-0_5);padding:var(--spacing-2);border:1px solid var(--color-border);border-radius:var(--radius-2xl);background:var(--color-surface);box-shadow:var(--shadow-overlay)}._hubRow_15f7d_135,._productRow_15f7d_136,._accountRow_15f7d_137{display:flex;box-sizing:border-box;width:100%;align-items:center;gap:var(--spacing-2_5);padding:var(--spacing-2);border:none;border-radius:var(--radius-lg);background:transparent;color:var(--color-foreground);font-family:var(--font-sans);text-align:left;text-decoration:none;cursor:pointer}._hubRow_15f7d_135:hover,._productRow_15f7d_136:hover,._accountRow_15f7d_137:hover{background:var(--color-surface-muted)}._hubRow_15f7d_135:focus-visible,._productRow_15f7d_136:focus-visible,._accountRow_15f7d_137:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}._products_15f7d_144{display:flex;flex-direction:column;gap:var(--spacing-0_5);margin:0;padding:0;list-style:none}._productRow_15f7d_136[data-current=true]{background:var(--color-surface-muted)}._productRow_15f7d_136[data-entitled=false] ._rowName_15f7d_193{color:var(--color-foreground-muted)}._accountRow_15f7d_137{padding-inline:var(--spacing-3)}._accountRow_15f7d_137 ._rowName_15f7d_193{font-size:var(--text-sm)}._accountRow_15f7d_137 ._rowSub_15f7d_213{font-size:var(--text-2xs)}._accountRow_15f7d_137[data-actionable=false]{cursor:default}._accountRow_15f7d_137[data-actionable=false]:hover{background:transparent}._rowText_15f7d_238{display:flex;min-width:0;flex-direction:column}._hubRow_15f7d_135 ._rowText_15f7d_238{gap:var(--spacing-0_5)}._rowName_15f7d_193{overflow:hidden;color:var(--color-foreground);font-size:var(--text-nav-label);font-weight:var(--font-weight-regular);text-overflow:ellipsis;white-space:nowrap}._productRow_15f7d_136 ._rowName_15f7d_193{flex:1}._rowSub_15f7d_213{overflow:hidden;color:var(--color-foreground-muted);font-size:var(--text-xs);text-overflow:ellipsis;white-space:nowrap}._hubMark_15f7d_281{width:var(--spacing-5);height:var(--spacing-5);flex-shrink:0;color:var(--color-foreground)}._tag_15f7d_297{flex-shrink:0;margin-left:auto;padding:var(--spacing-0_5) var(--spacing-1_5);border-radius:var(--radius-full);background:var(--color-surface-muted);color:var(--color-foreground-muted);font-size:var(--text-2xs);font-weight:var(--font-weight-medium)}._check_15f7d_308{width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;margin-left:auto;color:var(--color-foreground)}._avatar_15f7d_321{display:grid;width:var(--spacing-6);height:var(--spacing-6);flex-shrink:0;border-radius:var(--radius-lg);background:var(--color-surface-muted);color:var(--color-foreground-secondary);font-size:var(--text-3xs);font-weight:var(--font-weight-semibold);place-items:center}._chevronRight_15f7d_334{width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;margin-left:auto;color:var(--color-foreground-muted)}._divider_15f7d_355{margin:var(--spacing-2_25) 0 var(--spacing-2);border:none;border-top:1px solid var(--color-border)}._products_15f7d_144+._divider_15f7d_355{margin:var(--spacing-1_5) 0 var(--spacing-1)}@media(prefers-reduced-motion:reduce){._chevron_15f7d_67{transition:none}}._panel_sl837_36{display:flex;width:var(--container-notification-panel);box-sizing:border-box;flex-direction:column;overflow:hidden;border:1px solid var(--color-border);border-radius:var(--radius-2xl);background:var(--color-surface);box-shadow:var(--shadow-overlay);font-family:var(--font-sans)}._header_sl837_54{display:flex;align-items:center;justify-content:space-between;padding:var(--spacing-3_5) var(--spacing-4) var(--spacing-2_5)}._title_sl837_62{margin:0;color:var(--color-foreground);font-size:var(--text-base);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}._markAll_sl837_73{padding:0;border:none;background:transparent;color:var(--color-primary);font-family:var(--font-sans);font-size:var(--text-xs);font-weight:var(--font-weight-medium);line-height:var(--leading-snug);cursor:pointer}._markAll_sl837_73:focus-visible,._tab_sl837_86:focus-visible,._viewAll_sl837_87:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._tabs_sl837_96{display:flex;align-items:center;gap:var(--spacing-4_5);padding-inline:var(--spacing-4);border-bottom:1px solid var(--color-border)}._tab_sl837_86{display:flex;align-items:center;gap:var(--spacing-1_25);padding:var(--spacing-2) 0 var(--spacing-2_5);border:none;border-bottom:2px solid transparent;background:transparent;color:var(--color-foreground-muted);font-family:var(--font-sans);font-size:var(--text-sm);font-weight:var(--font-weight-regular);line-height:var(--leading-tight);cursor:pointer}._tab_sl837_86[aria-pressed=true]{border-bottom-color:var(--color-foreground);color:var(--color-foreground);font-weight:var(--font-weight-semibold)}._count_sl837_131{padding:var(--spacing-0_25) var(--spacing-1_25);border-radius:var(--radius-full);background:var(--color-surface-muted);color:var(--color-foreground-muted);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}._list_sl837_141{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}._row_sl837_156{display:flex;box-sizing:border-box;width:100%;align-items:flex-start;gap:var(--spacing-2_5);padding:var(--spacing-2_5) var(--spacing-4);color:var(--color-foreground);font-family:var(--font-sans);text-align:left;text-decoration:none}._row_sl837_156[href]:hover{background:var(--color-surface-muted)}._row_sl837_156[href]:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}._sourceMark_sl837_187{display:block;flex-shrink:0;margin-top:var(--spacing-0_25);color:var(--color-primary-foreground)}._sourceMarkGround_sl837_196{rx:var(--radius-product-tile);fill:var(--color-neutral-950)}._rowText_sl837_201{display:flex;min-width:0;flex:1;flex-direction:column;gap:var(--spacing-0_5)}._rowTitle_sl837_212{color:var(--color-foreground-secondary);font-size:var(--text-sm);font-weight:var(--font-weight-medium);line-height:var(--leading-snug)}._row_sl837_156[data-unread=true] ._rowTitle_sl837_212{color:var(--color-foreground)}._rowMeta_sl837_223{color:var(--color-foreground-muted);font-size:var(--text-xs);line-height:var(--leading-snug)}._unreadSlot_sl837_234{display:flex;width:var(--spacing-4);flex-shrink:0;justify-content:center;padding-top:var(--spacing-1)}._dot_sl837_243{width:var(--spacing-1_5);height:var(--spacing-1_5);flex-shrink:0;border-radius:var(--radius-full);background:var(--color-primary)}._empty_sl837_258{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--spacing-2_5);padding:var(--spacing-10) var(--spacing-6) var(--spacing-11)}._emptyGlyph_sl837_267{display:block;width:var(--spacing-7);height:var(--spacing-7);flex-shrink:0;color:var(--color-foreground-disabled)}._emptyText_sl837_275{display:flex;flex-direction:column;align-items:center;gap:var(--spacing-0_5)}._emptyTitle_sl837_282{margin:0;color:var(--color-foreground-secondary);font-size:var(--text-sm);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}._emptyBody_sl837_290{margin:0;color:var(--color-foreground-muted);font-size:var(--text-xs);line-height:var(--leading-snug);text-align:center}._footer_sl837_299{display:flex;align-items:center;justify-content:center;padding:var(--spacing-2_5) var(--spacing-4);border-top:1px solid var(--color-border)}._viewAll_sl837_87{color:var(--color-foreground-secondary);font-size:var(--text-xs);font-weight:var(--font-weight-medium);line-height:var(--leading-snug);text-decoration:none}._viewAll_sl837_87:hover{text-decoration:underline}._srOnly_sl837_321{position:absolute;overflow:hidden;width:1px;height:1px;clip-path:inset(50%);white-space:nowrap}._panel_4usug_54{display:flex;box-sizing:border-box;width:var(--container-account-menu);flex-direction:column;padding:var(--spacing-1_5);border:1px solid var(--color-border);border-radius:var(--radius-2xl);background:var(--color-surface);box-shadow:var(--shadow-overlay);font-family:var(--font-sans)}._person_4usug_72{display:flex;align-items:center;gap:var(--spacing-3);padding:var(--spacing-3_5) var(--spacing-3)}._personAvatar_4usug_85{display:block;width:var(--spacing-9_5);height:var(--spacing-9_5);flex-shrink:0;border-radius:var(--radius-full);background:var(--color-border-strong);object-fit:cover}._personText_4usug_98{display:flex;min-width:0;flex-direction:column;gap:var(--spacing-0_5)}._personName_4usug_106{overflow:hidden;color:var(--color-foreground);font-size:var(--text-nav-label);font-weight:var(--font-weight-semibold);line-height:var(--leading-snug);text-overflow:ellipsis;white-space:nowrap}._personEmail_4usug_122{overflow:hidden;color:var(--color-foreground-muted);font-size:var(--text-xs);line-height:var(--leading-snug);text-overflow:ellipsis;white-space:nowrap}._org_4usug_147{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--spacing-1);margin-inline:var(--spacing-1_5);padding:var(--spacing-2_25) var(--spacing-3);border-radius:var(--radius-xl);background:var(--color-neutral-50)}._orgIdentity_4usug_161{display:flex;min-width:0;align-items:center;gap:var(--spacing-2_25)}._orgTile_4usug_178{display:grid;width:var(--spacing-5_5);height:var(--spacing-5_5);flex-shrink:0;border-radius:var(--radius-lg);background:var(--color-neutral-950);color:var(--color-primary-foreground);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold);place-items:center}._orgName_4usug_194{overflow:hidden;color:var(--color-foreground);font-size:var(--text-sm);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight);text-overflow:ellipsis;white-space:nowrap}._orgRole_4usug_209{flex-shrink:0;padding:var(--spacing-0_5) var(--spacing-2);border-radius:var(--radius-full);background:var(--color-neutral-950);color:var(--color-primary-foreground);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight);white-space:nowrap}._divider_4usug_143{margin:var(--spacing-1_5);border:none;border-top:1px solid var(--color-border)}._rows_4usug_242{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}._row_4usug_48{display:flex;box-sizing:border-box;width:100%;align-items:flex-start;gap:var(--spacing-2_5);padding:var(--spacing-2_25) var(--spacing-3);border:none;border-radius:var(--radius-xl);background:transparent;color:var(--color-foreground);font-family:var(--font-sans);text-align:left;text-decoration:none;cursor:pointer;transition:background-color var(--dur-fast) var(--ease-out)}._row_4usug_48:hover{background:var(--color-neutral-50)}._row_4usug_48:hover ._rowDescription_4usug_299{color:var(--color-foreground-secondary)}._row_4usug_48:hover ._lane_4usug_303{color:var(--color-foreground)}._row_4usug_48:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}._row_4usug_48[data-single-line=true]{align-items:center}._row_4usug_48[data-single-line=true] ._lane_4usug_303{margin-top:0}._lane_4usug_303{display:block;width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;margin-top:var(--spacing-0_5);color:var(--color-foreground-muted)}._lane_4usug_303 svg{display:block;width:100%;height:100%}._rowText_4usug_347{display:flex;min-width:0;flex-direction:column;gap:var(--spacing-0_5)}._rowLabel_4usug_365{overflow:hidden;color:var(--color-foreground);font-size:var(--text-nav-label);font-weight:var(--font-weight-semibold);line-height:var(--leading-snug);text-overflow:ellipsis;white-space:nowrap}._row_4usug_48[data-single-line=true] ._rowLabel_4usug_365{color:var(--color-foreground-secondary);font-weight:var(--font-weight-regular)}._rowDescription_4usug_299{color:var(--color-foreground-muted);font-size:var(--text-xs);line-height:var(--leading-snug)}@media(prefers-reduced-motion:reduce){._row_4usug_48{transition:none}}:root{--shadow-overlay: 0px 16px 40px -10px var(--shadow-overlay-color);--shadow-lift: 0px 10px 24px -14px color-mix(in srgb, var(--color-neutral-950) 28%, transparent);--shadow-scrolled: 0px 6px 16px -12px color-mix(in srgb, var(--color-neutral-950) 35%, transparent)}._panel_1hdli_22{display:flex;overflow:clip;box-sizing:border-box;width:var(--container-command-palette);flex-direction:column;border:1px solid var(--color-border);border-radius:var(--radius-2xl);background:var(--color-surface);box-shadow:var(--shadow-overlay);font-family:var(--font-sans)}._searchRow_1hdli_38{display:flex;box-sizing:border-box;width:100%;align-items:center;flex-shrink:0;gap:var(--spacing-2_5);padding:var(--spacing-4);border-bottom:1px solid var(--color-border)}._searchGlyph_1hdli_49{width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;color:var(--color-foreground-muted)}._input_1hdli_63{min-width:0;flex:1;border:none;background:transparent;color:var(--color-foreground);font-family:var(--font-sans);font-size:var(--text-md);font-weight:var(--font-weight-medium)}._input_1hdli_63::placeholder{color:var(--color-foreground-muted)}._input_1hdli_63:focus{outline:none}._dismissKey_1hdli_94{flex-shrink:0;padding:var(--spacing-1) var(--spacing-1_5);border-radius:var(--radius-md);background:var(--color-surface-muted);color:var(--color-foreground-muted);font-size:var(--text-2xs)}._results_1hdli_109,._group_1hdli_115{display:flex;flex-direction:column;padding-block:var(--spacing-1)}._groupHeading_1hdli_127{margin:0;padding:var(--spacing-3) var(--spacing-4) var(--spacing-1_5);color:var(--color-foreground-muted);font-family:var(--font-sans);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-caps);text-transform:uppercase}._row_1hdli_146{display:flex;box-sizing:border-box;height:var(--spacing-10);align-items:center;gap:var(--spacing-2_5);margin-inline:var(--spacing-2);padding-inline:var(--spacing-2);border:none;border-radius:var(--radius-lg);background:transparent;color:var(--color-foreground);font-family:var(--font-sans);font-size:var(--text-nav-label);text-align:left;text-decoration:none;cursor:pointer}._row_1hdli_146:hover{background:var(--color-surface-muted)}._row_1hdli_146[aria-selected=true]{background:var(--color-surface-muted);font-weight:var(--font-weight-medium)}._icon_1hdli_184{display:flex;width:var(--spacing-5_5);height:var(--spacing-5_5);flex-shrink:0;align-items:center;justify-content:center;color:var(--color-foreground-muted)}._label_1hdli_197{overflow:hidden;min-width:0;text-overflow:ellipsis;white-space:nowrap}._empty_1hdli_209{margin:0;padding:var(--spacing-5) var(--spacing-4);color:var(--color-foreground-muted);font-size:var(--text-xs)}._footer_1hdli_217{display:flex;box-sizing:border-box;width:100%;align-items:center;flex-shrink:0;padding:var(--spacing-2) var(--spacing-4);border-top:1px solid var(--color-border)}._hints_1hdli_227{color:var(--color-foreground-muted);font-size:var(--text-xs)}._root_g1823_11{--dots-size: var(--spacing-8);--dots-speed: var(--dur-dots);--dots-ease: var(--ease-in-out-quint);--dots-gap: calc(var(--dots-size) * .14);--dots-dot: calc((var(--dots-size) - var(--dots-gap) * 2) / 3);display:inline-flex;align-items:center;justify-content:center}._grid_g1823_25{display:grid;gap:var(--dots-gap);grid-template-columns:repeat(3,var(--dots-dot))}._dot_g1823_31{width:var(--dots-dot);height:var(--dots-dot);border-radius:var(--radius-full);background:currentColor;opacity:1;animation:_dots-pulse_g1823_1 var(--dots-speed) var(--dots-ease) infinite backwards;animation-delay:calc(var(--dots-step, 0) * var(--dots-speed) / 4)}._dot_g1823_31:nth-child(1){--dots-step: 0}._dot_g1823_31:nth-child(2),._dot_g1823_31:nth-child(4){--dots-step: 1}._dot_g1823_31:nth-child(3),._dot_g1823_31:nth-child(5),._dot_g1823_31:nth-child(7){--dots-step: 2}._dot_g1823_31:nth-child(6),._dot_g1823_31:nth-child(8){--dots-step: 3}._dot_g1823_31:nth-child(9){--dots-step: 4}@keyframes _dots-pulse_g1823_1{0%,to{opacity:.2;transform:scale(.7)}50%{opacity:1;transform:scale(1)}}@media(prefers-reduced-motion:reduce){._dot_g1823_31{animation:none}}:root{--dur-instant: 80ms;--dur-fast: .15s;--dur-base: .22s;--dur-slow: .32s;--dur-bold: .7s;--dur-hero: .9s;--dur-spin: .7s;--dur-pulse: 1.6s;--ease-out: cubic-bezier(.22, 1, .36, 1);--ease-in: cubic-bezier(.4, 0, 1, 1);--ease-spring: cubic-bezier(.34, 1.56, .64, 1);--lift-sm: -1px;--lift-md: -2px;--rise: 8px;--stagger: 40ms;--duration-fast: var(--dur-fast);--easing-standard: var(--ease-out);--dur-dots: 1s;--ease-in-out-quint: cubic-bezier(.83, 0, .17, 1)}._root_1pg11_6{position:fixed;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;padding:var(--spacing-4);overflow:hidden;background-color:var(--color-neutral-1000);color:var(--color-neutral-0);--launch-accent: var(--launch-accent-input, var(--color-neutral-0));isolation:isolate}._glow_1pg11_9{position:absolute;top:50%;left:50%;z-index:0;width:298.333%;height:238.222%;transform:translate(-50%);border-radius:50%;background-image:radial-gradient(circle farthest-corner at 50% 50% in oklab,var(--color-orange-500) 0%,var(--color-orange-600) 28%,var(--color-orange-700) 48%,oklab(from var(--color-orange-700) l a b / 0%) 72%);filter:blur(5.5vmax)}._backdrop_1pg11_103{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;overflow:hidden}._content_1pg11_16{position:relative;display:flex;flex-direction:column;align-items:center;gap:var(--spacing-5);inline-size:min(280px,100%)}._dots_1pg11_139{--dots-size: var(--spacing-6);color:var(--launch-accent);mix-blend-mode:soft-light;opacity:1}._bar_1pg11_178{position:relative;inline-size:100%;block-size:var(--spacing-1);overflow:hidden;border-radius:var(--radius-full)}._track_1pg11_186{position:absolute;top:0;right:0;bottom:0;left:0;background:color-mix(in srgb,var(--launch-accent) 35%,transparent);mix-blend-mode:soft-light;opacity:.75}._fill_1pg11_194{position:absolute;inset-block:0;inset-inline-start:0;inline-size:calc(var(--launch-progress, 0) * 1%);border-radius:inherit;background:var(--color-neutral-0);transition:inline-size var(--dur-fast) var(--ease-out)}._bar_1pg11_178[data-indeterminate=true] ._fill_1pg11_194{inline-size:33.333%;animation:_launch-indeterminate_1pg11_1 calc(var(--dur-dots) * 1.5) var(--ease-out) infinite}@keyframes _launch-indeterminate_1pg11_1{0%{inset-inline-start:-33.333%}to{inset-inline-start:100%}}._caption_1pg11_220{margin:0;opacity:.8;font-family:var(--font-sans);font-size:var(--text-sm);font-weight:var(--font-weight-medium);line-height:var(--leading-normal);text-align:center}@media(prefers-reduced-motion:reduce){._fill_1pg11_194{transition:none}._bar_1pg11_178[data-indeterminate=true] ._fill_1pg11_194{inset-inline-start:33.333%;animation:none}}@media(prefers-contrast){._root_1pg11_6{--launch-accent: var(--color-neutral-0)}._glow_1pg11_9,._backdrop_1pg11_103{display:none}._dots_1pg11_139,._track_1pg11_186{mix-blend-mode:normal;opacity:1}}:root{--color-neutral-0: #FFFFFF;--color-neutral-50: #F7F7F8;--color-neutral-100: #EFEFF1;--color-neutral-200: #E5E5EA;--color-neutral-300: #D9D9D9;--color-neutral-400: #C1C1C2;--color-neutral-500: #8E8E93;--color-neutral-600: #6B6B6B;--color-neutral-700: #525252;--color-neutral-800: #3A3A3C;--color-neutral-900: #292929;--color-neutral-950: #1D1D1B;--color-neutral-1000: #000000;--color-orange-50: #FDF3EE;--color-orange-100: #FBE2D5;--color-orange-200: #F7C3A8;--color-orange-300: #F0A173;--color-orange-400: #EB7147;--color-orange-500: #E9521E;--color-orange-600: #C2410C;--color-orange-700: #9A3412;--color-sand-100: #FBF3E4;--color-sand-300: #F3D6AC;--color-sand-600: #8A6510;--color-green-100: #DDF0E4;--color-green-600: #157F3D;--color-crimson-100: #F7DEE1;--color-crimson-600: #A3182B;--color-blue-100: #DEE6FA;--color-blue-600: #2A5BD7;--color-background: var(--color-neutral-50);--color-surface: var(--color-neutral-0);--color-surface-muted: var(--color-neutral-100);--color-border: var(--color-neutral-200);--color-border-strong: var(--color-neutral-300);--color-foreground: var(--color-neutral-950);--color-foreground-secondary: var(--color-neutral-700);--color-foreground-muted: var(--color-neutral-600);--color-foreground-disabled: var(--color-neutral-400);--color-primary: var(--color-orange-500);--color-primary-hover: var(--color-orange-600);--color-primary-foreground: var(--color-neutral-0);--color-primary-subtle: var(--color-orange-50);--color-primary-border: var(--color-orange-200);--color-success: var(--color-green-600);--color-success-subtle: var(--color-green-100);--color-warning: var(--color-sand-600);--color-warning-subtle: var(--color-sand-300);--color-danger: var(--color-crimson-600);--color-danger-subtle: var(--color-crimson-100);--color-info: var(--color-blue-600);--color-info-subtle: var(--color-blue-100);--color-grant: var(--color-sand-600);--color-purchased: var(--color-neutral-950);--shadow-overlay-color: rgb(29 29 27 / 20%);--font-display: var(--boost33-font-display, Outfit), ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-sans: var(--boost33-font-sans, Inter), ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono: var(--boost33-font-mono, "Geist Mono"), ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--text-3xs: 9px;--text-2xs: 11px;--text-xs: 12px;--text-sm: 13px;--text-base: 15px;--text-md: 16px;--text-lg: 18px;--text-xl: 20px;--text-2xl: 24px;--text-3xl: 30px;--text-4xl: 36px;--text-5xl: 46px;--text-6xl: 60px;--text-7xl: 78px;--text-nav-label: 14px;--text-settings-group-label: 10px;--font-weight-light: 300;--font-weight-regular: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--tracking-tighter: -.03em;--tracking-tight: -.02em;--tracking-normal: 0em;--tracking-wide: .04em;--tracking-wider: .09em;--tracking-caps: .05em;--tracking-settings-title: -.01em;--leading-none: 100%;--leading-tight: 120%;--leading-snug: 135%;--leading-normal: 150%;--leading-relaxed: 170%;--breakpoint-mobile: 390px;--breakpoint-desktop: 1440px;--container-sidebar: 264px;--container-sidebar-rail: 56px;--container-command-palette: 560px;--container-content: 1440px;--container-account-menu: 312px;--container-notification-panel: 360px;--spacing-1: 4px;--spacing-2: 8px;--spacing-3: 12px;--spacing-4: 16px;--spacing-4_5: 18px;--spacing-5: 20px;--spacing-6: 24px;--spacing-7: 28px;--spacing-8: 32px;--spacing-10: 40px;--spacing-11: 44px;--spacing-12: 48px;--spacing-16: 64px;--spacing-20: 80px;--spacing-2_5: 10px;--spacing-5_5: 22px;--spacing-1_5: 6px;--spacing-1_25: 5px;--spacing-0_5: 2px;--spacing-2_25: 9px;--spacing-3_5: 14px;--spacing-0_25: 1px;--spacing-settings-crumb: 7px;--spacing-topup-reserve: 68px;--spacing-wallet-segment-min: 3px;--spacing-9_5: 38px;--radius-none: 0px;--radius-xs: 2px;--radius-sm: 3px;--radius-md: 4px;--radius-lg: 6px;--radius-xl: 8px;--radius-2xl: 12px;--radius-full: 9999px;--radius-product-tile: 25%}._root_1y1aa_41{container-type:inline-size}._frame_1y1aa_47{display:flex;min-height:100vh;background:var(--color-background);color:var(--color-foreground);font-family:var(--font-sans)}._sidebar_1y1aa_59{display:flex;box-sizing:border-box;width:var(--container-sidebar);flex-shrink:0;flex-direction:column;padding:0 var(--spacing-3);border-right:1px solid var(--color-border);background:var(--color-neutral-50)}._sidebar_1y1aa_59 a{text-decoration:none}._back_1y1aa_76{display:flex;align-items:center;gap:var(--spacing-2_5);padding:var(--spacing-4) var(--spacing-2_5) var(--spacing-3_5);color:var(--color-foreground)}._backLabel_1y1aa_84{font-size:var(--text-nav-label);font-weight:var(--font-weight-semibold);line-height:var(--spacing-4_5)}._glyph_1y1aa_91{display:block;width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0}._title_1y1aa_99{padding:var(--spacing-2_5) var(--spacing-2_5) var(--spacing-4)}._titleText_1y1aa_103{font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-settings-title);line-height:var(--spacing-6)}._group_1y1aa_112{display:flex;flex-direction:column;gap:var(--spacing-0_25)}._group_1y1aa_112+._group_1y1aa_112{padding-top:var(--spacing-5)}._groupLabel_1y1aa_124{padding:0 var(--spacing-2_5) var(--spacing-2)}._groupLabelText_1y1aa_128{color:var(--color-foreground-muted);font-size:var(--text-settings-group-label);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-caps);line-height:var(--spacing-3);text-transform:uppercase}._item_1y1aa_140{display:flex;align-items:center;gap:var(--spacing-2_5);padding:var(--spacing-2) var(--spacing-2_5);border-radius:var(--radius-lg);color:var(--color-foreground-muted)}._item_1y1aa_140[aria-current=page]{background:var(--color-surface);color:var(--color-foreground)}._icon_1y1aa_157{display:flex;width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;align-items:center;justify-content:center}._icon_1y1aa_157>svg{width:100%;height:100%}._label_1y1aa_171{flex-grow:1;color:var(--color-foreground-secondary);font-size:var(--text-nav-label);font-weight:var(--font-weight-regular);line-height:var(--spacing-4)}._item_1y1aa_140[aria-current=page] ._label_1y1aa_171{color:var(--color-foreground);font-weight:var(--font-weight-semibold)}._swatch_1y1aa_186{width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;border-radius:var(--radius-md);background:var(--color-neutral-300)}._spacer_1y1aa_195{flex-grow:1}._signOut_1y1aa_201{margin-bottom:var(--spacing-4)}._column_1y1aa_207{display:flex;min-width:0;flex-basis:0;flex-direction:column;flex-grow:1}._header_1y1aa_216{display:flex;box-sizing:border-box;height:var(--spacing-12);flex-shrink:0;align-items:center;justify-content:space-between;padding:0 var(--spacing-5);border-bottom:1px solid var(--color-border)}._headerStart_1y1aa_227{display:flex;align-items:center;gap:var(--spacing-3)}._panelMark_1y1aa_237{display:flex;color:var(--color-foreground-muted)}._crumbs_1y1aa_244{display:flex;align-items:center;gap:var(--spacing-settings-crumb);margin:0;padding:0;font-size:var(--text-sm);line-height:var(--spacing-4);list-style:none}._crumbStep_1y1aa_255{display:flex;align-items:center;gap:var(--spacing-settings-crumb)}._crumb_1y1aa_244{color:var(--color-foreground-muted);text-decoration:none}._crumbSeparator_1y1aa_266{color:var(--color-foreground-disabled)}._crumbCurrent_1y1aa_270{color:var(--color-foreground);font-weight:var(--font-weight-semibold);text-decoration:none}._headerEnd_1y1aa_276,._helpLinks_1y1aa_282{display:flex;align-items:center;gap:var(--spacing-4_5)}._helpLink_1y1aa_282{color:var(--color-foreground-secondary);font-size:var(--text-sm);line-height:var(--leading-normal);text-decoration:none}._content_1y1aa_298{display:flex;flex-direction:column;flex-grow:1;background:var(--color-surface)}._pageHead_1y1aa_307{display:flex;flex-shrink:0;align-items:flex-start;justify-content:space-between;gap:var(--spacing-6);padding:var(--spacing-7) var(--spacing-8) var(--spacing-6);border-bottom:1px solid var(--color-border);background:var(--color-surface)}._pageHeadText_1y1aa_318{display:flex;flex-direction:column;gap:var(--spacing-1)}._pageTitle_1y1aa_325{margin:0;font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-tight);line-height:var(--spacing-6)}._pageDescription_1y1aa_335{margin:0;color:var(--color-foreground-muted);font-size:var(--text-xs);line-height:var(--spacing-4)}@container (max-width: 767px){._frame_1y1aa_47{flex-direction:column}._sidebar_1y1aa_59{width:auto;flex-direction:row;align-items:center;gap:var(--spacing-0_5);padding:var(--spacing-1_5) var(--spacing-2);overflow-x:auto;border-right:none;border-bottom:1px solid var(--color-border);white-space:nowrap}._sidebar_1y1aa_59 a{flex-shrink:0}._title_1y1aa_99,._groupLabel_1y1aa_124,._spacer_1y1aa_195,._helpLinks_1y1aa_282,._panelMark_1y1aa_237{display:none}._group_1y1aa_112{flex-direction:row;gap:var(--spacing-0_5)}._group_1y1aa_112+._group_1y1aa_112{padding-top:0}._back_1y1aa_76,._signOut_1y1aa_201{margin:0;padding:var(--spacing-2) var(--spacing-2_5)}._header_1y1aa_216{padding:0 var(--spacing-4)}._pageHead_1y1aa_307{flex-wrap:wrap;padding:var(--spacing-5) var(--spacing-4) var(--spacing-4_5)}}
1
+ .btn-primary,.btn-quiet,.btn-danger{cursor:pointer;transition:background-color var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),transform var(--dur-instant) var(--ease-out)}.btn-primary{border:none;background:var(--color-primary);color:var(--color-primary-foreground)}.btn-primary:hover:not(:disabled){background:var(--color-primary-hover)}.btn-quiet{background:transparent;color:var(--color-foreground-secondary)}.btn-quiet:hover:not(:disabled){background:var(--color-surface-muted)}.btn-danger{border:1px solid var(--color-danger);background:var(--color-danger);color:var(--color-neutral-0)}.btn-danger:hover:not(:disabled){border-color:color-mix(in srgb,var(--color-danger) 85%,var(--color-neutral-950));background:color-mix(in srgb,var(--color-danger) 85%,var(--color-neutral-950))}.btn-primary:disabled,.btn-quiet:disabled,.btn-danger:disabled{opacity:.55;cursor:not-allowed}.spinner{box-sizing:border-box;width:var(--spacing-4_5);height:var(--spacing-4_5);border:2px solid var(--color-neutral-0);border-right-color:transparent;border-radius:var(--radius-full);animation:boost33-spin var(--dur-spin) linear infinite}.spinner--sm{width:var(--spacing-3_5);height:var(--spacing-3_5)}.spinner--primary{border-color:var(--color-primary);border-right-color:transparent}@keyframes boost33-spin{to{transform:rotate(360deg)}}.sk{display:block;border-radius:var(--radius-md);background:var(--color-surface-muted);animation:boost33-pulse var(--dur-pulse) ease-in-out infinite}.sk-group{animation:boost33-appear var(--dur-base) var(--ease-out) var(--dur-fast) both}.reveal{animation:boost33-appear var(--dur-base) var(--ease-out) both}@keyframes boost33-pulse{50%{opacity:.55}}@keyframes boost33-appear{0%{opacity:0}}@media(prefers-reduced-motion:no-preference){.btn-primary:active:not(:disabled),.btn-quiet:active:not(:disabled),.btn-danger:active:not(:disabled){transform:scale(.98)}}@media(prefers-reduced-motion:reduce){.sk,.sk-group,.reveal,.spinner{animation:none}*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:0s!important;scroll-behavior:auto!important}}._sidebar_17kel_7{display:flex;flex-direction:column;box-sizing:border-box;width:var(--container-sidebar);height:100%;padding-inline:var(--spacing-3);border-right:1px solid var(--color-border);background:var(--color-background);font-family:var(--font-sans)}._sidebar_17kel_7[data-collapsed=true]{width:var(--container-sidebar-rail)}._sidebar_17kel_7>nav{flex-shrink:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;margin:calc(-1 * var(--spacing-1));padding:var(--spacing-1);scroll-padding:var(--spacing-1)}@media(prefers-reduced-motion:reduce){._sidebar_17kel_7>nav{scroll-behavior:auto}}._section_3sxsg_5{display:flex;flex-direction:column}._header_3sxsg_13{margin:0;padding:var(--spacing-2) var(--spacing-2_5);color:var(--color-foreground-muted);font-family:var(--font-sans);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-caps);text-transform:uppercase}._wordmark_ccf4z_4{display:flex;align-items:center;gap:var(--spacing-2_5);font-family:var(--font-display)}a._wordmark_ccf4z_4{border-radius:var(--radius-lg);text-decoration:none}a._wordmark_ccf4z_4:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._mark_ccf4z_32{display:inline-flex;flex:0 0 var(--spacing-6);align-items:center;justify-content:center;width:var(--spacing-6);height:var(--spacing-6)}._mark_ccf4z_32 svg{width:100%;height:100%}._name_ccf4z_50{color:var(--color-foreground);font-family:var(--font-display);font-size:var(--text-lg);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-tight)}._wordmark_ccf4z_4[data-collapsed=true] ._name_ccf4z_50{position:absolute;overflow:hidden;clip-path:inset(50%);width:1px;height:1px;white-space:nowrap}._wordmark_ccf4z_4[data-collapsed=true]{justify-content:center}._tile_w89ja_12{fill:var(--color-neutral-950)}._ring_w89ja_16{fill:var(--color-primary)}._mark_w89ja_24{display:block}._link_w89ja_33{display:inline-flex;vertical-align:top;border-radius:var(--radius-lg);text-decoration:none}._link_w89ja_33:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._mark_1jt5g_6{display:block}._ground_1jt5g_17{rx:var(--radius-product-tile)}._row_w21mf_4{display:flex;align-items:center;width:100%;gap:var(--spacing-2_5);padding:var(--spacing-2) var(--spacing-2_5);border:none;border-radius:var(--radius-lg);background:transparent;font-family:var(--font-sans);text-align:left;text-decoration:none;cursor:pointer;transition:background-color var(--dur-fast) var(--ease-out)}._row_w21mf_4:hover{background:var(--color-surface-muted)}._row_w21mf_4[data-active=true]{background:var(--color-surface)}._row_w21mf_4:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._icon_w21mf_41{display:inline-flex;flex:0 0 var(--spacing-4);align-items:center;justify-content:center;width:var(--spacing-4);height:var(--spacing-4);color:var(--color-foreground-secondary)}._icon_w21mf_41 svg{width:100%;height:100%}._row_w21mf_4[data-active=true] ._icon_w21mf_41{color:var(--color-foreground)}._row_w21mf_4[data-collapsed=true]{justify-content:center}._label_w21mf_66{flex:1 1 auto;min-width:0;overflow:hidden;color:var(--color-foreground-secondary);font-size:var(--text-nav-label);font-weight:var(--font-weight-regular);text-overflow:ellipsis;white-space:nowrap}._row_w21mf_4[data-active=true] ._label_w21mf_66{color:var(--color-foreground);font-weight:var(--font-weight-semibold)}._row_w21mf_4[data-collapsed=true] ._label_w21mf_66{position:absolute;overflow:hidden;clip-path:inset(50%);width:1px;height:1px;white-space:nowrap}._trailingSlot_w21mf_92{display:flex;flex:0 0 var(--spacing-5_5);align-items:center;justify-content:center;width:var(--spacing-5_5);font-family:var(--font-sans);font-size:var(--text-nav-label)}._row_w21mf_4[data-collapsed=true] ._trailingSlot_w21mf_92{display:none}._count_w21mf_106{color:var(--color-foreground-muted)}._countUrgent_w21mf_110{color:var(--color-primary)}@media(prefers-reduced-motion:reduce){._row_w21mf_4{transition:none}}._chip_xxga2_37{--chip-lift: 0px;position:relative;box-sizing:border-box;width:100%;padding:calc(var(--spacing-3) + var(--chip-lift));border:1px solid var(--color-border);border-radius:var(--radius-2xl);background:transparent;font-family:var(--font-sans)}._chip_xxga2_37:not([data-unknown]):hover,._chip_xxga2_37:not([data-unknown]):focus-within,._chip_xxga2_37[data-threshold]{--chip-lift: var(--spacing-0_5);box-shadow:var(--shadow-overlay)}._chip_xxga2_37:not([data-threshold]):not([data-unknown]):hover,._chip_xxga2_37:not([data-threshold]):not([data-unknown]):focus-within{background:var(--color-surface)}._chip_xxga2_37:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._header_xxga2_74{display:flex;align-items:center;gap:var(--spacing-2)}._chip_xxga2_37:not([data-threshold]):not([data-unknown]) ._header_xxga2_74{padding-right:var(--spacing-topup-reserve)}._name_xxga2_83{min-width:0;overflow:hidden;color:var(--color-foreground-muted);font-size:var(--text-xs);font-weight:var(--font-weight-medium);line-height:var(--leading-tight);text-overflow:ellipsis;white-space:nowrap}._pill_xxga2_162{padding:var(--spacing-0_5) var(--spacing-2);border-radius:var(--radius-full);background:var(--color-warning-subtle);color:var(--color-warning);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold)}._figure_xxga2_171{display:flex;align-items:baseline;gap:var(--spacing-1_5);margin-top:calc(var(--spacing-2_5) + var(--chip-lift))}._amount_xxga2_186{color:var(--color-foreground);font-family:var(--font-mono);font-size:var(--text-2xl);font-weight:var(--font-weight-bold);letter-spacing:var(--tracking-tight);line-height:var(--leading-none)}._unit_xxga2_195{color:var(--color-foreground-muted);font-size:var(--text-xs)}._retry_xxga2_200{width:var(--spacing-3);height:var(--spacing-3);color:var(--color-foreground-muted)}._bar_xxga2_209{display:flex;overflow:hidden;width:100%;height:calc(var(--spacing-1_25) + var(--chip-lift));margin-top:calc(var(--spacing-2_5) + var(--chip-lift));border-radius:var(--radius-full)}._bar_xxga2_209[data-tone=rest]{background:var(--color-surface-muted)}._bar_xxga2_209[data-tone=threshold]{background:var(--color-warning-subtle)}._bar_xxga2_209[data-tone=unknown]{background:var(--color-surface-muted)}._segmentGranted_xxga2_230,._segmentPurchased_xxga2_231{height:100%;transition:width var(--dur-fast) var(--ease-out)}._segmentGranted_xxga2_230{background:var(--color-grant)}._segmentPurchased_xxga2_231{background:var(--color-purchased)}._details_xxga2_275{display:none}._chip_xxga2_37:hover ._details_xxga2_275,._chip_xxga2_37:focus-within ._details_xxga2_275{display:block}._split_xxga2_284{display:flex;flex-direction:column;gap:var(--spacing-1);margin:var(--spacing-2_5) 0 0}._splitRow_xxga2_291{display:flex;align-items:center;justify-content:space-between}._splitLabel_xxga2_297{display:flex;align-items:center;gap:var(--spacing-1_5);color:var(--color-foreground);font-size:var(--text-xs)}._splitAmount_xxga2_305{margin:0;color:var(--color-foreground);font-family:var(--font-mono);font-size:var(--text-xs);font-variant-numeric:tabular-nums}._dotGranted_xxga2_313,._dotPurchased_xxga2_314{width:var(--spacing-1_5);height:var(--spacing-1_5);border-radius:var(--radius-full)}._dotGranted_xxga2_313{background:var(--color-grant)}._dotPurchased_xxga2_314{background:var(--color-purchased)}._footer_xxga2_328{margin:var(--spacing-3) 0 0;padding-top:var(--spacing-1);border-top:1px solid var(--color-border);color:var(--color-foreground-muted);font-size:var(--text-2xs)}._burnNote_xxga2_336{margin:var(--spacing-2_5) 0 0;color:var(--color-foreground-secondary);font-size:var(--text-2xs);line-height:var(--leading-snug)}._topUp_xxga2_87{position:absolute;top:calc(var(--spacing-3) + var(--chip-lift));right:calc(var(--spacing-3) + var(--chip-lift));padding:0;border:none;background:transparent;color:var(--color-primary);font-family:var(--font-sans);font-size:var(--text-xs);font-weight:var(--font-weight-semibold);opacity:0;cursor:pointer;transition:opacity var(--dur-fast) var(--ease-out)}._chip_xxga2_37:hover ._topUp_xxga2_87,._chip_xxga2_37:focus-within ._topUp_xxga2_87,._topUp_xxga2_87:focus-visible{opacity:1}._topUp_xxga2_87:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._topUp_xxga2_87[data-grown=true]{position:static;width:100%;margin-top:var(--spacing-2_5);padding:var(--spacing-2);border-radius:var(--radius-lg);background:var(--color-primary);color:var(--color-primary-foreground);font-size:var(--text-sm);opacity:1}._topUp_xxga2_87[data-grown=true]:hover{background:var(--color-primary-hover)}._rail_xxga2_402{--chip-lift: 0px;position:relative;display:flex;box-sizing:border-box;width:100%;flex-direction:column;align-items:center;gap:var(--spacing-2);padding:var(--spacing-2);font-family:var(--font-sans)}._railIcon_xxga2_416{width:var(--spacing-6);height:var(--spacing-6);color:var(--color-foreground-secondary)}._railFigure_xxga2_422{color:var(--color-foreground);font-family:var(--font-mono);font-size:var(--text-sm);font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}._rail_xxga2_402 ._bar_xxga2_209{height:var(--spacing-0_5);margin-top:0}._srOnly_xxga2_435{position:absolute;overflow:hidden;clip-path:inset(50%);width:1px;height:1px;white-space:nowrap}@media(prefers-reduced-motion:reduce){._segmentGranted_xxga2_230,._segmentPurchased_xxga2_231,._topUp_xxga2_87{transition:none}}._bar_194bx_7{display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-4);box-sizing:border-box;height:var(--spacing-12);padding:0 var(--spacing-8);border-bottom:1px solid var(--color-border);background:var(--color-surface);font-family:var(--font-sans)}._breadcrumb_194bx_20{display:flex;min-width:0;align-items:center;gap:var(--spacing-2);overflow:hidden;color:var(--color-foreground);font-size:var(--text-sm);font-weight:var(--font-weight-medium);text-overflow:ellipsis;white-space:nowrap}._actions_194bx_33{display:flex;flex:0 0 auto;align-items:center;gap:var(--spacing-2)}@supports (animation-timeline: --a) and (timeline-scope: --a){@container style(--boost33-shell-timeline: on){._bar_194bx_7{position:relative;z-index:1;animation:_scrolled_194bx_1 linear both;animation-timeline:--boost33-shell-scroll;animation-range:0 var(--spacing-10)}}}@keyframes _scrolled_194bx_1{to{box-shadow:var(--shadow-scrolled)}}._header_i17td_42{display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-8);padding:var(--spacing-4_5) var(--spacing-8) var(--spacing-4);background:var(--color-surface);font-family:var(--font-sans)}._headings_i17td_52{display:flex;min-width:0;flex-direction:column;gap:var(--spacing-1)}._title_i17td_33{margin:0;color:var(--color-foreground);font-family:var(--font-display);font-size:var(--text-2xl);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-tight);line-height:var(--leading-tight)}._subtitle_i17td_74{margin:0;color:var(--color-foreground-secondary);font-size:var(--text-base);font-weight:var(--font-weight-regular);line-height:var(--leading-snug)}._actions_i17td_82{display:flex;flex:0 0 auto;align-items:center;gap:var(--spacing-2)}._shell_10chf_10{display:flex;height:100%;background:var(--color-surface);font-family:var(--font-sans)}._wordmark_10chf_20{padding:var(--spacing-3) var(--spacing-2_5) var(--spacing-5)}._switcher_10chf_26{padding-bottom:var(--spacing-4)}._foot_10chf_33{display:flex;flex-direction:column;gap:var(--spacing-4);margin-block-start:auto;padding-block-start:var(--spacing-4)}._nav_10chf_45{display:flex;flex-direction:column;gap:var(--spacing-4)}._main_10chf_54{display:flex;min-width:0;flex:1;flex-direction:column}._content_10chf_75{flex:1;min-height:0;overflow-y:auto;background:var(--color-surface)}@supports (animation-timeline: --a) and (timeline-scope: --a){._main_10chf_54{timeline-scope:--boost33-shell-scroll;--boost33-shell-timeline: on}._content_10chf_75{scroll-timeline:--boost33-shell-scroll block}}._root_15f7d_8{position:relative;font-family:var(--font-sans)}._trigger_15f7d_17{display:flex;box-sizing:border-box;width:100%;align-items:center;gap:var(--spacing-2);padding:var(--spacing-2_25) var(--spacing-2);border:1px solid var(--color-border-strong);border-radius:var(--radius-lg);background:transparent;font-family:var(--font-sans);cursor:pointer}._trigger_15f7d_17[aria-expanded=true]{background:var(--color-surface-muted)}._trigger_15f7d_17:focus-visible,._railTrigger_15f7d_46:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._triggerName_15f7d_56{overflow:hidden;flex:1;color:var(--color-foreground);font-size:var(--text-nav-label);font-weight:var(--font-weight-semibold);text-align:left;text-overflow:ellipsis;white-space:nowrap}._chevron_15f7d_67{width:var(--spacing-3);height:var(--spacing-3);flex-shrink:0;color:var(--color-foreground-muted);transition:transform var(--dur-fast) var(--ease-out)}._trigger_15f7d_17[aria-expanded=true] ._chevron_15f7d_67{transform:rotate(180deg)}._railTrigger_15f7d_46{display:flex;box-sizing:border-box;width:100%;min-height:var(--spacing-6);align-items:flex-start;justify-content:center;padding:0;border:none;background:transparent;cursor:pointer}._panel_15f7d_109{position:absolute;z-index:1;top:100%;left:0;width:var(--container-sidebar);box-sizing:border-box;margin-top:var(--spacing-0_5);padding:var(--spacing-2);border:1px solid var(--color-border);border-radius:var(--radius-2xl);background:var(--color-surface);box-shadow:var(--shadow-overlay)}._hubRow_15f7d_135,._productRow_15f7d_136,._accountRow_15f7d_137{display:flex;box-sizing:border-box;width:100%;align-items:center;gap:var(--spacing-2_5);padding:var(--spacing-2);border:none;border-radius:var(--radius-lg);background:transparent;color:var(--color-foreground);font-family:var(--font-sans);text-align:left;text-decoration:none;cursor:pointer}._hubRow_15f7d_135:hover,._productRow_15f7d_136:hover,._accountRow_15f7d_137:hover{background:var(--color-surface-muted)}._hubRow_15f7d_135:focus-visible,._productRow_15f7d_136:focus-visible,._accountRow_15f7d_137:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}._products_15f7d_144{display:flex;flex-direction:column;gap:var(--spacing-0_5);margin:0;padding:0;list-style:none}._productRow_15f7d_136[data-current=true]{background:var(--color-surface-muted)}._productRow_15f7d_136[data-entitled=false] ._rowName_15f7d_193{color:var(--color-foreground-muted)}._accountRow_15f7d_137{padding-inline:var(--spacing-3)}._accountRow_15f7d_137 ._rowName_15f7d_193{font-size:var(--text-sm)}._accountRow_15f7d_137 ._rowSub_15f7d_213{font-size:var(--text-2xs)}._accountRow_15f7d_137[data-actionable=false]{cursor:default}._accountRow_15f7d_137[data-actionable=false]:hover{background:transparent}._rowText_15f7d_238{display:flex;min-width:0;flex-direction:column}._hubRow_15f7d_135 ._rowText_15f7d_238{gap:var(--spacing-0_5)}._rowName_15f7d_193{overflow:hidden;color:var(--color-foreground);font-size:var(--text-nav-label);font-weight:var(--font-weight-regular);text-overflow:ellipsis;white-space:nowrap}._productRow_15f7d_136 ._rowName_15f7d_193{flex:1}._rowSub_15f7d_213{overflow:hidden;color:var(--color-foreground-muted);font-size:var(--text-xs);text-overflow:ellipsis;white-space:nowrap}._hubMark_15f7d_281{width:var(--spacing-5);height:var(--spacing-5);flex-shrink:0;color:var(--color-foreground)}._tag_15f7d_297{flex-shrink:0;margin-left:auto;padding:var(--spacing-0_5) var(--spacing-1_5);border-radius:var(--radius-full);background:var(--color-surface-muted);color:var(--color-foreground-muted);font-size:var(--text-2xs);font-weight:var(--font-weight-medium)}._check_15f7d_308{width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;margin-left:auto;color:var(--color-foreground)}._avatar_15f7d_321{display:grid;width:var(--spacing-6);height:var(--spacing-6);flex-shrink:0;border-radius:var(--radius-lg);background:var(--color-surface-muted);color:var(--color-foreground-secondary);font-size:var(--text-3xs);font-weight:var(--font-weight-semibold);place-items:center}._chevronRight_15f7d_334{width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;margin-left:auto;color:var(--color-foreground-muted)}._divider_15f7d_355{margin:var(--spacing-2_25) 0 var(--spacing-2);border:none;border-top:1px solid var(--color-border)}._products_15f7d_144+._divider_15f7d_355{margin:var(--spacing-1_5) 0 var(--spacing-1)}@media(prefers-reduced-motion:reduce){._chevron_15f7d_67{transition:none}}._panel_sl837_36{display:flex;width:var(--container-notification-panel);box-sizing:border-box;flex-direction:column;overflow:hidden;border:1px solid var(--color-border);border-radius:var(--radius-2xl);background:var(--color-surface);box-shadow:var(--shadow-overlay);font-family:var(--font-sans)}._header_sl837_54{display:flex;align-items:center;justify-content:space-between;padding:var(--spacing-3_5) var(--spacing-4) var(--spacing-2_5)}._title_sl837_62{margin:0;color:var(--color-foreground);font-size:var(--text-base);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}._markAll_sl837_73{padding:0;border:none;background:transparent;color:var(--color-primary);font-family:var(--font-sans);font-size:var(--text-xs);font-weight:var(--font-weight-medium);line-height:var(--leading-snug);cursor:pointer}._markAll_sl837_73:focus-visible,._tab_sl837_86:focus-visible,._viewAll_sl837_87:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}._tabs_sl837_96{display:flex;align-items:center;gap:var(--spacing-4_5);padding-inline:var(--spacing-4);border-bottom:1px solid var(--color-border)}._tab_sl837_86{display:flex;align-items:center;gap:var(--spacing-1_25);padding:var(--spacing-2) 0 var(--spacing-2_5);border:none;border-bottom:2px solid transparent;background:transparent;color:var(--color-foreground-muted);font-family:var(--font-sans);font-size:var(--text-sm);font-weight:var(--font-weight-regular);line-height:var(--leading-tight);cursor:pointer}._tab_sl837_86[aria-pressed=true]{border-bottom-color:var(--color-foreground);color:var(--color-foreground);font-weight:var(--font-weight-semibold)}._count_sl837_131{padding:var(--spacing-0_25) var(--spacing-1_25);border-radius:var(--radius-full);background:var(--color-surface-muted);color:var(--color-foreground-muted);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}._list_sl837_141{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}._row_sl837_156{display:flex;box-sizing:border-box;width:100%;align-items:flex-start;gap:var(--spacing-2_5);padding:var(--spacing-2_5) var(--spacing-4);color:var(--color-foreground);font-family:var(--font-sans);text-align:left;text-decoration:none}._row_sl837_156[href]:hover{background:var(--color-surface-muted)}._row_sl837_156[href]:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}._sourceMark_sl837_187{display:block;flex-shrink:0;margin-top:var(--spacing-0_25);color:var(--color-primary-foreground)}._sourceMarkGround_sl837_196{rx:var(--radius-product-tile);fill:var(--color-neutral-950)}._rowText_sl837_201{display:flex;min-width:0;flex:1;flex-direction:column;gap:var(--spacing-0_5)}._rowTitle_sl837_212{color:var(--color-foreground-secondary);font-size:var(--text-sm);font-weight:var(--font-weight-medium);line-height:var(--leading-snug)}._row_sl837_156[data-unread=true] ._rowTitle_sl837_212{color:var(--color-foreground)}._rowMeta_sl837_223{color:var(--color-foreground-muted);font-size:var(--text-xs);line-height:var(--leading-snug)}._unreadSlot_sl837_234{display:flex;width:var(--spacing-4);flex-shrink:0;justify-content:center;padding-top:var(--spacing-1)}._dot_sl837_243{width:var(--spacing-1_5);height:var(--spacing-1_5);flex-shrink:0;border-radius:var(--radius-full);background:var(--color-primary)}._empty_sl837_258{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--spacing-2_5);padding:var(--spacing-10) var(--spacing-6) var(--spacing-11)}._emptyGlyph_sl837_267{display:block;width:var(--spacing-7);height:var(--spacing-7);flex-shrink:0;color:var(--color-foreground-disabled)}._emptyText_sl837_275{display:flex;flex-direction:column;align-items:center;gap:var(--spacing-0_5)}._emptyTitle_sl837_282{margin:0;color:var(--color-foreground-secondary);font-size:var(--text-sm);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight)}._emptyBody_sl837_290{margin:0;color:var(--color-foreground-muted);font-size:var(--text-xs);line-height:var(--leading-snug);text-align:center}._footer_sl837_299{display:flex;align-items:center;justify-content:center;padding:var(--spacing-2_5) var(--spacing-4);border-top:1px solid var(--color-border)}._viewAll_sl837_87{color:var(--color-foreground-secondary);font-size:var(--text-xs);font-weight:var(--font-weight-medium);line-height:var(--leading-snug);text-decoration:none}._viewAll_sl837_87:hover{text-decoration:underline}._srOnly_sl837_321{position:absolute;overflow:hidden;width:1px;height:1px;clip-path:inset(50%);white-space:nowrap}._panel_4usug_54{display:flex;box-sizing:border-box;width:var(--container-account-menu);flex-direction:column;padding:var(--spacing-1_5);border:1px solid var(--color-border);border-radius:var(--radius-2xl);background:var(--color-surface);box-shadow:var(--shadow-overlay);font-family:var(--font-sans)}._person_4usug_72{display:flex;align-items:center;gap:var(--spacing-3);padding:var(--spacing-3_5) var(--spacing-3)}._personAvatar_4usug_85{display:block;width:var(--spacing-9_5);height:var(--spacing-9_5);flex-shrink:0;border-radius:var(--radius-full);background:var(--color-border-strong);object-fit:cover}._personText_4usug_98{display:flex;min-width:0;flex-direction:column;gap:var(--spacing-0_5)}._personName_4usug_106{overflow:hidden;color:var(--color-foreground);font-size:var(--text-nav-label);font-weight:var(--font-weight-semibold);line-height:var(--leading-snug);text-overflow:ellipsis;white-space:nowrap}._personEmail_4usug_122{overflow:hidden;color:var(--color-foreground-muted);font-size:var(--text-xs);line-height:var(--leading-snug);text-overflow:ellipsis;white-space:nowrap}._org_4usug_147{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--spacing-1);margin-inline:var(--spacing-1_5);padding:var(--spacing-2_25) var(--spacing-3);border-radius:var(--radius-xl);background:var(--color-neutral-50)}._orgIdentity_4usug_161{display:flex;min-width:0;align-items:center;gap:var(--spacing-2_25)}._orgTile_4usug_178{display:grid;width:var(--spacing-5_5);height:var(--spacing-5_5);flex-shrink:0;border-radius:var(--radius-lg);background:var(--color-neutral-950);color:var(--color-primary-foreground);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold);place-items:center}._orgName_4usug_194{overflow:hidden;color:var(--color-foreground);font-size:var(--text-sm);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight);text-overflow:ellipsis;white-space:nowrap}._orgRole_4usug_209{flex-shrink:0;padding:var(--spacing-0_5) var(--spacing-2);border-radius:var(--radius-full);background:var(--color-neutral-950);color:var(--color-primary-foreground);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold);line-height:var(--leading-tight);white-space:nowrap}._divider_4usug_143{margin:var(--spacing-1_5);border:none;border-top:1px solid var(--color-border)}._rows_4usug_242{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}._row_4usug_48{display:flex;box-sizing:border-box;width:100%;align-items:flex-start;gap:var(--spacing-2_5);padding:var(--spacing-2_25) var(--spacing-3);border:none;border-radius:var(--radius-xl);background:transparent;color:var(--color-foreground);font-family:var(--font-sans);text-align:left;text-decoration:none;cursor:pointer;transition:background-color var(--dur-fast) var(--ease-out)}._row_4usug_48:hover{background:var(--color-neutral-50)}._row_4usug_48:hover ._rowDescription_4usug_299{color:var(--color-foreground-secondary)}._row_4usug_48:hover ._lane_4usug_303{color:var(--color-foreground)}._row_4usug_48:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}._row_4usug_48[data-single-line=true]{align-items:center}._row_4usug_48[data-single-line=true] ._lane_4usug_303{margin-top:0}._lane_4usug_303{display:block;width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;margin-top:var(--spacing-0_5);color:var(--color-foreground-muted)}._lane_4usug_303 svg{display:block;width:100%;height:100%}._rowText_4usug_347{display:flex;min-width:0;flex-direction:column;gap:var(--spacing-0_5)}._rowLabel_4usug_365{overflow:hidden;color:var(--color-foreground);font-size:var(--text-nav-label);font-weight:var(--font-weight-semibold);line-height:var(--leading-snug);text-overflow:ellipsis;white-space:nowrap}._row_4usug_48[data-single-line=true] ._rowLabel_4usug_365{color:var(--color-foreground-secondary);font-weight:var(--font-weight-regular)}._rowDescription_4usug_299{color:var(--color-foreground-muted);font-size:var(--text-xs);line-height:var(--leading-snug)}@media(prefers-reduced-motion:reduce){._row_4usug_48{transition:none}}:root{--shadow-overlay: 0px 16px 40px -10px var(--shadow-overlay-color);--shadow-lift: 0px 10px 24px -14px color-mix(in srgb, var(--color-neutral-950) 28%, transparent);--shadow-scrolled: 0px 6px 16px -12px color-mix(in srgb, var(--color-neutral-950) 35%, transparent)}._panel_1hdli_22{display:flex;overflow:clip;box-sizing:border-box;width:var(--container-command-palette);flex-direction:column;border:1px solid var(--color-border);border-radius:var(--radius-2xl);background:var(--color-surface);box-shadow:var(--shadow-overlay);font-family:var(--font-sans)}._searchRow_1hdli_38{display:flex;box-sizing:border-box;width:100%;align-items:center;flex-shrink:0;gap:var(--spacing-2_5);padding:var(--spacing-4);border-bottom:1px solid var(--color-border)}._searchGlyph_1hdli_49{width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;color:var(--color-foreground-muted)}._input_1hdli_63{min-width:0;flex:1;border:none;background:transparent;color:var(--color-foreground);font-family:var(--font-sans);font-size:var(--text-md);font-weight:var(--font-weight-medium)}._input_1hdli_63::placeholder{color:var(--color-foreground-muted)}._input_1hdli_63:focus{outline:none}._dismissKey_1hdli_94{flex-shrink:0;padding:var(--spacing-1) var(--spacing-1_5);border-radius:var(--radius-md);background:var(--color-surface-muted);color:var(--color-foreground-muted);font-size:var(--text-2xs)}._results_1hdli_109,._group_1hdli_115{display:flex;flex-direction:column;padding-block:var(--spacing-1)}._groupHeading_1hdli_127{margin:0;padding:var(--spacing-3) var(--spacing-4) var(--spacing-1_5);color:var(--color-foreground-muted);font-family:var(--font-sans);font-size:var(--text-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-caps);text-transform:uppercase}._row_1hdli_146{display:flex;box-sizing:border-box;height:var(--spacing-10);align-items:center;gap:var(--spacing-2_5);margin-inline:var(--spacing-2);padding-inline:var(--spacing-2);border:none;border-radius:var(--radius-lg);background:transparent;color:var(--color-foreground);font-family:var(--font-sans);font-size:var(--text-nav-label);text-align:left;text-decoration:none;cursor:pointer}._row_1hdli_146:hover{background:var(--color-surface-muted)}._row_1hdli_146[aria-selected=true]{background:var(--color-surface-muted);font-weight:var(--font-weight-medium)}._icon_1hdli_184{display:flex;width:var(--spacing-5_5);height:var(--spacing-5_5);flex-shrink:0;align-items:center;justify-content:center;color:var(--color-foreground-muted)}._label_1hdli_197{overflow:hidden;min-width:0;text-overflow:ellipsis;white-space:nowrap}._empty_1hdli_209{margin:0;padding:var(--spacing-5) var(--spacing-4);color:var(--color-foreground-muted);font-size:var(--text-xs)}._footer_1hdli_217{display:flex;box-sizing:border-box;width:100%;align-items:center;flex-shrink:0;padding:var(--spacing-2) var(--spacing-4);border-top:1px solid var(--color-border)}._hints_1hdli_227{color:var(--color-foreground-muted);font-size:var(--text-xs)}._root_g1823_11{--dots-size: var(--spacing-8);--dots-speed: var(--dur-dots);--dots-ease: var(--ease-in-out-quint);--dots-gap: calc(var(--dots-size) * .14);--dots-dot: calc((var(--dots-size) - var(--dots-gap) * 2) / 3);display:inline-flex;align-items:center;justify-content:center}._grid_g1823_25{display:grid;gap:var(--dots-gap);grid-template-columns:repeat(3,var(--dots-dot))}._dot_g1823_31{width:var(--dots-dot);height:var(--dots-dot);border-radius:var(--radius-full);background:currentColor;opacity:1;animation:_dots-pulse_g1823_1 var(--dots-speed) var(--dots-ease) infinite backwards;animation-delay:calc(var(--dots-step, 0) * var(--dots-speed) / 4)}._dot_g1823_31:nth-child(1){--dots-step: 0}._dot_g1823_31:nth-child(2),._dot_g1823_31:nth-child(4){--dots-step: 1}._dot_g1823_31:nth-child(3),._dot_g1823_31:nth-child(5),._dot_g1823_31:nth-child(7){--dots-step: 2}._dot_g1823_31:nth-child(6),._dot_g1823_31:nth-child(8){--dots-step: 3}._dot_g1823_31:nth-child(9){--dots-step: 4}@keyframes _dots-pulse_g1823_1{0%,to{opacity:.2;transform:scale(.7)}50%{opacity:1;transform:scale(1)}}@media(prefers-reduced-motion:reduce){._dot_g1823_31{animation:none}}:root{--dur-instant: 80ms;--dur-fast: .15s;--dur-base: .22s;--dur-slow: .32s;--dur-bold: .7s;--dur-hero: .9s;--dur-spin: .7s;--dur-pulse: 1.6s;--ease-out: cubic-bezier(.22, 1, .36, 1);--ease-in: cubic-bezier(.4, 0, 1, 1);--ease-spring: cubic-bezier(.34, 1.56, .64, 1);--lift-sm: -1px;--lift-md: -2px;--rise: 8px;--stagger: 40ms;--duration-fast: var(--dur-fast);--easing-standard: var(--ease-out);--dur-dots: 1s;--ease-in-out-quint: cubic-bezier(.83, 0, .17, 1)}._root_1pg11_6{position:fixed;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;padding:var(--spacing-4);overflow:hidden;background-color:var(--color-neutral-1000);color:var(--color-neutral-0);--launch-accent: var(--launch-accent-input, var(--color-neutral-0));isolation:isolate}._glow_1pg11_9{position:absolute;top:50%;left:50%;z-index:0;width:298.333%;height:238.222%;transform:translate(-50%);border-radius:50%;background-image:radial-gradient(circle farthest-corner at 50% 50% in oklab,var(--color-orange-500) 0%,var(--color-orange-600) 28%,var(--color-orange-700) 48%,oklab(from var(--color-orange-700) l a b / 0%) 72%);filter:blur(5.5vmax)}._backdrop_1pg11_103{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;overflow:hidden}._content_1pg11_16{position:relative;display:flex;flex-direction:column;align-items:center;gap:var(--spacing-5);inline-size:min(280px,100%)}._dots_1pg11_139{--dots-size: var(--spacing-6);color:var(--launch-accent);mix-blend-mode:soft-light;opacity:1}._bar_1pg11_178{position:relative;inline-size:100%;block-size:var(--spacing-1);overflow:hidden;border-radius:var(--radius-full)}._track_1pg11_186{position:absolute;top:0;right:0;bottom:0;left:0;background:color-mix(in srgb,var(--launch-accent) 35%,transparent);mix-blend-mode:soft-light;opacity:.75}._fill_1pg11_194{position:absolute;inset-block:0;inset-inline-start:0;inline-size:calc(var(--launch-progress, 0) * 1%);border-radius:inherit;background:var(--color-neutral-0);transition:inline-size var(--dur-fast) var(--ease-out)}._bar_1pg11_178[data-indeterminate=true] ._fill_1pg11_194{inline-size:33.333%;animation:_launch-indeterminate_1pg11_1 calc(var(--dur-dots) * 1.5) var(--ease-out) infinite}@keyframes _launch-indeterminate_1pg11_1{0%{inset-inline-start:-33.333%}to{inset-inline-start:100%}}._caption_1pg11_220{margin:0;opacity:.8;font-family:var(--font-sans);font-size:var(--text-sm);font-weight:var(--font-weight-medium);line-height:var(--leading-normal);text-align:center}@media(prefers-reduced-motion:reduce){._fill_1pg11_194{transition:none}._bar_1pg11_178[data-indeterminate=true] ._fill_1pg11_194{inset-inline-start:33.333%;animation:none}}@media(prefers-contrast){._root_1pg11_6{--launch-accent: var(--color-neutral-0)}._glow_1pg11_9,._backdrop_1pg11_103{display:none}._dots_1pg11_139,._track_1pg11_186{mix-blend-mode:normal;opacity:1}}:root{--color-neutral-0: #FFFFFF;--color-neutral-50: #F7F7F8;--color-neutral-100: #EFEFF1;--color-neutral-200: #E5E5EA;--color-neutral-300: #D9D9D9;--color-neutral-400: #C1C1C2;--color-neutral-500: #8E8E93;--color-neutral-600: #6B6B6B;--color-neutral-700: #525252;--color-neutral-800: #3A3A3C;--color-neutral-900: #292929;--color-neutral-950: #1D1D1B;--color-neutral-1000: #000000;--color-orange-50: #FDF3EE;--color-orange-100: #FBE2D5;--color-orange-200: #F7C3A8;--color-orange-300: #F0A173;--color-orange-400: #EB7147;--color-orange-500: #E9521E;--color-orange-600: #C2410C;--color-orange-700: #9A3412;--color-sand-100: #FBF3E4;--color-sand-300: #F3D6AC;--color-sand-600: #8A6510;--color-green-100: #DDF0E4;--color-green-600: #157F3D;--color-crimson-100: #F7DEE1;--color-crimson-600: #A3182B;--color-blue-100: #DEE6FA;--color-blue-600: #2A5BD7;--color-background: var(--color-neutral-50);--color-surface: var(--color-neutral-0);--color-surface-muted: var(--color-neutral-100);--color-border: var(--color-neutral-200);--color-border-strong: var(--color-neutral-300);--color-foreground: var(--color-neutral-950);--color-foreground-secondary: var(--color-neutral-700);--color-foreground-muted: var(--color-neutral-600);--color-foreground-disabled: var(--color-neutral-400);--color-primary: var(--color-orange-500);--color-primary-hover: var(--color-orange-600);--color-primary-foreground: var(--color-neutral-0);--color-primary-subtle: var(--color-orange-50);--color-primary-border: var(--color-orange-200);--color-success: var(--color-green-600);--color-success-subtle: var(--color-green-100);--color-warning: var(--color-sand-600);--color-warning-subtle: var(--color-sand-300);--color-danger: var(--color-crimson-600);--color-danger-subtle: var(--color-crimson-100);--color-info: var(--color-blue-600);--color-info-subtle: var(--color-blue-100);--color-grant: var(--color-sand-600);--color-purchased: var(--color-neutral-950);--shadow-overlay-color: rgb(29 29 27 / 20%);--font-display: var(--boost33-font-display, Outfit), ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-sans: var(--boost33-font-sans, Inter), ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono: var(--boost33-font-mono, "Geist Mono"), ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--text-3xs: 9px;--text-2xs: 11px;--text-xs: 12px;--text-sm: 13px;--text-base: 15px;--text-md: 16px;--text-lg: 18px;--text-xl: 20px;--text-2xl: 24px;--text-3xl: 30px;--text-4xl: 36px;--text-5xl: 46px;--text-6xl: 60px;--text-7xl: 78px;--text-nav-label: 14px;--text-settings-group-label: 10px;--font-weight-light: 300;--font-weight-regular: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--tracking-tighter: -.03em;--tracking-tight: -.02em;--tracking-normal: 0em;--tracking-wide: .04em;--tracking-wider: .09em;--tracking-caps: .05em;--tracking-settings-title: -.01em;--leading-none: 100%;--leading-tight: 120%;--leading-snug: 135%;--leading-normal: 150%;--leading-relaxed: 170%;--breakpoint-mobile: 390px;--breakpoint-desktop: 1440px;--container-sidebar: 264px;--container-sidebar-rail: 56px;--container-command-palette: 560px;--container-content: 1440px;--container-account-menu: 312px;--container-notification-panel: 360px;--spacing-1: 4px;--spacing-2: 8px;--spacing-3: 12px;--spacing-4: 16px;--spacing-4_5: 18px;--spacing-5: 20px;--spacing-6: 24px;--spacing-7: 28px;--spacing-8: 32px;--spacing-10: 40px;--spacing-11: 44px;--spacing-12: 48px;--spacing-16: 64px;--spacing-20: 80px;--spacing-2_5: 10px;--spacing-5_5: 22px;--spacing-1_5: 6px;--spacing-1_25: 5px;--spacing-0_5: 2px;--spacing-2_25: 9px;--spacing-3_5: 14px;--spacing-0_25: 1px;--spacing-settings-crumb: 7px;--spacing-topup-reserve: 68px;--spacing-wallet-segment-min: 3px;--spacing-9_5: 38px;--radius-none: 0px;--radius-xs: 2px;--radius-sm: 3px;--radius-md: 4px;--radius-lg: 6px;--radius-xl: 8px;--radius-2xl: 12px;--radius-full: 9999px;--radius-product-tile: 25%}._root_1y1aa_41{container-type:inline-size}._frame_1y1aa_47{display:flex;min-height:100vh;background:var(--color-background);color:var(--color-foreground);font-family:var(--font-sans)}._sidebar_1y1aa_59{display:flex;box-sizing:border-box;width:var(--container-sidebar);flex-shrink:0;flex-direction:column;padding:0 var(--spacing-3);border-right:1px solid var(--color-border);background:var(--color-neutral-50)}._sidebar_1y1aa_59 a{text-decoration:none}._back_1y1aa_76{display:flex;align-items:center;gap:var(--spacing-2_5);padding:var(--spacing-4) var(--spacing-2_5) var(--spacing-3_5);color:var(--color-foreground)}._backLabel_1y1aa_84{font-size:var(--text-nav-label);font-weight:var(--font-weight-semibold);line-height:var(--spacing-4_5)}._glyph_1y1aa_91{display:block;width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0}._title_1y1aa_99{padding:var(--spacing-2_5) var(--spacing-2_5) var(--spacing-4)}._titleText_1y1aa_103{font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-settings-title);line-height:var(--spacing-6)}._group_1y1aa_112{display:flex;flex-direction:column;gap:var(--spacing-0_25)}._group_1y1aa_112+._group_1y1aa_112{padding-top:var(--spacing-5)}._groupLabel_1y1aa_124{padding:0 var(--spacing-2_5) var(--spacing-2)}._groupLabelText_1y1aa_128{color:var(--color-foreground-muted);font-size:var(--text-settings-group-label);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-caps);line-height:var(--spacing-3);text-transform:uppercase}._item_1y1aa_140{display:flex;align-items:center;gap:var(--spacing-2_5);padding:var(--spacing-2) var(--spacing-2_5);border-radius:var(--radius-lg);color:var(--color-foreground-muted)}._item_1y1aa_140[aria-current=page]{background:var(--color-surface);color:var(--color-foreground)}._icon_1y1aa_157{display:flex;width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;align-items:center;justify-content:center}._icon_1y1aa_157>svg{width:100%;height:100%}._label_1y1aa_171{flex-grow:1;color:var(--color-foreground-secondary);font-size:var(--text-nav-label);font-weight:var(--font-weight-regular);line-height:var(--spacing-4)}._item_1y1aa_140[aria-current=page] ._label_1y1aa_171{color:var(--color-foreground);font-weight:var(--font-weight-semibold)}._swatch_1y1aa_186{width:var(--spacing-4);height:var(--spacing-4);flex-shrink:0;border-radius:var(--radius-md);background:var(--color-neutral-300)}._spacer_1y1aa_195{flex-grow:1}._signOut_1y1aa_201{margin-bottom:var(--spacing-4)}._column_1y1aa_207{display:flex;min-width:0;flex-basis:0;flex-direction:column;flex-grow:1}._header_1y1aa_216{display:flex;box-sizing:border-box;height:var(--spacing-12);flex-shrink:0;align-items:center;justify-content:space-between;padding:0 var(--spacing-5);border-bottom:1px solid var(--color-border)}._headerStart_1y1aa_227{display:flex;align-items:center;gap:var(--spacing-3)}._panelMark_1y1aa_237{display:flex;color:var(--color-foreground-muted)}._crumbs_1y1aa_244{display:flex;align-items:center;gap:var(--spacing-settings-crumb);margin:0;padding:0;font-size:var(--text-sm);line-height:var(--spacing-4);list-style:none}._crumbStep_1y1aa_255{display:flex;align-items:center;gap:var(--spacing-settings-crumb)}._crumb_1y1aa_244{color:var(--color-foreground-muted);text-decoration:none}._crumbSeparator_1y1aa_266{color:var(--color-foreground-disabled)}._crumbCurrent_1y1aa_270{color:var(--color-foreground);font-weight:var(--font-weight-semibold);text-decoration:none}._headerEnd_1y1aa_276,._helpLinks_1y1aa_282{display:flex;align-items:center;gap:var(--spacing-4_5)}._helpLink_1y1aa_282{color:var(--color-foreground-secondary);font-size:var(--text-sm);line-height:var(--leading-normal);text-decoration:none}._content_1y1aa_298{display:flex;flex-direction:column;flex-grow:1;background:var(--color-surface)}._pageHead_1y1aa_307{display:flex;flex-shrink:0;align-items:flex-start;justify-content:space-between;gap:var(--spacing-6);padding:var(--spacing-7) var(--spacing-8) var(--spacing-6);border-bottom:1px solid var(--color-border);background:var(--color-surface)}._pageHeadText_1y1aa_318{display:flex;flex-direction:column;gap:var(--spacing-1)}._pageTitle_1y1aa_325{margin:0;font-family:var(--font-display);font-size:var(--text-xl);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-tight);line-height:var(--spacing-6)}._pageDescription_1y1aa_335{margin:0;color:var(--color-foreground-muted);font-size:var(--text-xs);line-height:var(--spacing-4)}@container (max-width: 767px){._frame_1y1aa_47{flex-direction:column}._sidebar_1y1aa_59{width:auto;flex-direction:row;align-items:center;gap:var(--spacing-0_5);padding:var(--spacing-1_5) var(--spacing-2);overflow-x:auto;border-right:none;border-bottom:1px solid var(--color-border);white-space:nowrap}._sidebar_1y1aa_59 a{flex-shrink:0}._title_1y1aa_99,._groupLabel_1y1aa_124,._spacer_1y1aa_195,._helpLinks_1y1aa_282,._panelMark_1y1aa_237{display:none}._group_1y1aa_112{flex-direction:row;gap:var(--spacing-0_5)}._group_1y1aa_112+._group_1y1aa_112{padding-top:0}._back_1y1aa_76,._signOut_1y1aa_201{margin:0;padding:var(--spacing-2) var(--spacing-2_5)}._header_1y1aa_216{padding:0 var(--spacing-4)}._pageHead_1y1aa_307{flex-wrap:wrap;padding:var(--spacing-5) var(--spacing-4) var(--spacing-4_5)}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boost33/ui",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "The app shell every Boost33 product renders inside.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",