@stackshift-ui/logo-cloud 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/logo-cloud",
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": {
@@ -28,19 +29,19 @@
28
29
  "typescript": "^5.6.2",
29
30
  "vite-tsconfig-paths": "^5.0.1",
30
31
  "vitest": "^2.1.1",
31
- "@stackshift-ui/eslint-config": "6.0.2",
32
- "@stackshift-ui/typescript-config": "6.0.2"
32
+ "@stackshift-ui/typescript-config": "6.0.2",
33
+ "@stackshift-ui/eslint-config": "6.0.2"
33
34
  },
34
35
  "dependencies": {
35
- "@stackshift-ui/system": "6.0.2",
36
36
  "@stackshift-ui/scripts": "6.0.2",
37
- "@stackshift-ui/heading": "6.0.2",
38
- "@stackshift-ui/text": "6.0.2",
39
- "@stackshift-ui/button": "6.0.2",
40
- "@stackshift-ui/image": "6.0.2",
41
- "@stackshift-ui/container": "6.0.2",
42
- "@stackshift-ui/section": "6.0.2",
43
- "@stackshift-ui/flex": "6.0.2"
37
+ "@stackshift-ui/system": "6.0.3",
38
+ "@stackshift-ui/button": "6.0.3",
39
+ "@stackshift-ui/heading": "6.0.3",
40
+ "@stackshift-ui/text": "6.0.3",
41
+ "@stackshift-ui/image": "6.0.3",
42
+ "@stackshift-ui/section": "6.0.3",
43
+ "@stackshift-ui/container": "6.0.3",
44
+ "@stackshift-ui/flex": "6.0.3"
44
45
  },
