@boost33/ui 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +2894 -0
  2. package/README.md +11 -12
  3. package/dist/components/AccountMenu/AccountMenu.js +66 -0
  4. package/dist/components/AccountMenu/AccountMenu.js.map +1 -0
  5. package/dist/components/AccountMenu/AccountMenu.module.css.js +42 -0
  6. package/dist/components/AccountMenu/AccountMenu.module.css.js.map +1 -0
  7. package/dist/components/AccountMenu/icons.js +32 -0
  8. package/dist/components/AccountMenu/icons.js.map +1 -0
  9. package/dist/components/AccountMenu/labels.js +14 -0
  10. package/dist/components/AccountMenu/labels.js.map +1 -0
  11. package/dist/components/CommandPalette/CommandPalette.js +65 -0
  12. package/dist/components/CommandPalette/CommandPalette.js.map +1 -0
  13. package/dist/components/CommandPalette/CommandPalette.module.css.js +34 -0
  14. package/dist/components/CommandPalette/CommandPalette.module.css.js.map +1 -0
  15. package/dist/components/CommandPalette/icons.js +23 -0
  16. package/dist/components/CommandPalette/icons.js.map +1 -0
  17. package/dist/components/CommandPalette/labels.js +19 -0
  18. package/dist/components/CommandPalette/labels.js.map +1 -0
  19. package/dist/components/LaunchLoader/LaunchLoader.d.ts +8 -4
  20. package/dist/components/LaunchLoader/LaunchLoader.js +22 -35
  21. package/dist/components/LaunchLoader/LaunchLoader.js.map +1 -1
  22. package/dist/components/LaunchLoader/LaunchLoader.module.css.js +16 -18
  23. package/dist/components/LaunchLoader/LaunchLoader.module.css.js.map +1 -1
  24. package/dist/components/NotificationCenter/NotificationCenter.js +67 -0
  25. package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -0
  26. package/dist/components/NotificationCenter/NotificationCenter.module.css.js +54 -0
  27. package/dist/components/NotificationCenter/NotificationCenter.module.css.js.map +1 -0
  28. package/dist/components/NotificationCenter/icons.js +45 -0
  29. package/dist/components/NotificationCenter/icons.js.map +1 -0
  30. package/dist/components/NotificationCenter/labels.js +26 -0
  31. package/dist/components/NotificationCenter/labels.js.map +1 -0
  32. package/dist/components/SettingsFrame/SettingsFrame.d.ts +91 -0
  33. package/dist/components/SettingsFrame/SettingsFrame.js +109 -0
  34. package/dist/components/SettingsFrame/SettingsFrame.js.map +1 -0
  35. package/dist/components/SettingsFrame/SettingsFrame.module.css.js +74 -0
  36. package/dist/components/SettingsFrame/SettingsFrame.module.css.js.map +1 -0
  37. package/dist/components/SettingsFrame/icons.d.ts +10 -0
  38. package/dist/components/SettingsFrame/icons.js +37 -0
  39. package/dist/components/SettingsFrame/icons.js.map +1 -0
  40. package/dist/components/SettingsFrame/labels.d.ts +36 -0
  41. package/dist/components/SettingsFrame/labels.js +18 -0
  42. package/dist/components/SettingsFrame/labels.js.map +1 -0
  43. package/dist/index.d.ts +18 -1
  44. package/dist/index.js +46 -32
  45. package/dist/index.js.map +1 -1
  46. package/dist/launch-gradient.d.ts +27 -103
  47. package/dist/launch-gradient.js +4 -56
  48. package/dist/launch-gradient.js.map +1 -1
  49. package/dist/style.css +1 -1
  50. package/package.json +3 -2
