@shipfox/client-shell 22.0.3 → 24.0.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.
- package/dist/components/nav-bar.d.ts.map +1 -1
- package/dist/components/nav-bar.js +3 -2
- package/dist/components/nav-bar.js.map +1 -1
- package/dist/runtime/chrome-context.d.ts +12 -0
- package/dist/runtime/chrome-context.d.ts.map +1 -1
- package/dist/runtime/chrome-context.js.map +1 -1
- package/dist/runtime/client-analytics.d.ts +16 -0
- package/dist/runtime/client-analytics.d.ts.map +1 -0
- package/dist/runtime/client-analytics.js +33 -0
- package/dist/runtime/client-analytics.js.map +1 -0
- package/dist/runtime/compose-client-app.d.ts +4 -2
- package/dist/runtime/compose-client-app.d.ts.map +1 -1
- package/dist/runtime/compose-client-app.js +23 -15
- package/dist/runtime/compose-client-app.js.map +1 -1
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/workspace-setup-dismissal.d.ts +8 -0
- package/dist/runtime/workspace-setup-dismissal.d.ts.map +1 -0
- package/dist/runtime/workspace-setup-dismissal.js +34 -0
- package/dist/runtime/workspace-setup-dismissal.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-bar.d.ts","sourceRoot":"","sources":["../../src/components/nav-bar.tsx"],"names":[],"mappings":"AAOA,wBAAgB,MAAM,CAAC,EAAC,qBAA6B,EAAC,EAAE;IAAC,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAC,+
|
|
1
|
+
{"version":3,"file":"nav-bar.d.ts","sourceRoot":"","sources":["../../src/components/nav-bar.tsx"],"names":[],"mappings":"AAOA,wBAAgB,MAAM,CAAC,EAAC,qBAA6B,EAAC,EAAE;IAAC,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAC,+BAkCxF"}
|
|
@@ -7,7 +7,7 @@ import { UserMenu } from './user-menu.js';
|
|
|
7
7
|
import { WorkspaceCrumb } from './workspace-crumb.js';
|
|
8
8
|
export function NavBar({ hideProjectNavigation = false }) {
|
|
9
9
|
const workspace = useActiveWorkspace();
|
|
10
|
-
const { ProjectBreadcrumb } = useChrome();
|
|
10
|
+
const { ProjectBreadcrumb, WorkspaceSetupIndicator } = useChrome();
|
|
11
11
|
return /*#__PURE__*/ _jsxs("header", {
|
|
12
12
|
className: "sticky top-0 z-30 h-56 px-row flex items-center gap-cluster bg-background-subtle-base border-b border-border-neutral-base shrink-0",
|
|
13
13
|
children: [
|
|
@@ -48,7 +48,8 @@ export function NavBar({ hideProjectNavigation = false }) {
|
|
|
48
48
|
"aria-hidden": "true",
|
|
49
49
|
children: "/"
|
|
50
50
|
}),
|
|
51
|
-
/*#__PURE__*/ _jsx(ProjectBreadcrumb, {})
|
|
51
|
+
/*#__PURE__*/ _jsx(ProjectBreadcrumb, {}),
|
|
52
|
+
WorkspaceSetupIndicator ? /*#__PURE__*/ _jsx(WorkspaceSetupIndicator, {}) : undefined
|
|
52
53
|
]
|
|
53
54
|
}),
|
|
54
55
|
/*#__PURE__*/ _jsx("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/nav-bar.tsx"],"sourcesContent":["import {Logo} from '@shipfox/react-ui/logo';\nimport {Link} from '@tanstack/react-router';\nimport {useActiveWorkspace} from '#runtime/active-workspace.js';\nimport {useChrome} from '#runtime/chrome-context.js';\nimport {UserMenu} from './user-menu.js';\nimport {WorkspaceCrumb} from './workspace-crumb.js';\n\nexport function NavBar({hideProjectNavigation = false}: {hideProjectNavigation?: boolean}) {\n const workspace = useActiveWorkspace();\n const {ProjectBreadcrumb} = useChrome();\n return (\n <header className=\"sticky top-0 z-30 h-56 px-row flex items-center gap-cluster bg-background-subtle-base border-b border-border-neutral-base shrink-0\">\n <Link\n to=\"/\"\n aria-label=\"Shipfox home\"\n className=\"rounded-6 focus-visible:outline-none focus-visible:shadow-button-neutral-focus\"\n >\n {hideProjectNavigation ? (\n <>\n <Logo variant=\"mark\" alt=\"\" className=\"sm:hidden\" />\n <Logo variant=\"wordmark\" alt=\"\" className=\"hidden sm:block\" />\n </>\n ) : (\n <Logo variant=\"wordmark\" alt=\"\" />\n )}\n </Link>\n <span className=\"h-20 w-px bg-border-neutral-base\" aria-hidden=\"true\" />\n <WorkspaceCrumb workspace={workspace} compact={hideProjectNavigation} />\n {hideProjectNavigation ? undefined : (\n <>\n <span className=\"text-foreground-neutral-muted\" aria-hidden=\"true\">\n /\n </span>\n <ProjectBreadcrumb />\n </>\n )}\n <div className=\"flex-1\" />\n <UserMenu />\n </header>\n );\n}\n"],"names":["Logo","Link","useActiveWorkspace","useChrome","UserMenu","WorkspaceCrumb","NavBar","hideProjectNavigation","workspace","ProjectBreadcrumb","header","className","to","aria-label","variant","alt","span","aria-hidden","compact","undefined","div"],"mappings":";AAAA,SAAQA,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,kBAAkB,QAAO,+BAA+B;AAChE,SAAQC,SAAS,QAAO,6BAA6B;AACrD,SAAQC,QAAQ,QAAO,iBAAiB;AACxC,SAAQC,cAAc,QAAO,uBAAuB;AAEpD,OAAO,SAASC,OAAO,EAACC,wBAAwB,KAAK,EAAoC;IACvF,MAAMC,YAAYN;IAClB,MAAM,EAACO,iBAAiB,EAAC,
|
|
1
|
+
{"version":3,"sources":["../../src/components/nav-bar.tsx"],"sourcesContent":["import {Logo} from '@shipfox/react-ui/logo';\nimport {Link} from '@tanstack/react-router';\nimport {useActiveWorkspace} from '#runtime/active-workspace.js';\nimport {useChrome} from '#runtime/chrome-context.js';\nimport {UserMenu} from './user-menu.js';\nimport {WorkspaceCrumb} from './workspace-crumb.js';\n\nexport function NavBar({hideProjectNavigation = false}: {hideProjectNavigation?: boolean}) {\n const workspace = useActiveWorkspace();\n const {ProjectBreadcrumb, WorkspaceSetupIndicator} = useChrome();\n return (\n <header className=\"sticky top-0 z-30 h-56 px-row flex items-center gap-cluster bg-background-subtle-base border-b border-border-neutral-base shrink-0\">\n <Link\n to=\"/\"\n aria-label=\"Shipfox home\"\n className=\"rounded-6 focus-visible:outline-none focus-visible:shadow-button-neutral-focus\"\n >\n {hideProjectNavigation ? (\n <>\n <Logo variant=\"mark\" alt=\"\" className=\"sm:hidden\" />\n <Logo variant=\"wordmark\" alt=\"\" className=\"hidden sm:block\" />\n </>\n ) : (\n <Logo variant=\"wordmark\" alt=\"\" />\n )}\n </Link>\n <span className=\"h-20 w-px bg-border-neutral-base\" aria-hidden=\"true\" />\n <WorkspaceCrumb workspace={workspace} compact={hideProjectNavigation} />\n {hideProjectNavigation ? undefined : (\n <>\n <span className=\"text-foreground-neutral-muted\" aria-hidden=\"true\">\n /\n </span>\n <ProjectBreadcrumb />\n {WorkspaceSetupIndicator ? <WorkspaceSetupIndicator /> : undefined}\n </>\n )}\n <div className=\"flex-1\" />\n <UserMenu />\n </header>\n );\n}\n"],"names":["Logo","Link","useActiveWorkspace","useChrome","UserMenu","WorkspaceCrumb","NavBar","hideProjectNavigation","workspace","ProjectBreadcrumb","WorkspaceSetupIndicator","header","className","to","aria-label","variant","alt","span","aria-hidden","compact","undefined","div"],"mappings":";AAAA,SAAQA,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,IAAI,QAAO,yBAAyB;AAC5C,SAAQC,kBAAkB,QAAO,+BAA+B;AAChE,SAAQC,SAAS,QAAO,6BAA6B;AACrD,SAAQC,QAAQ,QAAO,iBAAiB;AACxC,SAAQC,cAAc,QAAO,uBAAuB;AAEpD,OAAO,SAASC,OAAO,EAACC,wBAAwB,KAAK,EAAoC;IACvF,MAAMC,YAAYN;IAClB,MAAM,EAACO,iBAAiB,EAAEC,uBAAuB,EAAC,GAAGP;IACrD,qBACE,MAACQ;QAAOC,WAAU;;0BAChB,KAACX;gBACCY,IAAG;gBACHC,cAAW;gBACXF,WAAU;0BAETL,sCACC;;sCACE,KAACP;4BAAKe,SAAQ;4BAAOC,KAAI;4BAAGJ,WAAU;;sCACtC,KAACZ;4BAAKe,SAAQ;4BAAWC,KAAI;4BAAGJ,WAAU;;;mCAG5C,KAACZ;oBAAKe,SAAQ;oBAAWC,KAAI;;;0BAGjC,KAACC;gBAAKL,WAAU;gBAAmCM,eAAY;;0BAC/D,KAACb;gBAAeG,WAAWA;gBAAWW,SAASZ;;YAC9CA,wBAAwBa,0BACvB;;kCACE,KAACH;wBAAKL,WAAU;wBAAgCM,eAAY;kCAAO;;kCAGnE,KAACT;oBACAC,wCAA0B,KAACA,+BAA6BU;;;0BAG7D,KAACC;gBAAIT,WAAU;;0BACf,KAACR;;;AAGP"}
|
|
@@ -9,6 +9,18 @@ export interface ChromeSlots {
|
|
|
9
9
|
* null, and owns whether this content renders from the current session.
|
|
10
10
|
*/
|
|
11
11
|
AccountMenuEntry?: ComponentType;
|
|
12
|
+
/**
|
|
13
|
+
* Optional component the projects hub renders as its first panel. The hub
|
|
14
|
+
* renders nothing when the slot is absent, so a consumer that composes
|
|
15
|
+
* without the onboarding feature is unaffected.
|
|
16
|
+
*/
|
|
17
|
+
WorkspaceSetupChecklist?: ComponentType;
|
|
18
|
+
/**
|
|
19
|
+
* Optional component the nav bar renders right of the breadcrumbs. The bar
|
|
20
|
+
* renders nothing when the slot is absent, and never on the pre-project gate
|
|
21
|
+
* pages (while hideProjectNavigation is true).
|
|
22
|
+
*/
|
|
23
|
+
WorkspaceSetupIndicator?: ComponentType;
|
|
12
24
|
}
|
|
13
25
|
export declare function ChromeProvider({ chrome, children, }: PropsWithChildren<{
|
|
14
26
|
chrome: ChromeSlots | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chrome-context.d.ts","sourceRoot":"","sources":["../../src/runtime/chrome-context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAE,iBAAiB,EAAC,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,aAAa,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"chrome-context.d.ts","sourceRoot":"","sources":["../../src/runtime/chrome-context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAE,iBAAiB,EAAC,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,aAAa,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,aAAa,CAAC;IACjC;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,aAAa,CAAC;IACxC;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,aAAa,CAAC;CACzC;AAID,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,GACT,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;CAAC,CAAC,+BAEtD;AAED,wBAAgB,SAAS,IAAI,WAAW,CAIvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/chrome-context.tsx"],"sourcesContent":["import type {ComponentType, PropsWithChildren} from 'react';\nimport {createContext, useContext} from 'react';\nimport type {ProjectSlugResolver} from './router-context.js';\n\nexport interface ChromeSlots {\n ProjectBreadcrumb: ComponentType;\n projectSlugResolver: ProjectSlugResolver;\n /**\n * Optional content rendered in the account menu before the shell-owned logout\n * action. The composing component must render one DropdownMenuItem or return\n * null, and owns whether this content renders from the current session.\n */\n AccountMenuEntry?: ComponentType;\n}\n\nconst ChromeContext = createContext<ChromeSlots | undefined>(undefined);\n\nexport function ChromeProvider({\n chrome,\n children,\n}: PropsWithChildren<{chrome: ChromeSlots | undefined}>) {\n return <ChromeContext.Provider value={chrome}>{children}</ChromeContext.Provider>;\n}\n\nexport function useChrome(): ChromeSlots {\n const chrome = useContext(ChromeContext);\n if (!chrome) throw new Error('Client composition must provide browser chrome slots.');\n return chrome;\n}\n"],"names":["createContext","useContext","ChromeContext","undefined","ChromeProvider","chrome","children","Provider","value","useChrome","Error"],"mappings":";AACA,SAAQA,aAAa,EAAEC,UAAU,QAAO,QAAQ;
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/chrome-context.tsx"],"sourcesContent":["import type {ComponentType, PropsWithChildren} from 'react';\nimport {createContext, useContext} from 'react';\nimport type {ProjectSlugResolver} from './router-context.js';\n\nexport interface ChromeSlots {\n ProjectBreadcrumb: ComponentType;\n projectSlugResolver: ProjectSlugResolver;\n /**\n * Optional content rendered in the account menu before the shell-owned logout\n * action. The composing component must render one DropdownMenuItem or return\n * null, and owns whether this content renders from the current session.\n */\n AccountMenuEntry?: ComponentType;\n /**\n * Optional component the projects hub renders as its first panel. The hub\n * renders nothing when the slot is absent, so a consumer that composes\n * without the onboarding feature is unaffected.\n */\n WorkspaceSetupChecklist?: ComponentType;\n /**\n * Optional component the nav bar renders right of the breadcrumbs. The bar\n * renders nothing when the slot is absent, and never on the pre-project gate\n * pages (while hideProjectNavigation is true).\n */\n WorkspaceSetupIndicator?: ComponentType;\n}\n\nconst ChromeContext = createContext<ChromeSlots | undefined>(undefined);\n\nexport function ChromeProvider({\n chrome,\n children,\n}: PropsWithChildren<{chrome: ChromeSlots | undefined}>) {\n return <ChromeContext.Provider value={chrome}>{children}</ChromeContext.Provider>;\n}\n\nexport function useChrome(): ChromeSlots {\n const chrome = useContext(ChromeContext);\n if (!chrome) throw new Error('Client composition must provide browser chrome slots.');\n return chrome;\n}\n"],"names":["createContext","useContext","ChromeContext","undefined","ChromeProvider","chrome","children","Provider","value","useChrome","Error"],"mappings":";AACA,SAAQA,aAAa,EAAEC,UAAU,QAAO,QAAQ;AA0BhD,MAAMC,8BAAgBF,cAAuCG;AAE7D,OAAO,SAASC,eAAe,EAC7BC,MAAM,EACNC,QAAQ,EAC6C;IACrD,qBAAO,KAACJ,cAAcK,QAAQ;QAACC,OAAOH;kBAASC;;AACjD;AAEA,OAAO,SAASG;IACd,MAAMJ,SAASJ,WAAWC;IAC1B,IAAI,CAACG,QAAQ,MAAM,IAAIK,MAAM;IAC7B,OAAOL;AACT"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PropsWithChildren } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Application-provided UI analytics. Call `capture` from an effect or event
|
|
4
|
+
* handler, not during render. The provider isolates synchronous and
|
|
5
|
+
* asynchronous implementation failures.
|
|
6
|
+
*/
|
|
7
|
+
export interface ClientAnalytics {
|
|
8
|
+
capture(event: string, properties?: Record<string, unknown>): void | PromiseLike<void>;
|
|
9
|
+
}
|
|
10
|
+
/** Analytics that discards every event; the default for self-hosted builds. */
|
|
11
|
+
export declare const noopClientAnalytics: ClientAnalytics;
|
|
12
|
+
export declare function ClientAnalyticsProvider({ analytics, children, }: PropsWithChildren<{
|
|
13
|
+
analytics?: ClientAnalytics;
|
|
14
|
+
}>): import("react").JSX.Element;
|
|
15
|
+
export declare function useClientAnalytics(): ClientAnalytics;
|
|
16
|
+
//# sourceMappingURL=client-analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-analytics.d.ts","sourceRoot":"","sources":["../../src/runtime/client-analytics.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,OAAO,CAAC;AAG7C;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;CACxF;AAED,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,EAAE,eAIjC,CAAC;AAIF,wBAAgB,uBAAuB,CAAC,EACtC,SAAS,EACT,QAAQ,GACT,EAAE,iBAAiB,CAAC;IAAC,SAAS,CAAC,EAAE,eAAe,CAAA;CAAC,CAAC,+BAWlD;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo } from 'react';
|
|
3
|
+
/** Analytics that discards every event; the default for self-hosted builds. */ export const noopClientAnalytics = {
|
|
4
|
+
capture () {
|
|
5
|
+
// UI analytics are optional; the open-source client has no telemetry endpoint.
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
const ClientAnalyticsContext = /*#__PURE__*/ createContext(noopClientAnalytics);
|
|
9
|
+
export function ClientAnalyticsProvider({ analytics, children }) {
|
|
10
|
+
const safeAnalytics = useMemo(()=>analytics ? createSafeClientAnalytics(analytics) : noopClientAnalytics, [
|
|
11
|
+
analytics
|
|
12
|
+
]);
|
|
13
|
+
return /*#__PURE__*/ _jsx(ClientAnalyticsContext.Provider, {
|
|
14
|
+
value: safeAnalytics,
|
|
15
|
+
children: children
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function useClientAnalytics() {
|
|
19
|
+
return useContext(ClientAnalyticsContext);
|
|
20
|
+
}
|
|
21
|
+
function createSafeClientAnalytics(analytics) {
|
|
22
|
+
return {
|
|
23
|
+
capture (event, properties) {
|
|
24
|
+
try {
|
|
25
|
+
void Promise.resolve(analytics.capture(event, properties)).catch(()=>undefined);
|
|
26
|
+
} catch {
|
|
27
|
+
// Optional analytics must not interrupt a feature render or user action.
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=client-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/client-analytics.tsx"],"sourcesContent":["import type {PropsWithChildren} from 'react';\nimport {createContext, useContext, useMemo} from 'react';\n\n/**\n * Application-provided UI analytics. Call `capture` from an effect or event\n * handler, not during render. The provider isolates synchronous and\n * asynchronous implementation failures.\n */\nexport interface ClientAnalytics {\n capture(event: string, properties?: Record<string, unknown>): void | PromiseLike<void>;\n}\n\n/** Analytics that discards every event; the default for self-hosted builds. */\nexport const noopClientAnalytics: ClientAnalytics = {\n capture() {\n // UI analytics are optional; the open-source client has no telemetry endpoint.\n },\n};\n\nconst ClientAnalyticsContext = createContext<ClientAnalytics>(noopClientAnalytics);\n\nexport function ClientAnalyticsProvider({\n analytics,\n children,\n}: PropsWithChildren<{analytics?: ClientAnalytics}>) {\n const safeAnalytics = useMemo(\n () => (analytics ? createSafeClientAnalytics(analytics) : noopClientAnalytics),\n [analytics],\n );\n\n return (\n <ClientAnalyticsContext.Provider value={safeAnalytics}>\n {children}\n </ClientAnalyticsContext.Provider>\n );\n}\n\nexport function useClientAnalytics(): ClientAnalytics {\n return useContext(ClientAnalyticsContext);\n}\n\nfunction createSafeClientAnalytics(analytics: ClientAnalytics): ClientAnalytics {\n return {\n capture(event, properties) {\n try {\n void Promise.resolve(analytics.capture(event, properties)).catch(() => undefined);\n } catch {\n // Optional analytics must not interrupt a feature render or user action.\n }\n },\n };\n}\n"],"names":["createContext","useContext","useMemo","noopClientAnalytics","capture","ClientAnalyticsContext","ClientAnalyticsProvider","analytics","children","safeAnalytics","createSafeClientAnalytics","Provider","value","useClientAnalytics","event","properties","Promise","resolve","catch","undefined"],"mappings":";AACA,SAAQA,aAAa,EAAEC,UAAU,EAAEC,OAAO,QAAO,QAAQ;AAWzD,6EAA6E,GAC7E,OAAO,MAAMC,sBAAuC;IAClDC;IACE,+EAA+E;IACjF;AACF,EAAE;AAEF,MAAMC,uCAAyBL,cAA+BG;AAE9D,OAAO,SAASG,wBAAwB,EACtCC,SAAS,EACTC,QAAQ,EACyC;IACjD,MAAMC,gBAAgBP,QACpB,IAAOK,YAAYG,0BAA0BH,aAAaJ,qBAC1D;QAACI;KAAU;IAGb,qBACE,KAACF,uBAAuBM,QAAQ;QAACC,OAAOH;kBACrCD;;AAGP;AAEA,OAAO,SAASK;IACd,OAAOZ,WAAWI;AACpB;AAEA,SAASK,0BAA0BH,SAA0B;IAC3D,OAAO;QACLH,SAAQU,KAAK,EAAEC,UAAU;YACvB,IAAI;gBACF,KAAKC,QAAQC,OAAO,CAACV,UAAUH,OAAO,CAACU,OAAOC,aAAaG,KAAK,CAAC,IAAMC;YACzE,EAAE,OAAM;YACN,yEAAyE;YAC3E;QACF;IACF;AACF"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { type AnyRouter } from '@tanstack/react-router';
|
|
2
2
|
import type { ClientFeature } from '#contract.js';
|
|
3
3
|
import { type ChromeSlots } from './chrome-context.js';
|
|
4
|
+
import { type ClientAnalytics } from './client-analytics.js';
|
|
4
5
|
import type { WorkspaceSetupGate } from './workspace-setup.js';
|
|
5
|
-
export declare function composeClientApp({ features, router, chrome, workspaceSetup, }: {
|
|
6
|
+
export declare function composeClientApp({ features, router, chrome, workspaceSetup, clientAnalytics, }: {
|
|
6
7
|
features: readonly ClientFeature[];
|
|
7
8
|
router: AnyRouter;
|
|
8
9
|
chrome?: ChromeSlots;
|
|
9
10
|
workspaceSetup?: WorkspaceSetupGate;
|
|
11
|
+
clientAnalytics?: ClientAnalytics;
|
|
10
12
|
}): {
|
|
11
|
-
mount(element: HTMLElement): void;
|
|
13
|
+
mount(element: HTMLElement): () => void;
|
|
12
14
|
};
|
|
13
15
|
//# sourceMappingURL=compose-client-app.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-client-app.d.ts","sourceRoot":"","sources":["../../src/runtime/compose-client-app.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAC,KAAK,SAAS,EAAiB,MAAM,wBAAwB,CAAC;AAKtE,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAiB,KAAK,WAAW,EAAC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"compose-client-app.d.ts","sourceRoot":"","sources":["../../src/runtime/compose-client-app.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAC,KAAK,SAAS,EAAiB,MAAM,wBAAwB,CAAC;AAKtE,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAiB,KAAK,WAAW,EAAC,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAC,KAAK,eAAe,EAA0B,MAAM,uBAAuB,CAAC;AAEpF,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAE7D,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,cAAc,EACd,eAAe,GAChB,EAAE;IACD,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;IASG,KAAK,UAAU,WAAW,GAAG,MAAM,IAAI;EA0C1C"}
|
|
@@ -12,8 +12,9 @@ import { createRoot } from 'react-dom/client';
|
|
|
12
12
|
import { composeClientFeatures } from '#compose/compose-client-features.js';
|
|
13
13
|
import { useAuthState } from './auth.js';
|
|
14
14
|
import { ChromeProvider } from './chrome-context.js';
|
|
15
|
+
import { ClientAnalyticsProvider } from './client-analytics.js';
|
|
15
16
|
import { ShellProviderStack } from './provider-stack.js';
|
|
16
|
-
export function composeClientApp({ features, router, chrome, workspaceSetup }) {
|
|
17
|
+
export function composeClientApp({ features, router, chrome, workspaceSetup, clientAnalytics }) {
|
|
17
18
|
const composition = composeClientFeatures(features);
|
|
18
19
|
const config = loadConfig(composition.configShape, {
|
|
19
20
|
runtime: getWindowRuntimeConfig(),
|
|
@@ -23,6 +24,7 @@ export function composeClientApp({ features, router, chrome, workspaceSetup }) {
|
|
|
23
24
|
return {
|
|
24
25
|
mount (element) {
|
|
25
26
|
const root = createRoot(element);
|
|
27
|
+
const unmount = ()=>root.unmount();
|
|
26
28
|
if (!config.ok) {
|
|
27
29
|
root.render(/*#__PURE__*/ _jsx(StrictMode, {
|
|
28
30
|
children: /*#__PURE__*/ _jsx(ThemeProvider, {
|
|
@@ -33,7 +35,7 @@ export function composeClientApp({ features, router, chrome, workspaceSetup }) {
|
|
|
33
35
|
})
|
|
34
36
|
})
|
|
35
37
|
}));
|
|
36
|
-
return;
|
|
38
|
+
return unmount;
|
|
37
39
|
}
|
|
38
40
|
configureApiClient({
|
|
39
41
|
baseUrl: configApiUrl(config.config)
|
|
@@ -42,22 +44,28 @@ export function composeClientApp({ features, router, chrome, workspaceSetup }) {
|
|
|
42
44
|
root.render(/*#__PURE__*/ _jsx(StrictMode, {
|
|
43
45
|
children: /*#__PURE__*/ _jsx(ChromeProvider, {
|
|
44
46
|
chrome: chrome,
|
|
45
|
-
children: /*#__PURE__*/
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
children:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
47
|
+
children: /*#__PURE__*/ _jsx(ClientAnalyticsProvider, {
|
|
48
|
+
...clientAnalytics ? {
|
|
49
|
+
analytics: clientAnalytics
|
|
50
|
+
} : {},
|
|
51
|
+
children: /*#__PURE__*/ _jsxs(ShellProviderStack, {
|
|
52
|
+
features: features,
|
|
53
|
+
queryClient: queryClient,
|
|
54
|
+
store: createStore(),
|
|
55
|
+
children: [
|
|
56
|
+
/*#__PURE__*/ _jsx(RoutedApp, {
|
|
57
|
+
router: router,
|
|
58
|
+
queryClient: queryClient,
|
|
59
|
+
workspaceSetup: workspaceSetup,
|
|
60
|
+
projectSlugResolver: chrome?.projectSlugResolver
|
|
61
|
+
}),
|
|
62
|
+
/*#__PURE__*/ _jsx(Toaster, {})
|
|
63
|
+
]
|
|
64
|
+
})
|
|
58
65
|
})
|
|
59
66
|
})
|
|
60
67
|
}));
|
|
68
|
+
return unmount;
|
|
61
69
|
}
|
|
62
70
|
};
|
|
63
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/compose-client-app.tsx"],"sourcesContent":["import {configureApiClient} from '@shipfox/client-api';\nimport {\n ConfigErrorScreen,\n getWindowRuntimeConfig,\n loadConfig,\n setLoadedConfig,\n} from '@shipfox/client-config';\nimport {ThemeProvider} from '@shipfox/react-ui/theme';\nimport {Toaster} from '@shipfox/react-ui/toast';\nimport {TooltipProvider} from '@shipfox/react-ui/tooltip';\nimport {QueryClient} from '@tanstack/react-query';\nimport {type AnyRouter, RouterProvider} from '@tanstack/react-router';\nimport {createStore} from 'jotai';\nimport {StrictMode, useEffect} from 'react';\nimport {createRoot} from 'react-dom/client';\nimport {composeClientFeatures} from '#compose/compose-client-features.js';\nimport type {ClientFeature} from '#contract.js';\nimport {useAuthState} from './auth.js';\nimport {ChromeProvider, type ChromeSlots} from './chrome-context.js';\nimport {ShellProviderStack} from './provider-stack.js';\nimport type {WorkspaceSetupGate} from './workspace-setup.js';\n\nexport function composeClientApp({\n features,\n router,\n chrome,\n workspaceSetup,\n}: {\n features: readonly ClientFeature[];\n router: AnyRouter;\n chrome?: ChromeSlots;\n workspaceSetup?: WorkspaceSetupGate;\n}) {\n const composition = composeClientFeatures(features);\n const config = loadConfig(composition.configShape, {\n runtime: getWindowRuntimeConfig(),\n build: (import.meta as ImportMeta & {env?: Record<string, unknown>}).env,\n });\n if (config.ok) setLoadedConfig(config.config);\n\n return {\n mount(element: HTMLElement): void {\n const root = createRoot(element);\n if (!config.ok) {\n root.render(\n <StrictMode>\n <ThemeProvider>\n <TooltipProvider>\n <ConfigErrorScreen errors={config.errors} />\n </TooltipProvider>\n </ThemeProvider>\n </StrictMode>,\n );\n return;\n }\n\n configureApiClient({baseUrl: configApiUrl(config.config)});\n const queryClient = new QueryClient();\n root.render(\n <StrictMode>\n <ChromeProvider chrome={chrome}>\n <ShellProviderStack
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/compose-client-app.tsx"],"sourcesContent":["import {configureApiClient} from '@shipfox/client-api';\nimport {\n ConfigErrorScreen,\n getWindowRuntimeConfig,\n loadConfig,\n setLoadedConfig,\n} from '@shipfox/client-config';\nimport {ThemeProvider} from '@shipfox/react-ui/theme';\nimport {Toaster} from '@shipfox/react-ui/toast';\nimport {TooltipProvider} from '@shipfox/react-ui/tooltip';\nimport {QueryClient} from '@tanstack/react-query';\nimport {type AnyRouter, RouterProvider} from '@tanstack/react-router';\nimport {createStore} from 'jotai';\nimport {StrictMode, useEffect} from 'react';\nimport {createRoot} from 'react-dom/client';\nimport {composeClientFeatures} from '#compose/compose-client-features.js';\nimport type {ClientFeature} from '#contract.js';\nimport {useAuthState} from './auth.js';\nimport {ChromeProvider, type ChromeSlots} from './chrome-context.js';\nimport {type ClientAnalytics, ClientAnalyticsProvider} from './client-analytics.js';\nimport {ShellProviderStack} from './provider-stack.js';\nimport type {WorkspaceSetupGate} from './workspace-setup.js';\n\nexport function composeClientApp({\n features,\n router,\n chrome,\n workspaceSetup,\n clientAnalytics,\n}: {\n features: readonly ClientFeature[];\n router: AnyRouter;\n chrome?: ChromeSlots;\n workspaceSetup?: WorkspaceSetupGate;\n clientAnalytics?: ClientAnalytics;\n}) {\n const composition = composeClientFeatures(features);\n const config = loadConfig(composition.configShape, {\n runtime: getWindowRuntimeConfig(),\n build: (import.meta as ImportMeta & {env?: Record<string, unknown>}).env,\n });\n if (config.ok) setLoadedConfig(config.config);\n\n return {\n mount(element: HTMLElement): () => void {\n const root = createRoot(element);\n const unmount = () => root.unmount();\n if (!config.ok) {\n root.render(\n <StrictMode>\n <ThemeProvider>\n <TooltipProvider>\n <ConfigErrorScreen errors={config.errors} />\n </TooltipProvider>\n </ThemeProvider>\n </StrictMode>,\n );\n return unmount;\n }\n\n configureApiClient({baseUrl: configApiUrl(config.config)});\n const queryClient = new QueryClient();\n root.render(\n <StrictMode>\n <ChromeProvider chrome={chrome}>\n <ClientAnalyticsProvider {...(clientAnalytics ? {analytics: clientAnalytics} : {})}>\n <ShellProviderStack\n features={features}\n queryClient={queryClient}\n store={createStore()}\n >\n <RoutedApp\n router={router}\n queryClient={queryClient}\n workspaceSetup={workspaceSetup}\n projectSlugResolver={chrome?.projectSlugResolver}\n />\n <Toaster />\n </ShellProviderStack>\n </ClientAnalyticsProvider>\n </ChromeProvider>\n </StrictMode>,\n );\n return unmount;\n },\n };\n}\n\nfunction RoutedApp({\n router,\n queryClient,\n workspaceSetup,\n projectSlugResolver,\n}: {\n router: AnyRouter;\n queryClient: QueryClient;\n workspaceSetup: WorkspaceSetupGate | undefined;\n projectSlugResolver: ChromeSlots['projectSlugResolver'] | undefined;\n}) {\n const auth = useAuthState();\n\n useEffect(() => {\n if (!auth.isLoading) router.invalidate();\n }, [auth.isLoading, router]);\n\n return (\n <RouterProvider\n router={router as never}\n context={{auth, queryClient, workspaceSetup, projectSlugResolver} as never}\n />\n );\n}\n\nfunction configApiUrl(config: unknown): string {\n if (\n typeof config !== 'object' ||\n config === null ||\n !('apiUrl' in config) ||\n typeof config.apiUrl !== 'string'\n ) {\n throw new Error('Composed client configuration must include a string apiUrl.');\n }\n return config.apiUrl;\n}\n"],"names":["configureApiClient","ConfigErrorScreen","getWindowRuntimeConfig","loadConfig","setLoadedConfig","ThemeProvider","Toaster","TooltipProvider","QueryClient","RouterProvider","createStore","StrictMode","useEffect","createRoot","composeClientFeatures","useAuthState","ChromeProvider","ClientAnalyticsProvider","ShellProviderStack","composeClientApp","features","router","chrome","workspaceSetup","clientAnalytics","composition","config","configShape","runtime","build","env","ok","mount","element","root","unmount","render","errors","baseUrl","configApiUrl","queryClient","analytics","store","RoutedApp","projectSlugResolver","auth","isLoading","invalidate","context","apiUrl","Error"],"mappings":";AAAA,SAAQA,kBAAkB,QAAO,sBAAsB;AACvD,SACEC,iBAAiB,EACjBC,sBAAsB,EACtBC,UAAU,EACVC,eAAe,QACV,yBAAyB;AAChC,SAAQC,aAAa,QAAO,0BAA0B;AACtD,SAAQC,OAAO,QAAO,0BAA0B;AAChD,SAAQC,eAAe,QAAO,4BAA4B;AAC1D,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAwBC,cAAc,QAAO,yBAAyB;AACtE,SAAQC,WAAW,QAAO,QAAQ;AAClC,SAAQC,UAAU,EAAEC,SAAS,QAAO,QAAQ;AAC5C,SAAQC,UAAU,QAAO,mBAAmB;AAC5C,SAAQC,qBAAqB,QAAO,sCAAsC;AAE1E,SAAQC,YAAY,QAAO,YAAY;AACvC,SAAQC,cAAc,QAAyB,sBAAsB;AACrE,SAA8BC,uBAAuB,QAAO,wBAAwB;AACpF,SAAQC,kBAAkB,QAAO,sBAAsB;AAGvD,OAAO,SAASC,iBAAiB,EAC/BC,QAAQ,EACRC,MAAM,EACNC,MAAM,EACNC,cAAc,EACdC,eAAe,EAOhB;IACC,MAAMC,cAAcX,sBAAsBM;IAC1C,MAAMM,SAASvB,WAAWsB,YAAYE,WAAW,EAAE;QACjDC,SAAS1B;QACT2B,OAAO,AAAC,YAA6DC,GAAG;IAC1E;IACA,IAAIJ,OAAOK,EAAE,EAAE3B,gBAAgBsB,OAAOA,MAAM;IAE5C,OAAO;QACLM,OAAMC,OAAoB;YACxB,MAAMC,OAAOrB,WAAWoB;YACxB,MAAME,UAAU,IAAMD,KAAKC,OAAO;YAClC,IAAI,CAACT,OAAOK,EAAE,EAAE;gBACdG,KAAKE,MAAM,eACT,KAACzB;8BACC,cAAA,KAACN;kCACC,cAAA,KAACE;sCACC,cAAA,KAACN;gCAAkBoC,QAAQX,OAAOW,MAAM;;;;;gBAKhD,OAAOF;YACT;YAEAnC,mBAAmB;gBAACsC,SAASC,aAAab,OAAOA,MAAM;YAAC;YACxD,MAAMc,cAAc,IAAIhC;YACxB0B,KAAKE,MAAM,eACT,KAACzB;0BACC,cAAA,KAACK;oBAAeM,QAAQA;8BACtB,cAAA,KAACL;wBAAyB,GAAIO,kBAAkB;4BAACiB,WAAWjB;wBAAe,IAAI,CAAC,CAAC;kCAC/E,cAAA,MAACN;4BACCE,UAAUA;4BACVoB,aAAaA;4BACbE,OAAOhC;;8CAEP,KAACiC;oCACCtB,QAAQA;oCACRmB,aAAaA;oCACbjB,gBAAgBA;oCAChBqB,qBAAqBtB,QAAQsB;;8CAE/B,KAACtC;;;;;;YAMX,OAAO6B;QACT;IACF;AACF;AAEA,SAASQ,UAAU,EACjBtB,MAAM,EACNmB,WAAW,EACXjB,cAAc,EACdqB,mBAAmB,EAMpB;IACC,MAAMC,OAAO9B;IAEbH,UAAU;QACR,IAAI,CAACiC,KAAKC,SAAS,EAAEzB,OAAO0B,UAAU;IACxC,GAAG;QAACF,KAAKC,SAAS;QAAEzB;KAAO;IAE3B,qBACE,KAACZ;QACCY,QAAQA;QACR2B,SAAS;YAACH;YAAML;YAAajB;YAAgBqB;QAAmB;;AAGtE;AAEA,SAASL,aAAab,MAAe;IACnC,IACE,OAAOA,WAAW,YAClBA,WAAW,QACX,CAAE,CAAA,YAAYA,MAAK,KACnB,OAAOA,OAAOuB,MAAM,KAAK,UACzB;QACA,MAAM,IAAIC,MAAM;IAClB;IACA,OAAOxB,OAAOuB,MAAM;AACtB"}
|
package/dist/runtime/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export * from './anchor-paths.js';
|
|
|
16
16
|
export * from './anchors.js';
|
|
17
17
|
export * from './auth.js';
|
|
18
18
|
export * from './chrome-context.js';
|
|
19
|
+
export * from './client-analytics.js';
|
|
19
20
|
export * from './compose-client-app.js';
|
|
20
21
|
export * from './define-route.js';
|
|
21
22
|
export * from './last-workspace.js';
|
|
@@ -26,4 +27,5 @@ export * from './route-inputs.js';
|
|
|
26
27
|
export * from './router-context.js';
|
|
27
28
|
export * from './search-serialization.js';
|
|
28
29
|
export * from './workspace-setup.js';
|
|
30
|
+
export * from './workspace-setup-dismissal.js';
|
|
29
31
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAC;AACtF,OAAO,EACL,gCAAgC,EAChC,YAAY,GACb,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAC,cAAc,EAAE,KAAK,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACxF,OAAO,EAAC,iBAAiB,EAAC,MAAM,mCAAmC,CAAC;AACpE,YAAY,EACV,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,sBAAsB,EAAE,cAAc,EAAC,MAAM,8BAA8B,CAAC;AACpF,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAC;AACtF,OAAO,EACL,gCAAgC,EAChC,YAAY,GACb,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAC,cAAc,EAAE,KAAK,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACxF,OAAO,EAAC,iBAAiB,EAAC,MAAM,mCAAmC,CAAC;AACpE,YAAY,EACV,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,sBAAsB,EAAE,cAAc,EAAC,MAAM,8BAA8B,CAAC;AACpF,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC"}
|
package/dist/runtime/index.js
CHANGED
|
@@ -15,6 +15,7 @@ export * from './anchor-paths.js';
|
|
|
15
15
|
export * from './anchors.js';
|
|
16
16
|
export * from './auth.js';
|
|
17
17
|
export * from './chrome-context.js';
|
|
18
|
+
export * from './client-analytics.js';
|
|
18
19
|
export * from './compose-client-app.js';
|
|
19
20
|
export * from './define-route.js';
|
|
20
21
|
export * from './last-workspace.js';
|
|
@@ -25,5 +26,6 @@ export * from './route-inputs.js';
|
|
|
25
26
|
export * from './router-context.js';
|
|
26
27
|
export * from './search-serialization.js';
|
|
27
28
|
export * from './workspace-setup.js';
|
|
29
|
+
export * from './workspace-setup-dismissal.js';
|
|
28
30
|
|
|
29
31
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["export {AuthActions, AuthShell, type AuthShellProps} from '#components/auth-shell.js';\nexport {\n FOCUSED_FRAME_CONTENT_CLASS_NAME,\n FocusedFrame,\n} from '#components/focused-frame.js';\nexport {WorkspaceCrumb, type WorkspaceCrumbProps} from '#components/workspace-crumb.js';\nexport {WorkspaceSwitcher} from '#components/workspace-switcher.js';\nexport type {\n AuthenticatedSession,\n UserIdentity,\n WorkspaceMembership,\n WorkspaceSummary,\n} from '#core/session.js';\nexport {toAuthenticatedSession, toUserIdentity} from '#hooks/api/session-mapper.js';\nexport * from '../compose/compose-client-features.js';\nexport * from '../compose/compose-routes.js';\nexport * from '../compose/errors.js';\nexport * from '../compose/merge-config.js';\nexport * from '../compose/normalize-route-path.js';\nexport * from '../compose/validate-providers.js';\nexport * from '../compose/validate-registries.js';\nexport * from './active-workspace.js';\nexport * from './anchor-paths.js';\nexport * from './anchors.js';\nexport * from './auth.js';\nexport * from './chrome-context.js';\nexport * from './compose-client-app.js';\nexport * from './define-route.js';\nexport * from './last-workspace.js';\nexport * from './layout-navigation.js';\nexport * from './nav-order.js';\nexport * from './route-frame.js';\nexport * from './route-inputs.js';\nexport * from './router-context.js';\nexport * from './search-serialization.js';\nexport * from './workspace-setup.js';\n"],"names":["AuthActions","AuthShell","FOCUSED_FRAME_CONTENT_CLASS_NAME","FocusedFrame","WorkspaceCrumb","WorkspaceSwitcher","toAuthenticatedSession","toUserIdentity"],"mappings":"AAAA,SAAQA,WAAW,EAAEC,SAAS,QAA4B,4BAA4B;AACtF,SACEC,gCAAgC,EAChCC,YAAY,QACP,+BAA+B;AACtC,SAAQC,cAAc,QAAiC,iCAAiC;AACxF,SAAQC,iBAAiB,QAAO,oCAAoC;AAOpE,SAAQC,sBAAsB,EAAEC,cAAc,QAAO,+BAA+B;AACpF,cAAc,wCAAwC;AACtD,cAAc,+BAA+B;AAC7C,cAAc,uBAAuB;AACrC,cAAc,6BAA6B;AAC3C,cAAc,qCAAqC;AACnD,cAAc,mCAAmC;AACjD,cAAc,oCAAoC;AAClD,cAAc,wBAAwB;AACtC,cAAc,oBAAoB;AAClC,cAAc,eAAe;AAC7B,cAAc,YAAY;AAC1B,cAAc,sBAAsB;AACpC,cAAc,0BAA0B;AACxC,cAAc,oBAAoB;AAClC,cAAc,sBAAsB;AACpC,cAAc,yBAAyB;AACvC,cAAc,iBAAiB;AAC/B,cAAc,mBAAmB;AACjC,cAAc,oBAAoB;AAClC,cAAc,sBAAsB;AACpC,cAAc,4BAA4B;AAC1C,cAAc,uBAAuB"}
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/index.ts"],"sourcesContent":["export {AuthActions, AuthShell, type AuthShellProps} from '#components/auth-shell.js';\nexport {\n FOCUSED_FRAME_CONTENT_CLASS_NAME,\n FocusedFrame,\n} from '#components/focused-frame.js';\nexport {WorkspaceCrumb, type WorkspaceCrumbProps} from '#components/workspace-crumb.js';\nexport {WorkspaceSwitcher} from '#components/workspace-switcher.js';\nexport type {\n AuthenticatedSession,\n UserIdentity,\n WorkspaceMembership,\n WorkspaceSummary,\n} from '#core/session.js';\nexport {toAuthenticatedSession, toUserIdentity} from '#hooks/api/session-mapper.js';\nexport * from '../compose/compose-client-features.js';\nexport * from '../compose/compose-routes.js';\nexport * from '../compose/errors.js';\nexport * from '../compose/merge-config.js';\nexport * from '../compose/normalize-route-path.js';\nexport * from '../compose/validate-providers.js';\nexport * from '../compose/validate-registries.js';\nexport * from './active-workspace.js';\nexport * from './anchor-paths.js';\nexport * from './anchors.js';\nexport * from './auth.js';\nexport * from './chrome-context.js';\nexport * from './client-analytics.js';\nexport * from './compose-client-app.js';\nexport * from './define-route.js';\nexport * from './last-workspace.js';\nexport * from './layout-navigation.js';\nexport * from './nav-order.js';\nexport * from './route-frame.js';\nexport * from './route-inputs.js';\nexport * from './router-context.js';\nexport * from './search-serialization.js';\nexport * from './workspace-setup.js';\nexport * from './workspace-setup-dismissal.js';\n"],"names":["AuthActions","AuthShell","FOCUSED_FRAME_CONTENT_CLASS_NAME","FocusedFrame","WorkspaceCrumb","WorkspaceSwitcher","toAuthenticatedSession","toUserIdentity"],"mappings":"AAAA,SAAQA,WAAW,EAAEC,SAAS,QAA4B,4BAA4B;AACtF,SACEC,gCAAgC,EAChCC,YAAY,QACP,+BAA+B;AACtC,SAAQC,cAAc,QAAiC,iCAAiC;AACxF,SAAQC,iBAAiB,QAAO,oCAAoC;AAOpE,SAAQC,sBAAsB,EAAEC,cAAc,QAAO,+BAA+B;AACpF,cAAc,wCAAwC;AACtD,cAAc,+BAA+B;AAC7C,cAAc,uBAAuB;AACrC,cAAc,6BAA6B;AAC3C,cAAc,qCAAqC;AACnD,cAAc,mCAAmC;AACjD,cAAc,oCAAoC;AAClD,cAAc,wBAAwB;AACtC,cAAc,oBAAoB;AAClC,cAAc,eAAe;AAC7B,cAAc,YAAY;AAC1B,cAAc,sBAAsB;AACpC,cAAc,wBAAwB;AACtC,cAAc,0BAA0B;AACxC,cAAc,oBAAoB;AAClC,cAAc,sBAAsB;AACpC,cAAc,yBAAyB;AACvC,cAAc,iBAAiB;AAC/B,cAAc,mBAAmB;AACjC,cAAc,oBAAoB;AAClC,cAAc,sBAAsB;AACpC,cAAc,4BAA4B;AAC1C,cAAc,uBAAuB;AACrC,cAAc,iCAAiC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads whether the checklist was dismissed on this device at call time.
|
|
3
|
+
* Consumers that mount the value as UI state own any re-read or subscription.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isWorkspaceSetupChecklistDismissed(workspaceId: string): boolean;
|
|
6
|
+
export declare function dismissWorkspaceSetupChecklist(workspaceId: string): void;
|
|
7
|
+
export declare function clearWorkspaceSetupChecklistDismissal(workspaceId: string): void;
|
|
8
|
+
//# sourceMappingURL=workspace-setup-dismissal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-setup-dismissal.d.ts","sourceRoot":"","sources":["../../src/runtime/workspace-setup-dismissal.ts"],"names":[],"mappings":"AAqBA;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE/E;AAED,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExE;AAED,wBAAgB,qCAAqC,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAE/E"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createTypedBrowserStorage, localStorageOrUndefined } from '@shipfox/client-ui';
|
|
2
|
+
const workspaceSetupChecklistDismissalKey = {
|
|
3
|
+
key: 'shipfox.workspaceSetupChecklist.dismissed',
|
|
4
|
+
lifetime: 'persistent',
|
|
5
|
+
principalScope: 'workspace',
|
|
6
|
+
serialize: (dismissed)=>JSON.stringify(dismissed),
|
|
7
|
+
parse: (raw)=>{
|
|
8
|
+
try {
|
|
9
|
+
const parsed = JSON.parse(raw);
|
|
10
|
+
return typeof parsed === 'boolean' ? parsed : undefined;
|
|
11
|
+
} catch {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Reads whether the checklist was dismissed on this device at call time.
|
|
18
|
+
* Consumers that mount the value as UI state own any re-read or subscription.
|
|
19
|
+
*/ export function isWorkspaceSetupChecklistDismissed(workspaceId) {
|
|
20
|
+
return workspaceSetupChecklistDismissalStorage(workspaceId).read() === true;
|
|
21
|
+
}
|
|
22
|
+
export function dismissWorkspaceSetupChecklist(workspaceId) {
|
|
23
|
+
workspaceSetupChecklistDismissalStorage(workspaceId).write(true);
|
|
24
|
+
}
|
|
25
|
+
export function clearWorkspaceSetupChecklistDismissal(workspaceId) {
|
|
26
|
+
workspaceSetupChecklistDismissalStorage(workspaceId).remove();
|
|
27
|
+
}
|
|
28
|
+
function workspaceSetupChecklistDismissalStorage(workspaceId) {
|
|
29
|
+
return createTypedBrowserStorage(localStorageOrUndefined, workspaceSetupChecklistDismissalKey, {
|
|
30
|
+
workspaceId
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=workspace-setup-dismissal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/workspace-setup-dismissal.ts"],"sourcesContent":["import {\n type BrowserStorageKey,\n createTypedBrowserStorage,\n localStorageOrUndefined,\n} from '@shipfox/client-ui';\n\nconst workspaceSetupChecklistDismissalKey = {\n key: 'shipfox.workspaceSetupChecklist.dismissed',\n lifetime: 'persistent',\n principalScope: 'workspace',\n serialize: (dismissed: boolean) => JSON.stringify(dismissed),\n parse: (raw: string) => {\n try {\n const parsed: unknown = JSON.parse(raw);\n return typeof parsed === 'boolean' ? parsed : undefined;\n } catch {\n return undefined;\n }\n },\n} satisfies BrowserStorageKey<boolean>;\n\n/**\n * Reads whether the checklist was dismissed on this device at call time.\n * Consumers that mount the value as UI state own any re-read or subscription.\n */\nexport function isWorkspaceSetupChecklistDismissed(workspaceId: string): boolean {\n return workspaceSetupChecklistDismissalStorage(workspaceId).read() === true;\n}\n\nexport function dismissWorkspaceSetupChecklist(workspaceId: string): void {\n workspaceSetupChecklistDismissalStorage(workspaceId).write(true);\n}\n\nexport function clearWorkspaceSetupChecklistDismissal(workspaceId: string): void {\n workspaceSetupChecklistDismissalStorage(workspaceId).remove();\n}\n\nfunction workspaceSetupChecklistDismissalStorage(workspaceId: string) {\n return createTypedBrowserStorage(localStorageOrUndefined, workspaceSetupChecklistDismissalKey, {\n workspaceId,\n });\n}\n"],"names":["createTypedBrowserStorage","localStorageOrUndefined","workspaceSetupChecklistDismissalKey","key","lifetime","principalScope","serialize","dismissed","JSON","stringify","parse","raw","parsed","undefined","isWorkspaceSetupChecklistDismissed","workspaceId","workspaceSetupChecklistDismissalStorage","read","dismissWorkspaceSetupChecklist","write","clearWorkspaceSetupChecklistDismissal","remove"],"mappings":"AAAA,SAEEA,yBAAyB,EACzBC,uBAAuB,QAClB,qBAAqB;AAE5B,MAAMC,sCAAsC;IAC1CC,KAAK;IACLC,UAAU;IACVC,gBAAgB;IAChBC,WAAW,CAACC,YAAuBC,KAAKC,SAAS,CAACF;IAClDG,OAAO,CAACC;QACN,IAAI;YACF,MAAMC,SAAkBJ,KAAKE,KAAK,CAACC;YACnC,OAAO,OAAOC,WAAW,YAAYA,SAASC;QAChD,EAAE,OAAM;YACN,OAAOA;QACT;IACF;AACF;AAEA;;;CAGC,GACD,OAAO,SAASC,mCAAmCC,WAAmB;IACpE,OAAOC,wCAAwCD,aAAaE,IAAI,OAAO;AACzE;AAEA,OAAO,SAASC,+BAA+BH,WAAmB;IAChEC,wCAAwCD,aAAaI,KAAK,CAAC;AAC7D;AAEA,OAAO,SAASC,sCAAsCL,WAAmB;IACvEC,wCAAwCD,aAAaM,MAAM;AAC7D;AAEA,SAASL,wCAAwCD,WAAmB;IAClE,OAAOf,0BAA0BC,yBAAyBC,qCAAqC;QAC7Fa;IACF;AACF"}
|