@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-resizable.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/resizable/src/providers/resizable.provider.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resize-glyph/resize-glyph.directive.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resizable/resizable.component.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resizable/resizable.component.html","../../../../libs/mintplayer-ng-bootstrap/resizable/mintplayer-ng-bootstrap-resizable.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport type { BsResizableComponent } from \"../resizable/resizable.component\";\n\nexport const RESIZABLE = new InjectionToken<BsResizableComponent>('Resizable');","import { Directive, effect, inject, input, signal, forwardRef } from '@angular/core';\nimport { Position } from '@mintplayer/ng-bootstrap';\nimport type { BsResizableComponent } from '../resizable/resizable.component';\nimport { ResizeAction } from '../interfaces/resize-action';\nimport { PointerData } from '../interfaces/pointer-data';\nimport { RESIZABLE } from '../providers/resizable.provider';\n\n@Directive({\n selector: '[bsResizeGlyph]',\n host: {\n '[class]': 'positions()',\n '[class.glyph]': 'true',\n '[class.active]': 'activeClass()',\n '(mousedown)': 'onMouseDown($event)',\n '(touchstart)': 'onTouchStart($event)',\n '(document:mousemove)': 'onMouseMove($event)',\n '(touchmove)': 'onTouchMove($event)',\n '(document:mouseup)': 'onMouseUp($event)',\n '(touchend)': 'onTouchEnd($event)',\n },\n})\nexport class BsResizeGlyphDirective {\n\n // Can't use typed DI because of the `import type`\n private readonly resizable: BsResizableComponent = inject(RESIZABLE);\n\n constructor() {\n effect(() => {\n const value = this.bsResizeGlyph();\n this.positions.set(value.join(' '));\n });\n }\n\n positions = signal('');\n activeClass = signal(false);\n\n readonly bsResizeGlyph = input<Position[]>([]);\n\n onMouseDown(ev: MouseEvent) {\n ev.preventDefault();\n this.onPointerDown()\n }\n\n onTouchStart(ev: TouchEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerDown();\n }\n\n onMouseMove(ev: MouseEvent) {\n this.onPointerMove({ clientX: ev.clientX, clientY: ev.clientY, preventDefault: () => ev.preventDefault() });\n }\n\n onTouchMove(ev: TouchEvent) {\n if (ev.touches.length === 1) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerMove({ clientX: ev.touches[0].clientX, clientY: ev.touches[0].clientY, preventDefault: () => ev.preventDefault() });\n }\n }\n\n onMouseUp(ev: Event) {\n this.onPointerUp();\n }\n\n onTouchEnd(ev: TouchEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerUp();\n }\n\n onPointerDown() {\n let action: ResizeAction = {\n positioning: this.resizable.positioning()\n };\n const rect = this.resizable.element.nativeElement.getBoundingClientRect();\n const styles = window.getComputedStyle(this.resizable.element.nativeElement);\n\n const marginLeft = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginLeft.slice(0, -2));\n const marginRight = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginRight.slice(0, -2));\n const marginTop = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginTop.slice(0, -2));\n const marginBottom = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginBottom.slice(0, -2));\n\n\n if (this.positions()?.includes('start')) {\n action = {\n ...action,\n end: {\n edge: rect.right,\n size: rect.width,\n margin: marginRight,\n dragMargin: marginLeft\n },\n };\n }\n if (this.positions()?.includes('end')) {\n action = {\n ...action,\n start: {\n edge: rect.left,\n size: rect.width,\n margin: marginLeft,\n dragMargin: marginRight\n },\n };\n }\n if (this.positions()?.includes('top')) {\n action = {\n ...action,\n bottom: {\n edge: rect.bottom,\n size: rect.height,\n margin: marginBottom,\n dragMargin: marginTop\n },\n };\n }\n if (this.positions()?.includes('bottom')) {\n action = {\n ...action,\n top: {\n edge: rect.top,\n size: rect.height,\n margin: marginTop,\n dragMargin: marginBottom\n },\n };\n }\n\n this.resizable.resizeAction = action;\n this.activeClass.set(true);\n }\n\n private isBusy = false;\n onPointerMove(ev: PointerData) {\n if (this.resizable.resizeAction && !this.isBusy) {\n ev.preventDefault();\n this.isBusy = true;\n const action = this.resizable.resizeAction;\n // Note: the live bounding rect must NOT be used in the size/margin math.\n // Reading it per-frame creates a feedback loop when content inside the\n // host changes layout during the drag (e.g. a child component that\n // shows/hides items in response to width). Use the captured `action`\n // values from pointer-down — they're stable for the duration of the drag.\n\n if (action.start && this.positions()?.includes('end')) {\n // Right glyph — fixed left edge\n const initialLeft = action.start.edge;\n const initialRight = action.start.edge + action.start.size;\n const x = (ev.clientX < initialLeft + 10) ? initialLeft + 10 : ev.clientX;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.start.dragMargin ?? 0;\n this.resizable.marginRight.set(initialMargin + (initialRight - x));\n } break;\n case 'absolute': {\n this.resizable.width.set(x - initialLeft);\n } break;\n }\n } else if (action.end && this.positions()?.includes('start')) {\n // Left glyph — fixed right edge\n const initialRight = action.end.edge;\n const initialLeft = action.end.edge - action.end.size;\n const x = (ev.clientX > initialRight - 10) ? initialRight - 10 : ev.clientX;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.end.dragMargin ?? 0;\n this.resizable.marginLeft.set(initialMargin + (x - initialLeft));\n } break;\n case 'absolute': {\n this.resizable.left.set(x);\n this.resizable.width.set(initialRight - x);\n } break;\n }\n }\n\n if (action.top && this.positions()?.includes('bottom')) {\n // Bottom glyph — fixed top edge. action.top.edge = captured rect.top\n const initialTop = action.top.edge;\n const initialBottom = action.top.edge + action.top.size;\n const y = (ev.clientY < initialTop + 10) ? initialTop + 10 : ev.clientY;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.top.dragMargin ?? 0;\n this.resizable.height.set(y - initialTop);\n this.resizable.marginBottom.set(initialMargin + (initialBottom - y));\n } break;\n case 'absolute': {\n this.resizable.height.set(y - initialTop);\n } break;\n }\n } else if (action.bottom && this.positions()?.includes('top')) {\n // Top glyph — fixed bottom edge. action.bottom.edge = captured rect.bottom\n const initialBottom = action.bottom.edge;\n const initialTop = action.bottom.edge - action.bottom.size;\n const y = (ev.clientY > initialBottom - 10) ? initialBottom - 10 : ev.clientY;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.bottom.dragMargin ?? 0;\n this.resizable.height.set(initialBottom - y);\n this.resizable.marginTop.set(initialMargin + (y - initialTop));\n } break;\n case 'absolute': {\n this.resizable.top.set(y);\n this.resizable.height.set(initialBottom - y);\n } break;\n }\n }\n this.isBusy = false;\n }\n }\n \n onPointerUp() {\n this.resizable.resizeAction = undefined;\n this.activeClass.set(false);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, ElementRef, inject, input, forwardRef, signal } from '@angular/core';\nimport { ResizeAction } from '../interfaces/resize-action';\nimport { RESIZABLE } from '../providers/resizable.provider';\nimport { ResizablePositioning } from '../types/positioning';\nimport { PresetPosition } from '../interfaces/preset-position';\nimport { BsResizeGlyphDirective } from '../resize-glyph/resize-glyph.directive';\n\n@Component({\n selector: 'bs-resizable',\n templateUrl: './resizable.component.html',\n styleUrls: ['./resizable.component.scss'],\n imports: [BsResizeGlyphDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: RESIZABLE, useExisting: forwardRef(() => BsResizableComponent) }\n ],\n host: {\n '[style.margin-left.px]': 'marginLeft()',\n '[style.margin-right.px]': 'marginRight()',\n '[style.margin-top.px]': 'marginTop()',\n '[style.margin-bottom.px]': 'marginBottom()',\n '[style.width.px]': 'width()',\n '[style.height.px]': 'height()',\n '[style.left.px]': 'left()',\n '[style.top.px]': 'top()',\n '[class.d-block]': 'true',\n '[class.border]': 'true',\n '[class]': 'hostPosition()',\n },\n})\nexport class BsResizableComponent {\n element = inject(ElementRef<HTMLElement>);\n\n resizeAction?: ResizeAction;\n positioning = input<ResizablePositioning>('inline');\n horizontal = input(true);\n vertical = input(true);\n corners = input(true);\n\n showCorners = computed(() => this.horizontal() && this.vertical() && this.corners());\n\n hostPosition = computed(() => {\n const positioning = this.positioning();\n switch (positioning) {\n case 'absolute': return 'position-absolute';\n case 'inline': return 'position-relative';\n }\n });\n\n wrapperPosition = computed(() => {\n const positioning = this.positioning();\n switch (positioning) {\n case 'absolute': return ['position-relative', 'h-100'];\n case 'inline': return [];\n }\n });\n\n readonly presetPosition = input<PresetPosition | undefined>(undefined);\n\n constructor() {\n effect(() => {\n const value = this.presetPosition();\n if (value) {\n if (this.positioning() === 'inline') {\n throw 'presetPosition currently only supported in absolute positioning';\n }\n this.width.set(value.width);\n this.height.set(value.height);\n this.left.set(value.left);\n this.top.set(value.top);\n this.marginTop.set(undefined);\n this.marginBottom.set(undefined);\n this.marginLeft.set(undefined);\n this.marginRight.set(undefined);\n }\n });\n }\n\n marginLeft = signal<number | undefined>(undefined);\n marginRight = signal<number | undefined>(undefined);\n marginTop = signal<number | undefined>(undefined);\n marginBottom = signal<number | undefined>(undefined);\n width = signal<number | undefined>(undefined);\n height = signal<number | undefined>(undefined);\n left = signal<number | undefined>(undefined);\n top = signal<number | undefined>(undefined);\n}\n","<div [class]=\"wrapperPosition()\" class=\"h-100\">\n @if (showCorners()) {\n <div class=\"cursor-nw-resize\" [bsResizeGlyph]=\"['top', 'start']\"></div>\n <div class=\"cursor-ne-resize\" [bsResizeGlyph]=\"['top', 'end']\"></div>\n <div class=\"cursor-se-resize\" [bsResizeGlyph]=\"['bottom', 'end']\"></div>\n <div class=\"cursor-sw-resize\" [bsResizeGlyph]=\"['bottom', 'start']\"></div>\n }\n @if (vertical()) {\n <div class=\"cursor-n-resize\" [bsResizeGlyph]=\"['top']\"></div>\n <div class=\"cursor-s-resize\" [bsResizeGlyph]=\"['bottom']\"></div>\n }\n @if (horizontal()) {\n <div class=\"cursor-e-resize\" [bsResizeGlyph]=\"['end']\"></div>\n <div class=\"cursor-w-resize\" [bsResizeGlyph]=\"['start']\"></div>\n }\n <ng-content></ng-content>\n</div>","/**\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-resizable.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/resizable/src/providers/resizable.provider.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resize-glyph/resize-glyph.directive.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resizable/resizable.component.ts","../../../../libs/mintplayer-ng-bootstrap/resizable/src/resizable/resizable.component.html","../../../../libs/mintplayer-ng-bootstrap/resizable/mintplayer-ng-bootstrap-resizable.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\nimport type { BsResizableComponent } from \"../resizable/resizable.component\";\n\nexport const RESIZABLE = new InjectionToken<BsResizableComponent>('Resizable');","import { computed, Directive, effect, inject, input, signal } from '@angular/core';\nimport { Position } from '@mintplayer/ng-bootstrap';\nimport type { BsResizableComponent } from '../resizable/resizable.component';\nimport { ResizeAction } from '../interfaces/resize-action';\nimport { PointerData } from '../interfaces/pointer-data';\nimport { RESIZABLE } from '../providers/resizable.provider';\n\n@Directive({\n selector: '[bsResizeGlyph]',\n host: {\n '[class]': 'positions()',\n '[class.glyph]': 'true',\n '[class.active]': 'activeClass()',\n '[attr.role]': '\"separator\"',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-orientation]': 'ariaOrientation()',\n '[attr.tabindex]': '\"0\"',\n '(mousedown)': 'onMouseDown($event)',\n '(touchstart)': 'onTouchStart($event)',\n '(document:mousemove)': 'onMouseMove($event)',\n '(touchmove)': 'onTouchMove($event)',\n '(document:mouseup)': 'onMouseUp($event)',\n '(touchend)': 'onTouchEnd($event)',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class BsResizeGlyphDirective {\n\n // Can't use typed DI because of the `import type`\n private readonly resizable: BsResizableComponent = inject(RESIZABLE);\n\n constructor() {\n effect(() => {\n const value = this.bsResizeGlyph();\n this.positions.set(value.join(' '));\n });\n }\n\n positions = signal('');\n activeClass = signal(false);\n\n readonly bsResizeGlyph = input<Position[]>([]);\n\n readonly ariaOrientation = computed(() => {\n const p = this.bsResizeGlyph();\n if (p.length !== 1) return null;\n if (p[0] === 'top' || p[0] === 'bottom') return 'horizontal';\n if (p[0] === 'start' || p[0] === 'end') return 'vertical';\n return null;\n });\n\n readonly ariaLabel = computed(() => {\n const p = [...this.bsResizeGlyph()].sort().join(' ');\n switch (p) {\n case 'top': return 'Resize from top edge';\n case 'bottom': return 'Resize from bottom edge';\n case 'start': return 'Resize from left edge';\n case 'end': return 'Resize from right edge';\n case 'start top': return 'Resize from top-left corner';\n case 'end top': return 'Resize from top-right corner';\n case 'bottom start': return 'Resize from bottom-left corner';\n case 'bottom end': return 'Resize from bottom-right corner';\n default: return 'Resize';\n }\n });\n\n onMouseDown(ev: MouseEvent) {\n ev.preventDefault();\n this.onPointerDown()\n }\n\n onTouchStart(ev: TouchEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerDown();\n }\n\n onMouseMove(ev: MouseEvent) {\n this.onPointerMove({ clientX: ev.clientX, clientY: ev.clientY, preventDefault: () => ev.preventDefault() });\n }\n\n onTouchMove(ev: TouchEvent) {\n if (ev.touches.length === 1) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerMove({ clientX: ev.touches[0].clientX, clientY: ev.touches[0].clientY, preventDefault: () => ev.preventDefault() });\n }\n }\n\n onMouseUp(ev: Event) {\n this.onPointerUp();\n }\n\n onTouchEnd(ev: TouchEvent) {\n ev.preventDefault();\n ev.stopPropagation();\n this.onPointerUp();\n }\n\n onPointerDown() {\n let action: ResizeAction = {\n positioning: this.resizable.positioning()\n };\n const rect = this.resizable.element.nativeElement.getBoundingClientRect();\n const styles = window.getComputedStyle(this.resizable.element.nativeElement);\n\n const marginLeft = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginLeft.slice(0, -2));\n const marginRight = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginRight.slice(0, -2));\n const marginTop = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginTop.slice(0, -2));\n const marginBottom = (this.resizable.positioning() === 'absolute') ? undefined : parseFloat(styles.marginBottom.slice(0, -2));\n\n\n if (this.positions()?.includes('start')) {\n action = {\n ...action,\n end: {\n edge: rect.right,\n size: rect.width,\n margin: marginRight,\n dragMargin: marginLeft\n },\n };\n }\n if (this.positions()?.includes('end')) {\n action = {\n ...action,\n start: {\n edge: rect.left,\n size: rect.width,\n margin: marginLeft,\n dragMargin: marginRight\n },\n };\n }\n if (this.positions()?.includes('top')) {\n action = {\n ...action,\n bottom: {\n edge: rect.bottom,\n size: rect.height,\n margin: marginBottom,\n dragMargin: marginTop\n },\n };\n }\n if (this.positions()?.includes('bottom')) {\n action = {\n ...action,\n top: {\n edge: rect.top,\n size: rect.height,\n margin: marginTop,\n dragMargin: marginBottom\n },\n };\n }\n\n this.resizable.resizeAction = action;\n this.activeClass.set(true);\n }\n\n private isBusy = false;\n onPointerMove(ev: PointerData) {\n if (this.resizable.resizeAction && !this.isBusy) {\n ev.preventDefault();\n this.isBusy = true;\n const action = this.resizable.resizeAction;\n // Note: the live bounding rect must NOT be used in the size/margin math.\n // Reading it per-frame creates a feedback loop when content inside the\n // host changes layout during the drag (e.g. a child component that\n // shows/hides items in response to width). Use the captured `action`\n // values from pointer-down — they're stable for the duration of the drag.\n\n if (action.start && this.positions()?.includes('end')) {\n // Right glyph — fixed left edge\n const initialLeft = action.start.edge;\n const initialRight = action.start.edge + action.start.size;\n const x = (ev.clientX < initialLeft + 10) ? initialLeft + 10 : ev.clientX;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.start.dragMargin ?? 0;\n this.resizable.marginRight.set(initialMargin + (initialRight - x));\n } break;\n case 'absolute': {\n this.resizable.width.set(x - initialLeft);\n } break;\n }\n } else if (action.end && this.positions()?.includes('start')) {\n // Left glyph — fixed right edge\n const initialRight = action.end.edge;\n const initialLeft = action.end.edge - action.end.size;\n const x = (ev.clientX > initialRight - 10) ? initialRight - 10 : ev.clientX;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.end.dragMargin ?? 0;\n this.resizable.marginLeft.set(initialMargin + (x - initialLeft));\n } break;\n case 'absolute': {\n this.resizable.left.set(x);\n this.resizable.width.set(initialRight - x);\n } break;\n }\n }\n\n if (action.top && this.positions()?.includes('bottom')) {\n // Bottom glyph — fixed top edge. action.top.edge = captured rect.top\n const initialTop = action.top.edge;\n const initialBottom = action.top.edge + action.top.size;\n const y = (ev.clientY < initialTop + 10) ? initialTop + 10 : ev.clientY;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.top.dragMargin ?? 0;\n this.resizable.height.set(y - initialTop);\n this.resizable.marginBottom.set(initialMargin + (initialBottom - y));\n } break;\n case 'absolute': {\n this.resizable.height.set(y - initialTop);\n } break;\n }\n } else if (action.bottom && this.positions()?.includes('top')) {\n // Top glyph — fixed bottom edge. action.bottom.edge = captured rect.bottom\n const initialBottom = action.bottom.edge;\n const initialTop = action.bottom.edge - action.bottom.size;\n const y = (ev.clientY > initialBottom - 10) ? initialBottom - 10 : ev.clientY;\n switch (this.resizable.positioning()) {\n case 'inline': {\n const initialMargin = action.bottom.dragMargin ?? 0;\n this.resizable.height.set(initialBottom - y);\n this.resizable.marginTop.set(initialMargin + (y - initialTop));\n } break;\n case 'absolute': {\n this.resizable.top.set(y);\n this.resizable.height.set(initialBottom - y);\n } break;\n }\n }\n this.isBusy = false;\n }\n }\n\n onPointerUp() {\n this.resizable.resizeAction = undefined;\n this.activeClass.set(false);\n }\n\n /** Keyboard alternative to drag. Arrow keys resize by 10px from the corresponding edge. */\n onKeydown(event: KeyboardEvent) {\n const positions = this.bsResizeGlyph();\n const step = event.shiftKey ? 1 : 10;\n let consumed = false;\n\n const adjustWidth = (dx: number) => {\n const el = this.resizable.element.nativeElement;\n const rect = el.getBoundingClientRect();\n this.resizable.width.set(Math.max(20, rect.width + dx));\n };\n const adjustHeight = (dy: number) => {\n const el = this.resizable.element.nativeElement;\n const rect = el.getBoundingClientRect();\n this.resizable.height.set(Math.max(20, rect.height + dy));\n };\n\n switch (event.key) {\n case 'ArrowRight':\n if (positions.includes('end')) { adjustWidth(step); consumed = true; }\n else if (positions.includes('start')) { adjustWidth(-step); consumed = true; }\n break;\n case 'ArrowLeft':\n if (positions.includes('end')) { adjustWidth(-step); consumed = true; }\n else if (positions.includes('start')) { adjustWidth(step); consumed = true; }\n break;\n case 'ArrowDown':\n if (positions.includes('bottom')) { adjustHeight(step); consumed = true; }\n else if (positions.includes('top')) { adjustHeight(-step); consumed = true; }\n break;\n case 'ArrowUp':\n if (positions.includes('bottom')) { adjustHeight(-step); consumed = true; }\n else if (positions.includes('top')) { adjustHeight(step); consumed = true; }\n break;\n }\n if (consumed) event.preventDefault();\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, ElementRef, inject, input, forwardRef, signal } from '@angular/core';\nimport { ResizeAction } from '../interfaces/resize-action';\nimport { RESIZABLE } from '../providers/resizable.provider';\nimport { ResizablePositioning } from '../types/positioning';\nimport { PresetPosition } from '../interfaces/preset-position';\nimport { BsResizeGlyphDirective } from '../resize-glyph/resize-glyph.directive';\n\n@Component({\n selector: 'bs-resizable',\n templateUrl: './resizable.component.html',\n styleUrls: ['./resizable.component.scss'],\n imports: [BsResizeGlyphDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n { provide: RESIZABLE, useExisting: forwardRef(() => BsResizableComponent) }\n ],\n host: {\n '[style.margin-left.px]': 'marginLeft()',\n '[style.margin-right.px]': 'marginRight()',\n '[style.margin-top.px]': 'marginTop()',\n '[style.margin-bottom.px]': 'marginBottom()',\n '[style.width.px]': 'width()',\n '[style.height.px]': 'height()',\n '[style.left.px]': 'left()',\n '[style.top.px]': 'top()',\n '[class.d-block]': 'true',\n '[class.border]': 'true',\n '[class]': 'hostPosition()',\n },\n})\nexport class BsResizableComponent {\n element = inject(ElementRef<HTMLElement>);\n\n resizeAction?: ResizeAction;\n positioning = input<ResizablePositioning>('inline');\n horizontal = input(true);\n vertical = input(true);\n corners = input(true);\n\n showCorners = computed(() => this.horizontal() && this.vertical() && this.corners());\n\n hostPosition = computed(() => {\n const positioning = this.positioning();\n switch (positioning) {\n case 'absolute': return 'position-absolute';\n case 'inline': return 'position-relative';\n }\n });\n\n wrapperPosition = computed(() => {\n const positioning = this.positioning();\n switch (positioning) {\n case 'absolute': return ['position-relative', 'h-100'];\n case 'inline': return [];\n }\n });\n\n readonly presetPosition = input<PresetPosition | undefined>(undefined);\n\n constructor() {\n effect(() => {\n const value = this.presetPosition();\n if (value) {\n if (this.positioning() === 'inline') {\n throw 'presetPosition currently only supported in absolute positioning';\n }\n this.width.set(value.width);\n this.height.set(value.height);\n this.left.set(value.left);\n this.top.set(value.top);\n this.marginTop.set(undefined);\n this.marginBottom.set(undefined);\n this.marginLeft.set(undefined);\n this.marginRight.set(undefined);\n }\n });\n }\n\n marginLeft = signal<number | undefined>(undefined);\n marginRight = signal<number | undefined>(undefined);\n marginTop = signal<number | undefined>(undefined);\n marginBottom = signal<number | undefined>(undefined);\n width = signal<number | undefined>(undefined);\n height = signal<number | undefined>(undefined);\n left = signal<number | undefined>(undefined);\n top = signal<number | undefined>(undefined);\n}\n","<div [class]=\"wrapperPosition()\" class=\"h-100\">\n @if (showCorners()) {\n <div class=\"cursor-nw-resize\" [bsResizeGlyph]=\"['top', 'start']\"></div>\n <div class=\"cursor-ne-resize\" [bsResizeGlyph]=\"['top', 'end']\"></div>\n <div class=\"cursor-se-resize\" [bsResizeGlyph]=\"['bottom', 'end']\"></div>\n <div class=\"cursor-sw-resize\" [bsResizeGlyph]=\"['bottom', 'start']\"></div>\n }\n @if (vertical()) {\n <div class=\"cursor-n-resize\" [bsResizeGlyph]=\"['top']\"></div>\n <div class=\"cursor-s-resize\" [bsResizeGlyph]=\"['bottom']\"></div>\n }\n @if (horizontal()) {\n <div class=\"cursor-e-resize\" [bsResizeGlyph]=\"['end']\"></div>\n <div class=\"cursor-w-resize\" [bsResizeGlyph]=\"['start']\"></div>\n }\n <ng-content></ng-content>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;MAGa,SAAS,GAAG,IAAI,cAAc,CAAuB,WAAW;;MCuBhE,sBAAsB,CAAA;AAKjC,IAAA,WAAA,GAAA;;AAFiB,QAAA,IAAA,CAAA,SAAS,GAAyB,MAAM,CAAC,SAAS,CAAC;AASpE,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;AACtB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,KAAK,kFAAC;AAElB,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAa,EAAE,oFAAC;AAErC,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACvC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE;AAC9B,YAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,IAAI;AAC/B,YAAA,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;AAAE,gBAAA,OAAO,YAAY;AAC5D,YAAA,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK;AAAE,gBAAA,OAAO,UAAU;AACzD,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,sFAAC;AAEO,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;YACpD,QAAQ,CAAC;AACP,gBAAA,KAAK,KAAK,EAAE,OAAO,sBAAsB;AACzC,gBAAA,KAAK,QAAQ,EAAE,OAAO,yBAAyB;AAC/C,gBAAA,KAAK,OAAO,EAAE,OAAO,uBAAuB;AAC5C,gBAAA,KAAK,KAAK,EAAE,OAAO,wBAAwB;AAC3C,gBAAA,KAAK,WAAW,EAAE,OAAO,6BAA6B;AACtD,gBAAA,KAAK,SAAS,EAAE,OAAO,8BAA8B;AACrD,gBAAA,KAAK,cAAc,EAAE,OAAO,gCAAgC;AAC5D,gBAAA,KAAK,YAAY,EAAE,OAAO,iCAAiC;AAC3D,gBAAA,SAAS,OAAO,QAAQ;;AAE5B,QAAA,CAAC,gFAAC;QAiGM,IAAA,CAAA,MAAM,GAAG,KAAK;QAjIpB,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAClC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,QAAA,CAAC,CAAC;IACJ;AA8BA,IAAA,WAAW,CAAC,EAAc,EAAA;QACxB,EAAE,CAAC,cAAc,EAAE;QACnB,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA,IAAA,YAAY,CAAC,EAAc,EAAA;QACzB,EAAE,CAAC,cAAc,EAAE;QACnB,EAAE,CAAC,eAAe,EAAE;QACpB,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA,IAAA,WAAW,CAAC,EAAc,EAAA;QACxB,IAAI,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;IAC7G;AAEA,IAAA,WAAW,CAAC,EAAc,EAAA;QACxB,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3B,EAAE,CAAC,cAAc,EAAE;YACnB,EAAE,CAAC,eAAe,EAAE;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;QACnI;IACF;AAEA,IAAA,SAAS,CAAC,EAAS,EAAA;QACjB,IAAI,CAAC,WAAW,EAAE;IACpB;AAEA,IAAA,UAAU,CAAC,EAAc,EAAA;QACvB,EAAE,CAAC,cAAc,EAAE;QACnB,EAAE,CAAC,eAAe,EAAE;QACpB,IAAI,CAAC,WAAW,EAAE;IACpB;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,MAAM,GAAiB;AACzB,YAAA,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW;SACxC;AACD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,qBAAqB,EAAE;AACzE,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC;AAE5E,QAAA,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,UAAU,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACzH,QAAA,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,UAAU,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3H,QAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,UAAU,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACvH,QAAA,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,UAAU,IAAI,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAG7H,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE;AACvC,YAAA,MAAM,GAAG;AACP,gBAAA,GAAG,MAAM;AACT,gBAAA,GAAG,EAAE;oBACH,IAAI,EAAE,IAAI,CAAC,KAAK;oBAChB,IAAI,EAAE,IAAI,CAAC,KAAK;AAChB,oBAAA,MAAM,EAAE,WAAW;AACnB,oBAAA,UAAU,EAAE;AACb,iBAAA;aACF;QACH;QACA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE;AACrC,YAAA,MAAM,GAAG;AACP,gBAAA,GAAG,MAAM;AACT,gBAAA,KAAK,EAAE;oBACL,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,KAAK;AAChB,oBAAA,MAAM,EAAE,UAAU;AAClB,oBAAA,UAAU,EAAE;AACb,iBAAA;aACF;QACH;QACA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE;AACrC,YAAA,MAAM,GAAG;AACP,gBAAA,GAAG,MAAM;AACT,gBAAA,MAAM,EAAE;oBACN,IAAI,EAAE,IAAI,CAAC,MAAM;oBACjB,IAAI,EAAE,IAAI,CAAC,MAAM;AACjB,oBAAA,MAAM,EAAE,YAAY;AACpB,oBAAA,UAAU,EAAE;AACb,iBAAA;aACF;QACH;QACA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACxC,YAAA,MAAM,GAAG;AACP,gBAAA,GAAG,MAAM;AACT,gBAAA,GAAG,EAAE;oBACH,IAAI,EAAE,IAAI,CAAC,GAAG;oBACd,IAAI,EAAE,IAAI,CAAC,MAAM;AACjB,oBAAA,MAAM,EAAE,SAAS;AACjB,oBAAA,UAAU,EAAE;AACb,iBAAA;aACF;QACH;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,MAAM;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;AAGA,IAAA,aAAa,CAAC,EAAe,EAAA;QAC3B,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAC/C,EAAE,CAAC,cAAc,EAAE;AACnB,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY;;;;;;AAO1C,YAAA,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE;;AAErD,gBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI;AACrC,gBAAA,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI;gBAC1D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,WAAW,GAAG,EAAE,IAAI,WAAW,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;AACzE,gBAAA,QAAQ,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAClC,oBAAA,KAAK,QAAQ;wBAAE;4BACb,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC;AAClD,4BAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;wBACpE;wBAAE;AACF,oBAAA,KAAK,UAAU;wBAAE;4BACf,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC;wBAC3C;wBAAE;;YAEN;AAAO,iBAAA,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE;;AAE5D,gBAAA,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI;AACpC,gBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI;gBACrD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,YAAY,GAAG,EAAE,IAAI,YAAY,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;AAC3E,gBAAA,QAAQ,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAClC,oBAAA,KAAK,QAAQ;wBAAE;4BACb,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC;AAChD,4BAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;wBAClE;wBAAE;AACF,oBAAA,KAAK,UAAU;wBAAE;4BACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;4BAC1B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;wBAC5C;wBAAE;;YAEN;AAEA,YAAA,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE;;AAEtD,gBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI;AAClC,gBAAA,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI;gBACvD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,UAAU,GAAG,EAAE,IAAI,UAAU,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;AACvE,gBAAA,QAAQ,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAClC,oBAAA,KAAK,QAAQ;wBAAE;4BACb,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC;4BAChD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC;AACzC,4BAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;wBACtE;wBAAE;AACF,oBAAA,KAAK,UAAU;wBAAE;4BACf,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC;wBAC3C;wBAAE;;YAEN;AAAO,iBAAA,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE;;AAE7D,gBAAA,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI;AACxC,gBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI;gBAC1D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,aAAa,GAAG,EAAE,IAAI,aAAa,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO;AAC7E,gBAAA,QAAQ,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAClC,oBAAA,KAAK,QAAQ;wBAAE;4BACb,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC;4BACnD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC;AAC5C,4BAAA,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;wBAChE;wBAAE;AACF,oBAAA,KAAK,UAAU;wBAAE;4BACf,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;4BACzB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC;wBAC9C;wBAAE;;YAEN;AACA,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACrB;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,SAAS;AACvC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;IAC7B;;AAGA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;AACtC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAE;QACpC,IAAI,QAAQ,GAAG,KAAK;AAEpB,QAAA,MAAM,WAAW,GAAG,CAAC,EAAU,KAAI;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa;AAC/C,YAAA,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE;YACvC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AACzD,QAAA,CAAC;AACD,QAAA,MAAM,YAAY,GAAG,CAAC,EAAU,KAAI;YAClC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa;AAC/C,YAAA,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE;YACvC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAC3D,QAAA,CAAC;AAED,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,YAAY;AACf,gBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;oBAAE,WAAW,CAAC,IAAI,CAAC;oBAAE,QAAQ,GAAG,IAAI;gBAAE;AAChE,qBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAAE,oBAAA,WAAW,CAAC,CAAC,IAAI,CAAC;oBAAE,QAAQ,GAAG,IAAI;gBAAE;gBAC7E;AACF,YAAA,KAAK,WAAW;AACd,gBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAAE,oBAAA,WAAW,CAAC,CAAC,IAAI,CAAC;oBAAE,QAAQ,GAAG,IAAI;gBAAE;AACjE,qBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;oBAAE,WAAW,CAAC,IAAI,CAAC;oBAAE,QAAQ,GAAG,IAAI;gBAAE;gBAC5E;AACF,YAAA,KAAK,WAAW;AACd,gBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBAAE,YAAY,CAAC,IAAI,CAAC;oBAAE,QAAQ,GAAG,IAAI;gBAAE;AACpE,qBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAAE,oBAAA,YAAY,CAAC,CAAC,IAAI,CAAC;oBAAE,QAAQ,GAAG,IAAI;gBAAE;gBAC5E;AACF,YAAA,KAAK,SAAS;AACZ,gBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAAE,oBAAA,YAAY,CAAC,CAAC,IAAI,CAAC;oBAAE,QAAQ,GAAG,IAAI;gBAAE;AACrE,qBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;oBAAE,YAAY,CAAC,IAAI,CAAC;oBAAE,QAAQ,GAAG,IAAI;gBAAE;gBAC3E;;AAEJ,QAAA,IAAI,QAAQ;YAAE,KAAK,CAAC,cAAc,EAAE;IACtC;+GA/PW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,MAAA,EAAA,cAAA,EAAA,eAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,OAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAnBlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,aAAa;AACxB,wBAAA,eAAe,EAAE,MAAM;AACvB,wBAAA,gBAAgB,EAAE,eAAe;AACjC,wBAAA,aAAa,EAAE,aAAa;AAC5B,wBAAA,mBAAmB,EAAE,aAAa;AAClC,wBAAA,yBAAyB,EAAE,mBAAmB;AAC9C,wBAAA,iBAAiB,EAAE,KAAK;AACxB,wBAAA,aAAa,EAAE,qBAAqB;AACpC,wBAAA,cAAc,EAAE,sBAAsB;AACtC,wBAAA,sBAAsB,EAAE,qBAAqB;AAC7C,wBAAA,aAAa,EAAE,qBAAqB;AACpC,wBAAA,oBAAoB,EAAE,mBAAmB;AACzC,wBAAA,YAAY,EAAE,oBAAoB;AAClC,wBAAA,WAAW,EAAE,mBAAmB;AACjC,qBAAA;AACF,iBAAA;;;MCKY,oBAAoB,CAAA;AA6B/B,IAAA,WAAA,GAAA;AA5BA,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,EAAC,UAAuB,EAAC;AAGzC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAuB,QAAQ,kFAAC;AACnD,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,IAAI,iFAAC;AACxB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,+EAAC;AACtB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,IAAI,8EAAC;QAErB,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEpF,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC3B,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;YACtC,QAAQ,WAAW;AACjB,gBAAA,KAAK,UAAU,EAAE,OAAO,mBAAmB;AAC3C,gBAAA,KAAK,QAAQ,EAAE,OAAO,mBAAmB;;AAE7C,QAAA,CAAC,mFAAC;AAEF,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AAC9B,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;YACtC,QAAQ,WAAW;gBACjB,KAAK,UAAU,EAAE,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC;AACtD,gBAAA,KAAK,QAAQ,EAAE,OAAO,EAAE;;AAE5B,QAAA,CAAC,sFAAC;AAEO,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAA6B,SAAS,qFAAC;AAqBtE,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAqB,SAAS,iFAAC;AAClD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAqB,SAAS,kFAAC;AACnD,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAqB,SAAS,gFAAC;AACjD,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAqB,SAAS,mFAAC;AACpD,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAqB,SAAS,4EAAC;AAC7C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAqB,SAAS,6EAAC;AAC9C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAqB,SAAS,2EAAC;AAC5C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAqB,SAAS,0EAAC;QAzBzC,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;YACnC,IAAI,KAAK,EAAE;AACT,gBAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;AACnC,oBAAA,MAAM,iEAAiE;gBACzE;gBACA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AACvB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC7B,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AAChC,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9B,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;YACjC;AACF,QAAA,CAAC,CAAC;IACJ;+GA9CW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,cAAA,EAAA,OAAA,EAAA,eAAA,EAAA,MAAA,EAAA,cAAA,EAAA,MAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,SAAA,EAjBpB;AACT,YAAA,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;SAC1E,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfH,q0BAgBM,y+BDLM,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAmBrB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAvBhC,SAAS;+BACE,cAAc,EAAA,OAAA,EAGf,CAAC,sBAAsB,CAAC,mBAChB,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,MAAK,oBAAqB,CAAC;qBAC1E,EAAA,IAAA,EACK;AACJ,wBAAA,wBAAwB,EAAE,cAAc;AACxC,wBAAA,yBAAyB,EAAE,eAAe;AAC1C,wBAAA,uBAAuB,EAAE,aAAa;AACtC,wBAAA,0BAA0B,EAAE,gBAAgB;AAC5C,wBAAA,kBAAkB,EAAE,SAAS;AAC7B,wBAAA,mBAAmB,EAAE,UAAU;AAC/B,wBAAA,iBAAiB,EAAE,QAAQ;AAC3B,wBAAA,gBAAgB,EAAE,OAAO;AACzB,wBAAA,iBAAiB,EAAE,MAAM;AACzB,wBAAA,gBAAgB,EAAE,MAAM;AACxB,wBAAA,SAAS,EAAE,gBAAgB;AAC5B,qBAAA,EAAA,QAAA,EAAA,q0BAAA,EAAA,MAAA,EAAA,CAAA,i7BAAA,CAAA,EAAA;;;AE5BH;;AAEG;;;;"}
@@ -20,7 +20,7 @@ class BsSchedulerComponent {
20
20
  this.selectedEvent = model(null, ...(ngDevMode ? [{ debugName: "selectedEvent" }] : /* istanbul ignore next */ []));
21
21
  this.selectedRange = model(null, ...(ngDevMode ? [{ debugName: "selectedRange" }] : /* istanbul ignore next */ []));
22
22
  // Output signals (events)
23
- this.eventClick = output();
23
+ this.eventSelected = output();
24
24
  this.eventDblClick = output();
25
25
  this.eventCreate = output();
26
26
  this.eventUpdate = output();
@@ -28,6 +28,7 @@ class BsSchedulerComponent {
28
28
  this.dateClick = output();
29
29
  this.dateSelect = output();
30
30
  this.viewChange = output();
31
+ this.selectionChange = output();
31
32
  // Computed signals
32
33
  this.currentWeekStart = computed(() => {
33
34
  const d = new Date(this.date());
@@ -110,8 +111,8 @@ class BsSchedulerComponent {
110
111
  el.addEventListener(type, listener);
111
112
  this.eventListeners.push({ type, listener });
112
113
  };
113
- addListener('event-click', (e) => {
114
- this.eventClick.emit(e.detail);
114
+ addListener('event-selected', (e) => {
115
+ this.eventSelected.emit(e.detail);
115
116
  this.selectedEvent.set(e.detail.event);
116
117
  });
117
118
  addListener('event-dblclick', (e) => {
@@ -137,7 +138,9 @@ class BsSchedulerComponent {
137
138
  this.viewChange.emit(e.detail);
138
139
  });
139
140
  addListener('selection-change', (e) => {
141
+ this.selectionChange.emit(e.detail);
140
142
  this.selectedEvent.set(e.detail.selectedEvent);
143
+ this.selectedRange.set(e.detail.range);
141
144
  });
142
145
  }
143
146
  removeEventListeners() {
@@ -180,6 +183,14 @@ class BsSchedulerComponent {
180
183
  changeView(view) {
181
184
  this.schedulerRef()?.nativeElement?.changeView(view);
182
185
  }
186
+ /**
187
+ * Clear the time-range selection and the focused-cell selection. Call this
188
+ * from your `(eventCreate)` handler if you want the post-create selection
189
+ * cleared — the scheduler no longer auto-clears (PRD: scheduler-controlled-selection).
190
+ */
191
+ clearSelection() {
192
+ this.schedulerRef()?.nativeElement?.clearSelection();
193
+ }
183
194
  /**
184
195
  * Add an event
185
196
  */
@@ -211,12 +222,12 @@ class BsSchedulerComponent {
211
222
  this.schedulerRef()?.nativeElement?.refetchEvents();
212
223
  }
213
224
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsSchedulerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
214
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.11", type: BsSchedulerComponent, isStandalone: true, selector: "bs-scheduler", inputs: { view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: false, transformFunction: null }, date: { classPropertyName: "date", publicName: "date", isSignal: true, isRequired: false, transformFunction: null }, events: { classPropertyName: "events", publicName: "events", isSignal: true, isRequired: false, transformFunction: null }, resources: { classPropertyName: "resources", publicName: "resources", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, selectedEvent: { classPropertyName: "selectedEvent", publicName: "selectedEvent", isSignal: true, isRequired: false, transformFunction: null }, selectedRange: { classPropertyName: "selectedRange", publicName: "selectedRange", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedEvent: "selectedEventChange", selectedRange: "selectedRangeChange", eventClick: "eventClick", eventDblClick: "eventDblClick", eventCreate: "eventCreate", eventUpdate: "eventUpdate", eventDelete: "eventDelete", dateClick: "dateClick", dateSelect: "dateSelect", viewChange: "viewChange" }, viewQueries: [{ propertyName: "schedulerRef", first: true, predicate: ["scheduler"], descendants: true, isSignal: true }], ngImport: i0, template: "<mp-scheduler #scheduler></mp-scheduler>\n", styles: [":host{display:block;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
225
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.11", type: BsSchedulerComponent, isStandalone: true, selector: "bs-scheduler", inputs: { view: { classPropertyName: "view", publicName: "view", isSignal: true, isRequired: false, transformFunction: null }, date: { classPropertyName: "date", publicName: "date", isSignal: true, isRequired: false, transformFunction: null }, events: { classPropertyName: "events", publicName: "events", isSignal: true, isRequired: false, transformFunction: null }, resources: { classPropertyName: "resources", publicName: "resources", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, selectedEvent: { classPropertyName: "selectedEvent", publicName: "selectedEvent", isSignal: true, isRequired: false, transformFunction: null }, selectedRange: { classPropertyName: "selectedRange", publicName: "selectedRange", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectedEvent: "selectedEventChange", selectedRange: "selectedRangeChange", eventSelected: "eventSelected", eventDblClick: "eventDblClick", eventCreate: "eventCreate", eventUpdate: "eventUpdate", eventDelete: "eventDelete", dateClick: "dateClick", dateSelect: "dateSelect", viewChange: "viewChange", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "schedulerRef", first: true, predicate: ["scheduler"], descendants: true, isSignal: true }], ngImport: i0, template: "<mp-scheduler #scheduler></mp-scheduler>\n", styles: [":host{display:block;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
215
226
  }
216
227
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsSchedulerComponent, decorators: [{
217
228
  type: Component,
218
229
  args: [{ selector: 'bs-scheduler', changeDetection: ChangeDetectionStrategy.OnPush, schemas: [CUSTOM_ELEMENTS_SCHEMA], template: "<mp-scheduler #scheduler></mp-scheduler>\n", styles: [":host{display:block;height:100%}\n"] }]
219
- }], propDecorators: { schedulerRef: [{ type: i0.ViewChild, args: ['scheduler', { isSignal: true }] }], view: [{ type: i0.Input, args: [{ isSignal: true, alias: "view", required: false }] }], date: [{ type: i0.Input, args: [{ isSignal: true, alias: "date", required: false }] }], events: [{ type: i0.Input, args: [{ isSignal: true, alias: "events", required: false }] }], resources: [{ type: i0.Input, args: [{ isSignal: true, alias: "resources", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], selectedEvent: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedEvent", required: false }] }, { type: i0.Output, args: ["selectedEventChange"] }], selectedRange: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedRange", required: false }] }, { type: i0.Output, args: ["selectedRangeChange"] }], eventClick: [{ type: i0.Output, args: ["eventClick"] }], eventDblClick: [{ type: i0.Output, args: ["eventDblClick"] }], eventCreate: [{ type: i0.Output, args: ["eventCreate"] }], eventUpdate: [{ type: i0.Output, args: ["eventUpdate"] }], eventDelete: [{ type: i0.Output, args: ["eventDelete"] }], dateClick: [{ type: i0.Output, args: ["dateClick"] }], dateSelect: [{ type: i0.Output, args: ["dateSelect"] }], viewChange: [{ type: i0.Output, args: ["viewChange"] }] } });
230
+ }], propDecorators: { schedulerRef: [{ type: i0.ViewChild, args: ['scheduler', { isSignal: true }] }], view: [{ type: i0.Input, args: [{ isSignal: true, alias: "view", required: false }] }], date: [{ type: i0.Input, args: [{ isSignal: true, alias: "date", required: false }] }], events: [{ type: i0.Input, args: [{ isSignal: true, alias: "events", required: false }] }], resources: [{ type: i0.Input, args: [{ isSignal: true, alias: "resources", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], selectedEvent: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedEvent", required: false }] }, { type: i0.Output, args: ["selectedEventChange"] }], selectedRange: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedRange", required: false }] }, { type: i0.Output, args: ["selectedRangeChange"] }], eventSelected: [{ type: i0.Output, args: ["eventSelected"] }], eventDblClick: [{ type: i0.Output, args: ["eventDblClick"] }], eventCreate: [{ type: i0.Output, args: ["eventCreate"] }], eventUpdate: [{ type: i0.Output, args: ["eventUpdate"] }], eventDelete: [{ type: i0.Output, args: ["eventDelete"] }], dateClick: [{ type: i0.Output, args: ["dateClick"] }], dateSelect: [{ type: i0.Output, args: ["dateSelect"] }], viewChange: [{ type: i0.Output, args: ["viewChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }] } });
220
231
 
221
232
  /**
222
233
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-scheduler.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/scheduler/src/components/scheduler/scheduler.component.ts","../../../../libs/mintplayer-ng-bootstrap/scheduler/src/components/scheduler/scheduler.component.html","../../../../libs/mintplayer-ng-bootstrap/scheduler/mintplayer-ng-bootstrap-scheduler.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n viewChild,\n AfterViewInit,\n OnDestroy,\n ChangeDetectionStrategy,\n CUSTOM_ELEMENTS_SCHEMA,\n input,\n output,\n model,\n computed,\n effect,\n signal,\n Injector,\n inject,\n runInInjectionContext,\n} from '@angular/core';\n\nimport {\n ViewType,\n SchedulerEvent,\n Resource,\n ResourceGroup,\n SchedulerOptions,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\n\n// Import the web component to ensure it gets registered\nimport '@mintplayer/ng-bootstrap/web-components/scheduler';\n\n/**\n * Interface for the mp-scheduler web component element\n */\ninterface MpSchedulerElement extends HTMLElement {\n view: ViewType;\n date: Date;\n events: SchedulerEvent[];\n resources: (Resource | ResourceGroup)[];\n options: Partial<SchedulerOptions>;\n selectedEvent: SchedulerEvent | null;\n selectedRange: { start: Date; end: Date } | null;\n next(): void;\n prev(): void;\n today(): void;\n gotoDate(date: Date): void;\n changeView(view: ViewType): void;\n addEvent(event: SchedulerEvent): void;\n updateEvent(event: SchedulerEvent): void;\n removeEvent(eventId: string): void;\n getEventById(eventId: string): SchedulerEvent | null;\n refetchEvents(): void;\n}\n\n/**\n * Event click event detail\n */\nexport interface SchedulerEventClickEvent {\n event: SchedulerEvent;\n originalEvent?: Event;\n}\n\n/**\n * Event create event detail\n */\nexport interface SchedulerEventCreateEvent {\n event: SchedulerEvent;\n resource?: Resource;\n originalEvent?: Event;\n}\n\n/**\n * Event update event detail\n */\nexport interface SchedulerEventUpdateEvent {\n event: SchedulerEvent;\n oldEvent: SchedulerEvent;\n originalEvent?: Event;\n}\n\n/**\n * Event delete event detail\n */\nexport interface SchedulerEventDeleteEvent {\n event: SchedulerEvent;\n originalEvent?: Event;\n}\n\n/**\n * Date click event detail\n */\nexport interface DateClickEvent {\n date: Date;\n resource?: Resource;\n originalEvent?: Event;\n}\n\n/**\n * Date select event detail\n */\nexport interface DateSelectEvent {\n start: Date;\n end: Date;\n resource?: Resource;\n originalEvent?: Event;\n}\n\n/**\n * View change event detail\n */\nexport interface ViewChangeEvent {\n view: ViewType;\n date: Date;\n}\n\n/**\n * Angular wrapper for the mp-scheduler web component using signals\n */\n@Component({\n selector: 'bs-scheduler',\n templateUrl: './scheduler.component.html',\n styleUrls: ['./scheduler.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class BsSchedulerComponent implements AfterViewInit, OnDestroy {\n private readonly injector = inject(Injector);\n\n private readonly schedulerRef = viewChild.required<ElementRef<MpSchedulerElement>>('scheduler');\n\n // Input signals\n readonly view = input<ViewType>('week');\n readonly date = input<Date>(new Date());\n readonly events = input<SchedulerEvent[]>([]);\n readonly resources = input<(Resource | ResourceGroup)[]>([]);\n readonly options = input<Partial<SchedulerOptions>>({});\n\n // Two-way binding model signals\n readonly selectedEvent = model<SchedulerEvent | null>(null);\n readonly selectedRange = model<{ start: Date; end: Date } | null>(null);\n\n // Output signals (events)\n readonly eventClick = output<SchedulerEventClickEvent>();\n readonly eventDblClick = output<SchedulerEventClickEvent>();\n readonly eventCreate = output<SchedulerEventCreateEvent>();\n readonly eventUpdate = output<SchedulerEventUpdateEvent>();\n readonly eventDelete = output<SchedulerEventDeleteEvent>();\n readonly dateClick = output<DateClickEvent>();\n readonly dateSelect = output<DateSelectEvent>();\n readonly viewChange = output<ViewChangeEvent>();\n\n // Computed signals\n readonly currentWeekStart = computed(() => {\n const d = new Date(this.date());\n const day = d.getDay();\n const diff = (day === 0 ? 6 : day - 1); // Adjust for Monday start\n d.setDate(d.getDate() - diff);\n d.setHours(0, 0, 0, 0);\n return d;\n });\n\n readonly currentWeekEnd = computed(() => {\n const start = this.currentWeekStart();\n const end = new Date(start);\n end.setDate(end.getDate() + 6);\n end.setHours(23, 59, 59, 999);\n return end;\n });\n\n readonly visibleEvents = computed(() => {\n const start = this.currentWeekStart();\n const end = this.currentWeekEnd();\n return this.events().filter(\n (e) => e.start < end && e.end > start\n );\n });\n\n // Internal state\n private readonly initialized = signal(false);\n private eventListeners: Array<{ type: string; listener: EventListener }> = [];\n\n ngAfterViewInit(): void {\n runInInjectionContext(this.injector, () => {\n // Set up effects to sync inputs to web component\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.view = this.view();\n }\n });\n\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.date = this.date();\n }\n });\n\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.events = this.events();\n }\n });\n\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.resources = this.resources();\n }\n });\n\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.options = this.options();\n }\n });\n\n // Sync selectedEvent to web component\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.selectedEvent = this.selectedEvent();\n }\n });\n });\n\n // Set up event listeners\n this.setupEventListeners();\n this.initialized.set(true);\n }\n\n ngOnDestroy(): void {\n this.removeEventListeners();\n }\n\n private setupEventListeners(): void {\n const el = this.schedulerRef()?.nativeElement;\n if (!el) return;\n\n const addListener = (type: string, handler: (e: CustomEvent) => void) => {\n const listener = (e: Event) => handler(e as CustomEvent);\n el.addEventListener(type, listener);\n this.eventListeners.push({ type, listener });\n };\n\n addListener('event-click', (e) => {\n this.eventClick.emit(e.detail);\n this.selectedEvent.set(e.detail.event);\n });\n\n addListener('event-dblclick', (e) => {\n this.eventDblClick.emit(e.detail);\n });\n\n addListener('event-create', (e) => {\n this.eventCreate.emit(e.detail);\n });\n\n addListener('event-update', (e) => {\n this.eventUpdate.emit(e.detail);\n });\n\n addListener('event-delete', (e) => {\n this.eventDelete.emit(e.detail);\n });\n\n addListener('date-click', (e) => {\n this.dateClick.emit(e.detail);\n });\n\n addListener('date-select', (e) => {\n this.dateSelect.emit(e.detail);\n this.selectedRange.set({ start: e.detail.start, end: e.detail.end });\n });\n\n addListener('view-change', (e) => {\n this.viewChange.emit(e.detail);\n });\n\n addListener('selection-change', (e) => {\n this.selectedEvent.set(e.detail.selectedEvent);\n });\n }\n\n private removeEventListeners(): void {\n const el = this.schedulerRef()?.nativeElement;\n if (!el) return;\n\n for (const { type, listener } of this.eventListeners) {\n el.removeEventListener(type, listener);\n }\n this.eventListeners = [];\n }\n\n // Public API methods (delegate to web component)\n\n /**\n * Navigate to next period\n */\n next(): void {\n this.schedulerRef()?.nativeElement?.next();\n }\n\n /**\n * Navigate to previous period\n */\n prev(): void {\n this.schedulerRef()?.nativeElement?.prev();\n }\n\n /**\n * Navigate to today\n */\n today(): void {\n this.schedulerRef()?.nativeElement?.today();\n }\n\n /**\n * Navigate to a specific date\n */\n gotoDate(date: Date): void {\n this.schedulerRef()?.nativeElement?.gotoDate(date);\n }\n\n /**\n * Change the current view\n */\n changeView(view: ViewType): void {\n this.schedulerRef()?.nativeElement?.changeView(view);\n }\n\n /**\n * Add an event\n */\n addEvent(event: SchedulerEvent): void {\n this.schedulerRef()?.nativeElement?.addEvent(event);\n }\n\n /**\n * Update an event\n */\n updateEvent(event: SchedulerEvent): void {\n this.schedulerRef()?.nativeElement?.updateEvent(event);\n }\n\n /**\n * Remove an event\n */\n removeEvent(eventId: string): void {\n this.schedulerRef()?.nativeElement?.removeEvent(eventId);\n }\n\n /**\n * Get an event by ID\n */\n getEventById(eventId: string): SchedulerEvent | null {\n return this.schedulerRef()?.nativeElement?.getEventById(eventId) ?? null;\n }\n\n /**\n * Refetch/refresh events\n */\n refetchEvents(): void {\n this.schedulerRef()?.nativeElement?.refetchEvents();\n }\n}\n","<mp-scheduler #scheduler></mp-scheduler>\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-scheduler.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/scheduler/src/components/scheduler/scheduler.component.ts","../../../../libs/mintplayer-ng-bootstrap/scheduler/src/components/scheduler/scheduler.component.html","../../../../libs/mintplayer-ng-bootstrap/scheduler/mintplayer-ng-bootstrap-scheduler.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n viewChild,\n AfterViewInit,\n OnDestroy,\n ChangeDetectionStrategy,\n CUSTOM_ELEMENTS_SCHEMA,\n input,\n output,\n model,\n computed,\n effect,\n signal,\n Injector,\n inject,\n runInInjectionContext,\n} from '@angular/core';\n\nimport {\n ViewType,\n SchedulerEvent,\n Resource,\n ResourceGroup,\n SchedulerOptions,\n} from '@mintplayer/ng-bootstrap/web-components/scheduler-core';\n\n// Import the web component to ensure it gets registered\nimport '@mintplayer/ng-bootstrap/web-components/scheduler';\n\n/**\n * Interface for the mp-scheduler web component element\n */\ninterface MpSchedulerElement extends HTMLElement {\n view: ViewType;\n date: Date;\n events: SchedulerEvent[];\n resources: (Resource | ResourceGroup)[];\n options: Partial<SchedulerOptions>;\n selectedEvent: SchedulerEvent | null;\n selectedRange: { start: Date; end: Date } | null;\n next(): void;\n prev(): void;\n today(): void;\n gotoDate(date: Date): void;\n changeView(view: ViewType): void;\n clearSelection(): void;\n addEvent(event: SchedulerEvent): void;\n updateEvent(event: SchedulerEvent): void;\n removeEvent(eventId: string): void;\n getEventById(eventId: string): SchedulerEvent | null;\n refetchEvents(): void;\n}\n\n/**\n * Event-selected event detail. Fires on mouse click and on keyboard Tab\n * landing on an event (PRD scheduler-keyboard-grid-nav D3 — renamed from\n * `event-click` because keyboard now triggers the same notification).\n */\nexport interface SchedulerEventSelectedEvent {\n event: SchedulerEvent;\n originalEvent?: Event;\n}\n\n/**\n * Event create *request* event. Per PRD scheduler-controlled-selection, the\n * `mp-scheduler` web-component no longer constructs an event itself on drag-end\n * or `Enter` — it emits the selected range and the consumer decides whether\n * to push a `SchedulerEvent` into its `[events]` input.\n */\nexport interface SchedulerEventCreateEvent {\n /** The selected time range. */\n range: { start: Date; end: Date };\n /** Resource the request targets (timeline view only). */\n resourceId?: string;\n /** View that produced the request. */\n view: ViewType;\n originalEvent?: Event;\n}\n\n/**\n * Selection-change event. Fires on every transition — including the\n * transition to an empty selection. `selectedEvent` and `range` are\n * independent dimensions of the selection state.\n */\nexport interface SchedulerSelectionChangeEvent {\n selectedEvent: SchedulerEvent | null;\n range: { start: Date; end: Date } | null;\n view: ViewType;\n resourceId?: string;\n}\n\n/**\n * Event update event detail\n */\nexport interface SchedulerEventUpdateEvent {\n event: SchedulerEvent;\n oldEvent: SchedulerEvent;\n originalEvent?: Event;\n}\n\n/**\n * Event delete event detail\n */\nexport interface SchedulerEventDeleteEvent {\n event: SchedulerEvent;\n originalEvent?: Event;\n}\n\n/**\n * Date click event detail\n */\nexport interface DateClickEvent {\n date: Date;\n resource?: Resource;\n originalEvent?: Event;\n}\n\n/**\n * Date select event detail\n */\nexport interface DateSelectEvent {\n start: Date;\n end: Date;\n resource?: Resource;\n originalEvent?: Event;\n}\n\n/**\n * View change event detail\n */\nexport interface ViewChangeEvent {\n view: ViewType;\n date: Date;\n}\n\n/**\n * Angular wrapper for the mp-scheduler web component using signals\n */\n@Component({\n selector: 'bs-scheduler',\n templateUrl: './scheduler.component.html',\n styleUrls: ['./scheduler.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class BsSchedulerComponent implements AfterViewInit, OnDestroy {\n private readonly injector = inject(Injector);\n\n private readonly schedulerRef = viewChild.required<ElementRef<MpSchedulerElement>>('scheduler');\n\n // Input signals\n readonly view = input<ViewType>('week');\n readonly date = input<Date>(new Date());\n readonly events = input<SchedulerEvent[]>([]);\n readonly resources = input<(Resource | ResourceGroup)[]>([]);\n readonly options = input<Partial<SchedulerOptions>>({});\n\n // Two-way binding model signals\n readonly selectedEvent = model<SchedulerEvent | null>(null);\n readonly selectedRange = model<{ start: Date; end: Date } | null>(null);\n\n // Output signals (events)\n readonly eventSelected = output<SchedulerEventSelectedEvent>();\n readonly eventDblClick = output<SchedulerEventSelectedEvent>();\n readonly eventCreate = output<SchedulerEventCreateEvent>();\n readonly eventUpdate = output<SchedulerEventUpdateEvent>();\n readonly eventDelete = output<SchedulerEventDeleteEvent>();\n readonly dateClick = output<DateClickEvent>();\n readonly dateSelect = output<DateSelectEvent>();\n readonly viewChange = output<ViewChangeEvent>();\n readonly selectionChange = output<SchedulerSelectionChangeEvent>();\n\n // Computed signals\n readonly currentWeekStart = computed(() => {\n const d = new Date(this.date());\n const day = d.getDay();\n const diff = (day === 0 ? 6 : day - 1); // Adjust for Monday start\n d.setDate(d.getDate() - diff);\n d.setHours(0, 0, 0, 0);\n return d;\n });\n\n readonly currentWeekEnd = computed(() => {\n const start = this.currentWeekStart();\n const end = new Date(start);\n end.setDate(end.getDate() + 6);\n end.setHours(23, 59, 59, 999);\n return end;\n });\n\n readonly visibleEvents = computed(() => {\n const start = this.currentWeekStart();\n const end = this.currentWeekEnd();\n return this.events().filter(\n (e) => e.start < end && e.end > start\n );\n });\n\n // Internal state\n private readonly initialized = signal(false);\n private eventListeners: Array<{ type: string; listener: EventListener }> = [];\n\n ngAfterViewInit(): void {\n runInInjectionContext(this.injector, () => {\n // Set up effects to sync inputs to web component\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.view = this.view();\n }\n });\n\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.date = this.date();\n }\n });\n\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.events = this.events();\n }\n });\n\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.resources = this.resources();\n }\n });\n\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.options = this.options();\n }\n });\n\n // Sync selectedEvent to web component\n effect(() => {\n const el = this.schedulerRef()?.nativeElement;\n if (el) {\n el.selectedEvent = this.selectedEvent();\n }\n });\n });\n\n // Set up event listeners\n this.setupEventListeners();\n this.initialized.set(true);\n }\n\n ngOnDestroy(): void {\n this.removeEventListeners();\n }\n\n private setupEventListeners(): void {\n const el = this.schedulerRef()?.nativeElement;\n if (!el) return;\n\n const addListener = (type: string, handler: (e: CustomEvent) => void) => {\n const listener = (e: Event) => handler(e as CustomEvent);\n el.addEventListener(type, listener);\n this.eventListeners.push({ type, listener });\n };\n\n addListener('event-selected', (e) => {\n this.eventSelected.emit(e.detail);\n this.selectedEvent.set(e.detail.event);\n });\n\n addListener('event-dblclick', (e) => {\n this.eventDblClick.emit(e.detail);\n });\n\n addListener('event-create', (e) => {\n this.eventCreate.emit(e.detail);\n });\n\n addListener('event-update', (e) => {\n this.eventUpdate.emit(e.detail);\n });\n\n addListener('event-delete', (e) => {\n this.eventDelete.emit(e.detail);\n });\n\n addListener('date-click', (e) => {\n this.dateClick.emit(e.detail);\n });\n\n addListener('date-select', (e) => {\n this.dateSelect.emit(e.detail);\n this.selectedRange.set({ start: e.detail.start, end: e.detail.end });\n });\n\n addListener('view-change', (e) => {\n this.viewChange.emit(e.detail);\n });\n\n addListener('selection-change', (e) => {\n this.selectionChange.emit(e.detail);\n this.selectedEvent.set(e.detail.selectedEvent);\n this.selectedRange.set(e.detail.range);\n });\n }\n\n private removeEventListeners(): void {\n const el = this.schedulerRef()?.nativeElement;\n if (!el) return;\n\n for (const { type, listener } of this.eventListeners) {\n el.removeEventListener(type, listener);\n }\n this.eventListeners = [];\n }\n\n // Public API methods (delegate to web component)\n\n /**\n * Navigate to next period\n */\n next(): void {\n this.schedulerRef()?.nativeElement?.next();\n }\n\n /**\n * Navigate to previous period\n */\n prev(): void {\n this.schedulerRef()?.nativeElement?.prev();\n }\n\n /**\n * Navigate to today\n */\n today(): void {\n this.schedulerRef()?.nativeElement?.today();\n }\n\n /**\n * Navigate to a specific date\n */\n gotoDate(date: Date): void {\n this.schedulerRef()?.nativeElement?.gotoDate(date);\n }\n\n /**\n * Change the current view\n */\n changeView(view: ViewType): void {\n this.schedulerRef()?.nativeElement?.changeView(view);\n }\n\n /**\n * Clear the time-range selection and the focused-cell selection. Call this\n * from your `(eventCreate)` handler if you want the post-create selection\n * cleared — the scheduler no longer auto-clears (PRD: scheduler-controlled-selection).\n */\n clearSelection(): void {\n this.schedulerRef()?.nativeElement?.clearSelection();\n }\n\n /**\n * Add an event\n */\n addEvent(event: SchedulerEvent): void {\n this.schedulerRef()?.nativeElement?.addEvent(event);\n }\n\n /**\n * Update an event\n */\n updateEvent(event: SchedulerEvent): void {\n this.schedulerRef()?.nativeElement?.updateEvent(event);\n }\n\n /**\n * Remove an event\n */\n removeEvent(eventId: string): void {\n this.schedulerRef()?.nativeElement?.removeEvent(eventId);\n }\n\n /**\n * Get an event by ID\n */\n getEventById(eventId: string): SchedulerEvent | null {\n return this.schedulerRef()?.nativeElement?.getEventById(eventId) ?? null;\n }\n\n /**\n * Refetch/refresh events\n */\n refetchEvents(): void {\n this.schedulerRef()?.nativeElement?.refetchEvents();\n }\n}\n","<mp-scheduler #scheduler></mp-scheduler>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -103,13 +103,13 @@ class BsScrollspyComponent {
103
103
  }
104
104
  }
105
105
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsScrollspyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
106
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.11", type: BsScrollspyComponent, isStandalone: true, selector: "bs-scrollspy", host: { listeners: { "window:scroll": "onWindowScroll()" } }, queries: [{ propertyName: "directives", predicate: BsScrollspyDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "anchors", predicate: ["anchor"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"spy\">\n <ul class=\"text-muted\">\n @for (dir of directives(); track dir; let i = $index) {\n <li>\n <span [attr.data-index]=\"i\" class=\"cursor-pointer\" [class]=\"'nav' + dir.element.nativeElement.tagName\" [class.fw-bold]=\"activeDirective()?.element === dir.element\" (click)=\"scrollToHeader(dir)\" [title]=\"dir.element.nativeElement.textContent\" #anchor>\n {{ dir.element.nativeElement.textContent }}\n </span>\n </li>\n }\n </ul>\n</div>\n<div class=\"content\">\n <ng-content></ng-content>\n</div>", styles: [":host{display:block}.spy>ul{list-style-type:none;padding-left:0}.spy>ul>li:hover{color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.spy>ul>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(min-width:768px){:host{display:grid;grid-template-areas:\"content toc\";grid-template-columns:auto 200px;grid-template-rows:auto;gap:inherit;grid-area:main}.spy{position:sticky;top:5rem;right:0;z-index:2;height:calc(100vh - 7rem);overflow-y:auto;grid-area:toc}.spy>ul{padding-left:2rem}}.navH2{margin-left:20px}.navH3{margin-left:40px}.navH4{margin-left:60px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
106
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.11", type: BsScrollspyComponent, isStandalone: true, selector: "bs-scrollspy", host: { listeners: { "window:scroll": "onWindowScroll()" } }, queries: [{ propertyName: "directives", predicate: BsScrollspyDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "anchors", predicate: ["anchor"], descendants: true, isSignal: true }], ngImport: i0, template: "<nav class=\"spy\" aria-label=\"Section navigation\">\n <ul class=\"text-muted\">\n @for (dir of directives(); track dir; let i = $index) {\n <li>\n <button type=\"button\"\n [attr.data-index]=\"i\"\n class=\"btn btn-link cursor-pointer p-0 text-start text-decoration-none\"\n [class]=\"'nav' + dir.element.nativeElement.tagName\"\n [class.fw-bold]=\"activeDirective()?.element === dir.element\"\n [attr.aria-current]=\"activeDirective()?.element === dir.element ? 'location' : null\"\n (click)=\"scrollToHeader(dir)\"\n [title]=\"dir.element.nativeElement.textContent\"\n #anchor>\n {{ dir.element.nativeElement.textContent }}\n </button>\n </li>\n }\n </ul>\n</nav>\n<div class=\"content\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{display:block}.spy>ul{list-style-type:none;padding-left:0}.spy>ul>li:hover{color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.spy>ul>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(min-width:768px){:host{display:grid;grid-template-areas:\"content toc\";grid-template-columns:auto 200px;grid-template-rows:auto;gap:inherit;grid-area:main}.spy{position:sticky;top:5rem;right:0;z-index:2;height:calc(100vh - 7rem);overflow-y:auto;grid-area:toc}.spy>ul{padding-left:2rem}}.navH2{margin-left:20px}.navH3{margin-left:40px}.navH4{margin-left:60px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
107
107
  }
108
108
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsScrollspyComponent, decorators: [{
109
109
  type: Component,
110
110
  args: [{ selector: 'bs-scrollspy', changeDetection: ChangeDetectionStrategy.OnPush, host: {
111
111
  '(window:scroll)': 'onWindowScroll()',
112
- }, template: "<div class=\"spy\">\n <ul class=\"text-muted\">\n @for (dir of directives(); track dir; let i = $index) {\n <li>\n <span [attr.data-index]=\"i\" class=\"cursor-pointer\" [class]=\"'nav' + dir.element.nativeElement.tagName\" [class.fw-bold]=\"activeDirective()?.element === dir.element\" (click)=\"scrollToHeader(dir)\" [title]=\"dir.element.nativeElement.textContent\" #anchor>\n {{ dir.element.nativeElement.textContent }}\n </span>\n </li>\n }\n </ul>\n</div>\n<div class=\"content\">\n <ng-content></ng-content>\n</div>", styles: [":host{display:block}.spy>ul{list-style-type:none;padding-left:0}.spy>ul>li:hover{color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.spy>ul>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(min-width:768px){:host{display:grid;grid-template-areas:\"content toc\";grid-template-columns:auto 200px;grid-template-rows:auto;gap:inherit;grid-area:main}.spy{position:sticky;top:5rem;right:0;z-index:2;height:calc(100vh - 7rem);overflow-y:auto;grid-area:toc}.spy>ul{padding-left:2rem}}.navH2{margin-left:20px}.navH3{margin-left:40px}.navH4{margin-left:60px}\n"] }]
112
+ }, template: "<nav class=\"spy\" aria-label=\"Section navigation\">\n <ul class=\"text-muted\">\n @for (dir of directives(); track dir; let i = $index) {\n <li>\n <button type=\"button\"\n [attr.data-index]=\"i\"\n class=\"btn btn-link cursor-pointer p-0 text-start text-decoration-none\"\n [class]=\"'nav' + dir.element.nativeElement.tagName\"\n [class.fw-bold]=\"activeDirective()?.element === dir.element\"\n [attr.aria-current]=\"activeDirective()?.element === dir.element ? 'location' : null\"\n (click)=\"scrollToHeader(dir)\"\n [title]=\"dir.element.nativeElement.textContent\"\n #anchor>\n {{ dir.element.nativeElement.textContent }}\n </button>\n </li>\n }\n </ul>\n</nav>\n<div class=\"content\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{display:block}.spy>ul{list-style-type:none;padding-left:0}.spy>ul>li:hover{color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.spy>ul>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(min-width:768px){:host{display:grid;grid-template-areas:\"content toc\";grid-template-columns:auto 200px;grid-template-rows:auto;gap:inherit;grid-area:main}.spy{position:sticky;top:5rem;right:0;z-index:2;height:calc(100vh - 7rem);overflow-y:auto;grid-area:toc}.spy>ul{padding-left:2rem}}.navH2{margin-left:20px}.navH3{margin-left:40px}.navH4{margin-left:60px}\n"] }]
113
113
  }], ctorParameters: () => [], propDecorators: { directives: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => BsScrollspyDirective), { ...{ descendants: true }, isSignal: true }] }], anchors: [{ type: i0.ViewChildren, args: ['anchor', { isSignal: true }] }] } });
