ng-blatui 1.29.0 → 1.31.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.
@@ -151,8 +151,10 @@ const buttonVariants = cva("inline-flex shrink-0 items-center justify-center gap
151
151
  * semantics, focus and keyboard behavior (accessibility for free).
152
152
  */
153
153
  class BuiButton {
154
+ /** Visual style of the button. */
154
155
  variant = input('default', /* @ts-ignore */
155
156
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
157
+ /** Size preset controlling height, padding and icon scale. */
156
158
  size = input('default', /* @ts-ignore */
157
159
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
158
160
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -172,8 +174,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
172
174
  }]
173
175
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
174
176
 
175
- const BASE$2 = 'inline-flex items-center justify-center rounded-md border font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden';
176
- const SIZES$6 = {
177
+ const BASE$1 = 'inline-flex items-center justify-center rounded-md border font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden';
178
+ const SIZES$4 = {
177
179
  sm: 'px-1.5 py-px text-[0.625rem]',
178
180
  default: 'px-2 py-0.5 text-xs',
179
181
  lg: 'px-3 py-1 text-sm [&>svg]:size-3.5',
@@ -237,17 +239,20 @@ function intensityFor(variant) {
237
239
  * element so it stays in the document flow and screen-reader friendly.
238
240
  */
239
241
  class BuiBadge {
242
+ /** Brand variant, or the intensity (`soft`/`solid`/`outline`) when a `tone` is set. */
240
243
  variant = input('default', /* @ts-ignore */
241
244
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
245
+ /** Optional semantic tone; when set it overrides the brand variant's color. */
242
246
  tone = input(null, /* @ts-ignore */
243
247
  ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
248
+ /** Badge size preset. */
244
249
  size = input('default', /* @ts-ignore */
245
250
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
246
251
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
247
252
  computedClass = computed(() => {
248
253
  const tone = this.tone();
249
254
  const toneOrVariant = tone === null ? brandClass(this.variant()) : TONES$2[tone][intensityFor(this.variant())];
250
- return cn(BASE$2, SIZES$6[this.size()], toneOrVariant, this.userClass());
255
+ return cn(BASE$1, SIZES$4[this.size()], toneOrVariant, this.userClass());
251
256
  }, /* @ts-ignore */
252
257
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
253
258
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiBadge, deps: [], target: i0.ɵɵFactoryTarget.Directive });
@@ -291,8 +296,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
291
296
  * `[decorative]="false"` for a semantic `role="separator"` with `aria-orientation`.
292
297
  */
293
298
  class BuiSeparator {
299
+ /** Axis the separator runs along, also driving its sizing. */
294
300
  orientation = input('horizontal', /* @ts-ignore */
295
301
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
302
+ /** Whether the separator is purely visual; `false` exposes a semantic `role="separator"`. */
296
303
  decorative = input(true, /* @ts-ignore */
297
304
  ...(ngDevMode ? [{ debugName: "decorative" }] : /* istanbul ignore next */ []));
298
305
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -346,6 +353,7 @@ const CARD_VARIANTS = {
346
353
  };
347
354
  /** BlatUI card container. Use `variant="sectioned"` with the header/content/footer parts. */
348
355
  class BuiCard {
356
+ /** Card layout style: simple padded box or sectioned container. */
349
357
  variant = input('default', /* @ts-ignore */
350
358
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
351
359
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -463,8 +471,10 @@ const ALERT_TONES = {
463
471
  * (`default | destructive`) or semantic `tone` (`success | warning | danger | info | neutral`).
464
472
  */
465
473
  class BuiAlert {
474
+ /** Brand style; ignored when `tone` is set. */
466
475
  variant = input('default', /* @ts-ignore */
467
476
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
477
+ /** Semantic tone; when set, overrides `variant`. */
468
478
  tone = input(null, /* @ts-ignore */
469
479
  ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
470
480
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -521,6 +531,7 @@ const INPUT_SIZES = {
521
531
  };
522
532
  /** Applies BlatUI input styling to a native `<input>` (keeps native validation & a11y). */
523
533
  class BuiInput {
534
+ /** Size preset controlling input height, padding and text size. */
524
535
  size = input('default', /* @ts-ignore */
525
536
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
526
537
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -547,15 +558,36 @@ const TEXTAREA_SIZES = {
547
558
  default: 'min-h-16 px-3 py-2 text-base md:text-sm',
548
559
  lg: 'min-h-20 px-4 py-2.5 text-base',
549
560
  };
550
- /** Applies BlatUI textarea styling to a native `<textarea>` (auto-grows via field-sizing). */
561
+ // Vertical padding (top + bottom) baked into each size preset, used to compute the `maxRows`
562
+ // height cap. Mirrors the `py-*` utilities in TEXTAREA_SIZES.
563
+ const TEXTAREA_PADDING_Y = {
564
+ sm: '0.75rem',
565
+ default: '1rem',
566
+ lg: '1.25rem',
567
+ };
568
+ /**
569
+ * Applies BlatUI textarea styling to a native `<textarea>`. Auto-grows with its content via CSS
570
+ * `field-sizing-content` (no JS). Set `[maxRows]` to cap the growth — past it the field scrolls.
571
+ */
551
572
  class BuiTextarea {
573
+ /** Size preset controlling minimum height, padding and text size. */
552
574
  size = input('default', /* @ts-ignore */
553
575
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
576
+ /** Maximum number of rows before the textarea scrolls instead of growing (null = unlimited). */
577
+ maxRows = input(null, /* @ts-ignore */
578
+ ...(ngDevMode ? [{ debugName: "maxRows" }] : /* istanbul ignore next */ []));
554
579
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
555
580
  computedClass = computed(() => cn(TEXTAREA_BASE, TEXTAREA_SIZES[this.size()], this.userClass()), /* @ts-ignore */
556
581
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
582
+ // Cap the auto-grow at `maxRows` lines using the `lh` unit (one line-height) plus the size's
583
+ // vertical padding and the 1px borders — purely declarative, so it stays SSR-safe.
584
+ maxHeight = computed(() => {
585
+ const rows = this.maxRows();
586
+ return rows === null ? null : `calc(${rows} * 1lh + ${TEXTAREA_PADDING_Y[this.size()]} + 2px)`;
587
+ }, /* @ts-ignore */
588
+ ...(ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []));
557
589
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiTextarea, deps: [], target: i0.ɵɵFactoryTarget.Directive });
558
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: BuiTextarea, isStandalone: true, selector: "textarea[buiTextarea]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "textarea" }, properties: { "attr.data-size": "size()", "class": "computedClass()" } }, ngImport: i0 });
590
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: BuiTextarea, isStandalone: true, selector: "textarea[buiTextarea]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, maxRows: { classPropertyName: "maxRows", publicName: "maxRows", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "textarea" }, properties: { "attr.data-size": "size()", "class": "computedClass()", "style.max-height": "maxHeight()", "style.overflow-y": "maxRows() === null ? null : 'auto'" } }, ngImport: i0 });
559
591
  }
560
592
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiTextarea, decorators: [{
561
593
  type: Directive,
@@ -565,17 +597,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
565
597
  'data-slot': 'textarea',
566
598
  '[attr.data-size]': 'size()',
567
599
  '[class]': 'computedClass()',
600
+ '[style.max-height]': 'maxHeight()',
601
+ '[style.overflow-y]': "maxRows() === null ? null : 'auto'",
568
602
  },
569
603
  }]
570
- }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
604
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], maxRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxRows", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
571
605
 
572
606
  /**
573
607
  * BlatUI linear progress bar. Exposes the full `progressbar` ARIA contract
574
608
  * (valuemin/max/now/text). Set `[indeterminate]="true"` for an unknown-duration bar.
575
609
  */
576
610
  class BuiProgress {
611
+ /** Completion percentage from 0 to 100; values are clamped to that range. */
577
612
  value = input(0, /* @ts-ignore */
578
613
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
614
+ /** Show an unknown-duration animation instead of a fixed value. */
579
615
  indeterminate = input(false, /* @ts-ignore */
580
616
  ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
581
617
  /** Render a circular ring instead of a linear bar. */
@@ -587,6 +623,7 @@ class BuiProgress {
587
623
  /** Stroke width of the circular ring, in pixels. */
588
624
  thickness = input(4, /* @ts-ignore */
589
625
  ...(ngDevMode ? [{ debugName: "thickness" }] : /* istanbul ignore next */ []));
626
+ /** Accessible label announced for the progress bar. */
590
627
  ariaLabel = input('Progress', /* @ts-ignore */
591
628
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
592
629
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -718,8 +755,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
718
755
  * the projected fallback (initials, icon). Falls back automatically on load error.
719
756
  */
720
757
  class BuiAvatar {
758
+ /** Image URL to display; when unset or on load error the fallback is shown. */
721
759
  src = input(null, /* @ts-ignore */
722
760
  ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
761
+ /** Alternative text for the avatar image. */
723
762
  alt = input('', /* @ts-ignore */
724
763
  ...(ngDevMode ? [{ debugName: "alt" }] : /* istanbul ignore next */ []));
725
764
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -784,10 +823,13 @@ const CHECKBOX_BASE = 'peer border-input dark:bg-input/30 data-[state=checked]:b
784
823
  * with `[(checked)]` two-way binding and tri-state `[(indeterminate)]`.
785
824
  */
786
825
  class BuiCheckbox {
826
+ /** Whether the box is checked. Two-way bindable with `[(checked)]`. */
787
827
  checked = model(false, /* @ts-ignore */
788
828
  ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
829
+ /** Whether the box shows the mixed/indeterminate state. Two-way bindable with `[(indeterminate)]`. */
789
830
  indeterminate = model(false, /* @ts-ignore */
790
831
  ...(ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []));
832
+ /** Whether the checkbox is disabled. Two-way bindable with `[(disabled)]`. */
791
833
  disabled = model(false, /* @ts-ignore */
792
834
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
793
835
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -944,10 +986,13 @@ const THUMB_BASE = 'bg-background dark:data-[state=unchecked]:bg-foreground dark
944
986
  * binding; keyboard activation (Space/Enter) and focus come from the native button.
945
987
  */
946
988
  class BuiSwitch {
989
+ /** Whether the switch is on. Two-way bindable with `[(checked)]`. */
947
990
  checked = model(false, /* @ts-ignore */
948
991
  ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
992
+ /** Whether the switch is disabled. Two-way bindable with `[(disabled)]`. */
949
993
  disabled = model(false, /* @ts-ignore */
950
994
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
995
+ /** Track and thumb size. */
951
996
  size = input('default', /* @ts-ignore */
952
997
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
953
998
  /** Optional SVG path `d` shown inside the thumb when checked. */
@@ -2096,8 +2141,10 @@ const noop$g = () => { };
2096
2141
  * `buiRadioItem` buttons; `[(value)]` two-way binds the selected value.
2097
2142
  */
2098
2143
  class BuiRadioGroup {
2144
+ /** Selected radio value. Two-way bindable with `[(value)]`. */
2099
2145
  value = model(null, /* @ts-ignore */
2100
2146
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2147
+ /** Whether the whole group is disabled. Two-way bindable with `[(disabled)]`. */
2101
2148
  disabled = model(false, /* @ts-ignore */
2102
2149
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
2103
2150
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2163,8 +2210,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2163
2210
  }], 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 }] }] } });
2164
2211
  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';
2165
2212
  class BuiRadioGroupItem {
2213
+ /** Value this item contributes to the group when selected. */
2166
2214
  value = input.required(/* @ts-ignore */
2167
2215
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
2216
+ /** Whether this individual radio item is disabled. */
2168
2217
  disabled = input(false, /* @ts-ignore */
2169
2218
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
2170
2219
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2223,6 +2272,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2223
2272
  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';
2224
2273
  /** Floating tooltip bubble rendered into a CDK overlay. */
2225
2274
  class BuiTooltipContent {
2275
+ /** Text rendered inside the tooltip bubble. */
2226
2276
  text = input('', /* @ts-ignore */
2227
2277
  ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
2228
2278
  /** Extra classes (e.g. a colour override) merged over the base bubble styles. */
@@ -2260,7 +2310,9 @@ const FALLBACK = {
2260
2310
  * a hover delay with `delay`, and the bubble colour with `tooltipClass`.
2261
2311
  */
2262
2312
  class BuiTooltip {
2313
+ /** Tooltip text; bound via the `buiTooltip` attribute. */
2263
2314
  text = input.required({ ...(ngDevMode ? { debugName: "text" } : /* istanbul ignore next */ {}), alias: 'buiTooltip' });
2315
+ /** Preferred placement side relative to the host, with an automatic flip fallback. */
2264
2316
  side = input('top', /* @ts-ignore */
2265
2317
  ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
2266
2318
  /** Delay in milliseconds before the tooltip appears on hover/focus. */
@@ -2335,6 +2387,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2335
2387
 
2336
2388
  /** Breadcrumb navigation landmark (`<nav aria-label="breadcrumb">`). */
2337
2389
  class BuiBreadcrumb {
2390
+ /** Accessible label for the breadcrumb navigation landmark. */
2338
2391
  label = input(/* @ts-ignore */
2339
2392
  ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
2340
2393
  labelText = buiLabel('breadcrumb', this.label);
@@ -2463,6 +2516,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2463
2516
  /** Collapsed breadcrumb indicator (ellipsis). */
2464
2517
  class BuiBreadcrumbEllipsis {
2465
2518
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
2519
+ /** Screen-reader text for the collapsed ellipsis indicator. */
2466
2520
  moreLabel = input(/* @ts-ignore */
2467
2521
  ...(ngDevMode ? [undefined, { debugName: "moreLabel" }] : /* istanbul ignore next */ []));
2468
2522
  moreText = buiLabel('breadcrumbMore', this.moreLabel);
@@ -2533,6 +2587,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2533
2587
 
2534
2588
  /** Constrains projected content to a given aspect ratio (e.g. `16 / 9`). */
2535
2589
  class BuiAspectRatio {
2590
+ /** Aspect ratio for the content, as a CSS `aspect-ratio` value (e.g. `16 / 9`). */
2536
2591
  ratio = input('1 / 1', /* @ts-ignore */
2537
2592
  ...(ngDevMode ? [{ debugName: "ratio" }] : /* istanbul ignore next */ []));
2538
2593
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2556,6 +2611,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2556
2611
 
2557
2612
  /** Groups buttons (and inputs) into a single segmented control. */
2558
2613
  class BuiButtonGroup {
2614
+ /** Layout direction of the grouped controls. */
2559
2615
  orientation = input('horizontal', /* @ts-ignore */
2560
2616
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
2561
2617
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2622,6 +2678,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2622
2678
  }]
2623
2679
  }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2624
2680
  class BuiEmptyMedia {
2681
+ /** Media style; `icon` renders a muted rounded badge sized for an icon. */
2625
2682
  variant = input('default', /* @ts-ignore */
2626
2683
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
2627
2684
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2685,7 +2742,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2685
2742
  }]
2686
2743
  }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2687
2744
 
2688
- const SIZES$5 = {
2745
+ const SIZES$3 = {
2689
2746
  sm: 'max-w-3xl',
2690
2747
  md: 'max-w-5xl',
2691
2748
  lg: 'max-w-6xl',
@@ -2695,10 +2752,11 @@ const SIZES$5 = {
2695
2752
  };
2696
2753
  /** Centered, padded page container with a max-width scale. */
2697
2754
  class BuiContainer {
2755
+ /** Maximum width preset for the container. */
2698
2756
  size = input('lg', /* @ts-ignore */
2699
2757
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
2700
2758
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
2701
- computedClass = computed(() => cn('mx-auto w-full px-4 sm:px-6 lg:px-8', SIZES$5[this.size()], this.userClass()), /* @ts-ignore */
2759
+ computedClass = computed(() => cn('mx-auto w-full px-4 sm:px-6 lg:px-8', SIZES$3[this.size()], this.userClass()), /* @ts-ignore */
2702
2760
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
2703
2761
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiContainer, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2704
2762
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: BuiContainer, isStandalone: true, selector: "[buiContainer]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "container" }, properties: { "class": "computedClass()" } }, ngImport: i0 });
@@ -2718,6 +2776,7 @@ const FIELD_ORIENT = {
2718
2776
  };
2719
2777
  /** A form field row grouping a label, control, description and error. */
2720
2778
  class BuiField {
2779
+ /** How the label and control are arranged within the field. */
2721
2780
  orientation = input('vertical', /* @ts-ignore */
2722
2781
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
2723
2782
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2753,6 +2812,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2753
2812
  }]
2754
2813
  }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2755
2814
  class BuiFieldLegend {
2815
+ /** Whether the legend is styled as a section legend or a smaller label. */
2756
2816
  variant = input('legend', /* @ts-ignore */
2757
2817
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
2758
2818
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -2787,6 +2847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2787
2847
  }]
2788
2848
  }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
2789
2849
  class BuiFieldLabel {
2850
+ /** Id of the control this label is associated with (maps to the `for` attribute). */
2790
2851
  forId = input(undefined, { ...(ngDevMode ? { debugName: "forId" } : /* istanbul ignore next */ {}), alias: 'for' });
2791
2852
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
2792
2853
  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 */
@@ -2887,6 +2948,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
2887
2948
 
2888
2949
  /** Accessible disclosure: a trigger toggles the visibility of its content. */
2889
2950
  class BuiCollapsible {
2951
+ /** Whether the content is shown. Two-way bindable with `[(open)]`. */
2890
2952
  open = model(false, /* @ts-ignore */
2891
2953
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
2892
2954
  contentId = inject(_IdGenerator).getId('bui-collapsible-');
@@ -2959,12 +3021,16 @@ const toggleVariants = cva("inline-flex items-center justify-center gap-2 rounde
2959
3021
  });
2960
3022
  /** A two-state toggle button (`aria-pressed`). */
2961
3023
  class BuiToggle {
3024
+ /** Whether the toggle is pressed (on). Two-way bindable with `[(pressed)]`. */
2962
3025
  pressed = model(false, /* @ts-ignore */
2963
3026
  ...(ngDevMode ? [{ debugName: "pressed" }] : /* istanbul ignore next */ []));
3027
+ /** Whether the toggle is disabled. Two-way bindable with `[(disabled)]`. */
2964
3028
  disabled = model(false, /* @ts-ignore */
2965
3029
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
3030
+ /** Visual style: plain or outlined. */
2966
3031
  variant = input('default', /* @ts-ignore */
2967
3032
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3033
+ /** Button size. */
2968
3034
  size = input('default', /* @ts-ignore */
2969
3035
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
2970
3036
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3021,6 +3087,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3021
3087
  /** A spinning loading indicator (`role="status"`). */
3022
3088
  class BuiSpinner {
3023
3089
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
3090
+ /** Overrides the localized accessible status label. */
3024
3091
  label = input(/* @ts-ignore */
3025
3092
  ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
3026
3093
  labelText = buiLabel('spinnerLoading', this.label);
@@ -3071,8 +3138,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3071
3138
 
3072
3139
  /** Copy-to-clipboard button: copies `value`, flips to a check, announces "Copied". */
3073
3140
  class BuiCopyButton {
3141
+ /** Text written to the clipboard when clicked. */
3074
3142
  value = input('', /* @ts-ignore */
3075
3143
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
3144
+ /** Accessible label shown before copying. */
3076
3145
  label = input('Copy', /* @ts-ignore */
3077
3146
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
3078
3147
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3189,15 +3258,20 @@ const TONES$1 = {
3189
3258
  * the dismissal in localStorage. SSR-safe — localStorage is only touched in the browser.
3190
3259
  */
3191
3260
  class BuiBanner {
3261
+ /** Color tone (`default | primary | info | success | warning | danger`). */
3192
3262
  tone = input('default', /* @ts-ignore */
3193
3263
  ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
3264
+ /** Whether to show the dismiss button. */
3194
3265
  dismissible = input(true, /* @ts-ignore */
3195
3266
  ...(ngDevMode ? [{ debugName: "dismissible" }] : /* istanbul ignore next */ []));
3267
+ /** When set, the dismissal is remembered in localStorage under this key. */
3196
3268
  persistKey = input(undefined, /* @ts-ignore */
3197
3269
  ...(ngDevMode ? [{ debugName: "persistKey" }] : /* istanbul ignore next */ []));
3198
3270
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
3271
+ /** Overrides the localized accessible label for the announcement region. */
3199
3272
  announcementLabel = input(/* @ts-ignore */
3200
3273
  ...(ngDevMode ? [undefined, { debugName: "announcementLabel" }] : /* istanbul ignore next */ []));
3274
+ /** Overrides the localized accessible label for the dismiss button. */
3201
3275
  dismissLabel = input(/* @ts-ignore */
3202
3276
  ...(ngDevMode ? [undefined, { debugName: "dismissLabel" }] : /* istanbul ignore next */ []));
3203
3277
  announcementText = buiLabel('bannerAnnouncement', this.announcementLabel);
@@ -3292,6 +3366,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3292
3366
 
3293
3367
  /** Scroll/border wrapper around a table. `variant="card"` adds a bordered card. */
3294
3368
  class BuiTableContainer {
3369
+ /** Wrapper style; `card` adds a bordered, shadowed card around the table. */
3295
3370
  variant = input('default', /* @ts-ignore */
3296
3371
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3297
3372
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3424,7 +3499,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3424
3499
  }]
3425
3500
  }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
3426
3501
 
3427
- const SIZES$4 = {
3502
+ const SIZES$2 = {
3428
3503
  sm: { box: 'size-6', overlap: '-ms-2', ring: 'ring-1', text: 'text-xs' },
3429
3504
  default: { box: 'size-8', overlap: '-ms-2.5', ring: 'ring-2', text: 'text-sm' },
3430
3505
  lg: { box: 'size-12', overlap: '-ms-3', ring: 'ring-2', text: 'text-base' },
@@ -3441,10 +3516,13 @@ function initials(name) {
3441
3516
  }
3442
3517
  /** Overlapping stack of avatars with an optional "+N" overflow counter. */
3443
3518
  class BuiAvatarGroup {
3519
+ /** Avatars to display, in order. */
3444
3520
  avatars = input([], /* @ts-ignore */
3445
3521
  ...(ngDevMode ? [{ debugName: "avatars" }] : /* istanbul ignore next */ []));
3522
+ /** Maximum avatars shown before the rest collapse into a "+N" counter. */
3446
3523
  max = input(4, /* @ts-ignore */
3447
3524
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
3525
+ /** Avatar size preset, which also controls overlap and ring width. */
3448
3526
  size = input('default', /* @ts-ignore */
3449
3527
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
3450
3528
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3456,11 +3534,11 @@ class BuiAvatarGroup {
3456
3534
  ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
3457
3535
  toInitials = initials;
3458
3536
  itemClass(index) {
3459
- const size = SIZES$4[this.size()];
3537
+ const size = SIZES$2[this.size()];
3460
3538
  return cn(size.box, size.ring, 'ring-background', index > 0 && size.overlap);
3461
3539
  }
3462
3540
  moreClass() {
3463
- const size = SIZES$4[this.size()];
3541
+ const size = SIZES$2[this.size()];
3464
3542
  return cn('relative z-10 flex shrink-0 items-center justify-center rounded-full bg-muted font-medium text-foreground', size.box, size.ring, 'ring-background', size.text, this.shown().length > 0 && size.overlap);
3465
3543
  }
3466
3544
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiAvatarGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -3516,6 +3594,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3516
3594
 
3517
3595
  /** Pagination navigation landmark. */
3518
3596
  class BuiPagination {
3597
+ /** Accessible label for the navigation landmark; falls back to a localized default. */
3519
3598
  ariaLabel = input(/* @ts-ignore */
3520
3599
  ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
3521
3600
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3571,8 +3650,10 @@ const LINK_SIZES = {
3571
3650
  };
3572
3651
  /** A pagination link; set `active` for the current page. */
3573
3652
  class BuiPaginationLink {
3653
+ /** Whether this link represents the current page; sets `aria-current="page"`. */
3574
3654
  active = input(false, /* @ts-ignore */
3575
3655
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
3656
+ /** Size variant controlling link dimensions and padding. */
3576
3657
  size = input('icon', /* @ts-ignore */
3577
3658
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
3578
3659
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3598,6 +3679,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3598
3679
  /** Ellipsis indicator for skipped pages. */
3599
3680
  class BuiPaginationEllipsis {
3600
3681
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
3682
+ /** Visually-hidden label announcing skipped pages; falls back to a localized default. */
3601
3683
  moreLabel = input(/* @ts-ignore */
3602
3684
  ...(ngDevMode ? [undefined, { debugName: "moreLabel" }] : /* istanbul ignore next */ []));
3603
3685
  moreText = buiLabel('paginationMore', this.moreLabel);
@@ -3663,7 +3745,9 @@ const POPOVER_FALLBACK = {
3663
3745
  * Closes on outside click and Escape. SSR-safe (the overlay is browser-only, on click).
3664
3746
  */
3665
3747
  class BuiPopover {
3748
+ /** Template rendered as the popover content; bound via `[buiPopover]`. */
3666
3749
  content = input.required({ ...(ngDevMode ? { debugName: "content" } : /* istanbul ignore next */ {}), alias: 'buiPopover' });
3750
+ /** Side of the trigger the popover opens on, with an automatic opposite-side fallback. */
3667
3751
  side = input('bottom', /* @ts-ignore */
3668
3752
  ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
3669
3753
  overlay = inject(Overlay);
@@ -3759,8 +3843,10 @@ const ITEM_SIZES = {
3759
3843
  };
3760
3844
  /** A list/row item; use on a `<div>` or an `<a>`. */
3761
3845
  class BuiItem {
3846
+ /** Visual style of the item: transparent, outlined, or muted background. */
3762
3847
  variant = input('default', /* @ts-ignore */
3763
3848
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3849
+ /** Item density: standard padding or a more compact `sm` size. */
3764
3850
  size = input('default', /* @ts-ignore */
3765
3851
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
3766
3852
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3787,6 +3873,7 @@ const MEDIA_VARIANTS = {
3787
3873
  image: 'size-10 overflow-hidden rounded-sm [&_img]:size-full [&_img]:object-cover',
3788
3874
  };
3789
3875
  class BuiItemMedia {
3876
+ /** Media presentation: plain, an icon tile, or a cropped image thumbnail. */
3790
3877
  variant = input('default', /* @ts-ignore */
3791
3878
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
3792
3879
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3934,6 +4021,7 @@ const ADDON_ALIGN = {
3934
4021
  'block-end': 'order-last w-full justify-start px-3 pb-3',
3935
4022
  };
3936
4023
  class BuiInputGroupAddon {
4024
+ /** Where the addon sits relative to the input (inline or block, start or end). */
3937
4025
  align = input('inline-start', /* @ts-ignore */
3938
4026
  ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
3939
4027
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -3994,8 +4082,10 @@ const IG_BUTTON_SIZES = {
3994
4082
  'icon-sm': 'size-8 p-0',
3995
4083
  };
3996
4084
  class BuiInputGroupButton {
4085
+ /** Visual style of the addon button. */
3997
4086
  variant = input('ghost', /* @ts-ignore */
3998
4087
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
4088
+ /** Size preset for the addon button (text or icon variants). */
3999
4089
  size = input('xs', /* @ts-ignore */
4000
4090
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
4001
4091
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -4014,6 +4104,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4014
4104
 
4015
4105
  /** Visually hides content while keeping it available to assistive tech (sr-only). */
4016
4106
  class BuiVisuallyHidden {
4107
+ /** Whether the content becomes visible when focused (e.g. skip links). */
4017
4108
  focusable = input(false, /* @ts-ignore */
4018
4109
  ...(ngDevMode ? [{ debugName: "focusable" }] : /* istanbul ignore next */ []));
4019
4110
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -4039,21 +4130,28 @@ const TONES = {
4039
4130
  };
4040
4131
  /** A labelled meter (`role="meter"`) for a measurement within a known range. */
4041
4132
  class BuiMeter {
4133
+ /** Current measurement; clamped between `min` and `max`. */
4042
4134
  value = input(0, /* @ts-ignore */
4043
4135
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
4136
+ /** Minimum value of the meter range. */
4044
4137
  min = input(0, /* @ts-ignore */
4045
4138
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
4139
+ /** Maximum value of the meter range. */
4046
4140
  max = input(100, /* @ts-ignore */
4047
4141
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
4142
+ /** Optional text label shown above the meter bar. */
4048
4143
  label = input(null, /* @ts-ignore */
4049
4144
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
4145
+ /** Fill colour tone; overridden by any matching threshold. */
4050
4146
  tone = input('default', /* @ts-ignore */
4051
4147
  ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
4052
4148
  /** Auto-pick the fill tone by value: the highest threshold whose `at` ≤ value wins. */
4053
4149
  thresholds = input([], /* @ts-ignore */
4054
4150
  ...(ngDevMode ? [{ debugName: "thresholds" }] : /* istanbul ignore next */ []));
4151
+ /** Whether to display the formatted value text next to the label. */
4055
4152
  showValue = input(true, /* @ts-ignore */
4056
4153
  ...(ngDevMode ? [{ debugName: "showValue" }] : /* istanbul ignore next */ []));
4154
+ /** Unit suffix appended to the displayed value (e.g. "%"). */
4057
4155
  unit = input('%', /* @ts-ignore */
4058
4156
  ...(ngDevMode ? [{ debugName: "unit" }] : /* istanbul ignore next */ []));
4059
4157
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -4157,14 +4255,19 @@ const TREND_CLASS = {
4157
4255
  };
4158
4256
  /** A KPI / statistic card: label, big value, and a trend-coloured change. */
4159
4257
  class BuiStat {
4258
+ /** Small caption shown above the value. */
4160
4259
  label = input(null, /* @ts-ignore */
4161
4260
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
4261
+ /** Primary statistic displayed as the large value. */
4162
4262
  value = input('', /* @ts-ignore */
4163
4263
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
4264
+ /** Change indicator (e.g. "+12%"); coloured by trend. */
4164
4265
  change = input(null, /* @ts-ignore */
4165
4266
  ...(ngDevMode ? [{ debugName: "change" }] : /* istanbul ignore next */ []));
4267
+ /** Explicit trend direction; inferred from `change`'s sign when null. */
4166
4268
  trend = input(null, /* @ts-ignore */
4167
4269
  ...(ngDevMode ? [{ debugName: "trend" }] : /* istanbul ignore next */ []));
4270
+ /** Muted text shown next to the change value. */
4168
4271
  caption = input(null, /* @ts-ignore */
4169
4272
  ...(ngDevMode ? [{ debugName: "caption" }] : /* istanbul ignore next */ []));
4170
4273
  /** Optional inline sparkline drawn from a series of numbers. */
@@ -4283,9 +4386,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4283
4386
  * and stays open while the pointer is over the card. SSR-safe (browser-only, on hover).
4284
4387
  */
4285
4388
  class BuiHoverCard {
4389
+ /** Template rendered inside the card; bound via the `buiHoverCard` attribute. */
4286
4390
  content = input.required({ ...(ngDevMode ? { debugName: "content" } : /* istanbul ignore next */ {}), alias: 'buiHoverCard' });
4391
+ /** Delay in milliseconds before the card opens on hover/focus. */
4287
4392
  openDelay = input(400, /* @ts-ignore */
4288
4393
  ...(ngDevMode ? [{ debugName: "openDelay" }] : /* istanbul ignore next */ []));
4394
+ /** Delay in milliseconds before the card closes after the pointer leaves. */
4289
4395
  closeDelay = input(100, /* @ts-ignore */
4290
4396
  ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
4291
4397
  overlay = inject(Overlay);
@@ -4377,15 +4483,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4377
4483
 
4378
4484
  /** A dark code panel with an optional filename header and a copy button. */
4379
4485
  class BuiCodeBlock {
4486
+ /** Source code shown in the panel and copied to the clipboard. */
4380
4487
  code = input('', /* @ts-ignore */
4381
4488
  ...(ngDevMode ? [{ debugName: "code" }] : /* istanbul ignore next */ []));
4489
+ /** Optional filename shown in the header; omit for the floating copy button. */
4382
4490
  filename = input(null, /* @ts-ignore */
4383
4491
  ...(ngDevMode ? [{ debugName: "filename" }] : /* istanbul ignore next */ []));
4384
4492
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
4493
+ /** Accessible label for the copy button. */
4385
4494
  copyLabel = input(/* @ts-ignore */
4386
4495
  ...(ngDevMode ? [undefined, { debugName: "copyLabel" }] : /* istanbul ignore next */ []));
4496
+ /** Short visible text for the copy button. */
4387
4497
  copyShortLabel = input(/* @ts-ignore */
4388
4498
  ...(ngDevMode ? [undefined, { debugName: "copyShortLabel" }] : /* istanbul ignore next */ []));
4499
+ /** Text shown briefly after the code is copied. */
4389
4500
  copiedLabel = input(/* @ts-ignore */
4390
4501
  ...(ngDevMode ? [undefined, { debugName: "copiedLabel" }] : /* istanbul ignore next */ []));
4391
4502
  copyText = buiLabel('codeBlockCopy', this.copyLabel);
@@ -4480,23 +4591,31 @@ const noop$e = () => { };
4480
4591
  * only read inside browser event handlers.
4481
4592
  */
4482
4593
  class BuiSlider {
4594
+ /** Current value (lower thumb in range mode). Two-way bindable with `[(value)]`. */
4483
4595
  value = model(0, /* @ts-ignore */
4484
4596
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
4485
4597
  /** Enable a second thumb; binds `endValue` as the upper handle. */
4486
4598
  range = input(false, /* @ts-ignore */
4487
4599
  ...(ngDevMode ? [{ debugName: "range" }] : /* istanbul ignore next */ []));
4600
+ /** Upper thumb value in range mode. Two-way bindable with `[(endValue)]`. */
4488
4601
  endValue = model(100, /* @ts-ignore */
4489
4602
  ...(ngDevMode ? [{ debugName: "endValue" }] : /* istanbul ignore next */ []));
4603
+ /** Minimum selectable value. */
4490
4604
  min = input(0, /* @ts-ignore */
4491
4605
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
4606
+ /** Maximum selectable value. */
4492
4607
  max = input(100, /* @ts-ignore */
4493
4608
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
4609
+ /** Increment between selectable values. */
4494
4610
  step = input(1, /* @ts-ignore */
4495
4611
  ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
4612
+ /** Whether the slider is disabled. Two-way bindable with `[(disabled)]`. */
4496
4613
  disabled = model(false, /* @ts-ignore */
4497
4614
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
4615
+ /** Layout direction of the slider. */
4498
4616
  orientation = input('horizontal', /* @ts-ignore */
4499
4617
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
4618
+ /** Accessible label for the thumb(s). */
4500
4619
  ariaLabel = input('Value', /* @ts-ignore */
4501
4620
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
4502
4621
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -4754,18 +4873,25 @@ const noop$d = () => { };
4754
4873
  const STAR_SIZE = { sm: 'size-4', default: 'size-5', lg: 'size-6' };
4755
4874
  /** A star rating (`role="radiogroup"`) with hover preview and keyboard support. */
4756
4875
  class BuiRating {
4876
+ /** Current rating. Two-way bindable with `[(value)]`. */
4757
4877
  value = model(0, /* @ts-ignore */
4758
4878
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
4879
+ /** Number of stars shown. */
4759
4880
  max = input(5, /* @ts-ignore */
4760
4881
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
4882
+ /** Whether the rating is display-only and cannot be changed. */
4761
4883
  readonly = input(false, /* @ts-ignore */
4762
4884
  ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
4885
+ /** Whether the rating is disabled. Two-way bindable with `[(disabled)]`. */
4763
4886
  disabled = model(false, /* @ts-ignore */
4764
4887
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
4888
+ /** Size of each star. */
4765
4889
  size = input('default', /* @ts-ignore */
4766
4890
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
4891
+ /** Tailwind text-color class applied to filled stars. */
4767
4892
  color = input('text-amber-500', /* @ts-ignore */
4768
4893
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
4894
+ /** Accessible label for the rating group. */
4769
4895
  ariaLabel = input(null, /* @ts-ignore */
4770
4896
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
4771
4897
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -4920,24 +5046,39 @@ const BTN_SIZE$1 = {
4920
5046
  lg: 'w-9 [&_svg]:size-4',
4921
5047
  };
4922
5048
  const FIELD_WIDTH = { sm: 'w-9', default: 'w-10', lg: 'w-12' };
4923
- /** A compact − [n] + quantity stepper (`role="group"` with a `spinbutton` field). */
5049
+ /**
5050
+ * @deprecated Use `<bui-number-input [min]="1" size="sm">` instead — it is the same numeric
5051
+ * stepper, so this duplicate was dropped from the registry and docs. Still exported as a thin
5052
+ * compatibility shim; existing usages keep working.
5053
+ *
5054
+ * A compact − [n] + quantity stepper (`role="group"` with a `spinbutton` field).
5055
+ */
4924
5056
  class BuiQuantitySelector {
5057
+ /** Current quantity. Two-way bindable with `[(value)]`. */
4925
5058
  value = model(1, /* @ts-ignore */
4926
5059
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
5060
+ /** Minimum allowed quantity. */
4927
5061
  min = input(1, /* @ts-ignore */
4928
5062
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
5063
+ /** Maximum allowed quantity; unbounded when null. */
4929
5064
  max = input(null, /* @ts-ignore */
4930
5065
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
5066
+ /** Increment/decrement applied per button press. */
4931
5067
  step = input(1, /* @ts-ignore */
4932
5068
  ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
5069
+ /** Size preset controlling height and button width. */
4933
5070
  size = input('default', /* @ts-ignore */
4934
5071
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
5072
+ /** Whether the whole control is disabled. */
4935
5073
  disabled = input(false, /* @ts-ignore */
4936
5074
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
5075
+ /** Accessible label for the numeric input field. */
4937
5076
  ariaLabel = input('Quantity', /* @ts-ignore */
4938
5077
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
5078
+ /** Accessible label override for the decrease button. */
4939
5079
  decreaseLabel = input(/* @ts-ignore */
4940
5080
  ...(ngDevMode ? [undefined, { debugName: "decreaseLabel" }] : /* istanbul ignore next */ []));
5081
+ /** Accessible label override for the increase button. */
4941
5082
  increaseLabel = input(/* @ts-ignore */
4942
5083
  ...(ngDevMode ? [undefined, { debugName: "increaseLabel" }] : /* istanbul ignore next */ []));
4943
5084
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5201,69 +5342,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5201
5342
  }]
5202
5343
  }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
5203
5344
 
5204
- const BASE$1 = 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30 flex w-full resize-none overflow-hidden rounded-md border bg-transparent shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50';
5205
- const SIZES$3 = {
5206
- sm: 'min-h-14 px-2.5 py-1.5 text-sm',
5207
- default: 'min-h-16 px-3 py-2 text-base md:text-sm',
5208
- lg: 'min-h-20 px-4 py-2.5 text-base',
5209
- };
5210
5345
  /**
5211
- * A textarea that grows with its content. SSR-safe the height is measured only in the
5212
- * browser (via `afterNextRender` and the `input` event).
5346
+ * @deprecated Use `<textarea buiTextarea [maxRows]="…">` instead`buiTextarea` already auto-grows
5347
+ * (CSS `field-sizing-content`) and now supports `maxRows`. Kept as a thin alias so existing
5348
+ * `buiAutosizeTextarea` markup keeps working; it inherits every input from {@link BuiTextarea}.
5349
+ *
5350
+ * A textarea that grows with its content, capped at `maxRows`.
5213
5351
  */
5214
- class BuiAutosizeTextarea {
5215
- size = input('default', /* @ts-ignore */
5216
- ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
5217
- maxRows = input(null, /* @ts-ignore */
5218
- ...(ngDevMode ? [{ debugName: "maxRows" }] : /* istanbul ignore next */ []));
5219
- userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
5220
- host = inject(ElementRef);
5221
- computedClass = computed(() => cn(BASE$1, SIZES$3[this.size()], this.userClass()), /* @ts-ignore */
5222
- ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
5223
- constructor() {
5224
- afterNextRender(() => {
5225
- this.resize();
5226
- });
5227
- }
5228
- resize() {
5229
- const element = this.host.nativeElement;
5230
- element.style.height = 'auto';
5231
- let target = element.scrollHeight;
5232
- const maxRows = this.maxRows();
5233
- if (maxRows !== null) {
5234
- const styles = getComputedStyle(element);
5235
- let lineHeight = Number.parseFloat(styles.lineHeight);
5236
- if (Number.isNaN(lineHeight)) {
5237
- lineHeight = Number.parseFloat(styles.fontSize) * 1.2;
5238
- }
5239
- const padding = Number.parseFloat(styles.paddingTop) + Number.parseFloat(styles.paddingBottom);
5240
- const border = Number.parseFloat(styles.borderTopWidth) + Number.parseFloat(styles.borderBottomWidth);
5241
- const cap = lineHeight * maxRows + padding + border;
5242
- if (target > cap) {
5243
- target = cap;
5244
- element.style.overflowY = 'auto';
5245
- }
5246
- else {
5247
- element.style.overflowY = 'hidden';
5248
- }
5249
- }
5250
- element.style.height = `${target}px`;
5251
- }
5252
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiAutosizeTextarea, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5253
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.2", type: BuiAutosizeTextarea, isStandalone: true, selector: "textarea[buiAutosizeTextarea]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, maxRows: { classPropertyName: "maxRows", publicName: "maxRows", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "autosize-textarea" }, listeners: { "input": "resize()" }, properties: { "attr.data-size": "size()", "class": "computedClass()" } }, ngImport: i0 });
5352
+ class BuiAutosizeTextarea extends BuiTextarea {
5353
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiAutosizeTextarea, deps: null, target: i0.ɵɵFactoryTarget.Directive });
5354
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.2", type: BuiAutosizeTextarea, isStandalone: true, selector: "textarea[buiAutosizeTextarea]", host: { attributes: { "data-slot": "autosize-textarea" } }, usesInheritance: true, ngImport: i0 });
5254
5355
  }
5255
5356
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiAutosizeTextarea, decorators: [{
5256
5357
  type: Directive,
5257
5358
  args: [{
5258
5359
  selector: 'textarea[buiAutosizeTextarea]',
5259
- host: {
5260
- 'data-slot': 'autosize-textarea',
5261
- '[attr.data-size]': 'size()',
5262
- '[class]': 'computedClass()',
5263
- '(input)': 'resize()',
5264
- },
5360
+ host: { 'data-slot': 'autosize-textarea' },
5265
5361
  }]
5266
- }], ctorParameters: () => [], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], maxRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxRows", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
5362
+ }] });
5267
5363
 
5268
5364
  class BuiDropdownMenu {
5269
5365
  menu = inject(Menu);
@@ -5387,6 +5483,7 @@ const TYPOGRAPHY = {
5387
5483
  };
5388
5484
  /** Applies a typographic style. Put it on the matching element (e.g. `<h1 buiTypography variant="h1">`). */
5389
5485
  class BuiTypography {
5486
+ /** Typographic style to apply (e.g. `h1`, `lead`, `blockquote`, `gradient`). */
5390
5487
  variant = input('p', /* @ts-ignore */
5391
5488
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
5392
5489
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5409,10 +5506,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5409
5506
 
5410
5507
  /** Decorative dotted background layer. Drop inside a `relative` container. */
5411
5508
  class BuiDotPattern {
5509
+ /** Dot radius in pixels. */
5412
5510
  size = input(1, /* @ts-ignore */
5413
5511
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
5512
+ /** Spacing between dots in pixels. */
5414
5513
  gap = input(16, /* @ts-ignore */
5415
5514
  ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
5515
+ /** Whether to fade the pattern with a radial mask toward the edges. */
5416
5516
  mask = input(false, /* @ts-ignore */
5417
5517
  ...(ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []));
5418
5518
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5445,10 +5545,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5445
5545
 
5446
5546
  /** Decorative grid background layer. Drop inside a `relative` container. */
5447
5547
  class BuiGridPattern {
5548
+ /** Cell size (spacing between grid lines) in pixels. */
5448
5549
  gap = input(24, /* @ts-ignore */
5449
5550
  ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
5551
+ /** Thickness of the grid lines in pixels. */
5450
5552
  lineWidth = input(1, /* @ts-ignore */
5451
5553
  ...(ngDevMode ? [{ debugName: "lineWidth" }] : /* istanbul ignore next */ []));
5554
+ /** Whether to fade the pattern with a radial mask toward the edges. */
5452
5555
  mask = input(false, /* @ts-ignore */
5453
5556
  ...(ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []));
5454
5557
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5486,10 +5589,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5486
5589
  const noop$c = () => { };
5487
5590
  /** A single-select segmented control (`role="radiogroup"`) with arrow-key navigation. */
5488
5591
  class BuiSegmentedControl {
5592
+ /** Currently selected segment value. Two-way bindable with `[(value)]`. */
5489
5593
  value = model('', /* @ts-ignore */
5490
5594
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
5595
+ /** Available segments; plain strings are used as both value and label. */
5491
5596
  options = input([], /* @ts-ignore */
5492
5597
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
5598
+ /** Whether all segments are disabled. Two-way bindable with `[(disabled)]`. */
5493
5599
  disabled = model(false, /* @ts-ignore */
5494
5600
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
5495
5601
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5609,8 +5715,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5609
5715
  * helper classes `.prompt .ok .dim .path .warn` colour them.
5610
5716
  */
5611
5717
  class BuiTerminal {
5718
+ /** Optional title shown in the terminal title bar. */
5612
5719
  title = input(null, /* @ts-ignore */
5613
5720
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
5721
+ /** Whether to show the macOS-style traffic-light buttons in the title bar. */
5614
5722
  buttons = input(true, /* @ts-ignore */
5615
5723
  ...(ngDevMode ? [{ debugName: "buttons" }] : /* istanbul ignore next */ []));
5616
5724
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5680,17 +5788,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5680
5788
 
5681
5789
  /** A data-driven feature-comparison / pricing table. */
5682
5790
  class BuiComparisonTable {
5791
+ /** Column headers, one per pricing/feature tier. */
5683
5792
  tiers = input([], /* @ts-ignore */
5684
5793
  ...(ngDevMode ? [{ debugName: "tiers" }] : /* istanbul ignore next */ []));
5794
+ /** Feature rows; each holds one value per tier. */
5685
5795
  rows = input([], /* @ts-ignore */
5686
5796
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
5797
+ /** Tier to emphasize, by index or tier name; `null` highlights none. */
5687
5798
  highlight = input(null, /* @ts-ignore */
5688
5799
  ...(ngDevMode ? [{ debugName: "highlight" }] : /* istanbul ignore next */ []));
5800
+ /** Header text for the leading feature column. */
5689
5801
  featureLabel = input('Feature', /* @ts-ignore */
5690
5802
  ...(ngDevMode ? [{ debugName: "featureLabel" }] : /* istanbul ignore next */ []));
5691
5803
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
5804
+ /** Accessible label for the included (check) icon. */
5692
5805
  includedLabel = input(/* @ts-ignore */
5693
5806
  ...(ngDevMode ? [undefined, { debugName: "includedLabel" }] : /* istanbul ignore next */ []));
5807
+ /** Accessible label for the not-included (dash) marker. */
5694
5808
  notIncludedLabel = input(/* @ts-ignore */
5695
5809
  ...(ngDevMode ? [undefined, { debugName: "notIncludedLabel" }] : /* istanbul ignore next */ []));
5696
5810
  includedText = buiLabel('comparisonTableIncluded', this.includedLabel);
@@ -5836,8 +5950,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5836
5950
  * with `[buiFlipBack]`. `trigger="hover"` (default) or `"click"` (keyboard-accessible).
5837
5951
  */
5838
5952
  class BuiFlipCard {
5953
+ /** What flips the card: hover/focus or click/keypress. */
5839
5954
  trigger = input('hover', /* @ts-ignore */
5840
5955
  ...(ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []));
5956
+ /** Fixed card height as a CSS length. */
5841
5957
  height = input('16rem', /* @ts-ignore */
5842
5958
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
5843
5959
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5932,8 +6048,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5932
6048
 
5933
6049
  /** A card with a radial spotlight glow that follows the cursor on hover. */
5934
6050
  class BuiSpotlightCard {
6051
+ /** Spotlight glow colour; defaults to a subtle foreground tint. */
5935
6052
  color = input(null, /* @ts-ignore */
5936
6053
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
6054
+ /** Spotlight radius in pixels. */
5937
6055
  size = input(350, /* @ts-ignore */
5938
6056
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
5939
6057
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -5989,8 +6107,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
5989
6107
 
5990
6108
  /** A card that tilts in 3D toward the cursor. SSR-safe (geometry read on mousemove). */
5991
6109
  class BuiTiltCard {
6110
+ /** Maximum tilt angle in degrees on each axis. */
5992
6111
  max = input(10, /* @ts-ignore */
5993
6112
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
6113
+ /** Scale factor applied while the card is tilting. */
5994
6114
  scaleTo = input(1.05, /* @ts-ignore */
5995
6115
  ...(ngDevMode ? [{ debugName: "scaleTo" }] : /* istanbul ignore next */ []));
5996
6116
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -6060,17 +6180,22 @@ const noop$b = () => { };
6060
6180
  * (arrows, Home/End, Enter, Escape) and outside-click close. SSR-safe.
6061
6181
  */
6062
6182
  class BuiSelect {
6183
+ /** Selected option value (single mode). Two-way bindable with `[(value)]`. */
6063
6184
  value = model('', /* @ts-ignore */
6064
6185
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
6065
6186
  /** Select several options; binds `values` instead of `value`. */
6066
6187
  multiple = input(false, /* @ts-ignore */
6067
6188
  ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
6189
+ /** Selected option values (multiple mode). Two-way bindable with `[(values)]`. */
6068
6190
  values = model([], /* @ts-ignore */
6069
6191
  ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
6192
+ /** Available options to choose from. */
6070
6193
  options = input([], /* @ts-ignore */
6071
6194
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
6195
+ /** Text shown on the trigger when nothing is selected. */
6072
6196
  placeholder = input('Select…', /* @ts-ignore */
6073
6197
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
6198
+ /** Whether the select is disabled. Two-way bindable with `[(disabled)]`. */
6074
6199
  disabled = model(false, /* @ts-ignore */
6075
6200
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
6076
6201
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -6446,11 +6571,14 @@ const VARIANTS$1 = {
6446
6571
  * `threshold` px. SSR-safe — the scroll position is only read in the browser.
6447
6572
  */
6448
6573
  class BuiBackToTop {
6574
+ /** Pixel scroll distance before the button appears. */
6449
6575
  threshold = input(300, /* @ts-ignore */
6450
6576
  ...(ngDevMode ? [{ debugName: "threshold" }] : /* istanbul ignore next */ []));
6577
+ /** Visual style of the button. */
6451
6578
  variant = input('primary', /* @ts-ignore */
6452
6579
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
6453
6580
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
6581
+ /** Accessible label for the button; falls back to the i18n default. */
6454
6582
  label = input(/* @ts-ignore */
6455
6583
  ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
6456
6584
  labelText = buiLabel('backToTop', this.label);
@@ -6539,17 +6667,22 @@ const noop$a = () => { };
6539
6667
  * filtered listbox, using the `aria-activedescendant` pattern. Full keyboard + outside-click.
6540
6668
  */
6541
6669
  class BuiCombobox {
6670
+ /** Selected option value (single mode). Two-way bindable with `[(value)]`. */
6542
6671
  value = model('', /* @ts-ignore */
6543
6672
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
6544
6673
  /** Select several options; binds `values` instead of `value`. */
6545
6674
  multiple = input(false, /* @ts-ignore */
6546
6675
  ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
6676
+ /** Selected option values (multiple mode). Two-way bindable with `[(values)]`. */
6547
6677
  values = model([], /* @ts-ignore */
6548
6678
  ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
6679
+ /** Available options to filter and choose from. */
6549
6680
  options = input([], /* @ts-ignore */
6550
6681
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
6682
+ /** Placeholder text shown in the search input. */
6551
6683
  placeholder = input('Search…', /* @ts-ignore */
6552
6684
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
6685
+ /** Whether the combobox is disabled. Two-way bindable with `[(disabled)]`. */
6553
6686
  disabled = model(false, /* @ts-ignore */
6554
6687
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
6555
6688
  /** When false, the field can't be typed in — it just opens the full list (select-like). */
@@ -6852,8 +6985,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
6852
6985
 
6853
6986
  /** A live countdown to a target time (`role="timer"`). SSR-safe — ticks only in the browser. */
6854
6987
  class BuiCountdown {
6988
+ /** Target moment to count down to, as a Date, timestamp, or date string. */
6855
6989
  to = input.required(/* @ts-ignore */
6856
6990
  ...(ngDevMode ? [{ debugName: "to" }] : /* istanbul ignore next */ []));
6991
+ /** Text shown once the target time has passed. */
6857
6992
  expired = input('Expired', /* @ts-ignore */
6858
6993
  ...(ngDevMode ? [{ debugName: "expired" }] : /* istanbul ignore next */ []));
6859
6994
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -6953,18 +7088,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
6953
7088
  * `aria-hidden`; an sr-only span carries the final value (SSR/no-JS read the real number).
6954
7089
  */
6955
7090
  class BuiNumberTicker {
7091
+ /** Target value to count up to. */
6956
7092
  value = input(0, /* @ts-ignore */
6957
7093
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
7094
+ /** Starting value the animation counts from. */
6958
7095
  from = input(0, /* @ts-ignore */
6959
7096
  ...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
7097
+ /** Animation length in milliseconds; 0 snaps instantly. */
6960
7098
  duration = input(1500, /* @ts-ignore */
6961
7099
  ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
7100
+ /** Number of decimal places to display. */
6962
7101
  decimals = input(0, /* @ts-ignore */
6963
7102
  ...(ngDevMode ? [{ debugName: "decimals" }] : /* istanbul ignore next */ []));
7103
+ /** Text prepended before the number. */
6964
7104
  prefix = input('', /* @ts-ignore */
6965
7105
  ...(ngDevMode ? [{ debugName: "prefix" }] : /* istanbul ignore next */ []));
7106
+ /** Text appended after the number. */
6966
7107
  suffix = input('', /* @ts-ignore */
6967
7108
  ...(ngDevMode ? [{ debugName: "suffix" }] : /* istanbul ignore next */ []));
7109
+ /** Thousands-group separator character. */
6968
7110
  separator = input(',', /* @ts-ignore */
6969
7111
  ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
6970
7112
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7033,8 +7175,10 @@ const VARIANTS = {
7033
7175
  };
7034
7176
  /** A styled anchor. Set `external` for `target=_blank` + safe `rel`. */
7035
7177
  class BuiLink {
7178
+ /** Visual style of the link: default, muted, or subtle. */
7036
7179
  variant = input('default', /* @ts-ignore */
7037
7180
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
7181
+ /** Whether the link is external, adding `target=_blank` and safe `rel`. */
7038
7182
  external = input(false, /* @ts-ignore */
7039
7183
  ...(ngDevMode ? [{ debugName: "external" }] : /* istanbul ignore next */ []));
7040
7184
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7068,14 +7212,19 @@ const PRESETS = {
7068
7212
  };
7069
7213
  /** Renders accessible text painted with a CSS gradient, with an optional shimmer. */
7070
7214
  class BuiGradientText {
7215
+ /** Named colour preset used when from/via/to are not set. */
7071
7216
  preset = input('brand', /* @ts-ignore */
7072
7217
  ...(ngDevMode ? [{ debugName: "preset" }] : /* istanbul ignore next */ []));
7218
+ /** Gradient start colour; overrides the preset's first stop. */
7073
7219
  from = input(null, /* @ts-ignore */
7074
7220
  ...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
7221
+ /** Gradient middle colour; overrides the preset's second stop. */
7075
7222
  via = input(null, /* @ts-ignore */
7076
7223
  ...(ngDevMode ? [{ debugName: "via" }] : /* istanbul ignore next */ []));
7224
+ /** Gradient end colour; overrides the preset's third stop. */
7077
7225
  to = input(null, /* @ts-ignore */
7078
7226
  ...(ngDevMode ? [{ debugName: "to" }] : /* istanbul ignore next */ []));
7227
+ /** Whether to animate a horizontal shimmer across the gradient. */
7079
7228
  animate = input(false, /* @ts-ignore */
7080
7229
  ...(ngDevMode ? [{ debugName: "animate" }] : /* istanbul ignore next */ []));
7081
7230
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7108,10 +7257,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7108
7257
  * Provide the title via the `heading` input or by projecting content.
7109
7258
  */
7110
7259
  class BuiPageHeader {
7260
+ /** Title text rendered in the heading (alternative to projecting content). */
7111
7261
  heading = input('', /* @ts-ignore */
7112
7262
  ...(ngDevMode ? [{ debugName: "heading" }] : /* istanbul ignore next */ []));
7263
+ /** Optional supporting text shown beneath the heading. */
7113
7264
  description = input('', /* @ts-ignore */
7114
7265
  ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
7266
+ /** Whether to render a bottom border separating the header from the page. */
7115
7267
  separator = input(false, /* @ts-ignore */
7116
7268
  ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
7117
7269
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7159,12 +7311,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7159
7311
 
7160
7312
  /** A styled blockquote / testimonial with optional attribution (author, role, avatar). */
7161
7313
  class BuiQuote {
7314
+ /** Name of the person credited in the attribution. */
7162
7315
  author = input('', /* @ts-ignore */
7163
7316
  ...(ngDevMode ? [{ debugName: "author" }] : /* istanbul ignore next */ []));
7317
+ /** Role or title shown beneath the author. */
7164
7318
  role = input('', /* @ts-ignore */
7165
7319
  ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
7320
+ /** URL of the author's avatar image. */
7166
7321
  avatar = input('', /* @ts-ignore */
7167
7322
  ...(ngDevMode ? [{ debugName: "avatar" }] : /* istanbul ignore next */ []));
7323
+ /** Source URL for the quote, set as the blockquote's `cite` attribute. */
7168
7324
  cite = input('', /* @ts-ignore */
7169
7325
  ...(ngDevMode ? [{ debugName: "cite" }] : /* istanbul ignore next */ []));
7170
7326
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7256,18 +7412,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7256
7412
  }]
7257
7413
  }], propDecorators: { author: [{ type: i0.Input, args: [{ isSignal: true, alias: "author", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], avatar: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatar", required: false }] }], cite: [{ type: i0.Input, args: [{ isSignal: true, alias: "cite", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
7258
7414
 
7259
- const SIZES$2 = { sm: 'text-sm', default: 'text-base', lg: 'text-2xl' };
7415
+ const SIZES$1 = { sm: 'text-sm', default: 'text-base', lg: 'text-2xl' };
7260
7416
  const COMPARE_SIZES = { sm: 'text-xs', default: 'text-sm', lg: 'text-base' };
7261
7417
  /** A price display with optional compare-at (strikethrough) and a discount badge. */
7262
7418
  class BuiPrice {
7419
+ /** Current price amount to display. */
7263
7420
  amount = input(0, /* @ts-ignore */
7264
7421
  ...(ngDevMode ? [{ debugName: "amount" }] : /* istanbul ignore next */ []));
7422
+ /** Original price; when higher than amount, shows as struck-through. */
7265
7423
  compareAt = input(null, /* @ts-ignore */
7266
7424
  ...(ngDevMode ? [{ debugName: "compareAt" }] : /* istanbul ignore next */ []));
7425
+ /** Currency symbol prefixed to each value. */
7267
7426
  currency = input('$', /* @ts-ignore */
7268
7427
  ...(ngDevMode ? [{ debugName: "currency" }] : /* istanbul ignore next */ []));
7428
+ /** Text size preset for the price. */
7269
7429
  size = input('default', /* @ts-ignore */
7270
7430
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
7431
+ /** Whether to show the percentage-off discount badge when on sale. */
7271
7432
  showDiscount = input(true, /* @ts-ignore */
7272
7433
  ...(ngDevMode ? [{ debugName: "showDiscount" }] : /* istanbul ignore next */ []));
7273
7434
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7283,7 +7444,7 @@ class BuiPrice {
7283
7444
  : 0;
7284
7445
  }, /* @ts-ignore */
7285
7446
  ...(ngDevMode ? [{ debugName: "discount" }] : /* istanbul ignore next */ []));
7286
- currentClass = computed(() => cn(SIZES$2[this.size()], this.onSale() ? 'text-emerald-700 dark:text-emerald-400' : 'text-foreground'), /* @ts-ignore */
7447
+ currentClass = computed(() => cn(SIZES$1[this.size()], this.onSale() ? 'text-emerald-700 dark:text-emerald-400' : 'text-foreground'), /* @ts-ignore */
7287
7448
  ...(ngDevMode ? [{ debugName: "currentClass" }] : /* istanbul ignore next */ []));
7288
7449
  compareClass = computed(() => cn(COMPARE_SIZES[this.size()], 'text-muted-foreground'), /* @ts-ignore */
7289
7450
  ...(ngDevMode ? [{ debugName: "compareClass" }] : /* istanbul ignore next */ []));
@@ -7363,14 +7524,19 @@ const JUSTIFY = {
7363
7524
  };
7364
7525
  /** A flexbox stack layout helper (direction, gap, alignment). */
7365
7526
  class BuiStack {
7527
+ /** Flex direction: vertical (`col`) or horizontal (`row`). */
7366
7528
  direction = input('col', /* @ts-ignore */
7367
7529
  ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
7530
+ /** Spacing between items, as a Tailwind gap step. */
7368
7531
  gap = input('4', /* @ts-ignore */
7369
7532
  ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
7533
+ /** Cross-axis alignment (`start`/`center`/`end`/`stretch`/`baseline`). */
7370
7534
  align = input('', /* @ts-ignore */
7371
7535
  ...(ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []));
7536
+ /** Main-axis distribution (`start`/`center`/`end`/`between`/`around`/`evenly`). */
7372
7537
  justify = input('', /* @ts-ignore */
7373
7538
  ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
7539
+ /** Whether items wrap onto multiple lines when they overflow. */
7374
7540
  wrap = input(false, /* @ts-ignore */
7375
7541
  ...(ngDevMode ? [{ debugName: "wrap" }] : /* istanbul ignore next */ []));
7376
7542
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7392,8 +7558,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7392
7558
  * design tokens locally. Renders as `display: contents` so it adds no box.
7393
7559
  */
7394
7560
  class BuiAccent {
7561
+ /** Accent color applied to the primary tokens; `null` leaves the theme unchanged. */
7395
7562
  color = input(null, /* @ts-ignore */
7396
7563
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
7564
+ /** Foreground color paired with the accent for text/icons on accented surfaces. */
7397
7565
  foreground = input('#ffffff', /* @ts-ignore */
7398
7566
  ...(ngDevMode ? [{ debugName: "foreground" }] : /* istanbul ignore next */ []));
7399
7567
  styleVars = computed(() => {
@@ -7439,23 +7607,28 @@ const COLORS = {
7439
7607
  offline: 'bg-gray-400',
7440
7608
  };
7441
7609
  const LABELS = { online: 'Online', away: 'Away', busy: 'Busy', offline: 'Offline' };
7442
- const SIZES$1 = { sm: 'size-2', default: 'size-2.5', lg: 'size-3' };
7610
+ const SIZES = { sm: 'size-2', default: 'size-2.5', lg: 'size-3' };
7443
7611
  /** A small status dot (online/away/busy/offline). Status is never colour-only — the label is always present. */
7444
7612
  class BuiPresence {
7613
+ /** Presence state, which sets the dot color and default label. */
7445
7614
  status = input('online', /* @ts-ignore */
7446
7615
  ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
7616
+ /** Size preset for the status dot. */
7447
7617
  size = input('default', /* @ts-ignore */
7448
7618
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
7619
+ /** Whether to show a pulsing ping animation (only when `online`). */
7449
7620
  pulse = input(false, /* @ts-ignore */
7450
7621
  ...(ngDevMode ? [{ debugName: "pulse" }] : /* istanbul ignore next */ []));
7622
+ /** Custom label text; defaults to the status name. */
7451
7623
  label = input('', /* @ts-ignore */
7452
7624
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
7625
+ /** Whether to render the label visibly; otherwise it stays screen-reader only. */
7453
7626
  showLabel = input(false, /* @ts-ignore */
7454
7627
  ...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
7455
7628
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
7456
7629
  colorClass = computed(() => COLORS[this.status()], /* @ts-ignore */
7457
7630
  ...(ngDevMode ? [{ debugName: "colorClass" }] : /* istanbul ignore next */ []));
7458
- sizeClass = computed(() => SIZES$1[this.size()], /* @ts-ignore */
7631
+ sizeClass = computed(() => SIZES[this.size()], /* @ts-ignore */
7459
7632
  ...(ngDevMode ? [{ debugName: "sizeClass" }] : /* istanbul ignore next */ []));
7460
7633
  labelText = computed(() => this.label() || LABELS[this.status()], /* @ts-ignore */
7461
7634
  ...(ngDevMode ? [{ debugName: "labelText" }] : /* istanbul ignore next */ []));
@@ -7519,10 +7692,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7519
7692
 
7520
7693
  /** A single timeline entry: a dot + connector line and a content area. */
7521
7694
  class BuiTimelineItem {
7695
+ /** Timestamp label shown above the entry's title. */
7522
7696
  time = input('', /* @ts-ignore */
7523
7697
  ...(ngDevMode ? [{ debugName: "time" }] : /* istanbul ignore next */ []));
7698
+ /** Heading text for the entry. */
7524
7699
  title = input('', /* @ts-ignore */
7525
7700
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
7701
+ /** Whether to highlight this entry as the current/active step. */
7526
7702
  active = input(false, /* @ts-ignore */
7527
7703
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
7528
7704
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7602,8 +7778,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7602
7778
 
7603
7779
  /** A description list (`<dl>`). Children should be `bui-description-item`. */
7604
7780
  class BuiDescriptionList {
7781
+ /** Arrangement of each item's term and description, side by side or stacked. */
7605
7782
  layout = input('horizontal', /* @ts-ignore */
7606
7783
  ...(ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []));
7784
+ /** Whether to render a bordered card with dividers between items. */
7607
7785
  bordered = input(false, /* @ts-ignore */
7608
7786
  ...(ngDevMode ? [{ debugName: "bordered" }] : /* istanbul ignore next */ []));
7609
7787
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7624,6 +7802,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7624
7802
 
7625
7803
  /** A term/description row. Inherits horizontal/bordered layout from its parent list. */
7626
7804
  class BuiDescriptionItem {
7805
+ /** The term label shown in the row's `<dt>`. */
7627
7806
  term = input('', /* @ts-ignore */
7628
7807
  ...(ngDevMode ? [{ debugName: "term" }] : /* istanbul ignore next */ []));
7629
7808
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7672,8 +7851,10 @@ const GAPS = {
7672
7851
  };
7673
7852
  /** A Pinterest-style masonry grid using native CSS multi-column layout. */
7674
7853
  class BuiMasonry {
7854
+ /** Maximum number of columns at the widest breakpoint (1-6, responsive). */
7675
7855
  columns = input(3, /* @ts-ignore */
7676
7856
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
7857
+ /** Spacing between items, as a Tailwind spacing key ('0', '2', '3', '4', '6', '8'). */
7677
7858
  gap = input('4', /* @ts-ignore */
7678
7859
  ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
7679
7860
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7697,6 +7878,7 @@ const COLUMNS$1 = {
7697
7878
  };
7698
7879
  /** A bento grid container. Use `bui-bento-item` for cells. */
7699
7880
  class BuiBentoGrid {
7881
+ /** Number of columns at the largest breakpoint (2, 3 or 4). */
7700
7882
  columns = input(3, /* @ts-ignore */
7701
7883
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
7702
7884
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7717,12 +7899,16 @@ const COL_SPAN = { 1: '', 2: 'lg:col-span-2', 3: 'lg:col-span-3' };
7717
7899
  const ROW_SPAN = { 1: '', 2: 'row-span-2' };
7718
7900
  /** A bento grid cell with optional title/description and configurable span. */
7719
7901
  class BuiBentoItem {
7902
+ /** Optional heading rendered above the projected content. */
7720
7903
  title = input('', /* @ts-ignore */
7721
7904
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
7905
+ /** Optional muted description rendered below the title. */
7722
7906
  description = input('', /* @ts-ignore */
7723
7907
  ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
7908
+ /** How many grid columns the cell spans (1-3). */
7724
7909
  colSpan = input(1, /* @ts-ignore */
7725
7910
  ...(ngDevMode ? [{ debugName: "colSpan" }] : /* istanbul ignore next */ []));
7911
+ /** How many grid rows the cell spans (1-2). */
7726
7912
  rowSpan = input(1, /* @ts-ignore */
7727
7913
  ...(ngDevMode ? [{ debugName: "rowSpan" }] : /* istanbul ignore next */ []));
7728
7914
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7766,10 +7952,13 @@ const COLUMNS = {
7766
7952
  };
7767
7953
  /** A responsive thumbnail grid. */
7768
7954
  class BuiGallery {
7955
+ /** Images to display, given as URLs or `GalleryImage` objects. */
7769
7956
  images = input([], /* @ts-ignore */
7770
7957
  ...(ngDevMode ? [{ debugName: "images" }] : /* istanbul ignore next */ []));
7958
+ /** Number of grid columns (1-6). */
7771
7959
  columns = input(3, /* @ts-ignore */
7772
7960
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
7961
+ /** Tailwind class controlling thumbnail corner rounding. */
7773
7962
  rounded = input('rounded-lg', /* @ts-ignore */
7774
7963
  ...(ngDevMode ? [{ debugName: "rounded" }] : /* istanbul ignore next */ []));
7775
7964
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7803,10 +7992,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
7803
7992
 
7804
7993
  /** A veil with a spinner shown over its projected content while `show` is true. */
7805
7994
  class BuiLoadingOverlay {
7995
+ /** Whether the loading veil is shown over the projected content. */
7806
7996
  show = input(false, /* @ts-ignore */
7807
7997
  ...(ngDevMode ? [{ debugName: "show" }] : /* istanbul ignore next */ []));
7998
+ /** Text shown beneath the spinner; defaults to "Loading…" when empty. */
7808
7999
  message = input('', /* @ts-ignore */
7809
8000
  ...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
8001
+ /** Whether the veil blurs the content behind it. */
7810
8002
  blur = input(true, /* @ts-ignore */
7811
8003
  ...(ngDevMode ? [{ debugName: "blur" }] : /* istanbul ignore next */ []));
7812
8004
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -7896,22 +8088,31 @@ const INPUT_SIZE = {
7896
8088
  };
7897
8089
  /** A numeric stepper: − / + buttons around a number field, with min/max/step clamping. */
7898
8090
  class BuiNumberInput {
8091
+ /** Current number. Two-way bindable with `[(value)]`. */
7899
8092
  value = model(0, /* @ts-ignore */
7900
8093
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
8094
+ /** Minimum allowed value, or null for no lower bound. */
7901
8095
  min = input(null, /* @ts-ignore */
7902
8096
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
8097
+ /** Maximum allowed value, or null for no upper bound. */
7903
8098
  max = input(null, /* @ts-ignore */
7904
8099
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
8100
+ /** Amount added or subtracted per step. */
7905
8101
  stepBy = input(1, { ...(ngDevMode ? { debugName: "stepBy" } : /* istanbul ignore next */ {}), alias: 'step' });
8102
+ /** Whether the control is disabled. Two-way bindable with `[(disabled)]`. */
7906
8103
  disabled = model(false, /* @ts-ignore */
7907
8104
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
8105
+ /** Size preset controlling stepper button and field dimensions. */
7908
8106
  size = input('default', /* @ts-ignore */
7909
8107
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
8108
+ /** Accessible label for the number field. */
7910
8109
  ariaLabel = input('', /* @ts-ignore */
7911
8110
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
7912
8111
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
8112
+ /** Accessible label override for the decrease button. */
7913
8113
  decreaseLabel = input(/* @ts-ignore */
7914
8114
  ...(ngDevMode ? [undefined, { debugName: "decreaseLabel" }] : /* istanbul ignore next */ []));
8115
+ /** Accessible label override for the increase button. */
7915
8116
  increaseLabel = input(/* @ts-ignore */
7916
8117
  ...(ngDevMode ? [undefined, { debugName: "increaseLabel" }] : /* istanbul ignore next */ []));
7917
8118
  decreaseText = buiLabel('numberInputDecrease', this.decreaseLabel);
@@ -8093,14 +8294,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8093
8294
 
8094
8295
  /** A radio-group of product variants, rendered as pills or colour swatches. */
8095
8296
  class BuiVariantSelector {
8297
+ /** Selected variant value. Two-way bindable with `[(value)]`. */
8096
8298
  value = model('', /* @ts-ignore */
8097
8299
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
8300
+ /** Available options, as plain strings or `VariantOption` objects. */
8098
8301
  options = input([], /* @ts-ignore */
8099
8302
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
8303
+ /** Render style: text pills or colour swatches. */
8100
8304
  type = input('pill', /* @ts-ignore */
8101
8305
  ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
8306
+ /** Accessible label for the radio group. */
8102
8307
  label = input('Variant', /* @ts-ignore */
8103
8308
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
8309
+ /** Whether the whole group is disabled. */
8104
8310
  disabled = input(false, /* @ts-ignore */
8105
8311
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
8106
8312
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -8219,16 +8425,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8219
8425
 
8220
8426
  /** A tiny inline SVG trend chart (line + optional area). Pure, SSR-safe. */
8221
8427
  class BuiSparkline {
8428
+ /** Numeric series to plot; needs at least two points to render. */
8222
8429
  data = input([], /* @ts-ignore */
8223
8430
  ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
8431
+ /** SVG width in pixels. */
8224
8432
  width = input(100, /* @ts-ignore */
8225
8433
  ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
8434
+ /** SVG height in pixels. */
8226
8435
  height = input(28, /* @ts-ignore */
8227
8436
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
8437
+ /** Whether to draw the translucent area fill under the line. */
8228
8438
  area = input(true, /* @ts-ignore */
8229
8439
  ...(ngDevMode ? [{ debugName: "area" }] : /* istanbul ignore next */ []));
8440
+ /** Line stroke width in pixels (also used as edge padding). */
8230
8441
  strokeWidth = input(1.5, /* @ts-ignore */
8231
8442
  ...(ngDevMode ? [{ debugName: "strokeWidth" }] : /* istanbul ignore next */ []));
8443
+ /** Accessible label for the sparkline's `aria-label`. */
8232
8444
  ariaLabel = input('Trend', /* @ts-ignore */
8233
8445
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
8234
8446
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -8332,23 +8544,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8332
8544
  }]
8333
8545
  }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], area: [{ type: i0.Input, args: [{ isSignal: true, alias: "area", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
8334
8546
 
8335
- const SIZES = { default: 'h-9 px-4 py-2', sm: 'h-8 gap-1.5 px-3', lg: 'h-10 px-6' };
8336
8547
  /** A stateful add-to-cart button: idle → adding → added → idle. Emits `triggered` on click. */
8337
8548
  class BuiAddToCart {
8549
+ /** Button text shown in the idle and adding states. */
8338
8550
  label = input('Add to cart', /* @ts-ignore */
8339
8551
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
8552
+ /** Button text shown briefly in the added (success) state. */
8340
8553
  addedLabel = input('Added', /* @ts-ignore */
8341
8554
  ...(ngDevMode ? [{ debugName: "addedLabel" }] : /* istanbul ignore next */ []));
8555
+ /** Size preset controlling height and padding. */
8342
8556
  size = input('default', /* @ts-ignore */
8343
8557
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
8344
8558
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
8559
+ /** Emitted when the button is clicked to add the item. */
8345
8560
  triggered = output();
8346
8561
  state = signal('idle', /* @ts-ignore */
8347
8562
  ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
8348
8563
  timers = [];
8349
- btnClass = computed(() => cn('inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-all outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:opacity-90', SIZES[this.size()], this.state() === 'added'
8350
- ? 'bg-emerald-600 text-white'
8351
- : 'bg-primary text-primary-foreground hover:bg-primary/90', this.userClass()), /* @ts-ignore */
8564
+ // Composes the button's styling (single source of truth via `buttonVariants`); the busy/added
8565
+ // states only recolor on top — tailwind-merge drops the conflicting base background.
8566
+ btnClass = computed(() => cn(buttonVariants({ size: this.size() }), 'disabled:opacity-90', this.state() === 'added' ? 'bg-emerald-600 text-white hover:bg-emerald-600' : '', this.userClass()), /* @ts-ignore */
8352
8567
  ...(ngDevMode ? [{ debugName: "btnClass" }] : /* istanbul ignore next */ []));
8353
8568
  add() {
8354
8569
  if (this.state() !== 'idle') {
@@ -8516,18 +8731,25 @@ const TEXT_COLORS = [
8516
8731
  ];
8517
8732
  /** A password field with a live strength meter and (optional) requirement checklist. */
8518
8733
  class BuiPasswordStrength {
8734
+ /** Current password value. Two-way bindable with `[(password)]`. */
8519
8735
  password = model('', /* @ts-ignore */
8520
8736
  ...(ngDevMode ? [{ debugName: "password" }] : /* istanbul ignore next */ []));
8737
+ /** Native `name` attribute for the input. */
8521
8738
  name = input('password', /* @ts-ignore */
8522
8739
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
8740
+ /** Input `id`; defaults to `name` when empty. */
8523
8741
  id = input('', /* @ts-ignore */
8524
8742
  ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
8743
+ /** Placeholder text for the input. */
8525
8744
  placeholder = input('••••••••', /* @ts-ignore */
8526
8745
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
8746
+ /** Whether the requirement checklist is shown. */
8527
8747
  showChecklist = input(true, /* @ts-ignore */
8528
8748
  ...(ngDevMode ? [{ debugName: "showChecklist" }] : /* istanbul ignore next */ []));
8749
+ /** Minimum length required to satisfy the length rule. */
8529
8750
  minLength = input(8, /* @ts-ignore */
8530
8751
  ...(ngDevMode ? [{ debugName: "minLength" }] : /* istanbul ignore next */ []));
8752
+ /** Accessible label for the input. */
8531
8753
  label = input('Password', /* @ts-ignore */
8532
8754
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
8533
8755
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -8705,31 +8927,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8705
8927
 
8706
8928
  /** A product card: image, badge, wishlist, title, rating, price, and an action slot. */
8707
8929
  class BuiProductCard {
8930
+ /** Product title shown as the card heading. */
8708
8931
  title = input('', /* @ts-ignore */
8709
8932
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
8933
+ /** Optional link; when set the title becomes an anchor to this URL. */
8710
8934
  href = input('', /* @ts-ignore */
8711
8935
  ...(ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []));
8936
+ /** Source URL of the product image. */
8712
8937
  image = input('', /* @ts-ignore */
8713
8938
  ...(ngDevMode ? [{ debugName: "image" }] : /* istanbul ignore next */ []));
8939
+ /** Alt text for the image; falls back to the title when empty. */
8714
8940
  imageAlt = input('', /* @ts-ignore */
8715
8941
  ...(ngDevMode ? [{ debugName: "imageAlt" }] : /* istanbul ignore next */ []));
8942
+ /** Current price; hides the price block when null. */
8716
8943
  price = input(null, /* @ts-ignore */
8717
8944
  ...(ngDevMode ? [{ debugName: "price" }] : /* istanbul ignore next */ []));
8945
+ /** Original price for showing a strikethrough and discount. */
8718
8946
  compareAt = input(null, /* @ts-ignore */
8719
8947
  ...(ngDevMode ? [{ debugName: "compareAt" }] : /* istanbul ignore next */ []));
8948
+ /** Currency symbol prefixed to the price. */
8720
8949
  currency = input('$', /* @ts-ignore */
8721
8950
  ...(ngDevMode ? [{ debugName: "currency" }] : /* istanbul ignore next */ []));
8951
+ /** Badge text; auto-coloured for sale/new keywords. */
8722
8952
  badge = input('', /* @ts-ignore */
8723
8953
  ...(ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []));
8954
+ /** Small category label shown above the title. */
8724
8955
  category = input('', /* @ts-ignore */
8725
8956
  ...(ngDevMode ? [{ debugName: "category" }] : /* istanbul ignore next */ []));
8957
+ /** Star rating value; hides the rating row when null. */
8726
8958
  rating = input(null, /* @ts-ignore */
8727
8959
  ...(ngDevMode ? [{ debugName: "rating" }] : /* istanbul ignore next */ []));
8960
+ /** Review count shown next to the rating, when set. */
8728
8961
  reviews = input(null, /* @ts-ignore */
8729
8962
  ...(ngDevMode ? [{ debugName: "reviews" }] : /* istanbul ignore next */ []));
8963
+ /** Whether to show the wishlist (heart) toggle button. */
8730
8964
  wishlist = input(false, /* @ts-ignore */
8731
8965
  ...(ngDevMode ? [{ debugName: "wishlist" }] : /* istanbul ignore next */ []));
8732
8966
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
8967
+ /** Accessible label override for the wishlist toggle button. */
8733
8968
  wishlistLabel = input(/* @ts-ignore */
8734
8969
  ...(ngDevMode ? [undefined, { debugName: "wishlistLabel" }] : /* istanbul ignore next */ []));
8735
8970
  wishlistText = buiLabel('productCardWishlist', this.wishlistLabel);
@@ -8916,16 +9151,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
8916
9151
  * span carries the full word list so assistive tech reads it once. SSR-safe.
8917
9152
  */
8918
9153
  class BuiTypewriter {
9154
+ /** Words cycled through by the typewriter. */
8919
9155
  words = input([], /* @ts-ignore */
8920
9156
  ...(ngDevMode ? [{ debugName: "words" }] : /* istanbul ignore next */ []));
9157
+ /** Delay between typed characters, in milliseconds. */
8921
9158
  typeSpeed = input(90, /* @ts-ignore */
8922
9159
  ...(ngDevMode ? [{ debugName: "typeSpeed" }] : /* istanbul ignore next */ []));
9160
+ /** Delay between deleted characters, in milliseconds. */
8923
9161
  deleteSpeed = input(40, /* @ts-ignore */
8924
9162
  ...(ngDevMode ? [{ debugName: "deleteSpeed" }] : /* istanbul ignore next */ []));
9163
+ /** Pause once a word is fully typed before deleting, in milliseconds. */
8925
9164
  pause = input(1600, /* @ts-ignore */
8926
9165
  ...(ngDevMode ? [{ debugName: "pause" }] : /* istanbul ignore next */ []));
9166
+ /** Whether to restart from the first word after the last. */
8927
9167
  loop = input(true, /* @ts-ignore */
8928
9168
  ...(ngDevMode ? [{ debugName: "loop" }] : /* istanbul ignore next */ []));
9169
+ /** Whether to show the blinking cursor after the text. */
8929
9170
  cursor = input(true, /* @ts-ignore */
8930
9171
  ...(ngDevMode ? [{ debugName: "cursor" }] : /* istanbul ignore next */ []));
8931
9172
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9022,14 +9263,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9022
9263
  * an `aria-live` region carries the full passage up front. SSR-safe.
9023
9264
  */
9024
9265
  class BuiStreamingText {
9266
+ /** Full passage to reveal; also announced up front via an `aria-live` region. */
9025
9267
  text = input('', /* @ts-ignore */
9026
9268
  ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
9269
+ /** Delay in milliseconds between each revealed token. */
9027
9270
  speed = input(18, /* @ts-ignore */
9028
9271
  ...(ngDevMode ? [{ debugName: "speed" }] : /* istanbul ignore next */ []));
9272
+ /** Delay in milliseconds before streaming begins. */
9029
9273
  startDelay = input(0, /* @ts-ignore */
9030
9274
  ...(ngDevMode ? [{ debugName: "startDelay" }] : /* istanbul ignore next */ []));
9275
+ /** Granularity of the reveal — one character or one word at a time. */
9031
9276
  by = input('char', /* @ts-ignore */
9032
9277
  ...(ngDevMode ? [{ debugName: "by" }] : /* istanbul ignore next */ []));
9278
+ /** Whether to show a blinking caret while streaming. */
9033
9279
  caret = input(true, /* @ts-ignore */
9034
9280
  ...(ngDevMode ? [{ debugName: "caret" }] : /* istanbul ignore next */ []));
9035
9281
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9104,10 +9350,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9104
9350
 
9105
9351
  /** A card whose border has a light beam continuously travelling around it. */
9106
9352
  class BuiBorderBeam {
9353
+ /** Seconds for the beam to complete one full lap. */
9107
9354
  duration = input(6, /* @ts-ignore */
9108
9355
  ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
9356
+ /** Beam colour; defaults to the primary theme colour. */
9109
9357
  color = input(null, /* @ts-ignore */
9110
9358
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
9359
+ /** Border/beam thickness in pixels. */
9111
9360
  size = input(2, /* @ts-ignore */
9112
9361
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
9113
9362
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9140,8 +9389,10 @@ function pseudo(seed) {
9140
9389
  }
9141
9390
  /** Animated falling meteor streaks behind content. Decorative + SSR-safe. */
9142
9391
  class BuiMeteors {
9392
+ /** Number of meteor streaks to render. */
9143
9393
  count = input(20, /* @ts-ignore */
9144
9394
  ...(ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []));
9395
+ /** Meteor colour; defaults to a translucent foreground tint. */
9145
9396
  color = input(null, /* @ts-ignore */
9146
9397
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
9147
9398
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9199,8 +9450,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9199
9450
 
9200
9451
  /** An animated aurora / northern-lights gradient background with content overlaid. */
9201
9452
  class BuiAurora {
9453
+ /** Blur radius of the aurora layer in pixels. */
9202
9454
  blur = input(60, /* @ts-ignore */
9203
9455
  ...(ngDevMode ? [{ debugName: "blur" }] : /* istanbul ignore next */ []));
9456
+ /** Seconds for one full drift animation cycle. */
9204
9457
  speed = input(12, /* @ts-ignore */
9205
9458
  ...(ngDevMode ? [{ debugName: "speed" }] : /* istanbul ignore next */ []));
9206
9459
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9226,14 +9479,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9226
9479
 
9227
9480
  /** A seamless infinite scroll of `items` (logos, badges, testimonials…). */
9228
9481
  class BuiMarquee {
9482
+ /** Items rendered in sequence and scrolled seamlessly. */
9229
9483
  items = input([], /* @ts-ignore */
9230
9484
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
9485
+ /** Scroll direction; `up`/`down` switch the marquee to a vertical track. */
9231
9486
  direction = input('left', /* @ts-ignore */
9232
9487
  ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
9488
+ /** Time for one full loop, as a CSS duration (e.g. `40s`). */
9233
9489
  duration = input('40s', /* @ts-ignore */
9234
9490
  ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
9491
+ /** Spacing between items, as a CSS length. */
9235
9492
  gap = input('1rem', /* @ts-ignore */
9236
9493
  ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
9494
+ /** Whether hovering pauses the scroll animation. */
9237
9495
  pauseOnHover = input(true, /* @ts-ignore */
9238
9496
  ...(ngDevMode ? [{ debugName: "pauseOnHover" }] : /* istanbul ignore next */ []));
9239
9497
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9313,6 +9571,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9313
9571
 
9314
9572
  /** A mobile bottom tab bar. Use `[buiBottomNavItem]` on each `<a>`/`<button>`. */
9315
9573
  class BuiBottomNavigation {
9574
+ /** Accessible label applied to the navigation element. */
9316
9575
  ariaLabel = input('Bottom navigation', /* @ts-ignore */
9317
9576
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
9318
9577
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9335,10 +9594,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9335
9594
 
9336
9595
  /** A single bottom-navigation tab. Project the icon; pass `label`, `active`, `badge`. */
9337
9596
  class BuiBottomNavigationItem {
9597
+ /** Caption shown beneath the projected icon; hidden when empty. */
9338
9598
  label = input('', /* @ts-ignore */
9339
9599
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
9600
+ /** Whether this tab is the current page; sets `aria-current="page"`. */
9340
9601
  active = input(false, /* @ts-ignore */
9341
9602
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
9603
+ /** Badge content; `true` renders a dot, a string/number renders a count, `null` shows nothing. */
9342
9604
  badge = input(null, /* @ts-ignore */
9343
9605
  ...(ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []));
9344
9606
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9397,6 +9659,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9397
9659
  * viewport. Server-renders fully revealed (no-JS safe). SSR-safe.
9398
9660
  */
9399
9661
  class BuiTextReveal {
9662
+ /** Text split into words that brighten one by one as it scrolls into view. */
9400
9663
  text = input('', /* @ts-ignore */
9401
9664
  ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
9402
9665
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9456,8 +9719,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9456
9719
 
9457
9720
  /** Shifts its content relative to scroll for a depth/parallax effect. SSR-safe. */
9458
9721
  class BuiParallax {
9722
+ /** Parallax intensity; higher moves content more per scroll. */
9459
9723
  speed = input(0.3, /* @ts-ignore */
9460
9724
  ...(ngDevMode ? [{ debugName: "speed" }] : /* istanbul ignore next */ []));
9725
+ /** Axis along which the content shifts. */
9461
9726
  axis = input('y', /* @ts-ignore */
9462
9727
  ...(ngDevMode ? [{ debugName: "axis" }] : /* istanbul ignore next */ []));
9463
9728
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9502,9 +9767,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9502
9767
 
9503
9768
  /** A "on this page" nav that highlights the section currently in view (IntersectionObserver). */
9504
9769
  class BuiScrollspy {
9770
+ /** Sections to track; each item links to and observes its `href` anchor. */
9505
9771
  items = input([], /* @ts-ignore */
9506
9772
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
9507
9773
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
9774
+ /** Accessible label for the nav element; falls back to a localized default. */
9508
9775
  label = input(/* @ts-ignore */
9509
9776
  ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
9510
9777
  labelText = buiLabel('scrollspy', this.label);
@@ -9597,18 +9864,25 @@ const noop$8 = () => { };
9597
9864
  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';
9598
9865
  /** A styled time field: a native `<input type="time">`, or hour/minute selects in `select` mode. */
9599
9866
  class BuiTimeField {
9867
+ /** Selected time as `HH:mm`. Two-way bindable with `[(value)]`. */
9600
9868
  value = model('', /* @ts-ignore */
9601
9869
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
9870
+ /** Native `name` attribute for the input. */
9602
9871
  name = input('', /* @ts-ignore */
9603
9872
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
9873
+ /** Native `id` attribute for the input. */
9604
9874
  id = input('', /* @ts-ignore */
9605
9875
  ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
9876
+ /** Earliest allowed time (`HH:mm`) in `input` mode. */
9606
9877
  min = input('', /* @ts-ignore */
9607
9878
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
9879
+ /** Latest allowed time (`HH:mm`) in `input` mode. */
9608
9880
  max = input('', /* @ts-ignore */
9609
9881
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
9882
+ /** Whether to include seconds in `input` mode. */
9610
9883
  seconds = input(false, /* @ts-ignore */
9611
9884
  ...(ngDevMode ? [{ debugName: "seconds" }] : /* istanbul ignore next */ []));
9885
+ /** Whether the field is disabled. Two-way bindable with `[(disabled)]`. */
9612
9886
  disabled = model(false, /* @ts-ignore */
9613
9887
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
9614
9888
  /** `select` renders hour + minute dropdowns instead of a native time input. */
@@ -9617,6 +9891,7 @@ class BuiTimeField {
9617
9891
  /** Minute step used in `select` mode. */
9618
9892
  minuteStep = input(5, /* @ts-ignore */
9619
9893
  ...(ngDevMode ? [{ debugName: "minuteStep" }] : /* istanbul ignore next */ []));
9894
+ /** Accessible label for the field. */
9620
9895
  ariaLabel = input('', /* @ts-ignore */
9621
9896
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
9622
9897
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9767,10 +10042,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9767
10042
 
9768
10043
  /** A group of toggle buttons (single or multiple selection). Use `button[buiToggleGroupItem]`. */
9769
10044
  class BuiToggleGroup {
10045
+ /** Selection mode: single value or an array of values. */
9770
10046
  type = input('single', /* @ts-ignore */
9771
10047
  ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
10048
+ /** Selected value(s). Two-way bindable with `[(value)]`. */
9772
10049
  value = model(null, /* @ts-ignore */
9773
10050
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
10051
+ /** Layout direction of the group. */
9774
10052
  orientation = input('horizontal', /* @ts-ignore */
9775
10053
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
9776
10054
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9816,8 +10094,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9816
10094
 
9817
10095
  /** A single item within a `bui-toggle-group`. */
9818
10096
  class BuiToggleGroupItem {
10097
+ /** Value this item contributes to the parent group's selection. */
9819
10098
  value = input('', /* @ts-ignore */
9820
10099
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
10100
+ /** Whether this item is disabled. */
9821
10101
  disabled = input(false, /* @ts-ignore */
9822
10102
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
9823
10103
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9850,12 +10130,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9850
10130
  const noop$7 = () => { };
9851
10131
  /** A free-text tags input: type and press Enter (or comma) to add chips; Backspace removes. */
9852
10132
  class BuiTagsInput {
10133
+ /** Current tags. Two-way bindable with `[(tags)]`. */
9853
10134
  tags = model([], /* @ts-ignore */
9854
10135
  ...(ngDevMode ? [{ debugName: "tags" }] : /* istanbul ignore next */ []));
10136
+ /** Placeholder text shown in the entry field. */
9855
10137
  placeholder = input('Add tag…', /* @ts-ignore */
9856
10138
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
10139
+ /** Maximum number of tags allowed, or `null` for no limit. */
9857
10140
  max = input(null, /* @ts-ignore */
9858
10141
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
10142
+ /** Whether the input is disabled. Two-way bindable with `[(disabled)]`. */
9859
10143
  disabled = model(false, /* @ts-ignore */
9860
10144
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
9861
10145
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -9980,10 +10264,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
9980
10264
 
9981
10265
  /** Click-to-edit inline text: shows a value, swaps to an input on click. Enter commits, Escape cancels. */
9982
10266
  class BuiEditable {
10267
+ /** Current text. Two-way bindable with `[(value)]`. */
9983
10268
  value = model('', /* @ts-ignore */
9984
10269
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
10270
+ /** Text shown when the value is empty. */
9985
10271
  placeholder = input('Empty', /* @ts-ignore */
9986
10272
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
10273
+ /** Noun used in the field's accessible label. */
9987
10274
  label = input('value', /* @ts-ignore */
9988
10275
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
9989
10276
  /** Edit in a multi-line textarea instead of a single-line input. */
@@ -10110,10 +10397,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10110
10397
 
10111
10398
  /** A floating action button that expands to a stack of actions. Closes on Escape / outside click. */
10112
10399
  class BuiSpeedDial {
10400
+ /** Actions revealed when the dial expands. */
10113
10401
  actions = input([], /* @ts-ignore */
10114
10402
  ...(ngDevMode ? [{ debugName: "actions" }] : /* istanbul ignore next */ []));
10403
+ /** Direction the action stack expands relative to the trigger button. */
10115
10404
  direction = input('up', /* @ts-ignore */
10116
10405
  ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
10406
+ /** Accessible label for the trigger button. */
10117
10407
  label = input('Open actions', /* @ts-ignore */
10118
10408
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
10119
10409
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10244,18 +10534,25 @@ const CIRC = 2 * Math.PI * RADIUS;
10244
10534
  const ARC = CIRC * 0.75;
10245
10535
  /** A rotary dial input (role="slider"). Drag, scroll, or use the keyboard. 270° sweep. */
10246
10536
  class BuiKnob {
10537
+ /** Current value. Two-way bindable with `[(value)]`. */
10247
10538
  value = model(50, /* @ts-ignore */
10248
10539
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
10540
+ /** Minimum value at the start of the dial's sweep. */
10249
10541
  min = input(0, /* @ts-ignore */
10250
10542
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
10543
+ /** Maximum value at the end of the dial's sweep. */
10251
10544
  max = input(100, /* @ts-ignore */
10252
10545
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
10546
+ /** Increment applied per arrow key, scroll or drag snap. */
10253
10547
  step = input(1, /* @ts-ignore */
10254
10548
  ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
10549
+ /** Size preset controlling the knob's diameter and text size. */
10255
10550
  size = input('default', /* @ts-ignore */
10256
10551
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
10552
+ /** Accessible label announced for the slider. */
10257
10553
  label = input('Value', /* @ts-ignore */
10258
10554
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
10555
+ /** Whether the knob is disabled. Two-way bindable with `[(disabled)]`. */
10259
10556
  disabled = model(false, /* @ts-ignore */
10260
10557
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
10261
10558
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10500,16 +10797,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10500
10797
 
10501
10798
  /** A lazy image with a blurred placeholder / skeleton and a graceful error state. */
10502
10799
  class BuiImage {
10800
+ /** Source URL of the full image to load. */
10503
10801
  src = input('', /* @ts-ignore */
10504
10802
  ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
10803
+ /** Alternative text for the image. */
10505
10804
  alt = input('', /* @ts-ignore */
10506
10805
  ...(ngDevMode ? [{ debugName: "alt" }] : /* istanbul ignore next */ []));
10806
+ /** CSS `aspect-ratio` reserved for the image (e.g. `16 / 9`). */
10507
10807
  ratio = input('', /* @ts-ignore */
10508
10808
  ...(ngDevMode ? [{ debugName: "ratio" }] : /* istanbul ignore next */ []));
10809
+ /** URL of a low-res image shown blurred while the full image loads. */
10509
10810
  placeholder = input('', /* @ts-ignore */
10510
10811
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
10812
+ /** Tailwind class controlling corner rounding. */
10511
10813
  rounded = input('rounded-lg', /* @ts-ignore */
10512
10814
  ...(ngDevMode ? [{ debugName: "rounded" }] : /* istanbul ignore next */ []));
10815
+ /** How the image fills its box: `cover` crops, `contain` letterboxes. */
10513
10816
  fit = input('cover', /* @ts-ignore */
10514
10817
  ...(ngDevMode ? [{ debugName: "fit" }] : /* istanbul ignore next */ []));
10515
10818
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10615,10 +10918,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10615
10918
 
10616
10919
  /** A collapsible "reasoning" / chain-of-thought disclosure. */
10617
10920
  class BuiReasoning {
10921
+ /** Whether the disclosure is expanded. Two-way bindable with `[(open)]`. */
10618
10922
  open = model(false, /* @ts-ignore */
10619
10923
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
10924
+ /** Trigger label shown when no `duration` is set. */
10620
10925
  label = input('Reasoning', /* @ts-ignore */
10621
10926
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
10927
+ /** When set, the trigger reads "Thought for {duration}" instead of `label`. */
10622
10928
  duration = input('', /* @ts-ignore */
10623
10929
  ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
10624
10930
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10705,14 +11011,19 @@ const STATUS = {
10705
11011
  };
10706
11012
  /** An AI tool-call card with a status indicator and collapsible arguments / result. */
10707
11013
  class BuiToolCall {
11014
+ /** Name of the invoked tool, shown as inline code in the header. */
10708
11015
  name = input('tool', /* @ts-ignore */
10709
11016
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
11017
+ /** Execution status; drives the colored status dot and label. */
10710
11018
  status = input('success', /* @ts-ignore */
10711
11019
  ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
11020
+ /** Tool arguments shown in the collapsible body when present. */
10712
11021
  args = input('', /* @ts-ignore */
10713
11022
  ...(ngDevMode ? [{ debugName: "args" }] : /* istanbul ignore next */ []));
11023
+ /** Tool result shown in the collapsible body when present. */
10714
11024
  result = input('', /* @ts-ignore */
10715
11025
  ...(ngDevMode ? [{ debugName: "result" }] : /* istanbul ignore next */ []));
11026
+ /** Whether the arguments/result panel is expanded. Two-way bindable with `[(open)]`. */
10716
11027
  open = model(false, /* @ts-ignore */
10717
11028
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
10718
11029
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10814,6 +11125,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10814
11125
 
10815
11126
  /** A scrollable conversation log (`role="log"`). Use `bui-chat-message` for bubbles. */
10816
11127
  class BuiChat {
11128
+ /** Accessible label announced for the conversation log region. */
10817
11129
  ariaLabel = input('Conversation', /* @ts-ignore */
10818
11130
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
10819
11131
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10839,14 +11151,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10839
11151
 
10840
11152
  /** A chat bubble. `role="user"` aligns end with a primary bubble; otherwise assistant-styled. */
10841
11153
  class BuiChatMessage {
11154
+ /** Author role; `'user'` aligns the bubble to the end with primary styling, else assistant-styled. */
10842
11155
  role = input('assistant', /* @ts-ignore */
10843
11156
  ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
11157
+ /** Display name shown above the bubble; also seeds the fallback initials avatar. */
10844
11158
  name = input('', /* @ts-ignore */
10845
11159
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
11160
+ /** Optional timestamp text shown beside the name. */
10846
11161
  time = input('', /* @ts-ignore */
10847
11162
  ...(ngDevMode ? [{ debugName: "time" }] : /* istanbul ignore next */ []));
11163
+ /** Avatar image URL; when empty, initials (or an emoji) are shown instead. */
10848
11164
  avatar = input('', /* @ts-ignore */
10849
11165
  ...(ngDevMode ? [{ debugName: "avatar" }] : /* istanbul ignore next */ []));
11166
+ /** When true, shows an animated typing indicator instead of the message content. */
10850
11167
  typing = input(false, /* @ts-ignore */
10851
11168
  ...(ngDevMode ? [{ debugName: "typing" }] : /* istanbul ignore next */ []));
10852
11169
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -10960,10 +11277,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
10960
11277
  const PALETTE$1 = ['#6366f1', '#ec4899', '#f59e0b', '#10b981', '#3b82f6', '#ef4444'];
10961
11278
  /** A celebratory particle burst. Project a trigger (or use the default button) to fire it. */
10962
11279
  class BuiConfetti {
11280
+ /** Number of particles emitted per burst. */
10963
11281
  count = input(80, /* @ts-ignore */
10964
11282
  ...(ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []));
11283
+ /** Horizontal spread factor of the burst. */
10965
11284
  spread = input(70, /* @ts-ignore */
10966
11285
  ...(ngDevMode ? [{ debugName: "spread" }] : /* istanbul ignore next */ []));
11286
+ /** Particle colours; defaults to the built-in palette. */
10967
11287
  colors = input(null, /* @ts-ignore */
10968
11288
  ...(ngDevMode ? [{ debugName: "colors" }] : /* istanbul ignore next */ []));
10969
11289
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11048,8 +11368,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11048
11368
 
11049
11369
  /** A step indicator. The `value` (1-based) marks the active step. Use `li[buiStepperItem]`. */
11050
11370
  class BuiStepper {
11371
+ /** The active step as a 1-based index; items at lower values are marked completed. */
11051
11372
  value = input(1, /* @ts-ignore */
11052
11373
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
11374
+ /** Layout direction of the steps, horizontal or vertical. */
11053
11375
  orientation = input('horizontal', /* @ts-ignore */
11054
11376
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
11055
11377
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11094,6 +11416,7 @@ const INDICATOR = {
11094
11416
  };
11095
11417
  /** A single step within a `bui-stepper`. Resolves completed/active/inactive from the parent. */
11096
11418
  class BuiStepperItem {
11419
+ /** This item's 1-based position; compared against the parent's value to derive its state. */
11097
11420
  step = input(1, /* @ts-ignore */
11098
11421
  ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
11099
11422
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11189,17 +11512,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11189
11512
  const noop$5 = () => { };
11190
11513
  /** A one-time-password input: a row of single-character boxes with focus management + paste. */
11191
11514
  class BuiInputOtp {
11515
+ /** Current code. Two-way bindable with `[(value)]`. */
11192
11516
  value = model('', /* @ts-ignore */
11193
11517
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
11518
+ /** Number of character boxes (length of the code). */
11194
11519
  maxlength = input(6, /* @ts-ignore */
11195
11520
  ...(ngDevMode ? [{ debugName: "maxlength" }] : /* istanbul ignore next */ []));
11521
+ /** Whether the input is disabled. Two-way bindable with `[(disabled)]`. */
11196
11522
  disabled = model(false, /* @ts-ignore */
11197
11523
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
11524
+ /** Whether to allow letters as well as digits. */
11198
11525
  alphanumeric = input(false, /* @ts-ignore */
11199
11526
  ...(ngDevMode ? [{ debugName: "alphanumeric" }] : /* istanbul ignore next */ []));
11200
11527
  /** Insert a visual separator after every N boxes (0 = none). */
11201
11528
  groupSize = input(0, /* @ts-ignore */
11202
11529
  ...(ngDevMode ? [{ debugName: "groupSize" }] : /* istanbul ignore next */ []));
11530
+ /** Base accessible label; each box appends its position. */
11203
11531
  ariaLabel = input('One-time password', /* @ts-ignore */
11204
11532
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
11205
11533
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11341,19 +11669,26 @@ const COUNTRIES = [
11341
11669
  ];
11342
11670
  /** A phone number field with a country-code selector. */
11343
11671
  class BuiPhoneInput {
11672
+ /** Entered phone number. Two-way bindable with `[(value)]`. */
11344
11673
  value = model('', /* @ts-ignore */
11345
11674
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
11675
+ /** Selected country code. Two-way bindable with `[(country)]`. */
11346
11676
  country = model('US', /* @ts-ignore */
11347
11677
  ...(ngDevMode ? [{ debugName: "country" }] : /* istanbul ignore next */ []));
11678
+ /** Name attribute applied to the number input for form submission. */
11348
11679
  name = input('', /* @ts-ignore */
11349
11680
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
11681
+ /** Id attribute applied to the number input. */
11350
11682
  id = input('', /* @ts-ignore */
11351
11683
  ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
11684
+ /** Placeholder text for the number input. */
11352
11685
  placeholder = input('Phone number', /* @ts-ignore */
11353
11686
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
11354
11687
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
11688
+ /** Accessible label override for the country selector. */
11355
11689
  countryLabel = input(/* @ts-ignore */
11356
11690
  ...(ngDevMode ? [undefined, { debugName: "countryLabel" }] : /* istanbul ignore next */ []));
11691
+ /** Accessible label override for the number input. */
11357
11692
  numberLabel = input(/* @ts-ignore */
11358
11693
  ...(ngDevMode ? [undefined, { debugName: "numberLabel" }] : /* istanbul ignore next */ []));
11359
11694
  countryText = buiLabel('phoneInputCountry', this.countryLabel);
@@ -11423,20 +11758,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11423
11758
 
11424
11759
  /** A chat composer: an autosizing textarea with a send button. Emits `submitted` on send. */
11425
11760
  class BuiPromptInput {
11761
+ /** Current textarea content. Two-way bindable with `[(value)]`. */
11426
11762
  value = model('', /* @ts-ignore */
11427
11763
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
11764
+ /** Placeholder text shown when the textarea is empty. */
11428
11765
  placeholder = input('Send a message…', /* @ts-ignore */
11429
11766
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
11767
+ /** Whether to show the attachment button. */
11430
11768
  attachable = input(false, /* @ts-ignore */
11431
11769
  ...(ngDevMode ? [{ debugName: "attachable" }] : /* istanbul ignore next */ []));
11770
+ /** Disables the textarea and send button. */
11432
11771
  disabled = input(false, /* @ts-ignore */
11433
11772
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
11773
+ /** Accessible label for the message textarea. */
11434
11774
  ariaLabel = input('Message', /* @ts-ignore */
11435
11775
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
11776
+ /** Overrides the localized accessible label for the attachment button. */
11436
11777
  attachLabel = input(/* @ts-ignore */
11437
11778
  ...(ngDevMode ? [undefined, { debugName: "attachLabel" }] : /* istanbul ignore next */ []));
11779
+ /** Overrides the localized accessible label for the send button. */
11438
11780
  sendLabel = input(/* @ts-ignore */
11439
11781
  ...(ngDevMode ? [undefined, { debugName: "sendLabel" }] : /* istanbul ignore next */ []));
11782
+ /** Emitted with the trimmed message text when the user sends. */
11440
11783
  submitted = output();
11441
11784
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
11442
11785
  attachText = buiLabel('promptInputAttach', this.attachLabel);
@@ -11606,6 +11949,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11606
11949
 
11607
11950
  /** A contribution-style heatmap grid (7 rows). Pass `data` or get a deterministic demo. */
11608
11951
  class BuiHeatmap {
11952
+ /** Per-cell counts filled column-first; empty yields a demo dataset. */
11609
11953
  data = input([], /* @ts-ignore */
11610
11954
  ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
11611
11955
  /** Smaller cells + tighter gaps. */
@@ -11682,12 +12026,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11682
12026
 
11683
12027
  /** An inline citation marker that reveals a source popover on hover / focus / click. */
11684
12028
  class BuiCitation {
12029
+ /** Citation number shown in the inline `[n]` marker. */
11685
12030
  index = input(1, /* @ts-ignore */
11686
12031
  ...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
12032
+ /** Source title shown at the top of the popover. */
11687
12033
  title = input('', /* @ts-ignore */
11688
12034
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
12035
+ /** Source URL; its hostname is derived and shown in the popover. */
11689
12036
  url = input('', /* @ts-ignore */
11690
12037
  ...(ngDevMode ? [{ debugName: "url" }] : /* istanbul ignore next */ []));
12038
+ /** Short excerpt from the source shown in the popover. */
11691
12039
  snippet = input('', /* @ts-ignore */
11692
12040
  ...(ngDevMode ? [{ debugName: "snippet" }] : /* istanbul ignore next */ []));
11693
12041
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11809,8 +12157,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11809
12157
 
11810
12158
  /** A two-panel resizable group. Hosts the shared size; the handle drags it. */
11811
12159
  class BuiResizablePanelGroup {
12160
+ /** Layout axis the panels are arranged and resized along. */
11812
12161
  direction = input('horizontal', /* @ts-ignore */
11813
12162
  ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
12163
+ /** Size of the primary panel as a percentage (10-90). Two-way bindable with `[(size)]`. */
11814
12164
  size = model(50, /* @ts-ignore */
11815
12165
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
11816
12166
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11860,6 +12210,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11860
12210
 
11861
12211
  /** A panel inside a `bui-resizable-panel-group`. Mark one `primary` to make it the sized panel. */
11862
12212
  class BuiResizablePanel {
12213
+ /** Whether this is the sized panel driven by the group's `size`; the other panel flexes. */
11863
12214
  primary = input(false, /* @ts-ignore */
11864
12215
  ...(ngDevMode ? [{ debugName: "primary" }] : /* istanbul ignore next */ []));
11865
12216
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11883,8 +12234,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11883
12234
 
11884
12235
  /** The draggable divider between two resizable panels. */
11885
12236
  class BuiResizableHandle {
12237
+ /** Whether to render a visible grip indicator on the divider. */
11886
12238
  withHandle = input(false, /* @ts-ignore */
11887
12239
  ...(ngDevMode ? [{ debugName: "withHandle" }] : /* istanbul ignore next */ []));
12240
+ /** Accessible label for the handle; falls back to a localized default. */
11888
12241
  ariaLabel = input(/* @ts-ignore */
11889
12242
  ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
11890
12243
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -11945,23 +12298,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
11945
12298
 
11946
12299
  /** A styled HTML5 video with a poster + play-button facade. */
11947
12300
  class BuiVideo {
12301
+ /** Video source URL for the underlying `<video>` element. */
11948
12302
  src = input('', /* @ts-ignore */
11949
12303
  ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
12304
+ /** Poster image URL shown before playback starts. */
11950
12305
  poster = input('', /* @ts-ignore */
11951
12306
  ...(ngDevMode ? [{ debugName: "poster" }] : /* istanbul ignore next */ []));
12307
+ /** Aspect ratio: `video` (16/9), `square` (1/1), or any CSS ratio. */
11952
12308
  aspect = input('video', /* @ts-ignore */
11953
12309
  ...(ngDevMode ? [{ debugName: "aspect" }] : /* istanbul ignore next */ []));
12310
+ /** Whether to show native controls once playback has started. */
11954
12311
  controls = input(true, /* @ts-ignore */
11955
12312
  ...(ngDevMode ? [{ debugName: "controls" }] : /* istanbul ignore next */ []));
12313
+ /** Whether to start playing automatically (hides the play facade). */
11956
12314
  autoplay = input(false, /* @ts-ignore */
11957
12315
  ...(ngDevMode ? [{ debugName: "autoplay" }] : /* istanbul ignore next */ []));
12316
+ /** Whether the video loops when it reaches the end. */
11958
12317
  loop = input(false, /* @ts-ignore */
11959
12318
  ...(ngDevMode ? [{ debugName: "loop" }] : /* istanbul ignore next */ []));
12319
+ /** Whether the video starts muted. */
11960
12320
  muted = input(false, /* @ts-ignore */
11961
12321
  ...(ngDevMode ? [{ debugName: "muted" }] : /* istanbul ignore next */ []));
12322
+ /** Tailwind border-radius utility applied to the container. */
11962
12323
  rounded = input('rounded-xl', /* @ts-ignore */
11963
12324
  ...(ngDevMode ? [{ debugName: "rounded" }] : /* istanbul ignore next */ []));
11964
12325
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12326
+ /** Accessible label override for the play-button facade. */
11965
12327
  playLabel = input(/* @ts-ignore */
11966
12328
  ...(ngDevMode ? [undefined, { debugName: "playLabel" }] : /* istanbul ignore next */ []));
11967
12329
  playText = buiLabel('videoPlay', this.playLabel);
@@ -12088,15 +12450,20 @@ const DEFAULT_SWATCHES = [
12088
12450
  ];
12089
12451
  /** A colour picker: a native colour well, a hex field, and a swatch palette. */
12090
12452
  class BuiColorPicker {
12453
+ /** Selected color as a hex string. Two-way bindable with `[(value)]`. */
12091
12454
  value = model('#6366f1', /* @ts-ignore */
12092
12455
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
12456
+ /** Custom swatch palette; falls back to a built-in set when null. */
12093
12457
  swatches = input(null, /* @ts-ignore */
12094
12458
  ...(ngDevMode ? [{ debugName: "swatches" }] : /* istanbul ignore next */ []));
12459
+ /** Whether the picker is disabled. */
12095
12460
  disabled = input(false, /* @ts-ignore */
12096
12461
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
12097
12462
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12463
+ /** Accessible label for the native color well. */
12098
12464
  pickLabel = input(/* @ts-ignore */
12099
12465
  ...(ngDevMode ? [undefined, { debugName: "pickLabel" }] : /* istanbul ignore next */ []));
12466
+ /** Accessible label for the hex text field. */
12100
12467
  hexLabel = input(/* @ts-ignore */
12101
12468
  ...(ngDevMode ? [undefined, { debugName: "hexLabel" }] : /* istanbul ignore next */ []));
12102
12469
  pickText = buiLabel('colorPickerPick', this.pickLabel);
@@ -12197,14 +12564,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12197
12564
 
12198
12565
  /** A GDPR cookie banner. Persists the choice in localStorage (skipped in `demo` mode). */
12199
12566
  class BuiCookieConsent {
12567
+ /** Consent message shown to the user. */
12200
12568
  message = input('We use cookies to enhance your experience.', /* @ts-ignore */
12201
12569
  ...(ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []));
12570
+ /** When true, always shows the banner and skips reading/writing localStorage. */
12202
12571
  demo = input(false, /* @ts-ignore */
12203
12572
  ...(ngDevMode ? [{ debugName: "demo" }] : /* istanbul ignore next */ []));
12573
+ /** localStorage key under which the accept/decline choice is persisted. */
12204
12574
  storageKey = input('bui-cookie-consent', /* @ts-ignore */
12205
12575
  ...(ngDevMode ? [{ debugName: "storageKey" }] : /* istanbul ignore next */ []));
12576
+ /** Emitted with `true` when the user accepts and `false` when they decline. */
12206
12577
  decided = output();
12207
12578
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12579
+ /** Overrides the localized accessible label for the consent region. */
12208
12580
  ariaLabel = input(/* @ts-ignore */
12209
12581
  ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
12210
12582
  ariaLabelText = buiLabel('cookieConsent', this.ariaLabel);
@@ -12287,12 +12659,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12287
12659
  * "Load more" button is pressed. Drive `loading` / `finished` from the consumer. SSR-safe.
12288
12660
  */
12289
12661
  class BuiInfiniteScroll {
12662
+ /** Whether a load is in progress; shows the spinner and suppresses new emits. */
12290
12663
  loading = input(false, /* @ts-ignore */
12291
12664
  ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
12665
+ /** Whether all items are loaded; shows the end message and suppresses emits. */
12292
12666
  finished = input(false, /* @ts-ignore */
12293
12667
  ...(ngDevMode ? [{ debugName: "finished" }] : /* istanbul ignore next */ []));
12668
+ /** Pixel margin below the viewport at which the sentinel triggers loading. */
12294
12669
  threshold = input(200, /* @ts-ignore */
12295
12670
  ...(ngDevMode ? [{ debugName: "threshold" }] : /* istanbul ignore next */ []));
12671
+ /** Emits when the sentinel scrolls into view or the fallback button is pressed. */
12296
12672
  more = output();
12297
12673
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12298
12674
  sentinel = viewChild('sentinel', /* @ts-ignore */
@@ -12417,26 +12793,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12417
12793
 
12418
12794
  /** A compact audio player around a native `<audio>`: play/pause, seek, time, mute. */
12419
12795
  class BuiAudioPlayer {
12796
+ /** Audio source URL for the underlying `<audio>` element. */
12420
12797
  src = input('', /* @ts-ignore */
12421
12798
  ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
12799
+ /** Track title shown next to the controls. */
12422
12800
  title = input('', /* @ts-ignore */
12423
12801
  ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
12802
+ /** Artist name shown under the title. */
12424
12803
  artist = input('', /* @ts-ignore */
12425
12804
  ...(ngDevMode ? [{ debugName: "artist" }] : /* istanbul ignore next */ []));
12805
+ /** Whether to start playback automatically once loaded. */
12426
12806
  autoplay = input(false, /* @ts-ignore */
12427
12807
  ...(ngDevMode ? [{ debugName: "autoplay" }] : /* istanbul ignore next */ []));
12428
12808
  /** Condensed layout: hides the title block and mute button. */
12429
12809
  compact = input(false, /* @ts-ignore */
12430
12810
  ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
12431
12811
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
12812
+ /** Accessible label override for the seek slider. */
12432
12813
  seekLabel = input(/* @ts-ignore */
12433
12814
  ...(ngDevMode ? [undefined, { debugName: "seekLabel" }] : /* istanbul ignore next */ []));
12815
+ /** Accessible label override for the play button. */
12434
12816
  playLabel = input(/* @ts-ignore */
12435
12817
  ...(ngDevMode ? [undefined, { debugName: "playLabel" }] : /* istanbul ignore next */ []));
12818
+ /** Accessible label override for the pause button. */
12436
12819
  pauseLabel = input(/* @ts-ignore */
12437
12820
  ...(ngDevMode ? [undefined, { debugName: "pauseLabel" }] : /* istanbul ignore next */ []));
12821
+ /** Accessible label override for the mute button. */
12438
12822
  muteLabel = input(/* @ts-ignore */
12439
12823
  ...(ngDevMode ? [undefined, { debugName: "muteLabel" }] : /* istanbul ignore next */ []));
12824
+ /** Accessible label override for the unmute button. */
12440
12825
  unmuteLabel = input(/* @ts-ignore */
12441
12826
  ...(ngDevMode ? [undefined, { debugName: "unmuteLabel" }] : /* istanbul ignore next */ []));
12442
12827
  seekText = buiLabel('audioPlayerSeek', this.seekLabel);
@@ -12646,8 +13031,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12646
13031
 
12647
13032
  /** A canvas signature pad with draw, undo and clear. SSR-safe (canvas set up in the browser). */
12648
13033
  class BuiSignaturePad {
13034
+ /** Canvas height in pixels. */
12649
13035
  height = input(200, /* @ts-ignore */
12650
13036
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
13037
+ /** Stroke color; falls back to the current text color when empty. */
12651
13038
  penColor = input('', /* @ts-ignore */
12652
13039
  ...(ngDevMode ? [{ debugName: "penColor" }] : /* istanbul ignore next */ []));
12653
13040
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -12804,11 +13191,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12804
13191
 
12805
13192
  /** A macOS-style dock with a cursor-following fisheye magnify. Use `bui-dock-item` tiles. */
12806
13193
  class BuiDock {
13194
+ /** Maximum scale factor applied to the tile directly under the cursor. */
12807
13195
  magnify = input(1.6, /* @ts-ignore */
12808
13196
  ...(ngDevMode ? [{ debugName: "magnify" }] : /* istanbul ignore next */ []));
13197
+ /** Pixel radius around the cursor within which tiles are magnified. */
12809
13198
  distance = input(120, /* @ts-ignore */
12810
13199
  ...(ngDevMode ? [{ debugName: "distance" }] : /* istanbul ignore next */ []));
12811
13200
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
13201
+ /** Accessible label for the dock navigation; falls back to the i18n default. */
12812
13202
  label = input(/* @ts-ignore */
12813
13203
  ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
12814
13204
  labelText = buiLabel('dock', this.label);
@@ -12860,6 +13250,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12860
13250
 
12861
13251
  /** A magnifying tile inside a `bui-dock`. */
12862
13252
  class BuiDockItem {
13253
+ /** Whether to show the active indicator dot beneath the tile. */
12863
13254
  active = input(false, /* @ts-ignore */
12864
13255
  ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
12865
13256
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -12916,8 +13307,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
12916
13307
 
12917
13308
  /** A single tree row; renders its own children recursively. */
12918
13309
  class BuiTreeNode {
13310
+ /** Node data for this row, including its label and children. */
12919
13311
  item = input.required(/* @ts-ignore */
12920
13312
  ...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
13313
+ /** Depth of this node, used for indentation and `aria-level` (root is 1). */
12921
13314
  level = input(1, /* @ts-ignore */
12922
13315
  ...(ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []));
12923
13316
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13027,8 +13420,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13027
13420
 
13028
13421
  /** A collapsible, data-driven hierarchical tree (`role="tree"`). */
13029
13422
  class BuiTree {
13423
+ /** Root nodes of the tree to render. */
13030
13424
  items = input([], /* @ts-ignore */
13031
13425
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
13426
+ /** Accessible label for the tree's root element. */
13032
13427
  ariaLabel = input('Tree', /* @ts-ignore */
13033
13428
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
13034
13429
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13061,16 +13456,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13061
13456
 
13062
13457
  /** A dynamic list of repeatable form rows with add/remove and min/max bounds. */
13063
13458
  class BuiRepeater {
13459
+ /** Column definitions rendered for every row. */
13064
13460
  fields = input([], /* @ts-ignore */
13065
13461
  ...(ngDevMode ? [{ debugName: "fields" }] : /* istanbul ignore next */ []));
13462
+ /** Row data keyed by field key. Two-way bindable with `[(rows)]`. */
13066
13463
  rows = model([], /* @ts-ignore */
13067
13464
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
13465
+ /** Minimum number of rows that must remain (remove is disabled at this count). */
13068
13466
  min = input(1, /* @ts-ignore */
13069
13467
  ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
13468
+ /** Maximum number of rows allowed, or null for unlimited. */
13070
13469
  max = input(null, /* @ts-ignore */
13071
13470
  ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
13471
+ /** Text shown on the add-row button. */
13072
13472
  addLabel = input('Add row', /* @ts-ignore */
13073
13473
  ...(ngDevMode ? [{ debugName: "addLabel" }] : /* istanbul ignore next */ []));
13474
+ /** Accessible label override for the remove-row buttons. */
13074
13475
  removeLabel = input(/* @ts-ignore */
13075
13476
  ...(ngDevMode ? [undefined, { debugName: "removeLabel" }] : /* istanbul ignore next */ []));
13076
13477
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13242,17 +13643,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13242
13643
 
13243
13644
  /** A bell trigger with a dropdown feed of notifications and an unread badge. */
13244
13645
  class BuiNotificationCenter {
13646
+ /** Notification items rendered in the dropdown feed. */
13245
13647
  notifications = input([], /* @ts-ignore */
13246
13648
  ...(ngDevMode ? [{ debugName: "notifications" }] : /* istanbul ignore next */ []));
13649
+ /** Whether the dropdown is open. Two-way bindable with `[(open)]`. */
13247
13650
  open = model(false, /* @ts-ignore */
13248
13651
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
13249
13652
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
13653
+ /** Accessible label for the trigger and dropdown region. */
13250
13654
  ariaLabel = input(/* @ts-ignore */
13251
13655
  ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
13656
+ /** Accessible label announced for the per-item unread dot. */
13252
13657
  unreadLabel = input(/* @ts-ignore */
13253
13658
  ...(ngDevMode ? [undefined, { debugName: "unreadLabel" }] : /* istanbul ignore next */ []));
13659
+ /** Label for the "mark all as read" action button. */
13254
13660
  markAllReadLabel = input(/* @ts-ignore */
13255
13661
  ...(ngDevMode ? [undefined, { debugName: "markAllReadLabel" }] : /* istanbul ignore next */ []));
13662
+ /** Text shown when there are no notifications. */
13256
13663
  emptyLabel = input(/* @ts-ignore */
13257
13664
  ...(ngDevMode ? [undefined, { debugName: "emptyLabel" }] : /* istanbul ignore next */ []));
13258
13665
  ariaText = buiLabel('notificationCenter', this.ariaLabel);
@@ -13423,10 +13830,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13423
13830
 
13424
13831
  /** A single JSON node; renders nested objects/arrays recursively. */
13425
13832
  class BuiJsonViewerNode {
13833
+ /** Arbitrary JSON value rendered by this node. */
13426
13834
  value = input(null, /* @ts-ignore */
13427
13835
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
13836
+ /** Object key or array index labeling this node, or null at the root. */
13428
13837
  keyName = input(null, /* @ts-ignore */
13429
13838
  ...(ngDevMode ? [{ debugName: "keyName" }] : /* istanbul ignore next */ []));
13839
+ /** Whether this node starts expanded. */
13430
13840
  expanded = input(true, /* @ts-ignore */
13431
13841
  ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
13432
13842
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13608,8 +14018,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13608
14018
 
13609
14019
  /** A collapsible JSON tree viewer. Accepts an object/array or a JSON string. */
13610
14020
  class BuiJsonViewer {
14021
+ /** Arbitrary JSON value to render; a string is parsed as JSON when possible. */
13611
14022
  data = input(null, /* @ts-ignore */
13612
14023
  ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
14024
+ /** Whether nodes start expanded. */
13613
14025
  expanded = input(true, /* @ts-ignore */
13614
14026
  ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
13615
14027
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13643,6 +14055,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13643
14055
 
13644
14056
  /** A single org-chart node (a card + recursive children). Rendered on an `<li>`. */
13645
14057
  class BuiOrgChartNode {
14058
+ /** Node rendered as a card, with its `children` recursed into nested `<li>`s. */
13646
14059
  node = input.required(/* @ts-ignore */
13647
14060
  ...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
13648
14061
  children = computed(() => this.node().children ?? [], /* @ts-ignore */
@@ -13719,6 +14132,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13719
14132
 
13720
14133
  /** A top-down organizational chart with pure-CSS connectors. Recursively renders nodes. */
13721
14134
  class BuiOrgChart {
14135
+ /** Root node of the tree to render; `null` renders nothing. */
13722
14136
  node = input(null, /* @ts-ignore */
13723
14137
  ...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
13724
14138
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -13746,15 +14160,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13746
14160
 
13747
14161
  /** A cart trigger with an item-count badge and a dropdown with line items + subtotal. */
13748
14162
  class BuiMiniCart {
14163
+ /** Line items in the cart, used for count and subtotal. */
13749
14164
  items = input([], /* @ts-ignore */
13750
14165
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
14166
+ /** Currency symbol prefixed to prices and subtotal. */
13751
14167
  currency = input('$', /* @ts-ignore */
13752
14168
  ...(ngDevMode ? [{ debugName: "currency" }] : /* istanbul ignore next */ []));
14169
+ /** Whether the dropdown is open. Two-way bindable with `[(open)]`. */
13753
14170
  open = model(false, /* @ts-ignore */
13754
14171
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
13755
14172
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
14173
+ /** Accessible label override for the cart trigger button. */
13756
14174
  triggerLabel = input(/* @ts-ignore */
13757
14175
  ...(ngDevMode ? [undefined, { debugName: "triggerLabel" }] : /* istanbul ignore next */ []));
14176
+ /** Accessible label override for the cart dropdown dialog. */
13758
14177
  label = input(/* @ts-ignore */
13759
14178
  ...(ngDevMode ? [undefined, { debugName: "label" }] : /* istanbul ignore next */ []));
13760
14179
  triggerText = buiLabel('miniCartTrigger', this.triggerLabel);
@@ -13935,12 +14354,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
13935
14354
 
13936
14355
  /** An SVG beam connecting two elements (by selector) with a travelling light. SSR-safe. */
13937
14356
  class BuiAnimatedBeam {
14357
+ /** CSS selector of the element the beam starts from. */
13938
14358
  from = input('', /* @ts-ignore */
13939
14359
  ...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
14360
+ /** CSS selector of the element the beam ends at. */
13940
14361
  to = input('', /* @ts-ignore */
13941
14362
  ...(ngDevMode ? [{ debugName: "to" }] : /* istanbul ignore next */ []));
14363
+ /** Upward bow of the connecting curve in pixels. */
13942
14364
  curvature = input(0, /* @ts-ignore */
13943
14365
  ...(ngDevMode ? [{ debugName: "curvature" }] : /* istanbul ignore next */ []));
14366
+ /** Seconds for the travelling light to traverse the beam. */
13944
14367
  duration = input(3, /* @ts-ignore */
13945
14368
  ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
13946
14369
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -14078,10 +14501,13 @@ const ROW_CLASS = {
14078
14501
  const SIGN = { same: ' ', add: '+', del: '-' };
14079
14502
  /** A line-by-line text diff (LCS) rendered with +/- gutters. */
14080
14503
  class BuiDiffViewer {
14504
+ /** Original text; lines removed relative to `after` are marked deleted. */
14081
14505
  before = input('', /* @ts-ignore */
14082
14506
  ...(ngDevMode ? [{ debugName: "before" }] : /* istanbul ignore next */ []));
14507
+ /** Updated text; lines added relative to `before` are marked added. */
14083
14508
  after = input('', /* @ts-ignore */
14084
14509
  ...(ngDevMode ? [{ debugName: "after" }] : /* istanbul ignore next */ []));
14510
+ /** Optional filename shown in the header above the diff. */
14085
14511
  filename = input('', /* @ts-ignore */
14086
14512
  ...(ngDevMode ? [{ debugName: "filename" }] : /* istanbul ignore next */ []));
14087
14513
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -14150,11 +14576,14 @@ const ALIGN$2 = {
14150
14576
  };
14151
14577
  /** A table whose rows can nest and expand/collapse (flattened to visible rows). */
14152
14578
  class BuiTreeTable {
14579
+ /** Column definitions in display order. */
14153
14580
  columns = input([], /* @ts-ignore */
14154
14581
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
14582
+ /** Top-level rows, each able to nest children via `children`. */
14155
14583
  rows = input([], /* @ts-ignore */
14156
14584
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
14157
14585
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
14586
+ /** Accessible label for the expand/collapse toggle button. */
14158
14587
  toggleLabel = input(/* @ts-ignore */
14159
14588
  ...(ngDevMode ? [undefined, { debugName: "toggleLabel" }] : /* istanbul ignore next */ []));
14160
14589
  toggleText = buiLabel('treeTableToggle', this.toggleLabel);
@@ -14351,12 +14780,16 @@ function renderMarkdown(markdown) {
14351
14780
  }
14352
14781
  /** A markdown textarea with a live, sanitized HTML preview. */
14353
14782
  class BuiMarkdownEditor {
14783
+ /** Markdown source text. Two-way bindable with `[(value)]`. */
14354
14784
  value = model('', /* @ts-ignore */
14355
14785
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
14786
+ /** Name attribute applied to the textarea for form submission. */
14356
14787
  name = input('', /* @ts-ignore */
14357
14788
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
14789
+ /** Placeholder text shown while the textarea is empty. */
14358
14790
  placeholder = input('Write markdown…', /* @ts-ignore */
14359
14791
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
14792
+ /** Number of visible rows in the write textarea. */
14360
14793
  rows = input(8, /* @ts-ignore */
14361
14794
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
14362
14795
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -14444,6 +14877,7 @@ function isoOf(date) {
14444
14877
  * Render several months side by side with `months`. SSR-safe.
14445
14878
  */
14446
14879
  class BuiCalendar {
14880
+ /** Selected day (mode="single") as `yyyy-mm-dd`. Two-way bindable with `[(value)]`. */
14447
14881
  value = model('', /* @ts-ignore */
14448
14882
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
14449
14883
  /** Selection mode: `single` | `range` | `multiple`. */
@@ -14458,10 +14892,13 @@ class BuiCalendar {
14458
14892
  /** Number of month grids to render side by side. */
14459
14893
  months = input(1, /* @ts-ignore */
14460
14894
  ...(ngDevMode ? [{ debugName: "months" }] : /* istanbul ignore next */ []));
14895
+ /** First day of the week (0 = Sunday). */
14461
14896
  weekStart = input(0, /* @ts-ignore */
14462
14897
  ...(ngDevMode ? [{ debugName: "weekStart" }] : /* istanbul ignore next */ []));
14898
+ /** Earliest selectable date (`yyyy-mm-dd`). */
14463
14899
  minDate = input('', /* @ts-ignore */
14464
14900
  ...(ngDevMode ? [{ debugName: "minDate" }] : /* istanbul ignore next */ []));
14901
+ /** Latest selectable date (`yyyy-mm-dd`). */
14465
14902
  maxDate = input('', /* @ts-ignore */
14466
14903
  ...(ngDevMode ? [{ debugName: "maxDate" }] : /* istanbul ignore next */ []));
14467
14904
  /** Specific ISO dates (yyyy-mm-dd) to disable. */
@@ -14479,15 +14916,20 @@ class BuiCalendar {
14479
14916
  /** Hide days that fall outside the current month. */
14480
14917
  hideOutsideDays = input(false, /* @ts-ignore */
14481
14918
  ...(ngDevMode ? [{ debugName: "hideOutsideDays" }] : /* istanbul ignore next */ []));
14919
+ /** Whether the whole calendar is disabled. Two-way bindable with `[(disabled)]`. */
14482
14920
  disabled = model(false, /* @ts-ignore */
14483
14921
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
14484
14922
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
14923
+ /** Accessible label for the previous-month button. */
14485
14924
  previousMonthLabel = input(/* @ts-ignore */
14486
14925
  ...(ngDevMode ? [undefined, { debugName: "previousMonthLabel" }] : /* istanbul ignore next */ []));
14926
+ /** Accessible label for the month dropdown. */
14487
14927
  monthSelectLabel = input(/* @ts-ignore */
14488
14928
  ...(ngDevMode ? [undefined, { debugName: "monthSelectLabel" }] : /* istanbul ignore next */ []));
14929
+ /** Accessible label for the year dropdown. */
14489
14930
  yearLabel = input(/* @ts-ignore */
14490
14931
  ...(ngDevMode ? [undefined, { debugName: "yearLabel" }] : /* istanbul ignore next */ []));
14932
+ /** Accessible label for the next-month button. */
14491
14933
  nextMonthLabel = input(/* @ts-ignore */
14492
14934
  ...(ngDevMode ? [undefined, { debugName: "nextMonthLabel" }] : /* istanbul ignore next */ []));
14493
14935
  previousMonthText = buiLabel('calendarPreviousMonth', this.previousMonthLabel);
@@ -14928,6 +15370,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
14928
15370
  const noop$3 = () => { };
14929
15371
  /** A date input that opens a calendar popover. */
14930
15372
  class BuiDatePicker {
15373
+ /** Selected date (mode="single") as `yyyy-mm-dd`. Two-way bindable with `[(value)]`. */
14931
15374
  value = model('', /* @ts-ignore */
14932
15375
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
14933
15376
  /** `single` (default) or `range`. */
@@ -14939,24 +15382,34 @@ class BuiDatePicker {
14939
15382
  /** Month grids shown in the popover (handy for range). */
14940
15383
  months = input(1, /* @ts-ignore */
14941
15384
  ...(ngDevMode ? [{ debugName: "months" }] : /* istanbul ignore next */ []));
15385
+ /** Text shown on the trigger when no date is selected. */
14942
15386
  placeholder = input('Pick a date', /* @ts-ignore */
14943
15387
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
15388
+ /** Earliest selectable date (`yyyy-mm-dd`). */
14944
15389
  minDate = input('', /* @ts-ignore */
14945
15390
  ...(ngDevMode ? [{ debugName: "minDate" }] : /* istanbul ignore next */ []));
15391
+ /** Latest selectable date (`yyyy-mm-dd`). */
14946
15392
  maxDate = input('', /* @ts-ignore */
14947
15393
  ...(ngDevMode ? [{ debugName: "maxDate" }] : /* istanbul ignore next */ []));
15394
+ /** First day of the week (0 = Sunday). */
14948
15395
  weekStart = input(0, /* @ts-ignore */
14949
15396
  ...(ngDevMode ? [{ debugName: "weekStart" }] : /* istanbul ignore next */ []));
15397
+ /** Specific ISO dates (yyyy-mm-dd) to disable. */
14950
15398
  disabledDates = input([], /* @ts-ignore */
14951
15399
  ...(ngDevMode ? [{ debugName: "disabledDates" }] : /* istanbul ignore next */ []));
15400
+ /** Disable Saturdays and Sundays. */
14952
15401
  disableWeekends = input(false, /* @ts-ignore */
14953
15402
  ...(ngDevMode ? [{ debugName: "disableWeekends" }] : /* istanbul ignore next */ []));
15403
+ /** Show an ISO week-number column in the calendar. */
14954
15404
  showWeekNumbers = input(false, /* @ts-ignore */
14955
15405
  ...(ngDevMode ? [{ debugName: "showWeekNumbers" }] : /* istanbul ignore next */ []));
15406
+ /** `dropdown` swaps the month label for month + year selects. */
14956
15407
  captionLayout = input('label', /* @ts-ignore */
14957
15408
  ...(ngDevMode ? [{ debugName: "captionLayout" }] : /* istanbul ignore next */ []));
15409
+ /** Hide days that fall outside the current month. */
14958
15410
  hideOutsideDays = input(false, /* @ts-ignore */
14959
15411
  ...(ngDevMode ? [{ debugName: "hideOutsideDays" }] : /* istanbul ignore next */ []));
15412
+ /** Whether the picker is disabled. Two-way bindable with `[(disabled)]`. */
14960
15413
  disabled = model(false, /* @ts-ignore */
14961
15414
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
14962
15415
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -15129,18 +15582,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15129
15582
 
15130
15583
  /** A slide carousel. Project slides as direct children; arrows + dots navigate. SSR-safe. */
15131
15584
  class BuiCarousel {
15585
+ /** Zero-based index of the first visible slide; two-way bindable. */
15132
15586
  index = model(0, /* @ts-ignore */
15133
15587
  ...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
15588
+ /** Scroll axis of the carousel. */
15134
15589
  orientation = input('horizontal', /* @ts-ignore */
15135
15590
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
15136
15591
  /** Slides visible at once (e.g. 2 or 3 for a multi-item carousel). */
15137
15592
  perView = input(1, /* @ts-ignore */
15138
15593
  ...(ngDevMode ? [{ debugName: "perView" }] : /* istanbul ignore next */ []));
15139
15594
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
15595
+ /** Accessible label override for the previous-slide button. */
15140
15596
  previousLabel = input(/* @ts-ignore */
15141
15597
  ...(ngDevMode ? [undefined, { debugName: "previousLabel" }] : /* istanbul ignore next */ []));
15598
+ /** Accessible label override for the next-slide button. */
15142
15599
  nextLabel = input(/* @ts-ignore */
15143
15600
  ...(ngDevMode ? [undefined, { debugName: "nextLabel" }] : /* istanbul ignore next */ []));
15601
+ /** Accessible label override (prefix) for the dot navigation buttons. */
15144
15602
  goToSlideLabel = input(/* @ts-ignore */
15145
15603
  ...(ngDevMode ? [undefined, { debugName: "goToSlideLabel" }] : /* istanbul ignore next */ []));
15146
15604
  previousText = buiLabel('carouselPrevious', this.previousLabel);
@@ -15333,13 +15791,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15333
15791
 
15334
15792
  /** A command palette: a filterable, keyboard-navigable list of grouped actions. */
15335
15793
  class BuiCommand {
15794
+ /** Grouped commands shown in the palette and filtered as the user types. */
15336
15795
  groups = input([], /* @ts-ignore */
15337
15796
  ...(ngDevMode ? [{ debugName: "groups" }] : /* istanbul ignore next */ []));
15797
+ /** Placeholder text for the search input. */
15338
15798
  placeholder = input('Type a command or search…', /* @ts-ignore */
15339
15799
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
15340
15800
  /** Render a checkmark column; activating an item toggles its checked state. */
15341
15801
  checkable = input(false, /* @ts-ignore */
15342
15802
  ...(ngDevMode ? [{ debugName: "checkable" }] : /* istanbul ignore next */ []));
15803
+ /** Emits the chosen command when an item is activated (click or Enter). */
15343
15804
  selected = output();
15344
15805
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
15345
15806
  checkedValues = signal(new Set(), /* @ts-ignore */
@@ -15582,8 +16043,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
15582
16043
 
15583
16044
  /** A right-click context menu. Project the target; pass menu `items`. */
15584
16045
  class BuiContextMenu {
16046
+ /** Items shown in the menu, in display order. */
15585
16047
  items = input([], /* @ts-ignore */
15586
16048
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
16049
+ /** Emits the chosen item when a (non-separator) entry is activated. */
15587
16050
  selected = output();
15588
16051
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
15589
16052
  open = signal(false, /* @ts-ignore */
@@ -15840,23 +16303,32 @@ function cellText(value) {
15840
16303
  }
15841
16304
  /** A data table with search, sortable columns, row selection and pagination. */
15842
16305
  class BuiDataTable {
16306
+ /** Column definitions that drive the headers, cell lookup and sort/search keys. */
15843
16307
  columns = input([], /* @ts-ignore */
15844
16308
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
16309
+ /** Source data rows; each is a key/value map indexed by column keys. */
15845
16310
  rows = input([], /* @ts-ignore */
15846
16311
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
16312
+ /** Whether to show the search box that filters rows across all columns. */
15847
16313
  searchable = input(true, /* @ts-ignore */
15848
16314
  ...(ngDevMode ? [{ debugName: "searchable" }] : /* istanbul ignore next */ []));
16315
+ /** Placeholder text for the search input. */
15849
16316
  searchPlaceholder = input('Search...', /* @ts-ignore */
15850
16317
  ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : /* istanbul ignore next */ []));
16318
+ /** Whether to render row checkboxes and the select-all header checkbox. */
15851
16319
  selectable = input(true, /* @ts-ignore */
15852
16320
  ...(ngDevMode ? [{ debugName: "selectable" }] : /* istanbul ignore next */ []));
16321
+ /** Number of rows displayed per page. */
15853
16322
  pageSize = input(5, /* @ts-ignore */
15854
16323
  ...(ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []));
15855
16324
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
16325
+ /** Accessible label override for the search input. */
15856
16326
  searchLabel = input(/* @ts-ignore */
15857
16327
  ...(ngDevMode ? [undefined, { debugName: "searchLabel" }] : /* istanbul ignore next */ []));
16328
+ /** Accessible label override for the select-all checkbox. */
15858
16329
  selectAllLabel = input(/* @ts-ignore */
15859
16330
  ...(ngDevMode ? [undefined, { debugName: "selectAllLabel" }] : /* istanbul ignore next */ []));
16331
+ /** Accessible label override for each row's select checkbox. */
15860
16332
  selectRowLabel = input(/* @ts-ignore */
15861
16333
  ...(ngDevMode ? [undefined, { debugName: "selectRowLabel" }] : /* istanbul ignore next */ []));
15862
16334
  searchText = buiLabel('dataTableSearch', this.searchLabel);
@@ -16161,14 +16633,19 @@ const WIDTH = 600;
16161
16633
  const PAD = 8;
16162
16634
  /** A lightweight SVG chart (line / area / bar). Pure + SSR-safe. */
16163
16635
  class BuiChart {
16636
+ /** Chart render style: line, bar, or filled area. */
16164
16637
  type = input('line', /* @ts-ignore */
16165
16638
  ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
16639
+ /** Series to plot; bar charts use only the first series. */
16166
16640
  series = input([], /* @ts-ignore */
16167
16641
  ...(ngDevMode ? [{ debugName: "series" }] : /* istanbul ignore next */ []));
16642
+ /** X-axis tick labels rendered below the chart. */
16168
16643
  labels = input([], /* @ts-ignore */
16169
16644
  ...(ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []));
16645
+ /** Chart height in pixels (SVG viewBox height). */
16170
16646
  height = input(220, /* @ts-ignore */
16171
16647
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
16648
+ /** Accessible label for the chart's `aria-label`. */
16172
16649
  label = input('Chart', /* @ts-ignore */
16173
16650
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
16174
16651
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -16325,6 +16802,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
16325
16802
  const noop$2 = () => { };
16326
16803
  /** A combined date + time picker in a popover. Value is `YYYY-MM-DDTHH:mm`. */
16327
16804
  class BuiDatetimePicker {
16805
+ /** Selected date-time (mode="single") as `YYYY-MM-DDTHH:mm`. Two-way bindable with `[(value)]`. */
16328
16806
  value = model('', /* @ts-ignore */
16329
16807
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
16330
16808
  /** `single` (default) or `range`. */
@@ -16336,16 +16814,22 @@ class BuiDatetimePicker {
16336
16814
  /** Month grids shown in the popover (handy for range). */
16337
16815
  months = input(1, /* @ts-ignore */
16338
16816
  ...(ngDevMode ? [{ debugName: "months" }] : /* istanbul ignore next */ []));
16817
+ /** Text shown on the trigger when nothing is selected. */
16339
16818
  placeholder = input('Pick date & time', /* @ts-ignore */
16340
16819
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
16820
+ /** Earliest selectable date (`yyyy-mm-dd`). */
16341
16821
  minDate = input('', /* @ts-ignore */
16342
16822
  ...(ngDevMode ? [{ debugName: "minDate" }] : /* istanbul ignore next */ []));
16823
+ /** Latest selectable date (`yyyy-mm-dd`). */
16343
16824
  maxDate = input('', /* @ts-ignore */
16344
16825
  ...(ngDevMode ? [{ debugName: "maxDate" }] : /* istanbul ignore next */ []));
16826
+ /** `dropdown` swaps the month label for month + year selects. */
16345
16827
  captionLayout = input('label', /* @ts-ignore */
16346
16828
  ...(ngDevMode ? [{ debugName: "captionLayout" }] : /* istanbul ignore next */ []));
16829
+ /** Whether to include seconds in the time field. */
16347
16830
  seconds = input(false, /* @ts-ignore */
16348
16831
  ...(ngDevMode ? [{ debugName: "seconds" }] : /* istanbul ignore next */ []));
16832
+ /** Whether the picker is disabled. Two-way bindable with `[(disabled)]`. */
16349
16833
  disabled = model(false, /* @ts-ignore */
16350
16834
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
16351
16835
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -16576,23 +17060,31 @@ const AC_SIZE = {
16576
17060
  };
16577
17061
  /** A free-text input with a filtered suggestion list. */
16578
17062
  class BuiAutocomplete {
17063
+ /** Current text in the input. Two-way bindable with `[(value)]`. */
16579
17064
  value = model('', /* @ts-ignore */
16580
17065
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
16581
17066
  /** Pick several values, shown as removable chips; binds `values`. */
16582
17067
  multiple = input(false, /* @ts-ignore */
16583
17068
  ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
17069
+ /** Selected values shown as chips (multiple mode). Two-way bindable with `[(values)]`. */
16584
17070
  values = model([], /* @ts-ignore */
16585
17071
  ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
17072
+ /** Suggestions to filter against the typed text. */
16586
17073
  options = input([], /* @ts-ignore */
16587
17074
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
17075
+ /** Placeholder text for the input. */
16588
17076
  placeholder = input('Search...', /* @ts-ignore */
16589
17077
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
17078
+ /** Message shown when no suggestion matches. */
16590
17079
  empty = input('No results found.', /* @ts-ignore */
16591
17080
  ...(ngDevMode ? [{ debugName: "empty" }] : /* istanbul ignore next */ []));
17081
+ /** Whether the input is disabled. Two-way bindable with `[(disabled)]`. */
16592
17082
  disabled = model(false, /* @ts-ignore */
16593
17083
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
17084
+ /** Native `name` attribute for the input. */
16594
17085
  name = input('', /* @ts-ignore */
16595
17086
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
17087
+ /** Height and font size of the input. */
16596
17088
  size = input('default', /* @ts-ignore */
16597
17089
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
16598
17090
  /** Optional leading icon, given as an SVG path `d` string. */
@@ -16928,21 +17420,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
16928
17420
 
16929
17421
  /** A before/after image comparison with a draggable, keyboard-operable divider. */
16930
17422
  class BuiComparisonSlider {
17423
+ /** Source URL of the "before" image (revealed on the left of the divider). */
16931
17424
  before = input('', /* @ts-ignore */
16932
17425
  ...(ngDevMode ? [{ debugName: "before" }] : /* istanbul ignore next */ []));
17426
+ /** Source URL of the "after" image (shown on the right of the divider). */
16933
17427
  after = input('', /* @ts-ignore */
16934
17428
  ...(ngDevMode ? [{ debugName: "after" }] : /* istanbul ignore next */ []));
17429
+ /** Caption badge shown over the "before" image; hidden when empty. */
16935
17430
  beforeLabel = input('', /* @ts-ignore */
16936
17431
  ...(ngDevMode ? [{ debugName: "beforeLabel" }] : /* istanbul ignore next */ []));
17432
+ /** Caption badge shown over the "after" image; hidden when empty. */
16937
17433
  afterLabel = input('', /* @ts-ignore */
16938
17434
  ...(ngDevMode ? [{ debugName: "afterLabel" }] : /* istanbul ignore next */ []));
17435
+ /** Alt text for the "before" image. */
16939
17436
  beforeAlt = input('Before', /* @ts-ignore */
16940
17437
  ...(ngDevMode ? [{ debugName: "beforeAlt" }] : /* istanbul ignore next */ []));
17438
+ /** Alt text for the "after" image. */
16941
17439
  afterAlt = input('After', /* @ts-ignore */
16942
17440
  ...(ngDevMode ? [{ debugName: "afterAlt" }] : /* istanbul ignore next */ []));
17441
+ /** Divider position as a percentage (0-100); two-way bindable. */
16943
17442
  value = model(50, /* @ts-ignore */
16944
17443
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
16945
17444
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
17445
+ /** Accessible label override for the range slider. */
16946
17446
  positionLabel = input(/* @ts-ignore */
16947
17447
  ...(ngDevMode ? [undefined, { debugName: "positionLabel" }] : /* istanbul ignore next */ []));
16948
17448
  positionText = buiLabel('comparisonSliderPosition', this.positionLabel);
@@ -17046,20 +17546,28 @@ function formatSize(bytes) {
17046
17546
  }
17047
17547
  /** A drag-and-drop file upload zone with a selected-files list. */
17048
17548
  class BuiFileUpload {
17549
+ /** Whether multiple files can be selected and accumulated. */
17049
17550
  multiple = input(false, /* @ts-ignore */
17050
17551
  ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
17552
+ /** Comma-separated list of accepted file types (the `accept` attribute). */
17051
17553
  accept = input('', /* @ts-ignore */
17052
17554
  ...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
17555
+ /** Native `name` attribute for the file input. */
17053
17556
  name = input('', /* @ts-ignore */
17054
17557
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
17558
+ /** Optional helper text shown under the dropzone label. */
17055
17559
  hint = input('', /* @ts-ignore */
17056
17560
  ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
17561
+ /** Whether the upload zone is disabled. */
17057
17562
  disabled = input(false, /* @ts-ignore */
17058
17563
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
17564
+ /** Emitted with the current file list whenever the selection changes. */
17059
17565
  filesChange = output();
17060
17566
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
17567
+ /** Custom dropzone prompt text. */
17061
17568
  dropzoneLabel = input(/* @ts-ignore */
17062
17569
  ...(ngDevMode ? [undefined, { debugName: "dropzoneLabel" }] : /* istanbul ignore next */ []));
17570
+ /** Custom accessible label for each remove button. */
17063
17571
  removeLabel = input(/* @ts-ignore */
17064
17572
  ...(ngDevMode ? [undefined, { debugName: "removeLabel" }] : /* istanbul ignore next */ []));
17065
17573
  dropzoneText = buiLabel('fileUploadDropzone', this.dropzoneLabel);
@@ -17251,13 +17759,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
17251
17759
  * or with `top-progress:start` / `top-progress:set` / `top-progress:done` window events.
17252
17760
  */
17253
17761
  class BuiTopProgress {
17762
+ /** CSS color (or gradient) used to fill the bar. */
17254
17763
  color = input('var(--color-primary, #6366f1)', /* @ts-ignore */
17255
17764
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
17765
+ /** Bar thickness in pixels. */
17256
17766
  height = input(2, /* @ts-ignore */
17257
17767
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
17768
+ /** When true, renders inline within its container instead of fixed at the top of the viewport. */
17258
17769
  demo = input(false, /* @ts-ignore */
17259
17770
  ...(ngDevMode ? [{ debugName: "demo" }] : /* istanbul ignore next */ []));
17260
17771
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
17772
+ /** Overrides the localized accessible progressbar label. */
17261
17773
  ariaLabel = input(/* @ts-ignore */
17262
17774
  ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
17263
17775
  ariaLabelText = buiLabel('topProgressLoading', this.ariaLabel);
@@ -17368,10 +17880,13 @@ const POSITION$1 = {
17368
17880
  };
17369
17881
  /** A slide-in panel anchored to a screen edge. Toggle with the `open` model. */
17370
17882
  class BuiDrawer {
17883
+ /** Whether the drawer is open. Two-way bindable with `[(open)]`. */
17371
17884
  open = model(false, /* @ts-ignore */
17372
17885
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
17886
+ /** Screen edge the drawer is anchored to and slides in from. */
17373
17887
  direction = input('bottom', /* @ts-ignore */
17374
17888
  ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
17889
+ /** Accessible label applied to the drawer dialog. */
17375
17890
  ariaLabel = input('Drawer', /* @ts-ignore */
17376
17891
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
17377
17892
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -17456,16 +17971,22 @@ function applyMask$1(value, mask) {
17456
17971
  }
17457
17972
  /** A text input that formats its value against a mask (9 = digit, a = letter, * = alnum). */
17458
17973
  class BuiInputMask {
17974
+ /** Mask pattern where `9` accepts a digit, `a` a letter, `*` an alphanumeric, and other chars are literals. */
17459
17975
  mask = input('', /* @ts-ignore */
17460
17976
  ...(ngDevMode ? [{ debugName: "mask" }] : /* istanbul ignore next */ []));
17977
+ /** Current masked value. Two-way bindable with `[(value)]`. */
17461
17978
  value = model('', /* @ts-ignore */
17462
17979
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
17980
+ /** Placeholder text shown when the input is empty. */
17463
17981
  placeholder = input('', /* @ts-ignore */
17464
17982
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
17983
+ /** Value for the native `inputmode` attribute hinting the virtual keyboard. */
17465
17984
  inputmode = input('', /* @ts-ignore */
17466
17985
  ...(ngDevMode ? [{ debugName: "inputmode" }] : /* istanbul ignore next */ []));
17986
+ /** Name attribute applied to the underlying input for form submission. */
17467
17987
  name = input('', /* @ts-ignore */
17468
17988
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
17989
+ /** Whether the input is disabled. Two-way bindable with `[(disabled)]`. */
17469
17990
  disabled = model(false, /* @ts-ignore */
17470
17991
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
17471
17992
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -17539,10 +18060,13 @@ const SIDE = {
17539
18060
  };
17540
18061
  /** A sheet overlay sliding in from a screen edge. Toggle with the `open` model. */
17541
18062
  class BuiSheet {
18063
+ /** Whether the sheet is open. Two-way bindable with `[(open)]`. */
17542
18064
  open = model(false, /* @ts-ignore */
17543
18065
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
18066
+ /** Screen edge the sheet slides in from. */
17544
18067
  side = input('right', /* @ts-ignore */
17545
18068
  ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
18069
+ /** Accessible label applied to the sheet dialog. */
17546
18070
  ariaLabel = input('Sheet', /* @ts-ignore */
17547
18071
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
17548
18072
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -17629,10 +18153,13 @@ const TONE = {
17629
18153
  };
17630
18154
  /** The toast viewport. Drives off the {@link BuiToaster} store. */
17631
18155
  class BuiSonner {
18156
+ /** Viewport corner where toasts stack (e.g. `top-left`, `bottom-right`). */
17632
18157
  position = input('bottom-right', /* @ts-ignore */
17633
18158
  ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
18159
+ /** Overrides the localized accessible label for the toast region. */
17634
18160
  ariaLabel = input(/* @ts-ignore */
17635
18161
  ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
18162
+ /** Overrides the localized accessible label for each dismiss button. */
17636
18163
  dismissLabel = input(/* @ts-ignore */
17637
18164
  ...(ngDevMode ? [undefined, { debugName: "dismissLabel" }] : /* istanbul ignore next */ []));
17638
18165
  ariaLabelText = buiLabel('sonner', this.ariaLabel);
@@ -17751,6 +18278,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
17751
18278
 
17752
18279
  /** A horizontal navigation menu with hover/click dropdown panels. */
17753
18280
  class BuiNavigationMenu {
18281
+ /** Top-level menu entries, each optionally opening a dropdown panel. */
17754
18282
  items = input([], /* @ts-ignore */
17755
18283
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
17756
18284
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -17925,16 +18453,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
17925
18453
 
17926
18454
  /** A textarea that suggests mentions when you type the trigger character. */
17927
18455
  class BuiMentionInput {
18456
+ /** Textarea contents. Two-way bindable with `[(value)]`. */
17928
18457
  value = model('', /* @ts-ignore */
17929
18458
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
18459
+ /** Mentions offered when the trigger character is typed. */
17930
18460
  mentions = input([], /* @ts-ignore */
17931
18461
  ...(ngDevMode ? [{ debugName: "mentions" }] : /* istanbul ignore next */ []));
18462
+ /** Character that opens the mention suggestion list. */
17932
18463
  trigger = input('@', /* @ts-ignore */
17933
18464
  ...(ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []));
18465
+ /** Placeholder text for the textarea. */
17934
18466
  placeholder = input('Type @ to mention…', /* @ts-ignore */
17935
18467
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
18468
+ /** Number of visible textarea rows. */
17936
18469
  rows = input(3, /* @ts-ignore */
17937
18470
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
18471
+ /** Native `name` attribute for the textarea. */
17938
18472
  name = input('', /* @ts-ignore */
17939
18473
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
17940
18474
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18002,11 +18536,11 @@ class BuiMentionInput {
18002
18536
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiMentionInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
18003
18537
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: BuiMentionInput, isStandalone: true, selector: "bui-mention-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, mentions: { classPropertyName: "mentions", publicName: "mentions", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", 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": "mention-input" }, properties: { "class": "computedClass()" } }, ngImport: i0, template: `
18004
18538
  <textarea
18539
+ buiTextarea
18005
18540
  [value]="value()"
18006
18541
  [placeholder]="placeholder()"
18007
18542
  [rows]="rows()"
18008
18543
  [attr.name]="name() || null"
18009
- class="w-full resize-y rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
18010
18544
  (input)="onInput($event)"
18011
18545
  (keydown)="onKeydown($event)"
18012
18546
  ></textarea>
@@ -18029,20 +18563,21 @@ class BuiMentionInput {
18029
18563
  }
18030
18564
  </ul>
18031
18565
  }
18032
- `, isInline: true });
18566
+ `, isInline: true, dependencies: [{ kind: "directive", type: BuiTextarea, selector: "textarea[buiTextarea]", inputs: ["size", "maxRows", "class"] }] });
18033
18567
  }
18034
18568
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiMentionInput, decorators: [{
18035
18569
  type: Component,
18036
18570
  args: [{
18037
18571
  selector: 'bui-mention-input',
18038
18572
  host: { 'data-slot': 'mention-input', '[class]': 'computedClass()' },
18573
+ imports: [BuiTextarea],
18039
18574
  template: `
18040
18575
  <textarea
18576
+ buiTextarea
18041
18577
  [value]="value()"
18042
18578
  [placeholder]="placeholder()"
18043
18579
  [rows]="rows()"
18044
18580
  [attr.name]="name() || null"
18045
- class="w-full resize-y rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
18046
18581
  (input)="onInput($event)"
18047
18582
  (keydown)="onKeydown($event)"
18048
18583
  ></textarea>
@@ -18071,18 +18606,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
18071
18606
 
18072
18607
  /** A keyless OpenStreetMap embed centred on a coordinate. SSR-safe. */
18073
18608
  class BuiMap {
18609
+ /** Latitude of the map centre, in degrees. */
18074
18610
  lat = input(50.8503, /* @ts-ignore */
18075
18611
  ...(ngDevMode ? [{ debugName: "lat" }] : /* istanbul ignore next */ []));
18612
+ /** Longitude of the map centre, in degrees. */
18076
18613
  lon = input(4.3517, /* @ts-ignore */
18077
18614
  ...(ngDevMode ? [{ debugName: "lon" }] : /* istanbul ignore next */ []));
18615
+ /** Zoom level; higher values zoom in closer. */
18078
18616
  zoom = input(14, /* @ts-ignore */
18079
18617
  ...(ngDevMode ? [{ debugName: "zoom" }] : /* istanbul ignore next */ []));
18618
+ /** Accessible title for the map iframe. */
18080
18619
  label = input('Location', /* @ts-ignore */
18081
18620
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
18621
+ /** Whether to drop a pin at the centre coordinate. */
18082
18622
  marker = input(true, /* @ts-ignore */
18083
18623
  ...(ngDevMode ? [{ debugName: "marker" }] : /* istanbul ignore next */ []));
18624
+ /** Map height in pixels; ignored when `ratio` is set. */
18084
18625
  height = input(320, /* @ts-ignore */
18085
18626
  ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
18627
+ /** CSS aspect ratio (e.g. `16/9`); overrides `height` when set. */
18086
18628
  ratio = input('', /* @ts-ignore */
18087
18629
  ...(ngDevMode ? [{ debugName: "ratio" }] : /* istanbul ignore next */ []));
18088
18630
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18192,12 +18734,16 @@ function label(iso) {
18192
18734
  }
18193
18735
  /** A horizontal Gantt chart positioning task bars over a date range. SSR-safe. */
18194
18736
  class BuiGantt {
18737
+ /** Tasks to plot as horizontal bars across the date range. */
18195
18738
  tasks = input([], /* @ts-ignore */
18196
18739
  ...(ngDevMode ? [{ debugName: "tasks" }] : /* istanbul ignore next */ []));
18740
+ /** Milestones to plot as diamond markers below the task bars. */
18197
18741
  milestones = input([], /* @ts-ignore */
18198
18742
  ...(ngDevMode ? [{ debugName: "milestones" }] : /* istanbul ignore next */ []));
18743
+ /** ISO start date overriding the computed range minimum; empty derives it from tasks. */
18199
18744
  start = input('', /* @ts-ignore */
18200
18745
  ...(ngDevMode ? [{ debugName: "start" }] : /* istanbul ignore next */ []));
18746
+ /** ISO end date overriding the computed range maximum; empty derives it from tasks. */
18201
18747
  end = input('', /* @ts-ignore */
18202
18748
  ...(ngDevMode ? [{ debugName: "end" }] : /* istanbul ignore next */ []));
18203
18749
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18358,16 +18904,22 @@ function toMinutes(value) {
18358
18904
  }
18359
18905
  /** A week/day calendar grid with positioned events. SSR-safe. */
18360
18906
  class BuiScheduler {
18907
+ /** Events to position within the calendar grid. */
18361
18908
  events = input([], /* @ts-ignore */
18362
18909
  ...(ngDevMode ? [{ debugName: "events" }] : /* istanbul ignore next */ []));
18910
+ /** Custom day-column headers; empty falls back to weekday names or `Today`. */
18363
18911
  days = input([], /* @ts-ignore */
18364
18912
  ...(ngDevMode ? [{ debugName: "days" }] : /* istanbul ignore next */ []));
18913
+ /** First hour shown on the time axis (24-hour). */
18365
18914
  startHour = input(8, /* @ts-ignore */
18366
18915
  ...(ngDevMode ? [{ debugName: "startHour" }] : /* istanbul ignore next */ []));
18916
+ /** Last hour shown on the time axis (24-hour), exclusive of the final row. */
18367
18917
  endHour = input(18, /* @ts-ignore */
18368
18918
  ...(ngDevMode ? [{ debugName: "endHour" }] : /* istanbul ignore next */ []));
18919
+ /** Layout mode; `day` shows a single column, `week` shows the full week. */
18369
18920
  view = input('week', /* @ts-ignore */
18370
18921
  ...(ngDevMode ? [{ debugName: "view" }] : /* istanbul ignore next */ []));
18922
+ /** Accessible label applied to the grid's `aria-label`. */
18371
18923
  label = input('Schedule', /* @ts-ignore */
18372
18924
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
18373
18925
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18495,8 +19047,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
18495
19047
 
18496
19048
  /** A drag-and-drop kanban board (Angular CDK drag-drop). */
18497
19049
  class BuiKanban {
19050
+ /** Columns and their cards used to seed the board. */
18498
19051
  columns = input([], /* @ts-ignore */
18499
19052
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
19053
+ /** Emits the updated board whenever a card is moved. */
18500
19054
  changed = output();
18501
19055
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
18502
19056
  board = linkedSignal(() => this.columns().map((column) => ({ ...column, cards: [...column.cards] })), /* @ts-ignore */
@@ -18614,14 +19168,19 @@ const TOOLS = [
18614
19168
  ];
18615
19169
  /** A contenteditable rich-text editor with a basic formatting toolbar. */
18616
19170
  class BuiRichTextEditor {
19171
+ /** Editor contents as HTML. Two-way bindable with `[(value)]`. */
18617
19172
  value = model('', /* @ts-ignore */
18618
19173
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
19174
+ /** Placeholder text shown while the editor is empty. */
18619
19175
  placeholder = input('Write something…', /* @ts-ignore */
18620
19176
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
19177
+ /** Accessible label for the editable region. */
18621
19178
  ariaLabel = input('Rich text editor', /* @ts-ignore */
18622
19179
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
19180
+ /** Accessible label override for the formatting toolbar. */
18623
19181
  formattingLabel = input(/* @ts-ignore */
18624
19182
  ...(ngDevMode ? [undefined, { debugName: "formattingLabel" }] : /* istanbul ignore next */ []));
19183
+ /** Name attribute associated with the editor for form submission. */
18625
19184
  name = input('', /* @ts-ignore */
18626
19185
  ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
18627
19186
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18726,10 +19285,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
18726
19285
 
18727
19286
  /** A collapsible vertical navigation sidebar. Toggle width with the `open` model. */
18728
19287
  class BuiSidebar {
19288
+ /** Whether the sidebar is expanded. Two-way bindable with `[(open)]`. */
18729
19289
  open = model(true, /* @ts-ignore */
18730
19290
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
19291
+ /** Edge the sidebar is docked to, which sets its border side. */
18731
19292
  side = input('left', /* @ts-ignore */
18732
19293
  ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
19294
+ /** Collapse behavior: hide entirely (`offcanvas`) or shrink to an icon rail (`icon`). */
18733
19295
  collapsible = input('offcanvas', /* @ts-ignore */
18734
19296
  ...(ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []));
18735
19297
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18755,6 +19317,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
18755
19317
  }], 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 }] }] } });
18756
19318
  /** A styled, accessible item button for a {@link BuiSidebar} menu. */
18757
19319
  class BuiSidebarMenuButton {
19320
+ /** Whether this item is the current page; sets active styling and `aria-current`. */
18758
19321
  isActive = input(false, /* @ts-ignore */
18759
19322
  ...(ngDevMode ? [{ debugName: "isActive" }] : /* istanbul ignore next */ []));
18760
19323
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
@@ -18777,8 +19340,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
18777
19340
 
18778
19341
  /** A guided product tour with a spotlight on each step's target element. SSR-safe. */
18779
19342
  class BuiOnboardingTour {
19343
+ /** Whether the tour is open. Two-way bindable with `[(open)]`. */
18780
19344
  open = model(false, /* @ts-ignore */
18781
19345
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
19346
+ /** Ordered steps; each spotlights its `target` element in turn. */
18782
19347
  steps = input([], /* @ts-ignore */
18783
19348
  ...(ngDevMode ? [{ debugName: "steps" }] : /* istanbul ignore next */ []));
18784
19349
  step = signal(0, /* @ts-ignore */
@@ -19372,16 +19937,22 @@ function encodeQr(text) {
19372
19937
 
19373
19938
  /** Renders a value as a scannable QR code (SVG). Level M, byte mode. SSR-safe. */
19374
19939
  class BuiQrCode {
19940
+ /** Text or URL to encode into the QR code. */
19375
19941
  value = input('', /* @ts-ignore */
19376
19942
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
19943
+ /** Rendered width and height of the SVG in pixels. */
19377
19944
  size = input(160, /* @ts-ignore */
19378
19945
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
19946
+ /** Accessible label for the QR code image. */
19379
19947
  label = input('QR code', /* @ts-ignore */
19380
19948
  ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
19949
+ /** Fill colour of the QR modules (dark squares). */
19381
19950
  foreground = input('currentColor', /* @ts-ignore */
19382
19951
  ...(ngDevMode ? [{ debugName: "foreground" }] : /* istanbul ignore next */ []));
19952
+ /** Background fill colour behind the modules. */
19383
19953
  background = input('transparent', /* @ts-ignore */
19384
19954
  ...(ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []));
19955
+ /** Quiet-zone border width, in modules. */
19385
19956
  margin = input(2, /* @ts-ignore */
19386
19957
  ...(ngDevMode ? [{ debugName: "margin" }] : /* istanbul ignore next */ []));
19387
19958
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });