Skip to content

Commit 9224973

Browse files
test: added tests for core/components
1 parent 33eece5 commit 9224973

28 files changed

+464
-53
lines changed

packages/core/src/components/avatar/Avatar.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,9 @@ export const Avatar = ({
160160
);
161161
}
162162
if (variant === "text") {
163-
const [, first, second, group] =
164-
name.match(/(?=(\w).* (\w).*)|(?=(\w\w).*)/) ?? [];
163+
const [, first, second, group] = name.match(
164+
/(?=(\w).* (\w).*)|(?=(\w\w).*)/,
165+
) as string[];
165166
return (
166167
<svg role="img">
167168
<text

packages/core/src/components/avatar/AvatarGroup.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ export const AvatarGroup = ({
115115
{avatars}
116116
{!!diff && (
117117
<dfn
118+
data-ref="avatarCount"
118119
className={classNames(
119120
classes.avatar,
120121
"select-none relative overflow-hidden inline-block box-content leading-none not-italic text-center",

packages/core/src/components/badge/Badge.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ export const Badge = ({
134134
...rest,
135135
ref: innerRef,
136136
})}
137-
{(!!ping || label) && (
137+
{(!!ping || (label ?? icon)) && (
138138
<div
139139
data-ref="badge"
140140
data-ping={ping}

packages/core/src/components/icon/Icon.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ export const Icon = ({
154154
<dfn
155155
{...rest}
156156
ref={ref}
157+
data-ref="icon"
157158
role="presentation"
158159
className={classNames(
159160
classes.icon,

packages/core/stories/components/actionLabel/ActionLabel.stories.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@
2222
*/
2323

2424
import type { Meta, StoryObj } from "@storybook/react";
25-
import { fn } from "@storybook/test";
26-
import { Fragment } from "react/jsx-runtime";
2725
import { ActionLabel, Button, CoreIcons, Icon, Tooltip } from "../../../src";
28-
import { FloatingTree } from "@floating-ui/react";
2926

3027
const meta: Meta = {
3128
component: ActionLabel,
@@ -148,3 +145,8 @@ export const _ActionLabel: ActionLabelStory = {
148145
},
149146
args: {},
150147
};
148+
149+
export const Tester: ActionLabelStory = {
150+
render: (args) => <ActionLabel {...args} />,
151+
args: {},
152+
};

packages/core/stories/components/animations/Animations.stories.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import {
3333

3434
const meta: Meta = {
3535
component: AnimationIndicator,
36-
subcomponents: { AnimationBars, AnimationSpinner } as AnyObject,
36+
subcomponents: { AnimationBars, AnimationSpinner, Skeleton } as AnyObject,
3737
title: "@core/components/Animations",
3838
parameters: {
3939
layout: "centered",
@@ -77,3 +77,8 @@ export const _Animations: AnimationsStory = {
7777
},
7878
args: {},
7979
};
80+
81+
export const Tester: AnimationsStory = {
82+
render: (args) => <AnimationIndicator {...args} />,
83+
args: {},
84+
};

packages/core/stories/components/animations/Bars.stories.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,8 @@ export const _Bars: BarStory = {
5252
},
5353
args: {},
5454
};
55+
56+
export const Tester: BarStory = {
57+
render: (args) => <AnimationBars {...args} />,
58+
args: {},
59+
};

packages/core/stories/components/animations/Skeleton.stories.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
*/
2323

2424
import type { Meta, StoryObj } from "@storybook/react";
25-
import { Skeleton } from "../../../src";
2625
import { Fragment } from "react/jsx-runtime";
26+
import { Skeleton } from "../../../src";
2727

2828
const meta: Meta = {
2929
component: Skeleton,
@@ -43,9 +43,9 @@ const meta: Meta = {
4343
};
4444

4545
export default meta;
46-
type BarStory = StoryObj<typeof Skeleton>;
46+
type SkeletonStory = StoryObj<typeof Skeleton>;
4747

48-
export const _Skeleton: BarStory = {
48+
export const _Skeleton: SkeletonStory = {
4949
render: () => {
5050
return (
5151
<Fragment>
@@ -56,3 +56,8 @@ export const _Skeleton: BarStory = {
5656
},
5757
args: {},
5858
};
59+
60+
export const Tester: SkeletonStory = {
61+
render: (args) => <Skeleton {...args} />,
62+
args: {},
63+
};

packages/core/stories/components/animations/Spinner.stories.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,16 @@ const meta: Meta = {
4444
};
4545

4646
export default meta;
47-
type BarStory = StoryObj<typeof AnimationSpinner>;
47+
type SpinnerStory = StoryObj<typeof AnimationSpinner>;
4848

49-
export const _Spinner: BarStory = {
49+
export const _Spinner: SpinnerStory = {
5050
render: (args) => {
5151
return <AnimationSpinner {...args} />;
5252
},
5353
args: {},
5454
};
55+
56+
export const Tester: SpinnerStory = {
57+
render: (args) => <AnimationSpinner {...args} />,
58+
args: {},
59+
};

packages/core/stories/components/avatar/Avatar.stories.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,8 @@ export const _Avatar: AvatarStory = {
7272
onClick: fn(),
7373
},
7474
};
75+
76+
export const Tester: AvatarStory = {
77+
render: (args) => <Avatar {...args} />,
78+
args: {},
79+
};

packages/core/stories/components/avatar/AvatarGroup.stories.tsx

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -51,38 +51,19 @@ export const _AvatarGroup: AvatarGroupStory = {
5151
render: (args) => {
5252
return (
5353
<AvatarGroup {...args}>
54-
<Avatar
55-
name="Hyacinth Bucket"
56-
tooltip="Hyacinth Bucket"
57-
variant="text"
58-
/>
59-
<Avatar
60-
name="Hyacinth Bucket"
61-
tooltip="Hyacinth Bucket"
62-
fallbackIcon="mdi mdi-react"
63-
/>
64-
<Avatar
65-
name="Hyacinth Bucket"
66-
tooltip="Hyacinth Bucket"
67-
avatar={iconImg}
68-
/>
69-
<Avatar
70-
name="Hyacinth Bucket"
71-
tooltip="Hyacinth Bucket"
72-
variant="bauhaus"
73-
/>
74-
<Avatar
75-
name="Hyacinth Bucket"
76-
tooltip="Hyacinth Bucket"
77-
variant="beam"
78-
/>
79-
<Avatar
80-
name="Hyacinth Bucket"
81-
tooltip="Hyacinth Bucket"
82-
variant="pixel"
83-
/>
54+
<Avatar name="Hyacinth Bucket" variant="text" />
55+
<Avatar name="Hyacinth Bucket" fallbackIcon="mdi mdi-react" />
56+
<Avatar name="Hyacinth Bucket" avatar={iconImg} />
57+
<Avatar name="Hyacinth Bucket" variant="bauhaus" />
58+
<Avatar name="Hyacinth Bucket" variant="beam" />
59+
<Avatar name="Hyacinth Bucket" variant="pixel" />
8460
</AvatarGroup>
8561
);
8662
},
8763
args: { rounded: true, totalCount: 99, size: "2.5rem" },
8864
};
65+
66+
export const Tester: AvatarGroupStory = {
67+
render: (args) => <AvatarGroup {...args} />,
68+
args: {},
69+
};

packages/core/stories/components/badge/Badge.stories.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@
2222
*/
2323

2424
import type { Meta, StoryObj } from "@storybook/react";
25-
import { fn } from "@storybook/test";
2625
import { Fragment } from "react/jsx-runtime";
27-
import { Avatar, Button, Card, Icon, Badge } from "../../../src";
26+
import { Avatar, Badge, Button, Card, Icon } from "../../../src";
2827

2928
const meta: Meta = {
3029
component: Badge,
@@ -112,3 +111,8 @@ export const Ping: BadgeStory = {
112111
ping: true,
113112
},
114113
};
114+
115+
export const Tester: BadgeStory = {
116+
render: (args) => <Badge {...args} />,
117+
args: {},
118+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* React Fabric
3+
* @version: 1.0.0
4+
*
5+
*
6+
* The MIT License (MIT)
7+
* Copyright (c) 2024 Adarsh Pastakia
8+
*
9+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
10+
* and associated documentation files (the "Software"), to deal in the Software without restriction,
11+
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
12+
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
13+
* subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in all copies or substantial
16+
* portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19+
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22+
*/
23+
24+
import { composeStories } from "@storybook/react";
25+
import { render } from "@testing-library/react";
26+
import * as stories from "../../stories/components/actionLabel/ActionLabel.stories";
27+
28+
const { Tester } = composeStories(stories);
29+
30+
describe("ActionLabel", () => {
31+
it("should render action label", () => {
32+
const fragment = render(<Tester>Click Me</Tester>);
33+
expect(
34+
fragment.container.querySelector("[data-ref='buttonGroup'] ~ div")
35+
?.innerHTML,
36+
).toBe("Click Me");
37+
expect(document.body.innerHTML).toMatchSnapshot();
38+
fragment.unmount();
39+
});
40+
41+
it("should render action label align end", () => {
42+
const fragment = render(<Tester align="end">Click Me</Tester>);
43+
expect(document.body.innerHTML).toMatchSnapshot();
44+
fragment.unmount();
45+
});
46+
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`ActionLabel should render action label 1`] = `"<div><div class="p-4"><div class="actionLabel flex overflow-hidden gap-1 items-center cursor-default select-none"><div data-ref="buttonGroup" class="buttonGroup actions overflow-hidden flex-content inline-flex flex-nowrap align-middle rounded" data-inner-clickable="true" style="--width: 0px;"></div><div class="flex-initial truncate">Click Me</div></div></div></div>"`;
4+
5+
exports[`ActionLabel should render action label align end 1`] = `"<div></div><div><div class="p-4"><div class="actionLabel flex overflow-hidden gap-1 items-center cursor-default select-none"><div data-ref="buttonGroup" class="buttonGroup actions overflow-hidden flex-content order-2 inline-flex flex-nowrap align-middle rounded" data-inner-clickable="true" style="--width: 0px;"></div><div class="flex-initial truncate">Click Me</div></div></div></div>"`;
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
* React Fabric
3+
* @version: 1.0.0
4+
*
5+
*
6+
* The MIT License (MIT)
7+
* Copyright (c) 2024 Adarsh Pastakia
8+
*
9+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
10+
* and associated documentation files (the "Software"), to deal in the Software without restriction,
11+
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
12+
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
13+
* subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in all copies or substantial
16+
* portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
19+
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22+
*/
23+
24+
import { composeStories } from "@storybook/react";
25+
import { render } from "@testing-library/react";
26+
import { Loading } from "../../src";
27+
import * as stories from "../../stories/components/animations/Animations.stories";
28+
import * as barStories from "../../stories/components/animations/Bars.stories";
29+
import * as skeletonStories from "../../stories/components/animations/Skeleton.stories";
30+
import * as spinnerStories from "../../stories/components/animations/Spinner.stories";
31+
32+
const { Tester } = composeStories(stories);
33+
const { Tester: BarTester } = composeStories(barStories);
34+
const { Tester: SkeletonTester } = composeStories(skeletonStories);
35+
const { Tester: SpinnerTester } = composeStories(spinnerStories);
36+
37+
describe("Animations", () => {
38+
it("should render indicator", () => {
39+
const fragment = render(
40+
<div>
41+
<Tester />
42+
<Tester type="info" />
43+
<Tester type="check" />
44+
<Tester type="question" />
45+
<Tester type="cross" color="lilac" />
46+
<Tester type="exclaim" strokeColor="lilac" />
47+
</div>,
48+
);
49+
expect(document.body.innerHTML).toMatchSnapshot();
50+
fragment.unmount();
51+
});
52+
53+
it("should render bars", () => {
54+
const fragment = render(
55+
<div>
56+
<BarTester />
57+
</div>,
58+
);
59+
expect(document.body.innerHTML).toMatchSnapshot();
60+
fragment.unmount();
61+
});
62+
63+
it("should render skeleton", () => {
64+
const fragment = render(
65+
<div>
66+
<SkeletonTester />
67+
</div>,
68+
);
69+
expect(document.body.innerHTML).toMatchSnapshot();
70+
fragment.unmount();
71+
});
72+
73+
it("should render spinner", () => {
74+
const fragment = render(
75+
<div>
76+
<SpinnerTester />
77+
</div>,
78+
);
79+
expect(document.body.innerHTML).toMatchSnapshot();
80+
fragment.unmount();
81+
});
82+
83+
it("should render loader", () => {
84+
const fragment = render(
85+
<div className="relative">
86+
<Loading />
87+
</div>,
88+
);
89+
expect(document.body.innerHTML).toMatchSnapshot();
90+
fragment.unmount();
91+
});
92+
});
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`Animations should render bars 1`] = `
4+
"<div></div><div><div><div class="h-48 w-96 relative p-4 overflow-hidden outline rounded"><p>Eligendi blanditiis tot infit tristis conspergo odit creta statua odio. Caterva aureus cibus absconditus tenuis argentum maiores argentum suffoco. Cognomen certus dolores chirographum vita una dolorum.
5+
Modi civis temptatio asporto depromo celer. Tum abstergo clamo ambitus vestigium suspendo. Patria tamisium crinis terror qui temeritas viscus.
6+
Amita strenuus advenio cras ipsa umquam terreo. Crustulum desidero debilito aperiam textus degero causa addo considero. Pectus texo nemo denego beneficium cupressus caelestis tracto minima aptus.
7+
Arbitro eius conculco brevis creator et impedit cupiditate coaegresco. Terror aer solutio adduco. Decretum caelestis aegre deserunt esse.
8+
Cura corroboro crepusculum. Ait deprecator territo. Volutabrum traho timidus tredecim utrimque antea.
9+
Tenuis vomito terminatio cupiditas adiuvo astrum. Consequuntur crustulum ea atrocitas laboriosam ipsum. Minima harum sufficio architecto cui correptius adipiscor speciosus.
10+
Adimpleo atavus vix atrox id vulpes suggero quas textilis brevis. Templum patria vociferor teres supra quo suscipio calculus amaritudo taceo. Somniculosus compello animus tabernus comptus verbum architecto demonstro.
11+
Vestrum cui tabernus volva consuasor demoror vinitor patria tres. Turba cras sortitus thesis concido tabesco. Cultellus audentia defleo adsidue tenuis comedo custodia dedecor.
12+
Vergo totus arguo. Conculco varius aegre. Cupiditas assentator doloribus necessitatibus similique corrupti teneo aestivus contra teres.
13+
Tergo curis demum cunctatio tergeo distinctio perspiciatis cohors dolor. Dedecor patruus stella unde. Occaecati pax bibo antiquus umquam architecto.</p><div class="absolute inset-0 z-10 flex justify-center items-center cursor-wait"><div class="outline outline-tint-500/20 p-4 bg-base/50 backdrop-blur-sm rounded"><div class="bars text-tint-500/50" style="width: 2rem;"></div></div></div></div></div></div>"
14+
`;
15+
16+
exports[`Animations should render indicator 1`] = `"<div><div><div class="flex gap-2 items-center p-4 h-12"><svg data-ref="animated-indicator" class="checkAnimation inline-block rounded-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52" aria-hidden="true"><circle class="circlePart" cx="26" cy="26" r="25"></circle><path class="iconPart text-invert" d="M26 22L26 41M27 22L27 41M25 22L25 41M26 11L26 16M27 11L27 16M25 11L25 16Z"></path></svg></div><div class="flex gap-2 items-center p-4 h-12"><svg data-ref="animated-indicator" class="checkAnimation inline-block rounded-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52" aria-hidden="true"><circle class="circlePart" cx="26" cy="26" r="25"></circle><path class="iconPart text-invert" d="M26 22L26 41M27 22L27 41M25 22L25 41M26 11L26 16M27 11L27 16M25 11L25 16Z"></path></svg></div><div class="flex gap-2 items-center p-4 h-12"><svg data-ref="animated-indicator" class="checkAnimation inline-block rounded-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52" aria-hidden="true"><circle class="circlePart" cx="26" cy="26" r="25"></circle><path class="iconPart text-invert" d="M14.1 27.2l7.1 7.2 16.7-16.8"></path></svg></div><div class="flex gap-2 items-center p-4 h-12"><svg data-ref="animated-indicator" class="checkAnimation inline-block rounded-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52" aria-hidden="true"><circle class="circlePart" cx="26" cy="26" r="25"></circle><path class="iconPart text-invert" d="M18.949 17.621c0.426-0.787 1.354-1.6 2.108-2.223 1.279-0.984 3.87-1.778 5.805-1.778 3.837 0 6.189 2.689 6.189 6.034 0 2.23-1.193 4.214-3.751 6.346-2.886 2.361-3.497 3.362-3.497 5.788v0c0-2.263 0.689-3.509 3.476-5.772 2.689-2.23 3.772-3.968 3.772-6.362 0-3.772-2.492-6.034-6.789-6.034-2.132 0-3.903 0.722-5.28 1.804-0.82 0.623-1.476 1.377-2.033 2.197zM26 41.329v0-2.948z"></path></svg></div><div class="flex gap-2 items-center p-4 h-12"><svg data-ref="animated-indicator" class="checkAnimation inline-block rounded-full text-lilac" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52" aria-hidden="true"><circle class="circlePart" cx="26" cy="26" r="25"></circle><path class="iconPart text-invert" d="M14.1 14.1l23.8 23.8 m0,-23.8 l-23.8,23.8"></path></svg></div><div class="flex gap-2 items-center p-4 h-12"><svg data-ref="animated-indicator" class="checkAnimation inline-block rounded-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52" aria-hidden="true"><circle class="circlePart" cx="26" cy="26" r="25"></circle><path class="iconPart text-lilac" d="M26.611 10.873c-0.002 1.015-0.002 2.071-0.002 3.086v11.777c0 3.086 0.002 2.232 0 3.288h-0.018c-0.001-1.056 0-0.202 0-3.288v-11.777c0-1.015 0-2.071-0.002-3.086zM26.59 37.472h0.018v3.655h-0.018z"></path></svg></div></div></div>"`;
17+
18+
exports[`Animations should render loader 1`] = `"<div></div><div></div><div></div><div></div><div><div class="relative"><div class="loader area-[loader] relative overflow-x-clip" data-testid="loading"><div class="absolute z-10 py-px inset-x-0 top-0 after:h-0.5 after:block after:bg-primary-500"></div></div></div></div>"`;
19+
20+
exports[`Animations should render skeleton 1`] = `"<div></div><div></div><div><div><div class="h-48 w-96 relative p-4 overflow-hidden outline rounded"><div class="p-2 animate-pulse flex gap-2 max-w-lg" data-testid="skeleton"><div class="bg-tint-100 rounded aspect-square h-12"></div><div class="flex-1 flex flex-col gap-2"><div class="bg-tint-100 h-3 rounded-full"></div><div class="flex gap-2"><div class="bg-tint-100 h-2 rounded-full basis-[30%]"></div><div class="bg-tint-100 h-2 rounded-full basis-[60%]"></div></div><div class="flex gap-2"><div class="bg-tint-100 h-2 rounded-full basis-[30%]"></div><div class="bg-tint-100 h-2 rounded-full basis-[60%]"></div></div></div></div></div></div></div>"`;
21+
22+
exports[`Animations should render spinner 1`] = `
23+
"<div></div><div></div><div></div><div><div><div class="h-48 w-96 relative p-4 overflow-hidden outline rounded"><p>Atque repellendus defero assumenda comminor. Atavus desolo caecus aliqua coerceo delectus valeo eveniet. Solutio pauci vos deprimo.
24+
Capitulus adicio sequi contra. Vero solio contego doloribus volup aegrotatio ascit crudelis vicinus damno. Centum deputo argentum arx.
25+
Subvenio defessus civis sunt tantum beatus. Adeo ager ventus utpote ocer dens tamen tactus bellicus causa. Vita spiculum vitium theca.
26+
Demum uter turpis caste corrupti amiculum solio supplanto ab curatio. Recusandae demulceo damno absum curia sortitus abscido. Carcer tenetur ventito suggero cohors vinco universe.
27+
Collum vitiosus termes patrocinor. Adipiscor officia canonicus. Subseco concedo adsidue suscipio deprimo culpa spargo appono.
28+
Tego socius talio versus cruciamentum atqui corrumpo confero. Deludo tardus vergo. Sumo tabernus conservo.
29+
Vomica repellat ducimus universe. Arbustum agnosco tumultus. Coma clarus est spectaculum adicio.
30+
Antiquus cognomen incidunt arceo. Thesis audacia suffoco aptus sumptus ratione admoveo. Deleniti cedo amor tolero amo cubitum acies caries.
31+
Consequuntur debilito textilis vulgo vado vester. Usus veritatis conspergo. Decumbo comptus spes non arto utique.
32+
Curo tergiversatio tergiversatio sumo cattus. Cum aeternus solus cavus collum. Conduco aveho coniuratio.</p><div class="absolute inset-0 z-10 flex justify-center items-center cursor-wait" data-testid="spinner"><div class="outline outline-tint-500/20 p-4 bg-base/50 backdrop-blur-sm rounded"><div class="spinner text-tint-700" style="width: 2rem;"></div></div></div></div></div></div>"
33+
`;

0 commit comments

Comments
 (0)