@farthershore/farthershore-js 0.1.13 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/README.md +10 -0
- package/dist/components/auth.d.ts +3 -0
- package/dist/components/auth.d.ts.map +1 -1
- package/dist/components/auth.js +32 -36
- package/dist/components/auth.js.map +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/monogram.d.ts +14 -0
- package/dist/components/monogram.d.ts.map +1 -0
- package/dist/components/monogram.js +98 -0
- package/dist/components/monogram.js.map +1 -0
- package/dist/components/root.d.ts.map +1 -1
- package/dist/components/root.js +17 -18
- package/dist/components/root.js.map +1 -1
- package/dist/components/satellite-boot.d.ts +44 -0
- package/dist/components/satellite-boot.d.ts.map +1 -0
- package/dist/components/satellite-boot.js +162 -0
- package/dist/components/satellite-boot.js.map +1 -0
- package/dist/components/splash.d.ts +3 -0
- package/dist/components/splash.d.ts.map +1 -0
- package/dist/components/splash.js +43 -0
- package/dist/components/splash.js.map +1 -0
- package/dist/components/styles.css +59 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,50 @@ This project adheres to Semantic Versioning (pre-1.0: minors may break).
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.1.15] - 2026-06-10
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Default favicon for products without an uploaded icon.** The Root now
|
|
13
|
+
generates a monogram mark (the product's initial on its brand color, canvas
|
|
14
|
+
PNG with an SVG fallback) and applies it as the favicon when
|
|
15
|
+
`branding.iconUrl` is unset — instead of leaving the browser's blank
|
|
16
|
+
default page icon. It only ever replaces a placeholder (a missing link, the
|
|
17
|
+
template's `data:,`, or a previous monogram), so custom builds shipping
|
|
18
|
+
their own favicon are never clobbered. `<FsSplash/>` and the template's
|
|
19
|
+
inline boot splash show the same monogram in place of the neutral dot.
|
|
20
|
+
(`monogram.ts` — `productMonogramDataUri` / `applyProductFavicon`.)
|
|
21
|
+
|
|
22
|
+
## [0.1.14] - 2026-06-10
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- **Satellite portals no longer redirect public visitors.** clerk-js v5
|
|
27
|
+
auto-syncs a satellite with the primary domain on every document load that
|
|
28
|
+
has no local session — bouncing every anonymous visit through the primary
|
|
29
|
+
sign-in page (portal → sign-in → portal, three paints). The new satellite
|
|
30
|
+
boot planner (`satellite-boot.ts`) pre-marks the URL `__clerk_synced=true`
|
|
31
|
+
before clerk-js loads, so public pages render instantly with zero redirects.
|
|
32
|
+
An explicit "Sign in" click still round-trips through the primary and
|
|
33
|
+
completes silently when a platform session exists.
|
|
34
|
+
- A `#fs-sso` URL fragment (appended by trusted platform surfaces, e.g. the
|
|
35
|
+
dashboard's "Open portal" links) now triggers the handshake **before
|
|
36
|
+
clerk-js loads** — and in the dev-portal template, before first paint — so
|
|
37
|
+
opening a portal from the dashboard lands signed in with one quiet hop
|
|
38
|
+
instead of multiple full-page flashes.
|
|
39
|
+
- Removed the dead `SatelliteAutoSync` reload hack (clerk-js v5 redirects
|
|
40
|
+
during `load()`, before `isLoaded` ever turns true — the effect never ran).
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
|
|
44
|
+
- `FsAuth.pendingSsoRedirect` — true while the page is navigating to the
|
|
45
|
+
primary for the SSO handshake; hosts keep their splash up instead of
|
|
46
|
+
flashing the signed-out portal.
|
|
47
|
+
- `<FsSplash/>` — the branded boot splash (product mark + name from the
|
|
48
|
+
edge-injected branding, theme-aware before providers mount). Used by
|
|
49
|
+
`<FartherShoreRoot>`'s resolve gate; exported for host apps.
|
|
50
|
+
- `FS_SSO_FRAGMENT` constant for platform surfaces that build portal links.
|
|
51
|
+
|
|
8
52
|
## [0.1.1] - 2026-06-09
|
|
9
53
|
|
|
10
54
|
### Added
|
package/README.md
CHANGED
|
@@ -122,6 +122,16 @@ Portals served through the Farther Shore edge need **no config at all** —
|
|
|
122
122
|
into the served HTML, and the SDK falls back to it. Explicit config always wins,
|
|
123
123
|
and everywhere else (local dev, SSR, self-hosting) `coreUrl` is required.
|
|
124
124
|
|
|
125
|
+
On Clerk **satellite** portals (the portal host is a different domain than the
|
|
126
|
+
platform's sign-in domain), the managed auth layer also owns the cross-domain
|
|
127
|
+
session handshake: public visits never redirect (the SDK pre-marks the URL
|
|
128
|
+
`__clerk_synced=true` so clerk-js skips its auto-sync), and a `#fs-sso` URL
|
|
129
|
+
fragment — appended by trusted platform surfaces like the dashboard's "Open
|
|
130
|
+
portal" links — triggers an immediate pre-paint redirect through the primary
|
|
131
|
+
domain that lands back signed in. `useFsAuth().pendingSsoRedirect` is true
|
|
132
|
+
while that navigation is in flight (keep a splash up). See
|
|
133
|
+
`src/components/satellite-boot.ts` for the exact decision table.
|
|
134
|
+
|
|
125
135
|
## SSR / server usage
|
|
126
136
|
|
|
127
137
|
On a server there is no `window`/`location` to infer the portal host from and no
|
|
@@ -13,6 +13,9 @@ export interface FsAuth {
|
|
|
13
13
|
strategy: AuthStrategy;
|
|
14
14
|
/** False while auth is initializing (Clerk JS loading / first session read). */
|
|
15
15
|
loaded: boolean;
|
|
16
|
+
/** True while the page is navigating to the primary domain for the silent
|
|
17
|
+
* SSO handshake (an `#fs-sso`-hinted load) — hosts keep their splash up. */
|
|
18
|
+
pendingSsoRedirect: boolean;
|
|
16
19
|
signedIn: boolean;
|
|
17
20
|
/** Clerk → redirect to the primary hosted sign-in (returning here);
|
|
18
21
|
* persona → no-op (render a persona sign-in form via `useSession().signIn`). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/components/auth.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/components/auth.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD;;;+EAG+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,YAAY,CAAC;IACvB,gFAAgF;IAChF,MAAM,EAAE,OAAO,CAAC;IAChB;iFAC6E;IAC7E,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB;qFACiF;IACjF,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,8EAA8E;IAC9E,IAAI,EAAE,OAAO,CAAC;IACd,sEAAsE;IACtE,OAAO,IAAI,IAAI,CAAC;CACjB;AAID,wBAAgB,SAAS,IAAI,MAAM,CAQlC;AAED;0EAC0E;AAC1E,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAID,sDAAsD;AACtD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,kDAG7D;AAED;oCACoC;AACpC,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,kDAG9D;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,kDAGhE;AAED;;mEAEmE;AACnE,wBAAgB,cAAc,CAAC,EAC7B,SAA2C,EAC3C,QAAoB,GACrB,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,2CAOA;AAED,gDAAgD;AAChD,wBAAgB,eAAe,CAAC,EAC9B,SAA+C,EAC/C,QAAqB,GACtB,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,2CAWA;AA+PD;;;+CAG+C;AAC/C,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,GAAG,SAAS,GAClC,aAAa,GAAG,SAAS,CAS3B;AAED;iFACiF;AACjF,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,KAAK,EACL,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAYA;AAID;;0EAE0E;AAC1E,wBAAgB,YAAY,mDA6B3B"}
|
package/dist/components/auth.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fragment as _Fragment, jsx as _jsx
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
// Managed auth — the SDK owns the whole sign-in story so a host app never
|
|
3
3
|
// writes auth glue. `<FartherShoreRoot>` mounts <FsAuth> with the environment's
|
|
4
4
|
// strategy (from bootstrap):
|
|
@@ -6,9 +6,11 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
6
6
|
// - "clerk": dynamically loads `@clerk/clerk-react` (an OPTIONAL peer — only
|
|
7
7
|
// Clerk-strategy portals pay for it), mounts ClerkProvider in satellite mode
|
|
8
8
|
// (one shared Clerk instance serves every product host; sign-in happens on
|
|
9
|
-
// the primary domain and
|
|
10
|
-
//
|
|
11
|
-
//
|
|
9
|
+
// the primary domain), and installs Clerk's `getToken` as the client's
|
|
10
|
+
// per-request token source. Nothing else to wire. The cross-domain
|
|
11
|
+
// handshake is managed by the satellite boot planner (satellite-boot.ts):
|
|
12
|
+
// public visits never redirect, `#fs-sso`-hinted visits (platform "Open
|
|
13
|
+
// portal" links) handshake with the primary before clerk-js even loads.
|
|
12
14
|
// - "test-personas": the SDK's own persona session (`fs.auth.signIn` with an
|
|
13
15
|
// `fsk_test_…` key) — persisted/restored automatically by the client.
|
|
14
16
|
//
|
|
@@ -21,6 +23,7 @@ import { FartherShoreConfigError } from "../errors.js";
|
|
|
21
23
|
import { readRuntimeConfig } from "../config.js";
|
|
22
24
|
import { useFartherShore, useSession } from "../react/index.js";
|
|
23
25
|
import { useFsTheme } from "./theme.js";
|
|
26
|
+
import { runSatelliteBoot } from "./satellite-boot.js";
|
|
24
27
|
const Ctx = createContext(null);
|
|
25
28
|
export function useFsAuth() {
|
|
26
29
|
const ctx = useContext(Ctx);
|
|
@@ -86,32 +89,6 @@ function defaultSatelliteDomain() {
|
|
|
86
89
|
const parts = window.location.hostname.split(".");
|
|
87
90
|
return parts.length > 2 ? parts.slice(1).join(".") : undefined;
|
|
88
91
|
}
|
|
89
|
-
// Port of the SSR portal's satellite-auto-sync: on a public page Clerk doesn't
|
|
90
|
-
// handshake with the primary domain by itself, so a visitor already signed in
|
|
91
|
-
// on the primary looks signed out here. One sessionStorage-guarded redirect
|
|
92
|
-
// with `?__clerk_synced=false` makes Clerk handshake and propagate the session.
|
|
93
|
-
const HANDSHAKE_FLAG = "__fs_clerk_handshake_attempted";
|
|
94
|
-
function SatelliteAutoSync({ clerk }) {
|
|
95
|
-
const { isLoaded, isSignedIn } = clerk.useAuth();
|
|
96
|
-
useEffect(() => {
|
|
97
|
-
if (!isLoaded || isSignedIn)
|
|
98
|
-
return;
|
|
99
|
-
if (typeof window === "undefined")
|
|
100
|
-
return;
|
|
101
|
-
const w = window;
|
|
102
|
-
if (!w.Clerk?.isSatellite)
|
|
103
|
-
return;
|
|
104
|
-
const url = new URL(window.location.href);
|
|
105
|
-
if (url.searchParams.has("__clerk_synced"))
|
|
106
|
-
return;
|
|
107
|
-
if (window.sessionStorage.getItem(HANDSHAKE_FLAG) === "true")
|
|
108
|
-
return;
|
|
109
|
-
window.sessionStorage.setItem(HANDSHAKE_FLAG, "true");
|
|
110
|
-
url.searchParams.set("__clerk_synced", "false");
|
|
111
|
-
window.location.href = url.toString();
|
|
112
|
-
}, [isLoaded, isSignedIn]);
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
92
|
/** Installs Clerk's getToken as the client's token source (synchronously on
|
|
116
93
|
* render, so data hooks mounted alongside resolve tokens on first fetch) and
|
|
117
94
|
* publishes the FsAuth surface. */
|
|
@@ -128,6 +105,7 @@ function ClerkAuthBridge({ clerk, children, }) {
|
|
|
128
105
|
const value = useMemo(() => ({
|
|
129
106
|
strategy: "clerk",
|
|
130
107
|
loaded: isLoaded,
|
|
108
|
+
pendingSsoRedirect: false,
|
|
131
109
|
signedIn: Boolean(isSignedIn),
|
|
132
110
|
signIn: () => {
|
|
133
111
|
void clerkApi.redirectToSignIn({
|
|
@@ -145,10 +123,20 @@ function ClerkAuthBridge({ clerk, children, }) {
|
|
|
145
123
|
}
|
|
146
124
|
function ClerkAuth({ config, children, }) {
|
|
147
125
|
const { mode } = useFsTheme();
|
|
126
|
+
// Decide the satellite handshake BEFORE clerk-js loads (synchronously on
|
|
127
|
+
// first render): `#fs-sso` visits navigate to the primary now; everything
|
|
128
|
+
// else gets the auto-sync suppression marker. See satellite-boot.ts.
|
|
129
|
+
const [boot] = useState(() => runSatelliteBoot({
|
|
130
|
+
publishableKey: config.publishableKey,
|
|
131
|
+
signInUrl: config.signInUrl,
|
|
132
|
+
satelliteDomain: config.satelliteDomain ?? defaultSatelliteDomain(),
|
|
133
|
+
}));
|
|
148
134
|
const [mod, setMod] = useState(null);
|
|
149
135
|
const [failed, setFailed] = useState(false);
|
|
150
136
|
const [darkTheme, setDarkTheme] = useState(null);
|
|
151
137
|
useEffect(() => {
|
|
138
|
+
if (boot.pendingRedirect)
|
|
139
|
+
return; // navigating away — skip the work
|
|
152
140
|
let alive = true;
|
|
153
141
|
void loadClerk().then((m) => {
|
|
154
142
|
if (!alive)
|
|
@@ -165,7 +153,13 @@ function ClerkAuth({ config, children, }) {
|
|
|
165
153
|
return () => {
|
|
166
154
|
alive = false;
|
|
167
155
|
};
|
|
168
|
-
}, []);
|
|
156
|
+
}, [boot.pendingRedirect]);
|
|
157
|
+
if (boot.pendingRedirect) {
|
|
158
|
+
// The page is mid-navigation to the primary's sync URL — hold auth in
|
|
159
|
+
// its loading state (with the pending flag) so hosts keep a splash up
|
|
160
|
+
// instead of flashing the signed-out portal.
|
|
161
|
+
return (_jsx(LoadingAuth, { strategy: "clerk", pendingSsoRedirect: true, children: children }));
|
|
162
|
+
}
|
|
169
163
|
if (failed) {
|
|
170
164
|
// Peer not installed: portal renders signed-out, data still works.
|
|
171
165
|
return _jsx(SignedOutFallback, { strategy: "clerk", children: children });
|
|
@@ -179,9 +173,9 @@ function ClerkAuth({ config, children, }) {
|
|
|
179
173
|
? { isSatellite: true, domain, signInUrl: config.signInUrl }
|
|
180
174
|
: {};
|
|
181
175
|
const Provider = mod.ClerkProvider;
|
|
182
|
-
return (
|
|
176
|
+
return (_jsx(Provider, { publishableKey: config.publishableKey, appearance: {
|
|
183
177
|
baseTheme: mode === "dark" && darkTheme ? darkTheme : undefined,
|
|
184
|
-
}, ...satelliteProps, children:
|
|
178
|
+
}, ...satelliteProps, children: _jsx(ClerkAuthBridge, { clerk: mod, children: children }) }));
|
|
185
179
|
}
|
|
186
180
|
/* ── Persona (SDK-managed sessions) ────────────────────────────── */
|
|
187
181
|
function PersonaAuth({ children }) {
|
|
@@ -190,6 +184,7 @@ function PersonaAuth({ children }) {
|
|
|
190
184
|
const value = useMemo(() => ({
|
|
191
185
|
strategy: "test-personas",
|
|
192
186
|
loaded: !session.loading,
|
|
187
|
+
pendingSsoRedirect: false,
|
|
193
188
|
signedIn: Boolean(session.data?.authenticated),
|
|
194
189
|
signIn: () => {
|
|
195
190
|
// Persona sign-in is a form (an access key) — hosts render FsSignIn /
|
|
@@ -207,10 +202,11 @@ function PersonaAuth({ children }) {
|
|
|
207
202
|
return _jsx(Ctx.Provider, { value: value, children: children });
|
|
208
203
|
}
|
|
209
204
|
/* ── Shared fallbacks + the strategy switch ────────────────────── */
|
|
210
|
-
function staticAuth(strategy, loaded) {
|
|
205
|
+
function staticAuth(strategy, loaded, pendingSsoRedirect = false) {
|
|
211
206
|
return {
|
|
212
207
|
strategy,
|
|
213
208
|
loaded,
|
|
209
|
+
pendingSsoRedirect,
|
|
214
210
|
signedIn: false,
|
|
215
211
|
signIn: () => { },
|
|
216
212
|
signOut: async () => { },
|
|
@@ -218,8 +214,8 @@ function staticAuth(strategy, loaded) {
|
|
|
218
214
|
refresh: () => { },
|
|
219
215
|
};
|
|
220
216
|
}
|
|
221
|
-
function LoadingAuth({ strategy, children, }) {
|
|
222
|
-
const value = useMemo(() => staticAuth(strategy, false), [strategy]);
|
|
217
|
+
function LoadingAuth({ strategy, pendingSsoRedirect = false, children, }) {
|
|
218
|
+
const value = useMemo(() => staticAuth(strategy, false, pendingSsoRedirect), [strategy, pendingSsoRedirect]);
|
|
223
219
|
return _jsx(Ctx.Provider, { value: value, children: children });
|
|
224
220
|
}
|
|
225
221
|
function SignedOutFallback({ strategy, children, }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/components/auth.tsx"],"names":[],"mappings":";AAAA,0EAA0E;AAC1E,gFAAgF;AAChF,6BAA6B;AAC7B,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/components/auth.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,10 @@ export { FsThemeProvider, useFsTheme } from "./theme.js";
|
|
|
4
4
|
export type { FsAppearance, FsThemeMode } from "./theme.js";
|
|
5
5
|
export { FsAuthProvider, useFsAuth, useOptionalFsAuth, FsUserButton, SignedIn, SignedOut, AuthLoading, FsSignInButton, FsSignOutButton, } from "./auth.js";
|
|
6
6
|
export type { FsAuth, FsClerkConfig } from "./auth.js";
|
|
7
|
+
export { FS_SSO_FRAGMENT } from "./satellite-boot.js";
|
|
7
8
|
export { FsSignIn } from "./sign-in.js";
|
|
8
9
|
export type { FsSignInProps } from "./sign-in.js";
|
|
10
|
+
export { FsSplash } from "./splash.js";
|
|
9
11
|
export { PlansTable } from "./plans-table.js";
|
|
10
12
|
export type { PlansTableProps } from "./plans-table.js";
|
|
11
13
|
export { ApiKeysPanel } from "./keys.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG5D,OAAO,EACL,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
|
package/dist/components/index.js
CHANGED
|
@@ -23,7 +23,9 @@ export { FartherShoreRoot, useBoot } from "./root.js";
|
|
|
23
23
|
export { FsThemeProvider, useFsTheme } from "./theme.js";
|
|
24
24
|
/* ── Auth (managed) ────────────────────────────────────────────── */
|
|
25
25
|
export { FsAuthProvider, useFsAuth, useOptionalFsAuth, FsUserButton, SignedIn, SignedOut, AuthLoading, FsSignInButton, FsSignOutButton, } from "./auth.js";
|
|
26
|
+
export { FS_SSO_FRAGMENT } from "./satellite-boot.js";
|
|
26
27
|
export { FsSignIn } from "./sign-in.js";
|
|
28
|
+
export { FsSplash } from "./splash.js";
|
|
27
29
|
/* ── Data components (à la carte — all zero-prop capable) ─────── */
|
|
28
30
|
export { PlansTable } from "./plans-table.js";
|
|
29
31
|
export { ApiKeysPanel } from "./keys.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,+CAA+C;AAC/C,6EAA6E;AAC7E,sEAAsE;AACtE,+DAA+D;AAC/D,gFAAgF;AAChF,8EAA8E;AAC9E,iDAAiD;AACjD,uEAAuE;AACvE,4EAA4E;AAC5E,2DAA2D;AAC3D,yEAAyE;AACzE,4EAA4E;AAC5E,8EAA8E;AAC9E,+EAA+E;AAC/E,6EAA6E;AAE7E,sEAAsE;AACtE,+EAA+E;AAC/E,0EAA0E;AAC1E,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGtD,sEAAsE;AACtE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGzD,sEAAsE;AACtE,OAAO,EACL,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,+CAA+C;AAC/C,6EAA6E;AAC7E,sEAAsE;AACtE,+DAA+D;AAC/D,gFAAgF;AAChF,8EAA8E;AAC9E,iDAAiD;AACjD,uEAAuE;AACvE,4EAA4E;AAC5E,2DAA2D;AAC3D,yEAAyE;AACzE,4EAA4E;AAC5E,8EAA8E;AAC9E,+EAA+E;AAC/E,6EAA6E;AAE7E,sEAAsE;AACtE,+EAA+E;AAC/E,0EAA0E;AAC1E,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGtD,sEAAsE;AACtE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGzD,sEAAsE;AACtE,OAAO,EACL,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qEAAqE;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,sEAAsE;AACtE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGlE,sEAAsE;AACtE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,cAAc;AACd,0EAA0E;AAC1E,2EAA2E;AAC3E,yEAAyE;AACzE,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AAcxC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAE7C,qEAAqE;AACrE,+EAA+E;AAC/E,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,sCAAsC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** A 64×64 letter-avatar data URI for the product (initial on brand color),
|
|
2
|
+
* or null when the name is empty / there is no document (SSR). */
|
|
3
|
+
export declare function productMonogramDataUri(name: string, brandColor?: string | null): string | null;
|
|
4
|
+
/** Point the document favicon at the product's mark — the uploaded icon when
|
|
5
|
+
* set, otherwise a generated monogram. The monogram only ever replaces a
|
|
6
|
+
* placeholder (a missing link, the template's `data:,`, or a previous
|
|
7
|
+
* monogram — tagged `data-fs-default-icon`), so a custom build shipping its
|
|
8
|
+
* own favicon file is never clobbered. Exported for tests. */
|
|
9
|
+
export declare function applyProductFavicon(doc: Document, product: {
|
|
10
|
+
iconUrl: string | null;
|
|
11
|
+
name: string;
|
|
12
|
+
brandColor: string | null;
|
|
13
|
+
}): void;
|
|
14
|
+
//# sourceMappingURL=monogram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monogram.d.ts","sourceRoot":"","sources":["../../src/components/monogram.ts"],"names":[],"mappings":"AA2BA;mEACmE;AACnE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GACzB,MAAM,GAAG,IAAI,CA6Bf;AAED;;;;+DAI+D;AAC/D,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,QAAQ,EACb,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC3E,IAAI,CAkCN"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Product monogram — the generated fallback mark for products that haven't
|
|
2
|
+
// uploaded an icon: the product's initial on its brand color, rendered as a
|
|
3
|
+
// favicon-ready data URI. Keeps no-icon portals from showing the browser's
|
|
4
|
+
// blank default page icon in the tab.
|
|
5
|
+
//
|
|
6
|
+
// Canvas-rendered PNG first (every browser accepts PNG data-URI favicons —
|
|
7
|
+
// Safari still ignores SVG favicons), with an inline-SVG data URI as the
|
|
8
|
+
// fallback for contexts without 2D canvas (jsdom, exotic embeds).
|
|
9
|
+
const DEFAULT_BRAND = "#6366f1";
|
|
10
|
+
function initialOf(name) {
|
|
11
|
+
const first = Array.from(name.trim())[0];
|
|
12
|
+
return first ? first.toUpperCase() : null;
|
|
13
|
+
}
|
|
14
|
+
function svgMonogram(initial, color) {
|
|
15
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">` +
|
|
16
|
+
`<rect width="64" height="64" rx="14" fill="${color}"/>` +
|
|
17
|
+
`<text x="32" y="43" font-family="system-ui,-apple-system,sans-serif" ` +
|
|
18
|
+
`font-size="34" font-weight="600" fill="#ffffff" text-anchor="middle">` +
|
|
19
|
+
`${initial.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")}` +
|
|
20
|
+
`</text></svg>`;
|
|
21
|
+
return `data:image/svg+xml,${encodeURIComponent(svg)}`;
|
|
22
|
+
}
|
|
23
|
+
/** A 64×64 letter-avatar data URI for the product (initial on brand color),
|
|
24
|
+
* or null when the name is empty / there is no document (SSR). */
|
|
25
|
+
export function productMonogramDataUri(name, brandColor) {
|
|
26
|
+
if (typeof document === "undefined")
|
|
27
|
+
return null;
|
|
28
|
+
const initial = initialOf(name);
|
|
29
|
+
if (!initial)
|
|
30
|
+
return null;
|
|
31
|
+
const color = brandColor || DEFAULT_BRAND;
|
|
32
|
+
try {
|
|
33
|
+
const canvas = document.createElement("canvas");
|
|
34
|
+
canvas.width = 64;
|
|
35
|
+
canvas.height = 64;
|
|
36
|
+
const ctx = canvas.getContext("2d");
|
|
37
|
+
if (!ctx)
|
|
38
|
+
return svgMonogram(initial, color);
|
|
39
|
+
ctx.beginPath();
|
|
40
|
+
// Rounded square (radius 14) — matches the splash mark's shape.
|
|
41
|
+
if (typeof ctx.roundRect === "function") {
|
|
42
|
+
ctx.roundRect(0, 0, 64, 64, 14);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
ctx.rect(0, 0, 64, 64);
|
|
46
|
+
}
|
|
47
|
+
ctx.fillStyle = color;
|
|
48
|
+
ctx.fill();
|
|
49
|
+
ctx.fillStyle = "#ffffff";
|
|
50
|
+
ctx.font = "600 34px system-ui, -apple-system, sans-serif";
|
|
51
|
+
ctx.textAlign = "center";
|
|
52
|
+
ctx.textBaseline = "middle";
|
|
53
|
+
ctx.fillText(initial, 32, 34);
|
|
54
|
+
return canvas.toDataURL("image/png");
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return svgMonogram(initial, color);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Point the document favicon at the product's mark — the uploaded icon when
|
|
61
|
+
* set, otherwise a generated monogram. The monogram only ever replaces a
|
|
62
|
+
* placeholder (a missing link, the template's `data:,`, or a previous
|
|
63
|
+
* monogram — tagged `data-fs-default-icon`), so a custom build shipping its
|
|
64
|
+
* own favicon file is never clobbered. Exported for tests. */
|
|
65
|
+
export function applyProductFavicon(doc, product) {
|
|
66
|
+
let link = doc.querySelector('link[rel="icon"]');
|
|
67
|
+
if (product.iconUrl) {
|
|
68
|
+
if (!link) {
|
|
69
|
+
link = doc.createElement("link");
|
|
70
|
+
link.rel = "icon";
|
|
71
|
+
doc.head.appendChild(link);
|
|
72
|
+
}
|
|
73
|
+
if (link.getAttribute("href") !== product.iconUrl) {
|
|
74
|
+
link.setAttribute("href", product.iconUrl);
|
|
75
|
+
// A type from the template's generic favicon (image/svg+xml) may not
|
|
76
|
+
// match the uploaded mark — drop it and let the browser sniff.
|
|
77
|
+
link.removeAttribute("type");
|
|
78
|
+
}
|
|
79
|
+
delete link.dataset.fsDefaultIcon;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const raw = link?.getAttribute("href") ?? "";
|
|
83
|
+
const isPlaceholder = !link || raw === "" || raw === "data:," || link.dataset.fsDefaultIcon === "true";
|
|
84
|
+
if (!isPlaceholder)
|
|
85
|
+
return;
|
|
86
|
+
const monogram = productMonogramDataUri(product.name, product.brandColor);
|
|
87
|
+
if (!monogram)
|
|
88
|
+
return;
|
|
89
|
+
if (!link) {
|
|
90
|
+
link = doc.createElement("link");
|
|
91
|
+
link.rel = "icon";
|
|
92
|
+
doc.head.appendChild(link);
|
|
93
|
+
}
|
|
94
|
+
link.setAttribute("href", monogram);
|
|
95
|
+
link.removeAttribute("type");
|
|
96
|
+
link.dataset.fsDefaultIcon = "true";
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=monogram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monogram.js","sourceRoot":"","sources":["../../src/components/monogram.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/components/root.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/components/root.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B;gEAC4D;IAC5D,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B;2CACuC;IACvC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,yEAAyE;IACzE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC;IAC1C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAOD;gEACgE;AAChE,wBAAgB,OAAO,IAAI,SAAS,CAQnC;AAiED,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,qBAAqB,2CAM1E"}
|
package/dist/components/root.js
CHANGED
|
@@ -16,6 +16,8 @@ import { FartherShoreConfigError } from "../errors.js";
|
|
|
16
16
|
import { FartherShoreProvider, useBootstrap } from "../react/index.js";
|
|
17
17
|
import { FsThemeProvider } from "./theme.js";
|
|
18
18
|
import { FsAuthProvider } from "./auth.js";
|
|
19
|
+
import { FsSplash } from "./splash.js";
|
|
20
|
+
import { applyProductFavicon } from "./monogram.js";
|
|
19
21
|
// The resolved Bootstrap, provided by the Root's gate once resolve succeeds —
|
|
20
22
|
// a single source of truth (NOT a second async read, whose state would start
|
|
21
23
|
// null on a consumer's first render even with the client's promise memoized).
|
|
@@ -35,30 +37,27 @@ function DefaultSplash({ label }) {
|
|
|
35
37
|
/** Point the document favicon at the product's square mark. The edge already
|
|
36
38
|
* injects the link server-side for crawlers / pre-JS paint (site-shell
|
|
37
39
|
* inject-meta); this keeps the tab icon right on hosts without the edge
|
|
38
|
-
* injection and after client-side brand changes.
|
|
39
|
-
|
|
40
|
+
* injection and after client-side brand changes. Products with no uploaded
|
|
41
|
+
* icon get a generated monogram (initial on brand color) instead of the
|
|
42
|
+
* browser's blank default — see monogram.ts. */
|
|
43
|
+
function useProductFavicon(boot) {
|
|
40
44
|
useEffect(() => {
|
|
41
|
-
if (!
|
|
45
|
+
if (!boot || typeof document === "undefined")
|
|
42
46
|
return;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (link.href !== iconUrl) {
|
|
50
|
-
link.href = iconUrl;
|
|
51
|
-
// A type from the template's generic favicon (image/svg+xml) may not
|
|
52
|
-
// match the uploaded mark — drop it and let the browser sniff.
|
|
53
|
-
link.removeAttribute("type");
|
|
54
|
-
}
|
|
55
|
-
}, [iconUrl]);
|
|
47
|
+
applyProductFavicon(document, {
|
|
48
|
+
iconUrl: boot.branding.iconUrl,
|
|
49
|
+
name: boot.branding.displayName,
|
|
50
|
+
brandColor: boot.branding.primaryColor,
|
|
51
|
+
});
|
|
52
|
+
}, [boot]);
|
|
56
53
|
}
|
|
57
54
|
function Gate({ appearance, clerk, splash, renderError, children, }) {
|
|
58
55
|
const boot = useBootstrap();
|
|
59
|
-
useProductFavicon(boot.data
|
|
56
|
+
useProductFavicon(boot.data);
|
|
57
|
+
// Branded mark splash — visually identical to the template's inline pre-JS
|
|
58
|
+
// splash, so resolve-in-flight looks like one continuous boot.
|
|
60
59
|
if (boot.loading)
|
|
61
|
-
return _jsx(_Fragment, { children: splash ?? _jsx(
|
|
60
|
+
return _jsx(_Fragment, { children: splash ?? _jsx(FsSplash, {}) });
|
|
62
61
|
if (boot.error || !boot.data) {
|
|
63
62
|
const err = boot.error ?? new Error("Portal unavailable");
|
|
64
63
|
return (_jsx(_Fragment, { children: renderError ? renderError(err) : _jsx(DefaultSplash, { label: err.message }) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/components/root.tsx"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,oCAAoC;AACpC,EAAE;AACF,sDAAsD;AACtD,8DAA8D;AAC9D,kFAAkF;AAClF,wBAAwB;AACxB,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,4DAA4D;AAE5D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AAE7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,cAAc,EAAsB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/components/root.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** URL fragment trusted platform surfaces append to portal links to request
|
|
2
|
+
* an immediate silent SSO handshake with the primary domain. */
|
|
3
|
+
export declare const FS_SSO_FRAGMENT = "#fs-sso";
|
|
4
|
+
export interface SatelliteBootInput {
|
|
5
|
+
/** Full current URL (window.location.href). */
|
|
6
|
+
href: string;
|
|
7
|
+
/** document.referrer ("" when absent). */
|
|
8
|
+
referrer: string;
|
|
9
|
+
/** document.cookie. */
|
|
10
|
+
cookie: string;
|
|
11
|
+
publishableKey: string;
|
|
12
|
+
signInUrl?: string;
|
|
13
|
+
/** Resolved satellite domain (config or host-derived). */
|
|
14
|
+
satelliteDomain?: string;
|
|
15
|
+
}
|
|
16
|
+
export type SatelliteBootPlan = {
|
|
17
|
+
action: "none";
|
|
18
|
+
} | {
|
|
19
|
+
/** Pre-mark the URL `__clerk_synced=true` so clerk-js skips auto-sync. */
|
|
20
|
+
action: "suppress";
|
|
21
|
+
url: string;
|
|
22
|
+
} | {
|
|
23
|
+
/** Navigate to the primary sync URL now (before clerk-js loads). */
|
|
24
|
+
action: "redirect";
|
|
25
|
+
url: string;
|
|
26
|
+
/** Current URL with the `#fs-sso` hint stripped — what the primary
|
|
27
|
+
* should send the visitor back to (and what history should show). */
|
|
28
|
+
cleanedHref: string;
|
|
29
|
+
};
|
|
30
|
+
/** Pure decision: exported for tests (not part of the package surface). */
|
|
31
|
+
export declare function planSatelliteBoot(input: SatelliteBootInput): SatelliteBootPlan;
|
|
32
|
+
/** Plan + execute, once per document load (StrictMode double-invoke safe).
|
|
33
|
+
* Returns whether a redirect to the primary is in flight — callers keep
|
|
34
|
+
* auth in its loading state so nothing flashes before navigation. */
|
|
35
|
+
export declare function runSatelliteBoot(config: {
|
|
36
|
+
publishableKey: string;
|
|
37
|
+
signInUrl?: string;
|
|
38
|
+
satelliteDomain?: string;
|
|
39
|
+
}): {
|
|
40
|
+
pendingRedirect: boolean;
|
|
41
|
+
};
|
|
42
|
+
/** Test-only: reset the once-per-document guard. */
|
|
43
|
+
export declare function resetSatelliteBootForTests(): void;
|
|
44
|
+
//# sourceMappingURL=satellite-boot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"satellite-boot.d.ts","sourceRoot":"","sources":["../../src/components/satellite-boot.ts"],"names":[],"mappings":"AA8BA;iEACiE;AACjE,eAAO,MAAM,eAAe,YAAY,CAAC;AAMzC,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IACE,0EAA0E;IAC1E,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb,GACD;IACE,oEAAoE;IACpE,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ;0EACsE;IACtE,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AA8CN,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,iBAAiB,CAsD9E;AAID;;sEAEsE;AACtE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG;IAAE,eAAe,EAAE,OAAO,CAAA;CAAE,CA0B/B;AAED,oDAAoD;AACpD,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Satellite boot planner — decides, BEFORE clerk-js is loaded, what a portal
|
|
2
|
+
// on a Clerk satellite domain should do about the cross-domain session
|
|
3
|
+
// handshake. clerk-js (v5) auto-redirects a satellite to the primary domain on
|
|
4
|
+
// EVERY document load where the origin has no positive `__client_uat` cookie
|
|
5
|
+
// (`isSignedOut()` treats an absent cookie as signed out) — which bounces
|
|
6
|
+
// every anonymous visitor through the primary sign-in page and back, flashing
|
|
7
|
+
// the screen up to three times. The planner replaces that default with:
|
|
8
|
+
//
|
|
9
|
+
// - `#fs-sso` in the URL (appended by trusted platform surfaces — e.g. the
|
|
10
|
+
// dashboard's "Open portal" links): the visitor very likely has a primary
|
|
11
|
+
// session, so redirect to the primary sync URL IMMEDIATELY — before
|
|
12
|
+
// clerk-js even loads — and land back signed in. One visible hop.
|
|
13
|
+
// - no hint, no session: mark the URL `__clerk_synced=true` (via
|
|
14
|
+
// history.replaceState) so clerk-js skips its auto-sync. Public pages
|
|
15
|
+
// render instantly with zero redirects; an explicit "Sign in" click still
|
|
16
|
+
// round-trips through the primary and completes silently when a session
|
|
17
|
+
// exists there. clerk-js strips the marker param after load.
|
|
18
|
+
// - guards: an existing `__clerk_synced` / `__clerk_db_jwt` param (mid
|
|
19
|
+
// Clerk flow), a positive `__client_uat` cookie (local session), or a
|
|
20
|
+
// referrer on the primary's origin (returning from sign-in) → do nothing
|
|
21
|
+
// and let clerk-js run its own flow.
|
|
22
|
+
//
|
|
23
|
+
// The sync URLs mirror clerk-js's own builders (core/clerk.ts):
|
|
24
|
+
// development instance: `{signInUrl}?__clerk_satellite_url={here}`
|
|
25
|
+
// production instance: `https://clerk.{domain}/v1/client/sync?redirect_url={here}`
|
|
26
|
+
//
|
|
27
|
+
// The dev-portal template's index.html primer duplicates the `#fs-sso` fast
|
|
28
|
+
// path inline so platform-served portals redirect before first paint; this
|
|
29
|
+
// module is the tested source of truth and the fallback for custom builds.
|
|
30
|
+
/** URL fragment trusted platform surfaces append to portal links to request
|
|
31
|
+
* an immediate silent SSO handshake with the primary domain. */
|
|
32
|
+
export const FS_SSO_FRAGMENT = "#fs-sso";
|
|
33
|
+
const CLERK_SYNCED = "__clerk_synced";
|
|
34
|
+
const CLERK_DB_JWT = "__clerk_db_jwt";
|
|
35
|
+
const CLERK_SATELLITE_URL = "__clerk_satellite_url";
|
|
36
|
+
/** Any `__client_uat` cookie (Clerk suffixes the name per publishable key)
|
|
37
|
+
* with a positive value means this origin already has a Clerk session. */
|
|
38
|
+
function hasClerkSession(cookie) {
|
|
39
|
+
for (const part of cookie.split(";")) {
|
|
40
|
+
const eq = part.indexOf("=");
|
|
41
|
+
if (eq === -1)
|
|
42
|
+
continue;
|
|
43
|
+
const name = part.slice(0, eq).trim();
|
|
44
|
+
if (!name.startsWith("__client_uat"))
|
|
45
|
+
continue;
|
|
46
|
+
const value = Number(part.slice(eq + 1).trim());
|
|
47
|
+
if (Number.isFinite(value) && value > 0)
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
function instanceTypeOf(publishableKey) {
|
|
53
|
+
return publishableKey.startsWith("pk_live_") ? "production" : "development";
|
|
54
|
+
}
|
|
55
|
+
/** Mirrors clerk-js `#buildSyncUrlForDevelopmentInstances` /
|
|
56
|
+
* `#buildSyncUrlForProductionInstances` (incl. the `clerk.` prefix its
|
|
57
|
+
* `domain` getter adds on production instances). */
|
|
58
|
+
function buildSyncUrl(instanceType, cleanedHref, signInUrl, satelliteDomain) {
|
|
59
|
+
try {
|
|
60
|
+
if (instanceType === "development") {
|
|
61
|
+
const url = new URL(signInUrl);
|
|
62
|
+
url.searchParams.set(CLERK_SATELLITE_URL, cleanedHref);
|
|
63
|
+
return url.toString();
|
|
64
|
+
}
|
|
65
|
+
const domain = satelliteDomain.startsWith("clerk.")
|
|
66
|
+
? satelliteDomain
|
|
67
|
+
: `clerk.${satelliteDomain}`;
|
|
68
|
+
const url = new URL("/v1/client/sync", `https://${domain}`);
|
|
69
|
+
url.searchParams.set("redirect_url", cleanedHref);
|
|
70
|
+
return url.toString();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Pure decision: exported for tests (not part of the package surface). */
|
|
77
|
+
export function planSatelliteBoot(input) {
|
|
78
|
+
const { href, referrer, cookie, publishableKey, signInUrl, satelliteDomain } = input;
|
|
79
|
+
// Satellite mode engages only when the full trio resolves (the same
|
|
80
|
+
// condition under which ClerkProvider gets the satellite props).
|
|
81
|
+
if (!publishableKey || !signInUrl || !satelliteDomain) {
|
|
82
|
+
return { action: "none" };
|
|
83
|
+
}
|
|
84
|
+
let url;
|
|
85
|
+
try {
|
|
86
|
+
url = new URL(href);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return { action: "none" };
|
|
90
|
+
}
|
|
91
|
+
// Mid-Clerk-flow markers: returning from a sync (`__clerk_synced`) or
|
|
92
|
+
// carrying a dev-browser auth transfer (`__clerk_db_jwt`). Hands off.
|
|
93
|
+
if (url.searchParams.has(CLERK_SYNCED) || url.searchParams.has(CLERK_DB_JWT)) {
|
|
94
|
+
return { action: "none" };
|
|
95
|
+
}
|
|
96
|
+
// A live session on this origin — clerk-js won't auto-sync, nothing to do.
|
|
97
|
+
if (hasClerkSession(cookie)) {
|
|
98
|
+
return { action: "none" };
|
|
99
|
+
}
|
|
100
|
+
if (url.hash === FS_SSO_FRAGMENT) {
|
|
101
|
+
url.hash = "";
|
|
102
|
+
const cleanedHref = url.toString();
|
|
103
|
+
const syncUrl = buildSyncUrl(instanceTypeOf(publishableKey), cleanedHref, signInUrl, satelliteDomain);
|
|
104
|
+
// Unbuildable sync URL (malformed signInUrl): fall through to clerk-js's
|
|
105
|
+
// own sync rather than navigating somewhere broken.
|
|
106
|
+
if (syncUrl)
|
|
107
|
+
return { action: "redirect", url: syncUrl, cleanedHref };
|
|
108
|
+
return { action: "none" };
|
|
109
|
+
}
|
|
110
|
+
// Returning from the primary (sign-in / sync flows that didn't tag the URL):
|
|
111
|
+
// let clerk-js complete its own handshake.
|
|
112
|
+
try {
|
|
113
|
+
if (referrer && new URL(referrer).origin === new URL(signInUrl).origin) {
|
|
114
|
+
return { action: "none" };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
/* unparseable referrer — ignore */
|
|
119
|
+
}
|
|
120
|
+
url.searchParams.set(CLERK_SYNCED, "true");
|
|
121
|
+
return { action: "suppress", url: url.toString() };
|
|
122
|
+
}
|
|
123
|
+
let executed = null;
|
|
124
|
+
/** Plan + execute, once per document load (StrictMode double-invoke safe).
|
|
125
|
+
* Returns whether a redirect to the primary is in flight — callers keep
|
|
126
|
+
* auth in its loading state so nothing flashes before navigation. */
|
|
127
|
+
export function runSatelliteBoot(config) {
|
|
128
|
+
if (typeof window === "undefined")
|
|
129
|
+
return { pendingRedirect: false };
|
|
130
|
+
if (executed)
|
|
131
|
+
return executed;
|
|
132
|
+
executed = { pendingRedirect: false };
|
|
133
|
+
try {
|
|
134
|
+
const plan = planSatelliteBoot({
|
|
135
|
+
href: window.location.href,
|
|
136
|
+
referrer: typeof document !== "undefined" ? document.referrer : "",
|
|
137
|
+
cookie: typeof document !== "undefined" ? document.cookie : "",
|
|
138
|
+
publishableKey: config.publishableKey,
|
|
139
|
+
signInUrl: config.signInUrl,
|
|
140
|
+
satelliteDomain: config.satelliteDomain,
|
|
141
|
+
});
|
|
142
|
+
if (plan.action === "suppress") {
|
|
143
|
+
window.history.replaceState(window.history.state, "", plan.url);
|
|
144
|
+
}
|
|
145
|
+
else if (plan.action === "redirect") {
|
|
146
|
+
// Strip the hint first so the URL the primary sends us back to (and
|
|
147
|
+
// the one in history, should navigation be interrupted) is clean.
|
|
148
|
+
window.history.replaceState(window.history.state, "", plan.cleanedHref);
|
|
149
|
+
window.location.replace(plan.url);
|
|
150
|
+
executed = { pendingRedirect: true };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
/* never let boot planning break rendering */
|
|
155
|
+
}
|
|
156
|
+
return executed;
|
|
157
|
+
}
|
|
158
|
+
/** Test-only: reset the once-per-document guard. */
|
|
159
|
+
export function resetSatelliteBootForTests() {
|
|
160
|
+
executed = null;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=satellite-boot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"satellite-boot.js","sourceRoot":"","sources":["../../src/components/satellite-boot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splash.d.ts","sourceRoot":"","sources":["../../src/components/splash.tsx"],"names":[],"mappings":"AA4CA,wEAAwE;AACxE,wBAAgB,QAAQ,4CAgCvB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// <FsSplash/> — the branded boot splash. Shown while the portal resolves /
|
|
3
|
+
// auth initializes, and visually IDENTICAL to the inline pre-JS splash the
|
|
4
|
+
// dev-portal template paints from index.html (same mark size, pulse timing,
|
|
5
|
+
// and theme rule), so the handoff from static HTML to React is seamless.
|
|
6
|
+
//
|
|
7
|
+
// It can render BEFORE bootstrap/theme providers exist, so it reads its
|
|
8
|
+
// context straight from the document:
|
|
9
|
+
// - product mark: the favicon link (edge-injected per host; `data:` URIs —
|
|
10
|
+
// the template's neutral placeholder — are skipped)
|
|
11
|
+
// - product name: document.title (edge-injected)
|
|
12
|
+
// - theme: the same rule as FsThemeProvider's initial state — localStorage
|
|
13
|
+
// `fs-theme`, `auto` → prefers-color-scheme, absent → light.
|
|
14
|
+
import { useState } from "react";
|
|
15
|
+
const LIGHT_BG = "#ffffff";
|
|
16
|
+
const DARK_BG = "#000000";
|
|
17
|
+
function readSplashContext() {
|
|
18
|
+
if (typeof document === "undefined") {
|
|
19
|
+
return { iconUrl: null, name: null, dark: false };
|
|
20
|
+
}
|
|
21
|
+
const link = document.querySelector('link[rel="icon"]');
|
|
22
|
+
const href = link?.getAttribute("href") ?? "";
|
|
23
|
+
const iconUrl = href && !href.startsWith("data:") ? href : null;
|
|
24
|
+
const name = document.title || null;
|
|
25
|
+
let stored = null;
|
|
26
|
+
try {
|
|
27
|
+
stored = window.localStorage.getItem("fs-theme");
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
/* storage unavailable */
|
|
31
|
+
}
|
|
32
|
+
const dark = stored === "dark" ||
|
|
33
|
+
(stored === "auto" &&
|
|
34
|
+
typeof window.matchMedia === "function" &&
|
|
35
|
+
window.matchMedia("(prefers-color-scheme: dark)").matches);
|
|
36
|
+
return { iconUrl, name, dark };
|
|
37
|
+
}
|
|
38
|
+
/** Full-viewport branded splash (product mark + name, gentle pulse). */
|
|
39
|
+
export function FsSplash() {
|
|
40
|
+
const [{ iconUrl, name, dark }] = useState(readSplashContext);
|
|
41
|
+
return (_jsx("div", { className: "fs-boot-splash", "data-fs-theme": dark ? "dark" : "light", style: { background: dark ? DARK_BG : LIGHT_BG }, role: "status", "aria-label": "Loading", children: _jsxs("div", { className: "fs-boot-splash__pulse", children: [iconUrl ? (_jsx("img", { className: "fs-boot-splash__mark", src: iconUrl, alt: "" })) : name ? (_jsx("div", { className: "fs-boot-splash__monogram", "aria-hidden": true, children: Array.from(name.trim())[0]?.toUpperCase() ?? "" })) : (_jsx("div", { className: "fs-boot-splash__dot", "aria-hidden": true })), name ? (_jsx("div", { className: "fs-boot-splash__name", style: { color: dark ? "#a1a1aa" : "#71717a" }, children: name })) : null] }) }));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=splash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splash.js","sourceRoot":"","sources":["../../src/components/splash.tsx"],"names":[],"mappings":";AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,4EAA4E;AAC5E,yEAAyE;AACzE,EAAE;AACF,wEAAwE;AACxE,sCAAsC;AACtC,6EAA6E;AAC7E,wDAAwD;AACxD,mDAAmD;AACnD,6EAA6E;AAC7E,iEAAiE;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,MAAM,QAAQ,GAAG,SAAS,CAAC;AAC3B,MAAM,OAAO,GAAG,SAAS,CAAC;AAE1B,SAAS,iBAAiB;IAKxB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAkB,kBAAkB,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC;IACpC,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IACD,MAAM,IAAI,GACR,MAAM,KAAK,MAAM;QACjB,CAAC,MAAM,KAAK,MAAM;YAChB,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU;YACvC,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,QAAQ;IACtB,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAC9D,OAAO,CACL,cACE,SAAS,EAAC,gBAAgB,mBACX,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EACtC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,EAChD,IAAI,EAAC,QAAQ,gBACF,SAAS,YAEpB,eAAK,SAAS,EAAC,uBAAuB,aACnC,OAAO,CAAC,CAAC,CAAC,CACT,cAAK,SAAS,EAAC,sBAAsB,EAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAC,EAAE,GAAG,CAC9D,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAET,cAAK,SAAS,EAAC,0BAA0B,iCACtC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,GAC5C,CACP,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,qBAAqB,wBAAe,CACpD,EACA,IAAI,CAAC,CAAC,CAAC,CACN,cACE,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,YAE7C,IAAI,GACD,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -674,6 +674,65 @@
|
|
|
674
674
|
font-size: 14px;
|
|
675
675
|
}
|
|
676
676
|
|
|
677
|
+
/* Branded boot splash (<FsSplash/>). KEEP IN SYNC with the inline pre-JS
|
|
678
|
+
splash in the dev-portal template's index.html — identical mark size,
|
|
679
|
+
pulse timing, and type so the static→React handoff doesn't flicker. */
|
|
680
|
+
.fs-boot-splash {
|
|
681
|
+
position: fixed;
|
|
682
|
+
inset: 0;
|
|
683
|
+
z-index: 9999;
|
|
684
|
+
display: grid;
|
|
685
|
+
place-items: center;
|
|
686
|
+
}
|
|
687
|
+
.fs-boot-splash__pulse {
|
|
688
|
+
display: grid;
|
|
689
|
+
justify-items: center;
|
|
690
|
+
gap: 14px;
|
|
691
|
+
animation: fs-boot-pulse 1.6s ease-in-out infinite;
|
|
692
|
+
}
|
|
693
|
+
.fs-boot-splash__mark {
|
|
694
|
+
width: 44px;
|
|
695
|
+
height: 44px;
|
|
696
|
+
border-radius: 12px;
|
|
697
|
+
object-fit: cover;
|
|
698
|
+
}
|
|
699
|
+
.fs-boot-splash__dot {
|
|
700
|
+
width: 14px;
|
|
701
|
+
height: 14px;
|
|
702
|
+
border-radius: 999px;
|
|
703
|
+
background: var(--fs-color-brand, #6366f1);
|
|
704
|
+
}
|
|
705
|
+
.fs-boot-splash__monogram {
|
|
706
|
+
width: 44px;
|
|
707
|
+
height: 44px;
|
|
708
|
+
border-radius: 12px;
|
|
709
|
+
display: grid;
|
|
710
|
+
place-items: center;
|
|
711
|
+
background: var(--fs-color-brand, #6366f1);
|
|
712
|
+
color: #ffffff;
|
|
713
|
+
font-family:
|
|
714
|
+
ui-sans-serif,
|
|
715
|
+
system-ui,
|
|
716
|
+
-apple-system,
|
|
717
|
+
sans-serif;
|
|
718
|
+
font-size: 20px;
|
|
719
|
+
font-weight: 600;
|
|
720
|
+
}
|
|
721
|
+
.fs-boot-splash__name {
|
|
722
|
+
font-size: 13px;
|
|
723
|
+
font-weight: 500;
|
|
724
|
+
letter-spacing: 0.01em;
|
|
725
|
+
}
|
|
726
|
+
@keyframes fs-boot-pulse {
|
|
727
|
+
0%,
|
|
728
|
+
100% {
|
|
729
|
+
opacity: 1;
|
|
730
|
+
}
|
|
731
|
+
50% {
|
|
732
|
+
opacity: 0.45;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
|
|
677
736
|
/* ══ DATA COMPONENTS ══════════════════════════════════════════
|
|
678
737
|
The signed-in account surfaces — ApiKeysPanel, UsageCard,
|
|
679
738
|
BillingSummary, CreditBalance, FeaturePanel, DocsLegal. Same
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@farthershore/farthershore-js",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
4
4
|
"description": "Farther Shore Frontend SDK — the browser integration layer between static frontends and the Farther Shore platform (Core + Gateway).",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|