@@ -0,0 +1,74 @@
1
+ const a = "_root_1y1aa_41", e = "_frame_1y1aa_47", _ = "_sidebar_1y1aa_59", t = "_back_1y1aa_76", c = "_backLabel_1y1aa_84", n = "_glyph_1y1aa_91", r = "_title_1y1aa_99", o = "_titleText_1y1aa_103", s = "_group_1y1aa_112", p = "_groupLabel_1y1aa_124", l = "_groupLabelText_1y1aa_128", y = "_item_1y1aa_140", b = "_icon_1y1aa_157", u = "_label_1y1aa_171", i = "_swatch_1y1aa_186", g = "_spacer_1y1aa_195", m = "_signOut_1y1aa_201", d = "_column_1y1aa_207", h = "_header_1y1aa_216", k = "_headerStart_1y1aa_227", L = "_panelMark_1y1aa_237", T = "_crumbs_1y1aa_244", x = "_crumbStep_1y1aa_255", S = "_crumb_1y1aa_244", H = "_crumbSeparator_1y1aa_266", f = "_crumbCurrent_1y1aa_270", w = "_headerEnd_1y1aa_276", C = "_helpLinks_1y1aa_282", D = "_helpLink_1y1aa_282", E = "_content_1y1aa_298", M = "_pageHead_1y1aa_307", O = "_pageHeadText_1y1aa_318", j = "_pageTitle_1y1aa_325", q = "_pageDescription_1y1aa_335", v = {
2
+ root: a,
3
+ frame: e,
4
+ sidebar: _,
5
+ back: t,
6
+ backLabel: c,
7
+ glyph: n,
8
+ title: r,
9
+ titleText: o,
10
+ group: s,
11
+ groupLabel: p,
12
+ groupLabelText: l,
13
+ item: y,
14
+ icon: b,
15
+ label: u,
16
+ swatch: i,
17
+ spacer: g,
18
+ signOut: m,
19
+ column: d,
20
+ header: h,
21
+ headerStart: k,
22
+ panelMark: L,
23
+ crumbs: T,
24
+ crumbStep: x,
25
+ crumb: S,
26
+ crumbSeparator: H,
27
+ crumbCurrent: f,
28
+ headerEnd: w,
29
+ helpLinks: C,
30
+ helpLink: D,
31
+ content: E,
32
+ pageHead: M,
33
+ pageHeadText: O,
34
+ pageTitle: j,
35
+ pageDescription: q
36
+ };
37
+ export {
38
+ t as back,
39
+ c as backLabel,
40
+ d as column,
41
+ E as content,
42
+ S as crumb,
43
+ f as crumbCurrent,
44
+ H as crumbSeparator,
45
+ x as crumbStep,
46
+ T as crumbs,
47
+ v as default,
48
+ e as frame,
49
+ n as glyph,
50
+ s as group,
51
+ p as groupLabel,
52
+ l as groupLabelText,
53
+ h as header,
54
+ w as headerEnd,
55
+ k as headerStart,
56
+ D as helpLink,
57
+ C as helpLinks,
58
+ b as icon,
59
+ y as item,
60
+ u as label,
61
+ q as pageDescription,
62
+ M as pageHead,
63
+ O as pageHeadText,
64
+ j as pageTitle,
65
+ L as panelMark,
66
+ a as root,
67
+ _ as sidebar,
68
+ m as signOut,
69
+ g as spacer,
70
+ i as swatch,
71
+ r as title,
72
+ o as titleText
73
+ };
74
+ //# sourceMappingURL=SettingsFrame.module.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsFrame.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,10 @@
1
+ import { ReactElement } from 'react';
2
+ export declare function ArrowLeftGlyph({ className }: {
3
+ className?: string;
4
+ }): ReactElement;
5
+ export declare function SignOutGlyph({ className }: {
6
+ className?: string;
7
+ }): ReactElement;
8
+ export declare function PanelGlyph({ className }: {
9
+ className?: string;
10
+ }): ReactElement;
@@ -0,0 +1,37 @@
1
+ import { jsxs as n, jsx as t } from "react/jsx-runtime";
2
+ const h = {
3
+ viewBox: "0 0 24 24",
4
+ fill: "none",
5
+ stroke: "currentColor",
6
+ strokeWidth: "2",
7
+ strokeLinecap: "round",
8
+ strokeLinejoin: "round",
9
+ "aria-hidden": !0
10
+ };
11
+ function e({ className: r }) {
12
+ return /* @__PURE__ */ n("svg", { className: r, ...h, children: [
13
+ /* @__PURE__ */ t("path", { d: "M5 12l14 0" }),
14
+ /* @__PURE__ */ t("path", { d: "M5 12l6 6" }),
15
+ /* @__PURE__ */ t("path", { d: "M5 12l6 -6" })
16
+ ] });
17
+ }
18
+ function o({ className: r }) {
19
+ return /* @__PURE__ */ n("svg", { className: r, ...h, children: [
20
+ /* @__PURE__ */ t("path", { d: "M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2" }),
21
+ /* @__PURE__ */ t("path", { d: "M9 12h12l-3 -3" }),
22
+ /* @__PURE__ */ t("path", { d: "M18 15l3 -3" })
23
+ ] });
24
+ }
25
+ function d({ className: r }) {
26
+ return /* @__PURE__ */ n("svg", { className: r, ...h, children: [
27
+ /* @__PURE__ */ t("path", { d: "M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z" }),
28
+ /* @__PURE__ */ t("path", { d: "M9 4v16" }),
29
+ /* @__PURE__ */ t("path", { d: "M15 10l-2 2l2 2" })
30
+ ] });
31
+ }
32
+ export {
33
+ e as ArrowLeftGlyph,
34
+ d as PanelGlyph,
35
+ o as SignOutGlyph
36
+ };
37
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sources":["../../../src/components/SettingsFrame/icons.tsx"],"sourcesContent":["// The settings frame's own three glyphs: the back arrow, the sign-out door and\n// the header's panel mark. Drawn in `currentColor` so the element around each\n// one carries its ink -- the same arrangement as AccountMenu/icons.tsx and\n// AppSwitcher/icons.tsx, and what keeps the no-hardcoded-hex guard satisfied.\n//\n// All three are decorative. The back link and the sign-out link each carry a\n// visible name beside the glyph, and the panel mark has no behaviour at all (see\n// `.panelMark` in SettingsFrame.module.css). Hence `aria-hidden` on each.\n//\n// The path data is copied verbatim from the hub's `src/lib/icons.tsx`\n// (`arrowLeft`, `signOut`, `panel`), which copied it from Paper pages 103 and\n// 104. The hub's settings chrome is this frame's referent, so the hub's paths\n// are the ones reproduced -- not a lookalike from Tabler's current release.\n//\n// A host's sidebar glyphs are NOT here. Which picture labels \"Billing\" or\n// \"Call routing\" is the host's knowledge, and a frame that held a glyph per\n// settings page would have to learn what every product's pages are. Items take\n// `icon` as a ReactNode instead -- see `SettingsFrameItem`.\n\nimport type { ReactElement } from 'react'\n\nconst COMMON = {\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: '2',\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n 'aria-hidden': true,\n} as const\n\nexport function ArrowLeftGlyph({ className }: { className?: string }): ReactElement {\n return (\n <svg className={className} {...COMMON}>\n <path d=\"M5 12l14 0\" />\n <path d=\"M5 12l6 6\" />\n <path d=\"M5 12l6 -6\" />\n </svg>\n )\n}\n\nexport function SignOutGlyph({ className }: { className?: string }): ReactElement {\n return (\n <svg className={className} {...COMMON}>\n <path d=\"M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2\" />\n <path d=\"M9 12h12l-3 -3\" />\n <path d=\"M18 15l3 -3\" />\n </svg>\n )\n}\n\nexport function PanelGlyph({ className }: { className?: string }): ReactElement {\n return (\n <svg className={className} {...COMMON}>\n <path d=\"M4 4m0 2a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2z\" />\n <path d=\"M9 4v16\" />\n <path d=\"M15 10l-2 2l2 2\" />\n </svg>\n )\n}\n"],"names":["COMMON","ArrowLeftGlyph","className","jsxs","jsx","SignOutGlyph","PanelGlyph"],"mappings":";AAqBA,MAAMA,IAAS;AAAA,EACb,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AACjB;AAEO,SAASC,EAAe,EAAE,WAAAC,KAAmD;AAClF,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAAD,GAAuB,GAAGF,GAC7B,UAAA;AAAA,IAAA,gBAAAI,EAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,IACrB,gBAAAA,EAAC,QAAA,EAAK,GAAE,YAAA,CAAY;AAAA,IACpB,gBAAAA,EAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,EAAA,GACvB;AAEJ;AAEO,SAASC,EAAa,EAAE,WAAAH,KAAmD;AAChF,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAAD,GAAuB,GAAGF,GAC7B,UAAA;AAAA,IAAA,gBAAAI,EAAC,QAAA,EAAK,GAAE,kFAAA,CAAkF;AAAA,IAC1F,gBAAAA,EAAC,QAAA,EAAK,GAAE,iBAAA,CAAiB;AAAA,IACzB,gBAAAA,EAAC,QAAA,EAAK,GAAE,cAAA,CAAc;AAAA,EAAA,GACxB;AAEJ;AAEO,SAASE,EAAW,EAAE,WAAAJ,KAAmD;AAC9E,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAAD,GAAuB,GAAGF,GAC7B,UAAA;AAAA,IAAA,gBAAAI,EAAC,QAAA,EAAK,GAAE,kFAAA,CAAkF;AAAA,IAC1F,gBAAAA,EAAC,QAAA,EAAK,GAAE,UAAA,CAAU;AAAA,IAClB,gBAAAA,EAAC,QAAA,EAAK,GAAE,kBAAA,CAAkB;AAAA,EAAA,GAC5B;AAEJ;"}
@@ -0,0 +1,36 @@
1
+ /** Every user-facing string the settings frame renders that is not host data. */
2
+ export interface SettingsFrameLabels {
3
+ /** The visible title at the head of the sidebar. Default "Settings". */
4
+ title: string;
5
+ /**
6
+ * The sidebar's landmark name. A `<nav>` is announced by its name, and a page
7
+ * with two navs (this one and the breadcrumb) needs both named or a screen
8
+ * reader lists "navigation" twice. Default "Settings", matching the hub.
9
+ */
10
+ navigation: string;
11
+ /** The heading over the other-accounts list. Default "Other accounts". */
12
+ otherAccounts: string;
13
+ /** The sign-out link. Default "Sign out". */
14
+ signOut: string;
15
+ /** The breadcrumb's landmark name. Default "Breadcrumb". */
16
+ breadcrumb: string;
17
+ }
18
+ /**
19
+ * The English defaults. A consumer that passes nothing renders English.
20
+ *
21
+ * Frozen because it is a public export reaching four products on a version bump;
22
+ * see AccountMenu/labels.ts for why the freeze carries no type annotation.
23
+ */
24
+ export declare const defaultSettingsFrameLabels: Readonly<{
25
+ title: string;
26
+ navigation: string;
27
+ otherAccounts: string;
28
+ signOut: string;
29
+ breadcrumb: string;
30
+ }>;
31
+ /**
32
+ * Merge a consumer's partial `labels` onto the English defaults, treating an
33
+ * explicitly-`undefined` field as unsupplied -- the resolution every other
34
+ * labels module here performs (B33-873).
35
+ */
36
+ export declare function resolveSettingsFrameLabels(labels?: Partial<SettingsFrameLabels>): SettingsFrameLabels;
@@ -0,0 +1,18 @@
1
+ const r = Object.freeze({
2
+ title: "Settings",
3
+ navigation: "Settings",
4
+ otherAccounts: "Other accounts",
5
+ signOut: "Sign out",
6
+ breadcrumb: "Breadcrumb"
7
+ });
8
+ function i(e) {
9
+ const t = Object.fromEntries(
10
+ Object.entries(e ?? {}).filter(([, n]) => n !== void 0)
11
+ );
12
+ return { ...r, ...t };
13
+ }
14
+ export {
15
+ r as defaultSettingsFrameLabels,
16
+ i as resolveSettingsFrameLabels
17
+ };
18
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sources":["../../../src/components/SettingsFrame/labels.ts"],"sourcesContent":["// The settings frame's own user-facing words.\n//\n// Everything else a person reads in the frame is data the host supplies and so\n// translates by construction: the back link's label, every group's label, every\n// item's label, the other accounts' names, the help links, the breadcrumb and\n// the page heading. Those are the host's because they differ per host -- the hub\n// says \"Back to the hub\" and a product says something else, and which groups\n// exist is the whole point of taking groups as data (B33-1529). What is left is\n// what is the same in every host: the sidebar's title and landmark name, the\n// heading over the other accounts, the sign-out link and the breadcrumb's\n// landmark name.\n//\n// It takes the label contract AccountMenu, NotificationCenter and the chip use,\n// in full, on day one:\n//\n// * `labels` is `Partial<SettingsFrameLabels>`, so a later field costs no\n// consumer a typecheck (CLAUDE.md, \"Versioning\");\n// * `resolveSettingsFrameLabels` filters explicitly-`undefined` fields before\n// merging, so a missed next-intl key falls back to English instead of\n// unnaming a landmark (B33-873);\n// * `defaultSettingsFrameLabels` is `Object.freeze({ ... } satisfies ...)`\n// with no type annotation, so the freeze survives into the emitted `.d.ts`\n// (B33-877, B33-916).\n//\n// No label carries a value, so none of the chip's `%placeholder%` machinery is\n// reproduced. If one arrives, it arrives delimited `%name%`, never `{name}`\n// (B33-1277; the reasoning is in `src/fill-template.ts`).\n\n/** Every user-facing string the settings frame renders that is not host data. */\nexport interface SettingsFrameLabels {\n /** The visible title at the head of the sidebar. Default \"Settings\". */\n title: string\n /**\n * The sidebar's landmark name. A `<nav>` is announced by its name, and a page\n * with two navs (this one and the breadcrumb) needs both named or a screen\n * reader lists \"navigation\" twice. Default \"Settings\", matching the hub.\n */\n navigation: string\n /** The heading over the other-accounts list. Default \"Other accounts\". */\n otherAccounts: string\n /** The sign-out link. Default \"Sign out\". */\n signOut: string\n /** The breadcrumb's landmark name. Default \"Breadcrumb\". */\n breadcrumb: string\n}\n\n/**\n * The English defaults. A consumer that passes nothing renders English.\n *\n * Frozen because it is a public export reaching four products on a version bump;\n * see AccountMenu/labels.ts for why the freeze carries no type annotation.\n */\nexport const defaultSettingsFrameLabels = Object.freeze({\n title: 'Settings',\n navigation: 'Settings',\n otherAccounts: 'Other accounts',\n signOut: 'Sign out',\n breadcrumb: 'Breadcrumb',\n} satisfies SettingsFrameLabels)\n\n/**\n * Merge a consumer's partial `labels` onto the English defaults, treating an\n * explicitly-`undefined` field as unsupplied -- the resolution every other\n * labels module here performs (B33-873).\n */\nexport function resolveSettingsFrameLabels(labels?: Partial<SettingsFrameLabels>): SettingsFrameLabels {\n const supplied = Object.fromEntries(\n Object.entries(labels ?? {}).filter(([, value]) => value !== undefined),\n ) as Partial<SettingsFrameLabels>\n return { ...defaultSettingsFrameLabels, ...supplied }\n}\n"],"names":["defaultSettingsFrameLabels","resolveSettingsFrameLabels","labels","supplied","value"],"mappings":"AAoDO,MAAMA,IAA6B,OAAO,OAAO;AAAA,EACtD,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,SAAS;AAAA,EACT,YAAY;AACd,CAA+B;AAOxB,SAASC,EAA2BC,GAA4D;AACrG,QAAMC,IAAW,OAAO;AAAA,IACtB,OAAO,QAAQD,KAAU,EAAE,EAAE,OAAO,CAAC,CAAA,EAAGE,CAAK,MAAMA,MAAU,MAAS;AAAA,EAAA;AAExE,SAAO,EAAE,GAAGJ,GAA4B,GAAGG,EAAA;AAC7C;"}
package/dist/index.d.ts CHANGED
@@ -24,11 +24,28 @@ export { AppSwitcher } from './components/AppSwitcher/AppSwitcher';
24
24
  export type { AppSwitcherProps, AppSwitcherProduct, AppSwitcherHub, AppSwitcherAccount, } from './components/AppSwitcher/AppSwitcher';
