@mintplayer/ng-bootstrap 21.30.0 → 21.31.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.
Files changed (153) hide show
  1. package/fesm2022/mintplayer-ng-bootstrap-a11y.mjs +455 -0
  2. package/fesm2022/mintplayer-ng-bootstrap-a11y.mjs.map +1 -0
  3. package/fesm2022/mintplayer-ng-bootstrap-accordion.mjs +8 -5
  4. package/fesm2022/mintplayer-ng-bootstrap-accordion.mjs.map +1 -1
  5. package/fesm2022/mintplayer-ng-bootstrap-breadcrumb.mjs +10 -4
  6. package/fesm2022/mintplayer-ng-bootstrap-breadcrumb.mjs.map +1 -1
  7. package/fesm2022/mintplayer-ng-bootstrap-button-group.mjs +7 -4
  8. package/fesm2022/mintplayer-ng-bootstrap-button-group.mjs.map +1 -1
  9. package/fesm2022/mintplayer-ng-bootstrap-calendar.mjs +131 -3
  10. package/fesm2022/mintplayer-ng-bootstrap-calendar.mjs.map +1 -1
  11. package/fesm2022/mintplayer-ng-bootstrap-carousel.mjs +80 -48
  12. package/fesm2022/mintplayer-ng-bootstrap-carousel.mjs.map +1 -1
  13. package/fesm2022/mintplayer-ng-bootstrap-code-snippet.mjs +4 -1
  14. package/fesm2022/mintplayer-ng-bootstrap-code-snippet.mjs.map +1 -1
  15. package/fesm2022/mintplayer-ng-bootstrap-color-picker.mjs +218 -14
  16. package/fesm2022/mintplayer-ng-bootstrap-color-picker.mjs.map +1 -1
  17. package/fesm2022/mintplayer-ng-bootstrap-datatable.mjs +4 -3
  18. package/fesm2022/mintplayer-ng-bootstrap-datatable.mjs.map +1 -1
  19. package/fesm2022/mintplayer-ng-bootstrap-datepicker.mjs +2 -2
  20. package/fesm2022/mintplayer-ng-bootstrap-datepicker.mjs.map +1 -1
  21. package/fesm2022/mintplayer-ng-bootstrap-dock.mjs +294 -3
  22. package/fesm2022/mintplayer-ng-bootstrap-dock.mjs.map +1 -1
  23. package/fesm2022/mintplayer-ng-bootstrap-dropdown-menu.mjs +163 -18
  24. package/fesm2022/mintplayer-ng-bootstrap-dropdown-menu.mjs.map +1 -1
  25. package/fesm2022/mintplayer-ng-bootstrap-dropdown.mjs +179 -7
  26. package/fesm2022/mintplayer-ng-bootstrap-dropdown.mjs.map +1 -1
  27. package/fesm2022/mintplayer-ng-bootstrap-file-upload.mjs +14 -4
  28. package/fesm2022/mintplayer-ng-bootstrap-file-upload.mjs.map +1 -1
  29. package/fesm2022/mintplayer-ng-bootstrap-has-overlay.mjs +14 -0
  30. package/fesm2022/mintplayer-ng-bootstrap-has-overlay.mjs.map +1 -1
  31. package/fesm2022/mintplayer-ng-bootstrap-list-group.mjs +2 -1
  32. package/fesm2022/mintplayer-ng-bootstrap-list-group.mjs.map +1 -1
  33. package/fesm2022/mintplayer-ng-bootstrap-marquee.mjs +7 -4
  34. package/fesm2022/mintplayer-ng-bootstrap-marquee.mjs.map +1 -1
  35. package/fesm2022/mintplayer-ng-bootstrap-modal.mjs +70 -6
  36. package/fesm2022/mintplayer-ng-bootstrap-modal.mjs.map +1 -1
  37. package/fesm2022/mintplayer-ng-bootstrap-multiselect.mjs +5 -4
  38. package/fesm2022/mintplayer-ng-bootstrap-multiselect.mjs.map +1 -1
  39. package/fesm2022/mintplayer-ng-bootstrap-navbar-toggler.mjs +6 -6
  40. package/fesm2022/mintplayer-ng-bootstrap-navbar-toggler.mjs.map +1 -1
  41. package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs +45 -13
  42. package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs.map +1 -1
  43. package/fesm2022/mintplayer-ng-bootstrap-offcanvas.mjs +51 -5
  44. package/fesm2022/mintplayer-ng-bootstrap-offcanvas.mjs.map +1 -1
  45. package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs +5 -3
  46. package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs.map +1 -1
  47. package/fesm2022/mintplayer-ng-bootstrap-placeholder.mjs +18 -4
  48. package/fesm2022/mintplayer-ng-bootstrap-placeholder.mjs.map +1 -1
  49. package/fesm2022/mintplayer-ng-bootstrap-playlist-toggler.mjs +6 -6
  50. package/fesm2022/mintplayer-ng-bootstrap-playlist-toggler.mjs.map +1 -1
  51. package/fesm2022/mintplayer-ng-bootstrap-popover.mjs +61 -6
  52. package/fesm2022/mintplayer-ng-bootstrap-popover.mjs.map +1 -1
  53. package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs +19 -4
  54. package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs.map +1 -1
  55. package/fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs +8 -5
  56. package/fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs.map +1 -1
  57. package/fesm2022/mintplayer-ng-bootstrap-range.mjs +4 -3
  58. package/fesm2022/mintplayer-ng-bootstrap-range.mjs.map +1 -1
  59. package/fesm2022/mintplayer-ng-bootstrap-rating.mjs +34 -4
  60. package/fesm2022/mintplayer-ng-bootstrap-rating.mjs.map +1 -1
  61. package/fesm2022/mintplayer-ng-bootstrap-reduced-motion.mjs +59 -0
  62. package/fesm2022/mintplayer-ng-bootstrap-reduced-motion.mjs.map +1 -0
  63. package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs +91 -2
  64. package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs.map +1 -1
  65. package/fesm2022/mintplayer-ng-bootstrap-scheduler.mjs +16 -5
  66. package/fesm2022/mintplayer-ng-bootstrap-scheduler.mjs.map +1 -1
  67. package/fesm2022/mintplayer-ng-bootstrap-scrollspy.mjs +2 -2
  68. package/fesm2022/mintplayer-ng-bootstrap-scrollspy.mjs.map +1 -1
  69. package/fesm2022/mintplayer-ng-bootstrap-searchbox.mjs +28 -5
  70. package/fesm2022/mintplayer-ng-bootstrap-searchbox.mjs.map +1 -1
  71. package/fesm2022/mintplayer-ng-bootstrap-select.mjs +4 -3
  72. package/fesm2022/mintplayer-ng-bootstrap-select.mjs.map +1 -1
  73. package/fesm2022/mintplayer-ng-bootstrap-select2.mjs +18 -4
  74. package/fesm2022/mintplayer-ng-bootstrap-select2.mjs.map +1 -1
  75. package/fesm2022/mintplayer-ng-bootstrap-signature-pad.mjs +4 -3
  76. package/fesm2022/mintplayer-ng-bootstrap-signature-pad.mjs.map +1 -1
  77. package/fesm2022/mintplayer-ng-bootstrap-tab-control.mjs +2 -2
  78. package/fesm2022/mintplayer-ng-bootstrap-tab-control.mjs.map +1 -1
  79. package/fesm2022/mintplayer-ng-bootstrap-table.mjs +10 -3
  80. package/fesm2022/mintplayer-ng-bootstrap-table.mjs.map +1 -1
  81. package/fesm2022/mintplayer-ng-bootstrap-tile-manager.mjs +143 -29
  82. package/fesm2022/mintplayer-ng-bootstrap-tile-manager.mjs.map +1 -1
  83. package/fesm2022/mintplayer-ng-bootstrap-timepicker.mjs +2 -2
  84. package/fesm2022/mintplayer-ng-bootstrap-timepicker.mjs.map +1 -1
  85. package/fesm2022/mintplayer-ng-bootstrap-toast.mjs +7 -4
  86. package/fesm2022/mintplayer-ng-bootstrap-toast.mjs.map +1 -1
  87. package/fesm2022/mintplayer-ng-bootstrap-toggle-button.mjs +42 -21
  88. package/fesm2022/mintplayer-ng-bootstrap-toggle-button.mjs.map +1 -1
  89. package/fesm2022/mintplayer-ng-bootstrap-tooltip.mjs +33 -4
  90. package/fesm2022/mintplayer-ng-bootstrap-tooltip.mjs.map +1 -1
  91. package/fesm2022/mintplayer-ng-bootstrap-treeview.mjs +17 -7
  92. package/fesm2022/mintplayer-ng-bootstrap-treeview.mjs.map +1 -1
  93. package/fesm2022/mintplayer-ng-bootstrap-typeahead.mjs +50 -8
  94. package/fesm2022/mintplayer-ng-bootstrap-typeahead.mjs.map +1 -1
  95. package/fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs +34 -12
  96. package/fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs.map +1 -1
  97. package/fesm2022/mintplayer-ng-bootstrap-web-components-a11y.mjs +74 -0
  98. package/fesm2022/mintplayer-ng-bootstrap-web-components-a11y.mjs.map +1 -0
  99. package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs +1476 -71
  100. package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs.map +1 -1
  101. package/fesm2022/mintplayer-ng-bootstrap-web-components-splitter.mjs +194 -2
  102. package/fesm2022/mintplayer-ng-bootstrap-web-components-splitter.mjs.map +1 -1
  103. package/fesm2022/mintplayer-ng-bootstrap-web-components-tab-control.mjs +4 -0
  104. package/fesm2022/mintplayer-ng-bootstrap-web-components-tab-control.mjs.map +1 -1
  105. package/package.json +14 -2
  106. package/types/mintplayer-ng-bootstrap-a11y.d.ts +196 -0
  107. package/types/mintplayer-ng-bootstrap-accordion.d.ts +4 -2
  108. package/types/mintplayer-ng-bootstrap-breadcrumb.d.ts +2 -1
  109. package/types/mintplayer-ng-bootstrap-button-group.d.ts +2 -1
  110. package/types/mintplayer-ng-bootstrap-calendar.d.ts +32 -0
  111. package/types/mintplayer-ng-bootstrap-carousel.d.ts +56 -3
  112. package/types/mintplayer-ng-bootstrap-code-snippet.d.ts +1 -0
  113. package/types/mintplayer-ng-bootstrap-color-picker.d.ts +75 -4
  114. package/types/mintplayer-ng-bootstrap-datatable.d.ts +1 -1
  115. package/types/mintplayer-ng-bootstrap-dock.d.ts +51 -0
  116. package/types/mintplayer-ng-bootstrap-dropdown-menu.d.ts +54 -9
  117. package/types/mintplayer-ng-bootstrap-dropdown.d.ts +57 -2
  118. package/types/mintplayer-ng-bootstrap-file-upload.d.ts +4 -1
  119. package/types/mintplayer-ng-bootstrap-has-overlay.d.ts +14 -0
  120. package/types/mintplayer-ng-bootstrap-marquee.d.ts +2 -1
  121. package/types/mintplayer-ng-bootstrap-modal.d.ts +25 -1
  122. package/types/mintplayer-ng-bootstrap-multiselect.d.ts +2 -1
  123. package/types/mintplayer-ng-bootstrap-navbar-toggler.d.ts +4 -2
  124. package/types/mintplayer-ng-bootstrap-navbar.d.ts +25 -1
  125. package/types/mintplayer-ng-bootstrap-offcanvas.d.ts +23 -1
  126. package/types/mintplayer-ng-bootstrap-pagination.d.ts +3 -1
  127. package/types/mintplayer-ng-bootstrap-placeholder.d.ts +5 -1
  128. package/types/mintplayer-ng-bootstrap-playlist-toggler.d.ts +4 -2
  129. package/types/mintplayer-ng-bootstrap-popover.d.ts +21 -1
  130. package/types/mintplayer-ng-bootstrap-priority-nav.d.ts +4 -1
  131. package/types/mintplayer-ng-bootstrap-progress-bar.d.ts +4 -2
  132. package/types/mintplayer-ng-bootstrap-range.d.ts +2 -1
  133. package/types/mintplayer-ng-bootstrap-rating.d.ts +3 -0
  134. package/types/mintplayer-ng-bootstrap-reduced-motion.d.ts +36 -0
  135. package/types/mintplayer-ng-bootstrap-resizable.d.ts +4 -0
  136. package/types/mintplayer-ng-bootstrap-scheduler.d.ts +42 -9
  137. package/types/mintplayer-ng-bootstrap-scrollspy.d.ts +1 -1
  138. package/types/mintplayer-ng-bootstrap-searchbox.d.ts +8 -1
  139. package/types/mintplayer-ng-bootstrap-select.d.ts +2 -1
  140. package/types/mintplayer-ng-bootstrap-select2.d.ts +3 -0
  141. package/types/mintplayer-ng-bootstrap-signature-pad.d.ts +2 -1
  142. package/types/mintplayer-ng-bootstrap-table.d.ts +8 -1
  143. package/types/mintplayer-ng-bootstrap-tile-manager.d.ts +21 -2
  144. package/types/mintplayer-ng-bootstrap-toast.d.ts +6 -1
  145. package/types/mintplayer-ng-bootstrap-toggle-button.d.ts +11 -0
  146. package/types/mintplayer-ng-bootstrap-tooltip.d.ts +5 -0
  147. package/types/mintplayer-ng-bootstrap-treeview.d.ts +12 -1
  148. package/types/mintplayer-ng-bootstrap-typeahead.d.ts +11 -3
  149. package/types/mintplayer-ng-bootstrap-virtual-datatable.d.ts +14 -1
  150. package/types/mintplayer-ng-bootstrap-web-components-a11y.d.ts +34 -0
  151. package/types/mintplayer-ng-bootstrap-web-components-scheduler-core.d.ts +35 -11
  152. package/types/mintplayer-ng-bootstrap-web-components-scheduler.d.ts +246 -0
  153. package/types/mintplayer-ng-bootstrap-web-components-splitter.d.ts +95 -37
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-web-components-tab-control.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/web-components/tab-control/src/styles/tab-control.styles.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/tab-control/src/components/mp-tab-control.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/tab-control/src/components/mp-tab-page.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/tab-control/src/index.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/tab-control/mintplayer-ng-bootstrap-web-components-tab-control.ts"],"sourcesContent":["// AUTO-GENERATED — do not edit by hand.\n// Source: tab-control.styles.scss\n// Regenerate with the codegen-wc Nx target.\n\nimport { unsafeCSS } from 'lit';\n\nexport const tabControlStyles = unsafeCSS(`.nav {\n --bs-nav-link-padding-x: 1rem;\n --bs-nav-link-padding-y: 0.5rem;\n --bs-nav-link-font-weight: ;\n --bs-nav-link-color: var(--bs-link-color);\n --bs-nav-link-hover-color: var(--bs-link-hover-color);\n --bs-nav-link-disabled-color: var(--bs-secondary-color);\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);\n font-size: var(--bs-nav-link-font-size);\n font-weight: var(--bs-nav-link-font-weight);\n color: var(--bs-nav-link-color);\n text-decoration: none;\n background: none;\n border: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .nav-link {\n transition: none;\n }\n}\n.nav-link:hover, .nav-link:focus {\n color: var(--bs-nav-link-hover-color);\n}\n.nav-link:focus-visible {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.nav-link.disabled, .nav-link:disabled {\n color: var(--bs-nav-link-disabled-color);\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n --bs-nav-tabs-border-width: var(--bs-border-width);\n --bs-nav-tabs-border-color: var(--bs-border-color);\n --bs-nav-tabs-border-radius: var(--bs-border-radius);\n --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);\n --bs-nav-tabs-link-active-color: var(--bs-emphasis-color);\n --bs-nav-tabs-link-active-bg: var(--bs-body-bg);\n --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);\n border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);\n}\n.nav-tabs .nav-link {\n margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));\n border: var(--bs-nav-tabs-border-width) solid transparent;\n border-top-left-radius: var(--bs-nav-tabs-border-radius);\n border-top-right-radius: var(--bs-nav-tabs-border-radius);\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n isolation: isolate;\n border-color: var(--bs-nav-tabs-link-hover-border-color);\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: var(--bs-nav-tabs-link-active-color);\n background-color: var(--bs-nav-tabs-link-active-bg);\n border-color: var(--bs-nav-tabs-link-active-border-color);\n}\n.nav-tabs .dropdown-menu {\n margin-top: calc(-1 * var(--bs-nav-tabs-border-width));\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills {\n --bs-nav-pills-border-radius: var(--bs-border-radius);\n --bs-nav-pills-link-active-color: #fff;\n --bs-nav-pills-link-active-bg: #0d6efd;\n}\n.nav-pills .nav-link {\n border-radius: var(--bs-nav-pills-border-radius);\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: var(--bs-nav-pills-link-active-color);\n background-color: var(--bs-nav-pills-link-active-bg);\n}\n\n.nav-underline {\n --bs-nav-underline-gap: 1rem;\n --bs-nav-underline-border-width: 0.125rem;\n --bs-nav-underline-link-active-color: var(--bs-emphasis-color);\n gap: var(--bs-nav-underline-gap);\n}\n.nav-underline .nav-link {\n padding-right: 0;\n padding-left: 0;\n border-bottom: var(--bs-nav-underline-border-width) solid transparent;\n}\n.nav-underline .nav-link:hover, .nav-underline .nav-link:focus {\n border-bottom-color: currentcolor;\n}\n.nav-underline .nav-link.active,\n.nav-underline .show > .nav-link {\n font-weight: 700;\n color: var(--bs-nav-underline-link-active-color);\n border-bottom-color: currentcolor;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n flex-grow: 1;\n flex-basis: 0;\n text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n width: 100%;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n\n:host {\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap;\n}\n\n.flex-grow-1 {\n flex-grow: 1;\n}\n\n.overflow-auto {\n overflow: auto;\n}\n\n.overflow-x-auto {\n overflow-x: auto;\n}\n\n.overflow-y-hidden {\n overflow-y: hidden;\n}\n\n.text-nowrap {\n white-space: nowrap;\n}\n\n.border {\n border: var(--bs-border-width, 1px) var(--bs-border-style, solid) var(--bs-border-color, #dee2e6) !important;\n}\n\n.border-top {\n border-top: var(--bs-border-width, 1px) var(--bs-border-style, solid) var(--bs-border-color, #dee2e6) !important;\n}\n\n.tsc {\n max-height: 41px;\n overflow: hidden;\n flex-shrink: 0;\n z-index: 1;\n}\n.tsc .nav.nav-tabs {\n margin-top: 0;\n border-bottom: 0;\n}\n.tsc.bottom-tabs {\n margin-top: -1px;\n}\n.tsc.bottom-tabs .nav.nav-tabs {\n border-bottom-width: 0;\n}\n.tsc.bottom-tabs .nav.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-left-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n.tsc.bottom-tabs .nav.nav-tabs .nav-item {\n margin-bottom: 2px;\n margin-top: -1px;\n}\n.tsc.bottom-tabs .nav.nav-tabs .nav-item.show .nav-link,\n.tsc.bottom-tabs .nav.nav-tabs .nav-link.active {\n border-color: #fff #dee2e6 #dee2e6 #dee2e6;\n}\n\n.tsc .nav-link {\n cursor: pointer;\n background: transparent;\n font: inherit;\n text-align: inherit;\n}\n\n.tsc .nav-link.disabled {\n cursor: not-allowed;\n}\n\n.tab-content {\n margin-top: -1px;\n}`);\nexport default tabControlStyles;\n","import { LitElement, html, nothing, type TemplateResult } from 'lit';\nimport { tabControlStyles } from '../styles';\nimport type { TabsPosition } from '../types';\n\nexport interface TabActivateEventDetail {\n /** The `tab-id` of the tab the user activated. */\n tabId: string;\n /** The original DOM event (click or keydown) that triggered the activation. */\n originalEvent: Event;\n}\n\ninterface TabInfo {\n tabId: string;\n disabled: boolean;\n}\n\nconst isHidden = (el: Element): boolean =>\n el.hasAttribute('data-hidden') &&\n el.getAttribute('data-hidden') !== 'false';\n\n/**\n * <mp-tab-control>\n *\n * Bootstrap-styled tab strip. Pages live in named `${id}-content` slots and\n * headers in `${id}-header` slots. The shadow DOM dynamically projects only\n * the currently-active page via `<slot name=\"${activeId}-content\">`, so\n * inactive panels never enter the rendered tree.\n *\n * Authoring (vanilla):\n *\n * <mp-tab-control active-tab=\"overview\">\n * <span slot=\"overview-header\">Overview</span>\n * <div slot=\"overview-content\">Hello</div>\n * <span slot=\"details-header\">Details</span>\n * <div slot=\"details-content\">Details body</div>\n * </mp-tab-control>\n *\n * To mark a tab disabled, set `data-disabled` on the `*-content` element.\n *\n * Active state is **controlled by the host** — the host sets `active-tab` and\n * listens for `tab-activate` events. The Angular wrapper (`bs-tab-control`)\n * drives this via signals.\n */\nexport class MpTabControl extends LitElement {\n static override styles = [tabControlStyles];\n\n static override get observedAttributes(): string[] {\n return [\n ...(super.observedAttributes ?? []),\n 'tabs-position',\n 'border',\n 'active-tab',\n 'select-first-tab',\n ];\n }\n\n private tabs: TabInfo[] = [];\n private mutationObserver: MutationObserver | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n // role=\"tablist\" lives on the inner <ul> that directly contains the tab\n // buttons — we deliberately don't repeat it on the host.\n this.mutationObserver = new MutationObserver(() => this.refreshTabs());\n this.mutationObserver.observe(this, {\n childList: true,\n subtree: false,\n attributes: true,\n attributeFilter: ['slot', 'data-disabled', 'data-hidden'],\n });\n }\n\n override disconnectedCallback(): void {\n this.mutationObserver?.disconnect();\n this.mutationObserver = null;\n super.disconnectedCallback();\n }\n\n override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null,\n ): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (oldValue === newValue) return;\n this.requestUpdate();\n }\n\n protected override firstUpdated(): void {\n this.refreshTabs();\n }\n\n private get tabsPosition(): TabsPosition {\n const v = this.getAttribute('tabs-position');\n return v === 'bottom' ? 'bottom' : 'top';\n }\n\n private get border(): 'full' | 'top' | 'none' {\n if (!this.hasAttribute('border')) return 'full';\n const v = this.getAttribute('border');\n if (v === 'false') return 'none';\n if (v === 'top') return 'top';\n return 'full';\n }\n\n private get selectFirstTab(): boolean {\n return this.hasAttribute('select-first-tab')\n ? this.getAttribute('select-first-tab') !== 'false'\n : true;\n }\n\n private get activeTabId(): string | null {\n return this.getAttribute('active-tab');\n }\n\n private refreshTabs(): void {\n const found = new Map<string, TabInfo>();\n for (const child of Array.from(this.children)) {\n const slot = child.getAttribute('slot');\n if (!slot) continue;\n const m = slot.match(/^(.+)-content$/);\n if (!m) continue;\n // `data-hidden` excludes a tab from the strip and content entirely.\n // Used by hosts (like the dock manager) to suppress a tab visually\n // mid-drag without churning slot projection.\n if (isHidden(child)) continue;\n const tabId = m[1];\n const disabled = child.hasAttribute('data-disabled') &&\n child.getAttribute('data-disabled') !== 'false';\n // First occurrence wins on duplicate slot names.\n if (!found.has(tabId)) {\n found.set(tabId, { tabId, disabled });\n }\n }\n this.tabs = Array.from(found.values());\n this.requestUpdate();\n }\n\n private resolvedActiveTabId(): string | null {\n const explicit = this.activeTabId;\n if (\n explicit !== null &&\n this.tabs.some((t) => t.tabId === explicit && !t.disabled)\n ) {\n return explicit;\n }\n if (!this.selectFirstTab) return null;\n const firstEnabled = this.tabs.find((t) => !t.disabled);\n return firstEnabled?.tabId ?? null;\n }\n\n override render(): TemplateResult {\n const activeId = this.resolvedActiveTabId();\n const strip = html`\n <div class=\"tsc${this.tabsPosition === 'bottom' ? ' bottom-tabs' : ''}\">\n <ul\n class=\"nav nav-tabs flex-nowrap overflow-x-auto overflow-y-hidden\"\n role=\"tablist\"\n >\n ${this.tabs.map((tab) => this.renderTabHeader(tab, activeId))}\n </ul>\n </div>\n `;\n const borderMode = this.border;\n const borderClass =\n borderMode === 'none'\n ? ''\n : borderMode === 'top'\n ? ' border-top'\n : activeId\n ? ' border'\n : ' border-top';\n const content = html`\n <div\n class=\"tab-content flex-grow-1 overflow-auto${borderClass}\"\n >\n <slot name=${activeId ? `${activeId}-content` : '__none__'}></slot>\n </div>\n `;\n return html`\n ${this.tabsPosition === 'top' ? strip : nothing}\n ${content}\n ${this.tabsPosition === 'bottom' ? strip : nothing}\n `;\n }\n\n private renderTabHeader(\n tab: TabInfo,\n activeId: string | null,\n ): TemplateResult {\n const isActive = tab.tabId === activeId;\n return html`\n <li class=\"nav-item\" role=\"presentation\">\n <button\n type=\"button\"\n class=\"nav-link text-nowrap${isActive ? ' active' : ''}${tab.disabled\n ? ' disabled'\n : ''}\"\n role=\"tab\"\n id=${`${tab.tabId}-header-button`}\n aria-controls=${`${tab.tabId}-panel`}\n aria-selected=${isActive ? 'true' : 'false'}\n ?disabled=${tab.disabled}\n tabindex=${tab.disabled ? -1 : isActive ? 0 : -1}\n @click=${(ev: Event) => this.activate(tab, ev)}\n @keydown=${(ev: KeyboardEvent) => this.handleKeydown(tab, ev)}\n >\n <slot name=${`${tab.tabId}-header`}></slot>\n </button>\n </li>\n `;\n }\n\n private activate(tab: TabInfo, ev: Event): void {\n if (tab.disabled) return;\n ev.preventDefault();\n this.dispatchEvent(\n new CustomEvent<TabActivateEventDetail>('tab-activate', {\n detail: { tabId: tab.tabId, originalEvent: ev },\n bubbles: true,\n composed: true,\n }),\n );\n this.setAttribute('active-tab', tab.tabId);\n }\n\n private handleKeydown(tab: TabInfo, ev: KeyboardEvent): void {\n switch (ev.key) {\n case 'Enter':\n case ' ':\n this.activate(tab, ev);\n return;\n case 'Home':\n case 'End': {\n ev.preventDefault();\n const enabled = this.tabs.filter((t) => !t.disabled);\n if (enabled.length === 0) return;\n const target = ev.key === 'Home' ? enabled[0] : enabled[enabled.length - 1];\n this.moveFocusAndActivate(target, ev);\n return;\n }\n case 'ArrowLeft':\n case 'ArrowRight': {\n ev.preventDefault();\n const dir = ev.key === 'ArrowRight' ? 1 : -1;\n const enabled = this.tabs.filter((t) => !t.disabled);\n if (enabled.length === 0) return;\n const currentIdx = enabled.findIndex((t) => t.tabId === tab.tabId);\n const nextIdx =\n (currentIdx + dir + enabled.length) % enabled.length;\n this.moveFocusAndActivate(enabled[nextIdx], ev);\n return;\n }\n }\n }\n\n private moveFocusAndActivate(target: TabInfo, ev: Event): void {\n this.setAttribute('active-tab', target.tabId);\n const button = this.shadowRoot?.querySelector<HTMLButtonElement>(\n `button[id=\"${target.tabId}-header-button\"]`,\n );\n button?.focus();\n this.dispatchEvent(\n new CustomEvent<TabActivateEventDetail>('tab-activate', {\n detail: { tabId: target.tabId, originalEvent: ev },\n bubbles: true,\n composed: true,\n }),\n );\n }\n}\n\nif (\n typeof customElements !== 'undefined' &&\n !customElements.get('mp-tab-control')\n) {\n customElements.define('mp-tab-control', MpTabControl);\n}\n","import { LitElement, html, css, type TemplateResult } from 'lit';\n\n/**\n * <mp-tab-page>\n *\n * Optional convenience wrapper for vanilla consumers. Sets `slot=\"${tabId}-content\"`\n * on itself based on its `tab-id` attribute, so the parent `<mp-tab-control>`\n * picks it up via named-slot projection.\n *\n * Also mirrors `disabled` to `data-disabled` so the tab-control can read the\n * disabled state without inspecting child types.\n *\n * Use directly:\n *\n * <mp-tab-control>\n * <span slot=\"t1-header\">Tab 1</span>\n * <mp-tab-page tab-id=\"t1\">Content 1</mp-tab-page>\n * </mp-tab-control>\n *\n * Or skip this element entirely and put the slot/data-disabled attributes\n * directly on whatever element holds your tab content:\n *\n * <mp-tab-control>\n * <span slot=\"t1-header\">Tab 1</span>\n * <div slot=\"t1-content\">Content 1</div>\n * </mp-tab-control>\n */\nexport class MpTabPage extends LitElement {\n static override styles = css`\n :host {\n display: block;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return [\n ...(super.observedAttributes ?? []),\n 'tab-id',\n 'disabled',\n ];\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.syncSlot();\n this.syncDisabled();\n }\n\n override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null,\n ): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (oldValue === newValue) return;\n if (name === 'tab-id') this.syncSlot();\n if (name === 'disabled') this.syncDisabled();\n }\n\n private syncSlot(): void {\n const tabId = this.getAttribute('tab-id');\n if (tabId) {\n this.setAttribute('slot', `${tabId}-content`);\n } else {\n this.removeAttribute('slot');\n }\n }\n\n private syncDisabled(): void {\n if (this.hasAttribute('disabled')) {\n this.setAttribute('data-disabled', '');\n } else {\n this.removeAttribute('data-disabled');\n }\n }\n\n override render(): TemplateResult {\n return html`<slot></slot>`;\n }\n}\n\nif (\n typeof customElements !== 'undefined' &&\n !customElements.get('mp-tab-page')\n) {\n customElements.define('mp-tab-page', MpTabPage);\n}\n","// Components\nexport { MpTabControl, MpTabPage } from './components';\nexport type { TabActivateEventDetail } from './components';\n\n// Types\nexport type { TabsPosition } from './types';\n\n// Styles (for custom styling extensions)\nexport { tabControlStyles } from './styles';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mintplayer-ng-bootstrap-web-components-tab-control.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/web-components/tab-control/src/styles/tab-control.styles.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/tab-control/src/components/mp-tab-control.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/tab-control/src/components/mp-tab-page.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/tab-control/src/index.ts","../../../../libs/mintplayer-ng-bootstrap/web-components/tab-control/mintplayer-ng-bootstrap-web-components-tab-control.ts"],"sourcesContent":["// AUTO-GENERATED — do not edit by hand.\n// Source: tab-control.styles.scss\n// Regenerate with the codegen-wc Nx target.\n\nimport { unsafeCSS } from 'lit';\n\nexport const tabControlStyles = unsafeCSS(`.nav {\n --bs-nav-link-padding-x: 1rem;\n --bs-nav-link-padding-y: 0.5rem;\n --bs-nav-link-font-weight: ;\n --bs-nav-link-color: var(--bs-link-color);\n --bs-nav-link-hover-color: var(--bs-link-hover-color);\n --bs-nav-link-disabled-color: var(--bs-secondary-color);\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);\n font-size: var(--bs-nav-link-font-size);\n font-weight: var(--bs-nav-link-font-weight);\n color: var(--bs-nav-link-color);\n text-decoration: none;\n background: none;\n border: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .nav-link {\n transition: none;\n }\n}\n.nav-link:hover, .nav-link:focus {\n color: var(--bs-nav-link-hover-color);\n}\n.nav-link:focus-visible {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.nav-link.disabled, .nav-link:disabled {\n color: var(--bs-nav-link-disabled-color);\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n --bs-nav-tabs-border-width: var(--bs-border-width);\n --bs-nav-tabs-border-color: var(--bs-border-color);\n --bs-nav-tabs-border-radius: var(--bs-border-radius);\n --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);\n --bs-nav-tabs-link-active-color: var(--bs-emphasis-color);\n --bs-nav-tabs-link-active-bg: var(--bs-body-bg);\n --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);\n border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);\n}\n.nav-tabs .nav-link {\n margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));\n border: var(--bs-nav-tabs-border-width) solid transparent;\n border-top-left-radius: var(--bs-nav-tabs-border-radius);\n border-top-right-radius: var(--bs-nav-tabs-border-radius);\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n isolation: isolate;\n border-color: var(--bs-nav-tabs-link-hover-border-color);\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: var(--bs-nav-tabs-link-active-color);\n background-color: var(--bs-nav-tabs-link-active-bg);\n border-color: var(--bs-nav-tabs-link-active-border-color);\n}\n.nav-tabs .dropdown-menu {\n margin-top: calc(-1 * var(--bs-nav-tabs-border-width));\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills {\n --bs-nav-pills-border-radius: var(--bs-border-radius);\n --bs-nav-pills-link-active-color: #fff;\n --bs-nav-pills-link-active-bg: #0d6efd;\n}\n.nav-pills .nav-link {\n border-radius: var(--bs-nav-pills-border-radius);\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: var(--bs-nav-pills-link-active-color);\n background-color: var(--bs-nav-pills-link-active-bg);\n}\n\n.nav-underline {\n --bs-nav-underline-gap: 1rem;\n --bs-nav-underline-border-width: 0.125rem;\n --bs-nav-underline-link-active-color: var(--bs-emphasis-color);\n gap: var(--bs-nav-underline-gap);\n}\n.nav-underline .nav-link {\n padding-right: 0;\n padding-left: 0;\n border-bottom: var(--bs-nav-underline-border-width) solid transparent;\n}\n.nav-underline .nav-link:hover, .nav-underline .nav-link:focus {\n border-bottom-color: currentcolor;\n}\n.nav-underline .nav-link.active,\n.nav-underline .show > .nav-link {\n font-weight: 700;\n color: var(--bs-nav-underline-link-active-color);\n border-bottom-color: currentcolor;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n flex-grow: 1;\n flex-basis: 0;\n text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n width: 100%;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n\n:host {\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap;\n}\n\n.flex-grow-1 {\n flex-grow: 1;\n}\n\n.overflow-auto {\n overflow: auto;\n}\n\n.overflow-x-auto {\n overflow-x: auto;\n}\n\n.overflow-y-hidden {\n overflow-y: hidden;\n}\n\n.text-nowrap {\n white-space: nowrap;\n}\n\n.border {\n border: var(--bs-border-width, 1px) var(--bs-border-style, solid) var(--bs-border-color, #dee2e6) !important;\n}\n\n.border-top {\n border-top: var(--bs-border-width, 1px) var(--bs-border-style, solid) var(--bs-border-color, #dee2e6) !important;\n}\n\n.tsc {\n max-height: 41px;\n overflow: hidden;\n flex-shrink: 0;\n z-index: 1;\n}\n.tsc .nav.nav-tabs {\n margin-top: 0;\n border-bottom: 0;\n}\n.tsc.bottom-tabs {\n margin-top: -1px;\n}\n.tsc.bottom-tabs .nav.nav-tabs {\n border-bottom-width: 0;\n}\n.tsc.bottom-tabs .nav.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-left-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n.tsc.bottom-tabs .nav.nav-tabs .nav-item {\n margin-bottom: 2px;\n margin-top: -1px;\n}\n.tsc.bottom-tabs .nav.nav-tabs .nav-item.show .nav-link,\n.tsc.bottom-tabs .nav.nav-tabs .nav-link.active {\n border-color: #fff #dee2e6 #dee2e6 #dee2e6;\n}\n\n.tsc .nav-link {\n cursor: pointer;\n background: transparent;\n font: inherit;\n text-align: inherit;\n}\n\n.tsc .nav-link.disabled {\n cursor: not-allowed;\n}\n\n.tab-content {\n margin-top: -1px;\n}`);\nexport default tabControlStyles;\n","import { LitElement, html, nothing, type TemplateResult } from 'lit';\nimport { tabControlStyles } from '../styles';\nimport type { TabsPosition } from '../types';\n\nexport interface TabActivateEventDetail {\n /** The `tab-id` of the tab the user activated. */\n tabId: string;\n /** The original DOM event (click or keydown) that triggered the activation. */\n originalEvent: Event;\n}\n\ninterface TabInfo {\n tabId: string;\n disabled: boolean;\n}\n\nconst isHidden = (el: Element): boolean =>\n el.hasAttribute('data-hidden') &&\n el.getAttribute('data-hidden') !== 'false';\n\n/**\n * <mp-tab-control>\n *\n * Bootstrap-styled tab strip. Pages live in named `${id}-content` slots and\n * headers in `${id}-header` slots. The shadow DOM dynamically projects only\n * the currently-active page via `<slot name=\"${activeId}-content\">`, so\n * inactive panels never enter the rendered tree.\n *\n * Authoring (vanilla):\n *\n * <mp-tab-control active-tab=\"overview\">\n * <span slot=\"overview-header\">Overview</span>\n * <div slot=\"overview-content\">Hello</div>\n * <span slot=\"details-header\">Details</span>\n * <div slot=\"details-content\">Details body</div>\n * </mp-tab-control>\n *\n * To mark a tab disabled, set `data-disabled` on the `*-content` element.\n *\n * Active state is **controlled by the host** — the host sets `active-tab` and\n * listens for `tab-activate` events. The Angular wrapper (`bs-tab-control`)\n * drives this via signals.\n */\nexport class MpTabControl extends LitElement {\n static override styles = [tabControlStyles];\n\n static override get observedAttributes(): string[] {\n return [\n ...(super.observedAttributes ?? []),\n 'tabs-position',\n 'border',\n 'active-tab',\n 'select-first-tab',\n ];\n }\n\n private tabs: TabInfo[] = [];\n private mutationObserver: MutationObserver | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n // role=\"tablist\" lives on the inner <ul> that directly contains the tab\n // buttons — we deliberately don't repeat it on the host.\n this.mutationObserver = new MutationObserver(() => this.refreshTabs());\n this.mutationObserver.observe(this, {\n childList: true,\n subtree: false,\n attributes: true,\n attributeFilter: ['slot', 'data-disabled', 'data-hidden'],\n });\n }\n\n override disconnectedCallback(): void {\n this.mutationObserver?.disconnect();\n this.mutationObserver = null;\n super.disconnectedCallback();\n }\n\n override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null,\n ): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (oldValue === newValue) return;\n this.requestUpdate();\n }\n\n protected override firstUpdated(): void {\n this.refreshTabs();\n }\n\n private get tabsPosition(): TabsPosition {\n const v = this.getAttribute('tabs-position');\n return v === 'bottom' ? 'bottom' : 'top';\n }\n\n private get border(): 'full' | 'top' | 'none' {\n if (!this.hasAttribute('border')) return 'full';\n const v = this.getAttribute('border');\n if (v === 'false') return 'none';\n if (v === 'top') return 'top';\n return 'full';\n }\n\n private get selectFirstTab(): boolean {\n return this.hasAttribute('select-first-tab')\n ? this.getAttribute('select-first-tab') !== 'false'\n : true;\n }\n\n private get activeTabId(): string | null {\n return this.getAttribute('active-tab');\n }\n\n private refreshTabs(): void {\n const found = new Map<string, TabInfo>();\n for (const child of Array.from(this.children)) {\n const slot = child.getAttribute('slot');\n if (!slot) continue;\n const m = slot.match(/^(.+)-content$/);\n if (!m) continue;\n // `data-hidden` excludes a tab from the strip and content entirely.\n // Used by hosts (like the dock manager) to suppress a tab visually\n // mid-drag without churning slot projection.\n if (isHidden(child)) continue;\n const tabId = m[1];\n const disabled = child.hasAttribute('data-disabled') &&\n child.getAttribute('data-disabled') !== 'false';\n // First occurrence wins on duplicate slot names.\n if (!found.has(tabId)) {\n found.set(tabId, { tabId, disabled });\n }\n }\n this.tabs = Array.from(found.values());\n this.requestUpdate();\n }\n\n private resolvedActiveTabId(): string | null {\n const explicit = this.activeTabId;\n if (\n explicit !== null &&\n this.tabs.some((t) => t.tabId === explicit && !t.disabled)\n ) {\n return explicit;\n }\n if (!this.selectFirstTab) return null;\n const firstEnabled = this.tabs.find((t) => !t.disabled);\n return firstEnabled?.tabId ?? null;\n }\n\n override render(): TemplateResult {\n const activeId = this.resolvedActiveTabId();\n const strip = html`\n <div class=\"tsc${this.tabsPosition === 'bottom' ? ' bottom-tabs' : ''}\">\n <ul\n class=\"nav nav-tabs flex-nowrap overflow-x-auto overflow-y-hidden\"\n role=\"tablist\"\n >\n ${this.tabs.map((tab) => this.renderTabHeader(tab, activeId))}\n </ul>\n </div>\n `;\n const borderMode = this.border;\n const borderClass =\n borderMode === 'none'\n ? ''\n : borderMode === 'top'\n ? ' border-top'\n : activeId\n ? ' border'\n : ' border-top';\n const content = html`\n <div\n class=\"tab-content flex-grow-1 overflow-auto${borderClass}\"\n role=${activeId ? 'tabpanel' : nothing}\n id=${activeId ? `${activeId}-panel` : nothing}\n aria-labelledby=${activeId ? `${activeId}-header-button` : nothing}\n tabindex=${activeId ? '0' : nothing}\n >\n <slot name=${activeId ? `${activeId}-content` : '__none__'}></slot>\n </div>\n `;\n return html`\n ${this.tabsPosition === 'top' ? strip : nothing}\n ${content}\n ${this.tabsPosition === 'bottom' ? strip : nothing}\n `;\n }\n\n private renderTabHeader(\n tab: TabInfo,\n activeId: string | null,\n ): TemplateResult {\n const isActive = tab.tabId === activeId;\n return html`\n <li class=\"nav-item\" role=\"presentation\">\n <button\n type=\"button\"\n class=\"nav-link text-nowrap${isActive ? ' active' : ''}${tab.disabled\n ? ' disabled'\n : ''}\"\n role=\"tab\"\n id=${`${tab.tabId}-header-button`}\n aria-controls=${`${tab.tabId}-panel`}\n aria-selected=${isActive ? 'true' : 'false'}\n ?disabled=${tab.disabled}\n tabindex=${tab.disabled ? -1 : isActive ? 0 : -1}\n @click=${(ev: Event) => this.activate(tab, ev)}\n @keydown=${(ev: KeyboardEvent) => this.handleKeydown(tab, ev)}\n >\n <slot name=${`${tab.tabId}-header`}></slot>\n </button>\n </li>\n `;\n }\n\n private activate(tab: TabInfo, ev: Event): void {\n if (tab.disabled) return;\n ev.preventDefault();\n this.dispatchEvent(\n new CustomEvent<TabActivateEventDetail>('tab-activate', {\n detail: { tabId: tab.tabId, originalEvent: ev },\n bubbles: true,\n composed: true,\n }),\n );\n this.setAttribute('active-tab', tab.tabId);\n }\n\n private handleKeydown(tab: TabInfo, ev: KeyboardEvent): void {\n switch (ev.key) {\n case 'Enter':\n case ' ':\n this.activate(tab, ev);\n return;\n case 'Home':\n case 'End': {\n ev.preventDefault();\n const enabled = this.tabs.filter((t) => !t.disabled);\n if (enabled.length === 0) return;\n const target = ev.key === 'Home' ? enabled[0] : enabled[enabled.length - 1];\n this.moveFocusAndActivate(target, ev);\n return;\n }\n case 'ArrowLeft':\n case 'ArrowRight': {\n ev.preventDefault();\n const dir = ev.key === 'ArrowRight' ? 1 : -1;\n const enabled = this.tabs.filter((t) => !t.disabled);\n if (enabled.length === 0) return;\n const currentIdx = enabled.findIndex((t) => t.tabId === tab.tabId);\n const nextIdx =\n (currentIdx + dir + enabled.length) % enabled.length;\n this.moveFocusAndActivate(enabled[nextIdx], ev);\n return;\n }\n }\n }\n\n private moveFocusAndActivate(target: TabInfo, ev: Event): void {\n this.setAttribute('active-tab', target.tabId);\n const button = this.shadowRoot?.querySelector<HTMLButtonElement>(\n `button[id=\"${target.tabId}-header-button\"]`,\n );\n button?.focus();\n this.dispatchEvent(\n new CustomEvent<TabActivateEventDetail>('tab-activate', {\n detail: { tabId: target.tabId, originalEvent: ev },\n bubbles: true,\n composed: true,\n }),\n );\n }\n}\n\nif (\n typeof customElements !== 'undefined' &&\n !customElements.get('mp-tab-control')\n) {\n customElements.define('mp-tab-control', MpTabControl);\n}\n","import { LitElement, html, css, type TemplateResult } from 'lit';\n\n/**\n * <mp-tab-page>\n *\n * Optional convenience wrapper for vanilla consumers. Sets `slot=\"${tabId}-content\"`\n * on itself based on its `tab-id` attribute, so the parent `<mp-tab-control>`\n * picks it up via named-slot projection.\n *\n * Also mirrors `disabled` to `data-disabled` so the tab-control can read the\n * disabled state without inspecting child types.\n *\n * Use directly:\n *\n * <mp-tab-control>\n * <span slot=\"t1-header\">Tab 1</span>\n * <mp-tab-page tab-id=\"t1\">Content 1</mp-tab-page>\n * </mp-tab-control>\n *\n * Or skip this element entirely and put the slot/data-disabled attributes\n * directly on whatever element holds your tab content:\n *\n * <mp-tab-control>\n * <span slot=\"t1-header\">Tab 1</span>\n * <div slot=\"t1-content\">Content 1</div>\n * </mp-tab-control>\n */\nexport class MpTabPage extends LitElement {\n static override styles = css`\n :host {\n display: block;\n }\n `;\n\n static override get observedAttributes(): string[] {\n return [\n ...(super.observedAttributes ?? []),\n 'tab-id',\n 'disabled',\n ];\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.syncSlot();\n this.syncDisabled();\n }\n\n override attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null,\n ): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (oldValue === newValue) return;\n if (name === 'tab-id') this.syncSlot();\n if (name === 'disabled') this.syncDisabled();\n }\n\n private syncSlot(): void {\n const tabId = this.getAttribute('tab-id');\n if (tabId) {\n this.setAttribute('slot', `${tabId}-content`);\n } else {\n this.removeAttribute('slot');\n }\n }\n\n private syncDisabled(): void {\n if (this.hasAttribute('disabled')) {\n this.setAttribute('data-disabled', '');\n } else {\n this.removeAttribute('data-disabled');\n }\n }\n\n override render(): TemplateResult {\n return html`<slot></slot>`;\n }\n}\n\nif (\n typeof customElements !== 'undefined' &&\n !customElements.get('mp-tab-page')\n) {\n customElements.define('mp-tab-page', MpTabPage);\n}\n","// Components\nexport { MpTabControl, MpTabPage } from './components';\nexport type { TabActivateEventDetail } from './components';\n\n// Types\nexport type { TabsPosition } from './types';\n\n// Styles (for custom styling extensions)\nexport { tabControlStyles } from './styles';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mintplayer/ng-bootstrap",
3
3
  "private": false,
