@faststore/core 3.99.0 → 4.0.0-dev.1

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 (543) hide show
  1. package/.turbo/turbo-generate.log +29 -0
  2. package/.turbo/turbo-test.log +47 -16
  3. package/@generated/cached-operations.json +24 -0
  4. package/@generated/gql.ts +134 -210
  5. package/@generated/graphql.ts +1628 -3037
  6. package/@generated/index.ts +1 -1
  7. package/@generated/persisted-documents.json +1 -1
  8. package/@generated/schema.graphql +1854 -1743
  9. package/CHANGELOG.md +12 -2
  10. package/README.md +2 -1
  11. package/api/index.ts +6 -7
  12. package/cms/faststore/base.jsonc +1 -1
  13. package/cms/faststore/components/cms_component__alert.jsonc +5 -1
  14. package/cms/faststore/components/cms_component__bannernewsletter.jsonc +5 -1
  15. package/cms/faststore/components/cms_component__bannertext.jsonc +5 -1
  16. package/cms/faststore/components/cms_component__breadcrumb.jsonc +16 -4
  17. package/cms/faststore/components/cms_component__cartsidebar.jsonc +21 -1
  18. package/cms/faststore/components/cms_component__children.jsonc +5 -1
  19. package/cms/faststore/components/cms_component__crosssellingshelf.jsonc +5 -1
  20. package/cms/faststore/components/cms_component__emptystate.jsonc +8 -3
  21. package/cms/faststore/components/cms_component__footer.jsonc +9 -3
  22. package/cms/faststore/components/cms_component__hero.jsonc +5 -1
  23. package/cms/faststore/components/cms_component__incentives.jsonc +5 -1
  24. package/cms/faststore/components/cms_component__navbar.jsonc +139 -1
  25. package/cms/faststore/components/cms_component__newsletter.jsonc +5 -1
  26. package/cms/faststore/components/cms_component__productdetails.jsonc +33 -1
  27. package/cms/faststore/components/cms_component__productgallery.jsonc +113 -15
  28. package/cms/faststore/components/cms_component__productshelf.jsonc +5 -1
  29. package/cms/faststore/components/cms_component__producttiles.jsonc +5 -1
  30. package/cms/faststore/components/cms_component__regionbar.jsonc +5 -1
  31. package/cms/faststore/components/cms_component__regionmodal.jsonc +5 -1
  32. package/cms/faststore/components/cms_component__regionpopover.jsonc +5 -1
  33. package/cms/faststore/components/cms_component__scrolltotopbutton.jsonc +29 -0
  34. package/cms/faststore/components/cms_component__search.jsonc +5 -1
  35. package/cms/faststore/content-types.json +115 -0
  36. package/cms/faststore/pages/cms_content_type__globalsections.jsonc +52 -0
  37. package/cms/faststore/pages/cms_content_type__home.jsonc +6 -0
  38. package/cms/faststore/pages/cms_content_type__landingpage.jsonc +8 -1
  39. package/cms/faststore/pages/cms_content_type__pdp.jsonc +6 -0
  40. package/cms/faststore/pages/cms_content_type__plp.jsonc +17 -0
  41. package/cms/faststore/pages/cms_content_type__search.jsonc +17 -0
  42. package/cms/faststore/schema.json +547 -43
  43. package/cms/faststore/sections.json +330 -21
  44. package/discovery.config.default.js +49 -3
  45. package/next-env.d.ts +2 -1
  46. package/next.config.js +48 -26
  47. package/package.json +47 -60
  48. package/public/icons.svg +5 -1
  49. package/scripts/i18n.js +76 -0
  50. package/src/components/account/MyAccountDrawer/OrganizationDrawer/OrganizationDrawer.tsx +2 -1
  51. package/src/components/account/MyAccountDrawer/OrganizationDrawer/section.module.scss +25 -24
  52. package/src/components/account/MyAccountDrawer/ProfileSummary/profile-summary.scss +8 -6
  53. package/src/components/account/MyAccountLayout/styles.scss +16 -12
  54. package/src/components/account/MyAccountMenu/styles.scss +21 -22
  55. package/src/components/account/MyAccountUserDetails/styles.module.scss +4 -2
  56. package/src/components/account/components/MyAccountAccordion/styles.scss +4 -2
  57. package/src/components/account/components/MyAccountHeader/styles.scss +3 -1
  58. package/src/components/account/components/MyAccountTable/styles.scss +6 -4
  59. package/src/components/account/orders/MyAccountListOrders/MyAccountFilterSlider/section.module.scss +21 -19
  60. package/src/components/account/orders/MyAccountListOrders/MyAccountListOrdersTable/MyAccountListOrdersTable.tsx +3 -1
  61. package/src/components/account/orders/MyAccountListOrders/MyAccountListOrdersTable/styles.scss +5 -3
  62. package/src/components/account/orders/MyAccountListOrders/styles.module.scss +25 -22
  63. package/src/components/account/orders/MyAccountOrderDetails/MyAccountBudgetsCard/styles.scss +7 -5
  64. package/src/components/account/orders/MyAccountOrderDetails/MyAccountDeliveryOptionAccordion/styles.scss +7 -5
  65. package/src/components/account/orders/MyAccountOrderDetails/MyAccountMoreInformationCard/styles.scss +3 -1
  66. package/src/components/account/orders/MyAccountOrderDetails/MyAccountOrderActionModal/styles.module.scss +8 -6
  67. package/src/components/account/orders/MyAccountOrderDetails/MyAccountOrderActions/styles.scss +3 -1
  68. package/src/components/account/orders/MyAccountOrderDetails/MyAccountStatusCard/styles.scss +8 -6
  69. package/src/components/account/orders/MyAccountOrderDetails/section.module.scss +36 -43
  70. package/src/components/account/profile/profile.module.scss +3 -1
  71. package/src/components/account/section.module.scss +3 -1
  72. package/src/components/account/security/styles.module.scss +14 -8
  73. package/src/components/cart/CartSidebar/CartSidebar.tsx +10 -1
  74. package/src/components/cart/CartSidebar/section.module.scss +19 -17
  75. package/src/components/cart/EmptyCart/EmptyCart.tsx +12 -4
  76. package/src/components/cms/GlobalSections.tsx +12 -12
  77. package/src/components/cms/RenderSections.tsx +10 -2
  78. package/src/components/cms/plp/Components.ts +9 -0
  79. package/src/components/common/Alert/section.module.scss +10 -5
  80. package/src/components/common/PreviewTag/section.module.scss +48 -40
  81. package/src/components/common/Toast/section.module.scss +4 -2
  82. package/src/components/localization/LocalizationSelector/LocalizationSelector.tsx +320 -0
  83. package/src/components/localization/LocalizationSelector/index.ts +1 -0
  84. package/src/components/localization/LocalizationSelector/section.module.scss +18 -0
  85. package/src/components/localization/index.ts +1 -0
  86. package/src/components/navigation/Navbar/Navbar.tsx +49 -1
  87. package/src/components/navigation/NavbarSlider/NavbarSlider.tsx +19 -1
  88. package/src/components/navigation/NavbarSlider/section.module.scss +12 -10
  89. package/src/components/product/OutOfStock/OutOfStock.tsx +6 -1
  90. package/src/components/product/ProductCard/ProductCard.tsx +1 -1
  91. package/src/components/region/RegionModal/RegionModal.tsx +4 -1
  92. package/src/components/region/RegionModal/section.module.scss +10 -8
  93. package/src/components/region/RegionPopover/RegionPopover.tsx +6 -5
  94. package/src/components/region/RegionPopover/section.module.scss +9 -7
  95. package/src/components/region/RegionSlider/RegionSlider.tsx +5 -2
  96. package/src/components/region/RegionSlider/section.module.scss +16 -13
  97. package/src/components/search/Filter/FilterDeliveryMethodFacet.tsx +5 -5
  98. package/src/components/search/Filter/FilterDesktop.tsx +13 -4
  99. package/src/components/search/Filter/FilterSlider.tsx +18 -6
  100. package/src/components/search/Filter/section.module.scss +21 -19
  101. package/src/components/search/SearchDropdown/SearchDropdown.tsx +9 -7
  102. package/src/components/search/SearchHistory/SearchHistory.tsx +7 -2
  103. package/src/components/search/SearchInput/SearchInput.tsx +21 -8
  104. package/src/components/search/SearchProductItem/SearchProductItem.tsx +10 -3
  105. package/src/components/search/SearchTop/SearchTop.tsx +30 -24
  106. package/src/components/search/Sort/Sort.tsx +17 -19
  107. package/src/components/sections/Alert/Alert.tsx +6 -1
  108. package/src/components/sections/BannerNewsletter/section.module.scss +6 -4
  109. package/src/components/sections/BannerText/section.module.scss +5 -3
  110. package/src/components/sections/Breadcrumb/Breadcrumb.tsx +6 -2
  111. package/src/components/sections/Breadcrumb/section.module.scss +7 -5
  112. package/src/components/sections/EmptyState/section.module.scss +5 -3
  113. package/src/components/sections/Footer/Footer.tsx +1 -5
  114. package/src/components/sections/Footer/section.module.scss +10 -8
  115. package/src/components/sections/Hero/Hero.tsx +3 -1
  116. package/src/components/sections/Hero/section.module.scss +6 -4
  117. package/src/components/sections/Incentives/section.module.scss +5 -3
  118. package/src/components/sections/Navbar/Navbar.tsx +45 -0
  119. package/src/components/sections/Navbar/section.module.scss +34 -33
  120. package/src/components/sections/Newsletter/section.module.scss +10 -8
  121. package/src/components/sections/ProductDetails/ProductDetails.tsx +23 -1
  122. package/src/components/sections/ProductDetails/section.module.scss +32 -30
  123. package/src/components/sections/ProductGallery/EmptyGallery.tsx +13 -16
  124. package/src/components/sections/ProductGallery/section.module.scss +42 -39
  125. package/src/components/sections/ProductShelf/section.module.scss +22 -17
  126. package/src/components/sections/ProductTiles/section.module.scss +15 -13
  127. package/src/components/sections/RegionBar/section.module.scss +5 -3
  128. package/src/components/sections/ScrollToTopButton/ScrollToTopButton.tsx +4 -3
  129. package/src/components/sections/ScrollToTopButton/section.module.scss +4 -2
  130. package/src/components/templates/LandingPage/LandingPage.tsx +22 -16
  131. package/src/components/templates/ProductListingPage/ProductListing.tsx +1 -13
  132. package/src/components/templates/ProductListingPage/ProductListingPage.tsx +8 -3
  133. package/src/components/ui/Breadcrumb/Breadcrumb.tsx +14 -11
  134. package/src/components/ui/Button/ButtonSignIn/ButtonSignIn.tsx +2 -1
  135. package/src/components/ui/Button/ButtonSignIn/ButtonSignInFallback/ButtonSignInFallback.tsx +3 -1
  136. package/src/components/ui/Link/Link.tsx +19 -2
  137. package/src/components/ui/LinkButton/LinkButton.tsx +28 -0
  138. package/src/components/ui/LinkButton/index.ts +2 -0
  139. package/src/components/ui/LocalizationButton/LocalizationButton.tsx +124 -0
  140. package/src/components/ui/LocalizationButton/index.ts +1 -0
  141. package/src/components/ui/PickupPoints/PickupPointCards.tsx +2 -4
  142. package/src/components/ui/ProductComparison/ProductComparisonSidebar.tsx +34 -17
  143. package/src/components/ui/ProductDescription/ProductDescription.tsx +8 -3
  144. package/src/components/ui/ProductDetails/AddToCartLoadingSkeleton.tsx +6 -2
  145. package/src/components/ui/ProductDetails/ProductDetailsSettings.tsx +17 -5
  146. package/src/components/ui/ProductGallery/ProductGallery.tsx +7 -3
  147. package/src/components/ui/ProductGallery/ProductGalleryPage.tsx +1 -3
  148. package/src/components/ui/ShippingSimulation/ShippingSimulation.tsx +6 -1
  149. package/src/customizations/src/styles/custom-mixins.scss +0 -2
  150. package/src/experimental/index.ts +26 -0
  151. package/src/experimental/myAccountServerSideProps.ts +11 -2
  152. package/src/experimental/searchServerSideFunctions/getServerSideProps.ts +13 -7
  153. package/src/experimental/searchServerSideFunctions/getStaticProps.ts +5 -4
  154. package/src/instrumentation.ts +20 -6
  155. package/src/pages/404.tsx +5 -4
  156. package/src/pages/500.tsx +5 -4
  157. package/src/pages/[...slug].tsx +7 -4
  158. package/src/pages/[slug]/p.tsx +26 -8
  159. package/src/pages/_app.tsx +9 -1
  160. package/src/pages/api/fs/logout.ts +3 -2
  161. package/src/pages/api/graphql.ts +7 -23
  162. package/src/pages/api/preview.ts +21 -8
  163. package/src/pages/checkout.tsx +15 -5
  164. package/src/pages/index.tsx +18 -9
  165. package/src/pages/login.tsx +5 -4
  166. package/src/pages/pvt/account/403.tsx +11 -2
  167. package/src/pages/pvt/account/404.tsx +13 -3
  168. package/src/pages/pvt/account/index.tsx +6 -4
  169. package/src/pages/pvt/account/orders/[id].tsx +11 -3
  170. package/src/pages/pvt/account/orders/index.tsx +11 -3
  171. package/src/pages/pvt/account/profile.tsx +11 -2
  172. package/src/pages/pvt/account/security.tsx +11 -2
  173. package/src/pages/pvt/account/user-details.tsx +11 -2
  174. package/src/pages/s.tsx +26 -6
  175. package/src/proxy.ts +154 -0
  176. package/src/sdk/account/refreshToken.ts +4 -4
  177. package/src/sdk/account/useReorder.ts +8 -2
  178. package/src/sdk/analytics/platform/vtex/search.ts +3 -2
  179. package/src/sdk/cart/redirectToCheckout.ts +14 -8
  180. package/src/sdk/cart/useCheckoutButton.ts +7 -1
  181. package/src/sdk/deliveryPromise/useDeliveryPromise.ts +10 -18
  182. package/src/sdk/graphql/request.ts +102 -50
  183. package/src/sdk/localization/bindingSelector.ts +91 -0
  184. package/src/sdk/localization/index.ts +4 -0
  185. package/src/sdk/localization/match-url.ts +64 -0
  186. package/src/sdk/localization/types.ts +31 -0
  187. package/src/sdk/localization/useBindingSelector.ts +183 -0
  188. package/src/sdk/localization/useLocaleValidation.ts +49 -0
  189. package/src/sdk/localization/useLocalizationConfig.tsx +160 -0
  190. package/src/sdk/offer/fetcher.ts +3 -2
  191. package/src/sdk/product/useLocalizedVariables.ts +1 -1
  192. package/src/sdk/product/usePageProductsQuery.ts +2 -2
  193. package/src/sdk/product/useProductGalleryQuery.ts +1 -2
  194. package/src/sdk/product/useProductLink.ts +3 -1
  195. package/src/sdk/search/formatSearchPath.ts +28 -3
  196. package/src/sdk/search/state.ts +22 -13
  197. package/src/sdk/search/useSearchBase.ts +10 -0
  198. package/src/sdk/search/useSearchHistory.ts +41 -7
  199. package/src/sdk/session/index.ts +21 -3
  200. package/src/sdk/shipping/useShippingSimulation.ts +10 -2
  201. package/src/sdk/tsconfig.json +6 -0
  202. package/src/sdk/ui/useLink.ts +48 -0
  203. package/src/server/cms/global.ts +40 -0
  204. package/src/server/cms/index.ts +18 -10
  205. package/src/server/cms/pdp.ts +1 -0
  206. package/src/server/cms/plp.ts +3 -0
  207. package/src/server/content/service.ts +36 -24
  208. package/src/server/content/types.ts +10 -3
  209. package/src/server/index.ts +27 -20
  210. package/src/server/options.ts +27 -2
  211. package/src/styles/global/index.scss +10 -7
  212. package/src/styles/main.scss +3 -3
  213. package/src/typings/locales.ts +41 -0
  214. package/src/utils/fetchProductGallerySSR.ts +3 -1
  215. package/src/utils/getBaseDomain.ts +2 -1
  216. package/src/utils/getRequestHostname.ts +26 -0
  217. package/src/utils/globalSettings.ts +11 -0
  218. package/src/utils/localization/bindingPaths.ts +337 -0
  219. package/src/utils/localization/validateLocaleForHostname.ts +69 -0
  220. package/src/utils/localization/withLocaleValidation.ts +36 -0
  221. package/src/utils/utilities.ts +22 -0
  222. package/test/pages/api/preview.test.ts +93 -0
  223. package/test/sdk/localization/bindingSelector.test.ts +246 -0
  224. package/test/sdk/localization/store-url.browser.test.ts +140 -0
  225. package/test/sdk/localization/store-url.test.ts +96 -0
  226. package/test/sdk/localization/useBindingSelector.test.tsx +219 -0
  227. package/test/sdk/search/useSearchHistory.test.ts +222 -0
  228. package/test/server/cms/index.test.ts +3 -4
  229. package/test/server/content/service.test.ts +98 -0
  230. package/test/server/index.test.ts +10 -22
  231. package/test/utils/cookieCacheBusting.test.ts +32 -24
  232. package/test/utils/getRequestHostname.test.ts +71 -0
  233. package/test/utils/localization/bindingPaths.test.ts +706 -0
  234. package/test/utils/match-url.test.ts +388 -0
  235. package/tsconfig.json +11 -3
  236. package/vitest.config.ts +61 -0
  237. package/.next/BUILD_ID +0 -1
  238. package/.next/build-manifest.json +0 -197
  239. package/.next/cache/.tsbuildinfo +0 -1
  240. package/.next/cache/config.json +0 -7
  241. package/.next/cache/webpack/client-production/0.pack +0 -0
  242. package/.next/cache/webpack/client-production/index.pack +0 -0
  243. package/.next/cache/webpack/edge-server-production/0.pack +0 -0
  244. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  245. package/.next/cache/webpack/server-production/0.pack +0 -0
  246. package/.next/cache/webpack/server-production/index.pack +0 -0
  247. package/.next/export-marker.json +0 -1
  248. package/.next/images-manifest.json +0 -1
  249. package/.next/next-minimal-server.js.nft.json +0 -1
  250. package/.next/next-server.js.nft.json +0 -1
  251. package/.next/package.json +0 -1
  252. package/.next/prerender-manifest.js +0 -1
  253. package/.next/prerender-manifest.json +0 -1
  254. package/.next/react-loadable-manifest.json +0 -478
  255. package/.next/required-server-files.json +0 -1
  256. package/.next/routes-manifest.json +0 -1
  257. package/.next/server/chunks/1280.js +0 -1
  258. package/.next/server/chunks/1454.js +0 -1
  259. package/.next/server/chunks/1554.js +0 -1
  260. package/.next/server/chunks/1607.js +0 -1
  261. package/.next/server/chunks/1780.js +0 -1
  262. package/.next/server/chunks/1917.js +0 -1
  263. package/.next/server/chunks/1972.js +0 -1
  264. package/.next/server/chunks/2230.js +0 -1
  265. package/.next/server/chunks/2249.js +0 -1
  266. package/.next/server/chunks/2430.js +0 -1
  267. package/.next/server/chunks/2445.js +0 -12
  268. package/.next/server/chunks/2570.js +0 -1
  269. package/.next/server/chunks/2792.js +0 -1
  270. package/.next/server/chunks/2903.js +0 -1
  271. package/.next/server/chunks/294.js +0 -1
  272. package/.next/server/chunks/2955.js +0 -1
  273. package/.next/server/chunks/3006.js +0 -1
  274. package/.next/server/chunks/3029.js +0 -1
  275. package/.next/server/chunks/3060.js +0 -1
  276. package/.next/server/chunks/3408.js +0 -1
  277. package/.next/server/chunks/3483.js +0 -1
  278. package/.next/server/chunks/3683.js +0 -1
  279. package/.next/server/chunks/3836.js +0 -1
  280. package/.next/server/chunks/3890.js +0 -494
  281. package/.next/server/chunks/3922.js +0 -1
  282. package/.next/server/chunks/3945.js +0 -1
  283. package/.next/server/chunks/3951.js +0 -7
  284. package/.next/server/chunks/416.js +0 -1
  285. package/.next/server/chunks/4194.js +0 -1
  286. package/.next/server/chunks/4365.js +0 -1
  287. package/.next/server/chunks/4451.js +0 -1
  288. package/.next/server/chunks/4803.js +0 -1
  289. package/.next/server/chunks/4913.js +0 -13
  290. package/.next/server/chunks/5402.js +0 -1
  291. package/.next/server/chunks/5723.js +0 -13
  292. package/.next/server/chunks/5796.js +0 -1
  293. package/.next/server/chunks/6393.js +0 -1
  294. package/.next/server/chunks/6457.js +0 -6
  295. package/.next/server/chunks/6698.js +0 -1
  296. package/.next/server/chunks/6804.js +0 -6
  297. package/.next/server/chunks/6886.js +0 -1
  298. package/.next/server/chunks/7098.js +0 -9
  299. package/.next/server/chunks/7169.js +0 -1
  300. package/.next/server/chunks/7228.js +0 -1
  301. package/.next/server/chunks/7275.js +0 -1
  302. package/.next/server/chunks/7371.js +0 -1
  303. package/.next/server/chunks/7692.js +0 -1
  304. package/.next/server/chunks/7799.js +0 -1
  305. package/.next/server/chunks/8068.js +0 -1
  306. package/.next/server/chunks/83.js +0 -1
  307. package/.next/server/chunks/831.js +0 -1
  308. package/.next/server/chunks/8563.js +0 -1
  309. package/.next/server/chunks/8569.js +0 -1
  310. package/.next/server/chunks/8687.js +0 -1
  311. package/.next/server/chunks/870.js +0 -1
  312. package/.next/server/chunks/8737.js +0 -1
  313. package/.next/server/chunks/8741.js +0 -1
  314. package/.next/server/chunks/9088.js +0 -1
  315. package/.next/server/chunks/9117.js +0 -1
  316. package/.next/server/chunks/9237.js +0 -1
  317. package/.next/server/chunks/948.js +0 -3
  318. package/.next/server/chunks/9563.js +0 -3
  319. package/.next/server/chunks/9570.js +0 -1
  320. package/.next/server/chunks/9740.js +0 -1
  321. package/.next/server/chunks/9853.js +0 -1
  322. package/.next/server/chunks/9984.js +0 -1
  323. package/.next/server/chunks/9985.js +0 -1
  324. package/.next/server/chunks/9990.js +0 -1
  325. package/.next/server/chunks/ButtonSignIn.js +0 -1
  326. package/.next/server/chunks/Dropdown.js +0 -1
  327. package/.next/server/chunks/DropdownButton.js +0 -1
  328. package/.next/server/chunks/DropdownItem.js +0 -1
  329. package/.next/server/chunks/DropdownMenu.js +0 -1
  330. package/.next/server/chunks/FilterSkeleton.js +0 -1
  331. package/.next/server/chunks/ScrollToTopButton.js +0 -1
  332. package/.next/server/chunks/UIBannerText.js +0 -1
  333. package/.next/server/chunks/UISKUMatrixSidebar.js +0 -1
  334. package/.next/server/chunks/font-manifest.json +0 -1
  335. package/.next/server/edge-instrumentation.js +0 -2
  336. package/.next/server/edge-instrumentation.js.map +0 -1
  337. package/.next/server/edge-runtime-webpack.js +0 -157
  338. package/.next/server/edge-runtime-webpack.js.map +0 -1
  339. package/.next/server/font-manifest.json +0 -1
  340. package/.next/server/functions-config-manifest.json +0 -1
  341. package/.next/server/instrumentation.js +0 -1
  342. package/.next/server/instrumentation.js.nft.json +0 -1
  343. package/.next/server/middleware-build-manifest.js +0 -1
  344. package/.next/server/middleware-manifest.json +0 -6
  345. package/.next/server/middleware-react-loadable-manifest.js +0 -1
  346. package/.next/server/next-font-manifest.js +0 -1
  347. package/.next/server/next-font-manifest.json +0 -1
  348. package/.next/server/pages/404.js +0 -1
  349. package/.next/server/pages/404.js.nft.json +0 -1
  350. package/.next/server/pages/500.js +0 -1
  351. package/.next/server/pages/500.js.nft.json +0 -1
  352. package/.next/server/pages/[...slug].js +0 -1
  353. package/.next/server/pages/[...slug].js.nft.json +0 -1
  354. package/.next/server/pages/[slug]/p.js +0 -1
  355. package/.next/server/pages/[slug]/p.js.nft.json +0 -1
  356. package/.next/server/pages/_app.js +0 -1
  357. package/.next/server/pages/_app.js.nft.json +0 -1
  358. package/.next/server/pages/_document.js +0 -1
  359. package/.next/server/pages/_document.js.nft.json +0 -1
  360. package/.next/server/pages/_error.js +0 -1
  361. package/.next/server/pages/_error.js.nft.json +0 -1
  362. package/.next/server/pages/api/fs/logout.js +0 -1
  363. package/.next/server/pages/api/fs/logout.js.nft.json +0 -1
  364. package/.next/server/pages/api/graphql.js +0 -3
  365. package/.next/server/pages/api/graphql.js.nft.json +0 -1
  366. package/.next/server/pages/api/health/live.js +0 -1
  367. package/.next/server/pages/api/health/live.js.nft.json +0 -1
  368. package/.next/server/pages/api/health/ready.js +0 -1
  369. package/.next/server/pages/api/health/ready.js.nft.json +0 -1
  370. package/.next/server/pages/api/preview.js +0 -1
  371. package/.next/server/pages/api/preview.js.nft.json +0 -1
  372. package/.next/server/pages/checkout.js +0 -1
  373. package/.next/server/pages/checkout.js.nft.json +0 -1
  374. package/.next/server/pages/en-US/404.html +0 -42
  375. package/.next/server/pages/en-US/404.json +0 -1
  376. package/.next/server/pages/en-US/500.html +0 -42
  377. package/.next/server/pages/en-US/500.json +0 -1
  378. package/.next/server/pages/en-US/checkout.html +0 -42
  379. package/.next/server/pages/en-US/checkout.json +0 -1
  380. package/.next/server/pages/en-US/login.html +0 -42
  381. package/.next/server/pages/en-US/login.json +0 -1
  382. package/.next/server/pages/en-US/s.html +0 -42
  383. package/.next/server/pages/en-US/s.json +0 -1
  384. package/.next/server/pages/en-US.html +0 -42
  385. package/.next/server/pages/en-US.json +0 -1
  386. package/.next/server/pages/index.js +0 -1
  387. package/.next/server/pages/index.js.nft.json +0 -1
  388. package/.next/server/pages/login.js +0 -1
  389. package/.next/server/pages/login.js.nft.json +0 -1
  390. package/.next/server/pages/pvt/account/403.js +0 -1
  391. package/.next/server/pages/pvt/account/403.js.nft.json +0 -1
  392. package/.next/server/pages/pvt/account/404.js +0 -1
  393. package/.next/server/pages/pvt/account/404.js.nft.json +0 -1
  394. package/.next/server/pages/pvt/account/[...unknown].js +0 -1
  395. package/.next/server/pages/pvt/account/[...unknown].js.nft.json +0 -1
  396. package/.next/server/pages/pvt/account/orders/[id].js +0 -1
  397. package/.next/server/pages/pvt/account/orders/[id].js.nft.json +0 -1
  398. package/.next/server/pages/pvt/account/orders.js +0 -1
  399. package/.next/server/pages/pvt/account/orders.js.nft.json +0 -1
  400. package/.next/server/pages/pvt/account/profile.js +0 -1
  401. package/.next/server/pages/pvt/account/profile.js.nft.json +0 -1
  402. package/.next/server/pages/pvt/account/security.js +0 -1
  403. package/.next/server/pages/pvt/account/security.js.nft.json +0 -1
  404. package/.next/server/pages/pvt/account/user-details.js +0 -1
  405. package/.next/server/pages/pvt/account/user-details.js.nft.json +0 -1
  406. package/.next/server/pages/pvt/account.js +0 -1
  407. package/.next/server/pages/pvt/account.js.nft.json +0 -1
  408. package/.next/server/pages/s.js +0 -1
  409. package/.next/server/pages/s.js.nft.json +0 -1
  410. package/.next/server/pages-manifest.json +0 -1
  411. package/.next/server/webpack-api-runtime.js +0 -1
  412. package/.next/server/webpack-runtime.js +0 -1
  413. package/.next/static/chunks/227-f109b24190a008ab.js +0 -8
  414. package/.next/static/chunks/2284.185d834d9829b652.js +0 -1
  415. package/.next/static/chunks/2851.e68ed3c8d27a032a.js +0 -1
  416. package/.next/static/chunks/2927.23bae2c79f0ac0f3.js +0 -1
  417. package/.next/static/chunks/3155.7bc4c730a79d9ecb.js +0 -1
  418. package/.next/static/chunks/3166-0b30a3887c0c346d.js +0 -1
  419. package/.next/static/chunks/3399.017c5209b74b0d97.js +0 -1
  420. package/.next/static/chunks/3483.ef53d632a763da3f.js +0 -1
  421. package/.next/static/chunks/349.b3b38e1e9f719dda.js +0 -1
  422. package/.next/static/chunks/3802.5e8b0b689eacc0f8.js +0 -1
  423. package/.next/static/chunks/3836.620480018be48233.js +0 -1
  424. package/.next/static/chunks/4436.e7af66f0b654ee36.js +0 -1
  425. package/.next/static/chunks/4803.b1920b6e3a1a6304.js +0 -1
  426. package/.next/static/chunks/5796.4351370494d8b8b6.js +0 -1
  427. package/.next/static/chunks/6393.55f991b1a6bb4fe7.js +0 -1
  428. package/.next/static/chunks/6700.b23221a57514e737.js +0 -1
  429. package/.next/static/chunks/6789.960162355435a81d.js +0 -1
  430. package/.next/static/chunks/7191-befad64ba238a817.js +0 -1
  431. package/.next/static/chunks/7692.8d5bf4560341a2f6.js +0 -1
  432. package/.next/static/chunks/7861.7f9f1a124a43da30.js +0 -6
  433. package/.next/static/chunks/8068.43663fb64762f7b8.js +0 -1
  434. package/.next/static/chunks/83.e0c16f0299b364a5.js +0 -1
  435. package/.next/static/chunks/8325.dabe9aa22eaadeed.js +0 -1
  436. package/.next/static/chunks/8587.53c8ce185ed1a2cb.js +0 -1
  437. package/.next/static/chunks/9173-e89da04079c35360.js +0 -2
  438. package/.next/static/chunks/9237.7555603703f81bf7.js +0 -1
  439. package/.next/static/chunks/9298-1d1ed0a54133cb59.js +0 -28
  440. package/.next/static/chunks/9399.d116a7fd62024783.js +0 -1
  441. package/.next/static/chunks/941.3e2782ab9c490eb0.js +0 -1
  442. package/.next/static/chunks/9701.f9a0bfffba8807dc.js +0 -1
  443. package/.next/static/chunks/9909.787576b171184aa5.js +0 -1
  444. package/.next/static/chunks/9960.7ef77f8a8b046170.js +0 -1
  445. package/.next/static/chunks/9979.aedbc094bdc2c599.js +0 -1
  446. package/.next/static/chunks/BannerNewsletter.00328ad162109908.js +0 -1
  447. package/.next/static/chunks/BannerText.dbbec87cadb8a521.js +0 -1
  448. package/.next/static/chunks/ButtonSignIn.f6e210eaca873e48.js +0 -1
  449. package/.next/static/chunks/CartItem.b34e295377f6f94f.js +0 -1
  450. package/.next/static/chunks/CartSidebar.ac447d1ef6276da1.js +0 -1
  451. package/.next/static/chunks/Dropdown.38b48c749bad6b60.js +0 -1
  452. package/.next/static/chunks/DropdownButton.66fa6b25dddb3a07.js +0 -1
  453. package/.next/static/chunks/DropdownItem.38b8f5a07c7f422a.js +0 -1
  454. package/.next/static/chunks/DropdownMenu.48b11521a24c6efd.js +0 -1
  455. package/.next/static/chunks/EmptyCart.320e2f94a0d5e6b1.js +0 -1
  456. package/.next/static/chunks/FilterSkeleton.7ab99e28f92341c9.js +0 -1
  457. package/.next/static/chunks/Footer.166b02c2f13980c6.js +0 -1
  458. package/.next/static/chunks/Gift.c49ba26da2fbab5e.js +0 -1
  459. package/.next/static/chunks/Newsletter.fc406f6029057022.js +0 -1
  460. package/.next/static/chunks/OrderSummary.5957d69f990d9add.js +0 -1
  461. package/.next/static/chunks/PreviewTag.f4f0c8710a7bcad9.js +0 -1
  462. package/.next/static/chunks/ProductShelf.cc46f5cdeeaeaff6.js +0 -1
  463. package/.next/static/chunks/ProductTiles.9b804e51b0704d60.js +0 -1
  464. package/.next/static/chunks/RegionModal.319ad44250cb12d2.js +0 -1
  465. package/.next/static/chunks/RegionSlider.0e0e93369f4f9c92.js +0 -1
  466. package/.next/static/chunks/ScrollToTopButton.c15431f2e8bb93ef.js +0 -1
  467. package/.next/static/chunks/ShoppingAssistant.ba191eb4dbed67e5.js +0 -1
  468. package/.next/static/chunks/Toast.5f90f0436708be5e.js +0 -1
  469. package/.next/static/chunks/UIBannerText.7315b16af4457059.js +0 -1
  470. package/.next/static/chunks/UISKUMatrixSidebar.b4349b2682bbe183.js +0 -1
  471. package/.next/static/chunks/UIToast.de15325248043ce5.js +0 -1
  472. package/.next/static/chunks/framework-d514426edf885c68.js +0 -33
  473. package/.next/static/chunks/main-ec03882c4375091d.js +0 -1
  474. package/.next/static/chunks/pages/404-e3dfbbac003b02a2.js +0 -1
  475. package/.next/static/chunks/pages/500-c7814e085081d7b8.js +0 -1
  476. package/.next/static/chunks/pages/[...slug]-dc8a395a43b081f1.js +0 -1
  477. package/.next/static/chunks/pages/[slug]/p-644f1132f5a0f736.js +0 -1
  478. package/.next/static/chunks/pages/_app-84aaff8a9d4de60e.js +0 -1
  479. package/.next/static/chunks/pages/_error-2b0148be56a716e9.js +0 -1
  480. package/.next/static/chunks/pages/checkout-2071467ad42dfb99.js +0 -1
  481. package/.next/static/chunks/pages/index-8774d5b4a8744eb2.js +0 -1
  482. package/.next/static/chunks/pages/login-e74747c9f9cb5b49.js +0 -1
  483. package/.next/static/chunks/pages/pvt/account/403-491e6b062487b30f.js +0 -1
  484. package/.next/static/chunks/pages/pvt/account/404-5ad472d9f2ee1980.js +0 -1
  485. package/.next/static/chunks/pages/pvt/account/[...unknown]-f80f645594d2740c.js +0 -1
  486. package/.next/static/chunks/pages/pvt/account/orders/[id]-64e42157c0974c48.js +0 -1
  487. package/.next/static/chunks/pages/pvt/account/orders-faab39f2aff05fae.js +0 -1
  488. package/.next/static/chunks/pages/pvt/account/profile-9672177ee2665bc0.js +0 -1
  489. package/.next/static/chunks/pages/pvt/account/security-03eb1ccab9a30563.js +0 -1
  490. package/.next/static/chunks/pages/pvt/account/user-details-7838e3f79781596c.js +0 -1
  491. package/.next/static/chunks/pages/pvt/account-65fefcc699344bdb.js +0 -1
  492. package/.next/static/chunks/pages/s-162ba789e6611175.js +0 -1
  493. package/.next/static/chunks/polyfills-c67a75d1b6f99dc8.js +0 -1
  494. package/.next/static/chunks/webpack-dbc0d9f67d2f928f.js +0 -1
  495. package/.next/static/css/02259c549b2179f2.css +0 -1
  496. package/.next/static/css/02eaf202d3d11fd1.css +0 -1
  497. package/.next/static/css/033e241c58ba6fbb.css +0 -1
  498. package/.next/static/css/042d012bc1895b5c.css +0 -1
  499. package/.next/static/css/14176a4704ff97b2.css +0 -1
  500. package/.next/static/css/146a8678babc61bf.css +0 -1
  501. package/.next/static/css/16d65422bfa80f51.css +0 -1
  502. package/.next/static/css/1c4983f11b861ea0.css +0 -1
  503. package/.next/static/css/204754bbd8cc4bef.css +0 -1
  504. package/.next/static/css/24d91007fc96be10.css +0 -1
  505. package/.next/static/css/2980acad3f8e1028.css +0 -1
  506. package/.next/static/css/2c19433e38fd7533.css +0 -1
  507. package/.next/static/css/31380ebc6e671486.css +0 -1
  508. package/.next/static/css/42df884711219edb.css +0 -1
  509. package/.next/static/css/4f0597b0bf0ef2e1.css +0 -1
  510. package/.next/static/css/54cedf4b65e5863f.css +0 -1
  511. package/.next/static/css/6580147d7ab8fcca.css +0 -1
  512. package/.next/static/css/6819dddf2b1b5ea7.css +0 -1
  513. package/.next/static/css/7ef7762f412ed665.css +0 -1
  514. package/.next/static/css/82f3cd529b672812.css +0 -1
  515. package/.next/static/css/837662922091162f.css +0 -1
  516. package/.next/static/css/8e6ab59ace21e03b.css +0 -1
  517. package/.next/static/css/a852afa9be31e946.css +0 -1
  518. package/.next/static/css/b684b347c5cc6514.css +0 -1
  519. package/.next/static/css/bcdaef0a83277ef5.css +0 -1
  520. package/.next/static/css/c33615999008d3f9.css +0 -1
  521. package/.next/static/css/c34f6ea9953e2f63.css +0 -1
  522. package/.next/static/css/ea11d74a2848b093.css +0 -1
  523. package/.next/static/css/f16438bcf4508fb3.css +0 -1
  524. package/.next/static/css/f60366555f563deb.css +0 -1
  525. package/.next/static/es3Z4hhE6B4Nut0ZqqUuB/_buildManifest.js +0 -1
  526. package/.next/static/es3Z4hhE6B4Nut0ZqqUuB/_ssgManifest.js +0 -1
  527. package/.next/trace +0 -143
  528. package/.turbo/turbo-build.log +0 -134
  529. package/jest.config.js +0 -17
  530. package/public/~partytown/debug/partytown-atomics.js +0 -556
  531. package/public/~partytown/debug/partytown-media.js +0 -374
  532. package/public/~partytown/debug/partytown-sandbox-sw.js +0 -543
  533. package/public/~partytown/debug/partytown-sw.js +0 -59
  534. package/public/~partytown/debug/partytown-ww-atomics.js +0 -1789
  535. package/public/~partytown/debug/partytown-ww-sw.js +0 -1781
  536. package/public/~partytown/debug/partytown.js +0 -72
  537. package/public/~partytown/partytown-atomics.js +0 -2
  538. package/public/~partytown/partytown-media.js +0 -2
  539. package/public/~partytown/partytown-sw.js +0 -2
  540. package/public/~partytown/partytown.js +0 -2
  541. package/src/middleware__DISABLED.ts +0 -65
  542. package/src/server/generator/generateGraphQLSchemaFile.ts +0 -3
  543. package/src/server/generator/schema.ts +0 -81
