@faststore/core 3.99.1 → 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 +11 -5
  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/NAuY8lqaeBBZf9CMZuYI2/_buildManifest.js +0 -1
  414. package/.next/static/NAuY8lqaeBBZf9CMZuYI2/_ssgManifest.js +0 -1
  415. package/.next/static/chunks/227-f109b24190a008ab.js +0 -8
  416. package/.next/static/chunks/2284.185d834d9829b652.js +0 -1
  417. package/.next/static/chunks/2851.e68ed3c8d27a032a.js +0 -1
  418. package/.next/static/chunks/2927.5a79877943a6bf7c.js +0 -1
  419. package/.next/static/chunks/3155.7bc4c730a79d9ecb.js +0 -1
  420. package/.next/static/chunks/3166-0b30a3887c0c346d.js +0 -1
  421. package/.next/static/chunks/3399.017c5209b74b0d97.js +0 -1
  422. package/.next/static/chunks/3483.ef53d632a763da3f.js +0 -1
  423. package/.next/static/chunks/349.b3b38e1e9f719dda.js +0 -1
  424. package/.next/static/chunks/3802.5e8b0b689eacc0f8.js +0 -1
  425. package/.next/static/chunks/3836.620480018be48233.js +0 -1
  426. package/.next/static/chunks/4436.e7af66f0b654ee36.js +0 -1
  427. package/.next/static/chunks/4803.b1920b6e3a1a6304.js +0 -1
  428. package/.next/static/chunks/5796.4351370494d8b8b6.js +0 -1
  429. package/.next/static/chunks/6393.55f991b1a6bb4fe7.js +0 -1
  430. package/.next/static/chunks/6700.b23221a57514e737.js +0 -1
  431. package/.next/static/chunks/6789.960162355435a81d.js +0 -1
  432. package/.next/static/chunks/7191-befad64ba238a817.js +0 -1
  433. package/.next/static/chunks/7692.8d5bf4560341a2f6.js +0 -1
  434. package/.next/static/chunks/7861.7f9f1a124a43da30.js +0 -6
  435. package/.next/static/chunks/8068.43663fb64762f7b8.js +0 -1
  436. package/.next/static/chunks/83.e0c16f0299b364a5.js +0 -1
  437. package/.next/static/chunks/8325.dabe9aa22eaadeed.js +0 -1
  438. package/.next/static/chunks/8587.53c8ce185ed1a2cb.js +0 -1
  439. package/.next/static/chunks/9173-e89da04079c35360.js +0 -2
  440. package/.next/static/chunks/9237.7555603703f81bf7.js +0 -1
  441. package/.next/static/chunks/9298-1d1ed0a54133cb59.js +0 -28
  442. package/.next/static/chunks/9399.d116a7fd62024783.js +0 -1
  443. package/.next/static/chunks/941.3e2782ab9c490eb0.js +0 -1
  444. package/.next/static/chunks/9701.f9a0bfffba8807dc.js +0 -1
  445. package/.next/static/chunks/9909.787576b171184aa5.js +0 -1
  446. package/.next/static/chunks/9960.7ef77f8a8b046170.js +0 -1
  447. package/.next/static/chunks/9979.aedbc094bdc2c599.js +0 -1
  448. package/.next/static/chunks/BannerNewsletter.00328ad162109908.js +0 -1
  449. package/.next/static/chunks/BannerText.dbbec87cadb8a521.js +0 -1
  450. package/.next/static/chunks/ButtonSignIn.f6e210eaca873e48.js +0 -1
  451. package/.next/static/chunks/CartItem.b34e295377f6f94f.js +0 -1
  452. package/.next/static/chunks/CartSidebar.ac447d1ef6276da1.js +0 -1
  453. package/.next/static/chunks/Dropdown.38b48c749bad6b60.js +0 -1
  454. package/.next/static/chunks/DropdownButton.66fa6b25dddb3a07.js +0 -1
  455. package/.next/static/chunks/DropdownItem.38b8f5a07c7f422a.js +0 -1
  456. package/.next/static/chunks/DropdownMenu.48b11521a24c6efd.js +0 -1
  457. package/.next/static/chunks/EmptyCart.320e2f94a0d5e6b1.js +0 -1
  458. package/.next/static/chunks/FilterSkeleton.7ab99e28f92341c9.js +0 -1
  459. package/.next/static/chunks/Footer.166b02c2f13980c6.js +0 -1
  460. package/.next/static/chunks/Gift.c49ba26da2fbab5e.js +0 -1
  461. package/.next/static/chunks/Newsletter.fc406f6029057022.js +0 -1
  462. package/.next/static/chunks/OrderSummary.5957d69f990d9add.js +0 -1
  463. package/.next/static/chunks/PreviewTag.f4f0c8710a7bcad9.js +0 -1
  464. package/.next/static/chunks/ProductShelf.cc46f5cdeeaeaff6.js +0 -1
  465. package/.next/static/chunks/ProductTiles.9b804e51b0704d60.js +0 -1
  466. package/.next/static/chunks/RegionModal.319ad44250cb12d2.js +0 -1
  467. package/.next/static/chunks/RegionSlider.0e0e93369f4f9c92.js +0 -1
  468. package/.next/static/chunks/ScrollToTopButton.c15431f2e8bb93ef.js +0 -1
  469. package/.next/static/chunks/ShoppingAssistant.ba191eb4dbed67e5.js +0 -1
  470. package/.next/static/chunks/Toast.5f90f0436708be5e.js +0 -1
  471. package/.next/static/chunks/UIBannerText.7315b16af4457059.js +0 -1
  472. package/.next/static/chunks/UISKUMatrixSidebar.b4349b2682bbe183.js +0 -1
  473. package/.next/static/chunks/UIToast.19a8664c01a00d3a.js +0 -1
  474. package/.next/static/chunks/framework-d514426edf885c68.js +0 -33
  475. package/.next/static/chunks/main-ec03882c4375091d.js +0 -1
  476. package/.next/static/chunks/pages/404-e3dfbbac003b02a2.js +0 -1
  477. package/.next/static/chunks/pages/500-c7814e085081d7b8.js +0 -1
  478. package/.next/static/chunks/pages/[...slug]-dc8a395a43b081f1.js +0 -1
  479. package/.next/static/chunks/pages/[slug]/p-644f1132f5a0f736.js +0 -1
  480. package/.next/static/chunks/pages/_app-84aaff8a9d4de60e.js +0 -1
  481. package/.next/static/chunks/pages/_error-2b0148be56a716e9.js +0 -1
  482. package/.next/static/chunks/pages/checkout-2071467ad42dfb99.js +0 -1
  483. package/.next/static/chunks/pages/index-8774d5b4a8744eb2.js +0 -1
  484. package/.next/static/chunks/pages/login-e74747c9f9cb5b49.js +0 -1
  485. package/.next/static/chunks/pages/pvt/account/403-491e6b062487b30f.js +0 -1
  486. package/.next/static/chunks/pages/pvt/account/404-5ad472d9f2ee1980.js +0 -1
  487. package/.next/static/chunks/pages/pvt/account/[...unknown]-f80f645594d2740c.js +0 -1
  488. package/.next/static/chunks/pages/pvt/account/orders/[id]-64e42157c0974c48.js +0 -1
  489. package/.next/static/chunks/pages/pvt/account/orders-faab39f2aff05fae.js +0 -1
  490. package/.next/static/chunks/pages/pvt/account/profile-9672177ee2665bc0.js +0 -1
  491. package/.next/static/chunks/pages/pvt/account/security-03eb1ccab9a30563.js +0 -1
  492. package/.next/static/chunks/pages/pvt/account/user-details-7838e3f79781596c.js +0 -1
  493. package/.next/static/chunks/pages/pvt/account-65fefcc699344bdb.js +0 -1
  494. package/.next/static/chunks/pages/s-162ba789e6611175.js +0 -1
  495. package/.next/static/chunks/polyfills-c67a75d1b6f99dc8.js +0 -1
  496. package/.next/static/chunks/webpack-f621ff3e951d2982.js +0 -1
  497. package/.next/static/css/02259c549b2179f2.css +0 -1
  498. package/.next/static/css/02eaf202d3d11fd1.css +0 -1
  499. package/.next/static/css/033e241c58ba6fbb.css +0 -1
  500. package/.next/static/css/042d012bc1895b5c.css +0 -1
  501. package/.next/static/css/14176a4704ff97b2.css +0 -1
  502. package/.next/static/css/146a8678babc61bf.css +0 -1
  503. package/.next/static/css/16d65422bfa80f51.css +0 -1
  504. package/.next/static/css/1c4983f11b861ea0.css +0 -1
  505. package/.next/static/css/204754bbd8cc4bef.css +0 -1
  506. package/.next/static/css/24d91007fc96be10.css +0 -1
  507. package/.next/static/css/2980acad3f8e1028.css +0 -1
  508. package/.next/static/css/2c19433e38fd7533.css +0 -1
  509. package/.next/static/css/31380ebc6e671486.css +0 -1
  510. package/.next/static/css/42df884711219edb.css +0 -1
  511. package/.next/static/css/4f0597b0bf0ef2e1.css +0 -1
  512. package/.next/static/css/54cedf4b65e5863f.css +0 -1
  513. package/.next/static/css/6580147d7ab8fcca.css +0 -1
  514. package/.next/static/css/6819dddf2b1b5ea7.css +0 -1
  515. package/.next/static/css/7ef7762f412ed665.css +0 -1
  516. package/.next/static/css/82f3cd529b672812.css +0 -1
  517. package/.next/static/css/837662922091162f.css +0 -1
  518. package/.next/static/css/8e6ab59ace21e03b.css +0 -1
  519. package/.next/static/css/a852afa9be31e946.css +0 -1
  520. package/.next/static/css/b684b347c5cc6514.css +0 -1
  521. package/.next/static/css/bcdaef0a83277ef5.css +0 -1
  522. package/.next/static/css/c33615999008d3f9.css +0 -1
  523. package/.next/static/css/c34f6ea9953e2f63.css +0 -1
  524. package/.next/static/css/ea11d74a2848b093.css +0 -1
  525. package/.next/static/css/f16438bcf4508fb3.css +0 -1
  526. package/.next/static/css/f60366555f563deb.css +0 -1
  527. package/.next/trace +0 -143
  528. package/.turbo/turbo-build.log +0 -140
  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,320 @@
