@passflow/react 0.9.0 → 0.10.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 (51) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/index.cjs.js +1 -1
  3. package/dist/index.cjs.js.map +1 -1
  4. package/dist/index.es.js +132 -122
  5. package/dist/index.es.js.map +1 -1
  6. package/dist/src/components/provider/index.d.ts +2 -1
  7. package/dist/src/components/provider/index.d.ts.map +1 -1
  8. package/dist/src/components/provider/passflow-provider.d.ts +39 -5
  9. package/dist/src/components/provider/passflow-provider.d.ts.map +1 -1
  10. package/dist/src/components/provider/upgrade-provider.d.ts +49 -0
  11. package/dist/src/components/provider/upgrade-provider.d.ts.map +1 -0
  12. package/dist/src/components/ui/button/index.d.ts +12 -1
  13. package/dist/src/components/ui/button/index.d.ts.map +1 -1
  14. package/dist/src/components/ui/index.d.ts +2 -0
  15. package/dist/src/components/ui/index.d.ts.map +1 -1
  16. package/dist/src/components/ui/login-screen/consent.d.ts +2 -0
  17. package/dist/src/components/ui/login-screen/consent.d.ts.map +1 -1
  18. package/dist/src/components/ui/spinner/index.d.ts +23 -0
  19. package/dist/src/components/ui/spinner/index.d.ts.map +1 -0
  20. package/dist/src/components/ui/upgrade-dialog/challenge.d.ts +12 -0
  21. package/dist/src/components/ui/upgrade-dialog/challenge.d.ts.map +1 -0
  22. package/dist/src/components/ui/upgrade-dialog/factor-list.d.ts +20 -0
  23. package/dist/src/components/ui/upgrade-dialog/factor-list.d.ts.map +1 -0
  24. package/dist/src/components/ui/upgrade-dialog/index.d.ts +8 -0
  25. package/dist/src/components/ui/upgrade-dialog/index.d.ts.map +1 -0
  26. package/dist/src/components/ui/upgrade-dialog/state-mapping.d.ts +119 -0
  27. package/dist/src/components/ui/upgrade-dialog/state-mapping.d.ts.map +1 -0
  28. package/dist/src/components/ui/upgrade-dialog/status.d.ts +27 -0
  29. package/dist/src/components/ui/upgrade-dialog/status.d.ts.map +1 -0
  30. package/dist/src/components/ui/upgrade-dialog/types.d.ts +188 -0
  31. package/dist/src/components/ui/upgrade-dialog/types.d.ts.map +1 -0
  32. package/dist/src/components/ui/upgrade-dialog/upgrade-dialog.d.ts +13 -0
  33. package/dist/src/components/ui/upgrade-dialog/upgrade-dialog.d.ts.map +1 -0
  34. package/dist/src/context/index.d.ts +1 -0
  35. package/dist/src/context/index.d.ts.map +1 -1
  36. package/dist/src/context/upgrade-context.d.ts +85 -0
  37. package/dist/src/context/upgrade-context.d.ts.map +1 -0
  38. package/dist/src/hooks/index.d.ts +1 -0
  39. package/dist/src/hooks/index.d.ts.map +1 -1
  40. package/dist/src/hooks/use-upgrade.d.ts +43 -0
  41. package/dist/src/hooks/use-upgrade.d.ts.map +1 -0
  42. package/dist/src/index.d.ts +4 -1
  43. package/dist/src/index.d.ts.map +1 -1
  44. package/dist/src/utils/index.d.ts +1 -0
  45. package/dist/src/utils/index.d.ts.map +1 -1
  46. package/dist/src/utils/upgrade-auth.d.ts +38 -0
  47. package/dist/src/utils/upgrade-auth.d.ts.map +1 -0
  48. package/dist/style.css +1 -1
  49. package/package.json +4 -4
  50. package/dist/src/components/flow/upgrade-required-placeholder.d.ts +0 -21
  51. package/dist/src/components/flow/upgrade-required-placeholder.d.ts.map +0 -1
