@homefile/components-v2 2.62.0 → 2.63.1
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/dist/components/onboarding/CardFooter.js +2 -1
- package/dist/components/onboarding/PageTitle.d.ts +1 -1
- package/dist/components/onboarding/PageTitle.js +5 -3
- package/dist/components/onboarding/pages/ActivateAccount.js +3 -3
- package/dist/components/onboarding/pages/AuthHeader.js +2 -2
- package/dist/components/onboarding/pages/BasePageWrapper.d.ts +32 -1
- package/dist/components/onboarding/pages/BasePageWrapper.js +23 -3
- package/dist/components/onboarding/pages/EmailValidation.js +2 -2
- package/dist/components/onboarding/pages/MessagePage.d.ts +2 -0
- package/dist/components/onboarding/pages/MessagePage.js +11 -0
- package/dist/components/onboarding/pages/NewPassword.js +3 -3
- package/dist/components/onboarding/pages/ResendResetPassword.js +2 -2
- package/dist/components/onboarding/pages/ResetPassword.js +3 -3
- package/dist/components/onboarding/pages/SignIn.d.ts +1 -1
- package/dist/components/onboarding/pages/SignIn.js +4 -4
- package/dist/components/onboarding/pages/SignUp.js +3 -3
- package/dist/components/onboarding/pages/TwoFactor.d.ts +1 -1
- package/dist/components/onboarding/pages/TwoFactor.js +15 -4
- package/dist/components/onboarding/pages/Welcome.js +2 -2
- package/dist/components/onboarding/pages/index.d.ts +1 -0
- package/dist/components/onboarding/pages/index.js +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/interfaces/onboarding/PageTitle.interface.d.ts +1 -0
- package/dist/interfaces/pages/MessagePage.interface.d.ts +6 -0
- package/dist/interfaces/pages/MessagePage.interface.js +1 -0
- package/dist/interfaces/pages/SignIn.interface.d.ts +3 -1
- package/dist/interfaces/pages/TwoFactor.interface.d.ts +6 -0
- package/dist/interfaces/pages/index.d.ts +1 -0
- package/dist/interfaces/pages/index.js +1 -0
- package/dist/stories/onboarding/CardFooter.stories.d.ts +2 -1
- package/dist/stories/onboarding/CardFooter.stories.js +24 -0
- package/dist/stories/onboarding/PageTitle.stories.d.ts +2 -1
- package/dist/stories/onboarding/PageTitle.stories.js +31 -0
- package/dist/stories/onboarding/pages/ActivateAccount.stories.d.ts +3 -1
- package/dist/stories/onboarding/pages/ActivateAccount.stories.js +41 -0
- package/dist/stories/onboarding/pages/EmailValidation.stories.d.ts +3 -1
- package/dist/stories/onboarding/pages/EmailValidation.stories.js +43 -0
- package/dist/stories/onboarding/pages/MessagePage.stories.d.ts +9 -0
- package/dist/stories/onboarding/pages/MessagePage.stories.js +73 -0
- package/dist/stories/onboarding/pages/NewPassword.stories.d.ts +3 -1
- package/dist/stories/onboarding/pages/NewPassword.stories.js +44 -0
- package/dist/stories/onboarding/pages/ResendResetPassword.stories.d.ts +3 -1
- package/dist/stories/onboarding/pages/ResendResetPassword.stories.js +47 -0
- package/dist/stories/onboarding/pages/ResetPassword.stories.d.ts +3 -1
- package/dist/stories/onboarding/pages/ResetPassword.stories.js +45 -0
- package/dist/stories/onboarding/pages/SignIn.stories.d.ts +10 -1
- package/dist/stories/onboarding/pages/SignIn.stories.js +96 -0
- package/dist/stories/onboarding/pages/SignUp.stories.d.ts +2 -1
- package/dist/stories/onboarding/pages/SignUp.stories.js +34 -0
- package/dist/stories/onboarding/pages/TwoFactor.stories.d.ts +11 -2
- package/dist/stories/onboarding/pages/TwoFactor.stories.js +118 -3
- package/dist/stories/onboarding/pages/Welcome.stories.d.ts +2 -1
- package/dist/stories/onboarding/pages/Welcome.stories.js +29 -0
- package/dist/stories/onboarding/phoneLayout.d.ts +20 -0
- package/dist/stories/onboarding/phoneLayout.js +89 -0
- package/dist/stories/partner/adminTiles/InboxCard.stories.d.ts +1 -1
- package/dist/stories/partner/adminTiles/InboxCard.stories.js +8 -5
- package/dist/stories/typography/NoWidow.stories.d.ts +8 -0
- package/dist/stories/typography/NoWidow.stories.js +61 -0
- package/dist/theme/components/TextStyles.d.ts +5 -0
- package/dist/theme/components/TextStyles.js +8 -0
- package/package.json +6 -1
|
@@ -1,4 +1,14 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
import { expect, within } from '@storybook/test';
|
|
2
12
|
import { PageTitle } from '../../components';
|
|
3
13
|
export default {
|
|
4
14
|
title: 'Components/Onboarding',
|
|
@@ -10,3 +20,24 @@ export const PageTitleComponent = (args) => {
|
|
|
10
20
|
PageTitleComponent.args = {
|
|
11
21
|
title: "Page's title",
|
|
12
22
|
};
|
|
23
|
+
const DESCRIPTION = 'Log in to your Homefile account to connect this phone. Then Homi will know it’s you.';
|
|
24
|
+
export const PageTitleWithDescription = {
|
|
25
|
+
args: {
|
|
26
|
+
title: 'Connect (512) 555-0147',
|
|
27
|
+
description: DESCRIPTION,
|
|
28
|
+
},
|
|
29
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
30
|
+
const canvas = within(canvasElement);
|
|
31
|
+
const title = canvas.getByText('Connect (512) 555-0147');
|
|
32
|
+
const description = canvas.getByText(DESCRIPTION);
|
|
33
|
+
// The line sits under the title, centred like it, and is never cut off.
|
|
34
|
+
yield expect(description.getBoundingClientRect().top).toBeGreaterThanOrEqual(title.getBoundingClientRect().bottom);
|
|
35
|
+
yield expect(getComputedStyle(description).textAlign).toBe('center');
|
|
36
|
+
const descriptionStyle = getComputedStyle(description);
|
|
37
|
+
yield expect(descriptionStyle.getPropertyValue('-webkit-line-clamp')).toBe('none');
|
|
38
|
+
yield expect(descriptionStyle.overflow).toBe('visible');
|
|
39
|
+
// Centred text wraps into even lines; line height at most 4px over the font size.
|
|
40
|
+
yield expect(descriptionStyle.getPropertyValue('text-wrap-style')).toBe('balance');
|
|
41
|
+
yield expect(parseFloat(descriptionStyle.lineHeight) - parseFloat(descriptionStyle.fontSize)).toBeLessThanOrEqual(4);
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Meta } from '@storybook/react';
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
2
2
|
import { ActivateAccountI } from '../../../interfaces';
|
|
3
3
|
declare const _default: Meta<ActivateAccountI>;
|
|
4
4
|
export default _default;
|
|
@@ -9,3 +9,5 @@ export declare const ActivateAccountPage: {
|
|
|
9
9
|
isLoading: boolean;
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
|
+
export declare const ActivateAccountPhone: StoryObj<ActivateAccountI>;
|
|
13
|
+
export declare const ActivateAccountSmallTablet: StoryObj<ActivateAccountI>;
|
|
@@ -1,6 +1,17 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
11
|
import { Box } from '@chakra-ui/react';
|
|
12
|
+
import { fn, within } from '@storybook/test';
|
|
3
13
|
import { ActivateAccount } from '../../../components';
|
|
14
|
+
import { PHONE, SMALL_TABLET, expectCardAtTop, expectCardBelowTopGap, expectCardFullWidth, expectPageFillsScreen, expectSides, getCard, } from '../phoneLayout';
|
|
4
15
|
export default {
|
|
5
16
|
title: 'Pages/Onboarding',
|
|
6
17
|
component: ActivateAccount,
|
|
@@ -12,3 +23,33 @@ ActivateAccountPage.args = {
|
|
|
12
23
|
name: 'Matthew',
|
|
13
24
|
isLoading: true,
|
|
14
25
|
};
|
|
26
|
+
// Activate account on a phone: like sign in, the card starts at the top, spans
|
|
27
|
+
// the screen and runs down to the bottom of it; its text keeps 13px from the
|
|
28
|
+
// sides.
|
|
29
|
+
export const ActivateAccountPhone = {
|
|
30
|
+
parameters: PHONE,
|
|
31
|
+
args: {
|
|
32
|
+
name: 'Jordan',
|
|
33
|
+
isLoading: false,
|
|
34
|
+
handleActivateBt: fn(),
|
|
35
|
+
},
|
|
36
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
37
|
+
const canvas = within(canvasElement);
|
|
38
|
+
const card = getCard(canvasElement);
|
|
39
|
+
yield expectCardAtTop(card);
|
|
40
|
+
yield expectCardFullWidth(card);
|
|
41
|
+
yield expectSides(card, {
|
|
42
|
+
instruction: canvas.getByText('To complete your Homefile registration process, please click on the button below to confirm and activate your account.'),
|
|
43
|
+
signature: canvas.getByText('Your Homefile Crew'),
|
|
44
|
+
});
|
|
45
|
+
yield expectPageFillsScreen(card);
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
// Activate account on a small tablet (744px): the card keeps the top gap.
|
|
49
|
+
export const ActivateAccountSmallTablet = {
|
|
50
|
+
parameters: SMALL_TABLET,
|
|
51
|
+
args: ActivateAccountPhone.args,
|
|
52
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
53
|
+
yield expectCardBelowTopGap(getCard(canvasElement));
|
|
54
|
+
}),
|
|
55
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Meta } from '@storybook/react';
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
2
2
|
import { EmailValidationI } from '../../../interfaces';
|
|
3
3
|
declare const _default: Meta<EmailValidationI>;
|
|
4
4
|
export default _default;
|
|
@@ -9,3 +9,5 @@ export declare const EmailValidationPage: {
|
|
|
9
9
|
isLoading: boolean;
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
|
+
export declare const EmailValidationPhone: StoryObj<EmailValidationI>;
|
|
13
|
+
export declare const EmailValidationSmallTablet: StoryObj<EmailValidationI>;
|
|
@@ -1,6 +1,17 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
11
|
import { Box } from '@chakra-ui/react';
|
|
12
|
+
import { fn, within } from '@storybook/test';
|
|
3
13
|
import { EmailValidation } from '../../../components';
|
|
14
|
+
import { PHONE, SMALL_TABLET, expectCardAtTop, expectCardBelowTopGap, expectCardFullWidth, expectContentSides, expectPageFillsScreen, expectSides, getCard, } from '../phoneLayout';
|
|
4
15
|
export default {
|
|
5
16
|
title: 'Pages/Onboarding',
|
|
6
17
|
component: EmailValidation,
|
|
@@ -12,3 +23,35 @@ EmailValidationPage.args = {
|
|
|
12
23
|
email: 'user@user.com.br',
|
|
13
24
|
isLoading: true,
|
|
14
25
|
};
|
|
26
|
+
// The check-your-email page on a phone: like sign in, the card starts at the
|
|
27
|
+
// top, spans the screen and runs down to the bottom of it; the title and the
|
|
28
|
+
// button keep 13px from its sides.
|
|
29
|
+
export const EmailValidationPhone = {
|
|
30
|
+
parameters: PHONE,
|
|
31
|
+
args: {
|
|
32
|
+
email: 'jordan@example.com',
|
|
33
|
+
isLoading: false,
|
|
34
|
+
handleResendBt: fn(),
|
|
35
|
+
},
|
|
36
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
37
|
+
const canvas = within(canvasElement);
|
|
38
|
+
const card = getCard(canvasElement);
|
|
39
|
+
yield expectCardAtTop(card);
|
|
40
|
+
yield expectCardFullWidth(card);
|
|
41
|
+
yield expectContentSides(card, {
|
|
42
|
+
title: canvas.getByText('jordan@example.com').parentElement,
|
|
43
|
+
});
|
|
44
|
+
yield expectSides(card, {
|
|
45
|
+
'Resend button': canvas.getByRole('button', { name: 'Resend Email Verification' }),
|
|
46
|
+
});
|
|
47
|
+
yield expectPageFillsScreen(card);
|
|
48
|
+
}),
|
|
49
|
+
};
|
|
50
|
+
// The check-your-email page on a small tablet (744px): the card keeps the top gap.
|
|
51
|
+
export const EmailValidationSmallTablet = {
|
|
52
|
+
parameters: SMALL_TABLET,
|
|
53
|
+
args: EmailValidationPhone.args,
|
|
54
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
55
|
+
yield expectCardBelowTopGap(getCard(canvasElement));
|
|
56
|
+
}),
|
|
57
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { MessagePageI } from '../../../interfaces';
|
|
3
|
+
declare const _default: Meta<MessagePageI>;
|
|
4
|
+
export default _default;
|
|
5
|
+
export declare const Connected: StoryObj<MessagePageI>;
|
|
6
|
+
export declare const Expired: StoryObj<MessagePageI>;
|
|
7
|
+
export declare const TooManyTries: StoryObj<MessagePageI>;
|
|
8
|
+
export declare const ConnectedElsewhere: StoryObj<MessagePageI>;
|
|
9
|
+
export declare const Support: StoryObj<MessagePageI>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { expect, within } from '@storybook/test';
|
|
11
|
+
import { MessagePage } from '../../../components';
|
|
12
|
+
import { PHONE, expectCardAtTop, expectCardFullWidth, expectSides, getCard, } from '../phoneLayout';
|
|
13
|
+
export default {
|
|
14
|
+
title: 'Pages/Onboarding/Message Page',
|
|
15
|
+
component: MessagePage,
|
|
16
|
+
// A whole page on a phone: edge to edge, at 390x844.
|
|
17
|
+
parameters: PHONE,
|
|
18
|
+
};
|
|
19
|
+
const BACK_TO_TEXTS = { actionLabel: 'Back to my texts', actionHref: 'sms:' };
|
|
20
|
+
// Every message page shows its whole title and line; the button only when it has
|
|
21
|
+
// both a label and a link, and then it opens the texting app.
|
|
22
|
+
const play = (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement, args }) {
|
|
23
|
+
var _b;
|
|
24
|
+
const canvas = within(canvasElement);
|
|
25
|
+
const title = canvas.getByText(args.title);
|
|
26
|
+
yield expect(title).toBeVisible();
|
|
27
|
+
yield expect(getComputedStyle(title).getPropertyValue('-webkit-line-clamp')).toBe('none');
|
|
28
|
+
yield expect(getComputedStyle(title).overflow).toBe('visible');
|
|
29
|
+
yield expect(canvas.getByText(args.description)).toBeVisible();
|
|
30
|
+
const links = canvas.queryAllByRole('link');
|
|
31
|
+
if (args.actionLabel && args.actionHref) {
|
|
32
|
+
yield expect(links).toHaveLength(1);
|
|
33
|
+
yield expect(links[0]).toHaveTextContent(args.actionLabel);
|
|
34
|
+
yield expect((_b = links[0].getAttribute('href')) === null || _b === void 0 ? void 0 : _b.startsWith('sms:')).toBe(true);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
yield expect(links).toHaveLength(0);
|
|
38
|
+
yield expect(canvas.queryAllByRole('button')).toHaveLength(0);
|
|
39
|
+
}
|
|
40
|
+
// On a phone: full screen, no bar on top, and the button 13px from the sides.
|
|
41
|
+
const card = getCard(canvasElement);
|
|
42
|
+
yield expectCardAtTop(card);
|
|
43
|
+
yield expectCardFullWidth(card);
|
|
44
|
+
if (links.length > 0) {
|
|
45
|
+
yield expectSides(card, { [`${args.actionLabel} button`]: links[0] });
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
export const Connected = {
|
|
49
|
+
args: Object.assign({ title: '(512) 555-0147 is connected', description: 'Go back to your texts. Homi will know it’s you now.' }, BACK_TO_TEXTS),
|
|
50
|
+
play,
|
|
51
|
+
};
|
|
52
|
+
export const Expired = {
|
|
53
|
+
args: Object.assign({ title: 'This link has expired', description: 'Text Homi and ask for a new one.' }, BACK_TO_TEXTS),
|
|
54
|
+
play,
|
|
55
|
+
};
|
|
56
|
+
export const TooManyTries = {
|
|
57
|
+
args: Object.assign({ title: 'Too many tries', description: 'Text Homi for a new link later.' }, BACK_TO_TEXTS),
|
|
58
|
+
play,
|
|
59
|
+
};
|
|
60
|
+
export const ConnectedElsewhere = {
|
|
61
|
+
args: {
|
|
62
|
+
title: 'This phone is already connected to a different Homefile account',
|
|
63
|
+
description: 'If that’s wrong, contact support@homefile.com.',
|
|
64
|
+
},
|
|
65
|
+
play,
|
|
66
|
+
};
|
|
67
|
+
export const Support = {
|
|
68
|
+
args: {
|
|
69
|
+
title: 'We can’t connect this phone here',
|
|
70
|
+
description: 'Contact support@homefile.com and we’ll help.',
|
|
71
|
+
},
|
|
72
|
+
play,
|
|
73
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Meta } from '@storybook/react';
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
2
2
|
import { NewPasswordI } from '../../../interfaces';
|
|
3
3
|
declare const _default: Meta<NewPasswordI>;
|
|
4
4
|
export default _default;
|
|
@@ -28,3 +28,5 @@ export declare const NewPasswordNoAnswer: {
|
|
|
28
28
|
supportEmail: string;
|
|
29
29
|
};
|
|
30
30
|
};
|
|
31
|
+
export declare const NewPasswordPhone: StoryObj<NewPasswordI>;
|
|
32
|
+
export declare const NewPasswordSmallTablet: StoryObj<NewPasswordI>;
|
|
@@ -1,5 +1,16 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
import { fn, within } from '@storybook/test';
|
|
2
12
|
import { NewPassword, CloudsAnimation } from '../../../components';
|
|
13
|
+
import { PHONE, SMALL_TABLET, expectCardAtTop, expectCardBelowTopGap, expectCardFullWidth, expectPageFillsScreen, expectSides, getCard, } from '../phoneLayout';
|
|
3
14
|
export default {
|
|
4
15
|
title: 'Pages/Onboarding',
|
|
5
16
|
component: NewPassword,
|
|
@@ -28,3 +39,36 @@ NewPasswordNoAnswer.args = {
|
|
|
28
39
|
errorMessage: "We couldn't reach Homefile. Check your connection, then press Reset Password.",
|
|
29
40
|
supportEmail: 'support@homefile.com',
|
|
30
41
|
};
|
|
42
|
+
// New password on a phone: the card starts at the top, spans the screen and
|
|
43
|
+
// runs down to the copyright at the bottom of the screen, like sign in; the
|
|
44
|
+
// fields and the button keep 13px from its sides.
|
|
45
|
+
export const NewPasswordPhone = {
|
|
46
|
+
parameters: PHONE,
|
|
47
|
+
args: {
|
|
48
|
+
isLoading: false,
|
|
49
|
+
userEmail: 'jordan@example.com',
|
|
50
|
+
handleReset: fn(),
|
|
51
|
+
},
|
|
52
|
+
render: (args) => (_jsx(CloudsAnimation, { children: _jsx(NewPassword, Object.assign({}, args)) })),
|
|
53
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
54
|
+
const canvas = within(canvasElement);
|
|
55
|
+
const card = getCard(canvasElement);
|
|
56
|
+
yield expectCardAtTop(card);
|
|
57
|
+
yield expectCardFullWidth(card);
|
|
58
|
+
yield expectSides(card, {
|
|
59
|
+
'password field': canvasElement.querySelector('input#password'),
|
|
60
|
+
'confirm field': canvasElement.querySelector('input#confirmPassword'),
|
|
61
|
+
'Reset Password button': canvas.getByRole('button', { name: 'Reset Password' }),
|
|
62
|
+
});
|
|
63
|
+
yield expectPageFillsScreen(card);
|
|
64
|
+
}),
|
|
65
|
+
};
|
|
66
|
+
// New password on a small tablet (744px): the card keeps the top gap.
|
|
67
|
+
export const NewPasswordSmallTablet = {
|
|
68
|
+
parameters: SMALL_TABLET,
|
|
69
|
+
args: NewPasswordPhone.args,
|
|
70
|
+
render: NewPasswordPhone.render,
|
|
71
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
72
|
+
yield expectCardBelowTopGap(getCard(canvasElement));
|
|
73
|
+
}),
|
|
74
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Meta } from '@storybook/react';
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
2
2
|
import { EmailValidationI } from '../../../interfaces';
|
|
3
3
|
declare const _default: Meta<EmailValidationI>;
|
|
4
4
|
export default _default;
|
|
@@ -9,3 +9,5 @@ export declare const ResendResetPasswordPage: {
|
|
|
9
9
|
isLoading: boolean;
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
|
+
export declare const ResendResetPasswordPhone: StoryObj<EmailValidationI>;
|
|
13
|
+
export declare const ResendResetPasswordSmallTablet: StoryObj<EmailValidationI>;
|
|
@@ -1,5 +1,16 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
import { fn, within } from '@storybook/test';
|
|
2
12
|
import { ResendResetPassword, CloudsAnimation } from '../../../components';
|
|
13
|
+
import { PHONE, SMALL_TABLET, expectCardAtTop, expectCardBelowTopGap, expectCardFullWidth, expectContentSides, expectPageFillsScreen, expectSides, getCard, } from '../phoneLayout';
|
|
3
14
|
export default {
|
|
4
15
|
title: 'Pages/Onboarding',
|
|
5
16
|
component: ResendResetPassword,
|
|
@@ -11,3 +22,39 @@ ResendResetPasswordPage.args = {
|
|
|
11
22
|
email: 'user@user.com.br',
|
|
12
23
|
isLoading: true,
|
|
13
24
|
};
|
|
25
|
+
// The reset-email-sent page on a phone: like sign in, the card starts at the
|
|
26
|
+
// top and runs down to the bottom of the screen; its title and buttons keep
|
|
27
|
+
// 13px from the sides.
|
|
28
|
+
export const ResendResetPasswordPhone = {
|
|
29
|
+
parameters: PHONE,
|
|
30
|
+
args: {
|
|
31
|
+
email: 'jordan@example.com',
|
|
32
|
+
isLoading: false,
|
|
33
|
+
handleResendBt: fn(),
|
|
34
|
+
handleBack: fn(),
|
|
35
|
+
},
|
|
36
|
+
render: (args) => (_jsx(CloudsAnimation, { children: _jsx(ResendResetPassword, Object.assign({}, args)) })),
|
|
37
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
38
|
+
const canvas = within(canvasElement);
|
|
39
|
+
const card = getCard(canvasElement);
|
|
40
|
+
yield expectCardAtTop(card);
|
|
41
|
+
yield expectCardFullWidth(card);
|
|
42
|
+
yield expectContentSides(card, {
|
|
43
|
+
title: canvas.getByText('jordan@example.com').parentElement,
|
|
44
|
+
});
|
|
45
|
+
yield expectSides(card, {
|
|
46
|
+
'Resend button': canvas.getByRole('button', { name: 'Resend Reset Password Link' }),
|
|
47
|
+
'Back to Log In button': canvas.getByRole('button', { name: 'Back to Log In' }),
|
|
48
|
+
});
|
|
49
|
+
yield expectPageFillsScreen(card);
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
// The reset-email-sent page on a small tablet (744px): the card keeps the top gap.
|
|
53
|
+
export const ResendResetPasswordSmallTablet = {
|
|
54
|
+
parameters: SMALL_TABLET,
|
|
55
|
+
args: ResendResetPasswordPhone.args,
|
|
56
|
+
render: ResendResetPasswordPhone.render,
|
|
57
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
58
|
+
yield expectCardBelowTopGap(getCard(canvasElement));
|
|
59
|
+
}),
|
|
60
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Meta } from '@storybook/react';
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
2
2
|
import { ResetPasswordI } from '../../../interfaces';
|
|
3
3
|
declare const _default: Meta<ResetPasswordI>;
|
|
4
4
|
export default _default;
|
|
@@ -9,3 +9,5 @@ export declare const ResetPasswordPage: {
|
|
|
9
9
|
resetError: boolean;
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
|
+
export declare const ResetPasswordPhone: StoryObj<ResetPasswordI>;
|
|
13
|
+
export declare const ResetPasswordSmallTablet: StoryObj<ResetPasswordI>;
|
|
@@ -1,5 +1,16 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
import { fn, within } from '@storybook/test';
|
|
2
12
|
import { ResetPassword, CloudsAnimation } from '../../../components';
|
|
13
|
+
import { PHONE, SMALL_TABLET, expectCardAtTop, expectCardBelowTopGap, expectCardFullWidth, expectPageFillsScreen, expectSides, getCard, } from '../phoneLayout';
|
|
3
14
|
export default {
|
|
4
15
|
title: 'Pages/Onboarding',
|
|
5
16
|
component: ResetPassword,
|
|
@@ -11,3 +22,37 @@ ResetPasswordPage.args = {
|
|
|
11
22
|
isLoading: false,
|
|
12
23
|
resetError: false,
|
|
13
24
|
};
|
|
25
|
+
// Reset password on a phone: the card starts at the top, spans the screen and
|
|
26
|
+
// runs down to the copyright at the bottom of the screen, like sign in; the
|
|
27
|
+
// field, the button and the Log-in box keep 13px from its sides.
|
|
28
|
+
export const ResetPasswordPhone = {
|
|
29
|
+
parameters: PHONE,
|
|
30
|
+
args: {
|
|
31
|
+
isLoading: false,
|
|
32
|
+
resetError: false,
|
|
33
|
+
handleReset: fn(),
|
|
34
|
+
handleSignIn: fn(),
|
|
35
|
+
},
|
|
36
|
+
render: (args) => (_jsx(CloudsAnimation, { children: _jsx(ResetPassword, Object.assign({}, args)) })),
|
|
37
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
38
|
+
const canvas = within(canvasElement);
|
|
39
|
+
const card = getCard(canvasElement);
|
|
40
|
+
yield expectCardAtTop(card);
|
|
41
|
+
yield expectCardFullWidth(card);
|
|
42
|
+
yield expectSides(card, {
|
|
43
|
+
'email field': canvasElement.querySelector('input#email'),
|
|
44
|
+
'Reset Password button': canvas.getByRole('button', { name: 'Reset Password' }),
|
|
45
|
+
'Log-in box': canvas.getByRole('button', { name: 'Log in' }).parentElement,
|
|
46
|
+
});
|
|
47
|
+
yield expectPageFillsScreen(card);
|
|
48
|
+
}),
|
|
49
|
+
};
|
|
50
|
+
// Reset password on a small tablet (744px): the card keeps the top gap.
|
|
51
|
+
export const ResetPasswordSmallTablet = {
|
|
52
|
+
parameters: SMALL_TABLET,
|
|
53
|
+
args: ResetPasswordPhone.args,
|
|
54
|
+
render: ResetPasswordPhone.render,
|
|
55
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
56
|
+
yield expectCardBelowTopGap(getCard(canvasElement));
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Meta } from '@storybook/react';
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
2
2
|
import { SignInI } from '../../../interfaces';
|
|
3
3
|
declare const _default: Meta;
|
|
4
4
|
export default _default;
|
|
@@ -10,5 +10,14 @@ export declare const SignInPage: {
|
|
|
10
10
|
email: string;
|
|
11
11
|
password: string;
|
|
12
12
|
};
|
|
13
|
+
handleForgotPassword: import("@vitest/spy").Mock<(...args: any[]) => any>;
|
|
14
|
+
handleSignIn: import("@vitest/spy").Mock<(...args: any[]) => any>;
|
|
15
|
+
handleSignUp: import("@vitest/spy").Mock<(...args: any[]) => any>;
|
|
13
16
|
};
|
|
17
|
+
play({ canvasElement }: {
|
|
18
|
+
canvasElement: HTMLElement;
|
|
19
|
+
}): Promise<void>;
|
|
14
20
|
};
|
|
21
|
+
export declare const SignInConnect: StoryObj<SignInI>;
|
|
22
|
+
export declare const SignInPartnerPhone: StoryObj<SignInI>;
|
|
23
|
+
export declare const SignInSmallTablet: StoryObj<SignInI>;
|
|
@@ -1,5 +1,16 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
import { expect, fn, within } from '@storybook/test';
|
|
2
12
|
import { SignIn, CloudsAnimation } from '../../../components';
|
|
13
|
+
import { PHONE, SMALL_TABLET, expectCardAtTop, expectCardFullWidth, expectNoCardShadow, expectSides, getCard, } from '../phoneLayout';
|
|
3
14
|
export default {
|
|
4
15
|
title: 'Pages/Onboarding',
|
|
5
16
|
component: SignIn,
|
|
@@ -13,4 +24,89 @@ export const SignInPage = (args) => {
|
|
|
13
24
|
SignInPage.args = {
|
|
14
25
|
isLoading: false,
|
|
15
26
|
values: { email: 'damaprodutora@gmail.com', password: '123456' },
|
|
27
|
+
handleForgotPassword: fn(),
|
|
28
|
+
handleSignIn: fn(),
|
|
29
|
+
handleSignUp: fn(),
|
|
30
|
+
};
|
|
31
|
+
SignInPage.play = (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
32
|
+
const canvas = within(canvasElement);
|
|
33
|
+
// The default page is unchanged: its own title and the Sign-up box.
|
|
34
|
+
yield expect(canvas.getByText('Please Log in')).toBeVisible();
|
|
35
|
+
yield expect(canvas.getByText('Don’t have a Homefile account?')).toBeVisible();
|
|
36
|
+
yield expect(canvas.getByRole('button', { name: 'Sign up' })).toBeVisible();
|
|
37
|
+
});
|
|
38
|
+
const CONNECT_HEADING = 'Connect (512) 555-0147';
|
|
39
|
+
const CONNECT_LINE = 'Log in to your Homefile account to connect this phone. Then Homi will know it’s you.';
|
|
40
|
+
// The page a texter reaches from Homi's link to connect their phone.
|
|
41
|
+
export const SignInConnect = {
|
|
42
|
+
parameters: PHONE,
|
|
43
|
+
args: {
|
|
44
|
+
isLoading: false,
|
|
45
|
+
heading: CONNECT_HEADING,
|
|
46
|
+
description: CONNECT_LINE,
|
|
47
|
+
handleForgotPassword: fn(),
|
|
48
|
+
handleSignIn: fn(),
|
|
49
|
+
handleGoogleSignIn: fn(),
|
|
50
|
+
},
|
|
51
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
52
|
+
const canvas = within(canvasElement);
|
|
53
|
+
yield expect(canvas.getByText(CONNECT_HEADING)).toBeVisible();
|
|
54
|
+
yield expect(canvas.getByText(CONNECT_LINE)).toBeVisible();
|
|
55
|
+
yield expect(canvas.getByRole('button', { name: 'Continue with Google' })).toBeVisible();
|
|
56
|
+
yield expect(canvas.getByRole('button', { name: 'Log in' })).toBeVisible();
|
|
57
|
+
// No way to make a new account here, and no Apple button.
|
|
58
|
+
yield expect(canvas.queryByText('Don’t have a Homefile account?')).toBeNull();
|
|
59
|
+
yield expect(canvas.queryByRole('button', { name: 'Sign up' })).toBeNull();
|
|
60
|
+
yield expect(canvas.queryByRole('button', { name: 'Continue with Apple' })).toBeNull();
|
|
61
|
+
// On a phone: full screen, no bar on top, 13px sides.
|
|
62
|
+
const card = getCard(canvasElement);
|
|
63
|
+
yield expectCardAtTop(card);
|
|
64
|
+
yield expectCardFullWidth(card);
|
|
65
|
+
yield expectSides(card, {
|
|
66
|
+
'Google button': canvas.getByRole('button', { name: 'Continue with Google' }),
|
|
67
|
+
'email field': canvasElement.querySelector('input#email'),
|
|
68
|
+
'password field': canvasElement.querySelector('input#password'),
|
|
69
|
+
'Log in button': canvas.getByRole('button', { name: 'Log in' }),
|
|
70
|
+
});
|
|
71
|
+
}),
|
|
72
|
+
};
|
|
73
|
+
// The partner sign-in on a phone: the partner header, the form and the Sign-up
|
|
74
|
+
// box all keep 13px from the sides of the screen.
|
|
75
|
+
export const SignInPartnerPhone = {
|
|
76
|
+
parameters: PHONE,
|
|
77
|
+
args: {
|
|
78
|
+
isPartner: true,
|
|
79
|
+
isLoading: false,
|
|
80
|
+
handleForgotPassword: fn(),
|
|
81
|
+
handleSignIn: fn(),
|
|
82
|
+
handleSignUp: fn(),
|
|
83
|
+
},
|
|
84
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
85
|
+
const canvas = within(canvasElement);
|
|
86
|
+
const card = getCard(canvasElement);
|
|
87
|
+
yield expectCardAtTop(card);
|
|
88
|
+
yield expectCardFullWidth(card);
|
|
89
|
+
yield expectSides(card, {
|
|
90
|
+
'partner header': [
|
|
91
|
+
canvas.getByAltText('Homefile'),
|
|
92
|
+
canvas.getByText('Partner Admin'),
|
|
93
|
+
],
|
|
94
|
+
'email field': canvasElement.querySelector('input#email'),
|
|
95
|
+
'password field': canvasElement.querySelector('input#password'),
|
|
96
|
+
'Log in button': canvas.getByRole('button', { name: 'Log in' }),
|
|
97
|
+
'Sign-up box': canvas.getByText('Don’t have a Homefile Partner account?'),
|
|
98
|
+
});
|
|
99
|
+
}),
|
|
100
|
+
};
|
|
101
|
+
// Sign in on a small tablet (744px): still the full-screen page below 768px,
|
|
102
|
+
// as in 2.63.0 (Matt kept sign in as it is at every width, 2026-10-08).
|
|
103
|
+
export const SignInSmallTablet = {
|
|
104
|
+
parameters: SMALL_TABLET,
|
|
105
|
+
args: SignInConnect.args,
|
|
106
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
107
|
+
const card = getCard(canvasElement);
|
|
108
|
+
yield expectCardAtTop(card);
|
|
109
|
+
yield expectCardFullWidth(card);
|
|
110
|
+
yield expectNoCardShadow(card);
|
|
111
|
+
}),
|
|
16
112
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Meta } from '@storybook/react';
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
2
2
|
import { SignUpI } from '../../../interfaces';
|
|
3
3
|
declare const _default: Meta<SignUpI>;
|
|
4
4
|
export default _default;
|
|
@@ -14,3 +14,4 @@ export declare const SignUpPage: {
|
|
|
14
14
|
};
|
|
15
15
|
};
|
|
16
16
|
};
|
|
17
|
+
export declare const SignUpPhone: StoryObj<SignUpI>;
|
|
@@ -1,5 +1,16 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
import { fn, within } from '@storybook/test';
|
|
2
12
|
import { CloudsAnimation, SignUp } from '../../../components';
|
|
13
|
+
import { PHONE, expectCardAtTop, expectCardFullWidth, expectSides, getCard, } from '../phoneLayout';
|
|
3
14
|
export default {
|
|
4
15
|
title: 'Pages/Onboarding',
|
|
5
16
|
component: SignUp,
|
|
@@ -20,3 +31,26 @@ SignUpPage.args = {
|
|
|
20
31
|
showPromoCode: true,
|
|
21
32
|
values: valuesFilled,
|
|
22
33
|
};
|
|
34
|
+
// Sign up on a phone: full screen, no bar on top, and the form and the Log-in
|
|
35
|
+
// box keep 13px from the sides of the screen.
|
|
36
|
+
export const SignUpPhone = {
|
|
37
|
+
parameters: PHONE,
|
|
38
|
+
args: {
|
|
39
|
+
isLoading: false,
|
|
40
|
+
handleCreateAccount: fn(),
|
|
41
|
+
handleSignIn: fn(),
|
|
42
|
+
},
|
|
43
|
+
play: (_a) => __awaiter(void 0, [_a], void 0, function* ({ canvasElement }) {
|
|
44
|
+
const canvas = within(canvasElement);
|
|
45
|
+
const card = getCard(canvasElement);
|
|
46
|
+
yield expectCardAtTop(card);
|
|
47
|
+
yield expectCardFullWidth(card);
|
|
48
|
+
yield expectSides(card, {
|
|
49
|
+
'name field': canvasElement.querySelector('input#name'),
|
|
50
|
+
'email field': canvasElement.querySelector('input#email'),
|
|
51
|
+
'password field': canvasElement.querySelector('input#password'),
|
|
52
|
+
'Create account button': canvas.getByRole('button', { name: 'Create account' }),
|
|
53
|
+
'Log-in box': canvas.getByText('Already have an account?'),
|
|
54
|
+
});
|
|
55
|
+
}),
|
|
56
|
+
};
|
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
import { Meta } from '@storybook/react';
|
|
1
|
+
import { Decorator, Meta, StoryObj } from '@storybook/react';
|
|
2
2
|
import { TwoFactorI } from '../../../interfaces';
|
|
3
3
|
declare const _default: Meta<TwoFactorI>;
|
|
4
4
|
export default _default;
|
|
5
|
-
export declare const TwoFactorPage:
|
|
5
|
+
export declare const TwoFactorPage: {
|
|
6
|
+
(args: TwoFactorI): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
decorators: Decorator[];
|
|
8
|
+
play({ canvasElement }: {
|
|
9
|
+
canvasElement: HTMLElement;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
export declare const TwoFactorConnect: StoryObj<TwoFactorI>;
|
|
13
|
+
export declare const TwoFactorConnectWrongCode: StoryObj<TwoFactorI>;
|
|
14
|
+
export declare const TwoFactorConnectResendLimit: StoryObj<TwoFactorI>;
|