ng-blatui 1.28.1 → 1.30.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.
@@ -1,7 +1,7 @@
1
1
  import { clsx } from 'clsx';
2
2
  import { twMerge } from 'tailwind-merge';
3
3
  import * as i0 from '@angular/core';
4
- import { input, computed, Directive, Component, signal, model, forwardRef, inject, PLATFORM_ID, effect, Injectable, ElementRef, ViewContainerRef, viewChild, afterNextRender, output, linkedSignal, ViewEncapsulation, DestroyRef } from '@angular/core';
4
+ import { InjectionToken, makeEnvironmentProviders, inject, computed, input, Directive, Component, signal, model, forwardRef, PLATFORM_ID, effect, Injectable, ElementRef, ViewContainerRef, viewChild, afterNextRender, output, linkedSignal, ViewEncapsulation, DestroyRef } from '@angular/core';
5
5
  import { cva } from 'class-variance-authority';
6
6
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
7
7
  export { AccordionContent, AccordionGroup, AccordionPanel, AccordionTrigger, ɵɵDeferredContent, ɵɵDeferredContentAware } from '@angular/aria/accordion';
@@ -25,6 +25,104 @@ function cn(...inputs) {
25
25
  return twMerge(clsx(inputs));
26
26
  }
27
27
 
28
+ /** Built-in English defaults — used whenever no input or provider overrides a key. */
29
+ const BUI_DEFAULT_LABELS = {
30
+ backToTop: 'Back to top',
31
+ bannerDismiss: 'Dismiss',
32
+ bannerAnnouncement: 'Announcement',
33
+ cookieConsent: 'Cookie consent',
34
+ pagination: 'pagination',
35
+ paginationMore: 'More pages',
36
+ resizableHandle: 'Resize panel',
37
+ spinnerLoading: 'Loading',
38
+ topProgressLoading: 'Page loading',
39
+ audioPlayerSeek: 'Seek',
40
+ audioPlayerPlay: 'Play',
41
+ audioPlayerPause: 'Pause',
42
+ audioPlayerMute: 'Mute',
43
+ audioPlayerUnmute: 'Unmute',
44
+ breadcrumb: 'breadcrumb',
45
+ breadcrumbMore: 'More',
46
+ calendarPreviousMonth: 'Previous month',
47
+ calendarMonth: 'Month',
48
+ calendarYear: 'Year',
49
+ calendarNextMonth: 'Next month',
50
+ carouselPrevious: 'Previous slide',
51
+ carouselNext: 'Next slide',
52
+ carouselGoToSlide: 'Go to slide',
53
+ codeBlockCopy: 'Copy code',
54
+ codeBlockCopyShort: 'Copy',
55
+ codeBlockCopied: 'Copied',
56
+ colorPickerPick: 'Pick a color',
57
+ colorPickerHex: 'Color hex value',
58
+ comparisonSliderPosition: 'Comparison position',
59
+ comparisonTableIncluded: 'Included',
60
+ comparisonTableNotIncluded: 'Not included',
61
+ dataTableSearch: 'Search',
62
+ dataTableSelectAll: 'Select all rows',
63
+ dataTableSelectRow: 'Select row',
64
+ dock: 'Dock',
65
+ fileUploadDropzone: 'Click to upload or drag & drop',
66
+ fileUploadRemove: 'Remove file',
67
+ miniCartTrigger: 'Cart',
68
+ miniCart: 'Shopping cart',
69
+ notificationCenter: 'Notifications',
70
+ notificationCenterUnread: 'Unread',
71
+ notificationCenterMarkAllRead: 'Mark all read',
72
+ notificationCenterEmpty: 'No notifications',
73
+ numberInputDecrease: 'Decrease',
74
+ numberInputIncrease: 'Increase',
75
+ phoneInputCountry: 'Country code',
76
+ phoneInputNumber: 'Phone number',
77
+ productCardWishlist: 'Add to wishlist',
78
+ promptInputAttach: 'Attach file',
79
+ promptInputSend: 'Send',
80
+ quantitySelectorDecrease: 'Decrease quantity',
81
+ quantitySelectorIncrease: 'Increase quantity',
82
+ repeaterRemove: 'Remove row',
83
+ richTextEditorFormatting: 'Formatting',
84
+ scrollspy: 'On this page',
85
+ sonner: 'Notifications',
86
+ sonnerDismiss: 'Dismiss notification',
87
+ themeCustomizer: 'Theme customizer',
88
+ treeTableToggle: 'Toggle row',
89
+ videoPlay: 'Play video',
90
+ };
91
+ /**
92
+ * App-wide overrides for {@link BuiLabels}. Set it with {@link provideBuiLabels}.
93
+ * Components read it through {@link buiLabel}; anything left unset falls back to
94
+ * {@link BUI_DEFAULT_LABELS}.
95
+ */
96
+ const BUI_LABELS = new InjectionToken('BUI_LABELS');
97
+ /**
98
+ * Provide global overrides (typically translations) for ng-blatui's built-in
99
+ * labels. Add to your app config:
100
+ *
101
+ * ```ts
102
+ * providers: [provideBuiLabels({ bannerDismiss: 'Fermer', fileUploadRemove: 'Supprimer le fichier' })]
103
+ * ```
104
+ *
105
+ * Pass only the keys you want to change; the rest keep their English defaults.
106
+ */
107
+ function provideBuiLabels(labels) {
108
+ return makeEnvironmentProviders([{ provide: BUI_LABELS, useValue: labels }]);
109
+ }
110
+ /**
111
+ * Resolve a label, most-specific wins:
112
+ * per-instance input → global {@link provideBuiLabels} override → built-in English.
113
+ *
114
+ * Call from an injection context (a component field initializer):
115
+ *
116
+ * ```ts
117
+ * readonly dismissLabel = input<string>();
118
+ * protected readonly dismissText = buiLabel('bannerDismiss', this.dismissLabel);
119
+ * ```
120
+ */
121
+ function buiLabel(key, override) {
122
+ const overrides = inject(BUI_LABELS, { optional: true });
123
+ return computed(() => override() ?? overrides?.[key] ?? BUI_DEFAULT_LABELS[key]);
124
+ }
125
+
28
126
  const buttonVariants = cva("inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
29
127
  variants: {
30
128
  variant: {
@@ -53,8 +151,10 @@ const buttonVariants = cva("inline-flex shrink-0 items-center justify-center gap
53
151
  * semantics, focus and keyboard behavior (accessibility for free).
54
152
  */
55
153
  class BuiButton {
154
+ /** Visual style of the button. */
56
155
  variant = input('default', /* @ts-ignore */
57
156
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
157
+ /** Size preset controlling height, padding and icon scale. */
58
158
  size = input('default', /* @ts-ignore */
59
159
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
60
160
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -139,10 +239,13 @@ function intensityFor(variant) {
139
239
  * element so it stays in the document flow and screen-reader friendly.
140
240
  */
141
241
  class BuiBadge {
242
+ /** Brand variant, or the intensity (`soft`/`solid`/`outline`) when a `tone` is set. */
142
243
  variant = input('default', /* @ts-ignore */
143
244
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
245
+ /** Optional semantic tone; when set it overrides the brand variant's color. */
144
246
  tone = input(null, /* @ts-ignore */
145
247
  ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
248
+ /** Badge size preset. */
146
249
  size = input('default', /* @ts-ignore */
147
250
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
148
251
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -193,8 +296,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
193
296
  * `[decorative]="false"` for a semantic `role="separator"` with `aria-orientation`.
194
297
  */
195
298
  class BuiSeparator {
299
+ /** Axis the separator runs along, also driving its sizing. */
196
300
  orientation = input('horizontal', /* @ts-ignore */
197
301
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
302
+ /** Whether the separator is purely visual; `false` exposes a semantic `role="separator"`. */
198
303
  decorative = input(true, /* @ts-ignore */
199
304
  ...(ngDevMode ? [{ debugName: "decorative" }] : /* istanbul ignore next */ []));
200
305
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -248,6 +353,7 @@ const CARD_VARIANTS = {
248
353
  };
249
354
  /** BlatUI card container. Use `variant="sectioned"` with the header/content/footer parts. */
250
355
  class BuiCard {
356
+ /** Card layout style: simple padded box or sectioned container. */
251
357
  variant = input('default', /* @ts-ignore */
252
358
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
253
359
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -365,8 +471,10 @@ const ALERT_TONES = {
365
471
  * (`default | destructive`) or semantic `tone` (`success | warning | danger | info | neutral`).
366
472
  */
367
473
  class BuiAlert {
474
+ /** Brand style; ignored when `tone` is set. */
368
475
  variant = input('default', /* @ts-ignore */
369
476
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
477
+ /** Semantic tone; when set, overrides `variant`. */
370
478
  tone = input(null, /* @ts-ignore */
371
479
  ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
372
480
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -423,6 +531,7 @@ const INPUT_SIZES = {
423
531
  };
424
532
  /** Applies BlatUI input styling to a native `<input>` (keeps native validation & a11y). */
425
533
  class BuiInput {
534
+ /** Size preset controlling input height, padding and text size. */
426
535
  size = input('default', /* @ts-ignore */
427
536
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
428
537
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -451,6 +560,7 @@ const TEXTAREA_SIZES = {
451
560
  };
452
561
  /** Applies BlatUI textarea styling to a native `<textarea>` (auto-grows via field-sizing). */
453
562
  class BuiTextarea {
563
+ /** Size preset controlling minimum height, padding and text size. */
454
564
  size = input('default', /* @ts-ignore */
455
565
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
456
566
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -476,8 +586,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
476
586
  * (valuemin/max/now/text). Set `[indeterminate]="true"` for an unknown-duration bar.
477
587
  */
478
588
  class BuiProgress {
589
+ /** Completion percentage from 0 to 100; values are clamped to that range. */
479
590
  value = input(0, /* @ts-ignore */
480
591
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
592
+ /** Show an unknown-duration animation instead of a fixed value. */
481
593
  indeterminate = input(false, /* @ts-ignore */
482
594
  ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
483
595
  /** Render a circular ring instead of a linear bar. */
@@ -489,6 +601,7 @@ class BuiProgress {
489
601
  /** Stroke width of the circular ring, in pixels. */
490
602
  thickness = input(4, /* @ts-ignore */
491
603
  ...(ngDevMode ? [{ debugName: "thickness" }] : /* istanbul ignore next */ []));
604
+ /** Accessible label announced for the progress bar. */
492
605
  ariaLabel = input('Progress', /* @ts-ignore */
493
606
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
494
607
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -620,8 +733,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
620
733
  * the projected fallback (initials, icon). Falls back automatically on load error.
621
734
  */
622
735
  class BuiAvatar {
736
+ /** Image URL to display; when unset or on load error the fallback is shown. */
623
737
  src = input(null, /* @ts-ignore */
624
738
  ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
739
+ /** Alternative text for the avatar image. */
625
740
  alt = input('', /* @ts-ignore */
626
741
  ...(ngDevMode ? [{ debugName: "alt" }] : /* istanbul ignore next */ []));
627
742
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -686,10 +801,13 @@ const CHECKBOX_BASE = 'peer border-input dark:bg-input/30 data-[state=checked]:b
686
801
  * with `[(checked)]` two-way binding and tri-state `[(indeterminate)]`.
687
802
  */
688
803
  class BuiCheckbox {
804
+ /** Whether the box is checked. Two-way bindable with `[(checked)]`. */
689
805
  checked = model(false, /* @ts-ignore */
690
806
  ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
807
+ /** Whether the box shows the mixed/indeterminate state. Two-way bindable with `[(indeterminate)]`. */
691
808
  indeterminate = model(false, /* @ts-ignore */
692
809
  ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
810
+ /** Whether the checkbox is disabled. Two-way bindable with `[(disabled)]`. */
693
811
  disabled = model(false, /* @ts-ignore */
694
812
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
695
813
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -846,10 +964,13 @@ const THUMB_BASE = 'bg-background dark:data-[state=unchecked]:bg-foreground dark
846
964
  * binding; keyboard activation (Space/Enter) and focus come from the native button.
847
965
  */
848
966
  class BuiSwitch {
967
+ /** Whether the switch is on. Two-way bindable with `[(checked)]`. */
849
968
  checked = model(false, /* @ts-ignore */
850
969
  ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
970
+ /** Whether the switch is disabled. Two-way bindable with `[(disabled)]`. */
851
971
  disabled = model(false, /* @ts-ignore */
852
972
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
973
+ /** Track and thumb size. */
853
974
  size = input('default', /* @ts-ignore */
854
975
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
855
976
  /** Optional SVG path `d` shown inside the thumb when checked. */
@@ -1463,6 +1584,9 @@ const FONTS = [
1463
1584
  * through {@link ThemeStore}, then exports a paste-ready stylesheet via "Copy CSS".
1464
1585
  */
1465
1586
  class BuiThemeCustomizer {
1587
+ ariaLabel = input(/* @ts-ignore */
1588
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
1589
+ ariaLabelText = buiLabel('themeCustomizer', this.ariaLabel);
1466
1590
  theme = inject(ThemeStore);
1467
1591
  open = signal(false, /* @ts-ignore */
1468
1592
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
@@ -1544,7 +1668,7 @@ class BuiThemeCustomizer {
1544
1668
  }
1545
1669
  }
1546
1670
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiThemeCustomizer, deps: [], target: i0.ɵɵFactoryTarget.Component });
1547
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiThemeCustomizer, isStandalone: true, selector: "bui-theme-customizer", host: { attributes: { "data-slot": "theme-customizer" } }, ngImport: i0, template: `
1671
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiThemeCustomizer, isStandalone: true, selector: "bui-theme-customizer", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "theme-customizer" } }, ngImport: i0, template: `
1548
1672
  <button
1549
1673
  buiButton
1550
1674
  variant="outline"
@@ -1559,7 +1683,7 @@ class BuiThemeCustomizer {
1559
1683
  @if (open()) {
1560
1684
  <div
1561
1685
  role="dialog"
1562
- aria-label="Theme customizer"
1686
+ [attr.aria-label]="ariaLabelText()"
1563
1687
  class="fixed right-4 bottom-16 z-50 max-h-[80vh] w-[340px] space-y-5 overflow-y-auto rounded-lg border bg-popover p-4 text-popover-foreground shadow-lg"
1564
1688
  >
1565
1689
  <div class="flex items-center justify-between">
@@ -1783,7 +1907,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
1783
1907
  @if (open()) {
1784
1908
  <div
1785
1909
  role="dialog"
1786
- aria-label="Theme customizer"
1910
+ [attr.aria-label]="ariaLabelText()"
1787
1911
  class="fixed right-4 bottom-16 z-50 max-h-[80vh] w-[340px] space-y-5 overflow-y-auto rounded-lg border bg-popover p-4 text-popover-foreground shadow-lg"
1788
1912
  >
1789
1913
  <div class="flex items-center justify-between">
@@ -1986,7 +2110,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
1986
2110
  }
1987
2111
  `,
1988
2112
  }]
1989
- }] });
2113
+ }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
1990
2114
 
1991
2115
  // eslint-disable-next-line @typescript-eslint/no-empty-function
1992
2116
  const noop$g = () => { };
@@ -1995,8 +2119,10 @@ const noop$g = () => { };
1995
2119
  * `buiRadioItem` buttons; `[(value)]` two-way binds the selected value.
1996
2120
  */
1997
2121
  class BuiRadioGroup {
2122
+ /** Selected radio value. Two-way bindable with `[(value)]`. */
1998
2123
  value = model(null, /* @ts-ignore */
1999
2124
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2125
+ /** Whether the whole group is disabled. Two-way bindable with `[(disabled)]`. */
2000
2126
  disabled = model(false, /* @ts-ignore */
2001
2127
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
2002
2128
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2062,8 +2188,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2062
2188
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2063
2189
  const ITEM = 'border-input text-primary dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive flex aspect-square size-4 shrink-0 items-center justify-center rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50';
2064
2190
  class BuiRadioGroupItem {
2191
+ /** Value this item contributes to the group when selected. */
2065
2192
  value = input.required(/* @ts-ignore */
2066
2193
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2194
+ /** Whether this individual radio item is disabled. */
2067
2195
  disabled = input(false, /* @ts-ignore */
2068
2196
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
2069
2197
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2122,6 +2250,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2122
2250
  const CONTENT_BASE = 'z-50 w-fit max-w-xs rounded-md px-3 py-1.5 text-xs shadow-md bg-primary text-primary-foreground';
2123
2251
  /** Floating tooltip bubble rendered into a CDK overlay. */
2124
2252
  class BuiTooltipContent {
2253
+ /** Text rendered inside the tooltip bubble. */
2125
2254
  text = input('', /* @ts-ignore */
2126
2255
  ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
2127
2256
  /** Extra classes (e.g. a colour override) merged over the base bubble styles. */
@@ -2159,7 +2288,9 @@ const FALLBACK = {
2159
2288
  * a hover delay with `delay`, and the bubble colour with `tooltipClass`.
2160
2289
  */
2161
2290
  class BuiTooltip {
2291
+ /** Tooltip text; bound via the `buiTooltip` attribute. */
2162
2292
  text = input.required({ ...(ngDevMode ? { debugName: "text" } : /* istanbul ignore next */ {}), alias: 'buiTooltip' });
2293
+ /** Preferred placement side relative to the host, with an automatic flip fallback. */
2163
2294
  side = input('top', /* @ts-ignore */
2164
2295
  ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
2165
2296
  /** Delay in milliseconds before the tooltip appears on hover/focus. */
@@ -2234,16 +2365,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2234
2365
 
2235
2366
  /** Breadcrumb navigation landmark (`<nav aria-label="breadcrumb">`). */
2236
2367
  class BuiBreadcrumb {
2368
+ /** Accessible label for the breadcrumb navigation landmark. */
2369
+ label = input(/* @ts-ignore */
2370
+ ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
2371
+ labelText = buiLabel('breadcrumb', this.label);
2237
2372
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiBreadcrumb, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2238
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: BuiBreadcrumb, isStandalone: true, selector: "nav[buiBreadcrumb]", host: { attributes: { "aria-label": "breadcrumb", "data-slot": "breadcrumb" } }, ngImport: i0 });
2373
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: BuiBreadcrumb, isStandalone: true, selector: "nav[buiBreadcrumb]", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "breadcrumb" }, properties: { "attr.aria-label": "labelText()" } }, ngImport: i0 });
2239
2374
  }
2240
2375
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiBreadcrumb, decorators: [{
2241
2376
  type: Directive,
2242
2377
  args: [{
2243
2378
  selector: 'nav[buiBreadcrumb]',
2244
- host: { 'aria-label': 'breadcrumb', 'data-slot': 'breadcrumb' },
2379
+ host: { '[attr.aria-label]': 'labelText()', 'data-slot': 'breadcrumb' },
2245
2380
  }]
2246
- }] });
2381
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
2247
2382
  class BuiBreadcrumbList {
2248
2383
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
2249
2384
  computedClass = computed(() => cn('flex flex-wrap items-center gap-1.5 text-sm break-words text-muted-foreground sm:gap-2.5', this.userClass()), /* @ts-ignore */
@@ -2359,10 +2494,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2359
2494
  /** Collapsed breadcrumb indicator (ellipsis). */
2360
2495
  class BuiBreadcrumbEllipsis {
2361
2496
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
2497
+ /** Screen-reader text for the collapsed ellipsis indicator. */
2498
+ moreLabel = input(/* @ts-ignore */
2499
+ ...(ngDevMode ? [undefined, { debugName: "moreLabel" }] : /* istanbul ignore next */ []));
2500
+ moreText = buiLabel('breadcrumbMore', this.moreLabel);
2362
2501
  computedClass = computed(() => cn('flex size-9 items-center justify-center', this.userClass()), /* @ts-ignore */
2363
2502
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
2364
2503
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiBreadcrumbEllipsis, deps: [], target: i0.ɵɵFactoryTarget.Component });
2365
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiBreadcrumbEllipsis, isStandalone: true, selector: "li[buiBreadcrumbEllipsis]", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "breadcrumb-ellipsis", "role": "presentation", "aria-hidden": "true" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
2504
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiBreadcrumbEllipsis, isStandalone: true, selector: "li[buiBreadcrumbEllipsis]", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, moreLabel: { classPropertyName: "moreLabel", publicName: "moreLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "breadcrumb-ellipsis", "role": "presentation", "aria-hidden": "true" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
2366
2505
  <svg
2367
2506
  viewBox="0 0 24 24"
2368
2507
  fill="none"
@@ -2376,7 +2515,7 @@ class BuiBreadcrumbEllipsis {
2376
2515
  <circle cx="19" cy="12" r="1" />
2377
2516
  <circle cx="5" cy="12" r="1" />
2378
2517
  </svg>
2379
- <span class="sr-only">More</span>
2518
+ <span class="sr-only">{{ moreText() }}</span>
2380
2519
  `, isInline: true });
2381
2520
  }
2382
2521
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiBreadcrumbEllipsis, decorators: [{
@@ -2403,10 +2542,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2403
2542
  <circle cx="19" cy="12" r="1" />
2404
2543
  <circle cx="5" cy="12" r="1" />
2405
2544
  </svg>
2406
- <span class="sr-only">More</span>
2545
+ <span class="sr-only">{{ moreText() }}</span>
2407
2546
  `,
2408
2547
  }]
2409
- }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2548
+ }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], moreLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreLabel", required: false }] }] } });
2410
2549
 
2411
2550
  /** Keyboard key styling, applied to a native `<kbd>` element. */
2412
2551
  class BuiKbd {
@@ -2426,6 +2565,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2426
2565
 
2427
2566
  /** Constrains projected content to a given aspect ratio (e.g. `16 / 9`). */
2428
2567
  class BuiAspectRatio {
2568
+ /** Aspect ratio for the content, as a CSS `aspect-ratio` value (e.g. `16 / 9`). */
2429
2569
  ratio = input('1 / 1', /* @ts-ignore */
2430
2570
  ...(ngDevMode ? [{ debugName: "ratio" }] : /* istanbul ignore next */ []));
2431
2571
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2449,6 +2589,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2449
2589
 
2450
2590
  /** Groups buttons (and inputs) into a single segmented control. */
2451
2591
  class BuiButtonGroup {
2592
+ /** Layout direction of the grouped controls. */
2452
2593
  orientation = input('horizontal', /* @ts-ignore */
2453
2594
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
2454
2595
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2515,6 +2656,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2515
2656
  }]
2516
2657
  }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2517
2658
  class BuiEmptyMedia {
2659
+ /** Media style; `icon` renders a muted rounded badge sized for an icon. */
2518
2660
  variant = input('default', /* @ts-ignore */
2519
2661
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
2520
2662
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2588,6 +2730,7 @@ const SIZES$5 = {
2588
2730
  };
2589
2731
  /** Centered, padded page container with a max-width scale. */
2590
2732
  class BuiContainer {
2733
+ /** Maximum width preset for the container. */
2591
2734
  size = input('lg', /* @ts-ignore */
2592
2735
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
2593
2736
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2611,6 +2754,7 @@ const FIELD_ORIENT = {
2611
2754
  };
2612
2755
  /** A form field row grouping a label, control, description and error. */
2613
2756
  class BuiField {
2757
+ /** How the label and control are arranged within the field. */
2614
2758
  orientation = input('vertical', /* @ts-ignore */
2615
2759
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
2616
2760
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2646,6 +2790,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2646
2790
  }]
2647
2791
  }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2648
2792
  class BuiFieldLegend {
2793
+ /** Whether the legend is styled as a section legend or a smaller label. */
2649
2794
  variant = input('legend', /* @ts-ignore */
2650
2795
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
2651
2796
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2680,6 +2825,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2680
2825
  }]
2681
2826
  }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2682
2827
  class BuiFieldLabel {
2828
+ /** Id of the control this label is associated with (maps to the `for` attribute). */
2683
2829
  forId = input(undefined, { ...(ngDevMode ? { debugName: "forId" } : /* istanbul ignore next */ {}), alias: 'for' });
2684
2830
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
2685
2831
  computedClass = computed(() => cn('flex w-fit gap-2 text-sm leading-snug font-medium select-none group-data-[disabled=true]/field:opacity-50', this.userClass()), /* @ts-ignore */
@@ -2780,6 +2926,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2780
2926
 
2781
2927
  /** Accessible disclosure: a trigger toggles the visibility of its content. */
2782
2928
  class BuiCollapsible {
2929
+ /** Whether the content is shown. Two-way bindable with `[(open)]`. */
2783
2930
  open = model(false, /* @ts-ignore */
2784
2931
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
2785
2932
  contentId = inject(_IdGenerator).getId('bui-collapsible-');
@@ -2852,12 +2999,16 @@ const toggleVariants = cva("inline-flex items-center justify-center gap-2 rounde
2852
2999
  });
2853
3000
  /** A two-state toggle button (`aria-pressed`). */
2854
3001
  class BuiToggle {
3002
+ /** Whether the toggle is pressed (on). Two-way bindable with `[(pressed)]`. */
2855
3003
  pressed = model(false, /* @ts-ignore */
2856
3004
  ...(ngDevMode ? [{ debugName: "pressed" }] : /* istanbul ignore next */ []));
3005
+ /** Whether the toggle is disabled. Two-way bindable with `[(disabled)]`. */
2857
3006
  disabled = model(false, /* @ts-ignore */
2858
3007
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
3008
+ /** Visual style: plain or outlined. */
2859
3009
  variant = input('default', /* @ts-ignore */
2860
3010
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3011
+ /** Button size. */
2861
3012
  size = input('default', /* @ts-ignore */
2862
3013
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
2863
3014
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2914,10 +3065,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2914
3065
  /** A spinning loading indicator (`role="status"`). */
2915
3066
  class BuiSpinner {
2916
3067
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
3068
+ /** Overrides the localized accessible status label. */
3069
+ label = input(/* @ts-ignore */
3070
+ ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
3071
+ labelText = buiLabel('spinnerLoading', this.label);
2917
3072
  computedClass = computed(() => cn('inline-block size-4 animate-spin', this.userClass()), /* @ts-ignore */
2918
3073
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
2919
3074
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiSpinner, deps: [], target: i0.ɵɵFactoryTarget.Component });
2920
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiSpinner, isStandalone: true, selector: "bui-spinner", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "spinner", "role": "status", "aria-label": "Loading" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
3075
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiSpinner, isStandalone: true, selector: "bui-spinner", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "spinner", "role": "status" }, properties: { "attr.aria-label": "labelText()", "class": "computedClass()" } }, ngImport: i0, template: `
2921
3076
  <svg
2922
3077
  viewBox="0 0 24 24"
2923
3078
  fill="none"
@@ -2939,7 +3094,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2939
3094
  host: {
2940
3095
  'data-slot': 'spinner',
2941
3096
  role: 'status',
2942
- 'aria-label': 'Loading',
3097
+ '[attr.aria-label]': 'labelText()',
2943
3098
  '[class]': 'computedClass()',
2944
3099
  },
2945
3100
  template: `
@@ -2957,12 +3112,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2957
3112
  </svg>
2958
3113
  `,
2959
3114
  }]
2960
- }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
3115
+ }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
2961
3116
 
2962
3117
  /** Copy-to-clipboard button: copies `value`, flips to a check, announces "Copied". */
2963
3118
  class BuiCopyButton {
3119
+ /** Text written to the clipboard when clicked. */
2964
3120
  value = input('', /* @ts-ignore */
2965
3121
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
3122
+ /** Accessible label shown before copying. */
2966
3123
  label = input('Copy', /* @ts-ignore */
2967
3124
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
2968
3125
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3079,13 +3236,24 @@ const TONES$1 = {
3079
3236
  * the dismissal in localStorage. SSR-safe — localStorage is only touched in the browser.
3080
3237
  */
3081
3238
  class BuiBanner {
3239
+ /** Color tone (`default | primary | info | success | warning | danger`). */
3082
3240
  tone = input('default', /* @ts-ignore */
3083
3241
  ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
3242
+ /** Whether to show the dismiss button. */
3084
3243
  dismissible = input(true, /* @ts-ignore */
3085
3244
  ...(ngDevMode ? [{ debugName: "dismissible" }] : /* istanbul ignore next */ []));
3245
+ /** When set, the dismissal is remembered in localStorage under this key. */
3086
3246
  persistKey = input(undefined, /* @ts-ignore */
3087
3247
  ...(ngDevMode ? [{ debugName: "persistKey" }] : /* istanbul ignore next */ []));
3088
3248
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
3249
+ /** Overrides the localized accessible label for the announcement region. */
3250
+ announcementLabel = input(/* @ts-ignore */
3251
+ ...(ngDevMode ? [undefined, { debugName: "announcementLabel" }] : /* istanbul ignore next */ []));
3252
+ /** Overrides the localized accessible label for the dismiss button. */
3253
+ dismissLabel = input(/* @ts-ignore */
3254
+ ...(ngDevMode ? [undefined, { debugName: "dismissLabel" }] : /* istanbul ignore next */ []));
3255
+ announcementText = buiLabel('bannerAnnouncement', this.announcementLabel);
3256
+ dismissText = buiLabel('bannerDismiss', this.dismissLabel);
3089
3257
  show = signal(true, /* @ts-ignore */
3090
3258
  ...(ngDevMode ? [{ debugName: "show" }] : /* istanbul ignore next */ []));
3091
3259
  isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
@@ -3105,14 +3273,14 @@ class BuiBanner {
3105
3273
  }
3106
3274
  }
3107
3275
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiBanner, deps: [], target: i0.ɵɵFactoryTarget.Component });
3108
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiBanner, isStandalone: true, selector: "bui-banner", inputs: { tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null }, persistKey: { classPropertyName: "persistKey", publicName: "persistKey", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "banner", "role": "region", "aria-label": "Announcement" }, properties: { "hidden": "!show()", "class": "computedClass()" } }, ngImport: i0, template: `
3276
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiBanner, isStandalone: true, selector: "bui-banner", inputs: { tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null }, persistKey: { classPropertyName: "persistKey", publicName: "persistKey", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, announcementLabel: { classPropertyName: "announcementLabel", publicName: "announcementLabel", isSignal: true, isRequired: false, transformFunction: null }, dismissLabel: { classPropertyName: "dismissLabel", publicName: "dismissLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "banner", "role": "region" }, properties: { "attr.aria-label": "announcementText()", "hidden": "!show()", "class": "computedClass()" } }, ngImport: i0, template: `
3109
3277
  <div class="flex flex-1 flex-wrap items-center justify-center gap-x-3 gap-y-1">
3110
3278
  <ng-content />
3111
3279
  </div>
3112
3280
  @if (dismissible()) {
3113
3281
  <button
3114
3282
  type="button"
3115
- aria-label="Dismiss"
3283
+ [attr.aria-label]="dismissText()"
3116
3284
  class="shrink-0 rounded-md p-1 opacity-70 transition-opacity outline-none hover:opacity-100 focus-visible:ring-2 focus-visible:ring-current/40"
3117
3285
  (click)="dismiss()"
3118
3286
  >
@@ -3140,7 +3308,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3140
3308
  host: {
3141
3309
  'data-slot': 'banner',
3142
3310
  role: 'region',
3143
- 'aria-label': 'Announcement',
3311
+ '[attr.aria-label]': 'announcementText()',
3144
3312
  '[hidden]': '!show()',
3145
3313
  '[class]': 'computedClass()',
3146
3314
  },
@@ -3151,7 +3319,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3151
3319
  @if (dismissible()) {
3152
3320
  <button
3153
3321
  type="button"
3154
- aria-label="Dismiss"
3322
+ [attr.aria-label]="dismissText()"
3155
3323
  class="shrink-0 rounded-md p-1 opacity-70 transition-opacity outline-none hover:opacity-100 focus-visible:ring-2 focus-visible:ring-current/40"
3156
3324
  (click)="dismiss()"
3157
3325
  >
@@ -3172,10 +3340,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3172
3340
  }
3173
3341
  `,
3174
3342
  }]
3175
- }], propDecorators: { tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], persistKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "persistKey", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
3343
+ }], propDecorators: { tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], persistKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "persistKey", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], announcementLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "announcementLabel", required: false }] }], dismissLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissLabel", required: false }] }] } });
3176
3344
 
3177
3345
  /** Scroll/border wrapper around a table. `variant="card"` adds a bordered card. */
3178
3346
  class BuiTableContainer {
3347
+ /** Wrapper style; `card` adds a bordered, shadowed card around the table. */
3179
3348
  variant = input('default', /* @ts-ignore */
3180
3349
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3181
3350
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3325,10 +3494,13 @@ function initials(name) {
3325
3494
  }
3326
3495
  /** Overlapping stack of avatars with an optional "+N" overflow counter. */
3327
3496
  class BuiAvatarGroup {
3497
+ /** Avatars to display, in order. */
3328
3498
  avatars = input([], /* @ts-ignore */
3329
3499
  ...(ngDevMode ? [{ debugName: "avatars" }] : /* istanbul ignore next */ []));
3500
+ /** Maximum avatars shown before the rest collapse into a "+N" counter. */
3330
3501
  max = input(4, /* @ts-ignore */
3331
3502
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
3503
+ /** Avatar size preset, which also controls overlap and ring width. */
3332
3504
  size = input('default', /* @ts-ignore */
3333
3505
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
3334
3506
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3400,11 +3572,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3400
3572
 
3401
3573
  /** Pagination navigation landmark. */
3402
3574
  class BuiPagination {
3575
+ /** Accessible label for the navigation landmark; falls back to a localized default. */
3576
+ ariaLabel = input(/* @ts-ignore */
3577
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
3403
3578
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
3579
+ ariaLabelText = buiLabel('pagination', this.ariaLabel);
3404
3580
  computedClass = computed(() => cn('mx-auto flex w-full justify-center', this.userClass()), /* @ts-ignore */
3405
3581
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
3406
3582
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiPagination, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3407
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: BuiPagination, isStandalone: true, selector: "nav[buiPagination]", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "navigation", "aria-label": "pagination", "data-slot": "pagination" }, properties: { "class": "computedClass()" } }, ngImport: i0 });
3583
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: BuiPagination, isStandalone: true, selector: "nav[buiPagination]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "navigation", "data-slot": "pagination" }, properties: { "attr.aria-label": "ariaLabelText()", "class": "computedClass()" } }, ngImport: i0 });
3408
3584
  }
3409
3585
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiPagination, decorators: [{
3410
3586
  type: Directive,
@@ -3412,12 +3588,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3412
3588
  selector: 'nav[buiPagination]',
3413
3589
  host: {
3414
3590
  role: 'navigation',
3415
- 'aria-label': 'pagination',
3591
+ '[attr.aria-label]': 'ariaLabelText()',
3416
3592
  'data-slot': 'pagination',
3417
3593
  '[class]': 'computedClass()',
3418
3594
  },
3419
3595
  }]
3420
- }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
3596
+ }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
3421
3597
  class BuiPaginationContent {
3422
3598
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
3423
3599
  computedClass = computed(() => cn('flex flex-row items-center gap-1', this.userClass()), /* @ts-ignore */
@@ -3452,8 +3628,10 @@ const LINK_SIZES = {
3452
3628
  };
3453
3629
  /** A pagination link; set `active` for the current page. */
3454
3630
  class BuiPaginationLink {
3631
+ /** Whether this link represents the current page; sets `aria-current="page"`. */
3455
3632
  active = input(false, /* @ts-ignore */
3456
3633
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
3634
+ /** Size variant controlling link dimensions and padding. */
3457
3635
  size = input('icon', /* @ts-ignore */
3458
3636
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
3459
3637
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3479,10 +3657,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3479
3657
  /** Ellipsis indicator for skipped pages. */
3480
3658
  class BuiPaginationEllipsis {
3481
3659
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
3660
+ /** Visually-hidden label announcing skipped pages; falls back to a localized default. */
3661
+ moreLabel = input(/* @ts-ignore */
3662
+ ...(ngDevMode ? [undefined, { debugName: "moreLabel" }] : /* istanbul ignore next */ []));
3663
+ moreText = buiLabel('paginationMore', this.moreLabel);
3482
3664
  computedClass = computed(() => cn('flex size-9 items-center justify-center', this.userClass()), /* @ts-ignore */
3483
3665
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
3484
3666
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiPaginationEllipsis, deps: [], target: i0.ɵɵFactoryTarget.Component });
3485
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiPaginationEllipsis, isStandalone: true, selector: "bui-pagination-ellipsis", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "pagination-ellipsis", "aria-hidden": "true" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
3667
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiPaginationEllipsis, isStandalone: true, selector: "bui-pagination-ellipsis", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, moreLabel: { classPropertyName: "moreLabel", publicName: "moreLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "pagination-ellipsis", "aria-hidden": "true" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
3486
3668
  <svg
3487
3669
  viewBox="0 0 24 24"
3488
3670
  fill="none"
@@ -3496,7 +3678,7 @@ class BuiPaginationEllipsis {
3496
3678
  <circle cx="19" cy="12" r="1" />
3497
3679
  <circle cx="5" cy="12" r="1" />
3498
3680
  </svg>
3499
- <span class="sr-only">More pages</span>
3681
+ <span class="sr-only">{{ moreText() }}</span>
3500
3682
  `, isInline: true });
3501
3683
  }
3502
3684
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiPaginationEllipsis, decorators: [{
@@ -3518,10 +3700,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3518
3700
  <circle cx="19" cy="12" r="1" />
3519
3701
  <circle cx="5" cy="12" r="1" />
3520
3702
  </svg>
3521
- <span class="sr-only">More pages</span>
3703
+ <span class="sr-only">{{ moreText() }}</span>
3522
3704
  `,
3523
3705
  }]
3524
- }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
3706
+ }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], moreLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "moreLabel", required: false }] }] } });
3525
3707
 
3526
3708
  const POPOVER_POSITIONS = {
3527
3709
  bottom: { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 4 },
@@ -3541,7 +3723,9 @@ const POPOVER_FALLBACK = {
3541
3723
  * Closes on outside click and Escape. SSR-safe (the overlay is browser-only, on click).
3542
3724
  */
3543
3725
  class BuiPopover {
3726
+ /** Template rendered as the popover content; bound via `[buiPopover]`. */
3544
3727
  content = input.required({ ...(ngDevMode ? { debugName: "content" } : /* istanbul ignore next */ {}), alias: 'buiPopover' });
3728
+ /** Side of the trigger the popover opens on, with an automatic opposite-side fallback. */
3545
3729
  side = input('bottom', /* @ts-ignore */
3546
3730
  ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
3547
3731
  overlay = inject(Overlay);
@@ -3637,8 +3821,10 @@ const ITEM_SIZES = {
3637
3821
  };
3638
3822
  /** A list/row item; use on a `<div>` or an `<a>`. */
3639
3823
  class BuiItem {
3824
+ /** Visual style of the item: transparent, outlined, or muted background. */
3640
3825
  variant = input('default', /* @ts-ignore */
3641
3826
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3827
+ /** Item density: standard padding or a more compact `sm` size. */
3642
3828
  size = input('default', /* @ts-ignore */
3643
3829
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
3644
3830
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3665,6 +3851,7 @@ const MEDIA_VARIANTS = {
3665
3851
  image: 'size-10 overflow-hidden rounded-sm [&_img]:size-full [&_img]:object-cover',
3666
3852
  };
3667
3853
  class BuiItemMedia {
3854
+ /** Media presentation: plain, an icon tile, or a cropped image thumbnail. */
3668
3855
  variant = input('default', /* @ts-ignore */
3669
3856
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3670
3857
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3812,6 +3999,7 @@ const ADDON_ALIGN = {
3812
3999
  'block-end': 'order-last w-full justify-start px-3 pb-3',
3813
4000
  };
3814
4001
  class BuiInputGroupAddon {
4002
+ /** Where the addon sits relative to the input (inline or block, start or end). */
3815
4003
  align = input('inline-start', /* @ts-ignore */
3816
4004
  ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
3817
4005
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3872,8 +4060,10 @@ const IG_BUTTON_SIZES = {
3872
4060
  'icon-sm': 'size-8 p-0',
3873
4061
  };
3874
4062
  class BuiInputGroupButton {
4063
+ /** Visual style of the addon button. */
3875
4064
  variant = input('ghost', /* @ts-ignore */
3876
4065
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
4066
+ /** Size preset for the addon button (text or icon variants). */
3877
4067
  size = input('xs', /* @ts-ignore */
3878
4068
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
3879
4069
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3892,6 +4082,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3892
4082
 
3893
4083
  /** Visually hides content while keeping it available to assistive tech (sr-only). */
3894
4084
  class BuiVisuallyHidden {
4085
+ /** Whether the content becomes visible when focused (e.g. skip links). */
3895
4086
  focusable = input(false, /* @ts-ignore */
3896
4087
  ...(ngDevMode ? [{ debugName: "focusable" }] : /* istanbul ignore next */ []));
3897
4088
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3917,21 +4108,28 @@ const TONES = {
3917
4108
  };
3918
4109
  /** A labelled meter (`role="meter"`) for a measurement within a known range. */
3919
4110
  class BuiMeter {
4111
+ /** Current measurement; clamped between `min` and `max`. */
3920
4112
  value = input(0, /* @ts-ignore */
3921
4113
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
4114
+ /** Minimum value of the meter range. */
3922
4115
  min = input(0, /* @ts-ignore */
3923
4116
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
4117
+ /** Maximum value of the meter range. */
3924
4118
  max = input(100, /* @ts-ignore */
3925
4119
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
4120
+ /** Optional text label shown above the meter bar. */
3926
4121
  label = input(null, /* @ts-ignore */
3927
4122
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
4123
+ /** Fill colour tone; overridden by any matching threshold. */
3928
4124
  tone = input('default', /* @ts-ignore */
3929
4125
  ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
3930
4126
  /** Auto-pick the fill tone by value: the highest threshold whose `at` ≤ value wins. */
3931
4127
  thresholds = input([], /* @ts-ignore */
3932
4128
  ...(ngDevMode ? [{ debugName: "thresholds" }] : /* istanbul ignore next */ []));
4129
+ /** Whether to display the formatted value text next to the label. */
3933
4130
  showValue = input(true, /* @ts-ignore */
3934
4131
  ...(ngDevMode ? [{ debugName: "showValue" }] : /* istanbul ignore next */ []));
4132
+ /** Unit suffix appended to the displayed value (e.g. "%"). */
3935
4133
  unit = input('%', /* @ts-ignore */
3936
4134
  ...(ngDevMode ? [{ debugName: "unit" }] : /* istanbul ignore next */ []));
3937
4135
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -4035,14 +4233,19 @@ const TREND_CLASS = {
4035
4233
  };
4036
4234
  /** A KPI / statistic card: label, big value, and a trend-coloured change. */
4037
4235
  class BuiStat {
4236
+ /** Small caption shown above the value. */
4038
4237
  label = input(null, /* @ts-ignore */
4039
4238
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
4239
+ /** Primary statistic displayed as the large value. */
4040
4240
  value = input('', /* @ts-ignore */
4041
4241
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
4242
+ /** Change indicator (e.g. "+12%"); coloured by trend. */
4042
4243
  change = input(null, /* @ts-ignore */
4043
4244
  ...(ngDevMode ? [{ debugName: "change" }] : /* istanbul ignore next */ []));
4245
+ /** Explicit trend direction; inferred from `change`'s sign when null. */
4044
4246
  trend = input(null, /* @ts-ignore */
4045
4247
  ...(ngDevMode ? [{ debugName: "trend" }] : /* istanbul ignore next */ []));
4248
+ /** Muted text shown next to the change value. */
4046
4249
  caption = input(null, /* @ts-ignore */
4047
4250
  ...(ngDevMode ? [{ debugName: "caption" }] : /* istanbul ignore next */ []));
4048
4251
  /** Optional inline sparkline drawn from a series of numbers. */
@@ -4161,9 +4364,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4161
4364
  * and stays open while the pointer is over the card. SSR-safe (browser-only, on hover).
4162
4365
  */
4163
4366
  class BuiHoverCard {
4367
+ /** Template rendered inside the card; bound via the `buiHoverCard` attribute. */
4164
4368
  content = input.required({ ...(ngDevMode ? { debugName: "content" } : /* istanbul ignore next */ {}), alias: 'buiHoverCard' });
4369
+ /** Delay in milliseconds before the card opens on hover/focus. */
4165
4370
  openDelay = input(400, /* @ts-ignore */
4166
4371
  ...(ngDevMode ? [{ debugName: "openDelay" }] : /* istanbul ignore next */ []));
4372
+ /** Delay in milliseconds before the card closes after the pointer leaves. */
4167
4373
  closeDelay = input(100, /* @ts-ignore */
4168
4374
  ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
4169
4375
  overlay = inject(Overlay);
@@ -4255,11 +4461,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4255
4461
 
4256
4462
  /** A dark code panel with an optional filename header and a copy button. */
4257
4463
  class BuiCodeBlock {
4464
+ /** Source code shown in the panel and copied to the clipboard. */
4258
4465
  code = input('', /* @ts-ignore */
4259
4466
  ...(ngDevMode ? [{ debugName: "code" }] : /* istanbul ignore next */ []));
4467
+ /** Optional filename shown in the header; omit for the floating copy button. */
4260
4468
  filename = input(null, /* @ts-ignore */
4261
4469
  ...(ngDevMode ? [{ debugName: "filename" }] : /* istanbul ignore next */ []));
4262
4470
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
4471
+ /** Accessible label for the copy button. */
4472
+ copyLabel = input(/* @ts-ignore */
4473
+ ...(ngDevMode ? [undefined, { debugName: "copyLabel" }] : /* istanbul ignore next */ []));
4474
+ /** Short visible text for the copy button. */
4475
+ copyShortLabel = input(/* @ts-ignore */
4476
+ ...(ngDevMode ? [undefined, { debugName: "copyShortLabel" }] : /* istanbul ignore next */ []));
4477
+ /** Text shown briefly after the code is copied. */
4478
+ copiedLabel = input(/* @ts-ignore */
4479
+ ...(ngDevMode ? [undefined, { debugName: "copiedLabel" }] : /* istanbul ignore next */ []));
4480
+ copyText = buiLabel('codeBlockCopy', this.copyLabel);
4481
+ copyShortText = buiLabel('codeBlockCopyShort', this.copyShortLabel);
4482
+ copiedText = buiLabel('codeBlockCopied', this.copiedLabel);
4263
4483
  copied = signal(false, /* @ts-ignore */
4264
4484
  ...(ngDevMode ? [{ debugName: "copied" }] : /* istanbul ignore next */ []));
4265
4485
  computedClass = computed(() => cn('group/code-block relative block overflow-hidden rounded-lg border border-zinc-800 bg-zinc-950 text-zinc-100', this.userClass()), /* @ts-ignore */
@@ -4277,27 +4497,27 @@ class BuiCodeBlock {
4277
4497
  }
4278
4498
  }
4279
4499
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiCodeBlock, deps: [], target: i0.ɵɵFactoryTarget.Component });
4280
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiCodeBlock, isStandalone: true, selector: "bui-code-block", inputs: { code: { classPropertyName: "code", publicName: "code", isSignal: true, isRequired: false, transformFunction: null }, filename: { classPropertyName: "filename", publicName: "filename", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "code-block" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
4500
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiCodeBlock, isStandalone: true, selector: "bui-code-block", inputs: { code: { classPropertyName: "code", publicName: "code", isSignal: true, isRequired: false, transformFunction: null }, filename: { classPropertyName: "filename", publicName: "filename", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, copyLabel: { classPropertyName: "copyLabel", publicName: "copyLabel", isSignal: true, isRequired: false, transformFunction: null }, copyShortLabel: { classPropertyName: "copyShortLabel", publicName: "copyShortLabel", isSignal: true, isRequired: false, transformFunction: null }, copiedLabel: { classPropertyName: "copiedLabel", publicName: "copiedLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "code-block" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
4281
4501
  @if (filename()) {
4282
4502
  <div class="flex items-center justify-between border-b border-white/10 px-4 py-2">
4283
4503
  <span class="font-mono text-xs text-zinc-400">{{ filename() }}</span>
4284
4504
  <button
4285
4505
  type="button"
4286
- aria-label="Copy code"
4506
+ [attr.aria-label]="copyText()"
4287
4507
  class="text-xs text-zinc-400 transition-colors hover:text-zinc-100"
4288
4508
  (click)="copy()"
4289
4509
  >
4290
- {{ copied() ? 'Copied' : 'Copy' }}
4510
+ {{ copied() ? copiedText() : copyShortText() }}
4291
4511
  </button>
4292
4512
  </div>
4293
4513
  } @else {
4294
4514
  <button
4295
4515
  type="button"
4296
- aria-label="Copy code"
4516
+ [attr.aria-label]="copyText()"
4297
4517
  class="absolute end-2 top-2 z-10 rounded-md px-1.5 py-1 text-xs text-zinc-400 opacity-0 transition-all group-hover/code-block:opacity-100 hover:bg-white/10 hover:text-zinc-100 focus-visible:opacity-100"
4298
4518
  (click)="copy()"
4299
4519
  >
4300
- {{ copied() ? 'Copied' : 'Copy' }}
4520
+ {{ copied() ? copiedText() : copyShortText() }}
4301
4521
  </button>
4302
4522
  }
4303
4523
  <pre
@@ -4316,21 +4536,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4316
4536
  <span class="font-mono text-xs text-zinc-400">{{ filename() }}</span>
4317
4537
  <button
4318
4538
  type="button"
4319
- aria-label="Copy code"
4539
+ [attr.aria-label]="copyText()"
4320
4540
  class="text-xs text-zinc-400 transition-colors hover:text-zinc-100"
4321
4541
  (click)="copy()"
4322
4542
  >
4323
- {{ copied() ? 'Copied' : 'Copy' }}
4543
+ {{ copied() ? copiedText() : copyShortText() }}
4324
4544
  </button>
4325
4545
  </div>
4326
4546
  } @else {
4327
4547
  <button
4328
4548
  type="button"
4329
- aria-label="Copy code"
4549
+ [attr.aria-label]="copyText()"
4330
4550
  class="absolute end-2 top-2 z-10 rounded-md px-1.5 py-1 text-xs text-zinc-400 opacity-0 transition-all group-hover/code-block:opacity-100 hover:bg-white/10 hover:text-zinc-100 focus-visible:opacity-100"
4331
4551
  (click)="copy()"
4332
4552
  >
4333
- {{ copied() ? 'Copied' : 'Copy' }}
4553
+ {{ copied() ? copiedText() : copyShortText() }}
4334
4554
  </button>
4335
4555
  }
4336
4556
  <pre
@@ -4338,7 +4558,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4338
4558
  ><code class="font-mono">{{ code() }}</code></pre>
4339
4559
  `,
4340
4560
  }]
4341
- }], propDecorators: { code: [{ type: i0.Input, args: [{ isSignal: true, alias: "code", required: false }] }], filename: [{ type: i0.Input, args: [{ isSignal: true, alias: "filename", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
4561
+ }], propDecorators: { code: [{ type: i0.Input, args: [{ isSignal: true, alias: "code", required: false }] }], filename: [{ type: i0.Input, args: [{ isSignal: true, alias: "filename", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], copyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "copyLabel", required: false }] }], copyShortLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "copyShortLabel", required: false }] }], copiedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "copiedLabel", required: false }] }] } });
4342
4562
 
4343
4563
  // eslint-disable-next-line @typescript-eslint/no-empty-function
4344
4564
  const noop$e = () => { };
@@ -4349,23 +4569,31 @@ const noop$e = () => { };
4349
4569
  * only read inside browser event handlers.
4350
4570
  */
4351
4571
  class BuiSlider {
4572
+ /** Current value (lower thumb in range mode). Two-way bindable with `[(value)]`. */
4352
4573
  value = model(0, /* @ts-ignore */
4353
4574
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
4354
4575
  /** Enable a second thumb; binds `endValue` as the upper handle. */
4355
4576
  range = input(false, /* @ts-ignore */
4356
4577
  ...(ngDevMode ? [{ debugName: "range" }] : /* istanbul ignore next */ []));
4578
+ /** Upper thumb value in range mode. Two-way bindable with `[(endValue)]`. */
4357
4579
  endValue = model(100, /* @ts-ignore */
4358
4580
  ...(ngDevMode ? [{ debugName: "endValue" }] : /* istanbul ignore next */ []));
4581
+ /** Minimum selectable value. */
4359
4582
  min = input(0, /* @ts-ignore */
4360
4583
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
4584
+ /** Maximum selectable value. */
4361
4585
  max = input(100, /* @ts-ignore */
4362
4586
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
4587
+ /** Increment between selectable values. */
4363
4588
  step = input(1, /* @ts-ignore */
4364
4589
  ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
4590
+ /** Whether the slider is disabled. Two-way bindable with `[(disabled)]`. */
4365
4591
  disabled = model(false, /* @ts-ignore */
4366
4592
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
4593
+ /** Layout direction of the slider. */
4367
4594
  orientation = input('horizontal', /* @ts-ignore */
4368
4595
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
4596
+ /** Accessible label for the thumb(s). */
4369
4597
  ariaLabel = input('Value', /* @ts-ignore */
4370
4598
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
4371
4599
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -4623,18 +4851,25 @@ const noop$d = () => { };
4623
4851
  const STAR_SIZE = { sm: 'size-4', default: 'size-5', lg: 'size-6' };
4624
4852
  /** A star rating (`role="radiogroup"`) with hover preview and keyboard support. */
4625
4853
  class BuiRating {
4854
+ /** Current rating. Two-way bindable with `[(value)]`. */
4626
4855
  value = model(0, /* @ts-ignore */
4627
4856
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
4857
+ /** Number of stars shown. */
4628
4858
  max = input(5, /* @ts-ignore */
4629
4859
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
4860
+ /** Whether the rating is display-only and cannot be changed. */
4630
4861
  readonly = input(false, /* @ts-ignore */
4631
4862
  ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
4863
+ /** Whether the rating is disabled. Two-way bindable with `[(disabled)]`. */
4632
4864
  disabled = model(false, /* @ts-ignore */
4633
4865
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
4866
+ /** Size of each star. */
4634
4867
  size = input('default', /* @ts-ignore */
4635
4868
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
4869
+ /** Tailwind text-color class applied to filled stars. */
4636
4870
  color = input('text-amber-500', /* @ts-ignore */
4637
4871
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
4872
+ /** Accessible label for the rating group. */
4638
4873
  ariaLabel = input(null, /* @ts-ignore */
4639
4874
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
4640
4875
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -4791,21 +5026,36 @@ const BTN_SIZE$1 = {
4791
5026
  const FIELD_WIDTH = { sm: 'w-9', default: 'w-10', lg: 'w-12' };
4792
5027
  /** A compact − [n] + quantity stepper (`role="group"` with a `spinbutton` field). */
4793
5028
  class BuiQuantitySelector {
5029
+ /** Current quantity. Two-way bindable with `[(value)]`. */
4794
5030
  value = model(1, /* @ts-ignore */
4795
5031
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
5032
+ /** Minimum allowed quantity. */
4796
5033
  min = input(1, /* @ts-ignore */
4797
5034
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
5035
+ /** Maximum allowed quantity; unbounded when null. */
4798
5036
  max = input(null, /* @ts-ignore */
4799
5037
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
5038
+ /** Increment/decrement applied per button press. */
4800
5039
  step = input(1, /* @ts-ignore */
4801
5040
  ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
5041
+ /** Size preset controlling height and button width. */
4802
5042
  size = input('default', /* @ts-ignore */
4803
5043
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
5044
+ /** Whether the whole control is disabled. */
4804
5045
  disabled = input(false, /* @ts-ignore */
4805
5046
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
5047
+ /** Accessible label for the numeric input field. */
4806
5048
  ariaLabel = input('Quantity', /* @ts-ignore */
4807
5049
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
5050
+ /** Accessible label override for the decrease button. */
5051
+ decreaseLabel = input(/* @ts-ignore */
5052
+ ...(ngDevMode ? [undefined, { debugName: "decreaseLabel" }] : /* istanbul ignore next */ []));
5053
+ /** Accessible label override for the increase button. */
5054
+ increaseLabel = input(/* @ts-ignore */
5055
+ ...(ngDevMode ? [undefined, { debugName: "increaseLabel" }] : /* istanbul ignore next */ []));
4808
5056
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
5057
+ decreaseText = buiLabel('quantitySelectorDecrease', this.decreaseLabel);
5058
+ increaseText = buiLabel('quantitySelectorIncrease', this.increaseLabel);
4809
5059
  atMin = computed(() => this.value() <= this.min(), /* @ts-ignore */
4810
5060
  ...(ngDevMode ? [{ debugName: "atMin" }] : /* istanbul ignore next */ []));
4811
5061
  atMax = computed(() => {
@@ -4848,10 +5098,10 @@ class BuiQuantitySelector {
4848
5098
  return result;
4849
5099
  }
4850
5100
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiQuantitySelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
4851
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiQuantitySelector, isStandalone: true, selector: "bui-quantity-selector", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "data-slot": "quantity-selector", "role": "group" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
5101
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiQuantitySelector, isStandalone: true, selector: "bui-quantity-selector", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, decreaseLabel: { classPropertyName: "decreaseLabel", publicName: "decreaseLabel", isSignal: true, isRequired: false, transformFunction: null }, increaseLabel: { classPropertyName: "increaseLabel", publicName: "increaseLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "data-slot": "quantity-selector", "role": "group" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
4852
5102
  <button
4853
5103
  type="button"
4854
- aria-label="Decrease quantity"
5104
+ [attr.aria-label]="decreaseText()"
4855
5105
  [disabled]="disabled() || atMin()"
4856
5106
  [class]="btnClass('e')"
4857
5107
  (click)="dec()"
@@ -4882,7 +5132,7 @@ class BuiQuantitySelector {
4882
5132
  />
4883
5133
  <button
4884
5134
  type="button"
4885
- aria-label="Increase quantity"
5135
+ [attr.aria-label]="increaseText()"
4886
5136
  [disabled]="disabled() || atMax()"
4887
5137
  [class]="btnClass('s')"
4888
5138
  (click)="inc()"
@@ -4908,7 +5158,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4908
5158
  template: `
4909
5159
  <button
4910
5160
  type="button"
4911
- aria-label="Decrease quantity"
5161
+ [attr.aria-label]="decreaseText()"
4912
5162
  [disabled]="disabled() || atMin()"
4913
5163
  [class]="btnClass('e')"
4914
5164
  (click)="dec()"
@@ -4939,7 +5189,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4939
5189
  />
4940
5190
  <button
4941
5191
  type="button"
4942
- aria-label="Increase quantity"
5192
+ [attr.aria-label]="increaseText()"
4943
5193
  [disabled]="disabled() || atMax()"
4944
5194
  [class]="btnClass('s')"
4945
5195
  (click)="inc()"
@@ -4957,7 +5207,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4957
5207
  </button>
4958
5208
  `,
4959
5209
  }]
4960
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
5210
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], decreaseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "decreaseLabel", required: false }] }], increaseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "increaseLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
4961
5211
 
4962
5212
  /**
4963
5213
  * Confirm dialog styling (`role="alertdialog"`). Open it with the CDK `Dialog` service
@@ -5075,8 +5325,10 @@ const SIZES$3 = {
5075
5325
  * browser (via `afterNextRender` and the `input` event).
5076
5326
  */
5077
5327
  class BuiAutosizeTextarea {
5328
+ /** Size preset controlling minimum height, padding and text size. */
5078
5329
  size = input('default', /* @ts-ignore */
5079
5330
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
5331
+ /** Maximum number of rows before the textarea scrolls instead of growing (null = unlimited). */
5080
5332
  maxRows = input(null, /* @ts-ignore */
5081
5333
  ...(ngDevMode ? [{ debugName: "maxRows" }] : /* istanbul ignore next */ []));
5082
5334
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5250,6 +5502,7 @@ const TYPOGRAPHY = {
5250
5502
  };
5251
5503
  /** Applies a typographic style. Put it on the matching element (e.g. `<h1 buiTypography variant="h1">`). */
5252
5504
  class BuiTypography {
5505
+ /** Typographic style to apply (e.g. `h1`, `lead`, `blockquote`, `gradient`). */
5253
5506
  variant = input('p', /* @ts-ignore */
5254
5507
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
5255
5508
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5272,10 +5525,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5272
5525
 
5273
5526
  /** Decorative dotted background layer. Drop inside a `relative` container. */
5274
5527
  class BuiDotPattern {
5528
+ /** Dot radius in pixels. */
5275
5529
  size = input(1, /* @ts-ignore */
5276
5530
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
5531
+ /** Spacing between dots in pixels. */
5277
5532
  gap = input(16, /* @ts-ignore */
5278
5533
  ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
5534
+ /** Whether to fade the pattern with a radial mask toward the edges. */
5279
5535
  mask = input(false, /* @ts-ignore */
5280
5536
  ...(ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []));
5281
5537
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5308,10 +5564,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5308
5564
 
5309
5565
  /** Decorative grid background layer. Drop inside a `relative` container. */
5310
5566
  class BuiGridPattern {
5567
+ /** Cell size (spacing between grid lines) in pixels. */
5311
5568
  gap = input(24, /* @ts-ignore */
5312
5569
  ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
5570
+ /** Thickness of the grid lines in pixels. */
5313
5571
  lineWidth = input(1, /* @ts-ignore */
5314
5572
  ...(ngDevMode ? [{ debugName: "lineWidth" }] : /* istanbul ignore next */ []));
5573
+ /** Whether to fade the pattern with a radial mask toward the edges. */
5315
5574
  mask = input(false, /* @ts-ignore */
5316
5575
  ...(ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []));
5317
5576
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5349,10 +5608,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5349
5608
  const noop$c = () => { };
5350
5609
  /** A single-select segmented control (`role="radiogroup"`) with arrow-key navigation. */
5351
5610
  class BuiSegmentedControl {
5611
+ /** Currently selected segment value. Two-way bindable with `[(value)]`. */
5352
5612
  value = model('', /* @ts-ignore */
5353
5613
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
5614
+ /** Available segments; plain strings are used as both value and label. */
5354
5615
  options = input([], /* @ts-ignore */
5355
5616
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
5617
+ /** Whether all segments are disabled. Two-way bindable with `[(disabled)]`. */
5356
5618
  disabled = model(false, /* @ts-ignore */
5357
5619
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
5358
5620
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5472,8 +5734,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5472
5734
  * helper classes `.prompt .ok .dim .path .warn` colour them.
5473
5735
  */
5474
5736
  class BuiTerminal {
5737
+ /** Optional title shown in the terminal title bar. */
5475
5738
  title = input(null, /* @ts-ignore */
5476
5739
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
5740
+ /** Whether to show the macOS-style traffic-light buttons in the title bar. */
5477
5741
  buttons = input(true, /* @ts-ignore */
5478
5742
  ...(ngDevMode ? [{ debugName: "buttons" }] : /* istanbul ignore next */ []));
5479
5743
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5543,15 +5807,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5543
5807
 
5544
5808
  /** A data-driven feature-comparison / pricing table. */
5545
5809
  class BuiComparisonTable {
5810
+ /** Column headers, one per pricing/feature tier. */
5546
5811
  tiers = input([], /* @ts-ignore */
5547
5812
  ...(ngDevMode ? [{ debugName: "tiers" }] : /* istanbul ignore next */ []));
5813
+ /** Feature rows; each holds one value per tier. */
5548
5814
  rows = input([], /* @ts-ignore */
5549
5815
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
5816
+ /** Tier to emphasize, by index or tier name; `null` highlights none. */
5550
5817
  highlight = input(null, /* @ts-ignore */
5551
5818
  ...(ngDevMode ? [{ debugName: "highlight" }] : /* istanbul ignore next */ []));
5819
+ /** Header text for the leading feature column. */
5552
5820
  featureLabel = input('Feature', /* @ts-ignore */
5553
5821
  ...(ngDevMode ? [{ debugName: "featureLabel" }] : /* istanbul ignore next */ []));
5554
5822
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
5823
+ /** Accessible label for the included (check) icon. */
5824
+ includedLabel = input(/* @ts-ignore */
5825
+ ...(ngDevMode ? [undefined, { debugName: "includedLabel" }] : /* istanbul ignore next */ []));
5826
+ /** Accessible label for the not-included (dash) marker. */
5827
+ notIncludedLabel = input(/* @ts-ignore */
5828
+ ...(ngDevMode ? [undefined, { debugName: "notIncludedLabel" }] : /* istanbul ignore next */ []));
5829
+ includedText = buiLabel('comparisonTableIncluded', this.includedLabel);
5830
+ notIncludedText = buiLabel('comparisonTableNotIncluded', this.notIncludedLabel);
5555
5831
  highlightIndex = computed(() => {
5556
5832
  const highlight = this.highlight();
5557
5833
  if (typeof highlight === 'number') {
@@ -5563,7 +5839,7 @@ class BuiComparisonTable {
5563
5839
  computedClass = computed(() => cn('w-full overflow-x-auto rounded-xl border', this.userClass()), /* @ts-ignore */
5564
5840
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
5565
5841
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiComparisonTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
5566
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiComparisonTable, isStandalone: true, selector: "bui-comparison-table", inputs: { tiers: { classPropertyName: "tiers", publicName: "tiers", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, highlight: { classPropertyName: "highlight", publicName: "highlight", isSignal: true, isRequired: false, transformFunction: null }, featureLabel: { classPropertyName: "featureLabel", publicName: "featureLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "comparison-table" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
5842
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiComparisonTable, isStandalone: true, selector: "bui-comparison-table", inputs: { tiers: { classPropertyName: "tiers", publicName: "tiers", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, highlight: { classPropertyName: "highlight", publicName: "highlight", isSignal: true, isRequired: false, transformFunction: null }, featureLabel: { classPropertyName: "featureLabel", publicName: "featureLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, includedLabel: { classPropertyName: "includedLabel", publicName: "includedLabel", isSignal: true, isRequired: false, transformFunction: null }, notIncludedLabel: { classPropertyName: "notIncludedLabel", publicName: "notIncludedLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "comparison-table" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
5567
5843
  <table class="w-full text-sm">
5568
5844
  <caption class="sr-only">
5569
5845
  {{
@@ -5604,13 +5880,13 @@ class BuiComparisonTable {
5604
5880
  stroke-width="2"
5605
5881
  stroke-linecap="round"
5606
5882
  stroke-linejoin="round"
5607
- aria-label="Included"
5883
+ [attr.aria-label]="includedText()"
5608
5884
  class="mx-auto size-4 text-primary"
5609
5885
  >
5610
5886
  <path d="M20 6 9 17l-5-5" />
5611
5887
  </svg>
5612
5888
  } @else if (value === false || value === null) {
5613
- <span class="text-muted-foreground" aria-label="Not included">—</span>
5889
+ <span class="text-muted-foreground" [attr.aria-label]="notIncludedText()">—</span>
5614
5890
  } @else {
5615
5891
  {{ value }}
5616
5892
  }
@@ -5668,13 +5944,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5668
5944
  stroke-width="2"
5669
5945
  stroke-linecap="round"
5670
5946
  stroke-linejoin="round"
5671
- aria-label="Included"
5947
+ [attr.aria-label]="includedText()"
5672
5948
  class="mx-auto size-4 text-primary"
5673
5949
  >
5674
5950
  <path d="M20 6 9 17l-5-5" />
5675
5951
  </svg>
5676
5952
  } @else if (value === false || value === null) {
5677
- <span class="text-muted-foreground" aria-label="Not included">—</span>
5953
+ <span class="text-muted-foreground" [attr.aria-label]="notIncludedText()">—</span>
5678
5954
  } @else {
5679
5955
  {{ value }}
5680
5956
  }
@@ -5686,15 +5962,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5686
5962
  </table>
5687
5963
  `,
5688
5964
  }]
5689
- }], propDecorators: { tiers: [{ type: i0.Input, args: [{ isSignal: true, alias: "tiers", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], highlight: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlight", required: false }] }], featureLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "featureLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
5965
+ }], propDecorators: { tiers: [{ type: i0.Input, args: [{ isSignal: true, alias: "tiers", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], highlight: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlight", required: false }] }], featureLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "featureLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], includedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "includedLabel", required: false }] }], notIncludedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "notIncludedLabel", required: false }] }] } });
5690
5966
 
5691
5967
  /**
5692
5968
  * A card that flips to reveal its back. Default content is the front; project the back
5693
5969
  * with `[buiFlipBack]`. `trigger="hover"` (default) or `"click"` (keyboard-accessible).
5694
5970
  */
5695
5971
  class BuiFlipCard {
5972
+ /** What flips the card: hover/focus or click/keypress. */
5696
5973
  trigger = input('hover', /* @ts-ignore */
5697
5974
  ...(ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []));
5975
+ /** Fixed card height as a CSS length. */
5698
5976
  height = input('16rem', /* @ts-ignore */
5699
5977
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
5700
5978
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5789,8 +6067,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5789
6067
 
5790
6068
  /** A card with a radial spotlight glow that follows the cursor on hover. */
5791
6069
  class BuiSpotlightCard {
6070
+ /** Spotlight glow colour; defaults to a subtle foreground tint. */
5792
6071
  color = input(null, /* @ts-ignore */
5793
6072
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
6073
+ /** Spotlight radius in pixels. */
5794
6074
  size = input(350, /* @ts-ignore */
5795
6075
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
5796
6076
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5846,8 +6126,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5846
6126
 
5847
6127
  /** A card that tilts in 3D toward the cursor. SSR-safe (geometry read on mousemove). */
5848
6128
  class BuiTiltCard {
6129
+ /** Maximum tilt angle in degrees on each axis. */
5849
6130
  max = input(10, /* @ts-ignore */
5850
6131
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
6132
+ /** Scale factor applied while the card is tilting. */
5851
6133
  scaleTo = input(1.05, /* @ts-ignore */
5852
6134
  ...(ngDevMode ? [{ debugName: "scaleTo" }] : /* istanbul ignore next */ []));
5853
6135
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5917,17 +6199,22 @@ const noop$b = () => { };
5917
6199
  * (arrows, Home/End, Enter, Escape) and outside-click close. SSR-safe.
5918
6200
  */
5919
6201
  class BuiSelect {
6202
+ /** Selected option value (single mode). Two-way bindable with `[(value)]`. */
5920
6203
  value = model('', /* @ts-ignore */
5921
6204
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
5922
6205
  /** Select several options; binds `values` instead of `value`. */
5923
6206
  multiple = input(false, /* @ts-ignore */
5924
6207
  ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
6208
+ /** Selected option values (multiple mode). Two-way bindable with `[(values)]`. */
5925
6209
  values = model([], /* @ts-ignore */
5926
6210
  ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
6211
+ /** Available options to choose from. */
5927
6212
  options = input([], /* @ts-ignore */
5928
6213
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
6214
+ /** Text shown on the trigger when nothing is selected. */
5929
6215
  placeholder = input('Select…', /* @ts-ignore */
5930
6216
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
6217
+ /** Whether the select is disabled. Two-way bindable with `[(disabled)]`. */
5931
6218
  disabled = model(false, /* @ts-ignore */
5932
6219
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
5933
6220
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -6303,11 +6590,17 @@ const VARIANTS$1 = {
6303
6590
  * `threshold` px. SSR-safe — the scroll position is only read in the browser.
6304
6591
  */
6305
6592
  class BuiBackToTop {
6593
+ /** Pixel scroll distance before the button appears. */
6306
6594
  threshold = input(300, /* @ts-ignore */
6307
6595
  ...(ngDevMode ? [{ debugName: "threshold" }] : /* istanbul ignore next */ []));
6596
+ /** Visual style of the button. */
6308
6597
  variant = input('primary', /* @ts-ignore */
6309
6598
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
6310
6599
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
6600
+ /** Accessible label for the button; falls back to the i18n default. */
6601
+ label = input(/* @ts-ignore */
6602
+ ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
6603
+ labelText = buiLabel('backToTop', this.label);
6311
6604
  shown = signal(false, /* @ts-ignore */
6312
6605
  ...(ngDevMode ? [{ debugName: "shown" }] : /* istanbul ignore next */ []));
6313
6606
  variantClass = computed(() => VARIANTS$1[this.variant()], /* @ts-ignore */
@@ -6326,10 +6619,10 @@ class BuiBackToTop {
6326
6619
  globalThis.scrollTo({ top: 0, behavior: 'smooth' });
6327
6620
  }
6328
6621
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiBackToTop, deps: [], target: i0.ɵɵFactoryTarget.Component });
6329
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiBackToTop, isStandalone: true, selector: "bui-back-to-top", inputs: { threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "back-to-top" }, listeners: { "window:scroll": "onScroll()" }, properties: { "hidden": "!shown()", "class": "computedClass()" } }, ngImport: i0, template: `
6622
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiBackToTop, isStandalone: true, selector: "bui-back-to-top", inputs: { threshold: { classPropertyName: "threshold", publicName: "threshold", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "back-to-top" }, listeners: { "window:scroll": "onScroll()" }, properties: { "hidden": "!shown()", "class": "computedClass()" } }, ngImport: i0, template: `
6330
6623
  <button
6331
6624
  type="button"
6332
- aria-label="Back to top"
6625
+ [attr.aria-label]="labelText()"
6333
6626
  class="inline-flex size-10 items-center justify-center rounded-full shadow-md transition-colors outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"
6334
6627
  [class]="variantClass()"
6335
6628
  (click)="toTop()"
@@ -6363,7 +6656,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
6363
6656
  template: `
6364
6657
  <button
6365
6658
  type="button"
6366
- aria-label="Back to top"
6659
+ [attr.aria-label]="labelText()"
6367
6660
  class="inline-flex size-10 items-center justify-center rounded-full shadow-md transition-colors outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"
6368
6661
  [class]="variantClass()"
6369
6662
  (click)="toTop()"
@@ -6384,7 +6677,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
6384
6677
  </button>
6385
6678
  `,
6386
6679
  }]
6387
- }], ctorParameters: () => [], propDecorators: { threshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "threshold", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
6680
+ }], ctorParameters: () => [], propDecorators: { threshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "threshold", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
6388
6681
 
6389
6682
  // eslint-disable-next-line @typescript-eslint/no-empty-function
6390
6683
  const noop$a = () => { };
@@ -6393,17 +6686,22 @@ const noop$a = () => { };
6393
6686
  * filtered listbox, using the `aria-activedescendant` pattern. Full keyboard + outside-click.
6394
6687
  */
6395
6688
  class BuiCombobox {
6689
+ /** Selected option value (single mode). Two-way bindable with `[(value)]`. */
6396
6690
  value = model('', /* @ts-ignore */
6397
6691
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
6398
6692
  /** Select several options; binds `values` instead of `value`. */
6399
6693
  multiple = input(false, /* @ts-ignore */
6400
6694
  ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
6695
+ /** Selected option values (multiple mode). Two-way bindable with `[(values)]`. */
6401
6696
  values = model([], /* @ts-ignore */
6402
6697
  ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
6698
+ /** Available options to filter and choose from. */
6403
6699
  options = input([], /* @ts-ignore */
6404
6700
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
6701
+ /** Placeholder text shown in the search input. */
6405
6702
  placeholder = input('Search…', /* @ts-ignore */
6406
6703
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
6704
+ /** Whether the combobox is disabled. Two-way bindable with `[(disabled)]`. */
6407
6705
  disabled = model(false, /* @ts-ignore */
6408
6706
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
6409
6707
  /** When false, the field can't be typed in — it just opens the full list (select-like). */
@@ -6706,8 +7004,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
6706
7004
 
6707
7005
  /** A live countdown to a target time (`role="timer"`). SSR-safe — ticks only in the browser. */
6708
7006
  class BuiCountdown {
7007
+ /** Target moment to count down to, as a Date, timestamp, or date string. */
6709
7008
  to = input.required(/* @ts-ignore */
6710
7009
  ...(ngDevMode ? [{ debugName: "to" }] : /* istanbul ignore next */ []));
7010
+ /** Text shown once the target time has passed. */
6711
7011
  expired = input('Expired', /* @ts-ignore */
6712
7012
  ...(ngDevMode ? [{ debugName: "expired" }] : /* istanbul ignore next */ []));
6713
7013
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -6807,18 +7107,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
6807
7107
  * `aria-hidden`; an sr-only span carries the final value (SSR/no-JS read the real number).
6808
7108
  */
6809
7109
  class BuiNumberTicker {
7110
+ /** Target value to count up to. */
6810
7111
  value = input(0, /* @ts-ignore */
6811
7112
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
7113
+ /** Starting value the animation counts from. */
6812
7114
  from = input(0, /* @ts-ignore */
6813
7115
  ...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
7116
+ /** Animation length in milliseconds; 0 snaps instantly. */
6814
7117
  duration = input(1500, /* @ts-ignore */
6815
7118
  ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
7119
+ /** Number of decimal places to display. */
6816
7120
  decimals = input(0, /* @ts-ignore */
6817
7121
  ...(ngDevMode ? [{ debugName: "decimals" }] : /* istanbul ignore next */ []));
7122
+ /** Text prepended before the number. */
6818
7123
  prefix = input('', /* @ts-ignore */
6819
7124
  ...(ngDevMode ? [{ debugName: "prefix" }] : /* istanbul ignore next */ []));
7125
+ /** Text appended after the number. */
6820
7126
  suffix = input('', /* @ts-ignore */
6821
7127
  ...(ngDevMode ? [{ debugName: "suffix" }] : /* istanbul ignore next */ []));
7128
+ /** Thousands-group separator character. */
6822
7129
  separator = input(',', /* @ts-ignore */
6823
7130
  ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
6824
7131
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -6887,8 +7194,10 @@ const VARIANTS = {
6887
7194
  };
6888
7195
  /** A styled anchor. Set `external` for `target=_blank` + safe `rel`. */
6889
7196
  class BuiLink {
7197
+ /** Visual style of the link: default, muted, or subtle. */
6890
7198
  variant = input('default', /* @ts-ignore */
6891
7199
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
7200
+ /** Whether the link is external, adding `target=_blank` and safe `rel`. */
6892
7201
  external = input(false, /* @ts-ignore */
6893
7202
  ...(ngDevMode ? [{ debugName: "external" }] : /* istanbul ignore next */ []));
6894
7203
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -6922,14 +7231,19 @@ const PRESETS = {
6922
7231
  };
6923
7232
  /** Renders accessible text painted with a CSS gradient, with an optional shimmer. */
6924
7233
  class BuiGradientText {
7234
+ /** Named colour preset used when from/via/to are not set. */
6925
7235
  preset = input('brand', /* @ts-ignore */
6926
7236
  ...(ngDevMode ? [{ debugName: "preset" }] : /* istanbul ignore next */ []));
7237
+ /** Gradient start colour; overrides the preset's first stop. */
6927
7238
  from = input(null, /* @ts-ignore */
6928
7239
  ...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
7240
+ /** Gradient middle colour; overrides the preset's second stop. */
6929
7241
  via = input(null, /* @ts-ignore */
6930
7242
  ...(ngDevMode ? [{ debugName: "via" }] : /* istanbul ignore next */ []));
7243
+ /** Gradient end colour; overrides the preset's third stop. */
6931
7244
  to = input(null, /* @ts-ignore */
6932
7245
  ...(ngDevMode ? [{ debugName: "to" }] : /* istanbul ignore next */ []));
7246
+ /** Whether to animate a horizontal shimmer across the gradient. */
6933
7247
  animate = input(false, /* @ts-ignore */
6934
7248
  ...(ngDevMode ? [{ debugName: "animate" }] : /* istanbul ignore next */ []));
6935
7249
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -6962,10 +7276,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
6962
7276
  * Provide the title via the `heading` input or by projecting content.
6963
7277
  */
6964
7278
  class BuiPageHeader {
7279
+ /** Title text rendered in the heading (alternative to projecting content). */
6965
7280
  heading = input('', /* @ts-ignore */
6966
7281
  ...(ngDevMode ? [{ debugName: "heading" }] : /* istanbul ignore next */ []));
7282
+ /** Optional supporting text shown beneath the heading. */
6967
7283
  description = input('', /* @ts-ignore */
6968
7284
  ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
7285
+ /** Whether to render a bottom border separating the header from the page. */
6969
7286
  separator = input(false, /* @ts-ignore */
6970
7287
  ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
6971
7288
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7013,12 +7330,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7013
7330
 
7014
7331
  /** A styled blockquote / testimonial with optional attribution (author, role, avatar). */
7015
7332
  class BuiQuote {
7333
+ /** Name of the person credited in the attribution. */
7016
7334
  author = input('', /* @ts-ignore */
7017
7335
  ...(ngDevMode ? [{ debugName: "author" }] : /* istanbul ignore next */ []));
7336
+ /** Role or title shown beneath the author. */
7018
7337
  role = input('', /* @ts-ignore */
7019
7338
  ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
7339
+ /** URL of the author's avatar image. */
7020
7340
  avatar = input('', /* @ts-ignore */
7021
7341
  ...(ngDevMode ? [{ debugName: "avatar" }] : /* istanbul ignore next */ []));
7342
+ /** Source URL for the quote, set as the blockquote's `cite` attribute. */
7022
7343
  cite = input('', /* @ts-ignore */
7023
7344
  ...(ngDevMode ? [{ debugName: "cite" }] : /* istanbul ignore next */ []));
7024
7345
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7114,14 +7435,19 @@ const SIZES$2 = { sm: 'text-sm', default: 'text-base', lg: 'text-2xl' };
7114
7435
  const COMPARE_SIZES = { sm: 'text-xs', default: 'text-sm', lg: 'text-base' };
7115
7436
  /** A price display with optional compare-at (strikethrough) and a discount badge. */
7116
7437
  class BuiPrice {
7438
+ /** Current price amount to display. */
7117
7439
  amount = input(0, /* @ts-ignore */
7118
7440
  ...(ngDevMode ? [{ debugName: "amount" }] : /* istanbul ignore next */ []));
7441
+ /** Original price; when higher than amount, shows as struck-through. */
7119
7442
  compareAt = input(null, /* @ts-ignore */
7120
7443
  ...(ngDevMode ? [{ debugName: "compareAt" }] : /* istanbul ignore next */ []));
7444
+ /** Currency symbol prefixed to each value. */
7121
7445
  currency = input('$', /* @ts-ignore */
7122
7446
  ...(ngDevMode ? [{ debugName: "currency" }] : /* istanbul ignore next */ []));
7447
+ /** Text size preset for the price. */
7123
7448
  size = input('default', /* @ts-ignore */
7124
7449
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
7450
+ /** Whether to show the percentage-off discount badge when on sale. */
7125
7451
  showDiscount = input(true, /* @ts-ignore */
7126
7452
  ...(ngDevMode ? [{ debugName: "showDiscount" }] : /* istanbul ignore next */ []));
7127
7453
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7217,14 +7543,19 @@ const JUSTIFY = {
7217
7543
  };
7218
7544
  /** A flexbox stack layout helper (direction, gap, alignment). */
7219
7545
  class BuiStack {
7546
+ /** Flex direction: vertical (`col`) or horizontal (`row`). */
7220
7547
  direction = input('col', /* @ts-ignore */
7221
7548
  ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
7549
+ /** Spacing between items, as a Tailwind gap step. */
7222
7550
  gap = input('4', /* @ts-ignore */
7223
7551
  ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
7552
+ /** Cross-axis alignment (`start`/`center`/`end`/`stretch`/`baseline`). */
7224
7553
  align = input('', /* @ts-ignore */
7225
7554
  ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
7555
+ /** Main-axis distribution (`start`/`center`/`end`/`between`/`around`/`evenly`). */
7226
7556
  justify = input('', /* @ts-ignore */
7227
7557
  ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
7558
+ /** Whether items wrap onto multiple lines when they overflow. */
7228
7559
  wrap = input(false, /* @ts-ignore */
7229
7560
  ...(ngDevMode ? [{ debugName: "wrap" }] : /* istanbul ignore next */ []));
7230
7561
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7246,8 +7577,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7246
7577
  * design tokens locally. Renders as `display: contents` so it adds no box.
7247
7578
  */
7248
7579
  class BuiAccent {
7580
+ /** Accent color applied to the primary tokens; `null` leaves the theme unchanged. */
7249
7581
  color = input(null, /* @ts-ignore */
7250
7582
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
7583
+ /** Foreground color paired with the accent for text/icons on accented surfaces. */
7251
7584
  foreground = input('#ffffff', /* @ts-ignore */
7252
7585
  ...(ngDevMode ? [{ debugName: "foreground" }] : /* istanbul ignore next */ []));
7253
7586
  styleVars = computed(() => {
@@ -7296,14 +7629,19 @@ const LABELS = { online: 'Online', away: 'Away', busy: 'Busy', offline: 'Offline
7296
7629
  const SIZES$1 = { sm: 'size-2', default: 'size-2.5', lg: 'size-3' };
7297
7630
  /** A small status dot (online/away/busy/offline). Status is never colour-only — the label is always present. */
7298
7631
  class BuiPresence {
7632
+ /** Presence state, which sets the dot color and default label. */
7299
7633
  status = input('online', /* @ts-ignore */
7300
7634
  ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
7635
+ /** Size preset for the status dot. */
7301
7636
  size = input('default', /* @ts-ignore */
7302
7637
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
7638
+ /** Whether to show a pulsing ping animation (only when `online`). */
7303
7639
  pulse = input(false, /* @ts-ignore */
7304
7640
  ...(ngDevMode ? [{ debugName: "pulse" }] : /* istanbul ignore next */ []));
7641
+ /** Custom label text; defaults to the status name. */
7305
7642
  label = input('', /* @ts-ignore */
7306
7643
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
7644
+ /** Whether to render the label visibly; otherwise it stays screen-reader only. */
7307
7645
  showLabel = input(false, /* @ts-ignore */
7308
7646
  ...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
7309
7647
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7373,10 +7711,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7373
7711
 
7374
7712
  /** A single timeline entry: a dot + connector line and a content area. */
7375
7713
  class BuiTimelineItem {
7714
+ /** Timestamp label shown above the entry's title. */
7376
7715
  time = input('', /* @ts-ignore */
7377
7716
  ...(ngDevMode ? [{ debugName: "time" }] : /* istanbul ignore next */ []));
7717
+ /** Heading text for the entry. */
7378
7718
  title = input('', /* @ts-ignore */
7379
7719
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
7720
+ /** Whether to highlight this entry as the current/active step. */
7380
7721
  active = input(false, /* @ts-ignore */
7381
7722
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
7382
7723
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7456,8 +7797,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7456
7797
 
7457
7798
  /** A description list (`<dl>`). Children should be `bui-description-item`. */
7458
7799
  class BuiDescriptionList {
7800
+ /** Arrangement of each item's term and description, side by side or stacked. */
7459
7801
  layout = input('horizontal', /* @ts-ignore */
7460
7802
  ...(ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []));
7803
+ /** Whether to render a bordered card with dividers between items. */
7461
7804
  bordered = input(false, /* @ts-ignore */
7462
7805
  ...(ngDevMode ? [{ debugName: "bordered" }] : /* istanbul ignore next */ []));
7463
7806
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7478,6 +7821,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7478
7821
 
7479
7822
  /** A term/description row. Inherits horizontal/bordered layout from its parent list. */
7480
7823
  class BuiDescriptionItem {
7824
+ /** The term label shown in the row's `<dt>`. */
7481
7825
  term = input('', /* @ts-ignore */
7482
7826
  ...(ngDevMode ? [{ debugName: "term" }] : /* istanbul ignore next */ []));
7483
7827
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7526,8 +7870,10 @@ const GAPS = {
7526
7870
  };
7527
7871
  /** A Pinterest-style masonry grid using native CSS multi-column layout. */
7528
7872
  class BuiMasonry {
7873
+ /** Maximum number of columns at the widest breakpoint (1-6, responsive). */
7529
7874
  columns = input(3, /* @ts-ignore */
7530
7875
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
7876
+ /** Spacing between items, as a Tailwind spacing key ('0', '2', '3', '4', '6', '8'). */
7531
7877
  gap = input('4', /* @ts-ignore */
7532
7878
  ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
7533
7879
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7551,6 +7897,7 @@ const COLUMNS$1 = {
7551
7897
  };
7552
7898
  /** A bento grid container. Use `bui-bento-item` for cells. */
7553
7899
  class BuiBentoGrid {
7900
+ /** Number of columns at the largest breakpoint (2, 3 or 4). */
7554
7901
  columns = input(3, /* @ts-ignore */
7555
7902
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
7556
7903
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7571,12 +7918,16 @@ const COL_SPAN = { 1: '', 2: 'lg:col-span-2', 3: 'lg:col-span-3' };
7571
7918
  const ROW_SPAN = { 1: '', 2: 'row-span-2' };
7572
7919
  /** A bento grid cell with optional title/description and configurable span. */
7573
7920
  class BuiBentoItem {
7921
+ /** Optional heading rendered above the projected content. */
7574
7922
  title = input('', /* @ts-ignore */
7575
7923
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
7924
+ /** Optional muted description rendered below the title. */
7576
7925
  description = input('', /* @ts-ignore */
7577
7926
  ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
7927
+ /** How many grid columns the cell spans (1-3). */
7578
7928
  colSpan = input(1, /* @ts-ignore */
7579
7929
  ...(ngDevMode ? [{ debugName: "colSpan" }] : /* istanbul ignore next */ []));
7930
+ /** How many grid rows the cell spans (1-2). */
7580
7931
  rowSpan = input(1, /* @ts-ignore */
7581
7932
  ...(ngDevMode ? [{ debugName: "rowSpan" }] : /* istanbul ignore next */ []));
7582
7933
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7620,10 +7971,13 @@ const COLUMNS = {
7620
7971
  };
7621
7972
  /** A responsive thumbnail grid. */
7622
7973
  class BuiGallery {
7974
+ /** Images to display, given as URLs or `GalleryImage` objects. */
7623
7975
  images = input([], /* @ts-ignore */
7624
7976
  ...(ngDevMode ? [{ debugName: "images" }] : /* istanbul ignore next */ []));
7977
+ /** Number of grid columns (1-6). */
7625
7978
  columns = input(3, /* @ts-ignore */
7626
7979
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
7980
+ /** Tailwind class controlling thumbnail corner rounding. */
7627
7981
  rounded = input('rounded-lg', /* @ts-ignore */
7628
7982
  ...(ngDevMode ? [{ debugName: "rounded" }] : /* istanbul ignore next */ []));
7629
7983
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7657,10 +8011,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7657
8011
 
7658
8012
  /** A veil with a spinner shown over its projected content while `show` is true. */
7659
8013
  class BuiLoadingOverlay {
8014
+ /** Whether the loading veil is shown over the projected content. */
7660
8015
  show = input(false, /* @ts-ignore */
7661
8016
  ...(ngDevMode ? [{ debugName: "show" }] : /* istanbul ignore next */ []));
8017
+ /** Text shown beneath the spinner; defaults to "Loading…" when empty. */
7662
8018
  message = input('', /* @ts-ignore */
7663
8019
  ...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
8020
+ /** Whether the veil blurs the content behind it. */
7664
8021
  blur = input(true, /* @ts-ignore */
7665
8022
  ...(ngDevMode ? [{ debugName: "blur" }] : /* istanbul ignore next */ []));
7666
8023
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7750,20 +8107,35 @@ const INPUT_SIZE = {
7750
8107
  };
7751
8108
  /** A numeric stepper: − / + buttons around a number field, with min/max/step clamping. */
7752
8109
  class BuiNumberInput {
8110
+ /** Current number. Two-way bindable with `[(value)]`. */
7753
8111
  value = model(0, /* @ts-ignore */
7754
8112
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
8113
+ /** Minimum allowed value, or null for no lower bound. */
7755
8114
  min = input(null, /* @ts-ignore */
7756
8115
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
8116
+ /** Maximum allowed value, or null for no upper bound. */
7757
8117
  max = input(null, /* @ts-ignore */
7758
8118
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
8119
+ /** Amount added or subtracted per step. */
7759
8120
  stepBy = input(1, { ...(ngDevMode ? { debugName: "stepBy" } : /* istanbul ignore next */ {}), alias: 'step' });
8121
+ /** Whether the control is disabled. Two-way bindable with `[(disabled)]`. */
7760
8122
  disabled = model(false, /* @ts-ignore */
7761
8123
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
8124
+ /** Size preset controlling stepper button and field dimensions. */
7762
8125
  size = input('default', /* @ts-ignore */
7763
8126
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
8127
+ /** Accessible label for the number field. */
7764
8128
  ariaLabel = input('', /* @ts-ignore */
7765
8129
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
7766
8130
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
8131
+ /** Accessible label override for the decrease button. */
8132
+ decreaseLabel = input(/* @ts-ignore */
8133
+ ...(ngDevMode ? [undefined, { debugName: "decreaseLabel" }] : /* istanbul ignore next */ []));
8134
+ /** Accessible label override for the increase button. */
8135
+ increaseLabel = input(/* @ts-ignore */
8136
+ ...(ngDevMode ? [undefined, { debugName: "increaseLabel" }] : /* istanbul ignore next */ []));
8137
+ decreaseText = buiLabel('numberInputDecrease', this.decreaseLabel);
8138
+ increaseText = buiLabel('numberInputIncrease', this.increaseLabel);
7767
8139
  onChange = noop$9;
7768
8140
  onTouched = noop$9;
7769
8141
  btnClass = computed(() => cn(BTN, BTN_SIZE[this.size()]), /* @ts-ignore */
@@ -7815,7 +8187,7 @@ class BuiNumberInput {
7815
8187
  this.disabled.set(isDisabled);
7816
8188
  }
7817
8189
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiNumberInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
7818
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiNumberInput, isStandalone: true, selector: "bui-number-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, stepBy: { classPropertyName: "stepBy", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", disabled: "disabledChange" }, host: { attributes: { "data-slot": "number-input" }, properties: { "class": "computedClass()" } }, providers: [
8190
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiNumberInput, isStandalone: true, selector: "bui-number-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, stepBy: { classPropertyName: "stepBy", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, decreaseLabel: { classPropertyName: "decreaseLabel", publicName: "decreaseLabel", isSignal: true, isRequired: false, transformFunction: null }, increaseLabel: { classPropertyName: "increaseLabel", publicName: "increaseLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", disabled: "disabledChange" }, host: { attributes: { "data-slot": "number-input" }, properties: { "class": "computedClass()" } }, providers: [
7819
8191
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BuiNumberInput), multi: true },
7820
8192
  ], ngImport: i0, template: `
7821
8193
  <button
@@ -7823,7 +8195,7 @@ class BuiNumberInput {
7823
8195
  [class]="btnClass() + ' rounded-l-md'"
7824
8196
  (click)="step(-1)"
7825
8197
  [disabled]="disabled() || atMin()"
7826
- aria-label="Decrease"
8198
+ [attr.aria-label]="decreaseText()"
7827
8199
  >
7828
8200
  <svg
7829
8201
  viewBox="0 0 24 24"
@@ -7856,7 +8228,7 @@ class BuiNumberInput {
7856
8228
  [class]="btnClass() + ' rounded-r-md'"
7857
8229
  (click)="step(1)"
7858
8230
  [disabled]="disabled() || atMax()"
7859
- aria-label="Increase"
8231
+ [attr.aria-label]="increaseText()"
7860
8232
  >
7861
8233
  <svg
7862
8234
  viewBox="0 0 24 24"
@@ -7887,7 +8259,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7887
8259
  [class]="btnClass() + ' rounded-l-md'"
7888
8260
  (click)="step(-1)"
7889
8261
  [disabled]="disabled() || atMin()"
7890
- aria-label="Decrease"
8262
+ [attr.aria-label]="decreaseText()"
7891
8263
  >
7892
8264
  <svg
7893
8265
  viewBox="0 0 24 24"
@@ -7920,7 +8292,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7920
8292
  [class]="btnClass() + ' rounded-r-md'"
7921
8293
  (click)="step(1)"
7922
8294
  [disabled]="disabled() || atMax()"
7923
- aria-label="Increase"
8295
+ [attr.aria-label]="increaseText()"
7924
8296
  >
7925
8297
  <svg
7926
8298
  viewBox="0 0 24 24"
@@ -7937,18 +8309,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7937
8309
  </button>
7938
8310
  `,
7939
8311
  }]
7940
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], stepBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
8312
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], stepBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], decreaseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "decreaseLabel", required: false }] }], increaseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "increaseLabel", required: false }] }] } });
7941
8313
 
7942
8314
  /** A radio-group of product variants, rendered as pills or colour swatches. */
7943
8315
  class BuiVariantSelector {
8316
+ /** Selected variant value. Two-way bindable with `[(value)]`. */
7944
8317
  value = model('', /* @ts-ignore */
7945
8318
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
8319
+ /** Available options, as plain strings or `VariantOption` objects. */
7946
8320
  options = input([], /* @ts-ignore */
7947
8321
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
8322
+ /** Render style: text pills or colour swatches. */
7948
8323
  type = input('pill', /* @ts-ignore */
7949
8324
  ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
8325
+ /** Accessible label for the radio group. */
7950
8326
  label = input('Variant', /* @ts-ignore */
7951
8327
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
8328
+ /** Whether the whole group is disabled. */
7952
8329
  disabled = input(false, /* @ts-ignore */
7953
8330
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
7954
8331
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -8067,16 +8444,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8067
8444
 
8068
8445
  /** A tiny inline SVG trend chart (line + optional area). Pure, SSR-safe. */
8069
8446
  class BuiSparkline {
8447
+ /** Numeric series to plot; needs at least two points to render. */
8070
8448
  data = input([], /* @ts-ignore */
8071
8449
  ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
8450
+ /** SVG width in pixels. */
8072
8451
  width = input(100, /* @ts-ignore */
8073
8452
  ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
8453
+ /** SVG height in pixels. */
8074
8454
  height = input(28, /* @ts-ignore */
8075
8455
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
8456
+ /** Whether to draw the translucent area fill under the line. */
8076
8457
  area = input(true, /* @ts-ignore */
8077
8458
  ...(ngDevMode ? [{ debugName: "area" }] : /* istanbul ignore next */ []));
8459
+ /** Line stroke width in pixels (also used as edge padding). */
8078
8460
  strokeWidth = input(1.5, /* @ts-ignore */
8079
8461
  ...(ngDevMode ? [{ debugName: "strokeWidth" }] : /* istanbul ignore next */ []));
8462
+ /** Accessible label for the sparkline's `aria-label`. */
8080
8463
  ariaLabel = input('Trend', /* @ts-ignore */
8081
8464
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
8082
8465
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -8183,13 +8566,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8183
8566
  const SIZES = { default: 'h-9 px-4 py-2', sm: 'h-8 gap-1.5 px-3', lg: 'h-10 px-6' };
8184
8567
  /** A stateful add-to-cart button: idle → adding → added → idle. Emits `triggered` on click. */
8185
8568
  class BuiAddToCart {
8569
+ /** Button text shown in the idle and adding states. */
8186
8570
  label = input('Add to cart', /* @ts-ignore */
8187
8571
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
8572
+ /** Button text shown briefly in the added (success) state. */
8188
8573
  addedLabel = input('Added', /* @ts-ignore */
8189
8574
  ...(ngDevMode ? [{ debugName: "addedLabel" }] : /* istanbul ignore next */ []));
8575
+ /** Size preset controlling height and padding. */
8190
8576
  size = input('default', /* @ts-ignore */
8191
8577
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
8192
8578
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
8579
+ /** Emitted when the button is clicked to add the item. */
8193
8580
  triggered = output();
8194
8581
  state = signal('idle', /* @ts-ignore */
8195
8582
  ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
@@ -8364,18 +8751,25 @@ const TEXT_COLORS = [
8364
8751
  ];
8365
8752
  /** A password field with a live strength meter and (optional) requirement checklist. */
8366
8753
  class BuiPasswordStrength {
8754
+ /** Current password value. Two-way bindable with `[(password)]`. */
8367
8755
  password = model('', /* @ts-ignore */
8368
8756
  ...(ngDevMode ? [{ debugName: "password" }] : /* istanbul ignore next */ []));
8757
+ /** Native `name` attribute for the input. */
8369
8758
  name = input('password', /* @ts-ignore */
8370
8759
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
8760
+ /** Input `id`; defaults to `name` when empty. */
8371
8761
  id = input('', /* @ts-ignore */
8372
8762
  ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
8763
+ /** Placeholder text for the input. */
8373
8764
  placeholder = input('••••••••', /* @ts-ignore */
8374
8765
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
8766
+ /** Whether the requirement checklist is shown. */
8375
8767
  showChecklist = input(true, /* @ts-ignore */
8376
8768
  ...(ngDevMode ? [{ debugName: "showChecklist" }] : /* istanbul ignore next */ []));
8769
+ /** Minimum length required to satisfy the length rule. */
8377
8770
  minLength = input(8, /* @ts-ignore */
8378
8771
  ...(ngDevMode ? [{ debugName: "minLength" }] : /* istanbul ignore next */ []));
8772
+ /** Accessible label for the input. */
8379
8773
  label = input('Password', /* @ts-ignore */
8380
8774
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
8381
8775
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -8553,31 +8947,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8553
8947
 
8554
8948
  /** A product card: image, badge, wishlist, title, rating, price, and an action slot. */
8555
8949
  class BuiProductCard {
8950
+ /** Product title shown as the card heading. */
8556
8951
  title = input('', /* @ts-ignore */
8557
8952
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
8953
+ /** Optional link; when set the title becomes an anchor to this URL. */
8558
8954
  href = input('', /* @ts-ignore */
8559
8955
  ...(ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []));
8956
+ /** Source URL of the product image. */
8560
8957
  image = input('', /* @ts-ignore */
8561
8958
  ...(ngDevMode ? [{ debugName: "image" }] : /* istanbul ignore next */ []));
8959
+ /** Alt text for the image; falls back to the title when empty. */
8562
8960
  imageAlt = input('', /* @ts-ignore */
8563
8961
  ...(ngDevMode ? [{ debugName: "imageAlt" }] : /* istanbul ignore next */ []));
8962
+ /** Current price; hides the price block when null. */
8564
8963
  price = input(null, /* @ts-ignore */
8565
8964
  ...(ngDevMode ? [{ debugName: "price" }] : /* istanbul ignore next */ []));
8965
+ /** Original price for showing a strikethrough and discount. */
8566
8966
  compareAt = input(null, /* @ts-ignore */
8567
8967
  ...(ngDevMode ? [{ debugName: "compareAt" }] : /* istanbul ignore next */ []));
8968
+ /** Currency symbol prefixed to the price. */
8568
8969
  currency = input('$', /* @ts-ignore */
8569
8970
  ...(ngDevMode ? [{ debugName: "currency" }] : /* istanbul ignore next */ []));
8971
+ /** Badge text; auto-coloured for sale/new keywords. */
8570
8972
  badge = input('', /* @ts-ignore */
8571
8973
  ...(ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []));
8974
+ /** Small category label shown above the title. */
8572
8975
  category = input('', /* @ts-ignore */
8573
8976
  ...(ngDevMode ? [{ debugName: "category" }] : /* istanbul ignore next */ []));
8977
+ /** Star rating value; hides the rating row when null. */
8574
8978
  rating = input(null, /* @ts-ignore */
8575
8979
  ...(ngDevMode ? [{ debugName: "rating" }] : /* istanbul ignore next */ []));
8980
+ /** Review count shown next to the rating, when set. */
8576
8981
  reviews = input(null, /* @ts-ignore */
8577
8982
  ...(ngDevMode ? [{ debugName: "reviews" }] : /* istanbul ignore next */ []));
8983
+ /** Whether to show the wishlist (heart) toggle button. */
8578
8984
  wishlist = input(false, /* @ts-ignore */
8579
8985
  ...(ngDevMode ? [{ debugName: "wishlist" }] : /* istanbul ignore next */ []));
8580
8986
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
8987
+ /** Accessible label override for the wishlist toggle button. */
8988
+ wishlistLabel = input(/* @ts-ignore */
8989
+ ...(ngDevMode ? [undefined, { debugName: "wishlistLabel" }] : /* istanbul ignore next */ []));
8990
+ wishlistText = buiLabel('productCardWishlist', this.wishlistLabel);
8581
8991
  wished = signal(false, /* @ts-ignore */
8582
8992
  ...(ngDevMode ? [{ debugName: "wished" }] : /* istanbul ignore next */ []));
8583
8993
  alt = computed(() => this.imageAlt() || this.title(), /* @ts-ignore */
@@ -8596,7 +9006,7 @@ class BuiProductCard {
8596
9006
  computedClass = computed(() => cn('group flex flex-col overflow-hidden rounded-xl border bg-card text-card-foreground shadow-sm', this.userClass()), /* @ts-ignore */
8597
9007
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
8598
9008
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiProductCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
8599
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiProductCard, isStandalone: true, selector: "bui-product-card", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: false, transformFunction: null }, imageAlt: { classPropertyName: "imageAlt", publicName: "imageAlt", isSignal: true, isRequired: false, transformFunction: null }, price: { classPropertyName: "price", publicName: "price", isSignal: true, isRequired: false, transformFunction: null }, compareAt: { classPropertyName: "compareAt", publicName: "compareAt", isSignal: true, isRequired: false, transformFunction: null }, currency: { classPropertyName: "currency", publicName: "currency", isSignal: true, isRequired: false, transformFunction: null }, badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, category: { classPropertyName: "category", publicName: "category", isSignal: true, isRequired: false, transformFunction: null }, rating: { classPropertyName: "rating", publicName: "rating", isSignal: true, isRequired: false, transformFunction: null }, reviews: { classPropertyName: "reviews", publicName: "reviews", isSignal: true, isRequired: false, transformFunction: null }, wishlist: { classPropertyName: "wishlist", publicName: "wishlist", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "product-card" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
9009
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiProductCard, isStandalone: true, selector: "bui-product-card", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: false, transformFunction: null }, imageAlt: { classPropertyName: "imageAlt", publicName: "imageAlt", isSignal: true, isRequired: false, transformFunction: null }, price: { classPropertyName: "price", publicName: "price", isSignal: true, isRequired: false, transformFunction: null }, compareAt: { classPropertyName: "compareAt", publicName: "compareAt", isSignal: true, isRequired: false, transformFunction: null }, currency: { classPropertyName: "currency", publicName: "currency", isSignal: true, isRequired: false, transformFunction: null }, badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, category: { classPropertyName: "category", publicName: "category", isSignal: true, isRequired: false, transformFunction: null }, rating: { classPropertyName: "rating", publicName: "rating", isSignal: true, isRequired: false, transformFunction: null }, reviews: { classPropertyName: "reviews", publicName: "reviews", isSignal: true, isRequired: false, transformFunction: null }, wishlist: { classPropertyName: "wishlist", publicName: "wishlist", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, wishlistLabel: { classPropertyName: "wishlistLabel", publicName: "wishlistLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "product-card" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
8600
9010
  <div class="relative aspect-square overflow-hidden bg-muted">
8601
9011
  <img
8602
9012
  [src]="image()"
@@ -8614,7 +9024,7 @@ class BuiProductCard {
8614
9024
  type="button"
8615
9025
  class="absolute end-2 top-2 inline-flex size-8 items-center justify-center rounded-full border bg-background/80 shadow-sm backdrop-blur transition-colors hover:bg-background"
8616
9026
  [attr.aria-pressed]="wished()"
8617
- aria-label="Add to wishlist"
9027
+ [attr.aria-label]="wishlistText()"
8618
9028
  (click)="wished.set(!wished())"
8619
9029
  >
8620
9030
  <svg
@@ -8696,7 +9106,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8696
9106
  type="button"
8697
9107
  class="absolute end-2 top-2 inline-flex size-8 items-center justify-center rounded-full border bg-background/80 shadow-sm backdrop-blur transition-colors hover:bg-background"
8698
9108
  [attr.aria-pressed]="wished()"
8699
- aria-label="Add to wishlist"
9109
+ [attr.aria-label]="wishlistText()"
8700
9110
  (click)="wished.set(!wished())"
8701
9111
  >
8702
9112
  <svg
@@ -8754,23 +9164,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8754
9164
  </div>
8755
9165
  `,
8756
9166
  }]
8757
- }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], image: [{ type: i0.Input, args: [{ isSignal: true, alias: "image", required: false }] }], imageAlt: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageAlt", required: false }] }], price: [{ type: i0.Input, args: [{ isSignal: true, alias: "price", required: false }] }], compareAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareAt", required: false }] }], currency: [{ type: i0.Input, args: [{ isSignal: true, alias: "currency", required: false }] }], badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: false }] }], category: [{ type: i0.Input, args: [{ isSignal: true, alias: "category", required: false }] }], rating: [{ type: i0.Input, args: [{ isSignal: true, alias: "rating", required: false }] }], reviews: [{ type: i0.Input, args: [{ isSignal: true, alias: "reviews", required: false }] }], wishlist: [{ type: i0.Input, args: [{ isSignal: true, alias: "wishlist", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
9167
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], href: [{ type: i0.Input, args: [{ isSignal: true, alias: "href", required: false }] }], image: [{ type: i0.Input, args: [{ isSignal: true, alias: "image", required: false }] }], imageAlt: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageAlt", required: false }] }], price: [{ type: i0.Input, args: [{ isSignal: true, alias: "price", required: false }] }], compareAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareAt", required: false }] }], currency: [{ type: i0.Input, args: [{ isSignal: true, alias: "currency", required: false }] }], badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: false }] }], category: [{ type: i0.Input, args: [{ isSignal: true, alias: "category", required: false }] }], rating: [{ type: i0.Input, args: [{ isSignal: true, alias: "rating", required: false }] }], reviews: [{ type: i0.Input, args: [{ isSignal: true, alias: "reviews", required: false }] }], wishlist: [{ type: i0.Input, args: [{ isSignal: true, alias: "wishlist", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], wishlistLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "wishlistLabel", required: false }] }] } });
8758
9168
 
8759
9169
  /**
8760
9170
  * Types and deletes a cycling list of words. The animated text is `aria-hidden`; an sr-only
8761
9171
  * span carries the full word list so assistive tech reads it once. SSR-safe.
8762
9172
  */
8763
9173
  class BuiTypewriter {
9174
+ /** Words cycled through by the typewriter. */
8764
9175
  words = input([], /* @ts-ignore */
8765
9176
  ...(ngDevMode ? [{ debugName: "words" }] : /* istanbul ignore next */ []));
9177
+ /** Delay between typed characters, in milliseconds. */
8766
9178
  typeSpeed = input(90, /* @ts-ignore */
8767
9179
  ...(ngDevMode ? [{ debugName: "typeSpeed" }] : /* istanbul ignore next */ []));
9180
+ /** Delay between deleted characters, in milliseconds. */
8768
9181
  deleteSpeed = input(40, /* @ts-ignore */
8769
9182
  ...(ngDevMode ? [{ debugName: "deleteSpeed" }] : /* istanbul ignore next */ []));
9183
+ /** Pause once a word is fully typed before deleting, in milliseconds. */
8770
9184
  pause = input(1600, /* @ts-ignore */
8771
9185
  ...(ngDevMode ? [{ debugName: "pause" }] : /* istanbul ignore next */ []));
9186
+ /** Whether to restart from the first word after the last. */
8772
9187
  loop = input(true, /* @ts-ignore */
8773
9188
  ...(ngDevMode ? [{ debugName: "loop" }] : /* istanbul ignore next */ []));
9189
+ /** Whether to show the blinking cursor after the text. */
8774
9190
  cursor = input(true, /* @ts-ignore */
8775
9191
  ...(ngDevMode ? [{ debugName: "cursor" }] : /* istanbul ignore next */ []));
8776
9192
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -8867,14 +9283,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8867
9283
  * an `aria-live` region carries the full passage up front. SSR-safe.
8868
9284
  */
8869
9285
  class BuiStreamingText {
9286
+ /** Full passage to reveal; also announced up front via an `aria-live` region. */
8870
9287
  text = input('', /* @ts-ignore */
8871
9288
  ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
9289
+ /** Delay in milliseconds between each revealed token. */
8872
9290
  speed = input(18, /* @ts-ignore */
8873
9291
  ...(ngDevMode ? [{ debugName: "speed" }] : /* istanbul ignore next */ []));
9292
+ /** Delay in milliseconds before streaming begins. */
8874
9293
  startDelay = input(0, /* @ts-ignore */
8875
9294
  ...(ngDevMode ? [{ debugName: "startDelay" }] : /* istanbul ignore next */ []));
9295
+ /** Granularity of the reveal — one character or one word at a time. */
8876
9296
  by = input('char', /* @ts-ignore */
8877
9297
  ...(ngDevMode ? [{ debugName: "by" }] : /* istanbul ignore next */ []));
9298
+ /** Whether to show a blinking caret while streaming. */
8878
9299
  caret = input(true, /* @ts-ignore */
8879
9300
  ...(ngDevMode ? [{ debugName: "caret" }] : /* istanbul ignore next */ []));
8880
9301
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -8949,10 +9370,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8949
9370
 
8950
9371
  /** A card whose border has a light beam continuously travelling around it. */
8951
9372
  class BuiBorderBeam {
9373
+ /** Seconds for the beam to complete one full lap. */
8952
9374
  duration = input(6, /* @ts-ignore */
8953
9375
  ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
9376
+ /** Beam colour; defaults to the primary theme colour. */
8954
9377
  color = input(null, /* @ts-ignore */
8955
9378
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
9379
+ /** Border/beam thickness in pixels. */
8956
9380
  size = input(2, /* @ts-ignore */
8957
9381
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
8958
9382
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -8985,8 +9409,10 @@ function pseudo(seed) {
8985
9409
  }
8986
9410
  /** Animated falling meteor streaks behind content. Decorative + SSR-safe. */
8987
9411
  class BuiMeteors {
9412
+ /** Number of meteor streaks to render. */
8988
9413
  count = input(20, /* @ts-ignore */
8989
9414
  ...(ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []));
9415
+ /** Meteor colour; defaults to a translucent foreground tint. */
8990
9416
  color = input(null, /* @ts-ignore */
8991
9417
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
8992
9418
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9044,8 +9470,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9044
9470
 
9045
9471
  /** An animated aurora / northern-lights gradient background with content overlaid. */
9046
9472
  class BuiAurora {
9473
+ /** Blur radius of the aurora layer in pixels. */
9047
9474
  blur = input(60, /* @ts-ignore */
9048
9475
  ...(ngDevMode ? [{ debugName: "blur" }] : /* istanbul ignore next */ []));
9476
+ /** Seconds for one full drift animation cycle. */
9049
9477
  speed = input(12, /* @ts-ignore */
9050
9478
  ...(ngDevMode ? [{ debugName: "speed" }] : /* istanbul ignore next */ []));
9051
9479
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9071,14 +9499,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9071
9499
 
9072
9500
  /** A seamless infinite scroll of `items` (logos, badges, testimonials…). */
9073
9501
  class BuiMarquee {
9502
+ /** Items rendered in sequence and scrolled seamlessly. */
9074
9503
  items = input([], /* @ts-ignore */
9075
9504
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
9505
+ /** Scroll direction; `up`/`down` switch the marquee to a vertical track. */
9076
9506
  direction = input('left', /* @ts-ignore */
9077
9507
  ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
9508
+ /** Time for one full loop, as a CSS duration (e.g. `40s`). */
9078
9509
  duration = input('40s', /* @ts-ignore */
9079
9510
  ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
9511
+ /** Spacing between items, as a CSS length. */
9080
9512
  gap = input('1rem', /* @ts-ignore */
9081
9513
  ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
9514
+ /** Whether hovering pauses the scroll animation. */
9082
9515
  pauseOnHover = input(true, /* @ts-ignore */
9083
9516
  ...(ngDevMode ? [{ debugName: "pauseOnHover" }] : /* istanbul ignore next */ []));
9084
9517
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9158,6 +9591,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9158
9591
 
9159
9592
  /** A mobile bottom tab bar. Use `[buiBottomNavItem]` on each `<a>`/`<button>`. */
9160
9593
  class BuiBottomNavigation {
9594
+ /** Accessible label applied to the navigation element. */
9161
9595
  ariaLabel = input('Bottom navigation', /* @ts-ignore */
9162
9596
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
9163
9597
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9180,10 +9614,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9180
9614
 
9181
9615
  /** A single bottom-navigation tab. Project the icon; pass `label`, `active`, `badge`. */
9182
9616
  class BuiBottomNavigationItem {
9617
+ /** Caption shown beneath the projected icon; hidden when empty. */
9183
9618
  label = input('', /* @ts-ignore */
9184
9619
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
9620
+ /** Whether this tab is the current page; sets `aria-current="page"`. */
9185
9621
  active = input(false, /* @ts-ignore */
9186
9622
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
9623
+ /** Badge content; `true` renders a dot, a string/number renders a count, `null` shows nothing. */
9187
9624
  badge = input(null, /* @ts-ignore */
9188
9625
  ...(ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []));
9189
9626
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9242,6 +9679,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9242
9679
  * viewport. Server-renders fully revealed (no-JS safe). SSR-safe.
9243
9680
  */
9244
9681
  class BuiTextReveal {
9682
+ /** Text split into words that brighten one by one as it scrolls into view. */
9245
9683
  text = input('', /* @ts-ignore */
9246
9684
  ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
9247
9685
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9301,8 +9739,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9301
9739
 
9302
9740
  /** Shifts its content relative to scroll for a depth/parallax effect. SSR-safe. */
9303
9741
  class BuiParallax {
9742
+ /** Parallax intensity; higher moves content more per scroll. */
9304
9743
  speed = input(0.3, /* @ts-ignore */
9305
9744
  ...(ngDevMode ? [{ debugName: "speed" }] : /* istanbul ignore next */ []));
9745
+ /** Axis along which the content shifts. */
9306
9746
  axis = input('y', /* @ts-ignore */
9307
9747
  ...(ngDevMode ? [{ debugName: "axis" }] : /* istanbul ignore next */ []));
9308
9748
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9347,9 +9787,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9347
9787
 
9348
9788
  /** A "on this page" nav that highlights the section currently in view (IntersectionObserver). */
9349
9789
  class BuiScrollspy {
9790
+ /** Sections to track; each item links to and observes its `href` anchor. */
9350
9791
  items = input([], /* @ts-ignore */
9351
9792
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
9352
9793
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
9794
+ /** Accessible label for the nav element; falls back to a localized default. */
9795
+ label = input(/* @ts-ignore */
9796
+ ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
9797
+ labelText = buiLabel('scrollspy', this.label);
9353
9798
  document = inject(ElementRef).nativeElement.ownerDocument;
9354
9799
  active = signal('', /* @ts-ignore */
9355
9800
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
@@ -9391,8 +9836,8 @@ class BuiScrollspy {
9391
9836
  }
9392
9837
  }
9393
9838
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiScrollspy, deps: [], target: i0.ɵɵFactoryTarget.Component });
9394
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiScrollspy, isStandalone: true, selector: "bui-scrollspy", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "scrollspy" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
9395
- <nav aria-label="On this page">
9839
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiScrollspy, isStandalone: true, selector: "bui-scrollspy", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "scrollspy" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
9840
+ <nav [attr.aria-label]="labelText()">
9396
9841
  <ul class="space-y-1 text-sm">
9397
9842
  @for (item of items(); track item.href) {
9398
9843
  <li>
@@ -9415,7 +9860,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9415
9860
  selector: 'bui-scrollspy',
9416
9861
  host: { 'data-slot': 'scrollspy', '[class]': 'computedClass()' },
9417
9862
  template: `
9418
- <nav aria-label="On this page">
9863
+ <nav [attr.aria-label]="labelText()">
9419
9864
  <ul class="space-y-1 text-sm">
9420
9865
  @for (item of items(); track item.href) {
9421
9866
  <li>
@@ -9432,25 +9877,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9432
9877
  </nav>
9433
9878
  `,
9434
9879
  }]
9435
- }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
9880
+ }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
9436
9881
 
9437
9882
  // eslint-disable-next-line @typescript-eslint/no-empty-function
9438
9883
  const noop$8 = () => { };
9439
9884
  const SELECT_CLASS = 'h-9 rounded-md border border-input bg-background px-2 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50';
9440
9885
  /** A styled time field: a native `<input type="time">`, or hour/minute selects in `select` mode. */
9441
9886
  class BuiTimeField {
9887
+ /** Selected time as `HH:mm`. Two-way bindable with `[(value)]`. */
9442
9888
  value = model('', /* @ts-ignore */
9443
9889
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
9890
+ /** Native `name` attribute for the input. */
9444
9891
  name = input('', /* @ts-ignore */
9445
9892
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
9893
+ /** Native `id` attribute for the input. */
9446
9894
  id = input('', /* @ts-ignore */
9447
9895
  ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
9896
+ /** Earliest allowed time (`HH:mm`) in `input` mode. */
9448
9897
  min = input('', /* @ts-ignore */
9449
9898
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
9899
+ /** Latest allowed time (`HH:mm`) in `input` mode. */
9450
9900
  max = input('', /* @ts-ignore */
9451
9901
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
9902
+ /** Whether to include seconds in `input` mode. */
9452
9903
  seconds = input(false, /* @ts-ignore */
9453
9904
  ...(ngDevMode ? [{ debugName: "seconds" }] : /* istanbul ignore next */ []));
9905
+ /** Whether the field is disabled. Two-way bindable with `[(disabled)]`. */
9454
9906
  disabled = model(false, /* @ts-ignore */
9455
9907
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
9456
9908
  /** `select` renders hour + minute dropdowns instead of a native time input. */
@@ -9459,6 +9911,7 @@ class BuiTimeField {
9459
9911
  /** Minute step used in `select` mode. */
9460
9912
  minuteStep = input(5, /* @ts-ignore */
9461
9913
  ...(ngDevMode ? [{ debugName: "minuteStep" }] : /* istanbul ignore next */ []));
9914
+ /** Accessible label for the field. */
9462
9915
  ariaLabel = input('', /* @ts-ignore */
9463
9916
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
9464
9917
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9609,10 +10062,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9609
10062
 
9610
10063
  /** A group of toggle buttons (single or multiple selection). Use `button[buiToggleGroupItem]`. */
9611
10064
  class BuiToggleGroup {
10065
+ /** Selection mode: single value or an array of values. */
9612
10066
  type = input('single', /* @ts-ignore */
9613
10067
  ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
10068
+ /** Selected value(s). Two-way bindable with `[(value)]`. */
9614
10069
  value = model(null, /* @ts-ignore */
9615
10070
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
10071
+ /** Layout direction of the group. */
9616
10072
  orientation = input('horizontal', /* @ts-ignore */
9617
10073
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
9618
10074
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9658,8 +10114,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9658
10114
 
9659
10115
  /** A single item within a `bui-toggle-group`. */
9660
10116
  class BuiToggleGroupItem {
10117
+ /** Value this item contributes to the parent group's selection. */
9661
10118
  value = input('', /* @ts-ignore */
9662
10119
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
10120
+ /** Whether this item is disabled. */
9663
10121
  disabled = input(false, /* @ts-ignore */
9664
10122
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
9665
10123
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9692,12 +10150,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9692
10150
  const noop$7 = () => { };
9693
10151
  /** A free-text tags input: type and press Enter (or comma) to add chips; Backspace removes. */
9694
10152
  class BuiTagsInput {
10153
+ /** Current tags. Two-way bindable with `[(tags)]`. */
9695
10154
  tags = model([], /* @ts-ignore */
9696
10155
  ...(ngDevMode ? [{ debugName: "tags" }] : /* istanbul ignore next */ []));
10156
+ /** Placeholder text shown in the entry field. */
9697
10157
  placeholder = input('Add tag…', /* @ts-ignore */
9698
10158
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
10159
+ /** Maximum number of tags allowed, or `null` for no limit. */
9699
10160
  max = input(null, /* @ts-ignore */
9700
10161
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
10162
+ /** Whether the input is disabled. Two-way bindable with `[(disabled)]`. */
9701
10163
  disabled = model(false, /* @ts-ignore */
9702
10164
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
9703
10165
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9822,10 +10284,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9822
10284
 
9823
10285
  /** Click-to-edit inline text: shows a value, swaps to an input on click. Enter commits, Escape cancels. */
9824
10286
  class BuiEditable {
10287
+ /** Current text. Two-way bindable with `[(value)]`. */
9825
10288
  value = model('', /* @ts-ignore */
9826
10289
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
10290
+ /** Text shown when the value is empty. */
9827
10291
  placeholder = input('Empty', /* @ts-ignore */
9828
10292
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
10293
+ /** Noun used in the field's accessible label. */
9829
10294
  label = input('value', /* @ts-ignore */
9830
10295
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
9831
10296
  /** Edit in a multi-line textarea instead of a single-line input. */
@@ -9952,10 +10417,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9952
10417
 
9953
10418
  /** A floating action button that expands to a stack of actions. Closes on Escape / outside click. */
9954
10419
  class BuiSpeedDial {
10420
+ /** Actions revealed when the dial expands. */
9955
10421
  actions = input([], /* @ts-ignore */
9956
10422
  ...(ngDevMode ? [{ debugName: "actions" }] : /* istanbul ignore next */ []));
10423
+ /** Direction the action stack expands relative to the trigger button. */
9957
10424
  direction = input('up', /* @ts-ignore */
9958
10425
  ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
10426
+ /** Accessible label for the trigger button. */
9959
10427
  label = input('Open actions', /* @ts-ignore */
9960
10428
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
9961
10429
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10086,18 +10554,25 @@ const CIRC = 2 * Math.PI * RADIUS;
10086
10554
  const ARC = CIRC * 0.75;
10087
10555
  /** A rotary dial input (role="slider"). Drag, scroll, or use the keyboard. 270° sweep. */
10088
10556
  class BuiKnob {
10557
+ /** Current value. Two-way bindable with `[(value)]`. */
10089
10558
  value = model(50, /* @ts-ignore */
10090
10559
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
10560
+ /** Minimum value at the start of the dial's sweep. */
10091
10561
  min = input(0, /* @ts-ignore */
10092
10562
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
10563
+ /** Maximum value at the end of the dial's sweep. */
10093
10564
  max = input(100, /* @ts-ignore */
10094
10565
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
10566
+ /** Increment applied per arrow key, scroll or drag snap. */
10095
10567
  step = input(1, /* @ts-ignore */
10096
10568
  ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
10569
+ /** Size preset controlling the knob's diameter and text size. */
10097
10570
  size = input('default', /* @ts-ignore */
10098
10571
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
10572
+ /** Accessible label announced for the slider. */
10099
10573
  label = input('Value', /* @ts-ignore */
10100
10574
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
10575
+ /** Whether the knob is disabled. Two-way bindable with `[(disabled)]`. */
10101
10576
  disabled = model(false, /* @ts-ignore */
10102
10577
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
10103
10578
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10342,16 +10817,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10342
10817
 
10343
10818
  /** A lazy image with a blurred placeholder / skeleton and a graceful error state. */
10344
10819
  class BuiImage {
10820
+ /** Source URL of the full image to load. */
10345
10821
  src = input('', /* @ts-ignore */
10346
10822
  ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
10823
+ /** Alternative text for the image. */
10347
10824
  alt = input('', /* @ts-ignore */
10348
10825
  ...(ngDevMode ? [{ debugName: "alt" }] : /* istanbul ignore next */ []));
10826
+ /** CSS `aspect-ratio` reserved for the image (e.g. `16 / 9`). */
10349
10827
  ratio = input('', /* @ts-ignore */
10350
10828
  ...(ngDevMode ? [{ debugName: "ratio" }] : /* istanbul ignore next */ []));
10829
+ /** URL of a low-res image shown blurred while the full image loads. */
10351
10830
  placeholder = input('', /* @ts-ignore */
10352
10831
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
10832
+ /** Tailwind class controlling corner rounding. */
10353
10833
  rounded = input('rounded-lg', /* @ts-ignore */
10354
10834
  ...(ngDevMode ? [{ debugName: "rounded" }] : /* istanbul ignore next */ []));
10835
+ /** How the image fills its box: `cover` crops, `contain` letterboxes. */
10355
10836
  fit = input('cover', /* @ts-ignore */
10356
10837
  ...(ngDevMode ? [{ debugName: "fit" }] : /* istanbul ignore next */ []));
10357
10838
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10457,10 +10938,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10457
10938
 
10458
10939
  /** A collapsible "reasoning" / chain-of-thought disclosure. */
10459
10940
  class BuiReasoning {
10941
+ /** Whether the disclosure is expanded. Two-way bindable with `[(open)]`. */
10460
10942
  open = model(false, /* @ts-ignore */
10461
10943
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
10944
+ /** Trigger label shown when no `duration` is set. */
10462
10945
  label = input('Reasoning', /* @ts-ignore */
10463
10946
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
10947
+ /** When set, the trigger reads "Thought for {duration}" instead of `label`. */
10464
10948
  duration = input('', /* @ts-ignore */
10465
10949
  ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
10466
10950
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10547,14 +11031,19 @@ const STATUS = {
10547
11031
  };
10548
11032
  /** An AI tool-call card with a status indicator and collapsible arguments / result. */
10549
11033
  class BuiToolCall {
11034
+ /** Name of the invoked tool, shown as inline code in the header. */
10550
11035
  name = input('tool', /* @ts-ignore */
10551
11036
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
11037
+ /** Execution status; drives the colored status dot and label. */
10552
11038
  status = input('success', /* @ts-ignore */
10553
11039
  ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
11040
+ /** Tool arguments shown in the collapsible body when present. */
10554
11041
  args = input('', /* @ts-ignore */
10555
11042
  ...(ngDevMode ? [{ debugName: "args" }] : /* istanbul ignore next */ []));
11043
+ /** Tool result shown in the collapsible body when present. */
10556
11044
  result = input('', /* @ts-ignore */
10557
11045
  ...(ngDevMode ? [{ debugName: "result" }] : /* istanbul ignore next */ []));
11046
+ /** Whether the arguments/result panel is expanded. Two-way bindable with `[(open)]`. */
10558
11047
  open = model(false, /* @ts-ignore */
10559
11048
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
10560
11049
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10656,6 +11145,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10656
11145
 
10657
11146
  /** A scrollable conversation log (`role="log"`). Use `bui-chat-message` for bubbles. */
10658
11147
  class BuiChat {
11148
+ /** Accessible label announced for the conversation log region. */
10659
11149
  ariaLabel = input('Conversation', /* @ts-ignore */
10660
11150
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
10661
11151
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10681,14 +11171,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10681
11171
 
10682
11172
  /** A chat bubble. `role="user"` aligns end with a primary bubble; otherwise assistant-styled. */
10683
11173
  class BuiChatMessage {
11174
+ /** Author role; `'user'` aligns the bubble to the end with primary styling, else assistant-styled. */
10684
11175
  role = input('assistant', /* @ts-ignore */
10685
11176
  ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
11177
+ /** Display name shown above the bubble; also seeds the fallback initials avatar. */
10686
11178
  name = input('', /* @ts-ignore */
10687
11179
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
11180
+ /** Optional timestamp text shown beside the name. */
10688
11181
  time = input('', /* @ts-ignore */
10689
11182
  ...(ngDevMode ? [{ debugName: "time" }] : /* istanbul ignore next */ []));
11183
+ /** Avatar image URL; when empty, initials (or an emoji) are shown instead. */
10690
11184
  avatar = input('', /* @ts-ignore */
10691
11185
  ...(ngDevMode ? [{ debugName: "avatar" }] : /* istanbul ignore next */ []));
11186
+ /** When true, shows an animated typing indicator instead of the message content. */
10692
11187
  typing = input(false, /* @ts-ignore */
10693
11188
  ...(ngDevMode ? [{ debugName: "typing" }] : /* istanbul ignore next */ []));
10694
11189
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10802,10 +11297,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10802
11297
  const PALETTE$1 = ['#6366f1', '#ec4899', '#f59e0b', '#10b981', '#3b82f6', '#ef4444'];
10803
11298
  /** A celebratory particle burst. Project a trigger (or use the default button) to fire it. */
10804
11299
  class BuiConfetti {
11300
+ /** Number of particles emitted per burst. */
10805
11301
  count = input(80, /* @ts-ignore */
10806
11302
  ...(ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []));
11303
+ /** Horizontal spread factor of the burst. */
10807
11304
  spread = input(70, /* @ts-ignore */
10808
11305
  ...(ngDevMode ? [{ debugName: "spread" }] : /* istanbul ignore next */ []));
11306
+ /** Particle colours; defaults to the built-in palette. */
10809
11307
  colors = input(null, /* @ts-ignore */
10810
11308
  ...(ngDevMode ? [{ debugName: "colors" }] : /* istanbul ignore next */ []));
10811
11309
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10890,8 +11388,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10890
11388
 
10891
11389
  /** A step indicator. The `value` (1-based) marks the active step. Use `li[buiStepperItem]`. */
10892
11390
  class BuiStepper {
11391
+ /** The active step as a 1-based index; items at lower values are marked completed. */
10893
11392
  value = input(1, /* @ts-ignore */
10894
11393
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
11394
+ /** Layout direction of the steps, horizontal or vertical. */
10895
11395
  orientation = input('horizontal', /* @ts-ignore */
10896
11396
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
10897
11397
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10936,6 +11436,7 @@ const INDICATOR = {
10936
11436
  };
10937
11437
  /** A single step within a `bui-stepper`. Resolves completed/active/inactive from the parent. */
10938
11438
  class BuiStepperItem {
11439
+ /** This item's 1-based position; compared against the parent's value to derive its state. */
10939
11440
  step = input(1, /* @ts-ignore */
10940
11441
  ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
10941
11442
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11031,17 +11532,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11031
11532
  const noop$5 = () => { };
11032
11533
  /** A one-time-password input: a row of single-character boxes with focus management + paste. */
11033
11534
  class BuiInputOtp {
11535
+ /** Current code. Two-way bindable with `[(value)]`. */
11034
11536
  value = model('', /* @ts-ignore */
11035
11537
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
11538
+ /** Number of character boxes (length of the code). */
11036
11539
  maxlength = input(6, /* @ts-ignore */
11037
11540
  ...(ngDevMode ? [{ debugName: "maxlength" }] : /* istanbul ignore next */ []));
11541
+ /** Whether the input is disabled. Two-way bindable with `[(disabled)]`. */
11038
11542
  disabled = model(false, /* @ts-ignore */
11039
11543
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
11544
+ /** Whether to allow letters as well as digits. */
11040
11545
  alphanumeric = input(false, /* @ts-ignore */
11041
11546
  ...(ngDevMode ? [{ debugName: "alphanumeric" }] : /* istanbul ignore next */ []));
11042
11547
  /** Insert a visual separator after every N boxes (0 = none). */
11043
11548
  groupSize = input(0, /* @ts-ignore */
11044
11549
  ...(ngDevMode ? [{ debugName: "groupSize" }] : /* istanbul ignore next */ []));
11550
+ /** Base accessible label; each box appends its position. */
11045
11551
  ariaLabel = input('One-time password', /* @ts-ignore */
11046
11552
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
11047
11553
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11183,17 +11689,30 @@ const COUNTRIES = [
11183
11689
  ];
11184
11690
  /** A phone number field with a country-code selector. */
11185
11691
  class BuiPhoneInput {
11692
+ /** Entered phone number. Two-way bindable with `[(value)]`. */
11186
11693
  value = model('', /* @ts-ignore */
11187
11694
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
11695
+ /** Selected country code. Two-way bindable with `[(country)]`. */
11188
11696
  country = model('US', /* @ts-ignore */
11189
11697
  ...(ngDevMode ? [{ debugName: "country" }] : /* istanbul ignore next */ []));
11698
+ /** Name attribute applied to the number input for form submission. */
11190
11699
  name = input('', /* @ts-ignore */
11191
11700
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
11701
+ /** Id attribute applied to the number input. */
11192
11702
  id = input('', /* @ts-ignore */
11193
11703
  ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
11704
+ /** Placeholder text for the number input. */
11194
11705
  placeholder = input('Phone number', /* @ts-ignore */
11195
11706
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
11196
11707
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
11708
+ /** Accessible label override for the country selector. */
11709
+ countryLabel = input(/* @ts-ignore */
11710
+ ...(ngDevMode ? [undefined, { debugName: "countryLabel" }] : /* istanbul ignore next */ []));
11711
+ /** Accessible label override for the number input. */
11712
+ numberLabel = input(/* @ts-ignore */
11713
+ ...(ngDevMode ? [undefined, { debugName: "numberLabel" }] : /* istanbul ignore next */ []));
11714
+ countryText = buiLabel('phoneInputCountry', this.countryLabel);
11715
+ numberText = buiLabel('phoneInputNumber', this.numberLabel);
11197
11716
  countries = COUNTRIES;
11198
11717
  computedClass = computed(() => cn('flex w-full items-stretch', this.userClass()), /* @ts-ignore */
11199
11718
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
@@ -11204,11 +11723,11 @@ class BuiPhoneInput {
11204
11723
  this.value.set(event.target.value);
11205
11724
  }
11206
11725
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiPhoneInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
11207
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiPhoneInput, isStandalone: true, selector: "bui-phone-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, country: { classPropertyName: "country", publicName: "country", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", country: "countryChange" }, host: { attributes: { "data-slot": "phone-input" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
11726
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiPhoneInput, isStandalone: true, selector: "bui-phone-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, country: { classPropertyName: "country", publicName: "country", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, countryLabel: { classPropertyName: "countryLabel", publicName: "countryLabel", isSignal: true, isRequired: false, transformFunction: null }, numberLabel: { classPropertyName: "numberLabel", publicName: "numberLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", country: "countryChange" }, host: { attributes: { "data-slot": "phone-input" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
11208
11727
  <select
11209
11728
  [value]="country()"
11210
11729
  class="h-9 rounded-md rounded-r-none border border-r-0 border-input bg-background ps-2 pe-1 text-sm outline-none focus-visible:z-10 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
11211
- aria-label="Country code"
11730
+ [attr.aria-label]="countryText()"
11212
11731
  (change)="onCountry($event)"
11213
11732
  >
11214
11733
  @for (option of countries; track option.code) {
@@ -11221,7 +11740,7 @@ class BuiPhoneInput {
11221
11740
  [placeholder]="placeholder()"
11222
11741
  [attr.name]="name() || null"
11223
11742
  [attr.id]="id() || null"
11224
- aria-label="Phone number"
11743
+ [attr.aria-label]="numberText()"
11225
11744
  class="h-9 w-full min-w-0 rounded-md rounded-l-none border border-input bg-transparent px-3 text-sm shadow-xs outline-none focus-visible:z-10 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
11226
11745
  (input)="onNumber($event)"
11227
11746
  />
@@ -11236,7 +11755,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11236
11755
  <select
11237
11756
  [value]="country()"
11238
11757
  class="h-9 rounded-md rounded-r-none border border-r-0 border-input bg-background ps-2 pe-1 text-sm outline-none focus-visible:z-10 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
11239
- aria-label="Country code"
11758
+ [attr.aria-label]="countryText()"
11240
11759
  (change)="onCountry($event)"
11241
11760
  >
11242
11761
  @for (option of countries; track option.code) {
@@ -11249,28 +11768,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11249
11768
  [placeholder]="placeholder()"
11250
11769
  [attr.name]="name() || null"
11251
11770
  [attr.id]="id() || null"
11252
- aria-label="Phone number"
11771
+ [attr.aria-label]="numberText()"
11253
11772
  class="h-9 w-full min-w-0 rounded-md rounded-l-none border border-input bg-transparent px-3 text-sm shadow-xs outline-none focus-visible:z-10 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
11254
11773
  (input)="onNumber($event)"
11255
11774
  />
11256
11775
  `,
11257
11776
  }]
11258
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], country: [{ type: i0.Input, args: [{ isSignal: true, alias: "country", required: false }] }, { type: i0.Output, args: ["countryChange"] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
11777
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], country: [{ type: i0.Input, args: [{ isSignal: true, alias: "country", required: false }] }, { type: i0.Output, args: ["countryChange"] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], countryLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "countryLabel", required: false }] }], numberLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "numberLabel", required: false }] }] } });
11259
11778
 
11260
11779
  /** A chat composer: an autosizing textarea with a send button. Emits `submitted` on send. */
11261
11780
  class BuiPromptInput {
11781
+ /** Current textarea content. Two-way bindable with `[(value)]`. */
11262
11782
  value = model('', /* @ts-ignore */
11263
11783
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
11784
+ /** Placeholder text shown when the textarea is empty. */
11264
11785
  placeholder = input('Send a message…', /* @ts-ignore */
11265
11786
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
11787
+ /** Whether to show the attachment button. */
11266
11788
  attachable = input(false, /* @ts-ignore */
11267
11789
  ...(ngDevMode ? [{ debugName: "attachable" }] : /* istanbul ignore next */ []));
11790
+ /** Disables the textarea and send button. */
11268
11791
  disabled = input(false, /* @ts-ignore */
11269
11792
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
11793
+ /** Accessible label for the message textarea. */
11270
11794
  ariaLabel = input('Message', /* @ts-ignore */
11271
11795
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
11796
+ /** Overrides the localized accessible label for the attachment button. */
11797
+ attachLabel = input(/* @ts-ignore */
11798
+ ...(ngDevMode ? [undefined, { debugName: "attachLabel" }] : /* istanbul ignore next */ []));
11799
+ /** Overrides the localized accessible label for the send button. */
11800
+ sendLabel = input(/* @ts-ignore */
11801
+ ...(ngDevMode ? [undefined, { debugName: "sendLabel" }] : /* istanbul ignore next */ []));
11802
+ /** Emitted with the trimmed message text when the user sends. */
11272
11803
  submitted = output();
11273
11804
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
11805
+ attachText = buiLabel('promptInputAttach', this.attachLabel);
11806
+ sendText = buiLabel('promptInputSend', this.sendLabel);
11274
11807
  ta = viewChild('ta', /* @ts-ignore */
11275
11808
  ...(ngDevMode ? [{ debugName: "ta" }] : /* istanbul ignore next */ []));
11276
11809
  computedClass = computed(() => cn('flex flex-col rounded-xl border border-input bg-transparent focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50', this.userClass()), /* @ts-ignore */
@@ -11309,7 +11842,7 @@ class BuiPromptInput {
11309
11842
  element.style.height = `${element.scrollHeight}px`;
11310
11843
  }
11311
11844
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiPromptInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
11312
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiPromptInput, isStandalone: true, selector: "bui-prompt-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, attachable: { classPropertyName: "attachable", publicName: "attachable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", submitted: "submitted" }, host: { attributes: { "data-slot": "prompt-input" }, properties: { "class": "computedClass()" } }, viewQueries: [{ propertyName: "ta", first: true, predicate: ["ta"], descendants: true, isSignal: true }], ngImport: i0, template: `
11845
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiPromptInput, isStandalone: true, selector: "bui-prompt-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, attachable: { classPropertyName: "attachable", publicName: "attachable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, attachLabel: { classPropertyName: "attachLabel", publicName: "attachLabel", isSignal: true, isRequired: false, transformFunction: null }, sendLabel: { classPropertyName: "sendLabel", publicName: "sendLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", submitted: "submitted" }, host: { attributes: { "data-slot": "prompt-input" }, properties: { "class": "computedClass()" } }, viewQueries: [{ propertyName: "ta", first: true, predicate: ["ta"], descendants: true, isSignal: true }], ngImport: i0, template: `
11313
11846
  <textarea
11314
11847
  #ta
11315
11848
  rows="1"
@@ -11325,7 +11858,7 @@ class BuiPromptInput {
11325
11858
  @if (attachable()) {
11326
11859
  <button
11327
11860
  type="button"
11328
- aria-label="Attach file"
11861
+ [attr.aria-label]="attachText()"
11329
11862
  class="inline-flex size-8 items-center justify-center text-muted-foreground hover:text-foreground"
11330
11863
  >
11331
11864
  <svg
@@ -11348,7 +11881,7 @@ class BuiPromptInput {
11348
11881
  type="button"
11349
11882
  class="ml-auto inline-flex size-8 items-center justify-center rounded-md bg-primary text-primary-foreground disabled:opacity-50"
11350
11883
  [disabled]="disabled() || value().trim() === ''"
11351
- aria-label="Send"
11884
+ [attr.aria-label]="sendText()"
11352
11885
  (click)="send()"
11353
11886
  >
11354
11887
  <svg
@@ -11389,7 +11922,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11389
11922
  @if (attachable()) {
11390
11923
  <button
11391
11924
  type="button"
11392
- aria-label="Attach file"
11925
+ [attr.aria-label]="attachText()"
11393
11926
  class="inline-flex size-8 items-center justify-center text-muted-foreground hover:text-foreground"
11394
11927
  >
11395
11928
  <svg
@@ -11412,7 +11945,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11412
11945
  type="button"
11413
11946
  class="ml-auto inline-flex size-8 items-center justify-center rounded-md bg-primary text-primary-foreground disabled:opacity-50"
11414
11947
  [disabled]="disabled() || value().trim() === ''"
11415
- aria-label="Send"
11948
+ [attr.aria-label]="sendText()"
11416
11949
  (click)="send()"
11417
11950
  >
11418
11951
  <svg
@@ -11432,10 +11965,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11432
11965
  </div>
11433
11966
  `,
11434
11967
  }]
11435
- }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], attachable: [{ type: i0.Input, args: [{ isSignal: true, alias: "attachable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], submitted: [{ type: i0.Output, args: ["submitted"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], ta: [{ type: i0.ViewChild, args: ['ta', { isSignal: true }] }] } });
11968
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], attachable: [{ type: i0.Input, args: [{ isSignal: true, alias: "attachable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], attachLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "attachLabel", required: false }] }], sendLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "sendLabel", required: false }] }], submitted: [{ type: i0.Output, args: ["submitted"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], ta: [{ type: i0.ViewChild, args: ['ta', { isSignal: true }] }] } });
11436
11969
 
11437
11970
  /** A contribution-style heatmap grid (7 rows). Pass `data` or get a deterministic demo. */
11438
11971
  class BuiHeatmap {
11972
+ /** Per-cell counts filled column-first; empty yields a demo dataset. */
11439
11973
  data = input([], /* @ts-ignore */
11440
11974
  ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
11441
11975
  /** Smaller cells + tighter gaps. */
@@ -11512,12 +12046,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11512
12046
 
11513
12047
  /** An inline citation marker that reveals a source popover on hover / focus / click. */
11514
12048
  class BuiCitation {
12049
+ /** Citation number shown in the inline `[n]` marker. */
11515
12050
  index = input(1, /* @ts-ignore */
11516
12051
  ...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
12052
+ /** Source title shown at the top of the popover. */
11517
12053
  title = input('', /* @ts-ignore */
11518
12054
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
12055
+ /** Source URL; its hostname is derived and shown in the popover. */
11519
12056
  url = input('', /* @ts-ignore */
11520
12057
  ...(ngDevMode ? [{ debugName: "url" }] : /* istanbul ignore next */ []));
12058
+ /** Short excerpt from the source shown in the popover. */
11521
12059
  snippet = input('', /* @ts-ignore */
11522
12060
  ...(ngDevMode ? [{ debugName: "snippet" }] : /* istanbul ignore next */ []));
11523
12061
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11639,8 +12177,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11639
12177
 
11640
12178
  /** A two-panel resizable group. Hosts the shared size; the handle drags it. */
11641
12179
  class BuiResizablePanelGroup {
12180
+ /** Layout axis the panels are arranged and resized along. */
11642
12181
  direction = input('horizontal', /* @ts-ignore */
11643
12182
  ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
12183
+ /** Size of the primary panel as a percentage (10-90). Two-way bindable with `[(size)]`. */
11644
12184
  size = model(50, /* @ts-ignore */
11645
12185
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
11646
12186
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11690,6 +12230,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11690
12230
 
11691
12231
  /** A panel inside a `bui-resizable-panel-group`. Mark one `primary` to make it the sized panel. */
11692
12232
  class BuiResizablePanel {
12233
+ /** Whether this is the sized panel driven by the group's `size`; the other panel flexes. */
11693
12234
  primary = input(false, /* @ts-ignore */
11694
12235
  ...(ngDevMode ? [{ debugName: "primary" }] : /* istanbul ignore next */ []));
11695
12236
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11713,9 +12254,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11713
12254
 
11714
12255
  /** The draggable divider between two resizable panels. */
11715
12256
  class BuiResizableHandle {
12257
+ /** Whether to render a visible grip indicator on the divider. */
11716
12258
  withHandle = input(false, /* @ts-ignore */
11717
12259
  ...(ngDevMode ? [{ debugName: "withHandle" }] : /* istanbul ignore next */ []));
12260
+ /** Accessible label for the handle; falls back to a localized default. */
12261
+ ariaLabel = input(/* @ts-ignore */
12262
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
11718
12263
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12264
+ ariaLabelText = buiLabel('resizableHandle', this.ariaLabel);
11719
12265
  group = inject(BuiResizablePanelGroup);
11720
12266
  roundedSize = computed(() => Math.round(this.group.size()), /* @ts-ignore */
11721
12267
  ...(ngDevMode ? [{ debugName: "roundedSize" }] : /* istanbul ignore next */ []));
@@ -11735,7 +12281,7 @@ class BuiResizableHandle {
11735
12281
  }
11736
12282
  }
11737
12283
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiResizableHandle, deps: [], target: i0.ɵɵFactoryTarget.Component });
11738
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiResizableHandle, isStandalone: true, selector: "bui-resizable-handle", inputs: { withHandle: { classPropertyName: "withHandle", publicName: "withHandle", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "resizable-handle", "role": "separator", "tabindex": "0", "aria-label": "Resize panel", "aria-valuemin": "10", "aria-valuemax": "90" }, listeners: { "pointerdown": "group.startDrag()", "keydown": "onKeydown($event)" }, properties: { "attr.aria-orientation": "group.direction() === 'horizontal' ? 'vertical' : 'horizontal'", "attr.aria-valuenow": "roundedSize()", "class": "computedClass()" } }, ngImport: i0, template: `
12284
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiResizableHandle, isStandalone: true, selector: "bui-resizable-handle", inputs: { withHandle: { classPropertyName: "withHandle", publicName: "withHandle", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "resizable-handle", "role": "separator", "tabindex": "0", "aria-valuemin": "10", "aria-valuemax": "90" }, listeners: { "pointerdown": "group.startDrag()", "keydown": "onKeydown($event)" }, properties: { "attr.aria-label": "ariaLabelText()", "attr.aria-orientation": "group.direction() === 'horizontal' ? 'vertical' : 'horizontal'", "attr.aria-valuenow": "roundedSize()", "class": "computedClass()" } }, ngImport: i0, template: `
11739
12285
  @if (withHandle()) {
11740
12286
  <span
11741
12287
  class="absolute top-1/2 left-1/2 flex h-4 w-1 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full bg-border"
@@ -11751,7 +12297,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11751
12297
  'data-slot': 'resizable-handle',
11752
12298
  role: 'separator',
11753
12299
  tabindex: '0',
11754
- 'aria-label': 'Resize panel',
12300
+ '[attr.aria-label]': 'ariaLabelText()',
11755
12301
  'aria-valuemin': '10',
11756
12302
  'aria-valuemax': '90',
11757
12303
  '[attr.aria-orientation]': "group.direction() === 'horizontal' ? 'vertical' : 'horizontal'",
@@ -11768,27 +12314,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11768
12314
  }
11769
12315
  `,
11770
12316
  }]
11771
- }], propDecorators: { withHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "withHandle", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
12317
+ }], propDecorators: { withHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "withHandle", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
11772
12318
 
11773
12319
  /** A styled HTML5 video with a poster + play-button facade. */
11774
12320
  class BuiVideo {
12321
+ /** Video source URL for the underlying `<video>` element. */
11775
12322
  src = input('', /* @ts-ignore */
11776
12323
  ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
12324
+ /** Poster image URL shown before playback starts. */
11777
12325
  poster = input('', /* @ts-ignore */
11778
12326
  ...(ngDevMode ? [{ debugName: "poster" }] : /* istanbul ignore next */ []));
12327
+ /** Aspect ratio: `video` (16/9), `square` (1/1), or any CSS ratio. */
11779
12328
  aspect = input('video', /* @ts-ignore */
11780
12329
  ...(ngDevMode ? [{ debugName: "aspect" }] : /* istanbul ignore next */ []));
12330
+ /** Whether to show native controls once playback has started. */
11781
12331
  controls = input(true, /* @ts-ignore */
11782
12332
  ...(ngDevMode ? [{ debugName: "controls" }] : /* istanbul ignore next */ []));
12333
+ /** Whether to start playing automatically (hides the play facade). */
11783
12334
  autoplay = input(false, /* @ts-ignore */
11784
12335
  ...(ngDevMode ? [{ debugName: "autoplay" }] : /* istanbul ignore next */ []));
12336
+ /** Whether the video loops when it reaches the end. */
11785
12337
  loop = input(false, /* @ts-ignore */
11786
12338
  ...(ngDevMode ? [{ debugName: "loop" }] : /* istanbul ignore next */ []));
12339
+ /** Whether the video starts muted. */
11787
12340
  muted = input(false, /* @ts-ignore */
11788
12341
  ...(ngDevMode ? [{ debugName: "muted" }] : /* istanbul ignore next */ []));
12342
+ /** Tailwind border-radius utility applied to the container. */
11789
12343
  rounded = input('rounded-xl', /* @ts-ignore */
11790
12344
  ...(ngDevMode ? [{ debugName: "rounded" }] : /* istanbul ignore next */ []));
11791
12345
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12346
+ /** Accessible label override for the play-button facade. */
12347
+ playLabel = input(/* @ts-ignore */
12348
+ ...(ngDevMode ? [undefined, { debugName: "playLabel" }] : /* istanbul ignore next */ []));
12349
+ playText = buiLabel('videoPlay', this.playLabel);
11792
12350
  v = viewChild('v', /* @ts-ignore */
11793
12351
  ...(ngDevMode ? [{ debugName: "v" }] : /* istanbul ignore next */ []));
11794
12352
  started = signal(false, /* @ts-ignore */
@@ -11821,7 +12379,7 @@ class BuiVideo {
11821
12379
  }
11822
12380
  }
11823
12381
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiVideo, deps: [], target: i0.ɵɵFactoryTarget.Component });
11824
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiVideo, isStandalone: true, selector: "bui-video", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, poster: { classPropertyName: "poster", publicName: "poster", isSignal: true, isRequired: false, transformFunction: null }, aspect: { classPropertyName: "aspect", publicName: "aspect", isSignal: true, isRequired: false, transformFunction: null }, controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: false, transformFunction: null }, autoplay: { classPropertyName: "autoplay", publicName: "autoplay", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, muted: { classPropertyName: "muted", publicName: "muted", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "video" }, properties: { "class": "computedClass()", "style.aspect-ratio": "ratioValue()" } }, viewQueries: [{ propertyName: "v", first: true, predicate: ["v"], descendants: true, isSignal: true }], ngImport: i0, template: `
12382
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiVideo, isStandalone: true, selector: "bui-video", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, poster: { classPropertyName: "poster", publicName: "poster", isSignal: true, isRequired: false, transformFunction: null }, aspect: { classPropertyName: "aspect", publicName: "aspect", isSignal: true, isRequired: false, transformFunction: null }, controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: false, transformFunction: null }, autoplay: { classPropertyName: "autoplay", publicName: "autoplay", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, muted: { classPropertyName: "muted", publicName: "muted", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, playLabel: { classPropertyName: "playLabel", publicName: "playLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "video" }, properties: { "class": "computedClass()", "style.aspect-ratio": "ratioValue()" } }, viewQueries: [{ propertyName: "v", first: true, predicate: ["v"], descendants: true, isSignal: true }], ngImport: i0, template: `
11825
12383
  <video
11826
12384
  #v
11827
12385
  [src]="src() || null"
@@ -11840,7 +12398,7 @@ class BuiVideo {
11840
12398
  <button
11841
12399
  type="button"
11842
12400
  class="absolute inset-0 flex items-center justify-center bg-black/30 transition-colors hover:bg-black/40"
11843
- aria-label="Play video"
12401
+ [attr.aria-label]="playText()"
11844
12402
  (click)="play()"
11845
12403
  >
11846
12404
  <span
@@ -11882,7 +12440,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11882
12440
  <button
11883
12441
  type="button"
11884
12442
  class="absolute inset-0 flex items-center justify-center bg-black/30 transition-colors hover:bg-black/40"
11885
- aria-label="Play video"
12443
+ [attr.aria-label]="playText()"
11886
12444
  (click)="play()"
11887
12445
  >
11888
12446
  <span
@@ -11896,7 +12454,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11896
12454
  }
11897
12455
  `,
11898
12456
  }]
11899
- }], propDecorators: { src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], poster: [{ type: i0.Input, args: [{ isSignal: true, alias: "poster", required: false }] }], aspect: [{ type: i0.Input, args: [{ isSignal: true, alias: "aspect", required: false }] }], controls: [{ type: i0.Input, args: [{ isSignal: true, alias: "controls", required: false }] }], autoplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoplay", required: false }] }], loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], muted: [{ type: i0.Input, args: [{ isSignal: true, alias: "muted", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], v: [{ type: i0.ViewChild, args: ['v', { isSignal: true }] }] } });
12457
+ }], propDecorators: { src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], poster: [{ type: i0.Input, args: [{ isSignal: true, alias: "poster", required: false }] }], aspect: [{ type: i0.Input, args: [{ isSignal: true, alias: "aspect", required: false }] }], controls: [{ type: i0.Input, args: [{ isSignal: true, alias: "controls", required: false }] }], autoplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoplay", required: false }] }], loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], muted: [{ type: i0.Input, args: [{ isSignal: true, alias: "muted", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], playLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "playLabel", required: false }] }], v: [{ type: i0.ViewChild, args: ['v', { isSignal: true }] }] } });
11900
12458
 
11901
12459
  const DEFAULT_SWATCHES = [
11902
12460
  '#ef4444',
@@ -11912,13 +12470,24 @@ const DEFAULT_SWATCHES = [
11912
12470
  ];
11913
12471
  /** A colour picker: a native colour well, a hex field, and a swatch palette. */
11914
12472
  class BuiColorPicker {
12473
+ /** Selected color as a hex string. Two-way bindable with `[(value)]`. */
11915
12474
  value = model('#6366f1', /* @ts-ignore */
11916
12475
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
12476
+ /** Custom swatch palette; falls back to a built-in set when null. */
11917
12477
  swatches = input(null, /* @ts-ignore */
11918
12478
  ...(ngDevMode ? [{ debugName: "swatches" }] : /* istanbul ignore next */ []));
12479
+ /** Whether the picker is disabled. */
11919
12480
  disabled = input(false, /* @ts-ignore */
11920
12481
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
11921
12482
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12483
+ /** Accessible label for the native color well. */
12484
+ pickLabel = input(/* @ts-ignore */
12485
+ ...(ngDevMode ? [undefined, { debugName: "pickLabel" }] : /* istanbul ignore next */ []));
12486
+ /** Accessible label for the hex text field. */
12487
+ hexLabel = input(/* @ts-ignore */
12488
+ ...(ngDevMode ? [undefined, { debugName: "hexLabel" }] : /* istanbul ignore next */ []));
12489
+ pickText = buiLabel('colorPickerPick', this.pickLabel);
12490
+ hexText = buiLabel('colorPickerHex', this.hexLabel);
11922
12491
  palette = computed(() => this.swatches() ?? DEFAULT_SWATCHES, /* @ts-ignore */
11923
12492
  ...(ngDevMode ? [{ debugName: "palette" }] : /* istanbul ignore next */ []));
11924
12493
  computedClass = computed(() => cn('inline-block', this.userClass()), /* @ts-ignore */
@@ -11930,7 +12499,7 @@ class BuiColorPicker {
11930
12499
  this.value.set(event.target.value);
11931
12500
  }
11932
12501
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiColorPicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
11933
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiColorPicker, isStandalone: true, selector: "bui-color-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, swatches: { classPropertyName: "swatches", publicName: "swatches", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "data-slot": "color-picker" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
12502
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiColorPicker, isStandalone: true, selector: "bui-color-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, swatches: { classPropertyName: "swatches", publicName: "swatches", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, pickLabel: { classPropertyName: "pickLabel", publicName: "pickLabel", isSignal: true, isRequired: false, transformFunction: null }, hexLabel: { classPropertyName: "hexLabel", publicName: "hexLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "data-slot": "color-picker" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
11934
12503
  <div class="flex items-center gap-2">
11935
12504
  <label
11936
12505
  class="relative size-9 shrink-0 overflow-hidden rounded-md border border-input"
@@ -11941,7 +12510,7 @@ class BuiColorPicker {
11941
12510
  [value]="value()"
11942
12511
  [disabled]="disabled()"
11943
12512
  class="absolute inset-0 size-full cursor-pointer opacity-0"
11944
- aria-label="Pick a color"
12513
+ [attr.aria-label]="pickText()"
11945
12514
  (input)="onPick($event)"
11946
12515
  />
11947
12516
  </label>
@@ -11950,7 +12519,7 @@ class BuiColorPicker {
11950
12519
  [value]="value()"
11951
12520
  [disabled]="disabled()"
11952
12521
  class="h-9 w-28 rounded-md border border-input bg-transparent px-2 font-mono text-sm uppercase outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
11953
- aria-label="Color hex value"
12522
+ [attr.aria-label]="hexText()"
11954
12523
  (input)="onText($event)"
11955
12524
  />
11956
12525
  </div>
@@ -11984,7 +12553,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11984
12553
  [value]="value()"
11985
12554
  [disabled]="disabled()"
11986
12555
  class="absolute inset-0 size-full cursor-pointer opacity-0"
11987
- aria-label="Pick a color"
12556
+ [attr.aria-label]="pickText()"
11988
12557
  (input)="onPick($event)"
11989
12558
  />
11990
12559
  </label>
@@ -11993,7 +12562,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11993
12562
  [value]="value()"
11994
12563
  [disabled]="disabled()"
11995
12564
  class="h-9 w-28 rounded-md border border-input bg-transparent px-2 font-mono text-sm uppercase outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
11996
- aria-label="Color hex value"
12565
+ [attr.aria-label]="hexText()"
11997
12566
  (input)="onText($event)"
11998
12567
  />
11999
12568
  </div>
@@ -12011,18 +12580,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12011
12580
  </div>
12012
12581
  `,
12013
12582
  }]
12014
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], swatches: [{ type: i0.Input, args: [{ isSignal: true, alias: "swatches", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
12583
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], swatches: [{ type: i0.Input, args: [{ isSignal: true, alias: "swatches", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], pickLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pickLabel", required: false }] }], hexLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "hexLabel", required: false }] }] } });
12015
12584
 
12016
12585
  /** A GDPR cookie banner. Persists the choice in localStorage (skipped in `demo` mode). */
12017
12586
  class BuiCookieConsent {
12587
+ /** Consent message shown to the user. */
12018
12588
  message = input('We use cookies to enhance your experience.', /* @ts-ignore */
12019
12589
  ...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
12590
+ /** When true, always shows the banner and skips reading/writing localStorage. */
12020
12591
  demo = input(false, /* @ts-ignore */
12021
12592
  ...(ngDevMode ? [{ debugName: "demo" }] : /* istanbul ignore next */ []));
12593
+ /** localStorage key under which the accept/decline choice is persisted. */
12022
12594
  storageKey = input('bui-cookie-consent', /* @ts-ignore */
12023
12595
  ...(ngDevMode ? [{ debugName: "storageKey" }] : /* istanbul ignore next */ []));
12596
+ /** Emitted with `true` when the user accepts and `false` when they decline. */
12024
12597
  decided = output();
12025
12598
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12599
+ /** Overrides the localized accessible label for the consent region. */
12600
+ ariaLabel = input(/* @ts-ignore */
12601
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
12602
+ ariaLabelText = buiLabel('cookieConsent', this.ariaLabel);
12026
12603
  visible = signal(false, /* @ts-ignore */
12027
12604
  ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
12028
12605
  computedClass = computed(() => cn('flex flex-col items-start gap-3 rounded-lg border bg-card p-4 shadow-lg sm:flex-row sm:items-center sm:justify-between', this.userClass()), /* @ts-ignore */
@@ -12044,7 +12621,7 @@ class BuiCookieConsent {
12044
12621
  this.decided.emit(isAccepted);
12045
12622
  }
12046
12623
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiCookieConsent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12047
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiCookieConsent, isStandalone: true, selector: "bui-cookie-consent", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, demo: { classPropertyName: "demo", publicName: "demo", isSignal: true, isRequired: false, transformFunction: null }, storageKey: { classPropertyName: "storageKey", publicName: "storageKey", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { decided: "decided" }, host: { attributes: { "data-slot": "cookie-consent", "role": "region", "aria-label": "Cookie consent" }, properties: { "class": "computedClass()", "hidden": "!visible()" } }, ngImport: i0, template: `
12624
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiCookieConsent, isStandalone: true, selector: "bui-cookie-consent", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, demo: { classPropertyName: "demo", publicName: "demo", isSignal: true, isRequired: false, transformFunction: null }, storageKey: { classPropertyName: "storageKey", publicName: "storageKey", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { decided: "decided" }, host: { attributes: { "data-slot": "cookie-consent", "role": "region" }, properties: { "attr.aria-label": "ariaLabelText()", "class": "computedClass()", "hidden": "!visible()" } }, ngImport: i0, template: `
12048
12625
  <p class="text-sm text-muted-foreground">{{ message() }}</p>
12049
12626
  <div class="flex shrink-0 gap-2">
12050
12627
  <button
@@ -12071,7 +12648,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12071
12648
  host: {
12072
12649
  'data-slot': 'cookie-consent',
12073
12650
  role: 'region',
12074
- 'aria-label': 'Cookie consent',
12651
+ '[attr.aria-label]': 'ariaLabelText()',
12075
12652
  '[class]': 'computedClass()',
12076
12653
  '[hidden]': '!visible()',
12077
12654
  },
@@ -12095,19 +12672,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12095
12672
  </div>
12096
12673
  `,
12097
12674
  }]
12098
- }], ctorParameters: () => [], propDecorators: { message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], demo: [{ type: i0.Input, args: [{ isSignal: true, alias: "demo", required: false }] }], storageKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "storageKey", required: false }] }], decided: [{ type: i0.Output, args: ["decided"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
12675
+ }], ctorParameters: () => [], propDecorators: { message: [{ type: i0.Input, args: [{ isSignal: true, alias: "message", required: false }] }], demo: [{ type: i0.Input, args: [{ isSignal: true, alias: "demo", required: false }] }], storageKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "storageKey", required: false }] }], decided: [{ type: i0.Output, args: ["decided"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
12099
12676
 
12100
12677
  /**
12101
12678
  * Emits `more` when a sentinel scrolls into view (IntersectionObserver) or the fallback
12102
12679
  * "Load more" button is pressed. Drive `loading` / `finished` from the consumer. SSR-safe.
12103
12680
  */
12104
12681
  class BuiInfiniteScroll {
12682
+ /** Whether a load is in progress; shows the spinner and suppresses new emits. */
12105
12683
  loading = input(false, /* @ts-ignore */
12106
12684
  ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
12685
+ /** Whether all items are loaded; shows the end message and suppresses emits. */
12107
12686
  finished = input(false, /* @ts-ignore */
12108
12687
  ...(ngDevMode ? [{ debugName: "finished" }] : /* istanbul ignore next */ []));
12688
+ /** Pixel margin below the viewport at which the sentinel triggers loading. */
12109
12689
  threshold = input(200, /* @ts-ignore */
12110
12690
  ...(ngDevMode ? [{ debugName: "threshold" }] : /* istanbul ignore next */ []));
12691
+ /** Emits when the sentinel scrolls into view or the fallback button is pressed. */
12111
12692
  more = output();
12112
12693
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12113
12694
  sentinel = viewChild('sentinel', /* @ts-ignore */
@@ -12232,18 +12813,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12232
12813
 
12233
12814
  /** A compact audio player around a native `<audio>`: play/pause, seek, time, mute. */
12234
12815
  class BuiAudioPlayer {
12816
+ /** Audio source URL for the underlying `<audio>` element. */
12235
12817
  src = input('', /* @ts-ignore */
12236
12818
  ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
12819
+ /** Track title shown next to the controls. */
12237
12820
  title = input('', /* @ts-ignore */
12238
12821
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
12822
+ /** Artist name shown under the title. */
12239
12823
  artist = input('', /* @ts-ignore */
12240
12824
  ...(ngDevMode ? [{ debugName: "artist" }] : /* istanbul ignore next */ []));
12825
+ /** Whether to start playback automatically once loaded. */
12241
12826
  autoplay = input(false, /* @ts-ignore */
12242
12827
  ...(ngDevMode ? [{ debugName: "autoplay" }] : /* istanbul ignore next */ []));
12243
12828
  /** Condensed layout: hides the title block and mute button. */
12244
12829
  compact = input(false, /* @ts-ignore */
12245
12830
  ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
12246
12831
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12832
+ /** Accessible label override for the seek slider. */
12833
+ seekLabel = input(/* @ts-ignore */
12834
+ ...(ngDevMode ? [undefined, { debugName: "seekLabel" }] : /* istanbul ignore next */ []));
12835
+ /** Accessible label override for the play button. */
12836
+ playLabel = input(/* @ts-ignore */
12837
+ ...(ngDevMode ? [undefined, { debugName: "playLabel" }] : /* istanbul ignore next */ []));
12838
+ /** Accessible label override for the pause button. */
12839
+ pauseLabel = input(/* @ts-ignore */
12840
+ ...(ngDevMode ? [undefined, { debugName: "pauseLabel" }] : /* istanbul ignore next */ []));
12841
+ /** Accessible label override for the mute button. */
12842
+ muteLabel = input(/* @ts-ignore */
12843
+ ...(ngDevMode ? [undefined, { debugName: "muteLabel" }] : /* istanbul ignore next */ []));
12844
+ /** Accessible label override for the unmute button. */
12845
+ unmuteLabel = input(/* @ts-ignore */
12846
+ ...(ngDevMode ? [undefined, { debugName: "unmuteLabel" }] : /* istanbul ignore next */ []));
12847
+ seekText = buiLabel('audioPlayerSeek', this.seekLabel);
12848
+ playText = buiLabel('audioPlayerPlay', this.playLabel);
12849
+ pauseText = buiLabel('audioPlayerPause', this.pauseLabel);
12850
+ muteText = buiLabel('audioPlayerMute', this.muteLabel);
12851
+ unmuteText = buiLabel('audioPlayerUnmute', this.unmuteLabel);
12247
12852
  a = viewChild('a', /* @ts-ignore */
12248
12853
  ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
12249
12854
  playing = signal(false, /* @ts-ignore */
@@ -12303,7 +12908,7 @@ class BuiAudioPlayer {
12303
12908
  return `${minutes}:${rest.toString().padStart(2, '0')}`;
12304
12909
  }
12305
12910
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiAudioPlayer, deps: [], target: i0.ɵɵFactoryTarget.Component });
12306
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiAudioPlayer, isStandalone: true, selector: "bui-audio-player", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, artist: { classPropertyName: "artist", publicName: "artist", isSignal: true, isRequired: false, transformFunction: null }, autoplay: { classPropertyName: "autoplay", publicName: "autoplay", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "audio-player" }, properties: { "class": "computedClass()" } }, viewQueries: [{ propertyName: "a", first: true, predicate: ["a"], descendants: true, isSignal: true }], ngImport: i0, template: `
12911
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiAudioPlayer, isStandalone: true, selector: "bui-audio-player", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, artist: { classPropertyName: "artist", publicName: "artist", isSignal: true, isRequired: false, transformFunction: null }, autoplay: { classPropertyName: "autoplay", publicName: "autoplay", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, seekLabel: { classPropertyName: "seekLabel", publicName: "seekLabel", isSignal: true, isRequired: false, transformFunction: null }, playLabel: { classPropertyName: "playLabel", publicName: "playLabel", isSignal: true, isRequired: false, transformFunction: null }, pauseLabel: { classPropertyName: "pauseLabel", publicName: "pauseLabel", isSignal: true, isRequired: false, transformFunction: null }, muteLabel: { classPropertyName: "muteLabel", publicName: "muteLabel", isSignal: true, isRequired: false, transformFunction: null }, unmuteLabel: { classPropertyName: "unmuteLabel", publicName: "unmuteLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "audio-player" }, properties: { "class": "computedClass()" } }, viewQueries: [{ propertyName: "a", first: true, predicate: ["a"], descendants: true, isSignal: true }], ngImport: i0, template: `
12307
12912
  <audio
12308
12913
  #a
12309
12914
  [src]="src() || null"
@@ -12319,7 +12924,7 @@ class BuiAudioPlayer {
12319
12924
  <button
12320
12925
  type="button"
12321
12926
  class="inline-flex size-9 shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground"
12322
- [attr.aria-label]="playing() ? 'Pause' : 'Play'"
12927
+ [attr.aria-label]="playing() ? pauseText() : playText()"
12323
12928
  (click)="toggle()"
12324
12929
  >
12325
12930
  <svg class="size-4" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
@@ -12346,7 +12951,7 @@ class BuiAudioPlayer {
12346
12951
  [max]="duration() || 0"
12347
12952
  [value]="current()"
12348
12953
  class="h-1 flex-1 accent-primary"
12349
- aria-label="Seek"
12954
+ [attr.aria-label]="seekText()"
12350
12955
  (input)="seek($event)"
12351
12956
  />
12352
12957
  <span class="text-xs text-muted-foreground tabular-nums">{{ format(duration()) }}</span>
@@ -12354,7 +12959,7 @@ class BuiAudioPlayer {
12354
12959
  <button
12355
12960
  type="button"
12356
12961
  class="shrink-0 text-muted-foreground hover:text-foreground"
12357
- [attr.aria-label]="muted() ? 'Unmute' : 'Mute'"
12962
+ [attr.aria-label]="muted() ? unmuteText() : muteText()"
12358
12963
  (click)="toggleMute()"
12359
12964
  >
12360
12965
  <svg class="size-4" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
@@ -12391,7 +12996,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12391
12996
  <button
12392
12997
  type="button"
12393
12998
  class="inline-flex size-9 shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground"
12394
- [attr.aria-label]="playing() ? 'Pause' : 'Play'"
12999
+ [attr.aria-label]="playing() ? pauseText() : playText()"
12395
13000
  (click)="toggle()"
12396
13001
  >
12397
13002
  <svg class="size-4" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
@@ -12418,7 +13023,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12418
13023
  [max]="duration() || 0"
12419
13024
  [value]="current()"
12420
13025
  class="h-1 flex-1 accent-primary"
12421
- aria-label="Seek"
13026
+ [attr.aria-label]="seekText()"
12422
13027
  (input)="seek($event)"
12423
13028
  />
12424
13029
  <span class="text-xs text-muted-foreground tabular-nums">{{ format(duration()) }}</span>
@@ -12426,7 +13031,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12426
13031
  <button
12427
13032
  type="button"
12428
13033
  class="shrink-0 text-muted-foreground hover:text-foreground"
12429
- [attr.aria-label]="muted() ? 'Unmute' : 'Mute'"
13034
+ [attr.aria-label]="muted() ? unmuteText() : muteText()"
12430
13035
  (click)="toggleMute()"
12431
13036
  >
12432
13037
  <svg class="size-4" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
@@ -12442,12 +13047,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12442
13047
  }
12443
13048
  `,
12444
13049
  }]
12445
- }], propDecorators: { src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], artist: [{ type: i0.Input, args: [{ isSignal: true, alias: "artist", required: false }] }], autoplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoplay", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], a: [{ type: i0.ViewChild, args: ['a', { isSignal: true }] }] } });
13050
+ }], propDecorators: { src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], artist: [{ type: i0.Input, args: [{ isSignal: true, alias: "artist", required: false }] }], autoplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoplay", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], seekLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "seekLabel", required: false }] }], playLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "playLabel", required: false }] }], pauseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pauseLabel", required: false }] }], muteLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "muteLabel", required: false }] }], unmuteLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "unmuteLabel", required: false }] }], a: [{ type: i0.ViewChild, args: ['a', { isSignal: true }] }] } });
12446
13051
 
12447
13052
  /** A canvas signature pad with draw, undo and clear. SSR-safe (canvas set up in the browser). */
12448
13053
  class BuiSignaturePad {
13054
+ /** Canvas height in pixels. */
12449
13055
  height = input(200, /* @ts-ignore */
12450
13056
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
13057
+ /** Stroke color; falls back to the current text color when empty. */
12451
13058
  penColor = input('', /* @ts-ignore */
12452
13059
  ...(ngDevMode ? [{ debugName: "penColor" }] : /* istanbul ignore next */ []));
12453
13060
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -12604,11 +13211,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12604
13211
 
12605
13212
  /** A macOS-style dock with a cursor-following fisheye magnify. Use `bui-dock-item` tiles. */
12606
13213
  class BuiDock {
13214
+ /** Maximum scale factor applied to the tile directly under the cursor. */
12607
13215
  magnify = input(1.6, /* @ts-ignore */
12608
13216
  ...(ngDevMode ? [{ debugName: "magnify" }] : /* istanbul ignore next */ []));
13217
+ /** Pixel radius around the cursor within which tiles are magnified. */
12609
13218
  distance = input(120, /* @ts-ignore */
12610
13219
  ...(ngDevMode ? [{ debugName: "distance" }] : /* istanbul ignore next */ []));
12611
13220
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
13221
+ /** Accessible label for the dock navigation; falls back to the i18n default. */
13222
+ label = input(/* @ts-ignore */
13223
+ ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
13224
+ labelText = buiLabel('dock', this.label);
12612
13225
  mouseX = signal(null, /* @ts-ignore */
12613
13226
  ...(ngDevMode ? [{ debugName: "mouseX" }] : /* istanbul ignore next */ []));
12614
13227
  computedClass = computed(() => cn('inline-block', this.userClass()), /* @ts-ignore */
@@ -12625,9 +13238,9 @@ class BuiDock {
12625
13238
  return 1 + (this.magnify() - 1) * (1 - distance / this.distance());
12626
13239
  }
12627
13240
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiDock, deps: [], target: i0.ɵɵFactoryTarget.Component });
12628
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiDock, isStandalone: true, selector: "bui-dock", inputs: { magnify: { classPropertyName: "magnify", publicName: "magnify", isSignal: true, isRequired: false, transformFunction: null }, distance: { classPropertyName: "distance", publicName: "distance", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "dock" }, listeners: { "mousemove": "mouseX.set($event.clientX)", "mouseleave": "mouseX.set(null)" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
13241
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiDock, isStandalone: true, selector: "bui-dock", inputs: { magnify: { classPropertyName: "magnify", publicName: "magnify", isSignal: true, isRequired: false, transformFunction: null }, distance: { classPropertyName: "distance", publicName: "distance", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "dock" }, listeners: { "mousemove": "mouseX.set($event.clientX)", "mouseleave": "mouseX.set(null)" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
12629
13242
  <nav
12630
- aria-label="Dock"
13243
+ [attr.aria-label]="labelText()"
12631
13244
  class="flex items-end gap-2 rounded-2xl border bg-card/80 p-2 shadow-lg backdrop-blur"
12632
13245
  >
12633
13246
  <ng-content />
@@ -12646,17 +13259,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12646
13259
  },
12647
13260
  template: `
12648
13261
  <nav
12649
- aria-label="Dock"
13262
+ [attr.aria-label]="labelText()"
12650
13263
  class="flex items-end gap-2 rounded-2xl border bg-card/80 p-2 shadow-lg backdrop-blur"
12651
13264
  >
12652
13265
  <ng-content />
12653
13266
  </nav>
12654
13267
  `,
12655
13268
  }]
12656
- }], propDecorators: { magnify: [{ type: i0.Input, args: [{ isSignal: true, alias: "magnify", required: false }] }], distance: [{ type: i0.Input, args: [{ isSignal: true, alias: "distance", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
13269
+ }], propDecorators: { magnify: [{ type: i0.Input, args: [{ isSignal: true, alias: "magnify", required: false }] }], distance: [{ type: i0.Input, args: [{ isSignal: true, alias: "distance", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
12657
13270
 
12658
13271
  /** A magnifying tile inside a `bui-dock`. */
12659
13272
  class BuiDockItem {
13273
+ /** Whether to show the active indicator dot beneath the tile. */
12660
13274
  active = input(false, /* @ts-ignore */
12661
13275
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
12662
13276
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -12713,8 +13327,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12713
13327
 
12714
13328
  /** A single tree row; renders its own children recursively. */
12715
13329
  class BuiTreeNode {
13330
+ /** Node data for this row, including its label and children. */
12716
13331
  item = input.required(/* @ts-ignore */
12717
13332
  ...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
13333
+ /** Depth of this node, used for indentation and `aria-level` (root is 1). */
12718
13334
  level = input(1, /* @ts-ignore */
12719
13335
  ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
12720
13336
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -12824,8 +13440,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12824
13440
 
12825
13441
  /** A collapsible, data-driven hierarchical tree (`role="tree"`). */
12826
13442
  class BuiTree {
13443
+ /** Root nodes of the tree to render. */
12827
13444
  items = input([], /* @ts-ignore */
12828
13445
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
13446
+ /** Accessible label for the tree's root element. */
12829
13447
  ariaLabel = input('Tree', /* @ts-ignore */
12830
13448
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
12831
13449
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -12858,17 +13476,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12858
13476
 
12859
13477
  /** A dynamic list of repeatable form rows with add/remove and min/max bounds. */
12860
13478
  class BuiRepeater {
13479
+ /** Column definitions rendered for every row. */
12861
13480
  fields = input([], /* @ts-ignore */
12862
13481
  ...(ngDevMode ? [{ debugName: "fields" }] : /* istanbul ignore next */ []));
13482
+ /** Row data keyed by field key. Two-way bindable with `[(rows)]`. */
12863
13483
  rows = model([], /* @ts-ignore */
12864
13484
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
13485
+ /** Minimum number of rows that must remain (remove is disabled at this count). */
12865
13486
  min = input(1, /* @ts-ignore */
12866
13487
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
13488
+ /** Maximum number of rows allowed, or null for unlimited. */
12867
13489
  max = input(null, /* @ts-ignore */
12868
13490
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
13491
+ /** Text shown on the add-row button. */
12869
13492
  addLabel = input('Add row', /* @ts-ignore */
12870
13493
  ...(ngDevMode ? [{ debugName: "addLabel" }] : /* istanbul ignore next */ []));
13494
+ /** Accessible label override for the remove-row buttons. */
13495
+ removeLabel = input(/* @ts-ignore */
13496
+ ...(ngDevMode ? [undefined, { debugName: "removeLabel" }] : /* istanbul ignore next */ []));
12871
13497
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
13498
+ removeText = buiLabel('repeaterRemove', this.removeLabel);
12872
13499
  atMax = computed(() => {
12873
13500
  const max = this.max();
12874
13501
  return max !== null && this.rows().length >= max;
@@ -12899,7 +13526,7 @@ class BuiRepeater {
12899
13526
  this.rows.set(this.rows().map((row, index_) => (index_ === index ? { ...row, [key]: value } : row)));
12900
13527
  }
12901
13528
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiRepeater, deps: [], target: i0.ɵɵFactoryTarget.Component });
12902
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiRepeater, isStandalone: true, selector: "bui-repeater", inputs: { fields: { classPropertyName: "fields", publicName: "fields", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, addLabel: { classPropertyName: "addLabel", publicName: "addLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rows: "rowsChange" }, host: { attributes: { "data-slot": "repeater" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
13529
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiRepeater, isStandalone: true, selector: "bui-repeater", inputs: { fields: { classPropertyName: "fields", publicName: "fields", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, addLabel: { classPropertyName: "addLabel", publicName: "addLabel", isSignal: true, isRequired: false, transformFunction: null }, removeLabel: { classPropertyName: "removeLabel", publicName: "removeLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rows: "rowsChange" }, host: { attributes: { "data-slot": "repeater" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
12903
13530
  @for (row of rows(); track $index; let i = $index) {
12904
13531
  <div class="flex items-end gap-2">
12905
13532
  @for (field of fields(); track field.key) {
@@ -12920,7 +13547,7 @@ class BuiRepeater {
12920
13547
  type="button"
12921
13548
  class="inline-flex size-9 shrink-0 items-center justify-center rounded-md border border-input text-muted-foreground hover:bg-accent disabled:opacity-50"
12922
13549
  [disabled]="rows().length <= min()"
12923
- aria-label="Remove row"
13550
+ [attr.aria-label]="removeText()"
12924
13551
  (click)="removeRow(i)"
12925
13552
  >
12926
13553
  <svg
@@ -12989,7 +13616,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12989
13616
  type="button"
12990
13617
  class="inline-flex size-9 shrink-0 items-center justify-center rounded-md border border-input text-muted-foreground hover:bg-accent disabled:opacity-50"
12991
13618
  [disabled]="rows().length <= min()"
12992
- aria-label="Remove row"
13619
+ [attr.aria-label]="removeText()"
12993
13620
  (click)="removeRow(i)"
12994
13621
  >
12995
13622
  <svg
@@ -13032,15 +13659,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13032
13659
  </button>
13033
13660
  `,
13034
13661
  }]
13035
- }], propDecorators: { fields: [{ type: i0.Input, args: [{ isSignal: true, alias: "fields", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }, { type: i0.Output, args: ["rowsChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], addLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "addLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
13662
+ }], propDecorators: { fields: [{ type: i0.Input, args: [{ isSignal: true, alias: "fields", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }, { type: i0.Output, args: ["rowsChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], addLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "addLabel", required: false }] }], removeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
13036
13663
 
13037
13664
  /** A bell trigger with a dropdown feed of notifications and an unread badge. */
13038
13665
  class BuiNotificationCenter {
13666
+ /** Notification items rendered in the dropdown feed. */
13039
13667
  notifications = input([], /* @ts-ignore */
13040
13668
  ...(ngDevMode ? [{ debugName: "notifications" }] : /* istanbul ignore next */ []));
13669
+ /** Whether the dropdown is open. Two-way bindable with `[(open)]`. */
13041
13670
  open = model(false, /* @ts-ignore */
13042
13671
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
13043
13672
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
13673
+ /** Accessible label for the trigger and dropdown region. */
13674
+ ariaLabel = input(/* @ts-ignore */
13675
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
13676
+ /** Accessible label announced for the per-item unread dot. */
13677
+ unreadLabel = input(/* @ts-ignore */
13678
+ ...(ngDevMode ? [undefined, { debugName: "unreadLabel" }] : /* istanbul ignore next */ []));
13679
+ /** Label for the "mark all as read" action button. */
13680
+ markAllReadLabel = input(/* @ts-ignore */
13681
+ ...(ngDevMode ? [undefined, { debugName: "markAllReadLabel" }] : /* istanbul ignore next */ []));
13682
+ /** Text shown when there are no notifications. */
13683
+ emptyLabel = input(/* @ts-ignore */
13684
+ ...(ngDevMode ? [undefined, { debugName: "emptyLabel" }] : /* istanbul ignore next */ []));
13685
+ ariaText = buiLabel('notificationCenter', this.ariaLabel);
13686
+ unreadText = buiLabel('notificationCenterUnread', this.unreadLabel);
13687
+ markAllReadText = buiLabel('notificationCenterMarkAllRead', this.markAllReadLabel);
13688
+ emptyText = buiLabel('notificationCenterEmpty', this.emptyLabel);
13044
13689
  markedRead = signal(new Set(), /* @ts-ignore */
13045
13690
  ...(ngDevMode ? [{ debugName: "markedRead" }] : /* istanbul ignore next */ []));
13046
13691
  unread = computed(() => this.notifications().filter((_, index) => !this.isRead(index)).length, /* @ts-ignore */
@@ -13054,12 +13699,12 @@ class BuiNotificationCenter {
13054
13699
  this.markedRead.set(new Set(this.notifications().map((_, index) => index)));
13055
13700
  }
13056
13701
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiNotificationCenter, deps: [], target: i0.ɵɵFactoryTarget.Component });
13057
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiNotificationCenter, isStandalone: true, selector: "bui-notification-center", inputs: { notifications: { classPropertyName: "notifications", publicName: "notifications", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { attributes: { "data-slot": "notification-center" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
13702
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiNotificationCenter, isStandalone: true, selector: "bui-notification-center", inputs: { notifications: { classPropertyName: "notifications", publicName: "notifications", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, unreadLabel: { classPropertyName: "unreadLabel", publicName: "unreadLabel", isSignal: true, isRequired: false, transformFunction: null }, markAllReadLabel: { classPropertyName: "markAllReadLabel", publicName: "markAllReadLabel", isSignal: true, isRequired: false, transformFunction: null }, emptyLabel: { classPropertyName: "emptyLabel", publicName: "emptyLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { attributes: { "data-slot": "notification-center" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
13058
13703
  <button
13059
13704
  type="button"
13060
13705
  class="relative inline-flex size-9 items-center justify-center rounded-md border border-input hover:bg-accent"
13061
13706
  [attr.aria-expanded]="open()"
13062
- aria-label="Notifications"
13707
+ [attr.aria-label]="ariaText()"
13063
13708
  (click)="open.set(!open())"
13064
13709
  >
13065
13710
  <svg
@@ -13087,12 +13732,12 @@ class BuiNotificationCenter {
13087
13732
  <div
13088
13733
  class="absolute end-0 z-50 mt-2 w-80 rounded-lg border bg-popover text-popover-foreground shadow-md"
13089
13734
  role="region"
13090
- aria-label="Notifications"
13735
+ [attr.aria-label]="ariaText()"
13091
13736
  >
13092
13737
  <div class="flex items-center justify-between border-b p-3">
13093
- <span class="text-sm font-medium">Notifications</span>
13738
+ <span class="text-sm font-medium">{{ ariaText() }}</span>
13094
13739
  <button type="button" class="text-xs font-medium text-primary" (click)="markAllRead()">
13095
- Mark all read
13740
+ {{ markAllReadText() }}
13096
13741
  </button>
13097
13742
  </div>
13098
13743
  <ul class="max-h-80 overflow-auto">
@@ -13113,12 +13758,12 @@ class BuiNotificationCenter {
13113
13758
  @if (!isRead(i)) {
13114
13759
  <span
13115
13760
  class="mt-1.5 size-2 shrink-0 rounded-full bg-primary"
13116
- aria-label="Unread"
13761
+ [attr.aria-label]="unreadText()"
13117
13762
  ></span>
13118
13763
  }
13119
13764
  </li>
13120
13765
  } @empty {
13121
- <li class="p-6 text-center text-sm text-muted-foreground">No notifications</li>
13766
+ <li class="p-6 text-center text-sm text-muted-foreground">{{ emptyText() }}</li>
13122
13767
  }
13123
13768
  </ul>
13124
13769
  </div>
@@ -13135,7 +13780,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13135
13780
  type="button"
13136
13781
  class="relative inline-flex size-9 items-center justify-center rounded-md border border-input hover:bg-accent"
13137
13782
  [attr.aria-expanded]="open()"
13138
- aria-label="Notifications"
13783
+ [attr.aria-label]="ariaText()"
13139
13784
  (click)="open.set(!open())"
13140
13785
  >
13141
13786
  <svg
@@ -13163,12 +13808,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13163
13808
  <div
13164
13809
  class="absolute end-0 z-50 mt-2 w-80 rounded-lg border bg-popover text-popover-foreground shadow-md"
13165
13810
  role="region"
13166
- aria-label="Notifications"
13811
+ [attr.aria-label]="ariaText()"
13167
13812
  >
13168
13813
  <div class="flex items-center justify-between border-b p-3">
13169
- <span class="text-sm font-medium">Notifications</span>
13814
+ <span class="text-sm font-medium">{{ ariaText() }}</span>
13170
13815
  <button type="button" class="text-xs font-medium text-primary" (click)="markAllRead()">
13171
- Mark all read
13816
+ {{ markAllReadText() }}
13172
13817
  </button>
13173
13818
  </div>
13174
13819
  <ul class="max-h-80 overflow-auto">
@@ -13189,26 +13834,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13189
13834
  @if (!isRead(i)) {
13190
13835
  <span
13191
13836
  class="mt-1.5 size-2 shrink-0 rounded-full bg-primary"
13192
- aria-label="Unread"
13837
+ [attr.aria-label]="unreadText()"
13193
13838
  ></span>
13194
13839
  }
13195
13840
  </li>
13196
13841
  } @empty {
13197
- <li class="p-6 text-center text-sm text-muted-foreground">No notifications</li>
13842
+ <li class="p-6 text-center text-sm text-muted-foreground">{{ emptyText() }}</li>
13198
13843
  }
13199
13844
  </ul>
13200
13845
  </div>
13201
13846
  }
13202
13847
  `,
13203
13848
  }]
13204
- }], propDecorators: { notifications: [{ type: i0.Input, args: [{ isSignal: true, alias: "notifications", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
13849
+ }], propDecorators: { notifications: [{ type: i0.Input, args: [{ isSignal: true, alias: "notifications", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], unreadLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "unreadLabel", required: false }] }], markAllReadLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "markAllReadLabel", required: false }] }], emptyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyLabel", required: false }] }] } });
13205
13850
 
13206
13851
  /** A single JSON node; renders nested objects/arrays recursively. */
13207
13852
  class BuiJsonViewerNode {
13853
+ /** Arbitrary JSON value rendered by this node. */
13208
13854
  value = input(null, /* @ts-ignore */
13209
13855
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
13856
+ /** Object key or array index labeling this node, or null at the root. */
13210
13857
  keyName = input(null, /* @ts-ignore */
13211
13858
  ...(ngDevMode ? [{ debugName: "keyName" }] : /* istanbul ignore next */ []));
13859
+ /** Whether this node starts expanded. */
13212
13860
  expanded = input(true, /* @ts-ignore */
13213
13861
  ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
13214
13862
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13390,8 +14038,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13390
14038
 
13391
14039
  /** A collapsible JSON tree viewer. Accepts an object/array or a JSON string. */
13392
14040
  class BuiJsonViewer {
14041
+ /** Arbitrary JSON value to render; a string is parsed as JSON when possible. */
13393
14042
  data = input(null, /* @ts-ignore */
13394
14043
  ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
14044
+ /** Whether nodes start expanded. */
13395
14045
  expanded = input(true, /* @ts-ignore */
13396
14046
  ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
13397
14047
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13425,6 +14075,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13425
14075
 
13426
14076
  /** A single org-chart node (a card + recursive children). Rendered on an `<li>`. */
13427
14077
  class BuiOrgChartNode {
14078
+ /** Node rendered as a card, with its `children` recursed into nested `<li>`s. */
13428
14079
  node = input.required(/* @ts-ignore */
13429
14080
  ...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
13430
14081
  children = computed(() => this.node().children ?? [], /* @ts-ignore */
@@ -13501,6 +14152,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13501
14152
 
13502
14153
  /** A top-down organizational chart with pure-CSS connectors. Recursively renders nodes. */
13503
14154
  class BuiOrgChart {
14155
+ /** Root node of the tree to render; `null` renders nothing. */
13504
14156
  node = input(null, /* @ts-ignore */
13505
14157
  ...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
13506
14158
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13528,13 +14180,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13528
14180
 
13529
14181
  /** A cart trigger with an item-count badge and a dropdown with line items + subtotal. */
13530
14182
  class BuiMiniCart {
14183
+ /** Line items in the cart, used for count and subtotal. */
13531
14184
  items = input([], /* @ts-ignore */
13532
14185
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
14186
+ /** Currency symbol prefixed to prices and subtotal. */
13533
14187
  currency = input('$', /* @ts-ignore */
13534
14188
  ...(ngDevMode ? [{ debugName: "currency" }] : /* istanbul ignore next */ []));
14189
+ /** Whether the dropdown is open. Two-way bindable with `[(open)]`. */
13535
14190
  open = model(false, /* @ts-ignore */
13536
14191
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
13537
14192
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
14193
+ /** Accessible label override for the cart trigger button. */
14194
+ triggerLabel = input(/* @ts-ignore */
14195
+ ...(ngDevMode ? [undefined, { debugName: "triggerLabel" }] : /* istanbul ignore next */ []));
14196
+ /** Accessible label override for the cart dropdown dialog. */
14197
+ label = input(/* @ts-ignore */
14198
+ ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
14199
+ triggerText = buiLabel('miniCartTrigger', this.triggerLabel);
14200
+ labelText = buiLabel('miniCart', this.label);
13538
14201
  count = computed(() => this.items().reduce((total, item) => total + item.qty, 0), /* @ts-ignore */
13539
14202
  ...(ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []));
13540
14203
  subtotal = computed(() => this.items().reduce((total, item) => total + item.price * item.qty, 0), /* @ts-ignore */
@@ -13546,12 +14209,12 @@ class BuiMiniCart {
13546
14209
  value.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }));
13547
14210
  }
13548
14211
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiMiniCart, deps: [], target: i0.ɵɵFactoryTarget.Component });
13549
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiMiniCart, isStandalone: true, selector: "bui-mini-cart", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, currency: { classPropertyName: "currency", publicName: "currency", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { attributes: { "data-slot": "mini-cart" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
14212
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiMiniCart, isStandalone: true, selector: "bui-mini-cart", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, currency: { classPropertyName: "currency", publicName: "currency", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, triggerLabel: { classPropertyName: "triggerLabel", publicName: "triggerLabel", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { attributes: { "data-slot": "mini-cart" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
13550
14213
  <button
13551
14214
  type="button"
13552
14215
  class="relative inline-flex size-9 items-center justify-center rounded-md border border-input hover:bg-accent"
13553
14216
  [attr.aria-expanded]="open()"
13554
- aria-label="Cart"
14217
+ [attr.aria-label]="triggerText()"
13555
14218
  (click)="open.set(!open())"
13556
14219
  >
13557
14220
  <svg
@@ -13580,7 +14243,7 @@ class BuiMiniCart {
13580
14243
  <div
13581
14244
  class="absolute end-0 z-50 mt-2 w-80 rounded-lg border bg-popover text-popover-foreground shadow-md"
13582
14245
  role="dialog"
13583
- aria-label="Shopping cart"
14246
+ [attr.aria-label]="labelText()"
13584
14247
  >
13585
14248
  <div class="border-b p-3 text-sm font-medium">Your cart</div>
13586
14249
  @if (items().length === 0) {
@@ -13634,7 +14297,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13634
14297
  type="button"
13635
14298
  class="relative inline-flex size-9 items-center justify-center rounded-md border border-input hover:bg-accent"
13636
14299
  [attr.aria-expanded]="open()"
13637
- aria-label="Cart"
14300
+ [attr.aria-label]="triggerText()"
13638
14301
  (click)="open.set(!open())"
13639
14302
  >
13640
14303
  <svg
@@ -13663,7 +14326,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13663
14326
  <div
13664
14327
  class="absolute end-0 z-50 mt-2 w-80 rounded-lg border bg-popover text-popover-foreground shadow-md"
13665
14328
  role="dialog"
13666
- aria-label="Shopping cart"
14329
+ [attr.aria-label]="labelText()"
13667
14330
  >
13668
14331
  <div class="border-b p-3 text-sm font-medium">Your cart</div>
13669
14332
  @if (items().length === 0) {
@@ -13707,16 +14370,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13707
14370
  }
13708
14371
  `,
13709
14372
  }]
13710
- }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], currency: [{ type: i0.Input, args: [{ isSignal: true, alias: "currency", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
14373
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], currency: [{ type: i0.Input, args: [{ isSignal: true, alias: "currency", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], triggerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerLabel", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
13711
14374
 
13712
14375
  /** An SVG beam connecting two elements (by selector) with a travelling light. SSR-safe. */
13713
14376
  class BuiAnimatedBeam {
14377
+ /** CSS selector of the element the beam starts from. */
13714
14378
  from = input('', /* @ts-ignore */
13715
14379
  ...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
14380
+ /** CSS selector of the element the beam ends at. */
13716
14381
  to = input('', /* @ts-ignore */
13717
14382
  ...(ngDevMode ? [{ debugName: "to" }] : /* istanbul ignore next */ []));
14383
+ /** Upward bow of the connecting curve in pixels. */
13718
14384
  curvature = input(0, /* @ts-ignore */
13719
14385
  ...(ngDevMode ? [{ debugName: "curvature" }] : /* istanbul ignore next */ []));
14386
+ /** Seconds for the travelling light to traverse the beam. */
13720
14387
  duration = input(3, /* @ts-ignore */
13721
14388
  ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
13722
14389
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13854,10 +14521,13 @@ const ROW_CLASS = {
13854
14521
  const SIGN = { same: ' ', add: '+', del: '-' };
13855
14522
  /** A line-by-line text diff (LCS) rendered with +/- gutters. */
13856
14523
  class BuiDiffViewer {
14524
+ /** Original text; lines removed relative to `after` are marked deleted. */
13857
14525
  before = input('', /* @ts-ignore */
13858
14526
  ...(ngDevMode ? [{ debugName: "before" }] : /* istanbul ignore next */ []));
14527
+ /** Updated text; lines added relative to `before` are marked added. */
13859
14528
  after = input('', /* @ts-ignore */
13860
14529
  ...(ngDevMode ? [{ debugName: "after" }] : /* istanbul ignore next */ []));
14530
+ /** Optional filename shown in the header above the diff. */
13861
14531
  filename = input('', /* @ts-ignore */
13862
14532
  ...(ngDevMode ? [{ debugName: "filename" }] : /* istanbul ignore next */ []));
13863
14533
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13926,11 +14596,17 @@ const ALIGN$2 = {
13926
14596
  };
13927
14597
  /** A table whose rows can nest and expand/collapse (flattened to visible rows). */
13928
14598
  class BuiTreeTable {
14599
+ /** Column definitions in display order. */
13929
14600
  columns = input([], /* @ts-ignore */
13930
14601
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
14602
+ /** Top-level rows, each able to nest children via `children`. */
13931
14603
  rows = input([], /* @ts-ignore */
13932
14604
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
13933
14605
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
14606
+ /** Accessible label for the expand/collapse toggle button. */
14607
+ toggleLabel = input(/* @ts-ignore */
14608
+ ...(ngDevMode ? [undefined, { debugName: "toggleLabel" }] : /* istanbul ignore next */ []));
14609
+ toggleText = buiLabel('treeTableToggle', this.toggleLabel);
13934
14610
  overrides = signal(new Map(), /* @ts-ignore */
13935
14611
  ...(ngDevMode ? [{ debugName: "overrides" }] : /* istanbul ignore next */ []));
13936
14612
  defaults = computed(() => {
@@ -13989,7 +14665,7 @@ class BuiTreeTable {
13989
14665
  return '';
13990
14666
  }
13991
14667
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiTreeTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
13992
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiTreeTable, isStandalone: true, selector: "bui-tree-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "tree-table" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
14668
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiTreeTable, isStandalone: true, selector: "bui-tree-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, toggleLabel: { classPropertyName: "toggleLabel", publicName: "toggleLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "tree-table" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
13993
14669
  <table class="w-full text-sm">
13994
14670
  <thead>
13995
14671
  <tr class="border-b">
@@ -14015,7 +14691,7 @@ class BuiTreeTable {
14015
14691
  type="button"
14016
14692
  class="text-muted-foreground hover:text-foreground"
14017
14693
  [attr.aria-expanded]="isOpen(row.path)"
14018
- aria-label="Toggle row"
14694
+ [attr.aria-label]="toggleText()"
14019
14695
  (click)="toggle(row.path)"
14020
14696
  >
14021
14697
  <svg
@@ -14077,7 +14753,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
14077
14753
  type="button"
14078
14754
  class="text-muted-foreground hover:text-foreground"
14079
14755
  [attr.aria-expanded]="isOpen(row.path)"
14080
- aria-label="Toggle row"
14756
+ [attr.aria-label]="toggleText()"
14081
14757
  (click)="toggle(row.path)"
14082
14758
  >
14083
14759
  <svg
@@ -14108,7 +14784,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
14108
14784
  </table>
14109
14785
  `,
14110
14786
  }]
14111
- }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
14787
+ }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], toggleLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggleLabel", required: false }] }] } });
14112
14788
 
14113
14789
  // HTML is escaped first, then a safe subset of markdown is applied, so user input can't inject markup.
14114
14790
  function renderMarkdown(markdown) {
@@ -14124,12 +14800,16 @@ function renderMarkdown(markdown) {
14124
14800
  }
14125
14801
  /** A markdown textarea with a live, sanitized HTML preview. */
14126
14802
  class BuiMarkdownEditor {
14803
+ /** Markdown source text. Two-way bindable with `[(value)]`. */
14127
14804
  value = model('', /* @ts-ignore */
14128
14805
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
14806
+ /** Name attribute applied to the textarea for form submission. */
14129
14807
  name = input('', /* @ts-ignore */
14130
14808
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
14809
+ /** Placeholder text shown while the textarea is empty. */
14131
14810
  placeholder = input('Write markdown…', /* @ts-ignore */
14132
14811
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
14812
+ /** Number of visible rows in the write textarea. */
14133
14813
  rows = input(8, /* @ts-ignore */
14134
14814
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
14135
14815
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -14217,6 +14897,7 @@ function isoOf(date) {
14217
14897
  * Render several months side by side with `months`. SSR-safe.
14218
14898
  */
14219
14899
  class BuiCalendar {
14900
+ /** Selected day (mode="single") as `yyyy-mm-dd`. Two-way bindable with `[(value)]`. */
14220
14901
  value = model('', /* @ts-ignore */
14221
14902
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
14222
14903
  /** Selection mode: `single` | `range` | `multiple`. */
@@ -14231,10 +14912,13 @@ class BuiCalendar {
14231
14912
  /** Number of month grids to render side by side. */
14232
14913
  months = input(1, /* @ts-ignore */
14233
14914
  ...(ngDevMode ? [{ debugName: "months" }] : /* istanbul ignore next */ []));
14915
+ /** First day of the week (0 = Sunday). */
14234
14916
  weekStart = input(0, /* @ts-ignore */
14235
14917
  ...(ngDevMode ? [{ debugName: "weekStart" }] : /* istanbul ignore next */ []));
14918
+ /** Earliest selectable date (`yyyy-mm-dd`). */
14236
14919
  minDate = input('', /* @ts-ignore */
14237
14920
  ...(ngDevMode ? [{ debugName: "minDate" }] : /* istanbul ignore next */ []));
14921
+ /** Latest selectable date (`yyyy-mm-dd`). */
14238
14922
  maxDate = input('', /* @ts-ignore */
14239
14923
  ...(ngDevMode ? [{ debugName: "maxDate" }] : /* istanbul ignore next */ []));
14240
14924
  /** Specific ISO dates (yyyy-mm-dd) to disable. */
@@ -14252,9 +14936,26 @@ class BuiCalendar {
14252
14936
  /** Hide days that fall outside the current month. */
14253
14937
  hideOutsideDays = input(false, /* @ts-ignore */
14254
14938
  ...(ngDevMode ? [{ debugName: "hideOutsideDays" }] : /* istanbul ignore next */ []));
14939
+ /** Whether the whole calendar is disabled. Two-way bindable with `[(disabled)]`. */
14255
14940
  disabled = model(false, /* @ts-ignore */
14256
14941
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
14257
14942
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
14943
+ /** Accessible label for the previous-month button. */
14944
+ previousMonthLabel = input(/* @ts-ignore */
14945
+ ...(ngDevMode ? [undefined, { debugName: "previousMonthLabel" }] : /* istanbul ignore next */ []));
14946
+ /** Accessible label for the month dropdown. */
14947
+ monthSelectLabel = input(/* @ts-ignore */
14948
+ ...(ngDevMode ? [undefined, { debugName: "monthSelectLabel" }] : /* istanbul ignore next */ []));
14949
+ /** Accessible label for the year dropdown. */
14950
+ yearLabel = input(/* @ts-ignore */
14951
+ ...(ngDevMode ? [undefined, { debugName: "yearLabel" }] : /* istanbul ignore next */ []));
14952
+ /** Accessible label for the next-month button. */
14953
+ nextMonthLabel = input(/* @ts-ignore */
14954
+ ...(ngDevMode ? [undefined, { debugName: "nextMonthLabel" }] : /* istanbul ignore next */ []));
14955
+ previousMonthText = buiLabel('calendarPreviousMonth', this.previousMonthLabel);
14956
+ monthText = buiLabel('calendarMonth', this.monthSelectLabel);
14957
+ yearText = buiLabel('calendarYear', this.yearLabel);
14958
+ nextMonthText = buiLabel('calendarNextMonth', this.nextMonthLabel);
14258
14959
  onChange = noop$4;
14259
14960
  onTouched = noop$4;
14260
14961
  view = signal(new Date(new Date().getFullYear(), new Date().getMonth(), 1), /* @ts-ignore */
@@ -14421,14 +15122,14 @@ class BuiCalendar {
14421
15122
  return false;
14422
15123
  }
14423
15124
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiCalendar, deps: [], target: i0.ɵɵFactoryTarget.Component });
14424
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiCalendar, isStandalone: true, selector: "bui-calendar", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, months: { classPropertyName: "months", publicName: "months", isSignal: true, isRequired: false, transformFunction: null }, weekStart: { classPropertyName: "weekStart", publicName: "weekStart", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, disableWeekends: { classPropertyName: "disableWeekends", publicName: "disableWeekends", isSignal: true, isRequired: false, transformFunction: null }, showWeekNumbers: { classPropertyName: "showWeekNumbers", publicName: "showWeekNumbers", isSignal: true, isRequired: false, transformFunction: null }, captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null }, hideOutsideDays: { classPropertyName: "hideOutsideDays", publicName: "hideOutsideDays", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", range: "rangeChange", values: "valuesChange", disabled: "disabledChange" }, host: { attributes: { "data-slot": "calendar" }, listeners: { "focusout": "onTouched()" }, properties: { "class": "computedClass()" } }, providers: [
15125
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiCalendar, isStandalone: true, selector: "bui-calendar", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, months: { classPropertyName: "months", publicName: "months", isSignal: true, isRequired: false, transformFunction: null }, weekStart: { classPropertyName: "weekStart", publicName: "weekStart", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, disabledDates: { classPropertyName: "disabledDates", publicName: "disabledDates", isSignal: true, isRequired: false, transformFunction: null }, disableWeekends: { classPropertyName: "disableWeekends", publicName: "disableWeekends", isSignal: true, isRequired: false, transformFunction: null }, showWeekNumbers: { classPropertyName: "showWeekNumbers", publicName: "showWeekNumbers", isSignal: true, isRequired: false, transformFunction: null }, captionLayout: { classPropertyName: "captionLayout", publicName: "captionLayout", isSignal: true, isRequired: false, transformFunction: null }, hideOutsideDays: { classPropertyName: "hideOutsideDays", publicName: "hideOutsideDays", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, previousMonthLabel: { classPropertyName: "previousMonthLabel", publicName: "previousMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, monthSelectLabel: { classPropertyName: "monthSelectLabel", publicName: "monthSelectLabel", isSignal: true, isRequired: false, transformFunction: null }, yearLabel: { classPropertyName: "yearLabel", publicName: "yearLabel", isSignal: true, isRequired: false, transformFunction: null }, nextMonthLabel: { classPropertyName: "nextMonthLabel", publicName: "nextMonthLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", range: "rangeChange", values: "valuesChange", disabled: "disabledChange" }, host: { attributes: { "data-slot": "calendar" }, listeners: { "focusout": "onTouched()" }, properties: { "class": "computedClass()" } }, providers: [
14425
15126
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BuiCalendar), multi: true },
14426
15127
  ], ngImport: i0, template: `
14427
15128
  <div class="flex items-center justify-between pb-2">
14428
15129
  <button
14429
15130
  type="button"
14430
15131
  class="inline-flex size-7 items-center justify-center rounded-md hover:bg-accent"
14431
- aria-label="Previous month"
15132
+ [attr.aria-label]="previousMonthText()"
14432
15133
  (click)="changeMonth(-1)"
14433
15134
  >
14434
15135
  <svg
@@ -14447,7 +15148,7 @@ class BuiCalendar {
14447
15148
  @if (months() === 1 && captionLayout() === 'dropdown') {
14448
15149
  <div class="flex items-center gap-1">
14449
15150
  <select
14450
- aria-label="Month"
15151
+ [attr.aria-label]="monthText()"
14451
15152
  class="rounded-md border-0 bg-transparent py-1 text-sm font-medium outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"
14452
15153
  [value]="viewMonth()"
14453
15154
  (change)="setMonth($event)"
@@ -14457,7 +15158,7 @@ class BuiCalendar {
14457
15158
  }
14458
15159
  </select>
14459
15160
  <select
14460
- aria-label="Year"
15161
+ [attr.aria-label]="yearText()"
14461
15162
  class="rounded-md border-0 bg-transparent py-1 text-sm font-medium outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"
14462
15163
  [value]="viewYear()"
14463
15164
  (change)="setYear($event)"
@@ -14475,7 +15176,7 @@ class BuiCalendar {
14475
15176
  <button
14476
15177
  type="button"
14477
15178
  class="inline-flex size-7 items-center justify-center rounded-md hover:bg-accent"
14478
- aria-label="Next month"
15179
+ [attr.aria-label]="nextMonthText()"
14479
15180
  (click)="changeMonth(1)"
14480
15181
  >
14481
15182
  <svg
@@ -14562,7 +15263,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
14562
15263
  <button
14563
15264
  type="button"
14564
15265
  class="inline-flex size-7 items-center justify-center rounded-md hover:bg-accent"
14565
- aria-label="Previous month"
15266
+ [attr.aria-label]="previousMonthText()"
14566
15267
  (click)="changeMonth(-1)"
14567
15268
  >
14568
15269
  <svg
@@ -14581,7 +15282,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
14581
15282
  @if (months() === 1 && captionLayout() === 'dropdown') {
14582
15283
  <div class="flex items-center gap-1">
14583
15284
  <select
14584
- aria-label="Month"
15285
+ [attr.aria-label]="monthText()"
14585
15286
  class="rounded-md border-0 bg-transparent py-1 text-sm font-medium outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"
14586
15287
  [value]="viewMonth()"
14587
15288
  (change)="setMonth($event)"
@@ -14591,7 +15292,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
14591
15292
  }
14592
15293
  </select>
14593
15294
  <select
14594
- aria-label="Year"
15295
+ [attr.aria-label]="yearText()"
14595
15296
  class="rounded-md border-0 bg-transparent py-1 text-sm font-medium outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"
14596
15297
  [value]="viewYear()"
14597
15298
  (change)="setYear($event)"
@@ -14609,7 +15310,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
14609
15310
  <button
14610
15311
  type="button"
14611
15312
  class="inline-flex size-7 items-center justify-center rounded-md hover:bg-accent"
14612
- aria-label="Next month"
15313
+ [attr.aria-label]="nextMonthText()"
14613
15314
  (click)="changeMonth(1)"
14614
15315
  >
14615
15316
  <svg
@@ -14683,12 +15384,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
14683
15384
  </div>
14684
15385
  `,
14685
15386
  }]
14686
- }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], range: [{ type: i0.Input, args: [{ isSignal: true, alias: "range", required: false }] }, { type: i0.Output, args: ["rangeChange"] }], values: [{ type: i0.Input, args: [{ isSignal: true, alias: "values", required: false }] }, { type: i0.Output, args: ["valuesChange"] }], months: [{ type: i0.Input, args: [{ isSignal: true, alias: "months", required: false }] }], weekStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "weekStart", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], disabledDates: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDates", required: false }] }], disableWeekends: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableWeekends", required: false }] }], showWeekNumbers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWeekNumbers", required: false }] }], captionLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "captionLayout", required: false }] }], hideOutsideDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideOutsideDays", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
15387
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], range: [{ type: i0.Input, args: [{ isSignal: true, alias: "range", required: false }] }, { type: i0.Output, args: ["rangeChange"] }], values: [{ type: i0.Input, args: [{ isSignal: true, alias: "values", required: false }] }, { type: i0.Output, args: ["valuesChange"] }], months: [{ type: i0.Input, args: [{ isSignal: true, alias: "months", required: false }] }], weekStart: [{ type: i0.Input, args: [{ isSignal: true, alias: "weekStart", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], disabledDates: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDates", required: false }] }], disableWeekends: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableWeekends", required: false }] }], showWeekNumbers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWeekNumbers", required: false }] }], captionLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "captionLayout", required: false }] }], hideOutsideDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideOutsideDays", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], previousMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousMonthLabel", required: false }] }], monthSelectLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "monthSelectLabel", required: false }] }], yearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "yearLabel", required: false }] }], nextMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthLabel", required: false }] }] } });
14687
15388
 
14688
15389
  // eslint-disable-next-line @typescript-eslint/no-empty-function
14689
15390
  const noop$3 = () => { };
14690
15391
  /** A date input that opens a calendar popover. */
14691
15392
  class BuiDatePicker {
15393
+ /** Selected date (mode="single") as `yyyy-mm-dd`. Two-way bindable with `[(value)]`. */
14692
15394
  value = model('', /* @ts-ignore */
14693
15395
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
14694
15396
  /** `single` (default) or `range`. */
@@ -14700,24 +15402,34 @@ class BuiDatePicker {
14700
15402
  /** Month grids shown in the popover (handy for range). */
14701
15403
  months = input(1, /* @ts-ignore */
14702
15404
  ...(ngDevMode ? [{ debugName: "months" }] : /* istanbul ignore next */ []));
15405
+ /** Text shown on the trigger when no date is selected. */
14703
15406
  placeholder = input('Pick a date', /* @ts-ignore */
14704
15407
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
15408
+ /** Earliest selectable date (`yyyy-mm-dd`). */
14705
15409
  minDate = input('', /* @ts-ignore */
14706
15410
  ...(ngDevMode ? [{ debugName: "minDate" }] : /* istanbul ignore next */ []));
15411
+ /** Latest selectable date (`yyyy-mm-dd`). */
14707
15412
  maxDate = input('', /* @ts-ignore */
14708
15413
  ...(ngDevMode ? [{ debugName: "maxDate" }] : /* istanbul ignore next */ []));
15414
+ /** First day of the week (0 = Sunday). */
14709
15415
  weekStart = input(0, /* @ts-ignore */
14710
15416
  ...(ngDevMode ? [{ debugName: "weekStart" }] : /* istanbul ignore next */ []));
15417
+ /** Specific ISO dates (yyyy-mm-dd) to disable. */
14711
15418
  disabledDates = input([], /* @ts-ignore */
14712
15419
  ...(ngDevMode ? [{ debugName: "disabledDates" }] : /* istanbul ignore next */ []));
15420
+ /** Disable Saturdays and Sundays. */
14713
15421
  disableWeekends = input(false, /* @ts-ignore */
14714
15422
  ...(ngDevMode ? [{ debugName: "disableWeekends" }] : /* istanbul ignore next */ []));
15423
+ /** Show an ISO week-number column in the calendar. */
14715
15424
  showWeekNumbers = input(false, /* @ts-ignore */
14716
15425
  ...(ngDevMode ? [{ debugName: "showWeekNumbers" }] : /* istanbul ignore next */ []));
15426
+ /** `dropdown` swaps the month label for month + year selects. */
14717
15427
  captionLayout = input('label', /* @ts-ignore */
14718
15428
  ...(ngDevMode ? [{ debugName: "captionLayout" }] : /* istanbul ignore next */ []));
15429
+ /** Hide days that fall outside the current month. */
14719
15430
  hideOutsideDays = input(false, /* @ts-ignore */
14720
15431
  ...(ngDevMode ? [{ debugName: "hideOutsideDays" }] : /* istanbul ignore next */ []));
15432
+ /** Whether the picker is disabled. Two-way bindable with `[(disabled)]`. */
14721
15433
  disabled = model(false, /* @ts-ignore */
14722
15434
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
14723
15435
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -14826,7 +15538,7 @@ class BuiDatePicker {
14826
15538
  />
14827
15539
  </div>
14828
15540
  }
14829
- `, isInline: true, dependencies: [{ kind: "component", type: BuiCalendar, selector: "bui-calendar", inputs: ["value", "mode", "range", "values", "months", "weekStart", "minDate", "maxDate", "disabledDates", "disableWeekends", "showWeekNumbers", "captionLayout", "hideOutsideDays", "disabled", "class"], outputs: ["valueChange", "rangeChange", "valuesChange", "disabledChange"] }] });
15541
+ `, isInline: true, dependencies: [{ kind: "component", type: BuiCalendar, selector: "bui-calendar", inputs: ["value", "mode", "range", "values", "months", "weekStart", "minDate", "maxDate", "disabledDates", "disableWeekends", "showWeekNumbers", "captionLayout", "hideOutsideDays", "disabled", "class", "previousMonthLabel", "monthSelectLabel", "yearLabel", "nextMonthLabel"], outputs: ["valueChange", "rangeChange", "valuesChange", "disabledChange"] }] });
14830
15542
  }
14831
15543
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiDatePicker, decorators: [{
14832
15544
  type: Component,
@@ -14890,14 +15602,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
14890
15602
 
14891
15603
  /** A slide carousel. Project slides as direct children; arrows + dots navigate. SSR-safe. */
14892
15604
  class BuiCarousel {
15605
+ /** Zero-based index of the first visible slide; two-way bindable. */
14893
15606
  index = model(0, /* @ts-ignore */
14894
15607
  ...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
15608
+ /** Scroll axis of the carousel. */
14895
15609
  orientation = input('horizontal', /* @ts-ignore */
14896
15610
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
14897
15611
  /** Slides visible at once (e.g. 2 or 3 for a multi-item carousel). */
14898
15612
  perView = input(1, /* @ts-ignore */
14899
15613
  ...(ngDevMode ? [{ debugName: "perView" }] : /* istanbul ignore next */ []));
14900
15614
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
15615
+ /** Accessible label override for the previous-slide button. */
15616
+ previousLabel = input(/* @ts-ignore */
15617
+ ...(ngDevMode ? [undefined, { debugName: "previousLabel" }] : /* istanbul ignore next */ []));
15618
+ /** Accessible label override for the next-slide button. */
15619
+ nextLabel = input(/* @ts-ignore */
15620
+ ...(ngDevMode ? [undefined, { debugName: "nextLabel" }] : /* istanbul ignore next */ []));
15621
+ /** Accessible label override (prefix) for the dot navigation buttons. */
15622
+ goToSlideLabel = input(/* @ts-ignore */
15623
+ ...(ngDevMode ? [undefined, { debugName: "goToSlideLabel" }] : /* istanbul ignore next */ []));
15624
+ previousText = buiLabel('carouselPrevious', this.previousLabel);
15625
+ nextText = buiLabel('carouselNext', this.nextLabel);
15626
+ goToSlideText = buiLabel('carouselGoToSlide', this.goToSlideLabel);
14901
15627
  track = viewChild('track', /* @ts-ignore */
14902
15628
  ...(ngDevMode ? [{ debugName: "track" }] : /* istanbul ignore next */ []));
14903
15629
  count = signal(0, /* @ts-ignore */
@@ -14937,7 +15663,7 @@ class BuiCarousel {
14937
15663
  this.index.set(Math.min(this.maxIndex(), this.index() + 1));
14938
15664
  }
14939
15665
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiCarousel, deps: [], target: i0.ɵɵFactoryTarget.Component });
14940
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiCarousel, isStandalone: true, selector: "bui-carousel", inputs: { index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, perView: { classPropertyName: "perView", publicName: "perView", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { index: "indexChange" }, host: { attributes: { "data-slot": "carousel", "role": "region", "aria-roledescription": "carousel" }, properties: { "class": "computedClass()" } }, viewQueries: [{ propertyName: "track", first: true, predicate: ["track"], descendants: true, isSignal: true }], ngImport: i0, template: `
15666
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiCarousel, isStandalone: true, selector: "bui-carousel", inputs: { index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, perView: { classPropertyName: "perView", publicName: "perView", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, previousLabel: { classPropertyName: "previousLabel", publicName: "previousLabel", isSignal: true, isRequired: false, transformFunction: null }, nextLabel: { classPropertyName: "nextLabel", publicName: "nextLabel", isSignal: true, isRequired: false, transformFunction: null }, goToSlideLabel: { classPropertyName: "goToSlideLabel", publicName: "goToSlideLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { index: "indexChange" }, host: { attributes: { "data-slot": "carousel", "role": "region", "aria-roledescription": "carousel" }, properties: { "class": "computedClass()" } }, viewQueries: [{ propertyName: "track", first: true, predicate: ["track"], descendants: true, isSignal: true }], ngImport: i0, template: `
14941
15667
  <div [class]="viewportClass()">
14942
15668
  <div
14943
15669
  #track
@@ -14952,7 +15678,7 @@ class BuiCarousel {
14952
15678
  type="button"
14953
15679
  [class]="prevClass()"
14954
15680
  [disabled]="index() === 0"
14955
- aria-label="Previous slide"
15681
+ [attr.aria-label]="previousText()"
14956
15682
  (click)="prev()"
14957
15683
  >
14958
15684
  <svg
@@ -14972,7 +15698,7 @@ class BuiCarousel {
14972
15698
  type="button"
14973
15699
  [class]="nextClass()"
14974
15700
  [disabled]="index() >= maxIndex()"
14975
- aria-label="Next slide"
15701
+ [attr.aria-label]="nextText()"
14976
15702
  (click)="next()"
14977
15703
  >
14978
15704
  <svg
@@ -14995,7 +15721,7 @@ class BuiCarousel {
14995
15721
  type="button"
14996
15722
  class="size-2 rounded-full transition-colors"
14997
15723
  [class]="dot === index() ? 'bg-primary' : 'bg-muted'"
14998
- [attr.aria-label]="'Go to slide ' + (dot + 1)"
15724
+ [attr.aria-label]="goToSlideText() + ' ' + (dot + 1)"
14999
15725
  [attr.aria-current]="dot === index() ? 'true' : null"
15000
15726
  (click)="index.set(dot)"
15001
15727
  ></button>
@@ -15029,7 +15755,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15029
15755
  type="button"
15030
15756
  [class]="prevClass()"
15031
15757
  [disabled]="index() === 0"
15032
- aria-label="Previous slide"
15758
+ [attr.aria-label]="previousText()"
15033
15759
  (click)="prev()"
15034
15760
  >
15035
15761
  <svg
@@ -15049,7 +15775,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15049
15775
  type="button"
15050
15776
  [class]="nextClass()"
15051
15777
  [disabled]="index() >= maxIndex()"
15052
- aria-label="Next slide"
15778
+ [attr.aria-label]="nextText()"
15053
15779
  (click)="next()"
15054
15780
  >
15055
15781
  <svg
@@ -15072,7 +15798,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15072
15798
  type="button"
15073
15799
  class="size-2 rounded-full transition-colors"
15074
15800
  [class]="dot === index() ? 'bg-primary' : 'bg-muted'"
15075
- [attr.aria-label]="'Go to slide ' + (dot + 1)"
15801
+ [attr.aria-label]="goToSlideText() + ' ' + (dot + 1)"
15076
15802
  [attr.aria-current]="dot === index() ? 'true' : null"
15077
15803
  (click)="index.set(dot)"
15078
15804
  ></button>
@@ -15081,17 +15807,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15081
15807
  }
15082
15808
  `,
15083
15809
  }]
15084
- }], ctorParameters: () => [], propDecorators: { index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: false }] }, { type: i0.Output, args: ["indexChange"] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], perView: [{ type: i0.Input, args: [{ isSignal: true, alias: "perView", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], track: [{ type: i0.ViewChild, args: ['track', { isSignal: true }] }] } });
15810
+ }], ctorParameters: () => [], propDecorators: { index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: false }] }, { type: i0.Output, args: ["indexChange"] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], perView: [{ type: i0.Input, args: [{ isSignal: true, alias: "perView", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], previousLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousLabel", required: false }] }], nextLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextLabel", required: false }] }], goToSlideLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "goToSlideLabel", required: false }] }], track: [{ type: i0.ViewChild, args: ['track', { isSignal: true }] }] } });
15085
15811
 
15086
15812
  /** A command palette: a filterable, keyboard-navigable list of grouped actions. */
15087
15813
  class BuiCommand {
15814
+ /** Grouped commands shown in the palette and filtered as the user types. */
15088
15815
  groups = input([], /* @ts-ignore */
15089
15816
  ...(ngDevMode ? [{ debugName: "groups" }] : /* istanbul ignore next */ []));
15817
+ /** Placeholder text for the search input. */
15090
15818
  placeholder = input('Type a command or search…', /* @ts-ignore */
15091
15819
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
15092
15820
  /** Render a checkmark column; activating an item toggles its checked state. */
15093
15821
  checkable = input(false, /* @ts-ignore */
15094
15822
  ...(ngDevMode ? [{ debugName: "checkable" }] : /* istanbul ignore next */ []));
15823
+ /** Emits the chosen command when an item is activated (click or Enter). */
15095
15824
  selected = output();
15096
15825
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
15097
15826
  checkedValues = signal(new Set(), /* @ts-ignore */
@@ -15334,8 +16063,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15334
16063
 
15335
16064
  /** A right-click context menu. Project the target; pass menu `items`. */
15336
16065
  class BuiContextMenu {
16066
+ /** Items shown in the menu, in display order. */
15337
16067
  items = input([], /* @ts-ignore */
15338
16068
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
16069
+ /** Emits the chosen item when a (non-separator) entry is activated. */
15339
16070
  selected = output();
15340
16071
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
15341
16072
  open = signal(false, /* @ts-ignore */
@@ -15592,19 +16323,37 @@ function cellText(value) {
15592
16323
  }
15593
16324
  /** A data table with search, sortable columns, row selection and pagination. */
15594
16325
  class BuiDataTable {
16326
+ /** Column definitions that drive the headers, cell lookup and sort/search keys. */
15595
16327
  columns = input([], /* @ts-ignore */
15596
16328
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
16329
+ /** Source data rows; each is a key/value map indexed by column keys. */
15597
16330
  rows = input([], /* @ts-ignore */
15598
16331
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
16332
+ /** Whether to show the search box that filters rows across all columns. */
15599
16333
  searchable = input(true, /* @ts-ignore */
15600
16334
  ...(ngDevMode ? [{ debugName: "searchable" }] : /* istanbul ignore next */ []));
16335
+ /** Placeholder text for the search input. */
15601
16336
  searchPlaceholder = input('Search...', /* @ts-ignore */
15602
16337
  ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : /* istanbul ignore next */ []));
16338
+ /** Whether to render row checkboxes and the select-all header checkbox. */
15603
16339
  selectable = input(true, /* @ts-ignore */
15604
16340
  ...(ngDevMode ? [{ debugName: "selectable" }] : /* istanbul ignore next */ []));
16341
+ /** Number of rows displayed per page. */
15605
16342
  pageSize = input(5, /* @ts-ignore */
15606
16343
  ...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
15607
16344
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
16345
+ /** Accessible label override for the search input. */
16346
+ searchLabel = input(/* @ts-ignore */
16347
+ ...(ngDevMode ? [undefined, { debugName: "searchLabel" }] : /* istanbul ignore next */ []));
16348
+ /** Accessible label override for the select-all checkbox. */
16349
+ selectAllLabel = input(/* @ts-ignore */
16350
+ ...(ngDevMode ? [undefined, { debugName: "selectAllLabel" }] : /* istanbul ignore next */ []));
16351
+ /** Accessible label override for each row's select checkbox. */
16352
+ selectRowLabel = input(/* @ts-ignore */
16353
+ ...(ngDevMode ? [undefined, { debugName: "selectRowLabel" }] : /* istanbul ignore next */ []));
16354
+ searchText = buiLabel('dataTableSearch', this.searchLabel);
16355
+ selectAllText = buiLabel('dataTableSelectAll', this.selectAllLabel);
16356
+ selectRowText = buiLabel('dataTableSelectRow', this.selectRowLabel);
15608
16357
  query = signal('', /* @ts-ignore */
15609
16358
  ...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
15610
16359
  sortKey = signal('', /* @ts-ignore */
@@ -15690,14 +16439,14 @@ class BuiDataTable {
15690
16439
  this.selectedRows.set(isChecked ? new Set(this.filtered()) : new Set());
15691
16440
  }
15692
16441
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiDataTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
15693
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiDataTable, isStandalone: true, selector: "bui-data-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "data-table" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
16442
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiDataTable, isStandalone: true, selector: "bui-data-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, searchLabel: { classPropertyName: "searchLabel", publicName: "searchLabel", isSignal: true, isRequired: false, transformFunction: null }, selectAllLabel: { classPropertyName: "selectAllLabel", publicName: "selectAllLabel", isSignal: true, isRequired: false, transformFunction: null }, selectRowLabel: { classPropertyName: "selectRowLabel", publicName: "selectRowLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "data-table" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
15694
16443
  @if (searchable()) {
15695
16444
  <input
15696
16445
  type="search"
15697
16446
  [value]="query()"
15698
16447
  [placeholder]="searchPlaceholder()"
15699
16448
  class="mb-3 h-9 w-full max-w-xs rounded-md border border-input bg-transparent px-3 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
15700
- aria-label="Search"
16449
+ [attr.aria-label]="searchText()"
15701
16450
  (input)="onSearch($event)"
15702
16451
  />
15703
16452
  }
@@ -15711,7 +16460,7 @@ class BuiDataTable {
15711
16460
  type="checkbox"
15712
16461
  [checked]="allSelected()"
15713
16462
  [indeterminate]="someSelected()"
15714
- aria-label="Select all rows"
16463
+ [attr.aria-label]="selectAllText()"
15715
16464
  (change)="toggleAll($event)"
15716
16465
  />
15717
16466
  </th>
@@ -15744,7 +16493,7 @@ class BuiDataTable {
15744
16493
  <input
15745
16494
  type="checkbox"
15746
16495
  [checked]="isSelected(row)"
15747
- aria-label="Select row"
16496
+ [attr.aria-label]="selectRowText()"
15748
16497
  (change)="toggleRow(row)"
15749
16498
  />
15750
16499
  </td>
@@ -15803,7 +16552,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15803
16552
  [value]="query()"
15804
16553
  [placeholder]="searchPlaceholder()"
15805
16554
  class="mb-3 h-9 w-full max-w-xs rounded-md border border-input bg-transparent px-3 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
15806
- aria-label="Search"
16555
+ [attr.aria-label]="searchText()"
15807
16556
  (input)="onSearch($event)"
15808
16557
  />
15809
16558
  }
@@ -15817,7 +16566,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15817
16566
  type="checkbox"
15818
16567
  [checked]="allSelected()"
15819
16568
  [indeterminate]="someSelected()"
15820
- aria-label="Select all rows"
16569
+ [attr.aria-label]="selectAllText()"
15821
16570
  (change)="toggleAll($event)"
15822
16571
  />
15823
16572
  </th>
@@ -15850,7 +16599,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15850
16599
  <input
15851
16600
  type="checkbox"
15852
16601
  [checked]="isSelected(row)"
15853
- aria-label="Select row"
16602
+ [attr.aria-label]="selectRowText()"
15854
16603
  (change)="toggleRow(row)"
15855
16604
  />
15856
16605
  </td>
@@ -15897,21 +16646,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15897
16646
  </div>
15898
16647
  `,
15899
16648
  }]
15900
- }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
16649
+ }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], searchLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchLabel", required: false }] }], selectAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllLabel", required: false }] }], selectRowLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectRowLabel", required: false }] }] } });
15901
16650
 
15902
16651
  const PALETTE = ['#6366f1', '#22c55e', '#f59e0b', '#ec4899', '#06b6d4'];
15903
16652
  const WIDTH = 600;
15904
16653
  const PAD = 8;
15905
16654
  /** A lightweight SVG chart (line / area / bar). Pure + SSR-safe. */
15906
16655
  class BuiChart {
16656
+ /** Chart render style: line, bar, or filled area. */
15907
16657
  type = input('line', /* @ts-ignore */
15908
16658
  ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
16659
+ /** Series to plot; bar charts use only the first series. */
15909
16660
  series = input([], /* @ts-ignore */
15910
16661
  ...(ngDevMode ? [{ debugName: "series" }] : /* istanbul ignore next */ []));
16662
+ /** X-axis tick labels rendered below the chart. */
15911
16663
  labels = input([], /* @ts-ignore */
15912
16664
  ...(ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []));
16665
+ /** Chart height in pixels (SVG viewBox height). */
15913
16666
  height = input(220, /* @ts-ignore */
15914
16667
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
16668
+ /** Accessible label for the chart's `aria-label`. */
15915
16669
  label = input('Chart', /* @ts-ignore */
15916
16670
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
15917
16671
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -16068,6 +16822,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
16068
16822
  const noop$2 = () => { };
16069
16823
  /** A combined date + time picker in a popover. Value is `YYYY-MM-DDTHH:mm`. */
16070
16824
  class BuiDatetimePicker {
16825
+ /** Selected date-time (mode="single") as `YYYY-MM-DDTHH:mm`. Two-way bindable with `[(value)]`. */
16071
16826
  value = model('', /* @ts-ignore */
16072
16827
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
16073
16828
  /** `single` (default) or `range`. */
@@ -16079,16 +16834,22 @@ class BuiDatetimePicker {
16079
16834
  /** Month grids shown in the popover (handy for range). */
16080
16835
  months = input(1, /* @ts-ignore */
16081
16836
  ...(ngDevMode ? [{ debugName: "months" }] : /* istanbul ignore next */ []));
16837
+ /** Text shown on the trigger when nothing is selected. */
16082
16838
  placeholder = input('Pick date & time', /* @ts-ignore */
16083
16839
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
16840
+ /** Earliest selectable date (`yyyy-mm-dd`). */
16084
16841
  minDate = input('', /* @ts-ignore */
16085
16842
  ...(ngDevMode ? [{ debugName: "minDate" }] : /* istanbul ignore next */ []));
16843
+ /** Latest selectable date (`yyyy-mm-dd`). */
16086
16844
  maxDate = input('', /* @ts-ignore */
16087
16845
  ...(ngDevMode ? [{ debugName: "maxDate" }] : /* istanbul ignore next */ []));
16846
+ /** `dropdown` swaps the month label for month + year selects. */
16088
16847
  captionLayout = input('label', /* @ts-ignore */
16089
16848
  ...(ngDevMode ? [{ debugName: "captionLayout" }] : /* istanbul ignore next */ []));
16849
+ /** Whether to include seconds in the time field. */
16090
16850
  seconds = input(false, /* @ts-ignore */
16091
16851
  ...(ngDevMode ? [{ debugName: "seconds" }] : /* istanbul ignore next */ []));
16852
+ /** Whether the picker is disabled. Two-way bindable with `[(disabled)]`. */
16092
16853
  disabled = model(false, /* @ts-ignore */
16093
16854
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
16094
16855
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -16237,7 +16998,7 @@ class BuiDatetimePicker {
16237
16998
  </div>
16238
16999
  </div>
16239
17000
  }
16240
- `, isInline: true, dependencies: [{ kind: "component", type: BuiCalendar, selector: "bui-calendar", inputs: ["value", "mode", "range", "values", "months", "weekStart", "minDate", "maxDate", "disabledDates", "disableWeekends", "showWeekNumbers", "captionLayout", "hideOutsideDays", "disabled", "class"], outputs: ["valueChange", "rangeChange", "valuesChange", "disabledChange"] }, { kind: "component", type: BuiTimeField, selector: "bui-time-field", inputs: ["value", "name", "id", "min", "max", "seconds", "disabled", "mode", "minuteStep", "ariaLabel", "class"], outputs: ["valueChange", "disabledChange"] }] });
17001
+ `, isInline: true, dependencies: [{ kind: "component", type: BuiCalendar, selector: "bui-calendar", inputs: ["value", "mode", "range", "values", "months", "weekStart", "minDate", "maxDate", "disabledDates", "disableWeekends", "showWeekNumbers", "captionLayout", "hideOutsideDays", "disabled", "class", "previousMonthLabel", "monthSelectLabel", "yearLabel", "nextMonthLabel"], outputs: ["valueChange", "rangeChange", "valuesChange", "disabledChange"] }, { kind: "component", type: BuiTimeField, selector: "bui-time-field", inputs: ["value", "name", "id", "min", "max", "seconds", "disabled", "mode", "minuteStep", "ariaLabel", "class"], outputs: ["valueChange", "disabledChange"] }] });
16241
17002
  }
16242
17003
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiDatetimePicker, decorators: [{
16243
17004
  type: Component,
@@ -16319,23 +17080,31 @@ const AC_SIZE = {
16319
17080
  };
16320
17081
  /** A free-text input with a filtered suggestion list. */
16321
17082
  class BuiAutocomplete {
17083
+ /** Current text in the input. Two-way bindable with `[(value)]`. */
16322
17084
  value = model('', /* @ts-ignore */
16323
17085
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
16324
17086
  /** Pick several values, shown as removable chips; binds `values`. */
16325
17087
  multiple = input(false, /* @ts-ignore */
16326
17088
  ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
17089
+ /** Selected values shown as chips (multiple mode). Two-way bindable with `[(values)]`. */
16327
17090
  values = model([], /* @ts-ignore */
16328
17091
  ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
17092
+ /** Suggestions to filter against the typed text. */
16329
17093
  options = input([], /* @ts-ignore */
16330
17094
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
17095
+ /** Placeholder text for the input. */
16331
17096
  placeholder = input('Search...', /* @ts-ignore */
16332
17097
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
17098
+ /** Message shown when no suggestion matches. */
16333
17099
  empty = input('No results found.', /* @ts-ignore */
16334
17100
  ...(ngDevMode ? [{ debugName: "empty" }] : /* istanbul ignore next */ []));
17101
+ /** Whether the input is disabled. Two-way bindable with `[(disabled)]`. */
16335
17102
  disabled = model(false, /* @ts-ignore */
16336
17103
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
17104
+ /** Native `name` attribute for the input. */
16337
17105
  name = input('', /* @ts-ignore */
16338
17106
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
17107
+ /** Height and font size of the input. */
16339
17108
  size = input('default', /* @ts-ignore */
16340
17109
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
16341
17110
  /** Optional leading icon, given as an SVG path `d` string. */
@@ -16671,21 +17440,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
16671
17440
 
16672
17441
  /** A before/after image comparison with a draggable, keyboard-operable divider. */
16673
17442
  class BuiComparisonSlider {
17443
+ /** Source URL of the "before" image (revealed on the left of the divider). */
16674
17444
  before = input('', /* @ts-ignore */
16675
17445
  ...(ngDevMode ? [{ debugName: "before" }] : /* istanbul ignore next */ []));
17446
+ /** Source URL of the "after" image (shown on the right of the divider). */
16676
17447
  after = input('', /* @ts-ignore */
16677
17448
  ...(ngDevMode ? [{ debugName: "after" }] : /* istanbul ignore next */ []));
17449
+ /** Caption badge shown over the "before" image; hidden when empty. */
16678
17450
  beforeLabel = input('', /* @ts-ignore */
16679
17451
  ...(ngDevMode ? [{ debugName: "beforeLabel" }] : /* istanbul ignore next */ []));
17452
+ /** Caption badge shown over the "after" image; hidden when empty. */
16680
17453
  afterLabel = input('', /* @ts-ignore */
16681
17454
  ...(ngDevMode ? [{ debugName: "afterLabel" }] : /* istanbul ignore next */ []));
17455
+ /** Alt text for the "before" image. */
16682
17456
  beforeAlt = input('Before', /* @ts-ignore */
16683
17457
  ...(ngDevMode ? [{ debugName: "beforeAlt" }] : /* istanbul ignore next */ []));
17458
+ /** Alt text for the "after" image. */
16684
17459
  afterAlt = input('After', /* @ts-ignore */
16685
17460
  ...(ngDevMode ? [{ debugName: "afterAlt" }] : /* istanbul ignore next */ []));
17461
+ /** Divider position as a percentage (0-100); two-way bindable. */
16686
17462
  value = model(50, /* @ts-ignore */
16687
17463
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
16688
17464
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
17465
+ /** Accessible label override for the range slider. */
17466
+ positionLabel = input(/* @ts-ignore */
17467
+ ...(ngDevMode ? [undefined, { debugName: "positionLabel" }] : /* istanbul ignore next */ []));
17468
+ positionText = buiLabel('comparisonSliderPosition', this.positionLabel);
16689
17469
  clip = computed(() => `inset(0 ${100 - this.value()}% 0 0)`, /* @ts-ignore */
16690
17470
  ...(ngDevMode ? [{ debugName: "clip" }] : /* istanbul ignore next */ []));
16691
17471
  computedClass = computed(() => cn('block', this.userClass()), /* @ts-ignore */
@@ -16694,7 +17474,7 @@ class BuiComparisonSlider {
16694
17474
  this.value.set(Number(event.target.value));
16695
17475
  }
16696
17476
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiComparisonSlider, deps: [], target: i0.ɵɵFactoryTarget.Component });
16697
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiComparisonSlider, isStandalone: true, selector: "bui-comparison-slider", inputs: { before: { classPropertyName: "before", publicName: "before", isSignal: true, isRequired: false, transformFunction: null }, after: { classPropertyName: "after", publicName: "after", isSignal: true, isRequired: false, transformFunction: null }, beforeLabel: { classPropertyName: "beforeLabel", publicName: "beforeLabel", isSignal: true, isRequired: false, transformFunction: null }, afterLabel: { classPropertyName: "afterLabel", publicName: "afterLabel", isSignal: true, isRequired: false, transformFunction: null }, beforeAlt: { classPropertyName: "beforeAlt", publicName: "beforeAlt", isSignal: true, isRequired: false, transformFunction: null }, afterAlt: { classPropertyName: "afterAlt", publicName: "afterAlt", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "data-slot": "comparison-slider" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
17477
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiComparisonSlider, isStandalone: true, selector: "bui-comparison-slider", inputs: { before: { classPropertyName: "before", publicName: "before", isSignal: true, isRequired: false, transformFunction: null }, after: { classPropertyName: "after", publicName: "after", isSignal: true, isRequired: false, transformFunction: null }, beforeLabel: { classPropertyName: "beforeLabel", publicName: "beforeLabel", isSignal: true, isRequired: false, transformFunction: null }, afterLabel: { classPropertyName: "afterLabel", publicName: "afterLabel", isSignal: true, isRequired: false, transformFunction: null }, beforeAlt: { classPropertyName: "beforeAlt", publicName: "beforeAlt", isSignal: true, isRequired: false, transformFunction: null }, afterAlt: { classPropertyName: "afterAlt", publicName: "afterAlt", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, positionLabel: { classPropertyName: "positionLabel", publicName: "positionLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "data-slot": "comparison-slider" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
16698
17478
  <div class="relative overflow-hidden rounded-lg select-none">
16699
17479
  <img [src]="after()" [alt]="afterAlt()" class="block w-full" draggable="false" />
16700
17480
  <div class="absolute inset-0 overflow-hidden" [style.clip-path]="clip()">
@@ -16724,7 +17504,7 @@ class BuiComparisonSlider {
16724
17504
  min="0"
16725
17505
  max="100"
16726
17506
  [value]="value()"
16727
- aria-label="Comparison position"
17507
+ [attr.aria-label]="positionText()"
16728
17508
  class="absolute inset-0 size-full cursor-ew-resize opacity-0"
16729
17509
  (input)="onInput($event)"
16730
17510
  />
@@ -16766,14 +17546,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
16766
17546
  min="0"
16767
17547
  max="100"
16768
17548
  [value]="value()"
16769
- aria-label="Comparison position"
17549
+ [attr.aria-label]="positionText()"
16770
17550
  class="absolute inset-0 size-full cursor-ew-resize opacity-0"
16771
17551
  (input)="onInput($event)"
16772
17552
  />
16773
17553
  </div>
16774
17554
  `,
16775
17555
  }]
16776
- }], propDecorators: { before: [{ type: i0.Input, args: [{ isSignal: true, alias: "before", required: false }] }], after: [{ type: i0.Input, args: [{ isSignal: true, alias: "after", required: false }] }], beforeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "beforeLabel", required: false }] }], afterLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "afterLabel", required: false }] }], beforeAlt: [{ type: i0.Input, args: [{ isSignal: true, alias: "beforeAlt", required: false }] }], afterAlt: [{ type: i0.Input, args: [{ isSignal: true, alias: "afterAlt", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
17556
+ }], propDecorators: { before: [{ type: i0.Input, args: [{ isSignal: true, alias: "before", required: false }] }], after: [{ type: i0.Input, args: [{ isSignal: true, alias: "after", required: false }] }], beforeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "beforeLabel", required: false }] }], afterLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "afterLabel", required: false }] }], beforeAlt: [{ type: i0.Input, args: [{ isSignal: true, alias: "beforeAlt", required: false }] }], afterAlt: [{ type: i0.Input, args: [{ isSignal: true, alias: "afterAlt", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], positionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "positionLabel", required: false }] }] } });
16777
17557
 
16778
17558
  function formatSize(bytes) {
16779
17559
  if (bytes < 1024) {
@@ -16786,18 +17566,32 @@ function formatSize(bytes) {
16786
17566
  }
16787
17567
  /** A drag-and-drop file upload zone with a selected-files list. */
16788
17568
  class BuiFileUpload {
17569
+ /** Whether multiple files can be selected and accumulated. */
16789
17570
  multiple = input(false, /* @ts-ignore */
16790
17571
  ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
17572
+ /** Comma-separated list of accepted file types (the `accept` attribute). */
16791
17573
  accept = input('', /* @ts-ignore */
16792
17574
  ...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
17575
+ /** Native `name` attribute for the file input. */
16793
17576
  name = input('', /* @ts-ignore */
16794
17577
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
17578
+ /** Optional helper text shown under the dropzone label. */
16795
17579
  hint = input('', /* @ts-ignore */
16796
17580
  ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
17581
+ /** Whether the upload zone is disabled. */
16797
17582
  disabled = input(false, /* @ts-ignore */
16798
17583
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
17584
+ /** Emitted with the current file list whenever the selection changes. */
16799
17585
  filesChange = output();
16800
17586
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
17587
+ /** Custom dropzone prompt text. */
17588
+ dropzoneLabel = input(/* @ts-ignore */
17589
+ ...(ngDevMode ? [undefined, { debugName: "dropzoneLabel" }] : /* istanbul ignore next */ []));
17590
+ /** Custom accessible label for each remove button. */
17591
+ removeLabel = input(/* @ts-ignore */
17592
+ ...(ngDevMode ? [undefined, { debugName: "removeLabel" }] : /* istanbul ignore next */ []));
17593
+ dropzoneText = buiLabel('fileUploadDropzone', this.dropzoneLabel);
17594
+ removeText = buiLabel('fileUploadRemove', this.removeLabel);
16801
17595
  dragging = signal(false, /* @ts-ignore */
16802
17596
  ...(ngDevMode ? [{ debugName: "dragging" }] : /* istanbul ignore next */ []));
16803
17597
  files = signal([], /* @ts-ignore */
@@ -16825,7 +17619,7 @@ class BuiFileUpload {
16825
17619
  this.filesChange.emit(next);
16826
17620
  }
16827
17621
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiFileUpload, deps: [], target: i0.ɵɵFactoryTarget.Component });
16828
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiFileUpload, isStandalone: true, selector: "bui-file-upload", inputs: { multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesChange: "filesChange" }, host: { attributes: { "data-slot": "file-upload" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
17622
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiFileUpload, isStandalone: true, selector: "bui-file-upload", inputs: { multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, dropzoneLabel: { classPropertyName: "dropzoneLabel", publicName: "dropzoneLabel", isSignal: true, isRequired: false, transformFunction: null }, removeLabel: { classPropertyName: "removeLabel", publicName: "removeLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesChange: "filesChange" }, host: { attributes: { "data-slot": "file-upload" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
16829
17623
  <label [class]="zoneClass()">
16830
17624
  <input
16831
17625
  type="file"
@@ -16848,7 +17642,7 @@ class BuiFileUpload {
16848
17642
  >
16849
17643
  <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12" />
16850
17644
  </svg>
16851
- <span class="text-sm font-medium">Click to upload or drag &amp; drop</span>
17645
+ <span class="text-sm font-medium">{{ dropzoneText() }}</span>
16852
17646
  @if (hint()) {
16853
17647
  <span class="text-xs text-muted-foreground">{{ hint() }}</span>
16854
17648
  }
@@ -16877,7 +17671,7 @@ class BuiFileUpload {
16877
17671
  <button
16878
17672
  type="button"
16879
17673
  class="rounded-sm p-1 hover:bg-accent"
16880
- aria-label="Remove file"
17674
+ [attr.aria-label]="removeText()"
16881
17675
  (click)="remove(file)"
16882
17676
  >
16883
17677
  <svg
@@ -16927,7 +17721,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
16927
17721
  >
16928
17722
  <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12" />
16929
17723
  </svg>
16930
- <span class="text-sm font-medium">Click to upload or drag &amp; drop</span>
17724
+ <span class="text-sm font-medium">{{ dropzoneText() }}</span>
16931
17725
  @if (hint()) {
16932
17726
  <span class="text-xs text-muted-foreground">{{ hint() }}</span>
16933
17727
  }
@@ -16956,7 +17750,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
16956
17750
  <button
16957
17751
  type="button"
16958
17752
  class="rounded-sm p-1 hover:bg-accent"
16959
- aria-label="Remove file"
17753
+ [attr.aria-label]="removeText()"
16960
17754
  (click)="remove(file)"
16961
17755
  >
16962
17756
  <svg
@@ -16978,20 +17772,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
16978
17772
  }
16979
17773
  `,
16980
17774
  }]
16981
- }], propDecorators: { multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filesChange: [{ type: i0.Output, args: ["filesChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
17775
+ }], propDecorators: { multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], filesChange: [{ type: i0.Output, args: ["filesChange"] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], dropzoneLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropzoneLabel", required: false }] }], removeLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeLabel", required: false }] }] } });
16982
17776
 
16983
17777
  /**
16984
17778
  * An NProgress-style top loading bar. Drive it with `start()` / `set(0..1)` / `done()`,
16985
17779
  * or with `top-progress:start` / `top-progress:set` / `top-progress:done` window events.
16986
17780
  */
16987
17781
  class BuiTopProgress {
17782
+ /** CSS color (or gradient) used to fill the bar. */
16988
17783
  color = input('var(--color-primary, #6366f1)', /* @ts-ignore */
16989
17784
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
17785
+ /** Bar thickness in pixels. */
16990
17786
  height = input(2, /* @ts-ignore */
16991
17787
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
17788
+ /** When true, renders inline within its container instead of fixed at the top of the viewport. */
16992
17789
  demo = input(false, /* @ts-ignore */
16993
17790
  ...(ngDevMode ? [{ debugName: "demo" }] : /* istanbul ignore next */ []));
16994
17791
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
17792
+ /** Overrides the localized accessible progressbar label. */
17793
+ ariaLabel = input(/* @ts-ignore */
17794
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
17795
+ ariaLabelText = buiLabel('topProgressLoading', this.ariaLabel);
16995
17796
  progress = signal(0, /* @ts-ignore */
16996
17797
  ...(ngDevMode ? [{ debugName: "progress" }] : /* istanbul ignore next */ []));
16997
17798
  visible = signal(false, /* @ts-ignore */
@@ -17059,7 +17860,7 @@ class BuiTopProgress {
17059
17860
  this.timer = undefined;
17060
17861
  }
17061
17862
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiTopProgress, deps: [], target: i0.ɵɵFactoryTarget.Component });
17062
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiTopProgress, isStandalone: true, selector: "bui-top-progress", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, demo: { classPropertyName: "demo", publicName: "demo", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "top-progress", "role": "progressbar", "aria-label": "Page loading" }, properties: { "class": "computedClass()", "style.height.px": "height()", "attr.aria-valuenow": "visible() ? round(progress() * 100) : null" } }, ngImport: i0, template: `
17863
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: BuiTopProgress, isStandalone: true, selector: "bui-top-progress", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, demo: { classPropertyName: "demo", publicName: "demo", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "top-progress", "role": "progressbar" }, properties: { "class": "computedClass()", "style.height.px": "height()", "attr.aria-label": "ariaLabelText()", "attr.aria-valuenow": "visible() ? round(progress() * 100) : null" } }, ngImport: i0, template: `
17063
17864
  <div
17064
17865
  class="h-full transition-all duration-200 ease-out"
17065
17866
  [style.width.%]="visible() ? progress() * 100 : 0"
@@ -17077,7 +17878,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
17077
17878
  '[class]': 'computedClass()',
17078
17879
  '[style.height.px]': 'height()',
17079
17880
  role: 'progressbar',
17080
- 'aria-label': 'Page loading',
17881
+ '[attr.aria-label]': 'ariaLabelText()',
17081
17882
  '[attr.aria-valuenow]': 'visible() ? round(progress() * 100) : null',
17082
17883
  },
17083
17884
  template: `
@@ -17089,7 +17890,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
17089
17890
  ></div>
17090
17891
  `,
17091
17892
  }]
17092
- }], ctorParameters: () => [], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], demo: [{ type: i0.Input, args: [{ isSignal: true, alias: "demo", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
17893
+ }], ctorParameters: () => [], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], demo: [{ type: i0.Input, args: [{ isSignal: true, alias: "demo", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
17093
17894
 
17094
17895
  const POSITION$1 = {
17095
17896
  bottom: 'inset-x-0 bottom-0 max-h-[85vh] rounded-t-xl border-t',
@@ -17099,10 +17900,13 @@ const POSITION$1 = {
17099
17900
  };
17100
17901
  /** A slide-in panel anchored to a screen edge. Toggle with the `open` model. */
17101
17902
  class BuiDrawer {
17903
+ /** Whether the drawer is open. Two-way bindable with `[(open)]`. */
17102
17904
  open = model(false, /* @ts-ignore */
17103
17905
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
17906
+ /** Screen edge the drawer is anchored to and slides in from. */
17104
17907
  direction = input('bottom', /* @ts-ignore */
17105
17908
  ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
17909
+ /** Accessible label applied to the drawer dialog. */
17106
17910
  ariaLabel = input('Drawer', /* @ts-ignore */
17107
17911
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
17108
17912
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -17187,16 +17991,22 @@ function applyMask$1(value, mask) {
17187
17991
  }
17188
17992
  /** A text input that formats its value against a mask (9 = digit, a = letter, * = alnum). */
17189
17993
  class BuiInputMask {
17994
+ /** Mask pattern where `9` accepts a digit, `a` a letter, `*` an alphanumeric, and other chars are literals. */
17190
17995
  mask = input('', /* @ts-ignore */
17191
17996
  ...(ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []));
17997
+ /** Current masked value. Two-way bindable with `[(value)]`. */
17192
17998
  value = model('', /* @ts-ignore */
17193
17999
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
18000
+ /** Placeholder text shown when the input is empty. */
17194
18001
  placeholder = input('', /* @ts-ignore */
17195
18002
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
18003
+ /** Value for the native `inputmode` attribute hinting the virtual keyboard. */
17196
18004
  inputmode = input('', /* @ts-ignore */
17197
18005
  ...(ngDevMode ? [{ debugName: "inputmode" }] : /* istanbul ignore next */ []));
18006
+ /** Name attribute applied to the underlying input for form submission. */
17198
18007
  name = input('', /* @ts-ignore */
17199
18008
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
18009
+ /** Whether the input is disabled. Two-way bindable with `[(disabled)]`. */
17200
18010
  disabled = model(false, /* @ts-ignore */
17201
18011
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
17202
18012
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -17270,10 +18080,13 @@ const SIDE = {
17270
18080
  };
17271
18081
  /** A sheet overlay sliding in from a screen edge. Toggle with the `open` model. */
17272
18082
  class BuiSheet {
18083
+ /** Whether the sheet is open. Two-way bindable with `[(open)]`. */
17273
18084
  open = model(false, /* @ts-ignore */
17274
18085
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
18086
+ /** Screen edge the sheet slides in from. */
17275
18087
  side = input('right', /* @ts-ignore */
17276
18088
  ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
18089
+ /** Accessible label applied to the sheet dialog. */
17277
18090
  ariaLabel = input('Sheet', /* @ts-ignore */
17278
18091
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
17279
18092
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -17360,8 +18173,17 @@ const TONE = {
17360
18173
  };
17361
18174
  /** The toast viewport. Drives off the {@link BuiToaster} store. */
17362
18175
  class BuiSonner {
18176
+ /** Viewport corner where toasts stack (e.g. `top-left`, `bottom-right`). */
17363
18177
  position = input('bottom-right', /* @ts-ignore */
17364
18178
  ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
18179
+ /** Overrides the localized accessible label for the toast region. */
18180
+ ariaLabel = input(/* @ts-ignore */
18181
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
18182
+ /** Overrides the localized accessible label for each dismiss button. */
18183
+ dismissLabel = input(/* @ts-ignore */
18184
+ ...(ngDevMode ? [undefined, { debugName: "dismissLabel" }] : /* istanbul ignore next */ []));
18185
+ ariaLabelText = buiLabel('sonner', this.ariaLabel);
18186
+ dismissText = buiLabel('sonnerDismiss', this.dismissLabel);
17365
18187
  toaster = inject(BuiToaster);
17366
18188
  regionClass = computed(() => cn('pointer-events-none fixed z-[100] flex flex-col gap-2', POSITION[this.position()]), /* @ts-ignore */
17367
18189
  ...(ngDevMode ? [{ debugName: "regionClass" }] : /* istanbul ignore next */ []));
@@ -17373,8 +18195,8 @@ class BuiSonner {
17373
18195
  this.toaster.dismiss(toast.id);
17374
18196
  }
17375
18197
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiSonner, deps: [], target: i0.ɵɵFactoryTarget.Component });
17376
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiSonner, isStandalone: true, selector: "bui-sonner", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "sonner" } }, ngImport: i0, template: `
17377
- <div role="region" aria-label="Notifications" [class]="regionClass()">
18198
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiSonner, isStandalone: true, selector: "bui-sonner", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, dismissLabel: { classPropertyName: "dismissLabel", publicName: "dismissLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "sonner" } }, ngImport: i0, template: `
18199
+ <div role="region" [attr.aria-label]="ariaLabelText()" [class]="regionClass()">
17378
18200
  @for (toast of toaster.toasts(); track toast.id) {
17379
18201
  <div
17380
18202
  role="status"
@@ -17400,7 +18222,7 @@ class BuiSonner {
17400
18222
  <button
17401
18223
  type="button"
17402
18224
  class="shrink-0 opacity-70 hover:opacity-100"
17403
- aria-label="Dismiss notification"
18225
+ [attr.aria-label]="dismissText()"
17404
18226
  (click)="toaster.dismiss(toast.id)"
17405
18227
  >
17406
18228
  <svg
@@ -17426,7 +18248,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
17426
18248
  selector: 'bui-sonner',
17427
18249
  host: { 'data-slot': 'sonner' },
17428
18250
  template: `
17429
- <div role="region" aria-label="Notifications" [class]="regionClass()">
18251
+ <div role="region" [attr.aria-label]="ariaLabelText()" [class]="regionClass()">
17430
18252
  @for (toast of toaster.toasts(); track toast.id) {
17431
18253
  <div
17432
18254
  role="status"
@@ -17452,7 +18274,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
17452
18274
  <button
17453
18275
  type="button"
17454
18276
  class="shrink-0 opacity-70 hover:opacity-100"
17455
- aria-label="Dismiss notification"
18277
+ [attr.aria-label]="dismissText()"
17456
18278
  (click)="toaster.dismiss(toast.id)"
17457
18279
  >
17458
18280
  <svg
@@ -17472,10 +18294,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
17472
18294
  </div>
17473
18295
  `,
17474
18296
  }]
17475
- }], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }] } });
18297
+ }], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], dismissLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissLabel", required: false }] }] } });
17476
18298
 
17477
18299
  /** A horizontal navigation menu with hover/click dropdown panels. */
17478
18300
  class BuiNavigationMenu {
18301
+ /** Top-level menu entries, each optionally opening a dropdown panel. */
17479
18302
  items = input([], /* @ts-ignore */
17480
18303
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
17481
18304
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -17650,16 +18473,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
17650
18473
 
17651
18474
  /** A textarea that suggests mentions when you type the trigger character. */
17652
18475
  class BuiMentionInput {
18476
+ /** Textarea contents. Two-way bindable with `[(value)]`. */
17653
18477
  value = model('', /* @ts-ignore */
17654
18478
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
18479
+ /** Mentions offered when the trigger character is typed. */
17655
18480
  mentions = input([], /* @ts-ignore */
17656
18481
  ...(ngDevMode ? [{ debugName: "mentions" }] : /* istanbul ignore next */ []));
18482
+ /** Character that opens the mention suggestion list. */
17657
18483
  trigger = input('@', /* @ts-ignore */
17658
18484
  ...(ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []));
18485
+ /** Placeholder text for the textarea. */
17659
18486
  placeholder = input('Type @ to mention…', /* @ts-ignore */
17660
18487
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
18488
+ /** Number of visible textarea rows. */
17661
18489
  rows = input(3, /* @ts-ignore */
17662
18490
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
18491
+ /** Native `name` attribute for the textarea. */
17663
18492
  name = input('', /* @ts-ignore */
17664
18493
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
17665
18494
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -17796,18 +18625,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
17796
18625
 
17797
18626
  /** A keyless OpenStreetMap embed centred on a coordinate. SSR-safe. */
17798
18627
  class BuiMap {
18628
+ /** Latitude of the map centre, in degrees. */
17799
18629
  lat = input(50.8503, /* @ts-ignore */
17800
18630
  ...(ngDevMode ? [{ debugName: "lat" }] : /* istanbul ignore next */ []));
18631
+ /** Longitude of the map centre, in degrees. */
17801
18632
  lon = input(4.3517, /* @ts-ignore */
17802
18633
  ...(ngDevMode ? [{ debugName: "lon" }] : /* istanbul ignore next */ []));
18634
+ /** Zoom level; higher values zoom in closer. */
17803
18635
  zoom = input(14, /* @ts-ignore */
17804
18636
  ...(ngDevMode ? [{ debugName: "zoom" }] : /* istanbul ignore next */ []));
18637
+ /** Accessible title for the map iframe. */
17805
18638
  label = input('Location', /* @ts-ignore */
17806
18639
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
18640
+ /** Whether to drop a pin at the centre coordinate. */
17807
18641
  marker = input(true, /* @ts-ignore */
17808
18642
  ...(ngDevMode ? [{ debugName: "marker" }] : /* istanbul ignore next */ []));
18643
+ /** Map height in pixels; ignored when `ratio` is set. */
17809
18644
  height = input(320, /* @ts-ignore */
17810
18645
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
18646
+ /** CSS aspect ratio (e.g. `16/9`); overrides `height` when set. */
17811
18647
  ratio = input('', /* @ts-ignore */
17812
18648
  ...(ngDevMode ? [{ debugName: "ratio" }] : /* istanbul ignore next */ []));
17813
18649
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -17917,12 +18753,16 @@ function label(iso) {
17917
18753
  }
17918
18754
  /** A horizontal Gantt chart positioning task bars over a date range. SSR-safe. */
17919
18755
  class BuiGantt {
18756
+ /** Tasks to plot as horizontal bars across the date range. */
17920
18757
  tasks = input([], /* @ts-ignore */
17921
18758
  ...(ngDevMode ? [{ debugName: "tasks" }] : /* istanbul ignore next */ []));
18759
+ /** Milestones to plot as diamond markers below the task bars. */
17922
18760
  milestones = input([], /* @ts-ignore */
17923
18761
  ...(ngDevMode ? [{ debugName: "milestones" }] : /* istanbul ignore next */ []));
18762
+ /** ISO start date overriding the computed range minimum; empty derives it from tasks. */
17924
18763
  start = input('', /* @ts-ignore */
17925
18764
  ...(ngDevMode ? [{ debugName: "start" }] : /* istanbul ignore next */ []));
18765
+ /** ISO end date overriding the computed range maximum; empty derives it from tasks. */
17926
18766
  end = input('', /* @ts-ignore */
17927
18767
  ...(ngDevMode ? [{ debugName: "end" }] : /* istanbul ignore next */ []));
17928
18768
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18083,16 +18923,22 @@ function toMinutes(value) {
18083
18923
  }
18084
18924
  /** A week/day calendar grid with positioned events. SSR-safe. */
18085
18925
  class BuiScheduler {
18926
+ /** Events to position within the calendar grid. */
18086
18927
  events = input([], /* @ts-ignore */
18087
18928
  ...(ngDevMode ? [{ debugName: "events" }] : /* istanbul ignore next */ []));
18929
+ /** Custom day-column headers; empty falls back to weekday names or `Today`. */
18088
18930
  days = input([], /* @ts-ignore */
18089
18931
  ...(ngDevMode ? [{ debugName: "days" }] : /* istanbul ignore next */ []));
18932
+ /** First hour shown on the time axis (24-hour). */
18090
18933
  startHour = input(8, /* @ts-ignore */
18091
18934
  ...(ngDevMode ? [{ debugName: "startHour" }] : /* istanbul ignore next */ []));
18935
+ /** Last hour shown on the time axis (24-hour), exclusive of the final row. */
18092
18936
  endHour = input(18, /* @ts-ignore */
18093
18937
  ...(ngDevMode ? [{ debugName: "endHour" }] : /* istanbul ignore next */ []));
18938
+ /** Layout mode; `day` shows a single column, `week` shows the full week. */
18094
18939
  view = input('week', /* @ts-ignore */
18095
18940
  ...(ngDevMode ? [{ debugName: "view" }] : /* istanbul ignore next */ []));
18941
+ /** Accessible label applied to the grid's `aria-label`. */
18096
18942
  label = input('Schedule', /* @ts-ignore */
18097
18943
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
18098
18944
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18220,8 +19066,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
18220
19066
 
18221
19067
  /** A drag-and-drop kanban board (Angular CDK drag-drop). */
18222
19068
  class BuiKanban {
19069
+ /** Columns and their cards used to seed the board. */
18223
19070
  columns = input([], /* @ts-ignore */
18224
19071
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
19072
+ /** Emits the updated board whenever a card is moved. */
18225
19073
  changed = output();
18226
19074
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
18227
19075
  board = linkedSignal(() => this.columns().map((column) => ({ ...column, cards: [...column.cards] })), /* @ts-ignore */
@@ -18339,15 +19187,23 @@ const TOOLS = [
18339
19187
  ];
18340
19188
  /** A contenteditable rich-text editor with a basic formatting toolbar. */
18341
19189
  class BuiRichTextEditor {
19190
+ /** Editor contents as HTML. Two-way bindable with `[(value)]`. */
18342
19191
  value = model('', /* @ts-ignore */
18343
19192
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
19193
+ /** Placeholder text shown while the editor is empty. */
18344
19194
  placeholder = input('Write something…', /* @ts-ignore */
18345
19195
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
19196
+ /** Accessible label for the editable region. */
18346
19197
  ariaLabel = input('Rich text editor', /* @ts-ignore */
18347
19198
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
19199
+ /** Accessible label override for the formatting toolbar. */
19200
+ formattingLabel = input(/* @ts-ignore */
19201
+ ...(ngDevMode ? [undefined, { debugName: "formattingLabel" }] : /* istanbul ignore next */ []));
19202
+ /** Name attribute associated with the editor for form submission. */
18348
19203
  name = input('', /* @ts-ignore */
18349
19204
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
18350
19205
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
19206
+ formattingText = buiLabel('richTextEditorFormatting', this.formattingLabel);
18351
19207
  tools = TOOLS;
18352
19208
  editor = viewChild('editor', /* @ts-ignore */
18353
19209
  ...(ngDevMode ? [{ debugName: "editor" }] : /* istanbul ignore next */ []));
@@ -18377,10 +19233,10 @@ class BuiRichTextEditor {
18377
19233
  }
18378
19234
  }
18379
19235
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiRichTextEditor, deps: [], target: i0.ɵɵFactoryTarget.Component });
18380
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiRichTextEditor, isStandalone: true, selector: "bui-rich-text-editor", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "data-slot": "rich-text-editor" }, properties: { "class": "computedClass()" } }, viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, isSignal: true }], ngImport: i0, template: `
19236
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiRichTextEditor, isStandalone: true, selector: "bui-rich-text-editor", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, formattingLabel: { classPropertyName: "formattingLabel", publicName: "formattingLabel", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "data-slot": "rich-text-editor" }, properties: { "class": "computedClass()" } }, viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, isSignal: true }], ngImport: i0, template: `
18381
19237
  <div
18382
19238
  role="toolbar"
18383
- aria-label="Formatting"
19239
+ [attr.aria-label]="formattingText()"
18384
19240
  class="flex flex-wrap gap-0.5 border-b bg-muted/40 p-1"
18385
19241
  >
18386
19242
  @for (tool of tools; track tool.cmd) {
@@ -18416,7 +19272,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
18416
19272
  template: `
18417
19273
  <div
18418
19274
  role="toolbar"
18419
- aria-label="Formatting"
19275
+ [attr.aria-label]="formattingText()"
18420
19276
  class="flex flex-wrap gap-0.5 border-b bg-muted/40 p-1"
18421
19277
  >
18422
19278
  @for (tool of tools; track tool.cmd) {
@@ -18444,14 +19300,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
18444
19300
  ></div>
18445
19301
  `,
18446
19302
  }]
18447
- }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], editor: [{ type: i0.ViewChild, args: ['editor', { isSignal: true }] }] } });
19303
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], formattingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "formattingLabel", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], editor: [{ type: i0.ViewChild, args: ['editor', { isSignal: true }] }] } });
18448
19304
 
18449
19305
  /** A collapsible vertical navigation sidebar. Toggle width with the `open` model. */
18450
19306
  class BuiSidebar {
19307
+ /** Whether the sidebar is expanded. Two-way bindable with `[(open)]`. */
18451
19308
  open = model(true, /* @ts-ignore */
18452
19309
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
19310
+ /** Edge the sidebar is docked to, which sets its border side. */
18453
19311
  side = input('left', /* @ts-ignore */
18454
19312
  ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
19313
+ /** Collapse behavior: hide entirely (`offcanvas`) or shrink to an icon rail (`icon`). */
18455
19314
  collapsible = input('offcanvas', /* @ts-ignore */
18456
19315
  ...(ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []));
18457
19316
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18477,6 +19336,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
18477
19336
  }], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
18478
19337
  /** A styled, accessible item button for a {@link BuiSidebar} menu. */
18479
19338
  class BuiSidebarMenuButton {
19339
+ /** Whether this item is the current page; sets active styling and `aria-current`. */
18480
19340
  isActive = input(false, /* @ts-ignore */
18481
19341
  ...(ngDevMode ? [{ debugName: "isActive" }] : /* istanbul ignore next */ []));
18482
19342
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18499,8 +19359,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
18499
19359
 
18500
19360
  /** A guided product tour with a spotlight on each step's target element. SSR-safe. */
18501
19361
  class BuiOnboardingTour {
19362
+ /** Whether the tour is open. Two-way bindable with `[(open)]`. */
18502
19363
  open = model(false, /* @ts-ignore */
18503
19364
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
19365
+ /** Ordered steps; each spotlights its `target` element in turn. */
18504
19366
  steps = input([], /* @ts-ignore */
18505
19367
  ...(ngDevMode ? [{ debugName: "steps" }] : /* istanbul ignore next */ []));
18506
19368
  step = signal(0, /* @ts-ignore */
@@ -19094,16 +19956,22 @@ function encodeQr(text) {
19094
19956
 
19095
19957
  /** Renders a value as a scannable QR code (SVG). Level M, byte mode. SSR-safe. */
19096
19958
  class BuiQrCode {
19959
+ /** Text or URL to encode into the QR code. */
19097
19960
  value = input('', /* @ts-ignore */
19098
19961
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
19962
+ /** Rendered width and height of the SVG in pixels. */
19099
19963
  size = input(160, /* @ts-ignore */
19100
19964
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
19965
+ /** Accessible label for the QR code image. */
19101
19966
  label = input('QR code', /* @ts-ignore */
19102
19967
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
19968
+ /** Fill colour of the QR modules (dark squares). */
19103
19969
  foreground = input('currentColor', /* @ts-ignore */
19104
19970
  ...(ngDevMode ? [{ debugName: "foreground" }] : /* istanbul ignore next */ []));
19971
+ /** Background fill colour behind the modules. */
19105
19972
  background = input('transparent', /* @ts-ignore */
19106
19973
  ...(ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []));
19974
+ /** Quiet-zone border width, in modules. */
19107
19975
  margin = input(2, /* @ts-ignore */
19108
19976
  ...(ngDevMode ? [{ debugName: "margin" }] : /* istanbul ignore next */ []));
19109
19977
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -19174,5 +20042,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
19174
20042
  * Generated bundle index. Do not edit.
19175
20043
  */
19176
20044
 
19177
- export { BuiAccent, BuiAccordion, BuiAccordionContent, BuiAccordionItem, BuiAccordionTrigger, BuiAddToCart, BuiAlert, BuiAlertDescription, BuiAlertDialogAction, BuiAlertDialogCancel, BuiAlertDialogContent, BuiAlertDialogDescription, BuiAlertDialogFooter, BuiAlertDialogHeader, BuiAlertDialogTitle, BuiAlertTitle, BuiAnimatedBeam, BuiAspectRatio, BuiAudioPlayer, BuiAurora, BuiAutocomplete, BuiAutosizeTextarea, BuiAvatar, BuiAvatarGroup, BuiBackToTop, BuiBadge, BuiBanner, BuiBentoGrid, BuiBentoItem, BuiBorderBeam, BuiBottomNavigation, BuiBottomNavigationItem, BuiBreadcrumb, BuiBreadcrumbEllipsis, BuiBreadcrumbItem, BuiBreadcrumbLink, BuiBreadcrumbList, BuiBreadcrumbPage, BuiBreadcrumbSeparator, BuiButton, BuiButtonGroup, BuiButtonGroupText, BuiCalendar, BuiCard, BuiCardAction, BuiCardContent, BuiCardDescription, BuiCardFooter, BuiCardHeader, BuiCardTitle, BuiCarousel, BuiChart, BuiChat, BuiChatMessage, BuiCheckbox, BuiCitation, BuiCodeBlock, BuiCollapsible, BuiCollapsibleContent, BuiCollapsibleTrigger, BuiColorPicker, BuiCombobox, BuiCommand, BuiComparisonSlider, BuiComparisonTable, BuiConfetti, BuiContainer, BuiContextMenu, BuiCookieConsent, BuiCopyButton, BuiCountdown, BuiDataTable, BuiDatePicker, BuiDatetimePicker, BuiDescriptionItem, BuiDescriptionList, BuiDialogContent, BuiDialogDescription, BuiDialogFooter, BuiDialogHeader, BuiDialogTitle, BuiDiffViewer, BuiDock, BuiDockItem, BuiDotPattern, BuiDrawer, BuiDropdownMenu, BuiDropdownMenuItem, BuiDropdownMenuLabel, BuiDropdownMenuSeparator, BuiEditable, BuiEmpty, BuiEmptyContent, BuiEmptyDescription, BuiEmptyHeader, BuiEmptyMedia, BuiEmptyTitle, BuiField, BuiFieldContent, BuiFieldDescription, BuiFieldError, BuiFieldGroup, BuiFieldLabel, BuiFieldLegend, BuiFieldSeparator, BuiFieldSet, BuiFieldTitle, BuiFileUpload, BuiFlipCard, BuiGallery, BuiGantt, BuiGradientText, BuiGridPattern, BuiHeatmap, BuiHoverCard, BuiHoverCardContent, BuiImage, BuiInfiniteScroll, BuiInput, BuiInputGroup, BuiInputGroupAddon, BuiInputGroupButton, BuiInputGroupInput, BuiInputGroupText, BuiInputMask, BuiInputOtp, BuiItem, BuiItemActions, BuiItemContent, BuiItemDescription, BuiItemGroup, BuiItemMedia, BuiItemTitle, BuiJsonViewer, BuiJsonViewerNode, BuiKanban, BuiKbd, BuiKbdGroup, BuiKnob, BuiLabel, BuiLink, BuiLoadingOverlay, BuiMap, BuiMarkdownEditor, BuiMarquee, BuiMasonry, BuiMentionInput, BuiMenubar, BuiMenubarTrigger, BuiMeteors, BuiMeter, BuiMiniCart, BuiNavigationMenu, BuiNotificationCenter, BuiNumberInput, BuiNumberTicker, BuiOnboardingTour, BuiOrgChart, BuiOrgChartNode, BuiPageHeader, BuiPagination, BuiPaginationContent, BuiPaginationEllipsis, BuiPaginationItem, BuiPaginationLink, BuiParallax, BuiPasswordStrength, BuiPhoneInput, BuiPopover, BuiPopoverContent, BuiPresence, BuiPrice, BuiProductCard, BuiProgress, BuiPromptInput, BuiQrCode, BuiQuantitySelector, BuiQuote, BuiRadioGroup, BuiRadioGroupItem, BuiRating, BuiReasoning, BuiRepeater, BuiResizableHandle, BuiResizablePanel, BuiResizablePanelGroup, BuiRichTextEditor, BuiScheduler, BuiScrollArea, BuiScrollspy, BuiSegmentedControl, BuiSelect, BuiSeparator, BuiSheet, BuiSidebar, BuiSidebarMenuButton, BuiSignaturePad, BuiSkeleton, BuiSlider, BuiSonner, BuiSparkline, BuiSpeedDial, BuiSpinner, BuiSpotlightCard, BuiStack, BuiStat, BuiStepper, BuiStepperItem, BuiStreamingText, BuiSwitch, BuiTabList, BuiTabPanel, BuiTabTrigger, BuiTable, BuiTableBody, BuiTableCaption, BuiTableCell, BuiTableContainer, BuiTableFooter, BuiTableHead, BuiTableHeader, BuiTableRow, BuiTabs, BuiTagsInput, BuiTerminal, BuiTextReveal, BuiTextarea, BuiThemeCustomizer, BuiTiltCard, BuiTimeField, BuiTimeline, BuiTimelineItem, BuiToaster, BuiToggle, BuiToggleGroup, BuiToggleGroupItem, BuiToolCall, BuiTooltip, BuiTooltipContent, BuiTopProgress, BuiTree, BuiTreeNode, BuiTreeTable, BuiTypewriter, BuiTypography, BuiVariantSelector, BuiVideo, BuiVisuallyHidden, THEME_TOKENS, ThemeStore, buttonVariants, cn, encodeQr, toggleVariants };
20045
+ export { BUI_DEFAULT_LABELS, BUI_LABELS, BuiAccent, BuiAccordion, BuiAccordionContent, BuiAccordionItem, BuiAccordionTrigger, BuiAddToCart, BuiAlert, BuiAlertDescription, BuiAlertDialogAction, BuiAlertDialogCancel, BuiAlertDialogContent, BuiAlertDialogDescription, BuiAlertDialogFooter, BuiAlertDialogHeader, BuiAlertDialogTitle, BuiAlertTitle, BuiAnimatedBeam, BuiAspectRatio, BuiAudioPlayer, BuiAurora, BuiAutocomplete, BuiAutosizeTextarea, BuiAvatar, BuiAvatarGroup, BuiBackToTop, BuiBadge, BuiBanner, BuiBentoGrid, BuiBentoItem, BuiBorderBeam, BuiBottomNavigation, BuiBottomNavigationItem, BuiBreadcrumb, BuiBreadcrumbEllipsis, BuiBreadcrumbItem, BuiBreadcrumbLink, BuiBreadcrumbList, BuiBreadcrumbPage, BuiBreadcrumbSeparator, BuiButton, BuiButtonGroup, BuiButtonGroupText, BuiCalendar, BuiCard, BuiCardAction, BuiCardContent, BuiCardDescription, BuiCardFooter, BuiCardHeader, BuiCardTitle, BuiCarousel, BuiChart, BuiChat, BuiChatMessage, BuiCheckbox, BuiCitation, BuiCodeBlock, BuiCollapsible, BuiCollapsibleContent, BuiCollapsibleTrigger, BuiColorPicker, BuiCombobox, BuiCommand, BuiComparisonSlider, BuiComparisonTable, BuiConfetti, BuiContainer, BuiContextMenu, BuiCookieConsent, BuiCopyButton, BuiCountdown, BuiDataTable, BuiDatePicker, BuiDatetimePicker, BuiDescriptionItem, BuiDescriptionList, BuiDialogContent, BuiDialogDescription, BuiDialogFooter, BuiDialogHeader, BuiDialogTitle, BuiDiffViewer, BuiDock, BuiDockItem, BuiDotPattern, BuiDrawer, BuiDropdownMenu, BuiDropdownMenuItem, BuiDropdownMenuLabel, BuiDropdownMenuSeparator, BuiEditable, BuiEmpty, BuiEmptyContent, BuiEmptyDescription, BuiEmptyHeader, BuiEmptyMedia, BuiEmptyTitle, BuiField, BuiFieldContent, BuiFieldDescription, BuiFieldError, BuiFieldGroup, BuiFieldLabel, BuiFieldLegend, BuiFieldSeparator, BuiFieldSet, BuiFieldTitle, BuiFileUpload, BuiFlipCard, BuiGallery, BuiGantt, BuiGradientText, BuiGridPattern, BuiHeatmap, BuiHoverCard, BuiHoverCardContent, BuiImage, BuiInfiniteScroll, BuiInput, BuiInputGroup, BuiInputGroupAddon, BuiInputGroupButton, BuiInputGroupInput, BuiInputGroupText, BuiInputMask, BuiInputOtp, BuiItem, BuiItemActions, BuiItemContent, BuiItemDescription, BuiItemGroup, BuiItemMedia, BuiItemTitle, BuiJsonViewer, BuiJsonViewerNode, BuiKanban, BuiKbd, BuiKbdGroup, BuiKnob, BuiLabel, BuiLink, BuiLoadingOverlay, BuiMap, BuiMarkdownEditor, BuiMarquee, BuiMasonry, BuiMentionInput, BuiMenubar, BuiMenubarTrigger, BuiMeteors, BuiMeter, BuiMiniCart, BuiNavigationMenu, BuiNotificationCenter, BuiNumberInput, BuiNumberTicker, BuiOnboardingTour, BuiOrgChart, BuiOrgChartNode, BuiPageHeader, BuiPagination, BuiPaginationContent, BuiPaginationEllipsis, BuiPaginationItem, BuiPaginationLink, BuiParallax, BuiPasswordStrength, BuiPhoneInput, BuiPopover, BuiPopoverContent, BuiPresence, BuiPrice, BuiProductCard, BuiProgress, BuiPromptInput, BuiQrCode, BuiQuantitySelector, BuiQuote, BuiRadioGroup, BuiRadioGroupItem, BuiRating, BuiReasoning, BuiRepeater, BuiResizableHandle, BuiResizablePanel, BuiResizablePanelGroup, BuiRichTextEditor, BuiScheduler, BuiScrollArea, BuiScrollspy, BuiSegmentedControl, BuiSelect, BuiSeparator, BuiSheet, BuiSidebar, BuiSidebarMenuButton, BuiSignaturePad, BuiSkeleton, BuiSlider, BuiSonner, BuiSparkline, BuiSpeedDial, BuiSpinner, BuiSpotlightCard, BuiStack, BuiStat, BuiStepper, BuiStepperItem, BuiStreamingText, BuiSwitch, BuiTabList, BuiTabPanel, BuiTabTrigger, BuiTable, BuiTableBody, BuiTableCaption, BuiTableCell, BuiTableContainer, BuiTableFooter, BuiTableHead, BuiTableHeader, BuiTableRow, BuiTabs, BuiTagsInput, BuiTerminal, BuiTextReveal, BuiTextarea, BuiThemeCustomizer, BuiTiltCard, BuiTimeField, BuiTimeline, BuiTimelineItem, BuiToaster, BuiToggle, BuiToggleGroup, BuiToggleGroupItem, BuiToolCall, BuiTooltip, BuiTooltipContent, BuiTopProgress, BuiTree, BuiTreeNode, BuiTreeTable, BuiTypewriter, BuiTypography, BuiVariantSelector, BuiVideo, BuiVisuallyHidden, THEME_TOKENS, ThemeStore, buiLabel, buttonVariants, cn, encodeQr, provideBuiLabels, toggleVariants };
19178
20046
  //# sourceMappingURL=ng-blatui.mjs.map