@mintplayer/ng-bootstrap 21.29.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 (156) 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-multi-range.mjs +693 -0
  38. package/fesm2022/mintplayer-ng-bootstrap-multi-range.mjs.map +1 -0
  39. package/fesm2022/mintplayer-ng-bootstrap-multiselect.mjs +5 -4
  40. package/fesm2022/mintplayer-ng-bootstrap-multiselect.mjs.map +1 -1
  41. package/fesm2022/mintplayer-ng-bootstrap-navbar-toggler.mjs +6 -6
  42. package/fesm2022/mintplayer-ng-bootstrap-navbar-toggler.mjs.map +1 -1
  43. package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs +45 -13
  44. package/fesm2022/mintplayer-ng-bootstrap-navbar.mjs.map +1 -1
  45. package/fesm2022/mintplayer-ng-bootstrap-offcanvas.mjs +51 -5
  46. package/fesm2022/mintplayer-ng-bootstrap-offcanvas.mjs.map +1 -1
  47. package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs +5 -3
  48. package/fesm2022/mintplayer-ng-bootstrap-pagination.mjs.map +1 -1
  49. package/fesm2022/mintplayer-ng-bootstrap-placeholder.mjs +18 -4
  50. package/fesm2022/mintplayer-ng-bootstrap-placeholder.mjs.map +1 -1
  51. package/fesm2022/mintplayer-ng-bootstrap-playlist-toggler.mjs +6 -6
  52. package/fesm2022/mintplayer-ng-bootstrap-playlist-toggler.mjs.map +1 -1
  53. package/fesm2022/mintplayer-ng-bootstrap-popover.mjs +61 -6
  54. package/fesm2022/mintplayer-ng-bootstrap-popover.mjs.map +1 -1
  55. package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs +19 -4
  56. package/fesm2022/mintplayer-ng-bootstrap-priority-nav.mjs.map +1 -1
  57. package/fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs +8 -5
  58. package/fesm2022/mintplayer-ng-bootstrap-progress-bar.mjs.map +1 -1
  59. package/fesm2022/mintplayer-ng-bootstrap-range.mjs +4 -3
  60. package/fesm2022/mintplayer-ng-bootstrap-range.mjs.map +1 -1
  61. package/fesm2022/mintplayer-ng-bootstrap-rating.mjs +34 -4
  62. package/fesm2022/mintplayer-ng-bootstrap-rating.mjs.map +1 -1
  63. package/fesm2022/mintplayer-ng-bootstrap-reduced-motion.mjs +59 -0
  64. package/fesm2022/mintplayer-ng-bootstrap-reduced-motion.mjs.map +1 -0
  65. package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs +91 -2
  66. package/fesm2022/mintplayer-ng-bootstrap-resizable.mjs.map +1 -1
  67. package/fesm2022/mintplayer-ng-bootstrap-scheduler.mjs +16 -5
  68. package/fesm2022/mintplayer-ng-bootstrap-scheduler.mjs.map +1 -1
  69. package/fesm2022/mintplayer-ng-bootstrap-scrollspy.mjs +2 -2
  70. package/fesm2022/mintplayer-ng-bootstrap-scrollspy.mjs.map +1 -1
  71. package/fesm2022/mintplayer-ng-bootstrap-searchbox.mjs +28 -5
  72. package/fesm2022/mintplayer-ng-bootstrap-searchbox.mjs.map +1 -1
  73. package/fesm2022/mintplayer-ng-bootstrap-select.mjs +4 -3
  74. package/fesm2022/mintplayer-ng-bootstrap-select.mjs.map +1 -1
  75. package/fesm2022/mintplayer-ng-bootstrap-select2.mjs +18 -4
  76. package/fesm2022/mintplayer-ng-bootstrap-select2.mjs.map +1 -1
  77. package/fesm2022/mintplayer-ng-bootstrap-signature-pad.mjs +4 -3
  78. package/fesm2022/mintplayer-ng-bootstrap-signature-pad.mjs.map +1 -1
  79. package/fesm2022/mintplayer-ng-bootstrap-tab-control.mjs +2 -2
  80. package/fesm2022/mintplayer-ng-bootstrap-tab-control.mjs.map +1 -1
  81. package/fesm2022/mintplayer-ng-bootstrap-table.mjs +10 -3
  82. package/fesm2022/mintplayer-ng-bootstrap-table.mjs.map +1 -1
  83. package/fesm2022/mintplayer-ng-bootstrap-tile-manager.mjs +143 -29
  84. package/fesm2022/mintplayer-ng-bootstrap-tile-manager.mjs.map +1 -1
  85. package/fesm2022/mintplayer-ng-bootstrap-timepicker.mjs +2 -2
  86. package/fesm2022/mintplayer-ng-bootstrap-timepicker.mjs.map +1 -1
  87. package/fesm2022/mintplayer-ng-bootstrap-toast.mjs +7 -4
  88. package/fesm2022/mintplayer-ng-bootstrap-toast.mjs.map +1 -1
  89. package/fesm2022/mintplayer-ng-bootstrap-toggle-button.mjs +42 -21
  90. package/fesm2022/mintplayer-ng-bootstrap-toggle-button.mjs.map +1 -1
  91. package/fesm2022/mintplayer-ng-bootstrap-tooltip.mjs +33 -4
  92. package/fesm2022/mintplayer-ng-bootstrap-tooltip.mjs.map +1 -1
  93. package/fesm2022/mintplayer-ng-bootstrap-treeview.mjs +17 -7
  94. package/fesm2022/mintplayer-ng-bootstrap-treeview.mjs.map +1 -1
  95. package/fesm2022/mintplayer-ng-bootstrap-typeahead.mjs +50 -8
  96. package/fesm2022/mintplayer-ng-bootstrap-typeahead.mjs.map +1 -1
  97. package/fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs +34 -12
  98. package/fesm2022/mintplayer-ng-bootstrap-virtual-datatable.mjs.map +1 -1
  99. package/fesm2022/mintplayer-ng-bootstrap-web-components-a11y.mjs +74 -0
  100. package/fesm2022/mintplayer-ng-bootstrap-web-components-a11y.mjs.map +1 -0
  101. package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs +1476 -71
  102. package/fesm2022/mintplayer-ng-bootstrap-web-components-scheduler.mjs.map +1 -1
  103. package/fesm2022/mintplayer-ng-bootstrap-web-components-splitter.mjs +194 -2
  104. package/fesm2022/mintplayer-ng-bootstrap-web-components-splitter.mjs.map +1 -1
  105. package/fesm2022/mintplayer-ng-bootstrap-web-components-tab-control.mjs +4 -0
  106. package/fesm2022/mintplayer-ng-bootstrap-web-components-tab-control.mjs.map +1 -1
  107. package/package.json +18 -2
  108. package/types/mintplayer-ng-bootstrap-a11y.d.ts +196 -0
  109. package/types/mintplayer-ng-bootstrap-accordion.d.ts +4 -2
  110. package/types/mintplayer-ng-bootstrap-breadcrumb.d.ts +2 -1
  111. package/types/mintplayer-ng-bootstrap-button-group.d.ts +2 -1
  112. package/types/mintplayer-ng-bootstrap-calendar.d.ts +32 -0
  113. package/types/mintplayer-ng-bootstrap-carousel.d.ts +56 -3
  114. package/types/mintplayer-ng-bootstrap-code-snippet.d.ts +1 -0
  115. package/types/mintplayer-ng-bootstrap-color-picker.d.ts +75 -4
  116. package/types/mintplayer-ng-bootstrap-datatable.d.ts +1 -1
  117. package/types/mintplayer-ng-bootstrap-dock.d.ts +51 -0
  118. package/types/mintplayer-ng-bootstrap-dropdown-menu.d.ts +54 -9
  119. package/types/mintplayer-ng-bootstrap-dropdown.d.ts +57 -2
  120. package/types/mintplayer-ng-bootstrap-file-upload.d.ts +4 -1
  121. package/types/mintplayer-ng-bootstrap-has-overlay.d.ts +14 -0
  122. package/types/mintplayer-ng-bootstrap-marquee.d.ts +2 -1
  123. package/types/mintplayer-ng-bootstrap-modal.d.ts +25 -1
  124. package/types/mintplayer-ng-bootstrap-multi-range.d.ts +170 -0
  125. package/types/mintplayer-ng-bootstrap-multiselect.d.ts +2 -1
  126. package/types/mintplayer-ng-bootstrap-navbar-toggler.d.ts +4 -2
  127. package/types/mintplayer-ng-bootstrap-navbar.d.ts +25 -1
  128. package/types/mintplayer-ng-bootstrap-offcanvas.d.ts +23 -1
  129. package/types/mintplayer-ng-bootstrap-pagination.d.ts +3 -1
  130. package/types/mintplayer-ng-bootstrap-placeholder.d.ts +5 -1
  131. package/types/mintplayer-ng-bootstrap-playlist-toggler.d.ts +4 -2
  132. package/types/mintplayer-ng-bootstrap-popover.d.ts +21 -1
  133. package/types/mintplayer-ng-bootstrap-priority-nav.d.ts +4 -1
  134. package/types/mintplayer-ng-bootstrap-progress-bar.d.ts +4 -2
  135. package/types/mintplayer-ng-bootstrap-range.d.ts +2 -1
  136. package/types/mintplayer-ng-bootstrap-rating.d.ts +3 -0
  137. package/types/mintplayer-ng-bootstrap-reduced-motion.d.ts +36 -0
  138. package/types/mintplayer-ng-bootstrap-resizable.d.ts +4 -0
  139. package/types/mintplayer-ng-bootstrap-scheduler.d.ts +42 -9
  140. package/types/mintplayer-ng-bootstrap-scrollspy.d.ts +1 -1
  141. package/types/mintplayer-ng-bootstrap-searchbox.d.ts +8 -1
  142. package/types/mintplayer-ng-bootstrap-select.d.ts +2 -1
  143. package/types/mintplayer-ng-bootstrap-select2.d.ts +3 -0
  144. package/types/mintplayer-ng-bootstrap-signature-pad.d.ts +2 -1
  145. package/types/mintplayer-ng-bootstrap-table.d.ts +8 -1
  146. package/types/mintplayer-ng-bootstrap-tile-manager.d.ts +21 -2
  147. package/types/mintplayer-ng-bootstrap-toast.d.ts +6 -1
  148. package/types/mintplayer-ng-bootstrap-toggle-button.d.ts +11 -0
  149. package/types/mintplayer-ng-bootstrap-tooltip.d.ts +5 -0
  150. package/types/mintplayer-ng-bootstrap-treeview.d.ts +12 -1
  151. package/types/mintplayer-ng-bootstrap-typeahead.d.ts +11 -3
  152. package/types/mintplayer-ng-bootstrap-virtual-datatable.d.ts +14 -1
  153. package/types/mintplayer-ng-bootstrap-web-components-a11y.d.ts +34 -0
  154. package/types/mintplayer-ng-bootstrap-web-components-scheduler-core.d.ts +35 -11
  155. package/types/mintplayer-ng-bootstrap-web-components-scheduler.d.ts +246 -0
  156. package/types/mintplayer-ng-bootstrap-web-components-splitter.d.ts +95 -37
