@magento/venia-ui 9.5.0-alpha.1 → 9.6.0-alpha.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 (26) hide show
  1. package/i18n/en_US.json +1 -0
  2. package/lib/components/AccountInformationPage/__tests__/__snapshots__/editForm.spec.js.snap +3 -0
  3. package/lib/components/CartPage/ProductListing/__tests__/__snapshots__/product.spec.js.snap +3 -0
  4. package/lib/components/CategoryTree/categoryBranch.js +4 -2
  5. package/lib/components/CategoryTree/categoryLeaf.js +3 -1
  6. package/lib/components/CategoryTree/categoryTree.js +11 -2
  7. package/lib/components/CheckoutPage/OrderConfirmationPage/__tests__/__snapshots__/createAccount.spec.js.snap +2 -0
  8. package/lib/components/CheckoutPage/ShippingInformation/AddressForm/__tests__/__snapshots__/guestForm.spec.js.snap +40 -4
  9. package/lib/components/CheckoutPage/ShippingInformation/AddressForm/guestForm.js +40 -1
  10. package/lib/components/CreateAccount/__tests__/__snapshots__/createAccount.spec.js.snap +32 -16
  11. package/lib/components/CreateAccount/createAccount.js +7 -0
  12. package/lib/components/HomePage/homePage.module.css +0 -1
  13. package/lib/components/LegacyMiniCart/__tests__/__snapshots__/kebab.spec.js.snap +6 -2
  14. package/lib/components/LegacyMiniCart/kebab.js +3 -1
  15. package/lib/components/LegacyMiniCart/kebab.module.css +2 -1
  16. package/lib/components/MyAccount/ResetPassword/__tests__/__snapshots__/resetPassword.spec.js.snap +6 -2
  17. package/lib/components/Navigation/__tests__/navigation.spec.js +11 -0
  18. package/lib/components/Navigation/navigation.js +39 -30
  19. package/lib/components/Password/__tests__/__snapshots__/password.spec.js.snap +9 -3
  20. package/lib/components/Password/password.js +1 -1
  21. package/lib/components/SearchBar/autocomplete.js +6 -2
  22. package/lib/components/SearchBar/searchField.js +1 -0
  23. package/lib/components/SignIn/__tests__/__snapshots__/signIn.spec.js.snap +9 -3
  24. package/lib/components/SignIn/signIn.js +3 -0
  25. package/lib/tokens.module.css +1 -1
  26. package/package.json +4 -4
package/i18n/en_US.json CHANGED
@@ -403,6 +403,7 @@
403
403
  "shippingForm.getShippingOptions": "Get Shipping Options",
404
404
  "shippingForm.loading": "Loading Methods...",
405
405
  "shippingForm.zip": "ZIP",
406
+ "shippingForm.shippingEmail":"Shipping Email",
406
407
  "shippingInformation.cardTitle": "Shipping Information",
407
408
  "shippingInformation.editTitle": "1. Shipping Information",
408
409
  "shippingInformation.loading": "Fetching Shipping Information...",
@@ -152,6 +152,7 @@ exports[`renders form when shouldShowNewPassword is false 1`] = `
152
152
  >
153
153
  <label
154
154
  className="label"
155
+ htmlFor="Password"
155
156
  >
156
157
  Password
157
158
  </label>
@@ -420,6 +421,7 @@ exports[`renders form when shouldShowNewPassword is true 1`] = `
420
421
  >
421
422
  <label
422
423
  className="label"
424
+ htmlFor="Password"
423
425
  >
424
426
  Current Password
425
427
  </label>
@@ -510,6 +512,7 @@ exports[`renders form when shouldShowNewPassword is true 1`] = `
510
512
  >
511
513
  <label
512
514
  className="label"
515
+ htmlFor="Password"
513
516
  >
514
517
  New Password
515
518
  </label>
@@ -260,6 +260,7 @@ exports[`renders configurable product with options 1`] = `
260
260
  </span>
261
261
  </button>
262
262
  <ul
263
+ aria-hidden="true"
263
264
  className="dropdown"
264
265
  >
265
266
  <li
@@ -593,6 +594,7 @@ exports[`renders out of stock product 1`] = `
593
594
  </span>
594
595
  </button>
595
596
  <ul
597
+ aria-hidden="true"
596
598
  className="dropdown"
597
599
  >
598
600
  <li
@@ -892,6 +894,7 @@ exports[`renders simple product correctly 1`] = `
892
894
  </span>
893
895
  </button>
894
896
  <ul
897
+ aria-hidden="true"
895
898
  className="dropdown"
896
899
  >
897
900
  <li
@@ -6,7 +6,7 @@ import { useStyle } from '../../classify';
6
6
  import defaultClasses from './categoryBranch.module.css';
7
7
 
