@jetshop/template-trend 5.11.2 → 5.12.2
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/.linaria-cache/packages/template-trend/src/components/ContentPage/ContentPage.linaria.css +5 -3
- package/.linaria-cache/packages/template-trend/src/components/ContentPage/SubPageNavigation.linaria.css +4 -0
- package/.linaria-cache/packages/ui/Breadcrumbs/Breadcrumbs.linaria.css +1 -1
- package/.linaria-cache/packages/ui/DropdownMenu/DropdownMenu.linaria.css +1 -1
- package/package.json +5 -5
- package/schema.graphql +9 -2
- package/src/components/Cart/CartFlyout.js +10 -2
- package/src/components/CategoryPage/Filters/SortOrders.js +3 -7
- package/src/components/CategoryPage/ProductCard.js +1 -1
- package/src/components/ContentPage/ContentPage.js +69 -38
- package/src/components/ContentPage/ContentPageFragment.gql +29 -0
- package/src/components/ContentPage/SubPageNavigation.js +206 -0
- package/src/components/Layout/Footer/FooterLinks.js +6 -4
- package/src/components/Layout/Footer/PagesQuery.gql +9 -0
- package/src/components/ProductPage/AddToCart/ProductToast.js +11 -3
- package/src/components/StartPage/Content/StartPageHero.js +3 -0
- package/src/components/StartPage/ContentItemFragment.gql +6 -1
- package/src/shop.config.js +1 -1
package/.linaria-cache/packages/template-trend/src/components/ContentPage/ContentPage.linaria.css
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
.
|
|
2
|
-
.
|
|
3
|
-
.
|
|
1
|
+
.Content_c1j1g21v{padding-bottom:1rem;}.Content_c1j1g21v p{margin-bottom:1rem;}
|
|
2
|
+
.container_c1fnqd8r{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}
|
|
3
|
+
.sidebar_s19kzxi7{max-width:288px;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;border-right:1px solid #dedede;margin-right:2rem;padding:2rem 0;}@media (max-width:799px){.sidebar_s19kzxi7{display:none;}}
|
|
4
|
+
.content_c18mz79g{max-width:60rem;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:2rem 0;}.content_c18mz79g h1{margin-bottom:1rem;}
|
|
5
|
+
.body_bqf7s3s{margin-top:1rem;}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
.menu_mn7zz18{width:100%;}@media (min-width:50em){.menu_mn7zz18{display:none;}}.menu_mn7zz18 [data-flight-dropdown-button]{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.75em;border:1px solid #dedede;width:100%;text-align:left;background:#FFFFFF;border-radius:3px;outline:none;}.menu_mn7zz18 [data-flight-dropdown-button]:focus{color:#146DE1;}.menu_mn7zz18 [data-flight-dropdown-button][aria-expanded='true']{border-radius:3px 3px 0 0;border-bottom:0;color:#146DE1;}.menu_mn7zz18 [data-flight-dropdown-button][aria-expanded='true'] .carot{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}.menu_mn7zz18 [data-flight-dropdown-items]{position:absolute;top:100%;left:0;background:white;display:block;z-index:2;outline:none;width:100%;border:1px solid #dedede;border-top:0;}.menu_mn7zz18 [data-flight-dropdown-item]{line-height:1.5;border:none;cursor:pointer;white-space:normal;padding:0.5em 1em;}.menu_mn7zz18 [data-flight-dropdown-item]:hover{color:blue;}.menu_mn7zz18 [data-flight-dropdown-item] a{-webkit-text-decoration:none;text-decoration:none;color:#000;}.menu_mn7zz18 [data-flight-dropdown-item]:focus{font-weight:bold;background:#f2f2f2;outline:none;position:relative;}.menu_mn7zz18 [data-flight-dropdown-item]:focus:before{content:'';position:absolute;top:0;bottom:0;left:0;width:2px;background-color:#2f80ed;}
|
|
2
|
+
.links_l4wjvty{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
|
|
3
|
+
.link_lkx9gc5{color:#000;-webkit-text-decoration:none;text-decoration:none;margin-bottom:1rem;line-height:1.5;}
|
|
4
|
+
.activeLink_a1iunu17{font-weight:bold;color:#2f80ed;}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.StyledBreadcrumbs_s11md4e4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin-bottom:2rem;}.StyledBreadcrumbs_s11md4e4 a,.StyledBreadcrumbs_s11md4e4 li{color:#707070;font-size:0.75rem;}.StyledBreadcrumbs_s11md4e4.hide-last li:last-child:after{display:none;}
|
|
1
|
+
.StyledBreadcrumbs_s11md4e4{line-height:1.5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin-bottom:2rem;}.StyledBreadcrumbs_s11md4e4 a,.StyledBreadcrumbs_s11md4e4 li{color:#707070;font-size:0.75rem;}.StyledBreadcrumbs_s11md4e4.hide-last li:last-child:after{display:none;}
|
|
2
2
|
.Breadcrumb_b17ekgas{white-space:nowrap;}.Breadcrumb_b17ekgas:after{display:inline-block;content:'/';padding:0 0.33em;}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
.DropdownMenu0_dv23fto global([data-flight-dropdown-open='false'] [data-flight-dropdown-items]){display:none;}
|
|
2
|
-
.styles_ssx52uf{position:relative;}.styles_ssx52uf [data-flight-dropdown-button]{padding:0.5em 1em;border:1px solid #c0c0c0;border-radius:3px;}.styles_ssx52uf [data-flight-dropdown-items]{position:absolute;
|
|
2
|
+
.styles_ssx52uf{position:relative;}.styles_ssx52uf [data-flight-dropdown-button]{padding:0.5em 1em;border:1px solid #c0c0c0;border-radius:3px;}.styles_ssx52uf [data-flight-dropdown-items]{position:absolute;top:100%;left:0;background:white;white-space:nowrap;display:block;z-index:2;outline:none;}.styles_ssx52uf [data-flight-dropdown-item]{cursor:pointer;border-top:1px solid #c0c0c0;white-space:nowrap;padding:0.5em 1em;}.styles_ssx52uf [data-flight-dropdown-item]:hover{color:blue;}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jetshop/template-trend",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.12.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "react-scripts build",
|
|
@@ -45,11 +45,11 @@
|
|
|
45
45
|
]
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@jetshop/core": "^5.
|
|
48
|
+
"@jetshop/core": "^5.12.2",
|
|
49
49
|
"@jetshop/flight-shortcodes": "^2.0.10",
|
|
50
|
-
"@jetshop/intl": "^5.
|
|
51
|
-
"@jetshop/react-scripts": "^5.
|
|
52
|
-
"@jetshop/ui": "^5.
|
|
50
|
+
"@jetshop/intl": "^5.12.2",
|
|
51
|
+
"@jetshop/react-scripts": "^5.12.2",
|
|
52
|
+
"@jetshop/ui": "^5.12.2",
|
|
53
53
|
"@react-google-maps/api": "~1.7.0",
|
|
54
54
|
"prop-types": "^15.6.2",
|
|
55
55
|
"react": "^16.9.0",
|
package/schema.graphql
CHANGED
|
@@ -181,6 +181,7 @@ type Category implements Document {
|
|
|
181
181
|
mainHeader: String
|
|
182
182
|
content: String
|
|
183
183
|
externalId: String
|
|
184
|
+
externalDiscountId: String
|
|
184
185
|
images: [CategoryImage]
|
|
185
186
|
|
|
186
187
|
"""
|
|
@@ -212,7 +213,10 @@ type Category implements Document {
|
|
|
212
213
|
"""
|
|
213
214
|
isDynamic: Boolean!
|
|
214
215
|
|
|
215
|
-
"""
|
|
216
|
+
"""
|
|
217
|
+
Get content data set via the Content Editor.NB: Carries a performance cost, as
|
|
218
|
+
asking for this will result in a separate API call in the backend.
|
|
219
|
+
"""
|
|
216
220
|
data: Content
|
|
217
221
|
}
|
|
218
222
|
|
|
@@ -712,6 +716,7 @@ type DeleteCustomerProductListResult {
|
|
|
712
716
|
}
|
|
713
717
|
|
|
714
718
|
type Discount {
|
|
719
|
+
externalId: ID
|
|
715
720
|
name: String
|
|
716
721
|
value: Price
|
|
717
722
|
description: String
|
|
@@ -1134,6 +1139,7 @@ type Order {
|
|
|
1134
1139
|
orderDate: DateTime
|
|
1135
1140
|
currency: Currency
|
|
1136
1141
|
attachments: [OrderAttachment]
|
|
1142
|
+
orderPurchaseLocation: String
|
|
1137
1143
|
}
|
|
1138
1144
|
|
|
1139
1145
|
type OrderAddress {
|
|
@@ -1356,7 +1362,7 @@ type PagedResult {
|
|
|
1356
1362
|
result: [Product]!
|
|
1357
1363
|
}
|
|
1358
1364
|
|
|
1359
|
-
"""The `Paging` scalar type represents a numeric values between
|
|
1365
|
+
"""The `Paging` scalar type represents a numeric values between <1; 100>"""
|
|
1360
1366
|
scalar Paging
|
|
1361
1367
|
|
|
1362
1368
|
input PagingInput {
|
|
@@ -1558,6 +1564,7 @@ type Product implements Document {
|
|
|
1558
1564
|
"""
|
|
1559
1565
|
configurations: [ProductConfiguration]
|
|
1560
1566
|
hasConfigurations: Boolean!
|
|
1567
|
+
hasFamilyMembers: Boolean!
|
|
1561
1568
|
|
|
1562
1569
|
"""
|
|
1563
1570
|
Calculates the price of the product based on the configuration choices that's
|
|
@@ -164,8 +164,16 @@ const CartFlyoutView = ({ result, modal, ...rest }) => {
|
|
|
164
164
|
<Checkout
|
|
165
165
|
data-testid="checkout-button"
|
|
166
166
|
href={checkoutUrl}
|
|
167
|
-
onClick={
|
|
168
|
-
|
|
167
|
+
onClick={event => {
|
|
168
|
+
event.preventDefault();
|
|
169
|
+
track(
|
|
170
|
+
trackCartCheckoutEvent({
|
|
171
|
+
cart: result.data.cart,
|
|
172
|
+
callback: () => {
|
|
173
|
+
window.location = checkoutUrl;
|
|
174
|
+
}
|
|
175
|
+
})
|
|
176
|
+
);
|
|
169
177
|
}}
|
|
170
178
|
>
|
|
171
179
|
{t('Check out')}
|
|
@@ -24,12 +24,8 @@ export const SortOrders = ({ sortOrders }) => {
|
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
function SortOrderDropdown({ sortOrders }) {
|
|
27
|
-
const {
|
|
28
|
-
|
|
29
|
-
changeSortOrder,
|
|
30
|
-
sortOrder,
|
|
31
|
-
direction
|
|
32
|
-
} = useSortOrder({ sortOrders });
|
|
27
|
+
const { mappedSortOrder, changeSortOrder, sortOrder, direction } =
|
|
28
|
+
useSortOrder({ sortOrders });
|
|
33
29
|
|
|
34
30
|
const activeItem = mappedSortOrder.find(
|
|
35
31
|
item => item.direction === direction && item.value === sortOrder
|
|
@@ -48,7 +44,7 @@ function SortOrderDropdown({ sortOrders }) {
|
|
|
48
44
|
onSelect={() =>
|
|
49
45
|
changeSortOrder(sortItem.value, sortItem.direction)
|
|
50
46
|
}
|
|
51
|
-
key={sortItem.value}
|
|
47
|
+
key={`${sortItem.value}-${sortItem.direction}`}
|
|
52
48
|
>
|
|
53
49
|
{sortItem.text}
|
|
54
50
|
{activeItem === sortItem && <StyledCheck />}
|
|
@@ -74,7 +74,7 @@ export function ProductCard({
|
|
|
74
74
|
}) {
|
|
75
75
|
const hasImages = product.images && product.images.length > 0;
|
|
76
76
|
const Tag = as;
|
|
77
|
-
let badges = [...product.badges];
|
|
77
|
+
let badges = [...(product.badges || [])];
|
|
78
78
|
product.isPackage &&
|
|
79
79
|
badges.push({
|
|
80
80
|
location: 'TOP_RIGHT',
|
|
@@ -3,12 +3,13 @@ import { styled } from 'linaria/react';
|
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import UIMaxWidth from '../Layout/MaxWidth';
|
|
5
5
|
import { ContentRenderer } from '@jetshop/ui/ContentRenderer';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
import {
|
|
7
|
+
MobileNavigation,
|
|
8
|
+
DesktopNavigation,
|
|
9
|
+
shouldDisplayNavigation
|
|
10
|
+
} from './SubPageNavigation';
|
|
11
|
+
import { css } from 'linaria';
|
|
12
|
+
import Breadcrumbs from '@jetshop/ui/Breadcrumbs';
|
|
12
13
|
|
|
13
14
|
const Content = styled('div')`
|
|
14
15
|
padding-bottom: 1rem;
|
|
@@ -18,8 +19,35 @@ const Content = styled('div')`
|
|
|
18
19
|
}
|
|
19
20
|
`;
|
|
20
21
|
|
|
21
|
-
const
|
|
22
|
+
const container = css`
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: row;
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
const sidebar = css`
|
|
28
|
+
max-width: 288px;
|
|
29
|
+
flex: 1 1 auto;
|
|
30
|
+
border-right: 1px solid #dedede;
|
|
31
|
+
margin-right: 2rem;
|
|
32
|
+
padding: 2rem 0;
|
|
33
|
+
|
|
34
|
+
@media (max-width: 799px) {
|
|
35
|
+
display: none;
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
const content = css`
|
|
22
40
|
max-width: 60rem;
|
|
41
|
+
flex: 1 1 auto;
|
|
42
|
+
padding: 2rem 0;
|
|
43
|
+
|
|
44
|
+
h1 {
|
|
45
|
+
margin-bottom: 1rem;
|
|
46
|
+
}
|
|
47
|
+
`;
|
|
48
|
+
|
|
49
|
+
const body = css`
|
|
50
|
+
margin-top: 1rem;
|
|
23
51
|
`;
|
|
24
52
|
|
|
25
53
|
const components = {
|
|
@@ -34,44 +62,47 @@ const components = {
|
|
|
34
62
|
}
|
|
35
63
|
};
|
|
36
64
|
|
|
37
|
-
function ContentPage(
|
|
38
|
-
const { page } = props;
|
|
65
|
+
function ContentPage({ page, result }) {
|
|
39
66
|
return (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
<
|
|
67
|
+
<UIMaxWidth className={container}>
|
|
68
|
+
{page && shouldDisplayNavigation(page) && (
|
|
69
|
+
<aside className={sidebar}>
|
|
70
|
+
<DesktopNavigation page={page} />
|
|
71
|
+
</aside>
|
|
72
|
+
)}
|
|
73
|
+
<article className={content}>
|
|
74
|
+
<Breadcrumbs
|
|
75
|
+
parents={result.data?.route?.parents || []}
|
|
76
|
+
breadcrumbs={result.data?.route?.breadcrumbs || []}
|
|
77
|
+
/>
|
|
78
|
+
<h1>
|
|
43
79
|
{page ? page.name : <LoadingLine heightPx={27} widthRem={15} />}
|
|
44
|
-
</
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
{page.data ? (
|
|
80
|
+
</h1>
|
|
81
|
+
<MobileNavigation page={page} />
|
|
82
|
+
<div className={body}>
|
|
83
|
+
{page ? (
|
|
84
|
+
page.data ? (
|
|
50
85
|
<ContentRenderer
|
|
51
86
|
items={page.data.items}
|
|
52
87
|
components={components}
|
|
53
88
|
/>
|
|
54
89
|
) : (
|
|
55
|
-
<Content
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
/>
|
|
72
|
-
)}
|
|
73
|
-
</MaxWidth>
|
|
74
|
-
</>
|
|
90
|
+
<Content dangerouslySetInnerHTML={{ __html: page.content }} />
|
|
91
|
+
)
|
|
92
|
+
) : (
|
|
93
|
+
<LoadingLine
|
|
94
|
+
heightPx={14}
|
|
95
|
+
widthRem={30}
|
|
96
|
+
randomizeWidthBy={10}
|
|
97
|
+
count={10}
|
|
98
|
+
style={{
|
|
99
|
+
marginBottom: '12px'
|
|
100
|
+
}}
|
|
101
|
+
/>
|
|
102
|
+
)}
|
|
103
|
+
</div>
|
|
104
|
+
</article>
|
|
105
|
+
</UIMaxWidth>
|
|
75
106
|
);
|
|
76
107
|
}
|
|
77
108
|
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
fragment ContentPage on Page {
|
|
2
|
+
primaryRoute {
|
|
3
|
+
id
|
|
4
|
+
path
|
|
5
|
+
}
|
|
2
6
|
name
|
|
3
7
|
id
|
|
4
8
|
content
|
|
@@ -20,4 +24,29 @@ fragment ContentPage on Page {
|
|
|
20
24
|
}
|
|
21
25
|
}
|
|
22
26
|
}
|
|
27
|
+
|
|
28
|
+
parent {
|
|
29
|
+
id
|
|
30
|
+
name
|
|
31
|
+
primaryRoute {
|
|
32
|
+
id
|
|
33
|
+
path
|
|
34
|
+
}
|
|
35
|
+
subPages(includeHidden: false) {
|
|
36
|
+
...SubPage
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
subPages(includeHidden: false) {
|
|
41
|
+
...SubPage
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
fragment SubPage on Page {
|
|
46
|
+
id
|
|
47
|
+
name
|
|
48
|
+
primaryRoute {
|
|
49
|
+
id
|
|
50
|
+
path
|
|
51
|
+
}
|
|
23
52
|
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DropdownMenu,
|
|
3
|
+
DropdownMenuButton,
|
|
4
|
+
DropdownMenuItem,
|
|
5
|
+
DropdownMenuItems
|
|
6
|
+
} from '@jetshop/ui/DropdownMenu';
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { Link } from 'react-router-dom';
|
|
9
|
+
import { ReactComponent as Carot } from '@jetshop/ui/svg/Carrot.svg';
|
|
10
|
+
import { css, cx } from 'linaria';
|
|
11
|
+
import { theme } from '../Theme';
|
|
12
|
+
import { useHistory, useLocation } from 'react-router';
|
|
13
|
+
|
|
14
|
+
const menu = css`
|
|
15
|
+
width: 100%;
|
|
16
|
+
|
|
17
|
+
@media (min-width: 50em) {
|
|
18
|
+
display: none;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
[data-flight-dropdown-button] {
|
|
22
|
+
width: 100%;
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: row;
|
|
25
|
+
justify-content: space-between;
|
|
26
|
+
align-items: center;
|
|
27
|
+
|
|
28
|
+
padding: 0.75em;
|
|
29
|
+
border: 1px solid #dedede;
|
|
30
|
+
width: 100%;
|
|
31
|
+
text-align: left;
|
|
32
|
+
background: ${theme.colors.white};
|
|
33
|
+
border-radius: 3px;
|
|
34
|
+
outline: none;
|
|
35
|
+
|
|
36
|
+
:focus {
|
|
37
|
+
color: ${theme.colors.blue};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
&[aria-expanded='true'] {
|
|
41
|
+
border-radius: 3px 3px 0 0;
|
|
42
|
+
border-bottom: 0;
|
|
43
|
+
color: ${theme.colors.blue};
|
|
44
|
+
|
|
45
|
+
.carot {
|
|
46
|
+
transform: rotate(180deg);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
[data-flight-dropdown-items] {
|
|
52
|
+
position: absolute;
|
|
53
|
+
top: 100%;
|
|
54
|
+
left: 0;
|
|
55
|
+
background: white;
|
|
56
|
+
display: block;
|
|
57
|
+
z-index: 2;
|
|
58
|
+
outline: none;
|
|
59
|
+
width: 100%;
|
|
60
|
+
border: 1px solid #dedede;
|
|
61
|
+
border-top: 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
[data-flight-dropdown-item] {
|
|
65
|
+
line-height: 1.5;
|
|
66
|
+
border: none;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
white-space: normal;
|
|
69
|
+
padding: 0.5em 1em;
|
|
70
|
+
:hover {
|
|
71
|
+
color: blue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
[data-flight-dropdown-item] a {
|
|
76
|
+
text-decoration: none;
|
|
77
|
+
color: #000;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
[data-flight-dropdown-item]:focus {
|
|
81
|
+
font-weight: bold;
|
|
82
|
+
background: #f2f2f2;
|
|
83
|
+
outline: none;
|
|
84
|
+
position: relative;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
[data-flight-dropdown-item]:focus:before {
|
|
88
|
+
content: '';
|
|
89
|
+
position: absolute;
|
|
90
|
+
top: 0;
|
|
91
|
+
bottom: 0;
|
|
92
|
+
left: 0;
|
|
93
|
+
width: 2px;
|
|
94
|
+
background-color: #2f80ed;
|
|
95
|
+
}
|
|
96
|
+
`;
|
|
97
|
+
|
|
98
|
+
const links = css`
|
|
99
|
+
display: flex;
|
|
100
|
+
flex-direction: column;
|
|
101
|
+
`;
|
|
102
|
+
|
|
103
|
+
const link = css`
|
|
104
|
+
color: #000;
|
|
105
|
+
text-decoration: none;
|
|
106
|
+
margin-bottom: 1rem;
|
|
107
|
+
line-height: 1.5;
|
|
108
|
+
`;
|
|
109
|
+
|
|
110
|
+
const activeLink = css`
|
|
111
|
+
font-weight: bold;
|
|
112
|
+
color: #2f80ed;
|
|
113
|
+
`;
|
|
114
|
+
|
|
115
|
+
function getNavigationItemFromPage(page, level) {
|
|
116
|
+
return {
|
|
117
|
+
id: page.id,
|
|
118
|
+
name: page.name,
|
|
119
|
+
url: page.primaryRoute?.path,
|
|
120
|
+
level
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function Item({ name, url, level }) {
|
|
125
|
+
return (
|
|
126
|
+
<div style={{ marginLeft: `${(level - 1) * 12}px` }}>
|
|
127
|
+
<Link to={url}>{name}</Link>
|
|
128
|
+
</div>
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function getNavigationItems(page) {
|
|
133
|
+
const parent = page.parent ? getNavigationItemFromPage(page.parent, 1) : null;
|
|
134
|
+
const siblings = page.parent
|
|
135
|
+
? page.parent.subPages.map(subPage => getNavigationItemFromPage(subPage, 2))
|
|
136
|
+
: [];
|
|
137
|
+
const subPages = page.subPages
|
|
138
|
+
? page.subPages.map(subPage =>
|
|
139
|
+
getNavigationItemFromPage(subPage, parent ? 3 : 2)
|
|
140
|
+
)
|
|
141
|
+
: [];
|
|
142
|
+
const currentPage = getNavigationItemFromPage(page, parent ? 2 : 1);
|
|
143
|
+
|
|
144
|
+
if (!parent && !subPages?.length) return [];
|
|
145
|
+
|
|
146
|
+
const items = [];
|
|
147
|
+
|
|
148
|
+
if (parent) items.push(parent);
|
|
149
|
+
if (siblings.length) {
|
|
150
|
+
siblings.forEach(page => {
|
|
151
|
+
items.push(page);
|
|
152
|
+
if (page.id === currentPage.id) {
|
|
153
|
+
items.push(...subPages);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
} else {
|
|
157
|
+
items.push(currentPage, ...subPages);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return items;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function shouldDisplayNavigation(page) {
|
|
164
|
+
return Boolean(page.parent || page.subPages?.length);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export function DesktopNavigation({ page }) {
|
|
168
|
+
const location = useLocation();
|
|
169
|
+
const items = getNavigationItems(page);
|
|
170
|
+
|
|
171
|
+
return (
|
|
172
|
+
<div className={links}>
|
|
173
|
+
{items.map(item => (
|
|
174
|
+
<Link
|
|
175
|
+
key={item.id}
|
|
176
|
+
to={item.url}
|
|
177
|
+
className={cx(link, location.pathname === item.url && activeLink)}
|
|
178
|
+
style={{ marginLeft: `${(item.level - 1) * 12}px` }}
|
|
179
|
+
>
|
|
180
|
+
{item.name}
|
|
181
|
+
</Link>
|
|
182
|
+
))}
|
|
183
|
+
</div>
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export function MobileNavigation({ page }) {
|
|
188
|
+
const { push } = useHistory();
|
|
189
|
+
const items = page ? getNavigationItems(page) : [];
|
|
190
|
+
|
|
191
|
+
return (
|
|
192
|
+
<DropdownMenu className={menu}>
|
|
193
|
+
<DropdownMenuButton>
|
|
194
|
+
<span>{page?.name}</span>
|
|
195
|
+
<Carot className="carot" />
|
|
196
|
+
</DropdownMenuButton>
|
|
197
|
+
<DropdownMenuItems>
|
|
198
|
+
{items.map(item => (
|
|
199
|
+
<DropdownMenuItem key={item.id} onSelect={() => push(item.url)}>
|
|
200
|
+
<Item {...item} />
|
|
201
|
+
</DropdownMenuItem>
|
|
202
|
+
))}
|
|
203
|
+
</DropdownMenuItems>
|
|
204
|
+
</DropdownMenu>
|
|
205
|
+
);
|
|
206
|
+
}
|
|
@@ -7,9 +7,8 @@ import { useQuery } from '@apollo/react-hooks';
|
|
|
7
7
|
|
|
8
8
|
function FooterLinks() {
|
|
9
9
|
const { data } = useQuery(pagesQuery);
|
|
10
|
-
const { data: storeTitleData, loading: storeTitleLoading } =
|
|
11
|
-
StoreTitleQuery
|
|
12
|
-
);
|
|
10
|
+
const { data: storeTitleData, loading: storeTitleLoading } =
|
|
11
|
+
useQuery(StoreTitleQuery);
|
|
13
12
|
|
|
14
13
|
const pages = data?.pages;
|
|
15
14
|
const storeTitle = storeTitleData?.startPage?.head.title;
|
|
@@ -20,7 +19,10 @@ function FooterLinks() {
|
|
|
20
19
|
<ul>
|
|
21
20
|
{pages.map(page => (
|
|
22
21
|
<li key={page.id}>
|
|
23
|
-
<ContentPageLink page={page}>
|
|
22
|
+
<ContentPageLink page={page}>
|
|
23
|
+
{page.subPages?.length ? '+ ' : null}
|
|
24
|
+
{page.name}
|
|
25
|
+
</ContentPageLink>
|
|
24
26
|
</li>
|
|
25
27
|
))}
|
|
26
28
|
</ul>
|
|
@@ -143,9 +143,17 @@ const ProductToast = ({
|
|
|
143
143
|
<ChannelContext.Consumer>
|
|
144
144
|
{({ selectedChannel }) => (
|
|
145
145
|
<CheckoutButton
|
|
146
|
-
href={
|
|
147
|
-
onClick={
|
|
148
|
-
|
|
146
|
+
href={cart.externalCheckoutUrl}
|
|
147
|
+
onClick={event => {
|
|
148
|
+
event.preventDefault();
|
|
149
|
+
track(
|
|
150
|
+
trackCartCheckoutEvent({
|
|
151
|
+
cart: cart,
|
|
152
|
+
callback: () => {
|
|
153
|
+
window.location = cart.externalCheckoutUrl;
|
|
154
|
+
}
|
|
155
|
+
})
|
|
156
|
+
);
|
|
149
157
|
}}
|
|
150
158
|
>
|
|
151
159
|
{t('To checkout')}
|
|
@@ -80,6 +80,9 @@ const StartPageHero = ({
|
|
|
80
80
|
src={imageSrc.value}
|
|
81
81
|
className={heroStyles}
|
|
82
82
|
critical={isAboveFold?.value}
|
|
83
|
+
focalPointY={imageSrc.value.focalPointY}
|
|
84
|
+
focalPointX={imageSrc.value.focalPointX}
|
|
85
|
+
aspect={'2:1'}
|
|
83
86
|
>
|
|
84
87
|
<Container>
|
|
85
88
|
<Title>{header.value}</Title>
|
|
@@ -3,11 +3,16 @@
|
|
|
3
3
|
|
|
4
4
|
fragment ContentItemFragment on ContentItem {
|
|
5
5
|
type
|
|
6
|
-
properties {
|
|
6
|
+
properties(getImageAsImageValue: true) {
|
|
7
7
|
name
|
|
8
8
|
type
|
|
9
9
|
valueType
|
|
10
10
|
value {
|
|
11
|
+
... on ImageValue {
|
|
12
|
+
value
|
|
13
|
+
focalPointX
|
|
14
|
+
focalPointY
|
|
15
|
+
}
|
|
11
16
|
... on Product {
|
|
12
17
|
...StartPageProductGrid
|
|
13
18
|
}
|