@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.
- package/dist/chrome/AccountSwitcher.js +7 -7
- package/dist/chrome/AutoBreadcrumbs.js +3 -3
- package/dist/chrome/Breadcrumbs.js +24 -24
- package/dist/chrome/ContextSwitcher.js +7 -7
- package/dist/chrome/DynamicFooter.js +3 -3
- package/dist/chrome/HeaderThemeSwitcher.js +14 -14
- package/dist/chrome/LanguagePickerSheet.js +7 -7
- package/dist/chrome/NativeTopBar.js +4 -4
- package/dist/chrome/NavCustomizeDialog.js +12 -12
- package/dist/chrome/ProductPickerSheet.js +7 -7
- package/dist/chrome/SideNavigation.js +17 -17
- package/dist/chrome/Sidebar.js +34 -34
- package/dist/chrome/Tabs.js +20 -20
- package/dist/chrome/ThemePreferences.js +188 -188
- package/dist/shared/assistant/ui/AssistantChatArea.js +4 -4
- package/dist/shared/components/ContextConversationWidget.js +7 -7
- package/dist/shared/components/QuotaUpgradeBridge.js +13 -13
- package/dist/shared/pages/AiPage.js +6 -6
- package/dist/shared/providers/shell/ProfileI18nBridge.js +11 -11
- package/dist/shared-hooks-shell.js +7 -7
- package/dist/shared-providers-shell.js +6 -6
- package/dist/ui/branded-splash.d.ts +25 -2
- package/dist/ui/branded-splash.js +48 -31
- package/dist/ui/cta-overflow-menu.js +17 -17
- package/dist/ui/guidance.js +19 -19
- package/dist/ui/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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 } =
|
|
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 =
|
|
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 {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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 } =
|
|
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(
|
|
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(
|
|
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 {
|
|
2
|
-
import {
|
|
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 =
|
|
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
|
|
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 = (
|
|
81
|
-
let r = c(
|
|
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
|
|
83
|
+
let e = u(f.current.copy, r);
|
|
84
84
|
n({
|
|
85
85
|
extensions: s ? {
|
|
86
|
-
code:
|
|
86
|
+
code: t,
|
|
87
87
|
quotaName: s
|
|
88
|
-
} : { code:
|
|
89
|
-
title: a(
|
|
90
|
-
description: a(
|
|
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(
|
|
96
|
-
window.removeEventListener(
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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:
|
|
38
|
+
let t = o(), { workspaceId: n } = r();
|
|
39
39
|
return t ? e : /* @__PURE__ */ x(i, {
|
|
40
|
-
scopeId:
|
|
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 =
|
|
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 {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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 } =
|
|
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:
|
|
39
|
-
let { user: b } =
|
|
40
|
-
productId:
|
|
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
|
-
|
|
46
|
+
r,
|
|
47
47
|
C
|
|
48
|
-
]), E = u(() => S && v ?
|
|
49
|
-
return /* @__PURE__ */ d(
|
|
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(
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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 {
|
|
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 {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
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 {
|
|
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
|
-
/**
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
}, [
|
|
13
|
-
let
|
|
14
|
-
return /* @__PURE__ */
|
|
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":
|
|
18
|
-
className:
|
|
19
|
-
...
|
|
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__ */
|
|
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__ */
|
|
37
|
+
/* @__PURE__ */ o("div", {
|
|
27
38
|
className: "relative flex h-20 w-20 items-center justify-center",
|
|
28
|
-
children: [/* @__PURE__ */
|
|
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
|
-
}),
|
|
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:
|
|
39
|
-
}) : /* @__PURE__ */
|
|
40
|
-
src:
|
|
49
|
+
children: v
|
|
50
|
+
}) : /* @__PURE__ */ a("img", {
|
|
51
|
+
src: p,
|
|
41
52
|
alt: "",
|
|
42
53
|
"aria-hidden": "true",
|
|
43
|
-
onError: () =>
|
|
54
|
+
onError: () => w(!0),
|
|
44
55
|
className: "relative h-16 w-16 rounded-2xl motion-safe:animate-pulse"
|
|
45
56
|
})]
|
|
46
57
|
}),
|
|
47
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ o("div", {
|
|
48
59
|
className: "flex flex-col items-center gap-3",
|
|
49
60
|
children: [
|
|
50
|
-
/* @__PURE__ */
|
|
51
|
-
className: "
|
|
52
|
-
children:
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
86
|
+
/* @__PURE__ */ a("p", {
|
|
70
87
|
className: "text-xs text-text-secondary",
|
|
71
|
-
children:
|
|
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 {
|
|
96
|
+
export { c as BrandedSplash };
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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 =
|
|
9
|
+
let m = e();
|
|
10
10
|
return /* @__PURE__ */ l("div", {
|
|
11
|
-
className:
|
|
12
|
-
children: [u ? /* @__PURE__ */ l(
|
|
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(
|
|
18
|
+
}) : null, d.length > 0 ? /* @__PURE__ */ l(r, { children: [/* @__PURE__ */ c(o, {
|
|
19
19
|
asChild: !0,
|
|
20
|
-
children: /* @__PURE__ */ c(
|
|
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(
|
|
27
|
+
}), /* @__PURE__ */ c(i, {
|
|
28
28
|
align: f,
|
|
29
|
-
children: d.map((
|
|
30
|
-
"data-tour":
|
|
31
|
-
disabled:
|
|
32
|
-
onSelect:
|
|
33
|
-
className:
|
|
34
|
-
children: [
|
|
35
|
-
}, `${
|
|
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
|
}
|
package/dist/ui/guidance.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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:
|
|
20
|
+
function c({ children: e, icon: n, learnMoreHref: r, learnMoreLabel: s = "Learn more", className: c }) {
|
|
21
21
|
return /* @__PURE__ */ o("p", {
|
|
22
|
-
className:
|
|
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: [
|
|
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 =
|
|
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:
|
|
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:
|
|
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((
|
|
94
|
-
...
|
|
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:
|
|
96
|
+
onClick: e.onClick
|
|
97
97
|
},
|
|
98
|
-
className:
|
|
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:
|
|
101
|
-
children:
|
|
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
|
-
}) :
|
|
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:
|
|
119
|
-
}),
|
|
118
|
+
children: e.label
|
|
119
|
+
}), e.description && /* @__PURE__ */ a("span", {
|
|
120
120
|
className: "block text-xs text-text-secondary",
|
|
121
|
-
children:
|
|
121
|
+
children: e.description
|
|
122
122
|
})]
|
|
123
123
|
})]
|
|
124
|
-
}) },
|
|
124
|
+
}) }, e.id))
|
|
125
125
|
})]
|
|
126
126
|
});
|
|
127
127
|
}
|
package/dist/ui/index.d.ts
CHANGED
|
@@ -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';
|