@koobiq/components 20.3.0 → 20.3.2

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 (95) hide show
  1. package/accordion/accordion.scss +4 -1
  2. package/accordion/index.d.ts +36 -12
  3. package/alert/index.d.ts +8 -0
  4. package/breadcrumbs/index.d.ts +2 -0
  5. package/button-toggle/button-toggle-tokens.scss +14 -0
  6. package/button-toggle/button-toggle.scss +75 -3
  7. package/core/index.d.ts +33 -1
  8. package/core/styles/common/_select.scss +98 -3
  9. package/core/styles/typography/_typography.scss +8 -0
  10. package/ellipsis-center/index.d.ts +35 -2
  11. package/fesm2022/koobiq-components-accordion.mjs +143 -44
  12. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  13. package/fesm2022/koobiq-components-alert.mjs +17 -1
  14. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  15. package/fesm2022/koobiq-components-autocomplete.mjs +2 -2
  16. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  17. package/fesm2022/koobiq-components-breadcrumbs.mjs +8 -3
  18. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  19. package/fesm2022/koobiq-components-button-toggle.mjs +2 -2
  20. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  21. package/fesm2022/koobiq-components-code-block.mjs +10 -5
  22. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  23. package/fesm2022/koobiq-components-core.mjs +52 -11
  24. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  25. package/fesm2022/koobiq-components-dropdown.mjs +2 -2
  26. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  27. package/fesm2022/koobiq-components-ellipsis-center.mjs +77 -22
  28. package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
  29. package/fesm2022/koobiq-components-file-upload.mjs +7 -7
  30. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  31. package/fesm2022/koobiq-components-filter-bar.mjs +76 -41
  32. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  33. package/fesm2022/koobiq-components-form-field.mjs +13 -7
  34. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  35. package/fesm2022/koobiq-components-list.mjs +3 -3
  36. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  37. package/fesm2022/koobiq-components-markdown.mjs +6 -2
  38. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  39. package/fesm2022/koobiq-components-modal.mjs +60 -11
  40. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  41. package/fesm2022/koobiq-components-select.mjs +99 -12
  42. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  43. package/fesm2022/koobiq-components-sidebar.mjs +5 -1
  44. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  45. package/fesm2022/koobiq-components-sidepanel.mjs +25 -6
  46. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  47. package/fesm2022/koobiq-components-tabs.mjs +10 -6
  48. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  49. package/fesm2022/koobiq-components-time-range.mjs +388 -74
  50. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  51. package/fesm2022/koobiq-components-timezone.mjs +2 -2
  52. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  53. package/fesm2022/koobiq-components-title.mjs +15 -3
  54. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  55. package/fesm2022/koobiq-components-tree-select.mjs +3 -3
  56. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  57. package/fesm2022/koobiq-components-tree.mjs +14 -4
  58. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  59. package/file-upload/file-upload.scss +11 -0
  60. package/file-upload/index.d.ts +1 -1
  61. package/file-upload/multiple-file-upload.component.scss +15 -3
  62. package/file-upload/single-file-upload.component.scss +10 -2
  63. package/filter-bar/filter-bar-tokens.scss +2 -1
  64. package/filter-bar/index.d.ts +25 -4
  65. package/filter-bar/pipes/base-pipe.scss +13 -6
  66. package/filter-bar/pipes/pipe-input.scss +3 -1
  67. package/form-field/index.d.ts +1 -3
  68. package/link/_link-theme.scss +50 -15
  69. package/markdown/index.d.ts +2 -0
  70. package/modal/index.d.ts +17 -8
  71. package/navbar/_navbar-item_horizontal.scss +5 -0
  72. package/package.json +3 -3
  73. package/prebuilt-themes/dark-theme.css +1 -1
  74. package/prebuilt-themes/light-theme.css +1 -1
  75. package/prebuilt-themes/theme.css +1 -1
  76. package/schematics/migrations/alert-signals/index.js +4 -1
  77. package/schematics/migrations/autocomplete-panel-width-auto/index.js +3 -34
  78. package/schematics/migrations/empty-state-size-attr/index.js +3 -34
  79. package/schematics/migrations/filter-bar-signals/index.js +4 -1
  80. package/schematics/migrations/loader-overlay-size-attr/index.js +3 -34
  81. package/schematics/migrations/v20-upgrade/index.js +4 -1
  82. package/schematics/ng-add/index.js +1 -1
  83. package/schematics/utils/angular-parsing.js +11 -12
  84. package/schematics/utils/package-config.js +5 -4
  85. package/schematics/utils/typescript.js +24 -0
  86. package/select/_select-theme.scss +9 -1
  87. package/select/index.d.ts +12 -2
  88. package/select/select.scss +13 -0
  89. package/sidebar/index.d.ts +1 -0
  90. package/sidepanel/index.d.ts +9 -0
  91. package/tabs/index.d.ts +1 -1
  92. package/time-range/index.d.ts +140 -5
  93. package/time-range/time-range.scss +16 -1
  94. package/title/index.d.ts +10 -2
  95. package/tree/index.d.ts +1 -0
