@farthershore/farthershore-js 0.1.1 → 0.1.2

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.
Files changed (99) hide show
  1. package/dist/client.d.ts +22 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +16 -1
  4. package/dist/client.js.map +1 -1
  5. package/dist/components/_internal.d.ts +8 -0
  6. package/dist/components/_internal.d.ts.map +1 -0
  7. package/dist/components/_internal.js +16 -0
  8. package/dist/components/_internal.js.map +1 -0
  9. package/dist/components/app.d.ts +27 -0
  10. package/dist/components/app.d.ts.map +1 -0
  11. package/dist/components/app.js +84 -0
  12. package/dist/components/app.js.map +1 -0
  13. package/dist/components/auth.d.ts +66 -0
  14. package/dist/components/auth.d.ts.map +1 -0
  15. package/dist/components/auth.js +260 -0
  16. package/dist/components/auth.js.map +1 -0
  17. package/dist/components/billing.d.ts +6 -0
  18. package/dist/components/billing.d.ts.map +1 -0
  19. package/dist/components/billing.js +32 -0
  20. package/dist/components/billing.js.map +1 -0
  21. package/dist/components/chrome.d.ts +19 -0
  22. package/dist/components/chrome.d.ts.map +1 -0
  23. package/dist/components/chrome.js +27 -0
  24. package/dist/components/chrome.js.map +1 -0
  25. package/dist/components/credit.d.ts +12 -0
  26. package/dist/components/credit.d.ts.map +1 -0
  27. package/dist/components/credit.js +20 -0
  28. package/dist/components/credit.js.map +1 -0
  29. package/dist/components/docs.d.ts +12 -0
  30. package/dist/components/docs.d.ts.map +1 -0
  31. package/dist/components/docs.js +25 -0
  32. package/dist/components/docs.js.map +1 -0
  33. package/dist/components/feature.d.ts +15 -0
  34. package/dist/components/feature.d.ts.map +1 -0
  35. package/dist/components/feature.js +40 -0
  36. package/dist/components/feature.js.map +1 -0
  37. package/dist/components/index.d.ts +26 -0
  38. package/dist/components/index.d.ts.map +1 -0
  39. package/dist/components/index.js +39 -0
  40. package/dist/components/index.js.map +1 -0
  41. package/dist/components/keys.d.ts +6 -0
  42. package/dist/components/keys.d.ts.map +1 -0
  43. package/dist/components/keys.js +45 -0
  44. package/dist/components/keys.js.map +1 -0
  45. package/dist/components/plans-table.d.ts +9 -0
  46. package/dist/components/plans-table.d.ts.map +1 -0
  47. package/dist/components/plans-table.js +68 -0
  48. package/dist/components/plans-table.js.map +1 -0
  49. package/dist/components/root.d.ts +24 -0
  50. package/dist/components/root.d.ts.map +1 -0
  51. package/dist/components/root.js +41 -0
  52. package/dist/components/root.js.map +1 -0
  53. package/dist/components/sign-in.d.ts +8 -0
  54. package/dist/components/sign-in.d.ts.map +1 -0
  55. package/dist/components/sign-in.js +52 -0
  56. package/dist/components/sign-in.js.map +1 -0
  57. package/dist/components/styles.css +403 -0
  58. package/dist/components/theme.d.ts +34 -0
  59. package/dist/components/theme.d.ts.map +1 -0
  60. package/dist/components/theme.js +65 -0
  61. package/dist/components/theme.js.map +1 -0
  62. package/dist/components/usage.d.ts +12 -0
  63. package/dist/components/usage.d.ts.map +1 -0
  64. package/dist/components/usage.js +36 -0
  65. package/dist/components/usage.js.map +1 -0
  66. package/dist/config.d.ts +6 -1
  67. package/dist/config.d.ts.map +1 -1
  68. package/dist/config.js +13 -1
  69. package/dist/config.js.map +1 -1
  70. package/dist/index.d.ts +2 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/react/hooks.d.ts +44 -1
  74. package/dist/react/hooks.d.ts.map +1 -1
  75. package/dist/react/hooks.js +55 -0
  76. package/dist/react/hooks.js.map +1 -1
  77. package/dist/react/index.d.ts +2 -2
  78. package/dist/react/index.d.ts.map +1 -1
  79. package/dist/react/index.js +1 -1
  80. package/dist/react/index.js.map +1 -1
  81. package/dist/resources/account.d.ts +51 -0
  82. package/dist/resources/account.d.ts.map +1 -0
  83. package/dist/resources/account.js +136 -0
  84. package/dist/resources/account.js.map +1 -0
  85. package/dist/resources/auth.d.ts +15 -3
  86. package/dist/resources/auth.d.ts.map +1 -1
  87. package/dist/resources/auth.js +73 -0
  88. package/dist/resources/auth.js.map +1 -1
  89. package/dist/resources/billing.d.ts +24 -1
  90. package/dist/resources/billing.d.ts.map +1 -1
  91. package/dist/resources/billing.js +53 -0
  92. package/dist/resources/billing.js.map +1 -1
  93. package/dist/resources/plans.d.ts +6 -1
  94. package/dist/resources/plans.d.ts.map +1 -1
  95. package/dist/resources/plans.js +24 -0
  96. package/dist/resources/plans.js.map +1 -1
  97. package/dist/types.d.ts +98 -0
  98. package/dist/types.d.ts.map +1 -1
  99. package/package.json +23 -4