45
46
  "peerDependencies": {
46
47
  "@types/react": "16.8 - 19",
package/src/index.ts ADDED
@@ -0,0 +1,8 @@
1
+ "use client";
2
+
3
+ // component exports
4
+ export * from "./logo-cloud";
5
+ export * from "./logo-cloud_a";
6
+ export * from "./logo-cloud_b";
7
+ export * from "./logo-cloud_c";
8
+ export * from "./logo-cloud_d";
@@ -0,0 +1,13 @@
1
+ import { cleanup, render, screen } from "@testing-library/react";
2
+ import { afterEach, describe, test } from "vitest";
3
+ import { LogoCloud } from "./logo-cloud";
4
+
5
+ describe.concurrent("logo-cloud", () => {
6
+ afterEach(cleanup);
7
+
8
+ test.skip("Dummy test - test if renders without errors", ({ expect }) => {
9
+ const clx = "my-class";
10
+ render(<LogoCloud />);
11
+ expect(screen.getByTestId("{ kebabCase name }}").classList).toContain(clx);
12
+ });
13
+ });
@@ -0,0 +1,33 @@
1
+ import React, { lazy } from "react";
2
+ import { SectionsProps, Images, LabeledRoute } from "./types";
3
+
4
+ const Variants = {
5
+ variant_a: lazy(() => import("./logo-cloud_a")),
6
+ variant_b: lazy(() => import("./logo-cloud_b")),
7
+ variant_c: lazy(() => import("./logo-cloud_c")),
8
+ variant_d: lazy(() => import("./logo-cloud_d")),
9
+ };
10
+
11
+ export interface LogoCloudProps {
12
+ title?: string;
13
+ images?: Images[];
14
+ text?: string;
15
+ button?: LabeledRoute;
16
+ }
17
+
18
+ const displayName = "LogoCloud";
19
+
20
+ export const LogoCloud: React.FC<SectionsProps> = ({ data }) => {
21
+ const variant = data?.variant;
22
+ const Variant = variant && Variants[variant as keyof typeof Variants];
23
+
24
+ const props = {
25
+ title: data?.variants?.title ?? undefined,
26
+ images: data?.variants?.images ?? undefined,
27
+ text: data?.variants?.plainText ?? undefined,
28
+ button: data?.variants?.primaryButton ?? undefined,
29
+ };
30
+ return Variant ? <Variant {...props} /> : null;
31
+ };
32
+
33
+ LogoCloud.displayName = displayName;
@@ -0,0 +1,61 @@
1
+ import { Container } from "@stackshift-ui/container";
2
+ import { Flex } from "@stackshift-ui/flex";
3
+ import { Heading } from "@stackshift-ui/heading";
4
+ import { Image } from "@stackshift-ui/image";
5
+ import { Section } from "@stackshift-ui/section";
6
+ import React from "react";
7
+ import { LogoCloudProps } from ".";
8
+ import { Images } from "./types";
9
+
10
+ export default function LogoCloud_A({ title, images }: LogoCloudProps) {
11
+ return (
12
+ <Section className="py-20 bg-background">
13
+ <Container maxWidth={1280}>
14
+ <Title title={title} />
15
+ <Flex wrap justify="center" align="center">
16
+ <LogoCloudImages images={images} />
17
+ </Flex>
18
+ </Container>
19
+ </Section>
20
+ );
21
+ }
22
+
23
+ function Title({ title }: { title?: string }) {
24
+ if (!title) return null;
25
+
26
+ return (
27
+ <Heading className="mb-12 text-center" fontSize="2xl">
28
+ {title}
29
+ </Heading>
30
+ );
31
+ }
32
+
33
+ function LogoCloudImages({ images }: { images?: Images[] }) {
34
+ if (!images) return null;
35
+
36
+ return (
37
+ <React.Fragment>
38
+ {images?.map((image, index) => (
39
+ <div className="w-full px-2 mb-4 md:w-1/3 lg:mr-10 lg:w-1/6 xl:mr-0" key={index}>
40
+ {image?.image ? (
41
+ <Flex
42
+ align="center"
43
+ justify="center"
44
+ className="mx-auto h-[192px] w-[192px] rounded-global bg-white">
45
+ <Image
46
+ className="object-scale-down"
47
+ src={`${image?.image}`}
48
+ sizes="192px"
49
+ width={192}
50
+ height={192}
51
+ alt={image?.alt ?? `logoCloud-image${index}`}
52
+ />
53
+ </Flex>
54
+ ) : null}
55
+ </div>
56
+ ))}
57
+ </React.Fragment>
58
+ );
59
+ }
60
+
61
+ export { LogoCloud_A };
@@ -0,0 +1,75 @@
1
+ import React from "react";
2
+ import { Text } from "@stackshift-ui/text";
3
+ import { Heading } from "@stackshift-ui/heading";
4
+ import { Image } from "@stackshift-ui/image";
5
+ import { Section } from "@stackshift-ui/section";
6
+ import { Container } from "@stackshift-ui/container";
7
+ import { Flex } from "@stackshift-ui/flex";
8
+ import { Images } from "./types";
9
+ import { LogoCloudProps } from ".";
10
+
11
+ export default function LogoCloud_B({ title, text, images }: LogoCloudProps) {
12
+ return (
13
+ <Section className="py-20 bg-background">
14
+ <Container maxWidth={1280}>
15
+ <Flex wrap align="center" justify="between">
16
+ <TitleTextSection title={title} text={text} />
17
+ <Flex wrap className="w-full lg:w-1/2">
18
+ <LogoCloudImages images={images} />
19
+ </Flex>
20
+ </Flex>
21
+ </Container>
22
+ </Section>
23
+ );
24
+ }
25
+
26
+ function TitleTextSection({ title, text }: { title?: string; text?: string }) {
27
+ return (
28
+ <div className="w-full mb-12 lg:mb-0 lg:w-1/2">
29
+ <Container maxWidth={448}>
30
+ {title && (
31
+ <Heading weight="bold" className="mb-4">
32
+ {title}
33
+ </Heading>
34
+ )}
35
+ {text && (
36
+ <Text muted className="leading-loose">
37
+ {text}
38
+ </Text>
39
+ )}
40
+ </Container>
41
+ </div>
42
+ );
43
+ }
44
+
45
+ function LogoCloudImages({ images }: { images?: Images[] }) {
46
+ if (!images) return null;
47
+
48
+ return (
49
+ <React.Fragment>
50
+ {images?.map((image, index) => (
51
+ <div className="w-full px-2 mb-4 sm:w-1/2 md:w-1/3" key={index}>
52
+ {image?.image && (
53
+ <div>
54
+ <Flex
55
+ align="center"
56
+ justify="center"
57
+ className="mx-auto h-[192px] w-[192px] rounded bg-gray-50">
58
+ <Image
59
+ className="object-scale-down"
60
+ src={`${image?.image}`}
61
+ sizes="192px"
62
+ width={192}
63
+ height={192}
64
+ alt={image?.alt ?? `logoCloud-image${index}`}
65
+ />
66
+ </Flex>
67
+ </div>
68
+ )}
69
+ </div>
70
+ ))}
71
+ </React.Fragment>
72
+ );
73
+ }
74
+
75
+ export { LogoCloud_B };
@@ -0,0 +1,106 @@
1
+ import { Button } from "@stackshift-ui/button";
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 { LogoCloudProps } from ".";
8
+ import { Images, LabeledRoute } from "./types";
9
+
10
+ export default function LogoCloud_C({ title, images, button }: LogoCloudProps) {
11
+ return (
12
+ <Section className="relative pt-20 pb-12 overflow-hidden bg-background lg:pb-80">
13
+ <Container maxWidth={1280}>
14
+ <LogoCloudHeader title={title} button={button} />
15
+ {images && images.length > 0 && <Logos images={images} />}
16
+ <LogoCloudMobile images={images} />
17
+ </Container>
18
+ </Section>
19
+ );
20
+ }
21
+
22
+ function LogoCloudHeader({ title, button }: { title?: string; button?: LabeledRoute }) {
23
+ return (
24
+ <Container maxWidth={448} className="text-center">
25
+ {title && (
26
+ <Heading weight="bold" className="mb-8 text-4xl lg:text-5xl">
27
+ {title}
28
+ </Heading>
29
+ )}
30
+ {button?.label && (
31
+ <Button as="link" ariaLabel={button.label} link={button}>
32
+ {button.label}
33
+ </Button>
34
+ )}
35
+ </Container>
36
+ );
37
+ }
38
+
39
+ // Logos Component for desktop view
40
+ function Logos({ images }: { images?: Images[] }) {
41
+ if (!images) return null;
42
+
43
+ return (
44
+ <div className="relative hidden lg:block">
45
+ {images.map((image, index) => (
46
+ <LogoItem key={index} image={image} alt={image?.alt} index={index} />
47
+ ))}
48
+ </div>
49
+ );
50
+ }
51
+
52
+ // Logo Item for individual images (Desktop view)
53
+ function LogoItem({ image, alt, index }: { image?: Images; alt?: string; index: number }) {
54
+ const positions = [
55
+ { top: "-120px", left: "-10px" },
56
+ { top: "0", left: "0", marginTop: "20px" },
57
+ { bottom: "-250px", left: "20%" },
58
+ { top: "20px", right: "20%" },
59
+ { bottom: "-250px", right: "0" },
60
+ { top: "-150px", right: "0" },
61
+ ];
62
+
63
+ return (
64
+ <div
65
+ className="absolute flex items-center justify-center w-24 h-24 overflow-hidden rounded-full bg-gray-50"
66
+ style={positions[index] ?? {}}>
67
+ <Image
68
+ className="object-scale-down w-16 h-16"
69
+ src={`${image?.image}`}
70
+ sizes="100vw"
71
+ width={64}
72
+ height={64}
73
+ alt={alt ?? `logoCloud-image-${index + 1}`}
74
+ />
75
+ </div>
76
+ );
77
+ }
78
+
79
+ // LogoCloud Mobile Component (Mobile View)
80
+ function LogoCloudMobile({ images }: { images?: Images[] }) {
81
+ if (!images) return null;
82
+
83
+ return (
84
+ <Flex wrap justify="center" className="mt-16 lg:hidden">
85
+ {images &&
86
+ images.map((image, index) => (
87
+ <Flex
88
+ align="center"
89
+ justify="center"
90
+ className="w-24 h-24 mx-4 mb-8 rounded-full bg-gray-50"
91
+ key={index}>
92
+ <Image
93
+ className="object-scale-down w-16 h-16"
94
+ src={`${image?.image}`}
95
+ sizes="100vw"
96
+ width={64}
97
+ height={64}
98
+ alt={image?.alt ?? `logoCloud-image-${index}`}
99
+ />
100
+ </Flex>
101
+ ))}
102
+ </Flex>
103
+ );
104
+ }
105
+
106
+ export { LogoCloud_C };
@@ -0,0 +1,44 @@
1
+ import { Image } from "@stackshift-ui/image";
2
+ import { Section } from "@stackshift-ui/section";
3
+ import { Container } from "@stackshift-ui/container";
4
+ import { Flex } from "@stackshift-ui/flex";
5
+ import { Images } from "./types";
6
+ import { LogoCloudProps } from ".";
7
+
8
+ export default function LogoCloud_D({ images }: LogoCloudProps) {
9
+ return (
10
+ <Section className="py-20 bg-background">
11
+ <Container maxWidth={1280}>
12
+ <Flex wrap justify="center" align="center">
13
+ {images && images?.map((image, index) => <LogoItem image={image} />)}
14
+ </Flex>
15
+ </Container>
16
+ </Section>
17
+ );
18
+ }
19
+
20
+ function LogoItem({ image }: { image?: Images }) {
21
+ if (!image) return null;
22
+
23
+ return (
24
+ <div className="w-full px-2 mb-4 md:w-1/3 lg:mr-10 lg:w-1/6 xl:mr-0">
25
+ {image?.image && (
26
+ <Flex
27
+ align="center"
28
+ justify="center"
29
+ className="mx-auto h-[192px] w-[192px] rounded bg-gray-50">
30
+ <Image
31
+ className="object-scale-down w-full h-full"
32
+ src={`${image?.image}`}
33
+ sizes="192px"
34
+ width={192}
35
+ height={192}
36
+ alt={image?.alt ?? `logoCloud-image`}
37
+ />
38
+ </Flex>
39
+ )}
40
+ </div>
41
+ );
42
+ }
43
+
44
+ export { LogoCloud_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
+ }