@koobiq/components 20.3.1 → 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 (92) 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 +43 -5
  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-list.mjs +3 -3
  34. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  35. package/fesm2022/koobiq-components-markdown.mjs +6 -2
  36. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  37. package/fesm2022/koobiq-components-modal.mjs +48 -7
  38. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  39. package/fesm2022/koobiq-components-select.mjs +98 -11
  40. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  41. package/fesm2022/koobiq-components-sidebar.mjs +5 -1
  42. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  43. package/fesm2022/koobiq-components-sidepanel.mjs +25 -6
  44. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  45. package/fesm2022/koobiq-components-tabs.mjs +7 -1
  46. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  47. package/fesm2022/koobiq-components-time-range.mjs +388 -74
  48. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  49. package/fesm2022/koobiq-components-timezone.mjs +2 -2
  50. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  51. package/fesm2022/koobiq-components-title.mjs +15 -3
  52. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  53. package/fesm2022/koobiq-components-tree-select.mjs +2 -2
  54. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  55. package/fesm2022/koobiq-components-tree.mjs +14 -4
  56. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  57. package/file-upload/file-upload.scss +11 -0
  58. package/file-upload/index.d.ts +1 -1
  59. package/file-upload/multiple-file-upload.component.scss +15 -3
  60. package/file-upload/single-file-upload.component.scss +10 -2
  61. package/filter-bar/filter-bar-tokens.scss +2 -1
  62. package/filter-bar/index.d.ts +25 -4
  63. package/filter-bar/pipes/base-pipe.scss +13 -6
  64. package/filter-bar/pipes/pipe-input.scss +3 -1
  65. package/link/_link-theme.scss +50 -15
  66. package/markdown/index.d.ts +2 -0
  67. package/modal/index.d.ts +16 -7
  68. package/navbar/_navbar-item_horizontal.scss +5 -0
  69. package/package.json +3 -3
  70. package/prebuilt-themes/dark-theme.css +1 -1
  71. package/prebuilt-themes/light-theme.css +1 -1
  72. package/prebuilt-themes/theme.css +1 -1
  73. package/schematics/migrations/alert-signals/index.js +4 -1
  74. package/schematics/migrations/autocomplete-panel-width-auto/index.js +3 -34
  75. package/schematics/migrations/empty-state-size-attr/index.js +3 -34
  76. package/schematics/migrations/filter-bar-signals/index.js +4 -1
  77. package/schematics/migrations/loader-overlay-size-attr/index.js +3 -34
  78. package/schematics/migrations/v20-upgrade/index.js +4 -1
  79. package/schematics/ng-add/index.js +1 -1
  80. package/schematics/utils/angular-parsing.js +11 -12
  81. package/schematics/utils/package-config.js +5 -4
  82. package/schematics/utils/typescript.js +24 -0
  83. package/select/_select-theme.scss +9 -1
  84. package/select/index.d.ts +12 -2
  85. package/select/select.scss +13 -0
  86. package/sidebar/index.d.ts +1 -0
  87. package/sidepanel/index.d.ts +9 -0
  88. package/tabs/index.d.ts +1 -0
  89. package/time-range/index.d.ts +140 -5
  90. package/time-range/time-range.scss +16 -1
  91. package/title/index.d.ts +10 -2
  92. package/tree/index.d.ts +1 -0
@@ -45,13 +45,16 @@
45
45
  overflow: hidden;
46
46
 
47
47
  & > .kbq-accordion-content__body {
48
+ // Nested contents must not inherit this host's pinned height.
49
+ --kbq-accordion-content-height: initial;
50
+
48
51
  margin: unset;
49
52
  padding: var(--kbq-accordion-size-item-content-padding);
50
53
  }
51
54
 
52
55
  &[data-state='open'] {
53
56
  transition: height 300ms ease-out;
54
- height: var(--kbq-accordion-content-height);
57
+ height: var(--kbq-accordion-content-height, auto);
55
58
  }
56
59
 
57
60
  &[data-state='closed'] {
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, AfterViewInit, OnDestroy, ChangeDetectorRef, AfterContentInit, ElementRef, Signal } from '@angular/core';
2
+ import { InjectionToken, AfterViewInit, OnDestroy, OnInit, ChangeDetectorRef, AfterContentInit, ElementRef, Signal, DoCheck } from '@angular/core';
3
3
  import { FocusMonitor, FocusKeyManager } from '@angular/cdk/a11y';
4
4
  import { Directionality } from '@angular/cdk/bidi';
5
5
  import { UniqueSelectionDispatcher } from '@angular/cdk/collections';
@@ -86,6 +86,7 @@ declare class KbqAccordionTriggerDirective {
86
86
  }
87
87
 
