@shopify/hydrogen 2026.4.5 → 2026.10.0-preview.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.
Files changed (764) hide show
  1. package/README.md +73 -13
  2. package/bin/hydrogen.mjs +7 -0
  3. package/dist/cli/index.mjs +647 -0
  4. package/dist/client/client.d.mts +34 -0
  5. package/dist/client/client.mjs +206 -0
  6. package/dist/client/client.mjs.map +1 -0
  7. package/dist/client/errors.d.mts +48 -0
  8. package/dist/client/errors.mjs +52 -0
  9. package/dist/client/errors.mjs.map +1 -0
  10. package/dist/client/index.d.mts +4 -0
  11. package/dist/client/types.d.mts +147 -0
  12. package/dist/core/analytics/cart-tracker.d.mts +8 -0
  13. package/dist/core/analytics/cart-tracker.mjs +144 -0
  14. package/dist/core/analytics/cart-tracker.mjs.map +1 -0
  15. package/dist/core/analytics/events.d.mts +15 -0
  16. package/dist/core/analytics/events.mjs +15 -0
  17. package/dist/core/analytics/events.mjs.map +1 -0
  18. package/dist/core/analytics/index.d.mts +3 -0
  19. package/dist/core/analytics/types.d.mts +143 -0
  20. package/dist/core/analytics/utils/flatten-connection.d.mts +19 -0
  21. package/dist/core/analytics/utils/flatten-connection.mjs +25 -0
  22. package/dist/core/analytics/utils/flatten-connection.mjs.map +1 -0
  23. package/dist/core/cache/cache-status.mjs +17 -0
  24. package/dist/core/cache/cache-status.mjs.map +1 -0
  25. package/dist/core/cache/fetch-with-cache.d.mts +43 -0
  26. package/dist/core/cache/fetch-with-cache.mjs +188 -0
  27. package/dist/core/cache/fetch-with-cache.mjs.map +1 -0
  28. package/dist/core/cache/key.d.mts +6 -0
  29. package/dist/core/cache/key.mjs +27 -0
  30. package/dist/core/cache/key.mjs.map +1 -0
  31. package/dist/core/cache/run-with-cache.d.mts +36 -0
  32. package/dist/core/cache/run-with-cache.mjs +114 -0
  33. package/dist/core/cache/run-with-cache.mjs.map +1 -0
  34. package/dist/core/cache/store.d.mts +19 -0
  35. package/dist/core/cache/store.mjs +62 -0
  36. package/dist/core/cache/store.mjs.map +1 -0
  37. package/dist/core/cache/strategies.d.mts +39 -0
  38. package/dist/core/cache/strategies.mjs +70 -0
  39. package/dist/core/cache/strategies.mjs.map +1 -0
  40. package/dist/core/cart/actions.d.mts +50 -0
  41. package/dist/core/cart/actions.mjs +240 -0
  42. package/dist/core/cart/actions.mjs.map +1 -0
  43. package/dist/core/cart/attach-quantity-input.d.mts +5 -0
  44. package/dist/core/cart/attach-quantity-input.mjs +17 -0
  45. package/dist/core/cart/attach-quantity-input.mjs.map +1 -0
  46. package/dist/core/cart/buyer-identity-sync.d.mts +23 -0
  47. package/dist/core/cart/buyer-identity-sync.mjs +9 -0
  48. package/dist/core/cart/buyer-identity-sync.mjs.map +1 -0
  49. package/dist/core/cart/cart.d.mts +37 -0
  50. package/dist/core/cart/cart.mjs +1707 -0
  51. package/dist/core/cart/cart.mjs.map +1 -0
  52. package/dist/core/cart/cookie.d.mts +5 -0
  53. package/dist/core/cart/cookie.mjs +28 -0
  54. package/dist/core/cart/cookie.mjs.map +1 -0
  55. package/dist/core/cart/form.d.mts +130 -0
  56. package/dist/core/cart/form.mjs +75 -0
  57. package/dist/core/cart/form.mjs.map +1 -0
  58. package/dist/core/cart/get-cart.d.mts +25 -0
  59. package/dist/core/cart/get-cart.mjs +32 -0
  60. package/dist/core/cart/get-cart.mjs.map +1 -0
  61. package/dist/core/cart/index.d.mts +10 -0
  62. package/dist/core/cart/quantity.d.mts +10 -0
  63. package/dist/core/cart/quantity.mjs +14 -0
  64. package/dist/core/cart/quantity.mjs.map +1 -0
  65. package/dist/core/cart/queries.d.mts +4296 -0
  66. package/dist/core/cart/queries.mjs +70 -0
  67. package/dist/core/cart/queries.mjs.map +1 -0
  68. package/dist/core/cart/server-handlers.d.mts +82 -0
  69. package/dist/core/cart/server-handlers.mjs +322 -0
  70. package/dist/core/cart/server-handlers.mjs.map +1 -0
  71. package/dist/core/cart/state.d.mts +137 -0
  72. package/dist/core/cart/state.mjs +76 -0
  73. package/dist/core/cart/state.mjs.map +1 -0
  74. package/dist/core/cart/sync-quantity-inputs.mjs +16 -0
  75. package/dist/core/cart/sync-quantity-inputs.mjs.map +1 -0
  76. package/dist/core/collection/collection.d.mts +134 -0
  77. package/dist/core/collection/collection.mjs +170 -0
  78. package/dist/core/collection/collection.mjs.map +1 -0
  79. package/dist/core/collection/index.d.mts +6 -0
  80. package/dist/core/collection/reconciler.d.mts +32 -0
  81. package/dist/core/collection/reconciler.mjs +89 -0
  82. package/dist/core/collection/reconciler.mjs.map +1 -0
  83. package/dist/core/collection/state.d.mts +66 -0
  84. package/dist/core/collection/state.mjs +20 -0
  85. package/dist/core/collection/state.mjs.map +1 -0
  86. package/dist/core/collection/url.d.mts +71 -0
  87. package/dist/core/collection/url.mjs +376 -0
  88. package/dist/core/collection/url.mjs.map +1 -0
  89. package/dist/core/constants.d.mts +5 -0
  90. package/dist/core/constants.mjs +8 -0
  91. package/dist/core/constants.mjs.map +1 -0
  92. package/dist/core/headers.mjs +43 -0
  93. package/dist/core/headers.mjs.map +1 -0
  94. package/dist/core/index.d.mts +56 -0
  95. package/dist/core/index.mjs +45 -0
  96. package/dist/core/logging/logging.d.mts +21 -0
  97. package/dist/core/logging/logging.mjs +99 -0
  98. package/dist/core/logging/logging.mjs.map +1 -0
  99. package/dist/core/logging/types.d.mts +40 -0
  100. package/dist/core/logging/types.mjs +18 -0
  101. package/dist/core/logging/types.mjs.map +1 -0
  102. package/dist/core/money/cache.mjs +25 -0
  103. package/dist/core/money/cache.mjs.map +1 -0
  104. package/dist/core/money/format.d.mts +15 -0
  105. package/dist/core/money/format.mjs +243 -0
  106. package/dist/core/money/format.mjs.map +1 -0
  107. package/dist/core/money/types.d.mts +47 -0
  108. package/dist/core/observable.mjs +46 -0
  109. package/dist/core/observable.mjs.map +1 -0
  110. package/dist/core/predictive-search/constants.d.mts +5 -0
  111. package/dist/core/predictive-search/constants.mjs +6 -0
  112. package/dist/core/predictive-search/constants.mjs.map +1 -0
  113. package/dist/core/predictive-search/form.d.mts +31 -0
  114. package/dist/core/predictive-search/form.mjs +31 -0
  115. package/dist/core/predictive-search/form.mjs.map +1 -0
  116. package/dist/core/predictive-search/index.d.mts +6 -0
  117. package/dist/core/predictive-search/queries.d.mts +118 -0
  118. package/dist/core/predictive-search/queries.mjs +81 -0
  119. package/dist/core/predictive-search/queries.mjs.map +1 -0
  120. package/dist/core/predictive-search/search.d.mts +32 -0
  121. package/dist/core/predictive-search/search.mjs +74 -0
  122. package/dist/core/predictive-search/search.mjs.map +1 -0
  123. package/dist/core/predictive-search/server-handlers.d.mts +36 -0
  124. package/dist/core/predictive-search/server-handlers.mjs +113 -0
  125. package/dist/core/predictive-search/server-handlers.mjs.map +1 -0
  126. package/dist/core/predictive-search/store.d.mts +44 -0
  127. package/dist/core/predictive-search/store.mjs +224 -0
  128. package/dist/core/predictive-search/store.mjs.map +1 -0
  129. package/dist/core/predictive-search/url.d.mts +41 -0
  130. package/dist/core/predictive-search/url.mjs +71 -0
  131. package/dist/core/predictive-search/url.mjs.map +1 -0
  132. package/dist/core/product/accept-variant-id.mjs +98 -0
  133. package/dist/core/product/accept-variant-id.mjs.map +1 -0
  134. package/dist/core/product/form.d.mts +63 -0
  135. package/dist/core/product/form.mjs +44 -0
  136. package/dist/core/product/form.mjs.map +1 -0
  137. package/dist/core/product/index.d.mts +5 -0
  138. package/dist/core/product/options.d.mts +43 -0
  139. package/dist/core/product/options.mjs +296 -0
  140. package/dist/core/product/options.mjs.map +1 -0
  141. package/dist/core/product/product-form.d.mts +72 -0
  142. package/dist/core/product/product-form.mjs +158 -0
  143. package/dist/core/product/product-form.mjs.map +1 -0
  144. package/dist/core/product/state.d.mts +68 -0
  145. package/dist/core/product/url.d.mts +47 -0
  146. package/dist/core/product/url.mjs +69 -0
  147. package/dist/core/product/url.mjs.map +1 -0
  148. package/dist/core/request-context.d.mts +75 -0
  149. package/dist/core/request-context.mjs +141 -0
  150. package/dist/core/request-context.mjs.map +1 -0
  151. package/dist/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  152. package/dist/core/request-routing/handle-shopify-redirects.mjs +31 -0
  153. package/dist/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  154. package/dist/core/request-routing/handle-shopify-routes.d.mts +14 -0
  155. package/dist/core/request-routing/handle-shopify-routes.mjs +42 -0
  156. package/dist/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  157. package/dist/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  158. package/dist/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  159. package/dist/core/request-routing/interceptors/ajax-api.mjs +16 -0
  160. package/dist/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  161. package/dist/core/request-routing/interceptors/api-proxy.mjs +20 -0
  162. package/dist/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  163. package/dist/core/request-routing/interceptors/checkout.mjs +58 -0
  164. package/dist/core/request-routing/interceptors/checkout.mjs.map +1 -0
  165. package/dist/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  166. package/dist/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  167. package/dist/core/request-routing/interceptors/proxy.mjs +73 -0
  168. package/dist/core/request-routing/interceptors/proxy.mjs.map +1 -0
  169. package/dist/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  170. package/dist/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  171. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  172. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  173. package/dist/core/request-routing/interceptors/standard-routes.mjs +19 -0
  174. package/dist/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  175. package/dist/core/request-routing/interceptors/url-redirects.mjs +27 -0
  176. package/dist/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  177. package/dist/core/request-routing/interceptors/well-known.mjs +22 -0
  178. package/dist/core/request-routing/interceptors/well-known.mjs.map +1 -0
  179. package/dist/core/request-routing/registered-routes.d.mts +7 -0
  180. package/dist/core/request-routing/registered-routes.mjs +72 -0
  181. package/dist/core/request-routing/registered-routes.mjs.map +1 -0
  182. package/dist/core/request-routing/route-types.d.mts +56 -0
  183. package/dist/core/request-routing/safe-apply-response-headers.mjs +16 -0
  184. package/dist/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  185. package/dist/core/shop-pay/shop-pay.d.mts +102 -0
  186. package/dist/core/shop-pay/shop-pay.mjs +289 -0
  187. package/dist/core/shop-pay/shop-pay.mjs.map +1 -0
  188. package/dist/core/shopify-scripts/analytics.mjs +26 -0
  189. package/dist/core/shopify-scripts/analytics.mjs.map +1 -0
  190. package/dist/core/shopify-scripts/consent.mjs +17 -0
  191. package/dist/core/shopify-scripts/consent.mjs.map +1 -0
  192. package/dist/core/shopify-scripts/constants.mjs +19 -0
  193. package/dist/core/shopify-scripts/constants.mjs.map +1 -0
  194. package/dist/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  195. package/dist/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  196. package/dist/core/shopify-scripts/global.d.mts +1 -0
  197. package/dist/core/shopify-scripts/global.mjs +86 -0
  198. package/dist/core/shopify-scripts/global.mjs.map +1 -0
  199. package/dist/core/shopify-scripts/index.d.mts +27 -0
  200. package/dist/core/shopify-scripts/index.mjs +135 -0
  201. package/dist/core/shopify-scripts/index.mjs.map +1 -0
  202. package/dist/core/shopify-scripts/initialize.d.mts +18 -0
  203. package/dist/core/shopify-scripts/initialize.mjs +27 -0
  204. package/dist/core/shopify-scripts/initialize.mjs.map +1 -0
  205. package/dist/core/shopify-scripts/page-view.mjs +49 -0
  206. package/dist/core/shopify-scripts/page-view.mjs.map +1 -0
  207. package/dist/core/shopify-scripts/perfkit.mjs +33 -0
  208. package/dist/core/shopify-scripts/perfkit.mjs.map +1 -0
  209. package/dist/core/shopify-scripts/render.d.mts +1 -0
  210. package/dist/core/shopify-scripts/render.mjs +23 -0
  211. package/dist/core/shopify-scripts/render.mjs.map +1 -0
  212. package/dist/core/shopify-scripts/types.d.mts +76 -0
  213. package/dist/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  214. package/dist/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  215. package/dist/core/shopify-scripts/utils/inline-script.mjs +8 -0
  216. package/dist/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  217. package/dist/core/shopify-scripts/utils/navigation.mjs +46 -0
  218. package/dist/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  219. package/dist/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  220. package/dist/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  221. package/dist/core/shopify-scripts/utils/uuid.mjs +17 -0
  222. package/dist/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  223. package/dist/core/shopify-scripts/webmcp.mjs +22 -0
  224. package/dist/core/shopify-scripts/webmcp.mjs.map +1 -0
  225. package/dist/core/standard-routes/build.d.mts +34 -0
  226. package/dist/core/standard-routes/build.mjs +54 -0
  227. package/dist/core/standard-routes/build.mjs.map +1 -0
  228. package/dist/core/standard-routes/defaults.mjs +31 -0
  229. package/dist/core/standard-routes/defaults.mjs.map +1 -0
  230. package/dist/core/standard-routes/match.mjs +108 -0
  231. package/dist/core/standard-routes/match.mjs.map +1 -0
  232. package/dist/core/standard-routes/path.mjs +58 -0
  233. package/dist/core/standard-routes/path.mjs.map +1 -0
  234. package/dist/core/standard-routes/redirects.mjs +51 -0
  235. package/dist/core/standard-routes/redirects.mjs.map +1 -0
  236. package/dist/core/standard-routes/types.d.mts +95 -0
  237. package/dist/core/url.mjs +42 -0
  238. package/dist/core/url.mjs.map +1 -0
  239. package/dist/core/utils/load-script.mjs +34 -0
  240. package/dist/core/utils/load-script.mjs.map +1 -0
  241. package/dist/core/utils/parse-gid.mjs +33 -0
  242. package/dist/core/utils/parse-gid.mjs.map +1 -0
  243. package/dist/core/utils/record.mjs +8 -0
  244. package/dist/core/utils/record.mjs.map +1 -0
  245. package/dist/customer-account/client.d.mts +50 -0
  246. package/dist/customer-account/client.mjs +239 -0
  247. package/dist/customer-account/client.mjs.map +1 -0
  248. package/dist/customer-account/errors.d.mts +28 -0
  249. package/dist/customer-account/errors.mjs +39 -0
  250. package/dist/customer-account/errors.mjs.map +1 -0
  251. package/dist/customer-account/graphql.d.mts +29 -0
  252. package/dist/customer-account/graphql.mjs +39 -0
  253. package/dist/customer-account/graphql.mjs.map +1 -0
  254. package/dist/customer-account/index.d.mts +7 -0
  255. package/dist/customer-account/index.mjs +7 -0
  256. package/dist/customer-account/session.d.mts +117 -0
  257. package/dist/customer-account/session.mjs +733 -0
  258. package/dist/customer-account/session.mjs.map +1 -0
  259. package/dist/customer-account/type-resolver.d.mts +11 -0
  260. package/dist/customer-account-api-types.d.ts +3269 -3270
  261. package/dist/customer-account.schema.json +50753 -1
  262. package/dist/development/_virtual/_@oxc-project_runtime@0.127.0/helpers/taggedTemplateLiteral.mjs +7 -0
  263. package/dist/development/client/client.d.mts +34 -0
  264. package/dist/development/client/client.mjs +206 -0
  265. package/dist/development/client/client.mjs.map +1 -0
  266. package/dist/development/client/errors.d.mts +48 -0
  267. package/dist/development/client/errors.mjs +57 -0
  268. package/dist/development/client/errors.mjs.map +1 -0
  269. package/dist/development/client/index.d.mts +4 -0
  270. package/dist/development/client/types.d.mts +147 -0
  271. package/dist/development/core/analytics/cart-tracker.d.mts +8 -0
  272. package/dist/development/core/analytics/cart-tracker.mjs +144 -0
  273. package/dist/development/core/analytics/cart-tracker.mjs.map +1 -0
  274. package/dist/development/core/analytics/events.d.mts +15 -0
  275. package/dist/development/core/analytics/events.mjs +15 -0
  276. package/dist/development/core/analytics/events.mjs.map +1 -0
  277. package/dist/development/core/analytics/index.d.mts +3 -0
  278. package/dist/development/core/analytics/types.d.mts +143 -0
  279. package/dist/development/core/analytics/utils/flatten-connection.d.mts +19 -0
  280. package/dist/development/core/analytics/utils/flatten-connection.mjs +25 -0
  281. package/dist/development/core/analytics/utils/flatten-connection.mjs.map +1 -0
  282. package/dist/development/core/cache/cache-status.mjs +17 -0
  283. package/dist/development/core/cache/cache-status.mjs.map +1 -0
  284. package/dist/development/core/cache/fetch-with-cache.d.mts +43 -0
  285. package/dist/development/core/cache/fetch-with-cache.mjs +188 -0
  286. package/dist/development/core/cache/fetch-with-cache.mjs.map +1 -0
  287. package/dist/development/core/cache/key.d.mts +6 -0
  288. package/dist/development/core/cache/key.mjs +27 -0
  289. package/dist/development/core/cache/key.mjs.map +1 -0
  290. package/dist/development/core/cache/run-with-cache.d.mts +36 -0
  291. package/dist/development/core/cache/run-with-cache.mjs +114 -0
  292. package/dist/development/core/cache/run-with-cache.mjs.map +1 -0
  293. package/dist/development/core/cache/store.d.mts +19 -0
  294. package/dist/development/core/cache/store.mjs +62 -0
  295. package/dist/development/core/cache/store.mjs.map +1 -0
  296. package/dist/development/core/cache/strategies.d.mts +39 -0
  297. package/dist/development/core/cache/strategies.mjs +70 -0
  298. package/dist/development/core/cache/strategies.mjs.map +1 -0
  299. package/dist/development/core/cart/actions.d.mts +50 -0
  300. package/dist/development/core/cart/actions.mjs +240 -0
  301. package/dist/development/core/cart/actions.mjs.map +1 -0
  302. package/dist/development/core/cart/attach-quantity-input.d.mts +5 -0
  303. package/dist/development/core/cart/attach-quantity-input.mjs +17 -0
  304. package/dist/development/core/cart/attach-quantity-input.mjs.map +1 -0
  305. package/dist/development/core/cart/buyer-identity-sync.d.mts +19 -0
  306. package/dist/development/core/cart/buyer-identity-sync.mjs +6 -0
  307. package/dist/development/core/cart/buyer-identity-sync.mjs.map +1 -0
  308. package/dist/development/core/cart/cart.d.mts +37 -0
  309. package/dist/development/core/cart/cart.mjs +1707 -0
  310. package/dist/development/core/cart/cart.mjs.map +1 -0
  311. package/dist/development/core/cart/cookie.d.mts +5 -0
  312. package/dist/development/core/cart/cookie.mjs +28 -0
  313. package/dist/development/core/cart/cookie.mjs.map +1 -0
  314. package/dist/development/core/cart/form.d.mts +130 -0
  315. package/dist/development/core/cart/form.mjs +75 -0
  316. package/dist/development/core/cart/form.mjs.map +1 -0
  317. package/dist/development/core/cart/get-cart.d.mts +25 -0
  318. package/dist/development/core/cart/get-cart.mjs +32 -0
  319. package/dist/development/core/cart/get-cart.mjs.map +1 -0
  320. package/dist/development/core/cart/index.d.mts +10 -0
  321. package/dist/development/core/cart/quantity.d.mts +10 -0
  322. package/dist/development/core/cart/quantity.mjs +14 -0
  323. package/dist/development/core/cart/quantity.mjs.map +1 -0
  324. package/dist/development/core/cart/queries.d.mts +4296 -0
  325. package/dist/development/core/cart/queries.mjs +70 -0
  326. package/dist/development/core/cart/queries.mjs.map +1 -0
  327. package/dist/development/core/cart/server-handlers.d.mts +82 -0
  328. package/dist/development/core/cart/server-handlers.mjs +322 -0
  329. package/dist/development/core/cart/server-handlers.mjs.map +1 -0
  330. package/dist/development/core/cart/state.d.mts +137 -0
  331. package/dist/development/core/cart/state.mjs +76 -0
  332. package/dist/development/core/cart/state.mjs.map +1 -0
  333. package/dist/development/core/cart/sync-quantity-inputs.mjs +16 -0
  334. package/dist/development/core/cart/sync-quantity-inputs.mjs.map +1 -0
  335. package/dist/development/core/collection/collection.d.mts +134 -0
  336. package/dist/development/core/collection/collection.mjs +170 -0
  337. package/dist/development/core/collection/collection.mjs.map +1 -0
  338. package/dist/development/core/collection/index.d.mts +6 -0
  339. package/dist/development/core/collection/reconciler.d.mts +32 -0
  340. package/dist/development/core/collection/reconciler.mjs +89 -0
  341. package/dist/development/core/collection/reconciler.mjs.map +1 -0
  342. package/dist/development/core/collection/state.d.mts +66 -0
  343. package/dist/development/core/collection/state.mjs +20 -0
  344. package/dist/development/core/collection/state.mjs.map +1 -0
  345. package/dist/development/core/collection/url.d.mts +71 -0
  346. package/dist/development/core/collection/url.mjs +376 -0
  347. package/dist/development/core/collection/url.mjs.map +1 -0
  348. package/dist/development/core/constants.mjs +7 -0
  349. package/dist/development/core/constants.mjs.map +1 -0
  350. package/dist/development/core/development.d.mts +56 -0
  351. package/dist/development/core/development.mjs +45 -0
  352. package/dist/development/core/headers.mjs +43 -0
  353. package/dist/development/core/headers.mjs.map +1 -0
  354. package/dist/development/core/index.d.mts +54 -0
  355. package/dist/development/core/logging/logging.d.mts +21 -0
  356. package/dist/development/core/logging/logging.mjs +99 -0
  357. package/dist/development/core/logging/logging.mjs.map +1 -0
  358. package/dist/development/core/logging/types.d.mts +40 -0
  359. package/dist/development/core/logging/types.mjs +18 -0
  360. package/dist/development/core/logging/types.mjs.map +1 -0
  361. package/dist/development/core/money/cache.mjs +25 -0
  362. package/dist/development/core/money/cache.mjs.map +1 -0
  363. package/dist/development/core/money/format.d.mts +15 -0
  364. package/dist/development/core/money/format.mjs +243 -0
  365. package/dist/development/core/money/format.mjs.map +1 -0
  366. package/dist/development/core/money/types.d.mts +47 -0
  367. package/dist/development/core/observable.mjs +46 -0
  368. package/dist/development/core/observable.mjs.map +1 -0
  369. package/dist/development/core/predictive-search/constants.d.mts +5 -0
  370. package/dist/development/core/predictive-search/constants.mjs +6 -0
  371. package/dist/development/core/predictive-search/constants.mjs.map +1 -0
  372. package/dist/development/core/predictive-search/form.d.mts +31 -0
  373. package/dist/development/core/predictive-search/form.mjs +31 -0
  374. package/dist/development/core/predictive-search/form.mjs.map +1 -0
  375. package/dist/development/core/predictive-search/index.d.mts +6 -0
  376. package/dist/development/core/predictive-search/queries.d.mts +118 -0
  377. package/dist/development/core/predictive-search/queries.mjs +81 -0
  378. package/dist/development/core/predictive-search/queries.mjs.map +1 -0
  379. package/dist/development/core/predictive-search/search.d.mts +32 -0
  380. package/dist/development/core/predictive-search/search.mjs +74 -0
  381. package/dist/development/core/predictive-search/search.mjs.map +1 -0
  382. package/dist/development/core/predictive-search/server-handlers.d.mts +36 -0
  383. package/dist/development/core/predictive-search/server-handlers.mjs +113 -0
  384. package/dist/development/core/predictive-search/server-handlers.mjs.map +1 -0
  385. package/dist/development/core/predictive-search/store.d.mts +44 -0
  386. package/dist/development/core/predictive-search/store.mjs +224 -0
  387. package/dist/development/core/predictive-search/store.mjs.map +1 -0
  388. package/dist/development/core/predictive-search/url.d.mts +41 -0
  389. package/dist/development/core/predictive-search/url.mjs +71 -0
  390. package/dist/development/core/predictive-search/url.mjs.map +1 -0
  391. package/dist/development/core/product/accept-variant-id.mjs +98 -0
  392. package/dist/development/core/product/accept-variant-id.mjs.map +1 -0
  393. package/dist/development/core/product/form.d.mts +63 -0
  394. package/dist/development/core/product/form.mjs +44 -0
  395. package/dist/development/core/product/form.mjs.map +1 -0
  396. package/dist/development/core/product/index.d.mts +5 -0
  397. package/dist/development/core/product/options.d.mts +43 -0
  398. package/dist/development/core/product/options.mjs +296 -0
  399. package/dist/development/core/product/options.mjs.map +1 -0
  400. package/dist/development/core/product/product-form.d.mts +72 -0
  401. package/dist/development/core/product/product-form.mjs +158 -0
  402. package/dist/development/core/product/product-form.mjs.map +1 -0
  403. package/dist/development/core/product/state.d.mts +68 -0
  404. package/dist/development/core/product/url.d.mts +47 -0
  405. package/dist/development/core/product/url.mjs +69 -0
  406. package/dist/development/core/product/url.mjs.map +1 -0
  407. package/dist/development/core/request-context.d.mts +75 -0
  408. package/dist/development/core/request-context.mjs +141 -0
  409. package/dist/development/core/request-context.mjs.map +1 -0
  410. package/dist/development/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  411. package/dist/development/core/request-routing/handle-shopify-redirects.mjs +31 -0
  412. package/dist/development/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  413. package/dist/development/core/request-routing/handle-shopify-routes.d.mts +1 -0
  414. package/dist/development/core/request-routing/handle-shopify-routes.development.d.mts +11 -0
  415. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs +16 -0
  416. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs.map +1 -0
  417. package/dist/development/core/request-routing/handle-shopify-routes.mjs +42 -0
  418. package/dist/development/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  419. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  420. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  421. package/dist/development/core/request-routing/interceptors/ajax-api.mjs +16 -0
  422. package/dist/development/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  423. package/dist/development/core/request-routing/interceptors/api-proxy.mjs +20 -0
  424. package/dist/development/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  425. package/dist/development/core/request-routing/interceptors/checkout.mjs +58 -0
  426. package/dist/development/core/request-routing/interceptors/checkout.mjs.map +1 -0
  427. package/dist/development/core/request-routing/interceptors/graphiql.mjs +46 -0
  428. package/dist/development/core/request-routing/interceptors/graphiql.mjs.map +1 -0
  429. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  430. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  431. package/dist/development/core/request-routing/interceptors/proxy.mjs +73 -0
  432. package/dist/development/core/request-routing/interceptors/proxy.mjs.map +1 -0
  433. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  434. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  435. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  436. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  437. package/dist/development/core/request-routing/interceptors/standard-routes.mjs +19 -0
  438. package/dist/development/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  439. package/dist/development/core/request-routing/interceptors/url-redirects.mjs +27 -0
  440. package/dist/development/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  441. package/dist/development/core/request-routing/interceptors/well-known.mjs +22 -0
  442. package/dist/development/core/request-routing/interceptors/well-known.mjs.map +1 -0
  443. package/dist/development/core/request-routing/registered-routes.d.mts +7 -0
  444. package/dist/development/core/request-routing/registered-routes.mjs +72 -0
  445. package/dist/development/core/request-routing/registered-routes.mjs.map +1 -0
  446. package/dist/development/core/request-routing/route-types.d.mts +56 -0
  447. package/dist/development/core/request-routing/safe-apply-response-headers.mjs +16 -0
  448. package/dist/development/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  449. package/dist/development/core/shop-pay/shop-pay.d.mts +102 -0
  450. package/dist/development/core/shop-pay/shop-pay.mjs +289 -0
  451. package/dist/development/core/shop-pay/shop-pay.mjs.map +1 -0
  452. package/dist/development/core/shopify-scripts/analytics.mjs +26 -0
  453. package/dist/development/core/shopify-scripts/analytics.mjs.map +1 -0
  454. package/dist/development/core/shopify-scripts/consent.mjs +17 -0
  455. package/dist/development/core/shopify-scripts/consent.mjs.map +1 -0
  456. package/dist/development/core/shopify-scripts/constants.mjs +19 -0
  457. package/dist/development/core/shopify-scripts/constants.mjs.map +1 -0
  458. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  459. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  460. package/dist/development/core/shopify-scripts/global.d.mts +1 -0
  461. package/dist/development/core/shopify-scripts/global.mjs +86 -0
  462. package/dist/development/core/shopify-scripts/global.mjs.map +1 -0
  463. package/dist/development/core/shopify-scripts/index.d.mts +27 -0
  464. package/dist/development/core/shopify-scripts/index.mjs +145 -0
  465. package/dist/development/core/shopify-scripts/index.mjs.map +1 -0
  466. package/dist/development/core/shopify-scripts/initialize.d.mts +18 -0
  467. package/dist/development/core/shopify-scripts/initialize.mjs +27 -0
  468. package/dist/development/core/shopify-scripts/initialize.mjs.map +1 -0
  469. package/dist/development/core/shopify-scripts/page-view.mjs +49 -0
  470. package/dist/development/core/shopify-scripts/page-view.mjs.map +1 -0
  471. package/dist/development/core/shopify-scripts/perfkit.mjs +33 -0
  472. package/dist/development/core/shopify-scripts/perfkit.mjs.map +1 -0
  473. package/dist/development/core/shopify-scripts/render.d.mts +1 -0
  474. package/dist/development/core/shopify-scripts/render.mjs +23 -0
  475. package/dist/development/core/shopify-scripts/render.mjs.map +1 -0
  476. package/dist/development/core/shopify-scripts/types.d.mts +76 -0
  477. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  478. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  479. package/dist/development/core/shopify-scripts/utils/inline-script.mjs +8 -0
  480. package/dist/development/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  481. package/dist/development/core/shopify-scripts/utils/navigation.mjs +46 -0
  482. package/dist/development/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  483. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  484. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  485. package/dist/development/core/shopify-scripts/utils/uuid.mjs +17 -0
  486. package/dist/development/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  487. package/dist/development/core/shopify-scripts/webmcp.mjs +22 -0
  488. package/dist/development/core/shopify-scripts/webmcp.mjs.map +1 -0
  489. package/dist/development/core/standard-routes/build.d.mts +34 -0
  490. package/dist/development/core/standard-routes/build.mjs +54 -0
  491. package/dist/development/core/standard-routes/build.mjs.map +1 -0
  492. package/dist/development/core/standard-routes/defaults.mjs +31 -0
  493. package/dist/development/core/standard-routes/defaults.mjs.map +1 -0
  494. package/dist/development/core/standard-routes/match.mjs +108 -0
  495. package/dist/development/core/standard-routes/match.mjs.map +1 -0
  496. package/dist/development/core/standard-routes/path.mjs +58 -0
  497. package/dist/development/core/standard-routes/path.mjs.map +1 -0
  498. package/dist/development/core/standard-routes/redirects.mjs +51 -0
  499. package/dist/development/core/standard-routes/redirects.mjs.map +1 -0
  500. package/dist/development/core/standard-routes/types.d.mts +95 -0
  501. package/dist/development/core/types.d.mts +11 -0
  502. package/dist/development/core/url.mjs +42 -0
  503. package/dist/development/core/url.mjs.map +1 -0
  504. package/dist/development/core/utils/load-script.mjs +34 -0
  505. package/dist/development/core/utils/load-script.mjs.map +1 -0
  506. package/dist/development/core/utils/parse-gid.mjs +33 -0
  507. package/dist/development/core/utils/parse-gid.mjs.map +1 -0
  508. package/dist/development/customer-account/session.d.mts +46 -0
  509. package/dist/development/customer-account/session.mjs +21 -0
  510. package/dist/development/customer-account/session.mjs.map +1 -0
  511. package/dist/development/globals.d.mts +64 -0
  512. package/dist/development/graphql/generated/customer-account-api-types.d.mts +13 -0
  513. package/dist/development/graphql/generated/graphql-env.d.mts +19280 -0
  514. package/dist/development/graphql/generated/storefront-api-types.d.mts +47 -0
  515. package/dist/development/graphql/graphql.d.mts +40 -0
  516. package/dist/development/graphql/graphql.mjs +16 -0
  517. package/dist/development/graphql/graphql.mjs.map +1 -0
  518. package/dist/development/graphql/index.d.mts +2 -0
  519. package/dist/development/graphql/scalars.d.mts +15 -0
  520. package/dist/development/graphql/type-resolver.d.mts +229 -0
  521. package/dist/development/react/cart.d.mts +44 -0
  522. package/dist/development/react/cart.mjs +155 -0
  523. package/dist/development/react/cart.mjs.map +1 -0
  524. package/dist/development/react/collection.d.mts +91 -0
  525. package/dist/development/react/collection.mjs +129 -0
  526. package/dist/development/react/collection.mjs.map +1 -0
  527. package/dist/development/react/index.d.mts +13 -0
  528. package/dist/development/react/index.mjs +10 -0
  529. package/dist/development/react/predictive-search.d.mts +49 -0
  530. package/dist/development/react/predictive-search.mjs +133 -0
  531. package/dist/development/react/predictive-search.mjs.map +1 -0
  532. package/dist/development/react/product.d.mts +72 -0
  533. package/dist/development/react/product.mjs +127 -0
  534. package/dist/development/react/product.mjs.map +1 -0
  535. package/dist/development/react/shop-pay.d.mts +9 -0
  536. package/dist/development/react/shop-pay.mjs +16 -0
  537. package/dist/development/react/shop-pay.mjs.map +1 -0
  538. package/dist/development/react/shopify-scripts.d.mts +20 -0
  539. package/dist/development/react/shopify-scripts.mjs +39 -0
  540. package/dist/development/react/shopify-scripts.mjs.map +1 -0
  541. package/dist/development/vendor/standard-actions.d.mts +134 -0
  542. package/dist/development/vendor/standard-events.d.mts +1107 -0
  543. package/dist/development/vue/cart.d.mts +46 -0
  544. package/dist/development/vue/cart.mjs +122 -0
  545. package/dist/development/vue/cart.mjs.map +1 -0
  546. package/dist/development/vue/collection.d.mts +46 -0
  547. package/dist/development/vue/collection.mjs +108 -0
  548. package/dist/development/vue/collection.mjs.map +1 -0
  549. package/dist/development/vue/index.d.mts +11 -0
  550. package/dist/development/vue/index.mjs +8 -0
  551. package/dist/development/vue/predictive-search.d.mts +124 -0
  552. package/dist/development/vue/predictive-search.mjs +171 -0
  553. package/dist/development/vue/predictive-search.mjs.map +1 -0
  554. package/dist/development/vue/product.d.mts +57 -0
  555. package/dist/development/vue/product.mjs +167 -0
  556. package/dist/development/vue/product.mjs.map +1 -0
  557. package/dist/development/vue/shop-pay.d.mts +25 -0
  558. package/dist/development/vue/shop-pay.mjs +35 -0
  559. package/dist/development/vue/shop-pay.mjs.map +1 -0
  560. package/dist/development/vue/shopify-scripts.d.mts +127 -0
  561. package/dist/development/vue/shopify-scripts.mjs +79 -0
  562. package/dist/development/vue/shopify-scripts.mjs.map +1 -0
  563. package/dist/globals.d.mts +64 -0
  564. package/dist/graphql/generated/customer-account-api-types.d.mts +13 -0
  565. package/dist/graphql/generated/customer-account-graphql-env.d.mts +22170 -0
  566. package/dist/graphql/generated/graphql-env.d.mts +19280 -0
  567. package/dist/graphql/generated/storefront-api-types.d.mts +47 -0
  568. package/dist/graphql/graphql.d.mts +40 -0
  569. package/dist/graphql/graphql.mjs +16 -0
  570. package/dist/graphql/graphql.mjs.map +1 -0
  571. package/dist/graphql/index.d.mts +2 -0
  572. package/dist/graphql/scalars.d.mts +26 -0
  573. package/dist/graphql/type-resolver.d.mts +229 -0
  574. package/dist/react/cart.d.mts +44 -0
  575. package/dist/react/cart.mjs +155 -0
  576. package/dist/react/cart.mjs.map +1 -0
  577. package/dist/react/collection.d.mts +91 -0
  578. package/dist/react/collection.mjs +129 -0
  579. package/dist/react/collection.mjs.map +1 -0
  580. package/dist/react/index.d.mts +13 -0
  581. package/dist/react/index.mjs +10 -0
  582. package/dist/react/predictive-search.d.mts +49 -0
  583. package/dist/react/predictive-search.mjs +133 -0
  584. package/dist/react/predictive-search.mjs.map +1 -0
  585. package/dist/react/product.d.mts +72 -0
  586. package/dist/react/product.mjs +127 -0
  587. package/dist/react/product.mjs.map +1 -0
  588. package/dist/react/shop-pay.d.mts +9 -0
  589. package/dist/react/shop-pay.mjs +16 -0
  590. package/dist/react/shop-pay.mjs.map +1 -0
  591. package/dist/react/shopify-scripts.d.mts +20 -0
  592. package/dist/react/shopify-scripts.mjs +39 -0
  593. package/dist/react/shopify-scripts.mjs.map +1 -0
  594. package/dist/storefront-api-types.d.ts +2351 -2390
  595. package/dist/storefront.schema.json +41534 -1
  596. package/dist/ts-plugin/index.cjs +68 -0
  597. package/dist/ts-plugin/index.cjs.map +1 -0
  598. package/dist/ts-plugin/index.d.cts +4 -0
  599. package/dist/vendor/standard-actions.d.mts +134 -0
  600. package/dist/vendor/standard-events.d.mts +1107 -0
  601. package/dist/vite/certificate-prompt.mjs +24 -0
  602. package/dist/vite/certificate-prompt.mjs.map +1 -0
  603. package/dist/vite/index.d.mts +2 -0
  604. package/dist/vite/index.mjs +3 -0
  605. package/dist/vite/local-https.d.mts +47 -0
  606. package/dist/vite/local-https.mjs +276 -0
  607. package/dist/vite/local-https.mjs.map +1 -0
  608. package/dist/vite/mkcert.mjs +141 -0
  609. package/dist/vite/mkcert.mjs.map +1 -0
  610. package/dist/vue/cart.d.mts +46 -0
  611. package/dist/vue/cart.mjs +122 -0
  612. package/dist/vue/cart.mjs.map +1 -0
  613. package/dist/vue/collection.d.mts +46 -0
  614. package/dist/vue/collection.mjs +108 -0
  615. package/dist/vue/collection.mjs.map +1 -0
  616. package/dist/vue/index.d.mts +11 -0
  617. package/dist/vue/index.mjs +8 -0
  618. package/dist/vue/predictive-search.d.mts +124 -0
  619. package/dist/vue/predictive-search.mjs +171 -0
  620. package/dist/vue/predictive-search.mjs.map +1 -0
  621. package/dist/vue/product.d.mts +57 -0
  622. package/dist/vue/product.mjs +167 -0
  623. package/dist/vue/product.mjs.map +1 -0
  624. package/dist/vue/shop-pay.d.mts +25 -0
  625. package/dist/vue/shop-pay.mjs +35 -0
  626. package/dist/vue/shop-pay.mjs.map +1 -0
  627. package/dist/vue/shopify-scripts.d.mts +127 -0
  628. package/dist/vue/shopify-scripts.mjs +79 -0
  629. package/dist/vue/shopify-scripts.mjs.map +1 -0
  630. package/package.json +116 -86
  631. package/skills/hydrogen-analytics/SKILL.md +80 -0
  632. package/skills/hydrogen-analytics/references/react.md +160 -0
  633. package/skills/hydrogen-analytics/references/vue.md +80 -0
  634. package/skills/hydrogen-cart-drawer/SKILL.md +248 -0
  635. package/skills/hydrogen-cart-drawer/references/accessibility.md +109 -0
  636. package/skills/hydrogen-cart-drawer/references/css.md +67 -0
  637. package/skills/hydrogen-cart-ui/SKILL.md +224 -0
  638. package/skills/hydrogen-cart-ui/references/nextjs.md +89 -0
  639. package/skills/hydrogen-cart-ui/references/react.md +285 -0
  640. package/skills/hydrogen-cart-ui/references/vue.md +228 -0
  641. package/skills/hydrogen-collection-browser/SKILL.md +83 -0
  642. package/skills/hydrogen-collection-browser/references/nextjs.md +118 -0
  643. package/skills/hydrogen-collection-browser/references/nuxt.md +108 -0
  644. package/skills/hydrogen-collection-browser/references/react.md +301 -0
  645. package/skills/hydrogen-customer-account/SKILL.md +107 -0
  646. package/skills/hydrogen-image/SKILL.md +65 -0
  647. package/skills/hydrogen-local-https/SKILL.md +142 -0
  648. package/skills/hydrogen-markets/SKILL.md +221 -0
  649. package/skills/hydrogen-markets/references/nextjs.md +157 -0
  650. package/skills/hydrogen-money/SKILL.md +67 -0
  651. package/skills/hydrogen-oxygen/SKILL.md +245 -0
  652. package/skills/hydrogen-oxygen/references/react-router.md +230 -0
  653. package/skills/hydrogen-predictive-search/SKILL.md +130 -0
  654. package/skills/hydrogen-predictive-search/references/react.md +32 -0
  655. package/skills/hydrogen-predictive-search/references/vue.md +40 -0
  656. package/skills/hydrogen-request-handlers/SKILL.md +107 -0
  657. package/skills/hydrogen-request-handlers/references/frameworks.md +179 -0
  658. package/skills/hydrogen-request-handlers/references/nextjs.md +137 -0
  659. package/skills/hydrogen-request-handlers/references/nuxt.md +215 -0
  660. package/skills/hydrogen-routing/SKILL.md +171 -0
  661. package/skills/hydrogen-setup/SKILL.md +50 -0
  662. package/skills/hydrogen-setup/references/analytics.md +624 -0
  663. package/skills/hydrogen-setup/steps/1-inspect-app.md +62 -0
  664. package/skills/hydrogen-setup/steps/10-analytics.md +10 -0
  665. package/skills/hydrogen-setup/steps/11-verify.md +31 -0
  666. package/skills/hydrogen-setup/steps/2-scaffold.md +86 -0
  667. package/skills/hydrogen-setup/steps/3-build-home-page.md +37 -0
  668. package/skills/hydrogen-setup/steps/4-collection-and-search.md +14 -0
  669. package/skills/hydrogen-setup/steps/5-cart.md +10 -0
  670. package/skills/hydrogen-setup/steps/6-product-detail-page.md +416 -0
  671. package/skills/hydrogen-setup/steps/7-shopify-runtime-scripts.md +69 -0
  672. package/skills/hydrogen-setup/steps/8-cart-drawer-and-navbar.md +35 -0
  673. package/skills/hydrogen-setup/steps/9-account-page.md +54 -0
  674. package/skills/hydrogen-shop-pay/SKILL.md +79 -0
  675. package/skills/hydrogen-shop-pay/references/core.md +66 -0
  676. package/skills/hydrogen-shop-pay/references/react.md +50 -0
  677. package/skills/hydrogen-shop-pay/references/vue.md +39 -0
  678. package/skills/hydrogen-smoke-test/SKILL.md +205 -0
  679. package/skills/hydrogen-storefront-client/SKILL.md +322 -0
  680. package/skills/hydrogen-storefront-client/references/astro.md +125 -0
  681. package/skills/hydrogen-storefront-client/references/caching.md +25 -0
  682. package/skills/hydrogen-storefront-client/references/nextjs.md +121 -0
  683. package/skills/hydrogen-storefront-client/references/nuxt.md +121 -0
  684. package/skills/hydrogen-storefront-client/references/query-validation.md +95 -0
  685. package/skills/hydrogen-storefront-client/references/react-router.md +81 -0
  686. package/skills/hydrogen-storefront-client/references/solidstart.md +131 -0
  687. package/skills/hydrogen-storefront-client/references/sveltekit.md +169 -0
  688. package/skills/hydrogen-variant-form/SKILL.md +267 -0
  689. package/skills/hydrogen-variant-form/references/nextjs.md +207 -0
  690. package/skills/hydrogen-variant-form/references/nuxt.md +95 -0
  691. package/skills/hydrogen-variant-form/references/react.md +71 -0
  692. package/dist/dev/get-virtual-routes-H72465VB.js +0 -74
  693. package/dist/dev/hydrogen-routes.d.ts +0 -5
  694. package/dist/dev/hydrogen-routes.js +0 -25
  695. package/dist/development/get-virtual-routes-ACFZHU42.js +0 -71
  696. package/dist/development/get-virtual-routes-ACFZHU42.js.map +0 -1
  697. package/dist/development/index.cjs +0 -6978
  698. package/dist/development/index.cjs.map +0 -1
  699. package/dist/development/index.js +0 -6631
  700. package/dist/development/index.js.map +0 -1
  701. package/dist/development/log-seo-tags-IG37ONQ2.js +0 -74
  702. package/dist/development/log-seo-tags-IG37ONQ2.js.map +0 -1
  703. package/dist/development/react-router-preset.d.ts +0 -45
  704. package/dist/development/react-router-preset.js +0 -49
  705. package/dist/development/react-router-preset.js.map +0 -1
  706. package/dist/index.cjs +0 -1
  707. package/dist/oxygen/index.d.ts +0 -197
  708. package/dist/oxygen/index.js +0 -107
  709. package/dist/production/get-virtual-routes-ZZEGQQDV.js +0 -3
  710. package/dist/production/get-virtual-routes-ZZEGQQDV.js.map +0 -1
  711. package/dist/production/index.cjs +0 -1019
  712. package/dist/production/index.cjs.map +0 -1
  713. package/dist/production/index.d.cts +0 -3260
  714. package/dist/production/index.d.ts +0 -3260
  715. package/dist/production/index.js +0 -1019
  716. package/dist/production/index.js.map +0 -1
  717. package/dist/production/log-seo-tags-TY72EQWZ.js +0 -2
  718. package/dist/production/log-seo-tags-TY72EQWZ.js.map +0 -1
  719. package/dist/production/react-router-preset.d.ts +0 -45
  720. package/dist/production/react-router-preset.js +0 -11
  721. package/dist/react-router.d.ts +0 -75
  722. package/dist/vite/chunk-4O5OI3OO.js +0 -127
  723. package/dist/vite/chunk-FAQ7TVHC.js +0 -9
  724. package/dist/vite/chunk-QXBQVDMY.js +0 -68
  725. package/dist/vite/compat-date.d.ts +0 -3
  726. package/dist/vite/compat-date.js +0 -6
  727. package/dist/vite/get-virtual-routes.d.ts +0 -21
  728. package/dist/vite/get-virtual-routes.js +0 -74
  729. package/dist/vite/hydrogen-middleware.d.ts +0 -9
  730. package/dist/vite/hydrogen-middleware.js +0 -7
  731. package/dist/vite/plugin.d.ts +0 -22
  732. package/dist/vite/plugin.js +0 -171
  733. package/dist/vite/request-events.d.ts +0 -144
  734. package/dist/vite/request-events.js +0 -10
  735. package/dist/vite/types.d.ts +0 -5
  736. package/dist/vite/types.js +0 -0
  737. package/dist/vite/virtual-routes/assets/debug-network.css +0 -609
  738. package/dist/vite/virtual-routes/assets/favicon-dark.svg +0 -20
  739. package/dist/vite/virtual-routes/assets/favicon.svg +0 -28
  740. package/dist/vite/virtual-routes/assets/inter-variable-font.woff2 +0 -0
  741. package/dist/vite/virtual-routes/assets/jetbrainsmono-variable-font.woff2 +0 -0
  742. package/dist/vite/virtual-routes/assets/styles.css +0 -249
  743. package/dist/vite/virtual-routes/components/FlameChartWrapper.jsx +0 -123
  744. package/dist/vite/virtual-routes/components/HydrogenLogoBaseBW.jsx +0 -32
  745. package/dist/vite/virtual-routes/components/HydrogenLogoBaseColor.jsx +0 -47
  746. package/dist/vite/virtual-routes/components/IconBanner.jsx +0 -292
  747. package/dist/vite/virtual-routes/components/IconClose.jsx +0 -38
  748. package/dist/vite/virtual-routes/components/IconDiscard.jsx +0 -44
  749. package/dist/vite/virtual-routes/components/IconError.jsx +0 -61
  750. package/dist/vite/virtual-routes/components/IconGithub.jsx +0 -23
  751. package/dist/vite/virtual-routes/components/IconTwitter.jsx +0 -21
  752. package/dist/vite/virtual-routes/components/Layout.jsx +0 -7
  753. package/dist/vite/virtual-routes/components/RequestDetails.jsx +0 -171
  754. package/dist/vite/virtual-routes/components/RequestTable.jsx +0 -91
  755. package/dist/vite/virtual-routes/components/RequestWaterfall.jsx +0 -151
  756. package/dist/vite/virtual-routes/layout.jsx +0 -33
  757. package/dist/vite/virtual-routes/lib/useDebugNetworkServer.jsx +0 -178
  758. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx +0 -37
  759. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.tsx +0 -79
  760. package/dist/vite/virtual-routes/routes/graphiql.jsx +0 -5
  761. package/dist/vite/virtual-routes/routes/index.jsx +0 -265
  762. package/dist/vite/virtual-routes/routes/subrequest-profiler.jsx +0 -243
  763. package/dist/vite/virtual-routes/virtual-root-with-layout.jsx +0 -63
  764. package/dist/vite/virtual-routes/virtual-root.jsx +0 -67