25
25
  export { defaultAppSwitcherLabels } from './components/AppSwitcher/labels';
26
26
  export type { AppSwitcherLabels } from './components/AppSwitcher/labels';
27
+ export { NotificationCenter } from './components/NotificationCenter/NotificationCenter';
28
+ export type { NotificationCenterProps, NotificationCenterItem, } from './components/NotificationCenter/NotificationCenter';
29
+ export { defaultNotificationCenterLabels } from './components/NotificationCenter/labels';
30
+ export type { NotificationCenterLabels } from './components/NotificationCenter/labels';
31
+ export { AccountMenu } from './components/AccountMenu/AccountMenu';
32
+ export type { AccountMenuProps, AccountMenuPerson, AccountMenuOrg, AccountMenuGroup, AccountMenuItem, } from './components/AccountMenu/AccountMenu';
33
+ export { defaultAccountMenuLabels } from './components/AccountMenu/labels';
34
+ export type { AccountMenuLabels } from './components/AccountMenu/labels';
35
+ export type { AccountMenuIcon } from './components/AccountMenu/icons';
36
+ export { CommandPalette } from './components/CommandPalette/CommandPalette';
37
+ export type { CommandPaletteProps, CommandPaletteGroup, CommandPaletteResult, } from './components/CommandPalette/CommandPalette';
38
+ export { defaultCommandPaletteLabels } from './components/CommandPalette/labels';
39
+ export type { CommandPaletteLabels } from './components/CommandPalette/labels';
27
40
  export { DotMatrixLoader } from './components/DotMatrixLoader/DotMatrixLoader';
