shopify 4.2.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{acorn-QBS5IYTX.js → acorn-7M27BPGP.js} +1 -1
- package/dist/analytics-DWUYMFHO.js +1 -0
- package/dist/analytics-SOXP4UBD.js +1 -0
- package/dist/{angular-UTTM4Y4S.js → angular-DW5TQVCM.js} +1 -1
- package/dist/assets/hydrogen/routes/locale-check.ts +3 -3
- package/dist/assets/hydrogen/starter/CHANGELOG.md +106 -0
- package/dist/assets/hydrogen/starter/app/components/Aside.tsx +4 -2
- package/dist/assets/hydrogen/starter/app/components/CartMain.tsx +8 -5
- package/dist/assets/hydrogen/starter/app/components/CartSummary.tsx +117 -23
- package/dist/assets/hydrogen/starter/app/components/Header.tsx +3 -3
- package/dist/assets/hydrogen/starter/app/components/PaginatedResourceSection.tsx +24 -4
- package/dist/assets/hydrogen/starter/app/components/ProductPrice.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/lib/context.ts +5 -0
- package/dist/assets/hydrogen/starter/app/routes/[robots.txt].tsx +14 -53
- package/dist/assets/hydrogen/starter/app/routes/_index.tsx +11 -4
- package/dist/assets/hydrogen/starter/app/routes/account.$.tsx +1 -1
- package/dist/assets/hydrogen/starter/app/routes/account.addresses.tsx +2 -2
- package/dist/assets/hydrogen/starter/app/routes/account.profile.tsx +1 -1
- package/dist/assets/hydrogen/starter/package.json +9 -10
- package/dist/assets/hydrogen/starter/storefrontapi.generated.d.ts +0 -11
- package/dist/assets/hydrogen/starter/vite.config.ts +10 -4
- package/dist/assets/hydrogen/vite/package.json +1 -2
- package/dist/assets/hydrogen/vite/vite.config.js +4 -3
- package/dist/{babel-JS32NLHY.js → babel-I2RLWM7N.js} +1 -1
- package/dist/bootstrap.js +1 -1
- package/dist/{chokidar-G4ONJSK4.js → chokidar-VDIVGBZH.js} +1 -1
- package/dist/chunk-2EROVVCL.js +1 -0
- package/dist/{chunk-DCBYHVKW.js → chunk-2MMGFZDP.js} +1 -1
- package/dist/{chunk-X2TC7S57.js → chunk-2NWWMNU5.js} +8 -8
- package/dist/{chunk-PRVQAHWI.js → chunk-2O22LZKV.js} +1 -1
- package/dist/{chunk-MFLBTJO7.js → chunk-3CYHS4W2.js} +1 -1
- package/dist/{chunk-2EJCY4CE.js → chunk-3FBSBMSQ.js} +1 -1
- package/dist/chunk-3OZ6ZZ4T.js +5 -0
- package/dist/{chunk-VICNWPLQ.js → chunk-442S5SDM.js} +12 -12
- package/dist/{chunk-MKE434RB.js → chunk-45MEVWH5.js} +1 -1
- package/dist/{chunk-A5SQCM63.js → chunk-47MGPVED.js} +1 -1
- package/dist/chunk-4N6YTHFD.js +1 -0
- package/dist/chunk-4TST2MNC.js +1 -0
- package/dist/{chunk-JUVAGMIH.js → chunk-5C7HDTHJ.js} +1 -1
- package/dist/{chunk-GVITHCQJ.js → chunk-5GVXMNC4.js} +1 -1
- package/dist/{chunk-YGMVL6NZ.js → chunk-5JNEWYD5.js} +2 -2
- package/dist/{chunk-KU5OPV7U.js → chunk-5QQN3SKH.js} +1 -1
- package/dist/{chunk-OKNBZSGN.js → chunk-5QWYIBE6.js} +1 -1
- package/dist/chunk-5W443CKL.js +836 -0
- package/dist/{chunk-PD5ZHJWI.js → chunk-636CTEW7.js} +1 -1
- package/dist/{chunk-L2VSSINY.js → chunk-67KMRBSZ.js} +1 -1
- package/dist/{chunk-HJSYHK4S.js → chunk-6DIHOMCB.js} +1 -1
- package/dist/{chunk-MGL4YM3S.js → chunk-6EZ7JWBK.js} +5 -5
- package/dist/{chunk-NBYS6YQ2.js → chunk-6RL7FUPD.js} +1 -1
- package/dist/chunk-6YPEONHB.js +46 -0
- package/dist/{chunk-C6ABJCRG.js → chunk-733R5OKQ.js} +1 -1
- package/dist/chunk-73W5BGAZ.js +1 -0
- package/dist/{chunk-XDAOLCPN.js → chunk-75LJTY7F.js} +1 -1
- package/dist/{chunk-IU2ZQ6TE.js → chunk-773TIA5M.js} +1 -1
- package/dist/{chunk-TQGTEVSR.js → chunk-7EJ4UVYI.js} +1 -1
- package/dist/{chunk-FQDRVPCY.js → chunk-7LATYPLU.js} +1 -1
- package/dist/{chunk-XXE7667M.js → chunk-7SVMAJTR.js} +1 -1
- package/dist/{chunk-QUTQDXSL.js → chunk-7UNQOKZW.js} +1 -1
- package/dist/{chunk-CE6FKJFS.js → chunk-7UOPCYMV.js} +1 -1
- package/dist/{chunk-7JESXDF2.js → chunk-A4SBXDZB.js} +1 -1
- package/dist/{chunk-Z35BTAM6.js → chunk-AAK376RT.js} +1 -1
- package/dist/chunk-APN3VWN4.js +3 -0
- package/dist/{chunk-7DVOSOEP.js → chunk-AT2GDXN7.js} +1 -1
- package/dist/chunk-ATXODH6C.js +283 -0
- package/dist/chunk-AY4GIVME.js +4 -0
- package/dist/{chunk-PS25FEBF.js → chunk-B7BUEEBR.js} +1 -1
- package/dist/{chunk-6YHJ554P.js → chunk-B7S23DLF.js} +1 -1
- package/dist/chunk-BCD4KTLJ.js +1 -0
- package/dist/{chunk-C3LZPAAH.js → chunk-BIMOHK2P.js} +1 -1
- package/dist/chunk-C3CVLSLS.js +6 -0
- package/dist/{chunk-57N2DFIF.js → chunk-CD5O2BIT.js} +1 -1
- package/dist/chunk-CPE7XCC6.js +593 -0
- package/dist/{chunk-PIBY5DDZ.js → chunk-CRALWNNO.js} +1 -1
- package/dist/{chunk-H4W4DFKK.js → chunk-CX5CC6P5.js} +1 -1
- package/dist/{chunk-2KH2S7PI.js → chunk-CZXGQ53M.js} +1 -1
- package/dist/chunk-D6YDSGR4.js +3 -0
- package/dist/{chunk-J6VTZEE2.js → chunk-DHBYYHBT.js} +1 -1
- package/dist/chunk-DLNBTHKL.js +5 -0
- package/dist/chunk-DO2SHYFU.js +1 -0
- package/dist/{chunk-VPL2NDH6.js → chunk-DONEJHDG.js} +35 -35
- package/dist/{chunk-5TIJLYZU.js → chunk-DQ4HA72R.js} +1 -1
- package/dist/{chunk-NO5KVFTV.js → chunk-DZLA2RJP.js} +3 -3
- package/dist/{chunk-YS6VOQ7I.js → chunk-EJDWYASP.js} +1 -1
- package/dist/{chunk-N3YWHJMB.js → chunk-EKHWL542.js} +46 -46
- package/dist/{chunk-6M3ZYNGO.js → chunk-ET2CGROE.js} +1 -1
- package/dist/{chunk-QSTEVZFQ.js → chunk-F3TMLDLC.js} +1 -1
- package/dist/{chunk-M4LOKANA.js → chunk-F5QG42MA.js} +1 -1
- package/dist/{chunk-FTN7Y6HD.js → chunk-FA4K3JRN.js} +1 -1
- package/dist/{chunk-WDC3KIZT.js → chunk-FKIVKNOV.js} +1 -1
- package/dist/{chunk-4EXYYBQ6.js → chunk-FPLUMESQ.js} +1 -1
- package/dist/chunk-FU232KQ7.js +1 -0
- package/dist/{chunk-HLMFVORT.js → chunk-FZKKKGUJ.js} +1 -1
- package/dist/chunk-G24L7MB3.js +1 -0
- package/dist/{chunk-LQMSF3F7.js → chunk-G2I2ZUBV.js} +1 -1
- package/dist/{chunk-FFYYJKF7.js → chunk-G2S346IS.js} +1 -1
- package/dist/{chunk-KLMDWDT2.js → chunk-GB3YC4TI.js} +1 -1
- package/dist/{chunk-VA5IUGZV.js → chunk-GBZL4TTY.js} +1 -1
- package/dist/{chunk-OCOY5MV2.js → chunk-GCN4O7HM.js} +1 -1
- package/dist/{chunk-2N4O33VM.js → chunk-GDHD3TGC.js} +1 -1
- package/dist/{chunk-TLSAQ6FG.js → chunk-GFCLUGAG.js} +1 -1
- package/dist/{chunk-C2FFA4O4.js → chunk-GKRCTMWY.js} +1 -1
- package/dist/{chunk-TGACBJIY.js → chunk-GTUKM3ZW.js} +1 -1
- package/dist/{chunk-RGNAWKD7.js → chunk-GUO7S4NW.js} +1 -1
- package/dist/{chunk-WUK5NQSX.js → chunk-GW3VY3FZ.js} +2 -2
- package/dist/{chunk-4KRT35A2.js → chunk-H5C3QTOO.js} +1 -1
- package/dist/{chunk-LKS47US7.js → chunk-H6WN7GP4.js} +1 -1
- package/dist/{chunk-2WNODIWJ.js → chunk-HA6NISOZ.js} +1 -1
- package/dist/{chunk-FBVBO5YQ.js → chunk-HCN6HXA5.js} +1 -1
- package/dist/chunk-HM5H7WBE.js +1 -0
- package/dist/chunk-HZMP62GK.js +21 -0
- package/dist/{chunk-QLQGHMVU.js → chunk-HZSAUZBX.js} +1 -1
- package/dist/chunk-HZYRCG4R.js +9 -0
- package/dist/{chunk-EENHXSWU.js → chunk-I5A6BPCP.js} +1 -1
- package/dist/chunk-I73E3BD5.js +1 -0
- package/dist/{chunk-UURFVUAH.js → chunk-IG6LPVS4.js} +1 -1
- package/dist/{chunk-BECEP46I.js → chunk-IIOIDMG3.js} +1 -1
- package/dist/{chunk-D656BV5Z.js → chunk-IPQH2RHD.js} +1 -1
- package/dist/{chunk-TNQXTZAX.js → chunk-IWOTLFOY.js} +1 -1
- package/dist/chunk-IX4KP6E3.js +2 -0
- package/dist/{chunk-AP3RFOPL.js → chunk-J2WCMQZZ.js} +1 -1
- package/dist/chunk-J3HXFQ2L.js +1 -0
- package/dist/{chunk-OYP7DKPU.js → chunk-J3JPJCWP.js} +1 -1
- package/dist/chunk-J5TNYNR5.js +1 -0
- package/dist/{chunk-UBKVCI7A.js → chunk-J7UQBC45.js} +1 -1
- package/dist/{chunk-M2TJICTB.js → chunk-JAW32T6G.js} +1 -1
- package/dist/{chunk-LCCMXY6N.js → chunk-JOZXRV5K.js} +1 -1
- package/dist/{chunk-UARVYVLN.js → chunk-KKUDXLK2.js} +2 -2
- package/dist/{chunk-LITB5QQX.js → chunk-KN3FTJDU.js} +1 -1
- package/dist/{chunk-3VZEETAV.js → chunk-KRZABRYT.js} +1 -1
- package/dist/{chunk-DNLOSMHL.js → chunk-KSZ5K6LJ.js} +1 -1
- package/dist/chunk-LCPD2BYX.js +1 -0
- package/dist/chunk-LKZ7ARYS.js +18 -0
- package/dist/{chunk-3V63X7WZ.js → chunk-LOHUNOQ7.js} +1 -1
- package/dist/{chunk-IXUVSFW2.js → chunk-LOQIRLTD.js} +1 -1
- package/dist/{chunk-CW7WJZKR.js → chunk-MFLQRQQT.js} +1 -1
- package/dist/{chunk-PRKBO42R.js → chunk-MPW2YJWU.js} +1 -1
- package/dist/chunk-MQICT2LR.js +1 -0
- package/dist/{chunk-VYXVYOIJ.js → chunk-MZMYBFZQ.js} +1 -1
- package/dist/{chunk-ZZYFG22L.js → chunk-NADNFSKS.js} +1 -1
- package/dist/{chunk-5Y7GIF2W.js → chunk-NJOO5XJV.js} +1 -1
- package/dist/{chunk-ULQG3XQS.js → chunk-NNOSZ447.js} +1 -1
- package/dist/{chunk-WNGV4JQS.js → chunk-NWDP5IZ2.js} +1 -1
- package/dist/{chunk-R6JNXEB3.js → chunk-NY5OGHM5.js} +1 -1
- package/dist/chunk-O6KTFMCD.js +1 -0
- package/dist/{chunk-3BRUCKZ2.js → chunk-OAI7VSLW.js} +1 -1
- package/dist/{chunk-RAH5NW3R.js → chunk-OORCODNK.js} +1 -1
- package/dist/chunk-OQORDQLH.js +1 -0
- package/dist/{chunk-75VPUOC5.js → chunk-P2OI2P2M.js} +1 -1
- package/dist/{chunk-6AJZKIZ3.js → chunk-PETINPMX.js} +1 -1
- package/dist/{chunk-MZJRNFAU.js → chunk-PJYNAUQB.js} +1 -1
- package/dist/{chunk-HD5TYIDZ.js → chunk-PMXCJIBP.js} +1 -1
- package/dist/{chunk-K77WAKOB.js → chunk-POAICASX.js} +1 -1
- package/dist/chunk-PUAMSBXS.js +1 -0
- package/dist/{chunk-DERA4K6A.js → chunk-PZYP3MCL.js} +1 -1
- package/dist/chunk-Q7BOSHWX.js +7 -0
- package/dist/{chunk-K7K6GNF6.js → chunk-QJ7TI6CK.js} +1 -1
- package/dist/{chunk-M4V2OQAX.js → chunk-QMXKGSFH.js} +1 -1
- package/dist/chunk-QPN2M26G.js +1 -0
- package/dist/{chunk-UCLSPAVX.js → chunk-QS3FMN67.js} +1 -1
- package/dist/chunk-RF6NUGCU.js +1 -0
- package/dist/{chunk-5CH3B62S.js → chunk-RJ5VF3QY.js} +1 -1
- package/dist/{chunk-XX343DDG.js → chunk-RYGZCBO4.js} +1 -1
- package/dist/{chunk-U3ZG675O.js → chunk-SKLUHLS2.js} +1 -1
- package/dist/{chunk-F6T3UBBL.js → chunk-SP2WUATO.js} +1 -1
- package/dist/{chunk-QFWIDATO.js → chunk-STJ3LWFL.js} +1 -1
- package/dist/chunk-SWI3LCPE.js +7 -0
- package/dist/{chunk-6HZTMQD6.js → chunk-SXTDVUT3.js} +1 -1
- package/dist/{chunk-IWCPQD7X.js → chunk-T5GSCWN5.js} +1 -1
- package/dist/{chunk-3YWUSKWF.js → chunk-T6CC5WUU.js} +1 -1
- package/dist/{chunk-3TNEIDOD.js → chunk-T7KHS6RF.js} +1 -1
- package/dist/{chunk-E2YBU6D3.js → chunk-TC3JOEMA.js} +2 -2
- package/dist/{chunk-A6X2IVGT.js → chunk-TJGUNVRI.js} +1 -1
- package/dist/{chunk-6ZIOYXEF.js → chunk-TKG42KLM.js} +1 -1
- package/dist/{chunk-QYR5VPQA.js → chunk-TOLPNBZK.js} +1 -1
- package/dist/{chunk-6TORWTD7.js → chunk-TQUSREKP.js} +1 -1
- package/dist/chunk-TU47HMTL.js +1 -0
- package/dist/chunk-TYMYIUIQ.js +1 -0
- package/dist/{chunk-XP6IRAZN.js → chunk-U73TPLFE.js} +1 -1
- package/dist/{chunk-VEDZUOVI.js → chunk-UKK5P74A.js} +3 -3
- package/dist/chunk-UMT7DWR4.js +1 -0
- package/dist/{chunk-FD5S2O6M.js → chunk-UOHNRH6E.js} +1 -1
- package/dist/{chunk-ZR76GGZ6.js → chunk-UQWFDL3F.js} +1 -1
- package/dist/chunk-UUC5YKAS.js +2 -0
- package/dist/chunk-UYK6CXAU.js +1 -0
- package/dist/{chunk-7KJ5TBWG.js → chunk-V3RZ3DTW.js} +1 -1
- package/dist/{chunk-6TEXPRI2.js → chunk-V6ZSIUO3.js} +1 -1
- package/dist/{chunk-A3VYI4LO.js → chunk-VDN6MEYI.js} +3 -3
- package/dist/chunk-VE35YELD.js +1 -0
- package/dist/{chunk-6LK6ZP3Q.js → chunk-VFWWZMOQ.js} +1 -1
- package/dist/{chunk-VBUZWRUL.js → chunk-VJEKDBGZ.js} +1 -1
- package/dist/chunk-VKWPEFWQ.js +1 -0
- package/dist/{chunk-7BFDUVOG.js → chunk-VOJWKGCW.js} +1 -1
- package/dist/{chunk-LTWXTDDR.js → chunk-VQW35HIQ.js} +1 -1
- package/dist/chunk-VUMUCNI7.js +1 -0
- package/dist/{chunk-2VLMN5QZ.js → chunk-WAGAC3YI.js} +1 -1
- package/dist/chunk-WKBVT5WG.js +1 -0
- package/dist/chunk-WLO5H255.js +3 -0
- package/dist/chunk-WNWQSHEC.js +10 -0
- package/dist/{chunk-6YAXFS6V.js → chunk-WRRUFK4Y.js} +1 -1
- package/dist/{chunk-SSM346XI.js → chunk-WVHB2HCQ.js} +1 -1
- package/dist/{chunk-MOA33ZFO.js → chunk-WW7TENNA.js} +1 -1
- package/dist/chunk-WZVQHMGI.js +1 -0
- package/dist/{chunk-NPM3MFB3.js → chunk-X4DIJTIK.js} +1 -1
- package/dist/{chunk-42RMKTCJ.js → chunk-XH6ZP7M5.js} +1 -1
- package/dist/{chunk-23AMFHXC.js → chunk-XV3I45NA.js} +1 -1
- package/dist/{chunk-PSQFZAF3.js → chunk-XWPPBOGF.js} +1 -1
- package/dist/{chunk-MIO2CV3Q.js → chunk-Y3WIZSRU.js} +1 -1
- package/dist/{chunk-INFBVFMU.js → chunk-Y66GQ6V2.js} +1 -1
- package/dist/{chunk-IVGWFPMA.js → chunk-YGKQCEVG.js} +1 -1
- package/dist/{chunk-4Z2WYNTE.js → chunk-YLGSM42I.js} +1 -1
- package/dist/{chunk-TXUTT6UA.js → chunk-YQH2JHFA.js} +1 -1
- package/dist/{chunk-QTGMS62F.js → chunk-YYL356OX.js} +1 -1
- package/dist/chunk-Z4LC3WE5.js +7 -0
- package/dist/{chunk-OA4P6AKS.js → chunk-Z74QYLNC.js} +1 -1
- package/dist/{chunk-DCK2FX6J.js → chunk-ZAMDXIVC.js} +1 -1
- package/dist/{chunk-4LNCYIS3.js → chunk-ZDF5N422.js} +1 -1
- package/dist/{chunk-RL5BWZ7D.js → chunk-ZEENHLSC.js} +2 -2
- package/dist/{chunk-T4M5CWAO.js → chunk-ZG7BVVT2.js} +1 -1
- package/dist/{chunk-NKQBEFPS.js → chunk-ZI7LK3LW.js} +1 -1
- package/dist/{chunk-UOQQNAHX.js → chunk-ZIREP3EZ.js} +1 -1
- package/dist/chunk-ZIXWWU2N.js +275 -0
- package/dist/{chunk-NXL6LDJU.js → chunk-ZQ5JVD5X.js} +1 -1
- package/dist/{chunk-FGVC22EY.js → chunk-ZULTG2D2.js} +1 -1
- package/dist/{chunk-F47MFBKM.js → chunk-ZZFZBFVM.js} +1 -1
- package/dist/cli/commands/app/app-logs/sources.js +1 -1
- package/dist/cli/commands/app/build.js +1 -1
- package/dist/cli/commands/app/bulk/cancel.js +1 -1
- package/dist/cli/commands/app/bulk/execute.js +1 -1
- package/dist/cli/commands/app/bulk/status.js +1 -1
- package/dist/cli/commands/app/config/link.js +1 -1
- package/dist/cli/commands/app/config/pull.js +1 -1
- package/dist/cli/commands/app/config/use.js +1 -1
- package/dist/cli/commands/app/config/validate.js +1 -1
- package/dist/cli/commands/app/demo/watcher.js +1 -1
- package/dist/cli/commands/app/deploy.js +1 -1
- package/dist/cli/commands/app/dev/clean.js +1 -1
- package/dist/cli/commands/app/dev.js +1 -1
- package/dist/cli/commands/app/env/pull.js +1 -1
- package/dist/cli/commands/app/env/show.js +1 -1
- package/dist/cli/commands/app/execute.js +1 -1
- package/dist/cli/commands/app/function/build.js +1 -1
- package/dist/cli/commands/app/function/info.js +1 -1
- package/dist/cli/commands/app/function/replay.js +1 -1
- package/dist/cli/commands/app/function/run.js +1 -1
- package/dist/cli/commands/app/function/schema.js +1 -1
- package/dist/cli/commands/app/function/typegen.js +1 -1
- package/dist/cli/commands/app/generate/extension.js +1 -1
- package/dist/cli/commands/app/graphiql.js +1 -0
- package/dist/cli/commands/app/import-custom-data-definitions.js +1 -1
- package/dist/cli/commands/app/import-extensions.js +1 -1
- package/dist/cli/commands/app/info.js +1 -1
- package/dist/cli/commands/app/init.js +1 -1
- package/dist/cli/commands/app/logs.js +1 -1
- package/dist/cli/commands/app/release.js +1 -1
- package/dist/cli/commands/app/versions/list.js +1 -1
- package/dist/cli/commands/app/webhook/trigger.js +1 -1
- package/dist/cli/commands/auth/login.js +1 -1
- package/dist/cli/commands/auth/logout.js +1 -1
- package/dist/cli/commands/cache/clear.js +1 -1
- package/dist/cli/commands/config/autoupgrade/constants.js +1 -1
- package/dist/cli/commands/config/autoupgrade/off.js +1 -1
- package/dist/cli/commands/config/autoupgrade/on.js +1 -1
- package/dist/cli/commands/config/autoupgrade/status.js +1 -1
- package/dist/cli/commands/debug/command-flags.js +1 -1
- package/dist/cli/commands/doc/fetch.d.ts +12 -0
- package/dist/cli/commands/doc/fetch.js +1 -0
- package/dist/cli/commands/doc/search.d.ts +13 -0
- package/dist/cli/commands/doc/search.js +1 -0
- package/dist/cli/commands/docs/generate.js +1 -1
- package/dist/cli/commands/doctor-release/doctor-release.js +1 -1
- package/dist/cli/commands/doctor-release/theme/index.js +1 -1
- package/dist/cli/commands/help.js +1 -1
- package/dist/cli/commands/kitchen-sink/async.js +1 -1
- package/dist/cli/commands/kitchen-sink/index.js +1 -1
- package/dist/cli/commands/kitchen-sink/prompts.js +1 -1
- package/dist/cli/commands/kitchen-sink/static.js +1 -1
- package/dist/cli/commands/notifications/generate.js +1 -1
- package/dist/cli/commands/notifications/list.js +1 -1
- package/dist/cli/commands/organization/list.js +1 -1
- package/dist/cli/commands/search.d.ts +4 -0
- package/dist/cli/commands/search.js +1 -1
- package/dist/cli/commands/theme/check.js +1 -1
- package/dist/cli/commands/theme/console.js +1 -1
- package/dist/cli/commands/theme/delete.js +1 -1
- package/dist/cli/commands/theme/dev.js +1 -1
- package/dist/cli/commands/theme/duplicate.js +1 -1
- package/dist/cli/commands/theme/info.js +1 -1
- package/dist/cli/commands/theme/init.js +1 -1
- package/dist/cli/commands/theme/language-server.js +1 -1
- package/dist/cli/commands/theme/list.js +1 -1
- package/dist/cli/commands/theme/metafields/pull.js +1 -1
- package/dist/cli/commands/theme/open.js +1 -1
- package/dist/cli/commands/theme/package.js +1 -1
- package/dist/cli/commands/theme/preview.js +1 -1
- package/dist/cli/commands/theme/profile.js +1 -1
- package/dist/cli/commands/theme/publish.js +1 -1
- package/dist/cli/commands/theme/pull.js +1 -1
- package/dist/cli/commands/theme/push.js +1 -1
- package/dist/cli/commands/theme/rename.js +1 -1
- package/dist/cli/commands/theme/share.js +1 -1
- package/dist/cli/commands/upgrade.js +1 -1
- package/dist/cli/commands/version.js +1 -1
- package/dist/cli/help.d.ts +38 -0
- package/dist/cli/help.js +2 -0
- package/dist/cli/services/commands/doc/fetch.d.ts +1 -0
- package/dist/cli/services/commands/doc/fetch.js +45 -0
- package/dist/cli/services/commands/doc/search.d.ts +1 -0
- package/dist/cli/services/commands/doc/search.js +47 -0
- package/dist/command-registry.js +1 -1
- package/dist/{conf-store-6QNH5BID.js → conf-store-C2LOYIOU.js} +1 -1
- package/dist/{custom-oclif-loader-TSPWW5YF.js → custom-oclif-loader-3AICQCNU.js} +1 -1
- package/dist/deprecations-QOHE6JG6.js +1 -0
- package/dist/{devtools-HCKYP7DQ.js → devtools-37DE4MUR.js} +1 -1
- package/dist/{devtools-VEZNCV6W.js → devtools-WAWU5KQL.js} +1 -1
- package/dist/dist-FF6C4ZHS.js +1 -0
- package/dist/dist-Q676YGVI.js +1 -0
- package/dist/environments-EGD263DV.js +1 -0
- package/dist/error-66U2HJ37.js +1 -0
- package/dist/error-handler-SW2ALZ5Z.js +1 -0
- package/dist/{estree-BYYJYS3A.js → estree-JV5M77BA.js} +1 -1
- package/dist/{flow-M3Q2HPQT.js → flow-N4JYPYMQ.js} +1 -1
- package/dist/{fs-YMUQ6JLE.js → fs-JPQRUGZI.js} +1 -1
- package/dist/{glimmer-3DEJJGOJ.js → glimmer-JEV3BXHR.js} +1 -1
- package/dist/{graphql-A4HHE3MB.js → graphql-DTF6MHYF.js} +1 -1
- package/dist/hooks/app-init.js +1 -1
- package/dist/hooks/did-you-mean.js +1 -1
- package/dist/hooks/hydrogen-init.js +1 -1
- package/dist/hooks/plugin-plugins.js +1 -1
- package/dist/hooks/postrun.js +1 -1
- package/dist/hooks/prerun.js +1 -1
- package/dist/hooks/public-metadata.js +1 -1
- package/dist/hooks/sensitive-metadata.js +1 -1
- package/dist/hooks/tunnel-provider.js +1 -1
- package/dist/hooks/tunnel-start.js +1 -1
- package/dist/{html-HETICZ2F.js → html-LVOJ3RQS.js} +1 -1
- package/dist/{http-proxy-node16-Q5DZMBHC.js → http-proxy-node16-X2WAMUT5.js} +1 -1
- package/dist/index.js +41 -7
- package/dist/is-global-QWTDUPNR.js +1 -0
- package/dist/{is-wsl-TN2CXYI7.js → is-wsl-UEMXYJPN.js} +1 -1
- package/dist/{latest-version-6OAYLOBL.js → latest-version-32HXMWJ7.js} +1 -1
- package/dist/lib-NOROGV6N.js +1 -0
- package/dist/lib-O5EZ4NVT.js +1 -0
- package/dist/lib-QJDPPAWN.js +1 -0
- package/dist/lib-UCG2DNMS.js +1 -0
- package/dist/{local-GPDAXHE6.js → local-FRYN3NWL.js} +1 -1
- package/dist/local-storage-DFH3LT5G.js +1 -0
- package/dist/{markdown-5TVCXM53.js → markdown-J6CE6POI.js} +1 -1
- package/dist/{meriyah-23OZNYWC.js → meriyah-PNQQZQYI.js} +1 -1
- package/dist/metadata-KZVLHQII.js +1 -0
- package/dist/{morph-I35VYPBH.js → morph-CG6HEMCQ.js} +4 -4
- package/dist/{multipart-parser-Q4QJZK3V.js → multipart-parser-5NSSTW27.js} +1 -1
- package/dist/{node-package-manager-GO4ZRTKQ.js → node-package-manager-LVFBY4LY.js} +1 -1
- package/dist/notifications-system-DP443VTE.js +1 -0
- package/dist/{npa-VNALV7XY.js → npa-A4YSCQ5Q.js} +1 -1
- package/dist/{open-VA7TLUIL.js → open-KLSGXBIW.js} +1 -1
- package/dist/out-CDCY25QC.js +1 -0
- package/dist/{output-7IYOMPSA.js → output-NH4I5Y3C.js} +1 -1
- package/dist/{path-CWUNINMX.js → path-MBXP7ZIC.js} +1 -1
- package/dist/{postcss-IIK6CGAW.js → postcss-Q36SHOML.js} +1 -1
- package/dist/{prettier-ZSBNNQTK.js → prettier-6ZMB2MMO.js} +1 -1
- package/dist/{source-map-3K6Y2OMO.js → source-map-E7FCCJL7.js} +1 -1
- package/dist/system-GNOF6HMI.js +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/typescript-5R4Y7PXE.js +1 -0
- package/dist/{typescript-YKZ232QT.js → typescript-WYPDGPSV.js} +1 -1
- package/dist/ui-QOGKADWB.js +1 -0
- package/dist/upgrade-K4S6JW64.js +1 -0
- package/dist/version-FJFTTOZU.js +1 -0
- package/dist/version-ZI4GZX72.js +1 -0
- package/dist/{workerd-ST6XJKUN.js → workerd-U6WWWY73.js} +1 -1
- package/dist/{yaml-SJKIH3VD.js → yaml-6KWCJ64X.js} +1 -1
- package/oclif.manifest.json +964 -74
- package/package.json +19 -9
- package/dist/analytics-CX22YIUZ.js +0 -1
- package/dist/analytics-UBWQIQYF.js +0 -1
- package/dist/assets/hydrogen/starter/app/routes/api.$version.[graphql.json].tsx +0 -14
- package/dist/chunk-2YXKZWYW.js +0 -1
- package/dist/chunk-4V4DQ6W7.js +0 -836
- package/dist/chunk-4ZGSSQC6.js +0 -1
- package/dist/chunk-6SXOUZ7V.js +0 -1
- package/dist/chunk-ATPFTRCC.js +0 -1
- package/dist/chunk-AWQ5AR2K.js +0 -5
- package/dist/chunk-BHWEA4V2.js +0 -1
- package/dist/chunk-BPVZ7E63.js +0 -1
- package/dist/chunk-CCEA5CUX.js +0 -1
- package/dist/chunk-D3DDLLNF.js +0 -2
- package/dist/chunk-FP2NOZSD.js +0 -1
- package/dist/chunk-FSTCEWXX.js +0 -1
- package/dist/chunk-HHXHOQQP.js +0 -3
- package/dist/chunk-HSYRYSX4.js +0 -3
- package/dist/chunk-HZA6IAA4.js +0 -1
- package/dist/chunk-I3LX25MB.js +0 -1
- package/dist/chunk-IOQQUHST.js +0 -18
- package/dist/chunk-IWE4RUI7.js +0 -1
- package/dist/chunk-K3PGC6DC.js +0 -1
- package/dist/chunk-KFCGMT67.js +0 -1
- package/dist/chunk-KLA7AWG6.js +0 -7
- package/dist/chunk-KQU6HOJ3.js +0 -1
- package/dist/chunk-MA52QGHP.js +0 -1
- package/dist/chunk-N5ROZKPZ.js +0 -1
- package/dist/chunk-NEZEHBT2.js +0 -1
- package/dist/chunk-NP4UFPAX.js +0 -9
- package/dist/chunk-OKOYLEA7.js +0 -278
- package/dist/chunk-OLOBQ42K.js +0 -1
- package/dist/chunk-PBTXPBI6.js +0 -18
- package/dist/chunk-PLQFX5ZP.js +0 -9
- package/dist/chunk-PUTZFF2Z.js +0 -613
- package/dist/chunk-RVMB5LC2.js +0 -1
- package/dist/chunk-T5MK7ZSF.js +0 -1
- package/dist/chunk-UOQ75BL3.js +0 -1
- package/dist/chunk-UWJ73J4B.js +0 -1
- package/dist/chunk-VPRTJUIN.js +0 -1
- package/dist/chunk-VT77EFRL.js +0 -10
- package/dist/chunk-WCWNI3ZV.js +0 -283
- package/dist/chunk-X4CV6TRE.js +0 -1
- package/dist/chunk-XEFQQPL4.js +0 -1
- package/dist/chunk-XFKCDWXB.js +0 -5
- package/dist/chunk-YJB7P2HC.js +0 -1
- package/dist/chunk-YOZNRLFC.js +0 -1
- package/dist/deprecations-F6JWVV2W.js +0 -1
- package/dist/dist-4BD6KOLR.js +0 -1
- package/dist/dist-AUABCVPI.js +0 -1
- package/dist/environments-RGLI75HN.js +0 -1
- package/dist/error-OZALZZ3U.js +0 -1
- package/dist/error-handler-V7LSEXHM.js +0 -1
- package/dist/is-global-BLIZ57HQ.js +0 -1
- package/dist/lib-AK5EOIKR.js +0 -1
- package/dist/lib-LVUMLZ4H.js +0 -1
- package/dist/lib-ME6554NA.js +0 -1
- package/dist/lib-WU3FEA6I.js +0 -1
- package/dist/local-storage-P66KJG6I.js +0 -1
- package/dist/metadata-TRH25EHU.js +0 -1
- package/dist/notifications-system-HM6JZ6WJ.js +0 -1
- package/dist/out-WLY6KV4B.js +0 -1
- package/dist/system-X5C4EQQH.js +0 -1
- package/dist/typescript-K5CWIA4V.js +0 -1
- package/dist/ui-H62CMRLG.js +0 -1
- package/dist/upgrade-EEOPH464.js +0 -1
- package/dist/version-76NBQR4K.js +0 -1
- package/dist/version-IGSEISUA.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {useOptimisticCart
|
|
1
|
+
import {useOptimisticCart} from '@shopify/hydrogen';
|
|
2
2
|
import {Link} from 'react-router';
|
|
3
3
|
import type {CartApiQueryFragment} from 'storefrontapi.generated';
|
|
4
4
|
import {useAside} from '~/components/Aside';
|
|
@@ -23,8 +23,8 @@ function getLineItemChildrenMap(lines: CartLine[]): LineItemChildrenMap {
|
|
|
23
23
|
children[parentId].push(line);
|
|
24
24
|
}
|
|
25
25
|
if ('lineComponents' in line) {
|
|
26
|
-
const
|
|
27
|
-
for (const [parentId, childIds] of Object.entries(
|
|
26
|
+
const lineChildren = getLineItemChildrenMap(line.lineComponents);
|
|
27
|
+
for (const [parentId, childIds] of Object.entries(lineChildren)) {
|
|
28
28
|
if (!children[parentId]) children[parentId] = [];
|
|
29
29
|
children[parentId].push(...childIds);
|
|
30
30
|
}
|
|
@@ -50,7 +50,10 @@ export function CartMain({layout, cart: originalCart}: CartMainProps) {
|
|
|
50
50
|
const childrenMap = getLineItemChildrenMap(cart?.lines?.nodes ?? []);
|
|
51
51
|
|
|
52
52
|
return (
|
|
53
|
-
<
|
|
53
|
+
<section
|
|
54
|
+
className={className}
|
|
55
|
+
aria-label={layout === 'page' ? 'Cart page' : 'Cart drawer'}
|
|
56
|
+
>
|
|
54
57
|
<CartEmpty hidden={linesCount} layout={layout} />
|
|
55
58
|
<div className="cart-details">
|
|
56
59
|
<p id="cart-lines" className="sr-only">
|
|
@@ -79,7 +82,7 @@ export function CartMain({layout, cart: originalCart}: CartMainProps) {
|
|
|
79
82
|
</div>
|
|
80
83
|
{cartHasItems && <CartSummary cart={cart} layout={layout} />}
|
|
81
84
|
</div>
|
|
82
|
-
</
|
|
85
|
+
</section>
|
|
83
86
|
);
|
|
84
87
|
}
|
|
85
88
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type {CartApiQueryFragment} from 'storefrontapi.generated';
|
|
2
2
|
import type {CartLayout} from '~/components/CartMain';
|
|
3
3
|
import {CartForm, Money, type OptimisticCart} from '@shopify/hydrogen';
|
|
4
|
-
import {useEffect, useRef} from 'react';
|
|
4
|
+
import {useEffect, useId, useRef, useState} from 'react';
|
|
5
5
|
import {useFetcher} from 'react-router';
|
|
6
6
|
|
|
7
7
|
type CartSummaryProps = {
|
|
@@ -12,11 +12,16 @@ type CartSummaryProps = {
|
|
|
12
12
|
export function CartSummary({cart, layout}: CartSummaryProps) {
|
|
13
13
|
const className =
|
|
14
14
|
layout === 'page' ? 'cart-summary-page' : 'cart-summary-aside';
|
|
15
|
+
const summaryId = useId();
|
|
16
|
+
const discountsHeadingId = useId();
|
|
17
|
+
const discountCodeInputId = useId();
|
|
18
|
+
const giftCardHeadingId = useId();
|
|
19
|
+
const giftCardInputId = useId();
|
|
15
20
|
|
|
16
21
|
return (
|
|
17
|
-
<div aria-labelledby=
|
|
18
|
-
<h4>Totals</h4>
|
|
19
|
-
<dl className="cart-subtotal">
|
|
22
|
+
<div aria-labelledby={summaryId} className={className}>
|
|
23
|
+
<h4 id={summaryId}>Totals</h4>
|
|
24
|
+
<dl role="group" className="cart-subtotal">
|
|
20
25
|
<dt>Subtotal</dt>
|
|
21
26
|
<dd>
|
|
22
27
|
{cart?.cost?.subtotalAmount?.amount ? (
|
|
@@ -26,8 +31,16 @@ export function CartSummary({cart, layout}: CartSummaryProps) {
|
|
|
26
31
|
)}
|
|
27
32
|
</dd>
|
|
28
33
|
</dl>
|
|
29
|
-
<CartDiscounts
|
|
30
|
-
|
|
34
|
+
<CartDiscounts
|
|
35
|
+
discountCodes={cart?.discountCodes}
|
|
36
|
+
discountsHeadingId={discountsHeadingId}
|
|
37
|
+
discountCodeInputId={discountCodeInputId}
|
|
38
|
+
/>
|
|
39
|
+
<CartGiftCard
|
|
40
|
+
giftCardCodes={cart?.appliedGiftCards}
|
|
41
|
+
giftCardHeadingId={giftCardHeadingId}
|
|
42
|
+
giftCardInputId={giftCardInputId}
|
|
43
|
+
/>
|
|
31
44
|
<CartCheckoutActions checkoutUrl={cart?.checkoutUrl} />
|
|
32
45
|
</div>
|
|
33
46
|
);
|
|
@@ -48,8 +61,12 @@ function CartCheckoutActions({checkoutUrl}: {checkoutUrl?: string}) {
|
|
|
48
61
|
|
|
49
62
|
function CartDiscounts({
|
|
50
63
|
discountCodes,
|
|
64
|
+
discountsHeadingId,
|
|
65
|
+
discountCodeInputId,
|
|
51
66
|
}: {
|
|
52
67
|
discountCodes?: CartApiQueryFragment['discountCodes'];
|
|
68
|
+
discountsHeadingId: string;
|
|
69
|
+
discountCodeInputId: string;
|
|
53
70
|
}) {
|
|
54
71
|
const codes: string[] =
|
|
55
72
|
discountCodes
|
|
@@ -57,13 +74,17 @@ function CartDiscounts({
|
|
|
57
74
|
?.map(({code}) => code) || [];
|
|
58
75
|
|
|
59
76
|
return (
|
|
60
|
-
<
|
|
77
|
+
<section aria-label="Discounts">
|
|
61
78
|
{/* Have existing discount, display it with a remove option */}
|
|
62
79
|
<dl hidden={!codes.length}>
|
|
63
80
|
<div>
|
|
64
|
-
<dt>
|
|
81
|
+
<dt id={discountsHeadingId}>Discounts</dt>
|
|
65
82
|
<UpdateDiscountForm>
|
|
66
|
-
<div
|
|
83
|
+
<div
|
|
84
|
+
className="cart-discount"
|
|
85
|
+
role="group"
|
|
86
|
+
aria-labelledby={discountsHeadingId}
|
|
87
|
+
>
|
|
67
88
|
<code>{codes?.join(', ')}</code>
|
|
68
89
|
|
|
69
90
|
<button type="submit" aria-label="Remove discount">
|
|
@@ -77,11 +98,11 @@ function CartDiscounts({
|
|
|
77
98
|
{/* Show an input to apply a discount */}
|
|
78
99
|
<UpdateDiscountForm discountCodes={codes}>
|
|
79
100
|
<div>
|
|
80
|
-
<label htmlFor=
|
|
101
|
+
<label htmlFor={discountCodeInputId} className="sr-only">
|
|
81
102
|
Discount code
|
|
82
103
|
</label>
|
|
83
104
|
<input
|
|
84
|
-
id=
|
|
105
|
+
id={discountCodeInputId}
|
|
85
106
|
type="text"
|
|
86
107
|
name="discountCode"
|
|
87
108
|
placeholder="Discount code"
|
|
@@ -92,7 +113,7 @@ function CartDiscounts({
|
|
|
92
113
|
</button>
|
|
93
114
|
</div>
|
|
94
115
|
</UpdateDiscountForm>
|
|
95
|
-
</
|
|
116
|
+
</section>
|
|
96
117
|
);
|
|
97
118
|
}
|
|
98
119
|
|
|
@@ -118,52 +139,110 @@ function UpdateDiscountForm({
|
|
|
118
139
|
|
|
119
140
|
function CartGiftCard({
|
|
120
141
|
giftCardCodes,
|
|
142
|
+
giftCardHeadingId,
|
|
143
|
+
giftCardInputId,
|
|
121
144
|
}: {
|
|
122
145
|
giftCardCodes: CartApiQueryFragment['appliedGiftCards'] | undefined;
|
|
146
|
+
giftCardHeadingId: string;
|
|
147
|
+
giftCardInputId: string;
|
|
123
148
|
}) {
|
|
124
149
|
const giftCardCodeInput = useRef<HTMLInputElement>(null);
|
|
150
|
+
const removeButtonRefs = useRef<Map<string, HTMLButtonElement>>(new Map());
|
|
151
|
+
const previousCardIdsRef = useRef<string[]>([]);
|
|
125
152
|
const giftCardAddFetcher = useFetcher({key: 'gift-card-add'});
|
|
153
|
+
const [removedCardIndex, setRemovedCardIndex] = useState<number | null>(null);
|
|
126
154
|
|
|
127
155
|
useEffect(() => {
|
|
128
156
|
if (giftCardAddFetcher.data) {
|
|
129
|
-
giftCardCodeInput.current
|
|
157
|
+
if (giftCardCodeInput.current !== null) {
|
|
158
|
+
giftCardCodeInput.current.value = '';
|
|
159
|
+
}
|
|
130
160
|
}
|
|
131
161
|
}, [giftCardAddFetcher.data]);
|
|
132
162
|
|
|
163
|
+
useEffect(() => {
|
|
164
|
+
const currentCardIds = giftCardCodes?.map((card) => card.id) || [];
|
|
165
|
+
|
|
166
|
+
if (removedCardIndex !== null && giftCardCodes) {
|
|
167
|
+
const focusTargetIndex = Math.min(
|
|
168
|
+
removedCardIndex,
|
|
169
|
+
giftCardCodes.length - 1,
|
|
170
|
+
);
|
|
171
|
+
const focusTargetCard = giftCardCodes[focusTargetIndex];
|
|
172
|
+
const focusButton = focusTargetCard
|
|
173
|
+
? removeButtonRefs.current.get(focusTargetCard.id)
|
|
174
|
+
: null;
|
|
175
|
+
|
|
176
|
+
if (focusButton) {
|
|
177
|
+
focusButton.focus();
|
|
178
|
+
} else if (giftCardCodeInput.current) {
|
|
179
|
+
giftCardCodeInput.current.focus();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
setRemovedCardIndex(null);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
previousCardIdsRef.current = currentCardIds;
|
|
186
|
+
}, [giftCardCodes, removedCardIndex]);
|
|
187
|
+
|
|
188
|
+
const handleRemoveClick = (cardId: string) => {
|
|
189
|
+
const index = previousCardIdsRef.current.indexOf(cardId);
|
|
190
|
+
if (index !== -1) {
|
|
191
|
+
setRemovedCardIndex(index);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
|
|
133
195
|
return (
|
|
134
|
-
<
|
|
196
|
+
<section aria-label="Gift cards">
|
|
135
197
|
{giftCardCodes && giftCardCodes.length > 0 && (
|
|
136
198
|
<dl>
|
|
137
|
-
<dt>Applied Gift Card(s)</dt>
|
|
199
|
+
<dt id={giftCardHeadingId}>Applied Gift Card(s)</dt>
|
|
138
200
|
{giftCardCodes.map((giftCard) => (
|
|
139
|
-
<
|
|
140
|
-
<
|
|
201
|
+
<dd key={giftCard.id} className="cart-discount">
|
|
202
|
+
<RemoveGiftCardForm
|
|
203
|
+
giftCardId={giftCard.id}
|
|
204
|
+
lastCharacters={giftCard.lastCharacters}
|
|
205
|
+
onRemoveClick={() => handleRemoveClick(giftCard.id)}
|
|
206
|
+
buttonRef={(el: HTMLButtonElement | null) => {
|
|
207
|
+
if (el) {
|
|
208
|
+
removeButtonRefs.current.set(giftCard.id, el);
|
|
209
|
+
} else {
|
|
210
|
+
removeButtonRefs.current.delete(giftCard.id);
|
|
211
|
+
}
|
|
212
|
+
}}
|
|
213
|
+
>
|
|
141
214
|
<code>***{giftCard.lastCharacters}</code>
|
|
142
215
|
|
|
143
216
|
<Money data={giftCard.amountUsed} />
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
</div>
|
|
147
|
-
</RemoveGiftCardForm>
|
|
217
|
+
</RemoveGiftCardForm>
|
|
218
|
+
</dd>
|
|
148
219
|
))}
|
|
149
220
|
</dl>
|
|
150
221
|
)}
|
|
151
222
|
|
|
152
223
|
<AddGiftCardForm fetcherKey="gift-card-add">
|
|
153
224
|
<div>
|
|
225
|
+
<label htmlFor={giftCardInputId} className="sr-only">
|
|
226
|
+
Gift card code
|
|
227
|
+
</label>
|
|
154
228
|
<input
|
|
229
|
+
id={giftCardInputId}
|
|
155
230
|
type="text"
|
|
156
231
|
name="giftCardCode"
|
|
157
232
|
placeholder="Gift card code"
|
|
158
233
|
ref={giftCardCodeInput}
|
|
159
234
|
/>
|
|
160
235
|
|
|
161
|
-
<button
|
|
236
|
+
<button
|
|
237
|
+
type="submit"
|
|
238
|
+
disabled={giftCardAddFetcher.state !== 'idle'}
|
|
239
|
+
aria-label="Apply gift card code"
|
|
240
|
+
>
|
|
162
241
|
Apply
|
|
163
242
|
</button>
|
|
164
243
|
</div>
|
|
165
244
|
</AddGiftCardForm>
|
|
166
|
-
</
|
|
245
|
+
</section>
|
|
167
246
|
);
|
|
168
247
|
}
|
|
169
248
|
|
|
@@ -187,10 +266,16 @@ function AddGiftCardForm({
|
|
|
187
266
|
|
|
188
267
|
function RemoveGiftCardForm({
|
|
189
268
|
giftCardId,
|
|
269
|
+
lastCharacters,
|
|
190
270
|
children,
|
|
271
|
+
onRemoveClick,
|
|
272
|
+
buttonRef,
|
|
191
273
|
}: {
|
|
192
274
|
giftCardId: string;
|
|
275
|
+
lastCharacters: string;
|
|
193
276
|
children: React.ReactNode;
|
|
277
|
+
onRemoveClick?: () => void;
|
|
278
|
+
buttonRef?: (el: HTMLButtonElement | null) => void;
|
|
194
279
|
}) {
|
|
195
280
|
return (
|
|
196
281
|
<CartForm
|
|
@@ -201,6 +286,15 @@ function RemoveGiftCardForm({
|
|
|
201
286
|
}}
|
|
202
287
|
>
|
|
203
288
|
{children}
|
|
289
|
+
|
|
290
|
+
<button
|
|
291
|
+
type="submit"
|
|
292
|
+
aria-label={`Remove gift card ending in ${lastCharacters}`}
|
|
293
|
+
onClick={onRemoveClick}
|
|
294
|
+
ref={buttonRef}
|
|
295
|
+
>
|
|
296
|
+
Remove
|
|
297
|
+
</button>
|
|
204
298
|
</CartForm>
|
|
205
299
|
);
|
|
206
300
|
}
|
|
@@ -136,7 +136,7 @@ function SearchToggle() {
|
|
|
136
136
|
);
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
-
function CartBadge({count}: {count: number
|
|
139
|
+
function CartBadge({count}: {count: number}) {
|
|
140
140
|
const {open} = useAside();
|
|
141
141
|
const {publish, shop, cart, prevCart} = useAnalytics();
|
|
142
142
|
|
|
@@ -154,14 +154,14 @@ function CartBadge({count}: {count: number | null}) {
|
|
|
154
154
|
} as CartViewPayload);
|
|
155
155
|
}}
|
|
156
156
|
>
|
|
157
|
-
Cart
|
|
157
|
+
Cart <span aria-label={`(items: ${count})`}>{count}</span>
|
|
158
158
|
</a>
|
|
159
159
|
);
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
function CartToggle({cart}: Pick<HeaderProps, 'cart'>) {
|
|
163
163
|
return (
|
|
164
|
-
<Suspense fallback={<CartBadge count={
|
|
164
|
+
<Suspense fallback={<CartBadge count={0} />}>
|
|
165
165
|
<Await resolve={cart}>
|
|
166
166
|
<CartBanner />
|
|
167
167
|
</Await>
|
|
@@ -2,15 +2,17 @@ import * as React from 'react';
|
|
|
2
2
|
import {Pagination} from '@shopify/hydrogen';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* <PaginatedResourceSection
|
|
5
|
+
* <PaginatedResourceSection> encapsulates the previous and next pagination behaviors throughout your application.
|
|
6
6
|
*/
|
|
7
7
|
export function PaginatedResourceSection<NodesType>({
|
|
8
8
|
connection,
|
|
9
9
|
children,
|
|
10
|
+
ariaLabel,
|
|
10
11
|
resourcesClassName,
|
|
11
12
|
}: {
|
|
12
13
|
connection: React.ComponentProps<typeof Pagination<NodesType>>['connection'];
|
|
13
14
|
children: React.FunctionComponent<{node: NodesType; index: number}>;
|
|
15
|
+
ariaLabel?: string;
|
|
14
16
|
resourcesClassName?: string;
|
|
15
17
|
}) {
|
|
16
18
|
return (
|
|
@@ -23,15 +25,33 @@ export function PaginatedResourceSection<NodesType>({
|
|
|
23
25
|
return (
|
|
24
26
|
<div>
|
|
25
27
|
<PreviousLink>
|
|
26
|
-
{isLoading ?
|
|
28
|
+
{isLoading ? (
|
|
29
|
+
'Loading...'
|
|
30
|
+
) : (
|
|
31
|
+
<span>
|
|
32
|
+
<span aria-hidden="true">↑</span> Load previous
|
|
33
|
+
</span>
|
|
34
|
+
)}
|
|
27
35
|
</PreviousLink>
|
|
28
36
|
{resourcesClassName ? (
|
|
29
|
-
<div
|
|
37
|
+
<div
|
|
38
|
+
aria-label={ariaLabel}
|
|
39
|
+
className={resourcesClassName}
|
|
40
|
+
role={ariaLabel ? 'region' : undefined}
|
|
41
|
+
>
|
|
42
|
+
{resourcesMarkup}
|
|
43
|
+
</div>
|
|
30
44
|
) : (
|
|
31
45
|
resourcesMarkup
|
|
32
46
|
)}
|
|
33
47
|
<NextLink>
|
|
34
|
-
{isLoading ?
|
|
48
|
+
{isLoading ? (
|
|
49
|
+
'Loading...'
|
|
50
|
+
) : (
|
|
51
|
+
<span>
|
|
52
|
+
Load more <span aria-hidden="true">↓</span>
|
|
53
|
+
</span>
|
|
54
|
+
)}
|
|
35
55
|
</NextLink>
|
|
36
56
|
</div>
|
|
37
57
|
);
|
|
@@ -9,7 +9,7 @@ export function ProductPrice({
|
|
|
9
9
|
compareAtPrice?: MoneyV2 | null;
|
|
10
10
|
}) {
|
|
11
11
|
return (
|
|
12
|
-
<div className="product-price">
|
|
12
|
+
<div aria-label="Price" className="product-price" role="group">
|
|
13
13
|
{compareAtPrice ? (
|
|
14
14
|
<div className="product-price-on-sale">
|
|
15
15
|
{price ? <Money data={price} /> : null}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {createHydrogenContext} from '@shopify/hydrogen';
|
|
2
2
|
import {AppSession} from '~/lib/session';
|
|
3
3
|
import {CART_QUERY_FRAGMENT} from '~/lib/fragments';
|
|
4
|
+
import type {CartApiQueryFragment} from 'storefrontapi.generated';
|
|
4
5
|
|
|
5
6
|
// Define the additional context object
|
|
6
7
|
const additionalContext = {
|
|
@@ -16,6 +17,10 @@ type AdditionalContextType = typeof additionalContext;
|
|
|
16
17
|
|
|
17
18
|
declare global {
|
|
18
19
|
interface HydrogenAdditionalContext extends AdditionalContextType {}
|
|
20
|
+
|
|
21
|
+
// Augment HydrogenCustomCartFragment with the codegen'd cart fragment type so
|
|
22
|
+
// that context.cart.get() and all cart mutations return the extended cart type.
|
|
23
|
+
interface HydrogenCustomCartFragment extends CartApiQueryFragment {}
|
|
19
24
|
}
|
|
20
25
|
|
|
21
26
|
/**
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import type {Route} from './+types/[robots.txt]';
|
|
2
|
-
import {parseGid} from '@shopify/hydrogen';
|
|
3
2
|
|
|
4
|
-
export
|
|
3
|
+
export function loader({request}: Route.LoaderArgs) {
|
|
5
4
|
const url = new URL(request.url);
|
|
6
|
-
|
|
7
|
-
const {shop} = await context.storefront.query(ROBOTS_QUERY);
|
|
8
|
-
|
|
9
|
-
const shopId = parseGid(shop.id).id;
|
|
10
|
-
const body = robotsTxtData({url: url.origin, shopId});
|
|
5
|
+
const body = robotsTxtData({url: url.origin});
|
|
11
6
|
|
|
12
7
|
return new Response(body, {
|
|
13
8
|
status: 200,
|
|
@@ -19,35 +14,31 @@ export async function loader({request, context}: Route.LoaderArgs) {
|
|
|
19
14
|
});
|
|
20
15
|
}
|
|
21
16
|
|
|
22
|
-
function robotsTxtData({url
|
|
17
|
+
function robotsTxtData({url}: {url?: string}) {
|
|
23
18
|
const sitemapUrl = url ? `${url}/sitemap.xml` : undefined;
|
|
24
19
|
|
|
25
20
|
return `
|
|
26
21
|
User-agent: *
|
|
27
|
-
${generalDisallowRules({sitemapUrl
|
|
22
|
+
${generalDisallowRules({sitemapUrl})}
|
|
28
23
|
|
|
29
24
|
# Google adsbot ignores robots.txt unless specifically named!
|
|
30
25
|
User-agent: adsbot-google
|
|
31
|
-
Disallow: /
|
|
32
|
-
Disallow: /
|
|
33
|
-
Disallow: /
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
${shopId ? `Disallow: /${shopId}/orders` : ''}
|
|
37
|
-
Disallow: /*?*oseid=*
|
|
38
|
-
Disallow: /*preview_theme_id*
|
|
39
|
-
Disallow: /*preview_script_id*
|
|
26
|
+
Disallow: /cart
|
|
27
|
+
Disallow: /account
|
|
28
|
+
Disallow: /search
|
|
29
|
+
Allow: /search/
|
|
30
|
+
Disallow: /search/?*
|
|
40
31
|
|
|
41
32
|
User-agent: Nutch
|
|
42
33
|
Disallow: /
|
|
43
34
|
|
|
44
35
|
User-agent: AhrefsBot
|
|
45
36
|
Crawl-delay: 10
|
|
46
|
-
${generalDisallowRules({sitemapUrl
|
|
37
|
+
${generalDisallowRules({sitemapUrl})}
|
|
47
38
|
|
|
48
39
|
User-agent: AhrefsSiteAudit
|
|
49
40
|
Crawl-delay: 10
|
|
50
|
-
${generalDisallowRules({sitemapUrl
|
|
41
|
+
${generalDisallowRules({sitemapUrl})}
|
|
51
42
|
|
|
52
43
|
User-agent: MJ12bot
|
|
53
44
|
Crawl-Delay: 10
|
|
@@ -61,21 +52,8 @@ Crawl-delay: 1
|
|
|
61
52
|
* This function generates disallow rules that generally follow what Shopify's
|
|
62
53
|
* Online Store has as defaults for their robots.txt
|
|
63
54
|
*/
|
|
64
|
-
function generalDisallowRules({
|
|
65
|
-
|
|
66
|
-
sitemapUrl,
|
|
67
|
-
}: {
|
|
68
|
-
shopId?: string;
|
|
69
|
-
sitemapUrl?: string;
|
|
70
|
-
}) {
|
|
71
|
-
return `Disallow: /admin
|
|
72
|
-
Disallow: /cart
|
|
73
|
-
Disallow: /orders
|
|
74
|
-
Disallow: /checkouts/
|
|
75
|
-
Disallow: /checkout
|
|
76
|
-
${shopId ? `Disallow: /${shopId}/checkouts` : ''}
|
|
77
|
-
${shopId ? `Disallow: /${shopId}/orders` : ''}
|
|
78
|
-
Disallow: /carts
|
|
55
|
+
function generalDisallowRules({sitemapUrl}: {sitemapUrl?: string}) {
|
|
56
|
+
return `Disallow: /cart
|
|
79
57
|
Disallow: /account
|
|
80
58
|
Disallow: /collections/*sort_by*
|
|
81
59
|
Disallow: /*/collections/*sort_by*
|
|
@@ -85,33 +63,16 @@ Disallow: /collections/*%2b*
|
|
|
85
63
|
Disallow: /*/collections/*+*
|
|
86
64
|
Disallow: /*/collections/*%2B*
|
|
87
65
|
Disallow: /*/collections/*%2b*
|
|
88
|
-
Disallow:
|
|
66
|
+
Disallow: /*/collections/*filter*&*filter*
|
|
89
67
|
Disallow: /blogs/*+*
|
|
90
68
|
Disallow: /blogs/*%2B*
|
|
91
69
|
Disallow: /blogs/*%2b*
|
|
92
70
|
Disallow: /*/blogs/*+*
|
|
93
71
|
Disallow: /*/blogs/*%2B*
|
|
94
72
|
Disallow: /*/blogs/*%2b*
|
|
95
|
-
Disallow: /*?*oseid=*
|
|
96
|
-
Disallow: /*preview_theme_id*
|
|
97
|
-
Disallow: /*preview_script_id*
|
|
98
73
|
Disallow: /policies/
|
|
99
|
-
Disallow: /*/*?*ls=*&ls=*
|
|
100
|
-
Disallow: /*/*?*ls%3D*%3Fls%3D*
|
|
101
|
-
Disallow: /*/*?*ls%3d*%3fls%3d*
|
|
102
74
|
Disallow: /search
|
|
103
75
|
Allow: /search/
|
|
104
76
|
Disallow: /search/?*
|
|
105
|
-
Disallow: /apple-app-site-association
|
|
106
|
-
Disallow: /.well-known/shopify/monorail
|
|
107
77
|
${sitemapUrl ? `Sitemap: ${sitemapUrl}` : ''}`;
|
|
108
78
|
}
|
|
109
|
-
|
|
110
|
-
const ROBOTS_QUERY = `#graphql
|
|
111
|
-
query StoreRobots($country: CountryCode, $language: LanguageCode)
|
|
112
|
-
@inContext(country: $country, language: $language) {
|
|
113
|
-
shop {
|
|
114
|
-
id
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
` as const;
|
|
@@ -83,7 +83,11 @@ function FeaturedCollection({
|
|
|
83
83
|
>
|
|
84
84
|
{image && (
|
|
85
85
|
<div className="featured-collection-image">
|
|
86
|
-
<Image
|
|
86
|
+
<Image
|
|
87
|
+
data={image}
|
|
88
|
+
sizes="100vw"
|
|
89
|
+
alt={image.altText || collection.title}
|
|
90
|
+
/>
|
|
87
91
|
</div>
|
|
88
92
|
)}
|
|
89
93
|
<h1>{collection.title}</h1>
|
|
@@ -97,8 +101,11 @@ function RecommendedProducts({
|
|
|
97
101
|
products: Promise<RecommendedProductsQuery | null>;
|
|
98
102
|
}) {
|
|
99
103
|
return (
|
|
100
|
-
<
|
|
101
|
-
|
|
104
|
+
<section
|
|
105
|
+
className="recommended-products"
|
|
106
|
+
aria-labelledby="recommended-products"
|
|
107
|
+
>
|
|
108
|
+
<h2 id="recommended-products">Recommended Products</h2>
|
|
102
109
|
<Suspense fallback={<div>Loading...</div>}>
|
|
103
110
|
<Await resolve={products}>
|
|
104
111
|
{(response) => (
|
|
@@ -113,7 +120,7 @@ function RecommendedProducts({
|
|
|
113
120
|
</Await>
|
|
114
121
|
</Suspense>
|
|
115
122
|
<br />
|
|
116
|
-
</
|
|
123
|
+
</section>
|
|
117
124
|
);
|
|
118
125
|
}
|
|
119
126
|
|
|
@@ -3,7 +3,7 @@ import type {Route} from './+types/account.$';
|
|
|
3
3
|
|
|
4
4
|
// fallback wild card for all unauthenticated routes in account section
|
|
5
5
|
export async function loader({context}: Route.LoaderArgs) {
|
|
6
|
-
context.customerAccount.handleAuthStatus();
|
|
6
|
+
await context.customerAccount.handleAuthStatus();
|
|
7
7
|
|
|
8
8
|
return redirect('/account');
|
|
9
9
|
}
|
|
@@ -32,7 +32,7 @@ export const meta: Route.MetaFunction = () => {
|
|
|
32
32
|
};
|
|
33
33
|
|
|
34
34
|
export async function loader({context}: Route.LoaderArgs) {
|
|
35
|
-
context.customerAccount.handleAuthStatus();
|
|
35
|
+
await context.customerAccount.handleAuthStatus();
|
|
36
36
|
|
|
37
37
|
return {};
|
|
38
38
|
}
|
|
@@ -468,7 +468,7 @@ export function AddressForm({
|
|
|
468
468
|
/>
|
|
469
469
|
<label htmlFor="territoryCode">Country Code*</label>
|
|
470
470
|
<input
|
|
471
|
-
aria-label="
|
|
471
|
+
aria-label="Country code"
|
|
472
472
|
autoComplete="country"
|
|
473
473
|
defaultValue={address?.territoryCode ?? ''}
|
|
474
474
|
id="territoryCode"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "skeleton",
|
|
3
3
|
"private": true,
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "2026.
|
|
5
|
+
"version": "2026.4.4",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "shopify hydrogen build --codegen",
|
|
@@ -14,25 +14,25 @@
|
|
|
14
14
|
},
|
|
15
15
|
"prettier": "@shopify/prettier-config",
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@shopify/hydrogen": "
|
|
17
|
+
"@shopify/hydrogen": "2026.4.4",
|
|
18
18
|
"graphql": "^16.10.0",
|
|
19
19
|
"graphql-tag": "^2.12.6",
|
|
20
20
|
"isbot": "^5.1.22",
|
|
21
21
|
"react": "^18.3.1",
|
|
22
22
|
"react-dom": "^18.3.1",
|
|
23
|
-
"react-router": "7.
|
|
24
|
-
"react-router-dom": "7.
|
|
23
|
+
"react-router": "7.16.0",
|
|
24
|
+
"react-router-dom": "7.16.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@eslint/compat": "^1.2.5",
|
|
28
28
|
"@eslint/eslintrc": "^3.2.0",
|
|
29
29
|
"@eslint/js": "^9.18.0",
|
|
30
30
|
"@graphql-codegen/cli": "5.0.2",
|
|
31
|
-
"@react-router/dev": "7.
|
|
32
|
-
"@react-router/fs-routes": "7.
|
|
33
|
-
"@shopify/cli": "3.
|
|
31
|
+
"@react-router/dev": "7.16.0",
|
|
32
|
+
"@react-router/fs-routes": "7.16.0",
|
|
33
|
+
"@shopify/cli": "3.93.2",
|
|
34
34
|
"@shopify/hydrogen-codegen": "0.3.3",
|
|
35
|
-
"@shopify/mini-oxygen": "4.0
|
|
35
|
+
"@shopify/mini-oxygen": "4.2.0",
|
|
36
36
|
"@shopify/oxygen-workers-types": "^4.1.6",
|
|
37
37
|
"@shopify/prettier-config": "^1.1.2",
|
|
38
38
|
"@total-typescript/ts-reset": "^0.6.1",
|
|
@@ -54,8 +54,7 @@
|
|
|
54
54
|
"graphql-config": "^5.0.3",
|
|
55
55
|
"prettier": "^3.4.2",
|
|
56
56
|
"typescript": "^5.9.2",
|
|
57
|
-
"vite": "^
|
|
58
|
-
"vite-tsconfig-paths": "^4.3.1"
|
|
57
|
+
"vite": "^8.0.1"
|
|
59
58
|
},
|
|
60
59
|
"engines": {
|
|
61
60
|
"node": "^22 || ^24"
|
|
@@ -377,13 +377,6 @@ export type FooterQuery = {
|
|
|
377
377
|
>;
|
|
378
378
|
};
|
|
379
379
|
|
|
380
|
-
export type StoreRobotsQueryVariables = StorefrontAPI.Exact<{
|
|
381
|
-
country?: StorefrontAPI.InputMaybe<StorefrontAPI.CountryCode>;
|
|
382
|
-
language?: StorefrontAPI.InputMaybe<StorefrontAPI.LanguageCode>;
|
|
383
|
-
}>;
|
|
384
|
-
|
|
385
|
-
export type StoreRobotsQuery = {shop: Pick<StorefrontAPI.Shop, 'id'>};
|
|
386
|
-
|
|
387
380
|
export type FeaturedCollectionFragment = Pick<
|
|
388
381
|
StorefrontAPI.Collection,
|
|
389
382
|
'id' | 'title' | 'handle'
|
|
@@ -1283,10 +1276,6 @@ interface GeneratedQueryTypes {
|
|
|
1283
1276
|
return: FooterQuery;
|
|
1284
1277
|
variables: FooterQueryVariables;
|
|
1285
1278
|
};
|
|
1286
|
-
'#graphql\n query StoreRobots($country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n shop {\n id\n }\n }\n': {
|
|
1287
|
-
return: StoreRobotsQuery;
|
|
1288
|
-
variables: StoreRobotsQueryVariables;
|
|
1289
|
-
};
|
|
1290
1279
|
'#graphql\n fragment FeaturedCollection on Collection {\n id\n title\n image {\n id\n url\n altText\n width\n height\n }\n handle\n }\n query FeaturedCollection($country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n collections(first: 1, sortKey: UPDATED_AT, reverse: true) {\n nodes {\n ...FeaturedCollection\n }\n }\n }\n': {
|
|
1291
1280
|
return: FeaturedCollectionQuery;
|
|
1292
1281
|
variables: FeaturedCollectionQueryVariables;
|