114
114
 
115
115
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mintplayer-ng-bootstrap-scrollspy.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/scrollspy/src/services/scroll-offset/scroll-offset.service.ts","../../../../libs/mintplayer-ng-bootstrap/scrollspy/src/directives/scrollspy.directive.ts","../../../../libs/mintplayer-ng-bootstrap/scrollspy/src/component/scrollspy.component.ts","../../../../libs/mintplayer-ng-bootstrap/scrollspy/src/component/scrollspy.component.html","../../../../libs/mintplayer-ng-bootstrap/scrollspy/mintplayer-ng-bootstrap-scrollspy.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { ExtraOptions, ROUTER_CONFIGURATION } from '@angular/router';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BsScrollOffsetService {\n\n private routerConfig = inject<ExtraOptions>(ROUTER_CONFIGURATION);\n\n getScrollOffset(): [number, number] {\n if (!this.routerConfig.scrollOffset) {\n return [0, 0];\n } else if (Array.isArray(this.routerConfig.scrollOffset)) {\n return this.routerConfig.scrollOffset\n } else {\n return this.routerConfig.scrollOffset();\n }\n }\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[bsScrollspy]',\n})\nexport class BsScrollspyDirective {\n element = inject(ElementRef);\n}\n","import { DOCUMENT } from '@angular/common';\nimport { AfterContentInit, AfterViewInit, ChangeDetectionStrategy, Component, contentChildren, effect, ElementRef, inject, signal, viewChildren } from '@angular/core';\nimport { BsScrollOffsetService } from '../services/scroll-offset/scroll-offset.service';\nimport { BsScrollspyDirective } from '../directives/scrollspy.directive';\n\n@Component({\n selector: 'bs-scrollspy',\n templateUrl: './scrollspy.component.html',\n styleUrls: ['./scrollspy.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:scroll)': 'onWindowScroll()',\n },\n})\nexport class BsScrollspyComponent implements AfterViewInit, AfterContentInit {\n\n private scrollOffsetService = inject(BsScrollOffsetService);\n doc = inject<Document>(DOCUMENT);\n\n private viewInit = signal<boolean>(false);\n private contentInit = signal<boolean>(false);\n\n readonly directives = contentChildren(BsScrollspyDirective, { descendants: true });\n readonly anchors = viewChildren<ElementRef<HTMLSpanElement>>('anchor');\n\n activeDirective = signal<BsScrollspyDirective | null>(null);\n\n constructor() {\n effect(() => {\n const viewInit = this.viewInit();\n const contentInit = this.contentInit();\n if (viewInit && contentInit) {\n this.scrollToCurrentInSpy();\n }\n });\n }\n\n ngAfterViewInit() {\n this.viewInit.set(true);\n }\n\n ngAfterContentInit() {\n this.contentInit.set(true);\n }\n\n onWindowScroll() {\n this.setActiveDirective();\n this.scrollToCurrentInSpy();\n }\n\n setActiveDirective() {\n const offsetY = this.scrollOffsetService.getScrollOffset()[1];\n const allDirectives = this.directives();\n const dirs = allDirectives.filter((d) => d.element.nativeElement.getBoundingClientRect().y < offsetY);\n\n if (allDirectives.length === 0) {\n this.activeDirective.set(null);\n } else if (dirs.length === 0) {\n this.activeDirective.set(allDirectives[0] ?? null);\n } else {\n this.activeDirective.set(dirs[dirs.length - 1]);\n }\n }\n\n scrollToCurrentInSpy() {\n if ((typeof window !== 'undefined') && (window.innerWidth >= 768)) {\n if (this.activeDirective()) {\n const index = this.directives().findIndex((v, i) => v === this.activeDirective());\n const anchor = this.anchors()[index];\n if (anchor && anchor.nativeElement.parentElement) {\n anchor.nativeElement.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n }\n }\n }\n\n scrollToHeader(directive: BsScrollspyDirective) {\n if (typeof window !== 'undefined') {\n const header = directive.element.nativeElement;\n const offsetY = this.scrollOffsetService.getScrollOffset()[1];\n const y = header.getBoundingClientRect().top + window.scrollY - offsetY + 1;\n window.scrollTo({top: y, behavior: 'smooth'});\n }\n }\n}\n","<div class=\"spy\">\n <ul class=\"text-muted\">\n @for (dir of directives(); track dir; let i = $index) {\n <li>\n <span [attr.data-index]=\"i\" class=\"cursor-pointer\" [class]=\"'nav' + dir.element.nativeElement.tagName\" [class.fw-bold]=\"activeDirective()?.element === dir.element\" (click)=\"scrollToHeader(dir)\" [title]=\"dir.element.nativeElement.textContent\" #anchor>\n {{ dir.element.nativeElement.textContent }}\n </span>\n </li>\n }\n </ul>\n</div>\n<div class=\"content\">\n <ng-content></ng-content>\n</div>","/**\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-scrollspy.mjs","sources":["../../../../libs/mintplayer-ng-bootstrap/scrollspy/src/services/scroll-offset/scroll-offset.service.ts","../../../../libs/mintplayer-ng-bootstrap/scrollspy/src/directives/scrollspy.directive.ts","../../../../libs/mintplayer-ng-bootstrap/scrollspy/src/component/scrollspy.component.ts","../../../../libs/mintplayer-ng-bootstrap/scrollspy/src/component/scrollspy.component.html","../../../../libs/mintplayer-ng-bootstrap/scrollspy/mintplayer-ng-bootstrap-scrollspy.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { ExtraOptions, ROUTER_CONFIGURATION } from '@angular/router';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BsScrollOffsetService {\n\n private routerConfig = inject<ExtraOptions>(ROUTER_CONFIGURATION);\n\n getScrollOffset(): [number, number] {\n if (!this.routerConfig.scrollOffset) {\n return [0, 0];\n } else if (Array.isArray(this.routerConfig.scrollOffset)) {\n return this.routerConfig.scrollOffset\n } else {\n return this.routerConfig.scrollOffset();\n }\n }\n}\n","import { Directive, ElementRef, inject } from '@angular/core';\n\n@Directive({\n selector: '[bsScrollspy]',\n})\nexport class BsScrollspyDirective {\n element = inject(ElementRef);\n}\n","import { DOCUMENT } from '@angular/common';\nimport { AfterContentInit, AfterViewInit, ChangeDetectionStrategy, Component, contentChildren, effect, ElementRef, inject, signal, viewChildren } from '@angular/core';\nimport { BsScrollOffsetService } from '../services/scroll-offset/scroll-offset.service';\nimport { BsScrollspyDirective } from '../directives/scrollspy.directive';\n\n@Component({\n selector: 'bs-scrollspy',\n templateUrl: './scrollspy.component.html',\n styleUrls: ['./scrollspy.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(window:scroll)': 'onWindowScroll()',\n },\n})\nexport class BsScrollspyComponent implements AfterViewInit, AfterContentInit {\n\n private scrollOffsetService = inject(BsScrollOffsetService);\n doc = inject<Document>(DOCUMENT);\n\n private viewInit = signal<boolean>(false);\n private contentInit = signal<boolean>(false);\n\n readonly directives = contentChildren(BsScrollspyDirective, { descendants: true });\n readonly anchors = viewChildren<ElementRef<HTMLButtonElement>>('anchor');\n\n activeDirective = signal<BsScrollspyDirective | null>(null);\n\n constructor() {\n effect(() => {\n const viewInit = this.viewInit();\n const contentInit = this.contentInit();\n if (viewInit && contentInit) {\n this.scrollToCurrentInSpy();\n }\n });\n }\n\n ngAfterViewInit() {\n this.viewInit.set(true);\n }\n\n ngAfterContentInit() {\n this.contentInit.set(true);\n }\n\n onWindowScroll() {\n this.setActiveDirective();\n this.scrollToCurrentInSpy();\n }\n\n setActiveDirective() {\n const offsetY = this.scrollOffsetService.getScrollOffset()[1];\n const allDirectives = this.directives();\n const dirs = allDirectives.filter((d) => d.element.nativeElement.getBoundingClientRect().y < offsetY);\n\n if (allDirectives.length === 0) {\n this.activeDirective.set(null);\n } else if (dirs.length === 0) {\n this.activeDirective.set(allDirectives[0] ?? null);\n } else {\n this.activeDirective.set(dirs[dirs.length - 1]);\n }\n }\n\n scrollToCurrentInSpy() {\n if ((typeof window !== 'undefined') && (window.innerWidth >= 768)) {\n if (this.activeDirective()) {\n const index = this.directives().findIndex((v, i) => v === this.activeDirective());\n const anchor = this.anchors()[index];\n if (anchor && anchor.nativeElement.parentElement) {\n anchor.nativeElement.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n }\n }\n }\n }\n\n scrollToHeader(directive: BsScrollspyDirective) {\n if (typeof window !== 'undefined') {\n const header = directive.element.nativeElement;\n const offsetY = this.scrollOffsetService.getScrollOffset()[1];\n const y = header.getBoundingClientRect().top + window.scrollY - offsetY + 1;\n window.scrollTo({top: y, behavior: 'smooth'});\n }\n }\n}\n","<nav class=\"spy\" aria-label=\"Section navigation\">\n <ul class=\"text-muted\">\n @for (dir of directives(); track dir; let i = $index) {\n <li>\n <button type=\"button\"\n [attr.data-index]=\"i\"\n class=\"btn btn-link cursor-pointer p-0 text-start text-decoration-none\"\n [class]=\"'nav' + dir.element.nativeElement.tagName\"\n [class.fw-bold]=\"activeDirective()?.element === dir.element\"\n [attr.aria-current]=\"activeDirective()?.element === dir.element ? 'location' : null\"\n (click)=\"scrollToHeader(dir)\"\n [title]=\"dir.element.nativeElement.textContent\"\n #anchor>\n {{ dir.element.nativeElement.textContent }}\n </button>\n </li>\n }\n </ul>\n</nav>\n<div class=\"content\">\n <ng-content></ng-content>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { NgTemplateOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, signal, viewChild, model, output, effect, ChangeDetectionStrategy, Component, TemplateRef, Directive, input } from '@angular/core';
3
+ import { inject, signal, viewChild, model, input, output, effect, ChangeDetectionStrategy, Component, TemplateRef, Directive } from '@angular/core';
4
4
  import * as i1 from '@angular/forms';