28
41
  export type { DotMatrixLoaderProps } from './components/DotMatrixLoader/DotMatrixLoader';
29
42
  export { LaunchLoader } from './components/LaunchLoader/LaunchLoader';
30
43
  export type { LaunchLoaderProps } from './components/LaunchLoader/LaunchLoader';
31
- export { launchBackdropCss, launchGround, launchSolid } from './launch-gradient';
44
+ export { launchBackdropCss } from './launch-gradient';
32
45
  export type { LaunchGradientStops } from './launch-gradient';
46
+ export { SettingsFrame } from './components/SettingsFrame/SettingsFrame';
47
+ export type { SettingsFrameProps, SettingsFrameGroup, SettingsFrameItem, SettingsFrameAccount, SettingsFrameLink, SettingsFrameCrumb, SettingsFrameHeading, } from './components/SettingsFrame/SettingsFrame';
48
+ export { defaultSettingsFrameLabels } from './components/SettingsFrame/labels';
49
+ export type { SettingsFrameLabels } from './components/SettingsFrame/labels';
33
50
  export { checkNavHeightBudget, navContentHeight, navBudgetForViewport } from './nav-height-budget';
34
51
  export type { NavHeightBudget, NavRowCosts, NavSectionShape } from './nav-height-budget';
package/dist/index.js CHANGED
@@ -1,44 +1,58 @@
1
1
  /* empty css */
2
2
  import { Sidebar as t } from "./components/Sidebar/Sidebar.js";
3
- import { NavSection as a } from "./components/NavSection/NavSection.js";
3
+ import { NavSection as p } from "./components/NavSection/NavSection.js";
4
4
  import { Wordmark as f } from "./components/Wordmark/Wordmark.js";
5
- import { BOOST33_MARK_MIN_LEGIBLE_PX as d, Boost33Mark as l } from "./components/Boost33Mark/Boost33Mark.js";
6
- import { ProductMark as c, hasProductMark as i } from "./components/ProductMark/ProductMark.js";
7
- import { NavItem as n } from "./components/NavItem/NavItem.js";
5
+ import { BOOST33_MARK_MIN_LEGIBLE_PX as l, Boost33Mark as i } from "./components/Boost33Mark/Boost33Mark.js";
6
+ import { ProductMark as d, hasProductMark as c } from "./components/ProductMark/ProductMark.js";
7
+ import { NavItem as s } from "./components/NavItem/NavItem.js";
8
8
  import { WalletChip as L } from "./components/WalletChip/WalletChip.js";
9
- import { defaultWalletChipLabels as k } from "./components/WalletChip/labels.js";
10
- import { TopBar as M } from "./components/TopBar/TopBar.js";
11
- import { PageHeader as v } from "./components/PageHeader/PageHeader.js";
12
- import { AppShell as C } from "./components/AppShell/AppShell.js";
9
+ import { defaultWalletChipLabels as M } from "./components/WalletChip/labels.js";
10
+ import { TopBar as b } from "./components/TopBar/TopBar.js";
11
+ import { PageHeader as B } from "./components/PageHeader/PageHeader.js";
12
+ import { AppShell as A } from "./components/AppShell/AppShell.js";
13
13
  import { AppSwitcher as P } from "./components/AppSwitcher/AppSwitcher.js";
14
- import { defaultAppSwitcherLabels as b } from "./components/AppSwitcher/labels.js";
15
- import { DotMatrixLoader as H } from "./components/DotMatrixLoader/DotMatrixLoader.js";
16
- import { LaunchLoader as W } from "./components/LaunchLoader/LaunchLoader.js";
17
- import { launchBackdropCss as G, launchGround as O, launchSolid as T } from "./launch-gradient.js";
18
- import { checkNavHeightBudget as F, navBudgetForViewport as K, navContentHeight as R } from "./nav-height-budget.js";
14
+ import { defaultAppSwitcherLabels as _ } from "./components/AppSwitcher/labels.js";
15
+ import { NotificationCenter as F } from "./components/NotificationCenter/NotificationCenter.js";
16
+ import { defaultNotificationCenterLabels as I } from "./components/NotificationCenter/labels.js";
17
+ import { AccountMenu as E } from "./components/AccountMenu/AccountMenu.js";
18
+ import { defaultAccountMenuLabels as T } from "./components/AccountMenu/labels.js";
19
+ import { CommandPalette as G } from "./components/CommandPalette/CommandPalette.js";
20
+ import { defaultCommandPaletteLabels as R } from "./components/CommandPalette/labels.js";
21
+ import { DotMatrixLoader as X } from "./components/DotMatrixLoader/DotMatrixLoader.js";
22
+ import { LaunchLoader as q } from "./components/LaunchLoader/LaunchLoader.js";
23
+ import { launchBackdropCss as z } from "./launch-gradient.js";
24
+ import { SettingsFrame as Q } from "./components/SettingsFrame/SettingsFrame.js";
25
+ import { defaultSettingsFrameLabels as Y } from "./components/SettingsFrame/labels.js";
26
+ import { checkNavHeightBudget as $, navBudgetForViewport as oo, navContentHeight as ro } from "./nav-height-budget.js";
19
27
  export {
20
- C as AppShell,
28
+ E as AccountMenu,
29
+ A as AppShell,
21
30
  P as AppSwitcher,
22
- d as BOOST33_MARK_MIN_LEGIBLE_PX,
23
- l as Boost33Mark,
24
- H as DotMatrixLoader,
25
- W as LaunchLoader,
26
- n as NavItem,
27
- a as NavSection,
28
- v as PageHeader,
29
- c as ProductMark,
31
+ l as BOOST33_MARK_MIN_LEGIBLE_PX,
32
+ i as Boost33Mark,
33
+ G as CommandPalette,
34
+ X as DotMatrixLoader,
35
+ q as LaunchLoader,
36
+ s as NavItem,
37
+ p as NavSection,
38
+ F as NotificationCenter,
39
+ B as PageHeader,
40
+ d as ProductMark,
41
+ Q as SettingsFrame,
30
42
  t as Sidebar,
31
- M as TopBar,
43
+ b as TopBar,
32
44
  L as WalletChip,
33
45
  f as Wordmark,
34
- F as checkNavHeightBudget,
35
- b as defaultAppSwitcherLabels,
36
- k as defaultWalletChipLabels,
37
- i as hasProductMark,
38
- G as launchBackdropCss,
39
- O as launchGround,
40
- T as launchSolid,
41
- K as navBudgetForViewport,
42
- R as navContentHeight
46
+ $ as checkNavHeightBudget,
47
+ T as defaultAccountMenuLabels,
48
+ _ as defaultAppSwitcherLabels,
49
+ R as defaultCommandPaletteLabels,
50
+ I as defaultNotificationCenterLabels,
51
+ Y as defaultSettingsFrameLabels,
52
+ M as defaultWalletChipLabels,
53
+ c as hasProductMark,
54
+ z as launchBackdropCss,
55
+ oo as navBudgetForViewport,
56
+ ro as navContentHeight
43
57
  };
