@stackshift-ui/team 6.0.3 → 6.0.4

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/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "@stackshift-ui/team",
3
3
  "description": "",
4
- "version": "6.0.3",
4
+ "version": "6.0.4",
5
5
  "private": false,
6
6
  "sideEffects": false,
7
7
  "main": "./dist/index.js",
8
8
  "module": "./dist/index.mjs",
9
9
  "types": "./dist/index.d.ts",
10
10
  "files": [
11
- "dist/**"
11
+ "dist/**",
12
+ "src"
12
13
  ],
13
14
  "author": "WebriQ <info@webriq.com>",
14
15
  "devDependencies": {
@@ -33,17 +34,17 @@
33
34
  },
34
35
  "dependencies": {
35
36
  "classnames": "^2.5.1",
36
- "@stackshift-ui/system": "6.0.2",
37
- "@stackshift-ui/avatar": "6.0.2",
38
- "@stackshift-ui/button": "6.0.2",
39
- "@stackshift-ui/card": "6.0.2",
37
+ "@stackshift-ui/button": "6.0.3",
38
+ "@stackshift-ui/card": "6.0.3",
39
+ "@stackshift-ui/system": "6.0.3",
40
40
  "@stackshift-ui/scripts": "6.0.2",
41
- "@stackshift-ui/text": "6.0.2",
42
- "@stackshift-ui/image": "6.0.2",
43
- "@stackshift-ui/section": "6.0.2",
44
- "@stackshift-ui/container": "6.0.2",
45
- "@stackshift-ui/flex": "6.0.2",
46
- "@stackshift-ui/heading": "6.0.2"
41
+ "@stackshift-ui/heading": "6.0.3",
42
+ "@stackshift-ui/text": "6.0.3",
43
+ "@stackshift-ui/image": "6.0.3",
44
+ "@stackshift-ui/section": "6.0.3",
45
+ "@stackshift-ui/container": "6.0.3",
46
+ "@stackshift-ui/flex": "6.0.3",
47
+ "@stackshift-ui/avatar": "6.0.3"
47
48
  },
