@oxy.so/services 1.2.0 → 2.1.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.
Files changed (67) hide show
  1. package/README.md +11 -1
  2. package/lib/commonjs/ui/components/BenefitList.js +93 -0
  3. package/lib/commonjs/ui/components/BenefitList.js.map +1 -0
  4. package/lib/commonjs/ui/components/FollowTargetButton.js +1 -1
  5. package/lib/commonjs/ui/components/FollowTargetButton.js.map +1 -1
  6. package/lib/commonjs/ui/components/OxySignInButton.js +36 -35
  7. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  8. package/lib/commonjs/ui/context/OxyContext.js +1 -17
  9. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  10. package/lib/commonjs/ui/context/passkeyFlow.js +2 -28
  11. package/lib/commonjs/ui/context/passkeyFlow.js.map +1 -1
  12. package/lib/commonjs/ui/screens/AccountVerificationScreen.js +10 -10
  13. package/lib/commonjs/ui/screens/AccountVerificationScreen.js.map +1 -1
  14. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js +6 -6
  15. package/lib/commonjs/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
  16. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js +5 -5
  17. package/lib/commonjs/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  18. package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js +13 -13
  19. package/lib/commonjs/ui/screens/trust/TrustAboutScreen.js.map +1 -1
  20. package/lib/module/ui/components/BenefitList.js +89 -0
  21. package/lib/module/ui/components/BenefitList.js.map +1 -0
  22. package/lib/module/ui/components/FollowTargetButton.js +1 -1
  23. package/lib/module/ui/components/FollowTargetButton.js.map +1 -1
  24. package/lib/module/ui/components/OxySignInButton.js +36 -35
  25. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  26. package/lib/module/ui/context/OxyContext.js +2 -18
  27. package/lib/module/ui/context/OxyContext.js.map +1 -1
  28. package/lib/module/ui/context/passkeyFlow.js +2 -27
  29. package/lib/module/ui/context/passkeyFlow.js.map +1 -1
  30. package/lib/module/ui/screens/AccountVerificationScreen.js +6 -6
  31. package/lib/module/ui/screens/AccountVerificationScreen.js.map +1 -1
  32. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js +6 -6
  33. package/lib/module/ui/screens/LearnMoreUsernamesScreen.js.map +1 -1
  34. package/lib/module/ui/screens/PremiumSubscriptionScreen.js +1 -1
  35. package/lib/module/ui/screens/PremiumSubscriptionScreen.js.map +1 -1
  36. package/lib/module/ui/screens/trust/TrustAboutScreen.js +7 -7
  37. package/lib/module/ui/screens/trust/TrustAboutScreen.js.map +1 -1
  38. package/lib/typescript/commonjs/ui/components/BenefitList.d.ts +25 -0
  39. package/lib/typescript/commonjs/ui/components/BenefitList.d.ts.map +1 -0
  40. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts +31 -12
  41. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  42. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  43. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +0 -8
  44. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
  45. package/lib/typescript/commonjs/ui/context/passkeyFlow.d.ts +2 -21
  46. package/lib/typescript/commonjs/ui/context/passkeyFlow.d.ts.map +1 -1
  47. package/lib/typescript/module/ui/components/BenefitList.d.ts +25 -0
  48. package/lib/typescript/module/ui/components/BenefitList.d.ts.map +1 -0
  49. package/lib/typescript/module/ui/components/OxySignInButton.d.ts +31 -12
  50. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  51. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  52. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +0 -8
  53. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
  54. package/lib/typescript/module/ui/context/passkeyFlow.d.ts +2 -21
  55. package/lib/typescript/module/ui/context/passkeyFlow.d.ts.map +1 -1
  56. package/package.json +4 -4
  57. package/src/ui/components/BenefitList.tsx +111 -0
  58. package/src/ui/components/FollowTargetButton.tsx +1 -1
  59. package/src/ui/components/OxySignInButton.tsx +73 -41
  60. package/src/ui/context/OxyContext.tsx +1 -19
  61. package/src/ui/context/__tests__/passkeyFlow.test.ts +2 -65
  62. package/src/ui/context/oxyContextTypes.ts +0 -6
  63. package/src/ui/context/passkeyFlow.ts +2 -39
  64. package/src/ui/screens/AccountVerificationScreen.tsx +6 -6
  65. package/src/ui/screens/LearnMoreUsernamesScreen.tsx +6 -6
  66. package/src/ui/screens/PremiumSubscriptionScreen.tsx +1 -1
  67. package/src/ui/screens/trust/TrustAboutScreen.tsx +7 -7