44
58
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,112 +1,36 @@
1
1
  /**
2
- * The destination product's four gradient stops, ordered darkest first.
3
- *
4
- * The order is a contract, not a style choice, and it carries the screen's
5
- * contrast:
6
- *
7
- * - `stops[0]` is the darkest tone, and the flat colour `prefers-contrast`
8
- * paints.
9
- * - `stops[1]` and the mixes between it and `stops[0]` are the tones behind
10
- * the loader, the bar and the caption. Both must stay at or under relative
11
- * luminance 0.183 (linearised sRGB), the ceiling for white text at 4.5:1:
12
- * the caption sits straight on the mesh with no plate behind it.
13
- * - `stops[2]` is the one light accent, a glow low on the screen, clear of the
14
- * content. `stops[3]` is not painted at all (see launchRamp); it stays in
15
- * the tuple so a palette is still four colours, darkest first.
16
- *
17
- * The values are the consumer's: this package knows no product and holds no
18
- * product's colours (CLAUDE.md). scripts/launch-contrast-check.mts measures the
19
- * composited result behind the content in a real browser.
2
+ * @deprecated Ignored since 0.5.1 (B33-1401). The launch screen is the same
3
+ * Boost33 background for every product, built into `LaunchLoader`, so there are
4
+ * no per-product stops to pass. The type stays so a consumer on `^0.5.0` that
5
+ * still declares its colour map keeps compiling; drop the map and stop passing
6
+ * it.
20
7
  */
21
8
  export type LaunchGradientStops = readonly [string, string, string, string];
22
9
  /**
23
- * The six tones the mesh is painted in, all derived from the four stops, so the
24
- * stops contract and palette-agnosticism both survive. `stops[3]` is not used:
25
- * on Score it is near-white, and it is what blew out every composition that
26
- * included it.
10
+ * The launch screen's ground as a raw CSS string, for a consumer to inline in a
11
+ * `<style>` block with no stylesheet request.
27
12
  *
28
- * The mix percentages are tuned in sRGB to reproduce the three Score mixes
29
- * Jamal approved in Paper on 14 Oct 2026 (recorded on B33-1389) to within a few
30
- * levels a channel; Paper's own figures are not an sRGB mix at round
31
- * percentages. They are mixes rather than hexes so Wallet's greens take the
32
- * same shape.
33
- */
34
- export interface LaunchRamp {
35
- /** stops[0]. The darkest shape. */
36
- r0: string;
37
- r1: string;
38
- /** The mesh's ground, under every shape and behind its blurred edges. */
39
- r2: string;
40
- /** stops[1]. */
41
- r3: string;
42
- r4: string;
43
- /** stops[2]. The one light glow, low on the screen. */
44
- accent: string;
45
- }
46
- export declare function launchRamp(stops: LaunchGradientStops): LaunchRamp;
47
- /**
48
- * One shape in the mesh: a solid tone with an irregular radius, placed and
49
- * sized as a percentage of the mesh container, which overhangs the viewport by
50
- * 12% on every side.
51
- */
52
- export interface LaunchMeshShape {
53
- top: number;
54
- left: number;
55
- width: number;
56
- height: number;
57
- tone: keyof LaunchRamp;
58
- radius: string;
59
- rotate: number;
60
- }
61
- /**
62
- * The composition Jamal approved in Paper on 14 Oct 2026, in paint order. A lit
63
- * left field, a dark diagonal channel through the centre, a soft lit sweep
64
- * down the right edge, one accent glow along the bottom. The dark channel is
65
- * what sits behind the content, so the caption's contrast holds by the
66
- * composition rather than by tuning -- scripts/launch-contrast-check.mts
67
- * measures it.
13
+ * LaunchLoader paints its own background -- black, with one orange glow --
14
+ * from the package stylesheet, identically on both sides of a hub-to-product
15
+ * navigation. This paints the one thing that can show before that stylesheet
16
+ * and the markup arrive: the root in the same black, so the first frame is
17
+ * already the screen's ground rather than white.
68
18
  *
69
- * Solid shapes melted by one blur on their container, not gradients: stacked
70
- * radial-gradients never covered the field, and the ground showing between
71
- * them read as holes. Irregular radii and rotation give the sweeping edges.
72
- */
73
- export declare const LAUNCH_MESH: readonly LaunchMeshShape[];
74
- /**
75
- * One shape's inline style. Built here rather than in the component so the CSS
76
- * it assembles sits beside the rest of the mesh's CSS text, outside the
77
- * no-hardcoded-strings scan of src/components.
78
- */
79
- export declare function launchShapeStyle(shape: LaunchMeshShape, ramp: LaunchRamp): {
80
- top: string;
81
- left: string;
82
- width: string;
83
- height: string;
84
- borderRadius: string;
85
- transform: string | undefined;
86
- background: string;
87
- };
88
- /** How far the mesh container overhangs the viewport on every side, as a fraction of it. */
89
- export declare const LAUNCH_MESH_OVERHANG = 0.12;
90
- /**
91
- * The ground the mesh sits on, as a CSS colour: the tone its blurred edges
92
- * fade into, so the blur never darkens or lightens the viewport's rim.
93
- */
94
- export declare function launchGround(stops: LaunchGradientStops): string;
95
- /** The flat colour `prefers-contrast` paints instead of the gradient: the darkest stop. */
96
- export declare function launchSolid(stops: LaunchGradientStops): string;
97
- /**
98
- * The launch screen's ground as a raw CSS string, for a consumer to inline in
99
- * a `<style>` block with no stylesheet request (B33-1389).
19
+ * `stops` is ignored and kept only so the 0.5.0 call shape,
20
+ * `launchBackdropCss(stops)` or `launchBackdropCss(stops, selector)`, still
21
+ * compiles; `launchBackdropCss()` is the call to write now. `selector` defaults
22
+ * to `html`.
100
23
  *
101
- * The mesh itself is markup -- LaunchLoader renders its shapes with inline
102
- * styles -- so it paints in the same HTML chunk as the component, on both sides
103
- * of a hub-to-product navigation, from the same props: that is what keeps the
104
- * hop seamless now. This paints the one thing that can show before that markup
105
- * parses: the root in the mesh's own ground colour, so the first frame is
106
- * already the screen's base tone rather than white.
24
+ * The `(prefers-contrast)` branch paints the same black the default does. It is
25
+ * redundant today and kept on purpose: it is the branch the component honours
26
+ * too, and keeping the output's shape means the day the two paths differ again
27
+ * is a value change here, not a new rule a consumer has never inlined.
107
28
  *
108
- * `selector` defaults to `html`. The contrast branch is the boolean
109
- * `(prefers-contrast)`, not `(prefers-contrast: more)`, and paints the flat
110
- * darkest stop, as the component does.
29
+ * The selector is the one thing still interpolated. It is the caller's own
30
+ * literal, never served data -- the stops were the value that would have come
31
+ * from a registry, and they are no longer written anywhere -- so it is not
32
+ * checked. Do not feed it from a request.
111
33
  */