88
88
  declare class KbqAccordionTrigger implements AfterViewInit, OnDestroy {
89
+ private readonly platform;
89
90
  /** @docs-private */
90
91
  protected readonly nativeElement: HTMLElement;
91
92
  /** @docs-private */
@@ -108,7 +109,7 @@ declare class KbqAccordionTrigger implements AfterViewInit, OnDestroy {
108
109
  }
109
110
 
110
111
  type KbqAccordionItemState = 'open' | 'closed';
111
- declare class KbqAccordionItem implements OnDestroy {
112
+ declare class KbqAccordionItem implements OnInit, OnDestroy {
112
113
  /**
113
114
  * The accordion this item belongs to — always the nearest one, because it is injected.
114
115
  * The accordion reads it back to tell its own items apart from a nested accordion's.
@@ -131,10 +132,14 @@ declare class KbqAccordionItem implements OnDestroy {
131
132
  get dataState(): KbqAccordionItemState;
132
133
  /** The layout orientation inherited from the parent accordion. @docs-private */
133
134
  get orientation(): KbqAccordionOrientation;
134
- /** Whether the AccordionItem is expanded. */
135
+ /**
136
+ * Whether the AccordionItem is expanded. When the accordion initializes, its controlled `value`, the saved
137
+ * state and `defaultValue` take precedence over it.
138
+ */
135
139
  get expanded(): boolean;
136
140
  set expanded(expanded: boolean);
137
141
  private _expanded;
142
+ private initialized;
138
143
  /**
139
144
  * The item's own `value` input. Must stay `public`: a `protected` input cannot be bound from a
140
145
  * consumer template (TS2445 under full AOT template type-checking).
@@ -162,6 +167,7 @@ declare class KbqAccordionItem implements OnDestroy {
162
167
  /** Subscription to openAll/closeAll events. */
163
168
  private openCloseAllSubscription;
164
169
  constructor();
170
+ ngOnInit(): void;
165
171
  ngOnDestroy(): void;
166
172
  /** Moves focus to the item's trigger. */
167
173
  focus(): void;
@@ -177,6 +183,8 @@ declare class KbqAccordionItem implements OnDestroy {
177
183
  disableAnimation(): void;
178
184
  /** Restores the open/close animation of the item's content and chevron. @docs-private */
179
185
  enableAnimation(): void;
186
+ /** Emits the expanded state and propagates it to the siblings, the content and the saved state. */
187
+ private reportExpanded;
180
188
  private subscribeToOpenCloseAllActions;
181
189
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqAccordionItem, never>;
182
190
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqAccordionItem, "kbq-accordion-item, [kbq-accordion-item]", never, { "expanded": { "alias": "expanded"; "required": false; }; "valueInput": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "closed": "closed"; "opened": "opened"; "expandedChange": "expandedChange"; }, ["trigger", "triggerComponent", "content"], never, true, never>;
@@ -279,6 +287,11 @@ declare class KbqAccordion implements OnDestroy, AfterViewInit, AfterContentInit
279
287
  private readonly defaultValueArray;
280
288
  private _id;
281
289
  private state;
290
+ /**
291
+ * Whether the saved state has been read. An item reports a static `[expanded]` from its own `ngOnInit`,
292
+ * which runs before `ngAfterContentInit`, and writing then would replace the saved state before it is read.
293
+ */
294
+ private stateRestored;
282
295
  constructor();
283
296
  ngAfterContentInit(): void;
284
297
  ngAfterViewInit(): void;
@@ -312,8 +325,10 @@ declare class KbqAccordion implements OnDestroy, AfterViewInit, AfterContentInit
312
325
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqAccordion, "kbq-accordion, [kbq-accordion]", never, { "useStateSaving": { "alias": "useStateSaving"; "required": false; "isSignal": true; }; "stateSavingKey": { "alias": "stateSavingKey"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "level": { "alias": "level"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "valueInput": { "alias": "value"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, ["allItems"], ["*"], true, never>;
313
326
  }
314
327
 
315
- declare class KbqAccordionContentDirective implements AfterViewInit {
328
+ declare class KbqAccordionContentDirective implements OnInit, DoCheck, AfterViewInit {
316
329
  private readonly renderer;
330
+ private readonly platform;
331
+ private readonly injector;
317
332
  /** @docs-private */
318
333
  protected readonly nativeElement: HTMLElement;
319
334
  /** @docs-private */
@@ -325,23 +340,32 @@ declare class KbqAccordionContentDirective implements AfterViewInit {
325
340
  /** @docs-private */
326
341
  protected readonly hidden: _angular_core.WritableSignal<boolean>;
327
342
  private savedTransition;
328
- private readonly afterRenderRef?;
329
- /** Whether the first browser render has happened, i.e. whether the content can be measured. */
343
+ /** Whether the first browser render has happened; until then a toggle only sets the initial state. */
330
344
  private rendered;
331
345
  constructor();
346
+ ngOnInit(): void;
347
+ ngDoCheck(): void;
332
348
  ngAfterViewInit(): void;
333
349
  toggle(): void;
350
+ /** @docs-private */
351
+ protected onTransitionEnd(event: TransitionEvent): void;
334
352
  disableAnimation(): void;
335
353
  enableAnimation(): void;
336
354
  /**
337
- * Publishes the natural height of the projected content as `--kbq-accordion-content-height`,
338
- * which the open state animates towards.
355
+ * Pins the height the transition runs between: the natural height of the content when expanding,
356
+ * the current one when collapsing. The pin is released once the transition ends, so expanded
357
+ * content keeps `height: auto` and follows its own size — its container can be laid out later
358
+ * (a content panel, an overlay) or resized, and nested items can toggle.
339
359
  *
340
- * `scrollHeight` is used rather than `getBoundingClientRect()`: the host is `overflow: hidden`
341
- * and collapsed to `height: 0` while closed, so its box reports `0`, whereas `scrollHeight`
342
- * still reports the height of the content it clips.
360
+ * `scrollHeight` reports the natural height even while the `overflow: hidden` host is collapsed.
343
361
  */
344
- private updateHeight;
362
+ private pinHeight;
363
+ /** Checks the pin once `data-state` has flipped. */
364
+ private settleHeight;
365
+ /** Whether a height transition runs on the host; `undefined` without the Web Animations API. */
366
+ private isHeightTransitionRunning;
367
+ private setHeight;
368
+ private releaseHeight;
345
369
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqAccordionContentDirective, never>;
346
370
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqAccordionContentDirective, "[kbqAccordionContent]", ["kbqAccordionContent"], {}, {}, never, never, true, never>;
347
371
  }
package/alert/index.d.ts CHANGED
@@ -42,6 +42,7 @@ declare class KbqAlertControl {
42
42
  * technology announces it — see the component guide.
43
43
  */
44
44
  declare class KbqAlert {
45
+ private readonly elementRef;
45
46
  /** @docs-private */
46
47
  protected readonly iconItem: _angular_core.Signal<KbqIconItem | undefined>;
47
48
  /** @docs-private */
@@ -74,7 +75,14 @@ declare class KbqAlert {
74
75
  protected readonly projectedIcon: _angular_core.Signal<KbqIcon | undefined>;
75
76
  /** Last color this component auto-assigned to the icon; lets us correct color on change without ignoring consumer's color. */
76
77
  private lastAutoColor;
78
+ /** Guards the dev-mode double-icon warning so it fires once per instance. */
79
+ private multipleIconsWarned;
77
80
  constructor();
81
+ /**
82
+ * The icon slot projects `[kbq-icon]` and `[kbq-icon-item]` alike, and the two register under separate DI
83
+ * tokens, so projecting both renders two icons side by side while only the `KbqIcon` is auto-tinted.
84
+ */
85
+ private warnOnMultipleProjectedIcons;
78
86
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqAlert, never>;
79
87
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqAlert, "kbq-alert", ["kbqAlert"], { "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "alertStyle": { "alias": "alertStyle"; "required": false; "isSignal": true; }; "alertColor": { "alias": "alertColor"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, ["iconItem", "icon", "button", "title", "control", "closeButton"], ["[kbq-icon-item],[kbq-icon]", "[kbq-alert-title]", "*", "[kbq-alert-control]", "[kbq-alert-close-button]"], true, never>;
80
88
  }
@@ -133,9 +133,11 @@ declare class KbqBreadcrumbsSeparator {
133
133
  * Directive to style and configure buttons used as breadcrumb items.
134
134
  * - Inherits focus management behavior from `RdxRovingFocusItemDirective`.
135
135
  * - Optionally injects `KbqButton` to customize its style for breadcrumb usage.
136
+ * - Sets `type="button"` on a `<button>` host, so a breadcrumb never submits a surrounding form.
136
137
  */
137
138
  declare class KbqBreadcrumbButton implements OnInit {
138
139
  private readonly button;
140
+ protected readonly element: HTMLElement;
139
141
  ngOnInit(): void;
140
142
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqBreadcrumbButton, never>;
141
143
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqBreadcrumbButton, "[kbq-button][kbqBreadcrumb]", never, {}, {}, never, never, true, [{ directive: typeof RdxRovingFocusItemDirective; inputs: { "focusable": "focusable"; }; outputs: {}; }]>;
@@ -11,6 +11,20 @@
11
11
  --kbq-button-toggle-size-item-padding-vertical: var(--kbq-size-3xs);
12
12
  --kbq-button-toggle-size-item-content-gap-horizontal: var(--kbq-size-xxs);
13
13
  --kbq-button-toggle-size-item-focus-outline-width: var(--kbq-size-3xs);
14
+ // How far an item's hit area reaches past the pill it paints. Measured from the inner button's
15
+ // border box, one item border inside the item's own — hence the border-width term in each. `-gap` is
16
+ // the half of the inter-item gap an item claims; the other two cover the group's padding. The
17
+ // pseudo-element they offset is in button-toggle.scss, next to the note on the two other places
18
+ // this repo extends a hit area the same way.
19
+ --kbq-button-toggle-size-item-hit-area-gap: calc(
20
+ var(--kbq-size-border-width) + var(--kbq-button-toggle-size-container-content-gap-horizontal) / 2
21
+ );
22
+ --kbq-button-toggle-size-item-hit-area-horizontal: calc(
23
+ var(--kbq-size-border-width) + var(--kbq-button-toggle-size-container-padding-horizontal)
24
+ );
25
+ --kbq-button-toggle-size-item-hit-area-vertical: calc(
26
+ var(--kbq-size-border-width) + var(--kbq-button-toggle-size-container-padding-vertical)
27
+ );
14
28
  /* THEME TOKENS */
15
29
  --kbq-button-toggle-container-background: var(--kbq-background-contrast-fade);
16
30
  --kbq-button-toggle-item-default-background: var(--kbq-background-transparent);
@@ -17,17 +17,31 @@
17
17
 
18
18
  .kbq-button-toggle {
19
19
  display: flex;
20
- overflow: hidden;
21
20
  justify-content: flex-start;
22
21
  align-items: center;
23
22
 
23
+ // Must not clip: the button's hit area below reaches outside this box. Not `overflow: clip` with
24
+ // an `overflow-clip-margin` — Chromium rejects math functions there, so the margin cannot follow
25
+ // the tokens the offsets come from and computes to `0px`, clipping the hit area away.
26
+
27
+ // What the item stops containing, and why nothing here takes it back: a toggle projects its
28
+ // content into the button's own `.kbq-button-text`, which keeps the `overflow: hidden` of
29
+ // `kbq-truncate-line()`, so content still cannot spill sideways past the button's content box.
30
+ // Content *taller* than the fixed item height no longer is — and cannot be re-clipped from
31
+ // inside the button, since the only boxes there with a definite height are the button itself,
32
+ // whose `::before` this exists for, and the label box, which would clip its own descenders.
33
+ overflow: visible;
34
+
35
+ // What that clip used to give for free: a flex item's automatic minimum size is zero only while
36
+ // its `overflow` is non-`visible`, and that is what lets the label truncate.
37
+ min-width: 0;
38
+
24
39
  // Content-box on purpose, and load-bearing. `--kbq-button-toggle-size-item-height` is 22px,
25
40
  // not the 24px of the design's `--kbq-size-xxl`: DS-3136 subtracted the border it added here
26
41
  // from the token rather than from the rendered box, so the item only reaches its designed
27
42
  // 24px while the border sits outside the declared height. A global `border-box` reset in a
28
43
  // consuming application would pull the border back inside and leave the item 2px short —
29
- // and the inner button, which is sized from the same token, would overflow the shrunken
30
- // content box and be clipped by `overflow: hidden` above.
44
+ // and the inner button, which is sized from the same token, would then spill past it.
31
45
  box-sizing: content-box;
32
46
 
33
47
  height: var(--kbq-button-toggle-size-item-height);
@@ -57,6 +71,21 @@
57
71
  button-toggle-size-item-focus-outline-width]
58
72
  );
59
73
 
74
+ // Hit area over the gutters the group's `gap` and `padding` leave around the pill this button
75
+ // paints, so the highlight does not drop out between segments. On the button, not the item
76
+ // host, so pointer events resolve to it and the gutter is clickable too. `::before` because
77
+ // `::after` is the `.kbq-progress` shimmer. Offsets are per orientation, below.
78
+
79
+ // The third place this repo extends a hit area with a transparent pseudo-element, after
80
+ // `.kbq-navbar-item`'s `:before` (DS-2558) and `select.item-active-area()`. Neither is
81
+ // reusable here: the mixin claims a fixed strip on one side of a plain vertical list, with
82
+ // no gap to tile between two neighbours, no group padding at the ends, and no orientation
83
+ // to swap the axes for.
84
+ &:before {
85
+ content: '';
86
+ position: absolute;
87
+ }
88
+
60
89
  & .kbq-button-wrapper {
61
90
  width: 100%;
62
91
  }
@@ -81,6 +110,16 @@
81
110
  }
82
111
  }
83
112
 
113
+ // Hit-area offsets, one orientation each — the vertical block below is this one with the axes
114
+ // swapped. The gap is split at its midline so two neighbours tile it rather than overlap, which would
115
+ // hand the whole gutter to whichever paints last; the outermost sides have no neighbour to share with
116
+ // and take the group's padding instead, leaving no point inside the group unclaimed.
117
+
118
+ // `:first-of-type`/`:last-of-type`, not `:first-child`/`:last-child`: the group is a bare directive
119
+ // with no template, so a consumer's own element — a divider, a leading icon — is rendered as a real
120
+ // child among the toggles and would take the positional match away from the toggle that actually sits
121
+ // at the edge, putting the dead zone back. The class only ever lands on a `kbq-button-toggle` element,
122
+ // so matching by type reads the toggles alone.
84
123
  &:not(.kbq-button-toggle_vertical) {
85
124
  .kbq-button-toggle {
86
125
  > .kbq-button,
@@ -88,6 +127,39 @@
88
127
  max-width: 100%;
89
128
 
90
129
  height: var(--kbq-button-toggle-size-item-height);
130
+
131
+ &:before {
132
+ inset-block: calc(-1 * var(--kbq-button-toggle-size-item-hit-area-vertical));
133
+ inset-inline: calc(-1 * var(--kbq-button-toggle-size-item-hit-area-gap));
134
+ }
135
+ }
136
+
137
+ &:first-of-type > :is(.kbq-button, .kbq-button-icon):before {
138
+ inset-inline-start: calc(-1 * var(--kbq-button-toggle-size-item-hit-area-horizontal));
139
+ }
140
+
141
+ &:last-of-type > :is(.kbq-button, .kbq-button-icon):before {
142
+ inset-inline-end: calc(-1 * var(--kbq-button-toggle-size-item-hit-area-horizontal));
143
+ }
144
+ }
145
+ }
146
+
147
+ &.kbq-button-toggle_vertical {
148
+ .kbq-button-toggle {
149
+ > .kbq-button,
150
+ > .kbq-button-icon {
151
+ &:before {
152
+ inset-inline: calc(-1 * var(--kbq-button-toggle-size-item-hit-area-horizontal));
153
+ inset-block: calc(-1 * var(--kbq-button-toggle-size-item-hit-area-gap));
154
+ }
155
+ }
156
+
157
+ &:first-of-type > :is(.kbq-button, .kbq-button-icon):before {
158
+ inset-block-start: calc(-1 * var(--kbq-button-toggle-size-item-hit-area-vertical));
159
+ }
160
+
161
+ &:last-of-type > :is(.kbq-button, .kbq-button-icon):before {
162
+ inset-block-end: calc(-1 * var(--kbq-button-toggle-size-item-hit-area-vertical));
91
163
  }
92
164
  }
93
165
  }
package/core/index.d.ts CHANGED
@@ -830,6 +830,11 @@ type KbqTimeRangeLocaleConfig = {
830
830
  apply: string;
831
831
  cancel: string;
832
832
  rangeLabel: string;
833
+ /**
834
+ * Reported when both ends of the range leave `minDate`/`maxDate`. Supports the `{{ value }}` placeholder.
835
+ * Optional, so a configuration written before it existed still compiles and gets the default wording.
836
+ */
837
+ outOfBoundsError?: string;
833
838
  allTime: string;
834
839
  currentQuarter: string;
835
840
  currentYear: string;
@@ -1032,6 +1037,7 @@ declare const enUSLocaleData: {
1032
1037
  apply: string;
1033
1038
  cancel: string;
1034
1039
  rangeLabel: string;
1040
+ outOfBoundsError: string;
1035
1041
  allTime: string;
1036
1042
  currentQuarter: string;
1037
1043
  currentYear: string;
@@ -1234,6 +1240,7 @@ declare const esLALocaleData: {
1234
1240
  apply: string;
1235
1241
  cancel: string;
1236
1242
  rangeLabel: string;
1243
+ outOfBoundsError: string;
1237
1244
  allTime: string;
1238
1245
  currentQuarter: string;
1239
1246
  currentYear: string;
@@ -1436,6 +1443,7 @@ declare const ptBRLocaleData: {
1436
1443
  apply: string;
1437
1444
  cancel: string;
1438
1445
  rangeLabel: string;
1446
+ outOfBoundsError: string;
1439
1447
  allTime: string;
1440
1448
  currentQuarter: string;
1441
1449
  currentYear: string;
@@ -1639,6 +1647,7 @@ declare const ruRULocaleData: {
1639
1647
  apply: string;
1640
1648
  cancel: string;
1641
1649
  rangeLabel: string;
1650
+ outOfBoundsError: string;
1642
1651
  allTime: string;
1643
1652
  currentQuarter: string;
1644
1653
  currentYear: string;
@@ -1842,6 +1851,7 @@ declare const tkTMLocaleData: {
1842
1851
  apply: string;
1843
1852
  cancel: string;
1844
1853
  rangeLabel: string;
1854
+ outOfBoundsError: string;
1845
1855
  allTime: string;
1846
1856
  currentQuarter: string;
1847
1857
  currentYear: string;
@@ -2277,6 +2287,7 @@ declare function KBQ_DEFAULT_LOCALE_DATA_FACTORY(): {
2277
2287
  apply: string;
2278
2288
  cancel: string;
2279
2289
  rangeLabel: string;
2290
+ outOfBoundsError: string;
2280
2291
  allTime: string;
2281
2292
  currentQuarter: string;
2282
2293
  currentYear: string;
@@ -2516,6 +2527,7 @@ declare function KBQ_DEFAULT_LOCALE_DATA_FACTORY(): {
2516
2527
  apply: string;
2517
2528
  cancel: string;
2518
2529
  rangeLabel: string;
2530
+ outOfBoundsError: string;
2519
2531
  allTime: string;
2520
2532
  currentQuarter: string;
2521
2533
  currentYear: string;
@@ -2751,6 +2763,7 @@ declare function KBQ_DEFAULT_LOCALE_DATA_FACTORY(): {
2751
2763
  apply: string;
2752
2764
  cancel: string;
2753
2765
  rangeLabel: string;
2766
+ outOfBoundsError: string;
2754
2767
  allTime: string;
2755
2768
  currentQuarter: string;
2756
2769
  currentYear: string;
@@ -2992,6 +3005,7 @@ declare function KBQ_DEFAULT_LOCALE_DATA_FACTORY(): {
2992
3005
  apply: string;
2993
3006
  cancel: string;
2994
3007
  rangeLabel: string;
3008
+ outOfBoundsError: string;
2995
3009
  allTime: string;
2996
3010
  currentQuarter: string;
2997
3011
  currentYear: string;
@@ -3229,6 +3243,7 @@ declare function KBQ_DEFAULT_LOCALE_DATA_FACTORY(): {
3229
3243
  apply: string;
3230
3244
  cancel: string;
3231
3245
  rangeLabel: string;
3246
+ outOfBoundsError: string;
3232
3247
  allTime: string;
3233
3248
  currentQuarter: string;
3234
3249
  currentYear: string;
@@ -4911,6 +4926,15 @@ declare const kbqInjectNativeElement: <T extends Element = HTMLElement>() => T;
4911
4926
  * revealing it would shift the list out from under it.
4912
4927
  */
4913
4928
  declare const kbqFocusAndReveal: (element: HTMLElement, skipReveal?: boolean) => void;
4929
+ /**
4930
+ * Rendered height of an element, or `0` when it has no box.
4931
+ *
4932
+ * `getClientRects()` returns an empty list for elements that are not laid out and is missing entirely
4933
+ * from the server DOM, so both the method and the first rect are read defensively rather than going
4934
+ * through `getBoundingClientRect()`, whose zeroes are indistinguishable from a genuinely collapsed
4935
+ * element.
4936
+ */
4937
+ declare const kbqGetElementHeight: (element: Element) => number;
4914
4938
 
4915
4939
  declare function isBoolean(value: unknown): value is boolean;
4916
4940
  /** Whether the value is undefined. */
@@ -5396,6 +5420,14 @@ declare class KbqSelectFooter {
5396
5420
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqSelectFooter, never>;
5397
5421
  static ɵdir: i0.ɵɵDirectiveDeclaration<KbqSelectFooter, "kbq-select-footer, [kbq-select-footer]", never, {}, {}, never, never, true, never>;
5398
5422
  }
5423
+ /**
5424
+ * Action inside a `kbq-select-footer`, drawn as a row of the drop-down menu rather than as a form
5425
+ * button. Apply it to a native `button` or `a` so activation and semantics stay native.
5426
+ */
5427
+ declare class KbqSelectFooterItem {
5428
+ static ɵfac: i0.ɵɵFactoryDeclaration<KbqSelectFooterItem, never>;
5429
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KbqSelectFooterItem, "[kbq-select-footer-item]", never, {}, {}, never, never, true, never>;
5430
+ }
5399
5431
  declare class KbqSelectSearch implements AfterContentInit, OnDestroy {
5400
5432
  protected formField: KbqFormFieldRef;
5401
5433
  readonly changes: EventEmitter<string>;
@@ -5821,5 +5853,5 @@ declare const validationTooltipHideDelay = 3000;
5821
5853
 
5822
5854
  declare const VERSION: Version;
5823
5855
 
5824
- export { A, ALT, APOSTROPHE, ARROW_BOTTOM_MARGIN_AND_HALF_HEIGHT, AT_SIGN, AbsoluteDateFormatterImpurePipe, AbsoluteDateFormatterPipe, AbsoluteDateShortFormatterImpurePipe, AbsoluteDateShortFormatterPipe, AbsoluteDateTimeFormatterImpurePipe, AbsoluteDateTimeFormatterPipe, AbsoluteShortDateTimeFormatterImpurePipe, AbsoluteShortDateTimeFormatterPipe, ActiveDescendantKeyManager, B, BACKSLASH, BACKSPACE, BOTTOM_LEFT_POSITION_PRIORITY, BOTTOM_POSITION_PRIORITY, BOTTOM_RIGHT_POSITION_PRIORITY, BaseFormatterPipe, BaseLocaleAwareFormatterPipe, C, CAPS_LOCK, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, D, DASH, DELETE, DOWN_ARROW, DateAdapter, DateFormatter, DurationLongFormatterImpurePipe, DurationLongFormatterPipe, DurationShortFormatterImpurePipe, DurationShortFormatterPipe, DurationShortestFormatterImpurePipe, DurationShortestFormatterPipe, E, EIGHT, END, ENTER, EQUALS, ESCAPE, EXTENDED_OVERLAY_POSITIONS, EmptyFocusTrapStrategy, ErrorStateMatcher, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FOUR, FileValidators, FocusKeyManager, G, H, HOME, I, INSERT, J, K, KBQ_A11Y_LOCALE_CONFIGURATION, KBQ_CHECKABLE_CLICK_ACTION, KBQ_CHECKABLE_CONTROL_VALUE_ACCESSOR, KBQ_CONNECTED_OVERLAY_ABOVE_CLASS, KBQ_CONNECTED_OVERLAY_BELOW_CLASS, KBQ_CONNECTED_OVERLAY_ORIGIN, KBQ_CONNECTED_OVERLAY_OVERLAP_CLASS, KBQ_CUSTOM_SCROLL_STRATEGY_PROVIDER, KBQ_DATE_FORMATS, KBQ_DATE_LOCALE, KBQ_DATE_LOCALE_FACTORY, KBQ_DATE_TIMEZONE, KBQ_DEFAULT_LOCALE_DATA_FACTORY, KBQ_DEFAULT_LOCALE_ID, KBQ_DEFAULT_PRECISION_SEPARATOR, KBQ_FORM_FIELD_REF, KBQ_INVALID_VALUE_ERROR, KBQ_LOCALE_DATA, KBQ_LOCALE_ID, KBQ_LOCALE_SERVICE, KBQ_LOCALE_SERVICE_LANG_ATTR_NAME, KBQ_NUMBER_FORMATTER_DEFAULT_OPTIONS, KBQ_NUMBER_FORMATTER_OPTIONS, KBQ_OPTION_ACTION_PARENT, KBQ_OPTION_PARENT_COMPONENT, KBQ_OVERFLOW_SHADOW_SOURCE, KBQ_PANEL_DEFAULT_MIN_WIDTH, KBQ_PARENT_ANIMATION_COMPONENT, KBQ_PARENT_POPUP, KBQ_SELECT_SCROLL_STRATEGY, KBQ_SELECT_SCROLL_STRATEGY_PROVIDER, KBQ_SELECT_SEARCH_MIN_OPTIONS_THRESHOLD, KBQ_SHADOW_DOM_OVERLAY_HOST, KBQ_SIBLING_POPUP, KBQ_SIZE_UNITS_CONFIG, KBQ_SIZE_UNITS_DEFAULT_CONFIG, KBQ_TITLE_TEXT_REF, KBQ_WINDOW, KbqAbsoluteLongDatePipe, KbqAbsoluteLongDateTimePipe, KbqAbsoluteShortDatePipe, KbqAbsoluteShortDateTimePipe, KbqAbstractSelect, KbqActionContainer, KbqAnimationCurves, KbqAnimationDurations, KbqAutoHideScrollStrategy, KbqCheckable, KbqColorDirective, KbqComponentColors, KbqDataSizePipe, KbqDateTimezoneService, KbqDecimalPipe, KbqDefaultThemes, KbqDurationLongPipe, KbqDurationShortPipe, KbqDurationShortestPipe, KbqErrorStateTracker, KbqFieldSizingContent, KbqForm, KbqFormElement, KbqFormattersModule, KbqFormsModule, KbqHighlightBackgroundPipe, KbqHighlightModule, KbqHighlightPipe, KbqHover, KbqLine, KbqLineSetter, KbqLocaleService, KbqLocaleServiceModule, KbqMeasureScrollbarService, KbqMeasurementSystem, KbqNormalizeWhitespace, KbqOptgroup, KbqOption, KbqOptionActionComponent, KbqOptionBase, KbqOptionModule, KbqOptionSelectionChange, KbqOverflowShadowBottom, KbqOverflowShadowContainer, KbqOverflowShadowTop, KbqPopUp, KbqPopUpTrigger, KbqPseudoCheckbox, KbqPseudoCheckboxModule, KbqRangeLongDatePipe, KbqRangeLongDateTimePipe, KbqRangeMiddleDateTimePipe, KbqRangeShortDatePipe, KbqRangeShortDateTimePipe, KbqReadStateDirective, KbqRectangleItem, KbqRelativeLongDatePipe, KbqRelativeLongDateTimePipe, KbqRelativeShortDatePipe, KbqRelativeShortDateTimePipe, KbqRoundDecimalPipe, KbqSelectAllEvent, KbqSelectFooter, KbqSelectMatcher, KbqSelectSearch, KbqSelectSearchEmptyResult, KbqSelectTrigger, KbqShadowDomOverlayContainer, KbqTableNumberPipe, KbqThemeSelector, KbqVirtualOption, L, LAST_MEDIA, LEFT_ARROW, LEFT_BOTTOM_POSITION_PRIORITY, LEFT_POSITION_PRIORITY, LEFT_TOP_POSITION_PRIORITY, ListKeyManager, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, META, MUTE, MockNgZone, MultipleMode, N, NINE, NUMBER_FORMAT_REGEXP, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PAUSE, PERIOD, PLUS_SIGN, POSITION_MAP, POSITION_PRIORITY_STRATEGY, POSITION_TO_CSS_MAP, PRINT_SCREEN, PasswordValidators, PopUpPlacements, PopUpSizes, PopUpTriggers, PopUpVisibility, Q, QUESTION_MARK, R, RIGHT_ARROW, RIGHT_BOTTOM_POSITION_PRIORITY, RIGHT_POSITION_PRIORITY, RIGHT_TOP_POSITION_PRIORITY, RangeDateFormatterImpurePipe, RangeDateFormatterPipe, RangeDateTimeFormatterImpurePipe, RangeDateTimeFormatterPipe, RangeMiddleDateTimeFormatterImpurePipe, RangeMiddleDateTimeFormatterPipe, RangeShortDateFormatterImpurePipe, RangeShortDateFormatterPipe, RangeShortDateTimeFormatterImpurePipe, RangeShortDateTimeFormatterPipe, RelativeDateFormatterImpurePipe, RelativeDateFormatterPipe, RelativeDateTimeFormatterImpurePipe, RelativeDateTimeFormatterPipe, RelativeShortDateFormatterImpurePipe, RelativeShortDateFormatterPipe, RelativeShortDateTimeFormatterImpurePipe, RelativeShortDateTimeFormatterPipe, S, SCROLL_LOCK, SELECT_PANEL_VIEWPORT_PADDING, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, ShowOnControlDirtyErrorStateMatcher, ShowOnFormSubmitErrorStateMatcher, ShowRequiredOnSubmitErrorStateMatcher, T, TAB, THREE, TILDE, TOP_LEFT_POSITION_PRIORITY, TOP_POSITION_PRIORITY, TOP_RIGHT_POSITION_PRIORITY, TWO, ThemePalette, ThemeService, TransitionCheckState, U, UP_ARROW, V, VERSION, VOLUME_DOWN, VOLUME_UP, W, X, Y, Z, ZERO, applyPopupMargins, checkAndNormalizeLocalizedNumber, countGroupLabelsBeforeOption, createFakeEvent, createKeyboardEvent, createMouseEvent, createSearchPredicate, createTouchEvent, defaultOffsetY, dispatchEvent, dispatchFakeEvent, dispatchKeyboardEvent, dispatchMouseEvent, dispatchTouchEvent, enUSFormattersData, enUSLocaleData, esLAFormattersData, esLALocaleData, escapeRegExp, fadeAnimation, findSearchMatchRanges, formatNumberWithLocale, getFormattedSizeParts, getHumanizedBytes, getKbqSelectDynamicMultipleError, getKbqSelectNonArrayValueError, getKbqSelectNonFunctionValueError, getNodesWithoutComments, getOptionScrollPosition, getSafeTriangleVertices, getSelectAllState, hasModifierKey, isBoolean, isControl, isCopy, isDigit, isElement, isFunctionKey, isHorizontalMovement, isHtmlElement, isHtmlElementOrNull, isInput, isLeftBracket, isLetterKey, isMac, isNull, isNumberKey, isNumpadKey, isPointInRect, isPointInTriangle, isRightBracket, isSelectAll, isUndefined, isVerticalMovement, isWithin, kbqA11yLocaleConfigurationProvider, kbqAutoHideScrollStrategyFactory, kbqDateTimezoneProvider, kbqErrorStateMatcherProvider, kbqFilesizeFormatterConfigurationProvider, kbqFocusAndReveal, kbqFocusOptionActionOnTab, kbqGetPanelWidthOrigin, kbqHighlightBackgroundMark, kbqHighlightMark, kbqInjectA11yLocaleConfiguration, kbqInjectAutofilled, kbqInjectNativeElement, kbqLocaleServiceLangAttrNameProvider, kbqResolvePanelMaxHeightToken, kbqResolvePanelWidth, kbqResolveTimezoneOffset, kbqRevealSelection, kbqSelectAnimations, kbqSelectScrollStrategyProviderFactory, kbqSetSelectionRange, kbqShadowDomOverlayProvider, kbqSiblingPopupProvider, leftIconClassName, mixinColor, mixinDisabled, mixinErrorState, mixinTabIndex, normalizeNumber, normalizeSearchValue, numberByParts, patchElementFocus, ptBRFormattersData, ptBRLocaleData, rightIconClassName, ruRUFormattersData, ruRULocaleData, runCompareWith, selectEvents, shouldSelectSearchText, tkTMFormattersData, tkTMLocaleData, toggleSelectAll, tokenizeSearchQuery, typeInElement, validationTooltipHideDelay, validationTooltipShowDelay, wrappedErrorMessage };
5856
+ export { A, ALT, APOSTROPHE, ARROW_BOTTOM_MARGIN_AND_HALF_HEIGHT, AT_SIGN, AbsoluteDateFormatterImpurePipe, AbsoluteDateFormatterPipe, AbsoluteDateShortFormatterImpurePipe, AbsoluteDateShortFormatterPipe, AbsoluteDateTimeFormatterImpurePipe, AbsoluteDateTimeFormatterPipe, AbsoluteShortDateTimeFormatterImpurePipe, AbsoluteShortDateTimeFormatterPipe, ActiveDescendantKeyManager, B, BACKSLASH, BACKSPACE, BOTTOM_LEFT_POSITION_PRIORITY, BOTTOM_POSITION_PRIORITY, BOTTOM_RIGHT_POSITION_PRIORITY, BaseFormatterPipe, BaseLocaleAwareFormatterPipe, C, CAPS_LOCK, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, D, DASH, DELETE, DOWN_ARROW, DateAdapter, DateFormatter, DurationLongFormatterImpurePipe, DurationLongFormatterPipe, DurationShortFormatterImpurePipe, DurationShortFormatterPipe, DurationShortestFormatterImpurePipe, DurationShortestFormatterPipe, E, EIGHT, END, ENTER, EQUALS, ESCAPE, EXTENDED_OVERLAY_POSITIONS, EmptyFocusTrapStrategy, ErrorStateMatcher, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FOUR, FileValidators, FocusKeyManager, G, H, HOME, I, INSERT, J, K, KBQ_A11Y_LOCALE_CONFIGURATION, KBQ_CHECKABLE_CLICK_ACTION, KBQ_CHECKABLE_CONTROL_VALUE_ACCESSOR, KBQ_CONNECTED_OVERLAY_ABOVE_CLASS, KBQ_CONNECTED_OVERLAY_BELOW_CLASS, KBQ_CONNECTED_OVERLAY_ORIGIN, KBQ_CONNECTED_OVERLAY_OVERLAP_CLASS, KBQ_CUSTOM_SCROLL_STRATEGY_PROVIDER, KBQ_DATE_FORMATS, KBQ_DATE_LOCALE, KBQ_DATE_LOCALE_FACTORY, KBQ_DATE_TIMEZONE, KBQ_DEFAULT_LOCALE_DATA_FACTORY, KBQ_DEFAULT_LOCALE_ID, KBQ_DEFAULT_PRECISION_SEPARATOR, KBQ_FORM_FIELD_REF, KBQ_INVALID_VALUE_ERROR, KBQ_LOCALE_DATA, KBQ_LOCALE_ID, KBQ_LOCALE_SERVICE, KBQ_LOCALE_SERVICE_LANG_ATTR_NAME, KBQ_NUMBER_FORMATTER_DEFAULT_OPTIONS, KBQ_NUMBER_FORMATTER_OPTIONS, KBQ_OPTION_ACTION_PARENT, KBQ_OPTION_PARENT_COMPONENT, KBQ_OVERFLOW_SHADOW_SOURCE, KBQ_PANEL_DEFAULT_MIN_WIDTH, KBQ_PARENT_ANIMATION_COMPONENT, KBQ_PARENT_POPUP, KBQ_SELECT_SCROLL_STRATEGY, KBQ_SELECT_SCROLL_STRATEGY_PROVIDER, KBQ_SELECT_SEARCH_MIN_OPTIONS_THRESHOLD, KBQ_SHADOW_DOM_OVERLAY_HOST, KBQ_SIBLING_POPUP, KBQ_SIZE_UNITS_CONFIG, KBQ_SIZE_UNITS_DEFAULT_CONFIG, KBQ_TITLE_TEXT_REF, KBQ_WINDOW, KbqAbsoluteLongDatePipe, KbqAbsoluteLongDateTimePipe, KbqAbsoluteShortDatePipe, KbqAbsoluteShortDateTimePipe, KbqAbstractSelect, KbqActionContainer, KbqAnimationCurves, KbqAnimationDurations, KbqAutoHideScrollStrategy, KbqCheckable, KbqColorDirective, KbqComponentColors, KbqDataSizePipe, KbqDateTimezoneService, KbqDecimalPipe, KbqDefaultThemes, KbqDurationLongPipe, KbqDurationShortPipe, KbqDurationShortestPipe, KbqErrorStateTracker, KbqFieldSizingContent, KbqForm, KbqFormElement, KbqFormattersModule, KbqFormsModule, KbqHighlightBackgroundPipe, KbqHighlightModule, KbqHighlightPipe, KbqHover, KbqLine, KbqLineSetter, KbqLocaleService, KbqLocaleServiceModule, KbqMeasureScrollbarService, KbqMeasurementSystem, KbqNormalizeWhitespace, KbqOptgroup, KbqOption, KbqOptionActionComponent, KbqOptionBase, KbqOptionModule, KbqOptionSelectionChange, KbqOverflowShadowBottom, KbqOverflowShadowContainer, KbqOverflowShadowTop, KbqPopUp, KbqPopUpTrigger, KbqPseudoCheckbox, KbqPseudoCheckboxModule, KbqRangeLongDatePipe, KbqRangeLongDateTimePipe, KbqRangeMiddleDateTimePipe, KbqRangeShortDatePipe, KbqRangeShortDateTimePipe, KbqReadStateDirective, KbqRectangleItem, KbqRelativeLongDatePipe, KbqRelativeLongDateTimePipe, KbqRelativeShortDatePipe, KbqRelativeShortDateTimePipe, KbqRoundDecimalPipe, KbqSelectAllEvent, KbqSelectFooter, KbqSelectFooterItem, KbqSelectMatcher, KbqSelectSearch, KbqSelectSearchEmptyResult, KbqSelectTrigger, KbqShadowDomOverlayContainer, KbqTableNumberPipe, KbqThemeSelector, KbqVirtualOption, L, LAST_MEDIA, LEFT_ARROW, LEFT_BOTTOM_POSITION_PRIORITY, LEFT_POSITION_PRIORITY, LEFT_TOP_POSITION_PRIORITY, ListKeyManager, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, META, MUTE, MockNgZone, MultipleMode, N, NINE, NUMBER_FORMAT_REGEXP, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PAUSE, PERIOD, PLUS_SIGN, POSITION_MAP, POSITION_PRIORITY_STRATEGY, POSITION_TO_CSS_MAP, PRINT_SCREEN, PasswordValidators, PopUpPlacements, PopUpSizes, PopUpTriggers, PopUpVisibility, Q, QUESTION_MARK, R, RIGHT_ARROW, RIGHT_BOTTOM_POSITION_PRIORITY, RIGHT_POSITION_PRIORITY, RIGHT_TOP_POSITION_PRIORITY, RangeDateFormatterImpurePipe, RangeDateFormatterPipe, RangeDateTimeFormatterImpurePipe, RangeDateTimeFormatterPipe, RangeMiddleDateTimeFormatterImpurePipe, RangeMiddleDateTimeFormatterPipe, RangeShortDateFormatterImpurePipe, RangeShortDateFormatterPipe, RangeShortDateTimeFormatterImpurePipe, RangeShortDateTimeFormatterPipe, RelativeDateFormatterImpurePipe, RelativeDateFormatterPipe, RelativeDateTimeFormatterImpurePipe, RelativeDateTimeFormatterPipe, RelativeShortDateFormatterImpurePipe, RelativeShortDateFormatterPipe, RelativeShortDateTimeFormatterImpurePipe, RelativeShortDateTimeFormatterPipe, S, SCROLL_LOCK, SELECT_PANEL_VIEWPORT_PADDING, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, ShowOnControlDirtyErrorStateMatcher, ShowOnFormSubmitErrorStateMatcher, ShowRequiredOnSubmitErrorStateMatcher, T, TAB, THREE, TILDE, TOP_LEFT_POSITION_PRIORITY, TOP_POSITION_PRIORITY, TOP_RIGHT_POSITION_PRIORITY, TWO, ThemePalette, ThemeService, TransitionCheckState, U, UP_ARROW, V, VERSION, VOLUME_DOWN, VOLUME_UP, W, X, Y, Z, ZERO, applyPopupMargins, checkAndNormalizeLocalizedNumber, countGroupLabelsBeforeOption, createFakeEvent, createKeyboardEvent, createMouseEvent, createSearchPredicate, createTouchEvent, defaultOffsetY, dispatchEvent, dispatchFakeEvent, dispatchKeyboardEvent, dispatchMouseEvent, dispatchTouchEvent, enUSFormattersData, enUSLocaleData, esLAFormattersData, esLALocaleData, escapeRegExp, fadeAnimation, findSearchMatchRanges, formatNumberWithLocale, getFormattedSizeParts, getHumanizedBytes, getKbqSelectDynamicMultipleError, getKbqSelectNonArrayValueError, getKbqSelectNonFunctionValueError, getNodesWithoutComments, getOptionScrollPosition, getSafeTriangleVertices, getSelectAllState, hasModifierKey, isBoolean, isControl, isCopy, isDigit, isElement, isFunctionKey, isHorizontalMovement, isHtmlElement, isHtmlElementOrNull, isInput, isLeftBracket, isLetterKey, isMac, isNull, isNumberKey, isNumpadKey, isPointInRect, isPointInTriangle, isRightBracket, isSelectAll, isUndefined, isVerticalMovement, isWithin, kbqA11yLocaleConfigurationProvider, kbqAutoHideScrollStrategyFactory, kbqDateTimezoneProvider, kbqErrorStateMatcherProvider, kbqFilesizeFormatterConfigurationProvider, kbqFocusAndReveal, kbqFocusOptionActionOnTab, kbqGetElementHeight, kbqGetPanelWidthOrigin, kbqHighlightBackgroundMark, kbqHighlightMark, kbqInjectA11yLocaleConfiguration, kbqInjectAutofilled, kbqInjectNativeElement, kbqLocaleServiceLangAttrNameProvider, kbqResolvePanelMaxHeightToken, kbqResolvePanelWidth, kbqResolveTimezoneOffset, kbqRevealSelection, kbqSelectAnimations, kbqSelectScrollStrategyProviderFactory, kbqSetSelectionRange, kbqShadowDomOverlayProvider, kbqSiblingPopupProvider, leftIconClassName, mixinColor, mixinDisabled, mixinErrorState, mixinTabIndex, normalizeNumber, normalizeSearchValue, numberByParts, patchElementFocus, ptBRFormattersData, ptBRLocaleData, rightIconClassName, ruRUFormattersData, ruRULocaleData, runCompareWith, selectEvents, shouldSelectSearchText, tkTMFormattersData, tkTMLocaleData, toggleSelectAll, tokenizeSearchQuery, typeInElement, validationTooltipHideDelay, validationTooltipShowDelay, wrappedErrorMessage };
5825
5857
  export type { CanColor, CanColorCtor, CanDisable, CanDisableCtor, CanUpdateErrorState, CanUpdateErrorStateCtor, HasTabIndex, HasTabIndexCtor, Highlightable, IFocusableOption, KbqA11yLocaleConfiguration, KbqActionsPanelLocaleConfiguration, KbqAutoHideScrollStrategyConfig, KbqAutoHideScrollStrategyHooks, KbqBaseFileUploadLocaleConfig, KbqCheckableClickAction, KbqCheckableClickResult, KbqCheckedState, KbqClampedTextLocaleConfig, KbqCodeBlockLocaleConfiguration, KbqConnectedOverlayOriginProvider, KbqDateFormats, KbqDefaultSizes, KbqEnumValues, KbqFileTypeSpecifier, KbqFileUploadLocaleConfig, KbqFlexDirection, KbqFlexWrap, KbqFormFieldRef, KbqMeasurementSystemType, KbqMultipleFileUploadLocaleConfig, KbqNumberFormatOptions, KbqNumberInputLocaleConfig, KbqNumberRoundingLocaleConfig, KbqNumericPipe, KbqOptionActionParent, KbqOptionParentComponent, KbqOrientation, KbqOverflowShadowSource, KbqOverflowShadowState, KbqPanelMaxHeight, KbqPanelMaxWidth, KbqPanelMinWidth, KbqPanelWidth, KbqPanelWidthOrigin, KbqParentPopup, KbqPoint, KbqPopUpPlacementValues, KbqPopUpSizeValues, KbqPseudoCheckboxState, KbqResolvedPanelWidth, KbqSelectAllAdapter, KbqSelectLocaleConfiguration, KbqShadowDomOverlayHost, KbqSiblingPopup, KbqSizeUnitsConfig, KbqStickToWindowPlacementValues, KbqTheme, KbqTimeRangeLocaleConfig, KbqTimezoneLike, KbqTitleTextRef, KbqToggleSelectAllOptions, KbqTriangle, KbqUnitSystem, KeyboardNavigationHandler, ListKeyManagerModifierKey, ListKeyManagerOption };
@@ -234,6 +234,9 @@
234
234
  overflow: hidden auto;
235
235
  }
236
236
 
237
+ // The tokens are left undeclared: the value lives in the fallback, so one override reaches every panel
238
+ // that extends this placeholder — the dropdown and the autocomplete included. Declaring them in
239
+ // `select-tokens.scss` would scope them to `.kbq-select__panel` and put those two out of reach.
237
240
  %kbq-select-footer {
238
241
  @include vendor-prefixes.user-select(none);
239
242
 
@@ -241,14 +244,61 @@
241
244
  align-items: center;
242
245
  box-sizing: border-box;
243
246
 
244
- min-height: 40px;
247
+ min-height: var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));
245
248
 
246
- border-top-width: 1px;
249
+ border-top-width: var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));
247
250
  border-top-style: solid;
248
251
 
249
- padding: var(--kbq-size-xxs) var(--kbq-size-l);
252
+ padding: var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs))
253
+ var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l));
250
254
  }
251
255
 
256
+ // The footer's action is drawn as a row of the drop-down menu rather than as a form button: full
257
+ // panel width, the option's own box and hover fill, so it reads as the last entry of the list
258
+ // instead of a control parked underneath it.
259
+ %kbq-select-footer-item {
260
+ @include vendor-prefixes.user-select(none);
261
+
262
+ // A native `button`/`a` flashes on tap without this; `kbq-list-item-base()`, which the option rows
263
+ // above use, is not included because the row zeroes the vertical padding that mixin sets.
264
+ -webkit-tap-highlight-color: transparent;
265
+
266
+ display: flex;
267
+ flex-direction: row;
268
+ align-items: center;
269
+ box-sizing: border-box;
270
+ outline: none;
271
+
272
+ // `flex-grow` rather than `width: 100%`: alone in the footer it fills the content box just the same,
273
+ // but it shares the row instead of squeezing a caption or a second action out of it. The basis stays
274
+ // `auto` — `flex: 1` would expand to a `0%` basis and hand two actions the same width whatever they
275
+ // say.
276
+ flex: 1 1 auto;
277
+ min-height: var(--kbq-select-footer-item-size-height, var(--kbq-size-3xl));
278
+ gap: var(--kbq-size-s);
279
+
280
+ // Transparent border, as on an option, so the row keeps the same content inset — and so the focus
281
+ // ring below can recolour it without shifting anything.
282
+ border: var(--kbq-size-3xs) solid transparent;
283
+ border-radius: var(--kbq-select-footer-item-size-border-radius, var(--kbq-size-xxs));
284
+
285
+ padding: 0 kbq-difference-series-css-variables([size-m, size-3xs]);
286
+
287
+ background: transparent;
288
+ cursor: pointer;
289
+
290
+ text-align: left;
291
+ text-decoration: none;
292
+ }
293
+
294
+ // Extends an item's hit area past the box it paints, with a transparent pseudo-element on the element
295
+ // that owns the click handler — a pseudo-element is hit-tested as part of that element, so hover and
296
+ // click both reach the gutter with no TS and no `z-index`. This one claims a fixed strip either side of
297
+ // a plain vertical list. The same technique, sized differently, is hand-rolled where the geometry does
298
+ // not fit: `.kbq-navbar-item`'s `:before` cancels the item's own margin (DS-2558), and
299
+ // `--kbq-button-toggle-size-item-hit-area-*` tiles a group's `gap` between two neighbours and hands the
300
+ // group's padding to the outermost items, per orientation (DS-4164). Any clipping ancestor eats all of
301
+ // them — see the note on `.kbq-button-toggle`'s `overflow`.
252
302
  @mixin item-active-area($outline) {
253
303
  position: relative;
254
304
 
@@ -268,3 +318,48 @@
268
318
  left: calc(100% + $outline); // outline size
269
319
  }
270
320
  }
321
+
322
+ // A mixin of its own: the row's structure is only extended under `.kbq-select__panel`, and emitting its
323
+ // colours anywhere else would paint a half-styled control.
324
+ @mixin kbq-select-footer-item-theme() {
325
+ .kbq-select__footer-item {
326
+ color: var(--kbq-foreground-contrast);
327
+
328
+ // The row is reachable with TAB, so it needs a focus indicator of its own; `outline: none` in
329
+ // the structural rule would otherwise leave it with none at all. Recolouring the 2px layout
330
+ // border is the whole ring — adding an outline on top of it would render 3px, half again as
331
+ // thick as every other focused control (a button pairs a 1px border with a 1px outline).
332
+ &:focus-visible {
333
+ border-color: var(--kbq-states-line-focus-theme);
334
+ }
335
+
336
+ // `:disabled` alone would miss an `a`, which the directive also supports and which cannot carry
337
+ // the attribute — those are marked with `.kbq-disabled`, as `.kbq-option` and `.kbq-dropdown-item` are.
338
+ &:hover:not(:disabled, .kbq-disabled) {
339
+ background: var(--kbq-states-background-transparent-hover);
340
+ }
341
+
342
+ &:active:not(:disabled, .kbq-disabled) {
343
+ background: var(--kbq-states-background-transparent-active);
344
+ }
345
+
346
+ &:disabled,
347
+ &.kbq-disabled {
348
+ color: var(--kbq-states-foreground-disabled);
349
+ cursor: default;
350
+
351
+ // A native `button` ignores the pointer once it carries `disabled`, but an `a` cannot carry the
352
+ // attribute, so the class has to do it — otherwise a greyed-out link still navigates on a click
353
+ // and closes the panel on the way. Same pair `kbq-link` uses for its own disabled state.
354
+ pointer-events: none;
355
+
356
+ // `.kbq-icon` is coloured from an absolute token rather than `currentColor`, so a projected
357
+ // icon would stay at full contrast beside a greyed label. Only the ones left at the default
358
+ // colour: `.kbq-empty` is what `KbqColorDirective` leaves behind when the consumer set none,
359
+ // and an icon button carries its own disabled state.
360
+ & .kbq-icon.kbq-empty:not(.kbq-icon-button, .kbq-icon-item) {
361
+ color: var(--kbq-states-foreground-disabled);
362
+ }
363
+ }
364
+ }
365
+ }
@@ -239,6 +239,10 @@
239
239
  @include kbq-typography-level-to-styles-css-variables(typography, mono-normal-strong);
240
240
  }
241
241
 
242
+ .kbq-mono-normal-medium {
243
+ @include kbq-typography-level-to-styles-css-variables(typography, mono-normal-medium);
244
+ }
245
+
242
246
  .kbq-mono-compact {
243
247
  @include kbq-typography-level-to-styles-css-variables(typography, mono-compact);
244
248
  }
@@ -247,6 +251,10 @@
247
251
  @include kbq-typography-level-to-styles-css-variables(typography, mono-compact-strong);
248
252
  }
249
253
 
254
+ .kbq-mono-codeblock {
255
+ @include kbq-typography-level-to-styles-css-variables(typography, mono-codeblock);
256
+ }
257
+
250
258
  .kbq-tabular-big {
251
259
  @include kbq-typography-level-to-styles-css-variables(typography, tabular-big);
252
260
  }