@koobiq/components 20.3.1 → 20.4.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 (104) 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 +146 -5
  8. package/core/option/_option-theme.scss +3 -0
  9. package/core/styles/common/_select.scss +98 -3
  10. package/core/styles/typography/_typography.scss +8 -0
  11. package/ellipsis-center/ellipsis-center.scss +31 -0
  12. package/ellipsis-center/index.d.ts +35 -2
  13. package/fesm2022/koobiq-components-accordion.mjs +143 -44
  14. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  15. package/fesm2022/koobiq-components-alert.mjs +17 -1
  16. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  17. package/fesm2022/koobiq-components-autocomplete.mjs +2 -2
  18. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  19. package/fesm2022/koobiq-components-breadcrumbs.mjs +8 -3
  20. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  21. package/fesm2022/koobiq-components-button-toggle.mjs +2 -2
  22. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  23. package/fesm2022/koobiq-components-code-block.mjs +10 -5
  24. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  25. package/fesm2022/koobiq-components-core.mjs +214 -11
  26. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  27. package/fesm2022/koobiq-components-dropdown.mjs +2 -2
  28. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  29. package/fesm2022/koobiq-components-ellipsis-center.mjs +101 -34
  30. package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
  31. package/fesm2022/koobiq-components-file-upload.mjs +7 -7
  32. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  33. package/fesm2022/koobiq-components-filter-bar.mjs +94 -55
  34. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  35. package/fesm2022/koobiq-components-inline-edit.mjs +177 -14
  36. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  37. package/fesm2022/koobiq-components-list.mjs +359 -44
  38. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  39. package/fesm2022/koobiq-components-markdown.mjs +6 -2
  40. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  41. package/fesm2022/koobiq-components-modal.mjs +48 -7
  42. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  43. package/fesm2022/koobiq-components-select.mjs +117 -12
  44. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  45. package/fesm2022/koobiq-components-sidebar.mjs +5 -1
  46. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  47. package/fesm2022/koobiq-components-sidepanel.mjs +25 -6
  48. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  49. package/fesm2022/koobiq-components-tabs.mjs +460 -197
  50. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  51. package/fesm2022/koobiq-components-time-range.mjs +388 -74
  52. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  53. package/fesm2022/koobiq-components-timezone.mjs +4 -4
  54. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  55. package/fesm2022/koobiq-components-title.mjs +15 -3
  56. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  57. package/fesm2022/koobiq-components-tree-select.mjs +2 -2
  58. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  59. package/fesm2022/koobiq-components-tree.mjs +14 -4
  60. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  61. package/file-upload/file-upload.scss +0 -18
  62. package/file-upload/index.d.ts +1 -1
  63. package/file-upload/multiple-file-upload.component.scss +15 -3
  64. package/file-upload/single-file-upload.component.scss +10 -2
  65. package/filter-bar/filter-bar-tokens.scss +2 -1
  66. package/filter-bar/index.d.ts +41 -4
  67. package/filter-bar/pipes/base-pipe.scss +24 -6
  68. package/filter-bar/pipes/pipe-input.scss +3 -1
  69. package/inline-edit/index.d.ts +87 -8
  70. package/inline-edit/inline-edit-tokens.scss +1 -0
  71. package/inline-edit/inline-edit.scss +26 -0
  72. package/link/_link-theme.scss +50 -15
  73. package/list/index.d.ts +126 -5
  74. package/markdown/index.d.ts +2 -0
  75. package/modal/index.d.ts +16 -7
  76. package/navbar/_navbar-item_horizontal.scss +5 -0
  77. package/package.json +3 -3
  78. package/prebuilt-themes/dark-theme.css +1 -1
  79. package/prebuilt-themes/light-theme.css +1 -1
  80. package/prebuilt-themes/theme.css +1 -1
  81. package/schematics/migrations/alert-signals/index.js +4 -1
  82. package/schematics/migrations/autocomplete-panel-width-auto/index.js +3 -34
  83. package/schematics/migrations/empty-state-size-attr/index.js +3 -34
  84. package/schematics/migrations/filter-bar-signals/index.js +4 -1
  85. package/schematics/migrations/loader-overlay-size-attr/index.js +3 -34
  86. package/schematics/migrations/v20-upgrade/index.js +4 -1
  87. package/schematics/ng-add/index.js +1 -1
  88. package/schematics/utils/angular-parsing.js +11 -12
  89. package/schematics/utils/package-config.js +5 -4
  90. package/schematics/utils/typescript.js +24 -0
  91. package/select/_select-theme.scss +9 -1
  92. package/select/index.d.ts +18 -2
  93. package/select/select.scss +13 -0
  94. package/sidebar/index.d.ts +1 -0
  95. package/sidepanel/index.d.ts +9 -0
  96. package/tabs/_tabs-common.scss +111 -2
  97. package/tabs/index.d.ts +79 -48
  98. package/tabs/tab-group.scss +0 -4
  99. package/tabs/tab-header.scss +0 -2
  100. package/tabs/tab-nav-bar.scss +3 -11
  101. package/time-range/index.d.ts +140 -5
  102. package/time-range/time-range.scss +16 -1
  103. package/title/index.d.ts +10 -2
  104. package/tree/index.d.ts +1 -0
