@12-apps/ui 6.92.2 → 6.93.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.
- package/components-catalog.md +1 -1
- package/dist/_internal/components/data-display/Alert/Alert.js +2 -2
- package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +3 -3
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +5 -5
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +1 -1
- package/dist/_internal/components/data-display/Chart/SpecChart.js +3 -3
- package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +9 -9
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +16 -16
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +1 -1
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +1 -1
- package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +1 -1
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +4 -4
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
- package/dist/_internal/components/data-display/DayRuler/DayRuler.js +6 -6
- package/dist/_internal/components/data-display/DayRuler/DayRuler.keyboard.js +2 -2
- package/dist/_internal/components/data-display/DayRuler/DayRuler.parts.js +2 -2
- package/dist/_internal/components/data-display/DayRuler/useRulerDrag.js +2 -2
- package/dist/_internal/components/data-display/HoverCard/HoverCard.js +1 -1
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +5 -5
- package/dist/_internal/components/data-display/Lightbox/LightboxControls.js +2 -2
- package/dist/_internal/components/data-display/Lightbox/LightboxOverlay.js +3 -3
- package/dist/_internal/components/data-display/Lightbox/LightboxThumbnails.js +2 -2
- package/dist/_internal/components/data-display/RegionMap/RegionMap.js +2 -2
- package/dist/_internal/components/data-display/ScheduleGrid/ScheduleGrid.js +1 -1
- package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +2 -2
- package/dist/_internal/components/data-display/Sheet/Sheet.js +3 -3
- package/dist/_internal/components/data-display/Table/Table.js +3 -3
- package/dist/_internal/components/data-display/index.js +35 -35
- package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +3 -3
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.frame.js +48 -0
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.frame.js.map +1 -0
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.js +6 -5
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.overview.js +4 -4
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.parts.js +3 -3
- package/dist/_internal/components/feedback/index.js +10 -9
- package/dist/_internal/components/index.js +44 -43
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +4 -4
- package/dist/_internal/components/navigation/index.js +4 -4
- package/dist/_internal/user-avatar/user-avatar.js +4 -4
- package/dist/charts.js +6 -6
- package/dist/{chunk-DBPFKGXX.js → chunk-3YFDGFEK.js} +2 -2
- package/dist/{chunk-Y3F2F36I.js → chunk-4QGKR65P.js} +4 -4
- package/dist/{chunk-YE7M7URT.js → chunk-6D5AMANO.js} +2 -2
- package/dist/{chunk-UDBOGSFO.js → chunk-6HPVCDVU.js} +4 -4
- package/dist/{chunk-EOQ6EKTS.js → chunk-7XSCEHGA.js} +7 -7
- package/dist/{chunk-B5STMM3R.js → chunk-ALMGYCHY.js} +2 -2
- package/dist/{chunk-64UNVW6D.js → chunk-BP3ZKIPE.js} +4 -4
- package/dist/{chunk-OCT5VCLP.js → chunk-BQBEN44R.js} +2 -2
- package/dist/chunk-CPQJFHNZ.js +63 -0
- package/dist/chunk-CPQJFHNZ.js.map +1 -0
- package/dist/{chunk-Q3SILZTQ.js → chunk-E2UOEI7N.js} +2 -2
- package/dist/{chunk-DWH4TQXK.js → chunk-F5H3WDG7.js} +2 -2
- package/dist/{chunk-JVOEVTCZ.js → chunk-HQCZT6TO.js} +5 -5
- package/dist/{chunk-3I5PHWKQ.js → chunk-HSVSU7I2.js} +6 -6
- package/dist/{chunk-4QR7LM5F.js → chunk-JIEVKHOH.js} +2 -2
- package/dist/{chunk-FWTVIRZZ.js → chunk-JVQ56E3U.js} +6 -6
- package/dist/{chunk-YOLLISEY.js → chunk-JXK53XJW.js} +9 -9
- package/dist/{chunk-PCQ5JWLF.js → chunk-KPUUHAK6.js} +7 -7
- package/dist/{chunk-56JF5PZK.js → chunk-LYVTJLCF.js} +4 -4
- package/dist/{chunk-NXQ6PXLJ.js → chunk-LZ5PGB7U.js} +2 -2
- package/dist/{chunk-EKSJES5E.js → chunk-MAYAJXO6.js} +4 -4
- package/dist/{chunk-CNUO2BRV.js → chunk-MFX4ASX5.js} +3 -3
- package/dist/{chunk-5I75WRXT.js → chunk-N3GLX64O.js} +4 -4
- package/dist/{chunk-PEAUGQKU.js → chunk-NQCTANF3.js} +7 -7
- package/dist/{chunk-QE4KYG5I.js → chunk-OM6ZT64U.js} +5 -5
- package/dist/{chunk-W676GY42.js → chunk-P772HCHI.js} +4 -4
- package/dist/{chunk-VWRXSBT2.js → chunk-R52N5UCS.js} +2 -2
- package/dist/{chunk-FQNDJITD.js → chunk-RCTHCXS6.js} +2 -2
- package/dist/{chunk-WLLUARTC.js → chunk-T2G4LDU5.js} +2 -2
- package/dist/{chunk-D2JQF2WC.js → chunk-VJIJCLUX.js} +4 -4
- package/dist/{chunk-66VKX6JE.js → chunk-WJMSND5Q.js} +2 -2
- package/dist/{chunk-ZCNR4DN5.js → chunk-XBWW3QSI.js} +4 -4
- package/dist/{chunk-KQDBOZQE.js → chunk-XFZDO2KB.js} +2 -2
- package/dist/{chunk-BOADHYTA.js → chunk-YNZUYZ2O.js} +2 -2
- package/dist/{chunk-XRV4QFEQ.js → chunk-ZBUMGMWP.js} +83 -65
- package/dist/chunk-ZBUMGMWP.js.map +1 -0
- package/dist/data-display/Alert.js +2 -2
- package/dist/data-display/Avatar.js +3 -3
- package/dist/data-display/CardKit.js +10 -10
- package/dist/data-display/Chart.js +6 -6
- package/dist/data-display/DataViews.js +21 -21
- package/dist/data-display/DayRuler.js +6 -6
- package/dist/data-display/HoverCard.js +1 -1
- package/dist/data-display/Lightbox.js +5 -5
- package/dist/data-display/RegionMap.js +2 -2
- package/dist/data-display/ScheduleGrid.js +5 -5
- package/dist/data-display/Sheet.js +3 -3
- package/dist/data-display/Table.js +3 -3
- package/dist/feedback/ConfirmAction.js +3 -3
- package/dist/feedback/NotificationStatusNotice.js +3 -3
- package/dist/feedback/SequenceResolver.js +6 -5
- package/dist/navigation/AppHeader.js +4 -4
- package/dist/types/components/feedback/SequenceResolver/SequenceResolver.d.ts +55 -2
- package/dist/types/components/feedback/SequenceResolver/SequenceResolver.d.ts.map +1 -1
- package/dist/types/components/feedback/SequenceResolver/SequenceResolver.frame.d.ts +16 -0
- package/dist/types/components/feedback/SequenceResolver/SequenceResolver.frame.d.ts.map +1 -0
- package/dist/types/components/feedback/SequenceResolver/SequenceResolver.types.d.ts +10 -4
- package/dist/types/components/feedback/SequenceResolver/SequenceResolver.types.d.ts.map +1 -1
- package/dist/user-avatar.js +4 -4
- package/package.json +1 -1
- package/src/components/feedback/SequenceResolver/SequenceResolver.frame.tsx +71 -0
- package/src/components/feedback/SequenceResolver/SequenceResolver.md +2 -2
- package/src/components/feedback/SequenceResolver/SequenceResolver.tsx +122 -61
- package/src/components/feedback/SequenceResolver/SequenceResolver.types.ts +10 -4
- package/dist/chunk-XRV4QFEQ.js.map +0 -1
- /package/dist/{chunk-DBPFKGXX.js.map → chunk-3YFDGFEK.js.map} +0 -0
- /package/dist/{chunk-Y3F2F36I.js.map → chunk-4QGKR65P.js.map} +0 -0
- /package/dist/{chunk-YE7M7URT.js.map → chunk-6D5AMANO.js.map} +0 -0
- /package/dist/{chunk-UDBOGSFO.js.map → chunk-6HPVCDVU.js.map} +0 -0
- /package/dist/{chunk-EOQ6EKTS.js.map → chunk-7XSCEHGA.js.map} +0 -0
- /package/dist/{chunk-B5STMM3R.js.map → chunk-ALMGYCHY.js.map} +0 -0
- /package/dist/{chunk-64UNVW6D.js.map → chunk-BP3ZKIPE.js.map} +0 -0
- /package/dist/{chunk-OCT5VCLP.js.map → chunk-BQBEN44R.js.map} +0 -0
- /package/dist/{chunk-Q3SILZTQ.js.map → chunk-E2UOEI7N.js.map} +0 -0
- /package/dist/{chunk-DWH4TQXK.js.map → chunk-F5H3WDG7.js.map} +0 -0
- /package/dist/{chunk-JVOEVTCZ.js.map → chunk-HQCZT6TO.js.map} +0 -0
- /package/dist/{chunk-3I5PHWKQ.js.map → chunk-HSVSU7I2.js.map} +0 -0
- /package/dist/{chunk-4QR7LM5F.js.map → chunk-JIEVKHOH.js.map} +0 -0
- /package/dist/{chunk-FWTVIRZZ.js.map → chunk-JVQ56E3U.js.map} +0 -0
- /package/dist/{chunk-YOLLISEY.js.map → chunk-JXK53XJW.js.map} +0 -0
- /package/dist/{chunk-PCQ5JWLF.js.map → chunk-KPUUHAK6.js.map} +0 -0
- /package/dist/{chunk-56JF5PZK.js.map → chunk-LYVTJLCF.js.map} +0 -0
- /package/dist/{chunk-NXQ6PXLJ.js.map → chunk-LZ5PGB7U.js.map} +0 -0
- /package/dist/{chunk-EKSJES5E.js.map → chunk-MAYAJXO6.js.map} +0 -0
- /package/dist/{chunk-CNUO2BRV.js.map → chunk-MFX4ASX5.js.map} +0 -0
- /package/dist/{chunk-5I75WRXT.js.map → chunk-N3GLX64O.js.map} +0 -0
- /package/dist/{chunk-PEAUGQKU.js.map → chunk-NQCTANF3.js.map} +0 -0
- /package/dist/{chunk-QE4KYG5I.js.map → chunk-OM6ZT64U.js.map} +0 -0
- /package/dist/{chunk-W676GY42.js.map → chunk-P772HCHI.js.map} +0 -0
- /package/dist/{chunk-VWRXSBT2.js.map → chunk-R52N5UCS.js.map} +0 -0
- /package/dist/{chunk-FQNDJITD.js.map → chunk-RCTHCXS6.js.map} +0 -0
- /package/dist/{chunk-WLLUARTC.js.map → chunk-T2G4LDU5.js.map} +0 -0
- /package/dist/{chunk-D2JQF2WC.js.map → chunk-VJIJCLUX.js.map} +0 -0
- /package/dist/{chunk-66VKX6JE.js.map → chunk-WJMSND5Q.js.map} +0 -0
- /package/dist/{chunk-ZCNR4DN5.js.map → chunk-XBWW3QSI.js.map} +0 -0
- /package/dist/{chunk-KQDBOZQE.js.map → chunk-XFZDO2KB.js.map} +0 -0
- /package/dist/{chunk-BOADHYTA.js.map → chunk-YNZUYZ2O.js.map} +0 -0
|
@@ -183,8 +183,9 @@ export interface SequenceResolverLabels {
|
|
|
183
183
|
export interface SequenceResolverProps<I extends SequenceItem = SequenceItem, R = unknown> {
|
|
184
184
|
open: boolean;
|
|
185
185
|
/**
|
|
186
|
-
* The close button, Esc, and the end screen's button
|
|
187
|
-
* stood, for the host's
|
|
186
|
+
* The close button, Esc, and the end screen's button — or, with `done:
|
|
187
|
+
* null`, the queue running out. Gets where the run stood, for the host's
|
|
188
|
+
* "N resolved · Undo" toast.
|
|
188
189
|
*/
|
|
189
190
|
onClose: (summary: SequenceSummary) => void;
|
|
190
191
|
/**
|
|
@@ -215,8 +216,13 @@ export interface SequenceResolverProps<I extends SequenceItem = SequenceItem, R
|
|
|
215
216
|
overview?: SequenceOverview;
|
|
216
217
|
/** Open the run at this problem (a click on its block); the ones before it follow it. */
|
|
217
218
|
initialKey?: string;
|
|
218
|
-
/**
|
|
219
|
-
|
|
219
|
+
/**
|
|
220
|
+
* The end screen's words, from the run's summary. `null` drops the end
|
|
221
|
+
* screen: when the queue runs out — the last step answered or passed over —
|
|
222
|
+
* the resolver calls `onClose(summary)` at once, and the host's toast is the
|
|
223
|
+
* run's last word (FUT-3833).
|
|
224
|
+
*/
|
|
225
|
+
done: SequenceDone | ((summary: SequenceSummary) => SequenceDone) | null;
|
|
220
226
|
labels: SequenceResolverLabels;
|
|
221
227
|
/**
|
|
222
228
|
* Base test id (default `sequence-resolver`). Parts get `${id}-back`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SequenceResolver.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/SequenceResolver/SequenceResolver.types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SequenceResolver.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/feedback/SequenceResolver/SequenceResolver.types.ts"],"names":[],"mappings":"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"}
|
package/dist/user-avatar.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
UserAvatar,
|
|
3
3
|
UserMenu
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-E2UOEI7N.js";
|
|
5
5
|
import "./chunk-DQ22UKMZ.js";
|
|
6
6
|
import "./chunk-UDQSIRAP.js";
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-JIEVKHOH.js";
|
|
8
|
+
import "./chunk-7XSCEHGA.js";
|
|
9
|
+
import "./chunk-MTEQEPNY.js";
|
|
9
10
|
import "./chunk-6ZZGK5DT.js";
|
|
10
11
|
import "./chunk-3ZVUNSFF.js";
|
|
11
|
-
import "./chunk-MTEQEPNY.js";
|
|
12
12
|
import "./chunk-VUHLNYAE.js";
|
|
13
13
|
import "./chunk-2GSIEDGN.js";
|
|
14
14
|
import "./chunk-4XBAEKQQ.js";
|
package/package.json
CHANGED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import Box from '@mui/material/Box/index.js';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
import { Dialog } from '../Dialog';
|
|
5
|
+
import { SequenceHeader } from './SequenceResolver.header';
|
|
6
|
+
import { chromeSx, columnSx, paperSx, scrollBodySx } from './SequenceResolver.styles';
|
|
7
|
+
import type { SequenceResolverLabels } from './SequenceResolver.types';
|
|
8
|
+
import type { Screen } from './SequenceResolver';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Esc closes. `persistent` turns MUI's own Esc off together with the veil's
|
|
12
|
+
* click (the prototype's veil does nothing), so Esc is put back here; a popup
|
|
13
|
+
* inside a step that handles its own Esc stops it before it gets here.
|
|
14
|
+
*/
|
|
15
|
+
function escapeCloses(close: () => void) {
|
|
16
|
+
return (event: React.KeyboardEvent): void => {
|
|
17
|
+
if (event.key !== 'Escape' || event.defaultPrevented) return;
|
|
18
|
+
event.stopPropagation();
|
|
19
|
+
close();
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ResolverFrameProps {
|
|
24
|
+
shown: boolean;
|
|
25
|
+
/** The kept last step is playing its exit: a picture, nothing on it acts. */
|
|
26
|
+
exiting: boolean;
|
|
27
|
+
touch: boolean;
|
|
28
|
+
titleId: string;
|
|
29
|
+
testId: string;
|
|
30
|
+
labels: SequenceResolverLabels;
|
|
31
|
+
screen: Screen;
|
|
32
|
+
close: () => void;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function swallowClick(event: React.SyntheticEvent): void {
|
|
36
|
+
event.preventDefault();
|
|
37
|
+
event.stopPropagation();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function ResolverFrame(props: ResolverFrameProps): React.JSX.Element {
|
|
41
|
+
const { shown, exiting, touch, titleId, testId, labels, screen, close } = props;
|
|
42
|
+
return (
|
|
43
|
+
<Dialog
|
|
44
|
+
open={shown}
|
|
45
|
+
onClose={close}
|
|
46
|
+
persistent
|
|
47
|
+
variant={touch ? 'bottom-sheet' : 'default'}
|
|
48
|
+
size="sm"
|
|
49
|
+
aria-labelledby={titleId}
|
|
50
|
+
onKeyDown={escapeCloses(close)}
|
|
51
|
+
slotProps={{ paper: { sx: paperSx(touch) } }}
|
|
52
|
+
dataTestId={testId}
|
|
53
|
+
>
|
|
54
|
+
<Box sx={columnSx} inert={exiting} aria-hidden={exiting || undefined} onClickCapture={exiting ? swallowClick : undefined}>
|
|
55
|
+
<Box sx={chromeSx}>
|
|
56
|
+
<SequenceHeader
|
|
57
|
+
touch={touch}
|
|
58
|
+
{...screen.header}
|
|
59
|
+
closeLabel={labels.close}
|
|
60
|
+
onClose={close}
|
|
61
|
+
progressLabel={labels.progress}
|
|
62
|
+
testId={testId}
|
|
63
|
+
/>
|
|
64
|
+
</Box>
|
|
65
|
+
<Box sx={scrollBodySx} data-testid={`${testId}-body`}>
|
|
66
|
+
{screen.body}
|
|
67
|
+
</Box>
|
|
68
|
+
</Box>
|
|
69
|
+
</Dialog>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
@@ -47,7 +47,7 @@ data-sized and shrinks while you go.
|
|
|
47
47
|
| Prop | Type | Description |
|
|
48
48
|
|---|---|---|
|
|
49
49
|
| `open` | `boolean` | Shows the resolver. Every opening — with an intro or without — starts a fresh run. |
|
|
50
|
-
| `onClose` | `(summary) => void` | Close button, Esc and the end screen's button. Gets `{ resolved, skipped, total, alsoResolved }`; a close toast counts `resolved + alsoResolved` (and shows only when that is above 0). Clicking the veil does nothing (as approved). |
|
|
50
|
+
| `onClose` | `(summary) => void` | Close button, Esc and the end screen's button — or, with `done: null`, the queue running out. Gets `{ resolved, skipped, total, alsoResolved }`; a close toast counts `resolved + alsoResolved` (and shows only when that is above 0). Clicking the veil does nothing (as approved). |
|
|
51
51
|
| `intro` | `SequenceIntro?` | While given, the intro shows instead of the run: `title`, `description`, `categories` (`label`, `description`, `count`, `onPick`), `startAllLabel`, `onStartAll`. The host drops it and sets `queue` in the same update as a pick. |
|
|
52
52
|
| `queue` | `readonly I[]` (`I extends { key; kindLabel }`) | The problems, in order. Live data: it may shrink (siblings answered together) or grow mid-run. |
|
|
53
53
|
| `renderStep` | `(item, api) => SequenceStep` | The current step: `content`, `primary?`, `secondary?` (default: skip with `labels.skip`; `false` removes it), `tertiary?`, `footer?` (`'end'` default — right-aligned over a hairline; `'split'` — two equal columns, no hairline; on a phone the actions always share the row without a hairline), `canGoBack?` (`false`: this answer has no inverse — once it is answered, Back is not offered from the next step). |
|
|
@@ -55,7 +55,7 @@ data-sized and shrinks while you go.
|
|
|
55
55
|
| `canGoBack` | `boolean` (default `true`) | Offer Back at all. It shows only once a previous step exists — on steps and on the end screen, never on the intro. |
|
|
56
56
|
| `overview` | `SequenceOverview?` | "Ver todos (N)" inside the run (FUT-3825): `label(total)`, `title`, `categories` (`label`, `description?`, `count?` — the host's bookkeeping, not drawn: the `label` says the number, "Atrasado · 1" — `keys`, `onPick?`), `pickLabel`, `continueLabel`. See "Ver todos". |
|
|
57
57
|
| `initialKey` | `string?` | Open the run at this problem (a click on its block). The ones before it follow it; nothing is passed over. |
|
|
58
|
-
| `done` | `SequenceDone \| (summary) => SequenceDone` | The end screen: `title`, `description?`, `confirmLabel`. |
|
|
58
|
+
| `done` | `SequenceDone \| ((summary) => SequenceDone) \| null` | The end screen: `title`, `description?`, `confirmLabel`. **`null` drops it** (FUT-3833): when the queue runs out — the last step answered or passed over, or the host's queue emptied under the run — the resolver calls `onClose(summary)` once (StrictMode included) and starts closing, its exit playing over the last step as it was; the host's toast is the run's last word. A pending last write keeps the step until it returns; a refused one keeps it with its message and does not close. Never fires from the intro. |
|
|
59
59
|
| `labels` | `SequenceResolverLabels` | Every chrome word: `back`, `backAccessible?`, `close`, `skip`, `step(position, total, item)`, `introStep`, `doneStep`, `progress`, `failed`. **Required — the package ships no copy.** |
|
|
60
60
|
| `dataTestId` | `string` (default `sequence-resolver`) | Parts: `-back`, `-close`, `-step-label`, `-progress`, `-handle`, `-category-<n>`, `-start-all`, `-primary`, `-secondary`, `-tertiary`, `-footer`, `-error`, `-done`, `-done-confirm`, `-see-all`, `-overview`, `-overview-pick-<n>`, `-continue`. |
|
|
61
61
|
|
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import Box from '@mui/material/Box/index.js';
|
|
4
3
|
import { useTheme } from '@mui/material/styles/index.js';
|
|
5
4
|
import useMediaQuery from '@mui/material/useMediaQuery/index.js';
|
|
6
|
-
import React, { useCallback, useId, useRef, useState } from 'react';
|
|
5
|
+
import React, { useCallback, useEffect, useId, useRef, useState } from 'react';
|
|
7
6
|
|
|
8
|
-
import { Dialog } from '../Dialog';
|
|
9
7
|
import { canReturn, currentOf, jumpTargetOf, positionOf, progressOf, summaryOf, type RunState } from './sequence-model';
|
|
10
8
|
import {
|
|
11
9
|
SequenceDoneBody,
|
|
12
10
|
SequenceIntroBody,
|
|
13
11
|
SequenceStepBody,
|
|
14
12
|
} from './SequenceResolver.parts';
|
|
15
|
-
import { SequenceHeader } from './SequenceResolver.header';
|
|
16
13
|
import { SequenceOverviewBody } from './SequenceResolver.overview';
|
|
14
|
+
import { ResolverFrame } from './SequenceResolver.frame';
|
|
17
15
|
import { SEQUENCE_METRICS } from './SequenceResolver.metrics';
|
|
18
|
-
import { chromeSx, columnSx, paperSx, scrollBodySx } from './SequenceResolver.styles';
|
|
19
16
|
import type {
|
|
20
17
|
SequenceItem,
|
|
21
18
|
SequenceOverviewCategory,
|
|
@@ -124,19 +121,6 @@ function headerOf<I extends SequenceItem, R>(inputs: HeaderInputs<I, R>) {
|
|
|
124
121
|
return { ...base, back: backOf(props, state), seeAll: overview.button };
|
|
125
122
|
}
|
|
126
123
|
|
|
127
|
-
/**
|
|
128
|
-
* Esc closes. `persistent` turns MUI's own Esc off together with the veil's
|
|
129
|
-
* click (the prototype's veil does nothing), so Esc is put back here; a popup
|
|
130
|
-
* inside a step that handles its own Esc stops it before it gets here.
|
|
131
|
-
*/
|
|
132
|
-
function escapeCloses(close: () => void) {
|
|
133
|
-
return (event: React.KeyboardEvent): void => {
|
|
134
|
-
if (event.key !== 'Escape' || event.defaultPrevented) return;
|
|
135
|
-
event.stopPropagation();
|
|
136
|
-
close();
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
|
|
140
124
|
interface BodyProps<I extends SequenceItem, R> {
|
|
141
125
|
props: SequenceResolverProps<I, R>;
|
|
142
126
|
state: SequenceRun<I, R>;
|
|
@@ -193,6 +177,8 @@ function SequenceBody<I extends SequenceItem, R>(body: BodyProps<I, R>): React.J
|
|
|
193
177
|
);
|
|
194
178
|
}
|
|
195
179
|
if (stepBody) return <>{stepBody}</>;
|
|
180
|
+
// `done: null`: no end screen — the resolver is closing over its last step (see `useExitScreen`).
|
|
181
|
+
if (props.done === null) return <></>;
|
|
196
182
|
const summary = summaryOf(state.run);
|
|
197
183
|
return (
|
|
198
184
|
<SequenceDoneBody
|
|
@@ -207,10 +193,94 @@ function SequenceBody<I extends SequenceItem, R>(body: BodyProps<I, R>): React.J
|
|
|
207
193
|
);
|
|
208
194
|
}
|
|
209
195
|
|
|
196
|
+
/**
|
|
197
|
+
* With `done: null`, the run's end closes the resolver: `onClose(summary)`
|
|
198
|
+
* once, when the queue runs out while it is open and past the intro. Returns
|
|
199
|
+
* whether the run has ended that way, so the dialog starts closing in the same
|
|
200
|
+
* render (and keeps its last screen for the exit, see `useExitScreen`).
|
|
201
|
+
*
|
|
202
|
+
* `fired` makes it once per ending: StrictMode replays a mount's effects, and
|
|
203
|
+
* a resolver mounted open over an empty queue would otherwise close twice. It
|
|
204
|
+
* resets when the run is live again (a reopening, a queue that grew back).
|
|
205
|
+
*/
|
|
206
|
+
function useCloseAtEnd(ended: boolean, close: () => void): boolean {
|
|
207
|
+
const closeRef = useRef(close);
|
|
208
|
+
const fired = useRef(false);
|
|
209
|
+
useEffect(() => {
|
|
210
|
+
closeRef.current = close;
|
|
211
|
+
});
|
|
212
|
+
useEffect(() => {
|
|
213
|
+
if (!ended) {
|
|
214
|
+
fired.current = false;
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (fired.current) return;
|
|
218
|
+
fired.current = true;
|
|
219
|
+
closeRef.current();
|
|
220
|
+
}, [ended]);
|
|
221
|
+
return ended;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export interface Screen {
|
|
225
|
+
header: ReturnType<typeof headerOf>;
|
|
226
|
+
body: React.JSX.Element;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* What the dialog shows. While a step is on screen, that screen — and it is
|
|
231
|
+
* kept: when the run ends with `done: null` the dialog closes in that same
|
|
232
|
+
* render, and its exit transition (a fade, the sheet sliding down) plays over
|
|
233
|
+
* the LAST step as it was — its label, Back, progress and body — rather than
|
|
234
|
+
* an empty, collapsed "done" paper — also once the host turns `open` off from
|
|
235
|
+
* `onClose`. Back is inert during the exit.
|
|
236
|
+
*/
|
|
237
|
+
function useExitScreen(live: Screen, input: { open: boolean; hasStep: boolean; closesAtEnd: boolean }): Screen {
|
|
238
|
+
const { open, hasStep, closesAtEnd } = input;
|
|
239
|
+
const last = useRef<Screen | null>(null);
|
|
240
|
+
const wasOpen = useRef(open);
|
|
241
|
+
// A new opening is a new run: the last one's screen is not kept into it.
|
|
242
|
+
if (open && !wasOpen.current) last.current = null;
|
|
243
|
+
wasOpen.current = open;
|
|
244
|
+
if (!closesAtEnd) return live;
|
|
245
|
+
if (open && hasStep) {
|
|
246
|
+
last.current = live;
|
|
247
|
+
return live;
|
|
248
|
+
}
|
|
249
|
+
// Ended (or closed by the host after `onClose`): the exit plays over the last step.
|
|
250
|
+
const kept = last.current;
|
|
251
|
+
if (!kept) return live;
|
|
252
|
+
const { header } = kept;
|
|
253
|
+
if (!('back' in header) || !header.back) return kept;
|
|
254
|
+
return { ...kept, header: { ...header, back: { ...header.back, onClick: () => undefined } } };
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
interface RunEnding<I extends SequenceItem> {
|
|
258
|
+
current: I | undefined;
|
|
259
|
+
close: () => void;
|
|
260
|
+
/** The run ended with `done: null`: the dialog is closing. */
|
|
261
|
+
ended: boolean;
|
|
262
|
+
/** The kept last step is playing its exit. */
|
|
263
|
+
exiting: boolean;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function useRunEnding<I extends SequenceItem, R>(
|
|
267
|
+
props: SequenceResolverProps<I, R>,
|
|
268
|
+
state: SequenceRun<I, R>,
|
|
269
|
+
): RunEnding<I> {
|
|
270
|
+
const { open, onClose, intro } = props;
|
|
271
|
+
const { run } = state;
|
|
272
|
+
const current = intro ? undefined : currentOf(run);
|
|
273
|
+
const close = (): void => onClose(summaryOf(run));
|
|
274
|
+
const closesAtEnd = props.done === null && !intro;
|
|
275
|
+
const ended = useCloseAtEnd(open && closesAtEnd && !current, close);
|
|
276
|
+
return { current, close, ended, exiting: ended || (!open && closesAtEnd) };
|
|
277
|
+
}
|
|
278
|
+
|
|
210
279
|
/**
|
|
211
280
|
* Resolve a queue of problems one at a time, in ONE dialog whose body is
|
|
212
281
|
* replaced step by step: a header with "‹ Back", the step's label and close,
|
|
213
|
-
* a progress bar, the host's step, and an end screen (FUT-3671)
|
|
282
|
+
* a progress bar, the host's step, and an end screen (FUT-3671) — or none,
|
|
283
|
+
* with `done: null`: the run's end closes it (FUT-3833).
|
|
214
284
|
*
|
|
215
285
|
* A centred `Dialog` from the `sm` breakpoint up; the `Dialog` inset
|
|
216
286
|
* bottom-sheet variant below it, never taller than 95% of the viewport. Either
|
|
@@ -223,7 +293,7 @@ function SequenceBody<I extends SequenceItem, R>(body: BodyProps<I, R>): React.J
|
|
|
223
293
|
export function SequenceResolver<I extends SequenceItem, R = unknown>(
|
|
224
294
|
props: SequenceResolverProps<I, R>,
|
|
225
295
|
): React.JSX.Element {
|
|
226
|
-
const { open,
|
|
296
|
+
const { open, intro, labels } = props;
|
|
227
297
|
const testId = props.dataTestId ?? 'sequence-resolver';
|
|
228
298
|
const theme = useTheme();
|
|
229
299
|
const touch = useMediaQuery(theme.breakpoints.down(SEQUENCE_METRICS.sheetBreakpoint));
|
|
@@ -244,53 +314,44 @@ export function SequenceResolver<I extends SequenceItem, R = unknown>(
|
|
|
244
314
|
failed: labels.failed,
|
|
245
315
|
stepAllowsBack: () => stepAllowsBack.current,
|
|
246
316
|
});
|
|
247
|
-
const
|
|
248
|
-
const current
|
|
249
|
-
const close = (): void => onClose(summaryOf(run));
|
|
317
|
+
const ending = useRunEnding(props, state);
|
|
318
|
+
const { current, close } = ending;
|
|
250
319
|
const overview = useOverview(props, state, current, open);
|
|
251
320
|
// Under the overview the step is kept but hidden, and the overview's title names the dialog.
|
|
252
321
|
const titleProps = { id: overview.shown ? `${titleId}-kept` : titleId, tabIndex: -1, ref: titleRef } as const;
|
|
253
322
|
const step = current ? props.renderStep(current, stepApiOf(state, titleProps)) : undefined;
|
|
254
323
|
stepAllowsBack.current = step?.canGoBack !== false;
|
|
324
|
+
const screen = useExitScreen(
|
|
325
|
+
{
|
|
326
|
+
header: headerOf({ props, state, current, overview, titleId }),
|
|
327
|
+
body: (
|
|
328
|
+
<SequenceBody
|
|
329
|
+
props={props}
|
|
330
|
+
state={state}
|
|
331
|
+
current={current}
|
|
332
|
+
step={step}
|
|
333
|
+
overview={overview}
|
|
334
|
+
titleId={titleId}
|
|
335
|
+
stepTitleRef={stepTitleRef}
|
|
336
|
+
touch={touch}
|
|
337
|
+
testId={testId}
|
|
338
|
+
close={close}
|
|
339
|
+
/>
|
|
340
|
+
),
|
|
341
|
+
},
|
|
342
|
+
{ open, hasStep: current !== undefined && step !== undefined, closesAtEnd: props.done === null && !intro },
|
|
343
|
+
);
|
|
255
344
|
|
|
256
345
|
return (
|
|
257
|
-
<
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
>
|
|
268
|
-
<Box sx={columnSx}>
|
|
269
|
-
<Box sx={chromeSx}>
|
|
270
|
-
<SequenceHeader
|
|
271
|
-
touch={touch}
|
|
272
|
-
{...headerOf({ props, state, current, overview, titleId })}
|
|
273
|
-
closeLabel={labels.close}
|
|
274
|
-
onClose={close}
|
|
275
|
-
progressLabel={labels.progress}
|
|
276
|
-
testId={testId}
|
|
277
|
-
/>
|
|
278
|
-
</Box>
|
|
279
|
-
<Box sx={scrollBodySx} data-testid={`${testId}-body`}>
|
|
280
|
-
<SequenceBody
|
|
281
|
-
props={props}
|
|
282
|
-
state={state}
|
|
283
|
-
current={current}
|
|
284
|
-
step={step}
|
|
285
|
-
overview={overview}
|
|
286
|
-
titleId={titleId}
|
|
287
|
-
stepTitleRef={stepTitleRef}
|
|
288
|
-
touch={touch}
|
|
289
|
-
testId={testId}
|
|
290
|
-
close={close}
|
|
291
|
-
/>
|
|
292
|
-
</Box>
|
|
293
|
-
</Box>
|
|
294
|
-
</Dialog>
|
|
346
|
+
<ResolverFrame
|
|
347
|
+
shown={open && !ending.ended}
|
|
348
|
+
exiting={ending.exiting}
|
|
349
|
+
touch={touch}
|
|
350
|
+
titleId={titleId}
|
|
351
|
+
testId={testId}
|
|
352
|
+
labels={labels}
|
|
353
|
+
screen={screen}
|
|
354
|
+
close={close}
|
|
355
|
+
/>
|
|
295
356
|
);
|
|
296
357
|
}
|
|
@@ -196,8 +196,9 @@ export interface SequenceResolverLabels {
|
|
|
196
196
|
export interface SequenceResolverProps<I extends SequenceItem = SequenceItem, R = unknown> {
|
|
197
197
|
open: boolean;
|
|
198
198
|
/**
|
|
199
|
-
* The close button, Esc, and the end screen's button
|
|
200
|
-
* stood, for the host's
|
|
199
|
+
* The close button, Esc, and the end screen's button — or, with `done:
|
|
200
|
+
* null`, the queue running out. Gets where the run stood, for the host's
|
|
201
|
+
* "N resolved · Undo" toast.
|
|
201
202
|
*/
|
|
202
203
|
onClose: (summary: SequenceSummary) => void;
|
|
203
204
|
/**
|
|
@@ -228,8 +229,13 @@ export interface SequenceResolverProps<I extends SequenceItem = SequenceItem, R
|
|
|
228
229
|
overview?: SequenceOverview;
|
|
229
230
|
/** Open the run at this problem (a click on its block); the ones before it follow it. */
|
|
230
231
|
initialKey?: string;
|
|
231
|
-
/**
|
|
232
|
-
|
|
232
|
+
/**
|
|
233
|
+
* The end screen's words, from the run's summary. `null` drops the end
|
|
234
|
+
* screen: when the queue runs out — the last step answered or passed over —
|
|
235
|
+
* the resolver calls `onClose(summary)` at once, and the host's toast is the
|
|
236
|
+
* run's last word (FUT-3833).
|
|
237
|
+
*/
|
|
238
|
+
done: SequenceDone | ((summary: SequenceSummary) => SequenceDone) | null;
|
|
233
239
|
labels: SequenceResolverLabels;
|
|
234
240
|
/**
|
|
235
241
|
* Base test id (default `sequence-resolver`). Parts get `${id}-back`,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/feedback/SequenceResolver/SequenceResolver.tsx"],"sourcesContent":["'use client';\n\nimport Box from '@mui/material/Box/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport useMediaQuery from '@mui/material/useMediaQuery/index.js';\nimport React, { useCallback, useId, useRef, useState } from 'react';\n\nimport { Dialog } from '../Dialog';\nimport { canReturn, currentOf, jumpTargetOf, positionOf, progressOf, summaryOf, type RunState } from './sequence-model';\nimport {\n SequenceDoneBody,\n SequenceIntroBody,\n SequenceStepBody,\n} from './SequenceResolver.parts';\nimport { SequenceHeader } from './SequenceResolver.header';\nimport { SequenceOverviewBody } from './SequenceResolver.overview';\nimport { SEQUENCE_METRICS } from './SequenceResolver.metrics';\nimport { chromeSx, columnSx, paperSx, scrollBodySx } from './SequenceResolver.styles';\nimport type {\n SequenceItem,\n SequenceOverviewCategory,\n SequenceResolverProps,\n SequenceStep,\n SequenceStepApi,\n} from './SequenceResolver.types';\nimport { useSequenceRun, type SequenceRun } from './useSequenceRun';\n\n/** What the header's label says on the screen showing. */\nfunction headerLabelOf<I extends SequenceItem, R>(\n props: SequenceResolverProps<I, R>,\n run: RunState<I, R>,\n current: I | undefined,\n): string {\n const { labels } = props;\n if (props.intro) return labels.introStep;\n if (!current) return labels.doneStep;\n return labels.step(positionOf(run), summaryOf(run).total, current);\n}\n\n/** The header's back button, once a previous step exists and the host allows it. */\nfunction backOf<I extends SequenceItem, R>(props: SequenceResolverProps<I, R>, state: SequenceRun<I, R>) {\n const { intro, labels, canGoBack = true } = props;\n if (intro || !canGoBack || !canReturn(state.run)) return undefined;\n return { label: labels.back, accessible: labels.backAccessible, onClick: state.back, disabled: state.busy };\n}\n\ninterface OverviewState {\n /** The overview is on screen instead of the step. */\n shown: boolean;\n /** The header's \"Ver todos (N)\", while there is a step and more than one problem. */\n button?: { label: string; onClick: () => void; disabled: boolean };\n canPick: (category: SequenceOverviewCategory) => boolean;\n pick: (category: SequenceOverviewCategory) => void;\n hide: () => void;\n /** The overview's title (in the header row): focus goes to it when it opens. */\n titleRef: React.RefObject<HTMLHeadingElement | null>;\n}\n\n/**\n * \"Ver todos\" inside the run: whether it shows, its header button, and its\n * picks. Opening it changes nothing in the run; a pick jumps; \"continue\"\n * returns to the step it left. Every opening of the resolver starts closed.\n */\nfunction useOverview<I extends SequenceItem, R>(\n props: SequenceResolverProps<I, R>,\n state: SequenceRun<I, R>,\n current: I | undefined,\n open: boolean,\n): OverviewState {\n const [shown, setShown] = useState(false);\n const [wasOpen, setWasOpen] = useState(open);\n const titleRef = useRef<HTMLHeadingElement | null>(null);\n if (wasOpen !== open) {\n setWasOpen(open);\n if (shown) setShown(false);\n }\n const { overview } = props;\n const total = summaryOf(state.run).total;\n const available = Boolean(overview && current && total > 1);\n const hide = (): void => setShown(false);\n return {\n shown: shown && available,\n button:\n available && overview\n ? { label: overview.label(total), onClick: () => setShown(true), disabled: state.busy }\n : undefined,\n canPick: (category) => jumpTargetOf(state.run, category.keys) !== undefined,\n pick: (category) => {\n const target = jumpTargetOf(state.run, category.keys);\n if (target === undefined) return;\n state.jumpTo(target);\n setShown(false);\n category.onPick?.();\n },\n hide,\n titleRef,\n };\n}\n\n/** What the host's `renderStep` gets: the run's verbs, `busy`, and the props for its title. */\nfunction stepApiOf<I extends SequenceItem, R>(\n state: SequenceRun<I, R>,\n titleProps: SequenceStepApi<R>['titleProps'],\n): SequenceStepApi<R> {\n return { resolve: state.resolve, skip: state.skip, back: state.back, jumpTo: state.jumpTo, busy: state.busy, titleProps };\n}\n\ninterface HeaderInputs<I extends SequenceItem, R> {\n props: SequenceResolverProps<I, R>;\n state: SequenceRun<I, R>;\n current: I | undefined;\n overview: OverviewState;\n titleId: string;\n}\n\n/** The header's back, \"Ver todos\" and label — or, over the overview, its title and close alone. */\nfunction headerOf<I extends SequenceItem, R>(inputs: HeaderInputs<I, R>) {\n const { props, state, current, overview, titleId } = inputs;\n const run = state.run;\n const base = { label: headerLabelOf(props, run, current), progress: props.intro ? 0 : progressOf(run) };\n if (overview.shown && props.overview) {\n return { ...base, title: { id: titleId, text: props.overview.title, ref: overview.titleRef } };\n }\n return { ...base, back: backOf(props, state), seeAll: overview.button };\n}\n\n/**\n * Esc closes. `persistent` turns MUI's own Esc off together with the veil's\n * click (the prototype's veil does nothing), so Esc is put back here; a popup\n * inside a step that handles its own Esc stops it before it gets here.\n */\nfunction escapeCloses(close: () => void) {\n return (event: React.KeyboardEvent): void => {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n event.stopPropagation();\n close();\n };\n}\n\ninterface BodyProps<I extends SequenceItem, R> {\n props: SequenceResolverProps<I, R>;\n state: SequenceRun<I, R>;\n current: I | undefined;\n /** The step on screen, rendered once by the resolver (it also reads `canGoBack` from it). */\n step: SequenceStep | undefined;\n overview: OverviewState;\n titleId: string;\n stepTitleRef: React.RefObject<HTMLElement | null>;\n touch: boolean;\n testId: string;\n close: () => void;\n}\n\n/** The intro, the step on screen, or the end screen. */\nfunction SequenceBody<I extends SequenceItem, R>(body: BodyProps<I, R>): React.JSX.Element {\n const { props, state, current, step, overview, titleId, stepTitleRef, touch, testId, close } = body;\n if (props.intro) {\n return <SequenceIntroBody intro={props.intro} titleId={titleId} testId={testId} screenKey=\"intro\" />;\n }\n const stepBody =\n current && step ? (\n <SequenceStepBody\n key={`step:${current.key}`}\n step={step}\n skip={{ label: props.labels.skip, onClick: state.skip }}\n busy={state.busy}\n error={state.error}\n touch={touch}\n testId={testId}\n screenKey={`step:${current.key}`}\n titleRef={stepTitleRef}\n hidden={overview.shown}\n />\n ) : null;\n if (overview.shown && props.overview) {\n // The step stays mounted under the overview, so a half-filled answer survives \"continue\".\n return (\n <>\n <SequenceOverviewBody\n key=\"overview\"\n categories={props.overview.categories}\n canPick={overview.canPick}\n onPick={overview.pick}\n pickLabel={props.overview.pickLabel}\n continueLabel={props.overview.continueLabel}\n onContinue={overview.hide}\n titleRef={overview.titleRef}\n touch={touch}\n testId={testId}\n />\n {stepBody}\n </>\n );\n }\n if (stepBody) return <>{stepBody}</>;\n const summary = summaryOf(state.run);\n return (\n <SequenceDoneBody\n done={typeof props.done === 'function' ? props.done(summary) : props.done}\n titleId={titleId}\n error={state.error}\n touch={touch}\n onConfirm={close}\n testId={testId}\n screenKey=\"done\"\n />\n );\n}\n\n/**\n * Resolve a queue of problems one at a time, in ONE dialog whose body is\n * replaced step by step: a header with \"‹ Back\", the step's label and close,\n * a progress bar, the host's step, and an end screen (FUT-3671).\n *\n * A centred `Dialog` from the `sm` breakpoint up; the `Dialog` inset\n * bottom-sheet variant below it, never taller than 95% of the viewport. Either\n * way the paper scrolls inside the viewport, so a long step is never cut off.\n *\n * The component owns the run — which step is on screen, what was answered or\n * skipped, where Back returns to — and nothing about the domain: every step\n * body, every word and every server call is the host's.\n */\nexport function SequenceResolver<I extends SequenceItem, R = unknown>(\n props: SequenceResolverProps<I, R>,\n): React.JSX.Element {\n const { open, onClose, intro, labels } = props;\n const testId = props.dataTestId ?? 'sequence-resolver';\n const theme = useTheme();\n const touch = useMediaQuery(theme.breakpoints.down(SEQUENCE_METRICS.sheetBreakpoint));\n const titleId = `${useId()}-title`;\n const stepTitleRef = useRef<HTMLElement | null>(null);\n const titleRef = useCallback((node: HTMLElement | null) => {\n stepTitleRef.current = node;\n }, []);\n\n // Read when an answer is recorded: the step on screen's own `canGoBack`.\n const stepAllowsBack = useRef(true);\n const state = useSequenceRun<I, R>({\n open,\n active: open && !intro,\n queue: props.queue,\n initialKey: props.initialKey,\n onBack: props.onBack,\n failed: labels.failed,\n stepAllowsBack: () => stepAllowsBack.current,\n });\n const { run } = state;\n const current = intro ? undefined : currentOf(run);\n const close = (): void => onClose(summaryOf(run));\n const overview = useOverview(props, state, current, open);\n // Under the overview the step is kept but hidden, and the overview's title names the dialog.\n const titleProps = { id: overview.shown ? `${titleId}-kept` : titleId, tabIndex: -1, ref: titleRef } as const;\n const step = current ? props.renderStep(current, stepApiOf(state, titleProps)) : undefined;\n stepAllowsBack.current = step?.canGoBack !== false;\n\n return (\n <Dialog\n open={open}\n onClose={close}\n persistent\n variant={touch ? 'bottom-sheet' : 'default'}\n size=\"sm\"\n aria-labelledby={titleId}\n onKeyDown={escapeCloses(close)}\n slotProps={{ paper: { sx: paperSx(touch) } }}\n dataTestId={testId}\n >\n <Box sx={columnSx}>\n <Box sx={chromeSx}>\n <SequenceHeader\n touch={touch}\n {...headerOf({ props, state, current, overview, titleId })}\n closeLabel={labels.close}\n onClose={close}\n progressLabel={labels.progress}\n testId={testId}\n />\n </Box>\n <Box sx={scrollBodySx} data-testid={`${testId}-body`}>\n <SequenceBody\n props={props}\n state={state}\n current={current}\n step={step}\n overview={overview}\n titleId={titleId}\n stepTitleRef={stepTitleRef}\n touch={touch}\n testId={testId}\n close={close}\n />\n </Box>\n </Box>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|