@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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { UDExTagGroup, UDExTag } from "../support/component-imports.js";
|
|
2
|
+
import type Tokenizer from "@ui5/webcomponents/dist/Tokenizer.js";
|
|
2
3
|
|
|
3
4
|
const defaultTagGroup = <UDExTagGroup>
|
|
4
5
|
<UDExTag text="Default"></UDExTag>
|
|
@@ -106,6 +107,173 @@ describe("TagGroup", () => {
|
|
|
106
107
|
cy.get("[udex-tag-group]").shadow().find("[udex-tooltip]").should("have.attr", "accessible-name", "Hidden tags");
|
|
107
108
|
});
|
|
108
109
|
|
|
110
|
+
describe("Empty tokenizer accessibility", () => {
|
|
111
|
+
const UDExLongTagText = "JavaScript is a lightweight interpreted programming language with a deliberately long selected tag";
|
|
112
|
+
const UDExTagTexts = [UDExLongTagText, "Swift", "React", "Angular", "Django"];
|
|
113
|
+
const UDExTokenizer = () => cy.get("[udex-tag-group]").shadow().find(".udex-tag-group__tokenizer");
|
|
114
|
+
const UDExTokenizerList = () => UDExTokenizer().shadow().find(".ui5-tokenizer--list");
|
|
115
|
+
const UDExMoreButton = () => UDExTokenizer().shadow().find(".ui5-tokenizer-more-text");
|
|
116
|
+
|
|
117
|
+
function UDExMountOverflowTags(UDExTexts = UDExTagTexts) {
|
|
118
|
+
cy.mount(
|
|
119
|
+
<div id="tag-group-overflow-fixture" style="width: 320px;">
|
|
120
|
+
<button id="before-overflow-tags">Previous</button>
|
|
121
|
+
<UDExTagGroup tooltipAccessibleName="Hidden selected languages">
|
|
122
|
+
{UDExTexts.map(UDExText => <UDExTag text={UDExText}></UDExTag>)}
|
|
123
|
+
</UDExTagGroup>
|
|
124
|
+
</div>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function UDExAssertTokenizerList(UDExVisibleCount: number, UDExTotalCount = UDExTagTexts.length) {
|
|
129
|
+
// Retry ownership and semantics together: UI5 computes overflow after rendering.
|
|
130
|
+
UDExTokenizerList().should($list => {
|
|
131
|
+
const UDExAssignedTags = Array.from($list[0].querySelectorAll("slot"))
|
|
132
|
+
.flatMap(UDExSlot => UDExSlot.assignedElements());
|
|
133
|
+
const UDExVisibleTags = UDExAssignedTags.filter(UDExTokenElement => !UDExTokenElement.hasAttribute("overflows"));
|
|
134
|
+
expect(UDExAssignedTags, "all tags remain slotted into the tokenizer list").to.have.length(UDExTotalCount);
|
|
135
|
+
expect(UDExVisibleTags, "visible tags owned through the tokenizer list's slots").to.have.length(UDExVisibleCount);
|
|
136
|
+
expect($list).to.have.attr("role", UDExVisibleCount ? "listbox" : "presentation");
|
|
137
|
+
if (UDExVisibleCount) {
|
|
138
|
+
const UDExTokenizerHost = ($list[0].getRootNode() as ShadowRoot).host as Tokenizer;
|
|
139
|
+
expect($list).to.have.attr("aria-label", UDExTokenizerHost.tokenizerLabel);
|
|
140
|
+
expect(UDExTokenizerHost.tokenizerLabel).not.to.equal("");
|
|
141
|
+
UDExVisibleTags.forEach(UDExTokenElement => {
|
|
142
|
+
expect(UDExTokenElement.shadowRoot?.querySelector('[role="option"]'), "owned tag exposes an option").to.exist;
|
|
143
|
+
});
|
|
144
|
+
} else {
|
|
145
|
+
["aria-label", "aria-description", "aria-disabled", "aria-readonly"].forEach(UDExAttribute => {
|
|
146
|
+
expect($list, `empty list omits ${UDExAttribute}`).not.to.have.attr(UDExAttribute);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
it("makes a tokenizer without tags presentational and removes global ARIA again after a tokenizer-only render", () => {
|
|
153
|
+
cy.mount(<UDExTagGroup></UDExTagGroup>);
|
|
154
|
+
UDExTokenizer().find("[udex-tag]").should("not.exist");
|
|
155
|
+
UDExAssertTokenizerList(0, 0);
|
|
156
|
+
|
|
157
|
+
// These public UI5 properties would otherwise restore the global ARIA attributes.
|
|
158
|
+
UDExTokenizer().invoke("prop", "accessibleName", "Selected languages");
|
|
159
|
+
UDExTokenizer().invoke("prop", "disabled", true);
|
|
160
|
+
UDExTokenizer().then($tokenizer => {
|
|
161
|
+
// jQuery.prop maps "readonly" to native "readOnly", not UI5's property.
|
|
162
|
+
($tokenizer[0] as Tokenizer).readonly = true;
|
|
163
|
+
});
|
|
164
|
+
UDExTokenizer().should("have.attr", "accessible-name", "Selected languages");
|
|
165
|
+
UDExTokenizer().should("have.attr", "disabled");
|
|
166
|
+
UDExTokenizer().should("have.attr", "readonly");
|
|
167
|
+
UDExAssertTokenizerList(0, 0);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("keeps More named and keyboard-operable when all five tags overflow at 320px", () => {
|
|
171
|
+
UDExMountOverflowTags();
|
|
172
|
+
UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
|
|
173
|
+
UDExAssertTokenizerList(0);
|
|
174
|
+
UDExMoreButton().should("be.visible").and("have.attr", "role", "button");
|
|
175
|
+
UDExMoreButton().should($more => {
|
|
176
|
+
expect($more.text()).to.contain("5");
|
|
177
|
+
expect($more[0].closest(".ui5-tokenizer--list"), "More is outside the presentational list").to.equal(null);
|
|
178
|
+
let UDExNode: HTMLElement | null = $more[0];
|
|
179
|
+
while (UDExNode) {
|
|
180
|
+
expect(UDExNode.getAttribute("aria-hidden"), "More has no hidden composed ancestor").not.to.equal("true");
|
|
181
|
+
expect(UDExNode.hasAttribute("hidden") || UDExNode.hasAttribute("inert")).to.equal(false);
|
|
182
|
+
UDExNode = UDExNode.assignedSlot || UDExNode.parentElement
|
|
183
|
+
|| ((UDExNode.getRootNode() as ShadowRoot).host as HTMLElement | undefined) || null;
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
cy.get("#before-overflow-tags").focus();
|
|
188
|
+
cy.realPress("Tab");
|
|
189
|
+
UDExMoreButton().should("be.focused");
|
|
190
|
+
cy.realPress("Enter");
|
|
191
|
+
cy.get("[udex-tag-group]").shadow().find("[udex-tooltip]").should("have.attr", "open");
|
|
192
|
+
cy.get("[udex-tag-group]").shadow().find(".udex-tag-group-tooltip__content [udex-tag]").should("have.length", 5);
|
|
193
|
+
UDExAssertTokenizerList(0);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it("restores the current tokenizer name and owned options on expansion, then removes the empty listbox on collapse", () => {
|
|
197
|
+
UDExMountOverflowTags();
|
|
198
|
+
UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
|
|
199
|
+
UDExAssertTokenizerList(0);
|
|
200
|
+
UDExTokenizer().invoke("prop", "accessibleName", "Selected languages");
|
|
201
|
+
UDExTokenizer().should("have.attr", "accessible-name", "Selected languages");
|
|
202
|
+
UDExAssertTokenizerList(0);
|
|
203
|
+
|
|
204
|
+
cy.get("[udex-tag-group]").invoke("prop", "tokenizerExpanded", true);
|
|
205
|
+
UDExAssertTokenizerList(5);
|
|
206
|
+
UDExTokenizerList().should("have.attr", "aria-label", "Selected languages");
|
|
207
|
+
UDExMoreButton().should("not.exist");
|
|
208
|
+
|
|
209
|
+
cy.get("[udex-tag-group]").invoke("prop", "tokenizerExpanded", false);
|
|
210
|
+
UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
|
|
211
|
+
UDExAssertTokenizerList(0);
|
|
212
|
+
UDExMoreButton().should("be.visible");
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it("retains a named listbox when collapse leaves one visible option and four overflowing tags", () => {
|
|
216
|
+
UDExMountOverflowTags(["Python", UDExLongTagText, "React", "Angular", "Django"]);
|
|
217
|
+
UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 4);
|
|
218
|
+
UDExAssertTokenizerList(1);
|
|
219
|
+
UDExMoreButton().should("be.visible");
|
|
220
|
+
|
|
221
|
+
cy.get("[udex-tag-group]").invoke("prop", "tokenizerExpanded", true);
|
|
222
|
+
UDExAssertTokenizerList(5);
|
|
223
|
+
cy.get("[udex-tag-group]").invoke("prop", "tokenizerExpanded", false);
|
|
224
|
+
UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 4);
|
|
225
|
+
UDExAssertTokenizerList(1);
|
|
226
|
+
UDExMoreButton().should("be.visible");
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it("updates list semantics after real container resizes from all-overflow to visible tags and back", () => {
|
|
230
|
+
cy.viewport(1400, 800);
|
|
231
|
+
UDExMountOverflowTags();
|
|
232
|
+
UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
|
|
233
|
+
UDExAssertTokenizerList(0);
|
|
234
|
+
|
|
235
|
+
cy.get("#tag-group-overflow-fixture").invoke("attr", "style", "width: 1200px;");
|
|
236
|
+
UDExAssertTokenizerList(5);
|
|
237
|
+
UDExMoreButton().should("not.exist");
|
|
238
|
+
|
|
239
|
+
cy.get("#tag-group-overflow-fixture").invoke("attr", "style", "width: 320px;");
|
|
240
|
+
UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
|
|
241
|
+
UDExAssertTokenizerList(0);
|
|
242
|
+
UDExMoreButton().should("be.visible");
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("resumes tokenizer ARIA synchronization after the same TagGroup is detached and reattached", () => {
|
|
246
|
+
let UDExDetachedGroup: HTMLElement & { tokenizerExpanded: boolean };
|
|
247
|
+
UDExMountOverflowTags();
|
|
248
|
+
UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
|
|
249
|
+
UDExAssertTokenizerList(0);
|
|
250
|
+
cy.get("[udex-tag-group]").then($group => {
|
|
251
|
+
UDExDetachedGroup = $group[0] as typeof UDExDetachedGroup;
|
|
252
|
+
UDExDetachedGroup.remove();
|
|
253
|
+
});
|
|
254
|
+
cy.then(() => {
|
|
255
|
+
// The detached node is intentional; do not make it a Cypress DOM subject.
|
|
256
|
+
expect(UDExDetachedGroup.isConnected).to.equal(false);
|
|
257
|
+
UDExDetachedGroup.tokenizerExpanded = true;
|
|
258
|
+
});
|
|
259
|
+
cy.get("#tag-group-overflow-fixture").then($fixture => {
|
|
260
|
+
$fixture[0].append(UDExDetachedGroup);
|
|
261
|
+
});
|
|
262
|
+
cy.get("[udex-tag-group]").should($group => {
|
|
263
|
+
expect($group[0]).to.equal(UDExDetachedGroup);
|
|
264
|
+
expect($group[0].isConnected).to.equal(true);
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
UDExAssertTokenizerList(5);
|
|
268
|
+
UDExTokenizer().invoke("prop", "accessibleName", "Reattached selected languages");
|
|
269
|
+
UDExTokenizerList().should("have.attr", "aria-label", "Reattached selected languages");
|
|
270
|
+
cy.get("[udex-tag-group]").invoke("prop", "tokenizerExpanded", false);
|
|
271
|
+
UDExTokenizer().find("[udex-tag][overflows]").should("have.length", 5);
|
|
272
|
+
UDExAssertTokenizerList(0);
|
|
273
|
+
UDExMoreButton().should("be.visible");
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
|
|
109
277
|
describe("Keyboard focus with hidden tags", () => {
|
|
110
278
|
it("keeps the 'n more' button visible when a visible tag receives focus (overflow case)", () => {
|
|
111
279
|
cy.mount(<div><button id="before">before</button>{defaultTagGroup}</div>);
|
|
@@ -59,6 +59,9 @@ import UDExReview from "../../instrumented/Review.js";
|
|
|
59
59
|
import UDExReviewItem from "../../instrumented/ReviewItem.js";
|
|
60
60
|
import UDExSecondaryNavigation from "../../instrumented/SecondaryNavigation.js";
|
|
61
61
|
import UDExSelectBox from "../../instrumented/SelectBox.js";
|
|
62
|
+
import UDExSideNavigation from "../../instrumented/SideNavigation.js";
|
|
63
|
+
import UDExSideNavigationItem from "../../instrumented/SideNavigationItem.js";
|
|
64
|
+
import UDExSideNavigationSubItem from "../../instrumented/SideNavigationSubItem.js";
|
|
62
65
|
import UDExSelectBoxGroupHeader from "../../instrumented/SelectBoxGroupHeader.js";
|
|
63
66
|
import UDExSelectBoxItem from "../../instrumented/SelectBoxItem.js";
|
|
64
67
|
import UDExSelectBoxSelectAll from "../../instrumented/SelectBoxSelectAll.js";
|
|
@@ -151,6 +154,9 @@ export {
|
|
|
151
154
|
UDExReviewItem,
|
|
152
155
|
UDExSecondaryNavigation,
|
|
153
156
|
UDExSelectBox,
|
|
157
|
+
UDExSideNavigation,
|
|
158
|
+
UDExSideNavigationItem,
|
|
159
|
+
UDExSideNavigationSubItem,
|
|
154
160
|
UDExSelectBoxGroupHeader,
|
|
155
161
|
UDExSelectBoxItem,
|
|
156
162
|
UDExSelectBoxSelectAll,
|
|
@@ -59,6 +59,9 @@ import UDExReview from "../../src/Review.js";
|
|
|
59
59
|
import UDExReviewItem from "../../src/ReviewItem.js";
|
|
60
60
|
import UDExSecondaryNavigation from "../../src/SecondaryNavigation.js";
|
|
61
61
|
import UDExSelectBox from "../../src/SelectBox.js";
|
|
62
|
+
import UDExSideNavigation from "../../src/SideNavigation.js";
|
|
63
|
+
import UDExSideNavigationItem from "../../src/SideNavigationItem.js";
|
|
64
|
+
import UDExSideNavigationSubItem from "../../src/SideNavigationSubItem.js";
|
|
62
65
|
import UDExSelectBoxGroupHeader from "../../src/SelectBoxGroupHeader.js";
|
|
63
66
|
import UDExSelectBoxItem from "../../src/SelectBoxItem.js";
|
|
64
67
|
import UDExSelectBoxSelectAll from "../../src/SelectBoxSelectAll.js";
|
|
@@ -151,6 +154,9 @@ export {
|
|
|
151
154
|
UDExReviewItem,
|
|
152
155
|
UDExSecondaryNavigation,
|
|
153
156
|
UDExSelectBox,
|
|
157
|
+
UDExSideNavigation,
|
|
158
|
+
UDExSideNavigationItem,
|
|
159
|
+
UDExSideNavigationSubItem,
|
|
154
160
|
UDExSelectBoxGroupHeader,
|
|
155
161
|
UDExSelectBoxItem,
|
|
156
162
|
UDExSelectBoxSelectAll,
|
|
@@ -43,8 +43,9 @@ declare class UDExAccordionSpotlight extends UI5Element {
|
|
|
43
43
|
};
|
|
44
44
|
};
|
|
45
45
|
/**
|
|
46
|
-
* The index of the currently expanded item (0-based)
|
|
47
|
-
* Derived from items' <code>selected</code> attribute;
|
|
46
|
+
* The index of the currently expanded item (0-based), or <code>-1</code> when
|
|
47
|
+
* no item is expanded. Derived from items' <code>selected</code> attribute;
|
|
48
|
+
* kept in sync by the parent.
|
|
48
49
|
*
|
|
49
50
|
* @private
|
|
50
51
|
*/
|
|
@@ -105,6 +106,10 @@ declare class UDExAccordionSpotlight extends UI5Element {
|
|
|
105
106
|
/**
|
|
106
107
|
* The slotted AccordionSpotlightItem elements.
|
|
107
108
|
*
|
|
109
|
+
* <code>invalidateOnChildChange</code> lets the component react when an item's
|
|
110
|
+
* <code>selected</code> property is set programmatically, so
|
|
111
|
+
* <code>item.selected = true</code> switches the expanded item at runtime.
|
|
112
|
+
*
|
|
108
113
|
* @public
|
|
109
114
|
*/
|
|
110
115
|
items: DefaultSlot<AccordionSpotlightItem>;
|
|
@@ -59,12 +59,13 @@ let UDExAccordionSpotlight = class UDExAccordionSpotlight extends UI5Element {
|
|
|
59
59
|
constructor() {
|
|
60
60
|
super();
|
|
61
61
|
/**
|
|
62
|
-
* The index of the currently expanded item (0-based)
|
|
63
|
-
* Derived from items' <code>selected</code> attribute;
|
|
62
|
+
* The index of the currently expanded item (0-based), or <code>-1</code> when
|
|
63
|
+
* no item is expanded. Derived from items' <code>selected</code> attribute;
|
|
64
|
+
* kept in sync by the parent.
|
|
64
65
|
*
|
|
65
66
|
* @private
|
|
66
67
|
*/
|
|
67
|
-
this._selectedIndex =
|
|
68
|
+
this._selectedIndex = -1;
|
|
68
69
|
/**
|
|
69
70
|
* Vertical alignment of the navigation sidebar relative to the content panel.
|
|
70
71
|
*
|
|
@@ -158,8 +159,27 @@ let UDExAccordionSpotlight = class UDExAccordionSpotlight extends UI5Element {
|
|
|
158
159
|
if (this.items.length === 0) {
|
|
159
160
|
return;
|
|
160
161
|
}
|
|
161
|
-
const
|
|
162
|
-
|
|
162
|
+
const selectedIndexes = this.items.reduce((acc, item, index) => {
|
|
163
|
+
if (item.selected) {
|
|
164
|
+
acc.push(index);
|
|
165
|
+
}
|
|
166
|
+
return acc;
|
|
167
|
+
}, []);
|
|
168
|
+
// Prefer a selected item that differs from the currently tracked index — it
|
|
169
|
+
// signals a selection requested via `item.selected = true`. Otherwise keep
|
|
170
|
+
// the current index if it is still selected. When no item is selected, leave
|
|
171
|
+
// the component with no active item (-1) rather than forcing the first one.
|
|
172
|
+
let activeIndex;
|
|
173
|
+
const newlySelected = selectedIndexes.find(index => index !== this._selectedIndex);
|
|
174
|
+
if (newlySelected !== undefined) {
|
|
175
|
+
activeIndex = newlySelected;
|
|
176
|
+
}
|
|
177
|
+
else if (selectedIndexes.includes(this._selectedIndex)) {
|
|
178
|
+
activeIndex = this._selectedIndex;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
activeIndex = selectedIndexes[0] ?? -1;
|
|
182
|
+
}
|
|
163
183
|
this._selectedIndex = activeIndex;
|
|
164
184
|
this.items.forEach((item, index) => {
|
|
165
185
|
item.selected = index === activeIndex;
|
|
@@ -254,7 +274,12 @@ __decorate([
|
|
|
254
274
|
property({ type: Boolean, noAttribute: true })
|
|
255
275
|
], UDExAccordionSpotlight.prototype, "_isPaused", void 0);
|
|
256
276
|
__decorate([
|
|
257
|
-
slot({
|
|
277
|
+
slot({
|
|
278
|
+
type: HTMLElement,
|
|
279
|
+
"default": true,
|
|
280
|
+
individualSlots: true,
|
|
281
|
+
invalidateOnChildChange: true,
|
|
282
|
+
})
|
|
258
283
|
], UDExAccordionSpotlight.prototype, "items", void 0);
|
|
259
284
|
__decorate([
|
|
260
285
|
slot({ type: HTMLElement })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccordionSpotlight.js","sourceRoot":"","sources":["../src/AccordionSpotlight.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,UAAU,MAAM,4CAA4C,CAAC;AACpE,OAAO,aAAa,MAAM,0DAA0D,CAAC;AACrF,OAAO,QAAQ,MAAM,qDAAqD,CAAC;AAE3E,OAAO,IAAI,MAAM,wDAAwD,CAAC;AAC1E,OAAO,KAAK,MAAM,yDAAyD,CAAC;AAC5E,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AACnE,OAAO,0BAA0B,MAAM,iCAAiC,CAAC;AACzE,OAAO,sBAAsB,MAAM,6BAA6B,CAAC;AACjE,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,uCAAuC,CAAC;AAC/C,OAAO,wCAAwC,CAAC;AAEhD,OAAO,aAAa,MAAM,wDAAwD,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,SAAS;AACT,OAAO,qBAAqB,MAAM,8CAA8C,CAAC;AAEjF,MAAM,CAAN,IAAY,uCAGX;AAHD,WAAY,uCAAuC;IACjD,sDAAW,CAAA;IACX,4DAAiB,CAAA;AACnB,CAAC,EAHW,uCAAuC,KAAvC,uCAAuC,QAGlD;AAED,MAAM,CAAN,IAAY,+BAGX;AAHD,WAAY,+BAA+B;IACzC,kDAAe,CAAA;IACf,8CAAW,CAAA;AACb,CAAC,EAHW,+BAA+B,KAA/B,+BAA+B,QAG1C;AAED,MAAM,CAAN,IAAY,+BAGX;AAHD,WAAY,+BAA+B;IACzC,sDAAmB,CAAA;IACnB,oDAAiB,CAAA;AACnB,CAAC,EAHW,+BAA+B,KAA/B,+BAA+B,QAG1C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AAiBH,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,UAAU;IAmH7C;QACE,KAAK,EAAE,CAAC;QA/GV;;;;;WAKG;QAED,mBAAc,GAAW,CAAC,CAAC;QAE7B;;;;;WAKG;QAED,sBAAiB,GAAiD,uCAAuC,CAAC,GAAG,CAAC;QAEhH;;;;;WAKG;QAED,cAAS,GAAyC,+BAA+B,CAAC,KAAK,CAAC;QAE1F;;;;;WAKG;QAED,aAAQ,GAAY,KAAK,CAAC;QAE5B;;;;;WAKG;QAED,qBAAgB,GAAW,IAAI,CAAC;QAElC;;;;;WAKG;QAED,aAAQ,GAAW,MAAM,CAAC;QAE5B;;;;;;;;WAQG;QAED,cAAS,GAAyC,+BAA+B,CAAC,OAAO,CAAC;QAE5F;;WAEG;QAED,cAAS,GAAY,KAAK,CAAC;QAE7B;;WAEG;QAED,cAAS,GAAY,KAAK,CAAC;QAoC3B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,UAAU;QACR,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAEtD,IAAI,SAAS,EAAE,EAAE,CAAC;YAChB,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC;YAC3F,IAAI,oBAAoB,EAAE,CAAC;gBACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS;QACP,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACxD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,aAAa;QACX,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,YAAY;QACV,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC;QAElC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACjC,IAAI,CAAC,QAAQ,GAAG,KAAK,KAAK,WAAW,CAAC;YACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC1C,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,CAAC;IACH,CAAC;IAED,YAAY;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,CAAa;QAC9B,MAAM,GAAG,GAAI,CAAC,CAAC,MAAsB,CAAC,OAAO,CAAc,cAAc,CAAC,CAAC;QAC3E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,IAAI,KAAK,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3C,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,SAAS,KAAK,+BAA+B,CAAC,MAAM,CAAC;IACnE,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;IACtD,CAAC;CACF,CAAA;AAzOG;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;8DACjB;AAS3B;IADD,QAAQ,EAAE;iEACqG;AAS9G;IADD,QAAQ,EAAE;yDAC+E;AASxF;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;wDACA;AAS1B;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gEACO;AAShC;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDACC;AAY1B;IADD,QAAQ,EAAE;yDACiF;AAM1F;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;yDAClB;AAM3B;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;yDAClB;AAQ3B;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;qDACtB;AAU5C;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;sDACC;AAW3B;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;qDACA;AA9GxB,sBAAsB;IAhB3B,aAAa,CAAC;QACb,GAAG,EAAE,0BAA0B;QAC/B,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,qBAAqB;QAC7B,QAAQ,EAAE,0BAA0B;QACpC,YAAY,EAAE,CAAC,sBAAsB,EAAE,UAAU,CAAC;KACnD,CAAC;IAEF;;;;;OAKG;;IACF,KAAK,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;GAEjC,sBAAsB,CAqP3B;AAED,sBAAsB,CAAC,MAAM,EAAE,CAAC;AAEhC,eAAe,sBAAsB,CAAC","sourcesContent":["import UI5Element from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport type { DefaultSlot, Slot } from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport slot from \"@ui5/webcomponents-base/dist/decorators/slot-strict.js\";\nimport event from \"@ui5/webcomponents-base/dist/decorators/event-strict.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\nimport { isDesktop } from \"@ui5/webcomponents-base/dist/Device.js\";\nimport AccordionSpotlightTemplate from \"./AccordionSpotlightTemplate.js\";\nimport AccordionSpotlightItem from \"./AccordionSpotlightItem.js\";\nimport UDExButton from \"./Button.js\";\nimport \"@ui5/webcomponents-icons/dist/play.js\";\nimport \"@ui5/webcomponents-icons/dist/pause.js\";\nimport type { ResizeObserverCallback } from \"@ui5/webcomponents-base/dist/delegate/ResizeHandler.js\";\nimport ResizeHandler from \"@ui5/webcomponents-base/dist/delegate/ResizeHandler.js\";\nimport { BreakpointUtils } from \"./utils/Breakpoints.js\";\n\n// Styles\nimport AccordionSpotlightCss from \"./generated/themes/AccordionSpotlight.css.js\";\n\nexport enum UDExAccordionSpotlightVerticalAlignment {\n Top = \"Top\",\n Center = \"Center\",\n}\n\nexport enum UDExAccordionSpotlightPlacement {\n Start = \"Start\",\n End = \"End\",\n}\n\nexport enum UDExAccordionSpotlightMediaMode {\n Dynamic = \"Dynamic\",\n Static = \"Static\",\n}\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n * Vertical accordion navigation with spotlight layout. Items are listed on the\n * left; the expanded panel is displayed on the right (desktop) or inline below\n * the heading (mobile). Follows the WAI-ARIA APG Accordion pattern.\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-accordion-spotlight</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/AccordionSpotlight.js\";</code>\n *\n * @constructor\n * @extends UI5Element\n * @public\n */\n@customElement({\n tag: \"udex-accordion-spotlight\",\n renderer: jsxRenderer,\n styles: AccordionSpotlightCss,\n template: AccordionSpotlightTemplate,\n dependencies: [AccordionSpotlightItem, UDExButton],\n})\n\n/**\n * Fired when the expanded item clicked.\n *\n * @public\n * @param {AccordionSpotlightItem} [item] The accordion spotlight item that was clicked\n */\n@event(\"item-click\", { bubbles: true })\n\nclass UDExAccordionSpotlight extends UI5Element {\n eventDetails!: {\n \"item-click\": { item: AccordionSpotlightItem },\n };\n\n /**\n * The index of the currently expanded item (0-based).\n * Derived from items' <code>selected</code> attribute; kept in sync by the parent.\n *\n * @private\n */\n @property({ type: Number, noAttribute: true })\n _selectedIndex: number = 0;\n\n /**\n * Vertical alignment of the navigation sidebar relative to the content panel.\n *\n * @default \"Top\"\n * @public\n */\n @property()\n verticalAlignment: `${UDExAccordionSpotlightVerticalAlignment}` = UDExAccordionSpotlightVerticalAlignment.Top;\n\n /**\n * Placement of the navigation sidebar — \"Start\" (left) or \"End\" (right).\n *\n * @default \"Start\"\n * @public\n */\n @property()\n placement: `${UDExAccordionSpotlightPlacement}` = UDExAccordionSpotlightPlacement.Start;\n\n /**\n * Enables automatic cycling through items on an interval.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n autoPlay: boolean = false;\n\n /**\n * Interval in milliseconds between automatic item advances. Applies only when autoPlay is enabled.\n *\n * @default 5000\n * @public\n */\n @property({ type: Number })\n autoPlayInterval: number = 5000;\n\n /**\n * Defines the width of the navigation panel.\n *\n * @default \"auto\"\n * @public\n */\n @property({ type: String })\n tabWidth: string = \"auto\";\n\n /**\n * Controls how the media area behaves. In <code>Static</code> mode a single\n * persistent media element (image or video) is displayed alongside the nav\n * list and never changes when items are expanded. In <code>Dynamic</code>\n * mode (default) each item provides its own content panel.\n *\n * @default \"Dynamic\"\n * @public\n */\n @property()\n mediaMode: `${UDExAccordionSpotlightMediaMode}` = UDExAccordionSpotlightMediaMode.Dynamic;\n\n /**\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isMobile: boolean = false;\n\n /**\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isPaused: boolean = false;\n\n /**\n * The slotted AccordionSpotlightItem elements.\n *\n * @public\n */\n @slot({ type: HTMLElement, \"default\": true, individualSlots: true })\n items!: DefaultSlot<AccordionSpotlightItem>;\n\n /**\n * Defines optional content rendered below the navigation items.\n * Use to place a button or any action element beneath the items.\n *\n * @slot footer\n * @public\n */\n @slot({ type: HTMLElement })\n footer!: Slot<HTMLElement>;\n\n /**\n * Persistent media area shown in <code>Static</code> media mode.\n * Place an <code><img></code> or <code><video></code> element here;\n * it remains visible regardless of which item is currently expanded.\n *\n * @slot media\n * @public\n */\n @slot({ type: HTMLElement })\n media!: Slot<HTMLElement>;\n\n _handleResizeBound: ResizeObserverCallback;\n _autoPlayTimer?: number;\n\n constructor() {\n super();\n this._handleResizeBound = this._handleResize.bind(this);\n }\n\n onBeforeRendering() {\n this._syncItemStates();\n }\n\n onAfterRendering() {\n this._checkMobile();\n }\n\n onEnterDOM() {\n ResizeHandler.register(this, this._handleResizeBound);\n\n if (isDesktop()) {\n this.setAttribute(\"desktop\", \"\");\n }\n\n if (this.autoPlay) {\n const prefersReducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n if (prefersReducedMotion) {\n this._isPaused = true;\n } else {\n this._startAutoPlay();\n }\n }\n }\n\n onExitDOM() {\n ResizeHandler.deregister(this, this._handleResizeBound);\n this._stopAutoPlay();\n }\n\n _handleResize(): void {\n this._checkMobile();\n }\n\n _checkMobile() {\n const isMobile = BreakpointUtils.isAtMost(\"S\");\n if (isMobile !== this._isMobile) {\n this._isMobile = isMobile;\n }\n }\n\n _syncItemStates() {\n if (this.items.length === 0) {\n return;\n }\n\n const foundIndex = this.items.findIndex(item => item.selected);\n const activeIndex = foundIndex === -1 ? 0 : foundIndex;\n this._selectedIndex = activeIndex;\n\n this.items.forEach((item, index) => {\n item.selected = index === activeIndex;\n item._isMobile = this._isMobile;\n });\n }\n\n _startAutoPlay(): void {\n this._stopAutoPlay();\n this._isPaused = false;\n this._autoPlayTimer = window.setInterval(() => {\n this._advanceItem();\n }, this.autoPlayInterval);\n }\n\n _stopAutoPlay(): void {\n if (this._autoPlayTimer !== undefined) {\n window.clearInterval(this._autoPlayTimer);\n this._autoPlayTimer = undefined;\n }\n }\n\n _advanceItem(): void {\n const count = this.items.length;\n if (count === 0) {\n return;\n }\n\n const next = (this._selectedIndex + 1) % count;\n this._selectItem(next);\n }\n\n onPlayButtonClick(): void {\n if (this._isPaused) {\n this._startAutoPlay();\n } else {\n this._stopAutoPlay();\n this._isPaused = true;\n }\n }\n\n handleNavItemClick(e: MouseEvent) {\n const btn = (e.target as HTMLElement).closest<HTMLElement>(\"[data-index]\");\n if (!btn) {\n return;\n }\n const index = Number.parseInt(btn.dataset.index!);\n this._selectItem(index);\n }\n\n private _selectItem(index: number) {\n if (index === this._selectedIndex) {\n return;\n }\n\n this._selectedIndex = index;\n this.items.forEach((item, i) => { item.selected = i === index; });\n const item = this.items[index];\n this.fireDecoratorEvent(\"item-click\", { item });\n }\n\n get playBtnIcon(): string {\n return this._isPaused ? \"play\" : \"pause\";\n }\n\n get showFooterSlot(): boolean {\n return this.footer?.length > 0;\n }\n\n get isStaticMedia(): boolean {\n return this.mediaMode === UDExAccordionSpotlightMediaMode.Static;\n }\n\n get showMediaSlot(): boolean {\n return this.isStaticMedia && this.media?.length > 0;\n }\n}\n\nUDExAccordionSpotlight.define();\n\nexport default UDExAccordionSpotlight;\n"]}
|
|
1
|
+
{"version":3,"file":"AccordionSpotlight.js","sourceRoot":"","sources":["../src/AccordionSpotlight.ts"],"names":[],"mappings":"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","sourcesContent":["import UI5Element from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport type { DefaultSlot, Slot } from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport slot from \"@ui5/webcomponents-base/dist/decorators/slot-strict.js\";\nimport event from \"@ui5/webcomponents-base/dist/decorators/event-strict.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\nimport { isDesktop } from \"@ui5/webcomponents-base/dist/Device.js\";\nimport AccordionSpotlightTemplate from \"./AccordionSpotlightTemplate.js\";\nimport AccordionSpotlightItem from \"./AccordionSpotlightItem.js\";\nimport UDExButton from \"./Button.js\";\nimport \"@ui5/webcomponents-icons/dist/play.js\";\nimport \"@ui5/webcomponents-icons/dist/pause.js\";\nimport type { ResizeObserverCallback } from \"@ui5/webcomponents-base/dist/delegate/ResizeHandler.js\";\nimport ResizeHandler from \"@ui5/webcomponents-base/dist/delegate/ResizeHandler.js\";\nimport { BreakpointUtils } from \"./utils/Breakpoints.js\";\n\n// Styles\nimport AccordionSpotlightCss from \"./generated/themes/AccordionSpotlight.css.js\";\n\nexport enum UDExAccordionSpotlightVerticalAlignment {\n Top = \"Top\",\n Center = \"Center\",\n}\n\nexport enum UDExAccordionSpotlightPlacement {\n Start = \"Start\",\n End = \"End\",\n}\n\nexport enum UDExAccordionSpotlightMediaMode {\n Dynamic = \"Dynamic\",\n Static = \"Static\",\n}\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n * Vertical accordion navigation with spotlight layout. Items are listed on the\n * left; the expanded panel is displayed on the right (desktop) or inline below\n * the heading (mobile). Follows the WAI-ARIA APG Accordion pattern.\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-accordion-spotlight</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/AccordionSpotlight.js\";</code>\n *\n * @constructor\n * @extends UI5Element\n * @public\n */\n@customElement({\n tag: \"udex-accordion-spotlight\",\n renderer: jsxRenderer,\n styles: AccordionSpotlightCss,\n template: AccordionSpotlightTemplate,\n dependencies: [AccordionSpotlightItem, UDExButton],\n})\n\n/**\n * Fired when the expanded item clicked.\n *\n * @public\n * @param {AccordionSpotlightItem} [item] The accordion spotlight item that was clicked\n */\n@event(\"item-click\", { bubbles: true })\n\nclass UDExAccordionSpotlight extends UI5Element {\n eventDetails!: {\n \"item-click\": { item: AccordionSpotlightItem },\n };\n\n /**\n * The index of the currently expanded item (0-based), or <code>-1</code> when\n * no item is expanded. Derived from items' <code>selected</code> attribute;\n * kept in sync by the parent.\n *\n * @private\n */\n @property({ type: Number, noAttribute: true })\n _selectedIndex: number = -1;\n\n /**\n * Vertical alignment of the navigation sidebar relative to the content panel.\n *\n * @default \"Top\"\n * @public\n */\n @property()\n verticalAlignment: `${UDExAccordionSpotlightVerticalAlignment}` = UDExAccordionSpotlightVerticalAlignment.Top;\n\n /**\n * Placement of the navigation sidebar — \"Start\" (left) or \"End\" (right).\n *\n * @default \"Start\"\n * @public\n */\n @property()\n placement: `${UDExAccordionSpotlightPlacement}` = UDExAccordionSpotlightPlacement.Start;\n\n /**\n * Enables automatic cycling through items on an interval.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n autoPlay: boolean = false;\n\n /**\n * Interval in milliseconds between automatic item advances. Applies only when autoPlay is enabled.\n *\n * @default 5000\n * @public\n */\n @property({ type: Number })\n autoPlayInterval: number = 5000;\n\n /**\n * Defines the width of the navigation panel.\n *\n * @default \"auto\"\n * @public\n */\n @property({ type: String })\n tabWidth: string = \"auto\";\n\n /**\n * Controls how the media area behaves. In <code>Static</code> mode a single\n * persistent media element (image or video) is displayed alongside the nav\n * list and never changes when items are expanded. In <code>Dynamic</code>\n * mode (default) each item provides its own content panel.\n *\n * @default \"Dynamic\"\n * @public\n */\n @property()\n mediaMode: `${UDExAccordionSpotlightMediaMode}` = UDExAccordionSpotlightMediaMode.Dynamic;\n\n /**\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isMobile: boolean = false;\n\n /**\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isPaused: boolean = false;\n\n /**\n * The slotted AccordionSpotlightItem elements.\n *\n * <code>invalidateOnChildChange</code> lets the component react when an item's\n * <code>selected</code> property is set programmatically, so\n * <code>item.selected = true</code> switches the expanded item at runtime.\n *\n * @public\n */\n @slot({\n type: HTMLElement,\n \"default\": true,\n individualSlots: true,\n invalidateOnChildChange: true,\n })\n items!: DefaultSlot<AccordionSpotlightItem>;\n\n /**\n * Defines optional content rendered below the navigation items.\n * Use to place a button or any action element beneath the items.\n *\n * @slot footer\n * @public\n */\n @slot({ type: HTMLElement })\n footer!: Slot<HTMLElement>;\n\n /**\n * Persistent media area shown in <code>Static</code> media mode.\n * Place an <code><img></code> or <code><video></code> element here;\n * it remains visible regardless of which item is currently expanded.\n *\n * @slot media\n * @public\n */\n @slot({ type: HTMLElement })\n media!: Slot<HTMLElement>;\n\n _handleResizeBound: ResizeObserverCallback;\n _autoPlayTimer?: number;\n\n constructor() {\n super();\n this._handleResizeBound = this._handleResize.bind(this);\n }\n\n onBeforeRendering() {\n this._syncItemStates();\n }\n\n onAfterRendering() {\n this._checkMobile();\n }\n\n onEnterDOM() {\n ResizeHandler.register(this, this._handleResizeBound);\n\n if (isDesktop()) {\n this.setAttribute(\"desktop\", \"\");\n }\n\n if (this.autoPlay) {\n const prefersReducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n if (prefersReducedMotion) {\n this._isPaused = true;\n } else {\n this._startAutoPlay();\n }\n }\n }\n\n onExitDOM() {\n ResizeHandler.deregister(this, this._handleResizeBound);\n this._stopAutoPlay();\n }\n\n _handleResize(): void {\n this._checkMobile();\n }\n\n _checkMobile() {\n const isMobile = BreakpointUtils.isAtMost(\"S\");\n if (isMobile !== this._isMobile) {\n this._isMobile = isMobile;\n }\n }\n\n _syncItemStates() {\n if (this.items.length === 0) {\n return;\n }\n\n const selectedIndexes = this.items.reduce<number[]>((acc, item, index) => {\n if (item.selected) {\n acc.push(index);\n }\n return acc;\n }, []);\n\n // Prefer a selected item that differs from the currently tracked index — it\n // signals a selection requested via `item.selected = true`. Otherwise keep\n // the current index if it is still selected. When no item is selected, leave\n // the component with no active item (-1) rather than forcing the first one.\n let activeIndex: number;\n const newlySelected = selectedIndexes.find(index => index !== this._selectedIndex);\n if (newlySelected !== undefined) {\n activeIndex = newlySelected;\n } else if (selectedIndexes.includes(this._selectedIndex)) {\n activeIndex = this._selectedIndex;\n } else {\n activeIndex = selectedIndexes[0] ?? -1;\n }\n\n this._selectedIndex = activeIndex;\n\n this.items.forEach((item, index) => {\n item.selected = index === activeIndex;\n item._isMobile = this._isMobile;\n });\n }\n\n _startAutoPlay(): void {\n this._stopAutoPlay();\n this._isPaused = false;\n this._autoPlayTimer = window.setInterval(() => {\n this._advanceItem();\n }, this.autoPlayInterval);\n }\n\n _stopAutoPlay(): void {\n if (this._autoPlayTimer !== undefined) {\n window.clearInterval(this._autoPlayTimer);\n this._autoPlayTimer = undefined;\n }\n }\n\n _advanceItem(): void {\n const count = this.items.length;\n if (count === 0) {\n return;\n }\n\n const next = (this._selectedIndex + 1) % count;\n this._selectItem(next);\n }\n\n onPlayButtonClick(): void {\n if (this._isPaused) {\n this._startAutoPlay();\n } else {\n this._stopAutoPlay();\n this._isPaused = true;\n }\n }\n\n handleNavItemClick(e: MouseEvent) {\n const btn = (e.target as HTMLElement).closest<HTMLElement>(\"[data-index]\");\n if (!btn) {\n return;\n }\n const index = Number.parseInt(btn.dataset.index!);\n this._selectItem(index);\n }\n\n private _selectItem(index: number) {\n if (index === this._selectedIndex) {\n return;\n }\n\n this._selectedIndex = index;\n this.items.forEach((item, i) => { item.selected = i === index; });\n const item = this.items[index];\n this.fireDecoratorEvent(\"item-click\", { item });\n }\n\n get playBtnIcon(): string {\n return this._isPaused ? \"play\" : \"pause\";\n }\n\n get showFooterSlot(): boolean {\n return this.footer?.length > 0;\n }\n\n get isStaticMedia(): boolean {\n return this.mediaMode === UDExAccordionSpotlightMediaMode.Static;\n }\n\n get showMediaSlot(): boolean {\n return this.isStaticMedia && this.media?.length > 0;\n }\n}\n\nUDExAccordionSpotlight.define();\n\nexport default UDExAccordionSpotlight;\n"]}
|
|
@@ -37,7 +37,9 @@ declare class UDExAccordionSpotlightItem extends UI5Element {
|
|
|
37
37
|
subheading: string;
|
|
38
38
|
/**
|
|
39
39
|
* Whether this item is currently expanded.
|
|
40
|
-
* Set on the element directly to control the initial selection
|
|
40
|
+
* Set on the element directly to control the initial selection, or at runtime
|
|
41
|
+
* (<code>item.selected = true</code>) to expand this item programmatically —
|
|
42
|
+
* the parent deselects the other items automatically.
|
|
41
43
|
*
|
|
42
44
|
* @default false
|
|
43
45
|
* @public
|
|
@@ -51,7 +51,9 @@ let UDExAccordionSpotlightItem = class UDExAccordionSpotlightItem extends UI5Ele
|
|
|
51
51
|
this.subheading = "";
|
|
52
52
|
/**
|
|
53
53
|
* Whether this item is currently expanded.
|
|
54
|
-
* Set on the element directly to control the initial selection
|
|
54
|
+
* Set on the element directly to control the initial selection, or at runtime
|
|
55
|
+
* (<code>item.selected = true</code>) to expand this item programmatically —
|
|
56
|
+
* the parent deselects the other items automatically.
|
|
55
57
|
*
|
|
56
58
|
* @default false
|
|
57
59
|
* @public
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccordionSpotlightItem.js","sourceRoot":"","sources":["../src/AccordionSpotlightItem.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,UAAU,MAAM,4CAA4C,CAAC;AAEpE,OAAO,IAAI,MAAM,wDAAwD,CAAC;AAC1E,OAAO,aAAa,MAAM,0DAA0D,CAAC;AACrF,OAAO,QAAQ,MAAM,qDAAqD,CAAC;AAC3E,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAE/E,OAAO,8BAA8B,MAAM,qCAAqC,CAAC;AAEjF,SAAS;AACT,OAAO,yBAAyB,MAAM,kDAAkD,CAAC;AAEzF;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,UAAU;IAAnD;;QACE;;;;;WAKG;QAED,YAAO,GAAW,EAAE,CAAC;QAEvB;;;;;WAKG;QAED,eAAU,GAAW,EAAE,CAAC;QAE1B
|
|
1
|
+
{"version":3,"file":"AccordionSpotlightItem.js","sourceRoot":"","sources":["../src/AccordionSpotlightItem.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,UAAU,MAAM,4CAA4C,CAAC;AAEpE,OAAO,IAAI,MAAM,wDAAwD,CAAC;AAC1E,OAAO,aAAa,MAAM,0DAA0D,CAAC;AACrF,OAAO,QAAQ,MAAM,qDAAqD,CAAC;AAC3E,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAE/E,OAAO,8BAA8B,MAAM,qCAAqC,CAAC;AAEjF,SAAS;AACT,OAAO,yBAAyB,MAAM,kDAAkD,CAAC;AAEzF;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,UAAU;IAAnD;;QACE;;;;;WAKG;QAED,YAAO,GAAW,EAAE,CAAC;QAEvB;;;;;WAKG;QAED,eAAU,GAAW,EAAE,CAAC;QAE1B;;;;;;;;WAQG;QAED,aAAQ,GAAY,KAAK,CAAC;QAE5B;;;;;WAKG;QAED,cAAS,GAAY,KAAK,CAAC;QAE7B;;;;WAIG;QAED,WAAM,GAAW,CAAC,CAAC;IA8BvB,CAAC;IAVC,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,YAAY;QACd,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;CACF,CAAA;AApEG;IADD,QAAQ,EAAE;2DACY;AASrB;IADD,QAAQ,EAAE;8DACe;AAYxB;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;4DACA;AAS1B;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;6DAClB;AAQ3B;IADD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;0DACzB;AAQnB;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;2DACR;AAU5B;IADD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;wDACD;AAhEvB,0BAA0B;IAN/B,aAAa,CAAC;QACb,GAAG,EAAE,+BAA+B;QACpC,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,yBAAyB;QACjC,QAAQ,EAAE,8BAA8B;KACzC,CAAC;GACI,0BAA0B,CA4E/B;AAED,0BAA0B,CAAC,MAAM,EAAE,CAAC;AAEpC,eAAe,0BAA0B,CAAC","sourcesContent":["import UI5Element from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport type { DefaultSlot, Slot } from \"@ui5/webcomponents-base/dist/UI5Element.js\";\nimport slot from \"@ui5/webcomponents-base/dist/decorators/slot-strict.js\";\nimport customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\n\nimport AccordionSpotlightItemTemplate from \"./AccordionSpotlightItemTemplate.js\";\n\n// Styles\nimport AccordionSpotlightItemCss from \"./generated/themes/AccordionSpotlightItem.css.js\";\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n * A single item within the <code>udex-accordion-spotlight</code> component.\n * Provides a heading button (<code>aria-expanded</code>) and an associated\n * content region (<code>role=\"region\"</code>).\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-accordion-spotlight-item</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/AccordionSpotlightItem.js\";</code>\n *\n * @constructor\n * @extends UI5Element\n * @public\n */\n@customElement({\n tag: \"udex-accordion-spotlight-item\",\n renderer: jsxRenderer,\n styles: AccordionSpotlightItemCss,\n template: AccordionSpotlightItemTemplate,\n})\nclass UDExAccordionSpotlightItem extends UI5Element {\n /**\n * The label text shown in the heading button.\n *\n * @default \"\"\n * @public\n */\n @property()\n heading: string = \"\";\n\n /**\n * Optional descriptive subtext visible when the item is expanded.\n *\n * @default \"\"\n * @public\n */\n @property()\n subheading: string = \"\";\n\n /**\n * Whether this item is currently expanded.\n * Set on the element directly to control the initial selection, or at runtime\n * (<code>item.selected = true</code>) to expand this item programmatically —\n * the parent deselects the other items automatically.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n selected: boolean = false;\n\n /**\n * Whether the parent is in mobile layout mode (managed by the parent component).\n *\n * @default false\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _isMobile: boolean = false;\n\n /**\n * Zero-based index within the parent (managed by the parent component).\n *\n * @private\n */\n @property({ type: Number, noAttribute: true })\n _index: number = 0;\n\n /**\n * The slotted content for this item's panel.\n *\n * @public\n */\n @slot({ type: Node, \"default\": true })\n content!: DefaultSlot<Node>;\n\n /**\n * Defines the link(s) to be displayed in the tab header (vertical orientation only).\n * Use this slot to add one or more udex-link elements to the tab button.\n *\n * @slot link\n * @public\n */\n @slot({ type: HTMLElement })\n link!: Slot<HTMLElement>;\n\n get hasLinkSlot(): boolean {\n return this.link && this.link.length > 0;\n }\n\n get linkSlotHtml(): string {\n if (!this.link || this.link.length === 0) {\n return \"\";\n }\n return this.link.map(l => l.outerHTML).join(\"\");\n }\n}\n\nUDExAccordionSpotlightItem.define();\n\nexport default UDExAccordionSpotlightItem;\n"]}
|
package/dist/Carousel.d.ts
CHANGED
|
@@ -146,6 +146,7 @@ declare class UDExCarousel extends UI5Element {
|
|
|
146
146
|
_autoplayMinTimeBetweenToggle: number;
|
|
147
147
|
_autoplayManualStop: boolean;
|
|
148
148
|
_resizeHandler: ResizeObserverCallback;
|
|
149
|
+
_resizeRafHandle: number | null;
|
|
149
150
|
constructor();
|
|
150
151
|
onAfterRendering(): void;
|
|
151
152
|
onExitDOM(): void;
|
|
@@ -162,6 +163,7 @@ declare class UDExCarousel extends UI5Element {
|
|
|
162
163
|
_calculateDisabledButtonsState(): void;
|
|
163
164
|
_prevButtonClick(): void;
|
|
164
165
|
_nextButtonClick(): void;
|
|
166
|
+
_navigateToPage(direction: 1 | -1): void;
|
|
165
167
|
_onkeydown(e: KeyboardEvent): void;
|
|
166
168
|
_handleNavigate(e: UI5CustomEvent<UI5Carousel, "navigate">): void;
|
|
167
169
|
get nextPageText(): string;
|
package/dist/Carousel.js
CHANGED
|
@@ -123,6 +123,7 @@ let UDExCarousel = UDExCarousel_1 = class UDExCarousel extends UI5Element {
|
|
|
123
123
|
this._autoplayLastToggle = Date.now();
|
|
124
124
|
this._autoplayMinTimeBetweenToggle = 250;
|
|
125
125
|
this._autoplayManualStop = false;
|
|
126
|
+
this._resizeRafHandle = null;
|
|
126
127
|
this._autoplayLoop = () => {
|
|
127
128
|
const items = this._carousel?.items;
|
|
128
129
|
if (!items) {
|
|
@@ -151,6 +152,10 @@ let UDExCarousel = UDExCarousel_1 = class UDExCarousel extends UI5Element {
|
|
|
151
152
|
}
|
|
152
153
|
onExitDOM() {
|
|
153
154
|
ResizeHandler.deregister(this, this._resizeHandler);
|
|
155
|
+
if (this._resizeRafHandle !== null) {
|
|
156
|
+
cancelAnimationFrame(this._resizeRafHandle);
|
|
157
|
+
this._resizeRafHandle = null;
|
|
158
|
+
}
|
|
154
159
|
if (this._autoplayInterval) {
|
|
155
160
|
clearInterval(this._autoplayInterval);
|
|
156
161
|
}
|
|
@@ -159,7 +164,17 @@ let UDExCarousel = UDExCarousel_1 = class UDExCarousel extends UI5Element {
|
|
|
159
164
|
ResizeHandler.register(this, this._resizeHandler);
|
|
160
165
|
}
|
|
161
166
|
_onResize() {
|
|
162
|
-
this.
|
|
167
|
+
if (this._resizeRafHandle !== null) {
|
|
168
|
+
cancelAnimationFrame(this._resizeRafHandle);
|
|
169
|
+
}
|
|
170
|
+
// Defer until after the inner UI5 carousel has processed its own resize
|
|
171
|
+
// (outer element's ResizeObserver fires before inner element's, so the inner
|
|
172
|
+
// carousel's effectiveItemsPerPage and _currentPageIndex are still stale here)
|
|
173
|
+
this._resizeRafHandle = requestAnimationFrame(() => {
|
|
174
|
+
this._resizeRafHandle = null;
|
|
175
|
+
this._hasManyPages = this._carousel?.hasManyPages ?? false;
|
|
176
|
+
this._calculateDisabledButtonsState();
|
|
177
|
+
});
|
|
163
178
|
}
|
|
164
179
|
_startAutoplay() {
|
|
165
180
|
if (!this.autoplay) {
|
|
@@ -226,14 +241,30 @@ let UDExCarousel = UDExCarousel_1 = class UDExCarousel extends UI5Element {
|
|
|
226
241
|
if (this.isPrevButtonDisabled || !this._carousel) {
|
|
227
242
|
return;
|
|
228
243
|
}
|
|
229
|
-
this.
|
|
230
|
-
this._calculateDisabledButtonsState();
|
|
244
|
+
this._navigateToPage(-1);
|
|
231
245
|
}
|
|
232
246
|
_nextButtonClick() {
|
|
233
247
|
if (this.isNextButtonDisabled || !this._carousel) {
|
|
234
248
|
return;
|
|
235
249
|
}
|
|
236
|
-
this.
|
|
250
|
+
this._navigateToPage(1);
|
|
251
|
+
}
|
|
252
|
+
_navigateToPage(direction) {
|
|
253
|
+
const carousel = this._carousel;
|
|
254
|
+
if (!carousel) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
let newPageIndex = carousel._currentPageIndex + direction;
|
|
258
|
+
if (this.cyclic) {
|
|
259
|
+
const lastPageIndex = carousel.items.length - carousel.effectiveItemsPerPage;
|
|
260
|
+
if (newPageIndex > lastPageIndex) {
|
|
261
|
+
newPageIndex = 0;
|
|
262
|
+
}
|
|
263
|
+
else if (newPageIndex < 0) {
|
|
264
|
+
newPageIndex = carousel.items.length - 1;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
carousel._changePageIndex(newPageIndex);
|
|
237
268
|
this._calculateDisabledButtonsState();
|
|
238
269
|
}
|
|
239
270
|
_onkeydown(e) {
|