@@ -4,11 +4,11 @@
4
4
  * Extracted from `OxyContext` so the fixed `options → ceremony → verify → commit`
5
5
  * ordering is unit-testable with injected deps — the exact pattern
6
6
  * `commitSessionFlow.ts` (`commitDeviceSetAndResolve`) uses. The context methods
7
- * (`signInWithPasskey` / `registerWithPasskey` / `addPasskey`) are thin wrappers
7
+ * (`signInWithPasskey` / `addPasskey`) are thin wrappers
8
8
  * that supply the real deps: the core `webauthn*` methods, the platform ceremony
9
9
  * client (`webauthn/passkeyClient`), and the internal `commitSession` funnel.
10
10
  *
11
- * All three GATE on `isSupported()` first (the platform client returns `false`
11
+ * Both GATE on `isSupported()` first (the platform client returns `false`
12
12
  * off the web) so an unsupported surface fails loudly before touching a ceremony.
13
13
  */
14
14
  import type { LoginResult } from '@oxy.so/contracts';
@@ -56,25 +56,6 @@ export interface RunPasskeyLoginDeps {
56
56
  * resolves to a completed session.
57
57
  */
58
58
  export declare function runPasskeyLogin(deps: RunPasskeyLoginDeps): Promise<void>;
59
- /** Injected dependencies for {@link runPasskeyRegister}. */
60
- export interface RunPasskeyRegisterDeps {
61
- isSupported: () => boolean;
62
- getRegisterOptions: (username: string) => Promise<unknown>;
63
- runCeremony: (optionsJSON: unknown) => Promise<unknown>;
64
- registerVerify: (response: unknown, envelope: {
65
- username: string;
66
- deviceName?: string;
67
- }) => Promise<PasskeyRegisterVerifyResult>;
68
- commit: (input: CommitInput) => Promise<void>;
69
- username: string;
70
- deviceName?: string;
71
- }
72
- /**
73
- * Passkey SIGNUP: create a brand-new account whose first auth method is a
74
- * passkey. The verify signup branch mints a session (a {@link LoginSessionResult}
75
- * carrying `sessionId`), which is committed exactly like a password signup.
76
- */
77
- export declare function runPasskeyRegister(deps: RunPasskeyRegisterDeps): Promise<void>;
78
59
  /** Injected dependencies for {@link runPasskeyAdd}. */
79
60
  export interface RunPasskeyAddDeps {
80
61
  isSupported: () => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"passkeyFlow.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/passkeyFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC;AAE3F,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,gFACuC,CAAC;AAehF,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,EAAE,CACX,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7E,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E;AAED,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,cAAc,EAAE,CACd,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAChD,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpF;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,cAAc,EAAE,CACd,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAC9B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW1E"}
1
+ {"version":3,"file":"passkeyFlow.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/passkeyFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC;AAE3F,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,gFACuC,CAAC;AAehF,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,EAAE,CACX,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7E,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,cAAc,EAAE,CACd,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAC9B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW1E"}
@@ -0,0 +1,25 @@
1
+ import type React from 'react';
2
+ import { type StyleProp, type TextStyle, type ViewStyle } from 'react-native';
3
+ export interface BenefitRowProps {
4
+ /** Leading icon element, rendered inside a rounded tertiary-fill square. */
5
+ icon: React.ReactNode;
6
+ /** Caption text. Provide either `label` or `children`. */
7
+ label?: string;
8
+ /** Caption content as children (alternative to `label`). */
9
+ children?: React.ReactNode;
10
+ /** Accessibility label for the row (defaults to string content). */
11
+ accessibilityLabel?: string;
12
+ className?: string;
13
+ style?: StyleProp<ViewStyle>;
14
+ textStyle?: StyleProp<TextStyle>;
15
+ }
16
+ export declare const BenefitRow: React.FC<BenefitRowProps>;
17
+ export interface BenefitListProps {
18
+ /** `BenefitRow`s (or any nodes) stacked with consistent spacing. */
19
+ children: React.ReactNode;
20
+ accessibilityLabel?: string;
21
+ className?: string;
22
+ style?: StyleProp<ViewStyle>;
23
+ }
24
+ export declare const BenefitList: React.FC<BenefitListProps>;
25
+ //# sourceMappingURL=BenefitList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BenefitList.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/BenefitList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAQ,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAkBpF,MAAM,WAAW,eAAe;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAkDhD,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC7B,oEAAoE;IACpE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAiBlD,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type React from 'react';
2
2
  import { type ViewStyle, type TextStyle, type StyleProp } from 'react-native';
3
+ import { type SocialButtonAction, type SocialButtonAppearance, type SocialButtonSize } from '@oxy.so/bloom/social-button';
3
4
  /**
4
5
  * The OAuth handshake surfaced to a NATIVE third-party RP via
5
6
  * {@link OxySignInButtonProps.onOAuthResult} so it can finish the code exchange
@@ -14,12 +15,33 @@ export interface OxyOAuthResult {
14
15
  /** The PKCE `code_verifier` to replay on the token exchange. */
15
16
  codeVerifier: string;
16
17
  }
18
+ /** The label's verb: "Sign in with Oxy", "Continue with Oxy" or "Sign up with Oxy". */
19
+ export type OxySignInButtonAction = SocialButtonAction;
17
20
  export interface OxySignInButtonProps {
18
21
  /**
19
- * Controls the appearance of the button
22
+ * Shorthand for {@link OxySignInButtonProps.appearance}: `contained` is the
23
+ * filled button in the theme accent (`colorful`); `default` and `outline`
24
+ * are the outlined button with the Oxy mark (`white`).
20
25
  * @default 'default'
21
26
  */
22
27
  variant?: 'default' | 'outline' | 'contained';
28
+ /**
29
+ * Bloom `SocialButton` appearance — `colorful`, `white` or `black`. Wins
30
+ * over `variant` when both are given.
31
+ */
32
+ appearance?: SocialButtonAppearance;
33
+ /**
34
+ * The label's verb, localized: `signIn` — "Sign in with Oxy", `continue` —
35
+ * "Continue with Oxy", `signUp` — "Sign up with Oxy".
36
+ * @default 'signIn'
37
+ */
38
+ action?: OxySignInButtonAction;
39
+ /** `medium` (36 tall, 300 wide) or `small` (32 × 250). @default 'medium' */
40
+ size?: SocialButtonSize;
41
+ /** Fill the container's width instead of the fixed 300 / 250. */
42
+ fullWidth?: boolean;
43
+ /** A circular button showing only the Oxy mark; the label becomes its accessible name. */
44
+ iconOnly?: boolean;
23
45
  /**
24
46
  * Optional function to handle button press
25
47
  * If not provided, the button will use the showBottomSheet method from OxyContext
@@ -34,12 +56,10 @@ export interface OxySignInButtonProps {
34
56
  */
35
57
  textStyle?: StyleProp<TextStyle>;
36
58
  /**
37
- * Overrides the button label. When omitted the button renders the ONE
38
- * primary relying-party action, localized: `accountSwitcher.continueWithOxy`
39
- * ("Continue with Oxy" in English). "Sign in with Oxy" remains the name of
40
- * the MECHANISM — only this surface's label is "Continue with Oxy".
59
+ * Overrides the button label. When omitted the label is the localized
60
+ * {@link OxySignInButtonProps.action} phrase.
41
61
  *
42
- * @default localized `accountSwitcher.continueWithOxy`
62
+ * @default localized "Sign in with Oxy"
43
63
  */
44
64
  text?: string;
45
65
  /**
@@ -95,12 +115,11 @@ export interface OxySignInButtonProps {
95
115
  * // Basic usage
96
116
  * <OxySignInButton />
97
117
  *
98
- * // Custom styling
99
- * <OxySignInButton
100
- * variant="contained"
101
- * style={{ marginTop: 20 }}
102
- * text="Login with Oxy"
103
- * />
118
+ * // The filled button, full width
119
+ * <OxySignInButton variant="contained" fullWidth />
120
+ *
121
+ * // "Sign up with Oxy" on a registration screen
122
+ * <OxySignInButton action="signUp" />
104
123
  *
105
124
  * // Custom handler
106
125
  * <OxySignInButton onPress={() => {
@@ -1 +1 @@
1
- {"version":3,"file":"OxySignInButton.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/OxySignInButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAY,MAAM,cAAc,CAAC;AAqBxF;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC3B,sGAAsG;IACtG,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAE9C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAEjC;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;CACpD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAuR1D,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"OxySignInButton.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/OxySignInButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAY,MAAM,cAAc,CAAC;AAUxF,OAAO,EAGH,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACxB,MAAM,6BAA6B,CAAC;AASrC;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC3B,sGAAsG;IACtG,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,uFAAuF;AACvF,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AAEvD,MAAM,WAAW,oBAAoB;IACjC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAE9C;;;OAGG;IACH,UAAU,CAAC,EAAE,sBAAsB,CAAC;IAEpC;;;;OAIG;IACH,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAE/B,4EAA4E;IAC5E,IAAI,CAAC,EAAE,gBAAgB,CAAC;IAExB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAEjC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;CACpD;AAQD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAqR1D,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsF/B,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EAExB,MAAM,sBAAmB,CAAC;AAgB3B,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAmB,CAAC;AAIhG,KAAK,0BAA0B,GAAG,IAAI,CACpC,eAAe,EACb,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,iBAAiB,GACjB,aAAa,GACb,iBAAiB,GACjB,aAAa,GACb,cAAc,GACd,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,CACtB,CAAC;AAIF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA8uChE,CAAC;AAMF,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,0BAA0B;;CAMxC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,MAAM,QAAO,eAMzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAO,eAAe,GAAG,IAAqC,CAAC;AAE1F,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,QAAO,0BAMpC,CAAC"}
1
+ {"version":3,"file":"OxyContext.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/OxyContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsF/B,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EAExB,MAAM,sBAAmB,CAAC;AAgB3B,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,sBAAmB,CAAC;AAIhG,KAAK,0BAA0B,GAAG,IAAI,CACpC,eAAe,EACb,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,iBAAiB,GACjB,aAAa,GACb,iBAAiB,GACjB,aAAa,GACb,cAAc,GACd,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,CACtB,CAAC;AAIF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA4tChE,CAAC;AAMF,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,0BAA0B;;CAMxC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,MAAM,QAAO,eAMzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAO,eAAe,GAAG,IAAqC,CAAC;AAE1F,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,QAAO,0BAMpC,CAAC"}
@@ -84,14 +84,6 @@ export interface OxyContextState {
84
84
  deviceName?: string;
85
85
  deviceFingerprint?: string;
86
86
  }) => Promise<void>;
87
- /**
88
- * Create a brand-new account whose first authentication method is a passkey.
89
- * WEB-ONLY — throws on native or an unsupported browser.
90
- */
91
- registerWithPasskey: (params: {
92
- username: string;
93
- deviceName?: string;
94
- }) => Promise<void>;
95
87
  /**
96
88
  * Add a passkey to the already-signed-in account (bearer present). Does NOT
97
89
  * commit a new session; refreshes the linked auth-methods list on success.
@@ -1 +1 @@
1
- {"version":3,"file":"oxyContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/oxyContextTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oxyContextTypes.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/oxyContextTypes.ts"],"names":[],"mappings":"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"}
@@ -4,11 +4,11 @@
4
4
  * Extracted from `OxyContext` so the fixed `options → ceremony → verify → commit`
5
5
  * ordering is unit-testable with injected deps — the exact pattern
6
6
  * `commitSessionFlow.ts` (`commitDeviceSetAndResolve`) uses. The context methods
7
- * (`signInWithPasskey` / `registerWithPasskey` / `addPasskey`) are thin wrappers
7
+ * (`signInWithPasskey` / `addPasskey`) are thin wrappers
8
8
  * that supply the real deps: the core `webauthn*` methods, the platform ceremony
9
9
  * client (`webauthn/passkeyClient`), and the internal `commitSession` funnel.
10
10
  *
11
- * All three GATE on `isSupported()` first (the platform client returns `false`
11
+ * Both GATE on `isSupported()` first (the platform client returns `false`
12
12
  * off the web) so an unsupported surface fails loudly before touching a ceremony.
13
13
  */
14
14
  import type { LoginResult } from '@oxy.so/contracts';
@@ -56,25 +56,6 @@ export interface RunPasskeyLoginDeps {
56
56
  * resolves to a completed session.
57
57
  */
58
58
  export declare function runPasskeyLogin(deps: RunPasskeyLoginDeps): Promise<void>;
59
- /** Injected dependencies for {@link runPasskeyRegister}. */
60
- export interface RunPasskeyRegisterDeps {
61
- isSupported: () => boolean;
62
- getRegisterOptions: (username: string) => Promise<unknown>;
63
- runCeremony: (optionsJSON: unknown) => Promise<unknown>;
64
- registerVerify: (response: unknown, envelope: {
65
- username: string;
66
- deviceName?: string;
67
- }) => Promise<PasskeyRegisterVerifyResult>;
68
- commit: (input: CommitInput) => Promise<void>;
69
- username: string;
70
- deviceName?: string;
71
- }
72
- /**
73
- * Passkey SIGNUP: create a brand-new account whose first auth method is a
74
- * passkey. The verify signup branch mints a session (a {@link LoginSessionResult}
75
- * carrying `sessionId`), which is committed exactly like a password signup.
76
- */
77
- export declare function runPasskeyRegister(deps: RunPasskeyRegisterDeps): Promise<void>;
78
59
  /** Injected dependencies for {@link runPasskeyAdd}. */
79
60
  export interface RunPasskeyAddDeps {
80
61
  isSupported: () => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"passkeyFlow.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/passkeyFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAmB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC;AAE3F,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,gFACuC,CAAC;AAehF,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,EAAE,CACX,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7E,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E;AAED,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,cAAc,EAAE,CACd,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAChD,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpF;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,cAAc,EAAE,CACd,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAC9B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW1E"}
1
+ {"version":3,"file":"passkeyFlow.d.ts","sourceRoot":"","sources":["../../../../../src/ui/context/passkeyFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAmB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC;AAE3F,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,gFACuC,CAAC;AAehF,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,WAAW,EAAE,CACX,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7E,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,kBAAkB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,cAAc,EAAE,CACd,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAC9B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW1E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxy.so/services",
3
- "version": "1.2.0",
3
+ "version": "2.1.0",
4
4
  "description": "OxyHQ Expo/React Native SDK — UI components, screens, and native features",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -179,7 +179,7 @@
179
179
  "@types/jest": "^30.0.0",
180
180
  "@types/node": "^20.19.43",
181
181
  "@types/react": "*",
182
- "@oxy.so/bloom": "^1.0.7",
182
+ "@oxy.so/bloom": "^2.1.0",
183
183
  "copyfiles": "^2.4.1",
184
184
  "expo-constants": "~57.0.5",
185
185
  "expo-file-system": "~57.0.1",
@@ -212,10 +212,10 @@
212
212
  "typescript": "^5.9.2",
213
213
  "zustand": "^5.0.14"
214
214
  },
215
- "//@oxy.so/bloom": "RE-RAISE THIS FLOOR ON EVERY BREAKING BLOOM RELEASE, in the same commit as the root package.json catalog entry and the code that requires it. Bloom is now at or above 1.0.0, so the breaking position is the MAJOR and `^1.0.0` means `>=1.0.0 <2.0.0`: 1.x minors are admitted on semver's additive promise, and Bloom 2.0.0 is refused until someone raises this deliberately. The CAP is the part that is load-bearing. An earlier revision of this key recorded the opposite trade -- an uncapped `>=` floor, accepted so that intentionally-breaking Bloom 0.x minors would not be blocked -- and that trade is now closed by evidence rather than by preference: an unbounded range is exactly what let `bun install` pair this package with Bloom 1.0.0 and emit no warning at all, and 1.0.0 broke it four ways (a deleted provider, a renamed confirm option, a renamed Chip fill, and two REMOVED SUBPATHS that fail at bundle time, before any typecheck runs). A floor is a claim about what was measured; a cap is the claim that nothing beyond it was.",
215
+ "//@oxy.so/bloom": "RE-RAISE THIS FLOOR ON EVERY BREAKING BLOOM RELEASE, in the same commit as the root package.json catalog entry and the code that requires it. Bloom is now at or above 2.0.0, so the breaking position is the MAJOR and `^2.1.0` means `>=2.1.0 <3.0.0` (the floor is 2.1.0 because `OxySignInButton` renders `SocialButton brand=\"oxy\"`, which 2.1.0 added): 2.x minors are admitted on semver's additive promise, and Bloom 3.0.0 is refused until someone raises this deliberately. The floor was raised from `^1.0.0` for Bloom 2.0.0, which removed every hand-drawn icon (now Remix `Ri*` names) and the `benefit-list` and `profile-card` subpaths this package imported. The CAP is the part that is load-bearing. An earlier revision of this key recorded the opposite trade -- an uncapped `>=` floor, accepted so that intentionally-breaking Bloom 0.x minors would not be blocked -- and that trade is now closed by evidence rather than by preference: an unbounded range is exactly what let `bun install` pair this package with Bloom 1.0.0 and emit no warning at all, and 1.0.0 broke it four ways (a deleted provider, a renamed confirm option, a renamed Chip fill, and two REMOVED SUBPATHS that fail at bundle time, before any typecheck runs). A floor is a claim about what was measured; a cap is the claim that nothing beyond it was.",
216
216
  "peerDependencies": {
217
217
  "@expo/vector-icons": "^15.0.3",
218
- "@oxy.so/bloom": "^1.0.0",
218
+ "@oxy.so/bloom": "^2.1.0",
219
219
  "@oxy.so/core": "^1.0.1",
220
220
  "@react-native-async-storage/async-storage": "^2.0.0",
221
221
  "@react-native-community/netinfo": ">=11.4.1",
@@ -0,0 +1,111 @@
1
+ import type React from 'react';
2
+ import { View, type StyleProp, type TextStyle, type ViewStyle } from 'react-native';
3
+ import { Card } from '@oxy.so/bloom/card';
4
+ import { RADIUS, SPACING, TYPOGRAPHY } from '@oxy.so/bloom/design-tokens';
5
+ import { useTheme } from '@oxy.so/bloom/theme';
6
+ import { Text } from '@oxy.so/bloom/typography';
7
+
8
+ /**
9
+ * BenefitList / BenefitRow — a bordered card stacking "icon + caption" rows,
10
+ * used by the verification, trust and premium screens.
11
+ *
12
+ * Bloom 2.0 removed its `benefit-list` family with no replacement, so the SDK
13
+ * keeps this small local copy built from Bloom primitives (`Card`, `Text`,
14
+ * design tokens) with the same props its call sites already use.
15
+ */
16
+
17
+ /** Side of the rounded icon square. */
18
+ const ICON_SQUARE_SIZE = 36;
19
+
20
+ export interface BenefitRowProps {
21
+ /** Leading icon element, rendered inside a rounded tertiary-fill square. */
22
+ icon: React.ReactNode;
23
+ /** Caption text. Provide either `label` or `children`. */
24
+ label?: string;
25
+ /** Caption content as children (alternative to `label`). */
26
+ children?: React.ReactNode;
27
+ /** Accessibility label for the row (defaults to string content). */
28
+ accessibilityLabel?: string;
29
+ className?: string;
30
+ style?: StyleProp<ViewStyle>;
31
+ textStyle?: StyleProp<TextStyle>;
32
+ }
33
+
34
+ export const BenefitRow: React.FC<BenefitRowProps> = ({
35
+ icon,
36
+ label,
37
+ children,
38
+ accessibilityLabel,
39
+ className,
40
+ style,
41
+ textStyle,
42
+ }) => {
43
+ const { colors } = useTheme();
44
+ const content = children ?? label;
45
+ const a11y = accessibilityLabel ?? (typeof content === 'string' ? content : undefined);
46
+
47
+ return (
48
+ <View
49
+ className={className}
50
+ style={[{ flexDirection: 'row', alignItems: 'center', gap: SPACING['space-12'] }, style]}
51
+ accessibilityLabel={a11y}
52
+ {...(a11y ? { accessibilityRole: 'text' as const } : {})}
53
+ >
54
+ <View
55
+ style={{
56
+ width: ICON_SQUARE_SIZE,
57
+ height: ICON_SQUARE_SIZE,
58
+ borderRadius: RADIUS['radius-12'],
59
+ alignItems: 'center',
60
+ justifyContent: 'center',
61
+ backgroundColor: colors.backgroundTertiary,
62
+ }}
63
+ accessibilityElementsHidden
64
+ aria-hidden
65
+ >
66
+ {icon}
67
+ </View>
68
+ <Text
69
+ style={[
70
+ {
71
+ flex: 1,
72
+ fontSize: TYPOGRAPHY.caption.size,
73
+ lineHeight: TYPOGRAPHY.caption.lineHeight,
74
+ fontWeight: TYPOGRAPHY.caption.weight,
75
+ color: colors.textSecondary,
76
+ },
77
+ textStyle,
78
+ ]}
79
+ >
80
+ {content}
81
+ </Text>
82
+ </View>
83
+ );
84
+ };
85
+
86
+ export interface BenefitListProps {
87
+ /** `BenefitRow`s (or any nodes) stacked with consistent spacing. */
88
+ children: React.ReactNode;
89
+ accessibilityLabel?: string;
90
+ className?: string;
91
+ style?: StyleProp<ViewStyle>;
92
+ }
93
+
94
+ export const BenefitList: React.FC<BenefitListProps> = ({
95
+ children,
96
+ accessibilityLabel,
97
+ className,
98
+ style,
99
+ }) => (
100
+ <Card
101
+ variant="outlined"
102
+ radius="radius-20"
103
+ border="hairline"
104
+ elevation="s"
105
+ className={className}
106
+ style={[{ padding: SPACING['space-16'], gap: SPACING['space-16'], overflow: 'visible' }, style]}
107
+ accessibilityLabel={accessibilityLabel}
108
+ >
109
+ {children}
110
+ </Card>
111
+ );
@@ -36,7 +36,7 @@ import type { FollowApplicationMode, FollowStatus } from '@oxy.so/contracts';
36
36
  import type { StyleProp, ViewStyle } from 'react-native';
37
37
  import { View } from 'react-native';
38
38
  import { Button } from '@oxy.so/bloom/button';
39
- import { ChevronBottom_Stroke2_Corner0_Rounded as ChevronDown } from '@oxy.so/bloom/icons';
39
+ import { RiArrowDownSLine as ChevronDown } from '@oxy.so/bloom/icons';
40
40
  import {
41
41
  DropdownMenu,
42
42
  DropdownMenuContent,
@@ -10,12 +10,16 @@ import {
10
10
  } from '@oxy.so/core';
11
11
  import { useAuthStore } from '../stores/authStore';
12
12
  import { useShallow } from 'zustand/react/shallow';
13
- import { useTheme } from '@oxy.so/bloom/theme';
14
- import { Button, type ButtonVariant } from '@oxy.so/bloom/button';
13
+ import {
14
+ SocialButton,
15
+ socialButtonLabel,
16
+ type SocialButtonAction,
17
+ type SocialButtonAppearance,
18
+ type SocialButtonSize,
19
+ } from '@oxy.so/bloom/social-button';
15
20
  import { toast } from '@oxy.so/bloom/toast';
16
21
  import { useOxy } from '../context/OxyContext';
17
22
  import { useI18n } from '../hooks/useI18n';
18
- import { LogoIcon } from './logo/LogoIcon';
19
23
  import { subscribeToAccountDialog } from '../navigation/accountDialogManager';
20
24
  import { openAuthorizeUrlNative } from './oauthNavigation';
21
25
  import { closeOAuthPopup, openOAuthPopup } from '../oauth/oauthPopup';
@@ -36,13 +40,40 @@ export interface OxyOAuthResult {
36
40
  codeVerifier: string;
37
41
  }
38
42
 
43
+ /** The label's verb: "Sign in with Oxy", "Continue with Oxy" or "Sign up with Oxy". */
44
+ export type OxySignInButtonAction = SocialButtonAction;
45
+
39
46
  export interface OxySignInButtonProps {
40
47
  /**
41
- * Controls the appearance of the button
48
+ * Shorthand for {@link OxySignInButtonProps.appearance}: `contained` is the
49
+ * filled button in the theme accent (`colorful`); `default` and `outline`
50
+ * are the outlined button with the Oxy mark (`white`).
42
51
  * @default 'default'
43
52
  */
44
53
  variant?: 'default' | 'outline' | 'contained';
45
54
 
55
+ /**
56
+ * Bloom `SocialButton` appearance — `colorful`, `white` or `black`. Wins
57
+ * over `variant` when both are given.
58
+ */
59
+ appearance?: SocialButtonAppearance;
60
+
61
+ /**
62
+ * The label's verb, localized: `signIn` — "Sign in with Oxy", `continue` —
63
+ * "Continue with Oxy", `signUp` — "Sign up with Oxy".
64
+ * @default 'signIn'
65
+ */
66
+ action?: OxySignInButtonAction;
67
+
68
+ /** `medium` (36 tall, 300 wide) or `small` (32 × 250). @default 'medium' */
69
+ size?: SocialButtonSize;
70
+
71
+ /** Fill the container's width instead of the fixed 300 / 250. */
72
+ fullWidth?: boolean;
73
+
74
+ /** A circular button showing only the Oxy mark; the label becomes its accessible name. */
75
+ iconOnly?: boolean;
76
+
46
77
  /**
47
78
  * Optional function to handle button press
48
79
  * If not provided, the button will use the showBottomSheet method from OxyContext
@@ -60,12 +91,10 @@ export interface OxySignInButtonProps {
60
91
  textStyle?: StyleProp<TextStyle>;
61
92
 
62
93
  /**
63
- * Overrides the button label. When omitted the button renders the ONE
64
- * primary relying-party action, localized: `accountSwitcher.continueWithOxy`
65
- * ("Continue with Oxy" in English). "Sign in with Oxy" remains the name of
66
- * the MECHANISM — only this surface's label is "Continue with Oxy".
94
+ * Overrides the button label. When omitted the label is the localized
95
+ * {@link OxySignInButtonProps.action} phrase.
67
96
  *
68
- * @default localized `accountSwitcher.continueWithOxy`
97
+ * @default localized "Sign in with Oxy"
69
98
  */
70
99
  text?: string;
71
100
 
@@ -115,6 +144,12 @@ export interface OxySignInButtonProps {
115
144
  onOAuthResult?: (result: OxyOAuthResult) => void;
116
145
  }
117
146
 
147
+ const ACTION_KEYS: Record<OxySignInButtonAction, string> = {
148
+ signIn: 'accountSwitcher.signInWithOxy',
149
+ continue: 'accountSwitcher.continueWithOxy',
150
+ signUp: 'accountSwitcher.signUpWithOxy',
151
+ };
152
+
118
153
  /**
119
154
  * A pre-styled button component for signing in with Oxy identity
120
155
  *
@@ -126,12 +161,11 @@ export interface OxySignInButtonProps {
126
161
  * // Basic usage
127
162
  * <OxySignInButton />
128
163
  *
129
- * // Custom styling
130
- * <OxySignInButton
131
- * variant="contained"
132
- * style={{ marginTop: 20 }}
133
- * text="Login with Oxy"
134
- * />
164
+ * // The filled button, full width
165
+ * <OxySignInButton variant="contained" fullWidth />
166
+ *
167
+ * // "Sign up with Oxy" on a registration screen
168
+ * <OxySignInButton action="signUp" />
135
169
  *
136
170
  * // Custom handler
137
171
  * <OxySignInButton onPress={() => {
@@ -141,6 +175,11 @@ export interface OxySignInButtonProps {
141
175
  */
142
176
  export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
143
177
  variant = 'default',
178
+ appearance,
179
+ action = 'signIn',
180
+ size = 'medium',
181
+ fullWidth = false,
182
+ iconOnly = false,
144
183
  onPress,
145
184
  style,
146
185
  textStyle,
@@ -150,7 +189,6 @@ export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
150
189
  oauthRedirectUri,
151
190
  onOAuthResult,
152
191
  }) => {
153
- const theme = useTheme();
154
192
  const { t } = useI18n();
155
193
  const { openAccountDialog, oxyServices, clientId, webAuthMode, startWebOAuthSignIn } = useOxy();
156
194
  const { isAuthenticated, isLoading } = useAuthStore(
@@ -384,39 +422,33 @@ export const OxySignInButton: React.FC<OxySignInButtonProps> = ({
384
422
 
385
423
  const isButtonDisabled = disabled || isLoading || isModalOpen;
386
424
 
387
- // Map the public `variant` API onto Bloom's Button variants:
388
- // contained → primary (filled), outline → outline, default → secondary.
389
- const buttonVariant: ButtonVariant =
390
- variant === 'contained' ? 'primary' : variant === 'outline' ? 'outline' : 'secondary';
425
+ // `contained` is the filled button in the theme accent; `default` and
426
+ // `outline` are the outlined button carrying the Oxy mark.
427
+ const resolvedAppearance: SocialButtonAppearance =
428
+ appearance ?? (variant === 'contained' ? 'colorful' : 'white');
391
429
 
392
- // The Oxy mark reads white-on-primary for the filled (contained) button and
393
- // primary-on-transparent for the outline / default surfaces.
394
- const isContained = variant === 'contained';
395
- const logoColor = isContained ? '#ffffff' : theme.colors.primary;
396
- const logoLetterColor = isContained ? theme.colors.primary : '#ffffff';
397
-
398
- // The relying party surfaces exactly ONE primary action, and it reads
399
- // "Continue with Oxy" (issue #691). A caller-supplied `text` still wins.
400
- const label = text ?? t('accountSwitcher.continueWithOxy');
430
+ // A key missing from every dictionary comes back as the key itself; fall
431
+ // back to Bloom's English phrase rather than render a dotted path.
432
+ const actionKey = ACTION_KEYS[action];
433
+ const translated = t(actionKey);
434
+ const label = text ?? (translated === actionKey ? socialButtonLabel('Oxy', action) : translated);
401
435
 
402
436
  return (
403
- <Button
404
- variant={buttonVariant}
437
+ <SocialButton
438
+ brand="oxy"
439
+ action={action}
440
+ appearance={resolvedAppearance}
441
+ size={size}
442
+ fullWidth={fullWidth}
443
+ iconOnly={iconOnly}
405
444
  onPress={handlePress}
406
445
  disabled={isButtonDisabled}
407
446
  style={style}
408
- textStyle={[Platform.OS === 'web' ? { fontWeight: '600' } : null, textStyle]}
409
- icon={
410
- <LogoIcon
411
- height={20}
412
- color={logoColor}
413
- letterColor={logoLetterColor}
414
- style={{ marginRight: 10 }}
415
- />
416
- }
447
+ textStyle={textStyle}
448
+ accessibilityLabel={iconOnly ? label : undefined}
417
449
  >
418
450
  {isLoading || isModalOpen ? t('signin.status.signingIn') : label}
419
- </Button>
451
+ </SocialButton>
420
452
  );
421
453
  };
422
454