5
5
  import { FormsModule } from '@angular/forms';
6
6
  import { Color } from '@mintplayer/ng-bootstrap';
7
+ import { BsLiveAnnouncerService } from '@mintplayer/ng-bootstrap/a11y';
7
8
  import { BsFormComponent } from '@mintplayer/ng-bootstrap/form';
8
9
  import { BsHasOverlayComponent } from '@mintplayer/ng-bootstrap/has-overlay';
9
10
  import { BsDropdownDirective, BsDropdownToggleDirective, BsDropdownMenuDirective } from '@mintplayer/ng-bootstrap/dropdown';
@@ -18,6 +19,7 @@ class BsSearchboxComponent {
18
19
  constructor() {
19
20
  this.bsForm = inject(BsFormComponent, { optional: true });
20
21
  this.sanitizer = inject(DomSanitizer);
22
+ this.announcer = inject(BsLiveAnnouncerService);
21
23
  this.caretUpFill = signal(undefined, ...(ngDevMode ? [{ debugName: "caretUpFill" }] : /* istanbul ignore next */ []));
22
24
  this.caretDownFill = signal(undefined, ...(ngDevMode ? [{ debugName: "caretDownFill" }] : /* istanbul ignore next */ []));
23
25
  this.colors = Color;
@@ -26,12 +28,17 @@ class BsSearchboxComponent {
26
28
  this.isOpen = model(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
27
29
  this.selectedItem = model(undefined, ...(ngDevMode ? [{ debugName: "selectedItem" }] : /* istanbul ignore next */ []));
28
30
  this.searchterm = model('', ...(ngDevMode ? [{ debugName: "searchterm" }] : /* istanbul ignore next */ []));
31
+ this.ariaLabel = input('Search', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
29
32
  this.suggestions = model([], ...(ngDevMode ? [{ debugName: "suggestions" }] : /* istanbul ignore next */ []));
30
33
  this.suggestionTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "suggestionTemplate" }] : /* istanbul ignore next */ []));
31
34
  this.enterSearchtermTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "enterSearchtermTemplate" }] : /* istanbul ignore next */ []));
