@burdenoff/fe-libs 2026.1021.6 → 2026.1021.7

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.
@@ -1,5 +1,5 @@
1
- import { useThemeOrNull as e } from "../../providers/shell/ThemeProvider.js";
2
- import { useI18n as t } from "../../providers/shell/I18nProvider.js";
1
+ import { useI18n as e } from "../../providers/shell/I18nProvider.js";
2
+ import { useThemeOrNull as t } from "../../providers/shell/ThemeProvider.js";
3
3
  import { useAuthToken as n } from "../../providers/shell/AuthTokenProvider.js";
4
4
  import "../../../shared-providers-shell.js";
5
5
  import { useAssistantControl as r } from "../appControls/useAssistantControl.js";
@@ -130,7 +130,7 @@ var Ti = () => () => {}, Ei = () => "off", Di = ({ visible: Di = !0, writeAccess
130
130
  productWriteApproval: F,
131
131
  capabilities: r ? n.sandboxWriteCapabilities[r] : null
132
132
  });
133
- }, [F]), { getAccessToken: I, getWorkspaceToken: Fi, userId: L } = n(), { locale: R, isLocaleLoading: Ii } = t(), Li = g((e) => e.voiceGraceMs), Ri = g((e) => e.handsFreeInterrupt), zi = g((e) => e.handsFreeStreamNoticeAccepted), Bi = g((e) => e.acceptHandsFreeStreamNotice), Vi = g((e) => e.assistantLanguage), Hi = g((e) => e.replyLanguage), Ui = D(() => S(Vi, Hi, R), [
133
+ }, [F]), { getAccessToken: I, getWorkspaceToken: Fi, userId: L } = n(), { locale: R, isLocaleLoading: Ii } = e(), Li = g((e) => e.voiceGraceMs), Ri = g((e) => e.handsFreeInterrupt), zi = g((e) => e.handsFreeStreamNoticeAccepted), Bi = g((e) => e.acceptHandsFreeStreamNotice), Vi = g((e) => e.assistantLanguage), Hi = g((e) => e.replyLanguage), Ui = D(() => S(Vi, Hi, R), [
134
134
  Vi,
135
135
  Hi,
136
136
  R
@@ -535,7 +535,7 @@ var Ti = () => () => {}, Ei = () => "off", Di = ({ visible: Di = !0, writeAccess
535
535
  V,
536
536
  ta,
537
537
  M
538
- ]), jo = e(), { speakFinishedReply: Mo, speakingMessageId: No, stop: Po } = hn(), Fo = O(null), Io = T((e, t) => {
538
+ ]), jo = t(), { speakFinishedReply: Mo, speakingMessageId: No, stop: Po } = hn(), Fo = O(null), Io = T((e, t) => {
539
539
  let n = Fo.current;
540
540
  n?.token === e && n.exchange === null && (n.exchange = t);
541
541
  }, []), Lo = T((e) => {
@@ -1,9 +1,9 @@
1
1
  import { useGatewayClient as e } from "../graphql/GatewayContext.js";
2
2
  import "../../shared-graphql.js";
3
- import { useAuth as t } from "../providers/shell/AuthProvider.js";
4
- import { useActiveContext as n } from "../providers/shell/ActiveContextProvider.js";
5
- import { Card as r, CardContent as ee } from "../../ui/card.js";
6
- import { useI18n as te } from "../providers/shell/I18nProvider.js";
3
+ import { useI18n as t } from "../providers/shell/I18nProvider.js";
4
+ import { useAuth as n } from "../providers/shell/AuthProvider.js";
5
+ import { useActiveContext as r } from "../providers/shell/ActiveContextProvider.js";
6
+ import { Card as ee, CardContent as te } from "../../ui/card.js";
7
7
  import "../../ui.js";
8
8
  import { usePageConversationContext as ne } from "../providers/shell/PageConversationContextProvider.js";
9
9
  import "../../shared-providers-shell.js";
@@ -26,7 +26,7 @@ import { useQuery as h } from "@apollo/client/react";
26
26
  import { useNavigate as ge } from "react-router";
27
27
  //#region src/shared/components/ContextConversationWidget.tsx
28
28
  function g({ className: g, widgetKey: _ }) {
29
- let { t: v } = te(), { workspaceId: y } = n(), b = t(), x = ne(), S = e("workspace"), C = ge(), [w, T] = f(null), [E, D] = f(null), [O, k] = f(""), [A, _e] = f(() => typeof window < "u" ? window.innerWidth < 768 : !1), [j, M] = f(null), [N, P] = f(null), [F, I] = f(""), [L, R] = f(null), [z, B] = f([]), V = he(null), H = d(() => (e, t) => {
29
+ let { t: v } = t(), { workspaceId: y } = r(), b = n(), x = ne(), S = e("workspace"), C = ge(), [w, T] = f(null), [E, D] = f(null), [O, k] = f(""), [A, _e] = f(() => typeof window < "u" ? window.innerWidth < 768 : !1), [j, M] = f(null), [N, P] = f(null), [F, I] = f(""), [L, R] = f(null), [z, B] = f([]), V = he(null), H = d(() => (e, t) => {
30
30
  let n = v(e);
31
31
  return n === e ? t : n;
32
32
  }, [v]), U = b.user?.id ?? null, W = _ ?? x.widgetKey ?? "default", G = d(() => {
@@ -139,7 +139,7 @@ function g({ className: g, widgetKey: _ }) {
139
139
  }, Se = async () => {
140
140
  !N || !F.trim() || (await X.saveEdit(N, F.trim()), P(null), I(""));
141
141
  };
142
- return /* @__PURE__ */ m(r, {
142
+ return /* @__PURE__ */ m(ee, {
143
143
  className: g,
144
144
  children: [/* @__PURE__ */ p(me, {
145
145
  conversationTitle: K.data?.conversation?.title,
@@ -159,7 +159,7 @@ function g({ className: g, widgetKey: _ }) {
159
159
  },
160
160
  onOpenInbox: () => w && C(`/conversations/${w}`),
161
161
  tr: H
162
- }), !A && /* @__PURE__ */ m(ee, {
162
+ }), !A && /* @__PURE__ */ m(te, {
163
163
  className: "space-y-4",
164
164
  children: [
165
165
  L && /* @__PURE__ */ p("div", {
@@ -1,5 +1,5 @@
1
- import { QUOTA_EXHAUSTED_CODE as e } from "../utils/quotaErrors.js";
2
- import { useOptionalI18n as t } from "../providers/shell/I18nProvider.js";
1
+ import { useOptionalI18n as e } from "../providers/shell/I18nProvider.js";
2
+ import { QUOTA_EXHAUSTED_CODE as t } from "../utils/quotaErrors.js";
3
3
  import { dispatchUpgradePrompt as n } from "./UpgradePromptModal.js";
4
4
  import { quotaExhaustedEventName as r } from "../assistant/quota.js";
5
5
  import { useEffect as i, useRef as a } from "react";
@@ -61,7 +61,7 @@ function v(e, t) {
61
61
  return n.displayName = `withQuotaDialogOwnership(${e.displayName ?? e.name ?? "Component"})`, n;
62
62
  }
63
63
  function y({ product: o, copy: s }) {
64
- let d = t()?.t, f = a({
64
+ let d = e()?.t, f = a({
65
65
  copy: s,
66
66
  translate: d
67
67
  });
@@ -72,28 +72,28 @@ function y({ product: o, copy: s }) {
72
72
  };
73
73
  }, [s, d]), i(() => {
74
74
  if (!o || typeof window > "u") return;
75
- let t = r(o), i = /* @__PURE__ */ new Set(), a = (e, t) => {
75
+ let e = r(o), i = /* @__PURE__ */ new Set(), a = (e, t) => {
76
76
  let n = f.current.translate;
77
77
  if (!e || !n) return t;
78
78
  let r = n(e, t);
79
79
  return r && r !== e ? r : t;
80
- }, s = (t) => {
81
- let r = c(t), s = l(t), d = g(o), p = setTimeout(() => {
80
+ }, s = (e) => {
81
+ let r = c(e), s = l(e), d = g(o), p = setTimeout(() => {
82
82
  if (i.delete(p), d()) return;
83
- let t = u(f.current.copy, r);
83
+ let e = u(f.current.copy, r);
84
84
  n({
85
85
  extensions: s ? {
86
- code: e,
86
+ code: t,
87
87
  quotaName: s
88
- } : { code: e },
89
- title: a(t.titleKey, t.title),
90
- description: a(t.messageKey, t.message)
88
+ } : { code: t },
89
+ title: a(e.titleKey, e.title),
90
+ description: a(e.messageKey, e.message)
91
91
  });
92
92
  }, 0);
93
93
  i.add(p);
94
94
  };
95
- return window.addEventListener(t, s), () => {
96
- window.removeEventListener(t, s);
95
+ return window.addEventListener(e, s), () => {
96
+ window.removeEventListener(e, s);
97
97
  for (let e of i) clearTimeout(e);
98
98
  i.clear();
99
99
  };
@@ -1,7 +1,7 @@
1
1
  import { useSafeGatewayClient as e } from "../graphql/GatewayContext.js";
2
- import { useAuth as t } from "../providers/shell/AuthProvider.js";
3
- import { useActiveContext as n } from "../providers/shell/ActiveContextProvider.js";
4
- import { useI18n as r } from "../providers/shell/I18nProvider.js";
2
+ import { useI18n as t } from "../providers/shell/I18nProvider.js";
3
+ import { useAuth as n } from "../providers/shell/AuthProvider.js";
4
+ import { useActiveContext as r } from "../providers/shell/ActiveContextProvider.js";
5
5
  import { PermissionProvider as i, usePermissions as a, useSafePermissions as o } from "../providers/shell/PermissionProvider.js";
6
6
  import { MODELS as s, PROVIDERS as c, SUMMARY as l, catalog as u, sevenDays as d, summary as f } from "./ai/contracts.js";
7
7
  import { useAiTr as p } from "./ai/i18n.js";
@@ -35,15 +35,15 @@ function C({ productName: t, productId: n }) {
35
35
  });
36
36
  }
37
37
  function w({ children: e }) {
38
- let t = o(), { workspaceId: r } = n();
38
+ let t = o(), { workspaceId: n } = r();
39
39
  return t ? e : /* @__PURE__ */ x(i, {
40
- scopeId: r ?? null,
40
+ scopeId: n ?? null,
41
41
  gateway: "workspace",
42
42
  children: e
43
43
  });
44
44
  }
45
45
  function T({ productId: e, client: i }) {
46
- let o = t(), { workspaceId: C } = n(), w = a(), { locale: T } = r(), E = p(), D = v(() => ({
46
+ let o = n(), { workspaceId: C } = r(), w = a(), { locale: T } = t(), E = p(), D = v(() => ({
47
47
  workspaceId: C ?? "",
48
48
  actorId: o.user?.id ?? "",
49
49
  profileId: o.activeProfileId,
@@ -1,8 +1,8 @@
1
1
  import { graphqlFetch as e } from "../../graphql/fetch.js";
2
2
  import "../../../shared-graphql.js";
3
- import { useAuth as t } from "./AuthProvider.js";
4
- import { getDefaultTranslationPersistence as n } from "./translationStore.js";
5
- import { I18nProvider as r, useI18n as i } from "./I18nProvider.js";
3
+ import { getDefaultTranslationPersistence as t } from "./translationStore.js";
4
+ import { I18nProvider as n, useI18n as r } from "./I18nProvider.js";
5
+ import { useAuth as i } from "./AuthProvider.js";
6
6
  import { DEFAULT_PLATFORM_I18N_PRODUCT_ID as a, createLayeredTranslationLoader as o, effectivePlatformId as s, translationCacheScope as c } from "./translationLayers.js";
7
7
  import { useCallback as l, useMemo as u } from "react";
8
8
  import { jsx as d } from "react/jsx-runtime";
@@ -29,24 +29,24 @@ async function m(t, n) {
29
29
  return JSON.parse(a);
30
30
  }
31
31
  function h({ children: e }) {
32
- let { dir: t } = i();
32
+ let { dir: t } = r();
33
33
  return /* @__PURE__ */ d(f, {
34
34
  dir: t,
35
35
  children: e
36
36
  });
37
37
  }
38
- function g({ children: e, i18nProductId: i, platformI18nProductId: f = a, defaultLocale: p = "en", fallbackTranslations: g, disableDynamicFetch: _ = !1, persistTranslations: v = !0, directionMode: y = "off" }) {
39
- let { user: b } = t(), x = b?.id ?? null, S = !_, C = s(i, f), w = l((e) => g?.[e] ?? {}, [g]), T = u(() => o({
40
- productId: i,
38
+ function g({ children: e, i18nProductId: r, platformI18nProductId: f = a, defaultLocale: p = "en", fallbackTranslations: g, disableDynamicFetch: _ = !1, persistTranslations: v = !0, directionMode: y = "off" }) {
39
+ let { user: b } = i(), x = b?.id ?? null, S = !_, C = s(r, f), w = l((e) => g?.[e] ?? {}, [g]), T = u(() => o({
40
+ productId: r,
41
41
  platformId: C,
42
42
  fallback: w,
43
43
  fetchDictionary: m
44
44
  }), [
45
45
  w,
46
- i,
46
+ r,
47
47
  C
48
- ]), E = u(() => S && v ? n() : null, [v, S]);
49
- return /* @__PURE__ */ d(r, {
48
+ ]), E = u(() => S && v ? t() : null, [v, S]);
49
+ return /* @__PURE__ */ d(n, {
50
50
  defaultLocale: p,
51
51
  translations: u(() => g ?? {
52
52
  en: {},
@@ -60,7 +60,7 @@ function g({ children: e, i18nProductId: i, platformI18nProductId: f = a, defaul
60
60
  ar: {}
61
61
  }, [g]),
62
62
  loadTranslations: S ? T : void 0,
63
- cacheScope: c(i, C),
63
+ cacheScope: c(r, C),
64
64
  persistence: E,
65
65
  firstPaintHoldMs: E ? 150 : 0,
66
66
  directionMode: y,
@@ -1,9 +1,9 @@
1
- import { useAuth as e } from "./shared/providers/shell/AuthProvider.js";
2
- import { useActiveContext as t } from "./shared/providers/shell/ActiveContextProvider.js";
3
- import { useNavRegistryStore as n } from "./shared/hooks/shell/useNavRegistry.js";
4
- import { useFooterRegistryStore as r } from "./shared/hooks/shell/useFooterRegistry.js";
5
- import { useTheme as i, useThemeOrNull as a } from "./shared/providers/shell/ThemeProvider.js";
6
- import { useI18n as o } from "./shared/providers/shell/I18nProvider.js";
1
+ import { useI18n as e } from "./shared/providers/shell/I18nProvider.js";
2
+ import { useAuth as t } from "./shared/providers/shell/AuthProvider.js";
3
+ import { useActiveContext as n } from "./shared/providers/shell/ActiveContextProvider.js";
4
+ import { useNavRegistryStore as r } from "./shared/hooks/shell/useNavRegistry.js";
5
+ import { useFooterRegistryStore as i } from "./shared/hooks/shell/useFooterRegistry.js";
6
+ import { useTheme as a, useThemeOrNull as o } from "./shared/providers/shell/ThemeProvider.js";
7
7
  import { useFeatureFlags as s } from "./shared/feature-flags/FeatureFlagProvider.js";
8
8
  import { useGlobalUi as c } from "./shared/providers/shell/GlobalUiProvider.js";
9
9
  import { useShellUi as l } from "./shared/providers/shell/ShellUiProvider.js";
@@ -13,4 +13,4 @@ import { useEffectiveContext as f, useEffectiveWorkspaceId as p } from "./shared
13
13
  import { useGlobalSearch as m } from "./shared/hooks/shell/useGlobalSearch.js";
14
14
  import { useProducts as h } from "./shared/hooks/shell/useProducts.js";
15
15
  import { useLanguages as g } from "./shared/hooks/shell/useLanguages.js";
16
- export { t as useActiveContext, e as useAuth, u as useContextManager, f as useEffectiveContext, p as useEffectiveWorkspaceId, s as useFeatureFlags, r as useFooterRegistryStore, d as useGeography, m as useGlobalSearch, c as useGlobalUi, o as useI18n, g as useLanguages, n as useNavRegistryStore, h as useProducts, l as useShellUi, i as useTheme, a as useThemeOrNull };
16
+ export { n as useActiveContext, t as useAuth, u as useContextManager, f as useEffectiveContext, p as useEffectiveWorkspaceId, s as useFeatureFlags, i as useFooterRegistryStore, d as useGeography, m as useGlobalSearch, c as useGlobalUi, e as useI18n, g as useLanguages, r as useNavRegistryStore, h as useProducts, l as useShellUi, a as useTheme, o as useThemeOrNull };
@@ -2,11 +2,11 @@ import { ProfileStorageManager_exports as e, clearActiveProfileId as t, getActiv
2
2
  import { clearWorkspaceWideSelection as u, isWorkspaceWideSelection as d, selectWorkspaceWide as f } from "./shared/providers/shell/WorkspaceWideSelection.js";
3
3
  import { AuthBridgeClient as p, destroyAuthBridge as m, getAuthBridge as h, initAuthBridge as g, isAuthBridgeInitialized as _ } from "./shared/providers/shell/AuthBridgeClient.js";
4
4
  import { AppShellContextProvider as v, useAppShell as y } from "./shared/providers/shell/AppShellContext.js";
5
- import { AuthProvider as b, useAuth as x } from "./shared/providers/shell/AuthProvider.js";
6
- import { ActiveContextProvider as S, useActiveContext as C } from "./shared/providers/shell/ActiveContextProvider.js";
7
- import { ThemeProvider as w, useTheme as T } from "./shared/providers/shell/ThemeProvider.js";
8
- import { I18nProvider as E, LOCALE_DIRECTION as D, clearTranslationCache as O, isTranslationAttempted as k, localeDirection as A, useI18n as j, useOptionalI18n as M } from "./shared/providers/shell/I18nProvider.js";
9
- import { useShellLabel as N } from "./shared/providers/shell/useShellLabel.js";
5
+ import { I18nProvider as b, LOCALE_DIRECTION as x, clearTranslationCache as S, isTranslationAttempted as C, localeDirection as w, useI18n as T, useOptionalI18n as E } from "./shared/providers/shell/I18nProvider.js";
6
+ import { useShellLabel as D } from "./shared/providers/shell/useShellLabel.js";
7
+ import { AuthProvider as O, useAuth as k } from "./shared/providers/shell/AuthProvider.js";
8
+ import { ActiveContextProvider as A, useActiveContext as j } from "./shared/providers/shell/ActiveContextProvider.js";
9
+ import { ThemeProvider as M, useTheme as N } from "./shared/providers/shell/ThemeProvider.js";
10
10
  import { PermissionProvider as P, SUPER_ADMIN_ACTOR_TYPE as F, SUPER_ADMIN_ROLE as I, hasMatchingPermission as L, isSuperAdminBypass as R, matchPermission as z, usePermission as B, usePermissionLoading as V, usePermissions as H, useRole as U, useSafePermissions as W } from "./shared/providers/shell/PermissionProvider.js";
11
11
  import { FeatureFlagsProvider as G, useFeatureFlags as K } from "./shared/providers/shell/FeatureFlagsProvider.js";
12
12
  import { FeatureFlagProvider as q } from "./shared/feature-flags/FeatureFlagProvider.js";
@@ -25,4 +25,4 @@ import { GatewayRoute as ge, getMicrofrontendGateway as _e, withGateway as ve }
25
25
  import { ProfileI18nBridge as ye } from "./shared/providers/shell/ProfileI18nBridge.js";
26
26
  import { ProfileGeographyBridge as be } from "./shared/providers/shell/ProfileGeographyBridge.js";
27
27
  import { PageConversationContextProvider as xe, usePageConversationContext as Se, useRegisterPageConversationContext as Ce } from "./shared/providers/shell/PageConversationContextProvider.js";
28
- export { S as ActiveContextProvider, v as AppShellContextProvider, p as AuthBridgeClient, b as AuthProvider, fe as AuthTokenProvider, ne as ContextManagerProvider, oe as EVERYTHING_SURFACE_ID, q as FeatureFlagProvider, G as FeatureFlagsProvider, Z as FeatureGate, ge as GatewayRoute, ie as GeographyProvider, Q as GlobalUiProvider, E as I18nProvider, D as LOCALE_DIRECTION, me as MultiGatewayProvider, he as ObservabilityProvider, xe as PageConversationContextProvider, P as PermissionProvider, se as PersonaSurfaceProvider, be as ProfileGeographyBridge, ye as ProfileI18nBridge, e as ProfileStorage, F as SUPER_ADMIN_ACTOR_TYPE, I as SUPER_ADMIN_ROLE, ee as ShellUiProvider, w as ThemeProvider, t as clearActiveProfileId, O as clearTranslationCache, u as clearWorkspaceWideSelection, m as destroyAuthBridge, n as getActiveContext, r as getActiveTokens, i as getActiveUser, h as getAuthBridge, _e as getMicrofrontendGateway, a as getProfileLocale, L as hasMatchingPermission, g as initAuthBridge, _ as isAuthBridgeInitialized, R as isSuperAdminBypass, k as isTranslationAttempted, d as isWorkspaceWideSelection, A as localeDirection, o as logoutActiveProfile, z as matchPermission, s as removeAllProfiles, ce as resolveSurfaceForRoles, f as selectWorkspaceWide, c as setProfileLocale, l as setProfiles, le as synthesizeSimulatedPermissionStrings, C as useActiveContext, y as useAppShell, x as useAuth, pe as useAuthToken, re as useContextManager, J as useFeatureFlag, Y as useFeatureFlagDetails, X as useFeatureFlagValue, K as useFeatureFlags, ae as useGeography, $ as useGlobalUi, j as useI18n, M as useOptionalI18n, Se as usePageConversationContext, B as usePermission, V as usePermissionLoading, H as usePermissions, ue as usePersonaSurface, Ce as useRegisterPageConversationContext, U as useRole, W as useSafePermissions, de as useSafePersonaSurface, N as useShellLabel, te as useShellUi, T as useTheme, ve as withGateway };
28
+ export { A as ActiveContextProvider, v as AppShellContextProvider, p as AuthBridgeClient, O as AuthProvider, fe as AuthTokenProvider, ne as ContextManagerProvider, oe as EVERYTHING_SURFACE_ID, q as FeatureFlagProvider, G as FeatureFlagsProvider, Z as FeatureGate, ge as GatewayRoute, ie as GeographyProvider, Q as GlobalUiProvider, b as I18nProvider, x as LOCALE_DIRECTION, me as MultiGatewayProvider, he as ObservabilityProvider, xe as PageConversationContextProvider, P as PermissionProvider, se as PersonaSurfaceProvider, be as ProfileGeographyBridge, ye as ProfileI18nBridge, e as ProfileStorage, F as SUPER_ADMIN_ACTOR_TYPE, I as SUPER_ADMIN_ROLE, ee as ShellUiProvider, M as ThemeProvider, t as clearActiveProfileId, S as clearTranslationCache, u as clearWorkspaceWideSelection, m as destroyAuthBridge, n as getActiveContext, r as getActiveTokens, i as getActiveUser, h as getAuthBridge, _e as getMicrofrontendGateway, a as getProfileLocale, L as hasMatchingPermission, g as initAuthBridge, _ as isAuthBridgeInitialized, R as isSuperAdminBypass, C as isTranslationAttempted, d as isWorkspaceWideSelection, w as localeDirection, o as logoutActiveProfile, z as matchPermission, s as removeAllProfiles, ce as resolveSurfaceForRoles, f as selectWorkspaceWide, c as setProfileLocale, l as setProfiles, le as synthesizeSimulatedPermissionStrings, j as useActiveContext, y as useAppShell, k as useAuth, pe as useAuthToken, re as useContextManager, J as useFeatureFlag, Y as useFeatureFlagDetails, X as useFeatureFlagValue, K as useFeatureFlags, ae as useGeography, $ as useGlobalUi, T as useI18n, E as useOptionalI18n, Se as usePageConversationContext, B as usePermission, V as usePermissionLoading, H as usePermissions, ue as usePersonaSurface, Ce as useRegisterPageConversationContext, U as useRole, W as useSafePermissions, de as useSafePersonaSurface, D as useShellLabel, te as useShellUi, N as useTheme, ve as withGateway };
@@ -17,10 +17,33 @@ import { HTMLAttributes } from 'react';
17
17
  * (`--color-accent-primary`) auto-applies. All motion is CSS-based and disabled
18
18
  * under `prefers-reduced-motion` / `data-reduce-motion` (Boff UI 2.0), and a
19
19
  * short anti-flash delay avoids a flicker on sub-200ms loads.
20
+ *
21
+ * Copy is localised through the shell i18n service (`splash.*` keys, English
22
+ * fallback, never throws outside an `I18nProvider`). A shell names the step it
23
+ * is waiting on with `phase` instead of hard-coding English:
24
+ *
25
+ * <BrandedSplash phase="checkingAccess" />
26
+ * <BrandedSplash phase="signingIn" showTagline />
27
+ *
28
+ * Precedence for the status line: `label` (literal) → `phase` → `splash.default`.
20
29
  */
30
+ /** The loading steps a shell can name; each resolves the `splash.<phase>` key. */
31
+ export type BrandedSplashPhase = 'default' | 'signingIn' | 'checkingAccess' | 'validatingSession' | 'redirecting' | 'preparingDashboard';
21
32
  export interface BrandedSplashProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
22
- /** Status line under the wordmark. Defaults to "Loading <product>…". */
33
+ /**
34
+ * Literal status line under the wordmark; wins over `phase`. Defaults to the
35
+ * localised `splash.default` ("Loading <product>…").
36
+ */
23
37
  label?: string;
38
+ /** Localised status line for a named loading step (`splash.<phase>`). */
39
+ phase?: BrandedSplashPhase;
40
+ /**
41
+ * Show the product tagline under the wordmark. Text: `tagline`, else the
42
+ * localised `splash.tagline`, else the AppShell tagline. Default false.
43
+ */
44
+ showTagline?: boolean;
45
+ /** Literal tagline (implies nothing unless `showTagline` is set). */
46
+ tagline?: string;
24
47
  /** `fullscreen` (fixed overlay) or `inline` (fills its container). */
25
48
  variant?: 'fullscreen' | 'inline';
26
49
  /** Logo asset; defaults to the shell PWA icon. */
@@ -28,4 +51,4 @@ export interface BrandedSplashProps extends Omit<HTMLAttributes<HTMLDivElement>,
28
51
  /** Anti-flash delay in ms before the splash appears (0 shows immediately). */
29
52
  delayMs?: number;
30
53
  }
31
- export declare function BrandedSplash({ label, variant, logoSrc, delayMs, className, ...rest }: BrandedSplashProps): import('react/jsx-runtime').JSX.Element | null;
54
+ export declare function BrandedSplash({ label, phase, showTagline, tagline, variant, logoSrc, delayMs, className, ...rest }: BrandedSplashProps): import('react/jsx-runtime').JSX.Element | null;
@@ -1,31 +1,42 @@
1
1
  import { useAppShell as e } from "../shared/providers/shell/AppShellContext.js";
2
- import { cn as t } from "../shared-utils.js";
3
- import { useEffect as n, useState as r } from "react";
4
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
2
+ import { useShellLabel as t } from "../shared/providers/shell/useShellLabel.js";
3
+ import { cn as n } from "../shared-utils.js";
4
+ import { useEffect as r, useState as i } from "react";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
6
  //#region src/ui/branded-splash.tsx
6
- function o({ label: o, variant: s = "fullscreen", logoSrc: c = "/icons/icon.svg", delayMs: l = 150, className: u, ...d }) {
7
- let { productName: f, brandInitial: p } = e(), [m, h] = r(l <= 0), [g, _] = r(!1);
8
- if (n(() => {
9
- if (l <= 0) return;
10
- let e = setTimeout(() => h(!0), l);
7
+ function s(e, t, n) {
8
+ switch (t) {
9
+ case "signingIn": return e("splash.signingIn", "Signing you in…");
10
+ case "checkingAccess": return e("splash.checkingAccess", "Checking workspace access…");
11
+ case "validatingSession": return e("splash.validatingSession", "Validating session…");
12
+ case "redirecting": return e("splash.redirecting", "Redirecting…");
13
+ case "preparingDashboard": return e("splash.preparingDashboard", "Preparing your dashboard…");
14
+ case "default": return e("splash.default", "Loading {{product}}…", { product: n });
15
+ }
16
+ }
17
+ function c({ label: c, phase: l = "default", showTagline: u = !1, tagline: d, variant: f = "fullscreen", logoSrc: p = "/icons/icon.svg", delayMs: m = 150, className: h, ...g }) {
18
+ let { productName: _, brandInitial: v, tagline: y } = e(), b = t(), [x, S] = i(m <= 0), [C, w] = i(!1);
19
+ if (r(() => {
20
+ if (m <= 0) return;
21
+ let e = setTimeout(() => S(!0), m);
11
22
  return () => clearTimeout(e);
12
- }, [l]), !m) return null;
13
- let v = o ?? `Loading ${f}…`;
14
- return /* @__PURE__ */ a("div", {
23
+ }, [m]), !x) return null;
24
+ let T = c ?? s(b, l, _), E = u ? d ?? b("splash.tagline", y) : null;
25
+ return /* @__PURE__ */ o("div", {
15
26
  role: "status",
16
27
  "aria-live": "polite",
17
- "aria-label": v,
18
- className: t("flex flex-col items-center justify-center gap-6", s === "fullscreen" ? "fixed inset-0 z-[9000] bg-bg-canvas px-6 pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]" : "min-h-[60vh] w-full px-6 py-12", u),
19
- ...d,
28
+ "aria-label": T,
29
+ className: n("flex flex-col items-center justify-center gap-6 motion-safe:animate-in motion-safe:fade-in-0 motion-safe:duration-300", f === "fullscreen" ? "fixed inset-0 z-[9000] bg-bg-canvas px-6 pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]" : "min-h-[60vh] w-full px-6 py-12", h),
30
+ ...g,
20
31
  children: [
21
- /* @__PURE__ */ i("div", {
32
+ /* @__PURE__ */ a("div", {
22
33
  "aria-hidden": "true",
23
34
  className: "pointer-events-none absolute inset-0 -z-10",
24
35
  style: { backgroundImage: "radial-gradient(circle at 30% 25%, color-mix(in oklab, var(--color-accent-primary) 8%, transparent), transparent 55%),radial-gradient(circle at 70% 78%, color-mix(in oklab, var(--color-accent-secondary, var(--color-accent-primary)) 5%, transparent), transparent 55%)" }
25
36
  }),
26
- /* @__PURE__ */ a("div", {
37
+ /* @__PURE__ */ o("div", {
27
38
  className: "relative flex h-20 w-20 items-center justify-center",
28
- children: [/* @__PURE__ */ i("span", {
39
+ children: [/* @__PURE__ */ a("span", {
29
40
  "aria-hidden": "true",
30
41
  className: "absolute inset-0 rounded-full motion-safe:animate-spin",
31
42
  style: {
@@ -33,32 +44,38 @@ function o({ label: o, variant: s = "fullscreen", logoSrc: c = "/icons/icon.svg"
33
44
  filter: "blur(6px)",
34
45
  animationDuration: "5s"
35
46
  }
36
- }), g ? /* @__PURE__ */ i("span", {
47
+ }), C ? /* @__PURE__ */ a("span", {
37
48
  className: "relative flex h-16 w-16 items-center justify-center rounded-2xl bg-action-primary-bg text-action-primary-text text-2xl font-semibold shadow-elevation-1 motion-safe:animate-pulse",
38
- children: p
39
- }) : /* @__PURE__ */ i("img", {
40
- src: c,
49
+ children: v
50
+ }) : /* @__PURE__ */ a("img", {
51
+ src: p,
41
52
  alt: "",
42
53
  "aria-hidden": "true",
43
- onError: () => _(!0),
54
+ onError: () => w(!0),
44
55
  className: "relative h-16 w-16 rounded-2xl motion-safe:animate-pulse"
45
56
  })]
46
57
  }),
47
- /* @__PURE__ */ a("div", {
58
+ /* @__PURE__ */ o("div", {
48
59
  className: "flex flex-col items-center gap-3",
49
60
  children: [
50
- /* @__PURE__ */ i("h1", {
51
- className: "text-lg font-semibold text-text-primary",
52
- children: f
61
+ /* @__PURE__ */ o("div", {
62
+ className: "flex flex-col items-center gap-1 text-center",
63
+ children: [/* @__PURE__ */ a("h1", {
64
+ className: "text-lg font-semibold text-text-primary",
65
+ children: _
66
+ }), E ? /* @__PURE__ */ a("p", {
67
+ className: "text-sm text-text-secondary",
68
+ children: E
69
+ }) : null]
53
70
  }),
54
- /* @__PURE__ */ i("div", {
71
+ /* @__PURE__ */ a("div", {
55
72
  className: "flex items-center gap-1.5",
56
73
  "aria-hidden": "true",
57
74
  children: [
58
75
  0,
59
76
  1,
60
77
  2
61
- ].map((e) => /* @__PURE__ */ i("span", {
78
+ ].map((e) => /* @__PURE__ */ a("span", {
62
79
  className: "h-1.5 w-1.5 rounded-full bg-action-primary-bg opacity-60 motion-safe:animate-pulse",
63
80
  style: {
64
81
  animationDelay: `${e * .15}s`,
@@ -66,9 +83,9 @@ function o({ label: o, variant: s = "fullscreen", logoSrc: c = "/icons/icon.svg"
66
83
  }
67
84
  }, e))
68
85
  }),
69
- /* @__PURE__ */ i("p", {
86
+ /* @__PURE__ */ a("p", {
70
87
  className: "text-xs text-text-secondary",
71
- children: v
88
+ children: T
72
89
  })
73
90
  ]
74
91
  })
@@ -76,4 +93,4 @@ function o({ label: o, variant: s = "fullscreen", logoSrc: c = "/icons/icon.svg"
76
93
  });
77
94
  }
78
95
  //#endregion
79
- export { o as BrandedSplash };
96
+ export { c as BrandedSplash };
@@ -1,38 +1,38 @@
1
- import { cn as e } from "../shared-utils.js";
2
- import { Button as t } from "./button.js";
3
- import { DropdownMenu as n, DropdownMenuContent as r, DropdownMenuItem as i, DropdownMenuTrigger as a } from "./dropdown-menu.js";
4
- import { useShellLabel as o } from "../shared/providers/shell/useShellLabel.js";
1
+ import { useShellLabel as e } from "../shared/providers/shell/useShellLabel.js";
2
+ import { cn as t } from "../shared-utils.js";
3
+ import { Button as n } from "./button.js";
4
+ import { DropdownMenu as r, DropdownMenuContent as i, DropdownMenuItem as a, DropdownMenuTrigger as o } from "./dropdown-menu.js";
5
5
  import { MoreHorizontal as s } from "lucide-react";
6
6
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
7
7
  //#region src/ui/cta-overflow-menu.tsx
8
8
  function u({ primary: u, actions: d, align: f = "end", className: p }) {
9
- let m = o();
9
+ let m = e();
10
10
  return /* @__PURE__ */ l("div", {
11
- className: e("flex items-center gap-2", p),
12
- children: [u ? /* @__PURE__ */ l(t, {
11
+ className: t("flex items-center gap-2", p),
12
+ children: [u ? /* @__PURE__ */ l(n, {
13
13
  type: "button",
14
14
  variant: "default",
15
15
  onClick: u.onSelect,
16
16
  disabled: u.disabled,
17
17
  children: [u.icon, u.label]
18
- }) : null, d.length > 0 ? /* @__PURE__ */ l(n, { children: [/* @__PURE__ */ c(a, {
18
+ }) : null, d.length > 0 ? /* @__PURE__ */ l(r, { children: [/* @__PURE__ */ c(o, {
19
19
  asChild: !0,
20
- children: /* @__PURE__ */ c(t, {
20
+ children: /* @__PURE__ */ c(n, {
21
21
  type: "button",
22
22
  variant: "outline",
23
23
  size: "icon",
24
24
  "aria-label": m("common.moreActions", "More actions"),
25
25
  children: /* @__PURE__ */ c(s, {})
26
26
  })
27
- }), /* @__PURE__ */ c(r, {
27
+ }), /* @__PURE__ */ c(i, {
28
28
  align: f,
29
- children: d.map((t, n) => /* @__PURE__ */ l(i, {
30
- "data-tour": t.dataTour,
31
- disabled: t.disabled,
32
- onSelect: t.onSelect,
33
- className: e("gap-2", t.intent === "destructive" && "text-status-error-text focus:text-status-error-text focus:bg-status-error-bg-subtle"),
34
- children: [t.icon, t.label]
35
- }, `${t.label}-${n}`))
29
+ children: d.map((e, n) => /* @__PURE__ */ l(a, {
30
+ "data-tour": e.dataTour,
31
+ disabled: e.disabled,
32
+ onSelect: e.onSelect,
33
+ className: t("gap-2", e.intent === "destructive" && "text-status-error-text focus:text-status-error-text focus:bg-status-error-bg-subtle"),
34
+ children: [e.icon, e.label]
35
+ }, `${e.label}-${n}`))
36
36
  })] }) : null]
37
37
  });
38
38
  }
@@ -1,5 +1,5 @@
1
- import { cn as e } from "../shared-utils.js";
2
- import { useShellLabel as t } from "../shared/providers/shell/useShellLabel.js";
1
+ import { useShellLabel as e } from "../shared/providers/shell/useShellLabel.js";
2
+ import { cn as t } from "../shared-utils.js";
3
3
  import { useEffect as n, useState as r } from "react";
4
4
  import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
5
5
  //#region src/ui/guidance.tsx
@@ -17,13 +17,13 @@ var s = ({ className: e }) => /* @__PURE__ */ o("svg", {
17
17
  opacity: "0.6"
18
18
  })]
19
19
  });
20
- function c({ children: t, icon: n, learnMoreHref: r, learnMoreLabel: s = "Learn more", className: c }) {
20
+ function c({ children: e, icon: n, learnMoreHref: r, learnMoreLabel: s = "Learn more", className: c }) {
21
21
  return /* @__PURE__ */ o("p", {
22
- className: e("flex items-start gap-2 text-sm leading-relaxed text-text-secondary", c),
22
+ className: t("flex items-start gap-2 text-sm leading-relaxed text-text-secondary", c),
23
23
  children: [n && /* @__PURE__ */ a("span", {
24
24
  className: "mt-0.5 shrink-0 text-text-muted",
25
25
  children: n
26
- }), /* @__PURE__ */ o("span", { children: [t, r && /* @__PURE__ */ o(i, { children: [" ", /* @__PURE__ */ a("a", {
26
+ }), /* @__PURE__ */ o("span", { children: [e, r && /* @__PURE__ */ o(i, { children: [" ", /* @__PURE__ */ a("a", {
27
27
  href: r,
28
28
  className: "font-medium text-text-link underline-offset-2 hover:underline",
29
29
  target: r.startsWith("http") ? "_blank" : void 0,
@@ -35,7 +35,7 @@ function c({ children: t, icon: n, learnMoreHref: r, learnMoreLabel: s = "Learn
35
35
  c.displayName = "PagePurpose";
36
36
  var l = "boff-nextsteps-";
37
37
  function u({ steps: i, title: c, storageKey: u, className: d }) {
38
- let f = t(), p = c ?? f("guidance.title", "Suggested next steps"), m = l + u, [h, g] = r(!1);
38
+ let f = e(), p = c ?? f("guidance.title", "Suggested next steps"), m = l + u, [h, g] = r(!1);
39
39
  n(() => {
40
40
  try {
41
41
  g(localStorage.getItem(m) === "1");
@@ -51,13 +51,13 @@ function u({ steps: i, title: c, storageKey: u, className: d }) {
51
51
  if (h) return /* @__PURE__ */ o("button", {
52
52
  type: "button",
53
53
  onClick: () => _(!1),
54
- className: e("inline-flex items-center gap-1.5 rounded-full border border-border-seam bg-[var(--color-surface-glass)] px-3 py-1.5 text-xs font-medium text-text-secondary shadow-elevation-1 backdrop-blur-[var(--blur-glass)] transition-[box-shadow,border-color] hover:border-border-strong hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", d),
54
+ className: t("inline-flex items-center gap-1.5 rounded-full border border-border-seam bg-[var(--color-surface-glass)] px-3 py-1.5 text-xs font-medium text-text-secondary shadow-elevation-1 backdrop-blur-[var(--blur-glass)] transition-[box-shadow,border-color] hover:border-border-strong hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", d),
55
55
  children: [/* @__PURE__ */ a(s, { className: "size-3.5 text-[var(--color-action-primary-bg)]" }), "Show suggestions"]
56
56
  });
57
57
  let v = i.filter((e) => !e.done).length;
58
58
  return /* @__PURE__ */ o("section", {
59
59
  "aria-label": p,
60
- className: e("relative overflow-hidden rounded-card border border-border-seam bg-bg-surface bg-accent-wash shadow-[var(--shadow-pop)]", d),
60
+ className: t("relative overflow-hidden rounded-card border border-border-seam bg-bg-surface bg-accent-wash shadow-[var(--shadow-pop)]", d),
61
61
  children: [/* @__PURE__ */ o("div", {
62
62
  className: "flex items-center justify-between gap-3 px-4 pt-3.5",
63
63
  children: [/* @__PURE__ */ o("h3", {
@@ -90,15 +90,15 @@ function u({ steps: i, title: c, storageKey: u, className: d }) {
90
90
  })]
91
91
  }), /* @__PURE__ */ a("ul", {
92
92
  className: "flex flex-col gap-1 p-2.5 pt-2",
93
- children: i.map((t) => /* @__PURE__ */ a("li", { children: /* @__PURE__ */ o(t.href ? "a" : "button", {
94
- ...t.href ? { href: t.href } : {
93
+ children: i.map((e) => /* @__PURE__ */ a("li", { children: /* @__PURE__ */ o(e.href ? "a" : "button", {
94
+ ...e.href ? { href: e.href } : {
95
95
  type: "button",
96
- onClick: t.onClick
96
+ onClick: e.onClick
97
97
  },
98
- className: e("group flex w-full items-start gap-3 rounded-lg px-2.5 py-2 text-left transition-colors hover:bg-[var(--color-surface-glass)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", t.done && "opacity-60"),
98
+ className: t("group flex w-full items-start gap-3 rounded-lg px-2.5 py-2 text-left transition-colors hover:bg-[var(--color-surface-glass)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", e.done && "opacity-60"),
99
99
  children: [/* @__PURE__ */ a("span", {
100
- className: e("mt-0.5 grid size-7 shrink-0 place-items-center rounded-full border text-[var(--color-action-primary-bg)]", t.done ? "border-border-subtle bg-bg-muted text-text-muted" : "border-[color-mix(in_oklab,var(--color-action-primary-bg)_35%,transparent)] bg-[color-mix(in_oklab,var(--color-action-primary-bg)_12%,transparent)]"),
101
- children: t.done ? /* @__PURE__ */ a("svg", {
100
+ className: t("mt-0.5 grid size-7 shrink-0 place-items-center rounded-full border text-[var(--color-action-primary-bg)]", e.done ? "border-border-subtle bg-bg-muted text-text-muted" : "border-[color-mix(in_oklab,var(--color-action-primary-bg)_35%,transparent)] bg-[color-mix(in_oklab,var(--color-action-primary-bg)_12%,transparent)]"),
101
+ children: e.done ? /* @__PURE__ */ a("svg", {
102
102
  viewBox: "0 0 24 24",
103
103
  className: "size-4",
104
104
  fill: "none",
@@ -110,18 +110,18 @@ function u({ steps: i, title: c, storageKey: u, className: d }) {
110
110
  strokeLinecap: "round",
111
111
  strokeLinejoin: "round"
112
112
  })
113
- }) : t.icon ?? /* @__PURE__ */ a(s, { className: "size-4" })
113
+ }) : e.icon ?? /* @__PURE__ */ a(s, { className: "size-4" })
114
114
  }), /* @__PURE__ */ o("span", {
115
115
  className: "min-w-0 flex-1",
116
116
  children: [/* @__PURE__ */ a("span", {
117
117
  className: "block text-sm font-medium text-text-primary",
118
- children: t.label
119
- }), t.description && /* @__PURE__ */ a("span", {
118
+ children: e.label
119
+ }), e.description && /* @__PURE__ */ a("span", {
120
120
  className: "block text-xs text-text-secondary",
121
- children: t.description
121
+ children: e.description
122
122
  })]
123
123
  })]
124
- }) }, t.id))
124
+ }) }, e.id))
125
125
  })]
126
126
  });
127
127
  }
@@ -36,7 +36,7 @@ export { GlassCard, glassCardVariants, type GlassCardProps } from './glass-card'
36
36
  export { EmphasisPanel, type EmphasisPanelProps } from './emphasis-panel';
37
37
  export { ShowMore, type ShowMoreProps } from './show-more';
38
38
  export { CTAOverflowMenu, type CTAOverflowMenuProps, type CTAAction, type CTAPrimaryAction, } from './cta-overflow-menu';
39
- export { BrandedSplash, type BrandedSplashProps } from './branded-splash';
39
+ export { BrandedSplash, type BrandedSplashPhase, type BrandedSplashProps } from './branded-splash';
40
40
  export { ModernLanding, type ModernLandingProps, type ModernLandingFeature, } from './modern-landing';
41
41
  export { AuroraBackground, type AuroraBackgroundProps } from './aurora-background';
42
42
  export { Illustration, type IllustrationProps, IllustratedEmptyState, type IllustratedEmptyStateProps, } from './illustration';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.1021.6",
3
+ "version": "2026.1021.7",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "bin": {