@@ -1,3 +1,4 @@
1
1
  export { PassflowProvider, OIDCExchangeContext } from './passflow-provider';
2
- export type { OIDCExchangeContextValue } from './passflow-provider';
2
+ export type { OIDCExchangeContextValue, PassflowUpgradeOptions } from './passflow-provider';
3
+ export { UpgradeProvider, type UpgradeProviderProps } from './upgrade-provider';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,YAAY,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,YAAY,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,10 +1,39 @@
1
+ import { UpgradeProviderProps } from './upgrade-provider';
1
2
  import { NavigateFunction, RouterType } from '../../context';
2
3
  import { PassflowConfig } from '@passflow/core';
3
4
  import { default as React, FC, ReactNode } from 'react';
5
+ /**
6
+ * The assurance-upgrade options a consumer may set on `PassflowProvider`.
7
+ *
8
+ * `children`, `enabled` and `backend` are owned by `PassflowProvider` itself:
9
+ * `backend` is a top-level prop (§13.5 — "where your API is" is the headline
10
+ * act, not a nested detail) and `enabled` is derived from `upgrade`/`backend`
11
+ * below, so there is exactly one source for each.
12
+ */
13
+ export type PassflowUpgradeOptions = Omit<UpgradeProviderProps, 'children' | 'enabled' | 'backend'>;
4
14
  type PassflowProviderProps = PassflowConfig & {
5
15
  children: ReactNode;
6
16
  navigate?: NavigateFunction;
7
17
  router?: RouterType;
18
+ /**
19
+ * Where the customer's own API is — domain 2 of §13.5's two-domain
20
+ * interception model. Nothing outside this and Passflow's own API is ever
21
+ * observed, and there is no allow-all opt-in. `string | string[]`, an origin
22
+ * or a same-origin path prefix (`'/api'`).
23
+ */
24
+ backend?: string | string[];
25
+ /**
26
+ * Automatic assurance upgrade (step-up). `undefined` ⇒ **off**, so no
27
+ * existing consumer changes behaviour on upgrade. `true` ⇒ on with
28
+ * defaults; an object ⇒ on with those options; `false` ⇒ off even when
29
+ * `backend` is declared.
30
+ *
31
+ * Declaring `backend` also turns it on: naming where your API is has no
32
+ * other meaning, and §13.5's acceptance configuration is `backend` plus one
33
+ * attached client. The global `window.fetch` patch is a separate, explicit
34
+ * act (`upgrade={{ interceptFetch: true }}`) and stays off by default.
35
+ */
36
+ upgrade?: boolean | PassflowUpgradeOptions;
8
37
  };
9
38
  /**
10
39
  * Read `parent_challenge_id` from the current URL's query string.
@@ -71,17 +100,22 @@ type ParentChallengeMeta = {
71
100
  * - 200 { redirect_url } → the interceptor's fetch wrapper follows
72
101
  * the redirect (sole owner of redirect_url navigation; this hook
73
102
  * must never navigate on OK responses — see the res.ok branch).
74
- * - 403 { error: "upgrade_required", ... } → SDK falls through to
75
- * `setUpgradeRequired(true)` so the consumer renders the
76
- * upgrade-required placeholder + login form. Code path is
77
- * UNREACHABLE today (server's EvaluatePolicy is a no-op
78
- * scaffold); activates when Subtask E lands.
103
+ * - 403 { error: "upgrade_required", ... } → falls through to the
104
+ * login form. Factor elevation on an existing session is
105
+ * `UpgradeProvider`'s flow, not this probe's.
79
106
  * - 401 → clear stale tokens, fall through to login form.
80
107
  *
81
108
  * On any decision-point that ends with "render login form," the
82
109
  * SDK consumer's existing PassflowFlow render path picks up
83
110
  * naturally.
84
111
  */
