@tristan.stavast/blueprintx 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts ADDED
@@ -0,0 +1,2728 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { TemplateRef } from '@angular/core';
3
+ import { SafeHtml } from '@angular/platform-browser';
4
+ import * as _angular_cdk_overlay from '@angular/cdk/overlay';
5
+ import { ControlValueAccessor } from '@angular/forms';
6
+ import * as _tristan_stavast_blueprintx from '@tristan.stavast/blueprintx';
7
+ import { CdkDragDrop } from '@angular/cdk/drag-drop';
8
+
9
+ /**
10
+ * Shared cross-component type vocabulary for BlueprintX.
11
+ * Keeping these in one place means `size="md"` means the same thing on every
12
+ * component and consumers get consistent autocomplete.
13
+ */
14
+ /** T-shirt sizes used by most interactive components. */
15
+ type BpxSize = 'sm' | 'md' | 'lg';
16
+ /** Visual emphasis / hierarchy of an action. */
17
+ type BpxVariant = 'solid' | 'soft' | 'outline' | 'ghost' | 'link';
18
+ /** Semantic color role, mapped to design tokens. */
19
+ type BpxColor = 'primary' | 'neutral' | 'success' | 'warning' | 'danger' | 'info';
20
+ /** Fill style shared by "badge-like" presentational components. */
21
+ type BpxTone = 'solid' | 'soft' | 'outline';
22
+ /**
23
+ * A selectable option for data-driven components (Select, MultiSelect, Filter).
24
+ * `T` is the type of the underlying value.
25
+ */
26
+ interface BpxOption<T = string> {
27
+ label: string;
28
+ value: T;
29
+ disabled?: boolean;
30
+ /** Optional registered icon name to show before the label. */
31
+ icon?: string;
32
+ }
33
+
34
+ /**
35
+ * Generates a process-unique, DOM-safe id with a prefix.
36
+ * Used to wire up ARIA relationships (aria-labelledby, aria-describedby, etc.)
37
+ * when the consumer hasn't supplied an explicit id.
38
+ *
39
+ * @example uniqueId('bpx-input') // 'bpx-input-0'
40
+ */
41
+ declare function uniqueId(prefix: string): string;
42
+
43
+ /**
44
+ * BlueprintX Button.
45
+ *
46
+ * Applied as an attribute on a native `<button>` or `<a>` so it keeps all
47
+ * native semantics (focus, keyboard, form submission, right-click-open-in-tab):
48
+ *
49
+ * ```html
50
+ * <button bpx-button color="primary" variant="solid">Save</button>
51
+ * <a bpx-button variant="link" href="/docs">Docs</a>
52
+ * <button bpx-button [loading]="saving()" (click)="save()">Submit</button>
53
+ * ```
54
+ */
55
+ declare class Button {
56
+ private readonly el;
57
+ private readonly isAnchor;
58
+ /** Visual style of the button. */
59
+ readonly variant: _angular_core.InputSignal<BpxVariant>;
60
+ /** Semantic color role (maps to design tokens). */
61
+ readonly color: _angular_core.InputSignal<BpxColor>;
62
+ /** Size of the button. */
63
+ readonly size: _angular_core.InputSignal<BpxSize>;
64
+ /** Whether the button is disabled. */
65
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
66
+ /** Shows a spinner and blocks interaction while an async action runs. */
67
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
68
+ /** Stretches the button to fill its container's width. */
69
+ readonly fullWidth: _angular_core.InputSignalWithTransform<boolean, unknown>;
70
+ /** Renders as a square icon-only button (removes horizontal padding). */
71
+ readonly iconOnly: _angular_core.InputSignalWithTransform<boolean, unknown>;
72
+ /**
73
+ * The `type` for a native button. Defaults to `button` to avoid accidental
74
+ * form submits. Ignored for anchors.
75
+ */
76
+ readonly type: _angular_core.InputSignal<"button" | "submit" | "reset">;
77
+ protected readonly nativeDisabled: _angular_core.Signal<boolean>;
78
+ protected readonly ariaDisabled: _angular_core.Signal<boolean>;
79
+ protected readonly resolvedType: _angular_core.Signal<"button" | "submit" | "reset" | null>;
80
+ protected handleClick(event: Event): void;
81
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Button, never>;
82
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Button, "button[bpx-button], a[bpx-button]", ["bpxButton"], { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "iconOnly": { "alias": "iconOnly"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
83
+ }
84
+
85
+ /**
86
+ * Visually joins a row (or column) of `[bpx-button]`s into a single connected
87
+ * control — shared borders, rounded only on the outer ends.
88
+ *
89
+ * ```html
90
+ * <bpx-button-group>
91
+ * <button bpx-button variant="outline">Day</button>
92
+ * <button bpx-button variant="outline">Week</button>
93
+ * <button bpx-button variant="outline">Month</button>
94
+ * </bpx-button-group>
95
+ * ```
96
+ */
97
+ declare class ButtonGroup {
98
+ /** Lay the buttons out in a row (default) or a column. */
99
+ readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
100
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonGroup, never>;
101
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonGroup, "bpx-button-group", ["bpxButtonGroup"], { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
102
+ }
103
+
104
+ /**
105
+ * An action inside a `<bpx-menu>`. Emits `select` and closes the menu when
106
+ * activated.
107
+ *
108
+ * ```html
109
+ * <bpx-menu-item icon="check" (select)="save()">Save</bpx-menu-item>
110
+ * <bpx-menu-item variant="danger" (select)="remove()">Delete</bpx-menu-item>
111
+ * ```
112
+ */
113
+ declare class MenuItem {
114
+ readonly icon: _angular_core.InputSignal<string | undefined>;
115
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
116
+ readonly variant: _angular_core.InputSignal<"danger" | "default">;
117
+ readonly select: _angular_core.OutputEmitterRef<void>;
118
+ private readonly menu;
119
+ private readonly el;
120
+ get element(): HTMLElement;
121
+ focus(): void;
122
+ protected activate(): void;
123
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MenuItem, never>;
124
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MenuItem, "bpx-menu-item", ["bpxMenuItem"], { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "select": "select"; }, never, ["*"], true, never>;
125
+ }
126
+
127
+ /**
128
+ * A dropdown menu panel. Holds `<bpx-menu-item>`s and is opened by an element
129
+ * carrying `[bpxMenuTriggerFor]`. It renders nothing inline until opened.
130
+ *
131
+ * ```html
132
+ * <button bpx-button [bpxMenuTriggerFor]="menu">Actions</button>
133
+ * <bpx-menu #menu>
134
+ * <bpx-menu-item icon="check" (select)="publish()">Publish</bpx-menu-item>
135
+ * <bpx-menu-item variant="danger" (select)="remove()">Delete</bpx-menu-item>
136
+ * </bpx-menu>
137
+ * ```
138
+ */
139
+ declare class Menu {
140
+ readonly template: _angular_core.Signal<TemplateRef<any>>;
141
+ readonly items: _angular_core.Signal<readonly MenuItem[]>;
142
+ /** Emitted when the menu asks to close (item chosen, Escape, or Tab). */
143
+ readonly closed: _angular_core.OutputEmitterRef<void>;
144
+ private readonly doc;
145
+ close(): void;
146
+ /** Focus the first enabled item — called by the trigger after opening. */
147
+ focusFirst(): void;
148
+ protected onKeydown(event: KeyboardEvent): void;
149
+ private enabledItems;
150
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Menu, never>;
151
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Menu, "bpx-menu", ["bpxMenu"], {}, { "closed": "closed"; }, ["items"], ["*"], true, never>;
152
+ }
153
+
154
+ /**
155
+ * A primary action button joined to a dropdown toggle that opens a `<bpx-menu>`
156
+ * of secondary actions. The main button emits `action`; the caret opens the menu.
157
+ *
158
+ * ```html
159
+ * <bpx-split-button [menu]="menu" (action)="save()">Save</bpx-split-button>
160
+ * <bpx-menu #menu>
161
+ * <bpx-menu-item (select)="saveAsDraft()">Save as draft</bpx-menu-item>
162
+ * <bpx-menu-item (select)="saveAndClose()">Save and close</bpx-menu-item>
163
+ * </bpx-menu>
164
+ * ```
165
+ */
166
+ declare class SplitButton {
167
+ /** The menu opened by the dropdown toggle. */
168
+ readonly menu: _angular_core.InputSignal<Menu>;
169
+ readonly color: _angular_core.InputSignal<BpxColor>;
170
+ readonly variant: _angular_core.InputSignal<BpxVariant>;
171
+ readonly size: _angular_core.InputSignal<BpxSize>;
172
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
173
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
174
+ /** Fires when the main (primary) button is clicked. */
175
+ readonly action: _angular_core.OutputEmitterRef<MouseEvent>;
176
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SplitButton, never>;
177
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SplitButton, "bpx-split-button", ["bpxSplitButton"], { "menu": { "alias": "menu"; "required": true; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, { "action": "action"; }, never, ["*"], true, never>;
178
+ }
179
+
180
+ /**
181
+ * A button that copies text to the clipboard and briefly confirms with a check.
182
+ *
183
+ * ```html
184
+ * <bpx-copy-button [value]="apiKey" />
185
+ * <bpx-copy-button [value]="url" variant="soft" copiedLabel="Copied link" />
186
+ * ```
187
+ */
188
+ declare class CopyButton {
189
+ /** The text to copy. */
190
+ readonly value: _angular_core.InputSignal<string>;
191
+ /** Idle label. */
192
+ readonly label: _angular_core.InputSignal<string>;
193
+ /** Label shown briefly after a successful copy. */
194
+ readonly copiedLabel: _angular_core.InputSignal<string>;
195
+ /** Show the text label beside the icon. When off, renders icon-only. */
196
+ readonly showLabel: _angular_core.InputSignalWithTransform<boolean, unknown>;
197
+ readonly color: _angular_core.InputSignal<BpxColor>;
198
+ readonly variant: _angular_core.InputSignal<BpxVariant>;
199
+ readonly size: _angular_core.InputSignal<BpxSize>;
200
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
201
+ /** Fires with the copied text on success. */
202
+ readonly copied$: _angular_core.OutputEmitterRef<string>;
203
+ protected readonly copied: _angular_core.WritableSignal<boolean>;
204
+ private readonly isBrowser;
205
+ private readonly doc;
206
+ private timer?;
207
+ constructor();
208
+ protected copy(): Promise<void>;
209
+ private flash;
210
+ /** Last-resort copy for browsers without the async Clipboard API. */
211
+ private fallbackCopy;
212
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CopyButton, never>;
213
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CopyButton, "bpx-copy-button", ["bpxCopyButton"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "copiedLabel": { "alias": "copiedLabel"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "copied$": "copied"; }, never, never, true, never>;
214
+ }
215
+
216
+ /**
217
+ * BlueprintX Icon — renders a registered SVG glyph that inherits the current
218
+ * text color and scales with font-size.
219
+ *
220
+ * ```html
221
+ * <bpx-icon name="check" />
222
+ * <bpx-icon name="warning" size="lg" label="Warning" />
223
+ * ```
224
+ *
225
+ * If `label` is set the icon is exposed to assistive tech; otherwise it is
226
+ * treated as decorative (aria-hidden).
227
+ */
228
+ declare class Icon {
229
+ private readonly registry;
230
+ private readonly sanitizer;
231
+ /** Registered icon name to render. */
232
+ readonly name: _angular_core.InputSignal<string>;
233
+ /** Size token; also settable directly via CSS font-size. */
234
+ readonly size: _angular_core.InputSignal<BpxSize>;
235
+ /** Accessible label. Omit for purely decorative icons. */
236
+ readonly label: _angular_core.InputSignal<string | undefined>;
237
+ protected readonly svg: _angular_core.Signal<SafeHtml>;
238
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Icon, never>;
239
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Icon, "bpx-icon", ["bpxIcon"], { "name": { "alias": "name"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
240
+ }
241
+
242
+ /** Inner SVG markup for an icon, drawn on a 0 0 24 24 viewBox. */
243
+ type BpxIconDefinition = string;
244
+ /**
245
+ * Central registry mapping icon names to their SVG body. Ships with a small
246
+ * built-in set; apps register their own with `registry.register('name', svg)`.
247
+ * All icons are authored on a 24×24 grid and inherit `currentColor`.
248
+ */
249
+ declare class IconRegistry {
250
+ private readonly icons;
251
+ /** Register (or override) a single icon by name. */
252
+ register(name: string, svgBody: BpxIconDefinition): void;
253
+ /** Register many icons at once. */
254
+ registerMany(icons: Record<string, BpxIconDefinition>): void;
255
+ /** Look up an icon's SVG body, or undefined if not registered. */
256
+ get(name: string): BpxIconDefinition | undefined;
257
+ /** All registered icon names — handy for docs/story controls. */
258
+ names(): string[];
259
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<IconRegistry, never>;
260
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<IconRegistry>;
261
+ }
262
+
263
+ /**
264
+ * A small status/label badge.
265
+ *
266
+ * ```html
267
+ * <bpx-badge color="success">Active</bpx-badge>
268
+ * <bpx-badge color="danger" tone="solid" dot>Live</bpx-badge>
269
+ * ```
270
+ */
271
+ declare class Badge {
272
+ /** Semantic color role. */
273
+ readonly color: _angular_core.InputSignal<BpxColor>;
274
+ /** Fill style. */
275
+ readonly tone: _angular_core.InputSignal<BpxTone>;
276
+ /** Size. */
277
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
278
+ /** Fully rounded (pill) shape. */
279
+ readonly pill: _angular_core.InputSignalWithTransform<boolean, unknown>;
280
+ /** Show a leading status dot. */
281
+ readonly dot: _angular_core.InputSignalWithTransform<boolean, unknown>;
282
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Badge, never>;
283
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Badge, "bpx-badge", ["bpxBadge"], { "color": { "alias": "color"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "pill": { "alias": "pill"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
284
+ }
285
+
286
+ /**
287
+ * An indeterminate loading spinner.
288
+ *
289
+ * ```html
290
+ * <bpx-spinner />
291
+ * <bpx-spinner size="lg" label="Loading results" />
292
+ * ```
293
+ */
294
+ declare class Spinner {
295
+ /** Size of the spinner. */
296
+ readonly size: _angular_core.InputSignal<BpxSize>;
297
+ /** Accessible label announced to screen readers. */
298
+ readonly label: _angular_core.InputSignal<string>;
299
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Spinner, never>;
300
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Spinner, "bpx-spinner", ["bpxSpinner"], { "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
301
+ }
302
+
303
+ /** Placeholder shape. */
304
+ type BpxSkeletonVariant = 'text' | 'rect' | 'circle';
305
+ /** How the placeholder animates while content loads. */
306
+ type BpxSkeletonAnimation = 'pulse' | 'wave' | 'none';
307
+ /**
308
+ * A content-shaped loading placeholder. Render it in the same layout slot as the
309
+ * real content so the page doesn't jump when data arrives.
310
+ *
311
+ * ```html
312
+ * <bpx-skeleton variant="circle" width="40" />
313
+ * <bpx-skeleton [lines]="3" />
314
+ * <bpx-skeleton variant="rect" height="160" animation="wave" />
315
+ * ```
316
+ */
317
+ declare class Skeleton {
318
+ /** Placeholder shape. */
319
+ readonly variant: _angular_core.InputSignal<BpxSkeletonVariant>;
320
+ /** CSS width. A bare number is treated as pixels. */
321
+ readonly width: _angular_core.InputSignal<string | number | null>;
322
+ /** CSS height. A bare number is treated as pixels. */
323
+ readonly height: _angular_core.InputSignal<string | number | null>;
324
+ /** Number of lines to render for the `text` variant. */
325
+ readonly lines: _angular_core.InputSignalWithTransform<number, unknown>;
326
+ /** Animation style. Automatically disabled under `prefers-reduced-motion`. */
327
+ readonly animation: _angular_core.InputSignal<BpxSkeletonAnimation>;
328
+ /** Accessible label. When set, the skeleton announces itself as a busy status. */
329
+ readonly label: _angular_core.InputSignal<string>;
330
+ protected readonly lineArray: _angular_core.Signal<unknown[]>;
331
+ protected readonly circleSize: _angular_core.Signal<string>;
332
+ /** Per-line width: honor an explicit width, else make the last line shorter. */
333
+ protected lineWidth(index: number): string;
334
+ /**
335
+ * Normalize a width/height input to a CSS length. Numbers and bare numeric
336
+ * strings (e.g. `56` or `"56"` from a template attribute) become px; values
337
+ * that already carry a unit (`"50%"`, `"3rem"`) pass through unchanged.
338
+ */
339
+ protected cssSize(value: string | number | null): string | null;
340
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Skeleton, never>;
341
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Skeleton, "bpx-skeleton", ["bpxSkeleton"], { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
342
+ }
343
+
344
+ /** A ready-made loading layout that mirrors a common UI shape. */
345
+ type BpxSkeletonPreset = 'list' | 'card' | 'article' | 'table' | 'form';
346
+ /**
347
+ * Ready-made skeleton layouts for common UI shapes — a profile list, a card
348
+ * grid, an article, a table or a form — composed from `bpx-skeleton` primitives.
349
+ * Drop one in place of the content that's loading.
350
+ *
351
+ * ```html
352
+ * <bpx-skeleton-layout preset="list" [count]="5" />
353
+ * <bpx-skeleton-layout preset="card" [count]="3" animation="wave" />
354
+ * <bpx-skeleton-layout preset="table" [count]="6" [columns]="4" />
355
+ * ```
356
+ */
357
+ declare class SkeletonLayout {
358
+ /** Which layout to render. */
359
+ readonly preset: _angular_core.InputSignal<BpxSkeletonPreset>;
360
+ /**
361
+ * How many repeated units to render (rows for `list`/`table`/`form`, cards for
362
+ * `card`, paragraph lines for `article`). `0` uses a sensible per-preset default.
363
+ */
364
+ readonly count: _angular_core.InputSignalWithTransform<number, unknown>;
365
+ /** Number of columns for the `table` preset. */
366
+ readonly columns: _angular_core.InputSignalWithTransform<number, unknown>;
367
+ /** Show the leading avatar circle in the `list` preset. */
368
+ readonly avatar: _angular_core.InputSignalWithTransform<boolean, unknown>;
369
+ /** Animation forwarded to every bone. Pauses under `prefers-reduced-motion`. */
370
+ readonly animation: _angular_core.InputSignal<BpxSkeletonAnimation>;
371
+ /** Accessible label announced while loading. */
372
+ readonly label: _angular_core.InputSignal<string>;
373
+ private readonly defaultCount;
374
+ private readonly resolvedCount;
375
+ /** Array to iterate the repeated units in the template. */
376
+ protected readonly items: _angular_core.Signal<unknown[]>;
377
+ /** Array to iterate table columns in the template. */
378
+ protected readonly cols: _angular_core.Signal<unknown[]>;
379
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkeletonLayout, never>;
380
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkeletonLayout, "bpx-skeleton-layout", ["bpxSkeletonLayout"], { "preset": { "alias": "preset"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "avatar": { "alias": "avatar"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
381
+ }
382
+
383
+ type BpxAvatarSize = 'sm' | 'md' | 'lg' | 'xl';
384
+ type BpxAvatarStatus = 'online' | 'offline' | 'busy' | 'away';
385
+ /**
386
+ * A user avatar. Shows an image when `src` loads, otherwise falls back to
387
+ * initials on a gradient derived from the name (so every user looks distinct).
388
+ *
389
+ * ```html
390
+ * <bpx-avatar name="Ada Lovelace" />
391
+ * <bpx-avatar src="/me.jpg" name="Me" size="lg" status="online" />
392
+ * ```
393
+ */
394
+ declare class Avatar {
395
+ readonly src: _angular_core.InputSignal<string | undefined>;
396
+ readonly name: _angular_core.InputSignal<string>;
397
+ readonly size: _angular_core.InputSignal<BpxAvatarSize>;
398
+ readonly shape: _angular_core.InputSignal<"circle" | "rounded">;
399
+ readonly status: _angular_core.InputSignal<BpxAvatarStatus | undefined>;
400
+ /** Flips to true if the image fails to load, so we fall back to initials. */
401
+ protected readonly imgFailed: _angular_core.WritableSignal<boolean>;
402
+ protected readonly showImage: _angular_core.Signal<boolean>;
403
+ protected readonly initials: _angular_core.Signal<string>;
404
+ /** Deterministic gradient from the name so avatars are visually distinct. */
405
+ protected readonly gradient: _angular_core.Signal<string>;
406
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Avatar, never>;
407
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Avatar, "bpx-avatar", ["bpxAvatar"], { "src": { "alias": "src"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
408
+ }
409
+
410
+ /**
411
+ * A compact chip / tag. Can be static, selectable (toggle) or removable.
412
+ *
413
+ * ```html
414
+ * <bpx-chip>Design</bpx-chip>
415
+ * <bpx-chip removable (removed)="drop(t)">{{ t }}</bpx-chip>
416
+ * <bpx-chip selectable [selected]="on()" (click)="on.set(!on())">Filter</bpx-chip>
417
+ * ```
418
+ */
419
+ declare class Chip {
420
+ readonly color: _angular_core.InputSignal<BpxColor>;
421
+ readonly tone: _angular_core.InputSignal<BpxTone>;
422
+ readonly size: _angular_core.InputSignal<"sm" | "md">;
423
+ /** Shows a remove (×) button. */
424
+ readonly removable: _angular_core.InputSignalWithTransform<boolean, unknown>;
425
+ /** Marks the chip selectable (adds button semantics + keyboard). */
426
+ readonly selectable: _angular_core.InputSignalWithTransform<boolean, unknown>;
427
+ /** Selected/active state (visual + aria-pressed). */
428
+ readonly selected: _angular_core.InputSignalWithTransform<boolean, unknown>;
429
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
430
+ /** Emitted when the remove button is activated. */
431
+ readonly removed: _angular_core.OutputEmitterRef<void>;
432
+ protected onKeydown(event: KeyboardEvent): void;
433
+ protected remove(event: Event): void;
434
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Chip, never>;
435
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Chip, "bpx-chip", ["bpxChip"], { "color": { "alias": "color"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "removed": "removed"; }, never, ["*"], true, never>;
436
+ }
437
+
438
+ /**
439
+ * Layout container that groups related chips with consistent spacing and
440
+ * wrapping (or horizontal scrolling). Provides `role="group"` for a11y.
441
+ *
442
+ * ```html
443
+ * <bpx-chip-set label="Tags">
444
+ * <bpx-chip removable>Angular</bpx-chip>
445
+ * <bpx-chip removable>Signals</bpx-chip>
446
+ * </bpx-chip-set>
447
+ * ```
448
+ */
449
+ declare class ChipSet {
450
+ /** Accessible group label. */
451
+ readonly label: _angular_core.InputSignal<string | undefined>;
452
+ /** Scroll horizontally on overflow instead of wrapping. */
453
+ readonly scrollable: _angular_core.InputSignalWithTransform<boolean, unknown>;
454
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ChipSet, never>;
455
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ChipSet, "bpx-chip-set", ["bpxChipSet"], { "label": { "alias": "label"; "required": false; "isSignal": true; }; "scrollable": { "alias": "scrollable"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
456
+ }
457
+
458
+ /**
459
+ * A status callout / banner.
460
+ *
461
+ * ```html
462
+ * <bpx-alert color="success" title="Saved">Your changes are live.</bpx-alert>
463
+ * <bpx-alert color="danger" dismissible (dismissed)="hide()">Something broke.</bpx-alert>
464
+ * ```
465
+ */
466
+ declare class Alert {
467
+ readonly color: _angular_core.InputSignal<BpxColor>;
468
+ readonly tone: _angular_core.InputSignal<BpxTone>;
469
+ readonly title: _angular_core.InputSignal<string | undefined>;
470
+ /** Show a leading status icon (auto-selected from color, or override). */
471
+ readonly icon: _angular_core.InputSignal<string | undefined>;
472
+ readonly dismissible: _angular_core.InputSignalWithTransform<boolean, unknown>;
473
+ readonly dismissed: _angular_core.OutputEmitterRef<void>;
474
+ protected readonly resolvedIcon: _angular_core.Signal<string>;
475
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Alert, never>;
476
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Alert, "bpx-alert", ["bpxAlert"], { "color": { "alias": "color"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; }, never, ["*"], true, never>;
477
+ }
478
+
479
+ /**
480
+ * A single-select dropdown built on the CDK overlay. Data-driven via `options`,
481
+ * two-way bound with `[(value)]`. Fully keyboard operable with listbox ARIA.
482
+ *
483
+ * ```html
484
+ * <bpx-select [options]="fruits" [(value)]="fruit" placeholder="Pick one" />
485
+ * ```
486
+ */
487
+ declare class Select<T> {
488
+ readonly options: _angular_core.InputSignal<BpxOption<T>[]>;
489
+ readonly value: _angular_core.ModelSignal<T | null>;
490
+ readonly placeholder: _angular_core.InputSignal<string>;
491
+ readonly size: _angular_core.InputSignal<BpxSize>;
492
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
493
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
494
+ protected readonly open: _angular_core.WritableSignal<boolean>;
495
+ protected readonly activeIndex: _angular_core.WritableSignal<number>;
496
+ protected readonly triggerWidth: _angular_core.WritableSignal<number>;
497
+ protected readonly positions: _angular_cdk_overlay.ConnectedPosition[];
498
+ private readonly baseId;
499
+ protected readonly listId: string;
500
+ protected readonly selectedOption: _angular_core.Signal<BpxOption<T> | null>;
501
+ protected optionId(i: number): string;
502
+ protected onTriggerClick(el: HTMLElement): void;
503
+ protected openPanel(el?: HTMLElement): void;
504
+ protected close(): void;
505
+ protected select(opt: BpxOption<T>): void;
506
+ protected clear(event: Event): void;
507
+ protected onTriggerKeydown(event: KeyboardEvent, el: HTMLElement): void;
508
+ private move;
509
+ private firstEnabled;
510
+ private lastEnabled;
511
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Select<any>, never>;
512
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Select<any>, "bpx-select", ["bpxSelect"], { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
513
+ }
514
+
515
+ /**
516
+ * A multiple-select dropdown. Selected values show as removable chips in the
517
+ * trigger; the panel stays open while toggling options.
518
+ *
519
+ * ```html
520
+ * <bpx-multi-select [options]="skills" [(value)]="selected" placeholder="Skills" />
521
+ * ```
522
+ */
523
+ declare class MultiSelect<T> {
524
+ readonly options: _angular_core.InputSignal<BpxOption<T>[]>;
525
+ readonly value: _angular_core.ModelSignal<T[]>;
526
+ readonly placeholder: _angular_core.InputSignal<string>;
527
+ readonly size: _angular_core.InputSignal<BpxSize>;
528
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
529
+ /** Max chips to show in the trigger before collapsing to "+N". */
530
+ readonly maxDisplay: _angular_core.InputSignal<number>;
531
+ protected readonly open: _angular_core.WritableSignal<boolean>;
532
+ protected readonly activeIndex: _angular_core.WritableSignal<number>;
533
+ protected readonly triggerWidth: _angular_core.WritableSignal<number>;
534
+ protected readonly positions: _angular_cdk_overlay.ConnectedPosition[];
535
+ private readonly baseId;
536
+ protected readonly listId: string;
537
+ protected readonly selectedOptions: _angular_core.Signal<BpxOption<T>[]>;
538
+ protected readonly visibleChips: _angular_core.Signal<BpxOption<T>[]>;
539
+ protected readonly overflowCount: _angular_core.Signal<number>;
540
+ protected isSelected(opt: BpxOption<T>): boolean;
541
+ protected optionId(i: number): string;
542
+ protected onTriggerClick(el: HTMLElement): void;
543
+ protected openPanel(el?: HTMLElement): void;
544
+ protected close(): void;
545
+ protected toggle(opt: BpxOption<T>): void;
546
+ protected removeValue(value: T, event?: Event): void;
547
+ protected clearAll(event: Event): void;
548
+ protected onTriggerKeydown(event: KeyboardEvent, el: HTMLElement): void;
549
+ private move;
550
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MultiSelect<any>, never>;
551
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MultiSelect<any>, "bpx-multi-select", ["bpxMultiSelect"], { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "maxDisplay": { "alias": "maxDisplay"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
552
+ }
553
+
554
+ /**
555
+ * A single-select autocomplete: a text field that filters a list of options as
556
+ * you type, on the CDK overlay. Works standalone with `[(value)]` and as a form
557
+ * control via `formControlName` / `[(ngModel)]`. Fully keyboard operable with
558
+ * combobox/listbox ARIA.
559
+ *
560
+ * ```html
561
+ * <bpx-combobox [options]="countries" [(value)]="country" placeholder="Search…" />
562
+ * <bpx-combobox formControlName="assignee" [options]="people" clearable />
563
+ * ```
564
+ */
565
+ declare class Combobox<T> implements ControlValueAccessor {
566
+ readonly options: _angular_core.InputSignal<BpxOption<T>[]>;
567
+ /** The selected value. Two-way bindable via `[(value)]`. */
568
+ readonly value: _angular_core.ModelSignal<T | null>;
569
+ readonly placeholder: _angular_core.InputSignal<string>;
570
+ readonly size: _angular_core.InputSignal<BpxSize>;
571
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
572
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
573
+ /** Text shown in the panel when the filter matches nothing. */
574
+ readonly noResultsText: _angular_core.InputSignal<string>;
575
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
576
+ private readonly cvaDisabled;
577
+ protected readonly disabled: _angular_core.Signal<boolean>;
578
+ /** The current text in the field (the filter query). */
579
+ protected readonly query: _angular_core.WritableSignal<string>;
580
+ protected readonly open: _angular_core.WritableSignal<boolean>;
581
+ protected readonly activeIndex: _angular_core.WritableSignal<number>;
582
+ protected readonly triggerWidth: _angular_core.WritableSignal<number>;
583
+ protected readonly positions: _angular_cdk_overlay.ConnectedPosition[];
584
+ private readonly baseId;
585
+ protected readonly listId: string;
586
+ protected readonly selectedOption: _angular_core.Signal<BpxOption<T> | null>;
587
+ /** Options matching the query — everything when the query is empty or equals
588
+ * the current selection's label (so re-opening shows the full list). */
589
+ protected readonly filtered: _angular_core.Signal<BpxOption<T>[]>;
590
+ private onChange;
591
+ protected onTouched: () => void;
592
+ constructor();
593
+ protected optionId(i: number): string;
594
+ protected onFocus(field: HTMLElement, input: HTMLInputElement): void;
595
+ protected openPanel(field?: HTMLElement): void;
596
+ protected close(): void;
597
+ protected onInput(event: Event): void;
598
+ protected select(opt: BpxOption<T>): void;
599
+ protected clear(event: Event, input: HTMLInputElement): void;
600
+ protected onKeydown(event: KeyboardEvent, field: HTMLElement): void;
601
+ private move;
602
+ private firstEnabled;
603
+ private lastEnabled;
604
+ writeValue(value: T | null): void;
605
+ registerOnChange(fn: (value: T | null) => void): void;
606
+ registerOnTouched(fn: () => void): void;
607
+ setDisabledState(isDisabled: boolean): void;
608
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Combobox<any>, never>;
609
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Combobox<any>, "bpx-combobox", ["bpxCombobox"], { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "noResultsText": { "alias": "noResultsText"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
610
+ }
611
+
612
+ /** Why a dropped/picked file was turned away. */
613
+ interface BpxFileRejection {
614
+ file: File;
615
+ reason: 'type' | 'size' | 'count';
616
+ }
617
+ /**
618
+ * A file dropzone: pick files with a click or drag-and-drop, with built-in
619
+ * `accept`, size and count validation and a removable file list. Works
620
+ * standalone with `[(files)]` and as a form control via `formControlName`.
621
+ * Uploading itself is left to the app — bind `(filesChange)` and send them.
622
+ *
623
+ * ```html
624
+ * <bpx-file-upload [(files)]="files" accept="image/*" multiple [maxSize]="5_000_000" />
625
+ * <bpx-file-upload formControlName="resume" accept=".pdf,.doc,.docx" />
626
+ * ```
627
+ */
628
+ declare class FileUpload implements ControlValueAccessor {
629
+ /** The selected files. Two-way bindable via `[(files)]`. */
630
+ readonly files: _angular_core.ModelSignal<File[]>;
631
+ /** Allow selecting more than one file. */
632
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
633
+ /** Native `accept` string, e.g. `"image/*,.pdf"`. Also enforced on drop. */
634
+ readonly accept: _angular_core.InputSignal<string>;
635
+ /** Reject files larger than this many bytes. `0` = no limit. */
636
+ readonly maxSize: _angular_core.InputSignalWithTransform<number, unknown>;
637
+ /** Cap the number of files kept (multiple only). `0` = no limit. */
638
+ readonly maxFiles: _angular_core.InputSignalWithTransform<number, unknown>;
639
+ /** Secondary hint shown under the prompt (e.g. accepted types). */
640
+ readonly hint: _angular_core.InputSignal<string>;
641
+ /** Error styling. */
642
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
643
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
644
+ private readonly cvaDisabled;
645
+ protected readonly disabled: _angular_core.Signal<boolean>;
646
+ /** Emitted with the files turned away by validation. */
647
+ readonly rejected: _angular_core.OutputEmitterRef<BpxFileRejection[]>;
648
+ protected readonly dragging: _angular_core.WritableSignal<boolean>;
649
+ private dragDepth;
650
+ private onChange;
651
+ protected onTouched: () => void;
652
+ protected open(input: HTMLInputElement): void;
653
+ protected onKeydown(event: KeyboardEvent, input: HTMLInputElement): void;
654
+ protected onPicked(event: Event): void;
655
+ protected onDragOver(event: DragEvent): void;
656
+ protected onDragEnter(event: DragEvent): void;
657
+ protected onDragLeave(): void;
658
+ protected onDrop(event: DragEvent): void;
659
+ protected remove(target: File, event: Event): void;
660
+ private addFiles;
661
+ private setFiles;
662
+ /** De-duplicate by identity and by name+size+lastModified. */
663
+ private dedupe;
664
+ /** Match a file against the `accept` list (mime, mime/* wildcard, or .ext). */
665
+ private matchesAccept;
666
+ /** Human-readable file size for the list. */
667
+ protected formatSize(bytes: number): string;
668
+ writeValue(value: File[] | null): void;
669
+ registerOnChange(fn: (value: File[]) => void): void;
670
+ registerOnTouched(fn: () => void): void;
671
+ setDisabledState(isDisabled: boolean): void;
672
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FileUpload, never>;
673
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FileUpload, "bpx-file-upload", ["bpxFileUpload"], { "files": { "alias": "files"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "maxSize": { "alias": "maxSize"; "required": false; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "files": "filesChange"; "rejected": "rejected"; }, never, never, true, never>;
674
+ }
675
+
676
+ /**
677
+ * A compact filter control — ideal for data-table column headers. A small
678
+ * trigger shows the label and a count of active filters; the popover offers a
679
+ * search box and a checkbox list. Emits selections live via `[(value)]`.
680
+ *
681
+ * ```html
682
+ * <bpx-filter label="Status" [options]="statuses" [(value)]="active" />
683
+ * ```
684
+ */
685
+ declare class Filter<T> {
686
+ readonly label: _angular_core.InputSignal<string>;
687
+ readonly options: _angular_core.InputSignal<BpxOption<T>[]>;
688
+ readonly value: _angular_core.ModelSignal<T[]>;
689
+ readonly searchable: _angular_core.InputSignalWithTransform<boolean, unknown>;
690
+ protected readonly open: _angular_core.WritableSignal<boolean>;
691
+ protected readonly search: _angular_core.WritableSignal<string>;
692
+ protected readonly activeIndex: _angular_core.WritableSignal<number>;
693
+ protected readonly positions: _angular_cdk_overlay.ConnectedPosition[];
694
+ private readonly searchInput;
695
+ protected readonly count: _angular_core.Signal<number>;
696
+ protected readonly filtered: _angular_core.Signal<BpxOption<T>[]>;
697
+ protected isSelected(opt: BpxOption<T>): boolean;
698
+ protected toggle(): void;
699
+ protected openPanel(): void;
700
+ protected close(): void;
701
+ protected onAttach(): void;
702
+ protected onSearch(event: Event): void;
703
+ protected toggleOption(opt: BpxOption<T>): void;
704
+ protected clearAll(): void;
705
+ protected onPanelKeydown(event: KeyboardEvent): void;
706
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Filter<any>, never>;
707
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Filter<any>, "bpx-filter", ["bpxFilter"], { "label": { "alias": "label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
708
+ }
709
+
710
+ /**
711
+ * A boolean on/off toggle. Works standalone with `[(checked)]` and as a form
712
+ * control via `formControlName` / `[(ngModel)]`.
713
+ *
714
+ * ```html
715
+ * <bpx-switch [(checked)]="notifications">Email me</bpx-switch>
716
+ * <bpx-switch formControlName="darkMode" color="success" />
717
+ * ```
718
+ */
719
+ declare class Switch implements ControlValueAccessor {
720
+ /** On/off state. Two-way bindable via `[(checked)]`. */
721
+ readonly checked: _angular_core.ModelSignal<boolean>;
722
+ /** Disables interaction via the template. */
723
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
724
+ readonly size: _angular_core.InputSignal<"sm" | "md">;
725
+ readonly color: _angular_core.InputSignal<BpxColor>;
726
+ /** Set by Angular forms through `setDisabledState`. */
727
+ private readonly cvaDisabled;
728
+ /** Effective disabled state — either the input or a disabled form control. */
729
+ protected readonly disabled: _angular_core.Signal<boolean>;
730
+ private onChange;
731
+ /** Called on blur so forms mark the control touched. Invoked from the host. */
732
+ protected onTouched: () => void;
733
+ protected toggle(): void;
734
+ protected onKey(event: Event): void;
735
+ writeValue(value: boolean): void;
736
+ registerOnChange(fn: (value: boolean) => void): void;
737
+ registerOnTouched(fn: () => void): void;
738
+ setDisabledState(isDisabled: boolean): void;
739
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Switch, never>;
740
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Switch, "bpx-switch", ["bpxSwitch"], { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, ["*"], true, never>;
741
+ }
742
+
743
+ /**
744
+ * A single-value range slider. Works standalone with `[(value)]` and as a form
745
+ * control via `formControlName` / `[(ngModel)]`. Fully keyboard operable.
746
+ *
747
+ * ```html
748
+ * <bpx-slider [(value)]="volume" [min]="0" [max]="100" />
749
+ * <bpx-slider formControlName="opacity" [step]="0.05" [max]="1" color="success" />
750
+ * ```
751
+ */
752
+ declare class Slider implements ControlValueAccessor {
753
+ private readonly el;
754
+ /** Current value. Two-way bindable via `[(value)]`. */
755
+ readonly value: _angular_core.ModelSignal<number>;
756
+ readonly min: _angular_core.InputSignal<number>;
757
+ readonly max: _angular_core.InputSignal<number>;
758
+ readonly step: _angular_core.InputSignal<number>;
759
+ /** Disables interaction via the template. */
760
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
761
+ readonly size: _angular_core.InputSignal<"sm" | "md">;
762
+ readonly color: _angular_core.InputSignal<BpxColor>;
763
+ /** Set by Angular forms through `setDisabledState`. */
764
+ private readonly cvaDisabled;
765
+ /** Effective disabled state — either the input or a disabled form control. */
766
+ protected readonly disabled: _angular_core.Signal<boolean>;
767
+ /** Filled fraction of the track, 0–100, clamped for out-of-range values. */
768
+ protected readonly pct: _angular_core.Signal<number>;
769
+ private dragging;
770
+ private onChange;
771
+ protected onTouched: () => void;
772
+ protected onPointerDown(event: PointerEvent): void;
773
+ protected onPointerMove(event: PointerEvent): void;
774
+ protected onPointerUp(): void;
775
+ private setFromClientX;
776
+ protected onKeydown(event: KeyboardEvent): void;
777
+ /** Snap to the step grid, clamp to range, and emit only on a real change. */
778
+ private commit;
779
+ writeValue(value: number): void;
780
+ registerOnChange(fn: (value: number) => void): void;
781
+ registerOnTouched(fn: () => void): void;
782
+ setDisabledState(isDisabled: boolean): void;
783
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Slider, never>;
784
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Slider, "bpx-slider", ["bpxSlider"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
785
+ }
786
+
787
+ type BpxInputType = 'text' | 'email' | 'password' | 'search' | 'tel' | 'url' | 'number';
788
+ /**
789
+ * A single-line text field. Works standalone with `[(value)]` and as a form
790
+ * control via `formControlName` / `[(ngModel)]`. Project `[bpxPrefix]` /
791
+ * `[bpxSuffix]` content (icons, units, buttons) into the ends.
792
+ *
793
+ * ```html
794
+ * <bpx-input [(value)]="email" type="email" placeholder="you@example.com" />
795
+ * <bpx-input formControlName="query" clearable>
796
+ * <bpx-icon bpxPrefix name="search" />
797
+ * </bpx-input>
798
+ * ```
799
+ */
800
+ declare class Input implements ControlValueAccessor {
801
+ /** Field text. Two-way bindable via `[(value)]`. */
802
+ readonly value: _angular_core.ModelSignal<string>;
803
+ readonly type: _angular_core.InputSignal<BpxInputType>;
804
+ readonly placeholder: _angular_core.InputSignal<string>;
805
+ /** Read-only via the template (aliased so `readonly` works in markup). */
806
+ readonly readonlyInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
807
+ /** Show a clear button while there is text. */
808
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
809
+ /** Error styling + `aria-invalid`. */
810
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
811
+ readonly size: _angular_core.InputSignal<BpxSize>;
812
+ readonly ariaLabel: _angular_core.InputSignal<string>;
813
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
814
+ private readonly cvaDisabled;
815
+ protected readonly disabled: _angular_core.Signal<boolean>;
816
+ private onChange;
817
+ protected onTouched: () => void;
818
+ protected onInput(event: Event): void;
819
+ protected clear(): void;
820
+ writeValue(value: string): void;
821
+ registerOnChange(fn: (value: string) => void): void;
822
+ registerOnTouched(fn: () => void): void;
823
+ setDisabledState(isDisabled: boolean): void;
824
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Input, never>;
825
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Input, "bpx-input", ["bpxInput"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "readonlyInput": { "alias": "readonly"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[bpxPrefix]", "[bpxSuffix]"], true, never>;
826
+ }
827
+
828
+ /**
829
+ * A multi-line text field. Works standalone with `[(value)]` and as a form
830
+ * control via `formControlName` / `[(ngModel)]`. Set `autoResize` to grow with
831
+ * its content.
832
+ *
833
+ * ```html
834
+ * <bpx-textarea [(value)]="bio" [rows]="4" placeholder="Tell us about yourself" />
835
+ * <bpx-textarea formControlName="notes" autoResize />
836
+ * ```
837
+ */
838
+ declare class Textarea implements ControlValueAccessor {
839
+ private readonly field;
840
+ /** Field text. Two-way bindable via `[(value)]`. */
841
+ readonly value: _angular_core.ModelSignal<string>;
842
+ readonly placeholder: _angular_core.InputSignal<string>;
843
+ readonly rows: _angular_core.InputSignal<number>;
844
+ /** Grow the field to fit its content instead of scrolling. */
845
+ readonly autoResize: _angular_core.InputSignalWithTransform<boolean, unknown>;
846
+ readonly readonlyInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
847
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
848
+ readonly size: _angular_core.InputSignal<BpxSize>;
849
+ readonly ariaLabel: _angular_core.InputSignal<string>;
850
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
851
+ private readonly cvaDisabled;
852
+ protected readonly disabled: _angular_core.Signal<boolean>;
853
+ private onChange;
854
+ protected onTouched: () => void;
855
+ constructor();
856
+ protected onInput(event: Event): void;
857
+ private resize;
858
+ writeValue(value: string): void;
859
+ registerOnChange(fn: (value: string) => void): void;
860
+ registerOnTouched(fn: () => void): void;
861
+ setDisabledState(isDisabled: boolean): void;
862
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Textarea, never>;
863
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Textarea, "bpx-textarea", ["bpxTextarea"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "autoResize": { "alias": "autoResize"; "required": false; "isSignal": true; }; "readonlyInput": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
864
+ }
865
+
866
+ /** Visual shape of a progress indicator. */
867
+ type BpxProgressShape = 'line' | 'half' | 'circle';
868
+ /**
869
+ * A determinate progress indicator in three shapes: a flat `line`, a `half`
870
+ * circle gauge, and a full `circle` ring.
871
+ *
872
+ * ```html
873
+ * <bpx-progress [value]="65" />
874
+ * <bpx-progress shape="half" [value]="40" showLabel />
875
+ * <bpx-progress shape="circle" [value]="80" color="success" showLabel />
876
+ * ```
877
+ */
878
+ declare class Progress {
879
+ readonly value: _angular_core.InputSignal<number>;
880
+ readonly max: _angular_core.InputSignal<number>;
881
+ readonly shape: _angular_core.InputSignal<BpxProgressShape>;
882
+ readonly color: _angular_core.InputSignal<BpxColor>;
883
+ /** Diameter in px for the `half` / `circle` shapes. */
884
+ readonly size: _angular_core.InputSignal<number>;
885
+ /** Track / stroke thickness in px (also the line height). */
886
+ readonly thickness: _angular_core.InputSignal<number>;
887
+ /** Show the rounded percentage in the centre (half / circle shapes). */
888
+ readonly showLabel: _angular_core.InputSignalWithTransform<boolean, unknown>;
889
+ readonly ariaLabel: _angular_core.InputSignal<string>;
890
+ protected readonly fraction: _angular_core.Signal<number>;
891
+ protected readonly pct: _angular_core.Signal<number>;
892
+ protected readonly rounded: _angular_core.Signal<number>;
893
+ protected readonly center: _angular_core.Signal<number>;
894
+ protected readonly radius: _angular_core.Signal<number>;
895
+ protected readonly circumference: _angular_core.Signal<number>;
896
+ protected readonly circleOffset: _angular_core.Signal<number>;
897
+ protected readonly semiLength: _angular_core.Signal<number>;
898
+ protected readonly semiOffset: _angular_core.Signal<number>;
899
+ /** Height of the half-circle viewport: top half of the ring plus its stroke. */
900
+ protected readonly halfHeight: _angular_core.Signal<number>;
901
+ /** Semicircle arc, left point over the top to the right point. */
902
+ protected readonly semiPath: _angular_core.Signal<string>;
903
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Progress, never>;
904
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Progress, "bpx-progress", ["bpxProgress"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
905
+ }
906
+
907
+ /**
908
+ * A single panel within `<bpx-tabs>`. Its content is lazily rendered only while
909
+ * the tab is active.
910
+ *
911
+ * ```html
912
+ * <bpx-tabs>
913
+ * <bpx-tab label="Overview">…</bpx-tab>
914
+ * <bpx-tab label="Settings" icon="search">…</bpx-tab>
915
+ * </bpx-tabs>
916
+ * ```
917
+ */
918
+ declare class Tab {
919
+ readonly label: _angular_core.InputSignal<string>;
920
+ /** Optional registered icon name shown before the label. */
921
+ readonly icon: _angular_core.InputSignal<string | undefined>;
922
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
923
+ /** Toggled by the parent `<bpx-tabs>`. */
924
+ readonly active: _angular_core.WritableSignal<boolean>;
925
+ private readonly baseId;
926
+ readonly tabId: string;
927
+ readonly panelId: string;
928
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Tab, never>;
929
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Tab, "bpx-tab", ["bpxTab"], { "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
930
+ }
931
+
932
+ /**
933
+ * A tabbed interface with a sliding active-indicator, keyboard navigation and
934
+ * full tablist ARIA. Compose it from `<bpx-tab>` children.
935
+ *
936
+ * ```html
937
+ * <bpx-tabs [(activeIndex)]="tab" color="primary">
938
+ * <bpx-tab label="Overview">…</bpx-tab>
939
+ * <bpx-tab label="Activity">…</bpx-tab>
940
+ * </bpx-tabs>
941
+ * ```
942
+ */
943
+ declare class Tabs {
944
+ readonly tabs: _angular_core.Signal<readonly Tab[]>;
945
+ readonly activeIndex: _angular_core.ModelSignal<number>;
946
+ readonly color: _angular_core.InputSignal<BpxColor>;
947
+ private readonly list;
948
+ private readonly tabButtons;
949
+ protected readonly indicatorLeft: _angular_core.WritableSignal<number>;
950
+ protected readonly indicatorWidth: _angular_core.WritableSignal<number>;
951
+ private readonly resizeTick;
952
+ constructor();
953
+ protected select(index: number): void;
954
+ protected onKeydown(event: KeyboardEvent): void;
955
+ /** First enabled tab index stepping `dir` from `from` (wraps), or -1. */
956
+ private step;
957
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Tabs, never>;
958
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Tabs, "bpx-tabs", ["bpxTabs"], { "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, { "activeIndex": "activeIndexChange"; }, ["tabs"], ["*"], true, never>;
959
+ }
960
+
961
+ type BpxTooltipPosition = 'top' | 'bottom' | 'left' | 'right';
962
+ /**
963
+ * Shows a small floating label on hover and keyboard focus. Built on the CDK
964
+ * overlay, so it flips to stay on-screen and never clips inside scroll areas.
965
+ *
966
+ * ```html
967
+ * <button bpx-button bpxTooltip="Save changes">Save</button>
968
+ * <bpx-icon name="info" bpxTooltip="More info" bpxTooltipPosition="right" />
969
+ * ```
970
+ */
971
+ declare class Tooltip {
972
+ /** Tooltip text. */
973
+ readonly text: _angular_core.InputSignal<string>;
974
+ readonly position: _angular_core.InputSignal<BpxTooltipPosition>;
975
+ /** Delay in ms before showing. */
976
+ readonly showDelay: _angular_core.InputSignal<number>;
977
+ private readonly overlay;
978
+ private readonly el;
979
+ private overlayRef?;
980
+ private showTimer?;
981
+ constructor();
982
+ protected show(): void;
983
+ protected hide(): void;
984
+ private attach;
985
+ private ensureOverlay;
986
+ private clearTimer;
987
+ /** Preferred placement plus its opposite as a flip fallback. */
988
+ private positionsFor;
989
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Tooltip, never>;
990
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Tooltip, "[bpxTooltip]", never, { "text": { "alias": "bpxTooltip"; "required": true; "isSignal": true; }; "position": { "alias": "bpxTooltipPosition"; "required": false; "isSignal": true; }; "showDelay": { "alias": "bpxTooltipDelay"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
991
+ }
992
+
993
+ /**
994
+ * A surface container for grouping related content. Three visual variants and
995
+ * an optional `interactive` state for clickable cards.
996
+ *
997
+ * ```html
998
+ * <bpx-card>…</bpx-card>
999
+ * <bpx-card variant="outline" interactive>…</bpx-card>
1000
+ * ```
1001
+ */
1002
+ declare class Card {
1003
+ readonly variant: _angular_core.InputSignal<"soft" | "outline" | "elevated">;
1004
+ /** Adds hover lift, pointer cursor and a focus ring for clickable cards. */
1005
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
1006
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Card, never>;
1007
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Card, "bpx-card", ["bpxCard"], { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1008
+ }
1009
+
1010
+ /**
1011
+ * A frosted "liquid glass" surface. Blurs and saturates whatever is behind it,
1012
+ * warps it with an SVG refraction filter, and carries a specular sheen that
1013
+ * follows the cursor. Wrap any content — a card, a toolbar, a hero panel — and
1014
+ * place it over something colorful for the effect to read.
1015
+ *
1016
+ * ```html
1017
+ * <bpx-liquid-glass [blur]="12" [distortion]="40">
1018
+ * <h2>Liquid Glass</h2>
1019
+ * </bpx-liquid-glass>
1020
+ * ```
1021
+ */
1022
+ declare class LiquidGlass {
1023
+ /** Backdrop blur radius, in px. */
1024
+ readonly blur: _angular_core.InputSignalWithTransform<number, unknown>;
1025
+ /** Backdrop saturation multiplier (1 = unchanged). */
1026
+ readonly saturation: _angular_core.InputSignalWithTransform<number, unknown>;
1027
+ /** Refraction strength (SVG displacement scale). `0` disables the warp. */
1028
+ readonly distortion: _angular_core.InputSignalWithTransform<number, unknown>;
1029
+ /** Glass tint — a translucent color layered over the blur. */
1030
+ readonly tint: _angular_core.InputSignal<string>;
1031
+ /** Corner radius (any CSS length). */
1032
+ readonly radius: _angular_core.InputSignal<string>;
1033
+ /** Drop shadow for lift. */
1034
+ readonly elevated: _angular_core.InputSignalWithTransform<boolean, unknown>;
1035
+ /** Specular sheen follows the cursor on hover. */
1036
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
1037
+ protected readonly active: _angular_core.WritableSignal<boolean>;
1038
+ protected readonly filterId: string;
1039
+ protected readonly blurPx: _angular_core.Signal<string>;
1040
+ protected readonly hasDistortion: _angular_core.Signal<boolean>;
1041
+ protected readonly refractFilter: _angular_core.Signal<string>;
1042
+ private readonly host;
1043
+ protected onMove(event: PointerEvent): void;
1044
+ protected onEnter(): void;
1045
+ protected onLeave(): void;
1046
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LiquidGlass, never>;
1047
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LiquidGlass, "bpx-liquid-glass", ["bpxLiquidGlass"], { "blur": { "alias": "blur"; "required": false; "isSignal": true; }; "saturation": { "alias": "saturation"; "required": false; "isSignal": true; }; "distortion": { "alias": "distortion"; "required": false; "isSignal": true; }; "tint": { "alias": "tint"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "elevated": { "alias": "elevated"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1048
+ }
1049
+
1050
+ /** Minimal contract the accordion needs from its items (avoids a circular import). */
1051
+ interface AccordionPanel {
1052
+ setOpen(open: boolean): void;
1053
+ }
1054
+ /**
1055
+ * A vertical stack of collapsible `<bpx-accordion-item>` panels. By default only
1056
+ * one panel is open at a time; set `multi` to allow several.
1057
+ *
1058
+ * ```html
1059
+ * <bpx-accordion>
1060
+ * <bpx-accordion-item heading="Shipping">…</bpx-accordion-item>
1061
+ * <bpx-accordion-item heading="Returns">…</bpx-accordion-item>
1062
+ * </bpx-accordion>
1063
+ * ```
1064
+ */
1065
+ declare class Accordion {
1066
+ /** Allow multiple panels open simultaneously. */
1067
+ readonly multi: _angular_core.InputSignalWithTransform<boolean, unknown>;
1068
+ private openPanel;
1069
+ /** Called by an item when it opens; closes the previous one in single mode. */
1070
+ notifyOpen(panel: AccordionPanel): void;
1071
+ notifyClose(panel: AccordionPanel): void;
1072
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Accordion, never>;
1073
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Accordion, "bpx-accordion", ["bpxAccordion"], { "multi": { "alias": "multi"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1074
+ }
1075
+
1076
+ /**
1077
+ * A single collapsible panel inside `<bpx-accordion>`. Two-way bindable via
1078
+ * `[(open)]`; its content animates open/closed and is `inert` while collapsed.
1079
+ */
1080
+ declare class AccordionItem implements AccordionPanel {
1081
+ private readonly parent;
1082
+ readonly heading: _angular_core.InputSignal<string>;
1083
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1084
+ /** Open state. Two-way bindable via `[(open)]`. */
1085
+ readonly open: _angular_core.ModelSignal<boolean>;
1086
+ private readonly baseId;
1087
+ protected readonly triggerId: string;
1088
+ protected readonly regionId: string;
1089
+ constructor();
1090
+ protected toggle(): void;
1091
+ /** Called by the parent accordion to close this panel in single-open mode. */
1092
+ setOpen(open: boolean): void;
1093
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AccordionItem, never>;
1094
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AccordionItem, "bpx-accordion-item", ["bpxAccordionItem"], { "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*"], true, never>;
1095
+ }
1096
+
1097
+ /**
1098
+ * A modal dialog rendered in the CDK overlay (so it escapes any clipping or
1099
+ * stacking context). Controlled declaratively with `[(open)]`; traps focus,
1100
+ * locks background scroll, and closes on backdrop click or Escape.
1101
+ *
1102
+ * ```html
1103
+ * <button bpx-button (click)="confirm.set(true)">Delete</button>
1104
+ * <bpx-dialog [(open)]="confirm" title="Delete item?">
1105
+ * <p>This can't be undone.</p>
1106
+ * <div bpxDialogFooter>
1107
+ * <button bpx-button variant="ghost" (click)="confirm.set(false)">Cancel</button>
1108
+ * <button bpx-button color="danger" (click)="remove()">Delete</button>
1109
+ * </div>
1110
+ * </bpx-dialog>
1111
+ * ```
1112
+ */
1113
+ declare class Dialog {
1114
+ /** Open state. Two-way bindable via `[(open)]`. */
1115
+ readonly open: _angular_core.ModelSignal<boolean>;
1116
+ readonly title: _angular_core.InputSignal<string>;
1117
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1118
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
1119
+ /** Prevent closing via backdrop click and Escape. */
1120
+ readonly disableClose: _angular_core.InputSignalWithTransform<boolean, unknown>;
1121
+ protected readonly titleId: string;
1122
+ private readonly tpl;
1123
+ private readonly overlay;
1124
+ private readonly vcr;
1125
+ private readonly isBrowser;
1126
+ private overlayRef?;
1127
+ constructor();
1128
+ protected close(): void;
1129
+ private attach;
1130
+ private detach;
1131
+ private ensureOverlay;
1132
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Dialog, never>;
1133
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Dialog, "bpx-dialog", ["bpxDialog"], { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disableClose": { "alias": "disableClose"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*", "[bpxDialogFooter]"], true, never>;
1134
+ }
1135
+
1136
+ /**
1137
+ * A checkbox with an optional indeterminate state. Works standalone with
1138
+ * `[(checked)]` and as a form control via `formControlName` / `[(ngModel)]`.
1139
+ *
1140
+ * ```html
1141
+ * <bpx-checkbox [(checked)]="agree">I agree to the terms</bpx-checkbox>
1142
+ * <bpx-checkbox formControlName="selectAll" [indeterminate]="some" />
1143
+ * ```
1144
+ */
1145
+ declare class Checkbox implements ControlValueAccessor {
1146
+ /** Checked state. Two-way bindable via `[(checked)]`. */
1147
+ readonly checked: _angular_core.ModelSignal<boolean>;
1148
+ /** Mixed state — cleared to `checked` on the next user toggle. */
1149
+ readonly indeterminate: _angular_core.ModelSignal<boolean>;
1150
+ readonly size: _angular_core.InputSignal<"sm" | "md">;
1151
+ readonly color: _angular_core.InputSignal<BpxColor>;
1152
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
1153
+ private readonly cvaDisabled;
1154
+ protected readonly disabled: _angular_core.Signal<boolean>;
1155
+ private onChange;
1156
+ protected onTouched: () => void;
1157
+ protected toggle(): void;
1158
+ protected onKey(event: Event): void;
1159
+ writeValue(value: boolean): void;
1160
+ registerOnChange(fn: (value: boolean) => void): void;
1161
+ registerOnTouched(fn: () => void): void;
1162
+ setDisabledState(isDisabled: boolean): void;
1163
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Checkbox, never>;
1164
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Checkbox, "bpx-checkbox", ["bpxCheckbox"], { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "indeterminate": "indeterminateChange"; }, never, ["*"], true, never>;
1165
+ }
1166
+
1167
+ /**
1168
+ * A single option inside `<bpx-radio-group>`. Its label is projected content.
1169
+ *
1170
+ * ```html
1171
+ * <bpx-radio value="pro">Pro plan</bpx-radio>
1172
+ * ```
1173
+ */
1174
+ declare class Radio {
1175
+ readonly value: _angular_core.InputSignal<unknown>;
1176
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
1177
+ protected readonly group: RadioGroup;
1178
+ private readonly el;
1179
+ readonly checked: _angular_core.Signal<boolean>;
1180
+ readonly disabled: _angular_core.Signal<boolean>;
1181
+ /** Roving tabindex: the checked radio (or the first enabled one when none is
1182
+ * selected) is the single tab stop for the group. */
1183
+ protected readonly tabindex: _angular_core.Signal<0 | -1>;
1184
+ protected select(): void;
1185
+ protected onKeydown(event: KeyboardEvent): void;
1186
+ protected onBlur(): void;
1187
+ focus(): void;
1188
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Radio, never>;
1189
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Radio, "bpx-radio", ["bpxRadio"], { "value": { "alias": "value"; "required": true; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1190
+ }
1191
+
1192
+ /**
1193
+ * Groups a set of `<bpx-radio>` buttons into a single-choice control. Works
1194
+ * standalone with `[(value)]` and as a form control via `formControlName` /
1195
+ * `[(ngModel)]`. Arrow keys move (and select) between options.
1196
+ *
1197
+ * ```html
1198
+ * <bpx-radio-group [(value)]="plan">
1199
+ * <bpx-radio value="free">Free</bpx-radio>
1200
+ * <bpx-radio value="pro">Pro</bpx-radio>
1201
+ * </bpx-radio-group>
1202
+ * ```
1203
+ */
1204
+ declare class RadioGroup implements ControlValueAccessor {
1205
+ /** Selected value. Two-way bindable via `[(value)]`. */
1206
+ readonly value: _angular_core.ModelSignal<unknown>;
1207
+ readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
1208
+ readonly color: _angular_core.InputSignal<BpxColor>;
1209
+ readonly size: _angular_core.InputSignal<"sm" | "md">;
1210
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
1211
+ private readonly cvaDisabled;
1212
+ readonly disabled: _angular_core.Signal<boolean>;
1213
+ readonly radios: _angular_core.Signal<readonly Radio[]>;
1214
+ private onChange;
1215
+ onTouched: () => void;
1216
+ select(value: unknown): void;
1217
+ /** First non-disabled radio — the roving-tabindex entry point when nothing is selected. */
1218
+ firstEnabled(): Radio | undefined;
1219
+ handleKey(event: KeyboardEvent, current: Radio): void;
1220
+ writeValue(value: unknown): void;
1221
+ registerOnChange(fn: (value: unknown) => void): void;
1222
+ registerOnTouched(fn: () => void): void;
1223
+ setDisabledState(isDisabled: boolean): void;
1224
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadioGroup, never>;
1225
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioGroup, "bpx-radio-group", ["bpxRadioGroup"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, ["radios"], ["*"], true, never>;
1226
+ }
1227
+
1228
+ interface PaginationItem {
1229
+ type: 'page' | 'ellipsis';
1230
+ page: number;
1231
+ }
1232
+ /**
1233
+ * Page navigation with automatic ellipsis truncation. `page` is 1-based and
1234
+ * two-way bindable.
1235
+ *
1236
+ * ```html
1237
+ * <bpx-pagination [(page)]="page" [pageCount]="12" />
1238
+ * ```
1239
+ */
1240
+ declare class Pagination {
1241
+ /** Current 1-based page. Two-way bindable via `[(page)]`. */
1242
+ readonly page: _angular_core.ModelSignal<number>;
1243
+ readonly pageCount: _angular_core.InputSignal<number>;
1244
+ /** Pages to show on each side of the current page. */
1245
+ readonly siblingCount: _angular_core.InputSignal<number>;
1246
+ /** Pages to always show at the start and end. */
1247
+ readonly boundaryCount: _angular_core.InputSignal<number>;
1248
+ /** The rendered sequence of page buttons and ellipses. */
1249
+ readonly items: _angular_core.Signal<PaginationItem[]>;
1250
+ protected go(target: number): void;
1251
+ protected prev(): void;
1252
+ protected next(): void;
1253
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Pagination, never>;
1254
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Pagination, "bpx-pagination", ["bpxPagination"], { "page": { "alias": "page"; "required": false; "isSignal": true; }; "pageCount": { "alias": "pageCount"; "required": false; "isSignal": true; }; "siblingCount": { "alias": "siblingCount"; "required": false; "isSignal": true; }; "boundaryCount": { "alias": "boundaryCount"; "required": false; "isSignal": true; }; }, { "page": "pageChange"; }, never, never, true, never>;
1255
+ }
1256
+
1257
+ /**
1258
+ * A scroll container with a slim, custom overlay scrollbar. Native scrolling
1259
+ * (wheel, touch, keyboard) is preserved — the native bar is hidden and replaced
1260
+ * with a styled, draggable thumb that only appears when content overflows.
1261
+ *
1262
+ * Give the host a bounded height (fixed, `max-height`, or a flex context).
1263
+ *
1264
+ * ```html
1265
+ * <bpx-scroll-area style="max-height: 320px">…long content…</bpx-scroll-area>
1266
+ * ```
1267
+ */
1268
+ declare class ScrollArea {
1269
+ private readonly viewport;
1270
+ private readonly content;
1271
+ protected readonly overflowing: _angular_core.WritableSignal<boolean>;
1272
+ protected readonly thumbSize: _angular_core.WritableSignal<number>;
1273
+ protected readonly thumbOffset: _angular_core.WritableSignal<number>;
1274
+ private dragging;
1275
+ private dragStartY;
1276
+ private dragStartScrollTop;
1277
+ private readonly minThumb;
1278
+ constructor();
1279
+ protected onScroll(): void;
1280
+ protected onThumbPointerDown(event: PointerEvent): void;
1281
+ protected onPointerMove(event: PointerEvent): void;
1282
+ protected onPointerUp(): void;
1283
+ /** Click on the track (not the thumb) pages toward the click. */
1284
+ protected onTrackPointerDown(event: PointerEvent): void;
1285
+ private measure;
1286
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScrollArea, never>;
1287
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ScrollArea, "bpx-scroll-area", ["bpxScrollArea"], {}, {}, never, ["*"], true, never>;
1288
+ }
1289
+
1290
+ /**
1291
+ * An HSV color picker: a saturation/value field, a hue slider, a hex input and
1292
+ * preset swatches. Value is a hex string. Works standalone with `[(value)]` and
1293
+ * as a form control.
1294
+ *
1295
+ * ```html
1296
+ * <bpx-color-picker [(value)]="brand" />
1297
+ * <bpx-color-picker formControlName="accent" [swatches]="palette" />
1298
+ * ```
1299
+ */
1300
+ declare class ColorPicker implements ControlValueAccessor {
1301
+ /** Hex color. Two-way bindable via `[(value)]`. */
1302
+ readonly value: _angular_core.ModelSignal<string>;
1303
+ readonly swatches: _angular_core.InputSignal<string[]>;
1304
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
1305
+ private readonly cvaDisabled;
1306
+ protected readonly disabled: _angular_core.Signal<boolean>;
1307
+ protected readonly hue: _angular_core.WritableSignal<number>;
1308
+ protected readonly sat: _angular_core.WritableSignal<number>;
1309
+ protected readonly val: _angular_core.WritableSignal<number>;
1310
+ protected readonly hex: _angular_core.Signal<string>;
1311
+ protected readonly pureHue: _angular_core.Signal<string>;
1312
+ private readonly svArea;
1313
+ private readonly hueTrack;
1314
+ private dragTarget;
1315
+ private onChange;
1316
+ protected onTouched: () => void;
1317
+ constructor();
1318
+ protected onSvPointerDown(event: PointerEvent): void;
1319
+ protected onHuePointerDown(event: PointerEvent): void;
1320
+ protected onPointerMove(event: PointerEvent): void;
1321
+ protected onPointerUp(): void;
1322
+ protected onHexInput(event: Event): void;
1323
+ protected pickSwatch(swatch: string): void;
1324
+ private updateSv;
1325
+ private updateHue;
1326
+ private applyHex;
1327
+ private commit;
1328
+ writeValue(value: string): void;
1329
+ registerOnChange(fn: (value: string) => void): void;
1330
+ registerOnTouched(fn: () => void): void;
1331
+ setDisabledState(isDisabled: boolean): void;
1332
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColorPicker, never>;
1333
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ColorPicker, "bpx-color-picker", ["bpxColorPicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "swatches": { "alias": "swatches"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
1334
+ }
1335
+
1336
+ /** Semantic type of a toast. */
1337
+ type BpxToastType = 'info' | 'success' | 'warning' | 'danger';
1338
+ /** An optional action button rendered inside a toast. */
1339
+ interface BpxToastAction {
1340
+ label: string;
1341
+ run: () => void;
1342
+ }
1343
+ interface BpxToastOptions {
1344
+ type?: BpxToastType;
1345
+ /** Auto-dismiss delay in ms; `0` keeps it until dismissed. */
1346
+ duration?: number;
1347
+ action?: BpxToastAction;
1348
+ }
1349
+ interface BpxToast extends Required<Omit<BpxToastOptions, 'action'>> {
1350
+ id: number;
1351
+ message: string;
1352
+ action?: BpxToastAction;
1353
+ }
1354
+
1355
+ /**
1356
+ * Fires transient toast notifications. They render in a single top-right overlay
1357
+ * that the service lazily creates on first use.
1358
+ *
1359
+ * ```ts
1360
+ * const toasts = inject(ToastService);
1361
+ * toasts.success('Saved');
1362
+ * toasts.error('Upload failed', { action: { label: 'Retry', run: () => retry() } });
1363
+ * ```
1364
+ */
1365
+ declare class ToastService {
1366
+ private readonly overlay;
1367
+ private readonly injector;
1368
+ private readonly isBrowser;
1369
+ private readonly list;
1370
+ /** The current live toasts (read-only). */
1371
+ readonly toasts: _angular_core.Signal<BpxToast[]>;
1372
+ private overlayRef?;
1373
+ private counter;
1374
+ private readonly timers;
1375
+ /** Milliseconds still to run before auto-dismiss (updated on pause). */
1376
+ private readonly remaining;
1377
+ /** Wall-clock time the current running timer was (re)started. */
1378
+ private readonly startedAt;
1379
+ show(message: string, options?: BpxToastOptions): number;
1380
+ /** Pause a toast's auto-dismiss countdown (e.g. while hovered). */
1381
+ pause(id: number): void;
1382
+ /** Resume a paused countdown with whatever time was left. */
1383
+ resume(id: number): void;
1384
+ private startTimer;
1385
+ success(message: string, options?: BpxToastOptions): number;
1386
+ error(message: string, options?: BpxToastOptions): number;
1387
+ warning(message: string, options?: BpxToastOptions): number;
1388
+ info(message: string, options?: BpxToastOptions): number;
1389
+ dismiss(id: number): void;
1390
+ clear(): void;
1391
+ private ensureContainer;
1392
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToastService, never>;
1393
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ToastService>;
1394
+ }
1395
+
1396
+ /**
1397
+ * Opens a `<bpx-menu>` from the element it's placed on (typically a button).
1398
+ *
1399
+ * ```html
1400
+ * <button bpx-button [bpxMenuTriggerFor]="menu">Actions</button>
1401
+ * ```
1402
+ */
1403
+ declare class MenuTrigger {
1404
+ readonly menu: _angular_core.InputSignal<Menu>;
1405
+ private readonly overlay;
1406
+ private readonly el;
1407
+ private readonly vcr;
1408
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
1409
+ private overlayRef?;
1410
+ private closedSub?;
1411
+ constructor();
1412
+ protected toggle(): void;
1413
+ protected onArrowDown(event: Event): void;
1414
+ private open;
1415
+ private close;
1416
+ private ensureOverlay;
1417
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MenuTrigger, never>;
1418
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MenuTrigger, "[bpxMenuTriggerFor]", ["bpxMenuTrigger"], { "menu": { "alias": "bpxMenuTriggerFor"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1419
+ }
1420
+
1421
+ /** A column definition for `<bpx-table>`. */
1422
+ interface BpxColumn {
1423
+ key: string;
1424
+ header: string;
1425
+ sortable?: boolean;
1426
+ align?: 'start' | 'center' | 'end';
1427
+ /** Any CSS width, e.g. `'40%'` or `'8rem'`. */
1428
+ width?: string;
1429
+ }
1430
+ interface BpxSort {
1431
+ key: string;
1432
+ direction: 'asc' | 'desc';
1433
+ }
1434
+ /**
1435
+ * A data table with column-config, click-to-sort, row selection (built on
1436
+ * `bpx-checkbox`), an optional sticky header, and custom cell templates via
1437
+ * `[bpxCell]`.
1438
+ *
1439
+ * ```html
1440
+ * <bpx-table [columns]="cols" [data]="rows" selectable [(selected)]="picked">
1441
+ * <ng-template bpxCell="status" let-row>
1442
+ * <bpx-badge [color]="row.color">{{ row.status }}</bpx-badge>
1443
+ * </ng-template>
1444
+ * </bpx-table>
1445
+ * ```
1446
+ */
1447
+ declare class Table<T = Record<string, unknown>> {
1448
+ readonly columns: _angular_core.InputSignal<BpxColumn[]>;
1449
+ readonly data: _angular_core.InputSignal<T[]>;
1450
+ readonly selectable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1451
+ readonly stickyHeader: _angular_core.InputSignalWithTransform<boolean, unknown>;
1452
+ /** Active sort. Two-way bindable. */
1453
+ readonly sort: _angular_core.ModelSignal<BpxSort | null>;
1454
+ /** Selected rows (by reference). Two-way bindable. */
1455
+ readonly selected: _angular_core.ModelSignal<T[]>;
1456
+ private readonly cellDefs;
1457
+ protected readonly sortedData: _angular_core.Signal<T[]>;
1458
+ private readonly selectedCount;
1459
+ protected readonly allSelected: _angular_core.Signal<boolean>;
1460
+ protected readonly someSelected: _angular_core.Signal<boolean>;
1461
+ protected readonly colspan: _angular_core.Signal<number>;
1462
+ protected cellValue(row: T, key: string): unknown;
1463
+ protected cellTemplate(key: string): TemplateRef<unknown> | null;
1464
+ protected ariaSort(col: BpxColumn): 'ascending' | 'descending' | 'none' | null;
1465
+ protected toggleSort(col: BpxColumn): void;
1466
+ protected isSelected(row: T): boolean;
1467
+ protected toggleRow(row: T): void;
1468
+ protected toggleAll(checked: boolean): void;
1469
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Table<any>, never>;
1470
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Table<any>, "bpx-table", ["bpxTable"], { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; }, { "sort": "sortChange"; "selected": "selectedChange"; }, ["cellDefs"], never, true, never>;
1471
+ }
1472
+
1473
+ /**
1474
+ * Marks an `<ng-template>` as the custom cell renderer for a column, keyed by
1475
+ * the column's `key`. The row is the template's implicit context.
1476
+ *
1477
+ * ```html
1478
+ * <ng-template bpxCell="status" let-row>
1479
+ * <bpx-badge [color]="row.active ? 'success' : 'neutral'">{{ row.status }}</bpx-badge>
1480
+ * </ng-template>
1481
+ * ```
1482
+ */
1483
+ declare class BpxCellDef {
1484
+ readonly column: _angular_core.InputSignal<string>;
1485
+ readonly template: TemplateRef<unknown>;
1486
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BpxCellDef, never>;
1487
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BpxCellDef, "[bpxCell]", never, { "column": { "alias": "bpxCell"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1488
+ }
1489
+
1490
+ /**
1491
+ * Type vocabulary for `<bpx-pivot-grid>`.
1492
+ *
1493
+ * The grid mirrors an Excel PivotTable: fields are dragged into four areas —
1494
+ * Rows, Columns, Values and Filters — and the engine cross-tabulates the source
1495
+ * data into a nested, collapsible matrix with subtotals and grand totals.
1496
+ */
1497
+ /** Aggregation applied to a value field. Mirrors Excel's "Summarize by" list. */
1498
+ type BpxPivotAggregation = 'sum' | 'count' | 'avg' | 'min' | 'max' | 'countDistinct';
1499
+ /** The four drop areas of a pivot layout. */
1500
+ type BpxPivotArea = 'rows' | 'columns' | 'values' | 'filters';
1501
+ /**
1502
+ * Declares a field the pivot can work with. `key` is the property read off each
1503
+ * source record; everything else is presentation. Fields are the palette the
1504
+ * user drags from — where a field ends up (rows/columns/values) is layout, held
1505
+ * separately in {@link BpxPivotConfig}.
1506
+ */
1507
+ interface BpxPivotField {
1508
+ /** Property key on each source record. */
1509
+ key: string;
1510
+ /** Display name. Defaults to `key`. */
1511
+ label?: string;
1512
+ /**
1513
+ * `dimension` fields group (go in Rows/Columns/Filters); `measure` fields are
1514
+ * summarized (go in Values). A field may be usable as either — this is just
1515
+ * the default area suggested by the field pane. Defaults to inference from
1516
+ * the first non-null value (number → measure, else dimension).
1517
+ */
1518
+ kind?: 'dimension' | 'measure';
1519
+ /** Default aggregation when dropped into Values. Defaults to `sum`. */
1520
+ defaultAggregation?: BpxPivotAggregation;
1521
+ /** Formats an aggregated numeric cell for this field, e.g. currency. */
1522
+ format?: (value: number) => string;
1523
+ /** Formats a group label (dimension member) for headers. */
1524
+ formatLabel?: (value: unknown) => string;
1525
+ }
1526
+ /** A field placed in the Values area, with the aggregation to apply. */
1527
+ interface BpxPivotValue {
1528
+ key: string;
1529
+ aggregation: BpxPivotAggregation;
1530
+ /** Overrides the column caption. Defaults to e.g. "Sum of Revenue". */
1531
+ label?: string;
1532
+ }
1533
+ /**
1534
+ * A value filter on a dimension field. When `included` is set, only records
1535
+ * whose value (stringified) is in the list survive; `undefined` means "all".
1536
+ */
1537
+ interface BpxPivotFilter {
1538
+ key: string;
1539
+ included?: string[];
1540
+ }
1541
+ /** How an axis is ordered. */
1542
+ interface BpxPivotSort {
1543
+ /** `'label'` sorts groups by their member label. `'value'` sorts row groups
1544
+ * by a value column (identified by `measure`). */
1545
+ by: 'label' | 'value';
1546
+ direction: 'asc' | 'desc';
1547
+ /** Index into the flattened value-column list — required when `by` is `'value'`. */
1548
+ measure?: number;
1549
+ }
1550
+ /**
1551
+ * The full pivot layout. This is what `<bpx-pivot-grid>` takes as a two-way
1552
+ * `[(config)]` — the field pane mutates it, and consumers can seed it.
1553
+ */
1554
+ interface BpxPivotConfig {
1555
+ /** Dimension field keys nested outer→inner down the row axis. */
1556
+ rows: string[];
1557
+ /** Dimension field keys nested outer→inner across the column axis. */
1558
+ columns: string[];
1559
+ /** Measures shown as value columns, in order. */
1560
+ values: BpxPivotValue[];
1561
+ /** Report filters applied before pivoting. */
1562
+ filters: BpxPivotFilter[];
1563
+ /** Ordering of the row axis. Defaults to label-ascending. */
1564
+ rowSort?: BpxPivotSort;
1565
+ /** Ordering of the column axis. Defaults to label-ascending. */
1566
+ columnSort?: BpxPivotSort;
1567
+ }
1568
+ /** One measure column resolved against one column-group leaf. */
1569
+ interface BpxPivotLeafColumn {
1570
+ /** Stable id used for cell lookup and `track`. */
1571
+ id: string;
1572
+ /** The column-group path this measure sits under (empty when no col fields). */
1573
+ path: string[];
1574
+ value: BpxPivotValue;
1575
+ /** Caption, e.g. "Sum of Revenue". */
1576
+ label: string;
1577
+ align: 'start' | 'end';
1578
+ /** True for the trailing grand-total measure columns. */
1579
+ grandTotal: boolean;
1580
+ }
1581
+ /** A node in the column header tree (for rendering the banded header). */
1582
+ interface BpxPivotColumnNode {
1583
+ key: string;
1584
+ label: string;
1585
+ path: string[];
1586
+ depth: number;
1587
+ children: BpxPivotColumnNode[];
1588
+ /** Number of leaf measure-columns spanned — the header cell's colspan. */
1589
+ span: number;
1590
+ }
1591
+ /** A single aggregated data cell. */
1592
+ interface BpxPivotCell {
1593
+ /** Raw aggregated number (NaN when empty). */
1594
+ value: number;
1595
+ /** Pre-formatted display string. */
1596
+ display: string;
1597
+ /** True for subtotal / grand-total cells (styled distinctly). */
1598
+ total: boolean;
1599
+ }
1600
+ /** A node in the row axis tree. */
1601
+ interface BpxPivotRowNode {
1602
+ /** Path of member values from the root (identity for expand state + track). */
1603
+ path: string[];
1604
+ key: string;
1605
+ label: string;
1606
+ depth: number;
1607
+ children: BpxPivotRowNode[];
1608
+ /** Cells aligned to the engine's flat leaf-column order (incl. grand-total col). */
1609
+ cells: BpxPivotCell[];
1610
+ /** Whether this node has children that can be expanded. */
1611
+ expandable: boolean;
1612
+ /** A grand-total row sits at the bottom, spanning all row-header columns. */
1613
+ grandTotal: boolean;
1614
+ }
1615
+ /** Everything the template needs to draw the grid. */
1616
+ interface BpxPivotModel {
1617
+ /** Leaf measure columns in render order (grand-total cols appended last). */
1618
+ leafColumns: BpxPivotLeafColumn[];
1619
+ /** Column-group header nodes per column-field depth (outer→inner). Empty when
1620
+ * there are no column fields. Used to render the banded header rows. */
1621
+ columnLevels: BpxPivotColumnNode[][];
1622
+ /** Root-level row nodes (grand total appended last when enabled). */
1623
+ rows: BpxPivotRowNode[];
1624
+ /** Field labels forming the row axis (for the corner header cells). */
1625
+ rowFields: string[];
1626
+ /** Number of column-field levels (`config.columns.length`). */
1627
+ columnFieldCount: number;
1628
+ /** Number of value measures (`config.values.length`). */
1629
+ valueCount: number;
1630
+ /** True when a grand-total column band is present (column fields exist). */
1631
+ hasGrandTotalColumn: boolean;
1632
+ }
1633
+
1634
+ /** A record the pivot can read. Consumers pass their own row objects. */
1635
+ type PivotRecord = Record<string, unknown>;
1636
+ /** Options controlling what the engine emits (mostly wired from grid inputs). */
1637
+ interface PivotEngineOptions {
1638
+ /** Append a grand-total row across everything. Default true. */
1639
+ grandTotalRow?: boolean;
1640
+ /** Append a grand-total column when column fields exist. Default true. */
1641
+ grandTotalColumn?: boolean;
1642
+ /** Show subtotal rows for parent groups. Default true. When false, only leaf
1643
+ * rows carry values (parents render as bare labels). */
1644
+ subtotals?: boolean;
1645
+ }
1646
+ /**
1647
+ * Cross-tabulate `data` into a full pivot model according to `config`. Pure and
1648
+ * synchronous — the grid calls this inside a `computed()` so it re-runs only
1649
+ * when data/config change.
1650
+ */
1651
+ declare function computePivot(data: PivotRecord[], fields: BpxPivotField[], config: BpxPivotConfig, options?: PivotEngineOptions): BpxPivotModel;
1652
+ /**
1653
+ * Flatten a row tree into visible rows given a set of collapsed path-keys. The
1654
+ * grid uses this for rendering (and virtualization) so expand/collapse never
1655
+ * re-runs the aggregation.
1656
+ */
1657
+ declare function flattenRows(rows: BpxPivotRowNode[], collapsed: ReadonlySet<string>): BpxPivotRowNode[];
1658
+ /** Stable identity for a row node (used for expand state + `track`). */
1659
+ declare function rowKey(node: BpxPivotRowNode): string;
1660
+ /** List the distinct member labels for a field, for the filter checkbox list. */
1661
+ declare function distinctMembers(data: PivotRecord[], fields: BpxPivotField[], key: string): string[];
1662
+
1663
+ /**
1664
+ * An Excel-style pivot grid. Give it flat `data` and a set of `fields`, then
1665
+ * either seed a `[(config)]` (which dimensions go on rows/columns/values) or let
1666
+ * users build it live by dragging fields in the field pane.
1667
+ *
1668
+ * It cross-tabulates the data into a nested, collapsible matrix with per-group
1669
+ * subtotals and grand totals, six aggregations, click-to-sort headers and
1670
+ * Excel-style value filters.
1671
+ *
1672
+ * ```html
1673
+ * <bpx-pivot-grid
1674
+ * [data]="sales"
1675
+ * [fields]="fields"
1676
+ * [(config)]="config"
1677
+ * fieldPane
1678
+ * />
1679
+ * ```
1680
+ */
1681
+ declare class PivotGrid<T = PivotRecord> {
1682
+ /** Flat source records to pivot. */
1683
+ readonly data: _angular_core.InputSignal<T[]>;
1684
+ /** Field catalogue — the palette users pivot by. */
1685
+ readonly fields: _angular_core.InputSignal<BpxPivotField[]>;
1686
+ /** The pivot layout. Two-way bindable; the field pane mutates it. */
1687
+ readonly config: _angular_core.ModelSignal<BpxPivotConfig>;
1688
+ /** Show the drag-and-drop field pane alongside the grid. */
1689
+ readonly fieldPane: _angular_core.InputSignalWithTransform<boolean, unknown>;
1690
+ /** Append a grand-total row across everything. */
1691
+ readonly grandTotalRow: _angular_core.InputSignalWithTransform<boolean, unknown>;
1692
+ /** Append a grand-total column when column fields exist. */
1693
+ readonly grandTotalColumn: _angular_core.InputSignalWithTransform<boolean, unknown>;
1694
+ /** Render subtotal rows for parent groups. */
1695
+ readonly subtotals: _angular_core.InputSignalWithTransform<boolean, unknown>;
1696
+ /** Keep the header (and row-label column) pinned while the body scrolls. */
1697
+ readonly stickyHeader: _angular_core.InputSignalWithTransform<boolean, unknown>;
1698
+ /** Max height of the scroll area, e.g. `'480px'`. Unset = grow to content. */
1699
+ readonly maxHeight: _angular_core.InputSignal<string | undefined>;
1700
+ /** Collapsed row-node keys. Everything is expanded by default (Excel-like). */
1701
+ private readonly collapsed;
1702
+ /** Data as plain records — the engine and pane read fields off these. */
1703
+ protected readonly records: _angular_core.Signal<PivotRecord[]>;
1704
+ /** The cross-tabulated model — recomputes only when data/config/opts change. */
1705
+ protected readonly model: _angular_core.Signal<_tristan_stavast_blueprintx.BpxPivotModel>;
1706
+ /** Visible rows after applying expand/collapse. */
1707
+ protected readonly visibleRows: _angular_core.Signal<BpxPivotRowNode[]>;
1708
+ /** Column-band level indices, for the `@for` over header rows. */
1709
+ protected readonly columnLevelIndexes: _angular_core.Signal<number[]>;
1710
+ /** Corner-cell rowspan: all band rows plus the measure-caption row. */
1711
+ protected readonly cornerRowspan: _angular_core.Signal<number>;
1712
+ /** Caption for the row-label corner (the nested row field names). */
1713
+ protected readonly rowLabelHeader: _angular_core.Signal<string>;
1714
+ protected rowNodeKey: typeof rowKey;
1715
+ protected isCollapsed(node: BpxPivotRowNode): boolean;
1716
+ protected toggle(node: BpxPivotRowNode): void;
1717
+ /** Expand or collapse every group at once (toolbar affordance). */
1718
+ protected setAllCollapsed(collapse: boolean): void;
1719
+ protected sortRowLabelDir(): 'asc' | 'desc' | null;
1720
+ protected sortMeasureDir(index: number): 'asc' | 'desc' | null;
1721
+ protected sortColumnsDir(): 'asc' | 'desc' | null;
1722
+ protected cycleRowLabelSort(): void;
1723
+ protected cycleMeasureSort(index: number): void;
1724
+ protected cycleColumnSort(): void;
1725
+ protected trackColumn: (_: number, col: BpxPivotLeafColumn) => string;
1726
+ private patch;
1727
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PivotGrid<any>, never>;
1728
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PivotGrid<any>, "bpx-pivot-grid", ["bpxPivotGrid"], { "data": { "alias": "data"; "required": false; "isSignal": true; }; "fields": { "alias": "fields"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "fieldPane": { "alias": "fieldPane"; "required": false; "isSignal": true; }; "grandTotalRow": { "alias": "grandTotalRow"; "required": false; "isSignal": true; }; "grandTotalColumn": { "alias": "grandTotalColumn"; "required": false; "isSignal": true; }; "subtotals": { "alias": "subtotals"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; }, { "config": "configChange"; }, never, never, true, never>;
1729
+ }
1730
+
1731
+ /** A field resolved for display in one of the pane's area boxes. */
1732
+ interface PaneChip {
1733
+ key: string;
1734
+ label: string;
1735
+ /** Only set for Values chips. */
1736
+ aggregation?: BpxPivotAggregation;
1737
+ /** True when a value filter is narrowing this dimension. */
1738
+ filtered: boolean;
1739
+ }
1740
+ /**
1741
+ * The Excel-style "PivotTable Fields" pane: a list of available fields on top,
1742
+ * and four drop areas (Filters, Columns, Rows, Values) below. Drag fields
1743
+ * between areas to reshape the pivot; pick an aggregation per value; filter the
1744
+ * members of any dimension. Binds to the same `[(config)]` as the grid.
1745
+ */
1746
+ declare class PivotFieldPane {
1747
+ readonly fields: _angular_core.InputSignal<BpxPivotField[]>;
1748
+ readonly data: _angular_core.InputSignal<PivotRecord[]>;
1749
+ readonly config: _angular_core.ModelSignal<BpxPivotConfig>;
1750
+ private readonly registry;
1751
+ constructor();
1752
+ readonly aggregations: {
1753
+ value: BpxPivotAggregation;
1754
+ label: string;
1755
+ }[];
1756
+ /** Which dimension's filter panel is open (by field key), or null. */
1757
+ protected readonly openFilter: _angular_core.WritableSignal<string | null>;
1758
+ private label;
1759
+ private isFiltered;
1760
+ /** Keys already placed somewhere — hidden from the "available" list. */
1761
+ private readonly usedKeys;
1762
+ protected readonly available: _angular_core.Signal<PaneChip[]>;
1763
+ protected readonly rowChips: _angular_core.Signal<PaneChip[]>;
1764
+ protected readonly columnChips: _angular_core.Signal<PaneChip[]>;
1765
+ protected readonly filterChips: _angular_core.Signal<PaneChip[]>;
1766
+ protected readonly valueChips: _angular_core.Signal<PaneChip[]>;
1767
+ protected onDrop(event: CdkDragDrop<PaneChip[]>, target: BpxPivotArea | 'available'): void;
1768
+ private reorder;
1769
+ private removeKey;
1770
+ private addKey;
1771
+ private newValue;
1772
+ /** Remove a chip from its area (the × button). */
1773
+ protected remove(key: string): void;
1774
+ /** Change the aggregation on a Values chip. */
1775
+ protected changeAggregation(index: number, agg: string): void;
1776
+ protected toggleFilterPanel(key: string): void;
1777
+ protected membersFor(key: string): string[];
1778
+ /** "(Select All)" is fully checked when no filter narrows the field. */
1779
+ protected allSelected(key: string): boolean;
1780
+ /** Indeterminate when some — but not all — members are included. */
1781
+ protected partiallySelected(key: string): boolean;
1782
+ protected memberChecked(key: string, member: string): boolean;
1783
+ protected toggleMember(key: string, member: string): void;
1784
+ protected setAllMembers(key: string, checked: boolean): void;
1785
+ private setIncluded;
1786
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PivotFieldPane, never>;
1787
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PivotFieldPane, "bpx-pivot-field-pane", ["bpxPivotFieldPane"], { "fields": { "alias": "fields"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; }, { "config": "configChange"; }, never, never, true, never>;
1788
+ }
1789
+
1790
+ /** A single command in the palette. */
1791
+ interface BpxCommand {
1792
+ id: string;
1793
+ label: string;
1794
+ /** Short trailing hint, e.g. a shortcut or category. */
1795
+ hint?: string;
1796
+ icon?: string;
1797
+ /** Extra text matched by the search (synonyms, category…). */
1798
+ keywords?: string;
1799
+ run?: () => void;
1800
+ }
1801
+ /**
1802
+ * A ⌘K-style command palette: a centered overlay with fuzzy(ish) search and
1803
+ * keyboard-driven results. Toggle with `[(open)]` or the built-in ⌘K / Ctrl+K.
1804
+ *
1805
+ * ```html
1806
+ * <bpx-command-palette [(open)]="open" [commands]="commands" (run)="handle($event)" />
1807
+ * ```
1808
+ */
1809
+ declare class CommandPalette {
1810
+ readonly open: _angular_core.ModelSignal<boolean>;
1811
+ readonly commands: _angular_core.InputSignal<BpxCommand[]>;
1812
+ readonly placeholder: _angular_core.InputSignal<string>;
1813
+ /** Enable the built-in ⌘K / Ctrl+K toggle. */
1814
+ readonly hotkey: _angular_core.InputSignalWithTransform<boolean, unknown>;
1815
+ readonly run: _angular_core.OutputEmitterRef<BpxCommand>;
1816
+ protected readonly query: _angular_core.ModelSignal<string>;
1817
+ protected readonly activeIndex: _angular_core.ModelSignal<number>;
1818
+ protected readonly filtered: _angular_core.Signal<BpxCommand[]>;
1819
+ private readonly baseId;
1820
+ protected readonly listId: string;
1821
+ private readonly tpl;
1822
+ private readonly overlay;
1823
+ private readonly vcr;
1824
+ private readonly isBrowser;
1825
+ private overlayRef?;
1826
+ constructor();
1827
+ protected onHotkey(event: Event): void;
1828
+ protected onSearch(event: Event): void;
1829
+ protected onKeydown(event: KeyboardEvent): void;
1830
+ protected select(cmd: BpxCommand): void;
1831
+ protected optionId(index: number): string;
1832
+ private close;
1833
+ private attach;
1834
+ private detach;
1835
+ private ensureOverlay;
1836
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CommandPalette, never>;
1837
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CommandPalette, "bpx-command-palette", ["bpxCommandPalette"], { "open": { "alias": "open"; "required": false; "isSignal": true; }; "commands": { "alias": "commands"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hotkey": { "alias": "hotkey"; "required": false; "isSignal": true; }; "query": { "alias": "query"; "required": false; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "run": "run"; "query": "queryChange"; "activeIndex": "activeIndexChange"; }, never, never, true, never>;
1838
+ }
1839
+
1840
+ /**
1841
+ * A floating panel of arbitrary content, opened by `[bpxPopoverTriggerFor]`.
1842
+ * Renders nothing inline until opened.
1843
+ *
1844
+ * ```html
1845
+ * <button bpx-button [bpxPopoverTriggerFor]="pop">Filters</button>
1846
+ * <bpx-popover #pop>…any content…</bpx-popover>
1847
+ * ```
1848
+ */
1849
+ declare class Popover {
1850
+ readonly template: _angular_core.Signal<TemplateRef<any>>;
1851
+ readonly closed: _angular_core.OutputEmitterRef<void>;
1852
+ close(): void;
1853
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Popover, never>;
1854
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Popover, "bpx-popover", ["bpxPopover"], {}, { "closed": "closed"; }, never, ["*"], true, never>;
1855
+ }
1856
+
1857
+ /** Opens a `<bpx-popover>` from the element it's placed on. */
1858
+ declare class PopoverTrigger {
1859
+ readonly popover: _angular_core.InputSignal<Popover>;
1860
+ private readonly overlay;
1861
+ private readonly el;
1862
+ private readonly vcr;
1863
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
1864
+ private overlayRef?;
1865
+ private closedSub?;
1866
+ constructor();
1867
+ protected toggle(): void;
1868
+ private open;
1869
+ private close;
1870
+ private ensureOverlay;
1871
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PopoverTrigger, never>;
1872
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PopoverTrigger, "[bpxPopoverTriggerFor]", ["bpxPopoverTrigger"], { "popover": { "alias": "bpxPopoverTriggerFor"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1873
+ }
1874
+
1875
+ type BpxDrawerSide = 'left' | 'right' | 'top' | 'bottom';
1876
+ /**
1877
+ * A panel that slides in from an edge of the viewport. CDK-overlay backed with
1878
+ * focus trap and scroll lock; controlled with `[(open)]`.
1879
+ *
1880
+ * ```html
1881
+ * <button bpx-button (click)="open.set(true)">Open</button>
1882
+ * <bpx-drawer [(open)]="open" side="right" title="Filters">…</bpx-drawer>
1883
+ * ```
1884
+ */
1885
+ declare class Drawer {
1886
+ readonly open: _angular_core.ModelSignal<boolean>;
1887
+ readonly side: _angular_core.InputSignal<BpxDrawerSide>;
1888
+ readonly title: _angular_core.InputSignal<string>;
1889
+ readonly ariaLabel: _angular_core.InputSignal<string>;
1890
+ readonly disableClose: _angular_core.InputSignalWithTransform<boolean, unknown>;
1891
+ protected readonly titleId: string;
1892
+ private readonly tpl;
1893
+ private readonly overlay;
1894
+ private readonly vcr;
1895
+ private readonly isBrowser;
1896
+ private overlayRef?;
1897
+ constructor();
1898
+ protected close(): void;
1899
+ private attach;
1900
+ private detach;
1901
+ private ensureOverlay;
1902
+ private positionFor;
1903
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Drawer, never>;
1904
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Drawer, "bpx-drawer", ["bpxDrawer"], { "open": { "alias": "open"; "required": false; "isSignal": true; }; "side": { "alias": "side"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "disableClose": { "alias": "disableClose"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*", "[bpxDrawerFooter]"], true, never>;
1905
+ }
1906
+
1907
+ interface BpxBreadcrumb {
1908
+ label: string;
1909
+ /** Optional href — renders an anchor. Omit to render a button that emits `(navigate)`. */
1910
+ href?: string;
1911
+ icon?: string;
1912
+ }
1913
+ /**
1914
+ * A breadcrumb trail. The last item is rendered as the current page.
1915
+ *
1916
+ * ```html
1917
+ * <bpx-breadcrumbs [items]="crumbs" (navigate)="go($event)" />
1918
+ * ```
1919
+ */
1920
+ declare class Breadcrumbs {
1921
+ readonly items: _angular_core.InputSignal<BpxBreadcrumb[]>;
1922
+ readonly navigate: _angular_core.OutputEmitterRef<BpxBreadcrumb>;
1923
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Breadcrumbs, never>;
1924
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Breadcrumbs, "bpx-breadcrumbs", ["bpxBreadcrumbs"], { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "navigate": "navigate"; }, never, never, true, never>;
1925
+ }
1926
+
1927
+ /**
1928
+ * A single step within `<bpx-stepper>`. Its content shows only while active.
1929
+ */
1930
+ declare class Step {
1931
+ readonly label: _angular_core.InputSignal<string>;
1932
+ readonly active: _angular_core.WritableSignal<boolean>;
1933
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Step, never>;
1934
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Step, "bpx-step", ["bpxStep"], { "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1935
+ }
1936
+
1937
+ /**
1938
+ * A stepped process indicator with numbered markers, completed check-marks, and
1939
+ * an active step panel. Compose from `<bpx-step>` children; `[(activeIndex)]`
1940
+ * controls the current step.
1941
+ *
1942
+ * ```html
1943
+ * <bpx-stepper [(activeIndex)]="step">
1944
+ * <bpx-step label="Account">…</bpx-step>
1945
+ * <bpx-step label="Profile">…</bpx-step>
1946
+ * <bpx-step label="Done">…</bpx-step>
1947
+ * </bpx-stepper>
1948
+ * ```
1949
+ */
1950
+ declare class Stepper {
1951
+ readonly steps: _angular_core.Signal<readonly Step[]>;
1952
+ readonly activeIndex: _angular_core.ModelSignal<number>;
1953
+ /** When true, steps can't be jumped to by clicking their header. */
1954
+ readonly linear: _angular_core.InputSignal<boolean>;
1955
+ constructor();
1956
+ protected select(index: number): void;
1957
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Stepper, never>;
1958
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Stepper, "bpx-stepper", ["bpxStepper"], { "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "linear": { "alias": "linear"; "required": false; "isSignal": true; }; }, { "activeIndex": "activeIndexChange"; }, ["steps"], ["*"], true, never>;
1959
+ }
1960
+
1961
+ /**
1962
+ * A compact single-select control — a row of segments where one is active.
1963
+ * Works standalone with `[(value)]` and as a form control. Arrow keys move the
1964
+ * selection.
1965
+ *
1966
+ * ```html
1967
+ * <bpx-segmented [options]="views" [(value)]="view" />
1968
+ * ```
1969
+ */
1970
+ declare class Segmented<T = string> {
1971
+ readonly options: _angular_core.InputSignal<BpxOption<T>[]>;
1972
+ readonly value: _angular_core.ModelSignal<T | null>;
1973
+ readonly size: _angular_core.InputSignal<"sm" | "md">;
1974
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
1975
+ private readonly cvaDisabled;
1976
+ protected readonly disabled: _angular_core.Signal<boolean>;
1977
+ private readonly el;
1978
+ private onChange;
1979
+ protected onTouched: () => void;
1980
+ protected select(option: BpxOption<T>): void;
1981
+ protected onKeydown(event: KeyboardEvent): void;
1982
+ protected tabindex(option: BpxOption<T>): number;
1983
+ writeValue(value: T | null): void;
1984
+ registerOnChange(fn: (value: T | null) => void): void;
1985
+ registerOnTouched(fn: () => void): void;
1986
+ setDisabledState(isDisabled: boolean): void;
1987
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Segmented<any>, never>;
1988
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Segmented<any>, "bpx-segmented", ["bpxSegmented"], { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
1989
+ }
1990
+
1991
+ /** Which grid the calendar is currently showing. */
1992
+ type CalendarView = 'days' | 'months' | 'years';
1993
+ /**
1994
+ * A calendar with day, month and year views. Usable on its own with `[(value)]`,
1995
+ * and used by `bpx-date-picker` as the popup body. Click the header label to
1996
+ * zoom out (day → month → year) and jump across time without paging one month
1997
+ * at a time. Fully keyboard operable in every view: arrows move within the grid,
1998
+ * Home/End jump to the period edges, PageUp/PageDown step by the larger unit,
1999
+ * Enter/Space select or drill in, Escape steps back out.
2000
+ *
2001
+ * ```html
2002
+ * <bpx-calendar [(value)]="date" [min]="today" />
2003
+ * ```
2004
+ */
2005
+ declare class Calendar {
2006
+ /** The selected date. Two-way bindable via `[(value)]`. */
2007
+ readonly value: _angular_core.ModelSignal<Date | null>;
2008
+ /** Earliest selectable day (inclusive). */
2009
+ readonly min: _angular_core.InputSignal<Date | null>;
2010
+ /** Latest selectable day (inclusive). */
2011
+ readonly max: _angular_core.InputSignal<Date | null>;
2012
+ /** Extra predicate to disable individual days (holidays, weekends, …). */
2013
+ readonly dateDisabled: _angular_core.InputSignal<((date: Date) => boolean) | null>;
2014
+ /** First column of the week: 0 = Sunday (default), 1 = Monday. */
2015
+ readonly weekStartsOn: _angular_core.InputSignal<0 | 1>;
2016
+ /** BCP-47 locale for month and weekday names. Defaults to the runtime locale. */
2017
+ readonly locale: _angular_core.InputSignal<string | undefined>;
2018
+ /** Move DOM focus to the active cell once rendered (used when opened in a popup). */
2019
+ readonly autoFocus: _angular_core.InputSignalWithTransform<boolean, unknown>;
2020
+ /** Fires when a day is chosen (also updates `value`). */
2021
+ readonly dateSelected: _angular_core.OutputEmitterRef<Date>;
2022
+ /** Fires on Escape from the day view — lets a host popup close itself. */
2023
+ readonly escaped: _angular_core.OutputEmitterRef<void>;
2024
+ private readonly today;
2025
+ protected readonly view: _angular_core.WritableSignal<CalendarView>;
2026
+ /** First-of-month anchoring the currently shown period. */
2027
+ protected readonly viewDate: _angular_core.WritableSignal<Date>;
2028
+ /** The cell that owns the roving tabindex / keyboard focus. */
2029
+ protected readonly focusedDate: _angular_core.WritableSignal<Date>;
2030
+ private readonly cells;
2031
+ /** Set right before a keyboard/drill move so the effect knows to grab focus. */
2032
+ private pendingFocus;
2033
+ constructor();
2034
+ /** Six weeks of seven days covering the visible month (plus spill-over days). */
2035
+ protected readonly weeks: _angular_core.Signal<Date[][]>;
2036
+ protected readonly weekdays: _angular_core.Signal<string[]>;
2037
+ /** The 12 months of the visible year, in rows of three. */
2038
+ protected readonly monthRows: _angular_core.Signal<Date[][]>;
2039
+ /** A 12-year window around the visible decade (one padding year each end). */
2040
+ protected readonly yearRows: _angular_core.Signal<Date[][]>;
2041
+ protected readonly headerLabel: _angular_core.Signal<string>;
2042
+ /** The larger period is empty within range → hide the way there. */
2043
+ protected readonly canPrev: _angular_core.Signal<boolean>;
2044
+ protected readonly canNext: _angular_core.Signal<boolean>;
2045
+ protected readonly focusKey: _angular_core.Signal<string>;
2046
+ protected dayKey(d: Date): string;
2047
+ protected monthKey(d: Date): string;
2048
+ protected yearKey(d: Date): string;
2049
+ protected isSelected(d: Date): boolean;
2050
+ protected isToday(d: Date): boolean;
2051
+ protected isOutsideMonth(d: Date): boolean;
2052
+ protected isDisabled(d: Date): boolean;
2053
+ protected isMonthSelected(d: Date): boolean;
2054
+ protected isMonthCurrent(d: Date): boolean;
2055
+ protected isMonthDisabled(d: Date): boolean;
2056
+ protected isYearSelected(d: Date): boolean;
2057
+ protected isYearCurrent(d: Date): boolean;
2058
+ protected isYearOutside(d: Date): boolean;
2059
+ protected isYearDisabled(d: Date): boolean;
2060
+ protected monthName(d: Date): string;
2061
+ /** Page the visible period by the header arrows (month / year / decade). */
2062
+ protected step(dir: 1 | -1): void;
2063
+ private shiftFocusAndView;
2064
+ /** Zoom out one level: day → month → year. */
2065
+ protected drillUp(): void;
2066
+ private setView;
2067
+ protected selectDate(d: Date): void;
2068
+ /** Choose a month → drop into its day view. */
2069
+ protected pickMonth(cell: Date): void;
2070
+ /** Choose a year → drop into its month view. */
2071
+ protected pickYear(cell: Date): void;
2072
+ protected onKeydown(event: KeyboardEvent): void;
2073
+ private onEnter;
2074
+ /** Compute the next focus target for an arrow/Home/End/Page key, per view. */
2075
+ private nextFocus;
2076
+ private moveFocus;
2077
+ /** Bring the visible period into line with the focused cell after a move. */
2078
+ private syncViewToFocus;
2079
+ /** Move DOM focus onto the currently focused cell (used on popup open). */
2080
+ focusActiveCell(): void;
2081
+ private decadeStart;
2082
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Calendar, never>;
2083
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Calendar, "bpx-calendar", ["bpxCalendar"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateDisabled": { "alias": "dateDisabled"; "required": false; "isSignal": true; }; "weekStartsOn": { "alias": "weekStartsOn"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "autoFocus": { "alias": "autoFocus"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "dateSelected": "dateSelected"; "escaped": "escaped"; }, never, never, true, never>;
2084
+ }
2085
+
2086
+ /**
2087
+ * A date field that opens a `bpx-calendar` in a CDK overlay. Works standalone
2088
+ * with `[(value)]` and as a form control via `formControlName` / `[(ngModel)]`.
2089
+ * The displayed text is formatted with `Intl.DateTimeFormat` — control it with
2090
+ * `[displayFormat]` and `[locale]`.
2091
+ *
2092
+ * ```html
2093
+ * <bpx-date-picker [(value)]="date" [min]="today" clearable />
2094
+ * <bpx-date-picker formControlName="dob" [displayFormat]="{ dateStyle: 'full' }" />
2095
+ * ```
2096
+ */
2097
+ declare class DatePicker implements ControlValueAccessor {
2098
+ /** The selected date. Two-way bindable via `[(value)]`. */
2099
+ readonly value: _angular_core.ModelSignal<Date | null>;
2100
+ readonly placeholder: _angular_core.InputSignal<string>;
2101
+ readonly size: _angular_core.InputSignal<BpxSize>;
2102
+ /** Earliest selectable day (inclusive). */
2103
+ readonly min: _angular_core.InputSignal<Date | null>;
2104
+ /** Latest selectable day (inclusive). */
2105
+ readonly max: _angular_core.InputSignal<Date | null>;
2106
+ /** Extra predicate to disable individual days. */
2107
+ readonly dateDisabled: _angular_core.InputSignal<((date: Date) => boolean) | null>;
2108
+ /** First column of the week: 0 = Sunday (default), 1 = Monday. */
2109
+ readonly weekStartsOn: _angular_core.InputSignal<0 | 1>;
2110
+ /** `Intl.DateTimeFormat` options for the field's displayed text. */
2111
+ readonly displayFormat: _angular_core.InputSignal<Intl.DateTimeFormatOptions>;
2112
+ /** BCP-47 locale for the field text and calendar labels. */
2113
+ readonly locale: _angular_core.InputSignal<string | undefined>;
2114
+ /** Show a clear button while a date is set. */
2115
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
2116
+ /** Error styling + `aria-invalid`. */
2117
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
2118
+ readonly ariaLabel: _angular_core.InputSignal<string>;
2119
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
2120
+ private readonly cvaDisabled;
2121
+ protected readonly disabled: _angular_core.Signal<boolean>;
2122
+ protected readonly open: _angular_core.WritableSignal<boolean>;
2123
+ protected readonly positions: _angular_cdk_overlay.ConnectedPosition[];
2124
+ protected readonly displayValue: _angular_core.Signal<string>;
2125
+ private onChange;
2126
+ protected onTouched: () => void;
2127
+ protected toggle(trigger: HTMLElement): void;
2128
+ protected openPanel(): void;
2129
+ protected close(returnFocusTo?: HTMLElement): void;
2130
+ protected onSelect(date: Date, trigger: HTMLElement): void;
2131
+ protected clear(event: Event): void;
2132
+ protected onTriggerKeydown(event: KeyboardEvent, trigger: HTMLElement): void;
2133
+ writeValue(value: Date | null): void;
2134
+ registerOnChange(fn: (value: Date | null) => void): void;
2135
+ registerOnTouched(fn: () => void): void;
2136
+ setDisabledState(isDisabled: boolean): void;
2137
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatePicker, never>;
2138
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatePicker, "bpx-date-picker", ["bpxDatePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateDisabled": { "alias": "dateDisabled"; "required": false; "isSignal": true; }; "weekStartsOn": { "alias": "weekStartsOn"; "required": false; "isSignal": true; }; "displayFormat": { "alias": "displayFormat"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
2139
+ }
2140
+
2141
+ /**
2142
+ * A card whose surface lights up with a radial glow that follows the cursor.
2143
+ *
2144
+ * ```html
2145
+ * <bpx-spotlight-card>…content…</bpx-spotlight-card>
2146
+ * <bpx-spotlight-card color="var(--bpx-color-info)" [size]="320">…</bpx-spotlight-card>
2147
+ * ```
2148
+ */
2149
+ declare class SpotlightCard {
2150
+ private readonly el;
2151
+ /** Diameter of the glow in px. */
2152
+ readonly size: _angular_core.InputSignal<number>;
2153
+ /** Glow color (any CSS color / token). */
2154
+ readonly color: _angular_core.InputSignal<string>;
2155
+ protected onMove(event: PointerEvent): void;
2156
+ protected onLeave(): void;
2157
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpotlightCard, never>;
2158
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpotlightCard, "bpx-spotlight-card", ["bpxSpotlightCard"], { "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2159
+ }
2160
+
2161
+ /**
2162
+ * A card that tilts in 3D toward the pointer, with an optional moving glare.
2163
+ *
2164
+ * ```html
2165
+ * <bpx-tilt-card>…content…</bpx-tilt-card>
2166
+ * <bpx-tilt-card [max]="18" [glare]="false">…</bpx-tilt-card>
2167
+ * ```
2168
+ */
2169
+ declare class TiltCard {
2170
+ private readonly el;
2171
+ /** Maximum tilt in degrees. */
2172
+ readonly max: _angular_core.InputSignal<number>;
2173
+ /** Show the moving glare highlight. */
2174
+ readonly glare: _angular_core.InputSignalWithTransform<boolean, unknown>;
2175
+ protected onMove(event: PointerEvent): void;
2176
+ protected onLeave(): void;
2177
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TiltCard, never>;
2178
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TiltCard, "bpx-tilt-card", ["bpxTiltCard"], { "max": { "alias": "max"; "required": false; "isSignal": true; }; "glare": { "alias": "glare"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2179
+ }
2180
+
2181
+ /**
2182
+ * Text with an animated gradient sweep.
2183
+ *
2184
+ * ```html
2185
+ * <bpx-gradient-text>BlueprintX</bpx-gradient-text>
2186
+ * <bpx-gradient-text from="#f43f5e" via="#a855f7" to="#22d3ee" [speed]="6">Custom</bpx-gradient-text>
2187
+ * ```
2188
+ */
2189
+ declare class GradientText {
2190
+ readonly from: _angular_core.InputSignal<string>;
2191
+ readonly via: _angular_core.InputSignal<string>;
2192
+ readonly to: _angular_core.InputSignal<string>;
2193
+ /** Animation duration in seconds. */
2194
+ readonly speed: _angular_core.InputSignal<number>;
2195
+ protected readonly gradient: _angular_core.Signal<string>;
2196
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GradientText, never>;
2197
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GradientText, "bpx-gradient-text", ["bpxGradientText"], { "from": { "alias": "from"; "required": false; "isSignal": true; }; "via": { "alias": "via"; "required": false; "isSignal": true; }; "to": { "alias": "to"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2198
+ }
2199
+
2200
+ /**
2201
+ * Text with a shimmering light band that sweeps across the glyphs.
2202
+ *
2203
+ * ```html
2204
+ * <bpx-shiny-text>Just shipped</bpx-shiny-text>
2205
+ * <bpx-shiny-text base="#94a3b8" [speed]="4">Loading…</bpx-shiny-text>
2206
+ * ```
2207
+ */
2208
+ declare class ShinyText {
2209
+ /** Base (dim) text color. */
2210
+ readonly base: _angular_core.InputSignal<string>;
2211
+ /** Sweep duration in seconds. */
2212
+ readonly speed: _angular_core.InputSignal<number>;
2213
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShinyText, never>;
2214
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShinyText, "bpx-shiny-text", ["bpxShinyText"], { "base": { "alias": "base"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2215
+ }
2216
+
2217
+ /**
2218
+ * Wraps content in a card with an animated gradient "beam" traveling around
2219
+ * the border.
2220
+ *
2221
+ * ```html
2222
+ * <bpx-border-beam>…content…</bpx-border-beam>
2223
+ * <bpx-border-beam color="var(--bpx-color-success)" [speed]="3">…</bpx-border-beam>
2224
+ * ```
2225
+ */
2226
+ declare class BorderBeam {
2227
+ /** Beam color. */
2228
+ readonly color: _angular_core.InputSignal<string>;
2229
+ /** Rotation duration in seconds. */
2230
+ readonly speed: _angular_core.InputSignal<number>;
2231
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BorderBeam, never>;
2232
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BorderBeam, "bpx-border-beam", ["bpxBorderBeam"], { "color": { "alias": "color"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2233
+ }
2234
+
2235
+ /**
2236
+ * Makes any element magnetic: it's gently pulled toward the pointer while
2237
+ * hovering and springs back on leave.
2238
+ *
2239
+ * ```html
2240
+ * <button bpx-button bpxMagnetic>Hover me</button>
2241
+ * <div bpxMagnetic [magnetStrength]="0.5">…</div>
2242
+ * ```
2243
+ */
2244
+ declare class Magnetic {
2245
+ private readonly el;
2246
+ /** How strongly the element follows the pointer (0–1). */
2247
+ readonly strength: _angular_core.InputSignal<number>;
2248
+ protected readonly tx: _angular_core.WritableSignal<number>;
2249
+ protected readonly ty: _angular_core.WritableSignal<number>;
2250
+ protected readonly active: _angular_core.WritableSignal<boolean>;
2251
+ protected onMove(event: PointerEvent): void;
2252
+ protected onLeave(): void;
2253
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Magnetic, never>;
2254
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Magnetic, "[bpxMagnetic]", never, { "strength": { "alias": "magnetStrength"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2255
+ }
2256
+
2257
+ /**
2258
+ * Emits a burst of little sparks from the point of a click.
2259
+ *
2260
+ * ```html
2261
+ * <button bpx-button bpxClickSpark>Click me</button>
2262
+ * <div bpxClickSpark sparkColor="var(--bpx-color-success)" [sparkCount]="12">…</div>
2263
+ * ```
2264
+ */
2265
+ declare class ClickSpark {
2266
+ private readonly el;
2267
+ private readonly renderer;
2268
+ private readonly doc;
2269
+ readonly color: _angular_core.InputSignal<string>;
2270
+ readonly count: _angular_core.InputSignal<number>;
2271
+ readonly radius: _angular_core.InputSignal<number>;
2272
+ /**
2273
+ * Scatter radius (px) for where each spark is *born*. `0` spawns every spark
2274
+ * exactly at the cursor; larger values pick a random origin within this radius
2275
+ * of the click, so the burst looks like it erupts from an area, not a point.
2276
+ */
2277
+ readonly spread: _angular_core.InputSignal<number>;
2278
+ constructor();
2279
+ protected spark(event: MouseEvent): void;
2280
+ private ensureStyles;
2281
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ClickSpark, never>;
2282
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ClickSpark, "[bpxClickSpark]", never, { "color": { "alias": "sparkColor"; "required": false; "isSignal": true; }; "count": { "alias": "sparkCount"; "required": false; "isSignal": true; }; "radius": { "alias": "sparkRadius"; "required": false; "isSignal": true; }; "spread": { "alias": "sparkSpread"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2283
+ }
2284
+
2285
+ /**
2286
+ * A material-style ripple that expands from the pointer on press. Adds
2287
+ * `position: relative` + `overflow: hidden` to its host.
2288
+ *
2289
+ * ```html
2290
+ * <button bpx-button bpxRipple>Click</button>
2291
+ * <div bpxRipple bpxRippleColor="var(--bpx-color-primary)">…</div>
2292
+ * ```
2293
+ */
2294
+ declare class Ripple {
2295
+ private readonly el;
2296
+ private readonly renderer;
2297
+ private readonly doc;
2298
+ readonly color: _angular_core.InputSignal<string>;
2299
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
2300
+ protected spawn(event: PointerEvent): void;
2301
+ private ensureStyles;
2302
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Ripple, never>;
2303
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Ripple, "[bpxRipple]", never, { "color": { "alias": "bpxRippleColor"; "required": false; "isSignal": true; }; "disabled": { "alias": "bpxRippleDisabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2304
+ }
2305
+
2306
+ /**
2307
+ * Animates a number from `from` to `to` with an ease-out curve.
2308
+ *
2309
+ * ```html
2310
+ * <bpx-count-up [to]="1284" suffix="+" />
2311
+ * <bpx-count-up [to]="99.9" [decimals]="1" suffix="%" />
2312
+ * ```
2313
+ */
2314
+ declare class CountUp {
2315
+ readonly to: _angular_core.InputSignal<number>;
2316
+ readonly from: _angular_core.InputSignal<number>;
2317
+ readonly duration: _angular_core.InputSignal<number>;
2318
+ readonly decimals: _angular_core.InputSignal<number>;
2319
+ readonly prefix: _angular_core.InputSignal<string>;
2320
+ readonly suffix: _angular_core.InputSignal<string>;
2321
+ private readonly doc;
2322
+ private readonly isBrowser;
2323
+ private readonly current;
2324
+ private raf?;
2325
+ protected readonly display: _angular_core.Signal<string>;
2326
+ constructor();
2327
+ private animate;
2328
+ private cancel;
2329
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CountUp, never>;
2330
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CountUp, "bpx-count-up", ["bpxCountUp"], { "to": { "alias": "to"; "required": true; "isSignal": true; }; "from": { "alias": "from"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "decimals": { "alias": "decimals"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2331
+ }
2332
+
2333
+ /**
2334
+ * Types out text one character at a time with a blinking cursor.
2335
+ *
2336
+ * ```html
2337
+ * <bpx-typewriter text="Ship faster with BlueprintX." />
2338
+ * <bpx-typewriter text="Hello" [speed]="90" />
2339
+ * ```
2340
+ */
2341
+ declare class Typewriter {
2342
+ readonly text: _angular_core.InputSignal<string>;
2343
+ /** Milliseconds per character. */
2344
+ readonly speed: _angular_core.InputSignal<number>;
2345
+ /** Delay before typing starts, in ms. */
2346
+ readonly startDelay: _angular_core.InputSignal<number>;
2347
+ private readonly isBrowser;
2348
+ protected readonly shown: _angular_core.WritableSignal<string>;
2349
+ protected readonly finished: _angular_core.Signal<boolean>;
2350
+ private timer?;
2351
+ constructor();
2352
+ private start;
2353
+ private clear;
2354
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Typewriter, never>;
2355
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Typewriter, "bpx-typewriter", ["bpxTypewriter"], { "text": { "alias": "text"; "required": true; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; "startDelay": { "alias": "startDelay"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2356
+ }
2357
+
2358
+ /**
2359
+ * Seamlessly scrolls its projected content on a loop. Pauses on hover.
2360
+ *
2361
+ * ```html
2362
+ * <bpx-marquee [speed]="24">
2363
+ * <span>Ship faster</span><span>Design tokens</span><span>Accessible</span>
2364
+ * </bpx-marquee>
2365
+ * ```
2366
+ */
2367
+ declare class Marquee {
2368
+ /** Seconds for one full loop. */
2369
+ readonly speed: _angular_core.InputSignal<number>;
2370
+ readonly direction: _angular_core.InputSignal<"left" | "right">;
2371
+ private readonly group;
2372
+ constructor();
2373
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Marquee, never>;
2374
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Marquee, "bpx-marquee", ["bpxMarquee"], { "speed": { "alias": "speed"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2375
+ }
2376
+
2377
+ /**
2378
+ * An animated aurora backdrop — soft drifting color blobs behind your content.
2379
+ *
2380
+ * ```html
2381
+ * <bpx-aurora>
2382
+ * <h1>BlueprintX</h1>
2383
+ * </bpx-aurora>
2384
+ * ```
2385
+ */
2386
+ declare class Aurora {
2387
+ readonly color1: _angular_core.InputSignal<string>;
2388
+ readonly color2: _angular_core.InputSignal<string>;
2389
+ readonly color3: _angular_core.InputSignal<string>;
2390
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Aurora, never>;
2391
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Aurora, "bpx-aurora", ["bpxAurora"], { "color1": { "alias": "color1"; "required": false; "isSignal": true; }; "color2": { "alias": "color2"; "required": false; "isSignal": true; }; "color3": { "alias": "color3"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2392
+ }
2393
+
2394
+ /**
2395
+ * Wraps content in a glowing, lightning-like animated border. The edge is
2396
+ * distorted by an animated SVG turbulence + displacement filter, with layered
2397
+ * blur for the neon glow.
2398
+ *
2399
+ * ```html
2400
+ * <bpx-electric-border color="#5eb3ff">
2401
+ * <div style="padding: 2rem">Charged up</div>
2402
+ * </bpx-electric-border>
2403
+ * ```
2404
+ */
2405
+ declare class ElectricBorder {
2406
+ /** Bolt / glow color. */
2407
+ readonly color: _angular_core.InputSignal<string>;
2408
+ /** Seconds for one flow cycle (lower = faster crackle). */
2409
+ readonly speed: _angular_core.InputSignal<number>;
2410
+ /** Border thickness in px. */
2411
+ readonly thickness: _angular_core.InputSignal<number>;
2412
+ /** Displacement strength — how wild the lightning wobble is. */
2413
+ readonly intensity: _angular_core.InputSignal<number>;
2414
+ /** Corner radius (any CSS length). */
2415
+ readonly radius: _angular_core.InputSignal<string>;
2416
+ /** Unique so multiple instances don't share one SVG filter. */
2417
+ protected readonly filterId: string;
2418
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElectricBorder, never>;
2419
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElectricBorder, "bpx-electric-border", ["bpxElectricBorder"], { "color": { "alias": "color"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; "thickness": { "alias": "thickness"; "required": false; "isSignal": true; }; "intensity": { "alias": "intensity"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2420
+ }
2421
+
2422
+ /**
2423
+ * An interactive particle-network backdrop: drifting dots linked by lines, with
2424
+ * the lines reaching toward the cursor. Project your content on top.
2425
+ *
2426
+ * ```html
2427
+ * <bpx-particles color="#6366f1">
2428
+ * <h1>BlueprintX</h1>
2429
+ * </bpx-particles>
2430
+ * ```
2431
+ */
2432
+ declare class Particles {
2433
+ /** Number of particles. */
2434
+ readonly count: _angular_core.InputSignalWithTransform<number, unknown>;
2435
+ /** Dot color. */
2436
+ readonly color: _angular_core.InputSignal<string>;
2437
+ /** Line color; defaults to the dot color. */
2438
+ readonly linkColor: _angular_core.InputSignal<string>;
2439
+ /** Drift speed (px per frame, roughly). */
2440
+ readonly speed: _angular_core.InputSignalWithTransform<number, unknown>;
2441
+ /** Max distance at which two dots (or a dot and the cursor) are linked. */
2442
+ readonly linkDistance: _angular_core.InputSignalWithTransform<number, unknown>;
2443
+ /** Dot radius in px. */
2444
+ readonly radius: _angular_core.InputSignalWithTransform<number, unknown>;
2445
+ /** Link dots to the cursor on hover. */
2446
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
2447
+ private readonly canvasRef;
2448
+ private readonly host;
2449
+ private readonly isBrowser;
2450
+ private ctx;
2451
+ private dots;
2452
+ private raf;
2453
+ private ro?;
2454
+ private readonly pointer;
2455
+ constructor();
2456
+ private start;
2457
+ private stop;
2458
+ private resize;
2459
+ private seed;
2460
+ private loop;
2461
+ private draw;
2462
+ protected onMove(event: PointerEvent): void;
2463
+ protected onLeave(): void;
2464
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Particles, never>;
2465
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Particles, "bpx-particles", ["bpxParticles"], { "count": { "alias": "count"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "linkColor": { "alias": "linkColor"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; "linkDistance": { "alias": "linkDistance"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2466
+ }
2467
+
2468
+ /**
2469
+ * A dotted-grid backdrop with an accent glow that follows the cursor — the dots
2470
+ * near the pointer light up. Project your content on top.
2471
+ *
2472
+ * ```html
2473
+ * <bpx-dot-grid accentColor="#6366f1">
2474
+ * <h1>BlueprintX</h1>
2475
+ * </bpx-dot-grid>
2476
+ * ```
2477
+ */
2478
+ declare class DotGrid {
2479
+ /** Spacing between dots, in px. */
2480
+ readonly gap: _angular_core.InputSignalWithTransform<number, unknown>;
2481
+ /** Base dot color. Defaults to a theme-aware subtle tint of the text color. */
2482
+ readonly dotColor: _angular_core.InputSignal<string>;
2483
+ /** Color of the dots lit under the cursor. */
2484
+ readonly accentColor: _angular_core.InputSignal<string>;
2485
+ /** Radius of the cursor spotlight, in px. */
2486
+ readonly spotlightRadius: _angular_core.InputSignalWithTransform<number, unknown>;
2487
+ /** Light up dots under the cursor. When off, the grid is static. */
2488
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
2489
+ private readonly host;
2490
+ protected onMove(event: PointerEvent): void;
2491
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DotGrid, never>;
2492
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DotGrid, "bpx-dot-grid", ["bpxDotGrid"], { "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "dotColor": { "alias": "dotColor"; "required": false; "isSignal": true; }; "accentColor": { "alias": "accentColor"; "required": false; "isSignal": true; }; "spotlightRadius": { "alias": "spotlightRadius"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2493
+ }
2494
+
2495
+ interface MeteorStyle {
2496
+ left: string;
2497
+ delay: string;
2498
+ duration: string;
2499
+ }
2500
+ /**
2501
+ * A shower of shooting-star meteors streaking across the backdrop. Project your
2502
+ * content on top.
2503
+ *
2504
+ * ```html
2505
+ * <bpx-meteors [count]="24" color="#a5b4fc">
2506
+ * <h1>BlueprintX</h1>
2507
+ * </bpx-meteors>
2508
+ * ```
2509
+ */
2510
+ declare class Meteors {
2511
+ /** Number of meteors. */
2512
+ readonly count: _angular_core.InputSignalWithTransform<number, unknown>;
2513
+ /** Meteor and trail color. */
2514
+ readonly color: _angular_core.InputSignal<string>;
2515
+ protected readonly meteors: _angular_core.Signal<MeteorStyle[]>;
2516
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Meteors, never>;
2517
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Meteors, "bpx-meteors", ["bpxMeteors"], { "count": { "alias": "count"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2518
+ }
2519
+
2520
+ /**
2521
+ * A synthwave-style perspective grid that scrolls toward the horizon. Project
2522
+ * your content on top.
2523
+ *
2524
+ * ```html
2525
+ * <bpx-retro-grid color="#6366f1">
2526
+ * <h1>BlueprintX</h1>
2527
+ * </bpx-retro-grid>
2528
+ * ```
2529
+ */
2530
+ declare class RetroGrid {
2531
+ /** Grid line color. */
2532
+ readonly color: _angular_core.InputSignal<string>;
2533
+ /** Seconds for one full scroll cycle (lower = faster). */
2534
+ readonly speed: _angular_core.InputSignalWithTransform<number, unknown>;
2535
+ /** Grid cell size in px. */
2536
+ readonly cellSize: _angular_core.InputSignalWithTransform<number, unknown>;
2537
+ protected readonly speedS: _angular_core.Signal<string>;
2538
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RetroGrid, never>;
2539
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RetroGrid, "bpx-retro-grid", ["bpxRetroGrid"], { "color": { "alias": "color"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; "cellSize": { "alias": "cellSize"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2540
+ }
2541
+
2542
+ /**
2543
+ * A soft, slowly shifting multi-color mesh gradient — a lively backdrop for
2544
+ * heroes and cards. Project your content on top.
2545
+ *
2546
+ * ```html
2547
+ * <bpx-gradient-mesh>
2548
+ * <h1>BlueprintX</h1>
2549
+ * </bpx-gradient-mesh>
2550
+ * ```
2551
+ */
2552
+ declare class GradientMesh {
2553
+ readonly color1: _angular_core.InputSignal<string>;
2554
+ readonly color2: _angular_core.InputSignal<string>;
2555
+ readonly color3: _angular_core.InputSignal<string>;
2556
+ readonly color4: _angular_core.InputSignal<string>;
2557
+ /** Seconds for one full drift cycle. */
2558
+ readonly speed: _angular_core.InputSignalWithTransform<number, unknown>;
2559
+ protected readonly speedS: _angular_core.Signal<string>;
2560
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GradientMesh, never>;
2561
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GradientMesh, "bpx-gradient-mesh", ["bpxGradientMesh"], { "color1": { "alias": "color1"; "required": false; "isSignal": true; }; "color2": { "alias": "color2"; "required": false; "isSignal": true; }; "color3": { "alias": "color3"; "required": false; "isSignal": true; }; "color4": { "alias": "color4"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2562
+ }
2563
+
2564
+ /**
2565
+ * A backdrop where a soft colored spotlight follows the cursor across a grid or
2566
+ * dot pattern. Project your content on top.
2567
+ *
2568
+ * ```html
2569
+ * <bpx-spotlight color="#6366f1" pattern="grid">
2570
+ * <h1>BlueprintX</h1>
2571
+ * </bpx-spotlight>
2572
+ * ```
2573
+ */
2574
+ declare class Spotlight {
2575
+ /** Spotlight color. */
2576
+ readonly color: _angular_core.InputSignal<string>;
2577
+ /** Spotlight diameter in px. */
2578
+ readonly size: _angular_core.InputSignalWithTransform<number, unknown>;
2579
+ /** Backdrop pattern under the glow. */
2580
+ readonly pattern: _angular_core.InputSignal<"none" | "grid" | "dots">;
2581
+ /** Pattern color. Defaults to a theme-aware subtle tint of the text color. */
2582
+ readonly patternColor: _angular_core.InputSignal<string>;
2583
+ /** Pattern cell size in px. */
2584
+ readonly cellSize: _angular_core.InputSignalWithTransform<number, unknown>;
2585
+ protected readonly active: _angular_core.WritableSignal<boolean>;
2586
+ protected readonly sizePx: _angular_core.Signal<string>;
2587
+ protected readonly cellPx: _angular_core.Signal<string>;
2588
+ private readonly host;
2589
+ protected onMove(event: PointerEvent): void;
2590
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Spotlight, never>;
2591
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Spotlight, "bpx-spotlight", ["bpxSpotlight"], { "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "patternColor": { "alias": "patternColor"; "required": false; "isSignal": true; }; "cellSize": { "alias": "cellSize"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2592
+ }
2593
+
2594
+ /**
2595
+ * A grid backdrop where the cell under the cursor lights up, snapping from cell
2596
+ * to cell as you move. Project your content on top.
2597
+ *
2598
+ * ```html
2599
+ * <bpx-grid-highlight color="#6366f1">
2600
+ * <h1>BlueprintX</h1>
2601
+ * </bpx-grid-highlight>
2602
+ * ```
2603
+ */
2604
+ declare class GridHighlight {
2605
+ /** Highlight color of the hovered cell. */
2606
+ readonly color: _angular_core.InputSignal<string>;
2607
+ /** Grid line color. Defaults to a theme-aware subtle tint of the text color. */
2608
+ readonly lineColor: _angular_core.InputSignal<string>;
2609
+ /** Cell size in px. */
2610
+ readonly cellSize: _angular_core.InputSignalWithTransform<number, unknown>;
2611
+ protected readonly active: _angular_core.WritableSignal<boolean>;
2612
+ protected readonly cellPx: _angular_core.Signal<string>;
2613
+ private readonly host;
2614
+ protected onMove(event: PointerEvent): void;
2615
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GridHighlight, never>;
2616
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GridHighlight, "bpx-grid-highlight", ["bpxGridHighlight"], { "color": { "alias": "color"; "required": false; "isSignal": true; }; "lineColor": { "alias": "lineColor"; "required": false; "isSignal": true; }; "cellSize": { "alias": "cellSize"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2617
+ }
2618
+
2619
+ /**
2620
+ * A canvas field of evenly-spaced dots that flee the cursor and ease back to
2621
+ * their home positions. Project your content on top.
2622
+ *
2623
+ * ```html
2624
+ * <bpx-repel-dots color="#6366f1">
2625
+ * <h1>BlueprintX</h1>
2626
+ * </bpx-repel-dots>
2627
+ * ```
2628
+ */
2629
+ declare class RepelDots {
2630
+ /** Distance between dots, in px. */
2631
+ readonly spacing: _angular_core.InputSignalWithTransform<number, unknown>;
2632
+ /** Dot color. */
2633
+ readonly color: _angular_core.InputSignal<string>;
2634
+ /** Dot radius, in px. */
2635
+ readonly dotRadius: _angular_core.InputSignalWithTransform<number, unknown>;
2636
+ /** Radius of the cursor's influence, in px. */
2637
+ readonly repelRadius: _angular_core.InputSignalWithTransform<number, unknown>;
2638
+ /** How strongly dots are pushed away (0–1+). */
2639
+ readonly strength: _angular_core.InputSignalWithTransform<number, unknown>;
2640
+ private readonly canvasRef;
2641
+ private readonly host;
2642
+ private readonly isBrowser;
2643
+ private ctx;
2644
+ private dots;
2645
+ private raf;
2646
+ private ro?;
2647
+ private readonly pointer;
2648
+ constructor();
2649
+ private start;
2650
+ private stop;
2651
+ private resize;
2652
+ private seed;
2653
+ private loop;
2654
+ private draw;
2655
+ protected onMove(event: PointerEvent): void;
2656
+ protected onLeave(): void;
2657
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RepelDots, never>;
2658
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RepelDots, "bpx-repel-dots", ["bpxRepelDots"], { "spacing": { "alias": "spacing"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "dotRadius": { "alias": "dotRadius"; "required": false; "isSignal": true; }; "repelRadius": { "alias": "repelRadius"; "required": false; "isSignal": true; }; "strength": { "alias": "strength"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2659
+ }
2660
+
2661
+ /**
2662
+ * A backdrop with a gooey liquid-glass blob that follows the cursor. A trail of
2663
+ * blobs chase the pointer and an SVG metaball filter melts them into one organic
2664
+ * shape; that shape masks a real `backdrop-filter` layer, so the blob is actual
2665
+ * frosted glass — it refracts the content behind it while it stretches and wobbles.
2666
+ *
2667
+ * ```html
2668
+ * <bpx-glass-cursor color="#c7d2fe">
2669
+ * <h1>BlueprintX</h1>
2670
+ * </bpx-glass-cursor>
2671
+ * ```
2672
+ */
2673
+ declare class GlassCursor {
2674
+ /** Diameter of the leading blob, in px (trailing blobs taper down). */
2675
+ readonly size: _angular_core.InputSignalWithTransform<number, unknown>;
2676
+ /** Glass tint layered over the frosted backdrop. */
2677
+ readonly color: _angular_core.InputSignal<string>;
2678
+ /** Backdrop blur inside the glass, in px. */
2679
+ readonly blur: _angular_core.InputSignalWithTransform<number, unknown>;
2680
+ /** Backdrop saturation inside the glass (1 = unchanged). */
2681
+ readonly saturation: _angular_core.InputSignalWithTransform<number, unknown>;
2682
+ /** Refraction strength — how much the blob lenses the content behind it (SVG
2683
+ * displacement scale). `0` disables the warp and leaves a plain frost. */
2684
+ readonly distortion: _angular_core.InputSignalWithTransform<number, unknown>;
2685
+ /** How many blobs trail the cursor. More = longer, gooier tail. */
2686
+ readonly count: _angular_core.InputSignalWithTransform<number, unknown>;
2687
+ /**
2688
+ * Follow easing per frame, 0–1. Lower = looser, longer liquid tail; higher =
2689
+ * tighter and snappier.
2690
+ */
2691
+ readonly lag: _angular_core.InputSignalWithTransform<number, unknown>;
2692
+ /** Park the blob at center when the cursor isn't over the surface. */
2693
+ readonly idleCenter: _angular_core.InputSignalWithTransform<boolean, unknown>;
2694
+ protected readonly filterId: string;
2695
+ protected readonly rimFilterId: string;
2696
+ protected readonly refractId: string;
2697
+ protected readonly gooGroupId: string;
2698
+ protected readonly maskId: string;
2699
+ protected readonly rimMaskId: string;
2700
+ protected readonly maskUrl: _angular_core.Signal<string>;
2701
+ protected readonly rimMaskUrl: _angular_core.Signal<string>;
2702
+ protected readonly blurPx: _angular_core.Signal<string>;
2703
+ /** Whether the refractive lens layer is active. */
2704
+ protected readonly hasDistortion: _angular_core.Signal<boolean>;
2705
+ /** The refraction backdrop-filter (warp + a hair of blur), or `none`. */
2706
+ protected readonly refractFilter: _angular_core.Signal<string>;
2707
+ /** Per-blob descriptors — the lead is full size, the tail tapers. */
2708
+ protected readonly blobs: _angular_core.Signal<{
2709
+ radius: number;
2710
+ }[]>;
2711
+ private readonly circles;
2712
+ private readonly host;
2713
+ private readonly isBrowser;
2714
+ private readonly target;
2715
+ private points;
2716
+ private started;
2717
+ private raf;
2718
+ constructor();
2719
+ private start;
2720
+ private loop;
2721
+ protected onMove(event: PointerEvent): void;
2722
+ protected onLeave(): void;
2723
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<GlassCursor, never>;
2724
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<GlassCursor, "bpx-glass-cursor", ["bpxGlassCursor"], { "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "blur": { "alias": "blur"; "required": false; "isSignal": true; }; "saturation": { "alias": "saturation"; "required": false; "isSignal": true; }; "distortion": { "alias": "distortion"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "lag": { "alias": "lag"; "required": false; "isSignal": true; }; "idleCenter": { "alias": "idleCenter"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
2725
+ }
2726
+
2727
+ export { Accordion, AccordionItem, Alert, Aurora, Avatar, Badge, BorderBeam, BpxCellDef, Breadcrumbs, Button, ButtonGroup, Calendar, Card, Checkbox, Chip, ChipSet, ClickSpark, ColorPicker, Combobox, CommandPalette, CopyButton, CountUp, DatePicker, Dialog, DotGrid, Drawer, ElectricBorder, FileUpload, Filter, GlassCursor, GradientMesh, GradientText, GridHighlight, Icon, IconRegistry, Input, LiquidGlass, Magnetic, Marquee, Menu, MenuItem, MenuTrigger, Meteors, MultiSelect, Pagination, Particles, PivotFieldPane, PivotGrid, Popover, PopoverTrigger, Progress, Radio, RadioGroup, RepelDots, RetroGrid, Ripple, ScrollArea, Segmented, Select, ShinyText, Skeleton, SkeletonLayout, Slider, Spinner, SplitButton, Spotlight, SpotlightCard, Step, Stepper, Switch, Tab, Table, Tabs, Textarea, TiltCard, ToastService, Tooltip, Typewriter, computePivot, distinctMembers, flattenRows, uniqueId };
2728
+ export type { BpxAvatarSize, BpxAvatarStatus, BpxBreadcrumb, BpxColor, BpxColumn, BpxCommand, BpxDrawerSide, BpxFileRejection, BpxIconDefinition, BpxInputType, BpxOption, BpxPivotAggregation, BpxPivotArea, BpxPivotCell, BpxPivotColumnNode, BpxPivotConfig, BpxPivotField, BpxPivotFilter, BpxPivotLeafColumn, BpxPivotModel, BpxPivotRowNode, BpxPivotSort, BpxPivotValue, BpxProgressShape, BpxSize, BpxSkeletonAnimation, BpxSkeletonPreset, BpxSkeletonVariant, BpxSort, BpxToast, BpxToastAction, BpxToastOptions, BpxToastType, BpxTone, BpxTooltipPosition, BpxVariant, PivotEngineOptions, PivotRecord };