@bitforgehq/ui 0.3.0 → 0.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 (158) hide show
  1. package/CHANGELOG.md +598 -0
  2. package/README.md +18 -11
  3. package/ai/MANIFEST.index.json +306 -0
  4. package/ai/MANIFEST.json +8915 -3788
  5. package/ai/REFERENCE.index.json +476 -0
  6. package/ai/REFERENCE.json +5810 -2905
  7. package/ai/UI_GUIDE.md +212 -58
  8. package/ai/components/app-frame.md +328 -0
  9. package/ai/components/back-button.md +42 -2
  10. package/ai/components/badge.md +17 -7
  11. package/ai/components/bar-chart.md +188 -0
  12. package/ai/components/breadcrumb-item.md +121 -0
  13. package/ai/components/breadcrumb.md +277 -0
  14. package/ai/components/button.md +82 -15
  15. package/ai/components/calendar.md +300 -0
  16. package/ai/components/card.md +119 -4
  17. package/ai/components/chart-card.md +283 -0
  18. package/ai/components/combobox.md +411 -0
  19. package/ai/components/date-input.md +396 -0
  20. package/ai/components/datetime-input.md +215 -0
  21. package/ai/components/description-item.md +111 -0
  22. package/ai/components/description-list.md +160 -0
  23. package/ai/components/donut-chart.md +169 -0
  24. package/ai/components/empty-state.md +99 -6
  25. package/ai/components/header.md +71 -2
  26. package/ai/components/icon-button.md +74 -16
  27. package/ai/components/icon.md +63 -7
  28. package/ai/components/line-chart.md +234 -0
  29. package/ai/components/list.md +70 -6
  30. package/ai/components/menu.md +5 -0
  31. package/ai/components/multi-combobox.md +257 -0
  32. package/ai/components/nav-group.md +178 -0
  33. package/ai/components/nav-item.md +210 -0
  34. package/ai/components/page-header.md +237 -0
  35. package/ai/components/pagination.md +173 -0
  36. package/ai/components/popover.md +250 -0
  37. package/ai/components/side-panel.md +391 -0
  38. package/ai/components/sidebar-toggle.md +287 -0
  39. package/ai/components/sidebar.md +541 -0
  40. package/ai/components/skeleton.md +215 -0
  41. package/ai/components/sparkline.md +188 -0
  42. package/ai/components/stat.md +297 -0
  43. package/ai/components/tab-group.md +226 -0
  44. package/ai/components/tab-panel.md +163 -0
  45. package/ai/components/table.md +697 -0
  46. package/ai/components/tabs.md +46 -2
  47. package/ai/components/theme-menu-button.md +182 -0
  48. package/ai/components/theme-switch.md +170 -0
  49. package/ai/components/time-input.md +240 -0
  50. package/ai/components/toolbar.md +354 -0
  51. package/ai/components/tooltip.md +230 -0
  52. package/ai/components/top-nav.md +159 -0
  53. package/ai/reference/bf-app-frame-breakpoint.md +27 -0
  54. package/ai/reference/bf-app-frame-content-width.md +29 -0
  55. package/ai/reference/bf-badge-appearance.md +36 -0
  56. package/ai/reference/bf-badge-variant.md +1 -1
  57. package/ai/reference/bf-bar-chart-orientation.md +27 -0
  58. package/ai/reference/bf-button-appearance.md +36 -0
  59. package/ai/reference/bf-button-variant.md +1 -1
  60. package/ai/reference/bf-calendar-disabled-date.md +23 -0
  61. package/ai/reference/bf-calendar-harness.md +51 -0
  62. package/ai/reference/bf-calendar-weekday.md +31 -0
  63. package/ai/reference/bf-chart-card-heading-level.md +26 -0
  64. package/ai/reference/bf-chart-curve.md +28 -0
  65. package/ai/reference/bf-chart-harness.md +51 -0
  66. package/ai/reference/bf-chart-legend-position.md +30 -0
  67. package/ai/reference/bf-chart-series.md +23 -0
  68. package/ai/reference/bf-chart-value-format.md +23 -0
  69. package/ai/reference/bf-color-scheme-service.md +30 -0
  70. package/ai/reference/bf-color-scheme.md +31 -0
  71. package/ai/reference/bf-combobox-filter.md +27 -0
  72. package/ai/reference/bf-combobox-harness.md +89 -0
  73. package/ai/reference/bf-combobox-option.md +33 -0
  74. package/ai/reference/bf-compare-with.md +2 -0
  75. package/ai/reference/bf-date-input-harness.md +67 -0
  76. package/ai/reference/bf-date-input-picker.md +27 -0
  77. package/ai/reference/bf-date-time-input-harness.md +76 -0
  78. package/ai/reference/bf-date-time-input-picker.md +27 -0
  79. package/ai/reference/bf-description-list-layout.md +26 -0
  80. package/ai/reference/bf-donut-slice.md +22 -0
  81. package/ai/reference/bf-empty-state-heading-level.md +1 -1
  82. package/ai/reference/bf-empty-state-heading.md +33 -0
  83. package/ai/reference/bf-labels.md +73 -20
  84. package/ai/reference/bf-menu-button-variant.md +1 -0
  85. package/ai/reference/bf-menu-placement.md +1 -0
  86. package/ai/reference/bf-overlay-options.md +28 -27
  87. package/ai/reference/bf-overlay-placement.md +34 -0
  88. package/ai/reference/bf-overlay-position.md +1 -1
  89. package/ai/reference/bf-overlay-service.md +5 -3
  90. package/ai/reference/bf-page-header-heading-level.md +26 -0
  91. package/ai/reference/bf-pagination-harness.md +61 -0
  92. package/ai/reference/bf-platform-service.md +17 -15
  93. package/ai/reference/bf-popover-harness.md +42 -0
  94. package/ai/reference/bf-popover-placement.md +28 -0
  95. package/ai/reference/bf-popover-trigger-directive.md +56 -0
  96. package/ai/reference/bf-side-panel-config.md +35 -0
  97. package/ai/reference/bf-side-panel-harness.md +34 -0
  98. package/ai/reference/bf-side-panel-ref.md +44 -0
  99. package/ai/reference/bf-side-panel-service.md +43 -0
  100. package/ai/reference/bf-side-panel-template-context.md +32 -0
  101. package/ai/reference/bf-side-panel-width.md +28 -0
  102. package/ai/reference/bf-sidebar-state-service.md +21 -0
  103. package/ai/reference/bf-sidebar-toggle-harness.md +32 -0
  104. package/ai/reference/bf-size.md +13 -0
  105. package/ai/reference/bf-skeleton-shape.md +28 -0
  106. package/ai/reference/bf-stat-appearance.md +33 -0
  107. package/ai/reference/bf-stat-trend-intent.md +27 -0
  108. package/ai/reference/bf-stat-trend.md +27 -0
  109. package/ai/reference/bf-stat-variant.md +26 -0
  110. package/ai/reference/bf-tab-group-harness.md +44 -0
  111. package/ai/reference/bf-table-align.md +26 -0
  112. package/ai/reference/bf-table-cell-context.md +24 -0
  113. package/ai/reference/bf-table-cell-directive.md +22 -0
  114. package/ai/reference/bf-table-column.md +28 -0
  115. package/ai/reference/bf-table-harness.md +77 -0
  116. package/ai/reference/bf-table-row-key.md +21 -0
  117. package/ai/reference/bf-table-sort-direction.md +26 -0
  118. package/ai/reference/bf-table-sort.md +27 -0
  119. package/ai/reference/bf-table-stack.md +29 -0
  120. package/ai/reference/bf-theme.md +5 -4
  121. package/ai/reference/bf-time-input-harness.md +67 -0
  122. package/ai/reference/bf-time-input-hour-cycle.md +27 -0
  123. package/ai/reference/bf-time-input-picker.md +27 -0
  124. package/ai/reference/bf-tooltip-directive.md +43 -0
  125. package/ai/reference/bf-tooltip-harness.md +43 -0
  126. package/ai/reference/bf-tooltip-placement.md +28 -0
  127. package/ai/reference/bf_color_scheme_storage.md +20 -0
  128. package/ai/reference/bf_side_panel_data.md +17 -0
  129. package/ai/reference/bf_sidebar_state_storage.md +20 -0
  130. package/ai/reference/bf_theme_storage.md +3 -1
  131. package/ai/reference/provide-bf-color-scheme.md +20 -0
  132. package/ai/reference/provide-bf-labels.md +13 -4
  133. package/ai/reference/provide-bf-sidebar-state.md +20 -0
  134. package/ai/reference/slide-in-from-end.md +24 -0
  135. package/ai/reference/slide-out-to-end.md +24 -0
  136. package/bin/bf-ui.js +433 -3
  137. package/fesm2022/bitforgehq-ui-charts.mjs +3045 -0
  138. package/fesm2022/bitforgehq-ui-charts.mjs.map +1 -0
  139. package/fesm2022/bitforgehq-ui-icons.mjs +107 -3
  140. package/fesm2022/bitforgehq-ui-icons.mjs.map +1 -1
  141. package/fesm2022/bitforgehq-ui-mobile.mjs +14 -59
  142. package/fesm2022/bitforgehq-ui-mobile.mjs.map +1 -1
  143. package/fesm2022/bitforgehq-ui-overlay.mjs +6566 -38
  144. package/fesm2022/bitforgehq-ui-overlay.mjs.map +1 -1
  145. package/fesm2022/bitforgehq-ui-testing.mjs +634 -1
  146. package/fesm2022/bitforgehq-ui-testing.mjs.map +1 -1
  147. package/fesm2022/bitforgehq-ui.mjs +5708 -137
  148. package/fesm2022/bitforgehq-ui.mjs.map +1 -1
  149. package/llms-full.txt +26766 -14470
  150. package/llms.txt +106 -1
  151. package/package.json +7 -3
  152. package/theme.css +101 -0
  153. package/types/bitforgehq-ui-charts.d.ts +967 -0
  154. package/types/bitforgehq-ui-icons.d.ts +13 -1
  155. package/types/bitforgehq-ui-mobile.d.ts +25 -18
  156. package/types/bitforgehq-ui-overlay.d.ts +1895 -7
  157. package/types/bitforgehq-ui-testing.d.ts +782 -1
  158. package/types/bitforgehq-ui.d.ts +2393 -45
@@ -1,8 +1,9 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import { ComponentRef, DestroyRef, EnvironmentProviders, InjectionToken, Injector, Signal, StaticProvider, TemplateRef, Type } from "@angular/core";
3
3
  import { LiveAnnouncer } from "@angular/cdk/a11y";
4
- import { BfSize } from "@bitforgehq/ui";
4
+ import { BfCalendarDisabledDate, BfColorScheme, BfCompareWith, BfSize } from "@bitforgehq/ui";
5
5
  import * as i1 from "@angular/cdk/menu";
6
+ import { FormValueControl, ValidationError } from "@angular/forms/signals";
6
7
  /**
7
8
  * The `data` passed to `BfOverlayService.open()`, injectable in the overlay's content.
8
9
  *
@@ -173,6 +174,14 @@ export declare class BfOverlayStack {
173
174
  * @since 0.2.0
174
175
  */
175
176
  type BfOverlayPosition = 'bottom' | 'center' | 'top' | 'fullscreen';
177
+ /**
178
+ * Where an overlay panel sits: a `BfOverlayPosition`, or `end`, full height against the inline
179
+ * end edge of the viewport (the right in a left-to-right page, the left under `dir="rtl"`).
180
+ *
181
+ * @summary Where an overlay panel sits: a viewport position or full height at the end
182
+ * @since 0.3.1
183
+ */
184
+ type BfOverlayPlacement = BfOverlayPosition | 'end';
176
185
  /**
177
186
  * The ARIA role of an overlay panel: a `dialog`, an `alertdialog` or a passive `status`.
178
187
  *
@@ -266,10 +275,10 @@ interface BfOverlayOptions {
266
275
  */
267
276
  restoreFocus?: boolean;
268
277
  /**
269
- * Placement of the panel (default `center`).
278
+ * Placement of the panel (default `center`); `end` is full height at the inline end edge.
270
279
  * @default 'center'
271
280
  */
272
- position?: BfOverlayPosition;
281
+ position?: BfOverlayPlacement;
273
282
  /**
274
283
  * Closes the overlay when the URL path changes (default true; false for passive overlays): a
275
284
  * router navigation, a link, the browser's back and forward buttons. Query- or fragment-only
@@ -302,6 +311,15 @@ interface BfOverlayOptions {
302
311
  * @default false
303
312
  */
304
313
  passive?: boolean;
314
+ /**
315
+ * A modal overlay (default true) has a backdrop, traps focus, is `aria-modal`, blocks document
316
+ * scroll and makes the page behind it `inert`. A non-modal one (a side panel beside the page)
317
+ * has none of these and is not in `BfOverlayStack`: focus moves in, the page stays usable,
318
+ * `Escape` closes it only while focus is inside it, and on close focus returns to the opener
319
+ * only from inside it. Ignored for passive overlays.
320
+ * @default true
321
+ */
322
+ modal?: boolean;
305
323
  /**
306
324
  * Enter animation of the panel (default `fadeIn`); return null for none.
307
325
  * @default fadeIn
@@ -335,6 +353,13 @@ interface BfOverlayTemplateContext {
335
353
  /** The `data` the overlay was opened with (`let-data="data"`). */
336
354
  data: unknown;