112
+ /**
113
+ * `'upgrade_required'` is vestigial and kept deliberately (§8.4): it is
114
+ * unreachable today — the 403 branch below sets `'fallback_to_login'` — and
115
+ * removing a member from an exported union would be a type-level breaking
116
+ * change for anyone reading `OIDCExchangeContextValue`. Assurance elevation is
117
+ * now `UpgradeProvider`'s job, not a placeholder's.
118
+ */
85
119
  type ExchangeState = 'idle' | 'exchanging' | 'upgrade_required' | 'fallback_to_login';
86
120
  /**
87
121
  * Context surface exposed to children so the SDK's own components
@@ -1 +1 @@
1
- {"version":3,"file":"passflow-provider.d.ts","sourceRoot":"","sources":["../../../../src/components/provider/passflow-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EAGrB,KAAK,UAAU,EAIhB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,SAAS,EAAiE,MAAM,OAAO,CAAC;AACtH,OAAO,oBAAoB,CAAC;AAE5B,KAAK,qBAAqB,GAAG,cAAc,GAAG;IAC5C,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,CAAC;AAsBF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,QAAO,MAAM,GAAG,SAQxD,CAAC;AAiCF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,uBAAuB,QAAO,OAA+B,CAAC;AAiJ3E;;;GAGG;AACH,KAAK,mBAAmB,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IAKvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,KAAK,aAAa,GAAG,MAAM,GAAG,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AA+NtF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,yCAE9B,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAsItD,CAAC"}
1
+ {"version":3,"file":"passflow-provider.d.ts","sourceRoot":"","sources":["../../../../src/components/provider/passflow-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACpG,OAAO,EAEL,KAAK,gBAAgB,EAGrB,KAAK,UAAU,EAIhB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAiC,KAAK,cAAc,EAA2B,MAAM,gBAAgB,CAAC;AAC7G,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,SAAS,EAAiE,MAAM,OAAO,CAAC;AACtH,OAAO,oBAAoB,CAAC;AAE5B;;;;;;;GAOG;AACH,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;AAEpG,KAAK,qBAAqB,GAAG,cAAc,GAAG;IAC5C,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAC;CAC5C,CAAC;AAsBF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,QAAO,MAAM,GAAG,SAQxD,CAAC;AAiCF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,uBAAuB,QAAO,OAA+B,CAAC;AAqK3E;;;GAGG;AACH,KAAK,mBAAmB,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IAKvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH;;;;;;GAMG;AACH,KAAK,aAAa,GAAG,MAAM,GAAG,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAwMtF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,yCAE9B,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA+ItD,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { UpgradeDialogLabels, UpgradeDialogProps } from '../ui/upgrade-dialog';
2
+ import { ReplayPolicy, UpgradeDiagnosticSink, UpgradeFactor } from '@passflow/core';
3
+ import { FC, ReactElement, ReactNode } from 'react';
4
+ export type UpgradeProviderProps = {
5
+ children?: ReactNode;
6
+ /** Default `true`. `false` installs nothing and leaves the hook inert. */
7
+ enabled?: boolean;
8
+ /**
9
+ * Where the customer's own API is — domain 2 (§13.5). Nothing outside this
10
+ * and Passflow's own API is ever observed, and there is no allow-all opt-in.
11
+ */
12
+ backend?: string | string[];
13
+ /**
14
+ * Patches `globalThis.fetch` through the core's registry. **Off by default**,
15
+ * and a different decision from enabling the UI: one prop for both would
16
+ * bundle "show me the verification prompt" with "patch the global", and only
17
+ * the second has the blast radius.
18
+ */
19
+ interceptFetch?: boolean;
20
+ /** Requires the RFC 9470 channel. The body is then never read for a challenge. */
21
+ requireChallengeChannel?: 'header';
22
+ /** NARROWING ONLY: `false` excludes an admitted URL; `true` cannot widen. */
23
+ shouldIntercept?: (url: string) => boolean;
24
+ replay?: ReplayPolicy;
25
+ /** The fetch surface's only cancellation option. Default `'resolve-original'`. */
26
+ onCancel?: 'resolve-original' | 'reject';
27
+ onUpgradeDiagnostic?: UpgradeDiagnosticSink;
28
+ factors?: readonly UpgradeFactor[];
29
+ maxAttempts?: number;
30
+ relyingPartyId?: string;
31
+ /** Per-factor wording for the dialog. */
32
+ labels?: UpgradeDialogLabels;
33
+ title?: string;
34
+ /**
35
+ * FR5's render-prop override. It receives the **exact** props the built-in
36
+ * dialog would render — a typed, constrained override with no `className` or
37
+ * `style` leak.
38
+ *
39
+ * It carries the same obligations as the built-in dialog, the selection
40
+ * signal included: the `challenge` state's `onSelectFactor` must be called
41
+ * when the user picks a factor, because that is the only thing that reports
42
+ * §13.2's selection boundary to the controller. An override that never calls
43
+ * it leaves the controller `collecting` for the whole ceremony, so a late
44
+ * join re-ranks mid-entry — degraded, not silent.
45
+ */
46
+ renderDialog?: (props: UpgradeDialogProps) => ReactElement | null;
47
+ };
48
+ export declare const UpgradeProvider: FC<UpgradeProviderProps>;
49
+ //# sourceMappingURL=upgrade-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-provider.d.ts","sourceRoot":"","sources":["../../../../src/components/provider/upgrade-provider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAwB,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAYpH,OAAO,EAIL,KAAK,YAAY,EAEjB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAQnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAqD,MAAM,OAAO,CAAC;AAEtH,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,uBAAuB,CAAC,EAAE,QAAQ,CAAC;IACnC,6EAA6E;IAC7E,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,kBAAkB,GAAG,QAAQ,CAAC;IACzC,mBAAmB,CAAC,EAAE,qBAAqB,CAAC;IAC5C,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,YAAY,GAAG,IAAI,CAAC;CACnE,CAAC;AAkHF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAqWpD,CAAC"}
@@ -7,12 +7,23 @@ type RippleProps = {
7
7
  export declare const Ripple: FC<RippleProps>;
8
8
  type TButton = PropsWithChildren & ButtonHTMLAttributes<HTMLButtonElement> & {
9
9
  size: 'small' | 'medium' | 'big';
10
- variant: 'primary' | 'secondary' | 'outlined' | 'warning' | 'clean' | 'provider' | 'dark';
10
+ variant: 'primary' | 'secondary' | 'outlined' | 'warning' | 'clean' | 'provider' | 'dark' | 'option';
11
11
  type: 'button' | 'submit' | 'reset';
12
12
  withIcon?: boolean;
13
13
  asIcon?: boolean;
14
14
  className?: string;
15
15
  withRipple?: boolean;
16
+ /**
17
+ * The `option` variant's second line — the hint under the label. Rendered
18
+ * only by that variant, which owns the two-line geometry.
19
+ */
20
+ description?: string;
21
+ /**
22
+ * Toggle state for the `option` variant: mirrored to `aria-pressed` and
23
+ * styled by the variant itself, so no call site has to describe what
24
+ * "selected" looks like.
25
+ */
26
+ pressed?: boolean;
16
27
  };
17
28
  export declare const Button: FC<TButton>;
18
29
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/button/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,oBAAoB,EAEzB,KAAK,EAAE,EAGP,KAAK,iBAAiB,EAGvB,MAAM,OAAO,CAAC;AACf,OAAO,oBAAoB,CAAC;AAE5B,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CASlC,CAAC;AAEF,KAAK,OAAO,GAAG,iBAAiB,GAC9B,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACxC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjC,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IAC1F,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEJ,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,OAAO,CA8D9B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/button/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,oBAAoB,EAEzB,KAAK,EAAE,EAGP,KAAK,iBAAiB,EAIvB,MAAM,OAAO,CAAC;AACf,OAAO,oBAAoB,CAAC;AAE5B,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,WAAW,CASlC,CAAC;AAEF,KAAK,OAAO,GAAG,iBAAiB,GAC9B,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACxC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjC,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrG,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEJ,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC,OAAO,CA+F9B,CAAC"}
@@ -4,8 +4,10 @@ export { Button } from './button';
4
4
  export * from './fields';
5
5
  export * from './providers-box';
6
6
  export { Link } from './link';
7
+ export { Spinner, type SpinnerProps, type SpinnerSize } from './spinner';
7
8
  export { Switch } from './switch';
8
9
  export * from './popover';
9
10
  export * from './dialog';
10
11
  export * from './login-screen';
12
+ export { UpgradeDialog, UpgradeChallengeView, UpgradeFactorList, UpgradeStatus, type UpgradeStatusState, DEFAULT_FACTOR_LABELS, dialogOutcomeFromError, describeAssuranceBar, readAssuranceBar, UPGRADE_FACTOR_CODE_CONTRACTS, toDialogFactors, toDialogState, upgradeDialogDismissHandler, type ToDialogStateInput, type UpgradeChallengeSnapshot, type UpgradeDialogErrorKind, type UpgradeDialogHandlers, type UpgradeDialogLabels, type UpgradeDialogOutcome, type UpgradeDialogUiState, type UpgradeFactorSnapshot, type UpgradePromptSnapshot, type UpgradeDialogCancelledState, type UpgradeDialogChallengeState, type UpgradeDialogExhaustedState, type UpgradeDialogFactor, type UpgradeDialogInsufficientState, type UpgradeDialogProps, type UpgradeDialogState, type UpgradeDialogSuccessState, type UpgradeDialogTransportState, type UpgradeDialogUnavailableState, type UpgradeDialogUnsatisfiableState, type UpgradeDialogWorkingState, type UpgradeFactorCodeContract, } from './upgrade-dialog';
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAM/B,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,KAAK,kBAAkB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,6BAA6B,EAC7B,eAAe,EACf,aAAa,EACb,2BAA2B,EAC3B,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,EAClC,KAAK,+BAA+B,EACpC,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,GAC/B,MAAM,kBAAkB,CAAC"}
@@ -8,6 +8,8 @@ import { LoginConsentState } from './types';
8
8
  * button submits the subset that is still on, so "Allow" never grants more than
9
9
  * what is visible on screen. Deny is a peer of Allow, not a hidden link: a
10
10
  * consent screen where refusing is harder than accepting is a dark pattern.
11
+ * For the same reason neither button takes initial focus: a bare Enter on a
12
+ * freshly loaded screen must not grant every requested scope.
11
13
  */
12
14
  export declare const LoginConsent: FC<LoginConsentState>;
13
15
  //# sourceMappingURL=consent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/login-screen/consent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAIhC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAwD9C,CAAC"}
1
+ {"version":3,"file":"consent.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/login-screen/consent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAIhC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAgD9C,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { FC } from 'react';
2
+ export type SpinnerSize = 'small' | 'medium';
3
+ export type SpinnerProps = {
4
+ /** `small` sits inline beside a line of text; `medium` stands alone. */
5
+ size?: SpinnerSize;
6
+ /**
7
+ * The accessible name. Omit it when a sibling already announces the busy
8
+ * state — the ring is then decorative and hidden from assistive technology,
9
+ * which is what a status region with its own live text wants.
10
+ */
11
+ label?: string;
12
+ };
13
+ /**
14
+ * The indeterminate activity ring.
15
+ *
16
+ * It exists as a primitive so its diameter and stroke live in one place rather
17
+ * than in each consuming component's stylesheet. The upgrade dialog uses it;
18
+ * the login screen still draws its own identical ring in
19
+ * `login-screen.css` and should be migrated onto this when that file is next
20
+ * touched.
21
+ */
22
+ export declare const Spinner: FC<SpinnerProps>;
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/spinner/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,eAAe,CAAC;AAEvB,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG;IACzB,wEAAwE;IACxE,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CAOpC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { FC } from 'react';
2
+ import { UpgradeDialogChallengeState } from './types';
3
+ /**
4
+ * The collecting view: the suggested factor, its input affordance, the
5
+ * alternatives toggle, and the two terminal controls.
6
+ *
7
+ * Selection is reported through `onSelectFactor` before `onSubmit` ever fires —
8
+ * architecture §13.2's late-join boundary is factor selection, not submission,
9
+ * so the controller must learn of the choice while the user is still typing.
10
+ */
11
+ export declare const UpgradeChallengeView: FC<UpgradeDialogChallengeState>;
12
+ //# sourceMappingURL=challenge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/upgrade-dialog/challenge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAoC,MAAM,OAAO,CAAC;AAKlE,OAAO,KAAK,EAAE,2BAA2B,EAAqB,MAAM,SAAS,CAAC;AAK9E;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,EAAE,CAAC,2BAA2B,CAoHhE,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { FC } from 'react';
2
+ import { UpgradeDialogFactor, UpgradeFactorType } from './types';
3
+ type UpgradeFactorListProps = {
4
+ factors: readonly UpgradeDialogFactor[];
5
+ selected: UpgradeFactorType;
6
+ disabled?: boolean;
7
+ label?: string;
8
+ onSelect: (factor: UpgradeFactorType) => void;
9
+ };
10
+ /**
11
+ * The "use another way" alternatives. Selecting one reports the user's choice;
12
+ * it never navigates.
13
+ *
14
+ * Each row is `Button variant='option'`: the two-line geometry and the pressed
15
+ * look belong to that variant in the button library, not to this list. The list
16
+ * contributes layout only.
17
+ */
18
+ export declare const UpgradeFactorList: FC<UpgradeFactorListProps>;
19
+ export {};
20
+ //# sourceMappingURL=factor-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factor-list.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/upgrade-dialog/factor-list.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEtE,KAAK,sBAAsB,GAAG;IAC5B,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACxC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAyBxD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { UpgradeDialog } from './upgrade-dialog';
2
+ export { UpgradeChallengeView } from './challenge';
3
+ export { UpgradeFactorList } from './factor-list';
4
+ export { UPGRADE_SUCCESS_AUTO_CLOSE_MS, UpgradeStatus, type UpgradeStatusState } from './status';
5
+ export { DEFAULT_FACTOR_LABELS, dialogOutcomeFromError, describeAssuranceBar, readAssuranceBar, UPGRADE_FACTOR_CODE_CONTRACTS, toDialogFactors, toDialogState, upgradeDialogDismissHandler, } from './state-mapping';
6
+ export type { ToDialogStateInput, UpgradeChallengeSnapshot, UpgradeDialogErrorKind, UpgradeDialogHandlers, UpgradeDialogLabels, UpgradeDialogOutcome, UpgradeDialogUiState, UpgradeFactorSnapshot, UpgradePromptSnapshot, } from './state-mapping';
7
+ export type { AssuranceBar, UpgradeDialogCancelledState, UpgradeDialogChallengeState, UpgradeDialogExhaustedState, UpgradeDialogFactor, UpgradeDialogInsufficientState, UpgradeDialogProps, UpgradeDialogState, UpgradeDialogSuccessState, UpgradeDialogTransportState, UpgradeDialogUnavailableState, UpgradeDialogUnsatisfiableState, UpgradeDialogWorkingState, UpgradeFactorCodeContract, UpgradeFactorInput, UpgradeFactorType, } from './types';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/upgrade-dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,6BAA6B,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACjG,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,6BAA6B,EAC7B,eAAe,EACf,aAAa,EACb,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,YAAY,EACZ,2BAA2B,EAC3B,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,8BAA8B,EAC9B,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,EAC7B,+BAA+B,EAC/B,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,119 @@
1
+ import { AssuranceBar, UpgradeDialogFactor, UpgradeDialogState, UpgradeFactorCodeContract, UpgradeFactorInput, UpgradeFactorType } from './types';
2
+ export type UpgradeChallengeSnapshot = {
3
+ requiredLevel?: number;
4
+ acrValues?: string;
5
+ maxAge?: number;
6
+ };
7
+ export type UpgradeFactorSnapshot = {
8
+ type: UpgradeFactorType;
9
+ input: UpgradeFactorInput;
10
+ };
11
+ export type UpgradePromptSnapshot = {
12
+ challenge: UpgradeChallengeSnapshot;
13
+ /** Already ranked by `selectFactors`; index 0 is the suggested factor. */
14
+ factors: readonly UpgradeFactorSnapshot[];
15
+ previousError?: unknown;
16
+ };
17
+ export type UpgradeDialogLabels = Partial<Record<UpgradeFactorType, {
18
+ label: string;
19
+ hint?: string;
20
+ }>>;
21
+ /** How the flight ended, as the controller's outcome summary reports it (§13.4). */
22
+ export type UpgradeDialogOutcome = {
23
+ kind: 'elevated';
24
+ } | {
25
+ kind: 'insufficient';
26
+ obtained: AssuranceBar;
27
+ required: AssuranceBar;
28
+ } | {
29
+ kind: 'cancelled';
30
+ } | {
31
+ kind: 'failed';
32
+ error: unknown;
33
+ };
34
+ export type UpgradeDialogUiState = {
35
+ selected?: UpgradeFactorType | null;
36
+ busy?: boolean;
37
+ showAlternatives?: boolean;
38
+ };
39
+ export type UpgradeDialogHandlers = {
40
+ onSelectFactor: (factor: UpgradeFactorType) => void;
41
+ onToggleAlternatives: () => void;
42
+ onSubmit: (code?: string) => void;
43
+ onCancel: () => void;
44
+ onDismiss: () => void;
45
+ onRetry?: () => void;
46
+ };
47
+ export type ToDialogStateInput = {
48
+ prompt: UpgradePromptSnapshot | null;
49
+ outcome?: UpgradeDialogOutcome;
50
+ ui?: UpgradeDialogUiState;
51
+ labels?: UpgradeDialogLabels;
52
+ handlers: UpgradeDialogHandlers;
53
+ testId?: string;
54
+ };
55
+ /**
56
+ * How an elevation failure reads to the user. `rejected` is the retryable
57
+ * wrong-answer case, which keeps the dialog open on the challenge.
58
+ */
59
+ export type UpgradeDialogErrorKind = 'rejected' | 'cancelled' | 'exhausted' | 'unsatisfiable' | 'unavailable' | 'transport' | 'insufficient' | 'session-changed';
60
+ export declare const DEFAULT_FACTOR_LABELS: Record<UpgradeFactorType, {
61
+ label: string;
62
+ hint?: string;
63
+ }>;
64
+ /**
65
+ * Per-factor code contracts, keyed by the factor type, which is the only thing
66
+ * about a factor the protocol guarantees.
67
+ *
68
+ * `recovery_codes` is the reason this table exists. The server generates them
69
+ * at `DefaultRecoveryCodeLength` (12) from a 32-character alphanumeric charset
70
+ * and accepts a configured length anywhere in 6..16, so the cap is the server's
71
+ * MAXIMUM — capping at the default would reject a valid code on a deployment
72
+ * that raised it, and capping at six (the old single hardcoded number) rejected
73
+ * every code on every deployment. A shorter configured code simply types
74
+ * shorter; a cap can only ever do harm by being too small.
75
+ *
76
+ * `null` means the factor collects nothing typed: its proof comes from the
77
+ * ceremony, so there is no field and no contract to state.
78
+ */
79
+ export declare const UPGRADE_FACTOR_CODE_CONTRACTS: Readonly<{
80
+ totp: UpgradeFactorCodeContract;
81
+ email_otp: UpgradeFactorCodeContract;
82
+ sms_otp: UpgradeFactorCodeContract;
83
+ recovery_codes: UpgradeFactorCodeContract;
84
+ passkey: null;
85
+ }>;
86
+ /** Index 0 stays index 0: `selectFactors` already ranked the list, and ranking is not filtering. */
87
+ export declare const toDialogFactors: (factors: readonly UpgradeFactorSnapshot[], labels?: UpgradeDialogLabels) => UpgradeDialogFactor[];
88
+ /**
89
+ * How a failure reads to the user, as the dialog's own vocabulary.
90
+ *
91
+ * Named `dialogOutcomeFromError`, not `classifyUpgradeError`: that name belongs
92
+ * to `@passflow/core`, and holding it here shadowed core's symbol in the
93
+ * package's own star exports, which made the real classifier unreachable to
94
+ * consumers. This function decides nothing about what the error IS — core's
95
+ * classifier does — only which panel that kind is shown on.
96
+ *
97
+ * The dedicated error classes are matched before the kind table because they
98
+ * are not transport failures at all: they carry no `kind`, and core's
99
+ * classifier has nothing to say about them.
100
+ */
101
+ export declare const dialogOutcomeFromError: (error: unknown) => UpgradeDialogErrorKind;
102
+ export declare const readAssuranceBar: (value: unknown) => AssuranceBar | undefined;
103
+ /** Human wording for a bar, on whichever axis it constrains. */
104
+ export declare const describeAssuranceBar: (bar?: AssuranceBar) => string;
105
+ /**
106
+ * The single projection. A terminal `outcome` always wins over an open prompt;
107
+ * an empty offered factor list is the `no usable factor` outcome; a `busy`
108
+ * ceremony with no code to type is `working`; everything else is the challenge.
109
+ */
110
+ export declare const toDialogState: (input: ToDialogStateInput) => UpgradeDialogState;
111
+ /**
112
+ * What Escape and an overlay click mean in each state. Cancellation must reach
113
+ * the controller or the caller's promise hangs (§8.1), so this is never a bare
114
+ * close; `success` has nothing to cancel, so it closes instead of cancelling —
115
+ * returning `undefined` there made Escape and the overlay inert on the one
116
+ * state every user reaches.
117
+ */
118
+ export declare const upgradeDialogDismissHandler: (state: UpgradeDialogState) => (() => void) | undefined;
119
+ //# sourceMappingURL=state-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-mapping.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/upgrade-dialog/state-mapping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { FC } from 'react';
2
+ import { UpgradeDialogState } from './types';
3
+ /** Every state that is not the collecting challenge. */
4
+ export type UpgradeStatusState = Exclude<UpgradeDialogState, {
5
+ kind: 'challenge';
6
+ }>;
7
+ /**
8
+ * How long `success` stays on screen before it closes itself (§13.4: "reports
9
+ * success and closes"). Long enough to be read, short enough that the app is
10
+ * never held behind a modal the user cannot see a reason for.
11
+ */
12
+ export declare const UPGRADE_SUCCESS_AUTO_CLOSE_MS = 1800;
13
+ /**
14
+ * The non-collecting views: `working`, `success` and the six terminal outcomes
15
+ * of §13.3's settlement table.
16
+ *
17
+ * `insufficient` is deliberately rendered in the problem tone with both bars
18
+ * shown: the elevation succeeded and the action still did not, and the dialog
19
+ * must not report success when the replay was re-challenged (§13.4).
20
+ *
21
+ * `success` owns its own exit: a Done control and an auto-close timer, both
22
+ * calling the state's `onDismiss`. The affordance lives here rather than in the
23
+ * provider because a modal that cannot be closed is a property of this
24
+ * component, and the Storybook story for the state has to show the way out.
25
+ */
26
+ export declare const UpgradeStatus: FC<UpgradeStatusState>;
27
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/upgrade-dialog/status.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAa,MAAM,OAAO,CAAC;AAK3C,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEhE,wDAAwD;AACxD,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AAepF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,OAAO,CAAC;AASlD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CA4DhD,CAAC"}