@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,473 @@
1
+ :root {
2
+ --aside-width: 400px;
3
+ --cart-aside-summary-height-with-discount: 300px;
4
+ --cart-aside-summary-height: 250px;
5
+ --grid-item-width: 355px;
6
+ --header-height: 64px;
7
+ --color-dark: #000;
8
+ --color-light: #fff;
9
+ }
10
+
11
+ img {
12
+ border-radius: 4px;
13
+ }
14
+
15
+ /*
16
+ * --------------------------------------------------
17
+ * components/Aside
18
+ * --------------------------------------------------
19
+ */
20
+ aside {
21
+ background: var(--color-light);
22
+ box-shadow: 0 0 50px rgba(0, 0, 0, 0.3);
23
+ height: 100vh;
24
+ max-width: var(--aside-width);
25
+ min-width: var(--aside-width);
26
+ position: fixed;
27
+ right: calc(-1 * var(--aside-width));
28
+ top: 0;
29
+ transition: transform 200ms ease-in-out;
30
+ }
31
+
32
+ aside header {
33
+ align-items: center;
34
+ border-bottom: 1px solid var(--color-dark);
35
+ display: flex;
36
+ height: var(--header-height);
37
+ justify-content: space-between;
38
+ padding: 0 20px;
39
+ }
40
+
41
+ aside header h3 {
42
+ margin: 0;
43
+ }
44
+
45
+ aside header .close {
46
+ font-weight: bold;
47
+ opacity: 0.8;
48
+ text-decoration: none;
49
+ transition: all 200ms;
50
+ width: 20px;
51
+ &:hover {
52
+ opacity: 1;
53
+ }
54
+ }
55
+
56
+ aside header h2 {
57
+ margin-bottom: 0.6rem;
58
+ margin-top: 0;
59
+ }
60
+
61
+ aside main {
62
+ margin: 1rem;
63
+ }
64
+
65
+ aside p {
66
+ margin: 0 0 0.25rem;
67
+ &:last-child {
68
+ margin: 0;
69
+ }
70
+ }
71
+
72
+ aside li {
73
+ margin-bottom: 0.125rem;
74
+ }
75
+
76
+ .overlay {
77
+ background: rgba(0, 0, 0, 0.2);
78
+ bottom: 0;
79
+ left: 0;
80
+ opacity: 0;
81
+ pointer-events: none;
82
+ position: absolute;
83
+ right: 0;
84
+ top: 0;
85
+ transition: opacity 400ms ease-in-out;
86
+ transition: opacity 400ms;
87
+ visibility: hidden;
88
+ z-index: 10;
89
+ }
90
+
91
+ .overlay .close-outside {
92
+ background: transparent;
93
+ border: none;
94
+ color: transparent;
95
+ height: 100%;
96
+ left: 0;
97
+ position: absolute;
98
+ top: 0;
99
+ width: calc(100% - var(--aside-width));
100
+ }
101
+
102
+ .overlay .light {
103
+ background: rgba(255, 255, 255, 0.5);
104
+ }
105
+
106
+ .overlay .cancel {
107
+ cursor: default;
108
+ height: 100%;
109
+ position: absolute;
110
+ width: 100%;
111
+ }
112
+
113
+ .overlay {
114
+ &:target {
115
+ opacity: 1;
116
+ pointer-events: auto;
117
+ visibility: visible;
118
+ }
119
+ /* reveal aside */
120
+ &:target aside {
121
+ transform: translateX(calc(var(--aside-width) * -1));
122
+ }
123
+ }
124
+
125
+ /*
126
+ * --------------------------------------------------
127
+ * components/Header
128
+ * --------------------------------------------------
129
+ */
130
+ .header {
131
+ align-items: center;
132
+ background: #fff;
133
+ display: flex;
134
+ height: var(--header-height);
135
+ padding: 0 1rem;
136
+ position: sticky;
137
+ top: 0;
138
+ z-index: 1;
139
+ }
140
+
141
+ .header-menu-mobile-toggle {
142
+ @media (min-width: 48em) {
143
+ display: none;
144
+ }
145
+ }
146
+
147
+ .header-menu-mobile {
148
+ display: flex;
149
+ flex-direction: column;
150
+ grid-gap: 1rem;
151
+ }
152
+
153
+ .header-menu-desktop {
154
+ display: none;
155
+ grid-gap: 1rem;
156
+ @media (min-width: 45em) {
157
+ display: flex;
158
+ grid-gap: 1rem;
159
+ margin-left: 3rem;
160
+ }
161
+ }
162
+
163
+ .header-menu-item {
164
+ cursor: pointer;
165
+ }
166
+
167
+ .header-ctas {
168
+ align-items: center;
169
+ display: flex;
170
+ grid-gap: 1rem;
171
+ margin-left: auto;
172
+ }
173
+
174
+ /*
175
+ * --------------------------------------------------
176
+ * components/Footer
177
+ * --------------------------------------------------
178
+ */
179
+ .footer {
180
+ background: var(--color-dark);
181
+ margin-top: auto;
182
+ }
183
+
184
+ .footer-menu-missing {
185
+ display: inline-block;
186
+ margin: 1rem;
187
+ }
188
+
189
+ .footer-menu {
190
+ align-items: center;
191
+ display: flex;
192
+ grid-gap: 1rem;
193
+ padding: 1rem;
194
+ }
195
+
196
+ .footer-menu a {
197
+ color: var(--color-light);
198
+ }
199
+
200
+ /*
201
+ * --------------------------------------------------
202
+ * components/Cart
203
+ * --------------------------------------------------
204
+ */
205
+ .cart-main {
206
+ height: 100%;
207
+ max-height: calc(100vh - var(--cart-aside-summary-height));
208
+ overflow-y: auto;
209
+ width: auto;
210
+ }
211
+
212
+ .cart-main.with-discount {
213
+ max-height: calc(100vh - var(--cart-aside-summary-height-with-discount));
214
+ }
215
+
216
+ .cart-line {
217
+ display: flex;
218
+ padding: 0.75rem 0;
219
+ }
220
+
221
+ .cart-line img {
222
+ height: 100%;
223
+ display: block;
224
+ margin-right: 0.75rem;
225
+ }
226
+
227
+ .cart-summary-page {
228
+ position: relative;
229
+ }
230
+
231
+ .cart-summary-aside {
232
+ background: white;
233
+ border-top: 1px solid var(--color-dark);
234
+ bottom: 0;
235
+ padding-top: 0.75rem;
236
+ position: absolute;
237
+ width: calc(var(--aside-width) - 40px);
238
+ }
239
+
240
+ .cart-line-quantiy {
241
+ display: flex;
242
+ }
243
+
244
+ .cart-discount {
245
+ align-items: center;
246
+ display: flex;
247
+ margin-top: 0.25rem;
248
+ }
249
+
250
+ .cart-subtotal {
251
+ align-items: center;
252
+ display: flex;
253
+ }
254
+ /*
255
+ * --------------------------------------------------
256
+ * components/Search
257
+ * --------------------------------------------------
258
+ */
259
+ .predictive-search {
260
+ height: calc(100vh - var(--header-height) - 40px);
261
+ overflow-y: auto;
262
+ }
263
+
264
+ .predictive-search-form {
265
+ background: var(--color-light);
266
+ position: sticky;
267
+ top: 0;
268
+ }
269
+
270
+ .predictive-search-result {
271
+ margin-bottom: 2rem;
272
+ }
273
+
274
+ .predictive-search-result h5 {
275
+ text-transform: uppercase;
276
+ }
277
+
278
+ .predictive-search-result-item {
279
+ margin-bottom: 0.5rem;
280
+ }
281
+
282
+ .predictive-search-result-item a {
283
+ align-items: center;
284
+ display: flex;
285
+ }
286
+
287
+ .predictive-search-result-item a img {
288
+ margin-right: 0.75rem;
289
+ height: 100%;
290
+ }
291
+
292
+ .search-result {
293
+ margin-bottom: 1.5rem;
294
+ }
295
+
296
+ .search-results-item {
297
+ margin-bottom: 0.5rem;
298
+ }
299
+
300
+ /*
301
+ * --------------------------------------------------
302
+ * routes/__index
303
+ * --------------------------------------------------
304
+ */
305
+ .featured-collection {
306
+ display: block;
307
+ margin-bottom: 2rem;
308
+ position: relative;
309
+ }
310
+
311
+ .featured-collection-image {
312
+ aspect-ratio: 1 / 1;
313
+ @media (min-width: 45em) {
314
+ aspect-ratio: 16 / 9;
315
+ }
316
+ }
317
+
318
+ .featured-collection img {
319
+ height: auto;
320
+ max-height: 100%;
321
+ object-fit: cover;
322
+ }
323
+
324
+ .recommended-products-grid {
325
+ display: grid;
326
+ grid-gap: 1.5rem;
327
+ grid-template-columns: repeat(2, 1fr);
328
+ @media (min-width: 45em) {
329
+ grid-template-columns: repeat(4, 1fr);
330
+ }
331
+ }
332
+
333
+ .recommended-product img {
334
+ height: auto;
335
+ }
336
+
337
+ /*
338
+ * --------------------------------------------------
339
+ * routes/collections._index.tsx
340
+ * --------------------------------------------------
341
+ */
342
+ .collections-grid {
343
+ display: grid;
344
+ grid-gap: 1.5rem;
345
+ grid-template-columns: repeat(auto-fit, minmax(var(--grid-item-width), 1fr));
346
+ margin-bottom: 2rem;
347
+ }
348
+
349
+ .collection-item img {
350
+ height: auto;
351
+ }
352
+
353
+ /*
354
+ * --------------------------------------------------
355
+ * routes/collections.$handle.tsx
356
+ * --------------------------------------------------
357
+ */
358
+ .collection-description {
359
+ margin-bottom: 1rem;
360
+ max-width: 95%;
361
+ @media (min-width: 45em) {
362
+ max-width: 600px;
363
+ }
364
+ }
365
+
366
+ .products-grid {
367
+ display: grid;
368
+ grid-gap: 1.5rem;
369
+ grid-template-columns: repeat(auto-fit, minmax(var(--grid-item-width), 1fr));
370
+ margin-bottom: 2rem;
371
+ }
372
+
373
+ .product-item img {
374
+ height: auto;
375
+ width: 100%;
376
+ }
377
+
378
+ /*
379
+ * --------------------------------------------------
380
+ * routes/products.$handle.tsx
381
+ * --------------------------------------------------
382
+ */
383
+ .product {
384
+ display: grid;
385
+ @media (min-width: 45em) {
386
+ grid-template-columns: 1fr 1fr;
387
+ grid-gap: 4rem;
388
+ }
389
+ }
390
+
391
+ .product h1 {
392
+ margin-top: 0;
393
+ }
394
+
395
+ .product-images {
396
+ display: grid;
397
+ grid-gap: 1rem;
398
+ }
399
+
400
+ .product-image img {
401
+ height: auto;
402
+ width: 100%;
403
+ }
404
+
405
+ .product-main {
406
+ align-self: start;
407
+ position: sticky;
408
+ top: 6rem;
409
+ }
410
+
411
+ .product-price-on-sale {
412
+ display: flex;
413
+ grid-gap: 0.5rem;
414
+ }
415
+
416
+ .product-price-on-sale s {
417
+ opacity: 0.5;
418
+ }
419
+
420
+ .product-options-grid {
421
+ display: flex;
422
+ flex-wrap: wrap;
423
+ grid-gap: 0.75rem;
424
+ }
425
+
426
+ .product-options-item {
427
+ padding: 0.25rem 0.5rem;
428
+ }
429
+
430
+ /*
431
+ * --------------------------------------------------
432
+ * routes/blog._index.tsx
433
+ * --------------------------------------------------
434
+ */
435
+ .blog-grid {
436
+ display: grid;
437
+ grid-gap: 1.5rem;
438
+ grid-template-columns: repeat(auto-fit, minmax(var(--grid-item-width), 1fr));
439
+ margin-bottom: 2rem;
440
+ }
441
+
442
+ .blog-article-image {
443
+ aspect-ratio: 3/2;
444
+ display: block;
445
+ }
446
+
447
+ .blog-article-image img {
448
+ height: 100%;
449
+ }
450
+
451
+ /*
452
+ * --------------------------------------------------
453
+ * routes/blog.$articlehandle.tsx
454
+ * --------------------------------------------------
455
+ */
456
+ .article img {
457
+ height: auto;
458
+ width: 100%;
459
+ }
460
+
461
+ /*
462
+ * --------------------------------------------------
463
+ * routes/account
464
+ * --------------------------------------------------
465
+ */
466
+ .account-profile-marketing {
467
+ display: flex;
468
+ align-items: center;
469
+ }
470
+
471
+ .account-logout {
472
+ display: inline-block;
473
+ }
@@ -0,0 +1,129 @@
1
+ body {
2
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
3
+ Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
4
+ margin: 0;
5
+ padding: 0;
6
+ }
7
+
8
+ h1,
9
+ h2,
10
+ p {
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+
15
+ h1 {
16
+ font-size: 1.6rem;
17
+ font-weight: 700;
18
+ line-height: 1.4;
19
+ margin-bottom: 2rem;
20
+ margin-top: 2rem;
21
+ }
22
+
23
+ h2 {
24
+ font-size: 1.2rem;
25
+ font-weight: 700;
26
+ line-height: 1.4;
27
+ margin-bottom: 1rem;
28
+ }
29
+
30
+ h4 {
31
+ margin-top: 0.5rem;
32
+ margin-bottom: 0.5rem;
33
+ }
34
+
35
+ h5 {
36
+ margin-bottom: 1rem;
37
+ margin-top: 0.5rem;
38
+ }
39
+
40
+ p {
41
+ font-size: 1rem;
42
+ line-height: 1.4;
43
+ }
44
+
45
+ a {
46
+ color: #000;
47
+ text-decoration: none;
48
+ }
49
+
50
+ a:hover {
51
+ text-decoration: underline;
52
+ cursor: pointer;
53
+ }
54
+
55
+ hr {
56
+ border-bottom: none;
57
+ border-top: 1px solid #000;
58
+ margin: 0;
59
+ }
60
+
61
+ pre {
62
+ white-space: pre-wrap;
63
+ }
64
+
65
+ body {
66
+ display: flex;
67
+ flex-direction: column;
68
+ min-height: 100vh;
69
+ }
70
+
71
+ body > main {
72
+ margin: 0 1rem 1rem 1rem;
73
+ }
74
+
75
+ section {
76
+ padding: 1rem 0;
77
+ @media (min-width: 768px) {
78
+ padding: 2rem 0;
79
+ }
80
+ }
81
+
82
+ fieldset {
83
+ display: flex;
84
+ flex-direction: column;
85
+ margin-bottom: 0.5rem;
86
+ padding: 1rem;
87
+ }
88
+
89
+ form {
90
+ max-width: 100%;
91
+ @media (min-width: 768px) {
92
+ max-width: 400px;
93
+ }
94
+ }
95
+
96
+ input {
97
+ border-radius: 4px;
98
+ border: 1px solid #000;
99
+ font-size: 1rem;
100
+ margin-bottom: 0.5rem;
101
+ margin-top: 0.25rem;
102
+ padding: 0.5rem;
103
+ }
104
+
105
+ legend {
106
+ font-weight: 600;
107
+ margin-bottom: 0.5rem;
108
+ }
109
+
110
+ ul {
111
+ list-style: none;
112
+ margin: 0;
113
+ padding: 0;
114
+ }
115
+
116
+ li {
117
+ margin-bottom: 0.5rem;
118
+ }
119
+
120
+ dl {
121
+ margin: 0.5rem 0;
122
+ }
123
+
124
+ code {
125
+ background: #ddd;
126
+ border-radius: 4px;
127
+ font-family: monospace;
128
+ padding: 0.25rem;
129
+ }
@@ -0,0 +1,46 @@
1
+ import {useLocation} from '@remix-run/react';
2
+ import type {SelectedOption} from '@shopify/hydrogen/storefront-api-types';
3
+ import {useMemo} from 'react';
4
+
5
+ export function useVariantUrl(
6
+ handle: string,
7
+ selectedOptions: SelectedOption[],
8
+ ) {
9
+ const {pathname} = useLocation();
10
+
11
+ return useMemo(() => {
12
+ return getVariantUrl({
13
+ handle,
14
+ pathname,
15
+ searchParams: new URLSearchParams(),
16
+ selectedOptions,
17
+ });
18
+ }, [handle, selectedOptions, pathname]);
19
+ }
20
+
21
+ export function getVariantUrl({
22
+ handle,
23
+ pathname,
24
+ searchParams,
25
+ selectedOptions,
26
+ }: {
27
+ handle: string;
28
+ pathname: string;
29
+ searchParams: URLSearchParams;
30
+ selectedOptions: SelectedOption[];
31
+ }) {
32
+ const match = /(\/[a-zA-Z]{2}-[a-zA-Z]{2}\/)/g.exec(pathname);
33
+ const isLocalePathname = match && match.length > 0;
34
+
35
+ const path = isLocalePathname
36
+ ? `${match![0]}products/${handle}`
37
+ : `/products/${handle}`;
38
+
39
+ selectedOptions.forEach((option) => {
40
+ searchParams.set(option.name, option.value);
41
+ });
42
+
43
+ const searchString = searchParams.toString();
44
+
45
+ return path + (searchString ? '?' + searchParams.toString() : '');
46
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "skeleton",
3
+ "private": true,
4
+ "sideEffects": false,
5
+ "version": "0.0.0",
6
+ "scripts": {
7
+ "build": "shopify hydrogen build",
8
+ "dev": "shopify hydrogen dev --codegen-unstable",
9
+ "preview": "npm run build && shopify hydrogen preview",
10
+ "lint": "eslint --no-error-on-unmatched-pattern --ext .js,.ts,.jsx,.tsx .",
11
+ "typecheck": "tsc --noEmit",
12
+ "codegen": "shopify hydrogen codegen-unstable"
13
+ },
14
+ "prettier": "@shopify/prettier-config",
15
+ "dependencies": {
16
+ "@remix-run/react": "1.17.1",
17
+ "@shopify/cli": "3.47.5",
18
+ "@shopify/cli-hydrogen": "^5.1.0",
19
+ "@shopify/hydrogen": "^2023.7.0",
20
+ "@shopify/remix-oxygen": "^1.1.1",
21
+ "graphql": "^16.6.0",
22
+ "graphql-tag": "^2.12.6",
23
+ "isbot": "^3.6.6",
24
+ "react": "^18.2.0",
25
+ "react-dom": "^18.2.0"
26
+ },
27
+ "devDependencies": {
28
+ "@remix-run/dev": "1.17.1",
29
+ "@shopify/oxygen-workers-types": "^3.17.2",
30
+ "@shopify/prettier-config": "^1.1.2",
31
+ "@total-typescript/ts-reset": "^0.4.2",
32
+ "@types/eslint": "^8.4.10",
33
+ "@types/react": "^18.0.20",
34
+ "@types/react-dom": "^18.0.6",
35
+ "eslint": "^8.20.0",
36
+ "eslint-plugin-hydrogen": "0.12.2",
37
+ "prettier": "^2.8.4",
38
+ "typescript": "^4.9.5"
39
+ },
40
+ "engines": {
41
+ "node": ">=16.13"
42
+ }
43
+ }
@@ -0,0 +1,28 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none">
2
+ <style>
3
+ .stroke {
4
+ stroke: #000;
5
+ }
6
+ .fill {
7
+ fill: #000;
8
+ }
9
+ @media (prefers-color-scheme: dark) {
10
+ .stroke {
11
+ stroke: #fff;
12
+ }
13
+ .fill {
14
+ fill: #fff;
15
+ }
16
+ }
17
+ </style>
18
+ <path
19
+ class="stroke"
20
+ fill-rule="evenodd"
21
+ d="M16.1 16.04 1 8.02 6.16 5.3l5.82 3.09 4.88-2.57-5.82-3.1L16.21 0l15.1 8.02-5.17 2.72-5.5-2.91-4.88 2.57 5.5 2.92-5.16 2.72Z"
22
+ />
23
+ <path
24
+ class="fill"
25
+ fill-rule="evenodd"
26
+ d="M16.1 32 1 23.98l5.16-2.72 5.82 3.08 4.88-2.57-5.82-3.08 5.17-2.73 15.1 8.02-5.17 2.72-5.5-2.92-4.88 2.58 5.5 2.92L16.1 32Z"
27
+ />
28
+ </svg>