hds-web 1.34.2 → 1.34.4
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.es.js +1 -1
- package/dist/index.js +3 -3
- package/package.json +1 -1
- package/src/HDS/components/Headers/v3Header.js +842 -775
@@ -1,829 +1,896 @@
|
|
1
|
-
import React, { useState, useEffect } from
|
2
|
-
import {
|
3
|
-
|
4
|
-
import {
|
5
|
-
import {
|
6
|
-
import {
|
7
|
-
import {
|
8
|
-
import {
|
9
|
-
import { AlgoliaSearch } from
|
1
|
+
import React, { useState, useEffect } from "react";
|
2
|
+
import { motion, AnimatePresence } from "framer-motion";
|
3
|
+
|
4
|
+
import { Icon } from "../common-components/Icon";
|
5
|
+
import { Typography } from "../../foundation/Typography";
|
6
|
+
import { HDSButton } from "../Buttons";
|
7
|
+
import { V3Dropdown } from "../Cards/Dropdown";
|
8
|
+
import { HDSColor } from "../../foundation/ColorPalette";
|
9
|
+
import { AlgoliaSearch } from "../../helpers/AlgoliaSearch";
|
10
10
|
|
11
11
|
function classNames(...classes) {
|
12
|
-
|
12
|
+
return classes.filter(Boolean).join(" ");
|
13
13
|
}
|
14
14
|
|
15
15
|
const updatePGParam = (originalLink, websiteKey) => {
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
else return originalLink;
|
16
|
+
if (websiteKey) {
|
17
|
+
const url = new URL(originalLink);
|
18
|
+
url.searchParams.set("pg", websiteKey);
|
19
|
+
return url.toString();
|
20
|
+
} else return originalLink;
|
22
21
|
};
|
23
22
|
|
24
|
-
|
23
|
+
const isBrowser = typeof window !== "undefined";
|
25
24
|
export default function V3Header(props) {
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
dropdownVisibility[id] ? '' : 'text-gray-500'
|
88
|
-
)}
|
89
|
-
>
|
90
|
-
<div className="flex flex-col items-center cursor-pointer">
|
91
|
-
<Typography
|
92
|
-
className="hover:text-blue-600"
|
93
|
-
textStyle="body3c-medium"
|
94
|
-
>
|
95
|
-
{`${title} `}
|
96
|
-
</Typography>
|
97
|
-
</div>
|
98
|
-
</div>
|
99
|
-
<motion.div>
|
100
|
-
{dropdownVisibility[id] && (
|
101
|
-
<div
|
102
|
-
id={`dropdown_${id}_content`}
|
103
|
-
className="left-0 z-20"
|
104
|
-
onMouseEnter={() => handleDropdownEnter(id)}
|
105
|
-
onMouseLeave={() => handleDropdownLeave(id)}
|
106
|
-
onScroll={() => handleDropdownLeave(id)}
|
107
|
-
>
|
108
|
-
<motion.div
|
109
|
-
initial={{ opacity: 0 }}
|
110
|
-
animate={{ opacity: 1 }}
|
111
|
-
transition={{ ease: 'easeInOut', duration: 0.1 }}
|
112
|
-
className={"absolute -left-[137px] z-[2] transform " + (dropdownVisibility[0] ? '-left-[137px] ' : '') + (dropdownVisibility[1] ? '-left-[218px]' : '') + (dropdownVisibility[3] ? '-left-[50px] ' : '')}
|
113
|
-
|
114
|
-
>
|
115
|
-
{renderDropdown(
|
116
|
-
primaryCard,
|
117
|
-
secondaryCardArr,
|
118
|
-
tertiaryCard,
|
119
|
-
flyoutD
|
120
|
-
)}
|
121
|
-
</motion.div>
|
122
|
-
</div>
|
123
|
-
)}
|
124
|
-
</motion.div>
|
125
|
-
</div>
|
126
|
-
)}
|
127
|
-
</div>
|
128
|
-
);
|
129
|
-
};
|
130
|
-
|
131
|
-
|
132
|
-
const headerListfunction = (headerList) => (
|
133
|
-
<>
|
134
|
-
{renderDropdownContainer(headerList, 0)}
|
135
|
-
{renderDropdownContainer(headerList, 1)}
|
136
|
-
{<a href='/case-studies/'>
|
25
|
+
const listSize = props.HEADER_LIST.length;
|
26
|
+
const [mobileNavOpen, setmobileNavOpen] = useState(false);
|
27
|
+
const [isProduct, setIsProduct] = useState(false);
|
28
|
+
const [isDeveloper, setIsDeveloper] = useState(false);
|
29
|
+
const [isCompany, setIsCompany] = useState(false);
|
30
|
+
const [currentTab, setCurrentTab] = useState("");
|
31
|
+
const [isShown, setIsShown] = useState(false);
|
32
|
+
const [isArrowActive, setIsArrowActive] = useState(false);
|
33
|
+
const signUpLink = props.signUpLink
|
34
|
+
? props.signUpLink
|
35
|
+
: "https://cloud.hasura.io/signup?pg=sample-apps&plcmt=header&cta=try-hasura&tech=default";
|
36
|
+
const logInLink = props.logInLink
|
37
|
+
? props.logInLink
|
38
|
+
: "https://cloud.hasura.io/login?pg=sample-apps&plcmt=header&cta=log-in&tech=default";
|
39
|
+
const signupURL = updatePGParam(signUpLink, props.website_key);
|
40
|
+
const loginURL = updatePGParam(logInLink, props.website_key);
|
41
|
+
const hideLoginButton = props.hideLoginButton;
|
42
|
+
//testing
|
43
|
+
const [dropdownVisibility, setDropdownVisibility] = useState(
|
44
|
+
Array(props.HEADER_LIST.length).fill(false)
|
45
|
+
);
|
46
|
+
const handleDropdownEnter = (index) => {
|
47
|
+
setDropdownVisibility((prevVisibility) => {
|
48
|
+
const updatedVisibility = [...prevVisibility];
|
49
|
+
updatedVisibility[index] = true;
|
50
|
+
return updatedVisibility;
|
51
|
+
});
|
52
|
+
};
|
53
|
+
|
54
|
+
const handleDropdownLeave = (index) => {
|
55
|
+
setDropdownVisibility((prevVisibility) => {
|
56
|
+
const updatedVisibility = [...prevVisibility];
|
57
|
+
updatedVisibility[index] = false;
|
58
|
+
return updatedVisibility;
|
59
|
+
});
|
60
|
+
};
|
61
|
+
|
62
|
+
const renderDropdown = (
|
63
|
+
primaryCard,
|
64
|
+
secondaryCardArr,
|
65
|
+
tertiaryCard,
|
66
|
+
flyoutD
|
67
|
+
) => (
|
68
|
+
<div>
|
69
|
+
<div>
|
70
|
+
<hr className="w-full h-6 border-0" />
|
71
|
+
</div>
|
72
|
+
<div className="p-2 bg-neutral-150 rounded-3xl">
|
73
|
+
<V3Dropdown
|
74
|
+
primaryCard={primaryCard}
|
75
|
+
secondaryCardArr={secondaryCardArr}
|
76
|
+
tertiaryCard={tertiaryCard}
|
77
|
+
flyoutD={flyoutD}
|
78
|
+
/>
|
79
|
+
</div>
|
80
|
+
</div>
|
81
|
+
);
|
82
|
+
|
83
|
+
const renderDropdownContainer = (headerList, id) => {
|
84
|
+
const { title, primaryCard, secondaryCardArr, tertiaryCard, flyoutD } =
|
85
|
+
headerList[id];
|
137
86
|
|
87
|
+
return (
|
88
|
+
<div id={`dropdown_${id}`}>
|
89
|
+
{headerList[id] && (
|
90
|
+
<div
|
91
|
+
className="relative"
|
92
|
+
onMouseEnter={() => handleDropdownEnter(id)}
|
93
|
+
onMouseLeave={() => handleDropdownLeave(id)}
|
94
|
+
>
|
95
|
+
<div
|
96
|
+
className={classNames(
|
97
|
+
"group inline-flex items-center rounded-md bg-white hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2",
|
98
|
+
dropdownVisibility[id] ? "" : "text-gray-500"
|
99
|
+
)}
|
100
|
+
>
|
101
|
+
<div className="flex flex-col items-center cursor-pointer">
|
138
102
|
<Typography
|
139
|
-
|
140
|
-
|
103
|
+
className="hover:text-blue-600"
|
104
|
+
textStyle="body3c-medium"
|
141
105
|
>
|
142
|
-
|
106
|
+
{`${title} `}
|
143
107
|
</Typography>
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
108
|
+
</div>
|
109
|
+
</div>
|
110
|
+
<motion.div>
|
111
|
+
{dropdownVisibility[id] && (
|
112
|
+
<div
|
113
|
+
id={`dropdown_${id}_content`}
|
114
|
+
className="left-0 z-20"
|
115
|
+
onMouseEnter={() => handleDropdownEnter(id)}
|
116
|
+
onMouseLeave={() => handleDropdownLeave(id)}
|
117
|
+
onScroll={() => handleDropdownLeave(id)}
|
153
118
|
>
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
119
|
+
<motion.div
|
120
|
+
initial={{ opacity: 0 }}
|
121
|
+
animate={{ opacity: 1 }}
|
122
|
+
transition={{ ease: "easeInOut", duration: 0.1 }}
|
123
|
+
className={
|
124
|
+
"absolute -left-[137px] z-[2] transform " +
|
125
|
+
(dropdownVisibility[0] ? "-left-[137px] " : "") +
|
126
|
+
(dropdownVisibility[1] ? "-left-[218px]" : "") +
|
127
|
+
(dropdownVisibility[3] ? "-left-[50px] " : "")
|
128
|
+
}
|
129
|
+
>
|
130
|
+
{renderDropdown(
|
131
|
+
primaryCard,
|
132
|
+
secondaryCardArr,
|
133
|
+
tertiaryCard,
|
134
|
+
flyoutD
|
135
|
+
)}
|
136
|
+
</motion.div>
|
137
|
+
</div>
|
138
|
+
)}
|
139
|
+
</motion.div>
|
140
|
+
</div>
|
141
|
+
)}
|
142
|
+
</div>
|
159
143
|
);
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
144
|
+
};
|
145
|
+
|
146
|
+
const headerListfunction = (headerList) => (
|
147
|
+
<>
|
148
|
+
{renderDropdownContainer(headerList, 0)}
|
149
|
+
{renderDropdownContainer(headerList, 1)}
|
150
|
+
{
|
151
|
+
<a href="/case-studies/">
|
152
|
+
<Typography
|
153
|
+
className="hover:text-blue-600 cursor-pointer"
|
154
|
+
textStyle="body3c-medium"
|
155
|
+
>
|
156
|
+
{`Customers `}
|
157
|
+
</Typography>
|
158
|
+
</a>
|
159
|
+
}
|
160
|
+
{renderDropdownContainer(headerList, 3)}
|
161
|
+
|
162
|
+
{
|
163
|
+
<a href="/pricing">
|
164
|
+
<Typography
|
165
|
+
className="hover:text-blue-600 cursor-pointer"
|
166
|
+
textStyle="body3c-medium"
|
167
|
+
>
|
168
|
+
{`Pricing `}
|
169
|
+
</Typography>
|
170
|
+
</a>
|
171
|
+
}
|
172
|
+
</>
|
173
|
+
);
|
174
|
+
|
175
|
+
//testing
|
176
|
+
|
177
|
+
const mobileNav = (HEADER_LIST) => (
|
178
|
+
<div className="pt-4 ">
|
179
|
+
<div className="transform transition-all">
|
180
|
+
{isProduct && (
|
181
|
+
<motion.div className="product_mobile mr-0">
|
182
|
+
<V3Dropdown
|
183
|
+
primaryCard={HEADER_LIST[0]["primaryCard"]}
|
184
|
+
secondaryCardArr={HEADER_LIST[0]["secondaryCardArr"]}
|
185
|
+
tertiaryCard={HEADER_LIST[0]["tertiaryCard"]}
|
186
|
+
flyoutD={HEADER_LIST[0]["flyoutD"]}
|
187
|
+
/>
|
188
|
+
</motion.div>
|
189
|
+
)}
|
190
|
+
{isDeveloper && (
|
191
|
+
<div className="product_developer">
|
192
|
+
<V3Dropdown
|
193
|
+
primaryCard={HEADER_LIST[1]["primaryCard"]}
|
194
|
+
secondaryCardArr={HEADER_LIST[1]["secondaryCardArr"]}
|
195
|
+
tertiaryCard={HEADER_LIST[1]["tertiaryCard"]}
|
196
|
+
/>
|
197
|
+
</div>
|
198
|
+
)}
|
199
|
+
{isCompany && (
|
200
|
+
<div className="product_company">
|
201
|
+
<V3Dropdown
|
202
|
+
primaryCard={HEADER_LIST[3]["primaryCard"]}
|
203
|
+
secondaryCardArr={HEADER_LIST[3]["secondaryCardArr"]}
|
204
|
+
tertiaryCard={HEADER_LIST[3]["tertiaryCard"]}
|
205
|
+
/>
|
206
|
+
</div>
|
207
|
+
)}
|
208
|
+
</div>
|
209
|
+
</div>
|
210
|
+
);
|
211
|
+
|
212
|
+
let class1;
|
213
|
+
let class2;
|
214
|
+
let class3;
|
215
|
+
if (mobileNavOpen) {
|
216
|
+
class1 = "rotate-45 ";
|
217
|
+
class2 = "opacity-0 ";
|
218
|
+
class3 = "-rotate-45 ";
|
219
|
+
}
|
220
|
+
if (!mobileNavOpen) {
|
221
|
+
class1 = " ";
|
222
|
+
class2 = "";
|
223
|
+
class3 = "translate-y-[5.8px] ";
|
224
|
+
}
|
225
|
+
|
226
|
+
function handleMbDropdownClose() {
|
227
|
+
setmobileNavOpen(!mobileNavOpen);
|
228
|
+
setIsDeveloper(false);
|
229
|
+
setIsCompany(false);
|
230
|
+
setIsProduct(false);
|
231
|
+
setCurrentTab("");
|
232
|
+
props.HEADER_LIST.forEach((item, index) => {
|
233
|
+
// Access the values of each item and the index
|
234
|
+
handleDropdownLeave(index);
|
235
|
+
});
|
236
|
+
}
|
237
|
+
function handleBackClick() {
|
238
|
+
setIsDeveloper(false);
|
239
|
+
setIsCompany(false);
|
240
|
+
setIsProduct(false);
|
241
|
+
setCurrentTab("");
|
242
|
+
props.HEADER_LIST.forEach((item, index) => {
|
243
|
+
// Access the values of each item and the index
|
244
|
+
handleDropdownLeave(index);
|
245
|
+
});
|
246
|
+
}
|
247
|
+
|
248
|
+
function handleMbDropdownClick(title) {
|
249
|
+
const i = props.HEADER_LIST.findIndex((item) => item.title === title);
|
250
|
+
handleDropdownEnter(i);
|
251
|
+
// Implement your logic to open the additional options for the clicked dropdown
|
252
|
+
if (title === "Developer") {
|
253
|
+
setIsDeveloper(true);
|
207
254
|
}
|
208
|
-
if (
|
209
|
-
|
210
|
-
class2 = "";
|
211
|
-
class3 = "translate-y-[5.8px] ";
|
255
|
+
if (title === "Customers") {
|
256
|
+
window.location.href = "/case-studies/";
|
212
257
|
}
|
213
|
-
|
214
|
-
|
215
|
-
setmobileNavOpen(!mobileNavOpen)
|
216
|
-
setIsDeveloper(false);
|
217
|
-
setIsCompany(false);
|
218
|
-
setIsProduct(false);
|
219
|
-
setCurrentTab('')
|
220
|
-
props.HEADER_LIST.forEach((item, index) => {
|
221
|
-
// Access the values of each item and the index
|
222
|
-
handleDropdownLeave(index)
|
223
|
-
});
|
258
|
+
if (title === "Pricing") {
|
259
|
+
window.location.href = "/pricing/";
|
224
260
|
}
|
225
|
-
|
226
|
-
|
227
|
-
setIsCompany(false);
|
228
|
-
setIsProduct(false);
|
229
|
-
setCurrentTab('');
|
230
|
-
props.HEADER_LIST.forEach((item, index) => {
|
231
|
-
// Access the values of each item and the index
|
232
|
-
handleDropdownLeave(index)
|
233
|
-
});
|
234
|
-
|
261
|
+
if (title === "Product") {
|
262
|
+
setIsProduct(true);
|
235
263
|
}
|
236
|
-
|
237
|
-
|
238
|
-
function handleMbDropdownClick(title) {
|
239
|
-
const i = props.HEADER_LIST.findIndex(item => item.title === title);
|
240
|
-
handleDropdownEnter(i);
|
241
|
-
// Implement your logic to open the additional options for the clicked dropdown
|
242
|
-
if (title === 'Developer') {
|
243
|
-
|
244
|
-
setIsDeveloper(true);
|
245
|
-
}
|
246
|
-
if (title === 'Customers') {
|
247
|
-
|
248
|
-
window.location.href = '/case-studies/'
|
249
|
-
}
|
250
|
-
if (title === 'Pricing') {
|
251
|
-
|
252
|
-
window.location.href ='/pricing/'
|
253
|
-
}
|
254
|
-
if (title === 'Product') {
|
255
|
-
setIsProduct(true);
|
256
|
-
}
|
257
|
-
if (title === 'Company') {
|
258
|
-
setIsCompany(true);
|
259
|
-
}
|
264
|
+
if (title === "Company") {
|
265
|
+
setIsCompany(true);
|
260
266
|
}
|
267
|
+
}
|
268
|
+
|
269
|
+
useEffect(() => {
|
270
|
+
if (isProduct) {
|
271
|
+
setCurrentTab("Product");
|
272
|
+
} else if (isDeveloper) {
|
273
|
+
setCurrentTab("Developer");
|
274
|
+
} else if (isCompany) {
|
275
|
+
setCurrentTab("Company");
|
276
|
+
}
|
277
|
+
}, [isProduct, isDeveloper, isCompany]);
|
261
278
|
|
262
|
-
|
263
|
-
if (isProduct) {
|
264
|
-
setCurrentTab('Product');
|
265
|
-
} else if (isDeveloper) {
|
266
|
-
setCurrentTab('Developer');
|
267
|
-
} else if (isCompany) {
|
268
|
-
setCurrentTab('Company');
|
269
|
-
}
|
270
|
-
}, [isProduct, isDeveloper, isCompany]);
|
271
|
-
|
272
|
-
|
273
|
-
return (
|
274
|
-
<div className="relative mx-auto">
|
275
|
-
<div className={`flex items-center ${HDSColor(props.headerBg)} justify-between py-4 db:py-3 tb-l:justify-start`}>
|
276
|
-
<div className='flex flex-row justify-between items-center w-full tb-l:w-fit'>
|
277
|
-
<div>
|
278
|
-
|
279
|
-
<a href={props.headerUrl} className={"flex items-center"}>
|
280
|
-
<Icon height='w-[103px] h-[33px]' variant={'hasuraPrimary'} strokeColor={''} />
|
281
|
-
</a>
|
282
|
-
</div>
|
283
|
-
<div className='hds-hidden-tbl flex z-[10] items-center gap-6'>
|
284
|
-
<div className={'h-full ' + ((mobileNavOpen) ? " hds-hidden" : "")}>
|
285
|
-
{
|
286
|
-
!props.hideSearch &&
|
287
|
-
(<AlgoliaSearch {...props} />)
|
288
|
-
}
|
289
|
-
</div>
|
290
|
-
{!(isCompany || isDeveloper || isProduct) &&
|
291
|
-
(
|
292
|
-
<motion.div
|
293
|
-
initial={{ opacity: 0 }}
|
294
|
-
animate={{ opacity: 1 }}
|
295
|
-
transition={{ duration: 0.3, opacity: { ease: "easeIn" } }}
|
296
|
-
className='h-5 w-5 mt-3' onClick={() => handleMbDropdownClose()}>
|
297
|
-
<div className=' h-5 cursor-pointer' >
|
298
|
-
<div aria-hidden="true" className={`${class1} block absolute h-[2px] w-[15px] bg-neutral-800 transform transition duration-500 ease-in-out`}></div>
|
299
|
-
<div aria-hidden="true" className={`${class3} block absolute h-0.5 w-[15px] bg-neutral-800 transform transition duration-500 ease-in-out`}></div>
|
300
|
-
</div>
|
301
|
-
|
302
|
-
</motion.div>)}
|
303
|
-
</div>
|
304
|
-
</div>
|
305
|
-
<div className='hds-hidden tb-l:flex flex-row w-full justify-between items-center'>
|
279
|
+
// **************************** //
|
306
280
|
|
307
|
-
|
308
|
-
|
309
|
-
onMouseLeave={() => setIsArrowActive(false)}
|
281
|
+
const handleLogoRightClick = (e) => {
|
282
|
+
e.preventDefault();
|
310
283
|
|
311
|
-
|
312
|
-
|
284
|
+
if (e && e.type === "contextmenu") {
|
285
|
+
if (isBrowser) {
|
286
|
+
// scrollToTop();
|
313
287
|
|
314
|
-
|
288
|
+
window.open(
|
289
|
+
"https://drive.google.com/drive/folders/1xZHt4JPYRvNOo44VHtAJRj3bMD3-26ON",
|
290
|
+
"_blank"
|
291
|
+
);
|
292
|
+
}
|
315
293
|
|
316
|
-
|
317
|
-
|
318
|
-
!props.hideSearch &&
|
319
|
-
(<AlgoliaSearch {...props} />)
|
320
|
-
}
|
321
|
-
<a href='/contact-us?type=hasuraenterprise' className='hds-hidden db:flex'>
|
322
|
-
<Typography textStyle='body3c-medium' className='text-neutral-800 hover:text-blue-600'>
|
323
|
-
Contact Sales
|
324
|
-
</Typography>
|
325
|
-
</a>
|
326
|
-
{!hideLoginButton && <a href={loginURL} >
|
327
|
-
<HDSButton
|
328
|
-
label="Log In"
|
329
|
-
type='tonal'
|
330
|
-
leftIconVariant='none'
|
331
|
-
rightIconVariant='none'
|
332
|
-
state='default'
|
333
|
-
size='sm'
|
334
|
-
rightAnimatedArrow='true'
|
335
|
-
rightAnimatedArrowColor='#3970FD'
|
336
|
-
animatedHoverStroke='group-hover:stroke-neutral-0'
|
337
|
-
className='hds-hidden tb-l:flex'
|
338
|
-
/>
|
339
|
-
</a>}
|
340
|
-
<a href={signupURL}>
|
341
|
-
|
342
|
-
<HDSButton
|
343
|
-
label="Get Started"
|
344
|
-
type='primary'
|
345
|
-
leftIconVariant='none'
|
346
|
-
rightIconVariant='none'
|
347
|
-
state='default'
|
348
|
-
size='sm'
|
349
|
-
rightAnimatedArrow='true'
|
350
|
-
rightAnimatedArrowColor='#ffffff'
|
351
|
-
animatedHoverStroke='group-hover:stroke-neutral-0'
|
352
|
-
className='hds-hidden tb:flex'
|
353
|
-
/>
|
354
|
-
</a>
|
355
|
-
</div>
|
294
|
+
return null;
|
295
|
+
}
|
356
296
|
|
297
|
+
return null;
|
298
|
+
};
|
299
|
+
|
300
|
+
// **************************** //
|
301
|
+
|
302
|
+
return (
|
303
|
+
<div className="relative mx-auto">
|
304
|
+
<div
|
305
|
+
className={`flex items-center ${HDSColor(
|
306
|
+
props.headerBg
|
307
|
+
)} justify-between py-4 db:py-3 tb-l:justify-start`}
|
308
|
+
>
|
309
|
+
<div className="flex flex-row justify-between items-center w-full tb-l:w-fit">
|
310
|
+
<div onContextMenu={(e) => handleLogoRightClick(e)}>
|
311
|
+
<a href={props.headerUrl} className={"flex items-center"}>
|
312
|
+
<Icon
|
313
|
+
height="w-[103px] h-[33px]"
|
314
|
+
variant={"hasuraPrimary"}
|
315
|
+
strokeColor={""}
|
316
|
+
/>
|
317
|
+
</a>
|
318
|
+
</div>
|
319
|
+
<div className="hds-hidden-tbl flex z-[10] items-center gap-6">
|
320
|
+
<div className={"h-full " + (mobileNavOpen ? " hds-hidden" : "")}>
|
321
|
+
{!props.hideSearch && <AlgoliaSearch {...props} />}
|
322
|
+
</div>
|
323
|
+
{!(isCompany || isDeveloper || isProduct) && (
|
324
|
+
<motion.div
|
325
|
+
initial={{ opacity: 0 }}
|
326
|
+
animate={{ opacity: 1 }}
|
327
|
+
transition={{ duration: 0.3, opacity: { ease: "easeIn" } }}
|
328
|
+
className="h-5 w-5 mt-3"
|
329
|
+
onClick={() => handleMbDropdownClose()}
|
330
|
+
>
|
331
|
+
<div className=" h-5 cursor-pointer">
|
332
|
+
<div
|
333
|
+
aria-hidden="true"
|
334
|
+
className={`${class1} block absolute h-[2px] w-[15px] bg-neutral-800 transform transition duration-500 ease-in-out`}
|
335
|
+
></div>
|
336
|
+
<div
|
337
|
+
aria-hidden="true"
|
338
|
+
className={`${class3} block absolute h-0.5 w-[15px] bg-neutral-800 transform transition duration-500 ease-in-out`}
|
339
|
+
></div>
|
357
340
|
</div>
|
358
|
-
|
359
|
-
|
360
|
-
|
341
|
+
</motion.div>
|
342
|
+
)}
|
343
|
+
</div>
|
344
|
+
</div>
|
345
|
+
<div className="hds-hidden tb-l:flex flex-row w-full justify-between items-center">
|
346
|
+
<nav
|
347
|
+
className="hds-hidden items-baseline relative tb-l:pl-8 tb-l:flex tb-l:space-x-6"
|
348
|
+
onMouseEnter={() => setIsArrowActive(true)}
|
349
|
+
onMouseLeave={() => setIsArrowActive(false)}
|
350
|
+
>
|
351
|
+
{headerListfunction(props.HEADER_LIST)}
|
352
|
+
</nav>
|
353
|
+
|
354
|
+
<div className="hds-hidden tb-l:flex flex-row items-center gap-x-4 ">
|
355
|
+
{!props.hideSearch && <AlgoliaSearch {...props} />}
|
356
|
+
<a
|
357
|
+
href="/contact-us?type=hasuraenterprise"
|
358
|
+
className="hds-hidden db:flex"
|
359
|
+
>
|
360
|
+
<Typography
|
361
|
+
textStyle="body3c-medium"
|
362
|
+
className="text-neutral-800 hover:text-blue-600"
|
363
|
+
>
|
364
|
+
Contact Sales
|
365
|
+
</Typography>
|
366
|
+
</a>
|
367
|
+
{!hideLoginButton && (
|
368
|
+
<a href={loginURL}>
|
369
|
+
<HDSButton
|
370
|
+
label="Log In"
|
371
|
+
type="tonal"
|
372
|
+
leftIconVariant="none"
|
373
|
+
rightIconVariant="none"
|
374
|
+
state="default"
|
375
|
+
size="sm"
|
376
|
+
rightAnimatedArrow="true"
|
377
|
+
rightAnimatedArrowColor="#3970FD"
|
378
|
+
animatedHoverStroke="group-hover:stroke-neutral-0"
|
379
|
+
className="hds-hidden tb-l:flex"
|
380
|
+
/>
|
381
|
+
</a>
|
382
|
+
)}
|
383
|
+
<a href={signupURL}>
|
384
|
+
<HDSButton
|
385
|
+
label="Get Started"
|
386
|
+
type="primary"
|
387
|
+
leftIconVariant="none"
|
388
|
+
rightIconVariant="none"
|
389
|
+
state="default"
|
390
|
+
size="sm"
|
391
|
+
rightAnimatedArrow="true"
|
392
|
+
rightAnimatedArrowColor="#ffffff"
|
393
|
+
animatedHoverStroke="group-hover:stroke-neutral-0"
|
394
|
+
className="hds-hidden tb:flex"
|
395
|
+
/>
|
396
|
+
</a>
|
397
|
+
</div>
|
398
|
+
</div>
|
399
|
+
{/* mobile */}
|
400
|
+
<div className="hds-hidden-tbl overflow-auto flex ">
|
401
|
+
{/* <Popover.Button className="inline-flex items-center justify-center rounded-md bg-white pl-6 text-gray-400 hover:bg-gray-100 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500">
|
361
402
|
<span className="sr-only">Open menu</span> */}
|
362
403
|
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
</div>
|
431
|
-
<nav className="grid divide-y mr-8 tb:mr-4 bg-neutral-0 divide-neutral-200 border border-neutral-200 rounded-3xl mb-6">
|
432
|
-
{props.HEADER_LIST.map((item) => (
|
433
|
-
<div
|
434
|
-
key={item['title']}
|
435
|
-
onClick={() => handleMbDropdownClick(item['title'])}
|
436
|
-
className="flex justify-between items-center p-4 cursor-pointer group"
|
437
|
-
>
|
438
|
-
<div className="flex items-center justify-center gap-2">
|
439
|
-
{/* <Icon height="h-5 w-5" variant="home03" strokeColor="#3970FD" /> */}
|
440
|
-
<Typography textStyle="body3c-medium" className="text-neutral-700 hover:text-neutral-1000 transition-all duration-300 ease-in-out">
|
441
|
-
{`${item['title']}`}
|
442
|
-
</Typography>
|
443
|
-
</div>
|
444
|
-
<Icon height="h-5 w-5 stroke-[1.5px] group-hover:translate-x-1 ease-in-out transition duration-300" variant="chevronright" strokeClass="stroke-neutral-500" />
|
445
|
-
</div>
|
446
|
-
))}
|
447
|
-
</nav>
|
448
|
-
</motion.div>
|
449
|
-
)}
|
450
|
-
</AnimatePresence>
|
451
|
-
|
452
|
-
</div>
|
453
|
-
<div className="py-6 shadow-sh1 bg-neutral-0 pl-4 pr-8 self-end w-full">
|
454
|
-
|
455
|
-
<div className='flex flex-row justify-around'>
|
456
|
-
<div className='w-full flex gap-2'>
|
457
|
-
{!hideLoginButton && <a href={loginURL} className='w-1/2'>
|
458
|
-
<HDSButton
|
459
|
-
label="Log In"
|
460
|
-
type='tonal'
|
461
|
-
leftIconVariant='none'
|
462
|
-
rightIconVariant='none'
|
463
|
-
state='default'
|
464
|
-
size='sm'
|
465
|
-
rightAnimatedArrow='true'
|
466
|
-
rightAnimatedArrowColor='#3970FD'
|
467
|
-
animatedHoverStroke='group-hover:stroke-neutral-0'
|
468
|
-
className=' !w-full'
|
469
|
-
/>
|
470
|
-
</a>}
|
471
|
-
<a href={signupURL} className={!hideLoginButton ? 'w-1/2' : 'w-full'}>
|
472
|
-
<HDSButton
|
473
|
-
label="Get Started"
|
474
|
-
type='primary'
|
475
|
-
leftIconVariant='none'
|
476
|
-
rightIconVariant='none'
|
477
|
-
state='default'
|
478
|
-
size='sm'
|
479
|
-
rightAnimatedArrow='true'
|
480
|
-
rightAnimatedArrowColor='#ffffff'
|
481
|
-
animatedHoverStroke='group-hover:stroke-neutral-0'
|
482
|
-
className=' !w-full'
|
483
|
-
/>
|
484
|
-
</a>
|
485
|
-
</div>
|
486
|
-
</div>
|
487
|
-
|
488
|
-
</div>
|
404
|
+
<div
|
405
|
+
className={
|
406
|
+
"bg-neutral-100 shadow-sh1 hds-hidden-tbl block fixed w-full tb:max-w-[480px] tb:left-auto tb:right-0 mx-auto left-4 top-0 transform transition duration-500 ease-in-out h-[calc(100%-1px)] max-h-screen overflow-y-auto" +
|
407
|
+
(mobileNavOpen ? " translate-x-0" : " translate-x-[1240px]")
|
408
|
+
}
|
409
|
+
>
|
410
|
+
<div className="bg-neutral-100 h-[calc(100%-80px)] rounded-2xl overflow-y-scroll scrollbar-hide">
|
411
|
+
<div className="pt-6 pb-4 tb:mr-[12px] mr-[30px] min-h-[36px] flex flex-row justify-between items-center sticky top-0 bg-neutral-100 z-50 ">
|
412
|
+
{(isCompany || isDeveloper || isProduct) && (
|
413
|
+
<div
|
414
|
+
className=" flex flex-row justify-start z-10"
|
415
|
+
onClick={() => handleBackClick()}
|
416
|
+
>
|
417
|
+
<Icon
|
418
|
+
height="w-5 h-5 ml-4 cursor-pointer"
|
419
|
+
variant={"arrowleft"}
|
420
|
+
strokeClass="stroke-neutral-1000"
|
421
|
+
/>
|
422
|
+
</div>
|
423
|
+
)}
|
424
|
+
<motion.div
|
425
|
+
initial={{ opacity: 0 }}
|
426
|
+
animate={{ opacity: 1 }}
|
427
|
+
transition={{ duration: 0.4, opacity: { ease: "easeIn" } }}
|
428
|
+
className="w-full justify-center flex "
|
429
|
+
>
|
430
|
+
<Typography
|
431
|
+
textStyle="body3c-medium"
|
432
|
+
className="text-neutral-900"
|
433
|
+
>
|
434
|
+
{currentTab}
|
435
|
+
</Typography>
|
436
|
+
</motion.div>
|
437
|
+
{(isCompany || isDeveloper || isProduct) && (
|
438
|
+
<motion.div
|
439
|
+
initial={{ opacity: 0 }}
|
440
|
+
animate={{ opacity: 1 }}
|
441
|
+
transition={{ duration: 0.4, opacity: { ease: "easeIn" } }}
|
442
|
+
className=" flex flex-row justify-start z-10"
|
443
|
+
onClick={() => handleMbDropdownClose()}
|
444
|
+
>
|
445
|
+
<Icon
|
446
|
+
height="w-5 h-5 ml-4 stroke-2 cursor-pointer"
|
447
|
+
variant={"xclose"}
|
448
|
+
strokeClass="stroke-neutral-1000"
|
449
|
+
/>
|
450
|
+
</motion.div>
|
451
|
+
)}
|
452
|
+
</div>
|
453
|
+
<AnimatePresence mode="wait" exit={false}>
|
454
|
+
{isProduct || isDeveloper || isCompany ? (
|
455
|
+
<motion.div
|
456
|
+
key="hey"
|
457
|
+
exit={{ opacity: 0, y: [0, 300] }}
|
458
|
+
animate={{ opacity: 1, y: [300, 0] }}
|
459
|
+
transition={{
|
460
|
+
duration: 0.2,
|
461
|
+
exit: { duration: 0.3 },
|
462
|
+
opacity: { ease: "easeIn" },
|
463
|
+
}}
|
464
|
+
when={isProduct || isDeveloper || isCompany}
|
465
|
+
className="flex flex-col justify-between "
|
466
|
+
>
|
467
|
+
<div className="flex flex-col justify-between rounded-2xl h-full">
|
468
|
+
<div className="pl-4 pr-8 tb:pr-4">
|
469
|
+
{mobileNav(props.HEADER_LIST)}
|
470
|
+
</div>
|
489
471
|
</div>
|
490
|
-
|
472
|
+
</motion.div>
|
473
|
+
) : (
|
474
|
+
<motion.div
|
475
|
+
initial={{ opacity: 1 }}
|
476
|
+
animate={{ opacity: 1 }}
|
477
|
+
transition={{ duration: 0.1, opacity: { ease: "easeIn" } }}
|
478
|
+
className="mt-7 flex flex-col gap-6 ml-4"
|
479
|
+
>
|
480
|
+
<div className="flex flex-col mr-[50px] mb-m:items-center items-end">
|
481
|
+
<img
|
482
|
+
className="inline-block max-w-[242px] w-full"
|
483
|
+
src="https://res.cloudinary.com/dh8fp23nd/image/upload/v1705670474/website%20v3/customers/mutations_1_tdh5ir_yf6n7k.png"
|
484
|
+
alt="hasura-header-illustration"
|
485
|
+
loading="lazy"
|
486
|
+
/>
|
487
|
+
</div>
|
488
|
+
<nav className="grid divide-y mr-8 tb:mr-4 bg-neutral-0 divide-neutral-200 border border-neutral-200 rounded-3xl mb-6">
|
489
|
+
{props.HEADER_LIST.map((item) => (
|
490
|
+
<div
|
491
|
+
key={item["title"]}
|
492
|
+
onClick={() => handleMbDropdownClick(item["title"])}
|
493
|
+
className="flex justify-between items-center p-4 cursor-pointer group"
|
494
|
+
>
|
495
|
+
<div className="flex items-center justify-center gap-2">
|
496
|
+
{/* <Icon height="h-5 w-5" variant="home03" strokeColor="#3970FD" /> */}
|
497
|
+
<Typography
|
498
|
+
textStyle="body3c-medium"
|
499
|
+
className="text-neutral-700 hover:text-neutral-1000 transition-all duration-300 ease-in-out"
|
500
|
+
>
|
501
|
+
{`${item["title"]}`}
|
502
|
+
</Typography>
|
503
|
+
</div>
|
504
|
+
<Icon
|
505
|
+
height="h-5 w-5 stroke-[1.5px] group-hover:translate-x-1 ease-in-out transition duration-300"
|
506
|
+
variant="chevronright"
|
507
|
+
strokeClass="stroke-neutral-500"
|
508
|
+
/>
|
509
|
+
</div>
|
510
|
+
))}
|
511
|
+
</nav>
|
512
|
+
</motion.div>
|
513
|
+
)}
|
514
|
+
</AnimatePresence>
|
515
|
+
</div>
|
516
|
+
<div className="py-6 shadow-sh1 bg-neutral-0 pl-4 pr-8 self-end w-full">
|
517
|
+
<div className="flex flex-row justify-around">
|
518
|
+
<div className="w-full flex gap-2">
|
519
|
+
{!hideLoginButton && (
|
520
|
+
<a href={loginURL} className="w-1/2">
|
521
|
+
<HDSButton
|
522
|
+
label="Log In"
|
523
|
+
type="tonal"
|
524
|
+
leftIconVariant="none"
|
525
|
+
rightIconVariant="none"
|
526
|
+
state="default"
|
527
|
+
size="sm"
|
528
|
+
rightAnimatedArrow="true"
|
529
|
+
rightAnimatedArrowColor="#3970FD"
|
530
|
+
animatedHoverStroke="group-hover:stroke-neutral-0"
|
531
|
+
className=" !w-full"
|
532
|
+
/>
|
533
|
+
</a>
|
534
|
+
)}
|
535
|
+
<a
|
536
|
+
href={signupURL}
|
537
|
+
className={!hideLoginButton ? "w-1/2" : "w-full"}
|
538
|
+
>
|
539
|
+
<HDSButton
|
540
|
+
label="Get Started"
|
541
|
+
type="primary"
|
542
|
+
leftIconVariant="none"
|
543
|
+
rightIconVariant="none"
|
544
|
+
state="default"
|
545
|
+
size="sm"
|
546
|
+
rightAnimatedArrow="true"
|
547
|
+
rightAnimatedArrowColor="#ffffff"
|
548
|
+
animatedHoverStroke="group-hover:stroke-neutral-0"
|
549
|
+
className=" !w-full"
|
550
|
+
/>
|
551
|
+
</a>
|
491
552
|
</div>
|
553
|
+
</div>
|
492
554
|
</div>
|
555
|
+
</div>
|
493
556
|
</div>
|
494
|
-
|
557
|
+
</div>
|
558
|
+
</div>
|
559
|
+
);
|
495
560
|
}
|
496
561
|
|
497
562
|
V3Header.defaultProps = {
|
498
|
-
|
499
|
-
|
500
|
-
|
563
|
+
hideLoginButton: false,
|
564
|
+
hideSearch: false,
|
565
|
+
HEADER_LIST: [
|
566
|
+
{
|
567
|
+
title: "Product",
|
568
|
+
primaryCard: {
|
569
|
+
iconVariant: "layersthree01",
|
570
|
+
mainDescription: `Discover Hasura's core capabilities for automating the building, securing, optimizing, and deploying of APIs.`,
|
571
|
+
primaryBtnLabel: "Hasura Data API Platform",
|
572
|
+
primaryBtnCTA: "/products",
|
573
|
+
strokeClass: "stroke-neutral-800",
|
574
|
+
tertiaryBtn: [
|
575
|
+
{
|
576
|
+
cta_leftVariantIcon: "checksquarebroken",
|
577
|
+
cta_leftVariantIconColor: "#6C737F",
|
578
|
+
cta_text: "Compare Plans",
|
579
|
+
cta_link: "/pricing",
|
580
|
+
},
|
581
|
+
],
|
582
|
+
secondaryBtn: [
|
583
|
+
{
|
584
|
+
cta_leftVariantIcon: "zap",
|
585
|
+
cta_leftVariantIconColor: "#6C737F",
|
586
|
+
cta_text: "Deployment Options",
|
587
|
+
cta_link: "/products/deployment",
|
588
|
+
},
|
589
|
+
],
|
590
|
+
},
|
591
|
+
secondaryCardArr: [
|
501
592
|
{
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
tertiaryBtn: [
|
510
|
-
{ cta_leftVariantIcon: 'checksquarebroken', cta_leftVariantIconColor: '#6C737F', cta_text: 'Compare Plans', cta_link:'/pricing' }
|
511
|
-
],
|
512
|
-
secondaryBtn: [
|
513
|
-
{ cta_leftVariantIcon: 'zap', cta_leftVariantIconColor: '#6C737F', cta_text: 'Deployment Options', cta_link: '/products/deployment' }
|
514
|
-
],
|
593
|
+
childArray: [
|
594
|
+
{
|
595
|
+
description: "",
|
596
|
+
href: "/products/instant-api",
|
597
|
+
icon: "lightning01",
|
598
|
+
name: "Instant API",
|
599
|
+
strokeClass: "stroke-neutral-500",
|
515
600
|
},
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
strokeClass: 'stroke-neutral-500'
|
554
|
-
},
|
555
|
-
{
|
556
|
-
description: '',
|
557
|
-
href: '/products/observability',
|
558
|
-
icon: "piechart01",
|
559
|
-
name: 'Observability',
|
560
|
-
strokeClass: 'stroke-neutral-500'
|
561
|
-
}
|
562
|
-
],
|
563
|
-
label: 'CAPABILITIES'
|
564
|
-
},
|
565
|
-
{
|
566
|
-
childArray: [
|
567
|
-
{
|
568
|
-
description: '',
|
569
|
-
href: '/graphql/database',
|
570
|
-
icon: 'database01',
|
571
|
-
name: 'All Databases',
|
572
|
-
strokeClass: 'stroke-neutral-500'
|
573
|
-
},
|
574
|
-
{
|
575
|
-
description: '',
|
576
|
-
href: '/graphql/database?category=planned',
|
577
|
-
icon: 'checksquare',
|
578
|
-
name: 'Planned Databases',
|
579
|
-
strokeClass: 'stroke-neutral-500'
|
580
|
-
},
|
581
|
-
],
|
582
|
-
label: 'Data sources'
|
583
|
-
}
|
584
|
-
],
|
585
|
-
flyoutD:{
|
586
|
-
link:'https://hasura.io/ai',
|
587
|
-
IconVariant:'aibot',
|
588
|
-
btnLabel:'AI with Hasura',
|
589
|
-
description:'Use Hasura Notebook to get Gen AI querying over your structured private data sources via GraphQL and REST APIs'
|
590
|
-
}
|
601
|
+
{
|
602
|
+
description: "",
|
603
|
+
href: "/products/authorization",
|
604
|
+
icon: "eye",
|
605
|
+
name: "Authorization",
|
606
|
+
strokeClass: "stroke-neutral-500",
|
607
|
+
},
|
608
|
+
{
|
609
|
+
description: "",
|
610
|
+
href: "/products/performance",
|
611
|
+
icon: "speedometer03",
|
612
|
+
name: "Performance",
|
613
|
+
strokeClass: "stroke-neutral-500",
|
614
|
+
},
|
615
|
+
{
|
616
|
+
description: "",
|
617
|
+
href: "/products/federation",
|
618
|
+
icon: "data",
|
619
|
+
name: "Federation",
|
620
|
+
strokeClass: "stroke-neutral-500",
|
621
|
+
},
|
622
|
+
{
|
623
|
+
description: "",
|
624
|
+
href: "/products/api-security",
|
625
|
+
icon: "shieldtick",
|
626
|
+
name: "API Security",
|
627
|
+
strokeClass: "stroke-neutral-500",
|
628
|
+
},
|
629
|
+
{
|
630
|
+
description: "",
|
631
|
+
href: "/products/observability",
|
632
|
+
icon: "piechart01",
|
633
|
+
name: "Observability",
|
634
|
+
strokeClass: "stroke-neutral-500",
|
635
|
+
},
|
636
|
+
],
|
637
|
+
label: "CAPABILITIES",
|
591
638
|
},
|
592
639
|
{
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
strokeClass: 'stroke-neutral-500'
|
611
|
-
},
|
612
|
-
{
|
613
|
-
description: '',
|
614
|
-
href: '/reference-app/',
|
615
|
-
icon: 'route',
|
616
|
-
name: 'Guides',
|
617
|
-
strokeClass: 'stroke-neutral-500'
|
618
|
-
},
|
619
|
-
{
|
620
|
-
description: '',
|
621
|
-
href: '/graphql/',
|
622
|
-
icon: 'asterisk02',
|
623
|
-
name: 'GraphQL Hub',
|
624
|
-
strokeClass: 'stroke-neutral-500'
|
625
|
-
},
|
626
|
-
{
|
627
|
-
description: '',
|
628
|
-
href: 'https://cloud.hasura.io/public/graphiql',
|
629
|
-
icon: "codebrowser",
|
630
|
-
name: 'GraphiQL',
|
631
|
-
strokeClass: 'stroke-neutral-500'
|
632
|
-
},
|
633
|
-
{
|
634
|
-
description: '',
|
635
|
-
href: '/changelog',
|
636
|
-
icon: 'gitpullrequest',
|
637
|
-
name: 'Changelog',
|
638
|
-
strokeClass: 'stroke-neutral-500'
|
639
|
-
}
|
640
|
-
],
|
641
|
-
label: 'BUILD'
|
642
|
-
},
|
643
|
-
{
|
644
|
-
|
645
|
-
childArray: [
|
646
|
-
{
|
647
|
-
description: '',
|
648
|
-
href: '/blog',
|
649
|
-
icon: 'bookopen01',
|
650
|
-
name: 'Blog',
|
651
|
-
strokeClass: 'stroke-neutral-500'
|
652
|
-
},
|
653
|
-
{
|
654
|
-
description: '',
|
655
|
-
href: '/learn/',
|
656
|
-
icon: 'graduationhat02',
|
657
|
-
name: 'Tutorials',
|
658
|
-
strokeClass: 'stroke-neutral-500'
|
659
|
-
},
|
660
|
-
{
|
661
|
-
description: '',
|
662
|
-
href: '/events',
|
663
|
-
icon: 'calendarplus02',
|
664
|
-
name: 'Events',
|
665
|
-
strokeClass: 'stroke-neutral-500'
|
666
|
-
},
|
667
|
-
{
|
668
|
-
description: '',
|
669
|
-
href: '/sample-apps/',
|
670
|
-
icon: 'box',
|
671
|
-
name: 'Resources',
|
672
|
-
strokeClass: 'stroke-neutral-500'
|
673
|
-
},
|
674
|
-
],
|
675
|
-
label: 'Learn',
|
676
|
-
|
677
|
-
},
|
678
|
-
{
|
679
|
-
|
680
|
-
childArray: [
|
681
|
-
{
|
682
|
-
description: '',
|
683
|
-
href: '/community/',
|
684
|
-
icon: 'users01',
|
685
|
-
name: 'Community',
|
686
|
-
strokeClass: 'stroke-neutral-500'
|
687
|
-
},
|
688
|
-
{
|
689
|
-
description: '',
|
690
|
-
href: 'https://discord.com/invite/hasura',
|
691
|
-
icon: 'discord',
|
692
|
-
name: 'Discord',
|
693
|
-
strokeClass: ''
|
694
|
-
},
|
695
|
-
{
|
696
|
-
description: '',
|
697
|
-
href: 'https://github.com/hasura/graphql-engine/discussions',
|
698
|
-
icon: 'octoface',
|
699
|
-
name: 'Discussions',
|
700
|
-
strokeClass: ''
|
701
|
-
},
|
702
|
-
{
|
703
|
-
description: '',
|
704
|
-
href: 'https://www.meetup.com/pro/hasura/',
|
705
|
-
icon: 'meetup',
|
706
|
-
name: 'Meetups',
|
707
|
-
strokeClass: ''
|
708
|
-
},
|
709
|
-
{
|
710
|
-
description: '',
|
711
|
-
href: '/support/',
|
712
|
-
icon: 'hand',
|
713
|
-
name: 'Support',
|
714
|
-
strokeClass: 'stroke-neutral-500'
|
715
|
-
},
|
716
|
-
],
|
717
|
-
label: 'Connect',
|
718
|
-
|
719
|
-
},
|
720
|
-
],
|
721
|
-
|
722
|
-
tertiaryCard: [
|
723
|
-
{
|
724
|
-
title: 'HasuraCon 2023 is here!',
|
725
|
-
|
726
|
-
title_colorClass: 'text-neutral-900',
|
727
|
-
img_url: 'https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/hascon_211daeb83a.png'
|
728
|
-
},
|
729
|
-
{
|
730
|
-
title: 'Top 6 Architecture Trends for API Development',
|
731
|
-
|
732
|
-
title_colorClass: 'text-neutral-900',
|
733
|
-
img_url: 'https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/api_trends_0a035678d8.png'
|
734
|
-
},
|
735
|
-
{
|
736
|
-
title: 'Announcing Hasura integration with Snowflake',
|
737
|
-
|
738
|
-
title_colorClass: 'text-neutral-900',
|
739
|
-
img_url: 'https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/snowflake_def20494db.png'
|
740
|
-
},
|
741
|
-
]
|
640
|
+
childArray: [
|
641
|
+
{
|
642
|
+
description: "",
|
643
|
+
href: "/graphql/database",
|
644
|
+
icon: "database01",
|
645
|
+
name: "All Databases",
|
646
|
+
strokeClass: "stroke-neutral-500",
|
647
|
+
},
|
648
|
+
{
|
649
|
+
description: "",
|
650
|
+
href: "/graphql/database?category=planned",
|
651
|
+
icon: "checksquare",
|
652
|
+
name: "Planned Databases",
|
653
|
+
strokeClass: "stroke-neutral-500",
|
654
|
+
},
|
655
|
+
],
|
656
|
+
label: "Data sources",
|
742
657
|
},
|
658
|
+
],
|
659
|
+
flyoutD: {
|
660
|
+
link: "https://hasura.io/ai",
|
661
|
+
IconVariant: "aibot",
|
662
|
+
btnLabel: "AI with Hasura",
|
663
|
+
description:
|
664
|
+
"Use Hasura Notebook to get Gen AI querying over your structured private data sources via GraphQL and REST APIs",
|
665
|
+
},
|
666
|
+
},
|
667
|
+
{
|
668
|
+
title: "Developer",
|
669
|
+
secondaryCardArr: [
|
743
670
|
{
|
671
|
+
childArray: [
|
672
|
+
{
|
673
|
+
description: "",
|
674
|
+
href: "/docs/latest/index/",
|
675
|
+
icon: "file02",
|
676
|
+
name: "Documentation",
|
677
|
+
strokeClass: "stroke-neutral-500",
|
678
|
+
},
|
679
|
+
{
|
680
|
+
description: "",
|
681
|
+
href: "/hub",
|
682
|
+
icon: "hasura",
|
683
|
+
name: "Hasura Hub",
|
684
|
+
strokeClass: "stroke-neutral-500",
|
685
|
+
},
|
686
|
+
{
|
687
|
+
description: "",
|
688
|
+
href: "/reference-app/",
|
689
|
+
icon: "route",
|
690
|
+
name: "Guides",
|
691
|
+
strokeClass: "stroke-neutral-500",
|
692
|
+
},
|
693
|
+
{
|
694
|
+
description: "",
|
695
|
+
href: "/graphql/",
|
696
|
+
icon: "asterisk02",
|
697
|
+
name: "GraphQL Hub",
|
698
|
+
strokeClass: "stroke-neutral-500",
|
699
|
+
},
|
700
|
+
{
|
701
|
+
description: "",
|
702
|
+
href: "https://cloud.hasura.io/public/graphiql",
|
703
|
+
icon: "codebrowser",
|
704
|
+
name: "GraphiQL",
|
705
|
+
strokeClass: "stroke-neutral-500",
|
706
|
+
},
|
707
|
+
{
|
708
|
+
description: "",
|
709
|
+
href: "/changelog",
|
710
|
+
icon: "gitpullrequest",
|
711
|
+
name: "Changelog",
|
712
|
+
strokeClass: "stroke-neutral-500",
|
713
|
+
},
|
714
|
+
],
|
715
|
+
label: "BUILD",
|
716
|
+
},
|
717
|
+
{
|
718
|
+
childArray: [
|
719
|
+
{
|
720
|
+
description: "",
|
721
|
+
href: "/blog",
|
722
|
+
icon: "bookopen01",
|
723
|
+
name: "Blog",
|
724
|
+
strokeClass: "stroke-neutral-500",
|
725
|
+
},
|
726
|
+
{
|
727
|
+
description: "",
|
728
|
+
href: "/learn/",
|
729
|
+
icon: "graduationhat02",
|
730
|
+
name: "Tutorials",
|
731
|
+
strokeClass: "stroke-neutral-500",
|
732
|
+
},
|
733
|
+
{
|
734
|
+
description: "",
|
735
|
+
href: "/events",
|
736
|
+
icon: "calendarplus02",
|
737
|
+
name: "Events",
|
738
|
+
strokeClass: "stroke-neutral-500",
|
739
|
+
},
|
740
|
+
{
|
741
|
+
description: "",
|
742
|
+
href: "/sample-apps/",
|
743
|
+
icon: "box",
|
744
|
+
name: "Resources",
|
745
|
+
strokeClass: "stroke-neutral-500",
|
746
|
+
},
|
747
|
+
],
|
748
|
+
label: "Learn",
|
749
|
+
},
|
750
|
+
{
|
751
|
+
childArray: [
|
752
|
+
{
|
753
|
+
description: "",
|
754
|
+
href: "/community/",
|
755
|
+
icon: "users01",
|
756
|
+
name: "Community",
|
757
|
+
strokeClass: "stroke-neutral-500",
|
758
|
+
},
|
759
|
+
{
|
760
|
+
description: "",
|
761
|
+
href: "https://discord.com/invite/hasura",
|
762
|
+
icon: "discord",
|
763
|
+
name: "Discord",
|
764
|
+
strokeClass: "",
|
765
|
+
},
|
766
|
+
{
|
767
|
+
description: "",
|
768
|
+
href: "https://github.com/hasura/graphql-engine/discussions",
|
769
|
+
icon: "octoface",
|
770
|
+
name: "Discussions",
|
771
|
+
strokeClass: "",
|
772
|
+
},
|
773
|
+
{
|
774
|
+
description: "",
|
775
|
+
href: "https://www.meetup.com/pro/hasura/",
|
776
|
+
icon: "meetup",
|
777
|
+
name: "Meetups",
|
778
|
+
strokeClass: "",
|
779
|
+
},
|
780
|
+
{
|
781
|
+
description: "",
|
782
|
+
href: "/support/",
|
783
|
+
icon: "hand",
|
784
|
+
name: "Support",
|
785
|
+
strokeClass: "stroke-neutral-500",
|
786
|
+
},
|
787
|
+
],
|
788
|
+
label: "Connect",
|
789
|
+
},
|
790
|
+
],
|
744
791
|
|
745
|
-
|
746
|
-
|
792
|
+
tertiaryCard: [
|
793
|
+
{
|
794
|
+
title: "HasuraCon 2023 is here!",
|
747
795
|
|
796
|
+
title_colorClass: "text-neutral-900",
|
797
|
+
img_url:
|
798
|
+
"https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/hascon_211daeb83a.png",
|
748
799
|
},
|
800
|
+
{
|
801
|
+
title: "Top 6 Architecture Trends for API Development",
|
749
802
|
|
803
|
+
title_colorClass: "text-neutral-900",
|
804
|
+
img_url:
|
805
|
+
"https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/api_trends_0a035678d8.png",
|
806
|
+
},
|
750
807
|
{
|
808
|
+
title: "Announcing Hasura integration with Snowflake",
|
751
809
|
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
childArray: [
|
756
|
-
{
|
757
|
-
description: '',
|
758
|
-
href: '/about/',
|
759
|
-
icon: "pentool02",
|
760
|
-
name: 'Our Story',
|
761
|
-
strokeClass: 'stroke-neutral-500'
|
762
|
-
},
|
763
|
-
{
|
764
|
-
description: '',
|
765
|
-
href: '/partners',
|
766
|
-
icon: 'intersectcircle',
|
767
|
-
name: 'Partners',
|
768
|
-
strokeClass: 'stroke-neutral-500'
|
769
|
-
},
|
770
|
-
{
|
771
|
-
description: '',
|
772
|
-
href: '/careers/',
|
773
|
-
icon: 'hearthand',
|
774
|
-
name: 'Work at Hasura',
|
775
|
-
strokeClass: 'stroke-neutral-500'
|
776
|
-
},
|
777
|
-
// {
|
778
|
-
// description: '',
|
779
|
-
// href: '/press/',
|
780
|
-
// icon: 'headingsquare',
|
781
|
-
// name: 'Newsroom',
|
782
|
-
// strokeClass: 'stroke-neutral-500'
|
783
|
-
// },
|
784
|
-
// {
|
785
|
-
// description: '',
|
786
|
-
// href: '/brand',
|
787
|
-
// icon: 'star06',
|
788
|
-
// name: 'Brand',
|
789
|
-
// strokeClass: 'stroke-neutral-500'
|
790
|
-
// },
|
791
|
-
|
792
|
-
],
|
793
|
-
label: 'Company'
|
794
|
-
},
|
795
|
-
|
796
|
-
],
|
797
|
-
|
798
|
-
tertiaryCard: [
|
799
|
-
{
|
800
|
-
title: 'HasuraCon 2023 is here!',
|
801
|
-
|
802
|
-
title_colorClass: 'text-neutral-900',
|
803
|
-
img_url: 'https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/hascon_211daeb83a.png'
|
804
|
-
},
|
805
|
-
{
|
806
|
-
title: 'Top 6 Architecture Trends for API Development',
|
807
|
-
|
808
|
-
title_colorClass: 'text-neutral-900',
|
809
|
-
img_url: 'https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/api_trends_0a035678d8.png'
|
810
|
-
},
|
811
|
-
{
|
812
|
-
title: 'Announcing Hasura integration with Snowflake',
|
813
|
-
|
814
|
-
title_colorClass: 'text-neutral-900',
|
815
|
-
img_url: 'https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/snowflake_def20494db.png'
|
816
|
-
},
|
817
|
-
]
|
810
|
+
title_colorClass: "text-neutral-900",
|
811
|
+
img_url:
|
812
|
+
"https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/snowflake_def20494db.png",
|
818
813
|
},
|
814
|
+
],
|
815
|
+
},
|
816
|
+
{
|
817
|
+
title: "Customers",
|
818
|
+
href: "",
|
819
|
+
},
|
820
|
+
|
821
|
+
{
|
822
|
+
title: "Company",
|
823
|
+
secondaryCardArr: [
|
819
824
|
{
|
825
|
+
childArray: [
|
826
|
+
{
|
827
|
+
description: "",
|
828
|
+
href: "/about/",
|
829
|
+
icon: "pentool02",
|
830
|
+
name: "Our Story",
|
831
|
+
strokeClass: "stroke-neutral-500",
|
832
|
+
},
|
833
|
+
{
|
834
|
+
description: "",
|
835
|
+
href: "/partners",
|
836
|
+
icon: "intersectcircle",
|
837
|
+
name: "Partners",
|
838
|
+
strokeClass: "stroke-neutral-500",
|
839
|
+
},
|
840
|
+
{
|
841
|
+
description: "",
|
842
|
+
href: "/careers/",
|
843
|
+
icon: "hearthand",
|
844
|
+
name: "Work at Hasura",
|
845
|
+
strokeClass: "stroke-neutral-500",
|
846
|
+
},
|
847
|
+
// {
|
848
|
+
// description: '',
|
849
|
+
// href: '/press/',
|
850
|
+
// icon: 'headingsquare',
|
851
|
+
// name: 'Newsroom',
|
852
|
+
// strokeClass: 'stroke-neutral-500'
|
853
|
+
// },
|
854
|
+
// {
|
855
|
+
// description: '',
|
856
|
+
// href: '/brand',
|
857
|
+
// icon: 'star06',
|
858
|
+
// name: 'Brand',
|
859
|
+
// strokeClass: 'stroke-neutral-500'
|
860
|
+
// },
|
861
|
+
],
|
862
|
+
label: "Company",
|
863
|
+
},
|
864
|
+
],
|
820
865
|
|
821
|
-
|
822
|
-
|
866
|
+
tertiaryCard: [
|
867
|
+
{
|
868
|
+
title: "HasuraCon 2023 is here!",
|
823
869
|
|
870
|
+
title_colorClass: "text-neutral-900",
|
871
|
+
img_url:
|
872
|
+
"https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/hascon_211daeb83a.png",
|
824
873
|
},
|
874
|
+
{
|
875
|
+
title: "Top 6 Architecture Trends for API Development",
|
825
876
|
|
877
|
+
title_colorClass: "text-neutral-900",
|
878
|
+
img_url:
|
879
|
+
"https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/api_trends_0a035678d8.png",
|
880
|
+
},
|
881
|
+
{
|
882
|
+
title: "Announcing Hasura integration with Snowflake",
|
826
883
|
|
827
|
-
|
828
|
-
|
829
|
-
|
884
|
+
title_colorClass: "text-neutral-900",
|
885
|
+
img_url:
|
886
|
+
"https://res.cloudinary.com/hasura-cms-uploads/image/upload/v1687040455/snowflake_def20494db.png",
|
887
|
+
},
|
888
|
+
],
|
889
|
+
},
|
890
|
+
{
|
891
|
+
title: "Pricing",
|
892
|
+
href: "",
|
893
|
+
},
|
894
|
+
],
|
895
|
+
headerUrl: "/",
|
896
|
+
};
|