8
8
  const Branch = props => {
9
- const { category, setCategoryId } = props;
9
+ const { category, setCategoryId, tabindex } = props;
10
10
  const { name } = category;
11
11
  const classes = useStyle(defaultClasses, props.classes);
12
12
 
@@ -20,6 +20,7 @@ const Branch = props => {
20
20
  return (
21
21
  <li className={classes.root}>
22
22
  <button
23
+ tabindex={tabindex}
23
24
  className={classes.target}
24
25
  data-cy="CategoryTree-Branch-target"
25
26
  type="button"
@@ -44,5 +45,6 @@ Branch.propTypes = {
44
45
  target: string,
45
46
  text: string
46
47
  }),
47
- setCategoryId: func.isRequired
48
+ setCategoryId: func.isRequired,
49
+ tabindex: func.isRequired
48
50
  };
@@ -9,7 +9,7 @@ import { useStyle } from '../../classify';
9
9
  import defaultClasses from './categoryLeaf.module.css';
10
10
 
11
11
  const Leaf = props => {
12
- const { category, onNavigate, categoryUrlSuffix } = props;
12
+ const { category, onNavigate, categoryUrlSuffix, tabindex } = props;
13
13
  const { name, url_path, children } = category;
14
14
  const classes = useStyle(defaultClasses, props.classes);
15
15
  const { handleClick } = useCategoryLeaf({ onNavigate });
@@ -35,6 +35,7 @@ const Leaf = props => {
35
35
  data-cy="CategoryTree-Leaf-target"
36
36
  to={destination}
37
37
  onClick={handleClick}
38
+ tabIndex={tabindex}
38
39
  >
39
40
  <span className={classes.text}>{leafLabel}</span>
40
41
  </Link>
@@ -55,5 +56,6 @@ Leaf.propTypes = {
55
56
  text: string
56
57
  }),
57
58
  onNavigate: func.isRequired,
59
+ tabindex: func.isRequired,
58
60
  categoryUrlSuffix: string
59
61
  };
@@ -8,7 +8,13 @@ import Leaf from './categoryLeaf';
8
8
  import defaultClasses from './categoryTree.module.css';
9
9
 
10
10
  const Tree = props => {
11
- const { categoryId, onNavigate, setCategoryId, updateCategories } = props;
11
+ const {
12
+ categoryId,
13
+ onNavigate,
14
+ setCategoryId,
15
+ updateCategories,
16
+ tabindex
17
+ } = props;
12
18
 
13
19
  const talonProps = useCategoryTree({
14
20
  categoryId,
@@ -29,12 +35,14 @@ const Tree = props => {
29
35
  category={category}
30
36
  onNavigate={onNavigate}
31
37
  categoryUrlSuffix={categoryUrlSuffix}
38
+ tabindex={tabindex}
32
39
  />
33
40
  ) : (
34
41
  <Branch
35
42
  key={id}
36
43
  category={category}
37
44
  setCategoryId={setCategoryId}
45
+ tabindex={tabindex}
38
46
  />
39
47
  );
40
48
  })
@@ -57,5 +65,6 @@ Tree.propTypes = {
57
65
  }),
58
66
  onNavigate: func.isRequired,
59
67
  setCategoryId: func.isRequired,
60
- updateCategories: func.isRequired
68
+ updateCategories: func.isRequired,
69
+ tabindex: func.isRequired
61
70
  };
@@ -153,6 +153,7 @@ exports[`CreateAccount renders CreateAccount component 1`] = `
153
153
  >
154
154
  <label
155
155
  className="label"
156
+ htmlFor="Password"
156
157
  >
157
158
  Password
158
159
  </label>
@@ -475,6 +476,7 @@ exports[`CreateAccount renders errors 1`] = `
475
476
  >
476
477
  <label
477
478
  className="label"
479
+ htmlFor="Password"
478
480
  >
479
481
  Password
480
482
  </label>
