@sapudex/web-components 2.60.0 → 2.62.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.
- package/cypress/specs/AccordionSpotlight.cy.tsx +43 -2
- package/cypress/specs/Carousel.cy.tsx +134 -0
- package/cypress/specs/CountrySelector.cy.tsx +233 -6
- package/cypress/specs/FilterMenu.cy.tsx +39 -45
- package/cypress/specs/List.cy.tsx +624 -10
- package/cypress/specs/ListItem.cy.tsx +50 -0
- package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +52 -3
- package/cypress/specs/SelectBox.cy.tsx +276 -136
- package/cypress/specs/SelectBoxAccessibility.cy.tsx +3109 -0
- package/cypress/specs/SideNavigation.cy.tsx +509 -0
- package/cypress/specs/Table.cy.tsx +90 -0
- package/cypress/specs/TagGroup.cy.tsx +168 -0
- package/cypress/support/component-imports.instrumented.ts +6 -0
- package/cypress/support/component-imports.src.ts +6 -0
- package/dist/AccordionSpotlight.d.ts +7 -2
- package/dist/AccordionSpotlight.js +31 -6
- package/dist/AccordionSpotlight.js.map +1 -1
- package/dist/AccordionSpotlightItem.d.ts +3 -1
- package/dist/AccordionSpotlightItem.js +3 -1
- package/dist/AccordionSpotlightItem.js.map +1 -1
- package/dist/Carousel.d.ts +2 -0
- package/dist/Carousel.js +35 -4
- package/dist/Carousel.js.map +1 -1
- package/dist/CountrySelector.js +1 -3
- package/dist/CountrySelector.js.map +1 -1
- package/dist/List.d.ts +2 -0
- package/dist/List.js +22 -4
- package/dist/List.js.map +1 -1
- package/dist/ListGroupHeader.js +5 -1
- package/dist/ListGroupHeader.js.map +1 -1
- package/dist/ListGroupHeaderBase.d.ts +2 -0
- package/dist/ListGroupHeaderBase.js +15 -2
- package/dist/ListGroupHeaderBase.js.map +1 -1
- package/dist/ListGroupHeaderTemplate.js +14 -22
- package/dist/ListGroupHeaderTemplate.js.map +1 -1
- package/dist/ListItem.d.ts +1 -2
- package/dist/ListItem.js +14 -12
- package/dist/ListItem.js.map +1 -1
- package/dist/ListItemBase.d.ts +5 -0
- package/dist/ListItemBase.js +11 -1
- package/dist/ListItemBase.js.map +1 -1
- package/dist/ListItemTemplate.js +1 -1
- package/dist/ListItemTemplate.js.map +1 -1
- package/dist/ListSelectAllTemplate.js +1 -1
- package/dist/ListSelectAllTemplate.js.map +1 -1
- package/dist/ListTemplate.js +2 -1
- package/dist/ListTemplate.js.map +1 -1
- package/dist/Pagination.d.ts +0 -1
- package/dist/Pagination.js +2 -2
- package/dist/Pagination.js.map +1 -1
- package/dist/Search.d.ts +13 -3
- package/dist/Search.js +36 -11
- package/dist/Search.js.map +1 -1
- package/dist/SearchableListBase.d.ts +2 -0
- package/dist/SearchableListBase.js +13 -3
- package/dist/SearchableListBase.js.map +1 -1
- package/dist/SearchableListBaseTemplate.js +42 -34
- package/dist/SearchableListBaseTemplate.js.map +1 -1
- package/dist/SecondaryNavigation.d.ts +2 -1
- package/dist/SecondaryNavigation.js.map +1 -1
- package/dist/SecondaryNavigationItem.js +12 -6
- package/dist/SecondaryNavigationItem.js.map +1 -1
- package/dist/SecondaryNavigationTemplate.js +1 -2
- package/dist/SecondaryNavigationTemplate.js.map +1 -1
- package/dist/SelectBase.d.ts +18 -33
- package/dist/SelectBase.js +125 -140
- package/dist/SelectBase.js.map +1 -1
- package/dist/SelectBox.d.ts +3 -0
- package/dist/SelectBox.js +19 -7
- package/dist/SelectBox.js.map +1 -1
- package/dist/SelectBoxTemplate.js +3 -3
- package/dist/SelectBoxTemplate.js.map +1 -1
- package/dist/SideNavigation.d.ts +23 -0
- package/dist/SideNavigation.js +39 -0
- package/dist/SideNavigation.js.map +1 -1
- package/dist/SideNavigationItem.d.ts +10 -0
- package/dist/SideNavigationItem.js +69 -0
- package/dist/SideNavigationItem.js.map +1 -1
- package/dist/SideNavigationItemTemplate.d.ts +2 -0
- package/dist/SideNavigationItemTemplate.js +15 -0
- package/dist/SideNavigationItemTemplate.js.map +1 -0
- package/dist/SideNavigationMobile.js +1 -2
- package/dist/SideNavigationMobile.js.map +1 -1
- package/dist/SideNavigationMobileTemplate.js +1 -1
- package/dist/SideNavigationMobileTemplate.js.map +1 -1
- package/dist/SideNavigationSubItem.d.ts +23 -0
- package/dist/SideNavigationSubItem.js +105 -1
- package/dist/SideNavigationSubItem.js.map +1 -1
- package/dist/SideNavigationSubItemTemplate.d.ts +2 -0
- package/dist/SideNavigationSubItemTemplate.js +9 -0
- package/dist/SideNavigationSubItemTemplate.js.map +1 -0
- package/dist/Table.js +1 -1
- package/dist/Table.js.map +1 -1
- package/dist/TableCell.d.ts +8 -2
- package/dist/TableCell.js +13 -11
- package/dist/TableCell.js.map +1 -1
- package/dist/TableCellBase.d.ts +2 -1
- package/dist/TableCellBase.js +9 -0
- package/dist/TableCellBase.js.map +1 -1
- package/dist/TableHeaderCell.d.ts +0 -1
- package/dist/TableHeaderCell.js +0 -4
- package/dist/TableHeaderCell.js.map +1 -1
- package/dist/TableRow.d.ts +10 -0
- package/dist/TableRow.js +23 -0
- package/dist/TableRow.js.map +1 -1
- package/dist/TagGroup.d.ts +3 -0
- package/dist/TagGroup.js +31 -0
- package/dist/TagGroup.js.map +1 -1
- package/dist/TagGroupTemplate.js +1 -1
- package/dist/TagGroupTemplate.js.map +1 -1
- package/dist/UploadItem.js +3 -4
- package/dist/UploadItem.js.map +1 -1
- package/dist/assets/{InputSuggestions-DyNcKgip.js → InputSuggestions-BPKrPqPb.js} +1 -1
- package/dist/assets/{ListItemStandardExpandableTextTemplate-qdKPzaOQ.js → ListItemStandardExpandableTextTemplate-DkdOcCxC.js} +1 -1
- package/dist/assets/{bundle.esm-sUYwSJOp.js → bundle.esm-17Yt5gDr.js} +234 -235
- package/dist/css/themes/AccordionSpotlight.css +1 -1
- package/dist/css/themes/Contact.css +1 -1
- package/dist/css/themes/EventRibbon.css +1 -1
- package/dist/css/themes/Feed.css +1 -1
- package/dist/css/themes/HeroBanner.css +1 -1
- package/dist/css/themes/ImageGridCloud.css +1 -1
- package/dist/css/themes/ImageGridTicker.css +1 -1
- package/dist/css/themes/ImageGridTickerItem.css +1 -1
- package/dist/css/themes/LinkList.css +1 -1
- package/dist/css/themes/ListGroupHeader.css +1 -1
- package/dist/css/themes/MastheadCountrySelector.css +1 -1
- package/dist/css/themes/MastheadItem.css +1 -1
- package/dist/css/themes/MastheadMenu.css +1 -1
- package/dist/css/themes/MastheadMenuItem.css +1 -1
- package/dist/css/themes/MastheadMobileMenu.css +1 -1
- package/dist/css/themes/MastheadProfileMenu.css +1 -1
- package/dist/css/themes/MastheadShell.css +1 -1
- package/dist/css/themes/MessageStrip.css +1 -1
- package/dist/css/themes/Modal.css +1 -1
- package/dist/css/themes/PromoTile.css +1 -1
- package/dist/css/themes/Quote.css +1 -1
- package/dist/css/themes/Review.css +1 -1
- package/dist/css/themes/ReviewItem.css +1 -1
- package/dist/css/themes/SecondaryNavigation.css +1 -1
- package/dist/css/themes/SecondaryNavigationItem.css +1 -1
- package/dist/css/themes/SelectBase.css +1 -1
- package/dist/css/themes/SideNavigation.css +1 -1
- package/dist/css/themes/SideNavigationItem.css +1 -1
- package/dist/css/themes/SideNavigationMobile.css +1 -1
- package/dist/css/themes/SideNavigationSubItem.css +1 -1
- package/dist/css/themes/TabNavigation.css +1 -1
- package/dist/css/themes/Table.css +1 -1
- package/dist/css/themes/TableCellBase.css +1 -1
- package/dist/css/themes/Upload.css +1 -1
- package/dist/css/themes/UploadItem.css +1 -1
- package/dist/custom-elements-internal.json +162 -19
- package/dist/custom-elements.json +151 -26
- package/dist/generated/i18n/i18n-defaults.d.ts +2 -1
- package/dist/generated/i18n/i18n-defaults.js +2 -1
- package/dist/generated/i18n/i18n-defaults.js.map +1 -1
- package/dist/generated/themes/AccordionSpotlight.css.d.ts +1 -1
- package/dist/generated/themes/AccordionSpotlight.css.js +1 -1
- package/dist/generated/themes/AccordionSpotlight.css.js.map +1 -1
- package/dist/generated/themes/Contact.css.d.ts +1 -1
- package/dist/generated/themes/Contact.css.js +1 -1
- package/dist/generated/themes/Contact.css.js.map +1 -1
- package/dist/generated/themes/EventRibbon.css.d.ts +1 -1
- package/dist/generated/themes/EventRibbon.css.js +1 -1
- package/dist/generated/themes/EventRibbon.css.js.map +1 -1
- package/dist/generated/themes/Feed.css.d.ts +1 -1
- package/dist/generated/themes/Feed.css.js +1 -1
- package/dist/generated/themes/Feed.css.js.map +1 -1
- package/dist/generated/themes/HeroBanner.css.d.ts +1 -1
- package/dist/generated/themes/HeroBanner.css.js +1 -1
- package/dist/generated/themes/HeroBanner.css.js.map +1 -1
- package/dist/generated/themes/ImageGridCloud.css.d.ts +1 -1
- package/dist/generated/themes/ImageGridCloud.css.js +1 -1
- package/dist/generated/themes/ImageGridCloud.css.js.map +1 -1
- package/dist/generated/themes/ImageGridTicker.css.d.ts +1 -1
- package/dist/generated/themes/ImageGridTicker.css.js +1 -1
- package/dist/generated/themes/ImageGridTicker.css.js.map +1 -1
- package/dist/generated/themes/ImageGridTickerItem.css.d.ts +1 -1
- package/dist/generated/themes/ImageGridTickerItem.css.js +1 -1
- package/dist/generated/themes/ImageGridTickerItem.css.js.map +1 -1
- package/dist/generated/themes/LinkList.css.d.ts +1 -1
- package/dist/generated/themes/LinkList.css.js +1 -1
- package/dist/generated/themes/LinkList.css.js.map +1 -1
- package/dist/generated/themes/ListGroupHeader.css.d.ts +1 -1
- package/dist/generated/themes/ListGroupHeader.css.js +1 -1
- package/dist/generated/themes/ListGroupHeader.css.js.map +1 -1
- package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
- package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
- package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
- package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
- package/dist/generated/themes/MastheadItem.css.js +1 -1
- package/dist/generated/themes/MastheadItem.css.js.map +1 -1
- package/dist/generated/themes/MastheadMenu.css.d.ts +1 -1
- package/dist/generated/themes/MastheadMenu.css.js +1 -1
- package/dist/generated/themes/MastheadMenu.css.js.map +1 -1
- package/dist/generated/themes/MastheadMenuItem.css.d.ts +1 -1
- package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
- package/dist/generated/themes/MastheadMenuItem.css.js.map +1 -1
- package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
- package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
- package/dist/generated/themes/MastheadMobileMenu.css.js.map +1 -1
- package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
- package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
- package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
- package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
- package/dist/generated/themes/MastheadShell.css.js +1 -1
- package/dist/generated/themes/MastheadShell.css.js.map +1 -1
- package/dist/generated/themes/MessageStrip.css.d.ts +1 -1
- package/dist/generated/themes/MessageStrip.css.js +1 -1
- package/dist/generated/themes/MessageStrip.css.js.map +1 -1
- package/dist/generated/themes/Modal.css.d.ts +1 -1
- package/dist/generated/themes/Modal.css.js +1 -1
- package/dist/generated/themes/Modal.css.js.map +1 -1
- package/dist/generated/themes/PromoTile.css.d.ts +1 -1
- package/dist/generated/themes/PromoTile.css.js +1 -1
- package/dist/generated/themes/PromoTile.css.js.map +1 -1
- package/dist/generated/themes/Quote.css.d.ts +1 -1
- package/dist/generated/themes/Quote.css.js +1 -1
- package/dist/generated/themes/Quote.css.js.map +1 -1
- package/dist/generated/themes/Review.css.d.ts +1 -1
- package/dist/generated/themes/Review.css.js +1 -1
- package/dist/generated/themes/Review.css.js.map +1 -1
- package/dist/generated/themes/ReviewItem.css.d.ts +1 -1
- package/dist/generated/themes/ReviewItem.css.js +1 -1
- package/dist/generated/themes/ReviewItem.css.js.map +1 -1
- package/dist/generated/themes/SecondaryNavigation.css.d.ts +1 -1
- package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
- package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
- package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +1 -1
- package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
- package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
- package/dist/generated/themes/SelectBase.css.d.ts +1 -1
- package/dist/generated/themes/SelectBase.css.js +1 -1
- package/dist/generated/themes/SelectBase.css.js.map +1 -1
- package/dist/generated/themes/SideNavigation.css.d.ts +1 -1
- package/dist/generated/themes/SideNavigation.css.js +1 -1
- package/dist/generated/themes/SideNavigation.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationItem.css.d.ts +1 -1
- package/dist/generated/themes/SideNavigationItem.css.js +1 -1
- package/dist/generated/themes/SideNavigationItem.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationMobile.css.d.ts +1 -1
- package/dist/generated/themes/SideNavigationMobile.css.js +1 -1
- package/dist/generated/themes/SideNavigationMobile.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationSubItem.css.d.ts +1 -1
- package/dist/generated/themes/SideNavigationSubItem.css.js +1 -1
- package/dist/generated/themes/SideNavigationSubItem.css.js.map +1 -1
- package/dist/generated/themes/TabNavigation.css.d.ts +1 -1
- package/dist/generated/themes/TabNavigation.css.js +1 -1
- package/dist/generated/themes/TabNavigation.css.js.map +1 -1
- package/dist/generated/themes/Table.css.d.ts +1 -1
- package/dist/generated/themes/Table.css.js +1 -1
- package/dist/generated/themes/Table.css.js.map +1 -1
- package/dist/generated/themes/TableCellBase.css.d.ts +1 -1
- package/dist/generated/themes/TableCellBase.css.js +1 -1
- package/dist/generated/themes/TableCellBase.css.js.map +1 -1
- package/dist/generated/themes/Upload.css.d.ts +1 -1
- package/dist/generated/themes/Upload.css.js +1 -1
- package/dist/generated/themes/Upload.css.js.map +1 -1
- package/dist/generated/themes/UploadItem.css.d.ts +1 -1
- package/dist/generated/themes/UploadItem.css.js +1 -1
- package/dist/generated/themes/UploadItem.css.js.map +1 -1
- package/dist/messagebundle.properties +3 -0
- package/dist/types/Table.d.ts +6 -2
- package/dist/types/Table.js +7 -2
- package/dist/types/Table.js.map +1 -1
- package/dist/vscode.html-custom-data.json +48 -7
- package/dist/web-types.json +88 -14
- package/package.json +1 -1
- package/run-cypress.js +8 -1
- package/src/AccordionSpotlight.ts +35 -6
- package/src/AccordionSpotlightItem.ts +3 -1
- package/src/Carousel.ts +39 -4
- package/src/CountrySelector.ts +1 -3
- package/src/List.ts +21 -4
- package/src/ListGroupHeader.ts +5 -1
- package/src/ListGroupHeaderBase.ts +16 -2
- package/src/ListGroupHeaderTemplate.tsx +29 -47
- package/src/ListItem.ts +14 -13
- package/src/ListItemBase.ts +14 -1
- package/src/ListItemTemplate.tsx +4 -4
- package/src/ListSelectAllTemplate.tsx +10 -8
- package/src/ListTemplate.tsx +14 -10
- package/src/Pagination.ts +2 -3
- package/src/Search.ts +48 -13
- package/src/SearchableListBase.ts +15 -3
- package/src/SearchableListBaseTemplate.tsx +51 -37
- package/src/SecondaryNavigation.ts +2 -1
- package/src/SecondaryNavigationItem.ts +14 -6
- package/src/SecondaryNavigationTemplate.tsx +4 -6
- package/src/SelectBase.ts +131 -145
- package/src/SelectBox.ts +21 -7
- package/src/SelectBoxTemplate.tsx +10 -9
- package/src/SideNavigation.ts +35 -0
- package/src/SideNavigationItem.ts +77 -0
- package/src/SideNavigationItemTemplate.tsx +97 -0
- package/src/SideNavigationMobile.ts +1 -2
- package/src/SideNavigationMobileTemplate.tsx +2 -1
- package/src/SideNavigationSubItem.ts +119 -2
- package/src/SideNavigationSubItemTemplate.tsx +57 -0
- package/src/Table.ts +1 -2
- package/src/TableCell.ts +9 -12
- package/src/TableCellBase.ts +10 -1
- package/src/TableHeaderCell.ts +0 -5
- package/src/TableRow.ts +20 -0
- package/src/TagGroup.ts +32 -0
- package/src/TagGroupTemplate.tsx +1 -1
- package/src/UploadItem.ts +3 -5
- package/src/generated/i18n/i18n-defaults.ts +2 -2
- package/src/generated/themes/AccordionSpotlight.css.ts +1 -1
- package/src/generated/themes/Contact.css.ts +1 -1
- package/src/generated/themes/EventRibbon.css.ts +1 -1
- package/src/generated/themes/Feed.css.ts +1 -1
- package/src/generated/themes/HeroBanner.css.ts +1 -1
- package/src/generated/themes/ImageGridCloud.css.ts +1 -1
- package/src/generated/themes/ImageGridTicker.css.ts +1 -1
- package/src/generated/themes/ImageGridTickerItem.css.ts +1 -1
- package/src/generated/themes/LinkList.css.ts +1 -1
- package/src/generated/themes/ListGroupHeader.css.ts +1 -1
- package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
- package/src/generated/themes/MastheadItem.css.ts +1 -1
- package/src/generated/themes/MastheadMenu.css.ts +1 -1
- package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
- package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
- package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
- package/src/generated/themes/MastheadShell.css.ts +1 -1
- package/src/generated/themes/MessageStrip.css.ts +1 -1
- package/src/generated/themes/Modal.css.ts +1 -1
- package/src/generated/themes/PromoTile.css.ts +1 -1
- package/src/generated/themes/Quote.css.ts +1 -1
- package/src/generated/themes/Review.css.ts +1 -1
- package/src/generated/themes/ReviewItem.css.ts +1 -1
- package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
- package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
- package/src/generated/themes/SelectBase.css.ts +1 -1
- package/src/generated/themes/SideNavigation.css.ts +1 -1
- package/src/generated/themes/SideNavigationItem.css.ts +1 -1
- package/src/generated/themes/SideNavigationMobile.css.ts +1 -1
- package/src/generated/themes/SideNavigationSubItem.css.ts +1 -1
- package/src/generated/themes/TabNavigation.css.ts +1 -1
- package/src/generated/themes/Table.css.ts +1 -1
- package/src/generated/themes/TableCellBase.css.ts +1 -1
- package/src/generated/themes/Upload.css.ts +1 -1
- package/src/generated/themes/UploadItem.css.ts +1 -1
- package/src/i18n/messagebundle.properties +3 -0
- package/src/themes/AccordionSpotlight.css +11 -8
- package/src/themes/Contact.css +1 -1
- package/src/themes/EventRibbon.css +4 -4
- package/src/themes/Feed.css +2 -2
- package/src/themes/HeroBanner.css +3 -3
- package/src/themes/ImageGridCloud.css +1 -1
- package/src/themes/ImageGridTicker.css +1 -1
- package/src/themes/ImageGridTickerItem.css +1 -1
- package/src/themes/LinkList.css +4 -4
- package/src/themes/ListGroupHeader.css +2 -43
- package/src/themes/MastheadCountrySelector.css +1 -1
- package/src/themes/MastheadItem.css +4 -4
- package/src/themes/MastheadMenu.css +1 -1
- package/src/themes/MastheadMenuItem.css +1 -1
- package/src/themes/MastheadMobileMenu.css +2 -2
- package/src/themes/MastheadProfileMenu.css +1 -1
- package/src/themes/MastheadShell.css +4 -4
- package/src/themes/MessageStrip.css +7 -2
- package/src/themes/Modal.css +1 -1
- package/src/themes/PromoTile.css +4 -3
- package/src/themes/Quote.css +2 -2
- package/src/themes/Review.css +2 -2
- package/src/themes/ReviewItem.css +2 -2
- package/src/themes/SecondaryNavigation.css +1 -2
- package/src/themes/SecondaryNavigationItem.css +3 -6
- package/src/themes/SelectBase.css +1 -1
- package/src/themes/SideNavigation.css +31 -8
- package/src/themes/SideNavigationItem.css +100 -22
- package/src/themes/SideNavigationMobile.css +65 -20
- package/src/themes/SideNavigationSubItem.css +15 -54
- package/src/themes/TabNavigation.css +2 -2
- package/src/themes/Table.css +7 -2
- package/src/themes/TableCellBase.css +8 -0
- package/src/themes/Upload.css +1 -1
- package/src/themes/UploadItem.css +1 -1
- package/src/types/Table.ts +6 -2
- package/dist/css/themes/SideNavigationMobileDropdown.css +0 -1
- package/dist/generated/themes/SideNavigationMobileDropdown.css.d.ts +0 -2
- package/dist/generated/themes/SideNavigationMobileDropdown.css.js +0 -8
- package/dist/generated/themes/SideNavigationMobileDropdown.css.js.map +0 -1
- package/src/generated/themes/SideNavigationMobileDropdown.css.ts +0 -9
- package/src/themes/SideNavigationMobileDropdown.css +0 -29
package/src/Carousel.ts
CHANGED
|
@@ -219,6 +219,7 @@ class UDExCarousel extends UI5Element {
|
|
|
219
219
|
_autoplayMinTimeBetweenToggle = 250;
|
|
220
220
|
_autoplayManualStop = false;
|
|
221
221
|
_resizeHandler: ResizeObserverCallback;
|
|
222
|
+
_resizeRafHandle: number | null = null;
|
|
222
223
|
|
|
223
224
|
constructor() {
|
|
224
225
|
super();
|
|
@@ -238,6 +239,11 @@ class UDExCarousel extends UI5Element {
|
|
|
238
239
|
onExitDOM(): void {
|
|
239
240
|
ResizeHandler.deregister(this, this._resizeHandler);
|
|
240
241
|
|
|
242
|
+
if (this._resizeRafHandle !== null) {
|
|
243
|
+
cancelAnimationFrame(this._resizeRafHandle);
|
|
244
|
+
this._resizeRafHandle = null;
|
|
245
|
+
}
|
|
246
|
+
|
|
241
247
|
if (this._autoplayInterval) {
|
|
242
248
|
clearInterval(this._autoplayInterval);
|
|
243
249
|
}
|
|
@@ -248,7 +254,17 @@ class UDExCarousel extends UI5Element {
|
|
|
248
254
|
}
|
|
249
255
|
|
|
250
256
|
_onResize(): void {
|
|
251
|
-
this.
|
|
257
|
+
if (this._resizeRafHandle !== null) {
|
|
258
|
+
cancelAnimationFrame(this._resizeRafHandle);
|
|
259
|
+
}
|
|
260
|
+
// Defer until after the inner UI5 carousel has processed its own resize
|
|
261
|
+
// (outer element's ResizeObserver fires before inner element's, so the inner
|
|
262
|
+
// carousel's effectiveItemsPerPage and _currentPageIndex are still stale here)
|
|
263
|
+
this._resizeRafHandle = requestAnimationFrame(() => {
|
|
264
|
+
this._resizeRafHandle = null;
|
|
265
|
+
this._hasManyPages = this._carousel?.hasManyPages ?? false;
|
|
266
|
+
this._calculateDisabledButtonsState();
|
|
267
|
+
});
|
|
252
268
|
}
|
|
253
269
|
|
|
254
270
|
_autoplayLoop = () => {
|
|
@@ -353,8 +369,7 @@ class UDExCarousel extends UI5Element {
|
|
|
353
369
|
return;
|
|
354
370
|
}
|
|
355
371
|
|
|
356
|
-
this.
|
|
357
|
-
this._calculateDisabledButtonsState();
|
|
372
|
+
this._navigateToPage(-1);
|
|
358
373
|
}
|
|
359
374
|
|
|
360
375
|
_nextButtonClick() {
|
|
@@ -362,7 +377,27 @@ class UDExCarousel extends UI5Element {
|
|
|
362
377
|
return;
|
|
363
378
|
}
|
|
364
379
|
|
|
365
|
-
this.
|
|
380
|
+
this._navigateToPage(1);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
_navigateToPage(direction: 1 | -1) {
|
|
384
|
+
const carousel = this._carousel;
|
|
385
|
+
if (!carousel) {
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
let newPageIndex = carousel._currentPageIndex + direction;
|
|
390
|
+
|
|
391
|
+
if (this.cyclic) {
|
|
392
|
+
const lastPageIndex = carousel.items.length - carousel.effectiveItemsPerPage;
|
|
393
|
+
if (newPageIndex > lastPageIndex) {
|
|
394
|
+
newPageIndex = 0;
|
|
395
|
+
} else if (newPageIndex < 0) {
|
|
396
|
+
newPageIndex = carousel.items.length - 1;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
carousel._changePageIndex(newPageIndex);
|
|
366
401
|
this._calculateDisabledButtonsState();
|
|
367
402
|
}
|
|
368
403
|
|
package/src/CountrySelector.ts
CHANGED
|
@@ -154,9 +154,7 @@ class UDExCountrySelector extends UDExSelectBase {
|
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
handleDropdownClose(): void {
|
|
157
|
-
this.
|
|
158
|
-
this._open = false;
|
|
159
|
-
this.fireEventDropdownClose();
|
|
157
|
+
this._finishDropdownClose();
|
|
160
158
|
}
|
|
161
159
|
|
|
162
160
|
handleOutsideClick(): void {
|
package/src/List.ts
CHANGED
|
@@ -174,6 +174,14 @@ class UDExList extends UI5Element {
|
|
|
174
174
|
static i18nBundle: I18nBundle;
|
|
175
175
|
|
|
176
176
|
onBeforeRendering(): void {
|
|
177
|
+
if (this._hasHostAriaRole) {
|
|
178
|
+
const label = this.modeSelected ? this.ariaLabelModeText : this.singleContentAriaLabel;
|
|
179
|
+
if (label) {
|
|
180
|
+
this.setAttribute("aria-label", label);
|
|
181
|
+
} else {
|
|
182
|
+
this.removeAttribute("aria-label");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
177
185
|
this.prepareListItemsMode();
|
|
178
186
|
this._focusHandler.resetMatchingItems();
|
|
179
187
|
this._focusHandler._focusableListItems = this.getKeyboardNavigationItems();
|
|
@@ -495,7 +503,7 @@ class UDExList extends UI5Element {
|
|
|
495
503
|
}
|
|
496
504
|
|
|
497
505
|
prepareListItemsMode(): void {
|
|
498
|
-
const treeMode = this._hasCollapsibleGroups;
|
|
506
|
+
const treeMode = this.modeSelected && this._hasCollapsibleGroups;
|
|
499
507
|
this.getItemsFromList().forEach((item, index) => {
|
|
500
508
|
item.mode = this.mode;
|
|
501
509
|
item.controlled = this.controlled;
|
|
@@ -503,10 +511,14 @@ class UDExList extends UI5Element {
|
|
|
503
511
|
item._icon = this.itemIcon;
|
|
504
512
|
item._tabIndex = this.getTabIndex(index, item);
|
|
505
513
|
if (item.isGroup) {
|
|
506
|
-
//
|
|
507
|
-
//
|
|
508
|
-
if (treeMode) {
|
|
514
|
+
// Track only List-owned upgrades so mode changes can reset them without
|
|
515
|
+
// removing tree semantics supplied by SelectBox/SearchableListBase.
|
|
516
|
+
if (treeMode && !item._treeMode) {
|
|
509
517
|
item._treeMode = true;
|
|
518
|
+
item.setAttribute("_list-managed-tree-mode", "");
|
|
519
|
+
} else if (!treeMode && item.hasAttribute("_list-managed-tree-mode")) {
|
|
520
|
+
item._treeMode = false;
|
|
521
|
+
item.removeAttribute("_list-managed-tree-mode");
|
|
510
522
|
}
|
|
511
523
|
} else if (treeMode) {
|
|
512
524
|
// Set accessibleRole for standalone List tree mode.
|
|
@@ -615,6 +627,11 @@ class UDExList extends UI5Element {
|
|
|
615
627
|
return this._hasCollapsibleGroups ? "tree" : this.accessibleRole;
|
|
616
628
|
}
|
|
617
629
|
|
|
630
|
+
/** @private Whether the list's owning role is already exposed on its host. */
|
|
631
|
+
get _hasHostAriaRole(): boolean {
|
|
632
|
+
return ["tree", "listbox", "list"].includes(this.getAttribute("role") || "");
|
|
633
|
+
}
|
|
634
|
+
|
|
618
635
|
/**
|
|
619
636
|
* Role for SingleContent mode. listbox/option is for selection widgets only;
|
|
620
637
|
* SingleContent is informational so "list"/"listitem" is the correct semantic.
|
package/src/ListGroupHeader.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
import "@ui5/webcomponents-icons/dist/slim-arrow-right.js";
|
|
8
8
|
import UDExListGroupHeaderBase from "./ListGroupHeaderBase.js";
|
|
9
9
|
import ListGroupHeaderTemplate from "./ListGroupHeaderTemplate.js";
|
|
10
|
-
import { UDExListItemSize } from "./types/List.js";
|
|
10
|
+
import { UDExListItemSize, UDExListMode } from "./types/List.js";
|
|
11
11
|
import type { UDExListItemBaseEvents } from "./ListItemBase.js";
|
|
12
12
|
import type UDExListItemBase from "./ListItemBase.js";
|
|
13
13
|
|
|
@@ -85,6 +85,10 @@ class UDExListGroupHeader extends UDExListGroupHeaderBase {
|
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
handleKeyDown(e: KeyboardEvent) {
|
|
88
|
+
if (this.mode === UDExListMode.SingleContent && (isEnter(e) || isSpace(e))) {
|
|
89
|
+
this.handleCollapseIconClick(e);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
88
92
|
if (isLeft(e) && !this.collapsed) {
|
|
89
93
|
this.handleCollapseIconClick(e);
|
|
90
94
|
return;
|
|
@@ -4,6 +4,7 @@ import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
|
|
|
4
4
|
import property from "@ui5/webcomponents-base/dist/decorators/property.js";
|
|
5
5
|
import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
|
|
6
6
|
import UDExListItemBase from "./ListItemBase.js";
|
|
7
|
+
import { UDExListMode } from "./types/List.js";
|
|
7
8
|
|
|
8
9
|
const listGroupHeaderClass: string = "udex-list__group-header";
|
|
9
10
|
|
|
@@ -220,7 +221,14 @@ class UDExListGroupHeaderBase extends UDExListItemBase {
|
|
|
220
221
|
}
|
|
221
222
|
|
|
222
223
|
get isTreeAccessibleRole(): boolean {
|
|
223
|
-
|
|
224
|
+
// Host-owned tree semantics must not depend on the child's rendering order
|
|
225
|
+
// or a subsequent List mode-preparation pass.
|
|
226
|
+
return this._treeMode || (this._useHostAriaRole && this.getAttribute("role") === "treeitem");
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** @private Informational groups outside a host-owned or externally supplied tree. */
|
|
230
|
+
get isSingleContentList(): boolean {
|
|
231
|
+
return this.mode === UDExListMode.SingleContent && !this._treeMode && !this._useHostAriaRole;
|
|
224
232
|
}
|
|
225
233
|
|
|
226
234
|
// FilterMenu real-focus SingleSelect non-collapsible group: its options are
|
|
@@ -263,6 +271,9 @@ class UDExListGroupHeaderBase extends UDExListItemBase {
|
|
|
263
271
|
if (this._useHostAriaRole) {
|
|
264
272
|
return "presentation";
|
|
265
273
|
}
|
|
274
|
+
if (this.isSingleContentList) {
|
|
275
|
+
return "listitem";
|
|
276
|
+
}
|
|
266
277
|
// Tree mode keeps the treeitem/group nesting; per-group-listbox mode moves the
|
|
267
278
|
// single labelled role="listbox" onto the inner options wrapper — the outer div
|
|
268
279
|
// is transparent so screen readers don't announce a redundant "group" around it.
|
|
@@ -273,7 +284,10 @@ class UDExListGroupHeaderBase extends UDExListItemBase {
|
|
|
273
284
|
}
|
|
274
285
|
|
|
275
286
|
get contentRegionRole(): string {
|
|
276
|
-
|
|
287
|
+
if (this.isSingleContentList) {
|
|
288
|
+
return "list";
|
|
289
|
+
}
|
|
290
|
+
return this.isTreeAccessibleRole ? "group" : "region";
|
|
277
291
|
}
|
|
278
292
|
|
|
279
293
|
get nonCollapsibleContainerRole(): string {
|
|
@@ -57,6 +57,7 @@ function SingleCollapsibleHeaderRow(this: UDExListGroupHeader) {
|
|
|
57
57
|
class="udex-list__header-title"
|
|
58
58
|
{...({ innerHTML: this.label } as object)}>
|
|
59
59
|
</span>
|
|
60
|
+
{this.supportingText && " "}
|
|
60
61
|
{this.supportingText && (
|
|
61
62
|
<span id="group-supporting-text" class={`udex-list__supporting-text ${this.sizeClass}`}>{this.supportingText}</span>
|
|
62
63
|
)}
|
|
@@ -79,48 +80,32 @@ function SingleCollapsibleHeaderRow(this: UDExListGroupHeader) {
|
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
function SingleGroupHeaderCollapsible(this: UDExListGroupHeader) {
|
|
82
|
-
// Conformant WAI-ARIA tree (FilterMenu real focus): nest the child role="group"
|
|
83
|
-
// INSIDE this treeitem so screen readers count children per group natively — no
|
|
84
|
-
// explicit aria-posinset/aria-setsize (which JAWS distrusts). Excludes SelectBox
|
|
85
|
-
// (aria-activedescendant, _useHostAriaRole) and non-tree modes, which keep the flat
|
|
86
|
-
// structure with the content region emitted as a sibling by the template body.
|
|
87
|
-
const nested = this.isTreeAccessibleRole && !this._useHostAriaRole;
|
|
88
83
|
// In aria-activedescendant mode (SelectBox) the HOST element is the treeitem and
|
|
89
84
|
// already carries aria-expanded + the accessible name. This inner div must then be
|
|
90
85
|
// presentational (singleCollapsibleHeaderRole) and must NOT duplicate those states,
|
|
91
86
|
// otherwise it is a second treeitem nested inside the host treeitem with no owning
|
|
92
|
-
// tree/group (axe/SiteImprove aria-required-parent). It
|
|
93
|
-
//
|
|
94
|
-
// focus back to the combobox input — the same focusable, role="presentation" shape
|
|
95
|
-
// the list-item [part=item] divs already use. The real-focus (FilterMenu) path keeps
|
|
87
|
+
// tree/group (axe/SiteImprove aria-required-parent). It has no tab stop in that
|
|
88
|
+
// mode: DOM focus stays on the combobox input. Real-focus (FilterMenu) keeps
|
|
96
89
|
// the treeitem semantics plus controls/labelling on this div.
|
|
97
90
|
const headerAriaAttrs = this._useHostAriaRole ? {} : {
|
|
98
91
|
"aria-expanded": this.expanded,
|
|
99
92
|
"aria-controls": this.ariaControlsId,
|
|
100
93
|
"aria-labelledby": this.collapsibleHeaderLabelledBy,
|
|
94
|
+
// Own the sibling group without including its visible options in this row's label.
|
|
95
|
+
"aria-owns": this.isTreeAccessibleRole ? this.ariaControlsId : undefined,
|
|
101
96
|
};
|
|
102
97
|
return (
|
|
103
98
|
<div
|
|
104
|
-
class={`udex-list__group-content
|
|
99
|
+
class={`udex-list__group-content udex-list__group-header-wrap ${this.sizeClass}`}
|
|
105
100
|
part="group-item"
|
|
106
101
|
id={`${this._id}_group-content__focusable`}
|
|
107
102
|
role={this.singleCollapsibleHeaderRole as AriaRole}
|
|
108
|
-
tabIndex={0}
|
|
103
|
+
tabIndex={this._useHostAriaRole ? undefined : 0}
|
|
104
|
+
onMouseDown={this.handleCollapseIconMouseDown}
|
|
109
105
|
onKeyDown={this.handleKeyDown}
|
|
110
106
|
{...headerAriaAttrs}
|
|
111
107
|
_tab-index={Number(this._effectiveTabIndex)}>
|
|
112
|
-
{
|
|
113
|
-
<>
|
|
114
|
-
<div class="udex-list__group-header-row">
|
|
115
|
-
{SingleCollapsibleHeaderRow.call(this)}
|
|
116
|
-
</div>
|
|
117
|
-
<div id={this.ariaControlsId} role={this.contentRegionRole as AriaRole} class="udex-list__group-list__content">
|
|
118
|
-
<slot></slot>
|
|
119
|
-
</div>
|
|
120
|
-
</>
|
|
121
|
-
) : (
|
|
122
|
-
SingleCollapsibleHeaderRow.call(this)
|
|
123
|
-
)}
|
|
108
|
+
{SingleCollapsibleHeaderRow.call(this)}
|
|
124
109
|
</div>
|
|
125
110
|
);
|
|
126
111
|
}
|
|
@@ -155,6 +140,7 @@ function MultiOrRadioGroupHeader(this: UDExListGroupHeader) {
|
|
|
155
140
|
size={this.size}
|
|
156
141
|
supportingText={this.supportingText}
|
|
157
142
|
accessible-role={this.nonCollapsibleHeaderAccessibleRole}
|
|
143
|
+
_useHostAriaRole={this._useHostAriaRole}
|
|
158
144
|
_additional-class-name={this._additionalClassName}
|
|
159
145
|
_tab-index={Number(this._effectiveTabIndex)}
|
|
160
146
|
_aria-pos-in-set={this._ariaPosInSet}
|
|
@@ -169,12 +155,13 @@ function MultiOrRadioGroupHeaderCollapsible(this: UDExListGroupHeader) {
|
|
|
169
155
|
if (this.isNonActiveHeader) {
|
|
170
156
|
return (
|
|
171
157
|
<header
|
|
172
|
-
role="button"
|
|
158
|
+
role={this._useHostAriaRole ? "presentation" : "button"}
|
|
173
159
|
id="group-heading"
|
|
174
160
|
class="udex-list__inactive-header udex-list__group-header-wrap"
|
|
175
|
-
tabIndex={Number(this._effectiveTabIndex)}
|
|
176
|
-
aria-expanded={this.expanded}
|
|
177
|
-
aria-controls={this.ariaControlsId}
|
|
161
|
+
tabIndex={this._useHostAriaRole ? undefined : Number(this._effectiveTabIndex)}
|
|
162
|
+
aria-expanded={this._useHostAriaRole ? undefined : this.expanded}
|
|
163
|
+
aria-controls={this._useHostAriaRole ? undefined : this.ariaControlsId}
|
|
164
|
+
onMouseDown={this.handleCollapseIconMouseDown}>
|
|
178
165
|
<div class="udex-list__inactive-header-content">
|
|
179
166
|
<span class="udex-list__header-title" {...({ innerHTML: this.label } as object)}></span>
|
|
180
167
|
{this.supportingText && (
|
|
@@ -196,13 +183,13 @@ function MultiOrRadioGroupHeaderCollapsible(this: UDExListGroupHeader) {
|
|
|
196
183
|
</header>
|
|
197
184
|
);
|
|
198
185
|
}
|
|
186
|
+
// Keep this host transparent: aria-expanded/aria-controls would override role="none"
|
|
187
|
+
// and interrupt the inner treeitem's required context. The inner row exposes expanded.
|
|
199
188
|
return (
|
|
200
189
|
<UDExListItem
|
|
201
190
|
id="group-heading"
|
|
202
191
|
part="group-item"
|
|
203
192
|
role="none"
|
|
204
|
-
aria-expanded={this.expanded}
|
|
205
|
-
aria-controls={this.ariaControlsId}
|
|
206
193
|
selected={this.selected}
|
|
207
194
|
indeterminate={this.indeterminate}
|
|
208
195
|
collapsible={this.collapsible}
|
|
@@ -217,6 +204,7 @@ function MultiOrRadioGroupHeaderCollapsible(this: UDExListGroupHeader) {
|
|
|
217
204
|
size={this.size}
|
|
218
205
|
supportingText={this.supportingText}
|
|
219
206
|
accessible-role={this.collapsibleHeaderAccessibleRole}
|
|
207
|
+
_useHostAriaRole={this._useHostAriaRole}
|
|
220
208
|
onAccordionIconClick={this.handleCollapseIconClick as EventListener}
|
|
221
209
|
_additional-class-name={this._additionalClassName}
|
|
222
210
|
_tab-index={Number(this._effectiveTabIndex)}
|
|
@@ -229,16 +217,12 @@ function MultiOrRadioGroupHeaderCollapsible(this: UDExListGroupHeader) {
|
|
|
229
217
|
}
|
|
230
218
|
|
|
231
219
|
export default function ListGroupHeaderTemplate(this: UDExListGroupHeader) {
|
|
232
|
-
// Single-select real-focus tree: SingleGroupHeaderCollapsible now emits the
|
|
233
|
-
// role="group" content region as a CHILD of the treeitem (conformant nesting),
|
|
234
|
-
// so the template body must not also emit it as a sibling.
|
|
235
|
-
const singleSelectNested = this.isTreeAccessibleRole && !this.useListItemHeader && !this._useHostAriaRole;
|
|
236
220
|
return (
|
|
237
221
|
<div
|
|
238
222
|
part="item"
|
|
239
223
|
class="udex-list__group"
|
|
240
224
|
role={this.groupWrapperRole as AriaRole}
|
|
241
|
-
aria-labelledby={(!this.isTreeAccessibleRole && !this.isPerGroupListbox) ? "group-heading" : undefined}>
|
|
225
|
+
aria-labelledby={(!this._useHostAriaRole && !this.isTreeAccessibleRole && !this.isPerGroupListbox) ? "group-heading" : undefined}>
|
|
242
226
|
{this.collapsible ? (
|
|
243
227
|
<div
|
|
244
228
|
class="udex-list__group-list"
|
|
@@ -248,17 +232,15 @@ export default function ListGroupHeaderTemplate(this: UDExListGroupHeader) {
|
|
|
248
232
|
? MultiOrRadioGroupHeaderCollapsible.call(this)
|
|
249
233
|
: SingleGroupHeaderCollapsible.call(this)
|
|
250
234
|
}
|
|
251
|
-
{
|
|
252
|
-
|
|
253
|
-
|
|
235
|
+
<div id={this.ariaControlsId} role={this.contentRegionRole as AriaRole} class="udex-list__group-list__content">
|
|
236
|
+
{this.isTreeAccessibleRole || this.isSingleContentList ? (
|
|
237
|
+
<slot></slot>
|
|
238
|
+
) : (
|
|
239
|
+
<div role="listbox" aria-label="group">
|
|
254
240
|
<slot></slot>
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
</div>
|
|
259
|
-
)}
|
|
260
|
-
</div>
|
|
261
|
-
)}
|
|
241
|
+
</div>
|
|
242
|
+
)}
|
|
243
|
+
</div>
|
|
262
244
|
</div>
|
|
263
245
|
) : (
|
|
264
246
|
<div
|
|
@@ -270,8 +252,8 @@ export default function ListGroupHeaderTemplate(this: UDExListGroupHeader) {
|
|
|
270
252
|
? MultiOrRadioGroupHeader.call(this)
|
|
271
253
|
: SingleGroupHeader.call(this)
|
|
272
254
|
}
|
|
273
|
-
{this.isTreeAccessibleRole ? (
|
|
274
|
-
<div role=
|
|
255
|
+
{this.isTreeAccessibleRole || this.isSingleContentList ? (
|
|
256
|
+
<div role={this.contentRegionRole as AriaRole}>
|
|
275
257
|
<slot></slot>
|
|
276
258
|
</div>
|
|
277
259
|
) : this.isPerGroupListbox ? (
|
package/src/ListItem.ts
CHANGED
|
@@ -21,7 +21,7 @@ import UDExRadioButton from "./RadioButton.js";
|
|
|
21
21
|
import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
|
|
22
22
|
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
23
23
|
import {
|
|
24
|
-
INDETERMINATE, SELECTED, UNSELECTED,
|
|
24
|
+
INDETERMINATE, SELECTED, UNSELECTED,
|
|
25
25
|
} from "./generated/i18n/i18n-defaults.js";
|
|
26
26
|
import translate from "./utils/translate.js";
|
|
27
27
|
|
|
@@ -267,7 +267,10 @@ class UDExListItem extends UDExListItemBase {
|
|
|
267
267
|
document.removeEventListener("mouseup", this.deactivate);
|
|
268
268
|
}
|
|
269
269
|
|
|
270
|
-
handleMouseDown() {
|
|
270
|
+
handleMouseDown(e: MouseEvent) {
|
|
271
|
+
if (this._useHostAriaRole) {
|
|
272
|
+
e.preventDefault();
|
|
273
|
+
}
|
|
271
274
|
this.activate();
|
|
272
275
|
}
|
|
273
276
|
|
|
@@ -276,6 +279,10 @@ class UDExListItem extends UDExListItemBase {
|
|
|
276
279
|
}
|
|
277
280
|
|
|
278
281
|
handleKeyUp(e: KeyboardEvent) {
|
|
282
|
+
// Space activates a native button on keyup; the row must not cancel it.
|
|
283
|
+
if (this.firstIconElement === e.target || this.secondIconElement === e.target || (e.target as HTMLElement).classList.contains("udex-list__group-heading__icon")) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
279
286
|
e.preventDefault();
|
|
280
287
|
if (isSpace(e) || isEnter(e)) {
|
|
281
288
|
this.deactivate();
|
|
@@ -372,7 +379,8 @@ class UDExListItem extends UDExListItemBase {
|
|
|
372
379
|
if (this._useHostAriaRole) {
|
|
373
380
|
return "presentation";
|
|
374
381
|
}
|
|
375
|
-
|
|
382
|
+
// Removing the reflected attribute can reset the property to null.
|
|
383
|
+
if (this.accessibleRole) {
|
|
376
384
|
return this.accessibleRole;
|
|
377
385
|
}
|
|
378
386
|
// SingleContent is informational (not a selection widget) — listitem is semantically correct
|
|
@@ -380,11 +388,11 @@ class UDExListItem extends UDExListItemBase {
|
|
|
380
388
|
}
|
|
381
389
|
|
|
382
390
|
get effectiveRole(): string {
|
|
383
|
-
return this.accessibleRole
|
|
391
|
+
return this.accessibleRole || listItemRole;
|
|
384
392
|
}
|
|
385
393
|
|
|
386
394
|
get ariaCheckedValue(): "true" | "false" | "mixed" | undefined {
|
|
387
|
-
if (this.
|
|
395
|
+
if (this.roleItem !== "treeitem") {
|
|
388
396
|
return undefined;
|
|
389
397
|
}
|
|
390
398
|
// Only MultiSelect treeitems expose aria-checked; SingleSelect uses aria-selected.
|
|
@@ -424,7 +432,7 @@ class UDExListItem extends UDExListItemBase {
|
|
|
424
432
|
// actually expand/collapse. Non-collapsible group headers must NOT report an
|
|
425
433
|
// expanded/collapsed state (nothing to toggle); the tree hierarchy is conveyed
|
|
426
434
|
// structurally by the nested role="group", not by aria-expanded.
|
|
427
|
-
if (!this.collapsible) {
|
|
435
|
+
if (this._useHostAriaRole || !this.collapsible) {
|
|
428
436
|
return undefined;
|
|
429
437
|
}
|
|
430
438
|
return this.expanded ? "true" : "false";
|
|
@@ -460,13 +468,6 @@ class UDExListItem extends UDExListItemBase {
|
|
|
460
468
|
}
|
|
461
469
|
return `${this.selected ? translate(UDExListItem, SELECTED) : translate(UDExListItem, UNSELECTED)} `;
|
|
462
470
|
}
|
|
463
|
-
|
|
464
|
-
get ratingAriaLabel(): string {
|
|
465
|
-
const ratingText = this.ratingCount ? `${translate(UDExListItem, RATING_COUNT_TITLE)} ${this.ratingCount}` : "";
|
|
466
|
-
const totalText = this.totalCount ? `${translate(UDExListItem, TOTAL)} ${this.totalCount}` : "";
|
|
467
|
-
const ratingTitleText = translate(UDExListItem, RATING_INDICATOR_TEXT);
|
|
468
|
-
return [...[ratingText, totalText].filter(Boolean), `${ratingTitleText} ${this.rating} of ${this.ratingMax}`].join(", ");
|
|
469
|
-
}
|
|
470
471
|
}
|
|
471
472
|
|
|
472
473
|
UDExListItem.define();
|
package/src/ListItemBase.ts
CHANGED
|
@@ -8,7 +8,9 @@ import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.j
|
|
|
8
8
|
import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
|
|
9
9
|
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
10
10
|
import translate from "./utils/translate.js";
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
COLLAPSE, EXPAND, RATING_COUNT_TITLE, RATING_INDICATOR_TEXT, TOTAL,
|
|
13
|
+
} from "./generated/i18n/i18n-defaults.js";
|
|
12
14
|
|
|
13
15
|
export type UDExListItemBaseEvents = {
|
|
14
16
|
"first-icon-click": UDExListItemBaseEventDetail,
|
|
@@ -407,6 +409,17 @@ class UDExListItemBase extends UI5Element {
|
|
|
407
409
|
get hasRating(): boolean {
|
|
408
410
|
return !!this.rating;
|
|
409
411
|
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Shared rating description for rendered options and their source items.
|
|
415
|
+
* @private
|
|
416
|
+
*/
|
|
417
|
+
get ratingAriaLabel(): string {
|
|
418
|
+
const ratingText = this.ratingCount ? `${translate(UDExListItemBase, RATING_COUNT_TITLE)} ${this.ratingCount}` : "";
|
|
419
|
+
const totalText = this.totalCount ? `${translate(UDExListItemBase, TOTAL)} ${this.totalCount}` : "";
|
|
420
|
+
const ratingTitleText = translate(UDExListItemBase, RATING_INDICATOR_TEXT);
|
|
421
|
+
return [...[ratingText, totalText].filter(Boolean), `${ratingTitleText} ${this.rating} of ${this.ratingMax}`].join(", ");
|
|
422
|
+
}
|
|
410
423
|
}
|
|
411
424
|
|
|
412
425
|
export default UDExListItemBase;
|
package/src/ListItemTemplate.tsx
CHANGED
|
@@ -136,8 +136,8 @@ export default function ListItemTemplate(this: UDExListItem) {
|
|
|
136
136
|
{this.modeSelected && (
|
|
137
137
|
<div
|
|
138
138
|
part="item"
|
|
139
|
-
tabIndex={Number(this._effectiveTabIndex)}
|
|
140
|
-
aria-disabled={this._ariaDisabled}
|
|
139
|
+
tabIndex={this._useHostAriaRole ? undefined : Number(this._effectiveTabIndex)}
|
|
140
|
+
aria-disabled={this._useHostAriaRole ? undefined : this._ariaDisabled}
|
|
141
141
|
class={this.className}
|
|
142
142
|
role={this.roleItem as AriaRole}
|
|
143
143
|
aria-checked={this.ariaCheckedValue}
|
|
@@ -160,7 +160,7 @@ export default function ListItemTemplate(this: UDExListItem) {
|
|
|
160
160
|
part="checkbox"
|
|
161
161
|
tabindex={-1}
|
|
162
162
|
indeterminate={this.indeterminate}
|
|
163
|
-
accessible-name={`checkbox ${this.stateAccessibleName}`}
|
|
163
|
+
accessible-name={this._useHostAriaRole ? undefined : `checkbox ${this.stateAccessibleName}`}
|
|
164
164
|
checked={this.selected}
|
|
165
165
|
disabled={this.disabled}
|
|
166
166
|
aria-hidden="true"
|
|
@@ -183,7 +183,7 @@ export default function ListItemTemplate(this: UDExListItem) {
|
|
|
183
183
|
<div
|
|
184
184
|
part="item"
|
|
185
185
|
role={this.roleItem as AriaRole}
|
|
186
|
-
aria-selected={this.
|
|
186
|
+
aria-selected={this.ariaSelectedValue}
|
|
187
187
|
class={this.className}>
|
|
188
188
|
{ContentList.call(this)}
|
|
189
189
|
</div>
|
|
@@ -6,22 +6,24 @@ export default function ListSelectAllTemplate(this: UDExListSelectAll) {
|
|
|
6
6
|
<div
|
|
7
7
|
part="item"
|
|
8
8
|
class="udex-list__group"
|
|
9
|
-
role="group"
|
|
10
|
-
aria-labelledby="group-select-all">
|
|
9
|
+
role={this._useHostAriaRole ? "presentation" : "group"}
|
|
10
|
+
aria-labelledby={this._useHostAriaRole ? undefined : "group-select-all"}>
|
|
11
11
|
<div
|
|
12
|
-
role="listbox"
|
|
13
|
-
aria-label="select-all-group"
|
|
12
|
+
role={this._useHostAriaRole ? "presentation" : "listbox"}
|
|
13
|
+
aria-label={this._useHostAriaRole ? undefined : "select-all-group"}
|
|
14
14
|
class={this.groupListClassName}
|
|
15
15
|
onui5-item-press={this.handleSelectAllGroupItemsPress}>
|
|
16
16
|
<UDExListItem
|
|
17
|
-
role="group"
|
|
17
|
+
role={this._useHostAriaRole ? "none" : "group"}
|
|
18
18
|
part="group-item"
|
|
19
19
|
accessible-role="option"
|
|
20
|
+
_useHostAriaRole={this._useHostAriaRole}
|
|
21
|
+
label={this._useHostAriaRole ? this.selectAllLabel : undefined}
|
|
20
22
|
mode={this.multiselectMode}
|
|
21
23
|
onClick={this.handleSelectAllPress}
|
|
22
24
|
class={this.className}
|
|
23
25
|
selected={this.selected}
|
|
24
|
-
aria-current={this.selected}
|
|
26
|
+
aria-current={this._useHostAriaRole ? undefined : this.selected}
|
|
25
27
|
indeterminate={this.indeterminate}
|
|
26
28
|
controlled={this.controlled}
|
|
27
29
|
onKeyDown={this.handleKeyDownPress}
|
|
@@ -29,9 +31,9 @@ export default function ListSelectAllTemplate(this: UDExListSelectAll) {
|
|
|
29
31
|
_additional-class-name={this.additionalClassName}
|
|
30
32
|
supportingText={this.supportingText}
|
|
31
33
|
divider>
|
|
32
|
-
{this.selectAllLabel}
|
|
34
|
+
{!this._useHostAriaRole && this.selectAllLabel}
|
|
33
35
|
</UDExListItem>
|
|
34
|
-
<slot></slot>
|
|
36
|
+
{this._useHostAriaRole ? <div role="group"><slot></slot></div> : <slot></slot>}
|
|
35
37
|
</div>
|
|
36
38
|
</div>
|
|
37
39
|
);
|
package/src/ListTemplate.tsx
CHANGED
|
@@ -2,6 +2,8 @@ import type UDExList from "./List.js";
|
|
|
2
2
|
import type { AriaRole } from "@ui5/webcomponents-base/types.js";
|
|
3
3
|
|
|
4
4
|
export default function ListTemplate(this: UDExList) {
|
|
5
|
+
const hasHostAriaRole = this._hasHostAriaRole;
|
|
6
|
+
|
|
5
7
|
return (
|
|
6
8
|
<>
|
|
7
9
|
{this.modeSelected && (
|
|
@@ -13,16 +15,18 @@ export default function ListTemplate(this: UDExList) {
|
|
|
13
15
|
onui5-header-press={this.handleItemPress}>
|
|
14
16
|
<div class="udex-list__scroll-container">
|
|
15
17
|
{HeaderText.call(this)}
|
|
16
|
-
|
|
17
|
-
{this.
|
|
18
|
-
|
|
18
|
+
{!hasHostAriaRole && (
|
|
19
|
+
<span id={this.ariaLabelledBy} class="udex-list__hidden-text">
|
|
20
|
+
{this.ariaLabelModeText}
|
|
21
|
+
</span>
|
|
22
|
+
)}
|
|
19
23
|
<div
|
|
20
24
|
id="udex-list"
|
|
21
25
|
class="udex-list"
|
|
22
|
-
role={this.effectiveAccessibleRole as AriaRole}
|
|
23
|
-
aria-labelledby={this.ariaLabelledBy}
|
|
24
|
-
aria-multiselectable={this._listAriaMultiSelectable as "true" | undefined}
|
|
25
|
-
aria-busy={(this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
|
|
26
|
+
role={(hasHostAriaRole ? "none" : this.effectiveAccessibleRole) as AriaRole}
|
|
27
|
+
aria-labelledby={hasHostAriaRole ? undefined : this.ariaLabelledBy}
|
|
28
|
+
aria-multiselectable={(hasHostAriaRole ? undefined : this._listAriaMultiSelectable) as "true" | undefined}
|
|
29
|
+
aria-busy={(hasHostAriaRole ? undefined : this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
|
|
26
30
|
<slot></slot>
|
|
27
31
|
</div>
|
|
28
32
|
</div>
|
|
@@ -34,9 +38,9 @@ export default function ListTemplate(this: UDExList) {
|
|
|
34
38
|
<div
|
|
35
39
|
id="udex-list"
|
|
36
40
|
class="udex-list"
|
|
37
|
-
role={this.singleContentRole as AriaRole}
|
|
38
|
-
aria-label={this.singleContentAriaLabel}
|
|
39
|
-
aria-busy={(this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
|
|
41
|
+
role={(hasHostAriaRole ? "none" : this.singleContentRole) as AriaRole}
|
|
42
|
+
aria-label={hasHostAriaRole ? undefined : this.singleContentAriaLabel}
|
|
43
|
+
aria-busy={(hasHostAriaRole ? undefined : this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
|
|
40
44
|
<slot></slot>
|
|
41
45
|
</div>
|
|
42
46
|
</>
|
package/src/Pagination.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
} from "./generated/i18n/i18n-defaults.js";
|
|
19
19
|
import Button from "./Button.js";
|
|
20
20
|
import translate from "./utils/translate.js";
|
|
21
|
+
import { BreakpointUtils } from "./utils/Breakpoints.js";
|
|
21
22
|
|
|
22
23
|
// Template
|
|
23
24
|
import PaginationTemplate from "./PaginationTemplate.js";
|
|
@@ -149,8 +150,6 @@ class UDExPagination extends UI5Element {
|
|
|
149
150
|
@i18n("@sapudex/web-components")
|
|
150
151
|
static i18nBundle: I18nBundle;
|
|
151
152
|
|
|
152
|
-
static readonly AUTO_DISPLAY_BREAKPOINT = 980;
|
|
153
|
-
|
|
154
153
|
_pages: Page[];
|
|
155
154
|
_visiblePages: Page[];
|
|
156
155
|
|
|
@@ -200,7 +199,7 @@ class UDExPagination extends UI5Element {
|
|
|
200
199
|
}
|
|
201
200
|
|
|
202
201
|
get _displayType(): `${UDExDisplayType}` {
|
|
203
|
-
return
|
|
202
|
+
return BreakpointUtils.isAbove("M")
|
|
204
203
|
? UDExDisplayType.desktop
|
|
205
204
|
: UDExDisplayType.mobile;
|
|
206
205
|
}
|