@@ -4,20 +4,46 @@ import { ViewType, SchedulerEvent, Resource, ResourceGroup, SchedulerOptions } f
4
4
  export { PreviewEvent, Resource, ResourceGroup, SchedulerEvent, SchedulerEventPart, SchedulerOptions, TimeSlot, ViewType, generateEventId, generateGroupId, generateResourceId } from '@mintplayer/ng-bootstrap/web-components/scheduler-core';
5
5
 
6
6
  /**
7
- * Event click event detail
7
+ * Event-selected event detail. Fires on mouse click and on keyboard Tab
8
+ * landing on an event (PRD scheduler-keyboard-grid-nav D3 — renamed from
9
+ * `event-click` because keyboard now triggers the same notification).
8
10
  */
9
- interface SchedulerEventClickEvent {
11
+ interface SchedulerEventSelectedEvent {
10
12
  event: SchedulerEvent;
11
13
  originalEvent?: Event;
12
14
  }
13
15
  /**
14
- * Event create event detail
16
+ * Event create *request* event. Per PRD scheduler-controlled-selection, the
17
+ * `mp-scheduler` web-component no longer constructs an event itself on drag-end
18
+ * or `Enter` — it emits the selected range and the consumer decides whether
19
+ * to push a `SchedulerEvent` into its `[events]` input.
15
20
  */
16
21
  interface SchedulerEventCreateEvent {
17
- event: SchedulerEvent;
18
- resource?: Resource;
22
+ /** The selected time range. */
23
+ range: {
24
+ start: Date;
25
+ end: Date;
26
+ };
27
+ /** Resource the request targets (timeline view only). */
28
+ resourceId?: string;
29
+ /** View that produced the request. */
30
+ view: ViewType;
19
31
  originalEvent?: Event;
20
32
  }
33
+ /**
34
+ * Selection-change event. Fires on every transition — including the
35
+ * transition to an empty selection. `selectedEvent` and `range` are
36
+ * independent dimensions of the selection state.
37
+ */
38
+ interface SchedulerSelectionChangeEvent {
39
+ selectedEvent: SchedulerEvent | null;
40
+ range: {
41
+ start: Date;
42
+ end: Date;
43
+ } | null;
44
+ view: ViewType;
45
+ resourceId?: string;
46
+ }
21
47
  /**
22
48
  * Event update event detail
23
49
  */
@@ -73,14 +99,15 @@ declare class BsSchedulerComponent implements AfterViewInit, OnDestroy {
73
99
  start: Date;
74
100
  end: Date;
75
101
  } | null>;
76
- readonly eventClick: _angular_core.OutputEmitterRef<SchedulerEventClickEvent>;
77
- readonly eventDblClick: _angular_core.OutputEmitterRef<SchedulerEventClickEvent>;
102
+ readonly eventSelected: _angular_core.OutputEmitterRef<SchedulerEventSelectedEvent>;
103
+ readonly eventDblClick: _angular_core.OutputEmitterRef<SchedulerEventSelectedEvent>;
78
104
  readonly eventCreate: _angular_core.OutputEmitterRef<SchedulerEventCreateEvent>;
79
105
  readonly eventUpdate: _angular_core.OutputEmitterRef<SchedulerEventUpdateEvent>;
80
106
  readonly eventDelete: _angular_core.OutputEmitterRef<SchedulerEventDeleteEvent>;
81
107
  readonly dateClick: _angular_core.OutputEmitterRef<DateClickEvent>;
82
108
  readonly dateSelect: _angular_core.OutputEmitterRef<DateSelectEvent>;
83
109
  readonly viewChange: _angular_core.OutputEmitterRef<ViewChangeEvent>;
110
+ readonly selectionChange: _angular_core.OutputEmitterRef<SchedulerSelectionChangeEvent>;
84
111
  readonly currentWeekStart: _angular_core.Signal<Date>;
85
112
  readonly currentWeekEnd: _angular_core.Signal<Date>;
86
113
  readonly visibleEvents: _angular_core.Signal<SchedulerEvent[]>;
@@ -110,6 +137,12 @@ declare class BsSchedulerComponent implements AfterViewInit, OnDestroy {
110
137
  * Change the current view
111
138
  */
112
139
  changeView(view: ViewType): void;
140
+ /**
141
+ * Clear the time-range selection and the focused-cell selection. Call this
142
+ * from your `(eventCreate)` handler if you want the post-create selection
143
+ * cleared — the scheduler no longer auto-clears (PRD: scheduler-controlled-selection).
144
+ */
145
+ clearSelection(): void;
113
146
  /**
114
147
  * Add an event
115
148
  */
@@ -131,8 +164,8 @@ declare class BsSchedulerComponent implements AfterViewInit, OnDestroy {
131
164
  */
132
165
  refetchEvents(): void;
133
166
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsSchedulerComponent, never>;
134
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsSchedulerComponent, "bs-scheduler", never, { "view": { "alias": "view"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": false; "isSignal": true; }; "events": { "alias": "events"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "selectedEvent": { "alias": "selectedEvent"; "required": false; "isSignal": true; }; "selectedRange": { "alias": "selectedRange"; "required": false; "isSignal": true; }; }, { "selectedEvent": "selectedEventChange"; "selectedRange": "selectedRangeChange"; "eventClick": "eventClick"; "eventDblClick": "eventDblClick"; "eventCreate": "eventCreate"; "eventUpdate": "eventUpdate"; "eventDelete": "eventDelete"; "dateClick": "dateClick"; "dateSelect": "dateSelect"; "viewChange": "viewChange"; }, never, never, true, never>;
167
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsSchedulerComponent, "bs-scheduler", never, { "view": { "alias": "view"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": false; "isSignal": true; }; "events": { "alias": "events"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "selectedEvent": { "alias": "selectedEvent"; "required": false; "isSignal": true; }; "selectedRange": { "alias": "selectedRange"; "required": false; "isSignal": true; }; }, { "selectedEvent": "selectedEventChange"; "selectedRange": "selectedRangeChange"; "eventSelected": "eventSelected"; "eventDblClick": "eventDblClick"; "eventCreate": "eventCreate"; "eventUpdate": "eventUpdate"; "eventDelete": "eventDelete"; "dateClick": "dateClick"; "dateSelect": "dateSelect"; "viewChange": "viewChange"; "selectionChange": "selectionChange"; }, never, never, true, never>;
135
168
  }
136
169
 
137
170
  export { BsSchedulerComponent };
138
- export type { DateClickEvent, DateSelectEvent, SchedulerEventClickEvent, SchedulerEventCreateEvent, SchedulerEventDeleteEvent, SchedulerEventUpdateEvent, ViewChangeEvent };
171
+ export type { DateClickEvent, DateSelectEvent, SchedulerEventCreateEvent, SchedulerEventDeleteEvent, SchedulerEventSelectedEvent, SchedulerEventUpdateEvent, SchedulerSelectionChangeEvent, ViewChangeEvent };
@@ -13,7 +13,7 @@ declare class BsScrollspyComponent implements AfterViewInit, AfterContentInit {
13
13
  private viewInit;
14
14
  private contentInit;
15
15
  readonly directives: i0.Signal<readonly BsScrollspyDirective[]>;
16
- readonly anchors: i0.Signal<readonly ElementRef<HTMLSpanElement>[]>;
16
+ readonly anchors: i0.Signal<readonly ElementRef<HTMLButtonElement>[]>;
17
17
  activeDirective: i0.WritableSignal<BsScrollspyDirective | null>;
18
18
  constructor();
19
19
  ngAfterViewInit(): void;
@@ -32,6 +32,7 @@ declare class BsSuggestionTemplateContext<TData extends HasId<U>, U> {
32
32
  declare class BsSearchboxComponent<T extends HasId<U>, U> implements OnDestroy {
33
33
  private bsForm;
34
34
  private sanitizer;
35
+ private announcer;
35
36
  caretUpFill: _angular_core.WritableSignal<SafeHtml | undefined>;
36
37
  caretDownFill: _angular_core.WritableSignal<SafeHtml | undefined>;
37
38
  colors: typeof Color;
@@ -40,19 +41,25 @@ declare class BsSearchboxComponent<T extends HasId<U>, U> implements OnDestroy {
40
41
  isOpen: _angular_core.ModelSignal<boolean>;
41
42
  selectedItem: _angular_core.ModelSignal<T | undefined>;
42
43
  searchterm: _angular_core.ModelSignal<string>;
44
+ ariaLabel: _angular_core.InputSignal<string>;
43
45
  suggestions: _angular_core.ModelSignal<T[]>;
44
46
  readonly suggestionTemplate: _angular_core.WritableSignal<TemplateRef<BsSuggestionTemplateContext<T, U>> | undefined>;
45
47
  readonly enterSearchtermTemplate: _angular_core.WritableSignal<TemplateRef<T> | undefined>;
46
48
  readonly noResultsTemplate: _angular_core.WritableSignal<TemplateRef<T> | undefined>;
49
+ noResultsAnnouncement: _angular_core.InputSignal<string>;
50
+ resultsAnnouncementSingular: _angular_core.InputSignal<string>;
51
+ resultsAnnouncementPlural: _angular_core.InputSignal<(count: number) => string>;
47
52
  provideSuggestions: _angular_core.OutputEmitterRef<string>;
48
53
  private debouncedSearchterm;
49
54
  private debounceTimeout;
55
+ private requestInFlight;
50
56
  constructor();
51
57
  ngOnDestroy(): void;
58
+ private announceResults;
52
59
  onSearchtermChange(searchterm: string): void;
53
60
  onSuggestionClicked(suggestion: T): void;
54
61
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsSearchboxComponent<any, any>, never>;
55
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsSearchboxComponent<any, any>, "bs-searchbox", never, { "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "selectedItem": { "alias": "selectedItem"; "required": false; "isSignal": true; }; "searchterm": { "alias": "searchterm"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; }, { "isOpen": "isOpenChange"; "selectedItem": "selectedItemChange"; "searchterm": "searchtermChange"; "suggestions": "suggestionsChange"; "provideSuggestions": "provideSuggestions"; }, never, ["*"], true, never>;
62
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsSearchboxComponent<any, any>, "bs-searchbox", never, { "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "selectedItem": { "alias": "selectedItem"; "required": false; "isSignal": true; }; "searchterm": { "alias": "searchterm"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "noResultsAnnouncement": { "alias": "noResultsAnnouncement"; "required": false; "isSignal": true; }; "resultsAnnouncementSingular": { "alias": "resultsAnnouncementSingular"; "required": false; "isSignal": true; }; "resultsAnnouncementPlural": { "alias": "resultsAnnouncementPlural"; "required": false; "isSignal": true; }; }, { "isOpen": "isOpenChange"; "selectedItem": "selectedItemChange"; "searchterm": "searchtermChange"; "suggestions": "suggestionsChange"; "provideSuggestions": "provideSuggestions"; }, never, ["*"], true, never>;
56
63
  }
57
64
 
58
65
  export { BsEnterSearchTermTemplateDirective, BsNoResultsTemplateDirective, BsSearchboxComponent, BsSuggestionTemplateContext, BsSuggestionTemplateDirective };
@@ -54,10 +54,11 @@ declare class BsSelectComponent {
54
54
  multiple: _angular_core.InputSignal<boolean>;
55
55
  numberVisible: _angular_core.InputSignal<number | null>;
56
56
  disabled: _angular_core.InputSignal<boolean>;
57
+ ariaLabel: _angular_core.InputSignal<string | null>;
57
58
  sizeClass: _angular_core.Signal<string | null>;
58
59
  multipleValue: _angular_core.Signal<true | null>;
59
60
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsSelectComponent, never>;
60
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsSelectComponent, "bs-select", never, { "identifier": { "alias": "identifier"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "numberVisible": { "alias": "numberVisible"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof BsSelectValueAccessor; inputs: { "compareWith": "compareWith"; }; outputs: {}; }]>;
61
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsSelectComponent, "bs-select", never, { "identifier": { "alias": "identifier"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "numberVisible": { "alias": "numberVisible"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof BsSelectValueAccessor; inputs: { "compareWith": "compareWith"; }; outputs: {}; }]>;
61
62
  }
62
63
 
63
64
  export { BsSelectComponent, BsSelectOption, BsSelectValueAccessor };
@@ -1,5 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef, ElementRef, WritableSignal } from '@angular/core';
3
+ import { BsRovingFocusDirective } from '@mintplayer/ng-bootstrap/a11y';
3
4
  import { HasId } from '@mintplayer/ng-bootstrap/has-id';
4
5
 
5
6
  declare class BsSelect2Component<T extends HasId<U>, U> {
@@ -9,6 +10,7 @@ declare class BsSelect2Component<T extends HasId<U>, U> {
9
10
  readonly defaultItemTemplate: _angular_core.Signal<TemplateRef<any>>;
10
11
  readonly searchBox: _angular_core.Signal<ElementRef<HTMLInputElement>>;
11
12
  readonly itemsBox: _angular_core.Signal<ElementRef<HTMLDivElement>>;
13
+ readonly rovingFocus: _angular_core.Signal<BsRovingFocusDirective | undefined>;
12
14
  searchterm: _angular_core.ModelSignal<string>;
13
15
  provideSuggestions: _angular_core.OutputEmitterRef<string>;
14
16
  isFocused: _angular_core.WritableSignal<boolean>;
@@ -20,6 +22,7 @@ declare class BsSelect2Component<T extends HasId<U>, U> {
20
22
  constructor();
21
23
  onProvideSuggestions(value: string): void;
22
24
  onSuggestionClicked(suggestion: T): void;
25
+ onActivate(): void;
23
26
  onRemoveItem(item: T, event: MouseEvent): void;
24
27
  focus(): void;
25
28
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsSelect2Component<any, any>, never>;
@@ -18,6 +18,7 @@ declare class BsSignaturePadComponent implements AfterViewInit {
18
18
  signature: _angular_core.ModelSignal<Signature>;
19
19
  width: _angular_core.InputSignal<number>;
20
20
  height: _angular_core.InputSignal<number>;
21
+ ariaLabel: _angular_core.InputSignal<string>;
21
22
  readonly minHeight = 5;
22
23
  readonly isDrawing: _angular_core.WritableSignal<boolean>;
23
24
  readonly canvas: _angular_core.Signal<ElementRef<HTMLCanvasElement>>;
@@ -28,7 +29,7 @@ declare class BsSignaturePadComponent implements AfterViewInit {
28
29
  onPointerMove(ev: PointerEvent): void;
29
30
  onPointerEnd(ev: PointerEvent): void;
30
31
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsSignaturePadComponent, never>;
31
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsSignaturePadComponent, "bs-signature-pad", never, { "signature": { "alias": "signature"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, { "signature": "signatureChange"; }, never, never, true, never>;
32
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsSignaturePadComponent, "bs-signature-pad", never, { "signature": { "alias": "signature"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "signature": "signatureChange"; }, never, never, true, never>;
32
33
  }
33
34
 
34
35
  export { BsSignaturePadComponent };
@@ -5,8 +5,15 @@ declare class BsTableComponent {
5
5
  striped: _angular_core.InputSignal<boolean>;
6
6
  hover: _angular_core.InputSignal<boolean>;
7
7
  border: _angular_core.InputSignal<boolean>;
8
+ /**
9
+ * Forwards `aria-rowcount` onto the wrapped `<table>` element. Used by
10
+ * virtualised consumers (e.g. virtual-datatable) that need SR users to
11
+ * hear "row N of Y" with Y matching the full record set, not the DOM
12
+ * slice. `null` (default) leaves the attribute off entirely.
13
+ */
14
+ ariaRowCount: _angular_core.InputSignal<number | null>;
8
15
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsTableComponent, never>;
9
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsTableComponent, "bs-table", never, { "isResponsive": { "alias": "isResponsive"; "required": false; "isSignal": true; }; "striped": { "alias": "striped"; "required": false; "isSignal": true; }; "hover": { "alias": "hover"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
16
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsTableComponent, "bs-table", never, { "isResponsive": { "alias": "isResponsive"; "required": false; "isSignal": true; }; "striped": { "alias": "striped"; "required": false; "isSignal": true; }; "hover": { "alias": "hover"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "ariaRowCount": { "alias": "ariaRowCount"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
10
17
  }
11
18
 
12
19
  declare class BsTableStylesComponent {
@@ -164,7 +164,7 @@ declare class MintTileManagerElement extends LitElement {
164
164
  keyboardMode: {
165
165
  state: boolean;
166
166
  };
167
- liveRegionMessage: {
167
+ focusedTileId: {
168
168
  state: boolean;
169
169
  };
170
170
  };
@@ -183,7 +183,10 @@ declare class MintTileManagerElement extends LitElement {
183
183
  protected gestureKind: GestureState['kind'];
184
184
  protected blocked: boolean;
185
185
  protected effectiveColumnCount: number;
186
- protected liveRegionMessage: string;
186
+ protected focusedTileId: string | null;
187
+ private readonly liveAnnouncer;
188
+ private readonly instanceId;
189
+ private get instructionsId();
187
190
  private hostResizeObserver;
188
191
  private flipPreviousRects;
189
192
  private cellMetrics;
@@ -218,6 +221,8 @@ declare class MintTileManagerElement extends LitElement {
218
221
  private beginDragFromTouchArm;
219
222
  private beginDrag;
220
223
  private beginResize;
224
+ private announceDragBegin;
225
+ private announceResizeBegin;
221
226
  private attachWindowListeners;
222
227
  private detachWindowListeners;
223
228
  private handleEscapeKey;
@@ -242,6 +247,20 @@ declare class MintTileManagerElement extends LitElement {
242
247
  */
243
248
  get isGestureActive(): boolean;
244
249
  private onTileKeyDown;
250
+ /**
251
+ * Outside move mode, arrow keys move *focus* between tiles (row-major
252
+ * order — top-to-bottom, left-to-right by gridcell position). Home/End
253
+ * jump to first/last enabled tile. Returns true if the event was handled.
254
+ */
255
+ private handleFocusNavigation;
256
+ private onTileFocus;
257
+ /**
258
+ * The single tile that should carry `tabindex="0"` to act as the board's
259
+ * tab stop. Defaults to the previously-focused tile, then the first tile in
260
+ * row-major order. All other tiles render with `tabindex="-1"` so Tab from
261
+ * outside the board lands on exactly one tile.
262
+ */
263
+ private resolveFocusableTileId;
245
264
  private applyKeyboardStep;
246
265
  }
247
266
  declare global {
@@ -3,10 +3,14 @@ import { TemplateRef, PipeTransform, InjectionToken, Injector, EnvironmentProvid
3
3
  import { OverlayRef } from '@angular/cdk/overlay';
4
4
  import { ComponentPortal } from '@angular/cdk/portal';
5
5
 
6
+ type BsToastPoliteness = 'polite' | 'assertive';
6
7
  declare class BsToastComponent {
7
8
  isVisible: i0.InputSignal<boolean>;
9
+ /** SR announcement urgency. 'assertive' for time-critical (errors), 'polite' for everything else. */
10
+ politeness: i0.InputSignal<BsToastPoliteness>;
11
+ readonly toastRole: i0.Signal<"alert" | "status">;
8
12
  static ɵfac: i0.ɵɵFactoryDeclaration<BsToastComponent, never>;
9
- static ɵcmp: i0.ɵɵComponentDeclaration<BsToastComponent, "bs-toast", never, { "isVisible": { "alias": "isVisible"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
13
+ static ɵcmp: i0.ɵɵComponentDeclaration<BsToastComponent, "bs-toast", never, { "isVisible": { "alias": "isVisible"; "required": false; "isSignal": true; }; "politeness": { "alias": "politeness"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
10
14
  }
11
15
 
12
16
  declare class BsToastHeaderComponent {
@@ -60,3 +64,4 @@ declare const PORTAL_FACTORY: InjectionToken<(injector: Injector) => ComponentPo
60
64
  declare function provideToast(): EnvironmentProviders;
61
65
 
62
66
  export { BsAddPropertiesPipe, BsToastBodyComponent, BsToastCloseDirective, BsToastComponent, BsToastContainerComponent, BsToastHeaderComponent, BsToastService, PORTAL_FACTORY, provideToast };
67
+ export type { BsToastPoliteness };
@@ -36,7 +36,18 @@ declare class BsToggleButtonComponent implements AfterViewInit {
36
36
  inputClass: _angular_core.Signal<"form-check-input" | "btn-check">;
37
37
  labelClass: _angular_core.Signal<"form-check-label" | "btn btn-primary" | "btn btn-secondary">;
38
38
  checkOrRadio: _angular_core.Signal<"checkbox" | "radio">;
39
+ /**
40
+ * ARIA role override per type. We let `checkbox`, `radio`, and `radio_toggle_button`
41
+ * keep their implicit roles (`checkbox` / `radio`) — those are already correct.
42
+ * `switch` gets `role="switch"`. `toggle_button` is exposed as the ARIA toggle-button
43
+ * pattern (`role="button"` + `aria-pressed`), which is how SRs announce it as a
44
+ * toggle button rather than a checkbox.
45
+ */
46
+ ariaRole: _angular_core.Signal<string | null>;
47
+ /** Only meaningful for the toggle-button (role=button) variant. */
48
+ ariaPressed: _angular_core.Signal<string | null>;
39
49
  nameResult: _angular_core.Signal<string | null>;
50
+ onInputChange(ev: Event): void;
40
51
  ngAfterViewInit(): void;
41
52
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsToggleButtonComponent, never>;
42
53
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsToggleButtonComponent, "bs-toggle-button", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "isToggled": { "alias": "isToggled"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "group": { "alias": "group"; "required": false; "isSignal": true; }; }, { "isToggled": "isToggledChange"; }, never, ["*"], true, [{ directive: typeof BsToggleButtonValueAccessor; inputs: {}; outputs: {}; }]>;
@@ -8,12 +8,17 @@ declare class BsTooltipDirective implements OnDestroy {
8
8
  private templateRef;
9
9
  private parentInjector;
10
10
  private parent;
11
+ private ids;
12
+ private overlayStack;
13
+ private readonly tooltipId;
14
+ private stackToken;
11
15
  constructor(overlay: Overlay, templateRef: TemplateRef<any>, parentInjector: Injector, parent: ElementRef);
12
16
  readonly bsTooltip: i0.InputSignal<Position>;
13
17
  private injector;
14
18
  private portal;
15
19
  private overlayRef;
16
20
  onBlur(): void;
21
+ onEscape(): void;
17
22
  showTooltip(): void;
18
23
  hideTooltip(): void;
19
24
  ngOnDestroy(): void;
@@ -8,6 +8,12 @@ declare class BsTreeviewItemComponent {
8
8
  readonly childTree: _angular_core.Signal<BsTreeviewComponent | undefined>;
9
9
  chevronRight: _angular_core.WritableSignal<SafeHtml | undefined>;
10
10
  tabIndex: _angular_core.Signal<0 | -1>;
11
+ /** APG tree pattern: 1-based depth. Root tree has level=0; items inside it are level=1. */
12
+ ariaLevel: _angular_core.Signal<number>;
13
+ /** Total siblings at this level (within this immediate tree). */
14
+ ariaSetSize: _angular_core.Signal<number>;
15
+ /** 1-based position within siblings. */
16
+ ariaPosInSet: _angular_core.Signal<number>;
11
17
  constructor();
12
18
  onClick(ev: MouseEvent): void;
13
19
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsTreeviewItemComponent, never>;
@@ -19,7 +25,12 @@ declare class BsTreeviewComponent {
19
25
  level: _angular_core.Signal<number>;
20
26
  indentation: _angular_core.Signal<number>;
21
27
  isExpanded: _angular_core.ModelSignal<boolean>;
22
- private items;
28
+ /**
29
+ * Direct-child items of THIS tree (not descendants). Used to compute
30
+ * aria-setsize and aria-posinset for each item among its siblings.
31
+ */
32
+ items: _angular_core.WritableSignal<BsTreeviewItemComponent[]>;
33
+ /** Roving tabindex tracking — only stored on the root tree. */
23
34
  focusedItem: _angular_core.WritableSignal<BsTreeviewItemComponent | null>;
24
35
  private getRootTree;
25
36
  registerItem(item: BsTreeviewItemComponent): void;
@@ -1,26 +1,34 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { ElementRef } from '@angular/core';
3
+ import { BsRovingFocusDirective } from '@mintplayer/ng-bootstrap/a11y';
3
4
 
4
5
  declare class BsTypeaheadComponent {
6
+ private announcer;
5
7
  isOpen: _angular_core.ModelSignal<boolean>;
6
- readonly listboxId: string;
7
8
  suggestions: _angular_core.InputSignal<any[]>;
8
9
  isLoading: _angular_core.WritableSignal<boolean>;
9
10
  showNoSuggestions: _angular_core.Signal<boolean>;
10
11
  readonly textbox: _angular_core.Signal<ElementRef<HTMLInputElement>>;
12
+ readonly rovingFocus: _angular_core.Signal<BsRovingFocusDirective | undefined>;
11
13
  searchterm: _angular_core.ModelSignal<string>;
12
14
  isLoadingText: _angular_core.InputSignal<string>;
13
15
  noSuggestionsText: _angular_core.InputSignal<string>;
16
+ resultsAnnouncementSingular: _angular_core.InputSignal<string>;
17
+ resultsAnnouncementPlural: _angular_core.InputSignal<(count: number) => string>;
14
18
  provideSuggestions: _angular_core.OutputEmitterRef<string>;
15
19
  suggestionSelected: _angular_core.OutputEmitterRef<any>;
16
20
  submitted: _angular_core.OutputEmitterRef<string>;
21
+ private requestInFlight;
17
22
  constructor();
23
+ private announceResults;
18
24
  onProvideSuggestions(value: string): void;
19
25
  suggestionClicked(suggestion: any): void;
20
- onSubmit(): void;
26
+ onActivate(): void;
27
+ onCancel(): void;
28
+ onSubmit(event?: Event): void;
21
29
  focus(): void;
22
30
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsTypeaheadComponent, never>;
23
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsTypeaheadComponent, "bs-typeahead", never, { "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "searchterm": { "alias": "searchterm"; "required": false; "isSignal": true; }; "isLoadingText": { "alias": "isLoadingText"; "required": false; "isSignal": true; }; "noSuggestionsText": { "alias": "noSuggestionsText"; "required": false; "isSignal": true; }; }, { "isOpen": "isOpenChange"; "searchterm": "searchtermChange"; "provideSuggestions": "provideSuggestions"; "suggestionSelected": "suggestionSelected"; "submitted": "submitted"; }, never, never, true, never>;
31
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsTypeaheadComponent, "bs-typeahead", never, { "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; "searchterm": { "alias": "searchterm"; "required": false; "isSignal": true; }; "isLoadingText": { "alias": "isLoadingText"; "required": false; "isSignal": true; }; "noSuggestionsText": { "alias": "noSuggestionsText"; "required": false; "isSignal": true; }; "resultsAnnouncementSingular": { "alias": "resultsAnnouncementSingular"; "required": false; "isSignal": true; }; "resultsAnnouncementPlural": { "alias": "resultsAnnouncementPlural"; "required": false; "isSignal": true; }; }, { "isOpen": "isOpenChange"; "searchterm": "searchtermChange"; "provideSuggestions": "provideSuggestions"; "suggestionSelected": "suggestionSelected"; "submitted": "submitted"; }, never, never, true, never>;
24
32
  }
25
33
 
26
34
  export { BsTypeaheadComponent };
@@ -8,11 +8,17 @@ declare class VirtualDatatableDataSource<T> extends DataSource<T> {
8
8
  private readonly fetchFn;
9
9
  private readonly pageSize;
10
10
  private readonly cachedPages;
11
- private totalRecords;
11
+ private readonly totalRecords$;
12
12
  private dataStream;
13
13
  private subscription?;
14
14
  private resetSubject;
15
15
  private resetVersion;
16
+ /**
17
+ * Emits the current total record count. Backed by the same value as
18
+ * `length`, but observable so consumers (e.g. virtual-datatable's ARIA
19
+ * row-count binding) can react to it without polling.
20
+ */
21
+ readonly length$: Observable<number>;
16
22
  constructor(fetchFn: (skip: number, take: number) => Promise<{
17
23
  data: T[];
18
24
  totalRecords: number;
@@ -44,6 +50,13 @@ declare class BsVirtualDatatableComponent<TData> extends DatatableSortBase imple
44
50
  isResponsive: _angular_core.InputSignal<boolean>;
45
51
  itemSize: _angular_core.InputSignal<number>;
46
52
  readonly rowTemplate: _angular_core.WritableSignal<TemplateRef<BsVirtualRowTemplateContext<TData>> | undefined>;
53
+ /**
54
+ * Total logical row count for ARIA = data rows + 1 header row.
55
+ * Stays in sync with `dataSource.length$` so SR users hear "row 47 of
56
+ * 10000" even though the DOM only renders the visible viewport.
57
+ */
58
+ readonly totalRowCount: _angular_core.WritableSignal<number>;
59
+ constructor();
47
60
  ngAfterViewInit(): void;
48
61
  ngOnDestroy(): void;
49
62
  private setupScrollSync;
@@ -0,0 +1,34 @@
1
+ import { ReactiveController, ReactiveControllerHost, TemplateResult } from 'lit';
2
+
3
+ interface LiveAnnouncerOptions {
4
+ /** "polite" waits for an SR-idle moment; "assertive" interrupts. Default: "polite". */
5
+ politeness?: 'polite' | 'assertive';
6
+ /** ms after which the live region is blanked so the same message can re-announce later. Default: 1500. */
7
+ clearAfterMs?: number;
8
+ }
9
+ /**
10
+ * Lit reactive controller that owns a visually-hidden live region for a Lit
11
+ * web component. Call announce() to push a message; call template() once
12
+ * inside the host's render() to drop the live region into the shadow tree.
13
+ *
14
+ * Why a controller and not a free-floating div appended to the shadow root:
15
+ * Lit's render owns its render root; appending children outside the rendered
16
+ * subtree is fragile across re-renders. Going through the template keeps the
17
+ * region inside Lit's managed DOM and avoids "where did my element go" bugs.
18
+ */
19
+ declare class LiveAnnouncerController implements ReactiveController {
20
+ private host;
21
+ private message;
22
+ private clearTimer;
23
+ private readonly politeness;
24
+ private readonly clearAfterMs;
25
+ constructor(host: ReactiveControllerHost, options?: LiveAnnouncerOptions);
26
+ hostDisconnected(): void;
27
+ announce(message: string): void;
28
+ /** Returns the live-region template fragment. Call once inside the host's render(). */
29
+ template(): TemplateResult;
30
+ private scheduleClear;
31
+ }
32
+
33
+ export { LiveAnnouncerController };
34
+ export type { LiveAnnouncerOptions };
@@ -357,20 +357,43 @@ interface BaseEventDetail {
357
357
  originalEvent?: Event;
358
358
  }
359
359
  /**
360
- * Event click event detail
360
+ * Event-selected event detail. Fires on mouse click and on keyboard Tab
361
+ * landing on an event (PRD scheduler-keyboard-grid-nav D3 — renamed from
362
+ * `EventClickDetail` because keyboard Tab now triggers the same event).
361
363
  */
362
- interface EventClickDetail extends BaseEventDetail {
363
- /** The clicked event */
364
+ interface EventSelectedDetail extends BaseEventDetail {
365
+ /** The selected event */
364
366
  event: SchedulerEvent;
365
367
  }
366
368
  /**
367
- * Event create event detail
369
+ * Event create *request* detail. Per PRD scheduler-controlled-selection,
370
+ * the scheduler does not construct or store the event itself — the consumer
371
+ * receives the range and decides whether to add an event for it.
368
372
  */
369
373
  interface EventCreateDetail extends BaseEventDetail {
370
- /** The newly created event */
371
- event: SchedulerEvent;
372
- /** Resource the event was created on (if applicable) */
373
- resource?: Resource;
374
+ /** The selected time range. */
375
+ range: {
376
+ start: Date;
377
+ end: Date;
378
+ };
379
+ /** Resource the request targets (timeline view only). */
380
+ resourceId?: string;
381
+ /** View that produced the request. */
382
+ view: ViewType;
383
+ }
384
+ /**
385
+ * Selection-change detail. Fires on every transition — including the
386
+ * transition to an empty selection. `selectedEvent` and `range` are
387
+ * independent dimensions of the selection state.
388
+ */
389
+ interface SelectionChangeDetail {
390
+ selectedEvent: SchedulerEvent | null;
391
+ range: {
392
+ start: Date;
393
+ end: Date;
394
+ } | null;
395
+ view: ViewType;
396
+ resourceId?: string;
374
397
  }
375
398
  /**
376
399
  * Event update event detail
@@ -421,14 +444,15 @@ interface ViewChangeDetail {
421
444
  * Custom event map for the scheduler web component
422
445
  */
423
446
  interface SchedulerEventMap {
424
- 'event-click': CustomEvent<EventClickDetail>;
425
- 'event-dblclick': CustomEvent<EventClickDetail>;
447
+ 'event-selected': CustomEvent<EventSelectedDetail>;
448
+ 'event-dblclick': CustomEvent<EventSelectedDetail>;
426
449
  'event-create': CustomEvent<EventCreateDetail>;
427
450
  'event-update': CustomEvent<EventUpdateDetail>;
428
451
  'event-delete': CustomEvent<EventDeleteDetail>;
429
452
  'date-click': CustomEvent<DateClickDetail>;
430
453
  'date-select': CustomEvent<DateSelectDetail>;
431
454
  'view-change': CustomEvent<ViewChangeDetail>;
455
+ 'selection-change': CustomEvent<SelectionChangeDetail>;
432
456
  }
433
457
 
434
458
  /**
@@ -887,4 +911,4 @@ declare function removeClasses(element: Element, ...classes: string[]): void;
887
911
  declare function toggleClass(element: Element, className: string, condition: boolean): void;
888
912
 
889
913
  export { DEFAULT_COLORS, DEFAULT_OPTIONS, DateService, PositionService, ResourceService, TimelineService, addAlpha, addClasses, darkenColor, dateService, findClosestWithData, generateEventId, generateGroupId, generateId, generateResourceId, getCSSVariable, getColorByIndex, getContrastColor, getDataAttributes, getElementByData, getRelativePosition, getScrollPosition, isInViewport, isResource, isResourceGroup, lightenColor, positionService, removeClasses, resourceService, scrollToTime, setCSSVariable, timelineService, toggleClass };
890
- export type { BaseEventDetail, BusinessHours, DateClickDetail, DateSelectDetail, DayOfWeek, DisplayMode, DragOperationType, DragResult, DragState, EventClickDetail, EventCreateDetail, EventDeleteDetail, EventLayoutInfo, EventPosition, EventUpdateDetail, FlattenedResource, HeaderToolbar, PreviewEvent, Resource, ResourceGroup, SchedulerEvent, SchedulerEventMap, SchedulerEventPart, SchedulerEventWithParts, SchedulerGrid, SchedulerOptions, TimeFormat, TimeSlot, TimeSlotRow, TimelineTrack, ViewChangeDetail, ViewType };
914
+ export type { BaseEventDetail, BusinessHours, DateClickDetail, DateSelectDetail, DayOfWeek, DisplayMode, DragOperationType, DragResult, DragState, EventCreateDetail, EventDeleteDetail, EventLayoutInfo, EventPosition, EventSelectedDetail, EventUpdateDetail, FlattenedResource, HeaderToolbar, PreviewEvent, Resource, ResourceGroup, SchedulerEvent, SchedulerEventMap, SchedulerEventPart, SchedulerEventWithParts, SchedulerGrid, SchedulerOptions, SelectionChangeDetail, TimeFormat, TimeSlot, TimeSlotRow, TimelineTrack, ViewChangeDetail, ViewType };