1
+ import type { RefObject } from 'react'
2
+ import { useMemo } from 'react'
3
+
4
+ import type { PopoverProps } from '@faststore/ui'
5
+ import {
6
+ SlideOver,
7
+ SlideOverHeader,
8
+ Button as UIButton,
9
+ Icon as UIIcon,
10
+ Popover as UIPopover,
11
+ SelectField as UISelectField,
12
+ useFadeEffect,
13
+ } from '@faststore/ui'
14
+
15
+ import type { BindingSelectorError } from 'src/sdk/localization'
16
+ import useScreenResize from 'src/sdk/ui/useScreenResize'
17
+ import styles from './section.module.scss'
18
+
19
+ type SelectValue = string
20
+ type SelectOptions = Record<string, string>
21
+
22
+ interface LocalizationSelectorContentProps {
23
+ /** Language options - Record where key is locale code (e.g., "pt-BR") and value is language name (e.g., "Português") */
24
+ languages: SelectOptions
25
+ /** Currency options - Record where key is currency code and value is currency code */
26
+ currencies: SelectOptions
27
+ /** Currently selected locale code (e.g., "pt-BR") */
28
+ localeCode: SelectValue
29
+ /** Currently selected currency code (e.g., "BRL") */
30
+ currencyCode: SelectValue
31
+ /** Callback when locale code changes - receives locale code */
32
+ onLocaleChange: (code: string) => void
33
+ /** Callback when currency code changes - receives currency code */
34
+ onCurrencyChange: (code: string) => void
35
+ languageLabel: string
36
+ currencyLabel: string
37
+ description: string
38
+ saveLabel: string
39
+ /**
40
+ * When true, renders the Save button inside the content.
41
+ * Used by the desktop (Popover) variation.
42
+ */
43
+ showSaveButton?: boolean
44
+ onSave?: () => void
45
+ /** Whether the save button should be enabled */
46
+ isSaveEnabled?: boolean
47
+ /** Error message element to display */
48
+ errorMessage?: React.ReactNode
49
+ }
50
+
51
+ export interface LocalizationSelectorErrorMessages {
52
+ noBindingFound?: string
53
+ invalidUrl?: string
54
+ noCurrencies?: string
55
+ defaultError?: string
56
+ }
57
+
58
+ export interface LocalizationSelectorProps {
59
+ /**
60
+ * Controls whether the selector is open or closed.
61
+ */
62
+ isOpen: boolean
63
+ /**
64
+ * Called when the selector should be closed
65
+ * (outside click, close button or save action).
66
+ */
67
+ onClose: () => void
68
+ /**
69
+ * Reference element used to position the Popover on desktop.
70
+ */
71
+ triggerRef?: RefObject<HTMLElement>
72
+ /**
73
+ * Language options from useBindingSelector hook.
74
+ * Record where key is locale code (e.g., "pt-BR") and value is language name (e.g., "Português")
75
+ */
76
+ languages: SelectOptions
77
+ /**
78
+ * Currency options from useBindingSelector hook.
79
+ */
80
+ currencies: SelectOptions
81
+ /**
82
+ * Currently selected locale code from useBindingSelector hook (e.g., "pt-BR")
83
+ */
84
+ localeCode: SelectValue | null
85
+ /**
86
+ * Currently selected currency code from useBindingSelector hook (e.g., "BRL")
87
+ */
88
+ currencyCode: SelectValue | null
89
+ /**
90
+ * Callback when locale code changes - receives locale code and passes to hook's setLocaleCode
91
+ */
92
+ onLocaleChange: (code: string) => void
93
+ /**
94
+ * Callback when currency code changes - passes to hook's setCurrencyCode
95
+ */
96
+ onCurrencyChange: (code: string) => void
97
+ /**
98
+ * Callback when save is triggered - passes to hook's save
99
+ */
100
+ onSave: () => void
101
+ /**
102
+ * Whether save is enabled from useBindingSelector hook
103
+ */
104
+ isSaveEnabled: boolean
105
+ /**
106
+ * Error state from useBindingSelector hook
107
+ */
108
+ error: BindingSelectorError | null
109
+ /**
110
+ * Title displayed in mobile SlideOver header
111
+ */
112
+ title: string
113
+ languageLabel: string
114
+ currencyLabel: string
115
+ /**
116
+ * Description text
117
+ */
118
+ description: string
119
+ saveLabel: string
120
+ /**
121
+ * Custom error messages from CMS
122
+ */
123
+ errorMessages?: LocalizationSelectorErrorMessages
124
+ /**
125
+ * Desktop only: `Popover` placement relative to `triggerRef`.
126
+ * Defaults to `bottom-start`. Use `top-start` / `top-end` when the trigger sits
127
+ * near the bottom of the viewport (e.g. footer).
128
+ */
129
+ popoverPlacement?: PopoverProps['placement']
130
+ }
131
+
132
+ const LocalizationSelectorContent = ({
133
+ languages,
134
+ currencies,
135
+ localeCode,
136
+ currencyCode,
137
+ onLocaleChange,
138
+ onCurrencyChange,
139
+ languageLabel,
140
+ currencyLabel,
141
+ description,
142
+ saveLabel,
143
+ showSaveButton = false,
144
+ onSave,
145
+ isSaveEnabled = true,
146
+ errorMessage,
147
+ }: LocalizationSelectorContentProps) => {
148
+ return (
149
+ <div data-fs-localization-selector-content>
150
+ <UISelectField
151
+ id="localization-selector-language"
152
+ label={languageLabel}
153
+ options={languages}
154
+ value={localeCode}
155
+ onChange={(event) => onLocaleChange(event.currentTarget.value)}
156
+ />
157
+
158
+ <UISelectField
159
+ id="localization-selector-currency"
160
+ label={currencyLabel}
161
+ options={currencies}
162
+ value={currencyCode}
163
+ onChange={(event) => onCurrencyChange(event.currentTarget.value)}
164
+ disabled={Object.keys(currencies).length === 0}
165
+ />
166
+
167
+ <p data-fs-localization-selector-description>{description}</p>
168
+
169
+ {errorMessage}
170
+
171
+ {showSaveButton && onSave && (
172
+ <div data-fs-localization-selector-actions>
173
+ <UIButton
174
+ variant="primary"
175
+ onClick={onSave}
176
+ disabled={!isSaveEnabled}
177
+ >
178
+ {saveLabel}
179
+ </UIButton>
180
+ </div>
181
+ )}
182
+ </div>
183
+ )
184
+ }
185
+
186
+ /**
187
+ * Helper function to get error message for display
188
+ */
189
+ function getErrorMessage(
190
+ error: BindingSelectorError,
191
+ errorMessages?: LocalizationSelectorErrorMessages
192
+ ): string {
193
+ return errorMessages?.[error.type] ?? errorMessages?.defaultError ?? ''
194
+ }
195
+
196
+ function LocalizationSelector({
197
+ isOpen,
198
+ onClose,
199
+ triggerRef,
200
+ languages,
201
+ currencies,
202
+ localeCode,
203
+ currencyCode,
204
+ onLocaleChange,
205
+ onCurrencyChange,
206
+ onSave,
207
+ isSaveEnabled,
208
+ error,
209
+ title,
210
+ languageLabel,
211
+ currencyLabel,
212
+ description,
213
+ saveLabel,
214
+ errorMessages,
215
+ popoverPlacement = 'bottom-start',
216
+ }: LocalizationSelectorProps) {
217
+ const { loading, isDesktop } = useScreenResize()
218
+ const { fade, fadeOut } = useFadeEffect()
219
+
220
+ const handleSave = () => {
221
+ onSave()
222
+ }
223
+
224
+ const isDesktopDevice = useMemo(
225
+ () => !loading && Boolean(isDesktop),
226
+ [loading, isDesktop]
227
+ )
228
+
229
+ if (loading) {
230
+ return null
231
+ }
232
+
233
+ // Error display
234
+ const errorMessage = error && (
235
+ <div data-fs-localization-selector-error role="alert">
236
+ <UIIcon name="Warning" width={18} height={18} />
237
+ <span>{getErrorMessage(error, errorMessages)}</span>
238
+ </div>
239
+ )
240
+
241
+ if (isDesktopDevice) {
242
+ return (
243
+ <UIPopover
244
+ isOpen={isOpen}
245
+ placement={popoverPlacement}
246
+ triggerRef={triggerRef}
247
+ onDismiss={onClose}
248
+ enablePortal
249
+ data-fs-localization-selector
250
+ wrapperProps={{
251
+ className: `${styles.common} ${styles.desktop}`,
252
+ }}
253
+ content={
254
+ <LocalizationSelectorContent
255
+ languages={languages}
256
+ currencies={currencies}
257
+ localeCode={localeCode ?? ''}
258
+ currencyCode={currencyCode ?? ''}
259
+ onLocaleChange={onLocaleChange}
260
+ onCurrencyChange={onCurrencyChange}
261
+ languageLabel={languageLabel}
262
+ currencyLabel={currencyLabel}
263
+ description={description}
264
+ saveLabel={saveLabel}
265
+ showSaveButton
266
+ onSave={handleSave}
267
+ isSaveEnabled={isSaveEnabled}
268
+ errorMessage={errorMessage}
269
+ />
270
+ }
271
+ />
272
+ )
273
+ }
274
+
275
+ return (
276
+ <SlideOver
277
+ data-fs-localization-selector
278
+ data-fs-localization-selector-mobile
279
+ fade={fade}
280
+ onDismiss={fadeOut}
281
+ onTransitionEnd={() => fade === 'out' && onClose()}
282
+ isOpen={isOpen}
283
+ size="partial"
284
+ direction="bottomSide"
285
+ overlayProps={{
286
+ className: `${styles.common} ${styles.mobile}`,
287
+ }}
288
+ >
289
+ <SlideOverHeader onClose={fadeOut}>
290
+ <h2 data-fs-localization-selector-title>{title}</h2>
291
+ </SlideOverHeader>
292
+ <div data-fs-localization-selector-body>
293
+ <LocalizationSelectorContent
294
+ languages={languages}
295
+ currencies={currencies}
296
+ localeCode={localeCode ?? ''}
297
+ currencyCode={currencyCode ?? ''}
298
+ onLocaleChange={onLocaleChange}
299
+ onCurrencyChange={onCurrencyChange}
300
+ languageLabel={languageLabel}
301
+ currencyLabel={currencyLabel}
302
+ description={description}
303
+ saveLabel={saveLabel}
304
+ errorMessage={errorMessage}
305
+ />
306
+ </div>
307
+ <footer data-fs-localization-selector-footer>
308
+ <UIButton
309
+ variant="primary"
310
+ onClick={handleSave}
311
+ disabled={!isSaveEnabled}
312
+ >
313
+ {saveLabel}
314
+ </UIButton>
315
+ </footer>
316
+ </SlideOver>
317
+ )
318
+ }
319
+
320
+ export default LocalizationSelector
@@ -0,0 +1 @@
1
+ export { default } from './LocalizationSelector'
@@ -0,0 +1,18 @@
1
+ @use "sass:meta";
2
+
3
+ .desktop {
4
+ @include meta.load-css("~@faststore/ui/src/components/molecules/Popover/styles.scss");
5
+ }
6
+
7
+ .mobile {
8
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Overlay/styles.scss");
9
+ @include meta.load-css("~@faststore/ui/src/components/organisms/SlideOver/styles.scss");
10
+ }
11
+
12
+ .common {
13
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Icon/styles.scss");
14
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Select/styles.scss");
15
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Button/styles.scss");
16
+ @include meta.load-css("~@faststore/ui/src/components/molecules/SelectField/styles.scss");
17
+ @include meta.load-css("~@faststore/ui/src/components/organisms/LocalizationSelector/styles.scss");
18
+ }
@@ -0,0 +1 @@
1
+ export { default as LocalizationSelector } from './LocalizationSelector'
@@ -9,6 +9,7 @@ import CartToggle from 'src/components/cart/CartToggle'
9
9
  import type { SearchInputRef } from 'src/components/search/SearchInput'
