@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 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":"AAkBA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD;;;+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,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;AAwPD;;;+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"}
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"}
@@ -1,4 +1,4 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
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 the session propagates back via the
10
- // `__clerk_synced` handshake), and installs Clerk's `getToken` as the
11
- // client's per-request token source. Nothing else to wire.
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 (_jsxs(Provider, { publishableKey: config.publishableKey, appearance: {
176
+ return (_jsx(Provider, { publishableKey: config.publishableKey, appearance: {
183
177
  baseTheme: mode === "dark" && darkTheme ? darkTheme : undefined,
184
- }, ...satelliteProps, children: [_jsx(SatelliteAutoSync, { clerk: mod }), _jsx(ClerkAuthBridge, { clerk: mod, children: 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":"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"}
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":"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"}
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,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGhD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGtF,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiCtD,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EAId,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,8BAA8B,CAAC;AAEtC,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;AAC7C,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAGhF,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sCAAsC,CAAC;AAE9C,YAAY,EACV,WAAW,IAAI,eAAe,EAC9B,uBAAuB,GACxB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC3E,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;AAC9C,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,sCAAsC,CAAC"}
@@ -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;AAGxC,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"}
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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")}` +
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":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAC3E,sCAAsC;AACtC,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,kEAAkE;AAElE,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,KAAa;IACjD,MAAM,GAAG,GACP,8DAA8D;QAC9D,8CAA8C,KAAK,KAAK;QACxD,uEAAuE;QACvE,uEAAuE;QACvE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;QAC/E,eAAe,CAAC;IAClB,OAAO,sBAAsB,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;AACzD,CAAC;AAED;mEACmE;AACnE,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,UAA0B;IAE1B,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,UAAU,IAAI,aAAa,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QAClB,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7C,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,gEAAgE;QAChE,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YACxC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC;QACtB,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;QAC1B,GAAG,CAAC,IAAI,GAAG,+CAA+C,CAAC;QAC3D,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;QACzB,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC5B,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED;;;;+DAI+D;AAC/D,MAAM,UAAU,mBAAmB,CACjC,GAAa,EACb,OAA4E;IAE5E,IAAI,IAAI,GAAG,GAAG,CAAC,aAAa,CAAkB,kBAAkB,CAAC,CAAC;IAElE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;YAClD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3C,qEAAqE;YACrE,+DAA+D;YAC/D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,aAAa,GACjB,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,MAAM,CAAC;IACnF,IAAI,CAAC,aAAa;QAAE,OAAO;IAE3B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1E,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;QAClB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC;AACtC,CAAC"}
@@ -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;AAE/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;AAoED,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,qBAAqB,2CAM1E"}
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"}
@@ -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
- function useProductFavicon(iconUrl) {
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 (!iconUrl || typeof document === "undefined")
45
+ if (!boot || typeof document === "undefined")
42
46
  return;
43
- let link = document.querySelector('link[rel="icon"]');
44
- if (!link) {
45
- link = document.createElement("link");
46
- link.rel = "icon";
47
- document.head.appendChild(link);
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?.branding.iconUrl);
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(DefaultSplash, { label: "Loading\u2026" }) });
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":"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"}
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,3 @@
1
+ /** Full-viewport branded splash (product mark + name, gentle pulse). */
2
+ export declare function FsSplash(): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=splash.d.ts.map
@@ -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.13",
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"