337
355
  }
356
+ /** The elements Tab stops at (without a negative tabindex). */
357
+ declare const TABBABLE: string;
358
+ /**
359
+ * Where an overlay's initial focus goes inside `panel`: the `[autofocus]`/`[cdkFocusInitial]` mark,
360
+ * else the first tabbable element that is not the container's own chrome. Shared with the popover.
361
+ */
362
+ declare function firstTabbable(panel: HTMLElement): HTMLElement | null;
338
363
  /**
339
364
  * Opens overlays on the Angular CDK `Overlay`: a component or template in a panel with a
340
365
  * backdrop, a focus trap, `role`/`aria-modal`/`aria-labelledby`, `Escape` and backdrop click
@@ -348,9 +373,11 @@ interface BfOverlayTemplateContext {
348
373
  * close on it (`dismissOnEscape: false` without `onEscape`, or an `onEscape` that keeps it open)
349
374
  * swallows Android web back for as long as it is open, as a non-dismissible sheet swallows the
350
375
  * hardware back button. A navigation to another URL path closes every non-passive
351
- * overlay (`closeOnNavigation`, read from `Location`, so no router is needed). The content
352
- * injects `BF_OVERLAY_DATA` and `BfOverlayRef` (plus any `providers`). `BfDialogService` and the
353
- * `/mobile` sheet, modal, toast, action sheet and alert services build on it.
376
+ * overlay (`closeOnNavigation`, read from `Location`, so no router is needed). `modal: false`
377
+ * (a side panel beside the page) drops the backdrop, the trap, `aria-modal`, the scroll lock and
378
+ * the `inert` page. The content injects `BF_OVERLAY_DATA` and `BfOverlayRef` (plus any
379
+ * `providers`). `BfDialogService`, `BfSidePanelService` and the `/mobile` sheet, modal, toast,
380
+ * action sheet and alert services build on it.
354
381
  *
355
382
  * @example
356
383
  * const ref = inject(BfOverlayService).open(ConfirmComponent, {
@@ -534,6 +561,26 @@ export declare function fadeUp(el: HTMLElement, distance?: string): Animation;
534
561
  * @since 0.2.0
535
562
  */
536
563
  export declare function fadeDown(el: HTMLElement, distance?: string): Animation;
