@salesforce/retail-react-app 1.0.0-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. package/.eslintignore +7 -0
  2. package/.eslintrc.js +25 -0
  3. package/.prettierignore +4 -0
  4. package/.prettierrc.yaml +7 -0
  5. package/CHANGELOG.md +173 -0
  6. package/LICENSE +14 -0
  7. package/README.md +48 -0
  8. package/app/assets/svg/account.svg +3 -0
  9. package/app/assets/svg/alert.svg +3 -0
  10. package/app/assets/svg/basket.svg +3 -0
  11. package/app/assets/svg/brand-logo.svg +10 -0
  12. package/app/assets/svg/cc-amex.svg +7 -0
  13. package/app/assets/svg/cc-cvv.svg +8 -0
  14. package/app/assets/svg/cc-discover.svg +14 -0
  15. package/app/assets/svg/cc-mastercard.svg +8 -0
  16. package/app/assets/svg/cc-visa.svg +11 -0
  17. package/app/assets/svg/check-circle.svg +3 -0
  18. package/app/assets/svg/check.svg +3 -0
  19. package/app/assets/svg/chevron-down.svg +3 -0
  20. package/app/assets/svg/chevron-left.svg +3 -0
  21. package/app/assets/svg/chevron-right.svg +3 -0
  22. package/app/assets/svg/chevron-up.svg +3 -0
  23. package/app/assets/svg/close.svg +3 -0
  24. package/app/assets/svg/dashboard.svg +4 -0
  25. package/app/assets/svg/figma-logo.svg +14 -0
  26. package/app/assets/svg/file.svg +3 -0
  27. package/app/assets/svg/filter.svg +3 -0
  28. package/app/assets/svg/flag-ca.svg +5 -0
  29. package/app/assets/svg/flag-cn.svg +19 -0
  30. package/app/assets/svg/flag-fr.svg +19 -0
  31. package/app/assets/svg/flag-gb.svg +16 -0
  32. package/app/assets/svg/flag-it.svg +29 -0
  33. package/app/assets/svg/flag-jp.svg +10 -0
  34. package/app/assets/svg/flag-us.svg +7 -0
  35. package/app/assets/svg/github-logo.svg +40 -0
  36. package/app/assets/svg/hamburger.svg +8 -0
  37. package/app/assets/svg/heart-solid.svg +7 -0
  38. package/app/assets/svg/heart.svg +3 -0
  39. package/app/assets/svg/info.svg +3 -0
  40. package/app/assets/svg/like.svg +4 -0
  41. package/app/assets/svg/location.svg +3 -0
  42. package/app/assets/svg/lock.svg +3 -0
  43. package/app/assets/svg/paypal.svg +19 -0
  44. package/app/assets/svg/plug.svg +3 -0
  45. package/app/assets/svg/plus.svg +3 -0
  46. package/app/assets/svg/receipt.svg +3 -0
  47. package/app/assets/svg/search.svg +8 -0
  48. package/app/assets/svg/signout.svg +3 -0
  49. package/app/assets/svg/social-facebook.svg +3 -0
  50. package/app/assets/svg/social-instagram.svg +3 -0
  51. package/app/assets/svg/social-pinterest.svg +4 -0
  52. package/app/assets/svg/social-twitter.svg +3 -0
  53. package/app/assets/svg/social-youtube.svg +3 -0
  54. package/app/assets/svg/user.svg +3 -0
  55. package/app/assets/svg/visibility-off.svg +5 -0
  56. package/app/assets/svg/visibility.svg +3 -0
  57. package/app/components/_app/index.jsx +401 -0
  58. package/app/components/_app/index.test.js +85 -0
  59. package/app/components/_app/partials/above-header.jsx +10 -0
  60. package/app/components/_app-config/index.jsx +125 -0
  61. package/app/components/_app-config/index.test.js +77 -0
  62. package/app/components/_error/index.jsx +142 -0
  63. package/app/components/_error/index.test.js +25 -0
  64. package/app/components/action-card/index.jsx +75 -0
  65. package/app/components/address-display/index.jsx +30 -0
  66. package/app/components/basic-tile/index.jsx +65 -0
  67. package/app/components/basic-tile/index.test.js +23 -0
  68. package/app/components/breadcrumb/index.jsx +67 -0
  69. package/app/components/breadcrumb/index.test.js +30 -0
  70. package/app/components/confirmation-modal/index.jsx +111 -0
  71. package/app/components/confirmation-modal/index.test.js +98 -0
  72. package/app/components/drawer-menu/index.jsx +405 -0
  73. package/app/components/drawer-menu/index.test.js +33 -0
  74. package/app/components/dynamic-image/index.jsx +56 -0
  75. package/app/components/field/index.jsx +161 -0
  76. package/app/components/footer/index.jsx +269 -0
  77. package/app/components/footer/index.test.js +22 -0
  78. package/app/components/forms/address-fields.jsx +49 -0
  79. package/app/components/forms/credit-card-fields.jsx +149 -0
  80. package/app/components/forms/form-action-buttons.jsx +55 -0
  81. package/app/components/forms/login-fields.jsx +31 -0
  82. package/app/components/forms/password-requirements.jsx +99 -0
  83. package/app/components/forms/post-checkout-registration-fields.jsx +43 -0
  84. package/app/components/forms/profile-fields.jsx +36 -0
  85. package/app/components/forms/promo-code-fields.jsx +43 -0
  86. package/app/components/forms/registration-fields.jsx +42 -0
  87. package/app/components/forms/reset-password-fields.jsx +31 -0
  88. package/app/components/forms/state-province-options.jsx +75 -0
  89. package/app/components/forms/update-password-fields.jsx +49 -0
  90. package/app/components/forms/useAddressFields.jsx +196 -0
  91. package/app/components/forms/useCreditCardFields.jsx +146 -0
  92. package/app/components/forms/useLoginFields.jsx +52 -0
  93. package/app/components/forms/useProfileFields.jsx +95 -0
  94. package/app/components/forms/usePromoCodeFields.jsx +39 -0
  95. package/app/components/forms/useRegistrationFields.jsx +136 -0
  96. package/app/components/forms/useResetPasswordFields.jsx +40 -0
  97. package/app/components/forms/useUpdatePasswordFields.jsx +89 -0
  98. package/app/components/header/index.jsx +290 -0
  99. package/app/components/header/index.test.js +217 -0
  100. package/app/components/hero/index.jsx +84 -0
  101. package/app/components/hero/index.test.js +40 -0
  102. package/app/components/icons/index.jsx +158 -0
  103. package/app/components/icons/index.test.js +20 -0
  104. package/app/components/image-gallery/index.jsx +176 -0
  105. package/app/components/image-gallery/index.test.js +485 -0
  106. package/app/components/item-variant/index.jsx +33 -0
  107. package/app/components/item-variant/item-attributes.jsx +107 -0
  108. package/app/components/item-variant/item-image.jsx +73 -0
  109. package/app/components/item-variant/item-name.jsx +28 -0
  110. package/app/components/item-variant/item-price.jsx +117 -0
  111. package/app/components/link/index.jsx +32 -0
  112. package/app/components/link/index.test.js +72 -0
  113. package/app/components/links-list/index.jsx +89 -0
  114. package/app/components/links-list/index.test.js +62 -0
  115. package/app/components/list-menu/index.jsx +280 -0
  116. package/app/components/list-menu/index.test.js +44 -0
  117. package/app/components/loading-spinner/index.jsx +46 -0
  118. package/app/components/locale-selector/index.jsx +124 -0
  119. package/app/components/locale-selector/index.test.js +37 -0
  120. package/app/components/locale-text/index.jsx +97 -0
  121. package/app/components/locale-text/index.test.js +36 -0
  122. package/app/components/login/index.jsx +96 -0
  123. package/app/components/nested-accordion/index.jsx +185 -0
  124. package/app/components/nested-accordion/index.test.js +98 -0
  125. package/app/components/offline-banner/index.jsx +40 -0
  126. package/app/components/offline-banner/index.test.js +15 -0
  127. package/app/components/offline-boundary/index.jsx +104 -0
  128. package/app/components/offline-boundary/index.test.js +123 -0
  129. package/app/components/order-summary/index.jsx +331 -0
  130. package/app/components/page-action-placeholder/index.jsx +50 -0
  131. package/app/components/pagination/index.jsx +134 -0
  132. package/app/components/pagination/index.test.js +25 -0
  133. package/app/components/product-item/index.jsx +146 -0
  134. package/app/components/product-item/index.test.js +38 -0
  135. package/app/components/product-scroller/index.jsx +172 -0
  136. package/app/components/product-scroller/index.test.js +98 -0
  137. package/app/components/product-tile/index.jsx +195 -0
  138. package/app/components/product-tile/index.test.js +96 -0
  139. package/app/components/product-view/index.jsx +538 -0
  140. package/app/components/product-view/index.test.js +224 -0
  141. package/app/components/product-view-modal/index.jsx +48 -0
  142. package/app/components/product-view-modal/index.test.js +72 -0
  143. package/app/components/promo-code/index.jsx +162 -0
  144. package/app/components/promo-popover/index.jsx +83 -0
  145. package/app/components/quantity-picker/index.jsx +58 -0
  146. package/app/components/radio-card/index.jsx +75 -0
  147. package/app/components/recommended-products/index.jsx +227 -0
  148. package/app/components/register/index.jsx +114 -0
  149. package/app/components/reset-password/index.jsx +87 -0
  150. package/app/components/responsive/index.jsx +29 -0
  151. package/app/components/scroll-to-top/index.jsx +24 -0
  152. package/app/components/scroll-to-top/index.test.js +46 -0
  153. package/app/components/search/index.jsx +279 -0
  154. package/app/components/search/index.test.js +127 -0
  155. package/app/components/search/partials/recent-searches.jsx +76 -0
  156. package/app/components/search/partials/search-suggestions.jsx +45 -0
  157. package/app/components/search/partials/suggestions.jsx +43 -0
  158. package/app/components/section/index.jsx +68 -0
  159. package/app/components/seo/index.jsx +33 -0
  160. package/app/components/social-icons/index.jsx +101 -0
  161. package/app/components/social-icons/index.test.js +30 -0
  162. package/app/components/swatch-group/index.jsx +77 -0
  163. package/app/components/swatch-group/index.test.js +136 -0
  164. package/app/components/swatch-group/swatch.jsx +94 -0
  165. package/app/components/toggle-card/index.jsx +97 -0
  166. package/app/components/with-registration/index.jsx +58 -0
  167. package/app/components/with-registration/index.test.js +85 -0
  168. package/app/constants.js +109 -0
  169. package/app/contexts/index.js +92 -0
  170. package/app/hooks/einstein-mock-data.js +916 -0
  171. package/app/hooks/index.js +17 -0
  172. package/app/hooks/use-add-to-cart-modal.js +344 -0
  173. package/app/hooks/use-add-to-cart-modal.test.js +625 -0
  174. package/app/hooks/use-auth-modal.js +337 -0
  175. package/app/hooks/use-auth-modal.test.js +365 -0
  176. package/app/hooks/use-currency.js +20 -0
  177. package/app/hooks/use-currency.test.js +41 -0
  178. package/app/hooks/use-current-basket.js +39 -0
  179. package/app/hooks/use-current-customer.js +29 -0
  180. package/app/hooks/use-derived-product.js +77 -0
  181. package/app/hooks/use-derived-product.test.js +69 -0
  182. package/app/hooks/use-einstein.js +512 -0
  183. package/app/hooks/use-einstein.test.js +224 -0
  184. package/app/hooks/use-intersection-observer.js +64 -0
  185. package/app/hooks/use-limit-urls.js +31 -0
  186. package/app/hooks/use-limit-urls.test.js +40 -0
  187. package/app/hooks/use-multi-site.js +36 -0
  188. package/app/hooks/use-multi-site.test.js +53 -0
  189. package/app/hooks/use-navigation.js +37 -0
  190. package/app/hooks/use-navigation.test.js +109 -0
  191. package/app/hooks/use-page-urls.js +35 -0
  192. package/app/hooks/use-page-urls.test.js +39 -0
  193. package/app/hooks/use-pdp-search-params.js +16 -0
  194. package/app/hooks/use-pdp-search-params.test.js +52 -0
  195. package/app/hooks/use-previous.js +17 -0
  196. package/app/hooks/use-product-view-modal.js +93 -0
  197. package/app/hooks/use-product-view-modal.test.js +172 -0
  198. package/app/hooks/use-search-params.js +96 -0
  199. package/app/hooks/use-search-params.test.js +91 -0
  200. package/app/hooks/use-sort-urls.js +33 -0
  201. package/app/hooks/use-sort-urls.test.js +42 -0
  202. package/app/hooks/use-toast.js +68 -0
  203. package/app/hooks/use-toast.test.js +58 -0
  204. package/app/hooks/use-variant.js +32 -0
  205. package/app/hooks/use-variant.test.js +81 -0
  206. package/app/hooks/use-variation-attributes.js +138 -0
  207. package/app/hooks/use-variation-attributes.test.js +119 -0
  208. package/app/hooks/use-variation-params.js +31 -0
  209. package/app/hooks/use-variation-params.test.js +73 -0
  210. package/app/hooks/use-wish-list.js +42 -0
  211. package/app/main.jsx +14 -0
  212. package/app/mocks/basket-with-suit.js +146 -0
  213. package/app/mocks/empty-basket.js +39 -0
  214. package/app/mocks/mock-data.js +5632 -0
  215. package/app/mocks/product-set-winter-lookM.js +1224 -0
  216. package/app/mocks/searchResults.js +144 -0
  217. package/app/mocks/variant-750518699578M.js +434 -0
  218. package/app/page-designer/README.md +102 -0
  219. package/app/page-designer/assets/image-tile/index.jsx +51 -0
  220. package/app/page-designer/assets/image-tile/index.test.js +30 -0
  221. package/app/page-designer/assets/image-with-text/index.jsx +140 -0
  222. package/app/page-designer/assets/image-with-text/index.test.js +38 -0
  223. package/app/page-designer/assets/index.js +9 -0
  224. package/app/page-designer/index.js +10 -0
  225. package/app/page-designer/layouts/carousel/index.jsx +222 -0
  226. package/app/page-designer/layouts/carousel/index.test.js +43 -0
  227. package/app/page-designer/layouts/index.js +14 -0
  228. package/app/page-designer/layouts/mobileGrid1r1c/index.jsx +36 -0
  229. package/app/page-designer/layouts/mobileGrid1r1c/index.test.js +35 -0
  230. package/app/page-designer/layouts/mobileGrid2r1c/index.jsx +37 -0
  231. package/app/page-designer/layouts/mobileGrid2r1c/index.test.js +47 -0
  232. package/app/page-designer/layouts/mobileGrid2r2c/index.jsx +37 -0
  233. package/app/page-designer/layouts/mobileGrid2r2c/index.test.js +71 -0
  234. package/app/page-designer/layouts/mobileGrid2r3c/index.jsx +37 -0
  235. package/app/page-designer/layouts/mobileGrid2r3c/index.test.js +95 -0
  236. package/app/page-designer/layouts/mobileGrid3r1c/index.jsx +37 -0
  237. package/app/page-designer/layouts/mobileGrid3r1c/index.test.js +59 -0
  238. package/app/page-designer/layouts/mobileGrid3r2c/index.jsx +37 -0
  239. package/app/page-designer/layouts/mobileGrid3r2c/index.test.js +95 -0
  240. package/app/page-designer/utils.js +14 -0
  241. package/app/pages/account/addresses.jsx +382 -0
  242. package/app/pages/account/addresses.test.js +120 -0
  243. package/app/pages/account/constant.js +57 -0
  244. package/app/pages/account/index.jsx +237 -0
  245. package/app/pages/account/index.test.js +188 -0
  246. package/app/pages/account/order-detail.jsx +397 -0
  247. package/app/pages/account/order-history.jsx +264 -0
  248. package/app/pages/account/orders.jsx +30 -0
  249. package/app/pages/account/orders.test.js +95 -0
  250. package/app/pages/account/profile.jsx +357 -0
  251. package/app/pages/account/wishlist/index.jsx +195 -0
  252. package/app/pages/account/wishlist/index.mock.js +1481 -0
  253. package/app/pages/account/wishlist/index.test.js +56 -0
  254. package/app/pages/account/wishlist/partials/wishlist-primary-action.jsx +170 -0
  255. package/app/pages/account/wishlist/partials/wishlist-primary-action.mock.js +1623 -0
  256. package/app/pages/account/wishlist/partials/wishlist-primary-action.test.js +99 -0
  257. package/app/pages/account/wishlist/partials/wishlist-secondary-button-group.jsx +120 -0
  258. package/app/pages/account/wishlist/partials/wishlist-secondary-button-group.test.js +391 -0
  259. package/app/pages/cart/index.jsx +476 -0
  260. package/app/pages/cart/index.test.js +481 -0
  261. package/app/pages/cart/partials/cart-cta.jsx +46 -0
  262. package/app/pages/cart/partials/cart-secondary-button-group.jsx +135 -0
  263. package/app/pages/cart/partials/cart-secondary-button-group.test.js +103 -0
  264. package/app/pages/cart/partials/cart-skeleton.jsx +93 -0
  265. package/app/pages/cart/partials/cart-title.jsx +27 -0
  266. package/app/pages/cart/partials/empty-cart.jsx +86 -0
  267. package/app/pages/checkout/confirmation.jsx +541 -0
  268. package/app/pages/checkout/confirmation.mock.js +450 -0
  269. package/app/pages/checkout/confirmation.test.js +114 -0
  270. package/app/pages/checkout/index.jsx +169 -0
  271. package/app/pages/checkout/index.test.js +582 -0
  272. package/app/pages/checkout/partials/cc-radio-group.jsx +122 -0
  273. package/app/pages/checkout/partials/checkout-footer.jsx +140 -0
  274. package/app/pages/checkout/partials/checkout-footer.test.js +16 -0
  275. package/app/pages/checkout/partials/checkout-header.jsx +54 -0
  276. package/app/pages/checkout/partials/checkout-header.test.js +16 -0
  277. package/app/pages/checkout/partials/checkout-skeleton.jsx +52 -0
  278. package/app/pages/checkout/partials/contact-info.jsx +251 -0
  279. package/app/pages/checkout/partials/contact-info.test.js +43 -0
  280. package/app/pages/checkout/partials/payment-form.jsx +97 -0
  281. package/app/pages/checkout/partials/payment.jsx +276 -0
  282. package/app/pages/checkout/partials/shipping-address-selection.jsx +377 -0
  283. package/app/pages/checkout/partials/shipping-address.jsx +132 -0
  284. package/app/pages/checkout/partials/shipping-options.jsx +232 -0
  285. package/app/pages/checkout/util/checkout-context.js +94 -0
  286. package/app/pages/home/data.js +134 -0
  287. package/app/pages/home/index.jsx +301 -0
  288. package/app/pages/home/index.test.js +23 -0
  289. package/app/pages/login/index.jsx +123 -0
  290. package/app/pages/login/index.test.js +229 -0
  291. package/app/pages/login-redirect/index.jsx +23 -0
  292. package/app/pages/login-redirect/index.test.js +16 -0
  293. package/app/pages/page-not-found/index.jsx +90 -0
  294. package/app/pages/page-not-found/index.test.js +31 -0
  295. package/app/pages/product-detail/index.jsx +394 -0
  296. package/app/pages/product-detail/index.mock.js +197 -0
  297. package/app/pages/product-detail/index.test.js +162 -0
  298. package/app/pages/product-detail/partials/information-accordion.jsx +121 -0
  299. package/app/pages/product-list/index.jsx +735 -0
  300. package/app/pages/product-list/index.test.js +180 -0
  301. package/app/pages/product-list/partials/above-page-header.jsx +10 -0
  302. package/app/pages/product-list/partials/checkbox-refinements.jsx +41 -0
  303. package/app/pages/product-list/partials/checkbox-refinements.test.js +53 -0
  304. package/app/pages/product-list/partials/color-refinements.jsx +88 -0
  305. package/app/pages/product-list/partials/empty-results.jsx +118 -0
  306. package/app/pages/product-list/partials/link-refinements.jsx +38 -0
  307. package/app/pages/product-list/partials/page-header.jsx +42 -0
  308. package/app/pages/product-list/partials/radio-refinements.jsx +60 -0
  309. package/app/pages/product-list/partials/refinements.jsx +144 -0
  310. package/app/pages/product-list/partials/selected-refinements.jsx +100 -0
  311. package/app/pages/product-list/partials/size-refinements.jsx +55 -0
  312. package/app/pages/registration/index.jsx +87 -0
  313. package/app/pages/registration/index.test.jsx +132 -0
  314. package/app/pages/reset-password/index.jsx +112 -0
  315. package/app/pages/reset-password/index.test.jsx +141 -0
  316. package/app/request-processor.js +118 -0
  317. package/app/request-processor.test.js +23 -0
  318. package/app/routes.jsx +111 -0
  319. package/app/routes.test.js +13 -0
  320. package/app/ssr.js +70 -0
  321. package/app/static/ico/favicon.ico +0 -0
  322. package/app/static/img/global/app-icon-192.png +0 -0
  323. package/app/static/img/global/app-icon-512.png +0 -0
  324. package/app/static/img/global/apple-touch-icon.png +0 -0
  325. package/app/static/img/hero.png +0 -0
  326. package/app/static/manifest.json +19 -0
  327. package/app/static/robots.txt +2 -0
  328. package/app/theme/components/base/accordion.js +21 -0
  329. package/app/theme/components/base/alert.js +17 -0
  330. package/app/theme/components/base/badge.js +25 -0
  331. package/app/theme/components/base/button.js +77 -0
  332. package/app/theme/components/base/checkbox.js +30 -0
  333. package/app/theme/components/base/container.js +17 -0
  334. package/app/theme/components/base/drawer.js +26 -0
  335. package/app/theme/components/base/formLabel.js +13 -0
  336. package/app/theme/components/base/icon.js +13 -0
  337. package/app/theme/components/base/input.js +44 -0
  338. package/app/theme/components/base/modal.js +11 -0
  339. package/app/theme/components/base/popover.js +61 -0
  340. package/app/theme/components/base/radio.js +33 -0
  341. package/app/theme/components/base/select.js +15 -0
  342. package/app/theme/components/base/skeleton.js +12 -0
  343. package/app/theme/components/base/tooltip.js +19 -0
  344. package/app/theme/components/project/_app.js +25 -0
  345. package/app/theme/components/project/breadcrumb.js +25 -0
  346. package/app/theme/components/project/checkout-footer.js +35 -0
  347. package/app/theme/components/project/drawer-menu.js +66 -0
  348. package/app/theme/components/project/footer.js +84 -0
  349. package/app/theme/components/project/header.js +84 -0
  350. package/app/theme/components/project/image-gallery.js +59 -0
  351. package/app/theme/components/project/links-list.js +43 -0
  352. package/app/theme/components/project/list-menu.js +91 -0
  353. package/app/theme/components/project/locale-selector.js +42 -0
  354. package/app/theme/components/project/nested-accordion.js +26 -0
  355. package/app/theme/components/project/offline-banner.js +25 -0
  356. package/app/theme/components/project/pagination.js +22 -0
  357. package/app/theme/components/project/product-tile.js +32 -0
  358. package/app/theme/components/project/social-icons.js +52 -0
  359. package/app/theme/components/project/swatch-group.js +115 -0
  360. package/app/theme/foundations/colors.js +170 -0
  361. package/app/theme/foundations/gradients.js +9 -0
  362. package/app/theme/foundations/layerStyles.js +41 -0
  363. package/app/theme/foundations/shadows.js +9 -0
  364. package/app/theme/foundations/sizes.js +18 -0
  365. package/app/theme/foundations/space.js +9 -0
  366. package/app/theme/foundations/styles.js +21 -0
  367. package/app/theme/index.js +104 -0
  368. package/app/utils/cc-utils.js +112 -0
  369. package/app/utils/cc-utils.test.js +41 -0
  370. package/app/utils/image-groups-utils.js +62 -0
  371. package/app/utils/image-groups-utils.test.js +65 -0
  372. package/app/utils/locale.js +78 -0
  373. package/app/utils/locale.test.js +112 -0
  374. package/app/utils/password-utils.js +21 -0
  375. package/app/utils/phone-utils.js +22 -0
  376. package/app/utils/phone-utils.test.js +15 -0
  377. package/app/utils/product-utils.js +35 -0
  378. package/app/utils/product-utils.test.js +51 -0
  379. package/app/utils/responsive-image.js +198 -0
  380. package/app/utils/responsive-image.test.js +170 -0
  381. package/app/utils/routes-utils.js +111 -0
  382. package/app/utils/routes-utils.test.js +291 -0
  383. package/app/utils/site-utils.js +222 -0
  384. package/app/utils/site-utils.test.js +376 -0
  385. package/app/utils/test-utils.js +257 -0
  386. package/app/utils/url.js +291 -0
  387. package/app/utils/url.test.js +421 -0
  388. package/app/utils/utils.js +201 -0
  389. package/app/utils/utils.test.js +182 -0
  390. package/babel.config.js +7 -0
  391. package/cache-hash-config.json +8 -0
  392. package/config/default.js +64 -0
  393. package/config/mocks/default.js +131 -0
  394. package/config/sites.js +78 -0
  395. package/jest-setup.js +191 -0
  396. package/jest.config.js +50 -0
  397. package/jsconfig.json +13 -0
  398. package/package.json +105 -0
  399. package/scripts/extract-default-messages.js +92 -0
  400. package/tests/lighthouserc.js +37 -0
  401. package/translations/README.md +127 -0
  402. package/translations/compiled/de-DE.json +3212 -0
  403. package/translations/compiled/en-GB.json +3212 -0
  404. package/translations/compiled/en-US.json +3212 -0
  405. package/translations/compiled/en-XA.json +6948 -0
  406. package/translations/compiled/es-MX.json +3216 -0
  407. package/translations/compiled/fr-FR.json +3216 -0
  408. package/translations/compiled/it-IT.json +3188 -0
  409. package/translations/compiled/ja-JP.json +3200 -0
  410. package/translations/compiled/ko-KR.json +3180 -0
  411. package/translations/compiled/pt-BR.json +3220 -0
  412. package/translations/compiled/zh-CN.json +3212 -0
  413. package/translations/compiled/zh-TW.json +3208 -0
  414. package/translations/de-DE.json +1417 -0
  415. package/translations/en-GB.json +1417 -0
  416. package/translations/en-US.json +1417 -0
  417. package/translations/es-MX.json +1417 -0
  418. package/translations/fr-FR.json +1417 -0
  419. package/translations/it-IT.json +1417 -0
  420. package/translations/ja-JP.json +1417 -0
  421. package/translations/ko-KR.json +1417 -0
  422. package/translations/pt-BR.json +1417 -0
  423. package/translations/zh-CN.json +1417 -0
  424. package/translations/zh-TW.json +1417 -0
  425. package/worker/main.js +36 -0