package/list/index.d.ts CHANGED
@@ -8,7 +8,7 @@ import * as i1 from '@angular/cdk/drag-drop';
8
8
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
9
9
  import { ControlValueAccessor } from '@angular/forms';
10
10
  import * as i3 from '@koobiq/components/core';
11
- import { FocusKeyManager, IFocusableOption, KbqTitleTextRef, KbqOptgroup, KbqOptionActionComponent, KbqPseudoCheckbox, MultipleMode, KbqLine } from '@koobiq/components/core';
11
+ import { FocusKeyManager, IFocusableOption, KbqTitleTextRef, KbqOptgroup, KbqOptionActionComponent, KbqPseudoCheckbox, KbqPseudoCheckboxState, MultipleMode, KbqLine } from '@koobiq/components/core';
12
12
  import { KbqDropdownTrigger } from '@koobiq/components/dropdown';
13
13
  import { KbqTooltipTrigger } from '@koobiq/components/tooltip';
14
14
  import { Subject, Observable } from 'rxjs';
@@ -125,6 +125,72 @@ declare class KbqListSelection<T = any> implements AfterContentInit, AfterViewIn
125
125
  readonly dropped: _angular_core.OutputEmitterRef<KbqListSelectionDroppedEvent>;
126
126
  /** When `true`, a repeated Ctrl/Cmd+A deselects all options. Off by default (Ctrl+A only selects). */
127
127
  readonly selectAllToggle: _angular_core.InputSignalWithTransform<boolean, unknown>;