48
49
  "peerDependencies": {
49
50
  "@types/react": "16.8 - 19",
package/src/index.ts ADDED
@@ -0,0 +1,8 @@
1
+ "use client";
2
+
3
+ // component exports
4
+ export * from "./team";
5
+ export * from "./team_a";
6
+ export * from "./team_b";
7
+ export * from "./team_c";
8
+ export * from "./team_d";
@@ -0,0 +1,13 @@
1
+ import { cleanup, render, screen } from "@testing-library/react";
2
+ import { afterEach, describe, test } from "vitest";
3
+ import { Team } from "./team";
4
+
5
+ describe.concurrent("team", () => {
6
+ afterEach(cleanup);
7
+
8
+ test.skip("Dummy test - test if renders without errors", ({ expect }) => {
9
+ const clx = "my-class";
10
+ render(<Team />);
11
+ expect(screen.getByTestId("{ kebabCase name }}").classList).toContain(clx);
12
+ });
13
+ });
package/src/team.tsx ADDED
@@ -0,0 +1,39 @@
1
+ import { lazy } from "react";
2
+ import { SectionsProps, Team as ITeam } from "./types";
3
+
4
+ const Variants = {
5
+ variant_a: lazy(() => import("./team_a")),
6
+ variant_b: lazy(() => import("./team_b")),
7
+ variant_c: lazy(() => import("./team_c")),
8
+ variant_d: lazy(() => import("./team_d")),
9
+ };
10
+
11
+ export interface MemberTextProps {
12
+ member: {
13
+ name?: string;
14
+ plainText?: string;
15
+ jobTitle?: string;
16
+ };
17
+ }
18
+
19
+ export interface TeamsProps {
20
+ caption?: string;
21
+ title?: string;
22
+ team?: ITeam[];
23
+ }
24
+
25
+ const displayName = "Team";
26
+
27
+ export const Team: React.FC<SectionsProps> = ({ data }) => {
28
+ const variant = data?.variant;
29
+ const Variant = variant && Variants[variant as keyof typeof Variants];
30
+
31
+ const props = {
32
+ caption: data?.variants?.subtitle ?? undefined,
33
+ title: data?.variants?.title ?? undefined,
34
+ team: data?.variants?.teams ?? undefined,
35
+ };
36
+ return Variant ? <Variant {...props} /> : null;
37
+ };
38
+
39
+ Team.displayName = displayName;
package/src/team_a.tsx ADDED
@@ -0,0 +1,77 @@
1
+ import React from "react";
2
+ import { Avatar } from "@stackshift-ui/avatar";
3
+ import { Card } from "@stackshift-ui/card";
4
+ import { Heading } from "@stackshift-ui/heading";
5
+ import { Text } from "@stackshift-ui/text";
6
+ import { Section } from "@stackshift-ui/section";
7
+ import { Container } from "@stackshift-ui/container";
8
+ import { Flex } from "@stackshift-ui/flex";
9
+ import { Team as iTeam } from "./types";
10
+ import { MemberTextProps, TeamsProps } from ".";
11
+
12
+ export default function Team_A({ caption, title, team }: TeamsProps) {
13
+ return (
14
+ <Section className="py-20 bg-background">
15
+ <Container maxWidth={1000}>
16
+ <Container maxWidth={576} className="mb-10 text-center">
17
+ <CaptionAndTitle caption={caption} title={title} />
18
+ </Container>
19
+ <Teams team={team} />
20
+ </Container>
21
+ </Section>
22
+ );
23
+ }
24
+
25
+ function CaptionAndTitle({ caption, title }: { caption?: string; title?: string }) {
26
+ return (
27
+ <React.Fragment>
28
+ {caption ? (
29
+ <Text weight="bold" className="text-secondary">
30
+ {caption}
31
+ </Text>
32
+ ) : null}
33
+ {title ? (
34
+ <Heading type="h2" fontSize="2xl">
35
+ {title}
36
+ </Heading>
37
+ ) : null}
38
+ </React.Fragment>
39
+ );
40
+ }
41
+
42
+ function Teams({ team }: { team?: iTeam[] }) {
43
+ if (!team) return null;
44
+
45
+ return (
46
+ <Flex wrap>
47
+ {team?.map(member => (
48
+ <div className="w-full px-3 mb-6 md:w-1/2 lg:w-1/3" key={member?.name}>
49
+ <Card className="py-24 text-center">
50
+ {member?.mainImage?.image && (
51
+ <Avatar
52
+ className="mx-auto border-0"
53
+ size={96}
54
+ alt={member?.mainImage?.alt ?? `team-member-${member?.name}-profile-image`}
55
+ src={`${member?.mainImage?.image}`}
56
+ />
57
+ )}
58
+ <TeamMemberText member={member} />
59
+ </Card>
60
+ </div>
61
+ ))}
62
+ </Flex>
63
+ );
64
+ }
65
+
66
+ function TeamMemberText({ member }: MemberTextProps) {
67
+ return (
68
+ <React.Fragment>
69
+ <Heading type="h3" className="mb-2 text-xl lg:text-2xl">
70
+ {member?.name}
71
+ </Heading>
72
+ <Text muted>{member?.jobTitle}</Text>
73
+ </React.Fragment>
74
+ );
75
+ }
76
+
77
+ export { Team_A };
package/src/team_b.tsx ADDED
@@ -0,0 +1,128 @@
1
+ import { Button } from "@stackshift-ui/button";
2
+ import { Card } from "@stackshift-ui/card";
3
+ import { Container } from "@stackshift-ui/container";
4
+ import { Flex } from "@stackshift-ui/flex";
5
+ import { Image } from "@stackshift-ui/image";
6
+ import { Section } from "@stackshift-ui/section";
7
+ import { Text } from "@stackshift-ui/text";
8
+ import React from "react";
9
+ import { MemberTextProps, TeamsProps } from ".";
10
+ import { Team as iTeam } from "./types";
11
+
12
+ export default function Team_B({ team }: TeamsProps) {
13
+ const [activeTab, setActiveTab] = React.useState<string | undefined>(team?.[0]?.name);
14
+
15
+ const filteredMembers = React.useMemo(
16
+ () => team?.filter(member => member?.name === activeTab) || [],
17
+ [team, activeTab],
18
+ );
19
+
20
+ return (
21
+ <Section className="py-20 bg-background">
22
+ <Container maxWidth={1280}>
23
+ <Flex wrap align="center">
24
+ <TeamTabs team={team} activeTab={activeTab} setActiveTab={setActiveTab} />
25
+ <TeamMembersList members={filteredMembers} />
26
+ </Flex>
27
+ </Container>
28
+ </Section>
29
+ );
30
+ }
31
+
32
+ interface TeamTabsProps {
33
+ team?: iTeam[];
34
+ activeTab?: string;
35
+ setActiveTab: (name: string) => void;
36
+ }
37
+
38
+ function TeamTabs({ team, activeTab, setActiveTab }: TeamTabsProps) {
39
+ return (
40
+ <div className="w-full px-3 mb-8 lg:mb-0 lg:w-1/3">
41
+ <Flex
42
+ as="ul"
43
+ wrap
44
+ justify="center"
45
+ direction="row"
46
+ className="space-x-6 lg:flex-col lg:justify-start lg:space-x-0">
47
+ {team?.map(item => (
48
+ <TeamTab key={item.name} data={item} activeTab={activeTab} setActiveTab={setActiveTab} />
49
+ ))}
50
+ </Flex>
51
+ </div>
52
+ );
53
+ }
54
+
55
+ interface TeamTabProps {
56
+ data?: iTeam;
57
+ activeTab?: string;
58
+ setActiveTab: (name: string) => void;
59
+ }
60
+
61
+ function TeamTab({ data, activeTab, setActiveTab }: TeamTabProps) {
62
+ if (!data || !data.name) return null;
63
+
64
+ return (
65
+ <li>
66
+ <Button
67
+ as="button"
68
+ variant="unstyled"
69
+ ariaLabel={data.name}
70
+ className={`mb-4 text-xl lg:text-2xl ${
71
+ data.name === activeTab ? "text-gray-900" : "text-gray-500"
72
+ } font-bold hover:text-gray-500 focus:outline-none`}
73
+ onClick={() => setActiveTab(data.name ?? "")}>
74
+ {data.name}
75
+ </Button>
76
+ </li>
77
+ );
78
+ }
79
+
80
+ function TeamMembersList({ members }: { members?: iTeam[] }) {
81
+ if (!members) return null;
82
+
83
+ return (
84
+ <div className="w-full px-3 lg:w-2/3">
85
+ {members.map((member, index) => (
86
+ <TeamMemberCard key={index} member={member} />
87
+ ))}
88
+ </div>
89
+ );
90
+ }
91
+
92
+ function TeamMemberCard({ member }: { member?: iTeam }) {
93
+ if (!member) return null;
94
+
95
+ return (
96
+ <Card className="flex p-6 bg-white">
97
+ {member.mainImage?.image && (
98
+ <Image
99
+ className="object-cover overflow-hidden rounded-global"
100
+ src={`${member.mainImage.image}`}
101
+ sizes="100vw"
102
+ width={329}
103
+ height={494}
104
+ alt={member.mainImage.alt ?? `team-member-${member.name}-profile-image`}
105
+ />
106
+ )}
107
+ <TeamMmeberText member={member} />
108
+ </Card>
109
+ );
110
+ }
111
+
112
+ function TeamMmeberText({ member }: MemberTextProps) {
113
+ return (
114
+ <div className="order-last w-1/2 pt-6 pl-6 mt-6">
115
+ <Text weight="bold" fontSize="2xl">
116
+ {member.name}
117
+ </Text>
118
+ <Text className="mb-6" muted>
119
+ {member.jobTitle}
120
+ </Text>
121
+ <Text className="mb-6 text-justify" muted>
122
+ {member.plainText}
123
+ </Text>
124
+ </div>
125
+ );
126
+ }
127
+
128
+ export { Team_B };
package/src/team_c.tsx ADDED
@@ -0,0 +1,75 @@
1
+ import { Card } from "@stackshift-ui/card";
2
+ import { Container } from "@stackshift-ui/container";
3
+ import { Flex } from "@stackshift-ui/flex";
4
+ import { Heading } from "@stackshift-ui/heading";
5
+ import { Image } from "@stackshift-ui/image";
6
+ import { Section } from "@stackshift-ui/section";
7
+ import { Text } from "@stackshift-ui/text";
8
+ import React from "react";
9
+ import { MemberTextProps, TeamsProps } from ".";
10
+ import { Team as iTeam } from "./types";
11
+
12
+ export default function Team_C({ caption, title, team }: TeamsProps) {
13
+ return (
14
+ <Section className="py-20 bg-background">
15
+ <Container maxWidth={1280}>
16
+ <CaptionAndTitle caption={caption} title={title} />
17
+ <TeamMemberCard team={team} />
18
+ </Container>
19
+ </Section>
20
+ );
21
+ }
22
+
23
+ function CaptionAndTitle({ caption, title }: { caption?: string; title?: string }) {
24
+ return (
25
+ <Container maxWidth={576} className="mb-12 text-center ">
26
+ {caption && (
27
+ <Text weight="bold" className="text-primary">
28
+ {caption}
29
+ </Text>
30
+ )}
31
+ {title && <Heading>{title}</Heading>}
32
+ </Container>
33
+ );
34
+ }
35
+
36
+ function TeamMemberCard({ team }: { team?: iTeam[] }) {
37
+ if (!team) return null;
38
+
39
+ return (
40
+ <Flex wrap>
41
+ {team.map(member => (
42
+ <div className="w-full px-3 mb-6 md:w-1/2 lg:w-1/3" key={member?.name}>
43
+ <Card className="w-full p-0 pb-8 overflow-hidden text-center">
44
+ {member.mainImage?.image && (
45
+ <div>
46
+ <Image
47
+ className="mb-8 h-[345px] w-full object-cover rounded-global"
48
+ sizes="100vw"
49
+ src={`${member?.mainImage?.image}`}
50
+ width={345}
51
+ height={256}
52
+ alt={member?.mainImage?.alt ?? `team-member-${member?.name}-profile-image`}
53
+ />
54
+ </div>
55
+ )}
56
+ <TeamMemberText member={member} />
57
+ </Card>
58
+ </div>
59
+ ))}
60
+ </Flex>
61
+ );
62
+ }
63
+
64
+ function TeamMemberText({ member }: MemberTextProps) {
65
+ return (
66
+ <React.Fragment>
67
+ <Text fontSize="2xl" weight="bold" className="mb-2">
68
+ {member?.name}
69
+ </Text>
70
+ <Text muted>{member?.jobTitle}</Text>
71
+ </React.Fragment>
72
+ );
73
+ }
74
+
75
+ export { Team_C };
package/src/team_d.tsx ADDED
@@ -0,0 +1,77 @@
1
+ import { Card } from "@stackshift-ui/card";
2
+ import { Container } from "@stackshift-ui/container";
3
+ import { Flex } from "@stackshift-ui/flex";
4
+ import { Heading } from "@stackshift-ui/heading";
5
+ import { Image } from "@stackshift-ui/image";
6
+ import { Section } from "@stackshift-ui/section";
7
+ import { Text } from "@stackshift-ui/text";
8
+ import { MemberTextProps, TeamsProps } from ".";
9
+ import { Team as iTeam } from "./types";
10
+
11
+ export default function Team_D({ caption, title, team }: TeamsProps) {
12
+ return (
13
+ <Section className="py-20 bg-background">
14
+ <Container maxWidth={1280}>
15
+ <CaptionAndTitle caption={caption} title={title} />
16
+ <TeamMemberCard team={team} />
17
+ </Container>
18
+ </Section>
19
+ );
20
+ }
21
+
22
+ function CaptionAndTitle({ caption, title }: { caption?: string; title?: string }) {
23
+ return (
24
+ <Container maxWidth={576} className="mb-8 text-center lg:mb-16">
25
+ {caption && (
26
+ <Text weight="bold" className="text-secondary">
27
+ {caption}
28
+ </Text>
29
+ )}
30
+ {title && <Heading>{title}</Heading>}
31
+ </Container>
32
+ );
33
+ }
34
+
35
+ function TeamMemberCard({ team }: { team?: iTeam[] }) {
36
+ if (!team) return null;
37
+
38
+ return (
39
+ <Flex wrap>
40
+ {team &&
41
+ team.map((member, index) => (
42
+ <div className="w-full px-4 mb-6 lg:w-1/2" key={index}>
43
+ <Card className="items-center p-0 overflow-hidden sm:flex sm:flex-wrap lg:block xl:flex">
44
+ {member.mainImage?.image && (
45
+ <div>
46
+ <Image
47
+ className="h-[320px] w-full object-cover rounded-global sm:w-[179px] lg:w-full xl:w-[179px]"
48
+ sizes="100vw"
49
+ src={`${member?.mainImage?.image}`}
50
+ width={179}
51
+ height={320}
52
+ alt={member?.mainImage?.alt ?? `team-member-${member?.name}-profile-image`}
53
+ />
54
+ </div>
55
+ )}
56
+ <TeamMemberText member={member} />
57
+ </Card>
58
+ </div>
59
+ ))}
60
+ </Flex>
61
+ );
62
+ }
63
+
64
+ function TeamMemberText({ member }: MemberTextProps) {
65
+ return (
66
+ <div className="p-4 sm:w-2/3 lg:w-full lg:pl-6 xl:w-2/3">
67
+ <Text weight="bold" fontSize="2xl" className="mb-2">
68
+ {member?.name}
69
+ </Text>
70
+ <Text className="mb-4 leading-loose" muted>
71
+ {member?.plainText}
72
+ </Text>
73
+ </div>
74
+ );
75
+ }
76
+
77
+ export { Team_D };
package/src/types.ts ADDED
@@ -0,0 +1,412 @@
1
+ export type StyleVariants<T extends string> = Record<T, string>;
2
+
3
+ export type Socials = "facebook" | "instagram" | "youtube" | "linkedin" | "twitter";
4
+ export interface MainImage {
5
+ image: string;
6
+ alt?: string;
7
+ }
8
+
9
+ export interface LabeledRoute extends ConditionalLink {
10
+ ariaLabel?: string;
11
+ label?: string;
12
+ linkTarget?: string;
13
+ linkType?: string;
14
+ _type?: string;
15
+ linkInternal?: any;
16
+ }
17
+ export interface ConditionalLink {
18
+ type?: string;
19
+ internalLink?: string | null;
20
+ externalLink?: string | null;
21
+ }
22
+
23
+ export interface StatItems {
24
+ label?: string;
25
+ mainImage?: MainImage;
26
+ value?: string;
27
+ _key?: string;
28
+ _type?: string;
29
+ }
30
+
31
+ export interface Logo extends ConditionalLink {
32
+ alt?: string;
33
+ linkTarget?: string;
34
+ image?: string;
35
+ }
36
+
37
+ export interface Images {
38
+ image?: string;
39
+ _key?: string;
40
+ _type?: string;
41
+ alt?: string;
42
+ }
43
+
44
+ export interface ContactDetails {
45
+ addressInfo?: string;
46
+ contactInfo?: string;
47
+ emailInfo?: string;
48
+ _key?: string;
49
+ }
50
+
51
+ export interface SocialLink {
52
+ socialMedia?: string | null;
53
+ socialMediaLink?: string | null;
54
+ _key?: string | null;
55
+ _type?: string | null;
56
+ socialMediaIcon?: {
57
+ alt?: string;
58
+ image?: string;
59
+ } | null;
60
+ socialMediaPlatform?: string | null;
61
+ }
62
+
63
+ export interface LabeledRouteWithKey extends LabeledRoute {
64
+ _key?: string;
65
+ }
66
+
67
+ export interface ArrayOfImageTitleAndText {
68
+ mainImage?: {
69
+ alt?: string;
70
+ image?: string;
71
+ };
72
+ plainText?: string;
73
+ title?: string;
74
+ _key?: string;
75
+ _type?: string;
76
+ }
77
+
78
+ export interface FeaturedItem {
79
+ description?: string;
80
+ mainImage?: MainImage;
81
+ title?: string;
82
+ subtitle?: string;
83
+ _key?: string;
84
+ _type?: string;
85
+ }
86
+
87
+ export interface ArrayOfTitleAndText {
88
+ _key?: string;
89
+ plainText?: string;
90
+ title?: string;
91
+ }
92
+
93
+ export interface BlogPost extends SanityBody {
94
+ authors?: Author[] | null;
95
+ body?: any;
96
+ categories?: Category[] | null;
97
+ excerpt?: string | null;
98
+ link?: string | null;
99
+ mainImage?: string | null;
100
+ publishedAt?: string;
101
+ seo?: Seo | null;
102
+ slug?: SanitySlug | null;
103
+ title?: string;
104
+ }
105
+
106
+ export interface Seo {
107
+ _type?: string;
108
+ seoTitle?: string;
109
+ seoDescription?: string;
110
+ seoImage?: string;
111
+ seoKeywords?: string;
112
+ seoSynonyms?: string;
113
+ }
114
+
115
+ export interface SanitySlug {
116
+ current?: string;
117
+ _type?: "slug";
118
+ }
119
+
120
+ export interface SanityBody {
121
+ _createdAt?: string;
122
+ _id?: string;
123
+ _rev?: string;
124
+ _type?: string;
125
+ _updatedAt?: string;
126
+ }
127
+
128
+ export interface Author extends SanityBody {
129
+ link?: string | null;
130
+ bio?: string | null;
131
+ name?: string | null;
132
+ slug?: SanitySlug | null;
133
+ image?: string | null;
134
+ profile?: {
135
+ alt: string;
136
+ image: string;
137
+ } | null;
138
+ }
139
+
140
+ export interface Category extends SanityBody {
141
+ title?: string;
142
+ }
143
+
144
+ export interface Form {
145
+ id?: string | null;
146
+ buttonLabel?: string | null;
147
+ name?: string | null;
148
+ subtitle?: string | null;
149
+ fields?: FormFields[] | null;
150
+ thankYouPage?: ThankYouPage | null;
151
+ }
152
+
153
+ export interface FormFields {
154
+ name?: string;
155
+ placeholder?: string;
156
+ pricingType?: string;
157
+ type?: FormTypes;
158
+ _key?: string;
159
+ _type?: string;
160
+ isRequired?: boolean;
161
+ label?: string;
162
+ items?: string[];
163
+ }
164
+
165
+ export type FormTypes =
166
+ | "inputText"
167
+ | "inputEmail"
168
+ | "inputPassword"
169
+ | "inputNumber"
170
+ | "textarea"
171
+ | "inputFile"
172
+ | "inputRadio"
173
+ | "inputCheckbox"
174
+ | "inputSelect";
175
+
176
+ export interface ThankYouPage {
177
+ externalLink?: string | null;
178
+ internalLink?: string | null;
179
+ linkInternal?: any;
180
+ linkTarget?: string;
181
+ linkType?: string;
182
+ type?: string;
183
+ }
184
+
185
+ //Used on different sections
186
+ export interface SectionsProps {
187
+ template?: Template;
188
+ data?: Sections;
189
+ variant?: string | null | undefined;
190
+ schema?: Variants;
191
+ }
192
+
193
+ export interface Sections extends SanityBody {
194
+ label?: string;
195
+ variant?: string;
196
+ variants?: Variants;
197
+ _key?: string;
198
+ }
199
+
200
+ //*EDIT THIS SECTION WHEN CREATING/UPDATING SCHEMAS ON STUDIO */
201
+ export interface Variants {
202
+ template?: Template;
203
+ multipleMenus?: any;
204
+ arrayOfTitleAndText?: ArrayOfTitleAndText[] | null;
205
+ logo?: Logo | null;
206
+ primaryButton?: LabeledRoute | null;
207
+ secondaryButton?: LabeledRoute | null;
208
+ routes?: LabeledRouteWithKey[] | null;
209
+ menu?: LabeledRouteWithKey[] | null;
210
+ plans?: Plans[] | null;
211
+ formLinks?: LabeledRouteWithKey[] | null;
212
+ portfolios?: Portfolios[] | null;
213
+ portfoliosWithCategories?: PortfoliosWithCategories[] | null;
214
+ length?: number;
215
+ signInLink?: LabeledRoute | null;
216
+ signinLink?: LabeledRoute | null;
217
+ tags?: string[] | null;
218
+ posts?: BlogPost[] | null;
219
+ blogsPerPage?: number | null;
220
+ form?: Form | null;
221
+ collections?: Collection | null;
222
+ products?: CollectionProduct | null;
223
+ allProducts?: Collection[];
224
+ subtitle?: string | null;
225
+ caption?: string | null;
226
+ title?: string | null;
227
+ plainText?: string | null;
228
+ contactDescription?: string | null;
229
+ officeInformation?: string | null;
230
+ contactEmail?: string | null;
231
+ contactNumber?: string | null;
232
+ socialLinks?: SocialLink[] | null;
233
+ block?: any;
234
+ heading?: string | null;
235
+ acceptButtonLabel?: string | null;
236
+ declineButtonLabel?: string | null;
237
+ faqsWithCategories?: FaqsWithCategory[] | null;
238
+ faqs?: AskedQuestion[] | null;
239
+ arrayOfImageTitleAndText?: ArrayOfImageTitleAndText[] | null;
240
+ description?: string | null;
241
+ featuredItems?: FeaturedItem[] | null;
242
+ images?: Images[] | null;
243
+ contactDetails?: ContactDetails[] | null;
244
+ copyright?: string | null;
245
+ mainImage?: MainImage | null;
246
+ youtubeLink?: string | null;
247
+ banner?: any;
248
+ stats?: StatItems[] | null;
249
+ teams?: Team[] | null;
250
+ testimonials?: Testimonial[] | null;
251
+ selectStripeAccount?: string;
252
+ annualBilling?: string;
253
+ monthlyBilling?: string;
254
+ productDetails?: ProductDetail[];
255
+ btnLabel?: string;
256
+ selectAccount?: string;
257
+ hashtags?: string[];
258
+ numberOfPosts?: number;
259
+ text?: string;
260
+ button?: LabeledRoute;
261
+ features?: string[];
262
+ config?: {
263
+ enableAnalytics: boolean;
264
+ cookiePolicy?: {
265
+ siteName: string;
266
+ cookiePolicyPage: Reference;
267
+ };
268
+ consentModalPosition?: string;
269
+ };
270
+ contactLink?: LabeledRoute;
271
+ }
272
+
273
+ export interface Template {
274
+ bg?: string;
275
+ color?: string;
276
+ }
277
+
278
+ export type Plans = {
279
+ _key?: string | null;
280
+ _type?: "planItems" | null;
281
+ checkoutButtonName?: string | null;
282
+ description?: string | null;
283
+ monthlyPrice?: string | null;
284
+ planType?: string | null;
285
+ yearlyPrice?: string | null;
286
+ planIncludes?: string[] | null;
287
+ primaryButton?: LabeledRoute | null;
288
+ } & Record<string, string>;
289
+
290
+ export interface Portfolios {
291
+ dateAdded?: string | null;
292
+ mainImage?: {
293
+ image?: string | null;
294
+ alt?: string | null;
295
+ } | null;
296
+ primaryButton?: LabeledRoute | null;
297
+ title?: string | null;
298
+ _key?: string | null;
299
+ _type?: string | null;
300
+ }
301
+
302
+ export interface PortfoliosWithCategories {
303
+ category?: string | null;
304
+ content?: Content[] | null;
305
+ primaryButton?: LabeledRoute | null;
306
+ _key?: string | null;
307
+ _type?: string | null;
308
+ }
309
+
310
+ export interface Content extends Portfolios {
311
+ description?: string | null;
312
+ subtitle?: string | null;
313
+ }
314
+
315
+ export interface Collection extends SanityBody {
316
+ collectionInfoVariant?: {
317
+ variant?: string;
318
+ } | null;
319
+ name?: string | null;
320
+ products?: CollectionProduct[] | null;
321
+ sections?: any; //todo
322
+ seo?: Seo | null;
323
+ slug?: SanitySlug | null;
324
+ }
325
+
326
+ export interface CollectionProduct extends SanityBody {
327
+ compareToPrice?: number | null;
328
+ description?: string | null;
329
+ ecwidProductId?: number | null;
330
+ name?: string | null;
331
+ price?: number | null;
332
+ productInfo?: ProductInfo | null;
333
+ productInfoVariant?: {
334
+ variant?: string;
335
+ } | null;
336
+ sections?: any; //todo
337
+ seo?: Seo | null;
338
+ slug?: SanitySlug | null;
339
+ }
340
+
341
+ //TODO, RECHECK PRODUCT INFO DATA FROM SANITY
342
+ interface ProductInfo {
343
+ btnLabel?: string | null;
344
+ images?: ProductInfoImage[] | null;
345
+ productDetails?: ProductDetail[] | null;
346
+ socialLinks?: SocialLink[] | null;
347
+ subtitle?: string | null;
348
+ }
349
+
350
+ //TODO, RECHECK PRODUCT INFO DATA FROM SANITY
351
+ export interface ProductDetail {
352
+ blockContent?: any;
353
+ contentType?: string;
354
+ tabName?: string;
355
+ _key?: string;
356
+ [key: string]: any;
357
+ }
358
+ interface ProductInfoImage {
359
+ alt?: string | null;
360
+ _key: string;
361
+ _type: string;
362
+ image?: string | null;
363
+ }
364
+
365
+ export interface FaqsWithCategory {
366
+ askedQuestions?: AskedQuestion[] | null;
367
+ category?: string | null;
368
+ _key?: string;
369
+ _type?: string;
370
+ }
371
+
372
+ export interface AskedQuestion {
373
+ answer?: string | null;
374
+ question?: string | null;
375
+ hidden?: boolean;
376
+ _key?: string;
377
+ _type?: string;
378
+ }
379
+
380
+ export interface Team {
381
+ jobTitle?: string;
382
+ mainImage?: MainImage;
383
+ name?: string;
384
+ plainText?: string;
385
+ _key?: string;
386
+ _type?: string;
387
+ }
388
+
389
+ export interface Testimonial {
390
+ jobTitle?: string;
391
+ mainImage?: MainImage;
392
+ name?: string;
393
+ rating?: string;
394
+ testimony?: string;
395
+ _key?: string;
396
+ _type?: string;
397
+ }
398
+
399
+ export declare interface Reference {
400
+ _type: string;
401
+ _ref: string;
402
+ _key?: string;
403
+ _weak?: boolean;
404
+ _strengthenOnPublish?: {
405
+ type: string;
406
+ weak?: boolean;
407
+ template?: {
408
+ id: string;
409
+ params: Record<string, string | number | boolean>;
410
+ };
411
+ };
412
+ }