564
+ /**
565
+ * Slides `el` in from beyond the inline end edge of the viewport (the right, the left under
566
+ * `dir="rtl"`) by its own width: the enter animation of a side panel.
567
+ *
568
+ * @param el The element to animate, usually the overlay panel.
569
+ * @returns The running animation.
570
+ * @summary Slides an element in from the inline end, the enter animation of a side panel
571
+ * @since 0.3.1
572
+ */
573
+ export declare function slideInFromEnd(el: HTMLElement): Animation;
574
+ /**
575
+ * Slides `el` out past the inline end edge of the viewport by its own width (the reverse of
576
+ * `slideInFromEnd`): the exit animation of a side panel.
577
+ *
578
+ * @param el The element to animate, usually the overlay panel.
579
+ * @returns The running animation.
580
+ * @summary Slides an element out past the inline end, the exit animation of a side panel
581
+ * @since 0.3.1
582
+ */
583
+ export declare function slideOutToEnd(el: HTMLElement): Animation;
537
584
  /**
538
585
  * Names an overlay panel by the first heading inside it that is not `aria-hidden` or `hidden`:
539
586
  * gives the heading an id when it has none (`bf-overlay-title-<n>`), points the panel's
@@ -1511,4 +1558,1845 @@ export declare class BfMenuButtonComponent {
1511
1558
  "closed": "closed";
1512
1559
  }, never, ["[bfSlot=icon-start]", "*"], true, never>;
1513
1560
  }
1514
- export { type BfConfirmButton, type BfConfirmButtonRole, type BfConfirmOptions, type BfConfirmSize, type BfDesktopToastConfig, type BfDesktopToastOptions, type BfDesktopToastPosition, type BfDialogConfig, type BfDialogRole, type BfDialogSize, type BfDialogTemplateContext, type BfMenuButtonVariant, type BfMenuPlacement, type BfOverlayAutoFocus, type BfOverlayController, type BfOverlayHost, type BfOverlayOptions, type BfOverlayPosition, type BfOverlayRole, type BfOverlayStackOptions, type BfOverlayTemplateContext, type BfStackedOverlay, type BfToastAction, type BfToastController, type BfToastDismissReason, type ɵBfToastHandle, type ɵBfToastPresenter, type ɵBfToastQueueOptions, type ɵBfToastRequest, type ɵBfToastView, labelPanelByHeading as ɵlabelPanelByHeading, watchPanelHeading as ɵwatchPanelHeading };
1561
+ /** One choice of the theme menu: the scheme and its label. */
1562
+ interface ThemeChoice {
1563
+ readonly value: BfColorScheme;
1564
+ readonly label: string;
1565
+ }
1566
+ /**
1567
+ * The colour scheme switch as a menu button, for a crowded top bar: a `bf-menu-button` whose menu
1568
+ * holds System, Light and Dark as radio items, the current one marked with a dot. It holds a
1569
+ * `BfColorScheme` and injects no service, so the app binds its own state, usually
1570
+ * `BfColorSchemeService.scheme` (`BfPlatformService.theme` in a Capacitor app). The button shows
1571
+ * `label` ("Theme") next to an optional icon, or only the icon with `iconOnly`.
1572
+ *
1573
+ * @example
1574
+ * <bf-theme-menu-button iconOnly variant="text" [(value)]="colorScheme.scheme">
1575
+ * <bf-icon bfSlot="icon" [icon]="colorScheme.dark() ? Moon : Sun" />
1576
+ * </bf-theme-menu-button>
1577
+ * @summary Menu button with System, Light and Dark radio items bound to the colour scheme
1578
+ * @category Overlays
1579
+ * @since 0.3.1
1580
+ * @slot icon The icon before the label, or the whole button with `iconOnly` (a sun or a moon).
1581
+ */
1582
+ export declare class BfThemeMenuButtonComponent {
1583
+ private readonly labels;
1584
+ /** The colour scheme choice; bind it two-way, usually to `BfColorSchemeService.scheme`. */
1585
+ readonly value: import("@angular/core").ModelSignal<BfColorScheme>;
1586
+ /** The button's text, and its accessible name with `iconOnly`; empty falls back to the `theme`
1587
+ * label. */
1588
+ readonly label: import("@angular/core").InputSignal<string>;
1589
+ /** Square button holding only the projected icon, like `bf-icon-button`. */
1590
+ readonly iconOnly: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1591
+ /** Visual style: outline (default), text, tonal. */
1592
+ readonly variant: import("@angular/core").InputSignal<BfMenuButtonVariant>;
1593
+ /** Height step: sm 32, md 40, lg 48 px; unset follows `provideBfDefaults()` (`controlSize`,
1594
+ * `md` by default). */
1595
+ readonly size: import("@angular/core").InputSignal<BfSize | undefined>;
1596
+ /** Where the menu opens against the button; it flips when it would overflow. */
1597
+ readonly placement: import("@angular/core").InputSignal<BfMenuPlacement>;
1598
+ /** Emitted with the new choice right after the user picks another item. */
1599
+ readonly changed: import("@angular/core").OutputEmitterRef<BfColorScheme>;
1600
+ /** The three items, labelled by `themeSystem`, `themeLight` and `themeDark`. */
1601
+ protected readonly choices: readonly ThemeChoice[];
1602
+ /** The button's name: `label`, else the `theme` label. */
1603
+ protected readonly resolvedLabel: import("@angular/core").Signal<string>;
1604
+ /**
1605
+ * Takes the item the user picked; the current choice again changes nothing.
1606
+ * @internal
1607
+ */
1608
+ select(next: BfColorScheme): void;
1609
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfThemeMenuButtonComponent, never>;
1610
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfThemeMenuButtonComponent, "bf-theme-menu-button", never, {
1611
+ "value": {
1612
+ "alias": "value";
1613
+ "required": false;
1614
+ "isSignal": true;
1615
+ };
1616
+ "label": {
1617
+ "alias": "label";
1618
+ "required": false;
1619
+ "isSignal": true;
1620
+ };
1621
+ "iconOnly": {
1622
+ "alias": "iconOnly";
1623
+ "required": false;
1624
+ "isSignal": true;
1625
+ };
1626
+ "variant": {
1627
+ "alias": "variant";
1628
+ "required": false;
1629
+ "isSignal": true;
1630
+ };
1631
+ "size": {
1632
+ "alias": "size";
1633
+ "required": false;
1634
+ "isSignal": true;
1635
+ };
1636
+ "placement": {
1637
+ "alias": "placement";
1638
+ "required": false;
1639
+ "isSignal": true;
1640
+ };
1641
+ }, {
1642
+ "value": "valueChange";
1643
+ "changed": "changed";
1644
+ }, never, ["[bfSlot=icon]"], true, never>;
1645
+ }
1646
+ /**
1647
+ * The collapse button of a `bf-sidebar`: a text icon button placed inside the sidebar (usually in
1648
+ * its header or footer) that flips the sidebar between full width and an icon rail. Its name and
1649
+ * tooltip say what the next press does ("Collapse sidebar", "Expand sidebar"), `aria-expanded`
1650
+ * follows the sidebar and `aria-controls` points at its `nav`. It shows the `collapse-icon` slot
1651
+ * while expanded and the `expand-icon` slot while collapsed. It reads and writes the sidebar's
1652
+ * `collapsed` model, so `[(collapsed)]` on the sidebar sees every press. Outside a `bf-sidebar`
1653
+ * (in a `bf-top-nav`, or on its own) it renders nothing.
1654
+ *
1655
+ * @example
1656
+ * <bf-sidebar [(collapsed)]="sidebarState.collapsed">
1657
+ * <bf-sidebar-toggle bfSlot="footer">
1658
+ * <bf-icon bfSlot="collapse-icon" [icon]="PanelLeftClose" />
1659
+ * <bf-icon bfSlot="expand-icon" [icon]="PanelLeftOpen" />
1660
+ * </bf-sidebar-toggle>
1661
+ * </bf-sidebar>
1662
+ * @summary Icon button inside a sidebar that collapses it to an icon rail and back
1663
+ * @category Navigation
1664
+ * @since 0.3.2
1665
+ * @slot collapse-icon The icon shown while the sidebar is expanded (a panel closing).
1666
+ * @slot expand-icon The icon shown while the sidebar is an icon rail (a panel opening).
1667
+ */
1668
+ export declare class BfSidebarToggleComponent {
1669
+ private readonly defaults;
1670
+ private readonly labels;
1671
+ private readonly host;
1672
+ /** The enclosing sidebar's context; null outside a sidebar (a top nav never collapses). */
1673
+ protected readonly nav: import("@bitforgehq/ui").ɵBfNavHost | null;
1674
+ /** Height step: sm 32, md 40, lg 48 px (square); unset follows `provideBfDefaults()`
1675
+ * (`controlSize`, `md` by default). */
1676
+ readonly size: import("@angular/core").InputSignal<BfSize | undefined>;
1677
+ /** Whether the sidebar is an icon rail now. */
1678
+ protected readonly collapsed: import("@angular/core").Signal<boolean>;
1679
+ /** What the next press does: `sidebarExpand` while collapsed, else `sidebarCollapse`. */
1680
+ protected readonly name: import("@angular/core").Signal<string>;
1681
+ protected readonly hostClasses: import("@angular/core").Signal<string>;
1682
+ protected readonly classes: import("@angular/core").Signal<string>;
1683
+ /**
1684
+ * Flips the sidebar between full width and an icon rail.
1685
+ * @internal
1686
+ */
1687
+ toggle(): void;
1688
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfSidebarToggleComponent, never>;
1689
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfSidebarToggleComponent, "bf-sidebar-toggle", never, {
1690
+ "size": {
1691
+ "alias": "size";
1692
+ "required": false;
1693
+ "isSignal": true;
1694
+ };
1695
+ }, {}, never, ["[bfSlot=collapse-icon]", "[bfSlot=expand-icon]"], true, never>;
1696
+ }
1697
+ /**
1698
+ * Layout of a side panel opened with `BfSidePanelService`: a title row with a close button, a
1699
+ * scrolling body and a footer of actions kept at the bottom. The panel is labelled by the title,
1700
+ * and the body becomes focusable only while its content overflows, so keyboard users can scroll
1701
+ * it (a region named by the title).
1702
+ *
1703
+ * @example
1704
+ * const ref = inject(BfSidePanelService).open(InvoiceDetailsComponent, { data: invoice });
1705
+ * // InvoiceDetailsComponent template:
1706
+ * // <bf-side-panel title="INV-204"> …details…
1707
+ * // <div bfSlot="footer">…buttons…</div> </bf-side-panel>
1708
+ * @summary Desktop panel sliding in from the end edge, with a title, body and footer actions
1709
+ * @category Overlays
1710
+ * @since 0.3.1
1711
+ * @slot header More header content after the title, such as a status badge.
1712
+ * @slot default The panel body.
1713
+ * @slot footer The actions, aligned at the end and kept at the bottom.
1714
+ */
1715
+ export declare class BfSidePanelComponent {
1716
+ private readonly labels;
1717
+ private readonly context;
1718
+ private readonly ref;
1719
+ /** Heading of the panel, rendered as the `h2` the side panel is labelled by. */
1720
+ readonly title: import("@angular/core").InputSignal<string>;
1721
+ /** Accessible name of the close button; empty uses `provideBfLabels()`'s `close` ("Close"). */
1722
+ readonly closeLabel: import("@angular/core").InputSignal<string>;
1723
+ /** True while the body's content is taller than the body (it scrolls). */
1724
+ protected readonly overflowing: import("@angular/core").WritableSignal<boolean>;
1725
+ protected readonly titleId: string;
1726
+ protected readonly closeIcon: import("lucide").IconNode;
1727
+ private readonly width;
1728
+ protected readonly hostClasses: import("@angular/core").Signal<string>;
1729
+ protected readonly closeName: import("@angular/core").Signal<string>;
1730
+ private readonly body;
1731
+ private readonly content;
1732
+ constructor();
1733
+ /** Closes the panel with no result (does nothing outside `BfSidePanelService`). */
1734
+ protected close(): void;
1735
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfSidePanelComponent, never>;
1736
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfSidePanelComponent, "bf-side-panel", never, {
1737
+ "title": {
1738
+ "alias": "title";
1739
+ "required": false;
1740
+ "isSignal": true;
1741
+ };
1742
+ "closeLabel": {
1743
+ "alias": "closeLabel";
1744
+ "required": false;
1745
+ "isSignal": true;
1746
+ };
1747
+ }, {}, never, ["[bfSlot=header]", "*", "[bfSlot=footer]"], true, never>;
1748
+ }
1749
+ /**
1750
+ * The side panel's width scale: `sm` 360 px, `md` 480 px, `lg` 640 px (22.5, 30 and 40 rem), each
1751
+ * never wider than the viewport.
1752
+ *
1753
+ * @summary The side panel widths, from a 360 px detail list to a 640 px form
1754
+ * @since 0.3.1
1755
+ */
1756
+ type BfSidePanelWidth = 'sm' | 'md' | 'lg';
1757
+ /**
1758
+ * The `data` passed to `BfSidePanelService.open()`, injectable in the panel's content.
1759
+ *
1760
+ * @summary Injection token carrying the data a side panel was opened with, for its content
1761
+ * @since 0.3.1
1762
+ */
1763
+ export declare const BF_SIDE_PANEL_DATA: InjectionToken<unknown>;
1764
+ /** @internal What `BfSidePanelService` tells the `bf-side-panel` inside its content. */
1765
+ interface BfSidePanelContext {
1766
+ /** Id the `bf-side-panel` title renders with; the panel's `aria-labelledby` points to it. */
1767
+ readonly titleId: string;
1768
+ readonly width: BfSidePanelWidth;
1769
+ }
1770
+ /** @internal Provided by `BfSidePanelService` to the panel's content. */
1771
+ declare const BF_SIDE_PANEL_CONTEXT: InjectionToken<BfSidePanelContext>;
1772
+ /**
1773
+ * Handle to an open side panel, returned by `BfSidePanelService.open()` and injectable in the
1774
+ * panel's content (`inject(BfSidePanelRef)`). `close(result)` slides the panel out, detaches it
1775
+ * and resolves `afterClosed` with `result`; later calls are ignored. Closing with `Escape`, the
1776
+ * backdrop, the `bf-side-panel` close button or a navigation resolves `undefined`.
1777
+ *
1778
+ * @example
1779
+ * const ref = inject(BfSidePanelService).open<InvoiceDetailsComponent, Invoice, Invoice>(
1780
+ * InvoiceDetailsComponent,
1781
+ * { data: invoice },
1782
+ * );
1783
+ * const saved = await ref.afterClosed;
1784
+ *
1785
+ * @summary Handle on an open side panel that closes it and resolves with its result
1786
+ * @since 0.3.1
1787
+ */
1788
+ export declare class BfSidePanelRef<R = unknown, C = unknown> {
1789
+ private readonly overlayRef;
1790
+ private readonly instance;
1791
+ /** Unique id of the side panel (its overlay's `bf-overlay-N`). */
1792
+ readonly id: string;
1793
+ /** Resolves with the result given to `close()`, or `undefined`, once the panel is detached. */
1794
+ readonly afterClosed: Promise<R | undefined>;
1795
+ /** True once the panel has been detached. */
1796
+ readonly closed: Signal<boolean>;
1797
+ /** @internal Created by `BfSidePanelService`; apps never construct it. */
1798
+ constructor(overlayRef: BfOverlayRef<unknown>, instance?: () => C | null);
1799
+ /** The content component; `null` for a panel opened from a template. */
1800
+ get componentInstance(): C | null;
1801
+ /**
1802
+ * Closes the panel with an optional result; ignored once closing.
1803
+ * @param result The value `afterClosed` resolves with.
1804
+ */
1805
+ close(result?: R): void;
1806
+ }
1807
+ /**
1808
+ * Context of a template opened with `BfSidePanelService.open()`: `let-ref` and `let-data="data"`.
1809
+ *
1810
+ * @summary The context a template opened as a side panel receives: its ref and its data
1811
+ * @since 0.3.1
1812
+ */
1813
+ interface BfSidePanelTemplateContext<D = unknown, R = unknown> {
1814
+ /** The panel's ref (`let-ref`), to close it with a result. */
1815
+ $implicit: BfSidePanelRef<R>;
1816
+ /** The `data` the panel was opened with (`let-data="data"`). */
1817
+ data: D;
1818
+ }
1819
+ /**
1820
+ * Options of `BfSidePanelService.open()`.
1821
+ *
1822
+ * @summary Options of a side panel: its data, width, modality, name and injector
1823
+ * @since 0.3.1
1824
+ */
1825
+ interface BfSidePanelConfig<D = unknown> {
1826
+ /** Injected into the content as `BF_SIDE_PANEL_DATA` (and a template's `data`). */
1827
+ data?: D;
1828
+ /**
1829
+ * Width of the `bf-side-panel` in the content (default `md`, 480 px), capped at the viewport.
1830
+ * @default 'md'
1831
+ */
1832
+ width?: BfSidePanelWidth;
1833
+ /**
1834
+ * A modal panel (default true) has a scrim, traps focus and makes the page behind it inert;
1835
+ * `false` keeps the page usable beside it.
1836
+ * @default true
1837
+ */
1838
+ modal?: boolean;
1839
+ /** Accessible name, when the content renders no `bf-side-panel` title and no heading. */
1840
+ ariaLabel?: string;
1841
+ /**
1842
+ * Parent of the content's injector and source of its labels (default the root injector). Pass
1843
+ * the opener's `inject(Injector)` so a feature-level `provideBfLabels()` reaches the panel.
1844
+ */
1845
+ injector?: Injector;
1846
+ }
1847
+ /**
1848
+ * Opens side panels on the overlay core: a component or template in a full-height pane that
1849
+ * slides in from the inline end edge (the right, the left under `dir="rtl"`; a cross-fade under
1850
+ * reduced motion), labelled by its `bf-side-panel` title, with focus moved in, `Escape` closing
1851
+ * it and focus returned to the opener. A modal panel (the default) adds a scrim that closes it on
1852
+ * a click, traps focus, locks document scroll and makes the page behind it `inert`, as a dialog
1853
+ * does; `modal: false` keeps the page usable and scrollable beside it, and `Escape` closes it
1854
+ * only while focus is inside it. A navigation to another URL path closes it. Desktop only.
1855
+ *
1856
+ * @example
1857
+ * const ref = inject(BfSidePanelService).open(InvoiceDetailsComponent, {
1858
+ * data: invoice,
1859
+ * width: 'lg',
1860
+ * });
1861
+ * const saved = await ref.afterClosed;
1862
+ * @since 0.3.1
1863
+ * @summary Opens a full-height panel from the end edge, modal or beside the page
1864
+ */
1865
+ export declare class BfSidePanelService {
1866
+ private readonly overlays;
1867
+ private readonly injector;
1868
+ /**
1869
+ * Opens `component` as a side panel; it injects `BfSidePanelRef` and `BF_SIDE_PANEL_DATA`.
1870
+ * @param component The component to render; it injects `BfSidePanelRef` and `BF_SIDE_PANEL_DATA`.
1871
+ * @param config The panel's data, width, modality, name and injector.
1872
+ */
1873
+ open<C, D = unknown, R = unknown>(component: Type<C>, config?: BfSidePanelConfig<D>): BfSidePanelRef<R, C>;
1874
+ /**
1875
+ * Opens `template` as a side panel; its context is `{ $implicit: ref, data }`.
1876
+ * @param template The template to render, with the context `{ $implicit: ref, data }`.
1877
+ * @param config The panel's data, width, modality, name and injector.
1878
+ */
1879
+ open<D = unknown, R = unknown>(template: TemplateRef<BfSidePanelTemplateContext<D, R>>, config?: BfSidePanelConfig<D>): BfSidePanelRef<R>;
1880
+ /**
1881
+ * A panel without an `ariaLabel` whose content rendered no `bf-side-panel` title (the core then
1882
+ * drops the dangling `aria-labelledby`) is named by the first heading in its content, also one
1883
+ * that renders later, and by the `dialog` label until then.
1884
+ */
1885
+ private nameUnlabelledPanel;
1886
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfSidePanelService, never>;
1887
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
1888
+ }
1889
+ /**
1890
+ * The small dark pill of a tooltip (role `tooltip`). A `[bfTooltip]` directive renders it in the
1891
+ * CDK overlay beside its element while the pointer rests on it or it has keyboard focus, so you
1892
+ * rarely place it yourself; the directive is how you add a tooltip.
1893
+ *
1894
+ * @example
1895
+ * <bf-icon-button label="Copy link" bfTooltip="Copy link"><bf-icon [icon]="link" /></bf-icon-button>
1896
+ * @summary Short hint beside a control on hover or keyboard focus, for desktop
1897
+ * @category Overlays
1898
+ * @since 0.3.1
1899
+ */
1900
+ export declare class BfTooltipComponent {
1901
+ /** The tooltip's text: a few words that repeat or explain the control's name. */
1902
+ readonly text: import("@angular/core").InputSignal<string>;
1903
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfTooltipComponent, never>;
1904
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfTooltipComponent, "bf-tooltip", never, {
1905
+ "text": {
1906
+ "alias": "text";
1907
+ "required": false;
1908
+ "isSignal": true;
1909
+ };
1910
+ }, {}, never, never, true, never>;
1911
+ }
1912
+ /**
1913
+ * Which side of its element a tooltip sits on; `start` and `end` follow the text direction.
1914
+ *
1915
+ * @summary Which side of its element a tooltip sits on: top, bottom, start or end
1916
+ * @since 0.3.1
1917
+ */
1918
+ type BfTooltipPlacement = 'top' | 'bottom' | 'start' | 'end';
1919
+ /**
1920
+ * Shows a short `bf-tooltip` beside an element: after a 500 ms rest of a fine pointer, at once on
1921
+ * keyboard focus. It hides when the pointer leaves (it stays while the pointer moves onto the
1922
+ * tooltip itself), on blur and on `Escape`, and while it shows, the focusable element (the host,
1923
+ * or the first control inside it, so it works on a `bf-icon-button`) is described by it
1924
+ * (`aria-describedby`). Nothing shows under a coarse pointer (touch), so never put information
1925
+ * only in a tooltip. The tooltip flips to the opposite side when it would overflow the viewport.
1926
+ *
1927
+ * @example
1928
+ * <bf-icon-button label="Archive" bfTooltip="Archive" bfTooltipPlacement="bottom">
1929
+ * <bf-icon [icon]="archive" />
1930
+ * </bf-icon-button>
1931
+ * @summary Adds a hover and keyboard-focus tooltip to any control on desktop
1932
+ * @since 0.3.1
1933
+ */
1934
+ export declare class BfTooltipDirective {
1935
+ private readonly overlay;
1936
+ private readonly document;
1937
+ private readonly injector;
1938
+ private readonly dir;
1939
+ private readonly host;
1940
+ /** The tooltip's text; empty shows no tooltip. */
1941
+ readonly bfTooltip: import("@angular/core").InputSignal<string>;
1942
+ /** The side it shows on (flipping when it would overflow), read each time it shows. */
1943
+ readonly bfTooltipPlacement: import("@angular/core").InputSignal<BfTooltipPlacement>;
1944
+ private readonly id;
1945
+ private anchored;
1946
+ private described;
1947
+ private keys;
1948
+ private showTimer;
1949
+ private hideTimer;
1950
+ constructor();
1951
+ /** Whether the tooltip is showing. */
1952
+ isShown(): boolean;
1953
+ /** Shows the tooltip now (no delay). Does nothing under a coarse pointer or without text. */
1954
+ show(): void;
1955
+ /** Hides the tooltip now and cancels a pending show. */
1956
+ hide(): void;
1957
+ /** @internal */
1958
+ pointerEntered(): void;
1959
+ /** @internal */
1960
+ pointerLeft(): void;
1961
+ /** @internal */
1962
+ focused(event: FocusEvent): void;
1963
+ private clearTimers;
1964
+ /** No hover under a coarse pointer: a tooltip would only show after a tap, over the finger. */
1965
+ private coarsePointer;
1966
+ private focusVisible;
1967
+ /** The element the tooltip describes: the host when it takes focus, else its first control. */
1968
+ private describedElement;
1969
+ private describe;
1970
+ private undescribe;
1971
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfTooltipDirective, never>;
1972
+ static ɵdir: i0.ɵɵDirectiveDeclaration<BfTooltipDirective, "[bfTooltip]", never, {
1973
+ "bfTooltip": {
1974
+ "alias": "bfTooltip";
1975
+ "required": true;
1976
+ "isSignal": true;
1977
+ };
1978
+ "bfTooltipPlacement": {
1979
+ "alias": "bfTooltipPlacement";
1980
+ "required": false;
1981
+ "isSignal": true;
1982
+ };
1983
+ }, {}, never, never, true, never>;
1984
+ }
1985
+ /**
1986
+ * The popover panel's surface without its padding, shared with the picker panels of the date and
1987
+ * time inputs. It scrolls past the viewport minus 1 rem each side; the panel itself takes focus
1988
+ * only when it holds no control, so it draws no ring. Internal to the overlay entry.
1989
+ */
1990
+ declare const POPOVER_SURFACE: string;
1991
+ /**
1992
+ * Non-modal panel anchored to a trigger, for filters, details or a small form (role `dialog`).
1993
+ * Put it in an `ng-template` that a `[bfPopoverTriggerFor]` opens; it takes the id the trigger's
1994
+ * `aria-controls` points at and is named by `bfPopoverLabel`, else by its first heading, else by
1995
+ * the trigger.
1996
+ *
1997
+ * @example
1998
+ * <button type="button" [bfPopoverTriggerFor]="details">Details</button>
1999
+ * <ng-template #details>
2000
+ * <bf-popover><h2 class="text-label">Delivery</h2><p>Arrives Thursday.</p></bf-popover>
2001
+ * </ng-template>
2002
+ * @summary Anchored, non-modal panel for filters, details or a small form
2003
+ * @category Overlays
2004
+ * @since 0.3.1
2005
+ * @slot default The panel's content: a heading, text, fields and actions.
2006
+ */
2007
+ export declare class BfPopoverComponent {
2008
+ /** The `bfPopoverTriggerFor` that opened this panel. */
2009
+ private readonly trigger;
2010
+ protected readonly id: string;
2011
+ protected readonly label: import("@angular/core").Signal<string>;
2012
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfPopoverComponent, never>;
2013
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfPopoverComponent, "bf-popover", never, {}, {}, never, ["*"], true, never>;
2014
+ }
2015
+ /**
2016
+ * Where a popover opens against its trigger; `start`/`end` follow the text direction.
2017
+ *
2018
+ * @summary Where a popover opens against its trigger, above or below, at either end
2019
+ * @since 0.3.1
2020
+ */
2021
+ type BfPopoverPlacement = 'below-start' | 'below-end' | 'above-start' | 'above-end';
2022
+ /**
2023
+ * Opens an `ng-template` (usually a `bf-popover`) as a non-modal panel anchored to the element:
2024
+ * a click (`Enter` or `Space` on a button) toggles it, focus moves to its first control, `Tab`
2025
+ * moves through it and on out (closing it, past the trigger), and `Escape`, a click outside or a
2026
+ * navigation to another URL path close it, returning focus to the trigger. The control it
2027
+ * decorates (the host, or the first control inside it, such as a `bf-button`'s button) carries
2028
+ * `aria-haspopup="dialog"`, `aria-expanded` and, while open, `aria-controls`. Export it as
2029
+ * `bfPopoverTrigger` to open and close it from code or from inside the panel.
2030
+ *
2031
+ * @example
2032
+ * <button type="button" [bfPopoverTriggerFor]="filters" #trigger="bfPopoverTrigger">Filters</button>
2033
+ * <ng-template #filters>
2034
+ * <bf-popover><h2>Filters</h2>…<button (click)="trigger.close()">Apply</button></bf-popover>
2035
+ * </ng-template>
2036
+ * @summary Opens an anchored, non-modal popover panel from any element or button
2037
+ * @since 0.3.1
2038
+ */
2039
+ export declare class BfPopoverTriggerDirective {
2040
+ private readonly overlay;
2041
+ private readonly document;
2042
+ private readonly injector;
2043
+ private readonly viewContainer;
2044
+ private readonly location;
2045
+ private readonly dir;
2046
+ private readonly host;
2047
+ /** The `ng-template` holding the panel (a `bf-popover`) this element opens. */
2048
+ readonly bfPopoverTriggerFor: import("@angular/core").InputSignal<TemplateRef<unknown>>;
2049
+ /** Where the panel opens (flipping when it would overflow), read each time it opens. */
2050
+ readonly bfPopoverPlacement: import("@angular/core").InputSignal<BfPopoverPlacement>;
2051
+ /** Accessible name of the panel. Empty: its first heading names it, else the trigger. */
2052
+ readonly bfPopoverLabel: import("@angular/core").InputSignal<string>;
2053
+ /** Emits when the panel opens. */
2054
+ readonly bfPopoverOpened: import("@angular/core").OutputEmitterRef<void>;
2055
+ /** Emits when the panel closes (`Escape`, a click outside, `Tab` out, a navigation or code). */
2056
+ readonly bfPopoverClosed: import("@angular/core").OutputEmitterRef<void>;
2057
+ private readonly openState;
2058
+ /** Whether the panel is open. */
2059
+ readonly isOpen: import("@angular/core").Signal<boolean>;
2060
+ /** The id the `bf-popover` panel takes, which the trigger's `aria-controls` points at. */
2061
+ readonly panelId: string;
2062
+ private anchored;
2063
+ private subscriptions;
2064
+ private stopNavigation;
2065
+ private stopHeading;
2066
+ constructor();
2067
+ /** Opens the panel and moves focus into it; does nothing while it is open. */
2068
+ open(): void;
2069
+ /**
2070
+ * Closes the panel; does nothing while it is closed.
2071
+ * @param restoreFocus Moves focus back to the trigger (default true).
2072
+ */
2073
+ close(restoreFocus?: boolean): void;
2074
+ /** Opens the panel when it is closed, closes it when it is open. */
2075
+ toggle(): void;
2076
+ /** The id of the trigger's control (assigned when it has none), which names a bare panel. */
2077
+ private labelId;
2078
+ /** The element that takes focus and carries the ARIA state: the host, or its first control. */
2079
+ private control;
2080
+ /**
2081
+ * `Tab` is not trapped: past the panel's last control it closes the panel and continues from the
2082
+ * trigger (the browser moves on to the control after it); `Shift+Tab` before the first control
2083
+ * closes it onto the trigger.
2084
+ */
2085
+ private tabbed;
2086
+ /**
2087
+ * Names the panel before focus moves in, so it is announced with its name: `bfPopoverLabel`
2088
+ * (bound by `bf-popover` itself), else its first heading (watched while it has none yet), else
2089
+ * the trigger.
2090
+ */
2091
+ private name;
2092
+ private teardown;
2093
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfPopoverTriggerDirective, never>;
2094
+ static ɵdir: i0.ɵɵDirectiveDeclaration<BfPopoverTriggerDirective, "[bfPopoverTriggerFor]", ["bfPopoverTrigger"], {
2095
+ "bfPopoverTriggerFor": {
2096
+ "alias": "bfPopoverTriggerFor";
2097
+ "required": true;
2098
+ "isSignal": true;
2099
+ };
2100
+ "bfPopoverPlacement": {
2101
+ "alias": "bfPopoverPlacement";
2102
+ "required": false;
2103
+ "isSignal": true;
2104
+ };
2105
+ "bfPopoverLabel": {
2106
+ "alias": "bfPopoverLabel";
2107
+ "required": false;
2108
+ "isSignal": true;
2109
+ };
2110
+ }, {
2111
+ "bfPopoverOpened": "bfPopoverOpened";
2112
+ "bfPopoverClosed": "bfPopoverClosed";
2113
+ }, never, never, true, never>;
2114
+ }
2115
+ /**
2116
+ * One choice of `bf-combobox` and `bf-multi-combobox`; `value` is any type (a string by default).
2117
+ *
2118
+ * @summary One combobox choice with its value, label, description, group and disabled flag
2119
+ * @since 0.3.1
2120
+ */
2121
+ interface BfComboboxOption<T = string> {
2122
+ /** The value the combobox takes when this option is picked. */
2123
+ value: T;
2124
+ /** The option's text in the list, and the field's text once it is picked. */
2125
+ label: string;
2126
+ /** A second, muted line under the label (an email, a role). */
2127
+ description?: string;
2128
+ /** Whether this option cannot be picked; it stays in the list, skipped by the arrow keys. */
2129
+ disabled?: boolean;
2130
+ /** The heading this option is listed under; options with the same group are listed together. */
2131
+ group?: string;
2132
+ }
2133
+ /**
2134
+ * Whether an option matches the typed query (the `filter` of the comboboxes). Called only for a
2135
+ * query that is not empty.
2136
+ *
2137
+ * @summary Decides whether a combobox option matches the text typed into the field
2138
+ * @since 0.3.1
2139
+ */
2140
+ type BfComboboxFilter<T = string> = (option: BfComboboxOption<T>, query: string) => boolean;
2141
+ /** Lower case without accents (`É` → `e`), so `"zoe"` finds `"Zoë"`. */
2142
+ declare function foldText(text: string): string;
2143
+ /** The default `filter`: the option's label contains the query, ignoring case and accents. */
2144
+ declare function labelContains(option: BfComboboxOption<unknown>, query: string): boolean;
2145
+ /** A visible option and the ids the listbox gives it. */
2146
+ interface ComboboxItem<T> {
2147
+ /** The option. */
2148
+ option: BfComboboxOption<T>;
2149
+ /** Its position in `options`, which keys its id. */
2150
+ index: number;
2151
+ /** The option element's id, which `aria-activedescendant` names while it is active. */
2152
+ id: string;
2153
+ }
2154
+ /** A run of visible options under one heading (`label` null: the ungrouped options). */
2155
+ interface ComboboxSection<T> {
2156
+ /** The group's heading, or null for the options without a group. */
2157
+ label: string | null;
2158
+ /** The heading's id, which names the `role="group"`. */
2159
+ id: string;
2160
+ /** The options in the section, in their `options` order. */
2161
+ items: ComboboxItem<T>[];
2162
+ }
2163
+ /** What the combobox core reads from the component that owns it. */
2164
+ interface ComboboxHost<T> {
2165
+ /** The options to choose from. */
2166
+ options: Signal<readonly BfComboboxOption<T>[]>;
2167
+ /** The match function, or null for no local filtering. */
2168
+ filter: Signal<BfComboboxFilter<T> | null>;
2169
+ /** Whether an option is picked (shows `aria-selected` and the check mark). */
2170
+ isSelected(option: BfComboboxOption<T>): boolean;
2171
+ /** Picks an option the user chose with `Enter` or a click. */
2172
+ pick(item: ComboboxItem<T>): void;
2173
+ /** The element the panel is anchored to and as wide as: the field box. */
2174
+ anchor(): HTMLElement;
2175
+ /** The panel component to open (the internal listbox). */
2176
+ panel: Type<unknown>;
2177
+ /** The listbox's accessible name: `aria-label` and `aria-labelledby` values. */
2178
+ listboxLabel: Signal<string | null>;
2179
+ /** The listbox's `aria-labelledby` value. */
2180
+ listboxLabelledby: Signal<string | null>;
2181
+ /** Whether the list allows several picks (`aria-multiselectable`). */
2182
+ multiple: boolean;
2183
+ /** Whether a request is running: the panel shows a spinner row. */
2184
+ loading: Signal<boolean>;
2185
+ /** The empty row's text. */
2186
+ emptyText: Signal<string>;
2187
+ /** The size of the field, which the option rows follow. */
2188
+ size: Signal<BfSize>;
2189
+ /** Emits the query each time the user changes it. */
2190
+ queried(query: string): void;
2191
+ }
2192
+ /**
2193
+ * The state and behaviour `bf-combobox` and `bf-multi-combobox` share: the query, the filtered and
2194
+ * grouped options, the active option, the keyboard and the anchored panel. Created in a field
2195
+ * initializer of the component (it injects the overlay and the component's view container), so
2196
+ * each component keeps its own typed value model. Internal to the overlay entry.
2197
+ */
2198
+ declare class ComboboxCore<T> {
2199
+ readonly host: ComboboxHost<T>;
2200
+ private readonly overlay;
2201
+ private readonly injector;
2202
+ private readonly viewContainer;
2203
+ private readonly dir;
2204
+ /** The listbox's id, which the input's `aria-controls` names. */
2205
+ readonly listboxId: string;
2206
+ /** The text typed since the last pick; null while the field shows its value. */
2207
+ private readonly queryState;
2208
+ readonly query: Signal<string | null>;
2209
+ private readonly openState;
2210
+ /** Whether the panel is open. */
2211
+ readonly isOpen: Signal<boolean>;
2212
+ /** The `index` of the active option, null for none. */
2213
+ private readonly activeIndex;
2214
+ /** The options that match the query, ungrouped first, then each group in first-seen order. */
2215
+ readonly sections: Signal<ComboboxSection<T>[]>;
2216
+ /** The visible options in list order: the order the arrow keys move through. */
2217
+ readonly items: Signal<ComboboxItem<T>[]>;
2218
+ /** The active option while it is visible and the panel is open. */
2219
+ readonly active: Signal<ComboboxItem<T> | null>;
2220
+ /** `aria-controls`: the listbox while it is rendered. */
2221
+ readonly controls: Signal<string | null>;
2222
+ private anchored;
2223
+ private subscriptions;
2224
+ constructor(host: ComboboxHost<T>);
2225
+ /**
2226
+ * Sets the typed text and emits `queried` when it changed; null shows the value again.
2227
+ * @param query The text, or null.
2228
+ */
2229
+ setQuery(query: string | null): void;
2230
+ /**
2231
+ * The user typed: the text becomes the query, the panel opens and the first match is active.
2232
+ * @param text The input's text.
2233
+ */
2234
+ typed(text: string): void;
2235
+ /** Opens the panel anchored to the field; does nothing while it is open. */
2236
+ open(): void;
2237
+ /** Closes the panel; does nothing while it is closed. */
2238
+ close(): void;
2239
+ /** Follows the field's size and place while open (chips that wrap make it taller). */
2240
+ reposition(): void;
2241
+ /**
2242
+ * Makes an option the active one (the pointer moved over it); a disabled one is skipped.
2243
+ * @param item The option.
2244
+ */
2245
+ activate(item: ComboboxItem<T>): void;
2246
+ /**
2247
+ * Picks an option the user clicked; a disabled one does nothing.
2248
+ * @param item The option.
2249
+ */
2250
+ choose(item: ComboboxItem<T>): void;
2251
+ /**
2252
+ * The list keys: arrows open and move (wrapping), `Home`/`End` move to the ends of the open
2253
+ * list, `Enter` picks the active option. Returns whether the key was handled (and cancelled).
2254
+ * @param event The input's keydown.
2255
+ */
2256
+ keydown(event: KeyboardEvent): boolean;
2257
+ /** Moves the active option by `step` through the enabled ones, wrapping at the ends. */
2258
+ private move;
2259
+ private firstEnabled;
2260
+ private teardown;
2261
+ }
2262
+ /** Equality of an option's value and a picked value under `compareWith`, never for `null`. */
2263
+ declare function sameValue<T>(compare: BfCompareWith<T>, optionValue: T, value: T | null): boolean;
2264
+ /**
2265
+ * Text field with a filtered list of options to pick one value from (the ARIA combobox pattern).
2266
+ * Typing filters the list by label, ignoring case and accents; the arrow keys move through it
2267
+ * and `Enter` picks. Generic over the option value (a string by default); `null` means nothing is
2268
+ * picked. For several values use `bf-multi-combobox`.
2269
+ *
2270
+ * @example
2271
+ * <bf-combobox label="Assignee" placeholder="Search people" [options]="people" [(value)]="assigneeId" />
2272
+ * <bf-combobox label="Owner" [options]="people" [formField]="task.ownerId" />
2273
+ * @summary Text field that filters a list of options as you type and picks one
2274
+ * @category Forms
2275
+ * @since 0.3.1
2276
+ */
2277
+ export declare class BfComboboxComponent<T = string> implements FormValueControl<T | null> {
2278
+ /** The picked option's value, `null` while nothing is picked; two-way bindable and bound by
2279
+ * `[formField]`. */
2280
+ readonly value: import("@angular/core").ModelSignal<T | null>;
2281
+ /** The options to choose from; with server search, the latest results (keep the picked one). */
2282
+ readonly options: import("@angular/core").InputSignal<readonly BfComboboxOption<T>[]>;
2283
+ /** Equality for matching `value` to an option (default `Object.is`); pass one for object values. */
2284
+ readonly compareWith: import("@angular/core").InputSignal<BfCompareWith<T>>;
2285
+ /** Whether an option matches the typed text (default: its label contains it, ignoring case and
2286
+ * accents); `null` shows `options` unfiltered, for results filtered by a server. */
2287
+ readonly filter: import("@angular/core").InputSignal<BfComboboxFilter<T> | null>;
2288
+ /** Height step: sm 32, md 40, lg 48 px; unset follows `provideBfDefaults()` (`fieldSize`, `md`
2289
+ * by default). */
2290
+ readonly size: import("@angular/core").InputSignal<BfSize | undefined>;
2291
+ /** Visible label above the field. */
2292
+ readonly label: import("@angular/core").InputSignal<string>;
2293
+ /** Accessible name when no visible label is rendered. Ignored when `label` is set. */
2294
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
2295
+ /** Id(s) of the element(s) that name the field when no visible label is rendered. Ignored when
2296
+ * `label` is set. */
2297
+ readonly ariaLabelledby: import("@angular/core").InputSignal<string>;
2298
+ /** Hint text shown in the empty field. */
2299
+ readonly placeholder: import("@angular/core").InputSignal<string>;
2300
+ /** Helper text under the field. */
2301
+ readonly helpText: import("@angular/core").InputSignal<string>;
2302
+ /** Explicit error text; takes precedence over Signal Forms errors. */
2303
+ readonly errorMessage: import("@angular/core").InputSignal<string>;
2304
+ /** Text of the list's row when no option matches; empty uses the `comboboxEmpty` label. */
2305
+ readonly emptyLabel: import("@angular/core").InputSignal<string>;
2306
+ /** Shows a loading row in the list, while a server search for the typed text runs. */
2307
+ readonly loading: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2308
+ /** Disables the field. */
2309
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2310
+ /** Shows the value but blocks changes; the field stays focusable and the list never opens. */
2311
+ readonly readonly: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2312
+ /** Marks the field required. */
2313
+ readonly required: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2314
+ /** Field validity from Signal Forms. */
2315
+ readonly invalid: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2316
+ /** Whether the user has left the field. */
2317
+ readonly touched: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2318
+ /** Validation errors from Signal Forms. */
2319
+ readonly errors: import("@angular/core").InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
2320
+ /** Native name attribute of the text input. */
2321
+ readonly name: import("@angular/core").InputSignal<string>;
2322
+ /** Input id; generated when not set. */
2323
+ readonly id: import("@angular/core").InputSignal<string>;
2324
+ /** Emitted with the new value after the user picks an option, or `null` after clearing the text. */
2325
+ readonly changed: import("@angular/core").OutputEmitterRef<T | null>;
2326
+ /** Emitted with the typed text each time the user changes it (`''` once it is cleared), for a
2327
+ * server search. */
2328
+ readonly queried: import("@angular/core").OutputEmitterRef<string>;
2329
+ /** Emitted when the input gains focus. */
2330
+ readonly focused: import("@angular/core").OutputEmitterRef<FocusEvent>;
2331
+ /** Emitted when the input loses focus. */
2332
+ readonly blurred: import("@angular/core").OutputEmitterRef<FocusEvent>;
2333
+ /** Emitted on blur so Signal Forms marks the field touched. */
2334
+ readonly touch: import("@angular/core").OutputEmitterRef<void>;
2335
+ private readonly el;
2336
+ private readonly anchorEl;
2337
+ private readonly defaults;
2338
+ private readonly labels;
2339
+ /** The label of the last option the user picked, for a value no current option matches (the
2340
+ * results of a later server search). */
2341
+ private readonly pickedLabel;
2342
+ /** The size in effect: `size`, else the app's `fieldSize` default. */
2343
+ protected readonly resolvedSize: import("@angular/core").Signal<BfSize>;
2344
+ protected readonly core: ComboboxCore<T>;
2345
+ /** The picked option's label, `''` while nothing is picked. */
2346
+ readonly valueLabel: import("@angular/core").Signal<string>;
2347
+ /** The input's text: what the user is typing, else the picked option's label. */
2348
+ protected readonly text: import("@angular/core").Signal<string>;
2349
+ readonly errorText: import("@angular/core").Signal<string>;
2350
+ readonly showError: import("@angular/core").Signal<boolean>;
2351
+ readonly describedBy: import("@angular/core").Signal<string | null>;
2352
+ /** `aria-errormessage`: the error paragraph while `aria-invalid` is set. */
2353
+ readonly errorMessageId: import("@angular/core").Signal<string | null>;
2354
+ /** `aria-label` value: only when there is no visible label. */
2355
+ readonly ariaLabelAttr: import("@angular/core").Signal<string | null>;
2356
+ /** `aria-labelledby` value, under the same rule as `ariaLabelAttr`. */
2357
+ readonly ariaLabelledbyAttr: import("@angular/core").Signal<string | null>;
2358
+ readonly wrapperClasses: import("@angular/core").Signal<string>;
2359
+ readonly classes: import("@angular/core").Signal<string>;
2360
+ /**
2361
+ * Focuses the input; Signal Forms calls it from `focusBoundControl()`.
2362
+ * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.
2363
+ */
2364
+ focus(options?: FocusOptions): void;
2365
+ /**
2366
+ * Typing filters the list and opens it.
2367
+ * @internal
2368
+ */
2369
+ onInput(el: HTMLInputElement): void;
2370
+ /**
2371
+ * Opens the list on a click into the field.
2372
+ * @internal
2373
+ */
2374
+ onClick(): void;
2375
+ /**
2376
+ * The list keys (arrows, `Home`, `End`, `Enter`), and `Escape` on a closed list, which drops the
2377
+ * typed text. `Escape` on an open list is the panel's: it closes it.
2378
+ * @internal
2379
+ */
2380
+ onKeydown(event: KeyboardEvent): void;
2381
+ /**
2382
+ * Leaving the field closes the list. Typed text that names an option exactly picks it; empty
2383
+ * text clears the value; any other text reverts to the picked option's label. Marks the field
2384
+ * touched.
2385
+ * @internal
2386
+ */
2387
+ onBlur(event: FocusEvent): void;
2388
+ /** Picks an option (Enter or a click): the value, the field's text, and the list closes. */
2389
+ private pick;
2390
+ private set;
2391
+ /**
2392
+ * Drops the typed text and writes the field's text to the input at once: a pick can follow the
2393
+ * last keystroke before change detection has run, when the binding alone would see no change.
2394
+ */
2395
+ private resetQuery;
2396
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfComboboxComponent<any>, never>;
2397
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfComboboxComponent<any>, "bf-combobox", never, {
2398
+ "value": {
2399
+ "alias": "value";
2400
+ "required": false;
2401
+ "isSignal": true;
2402
+ };
2403
+ "options": {
2404
+ "alias": "options";
2405
+ "required": true;
2406
+ "isSignal": true;
2407
+ };
2408
+ "compareWith": {
2409
+ "alias": "compareWith";
2410
+ "required": false;
2411
+ "isSignal": true;
2412
+ };
2413
+ "filter": {
2414
+ "alias": "filter";
2415
+ "required": false;
2416
+ "isSignal": true;
2417
+ };
2418
+ "size": {
2419
+ "alias": "size";
2420
+ "required": false;
2421
+ "isSignal": true;
2422
+ };
2423
+ "label": {
2424
+ "alias": "label";
2425
+ "required": false;
2426
+ "isSignal": true;
2427
+ };
2428
+ "ariaLabel": {
2429
+ "alias": "ariaLabel";
2430
+ "required": false;
2431
+ "isSignal": true;
2432
+ };
2433
+ "ariaLabelledby": {
2434
+ "alias": "ariaLabelledby";
2435
+ "required": false;
2436
+ "isSignal": true;
2437
+ };
2438
+ "placeholder": {
2439
+ "alias": "placeholder";
2440
+ "required": false;
2441
+ "isSignal": true;
2442
+ };
2443
+ "helpText": {
2444
+ "alias": "helpText";
2445
+ "required": false;
2446
+ "isSignal": true;
2447
+ };
2448
+ "errorMessage": {
2449
+ "alias": "errorMessage";
2450
+ "required": false;
2451
+ "isSignal": true;
2452
+ };
2453
+ "emptyLabel": {
2454
+ "alias": "emptyLabel";
2455
+ "required": false;
2456
+ "isSignal": true;
2457
+ };
2458
+ "loading": {
2459
+ "alias": "loading";
2460
+ "required": false;
2461
+ "isSignal": true;
2462
+ };
2463
+ "disabled": {
2464
+ "alias": "disabled";
2465
+ "required": false;
2466
+ "isSignal": true;
2467
+ };
2468
+ "readonly": {
2469
+ "alias": "readonly";
2470
+ "required": false;
2471
+ "isSignal": true;
2472
+ };
2473
+ "required": {
2474
+ "alias": "required";
2475
+ "required": false;
2476
+ "isSignal": true;
2477
+ };
2478
+ "invalid": {
2479
+ "alias": "invalid";
2480
+ "required": false;
2481
+ "isSignal": true;
2482
+ };
2483
+ "touched": {
2484
+ "alias": "touched";
2485
+ "required": false;
2486
+ "isSignal": true;
2487
+ };
2488
+ "errors": {
2489
+ "alias": "errors";
2490
+ "required": false;
2491
+ "isSignal": true;
2492
+ };
2493
+ "name": {
2494
+ "alias": "name";
2495
+ "required": false;
2496
+ "isSignal": true;
2497
+ };
2498
+ "id": {
2499
+ "alias": "id";
2500
+ "required": false;
2501
+ "isSignal": true;
2502
+ };
2503
+ }, {
2504
+ "value": "valueChange";
2505
+ "changed": "changed";
2506
+ "queried": "queried";
2507
+ "focused": "focused";
2508
+ "blurred": "blurred";
2509
+ "touch": "touch";
2510
+ }, never, never, true, never>;
2511
+ }
2512
+ /** A picked value as a tag: its label, for the tag and its remove button's name. */
2513
+ interface BfMultiComboboxTag<T> {
2514
+ value: T;
2515
+ label: string;
2516
+ }
2517
+ /**
2518
+ * Text field with a filtered list of options to pick several values from, shown as removable tags
2519
+ * inside the field (the ARIA combobox pattern with a multi-select listbox). Typing filters the
2520
+ * list by label, ignoring case and accents; `Enter` or a click adds or removes the active option
2521
+ * and the list stays open. Generic over the option value (a string by default); the value is an
2522
+ * array, empty while nothing is picked. For one value use `bf-combobox`.
2523
+ *
2524
+ * @example
2525
+ * <bf-multi-combobox label="Labels" placeholder="Add labels" [options]="labels" [(value)]="picked" />
2526
+ * <bf-multi-combobox label="Reviewers" [options]="people" [formField]="task.reviewerIds" />
2527
+ * @summary Text field that filters options as you type and picks several as tags
2528
+ * @category Forms
2529
+ * @since 0.3.1
2530
+ */
2531
+ export declare class BfMultiComboboxComponent<T = string> implements FormValueControl<readonly T[]> {
2532
+ /** The picked options' values in the order they were picked, empty while nothing is picked;
2533
+ * two-way bindable and bound by `[formField]`. */
2534
+ readonly value: import("@angular/core").ModelSignal<readonly T[]>;
2535
+ /** The options to choose from; with server search, the latest results. */
2536
+ readonly options: import("@angular/core").InputSignal<readonly BfComboboxOption<T>[]>;
2537
+ /** Equality for matching `value` to an option (default `Object.is`); pass one for object values. */
2538
+ readonly compareWith: import("@angular/core").InputSignal<BfCompareWith<T>>;
2539
+ /** Whether an option matches the typed text (default: its label contains it, ignoring case and
2540
+ * accents); `null` shows `options` unfiltered, for results filtered by a server. */
2541
+ readonly filter: import("@angular/core").InputSignal<BfComboboxFilter<T> | null>;
2542
+ /** Height step of the field (its minimum height): sm 32, md 40, lg 48 px; unset follows
2543
+ * `provideBfDefaults()` (`fieldSize`, `md` by default). */
2544
+ readonly size: import("@angular/core").InputSignal<BfSize | undefined>;
2545
+ /** Visible label above the field. */
2546
+ readonly label: import("@angular/core").InputSignal<string>;
2547
+ /** Accessible name when no visible label is rendered. Ignored when `label` is set. */
2548
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
2549
+ /** Id(s) of the element(s) that name the field when no visible label is rendered. Ignored when
2550
+ * `label` is set. */
2551
+ readonly ariaLabelledby: import("@angular/core").InputSignal<string>;
2552
+ /** Hint text shown while nothing is picked. */
2553
+ readonly placeholder: import("@angular/core").InputSignal<string>;
2554
+ /** Helper text under the field. */
2555
+ readonly helpText: import("@angular/core").InputSignal<string>;
2556
+ /** Explicit error text; takes precedence over Signal Forms errors. */
2557
+ readonly errorMessage: import("@angular/core").InputSignal<string>;
2558
+ /** Text of the list's row when no option matches; empty uses the `comboboxEmpty` label. */
2559
+ readonly emptyLabel: import("@angular/core").InputSignal<string>;
2560
+ /** Shows a loading row in the list, while a server search for the typed text runs. */
2561
+ readonly loading: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2562
+ /** Disables the field and its tags. */
2563
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2564
+ /** Shows the tags but blocks changes: no remove buttons, and the list never opens. */
2565
+ readonly readonly: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2566
+ /** Marks the field required (at least one value). */
2567
+ readonly required: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2568
+ /** Field validity from Signal Forms. */
2569
+ readonly invalid: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2570
+ /** Whether the user has left the field. */
2571
+ readonly touched: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2572
+ /** Validation errors from Signal Forms. */
2573
+ readonly errors: import("@angular/core").InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
2574
+ /** Native name attribute of the text input. */
2575
+ readonly name: import("@angular/core").InputSignal<string>;
2576
+ /** Input id; generated when not set. */
2577
+ readonly id: import("@angular/core").InputSignal<string>;
2578
+ /** Emitted with the new values after the user adds or removes one. */
2579
+ readonly changed: import("@angular/core").OutputEmitterRef<readonly T[]>;
2580
+ /** Emitted with the typed text each time the user changes it (`''` once it is cleared), for a
2581
+ * server search. */
2582
+ readonly queried: import("@angular/core").OutputEmitterRef<string>;
2583
+ /** Emitted when the input gains focus. */
2584
+ readonly focused: import("@angular/core").OutputEmitterRef<FocusEvent>;
2585
+ /** Emitted when the input loses focus. */
2586
+ readonly blurred: import("@angular/core").OutputEmitterRef<FocusEvent>;
2587
+ /** Emitted on blur so Signal Forms marks the field touched. */
2588
+ readonly touch: import("@angular/core").OutputEmitterRef<void>;
2589
+ private readonly el;
2590
+ private readonly anchorEl;
2591
+ private readonly defaults;
2592
+ protected readonly labels: import("@bitforgehq/ui").BfLabels;
2593
+ /** The labels of the options the user picked, for values no current option matches (the
2594
+ * results of a later server search). */
2595
+ private readonly pickedLabels;
2596
+ /** The size in effect: `size`, else the app's `fieldSize` default. */
2597
+ protected readonly resolvedSize: import("@angular/core").Signal<BfSize>;
2598
+ protected readonly core: ComboboxCore<T>;
2599
+ /** The picked values with their labels, in `value` order. */
2600
+ protected readonly tags: import("@angular/core").Signal<BfMultiComboboxTag<T>[]>;
2601
+ /** Whether the user can change the value (not disabled, not read-only). */
2602
+ protected readonly editable: import("@angular/core").Signal<boolean>;
2603
+ readonly errorText: import("@angular/core").Signal<string>;
2604
+ readonly showError: import("@angular/core").Signal<boolean>;
2605
+ readonly describedBy: import("@angular/core").Signal<string | null>;
2606
+ /** `aria-errormessage`: the error paragraph while `aria-invalid` is set. */
2607
+ readonly errorMessageId: import("@angular/core").Signal<string | null>;
2608
+ /** `aria-label` value: only when there is no visible label. */
2609
+ readonly ariaLabelAttr: import("@angular/core").Signal<string | null>;
2610
+ /** `aria-labelledby` value, under the same rule as `ariaLabelAttr`. */
2611
+ readonly ariaLabelledbyAttr: import("@angular/core").Signal<string | null>;
2612
+ readonly boxClasses: import("@angular/core").Signal<string>;
2613
+ protected readonly inputClasses: string;
2614
+ protected readonly tagClasses: string;
2615
+ protected readonly removeClasses: string;
2616
+ protected readonly crossClasses: string;
2617
+ constructor();
2618
+ /**
2619
+ * Focuses the input; Signal Forms calls it from `focusBoundControl()`.
2620
+ * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.
2621
+ */
2622
+ focus(options?: FocusOptions): void;
2623
+ /**
2624
+ * Typing filters the list and opens it.
2625
+ * @internal
2626
+ */
2627
+ onInput(el: HTMLInputElement): void;
2628
+ /**
2629
+ * Opens the list on a click into the input.
2630
+ * @internal
2631
+ */
2632
+ onClick(): void;
2633
+ /**
2634
+ * A press on the box itself (not a tag's button, not the input) focuses the input and opens the
2635
+ * list.
2636
+ * @internal
2637
+ */
2638
+ onBoxMousedown(event: MouseEvent): void;
2639
+ /**
2640
+ * The list keys (arrows, `Home`, `End`, `Enter`), `Backspace` in the empty input (removes the last
2641
+ * tag) and `Escape` on a closed list (drops the typed text).
2642
+ * @internal
2643
+ */
2644
+ onKeydown(event: KeyboardEvent): void;
2645
+ /**
2646
+ * Leaving the field closes the list and drops the typed text; marks the field touched.
2647
+ * @internal
2648
+ */
2649
+ onBlur(event: FocusEvent): void;
2650
+ /**
2651
+ * Removes the value at `index` (a tag's remove button) and returns focus to the input.
2652
+ * @internal
2653
+ */
2654
+ remove(index: number): void;
2655
+ /** Adds a picked option, or removes it when it is picked already; the typed text clears and the
2656
+ * list stays open. */
2657
+ private toggle;
2658
+ private indexOf;
2659
+ /**
2660
+ * Drops the typed text and writes the field's text to the input at once: a pick can follow the
2661
+ * last keystroke before change detection has run, when the binding alone would see no change.
2662
+ */
2663
+ private resetQuery;
2664
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfMultiComboboxComponent<any>, never>;
2665
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfMultiComboboxComponent<any>, "bf-multi-combobox", never, {
2666
+ "value": {
2667
+ "alias": "value";
2668
+ "required": false;
2669
+ "isSignal": true;
2670
+ };
2671
+ "options": {
2672
+ "alias": "options";
2673
+ "required": true;
2674
+ "isSignal": true;
2675
+ };
2676
+ "compareWith": {
2677
+ "alias": "compareWith";
2678
+ "required": false;
2679
+ "isSignal": true;
2680
+ };
2681
+ "filter": {
2682
+ "alias": "filter";
2683
+ "required": false;
2684
+ "isSignal": true;
2685
+ };
2686
+ "size": {
2687
+ "alias": "size";
2688
+ "required": false;
2689
+ "isSignal": true;
2690
+ };
2691
+ "label": {
2692
+ "alias": "label";
2693
+ "required": false;
2694
+ "isSignal": true;
2695
+ };
2696
+ "ariaLabel": {
2697
+ "alias": "ariaLabel";
2698
+ "required": false;
2699
+ "isSignal": true;
2700
+ };
2701
+ "ariaLabelledby": {
2702
+ "alias": "ariaLabelledby";
2703
+ "required": false;
2704
+ "isSignal": true;
2705
+ };
2706
+ "placeholder": {
2707
+ "alias": "placeholder";
2708
+ "required": false;
2709
+ "isSignal": true;
2710
+ };
2711
+ "helpText": {
2712
+ "alias": "helpText";
2713
+ "required": false;
2714
+ "isSignal": true;
2715
+ };
2716
+ "errorMessage": {
2717
+ "alias": "errorMessage";
2718
+ "required": false;
2719
+ "isSignal": true;
2720
+ };
2721
+ "emptyLabel": {
2722
+ "alias": "emptyLabel";
2723
+ "required": false;
2724
+ "isSignal": true;
2725
+ };
2726
+ "loading": {
2727
+ "alias": "loading";
2728
+ "required": false;
2729
+ "isSignal": true;
2730
+ };
2731
+ "disabled": {
2732
+ "alias": "disabled";
2733
+ "required": false;
2734
+ "isSignal": true;
2735
+ };
2736
+ "readonly": {
2737
+ "alias": "readonly";
2738
+ "required": false;
2739
+ "isSignal": true;
2740
+ };
2741
+ "required": {
2742
+ "alias": "required";
2743
+ "required": false;
2744
+ "isSignal": true;
2745
+ };
2746
+ "invalid": {
2747
+ "alias": "invalid";
2748
+ "required": false;
2749
+ "isSignal": true;
2750
+ };
2751
+ "touched": {
2752
+ "alias": "touched";
2753
+ "required": false;
2754
+ "isSignal": true;
2755
+ };
2756
+ "errors": {
2757
+ "alias": "errors";
2758
+ "required": false;
2759
+ "isSignal": true;
2760
+ };
2761
+ "name": {
2762
+ "alias": "name";
2763
+ "required": false;
2764
+ "isSignal": true;
2765
+ };
2766
+ "id": {
2767
+ "alias": "id";
2768
+ "required": false;
2769
+ "isSignal": true;
2770
+ };
2771
+ }, {
2772
+ "value": "valueChange";
2773
+ "changed": "changed";
2774
+ "queried": "queried";
2775
+ "focused": "focused";
2776
+ "blurred": "blurred";
2777
+ "touch": "touch";
2778
+ }, never, never, true, never>;
2779
+ }
2780
+ /**
2781
+ * How `bf-date-input` picks a date besides typing: `calendar` adds a button that opens a
2782
+ * `bf-calendar` in a popover, `none` keeps the field typed only.
2783
+ *
2784
+ * @summary Whether a date input offers a calendar popover besides typing
2785
+ * @since 0.3.1
2786
+ */
2787
+ type BfDateInputPicker = 'calendar' | 'none';
2788
+ /**
2789
+ * Date field typed part by part (day, month and year in the locale's order) with a calendar
2790
+ * popover, valued as an ISO date string and bound like any other field.
2791
+ *
2792
+ * @example
2793
+ * <bf-date-input label="Due date" min="2026-01-01" [(value)]="due" />
2794
+ * <bf-date-input label="Birthday" picker="none" [formField]="profile.birthday" />
2795
+ * @summary Typed date field with a calendar popover, valued as an ISO date string
2796
+ * @category Forms
2797
+ * @since 0.3.1
2798
+ */
2799
+ export declare class BfDateInputComponent implements FormValueControl<string | null> {
2800
+ /** The date as an ISO string ('YYYY-MM-DD'), `null` while empty or incomplete; two-way bindable
2801
+ * and bound by `[formField]`. */
2802
+ readonly value: import("@angular/core").ModelSignal<string | null>;
2803
+ /** The earliest valid date (ISO): earlier dates show an error, and the calendar stops there. */
2804
+ readonly min: import("@angular/core").InputSignal<string | undefined>;
2805
+ /** The latest valid date (ISO): later dates show an error, and the calendar stops there. */
2806
+ readonly max: import("@angular/core").InputSignal<string | undefined>;
2807
+ /** Rules out more dates (weekends, booked days): disabled in the calendar, an error when typed. */
2808
+ readonly disabledDate: import("@angular/core").InputSignal<BfCalendarDisabledDate | null>;
2809
+ /** `calendar` adds the button that opens a calendar popover; `none` keeps the field typed only. */
2810
+ readonly picker: import("@angular/core").InputSignal<BfDateInputPicker>;
2811
+ /** Renders the platform's date picker (`input type="date"`) under a coarse pointer (touch). */
2812
+ readonly native: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2813
+ /** BCP 47 locale of the part order, the separators and the calendar; empty follows the
2814
+ * document's `lang`, else English. */
2815
+ readonly locale: import("@angular/core").InputSignal<string>;
2816
+ /** Height step: sm 32, md 40, lg 48 px; unset follows `provideBfDefaults()` (`fieldSize`, `md`
2817
+ * by default). */
2818
+ readonly size: import("@angular/core").InputSignal<BfSize | undefined>;
2819
+ /** Visible label above the field. */
2820
+ readonly label: import("@angular/core").InputSignal<string>;
2821
+ /** Accessible name when no visible label is rendered. Ignored when `label` is set. */
2822
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
2823
+ /** Id(s) of the element(s) that name the field when no visible label is rendered. Ignored when
2824
+ * `label` is set. */
2825
+ readonly ariaLabelledby: import("@angular/core").InputSignal<string>;
2826
+ /** Helper text under the field. */
2827
+ readonly helpText: import("@angular/core").InputSignal<string>;
2828
+ /** Explicit error text; takes precedence over the field's own errors and Signal Forms errors. */
2829
+ readonly errorMessage: import("@angular/core").InputSignal<string>;
2830
+ /** Disables the field and its calendar button. */
2831
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2832
+ /** Shows the date but blocks changes; the parts stay focusable and expose `aria-readonly`. */
2833
+ readonly readonly: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2834
+ /** Marks the field required. */
2835
+ readonly required: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2836
+ /** Field validity from Signal Forms. */
2837
+ readonly invalid: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2838
+ /** Whether the user has left the field. */
2839
+ readonly touched: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2840
+ /** Validation errors from Signal Forms. */
2841
+ readonly errors: import("@angular/core").InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
2842
+ /** Native name attribute of the platform input (`native` under a coarse pointer). */
2843
+ readonly name: import("@angular/core").InputSignal<string>;
2844
+ /** Field id; generated when not set. */
2845
+ readonly id: import("@angular/core").InputSignal<string>;
2846
+ /** Emitted with the new date right after a user change: `null` once it is cleared or incomplete. */
2847
+ readonly changed: import("@angular/core").OutputEmitterRef<string | null>;
2848
+ /** Emitted when focus leaves the field (not into its calendar), so Signal Forms marks it touched. */
2849
+ readonly touch: import("@angular/core").OutputEmitterRef<void>;
2850
+ private readonly field;
2851
+ /**
2852
+ * Focuses the first empty part (else the first part); Signal Forms calls it from
2853
+ * `focusBoundControl()`.
2854
+ * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.
2855
+ */
2856
+ focus(options?: FocusOptions): void;
2857
+ /** Opens the calendar popover; does nothing without a picker, or while disabled or read-only. */
2858
+ openPicker(): void;
2859
+ /** Closes the calendar popover, focus back on its button; does nothing while it is closed. */
2860
+ closePicker(): void;
2861
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfDateInputComponent, never>;
2862
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfDateInputComponent, "bf-date-input", never, {
2863
+ "value": {
2864
+ "alias": "value";
2865
+ "required": false;
2866
+ "isSignal": true;
2867
+ };
2868
+ "min": {
2869
+ "alias": "min";
2870
+ "required": false;
2871
+ "isSignal": true;
2872
+ };
2873
+ "max": {
2874
+ "alias": "max";
2875
+ "required": false;
2876
+ "isSignal": true;
2877
+ };
2878
+ "disabledDate": {
2879
+ "alias": "disabledDate";
2880
+ "required": false;
2881
+ "isSignal": true;
2882
+ };
2883
+ "picker": {
2884
+ "alias": "picker";
2885
+ "required": false;
2886
+ "isSignal": true;
2887
+ };
2888
+ "native": {
2889
+ "alias": "native";
2890
+ "required": false;
2891
+ "isSignal": true;
2892
+ };
2893
+ "locale": {
2894
+ "alias": "locale";
2895
+ "required": false;
2896
+ "isSignal": true;
2897
+ };
2898
+ "size": {
2899
+ "alias": "size";
2900
+ "required": false;
2901
+ "isSignal": true;
2902
+ };
2903
+ "label": {
2904
+ "alias": "label";
2905
+ "required": false;
2906
+ "isSignal": true;
2907
+ };
2908
+ "ariaLabel": {
2909
+ "alias": "ariaLabel";
2910
+ "required": false;
2911
+ "isSignal": true;
2912
+ };
2913
+ "ariaLabelledby": {
2914
+ "alias": "ariaLabelledby";
2915
+ "required": false;
2916
+ "isSignal": true;
2917
+ };
2918
+ "helpText": {
2919
+ "alias": "helpText";
2920
+ "required": false;
2921
+ "isSignal": true;
2922
+ };
2923
+ "errorMessage": {
2924
+ "alias": "errorMessage";
2925
+ "required": false;
2926
+ "isSignal": true;
2927
+ };
2928
+ "disabled": {
2929
+ "alias": "disabled";
2930
+ "required": false;
2931
+ "isSignal": true;
2932
+ };
2933
+ "readonly": {
2934
+ "alias": "readonly";
2935
+ "required": false;
2936
+ "isSignal": true;
2937
+ };
2938
+ "required": {
2939
+ "alias": "required";
2940
+ "required": false;
2941
+ "isSignal": true;
2942
+ };
2943
+ "invalid": {
2944
+ "alias": "invalid";
2945
+ "required": false;
2946
+ "isSignal": true;
2947
+ };
2948
+ "touched": {
2949
+ "alias": "touched";
2950
+ "required": false;
2951
+ "isSignal": true;
2952
+ };
2953
+ "errors": {
2954
+ "alias": "errors";
2955
+ "required": false;
2956
+ "isSignal": true;
2957
+ };
2958
+ "name": {
2959
+ "alias": "name";
2960
+ "required": false;
2961
+ "isSignal": true;
2962
+ };
2963
+ "id": {
2964
+ "alias": "id";
2965
+ "required": false;
2966
+ "isSignal": true;
2967
+ };
2968
+ }, {
2969
+ "value": "valueChange";
2970
+ "changed": "changed";
2971
+ "touch": "touch";
2972
+ }, never, never, true, never>;
2973
+ }
2974
+ /**
2975
+ * How `bf-time-input` picks a time besides typing: `list` adds a button that opens a list of
2976
+ * times every `step` minutes, `none` keeps the field typed only.
2977
+ *
2978
+ * @summary Whether a time input offers a popover list of times besides typing
2979
+ * @since 0.3.1
2980
+ */
2981
+ type BfTimeInputPicker = 'list' | 'none';
2982
+ /**
2983
+ * The clock of a time field: `h12` counts 1–12 with an AM/PM part, `h23` counts 0–23.
2984
+ *
2985
+ * @summary A twelve-hour clock with AM and PM, or a twenty-four-hour clock
2986
+ * @since 0.3.1
2987
+ */
2988
+ type BfTimeInputHourCycle = 'h12' | 'h23';
2989
+ /**
2990
+ * Time field typed part by part (hour, minute, optional seconds, AM/PM under a 12-hour clock)
2991
+ * with a popover list of times, valued as an ISO time string.
2992
+ *
2993
+ * @example
2994
+ * <bf-time-input label="Start" [step]="15" [(value)]="start" />
2995
+ * <bf-time-input label="Alarm" hourCycle="h12" [formField]="settings.alarm" />
2996
+ * @summary Typed time-of-day field with a popover list of times, valued as an ISO string
2997
+ * @category Forms
2998
+ * @since 0.3.1
2999
+ */
3000
+ export declare class BfTimeInputComponent implements FormValueControl<string | null> {
3001
+ /** The time as an ISO string ('HH:mm', 'HH:mm:ss' with `seconds`), `null` while empty or
3002
+ * incomplete; two-way bindable and bound by `[formField]`. */
3003
+ readonly value: import("@angular/core").ModelSignal<string | null>;
3004
+ /** The earliest valid time ('HH:mm'): earlier times show an error and are disabled in the list. */
3005
+ readonly min: import("@angular/core").InputSignal<string | undefined>;
3006
+ /** The latest valid time ('HH:mm'): later times show an error and are disabled in the list. */
3007
+ readonly max: import("@angular/core").InputSignal<string | undefined>;
3008
+ /** Minutes between the times of the list, from midnight (1–720). */
3009
+ readonly step: import("@angular/core").InputSignalWithTransform<number, unknown>;
3010
+ /** Adds a seconds part; the value becomes 'HH:mm:ss'. */
3011
+ readonly seconds: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3012
+ /** Forces a 12-hour (`h12`, with AM/PM) or 24-hour (`h23`) clock; unset follows the locale. */
3013
+ readonly hourCycle: import("@angular/core").InputSignal<BfTimeInputHourCycle | undefined>;
3014
+ /** `list` adds the button that opens the list of times; `none` keeps the field typed only. */
3015
+ readonly picker: import("@angular/core").InputSignal<BfTimeInputPicker>;
3016
+ /** Renders the platform's time picker (`input type="time"`) under a coarse pointer (touch). */
3017
+ readonly native: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3018
+ /** BCP 47 locale of the part order, the separators, the clock and the AM/PM names; empty
3019
+ * follows the document's `lang`, else English. */
3020
+ readonly locale: import("@angular/core").InputSignal<string>;
3021
+ /** Height step: sm 32, md 40, lg 48 px; unset follows `provideBfDefaults()` (`fieldSize`, `md`
3022
+ * by default). */
3023
+ readonly size: import("@angular/core").InputSignal<BfSize | undefined>;
3024
+ /** Visible label above the field. */
3025
+ readonly label: import("@angular/core").InputSignal<string>;
3026
+ /** Accessible name when no visible label is rendered. Ignored when `label` is set. */
3027
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
3028
+ /** Id(s) of the element(s) that name the field when no visible label is rendered. Ignored when
3029
+ * `label` is set. */
3030
+ readonly ariaLabelledby: import("@angular/core").InputSignal<string>;
3031
+ /** Helper text under the field. */
3032
+ readonly helpText: import("@angular/core").InputSignal<string>;
3033
+ /** Explicit error text; takes precedence over the field's own errors and Signal Forms errors. */
3034
+ readonly errorMessage: import("@angular/core").InputSignal<string>;
3035
+ /** Disables the field and its list button. */
3036
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3037
+ /** Shows the time but blocks changes; the parts stay focusable and expose `aria-readonly`. */
3038
+ readonly readonly: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3039
+ /** Marks the field required. */
3040
+ readonly required: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3041
+ /** Field validity from Signal Forms. */
3042
+ readonly invalid: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3043
+ /** Whether the user has left the field. */
3044
+ readonly touched: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3045
+ /** Validation errors from Signal Forms. */
3046
+ readonly errors: import("@angular/core").InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
3047
+ /** Native name attribute of the platform input (`native` under a coarse pointer). */
3048
+ readonly name: import("@angular/core").InputSignal<string>;
3049
+ /** Field id; generated when not set. */
3050
+ readonly id: import("@angular/core").InputSignal<string>;
3051
+ /** Emitted with the new time right after a user change: `null` once it is cleared or incomplete. */
3052
+ readonly changed: import("@angular/core").OutputEmitterRef<string | null>;
3053
+ /** Emitted when focus leaves the field (not into its list), so Signal Forms marks it touched. */
3054
+ readonly touch: import("@angular/core").OutputEmitterRef<void>;
3055
+ private readonly field;
3056
+ /**
3057
+ * Focuses the first empty part (else the first part); Signal Forms calls it from
3058
+ * `focusBoundControl()`.
3059
+ * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.
3060
+ */
3061
+ focus(options?: FocusOptions): void;
3062
+ /** Opens the list of times; does nothing without a picker, or while disabled or read-only. */
3063
+ openPicker(): void;
3064
+ /** Closes the list of times, focus back on its button; does nothing while it is closed. */
3065
+ closePicker(): void;
3066
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfTimeInputComponent, never>;
3067
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfTimeInputComponent, "bf-time-input", never, {
3068
+ "value": {
3069
+ "alias": "value";
3070
+ "required": false;
3071
+ "isSignal": true;
3072
+ };
3073
+ "min": {
3074
+ "alias": "min";
3075
+ "required": false;
3076
+ "isSignal": true;
3077
+ };
3078
+ "max": {
3079
+ "alias": "max";
3080
+ "required": false;
3081
+ "isSignal": true;
3082
+ };
3083
+ "step": {
3084
+ "alias": "step";
3085
+ "required": false;
3086
+ "isSignal": true;
3087
+ };
3088
+ "seconds": {
3089
+ "alias": "seconds";
3090
+ "required": false;
3091
+ "isSignal": true;
3092
+ };
3093
+ "hourCycle": {
3094
+ "alias": "hourCycle";
3095
+ "required": false;
3096
+ "isSignal": true;
3097
+ };
3098
+ "picker": {
3099
+ "alias": "picker";
3100
+ "required": false;
3101
+ "isSignal": true;
3102
+ };
3103
+ "native": {
3104
+ "alias": "native";
3105
+ "required": false;
3106
+ "isSignal": true;
3107
+ };
3108
+ "locale": {
3109
+ "alias": "locale";
3110
+ "required": false;
3111
+ "isSignal": true;
3112
+ };
3113
+ "size": {
3114
+ "alias": "size";
3115
+ "required": false;
3116
+ "isSignal": true;
3117
+ };
3118
+ "label": {
3119
+ "alias": "label";
3120
+ "required": false;
3121
+ "isSignal": true;
3122
+ };
3123
+ "ariaLabel": {
3124
+ "alias": "ariaLabel";
3125
+ "required": false;
3126
+ "isSignal": true;
3127
+ };
3128
+ "ariaLabelledby": {
3129
+ "alias": "ariaLabelledby";
3130
+ "required": false;
3131
+ "isSignal": true;
3132
+ };
3133
+ "helpText": {
3134
+ "alias": "helpText";
3135
+ "required": false;
3136
+ "isSignal": true;
3137
+ };
3138
+ "errorMessage": {
3139
+ "alias": "errorMessage";
3140
+ "required": false;
3141
+ "isSignal": true;
3142
+ };
3143
+ "disabled": {
3144
+ "alias": "disabled";
3145
+ "required": false;
3146
+ "isSignal": true;
3147
+ };
3148
+ "readonly": {
3149
+ "alias": "readonly";
3150
+ "required": false;
3151
+ "isSignal": true;
3152
+ };
3153
+ "required": {
3154
+ "alias": "required";
3155
+ "required": false;
3156
+ "isSignal": true;
3157
+ };
3158
+ "invalid": {
3159
+ "alias": "invalid";
3160
+ "required": false;
3161
+ "isSignal": true;
3162
+ };
3163
+ "touched": {
3164
+ "alias": "touched";
3165
+ "required": false;
3166
+ "isSignal": true;
3167
+ };
3168
+ "errors": {
3169
+ "alias": "errors";
3170
+ "required": false;
3171
+ "isSignal": true;
3172
+ };
3173
+ "name": {
3174
+ "alias": "name";
3175
+ "required": false;
3176
+ "isSignal": true;
3177
+ };
3178
+ "id": {
3179
+ "alias": "id";
3180
+ "required": false;
3181
+ "isSignal": true;
3182
+ };
3183
+ }, {
3184
+ "value": "valueChange";
3185
+ "changed": "changed";
3186
+ "touch": "touch";
3187
+ }, never, never, true, never>;
3188
+ }
3189
+ /**
3190
+ * How `bf-datetime-input` picks a date and time besides typing: `popover` adds a button that
3191
+ * opens a calendar and a list of times side by side, `none` keeps the field typed only.
3192
+ *
3193
+ * @summary Whether a date and time input offers a calendar and time list popover
3194
+ * @since 0.3.1
3195
+ */
3196
+ type BfDateTimeInputPicker = 'popover' | 'none';
3197
+ /**
3198
+ * Date and time field typed part by part, with a popover holding a calendar and a list of
3199
+ * times, valued as a local ISO date and time without a zone.
3200
+ *
3201
+ * @example
3202
+ * <bf-datetime-input label="Meeting" [step]="15" [(value)]="meeting" />
3203
+ * <bf-datetime-input label="Publish at" [formField]="post.publishAt" />
3204
+ * @summary Typed date and time field with a calendar and time list in one popover
3205
+ * @category Forms
3206
+ * @since 0.3.1
3207
+ */
3208
+ export declare class BfDateTimeInputComponent implements FormValueControl<string | null> {
3209
+ /** The local date and time as an ISO string without a zone ('YYYY-MM-DDTHH:mm'), `null` while
3210
+ * empty or incomplete; two-way bindable and bound by `[formField]`. */
3211
+ readonly value: import("@angular/core").ModelSignal<string | null>;
3212
+ /** The earliest valid date and time ('YYYY-MM-DDTHH:mm'): earlier values show an error, and the
3213
+ * calendar and the list stop there. */
3214
+ readonly min: import("@angular/core").InputSignal<string | undefined>;
3215
+ /** The latest valid date and time ('YYYY-MM-DDTHH:mm'): later values show an error, and the
3216
+ * calendar and the list stop there. */
3217
+ readonly max: import("@angular/core").InputSignal<string | undefined>;
3218
+ /** Rules out more dates (weekends, booked days): disabled in the calendar, an error when typed. */
3219
+ readonly disabledDate: import("@angular/core").InputSignal<BfCalendarDisabledDate | null>;
3220
+ /** Minutes between the times of the list, from midnight (1–720). */
3221
+ readonly step: import("@angular/core").InputSignalWithTransform<number, unknown>;
3222
+ /** Forces a 12-hour (`h12`, with AM/PM) or 24-hour (`h23`) clock; unset follows the locale. */
3223
+ readonly hourCycle: import("@angular/core").InputSignal<BfTimeInputHourCycle | undefined>;
3224
+ /** `popover` adds the button that opens the calendar and the time list; `none` keeps the field
3225
+ * typed only. */
3226
+ readonly picker: import("@angular/core").InputSignal<BfDateTimeInputPicker>;
3227
+ /** Renders the platform's picker (`input type="datetime-local"`) under a coarse pointer (touch). */
3228
+ readonly native: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3229
+ /** BCP 47 locale of the part order, the separators, the clock and the calendar; empty follows
3230
+ * the document's `lang`, else English. */
3231
+ readonly locale: import("@angular/core").InputSignal<string>;
3232
+ /** Height step: sm 32, md 40, lg 48 px; unset follows `provideBfDefaults()` (`fieldSize`, `md`
3233
+ * by default). */
3234
+ readonly size: import("@angular/core").InputSignal<BfSize | undefined>;
3235
+ /** Visible label above the field. */
3236
+ readonly label: import("@angular/core").InputSignal<string>;
3237
+ /** Accessible name when no visible label is rendered. Ignored when `label` is set. */
3238
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
3239
+ /** Id(s) of the element(s) that name the field when no visible label is rendered. Ignored when
3240
+ * `label` is set. */
3241
+ readonly ariaLabelledby: import("@angular/core").InputSignal<string>;
3242
+ /** Helper text under the field. */
3243
+ readonly helpText: import("@angular/core").InputSignal<string>;
3244
+ /** Explicit error text; takes precedence over the field's own errors and Signal Forms errors. */
3245
+ readonly errorMessage: import("@angular/core").InputSignal<string>;
3246
+ /** Disables the field and its picker button. */
3247
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3248
+ /** Shows the value but blocks changes; the parts stay focusable and expose `aria-readonly`. */
3249
+ readonly readonly: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3250
+ /** Marks the field required. */
3251
+ readonly required: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3252
+ /** Field validity from Signal Forms. */
3253
+ readonly invalid: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3254
+ /** Whether the user has left the field. */
3255
+ readonly touched: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3256
+ /** Validation errors from Signal Forms. */
3257
+ readonly errors: import("@angular/core").InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
3258
+ /** Native name attribute of the platform input (`native` under a coarse pointer). */
3259
+ readonly name: import("@angular/core").InputSignal<string>;
3260
+ /** Field id; generated when not set. */
3261
+ readonly id: import("@angular/core").InputSignal<string>;
3262
+ /** Emitted with the new value right after a user change: `null` once it is cleared or
3263
+ * incomplete. */
3264
+ readonly changed: import("@angular/core").OutputEmitterRef<string | null>;
3265
+ /** Emitted when focus leaves the field (not into its popover), so Signal Forms marks it touched. */
3266
+ readonly touch: import("@angular/core").OutputEmitterRef<void>;
3267
+ private readonly field;
3268
+ /**
3269
+ * Focuses the first empty part (else the first part); Signal Forms calls it from
3270
+ * `focusBoundControl()`.
3271
+ * @param options Passed on to the native `focus()`, such as `{ preventScroll: true }`.
3272
+ */
3273
+ focus(options?: FocusOptions): void;
3274
+ /** Opens the calendar and time popover; does nothing without a picker, or while disabled or
3275
+ * read-only. */
3276
+ openPicker(): void;
3277
+ /** Closes the popover, focus back on its button; does nothing while it is closed. */
3278
+ closePicker(): void;
3279
+ static ɵfac: i0.ɵɵFactoryDeclaration<BfDateTimeInputComponent, never>;
3280
+ static ɵcmp: i0.ɵɵComponentDeclaration<BfDateTimeInputComponent, "bf-datetime-input", never, {
3281
+ "value": {
3282
+ "alias": "value";
3283
+ "required": false;
3284
+ "isSignal": true;
3285
+ };
3286
+ "min": {
3287
+ "alias": "min";
3288
+ "required": false;
3289
+ "isSignal": true;
3290
+ };
3291
+ "max": {
3292
+ "alias": "max";
3293
+ "required": false;
3294
+ "isSignal": true;
3295
+ };
3296
+ "disabledDate": {
3297
+ "alias": "disabledDate";
3298
+ "required": false;
3299
+ "isSignal": true;
3300
+ };
3301
+ "step": {
3302
+ "alias": "step";
3303
+ "required": false;
3304
+ "isSignal": true;
3305
+ };
3306
+ "hourCycle": {
3307
+ "alias": "hourCycle";
3308
+ "required": false;
3309
+ "isSignal": true;
3310
+ };
3311
+ "picker": {
3312
+ "alias": "picker";
3313
+ "required": false;
3314
+ "isSignal": true;
3315
+ };
3316
+ "native": {
3317
+ "alias": "native";
3318
+ "required": false;
3319
+ "isSignal": true;
3320
+ };
3321
+ "locale": {
3322
+ "alias": "locale";
3323
+ "required": false;
3324
+ "isSignal": true;
3325
+ };
3326
+ "size": {
3327
+ "alias": "size";
3328
+ "required": false;
3329
+ "isSignal": true;
3330
+ };
3331
+ "label": {
3332
+ "alias": "label";
3333
+ "required": false;
3334
+ "isSignal": true;
3335
+ };
3336
+ "ariaLabel": {
3337
+ "alias": "ariaLabel";
3338
+ "required": false;
3339
+ "isSignal": true;
3340
+ };
3341
+ "ariaLabelledby": {
3342
+ "alias": "ariaLabelledby";
3343
+ "required": false;
3344
+ "isSignal": true;
3345
+ };
3346
+ "helpText": {
3347
+ "alias": "helpText";
3348
+ "required": false;
3349
+ "isSignal": true;
3350
+ };
3351
+ "errorMessage": {
3352
+ "alias": "errorMessage";
3353
+ "required": false;
3354
+ "isSignal": true;
3355
+ };
3356
+ "disabled": {
3357
+ "alias": "disabled";
3358
+ "required": false;
3359
+ "isSignal": true;
3360
+ };
3361
+ "readonly": {
3362
+ "alias": "readonly";
3363
+ "required": false;
3364
+ "isSignal": true;
3365
+ };
3366
+ "required": {
3367
+ "alias": "required";
3368
+ "required": false;
3369
+ "isSignal": true;
3370
+ };
3371
+ "invalid": {
3372
+ "alias": "invalid";
3373
+ "required": false;
3374
+ "isSignal": true;
3375
+ };
3376
+ "touched": {
3377
+ "alias": "touched";
3378
+ "required": false;
3379
+ "isSignal": true;
3380
+ };
3381
+ "errors": {
3382
+ "alias": "errors";
3383
+ "required": false;
3384
+ "isSignal": true;
3385
+ };
3386
+ "name": {
3387
+ "alias": "name";
3388
+ "required": false;
3389
+ "isSignal": true;
3390
+ };
3391
+ "id": {
3392
+ "alias": "id";
3393
+ "required": false;
3394
+ "isSignal": true;
3395
+ };
3396
+ }, {
3397
+ "value": "valueChange";
3398
+ "changed": "changed";
3399
+ "touch": "touch";
3400
+ }, never, never, true, never>;
3401
+ }
3402
+ export { type BfComboboxFilter, type BfComboboxOption, type BfConfirmButton, type BfConfirmButtonRole, type BfConfirmOptions, type BfConfirmSize, type BfDateInputPicker, type BfDateTimeInputPicker, type BfDesktopToastConfig, type BfDesktopToastOptions, type BfDesktopToastPosition, type BfDialogConfig, type BfDialogRole, type BfDialogSize, type BfDialogTemplateContext, type BfMenuButtonVariant, type BfMenuPlacement, type BfOverlayAutoFocus, type BfOverlayController, type BfOverlayHost, type BfOverlayOptions, type BfOverlayPlacement, type BfOverlayPosition, type BfOverlayRole, type BfOverlayStackOptions, type BfOverlayTemplateContext, type BfPopoverPlacement, type BfSidePanelConfig, type BfSidePanelTemplateContext, type BfSidePanelWidth, type BfStackedOverlay, type BfTimeInputHourCycle, type BfTimeInputPicker, type BfToastAction, type BfToastController, type BfToastDismissReason, type BfTooltipPlacement, type ɵBfToastHandle, type ɵBfToastPresenter, type ɵBfToastQueueOptions, type ɵBfToastRequest, type ɵBfToastView, labelPanelByHeading as ɵlabelPanelByHeading, watchPanelHeading as ɵwatchPanelHeading };