128
+ /**
129
+ * Whether to render the "select all" master checkbox above the options. `multiple="checkbox"` only —
130
+ * a vertical list, since the row is a full-width heading of the column it governs.
131
+ *
132
+ * The row acts on every option the user can toggle, disabled ones excluded. Enabling it also makes
133
+ * Ctrl/Cmd + A a two-way toggle, so the shortcut and the checkbox never disagree ({@link selectAllToggle}
134
+ * is implied).
135
+ *
136
+ * Aliased rather than named `selectAll`, which is already taken by the imperative method of that name.
137
+ */
138
+ readonly selectAllEnabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
139
+ /**
140
+ * Reference to the built-in "select all" row, rendered only while `selectAll` is on.
141
+ *
142
+ * Located by template reference rather than by the `KbqListOption` type: that class is declared
143
+ * below this one in the same file, and a query locator is evaluated while this class is being
144
+ * defined, which would read it in its temporal dead zone.
145
+ */
146
+ readonly selectAllOption: _angular_core.Signal<KbqListOption<T> | undefined>;
147
+ /**
148
+ * The options the key manager navigates: the "select all" row first, then the projected ones.
149
+ *
150
+ * Kept apart from {@link options} because that query is public API and means "the options the consumer
151
+ * projected" — a synthetic entry there would corrupt `getSelectedOptionValues`, the drop-indicator
152
+ * geometry and every consumer tally built on it.
153
+ * @docs-private
154
+ */
155
+ readonly navigableOptions: QueryList<KbqListOption<T>>;
156
+ /**
157
+ * The virtual scroller rendering the options, when the consumer projected one.
158
+ *
159
+ * A signal query rather than a DOM probe, mirroring `KbqSelect.cdkVirtualForOf`: it resolves on the
160
+ * server as well as in the browser, and it follows a viewport that appears later behind the
161
+ * consumer's own `@if`.
162
+ */
163
+ private readonly virtualScroll;
164
+ /**
165
+ * Whether the "select all" row is currently rendered.
166
+ *
167
+ * Suppressed inside a `cdk-virtual-scroll-viewport`: `options` then holds only the options currently
168
+ * rendered, so the checkbox would report "everything selected" after touching a fraction of the data
169
+ * — the same reason `kbq-select` refuses the row under `withVirtualScroll`. Suppressed on an empty
170
+ * list too: a master checkbox over nothing has nothing to say.
171
+ */
172
+ protected get showSelectAll(): boolean;
173
+ /** Label of the "select all" row. Follows the active locale. */
174
+ protected selectAllText: string;
175
+ private readonly localeService?;
176
+ /** Updates locale parameters from the locale service. */
177
+ private updateLocaleParams;
178
+ /** Whether every option "select all" can act on is selected. */
179
+ get allOptionsSelected(): boolean;
180
+ /** State of the "select all" master checkbox. */
181
+ get selectAllState(): KbqPseudoCheckboxState;
182
+ /**
183
+ * Options "select all" acts on, and the ones its checkbox state is derived from. Read from
184
+ * {@link options}, so the row it renders itself is never among them.
185
+ */
186
+ private get selectAllTargets();
187
+ /**
188
+ * Adapter shared by the master checkbox and the Ctrl/Cmd + A handler, so the two cannot drift apart.
189
+ *
190
+ * Takes the items rather than reading {@link selectAllTargets} itself: the toggle needs that array for
191
+ * the emitted event anyway, and deriving it here as well would walk the whole option list twice.
192
+ */
193
+ private selectAllAdapter;
128
194
  multipleMode: MultipleMode | null;
129
195
  get multiple(): boolean;
130
196
  readonly horizontal: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -179,15 +245,49 @@ declare class KbqListSelection<T = any> implements AfterContentInit, AfterViewIn
179
245
  /** Whether a form control has ever written to the list, i.e. whether {@link _value} speaks for a model. */
180
246
  private hasWrittenValue;
181
247
  constructor();
248
+ /** Rebuilds {@link navigableOptions}: the "select all" row, when rendered, leads the projected options. */
249
+ private syncNavigableOptions;
250
+ /**
251
+ * Marks the list for check after an option changed something the "select all" row is derived from —
252
+ * its selection or its `disabled` state.
253
+ *
254
+ * An option marking itself only asks its ancestors to traverse down to it; it does not re-evaluate
255
+ * their own bindings. Without this the row keeps painting a state the options have already left, and
256
+ * a click on a checkbox showing `indeterminate` over an already-full selection takes the deselect
257
+ * branch — doing the opposite of what the user was shown.
258
+ * @docs-private
259
+ */
260
+ refreshSelectAllState(): void;
261
+ /** Whether the option is the built-in "select all" row rather than one the consumer projected. */
262
+ private isSelectAllRow;
263
+ /**
264
+ * Selects every option "select all" can act on, or deselects them all when they are already selected.
265
+ *
266
+ * Backs both the master checkbox and Ctrl/Cmd + A, so the two can never disagree. Reports the value
267
+ * once for the whole batch instead of once per option.
268
+ */
269
+ toggleSelectAll(): void;
270
+ /**
271
+ * Whether a repeated toggle deselects. Keyed on {@link showSelectAll} rather than on the raw input:
272
+ * with no row on screen there is no checkbox for the shortcut to agree with, so the attribute must
273
+ * not quietly change what Ctrl/Cmd + A does.
274
+ */
275
+ private get allowSelectAllDeselect();
182
276
  ngAfterContentInit(): void;
