@windstream/react-shared-components 0.0.10 → 0.0.11
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/README.md +623 -623
- package/dist/contentful/index.d.ts +6 -2
- package/dist/contentful/index.esm.js +1 -1
- package/dist/contentful/index.esm.js.map +1 -1
- package/dist/contentful/index.js +1 -1
- package/dist/contentful/index.js.map +1 -1
- package/dist/core.d.ts +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +159 -159
- package/src/components/accordion/Accordion.stories.tsx +225 -225
- package/src/components/accordion/index.tsx +36 -36
- package/src/components/accordion/types.ts +9 -9
- package/src/components/alert-card/types.ts +9 -9
- package/src/components/brand-button/BrandButton.stories.tsx +221 -221
- package/src/components/brand-button/helpers.ts +35 -35
- package/src/components/brand-button/index.tsx +90 -90
- package/src/components/brand-button/types.ts +26 -26
- package/src/components/button/Button.stories.tsx +108 -108
- package/src/components/button/index.tsx +23 -23
- package/src/components/button/types.ts +14 -14
- package/src/components/call-button/CallButton.stories.tsx +324 -324
- package/src/components/call-button/index.tsx +80 -80
- package/src/components/call-button/types.ts +9 -9
- package/src/components/checkbox/Checkbox.stories.tsx +248 -248
- package/src/components/checkbox/types.ts +23 -23
- package/src/components/checklist/Checklist.stories.tsx +151 -151
- package/src/components/checklist/index.tsx +33 -33
- package/src/components/checklist/types.ts +5 -5
- package/src/components/collapse/Collapse.stories.tsx +256 -256
- package/src/components/collapse/index.tsx +44 -44
- package/src/components/collapse/types.ts +5 -5
- package/src/components/divider/Divider.stories.tsx +206 -206
- package/src/components/divider/index.tsx +23 -23
- package/src/components/divider/type.ts +2 -2
- package/src/components/input/Input.stories.tsx +358 -358
- package/src/components/input/index.tsx +174 -174
- package/src/components/input/types.ts +36 -36
- package/src/components/link/Link.stories.tsx +163 -163
- package/src/components/link/index.tsx +96 -96
- package/src/components/link/types.ts +25 -25
- package/src/components/list/List.stories.tsx +272 -272
- package/src/components/list/index.tsx +86 -86
- package/src/components/list/list-item/index.tsx +36 -36
- package/src/components/list/list-item/types.ts +13 -13
- package/src/components/list/types.ts +29 -29
- package/src/components/material-icon/MaterialIcon.stories.tsx +330 -330
- package/src/components/material-icon/constants.ts +95 -95
- package/src/components/material-icon/index.tsx +44 -44
- package/src/components/material-icon/types.ts +31 -31
- package/src/components/modal/Modal.stories.tsx +171 -171
- package/src/components/modal/index.tsx +168 -168
- package/src/components/modal/types.ts +23 -23
- package/src/components/radio-button/index.tsx +73 -73
- package/src/components/radio-button/types.ts +21 -21
- package/src/components/see-more/SeeMore.stories.tsx +182 -182
- package/src/components/see-more/index.tsx +38 -38
- package/src/components/see-more/types.ts +3 -3
- package/src/components/select/Select.stories.tsx +410 -410
- package/src/components/select/index.tsx +150 -150
- package/src/components/select/types.ts +34 -34
- package/src/components/select-plan-button/SelectPlanButton.stories.tsx +160 -160
- package/src/components/select-plan-button/index.tsx +20 -20
- package/src/components/select-plan-button/types.ts +3 -3
- package/src/components/skeleton/Skeleton.stories.tsx +180 -180
- package/src/components/skeleton/index.tsx +61 -61
- package/src/components/skeleton/types.ts +3 -3
- package/src/components/spinner/Spinner.stories.tsx +335 -335
- package/src/components/spinner/index.tsx +44 -44
- package/src/components/spinner/types.ts +4 -4
- package/src/components/text/Text.stories.tsx +302 -302
- package/src/components/text/index.tsx +26 -26
- package/src/components/text/types.ts +45 -45
- package/src/components/tooltip/Tooltip.stories.tsx +220 -220
- package/src/components/tooltip/index.tsx +78 -78
- package/src/components/tooltip/types.ts +6 -6
- package/src/components/view-cart-button/ViewCartButton.stories.tsx +241 -241
- package/src/components/view-cart-button/index.tsx +38 -38
- package/src/components/view-cart-button/types.ts +4 -4
- package/src/contentful/blocks/accordion/index.tsx +7 -7
- package/src/contentful/blocks/button/index.tsx +5 -5
- package/src/contentful/blocks/callout/index.tsx +7 -7
- package/src/contentful/blocks/cards/index.tsx +7 -7
- package/src/contentful/blocks/carousel/index.tsx +7 -7
- package/src/contentful/blocks/cta-callout/index.tsx +6 -0
- package/src/contentful/blocks/cta-callout/types.ts +1 -0
- package/src/contentful/blocks/floating-banner/index.tsx +7 -7
- package/src/contentful/blocks/footer/index.tsx +7 -7
- package/src/contentful/blocks/image-promo-bar/index.tsx +7 -7
- package/src/contentful/blocks/modal/index.tsx +5 -5
- package/src/contentful/blocks/navigation/index.tsx +7 -7
- package/src/contentful/blocks/primary-hero/index.tsx +7 -7
- package/src/contentful/blocks/shape-background-wrapper/index.tsx +123 -123
- package/src/contentful/blocks/shape-background-wrapper/types.ts +35 -35
- package/src/contentful/blocks/text/index.tsx +6 -6
- package/src/contentful/index.ts +4 -1
- package/src/hooks/use-body-scroll-lock.ts +31 -31
- package/src/index.ts +81 -81
- package/src/setupTests.ts +46 -46
- package/src/styles/globals.css +275 -319
- package/src/types/global.d.ts +9 -9
- package/src/utils/index.ts +49 -49
|
@@ -1,180 +1,180 @@
|
|
|
1
|
-
import { Skeleton, PageSkeleton } from "./index";
|
|
2
|
-
import { DocsPage } from "@shared/stories/DocsTemplate";
|
|
3
|
-
|
|
4
|
-
import type { Meta, StoryObj } from "@storybook/react";
|
|
5
|
-
|
|
6
|
-
const meta: Meta<typeof Skeleton> = {
|
|
7
|
-
title: "Components/Skeleton",
|
|
8
|
-
component: Skeleton,
|
|
9
|
-
tags: ["autodocs"],
|
|
10
|
-
parameters: {
|
|
11
|
-
layout: "centered",
|
|
12
|
-
docs: {
|
|
13
|
-
page: DocsPage,
|
|
14
|
-
description: {
|
|
15
|
-
component:
|
|
16
|
-
"Loading skeleton components for displaying placeholder content while data is being loaded.",
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
argTypes: {
|
|
21
|
-
count: {
|
|
22
|
-
control: { type: "number" },
|
|
23
|
-
description: "Number of skeleton lines to display",
|
|
24
|
-
},
|
|
25
|
-
className: {
|
|
26
|
-
control: { type: "text" },
|
|
27
|
-
description: "Additional CSS classes",
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
args: {
|
|
31
|
-
count: 1,
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export default meta;
|
|
36
|
-
type Story = StoryObj<typeof meta>;
|
|
37
|
-
|
|
38
|
-
// Default skeleton
|
|
39
|
-
export const Default: Story = {
|
|
40
|
-
args: {},
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
// Multiple counts
|
|
44
|
-
export const Multiple: Story = {
|
|
45
|
-
args: {
|
|
46
|
-
count: 3,
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
// Custom styling
|
|
51
|
-
export const CustomStyling: Story = {
|
|
52
|
-
args: {
|
|
53
|
-
count: 2,
|
|
54
|
-
className: "h-12 rounded-lg",
|
|
55
|
-
},
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
// Different counts
|
|
59
|
-
export const DifferentCounts: Story = {
|
|
60
|
-
render: () => (
|
|
61
|
-
<div className="w-full max-w-md space-y-4">
|
|
62
|
-
<div>
|
|
63
|
-
<h4 className="mb-2 text-sm font-medium">Single Line</h4>
|
|
64
|
-
<Skeleton count={1} />
|
|
65
|
-
</div>
|
|
66
|
-
<div>
|
|
67
|
-
<h4 className="mb-2 text-sm font-medium">Three Lines</h4>
|
|
68
|
-
<Skeleton count={3} />
|
|
69
|
-
</div>
|
|
70
|
-
<div>
|
|
71
|
-
<h4 className="mb-2 text-sm font-medium">Five Lines</h4>
|
|
72
|
-
<Skeleton count={5} />
|
|
73
|
-
</div>
|
|
74
|
-
</div>
|
|
75
|
-
),
|
|
76
|
-
parameters: {
|
|
77
|
-
docs: {
|
|
78
|
-
description: {
|
|
79
|
-
story: "Skeleton with different line counts.",
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
// Page skeleton
|
|
86
|
-
export const PageSkeletonExample: Story = {
|
|
87
|
-
render: () => (
|
|
88
|
-
<div className="w-full">
|
|
89
|
-
<PageSkeleton />
|
|
90
|
-
</div>
|
|
91
|
-
),
|
|
92
|
-
parameters: {
|
|
93
|
-
layout: "fullscreen",
|
|
94
|
-
docs: {
|
|
95
|
-
description: {
|
|
96
|
-
story: "PageSkeleton component for full page loading states.",
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
},
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
// In card
|
|
103
|
-
export const InCard: Story = {
|
|
104
|
-
render: () => (
|
|
105
|
-
<div className="w-full max-w-sm rounded-lg border border-border-default p-6 space-y-4">
|
|
106
|
-
<Skeleton count={1} className="h-6 w-3/4" />
|
|
107
|
-
<Skeleton count={2} />
|
|
108
|
-
<Skeleton count={1} className="h-10 w-full" />
|
|
109
|
-
</div>
|
|
110
|
-
),
|
|
111
|
-
parameters: {
|
|
112
|
-
docs: {
|
|
113
|
-
description: {
|
|
114
|
-
story: "Skeleton used within a card layout.",
|
|
115
|
-
},
|
|
116
|
-
},
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
// List skeleton
|
|
121
|
-
export const ListSkeleton: Story = {
|
|
122
|
-
render: () => (
|
|
123
|
-
<div className="w-full max-w-md space-y-3">
|
|
124
|
-
{[1, 2, 3, 4, 5].map((i) => (
|
|
125
|
-
<div key={i} className="flex items-center gap-3">
|
|
126
|
-
<Skeleton count={1} className="h-12 w-12 rounded-full" />
|
|
127
|
-
<div className="flex-1 space-y-2">
|
|
128
|
-
<Skeleton count={1} className="h-4 w-3/4" />
|
|
129
|
-
<Skeleton count={1} className="h-3 w-1/2" />
|
|
130
|
-
</div>
|
|
131
|
-
</div>
|
|
132
|
-
))}
|
|
133
|
-
</div>
|
|
134
|
-
),
|
|
135
|
-
parameters: {
|
|
136
|
-
docs: {
|
|
137
|
-
description: {
|
|
138
|
-
story: "Skeleton used for loading list items.",
|
|
139
|
-
},
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
// All variants showcase
|
|
145
|
-
export const AllVariants: Story = {
|
|
146
|
-
render: () => (
|
|
147
|
-
<div className="w-full max-w-2xl space-y-8">
|
|
148
|
-
<div>
|
|
149
|
-
<h3 className="mb-3 text-lg font-semibold">Basic Skeleton</h3>
|
|
150
|
-
<Skeleton count={3} />
|
|
151
|
-
</div>
|
|
152
|
-
<div>
|
|
153
|
-
<h3 className="mb-3 text-lg font-semibold">Custom Styled</h3>
|
|
154
|
-
<Skeleton count={2} className="h-8 rounded-lg" />
|
|
155
|
-
</div>
|
|
156
|
-
<div>
|
|
157
|
-
<h3 className="mb-3 text-lg font-semibold">In Card</h3>
|
|
158
|
-
<div className="rounded-lg border border-border-default p-6 space-y-4">
|
|
159
|
-
<Skeleton count={1} className="h-6 w-3/4" />
|
|
160
|
-
<Skeleton count={2} />
|
|
161
|
-
<Skeleton count={1} className="h-10 w-full" />
|
|
162
|
-
</div>
|
|
163
|
-
</div>
|
|
164
|
-
<div>
|
|
165
|
-
<h3 className="mb-3 text-lg font-semibold">Page Skeleton</h3>
|
|
166
|
-
<div className="border border-border-default rounded p-4">
|
|
167
|
-
<PageSkeleton />
|
|
168
|
-
</div>
|
|
169
|
-
</div>
|
|
170
|
-
</div>
|
|
171
|
-
),
|
|
172
|
-
parameters: {
|
|
173
|
-
docs: {
|
|
174
|
-
description: {
|
|
175
|
-
story: "Showcase of all skeleton variants and use cases.",
|
|
176
|
-
},
|
|
177
|
-
},
|
|
178
|
-
},
|
|
179
|
-
};
|
|
180
|
-
|
|
1
|
+
import { Skeleton, PageSkeleton } from "./index";
|
|
2
|
+
import { DocsPage } from "@shared/stories/DocsTemplate";
|
|
3
|
+
|
|
4
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
5
|
+
|
|
6
|
+
const meta: Meta<typeof Skeleton> = {
|
|
7
|
+
title: "Components/Skeleton",
|
|
8
|
+
component: Skeleton,
|
|
9
|
+
tags: ["autodocs"],
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: "centered",
|
|
12
|
+
docs: {
|
|
13
|
+
page: DocsPage,
|
|
14
|
+
description: {
|
|
15
|
+
component:
|
|
16
|
+
"Loading skeleton components for displaying placeholder content while data is being loaded.",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
argTypes: {
|
|
21
|
+
count: {
|
|
22
|
+
control: { type: "number" },
|
|
23
|
+
description: "Number of skeleton lines to display",
|
|
24
|
+
},
|
|
25
|
+
className: {
|
|
26
|
+
control: { type: "text" },
|
|
27
|
+
description: "Additional CSS classes",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
args: {
|
|
31
|
+
count: 1,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export default meta;
|
|
36
|
+
type Story = StoryObj<typeof meta>;
|
|
37
|
+
|
|
38
|
+
// Default skeleton
|
|
39
|
+
export const Default: Story = {
|
|
40
|
+
args: {},
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// Multiple counts
|
|
44
|
+
export const Multiple: Story = {
|
|
45
|
+
args: {
|
|
46
|
+
count: 3,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Custom styling
|
|
51
|
+
export const CustomStyling: Story = {
|
|
52
|
+
args: {
|
|
53
|
+
count: 2,
|
|
54
|
+
className: "h-12 rounded-lg",
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// Different counts
|
|
59
|
+
export const DifferentCounts: Story = {
|
|
60
|
+
render: () => (
|
|
61
|
+
<div className="w-full max-w-md space-y-4">
|
|
62
|
+
<div>
|
|
63
|
+
<h4 className="mb-2 text-sm font-medium">Single Line</h4>
|
|
64
|
+
<Skeleton count={1} />
|
|
65
|
+
</div>
|
|
66
|
+
<div>
|
|
67
|
+
<h4 className="mb-2 text-sm font-medium">Three Lines</h4>
|
|
68
|
+
<Skeleton count={3} />
|
|
69
|
+
</div>
|
|
70
|
+
<div>
|
|
71
|
+
<h4 className="mb-2 text-sm font-medium">Five Lines</h4>
|
|
72
|
+
<Skeleton count={5} />
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
),
|
|
76
|
+
parameters: {
|
|
77
|
+
docs: {
|
|
78
|
+
description: {
|
|
79
|
+
story: "Skeleton with different line counts.",
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Page skeleton
|
|
86
|
+
export const PageSkeletonExample: Story = {
|
|
87
|
+
render: () => (
|
|
88
|
+
<div className="w-full">
|
|
89
|
+
<PageSkeleton />
|
|
90
|
+
</div>
|
|
91
|
+
),
|
|
92
|
+
parameters: {
|
|
93
|
+
layout: "fullscreen",
|
|
94
|
+
docs: {
|
|
95
|
+
description: {
|
|
96
|
+
story: "PageSkeleton component for full page loading states.",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// In card
|
|
103
|
+
export const InCard: Story = {
|
|
104
|
+
render: () => (
|
|
105
|
+
<div className="w-full max-w-sm rounded-lg border border-border-default p-6 space-y-4">
|
|
106
|
+
<Skeleton count={1} className="h-6 w-3/4" />
|
|
107
|
+
<Skeleton count={2} />
|
|
108
|
+
<Skeleton count={1} className="h-10 w-full" />
|
|
109
|
+
</div>
|
|
110
|
+
),
|
|
111
|
+
parameters: {
|
|
112
|
+
docs: {
|
|
113
|
+
description: {
|
|
114
|
+
story: "Skeleton used within a card layout.",
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// List skeleton
|
|
121
|
+
export const ListSkeleton: Story = {
|
|
122
|
+
render: () => (
|
|
123
|
+
<div className="w-full max-w-md space-y-3">
|
|
124
|
+
{[1, 2, 3, 4, 5].map((i) => (
|
|
125
|
+
<div key={i} className="flex items-center gap-3">
|
|
126
|
+
<Skeleton count={1} className="h-12 w-12 rounded-full" />
|
|
127
|
+
<div className="flex-1 space-y-2">
|
|
128
|
+
<Skeleton count={1} className="h-4 w-3/4" />
|
|
129
|
+
<Skeleton count={1} className="h-3 w-1/2" />
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
))}
|
|
133
|
+
</div>
|
|
134
|
+
),
|
|
135
|
+
parameters: {
|
|
136
|
+
docs: {
|
|
137
|
+
description: {
|
|
138
|
+
story: "Skeleton used for loading list items.",
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// All variants showcase
|
|
145
|
+
export const AllVariants: Story = {
|
|
146
|
+
render: () => (
|
|
147
|
+
<div className="w-full max-w-2xl space-y-8">
|
|
148
|
+
<div>
|
|
149
|
+
<h3 className="mb-3 text-lg font-semibold">Basic Skeleton</h3>
|
|
150
|
+
<Skeleton count={3} />
|
|
151
|
+
</div>
|
|
152
|
+
<div>
|
|
153
|
+
<h3 className="mb-3 text-lg font-semibold">Custom Styled</h3>
|
|
154
|
+
<Skeleton count={2} className="h-8 rounded-lg" />
|
|
155
|
+
</div>
|
|
156
|
+
<div>
|
|
157
|
+
<h3 className="mb-3 text-lg font-semibold">In Card</h3>
|
|
158
|
+
<div className="rounded-lg border border-border-default p-6 space-y-4">
|
|
159
|
+
<Skeleton count={1} className="h-6 w-3/4" />
|
|
160
|
+
<Skeleton count={2} />
|
|
161
|
+
<Skeleton count={1} className="h-10 w-full" />
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
<div>
|
|
165
|
+
<h3 className="mb-3 text-lg font-semibold">Page Skeleton</h3>
|
|
166
|
+
<div className="border border-border-default rounded p-4">
|
|
167
|
+
<PageSkeleton />
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
),
|
|
172
|
+
parameters: {
|
|
173
|
+
docs: {
|
|
174
|
+
description: {
|
|
175
|
+
story: "Showcase of all skeleton variants and use cases.",
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
|
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
import { FC } from "react";
|
|
2
|
-
import { SkeletonProps } from "./types";
|
|
3
|
-
|
|
4
|
-
export const Skeleton: FC<SkeletonProps> = ({ className = "", count = 1 }) => {
|
|
5
|
-
return (
|
|
6
|
-
<div className="animate-pulse space-y-4">
|
|
7
|
-
{Array.from({ length: count }).map((_, index) => (
|
|
8
|
-
<div
|
|
9
|
-
key={index}
|
|
10
|
-
className={`h-8 rounded bg-skeleton-bg-start ${className}`}
|
|
11
|
-
style={{ opacity: 1 - index * 0.1 }}
|
|
12
|
-
/>
|
|
13
|
-
))}
|
|
14
|
-
</div>
|
|
15
|
-
);
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
Skeleton.displayName = "Skeleton";
|
|
19
|
-
|
|
20
|
-
export type { SkeletonProps };
|
|
21
|
-
|
|
22
|
-
export const PageSkeleton: FC = () => {
|
|
23
|
-
return (
|
|
24
|
-
<div
|
|
25
|
-
className="item-center mx-auto mt-4 flex animate-pulse flex-col justify-center gap-10 px-1 md:max-w-[48.375rem] md:gap-16 md:px-0"
|
|
26
|
-
data-testid="generic-skeleton"
|
|
27
|
-
>
|
|
28
|
-
{/* Title */}
|
|
29
|
-
<div
|
|
30
|
-
className="h-12 w-full rounded-lg bg-skeleton-bg-start"
|
|
31
|
-
data-testid="title"
|
|
32
|
-
/>
|
|
33
|
-
|
|
34
|
-
{/* Subtitle */}
|
|
35
|
-
<div className="item-center flex flex-col gap-6" data-testid="subtitle">
|
|
36
|
-
<div className="h-5 w-full rounded-lg bg-skeleton-bg-start" />
|
|
37
|
-
<div className="h-5 w-full rounded-lg bg-skeleton-bg-start" />
|
|
38
|
-
</div>
|
|
39
|
-
|
|
40
|
-
{/* Content */}
|
|
41
|
-
<div className="item-center flex flex-col gap-3" data-testid="content">
|
|
42
|
-
<div className="h-12 w-full rounded-lg bg-skeleton-bg-start" />
|
|
43
|
-
<div className="h-12 w-full rounded-lg bg-skeleton-bg-start" />
|
|
44
|
-
</div>
|
|
45
|
-
|
|
46
|
-
{/* Additional Information */}
|
|
47
|
-
<div
|
|
48
|
-
className="item-center flex flex-col gap-6"
|
|
49
|
-
data-testid="additional-info"
|
|
50
|
-
>
|
|
51
|
-
<div className="h-5 w-full rounded-lg bg-skeleton-bg-end" />
|
|
52
|
-
<div className="h-5 w-full rounded-lg bg-skeleton-bg-end" />
|
|
53
|
-
</div>
|
|
54
|
-
|
|
55
|
-
{/* CTA button */}
|
|
56
|
-
<div className="item-center flex justify-center" data-testid="cta-button">
|
|
57
|
-
<div className="h-12 w-full rounded-lg bg-skeleton-bg-end md:w-[22.125rem]" />
|
|
58
|
-
</div>
|
|
59
|
-
</div>
|
|
60
|
-
);
|
|
61
|
-
};
|
|
1
|
+
import { FC } from "react";
|
|
2
|
+
import { SkeletonProps } from "./types";
|
|
3
|
+
|
|
4
|
+
export const Skeleton: FC<SkeletonProps> = ({ className = "", count = 1 }) => {
|
|
5
|
+
return (
|
|
6
|
+
<div className="animate-pulse space-y-4">
|
|
7
|
+
{Array.from({ length: count }).map((_, index) => (
|
|
8
|
+
<div
|
|
9
|
+
key={index}
|
|
10
|
+
className={`h-8 rounded bg-skeleton-bg-start ${className}`}
|
|
11
|
+
style={{ opacity: 1 - index * 0.1 }}
|
|
12
|
+
/>
|
|
13
|
+
))}
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
Skeleton.displayName = "Skeleton";
|
|
19
|
+
|
|
20
|
+
export type { SkeletonProps };
|
|
21
|
+
|
|
22
|
+
export const PageSkeleton: FC = () => {
|
|
23
|
+
return (
|
|
24
|
+
<div
|
|
25
|
+
className="item-center mx-auto mt-4 flex animate-pulse flex-col justify-center gap-10 px-1 md:max-w-[48.375rem] md:gap-16 md:px-0"
|
|
26
|
+
data-testid="generic-skeleton"
|
|
27
|
+
>
|
|
28
|
+
{/* Title */}
|
|
29
|
+
<div
|
|
30
|
+
className="h-12 w-full rounded-lg bg-skeleton-bg-start"
|
|
31
|
+
data-testid="title"
|
|
32
|
+
/>
|
|
33
|
+
|
|
34
|
+
{/* Subtitle */}
|
|
35
|
+
<div className="item-center flex flex-col gap-6" data-testid="subtitle">
|
|
36
|
+
<div className="h-5 w-full rounded-lg bg-skeleton-bg-start" />
|
|
37
|
+
<div className="h-5 w-full rounded-lg bg-skeleton-bg-start" />
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
{/* Content */}
|
|
41
|
+
<div className="item-center flex flex-col gap-3" data-testid="content">
|
|
42
|
+
<div className="h-12 w-full rounded-lg bg-skeleton-bg-start" />
|
|
43
|
+
<div className="h-12 w-full rounded-lg bg-skeleton-bg-start" />
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
{/* Additional Information */}
|
|
47
|
+
<div
|
|
48
|
+
className="item-center flex flex-col gap-6"
|
|
49
|
+
data-testid="additional-info"
|
|
50
|
+
>
|
|
51
|
+
<div className="h-5 w-full rounded-lg bg-skeleton-bg-end" />
|
|
52
|
+
<div className="h-5 w-full rounded-lg bg-skeleton-bg-end" />
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
{/* CTA button */}
|
|
56
|
+
<div className="item-center flex justify-center" data-testid="cta-button">
|
|
57
|
+
<div className="h-12 w-full rounded-lg bg-skeleton-bg-end md:w-[22.125rem]" />
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type SkeletonProps = {
|
|
2
|
-
className?: string;
|
|
3
|
-
count?: number;
|
|
1
|
+
export type SkeletonProps = {
|
|
2
|
+
className?: string;
|
|
3
|
+
count?: number;
|
|
4
4
|
}
|