@carbon/web-components 2.54.0 → 2.55.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/custom-elements.json +331 -187
- package/es/components/accordion/accordion.scss.js +1 -1
- package/es/components/ai-label/ai-label.scss.js +1 -1
- package/es/components/ai-skeleton/ai-skeleton.scss.js +1 -1
- package/es/components/badge-indicator/badge-indicator.scss.js +1 -1
- package/es/components/breadcrumb/breadcrumb.scss.js +1 -1
- package/es/components/button/button.d.ts +1 -1
- package/es/components/button/button.d.ts.map +1 -1
- package/es/components/button/button.js +7 -5
- package/es/components/button/button.js.map +1 -1
- package/es/components/button/button.scss.js +1 -1
- package/es/components/checkbox/checkbox.scss.js +1 -1
- package/es/components/code-snippet/code-snippet.scss.js +1 -1
- package/es/components/combo-box/combo-box.scss.js +1 -1
- package/es/components/combo-button/combo-button.scss.js +1 -1
- package/es/components/contained-list/contained-list.scss.js +1 -1
- package/es/components/content-switcher/content-switcher.scss.js +1 -1
- package/es/components/copy-button/copy-button.scss.js +1 -1
- package/es/components/data-table/data-table.scss.js +1 -1
- package/es/components/date-picker/date-picker.scss.js +1 -1
- package/es/components/date-picker/date-picker.scss.js.map +1 -1
- package/es/components/dialog/dialog-body.js +1 -1
- package/es/components/dialog/dialog-close-button.js +1 -1
- package/es/components/dialog/dialog-footer.js +1 -1
- package/es/components/dialog/dialog-subtitle.js +1 -1
- package/es/components/dialog/dialog-title.js +1 -1
- package/es/components/dialog/dialog.d.ts +18 -7
- package/es/components/dialog/dialog.d.ts.map +1 -1
- package/es/components/dialog/dialog.js +51 -17
- package/es/components/dialog/dialog.js.map +1 -1
- package/es/components/dialog/dialog.scss.js +1 -1
- package/es/components/dialog/dialog.scss.js.map +1 -1
- package/es/components/dropdown/dropdown.scss.js +1 -1
- package/es/components/feature-flags/index.d.ts.map +1 -1
- package/es/components/feature-flags/index.js +8 -3
- package/es/components/feature-flags/index.js.map +1 -1
- package/es/components/file-uploader/file-uploader-button.d.ts.map +1 -1
- package/es/components/file-uploader/file-uploader-button.js +3 -2
- package/es/components/file-uploader/file-uploader-button.js.map +1 -1
- package/es/components/file-uploader/file-uploader-drop-container.d.ts +1 -1
- package/es/components/file-uploader/file-uploader-drop-container.d.ts.map +1 -1
- package/es/components/file-uploader/file-uploader-drop-container.js +3 -2
- package/es/components/file-uploader/file-uploader-drop-container.js.map +1 -1
- package/es/components/file-uploader/file-uploader-item.d.ts +4 -0
- package/es/components/file-uploader/file-uploader-item.d.ts.map +1 -1
- package/es/components/file-uploader/file-uploader-item.js +6 -0
- package/es/components/file-uploader/file-uploader-item.js.map +1 -1
- package/es/components/file-uploader/file-uploader.scss.js +1 -1
- package/es/components/file-uploader/file-uploader.scss.js.map +1 -1
- package/es/components/fluid-combo-box/fluid-combo-box.scss.js +1 -1
- package/es/components/fluid-dropdown/fluid-dropdown.scss.js +1 -1
- package/es/components/fluid-form/fluid-form.scss.js +1 -1
- package/es/components/fluid-multi-select/fluid-multi-select.scss.js +1 -1
- package/es/components/fluid-number-input/fluid-number-input.scss.js +1 -1
- package/es/components/fluid-password-input/fluid-password-input.scss.js +1 -1
- package/es/components/fluid-search/fluid-search.scss.js +1 -1
- package/es/components/fluid-select/fluid-select.scss.js +1 -1
- package/es/components/fluid-text-input/fluid-text-input.scss.js +1 -1
- package/es/components/fluid-textarea/fluid-textarea.scss.js +1 -1
- package/es/components/fluid-time-picker/fluid-time-picker.scss.js +1 -1
- package/es/components/form/form-item.scss.js +1 -1
- package/es/components/form/form.scss.js +1 -1
- package/es/components/form-group/form-group.scss.js +1 -1
- package/es/components/heading/heading.scss.js +1 -1
- package/es/components/icon-button/icon-button.scss.js +1 -1
- package/es/components/icon-indicator/icon-indicator.scss.js +1 -1
- package/es/components/inline-loading/inline-loading.scss.js +1 -1
- package/es/components/link/link.d.ts +1 -1
- package/es/components/link/link.d.ts.map +1 -1
- package/es/components/link/link.js.map +1 -1
- package/es/components/link/link.scss.js +1 -1
- package/es/components/list/list.scss.js +1 -1
- package/es/components/loading/loading.scss.js +1 -1
- package/es/components/menu/menu-item.d.ts.map +1 -1
- package/es/components/menu/menu-item.js +3 -3
- package/es/components/menu/menu-item.js.map +1 -1
- package/es/components/menu/menu-item.scss.js +1 -1
- package/es/components/menu/menu.scss.js +1 -1
- package/es/components/menu-button/menu-button.scss.js +1 -1
- package/es/components/modal/modal-base.d.ts +144 -0
- package/es/components/modal/modal-base.d.ts.map +1 -0
- package/es/components/modal/modal-base.js +229 -0
- package/es/components/modal/modal-base.js.map +1 -0
- package/es/components/modal/modal.d.ts +15 -89
- package/es/components/modal/modal.d.ts.map +1 -1
- package/es/components/modal/modal.js +66 -169
- package/es/components/modal/modal.js.map +1 -1
- package/es/components/modal/modal.scss.js +1 -1
- package/es/components/modal/modal.scss.js.map +1 -1
- package/es/components/multi-select/multi-select.d.ts +4 -0
- package/es/components/multi-select/multi-select.d.ts.map +1 -1
- package/es/components/multi-select/multi-select.js +4 -1
- package/es/components/multi-select/multi-select.js.map +1 -1
- package/es/components/multi-select/multi-select.scss.js +1 -1
- package/es/components/notification/actionable-notification.scss.js +1 -1
- package/es/components/notification/inline-notification.scss.js +1 -1
- package/es/components/notification/toast-notification.scss.js +1 -1
- package/es/components/number-input/number-input.scss.js +1 -1
- package/es/components/overflow-menu/overflow-menu-item.d.ts.map +1 -1
- package/es/components/overflow-menu/overflow-menu-item.js +4 -3
- package/es/components/overflow-menu/overflow-menu-item.js.map +1 -1
- package/es/components/overflow-menu/overflow-menu.scss.js +1 -1
- package/es/components/page-header/index.d.ts +4 -0
- package/es/components/page-header/index.d.ts.map +1 -1
- package/es/components/page-header/page-header-breadcrumb.d.ts +7 -0
- package/es/components/page-header/page-header-breadcrumb.d.ts.map +1 -1
- package/es/components/page-header/page-header-breadcrumb.js +7 -0
- package/es/components/page-header/page-header-breadcrumb.js.map +1 -1
- package/es/components/page-header/page-header-content-text.d.ts +7 -0
- package/es/components/page-header/page-header-content-text.d.ts.map +1 -1
- package/es/components/page-header/page-header-content-text.js +7 -0
- package/es/components/page-header/page-header-content-text.js.map +1 -1
- package/es/components/page-header/page-header-content.d.ts +7 -0
- package/es/components/page-header/page-header-content.d.ts.map +1 -1
- package/es/components/page-header/page-header-content.js +7 -0
- package/es/components/page-header/page-header-content.js.map +1 -1
- package/es/components/page-header/page-header-hero-image.d.ts +7 -0
- package/es/components/page-header/page-header-hero-image.d.ts.map +1 -1
- package/es/components/page-header/page-header-hero-image.js +7 -0
- package/es/components/page-header/page-header-hero-image.js.map +1 -1
- package/es/components/page-header/page-header-tabs.d.ts +7 -0
- package/es/components/page-header/page-header-tabs.d.ts.map +1 -1
- package/es/components/page-header/page-header-tabs.js +7 -0
- package/es/components/page-header/page-header-tabs.js.map +1 -1
- package/es/components/page-header/page-header.d.ts +7 -0
- package/es/components/page-header/page-header.d.ts.map +1 -1
- package/es/components/page-header/page-header.js +7 -0
- package/es/components/page-header/page-header.js.map +1 -1
- package/es/components/page-header/page-header.scss.js +1 -1
- package/es/components/page-header/page-header.scss.js.map +1 -1
- package/es/components/pagination/pagination.scss.js +1 -1
- package/es/components/pagination-nav/pagination-nav.scss.js +1 -1
- package/es/components/password-input/password-input.scss.js +1 -1
- package/es/components/popover/popover.scss.js +1 -1
- package/es/components/progress-bar/progress-bar.scss.js +1 -1
- package/es/components/progress-indicator/progress-indicator.scss.js +1 -1
- package/es/components/radio-button/radio-button.scss.js +1 -1
- package/es/components/search/search.d.ts +4 -0
- package/es/components/search/search.d.ts.map +1 -1
- package/es/components/search/search.js +4 -1
- package/es/components/search/search.js.map +1 -1
- package/es/components/search/search.scss.js +1 -1
- package/es/components/select/select.scss.js +1 -1
- package/es/components/shape-indicator/shape-indicator.scss.js +1 -1
- package/es/components/side-panel/side-panel.d.ts +1 -1
- package/es/components/side-panel/side-panel.js +1 -1
- package/es/components/side-panel/side-panel.js.map +1 -1
- package/es/components/skeleton-icon/skeleton-icon.scss.js +1 -1
- package/es/components/skeleton-placeholder/skeleton-placeholder.scss.js +1 -1
- package/es/components/skeleton-text/skeleton-text.scss.js +1 -1
- package/es/components/skip-to-content/skip-to-content.scss.js +1 -1
- package/es/components/slider/slider.scss.js +1 -1
- package/es/components/slug/slug.scss.js +1 -1
- package/es/components/stack/stack.scss.js +1 -1
- package/es/components/structured-list/structured-list.scss.js +1 -1
- package/es/components/tabs/defs.d.ts +26 -0
- package/es/components/tabs/defs.d.ts.map +1 -1
- package/es/components/tabs/defs.js +28 -1
- package/es/components/tabs/defs.js.map +1 -1
- package/es/components/tabs/index.d.ts +1 -0
- package/es/components/tabs/index.d.ts.map +1 -1
- package/es/components/tabs/index.js +1 -0
- package/es/components/tabs/stories/tabs-wrapper.d.ts +9 -0
- package/es/components/tabs/stories/tabs-wrapper.d.ts.map +1 -1
- package/es/components/tabs/stories/tabs-wrapper.js +24 -10
- package/es/components/tabs/stories/tabs-wrapper.js.map +1 -1
- package/es/components/tabs/tab.d.ts +60 -1
- package/es/components/tabs/tab.d.ts.map +1 -1
- package/es/components/tabs/tab.js +76 -9
- package/es/components/tabs/tab.js.map +1 -1
- package/es/components/tabs/tabs-vertical.d.ts +29 -0
- package/es/components/tabs/tabs-vertical.d.ts.map +1 -0
- package/es/components/tabs/tabs-vertical.js +113 -0
- package/es/components/tabs/tabs-vertical.js.map +1 -0
- package/es/components/tabs/tabs.d.ts +34 -4
- package/es/components/tabs/tabs.d.ts.map +1 -1
- package/es/components/tabs/tabs.js +86 -19
- package/es/components/tabs/tabs.js.map +1 -1
- package/es/components/tabs/tabs.scss.js +1 -1
- package/es/components/tabs/tabs.scss.js.map +1 -1
- package/es/components/tag/tag.scss.js +1 -1
- package/es/components/tearsheet/tearsheet.d.ts +1 -1
- package/es/components/tearsheet/tearsheet.js +1 -1
- package/es/components/tearsheet/tearsheet.js.map +1 -1
- package/es/components/text-input/text-input.scss.js +1 -1
- package/es/components/textarea/textarea.scss.js +1 -1
- package/es/components/tile/clickable-tile.d.ts +1 -1
- package/es/components/tile/clickable-tile.d.ts.map +1 -1
- package/es/components/tile/clickable-tile.js +6 -1
- package/es/components/tile/clickable-tile.js.map +1 -1
- package/es/components/tile/radio-tile.d.ts +4 -1
- package/es/components/tile/radio-tile.d.ts.map +1 -1
- package/es/components/tile/radio-tile.js +23 -6
- package/es/components/tile/radio-tile.js.map +1 -1
- package/es/components/tile/tile.scss.js +1 -1
- package/es/components/tile/tile.scss.js.map +1 -1
- package/es/components/time-picker/time-picker.scss.js +1 -1
- package/es/components/toggle/toggle.scss.js +1 -1
- package/es/components/toggle-tip/toggletip.scss.js +1 -1
- package/es/components/tooltip/tooltip.scss.js +1 -1
- package/es/components/tree-view/tree-view.scss.js +1 -1
- package/es/components/ui-shell/header.scss.js +1 -1
- package/es/components/ui-shell/side-nav.scss.js +1 -1
- package/es/globals/decorators/carbon-element.js.map +1 -1
- package/es/index.js +1 -1
- package/es-custom/components/accordion/accordion.scss.js +1 -1
- package/es-custom/components/ai-label/ai-label.scss.js +1 -1
- package/es-custom/components/ai-skeleton/ai-skeleton.scss.js +1 -1
- package/es-custom/components/badge-indicator/badge-indicator.scss.js +1 -1
- package/es-custom/components/breadcrumb/breadcrumb.scss.js +1 -1
- package/es-custom/components/button/button.d.ts +1 -1
- package/es-custom/components/button/button.d.ts.map +1 -1
- package/es-custom/components/button/button.js +7 -5
- package/es-custom/components/button/button.js.map +1 -1
- package/es-custom/components/button/button.scss.js +1 -1
- package/es-custom/components/checkbox/checkbox.scss.js +1 -1
- package/es-custom/components/code-snippet/code-snippet.scss.js +1 -1
- package/es-custom/components/combo-box/combo-box.scss.js +1 -1
- package/es-custom/components/combo-button/combo-button.scss.js +1 -1
- package/es-custom/components/contained-list/contained-list.scss.js +1 -1
- package/es-custom/components/content-switcher/content-switcher.scss.js +1 -1
- package/es-custom/components/copy-button/copy-button.scss.js +1 -1
- package/es-custom/components/data-table/data-table.scss.js +1 -1
- package/es-custom/components/date-picker/date-picker.scss.js +1 -1
- package/es-custom/components/date-picker/date-picker.scss.js.map +1 -1
- package/es-custom/components/dialog/dialog-body.js +1 -1
- package/es-custom/components/dialog/dialog-close-button.js +1 -1
- package/es-custom/components/dialog/dialog-footer.js +1 -1
- package/es-custom/components/dialog/dialog-subtitle.js +1 -1
- package/es-custom/components/dialog/dialog-title.js +1 -1
- package/es-custom/components/dialog/dialog.d.ts +18 -7
- package/es-custom/components/dialog/dialog.d.ts.map +1 -1
- package/es-custom/components/dialog/dialog.js +51 -17
- package/es-custom/components/dialog/dialog.js.map +1 -1
- package/es-custom/components/dialog/dialog.scss.js +1 -1
- package/es-custom/components/dialog/dialog.scss.js.map +1 -1
- package/es-custom/components/dropdown/dropdown.scss.js +1 -1
- package/es-custom/components/feature-flags/index.d.ts.map +1 -1
- package/es-custom/components/feature-flags/index.js +8 -3
- package/es-custom/components/feature-flags/index.js.map +1 -1
- package/es-custom/components/file-uploader/file-uploader-button.d.ts.map +1 -1
- package/es-custom/components/file-uploader/file-uploader-button.js +3 -2
- package/es-custom/components/file-uploader/file-uploader-button.js.map +1 -1
- package/es-custom/components/file-uploader/file-uploader-drop-container.d.ts +1 -1
- package/es-custom/components/file-uploader/file-uploader-drop-container.d.ts.map +1 -1
- package/es-custom/components/file-uploader/file-uploader-drop-container.js +3 -2
- package/es-custom/components/file-uploader/file-uploader-drop-container.js.map +1 -1
- package/es-custom/components/file-uploader/file-uploader-item.d.ts +4 -0
- package/es-custom/components/file-uploader/file-uploader-item.d.ts.map +1 -1
- package/es-custom/components/file-uploader/file-uploader-item.js +6 -0
- package/es-custom/components/file-uploader/file-uploader-item.js.map +1 -1
- package/es-custom/components/file-uploader/file-uploader.scss.js +1 -1
- package/es-custom/components/file-uploader/file-uploader.scss.js.map +1 -1
- package/es-custom/components/fluid-combo-box/fluid-combo-box.scss.js +1 -1
- package/es-custom/components/fluid-dropdown/fluid-dropdown.scss.js +1 -1
- package/es-custom/components/fluid-form/fluid-form.scss.js +1 -1
- package/es-custom/components/fluid-multi-select/fluid-multi-select.scss.js +1 -1
- package/es-custom/components/fluid-number-input/fluid-number-input.scss.js +1 -1
- package/es-custom/components/fluid-password-input/fluid-password-input.scss.js +1 -1
- package/es-custom/components/fluid-search/fluid-search.scss.js +1 -1
- package/es-custom/components/fluid-select/fluid-select.scss.js +1 -1
- package/es-custom/components/fluid-text-input/fluid-text-input.scss.js +1 -1
- package/es-custom/components/fluid-textarea/fluid-textarea.scss.js +1 -1
- package/es-custom/components/fluid-time-picker/fluid-time-picker.scss.js +1 -1
- package/es-custom/components/form/form-item.scss.js +1 -1
- package/es-custom/components/form/form.scss.js +1 -1
- package/es-custom/components/form-group/form-group.scss.js +1 -1
- package/es-custom/components/heading/heading.scss.js +1 -1
- package/es-custom/components/icon-button/icon-button.scss.js +1 -1
- package/es-custom/components/icon-indicator/icon-indicator.scss.js +1 -1
- package/es-custom/components/inline-loading/inline-loading.scss.js +1 -1
- package/es-custom/components/link/link.d.ts +1 -1
- package/es-custom/components/link/link.d.ts.map +1 -1
- package/es-custom/components/link/link.js.map +1 -1
- package/es-custom/components/link/link.scss.js +1 -1
- package/es-custom/components/list/list.scss.js +1 -1
- package/es-custom/components/loading/loading.scss.js +1 -1
- package/es-custom/components/menu/menu-item.d.ts.map +1 -1
- package/es-custom/components/menu/menu-item.js +3 -3
- package/es-custom/components/menu/menu-item.js.map +1 -1
- package/es-custom/components/menu/menu-item.scss.js +1 -1
- package/es-custom/components/menu/menu.scss.js +1 -1
- package/es-custom/components/menu-button/menu-button.scss.js +1 -1
- package/es-custom/components/modal/modal-base.d.ts +144 -0
- package/es-custom/components/modal/modal-base.d.ts.map +1 -0
- package/es-custom/components/modal/modal-base.js +229 -0
- package/es-custom/components/modal/modal-base.js.map +1 -0
- package/es-custom/components/modal/modal.d.ts +15 -89
- package/es-custom/components/modal/modal.d.ts.map +1 -1
- package/es-custom/components/modal/modal.js +66 -169
- package/es-custom/components/modal/modal.js.map +1 -1
- package/es-custom/components/modal/modal.scss.js +1 -1
- package/es-custom/components/modal/modal.scss.js.map +1 -1
- package/es-custom/components/multi-select/multi-select.d.ts +4 -0
- package/es-custom/components/multi-select/multi-select.d.ts.map +1 -1
- package/es-custom/components/multi-select/multi-select.js +4 -1
- package/es-custom/components/multi-select/multi-select.js.map +1 -1
- package/es-custom/components/multi-select/multi-select.scss.js +1 -1
- package/es-custom/components/notification/actionable-notification.scss.js +1 -1
- package/es-custom/components/notification/inline-notification.scss.js +1 -1
- package/es-custom/components/notification/toast-notification.scss.js +1 -1
- package/es-custom/components/number-input/number-input.scss.js +1 -1
- package/es-custom/components/overflow-menu/overflow-menu-item.d.ts.map +1 -1
- package/es-custom/components/overflow-menu/overflow-menu-item.js +4 -3
- package/es-custom/components/overflow-menu/overflow-menu-item.js.map +1 -1
- package/es-custom/components/overflow-menu/overflow-menu.scss.js +1 -1
- package/es-custom/components/page-header/index.d.ts +4 -0
- package/es-custom/components/page-header/index.d.ts.map +1 -1
- package/es-custom/components/page-header/page-header-breadcrumb.d.ts +7 -0
- package/es-custom/components/page-header/page-header-breadcrumb.d.ts.map +1 -1
- package/es-custom/components/page-header/page-header-breadcrumb.js +7 -0
- package/es-custom/components/page-header/page-header-breadcrumb.js.map +1 -1
- package/es-custom/components/page-header/page-header-content-text.d.ts +7 -0
- package/es-custom/components/page-header/page-header-content-text.d.ts.map +1 -1
- package/es-custom/components/page-header/page-header-content-text.js +7 -0
- package/es-custom/components/page-header/page-header-content-text.js.map +1 -1
- package/es-custom/components/page-header/page-header-content.d.ts +7 -0
- package/es-custom/components/page-header/page-header-content.d.ts.map +1 -1
- package/es-custom/components/page-header/page-header-content.js +7 -0
- package/es-custom/components/page-header/page-header-content.js.map +1 -1
- package/es-custom/components/page-header/page-header-hero-image.d.ts +7 -0
- package/es-custom/components/page-header/page-header-hero-image.d.ts.map +1 -1
- package/es-custom/components/page-header/page-header-hero-image.js +7 -0
- package/es-custom/components/page-header/page-header-hero-image.js.map +1 -1
- package/es-custom/components/page-header/page-header-tabs.d.ts +7 -0
- package/es-custom/components/page-header/page-header-tabs.d.ts.map +1 -1
- package/es-custom/components/page-header/page-header-tabs.js +7 -0
- package/es-custom/components/page-header/page-header-tabs.js.map +1 -1
- package/es-custom/components/page-header/page-header.d.ts +7 -0
- package/es-custom/components/page-header/page-header.d.ts.map +1 -1
- package/es-custom/components/page-header/page-header.js +7 -0
- package/es-custom/components/page-header/page-header.js.map +1 -1
- package/es-custom/components/page-header/page-header.scss.js +1 -1
- package/es-custom/components/page-header/page-header.scss.js.map +1 -1
- package/es-custom/components/pagination/pagination.scss.js +1 -1
- package/es-custom/components/pagination-nav/pagination-nav.scss.js +1 -1
- package/es-custom/components/password-input/password-input.scss.js +1 -1
- package/es-custom/components/popover/popover.scss.js +1 -1
- package/es-custom/components/progress-bar/progress-bar.scss.js +1 -1
- package/es-custom/components/progress-indicator/progress-indicator.scss.js +1 -1
- package/es-custom/components/radio-button/radio-button.scss.js +1 -1
- package/es-custom/components/search/search.d.ts +4 -0
- package/es-custom/components/search/search.d.ts.map +1 -1
- package/es-custom/components/search/search.js +4 -1
- package/es-custom/components/search/search.js.map +1 -1
- package/es-custom/components/search/search.scss.js +1 -1
- package/es-custom/components/select/select.scss.js +1 -1
- package/es-custom/components/shape-indicator/shape-indicator.scss.js +1 -1
- package/es-custom/components/side-panel/side-panel.d.ts +1 -1
- package/es-custom/components/side-panel/side-panel.js +1 -1
- package/es-custom/components/side-panel/side-panel.js.map +1 -1
- package/es-custom/components/skeleton-icon/skeleton-icon.scss.js +1 -1
- package/es-custom/components/skeleton-placeholder/skeleton-placeholder.scss.js +1 -1
- package/es-custom/components/skeleton-text/skeleton-text.scss.js +1 -1
- package/es-custom/components/skip-to-content/skip-to-content.scss.js +1 -1
- package/es-custom/components/slider/slider.scss.js +1 -1
- package/es-custom/components/slug/slug.scss.js +1 -1
- package/es-custom/components/stack/stack.scss.js +1 -1
- package/es-custom/components/structured-list/structured-list.scss.js +1 -1
- package/es-custom/components/tabs/defs.d.ts +26 -0
- package/es-custom/components/tabs/defs.d.ts.map +1 -1
- package/es-custom/components/tabs/defs.js +28 -1
- package/es-custom/components/tabs/defs.js.map +1 -1
- package/es-custom/components/tabs/index.d.ts +1 -0
- package/es-custom/components/tabs/index.d.ts.map +1 -1
- package/es-custom/components/tabs/index.js +1 -0
- package/es-custom/components/tabs/stories/tabs-wrapper.d.ts +9 -0
- package/es-custom/components/tabs/stories/tabs-wrapper.d.ts.map +1 -1
- package/es-custom/components/tabs/stories/tabs-wrapper.js +24 -10
- package/es-custom/components/tabs/stories/tabs-wrapper.js.map +1 -1
- package/es-custom/components/tabs/tab.d.ts +60 -1
- package/es-custom/components/tabs/tab.d.ts.map +1 -1
- package/es-custom/components/tabs/tab.js +76 -9
- package/es-custom/components/tabs/tab.js.map +1 -1
- package/es-custom/components/tabs/tabs-vertical.d.ts +29 -0
- package/es-custom/components/tabs/tabs-vertical.d.ts.map +1 -0
- package/es-custom/components/tabs/tabs-vertical.js +113 -0
- package/es-custom/components/tabs/tabs-vertical.js.map +1 -0
- package/es-custom/components/tabs/tabs.d.ts +34 -4
- package/es-custom/components/tabs/tabs.d.ts.map +1 -1
- package/es-custom/components/tabs/tabs.js +86 -19
- package/es-custom/components/tabs/tabs.js.map +1 -1
- package/es-custom/components/tabs/tabs.scss.js +1 -1
- package/es-custom/components/tabs/tabs.scss.js.map +1 -1
- package/es-custom/components/tag/tag.scss.js +1 -1
- package/es-custom/components/tearsheet/tearsheet.d.ts +1 -1
- package/es-custom/components/tearsheet/tearsheet.js +1 -1
- package/es-custom/components/tearsheet/tearsheet.js.map +1 -1
- package/es-custom/components/text-input/text-input.scss.js +1 -1
- package/es-custom/components/textarea/textarea.scss.js +1 -1
- package/es-custom/components/tile/clickable-tile.d.ts +1 -1
- package/es-custom/components/tile/clickable-tile.d.ts.map +1 -1
- package/es-custom/components/tile/clickable-tile.js +6 -1
- package/es-custom/components/tile/clickable-tile.js.map +1 -1
- package/es-custom/components/tile/radio-tile.d.ts +4 -1
- package/es-custom/components/tile/radio-tile.d.ts.map +1 -1
- package/es-custom/components/tile/radio-tile.js +23 -6
- package/es-custom/components/tile/radio-tile.js.map +1 -1
- package/es-custom/components/tile/tile.scss.js +1 -1
- package/es-custom/components/tile/tile.scss.js.map +1 -1
- package/es-custom/components/time-picker/time-picker.scss.js +1 -1
- package/es-custom/components/toggle/toggle.scss.js +1 -1
- package/es-custom/components/toggle-tip/toggletip.scss.js +1 -1
- package/es-custom/components/tooltip/tooltip.scss.js +1 -1
- package/es-custom/components/tree-view/tree-view.scss.js +1 -1
- package/es-custom/components/ui-shell/header.scss.js +1 -1
- package/es-custom/components/ui-shell/side-nav.scss.js +1 -1
- package/es-custom/globals/decorators/carbon-element.js.map +1 -1
- package/es-custom/index.js +1 -1
- package/lib/components/button/button.d.ts +1 -1
- package/lib/components/button/button.d.ts.map +1 -1
- package/lib/components/dialog/dialog.d.ts +18 -7
- package/lib/components/dialog/dialog.d.ts.map +1 -1
- package/lib/components/feature-flags/index.d.ts.map +1 -1
- package/lib/components/file-uploader/file-uploader-button.d.ts.map +1 -1
- package/lib/components/file-uploader/file-uploader-drop-container.d.ts +1 -1
- package/lib/components/file-uploader/file-uploader-drop-container.d.ts.map +1 -1
- package/lib/components/file-uploader/file-uploader-item.d.ts +4 -0
- package/lib/components/file-uploader/file-uploader-item.d.ts.map +1 -1
- package/lib/components/link/link.d.ts +1 -1
- package/lib/components/link/link.d.ts.map +1 -1
- package/lib/components/menu/menu-item.d.ts.map +1 -1
- package/lib/components/modal/modal-base.d.ts +144 -0
- package/lib/components/modal/modal-base.d.ts.map +1 -0
- package/lib/components/modal/modal.d.ts +15 -89
- package/lib/components/modal/modal.d.ts.map +1 -1
- package/lib/components/multi-select/multi-select.d.ts +4 -0
- package/lib/components/multi-select/multi-select.d.ts.map +1 -1
- package/lib/components/overflow-menu/overflow-menu-item.d.ts.map +1 -1
- package/lib/components/page-header/index.d.ts +4 -0
- package/lib/components/page-header/index.d.ts.map +1 -1
- package/lib/components/page-header/page-header-breadcrumb.d.ts +7 -0
- package/lib/components/page-header/page-header-breadcrumb.d.ts.map +1 -1
- package/lib/components/page-header/page-header-content-text.d.ts +7 -0
- package/lib/components/page-header/page-header-content-text.d.ts.map +1 -1
- package/lib/components/page-header/page-header-content.d.ts +7 -0
- package/lib/components/page-header/page-header-content.d.ts.map +1 -1
- package/lib/components/page-header/page-header-hero-image.d.ts +7 -0
- package/lib/components/page-header/page-header-hero-image.d.ts.map +1 -1
- package/lib/components/page-header/page-header-tabs.d.ts +7 -0
- package/lib/components/page-header/page-header-tabs.d.ts.map +1 -1
- package/lib/components/page-header/page-header.d.ts +7 -0
- package/lib/components/page-header/page-header.d.ts.map +1 -1
- package/lib/components/search/search.d.ts +4 -0
- package/lib/components/search/search.d.ts.map +1 -1
- package/lib/components/side-panel/side-panel.d.ts +1 -1
- package/lib/components/tabs/defs.d.ts +26 -0
- package/lib/components/tabs/defs.d.ts.map +1 -1
- package/lib/components/tabs/defs.js +29 -0
- package/lib/components/tabs/defs.js.map +1 -1
- package/lib/components/tabs/index.d.ts +1 -0
- package/lib/components/tabs/index.d.ts.map +1 -1
- package/lib/components/tabs/stories/tabs-wrapper.d.ts +9 -0
- package/lib/components/tabs/stories/tabs-wrapper.d.ts.map +1 -1
- package/lib/components/tabs/tab.d.ts +60 -1
- package/lib/components/tabs/tab.d.ts.map +1 -1
- package/lib/components/tabs/tabs-vertical.d.ts +29 -0
- package/lib/components/tabs/tabs-vertical.d.ts.map +1 -0
- package/lib/components/tabs/tabs.d.ts +34 -4
- package/lib/components/tabs/tabs.d.ts.map +1 -1
- package/lib/components/tearsheet/tearsheet.d.ts +1 -1
- package/lib/components/tile/clickable-tile.d.ts +1 -1
- package/lib/components/tile/clickable-tile.d.ts.map +1 -1
- package/lib/components/tile/radio-tile.d.ts +4 -1
- package/lib/components/tile/radio-tile.d.ts.map +1 -1
- package/package.json +9 -9
- package/scss/components/date-picker/date-picker.scss +2 -1
- package/scss/components/dialog/dialog.scss +10 -4
- package/scss/components/file-uploader/file-uploader.scss +4 -0
- package/scss/components/modal/modal.scss +28 -1
- package/scss/components/page-header/page-header.scss +2 -0
- package/scss/components/tabs/tabs-story.scss +5 -0
- package/scss/components/tabs/tabs.scss +289 -6
- package/scss/components/tile/tile.scss +67 -1
- package/telemetry.yml +12 -6
|
@@ -14,7 +14,7 @@ import HostListener from "../../globals/decorators/host-listener.js";
|
|
|
14
14
|
import HostListenerMixin from "../../globals/mixins/host-listener.js";
|
|
15
15
|
import { NAVIGATION_DIRECTION } from "../content-switcher/defs.js";
|
|
16
16
|
import content_switcher_default from "../content-switcher/content-switcher.js";
|
|
17
|
-
import { TABS_ICON_SIZE, TABS_KEYBOARD_ACTION, TABS_TYPE } from "./defs.js";
|
|
17
|
+
import { TABS_ICON_SIZE, TABS_KEYBOARD_ACTION, TABS_SIZE, TABS_TYPE, VERTICAL_NAVIGATION_DIRECTION } from "./defs.js";
|
|
18
18
|
import tabs_default$1 from "./tabs.scss.js";
|
|
19
19
|
import { html } from "lit";
|
|
20
20
|
import { property, query, state } from "lit/decorators.js";
|
|
@@ -41,6 +41,8 @@ let CDSTabs = class CDSTabs extends HostListenerMixin(content_switcher_default)
|
|
|
41
41
|
this.selectedItemAssistiveText = "Selected an item.";
|
|
42
42
|
this.triggerContent = "";
|
|
43
43
|
this.type = "";
|
|
44
|
+
this.vertical = false;
|
|
45
|
+
this.fullWidth = false;
|
|
44
46
|
this._isIntersectionLeftTrackerInContent = true;
|
|
45
47
|
this._isIntersectionRightTrackerInContent = true;
|
|
46
48
|
this._observerIntersection = null;
|
|
@@ -53,6 +55,26 @@ let CDSTabs = class CDSTabs extends HostListenerMixin(content_switcher_default)
|
|
|
53
55
|
};
|
|
54
56
|
}
|
|
55
57
|
/**
|
|
58
|
+
* Propagates the layout size token to the host and all child tabs.
|
|
59
|
+
*/
|
|
60
|
+
_syncSizeToTabs() {
|
|
61
|
+
if (this.type === "contained") {
|
|
62
|
+
const size = this.getAttribute("size");
|
|
63
|
+
if (size) {
|
|
64
|
+
const value = `var(--cds-layout-size-height-${size})`;
|
|
65
|
+
this.style.setProperty(`--cds-layout-size-height`, value);
|
|
66
|
+
this.querySelectorAll(`cds-tab`).forEach((tab) => {
|
|
67
|
+
tab.style.setProperty(`--cds-layout-size-height`, value);
|
|
68
|
+
});
|
|
69
|
+
} else {
|
|
70
|
+
this.style.removeProperty(`--cds-layout-size-height`);
|
|
71
|
+
this.querySelectorAll(`cds-tab`).forEach((tab) => {
|
|
72
|
+
tab.style.removeProperty(`--cds-layout-size-height`);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
56
78
|
* Navigates through tabs.
|
|
57
79
|
*
|
|
58
80
|
* @param direction `-1` to navigate backward, `1` to navigate forward.
|
|
@@ -92,6 +114,18 @@ let CDSTabs = class CDSTabs extends HostListenerMixin(content_switcher_default)
|
|
|
92
114
|
item["highlighted"] = nextItem === item;
|
|
93
115
|
});
|
|
94
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Resets the selected state of all tabs, setting only the specified tab as selected.
|
|
119
|
+
*
|
|
120
|
+
* @param nextItem The tab item to be selected. If provided, only this item will be selected.
|
|
121
|
+
* If null or undefined, all tabs will have their selected state set to false.
|
|
122
|
+
*/
|
|
123
|
+
resetSelected(nextItem) {
|
|
124
|
+
const { selectorItem } = this.constructor;
|
|
125
|
+
forEach(this.querySelectorAll(selectorItem), (item) => {
|
|
126
|
+
item["selected"] = nextItem === item;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
95
129
|
_handleClick(event) {
|
|
96
130
|
super._handleClick(event);
|
|
97
131
|
const currentItem = this._getCurrentItem(event.target);
|
|
@@ -99,8 +133,9 @@ let CDSTabs = class CDSTabs extends HostListenerMixin(content_switcher_default)
|
|
|
99
133
|
}
|
|
100
134
|
_handleKeydown(event) {
|
|
101
135
|
const { key } = event;
|
|
102
|
-
const
|
|
103
|
-
const
|
|
136
|
+
const { selectorItemEnabled } = this.constructor;
|
|
137
|
+
const action = this.constructor.getAction(key, this.vertical);
|
|
138
|
+
const enabledTabs = this.querySelectorAll(selectorItemEnabled);
|
|
104
139
|
switch (action) {
|
|
105
140
|
case "home":
|
|
106
141
|
{
|
|
@@ -128,7 +163,8 @@ let CDSTabs = class CDSTabs extends HostListenerMixin(content_switcher_default)
|
|
|
128
163
|
break;
|
|
129
164
|
case "navigating":
|
|
130
165
|
{
|
|
131
|
-
|
|
166
|
+
event.preventDefault();
|
|
167
|
+
const direction = this.vertical ? VERTICAL_NAVIGATION_DIRECTION[key] : NAVIGATION_DIRECTION[key];
|
|
132
168
|
if (direction) this._navigate(direction);
|
|
133
169
|
}
|
|
134
170
|
break;
|
|
@@ -145,22 +181,24 @@ let CDSTabs = class CDSTabs extends HostListenerMixin(content_switcher_default)
|
|
|
145
181
|
}
|
|
146
182
|
}
|
|
147
183
|
_handleTabClosed(event) {
|
|
148
|
-
const { selectorItem, selectorItemEnabled, selectorItemSelected } = this.constructor;
|
|
184
|
+
const { selectorItem, selectorItemEnabled, selectorItemSelected, selectorItemHighlighted } = this.constructor;
|
|
149
185
|
const { index } = event.detail;
|
|
150
186
|
const allTabs = this.querySelectorAll(selectorItem);
|
|
151
187
|
const enabledTabsBeforeRemoval = this.querySelectorAll(selectorItemEnabled);
|
|
152
|
-
const activeItem = this.querySelector(selectorItemSelected);
|
|
153
188
|
const indexInEnabledTabs = Array.from(enabledTabsBeforeRemoval).indexOf(allTabs[index]);
|
|
154
|
-
const
|
|
189
|
+
const activeItemId = this.querySelector(selectorItemSelected)?.id;
|
|
190
|
+
const highlightedItemId = this.querySelector(selectorItemHighlighted)?.id;
|
|
155
191
|
requestAnimationFrame(() => {
|
|
156
|
-
const enabledTabs = this.querySelectorAll(selectorItemEnabled);
|
|
192
|
+
const enabledTabs = Array.from(this.querySelectorAll(selectorItemEnabled));
|
|
193
|
+
const tabWithActiveId = enabledTabs.find((tab) => tab.id === activeItemId);
|
|
194
|
+
const tabWithHighlightedId = enabledTabs.find((tab) => tab.id === highlightedItemId);
|
|
195
|
+
const nextHighlightedIndex = !tabWithActiveId && !tabWithHighlightedId && indexInEnabledTabs - 1 >= 0 ? indexInEnabledTabs - 1 : 0;
|
|
157
196
|
if (enabledTabs.length > 0) {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
nextHighlightedItem.highlighted = true;
|
|
197
|
+
const nextSelectedItem = tabWithActiveId || enabledTabs[0];
|
|
198
|
+
const nextHighlightedItem = tabWithHighlightedId || enabledTabs[nextHighlightedIndex];
|
|
199
|
+
this.resetSelected(nextSelectedItem);
|
|
200
|
+
this.resetHighlighted(nextHighlightedItem);
|
|
201
|
+
this.value = nextSelectedItem.value;
|
|
164
202
|
nextHighlightedItem.shadowRoot?.querySelector(`.cds--tabs__nav-link--dismissable`)?.focus();
|
|
165
203
|
nextHighlightedItem.scrollIntoView({
|
|
166
204
|
block: "nearest",
|
|
@@ -192,13 +230,30 @@ let CDSTabs = class CDSTabs extends HostListenerMixin(content_switcher_default)
|
|
|
192
230
|
default: break;
|
|
193
231
|
}
|
|
194
232
|
}
|
|
233
|
+
_syncSecondaryLabels() {
|
|
234
|
+
if (Array.from(this.querySelectorAll(`cds-tab`)).some((tab) => tab.hasAttribute("secondary-label"))) this.setAttribute("has-secondary-labels", "");
|
|
235
|
+
else this.removeAttribute("has-secondary-labels");
|
|
236
|
+
}
|
|
195
237
|
_handleSlotchange() {
|
|
196
238
|
super._handleSlotchange?.();
|
|
197
239
|
const { selectorItemSelected } = this.constructor;
|
|
198
240
|
const selectedItem = this.querySelector(selectorItemSelected);
|
|
199
241
|
const nextItem = this._getNextItem(selectedItem, 1);
|
|
200
242
|
if (nextItem) nextItem.hideDivider = true;
|
|
243
|
+
this._updateTabsVerticalAttribute();
|
|
244
|
+
this._syncSecondaryLabels();
|
|
201
245
|
this._updateTabsState();
|
|
246
|
+
this._syncSizeToTabs();
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Updates the vertical attribute on all child tabs based on the vertical property.
|
|
250
|
+
*/
|
|
251
|
+
_updateTabsVerticalAttribute() {
|
|
252
|
+
const { selectorItem } = this.constructor;
|
|
253
|
+
forEach(this.querySelectorAll(selectorItem), (tab) => {
|
|
254
|
+
if (this.vertical) tab.setAttribute("vertical", "");
|
|
255
|
+
else tab.removeAttribute("vertical");
|
|
256
|
+
});
|
|
202
257
|
}
|
|
203
258
|
_selectionDidChange(itemToSelect, interactionType) {
|
|
204
259
|
super._selectionDidChange(itemToSelect, interactionType);
|
|
@@ -236,7 +291,7 @@ let CDSTabs = class CDSTabs extends HostListenerMixin(content_switcher_default)
|
|
|
236
291
|
this._isScrollable = scrollWidth > clientWidth;
|
|
237
292
|
}
|
|
238
293
|
const { selectorItem } = this.constructor;
|
|
239
|
-
if (changedProperties.has("type") || changedProperties.has("iconSize")) {
|
|
294
|
+
if (changedProperties.has("type") || changedProperties.has("iconSize") || changedProperties.has("size")) {
|
|
240
295
|
this._totalTabs = 0;
|
|
241
296
|
forEach(this.querySelectorAll(selectorItem), (elem) => {
|
|
242
297
|
this._totalTabs++;
|
|
@@ -250,9 +305,13 @@ let CDSTabs = class CDSTabs extends HostListenerMixin(content_switcher_default)
|
|
|
250
305
|
super.firstUpdated();
|
|
251
306
|
this._tabInitialLoad();
|
|
252
307
|
this._cleanAndCreateIntersectionObserverContainer({ create: true });
|
|
308
|
+
this._syncSecondaryLabels();
|
|
309
|
+
this._syncSizeToTabs();
|
|
253
310
|
}
|
|
254
311
|
updated(changedProperties) {
|
|
255
312
|
super.updated?.(changedProperties);
|
|
313
|
+
if (changedProperties.has("size") || changedProperties.has("type")) this._syncSizeToTabs();
|
|
314
|
+
if (changedProperties.has("vertical")) this._updateTabsVerticalAttribute();
|
|
256
315
|
if (changedProperties.has("value")) {
|
|
257
316
|
const tab = this.querySelector(`cds-tab[value="${this.value}"]`);
|
|
258
317
|
if (tab) {
|
|
@@ -407,12 +466,13 @@ let CDSTabs = class CDSTabs extends HostListenerMixin(content_switcher_default)
|
|
|
407
466
|
}
|
|
408
467
|
/**
|
|
409
468
|
* @param key The key symbol.
|
|
410
|
-
* @
|
|
469
|
+
* @param isVertical Whether the tabs are in vertical orientation.
|
|
470
|
+
* @returns A action for tabs for the given key symbol.
|
|
411
471
|
*/
|
|
412
|
-
static getAction(key) {
|
|
472
|
+
static getAction(key, isVertical = false) {
|
|
413
473
|
if (key === "Home") return "home";
|
|
414
474
|
if (key === "End") return "end";
|
|
415
|
-
if (key in NAVIGATION_DIRECTION) return "navigating";
|
|
475
|
+
if (key in (isVertical ? VERTICAL_NAVIGATION_DIRECTION : NAVIGATION_DIRECTION)) return "navigating";
|
|
416
476
|
if (key === "Enter" || key === " ") return "activating";
|
|
417
477
|
return "none";
|
|
418
478
|
}
|
|
@@ -429,19 +489,26 @@ __decorate([property({ attribute: "selecting-items-assistive-text" })], CDSTabs.
|
|
|
429
489
|
__decorate([property({ attribute: "selected-item-assistive-text" })], CDSTabs.prototype, "selectedItemAssistiveText", void 0);
|
|
430
490
|
__decorate([property({ attribute: "trigger-content" })], CDSTabs.prototype, "triggerContent", void 0);
|
|
431
491
|
__decorate([property({ reflect: true })], CDSTabs.prototype, "type", void 0);
|
|
492
|
+
__decorate([property({ type: Boolean })], CDSTabs.prototype, "vertical", void 0);
|
|
432
493
|
__decorate([property({
|
|
433
494
|
type: Boolean,
|
|
434
495
|
reflect: true
|
|
435
496
|
})], CDSTabs.prototype, "dismissable", void 0);
|
|
497
|
+
__decorate([property({ reflect: true })], CDSTabs.prototype, "size", void 0);
|
|
436
498
|
__decorate([property({
|
|
437
499
|
attribute: "icon-size",
|
|
438
500
|
reflect: true
|
|
439
501
|
})], CDSTabs.prototype, "iconSize", void 0);
|
|
502
|
+
__decorate([property({
|
|
503
|
+
type: Boolean,
|
|
504
|
+
attribute: "full-width",
|
|
505
|
+
reflect: true
|
|
506
|
+
})], CDSTabs.prototype, "fullWidth", void 0);
|
|
440
507
|
__decorate([state()], CDSTabs.prototype, "_isIntersectionLeftTrackerInContent", void 0);
|
|
441
508
|
__decorate([state()], CDSTabs.prototype, "_isIntersectionRightTrackerInContent", void 0);
|
|
442
509
|
CDSTabs = __decorate([carbonElement(`cds-tabs`)], CDSTabs);
|
|
443
510
|
var tabs_default = CDSTabs;
|
|
444
511
|
//#endregion
|
|
445
|
-
export { NAVIGATION_DIRECTION, TABS_ICON_SIZE, TABS_KEYBOARD_ACTION, TABS_TYPE, tabs_default as default };
|
|
512
|
+
export { NAVIGATION_DIRECTION, TABS_ICON_SIZE, TABS_KEYBOARD_ACTION, TABS_SIZE, TABS_TYPE, VERTICAL_NAVIGATION_DIRECTION, tabs_default as default };
|
|
446
513
|
|
|
447
514
|
//# sourceMappingURL=tabs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","names":["CDSContentSwitcher","styles","customElement"],"sources":["../../../src/components/tabs/tabs.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2019, 2026\n *\n * This source code is licensed under the Apache-2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { TemplateResult, html } from 'lit';\nimport { property, state, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { prefix } from '../../globals/settings';\nimport { iconLoader } from '../../globals/internal/icon-loader';\nimport HostListenerMixin from '../../globals/mixins/host-listener';\nimport HostListener from '../../globals/decorators/host-listener';\nimport { forEach } from '../../globals/internal/collection-helpers';\nimport ChevronLeft16 from '@carbon/icons/es/chevron--left/16.js';\nimport ChevronRight16 from '@carbon/icons/es/chevron--right/16.js';\nimport CDSContentSwitcher, {\n NAVIGATION_DIRECTION,\n} from '../content-switcher/content-switcher';\nimport { TABS_ICON_SIZE, TABS_KEYBOARD_ACTION, TABS_TYPE } from './defs';\nimport CDSTab from './tab';\nimport styles from './tabs.scss?lit';\nimport { carbonElement as customElement } from '../../globals/decorators/carbon-element';\n\nexport {\n NAVIGATION_DIRECTION,\n TABS_ICON_SIZE,\n TABS_KEYBOARD_ACTION,\n TABS_TYPE,\n};\n\n/**\n * Tabs.\n *\n * @element cds-tabs\n * @fires cds-tabs-beingselected\n * The custom event fired before a tab is selected upon a user gesture.\n * Cancellation of this event stops changing the user-initiated selection.\n * @fires cds-tabs-selected - The custom event fired after a a tab is selected upon a user gesture.\n */\n@customElement(`${prefix}-tabs`)\nexport default class CDSTabs extends HostListenerMixin(CDSContentSwitcher) {\n /**\n * The latest status of this dropdown, for screen reader to accounce.\n */\n private _assistiveStatusText?: string;\n\n /**\n * The currently selected index\n */\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore: TS thinks this method is not referred to\n private _currentIndex = 0;\n\n /**\n * Total number of tabs in the component\n */\n private _totalTabs = 0;\n\n /**\n * `true` if the tablist is scrollable\n */\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore: TS thinks this method is not referred to\n private _isScrollable = false;\n\n /**\n * The DOM element for the tablist.\n */\n private tablist: Element | null = null;\n\n /**\n * The width of the overflow scroll buttons.\n */\n private BUTTON_WIDTH = 44;\n\n /**\n * Navigates through tabs.\n *\n * @param direction `-1` to navigate backward, `1` to navigate forward.\n * @param [options] The options.\n * @param [options.immediate]\n * Defaults to `true`\n * `true` to make it \"immediate selection change\" mode, which does:\n *\n * Starts with the selected item\n * Going prev/next item immediately changes the selection\n */\n protected _navigate(direction: number) {\n const immediate = this.selectionMode === 'automatic';\n const { selectorItemHighlighted, selectorItemSelected } = this\n .constructor as typeof CDSTabs;\n const nextItem = this._getNextItem(\n this.querySelector(\n immediate ? selectorItemSelected : selectorItemHighlighted\n ) as CDSTab,\n direction\n );\n if (!nextItem) {\n return;\n }\n this._handleUserInitiatedSelectItem(nextItem as CDSTab, 'keyboard');\n if (!immediate) {\n this.resetHighlighted(nextItem as CDSTab);\n }\n\n // Using `{ block: 'nearest' }` to prevent scrolling unless scrolling is absolutely necessary.\n // `scrollIntoViewOptions` seems to work in latest Safari despite of MDN/caniuse table.\n // IE falls back to the old behavior.\n nextItem.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n\n const nextItemText = nextItem.textContent;\n if (nextItemText) {\n this._assistiveStatusText = nextItemText;\n }\n this._currentIndex += direction;\n this.requestUpdate();\n }\n\n /**\n * Resets the highlighted state of all tabs, setting only the specified tab as highlighted.\n *\n * @param nextItem The tab item to be highlighted. If provided, only this item will be highlighted.\n * If null or undefined, all tabs will have their highlighted state set to false.\n */\n protected resetHighlighted(nextItem?: CDSTab | null) {\n const { selectorItem } = this.constructor as typeof CDSTabs;\n forEach(this.querySelectorAll(selectorItem), (item) => {\n (item as CDSTab)['highlighted'] = nextItem === item;\n });\n }\n\n @HostListener('click')\n protected _handleClick(event: MouseEvent) {\n super._handleClick(event);\n const currentItem = this._getCurrentItem(event.target as HTMLElement);\n if (currentItem) {\n this.resetHighlighted(currentItem as CDSTab);\n }\n }\n\n @HostListener('keydown')\n protected _handleKeydown(event: KeyboardEvent) {\n const { key } = event;\n const action = (this.constructor as typeof CDSTabs).getAction(key);\n const enabledTabs = this.querySelectorAll(`${prefix}-tab:not([disabled])`);\n switch (action) {\n case TABS_KEYBOARD_ACTION.HOME:\n {\n const [firstEnabledTab] = enabledTabs;\n firstEnabledTab.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n if (this.selectionMode === 'manual') {\n this.resetHighlighted(firstEnabledTab as CDSTab);\n }\n this._handleUserInitiatedSelectItem(\n firstEnabledTab as CDSTab,\n this.selectionMode !== 'manual' ? 'activation' : 'keyboard'\n );\n this.requestUpdate();\n }\n break;\n case TABS_KEYBOARD_ACTION.END:\n {\n const lastEnabledTab = enabledTabs[enabledTabs.length - 1];\n lastEnabledTab.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n if (this.selectionMode === 'manual') {\n this.resetHighlighted(lastEnabledTab as CDSTab);\n }\n this._handleUserInitiatedSelectItem(\n lastEnabledTab as CDSTab,\n this.selectionMode !== 'manual' ? 'activation' : 'keyboard'\n );\n this.requestUpdate();\n }\n break;\n case TABS_KEYBOARD_ACTION.NAVIGATING:\n {\n const direction = NAVIGATION_DIRECTION[key];\n if (direction) {\n this._navigate(direction);\n }\n }\n break;\n case TABS_KEYBOARD_ACTION.ACTIVATING:\n {\n const focusedTab: CDSTab | null = this.querySelector(\n `${prefix}-tab[highlighted]`\n );\n if (focusedTab) {\n this._handleUserInitiatedSelectItem(\n focusedTab as CDSTab,\n 'activation'\n );\n this.requestUpdate();\n }\n }\n break;\n default:\n break;\n }\n }\n\n @HostListener('cds-tab-closed')\n protected _handleTabClosed(event: CustomEvent) {\n const { selectorItem, selectorItemEnabled, selectorItemSelected } = this\n .constructor as typeof CDSTabs;\n const { index } = event.detail;\n\n const allTabs = this.querySelectorAll<CDSTab>(selectorItem);\n const enabledTabsBeforeRemoval =\n this.querySelectorAll<CDSTab>(selectorItemEnabled);\n const activeItem = this.querySelector<CDSTab>(selectorItemSelected);\n const indexInEnabledTabs = Array.from(enabledTabsBeforeRemoval).indexOf(\n allTabs[index]\n );\n const activeTabClosed = activeItem === allTabs[index];\n requestAnimationFrame(() => {\n const enabledTabs = this.querySelectorAll<CDSTab>(selectorItemEnabled);\n if (enabledTabs.length > 0) {\n if (activeTabClosed) {\n enabledTabs[0].selected = true;\n this.value = enabledTabs[0].value;\n }\n const nextHighlightedItem =\n indexInEnabledTabs < enabledTabs.length\n ? enabledTabs[indexInEnabledTabs]\n : enabledTabs[indexInEnabledTabs - 1];\n nextHighlightedItem.highlighted = true;\n nextHighlightedItem.shadowRoot\n ?.querySelector<HTMLElement>(\n `.${prefix}--tabs__nav-link--dismissable`\n )\n ?.focus();\n nextHighlightedItem.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n } else {\n this.value = '';\n return;\n }\n });\n }\n\n /**\n * Handles click on overflow scroll buttons.\n *\n * @param _ Event object\n * @param [options] The options.\n * @param [options.direction] `-1` to scroll forward, `1` to scroll backward.\n */\n protected _handleScrollButtonClick(_, { direction }) {\n if (!this.tablist) {\n return;\n }\n const { scrollLeft, clientWidth, scrollWidth } =\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this._contentContainerNode!;\n switch (direction) {\n case -1:\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this._contentContainerNode!.scrollLeft = Math.max(\n scrollLeft - (scrollWidth / this._totalTabs) * 1.5,\n 0\n );\n break;\n case 1:\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this._contentContainerNode!.scrollLeft =\n Math.min(\n scrollLeft + (scrollWidth / this._totalTabs) * 1.5,\n scrollWidth - clientWidth\n ) + 1;\n break;\n default:\n break;\n }\n }\n\n _handleSlotchange() {\n // Call super to preserve content-switcher slot handling\n super._handleSlotchange?.();\n const { selectorItemSelected } = this.constructor as typeof CDSTabs;\n const selectedItem = this.querySelector(selectorItemSelected);\n const nextItem = this._getNextItem(selectedItem as CDSTab, 1);\n\n // Specifies child `<cds-tab>` to hide its divider instead of using CSS,\n // until `:host-context()` gets supported in all major browsers\n if (nextItem) {\n (nextItem as CDSTab).hideDivider = true;\n }\n this._updateTabsState();\n }\n\n protected _selectionDidChange(\n itemToSelect: CDSTab,\n interactionType?: 'mouse' | 'keyboard' | undefined\n ) {\n super._selectionDidChange(itemToSelect, interactionType);\n this._assistiveStatusText = this.selectedItemAssistiveText;\n }\n\n /**\n * The scrolling container.\n */\n @query(`.${prefix}--tabs-nav-content-container`)\n private _contentContainerNode?: HTMLElement;\n\n /**\n * The scrolling content.\n */\n @query(`.${prefix}--tabs-nav-content`)\n private _contentNode?: HTMLElement;\n\n /**\n * The current scroll position.\n */\n @state()\n private _currentScrollPosition = 0;\n\n /**\n * The left-hand sentinel to track intersection with the host element.\n * If they intersect, the left-hand paginator button should be hidden.\n */\n @query(`.${prefix}--sub-content-left`)\n private _intersectionLeftSentinelNode?: HTMLElement;\n\n /**\n * The right-hand sentinel to track intersection with the host element.\n * If they intersect, the right-hand paginator button should be hidden.\n */\n @query(`.${prefix}--sub-content-right`)\n private _intersectionRightSentinelNode?: HTMLElement;\n\n /**\n * An assistive text for screen reader to announce, telling the open state.\n */\n @property({ attribute: 'selecting-items-assistive-text' })\n selectingItemsAssistiveText =\n 'Selecting items. Use up and down arrow keys to navigate.';\n\n /**\n * An assistive text for screen reader to announce, telling that an item is selected.\n */\n @property({ attribute: 'selected-item-assistive-text' })\n selectedItemAssistiveText = 'Selected an item.';\n\n /**\n * The content of the trigger button for narrow mode.\n */\n @property({ attribute: 'trigger-content' })\n triggerContent = '';\n\n /**\n * Tabs type.\n */\n @property({ reflect: true })\n type = TABS_TYPE.REGULAR;\n\n /**\n * Whether the rendered Tab children should be dismissable.\n */\n @property({ type: Boolean, reflect: true })\n dismissable;\n\n /**\n * Specify the icon size used by icon-only tabs.\n */\n @property({ attribute: 'icon-size', reflect: true })\n iconSize?: TABS_ICON_SIZE;\n\n /**\n * `true` if left-hand scroll intersection sentinel intersects with the host element.\n * In this condition, the left-hand paginator button should be hidden.\n */\n @state()\n private _isIntersectionLeftTrackerInContent = true;\n\n /**\n * `true` if right-hand scroll intersection sentinel intersects with the host element.\n * In this condition, the right-hand paginator button should be hidden.\n */\n @state()\n private _isIntersectionRightTrackerInContent = true;\n\n /**\n * The observer for the intersection of left-side content edge.\n */\n private _observerIntersection: IntersectionObserver | null = null;\n\n /**\n * The intersection observer callback for the scrolling container.\n *\n * @param records The intersection observer records.\n */\n private _observeIntersectionContainer = (records) => {\n const {\n _intersectionLeftSentinelNode: intersectionLeftSentinelNode,\n _intersectionRightSentinelNode: intersectionRightSentinelNode,\n } = this;\n\n records.forEach(({ isIntersecting, target }) => {\n if (target === intersectionLeftSentinelNode) {\n this._isIntersectionLeftTrackerInContent = isIntersecting;\n }\n if (target === intersectionRightSentinelNode) {\n this._isIntersectionRightTrackerInContent = isIntersecting;\n }\n });\n };\n\n /**\n * Cleans-up and creates the intersection observer for the scrolling container.\n *\n * @param [options] The options.\n * @param [options.create] `true` to create the new intersection observer.\n */\n private _cleanAndCreateIntersectionObserverContainer({\n create,\n }: { create?: boolean } = {}) {\n const {\n _intersectionLeftSentinelNode: intersectionLeftSentinelNode,\n _intersectionRightSentinelNode: intersectionRightSentinelNode,\n } = this;\n\n if (this._observerIntersection) {\n this._observerIntersection.disconnect();\n this._observerIntersection = null;\n }\n\n if (create) {\n this._observerIntersection = new IntersectionObserver(\n this._observeIntersectionContainer,\n {\n root: this,\n threshold: 0,\n }\n );\n\n if (intersectionLeftSentinelNode) {\n this._observerIntersection.observe(intersectionLeftSentinelNode);\n }\n if (intersectionRightSentinelNode) {\n this._observerIntersection.observe(intersectionRightSentinelNode);\n }\n }\n }\n\n disconnectedCallback() {\n this._cleanAndCreateIntersectionObserverContainer();\n super.disconnectedCallback();\n }\n\n shouldUpdate(changedProperties) {\n super.shouldUpdate(changedProperties);\n if (this.tablist) {\n const { clientWidth, scrollWidth } = this.tablist;\n this._isScrollable = scrollWidth > clientWidth;\n }\n const { selectorItem } = this.constructor as typeof CDSTabs;\n if (changedProperties.has('type') || changedProperties.has('iconSize')) {\n this._totalTabs = 0;\n forEach(this.querySelectorAll(selectorItem), (elem) => {\n this._totalTabs++;\n (elem as CDSTab).type = this.type;\n (elem as CDSTab).iconSize = this.iconSize;\n });\n }\n return true;\n }\n\n firstUpdated() {\n // Call super to run content-switcher init logic (initial selection)\n super.firstUpdated();\n this._tabInitialLoad();\n this._cleanAndCreateIntersectionObserverContainer({ create: true });\n }\n\n updated(changedProperties) {\n // Call super to keep selection/value in sync\n super.updated?.(changedProperties);\n\n if (changedProperties.has('value')) {\n const tab = this.querySelector(\n `${prefix}-tab[value=\"${this.value}\"]`\n ) as HTMLElement;\n if (tab) {\n const { width: tabWidth } = tab?.getBoundingClientRect() ?? {};\n const start = tab.offsetLeft ?? 0;\n const end = tab.offsetLeft + tabWidth;\n\n // The start and end of the visible area of the tablist\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n const visibleStart = this.tablist!.scrollLeft + this.BUTTON_WIDTH;\n const visibleEnd =\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this.tablist!.scrollLeft +\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this.tablist!.clientWidth -\n this.BUTTON_WIDTH;\n\n // The beginning of the tab is clipped and not visible\n if (start < visibleStart) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this.tablist!.scrollLeft = start - this.BUTTON_WIDTH;\n }\n\n // The end of the tab is clipped and not visible\n if (end > visibleEnd) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this.tablist!.scrollLeft =\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n end + this.BUTTON_WIDTH - this.tablist!.clientWidth;\n }\n }\n }\n\n if (changedProperties.has('_currentScrollPosition')) {\n if (this._contentNode) {\n this._contentNode.style.insetInlineStart = `-${this._currentScrollPosition}px`;\n }\n }\n\n if (changedProperties.has('dismissable')) {\n this._updateTabsState();\n }\n }\n\n /**\n * Render the previous button if tablist is wider than container.\n */\n protected renderPreviousButton(): TemplateResult | null {\n const {\n _isIntersectionLeftTrackerInContent: isIntersectionLeftTrackerInContent,\n } = this;\n const previousButtonClasses = classMap({\n [`${prefix}--tab--overflow-nav-button`]: true,\n [`${prefix}--tabs__nav-caret-left`]: true,\n [`${prefix}--tab--overflow-nav-button--previous`]: true,\n [`${prefix}--tab--overflow-nav-button--hidden`]:\n isIntersectionLeftTrackerInContent,\n });\n return html`\n <button\n part=\"prev-button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n class=\"${previousButtonClasses}\"\n @click=${(_) =>\n this._handleScrollButtonClick(_, {\n direction: NAVIGATION_DIRECTION.Left,\n })}>\n ${iconLoader(ChevronLeft16)}\n </button>\n `;\n }\n\n /**\n * Render the next button if tablist is wider than container.\n */\n protected renderNextButton(): TemplateResult | null {\n const {\n _isIntersectionRightTrackerInContent: isIntersectionRightTrackerInContent,\n } = this;\n const nextButtonClasses = classMap({\n [`${prefix}--tab--overflow-nav-button`]: true,\n [`${prefix}--tabs__nav-caret-right`]: true,\n [`${prefix}--tab--overflow-nav-button--next`]: true,\n [`${prefix}--tab--overflow-nav-button--hidden`]:\n isIntersectionRightTrackerInContent,\n });\n return html`\n <button\n part=\"next-button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n class=\"${nextButtonClasses}\"\n @click=${(_) =>\n this._handleScrollButtonClick(_, {\n direction: NAVIGATION_DIRECTION.Right,\n })}>\n ${iconLoader(ChevronRight16)}\n </button>\n `;\n }\n\n render() {\n const {\n _assistiveStatusText: assistiveStatusText,\n _handleSlotchange: handleSlotchange,\n } = this;\n\n return html`\n ${this.renderPreviousButton()}\n <div class=\"${prefix}--tabs-nav-content-container\">\n <div class=\"${prefix}--tabs-nav-content\">\n <div class=\"${prefix}--tabs-nav\">\n <div id=\"tablist\" role=\"tablist\" class=\"${prefix}--tab--list\">\n <div class=\"${prefix}--sub-content-left\"></div>\n <slot @slotchange=${handleSlotchange}></slot>\n <div class=\"${prefix}--sub-content-right\"></div>\n </div>\n </div>\n </div>\n </div>\n ${this.renderNextButton()}\n <div\n class=\"${prefix}--assistive-text\"\n role=\"status\"\n aria-live=\"assertive\"\n aria-relevant=\"additions text\">\n ${assistiveStatusText}\n </div>\n `;\n }\n\n protected _updateTabsState() {\n const { selectorItem } = this.constructor as typeof CDSTabs;\n const tabs = this.querySelectorAll<CDSTab>(selectorItem);\n tabs.forEach((tab, index) => {\n tab._dismissable = this.dismissable;\n tab._index = index;\n });\n }\n\n protected _tabInitialLoad() {\n const { selectorTablist, selectorItemEnabled } = this\n .constructor as typeof CDSTabs;\n const { selectionMode, selectedIndex } = this;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n const tablist = this.shadowRoot!.querySelector(selectorTablist)!;\n this.tablist = tablist;\n const firstItem =\n this.querySelectorAll<CDSTab>(selectorItemEnabled)[selectedIndex];\n if (firstItem) {\n if (selectionMode === 'manual') {\n firstItem.highlighted = true;\n }\n firstItem.selected = true;\n this.value = firstItem.value;\n }\n }\n /**\n * Symbols of keys that triggers opening/closing menu and selecting/deselecting menu item.\n */\n static TRIGGER_KEYS = new Set([' ', 'Enter']);\n\n /**\n * A selector that will return tabs.\n */\n static get selectorItem() {\n return `${prefix}-tab`;\n }\n\n /**\n * A selector that will return enabled tabs.\n */\n static get selectorItemEnabled() {\n return `${prefix}-tab:not([disabled])`;\n }\n\n /**\n * A selector that will return highlighted tabs.\n */\n static get selectorItemHighlighted() {\n return `${prefix}-tab[highlighted]`;\n }\n\n /**\n * A selector that will return selected tabs.\n */\n static get selectorItemSelected() {\n return `${prefix}-tab[selected]`;\n }\n\n /**\n * A selector that returns the tablist\n */\n static get selectorTablist() {\n return `.${prefix}--tab--list`;\n }\n\n /**\n * The name of the custom event fired before a tab is selected upon a user gesture.\n * Cancellation of this event stops changing the user-initiated selection.\n */\n static get eventBeforeSelect() {\n return `${prefix}-tabs-beingselected`;\n }\n\n /**\n * The name of the custom event fired after a a tab is selected upon a user gesture.\n */\n static get eventSelect() {\n return `${prefix}-tabs-selected`;\n }\n\n static styles = styles;\n\n /**\n * @param key The key symbol.\n * @returns A action for dropdown for the given key symbol.\n */\n static getAction(key: string) {\n if (key === 'Home') {\n return TABS_KEYBOARD_ACTION.HOME;\n }\n if (key === 'End') {\n return TABS_KEYBOARD_ACTION.END;\n }\n if (key in NAVIGATION_DIRECTION) {\n return TABS_KEYBOARD_ACTION.NAVIGATING;\n }\n if (key === 'Enter' || key === ' ') {\n return TABS_KEYBOARD_ACTION.ACTIVATING;\n }\n return TABS_KEYBOARD_ACTION.NONE;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tabs.js","names":["CDSContentSwitcher","styles","customElement"],"sources":["../../../src/components/tabs/tabs.ts"],"sourcesContent":["/**\n * Copyright IBM Corp. 2019, 2026\n *\n * This source code is licensed under the Apache-2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { TemplateResult, html } from 'lit';\nimport { property, state, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { prefix } from '../../globals/settings';\nimport { iconLoader } from '../../globals/internal/icon-loader';\nimport HostListenerMixin from '../../globals/mixins/host-listener';\nimport HostListener from '../../globals/decorators/host-listener';\nimport { forEach } from '../../globals/internal/collection-helpers';\nimport ChevronLeft16 from '@carbon/icons/es/chevron--left/16.js';\nimport ChevronRight16 from '@carbon/icons/es/chevron--right/16.js';\nimport CDSContentSwitcher, {\n NAVIGATION_DIRECTION,\n} from '../content-switcher/content-switcher';\nimport {\n VERTICAL_NAVIGATION_DIRECTION,\n TABS_ICON_SIZE,\n TABS_KEYBOARD_ACTION,\n TABS_TYPE,\n TABS_SIZE,\n} from './defs';\nimport CDSTab from './tab';\nimport styles from './tabs.scss?lit';\nimport { carbonElement as customElement } from '../../globals/decorators/carbon-element';\n\nexport {\n NAVIGATION_DIRECTION,\n VERTICAL_NAVIGATION_DIRECTION,\n TABS_ICON_SIZE,\n TABS_KEYBOARD_ACTION,\n TABS_TYPE,\n TABS_SIZE,\n};\n\n/**\n * Tabs.\n *\n * @element cds-tabs\n * @fires cds-tabs-beingselected\n * The custom event fired before a tab is selected upon a user gesture.\n * Cancellation of this event stops changing the user-initiated selection.\n * @fires cds-tabs-selected - The custom event fired after a a tab is selected upon a user gesture.\n */\n@customElement(`${prefix}-tabs`)\nexport default class CDSTabs extends HostListenerMixin(CDSContentSwitcher) {\n /**\n * The latest status of this dropdown, for screen reader to accounce.\n */\n private _assistiveStatusText?: string;\n\n /**\n * The currently selected index\n */\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore: TS thinks this method is not referred to\n private _currentIndex = 0;\n\n /**\n * Total number of tabs in the component\n */\n private _totalTabs = 0;\n\n /**\n * `true` if the tablist is scrollable\n */\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- https://github.com/carbon-design-system/carbon/issues/20452\n // @ts-ignore: TS thinks this method is not referred to\n private _isScrollable = false;\n\n /**\n * The DOM element for the tablist.\n */\n private tablist: Element | null = null;\n\n /**\n * The width of the overflow scroll buttons.\n */\n private BUTTON_WIDTH = 44;\n\n /**\n * Propagates the layout size token to the host and all child tabs.\n */\n private _syncSizeToTabs() {\n if (this.type === TABS_TYPE.CONTAINED) {\n const size = this.getAttribute('size');\n if (size) {\n const value = `var(--${prefix}-layout-size-height-${size})`;\n this.style.setProperty(`--${prefix}-layout-size-height`, value);\n this.querySelectorAll(`${prefix}-tab`).forEach((tab) => {\n (tab as HTMLElement).style.setProperty(\n `--${prefix}-layout-size-height`,\n value\n );\n });\n } else {\n this.style.removeProperty(`--${prefix}-layout-size-height`);\n this.querySelectorAll(`${prefix}-tab`).forEach((tab) => {\n (tab as HTMLElement).style.removeProperty(\n `--${prefix}-layout-size-height`\n );\n });\n }\n }\n }\n\n /**\n * Navigates through tabs.\n *\n * @param direction `-1` to navigate backward, `1` to navigate forward.\n * @param [options] The options.\n * @param [options.immediate]\n * Defaults to `true`\n * `true` to make it \"immediate selection change\" mode, which does:\n *\n * Starts with the selected item\n * Going prev/next item immediately changes the selection\n */\n protected _navigate(direction: number) {\n const immediate = this.selectionMode === 'automatic';\n const { selectorItemHighlighted, selectorItemSelected } = this\n .constructor as typeof CDSTabs;\n const nextItem = this._getNextItem(\n this.querySelector(\n immediate ? selectorItemSelected : selectorItemHighlighted\n ) as CDSTab,\n direction\n );\n if (!nextItem) {\n return;\n }\n this._handleUserInitiatedSelectItem(nextItem as CDSTab, 'keyboard');\n if (!immediate) {\n this.resetHighlighted(nextItem as CDSTab);\n }\n\n // Using `{ block: 'nearest' }` to prevent scrolling unless scrolling is absolutely necessary.\n // `scrollIntoViewOptions` seems to work in latest Safari despite of MDN/caniuse table.\n // IE falls back to the old behavior.\n nextItem.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n\n const nextItemText = nextItem.textContent;\n if (nextItemText) {\n this._assistiveStatusText = nextItemText;\n }\n this._currentIndex += direction;\n this.requestUpdate();\n }\n\n /**\n * Resets the highlighted state of all tabs, setting only the specified tab as highlighted.\n *\n * @param nextItem The tab item to be highlighted. If provided, only this item will be highlighted.\n * If null or undefined, all tabs will have their highlighted state set to false.\n */\n protected resetHighlighted(nextItem?: CDSTab | null) {\n const { selectorItem } = this.constructor as typeof CDSTabs;\n forEach(this.querySelectorAll(selectorItem), (item) => {\n (item as CDSTab)['highlighted'] = nextItem === item;\n });\n }\n\n /**\n * Resets the selected state of all tabs, setting only the specified tab as selected.\n *\n * @param nextItem The tab item to be selected. If provided, only this item will be selected.\n * If null or undefined, all tabs will have their selected state set to false.\n */\n protected resetSelected(nextItem?: CDSTab | null) {\n const { selectorItem } = this.constructor as typeof CDSTabs;\n forEach(this.querySelectorAll(selectorItem), (item) => {\n (item as CDSTab)['selected'] = nextItem === item;\n });\n }\n\n @HostListener('click')\n protected _handleClick(event: MouseEvent) {\n super._handleClick(event);\n const currentItem = this._getCurrentItem(event.target as HTMLElement);\n if (currentItem) {\n this.resetHighlighted(currentItem as CDSTab);\n }\n }\n\n @HostListener('keydown')\n protected _handleKeydown(event: KeyboardEvent) {\n const { key } = event;\n const { selectorItemEnabled } = this.constructor as typeof CDSTabs;\n const action = (this.constructor as typeof CDSTabs).getAction(\n key,\n this.vertical\n );\n const enabledTabs = this.querySelectorAll(selectorItemEnabled);\n switch (action) {\n case TABS_KEYBOARD_ACTION.HOME:\n {\n const [firstEnabledTab] = enabledTabs;\n firstEnabledTab.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n if (this.selectionMode === 'manual') {\n this.resetHighlighted(firstEnabledTab as CDSTab);\n }\n this._handleUserInitiatedSelectItem(\n firstEnabledTab as CDSTab,\n this.selectionMode !== 'manual' ? 'activation' : 'keyboard'\n );\n this.requestUpdate();\n }\n break;\n case TABS_KEYBOARD_ACTION.END:\n {\n const lastEnabledTab = enabledTabs[enabledTabs.length - 1];\n lastEnabledTab.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n if (this.selectionMode === 'manual') {\n this.resetHighlighted(lastEnabledTab as CDSTab);\n }\n this._handleUserInitiatedSelectItem(\n lastEnabledTab as CDSTab,\n this.selectionMode !== 'manual' ? 'activation' : 'keyboard'\n );\n this.requestUpdate();\n }\n break;\n case TABS_KEYBOARD_ACTION.NAVIGATING:\n {\n event.preventDefault();\n // Get direction based on orientation\n const direction = this.vertical\n ? VERTICAL_NAVIGATION_DIRECTION[key]\n : NAVIGATION_DIRECTION[key];\n if (direction) {\n this._navigate(direction);\n }\n }\n break;\n case TABS_KEYBOARD_ACTION.ACTIVATING:\n {\n const focusedTab: CDSTab | null = this.querySelector(\n `${prefix}-tab[highlighted]`\n );\n if (focusedTab) {\n this._handleUserInitiatedSelectItem(\n focusedTab as CDSTab,\n 'activation'\n );\n this.requestUpdate();\n }\n }\n break;\n default:\n break;\n }\n }\n\n @HostListener('cds-tab-closed')\n protected _handleTabClosed(event: CustomEvent) {\n const {\n selectorItem,\n selectorItemEnabled,\n selectorItemSelected,\n selectorItemHighlighted,\n } = this.constructor as typeof CDSTabs;\n const { index } = event.detail;\n const allTabs = this.querySelectorAll<CDSTab>(selectorItem);\n const enabledTabsBeforeRemoval =\n this.querySelectorAll<CDSTab>(selectorItemEnabled);\n const indexInEnabledTabs = Array.from(enabledTabsBeforeRemoval).indexOf(\n allTabs[index]\n );\n const activeItem = this.querySelector<CDSTab>(selectorItemSelected);\n const activeItemId = activeItem?.id;\n const highlightedItem = this.querySelector<CDSTab>(selectorItemHighlighted);\n const highlightedItemId = highlightedItem?.id;\n requestAnimationFrame(() => {\n const enabledTabs = Array.from(\n this.querySelectorAll<CDSTab>(selectorItemEnabled)\n );\n\n const tabWithActiveId = enabledTabs.find(\n (tab) => tab.id === activeItemId\n );\n const tabWithHighlightedId = enabledTabs.find(\n (tab) => tab.id === highlightedItemId\n );\n const nextHighlightedIndex =\n !tabWithActiveId && !tabWithHighlightedId && indexInEnabledTabs - 1 >= 0\n ? indexInEnabledTabs - 1\n : 0;\n if (enabledTabs.length > 0) {\n const nextSelectedItem = tabWithActiveId || enabledTabs[0];\n const nextHighlightedItem =\n tabWithHighlightedId || enabledTabs[nextHighlightedIndex];\n this.resetSelected(nextSelectedItem);\n this.resetHighlighted(nextHighlightedItem);\n this.value = nextSelectedItem.value;\n\n nextHighlightedItem.shadowRoot\n ?.querySelector<HTMLElement>(\n `.${prefix}--tabs__nav-link--dismissable`\n )\n ?.focus();\n nextHighlightedItem.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n } else {\n this.value = '';\n return;\n }\n });\n }\n\n /**\n * Handles click on overflow scroll buttons.\n *\n * @param _ Event object\n * @param [options] The options.\n * @param [options.direction] `-1` to scroll forward, `1` to scroll backward.\n */\n protected _handleScrollButtonClick(_, { direction }) {\n if (!this.tablist) {\n return;\n }\n const { scrollLeft, clientWidth, scrollWidth } =\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this._contentContainerNode!;\n switch (direction) {\n case -1:\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this._contentContainerNode!.scrollLeft = Math.max(\n scrollLeft - (scrollWidth / this._totalTabs) * 1.5,\n 0\n );\n break;\n case 1:\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this._contentContainerNode!.scrollLeft =\n Math.min(\n scrollLeft + (scrollWidth / this._totalTabs) * 1.5,\n scrollWidth - clientWidth\n ) + 1;\n break;\n default:\n break;\n }\n }\n\n private _syncSecondaryLabels() {\n const hasSecondaryLabels = Array.from(\n this.querySelectorAll(`${prefix}-tab`)\n ).some((tab) => tab.hasAttribute('secondary-label'));\n if (hasSecondaryLabels) {\n this.setAttribute('has-secondary-labels', '');\n } else {\n this.removeAttribute('has-secondary-labels');\n }\n }\n\n _handleSlotchange() {\n // Call super to preserve content-switcher slot handling\n super._handleSlotchange?.();\n const { selectorItemSelected } = this.constructor as typeof CDSTabs;\n const selectedItem = this.querySelector(selectorItemSelected);\n const nextItem = this._getNextItem(selectedItem as CDSTab, 1);\n\n // Specifies child `<cds-tab>` to hide its divider instead of using CSS,\n // until `:host-context()` gets supported in all major browsers\n if (nextItem) {\n (nextItem as CDSTab).hideDivider = true;\n }\n\n // Set vertical attribute on all tabs if this tabs component is vertical\n this._updateTabsVerticalAttribute();\n this._syncSecondaryLabels();\n this._updateTabsState();\n this._syncSizeToTabs();\n }\n\n /**\n * Updates the vertical attribute on all child tabs based on the vertical property.\n */\n private _updateTabsVerticalAttribute() {\n const { selectorItem } = this.constructor as typeof CDSTabs;\n forEach(this.querySelectorAll(selectorItem), (tab) => {\n if (this.vertical) {\n (tab as CDSTab).setAttribute('vertical', '');\n } else {\n (tab as CDSTab).removeAttribute('vertical');\n }\n });\n }\n\n protected _selectionDidChange(\n itemToSelect: CDSTab,\n interactionType?: 'mouse' | 'keyboard' | undefined\n ) {\n super._selectionDidChange(itemToSelect, interactionType);\n this._assistiveStatusText = this.selectedItemAssistiveText;\n }\n\n /**\n * The scrolling container.\n */\n @query(`.${prefix}--tabs-nav-content-container`)\n private _contentContainerNode?: HTMLElement;\n\n /**\n * The scrolling content.\n */\n @query(`.${prefix}--tabs-nav-content`)\n private _contentNode?: HTMLElement;\n\n /**\n * The current scroll position.\n */\n @state()\n private _currentScrollPosition = 0;\n\n /**\n * The left-hand sentinel to track intersection with the host element.\n * If they intersect, the left-hand paginator button should be hidden.\n */\n @query(`.${prefix}--sub-content-left`)\n private _intersectionLeftSentinelNode?: HTMLElement;\n\n /**\n * The right-hand sentinel to track intersection with the host element.\n * If they intersect, the right-hand paginator button should be hidden.\n */\n @query(`.${prefix}--sub-content-right`)\n private _intersectionRightSentinelNode?: HTMLElement;\n\n /**\n * An assistive text for screen reader to announce, telling the open state.\n */\n @property({ attribute: 'selecting-items-assistive-text' })\n selectingItemsAssistiveText =\n 'Selecting items. Use up and down arrow keys to navigate.';\n\n /**\n * An assistive text for screen reader to announce, telling that an item is selected.\n */\n @property({ attribute: 'selected-item-assistive-text' })\n selectedItemAssistiveText = 'Selected an item.';\n\n /**\n * The content of the trigger button for narrow mode.\n */\n @property({ attribute: 'trigger-content' })\n triggerContent = '';\n\n /**\n * Tabs type.\n */\n @property({ reflect: true })\n type = TABS_TYPE.REGULAR;\n\n /**\n * `true` if the tabs are in vertical orientation.\n * This is automatically set by `cds-tabs-vertical`.\n */\n @property({ type: Boolean })\n vertical = false;\n /**\n * Whether the rendered Tab children should be dismissable.\n */\n @property({ type: Boolean, reflect: true })\n dismissable;\n\n /**\n * Specify the size of contained tabs.\n */\n @property({ reflect: true })\n size?: TABS_SIZE;\n\n /**\n * Specify the icon size used by icon-only tabs.\n */\n @property({ attribute: 'icon-size', reflect: true })\n iconSize?: TABS_ICON_SIZE;\n\n /**\n * Used for tabs within a grid, this makes it so tabs span the full container width and have the same width. Only available on contained tabs with <9 children\n */\n @property({ type: Boolean, attribute: 'full-width', reflect: true })\n fullWidth = false;\n\n /**\n * `true` if left-hand scroll intersection sentinel intersects with the host element.\n * In this condition, the left-hand paginator button should be hidden.\n */\n @state()\n private _isIntersectionLeftTrackerInContent = true;\n\n /**\n * `true` if right-hand scroll intersection sentinel intersects with the host element.\n * In this condition, the right-hand paginator button should be hidden.\n */\n @state()\n private _isIntersectionRightTrackerInContent = true;\n\n /**\n * The observer for the intersection of left-side content edge.\n */\n private _observerIntersection: IntersectionObserver | null = null;\n\n /**\n * The intersection observer callback for the scrolling container.\n *\n * @param records The intersection observer records.\n */\n private _observeIntersectionContainer = (records) => {\n const {\n _intersectionLeftSentinelNode: intersectionLeftSentinelNode,\n _intersectionRightSentinelNode: intersectionRightSentinelNode,\n } = this;\n\n records.forEach(({ isIntersecting, target }) => {\n if (target === intersectionLeftSentinelNode) {\n this._isIntersectionLeftTrackerInContent = isIntersecting;\n }\n if (target === intersectionRightSentinelNode) {\n this._isIntersectionRightTrackerInContent = isIntersecting;\n }\n });\n };\n\n /**\n * Cleans-up and creates the intersection observer for the scrolling container.\n *\n * @param [options] The options.\n * @param [options.create] `true` to create the new intersection observer.\n */\n private _cleanAndCreateIntersectionObserverContainer({\n create,\n }: { create?: boolean } = {}) {\n const {\n _intersectionLeftSentinelNode: intersectionLeftSentinelNode,\n _intersectionRightSentinelNode: intersectionRightSentinelNode,\n } = this;\n\n if (this._observerIntersection) {\n this._observerIntersection.disconnect();\n this._observerIntersection = null;\n }\n\n if (create) {\n this._observerIntersection = new IntersectionObserver(\n this._observeIntersectionContainer,\n {\n root: this,\n threshold: 0,\n }\n );\n\n if (intersectionLeftSentinelNode) {\n this._observerIntersection.observe(intersectionLeftSentinelNode);\n }\n if (intersectionRightSentinelNode) {\n this._observerIntersection.observe(intersectionRightSentinelNode);\n }\n }\n }\n\n disconnectedCallback() {\n this._cleanAndCreateIntersectionObserverContainer();\n super.disconnectedCallback();\n }\n\n shouldUpdate(changedProperties) {\n super.shouldUpdate(changedProperties);\n if (this.tablist) {\n const { clientWidth, scrollWidth } = this.tablist;\n this._isScrollable = scrollWidth > clientWidth;\n }\n const { selectorItem } = this.constructor as typeof CDSTabs;\n if (\n changedProperties.has('type') ||\n changedProperties.has('iconSize') ||\n changedProperties.has('size')\n ) {\n this._totalTabs = 0;\n forEach(this.querySelectorAll(selectorItem), (elem) => {\n this._totalTabs++;\n (elem as CDSTab).type = this.type;\n (elem as CDSTab).iconSize = this.iconSize;\n });\n }\n return true;\n }\n\n firstUpdated() {\n // Call super to run content-switcher init logic (initial selection)\n super.firstUpdated();\n this._tabInitialLoad();\n this._cleanAndCreateIntersectionObserverContainer({ create: true });\n this._syncSecondaryLabels();\n this._syncSizeToTabs();\n }\n\n updated(changedProperties) {\n // Call super to keep selection/value in sync\n super.updated?.(changedProperties);\n if (changedProperties.has('size') || changedProperties.has('type')) {\n this._syncSizeToTabs();\n }\n\n if (changedProperties.has('vertical')) {\n this._updateTabsVerticalAttribute();\n }\n\n if (changedProperties.has('value')) {\n const tab = this.querySelector(\n `${prefix}-tab[value=\"${this.value}\"]`\n ) as HTMLElement;\n if (tab) {\n const { width: tabWidth } = tab?.getBoundingClientRect() ?? {};\n const start = tab.offsetLeft ?? 0;\n const end = tab.offsetLeft + tabWidth;\n\n // The start and end of the visible area of the tablist\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n const visibleStart = this.tablist!.scrollLeft + this.BUTTON_WIDTH;\n const visibleEnd =\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this.tablist!.scrollLeft +\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this.tablist!.clientWidth -\n this.BUTTON_WIDTH;\n\n // The beginning of the tab is clipped and not visible\n if (start < visibleStart) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this.tablist!.scrollLeft = start - this.BUTTON_WIDTH;\n }\n\n // The end of the tab is clipped and not visible\n if (end > visibleEnd) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n this.tablist!.scrollLeft =\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n end + this.BUTTON_WIDTH - this.tablist!.clientWidth;\n }\n }\n }\n\n if (changedProperties.has('_currentScrollPosition')) {\n if (this._contentNode) {\n this._contentNode.style.insetInlineStart = `-${this._currentScrollPosition}px`;\n }\n }\n\n if (changedProperties.has('dismissable')) {\n this._updateTabsState();\n }\n }\n\n /**\n * Render the previous button if tablist is wider than container.\n */\n protected renderPreviousButton(): TemplateResult | null {\n const {\n _isIntersectionLeftTrackerInContent: isIntersectionLeftTrackerInContent,\n } = this;\n const previousButtonClasses = classMap({\n [`${prefix}--tab--overflow-nav-button`]: true,\n [`${prefix}--tabs__nav-caret-left`]: true,\n [`${prefix}--tab--overflow-nav-button--previous`]: true,\n [`${prefix}--tab--overflow-nav-button--hidden`]:\n isIntersectionLeftTrackerInContent,\n });\n return html`\n <button\n part=\"prev-button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n class=\"${previousButtonClasses}\"\n @click=${(_) =>\n this._handleScrollButtonClick(_, {\n direction: NAVIGATION_DIRECTION.Left,\n })}>\n ${iconLoader(ChevronLeft16)}\n </button>\n `;\n }\n\n /**\n * Render the next button if tablist is wider than container.\n */\n protected renderNextButton(): TemplateResult | null {\n const {\n _isIntersectionRightTrackerInContent: isIntersectionRightTrackerInContent,\n } = this;\n const nextButtonClasses = classMap({\n [`${prefix}--tab--overflow-nav-button`]: true,\n [`${prefix}--tabs__nav-caret-right`]: true,\n [`${prefix}--tab--overflow-nav-button--next`]: true,\n [`${prefix}--tab--overflow-nav-button--hidden`]:\n isIntersectionRightTrackerInContent,\n });\n return html`\n <button\n part=\"next-button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n class=\"${nextButtonClasses}\"\n @click=${(_) =>\n this._handleScrollButtonClick(_, {\n direction: NAVIGATION_DIRECTION.Right,\n })}>\n ${iconLoader(ChevronRight16)}\n </button>\n `;\n }\n\n render() {\n const {\n _assistiveStatusText: assistiveStatusText,\n _handleSlotchange: handleSlotchange,\n } = this;\n\n return html`\n ${this.renderPreviousButton()}\n <div class=\"${prefix}--tabs-nav-content-container\">\n <div class=\"${prefix}--tabs-nav-content\">\n <div class=\"${prefix}--tabs-nav\">\n <div id=\"tablist\" role=\"tablist\" class=\"${prefix}--tab--list\">\n <div class=\"${prefix}--sub-content-left\"></div>\n <slot @slotchange=${handleSlotchange}></slot>\n <div class=\"${prefix}--sub-content-right\"></div>\n </div>\n </div>\n </div>\n </div>\n ${this.renderNextButton()}\n <div\n class=\"${prefix}--assistive-text\"\n role=\"status\"\n aria-live=\"assertive\"\n aria-relevant=\"additions text\">\n ${assistiveStatusText}\n </div>\n `;\n }\n\n protected _updateTabsState() {\n const { selectorItem } = this.constructor as typeof CDSTabs;\n const tabs = this.querySelectorAll<CDSTab>(selectorItem);\n tabs.forEach((tab, index) => {\n tab._dismissable = this.dismissable;\n tab._index = index;\n });\n }\n\n protected _tabInitialLoad() {\n const { selectorTablist, selectorItemEnabled } = this\n .constructor as typeof CDSTabs;\n const { selectionMode, selectedIndex } = this;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452\n const tablist = this.shadowRoot!.querySelector(selectorTablist)!;\n this.tablist = tablist;\n const firstItem =\n this.querySelectorAll<CDSTab>(selectorItemEnabled)[selectedIndex];\n if (firstItem) {\n if (selectionMode === 'manual') {\n firstItem.highlighted = true;\n }\n firstItem.selected = true;\n this.value = firstItem.value;\n }\n }\n /**\n * Symbols of keys that triggers opening/closing menu and selecting/deselecting menu item.\n */\n static TRIGGER_KEYS = new Set([' ', 'Enter']);\n\n /**\n * A selector that will return tabs.\n */\n static get selectorItem() {\n return `${prefix}-tab`;\n }\n\n /**\n * A selector that will return enabled tabs.\n */\n static get selectorItemEnabled() {\n return `${prefix}-tab:not([disabled])`;\n }\n\n /**\n * A selector that will return highlighted tabs.\n */\n static get selectorItemHighlighted() {\n return `${prefix}-tab[highlighted]`;\n }\n\n /**\n * A selector that will return selected tabs.\n */\n static get selectorItemSelected() {\n return `${prefix}-tab[selected]`;\n }\n\n /**\n * A selector that returns the tablist\n */\n static get selectorTablist() {\n return `.${prefix}--tab--list`;\n }\n\n /**\n * The name of the custom event fired before a tab is selected upon a user gesture.\n * Cancellation of this event stops changing the user-initiated selection.\n */\n static get eventBeforeSelect() {\n return `${prefix}-tabs-beingselected`;\n }\n\n /**\n * The name of the custom event fired after a a tab is selected upon a user gesture.\n */\n static get eventSelect() {\n return `${prefix}-tabs-selected`;\n }\n\n static styles = styles;\n\n /**\n * @param key The key symbol.\n * @param isVertical Whether the tabs are in vertical orientation.\n * @returns A action for tabs for the given key symbol.\n */\n static getAction(key: string, isVertical = false) {\n if (key === 'Home') {\n return TABS_KEYBOARD_ACTION.HOME;\n }\n if (key === 'End') {\n return TABS_KEYBOARD_ACTION.END;\n }\n // Check for navigation keys based on orientation\n const navigationKeys = isVertical\n ? VERTICAL_NAVIGATION_DIRECTION\n : NAVIGATION_DIRECTION;\n if (key in navigationKeys) {\n return TABS_KEYBOARD_ACTION.NAVIGATING;\n }\n if (key === 'Enter' || key === ' ') {\n return TABS_KEYBOARD_ACTION.ACTIVATING;\n }\n return TABS_KEYBOARD_ACTION.NONE;\n }\n}\n"],"mappings":"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"}
|