183
277
  ngAfterViewInit(): void;
184
278
  ngOnDestroy(): void;
185
279
  focus(): void;
186
280
  /** Clears the active key-manager item (unless an option is still focused) and marks the list as touched. */
187
281
  blur(): void;
188
- /** Selects every non-disabled option and reports the new value to the `ControlValueAccessor`. */
282
+ /**
283
+ * Selects every option and reports the new value to the `ControlValueAccessor`.
284
+ *
285
+ * Unlike the `selectAll` attribute and Ctrl/Cmd + A, this acts on disabled options as well — it is
286
+ * an imperative command, not something the user performed. See {@link toggleSelectAll} for the
287
+ * behaviour the master checkbox has.
288
+ */
189
289
  selectAll(): void;
190
- /** Deselects every option and reports the new value to the `ControlValueAccessor`. */
290
+ /** Deselects every option, disabled ones included, and reports the new value. See {@link selectAll}. */
191
291
  deselectAll(): void;
192
292
  updateScrollSize(): void;
193
293
  setSelectedOptionsByClick(option: KbqListOption<T>, shiftKey: boolean, ctrlKey: boolean): void;
@@ -235,6 +335,11 @@ declare class KbqListSelection<T = any> implements AfterContentInit, AfterViewIn
235
335
  private isValidIndex;
236
336
  private getOptionIndex;
237
337
  private setupDropListInitialProperties;
338
+ /**
339
+ * Says once, in dev mode, why `selectAll` produced no row: the master checkbox could only ever act on
340
+ * the options the scroller happens to have rendered, so the row is dropped rather than left lying.
341
+ */
342
+ private warnOnUnsupportedSelectAllContainer;
238
343
  /**
239
344
  * `CdkDropList` numbers only the options it has rendered, so inside a virtual scroll the indices
240
345
  * `dropped` reports do not address the consumer's backing array and the move silently lands on the
@@ -287,7 +392,7 @@ declare class KbqListSelection<T = any> implements AfterContentInit, AfterViewIn
287
392
  private _selectAllHandler;
288
393
  private copyActiveOption;
289
394
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqListSelection<any>, never>;
290
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqListSelection<any>, "kbq-list-selection", ["kbqListSelection"], { "autoSelect": { "alias": "autoSelect"; "required": false; }; "noUnselectLast": { "alias": "noUnselectLast"; "required": false; }; "draggable": { "alias": "draggable"; "required": false; }; "connectedTo": { "alias": "connectedTo"; "required": false; "isSignal": true; }; "dragPreview": { "alias": "dragPreview"; "required": false; "isSignal": true; }; "dragCursor": { "alias": "dragCursor"; "required": false; "isSignal": true; }; "selectAllToggle": { "alias": "selectAllToggle"; "required": false; "isSignal": true; }; "horizontal": { "alias": "horizontal"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "selectAllHandler": { "alias": "selectAllHandler"; "required": false; }; }, { "onSelectAll": "onSelectAll"; "onCopy": "onCopy"; "dropped": "dropped"; "selectionChange": "selectionChange"; }, ["options"], ["*"], true, [{ directive: typeof i1.CdkDropList; inputs: { "id": "id"; }; outputs: {}; }]>;
395
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqListSelection<any>, "kbq-list-selection", ["kbqListSelection"], { "autoSelect": { "alias": "autoSelect"; "required": false; }; "noUnselectLast": { "alias": "noUnselectLast"; "required": false; }; "draggable": { "alias": "draggable"; "required": false; }; "connectedTo": { "alias": "connectedTo"; "required": false; "isSignal": true; }; "dragPreview": { "alias": "dragPreview"; "required": false; "isSignal": true; }; "dragCursor": { "alias": "dragCursor"; "required": false; "isSignal": true; }; "selectAllToggle": { "alias": "selectAllToggle"; "required": false; "isSignal": true; }; "selectAllEnabled": { "alias": "selectAll"; "required": false; "isSignal": true; }; "horizontal": { "alias": "horizontal"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "selectAllHandler": { "alias": "selectAllHandler"; "required": false; }; }, { "onSelectAll": "onSelectAll"; "onCopy": "onCopy"; "dropped": "dropped"; "selectionChange": "selectionChange"; }, ["virtualScroll", "options"], ["*"], true, [{ directive: typeof i1.CdkDropList; inputs: { "id": "id"; }; outputs: {}; }]>;
291
396
  static ngAcceptInputType_draggable: unknown;
292
397
  static ngAcceptInputType_disabled: unknown;
293
398
  }
@@ -335,6 +440,15 @@ declare class KbqListOption<T = any> implements OnDestroy, OnInit, IFocusableOpt
335
440
  */