@@ -0,0 +1,124 @@
1
+ import { useRef, useState } from 'react'
2
+
3
+ import type { PopoverProps } from '@faststore/ui'
4
+ import { Icon, Button as UIButton } from '@faststore/ui'
5
+
6
+ import storeConfig from 'discovery.config'
7
+ import LocalizationSelector from 'src/components/localization/LocalizationSelector'
8
+ import { useBindingSelector } from 'src/sdk/localization'
9
+ import { useSession } from 'src/sdk/session'
10
+
11
+ export interface LocalizationButtonErrorMessages {
12
+ noBindingFound?: string
13
+ invalidUrl?: string
14
+ noCurrencies?: string
15
+ defaultError?: string
16
+ }
17
+
18
+ export interface LocalizationButtonProps {
19
+ icon?: string
20
+ title?: string
21
+ languageLabel?: string
22
+ currencyLabel?: string
23
+ description?: string
24
+ saveLabel?: string
25
+ ariaLabel?: string
26
+ errorMessages?: LocalizationButtonErrorMessages
27
+ popoverPlacement?: PopoverProps['placement']
28
+ }
29
+
30
+ const LocalizationButton = ({
31
+ icon,
32
+ title,
33
+ languageLabel,
34
+ currencyLabel,
35
+ description,
36
+ saveLabel,
37
+ ariaLabel,
38
+ errorMessages,
39
+ popoverPlacement,
40
+ }: LocalizationButtonProps) => {
41
+ const [isSelectorOpen, setIsSelectorOpen] = useState(false)
42
+ const buttonRef = useRef<HTMLButtonElement>(null)
43
+
44
+ const {
45
+ languages,
46
+ currencies,
47
+ localeCode,
48
+ currencyCode,
49
+ setLocaleCode,
50
+ setCurrencyCode,
51
+ save,
52
+ isSaveEnabled,
53
+ error,
54
+ } = useBindingSelector()
55
+
56
+ const { locale: sessionLocale, currency: sessionCurrency } = useSession()
57
+
58
+ // Don't render if localization is not enabled
59
+ if (!storeConfig.localization?.enabled) {
60
+ return null
61
+ }
62
+
63
+ // Extract language code from session locale for display (e.g., "pt-BR" -> "PT")
64
+ const localeText = sessionLocale?.split('-')[0].toUpperCase() ?? ''
65
+ const currencyText = sessionCurrency?.code ?? ''
66
+
67
+ return (
68
+ <>
69
+ <UIButton
70
+ ref={buttonRef}
71
+ data-fs-localization-button
72
+ icon={
73
+ icon ? (
74
+ <Icon name={icon} width={16} height={16} weight="bold" />
75
+ ) : undefined
76
+ }
77
+ iconPosition="left"
78
+ variant="tertiary"
79
+ onClick={() => {
80
+ setIsSelectorOpen(!isSelectorOpen)
81
+ }}
82
+ >
83
+ <div data-localization-button-text>
84
+ <span data-localization-button-text-locale>{localeText}</span>
85
+ <span data-localization-button-text-separator>/</span>
86
+ <span data-localization-button-text-currency>{currencyText}</span>
87
+ </div>
88
+ <Icon
89
+ data-localization-button-arrow
90
+ name="CaretDown"
91
+ width={16}
92
+ height={16}
93
+ aria-label={ariaLabel}
94
+ />
95
+ </UIButton>
96
+
97
+ {isSelectorOpen && (
98
+ <LocalizationSelector
99
+ isOpen={isSelectorOpen}
100
+ onClose={() => setIsSelectorOpen(false)}
101
+ triggerRef={buttonRef}
102
+ languages={languages}
103
+ currencies={currencies}
104
+ localeCode={localeCode}
105
+ currencyCode={currencyCode}
106
+ onLocaleChange={setLocaleCode}
107
+ onCurrencyChange={setCurrencyCode}
108
+ onSave={save}
109
+ isSaveEnabled={isSaveEnabled}
110
+ error={error}
111
+ title={title}
112
+ languageLabel={languageLabel}
113
+ currencyLabel={currencyLabel}
114
+ description={description}
115
+ saveLabel={saveLabel}
116
+ errorMessages={errorMessages}
117
+ popoverPlacement={popoverPlacement}
118
+ />
119
+ )}
120
+ </>
121
+ )
122
+ }
123
+
124
+ export default LocalizationButton
@@ -0,0 +1 @@
1
+ export { default } from './LocalizationButton'
@@ -49,7 +49,7 @@ function PickupPointCards({
49
49
  title: regionErrorMessage,
50
50
  description: regionErrorHelperMessage,
51
51
  },
52
- choosePickupPointAriaLabel = 'Select a store',
52
+ choosePickupPointAriaLabel,
53
53
  }: PickupPointCardsProps) {
54
54
  if (regionErrorMessage) {
55
55
  return (
@@ -68,9 +68,7 @@ function PickupPointCards({
68
68
  if (noPickupPointsAvailableMessage) {
69
69
  return (
70
70
  <UIEmptyState
71
- title={
72
- noPickupPointsAvailableMessage ?? 'No available stores near location.'
73
- }
71
+ title={noPickupPointsAvailableMessage}
74
72
  titleIcon={
75
73
  <UIIcon name="Storefront" width={56} height={56} weight="thin" />
76
74
  }
@@ -1,10 +1,10 @@
1
- import React, { useCallback, useEffect } from 'react'
2
1
  import {
3
2
  type IProductComparison,
4
3
  type ProductComparisonSidebarProps as UIProductComparisonSidebarProps,
5
4
  ProductComparisonSidebar as UIProductComparisonSidebar,
6
5
  useProductComparison,
7
6
  } from '@faststore/ui'
7
+ import React from 'react'
8
8
 
9
9
  import { gql } from '@generated/gql'
10
10
  import type { ClientManyProductsSelectedQueryQuery } from '@generated/graphql'
@@ -12,24 +12,38 @@ import type { ClientManyProductsSelectedQueryQuery } from '@generated/graphql'
12
12
  import { useBuyButton } from 'src/sdk/cart/useBuyButton'
13
13
  import { useProductsSelected } from 'src/sdk/product/useProductsSelected'
14
14
 
15
- const sortOptions = [
16
- {
17
- value: 'productByName',
18
- label: 'Product Name',
19
- onChange: (productComparison: IProductComparison[]) =>
20
- productComparison.sort((a, b) => a.name.localeCompare(b.name)),
21
- },
22
- {
23
- value: 'productByPrice',
24
- label: 'Price',
25
- onChange: (productComparison: IProductComparison[]) =>
26
- productComparison.sort((a, b) => a.offers.lowPrice - b.offers.lowPrice),
27
- },
28
- ] as const
15
+ type SortOptionsValue = 'productByName' | 'productByPrice'
29
16
 
30
- export type SortOptions = (typeof sortOptions)[number]
17
+ export type SortOptions = {
18
+ value: SortOptionsValue
19
+ label: string
20
+ onChange: (productComparison: IProductComparison[]) => IProductComparison[]
21
+ }
22
+
23
+ function getSortOptions(
24
+ sortOptionsLabels: Record<SortOptionsValue, string>
25
+ ): SortOptions[] {
26
+ const { productByName = '', productByPrice = '' } = sortOptionsLabels
27
+ return [
28
+ {
29
+ value: 'productByName',
30
+ label: productByName,
31
+ onChange: (productComparison: IProductComparison[]) =>
32
+ productComparison.sort((a, b) => a.name.localeCompare(b.name)),
33
+ },
34
+ {
35
+ value: 'productByPrice',
36
+ label: productByPrice,
37
+ onChange: (productComparison: IProductComparison[]) =>
38
+ productComparison.sort((a, b) => a.offers.lowPrice - b.offers.lowPrice),
39
+ },
40
+ ]
41
+ }
31
42
 
32
43
  function ProductComparisonSidebar(props: UIProductComparisonSidebarProps) {
44
+ const {
45
+ sortLabels: { options: sortOptionsLabels = {} } = {},
46
+ } = props
33
47
  const { productIds, products, isOpen, handleProductsComparison } =
34
48
  useProductComparison()
35
49
  const [productIdToBuy, setProductIdToBuy] = React.useState<string | null>(
@@ -159,7 +173,10 @@ function ProductComparisonSidebar(props: UIProductComparisonSidebarProps) {
159
173
  <UIProductComparisonSidebar
160
174
  handleProductToBuy={setProductIdToBuy}
161
175
  setPendingEvent={setPendingEvent}
162
- sortOptions={[...sortOptions]}
176
+ sortOptions={getSortOptions({
177
+ productByName: sortOptionsLabels?.productByName,
178
+ productByPrice: sortOptionsLabels?.productByPrice,
179
+ })}
163
180
  {...props}
164
181
  />
165
182
  )
@@ -1,10 +1,10 @@
1
- import { useState, useMemo } from 'react'
1
+ import { useMemo, useState } from 'react'
2
2
 
3
3
  import {
4
4
  Accordion as UIAccordion,
5
+ AccordionButton as UIAccordionButton,
5
6
  AccordionItem as UIAccordionItem,
6
7
  AccordionPanel as UIAccordionPanel,
7
- AccordionButton as UIAccordionButton,
8
8
  } from '@faststore/ui'
9
9
 
10
10
  type DescriptionData = {
@@ -24,11 +24,16 @@ interface ProductDescriptionProps {
24
24
  *
25
25
  */
26
26
  descriptionData: DescriptionData[]
27
+ /**
28
+ * For accessibility purposes, define a string that labels the current product description.
29
+ */
30
+ accordionAriaLabel?: string
27
31
  }
28
32
 
29
33
  function ProductDescription({
30
34
  descriptionData,
31
35
  initiallyExpanded = 'first',
36
+ accordionAriaLabel,
32
37
  }: ProductDescriptionProps) {
33
38
  /**
34
39
  * Maps 'initiallyExpanded' prop values to indices
@@ -65,7 +70,7 @@ function ProductDescription({
65
70
  <UIAccordion
66
71
  indices={indices}
67
72
  onChange={onChange}
68
- aria-label="Product Details Content"
73
+ aria-label={accordionAriaLabel}
69
74
  >
70
75
  {descriptionData.map(({ title, content }, index) => (
71
76
  <UIAccordionItem
@@ -1,4 +1,8 @@
1
- export default function AddToCartLoadingSkeleton() {
1
+ export default function AddToCartLoadingSkeleton({
2
+ loadingLabel,
3
+ }: {
4
+ loadingLabel?: string
5
+ }) {
2
6
  return (
3
7
  // Generated via https://skeletonreact.com/.
4
8
  <svg
@@ -9,7 +13,7 @@ export default function AddToCartLoadingSkeleton() {
9
13
  viewBox="0 0 112 48"
10
14
  preserveAspectRatio="none"
11
15
  >
12
- <title id="loading-aria">Loading...</title>
16
+ <title id="loading-aria">{loadingLabel}</title>
13
17
  <rect
14
18
  x="0"
15
19
  y="0"
@@ -1,8 +1,8 @@
1
1
  import type { Dispatch, SetStateAction } from 'react'
2
2
  import { useMemo } from 'react'
3
3
 
4
- import type { ProductDetailsFragment_ProductFragment } from '@generated/graphql'
5
4
  import { Skeleton as UISkeleton } from '@faststore/ui'
5
+ import type { ProductDetailsFragment_ProductFragment } from '@generated/graphql'
6
6
 
7
7
  import { useBuyButton } from 'src/sdk/cart/useBuyButton'
8
8
  import { useFormattedPrice } from 'src/sdk/product/useFormattedPrice'
@@ -29,6 +29,11 @@ interface ProductDetailsSettingsProps {
29
29
  usePriceWithTaxes?: boolean
30
30
  taxesLabel?: string
31
31
  }
32
+ invalidQuantityToastLabels?: {
33
+ title?: string
34
+ message?: string
35
+ }
36
+ loadingLabel?: string
32
37
  }
33
38
 
34
39
  function ProductDetailsSettings({
@@ -41,6 +46,8 @@ function ProductDetailsSettings({
41
46
  notAvailableButtonTitle,
42
47
  useUnitMultiplier = false,
43
48
  taxesConfiguration,
49
+ invalidQuantityToastLabels,
50
+ loadingLabel,
44
51
  }: ProductDetailsSettingsProps) {
45
52
  const {
46
53
  BuyButton,
@@ -125,6 +132,7 @@ function ProductDetailsSettings({
125
132
  formatter={useFormattedPrice}
126
133
  {...ProductPrice.props}
127
134
  />
135
+
128
136
  {taxesConfiguration?.usePriceWithTaxes && (
129
137
  <UILabel data-fs-product-details-taxes-label>
130
138
  {taxesConfiguration?.taxesLabel}
@@ -147,8 +155,12 @@ function ProductDetailsSettings({
147
155
  quantity: number
148
156
  ) => {
149
157
  pushToast({
150
- title: 'Invalid quantity!',
151
- message: `The quantity you entered is outside the range of ${min} to ${maxValue}. The quantity was set to ${quantity}.`,
158
+ title: invalidQuantityToastLabels?.title,
159
+ message:
160
+ invalidQuantityToastLabels?.message
161
+ ?.replace('%{min}', min.toString())
162
+ ?.replace('%{max}', maxValue.toString())
163
+ ?.replace('%{quantity}', quantity.toString()) || '',
152
164
  status: 'INFO',
153
165
  icon: (
154
166
  <UIIcon name="CircleWavyWarning" width={30} height={30} />
@@ -172,7 +184,7 @@ function ProductDetailsSettings({
172
184
  non-composited animation violation due to the button transitioning its
173
185
  background color when changing from its initial disabled to active state.
174
186
  See full explanation on commit https://git.io/JyXV5. */
175
- <AddToCartLoadingSkeleton />
187
+ <AddToCartLoadingSkeleton loadingLabel={loadingLabel} />
176
188
  ) : outOfStock ? (
177
189
  // TODO: Adds <OutOfStock /> when component is ready to use
178
190
  <NotAvailableButton.Component>
@@ -190,7 +202,7 @@ function ProductDetailsSettings({
190
202
  }
191
203
  {...buyProps}
192
204
  >
193
- {buyButtonTitle || 'Add to Cart'}
205
+ {buyButtonTitle}
194
206
  </BuyButton.Component>
195
207
  )}
196
208
  </>
@@ -71,13 +71,17 @@ export interface ProductGalleryProps {
71
71
  selectionWarning: string
72
72
  sidebarComponent?: {
73
73
  title: string
74
- sortLabel: string
74
+ sortLabels?: {
75
+ label?: string
76
+ options?: {
77
+ productByName?: string
78
+ productByPrice?: string
79
+ }
80
+ }
75
81
  filterLabel: string
76
- productNameFilterLabel: string
77
82
  preferencesLabel: string
78
83
  toggleFieldLabel: string
79
84
  cartButtonLabel: string
80
- priceLabel: string
81
85
  priceWithTaxLabel: string
82
86
  }
83
87
  technicalInformation?: {
@@ -63,9 +63,7 @@ function ProductGalleryPage({
63
63
  firstPage={firstPage}
64
64
  title={title}
65
65
  searchId={searchId}
66
- buildExtraProductProps={
67
- (searchId && buildExtraProductProps) || undefined
68
- }
66
+ buildExtraProductProps={searchId ? buildExtraProductProps : undefined}
69
67
  />
70
68
  </Sentinel>
71
69
  )
@@ -20,6 +20,7 @@ interface ShippingSimulationProps
20
20
  quantity: number
21
21
  seller: string
22
22
  }
23
+ invalidPostalCodeErrorMessage?: string
23
24
  }
24
25
 
25
26
  export default function ShippingSimulation({
@@ -28,6 +29,7 @@ export default function ShippingSimulation({
28
29
  inputLabel,
29
30
  title,
30
31
  idkPostalCodeLinkProps,
32
+ invalidPostalCodeErrorMessage,
31
33
  ...otherProps
32
34
  }: ShippingSimulationProps) {
33
35
  const { ShippingSimulation: ShippingSimulationWrapper } =
@@ -39,7 +41,10 @@ export default function ShippingSimulation({
39
41
  handleSubmit,
40
42
  handleOnInput,
41
43
  handleOnClear,
42
- } = useShippingSimulation(productShippingInfo)
44
+ } = useShippingSimulation({
45
+ shippingItem: productShippingInfo,
46
+ invalidPostalCodeErrorMessage,
47
+ })
43
48
 
44
49
  const { postalCode, displayClearButton, errorMessage } = input
45
50
 
@@ -1,5 +1,3 @@
1
1
  // ----------------------------------------------------------
2
2
  // Stores' custom mixins will override this file
3
3
  // ----------------------------------------------------------
4
-
5
- @import "@faststore/ui/src/styles/base/utilities.scss";
@@ -53,3 +53,29 @@ export {
53
53
  deliveryPromiseStore as deliveryPromiseStore_unstable,
54
54
  useDeliveryPromise as useDeliveryPromise_unstable,
55
55
  } from 'src/sdk/deliveryPromise'
56
+
57
+ // Localization
58
+ export { default as LocalizationSelector_unstable } from '../components/localization/LocalizationSelector'
59
+ export type {
60
+ LocalizationSelectorErrorMessages,
61
+ LocalizationSelectorProps,
62
+ } from '../components/localization/LocalizationSelector/LocalizationSelector'
63
+ export { default as LocalizationButton_unstable } from '../components/ui/LocalizationButton'
64
+ export type {
65
+ LocalizationButtonErrorMessages,
66
+ LocalizationButtonProps,
67
+ } from '../components/ui/LocalizationButton/LocalizationButton'
68
+ export {
69
+ useBindingSelector as useBindingSelector_unstable,
70
+ useLocaleValidation as useLocaleValidation_unstable,
71
+ } from '../sdk/localization'
72
+ export {
73
+ isValidUrl as isValidUrl_unstable,
74
+ resolveBinding as resolveBinding_unstable,
75
+ } from '../sdk/localization/bindingSelector'
76
+ export type {
77
+ Binding,
78
+ BindingSelectorError,
79
+ Locale,
80
+ } from '../sdk/localization/types'
81
+ export type { UseBindingSelectorReturn } from '../sdk/localization/useBindingSelector'
@@ -15,6 +15,7 @@ import { execute } from 'src/server'
15
15
 
16
16
  import { validateUser } from 'src/sdk/account/validateUser'
17
17
  import { injectGlobalSections } from 'src/server/cms/global'
18
+ import { withLocaleValidationSSR } from 'src/utils/localization/withLocaleValidation'
18
19
  import { getMyAccountRedirect } from 'src/utils/myAccountRedirect'
19
20
  import storeConfig from '../../discovery.config'
20
21
 
@@ -32,11 +33,15 @@ const query = gql(`
32
33
  }
33
34
  `)
34
35
 
35
- export const getServerSideProps: GetServerSideProps<
36
+ const getServerSidePropsBase: GetServerSideProps<
36
37
  MyAccountProps,
37
38
  Record<string, string>,
38
39
  Locator
39
40
  > = async (context) => {
41
+ const contentContext = {
42
+ previewData: context.previewData,
43
+ locale: context.locale,
44
+ }
40
45
  const validationResult = await validateUser(context)
41
46
 
42
47
  // Guard clause: Early redirect to login if user is invalid and doesn't need refresh
@@ -77,7 +82,7 @@ export const getServerSideProps: GetServerSideProps<
77
82
  globalSectionsPromise,
78
83
  globalSectionsHeaderPromise,
79
84
  globalSectionsFooterPromise,
80
- ] = getGlobalSectionsData(context.previewData)
85
+ ] = getGlobalSectionsData(contentContext)
81
86
 
82
87
  const [account, globalSections, globalSectionsHeader, globalSectionsFooter] =
83
88
  await Promise.all([
@@ -110,3 +115,7 @@ export const getServerSideProps: GetServerSideProps<
110
115
  },
111
116
  }
112
117
  }
118
+
119
+ export const getServerSideProps = withLocaleValidationSSR(
120
+ getServerSidePropsBase
121
+ )
@@ -3,24 +3,26 @@ import type { SearchPageProps } from './getStaticProps'
3
3
 
4
4
  import storeConfig from 'discovery.config'
5
5
  import { getGlobalSectionsData } from 'src/components/cms/GlobalSections'
6
- import { type SearchContentType, getPage } from 'src/server/cms'
6
+ import type { SearchContentType } from 'src/server/cms'
7
7
  import { injectGlobalSections } from 'src/server/cms/global'
8
- import type { PreviewData } from 'src/server/content/types'
9
8
  import { contentService } from 'src/server/content/service'
9
+ import type { PreviewData } from 'src/server/content/types'
10
+ import { withLocaleValidationSSR } from 'src/utils/localization/withLocaleValidation'
10
11
 
11
- export const getServerSideProps: GetServerSideProps<
12
+ const getServerSidePropsBase: GetServerSideProps<
12
13
  SearchPageProps,
13
14
  Record<string, string>,
14
15
  PreviewData
15
16
  > = async (context) => {
16
- const { previewData, query, res } = context
17
+ const { previewData, query, res, locale } = context
17
18
  const searchTerm = (query.q as string)?.split('+').join(' ')
19
+ const contentContext = { previewData, locale }
18
20
 
19
21
  const [
20
22
  globalSectionsPromise,
21
23
  globalSectionsHeaderPromise,
22
24
  globalSectionsFooterPromise,
23
- ] = getGlobalSectionsData(previewData)
25
+ ] = getGlobalSectionsData(contentContext)
24
26
 
25
27
  if (storeConfig.cms.data) {
26
28
  const cmsData = JSON.parse(storeConfig.cms.data)
@@ -33,8 +35,8 @@ export const getServerSideProps: GetServerSideProps<
33
35
  globalSectionsFooter,
34
36
  ] = await Promise.all([
35
37
  contentService.getSingleContent<SearchContentType>({
38
+ ...contentContext,
36
39
  contentType: 'search',
37
- previewData,
38
40
  documentId: page.documentId,
39
41
  versionId: page.versionId,
40
42
  releaseId: page.releaseId,
@@ -62,8 +64,8 @@ export const getServerSideProps: GetServerSideProps<
62
64
  const [page, globalSections, globalSectionsHeader, globalSectionsFooter] =
63
65
  await Promise.all([
64
66
  contentService.getSingleContent<SearchContentType>({
67
+ ...contentContext,
65
68
  contentType: 'search',
66
- previewData,
67
69
  }),
68
70
  globalSectionsPromise,
69
71
  globalSectionsHeaderPromise,
@@ -89,3 +91,7 @@ export const getServerSideProps: GetServerSideProps<
89
91
  },
90
92
  }
91
93
  }
94
+
95
+ export const getServerSideProps = withLocaleValidationSSR(
96
+ getServerSidePropsBase
97
+ )
@@ -24,12 +24,13 @@ export const getStaticProps: GetStaticProps<
24
24
  Record<string, string>,
25
25
  PreviewData
26
26
  > = async (context) => {
27
- const { previewData } = context
27
+ const { previewData, locale } = context
28
+ const contentContext = { previewData, locale }
28
29
  const [
29
30
  globalSectionsPromise,
30
31
  globalSectionsHeaderPromise,
31
32
  globalSectionsFooterPromise,
32
- ] = getGlobalSectionsData(previewData)
33
+ ] = getGlobalSectionsData(contentContext)
33
34
 
34
35
  if (storeConfig.cms.data) {
35
36
  const cmsData = JSON.parse(storeConfig.cms.data)
@@ -43,8 +44,8 @@ export const getStaticProps: GetStaticProps<
43
44
  globalSectionsFooter,
44
45
  ] = await Promise.all([
45
46
  contentService.getSingleContent<SearchContentType>({
47
+ ...contentContext,
46
48
  contentType: 'search',
47
- previewData,
48
49
  documentId: page.documentId,
49
50
  versionId: page.versionId,
50
51
  releaseId: page.releaseId,
@@ -69,8 +70,8 @@ export const getStaticProps: GetStaticProps<
69
70
  const [page, globalSections, globalSectionsHeader, globalSectionsFooter] =
70
71
  await Promise.all([
71
72
  contentService.getSingleContent<SearchContentType>({
73
+ ...contentContext,
72
74
  contentType: 'search',
73
- previewData,
74
75
  }),
75
76
  globalSectionsPromise,
76
77
  globalSectionsHeaderPromise,
@@ -1,11 +1,25 @@
1
+ import config from '../discovery.config'
2
+ import pkgJSON from '../package.json'
3
+
1
4
  export async function register() {
2
- if (process.env.NEXT_RUNTIME === 'nodejs') {
3
- const isProduction = process.env.NODE_ENV === 'production'
4
- const isVercel = !!process.env.VERCEL
5
+ if (
6
+ process.env.NEXT_RUNTIME === 'nodejs' &&
7
+ config.analytics.otelEnabled === true
8
+ ) {
9
+ const { name, version } = pkgJSON
10
+ try {
11
+ const { getTelemetryClient } = await import('@faststore/diagnostics')
12
+ console.log('Instrumemtation.ts: Getting telemetry client')
5
13
 
6
- if (isProduction && !isVercel) {
7
- await require('pino')
8
- await require('next-logger')
14
+ return getTelemetryClient({
15
+ serviceName: config.analytics?.serviceName ?? name,
16
+ version,
17
+ account: config.api.storeId,
18
+ clientName: config.api.storeId,
19
+ packageName: name,
20
+ })
21
+ } catch (error) {
22
+ console.error('Failed to initialize OTEL Instrumentation')
9
23
  }
10
24
  }
11
25
  }
package/src/pages/404.tsx CHANGED
@@ -8,7 +8,6 @@ import {
8
8
 
9
9
  import { default as GLOBAL_COMPONENTS } from 'src/components/cms/global/Components'
10
10
  import RenderSections from 'src/components/cms/RenderSections'
11
- import { getComponentKey } from 'src/utils/cms'
12
11
  import { OverriddenDefaultEmptyState as EmptyState } from 'src/components/sections/EmptyState/OverriddenDefaultEmptyState'
13
12
  import CUSTOM_COMPONENTS from 'src/customizations/src/components'
14
13
  import PLUGINS_COMPONENTS from 'src/plugins'
@@ -17,6 +16,7 @@ import type { PageContentType } from 'src/server/cms'
17
16
  import { injectGlobalSections } from 'src/server/cms/global'
18
17
  import { contentService } from 'src/server/content/service'
19
18
  import type { PreviewData } from 'src/server/content/types'
19
+ import { getComponentKey } from 'src/utils/cms'
20
20
 
21
21
  /* A list of components that can be used in the CMS. */
22
22
  const COMPONENTS: Record<string, ComponentType<any>> = {
@@ -67,18 +67,19 @@ export const getStaticProps: GetStaticProps<
67
67
  Props,
68
68
  Record<string, string>,
69
69
  PreviewData
70
- > = async ({ previewData }) => {
70
+ > = async ({ previewData, locale }) => {
71
+ const contentContext = { previewData, locale }
71
72
  const [
72
73
  globalSectionsPromise,
73
74
  globalSectionsHeaderPromise,
74
75
  globalSectionsFooterPromise,
75
- ] = getGlobalSectionsData(previewData)
76
+ ] = getGlobalSectionsData(contentContext)
76
77
 
77
78
  const [page, globalSections, globalSectionsHeader, globalSectionsFooter] =
78
79
  await Promise.all([
79
80
  contentService.getSingleContent<PageContentType>({
81
+ ...contentContext,
80
82
  contentType: '404',
81
- previewData,
82
83
  }),
83
84
  globalSectionsPromise,
84
85
  globalSectionsHeaderPromise,