@feelflow/ffid-sdk 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -806,7 +806,7 @@ function createProfileMethods(deps) {
806
806
  }
807
807
 
808
808
  // src/client/version-check.ts
809
- var SDK_VERSION = "3.0.0";
809
+ var SDK_VERSION = "4.0.0";
810
810
  var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
811
811
  var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
812
812
  function sdkHeaders() {
@@ -1367,6 +1367,8 @@ function base64UrlEncode(buffer) {
1367
1367
  // src/client/redirect.ts
1368
1368
  var OAUTH_AUTHORIZE_ENDPOINT = "/api/v1/oauth/authorize";
1369
1369
  var AUTH_LOGOUT_ENDPOINT = "/api/v1/auth/logout";
1370
+ var SCREEN_HINT_SIGNUP = "signup";
1371
+ var SCREEN_HINT_PARAM = "screen_hint";
1370
1372
  var STATE_RANDOM_BYTES = 16;
1371
1373
  var HEX_BASE2 = 16;
1372
1374
  var REDIRECT_LOOP_KEY = "ffid_sdk_redirect_loop_history";
@@ -1534,6 +1536,9 @@ function createRedirectMethods(deps) {
1534
1536
  }
1535
1537
  params.set("organization_id", trimmedOrgId);
1536
1538
  }
1539
+ if (options?.screenHint === SCREEN_HINT_SIGNUP) {
1540
+ params.set(SCREEN_HINT_PARAM, SCREEN_HINT_SIGNUP);
1541
+ }
1537
1542
  const authorizeUrl = `${baseUrl}${OAUTH_AUTHORIZE_ENDPOINT}?${params.toString()}`;
1538
1543
  logger.debug("Redirecting to authorize:", authorizeUrl);
1539
1544
  recordRedirectAttempt(authorizeKey, now, logger);
@@ -1545,18 +1550,17 @@ function createRedirectMethods(deps) {
1545
1550
  }
1546
1551
  return { success: true };
1547
1552
  }