336
441
  textElement: ElementRef;
337
442
  readonly checkboxPosition: _angular_core.InputSignal<"before" | "after">;
443
+ /**
444
+ * Whether this option is the list's "select all" row rather than one the consumer projected.
445
+ *
446
+ * Such a row has no `value` and no place in the `SelectionModel`, so everything that would resolve
447
+ * it against the list's selection is skipped; its checkbox state and its selected look are driven
448
+ * from the outside instead. It also stays out of the drag-and-drop registry — see the constructor.
449
+ * @docs-private
450
+ */
451
+ readonly selectAllRow: _angular_core.InputSignalWithTransform<boolean, unknown>;
338
452
  /**
339
453
  * This is set to true after the first OnChanges cycle so we don't clear the value of `selected`
340
454
  * in the first cycle.
@@ -381,6 +495,13 @@ declare class KbqListOption<T = any> implements OnDestroy, OnInit, IFocusableOpt
381
495
  set selected(value: boolean);
382
496
  private _selected;
383
497
  get tabIndex(): number | null;
498
+ /** `aria-selected` of the row. The "select all" row reports `aria-checked` instead. */
499
+ protected get ariaSelected(): boolean | null;
500
+ /**
501
+ * Tri-state of the "select all" row, `mixed` included. `null` for an ordinary option, which
502
+ * reports `aria-selected` instead.
503
+ */
504
+ protected get ariaChecked(): string | null;
384
505
  protected get externalPseudoCheckbox(): boolean;
385
506
  /**
386
507
  * Whether the row itself advertises the grab. Gated on `draggable` so that a pinned option inside a
@@ -437,7 +558,7 @@ declare class KbqListOption<T = any> implements OnDestroy, OnInit, IFocusableOpt
437
558
  /** The option's host DOM element. */
438
559
  getHostElement(): HTMLElement;
