@shopify/cli-hydrogen 5.0.2 → 5.1.0

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.
Files changed (243) hide show
  1. package/dist/commands/hydrogen/build.js +16 -2
  2. package/dist/commands/hydrogen/codegen-unstable.js +13 -24
  3. package/dist/commands/hydrogen/dev.js +45 -39
  4. package/dist/commands/hydrogen/env/list.js +25 -24
  5. package/dist/commands/hydrogen/env/list.test.js +46 -43
  6. package/dist/commands/hydrogen/env/pull.js +53 -25
  7. package/dist/commands/hydrogen/env/pull.test.js +123 -42
  8. package/dist/commands/hydrogen/generate/route.js +31 -132
  9. package/dist/commands/hydrogen/generate/route.test.js +34 -126
  10. package/dist/commands/hydrogen/init.js +46 -127
  11. package/dist/commands/hydrogen/init.test.js +352 -100
  12. package/dist/commands/hydrogen/link.js +70 -69
  13. package/dist/commands/hydrogen/link.test.js +72 -107
  14. package/dist/commands/hydrogen/list.js +22 -12
  15. package/dist/commands/hydrogen/list.test.js +51 -48
  16. package/dist/commands/hydrogen/login.js +31 -0
  17. package/dist/commands/hydrogen/logout.js +21 -0
  18. package/dist/commands/hydrogen/setup/css.js +79 -0
  19. package/dist/commands/hydrogen/setup/markets.js +53 -0
  20. package/dist/commands/hydrogen/setup.js +133 -0
  21. package/dist/commands/hydrogen/shortcut.js +2 -45
  22. package/dist/commands/hydrogen/shortcut.test.js +10 -37
  23. package/dist/generator-templates/assets/css-modules/package.json +6 -0
  24. package/dist/generator-templates/assets/postcss/package.json +10 -0
  25. package/dist/generator-templates/assets/postcss/postcss.config.js +8 -0
  26. package/dist/generator-templates/assets/tailwind/package.json +13 -0
  27. package/dist/generator-templates/assets/tailwind/postcss.config.js +10 -0
  28. package/dist/generator-templates/assets/tailwind/tailwind.config.js +8 -0
  29. package/dist/generator-templates/assets/tailwind/tailwind.css +3 -0
  30. package/dist/generator-templates/assets/vanilla-extract/package.json +9 -0
  31. package/dist/generator-templates/starter/.eslintignore +5 -0
  32. package/dist/generator-templates/starter/.eslintrc.js +18 -0
  33. package/dist/generator-templates/starter/.graphqlrc.yml +1 -0
  34. package/dist/generator-templates/starter/README.md +40 -0
  35. package/dist/generator-templates/starter/app/components/Aside.tsx +47 -0
  36. package/dist/generator-templates/starter/app/components/Cart.tsx +340 -0
  37. package/dist/generator-templates/starter/app/components/Footer.tsx +99 -0
  38. package/dist/generator-templates/starter/app/components/Header.tsx +178 -0
  39. package/dist/generator-templates/starter/app/components/Layout.tsx +95 -0
  40. package/dist/generator-templates/starter/app/components/Search.tsx +480 -0
  41. package/dist/generator-templates/starter/app/entry.client.tsx +12 -0
  42. package/dist/generator-templates/starter/app/entry.server.tsx +33 -0
  43. package/dist/generator-templates/starter/app/root.tsx +270 -0
  44. package/dist/generator-templates/starter/app/routes/$.tsx +7 -0
  45. package/dist/generator-templates/{routes → starter/app/routes}/[robots.txt].tsx +47 -69
  46. package/dist/generator-templates/starter/app/routes/[sitemap.xml].tsx +174 -0
  47. package/dist/generator-templates/starter/app/routes/_index.tsx +145 -0
  48. package/dist/generator-templates/starter/app/routes/account.$.tsx +9 -0
  49. package/dist/generator-templates/starter/app/routes/account.addresses.tsx +563 -0
  50. package/dist/generator-templates/starter/app/routes/account.orders.$id.tsx +309 -0
  51. package/dist/generator-templates/starter/app/routes/account.orders._index.tsx +196 -0
  52. package/dist/generator-templates/starter/app/routes/account.profile.tsx +289 -0
  53. package/dist/generator-templates/starter/app/routes/account.tsx +203 -0
  54. package/dist/generator-templates/starter/app/routes/account_.activate.$id.$activationToken.tsx +157 -0
  55. package/dist/generator-templates/starter/app/routes/account_.login.tsx +143 -0
  56. package/dist/generator-templates/starter/app/routes/account_.logout.tsx +33 -0
  57. package/dist/generator-templates/starter/app/routes/account_.recover.tsx +124 -0
  58. package/dist/generator-templates/starter/app/routes/account_.register.tsx +207 -0
  59. package/dist/generator-templates/starter/app/routes/account_.reset.$id.$resetToken.tsx +136 -0
  60. package/dist/generator-templates/starter/app/routes/api.predictive-search.tsx +342 -0
  61. package/dist/generator-templates/starter/app/routes/blogs.$blogHandle.$articleHandle.tsx +88 -0
  62. package/dist/generator-templates/starter/app/routes/blogs.$blogHandle._index.tsx +162 -0
  63. package/dist/generator-templates/starter/app/routes/blogs._index.tsx +94 -0
  64. package/dist/generator-templates/starter/app/routes/cart.tsx +104 -0
  65. package/dist/generator-templates/starter/app/routes/collections.$handle.tsx +184 -0
  66. package/dist/generator-templates/starter/app/routes/collections._index.tsx +120 -0
  67. package/dist/generator-templates/starter/app/routes/pages.$handle.tsx +57 -0
  68. package/dist/generator-templates/starter/app/routes/policies.$handle.tsx +94 -0
  69. package/dist/generator-templates/starter/app/routes/policies._index.tsx +63 -0
  70. package/dist/generator-templates/starter/app/routes/products.$handle.tsx +418 -0
  71. package/dist/generator-templates/starter/app/routes/search.tsx +168 -0
  72. package/dist/generator-templates/starter/app/styles/app.css +473 -0
  73. package/dist/generator-templates/starter/app/styles/reset.css +129 -0
  74. package/dist/generator-templates/starter/app/utils.ts +46 -0
  75. package/dist/generator-templates/starter/package.json +43 -0
  76. package/dist/generator-templates/starter/public/favicon.svg +28 -0
  77. package/dist/generator-templates/starter/remix.config.js +26 -0
  78. package/dist/generator-templates/starter/remix.env.d.ts +39 -0
  79. package/dist/generator-templates/starter/server.ts +253 -0
  80. package/dist/generator-templates/starter/storefrontapi.generated.d.ts +1906 -0
  81. package/dist/generator-templates/starter/tsconfig.json +22 -0
  82. package/dist/lib/auth.js +123 -0
  83. package/dist/lib/auth.test.js +157 -0
  84. package/dist/lib/build.js +51 -0
  85. package/dist/lib/check-version.js +3 -3
  86. package/dist/lib/check-version.test.js +24 -0
  87. package/dist/lib/codegen.js +26 -17
  88. package/dist/lib/environment-variables.js +68 -0
  89. package/dist/lib/environment-variables.test.js +147 -0
  90. package/dist/lib/file.js +41 -0
  91. package/dist/lib/file.test.js +69 -0
  92. package/dist/lib/flags.js +39 -2
  93. package/dist/lib/format-code.js +26 -0
  94. package/dist/lib/gid.js +12 -0
  95. package/dist/lib/{graphql.test.js → gid.test.js} +1 -1
  96. package/dist/lib/graphql/admin/client.js +27 -0
  97. package/dist/lib/graphql/admin/client.test.js +51 -0
  98. package/dist/lib/graphql/admin/create-storefront.js +13 -15
  99. package/dist/lib/graphql/admin/create-storefront.test.js +64 -0
  100. package/dist/lib/graphql/admin/fetch-job.js +6 -15
  101. package/dist/lib/graphql/admin/link-storefront.js +7 -11
  102. package/dist/lib/graphql/admin/link-storefront.test.js +38 -0
  103. package/dist/lib/graphql/admin/list-environments.js +2 -2
  104. package/dist/lib/graphql/admin/list-environments.test.js +44 -0
  105. package/dist/lib/graphql/admin/list-storefronts.js +7 -11
  106. package/dist/lib/graphql/admin/list-storefronts.test.js +44 -0
  107. package/dist/lib/graphql/admin/pull-variables.js +3 -3
  108. package/dist/lib/graphql/admin/pull-variables.test.js +37 -0
  109. package/dist/lib/graphql/business-platform/user-account.js +83 -0
  110. package/dist/lib/graphql/business-platform/user-account.test.js +80 -0
  111. package/dist/lib/log.js +185 -9
  112. package/dist/lib/log.test.js +92 -0
  113. package/dist/lib/mini-oxygen.js +19 -9
  114. package/dist/lib/missing-routes.js +0 -2
  115. package/dist/lib/onboarding/common.js +456 -0
  116. package/dist/lib/onboarding/index.js +2 -0
  117. package/dist/lib/onboarding/local.js +229 -0
  118. package/dist/lib/onboarding/remote.js +89 -0
  119. package/dist/lib/remix-version-interop.js +5 -5
  120. package/dist/lib/remix-version-interop.test.js +11 -1
  121. package/dist/lib/render-errors.js +13 -11
  122. package/dist/lib/setups/css/assets.js +89 -0
  123. package/dist/lib/setups/css/css-modules.js +22 -0
  124. package/dist/lib/setups/css/index.js +44 -0
  125. package/dist/lib/setups/css/postcss.js +34 -0
  126. package/dist/lib/setups/css/replacers.js +137 -0
  127. package/dist/lib/setups/css/tailwind.js +54 -0
  128. package/dist/lib/setups/css/vanilla-extract.js +22 -0
  129. package/dist/lib/setups/i18n/domains.test.js +25 -0
  130. package/dist/lib/setups/i18n/index.js +46 -0
  131. package/dist/lib/setups/i18n/replacers.js +227 -0
  132. package/dist/lib/setups/i18n/subdomains.test.js +25 -0
  133. package/dist/lib/setups/i18n/subfolders.test.js +25 -0
  134. package/dist/lib/setups/i18n/templates/domains.js +14 -0
  135. package/dist/lib/setups/i18n/templates/domains.ts +25 -0
  136. package/dist/lib/setups/i18n/templates/subdomains.js +14 -0
  137. package/dist/lib/setups/i18n/templates/subdomains.ts +24 -0
  138. package/dist/lib/setups/i18n/templates/subfolders.js +14 -0
  139. package/dist/lib/setups/i18n/templates/subfolders.ts +28 -0
  140. package/dist/lib/setups/routes/generate.js +244 -0
  141. package/dist/lib/setups/routes/generate.test.js +313 -0
  142. package/dist/lib/shell.js +52 -5
  143. package/dist/lib/shell.test.js +42 -16
  144. package/dist/lib/shopify-config.js +23 -18
  145. package/dist/lib/shopify-config.test.js +63 -73
  146. package/dist/lib/template-downloader.js +9 -7
  147. package/dist/lib/transpile-ts.js +9 -29
  148. package/dist/virtual-routes/routes/index.jsx +40 -19
  149. package/oclif.manifest.json +710 -1
  150. package/package.json +16 -16
  151. package/dist/commands/hydrogen/build.d.ts +0 -23
  152. package/dist/commands/hydrogen/check.d.ts +0 -15
  153. package/dist/commands/hydrogen/codegen-unstable.d.ts +0 -15
  154. package/dist/commands/hydrogen/dev.d.ts +0 -21
  155. package/dist/commands/hydrogen/env/list.d.ts +0 -18
  156. package/dist/commands/hydrogen/env/pull.d.ts +0 -22
  157. package/dist/commands/hydrogen/g.d.ts +0 -10
  158. package/dist/commands/hydrogen/generate/route.d.ts +0 -32
  159. package/dist/commands/hydrogen/generate/route.test.d.ts +0 -1
  160. package/dist/commands/hydrogen/generate/routes.d.ts +0 -16
  161. package/dist/commands/hydrogen/init.d.ts +0 -24
  162. package/dist/commands/hydrogen/init.test.d.ts +0 -1
  163. package/dist/commands/hydrogen/link.d.ts +0 -23
  164. package/dist/commands/hydrogen/link.test.d.ts +0 -1
  165. package/dist/commands/hydrogen/list.d.ts +0 -21
  166. package/dist/commands/hydrogen/list.test.d.ts +0 -1
  167. package/dist/commands/hydrogen/preview.d.ts +0 -17
  168. package/dist/commands/hydrogen/shortcut.d.ts +0 -9
  169. package/dist/commands/hydrogen/shortcut.test.d.ts +0 -1
  170. package/dist/commands/hydrogen/unlink.d.ts +0 -16
  171. package/dist/commands/hydrogen/unlink.test.d.ts +0 -1
  172. package/dist/create-app.d.ts +0 -1
  173. package/dist/generator-templates/routes/[sitemap.xml].tsx +0 -235
  174. package/dist/generator-templates/routes/account/login.tsx +0 -103
  175. package/dist/generator-templates/routes/account/register.tsx +0 -103
  176. package/dist/generator-templates/routes/cart.tsx +0 -81
  177. package/dist/generator-templates/routes/collections/$collectionHandle.tsx +0 -104
  178. package/dist/generator-templates/routes/collections/index.tsx +0 -102
  179. package/dist/generator-templates/routes/graphiql.tsx +0 -10
  180. package/dist/generator-templates/routes/index.tsx +0 -40
  181. package/dist/generator-templates/routes/pages/$pageHandle.tsx +0 -112
  182. package/dist/generator-templates/routes/policies/$policyHandle.tsx +0 -140
  183. package/dist/generator-templates/routes/policies/index.tsx +0 -117
  184. package/dist/generator-templates/routes/products/$productHandle.tsx +0 -92
  185. package/dist/hooks/init.d.ts +0 -5
  186. package/dist/lib/admin-session.d.ts +0 -6
  187. package/dist/lib/admin-session.js +0 -16
  188. package/dist/lib/admin-session.test.d.ts +0 -1
  189. package/dist/lib/admin-session.test.js +0 -27
  190. package/dist/lib/admin-urls.d.ts +0 -8
  191. package/dist/lib/check-lockfile.d.ts +0 -3
  192. package/dist/lib/check-lockfile.test.d.ts +0 -1
  193. package/dist/lib/check-version.d.ts +0 -16
  194. package/dist/lib/check-version.test.d.ts +0 -1
  195. package/dist/lib/codegen.d.ts +0 -26
  196. package/dist/lib/combined-environment-variables.d.ts +0 -8
  197. package/dist/lib/combined-environment-variables.js +0 -57
  198. package/dist/lib/combined-environment-variables.test.d.ts +0 -1
  199. package/dist/lib/combined-environment-variables.test.js +0 -111
  200. package/dist/lib/config.d.ts +0 -20
  201. package/dist/lib/flags.d.ts +0 -27
  202. package/dist/lib/flags.test.d.ts +0 -1
  203. package/dist/lib/graphql/admin/create-storefront.d.ts +0 -17
  204. package/dist/lib/graphql/admin/fetch-job.d.ts +0 -23
  205. package/dist/lib/graphql/admin/link-storefront.d.ts +0 -14
  206. package/dist/lib/graphql/admin/list-environments.d.ts +0 -21
  207. package/dist/lib/graphql/admin/list-storefronts.d.ts +0 -25
  208. package/dist/lib/graphql/admin/pull-variables.d.ts +0 -21
  209. package/dist/lib/graphql.d.ts +0 -21
  210. package/dist/lib/graphql.js +0 -18
  211. package/dist/lib/graphql.test.d.ts +0 -1
  212. package/dist/lib/log.d.ts +0 -6
  213. package/dist/lib/mini-oxygen.d.ts +0 -22
  214. package/dist/lib/missing-routes.d.ts +0 -8
  215. package/dist/lib/missing-routes.test.d.ts +0 -1
  216. package/dist/lib/missing-storefronts.d.ts +0 -5
  217. package/dist/lib/missing-storefronts.js +0 -18
  218. package/dist/lib/process.d.ts +0 -6
  219. package/dist/lib/pull-environment-variables.d.ts +0 -20
  220. package/dist/lib/pull-environment-variables.js +0 -57
  221. package/dist/lib/pull-environment-variables.test.d.ts +0 -1
  222. package/dist/lib/pull-environment-variables.test.js +0 -174
  223. package/dist/lib/remix-version-interop.d.ts +0 -11
  224. package/dist/lib/remix-version-interop.test.d.ts +0 -1
  225. package/dist/lib/render-errors.d.ts +0 -16
  226. package/dist/lib/shell.d.ts +0 -11
  227. package/dist/lib/shell.test.d.ts +0 -1
  228. package/dist/lib/shop.d.ts +0 -7
  229. package/dist/lib/shop.js +0 -32
  230. package/dist/lib/shop.test.d.ts +0 -1
  231. package/dist/lib/shop.test.js +0 -78
  232. package/dist/lib/shopify-config.d.ts +0 -35
  233. package/dist/lib/shopify-config.test.d.ts +0 -1
  234. package/dist/lib/string.d.ts +0 -3
  235. package/dist/lib/string.test.d.ts +0 -1
  236. package/dist/lib/template-downloader.d.ts +0 -6
  237. package/dist/lib/transpile-ts.d.ts +0 -16
  238. package/dist/lib/user-errors.d.ts +0 -9
  239. package/dist/lib/user-errors.js +0 -11
  240. package/dist/lib/virtual-routes.d.ts +0 -7
  241. package/dist/lib/virtual-routes.test.d.ts +0 -1
  242. /package/dist/{commands/hydrogen/env/list.test.d.ts → lib/setups/css/common.js} +0 -0
  243. /package/dist/{commands/hydrogen/env/pull.test.d.ts → lib/setups/i18n/mock-i18n-types.js} +0 -0