32
35
  this.noResultsTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "noResultsTemplate" }] : /* istanbul ignore next */ []));
36
+ this.noResultsAnnouncement = input('No results found', ...(ngDevMode ? [{ debugName: "noResultsAnnouncement" }] : /* istanbul ignore next */ []));
37
+ this.resultsAnnouncementSingular = input('1 result found', ...(ngDevMode ? [{ debugName: "resultsAnnouncementSingular" }] : /* istanbul ignore next */ []));
38
+ this.resultsAnnouncementPlural = input((count) => `${count} results found`, ...(ngDevMode ? [{ debugName: "resultsAnnouncementPlural" }] : /* istanbul ignore next */ []));
33
39
  this.provideSuggestions = output();
34
40
  this.debouncedSearchterm = signal('', ...(ngDevMode ? [{ debugName: "debouncedSearchterm" }] : /* istanbul ignore next */ []));
41
+ this.requestInFlight = false;
35
42
  if (!this.bsForm) {
36
43
  throw '<bs-searchbox> must be inside a <bs-form>';
37
44
  }
@@ -40,9 +47,10 @@ class BsSearchboxComponent {
40
47
  clearTimeout(this.debounceTimeout);
41
48
  this.debounceTimeout = setTimeout(() => {
42
49
  if (searchterm === '') {
43
- // clear suggestions - will be handled by the template
50
+ this.requestInFlight = false;
44
51
  }
45
52
  else {
53
+ this.requestInFlight = true;
46
54
  this.isBusy.set(true);
47
55
  this.provideSuggestions.emit(searchterm);
48
56
  }
@@ -52,6 +60,10 @@ class BsSearchboxComponent {
52
60
  const suggestions = this.suggestions();
53
61
  if (suggestions) {
54
62
  this.isBusy.set(false);
63
+ if (this.requestInFlight) {
64
+ this.requestInFlight = false;
65
+ this.announceResults(suggestions.length);
66
+ }
55
67
  }
56
68
  });
57
69
  effect(() => {
@@ -70,6 +82,17 @@ class BsSearchboxComponent {
70
82
  ngOnDestroy() {
71
83
  clearTimeout(this.debounceTimeout);
72
84
  }
85
+ announceResults(count) {
86
+ if (count === 0) {
87
+ this.announcer.announce(this.noResultsAnnouncement());
88
+ }
89
+ else if (count === 1) {
90
+ this.announcer.announce(this.resultsAnnouncementSingular());
91
+ }
92
+ else {
93
+ this.announcer.announce(this.resultsAnnouncementPlural()(count));
94
+ }
95
+ }
73
96
  onSearchtermChange(searchterm) {
74
97
  this.searchterm.set(searchterm);
75
98
  }
@@ -79,7 +102,7 @@ class BsSearchboxComponent {
79
102
  this.searchterm.set('');
80
103
  }
81
104
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsSearchboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
82
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.11", type: BsSearchboxComponent, isStandalone: true, selector: "bs-searchbox", inputs: { isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, selectedItem: { classPropertyName: "selectedItem", publicName: "selectedItem", isSignal: true, isRequired: false, transformFunction: null }, searchterm: { classPropertyName: "searchterm", publicName: "searchterm", isSignal: true, isRequired: false, transformFunction: null }, suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", selectedItem: "selectedItemChange", searchterm: "searchtermChange", suggestions: "suggestionsChange", provideSuggestions: "provideSuggestions" }, viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textbox"], descendants: true, isSignal: true }], ngImport: i0, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [(isOpen)]=\"isOpen\" [hasBackdrop]=\"false\" [sameDropdownWidth]=\"true\">\n <button [color]=\"colors.primary\" class=\"d-flex w-100\" bsDropdownToggle>\n <div class=\"flex-grow-1\">\n @if (!selectedItem()) {\n <ng-content></ng-content>\n } @else {\n @let template = suggestionTemplate();\n @if (template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: selectedItem(), searchbox: this }\"></ng-container>\n }\n }\n </div>\n <span [innerHTML]=\"isOpen() ? caretUpFill() : caretDownFill()\" class=\"float-end\"></span>\n </button>\n <bs-dropdown-menu *bsDropdownMenu>\n @if (isBusy()) {\n <bs-progress [isIndeterminate]=\"true\" class=\"prog\">\n <bs-progress-bar></bs-progress-bar>\n </bs-progress>\n }\n <div class=\"w-100 px-2 mb-2\">\n <input type=\"text\" #textbox autofocus class=\"form-control d-block\" [ngModel]=\"searchterm()\" (ngModelChange)=\"onSearchtermChange($event)\">\n </div>\n\n @if (searchterm() === '') {\n <bs-dropdown-item [disabled]=\"true\">\n <ng-container *ngTemplateOutlet=\"enterSearchtermTemplate() ?? defaultEnterSearchtermTemplate; context: { }\"></ng-container>\n </bs-dropdown-item>\n } @else {\n <div class=\"overflow-y-auto\" [style.max-height.px]=\"200\">\n @let template = suggestionTemplate();\n @for (suggestion of suggestions(); track suggestion) {\n <bs-dropdown-item (click)=\"onSuggestionClicked(suggestion)\" [isSelected]=\"selectedItem()?.id === suggestion.id\" [disabled]=\"isBusy()\">\n @if (template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: suggestion, searchbox: this }\"></ng-container>\n }\n </bs-dropdown-item>\n }\n @if (suggestions().length === 0) {\n <bs-dropdown-item [disabled]=\"true\">\n <ng-container *ngTemplateOutlet=\"noResultsTemplate() ?? defaultNoResultsTemplate; context: { }\"></ng-container>\n </bs-dropdown-item>\n }\n </div>\n }\n </bs-dropdown-menu>\n</div>\n\n<ng-template #defaultEnterSearchtermTemplate>\n Enter a search term\n</ng-template>\n<ng-template #defaultNoResultsTemplate>\n No results\n</ng-template>\n", styles: [".prog{height:.3rem;margin-top:-.5rem;margin-bottom:.2rem}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: FocusOnLoadDirective, selector: "*[autofocus]", inputs: ["autofocus"] }, { kind: "component", type: BsHasOverlayComponent, selector: "bs-has-overlay" }, { kind: "directive", type: BsDropdownDirective, selector: "[bsDropdown]", inputs: ["hasBackdrop", "sameWidth", "closeOnClickOutside", "sameDropdownWidth", "isOpen"], outputs: ["isOpenChange"] }, { kind: "directive", type: BsDropdownToggleDirective, selector: "[bsDropdownToggle]" }, { kind: "directive", type: BsDropdownMenuDirective, selector: "[bsDropdownMenu]" }, { kind: "component", type: BsDropdownMenuComponent, selector: "bs-dropdown-menu", inputs: ["maxHeight"] }, { kind: "component", type: BsDropdownItemComponent, selector: "bs-dropdown-item", inputs: ["isSelected", "disabled"] }, { kind: "directive", type: BsButtonTypeDirective, selector: "button[color],input[type=\"button\"][color],input[type=\"submit\"][color],a[color]", inputs: ["color"] }, { kind: "component", type: BsProgressComponent, selector: "bs-progress", inputs: ["height", "isIndeterminate"] }, { kind: "component", type: BsProgressBarComponent, selector: "bs-progress-bar", inputs: ["minimum", "maximum", "value", "color", "striped", "animated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
105
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.11", type: BsSearchboxComponent, isStandalone: true, selector: "bs-searchbox", inputs: { isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, selectedItem: { classPropertyName: "selectedItem", publicName: "selectedItem", isSignal: true, isRequired: false, transformFunction: null }, searchterm: { classPropertyName: "searchterm", publicName: "searchterm", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, suggestions: { classPropertyName: "suggestions", publicName: "suggestions", isSignal: true, isRequired: false, transformFunction: null }, noResultsAnnouncement: { classPropertyName: "noResultsAnnouncement", publicName: "noResultsAnnouncement", isSignal: true, isRequired: false, transformFunction: null }, resultsAnnouncementSingular: { classPropertyName: "resultsAnnouncementSingular", publicName: "resultsAnnouncementSingular", isSignal: true, isRequired: false, transformFunction: null }, resultsAnnouncementPlural: { classPropertyName: "resultsAnnouncementPlural", publicName: "resultsAnnouncementPlural", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", selectedItem: "selectedItemChange", searchterm: "searchtermChange", suggestions: "suggestionsChange", provideSuggestions: "provideSuggestions" }, viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textbox"], descendants: true, isSignal: true }], ngImport: i0, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown popupRole=\"listbox\" [(isOpen)]=\"isOpen\" [hasBackdrop]=\"false\" [sameDropdownWidth]=\"true\">\n <button [color]=\"colors.primary\" class=\"d-flex w-100\" bsDropdownToggle>\n <div class=\"flex-grow-1\">\n @if (!selectedItem()) {\n <ng-content></ng-content>\n } @else {\n @let template = suggestionTemplate();\n @if (template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: selectedItem(), searchbox: this }\"></ng-container>\n }\n }\n </div>\n <span [innerHTML]=\"isOpen() ? caretUpFill() : caretDownFill()\" class=\"float-end\"></span>\n </button>\n <bs-dropdown-menu *bsDropdownMenu>\n @if (isBusy()) {\n <bs-progress [isIndeterminate]=\"true\" class=\"prog\">\n <bs-progress-bar></bs-progress-bar>\n </bs-progress>\n }\n <div class=\"w-100 px-2 mb-2\">\n <input type=\"search\" #textbox autofocus class=\"form-control d-block\" [attr.aria-label]=\"ariaLabel()\" [ngModel]=\"searchterm()\" (ngModelChange)=\"onSearchtermChange($event)\">\n </div>\n\n @if (searchterm() === '') {\n <bs-dropdown-item [disabled]=\"true\">\n <ng-container *ngTemplateOutlet=\"enterSearchtermTemplate() ?? defaultEnterSearchtermTemplate; context: { }\"></ng-container>\n </bs-dropdown-item>\n } @else {\n <div class=\"overflow-y-auto\" [style.max-height.px]=\"200\">\n @let template = suggestionTemplate();\n @for (suggestion of suggestions(); track suggestion) {\n <bs-dropdown-item (click)=\"onSuggestionClicked(suggestion)\" [isSelected]=\"selectedItem()?.id === suggestion.id\" [disabled]=\"isBusy()\">\n @if (template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: suggestion, searchbox: this }\"></ng-container>\n }\n </bs-dropdown-item>\n }\n @if (suggestions().length === 0) {\n <bs-dropdown-item [disabled]=\"true\">\n <ng-container *ngTemplateOutlet=\"noResultsTemplate() ?? defaultNoResultsTemplate; context: { }\"></ng-container>\n </bs-dropdown-item>\n }\n </div>\n }\n </bs-dropdown-menu>\n</div>\n\n<ng-template #defaultEnterSearchtermTemplate>\n Enter a search term\n</ng-template>\n<ng-template #defaultNoResultsTemplate>\n No results\n</ng-template>\n", styles: [".prog{height:.3rem;margin-top:-.5rem;margin-bottom:.2rem}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: FocusOnLoadDirective, selector: "*[autofocus]", inputs: ["autofocus"] }, { kind: "component", type: BsHasOverlayComponent, selector: "bs-has-overlay" }, { kind: "directive", type: BsDropdownDirective, selector: "[bsDropdown]", inputs: ["hasBackdrop", "sameWidth", "closeOnClickOutside", "sameDropdownWidth", "isOpen", "popupRole"], outputs: ["isOpenChange"], exportAs: ["bsDropdown"] }, { kind: "directive", type: BsDropdownToggleDirective, selector: "[bsDropdownToggle]" }, { kind: "directive", type: BsDropdownMenuDirective, selector: "[bsDropdownMenu]" }, { kind: "component", type: BsDropdownMenuComponent, selector: "bs-dropdown-menu", inputs: ["maxHeight"] }, { kind: "component", type: BsDropdownItemComponent, selector: "bs-dropdown-item", inputs: ["isSelected", "disabled"] }, { kind: "directive", type: BsButtonTypeDirective, selector: "button[color],input[type=\"button\"][color],input[type=\"submit\"][color],a[color]", inputs: ["color"] }, { kind: "component", type: BsProgressComponent, selector: "bs-progress", inputs: ["height", "isIndeterminate", "ariaLabel"] }, { kind: "component", type: BsProgressBarComponent, selector: "bs-progress-bar", inputs: ["minimum", "maximum", "value", "color", "striped", "animated", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
83
106
  }
84
107
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsSearchboxComponent, decorators: [{
85
108
  type: Component,
@@ -96,8 +119,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
96
119
  BsButtonTypeDirective,
97
120
  BsProgressComponent,
98
121
  BsProgressBarComponent,
99
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown [(isOpen)]=\"isOpen\" [hasBackdrop]=\"false\" [sameDropdownWidth]=\"true\">\n <button [color]=\"colors.primary\" class=\"d-flex w-100\" bsDropdownToggle>\n <div class=\"flex-grow-1\">\n @if (!selectedItem()) {\n <ng-content></ng-content>\n } @else {\n @let template = suggestionTemplate();\n @if (template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: selectedItem(), searchbox: this }\"></ng-container>\n }\n }\n </div>\n <span [innerHTML]=\"isOpen() ? caretUpFill() : caretDownFill()\" class=\"float-end\"></span>\n </button>\n <bs-dropdown-menu *bsDropdownMenu>\n @if (isBusy()) {\n <bs-progress [isIndeterminate]=\"true\" class=\"prog\">\n <bs-progress-bar></bs-progress-bar>\n </bs-progress>\n }\n <div class=\"w-100 px-2 mb-2\">\n <input type=\"text\" #textbox autofocus class=\"form-control d-block\" [ngModel]=\"searchterm()\" (ngModelChange)=\"onSearchtermChange($event)\">\n </div>\n\n @if (searchterm() === '') {\n <bs-dropdown-item [disabled]=\"true\">\n <ng-container *ngTemplateOutlet=\"enterSearchtermTemplate() ?? defaultEnterSearchtermTemplate; context: { }\"></ng-container>\n </bs-dropdown-item>\n } @else {\n <div class=\"overflow-y-auto\" [style.max-height.px]=\"200\">\n @let template = suggestionTemplate();\n @for (suggestion of suggestions(); track suggestion) {\n <bs-dropdown-item (click)=\"onSuggestionClicked(suggestion)\" [isSelected]=\"selectedItem()?.id === suggestion.id\" [disabled]=\"isBusy()\">\n @if (template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: suggestion, searchbox: this }\"></ng-container>\n }\n </bs-dropdown-item>\n }\n @if (suggestions().length === 0) {\n <bs-dropdown-item [disabled]=\"true\">\n <ng-container *ngTemplateOutlet=\"noResultsTemplate() ?? defaultNoResultsTemplate; context: { }\"></ng-container>\n </bs-dropdown-item>\n }\n </div>\n }\n </bs-dropdown-menu>\n</div>\n\n<ng-template #defaultEnterSearchtermTemplate>\n Enter a search term\n</ng-template>\n<ng-template #defaultNoResultsTemplate>\n No results\n</ng-template>\n", styles: [".prog{height:.3rem;margin-top:-.5rem;margin-bottom:.2rem}\n"] }]
100
- }], ctorParameters: () => [], propDecorators: { textbox: [{ type: i0.ViewChild, args: ['textbox', { isSignal: true }] }], isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }, { type: i0.Output, args: ["isOpenChange"] }], selectedItem: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedItem", required: false }] }, { type: i0.Output, args: ["selectedItemChange"] }], searchterm: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchterm", required: false }] }, { type: i0.Output, args: ["searchtermChange"] }], suggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "suggestions", required: false }] }, { type: i0.Output, args: ["suggestionsChange"] }], provideSuggestions: [{ type: i0.Output, args: ["provideSuggestions"] }] } });
122
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<bs-has-overlay></bs-has-overlay>\n<div bsDropdown popupRole=\"listbox\" [(isOpen)]=\"isOpen\" [hasBackdrop]=\"false\" [sameDropdownWidth]=\"true\">\n <button [color]=\"colors.primary\" class=\"d-flex w-100\" bsDropdownToggle>\n <div class=\"flex-grow-1\">\n @if (!selectedItem()) {\n <ng-content></ng-content>\n } @else {\n @let template = suggestionTemplate();\n @if (template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: selectedItem(), searchbox: this }\"></ng-container>\n }\n }\n </div>\n <span [innerHTML]=\"isOpen() ? caretUpFill() : caretDownFill()\" class=\"float-end\"></span>\n </button>\n <bs-dropdown-menu *bsDropdownMenu>\n @if (isBusy()) {\n <bs-progress [isIndeterminate]=\"true\" class=\"prog\">\n <bs-progress-bar></bs-progress-bar>\n </bs-progress>\n }\n <div class=\"w-100 px-2 mb-2\">\n <input type=\"search\" #textbox autofocus class=\"form-control d-block\" [attr.aria-label]=\"ariaLabel()\" [ngModel]=\"searchterm()\" (ngModelChange)=\"onSearchtermChange($event)\">\n </div>\n\n @if (searchterm() === '') {\n <bs-dropdown-item [disabled]=\"true\">\n <ng-container *ngTemplateOutlet=\"enterSearchtermTemplate() ?? defaultEnterSearchtermTemplate; context: { }\"></ng-container>\n </bs-dropdown-item>\n } @else {\n <div class=\"overflow-y-auto\" [style.max-height.px]=\"200\">\n @let template = suggestionTemplate();\n @for (suggestion of suggestions(); track suggestion) {\n <bs-dropdown-item (click)=\"onSuggestionClicked(suggestion)\" [isSelected]=\"selectedItem()?.id === suggestion.id\" [disabled]=\"isBusy()\">\n @if (template) {\n <ng-container *ngTemplateOutlet=\"template; context: { $implicit: suggestion, searchbox: this }\"></ng-container>\n }\n </bs-dropdown-item>\n }\n @if (suggestions().length === 0) {\n <bs-dropdown-item [disabled]=\"true\">\n <ng-container *ngTemplateOutlet=\"noResultsTemplate() ?? defaultNoResultsTemplate; context: { }\"></ng-container>\n </bs-dropdown-item>\n }\n </div>\n }\n </bs-dropdown-menu>\n</div>\n\n<ng-template #defaultEnterSearchtermTemplate>\n Enter a search term\n</ng-template>\n<ng-template #defaultNoResultsTemplate>\n No results\n</ng-template>\n", styles: [".prog{height:.3rem;margin-top:-.5rem;margin-bottom:.2rem}\n"] }]
123
+ }], ctorParameters: () => [], propDecorators: { textbox: [{ type: i0.ViewChild, args: ['textbox', { isSignal: true }] }], isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }, { type: i0.Output, args: ["isOpenChange"] }], selectedItem: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedItem", required: false }] }, { type: i0.Output, args: ["selectedItemChange"] }], searchterm: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchterm", required: false }] }, { type: i0.Output, args: ["searchtermChange"] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], suggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "suggestions", required: false }] }, { type: i0.Output, args: ["suggestionsChange"] }], noResultsAnnouncement: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultsAnnouncement", required: false }] }], resultsAnnouncementSingular: [{ type: i0.Input, args: [{ isSignal: true, alias: "resultsAnnouncementSingular", required: false }] }], resultsAnnouncementPlural: [{ type: i0.Input, args: [{ isSignal: true, alias: "resultsAnnouncementPlural", required: false }] }], provideSuggestions: [{ type: i0.Output, args: ["provideSuggestions"] }] } });
101
124
 
102
125
  class BsEnterSearchTermTemplateDirective {
103
126
  constructor() {