439
560
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqListOption<any>, never>;
440
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqListOption<any>, "kbq-list-option", ["kbqListOption"], { "checkboxPosition": { "alias": "checkboxPosition"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "draggable": { "alias": "draggable"; "required": false; }; "showCheckbox": { "alias": "showCheckbox"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; }, {}, ["actionButton", "pseudoCheckbox", "dragHandles", "tooltipTrigger", "dropdownTrigger"], ["kbq-pseudo-checkbox", "[kbq-icon]", "*", "[kbq-list-option-caption]", "kbq-option-action"], true, [{ directive: typeof i1.CdkDrag; inputs: {}; outputs: {}; }]>;
561
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqListOption<any>, "kbq-list-option", ["kbqListOption"], { "checkboxPosition": { "alias": "checkboxPosition"; "required": false; "isSignal": true; }; "selectAllRow": { "alias": "selectAllRow"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "draggable": { "alias": "draggable"; "required": false; }; "showCheckbox": { "alias": "showCheckbox"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; }, {}, ["actionButton", "pseudoCheckbox", "dragHandles", "tooltipTrigger", "dropdownTrigger"], ["kbq-pseudo-checkbox", "[kbq-icon]", "*", "[kbq-list-option-caption]", "kbq-option-action"], true, [{ directive: typeof i1.CdkDrag; inputs: {}; outputs: {}; }]>;
441
562
  static ngAcceptInputType_disabled: unknown;
442
563
  static ngAcceptInputType_draggable: unknown;
443
564
  static ngAcceptInputType_selected: unknown;
@@ -38,6 +38,8 @@ declare class KbqMarkdownModule {
38
38
 
39
39
  /**
40
40
  * Service for converting Markdown into HTML.
41
+ *
42
+ * @docs-private
41
43
  */
42
44
  declare class KbqMarkdownService {
43
45
  /**
package/modal/index.d.ts CHANGED
@@ -3,12 +3,12 @@ import * as i0 from '@angular/core';
3
3
  import { TemplateRef, Type, EventEmitter, Injector, OnInit, OnChanges, AfterViewInit, OnDestroy, ElementRef, ViewContainerRef, SimpleChanges, ComponentRef, PipeTransform, InjectionToken } from '@angular/core';
4
4
  import * as i1$1 from '@angular/cdk/overlay';
5
5
  import { OverlayRef, Overlay } from '@angular/cdk/overlay';
6
- import * as i1 from '@koobiq/components/core';
6
+ import * as i2 from '@koobiq/components/core';
7
7
  import { KbqComponentColors, KbqOverflowShadowState } from '@koobiq/components/core';
8
- import * as i2 from '@angular/cdk/a11y';
8
+ import * as i1 from '@koobiq/components/title';
9
+ import * as i2$1 from '@angular/cdk/a11y';
9
10
  import * as i3 from '@koobiq/components/button';
10
11
  import * as i4 from '@koobiq/components/icon';
11
- import * as i5 from '@koobiq/components/title';
12
12
  import * as i6 from '@angular/common';
13
13
 
14
14
  type OnClickCallback<T> = (instance: T) => (false | void | {}) | Promise<false | void | {}>;
@@ -256,7 +256,16 @@ declare abstract class KbqModalRef<C = any, R = unknown> {
256
256
  declare class KbqModalTitle {
257
257
  protected modal: KbqModalComponent<any, any>;
258
258
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqModalTitle, never>;
259
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqModalTitle, "[kbq-modal-title], kbq-modal-title, [kbqModalTitle]", never, {}, {}, never, ["*"], true, never>;
259
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqModalTitle, "[kbq-modal-title], kbq-modal-title, [kbqModalTitle]", never, {}, {}, never, ["*", "kbq-modal-caption, [kbq-modal-caption], [kbqModalCaption]"], true, never>;
260
+ }
261
+ /**
262
+ * Caption of a manually composed modal (`kbqComponent`). Projected into the header rendered by
263
+ * `KbqModalTitle`, below the title, and clamped to two lines. The resulting markup matches the
264
+ * header of a modal created via `KbqModalService.create`.
265
+ */
266
+ declare class KbqModalCaption {
267
+ static ɵfac: i0.ɵɵFactoryDeclaration<KbqModalCaption, never>;
268
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqModalCaption, "[kbq-modal-caption], kbq-modal-caption, [kbqModalCaption]", never, {}, {}, never, ["*"], true, [{ directive: typeof i1.KbqTitleDirective; inputs: {}; outputs: {}; }]>;
260
269
  }
261
270
  /**
262
271
  * Scrollable body of a manually composed modal (`kbqComponent`). Publishes its scroll-shadow
@@ -268,7 +277,7 @@ declare class KbqModalBody {
268
277
  private readonly overflowContainer;
269
278
  constructor();
270
279
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqModalBody, never>;
271
- static ɵdir: i0.ɵɵDirectiveDeclaration<KbqModalBody, "[kbq-modal-body], kbq-modal-body, [kbqModalBody]", never, {}, {}, never, never, true, [{ directive: typeof i1.KbqOverflowShadowContainer; inputs: {}; outputs: {}; }]>;
280
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KbqModalBody, "[kbq-modal-body], kbq-modal-body, [kbqModalBody]", never, {}, {}, never, never, true, [{ directive: typeof i2.KbqOverflowShadowContainer; inputs: {}; outputs: {}; }]>;
272
281
  }
273
282
  declare class KbqModalFooter {
274
283
  protected modal: KbqModalComponent<any, any>;
@@ -288,7 +297,7 @@ declare class CssUnitPipe implements PipeTransform {
288
297
 
289
298
  declare class KbqModalModule {
290
299
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqModalModule, never>;
291
- static ɵmod: i0.ɵɵNgModuleDeclaration<KbqModalModule, never, [typeof i1$1.OverlayModule, typeof i2.A11yModule, typeof i3.KbqButtonModule, typeof i4.KbqIconModule, typeof i5.KbqTitleModule, typeof i6.NgTemplateOutlet, typeof KbqModalComponent, typeof KbqModalTitle, typeof KbqModalBody, typeof KbqModalFooter, typeof CssUnitPipe, typeof KbqModalMainAction], [typeof KbqModalComponent, typeof KbqModalTitle, typeof KbqModalBody, typeof KbqModalFooter, typeof KbqModalMainAction]>;
300
+ static ɵmod: i0.ɵɵNgModuleDeclaration<KbqModalModule, never, [typeof i1$1.OverlayModule, typeof i2$1.A11yModule, typeof i3.KbqButtonModule, typeof i4.KbqIconModule, typeof i1.KbqTitleModule, typeof i6.NgTemplateOutlet, typeof KbqModalComponent, typeof KbqModalTitle, typeof KbqModalCaption, typeof KbqModalBody, typeof KbqModalFooter, typeof CssUnitPipe, typeof KbqModalMainAction], [typeof KbqModalComponent, typeof KbqModalTitle, typeof KbqModalCaption, typeof KbqModalBody, typeof KbqModalFooter, typeof KbqModalMainAction]>;
292
301
  static ɵinj: i0.ɵɵInjectorDeclaration<KbqModalModule>;
293
302
  }
294
303
 
@@ -326,5 +335,5 @@ declare class KbqModalService {
326
335
  static ɵprov: i0.ɵɵInjectableDeclaration<KbqModalService>;
327
336
  }
328
337
 
329
- export { KBQ_MODAL_DATA, KbqModalBody, KbqModalComponent, KbqModalFooter, KbqModalMainAction, KbqModalModule, KbqModalRef, KbqModalService, KbqModalTitle, MODAL_ANIMATE_DURATION, ModalBuilderForService, ModalSize };
338
+ export { KBQ_MODAL_DATA, KbqModalBody, KbqModalCaption, KbqModalComponent, KbqModalFooter, KbqModalMainAction, KbqModalModule, KbqModalRef, KbqModalService, KbqModalTitle, MODAL_ANIMATE_DURATION, ModalBuilderForService, ModalSize };
330
339
  export type { ConfirmType, IModalButtonOptions, IModalOptionsForService, ModalOptions, ModalType, OnClickCallback };
@@ -19,6 +19,11 @@
19
19
 
20
20
  justify-content: center;
21
21
 
22
+ // Hit area over the margin this item is spaced with, so the highlight does not drop out between
23
+ // items (DS-2558) — the transparent pseudo-element is hit-tested as part of the item, so hover and
24
+ // click both reach it. `:after` below paints the highlight, at the item's own box. The same
25
+ // technique is written twice more: `select.item-active-area()` for a plain vertical list, and
26
+ // `--kbq-button-toggle-size-item-hit-area-*` for a group whose `gap` two neighbours have to tile.
22
27
  &:before {
23
28
  top: calc(-1 * #{var(--kbq-size-s)});
24
29
  left: calc(-1 * #{var(--kbq-size-s)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koobiq/components",
3
- "version": "20.3.1",
3
+ "version": "20.4.0",
4
4
  "description": "koobiq",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,8 +25,8 @@
25
25
  "@angular/cdk": ">=20.0.0",
26
26
  "@angular/core": ">=20.0.0",
27
27
  "@angular/forms": ">=20.0.0",
28
- "@koobiq/angular-moment-adapter": "20.3.1",
29
- "@koobiq/angular-luxon-adapter": "20.3.1",
28
+ "@koobiq/angular-moment-adapter": "20.4.0",
29
+ "@koobiq/angular-luxon-adapter": "20.4.0",
30
30
  "@koobiq/date-formatter": "^3.2.3",
31
31
  "@koobiq/icons": "^11.1.3",
32
32
  "@koobiq/design-tokens": "^3.14.0"