10
10
  import SearchInput from 'src/components/search/SearchInput'
11
11
  import Link from 'src/components/ui/Link'
12
+ import LocalizationButton from 'src/components/ui/LocalizationButton'
12
13
  import Logo from 'src/components/ui/Logo'
13
14
  import { useOverrideComponents } from 'src/sdk/overrides/OverrideContext'
14
15
  import { useSession } from 'src/sdk/session'
@@ -62,6 +63,23 @@ export interface NavbarProps {
62
63
  label: string
63
64
  shouldDisplayRegion: boolean
64
65
  }
66
+ /**
67
+ * Localization Button props.
68
+ */
69
+ localizationButton?: {
70
+ icon: string
71
+ shouldDisplayLocalizationButton: boolean
72
+ }
73
+ /**
74
+ * Localization Selector props.
75
+ */
76
+ localizationSelector?: {
77
+ title?: string
78
+ languageLabel?: string
79
+ currencyLabel?: string
80
+ description?: string
81
+ saveLabel?: string
82
+ }
65
83
  /**
66
84
  * Page links.
67
85
  */
@@ -84,6 +102,8 @@ function Navbar({
84
102
  links,
85
103
  signIn,
86
104
  region,
105
+ localizationButton,
106
+ localizationSelector,
87
107
  home: { label: homeLabel },
88
108
  signIn: { button: signInButton },
89
109
  menu: {
@@ -111,6 +131,9 @@ function Navbar({
111
131
  const isRepresentative = b2b?.isRepresentative
112
132
 
113
133
  const isOrganizationEnabled = isFaststoreMyAccountEnabled && isRepresentative
134
+ const isLocalizationEnabled =
135
+ storeConfig.localization?.enabled &&
136
+ localizationButton?.shouldDisplayLocalizationButton
114
137
 
115
138
  const handlerExpandSearch = useCallback(() => {
116
139
  setSearchExpanded(true)
@@ -154,6 +177,10 @@ function Navbar({
154
177
  placeholder={searchInput?.placeholder}
155
178
  sort={searchInput?.sort}
156
179
  quickOrderSettings={searchInput?.quickOrderSettings}
180
+ submitButtonAriaLabel={searchInput?.submitButtonAriaLabel}
181
+ loadingLabel={searchInput?.loadingLabel}
182
+ searchHistoryTitle={searchInput?.searchHistoryTitle}
183
+ searchTopTitle={searchInput?.searchTopTitle}
157
184
  />
158
185
  )}
159
186
 
@@ -164,7 +191,10 @@ function Navbar({
164
191
  {searchExpanded && (
165
192
  <IconButton.Component
166
193
  data-fs-button-collapse
167
- aria-label="Collapse search bar"
194
+ aria-label={
195
+ searchInput?.collapseSearchAriaLabel ??
196
+ IconButton.props['aria-label']
197
+ }
168
198
  icon={<UIIcon name="CaretLeft" width={32} height={32} />}
169
199
  {...IconButton.props}
170
200
  // Dynamic props, shouldn't be overridable
@@ -182,10 +212,26 @@ function Navbar({
182
212
  onSearchClick={handlerExpandSearch}
183
213
  sort={searchInput?.sort}
184
214
  quickOrderSettings={searchInput?.quickOrderSettings}
215
+ submitButtonAriaLabel={searchInput?.submitButtonAriaLabel}
185
216
  hidden={!searchExpanded}
186
217
  aria-hidden={!searchExpanded}
218
+ loadingLabel={searchInput?.loadingLabel}
219
+ searchHistoryTitle={searchInput?.searchHistoryTitle}
220
+ searchTopTitle={searchInput?.searchTopTitle}
187
221
  />
188
222
  )}
223
+
224
+ {isDesktop && isLocalizationEnabled && (
225
+ <LocalizationButton
226
+ icon={localizationButton?.icon}
227
+ title={localizationSelector?.title}
228
+ languageLabel={localizationSelector?.languageLabel}
229
+ currencyLabel={localizationSelector?.currencyLabel}
230
+ description={localizationSelector?.description}
231
+ saveLabel={localizationSelector?.saveLabel}
232
+ />
233
+ )}
234
+
189
235
  {isDesktop &&
190
236
  (isSessionReady ? (
191
237
  isOrganizationEnabled ? (
@@ -217,6 +263,8 @@ function Navbar({
217
263
  links={links}
218
264
  signIn={signIn}
219
265
  region={region}
266
+ localizationButton={localizationButton}
267
+ localizationSelector={localizationSelector}
220
268
  />
221
269
  )}
222
270
  </NavbarWrapper.Component>
@@ -5,6 +5,7 @@ import storeConfig from 'discovery.config'
5
5
  import NavbarLinks from 'src/components/navigation/NavbarLinks'
6
6
  import { ButtonSignInFallback } from 'src/components/ui/Button'
7
7
  import Link from 'src/components/ui/Link'
8
+ import LocalizationButton from 'src/components/ui/LocalizationButton'
8
9
  import Logo from 'src/components/ui/Logo'
9
10
 
10
11
  import type { NavbarProps } from '../Navbar'
@@ -20,12 +21,16 @@ interface NavbarSliderProps {
20
21
  links: NavbarProps['links']
21
22
  region: NavbarProps['region']
22
23
  signIn: NavbarProps['signIn']
24
+ localizationButton?: NavbarProps['localizationButton']
25
+ localizationSelector?: NavbarProps['localizationSelector']
23
26
  }
24
27
 
25
28
  function NavbarSlider({
26
29
  logo,
27
30
  links,
28
31
  region,
32
+ localizationButton,
33
+ localizationSelector,
29
34
  home: { label: homeLabel },
30
35
  signIn: { button: signInButton },
31
36
  }: NavbarSliderProps) {
@@ -45,9 +50,12 @@ function NavbarSlider({
45
50
  storeConfig.experimental?.enableFaststoreMyAccount
46
51
 
47
52
  const isRepresentative = b2b?.isRepresentative
48
-
49
53
  const isOrganizationEnabled = isFaststoreMyAccountEnabled && isRepresentative
50
54
 
55
+ const isLocalizationEnabled =
56
+ storeConfig.localization?.enabled &&
57
+ localizationButton?.shouldDisplayLocalizationButton
58
+
51
59
  return (
52
60
  <NavbarSliderWrapper.Component
53
61
  fade={fade}
@@ -92,6 +100,16 @@ function NavbarSlider({
92
100
  />
93
101
  )}
94
102
  </Suspense>
103
+ {isLocalizationEnabled && (
104
+ <LocalizationButton
105
+ icon={localizationButton?.icon}
106
+ title={localizationSelector?.title}
107
+ languageLabel={localizationSelector?.languageLabel}
108
+ currencyLabel={localizationSelector?.currencyLabel}
109
+ description={localizationSelector?.description}
110
+ saveLabel={localizationSelector?.saveLabel}
111
+ />
112
+ )}
95
113
  </NavbarSliderFooter.Component>
96
114
  </NavbarSliderWrapper.Component>
97
115
  )
@@ -1,14 +1,16 @@
1
+ @use "sass:meta";
2
+
1
3
  @layer components {
2
4
  .section {
3
- @import "@faststore/ui/src/components/atoms/Button/styles.scss";
4
- @import "@faststore/ui/src/components/atoms/Icon/styles.scss";
5
- @import "@faststore/ui/src/components/atoms/Link/styles.scss";
6
- @import "@faststore/ui/src/components/atoms/List/styles.scss";
7
- @import "@faststore/ui/src/components/atoms/Logo/styles.scss";
8
- @import "@faststore/ui/src/components/molecules/LinkButton/styles.scss";
9
- @import "@faststore/ui/src/components/molecules/Modal/styles.scss";
10
- @import "@faststore/ui/src/components/molecules/NavbarLinks/styles.scss";
11
- @import "@faststore/ui/src/components/organisms/SlideOver/styles.scss";
12
- @import "@faststore/ui/src/components/organisms/NavbarSlider/styles.scss";
5
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Button/styles.scss");
6
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Icon/styles.scss");
7
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Link/styles.scss");
8
+ @include meta.load-css("~@faststore/ui/src/components/atoms/List/styles.scss");
9
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Logo/styles.scss");
10
+ @include meta.load-css("~@faststore/ui/src/components/molecules/LinkButton/styles.scss");
11
+ @include meta.load-css("~@faststore/ui/src/components/molecules/Modal/styles.scss");
12
+ @include meta.load-css("~@faststore/ui/src/components/molecules/NavbarLinks/styles.scss");
13
+ @include meta.load-css("~@faststore/ui/src/components/organisms/SlideOver/styles.scss");
14
+ @include meta.load-css("~@faststore/ui/src/components/organisms/NavbarSlider/styles.scss");
13
15
  }
14
16
  }
@@ -4,7 +4,11 @@ import { useState } from 'react'
4
4
 
5
5
  import { useSession } from 'src/sdk/session'
6
6
 
7
- function OutOfStock() {
7
+ function OutOfStock({
8
+ loadingLabel,
9
+ }: {
10
+ loadingLabel?: string
11
+ }) {
8
12
  const { postalCode } = useSession()
9
13
 
10
14
  const [isLoading, setIsLoading] = useState(false)
@@ -44,6 +48,7 @@ function OutOfStock() {
44
48
  onSubmit={handleSubmit}
45
49
  disabled={isLoading}
46
50
  errorMessage={error}
51
+ loadingLabel={loadingLabel}
47
52
  />
48
53
  )
49
54
  }
@@ -82,7 +82,7 @@ function ProductCard({
82
82
  aspectRatio = 1,
83
83
  imgProps,
84
84
  ratingValue,
85
- buttonLabel = 'Add',
85
+ buttonLabel,
86
86
  onButtonClick,
87
87
  showDiscountBadge = true,
88
88
  taxesConfiguration,
@@ -52,6 +52,7 @@ function RegionModal(regionModalProps: RegionModalProps) {
52
52
  noProductsAvailableErrorMessage:
53
53
  inputFieldNoProductsAvailableErrorMessage = '',
54
54
  buttonActionText: inputButtonActionText = '',
55
+ loadingLabel: inputLoadingLabel = '',
55
56
  } = {},
56
57
  idkPostalCodeLink: {
57
58
  text: idkPostalCodeLinkText = '',
@@ -135,7 +136,9 @@ function RegionModal(regionModalProps: RegionModalProps) {
135
136
  setInput('')
136
137
  setRegionError('')
137
138
  }}
138
- inputButtonActionText={loading ? '...' : inputButtonActionText}
139
+ inputButtonActionText={
140
+ loading ? inputLoadingLabel : inputButtonActionText
141
+ }
139
142
  dismissible={isDismissible}
140
143
  />
141
144
  )}
@@ -1,10 +1,12 @@
1
+ @use "sass:meta";
2
+
1
3
  .section {
2
- @import "@faststore/ui/src/components/atoms/Icon/styles.scss";
3
- @import "@faststore/ui/src/components/atoms/Input/styles.scss";
4
- @import "@faststore/ui/src/components/atoms/Overlay/styles.scss";
5
- @import "@faststore/ui/src/components/atoms/Button/styles.scss";
6
- @import "@faststore/ui/src/components/atoms/Link/styles.scss";
7
- @import "@faststore/ui/src/components/molecules/InputField/styles.scss";
8
- @import "@faststore/ui/src/components/molecules/Modal/styles.scss";
9
- @import "@faststore/ui/src/components/organisms/RegionModal/styles.scss";
4
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Icon/styles.scss");
5
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Input/styles.scss");
6
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Overlay/styles.scss");
7
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Button/styles.scss");
8
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Link/styles.scss");
9
+ @include meta.load-css("~@faststore/ui/src/components/molecules/InputField/styles.scss");
10
+ @include meta.load-css("~@faststore/ui/src/components/molecules/Modal/styles.scss");
11
+ @include meta.load-css("~@faststore/ui/src/components/organisms/RegionModal/styles.scss");
10
12
  }
@@ -46,11 +46,11 @@ interface RegionPopoverProps {
46
46
 
47
47
  function RegionPopover(regionPopoverProps: RegionPopoverProps) {
48
48
  const {
49
- title = 'Set your location',
49
+ title,
50
50
  closeButtonAriaLabel,
51
- textBeforeLocation = 'Your current location is:',
52
- textAfterLocation = 'Use the field below to change it.',
53
- description = 'Offers and availability vary by location.',
51
+ textBeforeLocation,
52
+ textAfterLocation,
53
+ description,
54
54
  triggerRef,
55
55
  offsetTop = 6,
56
56
  offsetLeft,
@@ -65,6 +65,7 @@ function RegionPopover(regionPopoverProps: RegionPopoverProps) {
65
65
  noProductsAvailableErrorMessage:
66
66
  inputFieldNoProductsAvailableErrorMessage = '',
67
67
  buttonActionText: inputButtonActionText = '',
68
+ loadingLabel: inputLoadingLabel = '',
68
69
  } = {},
69
70
  idkPostalCodeLink: {
70
71
  text: idkPostalCodeLinkText = '',
@@ -150,7 +151,7 @@ function RegionPopover(regionPopoverProps: RegionPopoverProps) {
150
151
  setInput('')
151
152
  setRegionError('')
152
153
  }}
153
- buttonActionText={loading ? '...' : inputButtonActionText}
154
+ buttonActionText={loading ? inputLoadingLabel : inputButtonActionText}
154
155
  error={regionError}
155
156
  />
156
157
  {idkPostalCodeLinkTo && (
@@ -1,9 +1,11 @@
1
+ @use "sass:meta";
2
+
1
3
  .section {
2
- @import "@faststore/ui/src/components/atoms/Icon/styles.scss";
3
- @import "@faststore/ui/src/components/atoms/Input/styles.scss";
4
- @import "@faststore/ui/src/components/atoms/Button/styles.scss";
5
- @import "@faststore/ui/src/components/atoms/Link/styles.scss";
6
- @import "@faststore/ui/src/components/molecules/InputField/styles.scss";
7
- @import "@faststore/ui/src/components/molecules/Popover/styles.scss";
8
- @import "@faststore/ui/src/components/organisms/RegionPopover/styles.scss";
4
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Icon/styles.scss");
5
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Input/styles.scss");
6
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Button/styles.scss");
7
+ @include meta.load-css("~@faststore/ui/src/components/atoms/Link/styles.scss");
8
+ @include meta.load-css("~@faststore/ui/src/components/molecules/InputField/styles.scss");
9
+ @include meta.load-css("~@faststore/ui/src/components/molecules/Popover/styles.scss");
10
+ @include meta.load-css("~@faststore/ui/src/components/organisms/RegionPopover/styles.scss");
9
11
  }