@@ -36,7 +36,7 @@ Array [
36
36
  className="input"
37
37
  >
38
38
  <input
39
- autoComplete="off"
39
+ autoComplete="Shipping Email"
40
40
  className="input"
41
41
  id="email"
42
42
  name="email"
@@ -91,6 +91,7 @@ Array [
91
91
  className="input"
92
92
  >
93
93
  <input
94
+ autoComplete="First Name"
94
95
  className="input"
95
96
  id="firstname"
96
97
  name="firstname"
@@ -136,6 +137,7 @@ Array [
136
137
  className="input"
137
138
  >
138
139
  <input
140
+ autoComplete="Last Name"
139
141
  className="input"
140
142
  id="lastname"
141
143
  name="lastname"
@@ -160,6 +162,7 @@ Array [
160
162
  className="country"
161
163
  >
162
164
  <Country
165
+ autoComplete="Country"
163
166
  validate={[Function]}
164
167
  />
165
168
  </div>
@@ -188,6 +191,7 @@ Array [
188
191
  className="input"
189
192
  >
190
193
  <input
194
+ autoComplete="Street Address"
191
195
  className="input"
192
196
  id="street0"
193
197
  name="street[0]"
@@ -241,6 +245,7 @@ Array [
241
245
  className="input"
242
246
  >
243
247
  <input
248
+ autoComplete="Street Address 2"
244
249
  className="input"
245
250
  id="street1"
246
251
  name="street[1]"
@@ -286,6 +291,7 @@ Array [
286
291
  className="input"
287
292
  >
288
293
  <input
294
+ autoComplete="City"
289
295
  className="input"
290
296
  id="city"
291
297
  name="city"
@@ -310,6 +316,7 @@ Array [
310
316
  className="region"
311
317
  >
312
318
  <Region
319
+ autoComplete="State"
313
320
  fieldInput="region[region]"
314
321
  fieldSelect="region[region_id]"
315
322
  optionValueKey="id"
@@ -341,6 +348,7 @@ Array [
341
348
  className="input"
342
349
  >
343
350
  <input
351
+ autoComplete="ZIP / Postal Code"
344
352
  className="input"
345
353
  id="root"
346
354
  name="postcode"
@@ -386,6 +394,7 @@ Array [
386
394
  className="input"
387
395
  >
388
396
  <input
397
+ autoComplete="Phone Number"
389
398
  className="input"
390
399
  id="telephone"
391
400
  name="telephone"
@@ -477,7 +486,7 @@ Array [
477
486
  className="input"
478
487
  >
479
488
  <input
480
- autoComplete="off"
489
+ autoComplete="Shipping Email"
481
490
  className="input"
482
491
  id="email"
483
492
  name="email"
@@ -532,6 +541,7 @@ Array [
532
541
  className="input"
533
542
  >
534
543
  <input
544
+ autoComplete="First Name"
535
545
  className="input"
536
546
  id="firstname"
537
547
  name="firstname"
@@ -577,6 +587,7 @@ Array [
577
587
  className="input"
578
588
  >
579
589
  <input
590
+ autoComplete="Last Name"
580
591
  className="input"
581
592
  id="lastname"
582
593
  name="lastname"
@@ -601,6 +612,7 @@ Array [
601
612
  className="country"
602
613
  >
603
614
  <Country
615
+ autoComplete="Country"
604
616
  validate={[Function]}
605
617
  />
606
618
  </div>
@@ -629,6 +641,7 @@ Array [
629
641
  className="input"
630
642
  >
631
643
  <input
644
+ autoComplete="Street Address"
632
645
  className="input"
633
646
  id="street0"
634
647
  name="street[0]"
@@ -682,6 +695,7 @@ Array [
682
695
  className="input"
683
696
  >
684
697
  <input
698
+ autoComplete="Street Address 2"
685
699
  className="input"
686
700
  id="street1"
687
701
  name="street[1]"
@@ -727,6 +741,7 @@ Array [
727
741
  className="input"
728
742
  >
729
743
  <input
744
+ autoComplete="City"
730
745
  className="input"
731
746
  id="city"
732
747
  name="city"
@@ -751,6 +766,7 @@ Array [
751
766
  className="region"
752
767
  >
753
768
  <Region
769
+ autoComplete="State"
754
770
  fieldInput="region[region]"
755
771
  fieldSelect="region[region_id]"
756
772
  optionValueKey="id"
@@ -782,6 +798,7 @@ Array [
782
798
  className="input"
783
799
  >
784
800
  <input
801
+ autoComplete="ZIP / Postal Code"
785
802
  className="input"
786
803
  id="root"
787
804
  name="postcode"
@@ -827,6 +844,7 @@ Array [
827
844
  className="input"
828
845
  >
829
846
  <input
847
+ autoComplete="Phone Number"
830
848
  className="input"
831
849
  id="telephone"
832
850
  name="telephone"
@@ -914,7 +932,7 @@ Array [
914
932
  className="input"
915
933
  >
916
934
  <input
917
- autoComplete="off"
935
+ autoComplete="Shipping Email"
918
936
  className="input"
919
937
  id="email"
920
938
  name="email"
@@ -961,6 +979,7 @@ Array [
961
979
  className="input"
962
980
  >
963
981
  <input
982
+ autoComplete="First Name"
964
983
  className="input"
965
984
  id="firstname"
966
985
  name="firstname"
@@ -1006,6 +1025,7 @@ Array [
1006
1025
  className="input"
1007
1026
  >
1008
1027
  <input
1028
+ autoComplete="Last Name"
1009
1029
  className="input"
1010
1030
  id="lastname"
1011
1031
  name="lastname"
@@ -1030,6 +1050,7 @@ Array [
1030
1050
  className="country"
1031
1051
  >
1032
1052
  <Country
1053
+ autoComplete="Country"
1033
1054
  validate={[Function]}
1034
1055
  />
1035
1056
  </div>
@@ -1058,6 +1079,7 @@ Array [
1058
1079
  className="input"
1059
1080
  >
1060
1081
  <input
1082
+ autoComplete="Street Address"
1061
1083
  className="input"
1062
1084
  id="street0"
1063
1085
  name="street[0]"
@@ -1111,6 +1133,7 @@ Array [
1111
1133
  className="input"
1112
1134
  >
1113
1135
  <input
1136
+ autoComplete="Street Address 2"
1114
1137
  className="input"
1115
1138
  id="street1"
1116
1139
  name="street[1]"
@@ -1156,6 +1179,7 @@ Array [
1156
1179
  className="input"
1157
1180
  >
1158
1181
  <input
1182
+ autoComplete="City"
1159
1183
  className="input"
1160
1184
  id="city"
1161
1185
  name="city"
@@ -1180,6 +1204,7 @@ Array [
1180
1204
  className="region"
1181
1205
  >
1182
1206
  <Region
1207
+ autoComplete="State"
1183
1208
  fieldInput="region[region]"
1184
1209
  fieldSelect="region[region_id]"
1185
1210
  optionValueKey="id"
@@ -1211,6 +1236,7 @@ Array [
1211
1236
  className="input"
1212
1237
  >
1213
1238
  <input
1239
+ autoComplete="ZIP / Postal Code"
1214
1240
  className="input"
1215
1241
  id="root"
1216
1242
  name="postcode"
@@ -1256,6 +1282,7 @@ Array [
1256
1282
  className="input"
1257
1283
  >
1258
1284
  <input
1285
+ autoComplete="Phone Number"
1259
1286
  className="input"
1260
1287
  id="telephone"
1261
1288
  name="telephone"
@@ -1369,7 +1396,7 @@ Array [
1369
1396
  className="input"
1370
1397
  >
1371
1398
  <input
1372
- autoComplete="off"
1399
+ autoComplete="Shipping Email"
1373
1400
  className="input"
1374
1401
  id="email"
1375
1402
  name="email"
@@ -1416,6 +1443,7 @@ Array [
1416
1443
  className="input"
1417
1444
  >
1418
1445
  <input
1446
+ autoComplete="First Name"
1419
1447
  className="input"
1420
1448
  id="firstname"
1421
1449
  name="firstname"
@@ -1461,6 +1489,7 @@ Array [
1461
1489
  className="input"
1462
1490
  >
1463
1491
  <input
1492
+ autoComplete="Last Name"
1464
1493
  className="input"
1465
1494
  id="lastname"
1466
1495
  name="lastname"
@@ -1485,6 +1514,7 @@ Array [
1485
1514
  className="country"
1486
1515
  >
1487
1516
  <Country
1517
+ autoComplete="Country"
1488
1518
  validate={[Function]}
1489
1519
  />
1490
1520
  </div>
@@ -1513,6 +1543,7 @@ Array [
1513
1543
  className="input"
1514
1544
  >
1515
1545
  <input
1546
+ autoComplete="Street Address"
1516
1547
  className="input"
1517
1548
  id="street0"
1518
1549
  name="street[0]"
@@ -1566,6 +1597,7 @@ Array [
1566
1597
  className="input"
1567
1598
  >
1568
1599
  <input
1600
+ autoComplete="Street Address 2"
1569
1601
  className="input"
1570
1602
  id="street1"
1571
1603
  name="street[1]"
@@ -1611,6 +1643,7 @@ Array [
1611
1643
  className="input"
1612
1644
  >
1613
1645
  <input
1646
+ autoComplete="City"
1614
1647
  className="input"
1615
1648
  id="city"
1616
1649
  name="city"
@@ -1635,6 +1668,7 @@ Array [
1635
1668
  className="region"
1636
1669
  >
1637
1670
  <Region
1671
+ autoComplete="State"
1638
1672
  fieldInput="region[region]"
1639
1673
  fieldSelect="region[region_id]"
1640
1674
  optionValueKey="id"
@@ -1666,6 +1700,7 @@ Array [
1666
1700
  className="input"
1667
1701
  >
1668
1702
  <input
1703
+ autoComplete="ZIP / Postal Code"
1669
1704
  className="input"
1670
1705
  id="root"
1671
1706
  name="postcode"
@@ -1711,6 +1746,7 @@ Array [
1711
1746
  className="input"
1712
1747
  >
1713
1748
  <input
1749
+ autoComplete="Phone Number"
1714
1750
  className="input"
1715
1751
  id="telephone"
1716
1752
  name="telephone"
@@ -145,7 +145,10 @@ const GuestForm = props => {
145
145
  })}
146
146
  >
147
147
  <TextInput
148
- autoComplete="off"
148
+ autoComplete={formatMessage({
149
+ id: 'shippingForm.shippingEmail',
150
+ defaultMessage: 'Shipping Email'
151
+ })}
149
152
  field="email"
150
153
  id="email"
151
154
  data-cy="GuestForm-email"
@@ -174,6 +177,10 @@ const GuestForm = props => {
174
177
  })}
175
178
  >
176
179
  <TextInput
180
+ autoComplete={formatMessage({
181
+ id: 'global.firstName',
182
+ defaultMessage: 'First Name'
183
+ })}
177
184
  field="firstname"
178
185
  id="firstname"
179
186
  data-cy="GuestForm-firstName"
@@ -190,6 +197,10 @@ const GuestForm = props => {
190
197
  })}
191
198
  >
192
199
  <TextInput
200
+ autoComplete={formatMessage({
201
+ id: 'global.lastName',
202
+ defaultMessage: 'Last Name'
203
+ })}
193
204
  field="lastname"
194
205
  id="lastname"
195
206
  data-cy="GuestForm-lastName"
@@ -199,6 +210,10 @@ const GuestForm = props => {
199
210
  </div>
200
211
  <div className={classes.country}>
201
212
  <Country
213
+ autoComplete={formatMessage({
214
+ id: 'country.label',
215
+ defaultMessage: 'Country'
216
+ })}
202
217
  validate={isRequired}
203
218
  data-cy="GuestForm-country"
204
219
  />
@@ -212,6 +227,10 @@ const GuestForm = props => {
212
227
  })}
213
228
  >
214
229
  <TextInput
230
+ autoComplete={formatMessage({
231
+ id: 'global.streetAddress',
232
+ defaultMessage: 'Street Address'
233
+ })}
215
234
  field="street[0]"
216
235
  id="street0"
217
236
  data-cy="GuestForm-street0"
@@ -229,6 +248,10 @@ const GuestForm = props => {
229
248
  optional={true}
230
249
  >
231
250
  <TextInput
251
+ autoComplete={formatMessage({
252
+ id: 'global.streetAddress2',
253
+ defaultMessage: 'Street Address 2'
254
+ })}
232
255
  field="street[1]"
233
256
  id="street1"
234
257
  data-cy="GuestForm-street1"
@@ -244,6 +267,10 @@ const GuestForm = props => {
244
267
  })}
245
268
  >
246
269
  <TextInput
270
+ autoComplete={formatMessage({
271
+ id: 'global.city',
272
+ defaultMessage: 'City'
273
+ })}
247
274
  field="city"
248
275
  id="city"
249
276
  data-cy="GuestForm-city"
@@ -253,6 +280,10 @@ const GuestForm = props => {
253
280
  </div>
254
281
  <div className={classes.region}>
255
282
  <Region
283
+ autoComplete={formatMessage({
284
+ id: 'region.label',
285
+ defaultMessage: 'State'
286
+ })}
256
287
  validate={isRequired}
257
288
  fieldInput={'region[region]'}
258
289
  fieldSelect={'region[region_id]'}
@@ -262,6 +293,10 @@ const GuestForm = props => {
262
293
  </div>
263
294
  <div className={classes.postcode}>
264
295
  <Postcode
296
+ autoComplete={formatMessage({
297
+ id: 'postcode.label',
298
+ defaultMessage: 'ZIP / Postal Code'
299
+ })}
265
300
  validate={isRequired}
266
301
  data-cy="GuestForm-postcode"
267
302
  />
@@ -275,6 +310,10 @@ const GuestForm = props => {
275
310
  })}
276
311
  >
277
312
  <TextInput
313
+ autoComplete={formatMessage({
314
+ id: 'global.phoneNumber',
315
+ defaultMessage: 'Phone Number'
316
+ })}
278
317
  field="telephone"
279
318
  id="telephone"
280
319
  data-cy="GuestForm-telephone"
@@ -13,7 +13,9 @@ exports[`renders the correct tree 1`] = `
13
13
  />
14
14
  </h2>
15
15
  <div>
16
- <label>
16
+ <label
17
+ htmlFor="firstName"
18
+ >
17
19
  First Name
18
20
  </label>
19
21
  <span
@@ -27,7 +29,7 @@ exports[`renders the correct tree 1`] = `
27
29
  <span>
28
30
  <input
29
31
  autoComplete="given-name"
30
- id="customer.firstname"
32
+ id="firstName"
31
33
  name="customer.firstname"
32
34
  onBlur={[Function]}
33
35
  onChange={[Function]}
@@ -40,7 +42,9 @@ exports[`renders the correct tree 1`] = `
40
42
  <p />
41
43
  </div>
42
44
  <div>
43
- <label>
45
+ <label
46
+ htmlFor="lastName"
47
+ >
44
48
  Last Name
45
49
  </label>
46
50
  <span
@@ -54,7 +58,7 @@ exports[`renders the correct tree 1`] = `
54
58
  <span>
55
59
  <input
56
60
  autoComplete="family-name"
57
- id="customer.lastname"
61
+ id="lastName"
58
62
  name="customer.lastname"
59
63
  onBlur={[Function]}
60
64
  onChange={[Function]}
@@ -67,7 +71,9 @@ exports[`renders the correct tree 1`] = `
67
71
  <p />
68
72
  </div>
69
73
  <div>
70
- <label>
74
+ <label
75
+ htmlFor="Email"
76
+ >
71
77
  Email
72
78
  </label>
73
79
  <span
@@ -81,7 +87,7 @@ exports[`renders the correct tree 1`] = `
81
87
  <span>
82
88
  <input
83
89
  autoComplete="email"
84
- id="customer.email"
90
+ id="Email"
85
91
  name="customer.email"
86
92
  onBlur={[Function]}
87
93
  onChange={[Function]}
@@ -94,7 +100,9 @@ exports[`renders the correct tree 1`] = `
94
100
  <p />
95
101
  </div>
96
102
  <div>
97
- <label>
103
+ <label
104
+ htmlFor="Password"
105
+ >
98
106
  Password
99
107
  </label>
100
108
  <span
@@ -108,7 +116,7 @@ exports[`renders the correct tree 1`] = `
108
116
  <span>
109
117
  <input
110
118
  autoComplete="new-password"
111
- id="password"
119
+ id="Password"
112
120
  name="password"
113
121
  onBlur={[Function]}
114
122
  onChange={[Function]}
@@ -243,7 +251,9 @@ exports[`should not render cancel button if isCancelButtonHidden is true 1`] = `
243
251
  />
244
252
  </h2>
245
253
  <div>
246
- <label>
254
+ <label
255
+ htmlFor="firstName"
256
+ >
247
257
  First Name
248
258
  </label>
249
259
  <span
@@ -257,7 +267,7 @@ exports[`should not render cancel button if isCancelButtonHidden is true 1`] = `
257
267
  <span>
258
268
  <input
259
269
  autoComplete="given-name"
260
- id="customer.firstname"
270
+ id="firstName"
261
271
  name="customer.firstname"
262
272
  onBlur={[Function]}
263
273
  onChange={[Function]}
@@ -270,7 +280,9 @@ exports[`should not render cancel button if isCancelButtonHidden is true 1`] = `
270
280
  <p />
271
281
  </div>
272
282
  <div>
273
- <label>
283
+ <label
284
+ htmlFor="lastName"
285
+ >
274
286
  Last Name
275
287
  </label>
276
288
  <span
@@ -284,7 +296,7 @@ exports[`should not render cancel button if isCancelButtonHidden is true 1`] = `
284
296
  <span>
285
297
  <input
286
298
  autoComplete="family-name"
287
- id="customer.lastname"
299
+ id="lastName"
288
300
  name="customer.lastname"
289
301
  onBlur={[Function]}
290
302
  onChange={[Function]}
@@ -297,7 +309,9 @@ exports[`should not render cancel button if isCancelButtonHidden is true 1`] = `
297
309
  <p />
298
310
  </div>
299
311
  <div>
300
- <label>
312
+ <label
313
+ htmlFor="Email"
314
+ >
301
315
  Email
302
316
  </label>
303
317
  <span
@@ -311,7 +325,7 @@ exports[`should not render cancel button if isCancelButtonHidden is true 1`] = `
311
325
  <span>
312
326
  <input
313
327
  autoComplete="email"
314
- id="customer.email"
328
+ id="Email"
315
329
  name="customer.email"
316
330
  onBlur={[Function]}
317
331
  onChange={[Function]}
@@ -324,7 +338,9 @@ exports[`should not render cancel button if isCancelButtonHidden is true 1`] = `
324
338
  <p />
325
339
  </div>
326
340
  <div>
327
- <label>
341
+ <label
342
+ htmlFor="Password"
343
+ >
328
344
  Password
329
345
  </label>
330
346
  <span
@@ -338,7 +354,7 @@ exports[`should not render cancel button if isCancelButtonHidden is true 1`] = `
338
354
  <span>
339
355
  <input
340
356
  autoComplete="new-password"
341
- id="password"
357
+ id="Password"
342
358
  name="password"
343
359
  onBlur={[Function]}
344
360
  onChange={[Function]}
@@ -84,12 +84,14 @@ const CreateAccount = props => {
84
84
  </h2>
85
85
  <FormError errors={Array.from(errors.values())} />
86
86
  <Field
87
+ id="firstName"
87
88
  label={formatMessage({
88
89
  id: 'createAccount.firstNameText',
89
90
  defaultMessage: 'First Name'
90
91
  })}
91
92
  >
92
93
  <TextInput
94
+ id="firstName"
93
95
  field="customer.firstname"
94
96
  autoComplete="given-name"
95
97
  validate={isRequired}
@@ -100,12 +102,14 @@ const CreateAccount = props => {
100
102
  />
101
103
  </Field>
102
104
  <Field
105
+ id="lastName"
103
106
  label={formatMessage({
104
107
  id: 'createAccount.lastNameText',
105
108
  defaultMessage: 'Last Name'
106
109
  })}
107
110
  >
108
111
  <TextInput
112
+ id="lastName"
109
113
  field="customer.lastname"
110
114
  autoComplete="family-name"
111
115
  validate={isRequired}
@@ -116,12 +120,14 @@ const CreateAccount = props => {
116
120
  />
117
121
  </Field>
118
122
  <Field
123
+ id="Email"
119
124
  label={formatMessage({
120
125
  id: 'createAccount.emailText',
121
126
  defaultMessage: 'Email'
122
127
  })}
123
128
  >
124
129
  <TextInput
130
+ id="Email"
125
131
  field="customer.email"
126
132
  autoComplete="email"
127
133
  validate={isRequired}
@@ -132,6 +138,7 @@ const CreateAccount = props => {
132
138
  />
133
139
  </Field>
134
140
  <Password
141
+ id="Password"
135
142
  autoComplete="new-password"
136
143
  fieldName="password"
137
144
  isToggleButtonHidden={false}
@@ -405,7 +405,6 @@
405
405
 
406
406
  :global(.venia-home-products .slick-slider .slick-dots li > button) {
407
407
  background-clip: content-box !important;
408
- background-color: hsl(205 004% 088%) !important;
409
408
  border-color: transparent;
410
409
  border-radius: 0;
411
410
  border-style: solid;
@@ -18,7 +18,9 @@ exports[`it renders children passed to it 1`] = `
18
18
  }
19
19
  />
20
20
  </button>
21
- <ul>
21
+ <ul
22
+ aria-hidden="true"
23
+ >
22
24
  <span />
23
25
  <p />
24
26
  <div />
@@ -44,6 +46,8 @@ exports[`it renders correctly without children 1`] = `
44
46
  }
45
47
  />
46
48
  </button>
47
- <ul />
49
+ <ul
50
+ aria-hidden="true"
51
+ />
48
52
  </div>
49
53
  `;
@@ -24,7 +24,9 @@ const Kebab = props => {
24
24
  >
25
25
  <Icon src={MoreVerticalIcon} />
26
26
  </button>
27
- <ul className={toggleClass}>{children}</ul>
27
+ <ul aria-hidden="true" className={toggleClass}>
28
+ {children}
29
+ </ul>
28
30
  </div>
29
31
  );
30
32
  };
@@ -20,11 +20,12 @@
20
20
  transition: 256ms ease-out;
21
21
  transform: scale(0);
22
22
  transform-origin: 100% 0;
23
+ display: none !important;
23
24
  }
24
25
 
25
26
  .dropdown_active {
26
27
  composes: dropdown;
27
-
28
+ display: block !important;
28
29
  composes: absolute from global;
29
30
  transform: scale(1);
30
31
  transition: 250ms var(--venia-global-anim-bounce);
@@ -76,7 +76,9 @@ exports[`should render formErrors 1`] = `
76
76
  <p />
77
77
  </div>
78
78
  <div>
79
- <label>
79
+ <label
80
+ htmlFor="Password"
81
+ >
80
82
  New Password
81
83
  </label>
82
84
  <span
@@ -225,7 +227,9 @@ exports[`should render properly 1`] = `
225
227
  <p />
226
228
  </div>
227
229
  <div>
228
- <label>
230
+ <label
231
+ htmlFor="Password"
232
+ >
229
233
  New Password
230
234
  </label>
231
235
  <span
@@ -21,6 +21,17 @@ jest.mock('../../Header/currencySwitcher', () => () => 'CurrencySwitcher');
21
21
 
22
22
  jest.mock('@magento/peregrine/lib/talons/Navigation/useNavigation');
23
23
 
24
+ jest.mock('react-aria', () => ({
25
+ FocusScope: jest.fn(({ children }) => {
26
+ return children;
27
+ })
28
+ }));
29
+
30
+ jest.mock('../../Portal', () => ({
31
+ Portal: jest.fn(({ children }) => {
32
+ return children;
33
+ })
34
+ }));
24
35
  /*
25
36
  * Tests.
26
37
  */
@@ -10,7 +10,8 @@ import StoreSwitcher from '../Header/storeSwitcher';
10
10
  import LoadingIndicator from '../LoadingIndicator';
11
11
  import NavHeader from './navHeader';
12
12
  import defaultClasses from './navigation.module.css';
13
-
13
+ import { FocusScope } from 'react-aria';
14
+ import { Portal } from '../Portal';
14
15
  const AuthModal = React.lazy(() => import('../AuthModal'));
15
16
 
16
17
  const Navigation = props => {
@@ -35,6 +36,7 @@ const Navigation = props => {
35
36
  const rootClassName = isOpen ? classes.root_open : classes.root;
36
37
  const modalClassName = hasModal ? classes.modal_open : classes.modal;
37
38
  const bodyClassName = hasModal ? classes.body_masked : classes.body;
39
+ const tabindex = isOpen ? '0' : '-1';
38
40
 
39
41
  // Lazy load the auth modal because it may not be needed.
40
42
  const authModal = hasModal ? (
@@ -52,35 +54,42 @@ const Navigation = props => {
52
54
  ) : null;
53
55
 
54
56
  return (
55
- <aside className={rootClassName}>
56
- <header className={classes.header}>
57
- <NavHeader
58
- isTopLevel={isTopLevel}
59
- onBack={handleBack}
60
- view={view}
61
- />
62
- </header>
63
- <div className={bodyClassName}>
64
- <CategoryTree
65
- categoryId={categoryId}
66
- onNavigate={handleClose}
67
- setCategoryId={setCategoryId}
68
- updateCategories={catalogActions.updateCategories}
69
- />
70
- </div>
71
- <div className={classes.footer}>
72
- <div className={classes.switchers}>
73
- <StoreSwitcher />
74
- <CurrencySwitcher />
75
- </div>
76
- <AuthBar
77
- disabled={hasModal}
78
- showMyAccount={showMyAccount}
79
- showSignIn={showSignIn}
80
- />
81
- </div>
82
- <div className={modalClassName}>{authModal}</div>
83
- </aside>
57
+ <Portal>
58
+ {/* eslint-disable-next-line jsx-a11y/no-autofocus */}
59
+ <FocusScope contain={isOpen} restoreFocus autoFocus>
60
+ {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}
61
+ <aside className={rootClassName}>
62
+ <header className={classes.header}>
63
+ <NavHeader
64
+ isTopLevel={isTopLevel}
65
+ onBack={handleBack}
66
+ view={view}
67
+ />
68
+ </header>
69
+ <div className={bodyClassName}>
70
+ <CategoryTree
71
+ categoryId={categoryId}
72
+ onNavigate={handleClose}
73
+ setCategoryId={setCategoryId}
74
+ updateCategories={catalogActions.updateCategories}
75
+ tabindex={tabindex}
76
+ />
77
+ </div>
78
+ <div className={classes.footer}>
79
+ <div className={classes.switchers}>
80
+ <StoreSwitcher />
81
+ <CurrencySwitcher />
82
+ </div>
83
+ <AuthBar
84
+ disabled={hasModal}
85
+ showMyAccount={showMyAccount}
86
+ showSignIn={showSignIn}
87
+ />
88
+ </div>
89
+ <div className={modalClassName}>{authModal}</div>
90
+ </aside>
91
+ </FocusScope>
92
+ </Portal>
84
93
  );
85
94
  };
86
95
 
@@ -7,7 +7,9 @@ exports[`should render properly 1`] = `
7
7
  onSubmit={[Function]}
8
8
  >
9
9
  <div>
10
- <label>
10
+ <label
11
+ htmlFor="Password"
12
+ >
11
13
  Password
12
14
  </label>
13
15
  <span
@@ -44,7 +46,9 @@ exports[`should render show button if visible is false 1`] = `
44
46
  onSubmit={[Function]}
45
47
  >
46
48
  <div>
47
- <label>
49
+ <label
50
+ htmlFor="Password"
51
+ >
48
52
  Password
49
53
  </label>
50
54
  <span
@@ -121,7 +125,9 @@ exports[`should render toggle button if isToggleButtonHidden is false 1`] = `
121
125
  onSubmit={[Function]}
122
126
  >
123
127
  <div>
124
- <label>
128
+ <label
129
+ htmlFor="Password"
130
+ >
125
131
  Password
126
132
  </label>
127
133
  <span
@@ -40,7 +40,7 @@ const Password = props => {
40
40
  const fieldType = visible ? 'text' : 'password';
41
41
 
42
42
  return (
43
- <Field label={label} classes={{ root: classes.root }}>
43
+ <Field id="Password" label={label} classes={{ root: classes.root }}>
44
44
  <TextInput
45
45
  after={!isToggleButtonHidden && passwordButton}
46
46
  autoComplete={autoComplete}
@@ -137,9 +137,13 @@ const Autocomplete = props => {
137
137
 
138
138
  return (
139
139
  <div data-cy="Autocomplete-root" className={rootClassName}>
140
- <div data-cy="Autocomplete-message" className={classes.message}>
140
+ <label
141
+ id="search_query"
142
+ data-cy="Autocomplete-message"
143
+ className={classes.message}
144
+ >
141
145
  {message}
142
- </div>
146
+ </label>
143
147
  <div className={classes.suggestions}>
144
148
  <Suggestions
145
149
  displayResult={displayResult}
@@ -20,6 +20,7 @@ const SearchField = props => {
20
20
 
21
21
  return (
22
22
  <TextInput
23
+ id="search_query"
23
24
  after={resetButton}
24
25
  before={searchIcon}
25
26
  field="search_query"
@@ -37,6 +37,7 @@ exports[`displays an error message if there is a sign in error 1`] = `
37
37
  >
38
38
  <label
39
39
  className="label"
40
+ htmlFor="email"
40
41
  >
41
42
  Email address
42
43
  </label>
@@ -78,6 +79,7 @@ exports[`displays an error message if there is a sign in error 1`] = `
78
79
  >
79
80
  <label
80
81
  className="label"
82
+ htmlFor="Password"
81
83
  >
82
84
  Password
83
85
  </label>
@@ -96,7 +98,7 @@ exports[`displays an error message if there is a sign in error 1`] = `
96
98
  <input
97
99
  autoComplete="current-password"
98
100
  className="input"
99
- id="password"
101
+ id="Password"
100
102
  name="password"
101
103
  onBlur={[Function]}
102
104
  onChange={[Function]}
@@ -163,6 +165,7 @@ exports[`renders correctly 1`] = `
163
165
  >
164
166
  <label
165
167
  className="label"
168
+ htmlFor="email"
166
169
  >
167
170
  Email address
168
171
  </label>
@@ -204,6 +207,7 @@ exports[`renders correctly 1`] = `
204
207
  >
205
208
  <label
206
209
  className="label"
210
+ htmlFor="Password"
207
211
  >
208
212
  Password
209
213
  </label>
@@ -222,7 +226,7 @@ exports[`renders correctly 1`] = `
222
226
  <input
223
227
  autoComplete="current-password"
224
228
  className="input"
225
- id="password"
229
+ id="Password"
226
230
  name="password"
227
231
  onBlur={[Function]}
228
232
  onChange={[Function]}
@@ -289,6 +293,7 @@ exports[`renders prefilled form with initial values 1`] = `
289
293
  >
290
294
  <label
291
295
  className="label"
296
+ htmlFor="email"
292
297
  >
293
298
  Email address
294
299
  </label>
@@ -330,6 +335,7 @@ exports[`renders prefilled form with initial values 1`] = `
330
335
  >
331
336
  <label
332
337
  className="label"
338
+ htmlFor="Password"
333
339
  >
334
340
  Password
335
341
  </label>
@@ -348,7 +354,7 @@ exports[`renders prefilled form with initial values 1`] = `
348
354
  <input
349
355
  autoComplete="current-password"
350
356
  className="input"
351
- id="password"
357
+ id="Password"
352
358
  name="password"
353
359
  onBlur={[Function]}
354
360
  onChange={[Function]}
@@ -64,12 +64,14 @@ const SignIn = props => {
64
64
  initialValues={initialValues && initialValues}
65
65
  >
66
66
  <Field
67
+ id="email"
67
68
  label={formatMessage({
68
69
  id: 'signIn.emailAddressText',
69
70
  defaultMessage: 'Email address'
70
71
  })}
71
72
  >
72
73
  <TextInput
74
+ id="email"
73
75
  data-cy="SignIn-email"
74
76
  autoComplete="email"
75
77
  field="email"
@@ -80,6 +82,7 @@ const SignIn = props => {
80
82
  <Password
81
83
  data-cy="SignIn-password"
82
84
  fieldName="password"
85
+ id="Password"
83
86
  label={formatMessage({
84
87
  id: 'signIn.passwordText',
85
88
  defaultMessage: 'Password'
@@ -17,7 +17,7 @@
17
17
  /* --venia-global-color-gray-75: 250 250 250; */
18
18
  --venia-global-color-gray-100: 244 245 245;
19
19
  /* --venia-global-color-gray-200: 234 235 235; */
20
- --venia-global-color-gray-300: 223 225 226;
20
+ --venia-global-color-gray-300: 161 151 145;
21
21
  --venia-global-color-gray-400: 181 184 186;
22
22
  --venia-global-color-gray-500: 149 154 157;
23
23
  --venia-global-color-gray-600: 118 123 127;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magento/venia-ui",
3
- "version": "9.5.0-alpha.1",
3
+ "version": "9.6.0-alpha.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -80,10 +80,10 @@
80
80
  "peerDependencies": {
81
81
  "@apollo/client": "~3.5.0",
82
82
  "@magento/babel-preset-peregrine": "~1.2.1",
83
- "@magento/peregrine": "12.5.0-alpha.1",
84
- "@magento/pwa-buildpack": "11.4.0-alpha.1",
83
+ "@magento/peregrine": "12.5.1-alpha.1",
84
+ "@magento/pwa-buildpack": "~11.4.0",
85
85
  "apollo-cache-persist": "~0.1.1",
86
- "braintree-web-drop-in": "~1.16.0",
86
+ "braintree-web-drop-in": "~1.33.3",
87
87
  "graphql": "~15.5.0",
88
88
  "react": "~17.0.1",
89
89
  "react-intl": "~5.20.0",