112
- export declare function launchBackdropCss(stops: LaunchGradientStops, selector?: string): string;
34
+ export declare function launchBackdropCss(
35
+ /** @deprecated Ignored since 0.5.1. Call `launchBackdropCss()`. */
36
+ _stops?: LaunchGradientStops, selector?: string): string;
@@ -1,60 +1,8 @@
1
- const d = /^[#a-zA-Z0-9(),.%\s/+-]+$/;
2
- function i(t) {
3
- if (t.length !== 4)
4
- throw new Error(`LaunchLoader takes exactly four gradient stops, got ${t.length}`);
5
- for (const r of t)
6
- if (!d.test(r))
7
- throw new Error(`LaunchLoader: ${JSON.stringify(r)} is not a CSS colour this package will inline`);
8
- return t;
9
- }
10
- function u(t) {
11
- const [r, o, e] = i(t), n = (a, h, c) => `color-mix(in srgb, ${a} ${h}%, ${c})`;
12
- return {
13
- r0: r,
14
- r1: n(r, 85, o),
15
- r2: n(r, 67, o),
16
- r3: o,
17
- r4: n(o, 64, e),
18
- accent: e
19
- };
20
- }
21
- const g = [
22
- { top: 40, left: 22, width: 80, height: 58, tone: "r1", radius: "30% 70% 40% 60% / 72% 36% 64% 28%", rotate: -5 },
23
- { top: -20, left: 52, width: 72, height: 66, tone: "r0", radius: "70% 30% 26% 74% / 40% 70% 30% 60%", rotate: 12 },
24
- { top: 4, left: -6, width: 44, height: 42, tone: "r3", radius: "46% 54% 60% 40% / 52% 48% 52% 48%", rotate: 0 },
25
- { top: -24, left: -20, width: 78, height: 56, tone: "r4", radius: "26% 74% 60% 40% / 68% 32% 66% 34%", rotate: -11 },
26
- { top: 64, left: 50, width: 72, height: 56, tone: "accent", radius: "36% 64% 74% 26% / 62% 28% 72% 38%", rotate: 20 },
27
- { top: 64, left: -22, width: 70, height: 52, tone: "r3", radius: "74% 26% 56% 44% / 34% 66% 32% 68%", rotate: -6 },
28
- { top: 4, left: 76, width: 54, height: 88, tone: "r3", radius: "62% 38% 28% 72% / 36% 64% 36% 64%", rotate: -10 },
29
- { top: -22, left: 86, width: 52, height: 54, tone: "r4", radius: "38% 62% 70% 30% / 58% 34% 66% 42%", rotate: 22 }
30
- ];
31
- function s(t, r) {
32
- return {
33
- top: `${t.top}%`,
34
- left: `${t.left}%`,
35
- width: `${t.width}%`,
36
- height: `${t.height}%`,
37
- borderRadius: t.radius,
38
- transform: t.rotate ? `rotate(${t.rotate}deg)` : void 0,
39
- background: r[t.tone]
40
- };
41
- }
42
- function l(t) {
43
- return u(t).r2;
44
- }
45
- function f(t) {
46
- return i(t)[0];
47
- }
48
- function w(t, r = "html") {
49
- const o = l(t), e = f(t);
50
- return `${r}{min-height:100%;background-color:${o}}@media (prefers-contrast){${r}{background-color:${e}}}`;
1
+ const r = "var(--color-neutral-1000,black)";
2
+ function n(c, o = "html") {
3
+ return `${o}{min-height:100%;background-color:${r}}@media (prefers-contrast){${o}{background-color:${r}}}`;
51
4
  }
52
5
  export {
53
- g as LAUNCH_MESH,
54
- w as launchBackdropCss,
55
- l as launchGround,
56
- u as launchRamp,
57
- s as launchShapeStyle,
58
- f as launchSolid
6
+ n as launchBackdropCss
59
7
  };
60
8
  //# sourceMappingURL=launch-gradient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"launch-gradient.js","sources":["../src/launch-gradient.ts"],"sourcesContent":["/*\n * LaunchLoader's background, as data and CSS text (B33-1389). Beside the\n * components rather than inside one, the way nav-height-budget.ts is: it\n * renders nothing, and what it assembles is CSS a consumer inlines, not copy a\n * person reads -- so it sits outside the no-hardcoded-strings scan, which reads\n * src/components for rendered words.\n */\n\n/**\n * The destination product's four gradient stops, ordered darkest first.\n *\n * The order is a contract, not a style choice, and it carries the screen's\n * contrast:\n *\n * - `stops[0]` is the darkest tone, and the flat colour `prefers-contrast`\n * paints.\n * - `stops[1]` and the mixes between it and `stops[0]` are the tones behind\n * the loader, the bar and the caption. Both must stay at or under relative\n * luminance 0.183 (linearised sRGB), the ceiling for white text at 4.5:1:\n * the caption sits straight on the mesh with no plate behind it.\n * - `stops[2]` is the one light accent, a glow low on the screen, clear of the\n * content. `stops[3]` is not painted at all (see launchRamp); it stays in\n * the tuple so a palette is still four colours, darkest first.\n *\n * The values are the consumer's: this package knows no product and holds no\n * product's colours (CLAUDE.md). scripts/launch-contrast-check.mts measures the\n * composited result behind the content in a real browser.\n */\nexport type LaunchGradientStops = readonly [string, string, string, string]\n\n/*\n * A stop is written straight into CSS, and launchBackdropCss's output is meant\n * to be inlined in a <style> block in the first HTML chunk. A value carrying\n * `;`, `{`, `}` or `<` could close the declaration, the rule or the element and\n * write whatever follows. Stops will come from a served registry, not a literal,\n * so this is checked rather than trusted: hex, a colour function, or a keyword,\n * and nothing that can leave the declaration.\n */\nconst SAFE_COLOR = /^[#a-zA-Z0-9(),.%\\s/+-]+$/\n\nfunction checkedStops(stops: LaunchGradientStops): LaunchGradientStops {\n if (stops.length !== 4) {\n throw new Error(`LaunchLoader takes exactly four gradient stops, got ${stops.length}`)\n }\n for (const stop of stops) {\n if (!SAFE_COLOR.test(stop)) {\n throw new Error(`LaunchLoader: ${JSON.stringify(stop)} is not a CSS colour this package will inline`)\n }\n }\n return stops\n}\n\n/**\n * The six tones the mesh is painted in, all derived from the four stops, so the\n * stops contract and palette-agnosticism both survive. `stops[3]` is not used:\n * on Score it is near-white, and it is what blew out every composition that\n * included it.\n *\n * The mix percentages are tuned in sRGB to reproduce the three Score mixes\n * Jamal approved in Paper on 14 Oct 2026 (recorded on B33-1389) to within a few\n * levels a channel; Paper's own figures are not an sRGB mix at round\n * percentages. They are mixes rather than hexes so Wallet's greens take the\n * same shape.\n */\nexport interface LaunchRamp {\n /** stops[0]. The darkest shape. */\n r0: string\n r1: string\n /** The mesh's ground, under every shape and behind its blurred edges. */\n r2: string\n /** stops[1]. */\n r3: string\n r4: string\n /** stops[2]. The one light glow, low on the screen. */\n accent: string\n}\n\nexport function launchRamp(stops: LaunchGradientStops): LaunchRamp {\n const [s0, s1, s2] = checkedStops(stops)\n const mix = (a: string, pc: number, b: string) => `color-mix(in srgb, ${a} ${pc}%, ${b})`\n return {\n r0: s0,\n r1: mix(s0, 85, s1),\n r2: mix(s0, 67, s1),\n r3: s1,\n r4: mix(s1, 64, s2),\n accent: s2,\n }\n}\n\n/**\n * One shape in the mesh: a solid tone with an irregular radius, placed and\n * sized as a percentage of the mesh container, which overhangs the viewport by\n * 12% on every side.\n */\nexport interface LaunchMeshShape {\n top: number\n left: number\n width: number\n height: number\n tone: keyof LaunchRamp\n radius: string\n rotate: number\n}\n\n/**\n * The composition Jamal approved in Paper on 14 Oct 2026, in paint order. A lit\n * left field, a dark diagonal channel through the centre, a soft lit sweep\n * down the right edge, one accent glow along the bottom. The dark channel is\n * what sits behind the content, so the caption's contrast holds by the\n * composition rather than by tuning -- scripts/launch-contrast-check.mts\n * measures it.\n *\n * Solid shapes melted by one blur on their container, not gradients: stacked\n * radial-gradients never covered the field, and the ground showing between\n * them read as holes. Irregular radii and rotation give the sweeping edges.\n */\nexport const LAUNCH_MESH: readonly LaunchMeshShape[] = [\n { top: 40, left: 22, width: 80, height: 58, tone: 'r1', radius: '30% 70% 40% 60% / 72% 36% 64% 28%', rotate: -5 },\n { top: -20, left: 52, width: 72, height: 66, tone: 'r0', radius: '70% 30% 26% 74% / 40% 70% 30% 60%', rotate: 12 },\n { top: 4, left: -6, width: 44, height: 42, tone: 'r3', radius: '46% 54% 60% 40% / 52% 48% 52% 48%', rotate: 0 },\n { top: -24, left: -20, width: 78, height: 56, tone: 'r4', radius: '26% 74% 60% 40% / 68% 32% 66% 34%', rotate: -11 },\n { top: 64, left: 50, width: 72, height: 56, tone: 'accent', radius: '36% 64% 74% 26% / 62% 28% 72% 38%', rotate: 20 },\n { top: 64, left: -22, width: 70, height: 52, tone: 'r3', radius: '74% 26% 56% 44% / 34% 66% 32% 68%', rotate: -6 },\n { top: 4, left: 76, width: 54, height: 88, tone: 'r3', radius: '62% 38% 28% 72% / 36% 64% 36% 64%', rotate: -10 },\n { top: -22, left: 86, width: 52, height: 54, tone: 'r4', radius: '38% 62% 70% 30% / 58% 34% 66% 42%', rotate: 22 },\n]\n\n/**\n * One shape's inline style. Built here rather than in the component so the CSS\n * it assembles sits beside the rest of the mesh's CSS text, outside the\n * no-hardcoded-strings scan of src/components.\n */\nexport function launchShapeStyle(shape: LaunchMeshShape, ramp: LaunchRamp) {\n return {\n top: `${shape.top}%`,\n left: `${shape.left}%`,\n width: `${shape.width}%`,\n height: `${shape.height}%`,\n borderRadius: shape.radius,\n transform: shape.rotate ? `rotate(${shape.rotate}deg)` : undefined,\n background: ramp[shape.tone],\n }\n}\n\n/** How far the mesh container overhangs the viewport on every side, as a fraction of it. */\nexport const LAUNCH_MESH_OVERHANG = 0.12\n\n/**\n * The ground the mesh sits on, as a CSS colour: the tone its blurred edges\n * fade into, so the blur never darkens or lightens the viewport's rim.\n */\nexport function launchGround(stops: LaunchGradientStops): string {\n return launchRamp(stops).r2\n}\n\n/** The flat colour `prefers-contrast` paints instead of the gradient: the darkest stop. */\nexport function launchSolid(stops: LaunchGradientStops): string {\n return checkedStops(stops)[0]\n}\n\n/**\n * The launch screen's ground as a raw CSS string, for a consumer to inline in\n * a `<style>` block with no stylesheet request (B33-1389).\n *\n * The mesh itself is markup -- LaunchLoader renders its shapes with inline\n * styles -- so it paints in the same HTML chunk as the component, on both sides\n * of a hub-to-product navigation, from the same props: that is what keeps the\n * hop seamless now. This paints the one thing that can show before that markup\n * parses: the root in the mesh's own ground colour, so the first frame is\n * already the screen's base tone rather than white.\n *\n * `selector` defaults to `html`. The contrast branch is the boolean\n * `(prefers-contrast)`, not `(prefers-contrast: more)`, and paints the flat\n * darkest stop, as the component does.\n */\nexport function launchBackdropCss(stops: LaunchGradientStops, selector = 'html'): string {\n const ground = launchGround(stops)\n const solid = launchSolid(stops)\n return `${selector}{min-height:100%;background-color:${ground}}` + `@media (prefers-contrast){${selector}{background-color:${solid}}}`\n}\n"],"names":["SAFE_COLOR","checkedStops","stops","stop","launchRamp","s0","s1","s2","mix","pc","b","LAUNCH_MESH","launchShapeStyle","shape","ramp","launchGround","launchSolid","launchBackdropCss","selector","ground","solid"],"mappings":"AAsCA,MAAMA,IAAa;AAEnB,SAASC,EAAaC,GAAiD;AACrE,MAAIA,EAAM,WAAW;AACnB,UAAM,IAAI,MAAM,uDAAuDA,EAAM,MAAM,EAAE;AAEvF,aAAWC,KAAQD;AACjB,QAAI,CAACF,EAAW,KAAKG,CAAI;AACvB,YAAM,IAAI,MAAM,iBAAiB,KAAK,UAAUA,CAAI,CAAC,+CAA+C;AAGxG,SAAOD;AACT;AA2BO,SAASE,EAAWF,GAAwC;AACjE,QAAM,CAACG,GAAIC,GAAIC,CAAE,IAAIN,EAAaC,CAAK,GACjCM,IAAM,CAAC,GAAWC,GAAYC,MAAc,sBAAsB,CAAC,IAAID,CAAE,MAAMC,CAAC;AACtF,SAAO;AAAA,IACL,IAAIL;AAAA,IACJ,IAAIG,EAAIH,GAAI,IAAIC,CAAE;AAAA,IAClB,IAAIE,EAAIH,GAAI,IAAIC,CAAE;AAAA,IAClB,IAAIA;AAAA,IACJ,IAAIE,EAAIF,GAAI,IAAIC,CAAE;AAAA,IAClB,QAAQA;AAAA,EAAA;AAEZ;AA6BO,MAAMI,IAA0C;AAAA,EACrD,EAAE,KAAK,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,MAAM,QAAQ,qCAAqC,QAAQ,GAAA;AAAA,EAC7G,EAAE,KAAK,KAAK,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,MAAM,QAAQ,qCAAqC,QAAQ,GAAA;AAAA,EAC9G,EAAE,KAAK,GAAG,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,MAAM,QAAQ,qCAAqC,QAAQ,EAAA;AAAA,EAC5G,EAAE,KAAK,KAAK,MAAM,KAAK,OAAO,IAAI,QAAQ,IAAI,MAAM,MAAM,QAAQ,qCAAqC,QAAQ,IAAA;AAAA,EAC/G,EAAE,KAAK,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,UAAU,QAAQ,qCAAqC,QAAQ,GAAA;AAAA,EACjH,EAAE,KAAK,IAAI,MAAM,KAAK,OAAO,IAAI,QAAQ,IAAI,MAAM,MAAM,QAAQ,qCAAqC,QAAQ,GAAA;AAAA,EAC9G,EAAE,KAAK,GAAG,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,MAAM,QAAQ,qCAAqC,QAAQ,IAAA;AAAA,EAC5G,EAAE,KAAK,KAAK,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,MAAM,QAAQ,qCAAqC,QAAQ,GAAA;AAChH;AAOO,SAASC,EAAiBC,GAAwBC,GAAkB;AACzE,SAAO;AAAA,IACL,KAAK,GAAGD,EAAM,GAAG;AAAA,IACjB,MAAM,GAAGA,EAAM,IAAI;AAAA,IACnB,OAAO,GAAGA,EAAM,KAAK;AAAA,IACrB,QAAQ,GAAGA,EAAM,MAAM;AAAA,IACvB,cAAcA,EAAM;AAAA,IACpB,WAAWA,EAAM,SAAS,UAAUA,EAAM,MAAM,SAAS;AAAA,IACzD,YAAYC,EAAKD,EAAM,IAAI;AAAA,EAAA;AAE/B;AASO,SAASE,EAAab,GAAoC;AAC/D,SAAOE,EAAWF,CAAK,EAAE;AAC3B;AAGO,SAASc,EAAYd,GAAoC;AAC9D,SAAOD,EAAaC,CAAK,EAAE,CAAC;AAC9B;AAiBO,SAASe,EAAkBf,GAA4BgB,IAAW,QAAgB;AACvF,QAAMC,IAASJ,EAAab,CAAK,GAC3BkB,IAAQJ,EAAYd,CAAK;AAC/B,SAAO,GAAGgB,CAAQ,qCAAqCC,CAAM,8BAAmCD,CAAQ,qBAAqBE,CAAK;AACpI;"}
1
+ {"version":3,"file":"launch-gradient.js","sources":["../src/launch-gradient.ts"],"sourcesContent":["/*\n * LaunchLoader's backdrop CSS, as text (B33-1389, B33-1401). Beside the\n * components rather than inside one, the way nav-height-budget.ts is: it\n * renders nothing, and what it assembles is CSS a consumer inlines, not copy a\n * person reads -- so it sits outside the no-hardcoded-strings scan, which reads\n * src/components for rendered words.\n */\n\n/**\n * @deprecated Ignored since 0.5.1 (B33-1401). The launch screen is the same\n * Boost33 background for every product, built into `LaunchLoader`, so there are\n * no per-product stops to pass. The type stays so a consumer on `^0.5.0` that\n * still declares its colour map keeps compiling; drop the map and stop passing\n * it.\n */\nexport type LaunchGradientStops = readonly [string, string, string, string]\n\n/*\n * The ground every launch screen is painted on: --color-neutral-1000, the\n * charte's primary black, which tokens.css reserves for \"the logo and dark\n * ground\". Written as the token with a keyword fallback, because this string is\n * inlined in the first HTML chunk precisely so it paints before any stylesheet\n * arrives -- and before one arrives, the token does not exist. `black` is the\n * same value tokens.css declares for it (tests/launch-loader.test.tsx holds the\n * two together); a keyword rather than a hex because no hex lives in src/\n * outside the token sheets (tests/guards.test.ts).\n */\nconst LAUNCH_GROUND = 'var(--color-neutral-1000,black)'\n\n/**\n * The launch screen's ground as a raw CSS string, for a consumer to inline in a\n * `<style>` block with no stylesheet request.\n *\n * LaunchLoader paints its own background -- black, with one orange glow --\n * from the package stylesheet, identically on both sides of a hub-to-product\n * navigation. This paints the one thing that can show before that stylesheet\n * and the markup arrive: the root in the same black, so the first frame is\n * already the screen's ground rather than white.\n *\n * `stops` is ignored and kept only so the 0.5.0 call shape,\n * `launchBackdropCss(stops)` or `launchBackdropCss(stops, selector)`, still\n * compiles; `launchBackdropCss()` is the call to write now. `selector` defaults\n * to `html`.\n *\n * The `(prefers-contrast)` branch paints the same black the default does. It is\n * redundant today and kept on purpose: it is the branch the component honours\n * too, and keeping the output's shape means the day the two paths differ again\n * is a value change here, not a new rule a consumer has never inlined.\n *\n * The selector is the one thing still interpolated. It is the caller's own\n * literal, never served data -- the stops were the value that would have come\n * from a registry, and they are no longer written anywhere -- so it is not\n * checked. Do not feed it from a request.\n */\nexport function launchBackdropCss(\n /** @deprecated Ignored since 0.5.1. Call `launchBackdropCss()`. */\n _stops?: LaunchGradientStops,\n selector = 'html',\n): string {\n return (\n `${selector}{min-height:100%;background-color:${LAUNCH_GROUND}}` +\n `@media (prefers-contrast){${selector}{background-color:${LAUNCH_GROUND}}}`\n )\n}\n"],"names":["LAUNCH_GROUND","launchBackdropCss","_stops","selector"],"mappings":"AA2BA,MAAMA,IAAgB;AA2Bf,SAASC,EAEdC,GACAC,IAAW,QACH;AACR,SACE,GAAGA,CAAQ,qCAAqCH,CAAa,8BAChCG,CAAQ,qBAAqBH,CAAa;AAE3E;"}