@sapudex/web-components 2.63.0 → 2.63.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 (52) hide show
  1. package/cypress/specs/FilterMenu.cy.tsx +43 -22
  2. package/cypress/specs/FilterMenuAccessibility.cy.tsx +1017 -0
  3. package/cypress/specs/ListItem.cy.tsx +234 -6
  4. package/cypress/specs/SelectBox.cy.tsx +7 -2
  5. package/cypress/specs/SelectBoxAccessibility.cy.tsx +5 -5
  6. package/dist/FilterMenu.d.ts +2 -2
  7. package/dist/FilterMenu.js +6 -4
  8. package/dist/FilterMenu.js.map +1 -1
  9. package/dist/FilterMenuTemplate.js +2 -2
  10. package/dist/FilterMenuTemplate.js.map +1 -1
  11. package/dist/List.d.ts +1 -8
  12. package/dist/List.js +4 -12
  13. package/dist/List.js.map +1 -1
  14. package/dist/ListGroupHeaderTemplate.js +8 -7
  15. package/dist/ListGroupHeaderTemplate.js.map +1 -1
  16. package/dist/ListItem.js +12 -1
  17. package/dist/ListItem.js.map +1 -1
  18. package/dist/ListItemBase.d.ts +5 -0
  19. package/dist/ListItemBase.js +3 -0
  20. package/dist/ListItemBase.js.map +1 -1
  21. package/dist/ListItemTemplate.js +2 -2
  22. package/dist/ListItemTemplate.js.map +1 -1
  23. package/dist/ListSelectAllTemplate.js +1 -1
  24. package/dist/ListSelectAllTemplate.js.map +1 -1
  25. package/dist/SearchableListBaseTemplate.js +7 -9
  26. package/dist/SearchableListBaseTemplate.js.map +1 -1
  27. package/dist/assets/{InputSuggestions-6S5UueXO.js → InputSuggestions-DSPGFWZq.js} +1 -1
  28. package/dist/assets/{ListItemStandardExpandableTextTemplate-OidrwM_d.js → ListItemStandardExpandableTextTemplate-hSNo3Xyr.js} +1 -1
  29. package/dist/assets/{bundle.esm-DaFsZANO.js → bundle.esm-qSu0eWiH.js} +21 -21
  30. package/dist/css/themes/MastheadShell.css +1 -1
  31. package/dist/css/themes/PromoTile.css +1 -1
  32. package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
  33. package/dist/generated/themes/MastheadShell.css.js +1 -1
  34. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  35. package/dist/generated/themes/PromoTile.css.d.ts +1 -1
  36. package/dist/generated/themes/PromoTile.css.js +1 -1
  37. package/dist/generated/themes/PromoTile.css.js.map +1 -1
  38. package/dist/web-types.json +1 -1
  39. package/package.json +1 -1
  40. package/src/FilterMenu.ts +6 -4
  41. package/src/FilterMenuTemplate.tsx +12 -8
  42. package/src/List.ts +4 -12
  43. package/src/ListGroupHeaderTemplate.tsx +9 -3
  44. package/src/ListItem.ts +12 -1
  45. package/src/ListItemBase.ts +7 -0
  46. package/src/ListItemTemplate.tsx +6 -1
  47. package/src/ListSelectAllTemplate.tsx +11 -12
  48. package/src/SearchableListBaseTemplate.tsx +9 -9
  49. package/src/generated/themes/MastheadShell.css.ts +1 -1
  50. package/src/generated/themes/PromoTile.css.ts +1 -1
  51. package/src/themes/MastheadShell.css +1 -1
  52. package/src/themes/PromoTile.css +5 -0
@@ -748,10 +748,12 @@ describe("Filter Menu component", () => {
748
748
  cy.get("@triggerBtn").click();
749
749
  });
750
750
 
751
+ // Updated: Select All supplies the native ListItem label, not slotted text on its host.
751
752
  it("render the correct label for the header", () => {
752
753
  cy.get("[udex-filter-menu]")
753
754
  .shadow().find("udex-list-select-all")
754
- .shadow().find("udex-list-item").should("have.text", "Select All");
755
+ .shadow().find("udex-list-item")
756
+ .shadow().find('[part="title"]').should("have.text", "Select All");
755
757
  });
756
758
 
757
759
  it("select all header focus on pressed letter", () => {
@@ -2404,48 +2406,67 @@ describe("Filter Menu component", () => {
2404
2406
  });
2405
2407
  });
2406
2408
 