4
- "version": "21.30.0",
4
+ "version": "21.31.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/MintPlayer/mintplayer-ng-bootstrap",
@@ -16,6 +16,10 @@
16
16
  "types": "./types/mintplayer-ng-bootstrap.d.ts",
17
17
  "default": "./fesm2022/mintplayer-ng-bootstrap.mjs"
18
18
  },
19
+ "./a11y": {
20
+ "types": "./types/mintplayer-ng-bootstrap-a11y.d.ts",
21
+ "default": "./fesm2022/mintplayer-ng-bootstrap-a11y.mjs"
22
+ },
19
23
  "./accordion": {
20
24
  "types": "./types/mintplayer-ng-bootstrap-accordion.d.ts",
21
25
  "default": "./fesm2022/mintplayer-ng-bootstrap-accordion.mjs"
@@ -252,6 +256,10 @@
252
256
  "types": "./types/mintplayer-ng-bootstrap-rating.d.ts",
253
257
  "default": "./fesm2022/mintplayer-ng-bootstrap-rating.mjs"
254
258
  },
259
+ "./reduced-motion": {
260
+ "types": "./types/mintplayer-ng-bootstrap-reduced-motion.d.ts",
261
+ "default": "./fesm2022/mintplayer-ng-bootstrap-reduced-motion.mjs"
262
+ },
255
263
  "./resizable": {
256
264
  "types": "./types/mintplayer-ng-bootstrap-resizable.d.ts",
257
265
  "default": "./fesm2022/mintplayer-ng-bootstrap-resizable.mjs"
@@ -356,6 +364,10 @@
356
364
  "types": "./types/mintplayer-ng-bootstrap-virtual-datatable.d.ts",
357
365
  "default": "./fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs"
358
366
  },