1548
- async function redirectToLogin() {
1553
+ async function redirectToLogin(options) {
1549
1554
  if (typeof window === "undefined") {
1550
1555
  logger.warn("SSR \u74B0\u5883\u3067\u306F\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3067\u304D\u307E\u305B\u3093");
1551
1556
  return { success: false, error: "SSR \u74B0\u5883\u3067\u306F\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3067\u304D\u307E\u305B\u3093" };
1552
1557
  }
1553
1558
  if (authMode === "token") {
1554
- return redirectToAuthorize();
1559
+ return redirectToAuthorize(options);
1555
1560
  }
1556
- const currentUrl = window.location.href;
1557
- const loginUrl = `${baseUrl}/login?redirect=${encodeURIComponent(currentUrl)}&service=${encodeURIComponent(serviceCode)}`;
1558
- logger.debug("Redirecting to login:", loginUrl);
1559
- window.location.href = loginUrl;
1561
+ const targetUrl = options?.screenHint === SCREEN_HINT_SIGNUP ? getSignupUrl() : getLoginUrl();
1562
+ logger.debug("Redirecting to auth page:", targetUrl);
1563
+ window.location.href = targetUrl;
1560
1564
  return { success: true };
1561
1565
  }
1562
1566
  function getLoginUrl(redirectUrl) {
@@ -2689,8 +2693,8 @@ function FFIDProvider({
2689
2693
  setIsLoading(false);
2690
2694
  }
2691
2695
  }, [client]);
2692
- const login = useCallback(() => {
2693
- client.redirectToLogin().catch((err) => {
2696
+ const login = useCallback((options) => {
2697
+ client.redirectToLogin(options).catch((err) => {
2694
2698
  client.logger.error("\u30ED\u30B0\u30A4\u30F3\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F:", err);
2695
2699
  });
2696
2700
  }, [client]);
@@ -4119,6 +4123,7 @@ var DEFAULT_CATEGORY_LABELS_JA = {
4119
4123
  };
4120
4124
  function defaultCategories() {
4121
4125
  return FFID_INQUIRY_CATEGORIES.map((value) => ({
4126
+ kind: "flat",
4122
4127
  value,
4123
4128
  label: DEFAULT_CATEGORY_LABELS_JA[value]
4124
4129
  }));
@@ -4128,7 +4133,7 @@ function warnOnGroupLabelConflicts(options) {
4128
4133
  const firstExplicitLabel = /* @__PURE__ */ new Map();
4129
4134
  const warnedGroups = /* @__PURE__ */ new Set();
4130
4135
  for (const opt of options) {
4131
- if (!opt.group || opt.groupLabel === void 0) continue;
4136
+ if (opt.kind !== "grouped") continue;
4132
4137
  const firstLabel = firstExplicitLabel.get(opt.group);
4133
4138
  if (firstLabel === void 0) {
4134
4139
  firstExplicitLabel.set(opt.group, opt.groupLabel);
@@ -4141,20 +4146,22 @@ function warnOnGroupLabelConflicts(options) {
4141
4146
  }
4142
4147
  }
4143
4148
  function renderCategoryOptions(options) {
4144
- const hasAnyGroup = options.some((o) => !!o.group);
4149
+ const hasAnyGroup = options.some((o) => o.kind === "grouped");
4145
4150
  if (!hasAnyGroup) {
4146
4151
  return options.map((opt) => /* @__PURE__ */ jsx("option", { value: opt.value, children: opt.label }, opt.value));
4147
4152
  }
4148
- const ungrouped = options.filter((o) => !o.group);
4153
+ const ungrouped = options.filter(
4154
+ (o) => o.kind === "flat"
4155
+ );
4149
4156
  const groupKeys = [];
4150
4157
  const groupLabelByKey = /* @__PURE__ */ new Map();
4151
4158
  const itemsByKey = /* @__PURE__ */ new Map();
4152
4159
  for (const opt of options) {
4153
- if (!opt.group) continue;
4160
+ if (opt.kind !== "grouped") continue;
4154
4161
  if (!itemsByKey.has(opt.group)) {
4155
4162
  groupKeys.push(opt.group);
4156
4163
  itemsByKey.set(opt.group, []);
4157
- groupLabelByKey.set(opt.group, opt.groupLabel ?? opt.group);
4164
+ groupLabelByKey.set(opt.group, opt.groupLabel);
4158
4165
  }
4159
4166
  itemsByKey.get(opt.group).push(opt);
4160
4167
  }
@@ -4177,7 +4184,7 @@ function FFIDInquiryForm({
4177
4184
  turnstileSlot,
4178
4185
  onSubmit,
4179
4186
  onChange,
4180
- separateLegalCheckboxes = false,
4187
+ legalLayout = "combined",
4181
4188
  messagePlaceholder,
4182
4189
  requireCategorySelection = false,
4183
4190
  unstyled = false,
@@ -4188,6 +4195,7 @@ function FFIDInquiryForm({
4188
4195
  const isAuth = mode === "authenticated";
4189
4196
  const isNameReadOnly = isAuth && !!prefill?.name;
4190
4197
  const isEmailReadOnly = isAuth;
4198
+ const usesSeparateLegalCheckboxes = legalLayout === "separate";
4191
4199
  const categoryOptions = useMemo(
4192
4200
  () => categories && categories.length > 0 ? categories : defaultCategories(),
4193
4201
  [categories]
@@ -4283,7 +4291,7 @@ function FFIDInquiryForm({
4283
4291
  async function handleSubmit(e) {
4284
4292
  e.preventDefault();
4285
4293
  setFormError(null);
4286
- if (separateLegalCheckboxes) {
4294
+ if (usesSeparateLegalCheckboxes) {
4287
4295
  const termsInvalid = !agreedTerms;
4288
4296
  const privacyInvalid = !agreedPrivacy;
4289
4297
  setAgreedTermsError(termsInvalid);
@@ -4545,7 +4553,7 @@ function FFIDInquiryForm({
4545
4553
  ]
4546
4554
  }
4547
4555
  ),
4548
- separateLegalCheckboxes ? /* @__PURE__ */ jsxs("div", { style: s(fieldsetStyle), className: classNames?.legalBlock, children: [
4556
+ usesSeparateLegalCheckboxes ? /* @__PURE__ */ jsxs("div", { style: s(fieldsetStyle), className: classNames?.legalBlock, children: [
4549
4557
  /* @__PURE__ */ jsxs("label", { style: s(legalRowFirst), className: classNames?.legalRow, children: [
4550
4558
  /* @__PURE__ */ jsx(
4551
4559
  "input",
@@ -808,7 +808,7 @@ function createProfileMethods(deps) {
808
808
  }
809
809
 
810
810
  // src/client/version-check.ts
811
- var SDK_VERSION = "3.0.0";
811
+ var SDK_VERSION = "4.0.0";
812
812
  var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
813
813
  var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
814
814
  function sdkHeaders() {
@@ -1369,6 +1369,8 @@ function base64UrlEncode(buffer) {
1369
1369
  // src/client/redirect.ts
1370
1370
  var OAUTH_AUTHORIZE_ENDPOINT = "/api/v1/oauth/authorize";
1371
1371
  var AUTH_LOGOUT_ENDPOINT = "/api/v1/auth/logout";
1372
+ var SCREEN_HINT_SIGNUP = "signup";
1373
+ var SCREEN_HINT_PARAM = "screen_hint";
1372
1374
  var STATE_RANDOM_BYTES = 16;
1373
1375
  var HEX_BASE2 = 16;
1374
1376
  var REDIRECT_LOOP_KEY = "ffid_sdk_redirect_loop_history";
@@ -1536,6 +1538,9 @@ function createRedirectMethods(deps) {
1536
1538
  }
1537
1539
  params.set("organization_id", trimmedOrgId);
1538
1540
  }
1541
+ if (options?.screenHint === SCREEN_HINT_SIGNUP) {
1542
+ params.set(SCREEN_HINT_PARAM, SCREEN_HINT_SIGNUP);
1543
+ }
1539
1544
  const authorizeUrl = `${baseUrl}${OAUTH_AUTHORIZE_ENDPOINT}?${params.toString()}`;
1540
1545
  logger.debug("Redirecting to authorize:", authorizeUrl);
1541
1546
  recordRedirectAttempt(authorizeKey, now, logger);
@@ -1547,18 +1552,17 @@ function createRedirectMethods(deps) {
1547
1552
  }
1548
1553
  return { success: true };
1549
1554
  }
1550
- async function redirectToLogin() {
1555
+ async function redirectToLogin(options) {
1551
1556
  if (typeof window === "undefined") {
1552
1557
  logger.warn("SSR \u74B0\u5883\u3067\u306F\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3067\u304D\u307E\u305B\u3093");
1553
1558
  return { success: false, error: "SSR \u74B0\u5883\u3067\u306F\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3067\u304D\u307E\u305B\u3093" };
1554
1559
  }
1555
1560
  if (authMode === "token") {
1556
- return redirectToAuthorize();
1561
+ return redirectToAuthorize(options);
1557
1562
  }
1558
- const currentUrl = window.location.href;
1559
- const loginUrl = `${baseUrl}/login?redirect=${encodeURIComponent(currentUrl)}&service=${encodeURIComponent(serviceCode)}`;
1560
- logger.debug("Redirecting to login:", loginUrl);
1561
- window.location.href = loginUrl;
1563
+ const targetUrl = options?.screenHint === SCREEN_HINT_SIGNUP ? getSignupUrl() : getLoginUrl();
1564
+ logger.debug("Redirecting to auth page:", targetUrl);
1565
+ window.location.href = targetUrl;
1562
1566
  return { success: true };
1563
1567
  }
1564
1568
  function getLoginUrl(redirectUrl) {
@@ -2691,8 +2695,8 @@ function FFIDProvider({
2691
2695
  setIsLoading(false);
2692
2696
  }
2693
2697
  }, [client]);
2694
- const login = react.useCallback(() => {
2695
- client.redirectToLogin().catch((err) => {
2698
+ const login = react.useCallback((options) => {
2699
+ client.redirectToLogin(options).catch((err) => {
2696
2700
  client.logger.error("\u30ED\u30B0\u30A4\u30F3\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F:", err);
2697
2701
  });
2698
2702
  }, [client]);
@@ -4121,6 +4125,7 @@ var DEFAULT_CATEGORY_LABELS_JA = {
4121
4125
  };
4122
4126
  function defaultCategories() {
4123
4127
  return FFID_INQUIRY_CATEGORIES.map((value) => ({
4128
+ kind: "flat",
4124
4129
  value,
4125
4130
  label: DEFAULT_CATEGORY_LABELS_JA[value]
4126
4131
  }));
@@ -4130,7 +4135,7 @@ function warnOnGroupLabelConflicts(options) {
4130
4135
  const firstExplicitLabel = /* @__PURE__ */ new Map();
4131
4136
  const warnedGroups = /* @__PURE__ */ new Set();
4132
4137
  for (const opt of options) {
4133
- if (!opt.group || opt.groupLabel === void 0) continue;
4138
+ if (opt.kind !== "grouped") continue;
4134
4139
  const firstLabel = firstExplicitLabel.get(opt.group);
4135
4140
  if (firstLabel === void 0) {
4136
4141
  firstExplicitLabel.set(opt.group, opt.groupLabel);
@@ -4143,20 +4148,22 @@ function warnOnGroupLabelConflicts(options) {
4143
4148
  }
4144
4149
  }
4145
4150
  function renderCategoryOptions(options) {
4146
- const hasAnyGroup = options.some((o) => !!o.group);
4151
+ const hasAnyGroup = options.some((o) => o.kind === "grouped");
4147
4152
  if (!hasAnyGroup) {
4148
4153
  return options.map((opt) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: opt.value, children: opt.label }, opt.value));
4149
4154
  }
4150
- const ungrouped = options.filter((o) => !o.group);
4155
+ const ungrouped = options.filter(
4156
+ (o) => o.kind === "flat"
4157
+ );
4151
4158
  const groupKeys = [];
4152
4159
  const groupLabelByKey = /* @__PURE__ */ new Map();
4153
4160
  const itemsByKey = /* @__PURE__ */ new Map();
4154
4161
  for (const opt of options) {
4155
- if (!opt.group) continue;
4162
+ if (opt.kind !== "grouped") continue;
4156
4163
  if (!itemsByKey.has(opt.group)) {
4157
4164
  groupKeys.push(opt.group);
4158
4165
  itemsByKey.set(opt.group, []);
4159
- groupLabelByKey.set(opt.group, opt.groupLabel ?? opt.group);
4166
+ groupLabelByKey.set(opt.group, opt.groupLabel);
4160
4167
  }
4161
4168
  itemsByKey.get(opt.group).push(opt);
4162
4169
  }
@@ -4179,7 +4186,7 @@ function FFIDInquiryForm({
4179
4186
  turnstileSlot,
4180
4187
  onSubmit,
4181
4188
  onChange,
4182
- separateLegalCheckboxes = false,
4189
+ legalLayout = "combined",
4183
4190
  messagePlaceholder,
4184
4191
  requireCategorySelection = false,
4185
4192
  unstyled = false,
@@ -4190,6 +4197,7 @@ function FFIDInquiryForm({
4190
4197
  const isAuth = mode === "authenticated";
4191
4198
  const isNameReadOnly = isAuth && !!prefill?.name;
4192
4199
  const isEmailReadOnly = isAuth;
4200
+ const usesSeparateLegalCheckboxes = legalLayout === "separate";
4193
4201
  const categoryOptions = react.useMemo(
4194
4202
  () => categories && categories.length > 0 ? categories : defaultCategories(),
4195
4203
  [categories]
@@ -4285,7 +4293,7 @@ function FFIDInquiryForm({
4285
4293
  async function handleSubmit(e) {
4286
4294
  e.preventDefault();
4287
4295
  setFormError(null);
4288
- if (separateLegalCheckboxes) {
4296
+ if (usesSeparateLegalCheckboxes) {
4289
4297
  const termsInvalid = !agreedTerms;
4290
4298
  const privacyInvalid = !agreedPrivacy;
4291
4299
  setAgreedTermsError(termsInvalid);
@@ -4547,7 +4555,7 @@ function FFIDInquiryForm({
4547
4555
  ]
4548
4556
  }
4549
4557
  ),
4550
- separateLegalCheckboxes ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: s(fieldsetStyle), className: classNames?.legalBlock, children: [
4558
+ usesSeparateLegalCheckboxes ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: s(fieldsetStyle), className: classNames?.legalBlock, children: [
4551
4559
  /* @__PURE__ */ jsxRuntime.jsxs("label", { style: s(legalRowFirst), className: classNames?.legalRow, children: [
4552
4560
  /* @__PURE__ */ jsxRuntime.jsx(
4553
4561
  "input",
@@ -1,34 +1,34 @@
1
1
  'use strict';
2
2
 
3
- var chunkJNR4AKL5_cjs = require('../chunk-JNR4AKL5.cjs');
3
+ var chunkXQL4YSTL_cjs = require('../chunk-XQL4YSTL.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "FFIDAnnouncementBadge", {
8
8
  enumerable: true,
9
- get: function () { return chunkJNR4AKL5_cjs.FFIDAnnouncementBadge; }
9
+ get: function () { return chunkXQL4YSTL_cjs.FFIDAnnouncementBadge; }
10
10
  });
11
11
  Object.defineProperty(exports, "FFIDAnnouncementList", {
12
12
  enumerable: true,
13
- get: function () { return chunkJNR4AKL5_cjs.FFIDAnnouncementList; }
13
+ get: function () { return chunkXQL4YSTL_cjs.FFIDAnnouncementList; }
14
14
  });
15
15
  Object.defineProperty(exports, "FFIDInquiryForm", {
16
16
  enumerable: true,
17
- get: function () { return chunkJNR4AKL5_cjs.FFIDInquiryForm; }
17
+ get: function () { return chunkXQL4YSTL_cjs.FFIDInquiryForm; }
18
18
  });
19
19
  Object.defineProperty(exports, "FFIDLoginButton", {
20
20
  enumerable: true,
21
- get: function () { return chunkJNR4AKL5_cjs.FFIDLoginButton; }
21
+ get: function () { return chunkXQL4YSTL_cjs.FFIDLoginButton; }
22
22
  });
23
23
  Object.defineProperty(exports, "FFIDOrganizationSwitcher", {
24
24
  enumerable: true,
25
- get: function () { return chunkJNR4AKL5_cjs.FFIDOrganizationSwitcher; }
25
+ get: function () { return chunkXQL4YSTL_cjs.FFIDOrganizationSwitcher; }
26
26
  });
27
27
  Object.defineProperty(exports, "FFIDSubscriptionBadge", {
28
28
  enumerable: true,
29
- get: function () { return chunkJNR4AKL5_cjs.FFIDSubscriptionBadge; }
29
+ get: function () { return chunkXQL4YSTL_cjs.FFIDSubscriptionBadge; }
30
30
  });
31
31
  Object.defineProperty(exports, "FFIDUserMenu", {
32
32
  enumerable: true,
33
- get: function () { return chunkJNR4AKL5_cjs.FFIDUserMenu; }
33
+ get: function () { return chunkXQL4YSTL_cjs.FFIDUserMenu; }
34
34
  });
@@ -1,3 +1,3 @@
1
- export { N as FFIDAnnouncementBadge, am as FFIDAnnouncementBadgeClassNames, an as FFIDAnnouncementBadgeProps, O as FFIDAnnouncementList, ao as FFIDAnnouncementListClassNames, ap as FFIDAnnouncementListProps, W as FFIDInquiryForm, X as FFIDInquiryFormCategoryItem, Y as FFIDInquiryFormClassNames, Z as FFIDInquiryFormOrganization, _ as FFIDInquiryFormPlaceholderContext, $ as FFIDInquiryFormPrefill, a0 as FFIDInquiryFormProps, a1 as FFIDInquiryFormSubmitData, a2 as FFIDInquiryFormSubmitResult, a4 as FFIDLoginButton, aq as FFIDLoginButtonProps, aa as FFIDOrganizationSwitcher, ar as FFIDOrganizationSwitcherClassNames, as as FFIDOrganizationSwitcherProps, ad as FFIDSubscriptionBadge, at as FFIDSubscriptionBadgeClassNames, au as FFIDSubscriptionBadgeProps, af as FFIDUserMenu, av as FFIDUserMenuClassNames, aw as FFIDUserMenuProps } from '../index-C3zyNa4j.cjs';
1
+ export { N as FFIDAnnouncementBadge, an as FFIDAnnouncementBadgeClassNames, ao as FFIDAnnouncementBadgeProps, O as FFIDAnnouncementList, ap as FFIDAnnouncementListClassNames, aq as FFIDAnnouncementListProps, W as FFIDInquiryForm, X as FFIDInquiryFormCategoryItem, Y as FFIDInquiryFormClassNames, Z as FFIDInquiryFormLegalLayout, _ as FFIDInquiryFormOrganization, $ as FFIDInquiryFormPlaceholderContext, a0 as FFIDInquiryFormPrefill, a1 as FFIDInquiryFormProps, a2 as FFIDInquiryFormSubmitData, a3 as FFIDInquiryFormSubmitResult, a5 as FFIDLoginButton, ar as FFIDLoginButtonProps, ab as FFIDOrganizationSwitcher, as as FFIDOrganizationSwitcherClassNames, at as FFIDOrganizationSwitcherProps, ae as FFIDSubscriptionBadge, au as FFIDSubscriptionBadgeClassNames, av as FFIDSubscriptionBadgeProps, ag as FFIDUserMenu, aw as FFIDUserMenuClassNames, ax as FFIDUserMenuProps } from '../index-Cn8-3hgb.cjs';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
@@ -1,3 +1,3 @@
1
- export { N as FFIDAnnouncementBadge, am as FFIDAnnouncementBadgeClassNames, an as FFIDAnnouncementBadgeProps, O as FFIDAnnouncementList, ao as FFIDAnnouncementListClassNames, ap as FFIDAnnouncementListProps, W as FFIDInquiryForm, X as FFIDInquiryFormCategoryItem, Y as FFIDInquiryFormClassNames, Z as FFIDInquiryFormOrganization, _ as FFIDInquiryFormPlaceholderContext, $ as FFIDInquiryFormPrefill, a0 as FFIDInquiryFormProps, a1 as FFIDInquiryFormSubmitData, a2 as FFIDInquiryFormSubmitResult, a4 as FFIDLoginButton, aq as FFIDLoginButtonProps, aa as FFIDOrganizationSwitcher, ar as FFIDOrganizationSwitcherClassNames, as as FFIDOrganizationSwitcherProps, ad as FFIDSubscriptionBadge, at as FFIDSubscriptionBadgeClassNames, au as FFIDSubscriptionBadgeProps, af as FFIDUserMenu, av as FFIDUserMenuClassNames, aw as FFIDUserMenuProps } from '../index-C3zyNa4j.js';
1
+ export { N as FFIDAnnouncementBadge, an as FFIDAnnouncementBadgeClassNames, ao as FFIDAnnouncementBadgeProps, O as FFIDAnnouncementList, ap as FFIDAnnouncementListClassNames, aq as FFIDAnnouncementListProps, W as FFIDInquiryForm, X as FFIDInquiryFormCategoryItem, Y as FFIDInquiryFormClassNames, Z as FFIDInquiryFormLegalLayout, _ as FFIDInquiryFormOrganization, $ as FFIDInquiryFormPlaceholderContext, a0 as FFIDInquiryFormPrefill, a1 as FFIDInquiryFormProps, a2 as FFIDInquiryFormSubmitData, a3 as FFIDInquiryFormSubmitResult, a5 as FFIDLoginButton, ar as FFIDLoginButtonProps, ab as FFIDOrganizationSwitcher, as as FFIDOrganizationSwitcherClassNames, at as FFIDOrganizationSwitcherProps, ae as FFIDSubscriptionBadge, au as FFIDSubscriptionBadgeClassNames, av as FFIDSubscriptionBadgeProps, ag as FFIDUserMenu, aw as FFIDUserMenuClassNames, ax as FFIDUserMenuProps } from '../index-Cn8-3hgb.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
@@ -1 +1 @@
1
- export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-XWI4BFKW.js';
1
+ export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-P35ULJLM.js';
@@ -1056,10 +1056,30 @@ interface ContractWizardSubscriptionOptions {
1056
1056
 
1057
1057
  /** Redirect and URL generation - redirectToLogin / redirectToAuthorize / redirectToLogout / getLoginUrl / getSignupUrl / getLogoutUrl */
1058
1058
 
1059
+ /**
1060
+ * `screen_hint=signup` query value for `/oauth/authorize` (#2908 / #2911).
1061
+ * Forwards to Supabase Auth signup screen; only the `'signup'` value is
1062
+ * propagated (no-op when `'login'` or omitted).
1063
+ */
1064
+ declare const SCREEN_HINT_SIGNUP: "signup";
1059
1065
  /** Options for redirectToAuthorize */
1060
1066
  interface RedirectToAuthorizeOptions {
1061
1067
  /** Target organization ID — triggers org-scoped OAuth re-authorization */
1062
1068
  organizationId?: string;
1069
+ /**
1070
+ * Initial Supabase Auth screen hint (#2908 / #2911).
1071
+ *
1072
+ * - `'signup'`: forwards `?screen_hint=signup` so the FFID OAuth flow lands
1073
+ * on the signup screen (used by external services that want to deep-link
1074
+ * new users into the signup CTA).
1075
+ * - `'login'` / `undefined`: no `screen_hint` param is added — the default
1076
+ * login screen is shown.
1077
+ *
1078
+ * In cookie mode, `'signup'` redirects to the FFID `/signup` page instead
1079
+ * of `/login` so the SDK contract (signup-screen intent) stays consistent
1080
+ * regardless of `authMode`.
1081
+ */
1082
+ screenHint?: typeof SCREEN_HINT_SIGNUP | 'login';
1063
1083
  }
1064
1084
 
1065
1085
  /**
@@ -1107,7 +1127,7 @@ declare function createTokenStore(storageType?: 'localStorage' | 'memory'): Toke
1107
1127
  declare function createFFIDClient(config: FFIDConfig): {
1108
1128
  getSession: () => Promise<FFIDApiResponse<FFIDSessionResponse>>;
1109
1129
  signOut: () => Promise<FFIDApiResponse<void>>;
1110
- redirectToLogin: () => Promise<FFIDRedirectResult>;
1130
+ redirectToLogin: (options?: RedirectToAuthorizeOptions) => Promise<FFIDRedirectResult>;
1111
1131
  redirectToAuthorize: (options?: RedirectToAuthorizeOptions) => Promise<FFIDRedirectResult>;
1112
1132
  redirectToLogout: (postLogoutRedirectUri?: string) => FFIDRedirectResult;
1113
1133
  getLoginUrl: (redirectUrl?: string) => string;
@@ -1056,10 +1056,30 @@ interface ContractWizardSubscriptionOptions {
1056
1056
 
1057
1057
  /** Redirect and URL generation - redirectToLogin / redirectToAuthorize / redirectToLogout / getLoginUrl / getSignupUrl / getLogoutUrl */
1058
1058
 
1059
+ /**
1060
+ * `screen_hint=signup` query value for `/oauth/authorize` (#2908 / #2911).
1061
+ * Forwards to Supabase Auth signup screen; only the `'signup'` value is
1062
+ * propagated (no-op when `'login'` or omitted).
1063
+ */
1064
+ declare const SCREEN_HINT_SIGNUP: "signup";
1059
1065
  /** Options for redirectToAuthorize */
1060
1066
  interface RedirectToAuthorizeOptions {
1061
1067
  /** Target organization ID — triggers org-scoped OAuth re-authorization */
1062
1068
  organizationId?: string;
1069
+ /**
1070
+ * Initial Supabase Auth screen hint (#2908 / #2911).
1071
+ *
1072
+ * - `'signup'`: forwards `?screen_hint=signup` so the FFID OAuth flow lands
1073
+ * on the signup screen (used by external services that want to deep-link
1074
+ * new users into the signup CTA).
1075
+ * - `'login'` / `undefined`: no `screen_hint` param is added — the default
1076
+ * login screen is shown.
1077
+ *
1078
+ * In cookie mode, `'signup'` redirects to the FFID `/signup` page instead
1079
+ * of `/login` so the SDK contract (signup-screen intent) stays consistent
1080
+ * regardless of `authMode`.
1081
+ */
1082
+ screenHint?: typeof SCREEN_HINT_SIGNUP | 'login';
1063
1083
  }
1064
1084
 
1065
1085
  /**
@@ -1107,7 +1127,7 @@ declare function createTokenStore(storageType?: 'localStorage' | 'memory'): Toke
1107
1127
  declare function createFFIDClient(config: FFIDConfig): {
1108
1128
  getSession: () => Promise<FFIDApiResponse<FFIDSessionResponse>>;
1109
1129
  signOut: () => Promise<FFIDApiResponse<void>>;
1110
- redirectToLogin: () => Promise<FFIDRedirectResult>;
1130
+ redirectToLogin: (options?: RedirectToAuthorizeOptions) => Promise<FFIDRedirectResult>;
1111
1131
  redirectToAuthorize: (options?: RedirectToAuthorizeOptions) => Promise<FFIDRedirectResult>;
1112
1132
  redirectToLogout: (postLogoutRedirectUri?: string) => FFIDRedirectResult;
1113
1133
  getLoginUrl: (redirectUrl?: string) => string;
@@ -302,8 +302,17 @@ interface FFIDContextValue {
302
302
  isAuthenticated: boolean;
303
303
  /** Any authentication error */
304
304
  error: FFIDError | null;
305
- /** Redirect to FFID login page */
306
- login: () => void;
305
+ /**
306
+ * Redirect to FFID login page.
307
+ *
308
+ * @param options.screenHint `'signup'` to deep-link into the signup screen
309
+ * (forwards `screen_hint=signup` in token mode / redirects to `/signup`
310
+ * in cookie mode). `'login'` and `undefined` use the default login flow.
311
+ * See `RedirectToAuthorizeOptions` (#2908 / #2911).
312
+ */
313
+ login: (options?: {
314
+ screenHint?: 'signup' | 'login';
315
+ }) => void;
307
316
  /** Sign out and clear session */
308
317
  logout: () => Promise<void>;
309
318
  /**
@@ -1194,13 +1203,24 @@ declare function FFIDAnnouncementList({ announcements, isLoading, className, cla
1194
1203
  * The single source of truth for consumers is `FFIDInquiryForm.tsx`.
1195
1204
  */
1196
1205
 
1197
- /** Category option rendered in the form select. */
1198
- interface FFIDInquiryFormCategoryItem {
1206
+ /** Legal agreement layout rendered by the inquiry form. */
1207
+ type FFIDInquiryFormLegalLayout = 'combined' | 'separate';
1208
+ /** Category option rendered as a top-level `<option>`. */
1209
+ interface FFIDInquiryFormFlatCategoryItem {
1210
+ kind: 'flat';
1199
1211
  value: string;
1200
1212
  label: string;
1201
- group?: string;
1202
- groupLabel?: string;
1203
1213
  }
1214
+ /** Category option rendered inside an `<optgroup>`. */
1215
+ interface FFIDInquiryFormGroupedCategoryItem {
1216
+ kind: 'grouped';
1217
+ value: string;
1218
+ label: string;
1219
+ group: string;
1220
+ groupLabel: string;
1221
+ }
1222
+ /** Category option rendered in the form select. */
1223
+ type FFIDInquiryFormCategoryItem = FFIDInquiryFormFlatCategoryItem | FFIDInquiryFormGroupedCategoryItem;
1204
1224
  /**
1205
1225
  * Per-slot `className` overrides. Every key is optional; when omitted,
1206
1226
  * the slot falls back to SDK defaults. Intended to be combined with
@@ -1365,11 +1385,11 @@ interface FFIDInquiryFormProps {
1365
1385
  */
1366
1386
  onChange?: (data: FFIDInquiryFormSubmitData) => void;
1367
1387
  /**
1368
- * When true, renders the legal agreement as two independent checkboxes
1369
- * (terms and privacy). Defaults to `false`, preserving the combined
1370
- * single-checkbox behavior from SDK ≤ 2.8.
1388
+ * Controls whether legal agreement is rendered as one combined checkbox
1389
+ * or two independent terms / privacy checkboxes. Defaults to `combined`,
1390
+ * preserving the single-checkbox behavior from SDK ≤ 3.x.
1371
1391
  */
1372
- separateLegalCheckboxes?: boolean;
1392
+ legalLayout?: FFIDInquiryFormLegalLayout;
1373
1393
  /**
1374
1394
  * Overrides the `<textarea>` placeholder. A plain string is applied
1375
1395
  * verbatim; a function is called with the currently selected category
@@ -1420,6 +1440,6 @@ interface FFIDInquiryFormProps {
1420
1440
  interface FFIDInquiryFormPlaceholderContext {
1421
1441
  category: string | null;
1422
1442
  }
1423
- declare function FFIDInquiryForm({ mode, prefill, organizations, preselectedOrganizationId, categories, termsVersion, privacyVersion, termsHref, privacyHref, turnstileToken, turnstileSlot, onSubmit, onChange, separateLegalCheckboxes, messagePlaceholder, requireCategorySelection, unstyled, classNames, locale, className, }: FFIDInquiryFormProps): react_jsx_runtime.JSX.Element;
1443
+ declare function FFIDInquiryForm({ mode, prefill, organizations, preselectedOrganizationId, categories, termsVersion, privacyVersion, termsHref, privacyHref, turnstileToken, turnstileSlot, onSubmit, onChange, legalLayout, messagePlaceholder, requireCategorySelection, unstyled, classNames, locale, className, }: FFIDInquiryFormProps): react_jsx_runtime.JSX.Element;
1424
1444
 
1425
- export { type FFIDInquiryFormPrefill as $, type FFIDOrganization as A, type FFIDSubscription as B, type FFIDSubscriptionContextValue as C, type FFIDAnnouncementsClientConfig as D, type EffectiveSubscriptionStatus as E, type FFIDSubscriptionStatus as F, type FFIDAnnouncementsApiResponse as G, type AnnouncementListResponse as H, type FFIDAnnouncementsLogger as I, type Announcement as J, type AnnouncementStatus as K, type ListAnnouncementsOptions as L, type AnnouncementType as M, FFIDAnnouncementBadge as N, FFIDAnnouncementList as O, type FFIDAnnouncementsError as P, type FFIDAnnouncementsErrorCode as Q, type FFIDAnnouncementsServerResponse as R, type FFIDCacheConfig as S, type FFIDContextValue as T, type FFIDInquiryCategory as U, type FFIDInquiryCategorySite2026 as V, FFIDInquiryForm as W, type FFIDInquiryFormCategoryItem as X, type FFIDInquiryFormClassNames as Y, type FFIDInquiryFormOrganization as Z, type FFIDInquiryFormPlaceholderContext as _, type FFIDConfig as a, type FFIDInquiryFormProps as a0, type FFIDInquiryFormSubmitData as a1, type FFIDInquiryFormSubmitResult as a2, type FFIDJwtClaims as a3, FFIDLoginButton as a4, type FFIDMemberStatus as a5, type FFIDOAuthTokenResponse as a6, type FFIDOAuthUserInfoMemberRole as a7, type FFIDOAuthUserInfoSubscription as a8, type FFIDOrganizationMember as a9, FFIDOrganizationSwitcher as aa, type FFIDRedirectErrorCode as ab, type FFIDSeatModel as ac, FFIDSubscriptionBadge as ad, type FFIDTokenIntrospectionResponse as ae, FFIDUserMenu as af, FFID_INQUIRY_CATEGORIES as ag, FFID_INQUIRY_CATEGORIES_SITE_2026 as ah, type UseFFIDAnnouncementsOptions as ai, type UseFFIDAnnouncementsReturn as aj, isFFIDInquiryCategorySite2026 as ak, useFFIDAnnouncements as al, type FFIDAnnouncementBadgeClassNames as am, type FFIDAnnouncementBadgeProps as an, type FFIDAnnouncementListClassNames as ao, type FFIDAnnouncementListProps as ap, type FFIDLoginButtonProps as aq, type FFIDOrganizationSwitcherClassNames as ar, type FFIDOrganizationSwitcherProps as as, type FFIDSubscriptionBadgeClassNames as at, type FFIDSubscriptionBadgeProps as au, type FFIDUserMenuClassNames as av, type FFIDUserMenuProps as aw, type FFIDApiResponse as b, type FFIDSessionResponse as c, type FFIDRedirectResult as d, type FFIDError as e, type FFIDSubscriptionCheckResponse as f, type FFIDListMembersResponse as g, type FFIDMemberRole as h, type FFIDUpdateMemberRoleResponse as i, type FFIDRemoveMemberResponse as j, type FFIDProfileCallOptions as k, type FFIDUserProfile as l, type FFIDUpdateUserProfileRequest as m, type FFIDAnalyticsConfig as n, type FFIDCreateCheckoutParams as o, type FFIDCheckoutSessionResponse as p, type FFIDCreatePortalParams as q, type FFIDPortalSessionResponse as r, type FFIDVerifyAccessTokenOptions as s, type FFIDOAuthUserInfo as t, type FFIDInquiryCreateParams as u, type FFIDInquiryCreateResponse as v, type FFIDAuthMode as w, type FFIDLogger as x, type FFIDCacheAdapter as y, type FFIDUser as z };
1445
+ export { type FFIDInquiryFormPlaceholderContext as $, type FFIDOrganization as A, type FFIDSubscription as B, type FFIDSubscriptionContextValue as C, type FFIDAnnouncementsClientConfig as D, type EffectiveSubscriptionStatus as E, type FFIDSubscriptionStatus as F, type FFIDAnnouncementsApiResponse as G, type AnnouncementListResponse as H, type FFIDAnnouncementsLogger as I, type Announcement as J, type AnnouncementStatus as K, type ListAnnouncementsOptions as L, type AnnouncementType as M, FFIDAnnouncementBadge as N, FFIDAnnouncementList as O, type FFIDAnnouncementsError as P, type FFIDAnnouncementsErrorCode as Q, type FFIDAnnouncementsServerResponse as R, type FFIDCacheConfig as S, type FFIDContextValue as T, type FFIDInquiryCategory as U, type FFIDInquiryCategorySite2026 as V, FFIDInquiryForm as W, type FFIDInquiryFormCategoryItem as X, type FFIDInquiryFormClassNames as Y, type FFIDInquiryFormLegalLayout as Z, type FFIDInquiryFormOrganization as _, type FFIDConfig as a, type FFIDInquiryFormPrefill as a0, type FFIDInquiryFormProps as a1, type FFIDInquiryFormSubmitData as a2, type FFIDInquiryFormSubmitResult as a3, type FFIDJwtClaims as a4, FFIDLoginButton as a5, type FFIDMemberStatus as a6, type FFIDOAuthTokenResponse as a7, type FFIDOAuthUserInfoMemberRole as a8, type FFIDOAuthUserInfoSubscription as a9, type FFIDOrganizationMember as aa, FFIDOrganizationSwitcher as ab, type FFIDRedirectErrorCode as ac, type FFIDSeatModel as ad, FFIDSubscriptionBadge as ae, type FFIDTokenIntrospectionResponse as af, FFIDUserMenu as ag, FFID_INQUIRY_CATEGORIES as ah, FFID_INQUIRY_CATEGORIES_SITE_2026 as ai, type UseFFIDAnnouncementsOptions as aj, type UseFFIDAnnouncementsReturn as ak, isFFIDInquiryCategorySite2026 as al, useFFIDAnnouncements as am, type FFIDAnnouncementBadgeClassNames as an, type FFIDAnnouncementBadgeProps as ao, type FFIDAnnouncementListClassNames as ap, type FFIDAnnouncementListProps as aq, type FFIDLoginButtonProps as ar, type FFIDOrganizationSwitcherClassNames as as, type FFIDOrganizationSwitcherProps as at, type FFIDSubscriptionBadgeClassNames as au, type FFIDSubscriptionBadgeProps as av, type FFIDUserMenuClassNames as aw, type FFIDUserMenuProps as ax, type FFIDApiResponse as b, type FFIDSessionResponse as c, type FFIDRedirectResult as d, type FFIDError as e, type FFIDSubscriptionCheckResponse as f, type FFIDListMembersResponse as g, type FFIDMemberRole as h, type FFIDUpdateMemberRoleResponse as i, type FFIDRemoveMemberResponse as j, type FFIDProfileCallOptions as k, type FFIDUserProfile as l, type FFIDUpdateUserProfileRequest as m, type FFIDAnalyticsConfig as n, type FFIDCreateCheckoutParams as o, type FFIDCheckoutSessionResponse as p, type FFIDCreatePortalParams as q, type FFIDPortalSessionResponse as r, type FFIDVerifyAccessTokenOptions as s, type FFIDOAuthUserInfo as t, type FFIDInquiryCreateParams as u, type FFIDInquiryCreateResponse as v, type FFIDAuthMode as w, type FFIDLogger as x, type FFIDCacheAdapter as y, type FFIDUser as z };
@@ -302,8 +302,17 @@ interface FFIDContextValue {
302
302
  isAuthenticated: boolean;
303
303
  /** Any authentication error */
304
304
  error: FFIDError | null;
305
- /** Redirect to FFID login page */
306
- login: () => void;
305
+ /**
306
+ * Redirect to FFID login page.
307
+ *
308
+ * @param options.screenHint `'signup'` to deep-link into the signup screen
309
+ * (forwards `screen_hint=signup` in token mode / redirects to `/signup`
310
+ * in cookie mode). `'login'` and `undefined` use the default login flow.
311
+ * See `RedirectToAuthorizeOptions` (#2908 / #2911).
312
+ */
313
+ login: (options?: {
314
+ screenHint?: 'signup' | 'login';
315
+ }) => void;
307
316
  /** Sign out and clear session */
308
317
  logout: () => Promise<void>;
309
318
  /**
@@ -1194,13 +1203,24 @@ declare function FFIDAnnouncementList({ announcements, isLoading, className, cla
1194
1203
  * The single source of truth for consumers is `FFIDInquiryForm.tsx`.
1195
1204
  */
1196
1205
 
1197
- /** Category option rendered in the form select. */
1198
- interface FFIDInquiryFormCategoryItem {
1206
+ /** Legal agreement layout rendered by the inquiry form. */
1207
+ type FFIDInquiryFormLegalLayout = 'combined' | 'separate';
1208
+ /** Category option rendered as a top-level `<option>`. */
1209
+ interface FFIDInquiryFormFlatCategoryItem {
1210
+ kind: 'flat';
1199
1211
  value: string;
1200
1212
  label: string;
1201
- group?: string;
1202
- groupLabel?: string;
1203
1213
  }
1214
+ /** Category option rendered inside an `<optgroup>`. */
1215
+ interface FFIDInquiryFormGroupedCategoryItem {
1216
+ kind: 'grouped';
1217
+ value: string;
1218
+ label: string;
1219
+ group: string;
1220
+ groupLabel: string;
1221
+ }
1222
+ /** Category option rendered in the form select. */
1223
+ type FFIDInquiryFormCategoryItem = FFIDInquiryFormFlatCategoryItem | FFIDInquiryFormGroupedCategoryItem;
1204
1224
  /**
1205
1225
  * Per-slot `className` overrides. Every key is optional; when omitted,
1206
1226
  * the slot falls back to SDK defaults. Intended to be combined with
@@ -1365,11 +1385,11 @@ interface FFIDInquiryFormProps {
1365
1385
  */
1366
1386
  onChange?: (data: FFIDInquiryFormSubmitData) => void;
1367
1387
  /**
1368
- * When true, renders the legal agreement as two independent checkboxes
1369
- * (terms and privacy). Defaults to `false`, preserving the combined
1370
- * single-checkbox behavior from SDK ≤ 2.8.
1388
+ * Controls whether legal agreement is rendered as one combined checkbox
1389
+ * or two independent terms / privacy checkboxes. Defaults to `combined`,
1390
+ * preserving the single-checkbox behavior from SDK ≤ 3.x.
1371
1391
  */
1372
- separateLegalCheckboxes?: boolean;
1392
+ legalLayout?: FFIDInquiryFormLegalLayout;
1373
1393
  /**
1374
1394
  * Overrides the `<textarea>` placeholder. A plain string is applied
1375
1395
  * verbatim; a function is called with the currently selected category
@@ -1420,6 +1440,6 @@ interface FFIDInquiryFormProps {
1420
1440
  interface FFIDInquiryFormPlaceholderContext {
1421
1441
  category: string | null;
1422
1442
  }
1423
- declare function FFIDInquiryForm({ mode, prefill, organizations, preselectedOrganizationId, categories, termsVersion, privacyVersion, termsHref, privacyHref, turnstileToken, turnstileSlot, onSubmit, onChange, separateLegalCheckboxes, messagePlaceholder, requireCategorySelection, unstyled, classNames, locale, className, }: FFIDInquiryFormProps): react_jsx_runtime.JSX.Element;
1443
+ declare function FFIDInquiryForm({ mode, prefill, organizations, preselectedOrganizationId, categories, termsVersion, privacyVersion, termsHref, privacyHref, turnstileToken, turnstileSlot, onSubmit, onChange, legalLayout, messagePlaceholder, requireCategorySelection, unstyled, classNames, locale, className, }: FFIDInquiryFormProps): react_jsx_runtime.JSX.Element;
1424
1444
 
1425
- export { type FFIDInquiryFormPrefill as $, type FFIDOrganization as A, type FFIDSubscription as B, type FFIDSubscriptionContextValue as C, type FFIDAnnouncementsClientConfig as D, type EffectiveSubscriptionStatus as E, type FFIDSubscriptionStatus as F, type FFIDAnnouncementsApiResponse as G, type AnnouncementListResponse as H, type FFIDAnnouncementsLogger as I, type Announcement as J, type AnnouncementStatus as K, type ListAnnouncementsOptions as L, type AnnouncementType as M, FFIDAnnouncementBadge as N, FFIDAnnouncementList as O, type FFIDAnnouncementsError as P, type FFIDAnnouncementsErrorCode as Q, type FFIDAnnouncementsServerResponse as R, type FFIDCacheConfig as S, type FFIDContextValue as T, type FFIDInquiryCategory as U, type FFIDInquiryCategorySite2026 as V, FFIDInquiryForm as W, type FFIDInquiryFormCategoryItem as X, type FFIDInquiryFormClassNames as Y, type FFIDInquiryFormOrganization as Z, type FFIDInquiryFormPlaceholderContext as _, type FFIDConfig as a, type FFIDInquiryFormProps as a0, type FFIDInquiryFormSubmitData as a1, type FFIDInquiryFormSubmitResult as a2, type FFIDJwtClaims as a3, FFIDLoginButton as a4, type FFIDMemberStatus as a5, type FFIDOAuthTokenResponse as a6, type FFIDOAuthUserInfoMemberRole as a7, type FFIDOAuthUserInfoSubscription as a8, type FFIDOrganizationMember as a9, FFIDOrganizationSwitcher as aa, type FFIDRedirectErrorCode as ab, type FFIDSeatModel as ac, FFIDSubscriptionBadge as ad, type FFIDTokenIntrospectionResponse as ae, FFIDUserMenu as af, FFID_INQUIRY_CATEGORIES as ag, FFID_INQUIRY_CATEGORIES_SITE_2026 as ah, type UseFFIDAnnouncementsOptions as ai, type UseFFIDAnnouncementsReturn as aj, isFFIDInquiryCategorySite2026 as ak, useFFIDAnnouncements as al, type FFIDAnnouncementBadgeClassNames as am, type FFIDAnnouncementBadgeProps as an, type FFIDAnnouncementListClassNames as ao, type FFIDAnnouncementListProps as ap, type FFIDLoginButtonProps as aq, type FFIDOrganizationSwitcherClassNames as ar, type FFIDOrganizationSwitcherProps as as, type FFIDSubscriptionBadgeClassNames as at, type FFIDSubscriptionBadgeProps as au, type FFIDUserMenuClassNames as av, type FFIDUserMenuProps as aw, type FFIDApiResponse as b, type FFIDSessionResponse as c, type FFIDRedirectResult as d, type FFIDError as e, type FFIDSubscriptionCheckResponse as f, type FFIDListMembersResponse as g, type FFIDMemberRole as h, type FFIDUpdateMemberRoleResponse as i, type FFIDRemoveMemberResponse as j, type FFIDProfileCallOptions as k, type FFIDUserProfile as l, type FFIDUpdateUserProfileRequest as m, type FFIDAnalyticsConfig as n, type FFIDCreateCheckoutParams as o, type FFIDCheckoutSessionResponse as p, type FFIDCreatePortalParams as q, type FFIDPortalSessionResponse as r, type FFIDVerifyAccessTokenOptions as s, type FFIDOAuthUserInfo as t, type FFIDInquiryCreateParams as u, type FFIDInquiryCreateResponse as v, type FFIDAuthMode as w, type FFIDLogger as x, type FFIDCacheAdapter as y, type FFIDUser as z };
1445
+ export { type FFIDInquiryFormPlaceholderContext as $, type FFIDOrganization as A, type FFIDSubscription as B, type FFIDSubscriptionContextValue as C, type FFIDAnnouncementsClientConfig as D, type EffectiveSubscriptionStatus as E, type FFIDSubscriptionStatus as F, type FFIDAnnouncementsApiResponse as G, type AnnouncementListResponse as H, type FFIDAnnouncementsLogger as I, type Announcement as J, type AnnouncementStatus as K, type ListAnnouncementsOptions as L, type AnnouncementType as M, FFIDAnnouncementBadge as N, FFIDAnnouncementList as O, type FFIDAnnouncementsError as P, type FFIDAnnouncementsErrorCode as Q, type FFIDAnnouncementsServerResponse as R, type FFIDCacheConfig as S, type FFIDContextValue as T, type FFIDInquiryCategory as U, type FFIDInquiryCategorySite2026 as V, FFIDInquiryForm as W, type FFIDInquiryFormCategoryItem as X, type FFIDInquiryFormClassNames as Y, type FFIDInquiryFormLegalLayout as Z, type FFIDInquiryFormOrganization as _, type FFIDConfig as a, type FFIDInquiryFormPrefill as a0, type FFIDInquiryFormProps as a1, type FFIDInquiryFormSubmitData as a2, type FFIDInquiryFormSubmitResult as a3, type FFIDJwtClaims as a4, FFIDLoginButton as a5, type FFIDMemberStatus as a6, type FFIDOAuthTokenResponse as a7, type FFIDOAuthUserInfoMemberRole as a8, type FFIDOAuthUserInfoSubscription as a9, type FFIDOrganizationMember as aa, FFIDOrganizationSwitcher as ab, type FFIDRedirectErrorCode as ac, type FFIDSeatModel as ad, FFIDSubscriptionBadge as ae, type FFIDTokenIntrospectionResponse as af, FFIDUserMenu as ag, FFID_INQUIRY_CATEGORIES as ah, FFID_INQUIRY_CATEGORIES_SITE_2026 as ai, type UseFFIDAnnouncementsOptions as aj, type UseFFIDAnnouncementsReturn as ak, isFFIDInquiryCategorySite2026 as al, useFFIDAnnouncements as am, type FFIDAnnouncementBadgeClassNames as an, type FFIDAnnouncementBadgeProps as ao, type FFIDAnnouncementListClassNames as ap, type FFIDAnnouncementListProps as aq, type FFIDLoginButtonProps as ar, type FFIDOrganizationSwitcherClassNames as as, type FFIDOrganizationSwitcherProps as at, type FFIDSubscriptionBadgeClassNames as au, type FFIDSubscriptionBadgeProps as av, type FFIDUserMenuClassNames as aw, type FFIDUserMenuProps as ax, type FFIDApiResponse as b, type FFIDSessionResponse as c, type FFIDRedirectResult as d, type FFIDError as e, type FFIDSubscriptionCheckResponse as f, type FFIDListMembersResponse as g, type FFIDMemberRole as h, type FFIDUpdateMemberRoleResponse as i, type FFIDRemoveMemberResponse as j, type FFIDProfileCallOptions as k, type FFIDUserProfile as l, type FFIDUpdateUserProfileRequest as m, type FFIDAnalyticsConfig as n, type FFIDCreateCheckoutParams as o, type FFIDCheckoutSessionResponse as p, type FFIDCreatePortalParams as q, type FFIDPortalSessionResponse as r, type FFIDVerifyAccessTokenOptions as s, type FFIDOAuthUserInfo as t, type FFIDInquiryCreateParams as u, type FFIDInquiryCreateResponse as v, type FFIDAuthMode as w, type FFIDLogger as x, type FFIDCacheAdapter as y, type FFIDUser as z };
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkJNR4AKL5_cjs = require('./chunk-JNR4AKL5.cjs');
3
+ var chunkXQL4YSTL_cjs = require('./chunk-XQL4YSTL.cjs');
4
4
  var react = require('react');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
 
@@ -53,8 +53,8 @@ function defaultRedirect(url) {
53
53
  }
54
54
  function useRequireActiveSubscription(options) {
55
55
  const { redirectTo, allowGrace = true, onRedirect } = options;
56
- const { isLoading, error } = chunkJNR4AKL5_cjs.useFFIDContext();
57
- const { effectiveStatus, isBlocked, isGrace } = chunkJNR4AKL5_cjs.useSubscription();
56
+ const { isLoading, error } = chunkXQL4YSTL_cjs.useFFIDContext();
57
+ const { effectiveStatus, isBlocked, isGrace } = chunkXQL4YSTL_cjs.useSubscription();
58
58
  const hasFetchError = error !== null && effectiveStatus === null;
59
59
  const shouldRedirect = !isLoading && !hasFetchError && (isBlocked || !allowGrace && isGrace || effectiveStatus === null);
60
60
  react.useEffect(() => {
@@ -75,7 +75,7 @@ function useRequireActiveSubscription(options) {
75
75
  }
76
76
  function withFFIDAuth(Component, options = {}) {
77
77
  const WrappedComponent = (props) => {
78
- const { isLoading, isAuthenticated, login } = chunkJNR4AKL5_cjs.useFFIDContext();
78
+ const { isLoading, isAuthenticated, login } = chunkXQL4YSTL_cjs.useFFIDContext();
79
79
  const hasRedirected = react.useRef(false);
80
80
  react.useEffect(() => {
81
81
  if (!isLoading && !isAuthenticated && options.redirectToLogin && !hasRedirected.current) {
@@ -104,115 +104,115 @@ var FFID_NEWSLETTER_DISPATCH_MAX_RECIPIENTS = 1e3;
104
104
 
105
105
  Object.defineProperty(exports, "DEFAULT_API_BASE_URL", {
106
106
  enumerable: true,
107
- get: function () { return chunkJNR4AKL5_cjs.DEFAULT_API_BASE_URL; }
107
+ get: function () { return chunkXQL4YSTL_cjs.DEFAULT_API_BASE_URL; }
108
108
  });
109
109
  Object.defineProperty(exports, "DEFAULT_OAUTH_SCOPES", {
110
110
  enumerable: true,
111
- get: function () { return chunkJNR4AKL5_cjs.DEFAULT_OAUTH_SCOPES; }
111
+ get: function () { return chunkXQL4YSTL_cjs.DEFAULT_OAUTH_SCOPES; }
112
112
  });
113
113
  Object.defineProperty(exports, "FFIDAnnouncementBadge", {
114
114
  enumerable: true,
115
- get: function () { return chunkJNR4AKL5_cjs.FFIDAnnouncementBadge; }
115
+ get: function () { return chunkXQL4YSTL_cjs.FFIDAnnouncementBadge; }
116
116
  });
117
117
  Object.defineProperty(exports, "FFIDAnnouncementList", {
118
118
  enumerable: true,
119
- get: function () { return chunkJNR4AKL5_cjs.FFIDAnnouncementList; }
119
+ get: function () { return chunkXQL4YSTL_cjs.FFIDAnnouncementList; }
120
120
  });
121
121
  Object.defineProperty(exports, "FFIDInquiryForm", {
122
122
  enumerable: true,
123
- get: function () { return chunkJNR4AKL5_cjs.FFIDInquiryForm; }
123
+ get: function () { return chunkXQL4YSTL_cjs.FFIDInquiryForm; }
124
124
  });
125
125
  Object.defineProperty(exports, "FFIDLoginButton", {
126
126
  enumerable: true,
127
- get: function () { return chunkJNR4AKL5_cjs.FFIDLoginButton; }
127
+ get: function () { return chunkXQL4YSTL_cjs.FFIDLoginButton; }
128
128
  });
129
129
  Object.defineProperty(exports, "FFIDOrganizationSwitcher", {
130
130
  enumerable: true,
131
- get: function () { return chunkJNR4AKL5_cjs.FFIDOrganizationSwitcher; }
131
+ get: function () { return chunkXQL4YSTL_cjs.FFIDOrganizationSwitcher; }
132
132
  });
133
133
  Object.defineProperty(exports, "FFIDProvider", {
134
134
  enumerable: true,
135
- get: function () { return chunkJNR4AKL5_cjs.FFIDProvider; }
135
+ get: function () { return chunkXQL4YSTL_cjs.FFIDProvider; }
136
136
  });
137
137
  Object.defineProperty(exports, "FFIDSDKError", {
138
138
  enumerable: true,
139
- get: function () { return chunkJNR4AKL5_cjs.FFIDSDKError; }
139
+ get: function () { return chunkXQL4YSTL_cjs.FFIDSDKError; }
140
140
  });
141
141
  Object.defineProperty(exports, "FFIDSubscriptionBadge", {
142
142
  enumerable: true,
143
- get: function () { return chunkJNR4AKL5_cjs.FFIDSubscriptionBadge; }
143
+ get: function () { return chunkXQL4YSTL_cjs.FFIDSubscriptionBadge; }
144
144
  });
145
145
  Object.defineProperty(exports, "FFIDUserMenu", {
146
146
  enumerable: true,
147
- get: function () { return chunkJNR4AKL5_cjs.FFIDUserMenu; }
147
+ get: function () { return chunkXQL4YSTL_cjs.FFIDUserMenu; }
148
148
  });
149
149
  Object.defineProperty(exports, "FFID_ANNOUNCEMENTS_ERROR_CODES", {
150
150
  enumerable: true,
151
- get: function () { return chunkJNR4AKL5_cjs.FFID_ANNOUNCEMENTS_ERROR_CODES; }
151
+ get: function () { return chunkXQL4YSTL_cjs.FFID_ANNOUNCEMENTS_ERROR_CODES; }
152
152
  });
153
153
  Object.defineProperty(exports, "FFID_INQUIRY_CATEGORIES", {
154
154
  enumerable: true,
155
- get: function () { return chunkJNR4AKL5_cjs.FFID_INQUIRY_CATEGORIES; }
155
+ get: function () { return chunkXQL4YSTL_cjs.FFID_INQUIRY_CATEGORIES; }
156
156
  });
157
157
  Object.defineProperty(exports, "FFID_INQUIRY_CATEGORIES_SITE_2026", {
158
158
  enumerable: true,
159
- get: function () { return chunkJNR4AKL5_cjs.FFID_INQUIRY_CATEGORIES_SITE_2026; }
159
+ get: function () { return chunkXQL4YSTL_cjs.FFID_INQUIRY_CATEGORIES_SITE_2026; }
160
160
  });
161
161
  Object.defineProperty(exports, "computeEffectiveStatusFromSession", {
162
162
  enumerable: true,
163
- get: function () { return chunkJNR4AKL5_cjs.computeEffectiveStatusFromSession; }
163
+ get: function () { return chunkXQL4YSTL_cjs.computeEffectiveStatusFromSession; }
164
164
  });
165
165
  Object.defineProperty(exports, "createFFIDAnnouncementsClient", {
166
166
  enumerable: true,
167
- get: function () { return chunkJNR4AKL5_cjs.createFFIDAnnouncementsClient; }
167
+ get: function () { return chunkXQL4YSTL_cjs.createFFIDAnnouncementsClient; }
168
168
  });
169
169
  Object.defineProperty(exports, "createFFIDClient", {
170
170
  enumerable: true,
171
- get: function () { return chunkJNR4AKL5_cjs.createFFIDClient; }
171
+ get: function () { return chunkXQL4YSTL_cjs.createFFIDClient; }
172
172
  });
173
173
  Object.defineProperty(exports, "createTokenStore", {
174
174
  enumerable: true,
175
- get: function () { return chunkJNR4AKL5_cjs.createTokenStore; }
175
+ get: function () { return chunkXQL4YSTL_cjs.createTokenStore; }
176
176
  });
177
177
  Object.defineProperty(exports, "generateCodeChallenge", {
178
178
  enumerable: true,
179
- get: function () { return chunkJNR4AKL5_cjs.generateCodeChallenge; }
179
+ get: function () { return chunkXQL4YSTL_cjs.generateCodeChallenge; }
180
180
  });
181
181
  Object.defineProperty(exports, "generateCodeVerifier", {
182
182
  enumerable: true,
183
- get: function () { return chunkJNR4AKL5_cjs.generateCodeVerifier; }
183
+ get: function () { return chunkXQL4YSTL_cjs.generateCodeVerifier; }
184
184
  });
185
185
  Object.defineProperty(exports, "isFFIDInquiryCategorySite2026", {
186
186
  enumerable: true,
187
- get: function () { return chunkJNR4AKL5_cjs.isFFIDInquiryCategorySite2026; }
187
+ get: function () { return chunkXQL4YSTL_cjs.isFFIDInquiryCategorySite2026; }
188
188
  });
189
189
  Object.defineProperty(exports, "normalizeRedirectUri", {
190
190
  enumerable: true,
191
- get: function () { return chunkJNR4AKL5_cjs.normalizeRedirectUri; }
191
+ get: function () { return chunkXQL4YSTL_cjs.normalizeRedirectUri; }
192
192
  });
193
193
  Object.defineProperty(exports, "retrieveCodeVerifier", {
194
194
  enumerable: true,
195
- get: function () { return chunkJNR4AKL5_cjs.retrieveCodeVerifier; }
195
+ get: function () { return chunkXQL4YSTL_cjs.retrieveCodeVerifier; }
196
196
  });
197
197
  Object.defineProperty(exports, "storeCodeVerifier", {
198
198
  enumerable: true,
199
- get: function () { return chunkJNR4AKL5_cjs.storeCodeVerifier; }
199
+ get: function () { return chunkXQL4YSTL_cjs.storeCodeVerifier; }
200
200
  });
201
201
  Object.defineProperty(exports, "useFFID", {
202
202
  enumerable: true,
203
- get: function () { return chunkJNR4AKL5_cjs.useFFID; }
203
+ get: function () { return chunkXQL4YSTL_cjs.useFFID; }
204
204
  });
205
205
  Object.defineProperty(exports, "useFFIDAnnouncements", {
206
206
  enumerable: true,
207
- get: function () { return chunkJNR4AKL5_cjs.useFFIDAnnouncements; }
207
+ get: function () { return chunkXQL4YSTL_cjs.useFFIDAnnouncements; }
208
208
  });
209
209
  Object.defineProperty(exports, "useSubscription", {
210
210
  enumerable: true,
211
- get: function () { return chunkJNR4AKL5_cjs.useSubscription; }
211
+ get: function () { return chunkXQL4YSTL_cjs.useSubscription; }
212
212
  });
213
213
  Object.defineProperty(exports, "withSubscription", {
214
214
  enumerable: true,
215
- get: function () { return chunkJNR4AKL5_cjs.withSubscription; }
215
+ get: function () { return chunkXQL4YSTL_cjs.withSubscription; }
216
216
  });
217
217
  exports.FFID_NEWSLETTER_DISPATCH_MAX_RECIPIENTS = FFID_NEWSLETTER_DISPATCH_MAX_RECIPIENTS;
218
218
  exports.FFID_NEWSLETTER_TYPES = FFID_NEWSLETTER_TYPES;
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as FFIDSubscriptionStatus, a as FFIDConfig, b as FFIDApiResponse, c as FFIDSessionResponse, d as FFIDRedirectResult, e as FFIDError, f as FFIDSubscriptionCheckResponse, g as FFIDListMembersResponse, h as FFIDMemberRole, i as FFIDUpdateMemberRoleResponse, j as FFIDRemoveMemberResponse, k as FFIDProfileCallOptions, l as FFIDUserProfile, m as FFIDUpdateUserProfileRequest, n as FFIDAnalyticsConfig, o as FFIDCreateCheckoutParams, p as FFIDCheckoutSessionResponse, q as FFIDCreatePortalParams, r as FFIDPortalSessionResponse, s as FFIDVerifyAccessTokenOptions, t as FFIDOAuthUserInfo, u as FFIDInquiryCreateParams, v as FFIDInquiryCreateResponse, w as FFIDAuthMode, x as FFIDLogger, y as FFIDCacheAdapter, z as FFIDUser, A as FFIDOrganization, B as FFIDSubscription, C as FFIDSubscriptionContextValue, E as EffectiveSubscriptionStatus, D as FFIDAnnouncementsClientConfig, L as ListAnnouncementsOptions, G as FFIDAnnouncementsApiResponse, H as AnnouncementListResponse, I as FFIDAnnouncementsLogger } from './index-C3zyNa4j.cjs';
2
- export { J as Announcement, K as AnnouncementStatus, M as AnnouncementType, N as FFIDAnnouncementBadge, O as FFIDAnnouncementList, P as FFIDAnnouncementsError, Q as FFIDAnnouncementsErrorCode, R as FFIDAnnouncementsServerResponse, S as FFIDCacheConfig, T as FFIDContextValue, U as FFIDInquiryCategory, V as FFIDInquiryCategorySite2026, W as FFIDInquiryForm, X as FFIDInquiryFormCategoryItem, Y as FFIDInquiryFormClassNames, Z as FFIDInquiryFormOrganization, _ as FFIDInquiryFormPlaceholderContext, $ as FFIDInquiryFormPrefill, a0 as FFIDInquiryFormProps, a1 as FFIDInquiryFormSubmitData, a2 as FFIDInquiryFormSubmitResult, a3 as FFIDJwtClaims, a4 as FFIDLoginButton, a5 as FFIDMemberStatus, a6 as FFIDOAuthTokenResponse, a7 as FFIDOAuthUserInfoMemberRole, a8 as FFIDOAuthUserInfoSubscription, a9 as FFIDOrganizationMember, aa as FFIDOrganizationSwitcher, ab as FFIDRedirectErrorCode, ac as FFIDSeatModel, ad as FFIDSubscriptionBadge, ae as FFIDTokenIntrospectionResponse, af as FFIDUserMenu, ag as FFID_INQUIRY_CATEGORIES, ah as FFID_INQUIRY_CATEGORIES_SITE_2026, ai as UseFFIDAnnouncementsOptions, aj as UseFFIDAnnouncementsReturn, ak as isFFIDInquiryCategorySite2026, al as useFFIDAnnouncements } from './index-C3zyNa4j.cjs';
1
+ import { F as FFIDSubscriptionStatus, a as FFIDConfig, b as FFIDApiResponse, c as FFIDSessionResponse, d as FFIDRedirectResult, e as FFIDError, f as FFIDSubscriptionCheckResponse, g as FFIDListMembersResponse, h as FFIDMemberRole, i as FFIDUpdateMemberRoleResponse, j as FFIDRemoveMemberResponse, k as FFIDProfileCallOptions, l as FFIDUserProfile, m as FFIDUpdateUserProfileRequest, n as FFIDAnalyticsConfig, o as FFIDCreateCheckoutParams, p as FFIDCheckoutSessionResponse, q as FFIDCreatePortalParams, r as FFIDPortalSessionResponse, s as FFIDVerifyAccessTokenOptions, t as FFIDOAuthUserInfo, u as FFIDInquiryCreateParams, v as FFIDInquiryCreateResponse, w as FFIDAuthMode, x as FFIDLogger, y as FFIDCacheAdapter, z as FFIDUser, A as FFIDOrganization, B as FFIDSubscription, C as FFIDSubscriptionContextValue, E as EffectiveSubscriptionStatus, D as FFIDAnnouncementsClientConfig, L as ListAnnouncementsOptions, G as FFIDAnnouncementsApiResponse, H as AnnouncementListResponse, I as FFIDAnnouncementsLogger } from './index-Cn8-3hgb.cjs';
2
+ export { J as Announcement, K as AnnouncementStatus, M as AnnouncementType, N as FFIDAnnouncementBadge, O as FFIDAnnouncementList, P as FFIDAnnouncementsError, Q as FFIDAnnouncementsErrorCode, R as FFIDAnnouncementsServerResponse, S as FFIDCacheConfig, T as FFIDContextValue, U as FFIDInquiryCategory, V as FFIDInquiryCategorySite2026, W as FFIDInquiryForm, X as FFIDInquiryFormCategoryItem, Y as FFIDInquiryFormClassNames, Z as FFIDInquiryFormLegalLayout, _ as FFIDInquiryFormOrganization, $ as FFIDInquiryFormPlaceholderContext, a0 as FFIDInquiryFormPrefill, a1 as FFIDInquiryFormProps, a2 as FFIDInquiryFormSubmitData, a3 as FFIDInquiryFormSubmitResult, a4 as FFIDJwtClaims, a5 as FFIDLoginButton, a6 as FFIDMemberStatus, a7 as FFIDOAuthTokenResponse, a8 as FFIDOAuthUserInfoMemberRole, a9 as FFIDOAuthUserInfoSubscription, aa as FFIDOrganizationMember, ab as FFIDOrganizationSwitcher, ac as FFIDRedirectErrorCode, ad as FFIDSeatModel, ae as FFIDSubscriptionBadge, af as FFIDTokenIntrospectionResponse, ag as FFIDUserMenu, ah as FFID_INQUIRY_CATEGORIES, ai as FFID_INQUIRY_CATEGORIES_SITE_2026, aj as UseFFIDAnnouncementsOptions, ak as UseFFIDAnnouncementsReturn, al as isFFIDInquiryCategorySite2026, am as useFFIDAnnouncements } from './index-Cn8-3hgb.cjs';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ReactNode, ComponentType, FC } from 'react';
5
5
 
@@ -493,17 +493,37 @@ interface ContractWizardSubscriptionOptions {
493
493
 
494
494
  /** Redirect and URL generation - redirectToLogin / redirectToAuthorize / redirectToLogout / getLoginUrl / getSignupUrl / getLogoutUrl */
495
495
 
496
+ /**
497
+ * `screen_hint=signup` query value for `/oauth/authorize` (#2908 / #2911).
498
+ * Forwards to Supabase Auth signup screen; only the `'signup'` value is
499
+ * propagated (no-op when `'login'` or omitted).
500
+ */
501
+ declare const SCREEN_HINT_SIGNUP: "signup";
496
502
  /** Options for redirectToAuthorize */
497
503
  interface RedirectToAuthorizeOptions {
498
504
  /** Target organization ID — triggers org-scoped OAuth re-authorization */
499
505
  organizationId?: string;
506
+ /**
507
+ * Initial Supabase Auth screen hint (#2908 / #2911).
508
+ *
509
+ * - `'signup'`: forwards `?screen_hint=signup` so the FFID OAuth flow lands
510
+ * on the signup screen (used by external services that want to deep-link
511
+ * new users into the signup CTA).
512
+ * - `'login'` / `undefined`: no `screen_hint` param is added — the default
513
+ * login screen is shown.
514
+ *
515
+ * In cookie mode, `'signup'` redirects to the FFID `/signup` page instead
516
+ * of `/login` so the SDK contract (signup-screen intent) stays consistent
517
+ * regardless of `authMode`.
518
+ */
519
+ screenHint?: typeof SCREEN_HINT_SIGNUP | 'login';
500
520
  }
501
521
 
502
522
  /** Creates an FFID API client instance */
503
523
  declare function createFFIDClient(config: FFIDConfig): {
504
524
  getSession: () => Promise<FFIDApiResponse<FFIDSessionResponse>>;
505
525
  signOut: () => Promise<FFIDApiResponse<void>>;
506
- redirectToLogin: () => Promise<FFIDRedirectResult>;
526
+ redirectToLogin: (options?: RedirectToAuthorizeOptions) => Promise<FFIDRedirectResult>;
507
527
  redirectToAuthorize: (options?: RedirectToAuthorizeOptions) => Promise<FFIDRedirectResult>;
508
528
  redirectToLogout: (postLogoutRedirectUri?: string) => FFIDRedirectResult;
509
529
  getLoginUrl: (redirectUrl?: string) => string;
@@ -679,8 +699,17 @@ interface UseFFIDReturn {
679
699
  isAuthenticated: boolean;
680
700
  /** Any authentication error that occurred */
681
701
  error: FFIDError | null;
682
- /** Redirect to login page */
683
- login: () => void;
702
+ /**
703
+ * Redirect to login page.
704
+ *
705
+ * @param options.screenHint `'signup'` to deep-link into the signup screen
706
+ * (forwards `screen_hint=signup` in token mode / redirects to `/signup`
707
+ * in cookie mode). `'login'` and `undefined` use the default login flow.
708
+ * See `RedirectToAuthorizeOptions` (#2908 / #2911).
709
+ */
710
+ login: (options?: {
711
+ screenHint?: 'signup' | 'login';
712
+ }) => void;
684
713
  /** Sign out */
685
714
  logout: () => Promise<void>;
686
715
  /**
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as FFIDSubscriptionStatus, a as FFIDConfig, b as FFIDApiResponse, c as FFIDSessionResponse, d as FFIDRedirectResult, e as FFIDError, f as FFIDSubscriptionCheckResponse, g as FFIDListMembersResponse, h as FFIDMemberRole, i as FFIDUpdateMemberRoleResponse, j as FFIDRemoveMemberResponse, k as FFIDProfileCallOptions, l as FFIDUserProfile, m as FFIDUpdateUserProfileRequest, n as FFIDAnalyticsConfig, o as FFIDCreateCheckoutParams, p as FFIDCheckoutSessionResponse, q as FFIDCreatePortalParams, r as FFIDPortalSessionResponse, s as FFIDVerifyAccessTokenOptions, t as FFIDOAuthUserInfo, u as FFIDInquiryCreateParams, v as FFIDInquiryCreateResponse, w as FFIDAuthMode, x as FFIDLogger, y as FFIDCacheAdapter, z as FFIDUser, A as FFIDOrganization, B as FFIDSubscription, C as FFIDSubscriptionContextValue, E as EffectiveSubscriptionStatus, D as FFIDAnnouncementsClientConfig, L as ListAnnouncementsOptions, G as FFIDAnnouncementsApiResponse, H as AnnouncementListResponse, I as FFIDAnnouncementsLogger } from './index-C3zyNa4j.js';
2
- export { J as Announcement, K as AnnouncementStatus, M as AnnouncementType, N as FFIDAnnouncementBadge, O as FFIDAnnouncementList, P as FFIDAnnouncementsError, Q as FFIDAnnouncementsErrorCode, R as FFIDAnnouncementsServerResponse, S as FFIDCacheConfig, T as FFIDContextValue, U as FFIDInquiryCategory, V as FFIDInquiryCategorySite2026, W as FFIDInquiryForm, X as FFIDInquiryFormCategoryItem, Y as FFIDInquiryFormClassNames, Z as FFIDInquiryFormOrganization, _ as FFIDInquiryFormPlaceholderContext, $ as FFIDInquiryFormPrefill, a0 as FFIDInquiryFormProps, a1 as FFIDInquiryFormSubmitData, a2 as FFIDInquiryFormSubmitResult, a3 as FFIDJwtClaims, a4 as FFIDLoginButton, a5 as FFIDMemberStatus, a6 as FFIDOAuthTokenResponse, a7 as FFIDOAuthUserInfoMemberRole, a8 as FFIDOAuthUserInfoSubscription, a9 as FFIDOrganizationMember, aa as FFIDOrganizationSwitcher, ab as FFIDRedirectErrorCode, ac as FFIDSeatModel, ad as FFIDSubscriptionBadge, ae as FFIDTokenIntrospectionResponse, af as FFIDUserMenu, ag as FFID_INQUIRY_CATEGORIES, ah as FFID_INQUIRY_CATEGORIES_SITE_2026, ai as UseFFIDAnnouncementsOptions, aj as UseFFIDAnnouncementsReturn, ak as isFFIDInquiryCategorySite2026, al as useFFIDAnnouncements } from './index-C3zyNa4j.js';
1
+ import { F as FFIDSubscriptionStatus, a as FFIDConfig, b as FFIDApiResponse, c as FFIDSessionResponse, d as FFIDRedirectResult, e as FFIDError, f as FFIDSubscriptionCheckResponse, g as FFIDListMembersResponse, h as FFIDMemberRole, i as FFIDUpdateMemberRoleResponse, j as FFIDRemoveMemberResponse, k as FFIDProfileCallOptions, l as FFIDUserProfile, m as FFIDUpdateUserProfileRequest, n as FFIDAnalyticsConfig, o as FFIDCreateCheckoutParams, p as FFIDCheckoutSessionResponse, q as FFIDCreatePortalParams, r as FFIDPortalSessionResponse, s as FFIDVerifyAccessTokenOptions, t as FFIDOAuthUserInfo, u as FFIDInquiryCreateParams, v as FFIDInquiryCreateResponse, w as FFIDAuthMode, x as FFIDLogger, y as FFIDCacheAdapter, z as FFIDUser, A as FFIDOrganization, B as FFIDSubscription, C as FFIDSubscriptionContextValue, E as EffectiveSubscriptionStatus, D as FFIDAnnouncementsClientConfig, L as ListAnnouncementsOptions, G as FFIDAnnouncementsApiResponse, H as AnnouncementListResponse, I as FFIDAnnouncementsLogger } from './index-Cn8-3hgb.js';
2
+ export { J as Announcement, K as AnnouncementStatus, M as AnnouncementType, N as FFIDAnnouncementBadge, O as FFIDAnnouncementList, P as FFIDAnnouncementsError, Q as FFIDAnnouncementsErrorCode, R as FFIDAnnouncementsServerResponse, S as FFIDCacheConfig, T as FFIDContextValue, U as FFIDInquiryCategory, V as FFIDInquiryCategorySite2026, W as FFIDInquiryForm, X as FFIDInquiryFormCategoryItem, Y as FFIDInquiryFormClassNames, Z as FFIDInquiryFormLegalLayout, _ as FFIDInquiryFormOrganization, $ as FFIDInquiryFormPlaceholderContext, a0 as FFIDInquiryFormPrefill, a1 as FFIDInquiryFormProps, a2 as FFIDInquiryFormSubmitData, a3 as FFIDInquiryFormSubmitResult, a4 as FFIDJwtClaims, a5 as FFIDLoginButton, a6 as FFIDMemberStatus, a7 as FFIDOAuthTokenResponse, a8 as FFIDOAuthUserInfoMemberRole, a9 as FFIDOAuthUserInfoSubscription, aa as FFIDOrganizationMember, ab as FFIDOrganizationSwitcher, ac as FFIDRedirectErrorCode, ad as FFIDSeatModel, ae as FFIDSubscriptionBadge, af as FFIDTokenIntrospectionResponse, ag as FFIDUserMenu, ah as FFID_INQUIRY_CATEGORIES, ai as FFID_INQUIRY_CATEGORIES_SITE_2026, aj as UseFFIDAnnouncementsOptions, ak as UseFFIDAnnouncementsReturn, al as isFFIDInquiryCategorySite2026, am as useFFIDAnnouncements } from './index-Cn8-3hgb.js';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ReactNode, ComponentType, FC } from 'react';
5
5
 
@@ -493,17 +493,37 @@ interface ContractWizardSubscriptionOptions {
493
493
 
494
494
  /** Redirect and URL generation - redirectToLogin / redirectToAuthorize / redirectToLogout / getLoginUrl / getSignupUrl / getLogoutUrl */
495
495
 
496
+ /**
497
+ * `screen_hint=signup` query value for `/oauth/authorize` (#2908 / #2911).
498
+ * Forwards to Supabase Auth signup screen; only the `'signup'` value is
499
+ * propagated (no-op when `'login'` or omitted).
500
+ */
501
+ declare const SCREEN_HINT_SIGNUP: "signup";
496
502
  /** Options for redirectToAuthorize */
497
503
  interface RedirectToAuthorizeOptions {
498
504
  /** Target organization ID — triggers org-scoped OAuth re-authorization */
499
505
  organizationId?: string;
506
+ /**
507
+ * Initial Supabase Auth screen hint (#2908 / #2911).
508
+ *
509
+ * - `'signup'`: forwards `?screen_hint=signup` so the FFID OAuth flow lands
510
+ * on the signup screen (used by external services that want to deep-link
511
+ * new users into the signup CTA).
512
+ * - `'login'` / `undefined`: no `screen_hint` param is added — the default
513
+ * login screen is shown.
514
+ *
515
+ * In cookie mode, `'signup'` redirects to the FFID `/signup` page instead
516
+ * of `/login` so the SDK contract (signup-screen intent) stays consistent
517
+ * regardless of `authMode`.
518
+ */
519
+ screenHint?: typeof SCREEN_HINT_SIGNUP | 'login';
500
520
  }
501
521
 
502
522
  /** Creates an FFID API client instance */
503
523
  declare function createFFIDClient(config: FFIDConfig): {
504
524
  getSession: () => Promise<FFIDApiResponse<FFIDSessionResponse>>;
505
525
  signOut: () => Promise<FFIDApiResponse<void>>;
506
- redirectToLogin: () => Promise<FFIDRedirectResult>;
526
+ redirectToLogin: (options?: RedirectToAuthorizeOptions) => Promise<FFIDRedirectResult>;
507
527
  redirectToAuthorize: (options?: RedirectToAuthorizeOptions) => Promise<FFIDRedirectResult>;
508
528
  redirectToLogout: (postLogoutRedirectUri?: string) => FFIDRedirectResult;
509
529
  getLoginUrl: (redirectUrl?: string) => string;
@@ -679,8 +699,17 @@ interface UseFFIDReturn {
679
699
  isAuthenticated: boolean;
680
700
  /** Any authentication error that occurred */
681
701
  error: FFIDError | null;
682
- /** Redirect to login page */
683
- login: () => void;
702
+ /**
703
+ * Redirect to login page.
704
+ *
705
+ * @param options.screenHint `'signup'` to deep-link into the signup screen
706
+ * (forwards `screen_hint=signup` in token mode / redirects to `/signup`
707
+ * in cookie mode). `'login'` and `undefined` use the default login flow.
708
+ * See `RedirectToAuthorizeOptions` (#2908 / #2911).
709
+ */
710
+ login: (options?: {
711
+ screenHint?: 'signup' | 'login';
712
+ }) => void;
684
713
  /** Sign out */
685
714
  logout: () => Promise<void>;
686
715
  /**
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { useFFIDContext, useSubscription } from './chunk-XWI4BFKW.js';
2
- export { DEFAULT_API_BASE_URL, DEFAULT_OAUTH_SCOPES, FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDProvider, FFIDSDKError, FFIDSubscriptionBadge, FFIDUserMenu, FFID_ANNOUNCEMENTS_ERROR_CODES, FFID_INQUIRY_CATEGORIES, FFID_INQUIRY_CATEGORIES_SITE_2026, computeEffectiveStatusFromSession, createFFIDAnnouncementsClient, createFFIDClient, createTokenStore, generateCodeChallenge, generateCodeVerifier, isFFIDInquiryCategorySite2026, normalizeRedirectUri, retrieveCodeVerifier, storeCodeVerifier, useFFID, useFFIDAnnouncements, useSubscription, withSubscription } from './chunk-XWI4BFKW.js';
1
+ import { useFFIDContext, useSubscription } from './chunk-P35ULJLM.js';
2
+ export { DEFAULT_API_BASE_URL, DEFAULT_OAUTH_SCOPES, FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDProvider, FFIDSDKError, FFIDSubscriptionBadge, FFIDUserMenu, FFID_ANNOUNCEMENTS_ERROR_CODES, FFID_INQUIRY_CATEGORIES, FFID_INQUIRY_CATEGORIES_SITE_2026, computeEffectiveStatusFromSession, createFFIDAnnouncementsClient, createFFIDClient, createTokenStore, generateCodeChallenge, generateCodeVerifier, isFFIDInquiryCategorySite2026, normalizeRedirectUri, retrieveCodeVerifier, storeCodeVerifier, useFFID, useFFIDAnnouncements, useSubscription, withSubscription } from './chunk-P35ULJLM.js';
3
3
  import { useEffect, useRef } from 'react';
4
4
  import { jsx, Fragment } from 'react/jsx-runtime';
5
5
 
@@ -803,7 +803,7 @@ function createProfileMethods(deps) {
803
803
  }
804
804
 
805
805
  // src/client/version-check.ts
806
- var SDK_VERSION = "3.0.0";
806
+ var SDK_VERSION = "4.0.0";
807
807
  var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
808
808
  var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
809
809
  function sdkHeaders() {
@@ -1325,6 +1325,8 @@ function base64UrlEncode(buffer) {
1325
1325
  // src/client/redirect.ts
1326
1326
  var OAUTH_AUTHORIZE_ENDPOINT = "/api/v1/oauth/authorize";
1327
1327
  var AUTH_LOGOUT_ENDPOINT = "/api/v1/auth/logout";
1328
+ var SCREEN_HINT_SIGNUP = "signup";
1329
+ var SCREEN_HINT_PARAM = "screen_hint";
1328
1330
  var STATE_RANDOM_BYTES = 16;
1329
1331
  var HEX_BASE2 = 16;
1330
1332
  var REDIRECT_LOOP_KEY = "ffid_sdk_redirect_loop_history";
@@ -1492,6 +1494,9 @@ function createRedirectMethods(deps) {
1492
1494
  }
1493
1495
  params.set("organization_id", trimmedOrgId);
1494
1496
  }
1497
+ if (options?.screenHint === SCREEN_HINT_SIGNUP) {
1498
+ params.set(SCREEN_HINT_PARAM, SCREEN_HINT_SIGNUP);
1499
+ }
1495
1500
  const authorizeUrl = `${baseUrl}${OAUTH_AUTHORIZE_ENDPOINT}?${params.toString()}`;
1496
1501
  logger.debug("Redirecting to authorize:", authorizeUrl);
1497
1502
  recordRedirectAttempt(authorizeKey, now, logger);
@@ -1503,18 +1508,17 @@ function createRedirectMethods(deps) {
1503
1508
  }
1504
1509
  return { success: true };
1505
1510
  }
1506
- async function redirectToLogin() {
1511
+ async function redirectToLogin(options) {
1507
1512
  if (typeof window === "undefined") {
1508
1513
  logger.warn("SSR \u74B0\u5883\u3067\u306F\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3067\u304D\u307E\u305B\u3093");
1509
1514
  return { success: false, error: "SSR \u74B0\u5883\u3067\u306F\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3067\u304D\u307E\u305B\u3093" };
1510
1515
  }
1511
1516
  if (authMode === "token") {
1512
- return redirectToAuthorize();
1517
+ return redirectToAuthorize(options);
1513
1518
  }
1514
- const currentUrl = window.location.href;
1515
- const loginUrl = `${baseUrl}/login?redirect=${encodeURIComponent(currentUrl)}&service=${encodeURIComponent(serviceCode)}`;
1516
- logger.debug("Redirecting to login:", loginUrl);
1517
- window.location.href = loginUrl;
1519
+ const targetUrl = options?.screenHint === SCREEN_HINT_SIGNUP ? getSignupUrl() : getLoginUrl();
1520
+ logger.debug("Redirecting to auth page:", targetUrl);
1521
+ window.location.href = targetUrl;
1518
1522
  return { success: true };
1519
1523
  }
1520
1524
  function getLoginUrl(redirectUrl) {
@@ -1,5 +1,5 @@
1
- import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-B26jbUp5.cjs';
2
- export { f as FFIDCacheConfig, g as FFIDClient, h as FFIDConfig, i as FFIDOrganization, j as FFIDOtpSendResponse, k as FFIDOtpVerifyResponse, l as FFIDPasswordResetConfirmResponse, m as FFIDPasswordResetResponse, n as FFIDPasswordResetVerifyResponse, o as FFIDProfileCallOptions, p as FFIDResetSessionResponse, q as FFIDSubscription, r as FFIDUpdateUserProfileRequest, s as FFIDUser, t as FFIDUserProfile, T as TokenData, u as TokenStore, v as createFFIDClient, w as createTokenStore } from '../ffid-client-B26jbUp5.cjs';
1
+ import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-ZcJhRbD6.cjs';
2
+ export { f as FFIDCacheConfig, g as FFIDClient, h as FFIDConfig, i as FFIDOrganization, j as FFIDOtpSendResponse, k as FFIDOtpVerifyResponse, l as FFIDPasswordResetConfirmResponse, m as FFIDPasswordResetResponse, n as FFIDPasswordResetVerifyResponse, o as FFIDProfileCallOptions, p as FFIDResetSessionResponse, q as FFIDSubscription, r as FFIDUpdateUserProfileRequest, s as FFIDUser, t as FFIDUserProfile, T as TokenData, u as TokenStore, v as createFFIDClient, w as createTokenStore } from '../ffid-client-ZcJhRbD6.cjs';
3
3
  export { D as DEFAULT_API_BASE_URL, a as DEFAULT_OAUTH_SCOPES } from '../constants-D61jqRIO.cjs';
4
4
 
5
5
  /** Token verification - verifyAccessToken() implementation */
@@ -1,5 +1,5 @@
1
- import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-B26jbUp5.js';
2
- export { f as FFIDCacheConfig, g as FFIDClient, h as FFIDConfig, i as FFIDOrganization, j as FFIDOtpSendResponse, k as FFIDOtpVerifyResponse, l as FFIDPasswordResetConfirmResponse, m as FFIDPasswordResetResponse, n as FFIDPasswordResetVerifyResponse, o as FFIDProfileCallOptions, p as FFIDResetSessionResponse, q as FFIDSubscription, r as FFIDUpdateUserProfileRequest, s as FFIDUser, t as FFIDUserProfile, T as TokenData, u as TokenStore, v as createFFIDClient, w as createTokenStore } from '../ffid-client-B26jbUp5.js';
1
+ import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo } from '../ffid-client-ZcJhRbD6.js';
2
+ export { f as FFIDCacheConfig, g as FFIDClient, h as FFIDConfig, i as FFIDOrganization, j as FFIDOtpSendResponse, k as FFIDOtpVerifyResponse, l as FFIDPasswordResetConfirmResponse, m as FFIDPasswordResetResponse, n as FFIDPasswordResetVerifyResponse, o as FFIDProfileCallOptions, p as FFIDResetSessionResponse, q as FFIDSubscription, r as FFIDUpdateUserProfileRequest, s as FFIDUser, t as FFIDUserProfile, T as TokenData, u as TokenStore, v as createFFIDClient, w as createTokenStore } from '../ffid-client-ZcJhRbD6.js';
3
3
  export { D as DEFAULT_API_BASE_URL, a as DEFAULT_OAUTH_SCOPES } from '../constants-D61jqRIO.js';
4
4
 
5
5
  /** Token verification - verifyAccessToken() implementation */
@@ -802,7 +802,7 @@ function createProfileMethods(deps) {
802
802
  }
803
803
 
804
804
  // src/client/version-check.ts
805
- var SDK_VERSION = "3.0.0";
805
+ var SDK_VERSION = "4.0.0";
806
806
  var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
807
807
  var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
808
808
  function sdkHeaders() {
@@ -1324,6 +1324,8 @@ function base64UrlEncode(buffer) {
1324
1324
  // src/client/redirect.ts
1325
1325
  var OAUTH_AUTHORIZE_ENDPOINT = "/api/v1/oauth/authorize";
1326
1326
  var AUTH_LOGOUT_ENDPOINT = "/api/v1/auth/logout";
1327
+ var SCREEN_HINT_SIGNUP = "signup";
1328
+ var SCREEN_HINT_PARAM = "screen_hint";
1327
1329
  var STATE_RANDOM_BYTES = 16;
1328
1330
  var HEX_BASE2 = 16;
1329
1331
  var REDIRECT_LOOP_KEY = "ffid_sdk_redirect_loop_history";
@@ -1491,6 +1493,9 @@ function createRedirectMethods(deps) {
1491
1493
  }
1492
1494
  params.set("organization_id", trimmedOrgId);
1493
1495
  }
1496
+ if (options?.screenHint === SCREEN_HINT_SIGNUP) {
1497
+ params.set(SCREEN_HINT_PARAM, SCREEN_HINT_SIGNUP);
1498
+ }
1494
1499
  const authorizeUrl = `${baseUrl}${OAUTH_AUTHORIZE_ENDPOINT}?${params.toString()}`;
1495
1500
  logger.debug("Redirecting to authorize:", authorizeUrl);
1496
1501
  recordRedirectAttempt(authorizeKey, now, logger);
@@ -1502,18 +1507,17 @@ function createRedirectMethods(deps) {
1502
1507
  }
1503
1508
  return { success: true };
1504
1509
  }
1505
- async function redirectToLogin() {
1510
+ async function redirectToLogin(options) {
1506
1511
  if (typeof window === "undefined") {
1507
1512
  logger.warn("SSR \u74B0\u5883\u3067\u306F\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3067\u304D\u307E\u305B\u3093");
1508
1513
  return { success: false, error: "SSR \u74B0\u5883\u3067\u306F\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3067\u304D\u307E\u305B\u3093" };
1509
1514
  }
1510
1515
  if (authMode === "token") {
1511
- return redirectToAuthorize();
1516
+ return redirectToAuthorize(options);
1512
1517
  }
1513
- const currentUrl = window.location.href;
1514
- const loginUrl = `${baseUrl}/login?redirect=${encodeURIComponent(currentUrl)}&service=${encodeURIComponent(serviceCode)}`;
1515
- logger.debug("Redirecting to login:", loginUrl);
1516
- window.location.href = loginUrl;
1518
+ const targetUrl = options?.screenHint === SCREEN_HINT_SIGNUP ? getSignupUrl() : getLoginUrl();
1519
+ logger.debug("Redirecting to auth page:", targetUrl);
1520
+ window.location.href = targetUrl;
1517
1521
  return { success: true };
1518
1522
  }
1519
1523
  function getLoginUrl(redirectUrl) {
@@ -1,4 +1,4 @@
1
- import { g as FFIDClient, e as FFIDOAuthUserInfo } from '../../ffid-client-B26jbUp5.cjs';
1
+ import { g as FFIDClient, e as FFIDOAuthUserInfo } from '../../ffid-client-ZcJhRbD6.cjs';
2
2
 
3
3
  /**
4
4
  * FFID SDK - Test mode client (E2E / integration test bypass)
@@ -1,4 +1,4 @@
1
- import { g as FFIDClient, e as FFIDOAuthUserInfo } from '../../ffid-client-B26jbUp5.js';
1
+ import { g as FFIDClient, e as FFIDOAuthUserInfo } from '../../ffid-client-ZcJhRbD6.js';
2
2
 
3
3
  /**
4
4
  * FFID SDK - Test mode client (E2E / integration test bypass)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feelflow/ffid-sdk",
3
- "version": "3.0.0",
3
+ "version": "4.0.0",
4
4
  "description": "FeelFlow ID Platform SDK for React/Next.js applications",
5
5
  "keywords": [
6
6
  "feelflow",