2407
- // Added: regression for FilterMenu.isTreeStructure Select-All exclusion.
2408
- // A "Select All" header (UDExFilterMenuSelectAll) extends UDExListGroupHeaderBase
2409
- // whose `isGroup` getter is true, so a MultiSelect FilterMenu with ONLY a Select All
2410
- // header (and no real UDExFilterMenuGroupHeader) previously entered tree mode by
2411
- // mistake — rendering role="tree"/role="treeitem"/aria-multiselectable. That is
2412
- // semantically wrong (a Select All affordance is a bulk-select control over a flat
2413
- // list, not a hierarchical group) and it broke the footer Tab-order focus tests.
2414
- // isTreeStructure now excludes Select All headers (isSelectAllHeader === true) when
2415
- // detecting groups, so this configuration stays a flat listbox.
2416
- describe("Regression: MultiSelect + Select All header (no real group) does NOT get tree pattern", () => {
2409
+ // Updated: Select All is a parent with its own root count, not a same-level option
2410
+ // counted among its controlled children. MultiSelect now includes it in tree mode.
2411
+ describe("Regression: MultiSelect + Select All header gets a hierarchical real-focus tree", () => {
2417
2412
  beforeEach(() => {
2418
2413
  cy.mount(filterMenuSelectAll);
2419
2414
  cy.get("#filter-menu-select-all").shadow()
2420
2415
  .find(".udex-filter-menu__trigger").click();
2421
2416
  });
2422
2417
 
2423
- it("inner list div has role=\"listbox\", not \"tree\"", () => {
2418
+ // Updated: the native tree replaces the obsolete flat listbox expectation.
2419
+ it("inner list div has role=\"tree\", not \"listbox\"", () => {
2424
2420
  cy.get("#filter-menu-select-all").shadow()
2425
2421
  .find("[udex-list]").shadow()
2426
- .find("#udex-list").should("have.attr", "role", "listbox");
2422
+ .find("#udex-list").should("have.attr", "role", "tree");
2427
2423
  });
2428
2424
 
2429
- it("host [udex-list] has NO aria-multiselectable attribute", () => {
2425
+ // Updated: MultiSelect tree semantics retain a transparent real-focus list host.
2426
+ it("host [udex-list] has aria-multiselectable=\"true\" and role=\"none\"", () => {
2430
2427
  cy.get("#filter-menu-select-all").shadow()
2431
- .find("[udex-list]").should("not.have.attr", "aria-multiselectable");
2428
+ .find("[udex-list]").should($list => {
2429
+ expect($list).to.have.attr("aria-multiselectable", "true");
2430
+ expect($list).to.have.attr("role", "none");
2431
+ });
2432
2432
  });
2433
2433
 
2434
- it("a leaf item's inner [part=item] has role=\"option\", not \"treeitem\"", () => {
2434
+ // Updated: children are level-2 treeitems with their own two-item sibling count.
2435
+ it("a leaf item's inner [part=item] is a level-2 treeitem, 1 of 2 children", () => {
2435
2436
  // The leaf items are slotted light-DOM children of udex-list-select-all;
2436
2437
  // eq(0) is the first leaf (the Select All header's own inner item lives inside
2437
2438
  // the udex-list-select-all shadow, so it is not matched by this light-DOM find).
2438
2439
  cy.get("#filter-menu-select-all").shadow()
2439
2440
  .find(".udex-filter-menu__list")
2440
- .find("udex-list-item").eq(0).shadow()
2441
- .find("[part=item]").should("have.attr", "role", "option");
2441
+ .find("[udex-list-item]").eq(0).shadow()
2442
+ .find("[part=item]").should($row => {
2443
+ expect($row).to.have.attr("role", "treeitem");
2444
+ expect($row).to.have.attr("aria-level", "2");
2445
+ expect($row).to.have.attr("aria-posinset", "1");
2446
+ expect($row).to.have.attr("aria-setsize", "2");
2447
+ });
2442
2448
  });
2443
2449
 
2444
- it("a leaf item's inner [part=item] has NO aria-checked (not a treeitem)", () => {
2450
+ // Updated: native rows alone own checked state; Select All has a separate root count.
2451
+ it("a leaf exposes native aria-checked and its parent becomes mixed without sharing its child count", () => {
2452
+ const UDExLeafRow = () => cy.get("#filter-menu-select-all").shadow()
2453
+ .find(".udex-filter-menu__list").find("[udex-list-item]").eq(0).shadow().find("[part=item]");
2454
+ UDExLeafRow().should($row => {
2455
+ expect($row).to.have.attr("aria-checked", "false");
2456
+ expect($row).not.to.have.attr("aria-selected");
2457
+ });
2458
+ UDExLeafRow().click();
2459
+ UDExLeafRow().should("have.attr", "aria-checked", "true");
2445
2460
  cy.get("#filter-menu-select-all").shadow()
2446
- .find(".udex-filter-menu__list")
2447
- .find("udex-list-item").eq(0).shadow()
2448
- .find("[part=item]").should("not.have.attr", "aria-checked");
2461
+ .find("[udex-list-select-all]").shadow().find('[udex-list-item][part="group-item"]')
2462
+ .shadow().find("[part=item]").should($row => {
2463
+ expect($row).to.have.attr("role", "treeitem");
2464
+ expect($row).to.have.attr("aria-checked", "mixed");
2465
+ expect($row).to.have.attr("aria-level", "1");
2466
+ expect($row).to.have.attr("aria-posinset", "1");
2467
+ expect($row).to.have.attr("aria-setsize", "1");
2468
+ expect($row).not.to.have.attr("aria-selected");
2469
+ });
2449
2470
  });
2450
2471
  });
2451
2472
  });