@@ -0,0 +1,178 @@
1
+ import {Await, NavLink, useMatches} from '@remix-run/react';
2
+ import {Suspense} from 'react';
3
+ import type {LayoutProps} from './Layout';
4
+
5
+ type HeaderProps = Pick<LayoutProps, 'header' | 'cart' | 'isLoggedIn'>;
6
+
7
+ type Viewport = 'desktop' | 'mobile';
8
+
9
+ export function Header({header, isLoggedIn, cart}: HeaderProps) {
10
+ const {shop, menu} = header;
11
+ return (
12
+ <header className="header">
13
+ <NavLink prefetch="intent" to="/" style={activeLinkStyle} end>
14
+ <strong>{shop.name}</strong>
15
+ </NavLink>
16
+ <HeaderMenu menu={menu} viewport="desktop" />
17
+ <HeaderCtas isLoggedIn={isLoggedIn} cart={cart} />
18
+ </header>
19
+ );
20
+ }
21
+
22
+ export function HeaderMenu({
23
+ menu,
24
+ viewport,
25
+ }: {
26
+ menu: HeaderProps['header']['menu'];
27
+ viewport: Viewport;
28
+ }) {
29
+ const [root] = useMatches();
30
+ const publicStoreDomain = root?.data?.publicStoreDomain;
31
+ const className = `header-menu-${viewport}`;
32
+
33
+ function closeAside(event: React.MouseEvent<HTMLAnchorElement>) {
34
+ if (viewport === 'mobile') {
35
+ event.preventDefault();
36
+ window.location.href = event.currentTarget.href;
37
+ }
38
+ }
39
+
40
+ return (
41
+ <nav className={className} role="navigation">
42
+ {viewport === 'mobile' && (
43
+ <NavLink
44
+ end
45
+ onClick={closeAside}
46
+ prefetch="intent"
47
+ style={activeLinkStyle}
48
+ to="/"
49
+ >
50
+ Home
51
+ </NavLink>
52
+ )}
53
+ {(menu || FALLBACK_HEADER_MENU).items.map((item) => {
54
+ if (!item.url) return null;
55
+
56
+ // if the url is internal, we strip the domain
57
+ const url =
58
+ item.url.includes('myshopify.com') ||
59
+ item.url.includes(publicStoreDomain)
60
+ ? new URL(item.url).pathname
61
+ : item.url;
62
+ return (
63
+ <NavLink
64
+ className="header-menu-item"
65
+ end
66
+ key={item.id}
67
+ onClick={closeAside}
68
+ prefetch="intent"
69
+ style={activeLinkStyle}
70
+ to={url}
71
+ >
72
+ {item.title}
73
+ </NavLink>
74
+ );
75
+ })}
76
+ </nav>
77
+ );
78
+ }
79
+
80
+ function HeaderCtas({
81
+ isLoggedIn,
82
+ cart,
83
+ }: Pick<HeaderProps, 'isLoggedIn' | 'cart'>) {
84
+ return (
85
+ <nav className="header-ctas" role="navigation">
86
+ <HeaderMenuMobileToggle />
87
+ <NavLink prefetch="intent" to="/account" style={activeLinkStyle}>
88
+ {isLoggedIn ? 'Account' : 'Sign in'}
89
+ </NavLink>
90
+ <SearchToggle />
91
+ <CartToggle cart={cart} />
92
+ </nav>
93
+ );
94
+ }
95
+
96
+ function HeaderMenuMobileToggle() {
97
+ return (
98
+ <a className="header-menu-mobile-toggle" href="#mobile-menu-aside">
99
+ <h3>☰</h3>
100
+ </a>
101
+ );
102
+ }
103
+
104
+ function SearchToggle() {
105
+ return <a href="#search-aside">Search</a>;
106
+ }
107
+
108
+ function CartBadge({count}: {count: number}) {
109
+ return <a href="#cart-aside">Cart {count}</a>;
110
+ }
111
+
112
+ function CartToggle({cart}: Pick<HeaderProps, 'cart'>) {
113
+ return (
114
+ <Suspense fallback={<CartBadge count={0} />}>
115
+ <Await resolve={cart}>
116
+ {(cart) => {
117
+ if (!cart) return <CartBadge count={0} />;
118
+ return <CartBadge count={cart.totalQuantity || 0} />;
119
+ }}
120
+ </Await>
121
+ </Suspense>
122
+ );
123
+ }
124
+
125
+ const FALLBACK_HEADER_MENU = {
126
+ id: 'gid://shopify/Menu/199655587896',
127
+ items: [
128
+ {
129
+ id: 'gid://shopify/MenuItem/461609500728',
130
+ resourceId: null,
131
+ tags: [],
132
+ title: 'Collections',
133
+ type: 'HTTP',
134
+ url: '/collections',
135
+ items: [],
136
+ },
137
+ {
138
+ id: 'gid://shopify/MenuItem/461609533496',
139
+ resourceId: null,
140
+ tags: [],
141
+ title: 'Blog',
142
+ type: 'HTTP',
143
+ url: '/blogs/journal',
144
+ items: [],
145
+ },
146
+ {
147
+ id: 'gid://shopify/MenuItem/461609566264',
148
+ resourceId: null,
149
+ tags: [],
150
+ title: 'Policies',
151
+ type: 'HTTP',
152
+ url: '/policies',
153
+ items: [],
154
+ },
155
+ {
156
+ id: 'gid://shopify/MenuItem/461609599032',
157
+ resourceId: 'gid://shopify/Page/92591030328',
158
+ tags: [],
159
+ title: 'About',
160
+ type: 'PAGE',
161
+ url: '/pages/about',
162
+ items: [],
163
+ },
164
+ ],
165
+ };
166
+
167
+ function activeLinkStyle({
168
+ isActive,
169
+ isPending,
170
+ }: {
171
+ isActive: boolean;
172
+ isPending: boolean;
173
+ }) {
174
+ return {
175
+ fontWeight: isActive ? 'bold' : '',
176
+ color: isPending ? 'grey' : 'black',
177
+ };
178
+ }
@@ -0,0 +1,95 @@
1
+ import {Await} from '@remix-run/react';
2
+ import {Suspense} from 'react';
3
+ import type {
4
+ CartApiQueryFragment,
5
+ FooterQuery,
6
+ HeaderQuery,
7
+ } from 'storefrontapi.generated';
8
+ import {Aside} from '~/components/Aside';
9
+ import {Footer} from '~/components/Footer';
10
+ import {Header, HeaderMenu} from '~/components/Header';
11
+ import {CartMain} from '~/components/Cart';
12
+ import {
13
+ PredictiveSearchForm,
14
+ PredictiveSearchResults,
15
+ } from '~/components/Search';
16
+
17
+ export type LayoutProps = {
18
+ cart: Promise<CartApiQueryFragment | null>;
19
+ children?: React.ReactNode;
20
+ footer: Promise<FooterQuery>;
21
+ header: HeaderQuery;
22
+ isLoggedIn: boolean;
23
+ };
24
+
25
+ export function Layout({
26
+ cart,
27
+ children = null,
28
+ footer,
29
+ header,
30
+ isLoggedIn,
31
+ }: LayoutProps) {
32
+ return (
33
+ <>
34
+ <CartAside cart={cart} />
35
+ <SearchAside />
36
+ <MobileMenuAside menu={header.menu} />
37
+ <Header header={header} cart={cart} isLoggedIn={isLoggedIn} />
38
+ <main>{children}</main>
39
+ <Suspense>
40
+ <Await resolve={footer}>
41
+ {(footer) => <Footer menu={footer.menu} />}
42
+ </Await>
43
+ </Suspense>
44
+ </>
45
+ );
46
+ }
47
+
48
+ function CartAside({cart}: {cart: LayoutProps['cart']}) {
49
+ return (
50
+ <Aside id="cart-aside" heading="CART">
51
+ <Suspense fallback={<p>Loading cart ...</p>}>
52
+ <Await resolve={cart}>
53
+ {(cart) => {
54
+ return <CartMain cart={cart} layout="aside" />;
55
+ }}
56
+ </Await>
57
+ </Suspense>
58
+ </Aside>
59
+ );
60
+ }
61
+
62
+ function SearchAside() {
63
+ return (
64
+ <Aside id="search-aside" heading="SEARCH">
65
+ <div className="predictive-search">
66
+ <br />
67
+ <PredictiveSearchForm>
68
+ {({fetchResults, inputRef}) => (
69
+ <div>
70
+ <input
71
+ name="q"
72
+ onChange={fetchResults}
73
+ onFocus={fetchResults}
74
+ placeholder="Search"
75
+ ref={inputRef}
76
+ type="search"
77
+ />
78
+ &nbsp;
79
+ <button type="submit">Search</button>
80
+ </div>
81
+ )}
82
+ </PredictiveSearchForm>
83
+ <PredictiveSearchResults />
84
+ </div>
85
+ </Aside>
86
+ );
87
+ }
88
+
89
+ function MobileMenuAside({menu}: {menu: HeaderQuery['menu']}) {
90
+ return (
91
+ <Aside id="mobile-menu-aside" heading="MENU">
92
+ <HeaderMenu menu={menu} viewport="mobile" />
93
+ </Aside>
94
+ );
95
+ }