@@ -1,24 +1,56 @@
1
+ import { SharedResizeObserver } from '@angular/cdk/observers/private';
1
2
  import * as i0 from '@angular/core';
2
3
  import { inject, ChangeDetectorRef, input, numberAttribute, Input, Directive, NgModule } from '@angular/core';
4
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
5
  import { KbqTooltipTrigger } from '@koobiq/components/tooltip';
4
- import { Subject, Subscription } from 'rxjs';
6
+ import { Subject } from 'rxjs';
5
7
  import { debounceTime } from 'rxjs/operators';
6
8
 
7
- const MIN_VISIBLE_LENGTH = 50;
9
+ /**
10
+ * Renders text as two spans and moves the ellipsis into the middle, so the tail — a file extension, the
11
+ * digits that tell two reports apart — stays readable when the host is too narrow for the whole string. A
12
+ * tooltip spells out the full text, and is enabled only while something is actually hidden.
13
+ *
14
+ * The host needs the layout contract the consuming component ships (see `.kbq-ellipsis-center` in
15
+ * `file-upload.scss`): the two spans have no styles of their own.
16
+ */
8
17
  class KbqEllipsisCenterDirective extends KbqTooltipTrigger {
9
18
  constructor() {
10
19
  super(...arguments);
11
20
  this.cdr = inject(ChangeDetectorRef);
12
- this.minVisibleLength = input(MIN_VISIBLE_LENGTH, ...(ngDevMode ? [{ debugName: "minVisibleLength" }] : []));
21
+ /**
22
+ * Application-wide `ResizeObserver` shared by every consumer, as `KbqTitleDirective` uses. Unlike the
23
+ * `window:resize` listener this directive used to carry, it also reacts to container-only resizes — a
24
+ * splitter drag, a sidebar collapse, or the vertical scrollbar that appears once a file list fills up —
25
+ * none of which resize the window, all of which change where the text has to be split.
26
+ */
27
+ this.resizeObserver = inject(SharedResizeObserver);
28
+ /**
29
+ * Shortest text worth splitting in the middle. Anything below it keeps its natural order and is cut off
30
+ * at the end by the host's own `text-overflow`.
31
+ *
32
+ * Defaults to `0` — every overflowing text is split — because that is what the directive has always
33
+ * done: the input was declared but never read, so any other default would silently end-truncate labels
34
+ * that consumers expect to see split.
35
+ */
36
+ this.minVisibleLength = input(0, ...(ngDevMode ? [{ debugName: "minVisibleLength" }] : []));
37
+ /**
38
+ * Lower bound, in pixels, for the average glyph width used to decide how many characters fit in the
39
+ * tail. The rendered text is measured as well and the wider of the two wins, so an underestimate here
40
+ * can no longer push the extension out of the tail — raising it only shortens the tail further.
41
+ */
13
42
  this.charWidth = input(7, ...(ngDevMode ? [{ debugName: "charWidth" }] : []));
14
43
  /**
15
44
  * Debounce time (ms) for resize events before recalculating ellipsis position.
16
45
  * @default 50
17
46
  */
18
47
  this.debounceInterval = input(50, ...(ngDevMode ? [{ debugName: "debounceInterval", transform: numberAttribute }] : [{ transform: numberAttribute }]));
19
- /** @docs-private */
48
+ /**
49
+ * @deprecated No longer read. Resizes now come from the shared `ResizeObserver`, which also catches the
50
+ * container-only ones a `window:resize` listener cannot see; the host listener that used to feed this
51
+ * subject is gone, and nothing subscribes to it. Kept as a no-op and removed in the next major version.
52
+ * @docs-private */
20
53
  this.resizeStream = new Subject();
21
- this.resizeSubscription = Subscription.EMPTY;
22
54
  }
23
55
  // TODO: Skipped for migration because:
24
56
  // Accessor inputs cannot be migrated as they are too complex.
@@ -34,13 +66,19 @@ class KbqEllipsisCenterDirective extends KbqTooltipTrigger {
34
66
  this.refresh();
35
67
  }
36
68
  ngAfterViewInit() {
37
- this.resizeSubscription = this.resizeStream
38
- .pipe(debounceTime(this.debounceInterval()))
39
- .subscribe(() => this.refresh());
69
+ super.ngAfterViewInit();
70
+ this.resizeObserver
71
+ .observe(this.elementRef.nativeElement)
72
+ .pipe(debounceTime(this.debounceInterval()), takeUntilDestroyed(this.destroyRef))
73
+ .subscribe(() => {
74
+ if (this.elementRef.nativeElement.clientWidth !== this.lastMeasuredWidth) {
75
+ this.refresh();
76
+ }
77
+ });
40
78
  }
41
79
  ngOnDestroy() {
80
+ clearTimeout(this.refreshTimeoutId);
42
81
  super.ngOnDestroy();
43
- this.resizeSubscription.unsubscribe();
44
82
  }
45
83
  /**
46
84
  * Updates the displayed text with center ellipsis truncation based on container width.
@@ -65,36 +103,53 @@ class KbqEllipsisCenterDirective extends KbqTooltipTrigger {
65
103
  });
66
104
  this.renderer.appendChild(dataTextStart, this.renderer.createText(this._kbqEllipsisCenter));
67
105
  this.renderer.appendChild(dataTextEnd, this.renderer.createText(end));
68
- setTimeout(() => {
69
- this.disabled = this.elementRef.nativeElement.clientWidth > dataTextStart.scrollWidth;
70
- if (this.disabled) {
71
- start = '';
72
- end = this._kbqEllipsisCenter;
73
- }
74
- else {
75
- const averageCharWidth = this.charWidth();
76
- const lastCharsLength = Math.round(this.elementRef.nativeElement.clientWidth / 2 / averageCharWidth);
77
- const sliceIndex = Math.round(this._kbqEllipsisCenter.length - lastCharsLength);
106
+ // A queued callback outlives both the spans it measures and the directive itself: it would measure
107
+ // elements a newer `refresh()` has already detached (`scrollWidth === 0`, so the text reads as
108
+ // fitting) and then call `hide()` on a torn-down trigger.
109
+ clearTimeout(this.refreshTimeoutId);
110
+ this.refreshTimeoutId = setTimeout(() => {
111
+ const { clientWidth } = this.elementRef.nativeElement;
112
+ // The full text is still in the start element at this point, so this is the width it needs.
113
+ const textWidth = dataTextStart.scrollWidth;
114
+ const truncated = clientWidth < textWidth;
115
+ this.lastMeasuredWidth = clientWidth;
116
+ if (truncated && this._kbqEllipsisCenter.length >= this.minVisibleLength()) {
117
+ // What the text actually rendered at, not what `charWidth` assumes: with glyphs wider than
118
+ // the Latin-sized default (Cyrillic, CJK, uppercase) the estimate hands the tail more
119
+ // characters than the cell can hold, and the tail does not shrink — so `overflow: hidden`
120
+ // would swallow the extension the split exists to keep.
121
+ const averageCharWidth = Math.max(this.charWidth(), textWidth / this._kbqEllipsisCenter.length);
122
+ const lastCharsLength = Math.round(clientWidth / 2 / averageCharWidth);
123
+ // Both halves have to keep at least one character: an empty start element drops the ellipsis
124
+ // (it is the only one carrying `text-overflow`), an empty end element drops the extension.
125
+ const sliceIndex = Math.max(1, Math.min(Math.round(this._kbqEllipsisCenter.length - lastCharsLength), this._kbqEllipsisCenter.length - 1));
78
126
  start = this._kbqEllipsisCenter.slice(0, sliceIndex);
79
127
  end = this._kbqEllipsisCenter.slice(sliceIndex);
80
128
  }
129
+ else {
130
+ // Text that is not split goes into the start element, the only one carrying
131
+ // `text-overflow: ellipsis` — the end element cannot shrink, so text parked there would
132
+ // overflow the host instead of being cut off.
133
+ start = this._kbqEllipsisCenter;
134
+ end = '';
135
+ }
81
136
  dataTextStart.innerText = start;
82
137
  dataTextEnd.innerText = end;
138
+ this.disabled = !truncated;
83
139
  this.cdr.markForCheck();
84
140
  });
85
141
  this.renderer.appendChild(this.elementRef.nativeElement, dataTextStart);
86
142
  this.renderer.appendChild(this.elementRef.nativeElement, dataTextEnd);
87
143
  }
88
144
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqEllipsisCenterDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
89
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.30", type: KbqEllipsisCenterDirective, isStandalone: true, selector: "[kbqEllipsisCenter]", inputs: { kbqEllipsisCenter: { classPropertyName: "kbqEllipsisCenter", publicName: "kbqEllipsisCenter", isSignal: false, isRequired: false, transformFunction: null }, minVisibleLength: { classPropertyName: "minVisibleLength", publicName: "minVisibleLength", isSignal: true, isRequired: false, transformFunction: null }, charWidth: { classPropertyName: "charWidth", publicName: "charWidth", isSignal: true, isRequired: false, transformFunction: null }, debounceInterval: { classPropertyName: "debounceInterval", publicName: "debounceInterval", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "resizeStream.next($event)" }, classAttribute: "kbq-ellipsis-center" }, usesInheritance: true, ngImport: i0 }); }
145
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.30", type: KbqEllipsisCenterDirective, isStandalone: true, selector: "[kbqEllipsisCenter]", inputs: { kbqEllipsisCenter: { classPropertyName: "kbqEllipsisCenter", publicName: "kbqEllipsisCenter", isSignal: false, isRequired: false, transformFunction: null }, minVisibleLength: { classPropertyName: "minVisibleLength", publicName: "minVisibleLength", isSignal: true, isRequired: false, transformFunction: null }, charWidth: { classPropertyName: "charWidth", publicName: "charWidth", isSignal: true, isRequired: false, transformFunction: null }, debounceInterval: { classPropertyName: "debounceInterval", publicName: "debounceInterval", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "kbq-ellipsis-center" }, usesInheritance: true, ngImport: i0 }); }
90
146
  }
91
147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqEllipsisCenterDirective, decorators: [{
92
148
  type: Directive,
93
149
  args: [{
94
150
  selector: '[kbqEllipsisCenter]',
95
151
  host: {
96
- class: 'kbq-ellipsis-center',
97
- '(window:resize)': 'resizeStream.next($event)'
152
+ class: 'kbq-ellipsis-center'
98
153
  }
99
154
  }]
100
155
  }], propDecorators: { kbqEllipsisCenter: [{
@@ -1 +1 @@
1
- {"version":3,"file":"koobiq-components-ellipsis-center.mjs","sources":["../../../packages/components/ellipsis-center/ellipsis-center.directive.ts","../../../packages/components/ellipsis-center/koobiq-components-ellipsis-center.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectorRef,\n Directive,\n inject,\n Input,\n input,\n NgModule,\n numberAttribute,\n OnDestroy,\n OnInit\n} from '@angular/core';\nimport { KbqTooltipTrigger } from '@koobiq/components/tooltip';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nconst MIN_VISIBLE_LENGTH = 50;\n\n@Directive({\n selector: '[kbqEllipsisCenter]',\n host: {\n class: 'kbq-ellipsis-center',\n '(window:resize)': 'resizeStream.next($event)'\n }\n})\nexport class KbqEllipsisCenterDirective extends KbqTooltipTrigger implements OnInit, AfterViewInit, OnDestroy {\n private cdr: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input() set kbqEllipsisCenter(value: string) {\n this._kbqEllipsisCenter = value;\n this.refresh();\n // check the view to properly calculate text-start and text-end on text initialized\n this.cdr.detectChanges();\n }\n\n readonly minVisibleLength = input<number>(MIN_VISIBLE_LENGTH);\n\n readonly charWidth = input(7);\n\n /**\n * Debounce time (ms) for resize events before recalculating ellipsis position.\n * @default 50\n */\n readonly debounceInterval = input<number, unknown>(50, { transform: numberAttribute });\n\n /** @docs-private */\n readonly resizeStream = new Subject<Event>();\n\n private _kbqEllipsisCenter: string;\n\n private resizeSubscription = Subscription.EMPTY;\n\n override ngOnInit(): void {\n super.ngOnInit();\n this.content = this._kbqEllipsisCenter;\n this.refresh();\n }\n\n ngAfterViewInit(): void {\n this.resizeSubscription = this.resizeStream\n .pipe(debounceTime(this.debounceInterval()))\n .subscribe(() => this.refresh());\n }\n\n ngOnDestroy() {\n super.ngOnDestroy();\n this.resizeSubscription.unsubscribe();\n }\n\n /**\n * Updates the displayed text with center ellipsis truncation based on container width.\n * Recreates start/end span elements, measures available space, and adjusts text accordingly.\n * @docs-private\n */\n refresh(): void {\n let start = '';\n let end = '';\n\n this.content = this._kbqEllipsisCenter;\n\n const [dataTextStart, dataTextEnd] = [\n 'kbq-ellipsis-center_data-text-start',\n 'kbq-ellipsis-center_data-text-end'\n ].map((querySelector) => {\n const element = this.elementRef.nativeElement.querySelector(`.${querySelector}`);\n\n if (element) {\n this.renderer.removeChild(this.elementRef.nativeElement, element);\n }\n\n const newElement = this.renderer.createElement('span');\n\n this.renderer.addClass(newElement, querySelector);\n\n return newElement;\n });\n\n this.renderer.appendChild(dataTextStart, this.renderer.createText(this._kbqEllipsisCenter));\n this.renderer.appendChild(dataTextEnd, this.renderer.createText(end));\n setTimeout(() => {\n this.disabled = this.elementRef.nativeElement.clientWidth > dataTextStart.scrollWidth;\n\n if (this.disabled) {\n start = '';\n end = this._kbqEllipsisCenter;\n } else {\n const averageCharWidth = this.charWidth();\n const lastCharsLength = Math.round(this.elementRef.nativeElement.clientWidth / 2 / averageCharWidth);\n const sliceIndex: number = Math.round(this._kbqEllipsisCenter.length - lastCharsLength);\n\n start = this._kbqEllipsisCenter.slice(0, sliceIndex);\n end = this._kbqEllipsisCenter.slice(sliceIndex);\n }\n\n dataTextStart.innerText = start;\n dataTextEnd.innerText = end;\n\n this.cdr.markForCheck();\n });\n\n this.renderer.appendChild(this.elementRef.nativeElement, dataTextStart);\n this.renderer.appendChild(this.elementRef.nativeElement, dataTextEnd);\n }\n}\n\n@NgModule({\n imports: [KbqEllipsisCenterDirective],\n exports: [KbqEllipsisCenterDirective]\n})\nexport class KbqEllipsisCenterModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"koobiq-components-ellipsis-center.mjs","sources":["../../../packages/components/ellipsis-center/ellipsis-center.directive.ts","../../../packages/components/ellipsis-center/koobiq-components-ellipsis-center.ts"],"sourcesContent":["import { SharedResizeObserver } from '@angular/cdk/observers/private';\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Directive,\n inject,\n Input,\n input,\n NgModule,\n numberAttribute,\n OnDestroy,\n OnInit\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { KbqTooltipTrigger } from '@koobiq/components/tooltip';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n/**\n * Renders text as two spans and moves the ellipsis into the middle, so the tail — a file extension, the\n * digits that tell two reports apart — stays readable when the host is too narrow for the whole string. A\n * tooltip spells out the full text, and is enabled only while something is actually hidden.\n *\n * The host needs the layout contract the consuming component ships (see `.kbq-ellipsis-center` in\n * `file-upload.scss`): the two spans have no styles of their own.\n */\n@Directive({\n selector: '[kbqEllipsisCenter]',\n host: {\n class: 'kbq-ellipsis-center'\n }\n})\nexport class KbqEllipsisCenterDirective extends KbqTooltipTrigger implements OnInit, AfterViewInit, OnDestroy {\n private cdr: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n /**\n * Application-wide `ResizeObserver` shared by every consumer, as `KbqTitleDirective` uses. Unlike the\n * `window:resize` listener this directive used to carry, it also reacts to container-only resizes — a\n * splitter drag, a sidebar collapse, or the vertical scrollbar that appears once a file list fills up —\n * none of which resize the window, all of which change where the text has to be split.\n */\n private readonly resizeObserver = inject(SharedResizeObserver);\n\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input() set kbqEllipsisCenter(value: string) {\n this._kbqEllipsisCenter = value;\n this.refresh();\n // check the view to properly calculate text-start and text-end on text initialized\n this.cdr.detectChanges();\n }\n\n /**\n * Shortest text worth splitting in the middle. Anything below it keeps its natural order and is cut off\n * at the end by the host's own `text-overflow`.\n *\n * Defaults to `0` — every overflowing text is split — because that is what the directive has always\n * done: the input was declared but never read, so any other default would silently end-truncate labels\n * that consumers expect to see split.\n */\n readonly minVisibleLength = input<number>(0);\n\n /**\n * Lower bound, in pixels, for the average glyph width used to decide how many characters fit in the\n * tail. The rendered text is measured as well and the wider of the two wins, so an underestimate here\n * can no longer push the extension out of the tail — raising it only shortens the tail further.\n */\n readonly charWidth = input(7);\n\n /**\n * Debounce time (ms) for resize events before recalculating ellipsis position.\n * @default 50\n */\n readonly debounceInterval = input<number, unknown>(50, { transform: numberAttribute });\n\n /**\n * @deprecated No longer read. Resizes now come from the shared `ResizeObserver`, which also catches the\n * container-only ones a `window:resize` listener cannot see; the host listener that used to feed this\n * subject is gone, and nothing subscribes to it. Kept as a no-op and removed in the next major version.\n * @docs-private */\n readonly resizeStream = new Subject<Event>();\n\n private _kbqEllipsisCenter: string;\n\n // Host width the last completed `refresh()` measured, so a resize that leaves it untouched (the host is\n // clamped to its container) does not schedule work that would produce the same split.\n private lastMeasuredWidth: number | undefined;\n\n private refreshTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n override ngOnInit(): void {\n super.ngOnInit();\n this.content = this._kbqEllipsisCenter;\n this.refresh();\n }\n\n ngAfterViewInit(): void {\n super.ngAfterViewInit();\n\n this.resizeObserver\n .observe(this.elementRef.nativeElement)\n .pipe(debounceTime(this.debounceInterval()), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.elementRef.nativeElement.clientWidth !== this.lastMeasuredWidth) {\n this.refresh();\n }\n });\n }\n\n ngOnDestroy() {\n clearTimeout(this.refreshTimeoutId);\n\n super.ngOnDestroy();\n }\n\n /**\n * Updates the displayed text with center ellipsis truncation based on container width.\n * Recreates start/end span elements, measures available space, and adjusts text accordingly.\n * @docs-private\n */\n refresh(): void {\n let start = '';\n let end = '';\n\n this.content = this._kbqEllipsisCenter;\n\n const [dataTextStart, dataTextEnd] = [\n 'kbq-ellipsis-center_data-text-start',\n 'kbq-ellipsis-center_data-text-end'\n ].map((querySelector) => {\n const element = this.elementRef.nativeElement.querySelector(`.${querySelector}`);\n\n if (element) {\n this.renderer.removeChild(this.elementRef.nativeElement, element);\n }\n\n const newElement = this.renderer.createElement('span');\n\n this.renderer.addClass(newElement, querySelector);\n\n return newElement;\n });\n\n this.renderer.appendChild(dataTextStart, this.renderer.createText(this._kbqEllipsisCenter));\n this.renderer.appendChild(dataTextEnd, this.renderer.createText(end));\n\n // A queued callback outlives both the spans it measures and the directive itself: it would measure\n // elements a newer `refresh()` has already detached (`scrollWidth === 0`, so the text reads as\n // fitting) and then call `hide()` on a torn-down trigger.\n clearTimeout(this.refreshTimeoutId);\n\n this.refreshTimeoutId = setTimeout(() => {\n const { clientWidth } = this.elementRef.nativeElement;\n // The full text is still in the start element at this point, so this is the width it needs.\n const textWidth = dataTextStart.scrollWidth;\n const truncated = clientWidth < textWidth;\n\n this.lastMeasuredWidth = clientWidth;\n\n if (truncated && this._kbqEllipsisCenter.length >= this.minVisibleLength()) {\n // What the text actually rendered at, not what `charWidth` assumes: with glyphs wider than\n // the Latin-sized default (Cyrillic, CJK, uppercase) the estimate hands the tail more\n // characters than the cell can hold, and the tail does not shrink — so `overflow: hidden`\n // would swallow the extension the split exists to keep.\n const averageCharWidth = Math.max(this.charWidth(), textWidth / this._kbqEllipsisCenter.length);\n const lastCharsLength = Math.round(clientWidth / 2 / averageCharWidth);\n\n // Both halves have to keep at least one character: an empty start element drops the ellipsis\n // (it is the only one carrying `text-overflow`), an empty end element drops the extension.\n const sliceIndex = Math.max(\n 1,\n Math.min(\n Math.round(this._kbqEllipsisCenter.length - lastCharsLength),\n this._kbqEllipsisCenter.length - 1\n )\n );\n\n start = this._kbqEllipsisCenter.slice(0, sliceIndex);\n end = this._kbqEllipsisCenter.slice(sliceIndex);\n } else {\n // Text that is not split goes into the start element, the only one carrying\n // `text-overflow: ellipsis` — the end element cannot shrink, so text parked there would\n // overflow the host instead of being cut off.\n start = this._kbqEllipsisCenter;\n end = '';\n }\n\n dataTextStart.innerText = start;\n dataTextEnd.innerText = end;\n\n this.disabled = !truncated;\n this.cdr.markForCheck();\n });\n\n this.renderer.appendChild(this.elementRef.nativeElement, dataTextStart);\n this.renderer.appendChild(this.elementRef.nativeElement, dataTextEnd);\n }\n}\n\n@NgModule({\n imports: [KbqEllipsisCenterDirective],\n exports: [KbqEllipsisCenterDirective]\n})\nexport class KbqEllipsisCenterModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}