367
+ "./web-components/a11y": {
368
+ "types": "./types/mintplayer-ng-bootstrap-web-components-a11y.d.ts",
369
+ "default": "./fesm2022/mintplayer-ng-bootstrap-web-components-a11y.mjs"
370
+ },
359
371
  "./web-components/scheduler": {
360
372
  "types": "./types/mintplayer-ng-bootstrap-web-components-scheduler.d.ts",
361
373
  "default": "./fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs"
@@ -393,7 +405,7 @@
393
405
  "@mintplayer/ng-animations": "^21.1.0",
394
406
  "@mintplayer/pagination": "^2.3.0",
395
407
  "@mintplayer/ng-focus-on-load": "^21.2.0",
396
- "@mintplayer/ng-swiper": "^21.3.0"
408
+ "@mintplayer/ng-swiper": "^21.9.0"
397
409
  },
398
410
  "dependencies": {
399
411
  "tslib": "^2.3.0"
@@ -0,0 +1,196 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { ElementRef } from '@angular/core';
3
+ import { AriaLivePoliteness } from '@angular/cdk/a11y';
4
+
5
+ /**
6
+ * App-wide unique ID generator for ARIA wiring (`aria-controls`,
7
+ * `aria-labelledby`, `aria-activedescendant`, etc.).
8
+ *
9
+ * Why a service instead of `crypto.randomUUID()` or per-component counters:
10
+ * IDs need to stay short and human-readable in DevTools, and per-component
11
+ * counters collide when the same component is instantiated more than once on
12
+ * a page (two `bs-dropdown`s would each assign `bs-dropdown-1`). The shared
13
+ * counter guarantees uniqueness across the whole app without UUID noise.
14
+ */
15
+ declare class BsIdService {
16
+ private counter;
17
+ /** Returns `${prefix}-N` where N monotonically increases for the lifetime of the app. */
18
+ next(prefix: string): string;
19
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsIdService, never>;
20
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<BsIdService>;
21
+ }
22
+
23
+ /**
24
+ * One marker per focusable child of a `bsRovingFocus` container.
25
+ *
26
+ * - Mirrors the parent's mode into the host `tabindex` (0 if active in
27
+ * `tabindex` mode, -1 otherwise).
28
+ * - Toggles the `.bs-rovingfocus-active` class so SCSS can paint a focused-
29
+ * look highlight on the active item — important in `activedescendant`
30
+ * mode, where the item never receives `:focus` and the browser's focus
31
+ * ring never paints.
32
+ * - Auto-generates an `id` if the host doesn't already have one, so combobox
33
+ * `aria-activedescendant` always has a stable target. Honours an
34
+ * externally-supplied id when present.
35
+ *
36
+ * Consumers normally don't interact with this directive directly — they
37
+ * just stamp it on each list/menu/option element inside `bsRovingFocus`.
38
+ */
39
+ declare class BsRovingFocusItemDirective {
40
+ private parent;
41
+ elementRef: ElementRef<HTMLElement>;
42
+ private ids;
43
+ readonly disabled: _angular_core.InputSignal<boolean>;
44
+ /**
45
+ * The host element's id. Honoured if set externally (e.g. by a sibling
46
+ * component's [attr.id] host binding); otherwise generated in afterNextRender
47
+ * so combobox-style aria-activedescendant has a stable target.
48
+ *
49
+ * Backed by a signal so parent computeds (like BsRovingFocusDirective's
50
+ * activeDescendantId) re-run when the id is resolved post-mount. A plain
51
+ * `nativeElement.id` getter would be silently cached during the first
52
+ * computation and never re-read — leading to aria-activedescendant="" on
53
+ * combobox inputs even after the items got real ids.
54
+ */
55
+ private readonly _itemId;
56
+ get itemId(): string;
57
+ readonly index: _angular_core.Signal<any>;
58
+ readonly isActive: _angular_core.Signal<boolean>;
59
+ readonly tabindex: _angular_core.Signal<0 | -1>;
60
+ constructor();
61
+ onFocus(): void;
62
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsRovingFocusItemDirective, never>;
63
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsRovingFocusItemDirective, "[bsRovingFocusItem]", ["bsRovingFocusItem"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
64
+ }
65
+
66
+ type BsRovingFocusOrientation = 'vertical' | 'horizontal' | 'both';
67
+ type BsRovingFocusMode = 'tabindex' | 'activedescendant';
68
+ /**
69
+ * APG roving-tabindex / active-descendant container.
70
+ *
71
+ * Place on a list/menu/listbox; mark each focusable child with
72
+ * `bsRovingFocusItem`. Arrow keys, Home, and End move the active item; the
73
+ * directive auto-handles disabled items, wrap-around, and orientation.
74
+ *
75
+ * Two modes:
76
+ * - **`tabindex`** (default) — only the active item has `tabindex="0"`; real
77
+ * DOM focus moves. Right for menus, treeviews, tablists.
78
+ * - **`activedescendant`** — items keep `tabindex="-1"`; DOM focus stays on
79
+ * an external owner (e.g. a combobox `<input>`) which mirrors the active
80
+ * item's id via `aria-activedescendant`. Right for comboboxes/listboxes
81
+ * where the user is also typing.
82
+ *
83
+ * Consumers that need to react to the active item externally read
84
+ * `activeIndex()` (signal) or `activeDescendantId()` (computed).
85
+ */
86
+ declare class BsRovingFocusDirective {
87
+ private elementRef;
88
+ readonly orientation: _angular_core.InputSignal<BsRovingFocusOrientation>;
89
+ readonly mode: _angular_core.InputSignal<BsRovingFocusMode>;
90
+ readonly wrap: _angular_core.InputSignal<boolean>;
91
+ readonly items: _angular_core.Signal<readonly BsRovingFocusItemDirective[]>;
92
+ readonly activeIndex: _angular_core.WritableSignal<number>;
93
+ readonly activeDescendantId: _angular_core.Signal<string | null>;
94
+ focusFirst(): void;
95
+ focusLast(): void;
96
+ next(): void;
97
+ prev(): void;
98
+ setActiveItem(item: BsRovingFocusItemDirective): void;
99
+ onKeydown(event: KeyboardEvent): void;
100
+ /** Public so consumers (e.g. BsComboboxDirective's TAB handling) can detect edges without re-implementing the disabled-aware scan. */
101
+ firstEnabledIndex(): number;
102
+ lastEnabledIndex(): number;
103
+ private step;
104
+ private moveTo;
105
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsRovingFocusDirective, never>;
106
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsRovingFocusDirective, "[bsRovingFocus]", ["bsRovingFocus"], { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; }, {}, ["items"], never, true, never>;
107
+ }
108
+
109
+ type BsOverlayInitialFocus = HTMLElement | 'first' | 'self' | 'none';
110
+ /**
111
+ * Activates a CDK focus trap on the host element while `bsOverlayFocus` is true,
112
+ * captures the trigger before activation, and returns focus to it on deactivation.
113
+ *
114
+ * Initial focus inside the trap defaults to the first tabbable descendant; pass
115
+ * an explicit HTMLElement, 'self' (focus the host), or 'none' to opt out.
116
+ *
117
+ * Background `inert` / `aria-hidden` is intentionally not handled here — it is
118
+ * the consuming component's job (a modal hides app-root, a popover does not).
119
+ */
120
+ declare class BsOverlayFocusDirective {
121
+ private elementRef;
122
+ private trapFactory;
123
+ private interactivityChecker;
124
+ private destroyRef;
125
+ readonly active: _angular_core.InputSignal<boolean>;
126
+ readonly initialFocus: _angular_core.InputSignal<BsOverlayInitialFocus>;
127
+ readonly returnFocus: _angular_core.InputSignal<boolean>;
128
+ private trap;
129
+ private restoreTo;
130
+ constructor();
131
+ private engage;
132
+ private focusFirstTabbable;
133
+ private disengage;
134
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsOverlayFocusDirective, never>;
135
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsOverlayFocusDirective, "[bsOverlayFocus]", ["bsOverlayFocus"], { "active": { "alias": "bsOverlayFocus"; "required": false; "isSignal": true; }; "initialFocus": { "alias": "initialFocus"; "required": false; "isSignal": true; }; "returnFocus": { "alias": "returnFocus"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
136
+ }
137
+
138
+ /**
139
+ * Thin wrapper over CDK's LiveAnnouncer that dedupes consecutive identical
140
+ * messages — typeahead-style "5 results" announcements often re-fire with the
141
+ * same content and screen readers re-read them, which is noise.
142
+ */
143
+ declare class BsLiveAnnouncerService {
144
+ private cdk;
145
+ private last;
146
+ announce(message: string, politeness?: AriaLivePoliteness, durationMs?: number): Promise<void>;
147
+ clear(): void;
148
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsLiveAnnouncerService, never>;
149
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<BsLiveAnnouncerService>;
150
+ }
151
+
152
+ /**
153
+ * LIFO registry that tracks open overlays so each overlay can decide whether
154
+ * its global Escape listener should fire.
155
+ *
156
+ * The problem: popover, tooltip, dropdown-menu, priority-nav, and modal each
157
+ * bind a `(document:keydown.escape)` (or equivalent host listener) that closes
158
+ * the overlay unconditionally. With nesting (popover-under-modal,
159
+ * tooltip-under-popover), a single Escape closes both because both handlers
160
+ * fire on the same event.
161
+ *
162
+ * The fix: every overlay calls `push()` when it opens and `release(token)`
163
+ * when it closes; its Escape handler runs only when `isTop(token)` returns
164
+ * true. The top-most overlay consumes Escape; lower frames stay open.
165
+ *
166
+ * Identity is a per-call `symbol` token rather than a string, so two opens of
167
+ * the same directive don't collide and a stale token can't accidentally match
168
+ * a future frame.
169
+ *
170
+ * **What this does NOT promise:**
171
+ * - **Visual z-order.** The stack tracks logical open-order (the sequence of
172
+ * `push()` calls). A consumer that manually reorders overlays in the DOM
173
+ * could see Escape close a logically-deeper overlay. We don't support that.
174
+ * - **Coordination with non-overlay listeners.** A consumer's own
175
+ * `keydown.escape` listener that doesn't ask the stack will still fire.
176
+ */
177
+ declare class BsOverlayStackService {
178
+ private stack;
179
+ /** Allocate a new frame on top of the stack and return its token. */
180
+ push(): symbol;
181
+ /**
182
+ * Remove `token` from the stack. Releasing a non-top token is allowed —
183
+ * it's how an inner overlay closes itself programmatically without an
184
+ * Escape press (e.g. a popover closed by clicking its trigger again).
185
+ */
186
+ release(token: symbol): void;
187
+ /** True if `token` is the top of the stack. */
188
+ isTop(token: symbol): boolean;
189
+ /** Token at the top of the stack, or null if empty. */
190
+ peek(): symbol | null;
191
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsOverlayStackService, never>;
192
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<BsOverlayStackService>;
193
+ }
194
+
195
+ export { BsIdService, BsLiveAnnouncerService, BsOverlayFocusDirective, BsOverlayStackService, BsRovingFocusDirective, BsRovingFocusItemDirective };
196
+ export type { BsOverlayInitialFocus, BsRovingFocusMode, BsRovingFocusOrientation };
@@ -1,4 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import * as i1 from '@mintplayer/ng-bootstrap/reduced-motion';
2
3
 
3
4
  declare class BsAccordionTabComponent {
4
5
  accordion: BsAccordionComponent;
@@ -13,9 +14,10 @@ declare class BsAccordionTabComponent {
13
14
  }
14
15
 
15
16
  declare class BsAccordionComponent {
17
+ private readonly reducedMotion;
16
18
  constructor();
17
19
  readonly tabPages: _angular_core.Signal<readonly BsAccordionTabComponent[]>;
18
- disableAnimations: _angular_core.WritableSignal<boolean>;
20
+ readonly animationsDisabled: _angular_core.Signal<boolean>;
19
21
  highlightActiveTab: _angular_core.InputSignal<boolean>;
20
22
  multi: _angular_core.InputSignal<boolean>;
21
23
  accordionId: _angular_core.WritableSignal<number>;
@@ -23,7 +25,7 @@ declare class BsAccordionComponent {
23
25
  accordionTabCounter: number;
24
26
  static accordionCounter: number;
25
27
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsAccordionComponent, never>;
26
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsAccordionComponent, "bs-accordion", never, { "highlightActiveTab": { "alias": "highlightActiveTab"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; }, {}, ["tabPages"], ["*"], true, never>;
28
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsAccordionComponent, "bs-accordion", never, { "highlightActiveTab": { "alias": "highlightActiveTab"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; }, {}, ["tabPages"], ["*"], true, [{ directive: typeof i1.BsReducedMotionDirective; inputs: {}; outputs: {}; }]>;
27
29
  }
28
30
 
29
31
  declare class BsAccordionTabHeaderComponent {
@@ -6,8 +6,9 @@ declare class BsBreadcrumbComponent {
6
6
  }
7
7
 
8
8
  declare class BsBreadcrumbItemComponent {
9
+ readonly active: i0.InputSignal<boolean>;
9
10
  static ɵfac: i0.ɵɵFactoryDeclaration<BsBreadcrumbItemComponent, never>;
10
- static ɵcmp: i0.ɵɵComponentDeclaration<BsBreadcrumbItemComponent, "bs-breadcrumb-item", never, {}, {}, never, ["*"], true, never>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<BsBreadcrumbItemComponent, "bs-breadcrumb-item", never, { "active": { "alias": "active"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
11
12
  }
12
13
 
13
14
  export { BsBreadcrumbComponent, BsBreadcrumbItemComponent };
@@ -1,8 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
2
 
3
3
  declare class BsButtonGroupComponent {
4
+ ariaLabel: i0.InputSignal<string | null>;
4
5
  static ɵfac: i0.ɵɵFactoryDeclaration<BsButtonGroupComponent, never>;
5
- static ɵcmp: i0.ɵɵComponentDeclaration<BsButtonGroupComponent, "bs-button-group", never, {}, {}, never, ["*"], true, never>;
6
+ static ɵcmp: i0.ɵɵComponentDeclaration<BsButtonGroupComponent, "bs-button-group", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
6
7
  }
7
8
 
8
9
  export { BsButtonGroupComponent };
@@ -6,18 +6,50 @@ import { SafeHtml } from '@angular/platform-browser';
6
6
  declare class BsCalendarComponent {
7
7
  private sanitizer;
8
8
  private calendarMonthService;
9
+ private elementRef;
10
+ private idService;
11
+ private injector;
9
12
  constructor();
10
13
  chevronLeft: _angular_core.WritableSignal<SafeHtml | undefined>;
11
14
  chevronRight: _angular_core.WritableSignal<SafeHtml | undefined>;
12
15
  currentMonth: _angular_core.ModelSignal<Date>;
13
16
  selectedDate: _angular_core.ModelSignal<Date>;
14
17
  disableDateFn: _angular_core.InputSignal<((date: Date) => boolean) | undefined>;
18
+ /**
19
+ * The date that owns the grid's single tab stop (roving tabindex). Defaults
20
+ * to selectedDate when it lands inside currentMonth, then today, then the
21
+ * first enabled day of the month — matching APG Date Picker Dialog
22
+ * convention. Set imperatively by the keymap; re-focused after Angular
23
+ * re-renders via afterNextRender.
24
+ */
25
+ readonly focusedDate: _angular_core.WritableSignal<Date | null>;
26
+ /** Whether to push focus to the focused cell after the next render. */
27
+ private pendingFocusMove;
28
+ /** Stable id for the month-title cell, used by the grid's aria-labelledby. */
29
+ readonly monthLabelId: string;
30
+ /** Stable id-per-cell so afterNextRender focus restoration can find the new cell. */
31
+ cellId(date: Date): string;
15
32
  weeks: _angular_core.Signal<_mintplayer_ng_bootstrap_calendar_month.Week[]>;
33
+ isToday(date: Date): boolean;
16
34
  shownDays: _angular_core.Signal<WeekDay[]>;
17
35
  previousMonth(): boolean;
18
36
  nextMonth(): boolean;
19
37
  isSameDate(date1: Date | null, date2: Date | null): boolean;
20
38
  goto(day: DateDayOfMonth | null): void;
39
+ /**
40
+ * Compute the cell that should carry tabindex="0". One per month — the
41
+ * focused-date if it's inside this month, else the selected date, else
42
+ * today, else the first enabled day. Mirrors APG Date Picker convention.
43
+ */
44
+ readonly focusableDate: _angular_core.Signal<Date | null>;
45
+ /**
46
+ * APG Date Picker keymap. Tab into the grid lands on the focusableDate
47
+ * cell; arrow keys then navigate days/weeks; PageUp/Down change month;
48
+ * Ctrl+PageUp/Down change year; Home/End jump to week edges; Enter/Space
49
+ * selects.
50
+ */
51
+ onCellKeyDown(event: KeyboardEvent, day: DateDayOfMonth | null): void;
52
+ private moveFocusTo;
21
53
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsCalendarComponent, never>;
22
54
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsCalendarComponent, "bs-calendar", never, { "currentMonth": { "alias": "currentMonth"; "required": false; "isSignal": true; }; "selectedDate": { "alias": "selectedDate"; "required": false; "isSignal": true; }; "disableDateFn": { "alias": "disableDateFn"; "required": false; "isSignal": true; }; }, { "currentMonth": "currentMonthChange"; "selectedDate": "selectedDateChange"; }, never, never, true, never>;
23
55
  }
@@ -2,6 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef, AfterViewInit, OnDestroy, ElementRef } from '@angular/core';
3
3
  import { Color } from '@mintplayer/ng-bootstrap';
4
4
  import { BsSwipeContainerDirective } from '@mintplayer/ng-swiper/swiper';
5
+ import * as i1 from '@mintplayer/ng-bootstrap/reduced-motion';
5
6
 
6
7
  declare class BsCarouselImageDirective {
7
8
  private templateRef;
@@ -15,9 +16,37 @@ declare class BsCarouselImageDirective {
15
16
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsCarouselImageDirective, "*[bsCarouselImage]", never, {}, {}, never, never, true, never>;
16
17
  }
17
18
 
19
+ /**
20
+ * Context exposed to a `*bsCarouselPlayPause` template — the consumer reads
21
+ * `paused` to render the right glyph/label and calls `toggle` on click.
22
+ *
23
+ * Per PRD aria-accessibility-audit §13.2 (and the WAI-ARIA Authoring
24
+ * Practices Carousel pattern): when a carousel auto-advances, it MUST
25
+ * expose a visible, keyboard-operable play/pause control. The carousel
26
+ * itself doesn't impose a button style — the consumer projects whatever
27
+ * UI fits their app and reads the `paused` flag from this context.
28
+ */
29
+ interface BsCarouselPlayPauseContext {
30
+ /** Whether the carousel is currently paused. Same value as `paused`. */
31
+ $implicit: boolean;
32
+ /** Whether the carousel is currently paused. */
33
+ paused: boolean;
34
+ /** Toggle the paused state. Mirrors the carousel's two-way `[(paused)]`. */
35
+ toggle: () => void;
36
+ }
37
+ declare class BsCarouselPlayPauseDirective {
38
+ private templateRef;
39
+ private carousel;
40
+ static ngTemplateContextGuard(_dir: BsCarouselPlayPauseDirective, ctx: unknown): ctx is BsCarouselPlayPauseContext;
41
+ constructor();
42
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsCarouselPlayPauseDirective, never>;
43
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsCarouselPlayPauseDirective, "[bsCarouselPlayPause]", never, {}, {}, never, never, true, never>;
44
+ }
45
+
18
46
  declare class BsCarouselComponent implements AfterViewInit, OnDestroy {
19
47
  private platformId;
20
48
  private destroyRef;
49
+ private readonly reducedMotion;
21
50
  readonly colors: typeof Color;
22
51
  readonly isServerSide: boolean;
23
52
  currentImageIndex: _angular_core.WritableSignal<number>;
@@ -31,6 +60,15 @@ declare class BsCarouselComponent implements AfterViewInit, OnDestroy {
31
60
  animation: _angular_core.InputSignal<"fade" | "slide" | "none">;
32
61
  interval: _angular_core.InputSignal<number | null>;
33
62
  wrap: _angular_core.InputSignal<boolean>;
63
+ ariaLabel: _angular_core.InputSignal<string | null>;
64
+ paused: _angular_core.ModelSignal<boolean>;
65
+ /**
66
+ * Template projected via `*bsCarouselPlayPause`. When set, the carousel
67
+ * renders it in a control row above the slides. Per APG, auto-advancing
68
+ * carousels must expose a play/pause control — this is how consumers
69
+ * provide one without us imposing a button style.
70
+ */
71
+ readonly playPauseTemplate: _angular_core.WritableSignal<TemplateRef<BsCarouselPlayPauseContext> | null>;
34
72
  slideChange: _angular_core.OutputEmitterRef<number>;
35
73
  animationStart: _angular_core.OutputEmitterRef<void>;
36
74
  animationEnd: _angular_core.OutputEmitterRef<void>;
@@ -41,8 +79,22 @@ declare class BsCarouselComponent implements AfterViewInit, OnDestroy {
41
79
  firstImageTemplate: _angular_core.Signal<TemplateRef<any> | null>;
42
80
  lastImageTemplate: _angular_core.Signal<TemplateRef<any> | null>;
43
81
  readonly animationsDisabled: _angular_core.WritableSignal<boolean>;
44
- onKeyPress(event: Event): void;
82
+ /**
83
+ * `aria-live` value for the slide viewport. Stays `off` while
84
+ * auto-advance is actually rotating — otherwise the SR would re-read the
85
+ * active slide every interval — and switches to `polite` whenever the
86
+ * rotation is paused (by `paused`, missing/zero `interval`, or
87
+ * `prefers-reduced-motion`), so manual prev/next/indicator clicks get
88
+ * announced.
89
+ */
90
+ readonly slideAriaLive: _angular_core.Signal<"off" | "polite">;
45
91
  constructor();
92
+ /** Resume auto-advance. No-op if `interval` is unset or reduce-motion is on. */
93
+ play(): void;
94
+ /** Pause auto-advance. Manual prev/next/goto still work. */
95
+ pause(): void;
96
+ /** Toggle the paused state. Used as the `toggle` callback in `BsCarouselPlayPauseContext`. */
97
+ togglePaused: () => void;
46
98
  private clearAutoAdvance;
47
99
  previous(): void;
48
100
  next(): void;
@@ -54,7 +106,7 @@ declare class BsCarouselComponent implements AfterViewInit, OnDestroy {
54
106
  onContainerAnimationEnd(): void;
55
107
  onImageIndexChange(index: number): void;
56
108
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsCarouselComponent, never>;
57
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsCarouselComponent, "bs-carousel", never, { "indicators": { "alias": "indicators"; "required": false; "isSignal": true; }; "keyboardEvents": { "alias": "keyboardEvents"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "interval": { "alias": "interval"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; }, { "slideChange": "slideChange"; "animationStart": "animationStart"; "animationEnd": "animationEnd"; }, ["images"], never, true, never>;
109
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsCarouselComponent, "bs-carousel", never, { "indicators": { "alias": "indicators"; "required": false; "isSignal": true; }; "keyboardEvents": { "alias": "keyboardEvents"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "interval": { "alias": "interval"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "paused": { "alias": "paused"; "required": false; "isSignal": true; }; }, { "paused": "pausedChange"; "slideChange": "slideChange"; "animationStart": "animationStart"; "animationEnd": "animationEnd"; }, ["images"], never, true, [{ directive: typeof i1.BsReducedMotionDirective; inputs: {}; outputs: {}; }]>;
58
110
  }
59
111
 
60
112
  declare class BsCarouselImgDirective {
@@ -65,4 +117,5 @@ declare class BsCarouselImgDirective {
65
117
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsCarouselImgDirective, "img", never, {}, {}, never, never, true, never>;
66
118
  }
67
119
 
68
- export { BsCarouselComponent, BsCarouselImageDirective, BsCarouselImgDirective };
120
+ export { BsCarouselComponent, BsCarouselImageDirective, BsCarouselImgDirective, BsCarouselPlayPauseDirective };
121
+ export type { BsCarouselPlayPauseContext };
@@ -3,6 +3,7 @@ import { TemplateRef } from '@angular/core';
3
3
  import { HighlightResult } from 'highlight.js';
4
4
 
5
5
  declare class BsCodeSnippetComponent {
6
+ private announcer;
6
7
  constructor();
7
8
  offcanvasVisible: _angular_core.ModelSignal<boolean>;
8
9
  codeToCopy: _angular_core.InputSignal<string>;