@@ -1,1019 +0,0 @@
1
- 'use strict';var react=require('react'),reactRouter=require('react-router'),jsxRuntime=require('react/jsx-runtime'),hydrogenReact=require('@shopify/hydrogen-react'),loadScript=require('@shopify/hydrogen-react/load-script'),graphqlClient=require('@shopify/graphql-client'),cookie=require('worktop/cookie'),Rs=require('content-security-policy-builder');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Rs__default=/*#__PURE__*/_interopDefault(Rs);var Tn=Object.defineProperty;var Or=(e,t)=>()=>(e&&(t=e(e=0)),t);var _r=(e,t)=>{for(var r in t)Tn(e,r,{get:t[r],enumerable:true});};var Jo={};_r(Jo,{VIRTUAL_ROUTES_DIR:()=>Be,VIRTUAL_ROUTES_DIR_PARTS:()=>Ko,VIRTUAL_ROUTES_ROUTES_DIR_PARTS:()=>Qe,createVirtualRoutesPath:()=>Yo,getVirtualRoutesV3:()=>Ds});function Yo(e,t,r){let o=new URL("../",e),n=t.reduce((s,i)=>new URL(`${i}/`,s),o),a=new URL(r,n).pathname.replace(/^\/[a-zA-Z]:\//,"/");return decodeURIComponent(a)}function Ge(e,t){return Yo((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)),e,t)}async function Ds(){return {routes:[{id:`${Be}/graphiql`,path:"graphiql",file:Ge(Qe,"graphiql.jsx"),index:false},{id:`${Be}/subrequest-profiler`,path:"subrequest-profiler",file:Ge(Qe,"subrequest-profiler.jsx"),index:false},{id:`${Be}/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json`,path:".well-known/appspecific/com.chrome.devtools.json",file:Ge(Qe,"[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx"),index:false},{id:`${Be}/index`,path:"",file:Ge(Qe,"index.jsx"),index:true}],layout:{file:Ge(Ko,"layout.jsx")}}}var Be,Qe,Ko;var fn={};_r(fn,{default:()=>ln,logSeoTags:()=>yn});function ln({headTags:e}){return yn(e),null}function yn(e){console.log(" "),console.log("%cSEO Meta Tags",`${pi}`),console.log(" "),e.forEach(t=>{if(t.tag==="script"){if(console.log("%c\u2022 JSON LD ",Er),t.children)try{console.table(JSON.parse(t.children),["name","content"]);}catch{console.log(t.children);}}else {if(console.log(`%c\u2022 ${t.tag} `,Er),t.children)if(typeof t.children=="string")console.log(`\u21B3 ${t.children}`);else try{Object.entries(JSON.parse(t.children)).map(([r,o])=>console.log(`\u21B3 ${o}`));}catch{console.log(t.children);}if(t.props.property==="og:image:url"){let r=t.props.content;li(r).then(o=>{let n=`font-size: 400px; padding: 10px; background: white url(${o}) no-repeat center; background-size: contain;`;console.log("%c\u2022 Share image preview",Er),console.log("%c ",n),console.log(`\u21B3 ${r}`);}).catch(o=>{console.error(o);});}Object.entries(t.props).map(([r,o])=>{console.log(`\u21B3 ${r} \u2192 ${o}`);});}console.log(" ");});}async function li(e){let o=await(await(await fetch(e)).blob()).arrayBuffer();return `data:image/png;base64,${yi(o)}`}function yi(e){let t="",r=new Uint8Array(e),o=r.byteLength;for(let n=0;n<o;n++)t+=String.fromCharCode(r[n]);return btoa(t)}var Er,pi,mn=Or(()=>{Er="text-transform: uppercase;",pi="text-transform: uppercase; font-weight: bold; text-transform: uppercase;font-weight: bold";});function Ce(e){let{type:t,data:r={},customData:o}=e,n=reactRouter.useLocation(),{publish:a,cart:s,prevCart:i,shop:c,customData:u}=ee(),d=n.pathname+n.search,y={...r,customData:{...u,...o},cart:s,prevCart:i,shop:c};return react.useEffect(()=>{c?.shopId&&(y={...y,url:window.location.href},a(t,y));},[a,d,c?.shopId]),null}function Ur(e){return jsxRuntime.jsx(Ce,{...e,type:"page_viewed"})}function Lr(e){return jsxRuntime.jsx(Ce,{...e,type:"product_viewed"})}function kr(e){return jsxRuntime.jsx(Ce,{...e,type:"collection_viewed"})}function Vr(e){return jsxRuntime.jsx(Ce,{...e,type:"cart_viewed"})}function Nr(e){return jsxRuntime.jsx(Ce,{...e,type:"search_viewed"})}function Mr(e){return jsxRuntime.jsx(Ce,{...e})}var B={PAGE_VIEWED:"page_viewed",PRODUCT_VIEWED:"product_viewed",COLLECTION_VIEWED:"collection_viewed",CART_VIEWED:"cart_viewed",SEARCH_VIEWED:"search_viewed",CART_UPDATED:"cart_updated",PRODUCT_ADD_TO_CART:"product_added_to_cart",PRODUCT_REMOVED_FROM_CART:"product_removed_from_cart",CUSTOM_EVENT:"custom_"};var be="Custom-Storefront-Request-Group-ID",we="X-Shopify-Storefront-Access-Token",Pt="X-SDK-Variant",vt="X-SDK-Variant-Source",It="X-SDK-Version",Je="X-Shopify-Client-IP",he="X-Shopify-Client-IP-Sig",ze="_sfapi_proxy",Xe="_server_tracking";function Pn(e){return Object.entries(e).map(([t,r])=>r?`${t};desc=${r}`:void 0).filter(Boolean).join(", ")}function xe(e,t){let r=typeof t=="string"?t:Pn(t);r&&e.headers.append("Server-Timing",r);}var vn=["_y","_s","_cmp"];function Fr(e){let t={};if(!e)return t;let r=new RegExp(`\\b(${vn.join("|")});desc="?([^",]+)"?`,"g"),o;for(;(o=r.exec(e))!==null;)t[o[1]]=o[2];return t}function Hr(e){if(typeof window>"u")return false;try{return !!window.performance.getEntriesByType("navigation")[0]?.serverTiming?.some(r=>r.name===e)}catch{return false}}function $r(){return Hr(ze)}function qr(){return Hr(Xe)}var Dn="https://cdn.shopify.com/shopifycloud/consent-tracking-api/v0.2/consent-tracking-api.js",On="https://cdn.shopify.com/shopifycloud/privacy-banner/storefront-banner.js";function bt(e){console.error(`[h2:error:useCustomerPrivacy] Unable to setup Customer Privacy API: Missing consent.${e} configuration.`);}function wt(e){let{withPrivacyBanner:t=false,onVisitorConsentCollected:r,onReady:o,checkoutDomain:n,storefrontAccessToken:a,country:s,locale:i,sameDomainForStorefrontApi:c}=e,u=react.useMemo(()=>c??$r(),[c]),d=react.useMemo(()=>u&&!qr(),[u]),y=hydrogenReact.useShopifyCookies({fetchTrackingValues:d,storefrontAccessToken:a,ignoreDeprecatedCookies:true}),m=react.useMemo(hydrogenReact.getTrackingValues,[y]),{revalidate:C}=reactRouter.useRevalidator();loadScript.useLoadScript(t?On:Dn,{attributes:{id:"customer-privacy-api"}});let{observing:p,setLoaded:l,apisLoaded:S}=Un({withPrivacyBanner:t}),f=react.useMemo(()=>{n||bt("checkoutDomain"),a||bt("storefrontAccessToken"),(a.startsWith("shpat_")||a.length!==32)&&console.error("[h2:error:useCustomerPrivacy] It looks like you passed a private access token, make sure to use the public token");let h=Ln(n);return {checkoutRootDomain:u&&typeof window<"u"?window.location.host:n,storefrontRootDomain:h?"."+h:void 0,storefrontAccessToken:a,country:s,locale:i}},[bt,n,a,s,i]);react.useEffect(()=>{let h=T=>{let g=hydrogenReact.getTrackingValues();if((m.visitToken!==g.visitToken||m.uniqueToken!==g.uniqueToken)&&C().catch(()=>{console.warn("[h2:warn:useCustomerPrivacy] Revalidation failed after consent change.");}),r){let v=se();if(v?.shouldShowBanner()){let R=v.currentVisitorConsent();if(R&&R.marketing===""&&R.analytics===""&&R.preferences==="")return}r(T.detail);}};return document.addEventListener("visitorConsentCollected",h),()=>{document.removeEventListener("visitorConsentCollected",h);}},[r]),react.useEffect(()=>{if(!t||p.current.privacyBanner)return;p.current.privacyBanner=true;let h=window.privacyBanner||void 0;Object.defineProperty(window,"privacyBanner",{configurable:true,get(){return h},set(g){typeof g=="object"&&g!==null&&"showPreferences"in g&&"loadBanner"in g&&(h=Qr({privacyBanner:g,config:f}),l.privacyBanner());}});},[t,f,Qr,l.privacyBanner]),react.useEffect(()=>{if(p.current.customerPrivacy)return;p.current.customerPrivacy=true;let h=null,T=null,g=window.Shopify||void 0;Object.defineProperty(window,"Shopify",{configurable:true,get(){return g},set(v){typeof v=="object"&&v!==null&&Object.keys(v).length===0&&(g=v,h={backendConsentEnabled:true},Object.defineProperty(window.Shopify,"customerPrivacy",{configurable:true,get(){return T??h},set(R){if(typeof R=="object"&&R!==null&&"setTrackingConsent"in R){let U=R;T={...U,setTrackingConsent:Br({customerPrivacy:U,config:f})},g={...g,customerPrivacy:T},l.customerPrivacy();}}}));}});},[f,Br,l.customerPrivacy]),react.useEffect(()=>{if(!S||!y)return;let h=se();if(h&&!h.cachedConsent){let T=hydrogenReact.getTrackingValues();T.consent&&(h.cachedConsent=T.consent);}if(t){let T=De();T&&T.loadBanner(f);}_n(),o?.();},[S,y]);let P={customerPrivacy:se()};return t&&(P.privacyBanner=De()),P}var Gr=false;function _n(){if(Gr)return;Gr=true;let e=new CustomEvent("shopifyCustomerPrivacyApiLoaded");document.dispatchEvent(e);}function Un({withPrivacyBanner:e}){let t=react.useRef({customerPrivacy:false,privacyBanner:false}),[r,o]=react.useState(e?[false,false]:[false]),n=r.every(Boolean);return {observing:t,setLoaded:{customerPrivacy:()=>{o(e?s=>[true,s[1]]:()=>[true]);},privacyBanner:()=>{e&&o(s=>[s[0],true]);}},apisLoaded:n}}function Ln(e){if(typeof window>"u")return;let t=window.location.host,r=e.split(".").reverse(),o=t.split(".").reverse(),n=[];return r.forEach((a,s)=>{a===o[s]&&n.push(a);}),n.reverse().join(".")||void 0}function Br({customerPrivacy:e,config:t}){let r=e.setTrackingConsent,{locale:o,country:n,...a}=t;function s(i,c){r({...a,headlessStorefront:true,...i},c);}return s}function Qr({privacyBanner:e,config:t}){let r=e.loadBanner,o=e.showPreferences;function n(s){if(typeof s=="object"){r({...t,...s});return}r(t);}function a(s){if(typeof s=="object"){o({...t,...s});return}o(t);}return {loadBanner:n,showPreferences:a}}function se(){try{let e=window.Shopify?.customerPrivacy;return e&&"setTrackingConsent"in e?e:null}catch{return null}}function De(){try{return window&&window?.privacyBanner?window.privacyBanner:null}catch{return null}}var Wr="2026.4.5";function Hn(){let e=se();if(!e)throw new Error("Shopify Customer Privacy API not available. Must be used within a useEffect. Make sure to load the Shopify Customer Privacy API with useCustomerPrivacy() or <AnalyticsProvider>.");return e}function Kr({consent:e,onReady:t,domain:r}){let{subscribe:o,register:n,canTrack:a}=ee(),[s,i]=react.useState(false),[c,u]=react.useState(false),[d,y]=react.useState(""),m=react.useRef(false),{checkoutDomain:C,storefrontAccessToken:p,language:l}=e,{ready:S}=n("Internal_Shopify_Analytics");wt({...e,locale:l,checkoutDomain:C||"mock.shop",storefrontAccessToken:p||"abcdefghijklmnopqrstuvwxyz123456",onReady:()=>!e.withPrivacyBanner&&u(true),onVisitorConsentCollected:P=>{try{y(JSON.stringify(P));}catch{}u(true);}});let f=react.useMemo(()=>c?a():true,[c,a,d]);return hydrogenReact.useShopifyCookies({hasUserConsent:f,domain:r,checkoutDomain:C,fetchTrackingValues:false,ignoreDeprecatedCookies:!c}),react.useEffect(()=>{m.current||(m.current=true,o(B.PAGE_VIEWED,qn),o(B.PRODUCT_VIEWED,Gn),o(B.COLLECTION_VIEWED,Bn),o(B.SEARCH_VIEWED,Qn),o(B.PRODUCT_ADD_TO_CART,Wn),i(true));},[o]),react.useEffect(()=>{s&&c&&(S(),t());},[s,c,t]),null}function tt(e){console.error(`[h2:error:ShopifyAnalytics] Unable to send Shopify analytics: Missing shop.${e} configuration.`);}function Ue(e){let t=Hn(),r=t.analyticsProcessingAllowed();if(!e?.shop?.shopId){tt("shopId");return}if(!e?.shop?.acceptedLanguage){tt("acceptedLanguage");return}if(!e?.shop?.currency){tt("currency");return}if(!e?.shop?.hydrogenSubchannelId){tt("hydrogenSubchannelId");return}return {shopifySalesChannel:"hydrogen",assetVersionId:Wr,...e.shop,hasUserConsent:r,...hydrogenReact.getClientBrowserParameters(),analyticsAllowed:t.analyticsProcessingAllowed(),marketingAllowed:t.marketingAllowed(),saleOfDataAllowed:t.saleOfDataAllowed(),ccpaEnforced:!t.saleOfDataAllowed(),gdprEnforced:!(t.marketingAllowed()&&t.analyticsProcessingAllowed())}}function $n(e,t){if(t===null)return;let r=Ue(e);return r?{...r,cartId:t.id}:void 0}var ie={};function qn(e){let t=Ue(e);t&&(hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.PAGE_VIEW_2,payload:{...t,...ie}}),ie={});}function Gn(e){let t=Ue(e);if(t&&Yr({type:"product",products:e.products})){let r=Dt(e.products);ie={pageType:hydrogenReact.AnalyticsPageType.product,resourceId:r[0].productGid},t={...t,...ie,products:Dt(e.products)},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.PRODUCT_VIEW,payload:t});}}function Bn(e){let t=Ue(e);t&&(ie={pageType:hydrogenReact.AnalyticsPageType.collection,resourceId:e.collection.id},t={...t,...ie,collectionHandle:e.collection.handle,collectionId:e.collection.id},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.COLLECTION_VIEW,payload:t}));}function Qn(e){let t=Ue(e);t&&(ie={pageType:hydrogenReact.AnalyticsPageType.search},t={...t,...ie,searchString:e.searchTerm},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.SEARCH_VIEW,payload:t}));}function Wn(e){let{cart:t,currentLine:r}=e,o=$n(e,t);!o||!r?.id||jn({matchedLine:r,eventPayload:o});}function jn({matchedLine:e,eventPayload:t}){let r={id:e.merchandise.product.id,variantId:e.merchandise.id,title:e.merchandise.product.title,variantTitle:e.merchandise.title,vendor:e.merchandise.product.vendor,price:e.merchandise.price.amount,quantity:e.quantity,productType:e.merchandise.product.productType,sku:e.merchandise.sku};Yr({type:"cart",products:[r]})&&hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.ADD_TO_CART,payload:{...t,products:Dt([r])}});}function pe(e,t,r,o){if(e==="cart"){let n=`${r?"merchandise":"merchandise.product"}.${t}`;console.error(`[h2:error:ShopifyAnalytics] Can't set up cart analytics events because the \`cart.lines[].${n}\` value is missing from your GraphQL cart query. In your project, search for where \`fragment CartLine on CartLine\` is defined and make sure \`${n}\` is part of your cart query. Check the Hydrogen Skeleton template for reference: https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/lib/fragments.ts#L25-L56.`);}else {let n=`${o||t}`;console.error(`[h2:error:ShopifyAnalytics] Can't set up product view analytics events because the \`${n}\` is missing from your \`<Analytics.ProductView>\`. Make sure \`${n}\` is part of your products data prop. Check the Hydrogen Skeleton template for reference: https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/routes/products.%24handle.tsx#L159-L165.`);}}function Yr({type:e,products:t}){return !t||t.length===0?(pe(e,"",false,"data.products"),false):(t.forEach(r=>{if(!r.id)return pe(e,"id",false),false;if(!r.title)return pe(e,"title",false),false;if(!r.price)return pe(e,"price.amount",true,"price"),false;if(!r.vendor)return pe(e,"vendor",false),false;if(!r.variantId)return pe(e,"id",true,"variantId"),false;if(!r.variantTitle)return pe(e,"title",true,"variantTitle"),false}),true)}function Dt(e){return e.map(t=>{let r={productGid:t.id,variantGid:t.variantId,name:t.title,variantName:t.variantTitle,brand:t.vendor,price:t.price,quantity:t.quantity||1,category:t.productType};return t.sku&&(r.sku=t.sku),t.productType&&(r.category=t.productType),r})}function Xr(e){console.error(`[h2:error:CartAnalytics] Can't set up cart analytics events because the \`cart.${e}\` value is missing from your GraphQL cart query. In your project, search for where \`fragment CartApiQuery on Cart\` is defined and make sure \`${e}\` is part of your cart query. Check the Hydrogen Skeleton template for reference: https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/lib/fragments.ts#L59.`);}function Zr({cart:e,setCarts:t}){let{publish:r,shop:o,customData:n,canTrack:a,cart:s,prevCart:i}=ee(),c=react.useRef(null);return react.useEffect(()=>{if(e)return Promise.resolve(e).then(u=>{if(u&&u.lines){if(!u.id){Xr("id");return}if(!u.updatedAt){Xr("updatedAt");return}}t(({cart:d,prevCart:y})=>u?.updatedAt!==d?.updatedAt?{cart:u,prevCart:d}:{cart:d,prevCart:y});}),()=>{}},[t,e]),react.useEffect(()=>{if(!s||!s?.updatedAt||s?.updatedAt===i?.updatedAt)return;let u;try{u=JSON.parse(localStorage.getItem("cartLastUpdatedAt")||"");}catch{u=null;}if(s.id===u?.id&&s.updatedAt===u?.updatedAt)return;let d={eventTimestamp:Date.now(),cart:s,prevCart:i,shop:o,customData:n};if(s.updatedAt===c.current)return;c.current=s.updatedAt,r("cart_updated",d),localStorage.setItem("cartLastUpdatedAt",JSON.stringify({id:s.id,updatedAt:s.updatedAt}));let y=i?.lines?hydrogenReact.flattenConnection(i?.lines):[],m=s.lines?hydrogenReact.flattenConnection(s.lines):[];y?.forEach(C=>{let p=m.filter(l=>C.id===l.id);if(p?.length===1){let l=p[0];C.quantity<l.quantity?r("product_added_to_cart",{...d,prevLine:C,currentLine:l}):C.quantity>l.quantity&&r("product_removed_from_cart",{...d,prevLine:C,currentLine:l});}else r("product_removed_from_cart",{...d,prevLine:C});}),m?.forEach(C=>{let p=y.filter(l=>C.id===l.id);(!p||p.length===0)&&r("product_added_to_cart",{...d,currentLine:C});});},[s,i,r,o,n,a]),null}var Zn="https://cdn.shopify.com/shopifycloud/perf-kit/shopify-perf-kit-spa.min.js";function eo({shop:e}){let t=react.useRef(false),{subscribe:r,register:o}=ee(),{ready:n}=o("Internal_Shopify_Perf_Kit"),a=hydrogenReact.useLoadScript(Zn,{attributes:{id:"perfkit","data-application":"hydrogen","data-shop-id":hydrogenReact.parseGid(e.shopId).id.toString(),"data-storefront-id":e.hydrogenSubchannelId,"data-monorail-region":"global","data-spa-mode":"true","data-resource-timing-sampling-rate":"10"}});return react.useEffect(()=>{a!=="done"||t.current||(t.current=true,r(B.PAGE_VIEWED,()=>{window.PerfKit?.navigate();}),r(B.PRODUCT_VIEWED,()=>{window.PerfKit?.setPageType("product");}),r(B.COLLECTION_VIEWED,()=>{window.PerfKit?.setPageType("collection");}),r(B.SEARCH_VIEWED,()=>{window.PerfKit?.setPageType("search");}),r(B.CART_VIEWED,()=>{window.PerfKit?.setPageType("cart");}),n());},[r,n,a]),null}var to=new Set,J=e=>{to.has(e)||(console.warn(e),to.add(e));},ro=new Set,_t=e=>{ro.has(e)||(console.error(new Error(e)),ro.add(e));};var na={canTrack:()=>false,cart:null,customData:{},prevCart:null,publish:()=>{},shop:null,subscribe:()=>{},register:()=>({ready:()=>{}}),customerPrivacy:null,privacyBanner:null},co=react.createContext(na),ot=new Map,ke={};function uo(){return Object.values(ke).every(Boolean)}function oo(e,t){ot.has(e)||ot.set(e,new Map),ot.get(e)?.set(t.toString(),t);}var nt=new Map;function no(e,t){if(!uo()){nt.set(e,t);return}po(e,t);}function po(e,t){(ot.get(e)??new Map).forEach((r,o)=>{try{r(t);}catch(n){typeof n=="object"&&n instanceof Error?console.error("Analytics publish error",n.message,o,n.stack):console.error("Analytics publish error",n,o);}});}function ao(e){return ke.hasOwnProperty(e)||(ke[e]=false),{ready:()=>{ke[e]=true,uo()&&nt.size>0&&(nt.forEach((t,r)=>{po(r,t);}),nt.clear());}}}function so(){try{return window.Shopify.customerPrivacy?.analyticsProcessingAllowed?.()??!1}catch{}return false}function io(e,t){return `[h2:error:Analytics.Provider] - ${e} is required. Make sure ${t} is defined in your environment variables. See https://h2o.fyi/analytics/consent to learn how to setup environment variables in the Shopify admin.`}function aa({canTrack:e,cart:t,children:r,consent:o,customData:n={},shop:a=null,cookieDomain:s}){let{shop:i}=sa(a),[c,u]=react.useState(!!e),[d,y]=react.useState(false),[m,C]=react.useState({cart:null,prevCart:null}),[p,l]=react.useState(e?()=>e:()=>so);if(i)if(/\/68817551382$/.test(i.shopId))J("[h2:error:Analytics.Provider] - Mock shop is used. Analytics will not work properly.");else {if(!o.checkoutDomain){let f=io("consent.checkoutDomain","PUBLIC_CHECKOUT_DOMAIN");_t(f);}if(!o.storefrontAccessToken){let f=io("consent.storefrontAccessToken","PUBLIC_STOREFRONT_API_TOKEN");_t(f);}o?.country||(o.country="US"),o?.language||(o.language="EN"),o.withPrivacyBanner===void 0&&(o.withPrivacyBanner=false);}let S=react.useMemo(()=>({canTrack:p,...m,customData:n,publish:p()?no:()=>{},shop:i,subscribe:oo,register:ao,customerPrivacy:se(),privacyBanner:De()}),[c,p,m,m.cart?.updatedAt,m.prevCart,no,oo,n,i,ao,JSON.stringify(ke),se,De]);return jsxRuntime.jsxs(co.Provider,{value:S,children:[r,!!i&&jsxRuntime.jsx(Ur,{}),!!i&&!!t&&jsxRuntime.jsx(Zr,{cart:t,setCarts:C}),!!i&&jsxRuntime.jsx(Kr,{consent:o,onReady:()=>{u(true),l(e?()=>e:()=>so),y(true);},domain:s}),!!i&&d&&jsxRuntime.jsx(eo,{shop:i})]})}function ee(){let e=react.useContext(co);if(!e)throw new Error("[h2:error:useAnalytics] 'useAnalytics()' must be a descendent of <AnalyticsProvider/>");return e}function sa(e){let[t,r]=react.useState(null);return react.useEffect(()=>(Promise.resolve(e).then(r),()=>{}),[r,e]),{shop:t}}async function ia({storefront:e,publicStorefrontId:t="0"}){return e.query(ca,{cache:e.CacheLong()}).then(({shop:r,localization:o})=>({shopId:r.id,acceptedLanguage:o.language.isoCode,currency:o.country.currency.isoCode,hydrogenSubchannelId:t}))}var ca=`#graphql
2
- query ShopData(
3
- $country: CountryCode
4
- $language: LanguageCode
5
- ) @inContext(country: $country, language: $language) {
6
- shop {
7
- id
8
- }
9
- localization {
10
- country {
11
- currency {
12
- isoCode
13
- }
14
- }
15
- language {
16
- isoCode
17
- }
18
- }
19
- }
20
- `,ua={CartView:Vr,CollectionView:kr,CustomView:Mr,ProductView:Lr,Provider:aa,SearchView:Nr};function z(e,t){return Ut(e.headers,t)}function Ut(e,t){let r=e?.get?.(t)??e?.[t];return typeof r=="string"?r:null}function ce(e){return {requestId:e?z(e,"request-id"):void 0,purpose:e?z(e,"purpose"):void 0}}function lo(e){return {requestGroupId:z(e,"request-id"),buyerIp:z(e,"oxygen-buyer-ip"),buyerIpSig:z(e,he),cookie:z(e,"cookie"),purpose:z(e,"sec-purpose")||z(e,"purpose")}}var Lt=/^\/api\/(unstable|2\d{3}-\d{2})\/graphql\.json$/,yo=/^\/api\/mcp$/,at=e=>{try{return new URL(e,"http://e.c").pathname}catch{return "/"}};function Ve(e,t){return t.reduce((r,o)=>{let n=e(o);return n&&r.push([o,n]),r},[])}function Ae(e,t={}){let r=new Error,o=(n,a="Error")=>{let s=(r.stack??"").split(`
21
- `).slice(3+(t.stackOffset??0)).join(`
22
- `).replace(/ at loader(\d+) \(/,(i,c)=>i.replace(c,""));return `${a}: ${n}
23
- `+s};return e.then(n=>{if(n?.errors&&Array.isArray(n.errors)){let a=typeof t.logErrors=="function"?t.logErrors:()=>t.logErrors??false;n.errors.forEach(s=>{s&&(s.stack=o(s.message,s.name),a(s)&&console.error(s));});}return n}).catch(n=>{throw n&&(n.stack=o(n.message,n.name)),n})}var X=void 0;var st="public",pa="private",kt="no-store",fo={maxAge:"max-age",staleWhileRevalidate:"stale-while-revalidate",sMaxAge:"s-maxage",staleIfError:"stale-if-error"};function Ne(e){let t=[];return Object.keys(e).forEach(r=>{r==="mode"?t.push(e[r]):fo[r]&&t.push(`${fo[r]}=${e[r]}`);}),t.join(", ")}function Vt(){return {mode:kt}}function Nt(e){if(e?.mode&&e?.mode!==st&&e?.mode!==pa)throw Error("'mode' must be either 'public' or 'private'")}function le(e){return Nt(e),{mode:st,maxAge:1,staleWhileRevalidate:9,...e}}function Mt(e){return Nt(e),{mode:st,maxAge:3600,staleWhileRevalidate:82800,...e}}function Te(e){return Nt(e),{mode:st,maxAge:1,staleWhileRevalidate:86399,...e}}function Ft(e){return e}function te(e){return String(e).includes("__proto__")?JSON.parse(e,la):JSON.parse(e)}function la(e,t){if(e!=="__proto__")return t}function it(e,t){return e&&t?{...e,...t}:e||Te()}function Ht(e){return Ne(it(e))}async function ya(e,t){if(!e)return;let r=await e.match(t);if(!r){return}return r}async function fa(e,t,r,o){if(!e)return;let n=it(o),a=Ht(it(n,{maxAge:(n.maxAge||0)+(n.staleWhileRevalidate||0)})),s=Ht(it(n));r.headers.set("cache-control",a),r.headers.set("real-cache-control",s),r.headers.set("cache-put-date",String(Date.now())),await e.put(t,r);}async function ma(e,t){e&&await e.delete(t);}function Ca(e,t){let r=e.headers.get("real-cache-control"),o=0;if(r){let a=r.match(/max-age=(\d*)/);a&&a.length>1&&(o=parseFloat(a[1]));}return [(Date.now()-Number(t))/1e3,o]}function ga(e,t){let r=t.headers.get("cache-put-date");if(!r)return false;let[o,n]=Ca(t,r),a=o>n;return a}var ct={get:ya,set:fa,delete:ma,generateDefaultCacheControlHeader:Ht,isStale:ga};function Me(e){return `https://shopify.dev/?${e}`}function ha(e){return e||Te()}async function mo(e,t){if(!e)return;let r=Me(t),o=new Request(r),n=await ct.get(e,o);if(!n)return;let a=await n.text();try{return [te(a),n]}catch{return [a,n]}}async function Co(e,t,r,o){if(!e)return;let n=Me(t),a=new Request(n),s=new Response(JSON.stringify(r));await ct.set(e,a,s,ha(o));}function go(e,t){return ct.isStale(new Request(Me(e)),t)}function ho(e){let t=Array.isArray(e)?e:[e],r="";for(let o of t)o!=null&&(typeof o=="object"?r+=JSON.stringify(o):r+=o.toString());return encodeURIComponent(r)}var $t=new Set;async function ut(e,t,{strategy:r=le(),cacheInstance:o,shouldCacheResult:n=()=>true,waitUntil:a,debugInfo:s}){let c=ho([...typeof e=="string"?[e]:e]),y=f=>{({displayName:f.displayName,url:f.response?.url,responseInit:{status:f.response?.status||0,statusText:f.response?.statusText||"",headers:Array.from(f.response?.headers.entries()||[])}});},C=void 0;if(!o||!r||r.mode===kt){let f=await t({addDebugData:y});return f}let p=f=>Co(o,c,{value:f,debugInfo:void 0},r),l=await mo(o,c);if(l&&typeof l[0]!="string"){let[{value:f,debugInfo:P},h]=l;let T=go(c,h)?"STALE":"HIT";if(!$t.has(c)&&T==="STALE"){$t.add(c);let g=Promise.resolve().then(async()=>{let v=Date.now();try{let R=await t({addDebugData:y});n(R)&&(await p(R),C?.({result:R,cacheStatus:"PUT",overrideStartTime:v}));}catch(R){R.message&&(R.message="SWR in sub-request failed: "+R.message),console.error(R);}finally{$t.delete(c);}});a?.(g);}return f}let S=await t({addDebugData:y});if(n(S)){let f=Promise.resolve().then(async()=>{await p(S);});a?.(f);}return S}var Ta=["set-cookie","server-timing"];function Ao(e,t){return [e,{status:t.status,statusText:t.statusText,headers:[...t.headers].filter(([r])=>!Ta.includes(r.toLowerCase()))}]}function To([e,t]){return [e,new Response(e,t)]}async function dt(e,t,{cacheInstance:r,cache:o,cacheKey:n=[e,t],shouldCacheResponse:a,waitUntil:s,debugInfo:i,streamConfig:c,onRawHeaders:u}){return !o&&(!t.method||t.method==="GET")&&(o=le()),ut(n,async()=>{if(c){let m=null,p=await graphqlClient.createGraphQLClient({url:e,customFetchApi:async(f,P)=>(m=await fetch(f,P),u?.(m.headers),m),headers:t.headers}).requestStream(c.query,{variables:c.variables}),l,S;for await(let f of p){let{data:P,errors:h}=f;l=P,S=h?.graphQLErrors??h;}return m?.ok?Ao({data:l,errors:S},m):m}let d=await fetch(e,t);if(u?.(d.headers),!d.ok)return d;let y=await d.text().catch(()=>"");try{y&&(y=te(y));}catch{}return Ao(y,d)},{cacheInstance:r,waitUntil:s,strategy:o??null,debugInfo:i,shouldCacheResult:d=>"ok"in d?!1:a(...To(d))}).then(d=>"ok"in d?[null,d]:To(d))}function Sa(e){let{cache:t,waitUntil:r,request:o}=e;return {run:({cacheKey:n,cacheStrategy:a,shouldCacheResult:s},i)=>ut(n,i,{shouldCacheResult:s,strategy:a,cacheInstance:t,waitUntil:r,debugInfo:{...ce(o),stackInfo:X?.()}}),fetch:(n,a,s)=>dt(n,a??{},{waitUntil:r,cacheKey:[n,a],cacheInstance:t,debugInfo:{url:n,...ce(o),stackInfo:X?.(),displayName:s?.displayName},cache:s.cacheStrategy,...s}).then(([i,c])=>({data:i,response:c}))}}var qt=class{#e;constructor(){this.#e=new Map;}add(t){throw new Error("Method not implemented. Use `put` instead.")}addAll(t){throw new Error("Method not implemented. Use `put` instead.")}matchAll(t,r){throw new Error("Method not implemented. Use `match` instead.")}async put(t,r){if(t.method!=="GET")throw new TypeError("Cannot cache response to non-GET request.");if(r.status===206)throw new TypeError("Cannot cache response to a range request (206 Partial Content).");if(r.headers.get("vary")?.includes("*"))throw new TypeError("Cannot cache response with 'Vary: *' header.");this.#e.set(t.url,{body:new Uint8Array(await r.arrayBuffer()),status:r.status,headers:[...r.headers],timestamp:Date.now()});}async match(t){if(t.method!=="GET")return;let r=this.#e.get(t.url);if(!r)return;let{body:o,timestamp:n,...a}=r,s=new Headers(a.headers),i=s.get("cache-control")||s.get("real-cache-control")||"",c=parseInt(i.match(/max-age=(\d+)/)?.[1]||"0",10),u=parseInt(i.match(/stale-while-revalidate=(\d+)/)?.[1]||"0",10),d=(Date.now()-n)/1e3;if(d>c+u){this.#e.delete(t.url);return}let m=d>c;return s.set("cache",m?"STALE":"HIT"),s.set("date",new Date(n).toUTCString()),new Response(o,{status:a.status??200,headers:s})}async delete(t){return this.#e.has(t.url)?(this.#e.delete(t.url),true):false}keys(t){let r=[];for(let o of this.#e.keys())(!t||t.url===o)&&r.push(new Request(o));return Promise.resolve(r)}};var So="cartFormInput";function re({children:e,action:t,inputs:r,route:o,fetcherKey:n}){let a=reactRouter.useFetcher({key:n});return jsxRuntime.jsxs(a.Form,{action:o||"",method:"post",children:[(t||r)&&jsxRuntime.jsx("input",{type:"hidden",name:So,value:JSON.stringify({action:t,inputs:r})}),typeof e=="function"?e(a):e]})}re.INPUT_NAME=So;re.ACTIONS={AttributesUpdateInput:"AttributesUpdateInput",BuyerIdentityUpdate:"BuyerIdentityUpdate",Create:"Create",DiscountCodesUpdate:"DiscountCodesUpdate",GiftCardCodesUpdate:"GiftCardCodesUpdate",GiftCardCodesAdd:"GiftCardCodesAdd",GiftCardCodesRemove:"GiftCardCodesRemove",LinesAdd:"LinesAdd",LinesRemove:"LinesRemove",LinesUpdate:"LinesUpdate",NoteUpdate:"NoteUpdate",SelectedDeliveryOptionsUpdate:"SelectedDeliveryOptionsUpdate",MetafieldsSet:"MetafieldsSet",MetafieldDelete:"MetafieldDelete",DeliveryAddressesAdd:"DeliveryAddressesAdd",DeliveryAddressesUpdate:"DeliveryAddressesUpdate",DeliveryAddressesRemove:"DeliveryAddressesRemove",DeliveryAddressesReplace:"DeliveryAddressesReplace"};function Pa(e){let t={};for(let s of e.entries()){let i=s[0],c=e.getAll(i);t[i]=c.length>1?c:s[1],t[i]==="on"?t[i]=true:t[i]==="off"&&(t[i]=false);}let{cartFormInput:r,...o}=t,{action:n,inputs:a}=r?JSON.parse(String(r)):{};return {action:n,inputs:{...a,...o}}}re.getFormInput=Pa;var Gt=e=>{let t=cookie.parse(Ut(e,"Cookie")||"");return ()=>t.cart?`gid://shopify/Cart/${t.cart}`:void 0};var Bt=e=>t=>{let r=new Headers;return r.append("Set-Cookie",cookie.stringify("cart",t.split("/").pop()||"",{path:"/",...e})),r};function pt(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`weak-${Math.random().toString(16).substring(2)}`}var Fe="2026.4.5";function Se(e){return e.replace(/\s*#.*$/gm,"").replace(/\s+/gm," ").trim()}var wa=/(^|}\s)query[\s({]/im,xa=/(^|}\s)mutation[\s({]/im;function lt(e,t){if(!wa.test(e))throw new Error(`[h2:error:${t}] Can only execute queries`)}function yt(e,t){if(!xa.test(e))throw new Error(`[h2:error:${t}] Can only execute mutations`)}var ye=class extends Error{locations;path;extensions;constructor(t,r={}){let n=(r.clientOperation?`[h2:error:${r.clientOperation}] `:"")+t+(r.requestId?` - Request ID: ${r.requestId}`:"");super(n),this.name="GraphQLError",this.extensions=r.extensions,this.locations=r.locations,this.path=r.path,this.stack=r.stack||void 0;try{this.cause=JSON.stringify({...typeof r.cause=="object"?r.cause:{},requestId:r.requestId});}catch{r.cause&&(this.cause=r.cause);}}get[Symbol.toStringTag](){return this.name}toString(){let t=`${this.name}: ${this.message}`;if(this.path)try{t+=` | path: ${JSON.stringify(this.path)}`;}catch{}if(this.extensions)try{t+=` | extensions: ${JSON.stringify(this.extensions)}`;}catch{}return t+=`
24
- `,this.stack&&(t+=`${this.stack.slice(this.stack.indexOf(`
25
- `)+1)}
26
- `),t}toJSON(){return {name:"Error",message:""}}};function He({url:e,response:t,errors:r,type:o,query:n,queryVariables:a,ErrorConstructor:s=Error,client:i="storefront"}){let c=(typeof r=="string"?r:r?.map?.(d=>d.message).join(`
27
- `))||`URL: ${e}
28
- API response error: ${t.status}`,u=new ye(c,{query:n,queryVariables:a,cause:{errors:r},clientOperation:`${i}.${o}`,requestId:t.headers.get("x-request-id")});throw new s(u.message,{cause:u.cause})}var Ua={language:"EN",country:"US"};function Io(e){let {storefrontHeaders:t,cache:r,waitUntil:o,i18n:n,storefrontId:a,logErrors:s=true,...i}=e,{getPublicTokenHeaders:u,getPrivateTokenHeaders:d,getStorefrontApiUrl:y,getShopifyDomain:m}=hydrogenReact.createStorefrontClient(i),p=(i.privateStorefrontToken?d:u)({contentType:"json",buyerIp:t?.buyerIp||""});t?.buyerIp&&(p[Je]=t.buyerIp),t?.buyerIpSig&&(p[he]=t.buyerIpSig),p[be]=t?.requestGroupId||pt(),a&&(p[hydrogenReact.SHOPIFY_STOREFRONT_ID_HEADER]=a),(p["user-agent"]=`Hydrogen ${Fe}`);let l=t?.cookie??"";l&&(p.cookie=l);let S,f;if(!/\b_shopify_(analytics|marketing)=/.test(l)){let g=l.match(/\b_shopify_y=([^;]+)/)?.[1],v=l.match(/\b_shopify_s=([^;]+)/)?.[1];g&&(p[hydrogenReact.SHOPIFY_STOREFRONT_Y_HEADER]=g),v&&(p[hydrogenReact.SHOPIFY_STOREFRONT_S_HEADER]=v),S=g??pt(),f=v??pt(),p[hydrogenReact.SHOPIFY_UNIQUE_TOKEN_HEADER]=S,p[hydrogenReact.SHOPIFY_VISIT_TOKEN_HEADER]=f;}let P,h=JSON.stringify({"content-type":p["content-type"],"user-agent":p["user-agent"],[Pt]:p[Pt],[vt]:p[vt],[It]:p[It],[we]:p[we]});async function T({query:g,mutation:v,variables:R,cache:U,headers:M=[],storefrontApiVersion:j,displayName:St,stackInfo:Rt}){let Ke=M instanceof Headers?Object.fromEntries(M.entries()):Array.isArray(M)?Object.fromEntries(M):M,K=g??v,A={...R};n&&(!R?.country&&/\$country/.test(K)&&(A.country=n.country),!R?.language&&/\$language/.test(K)&&(A.language=n.language));let E=y({storefrontApiVersion:j}),L=JSON.stringify({query:K,variables:A}),V={method:"POST",headers:{...p,...Ke},body:L},N=[E,V.method,h,V.body],Z=K.includes("@defer")?{query:K,variables:A}:void 0,[$,q]=await dt(E,V,{cacheInstance:v?void 0:r,cache:U||Te(),cacheKey:N,waitUntil:o,shouldCacheResponse:G=>!G?.errors,debugInfo:{requestId:V.headers[be],displayName:St,url:E,stackInfo:Rt,graphql:L,purpose:t?.purpose},streamConfig:Z,onRawHeaders:G=>{P??={setCookie:G.getSetCookie(),serverTiming:G.get("server-timing")??""};}}),ae={url:E,response:q,type:v?"mutation":"query",query:K,queryVariables:A,errors:void 0};if(!q.ok){let G,Y=$;try{Y??=await q.text(),G=te(Y);}catch{G=[{message:Y??"Could not parse Storefront API response"}];}He({...ae,errors:G});}let{data:W,errors:k}=$;k=k?Array.isArray(k)?k:[k]:void 0;let me=k?.map(({message:G,...Y})=>new ye(G,{...Y,clientOperation:`storefront.${ae.type}`,requestId:q.headers.get("x-request-id"),queryVariables:A,query:K}));return I(W,me)}return {storefront:{query(g,v){g=Se(g),lt(g,"storefront.query");let R=vo?.(g);return Ae(T({...v,query:g,stackInfo:X?.(R)}),{stackOffset:R,logErrors:s})},mutate(g,v){g=Se(g),yt(g,"storefront.mutate");let R=vo?.(g);return Ae(T({...v,mutation:g,stackInfo:X?.(R)}),{stackOffset:R,logErrors:s})},cache:r,CacheNone:Vt,CacheLong:Mt,CacheShort:le,CacheCustom:Ft,generateCacheControlHeader:Ne,getPublicTokenHeaders:u,getPrivateTokenHeaders:d,getHeaders:()=>({...p}),getShopifyDomain:m,getApiUrl:y,i18n:n??Ua,isStorefrontApiUrl(g){return Lt.test(at(g.url??""))},async forward(g,v){let R=new Headers([...Ve(j=>g.headers.get(j),["accept","accept-encoding","accept-language","access-control-request-headers","access-control-request-method","content-type","content-length","cookie","origin","referer","user-agent",we,hydrogenReact.SHOPIFY_UNIQUE_TOKEN_HEADER,hydrogenReact.SHOPIFY_VISIT_TOKEN_HEADER]),...Ve(j=>p[j],[Je,he,hydrogenReact.SHOPIFY_STOREFRONT_ID_HEADER,be])]);t?.buyerIp&&R.set("x-forwarded-for",t.buyerIp);let U=v?.storefrontApiVersion??at(g.url).match(Lt)?.[1],M=await fetch(y({storefrontApiVersion:U}),{method:g.method,body:g.body,headers:R});return new Response(M.body,M)},isMcpUrl(g){return yo.test(at(g.url??""))},async forwardMcp(g){let v=new Headers([...Ve(U=>g.headers.get(U),["accept","accept-encoding","accept-language","content-type","cookie","origin","referer","user-agent"]),...Ve(U=>p[U],[Je,he,we,be,hydrogenReact.SHOPIFY_STOREFRONT_ID_HEADER])]);t?.buyerIp&&v.set("x-forwarded-for",t.buyerIp);let R=`${m()}/api/mcp`;try{let U=await fetch(R,{method:g.method,body:g.body,headers:v});return new Response(U.body,U)}catch(U){let j=U instanceof Error?U.message:"Internal proxy error";return new Response(JSON.stringify({jsonrpc:"2.0",error:{code:-32603,message:j},id:null}),{status:502,headers:{"content-type":"application/json"}})}},setCollectedSubrequestHeaders:g=>{if(P)for(let M of P.setCookie)g.headers.append("Set-Cookie",M);let v=Fr(P?.serverTiming),R=g.headers.get("content-type")?.startsWith("text/html");xe(g,{...R?{_y:S,_s:f}:void 0,...v}),R&&P&&P.setCookie.length>1&&v?._y&&v?._s&&v?._cmp&&xe(g,{[Xe]:"1"});}}}}var vo=void 0;function I(e,t){return {...e,...t&&{errors:t}}}function b(e){return e?.visitorConsent!==void 0}function w(e=false){let t=`$country: CountryCode = ZZ
29
- $language: LanguageCode`;return e?`${t}
30
- $visitorConsent: VisitorConsent`:t}function x(e=false){return e?"@inContext(country: $country, language: $language, visitorConsent: $visitorConsent)":"@inContext(country: $country, language: $language)"}function Wt({storefront:e,customerAccount:t,getCartId:r,cartFragment:o}){return async n=>{let a=n?.cartId??r();if(!a)return null;let s=b(n),[i,{cart:c,errors:u}]=await Promise.all([t?t.isLoggedIn():false,e.query(La(o,{includeVisitorConsent:s}),{variables:{cartId:a,...n},cache:e.CacheNone()})]);if(i&&c&&typeof c=="object"&&"checkoutUrl"in c&&typeof c.checkoutUrl=="string"){let d=new URL(c.checkoutUrl);d.searchParams.set("logged_in","true"),Object.assign(c,{checkoutUrl:d.toString()});}return c||u?I(c,u):null}}var La=(e=ka,t={})=>`#graphql
31
- query CartQuery(
32
- $cartId: ID!
33
- $numCartLines: Int = 100
34
- ${w(t.includeVisitorConsent)}
35
- ) ${x(t.includeVisitorConsent)} {
36
- cart(id: $cartId) {
37
- ...CartApiQuery
38
- }
39
- }
40
-
41
- ${e}
42
- `,ka=`#graphql
43
- fragment CartApiQuery on Cart {
44
- updatedAt
45
- id
46
- checkoutUrl
47
- totalQuantity
48
- buyerIdentity {
49
- countryCode
50
- customer {
51
- id
52
- email
53
- firstName
54
- lastName
55
- displayName
56
- }
57
- email
58
- phone
59
- }
60
- lines(first: $numCartLines) {
61
- edges {
62
- node {
63
- id
64
- quantity
65
- attributes {
66
- key
67
- value
68
- }
69
- cost {
70
- totalAmount {
71
- amount
72
- currencyCode
73
- }
74
- amountPerQuantity {
75
- amount
76
- currencyCode
77
- }
78
- compareAtAmountPerQuantity {
79
- amount
80
- currencyCode
81
- }
82
- }
83
- merchandise {
84
- ... on ProductVariant {
85
- id
86
- availableForSale
87
- compareAtPrice {
88
- ...CartApiMoney
89
- }
90
- price {
91
- ...CartApiMoney
92
- }
93
- requiresShipping
94
- title
95
- image {
96
- ...CartApiImage
97
- }
98
- product {
99
- handle
100
- title
101
- id
102
- vendor
103
- }
104
- selectedOptions {
105
- name
106
- value
107
- }
108
- }
109
- }
110
- }
111
- }
112
- }
113
- cost {
114
- subtotalAmount {
115
- ...CartApiMoney
116
- }
117
- totalAmount {
118
- ...CartApiMoney
119
- }
120
- totalDutyAmount {
121
- ...CartApiMoney
122
- }
123
- totalTaxAmount {
124
- ...CartApiMoney
125
- }
126
- }
127
- note
128
- attributes {
129
- key
130
- value
131
- }
132
- discountCodes {
133
- applicable
134
- code
135
- }
136
- appliedGiftCards {
137
- id
138
- lastCharacters
139
- amountUsed {
140
- ...CartApiMoney
141
- }
142
- }
143
- }
144
-
145
- fragment CartApiMoney on MoneyV2 {
146
- currencyCode
147
- amount
148
- }
149
-
150
- fragment CartApiImage on Image {
151
- id
152
- url
153
- altText
154
- width
155
- height
156
- }
157
- `;var D=`#graphql
158
- fragment CartApiError on CartUserError {
159
- message
160
- field
161
- code
162
- }
163
- `,O=`#graphql
164
- fragment CartApiMutation on Cart {
165
- id
166
- totalQuantity
167
- checkoutUrl
168
- }
169
- `,_=`#graphql
170
- fragment CartApiWarning on CartWarning {
171
- code
172
- message
173
- target
174
- }
175
- `;function jt(e){return async(t,r)=>{let o=e.customerAccount?await e.customerAccount.getBuyer():void 0,{cartId:n,...a}=r||{},{buyerIdentity:s,...i}=t,c=b(r),{cartCreate:u,errors:d}=await e.storefront.mutate(Va(e.cartFragment,{includeVisitorConsent:c}),{variables:{input:{...i,buyerIdentity:{...o,...s}},...a}});return I(u,d)}}var Va=(e=O,t={})=>`#graphql
176
- mutation cartCreate(
177
- $input: CartInput!
178
- ${w(t.includeVisitorConsent)}
179
- ) ${x(t.includeVisitorConsent)} {
180
- cartCreate(input: $input) {
181
- cart {
182
- ...CartApiMutation
183
- checkoutUrl
184
- }
185
- userErrors {
186
- ...CartApiError
187
- }
188
- warnings {
189
- ...CartApiWarning
190
- }
191
- }
192
- }
193
- ${e}
194
- ${D}
195
- ${_}
196
- `;function Kt(e){return async(t,r)=>{let o=b(r),{cartLinesAdd:n,errors:a}=await e.storefront.mutate(Na(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:e.getCartId(),lines:t,...r}});return I(n,a)}}var Na=(e=O,t={})=>`#graphql
197
- mutation cartLinesAdd(
198
- $cartId: ID!
199
- $lines: [CartLineInput!]!
200
- ${w(t.includeVisitorConsent)}
201
- ) ${x(t.includeVisitorConsent)} {
202
- cartLinesAdd(cartId: $cartId, lines: $lines) {
203
- cart {
204
- ...CartApiMutation
205
- }
206
- userErrors {
207
- ...CartApiError
208
- }
209
- warnings {
210
- ...CartApiWarning
211
- }
212
- }
213
- }
214
- ${e}
215
- ${D}
216
- ${_}
217
- `;var Eo="__h_pending_";function bo(e){return Eo+e}function ft(e){return e.startsWith(Eo)}function mt(e,t){if(t.some(r=>ft(typeof r=="string"?r:r.id)))throw new Error(`Tried to perform an action on an optimistic line. Make sure to disable your "${e}" CartForm action when the line is optimistic.`)}function Yt(e){return async(t,r)=>{mt("updateLines",t);let o=b(r),{cartLinesUpdate:n,errors:a}=await e.storefront.mutate(Ma(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:e.getCartId(),lines:t,...r}});return I(n,a)}}var Ma=(e=O,t={})=>`#graphql
218
- mutation cartLinesUpdate(
219
- $cartId: ID!
220
- $lines: [CartLineUpdateInput!]!
221
- ${w(t.includeVisitorConsent)}
222
- ) ${x(t.includeVisitorConsent)} {
223
- cartLinesUpdate(cartId: $cartId, lines: $lines) {
224
- cart {
225
- ...CartApiMutation
226
- }
227
- userErrors {
228
- ...CartApiError
229
- }
230
- warnings {
231
- ...CartApiWarning
232
- }
233
- }
234
- }
235
- ${e}
236
- ${D}
237
- ${_}
238
- `;function Jt(e){return async(t,r)=>{mt("removeLines",t);let o=b(r),{cartLinesRemove:n,errors:a}=await e.storefront.mutate(Fa(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:e.getCartId(),lineIds:t,...r}});return I(n,a)}}var Fa=(e=O,t={})=>`#graphql
239
- mutation cartLinesRemove(
240
- $cartId: ID!
241
- $lineIds: [ID!]!
242
- ${w(t.includeVisitorConsent)}
243
- ) ${x(t.includeVisitorConsent)} {
244
- cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {
245
- cart {
246
- ...CartApiMutation
247
- }
248
- userErrors {
249
- ...CartApiError
250
- }
251
- warnings {
252
- ...CartApiWarning
253
- }
254
- }
255
- }
256
- ${e}
257
- ${D}
258
- ${_}
259
- `;function zt(e){return async(t,r)=>{let o=t.filter((i,c,u)=>u.indexOf(i)===c),n=b(r),{cartDiscountCodesUpdate:a,errors:s}=await e.storefront.mutate(Ha(e.cartFragment,{includeVisitorConsent:n}),{variables:{cartId:e.getCartId(),discountCodes:o,...r}});return I(a,s)}}var Ha=(e=O,t={})=>`#graphql
260
- mutation cartDiscountCodesUpdate(
261
- $cartId: ID!
262
- $discountCodes: [String!]!
263
- ${w(t.includeVisitorConsent)}
264
- ) ${x(t.includeVisitorConsent)} {
265
- cartDiscountCodesUpdate(cartId: $cartId, discountCodes: $discountCodes) {
266
- ... @defer {
267
- cart {
268
- ...CartApiMutation
269
- }
270
- }
271
- userErrors {
272
- ...CartApiError
273
- }
274
- warnings {
275
- ...CartApiWarning
276
- }
277
- }
278
- }
279
- ${e}
280
- ${D}
281
- ${_}
282
- `;function Xt(e){return async(t,r)=>{t.companyLocationId&&e.customerAccount&&e.customerAccount.setBuyer({companyLocationId:t.companyLocationId});let o=e.customerAccount?await e.customerAccount.getBuyer():void 0,n=b(r),{cartBuyerIdentityUpdate:a,errors:s}=await e.storefront.mutate($a(e.cartFragment,{includeVisitorConsent:n}),{variables:{cartId:e.getCartId(),buyerIdentity:{...o,...t},...r}});return I(a,s)}}var $a=(e=O,t={})=>`#graphql
283
- mutation cartBuyerIdentityUpdate(
284
- $cartId: ID!
285
- $buyerIdentity: CartBuyerIdentityInput!
286
- ${w(t.includeVisitorConsent)}
287
- ) ${x(t.includeVisitorConsent)} {
288
- cartBuyerIdentityUpdate(cartId: $cartId, buyerIdentity: $buyerIdentity) {
289
- cart {
290
- ...CartApiMutation
291
- }
292
- userErrors {
293
- ...CartApiError
294
- }
295
- warnings {
296
- ...CartApiWarning
297
- }
298
- }
299
- }
300
- ${e}
301
- ${D}
302
- ${_}
303
- `;function Zt(e){return async(t,r)=>{let o=b(r),{cartNoteUpdate:n,errors:a}=await e.storefront.mutate(qa(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:e.getCartId(),note:t,...r}});return I(n,a)}}var qa=(e=O,t={})=>`#graphql
304
- mutation cartNoteUpdate(
305
- $cartId: ID!
306
- $note: String!
307
- ${w(t.includeVisitorConsent)}
308
- ) ${x(t.includeVisitorConsent)} {
309
- cartNoteUpdate(cartId: $cartId, note: $note) {
310
- cart {
311
- ...CartApiMutation
312
- }
313
- userErrors {
314
- ...CartApiError
315
- }
316
- warnings {
317
- ...CartApiWarning
318
- }
319
- }
320
- }
321
- ${e}
322
- ${D}
323
- ${_}
324
- `;function er(e){return async(t,r)=>{let o=b(r),{cartSelectedDeliveryOptionsUpdate:n,errors:a}=await e.storefront.mutate(Ga(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:e.getCartId(),selectedDeliveryOptions:t,...r}});return I(n,a)}}var Ga=(e=O,t={})=>`#graphql
325
- mutation cartSelectedDeliveryOptionsUpdate(
326
- $cartId: ID!
327
- $selectedDeliveryOptions: [CartSelectedDeliveryOptionInput!]!
328
- ${w(t.includeVisitorConsent)}
329
- ) ${x(t.includeVisitorConsent)} {
330
- cartSelectedDeliveryOptionsUpdate(cartId: $cartId, selectedDeliveryOptions: $selectedDeliveryOptions) {
331
- cart {
332
- ...CartApiMutation
333
- }
334
- userErrors {
335
- ...CartApiError
336
- }
337
- warnings {
338
- ...CartApiWarning
339
- }
340
- }
341
- }
342
- ${e}
343
- ${D}
344
- ${_}
345
- `;function tr(e){return async(t,r)=>{let o=b(r),{cartAttributesUpdate:n,errors:a}=await e.storefront.mutate(Ba(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:r?.cartId||e.getCartId(),attributes:t,...r}});return I(n,a)}}var Ba=(e=O,t={})=>`#graphql
346
- mutation cartAttributesUpdate(
347
- $cartId: ID!
348
- $attributes: [AttributeInput!]!
349
- ${w(t.includeVisitorConsent)}
350
- ) ${x(t.includeVisitorConsent)} {
351
- cartAttributesUpdate(cartId: $cartId, attributes: $attributes) {
352
- cart {
353
- ...CartApiMutation
354
- }
355
- userErrors {
356
- ...CartApiError
357
- }
358
- warnings {
359
- ...CartApiWarning
360
- }
361
- }
362
- }
363
- ${e}
364
- ${D}
365
- ${_}
366
- `;function rr(e){return async(t,r)=>{let o=r?.cartId||e.getCartId(),n=t.map(c=>({...c,ownerId:o})),a=b(r),{cartMetafieldsSet:s,errors:i}=await e.storefront.mutate(Qa({includeVisitorConsent:a}),{variables:{metafields:n,...r}});return I({cart:{id:o},...s},i)}}var Qa=(e={})=>`#graphql
367
- mutation cartMetafieldsSet(
368
- $metafields: [CartMetafieldsSetInput!]!
369
- ${w(e.includeVisitorConsent)}
370
- ) ${x(e.includeVisitorConsent)} {
371
- cartMetafieldsSet(metafields: $metafields) {
372
- userErrors {
373
- code
374
- elementIndex
375
- field
376
- message
377
- }
378
- }
379
- }
380
- `;function or(e){return async(t,r)=>{let o=r?.cartId||e.getCartId(),n=b(r),{cartMetafieldDelete:a,errors:s}=await e.storefront.mutate(Wa({includeVisitorConsent:n}),{variables:{input:{ownerId:o,key:t},...r}});return I({cart:{id:o},...a},s)}}var Wa=(e={})=>`#graphql
381
- mutation cartMetafieldDelete(
382
- $input: CartMetafieldDeleteInput!
383
- ${w(e.includeVisitorConsent)}
384
- ) ${x(e.includeVisitorConsent)} {
385
- cartMetafieldDelete(input: $input) {
386
- userErrors {
387
- code
388
- field
389
- message
390
- }
391
- }
392
- }
393
- `;function nr(e){return async(t,r)=>{let o=b(r),{cartGiftCardCodesUpdate:n,errors:a}=await e.storefront.mutate(ja(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:e.getCartId(),giftCardCodes:t,...r}});return I(n,a)}}var ja=(e=O,t={})=>`#graphql
394
- mutation cartGiftCardCodesUpdate(
395
- $cartId: ID!
396
- $giftCardCodes: [String!]!
397
- ${w(t.includeVisitorConsent)}
398
- ) ${x(t.includeVisitorConsent)} {
399
- cartGiftCardCodesUpdate(cartId: $cartId, giftCardCodes: $giftCardCodes) {
400
- cart {
401
- ...CartApiMutation
402
- }
403
- userErrors {
404
- ...CartApiError
405
- }
406
- warnings {
407
- ...CartApiWarning
408
- }
409
- }
410
- }
411
- ${e}
412
- ${D}
413
- ${_}
414
- `;function ar(e){return async(t,r)=>{let{cartGiftCardCodesAdd:o,errors:n}=await e.storefront.mutate(Ka(e.cartFragment),{variables:{cartId:e.getCartId(),giftCardCodes:t,...r}});return I(o,n)}}var Ka=(e=O)=>`#graphql
415
- mutation cartGiftCardCodesAdd(
416
- $cartId: ID!
417
- $giftCardCodes: [String!]!
418
- $language: LanguageCode
419
- $country: CountryCode
420
- ) @inContext(country: $country, language: $language) {
421
- cartGiftCardCodesAdd(cartId: $cartId, giftCardCodes: $giftCardCodes) {
422
- cart {
423
- ...CartApiMutation
424
- }
425
- userErrors {
426
- ...CartApiError
427
- }
428
- warnings {
429
- ...CartApiWarning
430
- }
431
- }
432
- }
433
- ${e}
434
- ${D}
435
- ${_}
436
- `;function sr(e){return async(t,r)=>{let o=b(r),{cartGiftCardCodesRemove:n,errors:a}=await e.storefront.mutate(Ya(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:e.getCartId(),appliedGiftCardIds:t,...r}});return I(n,a)}}var Ya=(e=O,t={})=>`#graphql
437
- mutation cartGiftCardCodesRemove(
438
- $cartId: ID!
439
- $appliedGiftCardIds: [ID!]!
440
- ${w(t.includeVisitorConsent)}
441
- ) ${x(t.includeVisitorConsent)} {
442
- cartGiftCardCodesRemove(cartId: $cartId, appliedGiftCardIds: $appliedGiftCardIds) {
443
- cart {
444
- ...CartApiMutation
445
- }
446
- userErrors {
447
- ...CartApiError
448
- }
449
- warnings {
450
- ...CartApiWarning
451
- }
452
- }
453
- }
454
- ${e}
455
- ${D}
456
- ${_}
457
- `;function wo(e){return async(t,r)=>{let o=b(r),{cartDeliveryAddressesAdd:n,errors:a}=await e.storefront.mutate(Ja(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:e.getCartId(),addresses:t,...r}});return I(n,a)}}var Ja=(e=O,t={})=>`#graphql
458
- mutation cartDeliveryAddressesAdd(
459
- $cartId: ID!
460
- $addresses: [CartSelectableAddressInput!]!,
461
- ${w(t.includeVisitorConsent)}
462
- ) ${x(t.includeVisitorConsent)} {
463
- cartDeliveryAddressesAdd(addresses: $addresses, cartId: $cartId) {
464
- cart {
465
- ...CartApiMutation
466
- }
467
- userErrors {
468
- ...CartApiError
469
- }
470
- warnings {
471
- ...CartApiWarning
472
- }
473
- }
474
- }
475
- ${e}
476
- ${D}
477
- ${_}
478
- `;function xo(e){return async(t,r)=>{let o=b(r),{cartDeliveryAddressesRemove:n,errors:a}=await e.storefront.mutate(za(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:e.getCartId(),addressIds:t,...r}});return I(n,a)}}var za=(e=O,t={})=>`#graphql
479
- mutation cartDeliveryAddressesRemove(
480
- $cartId: ID!
481
- $addressIds: [ID!]!,
482
- ${w(t.includeVisitorConsent)}
483
- ) ${x(t.includeVisitorConsent)} {
484
- cartDeliveryAddressesRemove(addressIds: $addressIds, cartId: $cartId) {
485
- cart {
486
- ...CartApiMutation
487
- }
488
- userErrors {
489
- ...CartApiError
490
- }
491
- warnings {
492
- ...CartApiWarning
493
- }
494
- }
495
- }
496
- ${e}
497
- ${D}
498
- ${_}
499
- `;function Do(e){return async(t,r)=>{let o=b(r),{cartDeliveryAddressesUpdate:n,errors:a}=await e.storefront.mutate(Xa(e.cartFragment,{includeVisitorConsent:o}),{variables:{cartId:e.getCartId(),addresses:t,...r}});return I(n,a)}}var Xa=(e=O,t={})=>`#graphql
500
- mutation cartDeliveryAddressesUpdate(
501
- $cartId: ID!
502
- $addresses: [CartSelectableAddressUpdateInput!]!,
503
- ${w(t.includeVisitorConsent)}
504
- ) ${x(t.includeVisitorConsent)} {
505
- cartDeliveryAddressesUpdate(addresses: $addresses, cartId: $cartId) {
506
- cart {
507
- ...CartApiMutation
508
- }
509
- userErrors {
510
- ...CartApiError
511
- }
512
- warnings {
513
- ...CartApiWarning
514
- }
515
- }
516
- }
517
- ${e}
518
- ${D}
519
- ${_}
520
- `;function Oo(e){return async(t,r)=>{let{cartDeliveryAddressesReplace:o,errors:n}=await e.storefront.mutate(Za(e.cartFragment),{variables:{cartId:e.getCartId(),addresses:t,...r}});return I(o,n)}}var Za=(e=O)=>`#graphql
521
- mutation cartDeliveryAddressesReplace(
522
- $cartId: ID!
523
- $addresses: [CartSelectableAddressInput!]!,
524
- $country: CountryCode = ZZ
525
- $language: LanguageCode
526
- ) @inContext(country: $country, language: $language) {
527
- cartDeliveryAddressesReplace(addresses: $addresses, cartId: $cartId) {
528
- cart {
529
- ...CartApiMutation
530
- }
531
- userErrors {
532
- ...CartApiError
533
- }
534
- warnings {
535
- ...CartApiWarning
536
- }
537
- }
538
- }
539
- ${e}
540
- ${D}
541
- ${_}
542
- `;function ir(e){let{getCartId:t,setCartId:r,storefront:o,customerAccount:n,cartQueryFragment:a,cartMutateFragment:s,buyerIdentity:i}=e,c=t(),u=()=>c||t(),d={storefront:o,getCartId:u,cartFragment:s,customerAccount:n},y=jt(d),m=async function(...p){p[0].buyerIdentity={...i,...p[0].buyerIdentity};let l=await y(...p);if(l?.cart&&(typeof l.cart!="object"||!("id"in l.cart)||typeof l.cart.id!="string"))throw new Error("[h2:error:createCartHandler] Cart created but response is missing a valid `id` field. Ensure your cart query fragment includes the `id` field.");return c=l?.cart&&typeof l.cart=="object"&&"id"in l.cart&&typeof l.cart.id=="string"?l.cart.id:void 0,l},C={get:Wt({storefront:o,customerAccount:n,getCartId:u,cartFragment:a}),getCartId:u,setCartId:r,create:m,addLines:async(p,l)=>{let S=p.map(f=>({attributes:f.attributes,quantity:f.quantity,merchandiseId:f.merchandiseId,sellingPlanId:f.sellingPlanId,parent:f.parent}));return c||l?.cartId?await Kt(d)(S,l):await m({lines:S,buyerIdentity:i},l)},updateLines:Yt(d),removeLines:Jt(d),updateDiscountCodes:async(p,l)=>c||l?.cartId?await zt(d)(p,l):await m({discountCodes:p},l),updateGiftCardCodes:async(p,l)=>c||l?.cartId?await nr(d)(p,l):await m({giftCardCodes:p},l),addGiftCardCodes:ar(d),removeGiftCardCodes:sr(d),updateBuyerIdentity:async(p,l)=>c||l?.cartId?await Xt(d)(p,l):await m({buyerIdentity:p},l),updateNote:async(p,l)=>c||l?.cartId?await Zt(d)(p,l):await m({note:p},l),updateSelectedDeliveryOption:er(d),updateAttributes:async(p,l)=>c||l?.cartId?await tr(d)(p,l):await m({attributes:p},l),setMetafields:async(p,l)=>c||l?.cartId?await rr(d)(p,l):await m({metafields:p},l),deleteMetafield:or(d),addDeliveryAddresses:wo(d),removeDeliveryAddresses:xo(d),updateDeliveryAddresses:Do(d),replaceDeliveryAddresses:Oo(d)};return "customMethods"in e?{...C,...e.customMethods??{}}:C}function ts(e){let t=reactRouter.useFetchers();if(!t||!t.length)return e;let r=e?.lines?structuredClone(e):{lines:{nodes:[]}},o=r.lines.nodes,n=false;for(let{formData:a}of t){if(!a)continue;let s=re.getFormInput(a);if(s.action===re.ACTIONS.LinesAdd)for(let i of s.inputs.lines){if(!i.selectedVariant){console.error("[h2:error:useOptimisticCart] No selected variant was passed in the cart action. Make sure to pass the selected variant if you want to use an optimistic cart");continue}let c=o.find(u=>u.merchandise.id===i.selectedVariant?.id);n=true,c?(c.quantity=(c.quantity||1)+(i.quantity||1),c.isOptimistic=true):o.unshift({id:bo(i.selectedVariant.id),merchandise:i.selectedVariant,isOptimistic:true,quantity:i.quantity||1});}else if(s.action===re.ACTIONS.LinesRemove)for(let i of s.inputs.lineIds){let c=o.findIndex(u=>u.id===i);if(c!==-1){if(ft(o[c].id)){console.error("[h2:error:useOptimisticCart] Tried to remove an optimistic line that has not been added to the cart yet");continue}o.splice(c,1),n=true;}else console.warn(`[h2:warn:useOptimisticCart] Tried to remove line '${i}' but it doesn't exist in the cart`);}else if(s.action===re.ACTIONS.LinesUpdate)for(let i of s.inputs.lines){let c=o.findIndex(u=>i.id===u.id);if(c>-1){if(ft(o[c].id)){console.error("[h2:error:useOptimisticCart] Tried to update an optimistic line that has not been added to the cart yet");continue}o[c].quantity=i.quantity,o[c].quantity===0&&o.splice(c,1),n=true;}else console.warn(`[h2:warn:useOptimisticCart] Tried to update line '${i.id}' but it doesn't exist in the cart`);}}return n&&(r.isOptimistic=n),r.totalQuantity=o.reduce((a,s)=>a+s.quantity,0),r}var rs="https://raw.githubusercontent.com/Shopify/hydrogen/main/docs/changelog.json";async function os({request:e,changelogUrl:t}){new URL(e.url).searchParams;return fetch(t||rs)}var $e=reactRouter.createContext(),cr=reactRouter.createContext(),ur=reactRouter.createContext(),dr=reactRouter.createContext(),pr=reactRouter.createContext(),lr=reactRouter.createContext(),ns={storefront:$e,cart:cr,customerAccount:ur,env:dr,session:pr,waitUntil:lr};var Ct="2026-04",Pe=`Shopify Hydrogen ${Fe}`,_o="30243aa5-17c1-465a-8493-944bcc4e88aa",F="customerAccount",ve="buyer";var Q=class extends Response{constructor(t,r,o){super(`Bad request: ${t}`,{status:400,headers:o});}};function Ee(e,t={}){let r=t.headers?new Headers(t.headers):new Headers({});return r.set("location",e),new Response(null,{status:t.status||302,headers:r})}async function as({session:e,customerAccountId:t,customerAccountTokenExchangeUrl:r,httpsOrigin:o,debugInfo:n}){let a=new URLSearchParams,s=e.get(F),i=s?.refreshToken,c=s?.idToken;if(!i)throw Ie(e),new Q("Unauthorized","No refreshToken found in the session. Make sure your session is configured correctly and passed to `createCustomerAccountClient`.");a.append("grant_type","refresh_token"),a.append("refresh_token",i),a.append("client_id",t);let u={"content-type":"application/x-www-form-urlencoded","User-Agent":Pe,Origin:o};new Date().getTime();let y=r,m=await fetch(y,{method:"POST",headers:u,body:a});if(!m.ok){let f=await m.text();throw ss(f)==="invalid_grant"&&Ie(e),new Response(f,{status:m.status,headers:{"Content-Type":"text/html; charset=utf-8"}})}let{access_token:C,expires_in:p,refresh_token:l,error:S}=await m.json();if(!C||C.length===0)throw S==="invalid_grant"&&Ie(e),new Q("Unauthorized","Invalid access token received.");e.set(F,{accessToken:C,expiresAt:new Date(new Date().getTime()+(p-120)*1e3).getTime()+"",refreshToken:l,idToken:c});}function Ie(e){e.unset(F),e.unset(ve);}async function Uo({locks:e,expiresAt:t,session:r,customerAccountId:o,customerAccountTokenExchangeUrl:n,httpsOrigin:a,debugInfo:s}){if(parseInt(t,10)-1e3<new Date().getTime())try{e.refresh||(e.refresh=as({session:r,customerAccountId:o,customerAccountTokenExchangeUrl:n,httpsOrigin:a,debugInfo:s})),await e.refresh,delete e.refresh;}catch(i){throw i&&i.status!==401?i:new Q("Unauthorized","Login before querying the Customer Account API.")}}function ss(e){try{let t=JSON.parse(e);return typeof t?.error=="string"?t.error:void 0}catch{return}}function Lo(){let e=Vo();return yr(e)}async function ko(e){let t=await crypto.subtle.digest({name:"SHA-256"},new TextEncoder().encode(e)),r=is(t);return yr(r)}function Vo(){let e=new Uint8Array(32);return crypto.getRandomValues(e),String.fromCharCode.apply(null,Array.from(e))}function yr(e){return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function is(e){let t=new Uint8Array(e),r=Array.from(t);return String.fromCharCode(...r)}function No(){return yr(Vo())}async function Mo(e,t,r,o,n){let a=t;if(!e)throw new Q("Unauthorized","oAuth access token was not provided during token exchange.");let s=new URLSearchParams;s.append("grant_type","urn:ietf:params:oauth:grant-type:token-exchange"),s.append("client_id",a),s.append("audience",_o),s.append("subject_token",e),s.append("subject_token_type","urn:ietf:params:oauth:token-type:access_token"),s.append("scopes","https://api.customers.com/auth/customer.graphql");let i={"content-type":"application/x-www-form-urlencoded","User-Agent":Pe,Origin:o};new Date().getTime();let u=r,d=await fetch(u,{method:"POST",headers:i,body:s});let y=await d.json();if(y.error)throw new Q(y.error_description);return y.access_token}function Fo(e){return cs(e).payload.nonce}function cs(e){let[t,r,o]=e.split("."),n=JSON.parse(atob(t)),a=JSON.parse(atob(r));return {header:n,payload:a,signature:o}}function gt(){return ds(us())}function us(){try{return crypto.getRandomValues(new Uint8Array(16))}catch{return new Uint8Array(16).map(()=>Math.random()*255|0)}}function ds(e){return Array.from(e,function(t){return ("0"+(t&255).toString(16)).slice(-2)}).join("")}function ht(e){if(!e)return;let{pathname:t,search:r}=new URL(e),o=t+r,n=new URLSearchParams(r),a=n.get("return_to")||n.get("redirect");if(a){if($o(e,a))return a;console.warn(`Cross-domain redirects are not supported. Tried to redirect from ${o} to ${a}`);}}function $o(e,t){try{return new URL(e).origin===new URL(t,e).origin}catch{return false}}function fr({requestUrl:e,defaultUrl:t,redirectUrl:r}){let o=e,n=Ho(e,t),a=r?Ho(e,r):n;return $o(e,a.toString())?a.toString():(console.warn(`Cross-domain redirects are not supported. Tried to redirect from ${o} to ${a}. Default url ${n} is used instead.`),n.toString())}function Ho(e,t){return ps(t)?new URL(t):new URL(t,new URL(e).origin)}function ps(e){try{return new URL(e),!0}catch{return false}}function qo(e,t){let r=`https://shopify.com/${t}`,o=`https://shopify.com/authentication/${t}`;return function(a){switch(a){case "CA_BASE_URL":return r;case "CA_BASE_AUTH_URL":return o;case "GRAPHQL":return `${r}/account/customer/api/${e}/graphql`;case "AUTH":return `${o}/oauth/authorize`;case "LOGIN_SCOPE":return t?"openid email customer-account-api:full":"openid email https://api.customers.com/auth/customer.graphql";case "TOKEN_EXCHANGE":return `${o}/oauth/token`;case "LOGOUT":return `${o}/logout`}}}var Go="oauth_recovery",Bo="oauth-recovery.";function ls(e,t){if(!e.url)return t;let{pathname:r}=new URL(e.url),o=r.replace(/\.data$/,"").replace(/\/_root$/,"/").replace(/(.+)\/$/,"$1"),n=t+`?${new URLSearchParams({return_to:o}).toString()}`;return Ee(n)}function Cr({session:e,customerAccountId:t,shopId:r,customerApiVersion:o=Ct,request:n,waitUntil:a,authUrl:s,customAuthStatusHandler:i,logErrors:c=true,loginPath:u="/account/login",authorizePath:d="/account/authorize",defaultRedirectPath:y="/account",language:m,useCustomAuthDomain:C}){if(o!==Ct&&console.warn(`[h2:warn:createCustomerAccountClient] You are using Customer Account API version ${o} when this version of Hydrogen was built for ${Ct}.`),e||console.warn("[h2:warn:createCustomerAccountClient] session is required to use Customer Account API. Ensure the session object passed in exist."),!n?.url)throw new Error("[h2:error:createCustomerAccountClient] The request object does not contain a URL.");let p=new URL(n.url),l=p.protocol==="http:"?p.origin.replace("http","https"):p.origin,S=fr({requestUrl:l,defaultUrl:d,redirectUrl:s}),f=A=>void 0,P=i||(()=>(f(p.hostname),ls(n,u))),h=qo(o,r),T=ys(h,t),g=h("GRAPHQL"),v={};async function R({query:A,type:E,variables:L={}}){let V=await j();if(!V)throw P();new Date().getTime();let $=await fetch(g,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":Pe,Origin:l,Authorization:V},body:JSON.stringify({query:A,variables:L})});let q=await $.text(),ae={url:g,response:$,type:E,query:A,queryVariables:L,errors:void 0,client:"customer"};if(!$.ok){if($.status===401)throw Ie(e),P();let W;try{W=te(q);}catch{W=[{message:q}];}He({...ae,errors:W});}try{let W=te(q),{errors:k}=W,me=k?.map(({message:G,...Y})=>new ye(G,{...Y,clientOperation:`customerAccount.${ae.type}`,requestId:$.headers.get("x-request-id"),queryVariables:L,query:A}));return {...W,...k&&{errors:me}}}catch{He({...ae,errors:[{message:q}]});}}async function U(){if(!r)return false;let A=e.get(F),E=A?.accessToken,L=A?.expiresAt;if(!E||!L)return false;let V=X?.();try{await Uo({locks:v,expiresAt:L,session:e,customerAccountId:t,customerAccountTokenExchangeUrl:h("TOKEN_EXCHANGE"),httpsOrigin:l,debugInfo:{waitUntil:a,stackInfo:V,...ce(n)}});}catch{return false}return true}async function M(){if(!await U())throw P()}async function j(){if(await U())return e.get(F)?.accessToken}async function St(A,E){return f(p.hostname),T(),A=Se(A),yt(A,"customer.mutate"),Ae(R({query:A,type:"mutation",...E}),{logErrors:c})}async function Rt(A,E){return f(p.hostname),T(),A=Se(A),lt(A,"customer.query"),Ae(R({query:A,type:"query",...E}),{logErrors:c})}function Ke(A){e.set(ve,{...e.get(ve),...A});}async function K(){let A=await j();if(A)return {...e.get(ve),customerAccessToken:A}}return {i18n:{language:m??"EN"},login:async A=>{f(p.hostname),T();let E=new URL(h("AUTH")),V=`${p.searchParams.get(Go)==="true"?Bo:""}${No()}`,N=gt();E.searchParams.set("client_id",t),E.searchParams.set("scope","openid email"),E.searchParams.append("response_type","code"),E.searchParams.append("redirect_uri",S),E.searchParams.set("scope",h("LOGIN_SCOPE")),E.searchParams.append("state",V),E.searchParams.append("nonce",N);let Z=fs({contextLanguage:m??null,localeOverride:A?.locale??null,uiLocalesOverride:A?.uiLocales??null});Z!=null&&E.searchParams.append("locale",Z),A?.countryCode&&E.searchParams.append("region_country",A.countryCode),A?.acrValues&&E.searchParams.append("acr_values",A.acrValues),A?.loginHint&&(E.searchParams.append("login_hint",A.loginHint),A?.loginHintMode&&E.searchParams.append("login_hint_mode",A.loginHintMode));let $=Lo(),q=await ko($);return e.set(F,{...e.get(F),codeVerifier:$,state:V,nonce:N,redirectPath:ht(n.url)||z(n,"Referer")||y}),E.searchParams.append("code_challenge",q),E.searchParams.append("code_challenge_method","S256"),Ee(E.toString())},logout:async A=>{f(p.hostname),T();let E=e.get(F)?.idToken,L=fr({requestUrl:l,defaultUrl:l,redirectUrl:A?.postLogoutRedirectUri}),V=E?new URL(`${h("LOGOUT")}?${new URLSearchParams([["id_token_hint",E],["post_logout_redirect_uri",L]]).toString()}`).toString():L;Ie(e);let N=A?.headers instanceof Headers?A?.headers:new Headers(A?.headers);return A?.keepSession||(e.destroy?N.set("Set-Cookie",await e.destroy()):console.warn("[h2:warn:customerAccount] session.destroy is not available on your session implementation. All session data might not be cleared on logout."),e.isPending=false),Ee(V,{headers:N})},isLoggedIn:U,handleAuthStatus:M,getAccessToken:j,getApiUrl:()=>g,mutate:St,query:Rt,authorize:async()=>{f(p.hostname),T();let A=p.searchParams.get("code"),E=p.searchParams.get("state");if(!A||!E)throw new Q("Unauthorized","No code or state parameter found in the redirect URL.");let L=e.get(F);if(L?.state!==E){if(E.startsWith(Bo))throw new Q("Unable to complete sign in. Please try again.","The session state does not match the state parameter. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.");J("[h2:warn:customerAccount] OAuth callback state mismatch. Restarting customer login once.");let Ye=new URL(u,n.url);return Ye.searchParams.set("return_to",L?.redirectPath??y),Ye.searchParams.set(Go,"true"),Ee(`${Ye.pathname}${Ye.search}`)}let V=t,N=new URLSearchParams;N.append("grant_type","authorization_code"),N.append("client_id",V),N.append("redirect_uri",S),N.append("code",A);let Z=e.get(F)?.codeVerifier;if(!Z)throw new Q("Unauthorized","No code verifier found in the session. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.");N.append("code_verifier",Z);let $={"content-type":"application/x-www-form-urlencoded","User-Agent":Pe,Origin:l};new Date().getTime();let W=h("TOKEN_EXCHANGE"),k=await fetch(W,{method:"POST",headers:$,body:N});if(!k.ok)throw new Response(await k.text(),{status:k.status,headers:{"Content-Type":"text/html; charset=utf-8"}});let{access_token:me,expires_in:G,id_token:Y,refresh_token:br}=await k.json(),wr=e.get(F)?.nonce,xr=await Fo(Y);if(wr!==xr)throw new Q("Unauthorized",`Returned nonce does not match: ${wr} !== ${xr}`);let Dr=me;r||(Dr=await Mo(me,t,h("TOKEN_EXCHANGE"),l,{...ce(n)}));let An=e.get(F)?.redirectPath;return e.set(F,{accessToken:Dr,expiresAt:new Date(new Date().getTime()+(G-120)*1e3).getTime()+"",refreshToken:br,idToken:Y}),Ee(An||y)},setBuyer:Ke,getBuyer:K,UNSTABLE_setBuyer:A=>{J("[h2:warn:customerAccount] `customerAccount.UNSTABLE_setBuyer` is deprecated. Please use `customerAccount.setBuyer`."),Ke(A);},UNSTABLE_getBuyer:()=>(J("[h2:warn:customerAccount] `customerAccount.UNSTABLE_getBuyer` is deprecated. Please use `customerAccount.getBuyer`."),K())}}function ys(e,t){return function(){try{if(!t)throw Error();new URL(e("CA_BASE_URL")),new URL(e("CA_BASE_AUTH_URL"));}catch{console.error(new Error("[h2:error:customerAccount] You do not have the valid credential to use Customer Account API.\nRun `h2 env pull` to link your store credentials."));let o="Internal Server Error";throw new Response(o,{status:500})}}}function fs(e){return e.localeOverride!=null?mr(e.localeOverride):e.uiLocalesOverride!=null?mr(e.uiLocalesOverride):e.contextLanguage!=null?mr(e.contextLanguage):null}function mr(e){let r=e.toLowerCase().replaceAll("_","-").split("-"),o=r[0],n=r[1];return n?`${o}-${n.toUpperCase()}`:o}function Cs(e,t){let{env:r,request:o,cache:n,waitUntil:a,i18n:s,session:i,logErrors:c,storefront:u={},customerAccount:d,cart:y={},buyerIdentity:m}=e;i||console.warn("[h2:warn:createHydrogenContext] A session object is required to create hydrogen context."),d?.unstableB2b&&J("[h2:warn:createHydrogenContext] `customerAccount.unstableB2b` is now stable. Please remove the `unstableB2b` option.");let{storefront:C}=Io({cache:n,waitUntil:a,i18n:s,logErrors:c,storefrontHeaders:u.headers||lo(o),storefrontApiVersion:u.apiVersion,storefrontId:r.PUBLIC_STOREFRONT_ID,storeDomain:r.PUBLIC_STORE_DOMAIN,privateStorefrontToken:r.PRIVATE_STOREFRONT_API_TOKEN,publicStorefrontToken:r.PUBLIC_STOREFRONT_API_TOKEN}),p=Cr({session:i,request:o,waitUntil:a,logErrors:c,customerApiVersion:d?.apiVersion,authUrl:d?.authUrl,customAuthStatusHandler:d?.customAuthStatusHandler,useCustomAuthDomain:d?.useCustomAuthDomain,language:s?.language,customerAccountId:r.PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID,shopId:r.SHOP_ID}),l=ir({getCartId:y.getId||Gt(o.headers),setCartId:y.setId||Bt(),cartQueryFragment:y.queryFragment,cartMutateFragment:y.mutateFragment,...y.customMethods&&{customMethods:y.customMethods},buyerIdentity:m,storefront:C,customerAccount:p}),S=new reactRouter.RouterContextProvider;S.set($e,C),S.set(cr,l),S.set(ur,p),S.set(dr,r),S.set(pr,i),a&&S.set(lr,a);let f={storefront:C,cart:l,customerAccount:p,env:r,session:i,waitUntil:a,...t||{}};return new Proxy(S,{get(h,T,g){if(T in h){let v=h[T];return typeof v=="function"?v.bind(h):v}return T in f?f[T]:Reflect.get(h,T,g)},has(h,T){return T in h||T in f},ownKeys(h){return [...Reflect.ownKeys(h),...Object.keys(f)]},getOwnPropertyDescriptor(h,T){if(T in h)return Reflect.getOwnPropertyDescriptor(h,T);if(T in f)return {enumerable:true,configurable:true,writable:false,value:f[T]}}})}function hs({build:e,mode:t,poweredByHeader:r=true,getLoadContext:o,collectTrackingInformation:n=true}){let a=reactRouter.createRequestHandler(e,t),s=r?i=>i.headers.append("powered-by","Shopify, Hydrogen"):void 0;return async i=>{let c=i.method;if((c==="GET"||c==="HEAD")&&i.body)return new Response(`${c} requests cannot have a body`,{status:400});let u=new URL(i.url);if(u.pathname.includes("//"))return new Response(null,{status:301,headers:{location:u.pathname.replace(/\/+/g,"/")}});let d=await o?.(i),y=d?.storefront||d?.get?.($e);if(!y)throw new Error("[h2:createRequestHandler] Storefront instance is required in the load context. Make sure to use createHydrogenContext() or provide a storefront instance via getLoadContext.");if(y.isStorefrontApiUrl(i)){let p=await y.forward(i);return s?.(p),p}if(y.isMcpUrl(i)){let p=await y.forwardMcp(i);return s?.(p),p}let m=await a(i,d);n&&y.setCollectedSubrequestHeaders(m);let C=i.headers.get("sec-fetch-dest");return (C&&C==="document"||i.headers.get("accept")?.includes("text/html"))&&xe(m,{[ze]:"1"}),s?.(m),m}}var Qo=react.createContext(void 0),Wo=Qo.Provider,gr=()=>react.useContext(Qo);function Ps(e){let t=gt(),r=vs(t,e);return {nonce:t,header:r,NonceProvider:({children:n})=>react.createElement(Wo,{value:t},n)}}function vs(e,t){let{shop:r,...o}=t??{},n=`'nonce-${e}'`,a=["'self'","'unsafe-inline'","https://cdn.shopify.com"],s=["'self'","https://cdn.shopify.com/","https://monorail-edge.shopifysvc.com"];r&&r.checkoutDomain&&s.push(`https://${r.checkoutDomain}`),r&&r.storeDomain&&s.push(`https://${r.storeDomain}`);let c={baseUri:["'self'"],defaultSrc:["'self'",n,"https://cdn.shopify.com","https://shopify.com"],frameAncestors:["'none'"],styleSrc:a,connectSrc:s},u=Object.assign({},c,o);for(let d in c){let y=o[d];d&&y&&(u[d]=Is(y,c[d]));}return u.scriptSrc instanceof Array?u.scriptSrc=[...u.scriptSrc.filter(d=>!d.startsWith("'nonce")),n]:u.defaultSrc instanceof Array&&(u.defaultSrc=[...u.defaultSrc.filter(d=>!d.startsWith("'nonce")),n]),Rs__default.default({directives:u})}function Is(e,t){let r=typeof t=="string"?[t]:t,o=Array.isArray(e)?e:[String(e)];return Array.isArray(r)?r.every(a=>a==="'none'")?o:[...o,...r]:r}var ws=react.forwardRef((e,t)=>{let{waitForHydration:r,src:o,...n}=e,a=gr();return r?jsxRuntime.jsx(xs,{src:o,options:n}):jsxRuntime.jsx("script",{suppressHydrationWarning:true,...n,src:o,nonce:a,ref:t})});function xs({src:e,options:t}){if(!e)throw new Error("`waitForHydration` with the Script component requires a `src` prop");return hydrogenReact.useLoadScript(e,{attributes:t}),null}async function Os(e){return e;}function Us(e){let t=reactRouter.useFetchers(),r={};for(let{formData:o}of t)if(o?.get("optimistic-identifier")===e)try{if(o.has("optimistic-data")){let n=JSON.parse(String(o.get("optimistic-data")));Object.assign(r,n);}}catch{}return r}function Ls({id:e,data:t}){return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("input",{type:"hidden",name:"optimistic-identifier",value:e}),jsxRuntime.jsx("input",{type:"hidden",name:"optimistic-data",value:JSON.stringify(t)})]})}function Fs({connection:e,children:t=()=>(console.warn("<Pagination> requires children to work properly"),null),namespace:r=""}){let [o,n]=react.useState(false),a=reactRouter.useNavigation(),s=reactRouter.useLocation();reactRouter.useNavigate();react.useEffect(()=>{a.state==="idle"&&n(false);},[a.state]);let{endCursor:c,hasNextPage:u,hasPreviousPage:d,nextPageUrl:y,nodes:m,previousPageUrl:C,startCursor:p}=Hs(e,r),l=react.useMemo(()=>({...s.state,pagination:{...s.state?.pagination||{},[r]:{pageInfo:{endCursor:c,hasPreviousPage:d,hasNextPage:u,startCursor:p},nodes:m}}}),[c,u,d,p,m,r,s.state]),S=react.useMemo(()=>react.forwardRef(function(h,T){return u?react.createElement(reactRouter.Link,{preventScrollReset:true,...h,to:y,state:l,replace:true,ref:T,onClick:()=>n(true)}):null}),[u,y,l]),f=react.useMemo(()=>react.forwardRef(function(h,T){return d?react.createElement(reactRouter.Link,{preventScrollReset:true,...h,to:C,state:l,replace:true,ref:T,onClick:()=>n(true)}):null}),[d,C,l]);return t({state:l,hasNextPage:u,hasPreviousPage:d,isLoading:o,nextPageUrl:y,nodes:m,previousPageUrl:C,NextLink:S,PreviousLink:f})}function At(e,t){let r=new URLSearchParams(e);return Object.keys(t?.pagination||{}).forEach(n=>{let a=n===""?"":`${n}_`,s=`${a}cursor`,i=`${a}direction`;r.delete(s),r.delete(i);}),r.toString()}function We(e){throw new Error(`The Pagination component requires ${"`"+e+"`"} to be a part of your query. See the guide on how to setup your query to include ${"`"+e+"`"}: https://shopify.dev/docs/custom-storefronts/hydrogen/data-fetching/pagination#setup-the-paginated-query`)}function Hs(e,t=""){e.pageInfo||We("pageInfo"),typeof e.pageInfo.startCursor>"u"&&We("pageInfo.startCursor"),typeof e.pageInfo.endCursor>"u"&&We("pageInfo.endCursor"),typeof e.pageInfo.hasNextPage>"u"&&We("pageInfo.hasNextPage"),typeof e.pageInfo.hasPreviousPage>"u"&&We("pageInfo.hasPreviousPage");let r=reactRouter.useNavigation(),o=reactRouter.useNavigate(),{state:n,search:a,pathname:s}=reactRouter.useLocation(),i=t?`${t}_cursor`:"cursor",c=t?`${t}_direction`:"direction",y=new URLSearchParams(a).get(c)==="previous",m=react.useMemo(()=>!globalThis?.window?.__hydrogenHydrated||!n?.pagination?.[t]?.nodes?hydrogenReact.flattenConnection(e):y?[...hydrogenReact.flattenConnection(e),...n.pagination[t].nodes||[]]:[...n.pagination[t].nodes||[],...hydrogenReact.flattenConnection(e)],[n,e,t]),C=react.useMemo(()=>{let f=globalThis?.window?.__hydrogenHydrated,P=n?.pagination?.[t]?.pageInfo,h=!f||P?.startCursor===void 0?e.pageInfo.startCursor:P.startCursor,T=!f||P?.endCursor===void 0?e.pageInfo.endCursor:P.endCursor,g=!f||P?.hasPreviousPage===void 0?e.pageInfo.hasPreviousPage:P.hasPreviousPage,v=!f||P?.hasNextPage===void 0?e.pageInfo.hasNextPage:P.hasNextPage;return n?.pagination?.[t]?.nodes&&(y?(h=e.pageInfo.startCursor,g=e.pageInfo.hasPreviousPage):(T=e.pageInfo.endCursor,v=e.pageInfo.hasNextPage)),{startCursor:h,endCursor:T,hasPreviousPage:g,hasNextPage:v}},[y,n,t,e.pageInfo.hasNextPage,e.pageInfo.hasPreviousPage,e.pageInfo.startCursor,e.pageInfo.endCursor]),p=react.useRef({params:At(a,n),pathname:s});react.useEffect(()=>{window.__hydrogenHydrated=true;},[]),react.useEffect(()=>{let f=At(a,n),P=p.current.params;(s!==p.current.pathname||f!==P)&&!(r.state==="idle"&&!r.location)&&(p.current={pathname:s,params:At(a,n)},o(`${s}?${At(a,n)}`,{replace:true,preventScrollReset:true,state:{nodes:void 0,pageInfo:void 0}}));},[s,a,n]);let l=react.useMemo(()=>{let f=new URLSearchParams(a);return f.set(c,"previous"),C.startCursor&&f.set(i,C.startCursor),`?${f.toString()}`},[a,C.startCursor]),S=react.useMemo(()=>{let f=new URLSearchParams(a);return f.set(c,"next"),C.endCursor&&f.set(i,C.endCursor),`?${f.toString()}`},[a,C.endCursor]);return {...C,previousPageUrl:l,nextPageUrl:S,nodes:m}}function $s(e,t={pageBy:20}){if(typeof e?.url>"u")throw new Error("getPaginationVariables must be called with the Request object passed to your loader function");let{pageBy:r,namespace:o=""}=t,n=new URLSearchParams(new URL(e.url).search),a=o?`${o}_cursor`:"cursor",s=o?`${o}_direction`:"direction",i=n.get(a)??void 0;return (n.get(s)==="previous"?"previous":"next")==="previous"?{last:r,startCursor:i??null}:{first:r,endCursor:i??null}}function Qs(e,t){let r=reactRouter.useNavigation(),[o,n]=react.useState([]);if(react.useEffect(()=>{Promise.resolve(t).then(a=>{a&&n(a instanceof Array?a:a.product?.variants?.nodes||[]);}).catch(a=>{reportError(new Error("[h2:error:useOptimisticVariant] An error occurred while resolving the variants for the optimistic product hook.",{cause:a}));});},[JSON.stringify(t)]),r.state==="loading"){let a=new URLSearchParams(r.location.search),s=false,i=o.find(c=>c.selectedOptions?c.selectedOptions.every(u=>a.get(u.name)===u.value):(s||(s=true,reportError(new Error("[h2:error:useOptimisticVariant] The optimistic product hook requires your product query to include variants with the selectedOptions field."))),false));if(i)return {...i,isOptimistic:true}}return e}function zs({handle:e,options:t=[],variants:r=[],productPath:o="products",waitForNavigation:n=false,selectedVariant:a,children:s}){let i=t;i[0]?.values&&(J("[h2:warn:VariantSelector] product.options.values is deprecated. Use product.options.optionValues instead."),i[0]&&!i[0].optionValues&&(i=t.map(p=>({...p,optionValues:p.values?.map(l=>({name:l}))||[]}))));let c=r instanceof Array?r:hydrogenReact.flattenConnection(r),{searchParams:u,path:d,alreadyOnProductPage:y}=Zs(e,o,n),m=i.filter(p=>p?.optionValues?.length===1),C=a?a?.selectedOptions?.reduce((p,l)=>(p[l.name]=l.value,p),{}):{};return react.createElement(react.Fragment,null,...react.useMemo(()=>i.map(p=>{let l,S=[];for(let f of p.optionValues){let P=new URLSearchParams(y?u:void 0);P.set(p.name,f.name),m.forEach(R=>{R.optionValues[0].name&&P.set(R.name,R.optionValues[0].name);});let h=c.find(R=>R?.selectedOptions?.every(U=>(P.get(U?.name)||C?.[U?.name])===U?.value)),T=u.get(p.name);!T&&a&&(T=C?.[p.name]||null);let g=T?T===f.name:false;g&&(l=f.name);let v="?"+P.toString();S.push({value:f.name,optionValue:f,isAvailable:h?h.availableForSale:true,to:d+v,search:v,isActive:g,variant:h});}return s({option:{name:p.name,value:l,values:S}})}),[i,c,s]))}var Xs=e=>{if(typeof e?.url>"u")throw new TypeError(`Expected a Request instance, got ${typeof e}`);let t=new URL(e.url).searchParams,r=[];return t.forEach((o,n)=>{r.push({name:n,value:o});}),r};function Zs(e,t,r){let{pathname:o,search:n}=reactRouter.useLocation(),a=reactRouter.useNavigation();return react.useMemo(()=>{let s=/(\/[a-zA-Z]{2}-[a-zA-Z]{2}\/)/g.exec(o),i=s&&s.length>0;t=t.startsWith("/")?t.substring(1):t;let c=i?`${s[0]}${t}/${e}`:`/${t}/${e}`;return {searchParams:new URLSearchParams(r||a.state!=="loading"?n:a.location.search),alreadyOnProductPage:c===o,path:c}},[o,n,r,e,t,a])}function ei(){return {name:"hydrogen-2025.7.0",reactRouterConfig:()=>({appDirectory:"app",buildDirectory:"dist",ssr:true,future:{v8_middleware:true,v8_splitRouteModules:true,v8_viteEnvironmentApi:false,unstable_optimizeDeps:true},subResourceIntegrity:false}),reactRouterConfigResolved:({reactRouterConfig:e})=>{if(e.basename&&e.basename!=="/")throw new Error(`[Hydrogen Preset] basename is not supported in Hydrogen 2025.7.0.
543
- Reason: Requires major CLI infrastructure modernization.
544
- Workaround: Use reverse proxy or CDN path rewriting for subdirectory hosting.`);if(e.prerender)throw new Error(`[Hydrogen Preset] prerender is not supported in Hydrogen 2025.7.0.
545
- Reason: React Router plugin incompatibility with Hydrogen CLI build pipeline.
546
- Workaround: Use external static generation tools or server-side caching.`);if(e.serverBundles)throw new Error(`[Hydrogen Preset] serverBundles is not supported in Hydrogen 2025.7.0.
547
- Reason: React Router plugin manifest incompatibility with Hydrogen CLI.
548
- Alternative: Route-level code splitting via v8_splitRouteModules is enabled.`);if(e.buildEnd)throw new Error(`[Hydrogen Preset] buildEnd is not supported in Hydrogen 2025.7.0.
549
- Reason: Hydrogen CLI bypasses React Router buildEnd hook execution.
550
- Workaround: Use external build scripts or package.json post-build hooks.`);if(e.subResourceIntegrity===true)throw new Error(`[Hydrogen Preset] subResourceIntegrity cannot be enabled.
551
- Reason: Conflicts with Hydrogen CSP nonce-based authentication.
552
- Impact: Would break Content Security Policy and cause script execution failures.`)}}}var oi=function(e){return jsxRuntime.jsx(hydrogenReact.RichText,{...e,components:{link:({node:t})=>jsxRuntime.jsx(reactRouter.Link,{to:t.url,title:t.title,target:t.target,prefetch:"intent",children:t.children}),...e.components}})};var ni=async function({request:t,context:r}){let o=r.storefront,n=r.customerAccount,a=new URL(t.url);if(!o)throw new Error("GraphiQL: Hydrogen's storefront client must be injected in the loader context.");let s={};if(o){let u="X-Shopify-Storefront-Access-Token";s.storefront={name:"Storefront API",authHeader:u,accessToken:o.getPublicTokenHeaders()[u],apiUrl:o.getApiUrl(),icon:"SF"};}if(n){let u=await(await fetch(a.origin+"/graphiql/customer-account.schema.json")).json(),d=await n.getAccessToken();u&&(s["customer-account"]={name:"Customer Account API",value:u,authHeader:"Authorization",accessToken:d,apiUrl:n.getApiUrl(),icon:"CA"});}let i="https://avatars.githubusercontent.com/u/12972006?s=48&v=4",c=String.raw;return new Response(c`
553
- <!DOCTYPE html>
554
- <html lang="en">
555
- <head>
556
- <title>GraphiQL</title>
557
- <link rel="icon" type="image/x-icon" href="${i}" />
558
- <meta charset="utf-8" />
559
- <style>
560
- body {
561
- height: 100%;
562
- margin: 0;
563
- width: 100%;
564
- overflow: hidden;
565
- background-color: hsl(219, 29%, 18%);
566
- }
567
-
568
- #graphiql {
569
- height: 100vh;
570
- }
571
-
572
- #graphiql > .placeholder {
573
- color: slategray;
574
- width: fit-content;
575
- margin: 40px auto;
576
- font-family: Arial;
577
- }
578
-
579
- .graphiql-api-toolbar-label {
580
- position: absolute;
581
- bottom: -6px;
582
- right: -4px;
583
- font-size: 8px;
584
- }
585
- </style>
586
-
587
- <link
588
- rel="stylesheet"
589
- href="https://esm.sh/graphiql/dist/style.css"
590
- />
591
-
592
- <link
593
- rel="stylesheet"
594
- href="https://esm.sh/@graphiql/plugin-explorer/dist/style.css"
595
- />
596
- <script type="importmap">
597
- {
598
- "imports": {
599
- "react": "https://esm.sh/react@19.1.0",
600
- "react/jsx-runtime": "https://esm.sh/react@19.1.0/jsx-runtime",
601
- "react-dom": "https://esm.sh/react-dom@19.1.0",
602
- "react-dom/client": "https://esm.sh/react-dom@19.1.0/client",
603
-
604
- "graphql": "https://esm.sh/graphql@16.11.0",
605
-
606
- "graphiql": "https://esm.sh/graphiql?standalone&external=react,react-dom,@graphiql/react,graphql",
607
- "@graphiql/plugin-explorer": "https://esm.sh/@graphiql/plugin-explorer?standalone&external=react,@graphiql/react,graphql",
608
- "@graphiql/react": "https://esm.sh/@graphiql/react?standalone&external=react,react-dom,graphql",
609
- "@graphiql/toolkit": "https://esm.sh/@graphiql/toolkit?standalone&external=graphql"
610
- }
611
- }
612
- </script>
613
- <script type="module">
614
- // Import React and ReactDOM
615
- import React from 'react';
616
- import ReactDOM from 'react-dom/client';
617
-
618
- // Import GraphiQL and the Explorer plugin
619
- import {GraphiQL, HISTORY_PLUGIN} from 'graphiql';
620
- import {createGraphiQLFetcher} from '@graphiql/toolkit';
621
- import {explorerPlugin} from '@graphiql/plugin-explorer';
622
- import {ToolbarButton} from '@graphiql/react';
623
-
624
- import createJSONWorker from 'https://esm.sh/monaco-editor/esm/vs/language/json/json.worker.js?worker';
625
- import createGraphQLWorker from 'https://esm.sh/monaco-graphql/esm/graphql.worker.js?worker';
626
- import createEditorWorker from 'https://esm.sh/monaco-editor/esm/vs/editor/editor.worker.js?worker';
627
- import {parse, print} from 'graphql';
628
-
629
- globalThis.MonacoEnvironment = {
630
- getWorker(_workerId, label) {
631
- switch (label) {
632
- case 'json':
633
- return createJSONWorker();
634
- case 'graphql':
635
- return createGraphQLWorker();
636
- }
637
- return createEditorWorker();
638
- },
639
- };
640
-
641
- const windowUrl = new URL(document.URL);
642
- const startingSchemaKey =
643
- windowUrl.searchParams.get('schema') || 'storefront';
644
-
645
- let initialQuery = '{ shop { name } }';
646
- if (windowUrl.searchParams.has('query')) {
647
- initialQuery = decodeURIComponent(
648
- windowUrl.searchParams.get('query') ?? query,
649
- );
650
- }
651
-
652
- // Prettify query
653
- initialQuery = print(parse(initialQuery));
654
-
655
- let variables;
656
- if (windowUrl.searchParams.has('variables')) {
657
- variables = decodeURIComponent(
658
- windowUrl.searchParams.get('variables') ?? '',
659
- );
660
- }
661
-
662
- // Prettify variables
663
- if (variables) {
664
- variables = JSON.stringify(JSON.parse(variables), null, 2);
665
- }
666
-
667
- const schemas = ${JSON.stringify(s)};
668
-
669
- let lastActiveTabIndex = -1;
670
- let lastTabAmount = -1;
671
-
672
- const TAB_STATE_KEY = 'graphiql:tabState';
673
- const storage = {
674
- getTabState: () =>
675
- JSON.parse(localStorage.getItem(TAB_STATE_KEY)),
676
- setTabState: (state) =>
677
- localStorage.setItem(TAB_STATE_KEY, JSON.stringify(state)),
678
- };
679
-
680
- let nextSchemaKey;
681
-
682
- function App() {
683
- const [activeSchema, setActiveSchema] =
684
- React.useState(startingSchemaKey);
685
-
686
- const schema = schemas[activeSchema];
687
-
688
- if (!schema) {
689
- throw new Error('No schema found for ' + activeSchema);
690
- }
691
-
692
- const fetcher = createGraphiQLFetcher({
693
- url: schema.apiUrl,
694
- headers: {[schema.authHeader]: schema.accessToken},
695
- enableIncrementalDelivery: false,
696
- });
697
-
698
- // We create a custom fetcher because createGraphiQLFetcher attempts to introspect the schema
699
- // and the Customer Account API does not support introspection.
700
- // We override the fetcher to return the schema directly only for the CAAPI introspection query.
701
- function createJsonFetcher(options, httpFetch) {
702
- if (activeSchema === 'storefront') {
703
- return fetcher(options, httpFetch);
704
- } else {
705
- // CAAPI requires a custom fetcher
706
- if (options.operationName === 'IntrospectionQuery') {
707
- return {data: schema.value};
708
- } else {
709
- return fetcher(options, httpFetch);
710
- }
711
- }
712
- }
713
-
714
- const keys = Object.keys(schemas);
715
-
716
- function onTabChange(state) {
717
- const {activeTabIndex, tabs} = state;
718
- const activeTab = tabs[activeTabIndex];
719
-
720
- if (
721
- activeTabIndex === lastActiveTabIndex &&
722
- lastTabAmount === tabs.length
723
- ) {
724
- if (
725
- nextSchemaKey &&
726
- activeTab &&
727
- activeTab.schemaKey !== nextSchemaKey
728
- ) {
729
- activeTab.schemaKey = nextSchemaKey;
730
- nextSchemaKey = undefined;
731
-
732
- // Sync state to localStorage. GraphiQL resets the state
733
- // asynchronously, so we need to do it in a timeout.
734
- storage.setTabState(state);
735
- setTimeout(() => storage.setTabState(state), 500);
736
- }
737
-
738
- // React rerrendering, skip
739
- return;
740
- }
741
-
742
- if (activeTab) {
743
- if (!activeTab.schemaKey) {
744
- // Creating a new tab
745
- if (lastTabAmount < tabs.length) {
746
- activeTab.schemaKey = activeSchema;
747
- storage.setTabState(state);
748
- }
749
- }
750
-
751
- const nextSchema = activeTab.schemaKey || 'storefront';
752
-
753
- if (nextSchema !== activeSchema) {
754
- setActiveSchema(nextSchema);
755
- }
756
- }
757
-
758
- lastActiveTabIndex = activeTabIndex;
759
- lastTabAmount = tabs.length;
760
- }
761
-
762
- const plugins = [HISTORY_PLUGIN, explorerPlugin()];
763
-
764
- const props = {
765
- fetcher: createJsonFetcher,
766
- defaultEditorToolsVisibility: true,
767
- initialQuery,
768
- variables,
769
- schema: schema.value,
770
- plugins,
771
- onTabChange,
772
- };
773
-
774
- function toggleSelectedApi() {
775
- const activeKeyIndex = keys.indexOf(activeSchema);
776
- nextSchemaKey = keys[(activeKeyIndex + 1) % keys.length];
777
-
778
- // This triggers onTabChange
779
- if (nextSchemaKey) setActiveSchema(nextSchemaKey);
780
- }
781
-
782
- const CustomToolbar = React.createElement(
783
- GraphiQL.Toolbar,
784
- {
785
- key: 'Custom Toolbar',
786
- },
787
- [
788
- React.createElement(
789
- ToolbarButton,
790
- {
791
- key: 'api-wrapper',
792
- onClick: toggleSelectedApi,
793
- label: 'Toggle between different API schemas',
794
- },
795
- [
796
- React.createElement(
797
- 'div',
798
- {
799
- key: 'icon',
800
- style: {
801
- textAlign: 'center',
802
- },
803
- },
804
- [
805
- schema.icon,
806
- React.createElement(
807
- 'div',
808
- {
809
- key: 'icon-label',
810
- className: 'graphiql-api-toolbar-label',
811
- },
812
- 'API',
813
- ),
814
- ],
815
- ),
816
- ],
817
- ),
818
- ],
819
- );
820
-
821
- const CustomLogo = React.createElement(
822
- GraphiQL.Logo,
823
- {
824
- key: 'Logo replacement',
825
- },
826
- [
827
- React.createElement(
828
- 'div',
829
- {
830
- key: 'Logo wrapper',
831
- style: {display: 'flex', alignItems: 'center'},
832
- },
833
- [
834
- React.createElement(
835
- 'div',
836
- {
837
- key: 'api',
838
- className: 'graphiql-logo',
839
- style: {
840
- paddingRight: 0,
841
- whiteSpace: 'nowrap',
842
- },
843
- },
844
- [schema.name],
845
- ),
846
- React.createElement(GraphiQL.Logo, {key: 'logo'}),
847
- ],
848
- ),
849
- ],
850
- );
851
-
852
- const children = [CustomToolbar, CustomLogo];
853
-
854
- return React.createElement(GraphiQL, props, children);
855
- }
856
-
857
- const container = document.getElementById('graphiql');
858
-
859
- const root = ReactDOM.createRoot(container);
860
-
861
- root.render(React.createElement(App));
862
- </script>
863
- </head>
864
-
865
- <body>
866
- <div id="graphiql">
867
- <div class="placeholder">Loading GraphiQL...</div>
868
- </div>
869
- </body>
870
- </html>
871
- `,{status:200,headers:{"content-type":"text/html"}})};var cn=".data",Tr="_root.data",un="_.data";async function ai(e){let{storefront:t,request:r,noAdminRedirect:o,matchQueryParams:n,response:a=new Response("Not Found",{status:404})}=e,s=new URL(r.url),{searchParams:i}=s,{pathname:c,isSoftNavigation:u}=si(s.pathname);i.delete("redirect"),i.delete("return_to"),i.delete("_routes");let d=(n?`${c}${s.search}`:c).toLowerCase();if(c==="/admin"&&!o)return Rr(`${t.getShopifyDomain()}/admin`,u,i,n);try{let{urlRedirects:y}=await t.query(ii,{variables:{query:"path:"+d.replace(/\/+$/,"")}}),m=y?.edges?.[0]?.node?.target;if(m)return Rr(m,u,i,n);let C=ht(r.url);if(C)return Rr(C,u,i,n)}catch(y){console.error(`Failed to fetch redirects from Storefront API for route ${d}`,y);}return a}var Sr="https://example.com";function Rr(e,t,r,o){let n=new URL(e,Sr);if(!o)for(let[a,s]of r)n.searchParams.append(a,s);return t?new Response(null,{status:204,headers:{"X-Remix-Redirect":n.toString().replace(Sr,""),"X-Remix-Status":"301"}}):new Response(null,{status:301,headers:{location:n.toString().replace(Sr,"")}})}function si(e){return e.endsWith(cn)?e.endsWith("/"+un)?{pathname:e.slice(0,-un.length),isSoftNavigation:true}:e==="/"+Tr||e.endsWith("/"+Tr)?{pathname:e.slice(0,-Tr.length)||"/",isSoftNavigation:true}:{pathname:e.slice(0,-cn.length),isSoftNavigation:true}:{pathname:e,isSoftNavigation:false}}var ii=`#graphql
872
- query redirects($query: String) {
873
- urlRedirects(first: 1, query: $query) {
874
- edges {
875
- node {
876
- target
877
- }
878
- }
879
- }
880
- }
881
- `;var ci={"&":"\\u0026",">":"\\u003e","<":"\\u003c","\u2028":"\\u2028","\u2029":"\\u2029"},ui=/[&><\u2028\u2029]/g;function dn(e){return e.replace(ui,t=>ci[t])}var ue="Error in SEO input: ",oe={title:{validate:e=>{if(typeof e!="string")throw new Error(ue.concat("`title` should be a string"));if(typeof e=="string"&&e.length>70)throw new Error(ue.concat("`title` should not be longer than 70 characters"));return e}},description:{validate:e=>{if(typeof e!="string")throw new Error(ue.concat("`description` should be a string"));if(typeof e=="string"&&e.length>155)throw new Error(ue.concat("`description` should not be longer than 160 characters"));return e}},url:{validate:e=>{if(typeof e!="string")throw new Error(ue.concat("`url` should be a string"));if(typeof e=="string"&&!e.startsWith("http"))throw new Error(ue.concat("`url` should be a valid URL"));return e}},handle:{validate:e=>{if(typeof e!="string")throw new Error(ue.concat("`handle` should be a string"));if(typeof e=="string"&&!e.startsWith("@"))throw new Error(ue.concat("`handle` should start with `@`"));return e}}};function pn(e){let t=[];for(let r of Object.keys(e))switch(r){case "title":{let o=ne(oe.title,e.title),n=vr(e?.titleTemplate,o);if(!n)break;t.push(H("title",{title:n}),H("meta",{property:"og:title",content:n}),H("meta",{name:"twitter:title",content:n}));break}case "description":{let o=ne(oe.description,e.description);if(!o)break;t.push(H("meta",{name:"description",content:o}),H("meta",{property:"og:description",content:o}),H("meta",{name:"twitter:description",content:o}));break}case "url":{let o=ne(oe.url,e.url);if(!o)break;let a=o.split("?")[0].replace(/\/$/,"");t.push(H("link",{rel:"canonical",href:a}),H("meta",{property:"og:url",content:a}));break}case "handle":{let o=ne(oe.handle,e.handle);if(!o)break;t.push(H("meta",{name:"twitter:site",content:o}),H("meta",{name:"twitter:creator",content:o}));break}case "media":{let o,n=de(e.media);for(let a of n)if(typeof a=="string"&&t.push(H("meta",{name:"og:image",content:a})),a&&typeof a=="object"){let s=a.type||"image",i=a?{url:a?.url,secure_url:a?.url,type:Ir(a.url),width:a?.width,height:a?.height,alt:a?.altText}:{};for(let c of Object.keys(i))i[c]&&(o=i[c],t.push(H("meta",{property:`og:${s}:${c}`,content:o},i.url)));}break}case "jsonLd":{let o=de(e.jsonLd),n=0;for(let a of o){if(typeof a!="object")continue;let s=H("script",{type:"application/ld+json",children:JSON.stringify(a,(i,c)=>typeof c=="string"?dn(c):c)},`json-ld-${a?.["@type"]||a?.name||n++}`);t.push(s);}break}case "alternates":{let o=de(e.alternates);for(let n of o){if(!n)continue;let{language:a,url:s,default:i}=n,c=a?`${a}${i?"-default":""}`:void 0;t.push(H("link",{rel:"alternate",hrefLang:c,href:s}));}break}case "robots":{if(!e.robots)break;let{maxImagePreview:o,maxSnippet:n,maxVideoPreview:a,noArchive:s,noFollow:i,noImageIndex:c,noIndex:u,noSnippet:d,noTranslate:y,unavailableAfter:m}=e.robots,C=[s&&"noarchive",c&&"noimageindex",d&&"nosnippet",y&&"notranslate",o&&`max-image-preview:${o}`,n&&`max-snippet:${n}`,a&&`max-video-preview:${a}`,m&&`unavailable_after:${m}`],p=(u?"noindex":"index")+","+(i?"nofollow":"follow");for(let l of C)l&&(p+=`,${l}`);t.push(H("meta",{name:"robots",content:p}));break}}return t.flat().sort((r,o)=>r.key.localeCompare(o.key))}function H(e,t,r){let o={tag:e,props:{},key:""};return e==="title"?(o.children=t.title,o.key=Pr(o),o):e==="script"?(o.children=typeof t.children=="string"?t.children:"",o.key=Pr(o,r),delete t.children,o.props=t,o):(o.props=t,Object.keys(o.props).forEach(n=>!o.props[n]&&delete o.props[n]),o.key=Pr(o,r),o)}function Pr(e,t){let{tag:r,props:o}=e;if(r==="title")return "0-title";if(r==="meta"){let n=o.content===t&&typeof o.property=="string"&&!o.property.endsWith("secure_url")&&"0";return [r,...[t,n],o.property||o.name].filter(s=>s).join("-")}return r==="link"?[r,o.rel,o.hrefLang||o.media].filter(a=>a).join("-").replace(/\s+/g,"-"):r==="script"?`${r}-${t}`:`${r}-${o.type}`}function vr(e,t){if(t)return e?typeof e=="function"?e(t):e.replace("%s",t??""):t}function Ir(e){switch(e&&e.split(".").pop()){case "svg":return "image/svg+xml";case "png":return "image/png";case "gif":return "image/gif";case "swf":return "application/x-shockwave-flash";case "mp3":return "audio/mpeg";default:return "image/jpeg"}}function de(e){return Array.isArray(e)?e:[e]}function ne(e,t){try{return e.validate(t)}catch(r){return console.warn(r.message),t}}function di(...e){let t=[],r=e.reduce((o,n)=>{if(!n)return o;Object.keys(n).forEach(s=>!n[s]&&delete n[s]);let{jsonLd:a}=n;return a?o?.jsonLd?{...o,...n,jsonLd:de(o.jsonLd).concat(a)}:{...o,...n,jsonLd:[a]}:{...o,...n}},{})||{};for(let o of Object.keys(r))switch(o){case "title":{let n=ne(oe.title,r.title),a=vr(r?.titleTemplate,n);if(!a)break;t.push({title:a},{property:"og:title",content:a},{property:"twitter:title",content:a});break}case "description":{let n=ne(oe.description,r.description);if(!n)break;t.push({name:"description",content:n},{property:"og:description",content:n},{property:"twitter:description",content:n});break}case "url":{let n=ne(oe.url,r.url);if(!n)break;let s=n.split("?")[0].replace(/\/$/,"");t.push({tagName:"link",rel:"canonical",href:s},{property:"og:url",content:s});break}case "handle":{let n=ne(oe.handle,r.handle);if(!n)break;t.push({property:"twitter:site",content:n},{property:"twitter:creator",content:n});break}case "media":{let n,a=de(r.media);for(let s of a)if(typeof s=="string"&&t.push({property:"og:image",content:s}),s&&typeof s=="object"){let i=s.type||"image",c=s?{url:s?.url,secure_url:s?.url,type:Ir(s.url),width:s?.width,height:s?.height,alt:s?.altText}:{};for(let u of Object.keys(c))c[u]&&(n=c[u],t.push({property:`og:${i}:${u}`,content:n}));}break}case "jsonLd":{let n=de(r.jsonLd);for(let s of n)typeof s!="object"||Object.keys(s).length===0||t.push({"script:ld+json":s});break}case "alternates":{let n=de(r.alternates);for(let a of n){if(!a)continue;let{language:s,url:i,default:c}=a,u=s?`${s}${c?"-default":""}`:void 0;t.push({tagName:"link",rel:"alternate",hrefLang:u,href:i});}break}case "robots":{if(!r.robots)break;let{maxImagePreview:n,maxSnippet:a,maxVideoPreview:s,noArchive:i,noFollow:c,noImageIndex:u,noIndex:d,noSnippet:y,noTranslate:m,unavailableAfter:C}=r.robots,p=[i&&"noarchive",u&&"noimageindex",y&&"nosnippet",m&&"notranslate",n&&`max-image-preview:${n}`,a&&`max-snippet:${a}`,s&&`max-video-preview:${s}`,C&&`unavailable_after:${C}`],l=(d?"noindex":"index")+","+(c?"nofollow":"follow");for(let S of p)S&&(l+=`,${S}`);t.push({name:"robots",content:l});break}}return t}var Ai=react.lazy(()=>Promise.resolve().then(()=>(mn(),fn)));function Ti({debug:e}){let t=reactRouter.useMatches(),r=reactRouter.useLocation();console.warn("[h2:warn:Seo] The `<Seo/>` component is deprecated. Use `getSeoMeta` instead.\nSee: https://shopify.dev/docs/api/hydrogen/utilities/getseometa");let o=react.useMemo(()=>t.flatMap(s=>{let{handle:i,...c}=s,u={...c,...r},d=i?.seo,y=c?.data?.seo;return !d&&!y?[]:d?Tt(d,u):[y]}).reduce((s,i)=>{Object.keys(i).forEach(u=>!i[u]&&delete i[u]);let{jsonLd:c}=i;return c?s?.jsonLd?Array.isArray(c)?{...s,...i,jsonLd:[...s.jsonLd,...c]}:{...s,...i,jsonLd:[...s.jsonLd,c]}:{...s,...i,jsonLd:[c]}:{...s,...i}},{}),[t,r]),{html:n,loggerMarkup:a}=react.useMemo(()=>{let s=pn(o),i=s.map(u=>u.tag==="script"?react.createElement(u.tag,{...u.props,key:u.key,dangerouslySetInnerHTML:{__html:u.children}}):react.createElement(u.tag,{...u.props,key:u.key},u.children)),c=react.createElement(react.Suspense,{fallback:null},react.createElement(Ai,{headTags:s}));return {html:i,loggerMarkup:c}},[o]);return react.createElement(react.Fragment,null,n,e&&a)}function Tt(e,...t){if(e instanceof Function)return Tt(e(...t),...t);let r={};return Array.isArray(e)?(r=e.reduce((o,n)=>[...o,Tt(n)],[]),r):e instanceof Object?(Object.entries(e).forEach(([n,a])=>{r[n]=Tt(a,...t);}),r):e}function Ri(e){return jsxRuntime.jsx(hydrogenReact.ShopPayButton,{channel:"hydrogen",...e})}var vi=`<?xml version="1.0" encoding="UTF-8"?>
882
- <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
883
- `,Ii=`
884
- </sitemapindex>`,gn=`<?xml version="1.0" encoding="UTF-8"?>
885
- <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">`,hn="</urlset>";async function Ei(e){let{storefront:t,request:r,types:o=["products","pages","collections","metaObjects","articles","blogs"],customChildSitemaps:n=[]}=e;if(!r||!r.url)throw new Error("A request object is required to generate a sitemap index");if(!t||!t.query)throw new Error("A storefront client is required to generate a sitemap index");let a=await t.query(Ni);if(!a)throw console.warn("[h2:sitemap:warning] Sitemap index is available in API version 2024-10 and later"),new Response("Sitemap index not found.",{status:404});let s=new URL(r.url).origin,i=vi+o.map(c=>{if(!a[c])throw new Error(`[h2:sitemap:error] No data found for type ${c}. Check types passed to \`getSitemapIndex\``);return wi(c,a[c].pagesCount.count,s)}).join(`
886
- `)+n.map(c=>" <sitemap><loc>"+(s+(c.startsWith("/")?c:"/"+c))+"</loc></sitemap>").join(`
887
- `)+Ii;return new Response(i,{headers:{"Content-Type":"application/xml","Cache-Control":`max-age=${3600*24}`}})}async function bi(e){let{storefront:t,request:r,params:o,getLink:n,locales:a=[],getChangeFreq:s,noItemsFallback:i="/"}=e;if(!o)throw new Error("[h2:sitemap:error] Remix params object is required to generate a sitemap");if(!r||!r.url)throw new Error("A request object is required to generate a sitemap");if(!t||!t.query)throw new Error("A storefront client is required to generate a index");if(!n)throw new Error("A `getLink` function to generate each resource is required to build a sitemap");if(!o.type||!o.page)throw new Response("No data found",{status:404});let c=o.type,u=Mi[c];if(!u)throw new Response("Not found",{status:404});let d=await t.query(u,{variables:{page:parseInt(o.page,10)}});if(!d)throw console.warn("[h2:sitemap:warning] Sitemap is available in API version 2024-10 and later"),new Response("Sitemap not found.",{status:404});let y=new URL(r.url).origin,m="";return d?.sitemap?.resources?.items?.length?m=gn+d.sitemap.resources.items.map(C=>xi({getChangeFreq:s,url:n({type:C.type??c,baseUrl:y,handle:C.handle}),type:c,getLink:n,updatedAt:C.updatedAt,handle:C.handle,metaobjectType:C.type,locales:a,baseUrl:y})).join(`
888
- `)+hn:m=gn+`
889
- <url><loc>${y+i}</loc></url>
890
- `+hn,new Response(m,{headers:{"Content-Type":"application/xml","Cache-Control":`max-age=${3600*24}`}})}function wi(e,t,r){let o="";for(let n=1;n<=t;n++)o+=` <sitemap><loc>${r}/sitemap/${e}/${n}.xml</loc></sitemap>
891
- `;return o}function xi({url:e,updatedAt:t,locales:r,type:o,getLink:n,baseUrl:a,handle:s,getChangeFreq:i,metaobjectType:c}){return `<url>
892
- <loc>${e}</loc>
893
- <lastmod>${t}</lastmod>
894
- <changefreq>${i?i({type:c??o,handle:s}):"weekly"}</changefreq>
895
- ${r.map(u=>Di(n({type:c??o,baseUrl:a,handle:s,locale:u}),u)).join(`
896
- `)}
897
- </url>
898
- `.trim()}function Di(e,t){return ` <xhtml:link rel="alternate" hreflang="${t}" href="${e}" />`}var Oi=`#graphql
899
- query SitemapProducts($page: Int!) {
900
- sitemap(type: PRODUCT) {
901
- resources(page: $page) {
902
- items {
903
- handle
904
- updatedAt
905
- }
906
- }
907
- }
908
- }
909
- `,_i=`#graphql
910
- query SitemapCollections($page: Int!) {
911
- sitemap(type: COLLECTION) {
912
- resources(page: $page) {
913
- items {
914
- handle
915
- updatedAt
916
- }
917
- }
918
- }
919
- }
920
- `,Ui=`#graphql
921
- query SitemapArticles($page: Int!) {
922
- sitemap(type: ARTICLE) {
923
- resources(page: $page) {
924
- items {
925
- handle
926
- updatedAt
927
- }
928
- }
929
- }
930
- }
931
- `,Li=`#graphql
932
- query SitemapPages($page: Int!) {
933
- sitemap(type: PAGE) {
934
- resources(page: $page) {
935
- items {
936
- handle
937
- updatedAt
938
- }
939
- }
940
- }
941
- }
942
- `,ki=`#graphql
943
- query SitemapBlogs($page: Int!) {
944
- sitemap(type: BLOG) {
945
- resources(page: $page) {
946
- items {
947
- handle
948
- updatedAt
949
- }
950
- }
951
- }
952
- }
953
- `,Vi=`#graphql
954
- query SitemapMetaobjects($page: Int!) {
955
- sitemap(type: METAOBJECT) {
956
- resources(page: $page) {
957
- items {
958
- handle
959
- updatedAt
960
- ... on SitemapResourceMetaobject {
961
- type
962
- }
963
- }
964
- }
965
- }
966
- }
967
- `,Ni=`#graphql
968
- query SitemapIndex {
969
- products: sitemap(type: PRODUCT) {
970
- pagesCount {
971
- count
972
- }
973
- }
974
- collections: sitemap(type: COLLECTION) {
975
- pagesCount {
976
- count
977
- }
978
- }
979
- articles: sitemap(type: ARTICLE) {
980
- pagesCount {
981
- count
982
- }
983
- }
984
- pages: sitemap(type: PAGE) {
985
- pagesCount {
986
- count
987
- }
988
- }
989
- blogs: sitemap(type: BLOG) {
990
- pagesCount {
991
- count
992
- }
993
- }
994
- metaObjects: sitemap(type: METAOBJECT) {
995
- pagesCount {
996
- count
997
- }
998
- }
999
- }
1000
- `,Mi={products:Oi,articles:Ui,collections:_i,pages:Li,blogs:ki,metaObjects:Vi};//! @see https://shopify.dev/docs/api/storefront/latest/queries/cart
1001
- //! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartCreate
1002
- //! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesAdd
1003
- //! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesUpdate
1004
- //! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesRemove
1005
- //! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartDiscountCodesUpdate
1006
- //! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartBuyerIdentityUpdate
1007
- //! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartNoteUpdate
1008
- //! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartSelectedDeliveryOptionsUpdate
1009
- //! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartMetafieldsSet
1010
- //! @see https://shopify.dev/docs/api/storefront/2026-04/mutations/cartMetafieldDelete
1011
- //! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartGiftCardCodesUpdate
1012
- //! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartGiftCardCodesAdd
1013
- //! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartGiftCardCodesRemove
1014
- //! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesAdd
1015
- //! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesRemove
1016
- //! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesUpdate
1017
- //! @see: https://shopify.dev/docs/api/storefront/2026-04/mutations/cartDeliveryAddressesReplace
1018
- Object.defineProperty(exports,"AnalyticsEventName",{enumerable:true,get:function(){return hydrogenReact.AnalyticsEventName}});Object.defineProperty(exports,"AnalyticsPageType",{enumerable:true,get:function(){return hydrogenReact.AnalyticsPageType}});Object.defineProperty(exports,"ExternalVideo",{enumerable:true,get:function(){return hydrogenReact.ExternalVideo}});Object.defineProperty(exports,"IMAGE_FRAGMENT",{enumerable:true,get:function(){return hydrogenReact.IMAGE_FRAGMENT}});Object.defineProperty(exports,"Image",{enumerable:true,get:function(){return hydrogenReact.Image}});Object.defineProperty(exports,"MediaFile",{enumerable:true,get:function(){return hydrogenReact.MediaFile}});Object.defineProperty(exports,"ModelViewer",{enumerable:true,get:function(){return hydrogenReact.ModelViewer}});Object.defineProperty(exports,"Money",{enumerable:true,get:function(){return hydrogenReact.Money}});Object.defineProperty(exports,"ShopifySalesChannel",{enumerable:true,get:function(){return hydrogenReact.ShopifySalesChannel}});Object.defineProperty(exports,"Video",{enumerable:true,get:function(){return hydrogenReact.Video}});Object.defineProperty(exports,"customerAccountApiCustomScalars",{enumerable:true,get:function(){return hydrogenReact.customerAccountApiCustomScalars}});Object.defineProperty(exports,"decodeEncodedVariant",{enumerable:true,get:function(){return hydrogenReact.decodeEncodedVariant}});Object.defineProperty(exports,"flattenConnection",{enumerable:true,get:function(){return hydrogenReact.flattenConnection}});Object.defineProperty(exports,"getAdjacentAndFirstAvailableVariants",{enumerable:true,get:function(){return hydrogenReact.getAdjacentAndFirstAvailableVariants}});Object.defineProperty(exports,"getClientBrowserParameters",{enumerable:true,get:function(){return hydrogenReact.getClientBrowserParameters}});Object.defineProperty(exports,"getProductOptions",{enumerable:true,get:function(){return hydrogenReact.getProductOptions}});Object.defineProperty(exports,"getShopifyCookies",{enumerable:true,get:function(){return hydrogenReact.getShopifyCookies}});Object.defineProperty(exports,"getTrackingValues",{enumerable:true,get:function(){return hydrogenReact.getTrackingValues}});Object.defineProperty(exports,"isOptionValueCombinationInEncodedVariant",{enumerable:true,get:function(){return hydrogenReact.isOptionValueCombinationInEncodedVariant}});Object.defineProperty(exports,"mapSelectedProductOptionToObject",{enumerable:true,get:function(){return hydrogenReact.mapSelectedProductOptionToObject}});Object.defineProperty(exports,"parseGid",{enumerable:true,get:function(){return hydrogenReact.parseGid}});Object.defineProperty(exports,"parseMetafield",{enumerable:true,get:function(){return hydrogenReact.parseMetafield}});Object.defineProperty(exports,"sendShopifyAnalytics",{enumerable:true,get:function(){return hydrogenReact.sendShopifyAnalytics}});Object.defineProperty(exports,"storefrontApiCustomScalars",{enumerable:true,get:function(){return hydrogenReact.storefrontApiCustomScalars}});Object.defineProperty(exports,"useLoadScript",{enumerable:true,get:function(){return hydrogenReact.useLoadScript}});Object.defineProperty(exports,"useMoney",{enumerable:true,get:function(){return hydrogenReact.useMoney}});Object.defineProperty(exports,"useSelectedOptionInUrlParam",{enumerable:true,get:function(){return hydrogenReact.useSelectedOptionInUrlParam}});Object.defineProperty(exports,"useShopifyCookies",{enumerable:true,get:function(){return hydrogenReact.useShopifyCookies}});exports.Analytics=ua;exports.AnalyticsEvent=B;exports.CacheCustom=Ft;exports.CacheLong=Mt;exports.CacheNone=Vt;exports.CacheShort=le;exports.CartForm=re;exports.InMemoryCache=qt;exports.NonceProvider=Wo;exports.OptimisticInput=Ls;exports.Pagination=Fs;exports.RichText=oi;exports.Script=ws;exports.Seo=Ti;exports.ShopPayButton=Ri;exports.VariantSelector=zs;exports.cartAttributesUpdateDefault=tr;exports.cartBuyerIdentityUpdateDefault=Xt;exports.cartCreateDefault=jt;exports.cartDiscountCodesUpdateDefault=zt;exports.cartGetDefault=Wt;exports.cartGetIdDefault=Gt;exports.cartGiftCardCodesAddDefault=ar;exports.cartGiftCardCodesRemoveDefault=sr;exports.cartGiftCardCodesUpdateDefault=nr;exports.cartLinesAddDefault=Kt;exports.cartLinesRemoveDefault=Jt;exports.cartLinesUpdateDefault=Yt;exports.cartMetafieldDeleteDefault=or;exports.cartMetafieldsSetDefault=rr;exports.cartNoteUpdateDefault=Zt;exports.cartSelectedDeliveryOptionsUpdateDefault=er;exports.cartSetIdDefault=Bt;exports.changelogHandler=os;exports.createCartHandler=ir;exports.createContentSecurityPolicy=Ps;exports.createCustomerAccountClient=Cr;exports.createHydrogenContext=Cs;exports.createRequestHandler=hs;exports.createStorefrontClient=Io;exports.createWithCache=Sa;exports.formatAPIResult=I;exports.generateCacheControlHeader=Ne;exports.getPaginationVariables=$s;exports.getSelectedProductOptions=Xs;exports.getSeoMeta=di;exports.getShopAnalytics=ia;exports.getSitemap=bi;exports.getSitemapIndex=Ei;exports.graphiqlLoader=ni;exports.hydrogenContext=ns;exports.hydrogenPreset=ei;exports.hydrogenRoutes=Os;exports.storefrontRedirect=ai;exports.useAnalytics=ee;exports.useCustomerPrivacy=wt;exports.useNonce=gr;exports.useOptimisticCart=ts;exports.useOptimisticData=Us;exports.useOptimisticVariant=Qs;//# sourceMappingURL=index.cjs.map
1019
- //# sourceMappingURL=index.cjs.map