@telesign/boreal-web-components 0.1.0-alpha.4 → 0.1.0-alpha.6
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/components-build/bds-avatar.js +1 -1
- package/components-build/bds-badge.js +1 -1
- package/components-build/bds-banner.js +1 -1
- package/components-build/bds-breadcrumb-item.d.ts +11 -0
- package/components-build/bds-breadcrumb-item.js +1 -0
- package/components-build/bds-breadcrumb.d.ts +11 -0
- package/components-build/bds-breadcrumb.js +1 -0
- package/components-build/bds-button-group.d.ts +11 -0
- package/components-build/bds-button-group.js +1 -0
- package/components-build/bds-button.js +1 -1
- package/components-build/bds-checkbox-button.d.ts +11 -0
- package/components-build/bds-checkbox-button.js +1 -0
- package/components-build/bds-checkbox-card.d.ts +11 -0
- package/components-build/bds-checkbox-card.js +1 -0
- package/components-build/bds-checkbox-group.d.ts +11 -0
- package/components-build/bds-checkbox-group.js +1 -0
- package/components-build/bds-checkbox.js +1 -1
- package/components-build/bds-dialog.js +1 -1
- package/components-build/bds-divider.js +1 -1
- package/components-build/bds-flag.js +1 -1
- package/components-build/bds-grid-item.js +1 -1
- package/components-build/bds-grid.js +1 -1
- package/components-build/bds-list-menu-item.js +1 -1
- package/components-build/bds-list-menu.js +1 -1
- package/components-build/bds-popover.js +1 -1
- package/components-build/bds-radio-button.d.ts +11 -0
- package/components-build/bds-radio-button.js +1 -0
- package/components-build/bds-radio-card.d.ts +11 -0
- package/components-build/bds-radio-card.js +1 -0
- package/components-build/bds-radio-group.d.ts +11 -0
- package/components-build/bds-radio-group.js +1 -0
- package/components-build/bds-radio.d.ts +11 -0
- package/components-build/bds-radio.js +1 -0
- package/components-build/bds-select.d.ts +11 -0
- package/components-build/bds-select.js +1 -0
- package/components-build/bds-slider.d.ts +11 -0
- package/components-build/bds-slider.js +1 -0
- package/components-build/bds-spinner.js +1 -1
- package/components-build/bds-status.js +1 -1
- package/components-build/bds-tag.js +1 -1
- package/components-build/bds-text-field.js +1 -1
- package/components-build/bds-toggle.js +1 -1
- package/components-build/bds-tooltip.js +1 -1
- package/components-build/bds-typography.js +1 -1
- package/components-build/index.js +1 -1
- package/components-build/p-B6e9eIHB.js +1 -0
- package/components-build/p-CJBdGD_4.js +1 -0
- package/components-build/p-CPvuMm5C.js +1 -0
- package/components-build/p-DcR7mHFE.js +1 -0
- package/components-build/p-DdOPD9wW.js +1 -0
- package/components-build/p-DfaYciGa.js +1 -0
- package/components-build/p-Dh8DSJs_.js +1 -0
- package/components-build/p-DoNZM78n.js +1 -0
- package/components-build/p-DrkDx75U.js +1 -0
- package/components-build/p-DuBzr05c.js +1 -0
- package/components-build/p-PmjPRW8X.js +1 -0
- package/components-build/p-cgdh1LO-.js +1 -0
- package/{dist/boreal-web-components/p-CaHOghy5.js → components-build/p-fUK0GCeC.js} +1 -1
- package/components-build/p-nxYzL9uu.js +1 -0
- package/components-build/p-yLNcMg2E.js +1 -0
- package/custom-elements.json +5078 -1524
- package/dist/boreal-web-components/boreal-web-components.esm.js +1 -1
- package/dist/boreal-web-components/css/boreal.css +60 -0
- package/dist/boreal-web-components/css/theme-connect.css +15 -0
- package/dist/boreal-web-components/css/theme-engage.css +15 -0
- package/dist/boreal-web-components/css/theme-protect.css +15 -0
- package/dist/boreal-web-components/css/theme-proximus.css +15 -0
- package/dist/boreal-web-components/p-02e53626.entry.js +1 -0
- package/dist/boreal-web-components/p-0357450d.system.entry.js +1 -0
- package/dist/boreal-web-components/{p-e0bf8a6e.entry.js → p-1250ba53.entry.js} +1 -1
- package/dist/boreal-web-components/p-1911b978.entry.js +1 -0
- package/dist/boreal-web-components/{p-2158a7cd.entry.js → p-19f9352d.entry.js} +1 -1
- package/dist/boreal-web-components/p-1mOd23lT.system.js +1 -0
- package/dist/boreal-web-components/{p-52600375.system.entry.js → p-25823f7d.system.entry.js} +1 -1
- package/dist/boreal-web-components/p-2db71382.system.entry.js +1 -0
- package/dist/boreal-web-components/{p-251d35df.system.entry.js → p-365e8e5c.system.entry.js} +1 -1
- package/dist/boreal-web-components/p-367e40f9.entry.js +1 -0
- package/dist/boreal-web-components/p-3946d587.entry.js +1 -0
- package/dist/boreal-web-components/p-44b6fe6c.system.entry.js +1 -0
- package/dist/boreal-web-components/{p-7a4efddd.system.entry.js → p-48712a63.system.entry.js} +1 -1
- package/dist/boreal-web-components/{p-251b3002.entry.js → p-49ea207a.entry.js} +1 -1
- package/dist/boreal-web-components/p-4b028406.entry.js +1 -0
- package/dist/boreal-web-components/p-4b615de8.system.entry.js +1 -0
- package/dist/boreal-web-components/{p-edca16b6.system.entry.js → p-4f431941.system.entry.js} +1 -1
- package/dist/boreal-web-components/p-524421f7.system.entry.js +1 -0
- package/dist/boreal-web-components/p-530c8c7f.entry.js +1 -0
- package/dist/boreal-web-components/p-55aeff0c.system.entry.js +1 -0
- package/dist/boreal-web-components/p-5c8650b3.system.entry.js +1 -0
- package/dist/boreal-web-components/p-5e590291.system.entry.js +1 -0
- package/dist/boreal-web-components/p-5ee0841f.entry.js +1 -0
- package/dist/boreal-web-components/{p-871c9a9f.system.entry.js → p-65923619.system.entry.js} +1 -1
- package/dist/boreal-web-components/p-66ec16d9.entry.js +1 -0
- package/dist/boreal-web-components/{p-127a4134.entry.js → p-714bf70d.entry.js} +1 -1
- package/dist/boreal-web-components/{p-66360e63.entry.js → p-71ed1e1d.entry.js} +1 -1
- package/dist/boreal-web-components/{p-b12d4788.system.entry.js → p-732e98f1.system.entry.js} +1 -1
- package/dist/boreal-web-components/p-7626338e.system.entry.js +1 -0
- package/dist/boreal-web-components/{p-80822731.system.entry.js → p-77658a5b.system.entry.js} +1 -1
- package/dist/boreal-web-components/p-7G4h4DI7.js +1 -0
- package/dist/boreal-web-components/p-800fc096.system.entry.js +1 -0
- package/dist/boreal-web-components/p-824485ad.entry.js +1 -0
- package/dist/boreal-web-components/p-8dfe3a9f.entry.js +1 -0
- package/dist/boreal-web-components/p-90022071.entry.js +1 -0
- package/dist/boreal-web-components/{p-1d1bb9d2.entry.js → p-9d02057d.entry.js} +1 -1
- package/dist/boreal-web-components/p-C-g3hhl_.system.js +1 -0
- package/dist/boreal-web-components/p-C0P3gzq5.system.js +1 -0
- package/dist/boreal-web-components/p-C4HM8wQe.js +1 -0
- package/dist/boreal-web-components/p-CPvuMm5C.js +1 -0
- package/dist/boreal-web-components/p-CRMH6mfq.system.js +1 -0
- package/dist/boreal-web-components/p-CU_dRLdk.system.js +1 -0
- package/dist/boreal-web-components/p-CW4-dkCF.system.js +1 -0
- package/dist/boreal-web-components/p-CcENtewr.js +1 -0
- package/dist/boreal-web-components/{p-BuxZeJbu.system.js → p-DSU8tkVw.system.js} +1 -1
- package/dist/boreal-web-components/p-DfaYciGa.js +1 -0
- package/dist/boreal-web-components/p-Dk9dfU9-.system.js +1 -0
- package/dist/boreal-web-components/p-DlVzZK7o.js +1 -0
- package/dist/boreal-web-components/p-DnIhjwCH.system.js +1 -0
- package/dist/boreal-web-components/p-Dwo1hcd9.js +1 -0
- package/dist/boreal-web-components/p-K7DvMlRo.system.js +1 -0
- package/{components-build/p-CaHOghy5.js → dist/boreal-web-components/p-U9yfbs7i.js} +1 -1
- package/dist/boreal-web-components/p-UEj9YHof.system.js +1 -0
- package/dist/boreal-web-components/p-b54fe67f.system.entry.js +1 -0
- package/dist/boreal-web-components/p-bbcd3a30.system.entry.js +1 -0
- package/dist/boreal-web-components/p-bea25d3d.system.entry.js +1 -0
- package/dist/boreal-web-components/p-bed506d3.entry.js +1 -0
- package/dist/boreal-web-components/p-bfd62034.system.entry.js +1 -0
- package/dist/boreal-web-components/p-c07d6b82.system.entry.js +1 -0
- package/dist/boreal-web-components/p-cc5c359f.entry.js +1 -0
- package/dist/boreal-web-components/p-cgdh1LO-.js +1 -0
- package/dist/boreal-web-components/p-d2b6ae79.entry.js +1 -0
- package/dist/boreal-web-components/{p-695d0830.entry.js → p-dc7d429c.entry.js} +1 -1
- package/dist/boreal-web-components/p-e21b8416.entry.js +1 -0
- package/dist/boreal-web-components/p-e4364a44.system.entry.js +1 -0
- package/dist/boreal-web-components/p-e51407b2.system.entry.js +1 -0
- package/dist/boreal-web-components/p-e8cde179.system.entry.js +1 -0
- package/dist/boreal-web-components/p-eecc3028.system.entry.js +1 -0
- package/dist/boreal-web-components/p-f3bd824d.system.entry.js +1 -0
- package/dist/boreal-web-components/{p-44ceff4e.system.entry.js → p-f65e9d0c.system.entry.js} +1 -1
- package/dist/boreal-web-components/p-f6eabb16.entry.js +1 -0
- package/dist/boreal-web-components/p-f7acf6e5.system.entry.js +1 -0
- package/dist/boreal-web-components/{p-7db870b7.entry.js → p-f9560509.entry.js} +1 -1
- package/dist/boreal-web-components/p-fa128cad.system.entry.js +1 -0
- package/dist/boreal-web-components/p-fab1a01d.entry.js +1 -0
- package/dist/boreal-web-components/{p-fc24d963.entry.js → p-fb9a0e94.entry.js} +1 -1
- package/dist/boreal-web-components/p-fb9ba833.entry.js +1 -0
- package/dist/boreal-web-components/p-fbe0c9f2.entry.js +1 -0
- package/dist/boreal-web-components/p-fbe88555.entry.js +1 -0
- package/dist/boreal-web-components/p-fc1fa966.system.entry.js +1 -0
- package/dist/boreal-web-components/p-fc4ffa0e.entry.js +1 -0
- package/dist/boreal-web-components/p-fef13445.entry.js +1 -0
- package/dist/boreal-web-components/p-iq2UuV7c.js +1 -0
- package/dist/boreal-web-components/p-qGhMe8Hk.js +1 -0
- package/dist/boreal-web-components/p-vzZJGcYF.system.js +1 -1
- package/dist/boreal-web-components/scss/maps/_theme-connect.scss +16 -1
- package/dist/boreal-web-components/scss/maps/_theme-engage.scss +16 -1
- package/dist/boreal-web-components/scss/maps/_theme-protect.scss +16 -1
- package/dist/boreal-web-components/scss/maps/_theme-proximus.scss +16 -1
- package/dist/boreal-web-components/scss/variables/_theme-connect.scss +16 -1
- package/dist/boreal-web-components/scss/variables/_theme-engage.scss +16 -1
- package/dist/boreal-web-components/scss/variables/_theme-protect.scss +16 -1
- package/dist/boreal-web-components/scss/variables/_theme-proximus.scss +16 -1
- package/dist/cjs/KeyboardController-B_g3peyB.js +1067 -0
- package/dist/cjs/Keys-DXn16dlA.js +34 -0
- package/dist/cjs/Logger-DnziItRH.js +51 -0
- package/dist/cjs/{attributes-wIHueigW.js → attributes-CgRFplrN.js} +3 -0
- package/dist/cjs/bds-avatar.cjs.entry.js +2 -2
- package/dist/cjs/bds-badge.cjs.entry.js +1 -1
- package/dist/cjs/bds-banner.cjs.entry.js +2 -2
- package/dist/cjs/bds-breadcrumb-item.cjs.entry.js +106 -0
- package/dist/cjs/bds-breadcrumb.cjs.entry.js +127 -0
- package/dist/cjs/bds-button-group.cjs.entry.js +116 -0
- package/dist/cjs/bds-button.cjs.entry.js +38 -17
- package/dist/cjs/bds-checkbox-button.cjs.entry.js +119 -0
- package/dist/cjs/bds-checkbox-card.cjs.entry.js +135 -0
- package/dist/cjs/bds-checkbox-group.cjs.entry.js +292 -0
- package/dist/cjs/bds-checkbox.cjs.entry.js +67 -29
- package/dist/cjs/bds-dialog.cjs.entry.js +4 -4
- package/dist/cjs/bds-divider.cjs.entry.js +2 -2
- package/dist/cjs/bds-flag.cjs.entry.js +1 -1
- package/dist/cjs/bds-grid-item.cjs.entry.js +1 -1
- package/dist/cjs/bds-grid.cjs.entry.js +1 -1
- package/dist/cjs/bds-list-menu-item.cjs.entry.js +59 -23
- package/dist/cjs/bds-list-menu.cjs.entry.js +126 -22
- package/dist/cjs/bds-popover.cjs.entry.js +15 -6
- package/dist/cjs/bds-radio-button.cjs.entry.js +60 -0
- package/dist/cjs/bds-radio-card.cjs.entry.js +76 -0
- package/dist/cjs/bds-radio-group.cjs.entry.js +291 -0
- package/dist/cjs/bds-radio.cjs.entry.js +60 -0
- package/dist/cjs/bds-select.cjs.entry.js +394 -0
- package/dist/cjs/bds-slider.cjs.entry.js +655 -0
- package/dist/cjs/bds-spinner.cjs.entry.js +1 -1
- package/dist/cjs/bds-status.cjs.entry.js +1 -1
- package/dist/cjs/bds-tag.cjs.entry.js +2 -2
- package/dist/cjs/bds-text-field.cjs.entry.js +15 -9
- package/dist/cjs/bds-toggle.cjs.entry.js +7 -6
- package/dist/cjs/bds-tooltip_2.cjs.entry.js +12 -9
- package/dist/cjs/boreal-web-components.cjs.js +1 -1
- package/dist/cjs/checkbox-form-association-DTEpHXUD.js +43 -0
- package/dist/cjs/coreColors-CQGojc0l.js +10 -0
- package/dist/cjs/{enum-DLblRCkQ.js → enum-DeTWfR0D.js} +3 -3
- package/dist/cjs/form-associated.mixin-BCR6bj29.js +33 -0
- package/dist/cjs/{getOffset-m4hBgyVP.js → getOffset-CsDHFjPW.js} +6 -53
- package/dist/cjs/{form-associated.mixin-DXwvF_vW.js → internals-D8x7GMfR.js} +0 -31
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/orientation-DQAIleEJ.js +8 -0
- package/dist/collection/collection-manifest.json +18 -6
- package/dist/collection/components/actions/bds-button/bds-button.css +55 -55
- package/dist/collection/components/actions/bds-button/bds-button.js +35 -11
- package/dist/collection/components/actions/bds-button/types/enum.js +3 -3
- package/dist/collection/components/actions/bds-button-group/bds-button-group.css +77 -0
- package/dist/collection/components/actions/bds-button-group/bds-button-group.js +264 -0
- package/dist/collection/components/actions/bds-list-menu/bds-list-menu/bds-list-menu.css +27 -1
- package/dist/collection/components/actions/bds-list-menu/bds-list-menu/bds-list-menu.js +283 -51
- package/dist/collection/components/actions/bds-list-menu/bds-list-menu/types/enum.js +4 -0
- package/dist/collection/components/actions/bds-list-menu/bds-list-menu-item/bds-list-menu-item.css +30 -11
- package/dist/collection/components/actions/bds-list-menu/bds-list-menu-item/bds-list-menu-item.js +65 -7
- package/dist/collection/components/actions/bds-toggle/bds-toggle.css +3 -3
- package/dist/collection/components/actions/bds-toggle/bds-toggle.js +1 -1
- package/dist/collection/components/feedback/bds-badge/bds-badge.js +1 -1
- package/dist/collection/components/feedback/bds-banner/bds-banner.js +1 -1
- package/dist/collection/components/feedback/bds-spinner/bds-spinner.js +1 -1
- package/dist/collection/components/feedback/bds-status/bds-status.js +1 -1
- package/dist/collection/components/feedback/bds-tag/bds-tag.css +6 -6
- package/dist/collection/components/feedback/bds-tag/bds-tag.js +1 -1
- package/dist/collection/components/forms/bds-checkbox/bds-checkbox/bds-checkbox.css +132 -0
- package/dist/collection/components/forms/bds-checkbox/{bds-checkbox.js → bds-checkbox/bds-checkbox.js} +138 -35
- package/dist/collection/components/forms/bds-checkbox/bds-checkbox-button/bds-checkbox-button.css +113 -0
- package/dist/collection/components/forms/bds-checkbox/bds-checkbox-button/bds-checkbox-button.js +382 -0
- package/dist/collection/components/forms/bds-checkbox/bds-checkbox-card/bds-checkbox-card.css +139 -0
- package/dist/collection/components/forms/bds-checkbox/bds-checkbox-card/bds-checkbox-card.js +443 -0
- package/dist/collection/components/forms/bds-checkbox/bds-checkbox-group/bds-checkbox-group.css +55 -0
- package/dist/collection/components/forms/bds-checkbox/bds-checkbox-group/bds-checkbox-group.js +648 -0
- package/dist/collection/components/forms/bds-checkbox/bds-checkbox-group/types/enum.js +5 -0
- package/dist/collection/components/forms/bds-checkbox/bds-checkbox-group/types/index.js +3 -0
- package/dist/collection/components/forms/bds-checkbox/utils/checkbox-form-association.js +39 -0
- package/dist/collection/components/forms/bds-checkbox/utils/index.js +1 -0
- package/dist/collection/components/forms/bds-flag/bds-flag.js +1 -1
- package/dist/collection/components/forms/bds-radio/bds-radio/bds-radio.css +121 -0
- package/dist/collection/components/forms/bds-radio/bds-radio/bds-radio.js +238 -0
- package/dist/collection/components/forms/bds-radio/bds-radio/types/IRadio.js +1 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-button/bds-radio-button.css +113 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-button/bds-radio-button.js +238 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-button/types/IRadioButton.js +1 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-card/bds-radio-card.css +156 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-card/bds-radio-card.js +307 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-card/types/IRadioCard.js +1 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-group/bds-radio-group.css +55 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-group/bds-radio-group.js +648 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-group/types/IRadioGroup.js +1 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-group/types/enum.js +5 -0
- package/dist/collection/components/forms/bds-radio/bds-radio-group/types/types.js +1 -0
- package/dist/collection/components/forms/bds-select/bds-select.css +23 -0
- package/dist/collection/components/forms/bds-select/bds-select.js +431 -0
- package/dist/collection/components/forms/bds-select/types/ISelect.js +1 -0
- package/dist/collection/components/forms/bds-slider/bds-slider.css +213 -0
- package/dist/collection/components/forms/bds-slider/bds-slider.js +847 -0
- package/dist/collection/components/forms/bds-slider/helpers/SliderDOMController.js +61 -0
- package/dist/collection/components/forms/bds-slider/helpers/SliderService.js +93 -0
- package/dist/collection/components/forms/bds-slider/helpers/index.js +3 -0
- package/dist/collection/components/forms/bds-slider/helpers/parseValues.js +43 -0
- package/dist/collection/components/forms/bds-slider/types/ChangeDetail.js +1 -0
- package/dist/collection/components/forms/bds-slider/types/ISlider.js +1 -0
- package/dist/collection/components/forms/bds-slider/types/ISliderOptions.js +1 -0
- package/dist/collection/components/forms/bds-slider/types/enum.js +16 -0
- package/dist/collection/components/forms/bds-slider/types/index.js +5 -0
- package/dist/collection/components/forms/bds-slider/types/types.js +1 -0
- package/dist/collection/components/forms/bds-text-field/bds-text-field.css +10 -3
- package/dist/collection/components/forms/bds-text-field/bds-text-field.js +47 -2
- package/dist/collection/components/helpers/{bds-divider.css → bds-divider/bds-divider.css} +12 -4
- package/dist/collection/components/helpers/{bds-divider.js → bds-divider/bds-divider.js} +3 -3
- package/dist/collection/components/helpers/bds-divider/types/IDivider.js +1 -0
- package/dist/collection/components/helpers/bds-divider/types/types.js +1 -0
- package/dist/collection/components/images-icons/bds-avatar/bds-avatar.js +1 -1
- package/dist/collection/components/layouts/bds-grid/{grid → bds-grid}/bds-grid.js +3 -3
- package/dist/collection/components/layouts/bds-grid/bds-grid/types/IGrid.js +1 -0
- package/dist/collection/components/layouts/bds-grid/bds-grid/types/types.js +1 -0
- package/dist/collection/components/layouts/bds-grid/{grid-item → bds-grid-item}/bds-grid-item.js +9 -9
- package/dist/collection/components/layouts/bds-grid/bds-grid-item/types/IGridItem.js +1 -0
- package/dist/collection/components/layouts/bds-grid/bds-grid-item/types/types.js +1 -0
- package/dist/collection/components/navigation/bds-breadcrumb/bds-breadcrumb.css +21 -0
- package/dist/collection/components/navigation/bds-breadcrumb/bds-breadcrumb.js +292 -0
- package/dist/collection/components/navigation/bds-breadcrumb/types/IBreadcrumb.js +1 -0
- package/dist/collection/components/navigation/bds-breadcrumb-item/bds-breadcrumb-item.css +64 -0
- package/dist/collection/components/navigation/bds-breadcrumb-item/bds-breadcrumb-item.js +369 -0
- package/dist/collection/components/navigation/bds-breadcrumb-item/types/IBreadcrumbItem.js +1 -0
- package/dist/collection/components/overlays/bds-dialog/bds-dialog.css +1 -1
- package/dist/collection/components/overlays/bds-dialog/bds-dialog.js +2 -2
- package/dist/collection/components/overlays/bds-popover/bds-popover.js +49 -3
- package/dist/collection/components/overlays/bds-tooltip/bds-tooltip.js +3 -3
- package/dist/collection/components/titles-text/bds-typography/bds-typography.css +5 -0
- package/dist/collection/components/titles-text/bds-typography/bds-typography.js +30 -47
- package/dist/collection/components/titles-text/bds-typography/utils/bds-typography-utils.js +1 -1
- package/dist/collection/css/boreal.css +60 -0
- package/dist/collection/css/theme-connect.css +15 -0
- package/dist/collection/css/theme-engage.css +15 -0
- package/dist/collection/css/theme-protect.css +15 -0
- package/dist/collection/css/theme-proximus.css +15 -0
- package/dist/collection/mixins/anchored.mixin.js +2 -2
- package/dist/collection/mixins/links.mixin.js +1 -2
- package/dist/collection/mixins/menu-behavior.mixin.js +12 -6
- package/dist/collection/scss/maps/_theme-connect.scss +16 -1
- package/dist/collection/scss/maps/_theme-engage.scss +16 -1
- package/dist/collection/scss/maps/_theme-protect.scss +16 -1
- package/dist/collection/scss/maps/_theme-proximus.scss +16 -1
- package/dist/collection/scss/variables/_theme-connect.scss +16 -1
- package/dist/collection/scss/variables/_theme-engage.scss +16 -1
- package/dist/collection/scss/variables/_theme-protect.scss +16 -1
- package/dist/collection/scss/variables/_theme-proximus.scss +16 -1
- package/dist/collection/types/index.js +2 -1
- package/dist/collection/types/orientation.js +4 -0
- package/dist/collection/utils/a11y/index.js +4 -0
- package/dist/collection/utils/a11y/keyboard/KeyboardController.js +566 -0
- package/dist/collection/utils/a11y/keyboard/_constants.js +30 -0
- package/dist/collection/utils/a11y/keyboard/focus/aria-activedescendant.js +41 -0
- package/dist/collection/utils/a11y/keyboard/focus/resolve.js +48 -0
- package/dist/collection/utils/a11y/keyboard/focus/roving-tabindex.js +55 -0
- package/dist/collection/utils/a11y/keyboard/navigation/grid-navigation.js +194 -0
- package/dist/collection/utils/a11y/keyboard/navigation/linear-navigation.js +137 -0
- package/dist/collection/utils/a11y/keyboard/types/IKeyboardController.js +1 -0
- package/dist/collection/utils/a11y/keyboard/types/index.js +2 -0
- package/dist/collection/utils/a11y/keyboard/types/types.js +1 -0
- package/dist/collection/utils/constants/common/Keys.js +29 -24
- package/dist/collection/utils/dom/elements.js +63 -0
- package/dist/collection/utils/menu/menu-item.utils.js +9 -8
- package/dist/collection/utils/testing/helpers.js +10 -0
- package/dist/css/boreal.css +60 -0
- package/dist/css/theme-connect.css +15 -0
- package/dist/css/theme-engage.css +15 -0
- package/dist/css/theme-protect.css +15 -0
- package/dist/css/theme-proximus.css +15 -0
- package/dist/esm/KeyboardController-DcnXb5F5.js +1064 -0
- package/dist/esm/Keys-7G4h4DI7.js +31 -0
- package/dist/esm/Logger-iq2UuV7c.js +49 -0
- package/dist/esm/{attributes-CaHOghy5.js → attributes-U9yfbs7i.js} +3 -0
- package/dist/esm/bds-avatar.entry.js +2 -2
- package/dist/esm/bds-badge.entry.js +1 -1
- package/dist/esm/bds-banner.entry.js +2 -2
- package/dist/esm/bds-breadcrumb-item.entry.js +104 -0
- package/dist/esm/bds-breadcrumb.entry.js +125 -0
- package/dist/esm/bds-button-group.entry.js +114 -0
- package/dist/esm/bds-button.entry.js +36 -15
- package/dist/esm/bds-checkbox-button.entry.js +117 -0
- package/dist/esm/bds-checkbox-card.entry.js +133 -0
- package/dist/esm/bds-checkbox-group.entry.js +290 -0
- package/dist/esm/bds-checkbox.entry.js +67 -29
- package/dist/esm/bds-dialog.entry.js +4 -4
- package/dist/esm/bds-divider.entry.js +2 -2
- package/dist/esm/bds-flag.entry.js +1 -1
- package/dist/esm/bds-grid-item.entry.js +1 -1
- package/dist/esm/bds-grid.entry.js +1 -1
- package/dist/esm/bds-list-menu-item.entry.js +59 -23
- package/dist/esm/bds-list-menu.entry.js +126 -22
- package/dist/esm/bds-popover.entry.js +15 -6
- package/dist/esm/bds-radio-button.entry.js +58 -0
- package/dist/esm/bds-radio-card.entry.js +74 -0
- package/dist/esm/bds-radio-group.entry.js +289 -0
- package/dist/esm/bds-radio.entry.js +58 -0
- package/dist/esm/bds-select.entry.js +392 -0
- package/dist/esm/bds-slider.entry.js +653 -0
- package/dist/esm/bds-spinner.entry.js +1 -1
- package/dist/esm/bds-status.entry.js +1 -1
- package/dist/esm/bds-tag.entry.js +2 -2
- package/dist/esm/bds-text-field.entry.js +10 -4
- package/dist/esm/bds-toggle.entry.js +5 -4
- package/dist/esm/bds-tooltip_2.entry.js +12 -9
- package/dist/esm/boreal-web-components.js +1 -1
- package/dist/esm/checkbox-form-association-cgdh1LO-.js +41 -0
- package/dist/esm/coreColors-Dwo1hcd9.js +8 -0
- package/dist/esm/{enum-C8mRvnTA.js → enum-DlVzZK7o.js} +4 -4
- package/dist/esm/form-associated.mixin-C4HM8wQe.js +31 -0
- package/dist/esm/{getOffset-DKPjeBHi.js → getOffset-DCLpJBcp.js} +4 -51
- package/dist/esm/{form-associated.mixin-CvK2d92c.js → internals-DfaYciGa.js} +1 -31
- package/dist/esm/loader.js +1 -1
- package/dist/esm/orientation-CPvuMm5C.js +6 -0
- package/dist/esm-es5/KeyboardController-DcnXb5F5.js +1 -0
- package/dist/esm-es5/Keys-7G4h4DI7.js +1 -0
- package/dist/esm-es5/Logger-iq2UuV7c.js +1 -0
- package/dist/esm-es5/{attributes-CaHOghy5.js → attributes-U9yfbs7i.js} +1 -1
- package/dist/esm-es5/bds-avatar.entry.js +1 -1
- package/dist/esm-es5/bds-badge.entry.js +1 -1
- package/dist/esm-es5/bds-banner.entry.js +1 -1
- package/dist/esm-es5/bds-breadcrumb-item.entry.js +1 -0
- package/dist/esm-es5/bds-breadcrumb.entry.js +1 -0
- package/dist/esm-es5/bds-button-group.entry.js +1 -0
- package/dist/esm-es5/bds-button.entry.js +1 -1
- package/dist/esm-es5/bds-checkbox-button.entry.js +1 -0
- package/dist/esm-es5/bds-checkbox-card.entry.js +1 -0
- package/dist/esm-es5/bds-checkbox-group.entry.js +1 -0
- package/dist/esm-es5/bds-checkbox.entry.js +1 -1
- package/dist/esm-es5/bds-dialog.entry.js +1 -1
- package/dist/esm-es5/bds-divider.entry.js +1 -1
- package/dist/esm-es5/bds-flag.entry.js +1 -1
- package/dist/esm-es5/bds-grid-item.entry.js +1 -1
- package/dist/esm-es5/bds-grid.entry.js +1 -1
- package/dist/esm-es5/bds-list-menu-item.entry.js +1 -1
- package/dist/esm-es5/bds-list-menu.entry.js +1 -1
- package/dist/esm-es5/bds-popover.entry.js +1 -1
- package/dist/esm-es5/bds-radio-button.entry.js +1 -0
- package/dist/esm-es5/bds-radio-card.entry.js +1 -0
- package/dist/esm-es5/bds-radio-group.entry.js +1 -0
- package/dist/esm-es5/bds-radio.entry.js +1 -0
- package/dist/esm-es5/bds-select.entry.js +1 -0
- package/dist/esm-es5/bds-slider.entry.js +1 -0
- package/dist/esm-es5/bds-spinner.entry.js +1 -1
- package/dist/esm-es5/bds-status.entry.js +1 -1
- package/dist/esm-es5/bds-tag.entry.js +1 -1
- package/dist/esm-es5/bds-text-field.entry.js +1 -1
- package/dist/esm-es5/bds-toggle.entry.js +1 -1
- package/dist/esm-es5/bds-tooltip_2.entry.js +1 -1
- package/dist/esm-es5/boreal-web-components.js +1 -1
- package/dist/esm-es5/checkbox-form-association-cgdh1LO-.js +1 -0
- package/dist/esm-es5/coreColors-Dwo1hcd9.js +1 -0
- package/dist/esm-es5/enum-DlVzZK7o.js +1 -0
- package/dist/esm-es5/form-associated.mixin-C4HM8wQe.js +1 -0
- package/dist/esm-es5/getOffset-DCLpJBcp.js +1 -0
- package/dist/esm-es5/internals-DfaYciGa.js +1 -0
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/orientation-CPvuMm5C.js +1 -0
- package/dist/scss/maps/_theme-connect.scss +16 -1
- package/dist/scss/maps/_theme-engage.scss +16 -1
- package/dist/scss/maps/_theme-protect.scss +16 -1
- package/dist/scss/maps/_theme-proximus.scss +16 -1
- package/dist/scss/variables/_theme-connect.scss +16 -1
- package/dist/scss/variables/_theme-engage.scss +16 -1
- package/dist/scss/variables/_theme-protect.scss +16 -1
- package/dist/scss/variables/_theme-proximus.scss +16 -1
- package/dist/types/components/actions/bds-button/bds-button.d.ts +8 -4
- package/dist/types/components/actions/bds-button/types/enum.d.ts +3 -3
- package/dist/types/components/actions/bds-button-group/bds-button-group.d.ts +40 -0
- package/dist/types/components/actions/bds-button-group/types/IButtonGroup.d.ts +11 -0
- package/dist/types/components/actions/bds-list-menu/bds-list-menu/bds-list-menu.d.ts +32 -15
- package/dist/types/components/actions/bds-list-menu/bds-list-menu/types/IListMenu.d.ts +17 -0
- package/dist/types/components/actions/bds-list-menu/bds-list-menu/types/enum.d.ts +5 -0
- package/dist/types/components/actions/bds-list-menu/bds-list-menu/types/types.d.ts +3 -0
- package/dist/types/components/actions/bds-list-menu/bds-list-menu-item/bds-list-menu-item.d.ts +10 -1
- package/dist/types/components/actions/bds-list-menu/bds-list-menu-item/types/IListMenuItem.d.ts +2 -0
- package/dist/types/components/actions/bds-toggle/types/IToggle.d.ts +1 -1
- package/dist/types/components/forms/bds-checkbox/{bds-checkbox.d.ts → bds-checkbox/bds-checkbox.d.ts} +24 -9
- package/dist/types/components/forms/bds-checkbox/bds-checkbox-button/bds-checkbox-button.d.ts +68 -0
- package/dist/types/components/forms/bds-checkbox/bds-checkbox-button/types/ICheckboxButton.d.ts +15 -0
- package/dist/types/components/forms/bds-checkbox/bds-checkbox-card/bds-checkbox-card.d.ts +63 -0
- package/dist/types/components/forms/bds-checkbox/bds-checkbox-card/types/ICheckboxCard.d.ts +9 -0
- package/dist/types/components/forms/bds-checkbox/bds-checkbox-group/bds-checkbox-group.d.ts +86 -0
- package/dist/types/components/forms/bds-checkbox/bds-checkbox-group/types/ICheckboxGroup.d.ts +27 -0
- package/dist/types/components/forms/bds-checkbox/bds-checkbox-group/types/enum.d.ts +6 -0
- package/dist/types/components/forms/bds-checkbox/bds-checkbox-group/types/index.d.ts +4 -0
- package/dist/types/components/forms/bds-checkbox/bds-checkbox-group/types/types.d.ts +4 -0
- package/dist/types/components/forms/bds-checkbox/types/ICheckbox.d.ts +7 -22
- package/dist/types/components/forms/bds-checkbox/utils/checkbox-form-association.d.ts +10 -0
- package/dist/types/components/forms/bds-checkbox/utils/index.d.ts +2 -0
- package/dist/types/components/forms/bds-radio/bds-radio/bds-radio.d.ts +36 -0
- package/dist/types/components/forms/bds-radio/bds-radio/types/IRadio.d.ts +13 -0
- package/dist/types/components/forms/bds-radio/bds-radio-button/bds-radio-button.d.ts +36 -0
- package/dist/types/components/forms/bds-radio/bds-radio-button/types/IRadioButton.d.ts +14 -0
- package/dist/types/components/forms/bds-radio/bds-radio-card/bds-radio-card.d.ts +57 -0
- package/dist/types/components/forms/bds-radio/bds-radio-card/types/IRadioCard.d.ts +14 -0
- package/dist/types/components/forms/bds-radio/bds-radio-group/bds-radio-group.d.ts +85 -0
- package/dist/types/components/forms/bds-radio/bds-radio-group/types/IRadioGroup.d.ts +20 -0
- package/dist/types/components/forms/bds-radio/bds-radio-group/types/enum.d.ts +6 -0
- package/dist/types/components/forms/bds-radio/bds-radio-group/types/types.d.ts +3 -0
- package/dist/types/components/forms/bds-select/bds-select.d.ts +98 -0
- package/dist/types/components/forms/bds-select/types/ISelect.d.ts +6 -0
- package/dist/types/components/forms/bds-slider/bds-slider.d.ts +176 -0
- package/dist/types/components/forms/bds-slider/helpers/SliderDOMController.d.ts +38 -0
- package/dist/types/components/forms/bds-slider/helpers/SliderService.d.ts +44 -0
- package/dist/types/components/forms/bds-slider/helpers/index.d.ts +4 -0
- package/dist/types/components/forms/bds-slider/helpers/parseValues.d.ts +18 -0
- package/dist/types/components/forms/bds-slider/types/ChangeDetail.d.ts +9 -0
- package/dist/types/components/forms/bds-slider/types/ISlider.d.ts +17 -0
- package/dist/types/components/forms/bds-slider/types/ISliderOptions.d.ts +31 -0
- package/dist/types/components/forms/bds-slider/types/enum.d.ts +17 -0
- package/dist/types/components/forms/bds-slider/types/index.d.ts +6 -0
- package/dist/types/components/forms/bds-slider/types/types.d.ts +5 -0
- package/dist/types/components/forms/bds-text-field/bds-text-field.d.ts +4 -0
- package/dist/types/components/navigation/bds-breadcrumb/bds-breadcrumb.d.ts +57 -0
- package/dist/types/components/navigation/bds-breadcrumb/types/IBreadcrumb.d.ts +17 -0
- package/dist/types/components/navigation/bds-breadcrumb-item/bds-breadcrumb-item.d.ts +83 -0
- package/dist/types/components/navigation/bds-breadcrumb-item/types/IBreadcrumbItem.d.ts +20 -0
- package/dist/types/components/overlays/bds-popover/bds-popover.d.ts +4 -0
- package/dist/types/components/titles-text/bds-typography/bds-typography.d.ts +2 -46
- package/dist/types/components/titles-text/bds-typography/types/ITypography.d.ts +1 -0
- package/dist/types/components.d.ts +2187 -450
- package/dist/types/mixins/menu-behavior.mixin.d.ts +5 -1
- package/dist/types/types/form.d.ts +24 -0
- package/dist/types/types/index.d.ts +2 -1
- package/dist/types/types/orientation.d.ts +6 -0
- package/dist/types/utils/a11y/index.d.ts +4 -0
- package/dist/types/utils/a11y/keyboard/KeyboardController.d.ts +321 -0
- package/dist/types/utils/a11y/keyboard/_constants.d.ts +28 -0
- package/dist/types/utils/a11y/keyboard/focus/aria-activedescendant.d.ts +17 -0
- package/dist/types/utils/a11y/keyboard/focus/resolve.d.ts +23 -0
- package/dist/types/utils/a11y/keyboard/focus/roving-tabindex.d.ts +20 -0
- package/dist/types/utils/a11y/keyboard/navigation/grid-navigation.d.ts +9 -0
- package/dist/types/utils/a11y/keyboard/navigation/linear-navigation.d.ts +13 -0
- package/dist/types/utils/a11y/keyboard/types/IKeyboardController.d.ts +125 -0
- package/dist/types/utils/a11y/keyboard/types/index.d.ts +3 -0
- package/dist/types/utils/a11y/keyboard/types/types.d.ts +6 -0
- package/dist/types/utils/constants/common/Keys.d.ts +28 -14
- package/dist/types/utils/dom/elements.d.ts +41 -0
- package/dist/types/utils/menu/menu-item.utils.d.ts +2 -2
- package/dist/types/utils/testing/helpers.d.ts +8 -0
- package/package.json +1 -1
- package/components-build/p-B8n1ru5i.js +0 -1
- package/components-build/p-CGdxFth9.js +0 -1
- package/components-build/p-CrAt6pGl.js +0 -1
- package/components-build/p-DCwT43Kz.js +0 -1
- package/components-build/p-DIY3CDNL.js +0 -1
- package/dist/boreal-web-components/p-0028481c.entry.js +0 -1
- package/dist/boreal-web-components/p-1466de58.system.entry.js +0 -1
- package/dist/boreal-web-components/p-2b8bd1dd.entry.js +0 -1
- package/dist/boreal-web-components/p-32c23246.system.entry.js +0 -1
- package/dist/boreal-web-components/p-3fbcc233.entry.js +0 -1
- package/dist/boreal-web-components/p-401f1aee.system.entry.js +0 -1
- package/dist/boreal-web-components/p-41b48701.system.entry.js +0 -1
- package/dist/boreal-web-components/p-41cac1b8.system.entry.js +0 -1
- package/dist/boreal-web-components/p-627b19a5.system.entry.js +0 -1
- package/dist/boreal-web-components/p-649737e5.entry.js +0 -1
- package/dist/boreal-web-components/p-64cb5825.entry.js +0 -1
- package/dist/boreal-web-components/p-6a99f4c6.system.entry.js +0 -1
- package/dist/boreal-web-components/p-731b88cc.entry.js +0 -1
- package/dist/boreal-web-components/p-74c13bed.system.entry.js +0 -1
- package/dist/boreal-web-components/p-7f7ac40f.entry.js +0 -1
- package/dist/boreal-web-components/p-82d49661.entry.js +0 -1
- package/dist/boreal-web-components/p-83ca193e.entry.js +0 -1
- package/dist/boreal-web-components/p-BQ_zoZa2.js +0 -1
- package/dist/boreal-web-components/p-C8mRvnTA.js +0 -1
- package/dist/boreal-web-components/p-CdKFZYxk.system.js +0 -1
- package/dist/boreal-web-components/p-CtknSula.system.js +0 -1
- package/dist/boreal-web-components/p-CvK2d92c.js +0 -1
- package/dist/boreal-web-components/p-CzYQb3pP.js +0 -1
- package/dist/boreal-web-components/p-DZcx75cy.system.js +0 -1
- package/dist/boreal-web-components/p-Dme-NuTD.system.js +0 -1
- package/dist/boreal-web-components/p-ab5ffa15.system.entry.js +0 -1
- package/dist/boreal-web-components/p-ba2b625a.system.entry.js +0 -1
- package/dist/boreal-web-components/p-bf2ef10b.entry.js +0 -1
- package/dist/boreal-web-components/p-c7aee9f4.system.entry.js +0 -1
- package/dist/cjs/Keys-DbIXSJF2.js +0 -22
- package/dist/collection/components/forms/bds-checkbox/bds-checkbox.css +0 -90
- package/dist/esm/Keys-CzYQb3pP.js +0 -20
- package/dist/esm-es5/Keys-CzYQb3pP.js +0 -1
- package/dist/esm-es5/enum-C8mRvnTA.js +0 -1
- package/dist/esm-es5/form-associated.mixin-CvK2d92c.js +0 -1
- package/dist/esm-es5/getOffset-DKPjeBHi.js +0 -1
- package/dist/types/types/IFormProps.d.ts +0 -25
- /package/dist/collection/components/{helpers/types/IDivider.js → actions/bds-button-group/types/IButtonGroup.js} +0 -0
- /package/dist/collection/components/{helpers/types/types.js → actions/bds-list-menu/bds-list-menu/types/IListMenu.js} +0 -0
- /package/dist/collection/components/{layouts/bds-grid/grid-item → actions/bds-list-menu/bds-list-menu}/types/types.js +0 -0
- /package/dist/collection/components/{layouts/bds-grid/grid-item/types/IGridItem.js → forms/bds-checkbox/bds-checkbox-button/types/ICheckboxButton.js} +0 -0
- /package/dist/collection/components/{layouts/bds-grid/grid/types/IGrid.js → forms/bds-checkbox/bds-checkbox-card/types/ICheckboxCard.js} +0 -0
- /package/dist/collection/components/{layouts/bds-grid/grid/types/types.js → forms/bds-checkbox/bds-checkbox-group/types/ICheckboxGroup.js} +0 -0
- /package/dist/collection/{types/IFormProps.js → components/forms/bds-checkbox/bds-checkbox-group/types/types.js} +0 -0
- /package/dist/collection/components/helpers/{types → bds-divider/types}/enum.js +0 -0
- /package/dist/collection/components/layouts/bds-grid/{grid → bds-grid}/bds-grid.css +0 -0
- /package/dist/collection/components/layouts/bds-grid/{grid → bds-grid}/types/enum.js +0 -0
- /package/dist/collection/components/layouts/bds-grid/{grid → bds-grid}/types/index.js +0 -0
- /package/dist/collection/components/layouts/bds-grid/{grid-item → bds-grid-item}/bds-grid-item.css +0 -0
- /package/dist/collection/components/layouts/bds-grid/{grid-item → bds-grid-item}/types/enum.js +0 -0
- /package/dist/collection/components/layouts/bds-grid/{grid-item → bds-grid-item}/types/index.js +0 -0
- /package/dist/types/components/helpers/{bds-divider.d.ts → bds-divider/bds-divider.d.ts} +0 -0
- /package/dist/types/components/helpers/{types → bds-divider/types}/IDivider.d.ts +0 -0
- /package/dist/types/components/helpers/{types → bds-divider/types}/enum.d.ts +0 -0
- /package/dist/types/components/helpers/{types → bds-divider/types}/types.d.ts +0 -0
- /package/dist/types/components/layouts/bds-grid/{grid → bds-grid}/bds-grid.d.ts +0 -0
- /package/dist/types/components/layouts/bds-grid/{grid → bds-grid}/types/IGrid.d.ts +0 -0
- /package/dist/types/components/layouts/bds-grid/{grid → bds-grid}/types/enum.d.ts +0 -0
- /package/dist/types/components/layouts/bds-grid/{grid → bds-grid}/types/index.d.ts +0 -0
- /package/dist/types/components/layouts/bds-grid/{grid → bds-grid}/types/types.d.ts +0 -0
- /package/dist/types/components/layouts/bds-grid/{grid-item → bds-grid-item}/bds-grid-item.d.ts +0 -0
- /package/dist/types/components/layouts/bds-grid/{grid-item → bds-grid-item}/types/IGridItem.d.ts +0 -0
- /package/dist/types/components/layouts/bds-grid/{grid-item → bds-grid-item}/types/enum.d.ts +0 -0
- /package/dist/types/components/layouts/bds-grid/{grid-item → bds-grid-item}/types/index.d.ts +0 -0
- /package/dist/types/components/layouts/bds-grid/{grid-item → bds-grid-item}/types/types.d.ts +0 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
function isHTMLElement(cell) {
|
|
2
|
+
return cell != null;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Applies the **roving tabindex** technique with real DOM focus.
|
|
6
|
+
*
|
|
7
|
+
* Order matters for key-repeat: set `tabindex="0"` and call `.focus()` on the
|
|
8
|
+
* new item first, then demote the previous item. This ensures focus is never
|
|
9
|
+
* momentarily absent between steps.
|
|
10
|
+
*/
|
|
11
|
+
export function applyRovingTabindex(items, activeIndex) {
|
|
12
|
+
const next = items[activeIndex];
|
|
13
|
+
if (next == null)
|
|
14
|
+
return;
|
|
15
|
+
const prevIndex = items.findIndex(item => item.getAttribute('tabindex') === '0');
|
|
16
|
+
next.setAttribute('tabindex', '0');
|
|
17
|
+
next.focus();
|
|
18
|
+
if (prevIndex !== -1 && prevIndex !== activeIndex) {
|
|
19
|
+
items[prevIndex].setAttribute('tabindex', '-1');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Initializes the **roving tabindex** technique without stealing focus.
|
|
24
|
+
* Only sets tabindex attributes; use during component initialization to
|
|
25
|
+
* avoid moving DOM focus away from the previously focused element.
|
|
26
|
+
*/
|
|
27
|
+
export function initRovingTabindex(items, activeIndex) {
|
|
28
|
+
const activeItem = items[activeIndex];
|
|
29
|
+
if (activeItem == null)
|
|
30
|
+
return;
|
|
31
|
+
items.forEach(item => item.setAttribute('tabindex', '-1'));
|
|
32
|
+
activeItem.setAttribute('tabindex', '0');
|
|
33
|
+
}
|
|
34
|
+
/** Applies roving tabindex to a 2D grid. Moves real DOM focus to `(row, col)`. */
|
|
35
|
+
export function applyGridRovingTabindex(items, row, col) {
|
|
36
|
+
items
|
|
37
|
+
.flat()
|
|
38
|
+
.filter(isHTMLElement)
|
|
39
|
+
.forEach(item => item.setAttribute('tabindex', '-1'));
|
|
40
|
+
const cell = items[row]?.[col];
|
|
41
|
+
if (cell != null) {
|
|
42
|
+
cell.setAttribute('tabindex', '0');
|
|
43
|
+
cell.focus();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Sets tabindex attributes on a 2D grid without stealing focus; use during initialization. */
|
|
47
|
+
export function initGridRovingTabindex(items, row, col) {
|
|
48
|
+
items
|
|
49
|
+
.flat()
|
|
50
|
+
.filter(isHTMLElement)
|
|
51
|
+
.forEach(item => item.setAttribute('tabindex', '-1'));
|
|
52
|
+
const cell = items[row]?.[col];
|
|
53
|
+
if (cell != null)
|
|
54
|
+
cell.setAttribute('tabindex', '0');
|
|
55
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { KEYBOARD } from "../../../constants/index";
|
|
2
|
+
import { FOCUS_STRATEGY } from "../_constants";
|
|
3
|
+
import { applyGridRovingTabindex, initGridRovingTabindex } from "../focus/roving-tabindex";
|
|
4
|
+
import { applyGridAriaActiveDescendant } from "../focus/aria-activedescendant";
|
|
5
|
+
import { resolveGridCurrentPos } from "../focus/resolve";
|
|
6
|
+
function isHTMLElement(cell) {
|
|
7
|
+
return cell != null;
|
|
8
|
+
}
|
|
9
|
+
function getPositions(items) {
|
|
10
|
+
const positions = [];
|
|
11
|
+
items.forEach((rowItems, row) => {
|
|
12
|
+
rowItems.forEach((cell, col) => {
|
|
13
|
+
if (isHTMLElement(cell))
|
|
14
|
+
positions.push({ row, col, cell });
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
return positions;
|
|
18
|
+
}
|
|
19
|
+
function getRowPositions(items, row) {
|
|
20
|
+
return (items[row]
|
|
21
|
+
?.map((cell, col) => (isHTMLElement(cell) ? { row, col, cell } : null))
|
|
22
|
+
.filter((pos) => pos != null) ?? []);
|
|
23
|
+
}
|
|
24
|
+
function getCell(items, row, col) {
|
|
25
|
+
if (row < 0 || col < 0)
|
|
26
|
+
return null;
|
|
27
|
+
const cell = items.at(row)?.at(col);
|
|
28
|
+
return isHTMLElement(cell) ? cell : null;
|
|
29
|
+
}
|
|
30
|
+
function closestColumn(positions, col) {
|
|
31
|
+
return positions.reduce((closest, position) => {
|
|
32
|
+
if (closest == null)
|
|
33
|
+
return position;
|
|
34
|
+
return Math.abs(position.col - col) < Math.abs(closest.col - col) ? position : closest;
|
|
35
|
+
}, null);
|
|
36
|
+
}
|
|
37
|
+
function findRowWithCells(items, startRow, step, wrap) {
|
|
38
|
+
const rowCount = items.length;
|
|
39
|
+
let row = startRow;
|
|
40
|
+
for (let checked = 0; checked < rowCount; checked++) {
|
|
41
|
+
if (row < 0 || row >= rowCount) {
|
|
42
|
+
if (!wrap)
|
|
43
|
+
return -1;
|
|
44
|
+
row = row < 0 ? rowCount - 1 : 0;
|
|
45
|
+
}
|
|
46
|
+
if (getRowPositions(items, row).length > 0)
|
|
47
|
+
return row;
|
|
48
|
+
row += step;
|
|
49
|
+
}
|
|
50
|
+
return -1;
|
|
51
|
+
}
|
|
52
|
+
export function setupGridNavigation(config, ctrl) {
|
|
53
|
+
const { wrap = false, focusStrategy = { type: FOCUS_STRATEGY.ROVING_TABINDEX }, initialActiveSelector, onNavigate, onActivate, activateKeys = [KEYBOARD.Enter, KEYBOARD.Space], onPageUp, onPageDown, onEscape, repeatThrottleMs = 100, } = config;
|
|
54
|
+
const strategyType = focusStrategy.type;
|
|
55
|
+
const idPrefix = focusStrategy.type === FOCUS_STRATEGY.ARIA_ACTIVE_DESCENDANT
|
|
56
|
+
? (focusStrategy.idPrefix ?? `${ctrl.root?.tagName.toLowerCase() ?? 'bds-grid'}-item`)
|
|
57
|
+
: 'bds-grid-item';
|
|
58
|
+
ctrl.onStrategyResolved(strategyType, idPrefix);
|
|
59
|
+
const resolveItems = typeof config.items === 'function' ? config.items : () => config.items;
|
|
60
|
+
const applyFocus = (items, row, col) => {
|
|
61
|
+
const cell = items[row]?.[col];
|
|
62
|
+
if (cell == null)
|
|
63
|
+
return;
|
|
64
|
+
if (onNavigate != null) {
|
|
65
|
+
onNavigate(row, col, items);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (strategyType === FOCUS_STRATEGY.ARIA_ACTIVE_DESCENDANT) {
|
|
69
|
+
if (ctrl.root != null)
|
|
70
|
+
applyGridAriaActiveDescendant(items, row, col, ctrl.root, idPrefix);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
applyGridRovingTabindex(items, row, col);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const move = (dRow, dCol) => {
|
|
77
|
+
const items = resolveItems();
|
|
78
|
+
const positions = getPositions(items);
|
|
79
|
+
if (positions.length === 0)
|
|
80
|
+
return;
|
|
81
|
+
let { row, col } = resolveGridCurrentPos(items, strategyType, ctrl.root);
|
|
82
|
+
const currentCell = getCell(items, row, col);
|
|
83
|
+
if (!isHTMLElement(currentCell)) {
|
|
84
|
+
row = positions[0].row;
|
|
85
|
+
col = positions[0].col;
|
|
86
|
+
}
|
|
87
|
+
if (dRow !== 0) {
|
|
88
|
+
const nextRow = findRowWithCells(items, row + dRow, dRow > 0 ? 1 : -1, wrap);
|
|
89
|
+
if (nextRow === -1)
|
|
90
|
+
return;
|
|
91
|
+
const nextCell = closestColumn(getRowPositions(items, nextRow), col);
|
|
92
|
+
if (nextCell != null)
|
|
93
|
+
applyFocus(items, nextCell.row, nextCell.col);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const rowPositions = getRowPositions(items, row);
|
|
97
|
+
const currentRowIndex = rowPositions.findIndex(position => position.col === col);
|
|
98
|
+
const nextRowIndex = currentRowIndex + dCol;
|
|
99
|
+
if (nextRowIndex >= 0 && nextRowIndex < rowPositions.length) {
|
|
100
|
+
const nextCell = rowPositions[nextRowIndex];
|
|
101
|
+
applyFocus(items, nextCell.row, nextCell.col);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (wrap && items.length > 1) {
|
|
105
|
+
const nextRow = findRowWithCells(items, row + dCol, dCol > 0 ? 1 : -1, true);
|
|
106
|
+
if (nextRow === -1)
|
|
107
|
+
return;
|
|
108
|
+
const nextRowPositions = getRowPositions(items, nextRow);
|
|
109
|
+
const nextCell = dCol > 0 ? nextRowPositions[0] : nextRowPositions[nextRowPositions.length - 1];
|
|
110
|
+
applyFocus(items, nextCell.row, nextCell.col);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const edgeCell = dCol > 0 ? rowPositions[rowPositions.length - 1] : rowPositions[0];
|
|
114
|
+
applyFocus(items, edgeCell.row, edgeCell.col);
|
|
115
|
+
};
|
|
116
|
+
const moveToEdge = (boundary) => {
|
|
117
|
+
const items = resolveItems();
|
|
118
|
+
const positions = getPositions(items);
|
|
119
|
+
if (positions.length === 0)
|
|
120
|
+
return;
|
|
121
|
+
let { row } = resolveGridCurrentPos(items, strategyType, ctrl.root);
|
|
122
|
+
if (row === -1 || getRowPositions(items, row).length === 0)
|
|
123
|
+
row = positions[0].row;
|
|
124
|
+
switch (boundary) {
|
|
125
|
+
case 'row-start': {
|
|
126
|
+
const first = getRowPositions(items, row)[0];
|
|
127
|
+
applyFocus(items, first.row, first.col);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
case 'row-end': {
|
|
131
|
+
const rowPositions = getRowPositions(items, row);
|
|
132
|
+
const last = rowPositions[rowPositions.length - 1];
|
|
133
|
+
applyFocus(items, last.row, last.col);
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case 'grid-start':
|
|
137
|
+
applyFocus(items, positions[0].row, positions[0].col);
|
|
138
|
+
break;
|
|
139
|
+
case 'grid-end': {
|
|
140
|
+
const last = positions[positions.length - 1];
|
|
141
|
+
applyFocus(items, last.row, last.col);
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
let lastRepeatTime = 0;
|
|
147
|
+
const withThrottle = (fn) => (e) => {
|
|
148
|
+
if (e.repeat && repeatThrottleMs > 0) {
|
|
149
|
+
const now = Date.now();
|
|
150
|
+
if (now - lastRepeatTime < repeatThrottleMs)
|
|
151
|
+
return;
|
|
152
|
+
lastRepeatTime = now;
|
|
153
|
+
}
|
|
154
|
+
fn();
|
|
155
|
+
};
|
|
156
|
+
ctrl.register(KEYBOARD.ArrowLeft, withThrottle(() => move(0, -1)), { repeat: true });
|
|
157
|
+
ctrl.register(KEYBOARD.ArrowRight, withThrottle(() => move(0, +1)), { repeat: true });
|
|
158
|
+
ctrl.register(KEYBOARD.ArrowUp, withThrottle(() => move(-1, 0)), { repeat: true });
|
|
159
|
+
ctrl.register(KEYBOARD.ArrowDown, withThrottle(() => move(+1, 0)), { repeat: true });
|
|
160
|
+
ctrl.register(KEYBOARD.Home, () => moveToEdge('row-start'));
|
|
161
|
+
ctrl.register(KEYBOARD.End, () => moveToEdge('row-end'));
|
|
162
|
+
ctrl.register(['control', KEYBOARD.Home], () => moveToEdge('grid-start'));
|
|
163
|
+
ctrl.register(['control', KEYBOARD.End], () => moveToEdge('grid-end'));
|
|
164
|
+
if (onActivate != null && activateKeys.length > 0)
|
|
165
|
+
ctrl.register(activateKeys, onActivate);
|
|
166
|
+
if (onPageUp != null)
|
|
167
|
+
ctrl.register(KEYBOARD.PageUp, onPageUp);
|
|
168
|
+
if (onPageDown != null)
|
|
169
|
+
ctrl.register(KEYBOARD.PageDown, onPageDown);
|
|
170
|
+
if (onEscape != null)
|
|
171
|
+
ctrl.register(KEYBOARD.Escape, onEscape);
|
|
172
|
+
if (ctrl.root != null && ctrl.abortController != null) {
|
|
173
|
+
const items = resolveItems();
|
|
174
|
+
const positions = getPositions(items);
|
|
175
|
+
if (positions.length > 0) {
|
|
176
|
+
const selected = initialActiveSelector != null
|
|
177
|
+
? positions.find(position => position.cell.matches(initialActiveSelector))
|
|
178
|
+
: undefined;
|
|
179
|
+
const initial = selected ?? positions[0];
|
|
180
|
+
if (strategyType === FOCUS_STRATEGY.ARIA_ACTIVE_DESCENDANT) {
|
|
181
|
+
applyGridAriaActiveDescendant(items, initial.row, initial.col, ctrl.root, idPrefix);
|
|
182
|
+
const root = ctrl.root;
|
|
183
|
+
const { signal } = ctrl.abortController;
|
|
184
|
+
root.addEventListener('mousedown', (e) => {
|
|
185
|
+
e.preventDefault();
|
|
186
|
+
root.focus();
|
|
187
|
+
}, { signal });
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
initGridRovingTabindex(items, initial.row, initial.col);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { KEYBOARD } from "../../../constants/index";
|
|
2
|
+
import { KEYBOARD_ORIENTATIONS, NAV_BOUNDARY, FOCUS_STRATEGY } from "../_constants";
|
|
3
|
+
import { applyRovingTabindex, initRovingTabindex } from "../focus/roving-tabindex";
|
|
4
|
+
import { applyAriaActiveDescendant } from "../focus/aria-activedescendant";
|
|
5
|
+
import { resolveCurrentIndex } from "../focus/resolve";
|
|
6
|
+
// ─── Setup ────────────────────────────────────────────────────────────────────
|
|
7
|
+
/**
|
|
8
|
+
* Registers all key bindings for linear list navigation on the given controller.
|
|
9
|
+
* Called internally by `KeyboardController.setLinearNavigation`.
|
|
10
|
+
*/
|
|
11
|
+
export function setupLinearNavigation(config, ctrl) {
|
|
12
|
+
const { orientation = KEYBOARD_ORIENTATIONS.BOTH, wrap = true, focusStrategy = { type: FOCUS_STRATEGY.ROVING_TABINDEX }, initialActiveSelector, onNavigate, onItemActive, onActivate, activateKeys = [KEYBOARD.Enter, KEYBOARD.Space], onEscape, repeatThrottleMs = 100, } = config;
|
|
13
|
+
const strategyType = focusStrategy.type;
|
|
14
|
+
const idPrefix = focusStrategy.type === FOCUS_STRATEGY.ARIA_ACTIVE_DESCENDANT
|
|
15
|
+
? (focusStrategy.idPrefix ?? `${ctrl.root?.tagName.toLowerCase() ?? 'bds-nav'}-item`)
|
|
16
|
+
: 'bds-nav-item';
|
|
17
|
+
ctrl.onStrategyResolved(strategyType, idPrefix);
|
|
18
|
+
const resolveItems = typeof config.items === 'function'
|
|
19
|
+
? config.items
|
|
20
|
+
: () => Array.from(ctrl.root?.querySelectorAll(config.items) ?? []);
|
|
21
|
+
let prevIndex = -1;
|
|
22
|
+
const move = (delta, eventTarget) => {
|
|
23
|
+
const items = resolveItems();
|
|
24
|
+
if (items.length === 0)
|
|
25
|
+
return;
|
|
26
|
+
let current = resolveCurrentIndex(items, strategyType, ctrl.root);
|
|
27
|
+
// Fallback: in test environments document.activeElement may not reflect
|
|
28
|
+
// the dispatched event target, so use the event target when current is unresolved.
|
|
29
|
+
if (current === -1 && eventTarget != null) {
|
|
30
|
+
current = items.indexOf(eventTarget);
|
|
31
|
+
}
|
|
32
|
+
let next;
|
|
33
|
+
if (delta === NAV_BOUNDARY.FIRST) {
|
|
34
|
+
next = 0;
|
|
35
|
+
}
|
|
36
|
+
else if (delta === NAV_BOUNDARY.LAST) {
|
|
37
|
+
next = items.length - 1;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// When current is -1 (nothing active yet), treat as position -1 so
|
|
41
|
+
// +1 lands on 0 and -1 lands on the last item (with wrap) or 0 (no wrap).
|
|
42
|
+
const raw = (current === -1 ? (delta === 1 ? -1 : 0) : current) + delta;
|
|
43
|
+
if (raw < 0)
|
|
44
|
+
next = wrap ? items.length - 1 : 0;
|
|
45
|
+
else if (raw >= items.length)
|
|
46
|
+
next = wrap ? 0 : items.length - 1;
|
|
47
|
+
else
|
|
48
|
+
next = raw;
|
|
49
|
+
}
|
|
50
|
+
// Call onItemActive before focus strategies (so component can update state).
|
|
51
|
+
// Only used with aria-activedescendant since roving-tabindex uses :focus-visible.
|
|
52
|
+
if (onItemActive != null && strategyType === FOCUS_STRATEGY.ARIA_ACTIVE_DESCENDANT) {
|
|
53
|
+
const prevItem = prevIndex >= 0 ? items[prevIndex] : null;
|
|
54
|
+
onItemActive(items[next], prevItem);
|
|
55
|
+
}
|
|
56
|
+
if (onNavigate != null) {
|
|
57
|
+
onNavigate(next, items);
|
|
58
|
+
}
|
|
59
|
+
else if (strategyType === FOCUS_STRATEGY.ARIA_ACTIVE_DESCENDANT) {
|
|
60
|
+
if (ctrl.root != null)
|
|
61
|
+
applyAriaActiveDescendant(items, next, ctrl.root, idPrefix);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
applyRovingTabindex(items, next);
|
|
65
|
+
}
|
|
66
|
+
prevIndex = next;
|
|
67
|
+
};
|
|
68
|
+
const target = (e) => e.target;
|
|
69
|
+
// Throttle for key-repeat: the browser fires repeat events every ~50 ms
|
|
70
|
+
// (20/sec), which is too fast for smooth visual navigation. We limit repeat
|
|
71
|
+
// events to at most one per `repeatThrottleMs` (default 100 ms ≈ 10/sec).
|
|
72
|
+
let lastRepeatTime = 0;
|
|
73
|
+
const withThrottle = (fn) => (e) => {
|
|
74
|
+
if (e.repeat && repeatThrottleMs > 0) {
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
if (now - lastRepeatTime < repeatThrottleMs)
|
|
77
|
+
return;
|
|
78
|
+
lastRepeatTime = now;
|
|
79
|
+
}
|
|
80
|
+
fn(e);
|
|
81
|
+
};
|
|
82
|
+
// Arrow keys always repeat — holding a key navigates continuously.
|
|
83
|
+
if (orientation === KEYBOARD_ORIENTATIONS.HORIZONTAL || orientation === KEYBOARD_ORIENTATIONS.BOTH) {
|
|
84
|
+
ctrl.register(KEYBOARD.ArrowLeft, withThrottle(e => move(-1, target(e))), { repeat: true });
|
|
85
|
+
ctrl.register(KEYBOARD.ArrowRight, withThrottle(e => move(+1, target(e))), { repeat: true });
|
|
86
|
+
}
|
|
87
|
+
if (orientation === KEYBOARD_ORIENTATIONS.VERTICAL || orientation === KEYBOARD_ORIENTATIONS.BOTH) {
|
|
88
|
+
ctrl.register(KEYBOARD.ArrowUp, withThrottle(e => move(-1, target(e))), { repeat: true });
|
|
89
|
+
ctrl.register(KEYBOARD.ArrowDown, withThrottle(e => move(+1, target(e))), { repeat: true });
|
|
90
|
+
}
|
|
91
|
+
ctrl.register(KEYBOARD.Home, () => move(NAV_BOUNDARY.FIRST));
|
|
92
|
+
ctrl.register(KEYBOARD.End, () => move(NAV_BOUNDARY.LAST));
|
|
93
|
+
if (onActivate != null && activateKeys.length > 0)
|
|
94
|
+
ctrl.register(activateKeys, onActivate);
|
|
95
|
+
if (onEscape != null)
|
|
96
|
+
ctrl.register(KEYBOARD.Escape, onEscape);
|
|
97
|
+
if (ctrl.root != null && ctrl.abortController != null) {
|
|
98
|
+
const root = ctrl.root;
|
|
99
|
+
const { signal } = ctrl.abortController;
|
|
100
|
+
if (strategyType === FOCUS_STRATEGY.ARIA_ACTIVE_DESCENDANT) {
|
|
101
|
+
// Keep DOM focus on the container at all times (ARIA APG listbox pattern).
|
|
102
|
+
root.addEventListener('mousedown', (e) => {
|
|
103
|
+
e.preventDefault();
|
|
104
|
+
root.focus();
|
|
105
|
+
}, { signal });
|
|
106
|
+
}
|
|
107
|
+
// Auto-initialize focus state so the component doesn't need to manage
|
|
108
|
+
// tabIndex or aria-activedescendant manually after setLinearNavigation.
|
|
109
|
+
const items = resolveItems();
|
|
110
|
+
if (items.length > 0) {
|
|
111
|
+
let initial = resolveCurrentIndex(items, strategyType, root);
|
|
112
|
+
if (initial === -1 && initialActiveSelector != null) {
|
|
113
|
+
initial = items.findIndex(item => item.matches(initialActiveSelector));
|
|
114
|
+
}
|
|
115
|
+
// For roving-tabindex: always fall back to 0 — something must have tabindex="0".
|
|
116
|
+
// For aria-activedescendant: only initialize if a match was found.
|
|
117
|
+
const initialIndex = initial !== -1 ? initial : strategyType === FOCUS_STRATEGY.ROVING_TABINDEX ? 0 : -1;
|
|
118
|
+
if (initialIndex !== -1) {
|
|
119
|
+
if (onItemActive != null && strategyType === FOCUS_STRATEGY.ARIA_ACTIVE_DESCENDANT) {
|
|
120
|
+
onItemActive(items[initialIndex], null);
|
|
121
|
+
}
|
|
122
|
+
prevIndex = initialIndex;
|
|
123
|
+
if (strategyType === FOCUS_STRATEGY.ARIA_ACTIVE_DESCENDANT) {
|
|
124
|
+
applyAriaActiveDescendant(items, initialIndex, root, idPrefix);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
initRovingTabindex(items, initialIndex);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// aria-activedescendant with no pre-selected item: ensure items are not
|
|
132
|
+
// directly focusable (container holds focus via tabindex="0").
|
|
133
|
+
items.forEach(item => item.setAttribute('tabindex', '-1'));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* This prevents key name typing errors and provides a centralized definition of the keys available for implementation.
|
|
5
|
-
* Can use this page to find the keycodes: https://keycode.info/
|
|
2
|
+
* Keyboard key values matching `KeyboardEvent.key` exactly (W3C UI Events spec).
|
|
3
|
+
* Use in direct `event.key` comparisons and `.set()` bindings.
|
|
6
4
|
*/
|
|
7
5
|
export const KEYBOARD = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
6
|
+
// Navigation
|
|
7
|
+
ArrowUp: 'ArrowUp',
|
|
8
|
+
ArrowDown: 'ArrowDown',
|
|
9
|
+
ArrowLeft: 'ArrowLeft',
|
|
10
|
+
ArrowRight: 'ArrowRight',
|
|
11
|
+
Home: 'Home',
|
|
12
|
+
End: 'End',
|
|
13
|
+
// Action
|
|
14
|
+
Enter: 'Enter',
|
|
15
|
+
Escape: 'Escape',
|
|
16
|
+
Space: ' ',
|
|
17
|
+
Delete: 'Delete',
|
|
18
|
+
Backspace: 'Backspace',
|
|
19
|
+
// Paging
|
|
20
|
+
PageUp: 'PageUp',
|
|
21
|
+
PageDown: 'PageDown',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Modifier key identifiers in lowercase — match `event.key.toLowerCase()`.
|
|
25
|
+
* Never compared against `event.key` directly; detected via `event.altKey`, `event.ctrlKey`, etc.
|
|
26
|
+
* Use in `.set()` chord bindings: `.set([KEYBOARD_MODIFIERS.Control, KEYBOARD.ArrowRight], handler)`.
|
|
27
|
+
*/
|
|
28
|
+
export const KEYBOARD_MODIFIERS = {
|
|
29
|
+
Alt: 'alt',
|
|
30
|
+
Control: 'control',
|
|
31
|
+
Meta: 'meta',
|
|
32
|
+
Shift: 'shift',
|
|
28
33
|
};
|
|
@@ -20,3 +20,66 @@ export function hasSlotContent(el, slotName) {
|
|
|
20
20
|
return false;
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Method to return clean text from html element, removing extra spaces and line breaks.
|
|
25
|
+
* Removing tags and getting only the text content.
|
|
26
|
+
*
|
|
27
|
+
* @param el - HTML element to extract text from.
|
|
28
|
+
* @returns string with the clean text content of the element.
|
|
29
|
+
*/
|
|
30
|
+
export function getCleanText(el) {
|
|
31
|
+
const textContent = el;
|
|
32
|
+
if (textContent !== null) {
|
|
33
|
+
return textContent.textContent?.trim() || '';
|
|
34
|
+
}
|
|
35
|
+
return '';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Method to update a property of an HTML element, checking if the element is not null before updating.
|
|
39
|
+
*
|
|
40
|
+
* @param el - HTML element to update.
|
|
41
|
+
* @param prop - Property name to update.
|
|
42
|
+
* @param value - Value to set for the property.
|
|
43
|
+
*/
|
|
44
|
+
export function updateElementProp(el, prop, value) {
|
|
45
|
+
if (el !== null) {
|
|
46
|
+
el[prop] = value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Method to update an attribute of an HTML element, checking if the element is not null before updating.
|
|
51
|
+
* This method is used to update attributes that are not reflected as properties in the DOM, such as ARIA attributes.
|
|
52
|
+
*
|
|
53
|
+
* @param el - HTML element to update.
|
|
54
|
+
* @param attr - Attribute name to update.
|
|
55
|
+
* @param value - Value to set for the attribute.
|
|
56
|
+
*/
|
|
57
|
+
export function updateElementAttr(el, attr, value) {
|
|
58
|
+
if (el !== null && el !== undefined) {
|
|
59
|
+
el.setAttribute(attr, value);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Method to add an event listener to an HTML element, checking if the element is not null before adding the listener.
|
|
64
|
+
*
|
|
65
|
+
* @param el - HTML element to add the event listener to.
|
|
66
|
+
* @param event - Event name to listen for.
|
|
67
|
+
* @param handler - Event handler function or object to handle the event.
|
|
68
|
+
*/
|
|
69
|
+
export function addElementListener(el, event, handler) {
|
|
70
|
+
if (el !== null && el !== undefined) {
|
|
71
|
+
el.addEventListener(event, handler);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Method to remove an event listener from an HTML element, checking if the element is not null before removing the listener.
|
|
76
|
+
*
|
|
77
|
+
* @param el - HTML element to remove the event listener from.
|
|
78
|
+
* @param event - Event name to stop listening for.
|
|
79
|
+
* @param handler - Event handler function or object that was used to handle the event.
|
|
80
|
+
*/
|
|
81
|
+
export function removeElementListener(el, event, handler) {
|
|
82
|
+
if (el !== null && el !== undefined) {
|
|
83
|
+
el.removeEventListener(event, handler);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -25,20 +25,18 @@ export function resolveAriaSelected(role, selected) {
|
|
|
25
25
|
* Resolves the tabIndex attribute for keyboard navigation.
|
|
26
26
|
* @param {MenuItemRole} role - The role of the item.
|
|
27
27
|
* @param {boolean} disabled - Whether the item is currently disabled.
|
|
28
|
-
* @param {boolean} selected - Whether the item is currently selected.
|
|
29
28
|
* @param {boolean} active - Whether the item is currently active.
|
|
30
29
|
* @returns {number} - Returns 0 for focusable menu items, or -1 for disabled/options.
|
|
31
30
|
* @example
|
|
32
31
|
* const index = resolveTabIndex('menuitem', false); // returns 0
|
|
33
32
|
* const indexDisabled = resolveTabIndex('menuitem', true); // returns -1
|
|
34
33
|
*/
|
|
35
|
-
export function resolveTabIndex(role, disabled,
|
|
34
|
+
export function resolveTabIndex(role, disabled, active) {
|
|
36
35
|
if (disabled)
|
|
37
36
|
return -1;
|
|
38
|
-
if (role === 'option')
|
|
39
|
-
return selected || active ? 0 : -1;
|
|
40
|
-
if (role === 'menuitem')
|
|
37
|
+
if (role === 'option' || role === 'menuitem') {
|
|
41
38
|
return active ? 0 : -1;
|
|
39
|
+
}
|
|
42
40
|
return -1;
|
|
43
41
|
}
|
|
44
42
|
/**
|
|
@@ -46,6 +44,7 @@ export function resolveTabIndex(role, disabled, selected, active) {
|
|
|
46
44
|
* @param {KeyboardEvent} event - The keyboard event object from the listener.
|
|
47
45
|
* @param {HTMLElement[]} items - An array of focusable HTML elements within the menu.
|
|
48
46
|
* @param {number} currentIndex - The index of the currently focused item.
|
|
47
|
+
* @param {boolean} selected - The current selection state of the item (used for activation logic).
|
|
49
48
|
* @returns {void}
|
|
50
49
|
* @example
|
|
51
50
|
* handleMenuKeyNavigation(event, menuItems, 2);
|
|
@@ -55,16 +54,18 @@ export function handleMenuKeyNavigation(event, items, currentIndex) {
|
|
|
55
54
|
return;
|
|
56
55
|
let nextIndex = -1;
|
|
57
56
|
switch (event.key) {
|
|
58
|
-
case KEYBOARD.ArrowDown
|
|
57
|
+
case KEYBOARD.ArrowDown:
|
|
59
58
|
nextIndex = (currentIndex + 1) % items.length;
|
|
60
59
|
break;
|
|
61
|
-
case KEYBOARD.ArrowUp
|
|
60
|
+
case KEYBOARD.ArrowUp:
|
|
62
61
|
nextIndex = (currentIndex - 1 + items.length) % items.length;
|
|
63
62
|
break;
|
|
64
63
|
default:
|
|
65
64
|
return;
|
|
66
65
|
}
|
|
66
|
+
items.forEach(item => item.removeAttribute('active-item'));
|
|
67
67
|
items[nextIndex].focus();
|
|
68
|
+
items[nextIndex].setAttribute('active-item', '');
|
|
68
69
|
}
|
|
69
70
|
/** Prevents default browser behavior for specific navigation keys.
|
|
70
71
|
* @param {KeyboardEvent} e - The keyboard event to evaluate.
|
|
@@ -74,7 +75,7 @@ export function handleMenuKeyNavigation(event, items, currentIndex) {
|
|
|
74
75
|
* preventNavigationKeys(event);
|
|
75
76
|
*/
|
|
76
77
|
export function preventNavigationKeys(e) {
|
|
77
|
-
const navigationKeys = [KEYBOARD.ArrowDown
|
|
78
|
+
const navigationKeys = [KEYBOARD.ArrowDown, KEYBOARD.ArrowUp, KEYBOARD.Enter, KEYBOARD.Space];
|
|
78
79
|
if (navigationKeys.includes(e.key)) {
|
|
79
80
|
e.preventDefault();
|
|
80
81
|
}
|
|
@@ -14,3 +14,13 @@ export function assertExists(condition, message) {
|
|
|
14
14
|
throw new Error(message);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Dispatches a `keydown` event on the given element.
|
|
19
|
+
*
|
|
20
|
+
* @param el The target element.
|
|
21
|
+
* @param key The `KeyboardEvent.key` value to dispatch.
|
|
22
|
+
* @param init Optional overrides merged on top of the defaults (`bubbles: true`, `cancelable: true`).
|
|
23
|
+
*/
|
|
24
|
+
export function dispatchKey(el, key, init = {}) {
|
|
25
|
+
el.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, cancelable: true, ...init, key }));
|
|
26
|
+
}
|