package/dist/client.d.ts CHANGED
@@ -6,8 +6,9 @@ import { type KeysResource } from "./resources/keys.js";
6
6
  import { type UsageResource } from "./resources/usage.js";
7
7
  import { type BillingResource } from "./resources/billing.js";
8
8
  import { type PlansResource } from "./resources/plans.js";
9
+ import { type AuditLogsResource, type OrganizationsResource, type TeamResource } from "./resources/account.js";
9
10
  import { type FeatureHandle, type GatewayRequestInit } from "./resources/feature.js";
10
- import type { Bootstrap } from "./types.js";
11
+ import type { Bootstrap, SubscriberContext } from "./types.js";
11
12
  export interface FartherShoreClient {
12
13
  /** Resolve + cache the product/env/gateway for the current portal host. Safe
13
14
  * to call repeatedly (memoized). */
@@ -16,6 +17,14 @@ export interface FartherShoreClient {
16
17
  setApiKey(key: string | null): void;
17
18
  /** Set the Core session bearer directly (e.g. from the Clerk browser SDK). */
18
19
  setSessionToken(token: string | null): void;
20
+ /** Install/replace a live token source resolved per request (short-lived
21
+ * Clerk JWTs). `<FartherShoreRoot>` wires this automatically in Clerk
22
+ * environments; pass null to uninstall. */
23
+ setTokenProvider(provider: (() => string | null | Promise<string | null>) | null): void;
24
+ /** Rescope subsequent Core calls to an owning org (the multi-org
25
+ * subscription-context switcher) — sets the `x-fs-organization-id` header.
26
+ * Pass null to return to the user's default subscription. */
27
+ setOrganizationId(organizationId: string | null): void;
19
28
  /** The product this frontend runs for (resolved via bootstrap). */
20
29
  readonly product: ProductResource;
21
30
  /** Consumer session: persona/Clerk sign-in, the current session, sign-out. */
@@ -28,6 +37,18 @@ export interface FartherShoreClient {
28
37
  readonly billing: BillingResource;
29
38
  /** The product's plan catalog + the subscribe/checkout flow. */
30
39
  readonly plans: PlansResource;
40
+ /** Full subscriber context (`GET /me`): lifecycle, trial, scheduled
41
+ * transition, eligibility-scoped plans. Null when signed out / no
42
+ * subscriber. */
43
+ me(opts?: {
44
+ signal?: AbortSignal;
45
+ }): Promise<SubscriberContext | null>;
46
+ /** Multi-org subscription contexts (the org switcher's data). */
47
+ readonly organizations: OrganizationsResource;
48
+ /** Team management on the current subscription. */
49
+ readonly team: TeamResource;
50
+ /** The subscriber-side audit log (cursor-paged). */
51
+ readonly auditLogs: AuditLogsResource;
31
52
  /** A handle to a builder-defined feature, routed through the Gateway. */
32
53
  feature(name: string): FeatureHandle;
33
54
  /** Generic Gateway call (alias for `feature("…").fetch`). */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,aAAa,CAAC;AAErB,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,kBAAkB;IACjC;yCACqC;IACrC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,+DAA+D;IAC/D,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACpC,8EAA8E;IAC9E,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAE5C,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B,yEAAyE;IACzE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IACrC,6DAA6D;IAC7D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnE;;;;;;;;OAQG;IACH,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,kBAAkB,GACzB,kBAAkB,CAEpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,GACzB,kBAAkB,CAwCpB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -6,11 +6,12 @@ import { buildContext, } from "./config.js";
6
6
  import { resolveBootstrap } from "./bootstrap.js";
7
7
  import { coreFetch, gatewayFetch } from "./http.js";
8
8
  import { createProductResource, } from "./resources/product.js";
9
- import { createAuthResource } from "./resources/auth.js";
9
+ import { createAuthResource, primePersistedPersona, } from "./resources/auth.js";
10
10
  import { createKeysResource } from "./resources/keys.js";
11
11
  import { createUsageResource } from "./resources/usage.js";
12
12
  import { createBillingResource, } from "./resources/billing.js";
13
13
  import { createPlansResource } from "./resources/plans.js";
14
+ import { createAccountSurface, } from "./resources/account.js";
14
15
  import { createFeature, } from "./resources/feature.js";
15
16
  /**
16
17
  * SSR / server-side entry point. A thin, documented alias for
@@ -62,6 +63,9 @@ export function createServerClient(config) {
62
63
  */
63
64
  export function createFartherShoreClient(config) {
64
65
  const ctx = buildContext(config);
66
+ // Self-managed persona sessions: restore a persisted (unexpired) session so
67
+ // reloads stay signed in without any host wiring. No-op outside the browser.
68
+ primePersistedPersona(ctx);
65
69
  let cached = null;
66
70
  let inflight = null;
67
71
  function ensureBootstrap() {
@@ -81,6 +85,7 @@ export function createFartherShoreClient(config) {
81
85
  }
82
86
  return inflight;
83
87
  }
88
+ const account = createAccountSurface(ctx);
84
89
  return {
85
90
  bootstrap: ensureBootstrap,
86
91
  setApiKey(key) {
@@ -89,12 +94,22 @@ export function createFartherShoreClient(config) {
89
94
  setSessionToken(token) {
90
95
  ctx.sessionToken = token;
91
96
  },
97
+ setTokenProvider(provider) {
98
+ ctx.tokenProvider = provider;
99
+ },
100
+ setOrganizationId(organizationId) {
101
+ ctx.organizationId = organizationId;
102
+ },
92
103
  product: createProductResource(ensureBootstrap),
93
104
  auth: createAuthResource(ctx),
94
105
  keys: createKeysResource(ctx),
95
106
  usage: createUsageResource(ctx),
96
107
  billing: createBillingResource(ctx),
97
108
  plans: createPlansResource(ctx, ensureBootstrap),
109
+ me: account.me,
110
+ organizations: account.organizations,
111
+ team: account.team,
112
+ auditLogs: account.auditLogs,
98
113
  feature: (name) => createFeature(ctx, name),
99
114
  invoke: (path, init) => gatewayFetch(ctx, path, init),
100
115
  core: (req) => coreFetch(ctx, req),
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,+EAA+E;AAC/E,sCAAsC;AAEtC,OAAO,EAGL,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAoB,MAAM,WAAW,CAAC;AACtE,OAAO,EACL,qBAAqB,GAEtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAqB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAqB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,qBAAqB,GAEtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAsB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EACL,aAAa,GAGd,MAAM,wBAAwB,CAAC;AAyChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA0B;IAE1B,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAA0B;IAE1B,MAAM,GAAG,GAAkB,YAAY,CAAC,MAAM,CAAC,CAAC;IAEhD,IAAI,MAAM,GAAqB,IAAI,CAAC;IACpC,IAAI,QAAQ,GAA8B,IAAI,CAAC;IAC/C,SAAS,eAAe;QACtB,IAAI,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC;iBAC7B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBACV,MAAM,GAAG,CAAC,CAAC;gBACX,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,CAAC,CAAC;YACX,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;gBACpB,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM,CAAC,CAAC;YACV,CAAC,CAAC,CAAC;QACP,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO;QACL,SAAS,EAAE,eAAe;QAC1B,SAAS,CAAC,GAAG;YACX,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACnB,CAAC;QACD,eAAe,CAAC,KAAK;YACnB,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC;QAC3B,CAAC;QACD,OAAO,EAAE,qBAAqB,CAAC,eAAe,CAAC;QAC/C,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC;QAC7B,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC;QAC7B,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC;QAC/B,OAAO,EAAE,qBAAqB,CAAC,GAAG,CAAC;QACnC,KAAK,EAAE,mBAAmB,CAAC,GAAG,EAAE,eAAe,CAAC;QAChD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC;QAC3C,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;QACrD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;KACnC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Join class names, skipping falsy — the host-extension contract: every
2
+ * public component accepts `className` and appends it to its root. */
3
+ export declare function cx(...parts: Array<string | null | undefined | false>): string;
4
+ export declare function ArrowIcon(): import("react/jsx-runtime").JSX.Element;
5
+ export declare function CheckIcon({ className }: {
6
+ className?: string;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=_internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_internal.d.ts","sourceRoot":"","sources":["../../src/components/_internal.tsx"],"names":[],"mappings":"AAIA;uEACuE;AACvE,wBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,CAAC,GAAG,MAAM,CAE7E;AAED,wBAAgB,SAAS,4CAMxB;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAM9D"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // Internal shared bits for the components package — NOT exported from the
3
+ // package. Public components live one-per-file; this holds the tiny pieces
4
+ // several of them share.
5
+ /** Join class names, skipping falsy — the host-extension contract: every
6
+ * public component accepts `className` and appends it to its root. */
7
+ export function cx(...parts) {
8
+ return parts.filter(Boolean).join(" ");
9
+ }
10
+ export function ArrowIcon() {
11
+ return (_jsx("svg", { className: "fs-btn__arrow", fill: "none", viewBox: "0 0 24 24", strokeWidth: 2.5, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3" }) }));
12
+ }
13
+ export function CheckIcon({ className }) {
14
+ return (_jsx("svg", { className: className, fill: "none", viewBox: "0 0 24 24", strokeWidth: 2.5, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.5 12.75l6 6 9-13.5" }) }));
15
+ }
16
+ //# sourceMappingURL=_internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_internal.js","sourceRoot":"","sources":["../../src/components/_internal.tsx"],"names":[],"mappings":";AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,yBAAyB;AAEzB;uEACuE;AACvE,MAAM,UAAU,EAAE,CAAC,GAAG,KAA+C;IACnE,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,CACL,cAAK,SAAS,EAAC,eAAe,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,WAAW,EAAE,GAAG,EAAE,MAAM,EAAC,cAAc,YACpG,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,sCAAsC,GAAG,GAC1F,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAA0B;IAC7D,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,EAAE,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,WAAW,EAAE,GAAG,EAAE,MAAM,EAAC,cAAc,YAChG,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,uBAAuB,GAAG,GAC3E,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type ReactNode } from "react";
2
+ import type { Bootstrap } from "../types.js";
3
+ import { type FsAppearance } from "./theme.js";
4
+ import { type FsClerkConfig } from "./auth.js";
5
+ /**
6
+ * The entire portal in one tag. Resolves the product, mounts theme + managed
7
+ * auth, and renders the marketing landing (signed-out) or the account
8
+ * dashboard (signed-in). Pass `appearance` to retheme; drop to the standalone
9
+ * components for custom layouts.
10
+ *
11
+ * `renderDashboard` is the chrome escape hatch: when authenticated, the app
12
+ * renders this instead of the built-in card stack (the default template
13
+ * supplies its full sidebar app shell this way), still inside the resolved
14
+ * bootstrap + theme + auth context.
15
+ */
16
+ export declare function FartherShoreApp({ appearance, clerk, renderDashboard, }: {
17
+ appearance?: FsAppearance;
18
+ /** Clerk connection config (public values) for clerk-strategy environments. */
19
+ clerk?: FsClerkConfig;
20
+ renderDashboard?: (boot: Bootstrap) => ReactNode;
21
+ }): import("react/jsx-runtime").JSX.Element;
22
+ /** The landing's pricing section: heading chrome around the standalone
23
+ * `<PlansTable/>`. */
24
+ export declare function FsPricing({ className }?: {
25
+ className?: string;
26
+ }): import("react/jsx-runtime").JSX.Element;
27
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/components/app.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAa/D;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,KAAK,EACL,eAAe,GAChB,EAAE;IACD,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,SAAS,CAAC;CAClD,2CAoBA;AAyKD;uBACuB;AACvB,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,2CAWnE"}
@@ -0,0 +1,84 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useBootstrap, useSession } from "../react/index.js";
3
+ import { FsThemeProvider } from "./theme.js";
4
+ import { FsAuthProvider } from "./auth.js";
5
+ import { PlansTable } from "./plans-table.js";
6
+ import { FsSignIn } from "./sign-in.js";
7
+ import { FsBranding, FsThemeToggle, FsFooter } from "./chrome.js";
8
+ import { ApiKeysPanel } from "./keys.js";
9
+ import { UsageCard } from "./usage.js";
10
+ import { BillingSummary } from "./billing.js";
11
+ import { CreditBalance } from "./credit.js";
12
+ import { DocsLegal } from "./docs.js";
13
+ import { ArrowIcon } from "./_internal.js";
14
+ /* ── Composite ─────────────────────────────────────────────────── */
15
+ /**
16
+ * The entire portal in one tag. Resolves the product, mounts theme + managed
17
+ * auth, and renders the marketing landing (signed-out) or the account
18
+ * dashboard (signed-in). Pass `appearance` to retheme; drop to the standalone
19
+ * components for custom layouts.
20
+ *
21
+ * `renderDashboard` is the chrome escape hatch: when authenticated, the app
22
+ * renders this instead of the built-in card stack (the default template
23
+ * supplies its full sidebar app shell this way), still inside the resolved
24
+ * bootstrap + theme + auth context.
25
+ */
26
+ export function FartherShoreApp({ appearance, clerk, renderDashboard, }) {
27
+ const boot = useBootstrap();
28
+ if (boot.loading)
29
+ return _jsx(FsSplash, { label: "Loading\u2026" });
30
+ if (boot.error || !boot.data) {
31
+ return _jsx(FsSplash, { label: boot.error?.message ?? "Portal unavailable" });
32
+ }
33
+ const merged = {
34
+ brandColor: boot.data.branding.primaryColor ?? undefined,
35
+ ...appearance,
36
+ };
37
+ return (_jsx(FsThemeProvider, { appearance: merged, children: _jsx(FsAuthProvider, { strategy: boot.data.environment?.authStrategy ?? "clerk", clerk: clerk, children: _jsx(AppBody, { boot: boot.data, renderDashboard: renderDashboard }) }) }));
38
+ }
39
+ function AppBody({ boot, renderDashboard, }) {
40
+ const session = useSession();
41
+ const authenticated = Boolean(session.data?.authenticated);
42
+ if (!authenticated) {
43
+ return (_jsxs("main", { className: "fs-anim-in", children: [_jsx(FsHeader, {}), _jsx(FsHero, { boot: boot }), _jsx(FsPricing, {}), _jsx(FsSignIn, { onSignedIn: session.refresh }), _jsx(FsBottomCta, {}), _jsx(FsFooter, { boot: boot })] }));
44
+ }
45
+ if (renderDashboard)
46
+ return _jsx(_Fragment, { children: renderDashboard(boot) });
47
+ return _jsx(FsDefaultDashboard, { boot: boot, onSignOut: () => void session.signOut() });
48
+ }
49
+ /** The built-in signed-in view: a centered stack of the standalone data
50
+ * components. Used when no `renderDashboard` is supplied. */
51
+ function FsDefaultDashboard({ boot, onSignOut }) {
52
+ return (_jsxs("main", { className: "fs-anim-in", children: [_jsx(FsHeader, { authenticated: true, onSignOut: onSignOut }), _jsxs("div", { className: "fs-container", style: { padding: "32px 24px", display: "flex", flexDirection: "column", gap: 18 }, children: [_jsxs("div", { children: [_jsx("h1", { style: { fontSize: 30, fontWeight: 300, letterSpacing: "-0.02em", margin: 0 }, children: boot.branding.displayName }), _jsx("p", { className: "fs-muted", style: { marginTop: 4, fontSize: 14 }, children: "Your account" })] }), _jsx(ApiKeysPanel, {}), _jsx(UsageCard, {}), _jsx(BillingSummary, {}), _jsx(CreditBalance, {}), _jsx(DocsLegal, {})] }), _jsx(FsFooter, { boot: boot })] }));
53
+ }
54
+ /* ── Composite-private sections ────────────────────────────────── */
55
+ function FsHeader({ authenticated, onSignOut, }) {
56
+ return (_jsx("header", { className: "fs-header", children: _jsxs("div", { className: "fs-header__inner", children: [_jsx(FsBranding, {}), _jsxs("nav", { className: "fs-header__nav", children: [!authenticated && (_jsx("a", { href: "#pricing", className: "fs-btn fs-btn--ghost fs-btn--sm", children: "Pricing" })), _jsx(FsThemeToggle, {}), authenticated ? (_jsx("button", { className: "fs-btn fs-btn--outline fs-btn--sm", onClick: onSignOut, children: "Sign out" })) : (_jsx("a", { href: "#signin", className: "fs-btn fs-btn--cta fs-btn--sm", children: "Sign in" }))] })] }) }));
57
+ }
58
+ function FsHero({ boot }) {
59
+ const brand = boot.branding;
60
+ const product = boot.product;
61
+ const authHeaderName = product.authHeaderName ?? "x-api-key";
62
+ const baseUrl = product.runtimeHostname
63
+ ? `https://${product.runtimeHostname}`
64
+ : "https://api.example.com";
65
+ return (_jsxs("section", { className: "fs-hero", children: [_jsx("div", { className: "fs-hero__glow" }), _jsxs("div", { className: "fs-hero__grid", children: [_jsxs("div", { style: { textAlign: "left" }, children: [_jsxs("span", { className: "fs-hero__pill", children: [_jsx("span", { className: "fs-dot fs-dot--pulse" }), "API Available"] }), _jsx("h1", { className: "fs-hero__title", children: brand.displayName }), _jsx("p", { className: "fs-hero__sub", children: brand.description ||
66
+ "Build powerful integrations with our API. Get your key and start making requests in minutes." }), _jsxs("div", { className: "fs-hero__actions", children: [_jsxs("a", { href: "#pricing", className: "fs-btn fs-btn--cta", children: ["Start Building Free", _jsx(ArrowIcon, {})] }), _jsx("a", { href: "#pricing", className: "fs-btn fs-btn--outline", children: "See Pricing" })] })] }), _jsx(FsCodeSample, { baseUrl: baseUrl, authHeaderName: authHeaderName })] })] }));
67
+ }
68
+ function FsCodeSample({ baseUrl, authHeaderName }) {
69
+ const name = authHeaderName.trim() || "x-api-key";
70
+ const value = name.toLowerCase() === "authorization" ? "Bearer fsk_..." : "fsk_...";
71
+ return (_jsxs("div", { className: "fs-code", children: [_jsxs("div", { className: "fs-code__bar", children: [_jsx("span", { className: "fs-code__dot" }), _jsx("span", { className: "fs-code__dot" }), _jsx("span", { className: "fs-code__dot" }), _jsx("span", { className: "fs-code__name", children: "quickstart.sh" })] }), _jsxs("pre", { className: "fs-code__body", children: [_jsx("span", { className: "fs-code__c", children: "# Make your first request" }), "\n", _jsx("span", { className: "fs-code__ok", children: "$" }), " ", _jsx("span", { className: "fs-code__m", children: `curl ${baseUrl}/v1/hello` }), "\n ", _jsx("span", { className: "fs-code__m", children: `-H "${name}: ${value}"` }), "\n\n", _jsx("span", { className: "fs-code__c", children: "// Response" }), "\n", _jsx("span", { className: "fs-code__c", children: "{" }), "\n ", _jsx("span", { className: "fs-code__m", children: "\"status\": " }), _jsx("span", { className: "fs-code__ok", children: "\"ok\"" }), _jsx("span", { className: "fs-code__c", children: "," }), "\n ", _jsx("span", { className: "fs-code__m", children: "\"message\": " }), _jsx("span", { className: "fs-code__warn", children: "\"Hello, developer!\"" }), "\n", _jsx("span", { className: "fs-code__c", children: "}" })] })] }));
72
+ }
73
+ /** The landing's pricing section: heading chrome around the standalone
74
+ * `<PlansTable/>`. */
75
+ export function FsPricing({ className } = {}) {
76
+ return (_jsxs("section", { id: "pricing", className: "fs-section fs-section--surface" + (className ? ` ${className}` : ""), children: [_jsxs("div", { className: "fs-section__head", children: [_jsx("p", { className: "fs-eyebrow", children: "Pricing" }), _jsx("h2", { className: "fs-section__title", children: "Simple, transparent pricing" }), _jsx("p", { className: "fs-section__sub", children: "Start free. Scale as you grow. No hidden fees." })] }), _jsx(PlansTable, {})] }));
77
+ }
78
+ function FsBottomCta() {
79
+ return (_jsx("section", { className: "fs-section", children: _jsxs("div", { className: "fs-cta", children: [_jsx("h2", { className: "fs-section__title", children: "Ready to get started?" }), _jsx("p", { className: "fs-section__sub", style: { fontSize: 16 }, children: "Create your free account and start making API calls in under a minute." }), _jsx("div", { style: { marginTop: 32 }, children: _jsxs("a", { href: "#signin", className: "fs-btn fs-btn--cta", style: { padding: "0 40px" }, children: ["Create Free Account", _jsx(ArrowIcon, {})] }) })] }) }));
80
+ }
81
+ function FsSplash({ label }) {
82
+ return _jsx("div", { className: "fs-app fs-splash", children: label });
83
+ }
84
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/components/app.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { type ReactNode } from "react";
2
+ import type { AuthStrategy } from "../types.js";
3
+ /** Clerk connection config — public values, baked per environment (e.g. from
4
+ * VITE_CLERK_* vars). `satelliteDomain` defaults to the current host minus its
5
+ * first label (`aurora.farthershore.io` → `farthershore.io`). Satellite mode
6
+ * engages only when the full trio resolves; otherwise single-domain Clerk. */
7
+ export interface FsClerkConfig {
8
+ publishableKey: string;
9
+ signInUrl?: string;
10
+ satelliteDomain?: string;
11
+ }
12
+ export interface FsAuth {
13
+ strategy: AuthStrategy;
14
+ /** False while auth is initializing (Clerk JS loading / first session read). */
15
+ loaded: boolean;
16
+ signedIn: boolean;
17
+ /** Clerk → redirect to the primary hosted sign-in (returning here);
18
+ * persona → no-op (render a persona sign-in form via `useSession().signIn`). */
19
+ signIn(): void;
20
+ signOut(): Promise<void>;
21
+ /** Clerk user object (or the persisted persona view user), when signed in. */
22
+ user: unknown;
23
+ /** Re-read the session (persona only; Clerk pushes its own state). */
24
+ refresh(): void;
25
+ }
26
+ export declare function useFsAuth(): FsAuth;
27
+ /** Like {@link useFsAuth} but null outside the managed auth layer — lets
28
+ * components degrade instead of throwing when mounted without a Root. */
29
+ export declare function useOptionalFsAuth(): FsAuth | null;
30
+ /** Renders children only when a user is signed in. */
31
+ export declare function SignedIn({ children }: {
32
+ children: ReactNode;
33
+ }): import("react/jsx-runtime").JSX.Element | null;
34
+ /** Renders children only when signed out (and auth has finished loading —
35
+ * nothing flashes during init). */
36
+ export declare function SignedOut({ children }: {
37
+ children: ReactNode;
38
+ }): import("react/jsx-runtime").JSX.Element | null;
39
+ /** Renders children only while the auth layer is initializing. */
40
+ export declare function AuthLoading({ children }: {
41
+ children: ReactNode;
42
+ }): import("react/jsx-runtime").JSX.Element | null;
43
+ /** A managed sign-in button: Clerk → redirect to the primary-domain hosted
44
+ * sign-in (returning to the current page); persona → scrolls to the sign-in
45
+ * form. Style with className (defaults to the SDK CTA button). */
46
+ export declare function FsSignInButton({ className, children, }: {
47
+ className?: string;
48
+ children?: ReactNode;
49
+ }): import("react/jsx-runtime").JSX.Element;
50
+ /** A managed sign-out button (any strategy). */
51
+ export declare function FsSignOutButton({ className, children, }: {
52
+ className?: string;
53
+ children?: ReactNode;
54
+ }): import("react/jsx-runtime").JSX.Element;
55
+ /** The managed auth layer — mounted by `<FartherShoreRoot>`; mountable directly
56
+ * by custom roots. Picks the implementation from the environment's strategy. */
57
+ export declare function FsAuthProvider({ strategy, clerk, children, }: {
58
+ strategy: AuthStrategy;
59
+ clerk?: FsClerkConfig;
60
+ children: ReactNode;
61
+ }): import("react/jsx-runtime").JSX.Element;
62
+ /** The signed-in account control. Clerk mode → Clerk's <UserButton/> (avatar
63
+ * menu with manage-account + sign-out) behind a loading skeleton; persona
64
+ * mode → null (persona chrome is host-routed — render your own pill). */
65
+ export declare function FsUserButton(): import("react/jsx-runtime").JSX.Element | null;
66
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +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;AAIhD;;;+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,CAIlC;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,2CAOA;AAoPD;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,2CAWA;AAID;;0EAE0E;AAC1E,wBAAgB,YAAY,mDA0B3B"}
@@ -0,0 +1,260 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Managed auth — the SDK owns the whole sign-in story so a host app never
3
+ // writes auth glue. `<FartherShoreRoot>` mounts <FsAuth> with the environment's
4
+ // strategy (from bootstrap):
5
+ //
6
+ // - "clerk": dynamically loads `@clerk/clerk-react` (an OPTIONAL peer — only
7
+ // Clerk-strategy portals pay for it), mounts ClerkProvider in satellite mode
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.
12
+ // - "test-personas": the SDK's own persona session (`fs.auth.signIn` with an
13
+ // `fsk_test_…` key) — persisted/restored automatically by the client.
14
+ //
15
+ // Consumers read ONE surface: `useFsAuth()` → { strategy, loaded, signedIn,
16
+ // signIn(), signOut(), user }. `<FsUserButton/>` renders the right control for
17
+ // the strategy (Clerk's avatar menu, or nothing in persona mode — persona
18
+ // chrome is host-specific).
19
+ import { createContext, useContext, useEffect, useMemo, useState, } from "react";
20
+ import { useFartherShore, useSession } from "../react/index.js";
21
+ import { useFsTheme } from "./theme.js";
22
+ const Ctx = createContext(null);
23
+ export function useFsAuth() {
24
+ const ctx = useContext(Ctx);
25
+ if (!ctx)
26
+ throw new Error("useFsAuth must be used within <FartherShoreRoot>");
27
+ return ctx;
28
+ }
29
+ /** Like {@link useFsAuth} but null outside the managed auth layer — lets
30
+ * components degrade instead of throwing when mounted without a Root. */
31
+ export function useOptionalFsAuth() {
32
+ return useContext(Ctx);
33
+ }
34
+ /* ── Control components (the Clerk-style integration surface) ──── */
35
+ /** Renders children only when a user is signed in. */
36
+ export function SignedIn({ children }) {
37
+ const auth = useFsAuth();
38
+ return auth.loaded && auth.signedIn ? _jsx(_Fragment, { children: children }) : null;
39
+ }
40
+ /** Renders children only when signed out (and auth has finished loading —
41
+ * nothing flashes during init). */
42
+ export function SignedOut({ children }) {
43
+ const auth = useFsAuth();
44
+ return auth.loaded && !auth.signedIn ? _jsx(_Fragment, { children: children }) : null;
45
+ }
46
+ /** Renders children only while the auth layer is initializing. */
47
+ export function AuthLoading({ children }) {
48
+ const auth = useFsAuth();
49
+ return auth.loaded ? null : _jsx(_Fragment, { children: children });
50
+ }
51
+ /** A managed sign-in button: Clerk → redirect to the primary-domain hosted
52
+ * sign-in (returning to the current page); persona → scrolls to the sign-in
53
+ * form. Style with className (defaults to the SDK CTA button). */
54
+ export function FsSignInButton({ className = "fs-btn fs-btn--cta fs-btn--sm", children = "Sign in", }) {
55
+ const auth = useFsAuth();
56
+ return (_jsx("button", { type: "button", className: className, onClick: () => auth.signIn(), children: children }));
57
+ }
58
+ /** A managed sign-out button (any strategy). */
59
+ export function FsSignOutButton({ className = "fs-btn fs-btn--outline fs-btn--sm", children = "Sign out", }) {
60
+ const auth = useFsAuth();
61
+ return (_jsx("button", { type: "button", className: className, onClick: () => void auth.signOut(), children: children }));
62
+ }
63
+ let clerkModulePromise = null;
64
+ function loadClerk() {
65
+ if (!clerkModulePromise) {
66
+ clerkModulePromise = import(
67
+ /* @vite-ignore */ "@clerk/clerk-react").then((m) => m, () => {
68
+ console.warn("[farthershore] Clerk-strategy environment but @clerk/clerk-react is not installed — sign-in disabled. `npm i @clerk/clerk-react` to enable it.");
69
+ return null;
70
+ });
71
+ }
72
+ return clerkModulePromise;
73
+ }
74
+ let darkThemePromise = null;
75
+ function loadDarkTheme() {
76
+ if (!darkThemePromise) {
77
+ darkThemePromise = import(/* @vite-ignore */ "@clerk/themes").then((m) => m.dark ?? null, () => null);
78
+ }
79
+ return darkThemePromise;
80
+ }
81
+ function defaultSatelliteDomain() {
82
+ if (typeof window === "undefined")
83
+ return undefined;
84
+ const parts = window.location.hostname.split(".");
85
+ return parts.length > 2 ? parts.slice(1).join(".") : undefined;
86
+ }
87
+ // Port of the SSR portal's satellite-auto-sync: on a public page Clerk doesn't
88
+ // handshake with the primary domain by itself, so a visitor already signed in
89
+ // on the primary looks signed out here. One sessionStorage-guarded redirect
90
+ // with `?__clerk_synced=false` makes Clerk handshake and propagate the session.
91
+ const HANDSHAKE_FLAG = "__fs_clerk_handshake_attempted";
92
+ function SatelliteAutoSync({ clerk }) {
93
+ const { isLoaded, isSignedIn } = clerk.useAuth();
94
+ useEffect(() => {
95
+ if (!isLoaded || isSignedIn)
96
+ return;
97
+ if (typeof window === "undefined")
98
+ return;
99
+ const w = window;
100
+ if (!w.Clerk?.isSatellite)
101
+ return;
102
+ const url = new URL(window.location.href);
103
+ if (url.searchParams.has("__clerk_synced"))
104
+ return;
105
+ if (window.sessionStorage.getItem(HANDSHAKE_FLAG) === "true")
106
+ return;
107
+ window.sessionStorage.setItem(HANDSHAKE_FLAG, "true");
108
+ url.searchParams.set("__clerk_synced", "false");
109
+ window.location.href = url.toString();
110
+ }, [isLoaded, isSignedIn]);
111
+ return null;
112
+ }
113
+ /** Installs Clerk's getToken as the client's token source (synchronously on
114
+ * render, so data hooks mounted alongside resolve tokens on first fetch) and
115
+ * publishes the FsAuth surface. */
116
+ function ClerkAuthBridge({ clerk, children, }) {
117
+ const fs = useFartherShore();
118
+ const { isLoaded, isSignedIn, getToken } = clerk.useAuth();
119
+ const { user } = clerk.useUser();
120
+ const clerkApi = clerk.useClerk();
121
+ fs.setTokenProvider(() => getToken());
122
+ useEffect(() => {
123
+ fs.setTokenProvider(() => getToken());
124
+ return () => fs.setTokenProvider(null);
125
+ }, [fs, getToken]);
126
+ const value = useMemo(() => ({
127
+ strategy: "clerk",
128
+ loaded: isLoaded,
129
+ signedIn: Boolean(isSignedIn),
130
+ signIn: () => {
131
+ void clerkApi.redirectToSignIn({
132
+ signInForceRedirectUrl: window.location.href,
133
+ signUpForceRedirectUrl: window.location.href,
134
+ });
135
+ },
136
+ signOut: () => clerkApi.signOut(),
137
+ user: user ?? null,
138
+ refresh: () => {
139
+ /* Clerk session state is push-based. */
140
+ },
141
+ }), [isLoaded, isSignedIn, user, clerkApi]);
142
+ return _jsx(Ctx.Provider, { value: value, children: children });
143
+ }
144
+ function ClerkAuth({ config, children, }) {
145
+ const { mode } = useFsTheme();
146
+ const [mod, setMod] = useState(null);
147
+ const [failed, setFailed] = useState(false);
148
+ const [darkTheme, setDarkTheme] = useState(null);
149
+ useEffect(() => {
150
+ let alive = true;
151
+ void loadClerk().then((m) => {
152
+ if (!alive)
153
+ return;
154
+ if (m)
155
+ setMod(m);
156
+ else
157
+ setFailed(true);
158
+ });
159
+ void loadDarkTheme().then((d) => {
160
+ if (alive)
161
+ setDarkTheme(d);
162
+ });
163
+ return () => {
164
+ alive = false;
165
+ };
166
+ }, []);
167
+ if (failed) {
168
+ // Peer not installed: portal renders signed-out, data still works.
169
+ return _jsx(SignedOutFallback, { strategy: "clerk", children: children });
170
+ }
171
+ if (!mod) {
172
+ // Clerk JS still loading — expose loaded:false so hosts show skeletons.
173
+ return _jsx(LoadingAuth, { strategy: "clerk", children: children });
174
+ }
175
+ const domain = config.satelliteDomain ?? defaultSatelliteDomain();
176
+ const satelliteProps = config.signInUrl && domain
177
+ ? { isSatellite: true, domain, signInUrl: config.signInUrl }
178
+ : {};
179
+ const Provider = mod.ClerkProvider;
180
+ return (_jsxs(Provider, { publishableKey: config.publishableKey, appearance: { baseTheme: mode === "dark" && darkTheme ? darkTheme : undefined }, ...satelliteProps, children: [_jsx(SatelliteAutoSync, { clerk: mod }), _jsx(ClerkAuthBridge, { clerk: mod, children: children })] }));
181
+ }
182
+ /* ── Persona (SDK-managed sessions) ────────────────────────────── */
183
+ function PersonaAuth({ children }) {
184
+ const fs = useFartherShore();
185
+ const session = useSession();
186
+ const value = useMemo(() => ({
187
+ strategy: "test-personas",
188
+ loaded: !session.loading,
189
+ signedIn: Boolean(session.data?.authenticated),
190
+ signIn: () => {
191
+ // Persona sign-in is a form (an access key) — hosts render FsSignIn /
192
+ // their own form and call useSession().signIn. Scroll to it if present.
193
+ document.getElementById("signin")?.scrollIntoView({ behavior: "smooth" });
194
+ },
195
+ signOut: async () => {
196
+ await session.signOut();
197
+ },
198
+ user: fs.auth.personaView()?.user ?? null,
199
+ refresh: session.refresh,
200
+ }), [session, fs]);
201
+ return _jsx(Ctx.Provider, { value: value, children: children });
202
+ }
203
+ /* ── Shared fallbacks + the strategy switch ────────────────────── */
204
+ function staticAuth(strategy, loaded) {
205
+ return {
206
+ strategy,
207
+ loaded,
208
+ signedIn: false,
209
+ signIn: () => { },
210
+ signOut: async () => { },
211
+ user: null,
212
+ refresh: () => { },
213
+ };
214
+ }
215
+ function LoadingAuth({ strategy, children, }) {
216
+ const value = useMemo(() => staticAuth(strategy, false), [strategy]);
217
+ return _jsx(Ctx.Provider, { value: value, children: children });
218
+ }
219
+ function SignedOutFallback({ strategy, children, }) {
220
+ const value = useMemo(() => staticAuth(strategy, true), [strategy]);
221
+ return _jsx(Ctx.Provider, { value: value, children: children });
222
+ }
223
+ /** The managed auth layer — mounted by `<FartherShoreRoot>`; mountable directly
224
+ * by custom roots. Picks the implementation from the environment's strategy. */
225
+ export function FsAuthProvider({ strategy, clerk, children, }) {
226
+ if (strategy === "clerk") {
227
+ if (!clerk?.publishableKey) {
228
+ console.warn("[farthershore] Clerk-strategy environment but no publishable key configured (FartherShoreRoot `clerk` prop / VITE_CLERK_PUBLISHABLE_KEY) — sign-in disabled.");
229
+ return _jsx(SignedOutFallback, { strategy: "clerk", children: children });
230
+ }
231
+ return _jsx(ClerkAuth, { config: clerk, children: children });
232
+ }
233
+ return _jsx(PersonaAuth, { children: children });
234
+ }
235
+ /* ── FsUserButton ──────────────────────────────────────────────── */
236
+ /** The signed-in account control. Clerk mode → Clerk's <UserButton/> (avatar
237
+ * menu with manage-account + sign-out) behind a loading skeleton; persona
238
+ * mode → null (persona chrome is host-routed — render your own pill). */
239
+ export function FsUserButton() {
240
+ const auth = useFsAuth();
241
+ const [mod, setMod] = useState(null);
242
+ useEffect(() => {
243
+ if (auth.strategy === "clerk") {
244
+ void loadClerk().then((m) => setMod(m));
245
+ }
246
+ }, [auth.strategy]);
247
+ if (auth.strategy !== "clerk")
248
+ return null;
249
+ if (!auth.loaded || !mod) {
250
+ return (_jsx("div", { "aria-hidden": true, style: {
251
+ height: 32,
252
+ width: 32,
253
+ borderRadius: 999,
254
+ background: "var(--fs-color-input)",
255
+ } }));
256
+ }
257
+ const UserButton = mod.UserButton;
258
+ return _jsx(UserButton, {});
259
+ }
260
+ //# sourceMappingURL=auth.js.map