@@ -0,0 +1,141 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ import React from 'react'
8
+ import {screen, waitFor, within} from '@testing-library/react'
9
+ import {rest} from 'msw'
10
+ import {
11
+ createPathWithDefaults,
12
+ renderWithProviders
13
+ } from '@salesforce/retail-react-app/app/utils/test-utils'
14
+ import ResetPassword from '.'
15
+ import mockConfig from '@salesforce/retail-react-app/config/mocks/default'
16
+
17
+ const mockRegisteredCustomer = {
18
+ authType: 'registered',
19
+ customerId: 'registeredCustomerId',
20
+ customerNo: 'testno',
21
+ email: 'darek@test.com',
22
+ firstName: 'Tester',
23
+ lastName: 'Testing',
24
+ login: 'darek@test.com'
25
+ }
26
+
27
+ const MockedComponent = () => {
28
+ return (
29
+ <div>
30
+ <ResetPassword />
31
+ </div>
32
+ )
33
+ }
34
+
35
+ // Set up and clean up
36
+ beforeEach(() => {
37
+ jest.resetModules()
38
+ window.history.pushState({}, 'Reset Password', createPathWithDefaults('/reset-password'))
39
+ global.server.use(
40
+ rest.post('*/customers', (req, res, ctx) => {
41
+ return res(ctx.delay(0), ctx.status(200), ctx.json(mockRegisteredCustomer))
42
+ }),
43
+ rest.get('*/customers/:customerId', (req, res, ctx) => {
44
+ const {customerId} = req.params
45
+ if (customerId === 'customerId') {
46
+ return res(
47
+ ctx.delay(0),
48
+ ctx.status(200),
49
+ ctx.json({
50
+ authType: 'guest',
51
+ customerId: 'customerid'
52
+ })
53
+ )
54
+ }
55
+ return res(ctx.delay(0), ctx.status(200), ctx.json(mockRegisteredCustomer))
56
+ })
57
+ )
58
+ })
59
+ afterEach(() => {
60
+ jest.resetModules()
61
+ localStorage.clear()
62
+ jest.clearAllMocks()
63
+ window.history.pushState({}, 'Reset Password', createPathWithDefaults('/reset-password'))
64
+ })
65
+
66
+ test('Allows customer to go to sign in page', async () => {
67
+ // render our test component
68
+ const {user} = renderWithProviders(<MockedComponent />, {
69
+ wrapperProps: {siteAlias: 'uk', appConfig: mockConfig.app}
70
+ })
71
+
72
+ await user.click(await screen.findByText('Sign in'))
73
+
74
+ await waitFor(() => {
75
+ expect(window.location.pathname).toBe('/uk/en-GB/login')
76
+ })
77
+ })
78
+
79
+ test('Allows customer to generate password token', async () => {
80
+ global.server.use(
81
+ rest.post('*/create-reset-token', (req, res, ctx) =>
82
+ res(
83
+ ctx.delay(0),
84
+ ctx.json({
85
+ email: 'foo@test.com',
86
+ expiresInMinutes: 10,
87
+ login: 'foo@test.com',
88
+ resetToken: 'testresettoken'
89
+ })
90
+ )
91
+ )
92
+ )
93
+ // render our test component
94
+ const {user} = renderWithProviders(<MockedComponent />, {
95
+ wrapperProps: {siteAlias: 'uk', appConfig: mockConfig.app}
96
+ })
97
+
98
+ // enter credentials and submit
99
+ await user.type(await screen.findByLabelText('Email'), 'foo@test.com')
100
+ await user.click(
101
+ within(await screen.findByTestId('sf-auth-modal-form')).getByText(/reset password/i)
102
+ )
103
+
104
+ expect(await screen.findByText(/password reset/i, {}, {timeout: 12000})).toBeInTheDocument()
105
+
106
+ await waitFor(() => {
107
+ expect(screen.getByText(/foo@test.com/i)).toBeInTheDocument()
108
+ })
109
+
110
+ await user.click(screen.getByText('Back to Sign In'))
111
+
112
+ await waitFor(() => {
113
+ expect(window.location.pathname).toBe('/uk/en-GB/login')
114
+ })
115
+ })
116
+
117
+ test('Renders error message from server', async () => {
118
+ global.server.use(
119
+ rest.post('*/create-reset-token', (req, res, ctx) =>
120
+ res(
121
+ ctx.delay(0),
122
+ ctx.status(500),
123
+ ctx.json({
124
+ detail: 'Something went wrong',
125
+ title: 'Error',
126
+ type: '/error'
127
+ })
128
+ )
129
+ )
130
+ )
131
+ const {user} = renderWithProviders(<MockedComponent />)
132
+
133
+ await user.type(await screen.findByLabelText('Email'), 'foo@test.com')
134
+ await user.click(
135
+ within(await screen.findByTestId('sf-auth-modal-form')).getByText(/reset password/i)
136
+ )
137
+
138
+ await waitFor(() => {
139
+ expect(screen.getByText('500 Internal Server Error')).toBeInTheDocument()
140
+ })
141
+ })
@@ -0,0 +1,118 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+
8
+ // This is an EXAMPLE file. To enable request processing, rename it to
9
+ // 'request-processor.js' and update the processRequest function so that
10
+ // it processes requests in whatever way your project requires.
11
+
12
+ // Uncomment the following line for the example code to work.
13
+ import {QueryParameters} from '@salesforce/pwa-kit-runtime/utils/ssr-request-processing'
14
+
15
+ /**
16
+ * The processRequest function is called for *every* non-proxy, non-bundle
17
+ * request received. That is, all requests that will result in pages being
18
+ * rendered, or the Express app requestHook function being invoked. Because
19
+ * this function runs for every request, it is important that processing
20
+ * take as little time as possible. Do not make external requests from
21
+ * this code. Make your code error tolerant; throwing an error from
22
+ * this function will cause a 500 error response to be sent to the
23
+ * requesting client.
24
+ *
25
+ * The processRequest function is passed details of the incoming request,
26
+ * function to support request-class setting plus parameters that refer to
27
+ * the target for which this code is being run.
28
+ *
29
+ * The function must return an object with 'path' and 'querystring'. These
30
+ * may be the same values passed in, or modified values.
31
+ *
32
+ * Processing query strings can be challenging, because there are multiple
33
+ * formats in use, URL-quoting may be required, and the order of parameters
34
+ * in the URL may be important. To avoid issues, use the QueryParameters
35
+ * class from the SDK's 'utils/ssr-request-processing' module. This
36
+ * class will correctly preserve the order, case, values and encoding of
37
+ * the parameters. The QueryParameters class is documented in the SDK.
38
+ *
39
+ * @param path {String} the path part of the URL, beginning with a '/'
40
+ * @param querystring {String} the query string part of the URL, without
41
+ * any initial '?'
42
+ * @param headers {Headers} the headers of the incoming request. This should
43
+ * be considered read-only (although header values can be changed, most headers
44
+ * are not passed to the origin, so changes have no effect).
45
+ * @param setRequestClass {function} call this with a string to set the
46
+ * "class" of the incoming request. By default, requests have no class.
47
+ * @param parameters {Object}
48
+ * @param parameters.appHostname {String} the "application host name" is the
49
+ * hostname to which requests are sent for this target: the website's hostname.
50
+ * @param parameters.deployTarget {String} the target's id. Use this to have
51
+ * different processing for different targets.
52
+ * @param parameters.proxyConfigs {Object[]} an array of proxy configuration
53
+ * object, each one containing protocol, host and path for a proxy. Use this
54
+ * to have different processing for different backends.
55
+ * @returns {{path: String, querystring: String}}
56
+ */
57
+ export const processRequest = ({
58
+ // Uncomment the following lines for the example code to work.
59
+ // headers,
60
+ // setRequestClass,
61
+ // parameters,
62
+ path,
63
+ querystring
64
+ }) => {
65
+ // This is an EXAMPLE processRequest implementation. You should
66
+ // replace it with code that processes your requests as needed.
67
+
68
+ // This example code will remove any of the parameters whose keys appear
69
+ // in the 'exclusions' array.
70
+ const exclusions = [
71
+ // 'gclid',
72
+ // 'utm_campaign',
73
+ // 'utm_content',
74
+ // 'utm_medium',
75
+ // 'utm_source'
76
+ ]
77
+
78
+ // This is a performance optimization for SLAS.
79
+ // On client side, browser always follow the redirect
80
+ // to /callback but the response is always the same.
81
+ // We strip out the unique query parameters so this
82
+ // endpoint is cached at the CDN level
83
+ if (path === '/callback') {
84
+ exclusions.push('usid')
85
+ exclusions.push('code')
86
+ }
87
+
88
+ // Build a first QueryParameters object from the given querystring
89
+ const incomingParameters = new QueryParameters(querystring)
90
+
91
+ // Build a second QueryParameters from the first, with all
92
+ // excluded parameters removed
93
+ const filteredParameters = QueryParameters.from(
94
+ incomingParameters.parameters.filter(
95
+ // parameter.key is always lower-case
96
+ (parameter) => !exclusions.includes(parameter.key)
97
+ )
98
+ )
99
+
100
+ // Re-generate the querystring
101
+ querystring = filteredParameters.toString()
102
+
103
+ /***************************************************************************
104
+ // This example code will detect bots by examining the user-agent,
105
+ // and will set the request class to 'bot' for all such requests.
106
+ const ua = headers.getHeader('user-agent')
107
+ // This check
108
+ const botcheck = /bot|crawler|spider|crawling/i
109
+ if (botcheck.test(ua)) {
110
+ setRequestClass('bot')
111
+ }
112
+ ***************************************************************************/
113
+ // Return the path unchanged, and the updated query string
114
+ return {
115
+ path,
116
+ querystring
117
+ }
118
+ }
@@ -0,0 +1,23 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ import {processRequest} from '@salesforce/retail-react-app/app/request-processor'
8
+
9
+ describe('processRequest', () => {
10
+ test('returns valid values', () => {
11
+ const result = processRequest({path: 'path', querystring: 'querystring'})
12
+
13
+ expect(result.path).toEqual(expect.any(String))
14
+ expect(result.querystring).toEqual(expect.any(String))
15
+ })
16
+
17
+ test('SLAS callback parameters are removed', () => {
18
+ const result = processRequest({path: '/callback', querystring: 'usid=1&code=2&test=3'})
19
+
20
+ expect(result.path).toBe('/callback')
21
+ expect(result.querystring).toBe('test=3')
22
+ })
23
+ })
package/app/routes.jsx ADDED
@@ -0,0 +1,111 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+
8
+ /* istanbul ignore file */
9
+ // NOTE!
10
+ // This file is being ignored in the test coverage report for now. It reports `0%` functions
11
+ // tested, which brings down the overall coverage and blocks CI. There are tests still, but
12
+ // we don't want it to count toward coverage until we figure out how to cover the `functions`
13
+ // metric for this file in its test.
14
+
15
+ import React from 'react'
16
+ import loadable from '@loadable/component'
17
+ import {getConfig} from '@salesforce/pwa-kit-runtime/utils/ssr-config'
18
+
19
+ // Components
20
+ import {Skeleton} from '@chakra-ui/react'
21
+ import {configureRoutes} from '@salesforce/retail-react-app/app/utils/routes-utils'
22
+
23
+ const fallback = <Skeleton height="75vh" width="100%" />
24
+
25
+ // Pages
26
+ const Home = loadable(() => import('./pages/home'), {fallback})
27
+ const Login = loadable(() => import('./pages/login'), {fallback})
28
+ const Registration = loadable(() => import('./pages/registration'), {fallback})
29
+ const ResetPassword = loadable(() => import('./pages/reset-password'), {fallback})
30
+ const Account = loadable(() => import('./pages/account'), {fallback})
31
+ const Cart = loadable(() => import('./pages/cart'), {fallback})
32
+ const Checkout = loadable(() => import('./pages/checkout'), {fallback})
33
+ const CheckoutConfirmation = loadable(() => import('./pages/checkout/confirmation'), {fallback})
34
+ const LoginRedirect = loadable(() => import('./pages/login-redirect'), {fallback})
35
+ const ProductDetail = loadable(() => import('./pages/product-detail'), {fallback})
36
+ const ProductList = loadable(() => import('./pages/product-list'), {fallback})
37
+ const Wishlist = loadable(() => import('./pages/account/wishlist'), {fallback})
38
+ const PageNotFound = loadable(() => import('./pages/page-not-found'))
39
+
40
+ export const routes = [
41
+ {
42
+ path: '/',
43
+ component: Home,
44
+ exact: true
45
+ },
46
+ {
47
+ path: '/login',
48
+ component: Login,
49
+ exact: true
50
+ },
51
+ {
52
+ path: '/registration',
53
+ component: Registration,
54
+ exact: true
55
+ },
56
+ {
57
+ path: '/reset-password',
58
+ component: ResetPassword,
59
+ exact: true
60
+ },
61
+ {
62
+ path: '/account',
63
+ component: Account
64
+ },
65
+ {
66
+ path: '/checkout',
67
+ component: Checkout,
68
+ exact: true
69
+ },
70
+ {
71
+ path: '/checkout/confirmation/:orderNo',
72
+ component: CheckoutConfirmation
73
+ },
74
+ {
75
+ path: '/callback',
76
+ component: LoginRedirect,
77
+ exact: true
78
+ },
79
+ {
80
+ path: '/cart',
81
+ component: Cart,
82
+ exact: true
83
+ },
84
+ {
85
+ path: '/product/:productId',
86
+ component: ProductDetail
87
+ },
88
+ {
89
+ path: '/search',
90
+ component: ProductList
91
+ },
92
+ {
93
+ path: '/category/:categoryId',
94
+ component: ProductList
95
+ },
96
+ {
97
+ path: '/account/wishlist',
98
+ component: Wishlist
99
+ },
100
+ {
101
+ path: '*',
102
+ component: PageNotFound
103
+ }
104
+ ]
105
+
106
+ export default () => {
107
+ const config = getConfig()
108
+ return configureRoutes(routes, config, {
109
+ ignoredRoutes: ['/callback', '*']
110
+ })
111
+ }
@@ -0,0 +1,13 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ import routes from '@salesforce/retail-react-app/app/routes'
8
+
9
+ describe('Routes', () => {
10
+ test('exports a valid react-router configuration', () => {
11
+ expect(Array.isArray(routes) || typeof routes === 'function').toBe(true)
12
+ })
13
+ })
package/app/ssr.js ADDED
@@ -0,0 +1,70 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ /* eslint-disable @typescript-eslint/no-var-requires */
8
+ 'use strict'
9
+
10
+ const path = require('path')
11
+ const {getRuntime} = require('@salesforce/pwa-kit-runtime/ssr/server/express')
12
+ const {isRemote} = require('@salesforce/pwa-kit-runtime/utils/ssr-server')
13
+ const {getConfig} = require('@salesforce/pwa-kit-runtime/utils/ssr-config')
14
+ const helmet = require('helmet')
15
+
16
+ const options = {
17
+ // The build directory (an absolute path)
18
+ buildDir: path.resolve(process.cwd(), 'build'),
19
+
20
+ // The cache time for SSR'd pages (defaults to 600 seconds)
21
+ defaultCacheTimeSeconds: 600,
22
+
23
+ // This is the value of the 'mobify' object from package.json
24
+ mobify: getConfig(),
25
+
26
+ // The port that the local dev server listens on
27
+ port: 3000,
28
+
29
+ // The protocol on which the development Express app listens.
30
+ // Note that http://localhost is treated as a secure context for development.
31
+ protocol: 'http'
32
+ }
33
+
34
+ const runtime = getRuntime()
35
+
36
+ const {handler} = runtime.createHandler(options, (app) => {
37
+ // Set HTTP security headers
38
+ app.use(
39
+ helmet({
40
+ contentSecurityPolicy: {
41
+ useDefaults: true,
42
+ directives: {
43
+ 'img-src': ["'self'", '*.commercecloud.salesforce.com', 'data:'],
44
+ 'script-src': ["'self'", "'unsafe-eval'", 'storage.googleapis.com'],
45
+ 'connect-src': ["'self'", 'api.cquotient.com'],
46
+
47
+ // Do not upgrade insecure requests for local development
48
+ 'upgrade-insecure-requests': isRemote() ? [] : null
49
+ }
50
+ },
51
+ hsts: isRemote()
52
+ })
53
+ )
54
+
55
+ // Handle the redirect from SLAS as to avoid error
56
+ app.get('/callback?*', (req, res) => {
57
+ // This endpoint does nothing and is not expected to change
58
+ // Thus we cache it for a year to maximize performance
59
+ res.set('Cache-Control', `max-age=31536000`)
60
+ res.send()
61
+ })
62
+ app.get('/robots.txt', runtime.serveStaticFile('static/robots.txt'))
63
+ app.get('/favicon.ico', runtime.serveStaticFile('static/ico/favicon.ico'))
64
+
65
+ app.get('/worker.js(.map)?', runtime.serveServiceWorker)
66
+ app.get('*', runtime.render)
67
+ })
68
+ // SSR requires that we export a single handler function called 'get', that
69
+ // supports AWS use of the server that we created above.
70
+ exports.get = handler
Binary file
Binary file
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "example.com",
3
+ "short_name": "example.com",
4
+ "start_url": "/?homescreen=1",
5
+ "background_color": "#fff",
6
+ "theme_color": "#4e439b",
7
+ "display": "standalone",
8
+ "icons": [
9
+ {
10
+ "src": "./img/global/app-icon-192.png",
11
+ "sizes": "192x192"
12
+ },
13
+ {
14
+ "src": "./img/global/app-icon-512.png",
15
+ "sizes": "512x512"
16
+ }
17
+ ]
18
+ }
19
+
@@ -0,0 +1,2 @@
1
+ User-agent: *
2
+ Disallow:
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ export default {
8
+ baseStyle: {
9
+ button: {
10
+ paddingLeft: 0,
11
+
12
+ _hover: {
13
+ background: 'none'
14
+ }
15
+ },
16
+ panel: {
17
+ paddingTop: 0,
18
+ paddingBottom: 0
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,17 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ export default {
8
+ variants: {
9
+ subtle: (props) => ({
10
+ container: {
11
+ borderColor: `${props.colorScheme || 'green'}.600`,
12
+ borderWidth: 1,
13
+ borderStyle: 'solid'
14
+ }
15
+ })
16
+ }
17
+ }
@@ -0,0 +1,25 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ export default {
8
+ variants: {
9
+ notification: {
10
+ display: 'inline-flex',
11
+ justifyContent: 'center',
12
+ position: 'absolute',
13
+ top: 0,
14
+ right: 0,
15
+ minWidth: 5,
16
+ height: 5,
17
+ color: 'white',
18
+ fontSize: 'xs',
19
+ backgroundColor: 'blue.500',
20
+ border: '1px solid',
21
+ borderColor: 'white',
22
+ borderRadius: 'full'
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,77 @@
1
+ /*
2
+ * Copyright (c) 2021, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ export default {
8
+ baseStyle: {
9
+ borderRadius: 'base'
10
+ },
11
+ variants: {
12
+ solid: (props) =>
13
+ props.colorScheme === 'blue'
14
+ ? {
15
+ backgroundColor: 'blue.600',
16
+ color: 'white',
17
+ _hover: {bg: 'blue.700', _disabled: {bg: 'blue.300'}},
18
+ _active: {bg: 'blue.800'},
19
+ _disabled: {bg: 'blue.300'}
20
+ }
21
+ : {},
22
+ outline: (props) =>
23
+ props.colorScheme === 'black'
24
+ ? {color: 'gray.900', _hover: {bg: 'gray.50'}, borderColor: 'gray.200'}
25
+ : {color: 'blue.600', _hover: {bg: 'gray.50'}},
26
+ footer: {
27
+ fontSize: 'sm',
28
+ backgroundColor: 'gray.100',
29
+ color: 'black',
30
+ _hover: {bg: 'gray.200'},
31
+ _active: {bg: 'gray.300'},
32
+ paddingLeft: 3,
33
+ paddingRight: 3
34
+ },
35
+ link: (props) => ({
36
+ color: props.colorScheme === 'red' ? 'red.500' : 'blue.600',
37
+ fontWeight: 'normal',
38
+ minWidth: '1em',
39
+ lineHeight: 4
40
+ }),
41
+ 'menu-link': {
42
+ color: 'black',
43
+ justifyContent: 'flex-start',
44
+ fontSize: 'sm',
45
+ _hover: {bg: 'gray.50', textDecoration: 'none'},
46
+ _activeLink: {
47
+ bg: 'gray.50',
48
+ textDecoration: 'none'
49
+ }
50
+ },
51
+ 'menu-link-mobile': {
52
+ color: 'black',
53
+ justifyContent: 'flex-start',
54
+ fontSize: 'sm',
55
+ _hover: {bg: 'gray.50', textDecoration: 'none'},
56
+ _activeLink: {
57
+ bg: 'gray.100',
58
+ textDecoration: 'none'
59
+ }
60
+ },
61
+ 'search-link': {
62
+ color: 'black',
63
+ justifyContent: 'flex-start',
64
+ fontSize: 'sm',
65
+ _hover: {textDecoration: 'none'}
66
+ }
67
+ },
68
+ sizes: {
69
+ md: {
70
+ height: 11,
71
+ minWidth: 11
72
+ }
73
+ },
74
+ defaultProps: {
75
+ colorScheme: 'blue'
76
+ }
77
+ }